Repository: flipperdevices/flipperzero-firmware Branch: dev Commit: c9ab2b6827fc Files: 2844 Total size: 47.0 MB Directory structure: gitextract_izuyb6zx/ ├── .clang-format ├── .clangd ├── .editorconfig ├── .gitattributes ├── .github/ │ ├── CODEOWNERS │ ├── ISSUE_TEMPLATE/ │ │ ├── 01_bug_report.yml │ │ ├── 02_enhancements.yml │ │ ├── 03_feature_request.yml │ │ └── config.yml │ ├── actions/ │ │ └── submit_sdk/ │ │ └── action.yml │ ├── pull_request_template.md │ └── workflows/ │ ├── build.yml │ ├── build_compact.yml │ ├── docs.yml │ ├── lint_and_submodule_check.yml │ ├── merge_report.yml │ ├── pvs_studio.yml │ ├── reindex.yml │ ├── unit_tests.yml │ └── updater_test.yml ├── .gitignore ├── .gitmodules ├── .pvsconfig ├── .pvsoptions ├── .sublime-project ├── .vscode/ │ └── ReadMe.md ├── CODE_OF_CONDUCT.md ├── CODING_STYLE.md ├── CONTRIBUTING.md ├── LICENSE ├── ReadMe.md ├── SConstruct ├── applications/ │ ├── ReadMe.md │ ├── debug/ │ │ ├── accessor/ │ │ │ ├── accessor.cpp │ │ │ ├── accessor_app.cpp │ │ │ ├── accessor_app.h │ │ │ ├── accessor_event.h │ │ │ ├── accessor_view_manager.cpp │ │ │ ├── accessor_view_manager.h │ │ │ ├── application.fam │ │ │ ├── callback_connector.h │ │ │ ├── helpers/ │ │ │ │ ├── wiegand.cpp │ │ │ │ └── wiegand.h │ │ │ └── scene/ │ │ │ ├── accessor_scene_generic.h │ │ │ ├── accessor_scene_start.cpp │ │ │ └── accessor_scene_start.h │ │ ├── application.fam │ │ ├── battery_test_app/ │ │ │ ├── application.fam │ │ │ ├── battery_test_app.c │ │ │ ├── battery_test_app.h │ │ │ └── views/ │ │ │ ├── battery_info.c │ │ │ └── battery_info.h │ │ ├── blink_test/ │ │ │ ├── application.fam │ │ │ └── blink_test.c │ │ ├── bt_debug_app/ │ │ │ ├── application.fam │ │ │ ├── bt_debug_app.c │ │ │ ├── bt_debug_app.h │ │ │ └── views/ │ │ │ ├── bt_carrier_test.c │ │ │ ├── bt_carrier_test.h │ │ │ ├── bt_packet_test.c │ │ │ ├── bt_packet_test.h │ │ │ ├── bt_test.c │ │ │ ├── bt_test.h │ │ │ └── bt_test_types.h │ │ ├── ccid_test/ │ │ │ ├── application.fam │ │ │ ├── ccid_test_app.c │ │ │ ├── ccid_test_app_commands.c │ │ │ ├── ccid_test_app_commands.h │ │ │ ├── client/ │ │ │ │ ├── ccid_client.py │ │ │ │ └── requirements.txt │ │ │ └── iso7816/ │ │ │ ├── iso7816_atr.h │ │ │ ├── iso7816_handler.c │ │ │ ├── iso7816_handler.h │ │ │ ├── iso7816_response.c │ │ │ ├── iso7816_response.h │ │ │ ├── iso7816_t0_apdu.c │ │ │ └── iso7816_t0_apdu.h │ │ ├── crash_test/ │ │ │ ├── application.fam │ │ │ └── crash_test.c │ │ ├── direct_draw/ │ │ │ ├── application.fam │ │ │ └── direct_draw.c │ │ ├── display_test/ │ │ │ ├── application.fam │ │ │ ├── display_test.c │ │ │ ├── view_display_test.c │ │ │ └── view_display_test.h │ │ ├── event_loop_blink_test/ │ │ │ ├── application.fam │ │ │ └── event_loop_blink_test.c │ │ ├── expansion_test/ │ │ │ ├── application.fam │ │ │ ├── assets/ │ │ │ │ └── test.txt │ │ │ └── expansion_test.c │ │ ├── file_browser_test/ │ │ │ ├── application.fam │ │ │ ├── file_browser_app.c │ │ │ ├── file_browser_app_i.h │ │ │ └── scenes/ │ │ │ ├── file_browser_scene.c │ │ │ ├── file_browser_scene.h │ │ │ ├── file_browser_scene_browser.c │ │ │ ├── file_browser_scene_config.h │ │ │ ├── file_browser_scene_result.c │ │ │ └── file_browser_scene_start.c │ │ ├── infrared_test/ │ │ │ ├── application.fam │ │ │ └── infrared_test.c │ │ ├── keypad_test/ │ │ │ ├── application.fam │ │ │ └── keypad_test.c │ │ ├── lfrfid_debug/ │ │ │ ├── application.fam │ │ │ ├── lfrfid_debug.c │ │ │ ├── lfrfid_debug_i.h │ │ │ ├── scenes/ │ │ │ │ ├── lfrfid_debug_app_scene_start.c │ │ │ │ ├── lfrfid_debug_app_scene_tune.c │ │ │ │ ├── lfrfid_debug_scene.c │ │ │ │ ├── lfrfid_debug_scene.h │ │ │ │ └── lfrfid_debug_scene_config.h │ │ │ └── views/ │ │ │ ├── lfrfid_debug_view_tune.c │ │ │ └── lfrfid_debug_view_tune.h │ │ ├── loader_chaining_a/ │ │ │ ├── application.fam │ │ │ └── loader_chaining_a.c │ │ ├── loader_chaining_b/ │ │ │ ├── application.fam │ │ │ └── loader_chaining_b.c │ │ ├── locale_test/ │ │ │ ├── application.fam │ │ │ └── locale_test.c │ │ ├── rpc_debug_app/ │ │ │ ├── application.fam │ │ │ ├── rpc_debug_app.c │ │ │ ├── rpc_debug_app.h │ │ │ └── scenes/ │ │ │ ├── rpc_debug_app_scene.c │ │ │ ├── rpc_debug_app_scene.h │ │ │ ├── rpc_debug_app_scene_config.h │ │ │ ├── rpc_debug_app_scene_input_data_exchange.c │ │ │ ├── rpc_debug_app_scene_input_error_code.c │ │ │ ├── rpc_debug_app_scene_input_error_text.c │ │ │ ├── rpc_debug_app_scene_receive_data_exchange.c │ │ │ ├── rpc_debug_app_scene_start.c │ │ │ ├── rpc_debug_app_scene_start_dummy.c │ │ │ ├── rpc_debug_app_scene_test_app_error.c │ │ │ └── rpc_debug_app_scene_test_data_exchange.c │ │ ├── speaker_debug/ │ │ │ ├── application.fam │ │ │ └── speaker_debug.c │ │ ├── subghz_test/ │ │ │ ├── application.fam │ │ │ ├── helpers/ │ │ │ │ ├── subghz_test_event.h │ │ │ │ ├── subghz_test_frequency.c │ │ │ │ ├── subghz_test_frequency.h │ │ │ │ └── subghz_test_types.h │ │ │ ├── protocol/ │ │ │ │ ├── math.c │ │ │ │ ├── math.h │ │ │ │ ├── princeton_for_testing.c │ │ │ │ └── princeton_for_testing.h │ │ │ ├── scenes/ │ │ │ │ ├── subghz_test_scene.c │ │ │ │ ├── subghz_test_scene.h │ │ │ │ ├── subghz_test_scene_about.c │ │ │ │ ├── subghz_test_scene_carrier.c │ │ │ │ ├── subghz_test_scene_config.h │ │ │ │ ├── subghz_test_scene_packet.c │ │ │ │ ├── subghz_test_scene_show_only_rx.c │ │ │ │ ├── subghz_test_scene_start.c │ │ │ │ └── subghz_test_scene_static.c │ │ │ ├── subghz_test_app.c │ │ │ ├── subghz_test_app_i.c │ │ │ ├── subghz_test_app_i.h │ │ │ └── views/ │ │ │ ├── subghz_test_carrier.c │ │ │ ├── subghz_test_carrier.h │ │ │ ├── subghz_test_packet.c │ │ │ ├── subghz_test_packet.h │ │ │ ├── subghz_test_static.c │ │ │ └── subghz_test_static.h │ │ ├── text_box_element_test/ │ │ │ ├── application.fam │ │ │ └── text_box_element_test.c │ │ ├── text_box_view_test/ │ │ │ ├── application.fam │ │ │ └── text_box_view_test.c │ │ ├── uart_echo/ │ │ │ ├── application.fam │ │ │ └── uart_echo.c │ │ ├── unit_tests/ │ │ │ ├── application.fam │ │ │ ├── resources/ │ │ │ │ └── unit_tests/ │ │ │ │ ├── Manifest_test │ │ │ │ ├── compress/ │ │ │ │ │ └── test.ths │ │ │ │ ├── infrared/ │ │ │ │ │ ├── test_kaseikyo.irtest │ │ │ │ │ ├── test_nec.irtest │ │ │ │ │ ├── test_nec42.irtest │ │ │ │ │ ├── test_nec42ext.irtest │ │ │ │ │ ├── test_necext.irtest │ │ │ │ │ ├── test_pioneer.irtest │ │ │ │ │ ├── test_rc5.irtest │ │ │ │ │ ├── test_rc5x.irtest │ │ │ │ │ ├── test_rc6.irtest │ │ │ │ │ ├── test_rca.irtest │ │ │ │ │ ├── test_samsung32.irtest │ │ │ │ │ └── test_sirc.irtest │ │ │ │ ├── js/ │ │ │ │ │ ├── basic.js │ │ │ │ │ ├── event_loop.js │ │ │ │ │ ├── math.js │ │ │ │ │ └── storage.js │ │ │ │ ├── nfc/ │ │ │ │ │ ├── Felica.nfc │ │ │ │ │ ├── Ntag213_locked.nfc │ │ │ │ │ ├── Ntag215.nfc │ │ │ │ │ ├── Ntag216.nfc │ │ │ │ │ ├── Slix_cap_accept_all_pass.nfc │ │ │ │ │ ├── Slix_cap_default.nfc │ │ │ │ │ ├── Slix_cap_missed.nfc │ │ │ │ │ ├── Ultralight_11.nfc │ │ │ │ │ ├── Ultralight_21.nfc │ │ │ │ │ ├── Ultralight_C.nfc │ │ │ │ │ ├── nfc_nfca_signal_long.nfc │ │ │ │ │ └── nfc_nfca_signal_short.nfc │ │ │ │ ├── storage/ │ │ │ │ │ └── md5.txt │ │ │ │ └── subghz/ │ │ │ │ ├── alutech_at_4n_raw.sub │ │ │ │ ├── ansonic.sub │ │ │ │ ├── ansonic_raw.sub │ │ │ │ ├── bett.sub │ │ │ │ ├── bett_raw.sub │ │ │ │ ├── came.sub │ │ │ │ ├── came_atomo_raw.sub │ │ │ │ ├── came_raw.sub │ │ │ │ ├── came_twee.sub │ │ │ │ ├── came_twee_raw.sub │ │ │ │ ├── cenmax_raw.sub │ │ │ │ ├── clemsa.sub │ │ │ │ ├── clemsa_raw.sub │ │ │ │ ├── dickert_mahs.sub │ │ │ │ ├── dickert_raw.sub │ │ │ │ ├── doitrand.sub │ │ │ │ ├── doitrand_raw.sub │ │ │ │ ├── doorhan.sub │ │ │ │ ├── doorhan_raw.sub │ │ │ │ ├── dooya.sub │ │ │ │ ├── dooya_raw.sub │ │ │ │ ├── faac_slh_raw.sub │ │ │ │ ├── feron.sub │ │ │ │ ├── feron_raw.sub │ │ │ │ ├── gangqi.sub │ │ │ │ ├── gangqi_raw.sub │ │ │ │ ├── gate_tx.sub │ │ │ │ ├── gate_tx_raw.sub │ │ │ │ ├── hay21_raw.sub │ │ │ │ ├── hollarm.sub │ │ │ │ ├── hollarm_raw.sub │ │ │ │ ├── holtek.sub │ │ │ │ ├── holtek_ht12x.sub │ │ │ │ ├── holtek_ht12x_raw.sub │ │ │ │ ├── holtek_raw.sub │ │ │ │ ├── honeywell_wdb.sub │ │ │ │ ├── honeywell_wdb_raw.sub │ │ │ │ ├── hormann_hsm_raw.sub │ │ │ │ ├── ido_117_111_raw.sub │ │ │ │ ├── intertechno_v3.sub │ │ │ │ ├── intertechno_v3_raw.sub │ │ │ │ ├── kia_seed_raw.sub │ │ │ │ ├── kinggates_stylo4k_raw.sub │ │ │ │ ├── legrand.sub │ │ │ │ ├── legrand_raw.sub │ │ │ │ ├── linear.sub │ │ │ │ ├── linear_delta3.sub │ │ │ │ ├── linear_delta3_raw.sub │ │ │ │ ├── linear_raw.sub │ │ │ │ ├── magellan.sub │ │ │ │ ├── magellan_raw.sub │ │ │ │ ├── marantec.sub │ │ │ │ ├── marantec24.sub │ │ │ │ ├── marantec24_raw.sub │ │ │ │ ├── marantec_raw.sub │ │ │ │ ├── mastercode.sub │ │ │ │ ├── mastercode_raw.sub │ │ │ │ ├── megacode.sub │ │ │ │ ├── megacode_raw.sub │ │ │ │ ├── nero_radio_raw.sub │ │ │ │ ├── nero_sketch_raw.sub │ │ │ │ ├── nice_flo.sub │ │ │ │ ├── nice_flo_raw.sub │ │ │ │ ├── nice_flor_s_raw.sub │ │ │ │ ├── nice_one_raw.sub │ │ │ │ ├── phoenix_v2.sub │ │ │ │ ├── phoenix_v2_raw.sub │ │ │ │ ├── power_smart.sub │ │ │ │ ├── power_smart_raw.sub │ │ │ │ ├── princeton.sub │ │ │ │ ├── princeton_raw.sub │ │ │ │ ├── revers_rb2.sub │ │ │ │ ├── revers_rb2_raw.sub │ │ │ │ ├── roger.sub │ │ │ │ ├── roger_raw.sub │ │ │ │ ├── scher_khan_magic_code.sub │ │ │ │ ├── security_pls_1_0.sub │ │ │ │ ├── security_pls_1_0_raw.sub │ │ │ │ ├── security_pls_2_0.sub │ │ │ │ ├── security_pls_2_0_raw.sub │ │ │ │ ├── smc5326.sub │ │ │ │ ├── smc5326_raw.sub │ │ │ │ ├── somfy_keytis_raw.sub │ │ │ │ ├── somfy_telis_raw.sub │ │ │ │ └── test_random_raw.sub │ │ │ ├── test_runner.c │ │ │ ├── test_runner.h │ │ │ ├── tests/ │ │ │ │ ├── args/ │ │ │ │ │ └── args_test.c │ │ │ │ ├── bit_lib/ │ │ │ │ │ └── bit_lib_test.c │ │ │ │ ├── bt/ │ │ │ │ │ └── bt_test.c │ │ │ │ ├── common/ │ │ │ │ │ └── common.c │ │ │ │ ├── compress/ │ │ │ │ │ └── compress_test.c │ │ │ │ ├── datetime/ │ │ │ │ │ └── datetimelib_test.c │ │ │ │ ├── dialogs_file_browser_options/ │ │ │ │ │ └── dialogs_file_browser_options.c │ │ │ │ ├── dirwalk/ │ │ │ │ │ └── dirwalk_test.c │ │ │ │ ├── expansion/ │ │ │ │ │ └── expansion_test.c │ │ │ │ ├── flipper_format/ │ │ │ │ │ └── flipper_format_test.c │ │ │ │ ├── flipper_format_string/ │ │ │ │ │ └── flipper_format_string_test.c │ │ │ │ ├── float_tools/ │ │ │ │ │ └── float_tools_test.c │ │ │ │ ├── furi/ │ │ │ │ │ ├── furi_errno_test.c │ │ │ │ │ ├── furi_event_loop_test.c │ │ │ │ │ ├── furi_memmgr_test.c │ │ │ │ │ ├── furi_primitives_test.c │ │ │ │ │ ├── furi_pubsub_test.c │ │ │ │ │ ├── furi_record_test.c │ │ │ │ │ ├── furi_stdio_test.c │ │ │ │ │ └── furi_test.c │ │ │ │ ├── furi_hal/ │ │ │ │ │ └── furi_hal_tests.c │ │ │ │ ├── furi_hal_crypto/ │ │ │ │ │ └── furi_hal_crypto_tests.c │ │ │ │ ├── furi_string/ │ │ │ │ │ └── furi_string_test.c │ │ │ │ ├── infrared/ │ │ │ │ │ └── infrared_test.c │ │ │ │ ├── js/ │ │ │ │ │ └── js_test.c │ │ │ │ ├── lfrfid/ │ │ │ │ │ └── lfrfid_protocols.c │ │ │ │ ├── manifest/ │ │ │ │ │ └── manifest.c │ │ │ │ ├── minunit.h │ │ │ │ ├── minunit_vars.h │ │ │ │ ├── minunit_vars_ex.h │ │ │ │ ├── nfc/ │ │ │ │ │ └── nfc_test.c │ │ │ │ ├── notification/ │ │ │ │ │ └── notes_test.c │ │ │ │ ├── pipe/ │ │ │ │ │ └── pipe_test.c │ │ │ │ ├── power/ │ │ │ │ │ └── power_test.c │ │ │ │ ├── protocol_dict/ │ │ │ │ │ └── protocol_dict_test.c │ │ │ │ ├── rpc/ │ │ │ │ │ └── rpc_test.c │ │ │ │ ├── storage/ │ │ │ │ │ └── storage_test.c │ │ │ │ ├── stream/ │ │ │ │ │ └── stream_test.c │ │ │ │ ├── strint/ │ │ │ │ │ └── strint_test.c │ │ │ │ ├── subghz/ │ │ │ │ │ └── subghz_test.c │ │ │ │ ├── test.h │ │ │ │ ├── test_api.h │ │ │ │ └── varint/ │ │ │ │ └── varint_test.c │ │ │ ├── unit_test_api_table.cpp │ │ │ ├── unit_test_api_table_i.h │ │ │ └── unit_tests.c │ │ ├── usb_mouse/ │ │ │ ├── application.fam │ │ │ └── usb_mouse.c │ │ ├── usb_test/ │ │ │ ├── application.fam │ │ │ └── usb_test.c │ │ └── vibro_test/ │ │ ├── application.fam │ │ └── vibro_test.c │ ├── drivers/ │ │ ├── application.fam │ │ └── subghz/ │ │ ├── application.fam │ │ └── cc1101_ext/ │ │ ├── cc1101_ext.c │ │ ├── cc1101_ext.h │ │ ├── cc1101_ext_interconnect.c │ │ └── cc1101_ext_interconnect.h │ ├── examples/ │ │ ├── application.fam │ │ ├── example_adc/ │ │ │ ├── application.fam │ │ │ └── example_adc.c │ │ ├── example_apps_assets/ │ │ │ ├── README.md │ │ │ ├── application.fam │ │ │ ├── example_apps_assets.c │ │ │ └── files/ │ │ │ ├── poems/ │ │ │ │ ├── a jelly-fish.txt │ │ │ │ ├── my shadow.txt │ │ │ │ └── theme in yellow.txt │ │ │ └── test_asset.txt │ │ ├── example_apps_data/ │ │ │ ├── README.md │ │ │ ├── application.fam │ │ │ └── example_apps_data.c │ │ ├── example_ble_beacon/ │ │ │ ├── application.fam │ │ │ ├── ble_beacon_app.c │ │ │ ├── ble_beacon_app.h │ │ │ └── scenes/ │ │ │ ├── scene_config.h │ │ │ ├── scene_input_beacon_data.c │ │ │ ├── scene_input_mac_addr.c │ │ │ ├── scene_menu.c │ │ │ ├── scene_run_beacon.c │ │ │ ├── scenes.c │ │ │ └── scenes.h │ │ ├── example_custom_font/ │ │ │ ├── application.fam │ │ │ └── example_custom_font.c │ │ ├── example_event_loop/ │ │ │ ├── application.fam │ │ │ ├── example_event_loop_event_flags.c │ │ │ ├── example_event_loop_multi.c │ │ │ ├── example_event_loop_mutex.c │ │ │ ├── example_event_loop_stream_buffer.c │ │ │ └── example_event_loop_timer.c │ │ ├── example_images/ │ │ │ ├── ReadMe.md │ │ │ ├── application.fam │ │ │ └── example_images.c │ │ ├── example_number_input/ │ │ │ ├── ReadMe.md │ │ │ ├── application.fam │ │ │ ├── example_number_input.c │ │ │ ├── example_number_input.h │ │ │ └── scenes/ │ │ │ ├── example_number_input_scene.c │ │ │ ├── example_number_input_scene.h │ │ │ ├── example_number_input_scene_config.h │ │ │ ├── example_number_input_scene_input_max.c │ │ │ ├── example_number_input_scene_input_min.c │ │ │ ├── example_number_input_scene_input_number.c │ │ │ └── example_number_input_scene_show_number.c │ │ ├── example_plugins/ │ │ │ ├── application.fam │ │ │ ├── example_plugins.c │ │ │ ├── example_plugins_multi.c │ │ │ ├── plugin1.c │ │ │ ├── plugin2.c │ │ │ └── plugin_interface.h │ │ ├── example_plugins_advanced/ │ │ │ ├── app_api.c │ │ │ ├── app_api.h │ │ │ ├── app_api_interface.h │ │ │ ├── app_api_table.cpp │ │ │ ├── app_api_table_i.h │ │ │ ├── application.fam │ │ │ ├── example_advanced_plugins.c │ │ │ ├── plugin1.c │ │ │ ├── plugin2.c │ │ │ └── plugin_interface.h │ │ ├── example_thermo/ │ │ │ ├── README.md │ │ │ ├── application.fam │ │ │ └── example_thermo.c │ │ ├── example_view_dispatcher/ │ │ │ ├── application.fam │ │ │ └── example_view_dispatcher.c │ │ └── example_view_holder/ │ │ ├── application.fam │ │ └── example_view_holder.c │ ├── main/ │ │ ├── application.fam │ │ ├── archive/ │ │ │ ├── application.fam │ │ │ ├── archive.c │ │ │ ├── archive.h │ │ │ ├── archive_i.h │ │ │ ├── helpers/ │ │ │ │ ├── archive_apps.c │ │ │ │ ├── archive_apps.h │ │ │ │ ├── archive_browser.c │ │ │ │ ├── archive_browser.h │ │ │ │ ├── archive_favorites.c │ │ │ │ ├── archive_favorites.h │ │ │ │ ├── archive_files.c │ │ │ │ └── archive_files.h │ │ │ ├── scenes/ │ │ │ │ ├── archive_scene.c │ │ │ │ ├── archive_scene.h │ │ │ │ ├── archive_scene_browser.c │ │ │ │ ├── archive_scene_config.h │ │ │ │ ├── archive_scene_delete.c │ │ │ │ └── archive_scene_rename.c │ │ │ └── views/ │ │ │ ├── archive_browser_view.c │ │ │ └── archive_browser_view.h │ │ ├── bad_usb/ │ │ │ ├── application.fam │ │ │ ├── bad_usb_app.c │ │ │ ├── bad_usb_app.h │ │ │ ├── bad_usb_app_i.h │ │ │ ├── helpers/ │ │ │ │ ├── bad_usb_hid.c │ │ │ │ ├── bad_usb_hid.h │ │ │ │ ├── ducky_script.c │ │ │ │ ├── ducky_script.h │ │ │ │ ├── ducky_script_commands.c │ │ │ │ ├── ducky_script_i.h │ │ │ │ └── ducky_script_keycodes.c │ │ │ ├── resources/ │ │ │ │ └── badusb/ │ │ │ │ ├── Install_qFlipper_gnome.txt │ │ │ │ ├── Install_qFlipper_macOS.txt │ │ │ │ ├── Install_qFlipper_windows.txt │ │ │ │ ├── assets/ │ │ │ │ │ └── layouts/ │ │ │ │ │ ├── ba-BA.kl │ │ │ │ │ ├── cz_CS.kl │ │ │ │ │ ├── da-DA.kl │ │ │ │ │ ├── de-CH.kl │ │ │ │ │ ├── de-DE.kl │ │ │ │ │ ├── dvorak.kl │ │ │ │ │ ├── en-UK.kl │ │ │ │ │ ├── en-US.kl │ │ │ │ │ ├── es-ES.kl │ │ │ │ │ ├── es-LA.kl │ │ │ │ │ ├── fr-BE.kl │ │ │ │ │ ├── fr-CA.kl │ │ │ │ │ ├── fr-CH.kl │ │ │ │ │ ├── fr-FR-mac.kl │ │ │ │ │ ├── fr-FR.kl │ │ │ │ │ ├── hr-HR.kl │ │ │ │ │ ├── hu-HU.kl │ │ │ │ │ ├── it-IT-mac.kl │ │ │ │ │ ├── it-IT.kl │ │ │ │ │ ├── nb-NO.kl │ │ │ │ │ ├── nl-NL.kl │ │ │ │ │ ├── pt-BR.kl │ │ │ │ │ ├── pt-PT.kl │ │ │ │ │ ├── si-SI.kl │ │ │ │ │ ├── sk-SK.kl │ │ │ │ │ ├── sv-SE.kl │ │ │ │ │ └── tr-TR.kl │ │ │ │ ├── demo_chromeos.txt │ │ │ │ ├── demo_gnome.txt │ │ │ │ ├── demo_macos.txt │ │ │ │ ├── demo_windows.txt │ │ │ │ └── test_mouse.txt │ │ │ ├── scenes/ │ │ │ │ ├── bad_usb_scene.c │ │ │ │ ├── bad_usb_scene.h │ │ │ │ ├── bad_usb_scene_config.c │ │ │ │ ├── bad_usb_scene_config.h │ │ │ │ ├── bad_usb_scene_config_layout.c │ │ │ │ ├── bad_usb_scene_confirm_unpair.c │ │ │ │ ├── bad_usb_scene_error.c │ │ │ │ ├── bad_usb_scene_file_select.c │ │ │ │ ├── bad_usb_scene_unpair_done.c │ │ │ │ └── bad_usb_scene_work.c │ │ │ └── views/ │ │ │ ├── bad_usb_view.c │ │ │ └── bad_usb_view.h │ │ ├── gpio/ │ │ │ ├── application.fam │ │ │ ├── gpio_app.c │ │ │ ├── gpio_app.h │ │ │ ├── gpio_app_i.h │ │ │ ├── gpio_custom_event.h │ │ │ ├── gpio_items.c │ │ │ ├── gpio_items.h │ │ │ ├── scenes/ │ │ │ │ ├── gpio_scene.c │ │ │ │ ├── gpio_scene.h │ │ │ │ ├── gpio_scene_config.h │ │ │ │ ├── gpio_scene_start.c │ │ │ │ ├── gpio_scene_test.c │ │ │ │ ├── gpio_scene_usb_uart.c │ │ │ │ ├── gpio_scene_usb_uart_close_rpc.c │ │ │ │ └── gpio_scene_usb_uart_config.c │ │ │ ├── usb_uart_bridge.c │ │ │ ├── usb_uart_bridge.h │ │ │ └── views/ │ │ │ ├── gpio_test.c │ │ │ ├── gpio_test.h │ │ │ ├── gpio_usb_uart.c │ │ │ └── gpio_usb_uart.h │ │ ├── ibutton/ │ │ │ ├── application.fam │ │ │ ├── ibutton.c │ │ │ ├── ibutton.h │ │ │ ├── ibutton_cli.c │ │ │ ├── ibutton_custom_event.h │ │ │ ├── ibutton_i.h │ │ │ └── scenes/ │ │ │ ├── ibutton_scene.c │ │ │ ├── ibutton_scene.h │ │ │ ├── ibutton_scene_add_type.c │ │ │ ├── ibutton_scene_add_value.c │ │ │ ├── ibutton_scene_config.h │ │ │ ├── ibutton_scene_delete_confirm.c │ │ │ ├── ibutton_scene_delete_success.c │ │ │ ├── ibutton_scene_emulate.c │ │ │ ├── ibutton_scene_exit_confirm.c │ │ │ ├── ibutton_scene_info.c │ │ │ ├── ibutton_scene_read.c │ │ │ ├── ibutton_scene_read_error.c │ │ │ ├── ibutton_scene_read_key_menu.c │ │ │ ├── ibutton_scene_read_success.c │ │ │ ├── ibutton_scene_retry_confirm.c │ │ │ ├── ibutton_scene_rpc.c │ │ │ ├── ibutton_scene_save_name.c │ │ │ ├── ibutton_scene_save_success.c │ │ │ ├── ibutton_scene_saved_key_menu.c │ │ │ ├── ibutton_scene_select_key.c │ │ │ ├── ibutton_scene_start.c │ │ │ ├── ibutton_scene_view_data.c │ │ │ ├── ibutton_scene_write.c │ │ │ └── ibutton_scene_write_success.c │ │ ├── infrared/ │ │ │ ├── application.fam │ │ │ ├── infrared_app.c │ │ │ ├── infrared_app.h │ │ │ ├── infrared_app_i.h │ │ │ ├── infrared_cli.c │ │ │ ├── infrared_custom_event.h │ │ │ ├── infrared_remote.c │ │ │ ├── infrared_remote.h │ │ │ ├── resources/ │ │ │ │ └── infrared/ │ │ │ │ └── assets/ │ │ │ │ ├── ac.ir │ │ │ │ ├── audio.ir │ │ │ │ ├── projector.ir │ │ │ │ └── tv.ir │ │ │ ├── scenes/ │ │ │ │ ├── common/ │ │ │ │ │ ├── infrared_scene_universal_common.c │ │ │ │ │ └── infrared_scene_universal_common.h │ │ │ │ ├── infrared_scene.c │ │ │ │ ├── infrared_scene.h │ │ │ │ ├── infrared_scene_ask_back.c │ │ │ │ ├── infrared_scene_ask_retry.c │ │ │ │ ├── infrared_scene_config.h │ │ │ │ ├── infrared_scene_debug.c │ │ │ │ ├── infrared_scene_edit.c │ │ │ │ ├── infrared_scene_edit_button_select.c │ │ │ │ ├── infrared_scene_edit_delete.c │ │ │ │ ├── infrared_scene_edit_delete_done.c │ │ │ │ ├── infrared_scene_edit_move.c │ │ │ │ ├── infrared_scene_edit_rename.c │ │ │ │ ├── infrared_scene_edit_rename_done.c │ │ │ │ ├── infrared_scene_error_databases.c │ │ │ │ ├── infrared_scene_gpio_settings.c │ │ │ │ ├── infrared_scene_learn.c │ │ │ │ ├── infrared_scene_learn_done.c │ │ │ │ ├── infrared_scene_learn_enter_name.c │ │ │ │ ├── infrared_scene_learn_success.c │ │ │ │ ├── infrared_scene_remote.c │ │ │ │ ├── infrared_scene_remote_list.c │ │ │ │ ├── infrared_scene_rpc.c │ │ │ │ ├── infrared_scene_start.c │ │ │ │ ├── infrared_scene_universal.c │ │ │ │ ├── infrared_scene_universal_ac.c │ │ │ │ ├── infrared_scene_universal_audio.c │ │ │ │ ├── infrared_scene_universal_projector.c │ │ │ │ └── infrared_scene_universal_tv.c │ │ │ └── views/ │ │ │ ├── infrared_debug_view.c │ │ │ ├── infrared_debug_view.h │ │ │ ├── infrared_move_view.c │ │ │ ├── infrared_move_view.h │ │ │ ├── infrared_progress_view.c │ │ │ └── infrared_progress_view.h │ │ ├── lfrfid/ │ │ │ ├── application.fam │ │ │ ├── lfrfid.c │ │ │ ├── lfrfid_cli.c │ │ │ ├── lfrfid_i.h │ │ │ ├── resources/ │ │ │ │ └── lfrfid/ │ │ │ │ └── assets/ │ │ │ │ └── iso3166.lfrfid │ │ │ ├── scenes/ │ │ │ │ ├── lfrfid_scene.c │ │ │ │ ├── lfrfid_scene.h │ │ │ │ ├── lfrfid_scene_config.h │ │ │ │ ├── lfrfid_scene_delete_confirm.c │ │ │ │ ├── lfrfid_scene_delete_success.c │ │ │ │ ├── lfrfid_scene_emulate.c │ │ │ │ ├── lfrfid_scene_exit_confirm.c │ │ │ │ ├── lfrfid_scene_extra_actions.c │ │ │ │ ├── lfrfid_scene_raw_info.c │ │ │ │ ├── lfrfid_scene_raw_name.c │ │ │ │ ├── lfrfid_scene_raw_read.c │ │ │ │ ├── lfrfid_scene_raw_success.c │ │ │ │ ├── lfrfid_scene_read.c │ │ │ │ ├── lfrfid_scene_read_key_menu.c │ │ │ │ ├── lfrfid_scene_read_success.c │ │ │ │ ├── lfrfid_scene_retry_confirm.c │ │ │ │ ├── lfrfid_scene_rpc.c │ │ │ │ ├── lfrfid_scene_save_data.c │ │ │ │ ├── lfrfid_scene_save_name.c │ │ │ │ ├── lfrfid_scene_save_success.c │ │ │ │ ├── lfrfid_scene_save_type.c │ │ │ │ ├── lfrfid_scene_saved_info.c │ │ │ │ ├── lfrfid_scene_saved_key_menu.c │ │ │ │ ├── lfrfid_scene_select_key.c │ │ │ │ ├── lfrfid_scene_start.c │ │ │ │ ├── lfrfid_scene_write.c │ │ │ │ └── lfrfid_scene_write_success.c │ │ │ └── views/ │ │ │ ├── lfrfid_view_read.c │ │ │ └── lfrfid_view_read.h │ │ ├── nfc/ │ │ │ ├── api/ │ │ │ │ ├── gallagher/ │ │ │ │ │ ├── gallagher_util.c │ │ │ │ │ └── gallagher_util.h │ │ │ │ ├── mosgortrans/ │ │ │ │ │ ├── mosgortrans_util.c │ │ │ │ │ └── mosgortrans_util.h │ │ │ │ ├── nfc_app_api_interface.h │ │ │ │ ├── nfc_app_api_table.cpp │ │ │ │ └── nfc_app_api_table_i.h │ │ │ ├── application.fam │ │ │ ├── cli/ │ │ │ │ ├── commands/ │ │ │ │ │ ├── apdu/ │ │ │ │ │ │ ├── nfc_cli_command_apdu.c │ │ │ │ │ │ ├── nfc_cli_command_apdu.h │ │ │ │ │ │ └── protocol_handlers/ │ │ │ │ │ │ ├── iso14443_4a/ │ │ │ │ │ │ │ ├── nfc_cli_apdu_iso14443_4a.c │ │ │ │ │ │ │ └── nfc_cli_apdu_iso14443_4a.h │ │ │ │ │ │ ├── iso14443_4b/ │ │ │ │ │ │ │ ├── nfc_cli_apdu_iso14443_4b.c │ │ │ │ │ │ │ └── nfc_cli_apdu_iso14443_4b.h │ │ │ │ │ │ ├── iso15693_3/ │ │ │ │ │ │ │ ├── nfc_cli_apdu_iso15693_3.c │ │ │ │ │ │ │ └── nfc_cli_apdu_iso15693_3.h │ │ │ │ │ │ └── nfc_cli_apdu_common_types.h │ │ │ │ │ ├── dump/ │ │ │ │ │ │ ├── nfc_cli_command_dump.c │ │ │ │ │ │ ├── nfc_cli_command_dump.h │ │ │ │ │ │ └── protocols/ │ │ │ │ │ │ ├── felica/ │ │ │ │ │ │ │ ├── nfc_cli_dump_felica.c │ │ │ │ │ │ │ └── nfc_cli_dump_felica.h │ │ │ │ │ │ ├── iso14443_3a/ │ │ │ │ │ │ │ ├── nfc_cli_dump_iso14443_3a.c │ │ │ │ │ │ │ └── nfc_cli_dump_iso14443_3a.h │ │ │ │ │ │ ├── iso14443_3b/ │ │ │ │ │ │ │ ├── nfc_cli_dump_iso14443_3b.c │ │ │ │ │ │ │ └── nfc_cli_dump_iso14443_3b.h │ │ │ │ │ │ ├── iso14443_4a/ │ │ │ │ │ │ │ ├── nfc_cli_dump_iso14443_4a.c │ │ │ │ │ │ │ └── nfc_cli_dump_iso14443_4a.h │ │ │ │ │ │ ├── iso14443_4b/ │ │ │ │ │ │ │ ├── nfc_cli_dump_iso14443_4b.c │ │ │ │ │ │ │ └── nfc_cli_dump_iso14443_4b.h │ │ │ │ │ │ ├── iso15693_3/ │ │ │ │ │ │ │ ├── nfc_cli_dump_iso15693_3.c │ │ │ │ │ │ │ └── nfc_cli_dump_iso15693_3.h │ │ │ │ │ │ ├── mf_classic/ │ │ │ │ │ │ │ ├── nfc_cli_dump_mf_classic.c │ │ │ │ │ │ │ └── nfc_cli_dump_mf_classic.h │ │ │ │ │ │ ├── mf_desfire/ │ │ │ │ │ │ │ ├── nfc_cli_dump_mf_desfire.c │ │ │ │ │ │ │ └── nfc_cli_dump_mf_desfire.h │ │ │ │ │ │ ├── mf_plus/ │ │ │ │ │ │ │ ├── nfc_cli_dump_mf_plus.c │ │ │ │ │ │ │ └── nfc_cli_dump_mf_plus.h │ │ │ │ │ │ ├── mf_ultralight/ │ │ │ │ │ │ │ ├── nfc_cli_dump_mf_ultralight.c │ │ │ │ │ │ │ └── nfc_cli_dump_mf_ultralight.h │ │ │ │ │ │ ├── nfc_cli_dump_common_types.h │ │ │ │ │ │ ├── slix/ │ │ │ │ │ │ │ ├── nfc_cli_dump_slix.c │ │ │ │ │ │ │ └── nfc_cli_dump_slix.h │ │ │ │ │ │ └── st25tb/ │ │ │ │ │ │ ├── nfc_cli_dump_st25tb.c │ │ │ │ │ │ └── nfc_cli_dump_st25tb.h │ │ │ │ │ ├── helpers/ │ │ │ │ │ │ ├── nfc_cli_format.c │ │ │ │ │ │ ├── nfc_cli_format.h │ │ │ │ │ │ ├── nfc_cli_protocol_parser.c │ │ │ │ │ │ ├── nfc_cli_protocol_parser.h │ │ │ │ │ │ ├── nfc_cli_scanner.c │ │ │ │ │ │ └── nfc_cli_scanner.h │ │ │ │ │ ├── mfu/ │ │ │ │ │ │ ├── nfc_cli_action_info.c │ │ │ │ │ │ ├── nfc_cli_action_info.h │ │ │ │ │ │ ├── nfc_cli_action_rdbl.c │ │ │ │ │ │ ├── nfc_cli_action_rdbl.h │ │ │ │ │ │ ├── nfc_cli_action_wrbl.c │ │ │ │ │ │ ├── nfc_cli_action_wrbl.h │ │ │ │ │ │ ├── nfc_cli_command_mfu.c │ │ │ │ │ │ └── nfc_cli_command_mfu.h │ │ │ │ │ ├── nfc_cli_command_emulate.c │ │ │ │ │ ├── nfc_cli_command_emulate.h │ │ │ │ │ ├── nfc_cli_command_field.c │ │ │ │ │ ├── nfc_cli_command_field.h │ │ │ │ │ ├── nfc_cli_command_scanner.c │ │ │ │ │ ├── nfc_cli_command_scanner.h │ │ │ │ │ └── raw/ │ │ │ │ │ ├── nfc_cli_command_raw.c │ │ │ │ │ ├── nfc_cli_command_raw.h │ │ │ │ │ └── protocol_handlers/ │ │ │ │ │ ├── felica/ │ │ │ │ │ │ ├── nfc_cli_raw_felica.c │ │ │ │ │ │ └── nfc_cli_raw_felica.h │ │ │ │ │ ├── iso14443_3a/ │ │ │ │ │ │ ├── nfc_cli_raw_iso14443_3a.c │ │ │ │ │ │ └── nfc_cli_raw_iso14443_3a.h │ │ │ │ │ ├── iso14443_3b/ │ │ │ │ │ │ ├── nfc_cli_raw_iso14443_3b.c │ │ │ │ │ │ └── nfc_cli_raw_iso14443_3b.h │ │ │ │ │ ├── iso15693_3/ │ │ │ │ │ │ ├── nfc_cli_raw_iso15693_3.c │ │ │ │ │ │ └── nfc_cli_raw_iso15693_3.h │ │ │ │ │ └── nfc_cli_raw_common_types.h │ │ │ │ ├── nfc_cli.c │ │ │ │ ├── nfc_cli_command_base.h │ │ │ │ ├── nfc_cli_command_base_i.h │ │ │ │ ├── nfc_cli_command_processor.c │ │ │ │ ├── nfc_cli_command_processor.h │ │ │ │ ├── nfc_cli_commands.c │ │ │ │ └── nfc_cli_commands.h │ │ │ ├── helpers/ │ │ │ │ ├── felica_auth.c │ │ │ │ ├── felica_auth.h │ │ │ │ ├── mf_classic_key_cache.c │ │ │ │ ├── mf_classic_key_cache.h │ │ │ │ ├── mf_ultralight_auth.c │ │ │ │ ├── mf_ultralight_auth.h │ │ │ │ ├── mf_user_dict.c │ │ │ │ ├── mf_user_dict.h │ │ │ │ ├── mfkey32_logger.c │ │ │ │ ├── mfkey32_logger.h │ │ │ │ ├── nfc_custom_event.h │ │ │ │ ├── nfc_detected_protocols.c │ │ │ │ ├── nfc_detected_protocols.h │ │ │ │ ├── nfc_emv_parser.c │ │ │ │ ├── nfc_emv_parser.h │ │ │ │ ├── nfc_supported_cards.c │ │ │ │ ├── nfc_supported_cards.h │ │ │ │ ├── protocol_support/ │ │ │ │ │ ├── felica/ │ │ │ │ │ │ ├── felica.c │ │ │ │ │ │ ├── felica.h │ │ │ │ │ │ ├── felica_render.c │ │ │ │ │ │ └── felica_render.h │ │ │ │ │ ├── iso14443_3a/ │ │ │ │ │ │ ├── iso14443_3a.c │ │ │ │ │ │ ├── iso14443_3a.h │ │ │ │ │ │ ├── iso14443_3a_render.c │ │ │ │ │ │ └── iso14443_3a_render.h │ │ │ │ │ ├── iso14443_3b/ │ │ │ │ │ │ ├── iso14443_3b.c │ │ │ │ │ │ ├── iso14443_3b.h │ │ │ │ │ │ ├── iso14443_3b_i.h │ │ │ │ │ │ ├── iso14443_3b_render.c │ │ │ │ │ │ └── iso14443_3b_render.h │ │ │ │ │ ├── iso14443_4a/ │ │ │ │ │ │ ├── iso14443_4a.c │ │ │ │ │ │ ├── iso14443_4a.h │ │ │ │ │ │ ├── iso14443_4a_i.h │ │ │ │ │ │ ├── iso14443_4a_render.c │ │ │ │ │ │ └── iso14443_4a_render.h │ │ │ │ │ ├── iso14443_4b/ │ │ │ │ │ │ ├── iso14443_4b.c │ │ │ │ │ │ ├── iso14443_4b.h │ │ │ │ │ │ ├── iso14443_4b_render.c │ │ │ │ │ │ └── iso14443_4b_render.h │ │ │ │ │ ├── iso15693_3/ │ │ │ │ │ │ ├── iso15693_3.c │ │ │ │ │ │ ├── iso15693_3.h │ │ │ │ │ │ ├── iso15693_3_render.c │ │ │ │ │ │ └── iso15693_3_render.h │ │ │ │ │ ├── mf_classic/ │ │ │ │ │ │ ├── mf_classic.c │ │ │ │ │ │ ├── mf_classic.h │ │ │ │ │ │ ├── mf_classic_render.c │ │ │ │ │ │ └── mf_classic_render.h │ │ │ │ │ ├── mf_desfire/ │ │ │ │ │ │ ├── mf_desfire.c │ │ │ │ │ │ ├── mf_desfire.h │ │ │ │ │ │ ├── mf_desfire_render.c │ │ │ │ │ │ └── mf_desfire_render.h │ │ │ │ │ ├── mf_plus/ │ │ │ │ │ │ ├── mf_plus.c │ │ │ │ │ │ ├── mf_plus.h │ │ │ │ │ │ ├── mf_plus_render.c │ │ │ │ │ │ └── mf_plus_render.h │ │ │ │ │ ├── mf_ultralight/ │ │ │ │ │ │ ├── mf_ultralight.c │ │ │ │ │ │ ├── mf_ultralight.h │ │ │ │ │ │ ├── mf_ultralight_render.c │ │ │ │ │ │ └── mf_ultralight_render.h │ │ │ │ │ ├── nfc_protocol_support.c │ │ │ │ │ ├── nfc_protocol_support.h │ │ │ │ │ ├── nfc_protocol_support_base.h │ │ │ │ │ ├── nfc_protocol_support_common.h │ │ │ │ │ ├── nfc_protocol_support_defs.c │ │ │ │ │ ├── nfc_protocol_support_defs.h │ │ │ │ │ ├── nfc_protocol_support_gui_common.c │ │ │ │ │ ├── nfc_protocol_support_gui_common.h │ │ │ │ │ ├── nfc_protocol_support_render_common.h │ │ │ │ │ ├── nfc_protocol_support_unlock_helper.c │ │ │ │ │ ├── nfc_protocol_support_unlock_helper.h │ │ │ │ │ ├── slix/ │ │ │ │ │ │ ├── slix.c │ │ │ │ │ │ ├── slix.h │ │ │ │ │ │ ├── slix_render.c │ │ │ │ │ │ └── slix_render.h │ │ │ │ │ └── st25tb/ │ │ │ │ │ ├── st25tb.c │ │ │ │ │ ├── st25tb.h │ │ │ │ │ ├── st25tb_render.c │ │ │ │ │ └── st25tb_render.h │ │ │ │ ├── slix_unlock.c │ │ │ │ └── slix_unlock.h │ │ │ ├── nfc_app.c │ │ │ ├── nfc_app.h │ │ │ ├── nfc_app_i.h │ │ │ ├── plugins/ │ │ │ │ └── supported_cards/ │ │ │ │ ├── aic.c │ │ │ │ ├── aime.c │ │ │ │ ├── all_in_one.c │ │ │ │ ├── banapass.c │ │ │ │ ├── bip.c │ │ │ │ ├── clipper.c │ │ │ │ ├── disney_infinity.c │ │ │ │ ├── gallagher.c │ │ │ │ ├── hi.c │ │ │ │ ├── hid.c │ │ │ │ ├── hworld.c │ │ │ │ ├── itso.c │ │ │ │ ├── microel.c │ │ │ │ ├── mizip.c │ │ │ │ ├── mykey.c │ │ │ │ ├── myki.c │ │ │ │ ├── ndef.c │ │ │ │ ├── nfc_supported_card_plugin.h │ │ │ │ ├── opal.c │ │ │ │ ├── plantain.c │ │ │ │ ├── skylanders.c │ │ │ │ ├── social_moscow.c │ │ │ │ ├── troika.c │ │ │ │ ├── trt.c │ │ │ │ ├── two_cities.c │ │ │ │ ├── umarsh.c │ │ │ │ └── washcity.c │ │ │ ├── resources/ │ │ │ │ └── nfc/ │ │ │ │ └── assets/ │ │ │ │ ├── aid.nfc │ │ │ │ ├── country_code.nfc │ │ │ │ ├── currency_code.nfc │ │ │ │ ├── mf_classic_dict.nfc │ │ │ │ ├── mf_ultralight_c_dict.nfc │ │ │ │ ├── skylanders.nfc │ │ │ │ └── vendors.nfc │ │ │ ├── scenes/ │ │ │ │ ├── nfc_scene.c │ │ │ │ ├── nfc_scene.h │ │ │ │ ├── nfc_scene_config.h │ │ │ │ ├── nfc_scene_debug.c │ │ │ │ ├── nfc_scene_delete.c │ │ │ │ ├── nfc_scene_delete_success.c │ │ │ │ ├── nfc_scene_des_auth_key_input.c │ │ │ │ ├── nfc_scene_des_auth_unlock_warn.c │ │ │ │ ├── nfc_scene_detect.c │ │ │ │ ├── nfc_scene_emulate.c │ │ │ │ ├── nfc_scene_exit_confirm.c │ │ │ │ ├── nfc_scene_extra_actions.c │ │ │ │ ├── nfc_scene_felica_more_info.c │ │ │ │ ├── nfc_scene_felica_system.c │ │ │ │ ├── nfc_scene_field.c │ │ │ │ ├── nfc_scene_file_select.c │ │ │ │ ├── nfc_scene_generate_info.c │ │ │ │ ├── nfc_scene_info.c │ │ │ │ ├── nfc_scene_mf_classic_detect_reader.c │ │ │ │ ├── nfc_scene_mf_classic_dict_attack.c │ │ │ │ ├── nfc_scene_mf_classic_keys.c │ │ │ │ ├── nfc_scene_mf_classic_keys_add.c │ │ │ │ ├── nfc_scene_mf_classic_keys_delete.c │ │ │ │ ├── nfc_scene_mf_classic_keys_list.c │ │ │ │ ├── nfc_scene_mf_classic_keys_warn_duplicate.c │ │ │ │ ├── nfc_scene_mf_classic_mfkey_complete.c │ │ │ │ ├── nfc_scene_mf_classic_mfkey_nonces_info.c │ │ │ │ ├── nfc_scene_mf_classic_update_initial.c │ │ │ │ ├── nfc_scene_mf_classic_update_initial_success.c │ │ │ │ ├── nfc_scene_mf_classic_update_initial_wrong_card.c │ │ │ │ ├── nfc_scene_mf_classic_write_initial.c │ │ │ │ ├── nfc_scene_mf_classic_write_initial_fail.c │ │ │ │ ├── nfc_scene_mf_classic_write_initial_success.c │ │ │ │ ├── nfc_scene_mf_classic_write_initial_wrong_card.c │ │ │ │ ├── nfc_scene_mf_desfire_app.c │ │ │ │ ├── nfc_scene_mf_desfire_more_info.c │ │ │ │ ├── nfc_scene_mf_ultralight_c_dict_attack.c │ │ │ │ ├── nfc_scene_mf_ultralight_c_keys.c │ │ │ │ ├── nfc_scene_mf_ultralight_c_keys_add.c │ │ │ │ ├── nfc_scene_mf_ultralight_c_keys_delete.c │ │ │ │ ├── nfc_scene_mf_ultralight_c_keys_list.c │ │ │ │ ├── nfc_scene_mf_ultralight_c_keys_warn_duplicate.c │ │ │ │ ├── nfc_scene_mf_ultralight_capture_pass.c │ │ │ │ ├── nfc_scene_mf_ultralight_key_input.c │ │ │ │ ├── nfc_scene_mf_ultralight_unlock_menu.c │ │ │ │ ├── nfc_scene_mf_ultralight_unlock_warn.c │ │ │ │ ├── nfc_scene_mf_ultralight_write.c │ │ │ │ ├── nfc_scene_mf_ultralight_write_fail.c │ │ │ │ ├── nfc_scene_mf_ultralight_write_success.c │ │ │ │ ├── nfc_scene_mf_ultralight_wrong_card.c │ │ │ │ ├── nfc_scene_more_info.c │ │ │ │ ├── nfc_scene_read.c │ │ │ │ ├── nfc_scene_read_menu.c │ │ │ │ ├── nfc_scene_read_success.c │ │ │ │ ├── nfc_scene_restore_original.c │ │ │ │ ├── nfc_scene_restore_original_confirm.c │ │ │ │ ├── nfc_scene_retry_confirm.c │ │ │ │ ├── nfc_scene_rpc.c │ │ │ │ ├── nfc_scene_save_confirm.c │ │ │ │ ├── nfc_scene_save_name.c │ │ │ │ ├── nfc_scene_save_success.c │ │ │ │ ├── nfc_scene_saved_menu.c │ │ │ │ ├── nfc_scene_select_protocol.c │ │ │ │ ├── nfc_scene_set_atqa.c │ │ │ │ ├── nfc_scene_set_sak.c │ │ │ │ ├── nfc_scene_set_type.c │ │ │ │ ├── nfc_scene_set_uid.c │ │ │ │ ├── nfc_scene_slix_key_input.c │ │ │ │ ├── nfc_scene_slix_unlock.c │ │ │ │ ├── nfc_scene_slix_unlock_menu.c │ │ │ │ ├── nfc_scene_slix_unlock_success.c │ │ │ │ ├── nfc_scene_start.c │ │ │ │ └── nfc_scene_supported_card.c │ │ │ └── views/ │ │ │ ├── detect_reader.c │ │ │ ├── detect_reader.h │ │ │ ├── dict_attack.c │ │ │ └── dict_attack.h │ │ ├── onewire/ │ │ │ ├── application.fam │ │ │ └── onewire_cli.c │ │ ├── subghz/ │ │ │ ├── application.fam │ │ │ ├── helpers/ │ │ │ │ ├── subghz_chat.c │ │ │ │ ├── subghz_chat.h │ │ │ │ ├── subghz_custom_event.h │ │ │ │ ├── subghz_frequency_analyzer_log_item_array.c │ │ │ │ ├── subghz_frequency_analyzer_log_item_array.h │ │ │ │ ├── subghz_frequency_analyzer_worker.c │ │ │ │ ├── subghz_frequency_analyzer_worker.h │ │ │ │ ├── subghz_threshold_rssi.c │ │ │ │ ├── subghz_threshold_rssi.h │ │ │ │ ├── subghz_txrx.c │ │ │ │ ├── subghz_txrx.h │ │ │ │ ├── subghz_txrx_create_protocol_key.c │ │ │ │ ├── subghz_txrx_create_protocol_key.h │ │ │ │ ├── subghz_txrx_i.h │ │ │ │ └── subghz_types.h │ │ │ ├── resources/ │ │ │ │ └── subghz/ │ │ │ │ └── assets/ │ │ │ │ ├── alutech_at_4n │ │ │ │ ├── came_atomo │ │ │ │ ├── keeloq_mfcodes │ │ │ │ ├── keeloq_mfcodes_user.example │ │ │ │ ├── nice_flor_s │ │ │ │ └── setting_user.example │ │ │ ├── scenes/ │ │ │ │ ├── subghz_scene.c │ │ │ │ ├── subghz_scene.h │ │ │ │ ├── subghz_scene_config.h │ │ │ │ ├── subghz_scene_delete.c │ │ │ │ ├── subghz_scene_delete_raw.c │ │ │ │ ├── subghz_scene_delete_success.c │ │ │ │ ├── subghz_scene_frequency_analyzer.c │ │ │ │ ├── subghz_scene_more_raw.c │ │ │ │ ├── subghz_scene_need_saving.c │ │ │ │ ├── subghz_scene_radio_setting.c │ │ │ │ ├── subghz_scene_read_raw.c │ │ │ │ ├── subghz_scene_receiver.c │ │ │ │ ├── subghz_scene_receiver_config.c │ │ │ │ ├── subghz_scene_receiver_info.c │ │ │ │ ├── subghz_scene_region_info.c │ │ │ │ ├── subghz_scene_rpc.c │ │ │ │ ├── subghz_scene_save_name.c │ │ │ │ ├── subghz_scene_save_success.c │ │ │ │ ├── subghz_scene_saved.c │ │ │ │ ├── subghz_scene_saved_menu.c │ │ │ │ ├── subghz_scene_set_type.c │ │ │ │ ├── subghz_scene_show_error.c │ │ │ │ ├── subghz_scene_show_error_sub.c │ │ │ │ ├── subghz_scene_start.c │ │ │ │ └── subghz_scene_transmitter.c │ │ │ ├── subghz.c │ │ │ ├── subghz.h │ │ │ ├── subghz_cli.c │ │ │ ├── subghz_cli.h │ │ │ ├── subghz_history.c │ │ │ ├── subghz_history.h │ │ │ ├── subghz_i.c │ │ │ ├── subghz_i.h │ │ │ └── views/ │ │ │ ├── receiver.c │ │ │ ├── receiver.h │ │ │ ├── subghz_frequency_analyzer.c │ │ │ ├── subghz_frequency_analyzer.h │ │ │ ├── subghz_read_raw.c │ │ │ ├── subghz_read_raw.h │ │ │ ├── transmitter.c │ │ │ └── transmitter.h │ │ └── u2f/ │ │ ├── application.fam │ │ ├── resources/ │ │ │ └── u2f/ │ │ │ └── assets/ │ │ │ ├── cert.der │ │ │ └── cert_key.u2f │ │ ├── scenes/ │ │ │ ├── u2f_scene.c │ │ │ ├── u2f_scene.h │ │ │ ├── u2f_scene_config.h │ │ │ ├── u2f_scene_error.c │ │ │ └── u2f_scene_main.c │ │ ├── u2f.c │ │ ├── u2f.h │ │ ├── u2f_app.c │ │ ├── u2f_app.h │ │ ├── u2f_app_i.h │ │ ├── u2f_data.c │ │ ├── u2f_data.h │ │ ├── u2f_hid.c │ │ ├── u2f_hid.h │ │ └── views/ │ │ ├── u2f_view.c │ │ └── u2f_view.h │ ├── services/ │ │ ├── application.fam │ │ ├── applications.h │ │ ├── bt/ │ │ │ ├── application.fam │ │ │ ├── bt_cli.c │ │ │ ├── bt_service/ │ │ │ │ ├── bt.c │ │ │ │ ├── bt.h │ │ │ │ ├── bt_api.c │ │ │ │ ├── bt_i.h │ │ │ │ ├── bt_keys_filename.h │ │ │ │ ├── bt_keys_storage.c │ │ │ │ ├── bt_keys_storage.h │ │ │ │ └── bt_settings_api_i.h │ │ │ ├── bt_settings.c │ │ │ ├── bt_settings.h │ │ │ └── bt_settings_filename.h │ │ ├── cli/ │ │ │ ├── application.fam │ │ │ ├── cli.h │ │ │ ├── cli_command_gpio.c │ │ │ ├── cli_command_gpio.h │ │ │ ├── cli_main_commands.c │ │ │ ├── cli_main_commands.h │ │ │ ├── cli_main_shell.c │ │ │ ├── cli_main_shell.h │ │ │ ├── cli_vcp.c │ │ │ ├── cli_vcp.h │ │ │ └── commands/ │ │ │ ├── buzzer.c │ │ │ ├── hello_world.c │ │ │ ├── neofetch.c │ │ │ └── subshell_demo.c │ │ ├── crypto/ │ │ │ ├── application.fam │ │ │ └── crypto_cli.c │ │ ├── desktop/ │ │ │ ├── animations/ │ │ │ │ ├── animation_manager.c │ │ │ │ ├── animation_manager.h │ │ │ │ ├── animation_storage.c │ │ │ │ ├── animation_storage.h │ │ │ │ ├── animation_storage_i.h │ │ │ │ └── views/ │ │ │ │ ├── bubble_animation_view.c │ │ │ │ ├── bubble_animation_view.h │ │ │ │ ├── one_shot_animation_view.c │ │ │ │ └── one_shot_animation_view.h │ │ │ ├── application.fam │ │ │ ├── desktop.c │ │ │ ├── desktop.h │ │ │ ├── desktop_i.h │ │ │ ├── desktop_settings.c │ │ │ ├── desktop_settings.h │ │ │ ├── desktop_settings_filename.h │ │ │ ├── helpers/ │ │ │ │ ├── pin_code.c │ │ │ │ ├── pin_code.h │ │ │ │ ├── slideshow.c │ │ │ │ ├── slideshow.h │ │ │ │ └── slideshow_filename.h │ │ │ ├── scenes/ │ │ │ │ ├── desktop_scene.c │ │ │ │ ├── desktop_scene.h │ │ │ │ ├── desktop_scene_config.h │ │ │ │ ├── desktop_scene_debug.c │ │ │ │ ├── desktop_scene_fault.c │ │ │ │ ├── desktop_scene_hw_mismatch.c │ │ │ │ ├── desktop_scene_lock_menu.c │ │ │ │ ├── desktop_scene_locked.c │ │ │ │ ├── desktop_scene_locked.h │ │ │ │ ├── desktop_scene_main.c │ │ │ │ ├── desktop_scene_pin_input.c │ │ │ │ ├── desktop_scene_pin_timeout.c │ │ │ │ ├── desktop_scene_secure_enclave.c │ │ │ │ └── desktop_scene_slideshow.c │ │ │ └── views/ │ │ │ ├── desktop_events.h │ │ │ ├── desktop_view_debug.c │ │ │ ├── desktop_view_debug.h │ │ │ ├── desktop_view_lock_menu.c │ │ │ ├── desktop_view_lock_menu.h │ │ │ ├── desktop_view_locked.c │ │ │ ├── desktop_view_locked.h │ │ │ ├── desktop_view_main.c │ │ │ ├── desktop_view_main.h │ │ │ ├── desktop_view_pin_input.c │ │ │ ├── desktop_view_pin_input.h │ │ │ ├── desktop_view_pin_timeout.c │ │ │ ├── desktop_view_pin_timeout.h │ │ │ ├── desktop_view_slideshow.c │ │ │ └── desktop_view_slideshow.h │ │ ├── dialogs/ │ │ │ ├── application.fam │ │ │ ├── dialogs.c │ │ │ ├── dialogs.h │ │ │ ├── dialogs_api.c │ │ │ ├── dialogs_i.h │ │ │ ├── dialogs_message.h │ │ │ ├── dialogs_module_file_browser.c │ │ │ ├── dialogs_module_file_browser.h │ │ │ ├── dialogs_module_message.c │ │ │ └── dialogs_module_message.h │ │ ├── dolphin/ │ │ │ ├── application.fam │ │ │ ├── dolphin.c │ │ │ ├── dolphin.h │ │ │ ├── dolphin_i.h │ │ │ └── helpers/ │ │ │ ├── dolphin_deed.c │ │ │ ├── dolphin_deed.h │ │ │ ├── dolphin_state.c │ │ │ ├── dolphin_state.h │ │ │ └── dolphin_state_filename.h │ │ ├── expansion/ │ │ │ ├── application.fam │ │ │ ├── expansion.c │ │ │ ├── expansion.h │ │ │ ├── expansion_protocol.h │ │ │ ├── expansion_settings.c │ │ │ ├── expansion_settings.h │ │ │ ├── expansion_settings_filename.h │ │ │ ├── expansion_worker.c │ │ │ └── expansion_worker.h │ │ ├── gui/ │ │ │ ├── application.fam │ │ │ ├── canvas.c │ │ │ ├── canvas.h │ │ │ ├── canvas_i.h │ │ │ ├── elements.c │ │ │ ├── elements.h │ │ │ ├── gui.c │ │ │ ├── gui.h │ │ │ ├── gui_i.h │ │ │ ├── icon.c │ │ │ ├── icon.h │ │ │ ├── icon_animation.c │ │ │ ├── icon_animation.h │ │ │ ├── icon_animation_i.h │ │ │ ├── icon_i.h │ │ │ ├── modules/ │ │ │ │ ├── button_menu.c │ │ │ │ ├── button_menu.h │ │ │ │ ├── button_panel.c │ │ │ │ ├── button_panel.h │ │ │ │ ├── byte_input.c │ │ │ │ ├── byte_input.h │ │ │ │ ├── dialog_ex.c │ │ │ │ ├── dialog_ex.h │ │ │ │ ├── empty_screen.c │ │ │ │ ├── empty_screen.h │ │ │ │ ├── file_browser.c │ │ │ │ ├── file_browser.h │ │ │ │ ├── file_browser_worker.c │ │ │ │ ├── file_browser_worker.h │ │ │ │ ├── loading.c │ │ │ │ ├── loading.h │ │ │ │ ├── menu.c │ │ │ │ ├── menu.h │ │ │ │ ├── number_input.c │ │ │ │ ├── number_input.h │ │ │ │ ├── popup.c │ │ │ │ ├── popup.h │ │ │ │ ├── submenu.c │ │ │ │ ├── submenu.h │ │ │ │ ├── text_box.c │ │ │ │ ├── text_box.h │ │ │ │ ├── text_input.c │ │ │ │ ├── text_input.h │ │ │ │ ├── validators.c │ │ │ │ ├── validators.h │ │ │ │ ├── variable_item_list.c │ │ │ │ ├── variable_item_list.h │ │ │ │ ├── widget.c │ │ │ │ ├── widget.h │ │ │ │ └── widget_elements/ │ │ │ │ ├── widget_element.h │ │ │ │ ├── widget_element_button.c │ │ │ │ ├── widget_element_circle.c │ │ │ │ ├── widget_element_i.h │ │ │ │ ├── widget_element_icon.c │ │ │ │ ├── widget_element_line.c │ │ │ │ ├── widget_element_rect.c │ │ │ │ ├── widget_element_string.c │ │ │ │ ├── widget_element_string_multiline.c │ │ │ │ ├── widget_element_text_box.c │ │ │ │ └── widget_element_text_scroll.c │ │ │ ├── scene_manager.c │ │ │ ├── scene_manager.h │ │ │ ├── scene_manager_i.h │ │ │ ├── view.c │ │ │ ├── view.h │ │ │ ├── view_dispatcher.c │ │ │ ├── view_dispatcher.h │ │ │ ├── view_dispatcher_i.h │ │ │ ├── view_holder.c │ │ │ ├── view_holder.h │ │ │ ├── view_i.h │ │ │ ├── view_port.c │ │ │ ├── view_port.h │ │ │ ├── view_port_i.h │ │ │ ├── view_stack.c │ │ │ └── view_stack.h │ │ ├── input/ │ │ │ ├── application.fam │ │ │ ├── input.c │ │ │ ├── input.h │ │ │ └── input_cli.c │ │ ├── loader/ │ │ │ ├── application.fam │ │ │ ├── firmware_api/ │ │ │ │ ├── firmware_api.cpp │ │ │ │ └── firmware_api.h │ │ │ ├── loader.c │ │ │ ├── loader.h │ │ │ ├── loader_applications.c │ │ │ ├── loader_applications.h │ │ │ ├── loader_cli.c │ │ │ ├── loader_i.h │ │ │ ├── loader_menu.c │ │ │ ├── loader_menu.h │ │ │ ├── loader_queue.c │ │ │ └── loader_queue.h │ │ ├── locale/ │ │ │ ├── application.fam │ │ │ ├── locale.c │ │ │ └── locale.h │ │ ├── notification/ │ │ │ ├── application.fam │ │ │ ├── notification.h │ │ │ ├── notification_app.c │ │ │ ├── notification_app.h │ │ │ ├── notification_app_api.c │ │ │ ├── notification_messages.c │ │ │ ├── notification_messages.h │ │ │ ├── notification_messages_notes.c │ │ │ ├── notification_messages_notes.h │ │ │ └── notification_settings_filename.h │ │ ├── power/ │ │ │ ├── application.fam │ │ │ ├── power_cli.c │ │ │ ├── power_cli.h │ │ │ └── power_service/ │ │ │ ├── power.c │ │ │ ├── power.h │ │ │ ├── power_api.c │ │ │ ├── power_i.h │ │ │ └── views/ │ │ │ ├── power_off.c │ │ │ ├── power_off.h │ │ │ ├── power_unplug_usb.c │ │ │ └── power_unplug_usb.h │ │ ├── region/ │ │ │ ├── application.fam │ │ │ └── region.c │ │ ├── rpc/ │ │ │ ├── application.fam │ │ │ ├── rpc.c │ │ │ ├── rpc.h │ │ │ ├── rpc_app.c │ │ │ ├── rpc_app.h │ │ │ ├── rpc_app_error_codes.h │ │ │ ├── rpc_cli.c │ │ │ ├── rpc_debug.c │ │ │ ├── rpc_desktop.c │ │ │ ├── rpc_gpio.c │ │ │ ├── rpc_gui.c │ │ │ ├── rpc_i.h │ │ │ ├── rpc_property.c │ │ │ ├── rpc_storage.c │ │ │ └── rpc_system.c │ │ └── storage/ │ │ ├── application.fam │ │ ├── filesystem_api.c │ │ ├── filesystem_api_defines.h │ │ ├── filesystem_api_internal.h │ │ ├── storage.c │ │ ├── storage.h │ │ ├── storage_cli.c │ │ ├── storage_external_api.c │ │ ├── storage_glue.c │ │ ├── storage_glue.h │ │ ├── storage_i.h │ │ ├── storage_internal_api.c │ │ ├── storage_internal_dirname_i.h │ │ ├── storage_message.h │ │ ├── storage_processing.c │ │ ├── storage_processing.h │ │ ├── storage_sd_api.c │ │ ├── storage_sd_api.h │ │ └── storages/ │ │ ├── sd_notify.c │ │ ├── sd_notify.h │ │ ├── storage_ext.c │ │ └── storage_ext.h │ ├── settings/ │ │ ├── about/ │ │ │ ├── about.c │ │ │ └── application.fam │ │ ├── application.fam │ │ ├── bt_settings_app/ │ │ │ ├── application.fam │ │ │ ├── bt_settings_app.c │ │ │ ├── bt_settings_app.h │ │ │ └── scenes/ │ │ │ ├── bt_settings_scene.c │ │ │ ├── bt_settings_scene.h │ │ │ ├── bt_settings_scene_config.h │ │ │ ├── bt_settings_scene_forget_dev_confirm.c │ │ │ ├── bt_settings_scene_forget_dev_success.c │ │ │ └── bt_settings_scene_start.c │ │ ├── clock_settings/ │ │ │ ├── application.fam │ │ │ ├── clock_settings.c │ │ │ ├── clock_settings.h │ │ │ ├── clock_settings_alarm.c │ │ │ ├── scenes/ │ │ │ │ ├── clock_settings_scene.c │ │ │ │ ├── clock_settings_scene.h │ │ │ │ ├── clock_settings_scene_config.h │ │ │ │ └── clock_settings_scene_start.c │ │ │ └── views/ │ │ │ ├── clock_settings_module.c │ │ │ └── clock_settings_module.h │ │ ├── desktop_settings/ │ │ │ ├── application.fam │ │ │ ├── desktop_settings_app.c │ │ │ ├── desktop_settings_app.h │ │ │ ├── desktop_settings_custom_event.h │ │ │ ├── scenes/ │ │ │ │ ├── desktop_settings_scene.c │ │ │ │ ├── desktop_settings_scene.h │ │ │ │ ├── desktop_settings_scene_config.h │ │ │ │ ├── desktop_settings_scene_favorite.c │ │ │ │ ├── desktop_settings_scene_happy_mode.c │ │ │ │ ├── desktop_settings_scene_i.h │ │ │ │ ├── desktop_settings_scene_pin_auth.c │ │ │ │ ├── desktop_settings_scene_pin_disable.c │ │ │ │ ├── desktop_settings_scene_pin_error.c │ │ │ │ ├── desktop_settings_scene_pin_menu.c │ │ │ │ ├── desktop_settings_scene_pin_setup.c │ │ │ │ ├── desktop_settings_scene_pin_setup_done.c │ │ │ │ ├── desktop_settings_scene_pin_setup_howto.c │ │ │ │ ├── desktop_settings_scene_pin_setup_howto2.c │ │ │ │ ├── desktop_settings_scene_quick_apps_direction_menu.c │ │ │ │ ├── desktop_settings_scene_quick_apps_menu.c │ │ │ │ └── desktop_settings_scene_start.c │ │ │ └── views/ │ │ │ ├── desktop_settings_view_pin_setup_howto.c │ │ │ ├── desktop_settings_view_pin_setup_howto.h │ │ │ ├── desktop_settings_view_pin_setup_howto2.c │ │ │ └── desktop_settings_view_pin_setup_howto2.h │ │ ├── dolphin_passport/ │ │ │ ├── application.fam │ │ │ └── passport.c │ │ ├── expansion_settings_app/ │ │ │ ├── application.fam │ │ │ ├── expansion_settings_app.c │ │ │ └── expansion_settings_app.h │ │ ├── notification_settings/ │ │ │ ├── application.fam │ │ │ └── notification_settings_app.c │ │ ├── power_settings_app/ │ │ │ ├── application.fam │ │ │ ├── power_settings_app.c │ │ │ ├── power_settings_app.h │ │ │ ├── scenes/ │ │ │ │ ├── power_settings_scene.c │ │ │ │ ├── power_settings_scene.h │ │ │ │ ├── power_settings_scene_battery_info.c │ │ │ │ ├── power_settings_scene_config.h │ │ │ │ ├── power_settings_scene_power_off.c │ │ │ │ ├── power_settings_scene_reboot.c │ │ │ │ ├── power_settings_scene_reboot_confirm.c │ │ │ │ └── power_settings_scene_start.c │ │ │ └── views/ │ │ │ ├── battery_info.c │ │ │ └── battery_info.h │ │ ├── storage_settings/ │ │ │ ├── application.fam │ │ │ ├── scenes/ │ │ │ │ ├── storage_settings_scene.c │ │ │ │ ├── storage_settings_scene.h │ │ │ │ ├── storage_settings_scene_benchmark.c │ │ │ │ ├── storage_settings_scene_benchmark_confirm.c │ │ │ │ ├── storage_settings_scene_config.h │ │ │ │ ├── storage_settings_scene_factory_reset.c │ │ │ │ ├── storage_settings_scene_format_confirm.c │ │ │ │ ├── storage_settings_scene_formatting.c │ │ │ │ ├── storage_settings_scene_internal_info.c │ │ │ │ ├── storage_settings_scene_sd_info.c │ │ │ │ ├── storage_settings_scene_start.c │ │ │ │ ├── storage_settings_scene_unmount_confirm.c │ │ │ │ └── storage_settings_scene_unmounted.c │ │ │ ├── storage_settings.c │ │ │ └── storage_settings.h │ │ └── system/ │ │ ├── application.fam │ │ ├── system_settings.c │ │ └── system_settings.h │ └── system/ │ ├── application.fam │ ├── hid_app/ │ │ ├── application.fam │ │ ├── hid.c │ │ ├── hid.h │ │ ├── scenes/ │ │ │ ├── hid_scene.c │ │ │ ├── hid_scene.h │ │ │ ├── hid_scene_config.h │ │ │ ├── hid_scene_main.c │ │ │ ├── hid_scene_start.c │ │ │ └── hid_scene_unpair.c │ │ ├── transport_ble.c │ │ ├── transport_usb.c │ │ ├── views/ │ │ │ ├── hid_keyboard.c │ │ │ ├── hid_keyboard.h │ │ │ ├── hid_keynote.c │ │ │ ├── hid_keynote.h │ │ │ ├── hid_media.c │ │ │ ├── hid_media.h │ │ │ ├── hid_mouse.c │ │ │ ├── hid_mouse.h │ │ │ ├── hid_mouse_clicker.c │ │ │ ├── hid_mouse_clicker.h │ │ │ ├── hid_mouse_jiggler.c │ │ │ ├── hid_mouse_jiggler.h │ │ │ ├── hid_tiktok.c │ │ │ └── hid_tiktok.h │ │ └── views.h │ ├── js_app/ │ │ ├── application.fam │ │ ├── examples/ │ │ │ └── apps/ │ │ │ └── Scripts/ │ │ │ ├── array_buf_test.js │ │ │ ├── bad_uart.js │ │ │ ├── badusb_demo.js │ │ │ ├── console.js │ │ │ ├── delay.js │ │ │ ├── event_loop.js │ │ │ ├── gpio.js │ │ │ ├── gui.js │ │ │ ├── interactive.js │ │ │ ├── load.js │ │ │ ├── load_api.js │ │ │ ├── math.js │ │ │ ├── notify.js │ │ │ ├── path.js │ │ │ ├── storage.js │ │ │ ├── stringutils.js │ │ │ ├── uart_echo.js │ │ │ └── uart_echo_8e1.js │ │ ├── js_app.c │ │ ├── js_app_i.h │ │ ├── js_modules.c │ │ ├── js_modules.h │ │ ├── js_thread.c │ │ ├── js_thread.h │ │ ├── js_thread_i.h │ │ ├── js_value.c │ │ ├── js_value.h │ │ ├── modules/ │ │ │ ├── js_badusb.c │ │ │ ├── js_event_loop/ │ │ │ │ ├── js_event_loop.c │ │ │ │ ├── js_event_loop.h │ │ │ │ ├── js_event_loop_api_table.cpp │ │ │ │ └── js_event_loop_api_table_i.h │ │ │ ├── js_flipper.c │ │ │ ├── js_flipper.h │ │ │ ├── js_gpio.c │ │ │ ├── js_gui/ │ │ │ │ ├── button_menu.c │ │ │ │ ├── button_panel.c │ │ │ │ ├── byte_input.c │ │ │ │ ├── dialog.c │ │ │ │ ├── empty_screen.c │ │ │ │ ├── file_picker.c │ │ │ │ ├── icon.c │ │ │ │ ├── js_gui.c │ │ │ │ ├── js_gui.h │ │ │ │ ├── js_gui_api_table.cpp │ │ │ │ ├── js_gui_api_table_i.h │ │ │ │ ├── loading.c │ │ │ │ ├── menu.c │ │ │ │ ├── number_input.c │ │ │ │ ├── popup.c │ │ │ │ ├── submenu.c │ │ │ │ ├── text_box.c │ │ │ │ ├── text_input.c │ │ │ │ ├── vi_list.c │ │ │ │ └── widget.c │ │ │ ├── js_math.c │ │ │ ├── js_notification.c │ │ │ ├── js_serial.c │ │ │ ├── js_storage.c │ │ │ ├── js_tests.c │ │ │ └── js_tests.h │ │ ├── packages/ │ │ │ ├── create-fz-app/ │ │ │ │ ├── README.md │ │ │ │ ├── index.js │ │ │ │ ├── package.json │ │ │ │ └── template/ │ │ │ │ ├── .gitignore │ │ │ │ ├── fz-sdk.config.json5 │ │ │ │ ├── index.ts │ │ │ │ ├── package.json │ │ │ │ └── tsconfig.json │ │ │ └── fz-sdk/ │ │ │ ├── .gitignore │ │ │ ├── README.md │ │ │ ├── badusb/ │ │ │ │ └── index.d.ts │ │ │ ├── docs_readme.md │ │ │ ├── event_loop/ │ │ │ │ └── index.d.ts │ │ │ ├── flipper/ │ │ │ │ └── index.d.ts │ │ │ ├── global.d.ts │ │ │ ├── gpio/ │ │ │ │ └── index.d.ts │ │ │ ├── gui/ │ │ │ │ ├── button_menu.d.ts │ │ │ │ ├── button_panel.d.ts │ │ │ │ ├── byte_input.d.ts │ │ │ │ ├── dialog.d.ts │ │ │ │ ├── empty_screen.d.ts │ │ │ │ ├── file_picker.d.ts │ │ │ │ ├── icon.d.ts │ │ │ │ ├── index.d.ts │ │ │ │ ├── loading.d.ts │ │ │ │ ├── menu.d.ts │ │ │ │ ├── number_input.d.ts │ │ │ │ ├── popup.d.ts │ │ │ │ ├── submenu.d.ts │ │ │ │ ├── text_box.d.ts │ │ │ │ ├── text_input.d.ts │ │ │ │ ├── vi_list.d.ts │ │ │ │ └── widget.d.ts │ │ │ ├── math/ │ │ │ │ └── index.d.ts │ │ │ ├── notification/ │ │ │ │ └── index.d.ts │ │ │ ├── package.json │ │ │ ├── sdk.js │ │ │ ├── serial/ │ │ │ │ └── index.d.ts │ │ │ ├── storage/ │ │ │ │ └── index.d.ts │ │ │ ├── tests/ │ │ │ │ └── index.d.ts │ │ │ ├── tsconfig.json │ │ │ └── typedoc.json │ │ ├── plugin_api/ │ │ │ ├── app_api_interface.h │ │ │ ├── app_api_table.cpp │ │ │ └── app_api_table_i.h │ │ └── views/ │ │ ├── console_font.h │ │ ├── console_view.c │ │ └── console_view.h │ ├── snake_game/ │ │ ├── application.fam │ │ └── snake_game.c │ └── updater/ │ ├── application.fam │ ├── cli/ │ │ └── updater_cli.c │ ├── scenes/ │ │ ├── updater_scene.c │ │ ├── updater_scene.h │ │ ├── updater_scene_config.h │ │ ├── updater_scene_error.c │ │ ├── updater_scene_loadcfg.c │ │ └── updater_scene_main.c │ ├── updater.c │ ├── updater_i.h │ ├── util/ │ │ ├── update_task.c │ │ ├── update_task.h │ │ ├── update_task_i.h │ │ ├── update_task_worker_backup.c │ │ └── update_task_worker_flasher.c │ └── views/ │ ├── updater_main.c │ └── updater_main.h ├── assets/ │ ├── .gitignore │ ├── ReadMe.md │ ├── SConscript │ ├── dolphin/ │ │ ├── ReadMe.md │ │ ├── blocking/ │ │ │ ├── L0_NewMail_128x51/ │ │ │ │ └── meta.txt │ │ │ ├── L0_NoDb_128x51/ │ │ │ │ └── meta.txt │ │ │ ├── L0_SdBad_128x51/ │ │ │ │ └── meta.txt │ │ │ ├── L0_SdOk_128x51/ │ │ │ │ └── meta.txt │ │ │ ├── L0_Url_128x51/ │ │ │ │ └── meta.txt │ │ │ └── manifest.txt │ │ ├── external/ │ │ │ ├── L1_Akira_128x64/ │ │ │ │ └── meta.txt │ │ │ ├── L1_Boxing_128x64/ │ │ │ │ └── meta.txt │ │ │ ├── L1_Cry_128x64/ │ │ │ │ └── meta.txt │ │ │ ├── L1_Doom_128x64/ │ │ │ │ └── meta.txt │ │ │ ├── L1_Furippa1_128x64/ │ │ │ │ └── meta.txt │ │ │ ├── L1_Kaiju_128x64/ │ │ │ │ └── meta.txt │ │ │ ├── L1_Laptop_128x51/ │ │ │ │ └── meta.txt │ │ │ ├── L1_Leaving_sad_128x64/ │ │ │ │ └── meta.txt │ │ │ ├── L1_Mad_fist_128x64/ │ │ │ │ └── meta.txt │ │ │ ├── L1_Mods_128x64/ │ │ │ │ └── meta.txt │ │ │ ├── L1_My_dude_128x64/ │ │ │ │ └── meta.txt │ │ │ ├── L1_Painting_128x64/ │ │ │ │ └── meta.txt │ │ │ ├── L1_Procrastinating_128x64/ │ │ │ │ └── meta.txt │ │ │ ├── L1_Read_books_128x64/ │ │ │ │ └── meta.txt │ │ │ ├── L1_Recording_128x51/ │ │ │ │ └── meta.txt │ │ │ ├── L1_Sad_song_128x64/ │ │ │ │ └── meta.txt │ │ │ ├── L1_Senpai_128x64/ │ │ │ │ └── meta.txt │ │ │ ├── L1_Showtime_128x64/ │ │ │ │ └── meta.txt │ │ │ ├── L1_Sleep_128x64/ │ │ │ │ └── meta.txt │ │ │ ├── L1_Waves_128x50/ │ │ │ │ └── meta.txt │ │ │ ├── L2_Coding_in_the_shell_128x64/ │ │ │ │ └── meta.txt │ │ │ ├── L2_Dj_128x64/ │ │ │ │ └── meta.txt │ │ │ ├── L2_Furippa2_128x64/ │ │ │ │ └── meta.txt │ │ │ ├── L2_Hacking_pc_128x64/ │ │ │ │ └── meta.txt │ │ │ ├── L2_Secret_door_128x64/ │ │ │ │ └── meta.txt │ │ │ ├── L2_Soldering_128x64/ │ │ │ │ └── meta.txt │ │ │ ├── L2_Wake_up_128x64/ │ │ │ │ └── meta.txt │ │ │ ├── L3_Freedom_2_dolphins_128x64/ │ │ │ │ └── meta.txt │ │ │ ├── L3_Furippa3_128x64/ │ │ │ │ └── meta.txt │ │ │ ├── L3_Hijack_radio_128x64/ │ │ │ │ └── meta.txt │ │ │ ├── L3_Intruder_alert_128x64/ │ │ │ │ └── meta.txt │ │ │ ├── L3_Lab_research_128x54/ │ │ │ │ └── meta.txt │ │ │ └── manifest.txt │ │ └── internal/ │ │ ├── L1_BadBattery_128x47/ │ │ │ └── meta.txt │ │ ├── L1_NoSd_128x49/ │ │ │ └── meta.txt │ │ ├── L1_Tv_128x47/ │ │ │ └── meta.txt │ │ └── manifest.txt │ └── icons/ │ ├── Animations/ │ │ ├── Levelup1_128x64/ │ │ │ └── frame_rate │ │ └── Levelup2_128x64/ │ │ └── frame_rate │ ├── Common/ │ │ ├── Loading_24/ │ │ │ └── frame_rate │ │ └── Round_loader_8x8/ │ │ └── frame_rate │ ├── MainMenu/ │ │ ├── 125khz_14/ │ │ │ └── frame_rate │ │ ├── BadUsb_14/ │ │ │ └── frame_rate │ │ ├── Debug_14/ │ │ │ └── frame_rate │ │ ├── FileManager_14/ │ │ │ └── frame_rate │ │ ├── GPIO_14/ │ │ │ └── frame_rate │ │ ├── Infrared_14/ │ │ │ └── frame_rate │ │ ├── NFC_14/ │ │ │ └── frame_rate │ │ ├── Plugins_14/ │ │ │ └── frame_rate │ │ ├── Settings_14/ │ │ │ └── frame_rate │ │ ├── Sub1ghz_14/ │ │ │ └── frame_rate │ │ ├── U2F_14/ │ │ │ └── frame_rate │ │ └── iButton_14/ │ │ └── frame_rate │ ├── Settings/ │ │ └── Alarm_47x39/ │ │ └── frame_rate │ └── SubGhz/ │ ├── SubGhz_External_ant/ │ │ └── frame_rate │ └── SubGhz_Internal_ant/ │ └── frame_rate ├── documentation/ │ ├── .gitignore │ ├── AppManifests.md │ ├── AppsOnSDCard.md │ ├── ExpansionModules.md │ ├── FuriCheck.md │ ├── FuriHalBus.md │ ├── FuriHalDebugging.md │ ├── HardwareTargets.md │ ├── KeyCombo.md │ ├── LFRFIDRaw.md │ ├── OTA.md │ ├── UnitTests.md │ ├── UniversalRemotes.md │ ├── devboard/ │ │ ├── Debugging via the Devboard.md │ │ ├── Devboard debug modes.md │ │ ├── Firmware update on Developer Board.md │ │ ├── Get started with the Dev Board.md │ │ ├── Reading logs via the Dev Board.md │ │ ├── USB connection to the Devboard.md │ │ └── Wi-Fi connection to the Devboard.md │ ├── doxygen/ │ │ ├── Doxyfile-awesome.cfg │ │ ├── Doxyfile.cfg │ │ ├── app_publishing.dox │ │ ├── applications.dox │ │ ├── dev_board.dox │ │ ├── dev_tools.dox │ │ ├── examples.dox │ │ ├── expansion_modules.dox │ │ ├── file_formats.dox │ │ ├── header.html │ │ ├── index.dox │ │ ├── js.dox │ │ ├── misc.dox │ │ └── system.dox │ ├── fbt.md │ ├── file_formats/ │ │ ├── BadUsbScriptFormat.md │ │ ├── InfraredFileFormats.md │ │ ├── LfRfidFileFormat.md │ │ ├── NfcFileFormats.md │ │ ├── SubGhzFileFormats.md │ │ ├── TarHeatshrinkFormat.md │ │ └── iButtonFileFormat.md │ └── js/ │ ├── js_about.md │ ├── js_badusb.md │ ├── js_builtin.md │ ├── js_data_types.md │ ├── js_developing_apps_using_js_sdk.md │ ├── js_event_loop.md │ ├── js_flipper.md │ ├── js_gpio.md │ ├── js_gui.md │ ├── js_gui__byte_input.md │ ├── js_gui__dialog.md │ ├── js_gui__empty_screen.md │ ├── js_gui__file_picker.md │ ├── js_gui__icon.md │ ├── js_gui__loading.md │ ├── js_gui__submenu.md │ ├── js_gui__text_box.md │ ├── js_gui__text_input.md │ ├── js_gui__widget.md │ ├── js_math.md │ ├── js_notification.md │ ├── js_serial.md │ ├── js_storage.md │ ├── js_using_js_modules.md │ └── js_your_first_js_app.md ├── fbt ├── fbt.cmd ├── fbt_options.py ├── firmware.scons ├── furi/ │ ├── SConscript │ ├── core/ │ │ ├── base.h │ │ ├── check.c │ │ ├── check.h │ │ ├── common_defines.h │ │ ├── core_defines.h │ │ ├── critical.c │ │ ├── dangerous_defines.h │ │ ├── event_flag.c │ │ ├── event_flag.h │ │ ├── event_loop.c │ │ ├── event_loop.h │ │ ├── event_loop_i.h │ │ ├── event_loop_link_i.h │ │ ├── event_loop_thread_flag_interface.h │ │ ├── event_loop_tick.c │ │ ├── event_loop_tick_i.h │ │ ├── event_loop_timer.c │ │ ├── event_loop_timer.h │ │ ├── event_loop_timer_i.h │ │ ├── kernel.c │ │ ├── kernel.h │ │ ├── log.c │ │ ├── log.h │ │ ├── memmgr.c │ │ ├── memmgr.h │ │ ├── memmgr_heap.c │ │ ├── memmgr_heap.h │ │ ├── message_queue.c │ │ ├── message_queue.h │ │ ├── mutex.c │ │ ├── mutex.h │ │ ├── pubsub.c │ │ ├── pubsub.h │ │ ├── record.c │ │ ├── record.h │ │ ├── semaphore.c │ │ ├── semaphore.h │ │ ├── stream_buffer.c │ │ ├── stream_buffer.h │ │ ├── string.c │ │ ├── string.h │ │ ├── thread.c │ │ ├── thread.h │ │ ├── thread_i.h │ │ ├── thread_list.c │ │ ├── thread_list.h │ │ ├── thread_list_i.h │ │ ├── timer.c │ │ └── timer.h │ ├── flipper.c │ ├── flipper.h │ ├── furi.c │ └── furi.h ├── lib/ │ ├── FreeRTOS-glue/ │ │ └── task_control_block.h │ ├── ReadMe.md │ ├── SConscript │ ├── bit_lib/ │ │ ├── SConscript │ │ ├── bit_lib.c │ │ └── bit_lib.h │ ├── ble_profile/ │ │ ├── SConscript │ │ ├── extra_profiles/ │ │ │ ├── hid_profile.c │ │ │ └── hid_profile.h │ │ └── extra_services/ │ │ ├── hid_service.c │ │ └── hid_service.h │ ├── cmsis_core/ │ │ ├── cmsis_armcc.h │ │ ├── cmsis_armclang.h │ │ ├── cmsis_armclang_ltm.h │ │ ├── cmsis_compiler.h │ │ ├── cmsis_gcc.h │ │ ├── cmsis_iccarm.h │ │ ├── cmsis_tiarmclang.h │ │ ├── cmsis_version.h │ │ ├── core_cm4.h │ │ └── mpu_armv7.h │ ├── datetime/ │ │ ├── SConscript │ │ ├── datetime.c │ │ └── datetime.h │ ├── digital_signal/ │ │ ├── SConscript │ │ ├── digital_sequence.c │ │ ├── digital_sequence.h │ │ ├── digital_signal.c │ │ ├── digital_signal.h │ │ ├── digital_signal_i.h │ │ └── presets/ │ │ └── nfc/ │ │ ├── iso14443_3a_signal.c │ │ ├── iso14443_3a_signal.h │ │ ├── iso15693_signal.c │ │ └── iso15693_signal.h │ ├── drivers/ │ │ ├── SConscript │ │ ├── bq25896.c │ │ ├── bq25896.h │ │ ├── bq25896_reg.h │ │ ├── bq27220.c │ │ ├── bq27220.h │ │ ├── bq27220_data_memory.h │ │ ├── bq27220_reg.h │ │ ├── cc1101.c │ │ ├── cc1101.h │ │ ├── cc1101_regs.h │ │ ├── lp5562.c │ │ ├── lp5562.h │ │ ├── lp5562_reg.h │ │ ├── st25r3916.c │ │ ├── st25r3916.h │ │ ├── st25r3916_reg.c │ │ └── st25r3916_reg.h │ ├── err.h │ ├── fatfs/ │ │ ├── SConscript │ │ ├── diskio.c │ │ ├── diskio.h │ │ ├── ff.c │ │ ├── ff.h │ │ ├── ff_gen_drv.c │ │ ├── ff_gen_drv.h │ │ ├── ffconf_template.h │ │ ├── integer.h │ │ └── option/ │ │ ├── cc932.c │ │ ├── cc936.c │ │ ├── cc949.c │ │ ├── cc950.c │ │ ├── ccsbcs.c │ │ └── unicode.c │ ├── flipper_application/ │ │ ├── SConscript │ │ ├── api_hashtable/ │ │ │ ├── api_hashtable.cpp │ │ │ ├── api_hashtable.h │ │ │ └── compilesort.hpp │ │ ├── application_assets.c │ │ ├── application_assets.h │ │ ├── application_manifest.c │ │ ├── application_manifest.h │ │ ├── elf/ │ │ │ ├── elf.h │ │ │ ├── elf_api_interface.h │ │ │ ├── elf_file.c │ │ │ ├── elf_file.h │ │ │ └── elf_file_i.h │ │ ├── flipper_application.c │ │ ├── flipper_application.h │ │ └── plugins/ │ │ ├── composite_resolver.c │ │ ├── composite_resolver.h │ │ ├── plugin_manager.c │ │ └── plugin_manager.h │ ├── flipper_format/ │ │ ├── SConscript │ │ ├── flipper_format.c │ │ ├── flipper_format.h │ │ ├── flipper_format_i.h │ │ ├── flipper_format_stream.c │ │ ├── flipper_format_stream.h │ │ └── flipper_format_stream_i.h │ ├── freertos.scons │ ├── heatshrink.scons │ ├── ibutton/ │ │ ├── SConscript │ │ ├── ibutton_key.c │ │ ├── ibutton_key.h │ │ ├── ibutton_key_i.h │ │ ├── ibutton_protocols.c │ │ ├── ibutton_protocols.h │ │ ├── ibutton_worker.c │ │ ├── ibutton_worker.h │ │ ├── ibutton_worker_i.h │ │ ├── ibutton_worker_modes.c │ │ └── protocols/ │ │ ├── blanks/ │ │ │ ├── rw1990.c │ │ │ ├── rw1990.h │ │ │ ├── tm01x.c │ │ │ ├── tm01x.h │ │ │ ├── tm2004.c │ │ │ └── tm2004.h │ │ ├── dallas/ │ │ │ ├── dallas_common.c │ │ │ ├── dallas_common.h │ │ │ ├── protocol_dallas_base.h │ │ │ ├── protocol_ds1971.c │ │ │ ├── protocol_ds1971.h │ │ │ ├── protocol_ds1990.c │ │ │ ├── protocol_ds1990.h │ │ │ ├── protocol_ds1992.c │ │ │ ├── protocol_ds1992.h │ │ │ ├── protocol_ds1996.c │ │ │ ├── protocol_ds1996.h │ │ │ ├── protocol_ds_generic.c │ │ │ ├── protocol_ds_generic.h │ │ │ ├── protocol_group_dallas.c │ │ │ ├── protocol_group_dallas.h │ │ │ ├── protocol_group_dallas_defs.c │ │ │ └── protocol_group_dallas_defs.h │ │ ├── misc/ │ │ │ ├── protocol_cyfral.c │ │ │ ├── protocol_cyfral.h │ │ │ ├── protocol_group_misc.c │ │ │ ├── protocol_group_misc.h │ │ │ ├── protocol_group_misc_defs.c │ │ │ ├── protocol_group_misc_defs.h │ │ │ ├── protocol_metakom.c │ │ │ └── protocol_metakom.h │ │ ├── protocol_common.h │ │ ├── protocol_common_i.h │ │ ├── protocol_group_base.h │ │ ├── protocol_group_defs.c │ │ └── protocol_group_defs.h │ ├── ieee754_parse_wrap/ │ │ ├── SConscript │ │ ├── wrappers.c │ │ └── wrappers.h │ ├── infrared/ │ │ ├── SConscript │ │ ├── encoder_decoder/ │ │ │ ├── common/ │ │ │ │ ├── infrared_common_decoder.c │ │ │ │ ├── infrared_common_encoder.c │ │ │ │ └── infrared_common_i.h │ │ │ ├── infrared.c │ │ │ ├── infrared.h │ │ │ ├── infrared_i.h │ │ │ ├── kaseikyo/ │ │ │ │ ├── infrared_decoder_kaseikyo.c │ │ │ │ ├── infrared_encoder_kaseikyo.c │ │ │ │ ├── infrared_protocol_kaseikyo.c │ │ │ │ ├── infrared_protocol_kaseikyo.h │ │ │ │ └── infrared_protocol_kaseikyo_i.h │ │ │ ├── nec/ │ │ │ │ ├── infrared_decoder_nec.c │ │ │ │ ├── infrared_encoder_nec.c │ │ │ │ ├── infrared_protocol_nec.c │ │ │ │ ├── infrared_protocol_nec.h │ │ │ │ └── infrared_protocol_nec_i.h │ │ │ ├── pioneer/ │ │ │ │ ├── infrared_decoder_pioneer.c │ │ │ │ ├── infrared_encoder_pioneer.c │ │ │ │ ├── infrared_protocol_pioneer.c │ │ │ │ ├── infrared_protocol_pioneer.h │ │ │ │ └── infrared_protocol_pioneer_i.h │ │ │ ├── rc5/ │ │ │ │ ├── infrared_decoder_rc5.c │ │ │ │ ├── infrared_encoder_rc5.c │ │ │ │ ├── infrared_protocol_rc5.c │ │ │ │ ├── infrared_protocol_rc5.h │ │ │ │ └── infrared_protocol_rc5_i.h │ │ │ ├── rc6/ │ │ │ │ ├── infrared_decoder_rc6.c │ │ │ │ ├── infrared_encoder_rc6.c │ │ │ │ ├── infrared_protocol_rc6.c │ │ │ │ ├── infrared_protocol_rc6.h │ │ │ │ └── infrared_protocol_rc6_i.h │ │ │ ├── rca/ │ │ │ │ ├── infrared_decoder_rca.c │ │ │ │ ├── infrared_encoder_rca.c │ │ │ │ ├── infrared_protocol_rca.c │ │ │ │ ├── infrared_protocol_rca.h │ │ │ │ └── infrared_protocol_rca_i.h │ │ │ ├── samsung/ │ │ │ │ ├── infrared_decoder_samsung.c │ │ │ │ ├── infrared_encoder_samsung.c │ │ │ │ ├── infrared_protocol_samsung.c │ │ │ │ ├── infrared_protocol_samsung.h │ │ │ │ └── infrared_protocol_samsung_i.h │ │ │ └── sirc/ │ │ │ ├── infrared_decoder_sirc.c │ │ │ ├── infrared_encoder_sirc.c │ │ │ ├── infrared_protocol_sirc.c │ │ │ ├── infrared_protocol_sirc.h │ │ │ └── infrared_protocol_sirc_i.h │ │ ├── signal/ │ │ │ ├── infrared_brute_force.c │ │ │ ├── infrared_brute_force.h │ │ │ ├── infrared_error_code.h │ │ │ ├── infrared_signal.c │ │ │ └── infrared_signal.h │ │ └── worker/ │ │ ├── infrared_transmit.c │ │ ├── infrared_transmit.h │ │ ├── infrared_worker.c │ │ └── infrared_worker.h │ ├── lfrfid/ │ │ ├── SConscript │ │ ├── lfrfid_dict_file.c │ │ ├── lfrfid_dict_file.h │ │ ├── lfrfid_raw_file.c │ │ ├── lfrfid_raw_file.h │ │ ├── lfrfid_raw_worker.c │ │ ├── lfrfid_raw_worker.h │ │ ├── lfrfid_worker.c │ │ ├── lfrfid_worker.h │ │ ├── lfrfid_worker_i.h │ │ ├── lfrfid_worker_modes.c │ │ ├── protocols/ │ │ │ ├── lfrfid_protocols.c │ │ │ ├── lfrfid_protocols.h │ │ │ ├── protocol_awid.c │ │ │ ├── protocol_awid.h │ │ │ ├── protocol_electra.c │ │ │ ├── protocol_electra.h │ │ │ ├── protocol_em4100.c │ │ │ ├── protocol_em4100.h │ │ │ ├── protocol_fdx_a.c │ │ │ ├── protocol_fdx_a.h │ │ │ ├── protocol_fdx_b.c │ │ │ ├── protocol_fdx_b.h │ │ │ ├── protocol_gallagher.c │ │ │ ├── protocol_gallagher.h │ │ │ ├── protocol_gproxii.c │ │ │ ├── protocol_gproxii.h │ │ │ ├── protocol_h10301.c │ │ │ ├── protocol_h10301.h │ │ │ ├── protocol_hid_ex_generic.c │ │ │ ├── protocol_hid_ex_generic.h │ │ │ ├── protocol_hid_generic.c │ │ │ ├── protocol_hid_generic.h │ │ │ ├── protocol_idteck.c │ │ │ ├── protocol_idteck.h │ │ │ ├── protocol_indala26.c │ │ │ ├── protocol_indala26.h │ │ │ ├── protocol_io_prox_xsf.c │ │ │ ├── protocol_io_prox_xsf.h │ │ │ ├── protocol_jablotron.c │ │ │ ├── protocol_jablotron.h │ │ │ ├── protocol_keri.c │ │ │ ├── protocol_keri.h │ │ │ ├── protocol_nexwatch.c │ │ │ ├── protocol_nexwatch.h │ │ │ ├── protocol_noralsy.c │ │ │ ├── protocol_noralsy.h │ │ │ ├── protocol_pac_stanley.c │ │ │ ├── protocol_pac_stanley.h │ │ │ ├── protocol_paradox.c │ │ │ ├── protocol_paradox.h │ │ │ ├── protocol_pyramid.c │ │ │ ├── protocol_pyramid.h │ │ │ ├── protocol_securakey.c │ │ │ ├── protocol_securakey.h │ │ │ ├── protocol_viking.c │ │ │ └── protocol_viking.h │ │ └── tools/ │ │ ├── em4305.c │ │ ├── em4305.h │ │ ├── fsk_demod.c │ │ ├── fsk_demod.h │ │ ├── fsk_ocs.c │ │ ├── fsk_osc.h │ │ ├── iso_3166.c │ │ ├── iso_3166.h │ │ ├── t5577.c │ │ ├── t5577.h │ │ ├── varint_pair.c │ │ └── varint_pair.h │ ├── libusb_stm32.scons │ ├── mbedtls.scons │ ├── mbedtls_cfg.h │ ├── microtar.scons │ ├── mjs/ │ │ ├── SConscript │ │ ├── common/ │ │ │ ├── cs_dbg.c │ │ │ ├── cs_dbg.h │ │ │ ├── cs_dirent.c │ │ │ ├── cs_dirent.h │ │ │ ├── cs_file.c │ │ │ ├── cs_file.h │ │ │ ├── cs_time.c │ │ │ ├── cs_time.h │ │ │ ├── cs_varint.c │ │ │ ├── cs_varint.h │ │ │ ├── frozen/ │ │ │ │ ├── frozen.c │ │ │ │ └── frozen.h │ │ │ ├── mbuf.c │ │ │ ├── mbuf.h │ │ │ ├── mg_mem.h │ │ │ ├── mg_str.c │ │ │ ├── mg_str.h │ │ │ ├── platform.h │ │ │ ├── platforms/ │ │ │ │ ├── platform_flipper.c │ │ │ │ └── platform_flipper.h │ │ │ ├── str_util.c │ │ │ └── str_util.h │ │ ├── ffi/ │ │ │ ├── ffi.c │ │ │ └── ffi.h │ │ ├── mjs_array.c │ │ ├── mjs_array.h │ │ ├── mjs_array_buf.c │ │ ├── mjs_array_buf.h │ │ ├── mjs_array_buf_public.h │ │ ├── mjs_array_public.h │ │ ├── mjs_bcode.c │ │ ├── mjs_bcode.h │ │ ├── mjs_builtin.c │ │ ├── mjs_builtin.h │ │ ├── mjs_core.c │ │ ├── mjs_core.h │ │ ├── mjs_core_public.h │ │ ├── mjs_dataview.c │ │ ├── mjs_dataview.h │ │ ├── mjs_exec.c │ │ ├── mjs_exec.h │ │ ├── mjs_exec_public.h │ │ ├── mjs_features.h │ │ ├── mjs_ffi.c │ │ ├── mjs_ffi.h │ │ ├── mjs_ffi_public.h │ │ ├── mjs_gc.c │ │ ├── mjs_gc.h │ │ ├── mjs_gc_public.h │ │ ├── mjs_internal.h │ │ ├── mjs_json.c │ │ ├── mjs_json.h │ │ ├── mjs_license.h │ │ ├── mjs_mm.h │ │ ├── mjs_object.c │ │ ├── mjs_object.h │ │ ├── mjs_object_public.h │ │ ├── mjs_parser.c │ │ ├── mjs_parser.h │ │ ├── mjs_primitive.c │ │ ├── mjs_primitive.h │ │ ├── mjs_primitive_public.h │ │ ├── mjs_string.c │ │ ├── mjs_string.h │ │ ├── mjs_string_public.h │ │ ├── mjs_tok.c │ │ ├── mjs_tok.h │ │ ├── mjs_util.c │ │ ├── mjs_util.h │ │ └── mjs_util_public.h │ ├── mlib.scons │ ├── music_worker/ │ │ ├── SConscript │ │ ├── music_worker.c │ │ └── music_worker.h │ ├── nanopb.scons │ ├── nfc/ │ │ ├── SConscript │ │ ├── helpers/ │ │ │ ├── crypto1.c │ │ │ ├── crypto1.h │ │ │ ├── felica_crc.c │ │ │ ├── felica_crc.h │ │ │ ├── iso13239_crc.c │ │ │ ├── iso13239_crc.h │ │ │ ├── iso14443_4_layer.c │ │ │ ├── iso14443_4_layer.h │ │ │ ├── iso14443_crc.c │ │ │ ├── iso14443_crc.h │ │ │ ├── nfc_data_generator.c │ │ │ ├── nfc_data_generator.h │ │ │ ├── nfc_util.c │ │ │ └── nfc_util.h │ │ ├── nfc.c │ │ ├── nfc.h │ │ ├── nfc_common.h │ │ ├── nfc_device.c │ │ ├── nfc_device.h │ │ ├── nfc_device_i.c │ │ ├── nfc_device_i.h │ │ ├── nfc_listener.c │ │ ├── nfc_listener.h │ │ ├── nfc_mock.c │ │ ├── nfc_poller.c │ │ ├── nfc_poller.h │ │ ├── nfc_scanner.c │ │ ├── nfc_scanner.h │ │ └── protocols/ │ │ ├── felica/ │ │ │ ├── felica.c │ │ │ ├── felica.h │ │ │ ├── felica_i.c │ │ │ ├── felica_i.h │ │ │ ├── felica_listener.c │ │ │ ├── felica_listener.h │ │ │ ├── felica_listener_defs.h │ │ │ ├── felica_listener_i.c │ │ │ ├── felica_listener_i.h │ │ │ ├── felica_poller.c │ │ │ ├── felica_poller.h │ │ │ ├── felica_poller_defs.h │ │ │ ├── felica_poller_i.c │ │ │ ├── felica_poller_i.h │ │ │ ├── felica_poller_sync.c │ │ │ └── felica_poller_sync.h │ │ ├── iso14443_3a/ │ │ │ ├── iso14443_3a.c │ │ │ ├── iso14443_3a.h │ │ │ ├── iso14443_3a_device_defs.h │ │ │ ├── iso14443_3a_listener.c │ │ │ ├── iso14443_3a_listener.h │ │ │ ├── iso14443_3a_listener_defs.h │ │ │ ├── iso14443_3a_listener_i.c │ │ │ ├── iso14443_3a_listener_i.h │ │ │ ├── iso14443_3a_poller.c │ │ │ ├── iso14443_3a_poller.h │ │ │ ├── iso14443_3a_poller_defs.h │ │ │ ├── iso14443_3a_poller_i.c │ │ │ ├── iso14443_3a_poller_i.h │ │ │ ├── iso14443_3a_poller_sync.c │ │ │ └── iso14443_3a_poller_sync.h │ │ ├── iso14443_3b/ │ │ │ ├── iso14443_3b.c │ │ │ ├── iso14443_3b.h │ │ │ ├── iso14443_3b_device_defs.h │ │ │ ├── iso14443_3b_i.h │ │ │ ├── iso14443_3b_poller.c │ │ │ ├── iso14443_3b_poller.h │ │ │ ├── iso14443_3b_poller_defs.h │ │ │ ├── iso14443_3b_poller_i.c │ │ │ └── iso14443_3b_poller_i.h │ │ ├── iso14443_4a/ │ │ │ ├── iso14443_4a.c │ │ │ ├── iso14443_4a.h │ │ │ ├── iso14443_4a_device_defs.h │ │ │ ├── iso14443_4a_i.c │ │ │ ├── iso14443_4a_i.h │ │ │ ├── iso14443_4a_listener.c │ │ │ ├── iso14443_4a_listener.h │ │ │ ├── iso14443_4a_listener_defs.h │ │ │ ├── iso14443_4a_listener_i.c │ │ │ ├── iso14443_4a_listener_i.h │ │ │ ├── iso14443_4a_poller.c │ │ │ ├── iso14443_4a_poller.h │ │ │ ├── iso14443_4a_poller_defs.h │ │ │ ├── iso14443_4a_poller_i.c │ │ │ └── iso14443_4a_poller_i.h │ │ ├── iso14443_4b/ │ │ │ ├── iso14443_4b.c │ │ │ ├── iso14443_4b.h │ │ │ ├── iso14443_4b_device_defs.h │ │ │ ├── iso14443_4b_i.c │ │ │ ├── iso14443_4b_i.h │ │ │ ├── iso14443_4b_poller.c │ │ │ ├── iso14443_4b_poller.h │ │ │ ├── iso14443_4b_poller_defs.h │ │ │ ├── iso14443_4b_poller_i.c │ │ │ └── iso14443_4b_poller_i.h │ │ ├── iso15693_3/ │ │ │ ├── iso15693_3.c │ │ │ ├── iso15693_3.h │ │ │ ├── iso15693_3_device_defs.h │ │ │ ├── iso15693_3_i.c │ │ │ ├── iso15693_3_i.h │ │ │ ├── iso15693_3_listener.c │ │ │ ├── iso15693_3_listener.h │ │ │ ├── iso15693_3_listener_defs.h │ │ │ ├── iso15693_3_listener_i.c │ │ │ ├── iso15693_3_listener_i.h │ │ │ ├── iso15693_3_poller.c │ │ │ ├── iso15693_3_poller.h │ │ │ ├── iso15693_3_poller_defs.h │ │ │ ├── iso15693_3_poller_i.c │ │ │ └── iso15693_3_poller_i.h │ │ ├── mf_classic/ │ │ │ ├── mf_classic.c │ │ │ ├── mf_classic.h │ │ │ ├── mf_classic_listener.c │ │ │ ├── mf_classic_listener.h │ │ │ ├── mf_classic_listener_defs.h │ │ │ ├── mf_classic_listener_i.h │ │ │ ├── mf_classic_poller.c │ │ │ ├── mf_classic_poller.h │ │ │ ├── mf_classic_poller_defs.h │ │ │ ├── mf_classic_poller_i.c │ │ │ ├── mf_classic_poller_i.h │ │ │ ├── mf_classic_poller_sync.c │ │ │ └── mf_classic_poller_sync.h │ │ ├── mf_desfire/ │ │ │ ├── mf_desfire.c │ │ │ ├── mf_desfire.h │ │ │ ├── mf_desfire_i.c │ │ │ ├── mf_desfire_i.h │ │ │ ├── mf_desfire_poller.c │ │ │ ├── mf_desfire_poller.h │ │ │ ├── mf_desfire_poller_defs.h │ │ │ ├── mf_desfire_poller_i.c │ │ │ └── mf_desfire_poller_i.h │ │ ├── mf_plus/ │ │ │ ├── mf_plus.c │ │ │ ├── mf_plus.h │ │ │ ├── mf_plus_i.c │ │ │ ├── mf_plus_i.h │ │ │ ├── mf_plus_poller.c │ │ │ ├── mf_plus_poller.h │ │ │ ├── mf_plus_poller_defs.h │ │ │ ├── mf_plus_poller_i.c │ │ │ └── mf_plus_poller_i.h │ │ ├── mf_ultralight/ │ │ │ ├── mf_ultralight.c │ │ │ ├── mf_ultralight.h │ │ │ ├── mf_ultralight_listener.c │ │ │ ├── mf_ultralight_listener.h │ │ │ ├── mf_ultralight_listener_defs.h │ │ │ ├── mf_ultralight_listener_i.c │ │ │ ├── mf_ultralight_listener_i.h │ │ │ ├── mf_ultralight_poller.c │ │ │ ├── mf_ultralight_poller.h │ │ │ ├── mf_ultralight_poller_defs.h │ │ │ ├── mf_ultralight_poller_i.c │ │ │ ├── mf_ultralight_poller_i.h │ │ │ ├── mf_ultralight_poller_sync.c │ │ │ └── mf_ultralight_poller_sync.h │ │ ├── nfc_device_base.h │ │ ├── nfc_device_base_i.h │ │ ├── nfc_device_defs.c │ │ ├── nfc_device_defs.h │ │ ├── nfc_generic_event.h │ │ ├── nfc_listener_base.h │ │ ├── nfc_listener_defs.c │ │ ├── nfc_listener_defs.h │ │ ├── nfc_poller_base.h │ │ ├── nfc_poller_defs.c │ │ ├── nfc_poller_defs.h │ │ ├── nfc_protocol.c │ │ ├── nfc_protocol.h │ │ ├── slix/ │ │ │ ├── slix.c │ │ │ ├── slix.h │ │ │ ├── slix_device_defs.h │ │ │ ├── slix_i.c │ │ │ ├── slix_i.h │ │ │ ├── slix_listener.c │ │ │ ├── slix_listener.h │ │ │ ├── slix_listener_defs.h │ │ │ ├── slix_listener_i.c │ │ │ ├── slix_listener_i.h │ │ │ ├── slix_poller.c │ │ │ ├── slix_poller.h │ │ │ ├── slix_poller_defs.h │ │ │ ├── slix_poller_i.c │ │ │ └── slix_poller_i.h │ │ └── st25tb/ │ │ ├── st25tb.c │ │ ├── st25tb.h │ │ ├── st25tb_poller.c │ │ ├── st25tb_poller.h │ │ ├── st25tb_poller_defs.h │ │ ├── st25tb_poller_i.c │ │ ├── st25tb_poller_i.h │ │ ├── st25tb_poller_sync.c │ │ └── st25tb_poller_sync.h │ ├── one_wire/ │ │ ├── SConscript │ │ ├── maxim_crc.c │ │ ├── maxim_crc.h │ │ ├── one_wire_host.c │ │ ├── one_wire_host.h │ │ ├── one_wire_slave.c │ │ └── one_wire_slave.h │ ├── print/ │ │ ├── SConscript │ │ ├── printf_tiny.c │ │ ├── printf_tiny.h │ │ ├── wrappers.c │ │ └── wrappers.h │ ├── pulse_reader/ │ │ ├── SConscript │ │ ├── pulse_reader.c │ │ └── pulse_reader.h │ ├── signal_reader/ │ │ ├── SConscript │ │ ├── parsers/ │ │ │ └── iso15693/ │ │ │ ├── iso15693_parser.c │ │ │ └── iso15693_parser.h │ │ ├── signal_reader.c │ │ └── signal_reader.h │ ├── stm32wb.scons │ ├── subghz/ │ │ ├── SConscript │ │ ├── blocks/ │ │ │ ├── const.h │ │ │ ├── decoder.c │ │ │ ├── decoder.h │ │ │ ├── encoder.c │ │ │ ├── encoder.h │ │ │ ├── generic.c │ │ │ ├── generic.h │ │ │ ├── math.c │ │ │ └── math.h │ │ ├── devices/ │ │ │ ├── cc1101_configs.c │ │ │ ├── cc1101_configs.h │ │ │ ├── cc1101_int/ │ │ │ │ ├── cc1101_int_interconnect.c │ │ │ │ └── cc1101_int_interconnect.h │ │ │ ├── device_registry.h │ │ │ ├── devices.c │ │ │ ├── devices.h │ │ │ ├── preset.h │ │ │ ├── registry.c │ │ │ ├── registry.h │ │ │ └── types.h │ │ ├── environment.c │ │ ├── environment.h │ │ ├── protocols/ │ │ │ ├── alutech_at_4n.c │ │ │ ├── alutech_at_4n.h │ │ │ ├── ansonic.c │ │ │ ├── ansonic.h │ │ │ ├── base.c │ │ │ ├── base.h │ │ │ ├── bett.c │ │ │ ├── bett.h │ │ │ ├── bin_raw.c │ │ │ ├── bin_raw.h │ │ │ ├── came.c │ │ │ ├── came.h │ │ │ ├── came_atomo.c │ │ │ ├── came_atomo.h │ │ │ ├── came_twee.c │ │ │ ├── came_twee.h │ │ │ ├── chamberlain_code.c │ │ │ ├── chamberlain_code.h │ │ │ ├── clemsa.c │ │ │ ├── clemsa.h │ │ │ ├── dickert_mahs.c │ │ │ ├── dickert_mahs.h │ │ │ ├── doitrand.c │ │ │ ├── doitrand.h │ │ │ ├── dooya.c │ │ │ ├── dooya.h │ │ │ ├── faac_slh.c │ │ │ ├── faac_slh.h │ │ │ ├── feron.c │ │ │ ├── feron.h │ │ │ ├── gangqi.c │ │ │ ├── gangqi.h │ │ │ ├── gate_tx.c │ │ │ ├── gate_tx.h │ │ │ ├── hay21.c │ │ │ ├── hay21.h │ │ │ ├── hollarm.c │ │ │ ├── hollarm.h │ │ │ ├── holtek.c │ │ │ ├── holtek.h │ │ │ ├── holtek_ht12x.c │ │ │ ├── holtek_ht12x.h │ │ │ ├── honeywell_wdb.c │ │ │ ├── honeywell_wdb.h │ │ │ ├── hormann.c │ │ │ ├── hormann.h │ │ │ ├── ido.c │ │ │ ├── ido.h │ │ │ ├── intertechno_v3.c │ │ │ ├── intertechno_v3.h │ │ │ ├── keeloq.c │ │ │ ├── keeloq.h │ │ │ ├── keeloq_common.c │ │ │ ├── keeloq_common.h │ │ │ ├── kia.c │ │ │ ├── kia.h │ │ │ ├── kinggates_stylo_4k.c │ │ │ ├── kinggates_stylo_4k.h │ │ │ ├── legrand.c │ │ │ ├── legrand.h │ │ │ ├── linear.c │ │ │ ├── linear.h │ │ │ ├── linear_delta3.c │ │ │ ├── linear_delta3.h │ │ │ ├── magellan.c │ │ │ ├── magellan.h │ │ │ ├── marantec.c │ │ │ ├── marantec.h │ │ │ ├── marantec24.c │ │ │ ├── marantec24.h │ │ │ ├── mastercode.c │ │ │ ├── mastercode.h │ │ │ ├── megacode.c │ │ │ ├── megacode.h │ │ │ ├── nero_radio.c │ │ │ ├── nero_radio.h │ │ │ ├── nero_sketch.c │ │ │ ├── nero_sketch.h │ │ │ ├── nice_flo.c │ │ │ ├── nice_flo.h │ │ │ ├── nice_flor_s.c │ │ │ ├── nice_flor_s.h │ │ │ ├── phoenix_v2.c │ │ │ ├── phoenix_v2.h │ │ │ ├── power_smart.c │ │ │ ├── power_smart.h │ │ │ ├── princeton.c │ │ │ ├── princeton.h │ │ │ ├── protocol_items.c │ │ │ ├── protocol_items.h │ │ │ ├── public_api.h │ │ │ ├── raw.c │ │ │ ├── raw.h │ │ │ ├── revers_rb2.c │ │ │ ├── revers_rb2.h │ │ │ ├── roger.c │ │ │ ├── roger.h │ │ │ ├── scher_khan.c │ │ │ ├── scher_khan.h │ │ │ ├── secplus_v1.c │ │ │ ├── secplus_v1.h │ │ │ ├── secplus_v2.c │ │ │ ├── secplus_v2.h │ │ │ ├── smc5326.c │ │ │ ├── smc5326.h │ │ │ ├── somfy_keytis.c │ │ │ ├── somfy_keytis.h │ │ │ ├── somfy_telis.c │ │ │ ├── somfy_telis.h │ │ │ ├── star_line.c │ │ │ └── star_line.h │ │ ├── receiver.c │ │ ├── receiver.h │ │ ├── registry.c │ │ ├── registry.h │ │ ├── subghz_file_encoder_worker.c │ │ ├── subghz_file_encoder_worker.h │ │ ├── subghz_keystore.c │ │ ├── subghz_keystore.h │ │ ├── subghz_protocol_registry.h │ │ ├── subghz_setting.c │ │ ├── subghz_setting.h │ │ ├── subghz_tx_rx_worker.c │ │ ├── subghz_tx_rx_worker.h │ │ ├── subghz_worker.c │ │ ├── subghz_worker.h │ │ ├── transmitter.c │ │ ├── transmitter.h │ │ └── types.h │ ├── toolbox/ │ │ ├── .gitignore │ │ ├── SConscript │ │ ├── api_lock.h │ │ ├── args.c │ │ ├── args.h │ │ ├── bit_buffer.c │ │ ├── bit_buffer.h │ │ ├── buffer_stream.c │ │ ├── buffer_stream.h │ │ ├── cli/ │ │ │ ├── cli_ansi.c │ │ │ ├── cli_ansi.h │ │ │ ├── cli_command.c │ │ │ ├── cli_command.h │ │ │ ├── cli_registry.c │ │ │ ├── cli_registry.h │ │ │ ├── cli_registry_i.h │ │ │ └── shell/ │ │ │ ├── cli_shell.c │ │ │ ├── cli_shell.h │ │ │ ├── cli_shell_completions.c │ │ │ ├── cli_shell_completions.h │ │ │ ├── cli_shell_i.h │ │ │ ├── cli_shell_line.c │ │ │ └── cli_shell_line.h │ │ ├── compress.c │ │ ├── compress.h │ │ ├── crc32_calc.c │ │ ├── crc32_calc.h │ │ ├── dir_walk.c │ │ ├── dir_walk.h │ │ ├── float_tools.c │ │ ├── float_tools.h │ │ ├── hex.c │ │ ├── hex.h │ │ ├── keys_dict.c │ │ ├── keys_dict.h │ │ ├── level_duration.h │ │ ├── m_cstr_dup.h │ │ ├── manchester_decoder.c │ │ ├── manchester_decoder.h │ │ ├── manchester_encoder.c │ │ ├── manchester_encoder.h │ │ ├── md5_calc.c │ │ ├── md5_calc.h │ │ ├── name_generator.c │ │ ├── name_generator.h │ │ ├── path.c │ │ ├── path.h │ │ ├── pipe.c │ │ ├── pipe.h │ │ ├── pretty_format.c │ │ ├── pretty_format.h │ │ ├── profiler.c │ │ ├── profiler.h │ │ ├── property.c │ │ ├── property.h │ │ ├── protocols/ │ │ │ ├── protocol.h │ │ │ ├── protocol_dict.c │ │ │ └── protocol_dict.h │ │ ├── pulse_joiner.c │ │ ├── pulse_joiner.h │ │ ├── pulse_protocols/ │ │ │ ├── pulse_glue.c │ │ │ └── pulse_glue.h │ │ ├── saved_struct.c │ │ ├── saved_struct.h │ │ ├── settings_helpers/ │ │ │ ├── submenu_based.c │ │ │ └── submenu_based.h │ │ ├── simple_array.c │ │ ├── simple_array.h │ │ ├── str_buffer.c │ │ ├── str_buffer.h │ │ ├── stream/ │ │ │ ├── buffered_file_stream.c │ │ │ ├── buffered_file_stream.h │ │ │ ├── file_stream.c │ │ │ ├── file_stream.h │ │ │ ├── stream.c │ │ │ ├── stream.h │ │ │ ├── stream_cache.c │ │ │ ├── stream_cache.h │ │ │ ├── stream_i.h │ │ │ ├── string_stream.c │ │ │ └── string_stream.h │ │ ├── strint.c │ │ ├── strint.h │ │ ├── tar/ │ │ │ ├── tar_archive.c │ │ │ └── tar_archive.h │ │ ├── value_index.c │ │ ├── value_index.h │ │ ├── varint.c │ │ ├── varint.h │ │ ├── version.c │ │ └── version.h │ ├── u8g2/ │ │ ├── SConscript │ │ ├── u8g2.h │ │ ├── u8g2_bitmap.c │ │ ├── u8g2_box.c │ │ ├── u8g2_buffer.c │ │ ├── u8g2_circle.c │ │ ├── u8g2_d_memory.c │ │ ├── u8g2_font.c │ │ ├── u8g2_fonts.c │ │ ├── u8g2_glue.c │ │ ├── u8g2_glue.h │ │ ├── u8g2_hvline.c │ │ ├── u8g2_intersection.c │ │ ├── u8g2_line.c │ │ ├── u8g2_ll_hvline.c │ │ ├── u8g2_setup.c │ │ ├── u8x8.h │ │ ├── u8x8_8x8.c │ │ ├── u8x8_byte.c │ │ ├── u8x8_cad.c │ │ ├── u8x8_display.c │ │ ├── u8x8_gpio.c │ │ └── u8x8_setup.c │ └── update_util/ │ ├── SConscript │ ├── dfu_file.c │ ├── dfu_file.h │ ├── dfu_headers.h │ ├── int_backup.c │ ├── int_backup.h │ ├── resources/ │ │ ├── manifest.c │ │ └── manifest.h │ ├── update_manifest.c │ ├── update_manifest.h │ ├── update_operation.c │ └── update_operation.h ├── scripts/ │ ├── ReadMe.md │ ├── assets.py │ ├── bin2dfu.py │ ├── debug/ │ │ ├── 41-flipper.rules │ │ ├── FreeRTOS/ │ │ │ ├── FreeRTOS.py │ │ │ ├── FreeRTOSgdb/ │ │ │ │ ├── EventGroup.py │ │ │ │ ├── GDBCommands.py │ │ │ │ ├── HandleRegistry.py │ │ │ │ ├── List.py │ │ │ │ ├── QueueTools.py │ │ │ │ ├── Task.py │ │ │ │ ├── Types.py │ │ │ │ └── __init__.py │ │ │ ├── LICENSE │ │ │ └── README.md │ │ ├── PyCortexMDebug/ │ │ │ ├── LICENSE │ │ │ ├── PyCortexMDebug.py │ │ │ ├── README.md │ │ │ └── cmdebug/ │ │ │ ├── __init__.py │ │ │ ├── svd.py │ │ │ └── svd_gdb.py │ │ ├── README.md │ │ ├── STM32WB55_CM4.svd │ │ ├── flipperapps.py │ │ ├── flipperversion.py │ │ ├── fw.jflash │ │ ├── gdbinit │ │ └── stm32wbx.cfg │ ├── fastfap.py │ ├── fbt/ │ │ ├── __init__.py │ │ ├── appmanifest.py │ │ ├── elfmanifest.py │ │ ├── fapassets.py │ │ ├── sdk/ │ │ │ ├── __init__.py │ │ │ ├── cache.py │ │ │ ├── collector.py │ │ │ └── hashes.py │ │ ├── util.py │ │ └── version.py │ ├── fbt_tools/ │ │ ├── blackmagic.py │ │ ├── ccache.py │ │ ├── compilation_db.py │ │ ├── crosscc.py │ │ ├── doxygen.py │ │ ├── fbt_apps.py │ │ ├── fbt_assets.py │ │ ├── fbt_debugopts.py │ │ ├── fbt_dist.py │ │ ├── fbt_envhooks.py │ │ ├── fbt_extapps.py │ │ ├── fbt_help.py │ │ ├── fbt_hwtarget.py │ │ ├── fbt_resources.py │ │ ├── fbt_sdk.py │ │ ├── fbt_tweaks.py │ │ ├── fbt_version.py │ │ ├── fwbin.py │ │ ├── gdb.py │ │ ├── jflash.py │ │ ├── objdump.py │ │ ├── openocd.py │ │ ├── pvsstudio.py │ │ ├── python3.py │ │ ├── sconsmodular.py │ │ ├── sconsrecursiveglob.py │ │ └── strip.py │ ├── flash.py │ ├── flipper/ │ │ ├── __init__.py │ │ ├── app.py │ │ ├── assets/ │ │ │ ├── __init__.py │ │ │ ├── copro.py │ │ │ ├── coprobin.py │ │ │ ├── dolphin.py │ │ │ ├── heatshrink_stream.py │ │ │ ├── icon.py │ │ │ ├── manifest.py │ │ │ ├── obdata.py │ │ │ ├── tarball.py │ │ │ └── templates/ │ │ │ ├── dolphin.c.tmpl │ │ │ └── dolphin.h.tmpl │ │ ├── cube.py │ │ ├── storage.py │ │ └── utils/ │ │ ├── __init__.py │ │ ├── cdc.py │ │ ├── fff.py │ │ ├── fstree.py │ │ ├── openocd.py │ │ ├── programmer.py │ │ ├── programmer_openocd.py │ │ ├── register.py │ │ ├── stm32wb55.py │ │ └── templite.py │ ├── fwflash.py │ ├── fwsize.py │ ├── get_env.py │ ├── guruguru.py │ ├── hs.py │ ├── imglint.py │ ├── infrared.py │ ├── lint.py │ ├── map_analyse_upload.py │ ├── merge_report_qa.py │ ├── ob.data │ ├── ob.py │ ├── ob_custradio.data │ ├── otp.py │ ├── power.py │ ├── runfap.py │ ├── sconsdist.py │ ├── selfupdate.py │ ├── send_firebase_notification.py │ ├── serial_cli.py │ ├── serial_cli_perf.py │ ├── slideshow.py │ ├── storage.py │ ├── testops.py │ ├── toolchain/ │ │ ├── fbtenv.cmd │ │ ├── fbtenv.sh │ │ └── windows-toolchain-download.ps1 │ ├── ufbt/ │ │ ├── SConstruct │ │ ├── commandline.scons │ │ ├── project_template/ │ │ │ ├── .gitignore │ │ │ └── app_template/ │ │ │ ├── ${FBT_APPID}.c │ │ │ ├── .github/ │ │ │ │ └── workflows/ │ │ │ │ └── build.yml │ │ │ └── application.fam │ │ ├── site_init.py │ │ └── site_tools/ │ │ ├── ufbt_help.py │ │ └── ufbt_state.py │ ├── update.py │ ├── version.py │ └── wifi_board.py ├── site_scons/ │ ├── cc.scons │ ├── commandline.scons │ ├── environ.scons │ ├── extapps.scons │ ├── fbt_extra/ │ │ └── util.py │ ├── firmwareopts.scons │ └── site_init.py ├── targets/ │ ├── ReadMe.md │ ├── SConscript │ ├── f18/ │ │ ├── api_symbols.csv │ │ ├── furi_hal/ │ │ │ ├── furi_hal.c │ │ │ ├── furi_hal_power_config.c │ │ │ ├── furi_hal_resources.c │ │ │ ├── furi_hal_resources.h │ │ │ ├── furi_hal_spi_config.c │ │ │ ├── furi_hal_spi_config.h │ │ │ ├── furi_hal_target_hw.h │ │ │ └── furi_hal_version_device.c │ │ └── target.json │ ├── f7/ │ │ ├── api_symbols.csv │ │ ├── application_ext.ld │ │ ├── ble_glue/ │ │ │ ├── app_common.h │ │ │ ├── app_conf.h │ │ │ ├── app_debug.c │ │ │ ├── app_debug.h │ │ │ ├── ble_app.c │ │ │ ├── ble_app.h │ │ │ ├── ble_conf.h │ │ │ ├── ble_const.h │ │ │ ├── ble_dbg_conf.h │ │ │ ├── ble_event_thread.c │ │ │ ├── ble_event_thread.h │ │ │ ├── ble_glue.c │ │ │ ├── ble_glue.h │ │ │ ├── ble_tl_hooks.c │ │ │ ├── compiler.h │ │ │ ├── extra_beacon.c │ │ │ ├── extra_beacon.h │ │ │ ├── furi_ble/ │ │ │ │ ├── event_dispatcher.c │ │ │ │ ├── event_dispatcher.h │ │ │ │ ├── gatt.c │ │ │ │ ├── gatt.h │ │ │ │ └── profile_interface.h │ │ │ ├── gap.c │ │ │ ├── gap.h │ │ │ ├── hsem_map.h │ │ │ ├── hw_ipcc.c │ │ │ ├── osal.h │ │ │ ├── profiles/ │ │ │ │ ├── serial_profile.c │ │ │ │ └── serial_profile.h │ │ │ ├── services/ │ │ │ │ ├── battery_service.c │ │ │ │ ├── battery_service.h │ │ │ │ ├── dev_info_service.c │ │ │ │ ├── dev_info_service.h │ │ │ │ ├── dev_info_service_uuid.inc │ │ │ │ ├── serial_service.c │ │ │ │ ├── serial_service.h │ │ │ │ └── serial_service_uuid.inc │ │ │ └── tl_dbg_conf.h │ │ ├── fatfs/ │ │ │ ├── fatfs.c │ │ │ ├── fatfs.h │ │ │ ├── ffconf.h │ │ │ ├── sector_cache.c │ │ │ ├── sector_cache.h │ │ │ ├── user_diskio.c │ │ │ └── user_diskio.h │ │ ├── furi_hal/ │ │ │ ├── furi_hal.c │ │ │ ├── furi_hal_adc.c │ │ │ ├── furi_hal_bt.c │ │ │ ├── furi_hal_bus.c │ │ │ ├── furi_hal_bus.h │ │ │ ├── furi_hal_clock.c │ │ │ ├── furi_hal_clock.h │ │ │ ├── furi_hal_cortex.c │ │ │ ├── furi_hal_crypto.c │ │ │ ├── furi_hal_debug.c │ │ │ ├── furi_hal_dma.c │ │ │ ├── furi_hal_dma.h │ │ │ ├── furi_hal_flash.c │ │ │ ├── furi_hal_flash.h │ │ │ ├── furi_hal_gpio.c │ │ │ ├── furi_hal_gpio.h │ │ │ ├── furi_hal_i2c.c │ │ │ ├── furi_hal_i2c_config.c │ │ │ ├── furi_hal_i2c_config.h │ │ │ ├── furi_hal_i2c_types.h │ │ │ ├── furi_hal_ibutton.c │ │ │ ├── furi_hal_ibutton.h │ │ │ ├── furi_hal_idle_timer.h │ │ │ ├── furi_hal_info.c │ │ │ ├── furi_hal_infrared.c │ │ │ ├── furi_hal_interrupt.c │ │ │ ├── furi_hal_interrupt.h │ │ │ ├── furi_hal_light.c │ │ │ ├── furi_hal_memory.c │ │ │ ├── furi_hal_mpu.c │ │ │ ├── furi_hal_nfc.c │ │ │ ├── furi_hal_nfc_event.c │ │ │ ├── furi_hal_nfc_felica.c │ │ │ ├── furi_hal_nfc_i.h │ │ │ ├── furi_hal_nfc_irq.c │ │ │ ├── furi_hal_nfc_iso14443a.c │ │ │ ├── furi_hal_nfc_iso14443b.c │ │ │ ├── furi_hal_nfc_iso15693.c │ │ │ ├── furi_hal_nfc_tech_i.h │ │ │ ├── furi_hal_nfc_timer.c │ │ │ ├── furi_hal_os.c │ │ │ ├── furi_hal_os.h │ │ │ ├── furi_hal_power.c │ │ │ ├── furi_hal_power_config.c │ │ │ ├── furi_hal_pwm.c │ │ │ ├── furi_hal_pwm.h │ │ │ ├── furi_hal_random.c │ │ │ ├── furi_hal_region.c │ │ │ ├── furi_hal_resources.c │ │ │ ├── furi_hal_resources.h │ │ │ ├── furi_hal_rfid.c │ │ │ ├── furi_hal_rfid.h │ │ │ ├── furi_hal_rtc.c │ │ │ ├── furi_hal_rtc.h │ │ │ ├── furi_hal_sd.c │ │ │ ├── furi_hal_serial.c │ │ │ ├── furi_hal_serial.h │ │ │ ├── furi_hal_serial_control.c │ │ │ ├── furi_hal_serial_control.h │ │ │ ├── furi_hal_serial_types.h │ │ │ ├── furi_hal_serial_types_i.h │ │ │ ├── furi_hal_speaker.c │ │ │ ├── furi_hal_spi.c │ │ │ ├── furi_hal_spi_config.c │ │ │ ├── furi_hal_spi_config.h │ │ │ ├── furi_hal_spi_types.h │ │ │ ├── furi_hal_subghz.c │ │ │ ├── furi_hal_subghz.h │ │ │ ├── furi_hal_target_hw.h │ │ │ ├── furi_hal_usb.c │ │ │ ├── furi_hal_usb_ccid.c │ │ │ ├── furi_hal_usb_cdc.c │ │ │ ├── furi_hal_usb_cdc.h │ │ │ ├── furi_hal_usb_hid.c │ │ │ ├── furi_hal_usb_i.h │ │ │ ├── furi_hal_usb_u2f.c │ │ │ ├── furi_hal_version.c │ │ │ ├── furi_hal_version_device.c │ │ │ └── furi_hal_vibro.c │ │ ├── inc/ │ │ │ ├── FreeRTOSConfig.h │ │ │ ├── alt_boot.h │ │ │ ├── furi_config.h │ │ │ ├── stm32.h │ │ │ ├── stm32_assert.h │ │ │ ├── stm32wb55_linker.h │ │ │ └── stm32wb55_startup.h │ │ ├── platform_specific/ │ │ │ ├── cxx_virtual_stub.c │ │ │ ├── cxx_virtual_stub.h │ │ │ ├── intrinsic_export.h │ │ │ └── math_wrapper.h │ │ ├── src/ │ │ │ ├── dfu.c │ │ │ ├── main.c │ │ │ ├── recovery.c │ │ │ ├── stm32wb55_startup.c │ │ │ └── update.c │ │ ├── stm32wb55xx_flash.ld │ │ ├── stm32wb55xx_ram_fw.ld │ │ └── target.json │ └── furi_hal_include/ │ ├── furi_hal.h │ ├── furi_hal_adc.h │ ├── furi_hal_bt.h │ ├── furi_hal_cortex.h │ ├── furi_hal_crypto.h │ ├── furi_hal_debug.h │ ├── furi_hal_i2c.h │ ├── furi_hal_info.h │ ├── furi_hal_infrared.h │ ├── furi_hal_light.h │ ├── furi_hal_memory.h │ ├── furi_hal_mpu.h │ ├── furi_hal_nfc.h │ ├── furi_hal_power.h │ ├── furi_hal_random.h │ ├── furi_hal_region.h │ ├── furi_hal_sd.h │ ├── furi_hal_speaker.h │ ├── furi_hal_spi.h │ ├── furi_hal_usb.h │ ├── furi_hal_usb_ccid.h │ ├── furi_hal_usb_hid.h │ ├── furi_hal_usb_hid_u2f.h │ ├── furi_hal_version.h │ └── furi_hal_vibro.h └── tsconfig.json ================================================ FILE CONTENTS ================================================ ================================================ FILE: .clang-format ================================================ --- Language: Cpp AccessModifierOffset: -4 AlignAfterOpenBracket: AlwaysBreak AlignArrayOfStructures: None AlignConsecutiveAssignments: Enabled: false AcrossEmptyLines: false AcrossComments: false AlignCompound: false AlignFunctionPointers: false PadOperators: true AlignConsecutiveBitFields: Enabled: true AcrossEmptyLines: true AcrossComments: true AlignCompound: false AlignFunctionPointers: false PadOperators: true AlignConsecutiveDeclarations: Enabled: false AcrossEmptyLines: false AcrossComments: false AlignCompound: false AlignFunctionPointers: false PadOperators: true AlignConsecutiveMacros: Enabled: true AcrossEmptyLines: false AcrossComments: true AlignCompound: true AlignFunctionPointers: false PadOperators: true AlignConsecutiveShortCaseStatements: Enabled: false AcrossEmptyLines: false AcrossComments: false AlignCaseColons: false AlignEscapedNewlines: Left AlignOperands: Align AlignTrailingComments: Kind: Never OverEmptyLines: 0 AllowAllArgumentsOnNextLine: true AllowAllParametersOfDeclarationOnNextLine: false AllowBreakBeforeNoexceptSpecifier: Never AllowShortBlocksOnASingleLine: Never AllowShortCaseLabelsOnASingleLine: false AllowShortCompoundRequirementOnASingleLine: true AllowShortEnumsOnASingleLine: false AllowShortFunctionsOnASingleLine: None AllowShortIfStatementsOnASingleLine: WithoutElse AllowShortLambdasOnASingleLine: All AllowShortLoopsOnASingleLine: false AlwaysBreakAfterDefinitionReturnType: None AlwaysBreakAfterReturnType: None AlwaysBreakBeforeMultilineStrings: false AlwaysBreakTemplateDeclarations: Yes AttributeMacros: - __capability BinPackArguments: false BinPackParameters: false BitFieldColonSpacing: Both BraceWrapping: AfterCaseLabel: false AfterClass: false AfterControlStatement: Never AfterEnum: false AfterExternBlock: false AfterFunction: false AfterNamespace: false AfterObjCDeclaration: false AfterStruct: false AfterUnion: false BeforeCatch: false BeforeElse: false BeforeLambdaBody: false BeforeWhile: false IndentBraces: false SplitEmptyFunction: true SplitEmptyRecord: true SplitEmptyNamespace: true BreakAdjacentStringLiterals: true BreakAfterAttributes: Leave BreakAfterJavaFieldAnnotations: false BreakArrays: true BreakBeforeBinaryOperators: None BreakBeforeConceptDeclarations: Always BreakBeforeBraces: Attach BreakBeforeInlineASMColon: OnlyMultiline BreakBeforeTernaryOperators: false BreakConstructorInitializers: BeforeComma BreakInheritanceList: BeforeColon BreakStringLiterals: false ColumnLimit: 99 CommentPragmas: '^ IWYU pragma:' CompactNamespaces: false ConstructorInitializerIndentWidth: 4 ContinuationIndentWidth: 4 Cpp11BracedListStyle: true DerivePointerAlignment: false DisableFormat: false EmptyLineAfterAccessModifier: Never EmptyLineBeforeAccessModifier: LogicalBlock ExperimentalAutoDetectBinPacking: false FixNamespaceComments: false ForEachMacros: - foreach - Q_FOREACH - BOOST_FOREACH - M_EACH IfMacros: - KJ_IF_MAYBE IncludeBlocks: Preserve IncludeCategories: - Regex: '.*' Priority: 1 SortPriority: 0 CaseSensitive: false - Regex: '^(<|"(gtest|gmock|isl|json)/)' Priority: 3 SortPriority: 0 CaseSensitive: false - Regex: '.*' Priority: 1 SortPriority: 0 CaseSensitive: false IncludeIsMainRegex: '(Test)?$' IncludeIsMainSourceRegex: '' IndentAccessModifiers: false IndentCaseBlocks: false IndentCaseLabels: false IndentExternBlock: AfterExternBlock IndentGotoLabels: true IndentPPDirectives: None IndentRequiresClause: false IndentWidth: 4 IndentWrappedFunctionNames: true InsertBraces: false InsertNewlineAtEOF: true InsertTrailingCommas: None IntegerLiteralSeparator: Binary: 0 BinaryMinDigits: 0 Decimal: 0 DecimalMinDigits: 0 Hex: 0 HexMinDigits: 0 JavaScriptQuotes: Leave JavaScriptWrapImports: true KeepEmptyLinesAtTheStartOfBlocks: false KeepEmptyLinesAtEOF: false LambdaBodyIndentation: Signature LineEnding: DeriveLF MacroBlockBegin: '' MacroBlockEnd: '' MaxEmptyLinesToKeep: 1 NamespaceIndentation: None ObjCBinPackProtocolList: Auto ObjCBlockIndentWidth: 4 ObjCBreakBeforeNestedBlockParam: true ObjCSpaceAfterProperty: true ObjCSpaceBeforeProtocolList: true PackConstructorInitializers: BinPack PenaltyBreakAssignment: 10 PenaltyBreakBeforeFirstCallParameter: 30 PenaltyBreakComment: 10 PenaltyBreakFirstLessLess: 0 PenaltyBreakOpenParenthesis: 0 PenaltyBreakScopeResolution: 500 PenaltyBreakString: 10 PenaltyBreakTemplateDeclaration: 10 PenaltyExcessCharacter: 100 PenaltyIndentedWhitespace: 0 PenaltyReturnTypeOnItsOwnLine: 60 PointerAlignment: Left PPIndentWidth: -1 QualifierAlignment: Leave ReferenceAlignment: Pointer ReflowComments: false RemoveBracesLLVM: false RemoveParentheses: Leave RemoveSemicolon: true RequiresClausePosition: OwnLine RequiresExpressionIndentation: OuterScope SeparateDefinitionBlocks: Leave ShortNamespaceLines: 1 SkipMacroDefinitionBody: false SortIncludes: Never SortJavaStaticImport: Before SortUsingDeclarations: Never SpaceAfterCStyleCast: false SpaceAfterLogicalNot: false SpaceAfterTemplateKeyword: true SpaceAroundPointerQualifiers: Default SpaceBeforeAssignmentOperators: true SpaceBeforeCaseColon: false SpaceBeforeCpp11BracedList: false SpaceBeforeCtorInitializerColon: true SpaceBeforeInheritanceColon: true SpaceBeforeJsonColon: false SpaceBeforeParens: Never SpaceBeforeParensOptions: AfterControlStatements: false AfterForeachMacros: false AfterFunctionDefinitionName: false AfterFunctionDeclarationName: false AfterIfMacros: false AfterOverloadedOperator: false AfterPlacementOperator: true AfterRequiresInClause: false AfterRequiresInExpression: false BeforeNonEmptyParentheses: false SpaceBeforeRangeBasedForLoopColon: true SpaceBeforeSquareBrackets: false SpaceInEmptyBlock: false SpacesBeforeTrailingComments: 1 SpacesInAngles: Never SpacesInContainerLiterals: false SpacesInLineCommentPrefix: Minimum: 1 Maximum: -1 SpacesInParens: Never SpacesInParensOptions: InCStyleCasts: false InConditionalStatements: false InEmptyParentheses: false Other: false SpacesInSquareBrackets: false Standard: c++20 StatementAttributeLikeMacros: - Q_EMIT StatementMacros: - Q_UNUSED - QT_REQUIRE_VERSION TabWidth: 4 UseTab: Never VerilogBreakBetweenInstancePorts: true WhitespaceSensitiveMacros: - STRINGIZE - PP_STRINGIZE - BOOST_PP_STRINGIZE - NS_SWIFT_NAME - CF_SWIFT_NAME ... ================================================ FILE: .clangd ================================================ CompileFlags: Add: - -Wno-unknown-warning-option - -Wno-format Remove: - -mword-relocations Diagnostics: ClangTidy: FastCheckFilter: None --- If: PathMatch: .*\.h Diagnostics: UnusedIncludes: None ================================================ FILE: .editorconfig ================================================ root = true [*] end_of_line = lf insert_final_newline = true charset = utf-8 [*.{cpp,h,c,py,sh}] indent_style = space indent_size = 4 ================================================ FILE: .gitattributes ================================================ * text=auto eol=lf *.bat eol=crlf *.ps1 eol=crlf *.cmd eol=crlf ================================================ FILE: .github/CODEOWNERS ================================================ # Who owns all the fish by default * @DrZlo13 @hedger @gsurkov # Apps /applications/debug/bt_debug_app/ @DrZlo13 @hedger @gsurkov @gornekich /applications/debug/accessor/ @DrZlo13 @hedger @gsurkov @nminaylov /applications/debug/battery_test_app/ @DrZlo13 @hedger @gsurkov @gornekich /applications/debug/bt_debug_app/ @DrZlo13 @hedger @gsurkov @gornekich /applications/debug/file_browser_test/ @DrZlo13 @hedger @gsurkov @nminaylov /applications/debug/lfrfid_debug/ @DrZlo13 @hedger @gsurkov @nminaylov /applications/debug/text_box_test/ @DrZlo13 @hedger @gsurkov @nminaylov /applications/debug/uart_echo/ @DrZlo13 @hedger @gsurkov @nminaylov /applications/debug/usb_mouse/ @DrZlo13 @hedger @gsurkov @nminaylov /applications/debug/usb_test/ @DrZlo13 @hedger @gsurkov @nminaylov /applications/main/archive/ @DrZlo13 @hedger @gsurkov @nminaylov /applications/main/bad_usb/ @DrZlo13 @hedger @gsurkov @nminaylov /applications/main/gpio/ @DrZlo13 @hedger @gsurkov @nminaylov /applications/main/ibutton/ @DrZlo13 @hedger @gsurkov /applications/main/infrared/ @DrZlo13 @hedger @gsurkov /applications/main/nfc/ @DrZlo13 @hedger @gsurkov @gornekich /applications/main/subghz/ @DrZlo13 @hedger @gsurkov @Skorpionm /applications/main/u2f/ @DrZlo13 @hedger @gsurkov @nminaylov /applications/services/bt/ @DrZlo13 @hedger @gsurkov @gornekich /applications/services/cli/ @DrZlo13 @hedger @gsurkov @nminaylov @portasynthinca3 /applications/services/crypto/ @DrZlo13 @hedger @gsurkov @nminaylov /applications/services/desktop/ @DrZlo13 @hedger @gsurkov @nminaylov /applications/services/dolphin/ @DrZlo13 @hedger @gsurkov @nminaylov /applications/services/power/ @DrZlo13 @hedger @gsurkov @gornekich /applications/services/rpc/ @DrZlo13 @hedger @gsurkov @nminaylov /applications/services/bt_settings_app/ @DrZlo13 @hedger @gsurkov @gornekich /applications/services/desktop_settings/ @DrZlo13 @hedger @gsurkov @nminaylov /applications/services/dolphin_passport/ @DrZlo13 @hedger @gsurkov @nminaylov /applications/services/power_settings_app/ @DrZlo13 @hedger @gsurkov @gornekich /applications/system/storage_move_to_sd/ @DrZlo13 @hedger @gsurkov @nminaylov /applications/system/js_app/ @DrZlo13 @hedger @gsurkov @nminaylov @portasynthinca3 /applications/debug/unit_tests/ @DrZlo13 @hedger @gsurkov @nminaylov @gornekich @Skorpionm /applications/examples/example_thermo/ @DrZlo13 @hedger @gsurkov # Firmware targets /targets/ @DrZlo13 @hedger @gsurkov @nminaylov # Assets /applications/main/infrared/resources/ @DrZlo13 @hedger @gsurkov # Documentation /documentation/ @DrZlo13 @hedger @gsurkov @portasynthinca3 /scripts/toolchain/ @DrZlo13 @hedger @gsurkov # Lib /lib/stm32wb_copro/ @DrZlo13 @hedger @gsurkov @gornekich /lib/digital_signal/ @DrZlo13 @hedger @gsurkov @gornekich /lib/infrared/ @DrZlo13 @hedger @gsurkov /lib/lfrfid/ @DrZlo13 @hedger @gsurkov @nminaylov /lib/libusb_stm32/ @DrZlo13 @hedger @gsurkov @nminaylov /lib/mbedtls/ @DrZlo13 @hedger @gsurkov @nminaylov /lib/mjs/ @DrZlo13 @hedger @gsurkov @nminaylov @portasynthinca3 /lib/nanopb/ @DrZlo13 @hedger @gsurkov @nminaylov /lib/nfc/ @DrZlo13 @hedger @gsurkov @gornekich /lib/one_wire/ @DrZlo13 @hedger @gsurkov /lib/subghz/ @DrZlo13 @hedger @gsurkov @Skorpionm /lib/toolbox/ @DrZlo13 @hedger @gsurkov /lib/toolbox/cli @DrZlo13 @hedger @gsurkov @portasynthinca3 # CI/CD /.github/workflows/ @DrZlo13 @hedger @gsurkov ================================================ FILE: .github/ISSUE_TEMPLATE/01_bug_report.yml ================================================ name: Bug report description: File a bug reports regarding the firmware. labels: ['bug'] body: - type: markdown attributes: value: | Thank you for taking the time to fill out an issue, this template is meant for any issues related to the Flipper Zero firmware. If you require help with the Flipper zero and its firmware, we ask that you join [our forum](https://forum.flipperzero.one) - type: textarea id: description attributes: label: Describe the bug. description: "A clear and concise description of what the bug is." validations: required: true - type: textarea id: repro attributes: label: Reproduction description: "How can this bug be reproduced?" placeholder: | 1. Switch on... 2. Press button '....' 3. Wait for the moon phase 4. It burns validations: required: true - type: input id: target attributes: label: Target description: Specify the target # Target seems to be largely ignored by outside sources. - type: textarea id: logs attributes: label: Logs description: Attach your debug logs here render: Text # Avoid rendering as Markdown here. - type: textarea id: anything-else attributes: label: Anything else? description: Let us know if you have anything else to share. ================================================ FILE: .github/ISSUE_TEMPLATE/02_enhancements.yml ================================================ name: Enhancements description: Suggest improvements for any existing functionality within the firmware. body: - type: markdown attributes: value: | Thank you for taking the time to fill out an issue. This template is meant for feature requests and improvements to already existing functionality. If you require help with the Flipper zero and its firmware, we ask that you join [our forum](https://forum.flipperzero.one) - type: textarea id: proposal attributes: label: "Describe the enhancement you're suggesting." description: | Feel free to describe in as much detail as you wish. validations: required: true - type: textarea id: anything-else attributes: label: Anything else? description: Let us know if you have anything else to share. ================================================ FILE: .github/ISSUE_TEMPLATE/03_feature_request.yml ================================================ name: Feature Request description: For feature requests regarding the firmware. labels: ['feature request'] body: - type: markdown attributes: value: | Thank you for taking the time to fill out an issue, this template is meant for any feature suggestions. If you require help with the Flipper zero and its firmware, we ask that you join [our forum](https://forum.flipperzero.one) - type: textarea id: proposal attributes: label: "Description of the feature you're suggesting." description: | Please describe your feature request in as many details as possible. - Describe what it should do. - Note whether it is to extend existing functionality or introduce new functionality. validations: required: true - type: textarea id: anything-else attributes: label: Anything else? description: Let us know if you have anything else to share. ================================================ FILE: .github/ISSUE_TEMPLATE/config.yml ================================================ blank_issues_enabled: true contact_links: - name: Need help? url: https://forum.flipperzero.one about: For any question regarding on how to use the Flipper Zero and its firmware. ================================================ FILE: .github/actions/submit_sdk/action.yml ================================================ name: Submit SDK to Catalog author: hedger description: | This action checks if SDK exists in the catalog and if not, adds and/or publishes it. inputs: catalog-url: description: The URL of the Catalog API. Must not be empty or end with a /. required: true catalog-api-token: description: The token to use to authenticate with the Catalog API. Must not be empty. required: true firmware-api: description: Fimware's API version, major.minor required: true firmware-target: description: Firmware's target, e.g. f7/f18 required: true firmware-version: description: Firmware's version, e.g. 0.13.37-rc3, or 0.13.37 required: true runs: using: composite steps: - name: Check inputs shell: bash run: | if [ -z "${{ inputs.catalog-url }}" ] ; then echo "Invalid catalog-url: ${{ inputs.catalog-url }}" exit 1 fi if [ -z "${{ inputs.catalog-api-token }}" ] ; then echo "Invalid catalog-api-token: ${{ inputs.catalog-api-token }}" exit 1 fi if ! echo "${{ inputs.firmware-api }}" | grep -q "^[0-9]\+\.[0-9]\+$" ; then echo "Invalid firmware-api: ${{ inputs.firmware-api }}" exit 1 fi if ! echo "${{ inputs.firmware-target }}" | grep -q "^f[0-9]\+$" ; then echo "Invalid firmware-target: ${{ inputs.firmware-target }}" exit 1 fi if ! echo "${{ inputs.firmware-version }}" | grep -q "^[0-9]\+\.[0-9]\+\.[0-9]\+\(-rc\)\?\([0-9]\+\)\?$" ; then echo "Invalid firmware-version: ${{ inputs.firmware-version }}" exit 1 fi - name: Submit SDK shell: bash run: | curl --fail -sX 'GET' \ '${{ inputs.catalog-url }}/api/v0/0/sdk?length=500' \ -H 'Accept: application/json' > sdk_versions.json if jq -r -e ".[] | select((.api == \"${{ inputs.firmware-api }}\") and .target == \"${{ inputs.firmware-target }}\")" sdk_versions.json > found_sdk.json ; then echo "API version ${{ inputs.firmware-api }} already exists in catalog" if [ $(jq -r -e ".released_at" found_sdk.json) != "null" ] ; then echo "API version is already released" exit 0 fi if ! echo "${{ inputs.firmware-version }}" | grep -q -- "-rc" ; then SDK_ID=$(jq -r ._id found_sdk.json) echo "Marking SDK $SDK_ID as released" curl --fail-with-body -X 'POST' \ "${{ inputs.catalog-url }}/api/v0/0/sdk/${SDK_ID}/release" \ -H 'Accept: application/json' \ -H 'Authorization: Bearer ${{ inputs.catalog-api-token }}' \ -d '' fi else echo "API version ${{ inputs.firmware-api }} doesn't exist in catalog, adding" curl --fail-with-body -X 'POST' \ '${{ inputs.catalog-url }}/api/v0/0/sdk' \ -H 'Accept: application/json' \ -H 'Authorization: Bearer ${{ inputs.catalog-api-token }}' \ -H 'Content-Type: application/json' \ -d "{\"name\": \"${{ inputs.firmware-version }}\", \"target\": \"${{ inputs.firmware-target }}\", \"api\": \"${{ inputs.firmware-api }}\"}" fi ================================================ FILE: .github/pull_request_template.md ================================================ # What's new - [ Describe changes here ] # Verification - [ Describe how to verify changes ] # Checklist (For Reviewer) - [ ] PR has description of feature/bug or link to Confluence/Jira task - [ ] Description contains actions to verify feature/bugfix - [ ] I've built this code, uploaded it to the device and verified feature/bugfix ================================================ FILE: .github/workflows/build.yml ================================================ name: 'Build' on: push: branches: - dev tags: - '*' pull_request: env: DEFAULT_TARGET: f7 FBT_TOOLCHAIN_PATH: /runner/_work FBT_GIT_SUBMODULE_SHALLOW: 1 GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} jobs: main: runs-on: [self-hosted, FlipperZeroShell] strategy: fail-fast: false matrix: target: [f7, f18] steps: - name: 'Wipe workspace' run: find ./ -mount -maxdepth 1 -exec rm -rf {} \; - name: 'Checkout code' uses: actions/checkout@v4 with: fetch-depth: 1 ref: ${{ github.event.pull_request.head.sha }} - name: 'Get commit details' id: names run: | BUILD_TYPE='DEBUG=1 COMPACT=0' if [[ ${{ github.event_name }} == 'pull_request' ]]; then TYPE="pull" elif [[ "${{ github.ref }}" == "refs/tags/"* ]]; then TYPE="tag" BUILD_TYPE='DEBUG=0 COMPACT=1' else TYPE="other" fi python3 scripts/get_env.py "--event_file=${{ github.event_path }}" "--type=$TYPE" || cat "${{ github.event_path }}" echo "event_type=$TYPE" >> $GITHUB_OUTPUT echo "FBT_BUILD_TYPE=$BUILD_TYPE" >> $GITHUB_ENV echo "TARGET=${{ matrix.target }}" >> $GITHUB_ENV echo "TARGET_HW=$(echo "${{ matrix.target }}" | sed 's/f//')" >> $GITHUB_ENV - name: 'Check API versions for consistency between targets' run: | set -e N_API_HEADER_SIGNATURES=`ls -1 targets/f*/api_symbols.csv | xargs -I {} sh -c "head -n2 {} | md5sum" | sort -u | wc -l` if [ $N_API_HEADER_SIGNATURES != 1 ] ; then echo API versions aren\'t matching for available targets. Please update! echo API versions are: head -n2 targets/f*/api_symbols.csv exit 1 fi - name: 'Build the firmware and apps' id: build-fw run: | ./fbt TARGET_HW=$TARGET_HW $FBT_BUILD_TYPE copro_dist updater_package fap_dist echo "firmware_api=$(./fbt TARGET_HW=$TARGET_HW get_apiversion)" >> $GITHUB_OUTPUT - name: 'Check for uncommitted changes' run: | git diff --exit-code - name: 'Copy build output' run: | set -e rm -rf artifacts map_analyser_files || true mkdir artifacts map_analyser_files cp dist/${TARGET}-*/* artifacts/ || true tar czpf "artifacts/flipper-z-${TARGET}-resources-${SUFFIX}.tgz" \ -C build/latest resources tar czpf "artifacts/flipper-z-${TARGET}-debugapps-${SUFFIX}.tgz" \ -C dist/${TARGET}-*/apps/Debug . tar czpf "artifacts/flipper-z-${TARGET}-appsymbols-${SUFFIX}.tgz" \ -C dist/${TARGET}-*/debug_elf . - name: 'Copy universal artifacts' if: ${{ !github.event.pull_request.head.repo.fork && matrix.target == env.DEFAULT_TARGET }} run: | tar czpf "artifacts/flipper-z-any-scripts-${SUFFIX}.tgz" scripts cp build/core2_firmware.tgz "artifacts/flipper-z-any-core2_firmware-${SUFFIX}.tgz" - name: 'Upload artifacts to update server' if: ${{ !github.event.pull_request.head.repo.fork }} run: | FILES=$(for ARTIFACT in $(find artifacts -maxdepth 1 -not -type d); do echo "-F files=@${ARTIFACT}"; done) curl --fail -L -H "Token: ${{ secrets.INDEXER_TOKEN }}" \ -F "branch=${BRANCH_NAME}" \ -F "version_token=${COMMIT_SHA}" \ ${FILES[@]} \ "${{ secrets.INDEXER_URL }}"/firmware/uploadfiles - name: 'Copy & analyse map analyser files' if: ${{ !github.event.pull_request.head.repo.fork && matrix.target == env.DEFAULT_TARGET }} run: | cp build/${DEFAULT_TARGET}-firmware-*/firmware.elf.map map_analyser_files/firmware.elf.map cp build/${DEFAULT_TARGET}-firmware-*/firmware.elf map_analyser_files/firmware.elf source scripts/toolchain/fbtenv.sh python3 scripts/map_analyse_upload.py \ "--elf_file=map_analyser_files/firmware.elf" \ "--map_file=map_analyser_files/firmware.elf.map" \ "--analyser_url=${{ secrets.ANALYSER_URL }}" \ "--analyser_token=${{ secrets.ANALYSER_TOKEN }}"; - name: 'Find previous comment' if: ${{ !github.event.pull_request.head.repo.fork && matrix.target == env.DEFAULT_TARGET && github.event.pull_request }} uses: peter-evans/find-comment@v3 id: find-comment with: issue-number: ${{ github.event.pull_request.number }} comment-author: 'github-actions[bot]' body-includes: 'Compiled ${{ matrix.target }} firmware for commit' - name: 'Create or update comment' if: ${{ !github.event.pull_request.head.repo.fork && matrix.target == env.DEFAULT_TARGET && github.event.pull_request }} uses: peter-evans/create-or-update-comment@v4 with: comment-id: ${{ steps.find-comment.outputs.comment-id }} issue-number: ${{ github.event.pull_request.number }} body: | **Compiled ${{ matrix.target }} firmware for commit `${{steps.names.outputs.commit_sha}}`:** - [📦 Update package](https://update.flipperzero.one/builds/firmware/${{steps.names.outputs.branch_name}}/flipper-z-${{steps.names.outputs.default_target}}-update-${{steps.names.outputs.suffix}}.tgz) - [📥 DFU file](https://update.flipperzero.one/builds/firmware/${{steps.names.outputs.branch_name}}/flipper-z-${{steps.names.outputs.default_target}}-full-${{steps.names.outputs.suffix}}.dfu) - [☁️ Web/App updater](https://lab.flipper.net/?url=https://update.flipperzero.one/builds/firmware/${{steps.names.outputs.branch_name}}/flipper-z-${{steps.names.outputs.default_target}}-update-${{steps.names.outputs.suffix}}.tgz&channel=${{steps.names.outputs.branch_name}}&version=${{steps.names.outputs.commit_sha}}) - [📊 Size report](https://fw-reports.flipp.dev/?branch=${{steps.names.outputs.branch_name}}) edit-mode: replace - name: 'SDK submission to staging catalog' if: ${{ steps.names.outputs.event_type == 'tag' && matrix.target == env.DEFAULT_TARGET }} uses: ./.github/actions/submit_sdk with: catalog-url: ${{ secrets.CATALOG_STAGING_URL }} catalog-api-token: ${{ secrets.CATALOG_STAGING_API_TOKEN }} firmware-api: ${{ steps.build-fw.outputs.firmware_api }} firmware-target: ${{ matrix.target }} firmware-version: ${{ steps.names.outputs.suffix }} - name: 'SDK submission to prod catalog' if: ${{ steps.names.outputs.event_type == 'tag' && matrix.target == env.DEFAULT_TARGET }} uses: ./.github/actions/submit_sdk with: catalog-url: ${{ secrets.CATALOG_URL }} catalog-api-token: ${{ secrets.CATALOG_API_TOKEN }} firmware-api: ${{ steps.build-fw.outputs.firmware_api }} firmware-target: ${{ matrix.target }} firmware-version: ${{ steps.names.outputs.suffix }} ================================================ FILE: .github/workflows/build_compact.yml ================================================ name: 'Compact build' on: pull_request: env: FBT_TOOLCHAIN_PATH: /runner/_work FBT_GIT_SUBMODULE_SHALLOW: 1 GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} jobs: compact: runs-on: [self-hosted, FlipperZeroShell] strategy: fail-fast: false matrix: target: [f7, f18] steps: - name: 'Wipe workspace' run: find ./ -mount -maxdepth 1 -exec rm -rf {} \; - name: 'Checkout code' uses: actions/checkout@v4 with: fetch-depth: 1 submodules: false ref: ${{ github.event.pull_request.head.sha }} - name: 'Get commit details' run: | if [[ ${{ github.event_name }} == 'pull_request' ]]; then TYPE="pull" elif [[ "${{ github.ref }}" == "refs/tags/"* ]]; then TYPE="tag" else TYPE="other" fi python3 scripts/get_env.py "--event_file=${{ github.event_path }}" "--type=$TYPE" || cat "${{ github.event_path }}" - name: 'Build the firmware' id: build-fw run: | set -e TARGET="$(echo '${{ matrix.target }}' | sed 's/f//')"; \ ./fbt TARGET_HW=$TARGET DEBUG=0 COMPACT=1 fap_dist updater_package echo "sdk-file=$(ls dist/${{ matrix.target }}-*/flipper-z-${{ matrix.target }}-sdk-*.zip)" >> $GITHUB_OUTPUT echo "hw-target-code=$TARGET" >> $GITHUB_OUTPUT - name: Deploy uFBT with SDK uses: flipperdevices/flipperzero-ufbt-action@v0.1 with: task: setup sdk-file: ${{ steps.build-fw.outputs.sdk-file }} sdk-hw-target: ${{ steps.build-fw.outputs.hw-target-code }} - name: Build test app with SDK run: | mkdir testapp cd testapp ufbt create APPID=testapp ufbt - name: Build example & external apps with uFBT run: | for appdir in 'applications/examples'; do for app in $(find "$appdir" -maxdepth 1 -mindepth 1 -type d); do pushd $app TARGETS_FAM=$(grep "targets" application.fam || echo "${{ matrix.target }}") if ! grep -q "${{ matrix.target }}" <<< $TARGETS_FAM ; then echo Skipping unsupported app: $app popd continue fi echo Building $app ufbt popd done done ## Uncomment this for a single job that will run only if all targets are built successfully # report-status: # name: Report status # needs: [compact] # if: always() && !contains(needs.*.result, 'failure') # runs-on: [self-hosted, FlipperZeroShell] # steps: # - run: echo "All good ✨" ; ================================================ FILE: .github/workflows/docs.yml ================================================ name: 'Generate documentation with Doxygen' on: push: branches: - dev pull_request: env: TARGETS: f7 DEFAULT_TARGET: f7 GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} jobs: check-secret: if: ${{ github.event.pull_request.head.repo.fork == false }} runs-on: ubuntu-latest outputs: s3-valid-config: ${{ steps.check.outputs.s3-valid-config }} steps: - name: 'Check if S3 key exists' id: check run: | if [[ -z "${{ secrets.FW_DOCS_AWS_ACCESS_KEY }}" || -z "${{ secrets.FW_DOCS_AWS_SECRET_KEY }}" || -z "${{ secrets.FW_DOCS_AWS_BUCKET }}" ]]; then echo "s3-valid-config=false" >> $GITHUB_OUTPUT; else echo "s3-valid-config=true" >> $GITHUB_OUTPUT; fi doxygen: if: ${{ github.event.pull_request.head.repo.fork == false }} runs-on: ubuntu-latest needs: check-secret steps: - name: 'Wipe workspace' run: find ./ -mount -maxdepth 1 -exec rm -rf {} \; - name: 'Checkout code' uses: actions/checkout@v4 with: submodules: true fetch-depth: 1 ref: ${{ github.event.pull_request.head.sha }} - name: 'Get commit details' id: names run: | if [[ ${{ github.event_name }} == 'pull_request' ]]; then TYPE="pull" elif [[ "${{ github.ref }}" == "refs/tags/"* ]]; then TYPE="tag" else TYPE="other" fi python3 scripts/get_env.py "--event_file=${{ github.event_path }}" "--type=$TYPE" - name: install-doxygen uses: AdarshRawat1/Install-Doxygen@v1.0 with: version: "1.12.0" - name: 'Generate documentation' run: ./fbt doxygen - name: 'Upload documentation' if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/dev' && needs.check-secret.outputs.s3-valid-config == 'true' }} uses: jakejarvis/s3-sync-action@v0.5.1 env: AWS_S3_BUCKET: "${{ secrets.FW_DOCS_AWS_BUCKET }}" AWS_ACCESS_KEY_ID: "${{ secrets.FW_DOCS_AWS_ACCESS_KEY }}" AWS_SECRET_ACCESS_KEY: "${{ secrets.FW_DOCS_AWS_SECRET_KEY }}" AWS_REGION: "${{ secrets.FW_DOCS_AWS_REGION }}" SOURCE_DIR: "./documentation/doxygen/build/html" DEST_DIR: "${{steps.names.outputs.branch_name}}" with: args: "--delete" ================================================ FILE: .github/workflows/lint_and_submodule_check.yml ================================================ name: 'Lint sources & check submodule integrity' on: pull_request: env: TARGETS: f7 FBT_TOOLCHAIN_PATH: /runner/_work SET_GH_OUTPUT: 1 jobs: lint_sources_check_submodules: runs-on: [self-hosted, FlipperZeroShell] steps: - name: 'Wipe workspace' run: find ./ -mount -maxdepth 1 -exec rm -rf {} \; - name: 'Checkout code' uses: actions/checkout@v4 with: fetch-depth: 2 ref: ${{ github.sha }} - name: 'Check protobuf branch' run: | git submodule update --init; SUB_PATH="assets/protobuf"; SUB_BRANCH="dev"; SUB_COMMITS_MIN=40; cd "$SUB_PATH"; SUBMODULE_HASH="$(git rev-parse HEAD)"; BRANCHES=$(git branch -r --contains "$SUBMODULE_HASH"); COMMITS_IN_BRANCH="$(git rev-list --count dev)"; if [ $COMMITS_IN_BRANCH -lt $SUB_COMMITS_MIN ]; then echo "name=fails::error" >> $GITHUB_OUTPUT; echo "::error::Error: Too few commits in $SUB_BRANCH of submodule $SUB_PATH: $COMMITS_IN_BRANCH(expected $SUB_COMMITS_MIN+)"; exit 1; fi if ! grep -q "/$SUB_BRANCH" <<< "$BRANCHES"; then echo "name=fails::error" >> $GITHUB_OUTPUT; echo "::error::Error: Submodule $SUB_PATH is not on branch $SUB_BRANCH"; exit 1; fi - name: 'Check for new TODOs' id: check_todos if: github.event_name == 'pull_request' run: | set +e; git diff --unified=0 --no-color ${{ github.event.pull_request.base.sha }} ${{ github.sha }} | grep -E '^\+' | grep -i -E '(TODO|HACK|FIXME|XXX)[ :]' | grep -v -- '-nofl' > lines.log; MISSING_TICKETS=$( grep -v -E 'FL-[0-9]+' lines.log ); if [ -n "$MISSING_TICKETS" ]; then echo "Error: Missing ticket number in \`TODO\` comment(s)" >> $GITHUB_STEP_SUMMARY; echo "\`\`\`" >> $GITHUB_STEP_SUMMARY; echo "$MISSING_TICKETS" >> $GITHUB_STEP_SUMMARY; echo "\`\`\`" >> $GITHUB_STEP_SUMMARY; echo "Error: Missing issue number in comment(s):"; echo "$MISSING_TICKETS"; exit 1; else echo "No new TODOs without tickets found" >> $GITHUB_STEP_SUMMARY; fi - name: 'Check Python code formatting' id: syntax_check_py if: always() run: | set +e; ./fbt -s lint_py 2>&1 | tee lint-py.log; if [ "${PIPESTATUS[0]}" -ne 0 ]; then # Save multiline output echo "errors=1" >> $GITHUB_OUTPUT; printf "Python Lint errors:\n\`\`\`\n" >> $GITHUB_STEP_SUMMARY; echo "$(cat lint-py.log)" >> $GITHUB_STEP_SUMMARY; printf "\n\`\`\`\n" >> $GITHUB_STEP_SUMMARY; exit 1; else echo "Python Lint: all good ✨" >> $GITHUB_STEP_SUMMARY; fi - name: 'Check C++ code formatting' id: syntax_check_cpp if: always() run: | set +e; ./fbt -s lint 2>&1 | tee lint-cpp.log; if [ "${PIPESTATUS[0]}" -ne 0 ]; then # Save multiline output echo "errors=1" >> $GITHUB_OUTPUT; printf "C Lint errors:\n\`\`\`\n" >> $GITHUB_STEP_SUMMARY; echo "$(cat lint-cpp.log)" >> $GITHUB_STEP_SUMMARY; printf "\n\`\`\`\n" >> $GITHUB_STEP_SUMMARY; exit 1; else echo "C Lint: all good ✨" >> $GITHUB_STEP_SUMMARY; fi - name: 'Check image assets' if: always() run: | set +e; ./fbt -s lint_img 2>&1 | tee lint-assets.log; if [ "${PIPESTATUS[0]}" -ne 0 ]; then # Save multiline output echo "errors=1" >> $GITHUB_OUTPUT; printf "Image Lint errors:\n\`\`\`\n" >> $GITHUB_STEP_SUMMARY; echo "$(cat lint-assets.log)" >> $GITHUB_STEP_SUMMARY; printf "\n\`\`\`\n" >> $GITHUB_STEP_SUMMARY; exit 1; else echo "Image Lint: all good ✨" >> $GITHUB_STEP_SUMMARY; fi - name: Report code formatting errors if: ( steps.syntax_check_py.outputs.errors || steps.syntax_check_cpp.outputs.errors ) && github.event.pull_request run: | echo "Code formatting errors found"; echo "Please run './fbt format' or './fbt format_py' to fix them"; exit 1; ================================================ FILE: .github/workflows/merge_report.yml ================================================ name: 'Check FL ticket in PR name' on: push: branches: - dev env: FBT_TOOLCHAIN_PATH: /runner/_work GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} jobs: merge_report: runs-on: [self-hosted, FlipperZeroShell] steps: - name: 'Wipe workspace' run: find ./ -mount -maxdepth 1 -exec rm -rf {} \; - name: 'Checkout code' uses: actions/checkout@v4 with: fetch-depth: 1 ref: ${{ github.event.pull_request.head.sha }} - name: 'Get commit details' run: | if [[ ${{ github.event_name }} == 'pull_request' ]]; then TYPE="pull" elif [[ "${{ github.ref }}" == "refs/tags/"* ]]; then TYPE="tag" else TYPE="other" fi python3 scripts/get_env.py "--event_file=${{ github.event_path }}" "--type=$TYPE" || cat "${{ github.event_path }}" - name: 'Check ticket and report' run: | source scripts/toolchain/fbtenv.sh python3 -m pip install slack_sdk python3 scripts/merge_report_qa.py \ ${{ secrets.QA_REPORT_SLACK_TOKEN }} \ ${{ secrets.QA_REPORT_SLACK_CHANNEL }} ================================================ FILE: .github/workflows/pvs_studio.yml ================================================ name: 'Static C/C++ analysis with PVS-Studio' on: push: branches: - dev pull_request: env: TARGETS: f7 DEFAULT_TARGET: f7 FBT_TOOLCHAIN_PATH: /runner/_work FBT_GIT_SUBMODULE_SHALLOW: 1 GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} jobs: analyse_c_cpp: if: ${{ !github.event.pull_request.head.repo.fork }} runs-on: [self-hosted, FlipperZeroShell] steps: - name: 'Wipe workspace' run: find ./ -mount -maxdepth 1 -exec rm -rf {} \; - name: 'Checkout code' uses: actions/checkout@v4 with: fetch-depth: 1 ref: ${{ github.event.pull_request.head.sha }} - name: 'Get commit details' id: names run: | if [[ ${{ github.event_name }} == 'pull_request' ]]; then TYPE="pull" elif [[ "${{ github.ref }}" == "refs/tags/"* ]]; then TYPE="tag" else TYPE="other" fi python3 scripts/get_env.py "--event_file=${{ github.event_path }}" "--type=$TYPE" || cat "${{ github.event_path }}" - name: 'Supply PVS credentials' run: | pvs-studio-analyzer credentials ${{ secrets.PVS_STUDIO_CREDENTIALS }} - name: 'Convert PVS-Studio output to html and detect warnings' id: pvs-warn run: | WARNINGS=0 ./fbt COMPACT=1 PVSNOBROWSER=1 firmware_pvs || WARNINGS=1 echo "warnings=${WARNINGS}" >> $GITHUB_OUTPUT if [[ $WARNINGS -ne 0 ]]; then echo "report-url=https://pvs.flipp.dev/${{steps.names.outputs.branch_name}}/${{steps.names.outputs.default_target}}-${{steps.names.outputs.suffix}}/index.html" >> $GITHUB_OUTPUT fi - name: 'Upload report' if: ${{ !github.event.pull_request.head.repo.fork && (steps.pvs-warn.outputs.warnings != 0) }} uses: prewk/s3-cp-action@v2 with: aws_s3_endpoint: "${{ secrets.PVS_AWS_ENDPOINT }}" aws_access_key_id: "${{ secrets.PVS_AWS_ACCESS_KEY }}" aws_secret_access_key: "${{ secrets.PVS_AWS_SECRET_KEY }}" source: "./build/f7-firmware-DC/pvsreport" dest: "s3://${{ secrets.PVS_AWS_BUCKET }}/${{steps.names.outputs.branch_name}}/${{steps.names.outputs.default_target}}-${{steps.names.outputs.suffix}}/" flags: "--recursive --acl public-read" - name: 'Find Previous Comment' if: ${{ !github.event.pull_request.head.repo.fork && github.event.pull_request && (steps.pvs-warn.outputs.warnings != 0) }} uses: peter-evans/find-comment@v3 id: fc with: issue-number: ${{ github.event.pull_request.number }} comment-author: 'github-actions[bot]' body-includes: 'PVS-Studio report for commit' - name: 'Create or update comment' if: ${{ !github.event.pull_request.head.repo.fork && github.event.pull_request && (steps.pvs-warn.outputs.warnings != 0) }} uses: peter-evans/create-or-update-comment@v4 with: comment-id: ${{ steps.fc.outputs.comment-id }} issue-number: ${{ github.event.pull_request.number }} body: | **PVS-Studio report for commit `${{steps.names.outputs.commit_sha}}`:** - [Report](${{ steps.pvs-warn.outputs.report-url }}) edit-mode: replace - name: 'Raise exception' if: ${{ steps.pvs-warn.outputs.warnings != 0 }} run: | echo "Please fix all PVS warnings before merge" echo "Report: ${{ steps.pvs-warn.outputs.report-url }}" echo "[PVS report](${{ steps.pvs-warn.outputs.report-url }})" >> $GITHUB_STEP_SUMMARY exit 1 ================================================ FILE: .github/workflows/reindex.yml ================================================ name: 'Post-release hooks' on: release: types: [prereleased, released] jobs: reindex: name: 'Post-release hooks' runs-on: [self-hosted, FlipperZeroShell] steps: - name: 'Checkout code' uses: actions/checkout@v4 - name: 'Trigger reindex' run: | curl --fail -L -H "Token: ${{ secrets.INDEXER_TOKEN }}" \ "${{ secrets.INDEXER_URL }}"/firmware/reindex; - name: 'Send release notification' if: ${{ github.event.action == 'released' }} run: | echo '${{ secrets.FIREBASE_TOKEN }}' > firebase-token.json; python3 -m pip install firebase-admin==6.4.0; python3 scripts/send_firebase_notification.py \ "--version=${{ github.event.release.name }}" \ "--token=firebase-token.json"; - name: 'Remove firebase token' if: always() run: | rm -rf firebase-token.json; ================================================ FILE: .github/workflows/unit_tests.yml ================================================ name: 'Unit tests' on: pull_request: env: TARGETS: f7 DEFAULT_TARGET: f7 FBT_TOOLCHAIN_PATH: /opt/ FBT_GIT_SUBMODULE_SHALLOW: 1 jobs: run_units_on_bench: runs-on: [ self-hosted, FlipperZeroTest ] steps: - name: Checkout code uses: actions/checkout@v4 with: fetch-depth: 1 ref: ${{ github.event.pull_request.head.sha }} - name: 'Flash unit tests firmware' id: flashing if: success() timeout-minutes: 5 run: | source scripts/toolchain/fbtenv.sh ./fbt resources firmware_latest flash LIB_DEBUG=1 FIRMWARE_APP_SET=unit_tests FORCE=1 - name: 'Copy assets and unit data, reboot and wait for flipper' id: copy if: steps.flashing.outcome == 'success' timeout-minutes: 5 run: | source scripts/toolchain/fbtenv.sh python3 scripts/testops.py -t=15 await_flipper python3 scripts/storage.py -f send build/latest/resources /ext python3 scripts/storage.py -f send /region_data /ext/.int/.region_data python3 scripts/power.py reboot python3 scripts/testops.py -t=30 await_flipper - name: 'Run units and validate results' id: run_units if: steps.copy.outcome == 'success' timeout-minutes: 5 run: | source scripts/toolchain/fbtenv.sh python3 scripts/testops.py run_units - name: 'Upload test results' if: failure() && steps.flashing.outcome == 'success' && steps.run_units.outcome != 'skipped' uses: actions/upload-artifact@v4 with: name: unit-tests_output path: unit_tests*.txt - name: 'Check GDB output' if: failure() && steps.flashing.outcome == 'success' run: | ./fbt gdb_trace_all LIB_DEBUG=1 FIRMWARE_APP_SET=unit_tests FORCE=1 ================================================ FILE: .github/workflows/updater_test.yml ================================================ name: 'Updater test' on: pull_request: env: TARGETS: f7 DEFAULT_TARGET: f7 FBT_TOOLCHAIN_PATH: /opt/ FBT_GIT_SUBMODULE_SHALLOW: 1 jobs: test_updater_on_bench: runs-on: [self-hosted, FlipperZeroTest ] steps: - name: Checkout code uses: actions/checkout@v4 with: fetch-depth: 1 ref: ${{ github.event.pull_request.head.sha }} - name: 'Flashing target firmware' id: first_full_flash timeout-minutes: 5 run: | source scripts/toolchain/fbtenv.sh python3 scripts/testops.py -t=180 await_flipper ./fbt flash_usb_full FORCE=1 - name: 'Validating updater' id: second_full_flash timeout-minutes: 5 if: success() run: | source scripts/toolchain/fbtenv.sh python3 scripts/testops.py -t=180 await_flipper ./fbt flash_usb FORCE=1 python3 scripts/testops.py -t=180 await_flipper ================================================ FILE: .gitignore ================================================ *~ *.swp *.swo *.gdb_history *.old # LSP .cache compile_commands.json # JetBrains IDEs .idea/ # Sublime Text .sublime-project.sublime-workspace # Python VirtEnvironments .env .venv env/ venv/ # Python Byte-compiled / optimized files __pycache__/ *.py[cod] *$py.class *.pickle .obj/ bindings/ .DS_Store .mxproject Brewfile.lock.json # Kate .kateproject .kateconfig # kde .directory # SCons .sconsign.dblite # bundle output /dist # SCons build dir /build # Toolchain /toolchain # openocd output file openocd.log # PVS Studio temporary files .PVS-Studio/ PVS-Studio.log *.PVS-Studio.* .gdbinit /fbt_options_local.py # JS packages node_modules/ # cli_perf script output in case of errors /block.bin /return_block.bin ================================================ FILE: .gitmodules ================================================ [submodule "lib/mlib"] path = lib/mlib url = https://github.com/P-p-H-d/mlib.git [submodule "lib/nanopb"] path = lib/nanopb url = https://github.com/nanopb/nanopb.git [submodule "assets/protobuf"] path = assets/protobuf url = https://github.com/flipperdevices/flipperzero-protobuf.git shallow = false [submodule "lib/libusb_stm32"] path = lib/libusb_stm32 url = https://github.com/flipperdevices/libusb_stm32.git [submodule "lib/FreeRTOS-Kernel"] path = lib/FreeRTOS-Kernel url = https://github.com/FreeRTOS/FreeRTOS-Kernel.git [submodule "lib/microtar"] path = lib/microtar url = https://github.com/amachronic/microtar.git [submodule "lib/mbedtls"] path = lib/mbedtls url = https://github.com/Mbed-TLS/mbedtls.git [submodule "lib/heatshrink"] path = lib/heatshrink url = https://github.com/flipperdevices/heatshrink.git [submodule "lib/st_cmsis_device_wb"] path = lib/stm32wb_cmsis url = https://github.com/STMicroelectronics/cmsis_device_wb [submodule "lib/stm32wbxx_hal_driver"] path = lib/stm32wb_hal url = https://github.com/STMicroelectronics/stm32wbxx_hal_driver [submodule "lib/stm32wb_copro"] path = lib/stm32wb_copro url = https://github.com/flipperdevices/stm32wb_copro.git [submodule "documentation/doxygen/doxygen-awesome-css"] path = documentation/doxygen/doxygen-awesome-css url = https://github.com/jothepro/doxygen-awesome-css.git ================================================ FILE: .pvsconfig ================================================ # MLib macros we can't do much about. //-V:M_LET:1048,1044 //-V:M_EACH:1048,1044 //-V:ARRAY_DEF:760,747,568,776,729,712,654,1103 //-V:LIST_DEF:760,747,568,712,729,654,776,1103 //-V:LIST_DUAL_PUSH_DEF:524,760,774 //-V:BPTREE_DEF2:779,1086,557,773,512 //-V:DICT_DEF2:779,524,776,760,1044,1001,729,590,568,747,685,1103 //-V:ALGO_DEF:1048,747,1044 //-V:TUPLE_DEF2:524,590,1001,760 //-V:DEQUE_DEF:658,747,760 # Non-severe malloc/null pointer deref warnings //-V::522:2,3 # Warning about headers with copyleft license //-V::1042 # Potentially null argument warnings //-V:memset:575 //-V:memcpy:575 //-V:memcmp:575 //-V:strlen:575 //-V:strcpy:575 //-V:strncpy:575 //-V:strchr:575 # For loop warning on M_FOREACH //-V:for:1044 # Bitwise OR //-V:bit:792 # Do not complain about similar code //-V::525 # Common embedded development pointer operations //-V::566 //-V::1032 # Warnings about length mismatch //-V:property_value_out:666 # Model-related warnings //-V:with_view_model:1044,1048 # Examples //V_EXCLUDE_PATH applications/examples/ ================================================ FILE: .pvsoptions ================================================ --ignore-ccache -C gccarm --rules-config .pvsconfig -e lib/cmsis_core -e lib/fatfs -e lib/fnv1a-hash -e lib/FreeRTOS-Kernel -e lib/heatshrink -e lib/libusb_stm32 -e lib/mbedtls -e lib/microtar -e lib/mlib -e lib/stm32wb_cmsis -e lib/stm32wb_copro -e lib/stm32wb_hal -e lib/u8g2 -e lib/nanopb -e lib/mjs -e */arm-none-eabi/* ================================================ FILE: .sublime-project ================================================ { "folders": [ { "path": ".", } ], "settings": { "LSP": { "clangd": { "enabled": true, "initializationOptions": { // Set `"binary": "custom",` option in LSP-clangd config to use toolchain clangd "custom_command": ["toolchain/current/bin/clangd"], "clangd.compile-commands-dir": "build/latest", "clangd.header-insertion": "never", "clangd.query-driver": "**/arm-none-eabi-*", "clangd.clang-tidy": true, }, }, }, }, } ================================================ FILE: .vscode/ReadMe.md ================================================ # Visual Studio Code workspace for Flipper Zero {#vscode} ## Setup * To start developing with VSCode, run `./fbt vscode_dist` in project root. _That should only be done once_ * After that, open firmware folder in VSCode: "File" > "Open folder" For more details on fbt, see [fbt docs](../documentation/fbt.md). ## Workflow Commands for building firmware are invoked through Build menu: Ctrl+Shift+B. To attach a debugging session, first build and flash firmware, then choose your debug probe in Debug menu (Ctrl+Shift+D). Note that you have to detach debugging session before rebuilding and re-flashing firmware. ================================================ FILE: CODE_OF_CONDUCT.md ================================================ # Contributor Covenant Code of Conduct ## Our Pledge We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community. ## Our Standards Examples of behavior that contributes to a positive environment for our community include: * Demonstrating empathy and kindness toward other people * Being respectful of differing opinions, viewpoints, and experiences * Giving and gracefully accepting constructive feedback * Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience * Focusing on what is best not just for us as individuals, but for the overall community Examples of unacceptable behavior include: * The use of sexualized language or imagery, and sexual attention or advances of any kind * Trolling, insulting or derogatory comments, and personal or political attacks * Public or private harassment * Publishing others' private information, such as a physical or email address, without their explicit permission * Other conduct which could reasonably be considered inappropriate in a professional setting ## Enforcement Responsibilities Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful. Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate. ## Scope This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at hello@flipperdevices.com. All complaints will be reviewed and investigated promptly and fairly. All community leaders are obligated to respect the privacy and security of the reporter of any incident. ## Enforcement Guidelines Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct: ### 1. Correction **Community Impact**: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community. **Consequence**: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested. ### 2. Warning **Community Impact**: A violation through a single incident or series of actions. **Consequence**: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban. ### 3. Temporary Ban **Community Impact**: A serious violation of community standards, including sustained inappropriate behavior. **Consequence**: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban. ### 4. Permanent Ban **Community Impact**: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals. **Consequence**: A permanent ban from any sort of public interaction within the community. ## Attribution This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.0, available at https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. Community Impact Guidelines were inspired by [Mozilla's code of conduct enforcement ladder](https://github.com/mozilla/diversity). [homepage]: https://www.contributor-covenant.org For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations. ================================================ FILE: CODING_STYLE.md ================================================ # Intro Nice to see you reading this document, we really appreciate it. As all documents of this kind it's unable to cover everything. But it will cover general rules that we are enforcing on PR review. Also, we already have automatic rules checking and formatting, but it got its limitations and this guide is still mandatory. Some part of this project do have its own naming and coding guides. For example: assets. Take a look into `ReadMe.md` in assets folder for more details. Also, 3rd party libraries are none of our concern. And yes, this set is not final and we are open to discussion. If you want to add/remove/change something here please feel free to open new ticket. # Inspiration Our guide is inspired by, but not claiming to be compatible with: - https://www.kernel.org/doc/html/v4.10/process/coding-style.html - https://docs.unrealengine.com/en-US/Programming/Development/CodingStandard - https://webkit.org/code-style-guidelines/ # General rules ## Readability and Simplicity first Code we write is intended to be public. Avoid one-liners from hell and keep code complexity under control. Try to make code self-explanatory and add comments if needed. Leave references to standards that you are implementing. Use project wiki to document new/reverse engineered standards. ## Variable and function names must clearly define what it's doing It's ok if it will be long, but it should clearly state what it's doing, without need to dive into code. This also applies to function/method's code. Try to avoid one letter variables. ## Encapsulation Don't expose raw data, provide methods to work with it. Almost everything in flipper firmware is built around this concept. # C coding style - Tab is 4 spaces - Use `./fbt format` to reformat source code and check style guide before commit ## Naming ### Type names are PascalCase Examples: FuriHalUsb Gui SubGhzKeystore ### Functions are snake_case furi_hal_usb_init gui_add_view_port subghz_keystore_read ### File and Package name is a prefix for it's content This rule makes easier to locate types, functions and sources. For example: We have abstraction that we call `SubGhz Keystore`, so there will be: file `subghz_keystore.h` we have type `SubGhzKeystore` and function `subghz_keystore_read`. ### File names - Directories: `^[0-9A-Za-z_]+$` - File names: `^[0-9A-Za-z_]+\.[a-z]+$` - File extensions: `[ ".h", ".c", ".cpp", ".cxx", ".hpp" ]` Enforced by linter. ### Standard function/method names Suffixes: - `alloc` - allocate and init instance. C style constructor. Returns pointer to instance. - `free` - de-init and release instance. C style destructor. Takes pointer to instance. # C++ coding style Work In Progress. Use C style guide as a base. # Python coding style - Tab is 4 spaces - Use [black](https://pypi.org/project/black/) to reformat source code before commit ================================================ FILE: CONTRIBUTING.md ================================================ # Welcome to FlipperZero contributing guide Thank you for investing your time in contributing to our project! Read our [Code of Conduct](CODE_OF_CONDUCT.md) to keep our community approachable and respectable. In this guide you will get an overview of the contribution workflow from opening an issue, creating a PR, reviewing, and merging the PR. ## New contributor guide See the [ReadMe](ReadMe.md) to get an overview of the project. Here are some helpful resources to get you comfortable with open source contribution: - [Finding ways to contribute to open source on GitHub](https://docs.github.com/en/get-started/exploring-projects-on-github/finding-ways-to-contribute-to-open-source-on-github) - [Set up Git](https://docs.github.com/en/get-started/quickstart/set-up-git) - [GitHub flow](https://docs.github.com/en/get-started/quickstart/github-flow) - [Collaborating with pull requests](https://docs.github.com/en/github/collaborating-with-pull-requests) ## Getting started Before writing code and creating PR make sure that it aligns with our mission and guidelines: - All our devices are intended for research and education. - PR that contains code intended to commit crimes is not going to be accepted. - Your PR must comply with our [Coding Style](CODING_STYLE.md) - Your PR must contain code compatible with project [LICENSE](LICENSE). - PR will only be merged if it passes CI/CD. - PR will only be merged if it passes review by code owner. Feel free to ask questions in issues if you're not sure. ### Issues #### Create a new issue If you found a problem, [search if an issue already exists](https://docs.github.com/en/github/searching-for-information-on-github/searching-on-github/searching-issues-and-pull-requests#search-by-the-title-body-or-comments). If a related issue doesn't exist, you can open a new issue using a relevant [issue form](https://github.com/flipperdevices/flipperzero-firmware/issues/new/choose). #### Solve an issue Scan through our [existing issues](https://github.com/flipperdevices/flipperzero-firmware/issues) to find one that interests you. ### Make Changes 1. Fork the repository. - Using GitHub Desktop: - [Getting started with GitHub Desktop](https://docs.github.com/en/desktop/installing-and-configuring-github-desktop/getting-started-with-github-desktop) will guide you through setting up Desktop. - Once Desktop is set up, you can use it to [fork the repo](https://docs.github.com/en/desktop/contributing-and-collaborating-using-github-desktop/cloning-and-forking-repositories-from-github-desktop)! - Using the command line: - [Fork the repo](https://docs.github.com/en/github/getting-started-with-github/fork-a-repo#fork-an-example-repository) so that you can make your changes without affecting the original project until you're ready to merge them. 2. Install build requirements 3. Create a working branch and start with your changes! ### Commit your update Commit the changes once you are happy with them. Make sure that code compilation is not broken and passes tests. Check syntax and formatting. ### Pull Request When you're done making the changes, open a pull request, often referred to as a PR. - Fill out the "Ready for review" template, so we can review your PR. This template helps reviewers understand your changes and the purpose of your pull request. - Don't forget to [link PR to issue](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue) if you are solving one. - Enable the checkbox to [allow maintainer edits](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/allowing-changes-to-a-pull-request-branch-created-from-a-fork) so the branch can be updated for a merge. Once you submit your PR, a Docs team member will review your proposal. We may ask questions or request for additional information. - We may ask for changes to be made before a PR can be merged, either using [suggested changes](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/incorporating-feedback-in-your-pull-request) or pull request comments. You can apply suggested changes directly through the UI. You can make any other changes in your fork, then commit them to your branch. - As you update your PR and apply changes, mark each conversation as [resolved](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/commenting-on-a-pull-request#resolving-conversations). - If you run into any merge issues, checkout this [git tutorial](https://lab.github.com/githubtraining/managing-merge-conflicts) to help you resolve merge conflicts and other issues. ### Your PR is merged! Congratulations :tada::tada: The FlipperDevices team thanks you :sparkles:. ================================================ FILE: LICENSE ================================================ 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 . ================================================ FILE: ReadMe.md ================================================ A pixel art of a Dophin with text: Flipper Zero Official Repo # Flipper Zero Firmware - [Flipper Zero Official Website](https://flipperzero.one). A simple way to explain to your friends what Flipper Zero can do. - [Flipper Zero Firmware Update](https://flipperzero.one/update). Improvements for your dolphin: latest firmware releases, upgrade tools for PC and mobile devices. - [User Documentation](https://docs.flipper.net). Learn more about your dolphin: specs, usage guides, and anything you want to ask. - [Developer Documentation](https://developer.flipper.net/flipperzero/doxygen). Dive into the Flipper Zero Firmware source code: build system, firmware structure, and more. # Contributing Our main goal is to build a healthy and sustainable community around Flipper, so we're open to any new ideas and contributions. We also have some rules and taboos here, so please read this page and our [Code of Conduct](/CODE_OF_CONDUCT.md) carefully. ## I need help The best place to search for answers is our [User Documentation](https://docs.flipper.net). If you can't find the answer there, check our [Discord Server](https://flipp.dev/discord) or our [Forum](https://forum.flipperzero.one/). If you want to contribute to the firmware development or modify it for your own needs, you can also check our [Developer Documentation](https://developer.flipper.net/flipperzero/doxygen). ## I want to report an issue If you've found an issue and want to report it, please check our [Issues](https://github.com/flipperdevices/flipperzero-firmware/issues) page. Make sure the description contains information about the firmware version you're using, your platform, and a clear explanation of the steps to reproduce the issue. ## I want to contribute code Before opening a PR, please confirm that your changes must be contained in the firmware. Many ideas can easily be implemented as external applications and published in the [Flipper Application Catalog](https://github.com/flipperdevices/flipper-application-catalog). If you are unsure, reach out to us on the [Discord Server](https://flipp.dev/discord) or the [Issues](https://github.com/flipperdevices/flipperzero-firmware/issues) page, and we'll help you find the right place for your code. Also, please read our [Contribution Guide](/CONTRIBUTING.md) and our [Coding Style](/CODING_STYLE.md), and make sure your code is compatible with our [Project License](/LICENSE). Finally, open a [Pull Request](https://github.com/flipperdevices/flipperzero-firmware/pulls) and make sure that CI/CD statuses are all green. # Development Flipper Zero Firmware is written in C, with some bits and pieces written in C++ and armv7m assembly languages. An intermediate level of C knowledge is recommended for comfortable programming. C, C++, and armv7m assembly languages are supported for Flipper applications. # Firmware RoadMap [Firmware RoadMap Miro Board](https://miro.com/app/board/uXjVO_3D6xU=/) ## Requirements Supported development platforms: - Windows 10+ with PowerShell and Git (x86_64) - macOS 12+ with Command Line tools (x86_64, arm64) - Ubuntu 20.04+ with build-essential and Git (x86_64) Supported in-circuit debuggers (optional but highly recommended): - [Flipper Zero Wi-Fi Development Board](https://shop.flipperzero.one/products/wifi-devboard) - CMSIS-DAP compatible: Raspberry Pi Debug Probe and etc... - ST-Link (v2, v3, v3mods) - J-Link Flipper Build System will take care of all the other dependencies. ## Cloning source code Make sure you have enough space and clone the source code: ```shell git clone --recursive https://github.com/flipperdevices/flipperzero-firmware.git ``` ## Building Build firmware using Flipper Build Tool: ```shell ./fbt ``` ## Flashing firmware using an in-circuit debugger Connect your in-circuit debugger to your Flipper and flash firmware using Flipper Build Tool: ```shell ./fbt flash ``` ## Flashing firmware using USB Make sure your Flipper is on, and your firmware is functioning. Connect your Flipper with a USB cable and flash firmware using Flipper Build Tool: ```shell ./fbt flash_usb ``` ## Documentation - [Flipper Build Tool](/documentation/fbt.md) - building, flashing, and debugging Flipper software - [Applications](/documentation/AppsOnSDCard.md), [Application Manifest](/documentation/AppManifests.md) - developing, building, deploying, and debugging Flipper applications - [Hardware combos and Un-bricking](/documentation/KeyCombo.md) - recovering your Flipper from the most nasty situations - [Flipper File Formats](/documentation/file_formats) - everything about how Flipper stores your data and how you can work with it - [Universal Remotes](/documentation/UniversalRemotes.md) - contributing your infrared remote to the universal remote database - [Firmware Roadmap](https://miro.com/app/board/uXjVO_3D6xU=/) - And much more in the [Developer Documentation](https://developer.flipper.net/flipperzero/doxygen) # Project structure - `applications` - Applications and services used in firmware - `applications_users` - Place for your additional applications and services - `assets` - Assets used by applications and services - `documentation` - Documentation generation system configs and input files - `furi` - Furi Core: OS-level primitives and helpers - `lib` - Our and 3rd party libraries, drivers, tools and etc... - `site_scons` - Build system configuration and modules - `scripts` - Supplementary scripts and various python libraries - `targets` - Firmware targets: platform specific code Also, see `ReadMe.md` files inside those directories for further details. # Links - Discord: [flipp.dev/discord](https://flipp.dev/discord) - Website: [flipperzero.one](https://flipperzero.one) - Forum: [forum.flipperzero.one](https://forum.flipperzero.one/) - Kickstarter: [kickstarter.com](https://www.kickstarter.com/projects/flipper-devices/flipper-zero-tamagochi-for-hackers) ## SAST Tools - [PVS-Studio](https://pvs-studio.com/pvs-studio/?utm_source=website&utm_medium=github&utm_campaign=open_source) - static analyzer for C, C++, C#, and Java code. ================================================ FILE: SConstruct ================================================ # # Main Flipper Build System entry point # # This file is evaluated by scons (the build system) every time fbt is invoked. # Scons constructs all referenced environments & their targets' dependency # trees on startup. So, to keep startup time as low as possible, we're hiding # construction of certain targets behind command-line options. import os from fbt.util import open_browser_action DefaultEnvironment(tools=[]) EnsurePythonVersion(3, 8) # Progress(["OwO\r", "owo\r", "uwu\r", "owo\r"], interval=15) # This environment is created only for loading options & validating file/dir existence fbt_variables = SConscript("site_scons/commandline.scons") cmd_environment = Environment( toolpath=["#/scripts/fbt_tools"], tools=[ ("fbt_help", {"vars": fbt_variables}), ], variables=fbt_variables, ) # Building basic environment - tools, utility methods, cross-compilation # settings, gcc flags for Cortex-M4, basic builders and more coreenv = SConscript( "site_scons/environ.scons", exports={"VAR_ENV": cmd_environment}, toolpath=["#/scripts/fbt_tools"], ) SConscript("site_scons/cc.scons", exports={"ENV": coreenv}) # Create a separate "dist" environment and add construction envs to it distenv = coreenv.Clone( tools=[ "fbt_dist", "fbt_debugopts", "openocd", "blackmagic", "jflash", "doxygen", "textfile", ], ENV=os.environ, UPDATE_BUNDLE_DIR="dist/${DIST_DIR}/f${TARGET_HW}-update-${DIST_SUFFIX}", ) firmware_env = distenv.AddFwProject( base_env=coreenv, fw_type="firmware", fw_env_key="FW_ENV", ) # If enabled, initialize updater-related targets if GetOption("fullenv") or any( filter(lambda target: "updater" in target or "flash_usb" in target, BUILD_TARGETS) ): updater_env = distenv.AddFwProject( base_env=coreenv, fw_type="updater", fw_env_key="UPD_ENV", ) # Target for self-update package dist_basic_arguments = [ "${ARGS}", "--bundlever", "${UPDATE_VERSION_STRING}", ] dist_radio_arguments = [ "--radio", "${ROOT_DIR.abspath}/${COPRO_STACK_BIN_DIR}/${COPRO_STACK_BIN}", "--radiotype", "${COPRO_STACK_TYPE}", "${COPRO_DISCLAIMER}", "--obdata", "${ROOT_DIR.abspath}/${COPRO_OB_DATA}", "--stackversion", "${COPRO_CUBE_VERSION}", ] dist_resource_arguments = [ "-r", firmware_env.subst("${RESOURCES_ROOT}"), ] dist_splash_arguments = ( [ "--splash", distenv.subst("assets/slideshow/$UPDATE_SPLASH"), ] if distenv["UPDATE_SPLASH"] else [] ) selfupdate_dist = distenv.DistCommand( "updater_package", (distenv["DIST_DEPENDS"], firmware_env["FW_RESOURCES_MANIFEST"]), DIST_EXTRA=[ *dist_basic_arguments, *dist_radio_arguments, *dist_resource_arguments, *dist_splash_arguments, ], ) selfupdate_min_dist = distenv.DistCommand( "updater_minpackage", distenv["DIST_DEPENDS"], DIST_EXTRA=dist_basic_arguments, ) # Updater debug distenv.PhonyTarget( "updater_debug", "${GDBPYCOM}", source=updater_env["FW_ELF"], GDBREMOTE="${OPENOCD_GDB_PIPE}", ) distenv.PhonyTarget( "updater_blackmagic", "${GDBPYCOM}", source=updater_env["FW_ELF"], GDBOPTS=distenv.subst("$GDBOPTS_BLACKMAGIC"), GDBREMOTE="${BLACKMAGIC_ADDR}", ) # Installation over USB & CLI usb_update_package = distenv.AddUsbFlashTarget( "#build/usbinstall.flag", (firmware_env["FW_RESOURCES_MANIFEST"], selfupdate_dist), ) distenv.Alias("flash_usb_full", usb_update_package) usb_minupdate_package = distenv.AddUsbFlashTarget( "#build/minusbinstall.flag", (selfupdate_min_dist,) ) distenv.Alias("flash_usb", usb_minupdate_package) # Target for copying & renaming binaries to dist folder basic_dist = distenv.DistCommand("fw_dist", distenv["DIST_DEPENDS"]) distenv.Default(basic_dist) dist_dir_name = distenv.GetProjetDirName() 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( dist_dir.Dir("debug_elf"), list(app_artifact.debug for app_artifact in external_app_list), ), *( distenv.Install( dist_dir.File(dist_entry[1]).dir, app_artifact.compact, ) 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 external_app_list), ) Alias("fap_dist", fap_dist) # Copy all faps to device fap_deploy = distenv.PhonyTarget( "fap_deploy", Action( [ [ "${PYTHON3}", "${FBT_SCRIPT_DIR}/storage.py", "-p", "${FLIP_PORT}", "send", "${SOURCE}", "/ext/apps", "${ARGS}", ] ] ), source=firmware_env.Dir(("${RESOURCES_ROOT}/apps")), ) Depends(fap_deploy, firmware_env["FW_RESOURCES_MANIFEST"]) # Target for bundling core2 package for qFlipper copro_dist = distenv.CoproBuilder( "#/build/core2_firmware.tgz", [], ) distenv.AlwaysBuild(copro_dist) distenv.Alias("copro_dist", copro_dist) firmware_flash = distenv.AddFwFlashTarget(firmware_env) distenv.Alias("flash", firmware_flash) # To be implemented in fwflash.py firmware_jflash = distenv.AddJFlashTarget(firmware_env) distenv.Alias("jflash", firmware_jflash) distenv.PhonyTarget( "gdb_trace_all", [["${GDB}", "${GDBOPTS}", "${SOURCES}", "${GDBFLASH}"]], source=firmware_env["FW_ELF"], GDBOPTS="${GDBOPTS_BASE}", GDBREMOTE="${OPENOCD_GDB_PIPE}", GDBFLASH=[ "-ex", "thread apply all bt", "-ex", "quit", ], ) # Debugging firmware firmware_debug = distenv.PhonyTarget( "debug", "${GDBPYCOM}", source=firmware_env["FW_ELF"], GDBOPTS="${GDBOPTS_BASE}", GDBREMOTE="${OPENOCD_GDB_PIPE}", FBT_FAP_DEBUG_ELF_ROOT=firmware_env["FBT_FAP_DEBUG_ELF_ROOT"], ) distenv.Depends(firmware_debug, firmware_flash) firmware_blackmagic = distenv.PhonyTarget( "blackmagic", "${GDBPYCOM}", source=firmware_env["FW_ELF"], GDBOPTS="${GDBOPTS_BASE} ${GDBOPTS_BLACKMAGIC}", GDBREMOTE="${BLACKMAGIC_ADDR}", FBT_FAP_DEBUG_ELF_ROOT=firmware_env["FBT_FAP_DEBUG_ELF_ROOT"], ) distenv.Depends(firmware_blackmagic, firmware_flash) # Debug alien elf debug_other_opts = [ "-ex", "source ${FBT_DEBUG_DIR}/PyCortexMDebug/PyCortexMDebug.py", # "-ex", # "source ${FBT_DEBUG_DIR}/FreeRTOS/FreeRTOS.py", "-ex", "source ${FBT_DEBUG_DIR}/flipperversion.py", "-ex", "fw-version", ] distenv.PhonyTarget( "debug_other", "${GDBPYCOM}", GDBOPTS="${GDBOPTS_BASE}", GDBREMOTE="${OPENOCD_GDB_PIPE}", GDBPYOPTS=debug_other_opts, ) distenv.PhonyTarget( "debug_other_blackmagic", "${GDBPYCOM}", GDBOPTS="${GDBOPTS_BASE} ${GDBOPTS_BLACKMAGIC}", GDBREMOTE="${BLACKMAGIC_ADDR}", GDBPYOPTS=debug_other_opts, ) # Just start OpenOCD distenv.PhonyTarget( "openocd", [["${OPENOCDCOM}", "${ARGS}"]], ) # Linter distenv.PhonyTarget( "lint", [ [ "${PYTHON3}", "${FBT_SCRIPT_DIR}/lint.py", "check", "${LINT_SOURCES}", "${ARGS}", ] ], LINT_SOURCES=[n.srcnode() for n in firmware_env["LINT_SOURCES"]], ) distenv.PhonyTarget( "format", [ [ "${PYTHON3}", "${FBT_SCRIPT_DIR}/lint.py", "format", "${LINT_SOURCES}", "${ARGS}", ] ], LINT_SOURCES=[n.srcnode() for n in firmware_env["LINT_SOURCES"]], ) # PY_LINT_SOURCES contains recursively-built modules' SConscript files # Here we add additional Python files residing in repo root firmware_env.Append( PY_LINT_SOURCES=[ # Py code folders "site_scons", "scripts", "applications", "applications_user", "assets", "targets", # Extra files "SConstruct", "firmware.scons", "fbt_options.py", ], IMG_LINT_SOURCES=[ # Image assets "applications", "assets", ], ) black_commandline = [ [ "@${PYTHON3}", "-m", "black", "${PY_BLACK_ARGS}", "${PY_LINT_SOURCES}", "${ARGS}", ] ] black_base_args = [ "--include", '"(\\.scons|\\.py|SConscript|SConstruct|\\.fam)$"', ] distenv.PhonyTarget( "lint_py", black_commandline, PY_BLACK_ARGS=[ "--check", "--diff", *black_base_args, ], PY_LINT_SOURCES=firmware_env["PY_LINT_SOURCES"], ) distenv.PhonyTarget( "format_py", black_commandline, PY_BLACK_ARGS=black_base_args, PY_LINT_SOURCES=firmware_env["PY_LINT_SOURCES"], ) # Image assets linting distenv.PhonyTarget( "lint_img", [ [ "${PYTHON3}", "${FBT_SCRIPT_DIR}/imglint.py", "check", "${IMG_LINT_SOURCES}", "${ARGS}", ] ], IMG_LINT_SOURCES=firmware_env["IMG_LINT_SOURCES"], ) distenv.PhonyTarget( "format_img", [ [ "${PYTHON3}", "${FBT_SCRIPT_DIR}/imglint.py", "format", "${IMG_LINT_SOURCES}", "${ARGS}", ] ], IMG_LINT_SOURCES=firmware_env["IMG_LINT_SOURCES"], ) distenv.Alias("lint_all", ["lint", "lint_py", "lint_img"]) distenv.Alias("format_all", ["format", "format_py", "format_img"]) # Start Flipper CLI via PySerial's miniterm distenv.PhonyTarget( "cli", [ [ "${PYTHON3}", "${FBT_SCRIPT_DIR}/serial_cli.py", "-p", "${FLIP_PORT}", "${ARGS}", ] ], ) # Measure CLI loopback performance distenv.PhonyTarget( "cli_perf", [ [ "${PYTHON3}", "${FBT_SCRIPT_DIR}/serial_cli_perf.py", "-p", "${FLIP_PORT}", "${ARGS}", ] ], ) # Update WiFi devboard firmware with release channel distenv.PhonyTarget( "devboard_flash", [ [ "${PYTHON3}", "${FBT_SCRIPT_DIR}/wifi_board.py", "${ARGS}", ] ], ) # Find blackmagic probe distenv.PhonyTarget( "get_blackmagic", "@echo $( ${BLACKMAGIC_ADDR} $)", ) # Find STLink probe ids distenv.PhonyTarget( "get_stlink", distenv.Action( lambda **_: distenv.GetDevices(), None, ), ) # Prepare vscode environment vscode_dist = distenv.Install( "#.vscode", [ distenv.Glob("#.vscode/example/*.json", exclude="*.tmpl"), distenv.Glob("#.vscode/example/${LANG_SERVER}/*.json"), ], ) for template_file in distenv.Glob("#.vscode/example/*.tmpl"): vscode_dist.append( distenv.Substfile( distenv.Dir("#.vscode").File(template_file.name.replace(".tmpl", "")), template_file, SUBST_DICT={ "@FBT_PLATFORM_EXECUTABLE_EXT@": ".exe" if os.name == "nt" else "" }, ) ) distenv.Precious(vscode_dist) distenv.NoClean(vscode_dist) distenv.Alias("vscode_dist", (vscode_dist, firmware_env["FW_CDB"])) # Configure shell with build tools distenv.PhonyTarget( "env", "@echo $( ${FBT_SCRIPT_DIR.abspath}/toolchain/fbtenv.sh $)", ) doxy_build = distenv.DoxyBuild( "documentation/doxygen/build/html/index.html", "documentation/doxygen/Doxyfile-awesome.cfg", doxy_env_variables={ "DOXY_SRC_ROOT": Dir(".").abspath, "DOXY_BUILD_DIR": Dir("documentation/doxygen/build").abspath, "DOXY_CONFIG_DIR": "documentation/doxygen", }, ) distenv.Alias("doxygen", doxy_build) distenv.AlwaysBuild(doxy_build) # Open generated documentation in browser distenv.PhonyTarget("doxy", open_browser_action, source=doxy_build) ================================================ FILE: applications/ReadMe.md ================================================ # Structure ## debug Applications for factory testing the Flipper. - `accessor` - Wiegand server - `battery_test_app` - Battery debug app - `blink_test` - LED blinker - `bt_debug_app` - BT test app. Requires full BT stack installed - `display_test` - Various display tests & tweaks - `file_browser_test` - Test UI for file picker - `keypad_test` - Keypad test - `lfrfid_debug` - LF RFID debug tool - `text_box_test` - UI tests - `uart_echo` - UART mode test - `unit_tests` - Unit tests - `usb_mouse` - USB HID test - `usb_test` - Other USB tests - `vibro_test` - Vibro test ## main Applications for main Flipper menu. - `archive` - Archive and file manager - `bad_usb` - Bad USB application - `gpio` - GPIO application: includes USART bridge and GPIO control - `ibutton` - iButton application, onewire keys and more - `infrared` - Infrared application, controls your IR devices - `lfrfid` - LF RFID application - `nfc` - NFC application, HF rfid, EMV and etc - `subghz` - SubGhz application, 433 fobs and etc - `u2f` - U2F Application ## services Background services providing system APIs to applications. - `applications.h` - Firmware application list header - `bt` - BLE service and application - `cli` - Console service and API - `crypto` - Crypto cli tools - `desktop` - Desktop service - `dialogs` - Dialogs service: GUI Dialogs for your app - `dolphin` - Dolphin service and supplementary apps - `gui` - GUI service and API - `input` - Input service - `loader` - Application loader service - `notification` - Notification service - `power` - Power service - `rpc` - RPC service and API - `storage` - Storage service, internal + sdcard ## settings Small applications providing configuration for basic firmware and its services. - `about` - Small About application that shows flipper info - `bt_settings_app` - Bluetooth options - `desktop_settings` - Desktop configuration - `dolphin_passport` - Dolphin passport app - `notification_settings` - LCD brightness, sound volume, etc configuration - `power_settings_app` - Basic power options - `storage_settings` - Storage settings app - `system` - System settings ## system Utility apps not visible in other menus, plus few external apps pre-packaged with the firmware. - `hid_app` - BLE & USB HID remote - `js_app` - JS engine runner - `snake_game` - Snake game - `storage_move_to_sd` - Data migration tool for internal storage - `updater` - Update service & application ================================================ FILE: applications/debug/accessor/accessor.cpp ================================================ #include "accessor_app.h" // app enter function extern "C" int32_t accessor_app(void* p) { UNUSED(p); AccessorApp* app = new AccessorApp(); app->run(); delete app; return 255; } ================================================ FILE: applications/debug/accessor/accessor_app.cpp ================================================ #include "accessor_app.h" #include #include #include #include void AccessorApp::run(void) { AccessorEvent event; bool consumed; bool exit = false; wiegand.begin(); onewire_host_start(onewire_host); scenes[current_scene]->on_enter(this); while(!exit) { view.receive_event(&event); consumed = scenes[current_scene]->on_event(this, &event); if(!consumed) { if(event.type == AccessorEvent::Type::Back) { exit = switch_to_previous_scene(); } } }; scenes[current_scene]->on_exit(this); wiegand.end(); onewire_host_stop(onewire_host); } AccessorApp::AccessorApp() : text_store{0} { notification = static_cast(furi_record_open(RECORD_NOTIFICATION)); expansion = static_cast(furi_record_open(RECORD_EXPANSION)); power = static_cast(furi_record_open(RECORD_POWER)); onewire_host = onewire_host_alloc(&gpio_ibutton); expansion_disable(expansion); power_enable_otg(power, true); } AccessorApp::~AccessorApp() { power_enable_otg(power, false); expansion_enable(expansion); furi_record_close(RECORD_EXPANSION); furi_record_close(RECORD_NOTIFICATION); furi_record_close(RECORD_POWER); onewire_host_free(onewire_host); } AccessorAppViewManager* AccessorApp::get_view_manager() { return &view; } void AccessorApp::switch_to_next_scene(Scene next_scene) { previous_scenes_list.push_front(current_scene); if(next_scene != Scene::Exit) { scenes[current_scene]->on_exit(this); current_scene = next_scene; scenes[current_scene]->on_enter(this); } } void AccessorApp::search_and_switch_to_previous_scene(std::initializer_list scenes_list) { Scene previous_scene = Scene::Start; bool scene_found = false; while(!scene_found) { previous_scene = get_previous_scene(); for(Scene element : scenes_list) { if(previous_scene == element || previous_scene == Scene::Start) { scene_found = true; break; } } } scenes[current_scene]->on_exit(this); current_scene = previous_scene; scenes[current_scene]->on_enter(this); } bool AccessorApp::switch_to_previous_scene(uint8_t count) { Scene previous_scene = Scene::Start; for(uint8_t i = 0; i < count; i++) { previous_scene = get_previous_scene(); if(previous_scene == Scene::Exit) break; } if(previous_scene == Scene::Exit) { return true; } else { scenes[current_scene]->on_exit(this); current_scene = previous_scene; scenes[current_scene]->on_enter(this); return false; } } AccessorApp::Scene AccessorApp::get_previous_scene() { Scene scene = previous_scenes_list.front(); previous_scenes_list.pop_front(); return scene; } /***************************** NOTIFY *******************************/ void AccessorApp::notify_green_blink() { notification_message(notification, &sequence_blink_green_10); } void AccessorApp::notify_success() { notification_message(notification, &sequence_success); } /*************************** TEXT STORE *****************************/ char* AccessorApp::get_text_store() { return text_store; } uint8_t AccessorApp::get_text_store_size() { return text_store_size; } void AccessorApp::set_text_store(const char* text...) { va_list args; va_start(args, text); vsnprintf(text_store, text_store_size, text, args); va_end(args); } /*************************** APP RESOURCES *****************************/ WIEGAND* AccessorApp::get_wiegand() { return &wiegand; } OneWireHost* AccessorApp::get_one_wire() { return onewire_host; } ================================================ FILE: applications/debug/accessor/accessor_app.h ================================================ #pragma once #include #include #include "accessor_view_manager.h" #include "scene/accessor_scene_start.h" #include "helpers/wiegand.h" #include #include #include #include class AccessorApp { public: void run(void); AccessorApp(void); ~AccessorApp(void); enum class Scene : uint8_t { Exit, Start, }; AccessorAppViewManager* get_view_manager(void); void switch_to_next_scene(Scene index); void search_and_switch_to_previous_scene(std::initializer_list scenes_list); bool switch_to_previous_scene(uint8_t count = 1); Scene get_previous_scene(void); void notify_green_blink(void); void notify_success(void); char* get_text_store(void); uint8_t get_text_store_size(void); void set_text_store(const char* text...); WIEGAND* get_wiegand(void); OneWireHost* get_one_wire(void); private: std::list previous_scenes_list = {Scene::Exit}; Scene current_scene = Scene::Start; AccessorAppViewManager view; std::map scenes = { {Scene::Start, new AccessorSceneStart()}, }; static const uint8_t text_store_size = 128; char text_store[text_store_size + 1]; WIEGAND wiegand; OneWireHost* onewire_host; NotificationApp* notification; Expansion* expansion; Power* power; }; ================================================ FILE: applications/debug/accessor/accessor_event.h ================================================ #pragma once #include class AccessorEvent { public: // events enum enum class Type : uint8_t { Tick, Back, }; // payload union { uint32_t menu_index; } payload; // event type Type type; }; ================================================ FILE: applications/debug/accessor/accessor_view_manager.cpp ================================================ #include "accessor_view_manager.h" #include "accessor_event.h" #include "callback_connector.h" AccessorAppViewManager::AccessorAppViewManager() { event_queue = furi_message_queue_alloc(10, sizeof(AccessorEvent)); view_holder = view_holder_alloc(); auto callback = cbc::obtain_connector(this, &AccessorAppViewManager::view_holder_back_callback); // allocate views submenu = submenu_alloc(); popup = popup_alloc(); // set back callback view_holder_set_back_callback(view_holder, callback, NULL); gui = static_cast(furi_record_open(RECORD_GUI)); view_holder_attach_to_gui(view_holder, gui); } AccessorAppViewManager::~AccessorAppViewManager() { // remove current view view_holder_set_view(view_holder, NULL); // free view modules furi_record_close(RECORD_GUI); submenu_free(submenu); popup_free(popup); // free view holder view_holder_free(view_holder); // free event queue furi_message_queue_free(event_queue); } void AccessorAppViewManager::switch_to(ViewType type) { View* view; switch(type) { case ViewType::Submenu: view = submenu_get_view(submenu); break; case ViewType::Popup: view = popup_get_view(popup); break; default: furi_crash(); } view_holder_set_view(view_holder, view); } Submenu* AccessorAppViewManager::get_submenu() { return submenu; } Popup* AccessorAppViewManager::get_popup() { return popup; } void AccessorAppViewManager::receive_event(AccessorEvent* event) { if(furi_message_queue_get(event_queue, event, 100) != FuriStatusOk) { event->type = AccessorEvent::Type::Tick; } } void AccessorAppViewManager::send_event(AccessorEvent* event) { FuriStatus result = furi_message_queue_put(event_queue, event, 0); furi_check(result == FuriStatusOk); } void AccessorAppViewManager::view_holder_back_callback(void*) { if(event_queue != NULL) { AccessorEvent event; event.type = AccessorEvent::Type::Back; send_event(&event); } } ================================================ FILE: applications/debug/accessor/accessor_view_manager.h ================================================ #pragma once #include #include #include #include #include "accessor_event.h" class AccessorAppViewManager { public: enum class ViewType : uint8_t { Submenu, Popup, }; FuriMessageQueue* event_queue; AccessorAppViewManager(void); ~AccessorAppViewManager(void); void switch_to(ViewType type); void receive_event(AccessorEvent* event); void send_event(AccessorEvent* event); Submenu* get_submenu(void); Popup* get_popup(void); private: Gui* gui; ViewHolder* view_holder; void view_holder_back_callback(void* context); // view elements Submenu* submenu; Popup* popup; }; ================================================ FILE: applications/debug/accessor/application.fam ================================================ App( appid="accessor", name="Accessor", apptype=FlipperAppType.DEBUG, targets=["f7"], entry_point="accessor_app", requires=["gui"], stack_size=4 * 1024, fap_category="Debug", ) ================================================ FILE: applications/debug/accessor/callback_connector.h ================================================ #ifndef CALLBACKCONNECTOR_H #define CALLBACKCONNECTOR_H #ifdef __cplusplus #include namespace cbc { namespace Details { template class FuncMemberWrapper { public: FuncMemberWrapper() = delete; using member_fun_t = Ret (T::*)(Args...); using const_member_fun_t = Ret (T::*)(Args...) const; static auto instantiate(T* t, member_fun_t ptr) { obj = t; member = ptr; return MetaCall; } static auto instantiate(T* t, const_member_fun_t ptr) { obj = t; const_member = ptr; return ConstMetaCall; } private: static auto MetaCall(Args... args) { return (*obj.*member)(args...); } static auto ConstMetaCall(Args... args) { return (*obj.*const_member)(args...); } static T* obj; static member_fun_t member; static const_member_fun_t const_member; }; template T* FuncMemberWrapper::obj{}; template typename FuncMemberWrapper::member_fun_t FuncMemberWrapper::member{}; template typename FuncMemberWrapper::const_member_fun_t FuncMemberWrapper::const_member{}; template struct FunctorWrapper { public: static std::function functor; static auto instatiate(Functor fn) { functor = std::move(fn); return MetaCall; } private: static auto MetaCall(Args... args) { return functor(args...); } }; template std::function FunctorWrapper::functor; template auto deducer(Functor obj, Ret (T::*)(Args...) const) { return FunctorWrapper::instatiate(std::move(obj)); } template auto deducer(Functor obj, Ret (T::*)(Args...)) { return FunctorWrapper::instatiate(std::move(obj)); } template auto const_instantiate(T* t, Ret (T::*ptr)(Args...) const) { return FuncMemberWrapper::instantiate(t, ptr); } template auto const_instantiate(T* t, Func ptr) { return const_instantiate(t, ptr); } } //end of Details scope template auto obtain_connector(T* t, Ret (T::*ptr)(Args...)) { return Details::FuncMemberWrapper::instantiate(t, ptr); } template auto obtain_connector(T* t, Ret (T::*ptr)(Args...) const) { return Details::FuncMemberWrapper::instantiate(t, ptr); } template auto obtain_connector(Functor functor) { return Details::deducer(std::move(functor), &Functor::operator()); } } //end of cbc scope #endif // __cplusplus #endif // CALLBACKCONNECTOR_H ================================================ FILE: applications/debug/accessor/helpers/wiegand.cpp ================================================ #include "wiegand.h" #include #include unsigned long WIEGAND::_cardTempHigh = 0; unsigned long WIEGAND::_cardTemp = 0; unsigned long WIEGAND::_lastWiegand = 0; unsigned long WIEGAND::_code = 0; unsigned long WIEGAND::_codeHigh = 0; int WIEGAND::_bitCount = 0; int WIEGAND::_wiegandType = 0; constexpr uint32_t clocks_in_ms = 64 * 1000; const GpioPin* const pinD0 = &gpio_ext_pa4; const GpioPin* const pinD1 = &gpio_ext_pa7; WIEGAND::WIEGAND() { } unsigned long WIEGAND::getCode() { return _code; } unsigned long WIEGAND::getCodeHigh() { return _codeHigh; } int WIEGAND::getWiegandType() { return _wiegandType; } bool WIEGAND::available() { bool ret; FURI_CRITICAL_ENTER(); ret = DoWiegandConversion(); FURI_CRITICAL_EXIT(); return ret; } static void input_isr_d0(void* _ctx) { WIEGAND* _this = static_cast(_ctx); _this->ReadD0(); } static void input_isr_d1(void* _ctx) { WIEGAND* _this = static_cast(_ctx); _this->ReadD1(); } void WIEGAND::begin() { _lastWiegand = 0; _cardTempHigh = 0; _cardTemp = 0; _code = 0; _wiegandType = 0; _bitCount = 0; furi_hal_gpio_init_simple(pinD0, GpioModeInterruptFall); // Set D0 pin as input furi_hal_gpio_init_simple(pinD1, GpioModeInterruptFall); // Set D1 pin as input furi_hal_gpio_add_int_callback(pinD0, input_isr_d0, this); furi_hal_gpio_add_int_callback(pinD1, input_isr_d1, this); } void WIEGAND::end() { furi_hal_gpio_remove_int_callback(pinD0); furi_hal_gpio_remove_int_callback(pinD1); furi_hal_gpio_init_simple(pinD0, GpioModeAnalog); furi_hal_gpio_init_simple(pinD1, GpioModeAnalog); } void WIEGAND::ReadD0() { _bitCount++; // Increment bit count for Interrupt connected to D0 if(_bitCount > 31) // If bit count more than 31, process high bits { _cardTempHigh |= ((0x80000000 & _cardTemp) >> 31); // shift value to high bits _cardTempHigh <<= 1; _cardTemp <<= 1; } else { _cardTemp <<= 1; // D0 represent binary 0, so just left shift card data } _lastWiegand = DWT->CYCCNT; // Keep track of last wiegand bit received } void WIEGAND::ReadD1() { _bitCount++; // Increment bit count for Interrupt connected to D1 if(_bitCount > 31) // If bit count more than 31, process high bits { _cardTempHigh |= ((0x80000000 & _cardTemp) >> 31); // shift value to high bits _cardTempHigh <<= 1; _cardTemp |= 1; _cardTemp <<= 1; } else { _cardTemp |= 1; // D1 represent binary 1, so OR card data with 1 then _cardTemp <<= 1; // left shift card data } _lastWiegand = DWT->CYCCNT; // Keep track of last wiegand bit received } unsigned long WIEGAND::GetCardId(unsigned long* codehigh, unsigned long* codelow, char bitlength) { if(bitlength == 26) // EM tag return (*codelow & 0x1FFFFFE) >> 1; if(bitlength == 24) return (*codelow & 0x7FFFFE) >> 1; if(bitlength == 34) // Mifare { *codehigh = *codehigh & 0x03; // only need the 2 LSB of the codehigh *codehigh <<= 30; // shift 2 LSB to MSB *codelow >>= 1; return *codehigh | *codelow; } if(bitlength == 32) { return (*codelow & 0x7FFFFFFE) >> 1; } return *codelow; // EM tag or Mifare without parity bits } char translateEnterEscapeKeyPress(char originalKeyPress) { switch(originalKeyPress) { case 0x0b: // 11 or * key return 0x0d; // 13 or ASCII ENTER case 0x0a: // 10 or # key return 0x1b; // 27 or ASCII ESCAPE default: return originalKeyPress; } } bool WIEGAND::DoWiegandConversion() { unsigned long cardID; unsigned long sysTick = DWT->CYCCNT; if((sysTick - _lastWiegand) > (25 * clocks_in_ms)) // if no more signal coming through after 25ms { if((_bitCount == 24) || (_bitCount == 26) || (_bitCount == 32) || (_bitCount == 34) || (_bitCount == 37) || (_bitCount == 40) || (_bitCount == 8) || (_bitCount == 4)) // bitCount for keypress=4 or 8, Wiegand 26=24 or 26, Wiegand 34=32 or 34 { _codeHigh = 0; // shift right 1 bit to get back the real value - interrupt done 1 left shift in advance _cardTemp >>= 1; // bit count more than 32 bits, shift high bits right to make adjustment if(_bitCount > 32) _cardTempHigh >>= 1; if(_bitCount == 8) // keypress wiegand with integrity { // 8-bit Wiegand keyboard data, high nibble is the "NOT" of low nibble // eg if key 1 pressed, data=E1 in binary 11100001 , high nibble=1110 , low nibble = 0001 char highNibble = (_cardTemp & 0xf0) >> 4; char lowNibble = (_cardTemp & 0x0f); _wiegandType = _bitCount; _bitCount = 0; _cardTemp = 0; _cardTempHigh = 0; if(lowNibble == (~highNibble & 0x0f)) // check if low nibble matches the "NOT" of high nibble. { _code = (int)translateEnterEscapeKeyPress(lowNibble); return true; } else { _lastWiegand = sysTick; return false; } // TODO FL-3490: Handle validation failure case! } else if(4 == _bitCount) { // 4-bit Wiegand codes have no data integrity check so we just // read the LOW nibble. _code = (int)translateEnterEscapeKeyPress(_cardTemp & 0x0000000F); _wiegandType = _bitCount; _bitCount = 0; _cardTemp = 0; _cardTempHigh = 0; return true; } else if(40 == _bitCount) { _cardTempHigh >>= 1; _code = _cardTemp; _codeHigh = _cardTempHigh; _wiegandType = _bitCount; _bitCount = 0; _cardTemp = 0; _cardTempHigh = 0; return true; } else { // wiegand 26 or wiegand 34 cardID = GetCardId(&_cardTempHigh, &_cardTemp, _bitCount); _wiegandType = _bitCount; _bitCount = 0; _cardTemp = 0; _cardTempHigh = 0; _code = cardID; return true; } } else { // well time over 25 ms and bitCount !=8 , !=26, !=34 , must be noise or nothing then. _lastWiegand = sysTick; _bitCount = 0; _cardTemp = 0; _cardTempHigh = 0; return false; } } else return false; } ================================================ FILE: applications/debug/accessor/helpers/wiegand.h ================================================ #pragma once class WIEGAND { public: WIEGAND(void); void begin(void); void end(void); bool available(void); unsigned long getCode(void); unsigned long getCodeHigh(void); int getWiegandType(void); static void ReadD0(void); static void ReadD1(void); private: static bool DoWiegandConversion(void); static unsigned long GetCardId(unsigned long* codehigh, unsigned long* codelow, char bitlength); static unsigned long _cardTempHigh; static unsigned long _cardTemp; static unsigned long _lastWiegand; static int _bitCount; static int _wiegandType; static unsigned long _code; static unsigned long _codeHigh; }; ================================================ FILE: applications/debug/accessor/scene/accessor_scene_generic.h ================================================ #pragma once #include "../accessor_app.h" class AccessorApp; class AccessorScene { public: virtual void on_enter(AccessorApp* app) = 0; virtual bool on_event(AccessorApp* app, AccessorEvent* event) = 0; virtual void on_exit(AccessorApp* app) = 0; private: }; ================================================ FILE: applications/debug/accessor/scene/accessor_scene_start.cpp ================================================ #include "../accessor_app.h" #include "../accessor_view_manager.h" #include "../accessor_event.h" #include "accessor_scene_start.h" void AccessorSceneStart::on_enter(AccessorApp* app) { AccessorAppViewManager* view_manager = app->get_view_manager(); Popup* popup = view_manager->get_popup(); popup_set_header(popup, "Accessor App", 64, 16, AlignCenter, AlignBottom); app->set_text_store("[??????]"); popup_set_text(popup, app->get_text_store(), 64, 22, AlignCenter, AlignTop); view_manager->switch_to(AccessorAppViewManager::ViewType::Popup); } bool AccessorSceneStart::on_event(AccessorApp* app, AccessorEvent* event) { bool consumed = false; if(event->type == AccessorEvent::Type::Tick) { WIEGAND* wiegand = app->get_wiegand(); Popup* popup = app->get_view_manager()->get_popup(); OneWireHost* onewire_host = app->get_one_wire(); uint8_t data[8] = {0, 0, 0, 0, 0, 0, 0, 0}; uint8_t type = 0; if(wiegand->available()) { type = wiegand->getWiegandType(); for(uint8_t i = 0; i < 4; i++) { data[i] = wiegand->getCode() >> (i * 8); } for(uint8_t i = 4; i < 8; i++) { data[i] = wiegand->getCodeHigh() >> ((i - 4) * 8); } } else { FURI_CRITICAL_ENTER(); if(onewire_host_reset(onewire_host)) { type = 255; onewire_host_write(onewire_host, 0x33); for(uint8_t i = 0; i < 8; i++) { data[i] = onewire_host_read(onewire_host); } for(uint8_t i = 0; i < 7; i++) { data[i] = data[i + 1]; } } FURI_CRITICAL_EXIT(); } if(type > 0) { if(type == 255) { app->set_text_store( "[%02X %02X %02X %02X %02X %02X DS]", data[5], data[4], data[3], data[2], data[1], data[0]); } else { app->set_text_store( "[%02X %02X %02X %02X %02X %02X W%u]", data[5], data[4], data[3], data[2], data[1], data[0], type); } popup_set_text(popup, app->get_text_store(), 64, 22, AlignCenter, AlignTop); app->notify_success(); } } return consumed; } void AccessorSceneStart::on_exit(AccessorApp* app) { Popup* popup = app->get_view_manager()->get_popup(); popup_set_header(popup, NULL, 0, 0, AlignCenter, AlignBottom); popup_set_text(popup, NULL, 0, 0, AlignCenter, AlignTop); } ================================================ FILE: applications/debug/accessor/scene/accessor_scene_start.h ================================================ #pragma once #include "accessor_scene_generic.h" class AccessorSceneStart : public AccessorScene { public: void on_enter(AccessorApp* app) final; bool on_event(AccessorApp* app, AccessorEvent* event) final; void on_exit(AccessorApp* app) final; }; ================================================ FILE: applications/debug/application.fam ================================================ App( appid="debug_apps", name="Basic debug apps bundle", apptype=FlipperAppType.METAPACKAGE, provides=[ "blink_test", "vibro_test", "keypad_test", "usb_test", "usb_mouse", "uart_echo", "display_test", "text_box_test", "file_browser_test", "speaker_debug", ], ) ================================================ FILE: applications/debug/battery_test_app/application.fam ================================================ App( appid="battery_test", name="Battery Test", apptype=FlipperAppType.DEBUG, entry_point="battery_test_app", requires=[ "gui", "power", ], stack_size=1 * 1024, fap_category="Debug", fap_libs=["assets"], ) ================================================ FILE: applications/debug/battery_test_app/battery_test_app.c ================================================ #include "battery_test_app.h" #include void battery_test_dialog_callback(DialogExResult result, void* context) { furi_assert(context); BatteryTestApp* app = context; if(result == DialogExResultLeft) { view_dispatcher_stop(app->view_dispatcher); } else if(result == DialogExResultRight) { view_dispatcher_switch_to_view(app->view_dispatcher, BatteryTestAppViewBatteryInfo); } } uint32_t battery_test_exit_confirm_view(void* context) { UNUSED(context); return BatteryTestAppViewExitDialog; } static void battery_test_battery_info_update_model(void* context) { BatteryTestApp* app = context; power_get_info(app->power, &app->info); BatteryInfoModel battery_info_data = { .vbus_voltage = app->info.voltage_vbus, .gauge_voltage = app->info.voltage_gauge, .gauge_current = app->info.current_gauge, .gauge_temperature = app->info.temperature_gauge, .charge = app->info.charge, .health = app->info.health, }; battery_info_set_data(app->battery_info, &battery_info_data); notification_message(app->notifications, &sequence_display_backlight_on); } BatteryTestApp* battery_test_alloc(void) { BatteryTestApp* app = malloc(sizeof(BatteryTestApp)); // Records app->gui = furi_record_open(RECORD_GUI); app->power = furi_record_open(RECORD_POWER); app->notifications = furi_record_open(RECORD_NOTIFICATION); // View dispatcher app->view_dispatcher = view_dispatcher_alloc(); view_dispatcher_set_event_callback_context(app->view_dispatcher, app); view_dispatcher_set_tick_event_callback( app->view_dispatcher, battery_test_battery_info_update_model, 500); view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); // Views app->battery_info = battery_info_alloc(); view_set_previous_callback( battery_info_get_view(app->battery_info), battery_test_exit_confirm_view); view_dispatcher_add_view( app->view_dispatcher, BatteryTestAppViewBatteryInfo, battery_info_get_view(app->battery_info)); app->dialog = dialog_ex_alloc(); dialog_ex_set_header(app->dialog, "Close Battery Test?", 64, 12, AlignCenter, AlignTop); dialog_ex_set_left_button_text(app->dialog, "Exit"); dialog_ex_set_right_button_text(app->dialog, "Stay"); dialog_ex_set_result_callback(app->dialog, battery_test_dialog_callback); dialog_ex_set_context(app->dialog, app); view_dispatcher_add_view( app->view_dispatcher, BatteryTestAppViewExitDialog, dialog_ex_get_view(app->dialog)); battery_test_battery_info_update_model(app); view_dispatcher_switch_to_view(app->view_dispatcher, BatteryTestAppViewBatteryInfo); return app; } void battery_test_free(BatteryTestApp* app) { furi_assert(app); // Views view_dispatcher_remove_view(app->view_dispatcher, BatteryTestAppViewBatteryInfo); battery_info_free(app->battery_info); view_dispatcher_remove_view(app->view_dispatcher, BatteryTestAppViewExitDialog); dialog_ex_free(app->dialog); // View dispatcher view_dispatcher_free(app->view_dispatcher); // Records furi_record_close(RECORD_POWER); furi_record_close(RECORD_GUI); furi_record_close(RECORD_NOTIFICATION); free(app); } int32_t battery_test_app(void* p) { UNUSED(p); BatteryTestApp* app = battery_test_alloc(); // Disable battery low level notification power_enable_low_battery_level_notification(app->power, false); view_dispatcher_run(app->view_dispatcher); power_enable_low_battery_level_notification(app->power, true); battery_test_free(app); return 0; } ================================================ FILE: applications/debug/battery_test_app/battery_test_app.h ================================================ #include #include #include #include #include #include #include // FIXME #include "../settings/power_settings_app/views/battery_info.h" typedef struct { Power* power; Gui* gui; NotificationApp* notifications; ViewDispatcher* view_dispatcher; BatteryInfo* battery_info; DialogEx* dialog; PowerInfo info; } BatteryTestApp; typedef enum { BatteryTestAppViewBatteryInfo, BatteryTestAppViewExitDialog, } BatteryTestAppView; ================================================ FILE: applications/debug/battery_test_app/views/battery_info.c ================================================ #include "battery_info.h" #include #include #include #define LOW_CHARGE_THRESHOLD 10 #define HIGH_DRAIN_CURRENT_THRESHOLD 100 struct BatteryInfo { View* view; }; static void draw_stat(Canvas* canvas, int x, int y, const Icon* icon, char* val) { canvas_draw_frame(canvas, x - 7, y + 7, 30, 13); canvas_draw_icon(canvas, x, y, icon); canvas_set_color(canvas, ColorWhite); canvas_draw_box(canvas, x - 4, y + 16, 24, 6); canvas_set_color(canvas, ColorBlack); canvas_draw_str_aligned(canvas, x + 8, y + 22, AlignCenter, AlignBottom, val); } static void draw_battery(Canvas* canvas, BatteryInfoModel* data, int x, int y) { char emote[20] = {}; char header[20] = {}; char value[20] = {}; int32_t drain_current = data->gauge_current * (-1000); uint32_t charge_current = data->gauge_current * 1000; // Draw battery canvas_draw_icon(canvas, x, y, &I_BatteryBody_52x28); if(charge_current > 0) { canvas_draw_icon(canvas, x + 16, y + 7, &I_FaceCharging_29x14); } else if(drain_current > HIGH_DRAIN_CURRENT_THRESHOLD) { canvas_draw_icon(canvas, x + 16, y + 7, &I_FaceConfused_29x14); } else if(data->charge < LOW_CHARGE_THRESHOLD) { canvas_draw_icon(canvas, x + 16, y + 7, &I_FaceNopower_29x14); } else { canvas_draw_icon(canvas, x + 16, y + 7, &I_FaceNormal_29x14); } // Draw bubble elements_bubble(canvas, 53, 0, 71, 39); // Set text if(charge_current > 0) { snprintf(emote, sizeof(emote), "%s", "Yummy!"); snprintf(header, sizeof(header), "%s", "Charging at"); snprintf( value, sizeof(value), "%lu.%luV %lumA", (uint32_t)(data->vbus_voltage), (uint32_t)(data->vbus_voltage * 10) % 10, charge_current); } else if(drain_current > 0) { snprintf( emote, sizeof(emote), "%s", drain_current > HIGH_DRAIN_CURRENT_THRESHOLD ? "Oh no!" : "Om-nom-nom!"); snprintf(header, sizeof(header), "%s", "Consumption is"); snprintf( value, sizeof(value), "%ld %s", drain_current, drain_current > HIGH_DRAIN_CURRENT_THRESHOLD ? "mA!" : "mA"); } else if(drain_current != 0) { snprintf(header, 20, "..."); } else if(data->charging_voltage < 4.2f) { // Non-default battery charging limit, mention it snprintf(emote, sizeof(emote), "Charged!"); snprintf(header, sizeof(header), "Limited to"); snprintf( value, sizeof(value), "%lu.%luV", (uint32_t)(data->charging_voltage), (uint32_t)(data->charging_voltage * 10) % 10); } else { snprintf(header, sizeof(header), "Charged!"); } canvas_draw_str_aligned(canvas, 92, y + 3, AlignCenter, AlignCenter, emote); canvas_draw_str_aligned(canvas, 92, y + 15, AlignCenter, AlignCenter, header); canvas_draw_str_aligned(canvas, 92, y + 27, AlignCenter, AlignCenter, value); } static void battery_info_draw_callback(Canvas* canvas, void* context) { furi_assert(context); BatteryInfoModel* model = context; canvas_clear(canvas); canvas_set_color(canvas, ColorBlack); draw_battery(canvas, model, 0, 5); char batt_level[10]; char temperature[10]; char voltage[10]; char health[10]; snprintf(batt_level, sizeof(batt_level), "%lu%%", (uint32_t)model->charge); snprintf(temperature, sizeof(temperature), "%lu C", (uint32_t)model->gauge_temperature); snprintf( voltage, sizeof(voltage), "%lu.%01lu V", (uint32_t)model->gauge_voltage, (uint32_t)(model->gauge_voltage * 10) % 10UL); snprintf(health, sizeof(health), "%d%%", model->health); draw_stat(canvas, 8, 42, &I_Battery_16x16, batt_level); draw_stat(canvas, 40, 42, &I_Temperature_16x16, temperature); draw_stat(canvas, 72, 42, &I_Voltage_16x16, voltage); draw_stat(canvas, 104, 42, &I_Health_16x16, health); } BatteryInfo* battery_info_alloc(void) { BatteryInfo* battery_info = malloc(sizeof(BatteryInfo)); battery_info->view = view_alloc(); view_set_context(battery_info->view, battery_info); view_allocate_model(battery_info->view, ViewModelTypeLocking, sizeof(BatteryInfoModel)); view_set_draw_callback(battery_info->view, battery_info_draw_callback); return battery_info; } void battery_info_free(BatteryInfo* battery_info) { furi_assert(battery_info); view_free(battery_info->view); free(battery_info); } View* battery_info_get_view(BatteryInfo* battery_info) { furi_assert(battery_info); return battery_info->view; } void battery_info_set_data(BatteryInfo* battery_info, BatteryInfoModel* data) { furi_assert(battery_info); furi_assert(data); with_view_model( battery_info->view, BatteryInfoModel * model, { memcpy(model, data, sizeof(BatteryInfoModel)); }, true); } ================================================ FILE: applications/debug/battery_test_app/views/battery_info.h ================================================ #pragma once #include typedef struct BatteryInfo BatteryInfo; typedef struct { float vbus_voltage; float gauge_voltage; float gauge_current; float gauge_temperature; float charging_voltage; uint8_t charge; uint8_t health; } BatteryInfoModel; BatteryInfo* battery_info_alloc(void); void battery_info_free(BatteryInfo* battery_info); View* battery_info_get_view(BatteryInfo* battery_info); void battery_info_set_data(BatteryInfo* battery_info, BatteryInfoModel* data); ================================================ FILE: applications/debug/blink_test/application.fam ================================================ App( appid="blink_test", name="Blink Test", apptype=FlipperAppType.DEBUG, entry_point="blink_test_app", requires=["gui"], stack_size=1 * 1024, fap_category="Debug", ) ================================================ FILE: applications/debug/blink_test/blink_test.c ================================================ #include #include #include #include #include typedef enum { BlinkEventTypeTick, BlinkEventTypeInput, } BlinkEventType; typedef struct { BlinkEventType type; InputEvent input; } BlinkEvent; static const NotificationSequence blink_test_sequence_hw_blink_start_red = { &message_blink_start_10, &message_blink_set_color_red, &message_do_not_reset, NULL, }; static const NotificationSequence blink_test_sequence_hw_blink_green = { &message_blink_set_color_green, NULL, }; static const NotificationSequence blink_test_sequence_hw_blink_blue = { &message_blink_set_color_blue, NULL, }; static const NotificationSequence blink_test_sequence_hw_blink_stop = { &message_blink_stop, NULL, }; static const NotificationSequence* blink_test_colors[] = { &sequence_blink_red_100, &sequence_blink_green_100, &sequence_blink_blue_100, &sequence_blink_yellow_100, &sequence_blink_cyan_100, &sequence_blink_magenta_100, &sequence_blink_white_100, &blink_test_sequence_hw_blink_start_red, &blink_test_sequence_hw_blink_green, &blink_test_sequence_hw_blink_blue, &blink_test_sequence_hw_blink_stop, }; static void blink_test_update(void* ctx) { furi_assert(ctx); FuriMessageQueue* event_queue = ctx; BlinkEvent event = {.type = BlinkEventTypeTick}; // It's OK to loose this event if system overloaded furi_message_queue_put(event_queue, &event, 0); } static void blink_test_draw_callback(Canvas* canvas, void* ctx) { UNUSED(ctx); canvas_clear(canvas); canvas_set_font(canvas, FontPrimary); canvas_draw_str(canvas, 2, 10, "Blink application"); } static void blink_test_input_callback(InputEvent* input_event, void* ctx) { furi_assert(ctx); FuriMessageQueue* event_queue = ctx; BlinkEvent event = {.type = BlinkEventTypeInput, .input = *input_event}; furi_message_queue_put(event_queue, &event, FuriWaitForever); } int32_t blink_test_app(void* p) { UNUSED(p); FuriMessageQueue* event_queue = furi_message_queue_alloc(8, sizeof(BlinkEvent)); // Configure view port ViewPort* view_port = view_port_alloc(); view_port_draw_callback_set(view_port, blink_test_draw_callback, NULL); view_port_input_callback_set(view_port, blink_test_input_callback, event_queue); FuriTimer* timer = furi_timer_alloc(blink_test_update, FuriTimerTypePeriodic, event_queue); furi_timer_start(timer, furi_kernel_get_tick_frequency()); // Register view port in GUI Gui* gui = furi_record_open(RECORD_GUI); gui_add_view_port(gui, view_port, GuiLayerFullscreen); NotificationApp* notifications = furi_record_open(RECORD_NOTIFICATION); uint8_t state = 0; BlinkEvent event; while(1) { furi_check(furi_message_queue_get(event_queue, &event, FuriWaitForever) == FuriStatusOk); if(event.type == BlinkEventTypeInput) { if((event.input.type == InputTypeShort) && (event.input.key == InputKeyBack)) { break; } } else { notification_message(notifications, blink_test_colors[state]); state++; if(state >= COUNT_OF(blink_test_colors)) { state = 0; } } } notification_message(notifications, &blink_test_sequence_hw_blink_stop); furi_timer_free(timer); gui_remove_view_port(gui, view_port); view_port_free(view_port); furi_message_queue_free(event_queue); furi_record_close(RECORD_NOTIFICATION); furi_record_close(RECORD_GUI); return 0; } ================================================ FILE: applications/debug/bt_debug_app/application.fam ================================================ App( appid="bt_debug", name="Bluetooth Debug", apptype=FlipperAppType.DEBUG, entry_point="bt_debug_app", cdefines=["SRV_BT"], requires=[ "bt", "gui", "dialogs", ], provides=[ "bt_debug", ], stack_size=1 * 1024, fap_category="Debug", ) ================================================ FILE: applications/debug/bt_debug_app/bt_debug_app.c ================================================ #include "bt_debug_app.h" #include #define TAG "BtDebugApp" enum BtDebugSubmenuIndex { BtDebugSubmenuIndexCarrierTest, BtDebugSubmenuIndexPacketTest, }; void bt_debug_submenu_callback(void* context, uint32_t index) { furi_assert(context); BtDebugApp* app = context; if(index == BtDebugSubmenuIndexCarrierTest) { view_dispatcher_switch_to_view(app->view_dispatcher, BtDebugAppViewCarrierTest); } else if(index == BtDebugSubmenuIndexPacketTest) { view_dispatcher_switch_to_view(app->view_dispatcher, BtDebugAppViewPacketTest); } } uint32_t bt_debug_exit(void* context) { UNUSED(context); return VIEW_NONE; } uint32_t bt_debug_start_view(void* context) { UNUSED(context); return BtDebugAppViewSubmenu; } BtDebugApp* bt_debug_app_alloc(void) { BtDebugApp* app = malloc(sizeof(BtDebugApp)); // Gui app->gui = furi_record_open(RECORD_GUI); // View dispatcher app->view_dispatcher = view_dispatcher_alloc(); view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); // Views app->submenu = submenu_alloc(); submenu_add_item( app->submenu, "Carrier test", BtDebugSubmenuIndexCarrierTest, bt_debug_submenu_callback, app); submenu_add_item( app->submenu, "Packet test", BtDebugSubmenuIndexPacketTest, bt_debug_submenu_callback, app); view_set_previous_callback(submenu_get_view(app->submenu), bt_debug_exit); view_dispatcher_add_view( app->view_dispatcher, BtDebugAppViewSubmenu, submenu_get_view(app->submenu)); app->bt_carrier_test = bt_carrier_test_alloc(); view_set_previous_callback( bt_carrier_test_get_view(app->bt_carrier_test), bt_debug_start_view); view_dispatcher_add_view( app->view_dispatcher, BtDebugAppViewCarrierTest, bt_carrier_test_get_view(app->bt_carrier_test)); app->bt_packet_test = bt_packet_test_alloc(); view_set_previous_callback(bt_packet_test_get_view(app->bt_packet_test), bt_debug_start_view); view_dispatcher_add_view( app->view_dispatcher, BtDebugAppViewPacketTest, bt_packet_test_get_view(app->bt_packet_test)); // Switch to menu view_dispatcher_switch_to_view(app->view_dispatcher, BtDebugAppViewSubmenu); return app; } void bt_debug_app_free(BtDebugApp* app) { furi_assert(app); // Free views view_dispatcher_remove_view(app->view_dispatcher, BtDebugAppViewSubmenu); submenu_free(app->submenu); view_dispatcher_remove_view(app->view_dispatcher, BtDebugAppViewCarrierTest); bt_carrier_test_free(app->bt_carrier_test); view_dispatcher_remove_view(app->view_dispatcher, BtDebugAppViewPacketTest); bt_packet_test_free(app->bt_packet_test); view_dispatcher_free(app->view_dispatcher); // Close gui record furi_record_close(RECORD_GUI); app->gui = NULL; // Free rest free(app); } int32_t bt_debug_app(void* p) { UNUSED(p); if(!furi_hal_bt_is_testing_supported()) { FURI_LOG_E(TAG, "Incorrect radio stack: radio testing features are absent."); DialogsApp* dialogs = furi_record_open(RECORD_DIALOGS); dialog_message_show_storage_error(dialogs, "Incorrect\nRadioStack"); return 255; } BtDebugApp* app = bt_debug_app_alloc(); // Was bt active? const bool was_active = furi_hal_bt_is_active(); // Stop advertising furi_hal_bt_stop_advertising(); view_dispatcher_run(app->view_dispatcher); // Restart advertising if(was_active) { furi_hal_bt_start_advertising(); } bt_debug_app_free(app); return 0; } ================================================ FILE: applications/debug/bt_debug_app/bt_debug_app.h ================================================ #pragma once #include #include #include #include #include #include #include "views/bt_carrier_test.h" #include "views/bt_packet_test.h" typedef struct { Gui* gui; ViewDispatcher* view_dispatcher; Submenu* submenu; BtCarrierTest* bt_carrier_test; BtPacketTest* bt_packet_test; } BtDebugApp; typedef enum { BtDebugAppViewSubmenu, BtDebugAppViewCarrierTest, BtDebugAppViewPacketTest, } BtDebugAppView; ================================================ FILE: applications/debug/bt_debug_app/views/bt_carrier_test.c ================================================ #include "bt_carrier_test.h" #include "bt_test.h" #include "bt_test_types.h" #include struct BtCarrierTest { BtTest* bt_test; BtTestParam* bt_param_channel; BtTestMode mode; BtTestChannel channel; BtTestPower power; FuriTimer* timer; }; static BtTestParamValue bt_param_mode[] = { {.value = BtTestModeRx, .str = "Rx"}, {.value = BtTestModeTx, .str = "Tx"}, {.value = BtTestModeTxHopping, .str = "Hopping Tx"}, }; static BtTestParamValue bt_param_channel[] = { {.value = BtTestChannel2402, .str = "2402 MHz"}, {.value = BtTestChannel2440, .str = "2440 MHz"}, {.value = BtTestChannel2480, .str = "2480 MHz"}, }; static BtTestParamValue bt_param_power[] = { {.value = BtPower0dB, .str = "0 dB"}, {.value = BtPower2dB, .str = "2 dB"}, {.value = BtPower4dB, .str = "4 dB"}, {.value = BtPower6dB, .str = "6 dB"}, }; static void bt_carrier_test_start(BtCarrierTest* bt_carrier_test) { furi_assert(bt_carrier_test); if(bt_carrier_test->mode == BtTestModeRx) { furi_hal_bt_start_packet_rx(bt_carrier_test->channel, 1); furi_timer_start(bt_carrier_test->timer, furi_kernel_get_tick_frequency() / 4); } else if(bt_carrier_test->mode == BtTestModeTxHopping) { furi_hal_bt_start_tone_tx(bt_carrier_test->channel, bt_carrier_test->power); furi_timer_start(bt_carrier_test->timer, furi_kernel_get_tick_frequency() * 2); } else if(bt_carrier_test->mode == BtTestModeTx) { furi_hal_bt_start_tone_tx(bt_carrier_test->channel, bt_carrier_test->power); } } static void bt_carrier_test_switch_channel(BtCarrierTest* bt_carrier_test) { furi_assert(bt_carrier_test); furi_hal_bt_stop_tone_tx(); uint8_t channel_i = 0; if(bt_carrier_test->channel == BtTestChannel2402) { bt_carrier_test->channel = BtTestChannel2440; channel_i = 1; } else if(bt_carrier_test->channel == BtTestChannel2440) { bt_carrier_test->channel = BtTestChannel2480; channel_i = 2; } else if(bt_carrier_test->channel == BtTestChannel2480) { bt_carrier_test->channel = BtTestChannel2402; channel_i = 0; } furi_hal_bt_start_tone_tx(bt_carrier_test->channel, bt_carrier_test->power); bt_test_set_current_value_index(bt_carrier_test->bt_param_channel, channel_i); bt_test_set_current_value_text( bt_carrier_test->bt_param_channel, bt_param_channel[channel_i].str); } static void bt_carrier_test_stop(BtCarrierTest* bt_carrier_test) { furi_assert(bt_carrier_test); if(bt_carrier_test->mode == BtTestModeTxHopping) { furi_hal_bt_stop_tone_tx(); furi_timer_stop(bt_carrier_test->timer); } else if(bt_carrier_test->mode == BtTestModeTx) { furi_hal_bt_stop_tone_tx(); } else if(bt_carrier_test->mode == BtTestModeRx) { furi_hal_bt_stop_packet_test(); furi_timer_stop(bt_carrier_test->timer); } } static uint32_t bt_carrier_test_param_changed(BtTestParam* param, BtTestParamValue* param_val) { furi_assert(param); uint8_t index = bt_test_get_current_value_index(param); bt_test_set_current_value_text(param, param_val[index].str); return param_val[index].value; } static void bt_carrier_test_mode_changed(BtTestParam* param) { BtCarrierTest* bt_carrier_test = bt_test_get_context(param); bt_carrier_test_stop(bt_carrier_test); bt_carrier_test->mode = bt_carrier_test_param_changed(param, bt_param_mode); } static void bt_carrier_test_channel_changed(BtTestParam* param) { BtCarrierTest* bt_carrier_test = bt_test_get_context(param); bt_carrier_test_stop(bt_carrier_test); bt_carrier_test->channel = bt_carrier_test_param_changed(param, bt_param_channel); } static void bt_carrier_test_param_channel(BtTestParam* param) { BtCarrierTest* bt_carrier_test = bt_test_get_context(param); bt_carrier_test_stop(bt_carrier_test); bt_carrier_test->power = bt_carrier_test_param_changed(param, bt_param_power); } static void bt_carrier_test_change_state_callback(BtTestState state, void* context) { furi_assert(context); BtCarrierTest* bt_carrier_test = context; furi_hal_bt_stop_tone_tx(); if(state == BtTestStateStarted) { bt_carrier_test_start(bt_carrier_test); } else if(state == BtTestStateStopped) { bt_carrier_test_stop(bt_carrier_test); } } static void bt_carrier_test_exit_callback(void* context) { furi_assert(context); BtCarrierTest* bt_carrier_test = context; bt_carrier_test_stop(bt_carrier_test); } static void bt_test_carrier_timer_callback(void* context) { furi_assert(context); BtCarrierTest* bt_carrier_test = context; if(bt_carrier_test->mode == BtTestModeRx) { bt_test_set_rssi(bt_carrier_test->bt_test, furi_hal_bt_get_rssi()); } else if(bt_carrier_test->mode == BtTestModeTxHopping) { bt_carrier_test_switch_channel(bt_carrier_test); } } BtCarrierTest* bt_carrier_test_alloc(void) { BtCarrierTest* bt_carrier_test = malloc(sizeof(BtCarrierTest)); bt_carrier_test->bt_test = bt_test_alloc(); bt_test_set_context(bt_carrier_test->bt_test, bt_carrier_test); bt_test_set_change_state_callback( bt_carrier_test->bt_test, bt_carrier_test_change_state_callback); bt_test_set_back_callback(bt_carrier_test->bt_test, bt_carrier_test_exit_callback); BtTestParam* param; param = bt_test_param_add( bt_carrier_test->bt_test, "Mode", COUNT_OF(bt_param_mode), bt_carrier_test_mode_changed, bt_carrier_test); bt_test_set_current_value_index(param, 0); bt_test_set_current_value_text(param, bt_param_mode[0].str); bt_carrier_test->mode = BtTestModeRx; param = bt_test_param_add( bt_carrier_test->bt_test, "Channel", COUNT_OF(bt_param_channel), bt_carrier_test_channel_changed, bt_carrier_test); bt_test_set_current_value_index(param, 0); bt_test_set_current_value_text(param, bt_param_channel[0].str); bt_carrier_test->channel = BtTestChannel2402; bt_carrier_test->bt_param_channel = param; param = bt_test_param_add( bt_carrier_test->bt_test, "Power", COUNT_OF(bt_param_power), bt_carrier_test_param_channel, bt_carrier_test); bt_test_set_current_value_index(param, 0); bt_test_set_current_value_text(param, bt_param_power[0].str); bt_carrier_test->power = BtPower0dB; bt_carrier_test->timer = furi_timer_alloc(bt_test_carrier_timer_callback, FuriTimerTypePeriodic, bt_carrier_test); return bt_carrier_test; } void bt_carrier_test_free(BtCarrierTest* bt_carrier_test) { furi_assert(bt_carrier_test); bt_test_free(bt_carrier_test->bt_test); furi_timer_free(bt_carrier_test->timer); free(bt_carrier_test); } View* bt_carrier_test_get_view(BtCarrierTest* bt_carrier_test) { furi_assert(bt_carrier_test); return bt_test_get_view(bt_carrier_test->bt_test); } ================================================ FILE: applications/debug/bt_debug_app/views/bt_carrier_test.h ================================================ #pragma once #include typedef struct BtCarrierTest BtCarrierTest; BtCarrierTest* bt_carrier_test_alloc(void); void bt_carrier_test_free(BtCarrierTest* bt_carrier_test); View* bt_carrier_test_get_view(BtCarrierTest* bt_carrier_test); ================================================ FILE: applications/debug/bt_debug_app/views/bt_packet_test.c ================================================ #include "bt_packet_test.h" #include "bt_test.h" #include "bt_test_types.h" #include struct BtPacketTest { BtTest* bt_test; BtTestMode mode; BtTestChannel channel; BtTestDataRate data_rate; FuriTimer* timer; }; static BtTestParamValue bt_param_mode[] = { {.value = BtTestModeRx, .str = "Rx"}, {.value = BtTestModeTx, .str = "Tx"}, }; static BtTestParamValue bt_param_channel[] = { {.value = BtTestChannel2402, .str = "2402 MHz"}, {.value = BtTestChannel2440, .str = "2440 MHz"}, {.value = BtTestChannel2480, .str = "2480 MHz"}, }; static BtTestParamValue bt_param_data_rate[] = { {.value = BtDataRate1M, .str = "1 Mbps"}, {.value = BtDataRate2M, .str = "2 Mbps"}, }; static void bt_packet_test_start(BtPacketTest* bt_packet_test) { furi_assert(bt_packet_test); if(bt_packet_test->mode == BtTestModeRx) { furi_hal_bt_start_packet_rx(bt_packet_test->channel, bt_packet_test->data_rate); furi_timer_start(bt_packet_test->timer, furi_kernel_get_tick_frequency() / 4); } else if(bt_packet_test->mode == BtTestModeTx) { furi_hal_bt_start_packet_tx(bt_packet_test->channel, 1, bt_packet_test->data_rate); } } static void bt_packet_test_stop(BtPacketTest* bt_packet_test) { furi_assert(bt_packet_test); if(bt_packet_test->mode == BtTestModeTx) { furi_hal_bt_stop_packet_test(); bt_test_set_packets_tx(bt_packet_test->bt_test, furi_hal_bt_get_transmitted_packets()); } else if(bt_packet_test->mode == BtTestModeRx) { bt_test_set_packets_rx(bt_packet_test->bt_test, furi_hal_bt_stop_packet_test()); furi_timer_stop(bt_packet_test->timer); } } static uint32_t bt_packet_test_param_changed(BtTestParam* param, BtTestParamValue* param_val) { furi_assert(param); uint8_t index = bt_test_get_current_value_index(param); bt_test_set_current_value_text(param, param_val[index].str); return param_val[index].value; } static void bt_packet_test_mode_changed(BtTestParam* param) { BtPacketTest* bt_packet_test = bt_test_get_context(param); bt_packet_test_stop(bt_packet_test); bt_packet_test->mode = bt_packet_test_param_changed(param, bt_param_mode); } static void bt_packet_test_channel_changed(BtTestParam* param) { BtPacketTest* bt_packet_test = bt_test_get_context(param); bt_packet_test_stop(bt_packet_test); bt_packet_test->channel = bt_packet_test_param_changed(param, bt_param_channel); } static void bt_packet_test_param_channel(BtTestParam* param) { BtPacketTest* bt_packet_test = bt_test_get_context(param); bt_packet_test_stop(bt_packet_test); bt_packet_test->data_rate = bt_packet_test_param_changed(param, bt_param_data_rate); } static void bt_packet_test_change_state_callback(BtTestState state, void* context) { furi_assert(context); BtPacketTest* bt_packet_test = context; if(state == BtTestStateStarted) { bt_packet_test_start(bt_packet_test); } else if(state == BtTestStateStopped) { bt_packet_test_stop(bt_packet_test); } } static void bt_packet_test_exit_callback(void* context) { furi_assert(context); BtPacketTest* bt_packet_test = context; bt_packet_test_stop(bt_packet_test); } static void bt_test_packet_timer_callback(void* context) { furi_assert(context); BtPacketTest* bt_packet_test = context; if(bt_packet_test->mode == BtTestModeRx) { bt_test_set_rssi(bt_packet_test->bt_test, furi_hal_bt_get_rssi()); } } BtPacketTest* bt_packet_test_alloc(void) { BtPacketTest* bt_packet_test = malloc(sizeof(BtPacketTest)); bt_packet_test->bt_test = bt_test_alloc(); bt_test_set_context(bt_packet_test->bt_test, bt_packet_test); bt_test_set_change_state_callback( bt_packet_test->bt_test, bt_packet_test_change_state_callback); bt_test_set_back_callback(bt_packet_test->bt_test, bt_packet_test_exit_callback); BtTestParam* param; param = bt_test_param_add( bt_packet_test->bt_test, "Mode", COUNT_OF(bt_param_mode), bt_packet_test_mode_changed, bt_packet_test); bt_test_set_current_value_index(param, 0); bt_test_set_current_value_text(param, bt_param_mode[0].str); bt_packet_test->mode = BtTestModeRx; param = bt_test_param_add( bt_packet_test->bt_test, "Channel", COUNT_OF(bt_param_channel), bt_packet_test_channel_changed, bt_packet_test); bt_test_set_current_value_index(param, 0); bt_test_set_current_value_text(param, bt_param_channel[0].str); bt_packet_test->channel = BtTestChannel2402; param = bt_test_param_add( bt_packet_test->bt_test, "Data rate", COUNT_OF(bt_param_data_rate), bt_packet_test_param_channel, bt_packet_test); bt_test_set_current_value_index(param, 0); bt_test_set_current_value_text(param, bt_param_data_rate[0].str); bt_packet_test->data_rate = BtDataRate1M; bt_packet_test->timer = furi_timer_alloc(bt_test_packet_timer_callback, FuriTimerTypePeriodic, bt_packet_test); return bt_packet_test; } void bt_packet_test_free(BtPacketTest* bt_packet_test) { furi_assert(bt_packet_test); bt_test_free(bt_packet_test->bt_test); furi_timer_free(bt_packet_test->timer); free(bt_packet_test); } View* bt_packet_test_get_view(BtPacketTest* bt_packet_test) { furi_assert(bt_packet_test); return bt_test_get_view(bt_packet_test->bt_test); } ================================================ FILE: applications/debug/bt_debug_app/views/bt_packet_test.h ================================================ #pragma once #include typedef struct BtPacketTest BtPacketTest; BtPacketTest* bt_packet_test_alloc(void); void bt_packet_test_free(BtPacketTest* bt_packet_test); View* bt_packet_test_get_view(BtPacketTest* bt_packet_test); ================================================ FILE: applications/debug/bt_debug_app/views/bt_test.c ================================================ #include "bt_test.h" #include #include #include #include #include #include #include struct BtTestParam { const char* label; uint8_t current_value_index; FuriString* current_value_text; uint8_t values_count; BtTestParamChangeCallback change_callback; void* context; }; ARRAY_DEF(BtTestParamArray, BtTestParam, M_POD_OPLIST); //-V658 struct BtTest { View* view; BtTestChangeStateCallback change_state_callback; BtTestBackCallback back_callback; void* context; }; typedef struct { BtTestState state; BtTestParamArray_t params; uint8_t position; uint8_t window_position; const char* message; float rssi; uint32_t packets_num_rx; uint32_t packets_num_tx; } BtTestModel; #define BT_TEST_START_MESSAGE "Ok - Start" #define BT_TEST_STOP_MESSAGE "Ok - Stop" static void bt_test_process_up(BtTest* bt_test); static void bt_test_process_down(BtTest* bt_test); static void bt_test_process_left(BtTest* bt_test); static void bt_test_process_right(BtTest* bt_test); static void bt_test_process_ok(BtTest* bt_test); static void bt_test_process_back(BtTest* bt_test); static void bt_test_draw_callback(Canvas* canvas, void* _model) { BtTestModel* model = _model; char info_str[32]; const uint8_t param_height = 16; const uint8_t param_width = 123; canvas_clear(canvas); uint8_t position = 0; BtTestParamArray_it_t it; canvas_set_font(canvas, FontSecondary); for(BtTestParamArray_it(it, model->params); !BtTestParamArray_end_p(it); BtTestParamArray_next(it)) { uint8_t param_position = position - model->window_position; uint8_t params_on_screen = 3; uint8_t y_offset = 0; if(param_position < params_on_screen) { const BtTestParam* param = BtTestParamArray_cref(it); uint8_t param_y = y_offset + (param_position * param_height); uint8_t param_text_y = param_y + param_height - 4; if(position == model->position) { canvas_set_color(canvas, ColorBlack); elements_slightly_rounded_box( canvas, 0, param_y + 1, param_width, param_height - 2); canvas_set_color(canvas, ColorWhite); } else { canvas_set_color(canvas, ColorBlack); } canvas_draw_str(canvas, 6, param_text_y, param->label); if(param->current_value_index > 0) { canvas_draw_str(canvas, 50, param_text_y, "<"); } canvas_draw_str( canvas, 61, param_text_y, furi_string_get_cstr(param->current_value_text)); if(param->current_value_index < (param->values_count - 1)) { canvas_draw_str(canvas, 113, param_text_y, ">"); } } position++; } elements_scrollbar(canvas, model->position, BtTestParamArray_size(model->params)); canvas_draw_str(canvas, 6, 60, model->message); if(model->state == BtTestStateStarted) { if(!float_is_equal(model->rssi, 0.0f)) { snprintf(info_str, sizeof(info_str), "RSSI:%3.1f dB", (double)model->rssi); canvas_draw_str_aligned(canvas, 124, 60, AlignRight, AlignBottom, info_str); } } else if(model->state == BtTestStateStopped) { if(model->packets_num_rx) { snprintf(info_str, sizeof(info_str), "%" PRIu32 " pack rcv", model->packets_num_rx); canvas_draw_str_aligned(canvas, 124, 60, AlignRight, AlignBottom, info_str); } else if(model->packets_num_tx) { snprintf(info_str, sizeof(info_str), "%" PRIu32 " pack sent", model->packets_num_tx); canvas_draw_str_aligned(canvas, 124, 60, AlignRight, AlignBottom, info_str); } } } static bool bt_test_input_callback(InputEvent* event, void* context) { BtTest* bt_test = context; furi_assert(bt_test); bool consumed = false; if(event->type == InputTypeShort) { switch(event->key) { case InputKeyUp: consumed = true; bt_test_process_up(bt_test); break; case InputKeyDown: consumed = true; bt_test_process_down(bt_test); break; case InputKeyLeft: consumed = true; bt_test_process_left(bt_test); break; case InputKeyRight: consumed = true; bt_test_process_right(bt_test); break; case InputKeyOk: consumed = true; bt_test_process_ok(bt_test); break; case InputKeyBack: consumed = false; bt_test_process_back(bt_test); break; default: break; } } return consumed; } void bt_test_process_up(BtTest* bt_test) { with_view_model( // -V658 bt_test->view, BtTestModel * model, { uint8_t params_on_screen = 3; if(model->position > 0) { model->position--; if(((model->position - model->window_position) < 1) && model->window_position > 0) { model->window_position--; } } else { model->position = BtTestParamArray_size(model->params) - 1; if(model->position > (params_on_screen - 1)) { model->window_position = model->position - (params_on_screen - 1); } } }, true); } void bt_test_process_down(BtTest* bt_test) { with_view_model( bt_test->view, BtTestModel * model, { uint8_t params_on_screen = 3; if(model->position < (BtTestParamArray_size(model->params) - 1)) { model->position++; if((model->position - model->window_position) > (params_on_screen - 2) && model->window_position < (BtTestParamArray_size(model->params) - params_on_screen)) { model->window_position++; } } else { model->position = 0; model->window_position = 0; } }, true); } BtTestParam* bt_test_get_selected_param(BtTestModel* model) { BtTestParam* param = NULL; BtTestParamArray_it_t it; uint8_t position = 0; for(BtTestParamArray_it(it, model->params); !BtTestParamArray_end_p(it); BtTestParamArray_next(it)) { if(position == model->position) { break; } position++; } param = BtTestParamArray_ref(it); furi_assert(param); return param; } void bt_test_process_left(BtTest* bt_test) { BtTestParam* param; with_view_model( bt_test->view, BtTestModel * model, { param = bt_test_get_selected_param(model); if(param->current_value_index > 0) { param->current_value_index--; if(param->change_callback) { model->state = BtTestStateStopped; model->message = BT_TEST_START_MESSAGE; model->rssi = 0.0f; model->packets_num_rx = 0; model->packets_num_tx = 0; } } }, true); if(param->change_callback) { param->change_callback(param); } } void bt_test_process_right(BtTest* bt_test) { BtTestParam* param; with_view_model( bt_test->view, BtTestModel * model, { param = bt_test_get_selected_param(model); if(param->current_value_index < (param->values_count - 1)) { param->current_value_index++; if(param->change_callback) { model->state = BtTestStateStopped; model->message = BT_TEST_START_MESSAGE; model->rssi = 0.0f; model->packets_num_rx = 0; model->packets_num_tx = 0; } } }, true); if(param->change_callback) { param->change_callback(param); } } void bt_test_process_ok(BtTest* bt_test) { BtTestState state; with_view_model( bt_test->view, BtTestModel * model, { if(model->state == BtTestStateStarted) { model->state = BtTestStateStopped; model->message = BT_TEST_START_MESSAGE; model->rssi = 0.0f; model->packets_num_rx = 0; model->packets_num_tx = 0; } else if(model->state == BtTestStateStopped) { model->state = BtTestStateStarted; model->message = BT_TEST_STOP_MESSAGE; } state = model->state; }, true); if(bt_test->change_state_callback) { bt_test->change_state_callback(state, bt_test->context); } } void bt_test_process_back(BtTest* bt_test) { with_view_model( bt_test->view, BtTestModel * model, { model->state = BtTestStateStopped; model->rssi = 0.0f; model->packets_num_rx = 0; model->packets_num_tx = 0; }, false); if(bt_test->back_callback) { bt_test->back_callback(bt_test->context); } } BtTest* bt_test_alloc(void) { BtTest* bt_test = malloc(sizeof(BtTest)); bt_test->view = view_alloc(); view_set_context(bt_test->view, bt_test); view_allocate_model(bt_test->view, ViewModelTypeLocking, sizeof(BtTestModel)); view_set_draw_callback(bt_test->view, bt_test_draw_callback); view_set_input_callback(bt_test->view, bt_test_input_callback); with_view_model( bt_test->view, BtTestModel * model, { model->state = BtTestStateStopped; model->message = "Ok - Start"; BtTestParamArray_init(model->params); model->position = 0; model->window_position = 0; model->rssi = 0.0f; model->packets_num_tx = 0; model->packets_num_rx = 0; }, true); return bt_test; } void bt_test_free(BtTest* bt_test) { furi_assert(bt_test); with_view_model( bt_test->view, BtTestModel * model, { BtTestParamArray_it_t it; for(BtTestParamArray_it(it, model->params); !BtTestParamArray_end_p(it); BtTestParamArray_next(it)) { furi_string_free(BtTestParamArray_ref(it)->current_value_text); } BtTestParamArray_clear(model->params); }, false); view_free(bt_test->view); free(bt_test); } View* bt_test_get_view(BtTest* bt_test) { furi_assert(bt_test); return bt_test->view; } BtTestParam* bt_test_param_add( BtTest* bt_test, const char* label, uint8_t values_count, BtTestParamChangeCallback change_callback, void* context) { BtTestParam* param = NULL; furi_assert(label); furi_assert(bt_test); with_view_model( bt_test->view, BtTestModel * model, { param = BtTestParamArray_push_new(model->params); param->label = label; param->values_count = values_count; param->change_callback = change_callback; param->context = context; param->current_value_index = 0; param->current_value_text = furi_string_alloc(); }, true); return param; } void bt_test_set_rssi(BtTest* bt_test, float rssi) { furi_assert(bt_test); with_view_model(bt_test->view, BtTestModel * model, { model->rssi = rssi; }, true); } void bt_test_set_packets_tx(BtTest* bt_test, uint32_t packets_num) { furi_assert(bt_test); with_view_model( bt_test->view, BtTestModel * model, { model->packets_num_tx = packets_num; }, true); } void bt_test_set_packets_rx(BtTest* bt_test, uint32_t packets_num) { furi_assert(bt_test); with_view_model( bt_test->view, BtTestModel * model, { model->packets_num_rx = packets_num; }, true); } void bt_test_set_change_state_callback(BtTest* bt_test, BtTestChangeStateCallback callback) { furi_assert(bt_test); furi_assert(callback); bt_test->change_state_callback = callback; } void bt_test_set_back_callback(BtTest* bt_test, BtTestBackCallback callback) { furi_assert(bt_test); furi_assert(callback); bt_test->back_callback = callback; } void bt_test_set_context(BtTest* bt_test, void* context) { furi_assert(bt_test); bt_test->context = context; } void bt_test_set_current_value_index(BtTestParam* param, uint8_t current_value_index) { param->current_value_index = current_value_index; } void bt_test_set_current_value_text(BtTestParam* param, const char* current_value_text) { furi_string_set(param->current_value_text, current_value_text); } uint8_t bt_test_get_current_value_index(BtTestParam* param) { return param->current_value_index; } void* bt_test_get_context(BtTestParam* param) { return param->context; } ================================================ FILE: applications/debug/bt_debug_app/views/bt_test.h ================================================ #pragma once #include typedef enum { BtTestStateStarted, BtTestStateStopped, } BtTestState; typedef struct BtTest BtTest; typedef void (*BtTestChangeStateCallback)(BtTestState state, void* context); typedef void (*BtTestBackCallback)(void* context); typedef struct BtTestParam BtTestParam; typedef void (*BtTestParamChangeCallback)(BtTestParam* param); BtTest* bt_test_alloc(void); void bt_test_free(BtTest* bt_test); View* bt_test_get_view(BtTest* bt_test); BtTestParam* bt_test_param_add( BtTest* bt_test, const char* label, uint8_t values_count, BtTestParamChangeCallback change_callback, void* context); void bt_test_set_change_state_callback(BtTest* bt_test, BtTestChangeStateCallback callback); void bt_test_set_back_callback(BtTest* bt_test, BtTestBackCallback callback); void bt_test_set_context(BtTest* bt_test, void* context); void bt_test_set_rssi(BtTest* bt_test, float rssi); void bt_test_set_packets_tx(BtTest* bt_test, uint32_t packets_num); void bt_test_set_packets_rx(BtTest* bt_test, uint32_t packets_num); void bt_test_set_current_value_index(BtTestParam* param, uint8_t current_value_index); void bt_test_set_current_value_text(BtTestParam* param, const char* current_value_text); uint8_t bt_test_get_current_value_index(BtTestParam* param); void* bt_test_get_context(BtTestParam* param); ================================================ FILE: applications/debug/bt_debug_app/views/bt_test_types.h ================================================ #pragma once typedef enum { BtTestModeRx, BtTestModeTx, BtTestModeTxHopping, } BtTestMode; typedef enum { BtTestChannel2402 = 0, BtTestChannel2440 = 19, BtTestChannel2480 = 39, } BtTestChannel; typedef enum { BtPower0dB = 0x19, BtPower2dB = 0x1B, BtPower4dB = 0x1D, BtPower6dB = 0x1F, } BtTestPower; typedef enum { BtDataRate1M = 1, BtDataRate2M = 2, } BtTestDataRate; typedef struct { uint32_t value; const char* str; } BtTestParamValue; ================================================ FILE: applications/debug/ccid_test/application.fam ================================================ App( appid="ccid_test", name="CCID Debug", apptype=FlipperAppType.DEBUG, entry_point="ccid_test_app", requires=[ "gui", ], provides=[ "ccid_test", ], stack_size=1 * 1024, fap_category="Debug", ) ================================================ FILE: applications/debug/ccid_test/ccid_test_app.c ================================================ #include #include #include #include #include #include #include #include "iso7816/iso7816_handler.h" #include "iso7816/iso7816_t0_apdu.h" #include "iso7816/iso7816_atr.h" #include "iso7816/iso7816_response.h" #include "ccid_test_app_commands.h" typedef enum { EventTypeInput, } EventType; typedef struct { Gui* gui; ViewPort* view_port; FuriMessageQueue* event_queue; FuriHalUsbCcidConfig ccid_cfg; Iso7816Handler* iso7816_handler; } CcidTestApp; typedef struct { union { InputEvent input; }; EventType type; } CcidTestAppEvent; typedef enum { CcidTestSubmenuIndexInsertSmartcard, CcidTestSubmenuIndexRemoveSmartcard, CcidTestSubmenuIndexInsertSmartcardReader } SubmenuIndex; static void ccid_test_app_render_callback(Canvas* canvas, void* ctx) { UNUSED(ctx); canvas_clear(canvas); canvas_set_font(canvas, FontPrimary); canvas_draw_str(canvas, 0, 10, "CCID Test App"); canvas_set_font(canvas, FontSecondary); canvas_draw_str(canvas, 0, 63, "Hold [back] to exit"); } static void ccid_test_app_input_callback(InputEvent* input_event, void* ctx) { FuriMessageQueue* event_queue = ctx; CcidTestAppEvent event; event.type = EventTypeInput; event.input = *input_event; furi_message_queue_put(event_queue, &event, FuriWaitForever); } uint32_t ccid_test_exit(void* context) { UNUSED(context); return VIEW_NONE; } CcidTestApp* ccid_test_app_alloc(void) { CcidTestApp* app = malloc(sizeof(CcidTestApp)); //setup CCID USB // On linux: set VID PID using: /usr/lib/pcsc/drivers/ifd-ccid.bundle/Contents/Info.plist app->ccid_cfg.vid = 0x076B; app->ccid_cfg.pid = 0x3A21; app->iso7816_handler = iso7816_handler_alloc(); app->iso7816_handler->iso7816_answer_to_reset = iso7816_answer_to_reset; app->iso7816_handler->iso7816_process_command = iso7816_process_command; // Gui app->gui = furi_record_open(RECORD_GUI); //viewport app->view_port = view_port_alloc(); gui_add_view_port(app->gui, app->view_port, GuiLayerFullscreen); view_port_draw_callback_set(app->view_port, ccid_test_app_render_callback, NULL); //message queue app->event_queue = furi_message_queue_alloc(8, sizeof(CcidTestAppEvent)); view_port_input_callback_set(app->view_port, ccid_test_app_input_callback, app->event_queue); return app; } void ccid_test_app_free(CcidTestApp* app) { furi_assert(app); //message queue furi_message_queue_free(app->event_queue); //view port gui_remove_view_port(app->gui, app->view_port); view_port_free(app->view_port); // Close gui record furi_record_close(RECORD_GUI); app->gui = NULL; iso7816_handler_free(app->iso7816_handler); // Free rest free(app); } int32_t ccid_test_app(void* p) { UNUSED(p); //setup view CcidTestApp* app = ccid_test_app_alloc(); FuriHalUsbInterface* usb_mode_prev = furi_hal_usb_get_config(); furi_hal_usb_unlock(); furi_check(furi_hal_usb_set_config(&usb_ccid, &app->ccid_cfg) == true); iso7816_handler_set_usb_ccid_callbacks(); furi_hal_usb_ccid_insert_smartcard(); //handle button events CcidTestAppEvent event; while(1) { FuriStatus event_status = furi_message_queue_get(app->event_queue, &event, FuriWaitForever); if(event_status == FuriStatusOk) { if(event.type == EventTypeInput) { if(event.input.type == InputTypeLong && event.input.key == InputKeyBack) { break; } } } view_port_update(app->view_port); } //tear down USB iso7816_handler_reset_usb_ccid_callbacks(); furi_hal_usb_set_config(usb_mode_prev, NULL); //teardown view ccid_test_app_free(app); return 0; } ================================================ FILE: applications/debug/ccid_test/ccid_test_app_commands.c ================================================ #include "iso7816/iso7816_t0_apdu.h" #include "iso7816/iso7816_response.h" //Instruction 1: returns an OK response unconditionally //APDU example: 0x01:0x01:0x00:0x00 //response: SW1=0x90, SW2=0x00 void handle_instruction_01(ISO7816_Response_APDU* response_apdu) { response_apdu->DataLen = 0; iso7816_set_response(response_apdu, ISO7816_RESPONSE_OK); } //Instruction 2: expect command with no body, replies wit with a body with two bytes //APDU example: 0x01:0x02:0x00:0x00:0x02 //response: 'bc' (0x62, 0x63) SW1=0x90, SW2=0x00 void handle_instruction_02( uint8_t p1, uint8_t p2, uint16_t lc, uint16_t le, ISO7816_Response_APDU* response_apdu) { if(p1 == 0 && p2 == 0 && lc == 0 && le >= 2) { response_apdu->Data[0] = 0x62; response_apdu->Data[1] = 0x63; response_apdu->DataLen = 2; iso7816_set_response(response_apdu, ISO7816_RESPONSE_OK); } else if(p1 != 0 || p2 != 0) { iso7816_set_response(response_apdu, ISO7816_RESPONSE_WRONG_PARAMETERS_P1_P2); } else { iso7816_set_response(response_apdu, ISO7816_RESPONSE_WRONG_LENGTH); } } //Instruction 3: sends a command with a body with two bytes, receives a response with no bytes //APDU example: 0x01:0x03:0x00:0x00:0x02:CA:FE //response SW1=0x90, SW2=0x00 void handle_instruction_03( uint8_t p1, uint8_t p2, uint16_t lc, ISO7816_Response_APDU* response_apdu) { if(p1 == 0 && p2 == 0 && lc == 2) { response_apdu->DataLen = 0; iso7816_set_response(response_apdu, ISO7816_RESPONSE_OK); } else if(p1 != 0 || p2 != 0) { iso7816_set_response(response_apdu, ISO7816_RESPONSE_WRONG_PARAMETERS_P1_P2); } else { iso7816_set_response(response_apdu, ISO7816_RESPONSE_WRONG_LENGTH); } } //instruction 4: sends a command with a body with 'n' bytes, receives a response with 'n' bytes //APDU example: 0x01:0x04:0x00:0x00:0x04:0x01:0x02:0x03:0x04:0x04 //receives (0x01, 0x02, 0x03, 0x04) SW1=0x90, SW2=0x00 void handle_instruction_04( uint8_t p1, uint8_t p2, uint16_t lc, uint16_t le, const uint8_t* command_apdu_data_buffer, ISO7816_Response_APDU* response_apdu) { if(p1 == 0 && p2 == 0 && lc > 0 && le > 0 && le >= lc) { for(uint16_t i = 0; i < lc; i++) { response_apdu->Data[i] = command_apdu_data_buffer[i]; } response_apdu->DataLen = lc; iso7816_set_response(response_apdu, ISO7816_RESPONSE_OK); } else if(p1 != 0 || p2 != 0) { iso7816_set_response(response_apdu, ISO7816_RESPONSE_WRONG_PARAMETERS_P1_P2); } else { iso7816_set_response(response_apdu, ISO7816_RESPONSE_WRONG_LENGTH); } } void iso7816_answer_to_reset(Iso7816Atr* atr) { //minimum valid ATR: https://smartcard-atr.apdu.fr/parse?ATR=3B+00 atr->TS = 0x3B; atr->T0 = 0x00; } void iso7816_process_command( const ISO7816_Command_APDU* command_apdu, ISO7816_Response_APDU* response_apdu) { //example 1: sends a command with no body, receives a response with no body //sends APDU 0x01:0x01:0x00:0x00 //receives SW1=0x90, SW2=0x00 if(command_apdu->CLA == 0x01) { switch(command_apdu->INS) { case 0x01: handle_instruction_01(response_apdu); break; case 0x02: handle_instruction_02( command_apdu->P1, command_apdu->P2, command_apdu->Lc, command_apdu->Le, response_apdu); break; case 0x03: handle_instruction_03( command_apdu->P1, command_apdu->P2, command_apdu->Lc, response_apdu); break; case 0x04: handle_instruction_04( command_apdu->P1, command_apdu->P2, command_apdu->Lc, command_apdu->Le, command_apdu->Data, response_apdu); break; default: iso7816_set_response(response_apdu, ISO7816_RESPONSE_INSTRUCTION_NOT_SUPPORTED); } } else { iso7816_set_response(response_apdu, ISO7816_RESPONSE_CLASS_NOT_SUPPORTED); } } ================================================ FILE: applications/debug/ccid_test/ccid_test_app_commands.h ================================================ #include "iso7816/iso7816_t0_apdu.h" void iso7816_answer_to_reset(Iso7816Atr* atr); void iso7816_process_command( const ISO7816_Command_APDU* command_apdu, ISO7816_Response_APDU* response_apdu); ================================================ FILE: applications/debug/ccid_test/client/ccid_client.py ================================================ #!/usr/bin/env python # pylint: disable=missing-module-docstring, too-many-arguments, consider-using-f-string, missing-function-docstring from smartcard.System import readers def test_apdu(connection, test_name, apdu, expected_sw1, expected_sw2, expected_data): print("Running test: [%s]" % test_name) data, sw1, sw2 = connection.transmit(apdu) failed = [] if sw1 != expected_sw1: failed.append("SW1: Expected %x, actual %x" % (expected_sw1, sw1)) if sw2 != expected_sw2: failed.append("SW2: Expected %x, actual %x" % (expected_sw2, sw2)) if len(data) != len(expected_data): failed.append( "Data: Sizes differ: Expected %x, actual %x" % (len(expected_data), len(data)) ) print(data) elif len(data) > 0: data_matches = True for i, _ in enumerate(data): if data[i] != expected_data[i]: data_matches = False if not data_matches: failed.append("Data: Expected %s, actual %s" % (expected_data, data)) if len(failed) > 0: print("Test failed: ") for failure in failed: print("- %s" % failure) else: print("Test passed!") def main(): r = readers() print("Found following smartcard readers: ") for i, sc in enumerate(r): print("[%d] %s" % (i, sc)) print("Select the smartcard reader you want to run tests against:") reader_index = int(input()) if reader_index < len(r): connection = r[reader_index].createConnection() connection.connect() test_apdu( connection, "INS 0x01: No Lc, no Data, No Le. Expect no data in return", [0x01, 0x01, 0x00, 0x00], 0x90, 0x00, [], ) test_apdu( connection, "INS 0x02: No Lc, no Data, Le=2. Expect 2 byte data in return", [0x01, 0x02, 0x00, 0x00, 0x02], 0x90, 0x00, [0x62, 0x63], ) test_apdu( connection, "INS 0x03: Lc=2, data=[0xCA, 0xFE], No Le. Expect no data in return", [0x01, 0x03, 0x00, 0x00, 0x02, 0xCA, 0xFE], 0x90, 0x00, [], ) test_apdu( connection, "INS 0x04: Lc=2, data=[0xCA, 0xFE], Le=2. Expect 1 byte data in return", [0x01, 0x04, 0x00, 0x00, 0x02, 0xCA, 0xFE, 0x02], 0x90, 0x00, [0xCA, 0xFE], ) small_apdu = list(range(0, 0x0F)) test_apdu( connection, "INS 0x04: Lc=0x0F, data=small_apdu, Le=0x0F. Expect 14 bytes data in return", [0x01, 0x04, 0x00, 0x00, 0x0F] + small_apdu + [0x0F], 0x90, 0x00, small_apdu, ) upper_bound = 0xF0 max_apdu = list(range(0, upper_bound)) test_apdu( connection, "INS 0x04: Lc=0x%x, data=max_apdu, Le=0x%x. Expect 0x%x bytes data in return" % (upper_bound, upper_bound, upper_bound), [0x01, 0x04, 0x00, 0x00, upper_bound] + max_apdu + [upper_bound], 0x90, 0x00, max_apdu, ) if __name__ == "__main__": main() ================================================ FILE: applications/debug/ccid_test/client/requirements.txt ================================================ pyscard # or sudo apt install python3-pyscard ================================================ FILE: applications/debug/ccid_test/iso7816/iso7816_atr.h ================================================ #pragma once typedef struct { uint8_t TS; uint8_t T0; } Iso7816Atr; ================================================ FILE: applications/debug/ccid_test/iso7816/iso7816_handler.c ================================================ // transforms low level calls such as XFRCallback or ICC Power on to a structured one // an application can register these calls and listen for the callbacks defined in Iso7816Callbacks #include #include #include #include #include "iso7816_handler.h" #include "iso7816_t0_apdu.h" #include "iso7816_atr.h" #include "iso7816_response.h" static Iso7816Handler* iso7816_handler; static CcidCallbacks* ccid_callbacks; static uint8_t* command_apdu_buffer; static uint8_t* response_apdu_buffer; void iso7816_icc_power_on_callback(uint8_t* atr_data, uint32_t* atr_data_len, void* context) { furi_check(context); Iso7816Handler* handler = (Iso7816Handler*)context; Iso7816Atr iso7816_atr; handler->iso7816_answer_to_reset(&iso7816_atr); furi_assert(iso7816_atr.T0 == 0x00); uint8_t atr_buffer[2] = {iso7816_atr.TS, iso7816_atr.T0}; *atr_data_len = 2; memcpy(atr_data, atr_buffer, sizeof(uint8_t) * (*atr_data_len)); } //dataBlock points to the buffer //dataBlockLen tells reader how nany bytes should be read void iso7816_xfr_datablock_callback( const uint8_t* pc_to_reader_datablock, uint32_t pc_to_reader_datablock_len, uint8_t* reader_to_pc_datablock, uint32_t* reader_to_pc_datablock_len, void* context) { furi_check(context); Iso7816Handler* handler = (Iso7816Handler*)context; ISO7816_Response_APDU* response_apdu = (ISO7816_Response_APDU*)response_apdu_buffer; ISO7816_Command_APDU* command_apdu = (ISO7816_Command_APDU*)command_apdu_buffer; uint8_t result = iso7816_read_command_apdu( command_apdu, pc_to_reader_datablock, pc_to_reader_datablock_len, CCID_SHORT_APDU_SIZE); if(result == ISO7816_READ_COMMAND_APDU_OK) { handler->iso7816_process_command(command_apdu, response_apdu); furi_assert(response_apdu->DataLen < CCID_SHORT_APDU_SIZE); } else if(result == ISO7816_READ_COMMAND_APDU_ERROR_WRONG_LE) { iso7816_set_response(response_apdu, ISO7816_RESPONSE_WRONG_LE); } else if(result == ISO7816_READ_COMMAND_APDU_ERROR_WRONG_LENGTH) { iso7816_set_response(response_apdu, ISO7816_RESPONSE_WRONG_LENGTH); } iso7816_write_response_apdu(response_apdu, reader_to_pc_datablock, reader_to_pc_datablock_len); } Iso7816Handler* iso7816_handler_alloc() { iso7816_handler = malloc(sizeof(Iso7816Handler)); command_apdu_buffer = malloc(sizeof(ISO7816_Command_APDU) + CCID_SHORT_APDU_SIZE); response_apdu_buffer = malloc(sizeof(ISO7816_Response_APDU) + CCID_SHORT_APDU_SIZE); ccid_callbacks = malloc(sizeof(CcidCallbacks)); ccid_callbacks->icc_power_on_callback = iso7816_icc_power_on_callback; ccid_callbacks->xfr_datablock_callback = iso7816_xfr_datablock_callback; return iso7816_handler; } void iso7816_handler_set_usb_ccid_callbacks() { furi_hal_usb_ccid_set_callbacks(ccid_callbacks, iso7816_handler); } void iso7816_handler_reset_usb_ccid_callbacks() { furi_hal_usb_ccid_set_callbacks(NULL, NULL); } void iso7816_handler_free(Iso7816Handler* handler) { free(ccid_callbacks); free(command_apdu_buffer); free(response_apdu_buffer); free(handler); } ================================================ FILE: applications/debug/ccid_test/iso7816/iso7816_handler.h ================================================ #pragma once #include #include "iso7816_atr.h" #include "iso7816_t0_apdu.h" typedef struct { void (*iso7816_answer_to_reset)(Iso7816Atr* atr); void (*iso7816_process_command)( const ISO7816_Command_APDU* command, ISO7816_Response_APDU* response); } Iso7816Handler; Iso7816Handler* iso7816_handler_alloc(); void iso7816_handler_free(Iso7816Handler* handler); void iso7816_handler_set_usb_ccid_callbacks(); void iso7816_handler_reset_usb_ccid_callbacks(); ================================================ FILE: applications/debug/ccid_test/iso7816/iso7816_response.c ================================================ #include #include "iso7816_t0_apdu.h" #include "iso7816_response.h" void iso7816_set_response(ISO7816_Response_APDU* responseAPDU, uint16_t responseCode) { responseAPDU->SW1 = (responseCode >> (8 * 1)) & 0xff; responseAPDU->SW2 = (responseCode >> (8 * 0)) & 0xff; } ================================================ FILE: applications/debug/ccid_test/iso7816/iso7816_response.h ================================================ #pragma once #define ISO7816_RESPONSE_OK 0x9000 #define ISO7816_RESPONSE_WRONG_LENGTH 0x6700 #define ISO7816_RESPONSE_WRONG_PARAMETERS_P1_P2 0x6A00 #define ISO7816_RESPONSE_WRONG_LE 0x6C00 #define ISO7816_RESPONSE_INSTRUCTION_NOT_SUPPORTED 0x6D00 #define ISO7816_RESPONSE_CLASS_NOT_SUPPORTED 0x6E00 #define ISO7816_RESPONSE_INTERNAL_EXCEPTION 0x6F00 void iso7816_set_response(ISO7816_Response_APDU* responseAPDU, uint16_t responseCode); ================================================ FILE: applications/debug/ccid_test/iso7816/iso7816_t0_apdu.c ================================================ /* Implements rudimentary iso7816-3 support for APDU (T=0) */ #include #include #include "iso7816_t0_apdu.h" //reads pc_to_reader_datablock_len with pc_to_reader_datablock_len size, translate it into a ISO7816_Command_APDU type //extra data will be pointed to commandDataBuffer uint8_t iso7816_read_command_apdu( ISO7816_Command_APDU* command, const uint8_t* pc_to_reader_datablock, uint32_t pc_to_reader_datablock_len, uint32_t max_apdu_size) { command->CLA = pc_to_reader_datablock[0]; command->INS = pc_to_reader_datablock[1]; command->P1 = pc_to_reader_datablock[2]; command->P2 = pc_to_reader_datablock[3]; if(pc_to_reader_datablock_len == 4) { command->Lc = 0; command->Le = 0; command->LePresent = false; return ISO7816_READ_COMMAND_APDU_OK; } else if(pc_to_reader_datablock_len == 5) { //short le command->Lc = 0; command->Le = pc_to_reader_datablock[4]; command->LePresent = true; return ISO7816_READ_COMMAND_APDU_OK; } else if(pc_to_reader_datablock_len > 5 && pc_to_reader_datablock[4] != 0x00) { //short lc command->Lc = pc_to_reader_datablock[4]; if(command->Lc > 0 && command->Lc < max_apdu_size) { //-V560 memcpy(command->Data, &pc_to_reader_datablock[5], command->Lc); //does it have a short le too? if(pc_to_reader_datablock_len == (uint32_t)(command->Lc + 5)) { command->Le = 0; command->LePresent = false; return ISO7816_READ_COMMAND_APDU_OK; } else if(pc_to_reader_datablock_len == (uint32_t)(command->Lc + 6)) { command->Le = pc_to_reader_datablock[pc_to_reader_datablock_len - 1]; command->LePresent = true; return ISO7816_READ_COMMAND_APDU_OK; } else { return ISO7816_READ_COMMAND_APDU_ERROR_WRONG_LENGTH; } } else { return ISO7816_READ_COMMAND_APDU_ERROR_WRONG_LENGTH; } } else { return ISO7816_READ_COMMAND_APDU_ERROR_WRONG_LENGTH; } } //data buffer contains the whole APU response (response + trailer (SW1+SW2)) void iso7816_write_response_apdu( const ISO7816_Response_APDU* response, uint8_t* reader_to_pc_datablock, uint32_t* reader_to_pc_datablock_len) { uint32_t responseDataBufferIndex = 0; //response body if(response->DataLen > 0) { while(responseDataBufferIndex < response->DataLen) { reader_to_pc_datablock[responseDataBufferIndex] = response->Data[responseDataBufferIndex]; responseDataBufferIndex++; } } //trailer reader_to_pc_datablock[responseDataBufferIndex] = response->SW1; responseDataBufferIndex++; reader_to_pc_datablock[responseDataBufferIndex] = response->SW2; responseDataBufferIndex++; *reader_to_pc_datablock_len = responseDataBufferIndex; } ================================================ FILE: applications/debug/ccid_test/iso7816/iso7816_t0_apdu.h ================================================ #pragma once #include #include "iso7816_atr.h" #include "core/common_defines.h" #define ISO7816_READ_COMMAND_APDU_OK 0 #define ISO7816_READ_COMMAND_APDU_ERROR_WRONG_LE 1 #define ISO7816_READ_COMMAND_APDU_ERROR_WRONG_LENGTH 2 typedef struct { //header uint8_t CLA; uint8_t INS; uint8_t P1; uint8_t P2; //body uint16_t Lc; //data length uint16_t Le; //maximum response data length expected by client //Le can have value of 0x00, which actually meand 0x100 = 256 bool LePresent; uint8_t Data[0]; } FURI_PACKED ISO7816_Command_APDU; typedef struct { uint8_t SW1; uint8_t SW2; uint16_t DataLen; uint8_t Data[0]; } FURI_PACKED ISO7816_Response_APDU; uint8_t iso7816_read_command_apdu( ISO7816_Command_APDU* command, const uint8_t* pc_to_reader_datablock, uint32_t pc_to_reader_datablock_len, uint32_t max_apdu_size); void iso7816_write_response_apdu( const ISO7816_Response_APDU* response, uint8_t* reader_to_pc_datablock, uint32_t* reader_to_pc_datablock_len); ================================================ FILE: applications/debug/crash_test/application.fam ================================================ App( appid="crash_test", name="Crash Test", apptype=FlipperAppType.DEBUG, entry_point="crash_test_app", requires=["gui"], stack_size=1 * 1024, fap_category="Debug", ) ================================================ FILE: applications/debug/crash_test/crash_test.c ================================================ #include #include #include #include #include #define TAG "CrashTest" typedef struct { Gui* gui; ViewDispatcher* view_dispatcher; Submenu* submenu; } CrashTest; typedef enum { CrashTestViewSubmenu, } CrashTestView; typedef enum { CrashTestSubmenuCheck, CrashTestSubmenuCheckMessage, CrashTestSubmenuAssert, CrashTestSubmenuAssertMessage, CrashTestSubmenuCrash, CrashTestSubmenuHalt, CrashTestSubmenuHeapUnderflow, CrashTestSubmenuHeapOverflow, } CrashTestSubmenu; static void crash_test_corrupt_heap_underflow(void) { const size_t block_size = 1000; const size_t underflow_size = 123; uint8_t* block = malloc(block_size); #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wstringop-overflow" // that's what we want! memset(block - underflow_size, 0xDD, underflow_size); // -V769 #pragma GCC diagnostic pop free(block); // should crash here (if compiled with DEBUG=1) // If we got here, the heap wasn't able to detect our corruption and crash furi_crash("Test failed, should've crashed with \"FreeRTOS Assert\" error"); } static void crash_test_corrupt_heap_overflow(void) { const size_t block_size = 1000; const size_t overflow_size = 123; uint8_t* block1 = malloc(block_size); uint8_t* block2 = malloc(block_size); memset(block2, 12, 34); // simulate use to avoid optimization // -V597 // -V1086 #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wstringop-overflow" // that's what we want! memset(block1 + block_size, 0xDD, overflow_size); // -V769 // -V512 #pragma GCC diagnostic pop uint8_t* block3 = malloc(block_size); memset(block3, 12, 34); // simulate use to avoid optimization // -V597 // -V1086 free(block3); // should crash here (if compiled with DEBUG=1) free(block2); free(block1); // If we got here, the heap wasn't able to detect our corruption and crash furi_crash("Test failed, should've crashed with \"FreeRTOS Assert\" error"); } static void crash_test_submenu_callback(void* context, uint32_t index) { CrashTest* instance = (CrashTest*)context; UNUSED(instance); switch(index) { case CrashTestSubmenuCheck: furi_check(false); break; case CrashTestSubmenuCheckMessage: furi_check(false, "Crash test: furi_check with message"); break; case CrashTestSubmenuAssert: furi_assert(false); break; case CrashTestSubmenuAssertMessage: furi_assert(false, "Crash test: furi_assert with message"); break; case CrashTestSubmenuCrash: furi_crash("Crash test: furi_crash"); break; case CrashTestSubmenuHalt: furi_halt("Crash test: furi_halt"); break; case CrashTestSubmenuHeapUnderflow: crash_test_corrupt_heap_underflow(); break; case CrashTestSubmenuHeapOverflow: crash_test_corrupt_heap_overflow(); break; default: furi_crash(); } } static uint32_t crash_test_exit_callback(void* context) { UNUSED(context); return VIEW_NONE; } CrashTest* crash_test_alloc(void) { CrashTest* instance = malloc(sizeof(CrashTest)); View* view = NULL; instance->gui = furi_record_open(RECORD_GUI); instance->view_dispatcher = view_dispatcher_alloc(); view_dispatcher_attach_to_gui( instance->view_dispatcher, instance->gui, ViewDispatcherTypeFullscreen); // Menu instance->submenu = submenu_alloc(); view = submenu_get_view(instance->submenu); view_set_previous_callback(view, crash_test_exit_callback); view_dispatcher_add_view(instance->view_dispatcher, CrashTestViewSubmenu, view); submenu_add_item( instance->submenu, "Check", CrashTestSubmenuCheck, crash_test_submenu_callback, instance); submenu_add_item( instance->submenu, "Check with message", CrashTestSubmenuCheckMessage, crash_test_submenu_callback, instance); submenu_add_item( instance->submenu, "Assert", CrashTestSubmenuAssert, crash_test_submenu_callback, instance); submenu_add_item( instance->submenu, "Assert with message", CrashTestSubmenuAssertMessage, crash_test_submenu_callback, instance); submenu_add_item( instance->submenu, "Crash", CrashTestSubmenuCrash, crash_test_submenu_callback, instance); submenu_add_item( instance->submenu, "Halt", CrashTestSubmenuHalt, crash_test_submenu_callback, instance); submenu_add_item( instance->submenu, "Heap underflow", CrashTestSubmenuHeapUnderflow, crash_test_submenu_callback, instance); submenu_add_item( instance->submenu, "Heap overflow", CrashTestSubmenuHeapOverflow, crash_test_submenu_callback, instance); return instance; } void crash_test_free(CrashTest* instance) { view_dispatcher_remove_view(instance->view_dispatcher, CrashTestViewSubmenu); submenu_free(instance->submenu); view_dispatcher_free(instance->view_dispatcher); furi_record_close(RECORD_GUI); free(instance); } int32_t crash_test_run(CrashTest* instance) { view_dispatcher_switch_to_view(instance->view_dispatcher, CrashTestViewSubmenu); view_dispatcher_run(instance->view_dispatcher); return 0; } int32_t crash_test_app(void* p) { UNUSED(p); CrashTest* instance = crash_test_alloc(); int32_t ret = crash_test_run(instance); crash_test_free(instance); return ret; } ================================================ FILE: applications/debug/direct_draw/application.fam ================================================ App( appid="direct_draw", name="Direct Draw", apptype=FlipperAppType.DEBUG, entry_point="direct_draw_app", requires=["gui", "input"], stack_size=2 * 1024, fap_category="Debug", ) ================================================ FILE: applications/debug/direct_draw/direct_draw.c ================================================ #include #include #include #define BUFFER_SIZE (32U) typedef struct { FuriPubSub* input; FuriPubSubSubscription* input_subscription; Gui* gui; Canvas* canvas; bool stop; uint32_t counter; } DirectDraw; static void gui_input_events_callback(const void* value, void* ctx) { furi_assert(value); furi_assert(ctx); DirectDraw* instance = ctx; const InputEvent* event = value; if(event->key == InputKeyBack && event->type == InputTypeShort) { instance->stop = true; } } static DirectDraw* direct_draw_alloc(void) { DirectDraw* instance = malloc(sizeof(DirectDraw)); instance->input = furi_record_open(RECORD_INPUT_EVENTS); instance->gui = furi_record_open(RECORD_GUI); instance->canvas = gui_direct_draw_acquire(instance->gui); instance->input_subscription = furi_pubsub_subscribe(instance->input, gui_input_events_callback, instance); return instance; } static void direct_draw_free(DirectDraw* instance) { furi_pubsub_unsubscribe(instance->input, instance->input_subscription); gui_direct_draw_release(instance->gui); furi_record_close(RECORD_GUI); furi_record_close(RECORD_INPUT_EVENTS); free(instance); } static void direct_draw_block(Canvas* canvas, uint32_t size, uint32_t counter) { size += 16; uint8_t width = canvas_width(canvas) - size; uint8_t height = canvas_height(canvas) - size; uint8_t x = counter % width; if((counter / width) % 2) { x = width - x; } uint8_t y = counter % height; if((counter / height) % 2) { y = height - y; } canvas_draw_box(canvas, x, y, size, size); } static void direct_draw_run(DirectDraw* instance) { size_t start = DWT->CYCCNT; size_t counter = 0; float fps = 0; furi_thread_set_current_priority(FuriThreadPriorityIdle); do { size_t elapsed = DWT->CYCCNT - start; char buffer[BUFFER_SIZE] = {0}; if(elapsed >= 64000000) { fps = (float)counter / ((float)elapsed / 64000000.0f); start = DWT->CYCCNT; counter = 0; } snprintf(buffer, BUFFER_SIZE, "FPS: %.1f", (double)fps); canvas_reset(instance->canvas); canvas_set_color(instance->canvas, ColorXOR); direct_draw_block(instance->canvas, instance->counter % 16, instance->counter); direct_draw_block(instance->canvas, instance->counter * 2 % 16, instance->counter * 2); direct_draw_block(instance->canvas, instance->counter * 3 % 16, instance->counter * 3); direct_draw_block(instance->canvas, instance->counter * 4 % 16, instance->counter * 4); direct_draw_block(instance->canvas, instance->counter * 5 % 16, instance->counter * 5); canvas_draw_str(instance->canvas, 10, 10, buffer); canvas_commit(instance->canvas); counter++; instance->counter++; furi_thread_yield(); } while(!instance->stop); } int32_t direct_draw_app(void* p) { UNUSED(p); DirectDraw* instance = direct_draw_alloc(); direct_draw_run(instance); direct_draw_free(instance); return 0; } ================================================ FILE: applications/debug/display_test/application.fam ================================================ App( appid="display_test", name="Display Test", apptype=FlipperAppType.DEBUG, entry_point="display_test_app", requires=["gui"], fap_libs=["u8g2"], stack_size=1 * 1024, fap_category="Debug", ) ================================================ FILE: applications/debug/display_test/display_test.c ================================================ #include #include // Need access to u8g2 #include #include #include #include #include #include #include "view_display_test.h" #define TAG "DisplayTest" typedef struct { Gui* gui; ViewDispatcher* view_dispatcher; ViewDisplayTest* view_display_test; VariableItemList* variable_item_list; Submenu* submenu; bool config_bias; uint8_t config_contrast; uint8_t config_regulation_ratio; } DisplayTest; typedef enum { DisplayTestViewSubmenu, DisplayTestViewConfigure, DisplayTestViewDisplayTest, } DisplayTestView; const bool config_bias_value[] = { true, false, }; const char* const config_bias_text[] = { "1/7", "1/9", }; const uint8_t config_regulation_ratio_value[] = { 0b000, 0b001, 0b010, 0b011, 0b100, 0b101, 0b110, 0b111, }; const char* const config_regulation_ratio_text[] = { "3.0", "3.5", "4.0", "4.5", "5.0", "5.5", "6.0", "6.5", }; static void display_test_submenu_callback(void* context, uint32_t index) { DisplayTest* instance = (DisplayTest*)context; view_dispatcher_switch_to_view(instance->view_dispatcher, index); } static uint32_t display_test_previous_callback(void* context) { UNUSED(context); return DisplayTestViewSubmenu; } static uint32_t display_test_exit_callback(void* context) { UNUSED(context); return VIEW_NONE; } static void display_test_reload_config(DisplayTest* instance) { FURI_LOG_I( TAG, "contrast: %d, regulation_ratio: %d, bias: %d", instance->config_contrast, instance->config_regulation_ratio, instance->config_bias); u8x8_d_st756x_init( &instance->gui->canvas->fb.u8x8, instance->config_contrast, instance->config_regulation_ratio, instance->config_bias); } static void display_config_set_bias(VariableItem* item) { DisplayTest* instance = variable_item_get_context(item); uint8_t index = variable_item_get_current_value_index(item); variable_item_set_current_value_text(item, config_bias_text[index]); instance->config_bias = config_bias_value[index]; display_test_reload_config(instance); } static void display_config_set_regulation_ratio(VariableItem* item) { DisplayTest* instance = variable_item_get_context(item); uint8_t index = variable_item_get_current_value_index(item); variable_item_set_current_value_text(item, config_regulation_ratio_text[index]); instance->config_regulation_ratio = config_regulation_ratio_value[index]; display_test_reload_config(instance); } static void display_config_set_contrast(VariableItem* item) { DisplayTest* instance = variable_item_get_context(item); uint8_t index = variable_item_get_current_value_index(item); FuriString* temp; temp = furi_string_alloc(); furi_string_cat_printf(temp, "%d", index); variable_item_set_current_value_text(item, furi_string_get_cstr(temp)); furi_string_free(temp); instance->config_contrast = index; display_test_reload_config(instance); } DisplayTest* display_test_alloc(void) { DisplayTest* instance = malloc(sizeof(DisplayTest)); View* view = NULL; instance->gui = furi_record_open(RECORD_GUI); instance->view_dispatcher = view_dispatcher_alloc(); view_dispatcher_attach_to_gui( instance->view_dispatcher, instance->gui, ViewDispatcherTypeFullscreen); // Test instance->view_display_test = view_display_test_alloc(); view = view_display_test_get_view(instance->view_display_test); view_set_previous_callback(view, display_test_previous_callback); view_dispatcher_add_view(instance->view_dispatcher, DisplayTestViewDisplayTest, view); // Configure instance->variable_item_list = variable_item_list_alloc(); view = variable_item_list_get_view(instance->variable_item_list); view_set_previous_callback(view, display_test_previous_callback); view_dispatcher_add_view(instance->view_dispatcher, DisplayTestViewConfigure, view); // Configuration items VariableItem* item; instance->config_bias = false; instance->config_contrast = 32; instance->config_regulation_ratio = 0b101; // Bias item = variable_item_list_add( instance->variable_item_list, "Bias:", COUNT_OF(config_bias_value), display_config_set_bias, instance); variable_item_set_current_value_index(item, 1); variable_item_set_current_value_text(item, config_bias_text[1]); // Regulation Ratio item = variable_item_list_add( instance->variable_item_list, "Reg Ratio:", COUNT_OF(config_regulation_ratio_value), display_config_set_regulation_ratio, instance); variable_item_set_current_value_index(item, 5); variable_item_set_current_value_text(item, config_regulation_ratio_text[5]); // Contrast item = variable_item_list_add( instance->variable_item_list, "Contrast:", 64, display_config_set_contrast, instance); variable_item_set_current_value_index(item, 32); variable_item_set_current_value_text(item, "32"); // Menu instance->submenu = submenu_alloc(); view = submenu_get_view(instance->submenu); view_set_previous_callback(view, display_test_exit_callback); view_dispatcher_add_view(instance->view_dispatcher, DisplayTestViewSubmenu, view); submenu_add_item( instance->submenu, "Test", DisplayTestViewDisplayTest, display_test_submenu_callback, instance); submenu_add_item( instance->submenu, "Configure", DisplayTestViewConfigure, display_test_submenu_callback, instance); return instance; } void display_test_free(DisplayTest* instance) { view_dispatcher_remove_view(instance->view_dispatcher, DisplayTestViewSubmenu); submenu_free(instance->submenu); view_dispatcher_remove_view(instance->view_dispatcher, DisplayTestViewConfigure); variable_item_list_free(instance->variable_item_list); view_dispatcher_remove_view(instance->view_dispatcher, DisplayTestViewDisplayTest); view_display_test_free(instance->view_display_test); view_dispatcher_free(instance->view_dispatcher); furi_record_close(RECORD_GUI); free(instance); } int32_t display_test_run(DisplayTest* instance) { UNUSED(instance); view_dispatcher_switch_to_view(instance->view_dispatcher, DisplayTestViewSubmenu); view_dispatcher_run(instance->view_dispatcher); return 0; } int32_t display_test_app(void* p) { UNUSED(p); DisplayTest* instance = display_test_alloc(); int32_t ret = display_test_run(instance); display_test_free(instance); return ret; } ================================================ FILE: applications/debug/display_test/view_display_test.c ================================================ #include "view_display_test.h" typedef struct { uint32_t test; uint32_t size; uint32_t counter; bool flip_flop; } ViewDisplayTestModel; struct ViewDisplayTest { View* view; FuriTimer* timer; }; static void view_display_test_draw_callback_intro(Canvas* canvas, void* _model) { UNUSED(_model); canvas_draw_str(canvas, 12, 24, "Use < and > to switch tests"); canvas_draw_str(canvas, 12, 36, "Use ^ and v to switch size"); canvas_draw_str(canvas, 32, 48, "Use (o) to flip"); } static void view_display_test_draw_callback_fill(Canvas* canvas, void* _model) { ViewDisplayTestModel* model = _model; if(model->flip_flop) { uint8_t width = canvas_width(canvas); uint8_t height = canvas_height(canvas); canvas_draw_box(canvas, 0, 0, width, height); } } static void view_display_test_draw_callback_hstripe(Canvas* canvas, void* _model) { ViewDisplayTestModel* model = _model; uint8_t block = 1 + model->size; uint8_t width = canvas_width(canvas); uint8_t height = canvas_height(canvas); for(uint8_t y = model->flip_flop * block; y < height; y += 2 * block) { canvas_draw_box(canvas, 0, y, width, block); } } static void view_display_test_draw_callback_vstripe(Canvas* canvas, void* _model) { ViewDisplayTestModel* model = _model; uint8_t block = 1 + model->size; uint8_t width = canvas_width(canvas); uint8_t height = canvas_height(canvas); for(uint8_t x = model->flip_flop * block; x < width; x += 2 * block) { canvas_draw_box(canvas, x, 0, block, height); } } static void view_display_test_draw_callback_check(Canvas* canvas, void* _model) { ViewDisplayTestModel* model = _model; uint8_t block = 1 + model->size; uint8_t width = canvas_width(canvas); uint8_t height = canvas_height(canvas); bool flip_flop = model->flip_flop; for(uint8_t x = 0; x < width; x += block) { bool last_flip_flop = flip_flop; for(uint8_t y = 0; y < height; y += block) { if(flip_flop) { canvas_draw_box(canvas, x, y, block, block); } flip_flop = !flip_flop; } if(last_flip_flop == flip_flop) { flip_flop = !flip_flop; } } } static void view_display_test_draw_callback_move(Canvas* canvas, void* _model) { ViewDisplayTestModel* model = _model; uint8_t block = 1 + model->size; uint8_t width = canvas_width(canvas) - block; uint8_t height = canvas_height(canvas) - block; uint8_t x = model->counter % width; if((model->counter / width) % 2) { x = width - x; } uint8_t y = model->counter % height; if((model->counter / height) % 2) { y = height - y; } canvas_draw_box(canvas, x, y, block, block); } const ViewDrawCallback view_display_test_tests[] = { view_display_test_draw_callback_intro, view_display_test_draw_callback_fill, view_display_test_draw_callback_hstripe, view_display_test_draw_callback_vstripe, view_display_test_draw_callback_check, view_display_test_draw_callback_move, }; static void view_display_test_draw_callback(Canvas* canvas, void* _model) { ViewDisplayTestModel* model = _model; view_display_test_tests[model->test](canvas, _model); } static bool view_display_test_input_callback(InputEvent* event, void* context) { ViewDisplayTest* instance = context; bool consumed = false; if(event->type == InputTypeShort || event->type == InputTypeRepeat) { with_view_model( instance->view, ViewDisplayTestModel * model, { if(event->key == InputKeyLeft && model->test > 0) { model->test--; consumed = true; } else if( event->key == InputKeyRight && model->test < (COUNT_OF(view_display_test_tests) - 1)) { model->test++; consumed = true; } else if(event->key == InputKeyDown && model->size > 0) { model->size--; consumed = true; } else if(event->key == InputKeyUp && model->size < 24) { model->size++; consumed = true; } else if(event->key == InputKeyOk) { model->flip_flop = !model->flip_flop; consumed = true; } }, consumed); } return consumed; } static void view_display_test_enter(void* context) { ViewDisplayTest* instance = context; furi_timer_start(instance->timer, furi_kernel_get_tick_frequency() / 32); } static void view_display_test_exit(void* context) { ViewDisplayTest* instance = context; furi_timer_stop(instance->timer); } static void view_display_test_timer_callback(void* context) { ViewDisplayTest* instance = context; with_view_model(instance->view, ViewDisplayTestModel * model, { model->counter++; }, true); } ViewDisplayTest* view_display_test_alloc(void) { ViewDisplayTest* instance = malloc(sizeof(ViewDisplayTest)); instance->view = view_alloc(); view_set_context(instance->view, instance); view_allocate_model(instance->view, ViewModelTypeLockFree, sizeof(ViewDisplayTestModel)); view_set_draw_callback(instance->view, view_display_test_draw_callback); view_set_input_callback(instance->view, view_display_test_input_callback); view_set_enter_callback(instance->view, view_display_test_enter); view_set_exit_callback(instance->view, view_display_test_exit); instance->timer = furi_timer_alloc(view_display_test_timer_callback, FuriTimerTypePeriodic, instance); return instance; } void view_display_test_free(ViewDisplayTest* instance) { furi_assert(instance); furi_timer_free(instance->timer); view_free(instance->view); free(instance); } View* view_display_test_get_view(ViewDisplayTest* instance) { furi_assert(instance); return instance->view; } ================================================ FILE: applications/debug/display_test/view_display_test.h ================================================ #pragma once #include #include typedef struct ViewDisplayTest ViewDisplayTest; ViewDisplayTest* view_display_test_alloc(void); void view_display_test_free(ViewDisplayTest* instance); View* view_display_test_get_view(ViewDisplayTest* instance); ================================================ FILE: applications/debug/event_loop_blink_test/application.fam ================================================ App( appid="event_loop_blink_test", name="Event Loop Blink Test", apptype=FlipperAppType.DEBUG, entry_point="event_loop_blink_test_app", requires=["input"], stack_size=1 * 1024, fap_category="Debug", ) ================================================ FILE: applications/debug/event_loop_blink_test/event_loop_blink_test.c ================================================ #include #include #include #include #include #include #define TAG "EventLoopBlinkTest" #define TIMER_COUNT (6U) typedef struct { FuriEventLoop* event_loop; FuriMessageQueue* input_queue; FuriEventLoopTimer* timers[TIMER_COUNT]; } EventLoopBlinkTestApp; static const GpioPin* blink_gpio_pins[] = { &gpio_ext_pa7, &gpio_ext_pa6, &gpio_ext_pa4, &gpio_ext_pb3, &gpio_ext_pb2, &gpio_ext_pc3, }; static_assert(COUNT_OF(blink_gpio_pins) == TIMER_COUNT); static const uint32_t timer_intervals[] = { 25, 50, 100, 200, 400, 800, }; static_assert(COUNT_OF(timer_intervals) == TIMER_COUNT); static void blink_gpio_init(void) { for(size_t i = 0; i < TIMER_COUNT; ++i) { furi_hal_gpio_init_simple(blink_gpio_pins[i], GpioModeOutputPushPull); furi_hal_gpio_write(blink_gpio_pins[i], false); } furi_hal_gpio_init_simple(&gpio_ext_pc0, GpioModeOutputPushPull); furi_hal_gpio_write(&gpio_ext_pc0, false); } static void blink_gpio_deinit(void) { for(size_t i = 0; i < TIMER_COUNT; ++i) { furi_hal_gpio_write(blink_gpio_pins[i], false); furi_hal_gpio_init_simple(blink_gpio_pins[i], GpioModeAnalog); } furi_hal_gpio_write(&gpio_ext_pc0, false); furi_hal_gpio_init_simple(&gpio_ext_pc0, GpioModeAnalog); } static void view_port_draw_callback(Canvas* canvas, void* context) { UNUSED(context); canvas_clear(canvas); elements_text_box( canvas, 0, 0, canvas_width(canvas), canvas_height(canvas), AlignCenter, AlignCenter, "\e#Event Loop Timers Test\e#\n" "Press buttons\n" "to enable or disable timers\n" "\e#Exit\e# = long press \e#Back\e#", false); } static void view_port_input_callback(InputEvent* input_event, void* context) { EventLoopBlinkTestApp* app = context; furi_message_queue_put(app->input_queue, input_event, 0); } static void input_queue_callback(FuriEventLoopObject* object, void* context) { FuriMessageQueue* queue = object; EventLoopBlinkTestApp* app = context; InputEvent event; FuriStatus status = furi_message_queue_get(queue, &event, 0); furi_assert(status == FuriStatusOk); if(event.type == InputTypeShort) { const size_t timer_idx = event.key; furi_assert(timer_idx < TIMER_COUNT); FuriEventLoopTimer* timer = app->timers[timer_idx]; if(furi_event_loop_timer_is_running(timer)) { furi_event_loop_timer_stop(timer); } else { furi_event_loop_timer_restart(timer); } } else if(event.type == InputTypeLong) { if(event.key == InputKeyBack) { furi_event_loop_stop(app->event_loop); } } } static void blink_timer_callback(void* context) { const GpioPin* gpio = blink_gpio_pins[(size_t)context]; furi_hal_gpio_write(gpio, !furi_hal_gpio_read(gpio)); } static void event_loop_tick_callback(void* context) { UNUSED(context); furi_hal_gpio_write(&gpio_ext_pc0, !furi_hal_gpio_read(&gpio_ext_pc0)); } int32_t event_loop_blink_test_app(void* arg) { UNUSED(arg); blink_gpio_init(); EventLoopBlinkTestApp app; app.event_loop = furi_event_loop_alloc(); app.input_queue = furi_message_queue_alloc(3, sizeof(InputEvent)); for(size_t i = 0; i < TIMER_COUNT; ++i) { app.timers[i] = furi_event_loop_timer_alloc( app.event_loop, blink_timer_callback, FuriEventLoopTimerTypePeriodic, (void*)i); furi_event_loop_timer_start(app.timers[i], timer_intervals[i]); } ViewPort* view_port = view_port_alloc(); view_port_draw_callback_set(view_port, view_port_draw_callback, &app); view_port_input_callback_set(view_port, view_port_input_callback, &app); Gui* gui = furi_record_open(RECORD_GUI); gui_add_view_port(gui, view_port, GuiLayerFullscreen); furi_event_loop_tick_set(app.event_loop, 500, event_loop_tick_callback, &app); furi_event_loop_subscribe_message_queue( app.event_loop, app.input_queue, FuriEventLoopEventIn, input_queue_callback, &app); furi_event_loop_run(app.event_loop); gui_remove_view_port(gui, view_port); view_port_free(view_port); furi_record_close(RECORD_GUI); furi_event_loop_unsubscribe(app.event_loop, app.input_queue); furi_message_queue_free(app.input_queue); for(size_t i = 0; i < TIMER_COUNT; ++i) { furi_event_loop_timer_free(app.timers[i]); } furi_event_loop_free(app.event_loop); blink_gpio_deinit(); return 0; } ================================================ FILE: applications/debug/expansion_test/application.fam ================================================ App( appid="expansion_test", name="Expansion Module Test", apptype=FlipperAppType.DEBUG, entry_point="expansion_test_app", requires=["expansion_start"], fap_libs=["assets"], stack_size=1 * 1024, fap_category="Debug", fap_file_assets="assets", ) ================================================ FILE: applications/debug/expansion_test/assets/test.txt ================================================ "Did you ever hear the tragedy of Darth Plagueis the Wise?" "No." "I thought not. It's not a story the Jedi would tell you. It's a Sith legend. Darth Plagueis... was a Dark Lord of the Sith so powerful and so wise, he could use the Force to influence the midi-chlorians... to create... life. He had such a knowledge of the dark side, he could even keep the ones he cared about... from dying." "He could actually... save people from death?" "The dark side of the Force is a pathway to many abilities... some consider to be unnatural." "Wh– What happened to him?" "He became so powerful, the only thing he was afraid of was... losing his power. Which eventually, of course, he did. Unfortunately, he taught his apprentice everything he knew. Then his apprentice killed him in his sleep. It's ironic. He could save others from death, but not himself." "Is it possible to learn this power?" "Not from a Jedi." ================================================ FILE: applications/debug/expansion_test/expansion_test.c ================================================ /** * @file expansion_test.c * @brief Expansion module support testing application. * * Before running, connect pins using the following scheme: * 13 -> 16 (USART TX to LPUART RX) * 14 -> 15 (USART RX to LPUART TX) * * Optional: Connect an LED with an appropriate series resistor * between pins 1 and 8. It will always be on if the device is * connected to USB power, so unplug it before running the app. * * What this application does: * * - Enables module support and emulates the module on a single device * (hence the above connection), * - Connects to the expansion module service, sets baud rate, * - Enables OTG (5V) on GPIO via plain expansion protocol, * - Waits 5 cycles of idle loop (1 second), * - Starts the RPC session, * - Disables OTG (5V) on GPIO via RPC messages, * - Waits 5 cycles of idle loop (1 second), * - Creates a directory at `/ext/ExpansionTest` and writes a file * named `test.txt` under it, * - Plays an audiovisual alert (sound and blinking display), * - Enables OTG (5V) on GPIO via RPC messages, * - Waits 5 cycles of idle loop (1 second), * - Stops the RPC session, * - Disables OTG (5V) on GPIO via plain expansion protocol, * - Exits (plays a sound if any of the above steps failed). */ #include #include #include #include #include #include #include #include #include #include #include #include #define TAG "ExpansionTest" #define TEST_DIR_PATH EXT_PATH(TAG) #define TEST_FILE_NAME "test.txt" #define TEST_FILE_PATH EXT_PATH(TAG "/" TEST_FILE_NAME) #define HOST_SERIAL_ID (FuriHalSerialIdLpuart) #define MODULE_SERIAL_ID (FuriHalSerialIdUsart) #define RECEIVE_BUFFER_SIZE (sizeof(ExpansionFrame) + sizeof(ExpansionFrameChecksum)) typedef enum { ExpansionTestAppFlagData = 1U << 0, ExpansionTestAppFlagExit = 1U << 1, } ExpansionTestAppFlag; #define EXPANSION_TEST_APP_ALL_FLAGS (ExpansionTestAppFlagData | ExpansionTestAppFlagExit) typedef struct { FuriThreadId thread_id; Expansion* expansion; FuriHalSerialHandle* handle; FuriStreamBuffer* buf; ExpansionFrame frame; PB_Main msg; Storage* storage; } ExpansionTestApp; static void expansion_test_app_serial_rx_callback( FuriHalSerialHandle* handle, FuriHalSerialRxEvent event, void* context) { furi_assert(handle); furi_assert(context); ExpansionTestApp* app = context; if(event == FuriHalSerialRxEventData) { const uint8_t data = furi_hal_serial_async_rx(handle); furi_stream_buffer_send(app->buf, &data, sizeof(data), 0); furi_thread_flags_set(app->thread_id, ExpansionTestAppFlagData); } } static ExpansionTestApp* expansion_test_app_alloc(void) { ExpansionTestApp* instance = malloc(sizeof(ExpansionTestApp)); instance->buf = furi_stream_buffer_alloc(RECEIVE_BUFFER_SIZE, 1); return instance; } static void expansion_test_app_free(ExpansionTestApp* instance) { furi_stream_buffer_free(instance->buf); free(instance); } static void expansion_test_app_start(ExpansionTestApp* instance) { instance->thread_id = furi_thread_get_current_id(); instance->expansion = furi_record_open(RECORD_EXPANSION); instance->handle = furi_hal_serial_control_acquire(MODULE_SERIAL_ID); furi_check(instance->handle); // Configure the serial port furi_hal_serial_init(instance->handle, EXPANSION_PROTOCOL_DEFAULT_BAUD_RATE); // Start waiting for the initial pulse expansion_set_listen_serial(instance->expansion, HOST_SERIAL_ID); furi_hal_serial_async_rx_start( instance->handle, expansion_test_app_serial_rx_callback, instance, false); } static void expansion_test_app_stop(ExpansionTestApp* instance) { // Disable expansion module support expansion_disable(instance->expansion); // Give back the module handle furi_hal_serial_control_release(instance->handle); // Restore expansion user settings expansion_enable(instance->expansion); furi_record_close(RECORD_EXPANSION); } static inline bool expansion_test_app_is_success_response(const ExpansionFrame* response) { return response->header.type == ExpansionFrameTypeStatus && response->content.status.error == ExpansionFrameErrorNone; } static inline bool expansion_test_app_is_success_rpc_message(const PB_Main* message) { return (message->command_status == PB_CommandStatus_OK || message->command_status == PB_CommandStatus_ERROR_STORAGE_EXIST) && (message->which_content == PB_Main_empty_tag); } static size_t expansion_test_app_receive_callback(uint8_t* data, size_t data_size, void* context) { ExpansionTestApp* instance = context; size_t received_size = 0; while(true) { received_size += furi_stream_buffer_receive( instance->buf, data + received_size, data_size - received_size, 0); if(received_size == data_size) break; const uint32_t flags = furi_thread_flags_wait( EXPANSION_TEST_APP_ALL_FLAGS, FuriFlagWaitAny, EXPANSION_PROTOCOL_TIMEOUT_MS); // Exit on any error if(flags & FuriFlagError) break; } return received_size; } static size_t expansion_test_app_send_callback(const uint8_t* data, size_t data_size, void* context) { ExpansionTestApp* instance = context; furi_hal_serial_tx(instance->handle, data, data_size); furi_hal_serial_tx_wait_complete(instance->handle); return data_size; } static bool expansion_test_app_receive_frame(ExpansionTestApp* instance, ExpansionFrame* frame) { return expansion_protocol_decode(frame, expansion_test_app_receive_callback, instance) == ExpansionProtocolStatusOk; } static bool expansion_test_app_send_status_response(ExpansionTestApp* instance, ExpansionFrameError error) { ExpansionFrame frame = { .header.type = ExpansionFrameTypeStatus, .content.status.error = error, }; return expansion_protocol_encode(&frame, expansion_test_app_send_callback, instance) == ExpansionProtocolStatusOk; } static bool expansion_test_app_send_heartbeat(ExpansionTestApp* instance) { ExpansionFrame frame = { .header.type = ExpansionFrameTypeHeartbeat, .content.heartbeat = {}, }; return expansion_protocol_encode(&frame, expansion_test_app_send_callback, instance) == ExpansionProtocolStatusOk; } static bool expansion_test_app_send_baud_rate_request(ExpansionTestApp* instance, uint32_t baud_rate) { ExpansionFrame frame = { .header.type = ExpansionFrameTypeBaudRate, .content.baud_rate.baud = baud_rate, }; return expansion_protocol_encode(&frame, expansion_test_app_send_callback, instance) == ExpansionProtocolStatusOk; } static bool expansion_test_app_send_control_request( ExpansionTestApp* instance, ExpansionFrameControlCommand command) { ExpansionFrame frame = { .header.type = ExpansionFrameTypeControl, .content.control.command = command, }; return expansion_protocol_encode(&frame, expansion_test_app_send_callback, instance) == ExpansionProtocolStatusOk; } static bool expansion_test_app_send_data_request( ExpansionTestApp* instance, const uint8_t* data, size_t data_size) { furi_assert(data_size <= EXPANSION_PROTOCOL_MAX_DATA_SIZE); ExpansionFrame frame = { .header.type = ExpansionFrameTypeData, .content.data.size = data_size, }; memcpy(frame.content.data.bytes, data, data_size); return expansion_protocol_encode(&frame, expansion_test_app_send_callback, instance) == ExpansionProtocolStatusOk; } static bool expansion_test_app_rpc_encode_callback( pb_ostream_t* stream, const pb_byte_t* data, size_t data_size) { ExpansionTestApp* instance = stream->state; size_t size_sent = 0; while(size_sent < data_size) { const size_t current_size = MIN(data_size - size_sent, EXPANSION_PROTOCOL_MAX_DATA_SIZE); if(!expansion_test_app_send_data_request(instance, data + size_sent, current_size)) break; if(!expansion_test_app_receive_frame(instance, &instance->frame)) break; if(!expansion_test_app_is_success_response(&instance->frame)) break; size_sent += current_size; } return size_sent == data_size; } static bool expansion_test_app_send_rpc_request(ExpansionTestApp* instance, PB_Main* message) { pb_ostream_t stream = { .callback = expansion_test_app_rpc_encode_callback, .state = instance, .max_size = SIZE_MAX, .bytes_written = 0, .errmsg = NULL, }; const bool success = pb_encode_ex(&stream, &PB_Main_msg, message, PB_ENCODE_DELIMITED); pb_release(&PB_Main_msg, message); return success; } static bool expansion_test_app_receive_rpc_request(ExpansionTestApp* instance, PB_Main* message) { bool success = false; do { if(!expansion_test_app_receive_frame(instance, &instance->frame)) break; if(!expansion_test_app_send_status_response(instance, ExpansionFrameErrorNone)) break; if(instance->frame.header.type != ExpansionFrameTypeData) break; pb_istream_t stream = pb_istream_from_buffer( instance->frame.content.data.bytes, instance->frame.content.data.size); if(!pb_decode_ex(&stream, &PB_Main_msg, message, PB_DECODE_DELIMITED)) break; success = true; } while(false); return success; } static bool expansion_test_app_send_presence(ExpansionTestApp* instance) { // Send pulses to emulate module insertion const uint8_t init = 0xAA; furi_hal_serial_tx(instance->handle, &init, sizeof(init)); furi_hal_serial_tx_wait_complete(instance->handle); return true; } static bool expansion_test_app_wait_ready(ExpansionTestApp* instance) { bool success = false; do { if(!expansion_test_app_receive_frame(instance, &instance->frame)) break; if(instance->frame.header.type != ExpansionFrameTypeHeartbeat) break; success = true; } while(false); return success; } static bool expansion_test_app_handshake(ExpansionTestApp* instance) { bool success = false; do { if(!expansion_test_app_send_baud_rate_request(instance, 230400)) break; if(!expansion_test_app_receive_frame(instance, &instance->frame)) break; if(!expansion_test_app_is_success_response(&instance->frame)) break; furi_hal_serial_set_br(instance->handle, 230400); furi_delay_ms(EXPANSION_PROTOCOL_BAUD_CHANGE_DT_MS); success = true; } while(false); return success; } static bool expansion_test_app_enable_otg(ExpansionTestApp* instance, bool enable) { bool success = false; do { const ExpansionFrameControlCommand command = enable ? ExpansionFrameControlCommandEnableOtg : ExpansionFrameControlCommandDisableOtg; if(!expansion_test_app_send_control_request(instance, command)) break; if(!expansion_test_app_receive_frame(instance, &instance->frame)) break; if(!expansion_test_app_is_success_response(&instance->frame)) break; success = true; } while(false); return success; } static bool expansion_test_app_start_rpc(ExpansionTestApp* instance) { bool success = false; do { if(!expansion_test_app_send_control_request(instance, ExpansionFrameControlCommandStartRpc)) break; if(!expansion_test_app_receive_frame(instance, &instance->frame)) break; if(!expansion_test_app_is_success_response(&instance->frame)) break; success = true; } while(false); return success; } static bool expansion_test_app_rpc_mkdir(ExpansionTestApp* instance) { bool success = false; instance->msg.command_id++; instance->msg.command_status = PB_CommandStatus_OK; instance->msg.which_content = PB_Main_storage_mkdir_request_tag; instance->msg.has_next = false; instance->msg.content.storage_mkdir_request.path = TEST_DIR_PATH; do { if(!expansion_test_app_send_rpc_request(instance, &instance->msg)) break; if(!expansion_test_app_receive_rpc_request(instance, &instance->msg)) break; if(!expansion_test_app_is_success_rpc_message(&instance->msg)) break; success = true; } while(false); return success; } static bool expansion_test_app_rpc_write(ExpansionTestApp* instance) { bool success = false; Storage* storage = furi_record_open(RECORD_STORAGE); File* file = storage_file_alloc(storage); do { if(!storage_file_open(file, APP_ASSETS_PATH(TEST_FILE_NAME), FSAM_READ, FSOM_OPEN_EXISTING)) break; const uint64_t file_size = storage_file_size(file); instance->msg.command_id++; instance->msg.command_status = PB_CommandStatus_OK; instance->msg.which_content = PB_Main_storage_write_request_tag; instance->msg.has_next = false; instance->msg.content.storage_write_request.path = TEST_FILE_PATH; instance->msg.content.storage_write_request.has_file = true; instance->msg.content.storage_write_request.file.data = malloc(PB_BYTES_ARRAY_T_ALLOCSIZE(file_size)); instance->msg.content.storage_write_request.file.data->size = file_size; const size_t bytes_read = storage_file_read( file, instance->msg.content.storage_write_request.file.data->bytes, file_size); if(bytes_read != file_size) { pb_release(&PB_Main_msg, &instance->msg); break; } if(!expansion_test_app_send_rpc_request(instance, &instance->msg)) break; if(!expansion_test_app_receive_rpc_request(instance, &instance->msg)) break; if(!expansion_test_app_is_success_rpc_message(&instance->msg)) break; success = true; } while(false); storage_file_free(file); furi_record_close(RECORD_STORAGE); return success; } static bool expansion_test_app_rpc_alert(ExpansionTestApp* instance) { bool success = false; instance->msg.command_id++; instance->msg.command_status = PB_CommandStatus_OK; instance->msg.which_content = PB_Main_system_play_audiovisual_alert_request_tag; instance->msg.has_next = false; do { if(!expansion_test_app_send_rpc_request(instance, &instance->msg)) break; if(!expansion_test_app_receive_rpc_request(instance, &instance->msg)) break; if(instance->msg.which_content != PB_Main_empty_tag) break; if(instance->msg.command_status != PB_CommandStatus_OK) break; success = true; } while(false); return success; } static bool expansion_test_app_rpc_enable_otg(ExpansionTestApp* instance, bool enable) { bool success = false; instance->msg.command_id++; instance->msg.command_status = PB_CommandStatus_OK; instance->msg.which_content = PB_Main_gpio_set_otg_mode_tag; instance->msg.content.gpio_set_otg_mode.mode = enable ? PB_Gpio_GpioOtgMode_ON : PB_Gpio_GpioOtgMode_OFF; instance->msg.has_next = false; do { if(!expansion_test_app_send_rpc_request(instance, &instance->msg)) break; if(!expansion_test_app_receive_rpc_request(instance, &instance->msg)) break; if(instance->msg.which_content != PB_Main_empty_tag) break; if(instance->msg.command_status != PB_CommandStatus_OK) break; success = true; } while(false); return success; } static bool expansion_test_app_idle(ExpansionTestApp* instance, uint32_t num_cycles) { uint32_t num_cycles_done; for(num_cycles_done = 0; num_cycles_done < num_cycles; ++num_cycles_done) { if(!expansion_test_app_send_heartbeat(instance)) break; if(!expansion_test_app_receive_frame(instance, &instance->frame)) break; if(instance->frame.header.type != ExpansionFrameTypeHeartbeat) break; furi_delay_ms(EXPANSION_PROTOCOL_TIMEOUT_MS - 50); } return num_cycles_done == num_cycles; } static bool expansion_test_app_stop_rpc(ExpansionTestApp* instance) { bool success = false; do { if(!expansion_test_app_send_control_request(instance, ExpansionFrameControlCommandStopRpc)) break; if(!expansion_test_app_receive_frame(instance, &instance->frame)) break; if(!expansion_test_app_is_success_response(&instance->frame)) break; success = true; } while(false); return success; } int32_t expansion_test_app(void* p) { UNUSED(p); ExpansionTestApp* instance = expansion_test_app_alloc(); expansion_test_app_start(instance); bool success = false; do { if(!expansion_test_app_send_presence(instance)) break; if(!expansion_test_app_wait_ready(instance)) break; if(!expansion_test_app_handshake(instance)) break; if(!expansion_test_app_enable_otg(instance, true)) break; if(!expansion_test_app_idle(instance, 5)) break; if(!expansion_test_app_start_rpc(instance)) break; if(!expansion_test_app_rpc_enable_otg(instance, false)) break; if(!expansion_test_app_idle(instance, 5)) break; if(!expansion_test_app_rpc_mkdir(instance)) break; if(!expansion_test_app_rpc_write(instance)) break; if(!expansion_test_app_rpc_alert(instance)) break; if(!expansion_test_app_rpc_enable_otg(instance, true)) break; if(!expansion_test_app_idle(instance, 5)) break; if(!expansion_test_app_stop_rpc(instance)) break; if(!expansion_test_app_enable_otg(instance, false)) break; success = true; } while(false); expansion_test_app_stop(instance); expansion_test_app_free(instance); if(!success) { NotificationApp* notification = furi_record_open(RECORD_NOTIFICATION); notification_message(notification, &sequence_error); furi_record_close(RECORD_NOTIFICATION); } return 0; } ================================================ FILE: applications/debug/file_browser_test/application.fam ================================================ App( appid="file_browser_test", name="File Browser Test", apptype=FlipperAppType.DEBUG, entry_point="file_browser_app", requires=["gui"], stack_size=2 * 1024, fap_category="Debug", fap_icon_assets="icons", ) ================================================ FILE: applications/debug/file_browser_test/file_browser_app.c ================================================ #include "file_browser_app_i.h" #include #include #include #include #include #include static bool file_browser_app_custom_event_callback(void* context, uint32_t event) { furi_assert(context); FileBrowserApp* app = context; return scene_manager_handle_custom_event(app->scene_manager, event); } static bool file_browser_app_back_event_callback(void* context) { furi_assert(context); FileBrowserApp* app = context; return scene_manager_handle_back_event(app->scene_manager); } static void file_browser_app_tick_event_callback(void* context) { furi_assert(context); FileBrowserApp* app = context; scene_manager_handle_tick_event(app->scene_manager); } FileBrowserApp* file_browser_app_alloc(char* arg) { UNUSED(arg); FileBrowserApp* app = malloc(sizeof(FileBrowserApp)); app->gui = furi_record_open(RECORD_GUI); app->dialogs = furi_record_open(RECORD_DIALOGS); app->view_dispatcher = view_dispatcher_alloc(); app->scene_manager = scene_manager_alloc(&file_browser_scene_handlers, app); view_dispatcher_set_event_callback_context(app->view_dispatcher, app); view_dispatcher_set_tick_event_callback( app->view_dispatcher, file_browser_app_tick_event_callback, 500); view_dispatcher_set_custom_event_callback( app->view_dispatcher, file_browser_app_custom_event_callback); view_dispatcher_set_navigation_event_callback( app->view_dispatcher, file_browser_app_back_event_callback); app->widget = widget_alloc(); app->file_path = furi_string_alloc(); app->file_browser = file_browser_alloc(app->file_path); file_browser_configure(app->file_browser, "*", NULL, true, false, &I_badusb_10px, true); view_dispatcher_add_view( app->view_dispatcher, FileBrowserAppViewStart, widget_get_view(app->widget)); view_dispatcher_add_view( app->view_dispatcher, FileBrowserAppViewResult, widget_get_view(app->widget)); view_dispatcher_add_view( app->view_dispatcher, FileBrowserAppViewBrowser, file_browser_get_view(app->file_browser)); view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); scene_manager_next_scene(app->scene_manager, FileBrowserSceneStart); return app; } void file_browser_app_free(FileBrowserApp* app) { furi_assert(app); // Views view_dispatcher_remove_view(app->view_dispatcher, FileBrowserAppViewStart); view_dispatcher_remove_view(app->view_dispatcher, FileBrowserAppViewResult); view_dispatcher_remove_view(app->view_dispatcher, FileBrowserAppViewBrowser); widget_free(app->widget); file_browser_free(app->file_browser); // View dispatcher view_dispatcher_free(app->view_dispatcher); scene_manager_free(app->scene_manager); // Close records furi_record_close(RECORD_GUI); furi_record_close(RECORD_NOTIFICATION); furi_record_close(RECORD_DIALOGS); furi_string_free(app->file_path); free(app); } int32_t file_browser_app(void* p) { FileBrowserApp* file_browser_app = file_browser_app_alloc((char*)p); view_dispatcher_run(file_browser_app->view_dispatcher); file_browser_app_free(file_browser_app); return 0; } ================================================ FILE: applications/debug/file_browser_test/file_browser_app_i.h ================================================ #pragma once #include "scenes/file_browser_scene.h" #include #include #include #include #include #include #include #include #include typedef struct FileBrowserApp FileBrowserApp; struct FileBrowserApp { Gui* gui; ViewDispatcher* view_dispatcher; SceneManager* scene_manager; DialogsApp* dialogs; Widget* widget; FileBrowser* file_browser; FuriString* file_path; }; typedef enum { FileBrowserAppViewStart, FileBrowserAppViewBrowser, FileBrowserAppViewResult, } FileBrowserAppView; ================================================ FILE: applications/debug/file_browser_test/scenes/file_browser_scene.c ================================================ #include "file_browser_scene.h" // Generate scene on_enter handlers array #define ADD_SCENE(prefix, name, id) prefix##_scene_##name##_on_enter, void (*const file_browser_scene_on_enter_handlers[])(void*) = { #include "file_browser_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 file_browser_scene_on_event_handlers[])(void* context, SceneManagerEvent event) = { #include "file_browser_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 file_browser_scene_on_exit_handlers[])(void* context) = { #include "file_browser_scene_config.h" }; #undef ADD_SCENE // Initialize scene handlers configuration structure const SceneManagerHandlers file_browser_scene_handlers = { .on_enter_handlers = file_browser_scene_on_enter_handlers, .on_event_handlers = file_browser_scene_on_event_handlers, .on_exit_handlers = file_browser_scene_on_exit_handlers, .scene_num = FileBrowserSceneNum, }; ================================================ FILE: applications/debug/file_browser_test/scenes/file_browser_scene.h ================================================ #pragma once #include // Generate scene id and total number #define ADD_SCENE(prefix, name, id) FileBrowserScene##id, typedef enum { #include "file_browser_scene_config.h" FileBrowserSceneNum, } FileBrowserScene; #undef ADD_SCENE extern const SceneManagerHandlers file_browser_scene_handlers; // Generate scene on_enter handlers declaration #define ADD_SCENE(prefix, name, id) void prefix##_scene_##name##_on_enter(void*); #include "file_browser_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 "file_browser_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 "file_browser_scene_config.h" #undef ADD_SCENE ================================================ FILE: applications/debug/file_browser_test/scenes/file_browser_scene_browser.c ================================================ #include "../file_browser_app_i.h" #include #define DEFAULT_PATH "/" #define EXTENSION "*" bool file_browser_scene_browser_on_event(void* context, SceneManagerEvent event) { UNUSED(context); FileBrowserApp* app = context; bool consumed = false; if(event.type == SceneManagerEventTypeCustom) { scene_manager_next_scene(app->scene_manager, FileBrowserSceneResult); consumed = true; } else if(event.type == SceneManagerEventTypeTick) { } return consumed; } static void file_browser_callback(void* context) { FileBrowserApp* app = context; furi_assert(app); view_dispatcher_send_custom_event(app->view_dispatcher, SceneManagerEventTypeCustom); } void file_browser_scene_browser_on_enter(void* context) { FileBrowserApp* app = context; file_browser_set_callback(app->file_browser, file_browser_callback, app); file_browser_start(app->file_browser, app->file_path); view_dispatcher_switch_to_view(app->view_dispatcher, FileBrowserAppViewBrowser); } void file_browser_scene_browser_on_exit(void* context) { FileBrowserApp* app = context; file_browser_stop(app->file_browser); } ================================================ FILE: applications/debug/file_browser_test/scenes/file_browser_scene_config.h ================================================ ADD_SCENE(file_browser, start, Start) ADD_SCENE(file_browser, browser, Browser) ADD_SCENE(file_browser, result, Result) ================================================ FILE: applications/debug/file_browser_test/scenes/file_browser_scene_result.c ================================================ #include "../file_browser_app_i.h" #include void file_browser_scene_result_ok_callback(InputType type, void* context) { furi_assert(context); FileBrowserApp* app = context; view_dispatcher_send_custom_event(app->view_dispatcher, type); } bool file_browser_scene_result_on_event(void* context, SceneManagerEvent event) { UNUSED(context); //FileBrowserApp* app = context; bool consumed = false; if(event.type == SceneManagerEventTypeCustom) { consumed = true; } else if(event.type == SceneManagerEventTypeTick) { } return consumed; } void file_browser_scene_result_on_enter(void* context) { FileBrowserApp* app = context; widget_add_string_multiline_element( app->widget, 64, 10, AlignCenter, AlignTop, FontSecondary, furi_string_get_cstr(app->file_path)); view_dispatcher_switch_to_view(app->view_dispatcher, FileBrowserAppViewResult); } void file_browser_scene_result_on_exit(void* context) { UNUSED(context); FileBrowserApp* app = context; widget_reset(app->widget); } ================================================ FILE: applications/debug/file_browser_test/scenes/file_browser_scene_start.c ================================================ #include "../file_browser_app_i.h" #include #include #include static void file_browser_scene_start_ok_callback(GuiButtonType result, InputType type, void* context) { UNUSED(result); furi_assert(context); FileBrowserApp* app = context; if(type == InputTypeShort) { view_dispatcher_send_custom_event(app->view_dispatcher, type); } } bool file_browser_scene_start_on_event(void* context, SceneManagerEvent event) { FileBrowserApp* app = context; bool consumed = false; if(event.type == SceneManagerEventTypeCustom) { furi_string_set(app->file_path, EXT_PATH("badusb/demo_windows.txt")); scene_manager_next_scene(app->scene_manager, FileBrowserSceneBrowser); consumed = true; } else if(event.type == SceneManagerEventTypeTick) { } return consumed; } void file_browser_scene_start_on_enter(void* context) { FileBrowserApp* app = context; widget_add_string_multiline_element( app->widget, 64, 20, AlignCenter, AlignTop, FontSecondary, "Press OK to start"); widget_add_button_element( app->widget, GuiButtonTypeCenter, "Ok", file_browser_scene_start_ok_callback, app); view_dispatcher_switch_to_view(app->view_dispatcher, FileBrowserAppViewStart); } void file_browser_scene_start_on_exit(void* context) { UNUSED(context); FileBrowserApp* app = context; widget_reset(app->widget); } ================================================ FILE: applications/debug/infrared_test/application.fam ================================================ App( appid="infrared_test", name="Infrared Test", apptype=FlipperAppType.DEBUG, entry_point="infrared_test_app", fap_category="Debug", targets=["f7"], ) ================================================ FILE: applications/debug/infrared_test/infrared_test.c ================================================ #include #include #define TAG "InfraredTest" #define CARRIER_FREQ_HZ (38000UL) #define CARRIER_DUTY (0.33f) #define BURST_DURATION_US (600UL) #define BURST_COUNT (50UL) typedef struct { bool level; uint32_t count; } InfraredTestApp; static FuriHalInfraredTxGetDataState infrared_test_app_tx_data_callback(void* context, uint32_t* duration, bool* level) { furi_assert(context); furi_assert(duration); furi_assert(level); InfraredTestApp* app = context; *duration = BURST_DURATION_US; *level = app->level; app->level = !app->level; app->count += 1; if(app->count < BURST_COUNT * 2) { return FuriHalInfraredTxGetDataStateOk; } else { return FuriHalInfraredTxGetDataStateLastDone; } } int32_t infrared_test_app(void* arg) { UNUSED(arg); InfraredTestApp app = { .level = true, }; FURI_LOG_I(TAG, "Starting test signal on PA7"); furi_hal_infrared_set_tx_output(FuriHalInfraredTxPinExtPA7); furi_hal_infrared_async_tx_set_data_isr_callback(infrared_test_app_tx_data_callback, &app); furi_hal_infrared_async_tx_start(CARRIER_FREQ_HZ, CARRIER_DUTY); furi_hal_infrared_async_tx_wait_termination(); furi_hal_infrared_set_tx_output(FuriHalInfraredTxPinInternal); FURI_LOG_I(TAG, "Test signal end"); FURI_LOG_I( TAG, "The measured signal should be %luus +-%.1fus", (app.count - 1) * BURST_DURATION_US, (double)1000000.0 / CARRIER_FREQ_HZ); return 0; } ================================================ FILE: applications/debug/keypad_test/application.fam ================================================ App( appid="keypad_test", name="Keypad Test", apptype=FlipperAppType.DEBUG, entry_point="keypad_test_app", requires=["gui"], stack_size=1 * 1024, fap_category="Debug", ) ================================================ FILE: applications/debug/keypad_test/keypad_test.c ================================================ #include #include #include #define TAG "KeypadTest" typedef struct { bool press[5]; uint16_t up; uint16_t down; uint16_t left; uint16_t right; uint16_t ok; FuriMutex* mutex; } KeypadTestState; static void keypad_test_reset_state(KeypadTestState* state) { state->left = 0; state->right = 0; state->up = 0; state->down = 0; state->ok = 0; } static void keypad_test_render_callback(Canvas* canvas, void* ctx) { KeypadTestState* state = ctx; furi_mutex_acquire(state->mutex, FuriWaitForever); canvas_clear(canvas); char strings[5][20]; snprintf(strings[0], 20, "Ok: %d", state->ok); snprintf(strings[1], 20, "L: %d", state->left); snprintf(strings[2], 20, "R: %d", state->right); snprintf(strings[3], 20, "U: %d", state->up); snprintf(strings[4], 20, "D: %d", state->down); canvas_set_font(canvas, FontPrimary); canvas_draw_str(canvas, 0, 10, "Keypad test"); canvas_set_font(canvas, FontSecondary); canvas_draw_str(canvas, 0, 24, strings[1]); canvas_draw_str(canvas, 35, 24, strings[2]); canvas_draw_str(canvas, 0, 36, strings[3]); canvas_draw_str(canvas, 35, 36, strings[4]); canvas_draw_str(canvas, 0, 48, strings[0]); canvas_draw_circle(canvas, 100, 26, 25); if(state->press[0]) canvas_draw_disc(canvas, 118, 26, 5); if(state->press[1]) canvas_draw_disc(canvas, 82, 26, 5); if(state->press[2]) canvas_draw_disc(canvas, 100, 8, 5); if(state->press[3]) canvas_draw_disc(canvas, 100, 44, 5); if(state->press[4]) canvas_draw_disc(canvas, 100, 26, 5); canvas_draw_str(canvas, 10, 63, "[back] - reset, hold to exit"); furi_mutex_release(state->mutex); } static void keypad_test_input_callback(InputEvent* input_event, void* ctx) { FuriMessageQueue* event_queue = ctx; furi_message_queue_put(event_queue, input_event, FuriWaitForever); } int32_t keypad_test_app(void* p) { UNUSED(p); FuriMessageQueue* event_queue = furi_message_queue_alloc(32, sizeof(InputEvent)); KeypadTestState state = {{false, false, false, false, false}, 0, 0, 0, 0, 0, NULL}; state.mutex = furi_mutex_alloc(FuriMutexTypeNormal); ViewPort* view_port = view_port_alloc(); view_port_draw_callback_set(view_port, keypad_test_render_callback, &state); view_port_input_callback_set(view_port, keypad_test_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); InputEvent event; while(furi_message_queue_get(event_queue, &event, FuriWaitForever) == FuriStatusOk) { furi_mutex_acquire(state.mutex, FuriWaitForever); FURI_LOG_I( TAG, "key: %s type: %s", input_get_key_name(event.key), input_get_type_name(event.type)); if(event.key == InputKeyRight) { if(event.type == InputTypePress) { state.press[0] = true; } else if(event.type == InputTypeRelease) { state.press[0] = false; } else if(event.type == InputTypeShort) { ++state.right; } } else if(event.key == InputKeyLeft) { if(event.type == InputTypePress) { state.press[1] = true; } else if(event.type == InputTypeRelease) { state.press[1] = false; } else if(event.type == InputTypeShort) { ++state.left; } } else if(event.key == InputKeyUp) { if(event.type == InputTypePress) { state.press[2] = true; } else if(event.type == InputTypeRelease) { state.press[2] = false; } else if(event.type == InputTypeShort) { ++state.up; } } else if(event.key == InputKeyDown) { if(event.type == InputTypePress) { state.press[3] = true; } else if(event.type == InputTypeRelease) { state.press[3] = false; } else if(event.type == InputTypeShort) { ++state.down; } } else if(event.key == InputKeyOk) { if(event.type == InputTypePress) { state.press[4] = true; } else if(event.type == InputTypeRelease) { state.press[4] = false; } else if(event.type == InputTypeShort) { ++state.ok; } } else if(event.key == InputKeyBack) { if(event.type == InputTypeLong) { furi_mutex_release(state.mutex); break; } else if(event.type == InputTypeShort) { keypad_test_reset_state(&state); } } furi_mutex_release(state.mutex); view_port_update(view_port); } // remove & free all stuff created by app gui_remove_view_port(gui, view_port); view_port_free(view_port); furi_message_queue_free(event_queue); furi_mutex_free(state.mutex); furi_record_close(RECORD_GUI); return 0; } ================================================ FILE: applications/debug/lfrfid_debug/application.fam ================================================ App( appid="lfrfid_debug", name="LF-RFID Debug", apptype=FlipperAppType.DEBUG, targets=["f7"], entry_point="lfrfid_debug_app", requires=[ "gui", ], provides=[ "lfrfid_debug", ], stack_size=1 * 1024, fap_category="Debug", ) ================================================ FILE: applications/debug/lfrfid_debug/lfrfid_debug.c ================================================ #include "lfrfid_debug_i.h" static bool lfrfid_debug_custom_event_callback(void* context, uint32_t event) { furi_assert(context); LfRfidDebug* app = context; return scene_manager_handle_custom_event(app->scene_manager, event); } static bool lfrfid_debug_back_event_callback(void* context) { furi_assert(context); LfRfidDebug* app = context; return scene_manager_handle_back_event(app->scene_manager); } static LfRfidDebug* lfrfid_debug_alloc(void) { LfRfidDebug* app = malloc(sizeof(LfRfidDebug)); app->view_dispatcher = view_dispatcher_alloc(); app->scene_manager = scene_manager_alloc(&lfrfid_debug_scene_handlers, app); view_dispatcher_set_event_callback_context(app->view_dispatcher, app); view_dispatcher_set_custom_event_callback( app->view_dispatcher, lfrfid_debug_custom_event_callback); view_dispatcher_set_navigation_event_callback( app->view_dispatcher, lfrfid_debug_back_event_callback); // Open GUI record app->gui = furi_record_open(RECORD_GUI); view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); // Submenu app->submenu = submenu_alloc(); view_dispatcher_add_view( app->view_dispatcher, LfRfidDebugViewSubmenu, submenu_get_view(app->submenu)); // Tune view app->tune_view = lfrfid_debug_view_tune_alloc(); view_dispatcher_add_view( app->view_dispatcher, LfRfidDebugViewTune, lfrfid_debug_view_tune_get_view(app->tune_view)); return app; } static void lfrfid_debug_free(LfRfidDebug* app) { furi_assert(app); // Submenu view_dispatcher_remove_view(app->view_dispatcher, LfRfidDebugViewSubmenu); submenu_free(app->submenu); // Tune view view_dispatcher_remove_view(app->view_dispatcher, LfRfidDebugViewTune); lfrfid_debug_view_tune_free(app->tune_view); // View Dispatcher view_dispatcher_free(app->view_dispatcher); // Scene Manager scene_manager_free(app->scene_manager); // GUI furi_record_close(RECORD_GUI); app->gui = NULL; free(app); } int32_t lfrfid_debug_app(void* p) { UNUSED(p); LfRfidDebug* app = lfrfid_debug_alloc(); scene_manager_next_scene(app->scene_manager, LfRfidDebugSceneStart); view_dispatcher_run(app->view_dispatcher); lfrfid_debug_free(app); return 0; } ================================================ FILE: applications/debug/lfrfid_debug/lfrfid_debug_i.h ================================================ #pragma once #include #include #include #include #include #include #include #include "views/lfrfid_debug_view_tune.h" #include "scenes/lfrfid_debug_scene.h" typedef struct LfRfidDebug LfRfidDebug; struct LfRfidDebug { Gui* gui; ViewDispatcher* view_dispatcher; SceneManager* scene_manager; // Common Views Submenu* submenu; LfRfidTuneView* tune_view; }; typedef enum { LfRfidDebugViewSubmenu, LfRfidDebugViewTune, } LfRfidDebugView; ================================================ FILE: applications/debug/lfrfid_debug/scenes/lfrfid_debug_app_scene_start.c ================================================ #include "../lfrfid_debug_i.h" typedef enum { SubmenuIndexTune, } SubmenuIndex; static void lfrfid_debug_scene_start_submenu_callback(void* context, uint32_t index) { LfRfidDebug* app = context; view_dispatcher_send_custom_event(app->view_dispatcher, index); } void lfrfid_debug_scene_start_on_enter(void* context) { LfRfidDebug* app = context; Submenu* submenu = app->submenu; submenu_add_item( submenu, "Tune", SubmenuIndexTune, lfrfid_debug_scene_start_submenu_callback, app); submenu_set_selected_item( submenu, scene_manager_get_scene_state(app->scene_manager, LfRfidDebugSceneStart)); view_dispatcher_switch_to_view(app->view_dispatcher, LfRfidDebugViewSubmenu); } bool lfrfid_debug_scene_start_on_event(void* context, SceneManagerEvent event) { LfRfidDebug* app = context; bool consumed = false; if(event.type == SceneManagerEventTypeCustom) { if(event.event == SubmenuIndexTune) { scene_manager_next_scene(app->scene_manager, LfRfidDebugSceneTune); consumed = true; } } return consumed; } void lfrfid_debug_scene_start_on_exit(void* context) { LfRfidDebug* app = context; submenu_reset(app->submenu); } ================================================ FILE: applications/debug/lfrfid_debug/scenes/lfrfid_debug_app_scene_tune.c ================================================ #include "../lfrfid_debug_i.h" #include static void comparator_trigger_callback(bool level, void* comp_ctx) { UNUSED(comp_ctx); furi_hal_gpio_write(&gpio_ext_pa7, !level); } void lfrfid_debug_view_tune_callback(void* context) { LfRfidDebug* app = context; view_dispatcher_send_custom_event(app->view_dispatcher, 0xBA); } void lfrfid_debug_scene_tune_on_enter(void* context) { LfRfidDebug* app = context; furi_hal_gpio_init_simple(&gpio_ext_pa7, GpioModeOutputPushPull); furi_hal_rfid_comp_set_callback(comparator_trigger_callback, app); furi_hal_rfid_comp_start(); furi_hal_rfid_tim_read_start(125000, 0.5); lfrfid_debug_view_tune_set_callback(app->tune_view, lfrfid_debug_view_tune_callback, app); view_dispatcher_switch_to_view(app->view_dispatcher, LfRfidDebugViewTune); } bool lfrfid_debug_scene_tune_on_event(void* context, SceneManagerEvent event) { UNUSED(event); LfRfidDebug* app = context; bool consumed = false; if(lfrfid_debug_view_tune_is_dirty(app->tune_view)) { furi_hal_rfid_set_read_period(lfrfid_debug_view_tune_get_arr(app->tune_view)); furi_hal_rfid_set_read_pulse(lfrfid_debug_view_tune_get_ccr(app->tune_view)); } return consumed; } void lfrfid_debug_scene_tune_on_exit(void* context) { UNUSED(context); furi_hal_rfid_comp_stop(); furi_hal_rfid_comp_set_callback(NULL, NULL); furi_hal_gpio_init_simple(&gpio_ext_pa7, GpioModeAnalog); furi_hal_rfid_tim_read_stop(); furi_hal_rfid_pins_reset(); } ================================================ FILE: applications/debug/lfrfid_debug/scenes/lfrfid_debug_scene.c ================================================ #include "lfrfid_debug_scene.h" // Generate scene on_enter handlers array #define ADD_SCENE(prefix, name, id) prefix##_scene_##name##_on_enter, void (*const lfrfid_debug_on_enter_handlers[])(void*) = { #include "lfrfid_debug_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 lfrfid_debug_on_event_handlers[])(void* context, SceneManagerEvent event) = { #include "lfrfid_debug_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 lfrfid_debug_on_exit_handlers[])(void* context) = { #include "lfrfid_debug_scene_config.h" }; #undef ADD_SCENE // Initialize scene handlers configuration structure const SceneManagerHandlers lfrfid_debug_scene_handlers = { .on_enter_handlers = lfrfid_debug_on_enter_handlers, .on_event_handlers = lfrfid_debug_on_event_handlers, .on_exit_handlers = lfrfid_debug_on_exit_handlers, .scene_num = LfRfidDebugSceneNum, }; ================================================ FILE: applications/debug/lfrfid_debug/scenes/lfrfid_debug_scene.h ================================================ #pragma once #include // Generate scene id and total number #define ADD_SCENE(prefix, name, id) LfRfidDebugScene##id, typedef enum { #include "lfrfid_debug_scene_config.h" LfRfidDebugSceneNum, } LfRfidDebugScene; #undef ADD_SCENE extern const SceneManagerHandlers lfrfid_debug_scene_handlers; // Generate scene on_enter handlers declaration #define ADD_SCENE(prefix, name, id) void prefix##_scene_##name##_on_enter(void*); #include "lfrfid_debug_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 "lfrfid_debug_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 "lfrfid_debug_scene_config.h" #undef ADD_SCENE ================================================ FILE: applications/debug/lfrfid_debug/scenes/lfrfid_debug_scene_config.h ================================================ ADD_SCENE(lfrfid_debug, start, Start) ADD_SCENE(lfrfid_debug, tune, Tune) ================================================ FILE: applications/debug/lfrfid_debug/views/lfrfid_debug_view_tune.c ================================================ #include "lfrfid_debug_view_tune.h" #include #define TEMP_STR_LEN 128 struct LfRfidTuneView { View* view; }; typedef struct { bool dirty; bool fine; uint32_t ARR; uint32_t CCR; int pos; void (*update_callback)(void* context); void* update_context; } LfRfidTuneViewModel; static void lfrfid_debug_view_tune_draw_callback(Canvas* canvas, void* _model) { LfRfidTuneViewModel* model = _model; canvas_set_color(canvas, ColorBlack); if(model->fine) { canvas_draw_box( canvas, 128 - canvas_string_width(canvas, "Fine") - 4, 0, canvas_string_width(canvas, "Fine") + 4, canvas_current_font_height(canvas) + 1); canvas_set_color(canvas, ColorWhite); } canvas_draw_str_aligned(canvas, 128 - 2, 2, AlignRight, AlignTop, "Fine"); canvas_set_color(canvas, ColorBlack); char buffer[TEMP_STR_LEN + 1]; double freq = ((double)SystemCoreClock / (model->ARR + 1)); double duty = (double)((model->CCR + 1) * 100) / (model->ARR + 1); snprintf( buffer, TEMP_STR_LEN, "%sARR: %lu\n" "freq = %.4f\n" "%sCCR: %lu\n" "duty = %.4f", model->pos == 0 ? ">" : "", model->ARR, freq, model->pos == 1 ? ">" : "", model->CCR, duty); elements_multiline_text_aligned(canvas, 2, 2, AlignLeft, AlignTop, buffer); } static void lfrfid_debug_view_tune_button_up(LfRfidTuneView* tune_view) { with_view_model( tune_view->view, LfRfidTuneViewModel * model, { if(model->pos > 0) model->pos--; }, true); } static void lfrfid_debug_view_tune_button_down(LfRfidTuneView* tune_view) { with_view_model( tune_view->view, LfRfidTuneViewModel * model, { if(model->pos < 1) model->pos++; }, true); } static void lfrfid_debug_view_tune_button_left(LfRfidTuneView* tune_view) { with_view_model( tune_view->view, LfRfidTuneViewModel * model, { if(model->pos == 0) { if(model->fine) { model->ARR -= 1; } else { model->ARR -= 10; } } else if(model->pos == 1) { if(model->fine) { model->CCR -= 1; } else { model->CCR -= 10; } } model->dirty = true; }, true); } static void lfrfid_debug_view_tune_button_right(LfRfidTuneView* tune_view) { with_view_model( tune_view->view, LfRfidTuneViewModel * model, { if(model->pos == 0) { if(model->fine) { model->ARR += 1; } else { model->ARR += 10; } } else if(model->pos == 1) { if(model->fine) { model->CCR += 1; } else { model->CCR += 10; } } model->dirty = true; }, true); } static void lfrfid_debug_view_tune_button_ok(LfRfidTuneView* tune_view) { with_view_model( tune_view->view, LfRfidTuneViewModel * model, { model->fine = !model->fine; }, true); } static bool lfrfid_debug_view_tune_input_callback(InputEvent* event, void* context) { LfRfidTuneView* tune_view = context; bool consumed = false; // Process key presses only if(event->type == InputTypeShort || event->type == InputTypeRepeat) { consumed = true; switch(event->key) { case InputKeyLeft: lfrfid_debug_view_tune_button_left(tune_view); break; case InputKeyRight: lfrfid_debug_view_tune_button_right(tune_view); break; case InputKeyUp: lfrfid_debug_view_tune_button_up(tune_view); break; case InputKeyDown: lfrfid_debug_view_tune_button_down(tune_view); break; case InputKeyOk: lfrfid_debug_view_tune_button_ok(tune_view); break; default: consumed = false; break; } if(event->key == InputKeyLeft || event->key == InputKeyRight) { with_view_model( tune_view->view, LfRfidTuneViewModel * model, { if(model->update_callback) { model->update_callback(model->update_context); } }, false); } } return consumed; } LfRfidTuneView* lfrfid_debug_view_tune_alloc(void) { LfRfidTuneView* tune_view = malloc(sizeof(LfRfidTuneView)); tune_view->view = view_alloc(); view_set_context(tune_view->view, tune_view); view_allocate_model(tune_view->view, ViewModelTypeLocking, sizeof(LfRfidTuneViewModel)); lfrfid_debug_view_tune_clean(tune_view); view_set_draw_callback(tune_view->view, lfrfid_debug_view_tune_draw_callback); view_set_input_callback(tune_view->view, lfrfid_debug_view_tune_input_callback); return tune_view; } void lfrfid_debug_view_tune_free(LfRfidTuneView* tune_view) { view_free(tune_view->view); free(tune_view); } View* lfrfid_debug_view_tune_get_view(LfRfidTuneView* tune_view) { return tune_view->view; } void lfrfid_debug_view_tune_clean(LfRfidTuneView* tune_view) { with_view_model( tune_view->view, LfRfidTuneViewModel * model, { model->dirty = true; model->fine = false; model->ARR = 511; model->CCR = 255; model->pos = 0; model->update_callback = NULL; model->update_context = NULL; }, true); } bool lfrfid_debug_view_tune_is_dirty(LfRfidTuneView* tune_view) { bool result = false; with_view_model( tune_view->view, LfRfidTuneViewModel * model, { result = model->dirty; model->dirty = false; }, false); return result; } uint32_t lfrfid_debug_view_tune_get_arr(LfRfidTuneView* tune_view) { uint32_t result = false; with_view_model(tune_view->view, LfRfidTuneViewModel * model, { result = model->ARR; }, false); return result; } uint32_t lfrfid_debug_view_tune_get_ccr(LfRfidTuneView* tune_view) { uint32_t result = false; with_view_model(tune_view->view, LfRfidTuneViewModel * model, { result = model->CCR; }, false); return result; } void lfrfid_debug_view_tune_set_callback( LfRfidTuneView* tune_view, void (*callback)(void* context), void* context) { with_view_model( tune_view->view, LfRfidTuneViewModel * model, { model->update_callback = callback; model->update_context = context; }, false); } ================================================ FILE: applications/debug/lfrfid_debug/views/lfrfid_debug_view_tune.h ================================================ #pragma once #include typedef struct LfRfidTuneView LfRfidTuneView; LfRfidTuneView* lfrfid_debug_view_tune_alloc(void); void lfrfid_debug_view_tune_free(LfRfidTuneView* tune_view); View* lfrfid_debug_view_tune_get_view(LfRfidTuneView* tune_view); void lfrfid_debug_view_tune_clean(LfRfidTuneView* tune_view); bool lfrfid_debug_view_tune_is_dirty(LfRfidTuneView* tune_view); uint32_t lfrfid_debug_view_tune_get_arr(LfRfidTuneView* tune_view); uint32_t lfrfid_debug_view_tune_get_ccr(LfRfidTuneView* tune_view); void lfrfid_debug_view_tune_set_callback( LfRfidTuneView* tune_view, void (*callback)(void* context), void* context); ================================================ FILE: applications/debug/loader_chaining_a/application.fam ================================================ App( appid="loader_chaining_a", name="Loader Chaining Test: App A", apptype=FlipperAppType.DEBUG, entry_point="chaining_test_app_a", stack_size=1 * 1024, fap_category="Debug", ) ================================================ FILE: applications/debug/loader_chaining_a/loader_chaining_a.c ================================================ #include #include #include #include #include #include #define TAG "LoaderChainingA" #define CHAINING_TEST_B "/ext/apps/Debug/loader_chaining_b.fap" #define NONEXISTENT_APP "Some nonexistent app" typedef struct { Gui* gui; ViewDispatcher* view_dispatcher; Submenu* submenu; Loader* loader; DialogsApp* dialogs; } LoaderChainingA; typedef enum { LoaderChainingASubmenuLaunchB, LoaderChainingASubmenuLaunchBThenA, LoaderChainingASubmenuLaunchNonexistentSilent, LoaderChainingASubmenuLaunchNonexistentGui, LoaderChainingASubmenuLaunchNonexistentGuiThenA, } LoaderChainingASubmenu; static void loader_chaining_a_submenu_callback(void* context, uint32_t index) { LoaderChainingA* app = context; FuriString* self_path = furi_string_alloc(); furi_check(loader_get_application_launch_path(app->loader, self_path)); switch(index) { case LoaderChainingASubmenuLaunchB: loader_enqueue_launch(app->loader, CHAINING_TEST_B, "Hello", LoaderDeferredLaunchFlagGui); view_dispatcher_stop(app->view_dispatcher); break; case LoaderChainingASubmenuLaunchBThenA: loader_enqueue_launch(app->loader, CHAINING_TEST_B, "Hello", LoaderDeferredLaunchFlagGui); loader_enqueue_launch( app->loader, furi_string_get_cstr(self_path), "Hello to you from the future", LoaderDeferredLaunchFlagGui); break; case LoaderChainingASubmenuLaunchNonexistentSilent: loader_enqueue_launch(app->loader, NONEXISTENT_APP, NULL, LoaderDeferredLaunchFlagNone); break; case LoaderChainingASubmenuLaunchNonexistentGui: loader_enqueue_launch(app->loader, NONEXISTENT_APP, NULL, LoaderDeferredLaunchFlagGui); break; case LoaderChainingASubmenuLaunchNonexistentGuiThenA: loader_enqueue_launch(app->loader, NONEXISTENT_APP, NULL, LoaderDeferredLaunchFlagGui); loader_enqueue_launch( app->loader, furi_string_get_cstr(self_path), "Hello to you from the future", LoaderDeferredLaunchFlagGui); break; } furi_string_free(self_path); view_dispatcher_stop(app->view_dispatcher); } static bool loader_chaining_a_nav_callback(void* context) { LoaderChainingA* app = context; view_dispatcher_stop(app->view_dispatcher); return true; } LoaderChainingA* loader_chaining_a_alloc(void) { LoaderChainingA* app = malloc(sizeof(LoaderChainingA)); app->gui = furi_record_open(RECORD_GUI); app->loader = furi_record_open(RECORD_LOADER); app->dialogs = furi_record_open(RECORD_DIALOGS); app->view_dispatcher = view_dispatcher_alloc(); app->submenu = submenu_alloc(); submenu_add_item( app->submenu, "Launch B", LoaderChainingASubmenuLaunchB, loader_chaining_a_submenu_callback, app); submenu_add_item( app->submenu, "Launch B, then A", LoaderChainingASubmenuLaunchBThenA, loader_chaining_a_submenu_callback, app); submenu_add_item( app->submenu, "Trigger error: silent", LoaderChainingASubmenuLaunchNonexistentSilent, loader_chaining_a_submenu_callback, app); submenu_add_item( app->submenu, "Trigger error: GUI", LoaderChainingASubmenuLaunchNonexistentGui, loader_chaining_a_submenu_callback, app); submenu_add_item( app->submenu, "Error, then launch A", LoaderChainingASubmenuLaunchNonexistentGuiThenA, loader_chaining_a_submenu_callback, app); view_dispatcher_add_view(app->view_dispatcher, 0, submenu_get_view(app->submenu)); view_dispatcher_set_navigation_event_callback( app->view_dispatcher, loader_chaining_a_nav_callback); view_dispatcher_set_event_callback_context(app->view_dispatcher, app); view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); view_dispatcher_switch_to_view(app->view_dispatcher, 0); return app; } void loader_chaining_a_free(LoaderChainingA* app) { furi_record_close(RECORD_DIALOGS); furi_record_close(RECORD_LOADER); furi_record_close(RECORD_GUI); view_dispatcher_remove_view(app->view_dispatcher, 0); submenu_free(app->submenu); view_dispatcher_free(app->view_dispatcher); free(app); } int32_t chaining_test_app_a(const char* arg) { LoaderChainingA* app = loader_chaining_a_alloc(); if(arg) { if(strlen(arg)) { DialogMessage* message = dialog_message_alloc(); FuriString* text; dialog_message_set_header(message, "Hi, I am A", 64, 0, AlignCenter, AlignTop); text = furi_string_alloc_printf("Me from the past says:\n%s", arg); dialog_message_set_buttons(message, NULL, "ok!", NULL); dialog_message_set_text( message, furi_string_get_cstr(text), 64, 32, AlignCenter, AlignCenter); dialog_message_show(app->dialogs, message); dialog_message_free(message); furi_string_free(text); } } view_dispatcher_run(app->view_dispatcher); loader_chaining_a_free(app); return 0; } ================================================ FILE: applications/debug/loader_chaining_b/application.fam ================================================ App( appid="loader_chaining_b", name="Loader Chaining Test: App B", apptype=FlipperAppType.DEBUG, entry_point="chaining_test_app_b", stack_size=1 * 1024, fap_category="Debug", ) ================================================ FILE: applications/debug/loader_chaining_b/loader_chaining_b.c ================================================ #include #include #include int32_t chaining_test_app_b(const char* arg) { if(!arg) return 0; Loader* loader = furi_record_open(RECORD_LOADER); DialogsApp* dialogs = furi_record_open(RECORD_DIALOGS); DialogMessage* message = dialog_message_alloc(); dialog_message_set_header(message, "Hi, I am B", 64, 0, AlignCenter, AlignTop); FuriString* text = furi_string_alloc_printf("And A told me:\n%s", arg); dialog_message_set_text(message, furi_string_get_cstr(text), 64, 32, AlignCenter, AlignCenter); dialog_message_set_buttons(message, "Just quit", NULL, "Launch A"); DialogMessageButton result = dialog_message_show(dialogs, message); dialog_message_free(message); furi_string_free(text); if(result == DialogMessageButtonRight) loader_enqueue_launch( loader, "/ext/apps/Debug/loader_chaining_a.fap", NULL, LoaderDeferredLaunchFlagGui); furi_record_close(RECORD_LOADER); furi_record_close(RECORD_DIALOGS); return 0; } ================================================ FILE: applications/debug/locale_test/application.fam ================================================ App( appid="locale_test", name="Locale Test", apptype=FlipperAppType.DEBUG, entry_point="locale_test_app", requires=["gui", "locale"], stack_size=2 * 1024, fap_category="Debug", ) ================================================ FILE: applications/debug/locale_test/locale_test.c ================================================ #include #include #include #include #include #include typedef struct { Gui* gui; ViewDispatcher* view_dispatcher; View* view; } LocaleTestApp; static void locale_test_view_draw_callback(Canvas* canvas, void* _model) { UNUSED(_model); // Prepare canvas canvas_set_color(canvas, ColorBlack); canvas_set_font(canvas, FontSecondary); FuriString* tmp_string = furi_string_alloc(); float temp = 25.3f; LocaleMeasurementUnits units = locale_get_measurement_unit(); if(units == LocaleMeasurementUnitsMetric) { furi_string_printf(tmp_string, "Temp: %5.1fC", (double)temp); } else { temp = locale_celsius_to_fahrenheit(temp); furi_string_printf(tmp_string, "Temp: %5.1fF", (double)temp); } canvas_draw_str(canvas, 0, 10, furi_string_get_cstr(tmp_string)); DateTime datetime; furi_hal_rtc_get_datetime(&datetime); locale_format_time(tmp_string, &datetime, locale_get_time_format(), false); canvas_draw_str(canvas, 0, 25, furi_string_get_cstr(tmp_string)); locale_format_date(tmp_string, &datetime, locale_get_date_format(), "/"); canvas_draw_str(canvas, 0, 40, furi_string_get_cstr(tmp_string)); furi_string_free(tmp_string); } static bool locale_test_view_input_callback(InputEvent* event, void* context) { UNUSED(event); UNUSED(context); return false; } static uint32_t locale_test_exit(void* context) { UNUSED(context); return VIEW_NONE; } static LocaleTestApp* locale_test_alloc(void) { LocaleTestApp* app = malloc(sizeof(LocaleTestApp)); // Gui app->gui = furi_record_open(RECORD_GUI); // View dispatcher app->view_dispatcher = view_dispatcher_alloc(); view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); // Views app->view = view_alloc(); view_set_draw_callback(app->view, locale_test_view_draw_callback); view_set_input_callback(app->view, locale_test_view_input_callback); view_set_previous_callback(app->view, locale_test_exit); view_dispatcher_add_view(app->view_dispatcher, 0, app->view); view_dispatcher_switch_to_view(app->view_dispatcher, 0); return app; } static void locale_test_free(LocaleTestApp* app) { furi_assert(app); // Free views view_dispatcher_remove_view(app->view_dispatcher, 0); view_free(app->view); view_dispatcher_free(app->view_dispatcher); // Close gui record furi_record_close(RECORD_GUI); app->gui = NULL; // Free rest free(app); } int32_t locale_test_app(void* p) { UNUSED(p); LocaleTestApp* app = locale_test_alloc(); view_dispatcher_run(app->view_dispatcher); locale_test_free(app); return 0; } ================================================ FILE: applications/debug/rpc_debug_app/application.fam ================================================ App( appid="rpc_debug", name="RPC Debug", apptype=FlipperAppType.DEBUG, entry_point="rpc_debug_app", requires=["gui", "rpc_start", "notification"], stack_size=2 * 1024, fap_category="Debug", ) ================================================ FILE: applications/debug/rpc_debug_app/rpc_debug_app.c ================================================ #include "rpc_debug_app.h" #include #include static bool rpc_debug_app_custom_event_callback(void* context, uint32_t event) { furi_assert(context); RpcDebugApp* app = context; return scene_manager_handle_custom_event(app->scene_manager, event); } static bool rpc_debug_app_back_event_callback(void* context) { furi_assert(context); RpcDebugApp* app = context; return scene_manager_handle_back_event(app->scene_manager); } static void rpc_debug_app_tick_event_callback(void* context) { furi_assert(context); RpcDebugApp* app = context; scene_manager_handle_tick_event(app->scene_manager); } static void rpc_debug_app_format_hex(const uint8_t* data, size_t data_size, char* buf, size_t buf_size) { if(data == NULL || data_size == 0) { strlcpy(buf, "", buf_size); return; } const size_t byte_width = 3; const size_t line_width = 7; data_size = MIN(data_size, buf_size / (byte_width + 1)); for(size_t i = 0; i < data_size; ++i) { char* p = buf + (i * byte_width); char sep = !((i + 1) % line_width) ? '\n' : ' '; snprintf(p, byte_width + 1, "%02X%c", data[i], sep); } buf[buf_size - 1] = '\0'; } static void rpc_debug_app_rpc_command_callback(const RpcAppSystemEvent* event, void* context) { furi_assert(context); RpcDebugApp* app = context; furi_assert(app->rpc); if(event->type == RpcAppEventTypeSessionClose) { scene_manager_stop(app->scene_manager); view_dispatcher_stop(app->view_dispatcher); rpc_system_app_set_callback(app->rpc, NULL, NULL); app->rpc = NULL; } else if(event->type == RpcAppEventTypeAppExit) { scene_manager_stop(app->scene_manager); view_dispatcher_stop(app->view_dispatcher); rpc_system_app_confirm(app->rpc, true); } else if(event->type == RpcAppEventTypeDataExchange) { furi_assert(event->data.type == RpcAppSystemEventDataTypeBytes); rpc_debug_app_format_hex( event->data.bytes.ptr, event->data.bytes.size, app->text_store, TEXT_STORE_SIZE); view_dispatcher_send_custom_event( app->view_dispatcher, RpcDebugAppCustomEventRpcDataExchange); } else { rpc_system_app_confirm(app->rpc, false); } } static bool rpc_debug_app_rpc_init_rpc(RpcDebugApp* app, const char* args) { bool ret = false; if(args && strlen(args)) { uint32_t rpc = 0; if(sscanf(args, "RPC %lX", &rpc) == 1) { app->rpc = (RpcAppSystem*)rpc; rpc_system_app_set_callback(app->rpc, rpc_debug_app_rpc_command_callback, app); rpc_system_app_send_started(app->rpc); ret = true; } } return ret; } static RpcDebugApp* rpc_debug_app_alloc(void) { RpcDebugApp* app = malloc(sizeof(RpcDebugApp)); app->gui = furi_record_open(RECORD_GUI); app->notifications = furi_record_open(RECORD_NOTIFICATION); app->scene_manager = scene_manager_alloc(&rpc_debug_app_scene_handlers, app); app->view_dispatcher = view_dispatcher_alloc(); view_dispatcher_set_event_callback_context(app->view_dispatcher, app); view_dispatcher_set_custom_event_callback( app->view_dispatcher, rpc_debug_app_custom_event_callback); view_dispatcher_set_navigation_event_callback( app->view_dispatcher, rpc_debug_app_back_event_callback); view_dispatcher_set_tick_event_callback( app->view_dispatcher, rpc_debug_app_tick_event_callback, 100); view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); app->widget = widget_alloc(); view_dispatcher_add_view( app->view_dispatcher, RpcDebugAppViewWidget, widget_get_view(app->widget)); app->submenu = submenu_alloc(); view_dispatcher_add_view( app->view_dispatcher, RpcDebugAppViewSubmenu, submenu_get_view(app->submenu)); app->text_box = text_box_alloc(); view_dispatcher_add_view( app->view_dispatcher, RpcDebugAppViewTextBox, text_box_get_view(app->text_box)); app->text_input = text_input_alloc(); view_dispatcher_add_view( app->view_dispatcher, RpcDebugAppViewTextInput, text_input_get_view(app->text_input)); app->byte_input = byte_input_alloc(); view_dispatcher_add_view( app->view_dispatcher, RpcDebugAppViewByteInput, byte_input_get_view(app->byte_input)); return app; } static void rpc_debug_app_free(RpcDebugApp* app) { view_dispatcher_remove_view(app->view_dispatcher, RpcDebugAppViewByteInput); view_dispatcher_remove_view(app->view_dispatcher, RpcDebugAppViewTextInput); view_dispatcher_remove_view(app->view_dispatcher, RpcDebugAppViewTextBox); view_dispatcher_remove_view(app->view_dispatcher, RpcDebugAppViewSubmenu); view_dispatcher_remove_view(app->view_dispatcher, RpcDebugAppViewWidget); free(app->byte_input); free(app->text_input); free(app->text_box); free(app->submenu); free(app->widget); free(app->scene_manager); free(app->view_dispatcher); furi_record_close(RECORD_NOTIFICATION); app->notifications = NULL; furi_record_close(RECORD_GUI); app->gui = NULL; if(app->rpc) { rpc_system_app_set_callback(app->rpc, NULL, NULL); rpc_system_app_send_exited(app->rpc); app->rpc = NULL; } free(app); } int32_t rpc_debug_app(void* args) { RpcDebugApp* app = rpc_debug_app_alloc(); if(rpc_debug_app_rpc_init_rpc(app, args)) { notification_message(app->notifications, &sequence_display_backlight_on); scene_manager_next_scene(app->scene_manager, RpcDebugAppSceneStart); } else { scene_manager_next_scene(app->scene_manager, RpcDebugAppSceneStartDummy); } view_dispatcher_run(app->view_dispatcher); rpc_debug_app_free(app); return 0; } ================================================ FILE: applications/debug/rpc_debug_app/rpc_debug_app.h ================================================ #pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include "scenes/rpc_debug_app_scene.h" #define DATA_STORE_SIZE 64U #define TEXT_STORE_SIZE 64U typedef struct { Gui* gui; RpcAppSystem* rpc; SceneManager* scene_manager; ViewDispatcher* view_dispatcher; NotificationApp* notifications; Widget* widget; Submenu* submenu; TextBox* text_box; TextInput* text_input; ByteInput* byte_input; char text_store[TEXT_STORE_SIZE]; uint8_t data_store[DATA_STORE_SIZE]; } RpcDebugApp; typedef enum { RpcDebugAppViewWidget, RpcDebugAppViewSubmenu, RpcDebugAppViewTextBox, RpcDebugAppViewTextInput, RpcDebugAppViewByteInput, } RpcDebugAppView; typedef enum { // Reserve first 100 events for button types and indexes, starting from 0 RpcDebugAppCustomEventInputErrorCode = 100, RpcDebugAppCustomEventInputErrorText, RpcDebugAppCustomEventInputDataExchange, RpcDebugAppCustomEventRpcDataExchange, } RpcDebugAppCustomEvent; ================================================ FILE: applications/debug/rpc_debug_app/scenes/rpc_debug_app_scene.c ================================================ #include "rpc_debug_app_scene.h" // Generate scene on_enter handlers array #define ADD_SCENE(prefix, name, id) prefix##_scene_##name##_on_enter, void (*const rpc_debug_app_on_enter_handlers[])(void*) = { #include "rpc_debug_app_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 rpc_debug_app_on_event_handlers[])(void* context, SceneManagerEvent event) = { #include "rpc_debug_app_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 rpc_debug_app_on_exit_handlers[])(void* context) = { #include "rpc_debug_app_scene_config.h" }; #undef ADD_SCENE // Initialize scene handlers configuration structure const SceneManagerHandlers rpc_debug_app_scene_handlers = { .on_enter_handlers = rpc_debug_app_on_enter_handlers, .on_event_handlers = rpc_debug_app_on_event_handlers, .on_exit_handlers = rpc_debug_app_on_exit_handlers, .scene_num = RpcDebugAppSceneNum, }; ================================================ FILE: applications/debug/rpc_debug_app/scenes/rpc_debug_app_scene.h ================================================ #pragma once #include // Generate scene id and total number #define ADD_SCENE(prefix, name, id) RpcDebugAppScene##id, typedef enum { #include "rpc_debug_app_scene_config.h" RpcDebugAppSceneNum, } RpcDebugAppScene; #undef ADD_SCENE extern const SceneManagerHandlers rpc_debug_app_scene_handlers; // Generate scene on_enter handlers declaration #define ADD_SCENE(prefix, name, id) void prefix##_scene_##name##_on_enter(void*); #include "rpc_debug_app_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 "rpc_debug_app_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 "rpc_debug_app_scene_config.h" #undef ADD_SCENE ================================================ FILE: applications/debug/rpc_debug_app/scenes/rpc_debug_app_scene_config.h ================================================ ADD_SCENE(rpc_debug_app, start, Start) ADD_SCENE(rpc_debug_app, start_dummy, StartDummy) ADD_SCENE(rpc_debug_app, test_app_error, TestAppError) ADD_SCENE(rpc_debug_app, test_data_exchange, TestDataExchange) ADD_SCENE(rpc_debug_app, input_error_code, InputErrorCode) ADD_SCENE(rpc_debug_app, input_error_text, InputErrorText) ADD_SCENE(rpc_debug_app, input_data_exchange, InputDataExchange) ADD_SCENE(rpc_debug_app, receive_data_exchange, ReceiveDataExchange) ================================================ FILE: applications/debug/rpc_debug_app/scenes/rpc_debug_app_scene_input_data_exchange.c ================================================ #include "../rpc_debug_app.h" static void rpc_debug_app_scene_input_data_exchange_result_callback(void* context) { RpcDebugApp* app = context; view_dispatcher_send_custom_event( app->view_dispatcher, RpcDebugAppCustomEventInputDataExchange); } void rpc_debug_app_scene_input_data_exchange_on_enter(void* context) { RpcDebugApp* app = context; byte_input_set_header_text(app->byte_input, "Enter data to exchange"); byte_input_set_result_callback( app->byte_input, rpc_debug_app_scene_input_data_exchange_result_callback, NULL, app, app->data_store, DATA_STORE_SIZE); view_dispatcher_switch_to_view(app->view_dispatcher, RpcDebugAppViewByteInput); } bool rpc_debug_app_scene_input_data_exchange_on_event(void* context, SceneManagerEvent event) { RpcDebugApp* app = context; bool consumed = false; if(event.type == SceneManagerEventTypeCustom) { if(event.event == RpcDebugAppCustomEventInputDataExchange) { rpc_system_app_exchange_data(app->rpc, app->data_store, DATA_STORE_SIZE); scene_manager_previous_scene(app->scene_manager); consumed = true; } } return consumed; } void rpc_debug_app_scene_input_data_exchange_on_exit(void* context) { RpcDebugApp* app = context; UNUSED(app); } ================================================ FILE: applications/debug/rpc_debug_app/scenes/rpc_debug_app_scene_input_error_code.c ================================================ #include "../rpc_debug_app.h" #include static bool rpc_debug_app_scene_input_error_code_validator_callback( const char* text, FuriString* error, void* context) { UNUSED(context); for(; *text; ++text) { const char c = *text; if(c < '0' || c > '9') { furi_string_printf(error, "%s", "Please enter\na number!"); return false; } } return true; } static void rpc_debug_app_scene_input_error_code_result_callback(void* context) { RpcDebugApp* app = context; view_dispatcher_send_custom_event(app->view_dispatcher, RpcDebugAppCustomEventInputErrorCode); } void rpc_debug_app_scene_input_error_code_on_enter(void* context) { RpcDebugApp* app = context; strlcpy(app->text_store, "666", TEXT_STORE_SIZE); text_input_set_header_text(app->text_input, "Enter error code"); text_input_set_validator( app->text_input, rpc_debug_app_scene_input_error_code_validator_callback, NULL); text_input_set_result_callback( app->text_input, rpc_debug_app_scene_input_error_code_result_callback, app, app->text_store, TEXT_STORE_SIZE, true); view_dispatcher_switch_to_view(app->view_dispatcher, RpcDebugAppViewTextInput); } bool rpc_debug_app_scene_input_error_code_on_event(void* context, SceneManagerEvent event) { RpcDebugApp* app = context; bool consumed = false; if(event.type == SceneManagerEventTypeCustom) { if(event.event == RpcDebugAppCustomEventInputErrorCode) { uint32_t error_code; if(strint_to_uint32(app->text_store, NULL, &error_code, 10) == StrintParseNoError) { rpc_system_app_set_error_code(app->rpc, error_code); } scene_manager_previous_scene(app->scene_manager); consumed = true; } } return consumed; } void rpc_debug_app_scene_input_error_code_on_exit(void* context) { RpcDebugApp* app = context; text_input_reset(app->text_input); text_input_set_validator(app->text_input, NULL, NULL); } ================================================ FILE: applications/debug/rpc_debug_app/scenes/rpc_debug_app_scene_input_error_text.c ================================================ #include "../rpc_debug_app.h" static void rpc_debug_app_scene_input_error_text_result_callback(void* context) { RpcDebugApp* app = context; view_dispatcher_send_custom_event(app->view_dispatcher, RpcDebugAppCustomEventInputErrorText); } void rpc_debug_app_scene_input_error_text_on_enter(void* context) { RpcDebugApp* app = context; strlcpy(app->text_store, "I'm a scary error message!", TEXT_STORE_SIZE); text_input_set_header_text(app->text_input, "Enter error text"); text_input_set_result_callback( app->text_input, rpc_debug_app_scene_input_error_text_result_callback, app, app->text_store, TEXT_STORE_SIZE, true); view_dispatcher_switch_to_view(app->view_dispatcher, RpcDebugAppViewTextInput); } bool rpc_debug_app_scene_input_error_text_on_event(void* context, SceneManagerEvent event) { RpcDebugApp* app = context; bool consumed = false; if(event.type == SceneManagerEventTypeCustom) { if(event.event == RpcDebugAppCustomEventInputErrorText) { rpc_system_app_set_error_text(app->rpc, app->text_store); scene_manager_previous_scene(app->scene_manager); consumed = true; } } return consumed; } void rpc_debug_app_scene_input_error_text_on_exit(void* context) { RpcDebugApp* app = context; text_input_reset(app->text_input); } ================================================ FILE: applications/debug/rpc_debug_app/scenes/rpc_debug_app_scene_receive_data_exchange.c ================================================ #include "../rpc_debug_app.h" void rpc_debug_app_scene_receive_data_exchange_on_enter(void* context) { RpcDebugApp* app = context; strlcpy(app->text_store, "Received data will appear here...", TEXT_STORE_SIZE); text_box_set_text(app->text_box, app->text_store); text_box_set_font(app->text_box, TextBoxFontHex); view_dispatcher_switch_to_view(app->view_dispatcher, RpcDebugAppViewTextBox); } bool rpc_debug_app_scene_receive_data_exchange_on_event(void* context, SceneManagerEvent event) { RpcDebugApp* app = context; bool consumed = false; if(event.type == SceneManagerEventTypeCustom) { if(event.event == RpcDebugAppCustomEventRpcDataExchange) { rpc_system_app_confirm(app->rpc, true); notification_message(app->notifications, &sequence_blink_cyan_100); notification_message(app->notifications, &sequence_display_backlight_on); text_box_set_text(app->text_box, app->text_store); consumed = true; } } return consumed; } void rpc_debug_app_scene_receive_data_exchange_on_exit(void* context) { RpcDebugApp* app = context; text_box_reset(app->text_box); } ================================================ FILE: applications/debug/rpc_debug_app/scenes/rpc_debug_app_scene_start.c ================================================ #include "../rpc_debug_app.h" enum SubmenuIndex { SubmenuIndexTestAppError, SubmenuIndexTestDataExchange, }; static void rpc_debug_app_scene_start_submenu_callback(void* context, uint32_t index) { RpcDebugApp* app = context; view_dispatcher_send_custom_event(app->view_dispatcher, index); } void rpc_debug_app_scene_start_on_enter(void* context) { RpcDebugApp* app = context; Submenu* submenu = app->submenu; submenu_add_item( submenu, "Test App Error", SubmenuIndexTestAppError, rpc_debug_app_scene_start_submenu_callback, app); submenu_add_item( submenu, "Test Data Exchange", SubmenuIndexTestDataExchange, rpc_debug_app_scene_start_submenu_callback, app); submenu_set_selected_item(submenu, SubmenuIndexTestAppError); view_dispatcher_switch_to_view(app->view_dispatcher, RpcDebugAppViewSubmenu); } bool rpc_debug_app_scene_start_on_event(void* context, SceneManagerEvent event) { RpcDebugApp* app = context; SceneManager* scene_manager = app->scene_manager; bool consumed = false; if(event.type == SceneManagerEventTypeCustom) { const uint32_t submenu_index = event.event; if(submenu_index == SubmenuIndexTestAppError) { scene_manager_next_scene(scene_manager, RpcDebugAppSceneTestAppError); consumed = true; } else if(submenu_index == SubmenuIndexTestDataExchange) { scene_manager_next_scene(scene_manager, RpcDebugAppSceneTestDataExchange); consumed = true; } } return consumed; } void rpc_debug_app_scene_start_on_exit(void* context) { RpcDebugApp* app = context; submenu_reset(app->submenu); } ================================================ FILE: applications/debug/rpc_debug_app/scenes/rpc_debug_app_scene_start_dummy.c ================================================ #include "../rpc_debug_app.h" void rpc_debug_app_scene_start_dummy_on_enter(void* context) { RpcDebugApp* app = context; widget_add_text_box_element( app->widget, 0, 0, 128, 64, AlignCenter, AlignCenter, "This application\nis meant to be run\nin \e#RPC\e# mode.", false); view_dispatcher_switch_to_view(app->view_dispatcher, RpcDebugAppViewWidget); } bool rpc_debug_app_scene_start_dummy_on_event(void* context, SceneManagerEvent event) { RpcDebugApp* app = context; UNUSED(app); UNUSED(event); bool consumed = false; return consumed; } void rpc_debug_app_scene_start_dummy_on_exit(void* context) { RpcDebugApp* app = context; widget_reset(app->widget); } ================================================ FILE: applications/debug/rpc_debug_app/scenes/rpc_debug_app_scene_test_app_error.c ================================================ #include "../rpc_debug_app.h" typedef enum { SubmenuIndexSetErrorCode, SubmenuIndexSetErrorText, } SubmenuIndex; static void rpc_debug_app_scene_test_app_error_submenu_callback(void* context, uint32_t index) { RpcDebugApp* app = context; view_dispatcher_send_custom_event(app->view_dispatcher, index); } void rpc_debug_app_scene_test_app_error_on_enter(void* context) { RpcDebugApp* app = context; Submenu* submenu = app->submenu; submenu_add_item( submenu, "Set Error Code", SubmenuIndexSetErrorCode, rpc_debug_app_scene_test_app_error_submenu_callback, app); submenu_add_item( submenu, "Set Error Text", SubmenuIndexSetErrorText, rpc_debug_app_scene_test_app_error_submenu_callback, app); submenu_set_selected_item(submenu, SubmenuIndexSetErrorCode); view_dispatcher_switch_to_view(app->view_dispatcher, RpcDebugAppViewSubmenu); } bool rpc_debug_app_scene_test_app_error_on_event(void* context, SceneManagerEvent event) { RpcDebugApp* app = context; SceneManager* scene_manager = app->scene_manager; bool consumed = false; if(event.type == SceneManagerEventTypeCustom) { const uint32_t submenu_index = event.event; if(submenu_index == SubmenuIndexSetErrorCode) { scene_manager_next_scene(scene_manager, RpcDebugAppSceneInputErrorCode); consumed = true; } else if(submenu_index == SubmenuIndexSetErrorText) { scene_manager_next_scene(scene_manager, RpcDebugAppSceneInputErrorText); consumed = true; } } return consumed; } void rpc_debug_app_scene_test_app_error_on_exit(void* context) { RpcDebugApp* app = context; submenu_reset(app->submenu); } ================================================ FILE: applications/debug/rpc_debug_app/scenes/rpc_debug_app_scene_test_data_exchange.c ================================================ #include "../rpc_debug_app.h" typedef enum { SubmenuIndexSendData, SubmenuIndexReceiveData, } SubmenuIndex; static void rpc_debug_app_scene_test_data_exchange_submenu_callback(void* context, uint32_t index) { RpcDebugApp* app = context; view_dispatcher_send_custom_event(app->view_dispatcher, index); } void rpc_debug_app_scene_test_data_exchange_on_enter(void* context) { RpcDebugApp* app = context; Submenu* submenu = app->submenu; submenu_add_item( submenu, "Send Data", SubmenuIndexSendData, rpc_debug_app_scene_test_data_exchange_submenu_callback, app); submenu_add_item( submenu, "Receive Data", SubmenuIndexReceiveData, rpc_debug_app_scene_test_data_exchange_submenu_callback, app); submenu_set_selected_item(submenu, SubmenuIndexSendData); view_dispatcher_switch_to_view(app->view_dispatcher, RpcDebugAppViewSubmenu); } bool rpc_debug_app_scene_test_data_exchange_on_event(void* context, SceneManagerEvent event) { RpcDebugApp* app = context; SceneManager* scene_manager = app->scene_manager; bool consumed = false; if(event.type == SceneManagerEventTypeCustom) { const uint32_t submenu_index = event.event; if(submenu_index == SubmenuIndexSendData) { scene_manager_next_scene(scene_manager, RpcDebugAppSceneInputDataExchange); consumed = true; } else if(submenu_index == SubmenuIndexReceiveData) { scene_manager_next_scene(scene_manager, RpcDebugAppSceneReceiveDataExchange); consumed = true; } } return consumed; } void rpc_debug_app_scene_test_data_exchange_on_exit(void* context) { RpcDebugApp* app = context; submenu_reset(app->submenu); } ================================================ FILE: applications/debug/speaker_debug/application.fam ================================================ App( appid="speaker_debug", name="Speaker Debug", apptype=FlipperAppType.DEBUG, entry_point="speaker_debug_app", requires=["gui", "notification"], stack_size=2 * 1024, fap_category="Debug", fap_libs=["music_worker"], ) ================================================ FILE: applications/debug/speaker_debug/speaker_debug.c ================================================ #include #include #include #include #include #include #include #define TAG "SpeakerDebug" #define CLI_COMMAND "speaker_debug" typedef enum { SpeakerDebugAppMessageTypeStop, } SpeakerDebugAppMessageType; typedef struct { SpeakerDebugAppMessageType type; } SpeakerDebugAppMessage; typedef struct { MusicWorker* music_worker; FuriMessageQueue* message_queue; CliRegistry* cli_registry; } SpeakerDebugApp; static SpeakerDebugApp* speaker_app_alloc(void) { SpeakerDebugApp* app = (SpeakerDebugApp*)malloc(sizeof(SpeakerDebugApp)); app->music_worker = music_worker_alloc(); app->message_queue = furi_message_queue_alloc(8, sizeof(SpeakerDebugAppMessage)); app->cli_registry = furi_record_open(RECORD_CLI); return app; } static void speaker_app_free(SpeakerDebugApp* app) { music_worker_free(app->music_worker); furi_message_queue_free(app->message_queue); furi_record_close(RECORD_CLI); free(app); } static void speaker_app_cli(PipeSide* pipe, FuriString* args, void* context) { UNUSED(pipe); SpeakerDebugApp* app = (SpeakerDebugApp*)context; SpeakerDebugAppMessage message; FuriString* cmd = furi_string_alloc(); if(!args_read_string_and_trim(args, cmd)) { furi_string_free(cmd); printf("Usage:\r\n"); printf("\t" CLI_COMMAND " stop\r\n"); return; } if(furi_string_cmp(cmd, "stop") == 0) { message.type = SpeakerDebugAppMessageTypeStop; FuriStatus status = furi_message_queue_put(app->message_queue, &message, 100); if(status != FuriStatusOk) { printf("Failed to send message\r\n"); } else { printf("Stopping\r\n"); } } else { printf("Usage:\r\n"); printf("\t" CLI_COMMAND " stop\r\n"); } furi_string_free(cmd); } static bool speaker_app_music_play(SpeakerDebugApp* app, const char* rtttl) { if(music_worker_is_playing(app->music_worker)) { music_worker_stop(app->music_worker); } if(!music_worker_load_rtttl_from_string(app->music_worker, rtttl)) { FURI_LOG_E(TAG, "Failed to load RTTTL"); return false; } music_worker_set_volume(app->music_worker, 1.0f); music_worker_start(app->music_worker); return true; } static void speaker_app_music_stop(SpeakerDebugApp* app) { if(music_worker_is_playing(app->music_worker)) { music_worker_stop(app->music_worker); } } static void speaker_app_run(SpeakerDebugApp* app, const char* arg) { if(!arg || !speaker_app_music_play(app, arg)) { FURI_LOG_E(TAG, "Provided RTTTL is invalid"); return; } cli_registry_add_command( app->cli_registry, CLI_COMMAND, CliCommandFlagParallelSafe, speaker_app_cli, app); SpeakerDebugAppMessage message; FuriStatus status; while(true) { status = furi_message_queue_get(app->message_queue, &message, FuriWaitForever); if(status == FuriStatusOk) { if(message.type == SpeakerDebugAppMessageTypeStop) { speaker_app_music_stop(app); break; } } } cli_registry_delete_command(app->cli_registry, CLI_COMMAND); } int32_t speaker_debug_app(void* arg) { SpeakerDebugApp* app = speaker_app_alloc(); speaker_app_run(app, arg); speaker_app_free(app); return 0; } ================================================ FILE: applications/debug/subghz_test/application.fam ================================================ App( appid="subghz_test", name="Sub-Ghz test", apptype=FlipperAppType.DEBUG, targets=["f7"], entry_point="subghz_test_app", requires=["gui"], stack_size=4 * 1024, fap_icon="subghz_test_10px.png", fap_category="Debug", fap_icon_assets="images", fap_version="0.1", ) ================================================ FILE: applications/debug/subghz_test/helpers/subghz_test_event.h ================================================ #pragma once typedef enum { //SubGhzTestCustomEvent SubGhzTestCustomEventStartId = 100, SubGhzTestCustomEventSceneShowOnlyRX, } SubGhzTestCustomEvent; ================================================ FILE: applications/debug/subghz_test/helpers/subghz_test_frequency.c ================================================ #include "subghz_test_frequency.h" const uint32_t subghz_frequencies_testing[] = { /* 300 - 348 */ 300000000, 304500000, 310000000, 312025000, 313250000, 313625000, 315000000, 315225000, 321950000, 348000000, /* 387 - 464 */ 387000000, 433075000, /* LPD433 first */ 433825000, 433920000, /* LPD433 mid */ 434420000, 434775000, /* LPD433 last channels */ 438900000, 464000000, /* 779 - 928 */ 779000000, 868150000, 868350000, 868550000, 915000000, 925000000, 926500000, 927950000, 928000000, }; const uint32_t subghz_frequencies_count_testing = sizeof(subghz_frequencies_testing) / sizeof(uint32_t); const uint32_t subghz_frequencies_433_92_testing = 13; ================================================ FILE: applications/debug/subghz_test/helpers/subghz_test_frequency.h ================================================ #pragma once #include "../subghz_test_app_i.h" extern const uint32_t subghz_frequencies_testing[]; extern const uint32_t subghz_frequencies_count_testing; extern const uint32_t subghz_frequencies_433_92_testing; ================================================ FILE: applications/debug/subghz_test/helpers/subghz_test_types.h ================================================ #pragma once #include #include #define SUBGHZ_TEST_VERSION_APP "0.1" #define SUBGHZ_TEST_DEVELOPED "SkorP" #define SUBGHZ_TEST_GITHUB "https://github.com/flipperdevices/flipperzero-firmware" typedef enum { SubGhzTestViewVariableItemList, SubGhzTestViewSubmenu, SubGhzTestViewStatic, SubGhzTestViewCarrier, SubGhzTestViewPacket, SubGhzTestViewWidget, SubGhzTestViewPopup, } SubGhzTestView; ================================================ FILE: applications/debug/subghz_test/protocol/math.c ================================================ #include "math.h" uint64_t subghz_protocol_blocks_reverse_key(uint64_t key, uint8_t bit_count) { uint64_t reverse_key = 0; for(uint8_t i = 0; i < bit_count; i++) { reverse_key = reverse_key << 1 | bit_read(key, i); } return reverse_key; } uint8_t subghz_protocol_blocks_get_parity(uint64_t key, uint8_t bit_count) { uint8_t parity = 0; for(uint8_t i = 0; i < bit_count; i++) { parity += bit_read(key, i); } return parity & 0x01; } uint8_t subghz_protocol_blocks_crc4( uint8_t const message[], size_t size, uint8_t polynomial, uint8_t init) { uint8_t remainder = init << 4; // LSBs are unused uint8_t poly = polynomial << 4; uint8_t bit; while(size--) { remainder ^= *message++; for(bit = 0; bit < 8; bit++) { if(remainder & 0x80) { remainder = (remainder << 1) ^ poly; } else { remainder = (remainder << 1); } } } return remainder >> 4 & 0x0f; // discard the LSBs } uint8_t subghz_protocol_blocks_crc7( uint8_t const message[], size_t size, uint8_t polynomial, uint8_t init) { uint8_t remainder = init << 1; // LSB is unused uint8_t poly = polynomial << 1; for(size_t byte = 0; byte < size; ++byte) { remainder ^= message[byte]; for(uint8_t bit = 0; bit < 8; ++bit) { if(remainder & 0x80) { remainder = (remainder << 1) ^ poly; } else { remainder = (remainder << 1); } } } return remainder >> 1 & 0x7f; // discard the LSB } uint8_t subghz_protocol_blocks_crc8( uint8_t const message[], size_t size, uint8_t polynomial, uint8_t init) { uint8_t remainder = init; for(size_t byte = 0; byte < size; ++byte) { remainder ^= message[byte]; for(uint8_t bit = 0; bit < 8; ++bit) { if(remainder & 0x80) { remainder = (remainder << 1) ^ polynomial; } else { remainder = (remainder << 1); } } } return remainder; } uint8_t subghz_protocol_blocks_crc8le( uint8_t const message[], size_t size, uint8_t polynomial, uint8_t init) { uint8_t remainder = subghz_protocol_blocks_reverse_key(init, 8); polynomial = subghz_protocol_blocks_reverse_key(polynomial, 8); for(size_t byte = 0; byte < size; ++byte) { remainder ^= message[byte]; for(uint8_t bit = 0; bit < 8; ++bit) { if(remainder & 1) { remainder = (remainder >> 1) ^ polynomial; } else { remainder = (remainder >> 1); } } } return remainder; } uint16_t subghz_protocol_blocks_crc16lsb( uint8_t const message[], size_t size, uint16_t polynomial, uint16_t init) { uint16_t remainder = init; for(size_t byte = 0; byte < size; ++byte) { remainder ^= message[byte]; for(uint8_t bit = 0; bit < 8; ++bit) { if(remainder & 1) { remainder = (remainder >> 1) ^ polynomial; } else { remainder = (remainder >> 1); } } } return remainder; } uint16_t subghz_protocol_blocks_crc16( uint8_t const message[], size_t size, uint16_t polynomial, uint16_t init) { uint16_t remainder = init; for(size_t byte = 0; byte < size; ++byte) { remainder ^= message[byte] << 8; for(uint8_t bit = 0; bit < 8; ++bit) { if(remainder & 0x8000) { remainder = (remainder << 1) ^ polynomial; } else { remainder = (remainder << 1); } } } return remainder; } uint8_t subghz_protocol_blocks_lfsr_digest8( uint8_t const message[], size_t size, uint8_t gen, uint8_t key) { uint8_t sum = 0; for(size_t byte = 0; byte < size; ++byte) { uint8_t data = message[byte]; for(int i = 7; i >= 0; --i) { // XOR key into sum if data bit is set if((data >> i) & 1) sum ^= key; // roll the key right (actually the LSB is dropped here) // and apply the gen (needs to include the dropped LSB as MSB) if(key & 1) key = (key >> 1) ^ gen; else key = (key >> 1); } } return sum; } uint8_t subghz_protocol_blocks_lfsr_digest8_reflect( uint8_t const message[], size_t size, uint8_t gen, uint8_t key) { uint8_t sum = 0; // Process message from last byte to first byte (reflected) for(int byte = size - 1; byte >= 0; --byte) { uint8_t data = message[byte]; // Process individual bits of each byte (reflected) for(uint8_t i = 0; i < 8; ++i) { // XOR key into sum if data bit is set if((data >> i) & 1) { sum ^= key; } // roll the key left (actually the LSB is dropped here) // and apply the gen (needs to include the dropped lsb as MSB) if(key & 0x80) key = (key << 1) ^ gen; else key = (key << 1); } } return sum; } uint16_t subghz_protocol_blocks_lfsr_digest16( uint8_t const message[], size_t size, uint16_t gen, uint16_t key) { uint16_t sum = 0; for(size_t byte = 0; byte < size; ++byte) { uint8_t data = message[byte]; for(int8_t i = 7; i >= 0; --i) { // if data bit is set then xor with key if((data >> i) & 1) sum ^= key; // roll the key right (actually the LSB is dropped here) // and apply the gen (needs to include the dropped LSB as MSB) if(key & 1) key = (key >> 1) ^ gen; else key = (key >> 1); } } return sum; } uint8_t subghz_protocol_blocks_add_bytes(uint8_t const message[], size_t size) { uint32_t result = 0; for(size_t i = 0; i < size; ++i) { result += message[i]; } return (uint8_t)result; } uint8_t subghz_protocol_blocks_parity8(uint8_t byte) { byte ^= byte >> 4; byte &= 0xf; return (0x6996 >> byte) & 1; } uint8_t subghz_protocol_blocks_parity_bytes(uint8_t const message[], size_t size) { uint8_t result = 0; for(size_t i = 0; i < size; ++i) { result ^= subghz_protocol_blocks_parity8(message[i]); } return result; } uint8_t subghz_protocol_blocks_xor_bytes(uint8_t const message[], size_t size) { uint8_t result = 0; for(size_t i = 0; i < size; ++i) { result ^= message[i]; } return result; } ================================================ FILE: applications/debug/subghz_test/protocol/math.h ================================================ #pragma once #include #include #include #define bit_read(value, bit) (((value) >> (bit)) & 0x01) #define bit_set(value, bit) \ ({ \ __typeof__(value) _one = (1); \ (value) |= (_one << (bit)); \ }) #define bit_clear(value, bit) \ ({ \ __typeof__(value) _one = (1); \ (value) &= ~(_one << (bit)); \ }) #define bit_write(value, bit, bitvalue) (bitvalue ? bit_set(value, bit) : bit_clear(value, bit)) #define DURATION_DIFF(x, y) (((x) < (y)) ? ((y) - (x)) : ((x) - (y))) #ifdef __cplusplus extern "C" { #endif /** Flip the data bitwise * * @param key In data * @param bit_count number of data bits * * @return Reverse data */ uint64_t subghz_protocol_blocks_reverse_key(uint64_t key, uint8_t bit_count); /** Get parity the data bitwise * * @param key In data * @param bit_count number of data bits * * @return parity */ uint8_t subghz_protocol_blocks_get_parity(uint64_t key, uint8_t bit_count); /** CRC-4 * * @param message array of bytes to check * @param size number of bytes in message * @param polynomial CRC polynomial * @param init starting crc value * * @return CRC value */ uint8_t subghz_protocol_blocks_crc4( uint8_t const message[], size_t size, uint8_t polynomial, uint8_t init); /** CRC-7 * * @param message array of bytes to check * @param size number of bytes in message * @param polynomial CRC polynomial * @param init starting crc value * * @return CRC value */ uint8_t subghz_protocol_blocks_crc7( uint8_t const message[], size_t size, uint8_t polynomial, uint8_t init); /** Generic Cyclic Redundancy Check CRC-8. Example polynomial: 0x31 = x8 + x5 + * x4 + 1 (x8 is implicit) Example polynomial: 0x80 = x8 + x7 (a normal * bit-by-bit parity XOR) * * @param message array of bytes to check * @param size number of bytes in message * @param polynomial byte is from x^7 to x^0 (x^8 is implicitly one) * @param init starting crc value * * @return CRC value */ uint8_t subghz_protocol_blocks_crc8( uint8_t const message[], size_t size, uint8_t polynomial, uint8_t init); /** "Little-endian" Cyclic Redundancy Check CRC-8 LE Input and output are * reflected, i.e. least significant bit is shifted in first * * @param message array of bytes to check * @param size number of bytes in message * @param polynomial CRC polynomial * @param init starting crc value * * @return CRC value */ uint8_t subghz_protocol_blocks_crc8le( uint8_t const message[], size_t size, uint8_t polynomial, uint8_t init); /** CRC-16 LSB. Input and output are reflected, i.e. least significant bit is * shifted in first. Note that poly and init already need to be reflected * * @param message array of bytes to check * @param size number of bytes in message * @param polynomial CRC polynomial * @param init starting crc value * * @return CRC value */ uint16_t subghz_protocol_blocks_crc16lsb( uint8_t const message[], size_t size, uint16_t polynomial, uint16_t init); /** CRC-16 * * @param message array of bytes to check * @param size number of bytes in message * @param polynomial CRC polynomial * @param init starting crc value * * @return CRC value */ uint16_t subghz_protocol_blocks_crc16( uint8_t const message[], size_t size, uint16_t polynomial, uint16_t init); /** Digest-8 by "LFSR-based Toeplitz hash" * * @param message bytes of message data * @param size number of bytes to digest * @param gen key stream generator, needs to includes the MSB if the * LFSR is rolling * @param key initial key * * @return digest value */ uint8_t subghz_protocol_blocks_lfsr_digest8( uint8_t const message[], size_t size, uint8_t gen, uint8_t key); /** Digest-8 by "LFSR-based Toeplitz hash", byte reflect, bit reflect * * @param message bytes of message data * @param size number of bytes to digest * @param gen key stream generator, needs to includes the MSB if the * LFSR is rolling * @param key initial key * * @return digest value */ uint8_t subghz_protocol_blocks_lfsr_digest8_reflect( uint8_t const message[], size_t size, uint8_t gen, uint8_t key); /** Digest-16 by "LFSR-based Toeplitz hash" * * @param message bytes of message data * @param size number of bytes to digest * @param gen key stream generator, needs to includes the MSB if the * LFSR is rolling * @param key initial key * * @return digest value */ uint16_t subghz_protocol_blocks_lfsr_digest16( uint8_t const message[], size_t size, uint16_t gen, uint16_t key); /** Compute Addition of a number of bytes * * @param message bytes of message data * @param size number of bytes to sum * * @return summation value */ uint8_t subghz_protocol_blocks_add_bytes(uint8_t const message[], size_t size); /** Compute bit parity of a single byte (8 bits) * * @param byte single byte to check * * @return 1 odd parity, 0 even parity */ uint8_t subghz_protocol_blocks_parity8(uint8_t byte); /** Compute bit parity of a number of bytes * * @param message bytes of message data * @param size number of bytes to sum * * @return 1 odd parity, 0 even parity */ uint8_t subghz_protocol_blocks_parity_bytes(uint8_t const message[], size_t size); /** Compute XOR (byte-wide parity) of a number of bytes * * @param message bytes of message data * @param size number of bytes to sum * * @return summation value, per bit-position 1 odd parity, 0 even parity */ uint8_t subghz_protocol_blocks_xor_bytes(uint8_t const message[], size_t size); #ifdef __cplusplus } #endif ================================================ FILE: applications/debug/subghz_test/protocol/princeton_for_testing.c ================================================ #include "princeton_for_testing.h" #include #include "math.h" /* * Help * https://phreakerclub.com/447 * */ #define SUBGHZ_PT_SHORT 300 #define SUBGHZ_PT_LONG (SUBGHZ_PT_SHORT * 3) #define SUBGHZ_PT_GUARD (SUBGHZ_PT_SHORT * 30) #define SUBGHZ_PT_COUNT_KEY_433 9 #define SUBGHZ_PT_TIMEOUT_433 900 #define SUBGHZ_PT_COUNT_KEY_868 9 #define SUBGHZ_PT_TIMEOUT_868 14000 #define TAG "SubGhzProtocolPrinceton" struct SubGhzEncoderPrinceton { uint32_t key; uint16_t te; size_t repeat; size_t front; size_t count_key; size_t count_key_package; uint32_t time_high; uint32_t time_low; uint32_t timeout; uint32_t time_stop; }; typedef enum { PrincetonDecoderStepReset = 0, PrincetonDecoderStepSaveDuration, PrincetonDecoderStepCheckDuration, } PrincetonDecoderStep; SubGhzEncoderPrinceton* subghz_encoder_princeton_for_testing_alloc(void) { SubGhzEncoderPrinceton* instance = malloc(sizeof(SubGhzEncoderPrinceton)); return instance; } void subghz_encoder_princeton_for_testing_free(SubGhzEncoderPrinceton* instance) { furi_assert(instance); free(instance); } void subghz_encoder_princeton_for_testing_stop( SubGhzEncoderPrinceton* instance, uint32_t time_stop) { instance->time_stop = time_stop; } void subghz_encoder_princeton_for_testing_set( SubGhzEncoderPrinceton* instance, uint32_t key, size_t repeat, uint32_t frequency) { furi_assert(instance); instance->te = SUBGHZ_PT_SHORT; instance->key = key; instance->repeat = repeat + 1; instance->front = 48; instance->time_high = 0; instance->time_low = 0; if(frequency < 700000000) { instance->count_key_package = SUBGHZ_PT_COUNT_KEY_433; instance->timeout = SUBGHZ_PT_TIMEOUT_433; } else { instance->count_key_package = SUBGHZ_PT_COUNT_KEY_868; instance->timeout = SUBGHZ_PT_TIMEOUT_868; } instance->count_key = instance->count_key_package + 3; if((furi_get_tick() - instance->time_stop) < instance->timeout) { instance->time_stop = (instance->timeout - (furi_get_tick() - instance->time_stop)) * 1000; } else { instance->time_stop = 0; } } size_t subghz_encoder_princeton_for_testing_get_repeat_left(SubGhzEncoderPrinceton* instance) { furi_assert(instance); return instance->repeat; } void subghz_encoder_princeton_for_testing_print_log(void* context) { SubGhzEncoderPrinceton* instance = context; float duty_cycle = ((float)instance->time_high / (instance->time_high + instance->time_low)) * 100; FURI_LOG_I( TAG "Encoder", "Radio tx_time=%luus ON=%luus, OFF=%luus, DutyCycle=%lu,%lu%%", instance->time_high + instance->time_low, instance->time_high, instance->time_low, (uint32_t)duty_cycle, (uint32_t)((duty_cycle - (uint32_t)duty_cycle) * 100UL)); } LevelDuration subghz_encoder_princeton_for_testing_yield(void* context) { SubGhzEncoderPrinceton* instance = context; if(instance->repeat == 0) { subghz_encoder_princeton_for_testing_print_log(instance); return level_duration_reset(); } size_t bit = instance->front / 2; bool level = !(instance->front % 2); LevelDuration ret; if(bit < 24) { uint8_t byte = bit / 8; uint8_t bit_in_byte = bit % 8; bool value = (((uint8_t*)&instance->key)[2 - byte] >> (7 - bit_in_byte)) & 1; if(value) { ret = level_duration_make(level, level ? instance->te * 3 : instance->te); if(level) instance->time_high += instance->te * 3; else instance->time_low += instance->te; } else { ret = level_duration_make(level, level ? instance->te : instance->te * 3); if(level) instance->time_high += instance->te; else instance->time_low += instance->te * 3; } } else { if(instance->time_stop) { ret = level_duration_make(level, level ? instance->te : instance->time_stop); if(level) instance->time_high += instance->te; else { instance->time_low += instance->time_stop; instance->time_stop = 0; instance->front = 47; } } else { if(--instance->count_key != 0) { ret = level_duration_make(level, level ? instance->te : instance->te * 30); if(level) instance->time_high += instance->te; else instance->time_low += instance->te * 30; } else { instance->count_key = instance->count_key_package + 2; instance->front = 48; ret = level_duration_make(level, level ? instance->te : instance->timeout * 1000); if(level) instance->time_high += instance->te; else instance->time_low += instance->timeout * 1000; } } } instance->front++; if(instance->front == 50) { instance->repeat--; instance->front = 0; } return ret; } struct SubGhzDecoderPrinceton { const char* name; uint16_t te_long; uint16_t te_short; uint16_t te_delta; uint8_t code_count_bit; uint8_t code_last_count_bit; uint64_t code_found; uint64_t code_last_found; uint8_t code_min_count_bit_for_found; uint8_t btn; uint32_t te_last; uint32_t serial; uint32_t parser_step; uint16_t cnt; uint32_t te; SubGhzDecoderPrincetonCallback callback; void* context; }; SubGhzDecoderPrinceton* subghz_decoder_princeton_for_testing_alloc(void) { SubGhzDecoderPrinceton* instance = malloc(sizeof(SubGhzDecoderPrinceton)); instance->te = SUBGHZ_PT_SHORT; instance->name = "Princeton"; instance->code_min_count_bit_for_found = 24; instance->te_short = 400; instance->te_long = 1200; instance->te_delta = 250; return instance; } void subghz_decoder_princeton_for_testing_free(SubGhzDecoderPrinceton* instance) { furi_assert(instance); free(instance); } void subghz_decoder_princeton_for_testing_set_callback( SubGhzDecoderPrinceton* instance, SubGhzDecoderPrincetonCallback callback, void* context) { instance->callback = callback; instance->context = context; } void subghz_decoder_princeton_for_testing_reset(SubGhzDecoderPrinceton* instance) { instance->parser_step = PrincetonDecoderStepReset; } static void subghz_decoder_princeton_for_testing_add_bit(SubGhzDecoderPrinceton* instance, uint8_t bit) { instance->code_found = instance->code_found << 1 | bit; instance->code_count_bit++; } void subghz_decoder_princeton_for_testing_parse( SubGhzDecoderPrinceton* instance, bool level, uint32_t duration) { switch(instance->parser_step) { case PrincetonDecoderStepReset: if((!level) && (DURATION_DIFF(duration, instance->te_short * 36) < instance->te_delta * 36)) { //Found Preambula instance->parser_step = PrincetonDecoderStepSaveDuration; instance->code_found = 0; instance->code_count_bit = 0; instance->te = 0; } break; case PrincetonDecoderStepSaveDuration: //save duration if(level) { instance->te_last = duration; instance->te += duration; instance->parser_step = PrincetonDecoderStepCheckDuration; } break; case PrincetonDecoderStepCheckDuration: if(!level) { if(duration >= ((uint32_t)instance->te_short * 10 + instance->te_delta)) { instance->parser_step = PrincetonDecoderStepSaveDuration; if(instance->code_count_bit == instance->code_min_count_bit_for_found) { instance->te /= (instance->code_count_bit * 4 + 1); instance->code_last_found = instance->code_found; instance->code_last_count_bit = instance->code_count_bit; instance->serial = instance->code_found >> 4; instance->btn = (uint8_t)instance->code_found & 0x00000F; if(instance->callback) instance->callback(instance, instance->context); } instance->code_found = 0; instance->code_count_bit = 0; instance->te = 0; break; } instance->te += duration; if((DURATION_DIFF(instance->te_last, instance->te_short) < instance->te_delta) && (DURATION_DIFF(duration, instance->te_long) < instance->te_delta * 3)) { subghz_decoder_princeton_for_testing_add_bit(instance, 0); instance->parser_step = PrincetonDecoderStepSaveDuration; } else if( (DURATION_DIFF(instance->te_last, instance->te_long) < instance->te_delta * 3) && (DURATION_DIFF(duration, instance->te_short) < instance->te_delta)) { subghz_decoder_princeton_for_testing_add_bit(instance, 1); instance->parser_step = PrincetonDecoderStepSaveDuration; } else { instance->parser_step = PrincetonDecoderStepReset; } } else { instance->parser_step = PrincetonDecoderStepReset; } break; } } ================================================ FILE: applications/debug/subghz_test/protocol/princeton_for_testing.h ================================================ #pragma once //#include "base.h" #include #include /** SubGhzDecoderPrinceton anonymous type */ typedef struct SubGhzDecoderPrinceton SubGhzDecoderPrinceton; /** SubGhzEncoderPrinceton anonymous type */ typedef struct SubGhzEncoderPrinceton SubGhzEncoderPrinceton; typedef void (*SubGhzDecoderPrincetonCallback)(SubGhzDecoderPrinceton* parser, void* context); /** * Allocate SubGhzEncoderPrinceton * @return pointer to SubGhzEncoderPrinceton instance */ SubGhzEncoderPrinceton* subghz_encoder_princeton_for_testing_alloc(void); /** * Free SubGhzEncoderPrinceton instance * @param instance - SubGhzEncoderPrinceton instance */ void subghz_encoder_princeton_for_testing_free(SubGhzEncoderPrinceton* instance); /** * Forced transmission stop. * @param instance Pointer to a SubGhzEncoderPrinceton instance * @param time_stop Transmission stop time, ms */ void subghz_encoder_princeton_for_testing_stop( SubGhzEncoderPrinceton* instance, uint32_t time_stop); /** * Set new encoder params * @param instance - SubGhzEncoderPrinceton instance * @param key - 24bit key * @param repeat - how many times to repeat * @param frequency - frequency */ void subghz_encoder_princeton_for_testing_set( SubGhzEncoderPrinceton* instance, uint32_t key, size_t repeat, uint32_t frequency); /** * Get repeat count left * @param instance - SubGhzEncoderPrinceton instance * @return repeat count left */ size_t subghz_encoder_princeton_for_testing_get_repeat_left(SubGhzEncoderPrinceton* instance); /** * Print encoder log * @param instance - SubGhzEncoderPrinceton instance */ void subghz_encoder_princeton_for_testing_print_log(void* context); /** * Get level duration * @param instance - SubGhzEncoderPrinceton instance * @return level duration */ LevelDuration subghz_encoder_princeton_for_testing_yield(void* context); /** * Allocate SubGhzDecoderPrinceton * @return SubGhzDecoderPrinceton* */ SubGhzDecoderPrinceton* subghz_decoder_princeton_for_testing_alloc(void); /** * Free SubGhzDecoderPrinceton * @param instance */ void subghz_decoder_princeton_for_testing_free(SubGhzDecoderPrinceton* instance); void subghz_decoder_princeton_for_testing_set_callback( SubGhzDecoderPrinceton* instance, SubGhzDecoderPrincetonCallback callback, void* context); /** * Reset internal state * @param instance - SubGhzDecoderPrinceton instance */ void subghz_decoder_princeton_for_testing_reset(SubGhzDecoderPrinceton* instance); /** * Parse accepted duration * @param instance - SubGhzDecoderPrinceton instance * @param data - LevelDuration level_duration */ void subghz_decoder_princeton_for_testing_parse( SubGhzDecoderPrinceton* instance, bool level, uint32_t duration); ================================================ FILE: applications/debug/subghz_test/scenes/subghz_test_scene.c ================================================ #include "../subghz_test_app_i.h" // IWYU pragma: keep // Generate scene on_enter handlers array #define ADD_SCENE(prefix, name, id) prefix##_scene_##name##_on_enter, void (*const subghz_test_scene_on_enter_handlers[])(void*) = { #include "subghz_test_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 subghz_test_scene_on_event_handlers[])(void* context, SceneManagerEvent event) = { #include "subghz_test_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 subghz_test_scene_on_exit_handlers[])(void* context) = { #include "subghz_test_scene_config.h" }; #undef ADD_SCENE // Initialize scene handlers configuration structure const SceneManagerHandlers subghz_test_scene_handlers = { .on_enter_handlers = subghz_test_scene_on_enter_handlers, .on_event_handlers = subghz_test_scene_on_event_handlers, .on_exit_handlers = subghz_test_scene_on_exit_handlers, .scene_num = SubGhzTestSceneNum, }; ================================================ FILE: applications/debug/subghz_test/scenes/subghz_test_scene.h ================================================ #pragma once #include // Generate scene id and total number #define ADD_SCENE(prefix, name, id) SubGhzTestScene##id, typedef enum { #include "subghz_test_scene_config.h" SubGhzTestSceneNum, } SubGhzTestScene; #undef ADD_SCENE extern const SceneManagerHandlers subghz_test_scene_handlers; // Generate scene on_enter handlers declaration #define ADD_SCENE(prefix, name, id) void prefix##_scene_##name##_on_enter(void*); #include "subghz_test_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 "subghz_test_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 "subghz_test_scene_config.h" #undef ADD_SCENE ================================================ FILE: applications/debug/subghz_test/scenes/subghz_test_scene_about.c ================================================ #include "../subghz_test_app_i.h" void subghz_test_scene_about_widget_callback(GuiButtonType result, InputType type, void* context) { SubGhzTestApp* app = context; if(type == InputTypeShort) { view_dispatcher_send_custom_event(app->view_dispatcher, result); } } void subghz_test_scene_about_on_enter(void* context) { SubGhzTestApp* app = context; FuriString* temp_str; temp_str = furi_string_alloc(); furi_string_printf(temp_str, "\e#%s\n", "Information"); furi_string_cat_printf(temp_str, "Version: %s\n", SUBGHZ_TEST_VERSION_APP); furi_string_cat_printf(temp_str, "Developed by: %s\n", SUBGHZ_TEST_DEVELOPED); furi_string_cat_printf(temp_str, "Github: %s\n\n", SUBGHZ_TEST_GITHUB); furi_string_cat_printf(temp_str, "\e#%s\n", "Description"); furi_string_cat_printf( temp_str, "This application is designed\nto test the functionality of the\nbuilt-in CC1101 module.\n\n"); widget_add_text_box_element( app->widget, 0, 0, 128, 14, AlignCenter, AlignBottom, "\e#\e! \e!\n", false); widget_add_text_box_element( app->widget, 0, 2, 128, 14, AlignCenter, AlignBottom, "\e#\e! Sub-Ghz Test \e!\n", false); widget_add_text_scroll_element(app->widget, 0, 16, 128, 50, furi_string_get_cstr(temp_str)); furi_string_free(temp_str); view_dispatcher_switch_to_view(app->view_dispatcher, SubGhzTestViewWidget); } bool subghz_test_scene_about_on_event(void* context, SceneManagerEvent event) { SubGhzTestApp* app = context; bool consumed = false; UNUSED(app); UNUSED(event); return consumed; } void subghz_test_scene_about_on_exit(void* context) { SubGhzTestApp* app = context; // Clear views widget_reset(app->widget); } ================================================ FILE: applications/debug/subghz_test/scenes/subghz_test_scene_carrier.c ================================================ #include "../subghz_test_app_i.h" void subghz_test_scene_carrier_callback(SubGhzTestCarrierEvent event, void* context) { furi_assert(context); SubGhzTestApp* app = context; view_dispatcher_send_custom_event(app->view_dispatcher, event); } void subghz_test_scene_carrier_on_enter(void* context) { SubGhzTestApp* app = context; subghz_test_carrier_set_callback( app->subghz_test_carrier, subghz_test_scene_carrier_callback, app); view_dispatcher_switch_to_view(app->view_dispatcher, SubGhzTestViewCarrier); } bool subghz_test_scene_carrier_on_event(void* context, SceneManagerEvent event) { SubGhzTestApp* app = context; if(event.type == SceneManagerEventTypeCustom) { if(event.event == SubGhzTestCarrierEventOnlyRx) { scene_manager_next_scene(app->scene_manager, SubGhzTestSceneShowOnlyRx); return true; } } return false; } void subghz_test_scene_carrier_on_exit(void* context) { UNUSED(context); } ================================================ FILE: applications/debug/subghz_test/scenes/subghz_test_scene_config.h ================================================ ADD_SCENE(subghz_test, start, Start) ADD_SCENE(subghz_test, about, About) ADD_SCENE(subghz_test, carrier, Carrier) ADD_SCENE(subghz_test, packet, Packet) ADD_SCENE(subghz_test, static, Static) ADD_SCENE(subghz_test, show_only_rx, ShowOnlyRx) ================================================ FILE: applications/debug/subghz_test/scenes/subghz_test_scene_packet.c ================================================ #include "../subghz_test_app_i.h" void subghz_test_scene_packet_callback(SubGhzTestPacketEvent event, void* context) { furi_assert(context); SubGhzTestApp* app = context; view_dispatcher_send_custom_event(app->view_dispatcher, event); } void subghz_test_scene_packet_on_enter(void* context) { SubGhzTestApp* app = context; subghz_test_packet_set_callback( app->subghz_test_packet, subghz_test_scene_packet_callback, app); view_dispatcher_switch_to_view(app->view_dispatcher, SubGhzTestViewPacket); } bool subghz_test_scene_packet_on_event(void* context, SceneManagerEvent event) { SubGhzTestApp* app = context; if(event.type == SceneManagerEventTypeCustom) { if(event.event == SubGhzTestPacketEventOnlyRx) { scene_manager_next_scene(app->scene_manager, SubGhzTestSceneShowOnlyRx); return true; } } return false; } void subghz_test_scene_packet_on_exit(void* context) { UNUSED(context); } ================================================ FILE: applications/debug/subghz_test/scenes/subghz_test_scene_show_only_rx.c ================================================ #include "../subghz_test_app_i.h" #include void subghz_test_scene_show_only_rx_popup_callback(void* context) { SubGhzTestApp* app = context; view_dispatcher_send_custom_event(app->view_dispatcher, SubGhzTestCustomEventSceneShowOnlyRX); } void subghz_test_scene_show_only_rx_on_enter(void* context) { SubGhzTestApp* app = context; // Setup view Popup* popup = app->popup; const char* header_text = "Transmission is Blocked"; const char* message_text = "Transmission on\nthis frequency is\nrestricted in\nyour region"; if(!furi_hal_region_is_provisioned()) { header_text = "Firmware update needed"; message_text = "Please update\nfirmware before\nusing this feature\nflipp.dev/upd"; } popup_set_header(popup, header_text, 63, 3, AlignCenter, AlignTop); popup_set_text(popup, message_text, 0, 17, AlignLeft, AlignTop); popup_set_icon(popup, 72, 17, &I_DolphinCommon_56x48); popup_set_timeout(popup, 1500); popup_set_context(popup, app); popup_set_callback(popup, subghz_test_scene_show_only_rx_popup_callback); popup_enable_timeout(popup); view_dispatcher_switch_to_view(app->view_dispatcher, SubGhzTestViewPopup); } bool subghz_test_scene_show_only_rx_on_event(void* context, SceneManagerEvent event) { SubGhzTestApp* app = context; if(event.type == SceneManagerEventTypeCustom) { if(event.event == SubGhzTestCustomEventSceneShowOnlyRX) { scene_manager_previous_scene(app->scene_manager); return true; } } return false; } void subghz_test_scene_show_only_rx_on_exit(void* context) { SubGhzTestApp* app = context; Popup* popup = app->popup; popup_reset(popup); } ================================================ FILE: applications/debug/subghz_test/scenes/subghz_test_scene_start.c ================================================ #include "../subghz_test_app_i.h" typedef enum { SubmenuIndexSubGhzTestCarrier, SubmenuIndexSubGhzTestPacket, SubmenuIndexSubGhzTestStatic, SubmenuIndexSubGhzTestAbout, } SubmenuIndex; void subghz_test_scene_start_submenu_callback(void* context, uint32_t index) { SubGhzTestApp* app = context; view_dispatcher_send_custom_event(app->view_dispatcher, index); } void subghz_test_scene_start_on_enter(void* context) { SubGhzTestApp* app = context; Submenu* submenu = app->submenu; submenu_add_item( submenu, "Carrier", SubmenuIndexSubGhzTestCarrier, subghz_test_scene_start_submenu_callback, app); submenu_add_item( submenu, "Packet", SubmenuIndexSubGhzTestPacket, subghz_test_scene_start_submenu_callback, app); submenu_add_item( submenu, "Static", SubmenuIndexSubGhzTestStatic, subghz_test_scene_start_submenu_callback, app); submenu_add_item( submenu, "About", SubmenuIndexSubGhzTestAbout, subghz_test_scene_start_submenu_callback, app); submenu_set_selected_item( submenu, scene_manager_get_scene_state(app->scene_manager, SubGhzTestSceneStart)); view_dispatcher_switch_to_view(app->view_dispatcher, SubGhzTestViewSubmenu); } bool subghz_test_scene_start_on_event(void* context, SceneManagerEvent event) { SubGhzTestApp* app = context; bool consumed = false; if(event.type == SceneManagerEventTypeCustom) { if(event.event == SubmenuIndexSubGhzTestAbout) { scene_manager_next_scene(app->scene_manager, SubGhzTestSceneAbout); consumed = true; } else if(event.event == SubmenuIndexSubGhzTestCarrier) { scene_manager_next_scene(app->scene_manager, SubGhzTestSceneCarrier); consumed = true; } else if(event.event == SubmenuIndexSubGhzTestPacket) { scene_manager_next_scene(app->scene_manager, SubGhzTestScenePacket); consumed = true; } else if(event.event == SubmenuIndexSubGhzTestStatic) { scene_manager_next_scene(app->scene_manager, SubGhzTestSceneStatic); consumed = true; } scene_manager_set_scene_state(app->scene_manager, SubGhzTestSceneStart, event.event); } return consumed; } void subghz_test_scene_start_on_exit(void* context) { SubGhzTestApp* app = context; submenu_reset(app->submenu); } ================================================ FILE: applications/debug/subghz_test/scenes/subghz_test_scene_static.c ================================================ #include "../subghz_test_app_i.h" void subghz_test_scene_static_callback(SubGhzTestStaticEvent event, void* context) { furi_assert(context); SubGhzTestApp* app = context; view_dispatcher_send_custom_event(app->view_dispatcher, event); } void subghz_test_scene_static_on_enter(void* context) { SubGhzTestApp* app = context; subghz_test_static_set_callback( app->subghz_test_static, subghz_test_scene_static_callback, app); view_dispatcher_switch_to_view(app->view_dispatcher, SubGhzTestViewStatic); } bool subghz_test_scene_static_on_event(void* context, SceneManagerEvent event) { SubGhzTestApp* app = context; if(event.type == SceneManagerEventTypeCustom) { if(event.event == SubGhzTestStaticEventOnlyRx) { scene_manager_next_scene(app->scene_manager, SubGhzTestSceneShowOnlyRx); return true; } } return false; } void subghz_test_scene_static_on_exit(void* context) { UNUSED(context); } ================================================ FILE: applications/debug/subghz_test/subghz_test_app.c ================================================ #include "subghz_test_app_i.h" #include #include static bool subghz_test_app_custom_event_callback(void* context, uint32_t event) { furi_assert(context); SubGhzTestApp* app = context; return scene_manager_handle_custom_event(app->scene_manager, event); } static bool subghz_test_app_back_event_callback(void* context) { furi_assert(context); SubGhzTestApp* app = context; return scene_manager_handle_back_event(app->scene_manager); } static void subghz_test_app_tick_event_callback(void* context) { furi_assert(context); SubGhzTestApp* app = context; scene_manager_handle_tick_event(app->scene_manager); } SubGhzTestApp* subghz_test_app_alloc(void) { SubGhzTestApp* app = malloc(sizeof(SubGhzTestApp)); // GUI app->gui = furi_record_open(RECORD_GUI); // View Dispatcher app->view_dispatcher = view_dispatcher_alloc(); app->scene_manager = scene_manager_alloc(&subghz_test_scene_handlers, app); view_dispatcher_set_event_callback_context(app->view_dispatcher, app); view_dispatcher_set_custom_event_callback( app->view_dispatcher, subghz_test_app_custom_event_callback); view_dispatcher_set_navigation_event_callback( app->view_dispatcher, subghz_test_app_back_event_callback); view_dispatcher_set_tick_event_callback( app->view_dispatcher, subghz_test_app_tick_event_callback, 100); view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); // Open Notification record app->notifications = furi_record_open(RECORD_NOTIFICATION); // SubMenu app->submenu = submenu_alloc(); view_dispatcher_add_view( app->view_dispatcher, SubGhzTestViewSubmenu, submenu_get_view(app->submenu)); // Widget app->widget = widget_alloc(); view_dispatcher_add_view( app->view_dispatcher, SubGhzTestViewWidget, widget_get_view(app->widget)); // Popup app->popup = popup_alloc(); view_dispatcher_add_view( app->view_dispatcher, SubGhzTestViewPopup, popup_get_view(app->popup)); // Carrier Test Module app->subghz_test_carrier = subghz_test_carrier_alloc(); view_dispatcher_add_view( app->view_dispatcher, SubGhzTestViewCarrier, subghz_test_carrier_get_view(app->subghz_test_carrier)); // Packet Test app->subghz_test_packet = subghz_test_packet_alloc(); view_dispatcher_add_view( app->view_dispatcher, SubGhzTestViewPacket, subghz_test_packet_get_view(app->subghz_test_packet)); // Static send app->subghz_test_static = subghz_test_static_alloc(); view_dispatcher_add_view( app->view_dispatcher, SubGhzTestViewStatic, subghz_test_static_get_view(app->subghz_test_static)); scene_manager_next_scene(app->scene_manager, SubGhzTestSceneStart); return app; } void subghz_test_app_free(SubGhzTestApp* app) { furi_assert(app); // Submenu view_dispatcher_remove_view(app->view_dispatcher, SubGhzTestViewSubmenu); submenu_free(app->submenu); // Widget view_dispatcher_remove_view(app->view_dispatcher, SubGhzTestViewWidget); widget_free(app->widget); // Popup view_dispatcher_remove_view(app->view_dispatcher, SubGhzTestViewPopup); popup_free(app->popup); // Carrier Test view_dispatcher_remove_view(app->view_dispatcher, SubGhzTestViewCarrier); subghz_test_carrier_free(app->subghz_test_carrier); // Packet Test view_dispatcher_remove_view(app->view_dispatcher, SubGhzTestViewPacket); subghz_test_packet_free(app->subghz_test_packet); // Static view_dispatcher_remove_view(app->view_dispatcher, SubGhzTestViewStatic); subghz_test_static_free(app->subghz_test_static); // View dispatcher view_dispatcher_free(app->view_dispatcher); scene_manager_free(app->scene_manager); // Notifications furi_record_close(RECORD_NOTIFICATION); app->notifications = NULL; // Close records furi_record_close(RECORD_GUI); free(app); } int32_t subghz_test_app(void* p) { UNUSED(p); SubGhzTestApp* subghz_test_app = subghz_test_app_alloc(); view_dispatcher_run(subghz_test_app->view_dispatcher); subghz_test_app_free(subghz_test_app); return 0; } ================================================ FILE: applications/debug/subghz_test/subghz_test_app_i.c ================================================ #include #define TAG "SubGhzTest" ================================================ FILE: applications/debug/subghz_test/subghz_test_app_i.h ================================================ #pragma once #include "helpers/subghz_test_types.h" #include "helpers/subghz_test_event.h" #include "scenes/subghz_test_scene.h" #include #include #include #include #include #include #include #include "views/subghz_test_static.h" #include "views/subghz_test_carrier.h" #include "views/subghz_test_packet.h" typedef struct SubGhzTestApp SubGhzTestApp; struct SubGhzTestApp { Gui* gui; ViewDispatcher* view_dispatcher; SceneManager* scene_manager; NotificationApp* notifications; Submenu* submenu; Widget* widget; Popup* popup; SubGhzTestStatic* subghz_test_static; SubGhzTestCarrier* subghz_test_carrier; SubGhzTestPacket* subghz_test_packet; }; ================================================ FILE: applications/debug/subghz_test/views/subghz_test_carrier.c ================================================ #include "subghz_test_carrier.h" #include "../helpers/subghz_test_frequency.h" #include #include #include #include #include struct SubGhzTestCarrier { View* view; FuriTimer* timer; SubGhzTestCarrierCallback callback; void* context; }; typedef enum { SubGhzTestCarrierModelStatusRx, SubGhzTestCarrierModelStatusTx, } SubGhzTestCarrierModelStatus; typedef struct { uint8_t frequency; uint32_t real_frequency; FuriHalSubGhzPath path; float rssi; SubGhzTestCarrierModelStatus status; } SubGhzTestCarrierModel; void subghz_test_carrier_set_callback( SubGhzTestCarrier* subghz_test_carrier, SubGhzTestCarrierCallback callback, void* context) { furi_assert(subghz_test_carrier); furi_assert(callback); subghz_test_carrier->callback = callback; subghz_test_carrier->context = context; } void subghz_test_carrier_draw(Canvas* canvas, SubGhzTestCarrierModel* model) { char buffer[64]; canvas_set_color(canvas, ColorBlack); canvas_set_font(canvas, FontPrimary); canvas_draw_str(canvas, 0, 8, "CC1101 Basic Test"); canvas_set_font(canvas, FontSecondary); // Frequency snprintf( buffer, sizeof(buffer), "Freq: %03ld.%03ld.%03ld Hz", model->real_frequency / 1000000 % 1000, model->real_frequency / 1000 % 1000, model->real_frequency % 1000); canvas_draw_str(canvas, 0, 20, buffer); // Path char* path_name = "Unknown"; if(model->path == FuriHalSubGhzPathIsolate) { path_name = "isolate"; } else if(model->path == FuriHalSubGhzPath433) { path_name = "433MHz"; } else if(model->path == FuriHalSubGhzPath315) { path_name = "315MHz"; } else if(model->path == FuriHalSubGhzPath868) { path_name = "868MHz"; } snprintf(buffer, sizeof(buffer), "Path: %d - %s", model->path, path_name); canvas_draw_str(canvas, 0, 31, buffer); if(model->status == SubGhzTestCarrierModelStatusRx) { snprintf( buffer, sizeof(buffer), "RSSI: %ld.%ld dBm", (int32_t)(model->rssi), (int32_t)fabsf(model->rssi * 10.f) % 10); canvas_draw_str(canvas, 0, 42, buffer); } else { canvas_draw_str(canvas, 0, 42, "TX"); } } bool subghz_test_carrier_input(InputEvent* event, void* context) { furi_assert(context); SubGhzTestCarrier* subghz_test_carrier = context; if(event->key == InputKeyBack || event->type != InputTypeShort) { return false; } with_view_model( subghz_test_carrier->view, SubGhzTestCarrierModel * model, { furi_hal_subghz_idle(); if(event->key == InputKeyLeft) { if(model->frequency > 0) model->frequency--; } else if(event->key == InputKeyRight) { if(model->frequency < subghz_frequencies_count_testing - 1) model->frequency++; } else if(event->key == InputKeyDown) { if(model->path > 0) model->path--; } else if(event->key == InputKeyUp) { if(model->path < FuriHalSubGhzPath868) model->path++; } else if(event->key == InputKeyOk) { if(model->status == SubGhzTestCarrierModelStatusTx) { model->status = SubGhzTestCarrierModelStatusRx; } else { model->status = SubGhzTestCarrierModelStatusTx; } } model->real_frequency = furi_hal_subghz_set_frequency(subghz_frequencies_testing[model->frequency]); furi_hal_subghz_set_path(model->path); if(model->status == SubGhzTestCarrierModelStatusRx) { furi_hal_gpio_init(&gpio_cc1101_g0, GpioModeInput, GpioPullNo, GpioSpeedLow); furi_hal_subghz_rx(); } else { furi_hal_gpio_init( &gpio_cc1101_g0, GpioModeOutputPushPull, GpioPullNo, GpioSpeedLow); furi_hal_gpio_write(&gpio_cc1101_g0, true); if(!furi_hal_subghz_tx()) { furi_hal_gpio_init(&gpio_cc1101_g0, GpioModeInput, GpioPullNo, GpioSpeedLow); subghz_test_carrier->callback( SubGhzTestCarrierEventOnlyRx, subghz_test_carrier->context); } } }, true); return true; } void subghz_test_carrier_enter(void* context) { furi_assert(context); SubGhzTestCarrier* subghz_test_carrier = context; furi_hal_subghz_reset(); furi_hal_subghz_load_custom_preset(subghz_device_cc1101_preset_ook_650khz_async_regs); furi_hal_gpio_init(&gpio_cc1101_g0, GpioModeInput, GpioPullNo, GpioSpeedLow); with_view_model( subghz_test_carrier->view, SubGhzTestCarrierModel * model, { model->frequency = subghz_frequencies_433_92_testing; // 433 model->real_frequency = furi_hal_subghz_set_frequency(subghz_frequencies_testing[model->frequency]); model->path = FuriHalSubGhzPathIsolate; // isolate model->rssi = 0.0f; model->status = SubGhzTestCarrierModelStatusRx; }, true); furi_hal_subghz_rx(); furi_timer_start(subghz_test_carrier->timer, furi_kernel_get_tick_frequency() / 4); } void subghz_test_carrier_exit(void* context) { furi_assert(context); SubGhzTestCarrier* subghz_test_carrier = context; furi_timer_stop(subghz_test_carrier->timer); // Reinitialize IC to default state furi_hal_subghz_sleep(); } void subghz_test_carrier_rssi_timer_callback(void* context) { furi_assert(context); SubGhzTestCarrier* subghz_test_carrier = context; with_view_model( subghz_test_carrier->view, SubGhzTestCarrierModel * model, { if(model->status == SubGhzTestCarrierModelStatusRx) { model->rssi = furi_hal_subghz_get_rssi(); } }, false); } SubGhzTestCarrier* subghz_test_carrier_alloc(void) { SubGhzTestCarrier* subghz_test_carrier = malloc(sizeof(SubGhzTestCarrier)); // View allocation and configuration subghz_test_carrier->view = view_alloc(); view_allocate_model( subghz_test_carrier->view, ViewModelTypeLocking, sizeof(SubGhzTestCarrierModel)); view_set_context(subghz_test_carrier->view, subghz_test_carrier); view_set_draw_callback(subghz_test_carrier->view, (ViewDrawCallback)subghz_test_carrier_draw); view_set_input_callback(subghz_test_carrier->view, subghz_test_carrier_input); view_set_enter_callback(subghz_test_carrier->view, subghz_test_carrier_enter); view_set_exit_callback(subghz_test_carrier->view, subghz_test_carrier_exit); subghz_test_carrier->timer = furi_timer_alloc( subghz_test_carrier_rssi_timer_callback, FuriTimerTypePeriodic, subghz_test_carrier); return subghz_test_carrier; } void subghz_test_carrier_free(SubGhzTestCarrier* subghz_test_carrier) { furi_assert(subghz_test_carrier); furi_timer_free(subghz_test_carrier->timer); view_free(subghz_test_carrier->view); free(subghz_test_carrier); } View* subghz_test_carrier_get_view(SubGhzTestCarrier* subghz_test_carrier) { furi_assert(subghz_test_carrier); return subghz_test_carrier->view; } ================================================ FILE: applications/debug/subghz_test/views/subghz_test_carrier.h ================================================ #pragma once #include typedef enum { SubGhzTestCarrierEventOnlyRx, } SubGhzTestCarrierEvent; typedef struct SubGhzTestCarrier SubGhzTestCarrier; typedef void (*SubGhzTestCarrierCallback)(SubGhzTestCarrierEvent event, void* context); void subghz_test_carrier_set_callback( SubGhzTestCarrier* subghz_test_carrier, SubGhzTestCarrierCallback callback, void* context); SubGhzTestCarrier* subghz_test_carrier_alloc(void); void subghz_test_carrier_free(SubGhzTestCarrier* subghz_test_carrier); View* subghz_test_carrier_get_view(SubGhzTestCarrier* subghz_test_carrier); ================================================ FILE: applications/debug/subghz_test/views/subghz_test_packet.c ================================================ #include "subghz_test_packet.h" #include "../helpers/subghz_test_frequency.h" #include #include #include #include #include #include #include "../protocol/princeton_for_testing.h" #define SUBGHZ_TEST_PACKET_COUNT 500 struct SubGhzTestPacket { View* view; FuriTimer* timer; SubGhzDecoderPrinceton* decoder; SubGhzEncoderPrinceton* encoder; volatile size_t packet_rx; SubGhzTestPacketCallback callback; void* context; }; typedef enum { SubGhzTestPacketModelStatusRx, SubGhzTestPacketModelStatusOnlyRx, SubGhzTestPacketModelStatusTx, } SubGhzTestPacketModelStatus; typedef struct { uint8_t frequency; uint32_t real_frequency; FuriHalSubGhzPath path; float rssi; size_t packets; SubGhzTestPacketModelStatus status; } SubGhzTestPacketModel; volatile bool subghz_test_packet_overrun = false; void subghz_test_packet_set_callback( SubGhzTestPacket* subghz_test_packet, SubGhzTestPacketCallback callback, void* context) { furi_assert(subghz_test_packet); furi_assert(callback); subghz_test_packet->callback = callback; subghz_test_packet->context = context; } static void subghz_test_packet_rx_callback(bool level, uint32_t duration, void* context) { furi_assert(context); SubGhzTestPacket* instance = context; subghz_decoder_princeton_for_testing_parse(instance->decoder, level, duration); } static void subghz_test_packet_rx_pt_callback(SubGhzDecoderPrinceton* parser, void* context) { UNUSED(parser); furi_assert(context); SubGhzTestPacket* instance = context; instance->packet_rx++; } static void subghz_test_packet_rssi_timer_callback(void* context) { furi_assert(context); SubGhzTestPacket* instance = context; with_view_model( instance->view, SubGhzTestPacketModel * model, { if(model->status == SubGhzTestPacketModelStatusRx) { model->rssi = furi_hal_subghz_get_rssi(); model->packets = instance->packet_rx; } else if(model->status == SubGhzTestPacketModelStatusTx) { model->packets = SUBGHZ_TEST_PACKET_COUNT - subghz_encoder_princeton_for_testing_get_repeat_left(instance->encoder); } }, true); } static void subghz_test_packet_draw(Canvas* canvas, SubGhzTestPacketModel* model) { char buffer[64]; canvas_set_color(canvas, ColorBlack); canvas_set_font(canvas, FontPrimary); canvas_draw_str(canvas, 0, 8, "CC1101 Packet Test"); canvas_set_font(canvas, FontSecondary); // Frequency snprintf( buffer, sizeof(buffer), "Freq: %03ld.%03ld.%03ld Hz", model->real_frequency / 1000000 % 1000, model->real_frequency / 1000 % 1000, model->real_frequency % 1000); canvas_draw_str(canvas, 0, 20, buffer); // Path char* path_name = "Unknown"; if(model->path == FuriHalSubGhzPathIsolate) { path_name = "isolate"; } else if(model->path == FuriHalSubGhzPath433) { path_name = "433MHz"; } else if(model->path == FuriHalSubGhzPath315) { path_name = "315MHz"; } else if(model->path == FuriHalSubGhzPath868) { path_name = "868MHz"; } snprintf(buffer, sizeof(buffer), "Path: %d - %s", model->path, path_name); canvas_draw_str(canvas, 0, 31, buffer); snprintf(buffer, sizeof(buffer), "Packets: %zu", model->packets); canvas_draw_str(canvas, 0, 42, buffer); if(model->status == SubGhzTestPacketModelStatusRx) { snprintf( buffer, sizeof(buffer), "RSSI: %ld.%ld dBm", (int32_t)(model->rssi), (int32_t)fabsf(model->rssi * 10.0f) % 10); canvas_draw_str(canvas, 0, 53, buffer); } else { canvas_draw_str(canvas, 0, 53, "TX"); } } static bool subghz_test_packet_input(InputEvent* event, void* context) { furi_assert(context); SubGhzTestPacket* instance = context; if(event->key == InputKeyBack || event->type != InputTypeShort) { return false; } with_view_model( instance->view, SubGhzTestPacketModel * model, { if(model->status == SubGhzTestPacketModelStatusRx) { furi_hal_subghz_stop_async_rx(); } else if(model->status == SubGhzTestPacketModelStatusTx) { subghz_encoder_princeton_for_testing_stop(instance->encoder, furi_get_tick()); furi_hal_subghz_stop_async_tx(); } if(event->key == InputKeyLeft) { if(model->frequency > 0) model->frequency--; } else if(event->key == InputKeyRight) { if(model->frequency < subghz_frequencies_count_testing - 1) model->frequency++; } else if(event->key == InputKeyDown) { if(model->path > 0) model->path--; } else if(event->key == InputKeyUp) { if(model->path < FuriHalSubGhzPath868) model->path++; } else if(event->key == InputKeyOk) { if(model->status == SubGhzTestPacketModelStatusRx) { model->status = SubGhzTestPacketModelStatusTx; } else { model->status = SubGhzTestPacketModelStatusRx; } } model->real_frequency = furi_hal_subghz_set_frequency(subghz_frequencies_testing[model->frequency]); furi_hal_subghz_set_path(model->path); if(model->status == SubGhzTestPacketModelStatusRx) { furi_hal_subghz_start_async_rx(subghz_test_packet_rx_callback, instance); } else { subghz_encoder_princeton_for_testing_set( instance->encoder, 0x00AABBCC, SUBGHZ_TEST_PACKET_COUNT, subghz_frequencies_testing[model->frequency]); if(!furi_hal_subghz_start_async_tx( subghz_encoder_princeton_for_testing_yield, instance->encoder)) { model->status = SubGhzTestPacketModelStatusOnlyRx; instance->callback(SubGhzTestPacketEventOnlyRx, instance->context); } } }, true); return true; } void subghz_test_packet_enter(void* context) { furi_assert(context); SubGhzTestPacket* instance = context; furi_hal_subghz_reset(); furi_hal_subghz_load_custom_preset(subghz_device_cc1101_preset_ook_650khz_async_regs); with_view_model( instance->view, SubGhzTestPacketModel * model, { model->frequency = subghz_frequencies_433_92_testing; model->real_frequency = furi_hal_subghz_set_frequency(subghz_frequencies_testing[model->frequency]); model->path = FuriHalSubGhzPathIsolate; // isolate model->rssi = 0.0f; model->status = SubGhzTestPacketModelStatusRx; }, true); furi_hal_subghz_start_async_rx(subghz_test_packet_rx_callback, instance); furi_timer_start(instance->timer, furi_kernel_get_tick_frequency() / 4); } void subghz_test_packet_exit(void* context) { furi_assert(context); SubGhzTestPacket* instance = context; furi_timer_stop(instance->timer); // Reinitialize IC to default state with_view_model( instance->view, SubGhzTestPacketModel * model, { if(model->status == SubGhzTestPacketModelStatusRx) { furi_hal_subghz_stop_async_rx(); } else if(model->status == SubGhzTestPacketModelStatusTx) { subghz_encoder_princeton_for_testing_stop(instance->encoder, furi_get_tick()); furi_hal_subghz_stop_async_tx(); } }, true); furi_hal_subghz_sleep(); } SubGhzTestPacket* subghz_test_packet_alloc(void) { SubGhzTestPacket* instance = malloc(sizeof(SubGhzTestPacket)); // View allocation and configuration instance->view = view_alloc(); view_allocate_model(instance->view, ViewModelTypeLocking, sizeof(SubGhzTestPacketModel)); view_set_context(instance->view, instance); view_set_draw_callback(instance->view, (ViewDrawCallback)subghz_test_packet_draw); view_set_input_callback(instance->view, subghz_test_packet_input); view_set_enter_callback(instance->view, subghz_test_packet_enter); view_set_exit_callback(instance->view, subghz_test_packet_exit); instance->timer = furi_timer_alloc(subghz_test_packet_rssi_timer_callback, FuriTimerTypePeriodic, instance); instance->decoder = subghz_decoder_princeton_for_testing_alloc(); subghz_decoder_princeton_for_testing_set_callback( instance->decoder, subghz_test_packet_rx_pt_callback, instance); instance->encoder = subghz_encoder_princeton_for_testing_alloc(); return instance; } void subghz_test_packet_free(SubGhzTestPacket* instance) { furi_assert(instance); subghz_decoder_princeton_for_testing_free(instance->decoder); subghz_encoder_princeton_for_testing_free(instance->encoder); furi_timer_free(instance->timer); view_free(instance->view); free(instance); } View* subghz_test_packet_get_view(SubGhzTestPacket* instance) { furi_assert(instance); return instance->view; } ================================================ FILE: applications/debug/subghz_test/views/subghz_test_packet.h ================================================ #pragma once #include typedef enum { SubGhzTestPacketEventOnlyRx, } SubGhzTestPacketEvent; typedef struct SubGhzTestPacket SubGhzTestPacket; typedef void (*SubGhzTestPacketCallback)(SubGhzTestPacketEvent event, void* context); void subghz_test_packet_set_callback( SubGhzTestPacket* subghz_test_packet, SubGhzTestPacketCallback callback, void* context); SubGhzTestPacket* subghz_test_packet_alloc(void); void subghz_test_packet_free(SubGhzTestPacket* subghz_test_packet); View* subghz_test_packet_get_view(SubGhzTestPacket* subghz_test_packet); ================================================ FILE: applications/debug/subghz_test/views/subghz_test_static.c ================================================ #include "subghz_test_static.h" #include "../helpers/subghz_test_frequency.h" #include #include #include #include #include #include "../protocol/princeton_for_testing.h" #define TAG "SubGhzTestStatic" typedef enum { SubGhzTestStaticStatusIDLE, SubGhzTestStaticStatusTX, } SubGhzTestStaticStatus; static const uint32_t subghz_test_static_keys[] = { 0x0074BADE, 0x0074BADD, 0x0074BADB, 0x00E34A4E, }; struct SubGhzTestStatic { View* view; SubGhzTestStaticStatus status_tx; SubGhzEncoderPrinceton* encoder; SubGhzTestStaticCallback callback; void* context; }; typedef struct { uint8_t frequency; uint32_t real_frequency; uint8_t button; } SubGhzTestStaticModel; void subghz_test_static_set_callback( SubGhzTestStatic* subghz_test_static, SubGhzTestStaticCallback callback, void* context) { furi_assert(subghz_test_static); furi_assert(callback); subghz_test_static->callback = callback; subghz_test_static->context = context; } void subghz_test_static_draw(Canvas* canvas, SubGhzTestStaticModel* model) { char buffer[64]; canvas_set_color(canvas, ColorBlack); canvas_set_font(canvas, FontPrimary); canvas_draw_str(canvas, 0, 8, "CC1101 Static"); canvas_set_font(canvas, FontSecondary); // Frequency snprintf( buffer, sizeof(buffer), "Freq: %03ld.%03ld.%03ld Hz", model->real_frequency / 1000000 % 1000, model->real_frequency / 1000 % 1000, model->real_frequency % 1000); canvas_draw_str(canvas, 0, 20, buffer); snprintf(buffer, sizeof(buffer), "Key: %d", model->button); canvas_draw_str(canvas, 0, 31, buffer); } bool subghz_test_static_input(InputEvent* event, void* context) { furi_assert(context); SubGhzTestStatic* instance = context; if(event->key == InputKeyBack) { return false; } with_view_model( instance->view, SubGhzTestStaticModel * model, { if(event->type == InputTypeShort) { if(event->key == InputKeyLeft) { if(model->frequency > 0) model->frequency--; } else if(event->key == InputKeyRight) { if(model->frequency < subghz_frequencies_count_testing - 1) model->frequency++; } else if(event->key == InputKeyDown) { if(model->button > 0) model->button--; } else if(event->key == InputKeyUp) { if(model->button < 3) model->button++; } } model->real_frequency = subghz_frequencies_testing[model->frequency]; if(event->key == InputKeyOk) { NotificationApp* notification = furi_record_open(RECORD_NOTIFICATION); if(event->type == InputTypePress) { furi_hal_subghz_idle(); furi_hal_subghz_set_frequency_and_path( subghz_frequencies_testing[model->frequency]); if(!furi_hal_subghz_tx()) { instance->callback(SubGhzTestStaticEventOnlyRx, instance->context); } else { notification_message_block(notification, &sequence_set_red_255); FURI_LOG_I(TAG, "TX Start"); subghz_encoder_princeton_for_testing_set( instance->encoder, subghz_test_static_keys[model->button], 10000, subghz_frequencies_testing[model->frequency]); furi_hal_subghz_start_async_tx( subghz_encoder_princeton_for_testing_yield, instance->encoder); instance->status_tx = SubGhzTestStaticStatusTX; } } else if(event->type == InputTypeRelease) { if(instance->status_tx == SubGhzTestStaticStatusTX) { FURI_LOG_I(TAG, "TX Stop"); subghz_encoder_princeton_for_testing_stop( instance->encoder, furi_get_tick()); subghz_encoder_princeton_for_testing_print_log(instance->encoder); furi_hal_subghz_stop_async_tx(); notification_message(notification, &sequence_reset_red); } instance->status_tx = SubGhzTestStaticStatusIDLE; } furi_record_close(RECORD_NOTIFICATION); } }, true); return true; } void subghz_test_static_enter(void* context) { furi_assert(context); SubGhzTestStatic* instance = context; furi_hal_subghz_reset(); furi_hal_subghz_load_custom_preset(subghz_device_cc1101_preset_ook_650khz_async_regs); furi_hal_gpio_init(&gpio_cc1101_g0, GpioModeOutputPushPull, GpioPullNo, GpioSpeedLow); furi_hal_gpio_write(&gpio_cc1101_g0, false); instance->status_tx = SubGhzTestStaticStatusIDLE; with_view_model( instance->view, SubGhzTestStaticModel * model, { model->frequency = subghz_frequencies_433_92_testing; model->real_frequency = subghz_frequencies_testing[model->frequency]; model->button = 0; }, true); } void subghz_test_static_exit(void* context) { furi_assert(context); furi_hal_subghz_sleep(); } SubGhzTestStatic* subghz_test_static_alloc(void) { SubGhzTestStatic* instance = malloc(sizeof(SubGhzTestStatic)); // View allocation and configuration instance->view = view_alloc(); view_allocate_model(instance->view, ViewModelTypeLocking, sizeof(SubGhzTestStaticModel)); view_set_context(instance->view, instance); view_set_draw_callback(instance->view, (ViewDrawCallback)subghz_test_static_draw); view_set_input_callback(instance->view, subghz_test_static_input); view_set_enter_callback(instance->view, subghz_test_static_enter); view_set_exit_callback(instance->view, subghz_test_static_exit); instance->encoder = subghz_encoder_princeton_for_testing_alloc(); return instance; } void subghz_test_static_free(SubGhzTestStatic* instance) { furi_assert(instance); subghz_encoder_princeton_for_testing_free(instance->encoder); view_free(instance->view); free(instance); } View* subghz_test_static_get_view(SubGhzTestStatic* instance) { furi_assert(instance); return instance->view; } ================================================ FILE: applications/debug/subghz_test/views/subghz_test_static.h ================================================ #pragma once #include typedef enum { SubGhzTestStaticEventOnlyRx, } SubGhzTestStaticEvent; typedef struct SubGhzTestStatic SubGhzTestStatic; typedef void (*SubGhzTestStaticCallback)(SubGhzTestStaticEvent event, void* context); void subghz_test_static_set_callback( SubGhzTestStatic* subghz_test_static, SubGhzTestStaticCallback callback, void* context); SubGhzTestStatic* subghz_test_static_alloc(void); void subghz_test_static_free(SubGhzTestStatic* subghz_static); View* subghz_test_static_get_view(SubGhzTestStatic* subghz_static); ================================================ FILE: applications/debug/text_box_element_test/application.fam ================================================ App( appid="text_box_element_test", name="Text Box Element Test", apptype=FlipperAppType.DEBUG, entry_point="text_box_element_test_app", requires=["gui"], stack_size=1 * 1024, fap_category="Debug", ) ================================================ FILE: applications/debug/text_box_element_test/text_box_element_test.c ================================================ #include #include #include #include #define TAG "TextBoxTest" static void text_box_center_top_secondary_128x22(Canvas* canvas) { canvas_draw_frame(canvas, 0, 0, 128, 22); elements_text_box(canvas, 0, 0, 128, 22, AlignCenter, AlignTop, "secondary font test", false); } static void text_box_right_bottom_bold_128x22(Canvas* canvas) { canvas_draw_frame(canvas, 0, 0, 128, 22); elements_text_box( canvas, 0, 0, 128, 22, AlignRight, AlignBottom, "\e#Bold font test\e#", false); } static void text_box_left_center_mixed_80x50(Canvas* canvas) { canvas_draw_frame(canvas, 0, 0, 80, 50); elements_text_box( canvas, 0, 0, 80, 50, AlignLeft, AlignCenter, "\e#Never\e# gonna give you up\n\e!Never\e! gonna let you down", false); } static void text_box_center_center_secondary_110x44(Canvas* canvas) { canvas_draw_frame(canvas, 4, 20, 110, 30); elements_text_box( canvas, 4, 20, 110, 30, AlignCenter, AlignCenter, "Loooooooooooooo0000000ooong file name from happy 100500 Flipper 0wners", true); } static void (*text_box_test_render[])(Canvas* canvas) = { text_box_center_top_secondary_128x22, text_box_right_bottom_bold_128x22, text_box_left_center_mixed_80x50, text_box_center_center_secondary_110x44, }; typedef struct { uint32_t idx; FuriMutex* mutex; } TextBoxTestState; static void text_box_test_render_callback(Canvas* canvas, void* ctx) { TextBoxTestState* state = ctx; furi_mutex_acquire(state->mutex, FuriWaitForever); canvas_clear(canvas); text_box_test_render[state->idx](canvas); furi_mutex_release(state->mutex); } static void text_box_test_input_callback(InputEvent* input_event, void* ctx) { FuriMessageQueue* event_queue = ctx; furi_message_queue_put(event_queue, input_event, FuriWaitForever); } int32_t text_box_element_test_app(void* p) { UNUSED(p); FuriMessageQueue* event_queue = furi_message_queue_alloc(32, sizeof(InputEvent)); TextBoxTestState state = {.idx = 0, .mutex = NULL}; state.mutex = furi_mutex_alloc(FuriMutexTypeNormal); ViewPort* view_port = view_port_alloc(); view_port_draw_callback_set(view_port, text_box_test_render_callback, &state); view_port_input_callback_set(view_port, text_box_test_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); uint32_t test_renders_num = COUNT_OF(text_box_test_render); InputEvent event; while(furi_message_queue_get(event_queue, &event, FuriWaitForever) == FuriStatusOk) { furi_mutex_acquire(state.mutex, FuriWaitForever); if(event.type == InputTypeShort) { if(event.key == InputKeyRight) { if(state.idx < test_renders_num - 1) { state.idx++; } } else if(event.key == InputKeyLeft) { if(state.idx > 0) { state.idx--; } } else if(event.key == InputKeyBack) { furi_mutex_release(state.mutex); break; } } furi_mutex_release(state.mutex); view_port_update(view_port); } // remove & free all stuff created by app gui_remove_view_port(gui, view_port); view_port_free(view_port); furi_message_queue_free(event_queue); furi_mutex_free(state.mutex); furi_record_close(RECORD_GUI); return 0; } ================================================ FILE: applications/debug/text_box_view_test/application.fam ================================================ App( appid="text_box_view_test", name="Text Box View Test", apptype=FlipperAppType.DEBUG, entry_point="text_box_view_test_app", requires=["gui"], stack_size=1 * 1024, fap_category="Debug", ) ================================================ FILE: applications/debug/text_box_view_test/text_box_view_test.c ================================================ #include #include #include #include #include #define TAG "TextBoxViewTest" typedef struct { TextBoxFont font; TextBoxFocus focus; const char* text; } TextBoxViewTestContent; static const TextBoxViewTestContent text_box_view_test_content_arr[] = { { .font = TextBoxFontText, .focus = TextBoxFocusStart, .text = "Hello, let's test text box. Press Right and Left to switch content", }, { .font = TextBoxFontText, .focus = TextBoxFocusEnd, .text = "First test to add dynamically lines with EndFocus set\nLine 0", }, { .font = TextBoxFontText, .focus = TextBoxFocusEnd, .text = "First test to add dynamically lines with EndFocus set\nLine 0\nLine 1", }, { .font = TextBoxFontText, .focus = TextBoxFocusEnd, .text = "First test to add dynamically lines with EndFocus set\nLine 0\nLine 1\nLine 2", }, { .font = TextBoxFontText, .focus = TextBoxFocusEnd, .text = "First test to add dynamically lines with EndFocus set\nLine 0\nLine 1\nLine 2\nLine 3", }, { .font = TextBoxFontText, .focus = TextBoxFocusEnd, .text = "First test to add dynamically lines with EndFocus set\nLine 0\nLine 1\nLine 2\nLine 3\nLine 4", }, { .font = TextBoxFontText, .focus = TextBoxFocusStart, .text = "Verify that symbols don't overlap borders: llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllend", }, { .font = TextBoxFontText, .focus = TextBoxFocusStart, .text = "\n\n\n Start from several newline chars. Verify that scrolling doesn't break.\n\n\n\n\nThe end", }, { .font = TextBoxFontText, .focus = TextBoxFocusStart, .text = "Let's test big text.\n\n The ARM Cortex-M is a group of 32-bit RISC ARM processor cores licensed by ARM Limited. These cores are optimized for low-cost and energy-efficient integrated circuits, which have been embedded in tens of billions of consumer devices.[1] Though they are most often the main component of microcontroller chips, sometimes they are embedded inside other types of chips too. The Cortex-M family consists of Cortex-M0,[2] Cortex-M0+,[3] Cortex-M1,[4] Cortex-M3,[5] Cortex-M4,[6] Cortex-M7,[7] Cortex-M23,[8] Cortex-M33,[9] Cortex-M35P,[10] Cortex-M52,[11] Cortex-M55,[12] Cortex-M85.[13] A floating-point unit (FPU) option is available for Cortex-M4 / M7 / M33 / M35P / M52 / M55 / M85 cores, and when included in the silicon these cores are sometimes known as \"Cortex-MxF\", where 'x' is the core variant.\n\nThe ARM Cortex-M family are ARM microprocessor cores that are designed for use in microcontrollers, ASICs, ASSPs, FPGAs, and SoCs. Cortex-M cores are commonly used as dedicated microcontroller chips, but also are hidden inside of SoC chips as power management controllers, I/O controllers, system controllers, touch screen controllers, smart battery controllers, and sensor controllers. The main difference from Cortex-A cores is that Cortex-M cores have no memory management unit (MMU) for virtual memory, considered essential for full-fledged operating systems. Cortex-M programs instead run bare metal or on one of the many real-time operating systems which support a Cortex-M.Though 8-bit microcontrollers were very popular in the past, Cortex-M has slowly been chipping away at the 8-bit market as the prices of low-end Cortex-M chips have moved downward. Cortex-M have become a popular replacements for 8-bit chips in applications that benefit from 32-bit math operations, and replacing older legacy ARM cores such as ARM7 and ARM9.", }, { .font = TextBoxFontText, .focus = TextBoxFocusEnd, .text = "The same but with EndFocus\n\n The ARM Cortex-M is a group of 32-bit RISC ARM processor cores licensed by ARM Limited. These cores are optimized for low-cost and energy-efficient integrated circuits, which have been embedded in tens of billions of consumer devices.[1] Though they are most often the main component of microcontroller chips, sometimes they are embedded inside other types of chips too. The Cortex-M family consists of Cortex-M0,[2] Cortex-M0+,[3] Cortex-M1,[4] Cortex-M3,[5] Cortex-M4,[6] Cortex-M7,[7] Cortex-M23,[8] Cortex-M33,[9] Cortex-M35P,[10] Cortex-M52,[11] Cortex-M55,[12] Cortex-M85.[13] A floating-point unit (FPU) option is available for Cortex-M4 / M7 / M33 / M35P / M52 / M55 / M85 cores, and when included in the silicon these cores are sometimes known as \"Cortex-MxF\", where 'x' is the core variant.\n\nThe ARM Cortex-M family are ARM microprocessor cores that are designed for use in microcontrollers, ASICs, ASSPs, FPGAs, and SoCs. Cortex-M cores are commonly used as dedicated microcontroller chips, but also are hidden inside of SoC chips as power management controllers, I/O controllers, system controllers, touch screen controllers, smart battery controllers, and sensor controllers. The main difference from Cortex-A cores is that Cortex-M cores have no memory management unit (MMU) for virtual memory, considered essential for full-fledged operating systems. Cortex-M programs instead run bare metal or on one of the many real-time operating systems which support a Cortex-M.Though 8-bit microcontrollers were very popular in the past, Cortex-M has slowly been chipping away at the 8-bit market as the prices of low-end Cortex-M chips have moved downward. Cortex-M have become a popular replacements for 8-bit chips in applications that benefit from 32-bit math operations, and replacing older legacy ARM cores such as ARM7 and ARM9.", }, { .font = TextBoxFontHex, .focus = TextBoxFocusEnd, .text = "0000 0000 0000 0000\n1111 1111 1111 1111\n2222 2222 2222 2222\n3333 3333 3333 3333\n4444 4444 4444 4444\n5555 5555 5555 5555\n6666 6666 6666 6666\n7777 7777 7777 7777\n8888 8888 8888 8888\n9999 9999 9999 9999\n0000 0000 0000 0000\n1111 1111 1111 1111\n2222 2222 2222 2222\n3333 3333 3333 3333\n4444 4444 4444 4444\n5555 5555 5555 5555\n6666 6666 6666 6666\n7777 7777 7777 7777\n8888 8888 8888 8888\n9999 9999 9999 9999\n0000 0000 0000 0000\n1111 1111 1111 1111\n2222 2222 2222 2222\n3333 3333 3333 3333\n4444 4444 4444 4444\n5555 5555 5555 5555\n6666 6666 6666 6666\n7777 7777 7777 7777\n8888 8888 8888 8888\n9999 9999 9999 9999\n0000 0000 0000 0000\n1111 1111 1111 1111\n2222 2222 2222 2222\n3333 3333 3333 3333\n4444 4444 4444 4444\n5555 5555 5555 5555\n6666 6666 6666 6666\n7777 7777 7777 7777\n8888 8888 8888 8888\n9999 9999 9999 9999\n0000 0000 0000 0000\n1111 1111 1111 1111\n2222 2222 2222 2222\n3333 3333 3333 3333\n4444 4444 4444 4444\n5555 5555 5555 5555\n6666 6666 6666 6666\n7777 7777 7777 7777\n8888 8888 8888 8888\n9999 9999 9999 9999\n0000 0000 0000 0000\n1111 1111 1111 1111\n2222 2222 2222 2222\n3333 3333 3333 3333\n4444 4444 4444 4444\n5555 5555 5555 5555\n6666 6666 6666 6666\n7777 7777 7777 7777\n8888 8888 8888 8888\n9999 9999 9999 9999\n0000 0000 0000 0000\n1111 1111 1111 1111\n2222 2222 2222 2222\n3333 3333 3333 3333\n4444 4444 4444 4444\n5555 5555 5555 5555\n6666 6666 6666 6666\n7777 7777 7777 7777\n8888 8888 8888 8888\n9999 9999 9999 9999\n0000 0000 0000 0000\n1111 1111 1111 1111\n2222 2222 2222 2222\n3333 3333 3333 3333\n4444 4444 4444 4444\n5555 5555 5555 5555\n6666 6666 6666 6666\n7777 7777 7777 7777\n8888 8888 8888 8888\n9999 9999 9999 9999\n0000 0000 0000 0000\n1111 1111 1111 1111\n2222 2222 2222 2222\n3333 3333 3333 3333\n4444 4444 4444 4444\n5555 5555 5555 5555\n6666 6666 6666 6666\n7777 7777 7777 7777\n8888 8888 8888 8888\n9999 9999 9999 9999\n0000 0000 0000 0000\n1111 1111 1111 1111\n2222 2222 2222 2222\n3333 3333 3333 3333\n4444 4444 4444 4444\n5555 5555 5555 5555\n6666 6666 6666 6666\n7777 7777 7777 7777\n8888 8888 8888 8888\n9999 9999 9999 9999\n0000 0000 0000 0000\n1111 1111 1111 1111\n2222 2222 2222 2222\n3333 3333 3333 3333\n4444 4444 4444 4444\n5555 5555 5555 5555\n6666 6666 6666 6666\n7777 7777 7777 7777\n8888 8888 8888 8888\n9999 9999 9999 9999", }, }; typedef struct { TextBox* text_box; ViewDispatcher* view_dispatcher; size_t current_content_i; } TextBoxViewTest; static void text_box_update_view(TextBoxViewTest* instance) { // Intentional incorrect way to reset text box to verify that state resets if text changes text_box_set_text(instance->text_box, ""); const TextBoxViewTestContent* content = &text_box_view_test_content_arr[instance->current_content_i]; text_box_set_font(instance->text_box, content->font); text_box_set_focus(instance->text_box, content->focus); text_box_set_text(instance->text_box, content->text); } static bool text_box_switch_view_input_callback(InputEvent* event, void* context) { bool consumed = false; TextBoxViewTest* instance = context; size_t contents_cnt = COUNT_OF(text_box_view_test_content_arr); if(event->type == InputTypeShort) { if(event->key == InputKeyRight) { if(instance->current_content_i < contents_cnt - 1) { instance->current_content_i++; text_box_update_view(instance); consumed = true; } } else if(event->key == InputKeyLeft) { if(instance->current_content_i > 0) { instance->current_content_i--; text_box_update_view(instance); consumed = true; } } else if(event->key == InputKeyBack) { view_dispatcher_stop(instance->view_dispatcher); } } return consumed; } int32_t text_box_view_test_app(void* p) { UNUSED(p); Gui* gui = furi_record_open(RECORD_GUI); ViewDispatcher* view_dispatcher = view_dispatcher_alloc(); view_dispatcher_attach_to_gui(view_dispatcher, gui, ViewDispatcherTypeFullscreen); TextBoxViewTest instance = { .text_box = text_box_alloc(), .current_content_i = 0, .view_dispatcher = view_dispatcher, }; text_box_update_view(&instance); View* text_box_switch_view = view_alloc(); view_set_input_callback(text_box_switch_view, text_box_switch_view_input_callback); view_set_context(text_box_switch_view, &instance); ViewStack* view_stack = view_stack_alloc(); view_stack_add_view(view_stack, text_box_switch_view); view_stack_add_view(view_stack, text_box_get_view(instance.text_box)); view_dispatcher_add_view(view_dispatcher, 0, view_stack_get_view(view_stack)); view_dispatcher_switch_to_view(view_dispatcher, 0); view_dispatcher_run(view_dispatcher); view_dispatcher_remove_view(view_dispatcher, 0); view_dispatcher_free(view_dispatcher); view_stack_free(view_stack); view_free(text_box_switch_view); text_box_free(instance.text_box); furi_record_close(RECORD_GUI); return 0; } ================================================ FILE: applications/debug/uart_echo/application.fam ================================================ App( appid="uart_echo", name="UART Echo", apptype=FlipperAppType.DEBUG, entry_point="uart_echo_app", requires=["gui"], stack_size=2 * 1024, fap_category="Debug", ) ================================================ FILE: applications/debug/uart_echo/uart_echo.c ================================================ #include #include #include #include #include #include #include #include #include #define TAG "UartEcho" #define LINES_ON_SCREEN 6 #define COLUMNS_ON_SCREEN 21 #define DEFAULT_BAUD_RATE 230400 #define DEFAULT_DATA_BITS FuriHalSerialDataBits8 #define DEFAULT_PARITY FuriHalSerialParityNone #define DEFAULT_STOP_BITS FuriHalSerialStopBits1 typedef struct UartDumpModel UartDumpModel; typedef struct { Gui* gui; NotificationApp* notification; ViewDispatcher* view_dispatcher; View* view; FuriThread* worker_thread; FuriStreamBuffer* rx_stream; FuriHalSerialHandle* serial_handle; } UartEchoApp; typedef struct { FuriString* text; } ListElement; struct UartDumpModel { ListElement* list[LINES_ON_SCREEN]; uint8_t line; char last_char; bool escape; }; typedef enum { WorkerEventReserved = (1 << 0), // Reserved for StreamBuffer internal event WorkerEventStop = (1 << 1), WorkerEventRxData = (1 << 2), WorkerEventRxIdle = (1 << 3), WorkerEventRxOverrunError = (1 << 4), WorkerEventRxFramingError = (1 << 5), WorkerEventRxNoiseError = (1 << 6), WorkerEventRxParityError = (1 << 7), } WorkerEventFlags; #define WORKER_EVENTS_MASK \ (WorkerEventStop | WorkerEventRxData | WorkerEventRxIdle | WorkerEventRxOverrunError | \ WorkerEventRxFramingError | WorkerEventRxNoiseError | WorkerEventRxParityError) const NotificationSequence sequence_notification = { &message_display_backlight_on, &message_green_255, &message_delay_10, NULL, }; const NotificationSequence sequence_error = { &message_display_backlight_on, &message_red_255, &message_delay_10, NULL, }; static void uart_echo_view_draw_callback(Canvas* canvas, void* _model) { UartDumpModel* model = _model; // Prepare canvas canvas_clear(canvas); canvas_set_color(canvas, ColorBlack); canvas_set_font(canvas, FontKeyboard); for(size_t i = 0; i < LINES_ON_SCREEN; i++) { canvas_draw_str( canvas, 0, (i + 1) * (canvas_current_font_height(canvas) - 1), furi_string_get_cstr(model->list[i]->text)); if(i == model->line) { uint8_t width = canvas_string_width(canvas, furi_string_get_cstr(model->list[i]->text)); canvas_draw_box( canvas, width, (i) * (canvas_current_font_height(canvas) - 1) + 2, 2, canvas_current_font_height(canvas) - 2); } } } static bool uart_echo_view_input_callback(InputEvent* event, void* context) { UNUSED(event); UNUSED(context); return false; } static uint32_t uart_echo_exit(void* context) { UNUSED(context); return VIEW_NONE; } static void uart_echo_on_irq_cb(FuriHalSerialHandle* handle, FuriHalSerialRxEvent event, void* context) { furi_assert(context); UNUSED(handle); UartEchoApp* app = context; volatile FuriHalSerialRxEvent event_copy = event; UNUSED(event_copy); WorkerEventFlags flag = 0; if(event & FuriHalSerialRxEventData) { uint8_t data = furi_hal_serial_async_rx(handle); furi_stream_buffer_send(app->rx_stream, &data, 1, 0); flag |= WorkerEventRxData; } if(event & FuriHalSerialRxEventIdle) { //idle line detected, packet transmission may have ended flag |= WorkerEventRxIdle; } //error detected if(event & FuriHalSerialRxEventFrameError) { flag |= WorkerEventRxFramingError; } if(event & FuriHalSerialRxEventNoiseError) { flag |= WorkerEventRxNoiseError; } if(event & FuriHalSerialRxEventOverrunError) { flag |= WorkerEventRxOverrunError; } if(event & FuriHalSerialRxEventParityError) { flag |= WorkerEventRxParityError; } furi_thread_flags_set(furi_thread_get_id(app->worker_thread), flag); } static void uart_echo_push_to_list(UartDumpModel* model, const char data) { if(model->escape) { // escape code end with letter if((data >= 'a' && data <= 'z') || (data >= 'A' && data <= 'Z')) { model->escape = false; } } else if(data == '[' && model->last_char == '\e') { // "Esc[" is a escape code model->escape = true; } else if((data >= ' ' && data <= '~') || (data == '\n' || data == '\r')) { bool new_string_needed = false; if(furi_string_size(model->list[model->line]->text) >= COLUMNS_ON_SCREEN) { new_string_needed = true; } else if(data == '\n' || data == '\r') { // pack line breaks if(model->last_char != '\n' && model->last_char != '\r') { new_string_needed = true; } } if(new_string_needed) { if((model->line + 1) < LINES_ON_SCREEN) { model->line += 1; } else { ListElement* first = model->list[0]; for(size_t i = 1; i < LINES_ON_SCREEN; i++) { model->list[i - 1] = model->list[i]; } furi_string_reset(first->text); model->list[model->line] = first; } } if(data != '\n' && data != '\r') { furi_string_push_back(model->list[model->line]->text, data); } } model->last_char = data; } static int32_t uart_echo_worker(void* context) { furi_assert(context); UartEchoApp* app = context; while(1) { uint32_t events = furi_thread_flags_wait(WORKER_EVENTS_MASK, FuriFlagWaitAny, FuriWaitForever); furi_check((events & FuriFlagError) == 0); if(events & WorkerEventStop) break; if(events & WorkerEventRxData) { size_t length = 0; do { uint8_t data[64]; length = furi_stream_buffer_receive(app->rx_stream, data, 64, 0); if(length > 0) { furi_hal_serial_tx(app->serial_handle, data, length); with_view_model( app->view, UartDumpModel * model, { for(size_t i = 0; i < length; i++) { uart_echo_push_to_list(model, data[i]); } }, false); } } while(length > 0); notification_message(app->notification, &sequence_notification); with_view_model(app->view, UartDumpModel * model, { UNUSED(model); }, true); } if(events & WorkerEventRxIdle) { furi_hal_serial_tx(app->serial_handle, (uint8_t*)"\r\nDetect IDLE\r\n", 15); } if(events & (WorkerEventRxOverrunError | WorkerEventRxFramingError | WorkerEventRxNoiseError)) { if(events & WorkerEventRxOverrunError) { furi_hal_serial_tx(app->serial_handle, (uint8_t*)"\r\nDetect ORE\r\n", 14); } if(events & WorkerEventRxFramingError) { furi_hal_serial_tx(app->serial_handle, (uint8_t*)"\r\nDetect FE\r\n", 13); } if(events & WorkerEventRxNoiseError) { furi_hal_serial_tx(app->serial_handle, (uint8_t*)"\r\nDetect NE\r\n", 13); } if(events & WorkerEventRxParityError) { furi_hal_serial_tx(app->serial_handle, (uint8_t*)"\r\nDetect PE\r\n", 13); } notification_message(app->notification, &sequence_error); } } return 0; } static UartEchoApp* uart_echo_app_alloc( uint32_t baudrate, FuriHalSerialDataBits data_bits, FuriHalSerialParity parity, FuriHalSerialStopBits stop_bits) { UartEchoApp* app = malloc(sizeof(UartEchoApp)); app->rx_stream = furi_stream_buffer_alloc(2048, 1); // Gui app->gui = furi_record_open(RECORD_GUI); app->notification = furi_record_open(RECORD_NOTIFICATION); // View dispatcher app->view_dispatcher = view_dispatcher_alloc(); view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); // Views app->view = view_alloc(); view_set_draw_callback(app->view, uart_echo_view_draw_callback); view_set_input_callback(app->view, uart_echo_view_input_callback); view_allocate_model(app->view, ViewModelTypeLocking, sizeof(UartDumpModel)); with_view_model( app->view, UartDumpModel * model, { for(size_t i = 0; i < LINES_ON_SCREEN; i++) { model->line = 0; model->escape = false; model->list[i] = malloc(sizeof(ListElement)); model->list[i]->text = furi_string_alloc(); } }, true); view_set_previous_callback(app->view, uart_echo_exit); view_dispatcher_add_view(app->view_dispatcher, 0, app->view); view_dispatcher_switch_to_view(app->view_dispatcher, 0); app->worker_thread = furi_thread_alloc_ex("UsbUartWorker", 1024, uart_echo_worker, app); furi_thread_start(app->worker_thread); // Enable uart listener app->serial_handle = furi_hal_serial_control_acquire(FuriHalSerialIdUsart); furi_check(app->serial_handle); furi_hal_serial_init(app->serial_handle, baudrate); furi_hal_serial_configure_framing(app->serial_handle, data_bits, parity, stop_bits); furi_hal_serial_async_rx_start(app->serial_handle, uart_echo_on_irq_cb, app, true); return app; } static void uart_echo_app_free(UartEchoApp* app) { furi_assert(app); furi_thread_flags_set(furi_thread_get_id(app->worker_thread), WorkerEventStop); furi_thread_join(app->worker_thread); furi_thread_free(app->worker_thread); furi_hal_serial_deinit(app->serial_handle); furi_hal_serial_control_release(app->serial_handle); // Free views view_dispatcher_remove_view(app->view_dispatcher, 0); with_view_model( app->view, UartDumpModel * model, { for(size_t i = 0; i < LINES_ON_SCREEN; i++) { furi_string_free(model->list[i]->text); free(model->list[i]); } }, true); view_free(app->view); view_dispatcher_free(app->view_dispatcher); // Close gui record furi_record_close(RECORD_GUI); furi_record_close(RECORD_NOTIFICATION); app->gui = NULL; furi_stream_buffer_free(app->rx_stream); // Free rest free(app); } // silences "same-assignment" false positives in the arg parser below // -V::1048 int32_t uart_echo_app(void* p) { uint32_t baudrate = DEFAULT_BAUD_RATE; FuriHalSerialDataBits data_bits = DEFAULT_DATA_BITS; FuriHalSerialParity parity = DEFAULT_PARITY; FuriHalSerialStopBits stop_bits = DEFAULT_STOP_BITS; if(p) { // parse argument char* parse_ptr = p; bool parse_success = false; do { if(strint_to_uint32(parse_ptr, &parse_ptr, &baudrate, 10) != StrintParseNoError) break; if(*(parse_ptr++) != '_') break; uint16_t data_bits_int; if(strint_to_uint16(parse_ptr, &parse_ptr, &data_bits_int, 10) != StrintParseNoError) break; if(data_bits_int == 6) data_bits = FuriHalSerialDataBits6; else if(data_bits_int == 7) data_bits = FuriHalSerialDataBits7; else if(data_bits_int == 8) data_bits = FuriHalSerialDataBits8; else if(data_bits_int == 9) data_bits = FuriHalSerialDataBits9; else break; char parity_char = *(parse_ptr++); if(parity_char == 'N') parity = FuriHalSerialParityNone; else if(parity_char == 'E') parity = FuriHalSerialParityEven; else if(parity_char == 'O') parity = FuriHalSerialParityOdd; else break; uint16_t stop_bits_int; if(strint_to_uint16(parse_ptr, &parse_ptr, &stop_bits_int, 10) != StrintParseNoError) break; if(stop_bits_int == 5) stop_bits = FuriHalSerialStopBits0_5; else if(stop_bits_int == 1) stop_bits = FuriHalSerialStopBits1; else if(stop_bits_int == 15) stop_bits = FuriHalSerialStopBits1_5; else if(stop_bits_int == 2) stop_bits = FuriHalSerialStopBits2; else break; parse_success = true; } while(0); if(!parse_success) { FURI_LOG_I( TAG, "Couldn't parse baud rate and framing (%s). Applying defaults (%d_8N1)", (const char*)p, DEFAULT_BAUD_RATE); } } UartEchoApp* app = uart_echo_app_alloc(baudrate, data_bits, parity, stop_bits); view_dispatcher_run(app->view_dispatcher); uart_echo_app_free(app); return 0; } ================================================ FILE: applications/debug/unit_tests/application.fam ================================================ App( appid="unit_tests", apptype=FlipperAppType.STARTUP, entry_point="unit_tests_on_system_start", sources=["unit_tests.c", "test_runner.c", "unit_test_api_table.cpp"], cdefines=["APP_UNIT_TESTS"], requires=["system_settings", "cli_subghz"], provides=["delay_test"], resources="resources", order=30, ) App( appid="delay_test", name="Delay Test", sources=["tests/common/*.c", "tests/rpc/*.c"], apptype=FlipperAppType.SYSTEM, entry_point="delay_test_app", stack_size=1 * 1024, requires=["unit_tests"], order=30, ) App( appid="test_varint", sources=["tests/common/*.c", "tests/varint/*.c"], apptype=FlipperAppType.PLUGIN, entry_point="get_api", requires=["unit_tests"], ) App( appid="test_furi", sources=["tests/common/*.c", "tests/furi/*.c"], apptype=FlipperAppType.PLUGIN, entry_point="get_api", requires=["unit_tests"], ) App( appid="test_furi_hal", sources=["tests/common/*.c", "tests/furi_hal/*.c"], apptype=FlipperAppType.PLUGIN, entry_point="get_api", requires=["unit_tests"], ) App( appid="test_furi_hal_crypto", sources=["tests/common/*.c", "tests/furi_hal_crypto/*.c"], apptype=FlipperAppType.PLUGIN, entry_point="get_api", requires=["unit_tests"], ) App( appid="test_furi_string", sources=["tests/common/*.c", "tests/furi_string/*.c"], apptype=FlipperAppType.PLUGIN, entry_point="get_api", requires=["unit_tests"], ) App( appid="test_storage", sources=["tests/common/*.c", "tests/storage/*.c"], apptype=FlipperAppType.PLUGIN, entry_point="get_api", requires=["unit_tests"], ) App( appid="test_stream", sources=["tests/common/*.c", "tests/stream/*.c"], apptype=FlipperAppType.PLUGIN, entry_point="get_api", requires=["unit_tests"], ) App( appid="test_dirwalk", sources=["tests/common/*.c", "tests/dirwalk/*.c"], apptype=FlipperAppType.PLUGIN, entry_point="get_api", requires=["unit_tests"], ) App( appid="test_manifest", sources=["tests/common/*.c", "tests/manifest/*.c"], apptype=FlipperAppType.PLUGIN, entry_point="get_api", requires=["unit_tests"], ) App( appid="test_flipper_format", sources=["tests/common/*.c", "tests/flipper_format/*.c"], apptype=FlipperAppType.PLUGIN, entry_point="get_api", requires=["unit_tests"], ) App( appid="test_flipper_format_string", sources=["tests/common/*.c", "tests/flipper_format_string/*.c"], apptype=FlipperAppType.PLUGIN, entry_point="get_api", requires=["unit_tests"], ) App( appid="test_rpc", sources=["tests/common/*.c", "tests/rpc/*.c"], apptype=FlipperAppType.PLUGIN, entry_point="get_api", requires=["unit_tests"], ) App( appid="test_subghz", sources=["tests/common/*.c", "tests/subghz/*.c"], apptype=FlipperAppType.PLUGIN, entry_point="get_api", requires=["unit_tests"], ) App( appid="test_infrared", sources=["tests/common/*.c", "tests/infrared/*.c"], apptype=FlipperAppType.PLUGIN, entry_point="get_api", requires=["unit_tests"], fap_libs=["infrared"], ) App( appid="test_nfc", sources=["tests/common/*.c", "tests/nfc/*.c"], apptype=FlipperAppType.PLUGIN, entry_point="get_api", requires=["unit_tests"], ) App( appid="test_power", sources=["tests/common/*.c", "tests/power/*.c"], apptype=FlipperAppType.PLUGIN, entry_point="get_api", requires=["unit_tests"], ) App( appid="test_protocol_dict", sources=["tests/common/*.c", "tests/protocol_dict/*.c"], apptype=FlipperAppType.PLUGIN, entry_point="get_api", requires=["unit_tests"], ) App( appid="test_lfrfid", sources=["tests/common/*.c", "tests/lfrfid/*.c"], apptype=FlipperAppType.PLUGIN, entry_point="get_api", requires=["unit_tests"], ) App( appid="test_bit_lib", sources=["tests/common/*.c", "tests/bit_lib/*.c"], apptype=FlipperAppType.PLUGIN, entry_point="get_api", requires=["unit_tests"], ) App( appid="test_datetime", sources=["tests/common/*.c", "tests/datetime/*.c"], apptype=FlipperAppType.PLUGIN, entry_point="get_api", requires=["unit_tests"], ) App( appid="test_float_tools", sources=["tests/common/*.c", "tests/float_tools/*.c"], apptype=FlipperAppType.PLUGIN, entry_point="get_api", requires=["unit_tests"], ) App( appid="test_bt", sources=["tests/common/*.c", "tests/bt/*.c"], apptype=FlipperAppType.PLUGIN, entry_point="get_api", requires=["unit_tests"], ) App( appid="test_dialogs_file_browser_options", sources=["tests/common/*.c", "tests/dialogs_file_browser_options/*.c"], apptype=FlipperAppType.PLUGIN, entry_point="get_api", requires=["unit_tests"], ) App( appid="test_expansion", sources=["tests/common/*.c", "tests/expansion/*.c"], apptype=FlipperAppType.PLUGIN, entry_point="get_api", requires=["unit_tests"], ) App( appid="test_compress", sources=["tests/common/*.c", "tests/compress/*.c"], apptype=FlipperAppType.PLUGIN, entry_point="get_api", requires=["unit_tests"], ) App( appid="test_js", sources=["tests/common/*.c", "tests/js/*.c"], apptype=FlipperAppType.PLUGIN, entry_point="get_api", requires=["unit_tests", "js_app"], ) App( appid="test_strint", sources=["tests/common/*.c", "tests/strint/*.c"], apptype=FlipperAppType.PLUGIN, entry_point="get_api", requires=["unit_tests"], ) App( appid="test_pipe", sources=["tests/common/*.c", "tests/pipe/*.c"], apptype=FlipperAppType.PLUGIN, entry_point="get_api", requires=["unit_tests"], ) App( appid="test_args", sources=["tests/common/*.c", "tests/args/*.c"], apptype=FlipperAppType.PLUGIN, entry_point="get_api", requires=["unit_tests"], ) App( appid="test_notification", sources=["tests/common/*.c", "tests/notification/*.c"], apptype=FlipperAppType.PLUGIN, entry_point="get_api", requires=["unit_tests"], ) ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/Manifest_test ================================================ V:0 T:1672935435 D:infrared D:nfc D:subghz F:4bff70f2a2ae771f81de5cfb090b3d74:3952:infrared/test_kaseikyo.irtest F:8556d32d7c54e66771d9da78d007d379:21463:infrared/test_nec.irtest F:860c0c475573878842180a6cb50c85c7:2012:infrared/test_nec42.irtest F:2b3cbf3fe7d3642190dfb8362dcc0ed6:3522:infrared/test_nec42ext.irtest F:c74bbd7f885ab8fbc3b3363598041bc1:18976:infrared/test_necext.irtest F:cab5e604abcb233bcb27903baec24462:7460:infrared/test_rc5.irtest F:3d22b3ec2531bb8f4842c9c0c6a8d97c:547:infrared/test_rc5x.irtest F:c9cb9fa4decbdd077741acb845f21343:8608:infrared/test_rc6.irtest F:97de943385bc6ad1c4a58fc4fedb5244:16975:infrared/test_samsung32.irtest F:4eb36c62d4f2e737a3e4a64b5ff0a8e7:41623:infrared/test_sirc.irtest F:e4ec3299cbe1f528fb1b9b45aac53556:4182:nfc/nfc_nfca_signal_long.nfc F:af4d10974834c2703ad29e859eea78c2:1020:nfc/nfc_nfca_signal_short.nfc F:224d12457a26774d8d2aa0d4b3a15652:160:subghz/ansonic.sub F:ce9fc98dc01230387a340332316774f1:13642:subghz/ansonic_raw.sub F:f958927b656d0804036c28b4a31ff856:157:subghz/bett.sub F:b4b17b2603fa3a144dbea4d9ede9f61d:5913:subghz/bett_raw.sub F:370a0c62be967b420da5e60ffcdc078b:157:subghz/came.sub F:0156915c656d8c038c6d555d34349a36:6877:subghz/came_atomo_raw.sub F:111a8b796661f3cbd6f49f756cf91107:8614:subghz/came_raw.sub F:2101b0a5a72c87f9dce77223b2885aa7:162:subghz/came_twee.sub F:c608b78b8e4646eeb94db37644623254:10924:subghz/came_twee_raw.sub F:c4a55acddb68fc3111d592c9292022a8:21703:subghz/cenmax_raw.sub F:51d6bd600345954b9c84a5bc6e999313:159:subghz/clemsa.sub F:14fa0d5931a32674bfb2ddf288f3842b:21499:subghz/clemsa_raw.sub F:f38b6dfa0920199200887b2cd5c0a385:161:subghz/doitrand.sub F:c7e53da8e3588a2c0721aa794699ccd4:24292:subghz/doitrand_raw.sub F:cc73b6f4d05bfe30c67a0d18b63e58d9:159:subghz/doorhan.sub F:22fec89c5cc43504ad4391e61e12c7e0:10457:subghz/doorhan_raw.sub F:3a97d8bd32ddaff42932b4c3033ee2d2:12732:subghz/faac_slh_raw.sub F:06d3226f5330665f48d41c49e34fed15:159:subghz/gate_tx.sub F:8b150a8d38ac7c4f7063ee0d42050399:13827:subghz/gate_tx_raw.sub F:a7904e17b0c18c083ae1acbefc330c7a:159:subghz/holtek.sub F:72bb528255ef1c135cb3f436414897d3:173:subghz/holtek_ht12x.sub F:54ceacb8c156f9534fc7ee0a0911f4da:11380:subghz/holtek_ht12x_raw.sub F:4a9567c1543cf3e7bb5350b635d9076f:31238:subghz/holtek_raw.sub F:ca86c0d78364d704ff62b0698093d396:162:subghz/honeywell_wdb.sub F:f606548c935adc8d8bc804326ef67543:38415:subghz/honeywell_wdb_raw.sub F:20bba4b0aec006ced7e82513f9459e31:15532:subghz/hormann_hsm_raw.sub F:3392f2db6aa7777e937db619b86203bb:10637:subghz/ido_117_111_raw.sub F:cc5c7968527cc233ef11a08986e31bf2:167:subghz/intertechno_v3.sub F:70bceb941739260ab9f6162cfdeb0347:18211:subghz/intertechno_v3_raw.sub F:bc9a4622f3e22fd7f82eb3f26e61f59b:44952:subghz/kia_seed_raw.sub F:6b6e95fc70ea481dc6184d291466d16a:159:subghz/linear.sub F:77aaa9005db54c0357451ced081857b2:14619:subghz/linear_raw.sub F:1a618e21e6ffa9984d465012e704c450:161:subghz/magellan.sub F:bf43cb85d79e20644323d6acad87e028:5808:subghz/magellan_raw.sub F:4ef17320f936ee88e92582a9308b2faa:161:subghz/marantec.sub F:507a8413a1603ad348eea945123fb7cc:21155:subghz/marantec_raw.sub F:22b69dc490d5425488342b5c5a838d55:161:subghz/megacode.sub F:4f8fe9bef8bdd9c52f3f77e829f8986f:6205:subghz/megacode_raw.sub F:b39f62cb108c2fa9916e0a466596ab87:18655:subghz/nero_radio_raw.sub F:d0d70f8183032096805a41e1808c093b:26436:subghz/nero_sketch_raw.sub F:c6999bd0eefd0fccf34820e17bcbc8ba:161:subghz/nice_flo.sub F:9b1200600b9ec2a73166797ff243fbfc:3375:subghz/nice_flo_raw.sub F:b52bafb098282676d1c7163bfb0d6e73:8773:subghz/nice_flor_s_raw.sub F:e4df94dfdee2efadf2ed9a1e9664f8b2:163:subghz/phoenix_v2.sub F:8ec066976df93fba6335b3f6dc47014c:8548:subghz/phoenix_v2_raw.sub F:2b1192e4898aaf274caebbb493b9f96e:164:subghz/power_smart.sub F:8b8195cab1d9022fe38e802383fb923a:3648:subghz/power_smart_raw.sub F:1ccf1289533e0486a1d010d934ad7b06:170:subghz/princeton.sub F:8bccc506a61705ec429aecb879e5d7ce:7344:subghz/princeton_raw.sub F:0bda91d783e464165190c3b3d16666a7:38724:subghz/scher_khan_magic_code.sub F:116d7e1a532a0c9e00ffeee105f7138b:166:subghz/security_pls_1_0.sub F:441fc7fc6fa11ce0068fde3f6145177b:69413:subghz/security_pls_1_0_raw.sub F:e5e33c24c5e55f592ca892b5aa8fa31f:208:subghz/security_pls_2_0.sub F:2614f0aef367042f8623719d765bf2c0:62287:subghz/security_pls_2_0_raw.sub F:8eb533544c4c02986800c90e935184ff:168:subghz/smc5326.sub F:fc67a4fe7e0b3bc81a1c8da8caca7658:4750:subghz/smc5326_raw.sub F:24196a4c4af1eb03404a2ee434c864bf:4096:subghz/somfy_keytis_raw.sub F:6a5ece145a5694e543d99bf1b970baf0:9741:subghz/somfy_telis_raw.sub F:0ad046bfa9ec872e92141a69bbf03d92:382605:subghz/test_random_raw.sub ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/infrared/test_kaseikyo.irtest ================================================ Filetype: IR tests file Version: 1 # name: decoder_input1 type: raw data: 1000000 3363 1685 407 436 411 432 415 1240 434 410 437 1245 439 404 433 1249 435 408 439 431 406 1249 435 435 412 405 442 1241 433 1249 435 408 439 405 442 428 409 434 413 430 407 411 436 433 414 429 408 1248 436 407 440 1243 441 428 409 434 413 431 406 1249 435 1248 436 406 441 1242 442 1240 434 409 438 431 416 428 409 408 439 430 407 411 436 407 440 429 408 436 411 432 415 402 435 1247 437 1245 439 1243 441 1238 436 # name: decoder_expected1 type: parsed_array count: 1 # protocol: Kaseikyo address: 41 54 32 00 command: 1B 00 00 00 repeat: false # name: decoder_input2 type: raw data: 1000000 3365 1683 409 434 413 431 406 1276 408 435 412 1270 414 429 408 1248 436 434 413 430 407 1275 409 434 413 431 406 1276 408 1248 436 433 414 430 407 437 410 433 414 429 408 436 411 432 415 428 409 1246 438 432 415 1267 407 437 410 433 414 429 408 436 411 432 415 1266 408 1250 434 1248 436 432 415 429 408 435 412 432 415 428 409 434 413 430 407 437 410 433 414 429 408 436 411 432 415 428 409 435 412 1240 434 # name: decoder_expected2 type: parsed_array count: 1 # protocol: Kaseikyo address: 41 54 32 00 command: 1C 00 00 00 repeat: false # name: decoder_input3 type: raw data: 1000000 3361 1661 442 427 410 434 413 1243 441 428 409 1247 437 432 415 1241 433 410 437 407 440 1242 432 437 410 407 440 1242 442 1241 433 436 411 407 440 430 407 436 411 406 441 402 435 435 412 431 416 1240 434 410 437 1245 439 404 433 411 436 407 440 403 434 436 411 432 415 429 408 1249 435 1247 437 1245 439 430 407 1250 434 434 413 404 433 438 409 434 413 1243 441 1241 433 410 437 1245 439 430 407 1250 434 432 415 # name: decoder_expected3 type: parsed_array count: 1 # protocol: Kaseikyo address: 41 54 32 00 command: 70 01 00 00 repeat: false # name: decoder_input4 type: raw data: 1000000 3365 1656 436 406 441 402 435 1248 436 406 441 1242 432 410 437 1246 438 404 433 410 437 1246 438 404 433 437 410 1245 491 1190 442 401 436 435 412 431 416 427 410 433 414 429 408 435 412 431 416 1240 434 435 412 1244 440 1241 433 436 411 433 414 402 435 409 438 405 442 402 435 1247 437 1244 440 1241 433 437 410 1245 439 430 407 410 437 406 441 402 435 409 438 1243 441 402 435 1247 437 406 441 1240 434 433 414 # name: decoder_expected4 type: parsed_array count: 1 # protocol: Kaseikyo address: 43 54 32 00 command: 70 01 00 00 repeat: false # name: decoder_input5 type: raw data: 1000000 3357 1665 438 431 416 428 409 1247 437 432 415 1241 433 436 411 1245 439 430 407 436 411 1245 439 430 407 437 410 1246 438 1243 441 428 409 436 411 432 415 428 409 435 412 431 416 427 410 434 413 1243 441 427 410 1247 437 1245 439 430 407 437 410 1246 438 1244 440 429 408 1250 434 1248 488 355 440 429 408 436 411 432 415 428 408 435 412 431 416 428 409 1247 437 432 415 428 409 1248 436 1246 490 1191 441 1240 434 # name: decoder_expected5 type: parsed_array count: 1 # protocol: Kaseikyo address: 43 54 32 00 command: 1B 00 00 00 repeat: false # name: decoder_input6 type: raw data: 1000000 3358 1664 439 430 407 437 410 1245 439 430 407 1250 434 434 413 1243 441 428 409 435 412 1244 440 428 409 435 412 1244 440 1242 432 437 410 434 413 430 407 436 411 432 415 428 409 435 412 431 416 1240 434 435 412 1244 440 1242 442 427 410 434 413 1243 441 427 409 1247 437 433 414 429 408 436 411 432 415 428 409 435 412 431 416 427 410 434 413 1243 441 1240 486 357 438 432 415 1240 434 436 411 432 415 425 412 # name: decoder_expected6 type: parsed_array count: 1 # protocol: Kaseikyo address: 43 54 32 00 command: 05 00 00 00 repeat: false # name: encoder_decoder_input1 type: parsed_array count: 4 # protocol: Kaseikyo address: 41 54 32 00 command: 1B 00 00 00 repeat: false # protocol: Kaseikyo address: 41 54 32 00 command: 70 01 00 00 repeat: false # protocol: Kaseikyo address: 43 54 32 00 command: 05 00 00 00 repeat: false # protocol: Kaseikyo address: 43 54 32 00 command: 1B 00 00 00 repeat: false # ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/infrared/test_nec.irtest ================================================ Filetype: IR tests file Version: 1 # name: decoder_input1 type: raw data: 2640671 9071 4445 601 497 578 500 604 501 603 502 581 496 615 498 606 499 584 493 610 1630 576 1640 601 1615 605 1638 581 1634 606 1610 610 1633 577 1639 601 504 580 498 604 501 603 500 582 496 607 498 606 499 585 485 610 1633 576 1640 596 1615 605 1638 582 1634 605 1610 609 1634 586 1630 600 40015 9077 2208 593 1457713 9076 4440 607 508 585 493 610 494 598 506 577 501 603 502 601 504 580 498 605 1638 582 1634 606 1610 610 1633 577 1639 600 1616 605 1638 582 1634 606 499 585 493 609 495 608 496 586 502 612 493 601 504 579 498 605 1638 582 1633 606 1610 610 1633 577 1639 602 1614 574 1668 582 1634 606 1415838 9080 4436 611 494 600 505 578 500 608 501 602 502 580 498 606 508 605 500 583 1633 608 1608 611 1631 578 1638 602 1614 606 1637 583 1633 607 1609 611 494 600 505 570 500 604 501 602 502 581 497 606 499 605 499 583 1633 617 1608 611 1631 579 1638 602 # name: decoder_expected1 type: parsed_array count: 3 # protocol: NEC address: 00 00 00 00 command: 00 00 00 00 repeat: false # protocol: NEC address: 00 00 00 00 command: 00 00 00 00 repeat: true # protocol: NEC address: 00 00 00 00 command: 00 00 00 00 repeat: false # name: decoder_input2 type: raw data: 18372093 9030 4495 559 524 585 526 613 496 560 522 595 524 605 504 553 530 578 524 608 1614 581 1668 557 1665 581 1641 585 1664 551 1671 605 1616 578 1670 555 528 581 1668 553 526 582 528 612 498 559 524 585 526 604 507 552 1670 597 504 553 1667 608 1613 582 1667 559 1663 613 1608 586 1662 552 40067 9026 2219 579 3060767 9079 4445 606 505 554 530 578 532 608 502 555 528 581 530 610 500 588 495 614 1635 580 1641 604 1617 618 1621 584 1637 608 1612 612 1636 589 1637 602 507 581 1641 605 505 582 501 609 502 607 503 585 498 611 499 609 1612 613 498 612 1610 615 1633 561 1661 606 1615 609 1639 585 1636 610 40011 9072 2200 588 96480 9075 2198 560 96509 9047 2226 552 96517 9049 2224 555 96514 9042 2222 556 96512 9053 2220 558 96511 9045 2227 561 96507 9048 2225 554 96515 9061 2231 565 96522 9053 2219 559 96510 9044 2229 560 96508 9046 2226 562 96506 9027 2245 553 96511 9030 2243 555 96513 9031 2237 557 96512 9054 2219 559 570349 9027 4495 608 476 583 529 580 529 558 525 584 527 582 528 560 523 596 524 584 1636 578 1669 555 1667 578 1643 581 1666 558 1663 582 1639 586 1662 552 531 577 1670 554 1667 578 532 563 527 582 528 580 529 558 525 584 1665 561 523 586 525 584 1637 577 1670 554 1668 578 1642 582 1667 558 40062 9021 2233 585 172411 9020 4502 559 524 585 526 583 527 551 532 586 523 575 535 553 530 579 532 577 1643 581 1668 557 1664 581 1639 585 1664 552 1670 575 1637 579 1669 556 527 581 529 580 1642 584 536 581 528 560 523 585 524 584 526 552 1670 576 1645 579 530 578 1643 582 1667 558 1663 582 1639 586 1662 545 40068 9026 2220 578 226896 9054 4468 578 500 608 502 607 503 585 498 611 500 610 501 588 496 612 497 602 1610 615 1633 581 1640 606 1616 609 1639 585 1635 610 1612 614 1635 580 504 615 495 604 506 582 1639 606 503 585 499 610 501 609 502 587 1635 610 1610 614 1634 581 502 616 1632 582 1648 606 1615 610 1638 587 40033 9050 2195 614 249594 9020 4502 560 524 594 525 603 506 552 532 587 521 606 504 554 529 579 532 609 1612 582 1667 557 1654 612 1608 585 1663 552 1670 606 1615 579 1669 554 527 582 529 611 500 558 1663 612 497 560 523 585 524 598 505 552 1670 606 1614 580 1668 557 526 582 1665 558 1662 603 1618 587 1661 553 40067 9058 2187 621 97567 9054 4467 584 500 609 501 601 502 586 497 611 499 610 501 588 496 614 497 612 1609 615 1632 582 1640 606 1615 609 1639 586 1636 611 1611 614 1634 581 503 608 493 605 505 583 1639 607 503 586 498 611 500 609 501 588 1634 611 1609 615 1634 582 502 608 1641 553 1668 608 1613 581 1668 558 112307 9078 4443 608 502 606 504 584 498 610 501 608 502 587 497 612 498 610 499 589 1633 603 1619 607 1642 583 1638 607 1614 611 1638 597 1634 611 1610 615 495 603 506 581 502 607 1642 584 500 609 501 607 503 585 498 611 1637 588 1634 611 1610 615 495 603 1618 607 1641 584 1638 607 1605 611 112281 9076 4445 606 505 584 499 610 501 608 502 586 497 612 498 610 500 581 494 614 1635 581 1641 604 1617 608 1640 585 1637 609 1610 613 1636 589 1632 603 507 581 503 607 504 604 1617 608 502 607 503 585 498 611 500 609 1613 613 1636 590 1632 603 507 581 1641 605 1616 609 1640 585 1636 609 94207 9075 4446 605 506 582 501 607 502 606 504 584 500 610 501 608 502 587 497 611 1636 588 1633 612 1610 616 1633 583 1639 604 1615 610 1638 587 1635 610 500 588 495 606 496 602 1619 616 495 605 506 583 501 609 502 606 1614 610 1638 587 1635 611 499 590 1632 603 1618 607 1641 583 1638 608 103762 9076 4446 605 505 553 531 579 532 607 503 555 528 580 530 609 500 557 527 583 1666 559 1662 603 1609 587 1661 553 1669 608 1614 580 1659 557 1665 612 498 580 504 585 526 604 1617 607 503 606 504 584 499 610 500 609 1613 612 1636 588 1633 602 507 573 1641 605 1617 608 1640 585 1636 619 76134 9056 4466 585 525 604 506 552 532 577 533 606 504 553 529 579 531 608 501 556 1665 611 1611 584 1665 561 1661 605 1616 578 1671 555 1667 609 1612 582 528 611 499 559 525 584 1664 551 533 586 524 605 505 553 530 578 1670 555 1667 610 1612 582 528 611 1610 584 1664 551 1671 606 1616 578 112997 9073 4447 603 507 560 523 586 524 605 505 552 531 578 533 607 503 555 529 580 1668 548 1665 611 1611 584 1665 551 1671 615 1616 578 1670 555 1667 610 501 556 527 582 528 611 1609 584 518 604 506 551 533 586 524 606 1615 579 1669 555 1666 610 500 558 1664 612 1609 585 1663 551 1670 606 84870 9053 4470 582 529 611 500 559 525 583 526 602 507 560 523 586 525 574 536 543 1669 608 1614 580 1668 556 1665 620 1610 585 1664 550 1671 605 1616 578 533 608 503 555 529 580 1677 557 526 582 528 612 498 559 525 585 1664 551 1671 605 1615 578 531 608 1614 581 1668 558 1664 611 1609 585 76184 9025 4496 555 529 579 531 609 502 556 528 582 529 610 500 559 525 583 526 603 1619 586 1663 552 1669 606 1614 580 1668 556 1665 611 1610 584 1664 550 533 586 524 605 504 553 1669 608 503 555 529 580 530 609 501 557 1664 605 1609 585 1664 551 532 586 1661 553 1668 608 1614 581 1666 558 96145 9073 4449 612 499 559 524 584 526 603 506 552 532 587 523 606 504 584 499 570 1669 556 1666 610 1611 614 1634 580 1641 605 1617 608 1640 584 1636 609 501 587 497 612 498 611 1611 615 496 602 508 580 503 595 535 614 1627 617 1650 594 1646 604 502 586 1635 611 1618 614 1634 581 1641 604 86183 9080 4442 610 501 607 502 586 498 611 499 610 501 588 496 613 497 611 498 579 1642 604 1617 608 1641 583 1637 608 1613 611 1637 588 1634 611 1608 615 494 604 506 582 501 617 1641 584 499 610 493 608 502 586 497 612 1636 588 1633 602 1619 615 494 604 1617 608 1640 585 1637 608 1613 613 234570 9078 4437 607 503 606 505 584 500 608 501 614 502 585 497 611 499 610 509 588 1634 612 1609 616 1633 582 1639 606 1616 610 1639 587 1635 610 1611 614 1634 581 503 606 504 604 1617 608 502 607 503 585 498 611 500 609 501 597 1634 611 1610 615 495 603 1618 607 1642 584 1638 607 1614 611 112281 9076 4446 605 505 583 501 609 493 606 503 585 498 610 500 609 501 587 497 613 1636 579 1643 602 1618 606 1641 583 1639 607 1614 610 1638 554 1665 611 1611 584 526 603 507 551 1671 597 504 583 500 578 532 607 502 555 528 581 1668 556 1664 611 498 559 1663 604 1618 587 1662 553 1668 608 130332 9076 4446 615 496 605 507 582 502 608 503 605 512 584 499 609 501 608 502 586 1636 610 1611 613 1635 579 1641 604 1617 608 1641 584 1637 608 1613 611 1636 588 495 614 497 613 1609 616 494 604 506 590 500 608 502 607 503 585 1635 609 1613 612 498 610 1610 614 1634 581 1641 604 1617 608 886079 9020 4501 560 523 585 525 583 527 552 532 587 523 576 534 554 529 580 531 577 1644 582 1667 559 1663 582 1639 586 1663 553 1669 576 1645 581 1668 557 521 582 529 581 530 559 1663 582 527 551 532 587 523 575 535 553 1669 577 1644 581 1667 557 526 584 1665 560 1662 582 1637 588 1661 554 76188 9053 4469 583 528 560 523 586 524 585 525 552 531 578 533 576 534 554 528 581 1668 557 1665 581 1631 585 1664 551 1670 575 1646 579 1678 555 1666 579 531 558 1664 581 528 559 1662 584 527 552 532 588 523 575 535 553 1668 578 532 556 1666 580 531 567 1663 582 1639 585 1662 552 1670 575 76165 9054 4468 583 527 581 529 559 524 585 525 583 526 547 531 587 524 576 535 554 1668 577 1644 581 1667 558 1664 582 1640 586 1663 551 1670 576 1645 579 531 578 533 556 527 582 1666 559 525 583 526 582 528 560 523 586 1663 553 1669 576 1645 580 522 578 1642 582 1666 559 1663 582 1639 586 40034 9049 2224 585 114557 9051 4471 581 529 558 525 584 527 582 528 561 522 586 524 585 525 552 531 578 1670 555 1667 579 1643 577 1666 559 1662 583 1638 587 1662 563 1678 587 543 565 537 591 539 589 1651 592 537 591 539 569 533 595 535 593 1647 597 1670 563 1678 587 542 565 1675 589 1651 593 1675 569 1671 593 40045 9047 2225 553 114589 9029 4492 559 525 585 526 582 528 550 533 586 524 575 535 553 530 578 532 577 1645 581 1668 557 1664 581 1640 585 1664 552 1670 575 1646 579 1669 556 527 582 529 580 531 557 1663 582 528 560 523 586 524 585 525 552 1669 576 1645 580 1668 556 526 582 1667 559 1663 582 1639 593 1662 553 40067 9026 4495 556 528 581 529 579 531 557 526 575 527 581 528 561 523 585 525 584 1638 588 1661 554 1667 578 1644 582 1667 559 1663 582 1639 586 1663 552 530 578 1671 555 529 581 1668 556 526 582 529 581 529 559 524 584 1664 550 533 587 1662 553 530 578 1669 555 1667 578 1642 582 1668 559 58109 9049 4473 578 533 576 534 555 529 580 531 578 532 556 527 582 528 580 529 559 1663 583 1639 586 1662 553 1669 580 1644 581 1668 558 1664 581 1640 582 525 584 527 552 531 588 1670 554 529 579 531 578 532 556 527 582 1666 558 1663 582 1639 587 524 584 1636 578 1671 564 1676 588 1652 592 263241 9028 4503 557 526 582 528 581 529 559 523 594 526 584 527 552 532 588 527 575 1646 579 1670 556 1666 579 1642 583 1665 560 1662 584 1638 578 1671 554 529 580 1669 559 527 582 1667 559 525 584 526 582 528 560 523 586 1662 552 530 578 1671 555 529 580 1668 556 1665 581 1640 584 1664 551 40069 9025 2221 588 # name: decoder_expected2 type: parsed_array count: 52 # protocol: NEC address: 00 00 00 00 command: 02 00 00 00 repeat: false # protocol: NEC address: 00 00 00 00 command: 02 00 00 00 repeat: true # protocol: NEC address: 00 00 00 00 command: 02 00 00 00 repeat: false # protocol: NEC address: 00 00 00 00 command: 02 00 00 00 repeat: true # protocol: NEC address: 00 00 00 00 command: 02 00 00 00 repeat: true # protocol: NEC address: 00 00 00 00 command: 02 00 00 00 repeat: true # protocol: NEC address: 00 00 00 00 command: 02 00 00 00 repeat: true # protocol: NEC address: 00 00 00 00 command: 02 00 00 00 repeat: true # protocol: NEC address: 00 00 00 00 command: 02 00 00 00 repeat: true # protocol: NEC address: 00 00 00 00 command: 02 00 00 00 repeat: true # protocol: NEC address: 00 00 00 00 command: 02 00 00 00 repeat: true # protocol: NEC address: 00 00 00 00 command: 02 00 00 00 repeat: true # protocol: NEC address: 00 00 00 00 command: 02 00 00 00 repeat: true # protocol: NEC address: 00 00 00 00 command: 02 00 00 00 repeat: true # protocol: NEC address: 00 00 00 00 command: 02 00 00 00 repeat: true # protocol: NEC address: 00 00 00 00 command: 02 00 00 00 repeat: true # protocol: NEC address: 00 00 00 00 command: 02 00 00 00 repeat: true # protocol: NEC address: 00 00 00 00 command: 02 00 00 00 repeat: true # protocol: NEC address: 00 00 00 00 command: 02 00 00 00 repeat: true # protocol: NEC address: 00 00 00 00 command: 06 00 00 00 repeat: false # protocol: NEC address: 00 00 00 00 command: 06 00 00 00 repeat: true # protocol: NEC address: 00 00 00 00 command: 04 00 00 00 repeat: false # protocol: NEC address: 00 00 00 00 command: 04 00 00 00 repeat: true # protocol: NEC address: 00 00 00 00 command: 08 00 00 00 repeat: false # protocol: NEC address: 00 00 00 00 command: 08 00 00 00 repeat: true # protocol: NEC address: 00 00 00 00 command: 08 00 00 00 repeat: false # protocol: NEC address: 00 00 00 00 command: 08 00 00 00 repeat: true # protocol: NEC address: 00 00 00 00 command: 08 00 00 00 repeat: false # protocol: NEC address: 00 00 00 00 command: 08 00 00 00 repeat: false # protocol: NEC address: 00 00 00 00 command: 08 00 00 00 repeat: false # protocol: NEC address: 00 00 00 00 command: 08 00 00 00 repeat: false # protocol: NEC address: 00 00 00 00 command: 08 00 00 00 repeat: false # protocol: NEC address: 00 00 00 00 command: 08 00 00 00 repeat: false # protocol: NEC address: 00 00 00 00 command: 08 00 00 00 repeat: false # protocol: NEC address: 00 00 00 00 command: 08 00 00 00 repeat: false # protocol: NEC address: 00 00 00 00 command: 08 00 00 00 repeat: false # protocol: NEC address: 00 00 00 00 command: 08 00 00 00 repeat: false # protocol: NEC address: 00 00 00 00 command: 08 00 00 00 repeat: false # protocol: NEC address: 00 00 00 00 command: 09 00 00 00 repeat: false # protocol: NEC address: 00 00 00 00 command: 09 00 00 00 repeat: false # protocol: NEC address: 00 00 00 00 command: 09 00 00 00 repeat: false # protocol: NEC address: 00 00 00 00 command: 08 00 00 00 repeat: false # protocol: NEC address: 00 00 00 00 command: 0A 00 00 00 repeat: false # protocol: NEC address: 00 00 00 00 command: 08 00 00 00 repeat: false # protocol: NEC address: 00 00 00 00 command: 08 00 00 00 repeat: true # protocol: NEC address: 00 00 00 00 command: 08 00 00 00 repeat: false # protocol: NEC address: 00 00 00 00 command: 08 00 00 00 repeat: true # protocol: NEC address: 00 00 00 00 command: 08 00 00 00 repeat: false # protocol: NEC address: 00 00 00 00 command: 0A 00 00 00 repeat: false # protocol: NEC address: 00 00 00 00 command: 08 00 00 00 repeat: false # protocol: NEC address: 00 00 00 00 command: 0A 00 00 00 repeat: false # protocol: NEC address: 00 00 00 00 command: 0A 00 00 00 repeat: true # name: decoder_input3 type: raw data: 200000 8862 4452 562 563 559 1681 563 1646 567 586 556 569 563 583 559 571 561 1675 559 565 567 1673 561 561 561 592 561 565 567 579 563 567 565 584 558 1652 561 592 561 561 561 1679 565 560 562 584 558 1659 564 585 557 566 566 1675 559 1649 564 589 564 1649 564 1668 566 565 567 1669 565 43470 8896 4432 561 561 561 1679 565 1648 565 581 561 568 564 586 567 558 564 1676 558 564 558 1681 563 563 559 587 566 565 567 582 561 564 558 595 558 1650 563 590 563 563 559 1674 560 570 562 587 566 1645 568 586 556 565 567 1672 562 1651 562 584 558 1658 566 1671 563 561 561 1679 565 200000 8881 4383 569 549 573 548 574 541 571 550 572 547 575 539 573 551 571 1651 573 545 567 554 568 548 574 1652 572 547 575 1645 568 1661 573 545 567 1657 567 554 568 547 575 1652 572 547 575 539 573 1657 567 550 572 545 577 1651 573 1648 576 545 567 1659 575 1645 568 555 567 1657 567 38995 8883 4369 573 543 569 552 570 549 573 541 571 553 569 548 574 543 569 1658 566 550 572 548 574 546 566 1653 571 553 569 1654 570 1654 570 551 571 1651 573 547 575 545 567 1653 571 552 570 547 575 1649 564 556 566 550 572 1655 569 1656 568 546 566 1664 570 1653 571 547 565 1663 571 200000 8987 4504 561 593 539 589 533 596 515 586 536 592 540 588 534 595 517 1713 541 1664 570 1686 558 596 515 587 535 593 539 1691 543 1689 565 588 513 1691 563 1668 617 1613 641 1615 567 587 535 593 519 610 512 590 542 1714 510 593 539 1691 563 591 510 1720 535 594 518 584 538 591 541 39546 8990 4501 565 590 542 586 536 593 508 593 539 589 543 585 537 592 509 1720 545 1660 615 1642 561 567 534 594 538 590 542 1688 535 1696 558 595 517 1687 567 1664 621 1635 619 1611 561 594 538 590 511 617 515 586 536 1721 513 589 543 1687 568 587 514 1691 563 590 511 591 541 587 535 200000 8986 4505 560 594 538 590 542 586 515 586 536 593 539 589 533 595 517 1714 540 587 535 594 518 1713 542 586 515 587 535 1722 543 1662 562 592 540 1664 570 585 537 591 541 1689 545 584 538 590 542 1688 536 593 539 589 512 590 542 586 536 1720 514 588 544 585 537 591 541 587 514 40671 8986 4505 560 594 538 590 542 586 515 587 535 593 539 589 533 595 516 1714 541 587 535 594 518 1712 542 586 515 587 535 1722 543 1662 561 592 540 1664 570 585 537 591 541 1689 545 584 538 590 542 1688 536 593 539 589 512 590 542 586 536 1720 514 588 544 585 537 591 541 587 514 200000 8990 4500 566 1692 562 1668 566 588 534 594 518 584 538 591 541 587 535 1669 565 589 543 1688 536 592 540 1691 563 1667 567 1664 621 1635 568 586 515 587 535 593 539 589 543 1662 562 592 540 588 534 594 518 585 537 591 541 587 514 587 535 594 538 590 542 586 515 586 536 593 539 39544 8993 4498 567 1690 564 1666 568 586 536 593 508 593 539 589 543 585 537 1668 566 588 544 1687 537 591 541 1690 564 1666 568 1663 561 1696 569 585 516 586 536 593 539 589 543 1661 562 592 540 588 534 594 517 584 538 591 541 587 514 587 535 593 539 589 543 585 516 586 536 592 540 200000 8894 4456 589 1676 589 571 582 574 589 571 582 1683 582 1677 588 1682 583 574 589 568 585 1682 583 1678 587 1680 585 574 589 565 588 575 588 1675 590 567 586 1681 584 571 582 1685 590 568 585 569 584 1685 590 567 586 1678 587 574 589 1672 582 578 585 1679 586 1674 591 572 591 1672 582 39632 8912 4464 560 1703 562 598 565 594 559 594 559 1711 564 1698 567 1697 568 593 560 595 568 1698 567 1698 567 1693 561 602 561 596 567 590 563 1704 561 594 559 1707 568 591 562 1697 568 596 567 590 563 1700 565 596 567 1693 561 599 564 1701 564 589 564 1706 559 1704 561 597 566 1700 565 200000 9018 4500 565 1666 568 1689 565 588 513 1691 615 1616 618 1639 564 1667 567 587 535 594 538 563 538 590 542 586 536 593 508 593 539 589 543 1688 535 592 540 588 544 585 537 591 510 1694 560 1670 564 1693 562 1669 565 1692 542 1689 565 588 534 595 517 585 537 591 541 587 535 568 544 584 538 591 541 1663 560 1696 569 1662 562 1695 539 1692 614 1616 566 1691 563 1667 567 23184 9012 4505 560 1697 537 1693 561 593 508 1696 569 1662 562 1695 560 1671 563 591 541 587 535 594 518 584 538 590 542 586 515 613 509 593 539 1692 542 585 537 592 540 588 534 594 518 1687 567 1663 560 1697 568 1662 562 1695 539 1692 563 591 541 587 514 588 544 584 538 590 542 586 515 587 535 593 539 1666 568 1689 565 1665 569 1688 536 1695 570 1661 562 1694 561 1670 564 200000 8835 4446 537 562 539 562 539 1663 540 1667 536 1669 534 560 531 573 539 559 532 1672 531 570 531 564 537 563 538 561 540 1660 533 1677 536 561 540 557 534 567 534 1668 535 1672 531 1675 538 555 536 1674 539 1665 538 1666 537 1671 532 563 538 1669 534 566 535 558 533 1677 536 562 539 558 533 568 533 1668 535 566 535 1670 533 1667 536 568 533 1671 532 1672 531 1676 537 22779 8870 4437 535 92592 8861 4414 538 # name: decoder_expected3 type: parsed_array count: 15 # protocol: NECext address: 86 02 00 00 command: 49 B6 00 00 repeat: false # protocol: NECext address: 86 02 00 00 command: 49 B6 00 00 repeat: false # protocol: NECext address: 80 68 00 00 command: 49 B6 00 00 repeat: false # protocol: NECext address: 80 68 00 00 command: 49 B6 00 00 repeat: false # protocol: NECext address: 80 63 00 00 command: 0F 15 00 00 repeat: false # protocol: NECext address: 80 63 00 00 command: 0F 15 00 00 repeat: false # protocol: NECext address: 80 64 00 00 command: 49 08 00 00 repeat: false # protocol: NECext address: 80 64 00 00 command: 49 08 00 00 repeat: false # protocol: NECext address: 83 7A 00 00 command: 08 00 00 00 repeat: false # protocol: NECext address: 83 7A 00 00 command: 08 00 00 00 repeat: false # protocol: NEC address: 71 00 00 00 command: 4A 00 00 00 repeat: false # protocol: NEC address: 71 00 00 00 command: 4A 00 00 00 repeat: false # protocol: NEC42 address: 7B 00 00 00 command: 00 00 00 00 repeat: false # protocol: NEC42 address: 7B 00 00 00 command: 00 00 00 00 repeat: false # protocol: NEC42 address: 1C 01 00 00 command: 12 00 00 00 repeat: false # name: encoder_decoder_input1 type: parsed_array count: 26 # protocol: NEC address: 00 00 00 00 command: 00 00 00 00 repeat: false # protocol: NEC address: 01 00 00 00 command: 00 00 00 00 repeat: false # protocol: NEC address: 01 00 00 00 command: 80 00 00 00 repeat: false # protocol: NEC address: 00 00 00 00 command: 80 00 00 00 repeat: false # protocol: NEC address: 00 00 00 00 command: 00 00 00 00 repeat: false # protocol: NEC address: 00 00 00 00 command: 00 00 00 00 repeat: true # protocol: NEC address: 00 00 00 00 command: 00 00 00 00 repeat: false # protocol: NEC address: 00 00 00 00 command: 00 00 00 00 repeat: true # protocol: NEC address: FF 00 00 00 command: FF 00 00 00 repeat: false # protocol: NEC address: FE 00 00 00 command: FF 00 00 00 repeat: false # protocol: NEC address: FE 00 00 00 command: 7F 00 00 00 repeat: false # protocol: NEC address: FF 00 00 00 command: 7F 00 00 00 repeat: false # protocol: NEC address: FF 00 00 00 command: FF 00 00 00 repeat: false # protocol: NEC address: FF 00 00 00 command: FF 00 00 00 repeat: true # protocol: NEC address: AA 00 00 00 command: 55 00 00 00 repeat: false # protocol: NEC address: 55 00 00 00 command: AA 00 00 00 repeat: false # protocol: NEC address: 55 00 00 00 command: 55 00 00 00 repeat: false # protocol: NEC address: AA 00 00 00 command: AA 00 00 00 repeat: false # protocol: NEC address: AA 00 00 00 command: AA 00 00 00 repeat: true # protocol: NEC address: AA 00 00 00 command: AA 00 00 00 repeat: false # protocol: NEC address: AA 00 00 00 command: AA 00 00 00 repeat: true # protocol: NEC address: AA 00 00 00 command: AA 00 00 00 repeat: true # protocol: NEC address: 55 00 00 00 command: 55 00 00 00 repeat: false # protocol: NEC address: 55 00 00 00 command: 55 00 00 00 repeat: true # protocol: NEC address: 55 00 00 00 command: 55 00 00 00 repeat: true # protocol: NEC address: 55 00 00 00 command: 55 00 00 00 repeat: true # ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/infrared/test_nec42.irtest ================================================ Filetype: IR tests file Version: 1 # name: encoder_decoder_input1 type: parsed_array count: 26 # protocol: NEC42 address: 00 00 00 00 command: 00 00 00 00 repeat: false # protocol: NEC42 address: 01 00 00 00 command: 00 00 00 00 repeat: false # protocol: NEC42 address: 01 00 00 00 command: 80 00 00 00 repeat: false # protocol: NEC42 address: 00 00 00 00 command: 80 00 00 00 repeat: false # protocol: NEC42 address: 00 00 00 00 command: 00 00 00 00 repeat: false # protocol: NEC42 address: 00 00 00 00 command: 00 00 00 00 repeat: true # protocol: NEC42 address: 00 00 00 00 command: 00 00 00 00 repeat: false # protocol: NEC42 address: 00 00 00 00 command: 00 00 00 00 repeat: true # protocol: NEC42 address: FF 1F 00 00 command: FF 00 00 00 repeat: false # protocol: NEC42 address: FE 1F 00 00 command: FF 00 00 00 repeat: false # protocol: NEC42 address: FE 1F 00 00 command: 7F 00 00 00 repeat: false # protocol: NEC42 address: FF 1F 00 00 command: 7F 00 00 00 repeat: false # protocol: NEC42 address: FF 1F 00 00 command: FF 00 00 00 repeat: false # protocol: NEC42 address: FF 1F 00 00 command: FF 00 00 00 repeat: true # protocol: NEC42 address: AA 0A 00 00 command: 55 00 00 00 repeat: false # protocol: NEC42 address: 55 15 00 00 command: AA 00 00 00 repeat: false # protocol: NEC42 address: 55 15 00 00 command: 55 00 00 00 repeat: false # protocol: NEC42 address: AA 0A 00 00 command: AA 00 00 00 repeat: false # protocol: NEC42 address: AA 0A 00 00 command: AA 00 00 00 repeat: true # protocol: NEC42 address: AA 0A 00 00 command: AA 00 00 00 repeat: false # protocol: NEC42 address: AA 0A 00 00 command: AA 00 00 00 repeat: true # protocol: NEC42 address: AA 0A 00 00 command: AA 00 00 00 repeat: true # protocol: NEC42 address: 55 15 00 00 command: 55 00 00 00 repeat: false # protocol: NEC42 address: 55 15 00 00 command: 55 00 00 00 repeat: true # protocol: NEC42 address: 55 15 00 00 command: 55 00 00 00 repeat: true # protocol: NEC42 address: 55 15 00 00 command: 55 00 00 00 repeat: true # ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/infrared/test_nec42ext.irtest ================================================ Filetype: IR tests file Version: 1 # name: decoder_input1 type: raw data: 2000000 9000 4500 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 # name: decoder_expected1 type: parsed_array count: 1 # protocol: NEC42ext address: 00 00 00 00 command: 00 00 00 00 repeat: false # name: decoder_input2 type: raw data: 2000000 9000 4500 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 2000000 9000 4500 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 560 10000 560 # name: decoder_expected2 type: parsed_array count: 1 # protocol: NEC42ext address: 00 00 00 00 command: 00 00 00 00 repeat: false # name: encoder_decoder_input1 type: parsed_array count: 26 # protocol: NEC42ext address: 00 00 00 00 command: 00 00 00 00 repeat: false # protocol: NEC42ext address: 01 00 00 00 command: 00 00 00 00 repeat: false # protocol: NEC42ext address: 01 00 00 00 command: 00 80 00 00 repeat: false # protocol: NEC42ext address: 00 00 00 00 command: 00 80 00 00 repeat: false # protocol: NEC42ext address: 00 00 00 00 command: 00 00 00 00 repeat: false # protocol: NEC42ext address: 00 00 00 00 command: 00 00 00 00 repeat: true # protocol: NEC42ext address: 00 00 00 00 command: 00 00 00 00 repeat: false # protocol: NEC42ext address: 00 00 00 00 command: 00 00 00 00 repeat: true # protocol: NEC42ext address: FF 00 F0 03 command: 0F F0 00 00 repeat: false # protocol: NEC42ext address: FE 00 F0 03 command: 0F F0 00 00 repeat: false # protocol: NEC42ext address: FE 00 F0 03 command: 0F 70 00 00 repeat: false # protocol: NEC42ext address: FF 00 F0 03 command: 0F 70 00 00 repeat: false # protocol: NEC42ext address: FF 00 F0 03 command: 0F F0 00 00 repeat: false # protocol: NEC42ext address: FF 00 F0 03 command: 0F F0 00 00 repeat: true # protocol: NEC42ext address: AA AA AA 02 command: 55 55 00 00 repeat: false # protocol: NEC42ext address: 55 55 55 01 command: AA AA 00 00 repeat: false # protocol: NEC42ext address: 55 55 55 01 command: 55 55 00 00 repeat: false # protocol: NEC42ext address: AA AA AA 02 command: AA AA 00 00 repeat: false # protocol: NEC42ext address: AA AA AA 02 command: AA AA 00 00 repeat: true # protocol: NEC42ext address: AA AA AA 02 command: AA AA 00 00 repeat: false # protocol: NEC42ext address: AA AA AA 02 command: AA AA 00 00 repeat: true # protocol: NEC42ext address: AA AA AA 02 command: AA AA 00 00 repeat: true # protocol: NEC42ext address: 55 55 55 01 command: 55 55 00 00 repeat: false # protocol: NEC42ext address: 55 55 55 01 command: 55 55 00 00 repeat: true # protocol: NEC42ext address: 55 55 55 01 command: 55 55 00 00 repeat: true # protocol: NEC42ext address: 55 55 55 01 command: 55 55 00 00 repeat: true # ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/infrared/test_necext.irtest ================================================ Filetype: IR tests file Version: 1 # name: decoder_input1 type: raw data: 1915384 8967 4463 587 527 590 524 584 1647 590 524 583 531 586 527 590 524 583 1646 589 1640 586 527 590 524 583 1647 590 1640 587 1644 582 1647 589 524 583 531 586 1644 593 521 586 527 589 1641 586 528 589 525 592 521 585 1644 592 522 585 1645 592 1638 589 524 592 1637 588 1641 585 1645 592 41082 8965 2220 591 409594 8972 4458 591 523 584 530 587 1642 584 529 588 526 591 522 583 530 587 1643 584 1646 590 523 584 530 587 1643 584 1647 590 1640 586 1643 583 531 586 527 589 1641 586 528 589 524 593 1637 589 524 593 521 586 529 589 1641 585 528 589 1640 586 1644 592 521 585 1645 592 1638 588 1641 585 41088 8968 2218 582 95791 8971 2214 587 95787 8965 2220 591 95783 8971 2215 585 95787 8964 2221 590 95783 8971 2215 586 95788 8965 2220 591 95783 8969 2216 585 95789 8965 2220 590 95782 8970 2215 586 95788 9047 2139 591 95782 8970 2216 585 95788 8966 2220 591 95782 8972 2214 588 95786 8964 2222 590 95784 8971 2214 586 95787 8967 2218 583 95791 8964 2222 588 95785 8969 2217 584 333740 8967 4464 586 528 590 524 592 1637 589 525 592 521 586 528 589 525 593 1637 588 1640 585 528 589 525 592 1638 589 1641 586 1644 592 1638 588 525 592 522 585 1644 592 522 585 528 588 1642 585 529 588 526 591 522 585 1645 591 522 584 1646 591 1639 587 526 591 1639 588 1642 583 1646 590 41082 8963 2223 588 95785 8967 2219 591 95782 8968 2217 584 246369 8972 4459 591 523 583 530 587 1643 583 530 587 527 590 523 584 530 586 1643 583 1647 590 524 583 530 586 1643 583 1646 589 1641 586 1644 583 531 586 528 589 1640 585 528 588 525 592 1638 588 525 592 522 585 529 589 1641 584 529 588 1642 585 1645 591 522 585 1645 590 1639 587 1642 584 41090 8966 2220 591 95782 8966 2220 592 95782 8967 2218 583 165604 9017 4413 586 527 590 524 583 1647 589 523 582 531 586 528 589 525 593 1637 589 1640 585 527 588 525 592 1638 589 1641 585 1644 592 1638 588 525 591 523 585 1645 591 522 584 529 588 1642 584 530 587 527 591 523 584 1646 591 523 584 1646 591 1640 586 527 590 1640 586 1643 583 1646 589 41084 8972 2214 587 95787 8967 2219 581 95792 8971 2215 586 208929 9016 4414 584 529 588 526 591 1638 588 525 591 522 584 529 587 526 591 1639 587 1642 584 529 588 526 591 1638 587 1643 584 1646 591 1639 587 526 590 523 584 1646 590 524 583 530 587 1643 583 530 587 527 590 524 583 1647 590 524 583 1647 590 1640 586 527 589 1640 586 1644 592 1637 589 41085 8972 2214 587 95787 8964 2221 590 95784 8965 2221 590 167378 8969 4460 589 525 582 532 586 1644 592 521 586 528 589 524 592 522 585 1645 592 1638 589 525 592 522 585 1644 591 1639 588 1642 585 1645 591 522 585 529 587 1641 584 530 587 526 591 1639 588 526 591 522 584 530 587 1643 584 530 587 1642 584 1646 591 523 584 1647 590 1640 587 1643 583 41090 9017 2169 591 95781 8969 2216 585 95788 8964 2223 588 192781 8969 4461 589 525 592 522 586 1644 592 521 586 528 589 525 592 522 585 1644 592 1638 589 524 592 521 586 1645 591 1638 588 1642 585 1645 590 522 584 530 587 1642 584 530 587 526 591 1639 588 526 590 524 583 530 587 1643 584 530 587 1643 584 1646 590 524 583 1646 590 1640 587 1643 583 41090 8967 2219 591 95782 8970 2215 586 95788 8963 2222 589 179978 8967 4464 586 528 589 524 593 1637 588 525 592 522 585 529 589 525 592 1638 589 1641 585 529 588 526 591 1638 588 1641 585 1645 590 1639 587 527 590 523 584 1646 591 523 584 530 587 1643 583 530 586 527 590 524 583 1646 590 523 584 1646 589 1640 586 528 589 1640 586 1644 593 1638 589 41084 8971 2214 587 95787 8964 2221 589 95785 8966 2219 592 196616 8967 4463 585 527 590 525 592 1637 589 525 592 521 586 528 589 524 592 1638 588 1641 585 528 589 525 592 1637 589 1641 585 1645 591 1638 588 526 591 522 585 1645 591 522 584 530 587 1642 584 529 588 526 591 523 583 1645 590 523 584 1646 590 1639 587 527 590 1639 586 1644 583 1647 589 41084 8971 2214 587 95787 8964 2222 589 2112164 8969 4462 588 525 592 522 585 1645 591 523 584 529 588 526 591 523 584 1645 591 1639 587 527 590 524 583 1646 590 1639 587 1643 584 1673 563 524 583 531 586 1643 593 521 586 528 589 1641 585 528 589 525 592 521 585 1644 592 522 584 1645 591 1639 588 526 591 1639 588 1642 583 1646 590 41082 8962 2223 588 95785 8965 2220 591 95783 8968 2217 583 164778 8969 4462 588 525 591 522 585 1645 591 522 585 530 587 527 591 523 584 1646 591 1639 588 526 591 523 583 1646 590 1639 587 1643 584 1672 564 523 584 531 586 1643 583 530 587 527 590 1639 587 527 589 524 583 531 586 1644 583 531 586 1643 583 1647 590 525 582 1647 589 1639 586 1644 593 41081 8965 2220 590 95784 8968 2217 583 95790 8970 2215 586 161053 8963 4468 592 521 586 528 589 1641 585 529 588 526 591 522 585 529 588 1642 585 1645 591 523 584 530 587 1642 584 1646 591 1639 586 1669 557 531 586 527 590 1640 586 527 590 525 592 1638 589 525 592 522 585 528 588 1641 585 528 588 1642 584 1645 591 523 584 1645 591 1639 587 1643 583 41090 8964 2221 590 95784 8963 2222 589 95785 8965 2220 590 139334 8968 4463 587 527 590 523 584 1646 590 523 583 531 586 527 589 524 583 1647 590 1640 586 527 590 525 592 1637 589 1641 585 1644 592 1665 562 524 591 522 584 1645 591 523 584 529 588 1642 584 529 587 527 590 523 584 1646 590 523 584 1646 590 1639 587 527 589 1640 586 1644 592 1637 589 41085 8970 2217 584 95789 8972 2213 586 95787 8965 2221 590 141444 8969 4461 589 525 592 522 584 1644 591 522 585 529 588 526 591 522 585 1645 592 1638 587 526 591 523 584 1646 591 1639 588 1642 583 1672 564 523 584 530 587 1643 584 530 587 527 590 1640 587 527 590 524 584 530 587 1643 584 530 586 1644 583 1647 589 524 583 1647 590 1640 586 1645 592 41081 8964 2222 589 95784 8968 2218 583 95790 8971 2214 586 154119 8969 4462 588 526 591 522 585 1645 592 522 585 529 589 526 591 522 584 1646 591 1639 588 526 591 523 583 1645 590 1639 587 1642 584 1671 564 523 584 529 587 1643 583 530 587 527 590 1639 587 526 590 523 583 530 586 1643 583 529 586 1643 583 1646 590 524 583 1648 589 1641 586 1644 592 41081 8965 2220 590 95784 8969 2216 585 95790 8964 2221 590 147134 8966 4464 586 528 589 525 593 1637 589 524 593 522 585 529 589 525 592 1638 589 1641 586 528 589 525 591 1638 588 1641 585 1645 592 1664 561 525 592 523 584 1646 591 523 584 530 588 1642 585 526 587 527 590 523 584 1646 591 523 584 1646 591 1639 586 526 590 1640 587 1643 583 1646 590 41083 8963 2223 587 95786 8965 2221 590 95784 8968 2217 584 158330 8965 4465 585 529 588 526 590 1639 587 526 590 523 584 530 586 526 590 1639 587 1643 583 530 587 527 590 1639 587 1643 584 1647 590 1666 561 527 589 523 583 1646 590 523 583 531 586 1643 583 530 586 527 590 524 582 1646 590 525 582 1647 589 1640 586 528 589 1640 586 1644 592 1638 589 41085 8971 2214 586 95787 8962 2223 588 95786 8965 2222 589 206063 8962 4467 591 521 585 529 588 1642 585 529 588 525 591 522 584 530 587 1642 584 1646 591 523 584 529 588 1642 583 1646 590 1640 587 1668 558 530 587 526 589 1639 586 528 589 524 583 1647 589 524 593 521 585 528 589 1641 585 529 589 1641 585 1645 592 522 585 1644 591 1639 587 1642 584 41090 8965 2221 590 95784 8963 2223 588 95785 8964 2222 589 183026 8970 4460 590 524 583 531 586 1643 583 530 587 528 589 525 592 522 586 1644 592 1637 588 525 591 522 585 1645 592 1638 588 1641 585 1672 565 522 584 530 588 1642 584 529 588 526 591 1639 587 527 590 523 584 530 587 1642 584 530 587 1642 583 1647 590 524 583 1647 590 1640 587 1643 582 41090 8965 2221 590 95783 8970 2216 584 95789 8962 2223 587 184104 8964 4467 583 530 587 527 590 1640 587 527 590 523 582 531 586 528 589 1640 586 1644 593 521 586 528 589 1640 585 1644 592 1638 589 1667 558 528 589 526 591 1638 588 526 591 522 585 1645 591 522 585 530 587 527 591 1639 587 526 591 1639 587 1642 584 530 587 1643 583 1646 590 1639 587 41087 9020 2166 584 95790 8972 2213 587 95787 8963 2222 589 169833 8964 4465 583 529 587 527 590 1639 587 527 591 523 584 530 586 527 590 1640 587 1643 583 531 587 527 590 1640 586 1644 583 1647 590 1666 560 527 590 524 582 1647 589 525 592 521 586 1644 592 521 586 528 589 526 592 1638 588 525 592 1638 589 1641 585 528 589 1641 585 1645 591 1638 588 41086 8971 2215 585 95789 8964 2222 588 95785 8967 2218 583 185701 8971 4460 590 523 584 530 587 1642 584 530 587 527 590 524 583 531 586 1644 583 1647 590 524 592 521 585 1644 592 1638 589 1641 585 1671 565 522 586 529 588 1642 585 529 588 526 591 1638 588 525 590 523 584 530 587 1642 584 530 587 1642 584 1646 590 524 583 1646 590 1640 586 1643 583 41091 8965 2222 589 95784 8965 2221 589 95784 8968 2217 583 146332 8969 4461 669 445 591 522 584 1644 591 523 584 529 588 526 591 522 585 1645 591 1638 587 527 590 524 584 1646 590 1639 587 1642 583 1673 564 524 583 531 586 1643 583 531 586 528 589 1641 585 528 589 525 592 522 585 1644 591 521 585 1645 592 1638 588 525 592 1638 588 1641 584 1646 591 41083 8963 2222 589 95785 8966 2220 592 261924 8965 4465 585 529 588 525 592 1638 588 525 592 523 584 530 587 526 591 1639 587 1642 583 529 587 527 590 1639 587 1643 584 1646 590 # name: decoder_expected1 type: parsed_array count: 108 # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: false # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: false # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: false # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: false # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: false # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: false # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: false # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: false # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: false # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: false # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: false # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: false # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: false # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: false # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: false # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: false # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: false # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: false # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: false # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: false # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: false # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: false # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: false # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: false # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # protocol: NECext address: 84 79 00 00 command: 12 ED 00 00 repeat: true # name: encoder_decoder_input1 type: parsed_array count: 26 protocol: NECext address: 00 00 00 00 command: 00 00 00 00 repeat: false # protocol: NECext address: 01 00 00 00 command: 00 00 00 00 repeat: false # protocol: NECext address: 01 00 00 00 command: 00 80 00 00 repeat: false # protocol: NECext address: 00 00 00 00 command: 00 80 00 00 repeat: false # protocol: NECext address: 00 00 00 00 command: 00 00 00 00 repeat: false # protocol: NECext address: 00 00 00 00 command: 00 00 00 00 repeat: true # protocol: NECext address: 00 00 00 00 command: 00 00 00 00 repeat: false # protocol: NECext address: 00 00 00 00 command: 00 00 00 00 repeat: true # protocol: NECext address: FF FF 00 00 command: FF FF 00 00 repeat: false # protocol: NECext address: FE FF 00 00 command: FF FF 00 00 repeat: false # protocol: NECext address: FE FF 00 00 command: FF 7F 00 00 repeat: false # protocol: NECext address: FF FF 00 00 command: FF 7F 00 00 repeat: false # protocol: NECext address: FF FF 00 00 command: FF FF 00 00 repeat: false # protocol: NECext address: FF FF 00 00 command: FF FF 00 00 repeat: true # protocol: NECext address: AA AA 00 00 command: 55 55 00 00 repeat: false # protocol: NECext address: 55 55 00 00 command: AA AA 00 00 repeat: false # protocol: NECext address: 55 55 00 00 command: 55 55 00 00 repeat: false # protocol: NECext address: AA AA 00 00 command: AA AA 00 00 repeat: false # protocol: NECext address: AA AA 00 00 command: AA AA 00 00 repeat: true # protocol: NECext address: AA AA 00 00 command: AA AA 00 00 repeat: false # protocol: NECext address: AA AA 00 00 command: AA AA 00 00 repeat: true # protocol: NECext address: AA AA 00 00 command: AA AA 00 00 repeat: true # protocol: NECext address: 55 55 00 00 command: 55 55 00 00 repeat: false # protocol: NECext address: 55 55 00 00 command: 55 55 00 00 repeat: true # protocol: NECext address: 55 55 00 00 command: 55 55 00 00 repeat: true # protocol: NECext address: 55 55 00 00 command: 55 55 00 00 repeat: true # ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/infrared/test_pioneer.irtest ================================================ Filetype: IR tests file Version: 1 # name: decoder_input1 type: raw data: 25557 8437 4188 571 1538 595 1514 567 1542 570 1539 573 501 565 1544 568 506 571 1539 573 501 565 509 568 508 569 506 571 1538 574 501 565 1543 569 506 571 504 573 1536 566 1544 568 506 592 1517 574 1535 567 507 570 505 572 1537 575 500 566 508 600 1509 572 503 574 501 565 1544 568 1540 593 # name: decoder_expected1 type: parsed_array count: 1 # protocol: Pioneer address: AF 00 00 00 command: 36 00 00 00 repeat: false # name: decoder_input2 type: raw data: 25609 8444 4152 564 1568 544 1565 547 1561 541 1568 544 530 547 1536 566 510 567 1567 545 529 548 526 540 535 542 508 569 1539 573 527 539 1543 569 506 571 504 573 1561 541 508 569 507 570 1538 564 1545 567 507 570 505 572 1537 565 509 568 1541 571 1538 564 511 566 509 568 1539 573 1537 596 # name: decoder_expected2 type: parsed_array count: 1 # protocol: Pioneer address: AF 00 00 00 command: 32 00 00 00 repeat: false # name: decoder_input3 type: raw data: 25582 8448 4176 571 1537 565 1544 568 1540 572 1537 575 500 566 1542 570 505 572 1537 575 500 566 508 569 506 571 504 573 1536 565 510 567 1542 570 504 573 1536 566 1543 569 506 571 504 573 1536 566 1543 569 506 571 504 573 502 575 500 566 1542 570 1539 573 502 575 500 566 1542 570 1540 572 # name: decoder_expected3 type: parsed_array count: 1 # protocol: Pioneer address: AF 00 00 00 command: 33 00 00 00 repeat: false # name: decoder_input4 type: raw data: 25594 8443 4181 568 1542 570 505 572 1538 564 1545 567 508 569 1540 572 504 573 1536 566 510 567 1542 571 505 572 504 573 1562 540 510 567 1543 570 506 571 504 573 503 574 501 565 510 567 509 568 507 570 1539 573 502 565 1545 568 1542 571 1539 573 1536 566 1544 569 1541 572 503 574 1537 565 # name: decoder_expected4 type: parsed_array count: 1 # protocol: Pioneer address: AD 00 00 00 command: 40 00 00 00 repeat: false # name: decoder_input5 type: raw data: 25556 8475 4150 597 1512 600 476 601 1509 603 1506 595 480 597 1512 600 476 601 1508 594 482 595 1515 597 478 599 477 600 1510 602 473 604 1506 595 480 597 1513 599 476 601 475 602 474 603 472 594 482 595 1514 598 477 600 476 601 1508 594 1516 596 1513 599 1510 602 1507 595 480 597 1513 599 # name: decoder_expected5 type: parsed_array count: 1 # protocol: Pioneer address: AD 00 00 00 command: 41 00 00 00 repeat: false # name: decoder_input6 type: raw data: 25567 8471 4155 604 1506 596 480 597 1513 599 1510 603 473 594 1515 597 478 599 1511 602 474 603 1507 595 480 597 479 598 1511 602 474 603 1506 596 480 597 478 599 1511 602 474 603 472 594 481 596 479 598 1512 601 474 603 1506 596 479 598 1511 602 1508 594 1515 598 1512 600 475 602 1507 595 # name: decoder_expected6 type: parsed_array count: 1 # protocol: Pioneer address: AD 00 00 00 command: 42 00 00 00 repeat: false # name: decoder_input7 type: raw data: 25584 8444 4180 569 1541 572 504 573 1536 566 1544 569 507 570 1539 574 501 566 1569 596 455 570 1540 573 502 575 501 565 1544 569 507 570 1565 548 503 574 1535 567 1543 570 506 571 529 548 502 565 511 566 1543 601 475 571 504 573 503 574 1536 566 1543 570 1539 574 1536 566 509 568 1541 572 # name: decoder_expected7 type: parsed_array count: 1 # protocol: Pioneer address: AD 00 00 00 command: 43 00 00 00 repeat: false # name: decoder_input8 type: raw data: 25562 8445 4181 568 1543 570 505 572 1538 575 1535 567 508 569 1539 573 503 595 1514 567 508 600 1509 572 503 595 481 596 1513 568 507 601 1508 573 502 575 501 566 1543 570 506 571 504 573 1536 566 510 567 508 600 475 571 1539 573 502 575 1534 568 1542 571 505 572 1537 575 1534 568 1542 571 # name: decoder_expected8 type: parsed_array count: 1 # protocol: Pioneer address: AD 00 00 00 command: 12 00 00 00 repeat: false # name: decoder_input9 type: raw data: 25558 8470 4152 597 1513 600 476 601 1508 594 1515 598 478 599 1509 593 483 594 1515 598 478 599 1510 603 474 592 482 595 1514 599 477 600 1509 593 483 594 481 596 1513 600 476 601 1508 594 1515 598 478 599 476 601 474 593 1517 596 479 598 1512 601 474 603 472 594 1515 598 1511 602 1508 594 # name: decoder_expected9 type: parsed_array count: 1 # protocol: Pioneer address: AD 00 00 00 command: 1A 00 00 00 repeat: false # name: decoder_input10 type: raw data: 25587 8442 4179 601 1507 595 481 565 1544 600 1509 593 482 595 1513 568 507 570 1539 594 481 565 1544 600 476 570 505 593 1516 597 479 598 1511 591 484 593 481 575 1534 600 476 570 1539 595 480 597 478 599 476 570 505 593 1517 564 511 597 1511 602 474 572 1537 597 1513 600 1509 572 1537 565 # name: decoder_expected10 type: parsed_array count: 1 # protocol: Pioneer address: AD 00 00 00 command: 0A 00 00 00 repeat: false # name: decoder_input11 type: raw data: 25554 8474 4149 600 1510 603 472 594 1515 597 1512 601 475 602 1507 595 480 597 1513 599 475 602 1508 594 481 596 479 598 1512 601 474 603 1506 596 479 598 1512 601 1508 594 481 596 1513 599 476 601 474 603 472 594 481 596 480 597 478 599 1510 603 473 593 1515 597 1512 601 1509 603 1506 596 # name: decoder_expected11 type: parsed_array count: 1 # protocol: Pioneer address: AD 00 00 00 command: 0B 00 00 00 repeat: false # name: encoder_decoder_input1 type: parsed_array count: 11 # protocol: Pioneer address: AF 00 00 00 command: 36 00 00 00 repeat: false # protocol: Pioneer address: AF 00 00 00 command: 32 00 00 00 repeat: false # protocol: Pioneer address: AF 00 00 00 command: 33 00 00 00 repeat: false # protocol: Pioneer address: AD 00 00 00 command: 40 00 00 00 repeat: false # protocol: Pioneer address: AD 00 00 00 command: 41 00 00 00 repeat: false # protocol: Pioneer address: AD 00 00 00 command: 42 00 00 00 repeat: false # protocol: Pioneer address: AD 00 00 00 command: 43 00 00 00 repeat: false # protocol: Pioneer address: AD 00 00 00 command: 12 00 00 00 repeat: false # protocol: Pioneer address: AD 00 00 00 command: 1A 00 00 00 repeat: false # protocol: Pioneer address: AD 00 00 00 command: 0A 00 00 00 repeat: false # protocol: Pioneer address: AD 00 00 00 command: 0B 00 00 00 repeat: false # ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/infrared/test_rc5.irtest ================================================ Filetype: IR tests file Version: 1 # name: decoder_input1 type: raw data: 27888 888 888 1776 1776 1776 888 888 1776 888 888 1776 1776 1776 888 888 888 888 888 888 # name: decoder_expected1 type: parsed_array count: 1 # protocol: RC5 address: 13 00 00 00 command: 10 00 00 00 repeat: false # name: decoder_input2 type: raw data: 27888 888 888 888 888 888 888 1776 888 888 1776 888 888 1776 1776 1776 888 888 888 888 888 888 # name: decoder_expected2 type: parsed_array count: 1 # protocol: RC5 address: 13 00 00 00 command: 10 00 00 00 repeat: false # name: decoder_input3 type: raw data: 27888 888 888 1776 1776 1776 888 888 1776 888 888 1776 1776 1776 888 888 888 888 1776 888 # name: decoder_expected3 type: parsed_array count: 1 # protocol: RC5 address: 13 00 00 00 command: 11 00 00 00 repeat: false # name: decoder_input4 type: raw data: 27888 888 888 888 888 888 888 1776 888 888 1776 888 888 1776 1776 1776 888 888 888 888 1776 888 # name: decoder_expected4 type: parsed_array count: 1 # protocol: RC5 address: 13 00 00 00 command: 11 00 00 00 repeat: false # name: decoder_input5 type: raw data: 27888 888 888 1776 1776 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 # name: decoder_expected5 type: parsed_array count: 1 # protocol: RC5 address: 1F 00 00 00 command: 3F 00 00 00 repeat: false # name: decoder_input6 type: raw data: 27888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 # name: decoder_expected6 type: parsed_array count: 1 # protocol: RC5 address: 1F 00 00 00 command: 3F 00 00 00 repeat: false # name: decoder_input7 type: raw data: 27888 888 888 1776 1776 1776 888 888 1776 888 888 1776 1776 1776 888 888 888 888 1776 888 27888 888 888 888 888 888 888 1776 888 888 1776 888 888 1776 1776 1776 888 888 888 888 1776 888 27888 888 888 888 888 888 888 1776 888 888 1776 888 888 1776 1776 1776 888 888 888 888 1776 888 27888 888 888 888 888 888 888 1776 888 888 1776 888 888 1776 1776 1776 888 888 888 888 1776 888 27888 888 888 1776 1776 1776 888 888 1776 888 888 1776 1776 1776 888 888 888 888 1776 888 27888 888 888 888 888 888 888 1776 888 888 1776 888 888 1776 1776 1776 888 888 888 888 888 888 27888 888 888 1776 1776 1776 888 888 1776 888 888 1776 1776 1776 888 888 888 888 888 888 27888 888 888 1776 1776 1776 888 888 1776 888 888 1776 1776 1776 888 888 888 888 888 888 27888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 27888 888 888 1776 1776 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 27888 888 888 1776 1776 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 # name: decoder_expected7 type: parsed_array count: 11 # protocol: RC5 address: 13 00 00 00 command: 11 00 00 00 repeat: false # protocol: RC5 address: 13 00 00 00 command: 11 00 00 00 repeat: false # protocol: RC5 address: 13 00 00 00 command: 11 00 00 00 repeat: true # protocol: RC5 address: 13 00 00 00 command: 11 00 00 00 repeat: true # protocol: RC5 address: 13 00 00 00 command: 11 00 00 00 repeat: false # protocol: RC5 address: 13 00 00 00 command: 10 00 00 00 repeat: false # protocol: RC5 address: 13 00 00 00 command: 10 00 00 00 repeat: false # protocol: RC5 address: 13 00 00 00 command: 10 00 00 00 repeat: true # protocol: RC5 address: 1F 00 00 00 command: 3F 00 00 00 repeat: false # protocol: RC5 address: 1F 00 00 00 command: 3F 00 00 00 repeat: false # protocol: RC5 address: 1F 00 00 00 command: 3F 00 00 00 repeat: true # name: encoder_input1 type: parsed_array count: 11 # protocol: RC5 address: 13 00 00 00 command: 11 00 00 00 repeat: false # protocol: RC5 address: 13 00 00 00 command: 11 00 00 00 repeat: false # protocol: RC5 address: 13 00 00 00 command: 11 00 00 00 repeat: true # protocol: RC5 address: 13 00 00 00 command: 11 00 00 00 repeat: true # protocol: RC5 address: 13 00 00 00 command: 11 00 00 00 repeat: false # protocol: RC5 address: 13 00 00 00 command: 10 00 00 00 repeat: false # protocol: RC5 address: 13 00 00 00 command: 10 00 00 00 repeat: false # protocol: RC5 address: 13 00 00 00 command: 10 00 00 00 repeat: true # protocol: RC5 address: 1F 00 00 00 command: 3F 00 00 00 repeat: false # protocol: RC5 address: 1F 00 00 00 command: 3F 00 00 00 repeat: false # protocol: RC5 address: 1F 00 00 00 command: 3F 00 00 00 repeat: true # name: encoder_expected1 type: raw data: 27888 888 888 1776 1776 1776 888 888 1776 888 888 1776 1776 1776 888 888 888 888 1776 888 27888 888 888 888 888 888 888 1776 888 888 1776 888 888 1776 1776 1776 888 888 888 888 1776 888 27888 888 888 888 888 888 888 1776 888 888 1776 888 888 1776 1776 1776 888 888 888 888 1776 888 27888 888 888 888 888 888 888 1776 888 888 1776 888 888 1776 1776 1776 888 888 888 888 1776 888 27888 888 888 1776 1776 1776 888 888 1776 888 888 1776 1776 1776 888 888 888 888 1776 888 27888 888 888 888 888 888 888 1776 888 888 1776 888 888 1776 1776 1776 888 888 888 888 888 888 27888 888 888 1776 1776 1776 888 888 1776 888 888 1776 1776 1776 888 888 888 888 888 888 27888 888 888 1776 1776 1776 888 888 1776 888 888 1776 1776 1776 888 888 888 888 888 888 27888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 27888 888 888 1776 1776 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 27888 888 888 1776 1776 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 888 # name: encoder_decoder_input1 type: parsed_array count: 26 # protocol: RC5 address: 1F 00 00 00 command: 3F 00 00 00 repeat: false # protocol: RC5 address: 00 00 00 00 command: 00 00 00 00 repeat: false # protocol: RC5 address: 10 00 00 00 command: 01 00 00 00 repeat: false # protocol: RC5 address: 01 00 00 00 command: 20 00 00 00 repeat: false # protocol: RC5 address: 01 00 00 00 command: 20 00 00 00 repeat: false # protocol: RC5 address: 01 00 00 00 command: 20 00 00 00 repeat: true # protocol: RC5 address: 01 00 00 00 command: 20 00 00 00 repeat: true # protocol: RC5 address: 01 00 00 00 command: 20 00 00 00 repeat: true # protocol: RC5 address: 01 00 00 00 command: 20 00 00 00 repeat: true # protocol: RC5 address: 1F 00 00 00 command: 3F 00 00 00 repeat: false # protocol: RC5 address: 0A 00 00 00 command: 2A 00 00 00 repeat: false # protocol: RC5 address: 15 00 00 00 command: 15 00 00 00 repeat: false # protocol: RC5 address: 15 00 00 00 command: 15 00 00 00 repeat: true # protocol: RC5X address: 1F 00 00 00 command: 3F 00 00 00 repeat: false # protocol: RC5X address: 00 00 00 00 command: 00 00 00 00 repeat: false # protocol: RC5X address: 10 00 00 00 command: 01 00 00 00 repeat: false # protocol: RC5X address: 01 00 00 00 command: 20 00 00 00 repeat: false # protocol: RC5X address: 01 00 00 00 command: 20 00 00 00 repeat: false # protocol: RC5X address: 01 00 00 00 command: 20 00 00 00 repeat: true # protocol: RC5X address: 01 00 00 00 command: 20 00 00 00 repeat: true # protocol: RC5X address: 01 00 00 00 command: 20 00 00 00 repeat: true # protocol: RC5X address: 01 00 00 00 command: 20 00 00 00 repeat: true # protocol: RC5X address: 1F 00 00 00 command: 3F 00 00 00 repeat: false # protocol: RC5X address: 0A 00 00 00 command: 2A 00 00 00 repeat: false # protocol: RC5X address: 15 00 00 00 command: 15 00 00 00 repeat: false # protocol: RC5X address: 15 00 00 00 command: 15 00 00 00 repeat: true # ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/infrared/test_rc5x.irtest ================================================ Filetype: IR tests file Version: 1 # name: decoder_input1 type: raw data: 27888 1776 888 888 1776 1776 888 888 1776 888 888 1776 1776 1776 888 888 888 888 888 888 # name: decoder_expected1 type: parsed_array count: 1 # protocol: RC5X address: 13 00 00 00 command: 10 00 00 00 repeat: false # name: encoder_input1 type: parsed_array count: 1 # protocol: RC5X address: 13 00 00 00 command: 10 00 00 00 repeat: false # name: encoder_expected1 type: raw data: 27888 1776 888 888 1776 1776 888 888 1776 888 888 1776 1776 1776 888 888 888 888 888 888 # ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/infrared/test_rc6.irtest ================================================ Filetype: IR tests file Version: 1 # name: decoder_input1 type: raw data: 27000 2666 889 444 888 444 444 444 444 444 888 1332 888 444 444 888 888 888 888 444 444 888 888 888 888 444 444 444 444 444 444 444 444 444 27000 2666 889 444 888 444 444 444 444 1332 888 444 888 444 444 888 888 444 444 888 444 444 444 444 888 888 888 444 444 444 444 444 444 444 444 444 27000 2666 889 444 888 444 444 444 444 1332 888 444 888 444 444 888 888 888 888 888 444 444 888 888 888 444 444 444 444 444 444 444 444 888 27000 2666 889 444 888 444 444 444 444 444 888 1332 888 444 444 888 888 444 444 888 444 444 444 444 888 888 888 444 444 444 444 444 444 444 444 444 27000 2666 889 444 888 444 444 444 444 1332 888 444 888 444 444 888 888 888 888 444 444 888 888 888 888 444 444 444 444 444 444 444 444 444 27000 2666 889 444 888 444 444 444 444 444 888 1332 888 444 444 888 888 888 888 888 444 444 888 888 888 444 444 444 444 444 444 444 444 444 27000 2666 889 444 888 444 444 444 444 1332 888 444 888 444 444 888 888 444 444 888 444 444 444 444 888 888 888 444 444 444 444 444 444 444 444 444 444 444 444 444 27000 2666 889 444 888 444 444 444 444 1332 888 444 888 444 444 888 888 444 444 888 444 444 444 444 888 888 888 444 444 444 444 444 444 444 444 888 444 444 27000 2666 889 444 888 444 444 444 444 1332 888 444 888 444 444 888 888 444 444 888 444 444 444 444 888 888 888 444 444 444 444 444 444 444 444 888 27000 2666 889 444 888 444 444 444 444 1332 888 444 888 444 444 888 888 888 888 888 444 444 888 888 888 444 444 444 444 444 444 444 444 444 # name: decoder_expected1 type: parsed_array count: 6 # protocol: RC6 address: 94 00 00 00 command: A0 00 00 00 repeat: false # protocol: RC6 address: 93 00 00 00 command: A0 00 00 00 repeat: false # protocol: RC6 address: 93 00 00 00 command: A0 00 00 00 repeat: false # protocol: RC6 address: 94 00 00 00 command: A0 00 00 00 repeat: false # protocol: RC6 address: 95 00 00 00 command: A0 00 00 00 repeat: false # protocol: RC6 address: 95 00 00 00 command: A0 00 00 00 repeat: false # name: decoder_input2 type: raw data: 27000 2666 889 444 888 444 444 444 444 444 888 1332 888 444 444 888 888 444 444 888 444 444 444 444 888 888 888 444 444 444 444 444 444 444 444 444 27000 2666 889 444 888 444 444 444 444 444 888 1332 888 444 444 888 888 444 444 888 444 444 444 444 888 888 888 444 444 444 444 444 444 444 444 444 27000 2666 889 444 888 444 444 444 444 1332 888 444 888 444 444 888 888 444 444 888 444 444 444 444 888 888 888 444 444 444 444 444 444 888 27000 2666 889 444 888 444 444 444 444 1332 888 444 888 444 444 888 888 444 444 888 444 444 444 444 888 888 888 444 444 444 444 444 444 888 27000 2666 889 444 888 444 444 444 444 1332 888 444 888 444 444 888 888 444 444 888 444 444 444 444 888 888 888 444 444 444 444 444 444 888 27000 2666 889 444 888 444 444 444 444 444 888 1332 888 444 444 888 888 444 444 888 444 444 444 444 888 888 888 444 444 444 444 444 444 444 444 444 27000 2666 889 444 888 444 444 444 444 1332 888 444 888 444 444 888 888 444 444 888 444 444 444 444 888 888 888 444 444 444 444 444 444 444 444 444 27000 2666 889 444 888 444 444 444 444 1332 888 444 888 444 444 888 888 444 444 888 444 444 444 444 888 888 888 444 444 444 444 444 444 444 444 444 # name: decoder_expected2 type: parsed_array count: 8 # protocol: RC6 address: 93 00 00 00 command: A0 00 00 00 repeat: false # protocol: RC6 address: 93 00 00 00 command: A0 00 00 00 repeat: true # protocol: RC6 address: 93 00 00 00 command: A1 00 00 00 repeat: false # protocol: RC6 address: 93 00 00 00 command: A1 00 00 00 repeat: true # protocol: RC6 address: 93 00 00 00 command: A1 00 00 00 repeat: true # protocol: RC6 address: 93 00 00 00 command: A0 00 00 00 repeat: false # protocol: RC6 address: 93 00 00 00 command: A0 00 00 00 repeat: false # protocol: RC6 address: 93 00 00 00 command: A0 00 00 00 repeat: true # name: encoder_input1 type: parsed_array count: 8 # protocol: RC6 address: 93 00 00 00 command: A0 00 00 00 repeat: false # protocol: RC6 address: 93 00 00 00 command: A0 00 00 00 repeat: true # protocol: RC6 address: 93 00 00 00 command: A1 00 00 00 repeat: false # protocol: RC6 address: 93 00 00 00 command: A1 00 00 00 repeat: true # protocol: RC6 address: 93 00 00 00 command: A1 00 00 00 repeat: true # protocol: RC6 address: 93 00 00 00 command: A0 00 00 00 repeat: false # protocol: RC6 address: 93 00 00 00 command: A0 00 00 00 repeat: false # protocol: RC6 address: 93 00 00 00 command: A0 00 00 00 repeat: true # name: encoder_expected1 type: raw data: 27000 2666 889 444 888 444 444 444 444 444 888 1332 888 444 444 888 888 444 444 888 444 444 444 444 888 888 888 444 444 444 444 444 444 444 444 444 27000 2666 889 444 888 444 444 444 444 444 888 1332 888 444 444 888 888 444 444 888 444 444 444 444 888 888 888 444 444 444 444 444 444 444 444 444 27000 2666 889 444 888 444 444 444 444 1332 888 444 888 444 444 888 888 444 444 888 444 444 444 444 888 888 888 444 444 444 444 444 444 888 27000 2666 889 444 888 444 444 444 444 1332 888 444 888 444 444 888 888 444 444 888 444 444 444 444 888 888 888 444 444 444 444 444 444 888 27000 2666 889 444 888 444 444 444 444 1332 888 444 888 444 444 888 888 444 444 888 444 444 444 444 888 888 888 444 444 444 444 444 444 888 27000 2666 889 444 888 444 444 444 444 444 888 1332 888 444 444 888 888 444 444 888 444 444 444 444 888 888 888 444 444 444 444 444 444 444 444 444 27000 2666 889 444 888 444 444 444 444 1332 888 444 888 444 444 888 888 444 444 888 444 444 444 444 888 888 888 444 444 444 444 444 444 444 444 444 27000 2666 889 444 888 444 444 444 444 1332 888 444 888 444 444 888 888 444 444 888 444 444 444 444 888 888 888 444 444 444 444 444 444 444 444 444 # name: encoder_decoder_input1 type: parsed_array count: 40 # protocol: RC6 address: 00 00 00 00 command: 00 00 00 00 repeat: false # protocol: RC6 address: 80 00 00 00 command: 00 00 00 00 repeat: false # protocol: RC6 address: 80 00 00 00 command: 01 00 00 00 repeat: false # protocol: RC6 address: 00 00 00 00 command: 01 00 00 00 repeat: false # protocol: RC6 address: 00 00 00 00 command: 00 00 00 00 repeat: false # protocol: RC6 address: 00 00 00 00 command: 00 00 00 00 repeat: true # protocol: RC6 address: 00 00 00 00 command: 00 00 00 00 repeat: false # protocol: RC6 address: 00 00 00 00 command: 00 00 00 00 repeat: true # protocol: RC6 address: FF 00 00 00 command: FF 00 00 00 repeat: false # protocol: RC6 address: 7F 00 00 00 command: FF 00 00 00 repeat: false # protocol: RC6 address: 7F 00 00 00 command: FE 00 00 00 repeat: false # protocol: RC6 address: FF 00 00 00 command: FE 00 00 00 repeat: false # protocol: RC6 address: FF 00 00 00 command: FF 00 00 00 repeat: false # protocol: RC6 address: FF 00 00 00 command: FF 00 00 00 repeat: true # protocol: RC6 address: AA 00 00 00 command: 55 00 00 00 repeat: false # protocol: RC6 address: 55 00 00 00 command: AA 00 00 00 repeat: false # protocol: RC6 address: 55 00 00 00 command: 55 00 00 00 repeat: false # protocol: RC6 address: AA 00 00 00 command: AA 00 00 00 repeat: false # protocol: RC6 address: AA 00 00 00 command: AA 00 00 00 repeat: true # protocol: RC6 address: 00 00 00 00 command: 00 00 00 00 repeat: false # protocol: RC6 address: 80 00 00 00 command: 00 00 00 00 repeat: false # protocol: RC6 address: 80 00 00 00 command: 01 00 00 00 repeat: false # protocol: RC6 address: 00 00 00 00 command: 01 00 00 00 repeat: false # protocol: RC6 address: 00 00 00 00 command: 00 00 00 00 repeat: false # protocol: RC6 address: 00 00 00 00 command: 00 00 00 00 repeat: true # protocol: RC6 address: 00 00 00 00 command: 00 00 00 00 repeat: false # protocol: RC6 address: 00 00 00 00 command: 00 00 00 00 repeat: true # protocol: RC6 address: FF 00 00 00 command: FF 00 00 00 repeat: false # protocol: RC6 address: 7F 00 00 00 command: FF 00 00 00 repeat: false # protocol: RC6 address: 7F 00 00 00 command: FE 00 00 00 repeat: false # protocol: RC6 address: FF 00 00 00 command: FE 00 00 00 repeat: false # protocol: RC6 address: FF 00 00 00 command: FF 00 00 00 repeat: false # protocol: RC6 address: FF 00 00 00 command: FF 00 00 00 repeat: true # protocol: RC6 address: AA 00 00 00 command: 55 00 00 00 repeat: false # protocol: RC6 address: 55 00 00 00 command: AA 00 00 00 repeat: false # protocol: RC6 address: 55 00 00 00 command: 55 00 00 00 repeat: false # protocol: RC6 address: AA 00 00 00 command: AA 00 00 00 repeat: false # protocol: RC6 address: AA 00 00 00 command: AA 00 00 00 repeat: true # protocol: RC6 address: 93 00 00 00 command: A0 00 00 00 repeat: false # protocol: RC6 address: 93 00 00 00 command: A1 00 00 00 repeat: false # ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/infrared/test_rca.irtest ================================================ Filetype: IR tests file Version: 1 # name: decoder_input1 type: raw data: 1000000 3994 3969 552 1945 551 1945 552 1945 551 1945 552 946 551 947 550 1947 548 951 546 1953 542 979 518 1979 517 981 492 1006 491 1006 492 1006 492 1006 492 2005 492 2005 492 1006 492 2005 492 1006 492 2005 492 1006 492 2006 491 # name: decoder_expected1 type: parsed_array count: 1 # protocol: RCA address: 0F 00 00 00 command: 54 00 00 00 repeat: false # name: decoder_input2 type: raw data: 1000000 4055 3941 605 1891 551 1947 550 1946 551 1946 551 947 551 947 550 1947 549 949 548 1951 545 1977 519 1978 519 1979 518 980 518 980 518 980 518 980 518 1979 518 1979 518 981 517 1979 518 980 518 980 518 980 518 980 518 # name: decoder_expected2 type: parsed_array count: 1 # protocol: RCA address: 0F 00 00 00 command: F4 00 00 00 repeat: false # name: decoder_input3 type: raw data: 1000000 4027 3970 551 1946 550 1946 551 1946 551 1946 551 946 551 947 550 1947 549 949 547 1951 545 1978 518 1979 492 1006 492 1007 491 1006 492 1006 492 1006 492 2006 491 2006 491 1006 492 2006 491 1007 491 1007 491 1006 492 2006 491 # name: decoder_expected3 type: parsed_array count: 1 # protocol: RCA address: 0F 00 00 00 command: 74 00 00 00 repeat: false # name: decoder_input4 type: raw data: 1000000 4021 3941 551 1946 550 1946 551 1946 551 1945 552 946 551 947 550 1947 549 950 547 1952 544 1977 519 979 519 1979 518 980 518 980 518 980 518 980 518 1979 518 1979 518 980 518 1979 518 980 518 980 518 1979 518 980 518 # name: decoder_expected4 type: parsed_array count: 1 # protocol: RCA address: 0F 00 00 00 command: B4 00 00 00 repeat: false # name: decoder_input5 type: raw data: 1000000 4022 3941 551 1946 551 1946 577 1919 578 1919 578 920 552 946 551 1946 550 947 550 1949 547 1952 544 978 520 979 519 980 518 980 518 980 518 980 518 1979 518 1979 518 980 518 1979 518 980 518 980 518 1979 518 1980 517 # name: decoder_expected5 type: parsed_array count: 1 # protocol: RCA address: 0F 00 00 00 command: 34 00 00 00 repeat: false # name: decoder_input6 type: raw data: 1000000 3995 3968 552 1944 552 1946 550 1946 550 1946 551 947 550 948 549 1947 549 1949 547 1952 544 1978 518 1979 492 2005 492 1006 492 1006 492 1006 492 1006 492 2005 492 2005 492 1006 492 1006 492 1006 492 1006 492 1006 492 1006 492 # name: decoder_expected6 type: parsed_array count: 1 # protocol: RCA address: 0F 00 00 00 command: FC 00 00 00 repeat: false # name: encoder_decoder_input1 type: parsed_array count: 4 # protocol: RCA address: 0F 00 00 00 command: 74 00 00 00 repeat: false # protocol: RCA address: 0F 00 00 00 command: B4 00 00 00 repeat: false # protocol: RCA address: 0F 00 00 00 command: 34 00 00 00 repeat: false # protocol: RCA address: 0F 00 00 00 command: FC 00 00 00 repeat: false # ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/infrared/test_samsung32.irtest ================================================ Filetype: IR tests file Version: 1 # name: decoder_input1 type: raw data: 3129767 4513 4483 565 530 586 1670 563 1664 588 1666 566 530 586 535 560 535 591 531 565 531 585 1669 563 1666 587 1640 593 531 566 530 587 536 559 562 564 531 585 537 558 1670 562 1665 587 534 561 534 592 530 566 529 587 1668 564 1664 589 533 563 533 594 1661 560 1667 565 1661 591 1664 558 46325 4517 4480 558 1668 595 679127 4511 4485 562 532 584 1671 561 1666 587 1668 564 532 585 537 559 537 589 533 562 533 593 1661 561 1667 586 1642 590 532 563 531 585 537 559 564 563 1666 567 528 588 535 613 483 593 530 586 536 559 536 590 1637 584 537 558 1669 594 1661 561 1667 586 1642 591 1664 559 1670 583 534 567 46429 4515 4480 558 1671 593 618571 4508 4488 560 561 566 1663 559 1667 583 1670 562 534 582 540 565 531 587 536 560 536 590 1664 558 1670 583 1644 588 535 561 534 592 530 566 557 610 1616 616 479 585 537 558 537 589 534 584 539 567 529 587 534 561 534 592 1663 559 1668 564 1664 588 1666 566 1661 581 1646 585 1669 563 46106 4511 4485 563 1664 589 514897 4514 4482 556 564 614 1616 565 1664 589 1666 557 538 588 534 562 534 592 529 566 529 587 1667 565 1663 590 1638 584 538 568 527 590 534 562 562 566 530 587 1642 590 532 563 530 586 537 589 533 563 533 583 539 566 1661 561 561 566 1663 559 1668 584 1671 563 1666 556 1671 591 1663 559 46210 4508 4488 560 1668 585 683922 4509 4487 561 560 565 1662 559 1669 585 1670 562 534 583 540 566 529 586 535 560 535 591 1663 559 1669 584 1644 588 534 561 533 593 529 556 567 561 1668 564 1664 590 534 563 532 584 538 557 537 589 534 562 534 593 530 566 555 561 1667 564 1662 589 1665 557 1671 581 1647 586 1669 564 46686 4514 4481 556 1672 592 1088255 4514 4481 557 564 562 1667 565 1663 591 1665 558 538 590 533 564 532 583 539 567 528 588 1666 566 1663 580 1648 585 537 559 537 589 533 562 560 618 478 589 535 562 1667 565 1662 588 531 565 531 585 537 558 536 590 1666 566 1661 592 530 566 530 586 1669 564 1664 558 1669 594 1662 560 46291 4510 4485 563 1663 589 97349 4510 4487 561 1666 586 97560 4513 4482 566 1662 591 97123 4510 4485 563 1664 588 97605 4508 4487 561 1666 586 97371 4518 4478 560 1668 595 97514 4518 4478 560 1667 586 97014 4515 4480 568 1660 593 96719 4516 4481 567 1660 593 97528 4515 4480 568 1659 593 97453 4510 4485 563 1665 587 97351 4518 4477 561 1668 585 97216 4511 4484 564 1664 589 97708 4518 4477 561 1667 586 96718 4516 4479 559 1669 594 97070 4515 4480 568 1660 593 97500 4511 4484 564 1662 590 97425 4515 4481 567 1660 593 97025 4515 4482 566 1660 592 96796 4509 4487 561 1666 587 97399 4512 4484 565 1662 591 97486 4516 4480 567 1658 594 97425 4515 4481 567 1659 593 97511 4510 4485 563 1664 650 96969 4511 4485 562 1665 588 97243 4512 4484 564 1663 590 97031 4519 4478 560 1666 586 97548 4514 4482 566 1661 591 97302 4515 4480 568 1659 593 97726 4510 4486 562 1665 588 97396 4514 4482 566 1661 592 97301 4515 4480 568 1661 593 97453 4518 4477 560 1667 585 97430 4518 4477 561 1665 587 97521 4511 4484 564 1664 589 97182 4512 4484 564 1663 590 97760 4516 4479 559 1668 595 97268 4516 4479 559 1668 595 97243 4512 4485 563 1663 589 97695 4510 4486 562 1664 588 374205 4513 4483 565 530 586 1669 564 1665 589 1667 567 529 587 535 560 535 591 531 565 530 585 1669 563 1664 588 1639 593 529 566 529 587 536 560 563 565 532 585 537 560 1669 563 1664 587 534 561 534 592 529 566 529 586 1668 564 1663 589 532 563 534 593 1661 562 1666 566 1662 591 1664 558 149343 4512 4483 565 530 586 1669 563 1664 588 1667 565 530 586 536 560 536 590 532 563 531 586 1670 563 1666 567 1660 592 530 565 529 586 537 558 563 563 532 584 538 568 1661 561 1665 587 535 560 535 592 532 565 531 587 1669 563 1665 587 534 561 534 592 1663 559 1668 564 1662 590 1666 566 116399 4514 4482 566 531 587 1669 564 1664 589 1666 566 529 587 535 561 535 592 531 565 529 587 1668 564 1664 558 1670 595 529 566 528 589 535 560 562 565 531 585 536 559 1668 564 1664 589 534 561 533 593 530 565 528 588 1668 564 1665 590 533 564 532 594 1661 561 1666 566 1661 592 1663 558 121946 4517 4478 559 537 590 1664 568 1660 593 1661 560 536 590 531 564 531 585 537 559 536 590 1665 568 1661 561 1666 587 537 559 529 591 531 564 558 558 537 588 533 562 1665 567 1659 593 530 565 529 587 536 561 535 592 1664 559 1671 593 530 566 528 587 1667 565 1662 558 1668 595 1660 561 46509 4516 4479 558 1668 594 88785 4512 4484 564 530 585 1669 563 1664 588 1666 566 530 587 536 560 535 592 532 565 531 585 1669 563 1665 557 1669 594 530 566 530 586 535 560 562 564 530 585 537 558 1669 563 1664 589 535 561 534 593 529 566 529 586 1668 564 1664 589 533 562 532 594 1661 561 1666 565 1662 591 1665 558 289651 4512 4483 564 531 586 1669 563 1665 588 1667 565 529 587 536 560 536 590 531 563 531 584 1670 562 1666 556 1671 592 529 566 531 586 536 561 562 564 532 585 537 558 1669 563 1665 588 535 561 536 590 530 565 531 585 1669 563 1664 587 534 561 533 593 1662 561 1669 564 1663 590 1665 567 46302 4509 4487 561 1667 585 97097 4513 4483 565 529 587 1668 564 1663 589 1666 567 529 587 536 560 535 591 530 565 529 587 1669 563 1664 558 1669 594 529 566 527 587 535 561 561 563 530 586 537 560 1669 563 1663 589 534 561 532 594 529 566 528 587 1668 564 1663 589 532 563 532 594 1660 561 1667 566 1661 592 1663 558 46311 4510 4485 562 1665 589 99001 4514 4481 566 528 587 1667 565 1662 589 1664 568 528 588 535 561 535 593 529 567 528 589 1668 564 1663 559 1668 595 528 567 527 589 534 562 561 565 530 586 536 560 1668 564 1663 590 533 563 532 595 524 567 527 588 1667 565 1662 590 532 563 531 595 1659 562 1666 566 1661 593 1664 559 300259 4514 4482 556 565 561 1668 564 1663 589 1664 556 539 588 535 561 535 643 478 568 530 587 1668 564 1664 589 1636 594 529 567 528 588 534 561 561 565 1662 560 536 590 532 564 531 586 537 589 532 564 533 584 538 568 528 588 1667 565 1662 560 1669 584 1670 562 1666 587 1641 591 1664 559 46271 4561 4435 562 1666 586 81421 4514 4482 556 565 561 1667 565 1662 589 1664 558 538 588 534 562 534 593 530 567 530 587 1669 564 1663 589 1637 594 529 567 528 588 534 561 560 566 1663 559 535 591 531 565 530 587 538 589 533 563 533 583 539 567 529 587 1667 565 1662 560 1669 584 1669 563 1666 587 1640 592 1663 560 46296 4516 4480 558 1669 594 80690 4508 4489 560 561 565 1663 558 1670 593 1660 561 534 592 530 565 530 586 537 560 536 591 1664 558 1670 583 1644 587 535 560 534 592 530 566 556 559 1669 563 532 584 538 558 537 588 534 582 540 567 530 588 535 562 535 591 1663 559 1669 564 1665 588 1666 566 1662 560 1668 585 1669 563 136483 4511 4485 563 531 585 1671 561 1666 587 1668 564 531 585 536 559 537 589 532 563 532 584 1670 562 1666 587 1642 591 531 566 531 585 536 559 563 563 1665 567 528 588 535 561 534 593 529 567 556 560 535 591 530 565 531 585 1670 563 1665 568 1660 593 1662 560 1668 564 1663 590 1666 566 129038 4511 4484 564 533 583 1670 562 1666 587 1668 565 532 586 537 559 536 591 532 564 532 594 1660 562 1666 566 1660 593 531 565 530 586 537 558 563 563 1664 568 528 589 535 562 533 595 530 567 556 560 535 591 531 565 531 584 1669 563 1664 567 1661 592 1662 559 1668 564 1663 590 1666 566 46187 4511 4486 562 1665 589 110663 4517 4478 558 536 590 1665 568 1660 593 1661 560 536 590 531 564 531 584 537 558 536 590 1665 567 1661 561 1666 587 536 560 535 591 532 564 559 557 1670 562 532 594 529 567 528 649 473 561 561 565 531 585 536 559 536 589 1665 567 1660 562 1666 587 1668 564 1663 558 1669 594 1661 561 143736 4517 4479 559 536 591 1664 558 1670 593 1661 559 536 590 531 564 531 585 536 559 537 589 1665 567 1661 561 1666 587 536 560 536 590 530 564 557 558 1669 562 533 593 528 568 530 586 534 561 560 566 530 586 536 560 536 591 1664 558 1671 562 1666 587 1667 565 1663 559 1668 594 1660 562 46234 4514 4482 566 1661 591 120661 4564 4432 565 530 586 1669 563 1665 587 1666 566 531 585 536 559 536 591 532 564 532 586 1670 563 1666 557 1666 592 530 565 530 586 536 560 562 563 1664 558 538 588 533 562 533 593 528 558 565 561 534 582 541 566 530 586 1670 563 1664 567 1660 593 1662 560 1668 564 1663 590 1665 567 46472 4513 4484 564 1664 588 125301 4511 4484 564 532 584 1670 562 1666 587 1668 565 531 586 537 560 537 591 532 565 533 584 1671 562 1666 566 1661 591 530 565 532 584 536 559 562 564 1665 567 529 587 534 563 535 593 529 568 556 561 535 592 531 565 531 585 1669 563 1665 567 1660 593 1663 559 1668 564 1664 589 1666 567 200253 4517 4479 558 562 615 1613 558 1670 592 1661 560 536 591 531 616 480 585 537 559 537 641 1613 568 1661 582 1646 586 536 559 535 591 532 564 558 558 1670 562 533 592 530 566 529 588 536 581 542 617 479 587 537 560 536 590 1665 557 1670 562 1666 587 1668 564 1664 558 1669 593 1662 561 46230 4570 4426 561 1667 586 115418 4514 4483 565 557 561 1669 563 1664 589 1666 566 529 587 534 561 534 592 530 566 530 586 1668 564 1664 589 1639 594 529 567 528 587 534 561 561 565 1663 559 535 590 532 563 532 584 # name: decoder_expected1 type: parsed_array count: 78 # protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 repeat: false # protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 repeat: true # protocol: Samsung32 address: 0E 00 00 00 command: 81 00 00 00 repeat: false # protocol: Samsung32 address: 0E 00 00 00 command: 81 00 00 00 repeat: true # protocol: Samsung32 address: 0E 00 00 00 command: 01 00 00 00 repeat: false # protocol: Samsung32 address: 0E 00 00 00 command: 01 00 00 00 repeat: true # protocol: Samsung32 address: 0E 00 00 00 command: 02 00 00 00 repeat: false # protocol: Samsung32 address: 0E 00 00 00 command: 02 00 00 00 repeat: true # protocol: Samsung32 address: 0E 00 00 00 command: 03 00 00 00 repeat: false # protocol: Samsung32 address: 0E 00 00 00 command: 03 00 00 00 repeat: true # protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 repeat: false # protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 repeat: true # protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 repeat: true # protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 repeat: true # protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 repeat: true # protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 repeat: true # protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 repeat: true # protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 repeat: true # protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 repeat: true # protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 repeat: true # protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 repeat: true # protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 repeat: true # protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 repeat: true # protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 repeat: true # protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 repeat: true # protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 repeat: true # protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 repeat: true # protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 repeat: true # protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 repeat: true # protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 repeat: true # protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 repeat: true # protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 repeat: true # protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 repeat: true # protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 repeat: true # protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 repeat: true # protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 repeat: true # protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 repeat: true # protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 repeat: true # protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 repeat: true # protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 repeat: true # protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 repeat: true # protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 repeat: true # protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 repeat: true # protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 repeat: true # protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 repeat: true # protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 repeat: true # protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 repeat: true # protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 repeat: true # protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 repeat: true # protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 repeat: true # protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 repeat: true # protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 repeat: false # protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 repeat: false # protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 repeat: false # protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 repeat: false # protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 repeat: true # protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 repeat: false # protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 repeat: false # protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 repeat: true # protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 repeat: false # protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 repeat: true # protocol: Samsung32 address: 0E 00 00 00 command: 0C 00 00 00 repeat: false # protocol: Samsung32 address: 0E 00 00 00 command: 01 00 00 00 repeat: false # protocol: Samsung32 address: 0E 00 00 00 command: 01 00 00 00 repeat: true # protocol: Samsung32 address: 0E 00 00 00 command: 01 00 00 00 repeat: false # protocol: Samsung32 address: 0E 00 00 00 command: 01 00 00 00 repeat: true # protocol: Samsung32 address: 0E 00 00 00 command: 01 00 00 00 repeat: false # protocol: Samsung32 address: 0E 00 00 00 command: 01 00 00 00 repeat: false # protocol: Samsung32 address: 0E 00 00 00 command: 01 00 00 00 repeat: false # protocol: Samsung32 address: 0E 00 00 00 command: 01 00 00 00 repeat: true # protocol: Samsung32 address: 0E 00 00 00 command: 01 00 00 00 repeat: false # protocol: Samsung32 address: 0E 00 00 00 command: 01 00 00 00 repeat: false # protocol: Samsung32 address: 0E 00 00 00 command: 01 00 00 00 repeat: true # protocol: Samsung32 address: 0E 00 00 00 command: 01 00 00 00 repeat: false # protocol: Samsung32 address: 0E 00 00 00 command: 01 00 00 00 repeat: true # protocol: Samsung32 address: 0E 00 00 00 command: 01 00 00 00 repeat: false # protocol: Samsung32 address: 0E 00 00 00 command: 01 00 00 00 repeat: false # protocol: Samsung32 address: 0E 00 00 00 command: 01 00 00 00 repeat: true # name: encoder_decoder_input1 type: parsed_array count: 26 # protocol: Samsung32 address: 00 00 00 00 command: 00 00 00 00 repeat: false # protocol: Samsung32 address: 01 00 00 00 command: 00 00 00 00 repeat: false # protocol: Samsung32 address: 01 00 00 00 command: 80 00 00 00 repeat: false # protocol: Samsung32 address: 00 00 00 00 command: 80 00 00 00 repeat: false # protocol: Samsung32 address: 00 00 00 00 command: 00 00 00 00 repeat: false # protocol: Samsung32 address: 00 00 00 00 command: 00 00 00 00 repeat: true # protocol: Samsung32 address: 00 00 00 00 command: 00 00 00 00 repeat: false # protocol: Samsung32 address: 00 00 00 00 command: 00 00 00 00 repeat: true # protocol: Samsung32 address: FF 00 00 00 command: FF 00 00 00 repeat: false # protocol: Samsung32 address: FE 00 00 00 command: FF 00 00 00 repeat: false # protocol: Samsung32 address: FE 00 00 00 command: 7F 00 00 00 repeat: false # protocol: Samsung32 address: FF 00 00 00 command: 7F 00 00 00 repeat: false # protocol: Samsung32 address: FF 00 00 00 command: FF 00 00 00 repeat: false # protocol: Samsung32 address: FF 00 00 00 command: FF 00 00 00 repeat: true # protocol: Samsung32 address: AA 00 00 00 command: 55 00 00 00 repeat: false # protocol: Samsung32 address: 55 00 00 00 command: AA 00 00 00 repeat: false # protocol: Samsung32 address: 55 00 00 00 command: 55 00 00 00 repeat: false # protocol: Samsung32 address: AA 00 00 00 command: AA 00 00 00 repeat: false # protocol: Samsung32 address: AA 00 00 00 command: AA 00 00 00 repeat: true # protocol: Samsung32 address: AA 00 00 00 command: AA 00 00 00 repeat: false # protocol: Samsung32 address: AA 00 00 00 command: AA 00 00 00 repeat: true # protocol: Samsung32 address: AA 00 00 00 command: AA 00 00 00 repeat: true # protocol: Samsung32 address: 55 00 00 00 command: 55 00 00 00 repeat: false # protocol: Samsung32 address: 55 00 00 00 command: 55 00 00 00 repeat: true # protocol: Samsung32 address: 55 00 00 00 command: 55 00 00 00 repeat: true # protocol: Samsung32 address: 55 00 00 00 command: 55 00 00 00 repeat: true # ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/infrared/test_sirc.irtest ================================================ Filetype: IR tests file Version: 1 # name: decoder_input1 type: raw data: 1000000 2420 608 1194 608 596 604 1198 603 591 610 1192 609 596 605 599 601 593 607 597 604 590 610 594 606 1196 25957 2426 603 1199 603 591 610 1192 610 594 606 1196 606 599 603 591 609 595 606 598 602 592 609 596 605 1197 25960 2423 606 1196 606 599 602 1200 602 592 609 1193 609 596 606 599 602 592 609 595 605 600 601 593 608 1194 1000000 2422 607 1195 607 598 603 1199 604 590 610 1192 610 594 606 598 603 591 609 595 605 600 601 593 607 1195 25955 2418 610 1192 610 594 606 1196 606 599 602 1200 602 592 608 596 604 590 611 594 607 597 603 591 609 1193 25959 2424 604 1198 604 590 610 1192 610 594 606 1196 605 600 601 593 608 597 603 591 610 595 606 598 602 1200 1000000 2424 605 599 601 593 607 597 603 591 610 594 606 1196 606 1196 605 600 601 593 608 597 604 590 611 1191 26586 2425 604 590 611 593 607 598 603 591 610 595 606 1196 606 1196 606 599 602 592 608 596 604 590 611 1191 26586 2424 604 590 611 593 607 598 603 591 609 595 605 1197 605 1197 604 590 611 593 607 597 603 591 610 1192 1000000 2424 604 1198 604 590 611 1191 610 594 606 598 603 1199 602 1200 602 592 609 595 605 600 601 593 608 1194 25386 2419 610 1192 610 594 606 1196 607 597 603 591 610 1192 609 1193 610 594 606 598 602 592 609 595 605 1197 25385 2421 608 1194 608 596 605 1197 605 599 601 593 608 1194 608 1194 608 596 605 589 611 594 607 597 604 1198 1000000 2426 603 1199 602 1200 602 1200 602 592 608 1194 608 596 604 590 611 594 607 597 603 591 610 594 606 1196 605 600 601 593 608 596 604 590 610 594 607 1195 606 598 603 591 15078 2419 610 1192 610 1192 610 1192 610 594 606 1196 605 600 601 593 608 597 604 590 610 595 606 598 602 1200 602 592 608 597 604 590 611 594 607 597 603 1199 603 591 609 595 15075 2422 607 1195 607 1195 607 1195 607 597 604 1198 603 591 610 594 606 598 603 591 609 595 605 600 601 1191 611 594 607 597 603 591 610 594 606 598 602 1200 602 592 608 596 1000000 2422 607 1195 606 599 602 592 608 596 604 590 610 1192 610 594 606 599 602 592 608 596 604 590 610 1192 26585 2426 602 1200 602 592 608 596 604 590 611 594 607 1195 607 598 603 591 610 594 606 598 603 591 609 1193 26586 2425 604 1198 603 591 610 594 606 598 602 592 609 1193 608 597 605 600 601 593 607 597 604 590 610 1192 1000000 2418 610 594 606 598 603 1199 603 1199 603 1199 603 1199 603 1199 603 591 610 1192 610 594 606 1196 606 1196 606 1196 606 598 602 592 609 1193 609 1193 609 1193 609 595 605 599 11557 2418 611 594 607 598 603 1199 603 1199 603 1199 602 1200 602 1200 601 593 608 1194 607 597 604 1198 603 1199 603 1199 602 592 608 596 604 1198 603 1199 603 1199 603 591 609 595 11561 2424 604 590 610 594 607 1195 606 1196 606 1196 606 1196 606 1196 605 600 601 1191 611 594 607 1195 607 1195 607 1195 607 597 603 591 610 1192 610 1192 610 1192 610 594 606 598 1000000 2424 604 590 611 594 607 1195 607 1195 607 1195 607 1195 607 1195 606 598 603 1199 602 592 609 1193 608 1194 608 1194 608 596 604 590 611 1191 611 1191 611 1191 611 594 607 598 11559 2427 602 592 608 596 605 1197 604 1198 604 1198 604 1198 604 1198 604 590 610 1192 610 595 606 1196 606 1196 606 1196 606 599 603 591 609 1193 609 1193 609 1193 608 597 605 589 11567 2418 610 595 607 597 603 1199 603 1199 602 1200 602 1200 601 1201 601 593 608 1194 607 598 603 1199 603 1199 603 1199 603 591 609 595 605 1197 605 1197 605 1197 604 590 611 594 1000000 2421 608 597 604 590 610 1192 610 1192 609 1193 609 1193 609 1193 608 596 605 1197 604 590 610 1192 611 1191 610 1192 610 594 606 598 603 1199 603 1199 602 1200 602 592 608 596 11561 2424 604 590 610 594 606 1196 606 1196 606 1196 606 1196 605 1197 605 600 601 1201 601 593 607 1195 607 1195 606 1196 606 598 602 592 608 1194 608 1194 607 1195 607 597 603 591 11564 2421 607 597 604 590 610 1192 610 1192 610 1192 610 1192 610 1192 609 595 606 1196 606 598 602 1200 601 1201 601 1201 601 593 607 598 603 1199 603 1199 602 1200 602 592 608 596 1000000 2420 609 595 606 598 602 1200 602 1200 602 1200 602 1200 602 1200 602 592 608 1194 608 596 604 1198 603 1199 603 1199 603 591 610 594 606 1196 606 1196 606 1196 606 598 602 592 11565 2420 609 595 605 600 601 1201 601 1201 601 1201 601 1201 601 1201 601 593 607 1195 607 597 603 1199 603 1199 603 1199 603 591 609 595 605 1197 605 1197 605 1197 605 599 601 593 11563 2422 607 597 603 591 609 1193 609 1193 608 1194 608 1194 608 1194 582 623 603 1199 603 591 610 1202 599 1203 599 1203 599 595 581 623 577 1225 601 1201 601 1201 601 593 582 623 1000000 2425 602 1200 602 1200 602 592 608 1194 608 1194 607 1195 607 1195 607 597 603 1199 602 592 609 1193 608 1194 608 1194 607 597 603 601 575 1227 599 1203 599 1203 573 621 580 625 10931 2426 578 1224 578 1224 578 616 585 1217 585 1217 585 1217 585 1217 585 620 580 1222 580 624 577 1225 577 1225 577 1225 577 617 583 622 580 1222 580 1222 579 1223 579 625 576 618 10936 2421 583 1219 583 1219 582 622 579 1223 578 1224 578 1224 578 1224 578 616 584 1218 584 621 580 1222 579 1223 579 1223 579 625 576 618 583 1219 582 1220 582 1220 582 622 578 616 1000000 2419 584 620 580 1222 580 624 576 1226 576 1226 576 1226 576 1226 576 618 582 1220 582 622 579 1223 578 1224 579 1223 578 616 585 619 581 1221 581 1221 581 1221 580 624 576 618 11563 2422 582 622 579 1223 578 616 585 1217 585 1217 584 1218 584 1218 583 622 579 1223 579 625 575 1216 585 1217 585 1217 585 619 581 623 577 1225 577 1225 577 1225 576 618 583 621 11558 2427 577 617 584 1218 583 621 579 1223 579 1223 578 1224 578 1224 578 647 553 1249 553 651 549 1253 548 1254 549 1253 549 645 555 649 551 1251 551 1251 551 1251 550 654 546 648 1000000 2456 548 646 554 650 551 653 547 1255 547 1255 547 1255 547 1255 547 647 554 1248 554 650 551 1251 551 1251 551 1251 551 653 547 647 554 1248 554 1248 554 1248 553 651 550 644 12112 2449 555 649 551 654 547 647 554 1248 554 1248 553 1249 553 1249 553 651 549 1253 549 645 555 1247 555 1247 555 1247 554 650 550 655 547 1244 557 1224 578 1224 579 615 585 619 12139 2423 580 624 576 618 582 622 578 1224 578 1224 578 1224 578 1224 578 616 584 1218 584 620 580 1222 580 1222 581 1221 580 624 577 617 584 1218 584 1218 584 1218 584 620 581 623 1000000 2422 582 1220 581 623 578 616 584 1218 584 1218 584 1218 584 1218 584 620 580 1222 580 624 576 1226 577 1225 576 1226 576 618 583 622 579 1223 578 1224 577 1225 577 617 585 619 11559 2426 577 1225 577 617 583 621 579 1223 579 1223 578 1224 578 1224 578 616 584 1218 584 620 580 1222 580 1222 579 1223 579 625 575 650 550 1252 550 1252 549 1253 549 645 556 648 11531 2453 549 1253 548 646 555 649 551 1251 551 1251 550 1252 549 1253 549 645 556 1246 555 649 552 1219 582 1220 582 1220 582 622 578 616 585 1217 584 1218 584 1218 584 620 581 623 1000000 2428 576 618 582 1220 583 622 579 1223 578 1224 578 1224 578 1224 578 616 585 1217 585 619 582 1220 582 1220 582 1220 582 622 578 616 585 1217 585 1217 584 1218 584 620 581 623 11557 2427 577 617 584 1218 583 621 580 1222 580 1222 580 1222 580 1222 580 624 576 1246 555 649 552 1250 552 1250 551 1251 551 653 548 646 554 1248 555 1247 555 1247 555 649 551 653 11528 2447 556 648 552 1250 552 653 548 1254 548 1254 547 1245 557 1245 557 647 553 1249 552 652 549 1253 548 1254 548 1254 548 646 555 649 551 1251 551 1251 551 1251 551 643 557 647 1000000 2418 610 594 606 598 603 1199 603 1199 602 1200 602 1200 602 1200 602 592 608 1194 608 596 604 1198 604 1198 604 1198 603 591 610 594 606 1196 606 1196 605 1197 605 599 601 593 11563 2422 606 598 602 592 608 1194 608 1194 608 1194 607 1195 607 1195 607 597 603 1199 603 591 609 1193 609 1193 609 1193 608 596 605 599 601 1201 600 1191 611 1191 611 593 606 598 11558 2427 601 593 607 597 603 1199 603 1199 603 1199 602 1200 602 1200 601 593 607 1195 607 597 603 1199 603 1199 602 1200 602 592 608 596 604 1198 604 1198 604 1198 603 591 609 595 1000000 2424 605 1197 604 600 600 1191 610 1192 610 1192 610 1192 609 1193 609 595 605 1197 606 598 602 1200 602 1200 601 1201 601 593 607 597 603 1199 603 1199 603 1199 603 591 609 595 10937 2420 609 1193 609 595 605 1197 605 1197 605 1197 605 1197 605 1197 605 600 601 1201 601 593 608 1194 608 1194 608 1194 609 595 605 599 601 1201 601 1201 601 1201 601 593 608 596 10936 2420 608 1194 608 596 604 1198 605 1197 605 1197 605 1197 605 1197 605 600 601 1201 601 593 607 1195 608 1194 608 1194 608 596 604 600 600 1202 601 1201 601 1201 601 593 607 597 1000000 2420 609 1193 608 1194 608 596 579 625 600 1202 600 1202 600 1202 600 594 607 1195 607 597 603 1199 603 1199 602 1200 602 592 609 595 605 1197 605 1197 605 1197 604 600 600 594 11561 2423 605 1197 605 1197 605 599 601 593 607 1195 607 1195 607 1195 607 597 604 1198 603 591 610 1192 610 1192 610 1192 610 594 607 597 603 1199 603 1199 603 1199 603 591 610 594 11563 2421 608 1194 608 1194 608 596 605 599 601 1201 602 1200 602 1200 602 592 609 1193 609 595 605 1197 606 1196 606 1196 606 598 602 592 609 1193 609 1193 610 1192 610 594 607 597 1000000 2428 576 1226 600 1192 610 594 606 598 602 1200 602 592 609 595 605 600 601 593 607 597 603 591 609 1193 25955 2427 601 1190 610 1192 610 594 606 598 602 1200 601 593 607 597 603 591 610 594 606 598 602 592 608 1194 25957 2425 604 1198 603 1199 603 591 609 595 605 1197 605 599 601 593 607 598 603 591 610 594 606 598 602 1200 25952 2420 608 1194 608 1194 608 596 604 601 600 1191 610 594 606 598 603 591 609 595 605 599 601 593 608 1194 1000000 2421 607 597 603 1199 603 591 610 594 606 1196 605 600 576 618 583 621 604 601 575 619 606 598 603 1199 26576 2424 605 600 576 1226 601 593 608 596 604 1198 604 600 600 594 607 597 603 591 609 595 606 598 602 1200 26579 2420 583 621 605 1197 604 600 601 593 607 1195 607 597 604 590 610 594 607 597 603 591 610 594 606 1196 26584 2426 603 591 609 1193 609 595 605 599 601 1201 601 593 607 597 603 591 610 594 606 598 603 591 609 1193 1000000 2418 610 594 606 598 602 592 609 595 605 1197 605 1197 605 600 602 592 608 1194 608 596 605 1197 605 1197 604 1198 604 600 601 593 607 1195 607 1195 607 1195 607 597 603 591 13368 2419 610 594 606 598 602 592 608 596 605 1197 604 1198 604 600 601 593 607 1195 607 597 603 1199 603 1199 603 1199 603 591 609 595 605 1197 605 1197 605 1197 604 601 600 594 13362 2425 604 601 600 594 607 597 603 591 610 1192 610 1192 610 594 606 598 603 1199 602 592 609 1193 609 1193 608 1194 608 596 604 601 600 1191 610 1192 610 1192 610 594 607 597 1000000 2427 601 1201 601 593 582 623 603 1199 578 1224 603 1199 577 617 584 620 605 1197 605 600 601 1201 601 1201 601 1201 601 593 582 622 603 1199 603 1199 578 1224 603 591 610 594 12139 2423 605 1197 605 600 601 593 608 1194 608 1194 607 1195 607 597 604 600 601 1201 601 593 607 1195 608 1194 608 1194 583 622 604 601 600 1202 575 1227 601 1201 576 618 607 597 12137 2424 604 1198 604 590 610 594 607 1195 607 1195 607 1195 607 597 604 601 600 1202 600 594 607 1195 606 1196 581 1221 607 597 603 591 610 1202 600 1202 576 1226 602 592 609 595 1000000 2422 607 1195 607 597 603 591 585 619 606 1196 606 1196 581 624 577 617 609 1193 584 621 605 1197 604 1198 604 1198 604 590 610 595 581 1221 605 1197 605 1197 605 599 601 593 12763 2427 603 1199 603 591 609 595 605 599 577 1225 602 1200 601 593 583 622 604 1198 604 590 610 1192 610 1192 610 1192 610 594 606 598 603 1199 603 1199 603 1199 603 591 610 594 12763 2427 602 1200 601 593 608 596 604 600 600 1202 601 1201 601 593 607 597 604 1198 604 590 610 1192 610 1192 611 1191 610 594 607 598 578 1224 603 1199 603 1199 603 591 610 594 1000000 2422 607 597 603 591 610 1192 610 594 606 1196 580 1222 605 600 601 593 583 1219 608 596 579 1223 604 1198 604 1198 604 590 610 594 606 1196 606 1196 606 1196 606 599 602 592 12765 2425 603 591 610 594 606 1196 606 598 602 1200 601 1201 601 593 582 623 604 1198 604 590 610 1192 610 1192 609 1193 609 596 605 599 601 1201 601 1201 601 1201 600 594 607 597 12758 2421 607 597 603 591 609 1193 609 595 605 1197 605 1197 605 599 601 593 607 1195 607 597 603 1199 603 1199 603 1199 603 591 609 595 580 1222 605 1197 605 1197 605 600 600 594 1000000 2422 580 625 601 1201 601 593 608 596 604 1198 604 1198 604 600 600 594 607 1195 607 597 603 1199 603 1199 603 1199 578 616 609 595 606 1196 606 1196 606 1196 581 624 602 592 12766 2424 605 599 601 1201 601 593 608 596 604 1198 604 1198 579 625 601 593 608 1194 608 596 604 1198 580 1222 605 1197 605 599 602 592 608 1194 609 1193 609 1193 609 596 605 599 12759 2420 608 597 604 1198 604 590 610 594 606 1196 606 1196 606 598 602 592 608 1194 607 597 604 1198 603 1199 603 1199 602 592 609 595 605 1197 605 1197 605 1197 604 600 601 593 1000000 2429 600 1202 575 1227 599 595 606 598 602 1200 602 1200 602 592 609 595 605 1197 605 599 601 1201 601 1201 601 1201 601 593 607 597 603 1199 603 1199 603 1199 603 591 609 595 12136 2425 603 1199 603 1199 603 591 609 595 605 1197 605 1197 605 599 601 593 608 1194 608 596 604 1198 604 1198 603 1199 603 591 609 595 606 1196 606 1196 605 1197 605 599 601 593 12137 2424 604 1198 603 1199 603 591 609 595 606 1196 605 1197 605 599 601 593 607 1195 607 597 603 1199 603 1199 603 1199 602 592 609 595 605 1197 605 1197 604 1198 604 600 600 594 1000000 2429 574 1228 573 1229 573 1229 573 1229 573 621 581 624 577 617 583 622 580 1222 579 625 576 1226 577 1225 576 1226 577 617 584 620 581 1221 580 1222 579 1223 579 625 577 617 12142 2419 584 1218 584 1218 583 1219 583 1219 582 623 578 616 585 619 581 623 578 1224 577 617 584 1218 584 1218 584 1218 584 620 580 624 576 1226 575 1227 500 1353 523 620 582 622 12134 2427 576 1226 576 1226 576 1226 576 1226 576 618 583 622 579 625 576 618 583 1219 583 673 527 1223 579 1223 579 1223 579 625 576 618 582 1220 582 1220 582 1220 582 622 578 616 12140 2421 582 1220 581 1221 581 1221 580 1222 580 624 576 618 582 622 578 616 585 1217 584 620 581 1221 580 1222 580 1222 580 624 576 618 582 1220 582 1220 582 1220 582 623 578 616 1000000 2419 584 672 528 625 577 617 583 1219 582 1220 581 1221 582 622 578 616 585 1217 583 621 580 1222 580 1222 580 1222 580 624 576 618 583 1219 583 1219 582 1220 583 621 580 624 12732 2427 577 617 584 672 528 676 524 1226 576 1226 576 1226 576 618 583 621 579 1223 579 625 575 1227 575 1227 575 1227 575 671 529 675 526 1224 578 1224 578 1224 578 616 585 619 12738 2421 583 621 580 624 576 618 582 1220 582 1220 583 1219 583 621 579 625 576 1226 576 670 530 1220 582 1220 582 1220 581 624 577 617 584 1218 583 1219 583 1219 583 622 580 624 1000000 2430 599 1192 609 595 605 1197 580 624 601 1201 601 593 607 597 603 591 610 594 606 598 602 592 608 1194 25958 2423 605 1197 604 600 575 1227 600 594 606 1196 606 598 602 592 608 596 604 601 600 594 607 597 603 1199 25949 2422 607 1195 606 598 603 1199 602 592 608 1194 608 596 604 600 601 593 607 597 604 600 600 594 607 1195 25958 2423 606 1196 606 598 602 1200 602 592 608 1194 608 596 605 600 601 593 607 597 603 591 610 594 606 1196 25957 2425 604 1198 603 591 610 1192 610 594 606 1196 606 598 602 592 609 595 605 599 602 592 608 596 604 1198 25956 2426 604 1198 603 591 610 1192 610 594 606 1196 606 598 602 592 608 597 605 599 601 593 607 597 603 1199 25952 2420 609 1193 608 596 604 1198 604 590 610 1192 610 594 606 598 602 592 608 596 605 599 601 593 607 1195 1000000 2422 583 1219 608 596 605 1197 580 624 601 1201 601 593 608 596 604 600 601 593 607 597 604 590 610 1202 25955 2427 603 1199 603 591 609 1193 610 594 606 1196 607 597 603 591 609 595 606 598 602 592 609 595 605 1197 25957 2425 604 1198 604 590 610 1192 610 594 581 1221 606 598 602 592 608 596 605 599 601 593 607 597 604 1198 25954 2418 610 1192 610 594 606 1196 605 599 601 1201 601 593 608 596 604 590 610 594 606 598 603 591 609 1193 25958 2424 604 1198 604 590 610 1192 610 594 606 1196 606 598 602 592 609 595 605 600 601 593 607 597 603 1199 25953 2419 610 1192 609 595 605 1197 605 600 601 1201 600 594 607 597 603 591 609 595 605 599 601 593 608 1194 25954 2418 611 1191 610 594 606 1196 606 598 602 1200 602 592 608 596 604 601 600 594 607 597 603 591 609 1193 25958 2424 605 1197 605 599 601 1201 600 594 607 1195 607 597 603 591 609 596 605 599 602 592 608 596 605 1197 25954 2428 601 1190 610 594 607 1195 606 598 602 1200 602 592 608 596 604 590 610 594 606 598 603 591 609 1193 25960 2422 607 1195 606 598 602 1200 602 592 609 1193 609 595 605 599 601 593 607 597 604 590 610 594 606 1196 25957 2424 605 1197 604 600 600 1202 601 593 607 1195 607 597 603 591 610 594 606 598 603 591 609 595 606 1196 1000000 2421 608 1194 608 596 604 1198 604 601 575 1227 601 593 607 598 604 600 600 594 607 598 604 601 600 1202 25953 2419 609 1193 609 596 605 1197 605 600 601 1201 601 593 607 597 603 591 610 594 606 599 602 592 608 1194 25958 2424 605 1197 605 600 601 1201 600 594 607 1195 606 598 602 592 609 595 605 600 601 593 608 596 604 1198 1000000 2423 606 1196 606 598 602 1200 602 592 608 1194 608 597 604 590 610 594 607 597 603 591 610 594 606 1196 25958 2424 605 1197 604 600 601 1201 601 593 607 1195 607 597 604 590 610 595 607 597 603 591 610 594 607 1195 25961 2421 608 1194 608 596 605 1197 605 600 601 1201 601 593 607 597 603 591 610 594 606 598 602 592 609 1193 1000000 2429 601 1201 601 593 607 1195 608 596 604 1198 604 600 601 593 607 597 604 590 611 593 607 597 604 1198 25959 2422 607 1195 607 597 603 1199 603 591 609 1193 610 594 606 598 602 592 609 595 605 599 602 592 608 1194 25959 2421 608 1194 607 597 603 1199 603 591 610 1192 610 594 606 598 603 591 609 595 605 599 602 592 608 1194 25959 2422 608 1194 608 596 604 1198 604 590 611 1201 601 593 607 597 604 590 610 594 607 597 603 591 609 1193 25962 2418 610 1192 610 594 606 1196 607 597 603 1199 603 591 609 595 605 599 602 592 608 596 605 599 601 1201 1000000 2357 610 1183 592 1191 614 1179 595 1188 618 584 613 1180 593 588 613 1190 612 590 605 587 613 589 605 587 25398 2355 623 1180 591 1181 627 1186 589 1183 618 584 616 1187 587 584 614 1189 615 587 605 587 615 587 609 593 1000000 2383 609 1214 600 612 580 1213 608 614 583 1210 605 607 586 616 611 1192 599 613 608 614 579 613 615 607 26670 2387 601 1212 600 612 589 1214 603 609 586 1217 595 607 594 618 606 1187 602 610 609 613 588 614 610 612 1000000 2445 582 1221 603 548 602 1191 609 572 602 1191 609 542 607 544 631 1172 603 568 606 545 605 566 608 543 26263 2414 611 1192 607 544 606 1197 602 569 606 1197 602 539 611 540 635 1168 606 565 610 541 608 563 587 564 # name: decoder_expected1 type: parsed_array count: 121 # protocol: SIRC address: 10 00 00 00 command: 15 00 00 00 repeat: false # protocol: SIRC address: 10 00 00 00 command: 15 00 00 00 repeat: false # protocol: SIRC address: 10 00 00 00 command: 15 00 00 00 repeat: false # protocol: SIRC address: 10 00 00 00 command: 15 00 00 00 repeat: false # protocol: SIRC address: 10 00 00 00 command: 15 00 00 00 repeat: false # protocol: SIRC address: 10 00 00 00 command: 15 00 00 00 repeat: false # protocol: SIRC address: 10 00 00 00 command: 60 00 00 00 repeat: false # protocol: SIRC address: 10 00 00 00 command: 60 00 00 00 repeat: false # protocol: SIRC address: 10 00 00 00 command: 60 00 00 00 repeat: false # protocol: SIRC address: 10 00 00 00 command: 65 00 00 00 repeat: false # protocol: SIRC address: 10 00 00 00 command: 65 00 00 00 repeat: false # protocol: SIRC address: 10 00 00 00 command: 65 00 00 00 repeat: false # protocol: SIRC20 address: 10 04 00 00 command: 17 00 00 00 repeat: false # protocol: SIRC20 address: 10 04 00 00 command: 17 00 00 00 repeat: false # protocol: SIRC20 address: 10 04 00 00 command: 17 00 00 00 repeat: false # protocol: SIRC address: 10 00 00 00 command: 21 00 00 00 repeat: false # protocol: SIRC address: 10 00 00 00 command: 21 00 00 00 repeat: false # protocol: SIRC address: 10 00 00 00 command: 21 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 7C 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 7C 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 7C 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 7C 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 7C 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 7C 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 7C 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 7C 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 7C 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 7C 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 7C 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 7C 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 7B 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 7B 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 7B 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 7A 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 7A 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 7A 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 78 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 78 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 78 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 79 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 79 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 79 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 7A 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 7A 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 7A 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 7C 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 7C 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 7C 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 7D 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 7D 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 7D 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 73 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 73 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 73 00 00 00 repeat: false # protocol: SIRC address: 10 00 00 00 command: 13 00 00 00 repeat: false # protocol: SIRC address: 10 00 00 00 command: 13 00 00 00 repeat: false # protocol: SIRC address: 10 00 00 00 command: 13 00 00 00 repeat: false # protocol: SIRC address: 10 00 00 00 command: 13 00 00 00 repeat: false # protocol: SIRC address: 10 00 00 00 command: 12 00 00 00 repeat: false # protocol: SIRC address: 10 00 00 00 command: 12 00 00 00 repeat: false # protocol: SIRC address: 10 00 00 00 command: 12 00 00 00 repeat: false # protocol: SIRC address: 10 00 00 00 command: 12 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 30 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 30 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 30 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 39 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 39 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 39 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 31 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 31 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 31 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 34 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 34 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 34 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 32 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 32 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 32 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 33 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 33 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 33 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 0F 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 0F 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 0F 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 38 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 38 00 00 00 repeat: false # protocol: SIRC20 address: 3A 07 00 00 command: 38 00 00 00 repeat: false # protocol: SIRC address: 10 00 00 00 command: 15 00 00 00 repeat: false # protocol: SIRC address: 10 00 00 00 command: 15 00 00 00 repeat: false # protocol: SIRC address: 10 00 00 00 command: 15 00 00 00 repeat: false # protocol: SIRC address: 10 00 00 00 command: 15 00 00 00 repeat: false # protocol: SIRC address: 10 00 00 00 command: 15 00 00 00 repeat: false # protocol: SIRC address: 10 00 00 00 command: 15 00 00 00 repeat: false # protocol: SIRC address: 10 00 00 00 command: 15 00 00 00 repeat: false # protocol: SIRC address: 10 00 00 00 command: 15 00 00 00 repeat: false # protocol: SIRC address: 10 00 00 00 command: 15 00 00 00 repeat: false # protocol: SIRC address: 10 00 00 00 command: 15 00 00 00 repeat: false # protocol: SIRC address: 10 00 00 00 command: 15 00 00 00 repeat: false # protocol: SIRC address: 10 00 00 00 command: 15 00 00 00 repeat: false # protocol: SIRC address: 10 00 00 00 command: 15 00 00 00 repeat: false # protocol: SIRC address: 10 00 00 00 command: 15 00 00 00 repeat: false # protocol: SIRC address: 10 00 00 00 command: 15 00 00 00 repeat: false # protocol: SIRC address: 10 00 00 00 command: 15 00 00 00 repeat: false # protocol: SIRC address: 10 00 00 00 command: 15 00 00 00 repeat: false # protocol: SIRC address: 10 00 00 00 command: 15 00 00 00 repeat: false # protocol: SIRC address: 10 00 00 00 command: 15 00 00 00 repeat: false # protocol: SIRC address: 10 00 00 00 command: 15 00 00 00 repeat: false # protocol: SIRC address: 10 00 00 00 command: 15 00 00 00 repeat: false # protocol: SIRC address: 10 00 00 00 command: 15 00 00 00 repeat: false # protocol: SIRC address: 10 00 00 00 command: 15 00 00 00 repeat: false # protocol: SIRC address: 10 00 00 00 command: 15 00 00 00 repeat: false # protocol: SIRC address: 10 00 00 00 command: 15 00 00 00 repeat: false # protocol: SIRC address: 10 00 00 00 command: 15 00 00 00 repeat: false # protocol: SIRC address: 10 00 00 00 command: 15 00 00 00 repeat: false # protocol: SIRC address: 10 00 00 00 command: 15 00 00 00 repeat: false # protocol: SIRC address: 10 00 00 00 command: 15 00 00 00 repeat: false # protocol: SIRC address: 01 00 00 00 command: 2F 00 00 00 repeat: false # protocol: SIRC address: 01 00 00 00 command: 2F 00 00 00 repeat: false # protocol: SIRC address: 01 00 00 00 command: 15 00 00 00 repeat: false # protocol: SIRC address: 01 00 00 00 command: 15 00 00 00 repeat: false # protocol: SIRC address: 01 00 00 00 command: 15 00 00 00 repeat: false # protocol: SIRC address: 01 00 00 00 command: 15 00 00 00 repeat: false # name: decoder_input2 type: raw data: 1000000 2400 600 1200 600 600 600 1200 600 600 600 1200 600 600 600 1200 600 600 600 1200 600 600 600 1200 600 600 1000000 2400 600 1200 600 600 600 1200 600 600 600 1200 600 600 600 1200 600 600 600 1200 600 600 600 1200 600 600 1000000 2400 600 1200 600 600 600 1200 600 600 600 1200 600 600 600 1200 600 600 600 1200 600 600 600 1200 600 600 1000000 2400 600 1200 600 600 600 1200 600 600 600 1200 600 600 600 1200 600 600 600 1200 600 600 600 1200 600 600 600 600 1000000 2400 600 1200 600 1200 600 1200 600 1200 600 1200 600 1200 600 1200 600 1200 600 1200 600 1200 600 1200 600 1200 1000000 2400 600 1200 600 600 1000000 2400 600 1200 600 1200 600 1200 600 1200 600 1200 600 1200 600 1200 600 1200 600 1200 600 1200 600 1200 600 1200 1000000 2400 600 1200 600 2400 600 1200 600 1200 600 1200 600 1200 600 1200 600 1200 600 1200 600 1200 600 1200 600 1200 600 1200 600 1200 1000000 2400 600 1200 600 600 1000000 2400 600 1200 600 600 600 1200 600 600 600 1200 600 600 600 1200 600 600 600 1200 600 600 600 1200 600 600 1000000 2400 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 1000000 2400 600 1200 600 1200 600 600 600 600 600 1200 600 600 600 1200 600 1200 600 600 600 1200 600 1200 600 600 600 # name: decoder_expected2 type: parsed_array count: 9 # protocol: SIRC address: 0A 00 00 00 command: 55 00 00 00 repeat: false # protocol: SIRC address: 0A 00 00 00 command: 55 00 00 00 repeat: false # protocol: SIRC address: 0A 00 00 00 command: 55 00 00 00 repeat: false # protocol: SIRC address: 1F 00 00 00 command: 7F 00 00 00 repeat: false # protocol: SIRC address: 1F 00 00 00 command: 7F 00 00 00 repeat: false # protocol: SIRC address: 1F 00 00 00 command: 7F 00 00 00 repeat: false # protocol: SIRC address: 0A 00 00 00 command: 55 00 00 00 repeat: false # protocol: SIRC address: 00 00 00 00 command: 00 00 00 00 repeat: false # protocol: SIRC address: 0D 00 00 00 command: 53 00 00 00 repeat: false # name: decoder_input3 type: raw data: 1000000 2400 600 1200 600 1200 600 600 600 600 600 1200 600 600 600 1200 600 1200 600 600 600 1200 600 1200 600 1200 600 1200 600 1200 600 600 10000 2400 600 1200 600 1200 600 600 600 600 600 1200 600 600 600 1200 600 1200 600 600 600 1200 600 1200 600 1200 600 1200 600 1200 600 600 10000 2400 600 1200 600 1200 600 600 600 600 600 1200 600 600 600 1200 600 1200 600 600 600 1200 600 1200 600 1200 600 1200 600 1200 600 600 1000000 2400 600 1200 600 1200 600 600 600 600 600 1200 600 600 600 1200 600 1200 600 600 600 1200 600 1200 600 600 600 600 600 600 600 600 10000 2400 600 1200 600 1200 600 600 600 600 600 1200 600 600 600 1200 600 1200 600 600 600 1200 600 1200 600 600 600 600 600 600 600 600 10000 2400 600 1200 600 1200 600 600 600 600 600 1200 600 600 600 1200 600 1200 600 600 600 1200 600 1200 600 600 600 600 600 600 600 600 1000000 2400 600 1200 600 1200 600 600 600 600 600 1200 600 600 600 1200 600 1200 600 600 600 1200 600 1200 600 600 600 600 600 600 600 600 1000000 2400 600 1200 600 1200 600 600 600 600 600 1200 600 600 600 1200 600 1200 600 600 600 1200 600 1200 600 600 600 600 600 600 600 600 1000000 2400 600 1200 600 1200 600 600 600 600 600 1200 600 600 600 1200 600 1200 600 600 600 1200 600 1200 600 1200 600 1200 600 1200 600 600 1000000 2400 600 1200 600 1200 600 600 600 600 600 1200 600 600 600 1200 600 1200 600 600 600 1200 600 1200 600 1200 600 1200 600 1200 600 600 10000 2400 600 1200 600 1200 600 600 600 600 600 1200 600 600 600 600 600 1200 600 600 600 1200 600 1200 600 1200 600 1200 600 1200 600 1200 # name: decoder_expected3 type: parsed_array count: 11 # protocol: SIRC15 address: 7D 00 00 00 command: 53 00 00 00 repeat: false # protocol: SIRC15 address: 7D 00 00 00 command: 53 00 00 00 repeat: false # protocol: SIRC15 address: 7D 00 00 00 command: 53 00 00 00 repeat: false # protocol: SIRC15 address: 0D 00 00 00 command: 53 00 00 00 repeat: false # protocol: SIRC15 address: 0D 00 00 00 command: 53 00 00 00 repeat: false # protocol: SIRC15 address: 0D 00 00 00 command: 53 00 00 00 repeat: false # protocol: SIRC15 address: 0D 00 00 00 command: 53 00 00 00 repeat: false # protocol: SIRC15 address: 0D 00 00 00 command: 53 00 00 00 repeat: false # protocol: SIRC15 address: 7D 00 00 00 command: 53 00 00 00 repeat: false # protocol: SIRC15 address: 7D 00 00 00 command: 53 00 00 00 repeat: false # protocol: SIRC15 address: FD 00 00 00 command: 13 00 00 00 repeat: false # name: decoder_input4 type: raw data: 1000000 2400 600 1200 600 1200 600 600 600 600 600 1200 600 600 600 1200 600 1200 600 600 600 1200 600 600 600 1200 600 1200 600 600 600 1200 600 1200 600 1200 600 1200 600 1200 600 600 10000 2400 600 1200 600 1200 600 600 600 600 600 1200 600 600 600 1200 600 1200 600 600 600 1200 600 600 600 1200 600 1200 600 600 600 1200 600 1200 600 1200 600 1200 600 1200 600 600 10000 2400 600 1200 600 1200 600 600 600 600 600 1200 600 600 600 1200 600 1200 600 600 600 1200 600 600 600 1200 600 1200 600 600 600 1200 600 1200 600 1200 600 1200 600 1200 600 600 1000000 2400 600 1200 600 1200 600 600 600 600 600 1200 600 600 600 1200 600 1200 600 600 600 1200 600 600 600 1200 600 1200 600 600 600 1200 600 1200 600 1200 600 1200 600 1200 600 600 1000000 2400 600 1200 600 1200 600 600 600 600 600 1200 600 600 600 1200 600 1200 600 600 600 1200 600 600 600 1200 600 1200 600 600 600 1200 600 1200 600 1200 600 1200 600 1200 600 600 1000000 2400 600 1200 600 1200 600 600 600 600 600 1200 600 600 600 1200 600 1200 600 600 600 1200 600 600 600 1200 600 1200 600 600 600 1200 600 1200 600 1200 600 1200 600 1200 600 600 # name: decoder_expected4 type: parsed_array count: 6 # protocol: SIRC20 address: B5 0F 00 00 command: 53 00 00 00 repeat: false # protocol: SIRC20 address: B5 0F 00 00 command: 53 00 00 00 repeat: false # protocol: SIRC20 address: B5 0F 00 00 command: 53 00 00 00 repeat: false # protocol: SIRC20 address: B5 0F 00 00 command: 53 00 00 00 repeat: false # protocol: SIRC20 address: B5 0F 00 00 command: 53 00 00 00 repeat: false # protocol: SIRC20 address: B5 0F 00 00 command: 53 00 00 00 repeat: false # name: decoder_input5 type: raw data: 1000000 2400 600 1200 600 1200 600 600 600 600 600 1200 600 600 600 1200 600 1200 600 600 600 1200 600 600 600 1200 600 1200 600 600 600 1200 600 1200 600 1200 600 1200 600 1200 600 600 1000000 2400 600 1200 600 1200 600 600 600 600 600 1200 600 600 600 1200 600 1200 600 600 600 1200 600 1200 600 1200 600 1200 600 1200 600 600 1000000 2400 600 1200 600 600 600 1200 600 600 600 1200 600 600 600 1200 600 600 600 1200 600 600 600 1200 600 600 1000000 2400 600 1200 600 1200 600 600 600 600 600 1200 600 600 600 1200 600 1200 600 600 600 1200 600 600 600 1200 600 1200 600 600 600 1200 600 1200 600 1200 600 1200 600 1200 600 600 1000000 2400 600 1200 600 1200 600 600 600 600 600 1200 600 600 600 1200 600 1200 600 600 600 1200 600 1200 600 1200 600 1200 600 1200 600 600 1000000 2400 600 1200 600 600 600 1200 600 600 600 1200 600 600 600 1200 600 600 600 1200 600 600 600 1200 600 600 10000 2400 600 1200 600 1200 600 600 600 600 600 1200 600 600 600 1200 600 1200 600 600 600 1200 600 600 600 1200 600 1200 600 600 600 1200 600 1200 600 1200 600 1200 600 1200 600 600 10000 2400 600 1200 600 1200 600 600 600 600 600 1200 600 600 600 1200 600 1200 600 600 600 1200 600 1200 600 1200 600 1200 600 1200 600 600 10000 2400 600 1200 600 600 600 1200 600 600 600 1200 600 600 600 1200 600 600 600 1200 600 600 600 1200 600 600 10000 2400 600 1200 600 1200 600 600 600 600 600 1200 600 600 600 1200 600 1200 600 600 600 1200 600 600 600 1200 600 1200 600 600 600 1200 600 1200 600 1200 600 1200 600 1200 600 600 10000 2400 600 1200 600 1200 600 600 600 600 600 1200 600 600 600 1200 600 1200 600 600 600 1200 600 1200 600 1200 600 1200 600 1200 600 600 10000 2400 600 1200 600 600 600 1200 600 600 600 1200 600 600 600 1200 600 600 600 1200 600 600 600 1200 600 600 10000 2400 600 1200 600 1200 600 600 600 600 600 1200 600 600 600 1200 600 1200 600 600 600 1200 600 600 600 1200 600 1200 600 600 600 1200 600 1200 600 1200 600 1200 600 1200 600 600 10000 2400 600 1200 600 1200 600 600 600 600 600 1200 600 600 600 1200 600 1200 600 600 600 1200 600 600 600 1200 600 1200 600 600 600 1200 600 1200 600 1200 600 1200 600 1200 600 600 10000 2400 600 1200 600 1200 600 600 600 600 600 1200 600 600 600 1200 600 1200 600 600 600 1200 600 1200 600 1200 600 1200 600 1200 600 600 10000 2400 600 1200 600 1200 600 600 600 600 600 1200 600 600 600 1200 600 1200 600 600 600 1200 600 1200 600 1200 600 1200 600 1200 600 600 10000 2400 600 1200 600 600 600 1200 600 600 600 1200 600 600 600 1200 600 600 600 1200 600 600 600 1200 600 600 10000 2400 600 1200 600 600 600 1200 600 600 600 1200 600 600 600 1200 600 600 600 1200 600 600 600 1200 600 600 10000 2400 600 1200 600 600 600 1200 600 600 600 1200 600 600 600 1200 600 600 600 1200 600 600 600 1200 600 600 10000 2400 600 1200 600 1200 600 600 600 600 600 1200 600 600 600 1200 600 1200 600 600 600 1200 600 1200 600 1200 600 1200 600 1200 600 600 10000 2400 600 1200 600 1200 600 600 600 600 600 1200 600 600 600 1200 600 1200 600 600 600 1200 600 600 600 1200 600 1200 600 600 600 1200 600 1200 600 1200 600 1200 600 1200 600 600 10000 2400 600 1200 600 600 600 1200 600 600 600 1200 600 600 600 1200 600 600 600 1200 600 600 600 1200 600 600 10000 2400 600 1200 600 1200 600 600 600 600 600 1200 600 600 600 1200 600 1200 600 600 600 1200 600 1200 600 1200 600 1200 600 1200 600 600 10000 2400 600 1200 600 1200 600 600 600 600 600 1200 600 600 600 1200 600 1200 600 600 600 1200 600 600 600 1200 600 1200 600 600 600 1200 600 1200 600 1200 600 1200 600 1200 600 600 # name: decoder_expected5 type: parsed_array count: 24 # protocol: SIRC20 address: B5 0F 00 00 command: 53 00 00 00 repeat: false # protocol: SIRC15 address: 7D 00 00 00 command: 53 00 00 00 repeat: false # protocol: SIRC address: 0A 00 00 00 command: 55 00 00 00 repeat: false # protocol: SIRC20 address: B5 0F 00 00 command: 53 00 00 00 repeat: false # protocol: SIRC15 address: 7D 00 00 00 command: 53 00 00 00 repeat: false # protocol: SIRC address: 0A 00 00 00 command: 55 00 00 00 repeat: false # protocol: SIRC20 address: B5 0F 00 00 command: 53 00 00 00 repeat: false # protocol: SIRC15 address: 7D 00 00 00 command: 53 00 00 00 repeat: false # protocol: SIRC address: 0A 00 00 00 command: 55 00 00 00 repeat: false # protocol: SIRC20 address: B5 0F 00 00 command: 53 00 00 00 repeat: false # protocol: SIRC15 address: 7D 00 00 00 command: 53 00 00 00 repeat: false # protocol: SIRC address: 0A 00 00 00 command: 55 00 00 00 repeat: false # protocol: SIRC20 address: B5 0F 00 00 command: 53 00 00 00 repeat: false # protocol: SIRC20 address: B5 0F 00 00 command: 53 00 00 00 repeat: false # protocol: SIRC15 address: 7D 00 00 00 command: 53 00 00 00 repeat: false # protocol: SIRC15 address: 7D 00 00 00 command: 53 00 00 00 repeat: false # protocol: SIRC address: 0A 00 00 00 command: 55 00 00 00 repeat: false # protocol: SIRC address: 0A 00 00 00 command: 55 00 00 00 repeat: false # protocol: SIRC address: 0A 00 00 00 command: 55 00 00 00 repeat: false # protocol: SIRC15 address: 7D 00 00 00 command: 53 00 00 00 repeat: false # protocol: SIRC20 address: B5 0F 00 00 command: 53 00 00 00 repeat: false # protocol: SIRC address: 0A 00 00 00 command: 55 00 00 00 repeat: false # protocol: SIRC15 address: 7D 00 00 00 command: 53 00 00 00 repeat: false # protocol: SIRC20 address: B5 0F 00 00 command: 53 00 00 00 repeat: false # name: encoder_input1 type: parsed_array count: 1 # protocol: SIRC address: 0A 00 00 00 command: 55 00 00 00 repeat: false # name: encoder_expected1 type: raw data: 10000 2400 600 1200 600 600 600 1200 600 600 600 1200 600 600 600 1200 600 600 600 1200 600 600 600 1200 600 600 # name: encoder_input2 type: parsed_array count: 3 # protocol: SIRC15 address: 7D 00 00 00 command: 53 00 00 00 repeat: false # protocol: SIRC15 address: 7D 00 00 00 command: 53 00 00 00 repeat: true # protocol: SIRC15 address: 7D 00 00 00 command: 53 00 00 00 repeat: true # name: encoder_expected2 type: raw data: 10000 2400 600 1200 600 1200 600 600 600 600 600 1200 600 600 600 1200 600 1200 600 600 600 1200 600 1200 600 1200 600 1200 600 1200 600 600 18600 2400 600 1200 600 1200 600 600 600 600 600 1200 600 600 600 1200 600 1200 600 600 600 1200 600 1200 600 1200 600 1200 600 1200 600 600 18600 2400 600 1200 600 1200 600 600 600 600 600 1200 600 600 600 1200 600 1200 600 600 600 1200 600 1200 600 1200 600 1200 600 1200 600 600 # name: encoder_decoder_input1 type: parsed_array count: 24 # protocol: SIRC20 address: FF 1F 00 00 command: 7F 00 00 00 repeat: false # protocol: SIRC20 address: FF 1F 00 00 command: 7F 00 00 00 repeat: true # protocol: SIRC20 address: FF 1F 00 00 command: 7F 00 00 00 repeat: true # protocol: SIRC address: 00 00 00 00 command: 00 00 00 00 repeat: false # protocol: SIRC address: 00 00 00 00 command: 00 00 00 00 repeat: true # protocol: SIRC address: 00 00 00 00 command: 00 00 00 00 repeat: true # protocol: SIRC address: 1A 00 00 00 command: 22 00 00 00 repeat: false # protocol: SIRC address: 1A 00 00 00 command: 22 00 00 00 repeat: true # protocol: SIRC address: 1A 00 00 00 command: 22 00 00 00 repeat: true # protocol: SIRC address: 17 00 00 00 command: 0A 00 00 00 repeat: false # protocol: SIRC15 address: 7D 00 00 00 command: 53 00 00 00 repeat: false # protocol: SIRC15 address: 7D 00 00 00 command: 53 00 00 00 repeat: true # protocol: SIRC15 address: 7D 00 00 00 command: 53 00 00 00 repeat: true # protocol: SIRC15 address: 71 00 00 00 command: 00 00 00 00 repeat: false # protocol: SIRC15 address: 15 00 00 00 command: 01 00 00 00 repeat: false # protocol: SIRC15 address: 01 00 00 00 command: 15 00 00 00 repeat: false # protocol: SIRC20 address: AA 00 00 00 command: 55 00 00 00 repeat: false # protocol: SIRC20 address: 31 03 00 00 command: 71 00 00 00 repeat: false # protocol: SIRC address: 00 00 00 00 command: 00 00 00 00 repeat: false # protocol: SIRC address: 1F 00 00 00 command: 7F 00 00 00 repeat: false # protocol: SIRC15 address: 00 00 00 00 command: 00 00 00 00 repeat: false # protocol: SIRC15 address: FF 00 00 00 command: 7F 00 00 00 repeat: false # protocol: SIRC20 address: 00 00 00 00 command: 00 00 00 00 repeat: false # protocol: SIRC20 address: FF 1F 00 00 command: 7F 00 00 00 repeat: false # ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/js/basic.js ================================================ let tests = require("tests"); let flipper = require("flipper"); tests.assert_eq(1337, 1337); tests.assert_eq("hello", "hello"); tests.assert_eq("compatible", sdkCompatibilityStatus(1, 0)); tests.assert_eq("firmwareTooOld", sdkCompatibilityStatus(100500, 0)); tests.assert_eq("firmwareTooNew", sdkCompatibilityStatus(-100500, 0)); tests.assert_eq(true, doesSdkSupport(["baseline"])); tests.assert_eq(false, doesSdkSupport(["abobus", "other-nonexistent-feature"])); tests.assert_eq("flipperdevices", flipper.firmwareVendor); tests.assert_eq(1, flipper.jsSdkVersion[0]); tests.assert_eq(0, flipper.jsSdkVersion[1]); ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/js/event_loop.js ================================================ let tests = require("tests"); let event_loop = require("event_loop"); let ext = { i: 0, received: false, }; let queue = event_loop.queue(16); event_loop.subscribe(queue.input, function (_, item, tests, ext) { tests.assert_eq(123, item); ext.received = true; }, tests, ext); event_loop.subscribe(event_loop.timer("periodic", 1), function (_, _item, queue, counter, ext) { ext.i++; queue.send(123); if (counter === 10) event_loop.stop(); return [queue, counter + 1, ext]; }, queue, 1, ext); event_loop.subscribe(event_loop.timer("oneshot", 1000), function (_, _item, tests) { tests.fail("event loop was not stopped"); }, tests); event_loop.run(); tests.assert_eq(10, ext.i); tests.assert_eq(true, ext.received); ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/js/math.js ================================================ let tests = require("tests"); let math = require("math"); // math.EPSILON on Flipper Zero is 2.22044604925031308085e-16 // basics tests.assert_float_close(5, math.abs(-5), math.EPSILON); tests.assert_float_close(0.5, math.abs(-0.5), math.EPSILON); tests.assert_float_close(5, math.abs(5), math.EPSILON); tests.assert_float_close(0.5, math.abs(0.5), math.EPSILON); tests.assert_float_close(3, math.cbrt(27), math.EPSILON); tests.assert_float_close(6, math.ceil(5.3), math.EPSILON); tests.assert_float_close(31, math.clz32(1), math.EPSILON); tests.assert_float_close(5, math.floor(5.7), math.EPSILON); tests.assert_float_close(5, math.max(3, 5), math.EPSILON); tests.assert_float_close(3, math.min(3, 5), math.EPSILON); tests.assert_float_close(-1, math.sign(-5), math.EPSILON); tests.assert_float_close(5, math.trunc(5.7), math.EPSILON); // trig tests.assert_float_close(1.0471975511965976, math.acos(0.5), math.EPSILON); tests.assert_float_close(1.3169578969248166, math.acosh(2), math.EPSILON); tests.assert_float_close(0.5235987755982988, math.asin(0.5), math.EPSILON); tests.assert_float_close(1.4436354751788103, math.asinh(2), math.EPSILON); tests.assert_float_close(0.7853981633974483, math.atan(1), math.EPSILON); tests.assert_float_close(0.7853981633974483, math.atan2(1, 1), math.EPSILON); tests.assert_float_close(0.5493061443340549, math.atanh(0.5), math.EPSILON); tests.assert_float_close(-1, math.cos(math.PI), math.EPSILON * 18); // Error 3.77475828372553223744e-15 tests.assert_float_close(1, math.sin(math.PI / 2), math.EPSILON * 4.5); // Error 9.99200722162640886381e-16 // powers tests.assert_float_close(5, math.sqrt(25), math.EPSILON); tests.assert_float_close(8, math.pow(2, 3), math.EPSILON); tests.assert_float_close(2.718281828459045, math.exp(1), math.EPSILON * 2); // Error 4.44089209850062616169e-16 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/js/storage.js ================================================ let storage = require("storage"); let tests = require("tests"); let baseDir = "/ext/.tmp/unit_tests"; tests.assert_eq(true, storage.rmrf(baseDir)); tests.assert_eq(true, storage.makeDirectory(baseDir)); // write let file = storage.openFile(baseDir + "/helloworld", "w", "create_always"); tests.assert_eq(true, !!file); tests.assert_eq(true, file.isOpen()); tests.assert_eq(13, file.write("Hello, World!")); tests.assert_eq(true, file.close()); tests.assert_eq(false, file.isOpen()); // read file = storage.openFile(baseDir + "/helloworld", "r", "open_existing"); tests.assert_eq(true, !!file); tests.assert_eq(true, file.isOpen()); tests.assert_eq(13, file.size()); tests.assert_eq("Hello, World!", file.read("ascii", 128)); tests.assert_eq(true, file.close()); tests.assert_eq(false, file.isOpen()); // seek file = storage.openFile(baseDir + "/helloworld", "r", "open_existing"); tests.assert_eq(true, !!file); tests.assert_eq(true, file.isOpen()); tests.assert_eq(13, file.size()); tests.assert_eq("Hello, World!", file.read("ascii", 128)); tests.assert_eq(true, file.seekAbsolute(1)); tests.assert_eq(true, file.seekRelative(2)); tests.assert_eq(3, file.tell()); tests.assert_eq(false, file.eof()); tests.assert_eq("lo, World!", file.read("ascii", 128)); tests.assert_eq(true, file.eof()); tests.assert_eq(true, file.close()); tests.assert_eq(false, file.isOpen()); // byte-level copy let src = storage.openFile(baseDir + "/helloworld", "r", "open_existing"); let dst = storage.openFile(baseDir + "/helloworld2", "rw", "create_always"); tests.assert_eq(true, !!src); tests.assert_eq(true, src.isOpen()); tests.assert_eq(true, !!dst); tests.assert_eq(true, dst.isOpen()); tests.assert_eq(true, src.copyTo(dst, 10)); tests.assert_eq(true, dst.seekAbsolute(0)); tests.assert_eq("Hello, Wor", dst.read("ascii", 128)); tests.assert_eq(true, src.copyTo(dst, 3)); tests.assert_eq(true, dst.seekAbsolute(0)); tests.assert_eq("Hello, World!", dst.read("ascii", 128)); tests.assert_eq(true, src.eof()); tests.assert_eq(true, src.close()); tests.assert_eq(false, src.isOpen()); tests.assert_eq(true, dst.eof()); tests.assert_eq(true, dst.close()); tests.assert_eq(false, dst.isOpen()); // truncate tests.assert_eq(true, storage.copy(baseDir + "/helloworld", baseDir + "/helloworld2")); file = storage.openFile(baseDir + "/helloworld2", "w", "open_existing"); tests.assert_eq(true, !!file); tests.assert_eq(true, file.seekAbsolute(5)); tests.assert_eq(true, file.truncate()); tests.assert_eq(true, file.close()); file = storage.openFile(baseDir + "/helloworld2", "r", "open_existing"); tests.assert_eq(true, !!file); tests.assert_eq("Hello", file.read("ascii", 128)); tests.assert_eq(true, file.close()); // existence tests.assert_eq(true, storage.fileExists(baseDir + "/helloworld")); tests.assert_eq(true, storage.fileExists(baseDir + "/helloworld2")); tests.assert_eq(false, storage.fileExists(baseDir + "/sus_amogus_123")); tests.assert_eq(false, storage.directoryExists(baseDir + "/helloworld")); tests.assert_eq(false, storage.fileExists(baseDir)); tests.assert_eq(true, storage.directoryExists(baseDir)); tests.assert_eq(true, storage.fileOrDirExists(baseDir)); tests.assert_eq(true, storage.remove(baseDir + "/helloworld2")); tests.assert_eq(false, storage.fileExists(baseDir + "/helloworld2")); // stat let stat = storage.stat(baseDir + "/helloworld"); tests.assert_eq(true, !!stat); tests.assert_eq(baseDir + "/helloworld", stat.path); tests.assert_eq(false, stat.isDirectory); tests.assert_eq(13, stat.size); // rename tests.assert_eq(true, storage.fileExists(baseDir + "/helloworld")); tests.assert_eq(false, storage.fileExists(baseDir + "/helloworld123")); tests.assert_eq(true, storage.rename(baseDir + "/helloworld", baseDir + "/helloworld123")); tests.assert_eq(false, storage.fileExists(baseDir + "/helloworld")); tests.assert_eq(true, storage.fileExists(baseDir + "/helloworld123")); tests.assert_eq(true, storage.rename(baseDir + "/helloworld123", baseDir + "/helloworld")); tests.assert_eq(true, storage.fileExists(baseDir + "/helloworld")); tests.assert_eq(false, storage.fileExists(baseDir + "/helloworld123")); // copy tests.assert_eq(true, storage.fileExists(baseDir + "/helloworld")); tests.assert_eq(false, storage.fileExists(baseDir + "/helloworld123")); tests.assert_eq(true, storage.copy(baseDir + "/helloworld", baseDir + "/helloworld123")); tests.assert_eq(true, storage.fileExists(baseDir + "/helloworld")); tests.assert_eq(true, storage.fileExists(baseDir + "/helloworld123")); // next avail tests.assert_eq("helloworld1", storage.nextAvailableFilename(baseDir, "helloworld", "", 20)); // fs info let fsInfo = storage.fsInfo("/ext"); tests.assert_eq(true, !!fsInfo); tests.assert_eq(true, fsInfo.freeSpace < fsInfo.totalSpace); // idk \(-_-)/ fsInfo = storage.fsInfo("/int"); tests.assert_eq(true, !!fsInfo); tests.assert_eq(true, fsInfo.freeSpace < fsInfo.totalSpace); // path operations tests.assert_eq(true, storage.arePathsEqual("/ext/test", "/ext/Test")); tests.assert_eq(false, storage.arePathsEqual("/ext/test", "/ext/Testttt")); tests.assert_eq(true, storage.isSubpathOf("/ext/test", "/ext/test/sub")); tests.assert_eq(false, storage.isSubpathOf("/ext/test/sub", "/ext/test")); // dir let entries = storage.readDirectory(baseDir); tests.assert_eq(true, !!entries); // FIXME: (-nofl) this test suite assumes that files are listed by // `readDirectory` in the exact order that they were created, which is not // something that is actually guaranteed. // Possible solution: sort and compare the array. tests.assert_eq("helloworld", entries[0].path); tests.assert_eq("helloworld123", entries[1].path); tests.assert_eq(true, storage.rmrf(baseDir)); tests.assert_eq(true, storage.makeDirectory(baseDir)); ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/nfc/Felica.nfc ================================================ Filetype: Flipper NFC device Version: 4 # Device type can be ISO14443-3A, ISO14443-3B, ISO14443-4A, ISO14443-4B, ISO15693-3, FeliCa, NTAG/Ultralight, Mifare Classic, Mifare DESFire, SLIX, ST25TB Device type: FeliCa # UID is common for all formats UID: 29 9F FA 53 AB 75 87 6E # FeliCa specific data Data format version: 1 Manufacture id: 29 9F FA 53 AB 75 87 6E Manufacture parameter: 00 F1 00 00 00 01 43 00 Blocks total: 28 Blocks read: 28 Block 0: 00 00 DE AD BE AF 00 00 00 00 00 00 00 00 DE AD BE AF Block 1: 00 00 00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF Block 2: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block 3: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block 4: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block 5: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block 6: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block 7: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block 8: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block 9: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block 10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block 11: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block 12: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block 13: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block 14: 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF Block 15: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block 16: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block 17: 00 00 29 9F FA 53 AB 75 87 6E 57 4E 10 2A 94 16 BC 8E Block 18: 00 00 29 9F FA 53 AB 75 87 6E 00 F1 00 00 00 01 43 00 Block 19: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block 20: 00 00 88 B4 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block 21: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block 22: 00 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF Block 23: 00 00 FF FF FF 00 FF 00 10 00 00 00 00 00 00 00 00 00 Block 24: 00 00 24 FE FF 00 00 00 00 00 00 00 00 00 00 00 00 00 Block 25: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block 26: 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Block 27: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/nfc/Ntag213_locked.nfc ================================================ Filetype: Flipper NFC device Version: 3 # Nfc device type can be UID, Mifare Ultralight, Mifare Classic Device type: NTAG213 # UID, ATQA and SAK are common for all formats UID: 04 AC 6B 72 BA 6C 80 ATQA: 00 44 SAK: 00 # Mifare Ultralight specific data Data format version: 1 Signature: 2D AE BC AF 84 B8 85 87 C2 FB FE 76 13 58 86 72 8E 1D 3C B5 DA 24 23 44 E5 63 4D 4C 82 FB D7 18 Mifare version: 00 04 04 02 01 00 0F 03 Counter 0: 0 Tearing 0: 00 Counter 1: 0 Tearing 1: 00 Counter 2: 0 Tearing 2: 00 Pages total: 45 Pages read: 45 Page 0: 04 AC 6B 4B Page 1: 72 BA 6C 80 Page 2: 24 48 00 00 Page 3: E1 10 12 00 Page 4: 00 00 41 50 Page 5: 00 00 31 31 Page 6: 00 20 09 28 Page 7: 00 03 31 59 Page 8: 91 DF D3 00 Page 9: 00 00 00 00 Page 10: 00 00 00 00 Page 11: 00 00 00 00 Page 12: 00 00 00 00 Page 13: 00 00 00 00 Page 14: 00 00 00 00 Page 15: 00 00 00 00 Page 16: 00 00 00 00 Page 17: 00 00 00 00 Page 18: 00 00 00 00 Page 19: 00 00 00 00 Page 20: 00 00 00 00 Page 21: 00 00 00 00 Page 22: 00 00 00 00 Page 23: 00 00 00 00 Page 24: 00 00 00 00 Page 25: 00 00 00 00 Page 26: 00 00 00 00 Page 27: 00 00 00 00 Page 28: 00 00 00 00 Page 29: 00 00 00 00 Page 30: 00 00 00 00 Page 31: 00 00 00 00 Page 32: 00 00 00 00 Page 33: 00 00 00 00 Page 34: 00 00 00 00 Page 35: 00 00 00 00 Page 36: 00 00 00 00 Page 37: 00 00 00 00 Page 38: 00 00 00 00 Page 39: 00 00 00 00 Page 40: 00 00 00 BD Page 41: 04 00 00 04 Page 42: C0 05 00 00 Page 43: 95 3F 52 FF Page 44: 00 00 00 00 Failed authentication attempts: 0 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/nfc/Ntag215.nfc ================================================ Filetype: Flipper NFC device Version: 3 # Nfc device type can be UID, Mifare Ultralight, Mifare Classic Device type: NTAG215 # UID, ATQA and SAK are common for all formats UID: 04 51 5C FA 6F 73 81 ATQA: 00 44 SAK: 00 # Mifare Ultralight specific data Data format version: 1 Signature: 42 21 E4 6C 79 6A 81 5E EA 0D 93 6D 85 EE 4B 0C 2A 00 D5 77 F1 C5 67 F3 63 75 F8 EB 86 48 5E 6B Mifare version: 00 04 04 02 01 00 11 03 Counter 0: 0 Tearing 0: 00 Counter 1: 0 Tearing 1: 00 Counter 2: 00 Tearing 2: 00 Pages total: 135 Pages read: 135 Page 0: 04 51 5C 81 Page 1: FA 6F 73 81 Page 2: 67 48 0F E0 Page 3: F1 10 FF EE Page 4: A5 00 00 00 Page 5: 90 42 74 71 Page 6: FD 8F 50 61 Page 7: C5 65 1B 54 Page 8: EF 68 D0 8E Page 9: 3D 35 DB 83 Page 10: D3 00 29 F6 Page 11: 42 2A A5 5C Page 12: F1 69 0A FC Page 13: B6 44 E9 6B Page 14: 77 41 88 81 Page 15: 86 31 CB AD Page 16: B1 DE F1 AB Page 17: DF 96 C2 C5 Page 18: C1 26 99 96 Page 19: 85 AF 9F 0E Page 20: 58 FE ED DC Page 21: 0A 0A 00 01 Page 22: 03 C1 05 02 Page 23: 38 39 34 33 Page 24: 49 2D 4E 5C Page 25: 5B 21 0F 44 Page 26: 3F 3F 76 69 Page 27: B4 72 D8 38 Page 28: A0 35 53 51 Page 29: 53 EB A6 7C Page 30: 3E 8B 97 C0 Page 31: 00 7A 45 13 Page 32: 3A 8B D4 0F Page 33: 31 C2 32 CC Page 34: B4 24 A6 1B Page 35: D3 F5 4A 1F Page 36: CD 8F 1D 64 Page 37: 01 F4 DF C2 Page 38: 11 16 C2 C5 Page 39: 30 6D 49 AF Page 40: 10 D4 7C 3C Page 41: 6E 36 4E 08 Page 42: 95 76 BC 84 Page 43: 35 50 DD F0 Page 44: 21 0F EE D9 Page 45: 85 19 54 5F Page 46: 3E A9 04 20 Page 47: 1B 97 E4 39 Page 48: FF 0A 45 F6 Page 49: 13 D4 3E DD Page 50: 97 42 FC 67 Page 51: 6A AC 78 96 Page 52: D1 DA 25 23 Page 53: BF 4D B3 76 Page 54: F1 21 ED 15 Page 55: BD 55 11 C4 Page 56: 4E 8C E9 23 Page 57: C0 C4 6D 5A Page 58: 58 25 FF 95 Page 59: 3C 2B 7A 57 Page 60: 66 BE A0 61 Page 61: BC FC 4A 31 Page 62: 4D AC EE 81 Page 63: BE 1A 86 04 Page 64: F6 D7 5E B3 Page 65: E7 A8 A2 86 Page 66: E9 40 AB 47 Page 67: C8 36 E4 3E Page 68: A7 4D D3 EA Page 69: 83 9A 64 F7 Page 70: 96 6B 5D BF Page 71: 4E A2 A6 0F Page 72: BD 3D BE 7C Page 73: 22 0C 68 51 Page 74: 0F 9A B8 AE Page 75: 38 2C C4 CD Page 76: 53 D8 DD 18 Page 77: A6 5D 35 87 Page 78: C9 6D 99 59 Page 79: 61 9F B6 DC Page 80: E6 22 0F 99 Page 81: 39 82 79 60 Page 82: 58 2E BE F7 Page 83: EF F7 95 62 Page 84: D5 06 1B 58 Page 85: 65 05 A9 08 Page 86: 75 ED 5D 90 Page 87: 5A E1 7E C9 Page 88: 35 D6 29 BB Page 89: D0 67 6C F9 Page 90: A0 FF 0B 93 Page 91: 22 EA A3 3F Page 92: E2 BD BD 58 Page 93: BE 93 D9 94 Page 94: 41 CC 7E 40 Page 95: E6 8C 5A 43 Page 96: 65 C1 24 94 Page 97: B9 97 61 13 Page 98: AD 74 FF 21 Page 99: 0F EC F6 03 Page 100: 89 5D 89 E5 Page 101: 8D 11 F8 D7 Page 102: 33 43 79 2E Page 103: 23 E5 29 B5 Page 104: 53 98 13 FF Page 105: E8 79 8B 33 Page 106: 45 6C 34 38 Page 107: 3B 69 28 D7 Page 108: D2 80 B0 2F Page 109: D0 18 D5 DD Page 110: 6C 2D D9 97 Page 111: CA 78 B4 A2 Page 112: B7 3E B8 79 Page 113: A2 BE 54 E4 Page 114: C8 28 0C 4A Page 115: 81 E7 EC 1C Page 116: 39 93 6F 70 Page 117: 75 77 5C FC Page 118: 66 58 0C 1C Page 119: 9F 70 2E C8 Page 120: 52 4A 52 BD Page 121: 56 D5 6A 15 Page 122: 54 1B 33 90 Page 123: 44 11 C1 07 Page 124: 11 5C BA 80 Page 125: 10 14 20 9A Page 126: 4A D8 E6 36 Page 127: DA B8 59 E5 Page 128: 5E 48 95 DA Page 129: 96 6A 26 85 Page 130: 01 00 0F BD Page 131: 00 00 00 04 Page 132: 5F 00 00 00 Page 133: 00 00 00 00 Page 134: 00 00 00 00 Failed authentication attempts: 0 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/nfc/Ntag216.nfc ================================================ Filetype: Flipper NFC device Version: 2 # Nfc device type can be UID, Mifare Ultralight, Mifare Classic, Bank card Device type: NTAG216 # UID, ATQA and SAK are common for all formats UID: 04 D9 65 0A 32 5E 80 ATQA: 44 00 SAK: 00 # Mifare Ultralight specific data Data format version: 1 Signature: 48 2A F2 01 0F F2 F5 A7 9A D5 79 6E CB 14 54 48 98 D1 57 5D 8A 23 A9 B0 E8 20 02 3E CD C8 16 DB Mifare version: 00 04 04 02 01 00 13 03 Counter 0: 0 Tearing 0: 00 Counter 1: 0 Tearing 1: 00 Counter 2: 0 Tearing 2: 00 Pages total: 231 Pages read: 231 Page 0: 04 D9 65 30 Page 1: 0A 32 5E 80 Page 2: E6 48 00 00 Page 3: E1 10 6D 00 Page 4: 03 37 D1 01 Page 5: 33 55 04 6D Page 6: 2E 79 6F 75 Page 7: 74 75 62 65 Page 8: 2E 63 6F 6D Page 9: 2F 77 61 74 Page 10: 63 68 3F 76 Page 11: 3D 62 78 71 Page 12: 4C 73 72 6C Page 13: 61 6B 4B 38 Page 14: 26 66 65 61 Page 15: 74 75 72 65 Page 16: 3D 79 6F 75 Page 17: 74 75 2E 62 Page 18: 65 FE 00 00 Page 19: 00 00 00 00 Page 20: 00 00 00 00 Page 21: 00 00 00 00 Page 22: 00 00 00 00 Page 23: 00 00 00 00 Page 24: 00 00 00 00 Page 25: 00 00 00 00 Page 26: 00 00 00 00 Page 27: 00 00 00 00 Page 28: 00 00 00 00 Page 29: 00 00 00 00 Page 30: 00 00 00 00 Page 31: 00 00 00 00 Page 32: 00 00 00 00 Page 33: 00 00 00 00 Page 34: 00 00 00 00 Page 35: 00 00 00 00 Page 36: 00 00 00 00 Page 37: 00 00 00 00 Page 38: 00 00 00 00 Page 39: 00 00 00 00 Page 40: 00 00 00 00 Page 41: 00 00 00 00 Page 42: 00 00 00 00 Page 43: 00 00 00 00 Page 44: 00 00 00 00 Page 45: 00 00 00 00 Page 46: 00 00 00 00 Page 47: 00 00 00 00 Page 48: 00 00 00 00 Page 49: 00 00 00 00 Page 50: 00 00 00 00 Page 51: 00 00 00 00 Page 52: 00 00 00 00 Page 53: 00 00 00 00 Page 54: 00 00 00 00 Page 55: 00 00 00 00 Page 56: 00 00 00 00 Page 57: 00 00 00 00 Page 58: 00 00 00 00 Page 59: 00 00 00 00 Page 60: 00 00 00 00 Page 61: 00 00 00 00 Page 62: 00 00 00 00 Page 63: 00 00 00 00 Page 64: 00 00 00 00 Page 65: 00 00 00 00 Page 66: 00 00 00 00 Page 67: 00 00 00 00 Page 68: 00 00 00 00 Page 69: 00 00 00 00 Page 70: 00 00 00 00 Page 71: 00 00 00 00 Page 72: 00 00 00 00 Page 73: 00 00 00 00 Page 74: 00 00 00 00 Page 75: 00 00 00 00 Page 76: 00 00 00 00 Page 77: 00 00 00 00 Page 78: 00 00 00 00 Page 79: 00 00 00 00 Page 80: 00 00 00 00 Page 81: 00 00 00 00 Page 82: 00 00 00 00 Page 83: 00 00 00 00 Page 84: 00 00 00 00 Page 85: 00 00 00 00 Page 86: 00 00 00 00 Page 87: 00 00 00 00 Page 88: 00 00 00 00 Page 89: 00 00 00 00 Page 90: 00 00 00 00 Page 91: 00 00 00 00 Page 92: 00 00 00 00 Page 93: 00 00 00 00 Page 94: 00 00 00 00 Page 95: 00 00 00 00 Page 96: 00 00 00 00 Page 97: 00 00 00 00 Page 98: 00 00 00 00 Page 99: 00 00 00 00 Page 100: 00 00 00 00 Page 101: 00 00 00 00 Page 102: 00 00 00 00 Page 103: 00 00 00 00 Page 104: 00 00 00 00 Page 105: 00 00 00 00 Page 106: 00 00 00 00 Page 107: 00 00 00 00 Page 108: 00 00 00 00 Page 109: 00 00 00 00 Page 110: 00 00 00 00 Page 111: 00 00 00 00 Page 112: 00 00 00 00 Page 113: 00 00 00 00 Page 114: 00 00 00 00 Page 115: 00 00 00 00 Page 116: 00 00 00 00 Page 117: 00 00 00 00 Page 118: 00 00 00 00 Page 119: 00 00 00 00 Page 120: 00 00 00 00 Page 121: 00 00 00 00 Page 122: 00 00 00 00 Page 123: 00 00 00 00 Page 124: 00 00 00 00 Page 125: 00 00 00 00 Page 126: 00 00 00 00 Page 127: 00 00 00 00 Page 128: 00 00 00 00 Page 129: 00 00 00 00 Page 130: 00 00 00 00 Page 131: 00 00 00 00 Page 132: 00 00 00 00 Page 133: 00 00 00 00 Page 134: 00 00 00 00 Page 135: 00 00 00 00 Page 136: 00 00 00 00 Page 137: 00 00 00 00 Page 138: 00 00 00 00 Page 139: 00 00 00 00 Page 140: 00 00 00 00 Page 141: 00 00 00 00 Page 142: 00 00 00 00 Page 143: 00 00 00 00 Page 144: 00 00 00 00 Page 145: 00 00 00 00 Page 146: 00 00 00 00 Page 147: 00 00 00 00 Page 148: 00 00 00 00 Page 149: 00 00 00 00 Page 150: 00 00 00 00 Page 151: 00 00 00 00 Page 152: 00 00 00 00 Page 153: 00 00 00 00 Page 154: 00 00 00 00 Page 155: 00 00 00 00 Page 156: 00 00 00 00 Page 157: 00 00 00 00 Page 158: 00 00 00 00 Page 159: 00 00 00 00 Page 160: 00 00 00 00 Page 161: 00 00 00 00 Page 162: 00 00 00 00 Page 163: 00 00 00 00 Page 164: 00 00 00 00 Page 165: 00 00 00 00 Page 166: 00 00 00 00 Page 167: 00 00 00 00 Page 168: 00 00 00 00 Page 169: 00 00 00 00 Page 170: 00 00 00 00 Page 171: 00 00 00 00 Page 172: 00 00 00 00 Page 173: 00 00 00 00 Page 174: 00 00 00 00 Page 175: 00 00 00 00 Page 176: 00 00 00 00 Page 177: 00 00 00 00 Page 178: 00 00 00 00 Page 179: 00 00 00 00 Page 180: 00 00 00 00 Page 181: 00 00 00 00 Page 182: 00 00 00 00 Page 183: 00 00 00 00 Page 184: 00 00 00 00 Page 185: 00 00 00 00 Page 186: 00 00 00 00 Page 187: 00 00 00 00 Page 188: 00 00 00 00 Page 189: 00 00 00 00 Page 190: 00 00 00 00 Page 191: 00 00 00 00 Page 192: 00 00 00 00 Page 193: 00 00 00 00 Page 194: 00 00 00 00 Page 195: 00 00 00 00 Page 196: 00 00 00 00 Page 197: 00 00 00 00 Page 198: 00 00 00 00 Page 199: 00 00 00 00 Page 200: 00 00 00 00 Page 201: 00 00 00 00 Page 202: 00 00 00 00 Page 203: 00 00 00 00 Page 204: 00 00 00 00 Page 205: 00 00 00 00 Page 206: 00 00 00 00 Page 207: 00 00 00 00 Page 208: 00 00 00 00 Page 209: 00 00 00 00 Page 210: 00 00 00 00 Page 211: 00 00 00 00 Page 212: 00 00 00 00 Page 213: 00 00 00 00 Page 214: 00 00 00 00 Page 215: 00 00 00 00 Page 216: 00 00 00 00 Page 217: 00 00 00 00 Page 218: 00 00 00 00 Page 219: 00 00 00 00 Page 220: 00 00 00 00 Page 221: 00 00 00 00 Page 222: 00 00 00 00 Page 223: 00 00 00 00 Page 224: 00 00 00 00 Page 225: 00 00 00 00 Page 226: 00 00 00 BD Page 227: 04 00 00 FF Page 228: 00 05 00 00 Page 229: 00 00 00 00 Page 230: 00 00 00 00 Failed authentication attempts: 0 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/nfc/Slix_cap_accept_all_pass.nfc ================================================ Filetype: Flipper NFC device Version: 4 # Device type can be ISO14443-3A, ISO14443-3B, ISO14443-4A, ISO14443-4B, ISO15693-3, FeliCa, NTAG/Ultralight, Mifare Classic, Mifare DESFire, SLIX, ST25TB Device type: SLIX # UID is common for all formats UID: E0 04 01 08 49 D0 DC 81 # ISO15693-3 specific data # Data Storage Format Identifier DSFID: 01 # Application Family Identifier AFI: 3D # IC Reference - Vendor specific meaning IC Reference: 01 # Lock Bits Lock DSFID: true Lock AFI: true # Number of memory blocks, valid range = 1..256 Block Count: 80 # Size of a single memory block, valid range = 01...20 (hex) Block Size: 04 Data Content: 03 0A 82 ED 86 39 61 D2 03 14 1E 32 B6 CA 00 3C 36 42 0C 33 53 30 37 32 32 34 30 30 00 00 00 00 00 FF 04 01 01 00 00 00 A3 03 1E 00 26 00 00 00 00 00 0F 00 76 03 65 01 00 00 00 00 85 01 34 00 75 09 05 00 01 00 00 00 00 00 00 00 00 00 00 00 D7 FA 00 1C 9E 1C 67 27 00 30 30 30 30 30 30 30 30 30 30 00 00 00 97 25 55 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 32 8C 00 30 53 48 80 DE 00 00 00 00 F4 C3 58 2B 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 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 11 F3 00 2C DD C3 3E 91 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 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 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 00 00 00 00 00 00 00 00 00 00 00 00 E5 FF 00 01 # Block Security Status: 01 = locked, 00 = not locked Security Status: 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 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 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 # SLIX specific data # SLIX capabilities field affects emulation modes. Possible options: Default, AcceptAllPasswords Capabilities: AcceptAllPasswords # Passwords are optional. If a password is omitted, a default value will be used Password Read: 00 00 00 00 Password Write: 00 00 00 00 Password Privacy: 0F 0F 0F 0F Password Destroy: 0F 0F 0F 0F Password EAS: 00 00 00 00 # This is the card's secp128r1 elliptic curve signature. It can not be calculated without knowing NXP's private key. Signature: A6 25 54 03 74 24 C4 38 36 F4 89 70 76 1A 72 27 54 D9 E7 3D 38 CB 4C 1B 3E FD 0E DF 8A F6 7E 3D Privacy Mode: false # Protection pointer configuration Protection Pointer: 32 Protection Condition: 02 # SLIX Lock Bits Lock EAS: true Lock PPL: true ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/nfc/Slix_cap_default.nfc ================================================ Filetype: Flipper NFC device Version: 4 # Device type can be ISO14443-3A, ISO14443-3B, ISO14443-4A, ISO14443-4B, ISO15693-3, FeliCa, NTAG/Ultralight, Mifare Classic, Mifare DESFire, SLIX, ST25TB Device type: SLIX # UID is common for all formats UID: E0 04 01 08 49 D0 DC 81 # ISO15693-3 specific data # Data Storage Format Identifier DSFID: 01 # Application Family Identifier AFI: 3D # IC Reference - Vendor specific meaning IC Reference: 01 # Lock Bits Lock DSFID: true Lock AFI: true # Number of memory blocks, valid range = 1..256 Block Count: 80 # Size of a single memory block, valid range = 01...20 (hex) Block Size: 04 Data Content: 03 0A 82 ED 86 39 61 D2 03 14 1E 32 B6 CA 00 3C 36 42 0C 33 53 30 37 32 32 34 30 30 00 00 00 00 00 FF 04 01 01 00 00 00 A3 03 1E 00 26 00 00 00 00 00 0F 00 76 03 65 01 00 00 00 00 85 01 34 00 75 09 05 00 01 00 00 00 00 00 00 00 00 00 00 00 D7 FA 00 1C 9E 1C 67 27 00 30 30 30 30 30 30 30 30 30 30 00 00 00 97 25 55 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 32 8C 00 30 53 48 80 DE 00 00 00 00 F4 C3 58 2B 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 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 11 F3 00 2C DD C3 3E 91 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 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 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 00 00 00 00 00 00 00 00 00 00 00 00 E5 FF 00 01 # Block Security Status: 01 = locked, 00 = not locked Security Status: 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 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 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 # SLIX specific data # SLIX capabilities field affects emulation modes. Possible options: Default, AcceptAllPasswords Capabilities: Default # Passwords are optional. If a password is omitted, a default value will be used Password Read: 00 00 00 00 Password Write: 00 00 00 00 Password Privacy: 0F 0F 0F 0F Password Destroy: 0F 0F 0F 0F Password EAS: 00 00 00 00 # This is the card's secp128r1 elliptic curve signature. It can not be calculated without knowing NXP's private key. Signature: A6 25 54 03 74 24 C4 38 36 F4 89 70 76 1A 72 27 54 D9 E7 3D 38 CB 4C 1B 3E FD 0E DF 8A F6 7E 3D Privacy Mode: false # Protection pointer configuration Protection Pointer: 32 Protection Condition: 02 # SLIX Lock Bits Lock EAS: true Lock PPL: true ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/nfc/Slix_cap_missed.nfc ================================================ Filetype: Flipper NFC device Version: 4 # Device type can be ISO14443-3A, ISO14443-3B, ISO14443-4A, ISO14443-4B, ISO15693-3, FeliCa, NTAG/Ultralight, Mifare Classic, Mifare DESFire, SLIX, ST25TB Device type: SLIX # UID is common for all formats UID: E0 04 01 08 49 D0 DC 81 # ISO15693-3 specific data # Data Storage Format Identifier DSFID: 01 # Application Family Identifier AFI: 3D # IC Reference - Vendor specific meaning IC Reference: 01 # Lock Bits Lock DSFID: true Lock AFI: true # Number of memory blocks, valid range = 1..256 Block Count: 80 # Size of a single memory block, valid range = 01...20 (hex) Block Size: 04 Data Content: 03 0A 82 ED 86 39 61 D2 03 14 1E 32 B6 CA 00 3C 36 42 0C 33 53 30 37 32 32 34 30 30 00 00 00 00 00 FF 04 01 01 00 00 00 A3 03 1E 00 26 00 00 00 00 00 0F 00 76 03 65 01 00 00 00 00 85 01 34 00 75 09 05 00 01 00 00 00 00 00 00 00 00 00 00 00 D7 FA 00 1C 9E 1C 67 27 00 30 30 30 30 30 30 30 30 30 30 00 00 00 97 25 55 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 32 8C 00 30 53 48 80 DE 00 00 00 00 F4 C3 58 2B 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 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 11 F3 00 2C DD C3 3E 91 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 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 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 00 00 00 00 00 00 00 00 00 00 00 00 E5 FF 00 01 # Block Security Status: 01 = locked, 00 = not locked Security Status: 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 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 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 # SLIX specific data # Passwords are optional. If a password is omitted, a default value will be used Password Read: 00 00 00 00 Password Write: 00 00 00 00 Password Privacy: 0F 0F 0F 0F Password Destroy: 0F 0F 0F 0F Password EAS: 00 00 00 00 # This is the card's secp128r1 elliptic curve signature. It can not be calculated without knowing NXP's private key. Signature: A6 25 54 03 74 24 C4 38 36 F4 89 70 76 1A 72 27 54 D9 E7 3D 38 CB 4C 1B 3E FD 0E DF 8A F6 7E 3D Privacy Mode: false # Protection pointer configuration Protection Pointer: 32 Protection Condition: 02 # SLIX Lock Bits Lock EAS: true Lock PPL: true ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/nfc/Ultralight_11.nfc ================================================ Filetype: Flipper NFC device Version: 3 # Nfc device type can be UID, Mifare Ultralight, Mifare Classic Device type: Mifare Ultralight 11 # UID, ATQA and SAK are common for all formats UID: 04 15 74 F2 B0 5E 81 ATQA: 00 44 SAK: 00 # Mifare Ultralight specific data Data format version: 1 Signature: A4 37 7D E5 8C 2F 88 D8 04 60 41 6E 3A C8 CD DB 19 94 26 12 C5 D0 12 B0 EB 88 05 72 89 F2 A5 61 Mifare version: 00 04 03 01 01 00 0B 03 Counter 0: 0 Tearing 0: BD Counter 1: 0 Tearing 1: BD Counter 2: 0 Tearing 2: BD Pages total: 20 Pages read: 20 Page 0: 04 15 74 ED Page 1: F2 B0 5E 81 Page 2: 9D 48 F8 FF Page 3: C1 31 3E 3F Page 4: B0 00 F0 02 Page 5: 2F B3 45 A0 Page 6: D4 9C 02 F2 Page 7: 4A B1 ED FF Page 8: C8 01 00 02 Page 9: 4F B3 46 70 Page 10: EE F6 60 B0 Page 11: B6 C6 12 1B Page 12: B9 1E 49 C3 Page 13: 49 DF 7A 57 Page 14: 08 52 2A 11 Page 15: 28 0A 28 59 Page 16: 00 00 00 FF Page 17: 00 05 00 00 Page 18: FF FF FF FF Page 19: 00 00 00 00 Failed authentication attempts: 0 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/nfc/Ultralight_21.nfc ================================================ Filetype: Flipper NFC device Version: 3 # Nfc device type can be UID, Mifare Ultralight, Mifare Classic Device type: Mifare Ultralight 21 # UID, ATQA and SAK are common for all formats UID: 34 BF AB B1 AE 73 D6 ATQA: 00 44 SAK: 00 # Mifare Ultralight specific data Data format version: 1 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 34 21 01 01 00 0E 03 Counter 0: 0 Tearing 0: 00 Counter 1: 0 Tearing 1: 00 Counter 2: 0 Tearing 2: 00 Pages total: 41 Pages read: 41 Page 0: 34 BF AB A8 Page 1: B1 AE 73 D6 Page 2: BA 00 70 08 Page 3: FF FF FF FC Page 4: 45 D9 BB A0 Page 5: 5D 9D FA 00 Page 6: 80 70 38 40 Page 7: 12 30 02 00 Page 8: 00 00 00 00 Page 9: 00 00 00 00 Page 10: AC A1 0D E4 Page 11: 80 70 38 40 Page 12: 00 57 A0 01 Page 13: 00 08 C1 40 Page 14: 00 00 00 00 Page 15: AC A1 0D E4 Page 16: 00 00 00 00 Page 17: 00 00 00 00 Page 18: 00 00 00 00 Page 19: 00 00 00 00 Page 20: 00 00 00 00 Page 21: 00 00 00 00 Page 22: 00 00 00 00 Page 23: 00 00 00 00 Page 24: 00 00 00 00 Page 25: 00 00 00 00 Page 26: 00 00 00 00 Page 27: 00 00 00 00 Page 28: 00 00 00 00 Page 29: 00 00 00 00 Page 30: 00 00 00 00 Page 31: 00 00 00 00 Page 32: 00 00 00 00 Page 33: 00 00 00 00 Page 34: 00 00 00 00 Page 35: 00 00 00 00 Page 36: 00 00 00 BD Page 37: 00 00 00 FF Page 38: 00 05 00 00 Page 39: FF FF FF FF Page 40: 00 00 00 00 Failed authentication attempts: 0 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/nfc/Ultralight_C.nfc ================================================ Filetype: Flipper NFC device Version: 4 # Device type can be ISO14443-3A, ISO14443-3B, ISO14443-4A, ISO14443-4B, ISO15693-3, FeliCa, NTAG/Ultralight, Mifare Classic, Mifare DESFire, SLIX, ST25TB Device type: NTAG/Ultralight # UID is common for all formats UID: 04 BA FF CA 4D 5D 80 # ISO14443-3A specific data ATQA: 00 44 SAK: 00 # NTAG/Ultralight specific data Data format version: 2 NTAG/Ultralight type: Mifare Ultralight C 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 00 00 00 00 00 00 00 Counter 0: 0 Tearing 0: 00 Counter 1: 0 Tearing 1: 00 Counter 2: 0 Tearing 2: 00 Pages total: 48 Pages read: 48 Page 0: 04 BA FF C9 Page 1: CA 4D 5D 80 Page 2: 5A 48 00 00 Page 3: E1 10 12 00 Page 4: 01 03 A0 0C Page 5: 34 03 00 FE Page 6: 00 00 00 00 Page 7: 00 00 00 00 Page 8: 00 00 00 00 Page 9: 00 00 00 00 Page 10: 00 00 BE AF Page 11: 00 00 00 00 Page 12: 00 00 00 00 Page 13: 00 00 00 00 Page 14: 00 00 00 00 Page 15: 00 00 00 00 Page 16: 00 00 00 00 Page 17: 00 00 00 00 Page 18: 00 00 00 00 Page 19: 00 00 00 00 Page 20: 00 00 00 00 Page 21: 00 00 00 00 Page 22: 00 00 00 00 Page 23: 00 00 00 00 Page 24: 00 00 00 00 Page 25: 00 00 00 00 Page 26: 00 00 00 00 Page 27: 00 00 00 00 Page 28: 00 00 00 00 Page 29: 00 00 00 00 Page 30: 00 00 00 00 Page 31: 00 00 00 00 Page 32: 00 00 00 00 Page 33: 00 00 00 00 Page 34: 00 00 00 00 Page 35: 00 00 00 00 Page 36: 00 00 00 00 Page 37: 00 00 00 00 Page 38: 00 00 00 00 Page 39: 00 00 00 00 Page 40: 00 00 00 00 Page 41: 00 00 00 00 Page 42: 05 00 00 00 Page 43: 00 00 00 00 Page 44: 00 00 00 00 Page 45: 00 00 00 00 Page 46: 00 00 00 00 Page 47: 00 00 00 00 Failed authentication attempts: 0 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/nfc/nfc_nfca_signal_long.nfc ================================================ Filetype: Flipper NFC test 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 37 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/nfc/nfc_nfca_signal_short.nfc ================================================ Filetype: Flipper NFC test 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 37 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/storage/md5.txt ================================================ Yo dawg, I heard you like md5... ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/alutech_at_4n_raw.sub ================================================ Filetype: Flipper SubGhz RAW File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: RAW RAW_Data: -854 811 -454 811 -444 409 -838 811 -454 823 -432 385 -842 811 -454 389 -854 821 -418 837 -444 401 -850 417 -854 395 -830 417 -846 819 -432 811 -448 789 -444 839 -454 401 -856 381 -850 825 -410 841 -418 417 -834 411 -840 827 -442 417 -844 799 -472 809 -420 411 -842 419 -848 397 -822 413 -850 799 -486 381 -848 415 -854 423 -16394 449 -358 437 -386 411 -384 449 -382 417 -384 419 -386 417 -386 419 -388 419 -388 419 -388 419 -390 437 -4036 421 -810 425 -820 393 -866 813 -422 415 -856 397 -858 811 -456 427 -820 815 -416 419 -850 401 -854 805 -420 835 -444 409 -842 809 -454 433 -820 421 -838 813 -420 417 -822 435 -820 419 -834 431 -852 411 -866 805 -420 815 -444 805 -454 403 -824 809 -448 819 -448 413 -844 811 -446 811 -456 409 -816 809 -456 389 -866 387 -842 809 -454 827 -432 413 -850 829 -428 809 -452 381 -852 799 -452 413 -852 807 -450 801 -444 409 -872 411 -840 413 -812 413 -832 807 -450 815 -442 801 -454 809 -454 429 -820 419 -838 811 -456 785 -428 409 -842 439 -824 813 -448 415 -858 819 -418 831 -426 449 -808 427 -820 393 -866 421 -808 825 -436 413 -852 403 -884 421 -16394 407 -478 257 -574 229 -576 229 -564 231 -592 267 -490 305 -520 307 -486 309 -522 307 -458 341 -486 337 -4096 343 -882 389 -880 341 -874 807 -476 351 -882 397 -860 807 -450 431 -824 811 -450 399 -824 417 -844 817 -432 807 -448 411 -872 801 -460 417 -810 425 -836 809 -420 411 -838 409 -852 417 -844 425 -852 385 -872 801 -426 841 -420 811 -422 409 -844 809 -454 823 -432 415 -842 835 -450 805 -454 403 -822 809 -450 399 -826 417 -844 821 -434 807 -448 411 -876 801 -440 807 -450 383 -850 833 -416 415 -852 807 -456 811 -444 411 -838 419 -848 401 -852 377 -850 819 -454 795 -436 809 -448 821 -448 411 -846 417 -842 817 -432 811 -412 411 -864 417 -844 791 -438 415 -876 793 -458 809 -450 383 -832 413 -840 407 -866 387 -844 821 -434 413 -874 377 -868 419 -16408 411 -392 421 -390 421 -388 421 -376 427 -394 433 -388 409 -386 411 -384 449 -382 419 -384 419 -384 419 -4018 343 -89684 97 -430 65 -166 163 -66 231 -100 161 -392 161 -64 229 -1056 97 -198 97 -198 259 -166 691 -66 395 -98 131 -100 99 -66 199 -198 1657 -406 365 -462 361 -436 357 -438 387 -444 353 -444 385 -414 387 -448 355 -448 355 -444 395 -394 399 -4050 819 -434 811 -414 819 -450 409 -852 809 -450 805 -448 805 -446 831 -428 409 -846 389 -854 395 -862 811 RAW_Data: -452 783 -462 811 -446 411 -874 383 -852 403 -852 777 -450 411 -838 805 -452 397 -858 805 -484 387 -872 803 -442 805 -448 383 -846 797 -484 777 -474 381 -846 831 -430 807 -482 387 -852 817 -418 805 -452 823 -430 385 -878 377 -876 411 -846 391 -884 811 -444 805 -420 415 -846 399 -852 807 -452 805 -444 803 -450 803 -454 807 -452 397 -850 395 -862 385 -844 427 -840 809 -456 379 -876 407 -880 383 -846 819 -432 387 -872 375 -854 413 -846 387 -886 779 -476 803 -450 801 -444 415 -846 793 -438 415 -846 417 -822 407 -852 417 -852 817 -444 409 -16426 443 -358 431 -388 409 -386 447 -350 449 -382 419 -386 419 -386 417 -386 419 -388 453 -354 453 -356 445 -4018 813 -416 839 -420 817 -418 451 -816 835 -444 809 -450 811 -440 803 -444 407 -830 419 -844 419 -836 805 -420 835 -444 803 -446 409 -868 421 -814 431 -822 807 -452 397 -828 819 -452 415 -856 787 -454 419 -848 837 -410 839 -416 395 -866 787 -450 811 -454 407 -850 805 -454 805 -470 381 -850 833 -418 805 -438 809 -448 397 -860 421 -810 431 -856 381 -888 791 -424 841 -422 415 -820 437 -818 813 -450 813 -454 803 -446 817 -448 829 -410 451 -816 403 -818 413 -850 409 -846 811 -448 415 -834 413 -884 399 -822 815 -452 381 -852 407 -846 415 -846 385 -866 807 -456 809 -446 835 -412 407 -834 815 -450 415 -822 405 -848 419 -844 427 -852 809 -442 407 -16420 425 -422 335 -486 309 -486 309 -522 307 -492 337 -454 351 -466 329 -498 327 -468 323 -472 355 -442 355 -4120 757 -456 773 -478 781 -458 381 -874 771 -482 801 -470 777 -482 805 -450 399 -826 415 -846 387 -866 805 -420 813 -446 831 -458 417 -846 401 -852 381 -840 835 -420 415 -846 795 -440 413 -842 835 -450 407 -860 811 -418 815 -424 413 -842 807 -454 823 -428 411 -842 801 -454 807 -488 401 -822 805 -448 803 -446 803 -426 447 -844 397 -856 381 -870 411 -870 777 -452 829 -432 385 -840 419 -848 797 -438 809 -450 815 -448 833 -440 803 -452 411 -820 415 -848 409 -844 411 -846 779 -462 409 -848 409 -864 421 -844 793 -438 385 -846 419 -850 399 -838 415 -872 777 -478 803 -448 799 -442 417 -848 799 -438 415 -842 409 -826 417 -844 427 -854 807 -452 409 -16402 461 -352 421 -386 421 -386 419 -388 453 -354 453 -354 447 -378 409 -386 439 -376 421 -410 385 -414 415 -4024 831 -418 809 -438 807 -444 409 -838 809 -456 821 -432 841 -414 255 -87638 131 -66 97 -296 97 -264 131 -196 65 -132 231 -632 197 -664 131 RAW_Data: -500 395 -132 461 -132 689 -98 2685 -100 997 -1508 99 -2186 231 -166 231 -134 133 -932 65 -268 99 -132 65 -200 97 -68 163 -234 65 -68 99 -930 331 -98 763 -100 2025 -418 353 -446 385 -414 385 -416 387 -448 355 -442 383 -412 397 -424 405 -388 409 -418 379 -418 415 -4014 443 -814 413 -822 817 -454 801 -436 409 -842 409 -866 415 -838 441 -836 811 -432 387 -842 419 -846 793 -440 807 -448 837 -446 803 -448 835 -420 807 -448 383 -868 379 -850 409 -866 387 -844 825 -468 381 -884 793 -426 415 -842 427 -818 817 -440 407 -830 419 -844 429 -852 387 -872 409 -826 811 -450 813 -418 837 -412 409 -864 417 -844 397 -852 809 -454 805 -448 409 -840 809 -420 813 -458 409 -844 407 -860 385 -878 793 -470 809 -420 817 -416 417 -850 403 -852 381 -852 827 -428 447 -844 401 -854 813 -424 421 -840 419 -812 823 -438 415 -846 409 -844 415 -846 389 -868 809 -458 803 -416 409 -866 813 -418 417 -854 397 -862 419 -842 401 -854 415 -16404 435 -376 409 -410 407 -384 439 -384 409 -410 417 -368 421 -410 407 -378 447 -376 415 -378 447 -380 407 -4022 421 -844 423 -822 821 -418 807 -454 429 -820 421 -836 439 -854 421 -810 821 -436 385 -840 441 -822 813 -448 811 -452 803 -444 835 -444 801 -446 801 -426 447 -808 423 -834 413 -852 407 -840 819 -452 389 -856 813 -444 409 -848 415 -812 809 -458 409 -848 411 -842 415 -844 421 -834 415 -834 835 -418 819 -418 807 -456 393 -856 393 -866 421 -846 799 -474 809 -420 421 -836 811 -420 813 -458 407 -850 413 -842 415 -846 819 -428 835 -416 835 -412 407 -832 421 -842 423 -822 813 -446 407 -864 419 -846 799 -440 413 -850 419 -816 797 -442 413 -850 409 -844 417 -846 423 -834 841 -428 805 -414 435 -822 813 -450 413 -822 437 -818 421 -844 429 -854 411 -16406 427 -418 309 -522 307 -488 303 -520 289 -530 295 -500 323 -470 325 -504 321 -476 321 -476 355 -444 357 -4080 355 -906 339 -882 771 -476 777 -486 381 -874 383 -884 375 -884 387 -852 819 -418 417 -846 399 -854 809 -418 815 -446 837 -420 839 -454 801 -436 807 -452 399 -826 417 -844 391 -852 423 -838 809 -452 431 -852 811 -414 409 -836 417 -844 821 -432 385 -876 385 -850 409 -848 415 -854 421 -840 817 -420 815 -424 817 -448 409 -848 413 -844 389 -854 815 -446 829 -426 413 -842 819 -434 809 -446 409 -838 419 -846 401 -852 811 -456 811 -444 803 -418 417 -848 403 -850 381 -864 805 -450 395 -866 419 -848 801 -474 381 -848 411 RAW_Data: -842 807 -446 381 -872 377 -866 421 -846 401 -854 813 -458 779 -446 407 -832 811 -450 415 -856 399 -856 385 -876 399 -854 411 -16398 435 -392 395 -400 421 -412 385 -412 417 -384 415 -386 415 -418 385 -420 385 -420 417 -390 417 -388 419 -4020 421 -838 421 -812 819 -434 809 -448 397 -864 421 -844 401 -850 413 -858 789 -426 413 -844 419 -836 807 -424 843 -410 829 -442 835 -446 801 -454 809 -420 417 -832 411 -848 249 -88020 133 -896 231 -466 67 -1062 131 -728 163 -98 621 -98 1051 -100 680933 -452 269 -522 273 -554 273 -558 239 -558 271 -490 337 -488 321 -498 295 -500 325 -470 323 -474 353 -4082 757 -492 375 -880 357 -872 777 -486 773 -480 807 -450 805 -444 805 -476 407 -812 413 -834 411 -848 407 -828 813 -450 811 -458 803 -448 835 -446 791 -424 447 -808 427 -818 423 -840 419 -848 401 -854 811 -458 809 -446 801 -416 439 -826 415 -848 813 -430 809 -450 395 -866 419 -846 403 -850 413 -820 407 -848 415 -846 781 -460 805 -446 803 -474 803 -448 835 -420 805 -454 389 -836 409 -842 407 -866 419 -842 399 -854 809 -456 809 -446 409 -840 385 -844 819 -434 809 -450 395 -860 811 -452 393 -886 779 -446 409 -830 419 -842 423 -818 423 -838 419 -844 799 -472 809 -454 385 -844 807 -454 391 -854 395 -860 385 -844 429 -852 809 -454 385 -874 409 -16402 427 -368 455 -358 433 -380 443 -378 415 -378 447 -380 411 -384 409 -406 421 -408 387 -412 415 -386 415 -4026 831 -398 441 -810 417 -832 837 -418 833 -444 803 -446 833 -448 801 -424 449 -810 427 -820 423 -838 419 -812 825 -438 841 -416 845 -446 825 -418 809 -422 419 -822 433 -822 419 -844 425 -820 421 -840 841 -458 797 -436 809 -414 435 -822 419 -844 819 -432 809 -448 395 -864 421 -846 407 -850 411 -808 433 -824 419 -844 819 -432 809 -446 823 -416 837 -454 807 -440 809 -414 435 -828 417 -844 425 -828 415 -848 419 -818 839 -446 807 -422 411 -844 419 -846 795 -438 807 -450 395 -866 811 -454 391 -854 845 -412 407 -832 421 -842 419 -832 411 -824 435 -820 815 -450 811 -460 409 -850 799 -454 407 -824 413 -848 411 -842 415 -844 815 -432 415 -848 405 -16400 441 -432 327 -492 301 -516 307 -484 309 -520 307 -492 339 -454 337 -490 331 -464 327 -500 325 -472 325 -4110 763 -480 373 -852 385 -878 759 -482 775 -474 813 -458 781 -482 789 -454 415 -846 397 -820 411 -840 405 -852 809 -450 811 -458 809 -450 817 -448 803 -426 411 -844 391 -854 393 -866 419 -848 399 -854 811 RAW_Data: -454 811 -444 803 -418 417 -846 403 -850 809 -452 805 -444 411 -840 419 -846 407 -850 415 -836 385 -842 419 -850 797 -438 807 -452 817 -446 801 -486 813 -444 775 -450 409 -838 419 -810 431 -854 379 -848 405 -884 809 -450 817 -430 385 -874 375 -856 811 -446 809 -422 421 -836 835 -452 419 -848 783 -460 409 -814 407 -856 415 -846 383 -870 381 -848 819 -450 811 -472 383 -850 803 -454 415 -838 399 -854 379 -850 407 -848 811 -448 415 -872 387 -16400 451 -374 445 -374 415 -378 415 -412 411 -384 405 -422 409 -410 387 -410 417 -382 417 -384 415 -420 383 -4030 827 -428 411 -842 425 -820 817 -418 833 -426 845 -452 815 -428 837 -416 409 -842 421 -810 431 -820 421 -89106 265 -662 99 -532 131 -598 97 -668 65 -300 761 -198 231 -132 265 -100 233 -100 197 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/ansonic.sub ================================================ Filetype: Flipper SubGhz Key File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: Ansonic Bit: 12 Key: 00 00 00 00 00 00 05 5A ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/ansonic_raw.sub ================================================ Filetype: Flipper SubGhz RAW File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: RAW RAW_Data: 57 -144 401 -86 173 -202 143 -258 133 -88 257 -144 287 -58 402 -56 259 -230 259 -86 85 -96 95 -174 286 -162 57 -230 253 -400 229 -88 536 -58 85 -72 167 -110 263 -72 229 -58 85 -86 87 -262 119 -288 163 -210 321 -320 186 -140 261 -96 143 -456 117 -216 143 -246 239 -102 121 -72 71 -191 167 -263 191 -96 239 -80 57 -116 143 -118 167 -168 215 -288 191 -106 287 -114 517 -88 113 -394 173 -70 215 -100 661 -86 201 -114 259 -58 287 -86 57 -202 399 -200 57 -288 229 -144 115 -1425 83 -142 173 -86 459 -112 223 -144 201 -116 143 -114 196 -17422 287 -614 1075 -1132 533 -560 1125 -1112 561 -530 1133 -1088 585 -512 1129 -1104 563 -1102 571 -1072 591 -524 1137 -538 1115 -19392 589 -522 1139 -1090 569 -520 1137 -1100 587 -520 1135 -1092 569 -514 1155 -1076 599 -1062 585 -1086 585 -532 1125 -528 1145 -19396 581 -504 1155 -1064 619 -506 1145 -1080 595 -508 1149 -1062 587 -536 1129 -1088 585 -1090 589 -1062 587 -510 1177 -506 1149 -19394 587 -524 1147 -1076 597 -512 1129 -1072 617 -498 1159 -1066 599 -514 1147 -1076 595 -1060 613 -1060 589 -506 1179 -510 1155 -19378 605 -514 1129 -1098 601 -488 1177 -1062 583 -510 1161 -1072 587 -516 1169 -1058 587 -1082 589 -1076 593 -532 1121 -536 1127 -19444 549 -542 1129 -1092 601 -510 1147 -1098 581 -506 1123 -1100 585 -510 1147 -1106 591 -1060 597 -1060 595 -510 1151 -534 1157 -19390 593 -512 1163 -1064 597 -510 1173 -1042 617 -510 1159 -1056 579 -556 1133 -1054 609 -1060 607 -1078 585 -528 1147 -516 1135 -19444 559 -534 1165 -1052 605 -510 1149 -1062 599 -520 1173 -1054 591 -540 1111 -1116 573 -1088 593 -1042 615 -534 1117 -536 1129 -19436 569 -530 1157 -1052 605 -504 1177 -1062 591 -536 1113 -1114 589 -514 1125 -1112 563 -1084 587 -1080 589 -536 1123 -532 1165 -19392 599 -524 1143 -1080 595 -540 1125 -1090 563 -534 1149 -1084 567 -534 1147 -1092 587 -1086 585 -1064 565 -558 1123 -532 1143 -19450 549 -556 1121 -1086 585 -534 1137 -1094 583 -516 1133 -1114 563 -536 1123 -1108 573 -1082 597 -1078 565 -532 1143 -524 1135 -19464 561 -528 1149 -1066 613 -508 1151 -1076 587 -532 1125 -1076 609 -506 1175 -1076 563 -1106 563 -1084 591 -534 1157 -484 1179 -19414 589 -528 1131 -1096 587 -520 1163 -1080 563 -550 1121 -1098 555 -562 1117 -1082 575 -1112 563 -1104 559 -558 1121 -530 1149 -19442 591 -498 1175 -1066 585 -534 1121 -1114 565 -540 1115 -1096 585 -538 1123 -1110 559 -1086 585 -1084 589 -530 1125 -558 1121 -19454 563 -542 1163 -1044 585 -558 1131 -1092 571 -536 1133 -1088 587 -518 1149 -1086 601 -1058 587 -1080 611 -510 RAW_Data: 1125 -536 1145 -19444 567 -542 1151 -1086 581 -534 1133 -1084 583 -530 1141 -1090 587 -516 1121 -1114 591 -1062 595 -1092 567 -538 1131 -536 1145 -19448 589 -516 1143 -1076 591 -540 1115 -1090 591 -538 1115 -1096 597 -512 1155 -1078 581 -1082 585 -1104 559 -530 1153 -516 1147 -19438 589 -526 1157 -1056 609 -534 1137 -1078 585 -532 1149 -1076 585 -536 1123 -1104 587 -1062 597 -1082 587 -536 1121 -554 1121 -19464 555 -560 1123 -1104 563 -542 1131 -1096 565 -536 1143 -1060 621 -492 1175 -1078 571 -1100 577 -1092 591 -494 1167 -538 1117 -19452 593 -538 1133 -1074 603 -510 1157 -1062 595 -548 1115 -1102 573 -538 1139 -1094 567 -1094 583 -1092 567 -536 1127 -560 1113 -19478 563 -534 1151 -1084 569 -534 1135 -1116 565 -534 1135 -1084 583 -532 1155 -1060 587 -1084 589 -1084 581 -536 1125 -546 1141 -19460 577 -536 1123 -1102 565 -554 1119 -1096 593 -520 1133 -1108 563 -546 1131 -1088 569 -1094 573 -1100 583 -526 1147 -540 1123 -19466 587 -530 1129 -1100 587 -510 1143 -1084 609 -510 1131 -1110 567 -542 1121 -1102 567 -1110 563 -1106 567 -532 1149 -518 1145 -19458 573 -534 1147 -1082 575 -556 1149 -1048 589 -532 1157 -1088 565 -536 1129 -1088 589 -1106 563 -1086 587 -536 1129 -548 1147 -4298 103 -56 87 -344 87 -258 85 -278 215 -70 77 -344 279 -56 87 -56 197 -198 143 -288 362 -86 605 -144 57 -268 95 -114 143 -144 173 -144 143 -402 57 -202 259 -391 652 -340 427 -230 173 -356 97 -144 111 -246 219 -96 191 -114 173 -288 115 -56 109 -106 199 -106 73 -130 57 -172 85 -260 373 -56 629 -200 690 -230 273 -120 85 -460 85 -314 77 -78 111 -88 401 -116 171 -312 71 -500 81 -224 229 -88 257 -370 181 -172 200 -116 535 -174 113 -294 213 -359 445 -144 258 -114 115 -202 675 -509 239 -432 373 -538 85 -58 113 -86 761 -104 113 -318 443 -70 143 -144 647 -204 111 -334 87 -114 115 -144 113 -188 177 -144 199 -260 143 -86 87 -622 57 -116 171 -58 139 -222 55 -346 315 -76 345 -114 139 -171 195 -52 53 -98 119 -144 143 -244 95 -72 95 -96 167 -302 253 -186 307 -444 287 -449 115 -172 57 -172 316 -202 85 -370 697 -116 57 -144 171 -202 259 -114 85 -144 87 -315 85 -58 201 -116 171 -272 121 -358 171 -403 113 -86 115 -202 489 -229 115 -392 95 -116 171 -140 93 -102 143 -543 245 -358 215 -120 387 -288 171 -202 221 -202 115 -748 57 -316 143 -260 143 -288 115 -316 115 -58 85 -288 143 -460 485 -96 71 -104 199 -96 199 -202 143 -86 201 -116 85 -230 211 -288 115 -605 365 -126 53 -172 RAW_Data: 317 -144 57 -486 53 -282 115 -585 97 -72 229 -174 257 -440 225 -86 173 -518 243 -167 95 -259 137 -96 694 -58 227 -80 279 -287 71 -72 301 -72 121 -106 51 -84 57 -58 199 -260 143 -288 219 -174 113 -681 115 -172 403 -58 113 -116 113 -432 171 -202 55 -108 95 -212 113 -72 527 -166 95 -212 195 -108 603 -142 239 -296 173 -346 373 -287 53 -80 79 -72 95 -238 95 -312 167 -618 143 -288 95 -72 95 -72 141 -210 55 -258 143 -328 305 -58 87 -86 315 -116 195 -218 85 -290 285 -220 215 -189 201 -58 57 -645 119 -96 71 -144 119 -406 143 -72 191 -72 631 -268 344 -56 115 -260 315 -140 455 -518 57 -58 171 -144 488 -86 219 -232 257 -144 85 -174 171 -260 115 -56 87 -166 197 -58 83 -56 85 -288 113 -410 115 -172 163 -202 113 -58 201 -144 201 -86 143 -264 167 -212 113 -116 139 -72 181 -287 343 -430 201 -260 201 -462 143 -192 301 -230 191 -454 187 -144 315 -164 143 -477 165 -58 201 -114 143 -490 115 -86 201 -58 113 -88 85 -58 203 -198 375 -86 171 -346 95 -88 257 -170 81 -56 143 -172 335 -230 173 -202 133 -471 187 -264 215 -86 115 -198 159 -72 179 -112 195 -116 449 -216 93 -96 167 -216 71 -216 71 -166 235 -86 447 -102 101 -226 195 -213 71 -144 215 -144 215 -261 241 -136 269 -142 263 -311 215 -172 201 -144 265 -168 71 -404 259 -86 85 -230 115 -650 143 -202 749 -512 248 -316 201 -154 71 -96 95 -360 105 -56 57 -432 95 -288 95 -286 95 -96 166 -144 93 -144 167 -150 904 -162 95 -526 287 -244 95 -240 383 -120 167 -394 430 -854 95 -72 143 -194 227 -120 167 -264 405 -144 143 -72 143 -72 141 -120 187 -86 143 -164 170 -96 143 -58 143 -86 402 -166 153 -120 95 -96 69 -96 71 -359 404 -338 71 -225 93 -74 97 -54 161 -114 319 -288 113 -116 459 -202 115 -114 115 -116 143 -86 57 -56 87 -114 85 -375 113 -58 311 -240 203 -288 95 -72 119 -383 213 -384 115 -86 171 -58 53 -104 401 -58 115 -86 373 -116 143 -144 161 -216 406 -72 263 -96 215 -72 95 -94 167 -96 191 -240 95 -94 214 -120 403 -116 200 -114 57 -172 220 -120 137 -364 334 -392 115 -260 199 -116 373 -188 95 -110 143 -172 87 -114 172 -230 57 -316 201 -56 249 -485 171 -202 87 -86 85 -144 345 -86 171 -58 259 -58 295 -120 95 -120 71 -192 635 -118 167 -96 375 -72 119 -120 261 -144 167 -96 95 -96 923 -215 71 -433 71 -477 RAW_Data: 191 -240 85 -72 637 -408 213 -510 261 -168 143 -126 79 -106 167 -72 117 -218 251 -168 119 -96 215 -182 191 -238 517 -116 201 -144 255 -154 97 -94 215 -72 95 -120 71 -288 261 -106 434 -96 606 -232 229 -432 85 -174 343 -58 329 -156 55 -116 259 -144 488 -56 307 -339 115 -202 334 -88 113 -86 57 -174 143 -144 401 -376 85 -240 267 -82 95 -216 137 -158 85 -144 143 -58 221 -308 295 -114 87 -114 301 -120 358 -517 71 -262 191 -144 57 -140 165 -407 53 -262 217 -120 238 -358 119 -357 71 -72 119 -96 428 -72 95 -72 167 -72 93 -240 335 -96 357 -240 173 -230 143 -114 87 -200 143 -232 287 -150 97 -288 71 -72 93 -288 115 -58 143 -230 109 -264 71 -72 119 -72 238 -242 97 -78 163 -86 115 -518 79 -560 205 -449 969 -144 507 -86 231 -114 345 -58 979 -110 85 -288 287 -404 229 -202 57 -274 233 -86 115 -202 632 -230 85 -312 369 -392 460 -450 75 -280 85 -202 201 -86 229 -174 143 -144 233 -528 115 -212 127 -202 287 -172 403 -172 139 -128 165 -138 261 -392 143 -480 142 -189 291 -80 53 -283 167 -140 113 -1008 191 -144 119 -120 71 -193 241 -462 201 -58 143 -344 539 -316 113 -174 85 -116 113 -250 239 -168 405 -168 239 -158 85 -144 115 -86 57 -86 341 -144 171 -202 85 -202 115 -114 719 -88 55 -318 257 -56 254 -86 171 -116 459 -174 171 -329 95 -134 85 -314 431 -306 77 -316 401 -86 173 -404 281 -1073 488 -94 217 -78 101 -98 214 -120 215 -340 403 -535 143 -564 115 -116 199 -58 85 -174 315 -58 335 -136 55 -260 143 -144 229 -460 143 -58 143 -144 171 -202 115 -374 291 -130 339 -82 143 -58 171 -58 201 -86 85 -174 1022 -56 85 -82 255 -240 103 -202 431 -278 95 -216 119 -72 71 -96 71 -559 57 -144 171 -88 113 -86 231 -414 131 -192 237 -360 95 -168 145 -168 213 -120 167 -96 143 -110 57 -86 259 -56 87 -777 295 -96 57 -86 173 -86 171 -404 143 -172 231 -200 57 -441 55 -58 173 -56 87 -86 171 -72 287 -72 119 -262 119 -144 71 -72 121 -310 71 -302 113 -54 193 -80 307 -58 257 -232 143 -56 143 -116 219 -72 695 -70 71 -460 85 -232 719 -363 57 -402 604 -230 287 -138 83 -172 259 -58 171 -174 55 -88 489 -114 143 -116 171 -116 143 -58 199 -144 145 -343 374 -186 235 -140 77 -86 143 -202 143 -144 113 -144 143 -58 732 -96 263 -264 71 -206 95 -168 215 -144 271 -80 139 -88 85 -414 75 -100 RAW_Data: 285 -96 627 -362 53 -84 201 -374 113 -202 115 -202 421 -316 85 -58 139 -224 87 -86 229 -58 243 -178 267 -288 95 -336 171 -96 213 -288 71 -405 95 -96 95 -384 95 -72 213 -72 95 -96 95 -272 87 -1083 85 -58 113 -88 257 -116 143 -292 175 -318 95 -120 95 -144 95 -72 71 -216 368 -116 373 -172 115 -58 85 -116 143 -86 85 -144 201 -86 201 -202 257 -144 201 -174 113 -144 115 -144 257 -202 585 -364 173 -138 287 -422 431 -86 85 -96 869 -186 95 -52 115 -86 115 -58 55 -276 365 -86 85 -489 171 -140 577 -106 718 -144 391 -232 195 -82 143 -172 109 -120 167 -96 280 -216 145 -240 215 -186 163 -96 141 -172 159 -603 257 -108 629 -192 119 -80 87 -172 57 -144 286 -86 57 -230 344 -58 113 -537 75 -96 537 -86 403 -196 167 -264 119 -238 119 -120 167 -96 95 -478 95 -120 167 -216 1085 -96 358 -72 263 -72 69 -120 143 -96 71 -96 191 -362 55 -144 57 -260 113 -58 85 -174 55 -88 257 -86 231 -194 55 -58 115 -56 55 -339 55 -58 374 -172 139 -82 419 -98 119 -261 71 -72 71 -240 713 -86 143 -218 295 -72 53 -56 431 -58 317 -144 161 -144 373 -144 173 -144 57 -114 85 -116 195 -72 708 -172 115 -86 191 -96 506 -120 71 -174 85 -58 363 -114 317 -230 316 -200 87 -114 57 -230 115 -315 173 -280 694 -212 453 -256 143 -202 113 -540 352 -116 257 -116 457 -56 109 -58 143 -230 259 -144 259 -525 119 -408 247 -112 389 -72 431 -96 137 -236 97 -474 201 -298 71 -82 55 -116 55 -112 199 -174 191 -86 143 -144 115 -114 317 -86 85 -230 87 -114 259 -84 107 -130 143 -94 153 -86 135 -94 215 -72 239 -94 435 -96 263 -142 166 -334 87 -194 179 -96 115 -284 135 -56 57 -144 463 -204 143 -316 201 -58 403 -86 141 -288 85 -202 139 -397 171 -174 305 -202 85 -144 373 -253 161 -492 181 -191 95 -216 315 -191 71 -166 97 -126 337 -96 71 -96 189 -168 295 -84 197 -86 259 -345 137 -144 167 -796 115 -344 455 -72 119 -96 119 -550 209 -88 85 -86 143 -340 167 -260 143 -537 85 -226 51 -537 57 -260 315 -461 51 -84 199 -358 383 -96 143 -257 115 -86 173 -86 201 -144 143 -316 85 -86 479 -88 85 -72 71 -104 115 -116 267 -72 137 -144 143 -116 85 -86 373 -288 115 -200 87 -114 259 -114 259 -462 143 -144 171 -86 57 -58 137 -144 57 -634 343 -72 205 -86 143 -258 57 -232 113 -230 461 -58 185 -74 537 -86 RAW_Data: 535 -142 57 -58 55 -116 115 -432 85 -172 259 -192 167 -120 117 -72 119 -240 334 -72 71 -267 285 -144 119 -374 85 -88 85 -114 143 -202 229 -58 143 -202 115 -202 171 -86 71 -144 87 -56 173 -373 143 -116 113 -462 169 -80 215 -148 115 -336 85 -230 163 -432 85 -374 639 -174 85 -58 57 -82 295 -352 269 -532 414 -322 95 -287 263 -268 115 -56 259 -76 85 -282 401 -305 516 -114 115 -202 171 -86 451 -110 85 -346 201 -274 149 -202 85 -364 366 -258 57 -114 259 -172 142 -144 85 -116 85 -480 171 -144 57 -352 115 -116 535 -404 315 -202 163 -158 517 -316 215 -98 85 -346 85 -144 87 -86 257 -82 167 -58 85 -116 113 -894 233 -186 77 -266 147 -72 71 -82 57 -86 171 -58 57 -86 201 -364 143 -202 115 -114 85 -88 113 -86 87 -230 57 -76 613 -72 85 -96 209 -346 458 -58 547 -490 201 -315 315 -116 75 -168 359 -335 95 -384 93 -120 71 -312 251 -366 233 -96 189 -240 263 -192 271 -58 115 -58 229 -346 459 -174 113 -144 173 -144 218 -224 57 -116 215 -72 103 -202 513 -210 433 -116 113 -174 650 -273 147 -450 375 -86 115 -172 536 -84 85 -230 85 -58 195 -468 287 -110 551 -214 167 -311 213 -250 85 -58 85 -355 113 -230 115 -144 117 -288 195 -202 57 -376 123 -144 236 -168 553 -284 119 -72 143 -188 161 -120 93 -312 335 -58 55 -260 105 -244 143 -120 381 -268 173 -268 635 -168 453 -318 71 -167 71 -406 191 -172 215 -408 119 -144 93 -120 97 -130 143 -192 308 -122 147 -550 313 -96 139 -162 167 -96 431 -80 83 -112 201 -86 287 -86 229 -116 57 -288 113 -174 143 -116 113 -144 115 -518 57 -230 57 -172 231 -86 113 -314 183 -144 119 -72 165 -446 81 -86 135 -190 143 -96 71 -72 411 -96 143 -120 69 -216 349 -72 95 -96 517 -646 163 -86 113 -116 171 -116 143 -116 113 -287 259 -114 517 -168 141 -116 105 -72 95 -96 311 -118 159 -310 191 -54 143 -258 115 -450 219 -54 339 -372 239 -72 167 -174 113 -58 57 -144 259 -172 143 -336 113 -174 85 -230 83 -668 85 -202 113 -144 57 -116 373 -316 719 -288 115 -58 75 -120 139 -144 229 -144 57 -144 171 -192 391 -202 403 -58 315 -188 259 -56 115 -144 85 -404 57 -58 105 -102 429 -406 81 -172 57 -144 287 -230 287 -220 317 -458 283 -58 113 -86 269 -72 281 -58 85 -202 113 -52 421 -58 229 -480 259 -58 143 -660 155 -638 123 -86 57 -86 143 -346 143 -144 57 -144 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/bett.sub ================================================ Filetype: Flipper SubGhz Key File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: BETT Bit: 18 Key: 00 00 00 00 00 00 B8 B8 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/bett_raw.sub ================================================ Filetype: Flipper SubGhz RAW File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok270Async Protocol: RAW RAW_Data: 12477 16271 -64 12623 -102 40819 -98 3729 -66 14371 -66 14943 -64 5931 -66 11147 -68 74641 -102 54299 -70 18441 -66 82993 -100 66161 -68 61869 -66 6627 -66 12987 -68 30427 -68 25761 -98 6305 -66 5019 -64 30857 -132 23929 -68 25129 -39378 317 -2020 311 -2010 2033 -312 2017 -282 325 -2018 291 -2024 2035 -316 2023 -276 319 -2028 297 -2032 2029 -284 2023 -314 321 -2016 319 -2012 2003 -310 2015 -318 321 -1984 327 -16000 351 -1974 321 -2020 2041 -276 2047 -288 327 -1992 327 -2000 2055 -282 2053 -274 305 -2022 301 -2014 2049 -286 2055 -274 319 -1992 329 -2006 2065 -282 2023 -316 323 -1988 303 -16008 323 -2014 315 -1990 2053 -284 2061 -274 319 -1988 319 -2038 2033 -286 2055 -264 339 -2008 289 -2034 2035 -284 2061 -262 339 -2008 287 -2040 2037 -286 2035 -268 347 -2006 317 -15988 311 -2014 343 -2014 2027 -300 2031 -258 311 -2024 323 -2028 2023 -280 2051 -318 285 -2024 309 -2002 2039 -312 2017 -318 289 -2020 293 -2028 2035 -316 2023 -276 321 -2030 299 -15982 345 -1988 345 -2014 2029 -268 2069 -258 337 -1998 321 -2024 2025 -320 2025 -276 321 -1994 331 -2000 2057 -282 2043 -282 305 -2034 291 -2024 2039 -320 2019 -278 323 -1992 333 -15976 389 -1978 321 -1986 2069 -276 2053 -288 303 -2020 315 -1980 2067 -258 2075 -258 337 -1996 321 -2030 2027 -284 2059 -274 319 -2004 319 -2016 2033 -282 2059 -264 345 -2006 289 -16006 355 -1984 315 -2018 2033 -312 2015 -284 327 -2000 329 -2000 2063 -282 2049 -284 327 -1984 319 -2018 2035 -284 2057 -264 343 -2004 289 -2032 2059 -280 2019 -316 323 -1984 321 -15968 387 -1978 321 -1984 2069 -276 2049 -288 325 -1996 303 -2004 2055 -284 2049 -278 325 -2018 321 -1984 2075 -276 2049 -288 327 -1990 325 -1996 2031 -318 2025 -278 323 -2018 289 -16010 357 -1982 315 -2018 2035 -278 2053 -288 307 -2022 321 -2000 2049 -274 2045 -284 327 -2022 311 -2014 2033 -276 2053 -286 327 -2000 323 -2000 2061 -282 2015 -316 325 -2002 289 -15994 353 -1980 357 -1990 2035 -312 2015 -286 327 -2020 289 -2022 2033 -318 2019 -278 323 -2004 319 -2016 2059 -282 2023 -316 327 -1970 321 -2018 2059 -280 2019 -318 325 -1972 321 -15988 353 -1982 357 -1972 2071 -276 2051 -288 327 -1988 323 -1996 2061 -280 2053 -284 325 -1984 321 -2014 2031 -282 2059 -276 321 -2018 289 -2036 2031 -282 2059 -276 321 -2018 319 -15984 341 -1984 343 -2016 2029 -298 2033 -258 309 -2028 321 -2032 2035 -284 2017 -298 337 -2008 289 -2034 2027 -314 2023 -310 285 -2016 321 -2014 2035 -282 2027 -308 317 -2026 297 -15982 357 -1984 345 -1982 2067 -264 2057 -258 341 -1996 317 -2026 2057 -282 2017 -318 325 -1972 319 -2018 2059 -280 2029 -302 315 -2006 319 -2006 2059 -274 2047 -276 307 RAW_Data: -2024 311 -15984 349 -2004 317 -2012 2029 -276 2047 -312 305 -2018 311 -2018 2037 -258 2077 -258 337 -1998 321 -2026 2031 -278 2043 -284 327 -2020 311 -2018 2031 -278 2051 -288 325 -2004 323 -15962 353 -2018 317 -2014 2007 -308 2019 -320 287 -2024 325 -1998 2035 -314 2025 -302 311 -2004 319 -2010 2027 -312 2011 -310 309 -2028 303 -2018 2027 -304 2007 -294 309 -2024 323 -16002 361 -1946 347 -2008 2027 -286 2045 -312 325 -1978 319 -2024 2043 -276 2049 -286 325 -1988 341 -1978 2061 -278 2049 -284 327 -1990 321 -2020 2029 -318 2021 -278 323 -2008 321 -15990 355 -1982 355 -1984 2031 -284 2049 -278 325 -2018 321 -2000 2047 -276 2049 -286 327 -1994 341 -1976 2067 -274 2043 -284 303 -2018 341 -1982 2061 -266 2069 -258 339 -1998 321 -16002 311 -2014 329 -2012 2027 -318 1999 -298 339 -2008 287 -2042 2031 -282 2027 -306 317 -2012 291 -2044 2037 -284 2033 -302 315 -2004 321 -2012 2037 -282 2027 -306 317 -2028 297 -15980 345 -2018 285 -2026 2037 -320 2017 -278 323 -2024 299 -2002 2069 -278 2055 -286 325 -2002 289 -2024 2037 -282 2063 -276 321 -2016 287 -2036 2025 -320 2023 -278 323 -2018 287 -16006 355 -1982 355 -1986 2033 -302 2039 -282 307 -2032 309 -2014 2043 -264 2057 -258 341 -1992 319 -2036 2033 -284 2029 -306 319 -2000 319 -2014 2035 -282 2061 -266 343 -2006 289 -16018 331 -2010 313 -2014 2021 -320 2017 -278 323 -2010 321 -2016 2037 -284 2033 -304 317 -2018 287 -2036 2037 -284 2025 -296 339 -1978 321 -2028 2057 -282 2021 -278 359 -1972 321 -15990 355 -1978 355 -1990 2035 -300 2015 -312 305 -2016 315 -2016 2053 -290 2013 -316 277 -2020 353 -1980 2059 -256 2077 -276 307 -2020 311 -2012 2047 -258 2073 -256 341 -1998 321 -15976 369 -1976 313 -2018 2051 -280 2043 -290 317 -2004 321 -2024 2023 -282 2053 -282 327 -2020 313 -2020 2035 -278 2055 -284 325 -1986 321 -2016 2033 -280 2049 -282 325 -2020 313 -15986 315 -2026 319 -2028 2003 -318 2013 -294 339 -2008 289 -2032 2027 -316 2019 -302 311 -2004 321 -2014 2033 -314 1995 -308 317 -2028 297 -2032 2035 -276 2023 -316 321 -2014 289 -15998 347 -2014 283 -2020 2035 -292 2031 -288 311 -2024 321 -2036 2001 -310 2027 -318 275 -2054 277 -2026 2029 -296 2027 -292 311 -2024 321 -2030 2031 -282 2033 -304 313 -2004 321 -15992 329 -2010 349 -1980 2037 -292 2051 -256 339 -1998 319 -2034 2029 -286 2055 -264 339 -1978 321 -2030 2027 -280 2043 -316 327 -1984 315 -2016 2063 -278 2041 -288 327 -1990 325 -15964 389 -1978 319 -1984 2063 -256 2055 -292 307 -2016 323 -2028 2027 -286 2057 -274 319 -2010 319 -2010 2033 -282 2061 -276 321 -2018 289 -2032 2027 -318 2021 -278 321 -2020 319 -15974 355 -1980 357 -2000 2035 RAW_Data: -254 2079 -276 309 -2016 309 -2012 2035 -296 2063 -258 337 -1992 321 -2030 2037 -286 2027 -294 333 -1978 321 -2034 2029 -286 2031 -306 315 -2008 321 -15972 355 -1984 315 -2014 2037 -310 2011 -318 323 -1984 329 -2002 2033 -316 2029 -278 323 -2026 299 -2030 2035 -278 2019 -316 325 -1980 323 -2018 2053 -252 2075 -280 327 -1984 355 -15954 345 -2008 309 -2016 2045 -266 2065 -258 341 -235740 101 -202 65 -734 133 -372 401 -68 269 -236 505 -68 235 -234 875 -68 13969 -100 14297 -70 3863 -96 59337 -104 11859 -68 17409 -68 7317 -66 11443 -64 15589 -66 4381 -98 32297 -168 45445 -100 59295 -100 41417 -66 1539 -66 23001 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/came.sub ================================================ Filetype: Flipper SubGhz Key File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: CAME Bit: 24 Key: 00 00 00 00 00 6A B2 34 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/came_atomo_raw.sub ================================================ Filetype: Flipper SubGhz RAW File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: RAW RAW_Data: 65 -4082 1356 -4436 197 -1394 65 -2280 67 -3048 165 -232 99 -7272 99 -958 65 -430 63 -2178 65 -2420 65 -6736 131 -4170 67 -4244 99 -1392 97 -5958 65 -1050 97 -5974 65 -2456 165 -1664 99 -13162 65 -3350 67 -1066 67 -98 65 -2668 63 -294 199 -1648 99 -2418 99 -916 99 -934 131 -102 97 -828 67 -964 65 -1644 263 -398 131 -1486 99 -7252 65 -432 65 -1752 99 -5028 331 -698 65 -266 199 -898 163 -916 65 -958 163 -268 97 -5754 131 -928 65 -2524 131 -1100 99 -1848 65 -3168 131 -6354 67 -1198 65 -1452 67 -6396 167 -3714 65 -4624 67 -464 99 -2326 63 -6984 97 -4866 67 -5602 99 -362 65 -1646 131 -6196 199 -5974 131 -798 199 -6046 97 -666 165 -630 99 -4796 99 -3394 129 -1282 221 -10562 1227 -558 609 -606 609 -586 581 -628 579 -600 575 -1224 1155 -1224 1155 -628 579 -622 583 -584 577 -620 589 -614 571 -1214 577 -602 1173 -1206 1173 -612 599 -584 599 -614 561 -616 587 -1216 1169 -620 581 -612 575 -1184 1197 -588 583 -1202 1199 -1204 575 -624 579 -588 1177 -1204 1177 -1206 1179 -608 585 -1212 1181 -620 581 -1184 1195 -588 609 -1182 581 -608 1205 -580 601 -1180 613 -598 1175 -612 595 -580 605 -580 603 -610 573 -616 575 -608 589 -77180 471 -4430 389 -796 387 -818 623 -198 131 -1440 991 -726 485 -668 539 -660 517 -668 539 -660 517 -666 539 -628 583 -1198 1181 -1198 587 -616 573 -618 1183 -598 579 -1214 585 -610 577 -588 1205 -1182 1207 -1166 615 -578 1215 -580 603 -1182 611 -598 581 -602 579 -592 613 -590 1179 -1206 587 -614 577 -610 591 -580 1201 -1180 607 -586 595 -612 1195 -590 579 -608 613 -1180 587 -612 1167 -1206 1197 -598 579 -622 581 -1178 1193 -592 613 -590 587 -77184 1223 -582 613 -1184 579 -608 611 -588 581 -592 1213 -1176 613 -590 1183 -602 579 -622 581 -588 613 -590 587 -1208 569 -614 597 -586 1195 -588 611 -1186 1175 -612 589 -1208 1169 -614 575 -612 591 -1176 611 -590 1209 -1176 579 -610 611 -594 1171 -1204 579 -606 1207 -580 601 -1182 1207 -580 601 -1178 1207 -1174 613 -590 1179 -608 579 -622 579 -1186 1191 -592 613 -1202 583 -612 579 -586 613 -578 1213 -578 601 -1182 1209 -582 601 -578 627 -586 589 -77176 991 -818 365 -1432 355 -834 367 -826 355 -764 1067 -684 531 -674 509 -652 561 -646 545 -618 553 -642 571 -622 553 -1240 1177 -1206 1177 -608 575 -614 561 -1204 1205 -1178 611 -596 1175 -1208 581 -602 1173 -1212 1175 -614 603 -578 601 -580 597 -1208 587 -588 1211 -1170 605 -590 1209 -582 589 -614 575 -1214 575 -622 593 -578 601 -586 1183 -1212 589 -588 613 -578 623 -588 1173 -614 RAW_Data: 575 -618 583 -1174 1211 -578 609 -1186 601 -586 1193 -590 613 -590 587 -78186 1227 -586 613 -1184 579 -606 609 -574 613 -576 1203 -614 573 -1206 1171 -612 589 -612 575 -608 573 -1210 1197 -1178 603 -580 605 -586 1189 -626 581 -590 617 -1176 1201 -1194 593 -578 603 -610 571 -614 577 -610 1183 -1204 1183 -1200 1185 -1198 1185 -1198 1183 -1200 589 -612 1171 -618 581 -612 577 -588 613 -578 611 -1188 601 -584 601 -582 593 -616 1199 -582 577 -1216 1171 -1216 577 -604 1175 -1208 1207 -578 601 -580 597 -1206 1205 -142854 65 -8644 65 -198 65 -5350 65 -4006 65 -3572 67 -1684 65 -1488 67 -3324 131 -5538 133 -1516 63 -2528 65 -264 65 -3142 65 -884 97 -4344 199 -996 97 -1218 97 -5302 65 -4404 67 -2780 97 -1020 97 -2982 65 -864 65 -1580 65 -98 65 -298 67 -1066 131 -166 65 -4844 65 -2714 63 -6224 65 -98 65 -562 133 -398 133 -66 65 -3956 99 -3784 63 -1056 133 -3548 63 -952 163 -1912 65 -994 165 -2604 97 -4038 133 -6020 65 -632 99 -130 65 -64 65 -98 99 -132 129 -1218 97 -886 97 -164 65 -1680 131 -932 65 -234 97 -564 163 -1856 131 -166 101 -66 99 -6952 131 -3866 63 -66 97 -4254 99 -4154 99 -718 129 -228 197 -4720 99 -496 65 -3784 65 -2768 99 -460 65 -596 65 -234 65 -166 67 -1758 65 -298 97 -3296 163 -328 65 -1150 65 -1246 65 -5224 163 -790 99 -1860 133 -2214 67 -2056 65 -5288 65 -3048 131 -196 197 -10564 1229 -580 603 -586 611 -570 607 -602 579 -598 609 -1192 1201 -1170 1197 -612 573 -606 585 -614 569 -612 599 -578 605 -1206 589 -590 1173 -1220 1171 -622 561 -612 601 -586 599 -1208 1175 -580 627 -582 605 -580 589 -1212 1171 -616 573 -1212 1171 -1214 575 -622 561 -612 1197 -1184 1195 -1184 1199 -590 611 -1172 1211 -578 611 -1180 1183 -624 581 -1184 601 -582 1217 -588 579 -1184 597 -610 1195 -588 611 -578 611 -588 579 -594 611 -608 579 -590 611 -77158 627 -1612 63 -162 63 -786 467 -738 457 -718 1093 -1274 1101 -688 521 -640 535 -688 521 -640 537 -656 551 -638 571 -622 551 -1232 1173 -1208 583 -592 575 -620 1183 -602 575 -640 547 -640 575 -1184 1195 -1182 1199 -1214 575 -612 1185 -598 579 -1194 589 -614 575 -616 583 -614 575 -588 1207 -1184 613 -578 611 -592 577 -606 1207 -1174 587 -622 581 -586 1211 -582 589 -614 575 -1214 575 -622 1157 -1218 1165 -608 613 -586 581 -1186 1191 -594 613 -606 581 -77200 1215 -596 579 -1184 599 -612 595 -586 601 -580 1185 -1198 603 -612 1165 -606 613 -594 577 -602 579 -622 581 -1184 599 -614 595 -584 1197 -586 613 -1182 1173 -610 605 -1182 RAW_Data: 587 -618 583 -578 1205 -1210 577 -588 1209 -1182 581 -608 611 -588 1175 -1210 581 -592 1207 -582 591 -1212 1175 -612 587 -1184 1201 -1186 601 -586 1195 -588 613 -588 587 -1208 1165 -630 579 -1184 613 -578 611 -592 577 -608 1203 -578 601 -1208 1169 -614 591 -578 605 -586 599 -77194 601 -4244 469 -724 455 -738 1097 -686 501 -678 491 -684 533 -678 525 -650 535 -644 529 -650 563 -1238 1141 -1234 1173 -606 577 -616 571 -1210 1173 -1212 1173 -1210 579 -604 583 -620 1173 -1212 1175 -610 571 -612 599 -580 605 -1206 575 -588 1209 -1184 581 -610 1207 -580 601 -578 597 -1208 577 -622 581 -588 613 -588 1181 -1204 589 -616 575 -588 595 -612 1199 -592 577 -604 579 -1222 1187 -574 615 -1170 607 -588 1207 -582 591 -616 589 -78180 1243 -580 585 -1206 573 -626 583 -590 587 -614 1171 -618 583 -1208 1177 -612 577 -588 613 -578 585 -1216 1179 -1216 583 -578 619 -588 1173 -616 587 -590 613 -1174 1181 -608 611 -586 581 -1216 573 -614 575 -622 1185 -1192 1187 -1196 1189 -1196 1187 -1192 1169 -1202 605 -586 1211 -584 587 -612 573 -618 583 -612 573 -1216 573 -622 561 -612 599 -584 1183 -618 575 -1216 1169 -1206 579 -606 1207 -1172 1203 -580 603 -620 585 -1176 1177 -78216 503 -12116 421 -790 435 -712 483 -1292 1119 -662 541 -1240 525 -642 1161 -1214 575 -614 599 -618 1153 -1224 1151 -630 579 -1214 1175 -1196 1179 -1214 1175 -588 615 -1180 1193 -1180 605 -612 575 -588 597 -610 1195 -1184 603 -588 1195 -586 613 -590 587 -1210 1169 -1206 603 -578 603 -580 1221 -1190 1197 -1174 1183 -1204 1183 -1196 1203 -1170 1199 -133240 99 -1258 131 -3150 229 -100 97 -3048 67 -400 199 -562 99 -2092 231 -300 199 -4556 99 -1878 65 -3834 457 -4170 163 -3484 131 -1380 97 -634 167 -3880 97 -1778 99 -3416 99 -2390 65 -2948 101 -4186 133 -2054 65 -98 65 -164 165 -1154 65 -3114 163 -3102 131 -626 197 -1662 67 -1494 65 -2650 97 -3266 99 -2436 263 -3076 65 -2718 65 -430 165 -68 99 -832 131 -2976 99 -464 97 -134 165 -66 133 -1660 65 -368 131 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/came_raw.sub ================================================ Filetype: Flipper SubGhz RAW File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: RAW RAW_Data: 1601 -32700 381 -296 671 -350 655 -644 343 -332 659 -330 703 -304 697 -314 697 -646 325 -348 647 -646 347 -656 321 -366 621 -23000 351 -324 677 -322 655 -654 335 -352 661 -336 679 -322 689 -296 703 -654 333 -318 665 -634 345 -672 343 -314 661 -22996 359 -306 673 -326 675 -626 359 -352 631 -330 681 -324 681 -344 689 -654 319 -326 645 -678 351 -622 353 -342 621 -23024 345 -304 669 -342 657 -652 325 -352 645 -354 653 -330 703 -346 653 -652 325 -350 649 -646 347 -652 321 -368 607 -23024 351 -322 653 -324 679 -622 363 -354 657 -324 677 -324 677 -346 655 -646 351 -328 679 -644 353 -624 351 -342 639 -22986 349 -328 659 -324 683 -658 329 -350 653 -324 673 -324 681 -342 657 -652 353 -326 653 -646 347 -654 321 -370 607 -23020 351 -324 679 -288 683 -654 367 -322 661 -336 681 -290 717 -310 695 -622 351 -326 679 -642 355 -624 351 -342 625 -23022 315 -366 637 -326 677 -648 345 -312 667 -348 667 -348 669 -334 679 -648 349 -312 667 -654 319 -664 345 -330 623 -23030 355 -312 657 -346 641 -648 351 -348 655 -352 629 -364 645 -354 655 -682 309 -346 637 -678 317 -650 347 -332 645 -23028 359 -324 629 -336 645 -678 349 -346 621 -350 667 -328 677 -324 681 -684 305 -354 629 -660 345 -640 349 -348 623 -23020 379 -354 545 -430 573 -716 273 -420 611 -382 609 -376 643 -372 611 -730 277 -364 611 -714 289 -702 297 -382 605 -23000 371 -304 657 -330 667 -666 321 -346 669 -336 679 -320 691 -296 701 -654 333 -318 667 -654 343 -638 353 -348 623 -22990 371 -324 665 -320 657 -654 333 -350 667 -346 637 -362 645 -354 655 -682 307 -348 635 -678 317 -686 311 -332 647 -23022 359 -324 627 -342 679 -644 351 -314 669 -342 665 -350 667 -312 703 -628 345 -312 665 -650 337 -672 321 -348 635 -23024 339 -326 671 -290 705 -614 375 -320 659 -340 679 -320 691 -296 701 -654 337 -320 667 -654 353 -620 373 -322 625 -23026 335 -322 663 -338 649 -644 387 -316 657 -348 675 -290 703 -324 675 -650 339 -356 629 -654 343 -638 387 -316 623 -22998 347 -342 637 -376 639 -654 343 -316 683 -346 655 -352 661 -334 677 -646 351 -314 655 -646 343 -658 351 -346 621 -22990 365 -360 567 -424 567 -720 269 -446 589 -374 611 -390 631 -392 617 -690 299 -378 609 -692 287 -708 311 -350 613 -23022 355 -314 637 -376 637 -676 317 -354 643 -356 655 -342 655 -350 659 -676 345 -298 685 -626 359 -652 325 -352 611 -23032 345 -304 685 -312 687 -650 325 -316 683 -324 681 -344 655 -354 659 -676 RAW_Data: 311 -332 679 -618 353 -642 347 -352 619 -23042 307 -336 663 -344 657 -652 325 -352 645 -354 653 -344 657 -352 659 -674 345 -298 683 -626 359 -650 325 -354 615 -23032 349 -304 643 -378 623 -678 325 -352 647 -354 653 -344 655 -352 691 -644 345 -300 681 -624 361 -652 325 -352 617 -23032 387 -328 551 -474 521 -32700 375 -312 657 -344 655 -652 325 -354 677 -320 657 -344 689 -314 667 -688 319 -326 653 -644 349 -654 353 -340 619 -23020 351 -324 645 -354 657 -654 331 -350 667 -312 671 -330 681 -322 717 -616 343 -344 669 -650 325 -642 349 -332 643 -22998 391 -362 563 -402 577 -714 311 -376 621 -378 611 -394 637 -358 655 -688 303 -348 627 -696 311 -686 309 -346 621 -23010 367 -326 663 -320 657 -652 335 -350 667 -346 667 -332 647 -322 717 -648 345 -320 661 -628 347 -654 345 -352 621 -23012 361 -324 659 -322 653 -656 333 -350 667 -312 671 -328 679 -324 717 -648 345 -310 669 -650 325 -644 349 -332 641 -23026 353 -308 665 -310 665 -646 349 -350 647 -322 683 -344 693 -320 693 -644 347 -298 679 -626 361 -648 325 -352 619 -23030 347 -322 645 -322 685 -654 333 -352 665 -310 673 -330 679 -324 715 -648 345 -320 629 -658 345 -638 353 -350 623 -22998 389 -336 577 -408 577 -728 271 -414 625 -354 643 -370 639 -374 641 -674 289 -382 609 -714 311 -680 289 -370 603 -23028 351 -326 681 -288 683 -656 335 -354 659 -334 681 -320 689 -296 703 -654 331 -320 657 -648 353 -660 329 -350 635 -23008 341 -388 547 -428 539 -784 239 -420 579 -414 611 -406 581 -404 611 -724 275 -366 613 -714 289 -702 297 -382 603 -23032 347 -302 679 -310 653 -652 361 -314 681 -324 681 -346 655 -352 661 -674 311 -334 679 -626 359 -646 325 -352 647 -22992 383 -328 557 -440 557 -776 227 -422 575 -422 591 -408 625 -378 621 -706 295 -382 603 -684 305 -714 289 -366 605 -23016 351 -346 637 -326 679 -648 345 -312 697 -316 667 -348 669 -336 679 -644 353 -316 655 -646 345 -658 353 -314 623 -23020 363 -320 669 -322 641 -648 375 -318 659 -340 679 -320 693 -326 673 -656 335 -318 667 -634 345 -672 341 -316 657 -22982 387 -332 581 -408 587 -742 261 -418 609 -356 623 -410 621 -380 623 -706 271 -366 625 -712 293 -678 295 -382 609 -23032 353 -316 655 -324 679 -620 353 -346 669 -326 675 -324 679 -344 655 -678 319 -328 677 -644 353 -624 353 -342 623 -23026 323 -312 681 -324 681 -656 329 -352 629 -364 647 -354 655 -342 691 -656 319 -326 653 -646 349 -654 351 -340 621 -23018 351 -320 RAW_Data: 647 -324 681 -624 363 -356 661 -298 715 -290 717 -296 701 -622 365 -320 659 -646 353 -626 361 -356 625 -22984 351 -330 657 -324 679 -656 331 -356 661 -332 653 -324 713 -310 691 -624 351 -326 655 -644 351 -658 319 -336 669 -22990 353 -348 617 -354 659 -658 331 -348 635 -376 639 -360 647 -324 683 -684 307 -354 627 -662 347 -654 345 -350 621 -23012 359 -324 629 -362 649 -648 345 -314 667 -350 667 -346 671 -324 673 -646 347 -350 623 -674 345 -622 349 -348 623 -23018 363 -324 659 -320 659 -654 333 -350 667 -346 635 -330 683 -324 715 -614 341 -356 629 -660 349 -654 345 -318 657 -23008 359 -322 627 -354 653 -654 333 -352 661 -334 645 -356 653 -330 703 -656 331 -348 637 -634 345 -672 311 -348 627 -23032 359 -322 659 -308 655 -680 347 -316 667 -314 699 -314 697 -318 671 -670 317 -346 637 -650 375 -636 323 -348 635 -23032 323 -352 641 -322 663 -652 369 -316 665 -348 669 -330 681 -316 689 -648 345 -310 667 -648 325 -646 345 -346 639 -22996 385 -302 675 -310 653 -650 361 -316 677 -324 679 -350 673 -346 651 -654 323 -352 649 -648 345 -654 321 -368 621 -23024 321 -346 653 -324 679 -620 353 -346 655 -324 699 -326 675 -346 653 -656 321 -352 647 -644 351 -664 321 -348 623 -23020 351 -324 647 -324 683 -654 335 -354 661 -334 647 -354 685 -318 675 -638 341 -346 669 -646 317 -648 381 -298 645 -23028 359 -288 663 -342 655 -644 381 -314 669 -312 697 -320 667 -338 679 -646 353 -314 655 -650 329 -670 345 -314 669 -32700 413 -310 647 -330 667 -666 321 -346 669 -336 679 -320 691 -296 701 -638 339 -354 629 -660 343 -640 351 -350 621 -23024 341 -326 671 -322 673 -650 343 -318 661 -340 677 -322 689 -318 679 -652 335 -356 623 -648 351 -656 337 -350 633 -23002 383 -354 543 -430 573 -746 241 -420 611 -378 621 -408 601 -392 605 -716 313 -346 621 -708 271 -692 313 -378 587 -23050 339 -326 669 -322 677 -614 377 -320 659 -340 681 -320 693 -294 703 -654 335 -322 661 -644 351 -632 375 -310 665 -23004 355 -370 543 -438 547 -760 225 -450 565 -420 587 -442 587 -412 593 -736 271 -364 623 -696 295 -710 261 -420 573 -23058 317 -330 677 -318 655 -652 369 -310 665 -352 665 -314 701 -298 715 -642 355 -318 657 -644 347 -620 387 -316 621 -23016 363 -394 533 -424 567 -754 235 -450 547 -446 575 -426 573 -422 591 -720 305 -382 591 -696 307 -688 309 -376 589 -23038 353 -308 665 -320 661 -646 389 -314 657 -322 697 -298 715 -288 719 -646 345 -308 665 -648 RAW_Data: 347 -622 381 -298 647 -23000 393 -362 535 -468 537 -750 241 -442 555 -444 593 -398 607 -388 629 -718 273 -382 611 -704 257 -718 307 -362 589 -23058 357 -322 657 -310 683 -642 355 -318 689 -322 671 -322 675 -324 713 -614 375 -324 629 -654 343 -634 373 -314 661 -23002 359 -642 225 -568 101 -164 97 -1928 527 -468 537 -456 565 -752 271 -414 557 -736 271 -724 243 -444 555 -23034 381 -274 697 -320 667 -630 343 -346 673 -324 675 -344 653 -356 663 -638 347 -336 675 -622 353 -640 361 -312 645 -23022 345 -3786 131 -436 549 -460 571 -454 527 -788 237 -412 559 -762 239 -758 239 -410 591 -23042 337 -320 667 -322 679 -616 377 -320 659 -340 681 -320 691 -296 701 -638 375 -310 667 -616 349 -646 383 -298 647 -23016 359 -474 393 -570 331 -854 135 -940 555 -474 531 -460 571 -750 241 -412 587 -740 231 -742 255 -416 593 -23036 353 -320 659 -322 661 -644 355 -316 687 -320 669 -328 681 -324 713 -616 377 -288 667 -654 343 -634 389 -318 623 -22988 371 -394 511 -458 531 -790 233 -446 555 -438 569 -424 603 -392 617 -714 267 -414 593 -692 275 -722 273 -412 587 -23014 365 -324 673 -288 703 -616 375 -322 661 -338 683 -288 715 -296 701 -654 337 -322 663 -632 345 -670 341 -314 663 -22998 373 -364 525 -462 549 -766 225 -464 549 -428 573 -422 589 -420 583 -726 263 -410 579 -718 277 -724 267 -410 579 -23040 361 -322 631 -362 649 -648 345 -346 635 -350 659 -340 687 -322 693 -648 345 -312 667 -646 317 -686 345 -300 651 -23014 395 -290 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/came_twee.sub ================================================ Filetype: Flipper SubGhz Key File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: CAME TWEE Bit: 54 Key: 00 00 00 00 E7 1E 05 2E ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/came_twee_raw.sub ================================================ Filetype: Flipper SubGhz RAW File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: RAW RAW_Data: 65 -918 131 -3388 1159 -100 65 -2632 65 -4574 65 -754 97 -9206 65 -5652 97 -428 99 -8322 99 -98 227 -1348 67 -300 65 -6066 99 -1760 65 -7064 67 -2742 65 -2912 295 -332 99 -3550 165 -266 199 -632 131 -5510 99 -1362 99 -2144 131 -2270 129 -100 331 -962 99 -704 233 -300 65 -66 99 -2010 197 -1162 165 -364 133 -132 97 -164 131 -196 131 -558 67 -98 231 -98 65 -886 65 -1326 165 -100 133 -5110 67 -962 65 -1492 65 -1320 199 -1854 65 -1428 97 -8926 581 -7682 257 -752 257 -740 269 -742 271 -690 361 -652 351 -1152 849 -642 375 -630 399 -1114 385 -626 883 -1106 903 -586 421 -584 447 -1084 917 -1072 939 -554 457 -1074 445 -550 443 -552 485 -514 971 -1044 975 -534 487 -514 473 -1044 979 -522 473 -536 473 -544 479 -1026 983 -1014 981 -1050 477 -518 987 -514 479 -522 475 -1068 431 -51352 467 -606 377 -626 397 -586 421 -582 415 -592 423 -610 375 -608 435 -586 423 -550 449 -554 445 -582 433 -574 443 -556 427 -1074 939 -550 471 -542 477 -1014 483 -544 969 -1032 967 -554 453 -530 495 -1042 975 -1020 969 -550 477 -1014 483 -514 479 -552 449 -556 985 -1026 983 -516 479 -528 487 -1022 977 -548 449 -546 477 -508 475 -1044 967 -1040 979 -1042 479 -512 1003 -524 471 -522 481 -1030 491 -51314 487 -622 325 -654 353 -656 355 -664 367 -606 405 -622 361 -618 387 -618 415 -580 443 -578 409 -590 425 -584 417 -580 417 -1086 939 -576 443 -560 429 -1074 447 -554 969 -1048 947 -550 455 -1036 1005 -528 463 -1044 973 -1042 445 -540 481 -522 999 -522 481 -530 465 -1044 977 -1016 975 -1056 451 -546 481 -516 977 -536 473 -1032 473 -552 449 -526 989 -546 443 -550 475 -522 475 -554 451 -1040 987 -51838 435 -696 259 -740 271 -702 305 -720 327 -650 353 -652 353 -642 373 -610 407 -592 393 -618 385 -620 385 -628 393 -610 411 -1096 919 -586 417 -598 395 -1104 409 -588 923 -1078 945 -550 477 -1030 455 -548 975 -1038 489 -522 975 -1018 481 -546 971 -1034 967 -1050 477 -522 983 -546 443 -1048 459 -552 981 -518 491 -512 481 -514 477 -550 475 -1016 1005 -528 465 -1042 977 -520 471 -1040 469 -548 451 -51346 477 -560 421 -612 409 -574 439 -588 391 -584 449 -556 421 -612 403 -604 407 -590 425 -582 417 -584 411 -576 445 -582 447 -1044 961 -548 449 -554 451 -1050 479 -530 961 -1044 975 -1030 975 -556 461 -514 481 -1040 475 -524 473 -538 471 -554 969 -1026 985 -514 473 -1034 473 -556 451 -544 963 -546 447 -552 481 -1020 967 -550 481 -520 493 -1006 475 -554 449 -554 475 -542 971 -514 RAW_Data: 481 -1046 945 -554 485 -51810 487 -586 391 -618 417 -586 415 -580 399 -606 409 -594 427 -582 417 -580 415 -590 423 -578 441 -572 437 -552 455 -546 449 -1078 937 -550 479 -530 467 -1048 449 -552 979 -1048 949 -1044 975 -1018 991 -546 477 -516 491 -512 481 -1044 979 -1038 449 -558 959 -514 481 -554 449 -554 449 -546 469 -548 453 -548 447 -552 479 -538 441 -1050 485 -536 959 -1040 477 -524 485 -540 445 -538 965 -1076 939 -1056 473 -51318 493 -562 431 -582 417 -584 449 -556 423 -568 441 -574 443 -550 455 -546 483 -516 473 -540 475 -524 475 -552 453 -540 467 -1044 975 -524 473 -554 455 -1034 489 -512 975 -1044 967 -1050 481 -516 985 -514 475 -554 449 -554 475 -1038 463 -514 977 -554 449 -554 487 -512 469 -548 451 -542 481 -1014 979 -546 479 -1024 489 -514 979 -1052 459 -550 451 -528 493 -512 483 -514 1011 -520 469 -544 475 -1014 481 -514 1009 -51820 431 -650 353 -638 377 -630 397 -620 355 -652 353 -626 407 -612 409 -594 399 -618 387 -614 383 -590 413 -612 411 -576 441 -1084 915 -584 443 -548 441 -1084 451 -550 941 -1046 979 -1052 451 -546 477 -516 969 -556 451 -1044 989 -1014 981 -546 485 -1026 983 -516 479 -1016 983 -558 465 -512 483 -1044 979 -520 487 -1030 985 -516 481 -1022 487 -516 1001 -1010 975 -1052 481 -528 465 -514 481 -98632 67 -300 65 -700 65 -2382 65 -68 195 -798 99 -3430 65 -5332 65 -2574 97 -234 65 -2240 195 -4416 165 -1324 99 -4840 65 -1326 99 -1924 165 -4644 97 -4552 65 -5576 197 -3004 99 -2060 199 -2966 65 -330 197 -3684 65 -3090 67 -1032 99 -2390 97 -1094 65 -200 231 -792 329 -6554 65 -6300 131 -5596 65 -1292 65 -3076 65 -264 97 -3074 67 -3288 97 -3248 131 -228 163 -986 133 -2688 65 -460 99 -98 97 -1062 131 -628 67 -830 65 -1060 65 -332 99 -1290 263 -66 99 -2590 165 -726 131 -292 165 -332 131 -1860 65 -700 65 -666 99 -368 163 -3396 97 -5880 131 -5130 131 -7598 67 -1330 99 -1878 63 -1578 65 -1350 133 -11606 99 -2400 65 -858 67 -3516 133 -1524 65 -1648 99 -3808 99 -1918 65 -396 63 -2308 129 -1514 97 -562 97 -66 99 -3218 165 -592 65 -2110 65 -8596 63 -592 99 -5050 165 -7482 65 -396 199 -100 199 -626 65 -6278 65 -1392 97 -5676 67 -5218 99 -1826 163 -1738 65 -6246 65 -1146 129 -6776 131 -958 97 -1918 99 -1264 67 -98 133 -500 131 -432 131 -166 99 -960 65 -462 97 -2426 131 -1232 65 -5012 197 -2464 575 -510 479 -514 475 -520 507 -522 487 -514 473 -546 451 -546 479 -516 471 -538 471 -538 471 -538 RAW_Data: 473 -522 487 -516 473 -1044 977 -520 471 -556 453 -1042 487 -512 979 -1048 471 -522 985 -522 493 -512 483 -514 475 -550 473 -1022 485 -518 1003 -1004 479 -552 979 -522 481 -532 465 -1042 477 -516 479 -526 487 -524 985 -1016 981 -1050 987 -1016 965 -544 479 -1010 1003 -1034 975 -520 493 -512 483 -51832 477 -548 483 -518 479 -542 449 -554 449 -544 473 -548 451 -548 481 -518 481 -526 483 -520 487 -536 463 -548 449 -548 445 -1050 985 -518 481 -524 493 -1044 445 -556 945 -1050 975 -548 453 -546 447 -1050 983 -1046 971 -514 483 -1044 449 -552 485 -512 471 -548 985 -1014 979 -544 449 -560 463 -1042 971 -544 451 -552 443 -572 443 -1044 979 -1016 999 -1014 473 -550 989 -514 475 -524 473 -1050 451 -51346 521 -524 463 -514 485 -548 447 -556 447 -554 449 -546 471 -548 453 -546 447 -550 477 -522 475 -538 475 -550 451 -540 467 -1046 979 -518 485 -514 473 -1046 481 -518 977 -1050 975 -520 459 -1072 937 -540 473 -1050 975 -1052 449 -548 443 -542 969 -552 485 -512 473 -1048 977 -1046 949 -1058 453 -544 481 -516 977 -552 451 -1074 427 -546 483 -516 977 -552 451 -544 469 -546 453 -548 447 -1044 999 -51812 519 -530 465 -514 481 -548 479 -516 481 -526 457 -554 487 -496 495 -512 483 -546 479 -514 473 -522 471 -558 487 -512 471 -1042 977 -526 459 -544 487 -1028 487 -512 973 -1048 965 -554 451 -1050 451 -544 975 -1046 473 -510 1009 -1026 451 -544 975 -1046 967 -1018 509 -516 985 -514 477 -1056 459 -518 981 -548 453 -546 479 -516 473 -520 507 -1018 977 -522 495 -1038 973 -524 471 -1018 487 -526 493 -51324 491 -542 455 -548 449 -552 447 -586 433 -546 477 -522 457 -548 483 -548 445 -552 443 -552 483 -548 439 -550 453 -548 449 -1078 935 -554 481 -528 467 -1044 445 -554 975 -1020 977 -1044 973 -520 473 -554 471 -1040 465 -550 453 -546 447 -550 977 -1020 981 -550 487 -1008 477 -524 485 -540 965 -546 445 -550 455 -1038 977 -554 473 -542 443 -1048 481 -514 477 -522 487 -552 949 -558 461 -1042 971 -524 475 -51838 493 -554 409 -592 427 -584 421 -586 413 -576 445 -574 413 -582 447 -576 435 -550 455 -550 447 -546 443 -574 445 -584 449 -1044 959 -548 445 -554 447 -1066 441 -552 983 -1018 977 -1050 987 -1010 1001 -512 481 -514 475 -550 473 -1016 997 -1016 505 -518 983 -514 479 -522 471 -556 487 -514 469 -546 451 -544 481 -516 479 -524 471 -1032 471 -554 983 -1014 483 -546 445 -552 449 -556 961 -1036 987 -1038 475 -51318 513 -562 401 -570 441 -588 425 -582 417 -586 413 -594 423 -572 RAW_Data: 447 -572 435 -550 419 -584 449 -576 413 -562 459 -550 445 -1056 989 -518 481 -524 475 -1050 449 -560 955 -1044 975 -1018 483 -558 963 -516 479 -524 483 -522 489 -1032 489 -512 977 -522 485 -536 473 -522 487 -540 463 -514 481 -1042 973 -556 453 -1036 489 -512 979 -1016 521 -522 477 -518 485 -512 479 -514 1003 -522 471 -540 487 -1016 467 -548 981 -51816 509 -512 477 -556 453 -536 443 -576 447 -558 463 -512 483 -548 445 -552 447 -554 485 -514 473 -548 455 -546 479 -518 481 -1018 1001 -518 481 -520 493 -1040 443 -552 967 -1034 967 -1046 469 -550 451 -546 973 -522 473 -1052 977 -1020 979 -552 441 -1048 971 -560 463 -1042 979 -518 485 -514 471 -1048 977 -524 455 -1050 977 -548 453 -1044 481 -524 971 -1050 973 -1044 445 -552 447 -554 485 -51302 523 -534 465 -548 451 -550 447 -556 443 -564 449 -550 441 -586 429 -546 481 -516 477 -522 473 -552 485 -512 471 -548 453 -1078 939 -538 473 -540 471 -1034 485 -512 969 -1044 481 -526 987 -512 479 -562 461 -514 483 -516 479 -1054 447 -554 975 -1042 447 -554 977 -520 479 -534 469 -1044 447 -552 449 -564 483 -518 977 -1040 971 -1038 953 -1044 967 -546 483 -1048 947 -1048 973 -546 451 -548 447 -51842 475 -620 353 -644 373 -644 341 -656 395 -616 387 -586 415 -612 385 -598 409 -610 405 -592 427 -584 417 -584 413 -562 459 -1076 941 -550 453 -550 449 -1044 475 -552 953 -1056 451 -546 975 -520 473 -1032 473 -554 485 -498 993 -546 445 -554 447 -1048 487 -536 463 -516 481 -548 479 -516 975 -554 451 -1036 491 -510 975 -554 449 -1052 983 -1016 981 -522 485 -540 475 -1040 463 -548 451 -546 977 -520 471 -1038 467 -51324 485 -3800 195 -672 307 -694 329 -652 355 -650 353 -642 375 -642 375 -624 363 -620 419 -586 419 -1090 925 -572 439 -586 423 -1076 413 -592 939 -1042 477 -524 989 -1046 945 -1034 487 -540 963 -1044 977 -1030 975 -522 495 -1042 445 -554 975 -1018 483 -524 493 -512 481 -546 475 -506 473 -540 973 -1048 487 -498 995 -514 477 -554 447 -556 485 -1010 989 -1044 977 -51826 499 -7642 327 -652 355 -654 355 -674 333 -634 405 -622 361 -1144 879 -612 411 -574 439 -1082 419 -584 911 -1076 447 -566 963 -1042 443 -560 445 -570 441 -546 477 -558 955 -548 445 -1050 983 -1040 463 -514 483 -546 445 -554 975 -1018 483 -558 463 -514 979 -1052 947 -542 473 -548 455 -544 481 -514 477 -522 473 -1050 485 -534 959 -1034 477 -524 485 -93988 65 -6444 63 -964 65 -428 97 -1692 65 -9326 99 -4816 97 -1218 67 -2008 97 -522 97 -1860 99 -1962 RAW_Data: 65 -504 65 -798 65 -732 67 -560 65 -824 65 -66 195 -1780 65 -656 65 -100 99 -366 133 -902 133 -132 65 -164 97 -2648 165 -1950 199 -2336 99 -468 165 -1296 131 -232 527 -100 259 -66 131 -5558 99 -792 65 -660 99 -2094 163 -1154 165 -9190 199 -166 331 -166 299 -3056 267 -66 65 -298 65 -1422 97 -2908 129 -496 199 -132 131 -2308 165 -364 131 -332 67 -632 101 -1090 231 -1018 197 -66 163 -394 65 -628 65 -460 95 -954 65 -1932 67 -66 65 -1188 97 -1394 131 -98 395 -432 791 -1332 263 -1328 97 -270 67 -962 231 -2222 131 -168 65 -500 65 -630 99 -958 63 -164 65 -980 97 -396 131 -2674 65 -3818 131 -1234 65 -134 65 -200 65 -1394 97 -2108 329 -460 227 -132 195 -426 97 -630 293 -4052 65 -2470 65 -434 133 -400 67 -600 65 -1726 67 -5132 197 -5216 131 -2552 199 -1846 65 -6540 97 -390 97 -132 63 -726 65 -1002 131 -66 133 -4454 131 -1086 65 -3068 65 -66 97 -1022 65 -594 163 -1304 97 -900 99 -364 133 -1004 97 -1760 197 -268 99 -2812 67 -400 97 -432 99 -6002 65 -66 163 -434 131 -432 197 -1460 165 -8400 65 -524 65 -6948 97 -728 65 -166 97 -4386 97 -266 97 -2942 395 -6642 99 -204 65 -1030 67 -468 99 -66 131 -1098 133 -1060 163 -4446 65 -2920 65 -134 99 -4124 67 -6956 67 -1392 99 -6610 133 -1548 65 -1712 99 -2112 99 -3776 165 -896 65 -428 97 -760 197 -1448 97 -936 233 -98 163 -5932 129 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/cenmax_raw.sub ================================================ Filetype: Flipper SubGhz RAW File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: RAW RAW_Data: 32700 -1024 977 -1010 971 -1046 967 -1012 1007 -1014 1001 -1008 503 -528 523 -518 485 -550 259 -288 491 -556 231 -296 501 -560 265 -268 267 -270 497 -522 489 -550 259 -290 227 -298 267 -306 239 -308 241 -274 507 -524 261 -256 259 -296 265 -268 503 -558 495 -554 229 -296 503 -560 493 -522 259 -256 257 -296 497 -526 525 -520 261 -292 499 -560 497 -524 263 -260 525 -520 261 -290 227 -298 267 -270 505 -558 231 -332 237 -274 507 -524 521 -518 487 -548 259 -286 227 -298 269 -306 239 -308 239 -276 507 -522 261 -258 261 -296 263 -268 269 -268 271 -306 239 -306 241 -274 273 -270 499 -522 489 -550 259 -288 227 -298 503 -558 233 -332 237 -274 999 -1012 977 -1016 1007 -1018 977 -1014 985 -1008 1013 -1014 521 -524 493 -552 477 -546 239 -314 477 -558 231 -298 501 -562 265 -268 267 -270 497 -520 521 -518 259 -290 227 -300 269 -306 239 -306 241 -276 507 -522 261 -258 259 -296 265 -266 501 -558 497 -556 229 -296 503 -558 493 -522 259 -256 257 -294 497 -556 493 -522 263 -292 499 -560 499 -522 263 -260 523 -522 259 -292 227 -298 267 -270 505 -560 229 -300 269 -274 505 -524 489 -550 487 -550 259 -286 227 -298 269 -306 239 -306 241 -276 507 -522 261 -256 259 -296 267 -268 267 -270 271 -304 239 -306 241 -276 273 -270 497 -522 489 -550 259 -290 225 -298 505 -558 231 -300 269 -272 1001 -1008 979 -1014 1009 -1020 977 -1014 997 -1010 983 -1040 507 -508 511 -546 477 -546 257 -280 513 -520 261 -296 499 -558 265 -268 269 -268 497 -522 489 -552 261 -288 227 -296 271 -304 241 -306 241 -276 507 -522 259 -258 259 -296 267 -266 503 -558 495 -556 229 -296 501 -562 495 -518 259 -256 257 -296 497 -524 525 -520 261 -294 499 -558 499 -524 263 -260 523 -522 259 -290 227 -298 267 -270 505 -558 231 -300 271 -272 505 -526 489 -552 485 -550 227 -318 225 -298 269 -306 239 -306 241 -276 507 -522 261 -258 259 -296 265 -266 269 -270 271 -304 239 -308 239 -276 273 -270 497 -522 489 -550 261 -288 227 -296 505 -558 231 -300 271 -272 999 -1012 981 -1024 1007 -992 1007 -1010 1003 -982 1001 -1048 479 -548 477 -548 479 -546 257 -282 511 -554 231 -294 499 -560 265 -268 269 -268 497 -522 521 -520 259 -290 225 -298 269 -306 239 -308 239 -276 507 -522 261 -258 259 -296 265 -266 503 -556 495 -556 229 -296 503 -560 493 -520 261 -256 257 -294 499 -524 525 -520 261 -294 499 -560 497 -524 261 -262 523 -522 259 -292 227 -296 267 -270 505 -558 231 -332 237 -274 RAW_Data: 505 -526 491 -550 485 -550 227 -318 225 -298 269 -306 239 -306 241 -276 507 -522 261 -258 259 -296 265 -266 269 -270 271 -304 239 -306 241 -276 271 -270 499 -522 489 -550 259 -288 227 -298 505 -560 231 -298 271 -272 999 -1012 977 -1018 1003 -1020 977 -1016 1001 -1008 979 -1040 515 -518 483 -552 485 -552 225 -306 501 -548 227 -318 493 -556 267 -266 267 -270 497 -522 489 -552 259 -288 227 -300 267 -304 239 -308 241 -276 505 -524 261 -258 259 -296 265 -268 501 -558 495 -554 229 -296 503 -528 527 -520 259 -256 257 -296 497 -524 525 -520 261 -294 501 -558 499 -524 261 -260 523 -522 259 -290 227 -298 269 -268 505 -560 231 -300 269 -274 505 -524 489 -552 487 -550 227 -286 257 -296 269 -306 239 -308 239 -276 507 -522 261 -258 259 -296 265 -266 269 -270 269 -306 239 -308 241 -274 273 -270 497 -522 487 -552 261 -288 225 -298 503 -558 233 -332 237 -274 999 -1010 977 -1016 1007 -1020 977 -1014 999 -1014 993 -1012 513 -514 513 -548 479 -548 225 -310 509 -520 261 -294 499 -558 267 -268 269 -268 497 -524 487 -552 259 -288 227 -298 269 -306 239 -308 241 -274 507 -524 259 -258 259 -296 265 -268 501 -558 497 -552 231 -296 501 -560 493 -520 261 -256 257 -294 497 -558 493 -554 129 -32700 261 -332 131 -534 329 -98 32700 -1002 979 -1048 989 -1006 989 -1012 977 -1024 1007 -1034 225 -284 255 -292 263 -264 267 -268 501 -558 231 -298 267 -306 477 -560 231 -296 229 -296 495 -522 523 -520 521 -518 261 -294 265 -304 239 -276 273 -272 497 -522 259 -258 521 -524 261 -296 497 -558 231 -300 505 -528 525 -522 485 -550 483 -550 485 -548 487 -550 261 -294 495 -560 265 -268 267 -270 497 -522 261 -260 259 -296 267 -268 505 -560 231 -298 271 -274 507 -522 521 -520 485 -548 259 -288 227 -296 271 -306 239 -308 239 -276 507 -522 261 -258 259 -296 265 -266 269 -270 271 -272 273 -306 241 -274 273 -270 497 -522 489 -550 259 -288 261 -264 503 -560 231 -300 269 -274 999 -1012 977 -1024 1007 -992 1009 -1000 1005 -982 1033 -1016 257 -248 279 -252 259 -296 265 -268 503 -560 231 -296 267 -304 477 -560 231 -296 229 -296 495 -522 523 -518 523 -520 261 -292 265 -304 239 -276 273 -270 497 -522 259 -290 491 -522 263 -294 497 -558 231 -300 505 -528 527 -522 485 -548 483 -550 485 -550 487 -552 259 -292 495 -560 265 -268 267 -268 497 -522 261 -292 227 -296 267 -270 505 -558 231 -300 269 -274 507 -524 487 -550 487 -550 257 -288 227 -296 271 -304 239 -308 RAW_Data: 241 -276 505 -524 259 -258 259 -296 265 -268 269 -270 271 -270 273 -308 239 -276 273 -270 497 -522 489 -550 259 -288 227 -298 505 -558 231 -300 269 -274 997 -1008 1009 -988 1009 -996 1013 -1014 991 -1014 991 -1012 271 -288 251 -256 253 -292 251 -288 485 -558 231 -300 269 -306 475 -560 229 -296 229 -298 495 -524 523 -518 521 -518 261 -294 263 -304 241 -274 273 -270 499 -520 261 -290 491 -524 261 -294 499 -558 231 -298 503 -562 493 -520 487 -548 485 -548 487 -550 485 -550 261 -290 497 -558 267 -266 269 -268 497 -522 263 -290 227 -296 267 -268 505 -560 231 -300 271 -272 505 -524 489 -552 487 -550 225 -318 227 -296 271 -304 241 -306 241 -276 505 -522 261 -258 259 -296 265 -266 269 -270 271 -304 239 -308 241 -274 273 -270 497 -522 489 -550 259 -288 227 -298 501 -560 231 -334 237 -274 1001 -1012 979 -1014 1005 -986 1007 -1014 1001 -1006 983 -1040 271 -254 253 -292 253 -292 253 -284 481 -558 231 -296 267 -304 477 -562 231 -294 229 -296 497 -524 489 -550 489 -552 261 -292 265 -302 239 -276 273 -270 499 -522 259 -290 491 -522 263 -294 499 -558 231 -296 503 -560 495 -520 487 -550 485 -548 487 -548 489 -548 261 -290 497 -558 265 -268 269 -268 497 -522 261 -292 227 -296 267 -268 507 -558 231 -298 271 -272 507 -522 489 -552 487 -550 227 -286 257 -298 269 -306 239 -308 241 -274 507 -524 259 -258 257 -296 265 -268 269 -268 271 -306 239 -306 241 -276 273 -270 497 -522 489 -550 259 -288 227 -296 505 -558 231 -300 271 -272 997 -1014 975 -1016 1009 -1020 977 -1016 1001 -1012 989 -1044 237 -288 253 -290 217 -292 253 -290 485 -562 231 -298 269 -306 475 -562 229 -296 229 -296 495 -524 523 -518 523 -518 261 -292 265 -304 239 -274 273 -270 499 -520 261 -292 491 -524 261 -294 495 -558 231 -300 503 -562 493 -522 485 -550 485 -548 485 -550 487 -552 261 -290 497 -560 231 -300 267 -270 497 -522 261 -290 227 -296 267 -268 507 -558 231 -300 269 -274 505 -524 519 -518 487 -550 259 -288 227 -296 271 -304 239 -308 241 -274 507 -524 259 -260 259 -294 233 -300 267 -270 271 -306 239 -308 239 -276 271 -270 497 -522 489 -550 259 -288 227 -298 501 -560 231 -334 237 -274 1001 -1010 979 -1014 1007 -1020 977 -1016 1001 -1008 979 -1044 237 -288 255 -290 255 -290 251 -282 479 -556 231 -296 269 -304 475 -562 231 -296 229 -296 495 -524 521 -518 523 -518 261 -292 265 -304 239 -276 273 -270 497 -522 261 -290 491 -524 263 -292 497 -558 231 -298 RAW_Data: 505 -560 495 -520 485 -550 485 -548 485 -552 487 -550 261 -290 497 -558 267 -266 267 -268 497 -522 263 -290 227 -296 267 -270 505 -560 231 -298 271 -272 507 -524 487 -552 485 -550 227 -318 227 -298 269 -306 239 -306 241 -276 505 -522 261 -258 259 -296 265 -268 267 -270 271 -306 237 -308 241 -274 273 -270 497 -522 489 -550 259 -288 227 -300 503 -558 231 -300 269 -272 999 -1008 1007 -988 1005 -996 1013 -1012 987 -1004 997 -1044 225 -278 247 -284 255 -296 267 -268 503 -558 231 -296 269 -304 475 -562 229 -296 229 -296 497 -524 521 -518 523 -518 261 -292 265 -302 241 -276 273 -270 497 -522 259 -290 491 -524 263 -292 499 -556 231 -300 505 -558 495 -522 485 -548 485 -550 485 -550 485 -550 261 -292 497 -558 265 -268 267 -270 497 -520 261 -290 229 -296 267 -270 505 -558 231 -300 271 -272 507 -524 489 -550 485 -548 259 -288 225 -298 269 -306 239 -308 241 -274 507 -524 261 -258 259 -294 265 -266 269 -270 269 -306 239 -306 241 -274 273 -270 497 -524 487 -550 259 -290 227 -296 503 -558 231 -334 237 -274 997 -1014 977 -1016 1007 -1018 977 -1016 1001 -1008 981 -1038 257 -274 245 -280 251 -290 263 -266 503 -560 231 -294 267 -306 475 -562 229 -296 229 -296 495 -522 523 -520 521 -518 261 -294 265 -302 239 -276 273 -270 499 -522 259 -290 491 -524 261 -294 497 -556 233 -298 505 -560 493 -520 487 -550 485 -550 485 -550 487 -550 259 -292 495 -558 267 -266 269 -268 497 -522 261 -288 227 -298 269 -270 505 -556 231 -298 271 -274 505 -524 489 -550 485 -548 261 -288 225 -298 269 -306 239 -306 241 -274 507 -524 261 -258 259 -294 265 -268 269 -268 271 -306 237 -308 241 -274 273 -270 497 -522 489 -548 261 -288 227 -296 503 -560 231 -300 271 -272 997 -1010 1003 -1004 999 -1008 991 -1010 1011 -982 1009 -1020 257 -282 251 -286 227 -296 265 -268 503 -558 231 -298 267 -304 477 -560 231 -296 227 -296 495 -524 523 -520 489 -550 261 -292 265 -304 239 -276 273 -270 499 -520 259 -290 491 -522 263 -294 499 -558 231 -296 505 -560 493 -522 485 -550 485 -550 485 -548 489 -548 261 -290 497 -558 267 -266 269 -268 497 -522 261 -290 227 -296 267 -270 505 -560 231 -298 269 -272 507 -524 491 -550 485 -548 259 -288 225 -298 269 -306 239 -308 241 -274 507 -524 259 -258 257 -296 265 -266 269 -270 271 -304 239 -308 241 -274 273 -270 497 -522 489 -550 259 -288 227 -298 505 -558 231 -300 269 -274 997 -1012 979 -1024 1007 -992 1007 -1016 991 -1008 RAW_Data: 989 -1042 237 -288 253 -290 255 -254 255 -288 487 -560 231 -300 269 -306 475 -562 229 -296 229 -296 495 -524 523 -518 489 -550 261 -292 265 -304 239 -276 273 -270 497 -522 259 -290 493 -524 263 -292 497 -556 231 -300 505 -560 493 -520 485 -550 485 -548 487 -548 487 -550 259 -292 497 -560 265 -268 267 -268 497 -522 259 -292 227 -296 267 -270 505 -558 233 -300 269 -272 507 -524 489 -550 487 -550 227 -286 257 -296 269 -306 239 -308 241 -274 507 -524 259 -258 257 -296 267 -266 269 -270 269 -306 239 -306 241 -274 273 -270 497 -522 489 -550 259 -288 227 -298 503 -560 231 -332 237 -274 999 -1012 981 -1016 1003 -986 1009 -1018 1003 -1006 983 -1044 237 -292 253 -292 217 -292 249 -280 509 -556 229 -296 267 -306 477 -560 229 -298 229 -296 495 -522 523 -518 523 -518 261 -292 265 -304 239 -274 273 -272 497 -522 259 -290 491 -524 261 -294 497 -558 231 -300 503 -560 493 -520 487 -548 487 -548 485 -548 487 -550 261 -292 495 -560 265 -268 267 -268 497 -522 263 -290 227 -296 267 -270 503 -560 231 -300 269 -274 505 -526 489 -552 485 -550 227 -286 257 -296 269 -306 239 -306 241 -276 507 -522 259 -258 259 -296 265 -268 267 -270 271 -306 239 -306 241 -276 273 -270 495 -522 487 -552 261 -288 225 -298 503 -558 231 -332 239 -274 999 -1012 979 -1016 1007 -986 1009 -1016 999 -1012 987 -1012 271 -288 253 -290 219 -290 255 -288 485 -558 231 -300 269 -306 475 -560 231 -296 229 -296 495 -524 523 -518 521 -518 261 -292 265 -302 241 -276 273 -270 497 -522 259 -290 491 -524 261 -294 497 -558 231 -298 507 -560 493 -522 485 -548 485 -548 487 -550 489 -548 261 -290 497 -560 233 -300 267 -266 497 -522 261 -290 227 -298 267 -268 505 -558 231 -300 269 -274 505 -524 491 -550 485 -548 259 -286 227 -298 269 -306 239 -308 241 -274 507 -522 261 -256 259 -296 267 -266 269 -270 271 -304 239 -306 241 -276 271 -270 499 -522 487 -550 261 -288 225 -298 505 -558 231 -300 269 -274 997 -1010 981 -1016 1003 -1020 971 -1006 1025 -1008 987 -1042 225 -276 247 -282 255 -294 265 -268 503 -558 229 -296 267 -304 477 -562 229 -296 229 -296 495 -524 523 -518 523 -518 261 -292 265 -304 239 -274 273 -272 497 -522 259 -292 491 -524 263 -294 497 -558 231 -298 503 -560 493 -520 487 -550 485 -548 485 -548 487 -550 261 -292 497 -560 231 -300 269 -268 497 -522 259 -290 227 -298 267 -268 505 -560 231 -332 237 -274 505 -524 489 -550 485 -548 259 -288 227 -300 RAW_Data: 267 -304 239 -308 241 -274 509 -524 259 -258 257 -296 265 -268 269 -268 271 -306 239 -306 241 -274 273 -270 497 -522 487 -550 261 -288 227 -298 503 -558 233 -298 271 -274 999 -1012 979 -1016 1007 -1016 975 -1002 999 -1018 995 -1046 237 -288 251 -292 253 -256 253 -290 485 -562 233 -298 269 -306 475 -562 229 -296 229 -298 497 -522 491 -550 491 -548 261 -292 265 -304 239 -274 273 -270 499 -520 261 -290 491 -522 263 -294 497 -558 231 -298 505 -558 495 -520 487 -548 485 -550 485 -548 487 -550 261 -292 495 -558 267 -268 267 -268 499 -522 261 -290 227 -296 267 -270 505 -558 233 -298 269 -272 507 -522 489 -552 487 -550 227 -286 257 -296 271 -304 239 -308 239 -32700 165 -164 97 -1950 465 -232 393 -198 557 -7530 865 -1122 915 -1114 159 -346 187 -348 187 -348 445 -618 419 -584 455 -618 195 -354 429 -596 459 -554 227 -320 225 -294 229 -332 467 -560 229 -330 467 -560 497 -558 229 -296 229 -296 229 -300 497 -558 229 -294 265 -302 237 -308 243 -274 273 -270 233 -298 263 -266 265 -268 501 -558 231 -296 267 -306 241 -276 273 -270 497 -522 261 -258 257 -296 267 -270 507 -556 265 -266 271 -274 507 -524 519 -518 487 -548 259 -256 291 -264 269 -274 273 -310 241 -274 505 -524 259 -258 257 -296 265 -268 269 -270 271 -272 273 -306 241 -276 273 -270 495 -522 521 -516 259 -290 259 -264 505 -558 265 -266 271 -274 1001 -1010 1005 -990 1005 -996 1007 -1014 987 -1016 993 -1010 257 -276 247 -282 255 -294 499 -522 527 -520 523 -520 263 -296 503 -526 527 -520 259 -256 257 -294 265 -268 503 -558 231 -296 501 -560 497 -524 261 -262 259 -296 265 -266 497 -524 261 -296 265 -270 271 -308 241 -274 273 -270 233 -298 231 -298 265 -268 503 -556 231 -296 267 -306 239 -276 273 -270 497 -522 259 -258 291 -266 267 -270 505 -558 265 -266 271 -272 507 -522 521 -516 485 -550 257 -288 261 -266 269 -272 275 -306 241 -276 505 -522 261 -256 259 -296 265 -268 269 -270 271 -270 273 -308 241 -274 273 -270 497 -520 521 -518 261 -256 291 -264 503 -560 265 -266 269 -274 999 -1008 1003 -986 1007 -1004 1013 -980 1023 -1008 991 -1042 225 -276 247 -282 255 -294 501 -524 527 -518 527 -520 261 -296 503 -526 525 -520 259 -256 257 -294 265 -268 503 -526 263 -296 501 -560 497 -524 261 -262 261 -296 263 -266 499 -522 263 -294 265 -270 271 -308 241 -276 273 -270 233 -298 229 -298 265 -268 501 -558 231 -298 267 -304 241 -276 273 -270 495 -522 259 -290 261 -264 RAW_Data: 269 -270 505 -558 231 -300 271 -272 507 -522 521 -518 485 -550 259 -254 291 -264 271 -272 273 -308 241 -274 507 -524 259 -258 257 -296 265 -268 269 -270 271 -272 271 -308 241 -276 271 -270 497 -520 521 -520 259 -256 291 -266 503 -558 265 -266 271 -274 999 -1014 977 -1016 1007 -984 1007 -1014 999 -1016 991 -1010 271 -290 253 -254 291 -254 495 -542 499 -558 493 -522 263 -296 503 -526 525 -522 259 -256 257 -294 267 -268 503 -554 231 -298 501 -558 499 -524 261 -260 261 -298 231 -298 499 -524 261 -294 265 -268 273 -308 241 -276 271 -270 233 -298 231 -298 265 -266 503 -558 231 -298 267 -304 241 -274 273 -270 499 -520 259 -258 291 -266 267 -270 507 -558 233 -296 269 -274 505 -524 521 -520 485 -548 259 -256 291 -264 269 -272 275 -308 239 -276 507 -522 261 -256 259 -296 265 -268 267 -270 271 -272 273 -306 241 -276 271 -270 497 -520 523 -518 259 -290 259 -264 503 -560 265 -266 269 -274 999 -1008 1005 -986 1017 -994 1007 -1012 991 -1014 991 -1012 259 -276 245 -282 253 -294 499 -522 527 -520 525 -518 263 -296 501 -526 527 -520 259 -256 257 -294 265 -268 503 -558 231 -296 503 -558 501 -522 263 -260 259 -294 263 -266 499 -524 261 -296 265 -270 273 -308 241 -274 273 -270 233 -296 231 -296 267 -268 503 -556 231 -296 267 -304 241 -276 273 -270 499 -522 259 -256 259 -296 267 -272 505 -558 233 -298 271 -272 507 -522 521 -516 485 -550 259 -288 259 -264 271 -272 273 -308 241 -276 507 -522 261 -256 259 -296 265 -266 269 -270 271 -272 273 -308 241 -274 273 -270 497 -520 521 -518 259 -288 261 -266 503 -558 265 -266 271 -274 999 -1010 981 -1026 981 -1026 1007 -978 997 -1012 1019 -1006 255 -276 245 -280 255 -294 497 -524 525 -520 525 -520 261 -296 503 -526 527 -520 259 -256 257 -294 267 -268 503 -558 231 -296 499 -560 497 -524 261 -262 261 -296 263 -266 499 -524 261 -294 267 -268 273 -308 239 -276 273 -270 233 -296 231 -298 265 -268 503 -558 231 -296 267 -304 241 -274 273 -270 499 -520 259 -258 259 -298 267 -270 505 -558 265 -266 271 -274 507 -522 521 -516 485 -548 259 -288 259 -266 269 -272 275 -306 243 -274 507 -524 259 -258 257 -296 265 -268 269 -270 269 -272 273 -308 241 -276 271 -270 497 -520 521 -518 259 -290 259 -264 505 -560 263 -266 271 -274 999 -1008 1003 -986 1009 -1000 1011 -1006 1001 -1000 1003 -1018 259 -280 249 -286 261 -264 501 -522 527 -520 525 -518 263 -296 503 -526 525 -522 259 -256 257 -294 267 -266 RAW_Data: 505 -556 231 -296 501 -558 499 -522 263 -260 261 -296 265 -264 501 -524 261 -294 265 -270 271 -308 241 -274 273 -270 233 -298 231 -298 265 -266 503 -558 231 -296 267 -306 239 -276 273 -270 499 -522 259 -258 257 -296 269 -270 505 -560 231 -298 269 -272 507 -522 521 -518 487 -548 259 -288 259 -264 271 -272 273 -308 241 -276 507 -522 259 -258 257 -296 267 -268 269 -268 271 -272 273 -306 241 -276 271 -270 497 -522 519 -516 261 -288 261 -266 503 -558 265 -266 271 -274 997 -1014 979 -1014 1007 -984 1009 -1016 987 -1006 1013 -1014 273 -290 255 -254 253 -290 485 -526 527 -522 523 -520 263 -294 505 -526 525 -520 259 -256 257 -294 265 -268 501 -558 231 -298 501 -558 499 -522 263 -260 261 -296 263 -266 499 -522 263 -294 267 -268 273 -308 241 -274 273 -270 233 -298 231 -298 265 -266 503 -556 231 -296 269 -306 241 -274 273 -270 497 -520 261 -288 227 -298 269 -270 505 -556 265 -266 271 -274 507 -522 521 -516 487 -548 259 -288 259 -264 269 -272 275 -308 241 -274 507 -522 261 -256 259 -296 265 -268 267 -270 271 -272 275 -306 241 -276 271 -270 497 -520 521 -518 259 -288 259 -266 503 -558 267 -266 269 -274 999 -1006 1005 -986 1007 -1004 1011 -1014 987 -1014 993 -1012 271 -290 253 -254 255 -290 491 -536 503 -558 495 -554 231 -298 503 -524 527 -520 259 -256 257 -296 265 -268 501 -558 231 -298 501 -558 499 -524 261 -260 261 -296 263 -266 499 -522 263 -294 265 -270 273 -306 243 -274 273 -270 233 -298 231 -296 267 -268 501 -558 231 -296 267 -306 239 -276 271 -270 497 -522 261 -258 259 -296 267 -270 507 -560 231 -298 269 -274 505 -524 521 -518 487 -550 259 -254 257 -298 269 -272 275 -308 241 -274 507 -522 261 -256 257 -296 267 -266 269 -270 271 -272 273 -306 241 -276 273 -270 495 -522 519 -518 259 -290 261 -264 505 -558 231 -300 271 -272 999 -1008 1015 -980 1009 -988 1007 -1016 1001 -1010 983 -1044 237 -292 253 -292 253 -254 491 -560 497 -522 527 -520 263 -294 503 -528 527 -518 259 -256 257 -296 265 -268 503 -526 263 -296 501 -558 497 -524 261 -262 261 -296 231 -298 499 -524 261 -294 267 -268 273 -308 241 -274 273 -270 233 -298 229 -298 265 -268 503 -558 231 -298 267 -304 241 -274 273 -270 497 -522 259 -290 259 -266 267 -270 505 -558 265 -266 271 -272 507 -522 521 -520 487 -550 259 -254 257 -298 269 -272 273 -306 243 -274 507 -524 259 -258 257 -296 265 -268 269 -270 271 -270 273 -308 241 -274 273 -270 497 -522 RAW_Data: 519 -518 259 -288 261 -266 505 -558 231 -300 271 -272 997 -1012 1009 -982 1009 -986 1009 -1014 999 -1016 989 -1012 271 -288 253 -290 253 -256 495 -540 501 -558 495 -522 263 -296 501 -528 527 -520 259 -256 257 -294 265 -268 503 -556 233 -296 501 -558 499 -522 263 -260 261 -296 263 -266 499 -524 261 -294 267 -268 273 -308 241 -276 271 -270 233 -298 229 -300 265 -268 501 -556 231 -298 267 -306 241 -276 271 -270 499 -520 259 -258 259 -296 267 -272 505 -558 233 -298 271 -272 507 -522 521 -520 485 -552 259 -252 291 -264 271 -272 273 -308 241 -276 505 -522 259 -258 259 -296 265 -268 269 -270 271 -270 273 -308 241 -274 273 -270 497 -520 521 -518 259 -288 261 -266 503 -558 265 -266 269 -274 1001 -1006 1005 -984 1019 -998 1005 -1004 987 -1004 997 -1044 257 -248 279 -252 259 -296 501 -522 525 -520 525 -520 261 -296 503 -528 525 -520 259 -256 257 -294 267 -268 501 -558 231 -296 501 -560 497 -524 261 -262 259 -296 265 -264 501 -522 263 -294 265 -270 271 -308 241 -276 271 -270 233 -298 229 -298 267 -266 503 -558 231 -296 267 -306 239 -276 273 -270 497 -520 259 -290 227 -298 269 -270 505 -558 231 -298 271 -274 507 -522 521 -518 485 -550 257 -256 291 -264 269 -272 273 -308 241 -276 507 -522 259 -258 257 -296 265 -268 269 -270 271 -270 273 -308 241 -274 273 -270 497 -520 521 -518 259 -288 259 -264 503 -560 265 -266 271 -274 997 -1012 1011 -984 1005 -988 1007 -1014 1001 -1010 979 -1040 255 -274 245 -278 253 -292 495 -524 527 -520 525 -520 261 -296 499 -528 527 -520 259 -256 257 -294 265 -268 503 -556 231 -298 501 -560 499 -522 261 -260 261 -296 263 -266 501 -522 263 -294 265 -268 273 -308 241 -276 271 -270 231 -298 231 -298 267 -266 501 -558 231 -298 267 -304 241 -274 273 -270 499 -520 259 -258 259 -296 267 -270 507 -558 231 -300 271 -272 507 -522 521 -516 487 -550 259 -254 291 -266 269 -304 241 -308 241 -274 507 -524 259 -258 257 -296 265 -268 269 -270 271 -270 273 -308 241 -274 273 -270 497 -520 489 -548 261 -288 261 -264 503 -558 265 -266 271 -274 1001 -1010 977 -1028 981 -1024 1011 -978 997 -1014 1017 -1008 273 -252 255 -290 255 -290 491 -534 499 -522 527 -522 263 -294 503 -528 525 -520 259 -256 257 -294 267 -266 505 -558 231 -294 501 -558 499 -522 263 -260 261 -296 231 -298 499 -524 261 -296 265 -268 273 -306 241 -276 273 -270 231 -298 231 -296 267 -266 503 -558 231 -296 269 -304 239 -276 273 -270 497 -522 RAW_Data: 259 -258 259 -296 269 -270 505 -558 231 -300 271 -272 505 -524 521 -520 485 -552 227 -286 255 -298 269 -272 273 -308 241 -276 505 -524 259 -258 257 -296 265 -268 269 -270 271 -270 273 -308 241 -274 273 -270 497 -520 521 -518 259 -288 259 -266 503 -558 265 -266 271 -276 997 -1014 975 -1018 1009 -986 1009 -1018 985 -1002 1009 -1006 257 -274 275 -276 249 -286 493 -526 525 -520 523 -520 263 -296 501 -526 529 -520 259 -256 255 -296 265 -268 267 -32700 99 -100 529 -100 397 -134 231 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/clemsa.sub ================================================ Filetype: Flipper SubGhz Key File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: Clemsa Bit: 18 Key: 00 00 00 00 00 02 FC AA ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/clemsa_raw.sub ================================================ Filetype: Flipper SubGhz RAW File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: RAW RAW_Data: -334 10811 -4320 65 -100 65 -698 10157 -7550 65 -200 165 -166 133 -66 531 -66 331 -102 197 -132 133 -298 99 -132 263 -200 261 -988 99 -262 131 -296 97 -132 229 -100 459 -100 131 -132 393 -100 1119 -100 8325 -6376 133 -366 131 -562 65 -1034 131 -198 563 -168 365 -66 229 -332 297 -100 231 -166 429 -132 295 -166 97 -100 195 -724 97 -132 97 -1088 163 -200 1651 -100 2885 -8520 365 -166 97 -1558 163 -198 163 -132 465 -134 131 -66 267 -198 65 -232 299 -66 165 -166 65 -498 165 -100 233 -200 133 -166 131 -68 821 -100 263 -66 7633 -7610 1259 -200 99 -98 165 -1196 99 -132 263 -266 99 -200 463 -66 627 -66 1981 -98 7801 -4004 97 -628 65 -264 133 -1088 163 -134 131 -928 297 -166 133 -134 131 -266 297 -596 229 -164 427 -564 197 -166 265 -198 65 -100 559 -6708 131 -132 131 -430 527 -200 367 -66 263 -198 233 -98 299 -68 365 -296 465 -132 855 -66 857 -98 4741 -8312 99 -364 163 -200 133 -1428 529 -132 65 -166 595 -1392 97 -100 97 -132 99 -264 199 -828 99 -398 297 -66 233 -98 861 -100 663 -100 2357 -100 5075 -4640 131 -3312 231 -100 363 -132 99 -296 99 -132 165 -132 363 -98 165 -130 65 -98 165 -132 163 -130 63 -164 297 -198 9769 -3852 133 -98 67 -1226 329 -526 99 -164 295 -496 1713 -196 1681 -130 131 -132 5497 -7230 65 -1150 133 -330 259 -66 329 -100 97 -988 165 -134 197 -166 67 -100 361 -68 461 -100 231 -132 165 -66 365 -264 231 -100 99 -98 265 -696 99 -166 199 -100 101 -962 7101 -6484 363 -760 363 -132 265 -134 431 -264 329 -66 427 -330 263 -164 593 -130 231 -130 627 -66 399 -432 329 -526 131 -100 591 -166 9305 -4044 65 -3532 361 -98 163 -66 461 -264 197 -98 391 -66 329 -132 165 -136 463 -66 529 -166 131 -100 199 -264 133 -66 361 -98 689 -66 229 -198 627 -66 297 -100 261 -66 1685 -134 7883 -3932 229 -728 133 -98 133 -862 65 -132 99 -498 297 -166 133 -332 197 -132 693 -198 97 -656 1087 -64 6209 -6164 131 -266 99 -496 165 -432 67 -100 97 -330 821 -98 361 -100 493 -164 133 -66 197 -200 431 -66 65 -66 399 -66 331 -200 199 -402 131 -664 10955 -5314 65 -262 97 -198 97 -724 99 -196 65 -592 327 -66 625 -262 131 -66 197 -64 427 -132 65 -628 265 -332 329 -368 789 -66 8809 -6238 129 -328 295 -232 363 -98 431 -100 199 -98 261 -530 561 -592 263 -132 1645 -5358 65 -764 65 -330 165 -1158 197 -432 265 -98 397 -166 463 -498 561 -398 199 -66 199 -66 3479 RAW_Data: -12124 165 -626 65 -890 229 -362 1329 -66 2187 -98 2081 -66 725 -134 3309 -9856 165 -166 263 -198 65 -960 653 -66 261 -66 821 -66 12463 -4032 97 -166 97 -924 65 -464 97 -68 163 -198 165 -100 263 -232 97 -366 633 -12244 65 -332 231 -200 197 -134 197 -234 2457 -134 399 -132 923 -198 197 -64 331 -132 295 -66 11377 -3896 163 -98 65 -194 131 -132 231 -366 131 -132 65 -1050 197 -200 299 -66 3007 -100 11685 -6172 133 -1154 491 -100 293 -200 65 -98 429 -266 463 -64 797 -98 265 -266 397 -132 1227 -66 8485 -4224 97 -166 65 -100 199 -2706 65 -66 263 -98 299 -298 231 -100 499 -66 97 -134 295 -66 431 -198 565 -66 2093 -100 533 -4056 65 -1482 229 -1160 165 -168 299 -166 459 -66 165 -134 99 -100 497 -166 397 -200 431 -200 65 -66 661 -164 529 -66 4671 -8442 131 -100 65 -66 165 -530 131 -132 597 -66 963 -488 275 -2806 2641 -438 2639 -420 2691 -412 2677 -404 2669 -416 2693 -416 361 -2730 367 -2724 2665 -422 355 -2726 2687 -394 399 -2698 2697 -390 375 -2732 2701 -388 355 -21244 2697 -416 377 -2722 2675 -416 2689 -388 2707 -396 2679 -414 2689 -392 2717 -388 375 -2706 383 -2732 2673 -396 365 -2734 2695 -386 377 -2728 2689 -384 389 -2730 2671 -386 379 -21252 2693 -416 347 -2748 2687 -396 2707 -384 2701 -388 2679 -412 2701 -418 2669 -404 363 -2726 385 -2698 2699 -416 355 -2706 2689 -416 365 -2736 2673 -386 415 -2692 2709 -378 361 -21270 2685 -452 311 -2774 2637 -442 2665 -418 2661 -448 2653 -408 2703 -384 2687 -410 365 -2738 355 -2742 2689 -382 371 -2738 2677 -384 415 -2700 2673 -410 363 -2730 2701 -386 357 -21270 2705 -398 361 -2740 2689 -386 2679 -414 2687 -410 2673 -418 2697 -386 2681 -412 383 -2702 395 -2706 2703 -380 385 -2696 2709 -418 355 -2702 2699 -418 361 -2700 2717 -386 375 -21242 2697 -418 355 -2748 2695 -382 2683 -410 2703 -380 2707 -384 2705 -404 2675 -416 383 -2700 359 -2728 2695 -382 385 -2728 2687 -416 357 -2708 2705 -386 389 -2700 2717 -388 373 -21234 2721 -418 353 -2724 2667 -416 2705 -380 2693 -386 2711 -384 2691 -422 2699 -398 365 -2726 385 -2700 2703 -378 361 -2728 2697 -420 357 -2704 2711 -388 377 -2734 2667 -406 363 -21260 2699 -418 361 -2702 2711 -380 2695 -416 2689 -402 2687 -384 2695 -416 2677 -408 361 -2732 385 -2704 2707 -414 325 -2730 2695 -418 361 -2728 2669 -414 385 -2702 2701 -414 355 -21246 2705 -378 379 -2728 2693 -384 2715 -380 2717 -386 2695 -390 2709 -388 2683 -420 355 -2730 385 -2700 2685 -416 347 -2748 2683 -396 365 -2740 2667 -416 385 -2696 2693 -414 349 -21260 2689 -452 319 -2762 2631 -476 2627 -430 2689 RAW_Data: -416 2667 -412 2671 -416 2689 -424 347 -2732 353 -2738 2669 -410 363 -2728 2689 -410 349 -2742 2677 -386 415 -2696 2705 -380 361 -21254 2717 -386 413 -2700 2693 -380 2695 -416 2691 -398 2679 -416 2699 -384 2709 -382 367 -2726 361 -2730 2707 -382 377 -2728 2675 -386 411 -2684 2713 -414 357 -2704 2707 -388 357 -21276 2699 -382 385 -2724 2689 -416 2661 -416 2685 -384 2723 -388 2703 -400 2677 -416 385 -2696 357 -2724 2713 -384 375 -2726 2673 -420 355 -2728 2685 -396 397 -2688 2697 -408 363 -21252 2667 -484 311 -2766 2635 -476 2637 -420 2665 -448 2651 -408 2701 -384 2697 -406 355 -2758 327 -2736 2685 -420 361 -2728 2683 -384 385 -2726 2685 -414 357 -2708 2711 -388 375 -21246 2689 -448 323 -2750 2695 -378 2715 -386 2687 -392 2711 -384 2683 -416 2705 -412 327 -2732 387 -2728 2679 -416 357 -2738 2659 -418 363 -2732 2677 -386 413 -2700 2695 -380 391 -21258 2679 -406 383 -2706 2695 -384 2703 -418 2679 -404 2705 -380 2687 -418 2669 -410 359 -2726 387 -2696 2707 -416 357 -2710 2693 -418 361 -2730 2691 -380 385 -2730 2677 -414 357 -21254 2711 -382 385 -2700 2713 -414 2667 -384 2705 -418 2675 -406 2699 -382 2689 -418 365 -2726 377 -2708 2701 -384 389 -2698 2709 -398 361 -2738 2669 -416 385 -2692 2687 -418 357 -77456 131 -398 197 -132 295 -330 97 -132 229 -164 459 -164 295 -264 393 -264 719 -64 427 -98 855 -134 395 -98 297 -164 263 -262 65 -100 63 -132 197 -328 1185 -66 9359 -6420 261 -664 131 -100 299 -134 301 -232 363 -232 299 -200 165 -166 427 -230 299 -164 361 -394 1025 -100 225 -820 165 -1248 491 -100 293 -66 261 -264 131 -98 589 -164 655 -132 427 -132 295 -164 129 -132 163 -328 263 -196 627 -566 129 -100 131 -98 2377 -130 1255 -3878 297 -232 195 -132 65 -98 165 -596 397 -266 99 -198 363 -98 923 -100 431 -66 1383 -3724 297 -166 165 -66 99 -398 265 -266 463 -232 133 -232 65 -230 65 -266 959 -200 99 -298 231 -68 65 -100 97 -398 363 -132 199 -134 133 -134 133 -266 593 -66 363 -66 827 -2374 65 -1724 399 -166 265 -100 331 -198 165 -398 233 -98 233 -66 165 -266 97 -66 231 -132 165 -298 395 -234 99 -132 65 -100 99 -132 131 -66 297 -264 197 -194 229 -530 2189 -166 9577 -3702 199 -98 465 -398 97 -134 395 -132 429 -100 529 -68 263 -132 265 -368 263 -860 97 -100 163 -196 427 -98 163 -166 327 -98 493 -166 327 -98 233 -5094 99 -198 97 -100 65 -1250 131 -560 855 -66 855 -262 859 -164 10219 -7528 761 -66 1121 -100 429 -298 331 -232 263 -166 261 -166 265 -100 1427 -98 9787 -6682 131 -564 429 RAW_Data: -66 529 -66 2519 -66 265 -68 10101 -1794 65 -1890 393 -562 97 -132 197 -98 493 -330 97 -164 97 -230 327 -326 99 -100 97 -164 65 -132 293 -98 297 -166 161 -130 297 -230 1391 -68 11185 -3800 229 -230 297 -66 65 -198 65 -466 99 -464 99 -430 67 -698 295 -132 165 -164 1095 -66 299 -66 1321 -264 12675 -66 99 -166 229 -134 65 -330 165 -164 65 -890 131 -830 67 -66 1157 -100 167 -168 265 -66 827 -66 2047 -100 261 -594 2279 -134 10701 -3890 163 -1384 67 -98 99 -1322 99 -98 65 -398 823 -66 65 -68 927 -100 495 -132 593 -100 165 -198 1387 -1022 131 -728 99 -662 97 -462 495 -200 829 -330 563 -100 297 -330 65 -598 165 -592 295 -166 131 -764 165 -164 565 -66 131 -166 165 -66 9675 -5052 165 -2878 199 -66 265 -432 265 -66 267 -898 163 -132 231 -198 229 -164 97 -100 4445 -66 7853 -636 199 -662 265 -298 233 -1428 331 -134 1791 -66 1649 -66 297 -100 361 -198 559 -98 363 -200 1315 -66 265 -98 1049 -132 1647 -66 265 -822 295 -526 131 -1712 199 -166 231 -200 165 -66 265 -166 97 -132 163 -164 395 -630 495 -168 297 -298 229 -266 629 -200 133 -132 133 -166 65 -132 99 -100 131 -66 67 -98 133 -496 1391 -98 1751 -164 359 -132 97 -164 263 -64 691 -66 199 -66 293 -98 589 -198 11299 -3968 65 -68 65 -2702 65 -1186 927 -166 65 -66 429 -134 197 -134 529 -200 67 -66 231 -100 2151 -4014 97 -1486 99 -464 65 -330 129 -330 331 -134 599 -66 497 -200 165 -66 661 -166 6881 -8830 295 -100 197 -232 725 -134 299 -166 229 -166 525 -198 295 -66 459 -66 329 -230 595 -98 299 -132 329 -66 99 -98 163 -134 229 -100 8345 -6726 131 -132 295 -66 1579 -66 329 -98 501 -132 231 -66 491 -298 331 -266 363 -132 1193 -168 8847 -4194 199 -828 65 -100 195 -262 197 -298 65 -898 65 -132 629 -66 229 -100 291 -100 623 -66 295 -66 461 -132 529 -632 597 -132 65 -100 97 -134 297 -100 297 -166 397 -168 527 -134 9603 -3850 99 -200 67 -896 959 -198 165 -100 229 -266 531 -64 165 -132 163 -296 3715 -11994 165 -1492 429 -68 263 -100 265 -330 199 -64 495 -132 363 -66 63 -166 297 -398 65 -100 231 -332 199 -100 7683 -4916 65 -1294 297 -1022 1325 -166 393 -132 165 -498 1255 -134 197 -198 427 -164 329 -132 631 -594 199 -196 99 -100 265 -134 1457 -100 3649 -8592 67 -268 131 -332 99 -100 65 -760 101 -198 297 -168 199 -132 369 -100 97 -132 99 -232 397 -198 99 -134 97 -100 231 -332 131 -796 329 -266 263 RAW_Data: -100 10841 -4030 163 -164 197 -398 195 -592 65 -132 63 -430 295 -298 263 -200 3517 -132 3763 -12296 99 -330 361 -98 99 -200 65 -430 165 -166 2327 -100 4051 -66 9653 -3478 197 -66 163 -198 167 -66 65 -598 165 -298 131 -666 199 -198 299 -298 165 -200 565 -66 797 -98 1125 -98 825 -100 4113 -6956 65 -5536 165 -266 99 -232 461 -198 65 -200 1989 -66 295 -66 723 -66 65 -98 329 -98 955 -66 559 -232 331 -66 10851 -1048 65 -3748 65 -498 99 -1392 99 -794 529 -98 331 -98 397 -164 363 -394 331 -266 299 -230 165 -66 3001 -568 197 -2872 2579 -468 2637 -472 2599 -488 2647 -426 2653 -448 2665 -392 379 -2734 381 -2700 2691 -388 377 -2732 2669 -420 355 -2726 2687 -394 403 -2706 2687 -388 377 -21248 2717 -388 377 -2738 2659 -408 2703 -382 2689 -416 2679 -408 2701 -382 2687 -418 365 -2736 365 -2722 2689 -384 391 -2696 2707 -386 379 -2734 2665 -410 361 -2726 2703 -418 357 -21246 2679 -466 297 -2768 2657 -448 2627 -434 2669 -450 2653 -416 2673 -408 2697 -386 383 -2728 369 -2706 2701 -382 387 -2726 2687 -418 357 -2708 2693 -418 361 -2702 2709 -396 401 -21232 2689 -406 361 -2736 2695 -386 2695 -406 2695 -382 2687 -418 2675 -410 2693 -414 375 -2692 389 -2706 2701 -404 363 -2724 2695 -388 389 -2702 2719 -358 405 -2704 2701 -402 363 -21262 2677 -414 367 -2738 2677 -386 2693 -420 2701 -400 2677 -386 2695 -420 2669 -430 369 -2718 353 -2730 2673 -412 361 -2734 2691 -420 357 -2698 2701 -394 401 -2702 2687 -424 347 -21244 2701 -418 365 -2726 2703 -382 2697 -420 2675 -400 2685 -384 2721 -398 2667 -418 355 -2744 343 -2722 2703 -420 353 -2724 2689 -396 363 -2736 2687 -390 377 -2730 2697 -386 357 -21274 2683 -414 375 -2726 2667 -420 2703 -398 2677 -388 2695 -420 2699 -398 2671 -384 415 -2698 357 -2738 2695 -382 383 -2724 2685 -416 357 -2706 2707 -384 391 -2726 2671 -384 415 -21238 2651 -476 293 -2776 2653 -462 2641 -446 2661 -422 2663 -418 2689 -412 2683 -414 357 -2706 385 -2698 2715 -378 379 -2710 2719 -388 377 -2708 2695 -406 361 -2724 2689 -416 361 -21244 2703 -386 413 -2698 2697 -414 2689 -384 2685 -386 2719 -378 2701 -416 2689 -386 377 -2728 387 -2700 2673 -410 361 -2730 2695 -420 357 -2732 2679 -386 377 -2734 2699 -378 361 -21262 2697 -392 405 -2702 2687 -406 2703 -382 2703 -418 2671 -406 2677 -416 2695 -386 387 -2700 381 -2704 2695 -418 357 -2712 2721 -388 375 -2702 2693 -408 363 -2730 2693 -420 355 -21248 2653 -494 289 -91206 131 -132 97 -232 559 -132 591 -98 691 -66 131 -130 297 -66 231 -66 331 -66 433 -100 499 -132 231 -166 197 -134 593 -100 11707 -4456 133 -200 131 RAW_Data: -66 133 -66 97 -166 561 -100 895 -132 1323 -66 10873 -3752 99 -722 229 -394 97 -66 99 -98 99 -328 297 -328 265 -298 3089 -132 10573 -1460 133 -432 99 -232 99 -132 333 -232 731 -164 65 -166 165 -132 131 -330 65 -98 131 -596 65 -198 133 -98 397 -568 65 -132 1157 -166 195 -130 131 -64 99 -66 63 -198 265 -98 297 -66 63 -166 295 -100 1747 -232 6099 -11348 199 -528 297 -266 97 -598 99 -198 231 -64 4433 -334 65 -298 65 -3284 67 -530 97 -432 133 -2356 493 -68 231 -168 297 -266 427 -100 559 -98 229 -460 197 -66 261 -132 65 -98 565 -132 231 -66 497 -100 3491 -12356 65 -660 197 -198 165 -132 331 -134 65 -98 2651 -134 4531 -10850 65 -1322 263 -68 431 -232 165 -134 165 -202 231 -300 5625 -66 6951 -8162 65 -398 99 -596 65 -132 461 -598 429 -132 97 -132 463 -232 229 -98 329 -100 397 -100 363 -100 231 -200 163 -200 961 -66 693 -100 397 -134 10601 -3872 263 -100 165 -100 131 -198 99 -696 233 -1524 331 -132 131 -164 229 -132 493 -98 631 -134 231 -100 595 -66 295 -66 5965 -8248 99 -296 99 -98 397 -66 65 -924 229 -398 299 -98 1425 -130 565 -198 827 -262 429 -598 725 -704 729 -12290 131 -98 99 -98 65 -100 163 -164 65 -494 231 -100 97 -100 863 -66 1751 -3948 165 -100 195 -66 165 -296 65 -2042 99 -200 495 -132 557 -100 827 -98 167 -66 433 -100 661 -164 689 -98 10803 -3906 231 -296 295 -232 99 -234 131 -332 395 -266 1283 -164 755 -466 397 -164 335 -66 1355 -14376 557 -66 331 -68 431 -134 599 -364 229 -100 763 -98 265 -132 525 -166 99 -396 495 -98 3867 -134 595 -168 865 -166 503 -200 467 -134 8145 -458 235 -794 599 -458 265 -436 231 -426 333 -368 299 -730 689 -360 327 -370 363 -326 367 -668 733 -328 363 -302 397 -328 371 -296 393 -666 725 -622 795 -634 433 -264 1023 -228 5041 -762 585 -466 233 -826 235 -470 631 -368 299 -402 299 -726 361 -328 331 -370 363 -332 701 -298 401 -692 369 -302 759 -268 461 -236 435 -622 423 -260 465 -266 719 -13608 65 -624 197 -558 921 -164 1315 -134 465 -134 263 -100 295 -132 293 -66 329 -98 197 -132 9977 -5036 197 -798 333 -828 295 -100 197 -100 165 -66 665 -100 763 -300 297 -166 165 -98 823 -8348 229 -100 427 -196 263 -624 197 -134 797 -100 263 -68 529 -132 233 -134 165 -264 131 -132 559 -66 263 -228 927 -132 731 -102 1061 -66 863 -8206 131 -332 299 -166 461 -100 99 -66 429 -66 3271 -98 465 -100 401 -232 331 -66 397 -430 10341 RAW_Data: -5434 65 -298 133 -132 131 -68 231 -200 661 -132 9517 -424 97 -1456 99 -1694 393 -100 131 -560 131 -196 197 -298 65 -428 229 -196 297 -266 131 -166 2435 -66 10161 -11230 65 -1320 131 -298 265 -532 231 -200 1291 -68 631 -66 12645 -4048 133 -66 67 -132 167 -266 163 -66 397 -132 197 -132 299 -98 197 -198 2903 -66 2361 -66 9627 -3588 197 -332 165 -68 331 -68 197 -132 99 -100 663 -66 363 -230 231 -166 131 -100 201 -298 163 -132 133 -202 363 -300 397 -102 263 -100 165 -66 1221 -66 1479 -132 165 -98 229 -12976 263 -66 363 -134 231 -66 629 -132 327 -100 97 -130 99 -164 227 -64 297 -132 397 -164 425 -198 97 -198 99 -66 365 -164 199 -102 97 -66 1817 -13524 231 -134 16907 -4086 233 -630 65 -396 201 -66 165 -198 67 -198 99 -664 2117 -166 12473 -446 2649 -440 2661 -420 2651 -422 2681 -418 2703 -400 365 -2724 387 -2696 2695 -414 357 -2704 2707 -386 389 -2700 2687 -392 405 -2706 2695 -402 363 -21268 2707 -388 377 -2706 2691 -404 2699 -382 2717 -382 2707 -378 2693 -416 2687 -396 363 -2736 355 -2748 2659 -416 365 -2708 2715 -388 377 -2708 2697 -404 363 -2730 2673 -420 355 -21268 2655 -460 319 -2766 2663 -448 2631 -436 2665 -418 2683 -410 2681 -416 2701 -386 383 -2700 375 -2744 2669 -416 353 -2730 2685 -416 357 -2708 2721 -380 369 -2724 2697 -382 385 -21260 2701 -418 353 -2720 2673 -418 2675 -408 2693 -384 2715 -386 2717 -386 2691 -404 363 -2732 387 -2702 2669 -412 359 -2736 2699 -380 381 -2728 2675 -416 381 -2720 2675 -414 347 -21280 2685 -390 377 -2724 2689 -416 2673 -408 2705 -382 2695 -410 2689 -414 2661 -418 385 -2704 369 -2704 2693 -416 375 -2726 2661 -420 355 -2728 2711 -388 375 -2702 2691 -410 363 -21252 2659 -488 287 -2794 2651 -448 2629 -436 2671 -416 2695 -416 2663 -406 2699 -384 383 -2730 367 -2702 2695 -418 385 -2702 2685 -412 349 -2744 2693 -366 389 -2714 2693 -394 381 -21266 2685 -418 363 -2730 2683 -382 2693 -418 2675 -410 2699 -384 2719 -382 2707 -380 359 -2734 387 -2704 2709 -380 361 -2732 2699 -418 357 -2728 2667 -416 383 -2696 2709 -380 391 -21228 2685 -458 307 -2800 2647 -412 2659 -432 2667 -416 2695 -416 2675 -406 2675 -416 383 -2700 361 -2730 2687 -414 375 -2696 2701 -420 353 -2720 2711 -382 367 -2728 2675 -416 385 -21222 2735 -386 355 -2744 2687 -396 2679 -418 2701 -386 2705 -382 2681 -410 2697 -384 385 -2736 365 -2704 2715 -384 377 -2696 2697 -416 349 -2722 2707 -386 379 -2732 2671 -410 361 -21258 2681 -464 297 -2796 2629 -456 2655 -420 2661 -448 2663 -404 2695 -382 2715 -380 371 -2740 355 -2744 2679 -384 391 -2728 2675 -388 379 RAW_Data: -2728 2695 -414 357 -2704 2705 -418 357 -21262 2673 -416 383 -2696 2709 -380 2703 -384 2699 -418 2671 -408 2695 -382 2713 -386 379 -2730 357 -2732 2695 -384 383 -2730 2679 -416 357 -2708 2701 -410 349 -2736 2697 -382 385 -21252 2669 -478 289 -2790 2647 -426 2651 -444 2653 -430 2659 -418 2695 -414 2681 -402 349 -2738 383 -2722 2677 -414 347 -2744 2691 -382 369 -2730 2691 -384 383 -2734 2679 -414 347 -21264 2705 -386 379 -2736 2667 -410 2695 -382 2715 -380 2709 -420 2665 -392 2713 -382 383 -2730 365 -2728 2665 -418 383 -2696 2693 -418 357 -2710 2711 -380 375 -2718 2701 -416 357 -21238 2677 -484 311 -2766 2635 -444 2657 -420 2663 -422 2695 -416 2667 -428 2675 -396 363 -73890 133 -98 131 -132 129 -658 99 -66 853 -100 63 -100 361 -98 1589 -66 1231 -132 65 -100 297 -198 65 -132 265 -66 9857 -4672 165 -1030 97 -1394 65 -200 2687 -68 6873 -8336 99 -1156 97 -66 163 -232 163 -262 197 -132 295 -132 263 -166 953 -100 263 -130 393 -164 295 -64 329 -66 393 -164 823 -130 165 -66 6133 -8436 165 -164 265 -266 65 -362 197 -696 3181 -132 363 -98 65 -166 131 -66 399 -132 663 -396 329 -66 7335 -7578 497 -230 627 -264 99 -366 99 -132 131 -134 265 -498 163 -100 1323 -66 265 -66 1129 -100 399 -132 365 -100 795 -68 397 -98 597 -364 297 -132 361 -132 265 -132 8591 -4740 65 -100 131 -166 199 -1088 97 -296 99 -528 131 -98 661 -66 401 -198 1157 -166 361 -164 495 -100 165 -66 297 -100 1423 -66 3067 -5658 67 -6406 197 -1092 65 -530 659 -68 265 -100 991 -68 231 -230 297 -66 327 -66 131 -132 659 -134 131 -100 1183 -132 263 -98 621 -66 2075 -6976 65 -5138 67 -132 129 -664 67 -132 165 -100 331 -466 231 -68 467 -98 563 -66 231 -100 531 -66 465 -66 1023 -166 297 -134 3409 -12290 67 -164 99 -532 133 -166 263 -66 231 -66 721 -64 131 -68 959 -134 495 -100 299 -98 497 -98 365 -100 397 -232 297 -98 531 -66 3029 -12216 265 -132 99 -364 199 -234 131 -66 431 -166 333 -166 397 -132 327 -100 395 -66 197 -132 395 -66 527 -98 295 -100 97 -98 789 -132 363 -132 297 -200 2815 -4914 65 -6620 65 -462 65 -134 297 -66 497 -264 231 -198 2773 -134 365 -100 831 -166 131 -100 297 -132 861 -132 299 -100 561 -66 1381 -6946 65 -5516 231 -266 97 -1362 1093 -68 1621 -134 165 -332 297 -98 361 -228 97 -132 797 -98 3487 -13224 229 -164 65 -132 913 -66 1123 -98 527 -134 929 -98 723 -100 12259 -270 165 -132 67 -132 165 -1326 99 -98 65 -1194 431 -66 695 -66 733 -134 197 RAW_Data: -134 10801 -166 67 -6130 133 -198 231 -334 365 -98 229 -132 165 -68 231 -166 14501 -524 65 -328 131 -498 129 -1288 65 -494 163 -64 165 -66 527 -132 131 -132 1019 -198 129 -166 393 -198 65 -164 6411 -66 3255 -10642 65 -1320 165 -164 493 -492 559 -264 2555 -66 695 -66 1657 -164 855 -66 4001 -10526 97 -596 133 -298 67 -264 65 -300 65 -100 263 -166 231 -134 99 -100 2703 -68 13643 -4922 297 -100 65 -232 133 -198 331 -300 231 -66 331 -100 12047 -3872 97 -196 65 -494 329 -66 65 -890 97 -98 229 -164 195 -596 797 -66 861 -132 65 -66 231 -100 565 -66 65 -66 1297 -132 265 -66 363 -134 265 -364 297 -164 299 -134 297 -134 495 -98 11309 -3790 131 -1380 65 -758 65 -164 129 -460 65 -360 199 -100 563 -68 497 -198 363 -266 263 -100 165 -66 697 -66 1933 -13594 65 -762 1223 -132 1119 -196 361 -134 131 -100 793 -166 695 -68 231 -68 463 -66 11727 -4204 363 -264 131 -132 133 -1124 97 -100 163 -100 327 -100 331 -198 397 -66 397 -100 395 -100 163 -66 197 -564 1059 -7962 65 -100 65 -198 129 -362 99 -394 197 -296 495 -100 1357 -68 459 -66 593 -66 265 -68 301 -132 465 -66 231 -200 397 -66 397 -232 199 -298 12077 -4350 231 -796 363 -198 133 -264 65 -1132 597 -332 3295 -100 755 -98 231 -164 97 -264 459 -166 759 -164 3265 -12138 99 -232 99 -1228 1025 -100 393 -66 531 -132 693 -132 1063 -66 427 -64 297 -294 229 -98 9723 -5404 67 -466 99 -796 267 -98 201 -100 167 -264 461 -98 1415 -66 861 -66 267 -66 331 -134 1663 -66 2089 -7012 65 -100 101 -4804 431 -728 99 -100 65 -100 995 -134 165 -66 929 -100 65 -66 927 -100 1093 -168 99 -100 497 -66 665 -200 6517 -8312 165 -66 129 -66 559 -166 99 -430 65 -398 67 -66 593 -198 459 -132 261 -132 263 -130 723 -66 459 -100 325 -166 67 -198 559 -66 493 -66 11475 -3896 99 -266 99 -66 197 -1092 129 -198 361 -166 163 -98 263 -196 759 -100 265 -100 365 -630 4635 -12748 65 -1712 461 -100 497 -66 395 -98 265 -98 229 -164 529 -132 297 -66 565 -132 987 -132 8665 -2820 2265 -450 313 -2774 2643 -442 325 -2772 2665 -416 359 -2734 2667 -386 379 -21274 2657 -474 293 -2810 2619 -466 2613 -476 2629 -452 2663 -388 2683 -418 2705 -400 365 -2722 387 -2700 2697 -380 361 -2732 2691 -418 361 -2732 2667 -416 383 -2698 2697 -416 357 -21238 2715 -384 383 -2732 2685 -416 2667 -416 2695 -398 2671 -418 2687 -390 2713 -382 383 -2730 365 -2728 2661 -416 379 -2716 2685 -384 379 -2720 2703 -378 401 -2718 2671 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/dickert_mahs.sub ================================================ Filetype: Flipper SubGhz Key File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: Dickert_MAHS Bit: 36 Key: 00 00 00 01 55 57 55 15 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/dickert_raw.sub ================================================ Filetype: Flipper SubGhz RAW File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: RAW RAW_Data: 112254 -62882 64 -8912 798 -844 416 -418 806 -850 396 -45206 440 -428 794 -442 804 -422 822 -810 414 -414 824 -832 412 -416 808 -848 376 -446 792 -846 382 -448 816 -828 410 -416 810 -844 382 -416 834 -818 410 -414 810 -856 408 -810 412 -836 384 -442 808 -814 402 -844 414 -834 378 -436 808 -844 396 -422 798 -844 416 -416 814 -404 812 -440 810 -842 396 -422 798 -840 414 -414 806 -850 398 -45210 450 -420 796 -436 780 -446 802 -848 380 -434 806 -846 400 -422 800 -840 410 -408 836 -812 414 -410 826 -840 378 -440 804 -848 396 -426 812 -810 426 -394 826 -844 414 -810 420 -834 378 -442 808 -832 412 -812 416 -830 410 -406 810 -844 400 -420 832 -810 414 -416 800 -446 798 -440 812 -808 426 -410 800 -836 412 -414 806 -836 412 -45216 450 -420 798 -434 806 -414 802 -846 382 -438 814 -832 410 -410 838 -834 396 -430 810 -842 394 -392 826 -840 414 -414 802 -850 396 -428 812 -842 394 -394 828 -842 414 -810 424 -812 392 -434 812 -844 398 -848 380 -844 408 -416 820 -810 414 -406 816 -836 412 -416 836 -414 816 -398 816 -840 420 -410 802 -844 416 -416 804 -824 410 -45232 446 -400 802 -442 810 -432 804 -842 396 -392 826 -842 410 -410 834 -818 378 -442 804 -854 406 -408 806 -838 408 -428 804 -844 396 -392 826 -840 410 -410 834 -810 414 -832 408 -834 380 -440 802 -826 410 -836 412 -838 396 -424 796 -842 414 -414 804 -848 396 -426 812 -412 814 -414 824 -832 410 -416 806 -848 382 -420 834 -814 422 -45228 416 -422 802 -446 810 -420 790 -846 382 -448 818 -828 408 -416 808 -848 382 -418 830 -816 410 -412 812 -856 410 -382 834 -846 382 -418 832 -818 408 -412 812 -856 408 -814 414 -838 396 -428 810 -808 424 -836 380 -844 404 -416 802 -840 424 -394 826 -840 414 -382 836 -412 822 -436 812 -806 424 -394 826 -844 416 -382 838 -816 402 -45228 438 -430 796 -444 806 -424 822 -810 412 -416 822 -832 412 -416 804 -844 408 -414 824 -812 412 -408 812 -834 410 -414 804 -848 408 -412 802 -840 424 -412 802 -834 412 -842 384 -848 396 -426 814 -808 424 -816 392 -866 382 -414 838 -816 414 -428 792 -846 380 -440 810 -438 812 -412 802 -846 380 -438 826 -840 380 -416 838 -814 404 -45226 450 -404 820 -408 806 -452 792 -848 382 -440 814 -832 410 -416 810 -846 378 -450 792 -846 380 -446 816 -830 410 -386 836 -846 376 -410 828 -846 380 -446 814 -828 410 -814 414 -836 396 -428 810 -842 394 -816 410 -836 406 -430 812 -810 426 -394 826 -838 RAW_Data: 414 -414 808 -416 826 -438 814 -816 420 -414 834 -814 418 -418 808 -848 398 -45218 412 -438 824 -412 812 -418 832 -852 378 -446 782 -862 410 -386 838 -848 384 -420 836 -820 418 -414 814 -854 408 -388 838 -814 418 -422 836 -816 394 -434 812 -846 398 -850 380 -848 410 -418 822 -812 416 -850 368 -854 412 -418 810 -850 384 -422 834 -820 416 -414 812 -428 836 -412 804 -848 382 -450 818 -828 412 -418 808 -850 380 -45228 452 -420 798 -434 806 -416 834 -818 384 -440 810 -820 404 -420 834 -814 416 -418 834 -824 386 -442 810 -818 404 -420 834 -814 416 -418 834 -820 410 -414 810 -850 406 -812 414 -816 404 -420 818 -838 386 -848 394 -828 414 -414 838 -814 406 -420 820 -842 384 -446 794 -438 810 -412 802 -848 394 -432 812 -842 394 -392 830 -842 414 -105578 64 -1760 130 -196 130 -832 160 -128 62 -1278 194 -1316 230 -96 362 -64 64 -398 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/doitrand.sub ================================================ Filetype: Flipper SubGhz Key File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: Doitrand Bit: 37 Key: 00 00 00 1E 60 08 2F 5F ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/doitrand_raw.sub ================================================ Filetype: Flipper SubGhz RAW File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: RAW RAW_Data: 1549 -1166 409 -1138 363 -1144 407 -1144 385 -408 1599 -1138 377 -430 1593 -1138 421 -1110 393 -1126 409 -1136 377 -1162 353 -24626 823 -1176 379 -1150 353 -1174 349 -1158 377 -454 1541 -450 1561 -1190 383 -1118 411 -398 1557 -460 1571 -450 1547 -482 1537 -450 1561 -482 1547 -470 1537 -450 1547 -482 1539 -1176 387 -422 1541 -474 1537 -448 1545 -444 1539 -450 1543 -1136 375 -414 1549 -1142 417 -1102 387 -1118 385 -1140 381 -406 1549 -1180 383 -392 1549 -1140 417 -1122 383 -1116 383 -1140 415 -1102 355 -24628 823 -1188 357 -1180 343 -1172 385 -1150 361 -440 1513 -450 1563 -1184 369 -1158 381 -448 1539 -448 1527 -482 1545 -456 1545 -450 1533 -454 1579 -450 1561 -458 1513 -450 1555 -1182 389 -390 1571 -436 1571 -418 1581 -446 1505 -456 1511 -1160 391 -390 1339 -1108 381 -1098 361 -1150 309 -1124 331 -416 1065 -1142 353 -420 1049 -1148 319 -1156 345 -1128 347 -1134 317 -1138 319 -24716 687 -1178 309 -1138 317 -1166 319 -1162 327 -408 1039 -448 1067 -1152 321 -1132 313 -436 1065 -426 1039 -442 1039 -448 1049 -418 1041 -450 1035 -426 1039 -444 1041 -418 1047 -1144 339 -402 1069 -414 1071 -422 1051 -450 1029 -424 1069 -1144 335 -418 1043 -1178 319 -1134 321 -1174 309 -1164 313 -454 1049 -1148 317 -410 1051 -1160 353 -1124 321 -1166 349 -1122 329 -1178 277 -24734 677 -1178 299 -1182 309 -1154 337 -1144 307 -430 1047 -448 1039 -1174 319 -1164 289 -452 1033 -444 1031 -450 1035 -426 1063 -412 1047 -448 1041 -446 1033 -426 1041 -438 1049 -1152 289 -438 1071 -414 1031 -448 1039 -460 1033 -414 1079 -1146 309 -428 1049 -1178 311 -1154 337 -1144 329 -1162 319 -408 1051 -1160 353 -404 1059 -1164 317 -1154 325 -1140 347 -1152 333 -1138 285 -24770 657 -1178 315 -1162 289 -1184 313 -1152 329 -446 1039 -416 1047 -1170 343 -1128 351 -418 1021 -454 1047 -416 1061 -422 1033 -454 1043 -446 1039 -416 1065 -414 1041 -424 1033 -1178 301 -450 1041 -416 1051 -452 1045 -422 1033 -454 1043 -1172 283 -436 1065 -1146 329 -1176 311 -1150 337 -1148 309 -430 1049 -1174 299 -432 1061 -1180 289 -1178 311 -1162 347 -1150 307 -1160 311 -24722 607 -1296 203 -1264 207 -1266 227 -1252 239 -498 969 -506 1013 -1214 275 -1166 289 -480 1005 -484 1003 -476 1009 -454 1009 -480 1025 -458 1003 -448 1045 -448 1009 -450 1035 -1146 321 -444 1033 -444 1029 -444 1041 -442 1041 -416 1081 -1148 343 -396 1081 -1146 345 -1120 341 -1150 345 -1120 343 -420 1077 -1146 321 -420 1053 -1152 355 -1122 321 -1162 349 -1150 297 -1178 311 -24720 523 -4340 133 -1370 99 -636 67 -1406 393 -98 397 -1320 207 -1260 225 -498 975 -522 937 -540 977 -488 973 -510 987 -490 1005 -456 1003 -476 RAW_Data: 1015 -450 1005 -1194 289 -454 1011 -478 1009 -478 1007 -450 1033 -446 1035 -1158 353 -404 1057 -1168 309 -1162 349 -1150 309 -1158 313 -452 1047 -1146 321 -420 1059 -1152 355 -1126 319 -1160 345 -1128 353 -1152 309 -78850 165 -1196 97 -3256 65 -626 165 -130 525 -66 625 -430 891 -492 163 -792 163 -66 197 -100 595 -132 229 -15220 165 -464 97 -66 197 -264 99 -998 67 -198 195 -132 65 -296 163 -198 65 -198 691 -66 985 -134 97 -66 1485 -15420 197 -200 63 -132 97 -526 231 -64 263 -754 425 -198 97 -166 97 -132 495 -100 555 -164 391 -98 261 -98 1221 -9074 97 -2604 65 -1942 195 -590 853 -132 1225 -66 987 -1058 97 -100 131 -132 593 -98 425 -66 3965 -11360 65 -730 299 -98 99 -66 133 -232 327 -132 65 -456 163 -132 97 -196 327 -364 561 -264 1851 -234 1191 -8710 65 -596 163 -134 99 -234 97 -168 131 -496 165 -202 65 -20716 231 -68 231 -134 363 -100 133 -132 133 -198 231 -168 131 -166 99 -162 131 -196 295 -66 261 -166 955 -98 695 -66 1215 -9510 65 -3698 165 -328 65 -492 131 -66 129 -692 231 -64 163 -132 163 -98 229 -132 131 -134 97 -100 563 -15732 197 -796 165 -132 99 -562 97 -168 295 -462 99 -66 131 -332 133 -100 299 -66 329 -132 301 -68 267 -12994 299 -98 197 -228 295 -922 63 -988 65 -100 129 -164 823 -98 931 -66 331 -98 955 -9454 231 -100 163 -134 99 -796 133 -628 263 -430 67 -364 399 -98 365 -66 889 -66 5041 -4044 131 -166 265 -298 231 -98 197 -232 197 -164 163 -198 197 -98 65 -132 3525 -15068 67 -698 133 -1056 199 -2322 959 -200 297 -232 1223 -13532 65 -1650 197 -198 65 -330 129 -100 295 -164 65 -66 131 -1290 99 -134 231 -262 889 -98 231 -64 489 -66 663 -66 563 -15458 97 -362 229 -98 165 -496 131 -266 65 -98 165 -832 729 -66 133 -18682 231 -298 263 -132 363 -132 195 -132 361 -232 197 -1480 131 -164 163 -12854 65 -2522 299 -166 1357 -132 99 -98 399 -166 329 -264 395 -64 195 -196 1055 -132 1417 -14994 197 -132 459 -824 131 -428 133 -832 231 -200 65 -432 231 -100 467 -66 1151 -100 1741 -8616 97 -6904 1085 -198 261 -196 261 -232 265 -132 563 -166 65 -166 197 -100 331 -134 2009 -8664 97 -164 65 -64 263 -132 357 -64 97 -166 493 -166 165 -98 195 -130 361 -854 891 -66 365 -166 1019 -15320 97 -198 331 -166 1359 -266 229 -134 65 -100 331 -98 65 -132 265 -20774 65 -2222 97 -66 229 -132 161 -162 133 -18134 229 -198 65 -132 197 -200 263 -364 97 -100 427 -526 65 -460 131 -428 RAW_Data: 655 -98 2625 -8562 99 -432 97 -1924 67 -632 199 -498 65 -100 1819 -132 197 -228 263 -232 133 -296 229 -66 97 -20434 199 -432 65 -764 65 -232 233 -232 133 -334 463 -232 329 -98 357 -130 131 -132 1423 -4018 133 -1984 65 -2926 99 -930 97 -430 1293 -100 531 -66 493 -100 131 -100 429 -134 465 -132 3063 -9636 67 -3696 97 -132 229 -298 131 -694 627 -132 1247 -132 297 -166 133 -66 199 -166 663 -21440 133 -400 131 -130 99 -66 531 -232 229 -134 131 -202 165 -564 131 -1258 65 -100 133 -132 299 -166 1325 -66 833 -66 1521 -9032 97 -1544 295 -98 231 -164 261 -66 131 -394 361 -296 163 -298 463 -66 195 -96 721 -13330 65 -468 99 -134 65 -4696 199 -166 659 -98 361 -198 229 -132 557 -166 625 -164 229 -66 329 -100 131 -130 263 -66 1221 -8436 329 -198 99 -66 99 -66 165 -398 65 -1326 97 -794 165 -592 131 -66 265 -266 99 -430 2421 -100 465 -100 199 -66 699 -100 65 -132 1351 -66 897 -130 1653 -15200 231 -264 195 -296 99 -328 295 -296 163 -98 129 -98 295 -264 131 -398 65 -232 97 -98 887 -132 3157 -12396 199 -134 131 -66 231 -200 267 -132 265 -500 97 -732 131 -200 165 -396 763 -166 859 -66 1391 -9164 65 -3808 165 -66 131 -1692 65 -100 1017 -330 65 -132 65 -196 685 -198 65 -198 165 -98 231 -68 99 -22854 231 -168 67 -200 65 -66 263 -100 201 -302 65 -134 65 -22948 165 -396 263 -134 131 -68 165 -862 231 -1494 1261 -66 399 -302 3089 -6572 65 -396 65 -4140 7317 -5010 7415 -15982 811 -1174 381 -1122 381 -1148 351 -1164 345 -466 1509 -482 1541 -1176 387 -1144 363 -416 1519 -478 1525 -470 1533 -460 1539 -444 1535 -460 1531 -476 1527 -448 1513 -482 1509 -1178 379 -398 1549 -444 1539 -450 1547 -446 1541 -450 1545 -1142 381 -426 1529 -1172 381 -1140 387 -1114 395 -1130 379 -438 1531 -1172 381 -398 1555 -1192 351 -1146 407 -1122 381 -1146 381 -1126 349 -24662 821 -1174 379 -1122 383 -1146 415 -1102 385 -426 1567 -432 1567 -1178 381 -1120 385 -444 1511 -482 1515 -480 1539 -452 1545 -446 1545 -486 1541 -442 1555 -456 1495 -466 1531 -1148 387 -422 1509 -466 1533 -456 1539 -470 1503 -458 1539 -1164 351 -424 1509 -1190 353 -1148 369 -1130 379 -1136 317 -404 1331 -1128 319 -406 1231 -1140 337 -1114 349 -1122 329 -1140 349 -1120 293 -24712 627 -1236 237 -1226 233 -1230 271 -1228 239 -480 1017 -452 1039 -1184 293 -1172 275 -464 1041 -444 1007 -450 1033 -448 1035 -430 1047 -450 1031 -428 1047 -444 1005 -466 1015 -1158 289 -460 1047 -430 1033 -440 1039 -442 1033 -442 1037 -1168 309 -436 1051 -1140 RAW_Data: 343 -1158 311 -1152 347 -1120 341 -420 1041 -1178 319 -422 1051 -1150 321 -1152 345 -1126 351 -1118 345 -1158 313 -24714 689 -1170 317 -1154 323 -1138 349 -1154 301 -448 1037 -416 1083 -1150 345 -1124 313 -454 1047 -418 1031 -446 1045 -448 1037 -416 1061 -412 1043 -442 1053 -426 1039 -436 1033 -1170 309 -418 1039 -454 1049 -418 1059 -424 1049 -452 1029 -1158 319 -454 1031 -1152 353 -1152 289 -1176 311 -1162 349 -418 1051 -1148 319 -454 1027 -1152 353 -1124 319 -1162 347 -1152 333 -1144 311 -24722 685 -1138 343 -1138 329 -1162 353 -1130 325 -412 1069 -414 1085 -1150 311 -1160 311 -422 1081 -416 1031 -444 1049 -414 1071 -416 1063 -430 1037 -440 1039 -412 1049 -450 1039 -1140 351 -420 1049 -418 1065 -420 1045 -448 1041 -414 1053 -1148 345 -398 1085 -1140 315 -1166 355 -1126 319 -1158 351 -398 1071 -1140 317 -432 1071 -1138 343 -1130 339 -1144 331 -1160 319 -1162 289 -24740 693 -1130 353 -1156 319 -1136 347 -1150 301 -448 1041 -416 1063 -1178 297 -1180 311 -428 1047 -448 1037 -416 1065 -428 1037 -442 1051 -428 1039 -440 1051 -428 1037 -434 1033 -1172 311 -414 1071 -420 1049 -428 1035 -440 1069 -414 1051 -1150 343 -398 1083 -1148 345 -1120 341 -1148 347 -1122 341 -416 1071 -1148 319 -420 1061 -1152 353 -1126 321 -1158 349 -1150 297 -1176 277 -24762 631 -1238 239 -1232 271 -1230 243 -1210 271 -470 1007 -476 993 -1222 281 -1202 269 -480 1011 -454 1035 -446 1039 -446 1041 -416 1047 -450 1045 -420 1033 -454 1015 -444 1051 -1154 321 -408 1071 -414 1065 -398 1065 -440 1049 -428 1037 -1172 317 -434 1069 -1138 317 -1152 327 -1170 315 -1164 319 -410 1081 -1162 319 -404 1061 -1166 317 -1154 325 -1140 347 -1152 333 -1148 311 -24742 691 -1138 341 -1138 317 -1164 353 -1124 319 -434 1069 -412 1069 -1148 325 -1140 347 -398 1075 -414 1069 -414 1051 -452 1047 -422 1051 -416 1057 -428 1049 -450 1029 -420 1033 -1166 335 -418 1041 -416 1063 -412 1079 -412 1071 -414 1065 -1148 325 -410 1069 -1142 351 -1152 309 -1160 349 -1116 329 -436 1051 -1162 319 -426 1051 -1148 327 -1172 311 -1156 337 -1150 345 -1120 305 -83468 65 -1920 133 -98 397 -1062 199 -464 165 -728 165 -168 97 -466 497 -132 1123 -66 3163 -12612 229 -198 65 -134 363 -66 67 -132 97 -896 197 -132 199 -166 165 -166 67 -134 165 -334 365 -134 2963 -15534 231 -132 231 -168 165 -262 97 -266 65 -724 65 -166 97 -198 295 -98 131 -132 563 -100 1483 -8892 99 -954 131 -234 67 -432 1087 -98 687 -132 163 -8794 165 -6460 165 -332 331 -498 99 -200 199 -266 67 -100 131 -596 165 -332 67 -98 299 -100 265 -68 633 -100 5793 -4102 99 -198 65 -566 RAW_Data: 65 -658 99 -132 165 -332 167 -198 99 -132 133 -2530 65 -166 795 -300 197 -366 227 -262 361 -66 2073 -20762 65 -598 231 -264 97 -592 327 -132 295 -132 297 -100 363 -68 763 -20474 63 -166 757 -200 391 -100 97 -134 131 -134 591 -98 261 -262 229 -64 195 -100 195 -100 65 -132 261 -100 919 -66 333 -13642 65 -2324 131 -130 193 -462 195 -930 865 -66 2157 -100 1923 -12176 65 -168 197 -196 131 -1250 65 -132 391 -232 659 -66 393 -100 459 -230 197 -296 3479 -12728 99 -166 131 -134 131 -366 131 -98 97 -198 263 -164 231 -2074 693 -66 597 -66 433 -98 2509 -15286 65 -198 65 -198 165 -200 461 -132 757 -16060 65 -6768 199 -98 131 -262 163 -130 197 -198 165 -398 233 -334 65 -132 131 -166 331 -134 231 -564 365 -66 265 -100 465 -66 433 -100 6915 -6612 99 -264 65 -230 63 -4800 97 -66 393 -134 65 -100 165 -100 265 -66 165 -1818 99 -230 331 -66 265 -13068 131 -100 295 -298 427 -132 131 -1530 65 -100 165 -500 165 -132 995 -68 1685 -15810 263 -130 163 -462 231 -100 233 -632 165 -528 327 -196 197 -198 1253 -100 3583 -6278 97 -788 99 -3200 65 -166 133 -438 99 -132 165 -300 329 -166 1723 -134 725 -164 133 -16880 97 -960 99 -696 65 -200 231 -132 299 -66 297 -164 131 -730 197 -23052 365 -66 99 -332 131 -166 297 -494 429 -1326 265 -132 295 -66 367 -232 263 -66 857 -15396 395 -130 229 -98 233 -132 331 -364 65 -100 529 -68 231 -830 297 -100 233 -66 8533 -5582 101 -168 67 -3968 231 -66 129 -132 163 -1154 97 -166 199 -166 233 -132 467 -134 263 -66 431 -66 363 -66 957 -100 1821 -132 497 -132 1159 -15358 397 -66 99 -98 65 -66 265 -564 65 -68 97 -166 99 -100 165 -134 297 -896 165 -330 97 -134 963 -132 4737 -7096 65 -5664 265 -266 97 -166 265 -598 65 -332 65 -66 65 -198 231 -132 329 -100 65 -17202 99 -1564 595 -98 329 -198 227 -66 459 -230 97 -1480 63 -66 131 -166 99 -166 931 -8662 133 -398 99 -134 265 -98 299 -264 233 -66 99 -100 99 -66 97 -166 199 -166 265 -234 5785 -10012 163 -2324 331 -196 331 -134 65 -100 297 -100 165 -100 131 -332 163 -302 297 -164 199 -300 199 -166 229 -68 99 -68 959 -15384 365 -134 263 -1818 229 -698 99 -232 131 -100 789 -66 491 -132 4039 -12084 99 -134 331 -796 265 -132 265 -362 167 -2310 65 -98 131 -100 525 -164 295 -15032 297 -560 197 -330 131 -196 397 -266 197 -200 263 -68 261 -496 329 -166 361 -166 1517 -66 331 -10126 97 -3736 99 -1626 131 -100 RAW_Data: 299 -298 1025 -68 165 -66 165 -102 333 -164 4245 -8938 99 -6070 1159 -132 199 -66 265 -66 363 -266 863 -100 97 -100 2781 -11408 6995 -5040 7341 -15994 819 -1130 383 -1136 385 -1150 379 -1114 353 -432 1531 -446 1539 -1162 375 -1144 385 -394 1537 -456 1511 -450 1513 -448 1559 -442 1519 -454 1541 -446 1517 -450 1513 -476 1505 -1184 365 -410 1509 -482 1511 -478 1511 -448 1547 -444 1541 -1178 381 -414 1533 -1178 385 -1112 393 -1134 381 -1144 353 -452 1507 -1182 383 -410 1535 -1164 381 -1152 379 -1122 383 -1136 377 -1158 343 -24642 815 -1138 377 -1146 353 -1148 355 -1136 345 -428 1495 -448 1573 -1142 417 -1112 393 -416 1515 -448 1563 -450 1533 -452 1543 -448 1547 -448 1529 -466 1537 -460 1513 -450 1519 -1176 383 -398 1559 -456 1537 -460 1541 -470 1533 -450 1543 -1172 377 -426 1543 -1190 351 -1138 415 -1138 387 -1116 357 -416 1503 -1166 369 -418 1521 -1174 379 -1120 383 -1136 415 -1104 385 -1114 321 -24704 635 -1244 243 -1242 237 -1230 243 -1226 257 -492 973 -490 1007 -1204 271 -1200 273 -478 1013 -456 1011 -478 1025 -460 1003 -454 1043 -446 1039 -416 1063 -414 1041 -440 1037 -1170 309 -420 1045 -452 1049 -408 1067 -436 1051 -400 1065 -1172 317 -404 1065 -1172 317 -1158 325 -1138 341 -1158 311 -416 1075 -1152 321 -408 1083 -1126 353 -1156 321 -1138 351 -1150 331 -1144 311 -24740 659 -1174 311 -1140 329 -1162 349 -1130 327 -442 1035 -416 1063 -1148 329 -1168 315 -438 1053 -410 1049 -430 1051 -452 1029 -426 1047 -438 1059 -434 1017 -450 1037 -426 1047 -1132 321 -432 1069 -414 1067 -414 1037 -432 1053 -450 1033 -1158 319 -456 1027 -1154 353 -1120 321 -1178 317 -1152 325 -444 1037 -1174 319 -418 1053 -1148 355 -1122 319 -1160 349 -1150 331 -1144 311 -24724 631 -1238 269 -1202 269 -1224 239 -1230 257 -484 1005 -482 1007 -1204 271 -1190 309 -446 1019 -456 1003 -492 1005 -472 1007 -452 1043 -448 1013 -454 1037 -424 1041 -440 1049 -1150 321 -408 1071 -414 1033 -432 1063 -438 1049 -428 1035 -1172 317 -434 1037 -1166 311 -1164 349 -1136 315 -1172 307 -406 1083 -1138 315 -438 1051 -1150 351 -1148 319 -1156 325 -1136 345 -1130 317 -24770 675 -1162 317 -1150 343 -1130 339 -1138 317 -436 1035 -452 1041 -1172 303 -1158 349 -412 1043 -428 1049 -450 1029 -428 1049 -436 1057 -436 1051 -414 1037 -430 1049 -418 1059 -1150 319 -420 1061 -422 1031 -444 1049 -448 1039 -416 1065 -1146 329 -446 1037 -1142 351 -1152 309 -1156 349 -1116 345 -428 1053 -1140 345 -396 1079 -1148 311 -1154 341 -1148 345 -1120 341 -1150 311 -24748 633 -1238 269 -1230 225 -1238 243 -1244 257 -488 973 -482 1007 -1208 289 -1178 283 -476 1003 -478 1029 -462 1013 -444 RAW_Data: 1035 -462 1013 -446 1035 -428 1049 -450 1031 -424 1047 -1148 309 -432 1063 -412 1041 -440 1069 -416 1049 -416 1071 -1148 321 -410 1081 -1130 355 -1120 355 -1132 343 -1130 353 -420 1053 -1150 355 -386 1065 -1156 355 -1120 345 -1132 353 -1120 345 -1160 313 -24732 705 -1144 345 -1126 351 -1152 309 -1160 313 -454 1013 -454 1051 -1166 289 -1176 311 -438 1065 -400 1065 -438 1051 -398 1067 -440 1051 -398 1063 -440 1051 -414 1043 -426 1047 -1150 343 -400 1051 -450 1015 -454 1047 -418 1057 -424 1065 -1142 339 -418 1041 -1176 319 -1160 317 -1158 317 -1154 325 -446 1037 -1176 319 -418 1053 -1150 355 -1118 321 -1176 315 -1154 325 -1172 275 -82942 97 -1816 67 -3324 65 -756 297 -100 229 -132 197 -230 165 -332 97 -66 67 -264 363 -100 131 -17052 165 -828 131 -400 133 -232 167 -132 267 -298 329 -464 67 -166 65 -1394 331 -132 265 -166 397 -132 693 -15932 97 -166 65 -100 199 -300 165 -1064 99 -298 67 -298 199 -100 997 -66 1291 -15382 131 -296 99 -364 133 -496 99 -328 363 -164 99 -16946 97 -830 65 -200 233 -132 99 -266 131 -266 397 -166 1557 -66 567 -762 231 -330 265 -10908 65 -1192 99 -698 229 -198 65 -134 99 -66 265 -98 199 -134 131 -166 167 -368 65 -264 197 -234 99 -98 165 -134 297 -66 429 -166 2215 -15050 299 -166 97 -68 263 -132 293 -462 97 -98 97 -132 65 -460 65 -198 625 -132 1493 -68 3543 -10060 65 -1958 201 -200 99 -98 67 -364 165 -66 99 -232 131 -332 97 -928 491 -100 627 -98 1151 -132 1385 -15094 163 -164 695 -66 299 -134 695 -98 99 -132 431 -234 199 -8336 97 -822 65 -628 65 -5300 199 -268 231 -66 197 -98 199 -134 165 -1062 195 -230 2117 -66 693 -15212 197 -98 259 -526 327 -198 163 -822 165 -726 131 -328 163 -22598 97 -132 65 -726 63 -164 165 -66 163 -560 131 -132 131 -198 193 -396 65 -132 65 -1022 855 -132 2663 -68 1465 -11998 67 -298 199 -132 431 -166 99 -198 199 -100 397 -16212 99 -828 65 -4854 65 -100 199 -200 561 -1460 65 -66 493 -332 629 -232 561 -66 2939 -9276 99 -5942 263 -132 65 -166 329 -164 163 -98 229 -494 129 -164 427 -98 131 -164 195 -296 65 -66 625 -100 1833 -15214 263 -362 265 -598 229 -296 65 -196 163 -98 261 -560 65 -724 199 -17234 199 -68 99 -330 97 -1188 559 -662 199 -68 165 -828 65 -100 131 -21754 261 -1618 65 -134 299 -166 133 -232 131 -66 131 -266 199 -98 99 -1092 527 -64 825 -98 1213 -15578 65 -64 165 -66 131 -398 65 -66 133 -2192 131 -396 133 -66 727 -66 295 -66 1781 -15222 229 -300 RAW_Data: 229 -432 131 -166 133 -198 331 -100 297 -232 133 -530 199 -100 651 -66 2073 -9794 97 -2386 65 -464 99 -100 133 -364 99 -166 65 -328 197 -100 885 -134 165 -132 227 -164 855 -10348 97 -234 99 -132 265 -166 231 -102 65 -234 67 -134 133 -100 401 -66 99 -100 131 -100 297 -66 165 -132 233 -232 65 -20682 131 -362 131 -394 229 -362 559 -130 1091 -166 1195 -68 463 -66 835 -9542 263 -100 165 -100 197 -132 199 -502 131 -200 131 -68 1527 -100 265 -168 99 -66 99 -166 863 -134 231 -200 129 -166 2183 -16600 297 -164 197 -232 163 -230 229 -232 99 -196 295 -166 165 -200 231 -98 165 -428 395 -132 231 -166 1227 -5128 99 -4674 165 -328 197 -328 465 -234 199 -68 331 -98 331 -166 199 -300 3685 -18958 197 -64 163 -66 229 -228 131 -130 197 -262 131 -164 165 -766 333 -332 629 -66 759 -98 299 -3478 3113 -5094 7403 -16004 829 -1146 395 -1148 383 -1140 401 -1146 385 -422 1539 -476 1569 -1180 387 -1142 407 -400 1561 -462 1599 -448 1565 -484 1563 -472 1569 -468 1537 -482 1565 -458 1571 -444 1571 -1180 387 -420 1543 -474 1571 -488 1579 -462 1567 -444 1607 -1152 387 -452 1575 -1166 379 -1136 407 -1158 385 -1148 381 -428 1567 -1166 383 -426 1581 -1168 383 -1138 417 -1126 383 -1150 391 -1130 349 -24636 853 -1170 377 -1158 407 -1118 409 -1146 387 -422 1537 -474 1575 -1178 421 -1108 409 -400 1559 -460 1565 -444 1545 -482 1539 -450 1559 -456 1573 -444 1569 -450 1511 -448 1549 -1178 383 -402 1525 -452 1545 -450 1551 -450 1531 -466 1535 -1158 387 -392 1539 -1160 387 -1150 367 -1130 383 -1132 383 -428 1543 -1180 381 -392 1549 -1170 347 -1136 353 -1100 351 -1138 343 -1126 303 -24692 669 -1164 311 -1162 333 -1138 317 -1164 317 -420 1059 -420 1067 -1142 337 -1148 311 -430 1045 -448 1037 -414 1061 -412 1077 -410 1037 -444 1065 -414 1039 -428 1049 -408 1051 -1152 309 -440 1047 -450 1041 -414 1053 -420 1047 -454 1047 -1150 345 -398 1051 -1152 343 -1158 309 -1154 345 -1118 343 -420 1077 -1142 321 -420 1055 -1148 355 -1126 317 -1156 345 -1126 353 -1152 311 -24734 665 -1156 355 -1130 319 -1158 351 -1118 327 -416 1069 -414 1065 -1152 325 -1144 349 -398 1077 -412 1071 -412 1065 -416 1037 -428 1065 -418 1051 -448 1041 -414 1051 -420 1045 -1144 351 -414 1041 -422 1069 -418 1049 -450 1037 -416 1063 -1148 327 -448 1039 -1140 353 -1132 347 -1146 311 -1160 351 -418 1051 -1148 319 -456 1029 -1158 355 -1116 321 -1176 311 -1162 349 -1148 273 -24754 637 -1238 241 -1242 271 -1228 243 -1210 271 -470 1011 -476 993 -1224 281 -1180 289 -492 975 -492 1005 -472 1009 -448 1037 -434 1027 -466 RAW_Data: 1043 -414 1039 -444 1041 -416 1047 -1144 349 -400 1075 -412 1037 -446 1063 -410 1041 -440 1069 -1142 313 -418 1071 -1150 355 -1128 317 -1156 351 -1124 325 -410 1071 -1140 353 -420 1047 -1152 321 -1166 319 -1146 311 -1160 351 -1118 309 -24768 691 -1140 349 -1120 345 -1122 343 -1152 345 -394 1049 -450 1041 -1140 353 -1148 317 -440 1033 -418 1051 -450 1041 -416 1049 -448 1041 -422 1067 -418 1047 -414 1039 -416 1061 -1148 345 -400 1063 -428 1037 -442 1053 -426 1039 -442 1041 -1172 311 -422 1075 -1146 319 -1156 343 -1126 353 -1134 345 -400 1063 -1148 327 -412 1073 -1140 353 -1152 311 -1158 347 -1120 345 -1122 309 -24768 579 -1302 201 -1300 173 -1278 195 -1296 203 -528 941 -538 947 -1252 277 -1196 257 -522 975 -494 999 -472 1011 -456 1007 -474 1007 -450 1037 -444 1037 -462 1001 -454 1043 -1138 315 -434 1037 -442 1041 -414 1085 -416 1071 -420 1051 -1166 319 -408 1069 -1140 353 -1120 345 -1158 347 -1142 309 -430 1051 -1142 345 -398 1081 -1148 315 -1164 355 -1130 319 -1160 351 -1122 295 -24776 667 -1146 345 -1158 311 -1150 345 -1156 311 -418 1045 -454 1049 -1150 345 -1124 351 -410 1043 -426 1069 -420 1045 -448 1039 -414 1067 -428 1035 -440 1047 -428 1035 -438 1017 -1154 321 -434 1071 -414 1065 -414 1037 -464 1017 -434 1061 -1170 315 -436 1031 -1170 317 -1154 327 -1172 311 -1156 337 -416 1043 -1178 319 -418 1055 -1150 353 -1124 319 -1160 351 -1150 297 -1176 275 -87940 229 -164 361 -68 131 -66 265 -132 133 -66 429 -132 131 -232 199 -19674 65 -2866 97 -266 97 -68 99 -232 165 -498 99 -132 67 -232 99 -862 65 -100 199 -68 65 -134 99 -166 199 -200 595 -100 365 -17268 97 -732 365 -164 397 -826 65 -166 331 -298 65 -66 297 -334 397 -66 561 -164 65 -100 265 -100 299 -98 1193 -8592 99 -6652 265 -132 131 -934 163 -134 165 -398 167 -100 829 -100 229 -11976 65 -66 329 -366 131 -430 199 -266 97 -164 65 -164 161 -526 129 -66 99 -164 65 -66 131 -130 1493 -15384 165 -398 97 -100 129 -164 131 -294 229 -264 131 -17598 133 -5180 261 -434 231 -232 65 -198 165 -66 97 -100 231 -264 263 -134 99 -430 5485 -4838 231 -100 131 -66 429 -496 65 -100 65 -166 265 -696 233 -132 231 -98 997 -98 1249 -15252 97 -1558 761 -134 99 -66 431 -164 133 -20388 65 -66 65 -530 97 -888 65 -330 97 -200 133 -330 99 -330 399 -396 231 -366 65 -428 295 -558 657 -98 165 -66 4377 -6898 97 -3848 397 -466 197 -66 65 -398 165 -200 231 -564 163 -402 67 -66 595 -132 459 -66 1085 -12238 195 -134 231 -894 231 -68 165 -698 1559 -66 361 -66 RAW_Data: 2315 -8340 101 -498 65 -1882 267 -430 99 -498 131 -230 133 -266 165 -98 97 -266 99 -398 131 -462 99 -100 3937 -130 3803 -8272 97 -4604 229 -164 97 -164 131 -1250 361 -298 561 -166 629 -68 429 -166 363 -166 231 -98 131 -8864 65 -592 97 -3130 195 -296 65 -696 1059 -134 299 -98 995 -100 365 -100 197 -66 199 -100 2455 -12500 131 -1030 65 -3104 65 -100 263 -1520 295 -162 195 -132 527 -98 493 -66 1053 -132 163 -66 97 -196 3319 -13102 97 -100 267 -366 265 -762 197 -132 1281 -234 129 -264 165 -22650 97 -100 429 -66 163 -198 493 -264 297 -100 1295 -66 131 -66 395 -132 1697 -66 5577 -10084 65 -1894 67 -132 131 -264 259 -132 365 -98 263 -164 201 -166 199 -200 299 -132 165 -134 231 -166 131 -132 1291 -98 65 -98 661 -8376 65 -296 263 -232 165 -166 327 -494 65 -100 65 -66 263 -98 195 -98 65 -22842 99 -132 65 -464 361 -296 99 -130 195 -296 163 -132 97 -460 65 -132 163 -856 1327 -66 265 -15278 131 -468 99 -100 65 -464 97 -200 199 -130 65 -134 133 -164 297 -1390 499 -166 919 -13096 197 -4346 97 -196 97 -262 97 -330 97 -528 133 -198 131 -166 197 -962 65 -98 299 -98 99 -200 1665 -16846 65 -2444 165 -564 397 -498 65 -100 163 -66 365 -66 297 -364 65 -266 65 -134 165 -17172 67 -300 131 -262 99 -166 231 -726 197 -130 689 -200 97 -132 65 -396 97 -98 99 -98 229 -398 163 -168 263 -528 1019 -66 467 -100 533 -15150 97 -500 331 -198 67 -100 131 -566 99 -66 331 -100 197 -366 99 -898 1057 -66 863 -132 757 -66 559 -8454 99 -1196 97 -3724 131 -130 131 -264 97 -594 363 -1060 99 -100 165 -362 163 -460 195 -98 129 -922 99 -328 691 -66 5965 -12210 131 -132 65 -98 263 -164 65 -230 97 -230 163 -532 97 -394 263 -362 65 -98 163 -426 65 -100 1213 -100 495 -164 461 -8616 129 -3792 133 -132 265 -132 131 -100 161 -132 359 -196 361 -790 63 -164 1889 -15496 165 -66 265 -300 299 -334 297 -298 131 -132 97 -100 99 -232 65 -300 65 -132 233 -564 431 -66 533 -98 1459 -9390 97 -3462 231 -266 163 -202 131 -166 301 -66 465 -66 799 -200 199 -266 427 -132 799 -66 4333 -13748 65 -1298 165 -234 133 -168 165 -696 329 -956 327 -166 163 -98 263 -426 1247 -132 3303 -10574 65 -428 263 -832 199 -498 65 -200 165 -924 851 -66 393 -66 563 -134 2149 -66 1291 -10298 67 -1264 7383 -5036 7419 -15962 823 -1198 347 -1188 349 -1150 373 -1186 349 -442 1543 -452 1579 -1148 381 -1168 347 -458 1535 -458 1577 -444 1577 -486 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/doorhan.sub ================================================ Filetype: Flipper SubGhz Key File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: KeeLoq Bit: 64 Key: 48 50 F0 72 33 78 95 14 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/doorhan_raw.sub ================================================ Filetype: Flipper SubGhz RAW File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: RAW RAW_Data: 1937 -32700 457 -398 425 -356 437 -386 411 -384 447 -384 417 -384 419 -386 417 -386 419 -388 417 -388 419 -388 451 -3998 835 -412 417 -810 821 -420 419 -834 423 -836 819 -450 385 -852 813 -446 419 -822 795 -442 415 -814 419 -850 799 -438 413 -850 415 -860 809 -412 843 -420 397 -826 417 -844 815 -432 387 -842 841 -446 791 -472 377 -850 819 -420 395 -854 787 -454 419 -810 429 -854 807 -416 409 -876 819 -422 395 -854 789 -426 839 -418 813 -422 835 -412 819 -452 809 -474 379 -850 821 -420 395 -852 399 -828 813 -450 809 -422 845 -412 407 -870 421 -812 827 -436 385 -842 415 -840 795 -438 411 -842 407 -848 811 -448 811 -458 387 -838 811 -418 417 -822 417 -830 839 -446 381 -874 785 -452 809 -442 385 -806 417 -15802 423 -388 409 -398 395 -398 423 -408 387 -412 385 -412 417 -416 383 -416 385 -418 387 -416 419 -386 421 -4030 789 -422 415 -844 817 -432 385 -844 419 -850 799 -440 413 -876 791 -426 413 -842 817 -432 387 -838 419 -848 793 -436 411 -842 405 -884 779 -450 807 -426 393 -834 417 -836 825 -434 409 -842 819 -454 797 -434 411 -840 831 -400 433 -806 815 -462 387 -838 419 -848 797 -438 413 -876 785 -438 433 -804 811 -424 815 -446 805 -452 801 -434 803 -448 839 -412 441 -834 811 -416 411 -820 417 -828 835 -444 775 -450 835 -412 409 -868 419 -812 827 -438 385 -838 419 -814 825 -436 415 -850 409 -844 809 -446 809 -424 421 -836 811 -420 415 -822 417 -826 807 -476 377 -876 791 -458 809 -420 385 -820 415 -15780 407 -440 379 -412 379 -444 381 -408 385 -434 391 -394 431 -380 409 -412 413 -380 411 -412 409 -396 411 -4006 819 -414 415 -854 789 -424 447 -808 429 -852 811 -414 409 -868 811 -452 387 -820 819 -450 405 -824 409 -842 801 -426 445 -838 399 -870 781 -460 803 -414 417 -828 407 -850 809 -422 421 -838 819 -450 813 -432 415 -846 787 -452 389 -854 791 -426 413 -842 427 -824 805 -450 423 -838 819 -416 415 -854 791 -428 807 -450 811 -420 817 -448 817 -454 799 -434 415 -848 801 -410 427 -820 413 -842 801 -456 809 -450 811 -432 413 -844 409 -830 813 -448 383 -840 417 -824 801 -442 413 -848 405 -848 809 -448 811 -458 377 -844 817 -420 417 -820 417 -830 805 -476 377 -872 803 -448 799 -442 415 -772 415 -15782 429 -376 437 -376 411 -412 413 -380 413 -414 409 -396 411 -408 379 -444 377 -412 381 -412 413 -408 385 -4064 809 -418 397 -828 813 -450 383 -840 403 -850 813 -450 417 -840 813 -448 407 -828 RAW_Data: 809 -446 381 -844 417 -822 805 -474 381 -842 417 -864 809 -446 809 -418 395 -830 419 -844 815 -430 385 -874 805 -454 797 -436 413 -850 819 -414 421 -818 819 -418 417 -846 401 -854 807 -422 421 -840 809 -454 393 -854 789 -426 807 -452 811 -422 813 -446 835 -420 805 -454 435 -818 815 -416 417 -850 399 -822 809 -450 821 -420 817 -448 423 -850 387 -842 809 -420 417 -822 417 -830 805 -442 411 -842 403 -850 811 -450 811 -460 387 -838 811 -420 417 -822 403 -852 813 -448 415 -854 789 -456 815 -420 385 -818 417 -15768 453 -370 415 -398 407 -418 377 -438 389 -408 387 -412 385 -446 383 -416 385 -416 385 -418 385 -418 419 -4008 835 -412 409 -830 811 -448 381 -850 417 -826 839 -444 381 -878 787 -424 449 -810 821 -432 387 -838 419 -848 791 -438 413 -844 417 -860 807 -446 807 -416 409 -840 387 -844 823 -432 385 -878 785 -450 819 -434 413 -844 819 -420 395 -854 791 -422 449 -808 431 -818 813 -446 407 -850 811 -452 415 -808 835 -420 813 -420 813 -460 781 -446 835 -420 817 -452 429 -820 819 -418 417 -814 427 -820 817 -418 817 -448 819 -436 415 -848 405 -848 809 -414 415 -848 387 -848 801 -440 413 -842 419 -822 839 -444 811 -418 411 -838 819 -420 415 -822 417 -826 837 -444 379 -850 819 -454 805 -440 387 -806 415 -15792 423 -390 417 -390 409 -384 409 -402 423 -408 387 -410 385 -414 415 -416 383 -418 383 -418 387 -416 419 -4032 787 -438 395 -836 811 -426 421 -836 421 -846 795 -440 413 -878 783 -452 407 -820 805 -414 435 -822 417 -836 819 -434 415 -848 409 -844 811 -450 809 -418 395 -828 419 -844 815 -432 385 -876 801 -428 841 -420 417 -836 813 -416 419 -850 797 -436 415 -814 419 -850 799 -442 413 -850 821 -454 405 -820 805 -414 819 -440 827 -410 837 -418 835 -412 829 -456 415 -840 795 -436 387 -844 417 -840 795 -436 803 -448 837 -410 409 -866 417 -838 799 -440 385 -842 421 -812 827 -434 409 -844 407 -860 811 -450 813 -430 407 -812 807 -450 351 -32700 459 -422 407 -386 411 -416 415 -384 415 -388 415 -388 413 -422 383 -422 409 -396 395 -434 357 -438 389 -4046 783 -448 817 -432 781 -446 415 -824 443 -814 413 -856 819 -450 803 -428 411 -844 779 -460 805 -414 837 -418 817 -452 785 -460 805 -450 425 -838 417 -812 819 -432 387 -842 807 -452 393 -852 391 -868 817 -448 389 -858 409 -810 409 -854 807 -446 379 -840 829 -428 411 -846 821 -468 777 -450 411 -838 779 -452 811 -422 815 -448 803 -458 779 -484 RAW_Data: 783 -458 411 -846 783 -452 393 -854 415 -832 805 -442 775 -450 835 -444 377 -866 415 -840 799 -438 411 -844 385 -850 795 -440 415 -846 409 -844 809 -448 809 -456 381 -842 809 -452 385 -836 395 -862 815 -418 419 -866 807 -444 805 -418 415 -812 385 -15782 473 -360 429 -358 439 -388 409 -386 447 -382 417 -384 419 -386 417 -388 417 -388 419 -388 419 -388 417 -4030 803 -442 803 -416 819 -438 433 -838 385 -868 385 -872 787 -454 827 -432 385 -842 811 -418 811 -460 813 -412 819 -452 803 -436 807 -450 421 -842 421 -814 821 -430 387 -842 807 -450 421 -824 409 -842 835 -418 413 -840 407 -836 415 -822 819 -444 393 -836 813 -458 385 -874 785 -454 827 -434 385 -844 811 -418 811 -462 813 -412 817 -454 803 -436 809 -450 423 -836 811 -420 417 -822 417 -826 801 -444 809 -452 819 -416 453 -848 413 -816 809 -422 409 -838 421 -810 823 -436 415 -846 419 -818 807 -476 809 -418 409 -838 809 -420 417 -822 415 -866 805 -444 381 -878 785 -470 803 -412 407 -810 417 -15764 455 -368 405 -422 399 -396 391 -436 387 -410 385 -412 415 -418 381 -418 383 -418 387 -416 387 -418 419 -4034 791 -424 809 -450 811 -420 393 -868 419 -810 433 -822 841 -420 813 -446 419 -820 801 -440 809 -448 785 -452 807 -438 809 -450 817 -448 407 -832 419 -812 813 -426 411 -840 819 -454 385 -836 421 -838 821 -450 423 -822 411 -842 407 -824 809 -446 379 -840 819 -442 399 -870 817 -428 809 -450 397 -828 815 -448 811 -418 819 -418 817 -454 789 -462 811 -448 395 -866 779 -452 383 -850 419 -820 803 -440 809 -450 819 -420 417 -850 445 -816 809 -420 409 -840 419 -814 821 -434 415 -848 411 -842 807 -446 809 -422 411 -842 817 -420 415 -844 395 -826 817 -450 415 -854 787 -456 807 -422 417 -788 421 -15780 407 -440 379 -412 381 -442 381 -408 385 -434 393 -394 399 -414 407 -412 411 -382 411 -414 409 -396 379 -4042 807 -446 813 -430 805 -414 409 -866 385 -878 397 -852 781 -480 783 -450 411 -822 811 -450 793 -426 807 -450 813 -454 805 -448 783 -484 383 -850 383 -850 799 -452 407 -822 811 -450 397 -862 383 -878 793 -466 381 -848 417 -820 403 -852 773 -452 395 -864 811 -450 383 -852 817 -450 801 -428 411 -844 817 -430 813 -412 801 -454 805 -452 791 -460 807 -448 411 -838 819 -418 417 -840 395 -860 777 -450 813 -456 781 -446 405 -886 385 -846 787 -466 387 -836 417 -846 789 -436 415 -846 417 -852 773 -476 811 -420 411 -840 783 -450 385 -852 417 -860 RAW_Data: 773 -474 379 -870 805 -450 815 -412 385 -826 159 -32700 483 -378 411 -414 377 -426 381 -436 379 -410 411 -412 381 -442 381 -408 383 -404 423 -396 397 -414 407 -4014 825 -436 803 -414 435 -822 415 -836 425 -822 839 -416 409 -874 405 -826 419 -812 811 -424 409 -842 421 -846 399 -854 807 -416 441 -848 803 -454 799 -436 385 -842 811 -420 417 -854 803 -416 839 -454 801 -434 411 -844 833 -388 447 -804 823 -434 409 -844 407 -824 419 -868 793 -470 807 -416 409 -840 821 -420 811 -422 813 -446 801 -456 809 -454 815 -428 411 -848 821 -424 389 -856 417 -798 839 -410 841 -418 815 -448 419 -854 415 -814 813 -424 423 -834 389 -844 819 -432 413 -848 405 -826 817 -450 811 -460 385 -838 817 -420 415 -824 417 -826 809 -442 413 -850 823 -454 801 -434 379 -808 419 -15800 421 -408 387 -410 385 -414 415 -386 413 -420 383 -418 385 -420 385 -420 417 -390 417 -390 419 -388 417 -4036 787 -452 799 -432 409 -842 407 -824 413 -838 823 -432 411 -872 377 -864 383 -836 823 -432 379 -872 375 -854 413 -840 821 -430 411 -878 791 -428 807 -448 379 -840 837 -418 417 -846 795 -436 809 -450 815 -448 409 -830 811 -450 383 -848 817 -416 425 -822 411 -848 415 -858 805 -446 809 -420 411 -838 809 -452 779 -460 779 -446 821 -442 797 -474 811 -450 377 -842 821 -418 419 -820 417 -830 807 -440 811 -450 819 -448 411 -842 415 -846 779 -428 411 -838 419 -848 795 -436 413 -846 417 -820 807 -474 811 -420 423 -836 783 -450 383 -850 417 -828 803 -474 379 -874 787 -456 805 -416 413 -830 377 -15802 411 -414 415 -402 393 -396 399 -422 409 -386 411 -416 383 -418 415 -386 415 -386 417 -386 417 -388 417 -4022 809 -442 811 -414 417 -830 445 -814 413 -842 817 -418 419 -850 443 -816 413 -808 823 -420 435 -820 393 -862 423 -810 825 -434 413 -850 821 -420 831 -428 379 -840 809 -450 417 -834 807 -454 813 -412 823 -442 437 -836 781 -428 421 -838 817 -420 415 -824 417 -830 447 -814 813 -458 811 -412 453 -800 805 -440 809 -448 791 -456 811 -420 815 -460 809 -448 395 -864 785 -452 381 -852 419 -818 801 -438 837 -416 817 -446 417 -860 415 -812 813 -422 409 -838 421 -812 827 -436 413 -848 419 -816 807 -474 809 -418 425 -836 785 -448 379 -840 409 -864 811 -418 415 -864 803 -444 801 -416 451 -782 391 -15810 439 -376 407 -378 447 -376 415 -378 419 -420 421 -386 419 -386 421 -388 421 -388 407 -398 393 -400 421 -4010 841 -422 787 -426 411 -842 421 -846 RAW_Data: 401 -856 807 -418 421 -870 387 -848 403 -818 807 -450 397 -828 421 -846 389 -854 817 -448 419 -852 805 -414 807 -452 417 -800 807 -442 409 -844 801 -454 809 -450 815 -432 413 -850 821 -424 389 -822 827 -428 413 -844 389 -856 393 -866 821 -450 815 -430 409 -810 809 -450 815 -428 803 -448 789 -454 819 -450 815 -430 413 -848 787 -456 387 -836 395 -862 813 -420 809 -458 811 -412 451 -836 417 -812 811 -426 409 -842 421 -814 827 -434 415 -846 421 -816 805 -476 807 -420 421 -838 785 -450 383 -852 419 -824 803 -440 413 -852 819 -444 829 -408 409 -812 415 -15778 423 -406 387 -410 385 -414 415 -384 415 -418 383 -420 383 -420 385 -420 417 -388 417 -388 419 -408 397 -4028 809 -420 801 -444 407 -830 419 -846 385 -854 817 -448 407 -862 387 -846 423 -822 789 -422 449 -810 427 -820 423 -838 811 -454 387 -866 811 -414 827 -428 411 -842 813 -430 385 -840 833 -452 777 -474 807 -452 385 -842 811 -420 419 -824 829 -418 417 -854 379 -850 419 -860 809 -444 809 -420 423 -838 813 -420 811 -420 813 -446 805 -452 803 -470 777 -450 421 -838 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/dooya.sub ================================================ Filetype: Flipper SubGhz Key File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: Dooya Bit: 40 Key: 00 00 00 E1 DC 03 05 11 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/dooya_raw.sub ================================================ Filetype: Flipper SubGhz RAW File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: RAW RAW_Data: 4046 -17306 65 -298 97 -100 133 -268 265 -330 133 -132 1723 -16806 165 -132 99 -920 65 -622 789 -130 99 -66 361 -98 295 -166 73573 -17510 97 -492 129 -728 529 -100 1063 -164 295 -66 1119 -14962 627 -166 363 -264 427 -132 593 -100 633 -132 39555 -16938 99 -2024 65 -100 97 -164 99 -66 399 -100 123891 -16736 163 -200 97 -200 165 -264 65 -828 427 -132 871 -5132 591 -490 595 -486 605 -454 275 -822 241 -824 273 -784 321 -782 649 -444 653 -408 657 -428 321 -744 693 -388 699 -388 707 -392 313 -752 345 -750 317 -744 351 -730 355 -738 323 -774 327 -748 329 -750 695 -386 701 -354 381 -722 351 -720 385 -718 351 -718 345 -738 705 -382 329 -736 713 -360 387 -718 369 -718 367 -706 735 -352 375 -726 351 -722 351 -720 719 -7808 4845 -1474 743 -332 741 -370 705 -370 349 -718 383 -716 345 -712 381 -704 747 -326 747 -350 737 -352 351 -718 719 -360 741 -366 687 -362 375 -704 381 -724 351 -740 353 -712 357 -718 359 -744 363 -688 365 -722 727 -354 727 -354 379 -724 351 -722 353 -720 387 -718 353 -718 703 -374 351 -716 735 -354 365 -708 353 -734 351 -746 717 -356 359 -720 371 -704 371 -720 731 -7786 4847 -1482 711 -386 711 -358 743 -330 373 -708 359 -748 349 -740 351 -716 719 -356 727 -354 739 -354 351 -718 719 -362 743 -364 721 -330 373 -706 381 -722 351 -740 353 -712 359 -720 361 -722 361 -720 361 -720 725 -354 731 -354 381 -720 353 -722 385 -720 351 -720 349 -716 735 -354 361 -748 711 -364 347 -740 365 -722 365 -720 695 -384 371 -704 381 -702 377 -710 709 -7804 4853 -1468 743 -336 735 -358 719 -352 379 -724 353 -722 353 -720 387 -686 721 -360 721 -362 743 -332 387 -718 721 -366 701 -382 701 -350 377 -720 351 -740 353 -714 357 -710 397 -710 365 -702 385 -688 377 -724 731 -352 703 -354 379 -736 343 -740 357 -720 349 -706 385 -718 719 -354 365 -724 735 -352 377 -724 355 -720 353 -720 721 -358 387 -686 387 -718 353 -718 733 -7796 4821 -1492 739 -350 719 -334 737 -350 365 -722 373 -722 367 -708 371 -702 747 -352 711 -358 743 -364 343 -706 749 -352 717 -350 717 -384 327 -736 351 -746 355 -716 357 -720 359 -710 365 -742 365 -708 367 -704 711 -354 743 -356 387 -684 373 -706 381 -722 351 -740 353 -714 721 -356 361 -720 733 -352 375 -694 385 -724 353 -722 719 -356 385 -686 385 -718 351 -716 731 -7792 4843 -1480 717 -354 719 -386 717 -354 359 -720 351 -708 387 -712 355 -718 721 -356 727 -354 739 -356 351 -718 741 -364 RAW_Data: 705 -370 703 -372 351 -718 383 -720 347 -720 347 -714 381 -704 353 -744 357 -718 355 -720 723 -356 725 -354 379 -722 351 -722 353 -722 385 -718 351 -718 721 -372 351 -716 719 -372 351 -718 383 -716 345 -714 743 -346 361 -740 353 -712 357 -710 725 -7818 4837 -1498 713 -356 709 -360 741 -332 375 -706 359 -750 351 -706 353 -748 719 -356 723 -352 739 -354 351 -718 709 -364 719 -362 721 -364 385 -718 353 -718 383 -682 377 -712 349 -734 353 -742 355 -712 359 -722 723 -354 729 -352 381 -722 353 -722 351 -720 387 -718 353 -716 701 -388 345 -722 737 -354 357 -722 351 -708 387 -712 717 -350 731 -354 741 -356 743 -330 375 -8180 4829 -1468 739 -364 707 -354 729 -352 379 -722 353 -720 387 -686 387 -718 707 -368 721 -366 707 -368 351 -718 735 -354 719 -354 719 -388 329 -746 349 -738 351 -712 359 -718 361 -742 365 -708 371 -706 373 -720 733 -320 733 -354 383 -720 353 -720 387 -718 351 -716 385 -714 703 -388 327 -746 705 -348 387 -702 385 -690 385 -724 713 -358 709 -362 743 -364 709 -370 351 -8162 4837 -1482 715 -388 715 -352 715 -384 325 -730 353 -744 353 -712 359 -720 723 -354 733 -354 745 -356 351 -720 719 -362 741 -330 737 -382 349 -722 345 -724 361 -744 349 -704 383 -716 357 -718 357 -720 361 -720 723 -354 733 -354 383 -720 387 -686 387 -718 353 -718 349 -716 731 -384 347 -724 721 -352 365 -706 353 -732 353 -746 717 -356 723 -352 739 -354 711 -360 385 -8146 4841 -1470 737 -344 739 -326 751 -352 377 -690 387 -724 353 -724 353 -722 711 -360 743 -364 721 -330 387 -716 703 -386 721 -356 721 -354 363 -706 349 -734 351 -746 355 -718 355 -712 363 -744 365 -708 369 -722 695 -352 731 -354 381 -722 353 -722 351 -734 351 -716 383 -720 723 -354 333 -736 739 -348 361 -708 351 -748 355 -712 725 -354 727 -352 741 -352 713 -358 385 -8134 4855 -1474 719 -358 709 -362 721 -364 387 -716 351 -718 385 -712 347 -712 739 -334 739 -354 729 -352 379 -722 717 -354 711 -360 743 -332 387 -718 351 -716 377 -708 349 -730 353 -742 355 -710 359 -720 359 -720 723 -354 729 -352 381 -720 353 -722 351 -722 387 -684 387 -716 703 -384 349 -722 737 -354 329 -750 349 -738 353 -712 719 -356 725 -354 741 -354 717 -358 385 -8126 4861 -1470 735 -344 731 -346 729 -348 383 -718 347 -712 353 -734 353 -746 715 -356 725 -350 741 -352 351 -718 741 -366 721 -366 705 -370 353 -718 385 -682 377 -710 349 -734 353 -744 355 -710 359 -710 397 -688 RAW_Data: 727 -354 729 -352 379 -724 353 -722 353 -718 387 -716 353 -716 735 -348 383 -682 727 -386 347 -722 347 -712 381 -706 747 -326 747 -350 737 -352 711 -358 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/faac_slh_raw.sub ================================================ Filetype: Flipper SubGhz RAW File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: RAW RAW_Data: -266 12233 -132 4599 -98 2815 -166 10261 -130 1881 -132 11931 -100 2107 -1164 541 -346 243 -630 515 -330 275 -618 281 -572 277 -566 307 -560 257 -626 313 -558 313 -570 547 -324 561 -310 555 -318 285 -544 567 -308 283 -630 297 -572 281 -590 281 -598 275 -568 291 -570 571 -312 283 -556 579 -310 311 -570 303 -578 545 -346 249 -598 553 -302 315 -550 279 -574 311 -592 291 -600 281 -588 553 -316 533 -342 523 -324 559 -312 283 -558 281 -628 559 -294 573 -334 549 -316 541 -314 563 -294 281 -588 543 -312 285 -628 551 -310 283 -594 553 -336 281 -588 283 -560 551 -312 533 -324 281 -626 283 -568 287 -602 543 -348 537 -316 535 -330 273 -580 545 -318 537 -300 1093 -1154 545 -346 279 -598 529 -340 283 -592 281 -560 313 -536 309 -564 257 -640 281 -592 279 -598 557 -294 571 -336 551 -316 285 -560 539 -316 283 -602 259 -606 313 -584 281 -572 307 -564 289 -580 543 -314 285 -560 553 -352 277 -602 257 -608 545 -350 283 -576 559 -296 279 -584 275 -586 281 -592 313 -570 307 -560 559 -340 547 -314 541 -314 563 -296 279 -584 275 -618 539 -348 523 -324 583 -308 549 -314 573 -312 283 -564 543 -292 303 -614 551 -318 279 -602 545 -328 273 -584 281 -594 553 -316 535 -312 283 -596 293 -598 281 -590 555 -314 565 -296 569 -300 277 -588 545 -316 543 -318 1097 -1144 529 -338 283 -604 541 -324 259 -608 281 -572 285 -566 293 -570 277 -622 279 -612 273 -596 549 -302 581 -316 543 -316 283 -572 549 -292 285 -632 283 -578 285 -600 265 -604 281 -590 281 -562 567 -312 283 -564 545 -356 281 -590 281 -572 573 -324 259 -606 551 -316 285 -564 279 -574 275 -630 259 -618 281 -592 539 -348 525 -326 541 -338 551 -280 287 -562 281 -630 557 -326 541 -336 545 -316 537 -348 527 -324 281 -562 581 -280 287 -630 527 -342 269 -608 543 -346 249 -588 279 -596 525 -344 523 -324 261 -640 283 -594 277 -568 579 -292 569 -310 547 -316 281 -578 557 -294 569 -300 1071 -1180 527 -344 269 -608 543 -348 249 -598 279 -598 277 -572 273 -562 291 -616 281 -592 313 -568 541 -324 561 -310 547 -316 283 -580 559 -308 269 -608 277 -622 283 -578 275 -602 257 -602 275 -586 545 -316 283 -582 529 -362 251 -620 281 -592 535 -346 283 -562 547 -328 275 -586 281 -560 315 -580 309 -596 257 -586 581 -316 543 -316 531 -344 523 -322 295 -578 281 -588 553 -350 523 -324 581 -308 547 -316 539 -348 247 -602 543 -294 299 -612 553 -318 281 -602 545 -326 271 -584 281 -584 553 RAW_Data: -316 533 -308 283 -628 265 -602 279 -594 535 -338 535 -322 563 -310 281 -568 575 -290 559 -310 1077 -1170 541 -322 293 -576 551 -354 245 -580 307 -562 291 -580 275 -586 281 -592 313 -570 307 -560 559 -336 549 -316 539 -316 281 -570 547 -324 293 -608 283 -578 275 -598 289 -580 277 -590 281 -594 539 -310 279 -564 559 -374 283 -582 275 -604 543 -326 271 -584 545 -316 283 -600 279 -564 275 -602 291 -612 281 -582 539 -350 525 -324 541 -338 519 -314 285 -594 283 -596 555 -326 543 -338 551 -318 537 -316 561 -294 279 -586 545 -350 249 -618 541 -324 285 -604 545 -352 245 -602 275 -570 545 -324 559 -310 283 -590 313 -570 307 -558 559 -338 547 -318 539 -314 283 -568 547 -324 557 -310 1079 -1148 557 -326 283 -594 545 -318 281 -602 275 -570 307 -560 259 -590 275 -622 279 -606 273 -592 555 -334 515 -350 541 -318 281 -570 549 -290 287 -638 281 -596 275 -602 257 -602 275 -586 281 -582 539 -312 283 -568 577 -324 309 -588 281 -598 525 -344 269 -600 539 -312 283 -584 283 -560 279 -612 307 -562 295 -602 549 -318 537 -316 561 -294 569 -302 279 -588 281 -626 529 -344 521 -324 567 -348 521 -316 537 -348 283 -564 545 -294 301 -614 539 -348 283 -564 547 -332 275 -588 315 -560 537 -316 529 -344 269 -602 311 -588 283 -596 527 -346 523 -322 561 -310 283 -560 543 -316 537 -314 1093 -1174 541 -346 285 -562 563 -346 267 -568 303 -580 281 -556 281 -584 281 -630 275 -596 257 -618 547 -318 537 -316 561 -294 279 -586 545 -314 285 -618 275 -600 257 -608 313 -584 283 -578 277 -566 541 -322 297 -578 547 -352 279 -572 291 -600 543 -344 249 -596 535 -350 283 -564 257 -570 305 -614 283 -32700 429 -198 97 -726 895 -168 1195 -98 14445 -100 949 -100 4415 -200 1563 -98 10547 -100 7961 -168 267 -166 2059 -132 4651 -98 6711 -100 2341 -1184 511 -382 243 -626 521 -326 283 -600 279 -586 281 -574 275 -566 271 -628 265 -604 279 -590 551 -348 525 -326 543 -306 317 -554 553 -318 245 -632 291 -594 281 -574 285 -600 301 -576 281 -574 539 -320 281 -562 545 -350 279 -598 293 -598 547 -318 279 -600 547 -302 313 -546 317 -536 541 -354 557 -346 537 -302 309 -578 309 -548 577 -282 567 -292 287 -570 547 -350 555 -348 525 -322 317 -576 545 -316 285 -566 313 -536 551 -322 283 -598 317 -596 277 -570 545 -324 563 -312 323 -560 283 -542 315 -568 273 -594 295 -602 551 -318 557 -316 563 -296 311 -556 311 -556 553 -318 545 -284 1103 -1148 553 -336 285 RAW_Data: -592 541 -314 319 -564 289 -574 275 -586 281 -558 281 -630 271 -596 291 -594 547 -318 567 -286 569 -302 315 -548 545 -318 275 -600 295 -596 281 -584 315 -568 285 -568 303 -546 583 -318 285 -548 555 -352 279 -596 257 -620 547 -318 283 -574 539 -324 283 -568 313 -556 551 -350 539 -326 545 -342 283 -572 285 -600 561 -308 549 -318 245 -566 577 -324 577 -316 533 -350 281 -594 549 -316 277 -566 289 -584 545 -312 285 -594 313 -572 309 -558 557 -340 549 -318 275 -568 291 -582 275 -550 315 -590 315 -572 547 -322 561 -310 547 -354 281 -540 309 -564 545 -296 569 -312 1077 -1172 549 -322 291 -578 545 -318 279 -596 293 -562 313 -550 281 -570 285 -630 273 -582 281 -584 565 -346 519 -322 559 -312 285 -560 545 -316 285 -634 275 -594 257 -620 283 -590 283 -574 283 -566 555 -304 279 -592 551 -348 251 -628 265 -604 545 -318 279 -596 551 -300 277 -586 281 -572 539 -354 557 -346 537 -312 283 -594 291 -562 545 -352 523 -318 285 -566 535 -382 553 -292 565 -312 285 -598 537 -350 281 -566 257 -604 543 -312 285 -592 315 -572 307 -558 559 -336 549 -318 277 -566 289 -580 275 -586 283 -610 261 -598 569 -310 547 -354 533 -312 283 -564 289 -582 545 -314 549 -316 1075 -1150 579 -292 301 -582 545 -354 281 -572 275 -594 257 -584 277 -590 281 -592 313 -572 307 -558 559 -338 547 -318 539 -318 283 -572 547 -290 289 -640 283 -596 277 -568 289 -600 275 -586 281 -596 539 -318 283 -540 583 -322 297 -582 317 -550 567 -310 319 -558 555 -300 315 -552 281 -570 573 -322 557 -346 539 -302 279 -602 275 -588 545 -318 567 -294 277 -582 545 -348 535 -330 569 -336 283 -574 539 -324 283 -598 281 -544 563 -302 277 -634 283 -592 281 -598 545 -326 539 -314 285 -596 281 -566 279 -580 275 -602 289 -586 583 -316 543 -316 563 -310 269 -604 275 -582 547 -320 545 -282 1093 -1152 543 -322 301 -586 545 -352 283 -572 273 -594 257 -586 311 -556 283 -592 315 -570 309 -558 559 -338 547 -320 541 -316 283 -572 547 -290 287 -638 283 -578 275 -598 289 -576 313 -556 283 -598 555 -284 285 -568 565 -346 267 -606 277 -588 545 -352 281 -570 555 -294 279 -584 315 -552 553 -352 529 -346 557 -292 301 -586 281 -596 539 -318 531 -344 271 -564 567 -346 543 -318 561 -294 311 -590 547 -320 283 -564 281 -578 555 -292 309 -592 317 -564 315 -574 547 -290 585 -310 285 -554 317 -566 281 -580 277 -602 289 -32700 525 -130 559 -296 16901 -100 3153 -132 4843 -98 9161 RAW_Data: -196 817 -234 3911 -166 6897 -98 6789 -166 8923 -100 2785 -100 5393 -1192 541 -344 243 -630 517 -332 309 -578 281 -570 275 -598 259 -572 299 -614 281 -592 275 -600 545 -326 541 -312 557 -316 287 -576 553 -310 285 -596 291 -596 281 -592 283 -574 309 -564 289 -582 543 -312 285 -560 547 -348 315 -564 289 -580 545 -350 283 -572 539 -320 285 -568 311 -550 281 -628 553 -310 559 -322 557 -312 555 -316 321 -538 311 -562 543 -292 567 -346 555 -316 565 -308 559 -326 273 -584 283 -592 555 -280 563 -316 287 -606 543 -328 309 -552 585 -318 561 -278 565 -294 279 -590 547 -312 279 -600 581 -298 315 -574 285 -600 561 -308 549 -316 287 -562 539 -312 535 -308 1119 -1146 551 -318 317 -572 547 -322 259 -610 281 -558 317 -562 281 -566 307 -594 265 -608 317 -568 541 -324 559 -310 541 -314 279 -568 571 -310 281 -602 289 -578 313 -574 283 -598 265 -604 281 -574 539 -326 281 -558 545 -350 279 -598 293 -602 545 -316 277 -598 549 -300 279 -586 281 -570 285 -600 571 -312 577 -318 531 -344 523 -322 297 -580 281 -560 577 -282 575 -346 521 -324 567 -346 513 -352 283 -572 273 -594 551 -300 547 -312 285 -618 527 -344 269 -604 543 -348 545 -318 533 -310 283 -594 547 -300 275 -622 553 -318 281 -602 257 -606 543 -350 511 -354 283 -566 527 -310 559 -292 1107 -1142 567 -312 281 -594 555 -336 283 -556 319 -544 315 -572 273 -562 291 -610 317 -558 279 -600 553 -318 541 -338 549 -318 285 -564 537 -316 283 -604 291 -580 313 -590 283 -562 313 -574 273 -564 547 -330 275 -586 547 -350 281 -570 291 -602 543 -350 285 -562 537 -316 283 -568 291 -568 303 -612 539 -350 521 -320 579 -310 547 -318 283 -576 311 -562 545 -292 565 -346 537 -348 525 -324 545 -342 285 -594 283 -542 563 -312 557 -290 287 -636 543 -314 283 -602 543 -328 543 -314 557 -318 285 -578 527 -342 271 -598 577 -316 283 -600 277 -572 545 -322 561 -312 285 -560 555 -318 541 -318 1101 -1146 529 -340 283 -572 573 -320 293 -576 283 -572 285 -566 293 -568 277 -624 281 -576 309 -594 551 -300 577 -318 543 -318 283 -572 547 -290 285 -632 285 -594 277 -602 273 -566 291 -582 313 -554 547 -316 285 -546 565 -344 269 -608 313 -556 575 -316 279 -566 559 -340 285 -542 281 -598 259 -616 543 -352 529 -344 559 -290 567 -310 287 -596 283 -544 565 -310 557 -322 563 -348 539 -302 565 -326 275 -584 281 -572 571 -292 549 -306 319 -574 573 -322 291 -578 545 -346 535 -294 571 -304 317 RAW_Data: -544 569 -286 279 -616 543 -350 279 -598 299 -574 547 -316 565 -288 279 -582 579 -280 537 -310 1091 -1176 547 -318 281 -598 551 -338 283 -556 283 -570 287 -596 265 -576 311 -590 279 -610 273 -596 553 -302 549 -350 543 -320 283 -540 585 -290 283 -594 317 -596 277 -568 287 -602 275 -586 281 -594 543 -318 285 -538 553 -354 293 -580 317 -560 569 -310 283 -594 551 -300 277 -586 281 -572 283 -600 569 -310 575 -304 565 -294 569 -314 279 -600 255 -602 543 -312 541 -346 533 -324 569 -348 543 -320 281 -572 309 -558 555 -300 547 -314 287 -592 565 -346 269 -602 543 -310 547 -318 571 -312 283 -564 545 -294 303 -614 541 -350 281 -564 289 -582 577 -318 541 -318 283 -572 549 -290 577 -274 1113 -1146 555 -326 281 -598 545 -318 281 -580 309 -564 287 -574 275 -586 281 -594 313 -572 307 -558 559 -338 547 -318 539 -318 281 -572 547 -292 287 -638 277 -602 257 -618 281 -592 283 -578 251 -596 555 -304 279 -590 547 -346 281 -598 265 -606 545 -318 279 -598 551 -300 279 -586 283 -560 317 -584 555 -324 577 -308 547 -318 557 -316 283 -572 307 -558 553 -300 545 -348 557 -314 561 -324 543 -338 283 -560 317 -548 567 -310 559 -290 283 -630 555 -318 283 -572 545 -324 563 -312 547 -318 283 -566 565 -312 285 -594 555 -338 283 -586 281 -598 527 -344 523 -324 295 -580 547 -318 523 -318 1097 -1142 565 -310 279 -602 545 -326 273 -584 317 -560 281 -562 279 -604 277 -604 257 -606 313 -554 577 -320 531 -342 523 -324 293 -580 547 -318 243 -632 291 -592 281 -572 287 -594 303 -576 281 -572 541 -294 309 -560 545 -350 315 -574 271 -594 559 -336 283 -558 545 -352 283 -540 309 -564 257 -636 551 -316 571 -314 557 -288 585 -310 285 -560 319 -562 539 -316 531 -362 541 -338 549 -318 569 -312 283 -564 291 -588 545 -314 549 -318 285 -598 555 -326 283 -592 547 -318 535 -348 525 -322 283 -564 579 -282 287 -620 557 -326 281 -592 281 -584 539 -350 523 -318 283 -564 549 -316 549 -318 1089 -1134 577 -324 271 -588 545 -352 281 -572 307 -560 291 -558 277 -588 281 -592 313 -572 307 -560 559 -338 549 -318 537 -300 309 -576 541 -312 285 -604 255 -630 273 -584 281 -584 315 -568 285 -570 565 -310 283 -554 547 -352 277 -600 291 -574 545 -352 283 -580 527 -344 267 -570 301 -546 313 -588 569 -312 557 -322 557 -312 539 -342 277 -568 303 -546 579 -282 575 -336 537 -328 545 -352 537 -332 279 -578 313 -548 545 -318 533 -318 279 -612 545 -348 279 RAW_Data: -596 529 -342 547 -316 567 -310 267 -570 567 -310 285 -592 533 -348 281 -596 293 -562 583 -316 545 -318 283 -540 551 -322 543 -304 1111 -1146 557 -326 281 -596 547 -314 285 -578 311 -562 259 -604 275 -582 281 -592 313 -572 307 -560 559 -338 553 -318 559 -284 283 -580 557 -294 279 -614 281 -598 313 -570 287 -566 305 -584 281 -560 577 -318 285 -542 555 -354 291 -576 317 -566 541 -324 297 -580 545 -316 285 -578 283 -566 259 -624 545 -354 527 -344 557 -294 569 -312 285 -586 283 -562 567 -312 527 -356 555 -312 547 -352 531 -346 267 -566 305 -580 547 -318 537 -300 277 -636 547 -318 279 -598 551 -302 551 -350 537 -304 277 -570 573 -310 279 -604 545 -328 311 -582 247 -598 547 -332 545 -314 279 -568 573 -294 565 -310 1077 -1150 551 -320 285 -606 545 -318 281 -604 207 -32700 231 -134 327 -622 361 -134 8003 -100 4115 -164 1395 -164 3469 -98 5967 -100 4997 -134 6541 -132 4213 -98 1445 -134 697 -238 5817 -134 1455 -132 3877 -130 12819 -100 4195 -134 1829 -100 1755 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/feron.sub ================================================ Filetype: Flipper SubGhz Key File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: Feron Bit: 32 Key: 00 00 00 00 63 38 84 7B ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/feron_raw.sub ================================================ Filetype: Flipper SubGhz RAW File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: RAW RAW_Data: 329 -296 295 -66 163 -98 2441 -66 9337 -5690 131 -2574 65 -692 65 -460 165 -230 329 -266 131 -134 97 -400 197 -66 197 -66 12303 -5844 97 -200 167 -102 197 -334 297 -100 559 -166 133 -132 3425 -98 99 -13334 65 -66 129 -822 99 -598 133 -366 131 -68 163 -100 131 -66 99 -98 361 -130 63 -296 2175 -100 163 -100 1095 -100 859 -7534 165 -5584 99 -198 99 -1066 99 -232 99 -266 67 -66 99 -132 97 -564 131 -66 197 -132 231 -98 261 -560 195 -166 885 -98 1579 -198 729 -134 431 -68 5783 -5922 131 -992 65 -166 1459 -262 65 -526 97 -100 163 -230 65 -362 197 -958 99 -634 99 -132 65 -234 99 -394 527 -132 461 -130 323 -18704 231 -564 99 -600 133 -98 1359 -66 165 -166 133 -232 1657 -98 1907 -132 4497 -496 99 -66 167 -100 133 -168 233 -264 167 -66 863 -296 399 -68 2453 -134 635 -66 331 -200 395 -134 7025 -4436 165 -528 99 -298 229 -162 97 -362 197 -524 361 -428 65 -66 99 -166 199 -66 67 -198 165 -466 99 -428 263 -330 361 -132 293 -296 225 -66 3753 -66 291 -66 133 -66 6907 -4898 63 -558 65 -918 99 -100 623 -132 359 -100 457 -98 97 -98 363 -100 559 -132 297 -166 129 -296 97 -262 99 -722 297 -196 1187 -266 199 -168 133 -68 597 -66 301 -132 429 -64 6665 -5372 65 -1054 329 -200 167 -100 629 -100 293 -200 165 -100 133 -132 133 -332 197 -100 233 -496 65 -166 561 -232 165 -296 1127 -64 2753 -66 755 -164 12059 -360 65 -266 99 -66 65 -2612 99 -1780 97 -164 1083 -330 197 -100 397 -66 2095 -98 793 -102 65 -100 10223 -594 65 -232 97 -984 131 -296 99 -166 99 -664 197 -66 261 -230 97 -68 1683 -266 691 -98 335 -66 133 -8384 99 -2300 97 -1710 165 -230 229 -426 97 -134 359 -300 555 -164 193 -132 99 -132 163 -100 497 -298 823 -12964 99 -1874 97 -132 97 -262 97 -328 133 -100 231 -198 131 -132 195 -460 63 -198 131 -66 195 -66 1791 -100 97 -66 131 -64 955 -66 559 -98 233 -66 4633 -5270 263 -100 131 -198 99 -164 331 -132 303 -134 133 -430 233 -1192 67 -498 99 -302 233 -300 597 -66 99 -132 1261 -134 65 -5292 63 -756 131 -884 131 -130 231 -98 197 -198 195 -66 97 -592 261 -298 163 -922 163 -164 65 -656 131 -68 231 -66 99 -430 1295 -68 529 -100 1263 -68 1687 -14880 99 -236 65 -566 163 -758 99 -68 461 -98 559 -130 165 -162 995 -100 1787 -196 195 -524 295 -66 821 -66 5703 -3860 63 -3736 523 -166 161 -64 97 -132 163 -164 257 -164 197 -656 229 -1420 RAW_Data: 99 -598 97 -168 297 -132 199 -232 629 -132 131 -100 97 -266 499 -66 597 -166 229 -66 429 -68 3463 -3518 97 -2346 265 -66 433 -66 503 -464 65 -68 987 -98 131 -98 557 -66 1583 -66 431 -100 1097 -134 5651 -6742 99 -830 197 -102 233 -398 67 -66 197 -168 267 -366 197 -332 363 -364 131 -2374 329 -66 331 -200 133 -100 333 -134 299 -66 4079 -5972 101 -1558 393 -230 331 -330 63 -98 65 -328 131 -426 133 -66 197 -196 65 -1352 65 -590 97 -230 161 -96 163 -230 329 -198 97 -134 1525 -66 433 -168 1455 -230 6225 -2024 99 -266 99 -268 133 -264 297 -100 167 -168 233 -168 267 -660 369 -234 337 -300 97 -132 263 -134 1133 -200 137 -136 265 -166 167 -232 99 -300 167 -66 99 -200 197 -462 131 -432 99 -300 165 -862 197 -496 531 -332 231 -132 1015 -100 427 -100 197 -1018 99 -66 97 -200 199 -168 199 -100 465 -100 197 -68 65 -132 3155 -66 12365 -328 131 -696 133 -896 265 -472 165 -132 133 -232 129 -68 165 -66 723 -564 529 -66 1491 -266 99 -132 397 -66 501 -6672 65 -1580 97 -1420 199 -166 265 -134 699 -168 133 -100 663 -66 637 -68 2119 -66 697 -66 1027 -66 3319 -7648 97 -162 293 -460 197 -230 591 -166 227 -98 65 -262 329 -198 163 -128 97 -328 131 -426 229 -368 299 -202 265 -168 331 -100 729 -68 1597 -66 133 -66 961 -68 231 -166 99 -234 5397 -5158 65 -1328 97 -502 99 -166 199 -198 131 -68 199 -264 231 -436 163 -332 199 -100 131 -166 165 -168 97 -100 133 -600 165 -1754 99 -66 195 -228 263 -164 297 -232 365 -200 499 -66 297 -66 1625 -66 399 -166 5011 -6110 97 -1482 65 -264 367 -166 65 -68 465 -892 197 -330 231 -430 133 -12408 129 -5982 295 -562 165 -132 1033 -66 997 -66 799 -66 297 -196 959 -100 729 -66 2115 -66 2639 -5752 99 -802 365 -232 97 -362 97 -2510 131 -534 99 -296 131 -268 1161 -66 131 -66 1057 -100 1325 -66 463 -4028 97 -364 65 -728 197 -234 99 -100 97 -100 65 -132 265 -428 333 -628 195 -262 99 -228 131 -1766 163 -562 297 -132 465 -302 165 -100 133 -198 365 -132 465 -66 1787 -4594 65 -2792 65 -164 131 -66 131 -98 197 -296 131 -332 165 -330 693 -298 101 -366 265 -1892 65 -134 65 -164 201 -200 65 -266 265 -232 133 -200 235 -200 1001 -68 991 -66 597 -100 963 -200 2913 -9784 65 -426 229 -954 131 -398 531 -198 97 -98 163 -130 131 -326 359 -100 2367 -168 691 -100 13125 -362 65 -394 197 -332 133 -200 299 -366 167 -264 299 -132 835 -234 2493 -132 RAW_Data: 99 -134 565 -334 231 -134 167 -200 1425 -132 3943 -3864 563 -66 233 -2296 99 -198 165 -234 199 -298 263 -134 131 -530 299 -398 233 -1336 165 -166 65 -132 99 -232 295 -130 99 -328 97 -132 97 -66 97 -132 65 -262 2145 -132 195 -196 65 -362 231 -196 261 -98 65 -198 229 -132 229 -196 793 -66 555 -100 297 -66 493 -230 359 -100 195 -296 229 -66 99 -166 10343 -3654 165 -1392 65 -834 65 -132 495 -100 395 -232 331 -360 265 -132 1681 -5474 165 -2122 65 -200 65 -232 99 -1132 65 -200 165 -102 133 -68 199 -100 663 -234 165 -298 163 -68 1597 -98 1199 -66 197 -332 5539 -1934 65 -3354 133 -168 167 -2354 101 -930 65 -1266 131 -298 99 -1328 259 -232 563 -200 297 -100 65 -132 131 -66 1681 -100 267 -98 331 -168 299 -132 629 -66 5981 -2810 165 -3282 99 -132 227 -98 163 -430 231 -330 293 -66 65 -164 99 -958 65 -134 67 -432 99 -1426 297 -264 295 -132 363 -332 97 -366 133 -98 2869 -102 1755 -100 2911 -7466 261 -196 193 -260 259 -298 135 -66 133 -400 199 -266 195 -334 97 -268 365 -864 129 -1132 395 -300 395 -132 933 -200 367 -134 997 -66 233 -198 5415 -5556 65 -1292 65 -68 131 -268 165 -264 231 -1792 65 -764 65 -1394 299 -396 451 -854 323 -808 97 -62 227 -838 231 -868 635 -460 669 -402 275 -810 271 -838 681 -398 711 -388 691 -392 275 -832 279 -780 311 -774 741 -376 285 -776 321 -762 325 -776 297 -776 765 -324 345 -752 345 -724 341 -756 767 -326 773 -334 743 -340 771 -348 313 -770 741 -350 753 -556 497 -4666 359 -736 779 -318 759 -326 351 -758 347 -726 339 -760 767 -322 775 -334 351 -734 341 -732 769 -318 781 -326 777 -334 355 -724 349 -740 347 -724 775 -324 349 -734 353 -734 355 -756 347 -724 771 -326 347 -758 345 -732 353 -732 755 -350 771 -320 765 -322 763 -356 317 -758 755 -352 755 -524 557 -4642 323 -746 795 -320 773 -296 389 -722 347 -726 375 -724 767 -324 779 -332 355 -724 347 -724 775 -326 779 -334 747 -338 357 -730 355 -728 355 -756 743 -350 355 -722 353 -720 349 -754 345 -758 743 -346 331 -756 323 -744 361 -752 761 -322 773 -332 747 -336 779 -310 343 -764 735 -348 773 -516 561 -4620 349 -744 781 -320 763 -330 351 -756 347 -724 341 -758 769 -324 775 -332 351 -736 341 -734 771 -324 777 -322 773 -332 355 -724 349 -724 377 -724 769 -324 347 -758 345 -734 351 -732 351 -722 791 -320 351 -726 359 -736 321 -768 753 -322 801 -330 753 -334 755 -336 353 -732 765 -354 727 -548 RAW_Data: 545 -4646 351 -738 755 -322 801 -296 389 -722 347 -740 347 -726 773 -326 777 -334 355 -730 355 -730 779 -308 777 -346 743 -348 321 -758 353 -722 351 -750 769 -314 333 -742 351 -740 361 -720 363 -754 761 -322 345 -756 347 -724 339 -756 767 -324 775 -332 745 -338 779 -310 357 -728 777 -348 739 -550 513 -4672 323 -776 749 -320 763 -328 353 -758 347 -740 347 -726 771 -326 777 -334 355 -724 349 -758 743 -326 777 -332 747 -340 351 -732 343 -736 351 -756 755 -320 371 -724 375 -724 335 -746 337 -746 771 -326 349 -756 347 -722 341 -756 767 -326 775 -332 747 -338 777 -310 343 -766 745 -346 759 -546 509 -4650 345 -770 743 -324 785 -326 347 -758 345 -734 349 -734 769 -344 763 -296 373 -744 333 -754 765 -322 777 -332 745 -340 351 -732 343 -734 351 -756 753 -322 367 -724 341 -760 335 -748 337 -756 767 -324 345 -756 345 -734 351 -732 767 -314 797 -296 769 -322 801 -296 353 -756 777 -332 747 -536 537 -4634 359 -742 777 -320 763 -328 349 -756 347 -726 339 -756 767 -322 775 -334 355 -732 355 -728 779 -310 757 -338 757 -342 351 -732 343 -734 353 -758 753 -322 367 -724 341 -760 335 -748 337 -756 765 -324 347 -736 351 -724 377 -726 769 -324 777 -334 747 -338 779 -310 343 -764 739 -330 769 -546 523 -4664 343 -758 743 -346 761 -324 347 -752 335 -754 333 -746 769 -324 775 -334 351 -734 341 -734 773 -324 775 -322 779 -332 355 -722 349 -740 347 -724 773 -324 351 -756 347 -724 339 -758 337 -748 769 -322 347 -756 347 -722 341 -756 767 -324 777 -332 747 -338 779 -310 341 -766 771 -298 767 -548 523 -4658 329 -770 777 -320 755 -328 349 -756 347 -740 347 -726 773 -324 777 -332 357 -722 349 -754 743 -326 779 -334 745 -342 351 -734 349 -752 347 -722 781 -312 333 -780 321 -742 361 -752 331 -752 763 -324 343 -756 347 -734 351 -734 767 -322 765 -352 753 -346 753 -296 373 -750 763 -322 775 -530 535 -4632 359 -736 779 -320 761 -328 351 -732 351 -758 347 -724 775 -326 781 -330 355 -724 349 -756 743 -326 779 -334 745 -340 351 -732 341 -762 317 -776 749 -320 367 -722 339 -758 337 -746 337 -746 773 -326 347 -736 351 -754 347 -726 771 -324 779 -332 747 -340 779 -310 343 -768 745 -348 753 -516 543 -4650 383 -716 769 -348 753 -326 343 -750 333 -754 335 -744 769 -324 775 -334 351 -734 343 -736 771 -324 775 -322 775 -332 351 -734 353 -722 349 -754 755 -318 337 -768 319 -766 325 -746 361 -752 763 -320 345 -756 345 -726 RAW_Data: 337 -746 771 -324 777 -334 743 -340 769 -352 311 -768 741 -324 781 -520 561 -4636 359 -736 777 -320 757 -326 349 -756 347 -724 341 -758 769 -324 777 -332 351 -734 341 -734 773 -324 779 -320 773 -332 349 -734 353 -722 349 -756 753 -352 301 -766 319 -768 325 -746 365 -752 761 -322 345 -724 377 -734 351 -732 767 -316 761 -332 767 -322 769 -330 351 -766 745 -336 777 -512 541 -4668 325 -742 779 -320 761 -330 351 -756 347 -740 347 -724 773 -324 779 -332 355 -730 355 -726 777 -346 755 -308 777 -346 319 -760 309 -764 347 -752 751 -320 367 -724 375 -722 337 -746 337 -746 771 -326 349 -756 347 -724 339 -756 767 -324 775 -330 745 -340 769 -322 341 -766 743 -322 781 -552 529 -4628 359 -736 781 -318 759 -328 351 -734 341 -766 323 -746 779 -322 761 -328 351 -766 353 -724 777 -330 751 -336 753 -336 355 -728 355 -726 355 -756 741 -352 353 -722 351 -722 347 -752 349 -738 777 -320 361 -724 339 -756 335 -746 769 -326 775 -334 747 -338 755 -340 357 -724 783 -330 747 -538 539 -4658 347 -750 753 -320 763 -330 351 -732 353 -756 347 -724 775 -326 781 -332 355 -724 347 -756 741 -326 779 -334 747 -340 351 -734 349 -752 347 -722 779 -312 333 -780 323 -740 361 -752 331 -754 763 -320 345 -756 345 -724 339 -746 771 -324 779 -332 747 -338 769 -320 343 -766 741 -348 753 -556 531 -4624 349 -776 747 -320 765 -328 351 -758 347 -726 339 -758 767 -324 777 -332 351 -732 343 -732 771 -318 781 -324 777 -332 355 -722 349 -722 379 -734 745 -340 351 -732 345 -734 349 -760 323 -746 793 -322 341 -722 379 -722 339 -744 771 -324 775 -334 745 -340 757 -340 355 -728 779 -346 741 -548 511 -4676 323 -744 777 -318 763 -328 351 -758 347 -724 377 -722 767 -326 777 -332 355 -732 353 -724 777 -332 745 -338 777 -310 343 -734 349 -744 353 -742 759 -322 371 -734 351 -732 345 -734 353 -756 755 -322 367 -724 341 -770 349 -734 767 -318 765 -332 765 -320 761 -328 351 -756 745 -362 747 -536 537 -4662 317 -778 747 -322 797 -294 389 -724 347 -728 337 -746 771 -326 777 -334 351 -734 343 -734 777 -326 773 -322 775 -330 355 -724 349 -732 351 -732 767 -352 333 -736 351 -738 325 -780 331 -752 763 -322 345 -736 351 -758 345 -724 769 -324 777 -332 743 -340 769 -356 317 -752 769 -314 787 -514 539 -4638 345 -768 773 -320 753 -326 351 -760 347 -712 379 -724 773 -322 777 -334 351 -734 355 -718 789 -320 769 -324 759 -348 323 -758 355 -720 351 -720 RAW_Data: 801 -314 333 -740 351 -740 361 -720 363 -754 761 -322 345 -726 377 -724 337 -746 769 -324 777 -334 743 -340 769 -320 343 -768 739 -324 783 -552 529 -4634 359 -736 779 -320 757 -326 351 -760 345 -722 341 -756 767 -322 777 -334 349 -736 353 -720 763 -354 759 -320 755 -350 331 -740 353 -740 327 -748 793 -320 341 -758 345 -722 337 -746 339 -746 773 -324 349 -756 345 -724 341 -756 767 -326 775 -334 745 -338 777 -310 343 -764 771 -296 767 -548 523 -4650 347 -742 781 -320 765 -328 351 -732 351 -758 347 -724 777 -326 779 -332 353 -724 349 -754 741 -326 779 -334 745 -342 351 -732 349 -754 347 -722 779 -348 299 -778 321 -742 363 -718 363 -754 763 -322 343 -758 345 -732 351 -732 769 -354 725 -350 755 -348 737 -350 353 -722 763 -354 757 -510 543 -4652 353 -742 791 -288 773 -330 351 -734 387 -722 347 -724 775 -326 781 -330 355 -732 355 -730 745 -342 777 -346 755 -310 357 -726 355 -724 353 -758 755 -348 355 -722 351 -722 349 -756 345 -756 747 -346 329 -752 321 -746 361 -752 763 -322 773 -332 751 -336 745 -342 341 -768 749 -346 753 -514 543 -4656 349 -756 755 -318 789 -316 333 -744 353 -742 359 -718 791 -320 773 -332 357 -724 349 -740 779 -296 785 -334 755 -336 353 -732 341 -736 353 -750 753 -320 369 -724 375 -712 375 -712 375 -736 749 -338 353 -730 343 -734 349 -754 753 -320 801 -294 779 -338 777 -310 341 -764 771 -296 799 -514 523 -4664 347 -756 745 -346 757 -318 349 -756 335 -756 335 -746 767 -324 777 -332 353 -730 343 -732 771 -326 775 -324 777 -332 357 -724 347 -726 375 -736 747 -338 353 -732 341 -734 349 -756 325 -744 793 -320 343 -726 377 -724 337 -746 769 -324 777 -334 747 -338 767 -322 341 -766 741 -322 785 -518 563 -4622 349 -744 783 -320 761 -326 353 -756 347 -724 375 -724 767 -324 777 -334 355 -724 349 -740 745 -330 779 -336 747 -342 353 -732 351 -722 383 -718 781 -314 333 -742 353 -742 361 -716 363 -754 765 -322 345 -724 379 -724 337 -746 769 -324 779 -334 745 -340 777 -312 341 -764 771 -296 769 -546 523 -4654 359 -734 779 -320 757 -328 349 -756 347 -720 377 -742 743 -326 777 -334 353 -722 349 -754 743 -360 745 -336 743 -342 343 -736 329 -768 321 -768 757 -322 369 -722 341 -770 349 -734 311 -768 777 -326 311 -778 331 -746 335 -754 767 -324 775 -332 745 -340 777 -312 355 -760 755 -346 741 -88244 133 -132 99 -232 165 -100 97 -730 99 -66 2213 -264 995 -100 631 -132 6925 -4032 RAW_Data: 133 -66 65 -2118 165 -1032 197 -66 65 -66 197 -66 99 -132 267 -66 297 -434 133 -134 133 -68 65 -66 131 -266 299 -64 67 -362 161 -296 165 -132 229 -66 361 -498 197 -132 657 -132 1031 -98 1595 -100 965 -132 165 -7880 99 -164 99 -564 67 -928 165 -166 231 -100 65 -166 333 -66 165 -266 165 -398 953 -132 1755 -66 1541 -98 4449 -8044 99 -166 303 -368 591 -132 359 -264 227 -164 99 -1550 299 -200 435 -100 67 -66 593 -132 2943 -134 895 -198 3879 -7540 99 -938 99 -860 99 -1392 99 -1474 197 -166 199 -134 99 -264 233 -134 265 -100 397 -134 1497 -2162 99 -1496 67 -1392 99 -230 233 -66 735 -66 567 -364 197 -66 99 -232 2109 -64 429 -98 99 -98 131 -66 359 -198 195 -162 4861 -4980 131 -950 131 -228 359 -1078 297 -398 231 -262 231 -66 65 -726 295 -366 199 -232 229 -328 459 -68 231 -132 367 -132 3483 -100 597 -134 7113 -1274 99 -236 165 -4414 199 -1432 67 -298 267 -166 329 -234 529 -200 197 -296 129 -294 163 -98 65 -362 131 -100 65 -1426 959 -332 265 -66 297 -166 2683 -66 535 -66 199 -4286 99 -164 525 -1224 363 -166 199 -270 131 -1758 165 -200 557 -298 163 -132 329 -68 233 -66 965 -100 99 -166 365 -234 1391 -9070 131 -1526 97 -1546 131 -98 329 -364 363 -132 329 -164 1183 -10266 65 -6530 65 -732 131 -398 197 -230 195 -98 65 -364 63 -458 65 -198 65 -658 65 -196 163 -98 1805 -98 463 -164 99 -66 623 -98 423 -228 325 -66 233 -100 5543 -5982 97 -1486 331 -198 131 -526 133 -232 131 -132 131 -66 231 -98 131 -134 629 -2026 65 -266 163 -334 265 -66 363 -134 2383 -134 131 -68 233 -98 6503 -98 1329 -9556 65 -166 463 -66 133 -166 233 -266 203 -68 67 -168 99 -66 1161 -66 1667 -132 265 -168 197 -100 199 -200 889 -15904 99 -132 133 -300 1093 -198 201 -132 133 -366 1193 -166 101 -66 935 -134 367 -14672 195 -824 131 -788 395 -430 231 -166 99 -68 99 -17390 65 -1062 65 -498 99 -134 99 -368 65 -66 65 -464 65 -332 265 -132 231 -66 597 -266 133 -330 165 -100 2127 -234 1395 -132 10439 -1004 67 -698 97 -2784 65 -66 265 -264 133 -528 331 -100 131 -234 2027 -164 693 -100 65 -134 197 -130 97 -66 457 -100 4649 -4556 65 -3626 67 -464 65 -100 133 -100 131 -532 67 -566 133 -134 231 -564 65 -166 99 -134 165 -102 65 -1206 199 -666 1261 -66 1031 -132 869 -134 199 -66 597 -100 7409 -7344 97 -296 99 -232 99 -232 65 -662 263 -66 131 -266 397 -100 363 -66 2553 -98 531 -166 RAW_Data: 7313 -3784 133 -168 133 -1022 99 -558 361 -68 65 -66 97 -166 229 -132 265 -198 97 -792 97 -132 97 -558 163 -264 161 -658 197 -294 231 -328 193 -130 295 -166 231 -166 65 -98 489 -66 885 -100 921 -66 461 -66 323 -304 99 -3408 65 -166 99 -66 195 -296 265 -134 133 -364 65 -296 197 -228 97 -294 231 -368 1387 -66 133 -166 1133 -100 333 -68 431 -66 165 -134 4955 -5736 97 -1088 99 -100 99 -166 199 -264 131 -68 165 -398 199 -630 99 -66 233 -68 403 -98 233 -662 133 -1126 65 -228 131 -98 65 -490 199 -132 229 -232 491 -64 429 -66 667 -100 167 -200 531 -100 263 -264 295 -100 429 -14212 97 -956 65 -930 363 -66 299 -200 331 -66 63 -100 131 -230 1215 -66 1425 -132 927 -132 8041 -732 133 -1064 97 -270 269 -298 129 -228 65 -262 65 -198 459 -100 667 -166 129 -688 67 -2106 97 -232 329 -64 1065 -66 99 -334 167 -132 969 -100 1855 -98 1189 -100 5599 -4798 99 -2932 557 -200 163 -492 295 -758 457 -1788 99 -198 131 -402 197 -134 129 -524 231 -266 1295 -68 1135 -102 701 -10576 65 -5130 63 -100 97 -464 395 -298 99 -100 365 -134 201 -100 99 -100 2515 -98 1611 -132 327 -3806 97 -2502 197 -654 131 -196 97 -196 163 -392 263 -1018 97 -826 197 -130 331 -298 367 -98 267 -68 803 -236 367 -132 851 -166 299 -100 6833 -6158 65 -1062 199 -294 163 -326 227 -724 65 -164 1215 -132 855 -198 467 -66 431 -200 393 -100 229 -98 10229 -338 197 -1756 97 -298 263 -166 97 -164 195 -228 131 -198 199 -234 533 -66 529 -134 397 -100 165 -166 199 -168 99 -100 99 -166 301 -202 529 -66 921 -98 6861 -7702 65 -400 65 -1856 201 -134 65 -100 197 -166 199 -300 165 -134 65 -20006 99 -332 561 -164 199 -630 133 -66 99 -134 131 -200 2393 -134 199 -132 1127 -6284 67 -1900 97 -494 131 -490 163 -264 231 -66 197 -130 327 -164 129 -332 133 -132 3021 -13676 97 -1056 63 -232 65 -264 295 -596 731 -66 295 -66 161 -66 589 -68 3121 -66 199 -68 299 -100 629 -68 8427 -262 405 -744 739 -362 743 -338 353 -760 317 -756 313 -768 741 -360 741 -356 339 -756 307 -786 741 -358 743 -334 743 -374 311 -772 295 -774 319 -764 753 -352 341 -756 307 -758 337 -744 339 -772 743 -338 353 -726 353 -760 313 -766 773 -312 753 -330 771 -354 737 -362 317 -754 745 -364 743 -538 539 -4668 325 -742 781 -320 761 -328 349 -756 347 -724 341 -744 775 -326 777 -334 355 -732 353 -722 779 -332 745 -338 769 -352 311 -768 317 -760 325 -776 RAW_Data: 761 -320 345 -734 351 -732 345 -770 317 -760 753 -322 369 -724 341 -756 335 -756 765 -324 775 -332 747 -338 755 -340 343 -736 781 -346 755 -516 543 -4650 349 -756 755 -352 755 -314 333 -776 321 -740 361 -752 763 -322 773 -332 353 -722 347 -736 781 -332 745 -338 771 -318 343 -736 351 -758 325 -774 761 -322 341 -736 349 -736 349 -756 347 -724 773 -326 347 -756 345 -724 341 -768 747 -338 777 -344 741 -344 739 -348 353 -722 763 -354 757 -510 543 -4654 353 -740 757 -354 771 -296 353 -756 347 -724 341 -758 769 -326 777 -332 349 -736 341 -736 775 -326 775 -320 773 -330 355 -720 349 -736 349 -754 741 -330 351 -756 347 -722 343 -758 337 -744 771 -324 347 -756 345 -736 349 -734 767 -346 765 -296 769 -354 739 -330 353 -758 743 -364 747 -536 535 -4668 325 -740 777 -320 761 -328 349 -758 347 -722 341 -758 769 -324 777 -334 353 -732 353 -722 777 -332 745 -338 769 -354 315 -752 317 -768 319 -766 755 -322 371 -724 375 -724 337 -746 339 -754 767 -326 345 -756 345 -734 351 -732 755 -350 767 -314 765 -346 757 -324 349 -744 767 -326 775 -530 537 -4636 359 -738 777 -318 761 -328 353 -732 389 -696 389 -724 777 -330 747 -336 357 -730 355 -728 779 -310 779 -348 741 -348 321 -758 353 -722 351 -752 769 -314 333 -742 353 -740 361 -718 363 -752 763 -322 345 -734 351 -726 377 -726 771 -324 777 -332 747 -338 769 -320 343 -766 739 -324 783 -522 561 -4654 315 -778 747 -320 767 -328 351 -758 347 -726 341 -758 765 -324 779 -330 357 -724 347 -724 773 -326 779 -334 747 -340 357 -728 355 -728 355 -758 739 -352 355 -722 341 -736 353 -754 321 -744 793 -318 345 -724 379 -724 337 -746 771 -324 777 -332 755 -336 779 -310 343 -732 779 -346 757 -514 543 -4650 351 -756 753 -352 751 -348 329 -752 321 -746 361 -752 761 -322 775 -298 387 -730 355 -724 781 -296 781 -336 755 -336 353 -730 343 -736 349 -756 751 -322 369 -734 351 -732 345 -732 353 -756 751 -322 369 -726 375 -712 375 -734 747 -338 777 -310 771 -352 733 -344 341 -740 757 -322 803 -528 533 -4634 359 -736 779 -318 763 -328 349 -758 347 -724 339 -756 767 -324 777 -334 351 -734 343 -732 773 -326 775 -322 777 -332 355 -730 357 -722 347 -726 773 -326 349 -734 353 -732 387 -698 389 -724 777 -296 387 -722 347 -726 375 -714 773 -324 777 -334 745 -342 779 -310 343 -766 747 -346 757 -514 543 -4654 341 -764 779 -296 767 -320 373 -724 377 -724 335 -746 771 -324 777 -332 RAW_Data: 353 -734 343 -732 771 -324 777 -322 779 -332 355 -732 355 -724 347 -724 777 -324 349 -756 347 -724 339 -746 375 -734 747 -338 351 -732 343 -734 349 -756 753 -320 801 -328 747 -336 757 -336 357 -724 781 -332 745 -536 539 -4642 359 -738 779 -318 761 -328 351 -736 353 -756 347 -724 771 -324 777 -334 357 -724 349 -724 775 -326 779 -334 745 -340 351 -732 345 -734 351 -756 753 -322 369 -724 377 -702 383 -734 341 -734 773 -324 345 -752 333 -748 335 -748 771 -324 775 -334 745 -338 779 -312 357 -728 777 -350 741 -548 511 -4676 325 -740 781 -320 763 -328 351 -758 347 -724 341 -746 775 -326 775 -334 355 -732 355 -724 779 -330 747 -336 779 -310 357 -728 355 -724 353 -756 767 -322 351 -722 345 -766 319 -762 325 -778 761 -320 345 -724 377 -724 337 -758 767 -322 775 -332 755 -336 745 -342 341 -732 769 -330 769 -546 523 -4664 345 -742 779 -320 759 -326 349 -736 353 -756 347 -726 771 -324 779 -334 351 -734 341 -736 779 -324 773 -320 777 -296 389 -728 357 -722 349 -724 777 -326 347 -726 379 -734 351 -734 351 -722 793 -322 351 -720 343 -762 323 -744 779 -320 763 -328 781 -334 755 -336 353 -734 767 -316 761 -536 541 -4650 349 -756 753 -352 755 -312 333 -746 353 -742 361 -752 765 -322 773 -298 389 -722 349 -724 775 -326 781 -332 747 -338 357 -728 355 -726 355 -724 799 -322 351 -718 347 -740 353 -738 359 -720 793 -320 343 -724 379 -726 337 -748 767 -324 779 -332 747 -338 757 -340 357 -728 755 -342 757 -538 539 -4660 317 -780 751 -320 767 -328 353 -756 347 -740 347 -726 771 -326 777 -334 355 -730 357 -724 781 -330 747 -336 747 -342 353 -732 349 -754 347 -720 777 -316 341 -746 361 -720 363 -754 331 -748 767 -322 347 -732 355 -758 321 -754 769 -320 765 -354 757 -322 757 -352 331 -736 777 -320 757 -556 533 -4634 359 -738 779 -320 761 -326 351 -756 347 -722 373 -726 767 -322 775 -334 355 -724 349 -724 773 -326 779 -334 747 -338 353 -732 343 -734 349 -760 751 -320 371 -740 347 -726 375 -726 335 -748 769 -322 347 -734 351 -732 345 -768 743 -322 785 -324 777 -334 753 -336 357 -728 777 -312 777 -546 509 -4670 323 -744 779 -320 763 -328 353 -732 353 -732 389 -722 777 -330 747 -338 357 -724 349 -756 741 -328 779 -336 745 -340 341 -736 347 -742 351 -740 791 -288 373 -724 379 -712 377 -724 337 -748 769 -322 347 -758 347 -724 339 -746 771 -324 777 -334 747 -340 767 -322 341 -766 739 -348 755 -558 527 -4632 RAW_Data: 359 -736 781 -318 761 -326 351 -756 347 -726 339 -748 771 -324 783 -332 351 -736 341 -734 771 -324 775 -322 775 -332 351 -736 341 -734 347 -750 753 -322 367 -742 347 -724 339 -746 375 -734 747 -338 357 -728 353 -728 353 -724 775 -350 767 -320 757 -350 739 -352 353 -724 765 -322 761 -556 523 -4648 347 -754 753 -322 767 -328 351 -734 387 -732 355 -722 779 -330 747 -338 355 -730 355 -728 753 -340 777 -312 791 -310 357 -728 355 -728 353 -758 741 -352 355 -722 351 -720 383 -720 345 -758 745 -346 331 -756 323 -742 361 -752 763 -322 773 -332 749 -336 777 -310 343 -734 781 -346 755 -514 543 -4652 349 -752 769 -348 749 -318 347 -746 337 -754 335 -756 767 -320 775 -332 351 -734 343 -736 775 -326 775 -320 773 -332 351 -734 341 -732 349 -754 749 -322 367 -732 353 -732 343 -734 349 -756 753 -322 371 -734 349 -734 343 -734 775 -322 783 -322 777 -332 747 -338 357 -728 777 -312 791 -508 541 -4660 349 -750 751 -320 765 -330 351 -732 353 -732 389 -722 781 -296 785 -334 357 -730 355 -724 779 -330 747 -338 779 -310 357 -728 355 -726 355 -758 737 -352 341 -732 349 -752 323 -744 363 -746 763 -322 347 -756 345 -726 337 -758 767 -322 775 -332 747 -338 779 -310 343 -764 771 -296 767 -548 523 -4660 345 -756 771 -326 771 -318 345 -724 379 -722 337 -758 767 -324 777 -330 351 -734 341 -738 775 -326 773 -320 775 -300 383 -736 309 -764 347 -754 749 -322 367 -722 341 -760 337 -746 339 -746 773 -324 347 -756 345 -724 339 -746 773 -326 777 -332 747 -340 779 -310 357 -726 765 -356 757 -524 545 -4646 351 -740 791 -320 771 -328 357 -722 349 -724 377 -726 767 -322 777 -334 351 -734 341 -734 769 -316 783 -324 777 -332 353 -732 343 -734 349 -752 751 -322 367 -736 349 -732 353 -752 347 -722 781 -312 333 -744 353 -744 361 -754 763 -320 771 -332 753 -336 747 -340 353 -734 787 -318 759 -548 511 -4672 323 -778 749 -320 763 -328 353 -758 347 -740 347 -726 775 -326 777 -332 357 -722 349 -726 775 -326 777 -334 755 -338 351 -732 343 -732 353 -756 755 -320 369 -722 377 -712 375 -702 389 -724 779 -294 353 -758 347 -724 377 -722 769 -322 777 -332 747 -338 779 -310 343 -764 771 -296 767 -548 523 -4666 345 -758 745 -346 759 -324 347 -752 335 -754 333 -748 769 -322 777 -332 353 -732 343 -730 771 -326 777 -322 777 -334 351 -734 353 -720 351 -754 755 -318 335 -766 319 -764 357 -718 363 -754 765 -318 345 -724 379 -732 351 -732 RAW_Data: 765 -316 791 -316 775 -322 775 -330 357 -730 747 -340 781 -510 543 -4670 325 -740 779 -322 761 -328 351 -764 319 -756 347 -756 741 -328 777 -336 349 -736 313 -766 771 -326 777 -322 773 -332 353 -720 349 -734 349 -764 735 -350 333 -742 351 -740 325 -780 331 -746 767 -324 343 -756 345 -724 339 -754 767 -324 775 -334 745 -338 771 -350 311 -768 741 -356 751 -91544 97 -1916 131 -560 161 -784 65 -64 495 -98 589 -296 2305 -15072 197 -1258 65 -130 97 -164 97 -98 297 -198 201 -234 261 -98 99 -66 1333 -166 759 -98 95 -196 295 -66 491 -64 163 -66 4795 -4508 131 -922 65 -166 129 -164 163 -66 131 -164 65 -164 99 -196 163 -264 229 -164 65 -164 131 -1932 231 -164 261 -130 65 -264 65 -362 727 -130 2635 -66 327 -66 2397 -4778 65 -364 67 -1134 67 -438 99 -864 163 -366 1187 -830 99 -328 165 -100 131 -134 199 -568 99 -100 99 -466 231 -560 131 -100 129 -132 329 -64 263 -296 1049 -132 333 -98 703 -364 231 -13082 99 -2554 133 -832 133 -164 395 -132 295 -164 65 -66 131 -66 131 -132 65 -134 955 -100 99 -66 961 -66 4911 -4040 65 -2524 165 -896 65 -498 65 -66 99 -232 133 -268 197 -300 265 -266 133 -400 395 -166 297 -98 131 -1020 97 -492 199 -100 563 -132 99 -66 133 -100 3051 -66 591 -196 195 -162 1921 -66 9139 -3400 129 -692 301 -1262 131 -100 265 -166 337 -134 363 -66 133 -332 233 -134 919 -64 2019 -132 295 -132 165 -200 6921 -4912 133 -336 165 -98 99 -66 261 -298 63 -100 65 -264 163 -296 297 -132 465 -100 65 -332 195 -196 165 -334 97 -100 131 -132 165 -300 629 -66 65 -66 165 -134 663 -134 233 -66 861 -66 3939 -134 567 -1310 163 -2894 229 -168 99 -234 431 -494 97 -396 133 -66 1563 -100 497 -198 265 -14052 65 -524 99 -398 923 -66 3991 -6098 99 -1626 99 -1394 99 -100 265 -200 163 -168 97 -432 99 -100 133 -200 4699 -4592 63 -1486 65 -1786 131 -66 197 -334 101 -400 99 -200 99 -168 131 -100 99 -430 231 -234 167 -2338 763 -364 263 -66 131 -200 263 -132 333 -66 3823 -198 1091 -1186 65 -756 65 -494 99 -1546 97 -1432 131 -66 131 -132 295 -132 131 -300 231 -562 99 -66 363 -100 663 -166 457 -66 3199 -6668 99 -962 65 -164 133 -132 131 -266 363 -430 363 -364 99 -66 365 -132 67 -2376 299 -166 165 -130 161 -360 97 -132 953 -198 2041 -66 855 -12212 95 -330 97 -164 97 -1388 65 -366 99 -964 165 -398 163 -232 427 -66 363 -98 133 -166 895 -98 1519 -132 101 -100 RAW_Data: 133 -166 691 -100 8965 -4740 131 -196 99 -162 231 -226 195 -524 263 -98 391 -66 97 -98 489 -98 2167 -66 129 -198 263 -66 397 -9262 65 -164 97 -2798 197 -830 265 -232 463 -228 425 -230 2667 -132 67 -164 197 -98 2023 -14336 99 -922 65 -1262 531 -100 65 -200 97 -200 197 -102 133 -134 99 -168 395 -100 133 -68 199 -100 855 -66 9821 -5296 65 -4678 229 -166 265 -134 131 -100 65 -166 167 -132 1217 -66 1351 -98 393 -164 487 -12590 99 -2428 131 -434 131 -330 65 -98 131 -298 163 -66 229 -232 559 -66 1805 -66 3565 -100 4163 -4266 67 -3536 65 -824 229 -132 399 -166 67 -100 231 -166 497 -1526 99 -560 231 -134 133 -68 665 -230 291 -230 4463 -66 199 -100 1419 -832 65 -200 65 -464 199 -866 265 -264 231 -100 331 -100 65 -100 131 -100 2415 -132 827 -168 1991 -3852 65 -1928 67 -2620 99 -560 65 -362 65 -198 493 -132 525 -360 231 -100 1017 -132 555 -198 825 -100 10151 -296 131 -698 131 -300 99 -502 99 -966 293 -264 97 -66 395 -430 65 -164 131 -96 97 -98 1617 -132 455 -132 1017 -16428 65 -164 97 -458 131 -66 163 -132 429 -98 463 -66 397 -68 97 -100 367 -100 829 -332 231 -134 1655 -4488 165 -102 165 -830 197 -458 163 -164 65 -132 97 -694 297 -2498 99 -302 165 -764 133 -166 131 -100 763 -98 657 -66 819 -132 229 -130 97 -64 361 -66 401 -66 2079 -5522 99 -2848 297 -298 165 -332 99 -562 99 -1280 99 -594 165 -264 491 -132 99 -164 393 -132 461 -100 465 -132 799 -12900 65 -1660 133 -2006 613 -792 669 -430 671 -436 219 -842 289 -810 259 -826 689 -390 699 -396 311 -782 311 -774 739 -346 737 -348 741 -354 327 -774 307 -772 349 -734 769 -314 345 -742 353 -740 327 -748 363 -750 763 -324 343 -756 347 -722 337 -756 767 -324 775 -334 745 -338 777 -310 343 -766 739 -330 767 -548 523 -4662 345 -760 745 -346 757 -324 347 -752 333 -754 333 -746 769 -326 779 -332 319 -768 309 -766 773 -324 777 -322 773 -330 355 -730 353 -730 353 -722 779 -332 349 -736 311 -768 323 -750 353 -742 759 -352 341 -738 347 -756 345 -720 769 -326 775 -334 745 -340 779 -310 355 -728 787 -346 739 -546 511 -4674 323 -746 781 -320 763 -328 351 -756 347 -726 339 -746 771 -324 779 -334 357 -724 349 -724 777 -326 779 -332 747 -338 351 -732 345 -736 347 -758 751 -320 371 -734 351 -732 343 -736 351 -756 751 -322 369 -736 349 -734 343 -736 771 -324 779 -324 775 -334 755 -336 357 -728 777 -312 775 -548 509 -4676 323 -742 RAW_Data: 783 -320 759 -328 351 -758 345 -726 375 -722 767 -326 777 -332 357 -722 349 -740 781 -296 781 -336 745 -342 351 -732 353 -754 347 -718 769 -344 333 -756 323 -744 361 -718 365 -752 763 -320 345 -758 345 -734 349 -732 767 -346 761 -316 775 -322 773 -332 351 -734 769 -320 757 -548 513 -4668 347 -752 751 -322 765 -328 353 -756 347 -726 375 -714 773 -326 775 -334 355 -730 353 -724 783 -330 745 -338 777 -312 355 -728 353 -726 353 -756 765 -322 351 -722 345 -770 319 -760 325 -750 791 -320 343 -724 379 -726 335 -746 771 -324 775 -334 745 -340 769 -322 341 -768 741 -322 783 -520 563 -4658 325 -738 777 -318 765 -326 351 -758 347 -724 341 -758 769 -324 775 -332 351 -734 341 -734 773 -324 777 -320 775 -332 355 -724 347 -740 349 -740 777 -296 353 -756 347 -724 375 -724 337 -748 767 -324 349 -732 351 -730 345 -770 743 -324 783 -324 779 -334 745 -340 357 -730 775 -312 791 -508 541 -4664 323 -776 747 -320 767 -328 351 -734 353 -732 353 -766 751 -336 747 -340 357 -730 355 -726 777 -348 755 -310 791 -310 357 -728 355 -726 355 -758 755 -348 319 -758 341 -736 323 -780 319 -744 791 -320 341 -724 377 -724 339 -756 765 -324 775 -332 745 -340 779 -310 343 -764 735 -350 771 -516 527 -4664 345 -760 743 -346 759 -324 349 -752 333 -754 335 -746 767 -324 777 -334 351 -734 341 -734 773 -324 777 -322 775 -332 351 -734 341 -734 347 -754 749 -322 367 -734 351 -732 351 -754 347 -720 785 -314 333 -742 351 -740 361 -752 763 -322 773 -332 751 -334 745 -342 341 -764 739 -332 769 -546 521 -4664 347 -756 745 -346 757 -324 347 -752 333 -754 335 -748 767 -322 777 -332 355 -724 347 -758 741 -328 779 -334 753 -338 351 -732 343 -732 349 -756 753 -322 369 -734 351 -732 343 -736 349 -756 751 -322 371 -734 349 -734 343 -736 775 -324 779 -322 779 -332 745 -338 351 -732 767 -344 765 -512 549 -4650 343 -756 771 -326 769 -320 345 -722 379 -724 339 -744 771 -324 779 -334 349 -736 341 -734 771 -324 779 -322 775 -330 351 -734 343 -732 349 -752 751 -320 369 -734 349 -734 349 -756 333 -732 775 -324 347 -752 333 -746 337 -746 771 -324 777 -332 755 -338 747 -340 353 -732 755 -354 765 -512 543 -4646 351 -744 789 -322 773 -296 387 -724 347 -724 375 -724 771 -324 775 -332 351 -734 341 -736 771 -324 777 -322 775 -332 355 -724 347 -724 377 -736 743 -340 351 -732 343 -734 349 -758 325 -746 795 -288 373 -724 377 -732 351 -732 769 -320 RAW_Data: 765 -354 759 -320 753 -352 335 -736 779 -320 757 -556 533 -4636 359 -734 779 -318 761 -328 349 -756 347 -742 347 -722 773 -326 777 -332 357 -724 349 -756 743 -326 781 -334 747 -338 353 -732 351 -720 383 -718 783 -312 333 -744 353 -740 363 -720 363 -752 763 -322 343 -758 345 -734 351 -732 765 -346 765 -296 801 -320 773 -298 353 -766 745 -338 779 -510 543 -4670 325 -742 777 -320 761 -328 353 -766 355 -722 349 -738 777 -330 747 -338 357 -728 353 -728 777 -348 741 -350 739 -350 355 -722 351 -720 381 -722 781 -314 341 -740 361 -720 363 -754 331 -748 767 -322 347 -732 351 -730 345 -770 743 -324 785 -324 777 -334 747 -338 353 -732 765 -350 769 -498 565 -4652 333 -746 767 -324 777 -334 355 -724 347 -726 377 -724 767 -324 777 -334 351 -734 341 -734 771 -324 779 -322 775 -332 355 -730 355 -732 353 -724 779 -330 351 -734 341 -734 347 -754 323 -742 795 -320 341 -724 379 -724 337 -744 771 -324 777 -334 745 -340 777 -312 357 -728 787 -310 779 -546 511 -4674 325 -738 779 -320 763 -328 353 -732 353 -766 355 -722 779 -328 747 -336 357 -724 349 -758 741 -328 779 -334 747 -340 353 -732 351 -720 383 -716 767 -318 341 -776 333 -748 335 -756 333 -744 769 -324 347 -732 355 -758 355 -722 755 -350 757 -348 741 -350 737 -352 353 -722 765 -354 759 -524 521 -4650 349 -758 751 -322 799 -296 353 -758 349 -724 375 -724 767 -322 775 -334 353 -734 353 -720 765 -344 767 -320 757 -326 351 -734 351 -758 347 -726 773 -326 347 -758 345 -722 339 -758 335 -746 769 -326 347 -734 341 -766 323 -744 781 -320 763 -328 783 -334 749 -338 355 -728 755 -342 779 -512 543 -4670 325 -742 779 -320 761 -328 351 -756 347 -724 377 -726 767 -322 777 -334 355 -732 355 -730 745 -340 757 -338 779 -312 355 -730 353 -726 351 -756 767 -322 351 -724 383 -720 345 -758 325 -740 777 -320 363 -722 341 -758 335 -746 769 -324 777 -334 745 -340 769 -322 341 -766 739 -324 781 -522 563 -4652 317 -778 747 -320 763 -328 353 -732 387 -724 347 -722 775 -326 781 -332 355 -724 347 -724 775 -326 781 -332 747 -340 353 -732 343 -736 353 -754 749 -320 369 -726 375 -724 335 -748 339 -756 767 -322 345 -736 351 -756 345 -724 775 -324 777 -332 753 -336 747 -340 341 -764 739 -330 769 -546 521 -4660 329 -766 777 -320 757 -326 349 -758 347 -724 373 -724 769 -324 777 -332 353 -732 343 -734 777 -326 773 -320 775 -332 355 -722 349 -732 351 -732 765 -346 339 -754 RAW_Data: 321 -744 363 -718 363 -748 765 -324 345 -734 349 -732 345 -768 745 -322 783 -326 779 -332 747 -340 353 -730 769 -352 753 -524 557 -4630 351 -740 755 -322 803 -296 387 -722 347 -724 377 -724 769 -322 779 -332 357 -722 349 -724 773 -326 779 -334 747 -338 353 -732 351 -754 345 -722 783 -312 333 -744 353 -744 363 -718 365 -754 761 -322 343 -736 351 -732 349 -756 751 -352 755 -346 753 -326 773 -322 345 -756 743 -326 781 -534 537 -4638 359 -738 779 -320 759 -326 351 -756 347 -726 341 -746 771 -326 777 -334 351 -734 341 -734 777 -324 777 -320 773 -332 355 -732 355 -730 355 -728 777 -310 357 -728 353 -758 341 -732 347 -752 751 -322 367 -724 375 -712 375 -724 767 -324 779 -332 753 -336 747 -342 353 -732 765 -344 763 -516 543 -4650 351 -756 753 -352 753 -314 333 -748 351 -744 361 -752 761 -320 773 -332 355 -724 347 -724 777 -326 781 -332 747 -338 351 -732 343 -734 349 -758 751 -322 371 -724 377 -722 335 -746 339 -746 773 -324 349 -734 353 -734 353 -756 743 -328 781 -336 747 -340 757 -340 355 -730 757 -340 769 -516 549 -4642 353 -758 755 -320 767 -330 353 -758 347 -726 339 -748 771 -324 779 -334 353 -732 343 -732 773 -324 777 -322 775 -332 355 -730 355 -724 349 -758 743 -324 351 -758 347 -724 339 -748 373 -736 747 -336 357 -726 357 -726 355 -726 797 -324 755 -320 783 -316 767 -320 367 -724 773 -326 781 -530 535 -4632 359 -738 781 -318 761 -328 351 -734 387 -724 347 -726 773 -326 779 -332 355 -730 355 -732 745 -342 777 -312 777 -314 357 -726 353 -758 353 -718 789 -322 353 -720 343 -734 349 -760 355 -718 791 -320 343 -724 377 -726 339 -748 771 -324 781 -330 747 -338 777 -312 343 -766 745 -348 757 -514 543 -4678 347 -716 769 -346 757 -324 347 -746 337 -760 333 -758 763 -320 775 -330 357 -730 355 -730 747 -342 777 -310 777 -348 319 -758 341 -734 347 -752 749 -320 371 -722 377 -724 337 -756 333 -748 767 -324 347 -734 349 -732 345 -766 775 -320 755 -328 783 -332 747 -338 357 -730 779 -310 779 -512 543 -4642 359 -738 779 -318 763 -328 351 -734 353 -734 353 -764 747 -336 757 -338 355 -728 355 -726 789 -310 769 -350 733 -342 339 -758 323 -744 363 -746 765 -322 345 -756 345 -742 345 -742 345 -742 743 -328 351 -764 319 -764 353 -728 751 -340 777 -346 739 -346 737 -352 351 -722 767 -350 755 -89978 97 -228 99 -392 97 -364 131 -364 261 -98 491 -198 265 -200 595 -166 2189 -134 1781 -98 131 -66 RAW_Data: 4895 -3912 129 -1214 65 -132 99 -266 131 -232 201 -200 65 -100 199 -166 265 -100 263 -998 165 -198 97 -298 329 -198 563 -870 99 -166 299 -332 231 -98 163 -98 99 -164 591 -66 1607 -98 327 -11988 65 -134 131 -162 193 -1974 97 -1982 65 -300 265 -230 493 -66 99 -17484 65 -458 165 -362 99 -664 131 -1126 99 -100 99 -168 431 -98 133 -498 197 -66 2277 -100 133 -66 533 -8150 97 -328 97 -100 291 -98 1015 -96 3367 -168 133 -100 1163 -66 667 -66 393 -66 425 -66 5567 -7622 659 -366 199 -330 361 -66 129 -494 131 -264 367 -334 165 -1022 165 -66 133 -166 199 -432 595 -66 131 -98 1363 -6728 65 -2332 65 -7664 99 -1682 99 -196 163 -924 65 -330 65 -196 589 -132 229 -228 229 -198 1909 -100 1477 -66 701 -66 5773 -4316 163 -232 131 -194 65 -392 229 -458 165 -1216 461 -562 263 -462 131 -166 97 -528 97 -394 131 -558 367 -100 233 -68 133 -366 167 -166 267 -66 333 -132 2219 -168 431 -100 1461 -66 1433 -100 5641 -4648 65 -802 97 -794 65 -2290 133 -266 167 -100 165 -334 365 -134 263 -168 65 -266 67 -132 365 -100 599 -168 297 -98 567 -66 331 -198 65 -100 599 -100 1065 -100 5343 -4728 99 -1760 165 -1430 165 -198 99 -202 299 -294 197 -198 129 -64 131 -328 229 -100 357 -464 197 -100 565 -134 133 -102 401 -134 601 -164 129 -66 895 -168 397 -198 397 -100 197 -68 9979 -3582 65 -300 99 -400 63 -694 131 -798 133 -898 167 -200 131 -134 229 -264 197 -360 65 -264 97 -100 763 -100 295 -166 867 -68 65 -132 559 -12458 65 -2028 97 -132 163 -166 129 -100 195 -262 97 -296 263 -130 991 -66 1361 -134 661 -66 361 -66 197 -1088 167 -336 65 -366 65 -794 165 -68 133 -100 131 -266 133 -100 65 -198 135 -366 65 -198 729 -68 995 -100 397 -134 97 -132 363 -232 431 -64 1573 -4672 63 -8966 99 -464 197 -828 165 -602 131 -360 295 -164 63 -66 625 -398 197 -100 2475 -66 367 -132 133 -100 6651 -4462 99 -3092 101 -100 99 -234 99 -198 233 -66 165 -300 165 -132 65 -100 99 -264 65 -598 429 -2318 399 -200 67 -198 133 -166 199 -164 65 -132 165 -98 263 -64 2613 -166 697 -66 6631 -6580 131 -890 65 -66 165 -166 165 -300 133 -368 265 -726 65 -98 161 -164 97 -296 131 -98 131 -988 65 -232 201 -132 165 -100 165 -300 229 -100 261 -268 1459 -132 1575 -364 461 -132 297 -332 8997 -9896 229 -134 265 -164 267 -300 299 -300 763 -134 1933 -100 465 -100 431 -98 199 -134 6761 -2074 65 -3566 65 -132 195 -166 RAW_Data: 133 -462 67 -166 99 -100 265 -100 131 -364 925 -132 763 -700 231 -856 165 -100 299 -164 631 -166 231 -132 429 -134 463 -66 4979 -4996 165 -430 165 -502 99 -132 97 -1160 457 -100 261 -296 131 -134 201 -98 99 -100 363 -200 361 -134 363 -198 131 -1496 67 -264 329 -360 327 -132 163 -264 985 -68 565 -66 429 -66 263 -130 229 -134 8225 -200 101 -136 101 -368 265 -330 65 -598 195 -304 169 -268 101 -696 99 -1484 67 -1952 99 -1386 165 -66 233 -134 101 -164 65 -364 65 -298 2491 -132 367 -100 1295 -66 6535 -5946 65 -1186 97 -298 623 -426 99 -66 99 -66 559 -134 133 -168 331 -200 133 -132 133 -462 459 -1088 65 -264 131 -164 65 -98 493 -98 97 -198 723 -134 1283 -64 819 -66 459 -66 621 -14282 65 -398 97 -396 97 -366 131 -162 99 -602 165 -66 369 -134 363 -100 561 -134 1261 -100 99 -134 831 -132 8053 -3428 65 -2474 65 -1484 265 -196 131 -98 197 -230 225 -196 97 -232 65 -234 795 -232 397 -234 335 -100 1425 -66 329 -68 527 -134 595 -100 165 -68 165 -200 329 -66 233 -68 889 -64 6761 -1518 97 -5252 133 -1660 65 -528 131 -292 97 -66 165 -66 293 -98 329 -164 97 -130 97 -260 627 -68 1533 -132 867 -132 5585 -6044 97 -1858 99 -132 65 -264 229 -198 97 -924 131 -2698 65 -362 527 -66 263 -100 963 -164 231 -132 295 -166 1093 -66 167 -100 635 -100 165 -68 133 -168 495 -100 299 -100 4855 -6142 65 -1458 97 -134 135 -66 267 -598 131 -168 201 -266 165 -66 133 -232 593 -68 131 -200 97 -198 553 -200 597 -66 1261 -132 2119 -66 199 -168 199 -230 1975 -4282 65 -8382 63 -3286 65 -460 65 -164 97 -100 97 -198 293 -198 63 -326 361 -164 297 -198 1985 -166 297 -100 431 -200 233 -66 65 -68 329 -168 8161 -5090 99 -64 97 -398 67 -2510 263 -1116 65 -230 161 -66 689 -130 129 -132 131 -426 3359 -98 3431 -8782 97 -930 67 -920 97 -786 565 -198 163 -66 461 -198 3347 -164 231 -11298 419 -750 715 -378 721 -360 317 -774 333 -774 305 -782 735 -360 745 -336 315 -768 313 -772 747 -360 741 -356 735 -362 317 -752 347 -752 345 -750 739 -328 347 -756 345 -754 345 -718 339 -772 743 -338 349 -734 349 -754 345 -756 749 -334 737 -354 753 -326 775 -336 347 -736 769 -344 733 -554 507 -4680 351 -722 761 -354 757 -352 317 -760 325 -740 351 -742 757 -354 739 -362 319 -756 347 -756 741 -326 779 -334 745 -340 355 -726 353 -758 319 -758 767 -318 353 -758 311 -754 345 -758 325 -740 777 -322 363 -722 RAW_Data: 337 -756 337 -756 767 -322 775 -332 747 -338 777 -310 355 -760 739 -350 735 -550 547 -4640 353 -750 751 -320 767 -328 353 -758 347 -724 339 -758 767 -322 777 -332 351 -734 341 -734 773 -324 777 -322 773 -332 355 -732 355 -730 355 -728 753 -338 357 -728 355 -724 355 -758 355 -722 765 -320 351 -754 313 -768 319 -766 753 -352 769 -330 747 -336 779 -310 357 -726 779 -332 747 -540 537 -4670 323 -740 779 -320 761 -328 351 -758 347 -724 375 -724 769 -322 775 -332 351 -734 343 -732 771 -326 777 -322 775 -330 357 -722 347 -726 377 -734 745 -338 353 -732 343 -734 349 -756 325 -744 795 -320 341 -726 377 -724 339 -756 765 -322 777 -332 747 -338 777 -310 343 -764 771 -296 769 -548 521 -4660 329 -768 777 -316 759 -326 351 -758 347 -740 347 -726 771 -324 779 -334 355 -722 349 -724 775 -326 777 -334 747 -340 353 -732 343 -736 351 -756 751 -322 367 -736 351 -732 343 -736 353 -754 751 -322 367 -744 347 -724 339 -746 771 -324 777 -334 745 -340 769 -320 353 -752 769 -314 787 -518 545 -4642 351 -722 789 -310 765 -318 355 -754 337 -758 335 -746 769 -324 775 -334 353 -724 349 -724 773 -326 779 -336 755 -336 353 -732 343 -734 353 -752 753 -320 367 -722 343 -758 337 -746 337 -758 765 -322 345 -756 347 -724 339 -756 767 -324 775 -334 745 -338 777 -312 343 -764 769 -296 769 -548 523 -4650 347 -744 779 -320 763 -330 351 -758 347 -724 341 -758 767 -324 777 -330 351 -734 341 -736 777 -324 775 -320 773 -332 355 -730 357 -722 347 -726 773 -328 349 -756 347 -722 339 -746 375 -734 747 -338 357 -728 353 -728 353 -758 765 -322 757 -352 753 -314 785 -316 345 -752 765 -322 775 -530 535 -4634 359 -736 781 -320 759 -326 351 -756 347 -726 339 -758 769 -324 775 -334 351 -734 341 -734 777 -326 775 -320 773 -298 389 -730 355 -724 347 -722 775 -326 349 -758 345 -724 341 -744 375 -712 773 -324 349 -758 347 -724 339 -756 769 -322 775 -332 745 -340 769 -320 351 -752 771 -314 753 -554 513 -4672 343 -732 771 -318 783 -324 349 -756 347 -724 339 -746 771 -326 775 -336 351 -734 341 -734 777 -326 773 -324 775 -330 355 -724 347 -724 377 -722 767 -324 347 -734 353 -760 353 -722 351 -722 791 -322 351 -720 349 -740 351 -742 757 -352 773 -296 781 -334 755 -338 355 -728 777 -312 777 -544 513 -4674 325 -742 779 -320 759 -328 353 -756 347 -724 341 -758 767 -324 777 -332 357 -730 355 -730 747 -340 781 -310 757 -340 353 -732 343 -738 RAW_Data: 351 -754 753 -320 369 -724 341 -770 351 -734 341 -732 771 -324 345 -752 333 -748 337 -746 769 -324 777 -332 747 -338 755 -340 353 -732 765 -354 761 -524 515 -4676 319 -764 755 -322 767 -330 351 -758 347 -724 341 -746 773 -324 779 -332 353 -734 343 -732 769 -318 783 -324 779 -332 351 -734 341 -734 347 -754 753 -320 365 -744 347 -724 339 -748 337 -746 773 -324 349 -758 347 -724 339 -744 771 -326 777 -332 745 -340 769 -320 343 -766 741 -322 783 -554 529 -4624 349 -744 779 -320 761 -328 353 -758 347 -724 341 -756 769 -324 775 -334 355 -722 349 -756 741 -326 779 -334 747 -338 353 -732 343 -734 353 -756 751 -322 369 -724 341 -758 337 -746 337 -748 769 -324 349 -732 341 -768 325 -742 781 -322 759 -328 783 -334 747 -338 357 -728 777 -346 755 -510 543 -4664 323 -778 747 -320 763 -330 351 -758 347 -724 339 -746 773 -324 779 -336 351 -734 341 -734 771 -324 777 -324 775 -332 355 -724 347 -724 377 -724 769 -324 347 -756 345 -734 351 -732 343 -732 773 -316 353 -754 337 -746 337 -756 767 -324 777 -334 745 -340 755 -338 353 -732 767 -342 767 -512 549 -4654 345 -754 769 -296 803 -320 341 -724 379 -724 337 -746 769 -326 777 -332 353 -734 341 -732 775 -324 779 -322 773 -332 351 -734 341 -736 323 -780 753 -320 367 -722 375 -722 337 -746 339 -768 747 -336 353 -732 343 -732 351 -754 753 -320 801 -330 745 -338 777 -310 341 -764 767 -318 775 -516 525 -4682 315 -780 749 -320 767 -328 351 -732 353 -758 347 -740 777 -330 749 -336 357 -730 355 -726 779 -310 791 -310 777 -312 357 -726 353 -756 353 -720 765 -354 333 -736 351 -738 359 -716 363 -754 765 -322 343 -724 379 -732 351 -732 767 -314 799 -296 767 -322 801 -296 383 -734 767 -316 763 -522 539 -4680 341 -734 775 -326 773 -322 345 -722 377 -726 337 -756 769 -322 775 -332 351 -736 353 -718 767 -344 765 -320 761 -326 349 -758 347 -740 347 -726 771 -326 347 -758 345 -724 339 -746 375 -734 747 -338 353 -732 341 -734 349 -758 751 -322 767 -330 779 -336 779 -308 357 -726 779 -334 747 -538 539 -4662 317 -780 749 -320 765 -328 353 -732 389 -722 347 -724 775 -326 777 -334 355 -730 355 -724 779 -330 747 -338 777 -310 343 -732 349 -746 353 -740 759 -320 373 -736 349 -734 343 -734 349 -758 755 -320 371 -734 349 -732 343 -760 773 -296 769 -322 801 -328 747 -336 357 -724 781 -332 747 -536 539 -4662 323 -744 781 -318 763 -328 353 -758 347 -726 339 -756 767 -324 RAW_Data: 777 -334 349 -734 343 -734 777 -326 773 -320 773 -330 355 -724 347 -724 379 -722 769 -324 347 -756 345 -734 351 -732 343 -734 777 -324 347 -752 333 -746 337 -746 769 -326 777 -334 755 -336 779 -308 343 -732 783 -346 755 -514 543 -4646 349 -754 751 -350 753 -346 331 -758 323 -744 361 -754 763 -320 775 -296 389 -732 355 -722 777 -330 747 -336 755 -338 353 -732 351 -720 383 -716 771 -346 329 -756 319 -742 363 -718 365 -752 765 -322 343 -756 347 -732 351 -732 769 -310 799 -316 755 -326 777 -334 353 -732 767 -316 761 -552 545 -4640 345 -732 771 -324 781 -324 347 -758 345 -722 341 -756 767 -326 775 -334 351 -734 341 -736 775 -326 773 -322 771 -332 355 -732 355 -724 349 -724 775 -326 349 -756 345 -724 339 -746 375 -736 745 -338 357 -728 353 -726 353 -758 765 -322 755 -352 753 -348 749 -318 347 -752 765 -322 775 -530 537 -4632 359 -738 779 -320 759 -328 353 -756 347 -726 339 -758 767 -322 777 -334 351 -734 341 -734 771 -318 779 -324 777 -332 357 -730 355 -730 357 -724 777 -332 349 -734 341 -734 323 -782 321 -742 793 -290 373 -722 379 -734 355 -730 747 -340 777 -310 777 -350 739 -348 319 -760 769 -322 767 -520 553 -4646 323 -778 749 -320 767 -328 351 -758 347 -726 339 -756 769 -324 775 -332 353 -734 341 -734 773 -326 775 -322 775 -300 353 -764 309 -766 347 -752 749 -322 367 -722 341 -746 375 -736 351 -732 767 -318 341 -742 353 -738 327 -778 761 -322 773 -332 747 -338 777 -310 355 -728 779 -348 739 -550 511 -4674 323 -746 779 -320 763 -330 351 -758 347 -740 347 -742 743 -330 781 -334 357 -730 357 -728 751 -340 755 -340 769 -318 343 -766 317 -760 325 -778 759 -322 343 -734 351 -732 345 -766 317 -760 755 -322 369 -736 351 -732 353 -756 757 -322 755 -352 753 -346 755 -326 343 -750 767 -322 771 -530 537 -4664 325 -740 777 -320 761 -328 351 -758 347 -726 341 -756 767 -324 777 -332 351 -734 341 -736 775 -326 775 -320 773 -330 351 -734 341 -736 323 -780 749 -320 367 -724 375 -722 337 -744 339 -746 771 -326 347 -758 345 -722 373 -726 767 -324 775 -332 753 -338 745 -340 353 -732 765 -352 753 -526 553 -4646 355 -730 753 -340 779 -312 357 -726 353 -726 353 -758 765 -322 765 -356 317 -758 345 -722 781 -346 755 -326 771 -320 345 -724 377 -726 337 -746 769 -326 347 -732 355 -758 355 -722 351 -754 757 -310 343 -760 325 -746 363 -752 763 -322 771 -332 753 -336 747 -338 353 -732 767 -344 763 -514 RAW_Data: 541 -4674 313 -768 779 -320 755 -324 349 -734 353 -758 347 -722 773 -326 777 -334 351 -734 341 -734 773 -324 777 -320 775 -332 355 -724 347 -724 379 -732 747 -340 353 -732 343 -732 349 -760 323 -746 795 -290 373 -724 377 -724 337 -746 769 -324 777 -332 747 -338 769 -320 341 -766 743 -322 783 -522 561 -4630 359 -736 777 -320 757 -328 351 -758 347 -724 341 -758 767 -324 779 -300 383 -734 341 -734 779 -296 803 -320 773 -298 387 -724 347 -740 347 -726 775 -322 349 -756 345 -742 347 -724 341 -756 769 -324 345 -724 377 -736 351 -732 765 -312 797 -320 753 -326 777 -334 353 -732 765 -316 761 -536 541 -4648 345 -766 775 -290 785 -324 349 -758 347 -726 339 -746 771 -324 779 -332 353 -730 343 -734 777 -324 777 -322 775 -332 355 -730 357 -724 347 -724 773 -328 349 -758 347 -734 351 -732 343 -732 777 -324 347 -754 335 -758 333 -748 765 -322 775 -332 745 -340 757 -340 355 -728 779 -312 777 -548 511 -4672 323 -742 781 -320 761 -328 387 -698 387 -698 389 -722 781 -296 781 -336 357 -726 349 -732 779 -312 767 -356 759 -322 351 -722 359 -736 351 -740 755 -320 373 -726 375 -726 337 -754 333 -748 767 -324 347 -724 379 -724 339 -758 765 -322 779 -332 745 -340 777 -310 357 -728 775 -348 757 -512 545 -4640 359 -738 779 -320 759 -328 353 -756 347 -726 375 -726 765 -324 777 -300 389 -722 347 -726 775 -324 779 -332 747 -338 353 -730 345 -734 351 -754 753 -322 369 -734 351 -732 343 -728 349 -744 781 -320 365 -726 339 -758 335 -748 769 -324 777 -332 745 -340 779 -312 357 -730 777 -310 795 -510 541 -4666 315 -746 783 -320 763 -326 355 -758 347 -726 339 -748 769 -326 777 -334 353 -730 343 -732 773 -324 779 -322 777 -298 389 -724 347 -726 375 -724 767 -324 347 -724 379 -724 339 -746 339 -760 765 -324 345 -724 377 -726 339 -758 765 -322 777 -332 747 -338 779 -310 341 -734 771 -346 757 -546 543 -4620 383 -716 769 -346 757 -324 345 -752 333 -750 335 -758 765 -320 775 -332 353 -724 349 -756 741 -328 777 -334 753 -338 351 -732 343 -732 349 -756 751 -322 369 -724 341 -746 375 -736 349 -734 769 -322 351 -720 345 -734 349 -762 755 -322 767 -328 781 -334 747 -342 357 -728 777 -346 741 -548 511 -4670 323 -744 779 -320 763 -330 351 -758 349 -724 339 -758 767 -324 775 -330 353 -732 341 -736 769 -324 779 -320 777 -330 357 -724 347 -740 347 -724 775 -324 347 -756 345 -724 341 -744 341 -770 743 -338 353 -732 343 -734 RAW_Data: 349 -758 753 -320 767 -360 747 -336 777 -308 357 -726 789 -312 777 -79086 67 -500 65 -496 63 -458 131 -856 133 -438 131 -202 99 -398 263 -328 195 -198 363 -100 395 -100 961 -66 393 -132 365 -102 199 -66 5167 -4206 99 -640 99 -726 65 -1814 293 -98 163 -98 97 -164 327 -64 259 -132 231 -428 97 -232 197 -134 65 -398 197 -1124 99 -462 465 -68 397 -132 303 -66 665 -66 3199 -66 1825 -5202 65 -8960 231 -460 131 -396 97 -166 99 -132 133 -330 99 -328 425 -166 133 -100 199 -68 131 -168 133 -66 3381 -66 13735 -270 199 -134 99 -166 133 -302 1029 -100 165 -200 201 -198 301 -132 1467 -66 501 -68 367 -168 1925 -66 495 -98 299 -66 455 -262 5365 -6980 65 -66 129 -462 65 -130 97 -98 327 -394 65 -98 359 -232 97 -330 295 -430 365 -2796 263 -134 199 -198 291 -164 3701 -66 9467 -9052 99 -802 329 -200 197 -64 129 -294 131 -300 891 -266 133 -166 329 -102 99 -132 2173 -64 161 -98 6545 -8052 129 -562 429 -100 563 -168 335 -134 133 -98 133 -232 363 -66 299 -66 1129 -164 397 -464 561 -68 795 -100 1687 -13310 133 -1490 101 -170 231 -66 199 -66 197 -134 65 -334 365 -134 297 -66 959 -100 293 -198 795 -362 231 -100 365 -166 365 -100 4957 -7546 231 -268 397 -232 131 -398 231 -730 65 -434 199 -1492 65 -728 65 -528 97 -164 229 -66 131 -64 197 -132 391 -164 2959 -66 65 -12414 65 -1126 65 -534 67 -400 231 -366 99 -134 65 -166 67 -166 167 -166 167 -298 335 -232 299 -66 1697 -66 233 -134 67 -166 529 -100 67 -66 7763 -728 99 -932 99 -1296 197 -100 99 -630 65 -794 165 -634 165 -130 97 -198 199 -132 133 -198 99 -262 2175 -66 97 -132 1645 -164 563 -12852 131 -1032 67 -1730 99 -166 199 -236 99 -300 263 -196 293 -198 357 -66 1263 -100 1363 -98 725 -134 231 -66 627 -66 5743 -4102 263 -230 131 -262 131 -66 67 -198 99 -498 165 -364 131 -1000 263 -100 101 -464 197 -198 399 -98 1029 -166 133 -198 99 -300 131 -100 199 -432 99 -230 1829 -66 429 -134 131 -66 131 -230 133 -394 395 -196 397 -3828 63 -960 65 -458 197 -198 129 -1480 97 -1948 97 -428 195 -66 229 -426 197 -426 1185 -64 1181 -132 633 -166 363 -170 167 -66 329 -232 4851 -4466 67 -930 65 -434 165 -268 65 -166 133 -234 133 -330 261 -132 199 -68 99 -134 99 -68 65 -234 99 -2214 63 -132 361 -164 297 -98 227 -456 163 -130 127 -228 397 -13124 131 -3210 365 -722 163 -360 97 -362 427 -66 395 -66 163 -132 6621 -9772 RAW_Data: 231 -332 265 -132 665 -66 531 -232 693 -66 363 -66 1253 -132 621 -428 599 -98 7479 -6028 99 -296 97 -654 99 -724 97 -328 97 -98 435 -166 295 -264 129 -132 589 -66 627 -66 397 -98 199 -66 199 -1528 297 -6504 63 -900 65 -1130 133 -166 663 -398 395 -298 131 -100 599 -98 67 -66 695 -166 403 -164 1807 -200 4679 -3774 131 -130 99 -98 457 -2774 231 -396 525 -262 197 -294 97 -68 163 -134 331 -298 365 -166 99 -634 99 -362 165 -1196 163 -166 231 -98 267 -132 197 -300 2521 -100 895 -100 401 -134 503 -12428 163 -362 231 -396 165 -166 199 -66 99 -232 167 -134 197 -100 99 -330 365 -168 1927 -334 231 -198 495 -66 8407 -5784 229 -1188 163 -492 65 -336 99 -602 99 -100 365 -200 431 -334 331 -100 1791 -134 397 -132 65 -166 359 -66 297 -100 465 -68 1097 -4396 67 -564 431 -298 99 -132 429 -198 1053 -66 327 -98 723 -12552 65 -1232 199 -864 131 -1890 99 -132 133 -134 99 -66 233 -100 165 -628 65 -132 2857 -66 295 -166 631 -100 197 -100 4333 -1082 131 -1476 359 -366 97 -166 99 -100 231 -166 861 -100 529 -98 863 -200 99 -102 99 -132 493 -132 325 -100 8365 -2990 65 -302 133 -964 97 -1100 65 -266 867 -166 99 -100 131 -134 565 -166 695 -100 901 -100 497 -66 401 -12558 63 -830 99 -100 131 -694 99 -498 129 -200 99 -402 99 -266 231 -66 199 -134 65 -200 99 -132 133 -68 167 -166 67 -168 599 -202 1633 -66 723 -100 1547 -64 7133 -5950 97 -522 97 -428 97 -554 65 -2048 133 -132 363 -66 297 -234 2847 -164 791 -132 301 -3286 131 -6472 99 -364 99 -1096 199 -590 65 -362 131 -66 133 -134 299 -98 369 -66 2063 -166 99 -132 599 -100 7507 -8234 199 -232 97 -168 201 -530 229 -132 163 -66 427 -68 165 -100 1981 -66 463 -100 65 -166 1017 -132 6219 -6002 131 -64 165 -428 199 -432 131 -530 133 -200 67 -11500 65 -6344 65 -1958 165 -100 97 -664 65 -334 99 -730 331 -236 367 -168 329 -200 395 -66 131 -98 527 -68 99 -132 1493 -66 197 -14856 199 -1364 197 -132 165 -366 163 -234 65 -98 131 -428 65 -98 65 -232 2273 -164 553 -392 6131 -6662 233 -832 231 -432 63 -1328 263 -300 131 -866 197 -926 65 -166 65 -232 227 -98 263 -198 131 -164 65 -166 791 -100 525 -98 361 -198 365 -132 859 -66 329 -228 529 -7030 131 -620 97 -164 163 -132 131 -66 195 -100 163 -394 229 -262 131 -66 131 -198 527 -100 133 -400 133 -166 99 -1232 65 -134 197 -66 131 -232 431 -596 131 -166 2673 -134 295 -166 RAW_Data: 5357 -11284 99 -1290 65 -134 1501 -200 263 -100 325 -132 399 -166 1997 -15232 131 -1320 99 -168 65 -466 65 -134 65 -100 165 -98 97 -196 425 -134 331 -132 1491 -168 395 -134 299 -100 1519 -12916 99 -998 197 -794 131 -1654 165 -100 97 -362 163 -66 163 -230 231 -434 497 -100 1499 -100 1495 -166 65 -298 229 -5848 99 -134 99 -8920 133 -1126 131 -234 231 -134 265 -66 131 -134 365 -166 829 -100 1793 -134 395 -12288 97 -2094 65 -430 65 -268 65 -400 65 -232 335 -166 199 -132 231 -100 2191 -100 929 -15146 299 -230 129 -788 591 -100 231 -100 165 -66 431 -100 65 -100 65 -166 133 -264 199 -134 595 -100 397 -132 927 -68 435 -166 267 -232 65 -166 99 -68 7469 -3932 99 -360 231 -2184 131 -166 293 -200 229 -262 99 -1020 65 -656 261 -66 229 -132 163 -66 97 -760 1663 -66 233 -166 397 -100 329 -132 955 -166 491 -14812 167 -1052 163 -528 131 -132 227 -66 659 -66 367 -100 2749 -68 1595 -66 10545 -1162 67 -3130 131 -1224 131 -66 99 -230 199 -166 529 -662 299 -18024 131 -298 201 -366 131 -100 65 -166 333 -166 65 -132 297 -164 395 -392 131 -166 9295 -9924 133 -1430 133 -334 397 -134 131 -68 65 -100 331 -100 197 -200 691 -166 329 -13826 131 -1978 131 -66 531 -66 265 -268 165 -136 165 -100 263 -166 467 -66 365 -102 467 -166 631 -136 67 -696 133 -396 97 -758 165 -3180 131 -362 163 -132 63 -164 461 -164 229 -164 197 -296 2399 -194 293 -13158 131 -1494 231 -524 327 -198 97 -394 297 -68 2025 -66 227 -296 365 -13564 65 -1380 131 -954 67 -658 429 -166 195 -66 65 -98 163 -130 823 -100 99 -64 757 -66 131 -98 99 -64 165 -132 11025 -21882 65 -1816 65 -822 229 -326 163 -100 723 -264 427 -66 329 -98 985 -68 1827 -66 133 -168 401 -98 301 -132 399 -100 1725 -4022 65 -1726 67 -732 99 -1070 99 -198 65 -494 197 -298 165 -100 131 -66 823 -134 299 -166 363 -102 363 -66 823 -132 7641 -4542 65 -834 65 -1220 67 -1164 133 -562 65 -698 67 -464 197 -736 263 -134 231 -332 99 -302 131 -264 361 -164 1245 -66 65 -66 395 -130 161 -98 65 -12312 65 -1324 65 -572 67 -166 101 -202 65 -702 395 -198 401 -100 333 -68 331 -66 133 -132 1281 -68 367 -132 433 -132 99 -66 8729 -2158 65 -3984 65 -1562 265 -166 161 -194 165 -132 497 -300 1055 -166 425 -100 599 -134 991 -66 6793 -5222 99 -1602 65 -328 129 -132 291 -330 99 -228 97 -196 97 -98 297 -624 297 -1186 165 -502 165 -498 97 -1086 525 -230 261 -292 199 -298 RAW_Data: 2443 -100 8837 -7844 99 -300 101 -3474 65 -426 131 -786 131 -66 261 -66 131 -132 623 -198 431 -98 3805 -64 163 -132 4689 -2290 65 -5964 129 -996 197 -2760 165 -230 395 -300 263 -234 301 -166 2423 -68 367 -200 197 -134 429 -66 131 -100 231 -100 1455 -100 7041 -260 63 -2606 163 -262 97 -164 261 -166 161 -130 493 -200 799 -132 525 -132 129 -1222 97 -918 919 -68 65 -264 165 -168 3119 -64 97 -98 265 -66 293 -66 9961 -3892 97 -168 461 -362 165 -438 267 -100 531 -134 1659 -168 167 -66 101 -762 99 -330 231 -8514 65 -4398 99 -1312 99 -130 163 -294 163 -822 197 -270 429 -100 461 -66 329 -130 295 -330 829 -66 1461 -66 629 -66 233 -168 593 -66 13101 -102 133 -232 1405 -198 327 -296 331 -100 197 -200 365 -66 369 -98 1419 -230 527 -66 529 -302 5013 -3942 99 -1150 165 -298 65 -296 197 -822 133 -528 97 -230 163 -762 99 -666 65 -432 265 -332 201 -66 431 -198 267 -132 2459 -132 403 -100 1359 -68 7933 -3998 67 -4454 131 -198 97 -132 131 -198 295 -162 329 -298 1189 -132 327 -366 435 -66 503 -66 983 -132 4845 -5250 131 -132 133 -98 165 -134 101 -300 233 -332 231 -66 99 -132 99 -132 335 -198 165 -366 131 -1060 197 -402 99 -132 197 -168 67 -266 629 -330 65 -134 131 -336 721 -100 1501 -132 731 -66 1127 -132 5451 -4352 131 -854 163 -296 165 -432 99 -396 493 -132 131 -294 163 -1052 131 -14776 65 -5234 65 -164 129 -852 65 -98 131 -66 165 -164 97 -330 429 -66 165 -432 329 -98 491 -100 857 -198 889 -164 329 -66 295 -806 65 -722 99 -3564 199 -864 397 -400 231 -98 367 -100 797 -164 395 -98 393 -166 6901 -1552 65 -530 165 -66 99 -1186 65 -394 131 -198 99 -366 165 -198 99 -404 99 -2092 261 -264 331 -132 231 -360 297 -234 331 -64 2139 -100 399 -13226 99 -2394 65 -502 63 -394 163 -260 65 -66 131 -198 229 -132 99 -132 297 -296 263 -196 987 -132 265 -198 163 -12344 99 -696 65 -1292 65 -198 99 -894 163 -68 431 -102 65 -102 231 -166 199 -64 263 -164 359 -66 2025 -130 327 -98 11033 -788 99 -2174 65 -722 97 -100 163 -66 263 -362 789 -100 2493 -100 299 -200 7351 -4204 65 -1286 67 -1766 67 -566 99 -266 65 -200 67 -930 97 -134 429 -100 99 -132 65 -198 229 -262 163 -460 789 -98 361 -130 259 -66 657 -134 491 -166 197 -164 163 -166 5757 -6452 65 -864 65 -368 395 -230 165 -468 99 -796 133 -166 99 -134 101 -828 131 -600 163 -560 197 -328 263 -200 295 -66 97 -294 97 -198 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/gangqi.sub ================================================ Filetype: Flipper SubGhz Key File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: GangQi Bit: 34 Key: 00 00 00 02 9D DB 77 38 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/gangqi_raw.sub ================================================ Filetype: Flipper SubGhz RAW File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: RAW RAW_Data: 1223 -572304 1675 -132 1183 -536 465 -1214 1203 -502 489 -1210 509 -1202 1171 -518 1175 -522 1189 -508 489 -1176 1229 -504 1177 -520 1205 -482 479 -1232 1203 -478 1233 -486 481 -1216 1197 -480 1221 -486 505 -1182 1241 -486 1175 -482 1245 -484 505 -1218 1185 -498 1211 -490 1185 -482 545 -1174 511 -1206 1177 -516 1189 -516 1165 -508 521 -1184 503 -1232 477 -2210 1171 -510 473 -1232 1183 -514 517 -1174 513 -1194 1209 -478 1219 -486 1191 -492 513 -1204 1199 -532 1159 -500 1237 -486 481 -1206 1209 -480 1203 -480 535 -1198 1189 -496 1187 -520 483 -1230 1175 -478 1219 -506 1199 -510 505 -1180 1231 -496 1179 -486 1211 -482 517 -1214 501 -1182 1199 -508 1179 -502 1205 -516 477 -1240 473 -1206 477 -2200 1231 -478 485 -1222 1189 -520 463 -1202 515 -1208 1199 -494 1207 -486 1209 -516 483 -1182 1217 -488 1197 -534 1159 -520 481 -1234 1179 -478 1219 -486 505 -1216 1183 -506 1201 -510 491 -1174 1229 -506 1177 -542 1185 -496 483 -1208 1195 -502 1213 -490 1169 -528 493 -1208 475 -1242 1171 -482 1235 -484 1181 -542 499 -1180 473 -1242 479 -2204 1201 -490 475 -1248 1177 -488 515 -1206 489 -1236 1153 -520 1215 -480 1175 -514 531 -1192 1167 -538 1195 -484 1215 -482 515 -1176 1207 -512 1165 -548 477 -1184 1233 -478 1187 -520 519 -1174 1185 -536 1191 -474 1231 -478 493 -1212 1203 -492 1177 -544 1179 -480 487 -1250 497 -1176 1197 -496 1211 -486 1211 -480 517 -1214 501 -1178 507 -2208 1209 -486 507 -1182 1197 -526 483 -1204 507 -1198 1187 -508 1183 -506 1217 -490 475 -1244 1175 -486 1237 -484 1181 -492 547 -1176 1167 -528 1185 -520 485 -1232 1175 -478 1223 -486 519 -1216 1169 -520 1203 -482 1197 -480 493 -1242 1167 -504 1217 -490 1201 -518 489 -1176 519 -1210 1175 -514 1191 -486 1213 -518 489 -1176 505 -1214 515 -2198 1167 -506 541 -1174 1175 -520 505 -1184 505 -1216 1183 -504 1211 -490 1199 -530 495 -1178 1199 -494 1205 -484 1207 -514 479 -1200 1203 -516 1175 -512 507 -1184 1227 -498 1181 -486 515 -1204 1185 -532 1159 -504 1231 -478 493 -1210 1215 -486 1171 -544 1173 -512 475 -1216 513 -1194 1185 -510 1181 -520 1185 -514 483 -1216 513 -1158 531 -2174 1243 -486 499 -1176 1217 -490 479 -1236 505 -1184 1203 -522 1181 -484 1213 -502 485 -1206 1197 -500 1213 -490 1197 -498 515 -1180 1197 -532 1161 -502 511 -1202 1201 -482 1225 -476 485 -1248 1191 -486 1211 -482 1207 -484 537 -1196 1179 -516 1179 -506 1199 -508 489 -1172 545 -1178 1201 -520 1179 -488 1215 -494 515 -1170 513 -1204 481 -2238 1157 -520 519 -1176 1183 -540 499 -1178 473 -1236 1179 -520 1209 -480 1175 -552 475 -1188 1225 -502 1177 -488 1207 -510 473 -1232 1207 -480 1203 -520 479 -1184 RAW_Data: 1227 -480 1189 -554 487 -1174 1217 -502 1181 -486 1211 -514 481 -1216 1207 -484 1221 -478 1185 -520 487 -1196 483 -1218 1215 -490 1229 -478 1183 -520 483 -1228 483 -1188 531 -2150 1239 -480 481 -1246 1181 -482 489 -1218 495 -1206 1197 -506 1183 -520 1205 -480 479 -1232 1181 -514 1209 -486 1199 -526 491 -1184 1207 -520 1183 -484 485 -1208 1209 -506 1181 -518 479 -1242 1169 -482 1235 -474 1201 -480 541 -1174 1205 -512 1207 -474 1215 -516 479 -1174 547 -1176 1185 -536 1193 -462 1249 -486 481 -1206 513 -1176 485 -2240 1173 -518 517 -1158 1223 -506 487 -1174 545 -1172 1207 -514 1175 -484 1223 -510 489 -1178 1219 -516 1173 -486 1235 -484 489 -1218 1185 -520 1217 -480 481 -1214 1205 -484 1183 -540 499 -1182 1201 -494 1207 -476 1241 -478 475 -1244 1171 -512 1203 -520 1173 -490 521 -1184 479 -1246 1179 -482 1243 -486 1195 -484 515 -1210 485 -1214 499 -2204 1175 -482 519 -1224 1171 -490 503 -1210 481 -1210 1213 -482 1205 -518 1175 -486 501 -1246 1179 -486 1211 -480 1213 -512 503 -1182 1231 -498 1179 -486 513 -1202 1183 -534 1159 -498 511 -1204 1199 -482 1227 -480 1199 -514 505 -1182 1229 -478 1185 -520 1209 -482 509 -1202 513 -1174 1215 -516 1153 -520 1211 -480 511 -1204 485 -1208 489 -2210 1175 -548 475 -1186 1217 -492 515 -1174 513 -1210 1177 -510 1201 -490 1233 -496 483 -1174 1215 -516 1173 -514 1209 -484 491 -1232 1159 -520 1209 -480 513 -1210 1183 -482 1245 -486 501 -1178 1231 -496 1177 -508 1205 -482 481 -1244 1171 -510 1211 -486 1199 -494 509 -1210 479 -1212 1181 -514 1207 -486 1201 -492 507 -1216 479 -1210 519 -2198 1165 -494 513 -1210 1193 -488 511 -1208 473 -1246 1175 -474 1239 -478 1203 -486 539 -1194 1155 -528 1187 -520 1211 -480 481 -1210 1203 -512 1169 -548 477 -1186 1215 -492 1205 -486 481 -1220 1177 -510 1219 -488 1199 -522 487 -1206 1197 -504 1181 -486 1241 -478 475 -1244 485 -1202 1219 -478 1187 -486 1241 -478 475 -1244 485 -1202 461 -2214 1245 -482 499 -1178 1231 -478 491 -1240 471 -1184 1243 -486 1175 -480 1241 -482 503 -1182 1233 -478 1215 -506 1165 -510 489 -1208 1195 -506 1211 -506 473 -1214 1185 -522 1207 -478 509 -1174 1243 -480 1199 -514 1169 -506 507 -1214 1197 -486 1209 -482 1201 -520 481 -1192 519 -1208 1175 -514 1199 -510 1175 -514 507 -1186 503 -1210 479 -2234 1171 -490 503 -1208 1177 -520 511 -1198 489 -1232 1169 -490 1215 -492 1205 -488 513 -1202 1185 -534 1161 -518 1209 -482 513 -1178 1205 -516 1175 -512 507 -1184 1233 -498 1175 -474 551 -1182 1177 -546 1165 -510 1189 -510 487 -1208 1215 -486 1175 -546 1173 -480 509 -1216 479 -1190 1223 -506 1179 -520 1183 -516 479 -1234 481 -1198 491 -2210 RAW_Data: 1211 -482 501 -1184 1227 -500 483 -1208 505 -1200 1205 -474 1213 -484 1205 -520 481 -1232 1177 -478 1219 -486 1197 -504 519 -1184 1193 -522 1181 -520 481 -1230 1177 -478 1217 -508 473 -1248 1155 -504 1231 -500 1179 -486 481 -1224 1179 -510 1217 -490 1229 -480 493 -1210 477 -1238 1169 -486 1235 -484 1181 -524 491 -1206 477 -1240 477 -2206 1199 -492 511 -1180 1205 -518 481 -1190 499 -1212 1207 -486 1213 -480 1213 -512 503 -1182 1213 -490 1205 -486 1209 -512 475 -1216 1209 -484 1211 -504 487 -1174 1237 -488 1173 -518 511 -1200 1189 -530 1155 -500 1237 -486 477 -1200 1205 -516 1169 -552 1179 -482 493 -1232 477 -1182 1233 -478 1189 -554 1169 -480 509 -1210 485 -1206 527 -2182 1203 -484 517 -1194 1179 -510 489 -1210 519 -1184 1209 -484 1203 -494 1197 -508 489 -1210 1193 -490 1243 -486 1177 -482 519 -1212 1173 -522 1181 -510 491 -1206 1197 -506 1215 -492 473 -1246 1177 -506 1217 -486 1171 -514 507 -1202 1187 -534 1155 -498 1235 -488 483 -1206 513 -1208 1173 -512 1203 -490 1201 -494 515 -1174 519 -1214 481 -2198 1187 -504 513 -1208 1175 -512 505 -1182 503 -1200 1201 -490 1229 -498 1173 -520 487 -1208 1221 -478 1185 -520 1181 -512 475 -1246 1175 -478 1235 -486 505 -1182 1229 -498 1179 -520 479 -1202 1211 -504 1179 -506 1203 -490 481 -1240 1179 -516 1209 -486 1177 -488 553 -1182 479 -1242 1183 -480 1211 -520 1173 -490 473 -1244 479 -1210 513 -2166 1239 -486 479 -1244 1167 -490 481 -1242 473 -1210 1209 -484 1205 -520 1195 -486 477 -1238 1167 -514 1207 -520 1177 -518 481 -1182 1235 -484 1181 -492 547 -1178 1197 -530 1153 -520 487 -1232 1177 -478 1217 -508 1165 -542 501 -1178 1227 -498 1177 -486 1211 -510 475 -1216 507 -1200 1183 -530 1191 -486 1211 -482 513 -1176 511 -1202 489 -2210 1173 -550 479 -1188 1225 -502 485 -1172 543 -1180 1171 -548 1171 -486 1223 -506 487 -1208 1217 -484 1171 -554 1179 -484 489 -1232 1159 -520 1211 -482 513 -1176 1209 -512 1207 -520 475 -1180 1231 -478 1183 -520 1209 -480 507 -1200 1205 -480 1237 -486 1171 -486 539 -1182 507 -1218 1179 -490 1209 -518 1177 -480 541 -1172 515 -1228 481 -2192 1187 -520 483 -1228 1169 -480 495 -1246 461 -1248 1183 -476 1237 -482 1175 -516 497 -1214 1187 -500 1215 -492 1173 -548 483 -1176 1207 -518 1171 -518 509 -1200 1157 -528 1189 -520 483 -1228 1177 -480 1219 -488 1195 -524 489 -1208 1195 -506 1181 -506 1199 -508 487 -1210 499 -1210 1203 -484 1181 -486 1229 -516 463 -1246 493 -1180 481 -2234 1173 -524 489 -1198 1211 -490 505 -1180 515 -1208 1177 -516 1175 -516 1225 -482 473 -1198 1235 -484 1183 -524 1181 -506 473 -1250 1181 -476 1241 -480 481 -1246 1177 -484 1215 -514 RAW_Data: 495 -1180 1197 -494 1211 -506 1199 -502 485 -1210 1195 -488 1211 -520 1183 -514 477 -1214 477 -1220 1181 -506 1215 -490 1197 -498 515 -1182 503 -1218 489 -2198 1205 -482 475 -1246 1161 -520 515 -1174 485 -1246 1195 -484 1209 -482 1207 -484 537 -1196 1181 -520 1179 -504 1209 -482 513 -1174 1237 -478 1199 -518 479 -1190 1225 -504 1181 -488 481 -1224 1177 -542 1197 -492 1199 -494 515 -1172 1215 -516 1173 -486 1233 -484 489 -1216 493 -1212 1205 -488 1175 -522 1205 -482 519 -1216 485 -1176 511 -2198 1229 -498 483 -1174 1239 -486 479 -1240 477 -1202 1201 -486 1205 -490 1217 -490 481 -1238 1165 -530 1213 -462 1215 -480 475 -1244 1181 -482 1215 -516 501 -1216 1187 -498 1211 -494 473 -1202 1203 -520 1179 -516 1175 -516 499 -1214 1189 -498 1213 -492 1185 -512 481 -1208 479 -1232 1175 -514 1193 -520 1179 -522 487 -1206 473 -1214 515 -2198 1173 -486 505 -1218 1189 -554 487 -1174 489 -1232 1159 -520 1209 -482 1209 -482 533 -1196 1181 -518 1181 -488 1211 -514 483 -1182 1233 -484 1181 -538 501 -1180 1213 -488 1205 -474 545 -1180 1173 -544 1173 -490 1227 -502 485 -1176 1213 -516 1171 -552 1177 -482 473 -1250 463 -1212 1197 -508 1185 -520 1183 -514 485 -1214 479 -1192 553 -2178 1215 -496 483 -1176 1215 -516 479 -1210 509 -1172 1215 -516 1155 -520 1217 -482 479 -1244 1175 -514 1209 -486 1199 -494 519 -1176 1203 -518 1177 -486 501 -1214 1211 -476 1205 -512 475 -1246 1173 -482 1243 -482 1197 -494 505 -1216 1177 -518 1171 -510 1199 -518 479 -1184 501 -1212 1209 -520 1183 -484 1213 -516 465 -1212 477 -1240 479 -2198 1199 -492 539 -1180 1183 -520 481 -1202 489 -1216 1183 -520 1211 -480 1173 -550 479 -1186 1231 -478 1189 -520 1209 -482 479 -1246 1177 -482 1217 -516 497 -1178 1213 -490 1173 -540 503 -1164 1223 -488 1195 -506 1215 -490 505 -1180 1205 -518 1173 -522 1197 -478 493 -1238 473 -1182 1243 -492 1185 -514 1175 -520 481 -1220 489 -1182 547 -2172 1201 -508 475 -1246 1183 -484 483 -1218 515 -1172 1207 -516 1177 -518 1209 -484 493 -1216 1181 -486 1215 -514 1175 -514 495 -1192 1227 -504 1181 -486 483 -1222 1209 -476 1217 -488 505 -1232 1173 -490 1233 -476 1189 -520 517 -1168 1203 -510 1197 -474 1231 -480 495 -1210 507 -1206 1175 -518 1179 -520 1219 -478 491 -1206 503 -1184 515 -2196 1175 -554 485 -1178 1215 -506 473 -1216 483 -1208 1181 -514 1205 -486 1211 -516 483 -1182 1231 -482 1199 -478 1223 -486 519 -1212 1175 -518 1207 -482 489 -1184 1239 -474 1193 -524 491 -1210 1215 -486 1169 -520 1207 -482 485 -1248 1161 -500 1235 -486 1177 -520 509 -1196 473 -1228 1191 -474 1225 -506 1181 -486 549 -1172 489 -1216 491 -2172 1233 -484 485 -1248 RAW_Data: 1157 -498 511 -1202 509 -1174 1237 -476 1201 -514 1205 -484 493 -1200 1187 -520 1213 -482 1173 -548 477 -1190 1215 -492 1211 -476 543 -1174 1183 -538 1163 -498 509 -1204 1205 -484 1231 -482 1169 -542 501 -1184 1215 -490 1173 -518 1207 -480 503 -1236 485 -1198 1213 -500 1175 -476 1233 -488 481 -1206 513 -1210 485 -2212 1181 -538 477 -1174 1213 -518 499 -1182 519 -1180 1205 -516 1169 -508 1215 -504 487 -1176 1241 -484 1173 -552 1181 -484 489 -1216 1183 -518 1213 -480 507 -1208 1169 -510 1203 -520 477 -1188 1215 -494 1205 -474 1215 -516 477 -1240 1165 -492 1237 -474 1195 -502 517 -1182 505 -1232 1153 -518 1215 -482 1175 -514 531 -1194 485 -1214 479 -2234 1175 -488 487 -1246 1175 -484 535 -1192 485 -1206 1205 -476 1239 -480 1175 -516 463 -1246 1187 -532 1157 -500 1237 -484 479 -1208 1211 -480 1203 -484 539 -1188 1165 -538 1191 -474 507 -1214 1187 -502 1213 -482 1207 -518 481 -1190 1217 -494 1177 -520 1209 -482 485 -1250 499 -1180 1199 -494 1205 -476 1209 -514 483 -1244 483 -1196 485 -2208 1221 -478 489 -1210 1213 -486 479 -1202 513 -1212 1177 -512 1199 -490 1201 -510 489 -1208 1199 -502 1181 -520 1203 -478 477 -1246 1181 -482 1211 -518 499 -1210 1167 -510 1217 -490 483 -1216 1209 -484 1203 -494 1199 -504 487 -1210 1189 -494 1239 -492 1165 -526 493 -1208 473 -1244 1177 -476 1235 -480 1201 -518 479 -1190 499 -1244 481 -2194 1207 -482 473 -1250 1155 -520 519 -1176 485 -1248 1161 -518 1209 -482 1203 -480 537 -1192 1167 -536 1197 -462 1229 -506 487 -1206 1201 -502 1181 -520 479 -1204 1219 -480 1187 -520 515 -1172 1181 -542 1199 -486 1205 -516 479 -1176 1243 -480 1173 -550 1173 -486 503 -1238 481 -1172 1217 -518 1171 -484 1235 -480 509 -1212 503 -1182 473 -2238 1213 -496 483 -1174 1239 -486 479 -1242 487 -1176 1215 -514 1159 -520 1213 -480 481 -1246 1177 -482 1243 -484 1165 -518 515 -1208 1179 -512 1199 -486 481 -1230 1201 -482 1227 -482 473 -1216 1211 -490 1231 -478 1185 -518 483 -1228 1175 -478 1217 -508 1183 -536 497 -1176 473 -1232 1199 -494 1197 -508 1181 -554 477 -1174 485 -1248 461 -2236 1175 -482 521 -1212 1171 -518 505 -1198 477 -1222 1181 -490 1237 -474 1199 -536 497 -1178 1219 -486 1177 -520 1205 -482 487 -1184 1239 -474 1191 -526 493 -1208 1195 -508 1181 -504 505 -1198 1201 -520 1197 -482 1203 -522 485 -1164 1249 -462 1207 -506 1197 -504 485 -1210 499 -1182 1241 -480 1205 -518 1173 -482 493 -1240 471 -1184 549 -2170 1203 -508 507 -1178 1207 -480 517 -1216 479 -1186 1229 -482 1187 -520 1213 -478 509 -1208 1185 -480 1229 -520 1173 -492 519 -1184 1207 -518 1175 -486 501 -1218 1209 -488 1205 -482 519 -1216 1193 -488 RAW_Data: 1215 -480 1207 -484 535 -1156 1217 -516 1177 -486 1247 -476 509 -1176 511 -1204 1183 -534 1195 -486 1211 -478 509 -1172 515 -1192 517 -2210 1171 -488 541 -1196 1157 -528 493 -1208 475 -1240 1169 -488 1237 -482 1183 -538 499 -1178 1229 -480 1183 -486 1245 -480 479 -1232 1177 -480 1245 -484 501 -1184 1233 -464 1211 -520 483 -1200 1219 -478 1183 -522 1211 -480 477 -1232 1185 -480 1243 -482 1193 -474 497 -1252 483 -1174 1217 -516 1171 -514 1209 -484 485 -1220 515 -1170 513 -2204 1205 -490 511 -1202 1199 -498 481 -1210 503 -1198 1209 -490 1197 -528 1191 -486 483 -1226 1175 -482 1223 -486 1197 -538 501 -1180 1219 -488 1173 -520 479 -1218 1179 -506 1215 -490 485 -1244 1171 -486 1235 -480 1199 -478 525 -1186 1199 -534 1193 -486 1215 -480 515 -1176 511 -1204 1185 -532 1191 -486 1213 -480 513 -1180 513 -1204 489 -2212 1175 -512 507 -1182 1233 -478 493 -1176 521 -1210 1171 -548 1175 -488 1217 -492 515 -1172 1241 -484 1175 -482 1235 -482 485 -1252 1159 -522 1213 -480 479 -1214 1207 -480 1209 -512 505 -1180 1229 -478 1189 -486 1243 -478 479 -1234 1177 -514 1211 -486 1201 -490 505 -1192 493 -1242 1181 -486 1207 -520 1181 -482 525 -1184 503 -1212 503 -2156 1241 -486 483 -1232 1177 -480 495 -1240 471 -1198 1235 -484 1185 -534 1161 -500 511 -1202 1201 -486 1231 -484 1179 -524 491 -1208 1201 -490 1209 -480 545 -1170 1169 -540 1199 -486 487 -1236 1173 -480 1221 -486 1193 -524 493 -1206 1197 -508 1181 -486 1217 -514 481 -1218 515 -1160 1223 -506 1183 -474 1241 -480 513 -1210 485 -1204 485 -2196 1197 -510 507 -1184 1227 -500 483 -1178 521 -1212 1179 -512 1203 -460 1251 -486 479 -1208 1209 -482 1207 -518 1173 -486 499 -1238 1181 -488 1213 -514 483 -1220 1173 -484 1235 -514 495 -1178 1217 -488 1171 -538 1195 -500 483 -1208 1197 -502 1209 -474 1197 -506 521 -1180 505 -1218 1179 -506 1197 -506 1181 -504 505 -1184 517 -1204 505 -2212 1171 -516 495 -1214 1187 -464 549 -1180 487 -1216 1203 -486 1229 -484 1183 -502 519 -1182 1197 -532 1193 -486 1215 -480 481 -1208 1207 -478 1203 -548 477 -1182 1229 -480 1185 -504 503 -1216 1177 -486 1245 -476 1199 -516 479 -1190 1229 -502 1179 -474 1245 -480 479 -1246 481 -1198 1217 -478 1183 -522 1209 -478 507 -1210 485 -1208 489 -2210 1207 -486 509 -1182 1229 -478 491 -1208 521 -1184 1209 -482 1203 -490 1219 -490 513 -1172 1209 -482 1205 -520 1209 -480 471 -1234 1209 -486 1215 -500 485 -1208 1181 -514 1203 -506 471 -1216 1203 -506 1161 -528 1185 -522 487 -1196 1209 -478 1221 -488 1185 -548 483 -1172 505 -1204 1207 -488 1211 -514 1173 -514 509 -1180 505 -1216 487 -2204 1179 -484 529 -1216 1183 -488 515 -1202 RAW_Data: 489 -1232 1171 -490 1233 -478 1187 -486 553 -1168 1201 -512 1197 -492 1199 -496 515 -1174 1209 -516 1167 -520 517 -1192 1187 -508 1185 -486 553 -1172 1187 -534 1187 -474 1231 -476 493 -1206 1197 -508 1181 -520 1205 -478 509 -1206 515 -1170 1217 -504 1177 -506 1205 -482 511 -1208 487 -1206 491 -2212 1209 -482 503 -1184 1227 -500 485 -1206 521 -1174 1203 -514 1167 -506 1231 -484 497 -1210 1199 -478 1221 -488 1197 -498 519 -1184 1201 -516 1177 -504 473 -1216 1207 -474 1249 -484 477 -1238 1169 -516 1201 -506 1161 -496 513 -1202 1199 -502 1211 -488 1229 -480 491 -1208 477 -1236 1167 -482 1237 -482 1183 -542 501 -1180 485 -1214 509 -2194 1197 -490 537 -1166 1197 -506 505 -1180 507 -1218 1183 -504 1211 -488 1185 -516 515 -1170 1237 -486 1201 -488 1207 -482 517 -1196 1215 -480 1229 -484 499 -1178 1235 -478 1181 -486 553 -1174 1183 -534 1191 -462 1247 -486 479 -1204 1207 -482 1205 -520 1209 -486 493 -1218 487 -1176 1217 -514 1175 -520 1213 -450 519 -1210 513 -1172 513 -2174 1249 -482 477 -1236 1197 -464 513 -1206 503 -1200 1205 -474 1195 -506 1213 -490 503 -1198 1201 -472 1229 -516 1193 -486 515 -1174 1209 -512 1201 -492 477 -1242 1173 -486 1237 -482 485 -1240 1175 -486 1241 -480 1175 -514 531 -1156 1189 -524 1185 -520 1209 -480 509 -1168 549 -1176 1183 -536 1195 -488 1211 -480 513 -1174 547 -1174 489 -2194 1201 -482 535 -1196 1187 -498 529 -1178 475 -1242 1173 -482 1235 -482 1183 -526 493 -1208 1195 -506 1179 -486 1243 -480 479 -1232 1181 -480 1229 -522 477 -1180 1231 -478 1185 -556 477 -1174 1243 -486 1195 -488 1217 -482 479 -1248 1181 -484 1215 -506 1183 -476 515 -1196 517 -1218 1169 -486 1229 -482 1191 -500 511 -1204 477 -1200 547 -2164 1209 -482 511 -1206 1185 -514 483 -1216 513 -1160 1249 -462 1209 -522 1175 -482 517 -1218 1199 -484 1211 -482 1207 -518 481 -1188 1215 -494 1207 -472 545 -1182 1175 -550 1173 -490 507 -1208 1175 -488 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/gate_tx.sub ================================================ Filetype: Flipper SubGhz Key File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: GateTX Bit: 24 Key: 00 00 00 00 00 02 8F F3 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/gate_tx_raw.sub ================================================ Filetype: Flipper SubGhz RAW File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: RAW RAW_Data: 711 -646 413 -328 713 -680 381 -648 417 -326 747 -644 1509 -32700 711 -480 597 -454 595 -422 627 -424 659 -388 661 -422 631 -750 319 -394 675 -684 349 -718 339 -690 379 -358 663 -716 345 -716 379 -324 729 -682 379 -654 381 -650 411 -328 709 -322 719 -678 413 -648 381 -358 723 -680 349 -16580 767 -316 699 -350 701 -348 699 -350 701 -348 735 -314 731 -666 425 -304 729 -640 405 -640 403 -638 405 -318 741 -648 413 -648 415 -326 743 -648 417 -618 415 -650 379 -334 703 -344 727 -652 425 -654 385 -348 721 -668 355 -16578 747 -326 717 -324 751 -290 755 -320 723 -320 731 -322 733 -650 453 -292 737 -644 385 -650 417 -650 379 -332 735 -646 415 -648 415 -326 743 -642 387 -648 417 -650 379 -346 725 -314 717 -668 387 -668 423 -312 753 -628 393 -16568 771 -318 703 -322 731 -322 727 -322 727 -322 731 -352 703 -684 379 -352 707 -646 387 -680 385 -648 415 -328 705 -648 415 -648 415 -326 745 -648 383 -650 415 -650 379 -344 725 -348 685 -668 387 -686 383 -350 717 -666 355 -16568 767 -322 735 -322 725 -322 727 -320 723 -322 731 -324 731 -682 409 -320 709 -650 383 -656 405 -638 405 -318 739 -646 413 -640 413 -350 723 -648 409 -648 381 -654 417 -294 753 -322 725 -646 417 -648 419 -324 725 -650 377 -16592 737 -348 691 -350 719 -316 723 -318 725 -346 723 -332 741 -626 441 -304 741 -622 409 -624 431 -622 409 -332 721 -658 409 -644 407 -334 753 -628 405 -644 417 -622 417 -324 727 -318 725 -648 417 -648 419 -324 727 -648 383 -16574 763 -318 699 -350 701 -348 701 -350 701 -350 733 -320 731 -646 411 -348 699 -648 383 -676 387 -636 411 -344 701 -678 379 -672 409 -348 733 -624 385 -678 387 -638 391 -366 699 -346 701 -646 423 -636 421 -342 735 -648 347 -16582 781 -288 753 -320 725 -320 723 -320 729 -322 729 -322 731 -680 409 -320 709 -650 379 -672 383 -672 381 -318 749 -646 419 -650 417 -324 723 -648 419 -650 383 -650 379 -344 727 -346 685 -654 417 -640 417 -348 719 -654 383 -16578 745 -324 709 -324 747 -288 755 -318 725 -322 729 -322 769 -616 455 -292 735 -644 389 -648 419 -616 411 -346 727 -626 429 -622 417 -352 755 -624 381 -654 383 -680 385 -342 705 -336 715 -654 409 -648 419 -332 741 -648 385 -16560 763 -326 699 -336 707 -358 677 -354 705 -356 701 -354 705 -682 409 -320 711 -680 385 -648 383 -648 415 -328 709 -678 381 -648 415 -324 749 -646 385 -682 383 -650 377 -344 727 -346 683 -664 423 -640 403 -342 727 -652 RAW_Data: 361 -16588 743 -320 735 -320 729 -320 729 -320 729 -320 735 -320 767 -612 439 -332 721 -646 375 -650 407 -662 397 -326 711 -656 407 -648 407 -334 759 -628 407 -652 377 -658 379 -332 725 -328 747 -650 417 -620 421 -326 731 -646 417 -16544 763 -326 731 -306 739 -296 745 -320 739 -322 737 -322 739 -650 419 -294 733 -648 385 -650 417 -652 379 -344 725 -652 389 -670 387 -348 753 -620 387 -678 383 -648 385 -344 719 -336 709 -656 405 -650 435 -326 709 -660 381 -16590 733 -348 701 -348 701 -350 703 -320 731 -352 699 -352 701 -676 413 -310 735 -654 385 -656 381 -650 385 -344 733 -648 415 -646 417 -348 701 -678 351 -674 379 -674 387 -342 701 -350 701 -680 387 -670 379 -346 733 -644 381 -16556 753 -352 691 -354 691 -356 693 -356 725 -354 695 -354 699 -682 377 -354 703 -680 383 -650 381 -650 415 -328 709 -680 381 -646 415 -356 721 -646 383 -684 381 -650 379 -342 723 -318 705 -686 399 -652 391 -346 721 -662 363 -16572 765 -322 733 -322 725 -320 725 -322 727 -322 729 -322 735 -648 419 -328 733 -646 385 -648 417 -650 379 -344 727 -658 397 -658 401 -344 725 -654 403 -620 383 -676 381 -350 725 -320 733 -646 395 -664 395 -368 705 -672 379 -32700 691 -546 435 -522 133 -520 533 -488 595 -454 595 -456 597 -790 305 -422 635 -718 309 -748 307 -712 339 -388 689 -680 375 -678 373 -390 663 -754 275 -752 311 -424 623 -716 343 -392 651 -712 379 -682 379 -356 723 -680 347 -16574 743 -342 709 -326 743 -290 737 -322 733 -320 731 -322 769 -614 453 -292 737 -644 387 -650 419 -614 447 -296 733 -638 419 -646 417 -326 743 -646 421 -612 421 -296 735 -646 417 -326 707 -672 419 -644 419 -292 751 -648 387 -16546 801 -324 691 -326 741 -320 707 -324 735 -322 731 -320 765 -648 409 -330 721 -648 377 -650 405 -644 409 -328 709 -658 409 -666 395 -330 741 -672 367 -646 411 -326 711 -654 409 -328 719 -654 417 -622 417 -326 735 -678 345 -16604 743 -312 721 -346 703 -318 737 -326 745 -322 721 -322 729 -646 441 -330 685 -648 419 -650 385 -650 415 -326 709 -644 419 -646 415 -324 749 -646 417 -614 419 -326 709 -646 415 -328 743 -612 417 -646 417 -324 749 -646 385 -16564 761 -316 729 -346 705 -332 715 -324 741 -324 705 -354 737 -650 411 -318 707 -646 409 -648 383 -652 419 -324 725 -644 417 -650 419 -324 725 -650 417 -616 417 -328 711 -648 415 -328 707 -642 417 -646 417 -324 749 -646 385 -16578 755 -298 741 -290 735 -322 733 -320 733 -322 RAW_Data: 767 -288 769 -614 451 -294 737 -642 407 -648 385 -654 417 -294 753 -644 421 -616 451 -290 751 -646 419 -616 421 -296 737 -644 421 -296 771 -612 451 -614 449 -292 747 -646 385 -16582 749 -332 711 -322 709 -352 703 -322 729 -322 731 -354 701 -682 417 -326 703 -648 385 -650 413 -642 409 -318 713 -678 383 -682 383 -356 721 -648 383 -652 415 -328 711 -648 413 -328 709 -648 415 -648 413 -326 749 -646 385 -16538 779 -330 709 -326 705 -354 703 -324 733 -322 731 -354 703 -684 379 -350 707 -646 383 -682 381 -652 413 -326 707 -680 381 -648 413 -328 749 -646 383 -648 415 -326 707 -644 415 -326 711 -680 383 -648 415 -326 751 -646 383 -16558 757 -346 703 -346 703 -346 703 -346 703 -348 705 -340 743 -628 437 -326 711 -648 383 -654 417 -614 419 -328 743 -642 417 -646 417 -322 721 -646 417 -648 385 -328 713 -646 417 -328 707 -646 417 -648 415 -324 747 -646 385 -16582 723 -340 705 -338 707 -340 705 -376 703 -346 703 -348 701 -680 389 -344 701 -680 357 -664 379 -668 393 -368 707 -666 367 -654 435 -326 743 -632 405 -644 383 -328 733 -648 417 -324 721 -644 419 -648 417 -322 725 -650 383 -16576 733 -350 721 -332 715 -322 705 -322 735 -322 731 -322 769 -616 445 -318 709 -648 417 -616 417 -650 413 -298 737 -648 413 -646 413 -326 745 -644 419 -614 419 -326 707 -640 415 -326 743 -644 419 -616 451 -290 751 -644 385 -16560 773 -312 709 -330 743 -290 739 -322 731 -322 765 -290 769 -616 449 -294 735 -646 419 -616 417 -614 447 -310 725 -624 433 -656 403 -344 725 -654 391 -654 383 -350 689 -672 395 -326 709 -660 405 -652 415 -334 745 -650 383 -16548 761 -336 719 -322 707 -322 731 -322 731 -322 729 -322 767 -614 445 -318 709 -646 419 -616 417 -650 415 -310 731 -652 389 -666 421 -314 737 -644 419 -616 411 -346 687 -668 403 -346 721 -622 415 -638 431 -346 719 -656 357 -16578 745 -358 687 -354 687 -352 691 -356 723 -322 729 -354 699 -684 383 -358 669 -680 381 -682 347 -684 377 -360 709 -648 413 -648 415 -326 745 -646 383 -650 415 -328 707 -642 415 -328 711 -646 417 -648 415 -326 749 -646 383 -16548 747 -372 681 -362 675 -358 699 -354 701 -354 701 -356 701 -682 379 -362 709 -652 379 -652 415 -656 383 -326 729 -648 415 -650 415 -324 729 -680 377 -648 379 -356 709 -650 377 -350 703 -680 187 -32700 751 -408 653 -378 655 -412 645 -408 667 -370 671 -366 705 -696 369 -358 675 -686 349 -716 337 -716 337 -354 707 -684 379 -690 RAW_Data: 367 -360 709 -662 373 -678 379 -330 733 -324 725 -648 417 -650 381 -680 417 -324 721 -648 381 -16570 757 -332 711 -324 711 -320 731 -322 731 -322 765 -290 769 -614 451 -324 705 -646 385 -650 417 -650 413 -310 727 -658 399 -660 399 -344 723 -658 403 -630 391 -352 687 -354 725 -618 423 -638 421 -638 423 -340 737 -644 365 -16584 751 -318 721 -318 723 -336 719 -322 741 -322 739 -320 739 -648 411 -320 709 -648 407 -648 415 -618 409 -322 743 -650 409 -646 407 -322 747 -652 383 -652 409 -320 709 -322 735 -648 417 -648 417 -650 419 -290 753 -648 385 -16582 753 -330 711 -322 705 -324 731 -322 729 -322 731 -322 767 -648 411 -320 707 -644 419 -646 385 -648 415 -328 707 -676 387 -646 415 -326 745 -646 419 -614 417 -328 703 -320 719 -676 385 -646 419 -648 417 -324 747 -646 385 -16542 773 -340 701 -370 647 -392 673 -354 705 -354 705 -356 703 -682 383 -358 705 -646 385 -650 415 -652 379 -342 727 -650 389 -668 389 -346 757 -652 353 -684 383 -348 691 -346 703 -670 365 -690 397 -660 397 -328 741 -670 345 -16570 747 -350 721 -318 721 -320 731 -346 707 -336 711 -328 747 -652 409 -332 707 -654 375 -672 377 -654 415 -332 707 -648 419 -650 419 -324 729 -648 419 -648 385 -326 711 -324 715 -676 385 -646 419 -648 415 -326 747 -644 383 -16554 765 -348 671 -380 673 -378 675 -378 673 -380 673 -380 703 -676 381 -346 705 -642 381 -674 387 -672 389 -340 703 -676 387 -672 389 -342 737 -646 385 -670 379 -340 703 -346 705 -642 411 -640 393 -668 423 -340 733 -642 363 -16594 745 -312 723 -352 689 -354 693 -350 733 -308 723 -328 749 -652 419 -328 707 -644 387 -648 417 -650 379 -348 725 -628 429 -624 433 -346 725 -656 401 -620 385 -352 723 -322 725 -628 407 -648 417 -664 419 -294 769 -646 387 -16526 761 -370 649 -392 673 -356 703 -356 697 -354 699 -354 703 -682 383 -360 705 -648 383 -650 415 -652 375 -344 727 -652 389 -668 389 -346 721 -684 355 -672 385 -348 691 -348 719 -666 369 -688 379 -666 407 -320 741 -654 381 -16572 753 -320 723 -320 731 -308 725 -324 747 -322 737 -290 769 -648 415 -318 707 -646 419 -612 421 -648 417 -296 735 -644 419 -646 419 -324 745 -646 387 -650 419 -296 735 -324 711 -642 419 -646 419 -646 415 -326 745 -644 387 -16536 783 -328 681 -358 703 -354 703 -354 697 -354 701 -354 701 -682 383 -360 703 -646 381 -650 417 -650 377 -330 741 -648 411 -648 413 -326 745 -646 381 -650 415 -346 689 -318 739 -650 RAW_Data: 411 -650 377 -684 411 -344 695 -654 373 -16580 737 -354 703 -322 725 -320 727 -322 727 -322 731 -324 765 -648 407 -330 709 -652 377 -652 407 -646 407 -318 743 -650 407 -628 433 -328 743 -630 417 -622 419 -324 721 -322 721 -646 417 -648 385 -648 419 -324 749 -646 387 -16560 743 -372 671 -360 673 -356 703 -354 703 -356 701 -354 701 -684 379 -360 709 -652 385 -652 381 -684 381 -326 715 -678 383 -682 381 -356 717 -648 381 -682 381 -326 709 -352 689 -680 381 -682 381 -648 415 -324 749 -648 385 -16566 745 -334 721 -322 739 -288 735 -324 729 -322 733 -322 767 -616 453 -294 733 -644 385 -650 417 -650 413 -310 727 -618 421 -656 417 -350 719 -642 393 -654 385 -352 721 -316 721 -632 403 -650 449 -600 445 -318 745 -652 377 -16576 739 -332 701 -332 733 -326 711 -324 749 -320 725 -322 733 -678 407 -330 713 -650 383 -652 387 -648 419 -326 741 -642 419 -646 419 -292 751 -648 419 -616 419 -296 737 -326 711 -676 387 -646 419 -646 417 -326 745 -646 387 -32700 811 -300 743 -300 735 -326 739 -294 765 -294 763 -290 767 -620 441 -324 743 -618 413 -616 447 -616 437 -276 763 -614 455 -602 455 -286 771 -642 413 -310 695 -342 721 -346 719 -316 721 -646 419 -644 419 -346 721 -646 385 -16522 805 -364 649 -374 691 -376 653 -376 687 -378 689 -378 689 -670 387 -378 687 -676 353 -672 359 -702 359 -366 715 -630 403 -688 399 -328 739 -630 399 -320 743 -292 767 -292 733 -324 731 -650 413 -652 413 -324 761 -618 411 -16524 801 -352 647 -374 677 -366 671 -390 675 -358 701 -356 703 -686 373 -386 673 -652 413 -650 379 -652 411 -328 719 -650 411 -652 411 -326 747 -648 413 -294 721 -326 719 -324 749 -290 755 -648 413 -650 415 -324 759 -618 383 -16558 801 -318 703 -332 709 -326 707 -324 735 -322 735 -322 767 -620 443 -320 705 -646 409 -648 413 -618 417 -324 727 -646 417 -648 409 -324 741 -650 403 -318 741 -290 733 -322 729 -322 733 -646 417 -648 415 -326 759 -616 417 -16550 745 -334 713 -322 739 -322 703 -322 733 -324 733 -322 767 -646 407 -322 711 -646 411 -648 411 -624 411 -330 741 -626 411 -660 395 -332 751 -630 399 -322 745 -322 703 -322 733 -322 731 -650 415 -648 413 -328 725 -648 411 -16540 769 -342 689 -348 689 -350 725 -350 691 -346 733 -306 751 -630 433 -328 707 -654 379 -656 415 -652 381 -326 747 -642 417 -648 415 -324 723 -646 411 -320 709 -322 735 -320 727 -322 729 -652 415 -652 419 -322 725 -648 381 -16578 733 -382 RAW_Data: 663 -374 671 -364 707 -326 741 -322 701 -354 741 -652 411 -320 709 -648 417 -652 381 -650 411 -328 711 -646 415 -648 413 -344 733 -650 377 -344 723 -310 721 -350 685 -350 721 -648 387 -676 389 -380 717 -644 363 -16572 775 -326 707 -320 715 -324 751 -320 725 -320 729 -322 763 -616 443 -330 707 -650 377 -652 411 -624 433 -324 707 -670 397 -658 411 -342 717 -668 365 -354 705 -334 711 -326 741 -320 705 -648 415 -654 415 -326 761 -618 415 -16538 725 -402 637 -394 671 -390 673 -356 703 -356 699 -356 701 -684 379 -360 701 -648 379 -686 379 -652 411 -328 709 -648 411 -648 415 -326 749 -648 383 -328 717 -324 715 -352 721 -320 729 -644 415 -648 415 -324 727 -678 349 -16576 743 -372 673 -360 677 -356 705 -354 705 -324 733 -322 733 -682 409 -320 707 -650 415 -650 381 -650 411 -328 711 -648 413 -648 415 -326 753 -646 379 -328 719 -324 717 -324 717 -352 723 -648 417 -648 417 -324 727 -646 381 -16562 769 -344 683 -362 709 -324 707 -324 733 -352 703 -324 731 -684 409 -330 715 -650 381 -654 415 -618 415 -326 715 -648 413 -650 415 -326 751 -646 383 -328 717 -326 717 -354 723 -320 723 -648 417 -650 415 -324 727 -648 381 -16572 773 -306 741 -296 741 -322 735 -322 707 -324 765 -290 765 -612 449 -326 703 -644 415 -618 417 -650 403 -346 721 -628 427 -628 431 -310 757 -626 433 -312 689 -350 719 -316 731 -342 735 -606 431 -660 395 -330 751 -630 379 -16570 779 -308 729 -344 687 -346 721 -314 721 -350 723 -350 695 -676 411 -350 693 -642 395 -658 395 -658 397 -324 739 -638 395 -664 393 -334 737 -668 365 -356 707 -324 707 -352 705 -322 733 -648 415 -656 415 -326 729 -650 381 -16566 769 -346 687 -350 691 -348 701 -338 717 -326 745 -326 741 -652 415 -328 705 -644 415 -646 379 -650 413 -328 711 -682 381 -650 413 -328 751 -646 379 -328 715 -352 691 -340 705 -362 711 -650 413 -650 411 -328 745 -646 381 -16562 745 -326 711 -322 733 -322 731 -322 731 -322 731 -322 765 -618 443 -318 705 -648 417 -648 381 -652 413 -326 711 -646 415 -648 413 -326 749 -646 415 -294 747 -318 725 -290 753 -320 729 -646 415 -650 419 -324 727 -648 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/hay21_raw.sub ================================================ Filetype: Flipper SubGhz RAW File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: RAW RAW_Data: 99 -820 65 -230 65 -802 361 -852 131 -162 131 -298 133 -306 99 -198 129 -430 99 -732 197 -742 131 -302 197 -238 233 -132 99 -532 99 -168 101 -306 65 -832 133 -304 65 -300 65 -664 131 -198 133 -232 101 -234 99 -134 133 -404 65 -262 163 -654 131 -702 133 -864 131 -194 95 -390 131 -388 99 -1078 65 -260 97 -364 65 -194 161 -258 163 -228 97 -394 131 -336 133 -198 63 -358 97 -392 199 -164 65 -390 97 -426 99 -162 163 -326 193 -326 131 -456 131 -400 99 -700 133 -198 133 -400 131 -302 99 -202 65 -200 99 -1002 133 -236 169 -406 165 -372 99 -202 99 -334 165 -304 131 -332 133 -132 65 -464 133 -400 99 -298 67 -960 163 -400 133 -402 129 -166 101 -268 133 -432 133 -374 101 -366 101 -19558 129 -454 97 -23210 133 -688 129 -196 131 -162 65 -422 65 -132 163 -228 63 -194 65 -228 131 -292 129 -552 65 -986 65 -530 131 -164 99 -294 65 -796 65 -466 133 -200 131 -136 133 -1970 99 -1594 133 -966 65 -100 99 -300 99 -534 65 -664 99 -332 65 -198 97 -1086 131 -304 133 -402 167 -166 67 -996 99 -728 133 -268 131 -1684 163 -394 129 -690 65 -558 65 -132 131 -162 95 -456 97 -362 133 -168 67 -306 133 -202 67 -168 197 -338 167 -438 101 -362 97 -470 101 -402 65 -1058 131 -336 133 -1402 133 -402 165 -236 65 -432 99 -764 133 -470 65 -200 67 -166 131 -436 99 -398 99 -168 135 -902 65 -234 135 -200 199 -166 65 -628 197 -662 165 -694 65 -166 67 -564 65 -1072 99 -334 167 -168 131 -1058 131 -336 131 -370 99 -198 133 -462 131 -302 133 -438 67 -368 133 -1036 97 -634 165 -134 135 -670 99 -370 161 -690 65 -296 131 -1000 99 -436 133 -170 101 -404 99 -170 101 -270 67 -268 131 -302 131 -672 133 -234 65 -502 99 -604 65 -1260 99 -232 99 -964 131 -338 99 -200 65 -232 99 -168 135 -168 67 -204 67 -134 133 -370 99 -428 133 -234 135 -1128 163 -454 97 -362 163 -458 65 -164 99 -596 99 -268 131 -1562 65 -398 99 -402 163 -438 67 -368 65 -988 97 -622 131 -162 97 -390 133 -368 135 -402 133 -164 65 -438 131 -686 165 -334 99 -460 99 -368 167 -22538 65 -170 65 -766 99 -1098 165 -760 99 -364 65 -722 65 -2132 163 -326 163 -402 133 -266 161 -406 97 -168 101 -404 163 -168 67 -266 65 -334 65 -402 97 -494 65 -132 97 -462 99 -336 133 -334 131 -198 133 -672 131 -200 65 -1036 67 -1028 165 -702 99 -402 97 -1234 97 -196 63 -488 131 -658 65 -498 RAW_Data: 97 -270 131 -566 65 -168 67 -336 67 -996 133 -300 67 -166 101 -702 99 -1202 131 -264 97 -590 163 -1680 99 -228 95 -162 97 -194 65 -886 99 -3586 65 -558 131 -1486 99 -634 65 -100 133 -132 67 -1134 97 -658 65 -1446 65 -564 133 -234 133 -372 65 -166 99 -1362 99 -332 97 -202 133 -1984 97 -198 65 -394 161 -23544 65 -334 99 -298 165 -570 167 -334 99 -198 67 -836 131 -290 65 -724 99 -298 165 -130 97 -264 127 -628 165 -266 131 -200 101 -234 135 -564 165 -234 99 -202 97 -368 131 -466 131 -1770 65 -326 165 -622 131 -296 133 -496 97 -1166 65 -1512 97 -1090 99 -534 165 -498 101 -336 99 -300 167 -302 65 -302 133 -1158 65 -166 99 -666 65 -736 233 -566 99 -502 99 -596 131 -168 135 -370 99 -1758 67 -3408 129 -1212 99 -690 65 -2674 67 -696 97 -200 65 -500 97 -338 65 -298 99 -234 165 -636 97 -724 65 -1424 97 -918 131 -198 65 -366 65 -562 99 -456 163 -1142 99 -394 165 -262 325 -230 97 -424 65 -460 131 -1150 129 -394 163 -356 197 -722 131 -920 97 -424 65 -1114 65 -262 97 -394 97 -888 97 -520 97 -21882 97 -2496 97 -164 97 -848 99 -47158 99 -234 99 -600 67 -1088 65 -918 63 -230 99 -162 127 -288 131 -164 97 -756 131 -392 99 -404 65 -400 67 -132 99 -302 131 -688 65 -982 131 -970 199 -372 101 -966 97 -130 129 -980 133 -1116 99 -162 95 -390 65 -428 163 -324 131 -266 99 -266 135 -1302 131 -470 199 -472 97 -358 97 -164 65 -230 99 -402 99 -398 99 -370 133 -372 99 -398 99 -166 129 -394 99 -266 67 -668 133 -1000 133 -734 131 -898 163 -324 131 -164 97 -424 99 -336 165 -328 163 -162 63 -946 129 -620 131 -130 129 -356 63 -296 131 -194 65 -390 97 -1692 129 -360 195 -390 127 -400 133 -200 65 -1034 133 -630 97 -162 129 -422 133 -1626 97 -368 133 -202 97 -1038 133 -498 133 -630 165 -730 97 -704 65 -134 97 -434 165 -462 99 -268 99 -628 165 -672 131 -1448 165 -604 167 -366 99 -398 131 -230 67 -438 65 -134 133 -432 67 -430 97 -232 65 -404 101 -426 131 -198 97 -756 131 -290 165 -298 99 -200 65 -1330 99 -702 131 -462 229 -294 161 -656 97 -196 97 -390 165 -1510 63 -2134 131 -328 129 -164 97 -726 99 -166 67 -134 97 -66 65 -730 99 -264 133 -266 165 -298 67 -1132 99 -1000 101 -200 67 -766 101 -368 165 -404 133 -832 99 -604 133 -640 197 -234 101 -134 99 -432 99 -100 133 -792 131 -168 101 -500 99 -298 101 -764 RAW_Data: 133 -334 97 -196 97 -266 131 -202 167 -798 97 -966 99 -802 65 -396 65 -1062 101 -794 97 -770 131 -230 133 -728 99 -398 99 -268 133 -268 101 -1004 65 -964 97 -402 101 -438 131 -1168 97 -1494 65 -1446 99 -202 65 -566 131 -306 99 -198 65 -234 131 -470 63 -1092 165 -660 99 -266 131 -1006 67 -198 99 -3394 65 -696 199 -1100 65 -228 163 -230 131 -360 65 -228 97 -230 97 -164 97 -228 197 -164 135 -332 165 -166 133 -168 131 -1696 97 -1742 99 -556 131 -1180 65 -534 67 -794 65 -360 99 -2958 99 -532 65 -234 101 -166 67 -232 99 -734 99 -528 65 -432 65 -198 133 -66 197 -334 63 -924 131 -754 131 -1064 67 -298 99 -566 65 -330 65 -202 65 -998 65 -2024 163 -834 99 -366 65 -398 167 -5114 755 -4222 691 -310 657 -348 247 -724 257 -714 257 -726 283 -698 669 -302 683 -294 703 -312 285 -694 679 -290 679 -308 691 -318 657 -290 289 -702 677 -316 659 -324 297 -678 677 -316 691 -292 693 -4228 675 -318 667 -304 281 -692 289 -700 285 -694 281 -728 669 -302 683 -294 701 -312 285 -664 683 -324 673 -312 657 -316 691 -290 283 -702 677 -318 659 -322 295 -674 707 -284 697 -274 685 -4252 677 -318 663 -304 317 -688 259 -698 309 -696 283 -684 677 -316 661 -342 653 -294 309 -692 675 -318 659 -324 655 -344 657 -318 287 -698 683 -278 695 -310 285 -694 675 -318 663 -302 683 -4250 675 -320 659 -292 303 -682 291 -700 311 -662 317 -690 677 -318 661 -292 703 -310 269 -696 669 -316 691 -290 677 -310 689 -320 287 -682 685 -314 657 -314 285 -694 677 -316 663 -294 701 -4224 677 -318 661 -322 293 -676 289 -700 297 -696 281 -694 679 -294 701 -312 657 -316 285 -688 681 -314 695 -310 649 -294 701 -302 277 -700 681 -314 681 -290 285 -704 677 -318 659 -292 721 -4218 675 -318 693 -290 295 -680 291 -702 275 -698 313 -686 677 -318 663 -304 681 -294 277 -716 671 -318 659 -324 661 -344 655 -318 285 -698 685 -278 693 -312 285 -686 677 -316 661 -306 683 -4248 679 -318 663 -304 317 -656 289 -700 311 -662 317 -692 677 -318 663 -292 705 -310 271 -696 687 -312 657 -292 701 -312 657 -316 287 -686 677 -316 693 -310 287 -694 677 -318 665 -300 679 -4246 677 -318 665 -300 279 -692 289 -700 309 -662 317 -692 677 -318 667 -300 683 -294 277 -716 677 -320 659 -290 689 -310 689 -320 287 -682 687 -314 657 -314 287 -694 677 -318 663 -304 681 -4254 677 -286 701 -300 277 -684 289 -698 285 -726 277 -704 677 -294 699 -274 RAW_Data: 693 -320 273 -696 681 -290 681 -308 691 -320 677 -290 295 -680 677 -318 695 -290 295 -678 675 -320 695 -258 721 -4222 677 -320 673 -294 301 -682 291 -696 311 -664 317 -692 673 -320 665 -300 681 -294 275 -718 677 -318 661 -290 687 -308 691 -320 285 -698 683 -280 691 -312 287 -694 677 -318 663 -144512 67 -362 131 -164 97 -456 99 -268 167 -674 133 -404 165 -334 165 -168 67 -404 133 -440 165 -304 165 -568 163 -298 97 -1054 65 -864 165 -302 101 -370 67 -764 97 -362 65 -690 99 -2320 99 -200 65 -1630 131 -564 99 -200 67 -302 65 -762 65 -366 99 -432 131 -134 131 -166 99 -366 133 -168 103 -668 99 -166 133 -304 133 -338 65 -200 99 -768 99 -368 131 -264 101 -402 65 -1062 131 -134 65 -434 133 -234 65 -396 99 -166 133 -366 65 -432 99 -766 167 -762 165 -1320 65 -490 97 -396 131 -464 97 -1346 99 -230 63 -420 97 -324 127 -822 131 -1558 65 -472 99 -500 65 -134 131 -434 65 -664 163 -470 133 -328 131 -1228 97 -164 97 -692 129 -936 133 -1882 99 -1620 63 -1118 97 -488 129 -728 99 -466 101 -468 65 -198 131 -202 65 -266 167 -630 65 -232 99 -1590 131 -666 97 -1294 99 -728 97 -564 67 -436 97 -22018 99 -1560 101 -200 65 -1896 65 -532 133 -202 97 -2158 133 -1600 65 -1016 65 -198 65 -260 67 -1154 65 -2234 97 -1188 133 -232 101 -336 99 -2400 99 -856 133 -884 97 -1312 129 -456 129 -746 65 -988 165 -324 99 -430 129 -164 99 -362 129 -360 131 -428 131 -598 65 -464 99 -468 131 -22500 65 -758 67 -2260 99 -164 99 -658 63 -228 163 -708 65 -730 99 -370 99 -728 97 -502 67 -298 165 -968 99 -198 65 -398 129 -882 131 -358 97 -22984 65 -688 97 -196 97 -718 131 -1210 129 -654 99 -170 135 -168 67 -338 135 -266 65 -500 65 -794 99 -100 99 -406 97 -234 65 -168 99 -406 63 -100 165 -200 99 -1298 131 -772 165 -704 65 -132 65 -1660 163 -360 133 -830 97 -724 99 -732 99 -426 63 -1356 165 -1180 131 -228 129 -720 167 -832 131 -262 163 -590 131 -400 99 -234 133 -166 67 -1598 99 -1428 65 -592 163 -286 131 -816 133 -266 167 -500 131 -698 133 -468 99 -402 99 -434 167 -200 165 -162 99 -304 101 -738 133 -336 99 -1800 165 -732 133 -722 67 -556 97 -326 97 -164 163 -458 99 -434 65 -166 65 -198 161 -1148 165 -914 99 -162 65 -130 165 -992 163 -952 65 -560 99 -826 65 -664 163 -620 197 -350 161 -292 161 -388 65 -494 65 -432 67 -202 101 -234 65 -722 RAW_Data: 163 -196 63 -460 163 -468 65 -166 99 -334 129 -666 63 -230 63 -66 97 -328 129 -232 127 -494 129 -358 131 -260 197 -322 97 -628 99 -656 163 -358 99 -2128 133 -336 99 -1070 165 -368 99 -1004 65 -332 65 -330 163 -102 99 -2830 65 -1434 65 -800 65 -530 65 -1516 131 -400 97 -554 63 -300 99 -334 99 -1130 65 -896 99 -166 65 -1724 131 -270 99 -1068 131 -1168 97 -52402 99 -2098 99 -196 65 -454 65 -1644 97 -1754 65 -332 97 -794 131 -364 165 -330 99 -2220 129 -468 197 -1090 97 -360 65 -1746 63 -164 127 -784 131 -1284 65 -396 65 -390 97 -422 65 -428 97 -592 97 -1312 65 -694 131 -266 67 -732 97 -460 195 -360 65 -982 97 -2244 133 -472 99 -1096 97 -1762 65 -1664 131 -134 131 -1192 97 -1736 131 -204 99 -668 99 -602 165 -654 163 -324 161 -328 129 -960 65 -466 101 -768 131 -1588 99 -502 67 -988 65 -952 129 -424 65 -228 161 -162 129 -452 131 -954 65 -954 99 -328 65 -1564 133 -1300 131 -164 133 -728 135 -200 165 -298 131 -1572 131 -328 65 -164 133 -336 99 -1260 133 -370 97 -466 67 -830 197 -1260 131 -330 131 -1034 65 -198 97 -1378 133 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/hollarm.sub ================================================ Filetype: Flipper SubGhz Key File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: Hollarm Bit: 42 Key: 00 00 00 ED 24 3C 22 6F ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/hollarm_raw.sub ================================================ Filetype: Flipper SubGhz RAW File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: RAW RAW_Data: 211 -978 199 -1602 209 -988 193 -990 217 -1592 209 -1616 205 -958 201 -1618 211 -1574 195 -1628 193 -1590 201 -992 209 -2406 199 -1604 195 -1592 195 -1616 193 -990 185 -1628 211 -1586 201 -986 201 -1608 211 -984 199 -996 233 -1576 195 -998 203 -990 195 -1632 193 -994 189 -998 205 -990 199 -1006 205 -1586 197 -1596 225 -1584 195 -1614 195 -992 211 -1020 195 -960 207 -984 195 -1618 201 -998 247 -952 199 -998 201 -1610 197 -1002 205 -1018 197 -1566 193 -1618 201 -1000 209 -1582 195 -1632 195 -1560 197 -1638 207 -956 199 -2416 199 -1626 177 -1614 201 -1580 201 -1032 213 -1548 197 -1626 193 -994 187 -1628 207 -950 225 -992 203 -1588 207 -1026 203 -968 205 -1622 197 -970 191 -1028 209 -982 199 -1028 205 -1552 201 -1628 201 -1556 207 -1632 197 -974 239 -978 201 -982 205 -1022 199 -1572 201 -1032 177 -984 197 -1024 185 -1594 209 -1016 201 -1000 211 -1594 197 -1572 201 -1034 177 -1582 197 -1626 195 -1622 193 -1556 199 -1030 207 -2384 199 -1594 195 -1618 201 -1562 241 -982 195 -1630 195 -1590 195 -1022 189 -1590 185 -1030 205 -954 227 -1590 191 -996 207 -1030 195 -1584 195 -1026 185 -1000 197 -974 205 -1020 199 -1572 227 -1584 193 -1616 195 -1586 201 -1028 207 -956 203 -1016 203 -986 203 -1610 211 -980 199 -976 235 -992 195 -1620 193 -996 211 -974 201 -1590 211 -1610 201 -980 193 -1620 191 -1592 209 -1618 205 -1586 197 -1000 191 -2416 205 -1586 207 -1564 225 -1586 227 -958 221 -1620 189 -1590 215 -994 207 -1588 229 -968 191 -996 205 -1588 229 -972 189 -1028 211 -1574 227 -1000 193 -962 243 -1002 201 -968 201 -1612 197 -1594 203 -1592 209 -1618 207 -958 203 -992 229 -1006 201 -980 199 -1602 195 -996 189 -1028 213 -976 201 -1592 209 -980 195 -1026 187 -1590 211 -1608 201 -978 205 -1610 211 -1606 199 -1574 201 -1596 201 -994 195 -2424 193 -1588 227 -1554 235 -1592 205 -988 227 -1562 201 -1620 195 -990 211 -1608 199 -978 205 -1014 199 -1574 201 -1032 211 -958 199 -1626 211 -958 199 -1038 211 -974 201 -962 229 -1600 195 -1622 193 -1588 193 -1618 195 -988 185 -1032 205 -960 203 -1014 237 -1546 201 -1028 187 -996 201 -978 223 -1582 225 -994 211 -986 199 -1624 213 -1550 195 -1036 201 -1556 207 -1630 197 -1602 195 -1590 193 -1022 189 -2382 215 -1590 211 -1586 203 -1580 195 -1020 225 -1558 185 -1628 209 -988 225 -1580 195 -1020 191 -996 205 -1620 197 -970 191 -996 207 -1594 197 -1004 239 -980 199 -980 205 -1016 199 -1576 201 -1628 203 -1606 213 -1550 195 -1034 203 -976 199 -976 225 -990 211 -1614 199 -978 205 -992 193 -1032 203 -1574 213 -1002 201 -968 RAW_Data: 207 -1594 231 -1598 195 -1000 207 -1576 245 -1564 193 -1618 195 -1554 257 -990 207 -2372 207 -1596 193 -1590 225 -1586 225 -958 221 -1590 219 -1592 213 -982 193 -1586 199 -1040 211 -970 201 -1588 209 -986 201 -1006 209 -1596 193 -1024 193 -994 211 -1002 201 -968 207 -1596 229 -1566 201 -1596 201 -1618 211 -982 199 -978 199 -1018 201 -996 199 -1606 197 -998 207 -988 229 -974 203 -1612 211 -974 201 -1014 207 -1554 225 -1584 225 -960 219 -1590 219 -1590 215 -1590 185 -1624 185 -998 199 -2404 195 -1626 195 -1556 235 -1594 191 -996 207 -1584 229 -1600 193 -998 205 -1584 207 -1004 201 -992 203 -1580 201 -1030 211 -960 197 -1630 211 -958 199 -1008 241 -964 201 -996 197 -1602 195 -1628 195 -1560 235 -1592 211 -958 199 -1032 207 -964 203 -996 241 -1568 195 -1032 193 -992 211 -976 201 -1606 209 -960 235 -996 207 -1558 259 -1554 195 -1020 225 -1558 209 -1620 207 -1552 201 -1626 199 -996 233 -2368 195 -1588 225 -1586 225 -1552 227 -992 207 -1584 201 -1612 195 -1000 205 -1584 207 -1004 203 -992 201 -1582 227 -994 205 -982 195 -1624 195 -994 189 -1032 211 -970 201 -994 237 -1546 201 -1624 201 -1570 247 -1550 229 -1008 201 -994 197 -976 203 -1016 199 -1574 201 -1030 185 -998 199 -1010 201 -1566 211 -1022 201 -998 213 -1596 197 -1570 201 -1030 185 -1594 247 -1544 197 -1626 195 -1588 193 -1024 205 -2378 207 -1594 195 -1588 227 -1586 225 -960 219 -1594 207 -1584 201 -1010 193 -1588 205 -1014 201 -980 191 -1620 191 -996 207 -1028 195 -1582 195 -1028 213 -956 199 -976 237 -996 201 -1606 211 -1582 197 -1602 193 -1596 201 -1000 211 -982 201 -1030 205 -954 203 -1612 211 -978 195 -1024 185 -996 201 -1610 195 -1002 205 -984 225 -1560 225 -1588 227 -958 219 -1594 219 -1558 217 -1596 211 -1610 201 -982 205 -2402 211 -1608 199 -1572 203 -1592 225 -960 245 -1598 197 -1600 195 -998 205 -1582 209 -1004 201 -960 197 -1630 195 -1000 243 -946 231 -1596 195 -994 191 -996 205 -994 199 -998 199 -1610 195 -1598 239 -1550 193 -1620 191 -996 207 -1032 201 -964 201 -984 203 -1628 207 -968 199 -1014 201 -994 199 -1604 195 -996 189 -1030 211 -1570 193 -1622 193 -990 189 -1628 207 -1586 207 -1556 227 -1588 225 -958 219 -2388 209 -1618 205 -1592 195 -1598 201 -998 207 -1600 193 -1592 201 -992 211 -1608 199 -978 203 -1016 201 -1578 201 -1030 185 -996 197 -1602 197 -996 191 -1028 211 -972 195 -992 247 -1548 229 -1596 197 -1588 195 -1616 195 -990 185 -1028 207 -960 235 -994 201 -1578 201 -1030 185 -996 199 -1008 195 -1582 193 -1028 211 -980 201 -1604 209 -1582 197 -1008 195 -1588 RAW_Data: 203 -1610 211 -1606 199 -1574 201 -1000 215 -2388 211 -1580 195 -1626 195 -1560 271 -960 211 -1574 229 -1566 201 -1026 209 -1588 197 -1008 201 -996 197 -1602 193 -996 189 -996 241 -1570 195 -1032 203 -976 199 -976 205 -1024 199 -1570 201 -1622 195 -1622 203 -1554 207 -1000 235 -962 201 -1012 195 -992 211 -1608 201 -982 205 -984 229 -970 237 -1556 243 -974 195 -990 209 -1608 201 -1608 197 -998 207 -1578 245 -1564 193 -1588 227 -1584 225 -994 205 -2380 207 -1556 259 -1556 193 -1616 225 -958 219 -1594 209 -1580 199 -1014 195 -1582 255 -960 211 -982 201 -1602 209 -986 195 -1018 193 -1592 211 -1020 193 -992 189 -1030 211 -970 201 -1608 211 -1554 197 -1630 195 -1622 195 -990 189 -996 205 -988 201 -996 201 -1606 195 -998 189 -1030 211 -976 203 -1588 211 -986 199 -1008 209 -1596 195 -1584 227 -990 187 -1624 187 -1594 243 -1548 201 -1610 195 -998 189 -2414 189 -1620 191 -1590 185 -1622 185 -998 235 -1584 195 -1622 193 -992 189 -1626 207 -950 195 -1022 225 -1556 209 -1020 195 -998 207 -1582 245 -968 203 -1012 205 -956 203 -994 195 -1630 193 -1590 227 -1552 225 -1590 199 -998 201 -1016 199 -990 213 -1006 195 -1586 193 -1026 185 -998 199 -974 225 -1584 203 -998 241 -968 195 -1618 195 -1584 191 -1028 211 -1574 193 -1592 225 -1558 271 -1554 191 -1028 211 -2366 227 -1562 237 -1586 199 -1568 211 -1016 193 -1580 197 -1614 195 -990 211 -1612 199 -982 239 -996 197 -1600 195 -994 191 -996 205 -1586 229 -968 191 -1032 211 -976 201 -996 239 -1548 201 -1624 201 -1590 209 -1582 197 -1028 195 -992 211 -972 223 -990 211 -1552 263 -978 203 -978 199 -1012 201 -1568 211 -1018 201 -1000 213 -1596 197 -1566 227 -992 205 -1620 211 -1566 193 -1592 227 -1554 235 -1000 213 -2398 199 -1570 201 -1598 203 -1610 211 -984 199 -1606 209 -1584 197 -1010 199 -1570 211 -1018 201 -1000 211 -1594 199 -970 193 -1028 211 -1572 195 -1028 195 -992 211 -1006 201 -966 201 -1614 197 -1594 193 -1618 201 -1564 245 -982 195 -1000 205 -984 229 -970 191 -1626 203 -984 195 -1028 193 -992 211 -1604 197 -974 203 -1026 199 -1574 203 -1594 203 -990 197 -1630 193 -1560 271 -1554 189 -1628 205 -988 193 -2382 237 -1588 199 -1592 211 -1596 199 -974 191 -1622 189 -1624 205 -968 235 -1576 197 -1000 191 -996 241 -1570 193 -1028 195 -992 211 -1604 199 -976 203 -990 195 -1028 201 -978 197 -1606 195 -1628 195 -1558 235 -1588 187 -996 201 -1016 199 -1006 205 -952 255 -1584 193 -962 279 -948 199 -1006 205 -1582 229 -968 191 -1028 211 -1574 193 -1594 227 -960 243 -1590 205 -1588 197 -1600 201 -1596 203 -990 RAW_Data: 195 -2422 193 -1584 227 -1618 191 -1558 235 -994 209 -1558 225 -1588 237 -956 211 -1612 197 -980 205 -1000 245 -1560 193 -1026 193 -994 211 -1598 197 -974 205 -1022 199 -980 203 -1022 199 -1570 201 -1598 201 -1588 207 -1620 199 -972 237 -992 211 -974 201 -1012 207 -1550 227 -992 237 -958 195 -1034 193 -1588 189 -1032 211 -974 201 -1608 211 -1556 195 -1034 199 -1558 243 -1596 197 -1602 195 -1594 195 -1026 205 -2388 185 -1592 211 -1602 199 -1574 227 -992 203 -1614 211 -1570 193 -1030 203 -1554 207 -1032 201 -970 207 -1590 229 -968 191 -1030 211 -1572 195 -1032 203 -958 195 -1004 205 -1022 197 -1568 227 -1590 201 -1600 203 -1586 207 -990 225 -958 217 -1000 239 -950 225 -1588 225 -962 209 -996 225 -990 185 -1624 209 -956 225 -962 211 -1616 199 -1608 195 -1002 205 -1608 211 -1568 195 -1588 227 -1588 237 -956 211 -2406 199 -1604 195 -1594 201 -1596 209 -990 201 -1592 209 -1584 233 -986 201 -1590 211 -984 201 -976 203 -1614 197 -1000 207 -988 229 -1566 237 -990 185 -996 197 -1012 201 -996 197 -1602 195 -1592 193 -1616 201 -1598 203 -982 195 -998 223 -990 211 -984 201 -1590 213 -984 195 -1024 187 -994 201 -1610 195 -1004 203 -1000 209 -1562 225 -1586 227 -956 243 -1582 207 -1596 229 -1566 203 -1598 201 -982 197 -2426 193 -1588 227 -1554 271 -1550 193 -1028 211 -1578 195 -1622 193 -992 187 -1622 189 -996 205 -988 225 -1556 203 -1014 237 -952 203 -1618 211 -976 201 -1010 205 -966 225 -964 245 -1564 231 -1598 195 -1590 193 -1618 193 -990 185 -1030 207 -964 201 -1016 237 -1548 201 -1028 211 -960 199 -1032 207 -1556 235 -990 187 -996 203 -1612 197 -1596 201 -998 209 -1560 227 -1590 201 -1624 201 -1572 211 -1012 201 -2360 243 -1580 207 -1586 229 -1566 203 -1002 209 -1580 227 -1596 195 -958 251 -1592 207 -988 195 -1000 191 -1624 205 -982 193 -994 189 -1626 205 -952 257 -964 235 -960 195 -1036 201 -1556 207 -1630 199 -1600 195 -1594 201 -998 207 -1002 201 -958 231 -1006 193 -1622 203 -976 199 -974 191 -1028 211 -1576 227 -968 227 -960 245 -1596 197 -1602 195 -1000 205 -1584 207 -1598 193 -1586 225 -1584 225 -986 189 -2420 207 -1550 201 -1614 195 -1624 195 -994 189 -1626 207 -1550 203 -1016 201 -1592 211 -1008 201 -966 209 -1628 197 -972 191 -1028 211 -1576 195 -1030 201 -978 199 -1006 193 -992 211 -1610 199 -1576 195 -1620 195 -1614 195 -990 211 -956 235 -996 207 -998 201 -1586 213 -978 195 -1024 187 -998 199 -1606 195 -1004 205 -1000 207 -1562 225 -1588 225 -960 219 -1592 219 -1594 207 -1586 199 -1612 195 -998 207 -2372 209 -1598 231 -1562 195 -1614 RAW_Data: 195 -986 219 -1592 209 -1618 207 -960 203 -1624 211 -974 193 -1026 211 -1566 207 -996 235 -962 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/holtek.sub ================================================ Filetype: Flipper SubGhz Key File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: Holtek Bit: 40 Key: 00 00 00 50 00 00 AA BA ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/holtek_ht12x.sub ================================================ Filetype: Flipper SubGhz Key File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: Holtek_HT12X Bit: 12 Key: 00 00 00 00 00 00 0F FB TE: 205 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/holtek_ht12x_raw.sub ================================================ Filetype: Flipper SubGhz RAW File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: RAW RAW_Data: 97 -264 65 -1890 231 -366 165 -232 99 -166 297 -68 401 -100 97 -100 759 -264 823 -132 919 -98 65 -230 367 -98 1055 -52 51 -104 101 -126 173 -148 151 -100 153 -222 77 -288 53 -280 331 -212 81 -108 246 -156 267 -268 183 -1260 53 -622 51 -468 183 -264 105 -990 77 -421 75 -52 53 -214 185 -504 75 -563 131 -338 165 -82 133 -80 53 -236 231 -208 282 -836 187 -406 81 -102 181 -54 107 -415 81 -54 109 -298 55 -406 323 -136 299 -136 437 -52 133 -294 53 -110 133 -420 333 -402 269 -574 79 -270 163 -594 124 -52 51 -320 79 -324 109 -78 105 -236 79 -292 53 -432 181 -110 187 -268 107 -78 79 -188 79 -78 75 -130 75 -128 103 -628 79 -322 79 -136 81 -196 85 -296 51 -349 159 -325 131 -80 131 -80 402 -110 55 -194 109 -108 53 -108 135 -224 81 -162 57 -228 161 -357 105 -54 103 -347 279 -294 422 -152 51 -104 99 -146 147 -205 77 -216 107 -52 181 -52 107 -158 105 -52 133 -134 139 -418 291 -102 103 -106 105 -584 103 -540 53 -52 153 -208 227 -128 307 -184 105 -328 109 -862 129 -196 55 -244 51 -1501 55 -82 81 -326 79 -500 103 -406 207 -130 75 -126 155 -202 53 -376 135 -158 53 -428 107 -467 167 -138 81 -106 79 -346 157 -84 143 -144 85 -136 53 -308 189 -248 79 -711 109 -592 107 -220 107 -104 77 -583 131 -158 53 -110 135 -191 107 -748 105 -478 77 -398 107 -138 83 -410 127 -477 103 -162 119 -72 103 -442 129 -237 107 -664 175 -74 147 -406 53 -78 127 -178 51 -102 101 -259 125 -202 257 -210 77 -52 77 -130 251 -230 77 -76 77 -178 155 -98 97 -100 153 -54 185 -82 79 -82 135 -398 241 -130 77 -76 311 -210 53 -238 181 -404 241 -352 189 -270 265 -164 215 -998 157 -82 77 -106 51 -54 75 -100 328 -178 103 -224 253 -341 147 -334 446 -76 125 -100 75 -126 173 -690 75 -250 51 -554 81 -300 53 -188 53 -106 265 -1024 105 -646 221 -82 191 -362 75 -234 131 -128 83 -224 55 -240 77 -376 157 -78 187 -358 389 -76 103 -128 199 -513 83 -492 129 -618 123 -52 129 -52 79 -376 101 -688 105 -110 55 -84 179 -152 51 -486 358 -276 99 -74 73 -679 51 -210 113 -196 365 -104 223 -104 53 -430 55 -140 55 -84 153 -202 181 -358 149 -820 103 -80 215 -108 309 -368 105 -538 154 -732 233 -588 53 -253 155 -288 55 -136 55715 -102 407 -100 259 -78 157 -130 206 -52 258 -78 441 -104 77 -80 492 -104 182 -104 79 -155 RAW_Data: 287 -78 807 -104 1588 -52 2952 -78 1018 -240 341 -262 361 -258 335 -280 309 -100 509 -280 307 -302 307 -6968 321 -290 293 -298 323 -294 289 -314 285 -334 285 -330 257 -330 281 -328 293 -310 281 -124 479 -330 281 -326 267 -6994 295 -324 267 -320 287 -340 259 -332 257 -358 257 -354 257 -328 257 -352 257 -352 255 -150 455 -360 255 -326 255 -7024 253 -352 255 -352 255 -354 267 -326 269 -352 239 -346 261 -362 233 -358 257 -356 255 -152 455 -334 255 -354 255 -7006 267 -342 267 -352 241 -350 263 -342 259 -362 233 -356 257 -356 231 -378 231 -380 231 -150 455 -358 231 -378 229 -7050 229 -378 229 -352 253 -352 239 -372 239 -380 243 -348 235 -368 231 -388 231 -356 233 -176 431 -384 229 -380 231 -7028 239 -368 241 -372 241 -350 239 -372 233 -366 233 -384 231 -358 231 -380 231 -378 231 -176 429 -384 205 -402 205 -7064 213 -380 243 -378 215 -374 233 -368 233 -386 231 -382 205 -382 231 -380 229 -380 231 -176 429 -386 203 -378 231 -7062 229 -378 229 -378 229 -378 229 -378 213 -396 203 -404 203 -404 203 -404 203 -404 203 -198 431 -376 215 -376 239 -7064 235 -364 231 -386 231 -384 205 -408 205 -380 231 -380 231 -380 231 -378 207 -404 205 -200 431 -384 205 -404 205 -7118 205 -408 205 -406 205 -408 205 -408 205 -408 205 -436 179 -440 283 -460 75 -1486 105 -54 103 -784 107 -218 113 -824 125 -2140 85 -583 51 -1291 53 -722 113 -622 107 -1176 51 -52 75 -152 113 -56 111 -784 105 -436 81 -112 85 -272 53 -406 81 -1345 105 -3008 53 -1418 105 -254 107 -874 131 -818 53 -595 77 -130 123 -1088 213 -724 131 -793 99 -428 75 -288 51 -334 101 -1471 81 -274 53 -164 107 -2618 129 -532 55 -366 297 -160 83 -166 184 -208 57 -196 328 -1640 235 -1743 79 -594 51 -76 77 -270 163 -728 51 -408 55 -354 101 -126 153 -184 133 -392 53 -604 77 -804 127 -965 51 -78 103 -668 262 -210 237 -439 75 -340 77 -106 105 -1775 79 -284 51 -3100 157 -433 55 -1355 107 -198 165 -82 79 -770 79 -1587 81 -638 79 -530 103 -703 51 -396 71 -956 151 -248 53 -553 103 -154 75 -806 75 -660 53 -698 127 -1210 53 -3175 79 -608 245 -1590 207 -164 107 -232 51 -1094 99 -695 135 -955 53 -804 217 -587 55 -1452 163 -1232 79 -968 79 -720 81 -1110 129 -1194 105 -1736 79 -386 79 -184 77 -652 75 -2442 103 -555 129 -125 75 -1115 81 -108 135 -980 53 -808 105 -1001 155 -1068 131 -850 99 -268 51 -1106 159 -2408 79 -612 51 -1191 RAW_Data: 135 -212 77 -2816 137 -980 51 -1921 79 -1554 53 -906 83 -1042 99 -5161 51 -290 75 -558 51 -260 77 -738 99 -2128 105 -1384 53 -108 79 -188 55 -830 77 -5690 109 -2652 51 -1374 53 -2469 79 -2163 203 -152 71 -1459 79 -2741 105 -262 75 -1194 75 -228 153 -210 107 -3236 107 -1500 77 -3562 79 -170 55 -540 53 -1270 51 -304 51 -2071 137 -134 105 -266 101 -834 51 -8117 73 -3292 81 -732 181 -1539 53 -132 109 -1375 77 -132 81 -1061 77 -1620 79 -1373 105 -643 183 -190 53 -620 77 -1633 55 -931 51 -398 135 -924 111 -1122 51 -128 125 -2361 97 -2571 51 -3563 51 -794 77 -844 81 -788 81 -2040 77 -232 77 -1000 131 -322 73 -848 55 -336 107 -1546 81 -602 79 -954 107 -1824 73 -1131 240 -1048 197 -2442 73 -720 127 -78 77 -574 79 -624 101 -5754 103 -1829 149 -719 77 -982 53 -250 53 -634 161 -2201 75 -3483 149 -356 73 -98 123 -176 75 -702 231 -1633 121 -704 53 -1163 51 -1227 73 -368 123 -258 103 -530 279 -628 53 -884 55 -82 101 -102 135 -162 107 -1264 159 -3370 77 -3538 131 -130 81 -2460 129 -588 51 -514 77 -376 53 -616 53 -956 51 -1508 53 -1044 53 -1160 261 -442 53 -640 83 -300 79 -1723 75 -124 125 -532 103 -500 79 -764 53 -1220 279 -458 77 -548 159 -450 223 -718 55 -716 51 -716 203 -732 79 -6974 53 -1086 51 -1794 79 -882 53 -4221 53 -1070 77 -1126 75 -2307 155 -1233 131 -156 111 -1352 51 -478 51 -154 75 -724 51 -635 103 -652 77 -294 75 -268 81 -1046 177 -1778 51 -298 109 -336 77 -80 53 -192 133 -556 99 -394 81 -654 51 -106 79 -1893 55 -240 55 -136 55 -2680 77 -136 81 -164 53 -576 135 -3304 131 -654 103 -788 53 -224 187 -354 79 -1872 81 -290 207 -410 77 -1132 55 -112 57 -512 51 -2736 123 -404 239 -1283 51 -1526 213 -720 133 -354 109 -396 77 -1518 105 -632 53 -164 53 -1090 55 -730 79 -1705 75 -370 75 -378 79 -2022 81 -2480 103 -1108 79 -106 53 -1784 105 -512 219 -669 179 -795 105 -376 105 -514 53 -402 53 -282 83 -554 133 -448 105 -972 79 -490 81 -1184 77 -216 109 -132 51 -164 135 -1570 51 -1329 79 -1218 53 -2450 75 -1246 51 -3825 77 -1114 53 -1718 51 -846 79 -826 165 -306 75 -3821 51 -606 55 -880 107 -56 55 -5505 53 -504 79 -1356 77 -569 51 -2268 149 -358 53 -1979 51 -106 103 -176 221 -508 51 -110 53 -3896 127 -234 79 -1012 79 -84 243 -2860 53 -1010 73 -286 133 -2198 151 -370 129 -1942 101 -154 109 -702 79 -696 51 -302 RAW_Data: 51 -744 83 -496 79 -672 77 -170 111 -264 103 -472 51 -524 75 -1172 51 -240 51963 -254 333 -278 333 -276 333 -278 305 -302 307 -76 531 -280 331 -276 331 -6938 347 -268 319 -272 319 -292 311 -312 283 -306 309 -304 283 -328 293 -310 281 -326 293 -110 479 -322 295 -322 291 -6964 283 -334 283 -304 283 -328 283 -328 281 -328 255 -354 265 -338 255 -352 255 -352 255 -124 481 -338 277 -328 279 -6984 269 -350 265 -320 287 -340 257 -332 257 -358 255 -356 255 -328 257 -354 257 -352 255 -150 455 -360 229 -376 231 -7040 239 -348 267 -350 239 -346 261 -364 231 -360 257 -356 231 -380 231 -378 231 -352 257 -150 453 -360 229 -378 229 -7032 239 -372 227 -378 227 -380 241 -352 241 -374 233 -366 233 -384 233 -356 231 -380 231 -176 431 -384 229 -354 255 -7030 231 -376 231 -376 229 -378 229 -378 229 -352 255 -352 255 -352 229 -378 229 -378 229 -174 427 -384 229 -376 241 -7040 241 -350 235 -368 233 -388 231 -358 233 -380 231 -380 229 -380 231 -380 229 -380 211 -192 421 -366 227 -380 227 -7068 239 -378 215 -402 209 -394 207 -388 231 -386 231 -384 205 -408 205 -408 205 -408 205 -202 409 -412 207 -1400 105 -1002 51 -9495 53 -250 57 -1093 155 -124 73 -344 75 -2759 83 -468 53 -738 77 -134 53 -1581 51 -106 127 -1209 121 -956 51 -918 83 -276 85 -1696 125 -618 81 -1666 51 -152 101 -1324 107 -54 141 -586 75 -784 55 -1828 51 -4052 81 -480 53 -218 141 -1346 105 -1152 127 -776 53 -426 135 -390 105 -939 81 -887 71 -492 107 -1311 105 -1844 101 -1340 77 -2586 51 -2637 51 -1626 105 -54 53 -1672 151 -2830 57 -3143 51 -1859 79 -929 179 -78 77 -890 73 -894 79 -80 79 -1184 53 -323 53 -1344 79 -636 53 -1808 55 -3048 79 -2287 53 -572 51 -822 51 -608 77 -1772 75 -2521 79 -162 81 -664 163 -110 83 -524 53 -930 53 -1816 79 -1305 51 -816 53 -1358 55 -822 55 -594 81 -2230 55 -234 77 -600 201 -3174 151 -2534 71 -122 51 -1370 81 -3130 127 -236 79 -728 101 -1472 53 -800 127 -528 51 -802 77 -52 99 -3144 77 -6346 51 -1090 81 -588 79 -292 169 -2345 107 -370 187 -1218 81 -296 75 -696 51 -516 77 -2154 75 -558 75 -816 103 -2200 125 -2766 229 -376 151 -3375 79 -1466 53 -535 167 -524 217 -54 131 -3408 51 -54 109 -1886 77 -732 83 -536 99 -3128 103 -168 57 -1852 51 -574 79 -296 155 -844 99 -767 147 -2406 99 -1014 81 -4460 175 -226 195 -454 73 -2236 53 -818 155 -352 83 -752 79 -5083 51 -1716 RAW_Data: 77 -1925 51 -1760 81 -162 53 -1469 79 -362 53 -471 103 -750 53 -562 127 -238 79 -250 107 -52 53 -210 83 -504 79 -1566 107 -82 79 -968 53 -458 131 -1944 301 -594 79 -382 51 -1196 79 -3963 183 -670 111 -360 105 -1990 53 -1084 79 -658 73 -301 73 -264 75 -1335 79 -1110 81 -1856 159 -3986 75 -1262 53 -1189 53 -158 53 -903 81 -1135 133 -350 107 -178 151 -1096 73 -2734 81 -1280 107 -950 79 -52 53 -5912 53 -1653 111 -1601 79 -742 51 -1104 55 -1254 51 -867 53 -136 109 -813 79 -1082 53 -395 53 -54 109 -504 79 -218 109 -114 57 -1620 157 -3003 79 -656 53 -510 209 -1933 107 -1197 159 -5508 79 -1164 77 -1466 77 -742 101 -124 71 -2049 85 -144 109 -1304 105 -2310 55 -381 83 -114 113 -944 103 -184 83 -558 55 -2064 109 -760 75 -1036 77 -574 51 -134 131 -224 57 -104 53 -440 53 -1262 183 -2454 51 -1966 73 -1950 125 -1095 51 -480 121 -1994 57 -1930 103 -786 79 -2272 105 -3312 51 -746 127 -144 133 -1608 77 -692 51 -1136 53 -164 55 -573 55 -3110 53 -1558 105 -6248 53 -1051 111 -886 105 -2234 103 -106 53 -1256 101 -1446 111 -974 79 -851 81 -136 193 -3392 83 -582 103 -1197 111 -196 55 -906 51 -742 77 -2038 71 -686 53 -1943 51 -134 51 -852 51 -1658 133 -2050 161 -388 77 -326 81 -412 55 -1137 81 -3256 55 -1516 53 -1414 117 -372 51 -1144 199 -3087 51 -430 75 -1856 151 -128 95 -192 398 -1207 77 -280 51 -2716 51 -808 53 -78 77 -1524 109 -54 79 -410 79 -132 53 -770 109 -2066 185 -368 131 -2102 125 -1037 75 -780 127 -128 51 -176 53 -1982 77 -140 111 -1046 109 -3166 169 -1956 77 -4040 79 -2778 73 -204 129 -1546 82945 -150 359 -252 333 -76 533 -280 319 -286 305 -6960 319 -300 323 -270 317 -290 313 -308 283 -306 309 -304 283 -328 291 -310 281 -326 281 -124 481 -334 279 -302 305 -6970 293 -318 301 -304 279 -328 279 -328 277 -330 277 -330 293 -298 295 -320 287 -314 283 -128 489 -334 255 -330 281 -7012 265 -340 265 -344 251 -354 253 -354 269 -322 293 -322 263 -344 259 -336 257 -360 257 -152 457 -358 231 -354 257 -7060 237 -364 255 -354 237 -366 255 -354 255 -354 267 -352 241 -352 265 -348 261 -342 259 -154 439 -388 231 -358 255 -7114 237 -370 235 -394 233 -362 233 -386 233 -386 233 -386 233 -386 231 -388 233 -414 233 -180 441 -392 233 -1832 53 -564 53 -370 289 -867 201 -78 103 -352 213 -586 103 -1226 165 -112 55 -300 105 -975 107 -358 77 -410 55 -1777 51 -973 51 -828 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/holtek_raw.sub ================================================ Filetype: Flipper SubGhz RAW File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: RAW RAW_Data: 2243 -98 331 -100 1129 -66 761 -100 1393 -100 165 -66 2883 -64 357 -66 4703 -68 927 -98 233 -134 461 -66 3855 -134 165 -98 1281 -100 2053 -66 3061 -98 331 -98 8981 -66 365 -66 631 -100 1027 -100 4521 -134 597 -66 3187 -66 2619 -100 3011 -98 1151 -66 953 -100 1423 -66 1755 -166 333 -98 1557 -66 761 -66 865 -66 4837 -132 357 -132 2419 -100 1023 -66 65 -66 2507 -66 131 -66 761 -66 997 -66 333 -100 2259 -68 431 -100 2523 -66 987 -100 363 -66 363 -66 1197 -68 1589 -164 951 -96 5351 -66 697 -100 163 -100 4683 -66 2265 -68 2051 -64 457 -64 3005 -132 1057 -66 2221 -100 1661 -98 695 -100 99 -66 861 -66 1957 -100 731 -132 1857 -100 3177 -98 1807 -98 463 -66 499 -134 1129 -100 3737 -100 1889 -66 263 -98 623 -66 2103 -98 3165 -66 131 -100 195 -66 691 -66 67 -132 531 -66 1857 -100 199 -68 97 -68 197 -68 697 -68 233 -100 3749 -134 1691 -68 3289 -66 3751 -68 65 -100 853 -66 531 -132 1299 -66 1585 -98 65 -98 1577 -66 785 -98 1151 -66 165 -68 397 -100 4255 -100 857 -100 1017 -66 1575 -130 1255 -234 1923 -66 199 -102 301 -66 231 -66 691 -64 227 -64 195 -66 1257 -100 2353 -100 235 -100 1163 -66 5423 -66 2049 -66 1807 -66 523 -198 693 -100 367 -100 597 -100 4013 -100 233 -166 365 -66 1827 -100 1491 -100 785 -64 885 -66 599 -134 2847 -100 667 -100 4943 -98 3319 -98 6729 -98 361 -96 391 -66 723 -132 503 -66 1583 -166 297 -234 2045 -66 1185 -134 661 -66 195 -66 291 -164 523 -98 1679 -134 233 -132 761 -394 855 -100 2003 -164 261 -66 229 -96 953 -66 3889 -66 929 -66 993 -68 3099 -132 1673 -66 1833 -100 563 -100 1131 -100 3219 -232 4411 -100 1095 -100 5315 -100 631 -198 461 -198 1907 -100 1743 -68 863 -132 4013 -64 295 -66 3883 -100 2707 -198 923 -100 2539 -166 629 -100 563 -100 3783 -68 893 -66 2987 -98 2357 -98 1665 -66 599 -66 1259 -232 165 -66 1361 -66 1645 -166 1543 -66 565 -66 401 -134 465 -100 831 -98 2405 -100 1055 -66 2109 -100 1161 -68 431 -100 265 -68 235 -66 463 -66 3453 -100 433 -66 2693 -132 263 -166 729 -134 763 -134 1327 -100 397 -234 795 -68 563 -66 1625 -98 267 -66 4835 -66 197 -66 589 -66 7575 -100 1959 -100 131 -68 297 -134 261 -98 433 -66 1427 -66 2421 -100 2925 -166 1921 -134 1645 -66 97 -132 5423 -100 2423 -98 1065 -66 1715 -132 963 -66 2403 -66 1117 -328 1981 -66 527 -100 427 -164 865 -66 2129 -232 165 -68 165 -66 131 -366 131 -100 2613 -450 RAW_Data: 937 -900 447 -454 969 -884 479 -466 939 -452 935 -454 981 -454 943 -452 955 -458 945 -452 979 -444 943 -486 945 -448 951 -464 977 -440 967 -478 935 -480 951 -456 969 -460 975 -450 973 -450 979 -470 977 -450 981 -910 485 -466 939 -928 489 -448 971 -940 445 -484 951 -928 485 -484 945 -948 479 -456 973 -918 481 -944 451 -928 471 -478 995 -912 487 -472 977 -15948 479 -444 1021 -910 521 -444 995 -942 471 -480 991 -450 1013 -452 1023 -446 1001 -484 981 -486 1007 -458 1015 -470 1007 -450 1033 -452 1005 -480 1005 -458 1013 -470 1007 -482 1015 -450 1023 -482 1009 -462 1015 -468 1011 -484 983 -482 1021 -944 487 -484 1015 -942 471 -486 1003 -948 503 -478 991 -948 501 -478 1031 -914 521 -486 991 -946 519 -916 511 -944 485 -474 1009 -974 487 -482 1015 -16224 521 -468 1005 -970 503 -478 1001 -954 505 -458 1035 -484 1019 -482 1039 -482 1019 -486 1031 -490 1009 -478 1033 -486 1033 -486 1011 -494 1039 -478 1039 -450 1049 -486 1033 -488 1005 -476 1071 -448 1067 -486 1017 -468 1045 -482 1045 -484 1015 -952 515 -482 1043 -944 519 -482 1049 -950 519 -454 1039 -956 523 -484 1011 -960 505 -486 1065 -956 509 -926 539 -944 519 -480 1017 -984 521 -454 1037 -16440 553 -440 1043 -976 507 -460 1069 -940 513 -486 1041 -480 1067 -482 1033 -476 1061 -472 1043 -510 1049 -486 1041 -482 1043 -482 1065 -476 1037 -486 1069 -492 1037 -484 1047 -504 1047 -486 1041 -484 1041 -514 1015 -520 1049 -476 1053 -490 1041 -980 519 -486 1043 -962 507 -482 1049 -994 507 -500 1043 -946 507 -516 1033 -982 517 -478 1049 -984 509 -976 505 -950 527 -490 1039 -980 519 -486 1047 -111258 195 -428 263 -162 163 -362 97 -132 65 -98 163 -132 825 -100 795 -100 1795 -134 587 -66 229 -100 1349 -164 3261 -66 2305 -132 2219 -66 5549 -234 497 -132 201 -66 667 -298 2369 -68 4381 -66 3909 -134 923 -98 723 -100 1651 -168 1197 -100 65 -66 199 -68 195 -100 197 -134 1135 -66 2787 -66 3163 -68 231 -68 197 -100 6675 -100 667 -98 1125 -66 67 -98 2423 -66 2017 -332 2949 -100 1129 -68 1655 -100 1229 -66 1285 -130 163 -132 1315 -66 525 -98 295 -100 131 -64 427 -132 2207 -98 1153 -66 99 -100 697 -98 1397 -166 863 -66 1393 -132 5005 -66 497 -100 1753 -100 597 -66 1667 -66 397 -100 961 -66 763 -134 859 -64 689 -98 1917 -134 199 -234 167 -100 131 -166 2061 -66 1521 -98 759 -100 983 -66 825 -166 459 -66 2049 -166 1615 -100 829 -234 631 -66 465 -66 1493 -68 433 -66 1623 -132 65 -100 1133 -132 3083 -66 199 -132 199 -68 1257 -66 RAW_Data: 265 -68 1061 -98 533 -100 1233 -68 1721 -68 995 -100 2535 -66 4193 -232 727 -100 727 -100 2773 -66 133 -98 399 -134 233 -232 67 -66 497 -100 267 -132 1127 -134 1063 -66 565 -132 97 -132 523 -132 919 -66 891 -66 855 -98 495 -66 3363 -296 3199 -98 563 -66 133 -100 495 -98 1165 -134 1161 -166 1849 -98 853 -132 5647 -134 563 -98 1827 -100 131 -100 1125 -132 1659 -132 265 -68 1121 -66 465 -232 431 -68 3589 -98 197 -68 97 -164 1717 -66 1645 -66 397 -66 97 -68 231 -166 631 -100 627 -66 1757 -66 131 -164 527 -98 1285 -328 1213 -134 2059 -100 1791 -68 931 -66 1611 -66 1511 -66 2211 -66 2597 -100 2545 -98 197 -162 1089 -98 589 -360 495 -132 1685 -202 1095 -100 729 -100 2825 -100 231 -100 567 -100 231 -66 1027 -66 131 -68 525 -132 1613 -232 461 -232 1597 -66 627 -198 231 -98 131 -98 65 -100 1229 -68 2507 -64 1349 -66 195 -134 97 -66 1321 -100 855 -132 163 -132 1151 -100 1025 -164 329 -66 891 -98 951 -132 163 -166 591 -98 1149 -132 955 -66 1329 -98 923 -66 331 -64 4269 -66 797 -134 399 -98 267 -170 197 -100 429 -198 1225 -100 331 -100 231 -132 1463 -100 597 -164 331 -66 1863 -134 659 -98 5507 -100 719 -100 131 -64 655 -164 1579 -98 1423 -130 1381 -98 1317 -132 467 -66 495 -132 361 -132 4417 -98 631 -364 299 -100 1499 -132 267 -68 663 -98 691 -100 2433 -66 953 -98 721 -66 1355 -232 897 -134 897 -134 365 -100 267 -132 2059 -132 199 -102 797 -68 695 -66 601 -66 265 -68 499 -66 1327 -164 1355 -64 1279 -66 3257 -66 1351 -66 131 -96 359 -132 499 -232 623 -96 427 -68 1909 -98 591 -98 4671 -100 4541 -66 1491 -66 3347 -98 1277 -100 1679 -198 295 -130 357 -98 697 -98 865 -100 2817 -66 329 -98 787 -64 1117 -66 3313 -202 1721 -100 199 -100 399 -66 199 -132 1891 -100 235 -100 201 -134 765 -166 761 -132 1529 -66 629 -202 861 -130 3501 -98 1377 -100 1741 -164 1509 -66 735 -68 733 -66 265 -166 2015 -134 131 -100 663 -100 2995 -132 1577 -98 1885 -66 2461 -100 1189 -66 1425 -100 201 -100 1691 -100 199 -98 499 -166 233 -100 233 -134 661 -68 1393 -100 295 -164 2079 -66 1289 -66 329 -198 599 -100 465 -98 3995 -98 199 -268 2045 -264 199 -66 1593 -66 165 -68 1561 -164 629 -66 635 -100 1251 -230 2733 -66 1727 -66 629 -100 1229 -132 731 -66 163 -198 131 -100 693 -66 3223 -68 565 -132 1091 -134 531 -100 3223 -68 729 -100 1527 -134 895 -166 1265 -66 527 -100 201 -200 1463 -66 1233 -132 RAW_Data: 2397 -200 167 -234 1803 -66 821 -100 1351 -66 1687 -100 165 -66 233 -66 1125 -100 2203 -132 197 -98 97 -66 593 -164 4187 -102 529 -66 1161 -68 799 -66 427 -232 263 -66 589 -68 495 -68 197 -100 525 -66 327 -98 427 -130 1551 -66 727 -102 133 -234 265 -98 459 -66 2337 -64 585 -68 297 -68 691 -98 1857 -134 665 -132 365 -66 931 -166 495 -430 689 -196 1191 -98 465 -100 931 -366 1351 -102 3185 -164 1151 -98 2465 -66 2193 -100 331 -134 165 -98 267 -166 1985 -98 889 -132 765 -66 531 -100 1449 -166 457 -98 1715 -66 299 -166 3131 -130 197 -98 817 -294 793 -100 97 -66 3415 -164 1019 -98 1675 -132 197 -100 133 -68 199 -134 3319 -298 297 -66 791 -66 1029 -134 2153 -100 1629 -132 1391 -68 1229 -100 665 -66 2039 -164 461 -64 261 -66 395 -202 395 -166 3159 -134 2253 -166 265 -132 395 -66 887 -98 163 -66 589 -98 227 -130 1151 -230 293 -66 591 -68 527 -132 2883 -100 231 -66 99 -232 761 -134 499 -64 929 -100 167 -300 2259 -100 691 -164 459 -66 493 -132 163 -64 1283 -164 757 -132 295 -264 1023 -100 197 -198 6635 -198 2407 -100 2091 -132 1531 -66 1889 -100 199 -134 3567 -100 2981 -100 263 -198 425 -164 595 -100 231 -68 2691 -66 965 -100 2907 -98 367 -132 885 -198 1721 -100 659 -100 97 -296 495 -166 299 -134 397 -132 699 -66 1165 -66 465 -68 197 -66 659 -66 1543 -66 819 -164 2913 -98 1061 -66 5475 -132 167 -100 1035 -66 3427 -298 429 -166 2723 -66 831 -98 133 -66 133 -66 495 -98 701 -66 1063 -98 1991 -100 3319 -66 263 -66 233 -66 695 -66 593 -132 595 -66 553 -66 459 -66 197 -164 2241 -66 165 -68 959 -98 1587 -166 65 -102 233 -66 465 -134 1227 -100 2359 -66 1959 -198 331 -232 165 -102 531 -100 63 -66 1999 -68 265 -100 429 -66 657 -166 297 -132 823 -100 129 -132 4511 -164 659 -68 299 -66 593 -66 99 -134 65 -100 397 -66 1561 -66 697 -100 429 -66 265 -134 361 -132 195 -130 1319 -66 133 -66 265 -100 397 -268 895 -100 363 -134 433 -66 133 -100 2321 -68 RAW_Data: -98 3573 -98 533 -68 961 -68 729 -132 559 -166 2189 -100 131 -68 657 -100 1387 -132 133 -68 2255 -68 429 -66 231 -134 793 -100 887 -98 361 -166 2141 -66 227 -130 663 -100 759 -100 1161 -134 1821 -66 327 -98 985 -130 757 -132 131 -132 1693 -66 361 -98 1411 -100 591 -132 1025 -66 663 -66 1065 -166 1059 -166 365 -66 723 -100 1659 -132 1883 -98 785 -132 1031 -66 261 -66 2501 -98 297 -66 1195 -100 691 -134 3009 -100 3921 -66 861 -66 363 -132 3361 -132 723 -66 459 -164 163 -164 333 -66 1291 -98 821 -230 591 -164 97 -262 361 -66 689 -66 733 -66 233 -134 1627 -66 533 -66 195 -100 521 -100 493 -98 493 -98 2173 -66 2037 -132 165 -100 429 -132 695 -100 67 -132 465 -68 1491 -100 1257 -66 965 -100 365 -68 929 -132 561 -66 899 -132 597 -132 861 -100 2627 -166 197 -98 2079 -66 2223 -100 1791 -364 895 -132 1027 -132 235 -68 599 -132 829 -66 197 -132 695 -66 133 -66 531 -68 333 -64 563 -66 265 -132 369 -134 2239 -164 4269 -100 793 -66 1495 -198 821 -164 133 -66 867 -66 797 -66 429 -66 365 -166 1729 -168 959 -100 1417 -66 233 -100 2579 -166 993 -164 461 -66 1529 -68 961 -66 1049 -98 1061 -132 2847 -66 229 -66 397 -134 263 -100 3285 -66 4115 -66 1547 -134 297 -132 431 -100 2895 -100 563 -66 1491 -66 399 -100 721 -66 395 -68 399 -66 1289 -66 293 -164 2307 -98 525 -66 3663 -64 927 -132 499 -134 1127 -264 397 -98 399 -198 131 -100 333 -100 663 -164 921 -166 1481 -262 691 -64 659 -64 2167 -98 3689 -100 833 -100 2085 -66 697 -100 595 -66 923 -134 893 -232 265 -98 367 -66 1157 -66 263 -130 1017 -66 623 -66 753 -100 2873 -132 395 -198 2787 -100 861 -132 3847 -100 297 -66 233 -98 1333 -100 495 -100 1325 -134 367 -66 595 -66 361 -230 4931 -66 1821 -98 329 -98 365 -168 333 -300 897 -100 2777 -66 1945 -132 2601 -66 951 -66 425 -98 789 -98 359 -64 1051 -66 1443 -132 851 -98 625 -100 97 -66 731 -232 263 -134 2757 -68 3021 -166 265 -100 1633 -132 427 -66 233 -98 799 -100 1059 -100 263 -98 557 -68 1063 -66 461 -100 1023 -98 163 -198 1481 -132 1227 -98 327 -100 327 -66 1317 -66 1853 -66 1061 -134 1287 -66 1315 -66 1345 -132 723 -66 1225 -68 1463 -166 3261 -98 2883 -66 563 -100 821 -100 2077 -166 3137 -66 565 -66 1355 -234 1415 -132 165 -66 397 -132 493 -132 563 -166 893 -66 1193 -66 1249 -100 333 -132 2083 -66 921 -100 1225 -262 861 -166 1321 -100 895 -100 591 -98 1249 RAW_Data: -98 97 -66 6825 -66 231 -68 14077 -66 1787 -66 1547 -64 2617 -66 2925 -66 1723 -132 1529 -66 865 -166 827 -198 431 -66 495 -66 1121 -198 1327 -100 397 -130 557 -66 97 -100 261 -98 723 -98 557 -98 463 -98 463 -100 325 -66 3703 -100 465 -198 1123 -98 2545 -66 361 -66 857 -64 3455 -132 663 -98 1991 -200 825 -100 919 -98 893 -164 1749 -66 7759 -132 3321 -66 1807 -132 527 -66 393 -100 817 -130 657 -164 1485 -98 2367 -66 4171 -100 197 -130 3665 -134 1059 -132 597 -66 533 -66 1023 -98 1253 -134 2021 -100 231 -100 233 -66 197 -66 199 -66 1961 -168 729 -100 531 -100 461 -98 1361 -100 11161 -100 659 -166 229 -98 1675 -98 1027 -100 2063 -298 431 -100 99 -134 1059 -66 199 -100 763 -134 231 -66 233 -102 1761 -98 331 -68 757 -132 425 -64 457 -132 99 -66 2091 -66 567 -164 2121 -68 2125 -132 595 -200 759 -102 797 -132 1345 -66 429 -132 1019 -66 195 -66 791 -68 1227 -68 797 -132 1591 -200 199 -134 165 -66 1053 -66 559 -98 853 -164 825 -100 329 -98 891 -196 689 -132 657 -100 2341 -98 1119 -66 1883 -100 2607 -100 467 -100 1067 -164 6935 -66 2409 -132 855 -66 1809 -98 1119 -164 65 -66 199 -100 233 -132 931 -132 563 -66 1393 -132 567 -66 301 -68 1295 -66 529 -98 793 -66 131 -134 533 -132 827 -132 731 -332 1251 -98 921 -98 327 -198 361 -234 529 -66 1577 -132 97 -134 199 -100 1099 -68 1193 -132 991 -100 953 -98 2895 -166 1679 -98 161 -130 129 -66 1019 -100 261 -264 531 -100 263 -134 299 -68 495 -98 831 -100 531 -66 1357 -100 2051 -100 229 -98 829 -66 427 -66 859 -134 995 -68 665 -66 1793 -134 361 -100 2349 -66 331 -100 197 -66 1591 -66 959 -66 431 -234 2219 -332 661 -66 1487 -100 3381 -68 261 -164 463 -134 3377 -68 1127 -134 691 -66 529 -132 99 -66 6687 -98 889 -132 197 -164 725 -100 963 -66 2947 -132 327 -132 889 -66 393 -98 1581 -100 193 -130 97 -66 293 -66 1675 -100 1887 -98 2017 -100 597 -66 293 -98 557 -100 259 -98 985 -100 1727 -100 165 -100 301 -232 329 -100 533 -98 727 -100 761 -66 961 -68 2759 -100 2019 -66 855 -230 859 -98 1215 -98 1887 -98 131 -98 819 -166 227 -130 723 -132 625 -66 501 -66 429 -66 831 -66 1291 -66 331 -132 431 -132 1389 -100 265 -166 1461 -66 1907 -490 911 -962 409 -508 919 -944 419 -486 913 -526 915 -480 925 -488 911 -488 943 -476 925 -486 947 -462 945 -482 933 -484 951 -460 977 -440 967 -484 945 -468 945 -466 975 -450 983 RAW_Data: -444 977 -458 975 -456 975 -444 965 -940 485 -430 967 -928 487 -448 981 -910 489 -446 963 -944 485 -430 975 -930 489 -912 485 -896 487 -452 977 -916 509 -454 977 -922 479 -448 985 -15898 487 -456 973 -926 493 -448 1001 -918 481 -484 981 -478 979 -450 1013 -476 977 -450 1017 -476 983 -448 999 -480 985 -484 983 -478 985 -484 981 -480 983 -476 1001 -474 979 -496 973 -486 1015 -476 977 -476 1005 -484 973 -486 1007 -920 505 -456 1011 -918 509 -458 1011 -950 497 -452 1011 -920 507 -458 1007 -950 477 -958 483 -942 481 -480 1003 -918 515 -446 1039 -922 505 -458 1007 -16154 501 -462 1013 -934 517 -474 999 -958 483 -478 993 -484 1037 -450 1027 -482 1027 -452 1037 -482 1025 -444 1035 -490 1009 -482 1013 -484 1001 -484 1039 -474 1003 -484 1045 -464 1011 -480 1049 -446 1037 -492 1007 -482 1013 -510 1005 -494 1005 -970 485 -482 1017 -974 473 -498 1007 -974 481 -486 1047 -948 479 -482 1051 -948 497 -952 519 -938 485 -482 1041 -946 517 -478 1013 -944 503 -472 415 -83640 97 -200 65 -632 131 -300 365 -364 231 -132 1061 -100 3047 -100 1393 -66 499 -66 1091 -66 333 -66 2353 -100 2273 -66 1427 -166 563 -132 1559 -132 427 -100 925 -98 13469 -100 2019 -98 821 -132 1097 -68 297 -100 897 -100 1129 -166 465 -166 961 -66 597 -100 165 -66 267 -100 201 -100 765 -134 297 -66 165 -66 3081 -100 1293 -100 1289 -136 233 -66 357 -66 1155 -166 295 -100 1197 -68 1089 -98 425 -132 1187 -100 523 -98 463 -98 197 -98 131 -98 493 -66 393 -98 2797 -164 359 -232 325 -66 229 -164 625 -98 1215 -164 425 -66 589 -98 195 -66 1083 -100 197 -68 1557 -66 1427 -66 525 -66 429 -132 863 -66 1129 -166 831 -98 265 -98 1183 -66 3157 -100 2735 -98 2819 -166 4645 -66 301 -68 1395 -132 1097 -100 897 -198 629 -200 1419 -132 493 -66 521 -132 697 -100 695 -66 459 -298 859 -66 559 -100 1029 -100 4113 -66 1167 -66 14017 -66 2123 -68 525 -132 861 -100 329 -66 399 -134 1523 -132 327 -64 691 -98 463 -132 1803 -132 853 -166 715 -66 953 -66 525 -98 723 -132 989 -132 461 -98 459 -164 2239 -66 1185 -66 589 -100 1945 -230 1483 -66 399 -66 265 -168 965 -66 197 -168 699 -68 1125 -68 529 -98 491 -66 987 -130 525 -168 397 -66 597 -100 561 -132 1353 -66 391 -132 393 -66 591 -98 557 -98 787 -66 463 -100 199 -134 395 -100 759 -66 295 -130 261 -98 229 -100 99 -100 1595 -66 699 -100 499 -66 595 -98 327 -132 957 -132 331 -100 493 -100 1313 -66 295 -132 197 -198 1279 RAW_Data: -66 9461 -100 329 -68 27921 -66 24331 -68 13415 -66 6439 -98 133 -66 4193 -98 395 -66 653 -66 983 -66 163 -66 955 -132 1791 -66 861 -100 363 -132 1659 -132 667 -166 467 -134 429 -166 265 -66 4065 -98 293 -98 3183 -130 555 -98 163 -162 259 -100 661 -100 7057 -100 931 -100 1297 -66 2559 -98 1193 -100 333 -100 563 -132 65 -100 793 -66 855 -64 659 -100 929 -102 893 -132 689 -66 3475 -68 1361 -198 331 -134 691 -66 295 -66 425 -164 731 -266 921 -100 599 -100 165 -66 227 -98 1091 -66 263 -66 1215 -100 227 -164 657 -66 953 -132 359 -66 1845 -66 1779 -132 753 -164 393 -66 731 -66 1195 -66 533 -66 797 -132 1623 -98 1281 -100 493 -98 659 -98 2417 -166 799 -132 1259 -100 559 -134 595 -166 199 -66 1461 -198 865 -100 459 -66 463 -166 165 -100 497 -66 1097 -66 1579 -100 1449 -98 885 -98 263 -100 1097 -132 627 -68 329 -132 487 -132 427 -132 361 -66 525 -98 687 -66 1161 -100 263 -66 729 -100 229 -98 559 -66 1213 -100 1015 -66 795 -66 5475 -66 4043 -66 1683 -166 1151 -132 429 -98 1447 -68 261 -98 985 -100 429 -100 1289 -198 2269 -132 7999 -98 1591 -132 3233 -66 861 -66 2087 -98 557 -98 719 -66 981 -98 563 -100 199 -100 523 -100 2319 -134 833 -100 495 -132 197 -66 295 -64 989 -66 1059 -198 7343 -66 2023 -66 963 -66 593 -66 2401 -100 491 -100 959 -66 297 -134 999 -132 99 -68 3609 -230 97 -198 1911 -66 265 -100 1195 -132 633 -132 595 -66 1381 -66 491 -66 1681 -100 297 -100 1827 -132 2269 -100 1351 -132 1513 -66 1225 -134 231 -66 1523 -100 363 -200 1227 -66 2943 -66 923 -134 2249 -66 1809 -100 1121 -132 265 -66 827 -98 199 -66 201 -100 3279 -100 565 -132 1689 -66 395 -66 2979 -134 1065 -66 367 -168 3585 -200 463 -100 563 -66 97 -166 2293 -66 265 -134 1255 -132 2401 -66 1579 -166 365 -100 861 -298 261 -98 761 -66 363 -132 657 -130 63 -130 557 -66 131 -130 2041 -100 233 -66 1791 -100 925 -134 265 -100 1063 -100 301 -168 661 -66 657 -64 263 -64 197 -66 1853 -100 663 -98 231 -66 731 -100 5539 -166 197 -68 1423 -134 361 -68 1727 -68 929 -100 1397 -134 1885 -66 1661 -66 265 -66 1183 -66 295 -166 263 -166 165 -66 329 -66 465 -100 1159 -134 697 -100 2443 -100 393 -98 1093 -66 953 -296 787 -132 425 -66 2019 -66 461 -98 1201 -100 397 -132 3551 -100 1431 -264 725 -330 1455 -66 263 -100 531 -296 499 -100 265 -100 163 -66 1145 -132 1313 -98 2101 -98 261 -132 1083 -66 5403 RAW_Data: -66 2223 -66 11583 -66 131 -66 5071 -66 3723 -132 1415 -132 6905 -64 9685 -102 4739 -66 3355 -66 5301 -98 29993 -508 897 -950 437 -490 909 -974 423 -510 935 -486 925 -508 943 -490 937 -494 947 -482 941 -484 979 -440 979 -456 1003 -462 975 -460 971 -458 977 -468 973 -484 975 -472 971 -450 1011 -452 1003 -446 983 -480 979 -450 1017 -908 487 -472 971 -944 471 -450 999 -944 485 -468 977 -918 493 -448 1011 -934 499 -920 487 -914 487 -452 1011 -912 521 -446 1009 -904 517 -468 1007 -16000 531 -444 1009 -908 519 -468 1009 -912 515 -466 1009 -452 1021 -466 1011 -450 1019 -480 1017 -448 1045 -448 1019 -460 1041 -450 1019 -480 1019 -450 1039 -474 1001 -480 1021 -484 1005 -476 1015 -480 1017 -484 1011 -486 1017 -464 1041 -446 1047 -922 503 -458 1037 -946 513 -442 1047 -938 503 -480 1023 -916 537 -450 1049 -926 521 -904 519 -942 519 -450 1055 -910 519 -486 1033 -916 519 -486 1029 -16258 533 -464 1015 -940 515 -456 1053 -946 511 -482 1051 -434 1075 -442 1075 -448 1065 -440 1065 -450 1049 -480 1067 -462 1041 -446 1075 -450 1063 -460 1053 -480 1047 -450 1075 -446 1079 -452 1055 -478 1051 -448 1067 -444 1065 -480 753 -66842 99 -1090 465 -332 131 -68 131 -134 99 -132 167 -200 429 -100 1809 -132 2385 -230 265 -102 597 -134 1025 -66 365 -100 361 -66 825 -168 1331 -100 797 -132 431 -132 299 -198 661 -168 501 -100 463 -164 329 -66 559 -98 391 -98 1085 -198 1939 -66 1871 -164 2251 -134 493 -66 719 -198 361 -98 361 -64 197 -132 391 -164 691 -300 489 -98 2139 -66 1413 -66 1875 -196 557 -66 263 -132 1359 -66 1397 -66 631 -100 793 -132 723 -100 65 -66 529 -134 463 -68 789 -100 227 -66 923 -100 2649 -166 363 -66 395 -200 295 -130 1757 -68 2057 -100 1023 -66 359 -66 391 -132 1679 -66 359 -66 1217 -98 663 -98 463 -100 821 -98 165 -98 1589 -132 2367 -98 559 -132 1079 -100 9617 -66 3669 -134 1787 -68 1679 -132 361 -66 555 -100 661 -66 1523 -100 2057 -198 1025 -66 4177 -100 165 -66 265 -132 465 -134 299 -232 265 -100 1125 -132 1461 -132 1295 -100 499 -132 367 -68 263 -66 331 -66 365 -100 1643 -130 197 -132 997 -98 867 -98 1191 -100 2945 -100 2339 -98 1779 -66 295 -132 597 -66 165 -100 665 -100 463 -66 331 -66 593 -100 459 -68 489 -164 855 -66 261 -64 163 -100 4449 -100 859 -100 699 -132 199 -100 1685 -66 301 -132 2317 -68 231 -100 827 -66 1749 -132 99 -64 1185 -100 329 -100 1253 -66 1127 -98 827 -198 363 -132 265 -134 365 -66 297 -66 1125 -66 261 RAW_Data: -266 29863 -66 2443 -66 5113 -100 5947 -21026 99 -134 301 -132 199 -132 131 -266 163 -196 131 -66 365 -66 465 -98 13819 -98 525 -98 329 -100 893 -66 1259 -66 431 -98 427 -130 1051 -392 463 -200 795 -164 399 -66 1489 -66 1377 -100 1423 -132 597 -100 689 -68 1559 -100 2263 -100 1327 -98 1059 -98 497 -66 595 -132 265 -66 299 -66 199 -66 563 -134 627 -66 165 -134 889 -66 2751 -232 893 -264 231 -66 299 -132 467 -132 861 -68 1263 -164 795 -66 2601 -100 429 -66 1525 -66 961 -98 265 -98 997 -66 233 -68 695 -100 697 -66 795 -66 1195 -66 1223 -68 2173 -66 467 -66 827 -66 535 -68 697 -100 1221 -166 165 -100 365 -132 723 -66 829 -132 2091 -232 265 -66 195 -66 459 -262 499 -100 461 -68 759 -100 1087 -66 259 -164 2845 -66 1365 -98 561 -200 331 -168 201 -166 1397 -198 197 -66 697 -68 1713 -68 293 -134 1317 -66 593 -328 395 -100 499 -132 2251 -100 563 -134 333 -134 1921 -134 1187 -68 561 -132 933 -66 797 -100 631 -100 399 -132 929 -66 2769 -66 851 -130 2047 -66 265 -100 7219 -66 1987 -66 299 -98 2199 -134 1063 -98 2843 -98 655 -132 231 -66 1123 -198 2137 -64 327 -66 3183 -66 1127 -66 631 -100 263 -102 3173 -132 267 -68 1289 -98 1593 -66 2415 -66 1185 -66 359 -132 1051 -66 2169 -66 427 -98 395 -132 793 -98 293 -166 727 -134 131 -100 1287 -98 427 -98 687 -164 823 -64 853 -66 865 -100 763 -66 2025 -100 959 -66 1891 -64 793 -100 763 -66 729 -166 99 -98 399 -134 763 -100 4203 -66 1321 -230 4023 -98 1053 -66 985 -98 1383 -66 3559 -164 1515 -100 2899 -66 797 -134 1169 -100 3055 -134 1615 -66 429 -100 495 -64 1583 -134 923 -66 921 -66 723 -68 1359 -98 787 -98 425 -100 393 -64 1189 -98 263 -98 491 -100 1455 -98 RAW_Data: -202 531 -66 531 -66 1093 -66 1389 -66 1551 -134 2699 -66 1291 -132 65 -64 657 -98 1083 -164 393 -98 1359 -134 1461 -66 393 -100 561 -130 2113 -132 597 -66 431 -102 1759 -302 985 -66 235 -100 1395 -66 901 -66 1061 -100 463 -66 5673 -66 227 -66 225 -66 855 -66 1581 -132 2503 -100 657 -66 2535 -98 259 -64 1015 -66 231 -132 1197 -66 827 -166 9641 -66 1823 -132 1565 -132 299 -66 797 -66 1631 -132 327 -132 2227 -232 433 -68 499 -100 1793 -66 1161 -132 525 -66 129 -100 361 -66 1765 -132 229 -66 491 -132 2255 -100 3043 -332 299 -100 499 -100 267 -68 2967 -66 991 -100 729 -100 633 -66 529 -98 825 -100 1033 -100 331 -66 723 -100 725 -264 2987 -68 825 -66 2601 -134 333 -100 3181 -134 1059 -100 299 -134 3279 -100 1221 -132 659 -66 3157 -98 1595 -132 1561 -98 201 -134 465 -66 1843 -130 589 -66 1413 -66 331 -100 333 -66 661 -100 265 -68 201 -234 1027 -166 297 -100 1161 -132 1561 -134 629 -66 431 -66 1025 -98 427 -198 1527 -66 793 -66 1903 -66 131 -130 1285 -66 299 -134 397 -98 229 -132 499 -132 4747 -100 2355 -100 263 -132 1915 -132 1749 -132 759 -66 2253 -100 4545 -66 391 -100 521 -100 1083 -100 929 -134 565 -66 2355 -66 1331 -66 167 -100 465 -100 1727 -132 633 -330 433 -66 897 -132 165 -134 331 -98 627 -66 231 -66 167 -66 1397 -66 729 -132 1397 -68 165 -66 1627 -134 2187 -66 231 -134 795 -200 6469 -232 829 -66 3929 -66 891 -98 1977 -100 525 -68 859 -66 921 -264 1029 -68 959 -134 1555 -66 259 -100 687 -66 429 -264 663 -66 1559 -100 1127 -100 2327 -132 1913 -64 4193 -132 293 -98 99 -100 5613 -132 1351 -66 1545 -66 1677 -66 295 -64 1943 -100 595 -132 1959 -166 765 -66 1389 -100 823 -66 1749 -66 1217 -100 597 -100 297 -66 2019 -98 165 -100 4165 -100 67 -100 2477 -262 295 -66 919 -200 3555 -66 229 -66 2531 -98 557 -66 2525 -66 1463 -100 1293 -68 197 -68 1391 -66 1421 -66 595 -164 327 -68 2285 -66 593 -98 99 -68 463 -98 1063 -100 165 -68 99 -100 631 -66 1085 -66 859 -98 6599 -66 1429 -66 233 -66 397 -98 231 -132 1975 -132 333 -66 131 -134 3373 -100 4277 -66 1363 -232 2893 -166 3133 -64 951 -66 2815 -100 425 -98 327 -66 599 -68 1031 -98 133 -68 633 -68 429 -100 1129 -66 327 -130 2679 -66 1321 -100 463 -200 367 -98 667 -66 493 -132 885 -98 2183 -166 559 -98 981 -66 3201 -164 593 -66 493 -130 1923 -166 565 -100 2421 -98 461 -66 1427 -130 1955 -64 197 -66 1643 RAW_Data: -132 2291 -66 3057 -68 2521 -166 333 -134 503 -400 3235 -66 2329 -68 995 -100 333 -100 97 -166 1757 -100 397 -100 165 -66 2755 -132 297 -134 163 -100 565 -100 1793 -100 1813 -162 1293 -98 97 -66 999 -66 1763 -68 261 -68 2391 -100 765 -364 859 -100 1855 -98 1399 -230 463 -134 301 -198 397 -100 961 -68 431 -134 695 -202 133 -100 365 -66 925 -98 165 -66 365 -132 663 -98 4573 -134 1479 -66 1019 -66 629 -66 233 -68 201 -66 569 -66 295 -134 1755 -296 3199 -100 3261 -168 3373 -132 1425 -100 759 -66 895 -98 201 -100 265 -166 99 -66 695 -66 1091 -66 855 -168 299 -100 229 -164 589 -66 521 -66 655 -134 329 -98 493 -200 429 -66 929 -66 673 -100 953 -66 823 -66 1283 -66 1979 -68 233 -66 1547 -164 589 -132 597 -66 131 -66 265 -100 761 -200 759 -66 689 -332 263 -100 1227 -68 1067 -164 2945 -100 959 -100 995 -100 399 -100 1193 -100 625 -66 399 -66 3021 -134 393 -66 4805 -66 1095 -68 231 -332 399 -166 1663 -68 561 -66 927 -98 1085 -164 1155 -98 627 -66 265 -132 263 -130 2211 -66 2159 -66 1029 -264 2669 -66 295 -66 8747 -100 329 -232 625 -134 429 -68 1329 -168 1355 -98 987 -66 1545 -98 1015 -98 699 -134 133 -134 1263 -66 4687 -166 8299 -66 1349 -434 933 -906 443 -452 949 -894 441 -480 909 -486 907 -456 947 -448 949 -434 969 -454 931 -460 941 -448 933 -450 979 -450 945 -450 935 -458 935 -486 927 -456 947 -450 951 -482 945 -428 975 -446 967 -452 955 -458 945 -912 485 -434 971 -902 481 -450 949 -926 451 -478 941 -920 481 -450 949 -920 473 -450 955 -916 471 -452 981 -918 449 -486 945 -910 483 -924 473 -15780 479 -450 967 -948 449 -482 943 -944 485 -468 941 -484 979 -446 1001 -444 999 -446 967 -484 969 -482 979 -478 947 -484 985 -470 973 -458 983 -492 971 -458 979 -494 971 -458 983 -494 973 -458 981 -498 975 -458 1013 -466 973 -952 475 -458 973 -950 489 -450 1011 -916 481 -478 1001 -918 481 -478 1001 -916 481 -478 1001 -920 483 -480 983 -946 479 -458 1013 -932 485 -952 479 -16040 493 -476 1009 -912 515 -464 1007 -910 517 -464 1007 -450 1001 -488 1001 -484 1011 -450 1019 -458 1039 -450 1031 -454 1005 -484 1009 -458 1015 -476 1009 -478 1035 -462 1015 -468 1007 -480 1001 -486 1015 -460 1041 -450 1017 -484 1019 -482 1009 -952 477 -494 1003 -944 485 -478 1013 -944 519 -482 1013 -942 487 -482 1013 -946 487 -484 1015 -944 487 -484 1015 -946 519 -454 1019 -942 505 -952 487 -16238 517 -468 1007 -942 521 -482 1011 -944 519 RAW_Data: -450 1019 -482 1035 -480 1033 -460 1047 -476 1017 -484 1007 -484 1051 -484 1027 -452 1039 -478 1035 -458 1049 -480 1017 -480 1035 -480 1035 -472 1047 -484 1027 -454 1039 -480 1033 -488 1031 -488 1009 -962 521 -486 1017 -966 485 -490 1015 -139210 229 -98 461 -364 165 -334 131 -168 2121 -66 1049 -66 1215 -166 297 -136 1449 -100 3877 -100 1495 -234 331 -64 1345 -262 393 -100 529 -132 2921 -164 1223 -132 1807 -66 765 -66 397 -98 3405 -132 2123 -230 231 -66 2541 -100 2489 -98 4397 -132 461 -98 293 -64 991 -66 1125 -166 401 -100 131 -100 99 -100 265 -100 2555 -100 499 -98 1361 -134 265 -166 895 -100 2253 -100 1057 -100 129 -296 1147 -198 197 -66 1163 -66 1935 -98 1675 -66 1103 -100 891 -100 989 -164 1019 -66 2967 -68 1293 -166 3161 -66 133 -264 1065 -100 731 -66 1693 -66 529 -100 165 -68 865 -66 825 -232 1117 -196 2401 -66 3051 -296 229 -132 1843 -132 1687 -68 1119 -68 299 -68 97 -66 4741 -66 197 -200 2319 -100 1097 -66 3765 -66 131 -100 695 -132 2753 -66 2287 -100 1129 -68 331 -98 1433 -132 893 -100 465 -100 801 -66 529 -66 1515 -264 393 -98 263 -66 1831 -166 3533 -100 633 -100 1051 -100 331 -98 795 -134 959 -132 1229 -100 627 -132 2517 -66 165 -98 131 -66 2301 -166 163 -134 465 -66 2767 -66 1019 -66 401 -134 397 -232 893 -66 397 -66 833 -66 199 -66 303 -66 2775 -66 2069 -98 1841 -100 399 -66 793 -98 2793 -68 3769 -100 867 -66 861 -100 399 -66 1859 -100 631 -132 755 -100 689 -66 163 -64 2045 -64 2191 -102 1127 -68 727 -68 625 -164 1381 -66 1153 -132 1115 -98 1017 -100 491 -100 593 -132 991 -98 1415 -98 4813 -66 331 -98 131 -102 1847 -98 197 -68 263 -100 3265 -66 431 -100 493 -98 435 -134 133 -68 1185 -134 395 -100 131 -66 399 -134 767 -134 1125 -66 429 -198 3185 -100 2261 -66 523 -230 2475 -168 1297 -66 3243 -66 1853 -100 1657 -66 459 -66 827 -100 263 -66 303 -234 197 -166 1167 -100 2299 -66 1329 -68 461 -100 763 -132 3819 -366 757 -66 591 -164 621 -98 1445 -100 2155 -100 231 -100 631 -68 1161 -66 131 -166 67 -98 1915 -166 1891 -66 1261 -68 999 -164 165 -132 133 -168 2695 -68 1055 -198 97 -98 229 -66 229 -66 1215 -66 885 -100 303 -132 297 -164 619 -198 459 -64 989 -66 229 -66 597 -134 693 -64 1255 -100 65 -132 331 -66 199 -98 529 -100 2831 -98 1259 -66 4855 -100 1163 -166 299 -66 395 -98 3141 -66 1319 -66 2139 -100 161 -132 261 -130 821 -200 263 -134 931 -330 65 -98 99 -134 793 RAW_Data: -66 597 -100 231 -68 167 -66 1659 -100 733 -66 1631 -100 165 -66 199 -66 233 -166 165 -100 1925 -68 595 -198 1785 -134 2177 -134 131 -66 1049 -98 3087 -132 195 -64 589 -66 397 -134 329 -66 2565 -164 327 -100 689 -64 1775 -100 5183 -132 1187 -66 329 -66 395 -132 165 -98 261 -98 1247 -64 1217 -66 927 -66 997 -66 199 -98 1419 -66 531 -166 1231 -66 697 -100 97 -66 563 -66 161 -264 3205 -200 525 -98 293 -100 291 -100 133 -66 759 -66 659 -100 983 -64 523 -130 431 -166 919 -66 1097 -100 1757 -66 1119 -66 917 -98 2647 -166 1247 -66 165 -264 1189 -100 899 -134 597 -68 2323 -66 1893 -66 1095 -100 533 -64 965 -100 1817 -130 1215 -66 1879 -64 821 -164 1117 -132 263 -132 131 -66 557 -66 431 -132 661 -100 1183 -98 629 -100 1679 -132 259 -66 623 -98 431 -66 399 -164 923 -100 297 -66 165 -166 2521 -198 99 -66 431 -132 1225 -66 1063 -68 131 -136 631 -66 163 -100 99 -298 965 -68 465 -68 465 -298 2545 -134 2639 -230 1489 -66 299 -66 1991 -234 65 -132 693 -134 429 -102 101 -68 461 -66 3333 -64 1229 -68 333 -66 265 -66 885 -64 3163 -100 467 -66 2651 -164 1221 -100 1527 -66 1259 -134 431 -232 1259 -100 6029 -164 297 -98 1151 -66 1415 -100 5289 -66 2467 -100 493 -132 495 -200 1121 -66 129 -66 757 -166 327 -130 5477 -66 1227 -230 395 -100 265 -132 497 -132 1133 -132 361 -100 1051 -164 3089 -132 1583 -100 65 -68 2315 -100 529 -132 2157 -68 1257 -66 1975 -98 427 -98 1347 -66 719 -164 857 -66 165 -66 1029 -132 297 -132 467 -100 731 -130 1985 -98 199 -166 899 -100 1391 -166 3425 -100 261 -132 721 -66 4845 -98 1193 -68 1225 -66 721 -100 1015 -64 983 -66 557 -130 693 -98 99 -64 1091 -98 197 -100 2321 -66 431 -134 727 -66 467 -102 891 -98 167 -134 2619 -66 393 -64 97 -100 589 -98 1583 -164 301 -68 1481 -98 295 -98 959 -66 365 -98 1253 -66 231 -100 1255 -132 1813 -132 1645 -100 361 -132 395 -100 427 -164 1197 -98 1001 -100 861 -66 1161 -98 195 -100 197 -66 1429 -66 663 -66 1427 -98 665 -66 699 -100 663 -66 855 -196 161 -100 361 -98 823 -66 227 -66 621 -132 1853 -230 461 -230 623 -100 557 -98 229 -98 133 -134 1291 -66 533 -166 627 -134 195 -134 593 -64 591 -66 1019 -66 1049 -262 297 -100 2921 -66 133 -66 963 -134 165 -100 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/honeywell_wdb.sub ================================================ Filetype: Flipper SubGhz Key File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: Honeywell Bit: 48 Key: 00 00 0E DB 70 20 00 01 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/honeywell_wdb_raw.sub ================================================ Filetype: Flipper SubGhz RAW File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: RAW RAW_Data: 414 -1374 51 -108 79 -216 189 -584 53 -214 53 -400 215 -264 129 -322 77 -288 79 -54 107 -184 51 -446 53 -160 161 -305 263 -104 264 -134 53 -806 267 -80 187 -314 53 -158 83 -1172 243 -833 79 -188 345 -208 77 -182 225 -100 107 -106 187 -190 105 -432 176 -174 119 -328 79 -432 79 -102 99 -514 127 -218 79 -184 77 -52 101 -356 53 -615 243 -266 181 -102 212 -138 81 -486 205 -574 77 -256 155 -152 217 -78 75 -1010 393 -346 79 -488 107 -284 121 -72 215 -174 183 -54 257 -332 179 -52 79 -238 53 -636 161 -80 227 -950 346 -160 109 -564 295 -160 299 -160 435 -487 312 -52 105 -292 77 -246 137 -498 366 -104 255 -362 97 -210 53 -555 374 -206 129 -96 303 -280 179 -172 75 -102 99 -76 353 -228 131 -252 147 -130 79 -304 103 -82 139 -52 103 -183 77 -284 75 -454 55 -188 77 -222 161 -128 107 -136 187 -270 53 -371 184 -364 103 -284 129 -52 103 -321 81 -554 261 -1048 107 -106 243 -280 103 -478 215 -530 53 -108 53 -236 203 -180 51 -78 77 -338 81 -82 53 -231 75 -124 256 -232 227 -448 131 -340 131 -266 107 -346 51 -254 75 -134 210 -182 103 -280 127 -122 305 -310 255 -528 77 -513 79 -214 209 -102 53 -80 133 -1727 237 -78 79 -242 53 -296 133 -532 53 -513 53 -54 131 -190 53 -661 129 -218 107 -394 103 -554 157 -112 343 -314 103 -283 79 -304 135 -56 111 -272 189 -370 271 -270 105 -956 79 -184 77 -868 307 -156 129 -731 51 -200 161 -84 81 -326 51 -54 157 -168 369 -152 101 -188 81 -398 239 -132 215 -54 105 -182 317 -206 99 -198 97 -274 157 -271 121 -268 200 -330 499 -184 55 -434 133 -646 283 -152 255 -428 101 -350 199 -124 145 -304 308 -102 75 -386 107 -186 129 -534 101 -180 175 -100 151 -98 53 -78 133 -794 183 -150 83 -220 185 -280 83 -537 107 -308 55 -138 79 -714 79 -538 77 -106 133 -242 263 -236 75 -884 215 -136 81 -270 133 -624 105 -132 79 -848 291 -373 79 -244 55 -619 203 -202 77 -156 103 -176 99 -408 107 -318 77 -316 79 -500 55 -691 51 -340 129 -266 53 -486 103 -376 103 -185 51 -156 81 -106 77 -104 79 -502 208 -292 133 -432 105 -52 105 -80 51 -158 317 -372 181 -844 51 -270 107 -312 79 -302 83 -444 53 -640 77 -268 183 -138 85 -192 79 -158 131 -132 155 -220 81 -245 127 -386 185 -296 53 -608 77 -308 51 -822 105 -832 51 -850 155 -242 105 -422 79 -270 155 -76 77 -162 55 -414 RAW_Data: 109 -630 77 -190 53 -52 131 -860 53 -1300 83 -1122 99 -432 53 -724 81 -390 159 -106 81 -2607 79 -474 75 -694 151 -146 73 -104 53 -380 77 -278 77 -128 73 -148 73 -248 99 -314 75 -154 97 -2225 51 -952 183 -970 77 -1210 51 -326 103 -368 151 -252 121 -784 51 -108 187 -256 227 -242 105 -104 150 -128 77 -1287 173 -2513 77 -1144 105 -1268 111 -3964 101 -1348 81 -2718 81 -302 79 -1999 55 -1268 57 -7269 53 -424 83 -3736 105 -1552 51 -8460 57 -5224 101 -244 121 -4124 103 -10775 133 -1858 73 -20679 51 -5532 97 -1718 103 -3764 51 -6496 79 -792 53 -13269 81 -18787 57 -9140 83 -3302 53 -11039 55 -26162 79 -1713 103 -5860 53 -9589 55 -8389 81 -254 85 -16287 73 -8336 53 -6237 75 -828 55 -19389 73 -8028 79 -6284 83 -3460 77 -13504 75 -3198 75 -1280 51 -1948 51 -758 79 -22076 75 -1681 73 -21693 57 -8106 53 -838 51 -10074 51 -4760 55 -492 79 -6558 79 -22996 75 -13904 53 -5564 55 -16578 83 -25603 77 -410 75 -16694 81 -606 53 -2987 53 -3898 107 -3248 79 -5168 55 -754 81 -20662 53 -11066 51 -8624 79 -26384 79 -2214 81 -7442 79 -12488 53 -1656 71 -4508 55 -15680 57 -6669 51 -5410 71 -6411 53 -6082 79 -13772 53 -5945 55 -574 73 -11921 51 -3472 55 -2323 55 -10414 51 -16069 81 -2678 77 -10775 53 -2106 110 -11794 55 -17082 51 -6184 71 -8376 79 -7152 77 -2691 53 -6332 53 -2074 57 -6804 51 -166 53 -2254 53 -452 51 -6771 53 -42749 53 -6658 73 -2034 111 -3440 109 -626 53 -7291 85 -2546 53 -5287 51 -9902 53 -10040 53 -366 79 -13848 51 -3739 77 -47536 51 -354 77 -228 77 -712 53 -530 53 -162 55 -12640 71 -1708 51 -1034 77 -12891 79 -3334 51 -7644 79 -12676 81 -3036 53 -2038 53 -180 57 -818 55 -21459 71 -3009 51 -6572 53 -4015 105 -642 77 -23618 53 -4921 83 -3026 73 -3672 53 -12654 81 -8632 51 -9419 171 -19195 105 -13041 55 -21910 51 -1051 77 -10292 51 -12884 51 -6589 53 -8718 51 -2510 103 -15406 55 -6014 99 -966 73 -2725 53 -12715 51 -4228 55 -3192 57 -8672 51 -14740 51 -17032 75 -11111 1761 -182 399 -106 215 -270 355 -132 329 -150 177 -312 315 -170 169 -290 331 -162 173 -286 187 -312 163 -300 329 -164 311 -162 171 -316 289 -176 297 -194 311 -164 143 -324 167 -314 163 -310 161 -312 163 -300 175 -300 331 -162 173 -312 161 -312 163 -314 161 -298 189 -300 165 -312 161 -312 189 -276 173 -316 193 -310 163 -312 161 -310 163 -300 175 -296 193 -284 191 -284 187 -310 163 -300 175 -300 169 -320 177 -314 485 -464 177 -292 353 -134 RAW_Data: 171 -316 311 -154 187 -292 343 -134 337 -136 199 -286 311 -182 157 -294 327 -160 171 -316 161 -312 159 -314 333 -170 311 -164 141 -324 305 -164 299 -176 301 -170 167 -340 133 -338 163 -312 159 -294 189 -298 165 -314 311 -180 155 -294 189 -300 165 -312 187 -284 189 -312 159 -294 189 -296 167 -314 161 -310 189 -312 159 -292 189 -296 167 -312 161 -312 159 -314 193 -268 175 -304 193 -314 163 -312 159 -312 193 -294 495 -458 161 -338 301 -168 165 -304 331 -134 199 -286 309 -184 309 -170 141 -318 331 -162 143 -316 309 -182 157 -294 189 -302 163 -312 309 -184 311 -170 141 -318 331 -162 299 -150 319 -196 139 -314 165 -334 137 -340 159 -312 161 -302 149 -318 331 -162 173 -312 161 -312 163 -300 175 -296 195 -310 163 -312 159 -312 163 -312 159 -296 189 -300 193 -284 187 -284 189 -312 159 -292 189 -298 167 -312 161 -312 189 -300 173 -294 195 -282 191 -310 485 -472 167 -300 331 -134 171 -312 333 -170 169 -290 331 -162 299 -176 155 -300 333 -162 171 -300 323 -150 145 -340 159 -320 167 -302 319 -150 319 -166 169 -312 331 -162 299 -150 319 -194 139 -314 165 -308 163 -340 133 -338 163 -312 157 -296 327 -160 171 -316 163 -310 161 -312 163 -298 177 -302 193 -314 163 -310 161 -312 163 -300 173 -300 169 -318 177 -290 189 -300 165 -312 161 -312 189 -284 185 -292 189 -300 191 -286 187 -284 191 -312 471 -486 167 -314 313 -152 159 -300 335 -162 169 -308 319 -150 319 -166 169 -312 331 -162 143 -314 311 -180 157 -294 189 -300 165 -314 309 -182 311 -168 141 -318 333 -162 299 -174 295 -194 141 -314 165 -336 137 -338 135 -338 161 -312 159 -294 327 -160 171 -316 161 -312 159 -314 191 -270 201 -278 193 -314 163 -310 161 -312 163 -300 175 -300 169 -316 177 -292 189 -300 165 -312 161 -312 189 -284 183 -294 189 -298 193 -284 187 -312 163 -312 497 -460 145 -320 325 -168 171 -290 333 -162 171 -314 305 -160 317 -168 169 -290 333 -162 173 -312 283 -182 159 -294 189 -302 165 -312 309 -182 313 -168 143 -318 331 -162 301 -148 321 -194 141 -312 167 -334 135 -340 161 -310 163 -312 159 -294 327 -160 171 -316 163 -310 161 -312 163 -300 175 -302 195 -312 163 -312 159 -312 163 -300 175 -298 169 -318 177 -290 191 -300 165 -312 161 -310 189 -284 185 -292 189 -300 191 -286 187 -312 161 -300 487 -484 151 -318 335 -138 169 -322 305 -164 171 -314 305 -190 295 -166 171 -290 333 -162 173 -312 283 -182 159 -296 191 -300 RAW_Data: 165 -312 333 -160 311 -170 141 -318 331 -164 299 -148 321 -194 139 -316 165 -336 135 -340 133 -338 163 -300 149 -320 329 -164 171 -314 159 -312 163 -300 175 -298 193 -310 163 -312 159 -312 163 -300 175 -296 193 -312 163 -312 159 -312 163 -300 175 -298 167 -320 175 -290 191 -296 193 -286 187 -310 163 -300 175 -296 501 -458 187 -288 347 -154 151 -316 325 -162 171 -316 313 -152 301 -194 141 -316 331 -162 143 -314 311 -182 155 -294 189 -302 163 -314 309 -182 311 -168 143 -318 331 -162 301 -174 295 -194 141 -314 165 -336 135 -340 133 -338 163 -312 159 -294 327 -158 173 -314 163 -312 159 -306 173 -314 165 -306 191 -284 189 -284 189 -312 157 -294 191 -300 163 -314 187 -284 189 -284 187 -292 189 -296 165 -314 161 -312 189 -284 185 -294 189 -298 193 -286 485 -492 167 -298 323 -150 175 -302 331 -164 171 -300 321 -150 317 -166 167 -308 331 -134 171 -316 309 -182 129 -318 189 -302 163 -314 309 -182 311 -170 141 -318 331 -162 301 -148 321 -194 139 -314 167 -334 137 -338 161 -310 163 -312 159 -294 327 -160 171 -316 161 -312 159 -312 193 -270 175 -304 193 -314 163 -312 159 -312 161 -314 161 -296 189 -304 165 -312 187 -284 189 -276 173 -318 195 -278 193 -284 187 -312 163 -300 175 -298 169 -318 511 -460 147 -318 327 -168 169 -292 331 -164 171 -314 305 -160 315 -168 171 -290 333 -162 171 -314 283 -182 159 -294 189 -300 165 -314 307 -184 311 -170 141 -318 333 -162 299 -150 319 -194 141 -314 165 -336 135 -340 133 -338 163 -312 157 -294 327 -160 171 -316 163 -310 161 -304 175 -314 167 -304 191 -286 187 -284 189 -284 187 -292 189 -300 165 -312 189 -284 187 -286 185 -294 189 -296 165 -314 161 -312 187 -286 185 -294 189 -298 193 -284 485 -494 167 -298 321 -150 177 -312 313 -168 171 -292 331 -164 299 -174 151 -316 325 -162 171 -316 289 -176 151 -316 187 -296 167 -312 311 -180 307 -170 141 -318 331 -162 299 -150 319 -196 139 -314 165 -334 137 -340 159 -312 161 -302 149 -320 329 -164 171 -314 159 -312 163 -300 175 -298 193 -310 163 -312 161 -310 163 -312 161 -296 189 -302 191 -286 187 -284 189 -312 159 -292 189 -296 167 -314 161 -310 189 -284 187 -292 189 -300 193 -284 485 -494 167 -296 323 -150 175 -312 313 -170 169 -292 333 -162 299 -176 151 -314 327 -160 171 -316 291 -176 149 -316 189 -296 165 -314 309 -182 307 -168 141 -318 331 -164 299 -148 321 -194 141 -314 165 -334 137 -338 161 -312 RAW_Data: 161 -302 147 -320 331 -162 171 -314 161 -312 163 -300 175 -296 195 -310 163 -312 159 -312 163 -300 173 -296 193 -312 163 -312 159 -312 163 -300 175 -298 169 -318 177 -290 191 -296 195 -284 189 -284 189 -312 159 -296 513 -468 159 -300 333 -162 171 -300 323 -150 171 -314 325 -162 311 -164 171 -314 305 -160 159 -296 327 -160 171 -316 161 -312 161 -312 335 -170 311 -164 141 -324 321 -154 299 -194 309 -164 143 -326 167 -314 161 -312 159 -312 163 -302 173 -300 331 -162 173 -312 161 -312 163 -300 175 -300 167 -320 153 -312 191 -296 167 -312 161 -312 189 -312 159 -292 189 -298 167 -312 161 -312 159 -314 193 -268 177 -302 193 -316 161 -312 159 -312 193 -294 497 -456 187 -312 303 -166 165 -306 331 -132 201 -286 309 -182 313 -168 143 -318 331 -162 143 -314 311 -182 157 -294 189 -302 165 -312 309 -182 311 -170 141 -318 333 -162 299 -150 319 -194 141 -314 165 -334 137 -338 161 -312 161 -300 149 -320 331 -162 171 -314 161 -310 163 -302 173 -298 193 -310 165 -310 161 -310 163 -312 161 -296 189 -300 193 -286 187 -284 189 -312 157 -294 189 -298 165 -314 161 -310 189 -284 187 -292 189 -300 193 -284 485 -494 167 -298 321 -150 171 -318 323 -162 171 -314 289 -176 297 -194 141 -314 331 -162 143 -316 309 -182 155 -294 189 -302 163 -314 309 -182 311 -168 143 -318 331 -162 301 -148 321 -194 139 -314 167 -334 137 -338 161 -310 163 -300 149 -320 331 -162 171 -314 161 -312 163 -300 173 -298 193 -310 163 -312 159 -312 163 -300 175 -296 193 -312 163 -312 159 -312 163 -300 175 -298 167 -320 175 -290 191 -296 193 -286 187 -310 163 -312 161 -296 513 -468 159 -300 333 -162 171 -302 321 -150 175 -300 333 -162 311 -162 171 -316 289 -176 153 -314 327 -160 171 -316 163 -312 159 -312 307 -168 335 -138 169 -320 307 -164 297 -176 301 -194 141 -318 165 -336 137 -338 133 -338 163 -312 159 -294 327 -160 171 -316 161 -312 161 -312 163 -298 177 -302 169 -318 177 -292 189 -298 167 -312 189 -284 189 -312 157 -294 189 -298 167 -312 161 -312 159 -312 193 -270 203 -302 169 -314 161 -312 189 -310 467 -484 145 -318 327 -168 143 -316 331 -162 173 -312 307 -160 313 -170 141 -318 331 -164 143 -342 281 -184 157 -294 189 -302 165 -312 307 -184 313 -168 141 -320 331 -162 299 -150 319 -194 141 -314 165 -336 137 -338 135 -338 161 -312 159 -294 327 -158 173 -314 163 -310 161 -312 165 -298 175 -304 193 -312 163 -312 159 -312 RAW_Data: 163 -300 175 -298 169 -318 177 -290 191 -298 165 -314 161 -310 189 -284 185 -292 189 -298 193 -284 189 -310 163 -312 497 -460 145 -320 325 -170 169 -290 333 -162 171 -314 307 -158 317 -168 169 -290 333 -162 171 -314 281 -182 159 -296 189 -300 165 -312 309 -182 313 -168 143 -318 331 -162 301 -148 319 -196 139 -314 165 -336 137 -338 135 -338 161 -312 159 -294 327 -160 173 -314 163 -312 159 -312 163 -300 175 -302 195 -312 163 -312 159 -312 163 -300 175 -298 169 -318 175 -292 189 -300 165 -312 161 -312 187 -284 185 -292 189 -300 193 -284 187 -312 161 -314 471 -486 167 -314 313 -152 159 -300 335 -162 169 -308 321 -156 329 -170 127 -318 321 -176 155 -300 333 -164 169 -302 165 -314 161 -310 329 -168 299 -166 151 -328 311 -154 331 -168 299 -178 143 -318 153 -322 167 -332 149 -320 151 -318 165 -304 321 -156 181 -290 189 -300 173 -294 177 -294 189 -302 173 -294 177 -294 189 -302 173 -294 177 -318 193 -278 173 -294 179 -292 191 -302 173 -294 177 -294 189 -302 173 -320 177 -294 195 -278 175 -318 491 -460 163 -314 333 -158 159 -294 327 -160 171 -316 311 -180 307 -170 141 -318 331 -162 143 -316 309 -182 157 -294 189 -302 165 -312 309 -182 313 -168 141 -318 331 -164 299 -148 321 -194 141 -314 165 -334 137 -338 135 -338 161 -312 159 -294 329 -158 173 -314 163 -310 161 -306 173 -314 165 -304 193 -284 187 -286 189 -276 197 -294 193 -310 163 -312 161 -310 163 -300 175 -296 193 -310 165 -284 187 -310 163 -300 175 -300 169 -318 177 -316 483 -466 187 -292 341 -134 171 -308 319 -150 179 -300 333 -164 309 -162 171 -316 313 -152 153 -316 327 -160 171 -316 163 -310 161 -312 307 -166 337 -136 171 -322 305 -164 299 -174 301 -194 141 -318 165 -336 137 -338 161 -310 163 -300 149 -320 331 -162 171 -314 161 -312 163 -300 173 -296 195 -310 163 -312 159 -312 163 -312 159 -296 189 -302 165 -312 189 -284 189 -284 185 -294 189 -296 165 -314 161 -310 189 -284 187 -294 189 -298 193 -284 485 -494 167 -298 321 -150 177 -312 313 -168 171 -290 333 -162 299 -176 151 -316 325 -162 171 -316 289 -176 151 -314 189 -296 165 -314 309 -182 305 -170 141 -318 333 -162 299 -150 319 -194 141 -314 165 -334 137 -340 133 -338 161 -302 149 -320 329 -164 171 -286 187 -312 163 -300 173 -298 193 -310 163 -312 159 -312 163 -312 159 -296 189 -302 191 -286 187 -284 189 -312 159 -292 191 -296 165 -314 161 -310 189 -284 187 -292 RAW_Data: 189 -300 193 -284 485 -494 167 -298 321 -150 177 -300 327 -150 167 -328 305 -160 319 -168 171 -290 333 -162 171 -314 281 -184 159 -296 189 -300 165 -314 307 -184 311 -170 141 -318 333 -162 299 -150 319 -194 139 -314 167 -334 135 -340 133 -338 163 -312 159 -294 327 -158 173 -314 163 -312 159 -312 165 -298 177 -302 193 -314 163 -310 161 -312 163 -300 173 -300 167 -318 177 -292 189 -300 165 -312 161 -312 187 -284 185 -292 189 -300 191 -286 187 -284 189 -300 487 -484 149 -320 333 -138 171 -322 321 -154 151 -316 327 -160 311 -164 173 -312 307 -160 161 -298 355 -132 173 -314 163 -310 161 -312 335 -170 311 -164 143 -322 307 -164 323 -150 301 -196 141 -318 165 -334 137 -338 161 -312 161 -302 147 -320 331 -162 173 -312 161 -312 163 -300 173 -298 195 -310 163 -312 159 -312 163 -312 159 -296 189 -300 193 -284 189 -284 189 -284 185 -294 189 -296 165 -314 161 -312 189 -284 185 -294 189 -298 193 -286 485 -468 193 -296 323 -150 147 -340 313 -168 171 -292 331 -164 299 -174 151 -316 325 -160 173 -316 289 -176 149 -316 189 -294 165 -314 309 -182 307 -170 141 -318 331 -164 299 -148 321 -194 139 -314 167 -306 165 -338 133 -338 163 -312 159 -294 327 -160 173 -314 163 -312 161 -310 165 -300 175 -300 169 -318 177 -290 189 -298 165 -314 187 -284 189 -312 159 -294 189 -298 165 -314 161 -310 161 -306 173 -316 193 -280 191 -312 159 -312 163 -300 515 -460 161 -312 305 -190 135 -328 329 -134 201 -286 309 -182 311 -168 143 -318 331 -162 143 -316 309 -182 157 -294 189 -300 165 -312 309 -184 311 -168 143 -318 331 -162 301 -148 319 -196 139 -314 165 -334 137 -340 159 -312 163 -300 149 -318 331 -162 173 -312 161 -312 163 -300 175 -296 195 -310 163 -312 159 -312 163 -300 173 -296 193 -312 163 -312 159 -312 163 -312 161 -298 189 -300 165 -312 161 -312 189 -312 159 -292 191 -300 191 -286 485 -468 193 -298 323 -148 147 -342 323 -160 173 -314 289 -176 297 -196 139 -314 331 -162 143 -314 311 -180 157 -292 191 -300 165 -312 311 -182 309 -170 141 -318 333 -162 299 -150 319 -194 141 -314 165 -334 137 -338 161 -312 161 -312 159 -294 329 -158 173 -314 163 -310 161 -312 165 -298 175 -304 193 -312 163 -310 161 -310 163 -302 173 -300 169 -318 175 -292 189 -300 165 -312 161 -310 189 -278 173 -316 195 -280 191 -312 159 -312 163 -300 515 -460 163 -310 305 -190 137 -328 329 -134 199 -288 309 -182 311 -168 143 -318 RAW_Data: 331 -162 143 -316 309 -182 157 -292 191 -300 165 -312 309 -182 313 -168 141 -318 331 -164 299 -174 295 -194 141 -314 165 -334 137 -340 133 -338 163 -312 159 -292 327 -160 171 -316 163 -310 161 -312 165 -298 175 -304 193 -312 163 -312 159 -312 163 -300 175 -300 169 -316 177 -292 189 -298 167 -312 161 -310 189 -278 173 -316 193 -282 191 -312 159 -312 163 -300 515 -460 163 -310 305 -190 137 -326 331 -132 201 -286 309 -184 309 -170 141 -318 333 -162 143 -314 311 -180 159 -294 189 -300 165 -312 309 -184 311 -168 143 -318 331 -162 301 -148 319 -196 139 -314 165 -336 135 -340 159 -312 163 -300 149 -320 329 -164 171 -314 159 -312 163 -300 175 -296 195 -310 163 -312 159 -312 163 -300 175 -294 195 -310 163 -312 161 -310 163 -300 175 -298 169 -318 153 -314 191 -296 193 -286 187 -284 189 -312 161 -294 509 -468 159 -298 335 -162 169 -304 323 -150 175 -300 335 -162 311 -160 173 -316 313 -152 151 -316 327 -160 171 -316 163 -312 159 -312 307 -168 335 -138 169 -322 305 -164 299 -176 299 -194 141 -316 167 -334 137 -340 159 -312 161 -302 147 -320 331 -162 173 -312 161 -312 163 -300 175 -296 193 -310 165 -310 161 -312 161 -302 173 -296 195 -310 163 -312 161 -310 163 -300 175 -298 169 -318 177 -290 189 -296 193 -286 187 -310 163 -300 175 -296 501 -484 161 -288 347 -154 151 -316 325 -160 173 -314 313 -152 301 -196 141 -314 331 -162 143 -316 309 -182 157 -294 189 -300 165 -314 309 -182 311 -168 143 -318 331 -162 301 -148 319 -196 139 -314 165 -336 137 -338 133 -338 163 -312 159 -294 327 -158 173 -316 161 -312 159 -312 163 -298 177 -302 193 -314 163 -312 159 -312 163 -300 175 -298 169 -318 177 -290 191 -298 165 -314 161 -310 189 -284 193 -292 179 -308 167 -314 161 -312 189 -302 481 -460 173 -320 303 -168 169 -294 331 -164 171 -314 307 -160 319 -168 169 -292 331 -162 143 -342 283 -182 159 -294 189 -302 165 -312 309 -184 311 -168 143 -318 331 -162 299 -150 319 -194 141 -314 165 -336 135 -340 133 -338 163 -312 159 -294 327 -158 173 -316 161 -312 159 -312 165 -298 177 -302 193 -312 163 -312 161 -310 163 -314 161 -296 189 -302 165 -312 187 -284 189 -284 185 -294 189 -296 165 -314 187 -284 189 -302 173 -294 195 -310 491 -458 163 -318 319 -156 153 -314 327 -160 171 -316 311 -152 327 -170 141 -316 331 -164 143 -314 309 -182 157 -294 189 -300 165 -314 309 -182 311 -168 143 -316 333 -162 299 -150 RAW_Data: 319 -194 141 -314 165 -336 135 -340 133 -338 163 -312 159 -294 327 -160 171 -316 161 -312 159 -314 163 -300 175 -302 193 -314 163 -310 161 -310 163 -300 175 -300 167 -318 177 -290 191 -300 165 -312 161 -312 187 -284 185 -292 189 -300 191 -286 187 -310 163 -300 487 -484 149 -320 335 -138 169 -322 305 -164 171 -314 305 -190 293 -168 169 -292 333 -162 171 -314 281 -184 159 -296 189 -300 165 -312 309 -184 311 -170 141 -318 331 -162 299 -150 319 -196 139 -314 165 -336 137 -338 133 -338 163 -312 159 -294 327 -160 171 -316 161 -312 159 -312 165 -298 177 -302 193 -314 163 -310 161 -310 163 -314 161 -296 189 -302 165 -312 187 -286 189 -276 173 -318 193 -280 191 -284 189 -310 163 -300 175 -300 167 -318 513 -460 167 -314 311 -152 161 -324 311 -162 169 -310 329 -160 293 -190 137 -330 329 -132 173 -316 311 -180 129 -318 189 -300 165 -312 309 -182 311 -168 141 -320 329 -164 299 -174 295 -194 141 -314 167 -334 137 -340 133 -338 161 -312 159 -294 329 -158 173 -314 163 -310 161 -312 163 -300 175 -302 195 -312 163 -312 159 -312 163 -300 175 -298 169 -318 177 -290 189 -300 165 -312 161 -312 189 -284 183 -292 189 -300 193 -284 187 -284 189 -314 471 -486 145 -318 327 -168 171 -290 331 -162 173 -312 307 -158 317 -168 169 -290 333 -162 143 -342 283 -182 159 -294 189 -300 165 -312 309 -182 313 -168 143 -318 331 -162 299 -176 293 -196 139 -314 167 -334 137 -338 161 -310 163 -300 149 -320 331 -162 171 -314 161 -312 163 -300 173 -296 195 -310 163 -312 159 -312 163 -312 159 -296 189 -302 193 -284 187 -284 189 -302 149 -318 193 -280 191 -284 189 -284 189 -300 173 -300 169 -316 177 -316 483 -476 153 -320 329 -134 201 -286 309 -182 157 -294 355 -132 339 -136 169 -320 315 -162 171 -302 323 -148 171 -318 159 -318 147 -318 327 -168 313 -164 169 -302 321 -150 317 -166 305 -164 169 -324 169 -314 163 -310 161 -310 163 -300 175 -296 331 -164 171 -314 161 -312 163 -300 175 -298 195 -310 163 -312 159 -312 163 -300 173 -296 193 -312 163 -312 159 -312 163 -300 175 -298 169 -318 177 -290 189 -298 195 -284 187 -284 189 -314 159 -294 513 -470 159 -300 333 -162 171 -300 323 -150 169 -316 325 -160 311 -164 173 -312 307 -158 161 -294 329 -158 173 -314 163 -312 159 -312 335 -170 311 -164 141 -324 305 -164 323 -152 301 -194 141 -318 165 -336 137 -338 161 -312 161 -312 159 -294 329 -158 173 -314 163 -310 161 -312 RAW_Data: 165 -298 175 -304 169 -318 175 -290 191 -298 165 -314 187 -284 189 -312 159 -294 191 -296 167 -312 161 -312 159 -314 193 -270 201 -304 167 -314 163 -312 159 -312 493 -486 145 -318 325 -170 141 -316 331 -162 173 -314 305 -160 313 -170 141 -318 331 -162 143 -342 283 -182 159 -294 189 -302 165 -312 309 -182 313 -168 141 -318 331 -162 301 -148 321 -194 141 -314 165 -334 137 -340 159 -312 161 -302 147 -320 331 -162 173 -312 161 -312 163 -300 175 -296 193 -310 165 -310 161 -310 163 -302 173 -296 193 -312 161 -312 159 -312 163 -300 175 -300 167 -320 177 -290 189 -298 193 -286 187 -284 189 -312 161 -294 513 -468 159 -300 333 -162 171 -302 321 -150 171 -316 323 -162 311 -164 171 -314 307 -158 159 -296 327 -160 171 -316 163 -310 161 -306 321 -168 339 -134 171 -306 321 -150 317 -166 337 -164 143 -324 167 -314 163 -312 159 -312 163 -300 175 -298 331 -162 173 -312 161 -312 163 -300 175 -300 193 -310 163 -312 161 -310 163 -312 161 -296 189 -300 193 -284 189 -284 189 -284 185 -294 189 -296 165 -314 161 -312 187 -286 185 -292 191 -298 193 -284 485 -494 167 -298 321 -150 177 -312 313 -146 167 -344 305 -158 315 -168 143 -318 331 -162 143 -342 283 -182 159 -294 189 -302 163 -314 307 -184 311 -168 141 -318 333 -162 299 -174 295 -194 141 -314 167 -334 137 -338 161 -312 161 -312 159 -294 329 -160 171 -316 163 -310 161 -312 163 -300 175 -302 169 -318 175 -290 191 -298 165 -312 189 -284 189 -312 159 -292 189 -298 165 -314 161 -312 189 -282 195 -268 203 -304 169 -312 163 -312 187 -278 507 -460 173 -320 303 -166 171 -294 331 -164 171 -314 305 -160 319 -168 169 -292 331 -164 171 -314 281 -182 159 -294 191 -300 165 -312 309 -182 313 -168 143 -318 331 -162 301 -148 319 -196 139 -314 165 -336 135 -340 133 -338 163 -312 159 -294 327 -160 171 -316 161 -312 159 -314 163 -300 175 -302 193 -312 163 -312 159 -312 163 -300 175 -298 169 -318 177 -292 189 -300 165 -312 161 -310 189 -284 193 -292 179 -308 167 -314 161 -312 189 -302 483 -458 173 -320 303 -168 169 -294 331 -164 171 -314 307 -158 319 -168 169 -292 331 -164 171 -314 283 -182 159 -294 191 -300 165 -312 309 -182 313 -168 143 -316 331 -164 299 -150 319 -194 141 -314 165 -334 137 -340 133 -338 161 -312 159 -294 327 -160 171 -316 161 -312 159 -314 163 -298 177 -304 193 -312 163 -312 161 -310 163 -314 161 -296 189 -302 163 -314 161 -310 189 -284 RAW_Data: 185 -294 189 -296 165 -314 189 -284 189 -312 157 -294 189 -300 497 -456 189 -284 345 -154 153 -316 325 -160 173 -314 315 -150 325 -170 141 -314 331 -164 143 -314 309 -182 157 -294 189 -302 163 -314 307 -184 311 -168 141 -318 333 -162 299 -174 295 -194 141 -314 165 -334 137 -340 159 -312 163 -300 149 -318 331 -164 171 -314 159 -312 163 -300 175 -298 193 -310 163 -312 159 -312 163 -312 159 -296 189 -300 165 -314 187 -284 189 -312 157 -294 189 -298 165 -314 161 -310 189 -284 187 -292 189 -300 193 -284 485 -468 193 -296 323 -150 175 -312 313 -168 171 -292 331 -164 299 -176 149 -316 325 -162 171 -316 289 -176 151 -314 189 -296 165 -314 309 -182 307 -168 143 -316 331 -164 299 -150 319 -194 141 -312 167 -334 137 -338 161 -310 163 -300 149 -320 331 -162 171 -314 161 -312 163 -300 173 -298 193 -310 163 -312 159 -312 163 -300 173 -296 169 -318 177 -292 189 -300 165 -312 161 -312 189 -284 183 -294 189 -294 195 -284 187 -284 191 -300 173 -296 499 -482 163 -314 321 -154 153 -316 325 -160 173 -314 313 -152 301 -196 139 -316 331 -162 143 -314 311 -182 155 -294 189 -302 163 -314 309 -182 311 -168 143 -318 331 -162 301 -148 319 -196 139 -314 165 -336 135 -340 159 -312 163 -300 149 -320 329 -164 171 -314 159 -312 163 -300 175 -296 193 -310 165 -310 161 -312 161 -302 173 -296 169 -316 177 -292 189 -300 165 -314 161 -310 189 -284 185 -292 189 -296 193 -286 187 -284 189 -300 175 -294 499 -482 163 -314 321 -154 153 -316 325 -160 171 -316 313 -152 325 -170 141 -314 331 -164 143 -314 311 -180 157 -294 191 -300 165 -312 309 -182 311 -168 141 -320 329 -164 299 -174 295 -194 141 -314 165 -336 135 -340 133 -338 163 -312 159 -294 327 -160 173 -314 163 -312 159 -312 163 -300 175 -302 195 -310 163 -312 159 -312 163 -300 175 -298 169 -318 177 -292 189 -298 165 -314 161 -310 189 -284 185 -292 189 -298 193 -284 187 -286 189 -312 471 -486 145 -320 325 -168 171 -290 331 -162 173 -312 307 -160 315 -168 169 -292 331 -162 143 -342 283 -182 159 -294 189 -302 165 -312 309 -182 311 -170 141 -318 331 -164 299 -148 319 -196 139 -314 167 -334 135 -340 161 -310 163 -300 149 -320 331 -162 171 -314 161 -310 163 -314 161 -296 189 -296 165 -314 161 -310 189 -284 185 -292 189 -298 165 -312 161 -312 189 -276 173 -318 193 -278 191 -286 187 -284 189 -300 175 -298 169 -318 177 -314 483 -466 187 -294 339 -136 169 -306 RAW_Data: 321 -150 177 -300 333 -164 311 -160 173 -314 313 -152 155 -314 327 -160 171 -316 163 -312 159 -312 307 -166 337 -138 169 -322 305 -164 299 -176 301 -194 141 -316 165 -336 137 -338 161 -310 163 -300 149 -320 331 -162 171 -314 161 -312 163 -300 173 -298 193 -310 163 -312 159 -312 163 -300 175 -294 169 -318 177 -292 189 -300 165 -312 161 -312 189 -284 183 -292 189 -296 193 -286 187 -284 189 -302 173 -296 499 -458 187 -312 321 -154 153 -316 325 -162 171 -316 313 -152 301 -194 141 -314 331 -162 143 -316 309 -182 157 -292 189 -302 163 -314 309 -182 311 -170 141 -318 331 -162 311 -160 295 -190 163 -302 165 -304 165 -312 161 -338 163 -312 157 -294 327 -160 171 -316 161 -312 159 -312 165 -298 177 -302 193 -312 163 -312 159 -312 163 -300 175 -298 169 -318 177 -290 191 -298 165 -314 159 -312 189 -284 185 -290 189 -300 193 -284 189 -284 189 -312 471 -460 483 -2128 125 -52 75 -102 75 -154 101 -100 147 -272 149 -328 75 -228 511 -441 77 -212 87 -114 189 -54 263 -156 171 -393 127 -102 183 -110 293 -242 395 -320 107 -52 81 -346 53 -572 155 -381 305 -234 101 -126 228 -156 195 -102 281 -126 518 -52 313 -240 187 -54 79 -316 133 -136 213 -108 79 -80 185 -464 181 -76 379 -80 81 -506 233 -318 103 -78 53 -559 51 -240 53 -106 207 -136 163 -136 81 -218 187 -104 349 -266 51 -266 129 -80 107 -450 131 -331 127 -359 641 -108 472 -100 547 -82 79 -246 107 -560 567 -130 403 -389 149 -179 77 -526 235 -108 81 -78 51 -455 75 -106 105 -240 101 -557 183 -184 255 -102 311 -130 147 -174 457 -354 75 -442 81 -344 331 -76 51 -106 133 -54 161 -560 77 -130 77 -294 257 -52 99 -126 73 -565 51 -242 131 -497 55 -354 347 -404 81 -108 540 -286 185 -465 219 -264 296 -106 77 -294 193 -110 567 -52 287 -134 53 -106 55 -330 263 -210 83 -86 109 -134 349 -80 221 -80 207 -260 279 -76 75 -74 75 -76 99 -130 443 -78 77 -338 129 -226 179 -280 129 -228 75 -617 185 -324 423 -160 259 -673 159 -188 362 -212 205 -383 151 -316 235 -240 183 -188 79 -56 107 -80 53 -154 417 -158 211 -238 109 -80 79 -218 215 -108 105 -354 215 -112 191 -56 103 -132 77 -236 605 -152 51 -78 185 -78 127 -126 551 -156 135 -186 127 -724 131 -56 81 -378 345 -182 109 -316 107 -316 337 -128 151 -294 101 -1002 101 -52 335 -256 51 -330 81 -448 153 -158 127 -272 131 -160 105 -220 767 -132 RAW_Data: 75 -210 131 -78 181 -243 345 -108 107 -80 105 -160 107 -218 127 -82 537 -266 239 -340 181 -76 105 -78 421 -482 53 -132 321 -134 51 -262 77 -480 103 -271 475 -154 159 -80 313 -132 79 -282 235 -126 75 -202 175 -226 151 -198 901 -210 51 -78 235 -348 79 -130 103 -584 107 -456 105 -54 431 -54 79 -106 133 -242 105 -486 155 -104 129 -228 147 -100 77 -618 357 -154 531 -104 51 -160 105 -136 109 -140 269 -366 51 -832 53 -270 135 -108 51 -186 51 -160 535 -130 77 -296 51 -182 131 -106 341 -56 135 -194 530 -294 181 -562 75 -179 127 -364 207 -74 125 -332 149 -76 129 -102 103 -102 51 -128 173 -122 482 -474 229 -200 97 -790 105 -104 79 -104 341 -262 101 -110 111 -82 109 -433 271 -210 51 -346 245 -54 209 -284 157 -106 293 -234 77 -826 157 -52 127 -228 299 -490 159 -140 137 -164 247 -294 135 -52 131 -266 77 -128 385 -158 81 -276 356 -476 53 -170 55 -463 79 -190 53 -808 51 -80 159 -106 161 -162 83 -225 187 -341 101 -520 159 -54 428 -182 341 -108 79 -274 77 -108 431 -392 77 -132 131 -138 83 -58 135 -274 305 -300 83 -398 79 -534 131 -528 263 -52 261 -264 437 -342 77 -102 389 -332 103 -130 131 -322 105 -106 53 -134 183 -188 79 -82 81 -104 53 -316 269 -56 347 -286 341 -270 161 -52 131 -136 223 -110 341 -318 469 -138 143 -110 83 -80 53 -54 183 -346 385 -906 51 -382 75 -154 51 -52 207 -186 53 -78 51 -106 293 -52 155 -126 306 -130 412 -416 187 -82 339 -160 135 -194 163 -136 81 -78 281 -426 229 -76 227 -532 177 -528 51 -244 269 -616 75 -52 418 -136 53 -82 51 -154 97 -126 233 -52 51 -740 77 -162 81 -304 263 -162 217 -448 275 -164 185 -138 139 -54 277 -348 531 -642 376 -274 267 -182 75 -126 103 -615 103 -236 81 -380 77 -52 241 -80 105 -438 111 -192 181 -54 135 -186 113 -58 243 -140 57 -385 189 -158 133 -675 231 -80 241 -236 131 -106 109 -108 55 -136 555 -132 303 -494 341 -316 135 -112 302 -366 97 -98 101 -310 177 -78 427 -297 151 -579 163 -314 129 -78 51 -233 105 -210 103 -202 217 -180 121 -229 125 -302 221 -52 235 -158 187 -110 135 -162 51 -108 105 -398 221 -82 297 -110 53 -1400 213 -106 51 -454 723 -368 79 -104 79 -134 81 -323 51 -372 79 -80 235 -132 549 -164 81 -104 129 -602 371 -160 129 -536 179 -234 133 -210 236 -489 159 -52 237 -210 129 -264 53 -242 105 -106 53 -114 RAW_Data: 193 -290 191 -436 343 -311 207 -322 53 -400 51 -882 135 -678 375 -244 317 -192 380 -558 260 -154 710 -80 237 -218 109 -250 81 -372 107 -160 646 -286 125 -178 269 -726 51 -106 79 -298 523 -682 159 -498 265 -465 127 -592 177 -100 149 -687 103 -78 357 -102 53 -158 105 -240 79 -618 105 -130 79 -478 77 -154 450 -186 53 -192 137 -1038 105 -160 266 -136 51 -345 53 -80 157 -108 235 -102 483 -54 109 -234 327 -376 51 -462 366 -289 163 -108 75 -262 261 -134 81 -78 105 -136 81 -378 105 -272 139 -106 209 -80 205 -184 101 -76 101 -180 229 -427 99 -430 125 -100 103 -469 125 -102 221 -130 209 -106 105 -104 201 -274 332 -232 105 -166 161 -104 275 -80 131 -1000 321 -156 189 -166 81 -130 367 -262 153 -258 75 -260 127 -542 127 -464 107 -80 107 -108 303 -240 77 -238 181 -282 77 -76 224 -104 75 -74 225 -554 131 -56 55 -164 51 -318 247 -130 159 -158 77 -76 285 -354 133 -52 135 -420 155 -256 129 -78 265 -831 103 -231 107 -674 285 -653 337 -102 257 -182 101 -146 147 -303 75 -206 365 -268 157 -54 81 -504 133 -472 107 -82 161 -80 133 -461 81 -825 79 -798 101 -206 207 -80 185 -980 209 -56 247 -246 51 -106 131 -78 79 -236 53 -106 51 -98 101 -206 127 -78 151 -98 279 -155 157 -468 131 -72 173 -372 329 -212 79 -52 101 -375 77 -286 51 -188 185 -308 191 -56 555 -320 179 -86 193 -490 105 -214 81 -138 53 -216 211 -112 57 -134 213 -212 131 -714 73 -128 155 -590 51 -452 189 -261 247 -162 105 -404 167 -56 77 -354 81 -56 215 -316 129 -372 366 -288 133 -56 295 -294 51 -822 53 -482 295 -340 321 -188 459 -631 147 -212 201 -100 173 -258 305 -261 51 -208 97 -124 103 -598 159 -206 77 -710 213 -190 241 -158 133 -186 385 -266 219 -350 133 -52 157 -78 51 -156 403 -162 189 -300 259 -202 103 -760 179 -258 173 -82 431 -164 161 -373 133 -208 191 -82 237 -52 135 -384 131 -192 55 -52 285 -52 79 -274 57 -140 109 -306 53 -132 133 -240 53 -104 51 -214 79 -158 123 -98 99 -126 77 -178 173 -334 178 -518 129 -236 337 -206 230 -100 225 -52 152 -102 103 -308 51 -52 203 -114 139 -318 211 -396 183 -78 51 -106 77 -164 83 -380 133 -234 237 -54 79 -158 83 -84 137 -136 323 -158 365 -128 157 -108 81 -194 109 -618 155 -363 191 -190 109 -110 55 -80 163 -224 79 -82 105 -270 133 -314 159 -106 153 -356 77 -76 75 -458 149 -74 RAW_Data: 101 -128 53 -130 153 -212 447 -230 171 -636 75 -98 324 -362 51 -160 217 -218 51 -310 101 -152 379 -280 151 -176 203 -210 51 -130 336 -232 179 -596 629 -298 55 -1302 261 -108 109 -80 77 -162 237 -52 125 -52 75 -100 125 -148 297 -426 107 -110 133 -238 155 -228 123 -100 247 -74 179 -126 99 -148 99 -134 81 -194 81 -248 53 -164 135 -82 109 -717 53 -220 81 -234 79 -344 53 -474 79 -154 51 -618 109 -142 83 -593 135 -134 105 -136 81 -243 413 -228 121 -174 125 -328 53 -658 361 -74 401 -280 131 -132 85 -56 139 -298 157 -481 51 -52 129 -76 75 -152 127 -507 321 -486 185 -264 103 -54 325 -76 183 -104 53 -246 81 -78 185 -210 155 -112 55 -80 77 -720 103 -54 51 -450 51 -104 107 -246 185 -78 267 -482 221 -580 113 -222 365 -80 135 -138 199 -296 261 -164 107 -80 131 -134 107 -272 323 -1120 51 -476 81 -106 211 -132 107 -352 183 -134 133 -108 215 -220 55 -666 131 -218 79 -82 253 -56 103 -52 235 -106 103 -134 185 -532 111 -188 361 -399 183 -693 238 -104 567 -106 113 -280 107 -52 287 -106 161 -908 103 -376 339 -180 73 -200 101 -330 209 -54 107 -220 315 -132 216 -138 159 -438 135 -190 73 -130 510 -244 53 -294 81 -84 171 -138 53 -460 515 -82 219 -315 291 -54 107 -270 107 -54 53 -160 79 -374 209 -154 97 -74 233 -454 125 -144 119 -96 99 -542 75 -1200 103 -204 99 -172 95 -98 127 -78 75 -102 103 -320 241 -820 77 -78 105 -326 135 -264 53 -216 133 -517 211 -228 103 -52 257 -455 127 -74 77 -78 235 -436 151 -102 75 -152 75 -76 75 -303 51 -254 177 -284 103 -152 207 -156 79 -302 53 -610 79 -214 133 -80 243 -110 107 -108 185 -286 155 -212 187 -384 75 -128 77 -80 129 -130 99 -76 156 -104 185 -82 81 -242 217 -380 81 -294 157 -182 161 -134 131 -104 77 -52 181 -150 75 -98 147 -230 129 -760 161 -273 137 -84 111 -674 53 -80 127 -317 265 -210 79 -242 297 -238 75 -328 105 -244 345 -342 131 -254 151 -378 103 -335 101 -288 75 -154 275 -498 75 -224 372 -80 157 -190 395 -268 81 -52 105 -160 277 -510 107 -262 105 -192 109 -188 81 -586 105 -78 123 -98 201 -182 55 -614 101 -170 175 -285 79 -222 191 -658 161 -194 135 -532 107 -810 77 -134 241 -128 147 -150 276 -200 97 -230 157 -104 171 -282 77 -212 77 -80 406 -714 259 -182 131 -128 161 -112 81 -380 79 -290 135 -777 345 -370 385 -178 51 -364 RAW_Data: 215 -189 53 -108 83 -320 209 -530 51 -265 51 -54 109 -242 351 -362 51 -102 51 -156 173 -247 255 -100 99 -176 99 -52 224 -262 53 -80 279 -356 51 -76 379 -176 75 -220 77 -52 129 -208 129 -304 101 -378 157 -52 53 -102 179 -228 255 -311 131 -192 235 -52 51 -126 273 -721 53 -294 161 -170 55 -376 81 -268 131 -98 129 -268 81 -158 107 -80 161 -214 129 -110 501 -220 185 -688 79 -132 325 -212 53 -295 105 -104 51 -106 79 -372 153 -106 137 -84 193 -741 51 -561 51 -402 390 -126 149 -250 327 -338 177 -202 177 -931 105 -271 423 -768 53 -430 159 -110 217 -104 161 -460 249 -82 79 -186 79 -104 53 -132 79 -218 55 -298 53 -214 81 -354 51 -108 107 -196 273 -80 79 -104 153 -100 175 -76 131 -220 81 -56 131 -368 217 -116 137 -82 169 -342 209 -106 319 -396 75 -104 253 -130 149 -430 127 -130 81 -196 55 -404 105 -726 181 -224 199 -106 79 -220 159 -180 75 -126 201 -128 75 -833 127 -128 125 -230 249 -184 51 -218 79 -240 163 -222 135 -82 103 -80 159 -765 107 -276 237 -438 207 -162 133 -128 135 -316 105 -312 137 -486 181 -158 77 -769 183 -764 533 -186 77 -100 173 -128 202 -174 174 -102 185 -52 51 -128 177 -358 101 -96 145 -126 75 -184 135 -558 51 -186 211 -241 237 -154 203 -508 103 -562 171 -320 99 -148 127 -212 53 -472 77 -128 147 -100 105 -136 111 -322 206 -238 79 -162 51 -559 109 -198 113 -461 53 -849 159 -230 51 -306 121 -316 105 -78 105 -182 153 -234 131 -226 83 -800 105 -104 215 -52 185 -572 235 -660 97 -922 53 -517 53 -80 133 -302 53 -134 345 -78 111 -374 133 -80 157 -106 185 -184 373 -110 55 -292 129 -140 247 -240 347 -130 73 -227 75 -648 153 -128 75 -1002 155 -335 169 -404 101 -76 175 -126 103 -373 79 -402 217 -218 101 -171 301 -158 204 -76 123 -100 51 -148 251 -334 77 -211 103 -304 359 -78 105 -52 99 -560 101 -288 303 -436 131 -234 179 -252 131 -656 51 -260 129 -160 79 -106 51 -184 203 -152 103 -234 155 -200 235 -52 133 -164 324 -106 107 -82 107 -348 313 -188 79 -372 79 -549 185 -82 79 -246 265 -720 107 -788 77 -585 79 -128 75 -130 203 -76 75 -206 228 -234 79 -180 101 -532 210 -282 229 -412 103 -140 55 -54 77 -316 151 -356 51 -102 75 -272 51 -506 51 -744 329 -340 129 -104 135 -300 167 -1318 107 -186 51 -136 107 -603 107 -338 105 -492 131 -250 107 -80 109 -170 79 -162 RAW_Data: 101 -102 109 -306 181 -330 209 -76 101 -286 79 -126 51 -156 103 -78 357 -248 77 -260 51 -76 99 -320 323 -76 99 -124 199 -632 105 -220 290 -260 125 -234 75 -272 103 -252 423 -623 81 -80 105 -264 77 -1040 51 -106 107 -1561 81 -732 107 -82 167 -327 159 -626 53 -162 53 -162 107 -238 235 -106 163 -108 105 -104 105 -136 133 -306 51 -430 129 -152 109 -86 111 -56 81 -616 161 -130 51 -514 107 -236 208 -110 193 -638 133 -82 109 -543 216 -457 111 -84 169 -1168 201 -52 75 -78 289 -284 103 -874 105 -166 81 -244 129 -54 214 -398 81 -56 137 -410 81 -268 159 -372 103 -106 83 -814 207 -230 177 -280 75 -966 51 -823 77 -102 105 -394 139 -112 81 -1292 75 -727 183 -734 51 -590 83 -242 77 -1674 105 -562 107 -484 103 -104 107 -2114 77 -2326 51 -1052 207 -594 129 -232 177 -895 51 -506 203 -671 75 -206 101 -328 77 -104 105 -132 77 -370 186 -82 79 -846 77 -1272 53 -1609 177 -406 51 -226 121 -330 51 -280 73 -3094 75 -802 236 -3347 53 -2218 51 -1176 107 -212 75 -1460 51 -714 81 -1643 105 -4782 55 -5096 51 -7167 53 -17412 53 -6530 51 -20019 51 -12370 71 -442 103 -10796 55 -1320 105 -660 51 -1854 135 -16801 77 -5863 87 -12342 119 -24656 81 -7111 101 -15641 79 -3617 75 -10578 127 -5573 77 -16152 53 -5624 51 -13975 71 -7720 79 -3760 51 -9739 77 -1892 73 -2638 153 -4570 51 -5265 53 -3429 79 -1982 53 -2154 51 -7158 53 -12468 161 -12934 79 -14244 77 -3871 105 -2482 79 -4568 99 -218 79 -17125 53 -2368 53 -10101 55 -15958 81 -2358 109 -3584 51 -6886 85 -6834 51 -4154 53 -218 53 -826 55 -7583 51 -11429 216 -1346 71 -1856 79 -982 55 -2072 51 -4033 105 -7186 79 -1506 81 -8082 53 -6530 83 -6380 109 -192 135 -6058 51 -3274 79 -6105 57 -18103 53 -1142 55 -4687 57 -12931 99 -344 53 -9300 79 -7717 75 -3774 81 -3691 105 -2780 51 -2764 75 -1030 79 -29043 79 -3611 53 -1934 79 -4819 75 -6538 53 -7104 53 -3542 55 -1969 53 -2426 105 -7239 81 -516 79 -14563 123 -2246 53 -3012 71 -900 55 -1196 51 -7049 51 -1790 53 -10358 53 -3988 81 -1214 107 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/hormann_hsm_raw.sub ================================================ Filetype: Flipper SubGhz RAW File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: RAW RAW_Data: 1718, -32700, 32700, -32700, 11939, -494, 1047, -496, 1015, -516, 1041, -476, 1037, -510, 1035, -512, 1035, -484, 1047, -492, 1031, -504, 513, -1042, 499, -1020, 1041, -512, 511, -1004, 1035, -512, 507, -1042, 481, -1050, 1017, -522, 489, -1040, 1013, -514, 513, -1010, 543, -1008, 513, -1012, 1045, -522, 1003, -512, 1029, -518, 1009, -514, 1039, -476, 541, -1004, 509, -1038, 1035, -482, 539, -1008, 1033, -490, 539, -1018, 1009, -508, 1059, -482, 1041, -512, 1005, -508, 541, -1006, 513, -1008, 535, -1000, 1035, -522, 525, -1016, 515, -1006, 1021, -514, 1045, -478, 12441, -482, 1045, -512, 1005, -512, 1035, -514, 1037, -482, 1035, -520, 1031, -504, 1035, -486, 1041, -510, 501, -1018, 513, -1042, 1007, -512, 509, -1042, 1007, -506, 541, -1010, 507, -1016, 1031, -520, 513, -1010, 1021, -516, 515, -1046, 477, -1042, 513, -1012, 1051, -484, 1043, -512, 1027, -484, 1043, -514, 1007, -512, 509, -1040, 507, -1036, 1011, -526, 493, -1032, 1033, -486, 509, -1056, 1011, -514, 1007, -512, 1037, -514, 1001, -516, 507, -1034, 517, -1036, 493, -1018, 1041, -502, 525, -1016, 513, -1040, 1005, -512, 1033, -506, 12423, -478, 1039, -514, 1009, -516, 1033, -522, 1001, -522, 1039, -510, 1027, -484, 1041, -512, 1007, -510, 509, -1038, 507, -1034, 1037, -482, 507, -1042, 1037, -520, 487, -1014, 527, -1022, 1007, -512, 509, -1038, 1037, -512, 509, -1008, 507, -1044, 507, -1018, 1027, -514, 1005, -528, 1017, -514, 1041, -512, 1003, -512, 509, -1042, 507, -1010, 1035, -520, 507, -1018, 1033, -508, 511, -1038, 991, -516, 1041, -512, 1005, -512, 1035, -514, 507, -1040, 507, -1014, 519, -1014, 1041, -510, 499, -1018, 515, -1046, 1005, -514, 1011, -520, 12425, -480, 1035, -516, 1035, -492, 1031, -522, 1009, -508, 1021, -518, 1041, -512, 1007, -512, 1037, -512, 509, -1008, 519, -1016, 1029, -522, 513, -1008, 1025, -516, 515, -1044, 479, -1038, 1037, -482, 541, -1008, 1035, -520, 507, -1010, 503, -1026, 515, -1042, 1005, -512, 1037, -512, 1005, -520, 1015, -520, 1039, -510, 499, -1018, 515, -1042, 1007, -512, 507, -1040, 1011, -520, 507, -1016, 1031, -520, 1009, -540, 989, -518, 1043, -512, 511, -1006, 507, -1038, 505, -1036, 1001, -516, 509, -1050, 491, -1052, 1009, -500, 1021, -516, 12409, -524, 1015, -516, 1009, -510, 1037, -512, 1033, -506, 1039, -480, 1035, -524, 1019, -522, 1015, -500, 525, -1014, 515, -1040, 1005, -512, 509, -1042, 1011, -524, 493, -1018, 517, -1036, 1017, -514, 515, -1008, 1035, -514, 507, -1040, 505, -1034, 507, -1010, 1035, -492, 1031, -520, 1009, -540, 991, -516, 1043, -514, 511, -1010, 513, -1044, 1015, -492, 531, -1020, 1009, -528, 521, -1012, 1009, -510, 1037, -512, 1037, -482, 1033, -518, 505, -1032, 507, -1016, 537, -1000, 1025, -520, 513, -1034, 519, -1010, 1007, -512, 1039, -514, 12395, -510, 1037, -512, 1037, -482, 1045, -490, 1057, -488, 1045, -496, 1017, -516, 1041, -514, 1005, -512, 507, -1046, 481, -1044, 1035, -494, 505, -1048, 1011, -502, 527, -1018, 513, -1042, 1005, -516, 513, -1010, 1035, -520, 505, -1032, 507, -1022, 503, -1034, 1013, -504, 1023, -516, 1041, -512, 1005, -512, 1037, -514, 507, -1010, 519, -1050 RAW_Data: 989, -520, 517, -1034, 1015, -516, 513, -1008, 1039, -512, 1035, -484, 1049, -520, 1001, -514, 503, -1018, 515, -1044, 513, -1008, 1041, -482, 541, -1012, 523, -1016, 1011, -540, 991, -516, 12415, -524, 1015, -516, 1039, -508, 1003, -512, 1033, -506, 1037, -514, 1001, -506, 1033, -520, 1033, -520, 475, -1046, 499, -1022, 1041, -512, 511, -1008, 1039, -516, 515, -1014, 489, -1050, 1011, -504, 529, -1020, 1009, -512, 511, -1040, 515, -1010, 519, -1018, 1031, -520, 1009, -538, 995, -516, 1041, -512, 1007, -514, 513, -1042, 509, -1008, 1039, -520, 477, -1042, 1029, -520, 481, -1042, 1007, -512, 1037, -512, 1035, -486, 1045, -522, 475, -1044, 501, -1024, 513, -1042, 1005, -512, 509, -1040, 509, -1008, 1035, -520, 999, -522, 12417, -520, 1007, -524, 1013, -516, 1039, -512, 1007, -516, 1007, -538, 1001, -506, 1033, -518, 1033, -506, 503, -1040, 489, -1052, 1015, -500, 525, -1016, 1007, -512, 541, -1010, 513, -1012, 1049, -520, 477, -1044, 1025, -518, 483, -1044, 513, -1008, 511, -1038, 1033, -508, 1001, -518, 1037, -490, 1031, -522, 1007, -542, 495, -1020, 515, -1012, 1039, -514, 515, -1012, 1015, -520, 513, -1042, 1025, -484, 1043, -512, 1007, -510, 1037, -514, 507, -1012, 519, -1020, 531, -1016, 1007, -530, 521, -1014, 513, -1010, 1045, -482, 1049, -492, 12413, -504, 1033, -504, 1031, -522, 1009, -542, 993, -516, 1041, -512, 1005, -514, 1035, -508, 1037, -482, 541, -1008, 509, -1046, 999, -522, 513, -1008, 1055, -482, 515, -1042, 511, -1008, 1037, -514, 507, -1010, 1035, -520, 507, -1018, 503, -1034, 503, -1050, 1013, -502, 1019, -516, 1043, -510, 1007, -512, 1035, -514, 507, -1008, 505, -1032, 1033, -506, 505, -1046, 1033, -486, 513, -1040, 1025, -518, 1011, -514, 1009, -512, 1037, -512, 509, -1010, 517, -1020, 531, -1018, 1007, -528, 521, -1012, 513, -1040, 1007, -512, 1037, -482, 12425, -512, 1035, -514, 1001, -518, 1031, -506, 1035, -490, 1033, -504, 1033, -502, 1037, -514, 1027, -520, 485, -1044, 511, -1006, 1037, -514, 507, -1042, 1005, -524, 493, -1050, 483, -1034, 1019, -516, 513, -1012, 1037, -514, 505, -1040, 481, -1036, 517, -1036, 1019, -508, 1007, -542, 993, -516, 1043, -512, 1007, -512, 507, -1036, 509, -1044, 1009, -506, 505, -1038, 1017, -520, 513, -1008, 1021, -514, 1041, -514, 1007, -512, 1037, -512, 509, -1012, 521, -1016, 521, -1010, 1033, -520, 519, -1012, 513, -1008, 1033, -508, 1037, -512, 12407, -512, 1005, -512, 1037, -512, 1033, -506, 1033, -506, 1037, -482, 1035, -522, 999, -520, 1041, -512, 497, -1020, 515, -1046, 1005, -516, 513, -1012, 1049, -486, 513, -1044, 497, -1020, 1045, -512, 479, -1038, 1039, -484, 515, -1034, 507, -1048, 507, -1014, 1007, -542, 1025, -484, 1047, -512, 1009, -512, 1035, -514, 509, -1008, 507, -1052, 1019, -522, 483, -1034, 1017, -516, 513, -1012, 1039, -512, 1035, -482, 1033, -506, 1035, -524, 493, -1030, 513, -1010, 527, -1016, 1043, -512, 511, -1010, 515, -1008, 1035, -522, 1019, -506, 12409, -506, 1033, -522, 1033, -486, 1041, -512, 1029, -484, 1043, -514, 1005, -512, 1037, -512, 1035, -484, 519, -1016, 531, -1018, 1009, -528, 521, -1012, 1041, -510, 509, -1006 RAW_Data: 509, -1044, 1009, -524, 491, -1032, 1017, -516, 505, -1058, 483, -1042, 511, -1008, 1039, -514, 1001, -516, 1033, -508, 1015, -522, 1041, -512, 497, -1020, 515, -1042, 1007, -514, 507, -1046, 1009, -492, 537, -1016, 1009, -542, 995, -516, 1045, -512, 1007, -514, 513, -1012, 517, -1020, 529, -1020, 1009, -528, 519, -1012, 513, -1010, 1043, -516, 1009, -524, 12405, -490, 1057, -512, 1009, -504, 1023, -516, 1043, -512, 1005, -512, 1037, -514, 1001, -520, 1017, -520, 513, -1010, 527, -1018, 1043, -512, 511, -1006, 1033, -508, 507, -1040, 509, -1008, 1033, -504, 507, -1034, 1015, -522, 513, -1008, 525, -1016, 513, -1046, 1007, -514, 1009, -518, 1035, -490, 1031, -520, 1041, -510, 497, -1020, 515, -1044, 1005, -516, 515, -1012, 1013, -522, 513, -1038, 1029, -516, 1011, -512, 1009, -514, 1041, -482, 541, -1012, 523, -1016, 513, -1008, 1021, -516, 517, -1042, 511, -1008, 1043, -482, 1033, -520, 12405, -512, 1037, -514, 1003, -518, 1033, -492, 1031, -506, 1031, -520, 1009, -540, 993, -518, 1043, -512, 513, -1010, 513, -1040, 1005, -524, 493, -1050, 1013, -500, 525, -1014, 513, -1044, 1007, -512, 509, -1040, 1001, -522, 489, -1050, 513, -1008, 527, -1014, 1041, -512, 1003, -512, 1039, -514, 1003, -520, 1017, -504, 537, -1016, 511, -1042, 989, -518, 513, -1042, 1005, -508, 507, -1036, 1037, -516, 1009, -506, 1031, -506, 1035, -490, 539, -1022, 505, -1034, 509, -1008, 1031, -522, 517, -1014, 511, -1006, 1039, -512, 1033, -506, 12415, -514, 1005, -512, 1035, -514, 1035, -482, 1035, -524, 1019, -524, 1015, -498, 1019, -516, 1041, -510, 511, -1006, 507, -1038, 1039, -486, 517, -1036, 1017, -522, 513, -1008, 525, -1016, 1009, -512, 541, -1004, 1033, -508, 507, -1040, 481, -1048, 489, -1050, 1007, -540, 989, -516, 1045, -514, 1005, -512, 1037, -512, 509, -1008, 505, -1034, 1047, -520, 479, -1044, 1027, -516, 483, -1044, 1007, -512, 1037, -514, 1003, -518, 1015, -520, 515, -1044, 497, -1018, 515, -1046, 1005, -514, 515, -1014, 519, -1020, 1029, -520, 1007, -524, 12421, -494, 1017, -516, 1039, -514, 1005, -512, 1035, -514, 1003, -516, 1037, -492, 1031, -522, 1009, -508, 527, -1016, 515, -1040, 1003, -510, 507, -1038, 1037, -482, 539, -1004, 519, -1018, 1029, -520, 513, -1026, 1015, -516, 513, -1010, 511, -1044, 515, -1010, 1035, -492, 1029, -520, 1009, -528, 1015, -514, 1041, -510, 509, -1006, 509, -1044, 1009, -520, 507, -1018, 1031, -522, 515, -1004, 1019, -516, 1045, -512, 1009, -514, 1009, -518, 507, -1044, 509, -1016, 513, -1042, 991, -518, 515, -1044, 511, -1006, 1033, -508, 1035, -482, 12435, -506, 1035, -482, 1031, -508, 1047, -492, 1033, -520, 1007, -540, 989, -516, 1045, -512, 1007, -512, 507, -1036, 509, -1040, 1001, -518, 505, -1038, 1015, -504, 511, -1044, 499, -1018, 1043, -512, 513, -1006, 1039, -512, 507, -1040, 481, -1034, 519, -1020, 1029, -518, 1007, -526, 1015, -514, 1009, -510, 1037, -512, 507, -1040, 505, -1034, 1003, -520, 523, -1018, 1013, -504, 527, -1018, 1041, -512, 1003, -514, 1035, -514, 1001, -518, 505, -1034, 521, -1020, 501, -1048, 1005, -526, 517, -1012, 513, -1010, 1039, -512, 1005, -516, 12427, -512 RAW_Data: 1033, -506, 1003, -520, 1015, -522, 1039, -512, 1023, -516, 1011, -514, 1007, -510, 1039, -514, 507, -1010, 507, -1044, 1035, -520, 487, -1048, 991, -516, 515, -1046, 511, -1008, 1011, -516, 505, -1032, 1035, -492, 537, -1016, 511, -1040, 497, -1020, 1043, -510, 1007, -512, 1037, -514, 1003, -516, 1033, -504, 505, -1034, 507, -1016, 1033, -520, 521, -1010, 1017, -516, 515, -1040, 1001, -508, 1037, -512, 1035, -482, 1035, -520, 491, -1032, 505, -1048, 513, -1010, 1019, -516, 515, -1042, 509, -1008, 1043, -484, 1049, -522, 12373, -520, 1045, -498, 1021, -514, 1007, -512, 1039, -514, 1035, -482, 1033, -522, 1017, -520, 1017, -504, 525, -1018, 515, -1010, 1039, -514, 507, -1040, 1003, -518, 507, -1016, 505, -1030, 1031, -520, 515, -1006, 1025, -516, 515, -1042, 509, -1008, 507, -1044, 1007, -520, 1031, -506, 1033, -494, 1031, -522, 1011, -504, 527, -1018, 513, -1010, 1041, -514, 507, -1008, 1033, -506, 505, -1032, 1035, -492, 1035, -520, 1009, -542, 991, -518, 515, -1042, 511, -1008, 513, -1046, 1011, -492, 505, -1050, 513, -1006, 1021, -514, 1041, -512, 12415, -484, 1045, -514, 1005, -512, 1033, -508, 1035, -514, 1001, -540, 1009, -522, 999, -520, 1039, -512, 499, -1018, 515, -1044, 1005, -512, 509, -1040, 1003, -520, 523, -1016, 517, -1012, 1019, -514, 517, -1042, 1005, -514, 505, -1042, 513, -1004, 517, -1020, 1025, -514, 1043, -496, 1019, -516, 1011, -512, 1037, -508, 509, -1040, 509, -1008, 1035, -520, 507, -1018, 1031, -522, 481, -1038, 1019, -516, 1011, -512, 1041, -512, 1037, -484, 515, -1034, 507, -1020, 519, -1018, 1035, -520, 485, -1044, 511, -1012, 1043, -484, 1047, -492, 12433, -492, 1033, -520, 1009, -506, 1023, -516, 1041, -514, 1005, -512, 1037, -512, 1003, -516, 1035, -520, 507, -1018, 505, -1050, 1011, -500, 525, -1014, 1041, -512, 509, -1010, 513, -1042, 1001, -522, 489, -1050, 1015, -502, 529, -1016, 513, -1040, 509, -1004, 1037, -514, 999, -538, 1001, -506, 1035, -520, 1017, -522, 513, -1008, 527, -1018, 1011, -514, 511, -1036, 1037, -482, 517, -1046, 1001, -536, 1001, -520, 1043, -510, 1025, -482, 517, -1044, 511, -1010, 513, -1042, 1001, -506, 505, -1036, 519, -1020, 1027, -514, 1009, -528, 12397, -526, 1015, -514, 1043, -510, 1003, -512, 1037, -512, 1001, -520, 1047, -520, 1005, -512, 1031, -516, 483, -1044, 513, -1006, 1035, -514, 507, -1040, 1001, -508, 521, -1016, 505, -1050, 1009, -504, 529, -1016, 1045, -478, 511, -1038, 509, -1042, 505, -1034, 1001, -520, 1033, -494, 1029, -520, 1009, -528, 1015, -514, 513, -1038, 511, -1004, 1041, -482, 541, -1010, 1033, -492, 505, -1052, 1009, -504, 1023, -518, 1041, -512, 1011, -514, 513, -1040, 509, -1010, 507, -1016, 1031, -520, 521, -1010, 523, -1016, 1009, -514, 1041, -512, 12391, -540, 1003, -512, 1037, -512, 1001, -518, 1045, -508, 1019, -522, 1007, -504, 1021, -518, 1045, -510, 511, -1008, 513, -1046, 1009, -490, 539, -1016, 1009, -542, 495, -1018, 515, -1014, 1039, -516, 517, -1008, 1037, -520, 485, -1050, 495, -1020, 515, -1044, 1007, -514, 1035, -484, 1035, -520, 999, -520, 1039, -512, 499, -1018, 515, -1044, 1005, -512, 507, -1038, 1009, -516 RAW_Data: 507, -1044, 1035, -484, 1041, -510, 1027, -518, 1011, -514, 511, -1010, 511, -1042, 515, -1008, 1035, -492, 533, -1018, 513, -1032, 1013, -514, 1011, -512, 12423, -512, 1005, -512, 1037, -512, 1037, -480, 1035, -522, 1015, -502, 1037, -512, 1033, -520, 1011, -514, 513, -1006, 509, -1038, 1035, -516, 507, -1010, 1035, -490, 539, -1014, 513, -1010, 1021, -518, 513, -1040, 1005, -508, 509, -1040, 513, -1014, 515, -1034, 1035, -520, 1007, -514, 1025, -518, 1011, -514, 1007, -512, 509, -1038, 509, -1040, 1003, -524, 491, -1050, 1009, -504, 527, -1018, 1009, -510, 1039, -512, 1037, -484, 1045, -490, 539, -1022, 505, -1016, 503, -1054, 1011, -514, 513, -1008, 509, -1040, 1005, -538, 1005, -516, 12403, -508, 1037, -512, 1033, -506, 1035, -484, 1045, -504, 1035, -520, 1001, -514, 1029, -522, 1011, -514, 511, -1010, 513, -1044, 1009, -522, 491, -1050, 1009, -504, 527, -1018, 515, -1040, 1005, -514, 507, -1042, 1001, -506, 517, -1046, 507, -1022, 503, -1020, 1043, -498, 1021, -516, 1041, -512, 1007, -514, 1009, -516, 505, -1034, 505, -1034, 1035, -492, 537, -1016, 1009, -538, 495, -1020, 1043, -512, 1003, -512, 1033, -508, 1035, -484, 517, -1046, 507, -1016, 513, -1040, 1025, -482, 517, -1042, 509, -1008, 1039, -514, 1003, -520, 12435, -484, 1047, -522, 1001, -514, 1033, -486, 1045, -514, 1005, -508, 1037, -514, 1009, -518, 1037, -490, 539, -1018, 513, -1008, 1021, -516, 513, -1040, 1007, -514, 515, -1040, 509, -1010, 1035, -494, 503, -1034, 1029, -520, 513, -1028, 487, -1048, 513, -1010, 1043, -484, 1047, -520, 1005, -514, 1031, -518, 1011, -514, 511, -1006, 509, -1038, 1035, -482, 541, -1008, 1035, -520, 507, -1012, 1031, -522, 1011, -514, 1005, -512, 1035, -508, 513, -1040, 505, -1040, 483, -1046, 1001, -520, 513, -1042, 497, -1016, 1043, -512, 1001, -508, 12423, -514, 1039, -510, 1005, -512, 1037, -512, 1001, -508, 1041, -506, 1031, -506, 1035, -492, 1025, -520, 515, -1032, 519, -1010, 1007, -512, 509, -1038, 1037, -514, 505, -1034, 509, -1010, 1033, -520, 475, -1042, 1029, -520, 485, -1042, 513, -1010, 513, -1044, 1011, -522, 999, -536, 999, -522, 1043, -510, 1025, -518, 483, -1042, 509, -1008, 1041, -514, 509, -1012, 1013, -520, 513, -1044, 991, -516, 1043, -514, 1007, -514, 1043, -484, 517, -1048, 507, -1014, 513, -1040, 991, -518, 515, -1040, 511, -1010, 1043, -482, 1047, -522, 12403, -522, 1013, -498, 1019, -516, 1041, -512, 1005, -514, 1033, -508, 1035, -484, 1045, -492, 1031, -520, 515, -1006, 527, -1018, 1013, -512, 511, -1038, 1035, -482, 541, -1008, 507, -1032, 1037, -494, 505, -1032, 1031, -508, 511, -1042, 497, -1020, 515, -1042, 1007, -512, 1035, -482, 1033, -520, 1035, -520, 1001, -514, 501, -1054, 481, -1044, 1005, -508, 511, -1038, 1035, -484, 517, -1046, 1001, -520, 1041, -510, 1025, -518, 1009, -512, 511, -1010, 513, -1044, 481, -1048, 1015, -504, 511, -1044, 499, -1018, 1043, -512, 1005, -512, 12409, -516, 1041, -510, 1005, -512, 1035, -512, 1037, -482, 1033, -520, 1035, -520, 1003, -512, 1029, -520, 483, -1044, 513, -1006, 1035, -508, 513, -1040, 1003, -518, 507, -1016, 505, -1048, 1007, -540, 497, -1016 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/ido_117_111_raw.sub ================================================ Filetype: Flipper SubGhz RAW File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: RAW RAW_Data: 32700 -4524 475 -1412 481 -538 465 -1440 481 -500 491 -1408 481 -526 449 -508 475 -552 475 -1450 465 -516 481 -1432 479 -1446 473 -514 473 -1408 481 -502 487 -1438 481 -1430 499 -1444 449 -1448 481 -1408 509 -484 483 -514 449 -1448 481 -1440 477 -1448 473 -518 479 -1446 473 -518 477 -1410 481 -1430 475 -1402 469 -1476 481 -1450 463 -516 481 -516 481 -490 499 -1412 487 -1428 481 -1406 469 -1472 473 -1436 479 -522 473 -520 481 -1426 473 -1442 461 -510 477 -1418 479 -1394 4437 -4508 509 -1410 511 -508 469 -1442 481 -498 491 -1406 483 -492 483 -506 475 -552 475 -1444 467 -516 481 -1438 479 -1414 505 -484 507 -1406 483 -498 487 -1438 483 -1426 503 -1402 509 -1406 507 -1410 487 -504 489 -480 479 -1412 495 -1468 471 -518 481 -1414 511 -510 465 -516 479 -516 481 -1394 493 -480 507 -540 477 -514 473 -1446 467 -516 481 -512 473 -504 473 -522 483 -498 487 -510 481 -1462 487 -498 489 -1406 485 -1450 477 -1406 501 -1410 459 -1438 483 -1382 4443 -4528 481 -1416 497 -514 481 -1440 477 -488 513 -1402 481 -490 481 -510 471 -538 475 -1442 505 -484 515 -1406 481 -1420 479 -506 495 -1406 483 -490 481 -1464 483 -1428 487 -1446 461 -1438 479 -1416 495 -514 477 -482 505 -1414 479 -1438 481 -1452 475 -1434 473 -506 479 -1428 473 -1434 475 -488 497 -514 475 -1444 469 -1442 483 -1450 479 -1406 509 -1406 481 -504 493 -478 509 -482 471 -1482 483 -1404 517 -492 491 -512 479 -1438 477 -484 481 -510 473 -1428 465 -1404 4437 -4530 467 -1442 487 -504 493 -1438 483 -496 489 -1406 481 -490 515 -478 481 -526 485 -1426 517 -510 477 -1404 509 -1408 481 -504 491 -1404 481 -492 481 -1464 481 -1430 501 -1410 485 -1430 483 -1434 479 -488 513 -476 473 -1440 463 -1474 471 -520 481 -1412 513 -1404 499 -486 509 -1408 483 -1426 471 -1408 487 -542 471 -1434 475 -520 471 -1450 479 -514 479 -504 471 -506 483 -1396 487 -544 469 -514 515 -1404 483 -1450 471 -1414 483 -504 481 -1430 475 -1404 501 -1378 4469 -4486 483 -1454 471 -514 481 -1418 511 -510 465 -1438 485 -494 483 -480 479 -524 483 -1448 481 -514 481 -1442 467 -1438 481 -500 489 -1408 479 -492 481 -1470 483 -1422 471 -1440 471 -1452 479 -1408 509 -484 481 -514 483 -1414 479 -1442 481 -522 489 -510 479 -512 475 -520 471 -522 483 -496 485 -1404 479 -1448 471 -514 511 -1410 481 -538 465 -1436 483 -496 487 -478 509 -1406 467 -1474 477 -1438 461 -1448 481 -1418 491 -512 479 -1408 505 -484 481 -1406 505 -1374 4449 -4530 463 -1442 483 -500 495 -1440 483 -496 489 -1406 481 -492 515 -480 481 -522 507 -1414 483 -512 RAW_Data: 479 -1444 469 -1440 483 -500 489 -1400 481 -492 481 -1462 481 -1430 499 -1412 483 -1450 479 -1404 507 -484 481 -512 473 -1414 491 -1436 481 -1432 497 -520 479 -520 485 -1406 479 -1418 481 -504 491 -478 509 -514 475 -516 505 -492 521 -488 505 -484 481 -514 477 -1430 463 -482 509 -540 475 -514 475 -522 489 -1418 477 -524 459 -522 481 -1412 481 -1426 479 -1404 4437 -4516 477 -1444 471 -514 479 -1412 511 -510 463 -1440 483 -494 485 -480 481 -524 483 -1458 487 -510 475 -1428 479 -1412 503 -486 509 -1408 483 -496 485 -1438 481 -1428 501 -1416 483 -1432 477 -1434 479 -488 515 -480 479 -1414 489 -1434 505 -518 481 -520 485 -1400 483 -526 485 -1398 483 -1416 481 -506 489 -1436 483 -1456 473 -522 483 -1422 473 -1442 459 -520 479 -1416 483 -498 487 -1436 481 -536 463 -514 483 -1438 477 -522 483 -478 477 -506 487 -1428 483 -1398 4431 -4516 467 -1438 489 -506 493 -1434 483 -498 489 -1404 485 -492 513 -474 475 -550 473 -1444 469 -516 481 -1436 479 -1414 503 -486 509 -1406 481 -500 485 -1434 481 -1430 503 -1428 487 -1402 515 -1418 479 -510 463 -514 479 -1406 469 -1476 477 -1432 473 -1426 479 -508 509 -482 507 -494 475 -514 465 -1410 483 -558 465 -514 483 -1436 481 -1416 511 -510 465 -514 479 -1404 503 -1408 485 -532 467 -514 483 -512 511 -484 487 -1426 491 -1400 483 -1418 483 -1430 477 -1402 4433 -4526 483 -1422 471 -514 507 -1412 481 -502 493 -1408 483 -492 517 -480 481 -526 485 -1452 479 -512 473 -1418 495 -1410 483 -526 485 -1400 481 -490 479 -1464 481 -1428 487 -1442 471 -1428 491 -1404 517 -496 483 -478 475 -1440 463 -1444 511 -510 467 -1442 483 -500 493 -1410 483 -526 485 -1400 481 -1416 483 -1462 459 -520 485 -524 489 -512 479 -1408 509 -484 481 -1406 509 -1410 483 -1422 503 -1430 479 -1440 479 -1412 513 -1402 471 -1438 471 -506 471 -1416 485 -1398 4441 -4518 477 -1430 507 -484 515 -1404 483 -526 485 -1400 481 -490 515 -476 473 -538 473 -1440 509 -516 481 -1400 485 -1450 477 -476 497 -1406 483 -492 515 -1432 483 -1424 503 -1432 479 -1402 511 -1408 481 -502 493 -480 509 -1396 505 -1436 473 -1446 481 -1418 495 -1438 481 -496 489 -1400 485 -1416 481 -506 491 -510 517 -1404 483 -1452 471 -520 481 -488 513 -1400 483 -490 515 -476 471 -540 473 -1462 477 -520 485 -510 477 -1404 509 -1408 481 -1426 487 -1408 487 -1372 4471 -4482 507 -1412 481 -538 465 -1442 483 -498 489 -1406 481 -492 517 -478 481 -526 487 -1428 481 -512 505 -1432 475 -1410 481 -504 493 -1406 483 -492 479 -1470 483 -1426 471 -1434 509 -32700 99 -266 99 -732 RAW_Data: 329 -134 233 -232 32700 -4516 489 -1438 483 -498 493 -1438 481 -498 489 -1402 483 -526 483 -478 481 -524 503 -1428 469 -518 481 -1438 481 -1414 511 -476 495 -1404 481 -494 481 -1462 481 -1430 485 -1446 459 -1432 509 -1406 505 -482 481 -514 473 -1414 487 -1436 479 -540 467 -1442 485 -504 491 -514 479 -1406 505 -1408 481 -1392 479 -1466 487 -1450 445 -1446 505 -484 479 -514 479 -520 459 -520 479 -490 479 -1466 481 -534 463 -516 481 -1440 479 -1414 481 -502 491 -1408 481 -492 481 -1406 4433 -4526 491 -1440 483 -498 491 -1440 483 -496 489 -1404 483 -492 517 -478 481 -522 503 -1434 467 -516 481 -1438 479 -1414 503 -486 509 -1404 483 -500 485 -1436 481 -1428 503 -1420 479 -1446 467 -1438 481 -498 489 -478 477 -1428 505 -1438 471 -1450 481 -1416 481 -1440 479 -522 483 -478 505 -1396 507 -482 481 -544 477 -514 473 -1444 469 -1438 483 -1426 471 -522 479 -486 481 -1402 511 -518 491 -514 479 -512 507 -1406 505 -484 479 -1438 479 -1414 481 -502 489 -1402 4437 -4490 495 -1442 481 -500 495 -1440 483 -498 487 -1406 483 -492 517 -478 477 -538 473 -1444 503 -480 513 -1404 481 -1448 471 -486 511 -1406 481 -500 489 -1436 481 -1424 503 -1434 477 -1438 479 -1406 481 -506 491 -480 511 -1406 469 -1474 469 -520 483 -1444 471 -1414 481 -1428 479 -1430 481 -490 513 -472 475 -1476 477 -520 487 -510 477 -1408 511 -484 483 -510 475 -516 471 -1426 475 -1434 515 -1422 471 -1442 487 -1420 477 -522 461 -520 483 -488 481 -512 473 -1414 4445 -4484 515 -1402 517 -492 491 -1434 483 -496 487 -1404 483 -492 515 -478 473 -554 483 -1414 513 -478 509 -1404 511 -1406 481 -504 489 -1400 485 -492 513 -1434 481 -1430 501 -1412 483 -1430 481 -1438 479 -488 513 -480 479 -1412 489 -1438 481 -540 467 -516 481 -514 479 -518 471 -1428 477 -1432 479 -1408 481 -534 503 -1408 481 -1430 501 -484 511 -1410 481 -504 489 -1406 481 -492 481 -544 479 -512 509 -1406 509 -1406 483 -502 495 -514 475 -474 503 -472 503 -1398 4449 -4516 479 -1442 477 -520 487 -1400 485 -526 485 -1404 481 -490 515 -476 471 -538 507 -1412 507 -480 517 -1402 483 -1418 513 -474 493 -1404 485 -492 513 -1434 481 -1428 487 -1446 469 -1432 481 -1438 477 -484 479 -506 475 -1410 495 -1436 513 -1436 459 -520 483 -1416 511 -510 463 -516 479 -482 485 -1428 477 -1438 483 -1450 471 -520 483 -524 485 -476 509 -482 503 -1394 495 -478 509 -1438 481 -1448 471 -522 481 -522 483 -1402 483 -1414 503 -1414 489 -490 481 -1382 4451 -4498 497 -1440 481 -534 463 -1438 481 -498 489 -1402 481 -526 485 -478 481 -524 RAW_Data: 485 -1448 481 -514 475 -1446 465 -1438 481 -500 487 -1402 481 -490 481 -1470 481 -1426 471 -1442 485 -1430 481 -1442 475 -486 483 -512 475 -1412 489 -1434 505 -514 479 -522 485 -1402 481 -1454 475 -1404 501 -484 471 -518 477 -540 477 -508 475 -516 507 -1412 483 -1438 479 -488 483 -1438 477 -1408 481 -534 469 -1442 481 -536 463 -1442 483 -1420 473 -512 477 -1416 481 -500 487 -1404 4433 -4518 467 -1438 481 -502 495 -1438 483 -496 491 -1402 483 -492 515 -480 479 -524 483 -1448 481 -514 479 -1446 465 -1440 483 -496 487 -1404 483 -490 481 -1472 481 -1424 471 -1440 487 -1420 479 -1446 465 -514 479 -484 483 -1430 479 -1440 483 -1446 471 -1448 481 -522 477 -508 465 -1406 519 -1388 483 -502 489 -1434 503 -1414 481 -1456 485 -1402 483 -526 487 -476 509 -1406 469 -1406 517 -1420 503 -1418 477 -520 485 -506 481 -1434 501 -484 505 -482 479 -482 483 -1428 4437 -4484 511 -1438 477 -518 485 -1404 483 -524 485 -1406 481 -490 511 -474 475 -552 471 -1432 509 -484 483 -1436 483 -1416 503 -488 507 -1408 483 -496 483 -1434 481 -1428 503 -1434 477 -1410 509 -1404 481 -504 493 -478 505 -1400 505 -1444 475 -512 505 -1410 481 -1426 501 -482 483 -526 485 -478 479 -1414 493 -546 483 -1436 483 -496 491 -514 479 -1402 511 -1408 481 -502 489 -480 479 -552 473 -522 471 -1430 483 -510 509 -480 507 -488 489 -506 487 -478 479 -1416 4439 -4514 485 -1436 485 -496 491 -1406 517 -494 487 -1402 483 -490 515 -478 473 -554 483 -1414 481 -510 509 -1408 509 -1408 483 -500 489 -1400 483 -492 479 -1462 483 -1428 499 -1412 481 -1428 513 -1398 483 -524 485 -476 473 -1428 501 -1442 475 -1434 471 -1428 515 -1402 481 -1416 513 -474 495 -1410 481 -1418 481 -1464 457 -522 487 -1454 477 -510 465 -516 481 -1406 509 -484 481 -478 505 -1448 503 -482 517 -510 479 -482 517 -486 483 -504 489 -1400 483 -494 513 -1402 4431 -4482 497 -1440 483 -502 495 -1438 483 -496 489 -1404 483 -492 515 -478 479 -526 483 -1430 517 -476 507 -1432 479 -1410 481 -506 493 -1402 483 -490 481 -1466 483 -1428 501 -1412 485 -1426 493 -1402 517 -494 485 -476 509 -1406 465 -1472 479 -1438 459 -522 483 -524 485 -478 507 -1396 509 -1408 483 -500 485 -512 481 -1436 485 -1446 471 -1418 481 -1450 479 -1408 505 -484 479 -1402 507 -516 491 -1436 483 -1424 471 -516 507 -484 481 -1438 477 -1408 481 -502 487 -1402 4441 -4480 499 -1438 481 -502 497 -1438 483 -498 491 -1404 483 -492 483 -510 471 -538 479 -1444 503 -482 513 -1398 483 -1418 511 -478 495 -1408 483 -492 483 -1470 483 -1424 471 -1442 485 -1418 RAW_Data: 479 -1444 469 -516 479 -480 485 -1416 479 -1478 477 -520 487 -512 475 -1430 479 -488 515 -474 509 -482 471 -522 489 -1422 501 -1412 483 -522 481 -1430 501 -484 509 -1406 483 -500 489 -1402 481 -1450 471 -550 477 -516 485 -1402 485 -1420 513 -476 493 -480 511 -482 471 -1420 4437 -4492 481 -1460 489 -510 479 -1436 477 -486 513 -1404 479 -488 481 -512 473 -520 505 -1414 497 -514 481 -1438 481 -1414 481 -504 491 -1402 485 -490 515 -1438 483 -1428 471 -1442 487 -1420 479 -1416 495 -514 479 -478 507 -1418 483 -1434 481 -1424 503 -512 481 -1426 469 -1436 475 -488 501 -1430 477 -1406 505 -514 489 -512 481 -32700 99 -632 167 -604 99 -298 233 -132 733 -166 461 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/intertechno_v3.sub ================================================ Filetype: Flipper SubGhz Key File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: Intertechno_V3 Bit: 32 Key: 00 00 00 00 3F 86 C5 9F ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/intertechno_v3_raw.sub ================================================ Filetype: Flipper SubGhz RAW File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: RAW RAW_Data: 15041 -66 15883 -66 12643 -66 12681 -66 3413 -68 2713 -68 33389 -66 1445 -66 1279 -68 1027 -66 6911 -98 25229 -66 3967 -100 3019 -100 6131 -66 955 -66 3605 -66 12411 -98 1419 -66 3593 -68 2753 -66 2457 -66 6007 -66 627 -100 1597 -66 3071 -98 22749 -66 333 -66 12829 -66 4313 -132 855 -66 44097 -64 20391 -98 29999 -66 3539 -98 557 -66 1489 -100 4081 -100 3857 -64 2895 -132 2261 -166 3089 -66 2429 -68 34467 -66 3585 -66 3087 -66 3329 -132 5287 -66 1063 -98 15259 -100 2535 -66 995 -66 13057 -100 24233 -68 531 -100 26415 -66 1761 -100 2717 -66 4071 -100 12191 -66 23367 -68 2323 -66 19809 -248 245 -1388 255 -242 275 -1358 273 -1370 277 -246 277 -1368 275 -246 275 -1362 275 -244 275 -1364 275 -244 275 -1362 275 -244 275 -1328 273 -278 273 -1358 275 -246 275 -238 263 -1384 275 -246 273 -1358 275 -244 273 -1358 275 -246 275 -1360 275 -1344 277 -246 275 -1358 275 -244 275 -234 263 -1382 277 -1344 277 -246 279 -1362 275 -246 271 -234 261 -1380 275 -246 273 -1360 275 -246 275 -1366 277 -1340 277 -248 279 -238 263 -1382 275 -1344 277 -246 279 -1364 277 -244 275 -234 263 -1382 277 -244 273 -1358 275 -1344 277 -248 279 -1368 275 -244 273 -1360 239 -280 271 -1358 275 -244 275 -1358 275 -174 269 -10298 289 -2660 267 -238 299 -1356 275 -244 275 -1356 275 -1344 277 -248 277 -1360 275 -246 275 -1328 309 -244 273 -1358 277 -244 275 -1356 275 -246 273 -1326 309 -244 275 -1356 275 -246 273 -234 263 -1380 277 -246 273 -1326 309 -244 273 -1356 277 -246 277 -1358 275 -1338 279 -248 279 -1364 275 -246 273 -234 261 -1380 277 -1344 279 -250 277 -1330 309 -244 273 -232 261 -1384 275 -246 273 -1356 275 -248 275 -1360 275 -1340 279 -248 277 -236 263 -1380 277 -1342 279 -248 279 -1366 275 -246 273 -234 263 -1380 275 -246 275 -1358 275 -1340 279 -248 281 -1336 309 -244 273 -1358 275 -246 273 -1360 275 -244 273 -1358 275 -176 267 -10306 257 -2646 299 -234 301 -1354 277 -246 275 -1356 277 -1340 279 -250 279 -1332 309 -244 275 -1358 275 -248 273 -1326 309 -246 273 -1326 309 -244 275 -1356 277 -248 275 -1328 309 -246 273 -234 261 -1382 277 -246 277 -1326 309 -244 275 -1358 277 -246 277 -1356 277 -1346 277 -250 277 -1358 277 -246 275 -234 263 -1382 279 -1346 279 -248 281 -1330 307 -246 273 -236 261 -1380 277 -246 277 -1360 277 -246 277 -1360 275 -1344 279 -248 279 -236 263 -1384 277 -1340 279 -250 281 -1338 307 -246 271 -234 261 -1384 277 -246 275 -1356 277 -1340 279 -250 283 -1336 309 -246 273 -1356 277 -246 273 -1360 277 -246 RAW_Data: 275 -1328 309 -174 269 -10296 289 -2648 267 -238 299 -1356 277 -246 275 -1324 307 -1342 279 -250 277 -1330 309 -244 275 -1362 277 -244 275 -1356 275 -248 273 -1328 309 -244 273 -1328 309 -244 275 -1360 277 -246 275 -234 259 -1384 277 -246 275 -1360 275 -246 273 -1358 277 -248 277 -1362 275 -1344 277 -248 277 -1328 307 -246 273 -236 261 -1384 277 -1348 279 -248 279 -1360 277 -246 273 -234 263 -1388 275 -246 275 -1360 277 -248 279 -1368 277 -1344 279 -248 279 -240 265 -1386 275 -1342 279 -286 247 -1372 275 -248 275 -238 265 -1386 277 -248 275 -1360 275 -1344 277 -286 247 -1374 275 -246 275 -1362 277 -246 275 -1360 277 -248 275 -1326 307 -174 269 -10290 287 -2654 269 -236 301 -1352 275 -248 273 -1326 311 -1340 277 -248 277 -1328 309 -244 273 -1358 275 -244 275 -1326 309 -244 273 -1356 277 -244 273 -1356 275 -246 275 -1358 275 -244 275 -234 261 -1382 277 -246 273 -1358 275 -246 273 -1360 277 -246 273 -1324 309 -1340 277 -248 277 -1328 307 -246 271 -234 259 -1382 277 -1346 279 -248 277 -1330 309 -244 271 -232 259 -1382 277 -244 275 -1356 277 -248 273 -1354 277 -1342 277 -248 275 -236 261 -1380 277 -1344 277 -248 279 -1330 307 -246 273 -234 261 -1378 277 -246 273 -1356 277 -1342 277 -248 277 -1330 309 -244 273 -1322 307 -246 273 -1326 309 -244 273 -1322 309 -176 267 -10298 257 -2682 265 -236 299 -1324 309 -248 273 -1324 311 -1342 277 -246 279 -1360 277 -244 275 -1362 275 -244 275 -1358 275 -244 275 -1360 275 -246 273 -1360 275 -244 277 -1360 275 -246 273 -234 263 -1384 275 -246 273 -1358 275 -246 275 -1360 277 -246 277 -1356 277 -1342 279 -248 277 -1364 275 -244 275 -234 261 -1384 275 -1344 277 -250 279 -1366 275 -246 273 -236 263 -1384 277 -246 275 -1358 277 -246 277 -1362 277 -1342 279 -248 279 -236 265 -1382 277 -1346 277 -248 281 -1366 275 -246 275 -234 265 -1384 275 -246 273 -1358 277 -1344 279 -248 279 -1364 275 -244 275 -1324 309 -246 273 -1324 307 -246 273 -1326 309 -174 267 -118796 133 -100 131 -892 329 -166 199 -132 131 -166 99 -100 265 -264 4663 -134 4889 -100 365 -98 5921 -100 5903 -68 4877 -98 2953 -98 1645 -64 1687 -66 981 -98 10769 -66 18319 -66 4831 -66 13301 -66 893 -132 5967 -100 15949 -66 3749 -66 497 -100 625 -66 1147 -66 469 -66 1261 -66 3651 -100 265 -100 26741 -68 6873 -66 4485 -100 2667 -68 3159 -68 2857 -132 2655 -66 12903 -66 1277 -66 1711 -66 787 -100 1327 -198 727 -64 1677 -100 1187 -66 1019 -66 891 -66 4303 -100 11297 -66 3923 -254 253 -1380 247 -292 253 -1344 RAW_Data: 277 -1346 277 -250 279 -1364 275 -244 275 -1362 275 -244 275 -1356 275 -246 273 -1358 241 -278 273 -1356 275 -246 273 -1360 275 -246 273 -234 263 -1382 275 -244 273 -1358 275 -246 273 -1360 275 -246 273 -1358 275 -1340 277 -248 277 -1362 275 -246 273 -234 261 -1380 277 -1344 277 -248 279 -1362 275 -244 273 -236 261 -1380 275 -244 275 -1360 275 -246 275 -1358 275 -1346 277 -246 275 -236 263 -1384 275 -1342 277 -248 277 -1364 277 -244 273 -234 261 -1378 277 -246 273 -1356 277 -1340 277 -248 281 -1334 307 -246 271 -1356 275 -246 273 -1358 275 -244 273 -1326 309 -174 267 -10296 257 -2650 297 -232 263 -1384 277 -244 273 -1358 275 -1340 279 -248 279 -1328 309 -244 275 -1328 307 -244 273 -1356 275 -244 275 -1358 275 -246 273 -1324 309 -244 275 -1328 307 -244 273 -234 261 -1382 275 -246 273 -1326 309 -244 273 -1358 275 -246 273 -1358 275 -1338 279 -248 279 -1330 309 -244 273 -232 261 -1380 277 -1344 279 -248 279 -1330 309 -244 271 -234 261 -1382 275 -246 273 -1358 277 -244 275 -1330 309 -1338 277 -246 277 -236 263 -1380 277 -1342 277 -248 279 -1364 275 -246 273 -232 261 -1380 275 -248 275 -1328 307 -1338 277 -248 279 -1334 309 -244 271 -1358 275 -244 275 -1324 307 -246 271 -1328 309 -174 265 -10270 291 -2640 297 -232 297 -1350 277 -248 275 -1326 309 -1340 277 -248 277 -1328 309 -244 273 -1358 275 -246 273 -1326 309 -244 273 -1354 275 -246 273 -1330 307 -244 273 -1358 275 -246 273 -234 263 -1380 275 -246 273 -1358 275 -246 273 -1360 275 -244 273 -1358 275 -1340 277 -248 279 -1364 275 -244 273 -232 261 -1380 277 -1342 279 -250 279 -1332 307 -244 271 -234 261 -1378 277 -246 273 -1358 275 -248 275 -1360 275 -1340 277 -248 275 -236 263 -1382 277 -1344 277 -246 277 -1364 275 -246 273 -234 259 -1380 275 -246 273 -1362 275 -1342 275 -248 277 -1334 309 -244 271 -1356 275 -244 275 -1326 307 -244 273 -1356 275 -176 267 -10290 289 -2644 267 -238 301 -1320 309 -246 273 -1324 309 -1340 277 -248 277 -1328 307 -246 273 -1326 307 -246 273 -1324 309 -246 273 -1322 309 -246 273 -1322 307 -246 275 -1326 309 -246 273 -234 259 -1382 275 -246 275 -1322 309 -246 273 -1326 309 -246 273 -1326 309 -1340 277 -248 275 -1326 309 -246 273 -232 261 -1380 279 -1346 277 -250 277 -1328 309 -244 271 -232 261 -1380 277 -246 273 -1358 275 -248 273 -1328 307 -1340 277 -248 277 -236 261 -1380 277 -1344 277 -248 279 -1328 309 -244 275 -232 261 -1378 277 -248 273 -1326 309 -1344 277 -248 277 -1358 277 -246 273 -1328 307 -244 271 -1324 309 -244 RAW_Data: 273 -1324 309 -174 267 -10270 289 -2638 297 -234 297 -1352 275 -248 275 -1328 307 -1340 277 -248 275 -1330 309 -244 273 -1358 275 -244 275 -1326 309 -244 271 -1356 275 -244 275 -1326 307 -246 273 -1326 309 -244 273 -234 261 -1378 275 -248 275 -1326 309 -244 271 -1356 277 -248 273 -1328 309 -1338 277 -248 277 -1328 309 -244 271 -232 261 -1380 277 -1348 279 -248 277 -1328 307 -246 271 -234 259 -1384 275 -244 275 -1356 277 -246 275 -1326 309 -1344 275 -248 275 -236 261 -1378 277 -1342 277 -250 279 -1334 309 -244 271 -232 261 -1380 277 -246 273 -1326 307 -1344 277 -248 277 -1328 309 -246 273 -1326 309 -244 271 -1324 309 -244 273 -1324 307 -176 267 -10288 287 -2618 299 -236 299 -1354 277 -244 273 -1326 307 -1340 279 -248 275 -1328 309 -244 275 -1326 309 -246 273 -1324 307 -246 273 -1322 309 -244 273 -1322 309 -244 275 -1328 309 -246 273 -232 261 -1380 277 -246 275 -1324 309 -244 273 -1356 277 -246 275 -1324 309 -1340 279 -246 277 -1328 309 -244 273 -232 261 -1382 277 -1344 279 -250 277 -1324 309 -246 273 -234 261 -1380 277 -246 273 -1358 277 -246 273 -1328 309 -1340 277 -248 275 -236 261 -1380 275 -1344 279 -248 279 -1360 277 -244 273 -234 261 -1380 277 -246 275 -1354 277 -1344 277 -248 277 -1328 311 -246 273 -1324 307 -244 273 -1324 309 -244 273 -1320 309 -176 269 -118210 761 -168 267 -66 563 -132 99 -132 3543 -66 5345 -100 4355 -66 4617 -68 20503 -166 2379 -132 293 -98 4117 -66 1151 -98 3353 -66 3485 -66 2491 -66 6133 -66 233 -68 16307 -68 16959 -98 357 -66 5419 -134 799 -100 327 -100 791 -66 2481 -66 963 -100 3481 -98 1679 -134 2473 -100 227 -68 3087 -66 11527 -130 4305 -98 435 -66 563 -100 2887 -100 267 -66 1787 -66 9655 -66 4793 -100 2119 -66 359 -98 1313 -132 3393 -234 995 -66 2681 -98 99 -130 1379 -100 3757 -100 21695 -132 5135 -100 693 -98 4631 -100 2325 -68 4937 -66 10409 -98 897 -100 1287 -66 2565 -66 3753 -66 4055 -66 2023 -68 1961 -68 629 -66 431 -66 5039 -66 2155 -100 2673 -66 1163 -98 6539 -100 825 -66 1197 -100 3053 -66 13973 -68 15515 -100 1861 -66 1027 -66 797 -98 959 -98 787 -132 787 -64 3811 -132 1747 -66 6683 -66 1033 -68 24927 -66 1259 -100 1125 -68 663 -66 1687 -66 4357 -132 4567 -66 3969 -98 3317 -132 433 -134 6043 -66 3249 -100 431 -98 2367 -100 11265 -66 5085 -68 2355 -64 1815 -66 1395 -274 241 -1366 275 -244 275 -1362 275 -1338 277 -284 243 -1368 239 -278 275 -1362 275 -244 275 -1360 241 -278 273 -1356 275 -246 275 -1360 239 -280 275 -1360 RAW_Data: 275 -244 275 -234 263 -1386 239 -280 273 -1356 275 -244 273 -1360 275 -244 277 -1364 275 -1336 277 -248 277 -1366 275 -244 273 -234 263 -1386 275 -1340 277 -248 279 -1364 275 -244 275 -234 263 -1384 273 -244 275 -1358 275 -244 275 -1364 275 -1342 275 -248 277 -236 265 -1384 275 -1340 277 -282 243 -1366 275 -246 273 -236 263 -1382 277 -244 275 -1358 275 -1342 277 -248 277 -1364 275 -246 275 -1360 239 -280 273 -1358 241 -278 275 -1356 275 -210 233 -10302 257 -2652 297 -232 297 -1354 277 -244 275 -1358 275 -1340 279 -248 279 -1360 275 -246 275 -1360 275 -246 273 -1360 275 -244 275 -1328 309 -242 273 -1324 309 -244 275 -1360 275 -246 273 -234 261 -1384 275 -246 273 -1358 275 -244 275 -1358 277 -248 273 -1358 275 -1340 279 -248 277 -1334 307 -242 273 -232 261 -1380 277 -1348 277 -250 277 -1364 275 -244 275 -234 261 -1380 277 -244 275 -1358 277 -246 277 -1360 277 -1342 275 -248 275 -236 263 -1380 277 -1344 277 -248 279 -1368 275 -244 275 -232 261 -1382 277 -244 275 -1356 275 -1344 277 -248 279 -1362 275 -246 275 -1360 275 -246 273 -1356 275 -246 273 -1356 275 -176 267 -10302 257 -2648 299 -234 297 -1352 277 -246 275 -1326 309 -1340 279 -248 277 -1330 309 -244 275 -1328 309 -244 273 -1324 309 -244 275 -1324 309 -246 273 -1324 307 -246 275 -1328 309 -244 273 -234 261 -1378 277 -248 275 -1328 309 -244 273 -1356 277 -248 275 -1326 309 -1344 277 -248 275 -1326 309 -246 273 -234 259 -1380 277 -1348 281 -248 279 -1328 307 -246 273 -234 259 -1382 277 -246 275 -1360 275 -248 275 -1324 309 -1340 279 -248 277 -238 261 -1382 277 -1344 277 -248 279 -1330 311 -244 273 -234 259 -1378 277 -248 275 -1326 309 -1340 279 -248 279 -1336 307 -246 271 -1324 309 -244 275 -1324 307 -246 273 -1326 309 -174 269 -10296 257 -2648 299 -234 297 -1352 277 -248 273 -1326 309 -1342 277 -248 277 -1328 309 -246 275 -1328 309 -244 273 -1326 309 -244 273 -1322 309 -244 273 -1328 307 -244 275 -1328 309 -246 273 -234 261 -1382 277 -246 275 -1326 309 -244 273 -1352 277 -248 275 -1330 309 -1340 277 -248 277 -1328 309 -244 275 -232 261 -1384 277 -1342 279 -250 279 -1328 309 -244 273 -234 263 -1380 277 -246 273 -1360 277 -246 275 -1326 309 -1340 277 -250 277 -236 263 -1382 277 -1342 277 -248 279 -1362 277 -246 273 -234 263 -1382 277 -244 275 -1356 277 -1340 279 -248 279 -1362 275 -246 275 -1328 307 -246 273 -1356 275 -246 273 -1356 275 -174 269 -10292 287 -2650 269 -236 301 -1354 275 -248 273 -1358 275 -1340 279 -248 277 -1332 307 -246 275 -1328 RAW_Data: 309 -244 273 -1324 309 -244 273 -1356 275 -246 273 -1358 275 -244 277 -1330 309 -244 273 -234 261 -1382 277 -244 275 -1358 275 -246 273 -1356 277 -248 275 -1360 275 -1340 277 -248 277 -1360 275 -246 273 -236 261 -1382 279 -1344 279 -248 279 -1360 277 -244 273 -234 261 -1380 277 -246 275 -1360 277 -246 273 -1360 275 -1342 279 -248 275 -236 263 -1382 275 -1344 279 -248 279 -1362 277 -246 273 -234 263 -1380 277 -246 275 -1356 275 -1342 277 -248 281 -1336 307 -246 271 -1354 277 -246 275 -1328 307 -244 273 -1352 277 -176 269 -10300 257 -2650 299 -232 297 -1354 277 -246 275 -1356 277 -1342 277 -248 279 -1328 309 -244 275 -1360 275 -246 273 -1328 307 -246 273 -1356 277 -246 277 -1326 309 -244 277 -1360 277 -246 273 -234 263 -1384 277 -246 275 -1324 309 -246 275 -1358 277 -246 277 -1360 277 -1344 277 -248 277 -1326 309 -246 273 -236 261 -1382 277 -1348 279 -250 281 -1330 307 -246 273 -234 263 -1386 277 -244 275 -1356 277 -248 277 -1362 277 -1342 277 -250 277 -238 263 -1384 277 -1342 277 -250 281 -1332 309 -246 273 -234 263 -1380 277 -246 275 -1360 277 -1342 279 -248 281 -1334 307 -246 273 -1356 275 -248 275 -1328 309 -244 275 -1324 309 -176 269 -115034 163 -362 67 -894 529 -166 14663 -98 4135 -66 3681 -100 299 -68 9829 -66 3517 -64 21569 -66 3251 -66 2209 -64 23701 -66 3359 -68 1057 -66 723 -66 299 -134 765 -66 589 -98 1687 -134 2153 -66 3081 -68 10447 -66 11643 -66 2451 -66 2277 -66 2897 -66 755 -100 5539 -64 5117 -132 4867 -134 3931 -64 625 -66 1317 -98 11597 -66 2255 -66 1165 -66 1123 -66 6371 -100 699 -68 1811 -66 621 -68 2191 -64 1291 -134 3003 -66 2423 -64 1463 -66 663 -100 1127 -100 6169 -100 489 -100 6087 -100 2027 -66 1195 -66 13195 -66 557 -66 40423 -98 1919 -100 1061 -132 201 -66 2553 -132 12549 -66 1789 -100 921 -134 1067 -66 729 -66 10029 -66 3909 -100 265 -100 16017 -134 21177 -68 2461 -66 2215 -68 1197 -66 5911 -66 2645 -66 3419 -132 16275 -64 5091 -68 2123 -66 2677 -64 10305 -66 12381 -100 427 -166 25331 -66 2457 -66 11859 -248 279 -1368 275 -246 275 -1360 275 -1340 277 -246 279 -1364 239 -278 275 -1358 275 -244 275 -1362 239 -278 273 -1358 239 -280 271 -1360 241 -278 273 -1360 275 -244 275 -234 261 -1384 239 -280 273 -1356 275 -244 273 -1360 275 -244 275 -1358 275 -1344 277 -248 275 -1358 275 -244 273 -236 261 -1384 275 -1342 279 -246 279 -1360 275 -244 275 -234 263 -1384 239 -278 273 -1358 275 -244 275 -1362 275 -1342 275 -248 275 -238 263 -1382 275 -1344 275 -248 RAW_Data: 277 -1364 275 -244 273 -234 263 -1380 275 -246 273 -1358 275 -1342 277 -246 279 -1366 275 -244 273 -1362 239 -278 239 -1386 275 -246 273 -1360 241 -208 269 -10290 257 -2686 265 -232 265 -1384 275 -246 275 -1358 275 -1344 277 -248 275 -1358 275 -246 275 -1360 277 -244 273 -1326 309 -244 271 -1354 275 -244 275 -1358 275 -246 273 -1358 275 -246 273 -234 263 -1378 275 -246 275 -1360 275 -244 273 -1356 275 -246 275 -1360 275 -1342 277 -246 277 -1360 275 -246 273 -232 261 -1382 277 -1342 279 -248 279 -1360 275 -244 275 -232 261 -1380 277 -244 275 -1356 277 -246 277 -1360 275 -1342 277 -246 275 -236 263 -1384 275 -1342 277 -248 277 -1362 275 -246 273 -234 261 -1378 277 -246 275 -1328 307 -1340 277 -246 279 -1366 275 -244 273 -1326 307 -244 273 -1324 309 -244 273 -1356 275 -174 267 -10304 255 -2648 297 -230 263 -1382 277 -244 275 -1330 307 -1338 277 -248 277 -1330 309 -244 273 -1356 275 -246 273 -1362 275 -244 273 -1356 275 -244 273 -1326 307 -244 273 -1360 273 -246 273 -236 261 -1380 275 -244 275 -1328 307 -244 273 -1358 275 -244 275 -1360 275 -1342 277 -246 277 -1364 275 -244 271 -232 261 -1384 277 -1340 279 -248 279 -1360 275 -246 273 -234 261 -1380 275 -244 275 -1360 277 -244 275 -1356 275 -1342 279 -246 277 -236 263 -1382 275 -1340 277 -248 279 -1366 275 -246 271 -234 261 -1382 277 -244 275 -1354 275 -1342 277 -248 277 -1364 273 -246 273 -1362 275 -244 271 -1360 275 -244 273 -1358 275 -174 267 -10272 289 -2646 265 -262 261 -1382 277 -244 275 -1356 275 -1342 277 -248 277 -1364 275 -244 275 -1360 275 -244 273 -1358 275 -244 273 -1358 275 -244 273 -1326 307 -244 275 -1358 275 -246 273 -234 261 -1382 275 -246 273 -1358 275 -244 273 -1358 275 -246 275 -1360 275 -1338 277 -248 277 -1362 277 -244 271 -234 261 -1380 277 -1344 279 -248 277 -1332 273 -278 271 -234 261 -1382 275 -244 275 -1356 277 -246 275 -1360 277 -1340 277 -246 277 -234 263 -1384 275 -1342 277 -248 277 -1366 275 -244 273 -234 261 -1380 275 -246 273 -1360 275 -1340 277 -246 279 -1334 307 -244 273 -1356 275 -246 273 -1360 275 -244 271 -1354 277 -174 269 -10300 257 -2648 297 -230 263 -1384 277 -244 273 -1356 277 -1342 277 -248 277 -1362 275 -244 275 -1330 307 -244 273 -1324 309 -244 273 -1324 307 -246 273 -1326 307 -244 273 -1358 275 -246 273 -234 261 -1380 277 -246 273 -1358 275 -244 275 -1354 277 -248 275 -1360 275 -1338 279 -246 277 -1360 275 -244 273 -234 261 -1378 279 -1344 279 -248 279 -1330 309 -244 271 -232 261 -1380 277 -246 273 -1360 RAW_Data: 277 -244 275 -1360 275 -1340 277 -246 277 -236 261 -1380 275 -1346 277 -248 277 -1362 275 -246 273 -234 263 -1380 275 -244 275 -1358 275 -1340 277 -248 279 -1334 309 -244 273 -1324 307 -246 273 -1356 275 -244 273 -1356 275 -174 269 -10302 257 -2644 297 -232 263 -1384 277 -246 275 -1354 275 -1344 277 -248 275 -1360 275 -246 275 -1358 275 -246 273 -1326 307 -246 273 -1324 307 -244 273 -1328 307 -244 273 -1358 275 -244 273 -236 261 -1380 275 -246 273 -1358 275 -244 273 -1358 275 -246 273 -1360 275 -1344 275 -248 275 -1360 275 -244 273 -234 261 -1378 277 -1344 279 -248 277 -1362 275 -246 273 -234 261 -1378 275 -244 275 -1360 275 -246 275 -1358 275 -1344 277 -246 277 -234 263 -1380 275 -1338 279 -246 281 -1368 275 -244 271 -234 261 -1386 275 -244 271 -1358 275 -1342 277 -246 279 -1362 275 -244 275 -1326 273 -278 273 -1358 239 -278 273 -1358 275 -174 267 -127478 195 -964 2317 -66 763 -98 1455 -100 16109 -66 5683 -98 11469 -66 34413 -66 5443 -66 11613 -66 2737 -66 12191 -66 2951 -68 1851 -68 1895 -68 2643 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/kia_seed_raw.sub ================================================ Filetype: Flipper SubGhz RAW File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: RAW RAW_Data: 51 -5136 1113 -104 127 -606 179 -126 325 -102 147 -200 205 -80 107 -190 81 -54 135 -378 181 -204 199 -104 121 -146 51 -230 75 -76 227 -102 415 -236 159 -54 159 -212 77 -312 73 -74 75 -128 155 -102 125 -358 125 -198 173 -608 75 -248 203 -558 53 -186 367 -180 151 -132 133 -138 135 -424 51 -240 53 -132 703 -80 79 -80 129 -294 77 -102 193 -270 77 -52 131 -180 51 -76 77 -76 51 -666 77 -104 101 -54 77 -164 107 -622 615 -294 133 -138 217 -180 75 -104 185 -80 107 -134 159 -398 181 -74 97 -198 73 -76 99 -102 127 -248 71 -128 211 -106 109 -104 101 -384 311 -398 51 -240 111 -84 81 -110 81 -668 105 -54 77 -158 79 -342 493 -78 153 -152 179 -122 223 -696 139 -590 81 -212 83 -322 129 -132 307 -346 129 -78 77 -232 77 -104 503 -52 187 -290 159 -108 159 -108 51 -136 53 -132 103 -566 177 -326 129 -176 177 -52 355 -308 129 -176 73 -104 151 -262 193 -168 111 -162 247 -52 131 -54 107 -84 83 -218 135 -402 107 -300 105 -220 81 -82 137 -82 163 -238 51 -192 293 -184 319 -454 81 -132 131 -132 79 -866 131 -212 163 -112 133 -106 211 -110 189 -214 51 -410 107 -454 131 -562 157 -52 367 -378 165 -110 81 -134 81 -82 75 -104 217 -638 81 -84 109 -160 81 -160 135 -54 53 -478 239 -78 209 -54 107 -52 155 -238 53 -184 105 -318 105 -370 233 -54 109 -246 217 -110 245 -110 209 -80 129 -514 79 -54 79 -314 155 -156 109 -292 79 -504 51 -644 157 -132 53 -208 53 -76 103 -76 77 -260 105 -82 133 -212 163 -136 53 -380 313 -178 193 -172 207 -82 79 -186 107 -136 53 -136 159 -156 97 -98 99 -254 179 -106 135 -214 307 -310 77 -76 123 -242 129 -52 103 -584 103 -178 203 -324 101 -572 253 -78 125 -126 129 -408 131 -52 129 -76 51 -132 79 -248 79 -414 51 -338 717 -322 79 -180 105 -294 109 -254 241 -76 251 -52 101 -152 125 -260 155 -80 77 -292 51 -226 209 -338 147 -100 51 -366 53 -348 133 -268 79 -366 55 -224 111 -248 81 -218 137 -168 79 -288 291 -132 51 -238 79 -78 103 -102 329 -102 123 -178 53 -202 51 -130 79 -138 51 -126 151 -180 99 -388 75 -126 51 -636 329 -150 99 -152 73 -122 177 -124 151 -386 297 -72 103 -130 51 -256 207 -354 75 -124 71 -148 351 -262 51 -540 77 -200 101 -132 77 -362 77 -254 103 -106 79 -296 51 -130 361 -240 51 -358 51 -284 201 -158 185 -288 183 -424 77 -130 RAW_Data: 121 -146 99 -124 327 -74 99 -148 99 -252 183 -112 161 -216 263 -232 77 -102 103 -416 77 -382 345 -160 131 -110 167 -138 79 -158 133 -54 163 -84 107 -80 107 -108 107 -136 225 -82 321 -108 79 -106 107 -106 55 -162 103 -160 133 -192 53 -84 269 -106 77 -162 53 -136 161 -82 135 -346 77 -864 107 -140 55 -250 189 -128 201 -502 157 -564 105 -52 107 -1150 53 -218 237 -76 159 -1010 129 -196 139 -244 101 -270 77 -106 133 -110 109 -254 501 -496 237 -692 107 -54 159 -134 347 -210 51 -190 55 -276 103 -184 229 -98 149 -252 123 -156 75 -150 537 -236 103 -204 101 -100 73 -368 283 -102 77 -652 229 -206 99 -150 197 -206 53 -80 131 -274 101 -186 159 -396 51 -188 81 -188 83 -350 105 -428 129 -128 79 -78 53 -104 351 -284 235 -130 79 -242 51 -186 77 -134 135 -434 131 -552 53 -136 107 -140 141 -252 53 -54 53 -82 51 -770 79 -130 103 -432 127 -208 153 -226 131 -248 101 -902 125 -206 129 -102 77 -154 77 -188 105 -322 105 -166 133 -474 77 -728 161 -190 107 -54 133 -80 79 -190 53 -162 53 -404 77 -334 105 -52 153 -728 423 -700 133 -476 53 -162 53 -542 159 -168 189 -134 163 -134 81 -106 133 -54 267 -108 163 -242 165 -56 167 -294 81 -136 185 -660 51 -304 157 -54 109 -378 133 -272 159 -304 135 -110 53 -402 105 -630 185 -78 257 -422 173 -252 247 -100 123 -330 107 -166 109 -502 127 -156 219 -76 101 -348 71 -586 149 -154 73 -74 77 -358 131 -270 81 -108 159 -516 295 -346 53 -240 157 -240 55 -562 133 -110 213 -320 103 -560 79 -286 51 -134 55 -452 79 -136 79 -80 77 -52 185 -504 79 -216 79 -242 135 -262 75 -206 125 -472 111 -564 79 -322 79 -432 217 -456 167 -272 103 -664 53 -302 127 -138 241 -184 53 -80 81 -192 395 -604 133 -136 53 -1044 105 -166 215 -426 133 -1222 101 -348 127 -124 123 -248 153 -492 177 -102 103 -180 77 -204 151 -282 101 -74 103 -76 101 -170 73 -506 101 -368 51 -124 193 -236 53 -310 77 -130 155 -366 229 -526 129 -428 83 -922 51 -106 131 -82 219 -706 79 -80 81 -162 133 -276 195 -220 51 -266 81 -54 51 -238 53 -686 77 -354 229 -164 195 -164 81 -294 81 -132 197 -238 73 -202 181 -180 149 -128 207 -192 111 -56 187 -808 77 -608 79 -898 77 -208 97 -200 73 -184 75 -78 203 -664 105 -384 103 -102 129 -238 131 -1346 137 -526 105 -390 129 -138 81 -484 103 -222 109 -268 51 -240 RAW_Data: 81 -658 53 -626 79 -562 79 -52 77 -266 107 -54 109 -410 105 -514 107 -110 53 -334 79 -928 121 -498 105 -184 149 -174 73 -908 129 -388 199 -450 153 -862 51 -896 101 -776 51 -990 129 -154 177 -412 169 -254 77 -902 105 -474 77 -2390 103 -1000 107 -2112 151 -402 51 -428 337 -440 129 -590 197 -538 53 -138 81 -584 81 -1958 107 -4714 57 -786 53 -684 137 -442 105 -654 53 -696 51 -2382 105 -376 83 -822 155 -6282 103 -560 77 -252 79 -1518 103 -3648 51 -6150 75 -4986 75 -2042 53 -2798 171 -804 2247 -130 357 -168 309 -168 307 -170 293 -172 305 -192 279 -224 253 -224 279 -196 265 -224 261 -222 253 -224 253 -224 279 -214 245 -232 243 -252 253 -224 251 -226 241 -222 253 -246 251 -224 253 -224 251 -252 213 -248 261 -222 251 -226 251 -254 223 -242 245 -232 245 -250 225 -252 253 -224 241 -222 253 -246 251 -226 251 -224 253 -252 213 -248 233 -248 253 -224 253 -252 223 -242 247 -230 245 -252 223 -252 253 -224 241 -222 255 -244 251 -226 251 -224 253 -252 213 -248 233 -250 251 -226 251 -252 225 -242 245 -230 245 -252 225 -252 251 -226 241 -222 253 -246 251 -224 253 -224 251 -254 213 -246 235 -248 251 -226 251 -254 223 -242 245 -232 245 -252 225 -252 251 -224 253 -214 245 -236 247 -252 253 -224 251 -226 241 -246 231 -246 251 -226 251 -224 253 -252 213 -248 233 -250 251 -226 253 -252 223 -242 245 -232 243 -254 223 -254 251 -224 253 -214 245 -236 247 -254 251 -224 253 -224 241 -246 231 -246 251 -226 251 -252 225 -252 213 -248 261 -224 251 -226 251 -252 225 -252 213 -250 261 -222 253 -224 253 -252 225 -242 245 -230 245 -252 225 -252 251 -226 241 -220 255 -246 249 -226 251 -226 251 -254 213 -248 233 -248 251 -226 251 -254 223 -242 245 -232 245 -252 223 -252 253 -224 241 -222 253 -246 251 -226 251 -224 253 -252 213 -248 233 -248 253 -224 253 -252 223 -242 245 -232 245 -252 223 -252 253 -224 241 -222 255 -244 251 -226 251 -224 253 -252 213 -246 235 -248 251 -254 223 -252 225 -242 245 -232 245 -252 223 -254 251 -226 241 -222 253 -246 251 -224 253 -224 251 -254 213 -248 233 -248 251 -226 251 -254 223 -242 245 -230 245 -252 225 -252 251 -226 241 -222 253 -246 251 -224 253 -224 251 -254 213 -248 233 -248 253 -224 253 -252 225 -252 213 -248 261 -224 251 -226 251 -252 225 -242 245 -230 245 -254 223 -252 253 -224 241 -222 253 -246 251 -226 251 -224 251 -254 213 -248 259 -224 251 -226 RAW_Data: 251 -254 223 -242 245 -230 245 -252 225 -252 251 -226 251 -214 247 -234 249 -252 251 -226 251 -224 241 -248 229 -248 251 -224 253 -224 251 -254 213 -246 261 -224 251 -226 251 -252 225 -242 245 -230 247 -252 223 -252 253 -224 243 -220 255 -244 251 -226 251 -226 251 -252 213 -248 233 -248 251 -252 225 -252 225 -242 245 -232 245 -252 223 -254 251 -224 253 -214 247 -236 247 -252 251 -226 251 -226 241 -246 231 -246 251 -224 253 -224 251 -254 213 -248 233 -248 253 -252 223 -254 223 -242 245 -232 245 -252 223 -254 251 -226 241 -220 255 -244 251 -226 251 -226 251 -252 213 -248 233 -250 251 -226 251 -252 225 -242 245 -230 245 -254 223 -252 253 -224 241 -222 253 -246 251 -224 253 -224 253 -252 213 -246 235 -248 251 -226 251 -254 223 -242 245 -232 245 -252 223 -254 251 -226 251 -214 247 -234 247 -254 251 -224 253 -224 241 -246 231 -246 251 -226 251 -226 251 -252 213 -248 261 -222 253 -224 253 -252 225 -242 245 -230 245 -254 223 -252 253 -224 253 -214 245 -236 247 -252 253 -224 251 -226 241 -246 231 -246 251 -226 251 -252 225 -252 213 -248 235 -248 251 -254 223 -252 225 -242 245 -230 247 -252 223 -252 253 -224 241 -222 253 -246 251 -226 251 -224 253 -252 215 -246 235 -248 251 -224 479 -484 501 -482 461 -492 483 -466 255 -234 245 -252 223 -254 251 -226 241 -222 487 -480 253 -222 489 -480 251 -246 465 -482 251 -246 231 -246 483 -468 255 -234 481 -488 233 -246 233 -248 483 -466 255 -234 245 -252 225 -252 251 -226 469 -494 483 -488 483 -482 221 -250 473 -488 479 -490 231 -248 231 -246 251 -226 251 -226 251 -252 467 -476 249 -252 223 -252 469 -494 481 -470 485 -484 247 -252 469 -462 481 -498 229 -252 243 -252 225 -252 223 -254 251 -214 477 -484 247 -250 251 -214 247 -234 247 -252 481 -460 261 -244 251 -226 479 -486 1435 -1456 231 -236 247 -252 225 -252 253 -224 241 -222 253 -246 251 -224 253 -224 253 -252 213 -246 261 -222 251 -226 251 -252 225 -242 245 -230 247 -252 481 -462 493 -480 481 -492 481 -462 255 -224 263 -222 253 -252 223 -254 223 -242 475 -484 249 -222 505 -488 245 -222 469 -496 247 -252 223 -254 469 -490 249 -224 477 -482 237 -250 249 -226 479 -484 239 -246 251 -226 251 -226 251 -252 467 -474 481 -490 491 -456 271 -224 469 -494 481 -492 229 -236 245 -252 225 -252 251 -226 241 -222 487 -482 251 -246 231 -246 483 -468 487 -482 473 -486 265 -222 485 -492 461 -484 247 -250 RAW_Data: 253 -214 245 -234 247 -252 225 -252 473 -486 243 -252 225 -254 223 -254 251 -214 477 -486 245 -252 223 -242 477 -484 1463 -1444 249 -222 253 -224 241 -246 233 -248 251 -226 251 -254 223 -252 213 -248 261 -224 251 -226 251 -254 223 -242 245 -232 245 -252 223 -252 253 -224 469 -496 483 -488 457 -506 479 -462 259 -244 223 -252 253 -224 251 -226 241 -246 467 -478 253 -246 467 -480 251 -248 465 -480 251 -248 229 -248 483 -468 255 -232 483 -474 255 -224 265 -224 483 -492 229 -236 249 -252 223 -252 253 -224 469 -496 479 -482 491 -480 225 -246 485 -482 491 -462 245 -252 253 -224 253 -224 241 -246 231 -246 483 -488 229 -250 241 -252 457 -490 489 -460 497 -484 243 -224 483 -490 489 -458 249 -248 249 -240 249 -226 251 -226 251 -226 493 -472 249 -252 223 -252 223 -242 245 -234 483 -488 233 -246 233 -248 483 -468 1451 -1448 229 -492 247 -248 79 -400 157 -566 133 -108 379 -218 109 -54 163 -164 51 -102 315 -260 263 -80 463 -234 151 -76 149 -154 249 -126 99 -130 125 -270 127 -188 427 -210 131 -222 593 -106 241 -562 239 -84 305 -262 183 -80 53 -524 125 -480 227 -328 51 -350 211 -82 181 -108 215 -106 147 -200 183 -104 397 -52 131 -102 147 -172 335 -618 177 -206 131 -220 129 -158 213 -52 187 -164 135 -334 157 -410 73 -120 225 -234 133 -108 81 -138 599 -238 131 -262 77 -368 209 -130 103 -76 335 -78 101 -232 253 -280 97 -74 73 -74 97 -52 383 -272 125 -104 81 -82 455 -106 159 -78 127 -52 183 -358 55 -170 139 -86 53 -108 299 -52 129 -282 385 -104 101 -514 75 -232 153 -510 75 -174 97 -128 151 -152 101 -206 103 -76 227 -308 77 -302 129 -76 77 -592 175 -202 75 -314 157 -400 343 -52 185 -104 135 -136 129 -108 111 -112 271 -266 161 -108 107 -240 343 -342 213 -128 99 -124 181 -54 103 -200 101 -274 157 -104 131 -154 123 -588 105 -108 107 -54 161 -52 349 -184 83 -84 53 -54 133 -540 105 -52 53 -160 105 -334 481 -180 101 -304 257 -176 77 -286 79 -106 179 -102 73 -554 285 -184 77 -396 103 -264 185 -106 233 -732 235 -108 53 -82 185 -140 137 -188 285 -294 281 -338 127 -378 77 -242 239 -112 327 -106 219 -240 55 -54 109 -584 51 -134 79 -80 215 -80 109 -54 81 -264 157 -310 51 -130 161 -140 375 -290 129 -886 263 -78 51 -342 55 -104 207 -288 271 -108 179 -74 75 -460 257 -280 77 -106 51 -104 53 -150 125 -174 155 -80 221 -108 161 -310 RAW_Data: 77 -104 51 -208 79 -452 379 -130 51 -318 237 -214 257 -180 77 -298 79 -604 103 -398 187 -346 181 -154 97 -174 285 -156 51 -102 583 -78 75 -74 151 -102 255 -158 339 -80 77 -234 155 -102 101 -250 75 -76 147 -150 123 -100 75 -78 259 -180 251 -80 51 -104 77 -130 77 -52 159 -236 103 -622 173 -1016 131 -184 153 -156 73 -274 331 -292 105 -204 199 -516 103 -210 157 -104 287 -304 153 -78 129 -78 385 -332 179 -286 181 -178 145 -176 121 -76 169 -146 123 -102 181 -180 51 -176 147 -230 103 -172 75 -208 199 -52 153 -52 75 -134 265 -80 51 -182 157 -110 237 -104 183 -198 213 -168 219 -132 75 -78 101 -76 101 -306 231 -130 99 -152 125 -130 105 -132 135 -110 133 -476 213 -54 325 -322 209 -404 303 -106 81 -166 403 -134 105 -242 403 -104 129 -182 55 -174 165 -168 83 -304 185 -130 133 -108 135 -134 103 -52 181 -362 207 -54 179 -228 231 -236 105 -214 53 -158 77 -452 319 -106 79 -348 349 -406 133 -84 195 -104 239 -158 197 -164 79 -80 79 -54 79 -156 201 -374 941 -492 77 -174 73 -230 75 -278 177 -52 477 -306 129 -106 79 -108 113 -196 127 -328 51 -102 125 -76 75 -102 153 -76 99 -146 373 -134 185 -134 105 -352 105 -436 127 -246 51 -106 79 -238 131 -82 165 -270 109 -108 79 -634 157 -242 105 -78 129 -52 131 -266 215 -270 329 -162 51 -478 209 -52 157 -372 79 -82 367 -560 129 -210 53 -54 133 -106 133 -292 77 -106 159 -84 185 -80 509 -54 473 -80 103 -108 105 -158 51 -180 123 -122 71 -208 129 -210 371 -212 75 -110 341 -164 425 -130 181 -54 313 -278 51 -52 129 -386 263 -78 245 -344 287 -134 133 -130 81 -276 105 -114 129 -106 487 -78 127 -182 179 -146 127 -148 125 -186 133 -182 127 -76 195 -96 103 -76 75 -52 101 -204 77 -102 405 -102 75 -224 125 -276 153 -100 147 -350 259 -156 77 -128 463 -76 77 -234 103 -252 51 -286 75 -232 201 -102 75 -176 175 -124 151 -100 51 -254 97 -74 123 -122 123 -174 201 -154 129 -190 53 -136 81 -78 79 -216 133 -106 111 -84 137 -136 163 -324 103 -78 51 -56 109 -106 177 -168 75 -492 131 -52 131 -180 73 -74 359 -104 101 -102 101 -492 159 -290 215 -80 187 -214 103 -160 135 -130 175 -126 107 -54 75 -78 77 -152 199 -604 97 -74 101 -284 127 -52 177 -434 153 -122 781 -208 79 -80 105 -292 135 -84 247 -318 51 -430 79 -162 109 -56 135 -190 185 -78 159 -130 RAW_Data: 185 -188 137 -108 331 -56 79 -132 167 -188 107 -320 393 -310 99 -154 51 -180 153 -74 101 -76 229 -128 183 -184 249 -108 299 -82 191 -532 295 -400 103 -80 79 -272 53 -276 213 -84 55 -110 291 -106 123 -204 101 -102 77 -104 157 -102 51 -126 51 -126 183 -140 83 -264 53 -134 261 -128 81 -82 81 -298 81 -266 77 -52 51 -474 265 -366 103 -226 239 -166 677 -232 175 -150 205 -76 123 -76 97 -176 127 -284 77 -76 357 -182 73 -326 171 -104 675 -236 301 -216 53 -84 107 -52 157 -78 237 -136 289 -130 215 -350 77 -320 187 -110 347 -240 159 -134 79 -486 207 -272 129 -82 293 -188 105 -212 77 -216 445 -836 151 -150 73 -262 75 -102 253 -52 101 -102 281 -386 149 -230 355 -212 51 -130 329 -224 149 -52 75 -204 77 -108 85 -194 341 -134 269 -132 161 -56 81 -556 187 -448 395 -130 177 -136 107 -184 239 -136 53 -214 135 -266 79 -368 109 -372 315 -78 79 -78 103 -132 53 -82 81 -104 129 -182 125 -74 103 -236 211 -294 205 -216 131 -108 211 -236 79 -54 103 -104 161 -54 265 -54 187 -162 107 -134 183 -190 237 -104 51 -186 107 -164 137 -102 77 -206 197 -238 107 -52 53 -78 155 -126 201 -78 125 -204 103 -102 75 -104 253 -76 105 -238 159 -366 209 -216 165 -56 55 -322 585 -80 183 -108 81 -136 109 -168 211 -236 295 -674 337 -78 211 -312 77 -242 297 -378 215 -190 79 -298 161 -108 183 -122 121 -252 103 -516 105 -54 123 -226 291 -78 77 -104 53 -484 197 -452 51 -306 77 -106 127 -178 51 -256 209 -264 101 -76 101 -126 151 -126 251 -1152 359 -126 325 -254 551 -156 83 -666 161 -236 105 -186 103 -108 161 -80 157 -54 51 -344 159 -82 349 -160 141 -270 131 -578 189 -162 287 -134 161 -712 127 -106 51 -108 345 -704 431 -362 51 -52 415 -208 233 -342 257 -288 131 -80 77 -252 53 -330 105 -160 83 -280 393 -358 103 -480 161 -134 51 -54 259 -104 129 -130 105 -80 217 -350 269 -192 57 -302 79 -264 81 -326 157 -80 79 -214 51 -370 129 -236 53 -136 105 -82 57 -140 137 -52 79 -236 103 -80 55 -192 293 -188 53 -348 185 -236 207 -56 135 -54 215 -216 587 -132 103 -160 133 -158 365 -52 103 -54 107 -80 185 -298 267 -136 159 -110 109 -82 241 -78 77 -78 101 -82 141 -226 55 -462 79 -188 81 -216 511 -210 79 -162 161 -160 101 -388 157 -180 101 -100 197 -336 581 -130 211 -264 155 -52 297 -180 75 -100 73 -100 247 -130 RAW_Data: 133 -346 505 -108 105 -80 243 -292 79 -104 339 -78 75 -128 287 -398 99 -300 479 -104 257 -130 153 -78 359 -152 79 -300 77 -348 109 -82 217 -108 243 -80 185 -430 133 -460 211 -234 207 -52 291 -80 77 -54 81 -82 265 -78 101 -132 255 -122 73 -512 129 -126 77 -158 213 -168 81 -82 479 -160 159 -108 157 -158 133 -236 129 -128 485 -126 153 -412 99 -250 255 -274 173 -358 231 -76 53 -78 131 -54 135 -290 77 -102 305 -128 77 -310 183 -80 239 -80 135 -166 189 -104 81 -140 111 -164 477 -488 51 -134 53 -80 429 -240 529 -476 287 -80 189 -136 327 -84 79 -160 293 -348 133 -148 179 -52 231 -102 175 -76 125 -100 425 -228 77 -200 183 -154 231 -212 253 -78 299 -132 145 -124 337 -150 101 -132 99 -274 153 -182 53 -158 51 -160 453 -134 427 -182 77 -134 275 -528 77 -108 79 -110 109 -110 245 -136 171 -164 473 -106 265 -80 267 -184 179 -330 287 -212 185 -350 129 -630 467 -350 489 -166 107 -56 79 -270 53 -84 757 -624 207 -102 51 -416 287 -288 103 -406 73 -132 51 -214 135 -644 103 -146 73 -358 629 -736 309 -150 275 -254 51 -106 53 -54 105 -80 53 -180 77 -110 297 -106 79 -418 261 -80 161 -80 77 -480 79 -156 215 -190 601 -130 353 -76 73 -76 127 -198 125 -100 531 -78 77 -438 103 -134 191 -312 291 -108 53 -134 53 -214 317 -80 277 -182 279 -302 329 -104 479 -182 203 -98 273 -222 247 -250 241 -252 219 -248 221 -254 243 -252 225 -254 223 -252 253 -214 245 -236 247 -252 251 -226 251 -224 241 -222 255 -246 251 -226 251 -226 251 -252 213 -248 235 -248 253 -224 253 -252 225 -242 245 -230 245 -252 223 -254 251 -224 253 -214 247 -236 247 -252 251 -226 251 -226 241 -222 255 -246 251 -224 253 -224 251 -254 213 -248 233 -248 253 -224 253 -252 223 -242 247 -230 245 -252 225 -252 253 -224 251 -214 247 -236 247 -254 251 -224 253 -224 241 -246 231 -246 251 -226 251 -224 253 -252 213 -248 235 -248 251 -226 251 -254 223 -242 245 -232 245 -252 223 -254 251 -224 241 -222 253 -246 251 -224 253 -224 253 -252 213 -248 233 -248 251 -226 253 -252 223 -242 245 -232 245 -252 225 -252 253 -224 251 -214 247 -236 247 -252 253 -224 251 -226 241 -246 231 -246 251 -224 253 -252 225 -252 213 -248 233 -248 253 -252 225 -252 223 -244 245 -230 245 -254 223 -252 253 -224 253 -214 245 -236 247 -252 253 -224 251 -226 241 -246 231 -246 251 -224 253 -252 223 -252 RAW_Data: 213 -248 263 -222 251 -226 251 -254 223 -242 245 -232 245 -252 223 -254 251 -224 253 -214 247 -234 249 -252 251 -226 251 -224 241 -246 231 -246 251 -226 251 -254 223 -252 213 -248 261 -222 253 -252 223 -254 223 -242 245 -232 245 -252 225 -252 251 -226 241 -222 253 -246 251 -224 253 -224 253 -252 213 -246 261 -222 251 -226 251 -254 223 -242 245 -232 245 -252 223 -254 251 -224 241 -222 253 -246 251 -224 253 -224 253 -252 213 -248 235 -248 251 -224 251 -254 223 -242 245 -232 245 -252 225 -252 251 -226 241 -222 253 -246 251 -224 253 -224 253 -252 213 -246 261 -222 251 -226 251 -254 223 -242 245 -232 245 -252 223 -254 251 -224 243 -220 253 -246 251 -226 251 -224 251 -254 213 -248 233 -248 251 -254 223 -254 223 -242 245 -232 245 -252 225 -252 251 -226 241 -222 253 -246 251 -224 253 -224 253 -252 213 -248 233 -248 251 -226 251 -252 225 -242 245 -230 247 -252 223 -254 251 -224 253 -214 245 -236 247 -254 251 -224 253 -224 241 -246 231 -246 251 -224 253 -224 253 -242 219 -256 243 -254 223 -254 251 -224 253 -214 245 -236 247 -252 251 -226 251 -224 243 -246 229 -248 251 -224 253 -252 223 -254 213 -246 261 -224 251 -226 251 -254 223 -242 245 -232 245 -252 223 -252 253 -224 241 -222 253 -246 251 -226 251 -224 253 -252 213 -248 233 -248 253 -224 253 -252 223 -254 213 -248 263 -222 253 -224 253 -252 223 -242 245 -232 245 -252 223 -254 251 -226 241 -220 253 -246 251 -226 251 -224 253 -252 213 -248 261 -222 251 -226 251 -254 223 -242 245 -232 243 -252 225 -252 253 -224 241 -222 253 -246 251 -226 251 -224 251 -254 213 -246 261 -222 253 -224 253 -252 223 -242 247 -230 245 -252 223 -254 251 -224 243 -220 255 -246 249 -226 251 -226 251 -254 213 -246 235 -248 251 -226 251 -252 225 -242 245 -230 245 -252 225 -252 253 -224 251 -214 247 -236 247 -254 251 -224 253 -224 241 -246 231 -246 251 -226 251 -224 253 -252 213 -248 261 -222 251 -226 253 -252 223 -242 245 -232 245 -252 225 -252 253 -224 251 -214 247 -234 249 -252 251 -226 251 -224 241 -246 231 -246 251 -226 251 -226 251 -254 213 -248 261 -220 253 -252 225 -252 223 -242 247 -230 245 -254 479 -462 495 -482 479 -490 481 -470 229 -254 245 -250 225 -252 223 -254 251 -214 503 -458 249 -248 481 -484 243 -224 495 -472 249 -252 223 -252 471 -490 249 -224 479 -486 473 -482 241 -242 477 -482 247 -250 253 -214 245 -234 247 -252 481 -462 495 -482 RAW_Data: 465 -488 245 -252 479 -480 473 -488 243 -252 213 -246 261 -224 251 -224 253 -252 469 -466 245 -254 251 -224 473 -486 481 -480 485 -482 247 -224 505 -458 499 -484 243 -252 223 -252 225 -252 223 -242 247 -232 483 -490 485 -472 249 -252 473 -484 243 -224 483 -492 231 -234 485 -488 487 -472 1445 -1448 237 -248 251 -226 251 -224 253 -252 213 -246 261 -222 251 -254 223 -252 225 -242 245 -230 247 -252 223 -254 251 -224 243 -220 255 -244 251 -226 477 -482 501 -454 507 -480 479 -462 259 -244 251 -224 253 -224 251 -226 241 -246 493 -464 241 -242 475 -484 249 -222 505 -484 225 -246 251 -242 485 -470 229 -254 477 -480 485 -482 247 -224 495 -464 273 -224 253 -224 251 -226 241 -246 493 -480 479 -470 481 -480 233 -266 459 -488 485 -476 247 -252 223 -254 251 -214 245 -234 247 -252 481 -462 259 -244 251 -226 479 -486 469 -482 481 -492 247 -224 477 -482 503 -464 241 -242 245 -232 245 -254 223 -252 253 -224 469 -496 483 -486 229 -252 477 -476 227 -248 497 -480 227 -254 477 -480 483 -482 1439 -1452 245 -252 223 -254 223 -252 253 -214 245 -234 247 -252 225 -252 251 -226 241 -222 253 -246 251 -226 251 -226 251 -252 213 -248 261 -222 253 -224 479 -484 501 -482 461 -492 483 -466 255 -234 245 -252 225 -252 253 -224 241 -222 487 -480 253 -222 489 -480 251 -248 463 -482 251 -246 231 -246 483 -488 229 -252 477 -478 485 -480 223 -248 479 -484 247 -250 251 -214 247 -234 247 -252 481 -460 493 -482 479 -492 249 -224 477 -480 477 -488 243 -240 245 -234 245 -252 223 -254 251 -226 469 -494 247 -224 253 -252 469 -488 483 -470 485 -482 247 -224 497 -462 483 -490 231 -248 233 -248 251 -226 251 -252 225 -242 475 -484 475 -484 239 -250 483 -468 255 -232 483 -490 231 -246 493 -480 481 -470 1445 -1448 239 -772 105 -194 247 -314 105 -176 125 -126 151 -382 51 -266 51 -104 55 -400 129 -114 243 -210 343 -78 161 -108 107 -110 53 -214 83 -242 209 -80 155 -82 53 -268 391 -80 79 -214 211 -132 131 -320 77 -320 157 -138 191 -136 103 -202 99 -446 213 -406 131 -286 101 -258 51 -188 55 -82 81 -162 237 -130 183 -512 291 -80 193 -342 77 -106 159 -272 77 -52 53 -78 183 -544 79 -106 277 -338 185 -132 153 -108 107 -108 163 -54 107 -134 235 -356 523 -108 137 -134 291 -80 79 -214 213 -266 137 -54 53 -162 165 -84 191 -78 53 -132 213 -318 79 -264 215 -320 159 -82 53 -246 131 -132 175 -102 227 -228 RAW_Data: 315 -106 53 -872 139 -136 209 -332 177 -272 417 -180 51 -52 181 -338 77 -130 51 -104 151 -52 127 -152 99 -76 155 -126 203 -180 151 -126 101 -200 179 -384 123 -592 153 -80 127 -466 75 -100 121 -98 123 -126 97 -336 359 -104 107 -192 55 -80 103 -190 81 -132 79 -78 207 -128 109 -216 183 -270 105 -80 129 -52 51 -354 85 -194 135 -238 243 -82 81 -370 295 -130 135 -136 137 -190 211 -188 81 -184 53 -80 159 -82 55 -350 319 -160 355 -210 99 -462 53 -130 277 -204 619 -184 471 -78 131 -378 453 -162 171 -86 165 -222 81 -82 315 -210 101 -78 383 -102 101 -180 207 -416 183 -310 259 -200 225 -146 333 -460 185 -78 211 -192 85 -84 353 -82 79 -80 213 -158 75 -156 131 -226 133 -54 107 -134 105 -106 131 -80 267 -132 187 -192 271 -110 105 -82 79 -270 135 -102 185 -134 185 -54 191 -134 249 -368 53 -238 79 -54 185 -526 51 -376 243 -586 109 -346 81 -82 179 -78 267 -206 177 -100 125 -104 173 -74 77 -152 155 -186 83 -190 351 -164 135 -106 109 -142 337 -214 81 -188 79 -78 103 -228 101 -226 175 -214 315 -52 79 -184 77 -240 291 -54 79 -80 51 -624 135 -134 203 -146 223 -74 135 -238 133 -134 129 -380 133 -190 79 -108 241 -186 181 -416 155 -134 157 -128 305 -134 425 -508 283 -128 181 -826 127 -268 77 -368 261 -54 189 -374 415 -156 201 -178 177 -206 127 -234 79 -380 133 -54 161 -236 53 -184 79 -298 53 -294 77 -312 177 -154 77 -208 369 -78 53 -160 215 -106 557 -320 473 -274 343 -78 99 -100 119 -72 155 -98 123 -76 257 -280 51 -260 157 -78 127 -52 99 -74 569 -302 131 -428 77 -336 101 -102 177 -230 97 -124 51 -102 75 -156 251 -126 173 -326 79 -428 123 -380 281 -238 161 -158 157 -230 395 -202 123 -220 255 -104 97 -198 77 -100 551 -76 101 -256 231 -410 77 -102 75 -230 105 -158 51 -132 105 -340 215 -108 241 -134 129 -160 191 -292 51 -852 155 -186 77 -52 103 -578 77 -106 209 -132 107 -130 53 -164 455 -78 155 -244 185 -160 217 -216 381 -130 127 -514 209 -82 55 -136 103 -104 173 -226 231 -176 73 -130 205 -102 319 -244 53 -160 107 -162 57 -350 97 -230 203 -252 127 -360 79 -316 103 -180 101 -178 185 -216 101 -302 257 -182 103 -126 75 -152 103 -102 77 -284 413 -612 177 -432 73 -460 79 -78 53 -556 155 -664 75 -214 327 -134 79 -134 133 -136 51 -82 103 -130 145 -74 199 -128 51 -102 103 -482 RAW_Data: 179 -100 177 -52 103 -158 191 -110 81 -190 217 -326 51 -280 147 -602 209 -76 99 -124 293 -108 193 -192 241 -184 131 -106 159 -52 77 -132 53 -104 101 -188 79 -538 105 -80 107 -52 213 -428 243 -84 81 -132 265 -140 77 -80 51 -214 189 -140 301 -162 75 -102 231 -178 123 -264 123 -98 125 -76 103 -238 77 -228 183 -140 165 -552 297 -54 291 -186 185 -234 155 -78 79 -180 53 -82 505 -182 103 -128 123 -280 133 -158 103 -644 213 -330 77 -106 79 -424 155 -212 163 -192 189 -508 369 -80 79 -220 111 -166 79 -304 133 -108 139 -140 189 -78 51 -348 289 -104 187 -54 109 -508 131 -108 283 -516 99 -100 299 -380 199 -152 325 -304 229 -476 75 -148 101 -102 75 -208 77 -74 125 -74 73 -76 181 -176 179 -186 235 -130 79 -184 77 -152 121 -304 127 -484 103 -152 173 -100 157 -176 185 -82 177 -156 309 -106 79 -132 51 -236 179 -154 73 -236 77 -74 71 -160 235 -130 105 -108 247 -56 53 -208 75 -74 75 -128 505 -154 179 -76 51 -278 103 -178 99 -126 183 -54 161 -526 133 -80 79 -298 105 -236 77 -264 139 -54 243 -164 459 -208 51 -236 105 -370 79 -374 77 -182 129 -202 77 -158 107 -108 107 -82 245 -244 109 -82 81 -292 179 -52 129 -164 423 -52 153 -102 151 -100 125 -76 259 -78 365 -240 107 -162 105 -244 163 -56 163 -108 159 -52 79 -260 79 -502 133 -82 323 -552 105 -210 699 -78 189 -192 105 -128 165 -188 105 -158 77 -158 79 -54 131 -498 131 -130 101 -176 125 -170 213 -52 77 -106 53 -292 389 -104 133 -402 133 -80 109 -54 53 -104 79 -182 505 -54 161 -264 181 -212 107 -164 83 -244 315 -234 127 -130 147 -150 231 -456 101 -124 73 -104 287 -320 81 -134 107 -244 267 -78 157 -108 137 -84 133 -54 79 -186 107 -262 77 -80 81 -240 53 -82 107 -136 245 -110 185 -294 259 -134 135 -80 159 -566 107 -190 187 -190 79 -54 107 -80 107 -54 135 -164 165 -56 79 -54 349 -78 75 -104 157 -320 53 -82 421 -180 97 -172 105 -106 111 -280 163 -132 193 -250 107 -318 155 -266 109 -162 183 -242 105 -484 79 -106 125 -246 99 -492 75 -180 127 -100 95 -196 75 -152 537 -214 53 -186 103 -134 81 -108 109 -560 51 -382 153 -104 51 -188 373 -240 53 -266 129 -622 51 -132 81 -58 137 -364 263 -78 235 -82 177 -486 105 -276 157 -108 237 -80 105 -132 131 -258 289 -102 51 -104 103 -104 73 -508 283 -102 51 -230 99 -178 105 -106 RAW_Data: 53 -190 105 -160 157 -158 129 -80 241 -162 277 -260 77 -312 157 -320 193 -108 77 -184 77 -102 125 -286 107 -82 371 -266 447 -218 271 -106 51 -162 107 -194 333 -264 99 -76 75 -150 345 -444 105 -696 75 -154 185 -348 105 -108 159 -296 161 -80 107 -222 81 -106 239 -80 75 -78 105 -52 323 -246 51 -162 79 -130 157 -618 241 -82 107 -106 133 -294 137 -108 53 -104 107 -80 51 -80 267 -106 77 -212 105 -84 81 -56 131 -132 211 -78 187 -138 131 -104 53 -78 311 -210 77 -80 109 -160 239 -208 51 -292 443 -158 167 -138 185 -232 293 -78 181 -136 53 -186 107 -108 53 -80 395 -130 299 -160 53 -162 109 -56 135 -468 75 -102 229 -396 105 -98 277 -386 339 -356 125 -226 291 -270 165 -80 79 -106 77 -244 189 -162 215 -672 343 -184 75 -450 131 -208 57 -114 107 -420 53 -106 81 -188 103 -136 501 -110 211 -76 161 -294 107 -54 55 -206 75 -100 75 -432 77 -248 51 -78 419 -52 535 -106 207 -230 99 -124 179 -100 71 -76 77 -400 53 -340 185 -188 235 -106 105 -220 55 -134 53 -346 53 -192 291 -346 209 -242 185 -158 51 -128 75 -176 153 -282 159 -158 73 -330 105 -634 323 -242 79 -210 181 -52 103 -54 107 -108 105 -330 105 -272 51 -206 227 -154 129 -194 285 -80 79 -266 127 -492 131 -432 181 -108 213 -242 107 -346 207 -78 157 -160 53 -108 53 -322 83 -674 317 -188 243 -186 81 -166 111 -84 535 -78 181 -134 327 -240 103 -206 77 -78 177 -152 121 -70 75 -100 535 -152 75 -78 101 -368 267 -168 217 -688 383 -222 247 -234 275 -224 251 -226 251 -224 241 -222 255 -246 251 -224 253 -224 251 -252 215 -246 261 -222 253 -224 253 -252 223 -242 245 -232 245 -252 225 -252 253 -224 253 -214 245 -236 247 -252 253 -224 251 -226 241 -246 231 -246 251 -224 251 -254 223 -242 221 -254 245 -252 225 -252 251 -226 251 -214 247 -236 247 -252 253 -224 251 -226 241 -246 229 -246 251 -226 251 -254 223 -252 213 -248 261 -224 251 -226 251 -252 225 -242 245 -230 245 -254 223 -252 253 -224 253 -214 245 -236 247 -252 251 -226 251 -224 243 -246 229 -248 251 -224 253 -252 223 -254 213 -248 261 -222 251 -226 251 -254 223 -242 245 -232 245 -252 223 -254 251 -224 243 -220 255 -244 251 -226 251 -226 251 -252 213 -248 261 -220 251 -226 251 -254 223 -242 245 -232 245 -252 223 -254 251 -224 243 -220 255 -246 249 -226 251 -226 251 -252 213 -248 235 -248 251 -226 251 -252 RAW_Data: 225 -242 245 -230 247 -252 223 -252 253 -224 243 -220 255 -244 251 -226 251 -226 251 -252 213 -248 233 -248 251 -226 251 -254 223 -242 245 -232 245 -252 223 -254 251 -224 253 -214 247 -234 249 -252 251 -226 251 -224 241 -246 231 -246 251 -226 251 -226 251 -252 213 -248 261 -224 251 -226 251 -252 225 -242 245 -230 245 -252 225 -252 253 -224 253 -212 247 -236 247 -252 253 -224 251 -226 241 -246 231 -246 251 -224 253 -252 225 -252 213 -248 261 -222 253 -224 253 -252 223 -242 247 -230 245 -252 225 -252 251 -226 241 -222 253 -246 251 -224 253 -224 251 -252 213 -248 233 -250 251 -224 253 -252 225 -242 245 -230 245 -252 225 -252 251 -226 241 -222 253 -246 251 -224 253 -224 253 -252 213 -248 233 -250 251 -224 253 -252 223 -242 245 -232 245 -252 223 -254 251 -224 253 -214 247 -236 247 -252 253 -224 251 -226 241 -246 231 -246 251 -224 253 -252 223 -252 213 -248 261 -224 251 -252 223 -254 223 -242 245 -232 245 -252 225 -252 251 -226 241 -222 253 -246 251 -224 253 -224 251 -254 213 -246 261 -224 251 -226 251 -252 225 -242 245 -230 245 -252 223 -254 251 -224 243 -220 255 -244 251 -226 251 -226 251 -252 213 -248 261 -222 251 -226 251 -254 223 -242 245 -232 243 -252 225 -252 253 -224 241 -222 253 -246 251 -226 251 -224 253 -252 213 -248 233 -248 251 -254 223 -252 225 -242 245 -232 245 -252 223 -254 251 -224 241 -222 255 -244 251 -226 251 -226 251 -254 213 -246 235 -248 251 -226 251 -254 223 -242 245 -230 245 -252 225 -252 251 -226 241 -222 253 -246 251 -224 253 -224 251 -254 213 -248 233 -248 251 -226 251 -254 223 -242 245 -232 245 -252 223 -254 251 -226 241 -220 255 -246 249 -226 253 -224 251 -254 213 -246 235 -248 251 -226 251 -252 225 -242 245 -230 245 -252 225 -252 253 -224 241 -220 255 -246 249 -226 251 -226 251 -252 213 -248 261 -222 253 -224 253 -252 223 -242 247 -230 245 -252 225 -252 251 -226 251 -214 247 -234 249 -252 251 -226 251 -224 241 -248 229 -248 249 -226 253 -252 223 -252 213 -248 263 -222 251 -226 251 -254 223 -242 245 -230 245 -254 223 -252 253 -224 241 -222 255 -244 251 -226 251 -226 251 -252 213 -248 233 -250 251 -226 251 -252 225 -252 213 -248 263 -222 251 -226 251 -254 223 -242 245 -232 245 -252 225 -252 251 -226 241 -222 253 -246 485 -488 457 -504 481 -462 493 -480 227 -246 251 -244 251 -226 251 -224 253 -224 493 -474 247 -252 475 -486 243 -222 485 -492 RAW_Data: 231 -234 247 -252 481 -462 493 -480 225 -248 251 -244 251 -224 479 -486 237 -246 251 -226 251 -224 253 -252 467 -474 481 -492 489 -458 245 -250 469 -494 481 -480 231 -238 247 -252 253 -224 253 -224 241 -246 465 -488 243 -240 245 -234 481 -488 487 -472 481 -492 229 -236 485 -474 485 -478 249 -250 251 -226 241 -246 231 -246 251 -224 479 -486 237 -248 485 -470 253 -232 245 -252 223 -254 473 -486 243 -224 251 -254 1439 -1448 249 -224 251 -226 251 -224 241 -246 233 -248 251 -226 251 -254 223 -242 245 -230 245 -252 225 -252 251 -226 241 -222 253 -246 249 -226 253 -224 497 -462 483 -490 485 -472 479 -480 259 -244 223 -254 251 -224 253 -224 241 -246 467 -488 243 -240 477 -484 247 -250 469 -494 247 -224 253 -224 499 -462 481 -488 233 -248 233 -248 251 -224 477 -486 239 -248 253 -224 253 -252 223 -254 467 -476 479 -490 491 -458 271 -224 469 -496 479 -480 233 -238 249 -254 251 -224 253 -224 241 -222 489 -482 269 -212 247 -234 483 -500 483 -480 481 -460 261 -244 485 -460 485 -478 247 -246 223 -248 261 -222 249 -222 247 -252 479 -488 243 -238 479 -482 225 -248 249 -242 251 -226 479 -486 237 -246 251 -226 1443 -1446 243 -252 225 -252 225 -252 253 -212 247 -234 247 -252 253 -224 251 -226 241 -246 231 -246 251 -226 251 -224 253 -252 213 -248 261 -222 251 -226 477 -484 503 -462 489 -490 479 -482 229 -238 247 -252 223 -254 251 -224 243 -220 489 -480 251 -246 467 -480 251 -248 465 -488 243 -240 247 -232 481 -488 487 -472 249 -252 223 -254 223 -242 475 -486 245 -252 223 -242 247 -234 247 -252 481 -460 493 -482 481 -490 249 -224 477 -482 475 -480 243 -240 247 -234 247 -252 251 -226 251 -224 469 -496 247 -254 223 -252 469 -490 483 -462 483 -478 247 -252 473 -486 479 -478 231 -246 261 -224 251 -254 223 -252 225 -242 475 -482 249 -222 505 -486 245 -224 241 -222 255 -246 483 -468 255 -232 245 -252 1445 -1446 243 -460 421 -100 233 -78 103 -126 73 -364 133 -274 163 -238 509 -132 51 -238 211 -812 77 -208 245 -276 261 -184 309 -1392 587 -182 209 -182 101 -122 121 -128 99 -300 175 -154 283 -210 51 -136 163 -506 655 -132 77 -76 157 -242 265 -214 243 -242 163 -574 605 -336 101 -102 331 -78 741 -52 255 -128 51 -178 127 -200 129 -462 179 -132 165 -108 53 -78 159 -728 157 -134 109 -162 129 -108 239 -344 199 -328 99 -102 209 -384 101 -154 229 -78 157 -52 103 -976 259 -102 123 -76 123 -102 RAW_Data: 73 -200 79 -52 131 -212 55 -402 285 -212 315 -56 573 -110 81 -54 161 -214 53 -390 351 -106 53 -316 129 -230 131 -162 163 -136 55 -140 263 -54 137 -192 313 -184 211 -322 53 -108 139 -56 719 -104 323 -236 263 -138 355 -162 135 -266 155 -156 103 -76 251 -284 335 -102 123 -252 185 -190 237 -394 75 -78 79 -132 81 -328 109 -82 179 -530 163 -160 85 -56 375 -52 351 -416 79 -160 107 -492 53 -108 109 -280 53 -52 235 -216 303 -84 131 -160 79 -80 243 -54 215 -82 165 -82 77 -182 207 -330 107 -264 451 -402 131 -134 53 -464 103 -354 51 -188 163 -154 133 -266 105 -52 209 -430 51 -108 107 -186 131 -426 51 -108 55 -82 179 -164 135 -104 399 -52 105 -214 105 -312 135 -188 51 -242 107 -134 79 -314 77 -54 133 -54 105 -164 135 -318 81 -232 151 -180 127 -102 99 -102 453 -130 299 -126 99 -798 235 -206 149 -100 79 -108 955 -80 79 -210 107 -132 131 -196 291 -134 159 -80 377 -312 159 -242 107 -52 53 -156 51 -132 79 -54 133 -274 157 -54 105 -134 387 -104 129 -234 77 -254 361 -52 77 -104 101 -52 53 -54 561 -80 163 -54 109 -216 51 -498 535 -82 163 -210 51 -182 259 -102 75 -76 305 -102 253 -172 215 -268 77 -52 81 -186 133 -106 333 -162 111 -220 569 -102 215 -54 131 -196 433 -80 51 -158 129 -108 53 -188 261 -52 101 -100 227 -402 201 -182 77 -78 175 -126 75 -306 231 -100 149 -178 489 -228 221 -154 77 -220 81 -52 51 -308 233 -104 77 -156 73 -286 181 -132 133 -144 165 -160 109 -54 105 -236 153 -76 211 -372 133 -140 105 -104 77 -320 653 -54 159 -54 181 -162 133 -406 213 -80 79 -132 211 -154 233 -138 189 -84 165 -200 217 -298 107 -272 161 -110 135 -172 103 -102 291 -56 109 -56 317 -52 105 -54 587 -1018 53 -132 109 -56 187 -80 109 -160 81 -80 107 -188 53 -56 237 -158 79 -154 127 -76 51 -204 103 -106 83 -54 313 -52 187 -186 183 -82 189 -474 133 -82 189 -110 155 -136 55 -192 133 -80 183 -106 233 -52 79 -188 187 -158 77 -106 133 -242 111 -106 81 -108 53 -130 245 -290 131 -54 163 -356 287 -156 51 -80 155 -86 687 -104 53 -290 341 -108 217 -160 51 -188 215 -52 133 -210 161 -186 185 -244 51 -210 51 -184 187 -84 133 -108 101 -126 123 -52 77 -150 255 -132 79 -820 183 -108 263 -340 79 -110 137 -82 243 -80 81 -162 51 -132 131 -136 83 -78 181 -126 299 -80 571 -134 105 -80 RAW_Data: 187 -216 109 -112 359 -316 79 -108 189 -82 133 -266 319 -544 311 -314 51 -162 165 -136 107 -162 193 -194 427 -104 269 -136 107 -80 343 -106 207 -266 53 -80 75 -178 99 -74 169 -506 51 -150 149 -620 207 -266 325 -106 183 -184 161 -106 141 -86 137 -134 239 -214 289 -104 51 -52 77 -106 129 -344 51 -372 75 -302 361 -214 393 -290 103 -106 135 -82 81 -82 185 -136 55 -194 81 -164 81 -78 101 -168 83 -186 81 -222 105 -52 105 -186 79 -418 129 -324 125 -128 75 -256 407 -414 131 -108 107 -80 135 -54 693 -52 369 -80 159 -162 53 -370 79 -162 55 -164 463 -236 77 -230 99 -178 153 -230 129 -80 161 -82 241 -322 79 -216 105 -216 81 -244 105 -326 289 -210 105 -82 299 -52 473 -496 159 -52 79 -108 249 -80 179 -132 107 -84 303 -370 239 -162 239 -126 149 -430 75 -52 123 -304 637 -238 109 -160 379 -190 647 -370 157 -294 235 -292 133 -108 135 -900 183 -56 241 -414 77 -210 161 -190 53 -184 185 -54 103 -394 131 -196 135 -546 151 -76 73 -100 201 -102 125 -316 259 -208 351 -160 81 -456 107 -232 129 -126 75 -228 101 -78 75 -230 431 -102 101 -172 201 -132 107 -108 303 -166 55 -458 203 -76 51 -232 131 -168 85 -198 137 -80 79 -84 81 -80 131 -194 585 -292 155 -722 221 -588 371 -132 101 -246 107 -270 81 -136 81 -262 289 -108 217 -218 77 -104 219 -342 259 -106 187 -78 133 -594 51 -132 267 -80 107 -54 53 -134 131 -192 243 -52 77 -102 155 -78 79 -104 79 -286 353 -192 53 -84 133 -184 75 -198 127 -132 123 -464 407 -130 103 -102 335 -202 103 -104 129 -176 289 -188 357 -754 255 -386 53 -138 255 -140 135 -426 53 -134 237 -52 187 -196 401 -54 157 -344 159 -192 55 -82 219 -202 215 -164 55 -166 81 -350 105 -158 101 -52 51 -284 129 -366 103 -392 53 -52 367 -312 133 -248 111 -272 211 -242 51 -158 165 -136 163 -54 133 -132 125 -374 229 -230 173 -304 103 -480 75 -78 175 -128 77 -362 127 -246 275 -76 313 -156 105 -158 247 -436 235 -132 71 -222 177 -236 345 -78 343 -78 341 -190 297 -188 77 -78 101 -76 99 -152 333 -154 101 -74 147 -122 75 -152 175 -452 453 -182 261 -284 149 -156 103 -170 109 -236 155 -110 295 -206 77 -132 81 -110 141 -1406 365 -214 79 -110 105 -484 87 -198 53 -106 185 -140 111 -322 77 -444 131 -78 239 -80 103 -182 131 -184 51 -106 107 -270 239 -134 213 -132 53 -316 513 -236 77 -80 RAW_Data: 163 -664 131 -188 269 -110 135 -200 73 -126 95 -380 53 -128 195 -98 271 -158 147 -224 103 -132 125 -360 231 -336 229 -374 643 -180 247 -104 75 -434 79 -322 107 -138 107 -322 51 -776 157 -78 105 -184 51 -264 433 -82 53 -344 79 -82 161 -110 253 -106 77 -52 101 -78 127 -804 157 -148 73 -74 75 -256 301 -126 99 -76 235 -52 155 -460 77 -130 73 -222 283 -134 53 -110 55 -162 53 -106 263 -78 105 -214 133 -192 107 -208 133 -164 243 -346 105 -276 73 -52 77 -226 131 -408 189 -138 217 -508 77 -214 53 -78 235 -52 213 -372 219 -108 53 -210 207 -52 207 -184 99 -200 103 -54 129 -76 101 -104 101 -74 73 -406 181 -174 509 -300 143 -378 177 -254 101 -216 243 -616 239 -154 99 -312 335 -52 75 -180 127 -202 75 -108 189 -214 101 -384 267 -528 153 -260 367 -214 161 -108 183 -136 107 -130 77 -296 211 -132 189 -134 133 -54 107 -326 51 -266 103 -76 263 -242 313 -284 129 -132 185 -54 275 -138 239 -136 165 -316 129 -212 319 -214 55 -110 237 -312 77 -54 79 -210 227 -76 101 -102 125 -76 251 -104 187 -192 105 -162 79 -404 557 -486 159 -272 157 -84 141 -650 187 -130 205 -596 257 -102 135 -160 101 -270 355 -162 109 -196 187 -104 75 -52 159 -52 107 -266 129 -128 565 -52 133 -54 241 -160 187 -598 51 -184 797 -164 81 -132 161 -160 179 -54 111 -108 159 -164 53 -82 107 -158 161 -162 153 -458 329 -312 79 -218 77 -238 241 -270 307 -110 135 -314 131 -106 53 -354 157 -186 291 -260 563 -80 133 -80 77 -234 219 -84 215 -292 81 -82 135 -54 79 -270 55 -186 77 -78 215 -192 211 -220 109 -158 71 -104 51 -186 263 -230 99 -152 227 -52 75 -102 127 -104 157 -318 107 -112 111 -116 159 -82 105 -218 239 -160 305 -188 99 -52 279 -102 149 -148 259 -180 51 -52 131 -466 135 -460 183 -580 77 -130 51 -106 77 -80 135 -304 107 -160 709 -372 79 -164 53 -158 53 -184 233 -180 107 -466 187 -78 79 -134 291 -78 51 -52 101 -78 75 -78 77 -416 283 -278 131 -106 137 -108 311 -236 247 -252 251 -226 251 -224 243 -220 255 -244 251 -226 251 -226 251 -252 215 -246 235 -248 251 -224 253 -252 223 -244 245 -230 245 -252 225 -252 251 -226 241 -220 255 -246 249 -226 251 -226 251 -252 213 -248 261 -222 251 -254 223 -252 225 -242 245 -230 247 -252 223 -252 253 -224 243 -220 255 -244 251 -226 251 -226 251 -252 213 -248 235 -248 251 -226 251 -252 RAW_Data: 225 -242 245 -230 245 -252 223 -254 251 -224 243 -220 255 -244 251 -226 251 -226 251 -254 213 -246 235 -248 251 -226 251 -252 225 -242 245 -230 245 -254 223 -252 253 -224 253 -212 247 -236 247 -252 253 -224 251 -226 241 -246 231 -246 251 -224 253 -252 223 -254 213 -246 263 -222 251 -254 223 -254 223 -242 245 -232 245 -252 225 -252 251 -226 241 -222 253 -246 251 -224 253 -224 253 -252 213 -246 235 -248 251 -226 251 -254 223 -242 245 -232 245 -252 223 -254 251 -224 253 -214 247 -236 247 -252 251 -226 251 -224 243 -246 229 -246 251 -226 251 -226 251 -252 213 -248 261 -222 253 -224 253 -252 223 -242 245 -232 245 -252 225 -252 251 -224 241 -222 253 -246 251 -226 251 -224 251 -254 213 -248 233 -250 251 -226 251 -254 223 -242 245 -232 245 -252 223 -254 251 -224 243 -220 255 -244 251 -226 251 -226 251 -252 213 -248 259 -222 253 -224 253 -252 223 -242 247 -230 245 -252 225 -252 251 -226 241 -220 255 -244 251 -226 251 -226 251 -252 215 -246 235 -248 253 -224 253 -252 223 -254 213 -248 261 -224 251 -224 253 -252 225 -242 245 -230 245 -252 225 -252 253 -224 241 -222 253 -246 251 -226 251 -224 251 -254 213 -248 233 -250 251 -226 251 -254 223 -242 245 -230 245 -252 223 -254 251 -226 241 -220 255 -246 251 -224 253 -224 251 -254 213 -248 233 -248 251 -226 251 -254 223 -242 245 -232 245 -252 223 -254 251 -224 243 -220 255 -244 251 -226 251 -226 251 -254 213 -246 235 -248 251 -226 251 -254 223 -252 215 -248 261 -222 253 -224 253 -252 223 -242 247 -230 245 -252 225 -252 253 -224 241 -222 253 -246 251 -226 251 -224 253 -252 213 -248 259 -222 251 -226 251 -254 223 -242 245 -232 245 -252 225 -252 251 -226 251 -214 247 -234 249 -252 251 -226 251 -224 241 -248 229 -248 249 -226 253 -252 223 -254 213 -246 261 -224 251 -254 223 -252 225 -242 245 -230 247 -252 223 -252 253 -224 241 -222 253 -246 251 -226 251 -224 253 -252 213 -248 259 -224 251 -226 251 -252 225 -242 245 -230 245 -252 225 -252 253 -224 251 -214 247 -236 247 -254 251 -224 253 -224 241 -246 231 -246 251 -226 251 -252 225 -252 213 -248 261 -222 251 -226 251 -254 223 -242 245 -230 247 -252 223 -254 251 -224 243 -220 255 -244 251 -226 251 -226 251 -254 213 -248 233 -248 251 -226 251 -252 225 -242 245 -230 245 -254 223 -252 253 -224 241 -222 255 -244 251 -226 251 -226 251 -252 213 -248 233 -248 251 -254 223 -254 223 -242 245 -232 RAW_Data: 245 -252 223 -254 251 -226 241 -220 255 -244 251 -226 251 -226 251 -252 213 -248 261 -222 251 -254 223 -252 225 -242 245 -230 245 -254 223 -252 253 -224 241 -222 253 -246 251 -224 253 -224 251 -254 213 -248 233 -250 251 -224 253 -252 225 -242 243 -232 245 -252 225 -252 253 -224 241 -222 253 -246 251 -226 251 -224 253 -252 213 -248 233 -248 251 -226 477 -486 501 -456 487 -494 483 -466 255 -232 247 -252 223 -254 251 -226 251 -214 503 -458 243 -252 469 -496 247 -224 477 -486 239 -250 251 -226 477 -486 473 -480 253 -246 467 -488 241 -242 475 -484 247 -224 247 -264 221 -252 251 -226 471 -488 479 -476 485 -502 221 -252 473 -486 479 -490 231 -248 229 -248 249 -226 251 -254 223 -242 477 -482 247 -252 223 -242 475 -482 479 -486 481 -480 253 -232 481 -488 487 -472 247 -252 223 -254 223 -242 245 -232 247 -252 483 -460 493 -488 467 -488 479 -490 231 -248 231 -248 483 -466 487 -484 247 -250 1433 -1456 225 -246 251 -240 251 -224 253 -224 251 -226 241 -246 231 -248 251 -226 251 -254 223 -242 245 -230 245 -252 223 -254 251 -224 253 -214 247 -234 483 -498 483 -482 477 -486 471 -488 243 -250 213 -248 235 -248 251 -254 223 -254 467 -490 249 -224 477 -482 237 -248 485 -468 255 -232 245 -252 481 -462 493 -482 225 -248 483 -480 225 -248 485 -480 251 -222 255 -244 251 -226 251 -252 469 -464 483 -498 483 -482 247 -224 471 -488 481 -480 253 -234 245 -252 223 -252 253 -224 251 -214 505 -460 245 -252 251 -214 503 -458 505 -462 483 -498 229 -250 477 -480 485 -482 247 -224 251 -252 213 -248 233 -250 251 -226 477 -486 475 -488 489 -492 483 -462 231 -248 261 -224 483 -492 463 -484 249 -248 1445 -1430 255 -234 245 -252 223 -254 251 -224 253 -214 245 -236 247 -252 251 -226 251 -226 241 -246 231 -246 251 -224 253 -252 223 -254 213 -248 235 -248 485 -492 459 -484 479 -486 483 -500 227 -250 241 -252 223 -254 223 -252 225 -242 477 -484 247 -250 469 -494 247 -224 479 -488 237 -246 251 -226 479 -486 471 -480 251 -222 489 -480 253 -246 465 -480 243 -240 245 -236 247 -252 253 -224 473 -486 481 -478 485 -482 247 -224 503 -460 497 -484 243 -224 251 -254 225 -252 223 -242 247 -232 481 -474 255 -226 265 -222 485 -490 489 -456 505 -462 247 -252 477 -482 471 -482 243 -240 247 -232 247 -252 225 -252 251 -226 467 -496 481 -468 487 -482 497 -458 267 -224 251 -254 449 -484 503 -464 241 -240 1447 -1454 229 -804 209 -238 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/kinggates_stylo4k_raw.sub ================================================ Filetype: Flipper SubGhz RAW File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: RAW RAW_Data: 377 -386 1117 -410 1121 -352 1141 -384 1151 -378 1119 -350 1139 -386 1115 -1134 389 -1114 395 -1122 363 -1136 389 -358 1167 -356 1145 -1120 389 -1110 391 -356 1139 -1126 389 -1114 391 -1122 363 -1146 389 -1110 395 -1122 363 -1138 389 -1110 393 -1122 363 -1140 389 -1112 393 -1120 389 -1118 389 -1112 397 -1124 363 -1142 389 -1112 359 -1154 367 -1134 389 -1144 365 -1138 355 -394 1119 -380 1107 -1152 353 -398 1113 -384 1139 -1118 385 -376 1141 -386 1129 -350 1143 -388 1109 -1132 389 -1112 393 -390 1107 -1128 389 -1112 397 -388 1111 -1132 389 -358 1127 -1118 417 -1116 383 -1120 353 -1158 389 -1108 375 -384 1121 -408 1123 -350 1139 -386 1111 -1130 389 -1114 395 -1122 395 -1114 389 -1116 395 -1122 363 -1138 387 -9444 373 -374 379 -374 381 -346 403 -346 389 -376 389 -390 353 -376 359 -382 383 -360 419 -360 359 -386 359 -2264 777 -356 1127 -390 1143 -362 1131 -1138 365 -1122 359 -386 1153 -1106 377 -1152 385 -372 1113 -1140 385 -1118 381 -1114 383 -1150 383 -1120 355 -1122 389 -358 1165 -386 1113 -1128 389 -360 1125 -384 1131 -368 1157 -350 1139 -386 1115 -406 1099 -384 1141 -1122 383 -1110 373 -1130 385 -1128 393 -380 1131 -380 1129 -1112 383 -1132 391 -356 1143 -1124 383 -1130 367 -1136 385 -1136 387 -1112 371 -1120 389 -1118 383 -1130 371 -1130 383 -1110 383 -1120 413 -1118 383 -1144 347 -1144 389 -1110 393 -1122 363 -1140 389 -1112 359 -1154 363 -1146 389 -1110 393 -374 1115 -384 1115 -1144 385 -368 1141 -388 1111 -1110 421 -360 1125 -388 1109 -392 1137 -358 1125 -1144 365 -1138 389 -358 1123 -1118 401 -1138 389 -360 1121 -1120 417 -358 1109 -1154 355 -1120 375 -1138 385 -1130 391 -1136 355 -398 1115 -380 1141 -384 1121 -382 1119 -1104 413 -1118 355 -1156 387 -1112 377 -1122 389 -1118 387 -1112 397 -9422 417 -352 363 -416 355 -388 345 -382 377 -380 375 -380 375 -380 375 -380 385 -356 379 -366 385 -374 387 -2246 745 -380 1141 -386 1113 -370 1125 -1140 373 -1152 355 -394 1117 -1140 381 -1120 385 -374 1145 -1112 385 -1122 381 -1116 383 -1120 375 -1120 389 -1120 373 -380 1171 -358 1121 -1142 377 -356 1127 -384 1137 -378 1155 -390 1105 -366 1125 -386 1135 -386 1111 -1132 389 -1112 393 -1120 365 -1138 387 -360 1163 -356 1143 -1126 387 -1114 357 -386 1141 -1126 383 -1130 365 -1132 381 -1140 377 -1116 383 -1130 371 -1128 381 -1140 347 -1148 385 -1128 369 -1128 381 -1142 377 -1114 389 -1112 395 -1124 361 -1142 389 -1114 393 -1122 365 -1138 389 -1114 397 -1108 389 -392 1119 -350 1139 -1152 355 -396 1115 -382 1109 -1156 385 -374 1111 -384 1139 -368 1147 -388 1109 -1112 389 -1120 383 -388 1107 -1150 389 -1112 RAW_Data: 393 -390 1109 -1128 389 -360 1125 -1120 381 -1152 383 -1118 353 -1158 387 -1112 375 -386 1117 -408 1121 -350 1143 -388 1109 -1132 389 -1114 391 -1122 395 -1120 389 -1112 393 -1122 365 -1136 389 -9442 373 -376 389 -354 377 -366 387 -384 357 -378 361 -418 347 -394 385 -358 363 -382 361 -414 357 -392 333 -2290 751 -384 1113 -406 1121 -350 1137 -1136 353 -1160 385 -356 1135 -1120 361 -1146 385 -388 1137 -1108 361 -1150 387 -1112 395 -1136 349 -1154 353 -1142 371 -384 1145 -378 1117 -1138 381 -382 1087 -410 1121 -382 1143 -380 1121 -380 1115 -384 1107 -418 1115 -1106 385 -1148 365 -1118 359 -1146 387 -388 1135 -388 1113 -1126 383 -1130 367 -376 1113 -1142 383 -1114 375 -1154 355 -1160 385 -1110 371 -1152 357 -1118 385 -1146 365 -1122 361 -1146 387 -1114 395 -1134 355 -1160 351 -1146 369 -1154 355 -1120 387 -1114 397 -1136 357 -1118 407 -1144 351 -1134 359 -420 1111 -366 1131 -1142 379 -384 1089 -410 1119 -1142 379 -366 1141 -386 1109 -388 1131 -350 1141 -1118 391 -1114 375 -378 1153 -1116 385 -1136 383 -358 1139 -1120 359 -420 1099 -1142 383 -1118 383 -1138 347 -1144 385 -1144 369 -386 1113 -404 1089 -386 1141 -382 1099 -1136 381 -1128 375 -1130 383 -1140 359 -1146 387 -1114 395 -1138 357 -9430 383 -378 359 -418 347 -392 387 -360 363 -384 361 -414 357 -386 347 -384 375 -382 385 -358 383 -364 387 -2252 773 -354 1131 -384 1137 -386 1111 -1132 387 -1112 397 -388 1113 -1124 389 -1116 387 -388 1115 -1132 389 -1114 393 -1120 365 -1140 389 -1114 357 -1154 365 -378 1151 -358 1127 -1156 367 -376 1135 -358 1125 -388 1141 -368 1125 -386 1133 -388 1109 -370 1155 -1106 375 -1122 389 -1118 389 -1114 395 -386 1117 -410 1123 -1106 377 -1130 383 -388 1107 -1152 353 -1148 353 -1150 367 -1142 389 -1110 397 -1120 365 -1138 389 -1110 391 -1122 363 -1142 387 -1116 389 -1120 391 -1116 389 -1116 395 -1122 365 -1140 389 -1114 357 -1154 363 -1138 389 -1142 365 -1138 355 -396 1115 -382 1141 -1118 353 -400 1111 -384 1139 -1120 381 -386 1139 -366 1119 -392 1121 -388 1107 -1152 389 -1114 355 -388 1139 -1126 387 -1114 397 -376 1111 -1144 375 -380 1129 -1138 375 -1098 385 -1140 377 -1118 387 -1144 371 -386 1115 -404 1121 -348 1137 -386 1113 -1134 389 -1112 395 -1124 395 -1118 389 -1110 395 -1122 363 -1138 389 -9418 391 -360 407 -384 361 -388 355 -390 367 -376 373 -380 387 -356 377 -366 385 -388 355 -378 359 -384 377 -2266 777 -346 1149 -388 1107 -390 1129 -1104 415 -1118 353 -398 1113 -1138 383 -1122 381 -388 1141 -1118 389 -1112 357 -1154 365 -1138 389 -1114 357 -1154 363 -378 1155 -358 1123 -1156 381 -360 1107 -384 RAW_Data: 1153 -378 1119 -382 1143 -382 1121 -382 1117 -382 1113 -1120 389 -1120 387 -1112 399 -1120 393 -392 1119 -350 1141 -1154 357 -1116 389 -360 1163 -1120 365 -1138 387 -1114 389 -1122 389 -1116 387 -1114 397 -1104 379 -1156 353 -1148 367 -1118 377 -1122 423 -1110 373 -1122 389 -1118 383 -1130 373 -1128 383 -1140 345 -1146 383 -1130 399 -1130 353 -1142 377 -358 1127 -384 1143 -1118 385 -372 1111 -386 1137 -1120 381 -388 1141 -364 1127 -384 1133 -374 1111 -1148 383 -1114 373 -384 1115 -1136 387 -1144 371 -386 1115 -1132 387 -360 1123 -1150 345 -1148 383 -1128 371 -1132 381 -1140 379 -390 1123 -350 1139 -388 1113 -406 1089 -1142 373 -1120 389 -1118 423 -1110 371 -1120 379 -1122 407 -1104 417 -9440 389 -356 379 -366 385 -388 355 -378 359 -384 381 -394 387 -358 361 -386 359 -416 355 -388 345 -384 377 -2262 747 -384 1149 -380 1115 -382 1113 -1120 389 -1120 389 -360 1129 -1152 367 -1136 389 -358 1131 -1152 367 -1138 389 -1116 355 -1152 367 -1134 389 -1116 353 -388 1141 -368 1123 -1138 375 -386 1113 -408 1121 -350 1175 -372 1105 -386 1145 -352 1141 -366 1145 -1114 385 -1116 377 -1122 389 -1120 421 -354 1139 -388 1109 -1132 383 -1130 369 -374 1113 -1144 385 -1114 377 -1120 391 -1128 373 -1138 385 -1130 359 -1138 377 -1120 373 -1138 383 -1130 359 -1138 379 -1160 375 -1106 385 -1130 393 -1120 377 -1118 389 -1112 393 -1140 355 -1120 421 -1114 371 -1122 391 -390 1123 -350 1139 -1134 353 -402 1113 -384 1141 -1118 385 -376 1143 -352 1161 -352 1135 -386 1113 -1132 387 -1114 395 -388 1111 -1128 387 -1114 399 -374 1115 -1142 375 -380 1117 -1118 387 -1144 363 -1136 385 -1130 367 -1130 383 -388 1107 -392 1129 -380 1115 -384 1113 -1136 389 -1114 393 -1124 393 -1120 389 -1114 393 -1124 363 -1140 389 -9416 391 -360 405 -386 329 -416 357 -392 365 -374 377 -380 343 -412 341 -412 353 -390 375 -366 385 -386 355 -2264 743 -394 1123 -388 1111 -392 1133 -1110 395 -1120 363 -382 1133 -1142 381 -1118 383 -376 1111 -1146 383 -1122 383 -1146 347 -1150 381 -1116 353 -1158 343 -410 1133 -382 1111 -1152 355 -394 1119 -382 1109 -382 1153 -378 1131 -354 1137 -396 1119 -388 1111 -1150 351 -1152 351 -1150 365 -1136 387 -356 1131 -386 1143 -1122 387 -1112 357 -420 1107 -1128 387 -1114 359 -1152 363 -1148 387 -1114 395 -1122 361 -1140 387 -1110 395 -1120 361 -1140 387 -1114 393 -1154 355 -1120 387 -1146 365 -1118 361 -1146 387 -1112 395 -1120 363 -1140 385 -1144 367 -1120 359 -420 1099 -384 1139 -1118 383 -384 1109 -392 1129 -1138 379 -366 1147 -388 1109 -386 1099 -384 1139 -1132 349 -1158 375 -380 1131 -1104 411 -1122 351 -416 1111 -1148 RAW_Data: 353 -396 1121 -1142 347 -1150 381 -1116 355 -1156 375 -1144 387 -360 1119 -388 1107 -394 1131 -386 1101 -1152 363 -1138 387 -1112 391 -1152 357 -1116 375 -1136 383 -1122 383 -9448 357 -392 357 -398 363 -378 385 -358 383 -364 389 -386 357 -380 389 -386 347 -382 375 -384 375 -380 373 -2262 747 -376 1145 -390 1107 -386 1129 -1104 413 -1120 353 -396 1115 -1140 381 -1122 383 -376 1143 -1110 385 -1118 383 -1114 417 -1114 383 -1120 353 -1156 389 -356 1135 -386 1113 -1134 389 -358 1129 -390 1107 -392 1153 -358 1127 -388 1143 -362 1131 -356 1131 -1154 365 -1136 389 -1114 357 -1150 363 -386 1153 -358 1125 -1118 417 -1120 381 -350 1123 -1134 391 -1112 395 -1124 395 -1116 389 -1112 393 -1124 363 -1140 389 -1114 359 -1154 363 -1138 389 -1114 391 -1124 361 -1144 389 -1112 393 -1122 363 -1138 389 -1112 391 -1122 363 -1138 389 -1144 365 -1124 361 -382 1155 -350 1137 -1120 391 -386 1131 -350 1151 -1120 383 -378 1141 -352 1137 -394 1117 -390 1107 -1150 389 -1114 355 -388 1143 -1120 387 -1112 397 -388 1113 -1130 385 -344 1163 -1104 379 -1122 373 -1140 383 -1130 389 -1124 359 -386 1127 -386 1139 -368 1141 -390 1107 -1112 387 -1116 385 -1150 367 -1140 389 -1112 393 -1124 363 -1136 389 -9444 379 -340 417 -360 359 -386 359 -416 355 -386 347 -384 375 -382 375 -380 375 -378 375 -380 385 -356 379 -2278 745 -354 1151 -368 1141 -390 1105 -1114 387 -1116 385 -386 1141 -1120 389 -1114 389 -388 1113 -1130 389 -1112 393 -1124 363 -1138 389 -1112 389 -1122 363 -380 1159 -350 1137 -1122 391 -388 1097 -384 1139 -382 1125 -386 1145 -352 1141 -366 1145 -390 1107 -1110 387 -1150 353 -1150 367 -1138 387 -360 1125 -390 1109 -1152 389 -1112 357 -388 1141 -1122 389 -1110 391 -1122 395 -1112 389 -1110 397 -1120 363 -1144 389 -1114 391 -1122 365 -1138 389 -1116 389 -1142 355 -1120 389 -1112 397 -1122 363 -1140 389 -1110 393 -1130 349 -1140 405 -1134 389 -1112 357 -388 1141 -364 1129 -1142 367 -388 1111 -370 1131 -1140 383 -364 1149 -388 1109 -388 1137 -356 1127 -1118 383 -1120 413 -350 1121 -1132 407 -1140 355 -364 1149 -1112 371 -406 1129 -1104 409 -1098 383 -1116 417 -1118 381 -1118 385 -388 1111 -390 1129 -350 1137 -386 1113 -1138 389 -1114 395 -1122 393 -1120 389 -1112 393 -1124 363 -1138 389 -9444 379 -340 417 -360 359 -386 361 -414 357 -386 347 -384 375 -382 375 -380 375 -380 375 -378 373 -380 373 -2262 749 -386 1111 -408 1117 -348 1143 -1120 391 -1116 389 -358 1127 -1154 365 -1136 387 -360 1129 -1154 365 -1136 389 -1114 357 -1154 365 -1134 389 -1112 357 -390 1137 -406 1119 -1106 377 -386 1117 -406 1123 -350 1143 -384 RAW_Data: 1149 -378 1121 -350 1145 -380 1133 -1104 375 -1136 385 -1130 359 -1138 379 -400 1129 -354 1139 -1148 355 -1150 365 -378 1119 -1146 355 -1152 365 -1134 389 -1110 397 -1122 363 -1140 389 -1110 395 -1122 363 -1142 389 -1116 357 -1152 365 -1146 389 -1112 393 -1130 349 -1138 383 -1116 413 -1120 353 -1122 387 -1114 397 -1154 355 -1124 387 -360 1133 -384 1131 -1134 383 -376 1133 -352 1133 -1132 383 -376 1139 -378 1135 -380 1115 -382 1141 -1118 353 -1160 387 -356 1133 -1118 379 -1158 353 -392 1133 -1104 379 -398 1117 -1138 383 -1118 353 -1164 353 -1146 403 -1120 353 -398 1115 -382 1143 -384 1089 -412 1121 -1106 377 -1154 355 -1118 407 -1146 351 -1130 395 -1138 355 -1118 407 -9434 353 -396 363 -380 383 -360 383 -364 389 -386 357 -414 355 -386 345 -386 375 -382 375 -380 375 -378 375 -2256 769 -384 1119 -382 1117 -380 1113 -1122 389 -1118 389 -360 1131 -1140 377 -1118 421 -354 1139 -1140 355 -1118 405 -1104 387 -1128 391 -1122 363 -1138 387 -360 1157 -354 1143 -1128 387 -360 1121 -388 1141 -362 1129 -384 1139 -388 1111 -370 1127 -384 1135 -1122 363 -1140 389 -1116 393 -1122 395 -356 1129 -384 1141 -1120 383 -1134 387 -356 1133 -1130 349 -1140 383 -1116 413 -1118 381 -1110 377 -1146 389 -1114 391 -1124 365 -1138 391 -1112 357 -1150 365 -1144 387 -1112 395 -1122 361 -1140 387 -1112 393 -1104 379 -1158 353 -1144 403 -1118 353 -1158 353 -390 1133 -390 1107 -1130 389 -358 1125 -388 1111 -1154 389 -358 1129 -386 1131 -368 1129 -382 1139 -1118 353 -1164 387 -356 1135 -1120 393 -1118 389 -358 1131 -1154 365 -376 1135 -1108 395 -1136 347 -1126 387 -1144 403 -1120 353 -398 1115 -384 1141 -372 1103 -386 1145 -1108 387 -1120 383 -1116 403 -1140 389 -1116 353 -1146 361 -1144 389 -9420 393 -362 401 -338 377 -388 385 -374 361 -382 375 -382 375 -380 373 -380 373 -380 373 -380 389 -354 379 -2272 743 -388 1137 -360 1121 -386 1111 -1152 351 -1148 359 -384 1143 -1126 387 -1114 391 -384 1117 -1130 383 -1132 369 -1134 351 -1138 377 -1142 385 -1112 359 -420 1107 -406 1121 -1104 377 -384 1119 -406 1119 -352 1171 -382 1123 -378 1119 -384 1107 -384 1119 -1136 385 -1116 393 -1120 361 -1142 387 -388 1137 -386 1113 -1128 385 -1116 357 -420 1113 -1124 387 -1114 359 -1148 395 -1116 385 -1146 363 -1116 361 -1144 387 -1144 363 -1120 361 -1144 385 -1112 393 -1152 355 -1154 353 -1144 367 -1136 355 -1158 351 -1146 369 -1120 361 -1144 385 -1148 369 -1152 357 -392 1117 -380 1107 -1152 355 -398 1119 -382 1109 -1152 385 -374 1113 -386 1139 -366 1145 -388 1111 -1110 385 -1148 353 -386 1139 -1124 387 -1142 365 -386 1113 -1132 385 -360 1125 -1144 RAW_Data: 363 -1140 387 -1114 357 -1152 363 -1146 387 -358 1129 -386 1139 -366 1125 -384 1139 -1120 363 -1140 387 -1112 393 -1130 381 -1136 383 -1114 371 -1132 383 -116626 65 -934 133 -1954 131 -102 133 -136 97 -332 65 -430 299 -296 129 -100 265 -168 367 -100 65 -66 231 -336 9643 -7766 529 -68 467 -166 65 -134 99 -500 331 -132 65 -130 329 -98 497 -100 1195 -100 1959 -66 4163 -7346 97 -392 165 -194 97 -2978 433 -298 531 -298 65 -200 131 -132 261 -98 229 -68 12837 -340 99 -268 165 -134 65 -898 67 -100 265 -66 165 -100 597 -166 199 -298 199 -200 99 -132 233 -132 299 -132 233 -166 65 -66 4021 -168 133 -68 231 -168 4647 -130 1399 -7750 133 -1714 197 -2480 131 -200 65 -100 265 -890 63 -1152 197 -98 293 -134 65 -300 361 -100 1035 -100 231 -132 299 -100 3399 -66 6287 -4506 99 -100 65 -130 99 -196 461 -98 331 -164 97 -162 227 -64 197 -98 229 -130 195 -100 425 -526 165 -130 95 -522 457 -560 233 -98 261 -66 1155 -100 259 -130 1407 -98 553 -66 7793 -494 65 -232 65 -3652 229 -2716 361 -266 333 -200 133 -166 99 -132 267 -66 133 -132 199 -166 331 -132 331 -166 197 -950 229 -198 303 -298 365 -100 4839 -3816 165 -130 229 -696 131 -130 261 -262 97 -166 263 -894 165 -230 365 -566 129 -560 197 -324 99 -98 261 -134 131 -100 67 -334 67 -232 199 -132 165 -302 67 -100 1467 -98 459 -100 1081 -130 131 -66 8927 -232 165 -3104 99 -2812 65 -982 131 -98 195 -98 263 -264 231 -66 195 -132 193 -164 65 -100 365 -132 1629 -66 1009 -132 8383 -632 131 -3060 131 -492 425 -100 763 -166 371 -132 1197 -134 229 -694 461 -366 365 -98 329 -198 267 -168 399 -68 131 -332 493 -132 231 -132 569 -66 7765 -7568 99 -532 65 -634 133 -3540 65 -100 263 -592 261 -1484 299 -302 265 -234 1129 -304 99 -436 163 -360 97 -556 231 -166 265 -1164 165 -134 235 -100 163 -332 297 -100 197 -132 99 -566 133 -234 133 -328 295 -98 985 -98 163 -396 399 -134 1557 -134 297 -266 6875 -68 1759 -7194 133 -166 99 -266 65 -432 67 -432 393 -5086 99 -66 199 -68 263 -866 429 -100 359 -130 261 -132 267 -134 533 -134 9251 -4184 65 -1156 165 -198 65 -426 297 -492 67 -164 131 -198 259 -164 199 -100 733 -134 865 -100 397 -132 65 -100 197 -66 327 -164 227 -98 231 -132 97 -262 99 -130 229 -66 589 -96 1119 -98 1905 -7486 599 -66 561 -66 359 -98 757 -162 261 -66 323 -130 5573 -8538 99 -894 131 -594 229 -364 63 -1378 197 -1682 331 -100 199 -166 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/legrand.sub ================================================ Filetype: Flipper SubGhz Key File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: Legrand Bit: 18 Key: 00 00 00 00 00 02 E3 7F TE: 358 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/legrand_raw.sub ================================================ Filetype: Flipper SubGhz RAW File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: RAW RAW_Data: 10133 -4946 65 -5114 65 -1750 67 -232 165 -536 165 -166 533 -694 395 -198 263 -66 395 -12664 297 -662 133 -264 99 -102 131 -200 131 -234 263 -66 265 -100 661 -168 197 -134 297 -66 431 -132 45005 -12358 131 -100 129 -66 65 -198 65 -66 197 -1018 131 -266 97 -1052 97 -228 459 -100 1517 -100 4361 -10350 165 -1264 65 -232 131 -200 65 -166 133 -232 299 -132 65 -166 299 -134 231 -198 99 -68 429 -12270 231 -628 163 -594 97 -496 227 -1220 163 -166 129 -66 655 -98 163 -66 393 -66 195 -198 293 -12130 67 -68 331 -134 99 -98 99 -332 99 -562 163 -164 65 -130 131 -920 131 -98 65 -198 133 -98 427 -130 359 -132 627 -66 2207 -16066 163 -1316 331 -832 131 -370 131 -132 661 -166 265 -134 833 -168 34477 -10228 65 -2266 261 -230 131 -198 129 -1282 65 -66 463 -100 365 -232 233 -66 297 -166 2151 -12330 99 -400 97 -436 131 -896 165 -400 363 -298 199 -166 97 -430 165 -168 365 -132 725 -130 3253 -12440 131 -796 297 -332 65 -830 65 -828 429 -198 335 -66 665 -266 29175 -12140 163 -230 131 -992 165 -1230 397 -132 199 -132 299 -66 659 -100 9675 -11036 99 -570 99 -830 165 -662 331 -266 429 -132 391 -396 431 -132 233 -166 231 -100 3435 -11728 99 -332 165 -166 63 -128 161 -326 129 -690 231 -130 265 -98 167 -232 199 -66 201 -264 165 -166 365 -66 727 -100 363 -12688 229 -228 95 -98 391 -198 129 -196 97 -364 97 -100 65 -266 99 -64 293 -98 327 -262 761 -66 7681 -5384 99 -762 195 -134 525 -992 99 -166 67 -98 329 -100 659 -100 293 -100 97 -98 163 -264 1741 -100 57331 -9834 67 -664 67 -2158 99 -862 133 -368 331 -864 65 -330 65 -794 99 -66 431 -100 3017 -66 7061 -6558 99 -6316 99 -266 131 -166 97 -198 65 -294 99 -66 661 -132 2661 -130 19413 -12380 65 -262 133 -66 67 -232 133 -798 197 -264 165 -498 97 -166 199 -134 559 -98 165 -13118 99 -562 65 -1256 231 -232 99 -132 131 -66 199 -66 429 -296 131 -200 201 -266 65 -66 895 -132 829 -66 12455 -11974 199 -334 99 -2160 165 -1232 929 -100 327 -166 295 -134 2191 -100 20415 -11032 65 -1170 131 -2326 163 -398 263 -596 99 -400 165 -68 499 -66 661 -11724 97 -1226 99 -166 233 -400 131 -662 165 -400 165 -166 299 -296 1159 -100 131 -98 427 -68 1643 -13934 101 -1294 65 -394 63 -1458 265 -166 265 -364 133 -434 101 -398 195 -264 1097 -166 265 -166 58013 -11978 131 -100 165 -666 199 -66 163 -166 65 -198 195 -592 1295 -134 597 -136 567 -100 1615 -100 17759 -12402 261 -692 RAW_Data: 265 -730 327 -398 131 -300 199 -432 7947 -4772 233 -366 365 -166 133 -522 99 -164 65 -366 99 -100 395 -66 4423 -15068 197 -430 163 -398 65 -230 165 -228 97 -494 165 -134 197 -168 131 -168 65 -298 267 -132 1657 -98 99 -66 165 -100 7687 -12010 197 -132 163 -198 527 -130 293 -396 297 -360 163 -264 95 -164 161 -694 427 -262 129 -100 885 -100 131 -66 461 -9862 97 -5002 497 -594 197 -66 229 -596 65 -132 195 -262 99 -132 63 -166 65 -230 431 -100 165 -168 461 -164 13159 -12060 133 -64 129 -1316 131 -758 165 -430 165 -270 133 -564 995 -7536 99 -4746 165 -358 457 -132 165 -166 99 -100 397 -132 299 -66 197 -66 131 -392 129 -196 131 -328 459 -100 565 -66 165 -66 265 -100 1131 -100 9533 -12070 65 -400 163 -366 165 -530 197 -196 133 -68 233 -398 165 -66 99 -100 163 -132 791 -66 17359 -12434 131 -328 229 -558 195 -564 167 -132 133 -234 131 -100 65 -364 65 -496 65 -200 297 -66 1725 -12958 63 -68 65 -164 67 -132 63 -200 131 -166 165 -696 131 -166 67 -200 65 -168 1061 -12848 199 -166 2039 -1660 201 -5822 1017 -1126 299 -414 1015 -388 1061 -380 1055 -1086 327 -1118 339 -1084 351 -360 1051 -376 1083 -1070 343 -346 1105 -350 1069 -354 1087 -346 1063 -362 1075 -372 1067 -334 1097 -5694 1083 -1074 351 -378 1057 -332 1101 -370 1065 -1050 379 -1050 379 -1066 363 -348 1073 -388 1047 -1076 351 -380 1053 -362 1071 -372 1067 -352 1081 -352 1069 -350 1091 -346 1087 -5682 1095 -1044 381 -342 1097 -326 1111 -346 1061 -1064 379 -1066 381 -1032 379 -360 1065 -364 1067 -1066 375 -352 1081 -350 1069 -350 1089 -352 1081 -350 1069 -350 1097 -326 1081 -5698 1097 -1074 353 -354 1083 -326 1111 -344 1083 -1054 387 -1046 349 -1094 345 -350 1081 -354 1069 -1076 385 -350 1051 -354 1077 -386 1057 -334 1099 -370 1051 -354 1083 -356 1087 -5670 1107 -1072 353 -354 1081 -326 1111 -346 1085 -1054 389 -1050 353 -1056 377 -352 1083 -350 1071 -1080 381 -312 1099 -334 1107 -358 1079 -320 1091 -350 1095 -348 1081 -318 1113 -5688 1075 -1076 353 -354 1085 -324 1111 -346 1067 -1056 387 -1048 381 -1070 383 -314 1085 -352 1073 -1078 385 -348 1049 -354 1103 -356 1055 -334 1097 -372 1049 -354 1081 -354 1087 -5680 1109 -1038 383 -356 1085 -326 1107 -344 1065 -1066 361 -1076 371 -1054 389 -330 1069 -376 1069 -1054 389 -332 1073 -374 1069 -354 1079 -320 1097 -350 1093 -348 1083 -322 1111 -5680 1105 -1044 359 -356 1083 -354 1085 -348 1097 -1050 387 -1042 349 -1074 385 -350 1053 -352 1077 -1082 379 -314 1099 -336 1095 -346 1075 -374 1071 -354 1081 -320 1095 -348 1097 -5686 RAW_Data: 1085 -1062 369 -346 1093 -322 1105 -350 1063 -1076 351 -1070 381 -1068 355 -358 1087 -354 1049 -1070 351 -384 1081 -318 1113 -344 1065 -348 1083 -352 1071 -388 1051 -352 1081 -5706 1065 -1064 361 -348 1087 -356 1079 -348 1091 -1072 381 -1020 375 -1068 361 -356 1081 -354 1085 -1042 381 -352 1079 -352 1101 -320 1093 -346 1087 -322 1117 -354 1057 -334 1099 -5702 1085 -1044 381 -340 1087 -352 1081 -352 1069 -1080 379 -1032 379 -1050 377 -346 1099 -332 1077 -1084 355 -334 1101 -334 1089 -350 1097 -320 1095 -348 1097 -326 1077 -376 1053 -5706 1073 -1088 367 -346 1063 -354 1071 -382 1067 -1076 347 -1068 381 -1064 347 -360 1085 -354 1047 -1072 385 -352 1087 -328 1073 -374 1051 -388 1045 -354 1093 -348 1085 -354 1079 -5668 1085 -1082 349 -348 1079 -374 1051 -382 1063 -1076 355 -1082 349 -1068 353 -364 1065 -362 1075 -1064 373 -346 1067 -362 1073 -382 1063 -352 1067 -380 1065 -326 1081 -376 1065 -5714 1075 -1072 345 -346 1099 -332 1097 -346 1075 -1062 373 -1066 347 -1076 373 -344 1069 -362 1073 -1072 383 -314 1113 -344 1063 -350 1079 -374 1065 -332 1099 -370 1065 -336 1099 -5694 1087 -1046 351 -368 1097 -348 1051 -354 1109 -1046 383 -1060 365 -1072 365 -352 1049 -352 1091 -1074 347 -384 1051 -352 1073 -384 1051 -350 1079 -354 1073 -380 1067 -326 1081 -5722 1065 -1078 355 -352 1081 -356 1085 -344 1083 -1050 385 -1050 353 -1092 345 -384 1051 -352 1069 -1078 381 -350 1051 -354 1069 -386 1057 -364 1073 -368 1071 -352 1049 -354 1093 -5710 1077 -1072 353 -354 1085 -326 1079 -376 1069 -1052 381 -1064 349 -1074 381 -346 1073 -368 1067 -1056 359 -350 1107 -348 1063 -352 1069 -382 1065 -326 1111 -346 1063 -364 1071 -5686 1099 -1072 355 -352 1083 -326 1111 -346 1065 -1086 353 -1050 383 -1068 383 -350 1047 -354 1071 -1076 381 -346 1069 -370 1065 -336 1095 -334 1099 -336 1099 -330 1073 -354 1081 -5710 1077 -1050 385 -348 1085 -322 1109 -356 1055 -1084 355 -1054 377 -1052 375 -346 1103 -350 1065 -1074 351 -342 1093 -346 1091 -322 1107 -356 1055 -364 1071 -372 1053 -354 1085 -5704 1077 -1050 383 -346 1073 -370 1065 -334 1097 -1060 371 -1062 347 -1080 373 -344 1069 -360 1075 -1076 351 -346 1109 -344 1063 -364 1069 -370 1065 -334 1099 -332 1097 -336 1097 -5690 1087 -1044 383 -338 1095 -348 1083 -320 1109 -1048 385 -1056 365 -1072 365 -356 1081 -320 1095 -1078 343 -346 1103 -330 1075 -352 1095 -350 1069 -350 1085 -352 1081 -350 1071 -5712 1075 -1042 385 -354 1085 -326 1079 -374 1051 -1084 351 -1064 383 -1068 347 -346 1099 -334 1103 -1054 347 -354 1099 -346 1083 -354 1081 -354 1053 -362 1071 -374 1065 -346 1067 -5726 1053 -1082 351 -360 1091 -344 1083 -350 RAW_Data: 1081 -1074 353 -1074 351 -1088 325 -386 1051 -386 1047 -1074 353 -378 1051 -384 1047 -354 1073 -384 1049 -376 1065 -356 1073 -352 1087 -5680 1079 -1074 381 -350 1051 -354 1071 -386 1051 -1086 351 -1080 351 -1070 381 -350 1051 -352 1071 -1080 383 -348 1049 -354 1075 -384 1065 -324 1113 -346 1061 -350 1079 -374 1051 -5706 1077 -1086 333 -384 1047 -354 1093 -346 1065 -1078 353 -1094 345 -1082 351 -360 1089 -346 1063 -1074 353 -366 1065 -360 1075 -372 1067 -334 1101 -368 1051 -352 1085 -356 1051 -5734 1073 -1072 353 -354 1083 -328 1073 -376 1083 -1040 375 -1066 359 -1082 353 -334 1099 -368 1069 -1070 343 -346 1105 -354 1055 -362 1071 -370 1069 -352 1077 -352 1069 -350 1087 -5680 1079 -1086 367 -352 1049 -354 1097 -346 1063 -1078 349 -1092 345 -1098 347 -358 1065 -350 1079 -1064 373 -346 1067 -362 1081 -350 1065 -350 1095 -346 1067 -362 1075 -372 1049 -5706 1071 -1086 367 -352 1083 -320 1095 -348 1087 -1050 387 -1050 353 -1094 345 -346 1101 -332 1073 -1072 383 -346 1083 -346 1087 -352 1051 -354 1093 -346 1085 -346 1061 -354 1103 -5700 1069 -1050 393 -352 1063 -352 1069 -350 1097 -1044 383 -1068 379 -1030 379 -358 1065 -348 1073 -1068 377 -346 1099 -330 1073 -352 1093 -350 1073 -348 1087 -352 1081 -350 1069 -5710 1073 -1076 353 -354 1085 -324 1111 -344 1083 -1040 389 -1044 381 -1070 347 -350 1085 -352 1071 -1078 383 -352 1047 -352 1075 -352 1089 -350 1083 -352 1069 -350 1097 -326 1109 -5664 1113 -1040 383 -354 1085 -328 1075 -374 1051 -1084 351 -1066 351 -1096 379 -314 1099 -334 1097 -1052 379 -356 1069 -354 1079 -320 1097 -348 1093 -346 1083 -354 1077 -354 1055 -5714 1073 -1076 345 -350 1081 -354 1069 -382 1065 -1074 349 -1068 379 -1064 347 -360 1065 -364 1071 -1066 371 -344 1067 -360 1077 -354 1083 -354 1087 -346 1065 -364 1071 -368 1071 -5682 1075 -1084 367 -342 1067 -360 1075 -352 1097 -1040 353 -1074 385 -1058 363 -346 1075 -354 1081 -1076 351 -378 1057 -334 1101 -334 1103 -356 1079 -320 1091 -348 1093 -348 1085 -5678 1095 -1050 379 -356 1065 -334 1097 -370 1049 -1086 353 -1086 325 -1080 375 -352 1081 -350 1067 -1078 383 -350 1051 -352 1071 -386 1053 -334 1103 -336 1085 -354 1087 -324 1111 -5676 1079 -1078 351 -380 1055 -364 1073 -368 1051 -1082 349 -1064 351 -1092 347 -378 1073 -334 1099 -1050 381 -328 1095 -346 1083 -350 1081 -352 1069 -382 1049 -344 1095 -354 1077 -5682 1071 -1078 359 -352 1081 -356 1085 -346 1065 -1082 353 -1080 351 -1070 385 -348 1051 -354 1077 -1076 381 -314 1103 -334 1105 -354 1081 -318 1095 -348 1087 -354 1081 -320 1097 -5712 1077 -1074 319 -380 1067 -356 1087 -346 1065 -1080 349 -1092 345 -1082 351 -360 RAW_Data: 1053 -378 1083 -1050 381 -346 1053 -376 1067 -364 1069 -370 1047 -386 1047 -356 1093 -344 1083 -5690 1079 -1060 371 -344 1067 -362 1073 -348 1095 -1076 353 -1074 353 -1054 359 -352 1101 -348 1085 -1046 361 -388 1043 -350 1093 -346 1081 -352 1081 -352 1067 -384 1055 -346 1085 -5678 1083 -1084 347 -344 1093 -348 1097 -326 1075 -1070 375 -1062 347 -1080 373 -344 1067 -362 1073 -1074 381 -314 1115 -344 1085 -356 1047 -354 1091 -348 1085 -354 1081 -320 1095 -5708 1075 -1074 353 -354 1083 -326 1109 -346 1065 -1054 387 -1050 351 -1096 381 -316 1083 -352 1073 -1080 381 -312 1101 -336 1105 -350 1063 -352 1067 -384 1065 -324 1111 -346 1065 -5704 1073 -1080 347 -350 1083 -352 1073 -350 1085 -1064 375 -1064 357 -1072 383 -314 1111 -344 1087 -1042 387 -330 1071 -374 1069 -352 1081 -350 1067 -350 1097 -348 1083 -322 1113 -5682 1075 -1076 353 -354 1083 -326 1117 -342 1085 -1054 351 -1062 383 -1070 377 -314 1103 -332 1105 -1042 381 -346 1083 -346 1065 -360 1071 -374 1069 -352 1079 -352 1067 -348 1089 -5682 1077 -1088 367 -354 1047 -354 1095 -346 1083 -1068 345 -1096 351 -1074 351 -346 1077 -372 1065 -1066 349 -386 1069 -346 1085 -356 1077 -354 1057 -364 1071 -370 1071 -352 1079 -5676 1073 -1074 381 -314 1117 -344 1063 -352 1081 -1076 357 -1080 355 -1052 359 -352 1095 -334 1097 -1064 371 -352 1083 -320 1095 -348 1085 -352 1081 -350 1069 -350 1093 -348 1085 -5676 1095 -1052 379 -356 1065 -346 1087 -356 1075 -1048 387 -1058 363 -1074 367 -356 1049 -354 1091 -1072 347 -346 1101 -332 1073 -384 1063 -350 1067 -350 1101 -326 1079 -376 1065 -5680 1107 -1074 343 -346 1067 -362 1083 -352 1085 -1078 349 -1070 345 -1066 379 -360 1065 -348 1079 -1062 375 -344 1069 -362 1075 -352 1081 -356 1085 -344 1063 -384 1047 -354 1073 -5708 1073 -1074 357 -354 1083 -356 1087 -344 1087 -1052 351 -1064 379 -1068 379 -314 1103 -334 1099 -1052 347 -386 1061 -348 1073 -374 1067 -352 1083 -350 1067 -350 1095 -348 1081 -5682 1085 -1054 383 -344 1087 -346 1067 -362 1069 -1064 373 -1062 347 -1078 373 -352 1081 -350 1065 -1078 383 -350 1051 -352 1071 -386 1051 -352 1081 -352 1069 -350 1095 -346 1087 -5678 1089 -1052 387 -330 1073 -374 1083 -354 1045 -1072 353 -1074 385 -1056 361 -350 1081 -352 1083 -1080 349 -376 1059 -346 1087 -356 1075 -354 1055 -362 1075 -370 1067 -352 1081 -5676 1075 -1076 387 -330 1071 -374 1065 -352 1079 -1072 355 -1082 353 -1054 361 -350 1095 -348 1073 -1068 373 -352 1081 -322 1097 -348 1085 -354 1079 -352 1069 -348 1093 -348 1083 -5676 1097 -1056 361 -348 1071 -354 1081 -354 1089 -1074 345 -1062 383 -1050 353 -380 1057 -364 1071 -1066 371 -354 1081 -318 RAW_Data: 1099 -348 1085 -352 1079 -352 1071 -348 1087 -346 1095 -5678 1095 -1050 383 -328 1091 -348 1061 -386 1047 -1078 357 -1084 351 -1066 351 -366 1087 -348 1061 -1076 357 -354 1081 -354 1089 -346 1065 -352 1079 -354 1069 -386 1055 -334 1099 -5694 1085 -1044 383 -340 1087 -352 1081 -350 1065 -1080 383 -1052 351 -1082 349 -376 1059 -348 1083 -1046 395 -356 1049 -352 1091 -348 1085 -354 1083 -320 1093 -348 1087 -354 1081 -5670 1107 -1070 343 -348 1067 -384 1067 -354 1083 -1068 345 -1064 349 -1080 373 -350 1081 -352 1067 -1076 383 -348 1049 -354 1071 -386 1053 -364 1071 -368 1069 -352 1079 -350 1069 -5708 1075 -1074 351 -354 1083 -326 1111 -344 1067 -1052 385 -1050 381 -1070 347 -346 1101 -332 1073 -1072 383 -344 1085 -346 1067 -362 1069 -370 1053 -352 1085 -356 1085 -346 1067 -5682 1111 -1060 369 -344 1071 -360 1081 -354 1053 -1080 353 -1092 345 -1084 351 -360 1053 -376 1067 -1086 351 -330 1081 -376 1051 -382 1067 -352 1067 -380 1067 -326 1081 -374 1051 -5696 1109 -1058 369 -354 1079 -320 1097 -350 1085 -1054 387 -1048 353 -1060 377 -352 1085 -350 1069 -1078 383 -350 1049 -352 1071 -384 1065 -326 1081 -376 1067 -334 1101 -334 1101 -5692 1063 -1064 375 -346 1067 -362 1073 -380 1065 -1074 355 -1072 349 -1066 349 -366 1085 -350 1081 -1076 355 -350 1085 -326 1077 -376 1083 -352 1049 -354 1095 -346 1065 -380 1051 -5712 1083 -1052 389 -330 1073 -374 1053 -354 1083 -1074 351 -1074 385 -1052 343 -346 1107 -352 1065 -1072 351 -376 1065 -356 1081 -346 1065 -362 1069 -372 1067 -336 1097 -332 1099 -5678 1101 -1068 343 -350 1081 -352 1069 -384 1055 -1082 349 -1056 377 -1082 353 -330 1081 -374 1067 -1082 351 -330 1081 -376 1081 -352 1047 -354 1097 -348 1081 -352 1081 -352 1069 -5712 1077 -1038 383 -354 1083 -326 1079 -374 1055 -1074 383 -1064 347 -1066 381 -316 1099 -370 1051 -1082 353 -336 1097 -368 1053 -352 1081 -354 1089 -346 1063 -350 1081 -352 1071 -5714 1075 -1074 355 -350 1083 -358 1053 -376 1065 -1084 347 -1064 353 -1070 385 -346 1085 -352 1077 -1042 387 -346 1053 -354 1077 -386 1055 -364 1069 -370 1051 -388 1051 -354 1087 -5672 1081 -1074 351 -378 1065 -356 1083 -346 1065 -1078 347 -1092 345 -1066 359 -350 1107 -356 1045 -1068 383 -354 1083 -328 1075 -372 1053 -388 1051 -356 1087 -346 1065 -362 1071 -5702 1083 -1076 349 -376 1055 -346 1083 -356 1073 -1078 353 -1054 361 -1078 369 -352 1083 -352 1065 -1072 347 -346 1103 -332 1101 -346 1081 -354 1045 -386 1051 -362 1073 -370 1049 -5718 1075 -1048 365 -388 1047 -354 1091 -346 1085 -1040 387 -1050 351 -1096 349 -348 1083 -352 1073 -1076 379 -316 1101 -334 1097 -336 1099 -330 1071 -388 1047 -354 RAW_Data: 1087 -348 1085 -5684 1075 -1084 367 -344 1067 -358 1073 -350 1063 -1074 353 -1108 349 -1068 353 -362 1067 -344 1097 -1050 363 -386 1047 -356 1087 -346 1085 -352 1079 -320 1097 -346 1083 -352 1081 -5676 1103 -1054 387 -330 1071 -372 1053 -354 1085 -1074 351 -1070 385 -1058 347 -362 1069 -350 1087 -1054 381 -346 1085 -346 1065 -364 1069 -370 1071 -354 1081 -320 1097 -348 1083 -5676 1079 -1090 367 -344 1067 -360 1073 -350 1095 -1074 351 -1076 349 -1068 353 -364 1081 -352 1081 -1074 321 -382 1051 -360 1075 -374 1051 -386 1049 -354 1091 -346 1085 -346 1067 -5706 1065 -1084 351 -360 1087 -346 1085 -356 1047 -1074 353 -1072 383 -1064 347 -362 1067 -364 1069 -1068 371 -352 1083 -320 1095 -350 1097 -346 1083 -322 1077 -388 1051 -350 1081 -5706 1051 -1084 387 -328 1073 -372 1049 -386 1049 -1076 353 -1072 383 -1056 363 -348 1071 -354 1085 -1076 351 -376 1057 -344 1087 -356 1073 -352 1081 -350 1053 -376 1051 -384 1049 -5710 1083 -1076 351 -348 1073 -372 1063 -334 1099 -1062 371 -1052 389 -1050 353 -364 1087 -354 1049 -1072 353 -382 1055 -362 1075 -370 1051 -352 1095 -350 1067 -348 1099 -326 1077 -5702 1077 -1076 353 -378 1053 -362 1071 -370 1051 -1084 349 -1066 353 -1096 345 -382 1049 -354 1069 -1080 379 -346 1069 -368 1041 -386 1047 -354 1093 -346 1085 -350 1083 -350 1067 -5708 1075 -1074 353 -352 1083 -326 1109 -344 1083 -1050 387 -1052 355 -1054 377 -352 1085 -350 1069 -1076 377 -314 1103 -332 1101 -336 1097 -330 1073 -354 1085 -354 1089 -346 1083 -5688 1073 -1084 331 -386 1047 -356 1087 -346 1061 -1082 383 -1050 353 -1070 385 -346 1051 -354 1105 -1046 385 -346 1085 -322 1073 -386 1049 -382 1047 -354 1069 -386 1053 -362 1071 -5692 1079 -1076 351 -378 1055 -364 1071 -370 1073 -1040 373 -1070 357 -1084 353 -334 1097 -334 1105 -1056 387 -330 1071 -372 1069 -354 1081 -318 1095 -348 1085 -352 1077 -352 1069 -5708 1075 -1076 353 -352 1087 -326 1081 -372 1067 -1084 351 -1050 353 -1098 345 -344 1101 -332 1101 -1054 365 -348 1079 -354 1087 -326 1081 -374 1049 -382 1063 -352 1067 -384 1055 -5708 1071 -1076 345 -350 1081 -352 1069 -386 1059 -1054 361 -1076 371 -1054 387 -330 1073 -372 1069 -1054 383 -344 1085 -346 1065 -364 1073 -368 1065 -334 1099 -334 1073 -382 1061 -5700 1067 -1064 383 -328 1093 -348 1083 -354 1083 -1040 383 -1046 387 -1056 361 -348 1073 -354 1085 -1074 351 -378 1055 -332 1099 -338 1089 -354 1085 -324 1115 -344 1085 -350 1063 -5704 1069 -1068 349 -360 1091 -346 1067 -362 1075 -1062 373 -1068 333 -1102 365 -354 1049 -356 1087 -1074 345 -384 1047 -352 1069 -386 1053 -364 1071 -370 1051 -352 1085 -354 1085 -5678 1081 -1072 351 -378 RAW_Data: 1055 -362 1069 -372 1069 -1054 387 -1048 353 -1092 345 -346 1101 -332 1073 -1074 383 -312 1113 -346 1063 -364 1071 -370 1073 -354 1081 -320 1091 -348 1085 -5680 1075 -1088 367 -344 1069 -360 1075 -350 1063 -1074 353 -1076 385 -1054 365 -348 1071 -354 1083 -1074 351 -374 1067 -326 1077 -376 1085 -352 1049 -354 1091 -346 1063 -380 1051 -5714 1085 -1038 387 -328 1081 -376 1053 -382 1063 -1072 355 -1076 349 -1064 349 -368 1097 -326 1073 -1070 377 -344 1099 -330 1085 -354 1087 -326 1079 -374 1069 -350 1081 -352 1071 -5700 1067 -1076 357 -350 1095 -320 1095 -348 1065 -1078 349 -1092 347 -1066 379 -358 1069 -332 1101 -1062 371 -350 1085 -320 1095 -348 1097 -346 1049 -356 1075 -386 1057 -364 1069 -5692 1077 -1070 351 -380 1051 -350 1075 -376 1065 -1052 385 -1048 383 -1068 381 -316 1083 -352 1073 -1080 377 -314 1103 -334 1099 -336 1099 -328 1075 -350 1095 -352 1065 -350 1095 -5674 1079 -1076 379 -346 1071 -368 1067 -336 1065 -1088 369 -1050 387 -1048 353 -366 1063 -382 1045 -1078 361 -386 1047 -354 1089 -346 1063 -384 1045 -354 1071 -386 1057 -332 1101 -5698 1081 -1044 383 -340 1085 -352 1079 -352 1067 -1080 379 -1030 379 -1050 377 -344 1099 -330 1073 -1074 381 -346 1085 -346 1085 -356 1047 -354 1091 -348 1063 -362 1075 -374 1063 -5678 1103 -1042 377 -352 1081 -352 1073 -348 1095 -1056 347 -1080 373 -1054 383 -314 1113 -346 1065 -1082 355 -358 1067 -352 1079 -352 1067 -350 1093 -346 1083 -354 1075 -354 1087 -5678 1079 -1074 345 -348 1099 -332 1101 -336 1067 -1090 365 -1052 387 -1048 355 -362 1067 -364 1073 -1066 371 -350 1081 -352 1065 -348 1069 -362 1075 -372 1067 -334 1099 -332 1099 -848 153 -153886 131 -896 231 -464 231 -428 97 -166 99 -966 233 -200 101 -66 199 -102 265 -266 299 -98 131 -100 65 -232 131 -100 44699 -12320 65 -132 131 -300 231 -100 167 -266 197 -68 297 -330 131 -496 131 -400 131 -166 633 -66 431 -230 589 -166 10885 -11354 329 -792 99 -296 129 -166 97 -98 65 -132 229 -294 297 -98 561 -166 231 -98 825 -166 57693 -12116 131 -98 295 -424 163 -398 131 -232 97 -130 65 -66 97 -66 165 -460 529 -66 197 -132 393 -198 267 -168 43035 -10678 99 -1716 97 -498 65 -298 67 -2020 331 -166 957 -66 199 -100 529 -12206 199 -796 67 -66 131 -132 129 -398 197 -230 131 -66 227 -196 65 -526 197 -132 589 -132 597 -100 327 -66 8489 -11212 133 -630 131 -100 133 -166 99 -994 99 -198 333 -1626 329 -130 6045 -13890 65 -434 463 -264 295 -266 1385 -132 461 -134 163951 -12284 131 -858 233 -532 199 -402 97 -266 133 -496 431 -66 1161 -66 493 -68 21495 -5856 RAW_Data: 95 -560 65 -2896 199 -762 97 -100 65 -430 131 -896 199 -234 101 -800 231 -332 99 -334 133 -132 265 -268 1425 -66 33043 -12400 99 -666 131 -234 67 -232 65 -498 65 -266 65 -498 165 -102 165 -200 2189 -11534 133 -266 197 -232 97 -166 165 -100 99 -98 99 -500 97 -332 99 -200 12547 -12014 65 -232 99 -600 131 -330 299 -332 625 -66 1243 -134 7929 -12344 97 -762 131 -860 165 -298 295 -298 231 -266 97 -134 397 -132 2891 -68 299 -16210 67 -266 133 -234 101 -268 163 -466 97 -232 65 -198 67 -132 67 -100 263 -98 437 -302 133 -66 165 -168 24439 -10722 131 -1534 229 -1318 99 -98 195 -2100 597 -100 733 -134 28455 -10484 231 -2030 67 -100 101 -132 163 -166 265 -854 361 -166 531 -134 233 -100 495 -164 25733 -12966 65 -1880 65 -132 163 -1086 799 -68 16865 -12956 295 -330 163 -232 233 -166 97 -1860 99 -68 333 -66 1613 -98 55627 -12998 97 -266 263 -1594 131 -894 167 -134 231 -332 131 -66 399 -98 99 -66 697 -4972 65 -3944 65 -132 459 -328 197 -100 1557 -98 23673 -12982 333 -928 133 -232 433 -198 131 -360 99 -64 497 -100 463 -98 397 -132 197 -68 765 -13710 65 -166 99 -1684 131 -632 691 -230 263 -66 359 -132 2073 -64 6059 -12430 97 -462 65 -328 65 -792 229 -824 97 -892 529 -166 163 -168 165 -698 165 -166 431 -130 20385 -12774 97 -98 65 -1384 131 -198 131 -622 131 -598 99 -164 129 -98 193 -98 195 -98 263 -98 459 -132 131 -66 73855 -13048 65 -2554 97 -166 761 -68 761 -366 15305 -12094 165 -764 963 -68 65 -66 163 -66 233 -102 333 -100 965 -66 40087 -10292 165 -1724 65 -1754 165 -266 463 -396 267 -432 795 -132 297 -66 267 -68 261 -134 36583 -10588 65 -2738 97 -1184 259 -298 131 -294 395 -98 819 -132 689 -166 7999 -11970 65 -468 63 -1892 429 -262 263 -200 199 -632 265 -66 229 -66 1149 -68 2355 -15782 233 -198 67 -166 295 -818 229 -164 1059 -68 265 -68 1789 -10374 131 -1904 65 -196 229 -230 197 -360 229 -164 129 -1120 963 -166 231 -200 199 -230 333 -10180 67 -966 133 -1264 65 -798 99 -432 65 -898 65 -134 7681 -12052 131 -928 129 -624 99 -526 65 -432 65 -532 65 -596 199 -100 265 -296 895 -100 229 -98 589 -15506 97 -266 65 -434 65 -1520 199 -98 265 -894 293 -198 427 -198 97 -132 459 -64 2145 -66 9075 -7224 99 -66 65 -1060 65 -200 99 -932 167 -894 65 -528 165 -102 927 -100 597 -232 99 -66 97 -98 461 -196 261 -98 197 -264 2909 -134 11635 -804 99 -240 143 -244 369 -5700 1077 -1074 353 -354 1083 -324 RAW_Data: 1117 -346 1063 -1086 353 -1050 381 -1070 383 -348 1049 -354 1073 -1082 383 -350 1047 -354 1077 -386 1057 -334 1101 -336 1105 -354 1081 -320 1093 -5710 1073 -1076 351 -354 1085 -324 1111 -344 1065 -1084 351 -1082 349 -1068 385 -348 1053 -354 1075 -1078 385 -348 1051 -354 1075 -382 1065 -354 1085 -346 1065 -364 1069 -370 1069 -5686 1077 -1086 367 -354 1047 -354 1095 -346 1095 -1054 363 -1072 369 -1050 387 -328 1077 -374 1051 -1084 349 -348 1081 -376 1081 -348 1063 -352 1073 -380 1067 -356 1053 -376 1083 -5684 1073 -1086 365 -356 1049 -354 1089 -348 1085 -1066 385 -1046 351 -1074 385 -348 1083 -320 1109 -1048 381 -346 1071 -336 1097 -336 1097 -334 1085 -352 1093 -320 1097 -348 1095 -5680 1089 -1064 371 -352 1081 -352 1067 -348 1067 -1078 349 -1094 347 -1096 349 -358 1067 -350 1081 -1076 355 -352 1081 -356 1055 -378 1065 -350 1079 -352 1069 -384 1053 -348 1079 -5702 1099 -1072 353 -350 1065 -354 1087 -348 1097 -1046 347 -1096 377 -1034 377 -360 1085 -356 1049 -1074 351 -382 1051 -362 1071 -374 1051 -388 1049 -352 1093 -346 1061 -384 1049 -5708 1087 -1068 349 -362 1089 -344 1061 -382 1051 -1076 359 -1080 351 -1088 355 -358 1069 -352 1081 -1078 353 -350 1087 -326 1079 -376 1065 -350 1079 -354 1069 -384 1059 -332 1101 -5700 1087 -1044 353 -368 1095 -348 1085 -320 1111 -1044 381 -1064 347 -1090 345 -344 1101 -332 1073 -1074 383 -344 1087 -344 1067 -352 1083 -352 1071 -384 1051 -352 1083 -352 1071 -5712 1077 -1076 355 -350 1087 -326 1079 -374 1053 -1070 375 -1072 357 -1080 353 -334 1103 -334 1073 -1084 349 -378 1051 -376 1067 -364 1073 -368 1065 -336 1101 -332 1083 -352 1083 -5712 1075 -1044 383 -348 1069 -372 1051 -354 1083 -1076 351 -1074 383 -1052 385 -326 1089 -346 1065 -1066 381 -340 1099 -326 1077 -374 1067 -352 1083 -350 1069 -350 1087 -352 1081 -5676 1085 -1074 387 -330 1071 -372 1069 -352 1079 -1076 355 -1078 351 -1084 347 -360 1067 -348 1081 -1074 357 -352 1081 -356 1085 -344 1065 -384 1049 -354 1071 -384 1059 -346 1085 -5680 1087 -1084 343 -348 1103 -352 1065 -354 1087 -1070 345 -1086 351 -1082 351 -340 1097 -346 1087 -1046 361 -352 1083 -354 1089 -346 1067 -350 1081 -354 1071 -386 1053 -346 1097 -5676 1085 -1084 349 -360 1085 -344 1081 -348 1065 -1076 357 -1080 351 -1086 325 -388 1065 -366 1067 -1064 371 -352 1081 -352 1065 -382 1049 -348 1083 -352 1071 -382 1049 -384 1047 -5708 1065 -1062 377 -350 1083 -354 1085 -326 1077 -1070 377 -1052 381 -1066 351 -378 1057 -332 1103 -1060 373 -344 1069 -362 1073 -350 1095 -350 1065 -348 1095 -350 1085 -344 1065 -5704 1079 -1072 347 -382 1049 -354 1075 -382 1051 -1082 351 -1082 351 -1072 RAW_Data: 381 -348 1053 -354 1071 -1074 381 -348 1071 -370 1049 -386 1047 -356 1091 -346 1083 -346 1067 -354 1071 -5700 1103 -1046 361 -386 1047 -354 1087 -346 1085 -1050 387 -1050 351 -1098 345 -350 1083 -352 1073 -1078 379 -316 1103 -332 1101 -336 1097 -330 1073 -380 1065 -352 1069 -384 1061 -5684 1089 -1064 369 -346 1093 -320 1109 -352 1067 -1076 349 -1070 381 -1032 379 -360 1065 -362 1071 -1064 373 -342 1099 -330 1073 -350 1093 -352 1067 -350 1087 -350 1081 -352 1071 -5710 1077 -1074 355 -354 1081 -326 1113 -346 1083 -1054 381 -1034 383 -1066 379 -316 1099 -334 1097 -1052 379 -358 1067 -350 1081 -352 1067 -386 1055 -334 1101 -334 1107 -322 1085 -5708 1077 -1050 387 -348 1087 -320 1111 -356 1055 -1086 355 -1050 375 -1054 387 -330 1075 -376 1067 -1068 385 -326 1087 -346 1063 -382 1047 -354 1105 -354 1057 -332 1097 -372 1049 -5716 1071 -1080 365 -356 1047 -354 1095 -348 1085 -1070 353 -1050 383 -1070 379 -314 1101 -334 1099 -1052 377 -356 1071 -354 1081 -320 1097 -348 1087 -346 1095 -322 1105 -352 1063 -5702 1075 -1076 351 -346 1109 -342 1087 -322 1081 -1074 351 -1076 383 -1062 347 -362 1065 -364 1071 -1064 373 -344 1099 -330 1077 -350 1097 -320 1097 -348 1095 -326 1079 -376 1063 -5712 1071 -1074 347 -346 1101 -332 1083 -350 1097 -1040 385 -1044 387 -1054 363 -348 1085 -354 1087 -1046 351 -370 1085 -346 1097 -320 1107 -350 1063 -350 1087 -346 1065 -360 1075 -5704 1077 -1076 351 -378 1055 -362 1071 -370 1049 -1084 351 -1084 355 -1054 375 -350 1083 -352 1067 -1076 379 -346 1075 -332 1101 -336 1065 -362 1073 -382 1065 -352 1069 -384 1049 -5682 1077 -1090 369 -354 1049 -354 1093 -348 1087 -1070 347 -1062 383 -1042 385 -346 1073 -372 1051 -1084 351 -346 1079 -374 1083 -354 1051 -354 1091 -348 1089 -354 1047 -354 1097 -5702 1075 -1076 353 -352 1085 -326 1077 -374 1053 -1082 385 -1050 353 -1092 345 -348 1083 -352 1069 -1076 383 -346 1051 -354 1073 -384 1051 -374 1067 -358 1073 -350 1069 -354 1087 -5706 1075 -1042 385 -352 1085 -326 1077 -378 1067 -1050 387 -1048 383 -1064 381 -350 1049 -354 1069 -1080 383 -350 1049 -354 1073 -388 1055 -334 1101 -336 1107 -354 1047 -354 1093 -5674 1109 -1072 353 -350 1083 -348 1051 -376 1065 -1082 351 -1082 351 -1072 379 -348 1073 -332 1073 -1072 381 -346 1085 -344 1065 -362 1073 -372 1047 -386 1047 -354 1089 -346 1083 -5686 1075 -1092 367 -354 1049 -354 1093 -348 1065 -1066 383 -1070 347 -1062 379 -358 1063 -348 1079 -1066 375 -344 1067 -362 1073 -350 1097 -350 1071 -348 1095 -346 1083 -320 1107 -5668 1107 -1078 329 -388 1047 -354 1093 -344 1065 -1082 343 -1098 353 -1080 349 -346 1077 -370 1067 -1052 347 -390 RAW_Data: 1067 -364 1069 -366 1051 -386 1051 -356 1053 -378 1085 -346 1067 -5712 1053 -1074 381 -346 1083 -344 1063 -350 1077 -1068 377 -1066 383 -1050 351 -378 1057 -364 1073 -1066 371 -346 1063 -354 1071 -386 1053 -346 1103 -332 1071 -382 1063 -352 1065 -5716 1077 -1074 353 -352 1083 -326 1077 -376 1051 -1084 381 -1066 351 -1066 379 -348 1069 -368 1067 -1066 349 -362 1067 -362 1071 -370 1067 -334 1099 -366 1065 -336 1067 -364 1073 -5714 1075 -1050 361 -388 1045 -350 1091 -348 1085 -1054 381 -1066 349 -1070 381 -346 1071 -368 1065 -1052 379 -358 1067 -334 1097 -334 1085 -352 1085 -354 1087 -346 1083 -354 1051 -5706 1087 -1078 349 -348 1075 -372 1051 -382 1067 -1072 353 -1076 353 -1056 361 -350 1083 -352 1083 -1076 351 -376 1055 -364 1071 -370 1049 -352 1083 -356 1087 -346 1083 -352 1049 -5702 1087 -1052 389 -346 1087 -322 1111 -354 1057 -1082 355 -1054 375 -1064 347 -354 1105 -354 1081 -1040 383 -352 1085 -326 1075 -374 1051 -354 1083 -354 1089 -346 1085 -348 1065 -5710 1087 -1062 345 -352 1071 -382 1061 -352 1069 -1078 383 -1052 351 -1082 349 -380 1055 -334 1099 -1062 371 -354 1083 -318 1097 -348 1083 -352 1081 -352 1065 -350 1087 -352 1077 -5710 1069 -1054 389 -328 1075 -376 1049 -356 1079 -1076 351 -1074 385 -1058 365 -344 1073 -352 1097 -1036 383 -350 1063 -354 1087 -348 1097 -328 1071 -376 1063 -332 1101 -336 1101 -5676 1103 -1038 379 -344 1099 -332 1077 -354 1085 -1076 349 -1070 385 -1052 353 -360 1087 -344 1085 -1040 387 -328 1081 -374 1051 -386 1047 -354 1089 -346 1065 -362 1077 -372 1065 -5710 1075 -1042 377 -350 1083 -352 1069 -350 1095 -1050 373 -1064 357 -1074 353 -364 1073 -372 1053 -1074 351 -346 1081 -376 1069 -332 1099 -334 1087 -352 1085 -354 1085 -346 1085 -5682 1075 -1088 329 -388 1049 -354 1089 -346 1065 -1070 353 -1096 345 -1084 351 -362 1085 -344 1067 -1082 355 -358 1083 -354 1047 -354 1093 -346 1065 -360 1073 -372 1081 -354 1045 -5708 1073 -1086 353 -346 1075 -374 1055 -352 1095 -1074 353 -1074 351 -1062 379 -340 1095 -326 1079 -1070 373 -344 1099 -330 1083 -356 1083 -324 1113 -344 1067 -352 1081 -352 1073 -5706 1073 -1076 355 -354 1085 -326 1081 -374 1067 -1054 389 -1048 353 -1096 345 -350 1081 -352 1071 -1080 383 -348 1047 -354 1073 -386 1057 -334 1099 -334 1077 -384 1063 -350 1067 -5704 1071 -1076 357 -354 1081 -356 1083 -346 1067 -1086 353 -1048 383 -1070 383 -314 1081 -354 1071 -1078 385 -348 1047 -354 1107 -354 1057 -334 1099 -334 1085 -354 1083 -354 1085 -5670 1111 -1038 383 -354 1085 -328 1071 -376 1053 -1088 353 -1086 355 -1048 375 -352 1081 -350 1069 -1078 381 -350 1049 -352 1071 -386 1055 -334 1097 -336 RAW_Data: 1087 -356 1081 -356 1085 -5672 1077 -1074 353 -382 1053 -364 1073 -372 1073 -1054 389 -1050 355 -1054 377 -344 1099 -330 1073 -1076 387 -330 1069 -372 1067 -344 1099 -330 1073 -354 1081 -354 1087 -348 1063 -5718 1081 -1060 369 -342 1067 -360 1073 -354 1083 -1076 349 -1068 385 -1052 353 -360 1085 -346 1087 -1052 389 -330 1069 -372 1051 -356 1083 -354 1087 -346 1089 -348 1065 -352 1069 -5700 1101 -1046 359 -354 1083 -354 1087 -348 1063 -1082 353 -1054 377 -1062 379 -356 1067 -334 1101 -1060 369 -344 1067 -360 1083 -356 1087 -328 1075 -374 1067 -352 1081 -350 1071 -5706 1075 -1076 351 -354 1085 -324 1111 -344 1085 -1040 389 -1048 353 -1094 345 -350 1081 -352 1071 -1076 379 -316 1097 -336 1097 -336 1097 -334 1095 -346 1073 -372 1051 -354 1079 -5692 1085 -1084 351 -346 1075 -374 1051 -354 1083 -1074 351 -1072 385 -1058 381 -328 1073 -348 1085 -1054 389 -328 1075 -376 1067 -350 1081 -352 1069 -350 1085 -352 1083 -350 1071 -5710 1077 -1042 383 -352 1089 -326 1073 -376 1065 -1064 375 -1072 365 -1038 373 -348 1071 -386 1059 -1050 379 -358 1087 -354 1047 -354 1089 -348 1085 -354 1081 -320 1095 -348 1087 -5686 1079 -1084 365 -356 1049 -354 1093 -346 1085 -1052 387 -1048 355 -1090 347 -350 1083 -352 1071 -1076 379 -314 1099 -334 1097 -336 1097 -332 1099 -336 1095 -332 1075 -354 1083 -5708 1051 -1080 383 -348 1049 -354 1105 -354 1055 -1084 355 -1052 375 -1084 351 -330 1079 -376 1051 -1074 387 -328 1075 -376 1067 -350 1079 -352 1069 -380 1067 -326 1081 -374 1051 -5714 1075 -1050 395 -356 1047 -354 1091 -348 1095 -1052 375 -1064 353 -1076 351 -346 1077 -372 1065 -1050 379 -360 1065 -362 1069 -370 1065 -334 1099 -332 1097 -336 1097 -332 1083 -5682 1101 -1046 395 -356 1047 -354 1089 -346 1097 -1050 385 -1046 351 -1074 385 -348 1051 -354 1105 -1042 385 -350 1051 -354 1073 -384 1067 -326 1113 -344 1063 -364 1069 -370 1065 -5690 1077 -1074 383 -348 1047 -354 1075 -386 1057 -1054 361 -1076 373 -1052 387 -330 1073 -374 1069 -1054 387 -330 1075 -374 1067 -352 1081 -352 1067 -350 1085 -352 1079 -352 1069 -5712 1075 -1076 351 -354 1085 -326 1109 -344 1083 -1054 387 -1052 355 -1054 375 -352 1085 -318 1097 -1076 379 -314 1099 -334 1103 -356 1079 -320 1091 -348 1085 -352 1081 -350 1067 -5708 1075 -1076 355 -350 1085 -326 1079 -374 1053 -1084 351 -1084 353 -1090 343 -350 1079 -354 1069 -1080 379 -346 1073 -332 1073 -382 1065 -352 1067 -380 1067 -326 1081 -374 1069 -5680 1103 -1070 345 -346 1099 -330 1073 -388 1047 -1070 351 -1078 385 -1058 363 -346 1081 -354 1087 -1046 351 -368 1095 -348 1051 -354 1077 -384 1065 -326 1113 -344 1085 -350 1061 -5708 1053 -1084 RAW_Data: 351 -364 1073 -372 1069 -352 1083 -1040 353 -1110 353 -1056 361 -348 1081 -354 1083 -1078 351 -376 1059 -346 1055 -354 1079 -386 1057 -364 1071 -368 1037 -386 1047 -5706 1073 -1084 355 -334 1101 -336 1083 -354 1083 -1074 351 -1072 383 -1050 351 -360 1087 -346 1087 -1038 383 -344 1087 -346 1063 -362 1077 -370 1051 -354 1085 -356 1087 -344 1065 -5704 1081 -1074 345 -384 1047 -354 1069 -384 1057 -1086 325 -1078 373 -1052 385 -330 1079 -374 1049 -1072 381 -346 1085 -344 1067 -362 1073 -370 1067 -334 1101 -332 1071 -386 1049 -5712 1077 -1044 383 -346 1075 -370 1065 -348 1085 -1048 361 -1072 389 -1048 353 -364 1085 -354 1079 -1042 385 -354 1087 -328 1073 -374 1071 -352 1081 -320 1099 -348 1085 -352 1083 -5668 1087 -1084 353 -364 1069 -368 1053 -380 1067 -1072 353 -1078 349 -1068 355 -362 1067 -348 1083 -1074 357 -350 1085 -356 1081 -344 1083 -354 1047 -354 1093 -348 1083 -352 1079 -5704 1073 -1052 387 -330 1077 -372 1051 -352 1085 -1076 349 -1072 379 -1070 323 -388 1063 -348 1077 -1064 375 -352 1079 -352 1065 -384 1049 -352 1083 -352 1069 -350 1085 -352 1083 -5676 1085 -1080 351 -366 1071 -366 1053 -352 1085 -1076 351 -1070 379 -1064 349 -360 1065 -364 1073 -1064 369 -346 1071 -358 1073 -350 1065 -354 1091 -380 1051 -348 1083 -352 1069 -5712 1077 -1074 353 -352 1085 -326 1075 -374 1065 -1066 361 -1074 371 -1056 387 -330 1071 -372 1051 -1086 353 -336 1095 -370 1069 -354 1079 -320 1095 -348 1097 -350 1051 -354 1077 -5708 1075 -1078 355 -352 1085 -326 1081 -374 1051 -1082 349 -1100 321 -1098 345 -348 1101 -332 1099 -1072 325 -388 1065 -334 1099 -368 1051 -352 1083 -356 1053 -378 1083 -352 1047 -5710 1073 -1072 383 -314 1113 -344 1067 -364 1067 -1068 371 -1054 389 -1050 355 -362 1087 -354 1049 -1074 351 -382 1053 -362 1077 -370 1051 -352 1095 -352 1065 -348 1097 -324 1079 -5690 1101 -1074 355 -350 1081 -350 1085 -346 1081 -1050 387 -1048 355 -1094 345 -350 1083 -352 1069 -1074 379 -346 1073 -366 1067 -346 1085 -354 1073 -352 1055 -360 1075 -374 1051 -5718 1071 -1048 395 -356 1047 -354 1091 -346 1085 -1052 383 -1066 349 -1070 381 -314 1101 -334 1085 -1074 351 -346 1081 -376 1067 -332 1099 -334 1099 -336 1101 -330 1085 -350 1065 -5702 1075 -1072 381 -348 1051 -374 1069 -366 1067 -1064 371 -1070 351 -1080 351 -376 1047 -382 1047 -1078 357 -352 1083 -358 1053 -374 1051 -386 1049 -354 1093 -344 1065 -350 1079 -5720 1067 -1076 355 -352 1085 -326 1077 -376 1053 -1086 353 -1084 355 -1056 375 -344 1093 -322 1105 -1074 351 -348 1073 -372 1065 -334 1099 -332 1101 -346 1083 -352 1079 -354 1057 -5706 1077 -1074 347 -348 1081 -354 1071 -384 1057 -1052 RAW_Data: 361 -1076 373 -1050 387 -330 1075 -374 1049 -1086 387 -330 1073 -370 1053 -352 1083 -354 1085 -346 1065 -362 1071 -370 1065 -5682 1105 -1036 377 -346 1099 -330 1085 -354 1085 -1046 353 -1096 347 -1086 351 -360 1085 -344 1085 -1052 381 -314 1113 -344 1083 -354 1047 -354 1093 -348 1067 -362 1073 -374 1049 -5716 1071 -1052 363 -388 1047 -354 1091 -346 1065 -1080 347 -1090 345 -1064 379 -358 1069 -334 1097 -1062 369 -352 1083 -320 1099 -348 1065 -362 1075 -374 1067 -334 1099 -332 1073 -5720 1073 -1048 395 -356 1049 -356 1089 -346 1065 -1084 343 -1072 361 -1084 355 -334 1101 -336 1099 -1058 363 -344 1085 -354 1089 -326 1075 -376 1051 -356 1081 -356 1085 -346 1065 -5688 1111 -1058 367 -348 1065 -352 1069 -384 1067 -1042 379 -1070 383 -1052 351 -330 1115 -346 1087 -1056 351 -346 1077 -376 1083 -352 1061 -352 1067 -350 1097 -326 1109 -346 1083 -5686 1075 -1048 397 -356 1047 -354 1091 -346 1085 -1054 389 -1048 353 -1058 377 -352 1085 -352 1069 -1074 381 -350 1051 -352 1069 -386 1055 -366 1069 -368 1051 -354 1083 -356 1083 -5672 1081 -1074 351 -382 1055 -364 1069 -372 1053 -1086 355 -1054 359 -1076 373 -352 1079 -350 1065 -1078 383 -316 1083 -354 1073 -352 1085 -352 1083 -350 1071 -348 1099 -328 1075 -5694 1099 -1072 351 -354 1083 -326 1111 -342 1085 -1054 353 -1062 381 -1064 379 -314 1101 -334 1099 -1058 361 -348 1081 -354 1081 -348 1087 -346 1085 -356 1049 -354 1091 -348 1065 -5710 1073 -1078 347 -346 1101 -332 1073 -350 1093 -1074 355 -1050 385 -1062 347 -366 1099 -326 1077 -1066 373 -352 1083 -320 1097 -350 1097 -326 1075 -376 1065 -332 1097 -370 1065 -5684 1101 -1036 377 -344 1101 -330 1073 -356 1079 -1074 349 -1074 385 -1056 365 -344 1081 -354 1085 -1042 379 -340 1095 -348 1085 -320 1109 -356 1055 -332 1101 -334 1107 -354 1049 -5704 1087 -1048 389 -350 1081 -320 1111 -356 1055 -1052 389 -1048 377 -1056 391 -328 1073 -374 1057 -1084 353 -344 1077 -372 1053 -356 1083 -356 1085 -346 1063 -352 1081 -352 1073 -5712 1073 -1074 353 -356 1079 -318 1117 -346 1065 -1056 389 -1048 381 -1066 383 -314 1081 -352 1073 -1080 385 -316 1085 -352 1071 -352 1097 -326 1109 -344 1071 -354 1081 -320 1099 -5696 1069 -1076 355 -356 1083 -324 1113 -346 1063 -1078 347 -1090 379 -1032 377 -356 1069 -354 1081 -1040 387 -354 1087 -326 1075 -376 1069 -342 1097 -330 1077 -356 1083 -324 1115 -5678 1081 -1076 349 -346 1089 -334 1095 -336 1107 -1058 355 -1054 389 -1046 377 -354 1081 -320 1097 -1078 379 -314 1097 -332 1099 -338 1093 -332 1073 -354 1091 -350 1069 -350 1095 -5674 1111 -1044 381 -314 1099 -336 1097 -336 1095 -1064 369 -1038 389 -1050 381 -338 1093 -350 RAW_Data: 1081 -1044 395 -322 1081 -354 1087 -348 1085 -356 1083 -320 1093 -348 1089 -356 1049 -5706 1077 -1052 387 -350 1087 -320 1113 -318 1097 -1042 379 -1066 381 -1030 379 -362 1063 -364 1069 -1068 373 -356 1081 -320 1095 -350 1087 -352 1063 -352 1071 -350 1099 -326 1111 -5670 1081 -1076 349 -380 1057 -334 1097 -334 1089 -1054 389 -1056 361 -1072 373 -354 1083 -320 1091 -1074 381 -318 1079 -352 1071 -352 1091 -348 1083 -322 1113 -358 1053 -332 1133 -810 65 -262 181 -142572 65 -98 199 -100 133 -300 99 -166 99 -232 99 -134 333 -166 231 -330 99 -230 493 -100 361 -66 525 -12248 131 -268 133 -268 131 -400 229 -726 97 -494 265 -402 65 -664 363 -134 365 -166 131 -262 395 -98 795 -98 68827 -6766 99 -1626 99 -66 65 -700 97 -864 565 -464 99 -98 133 -230 197 -166 591 -98 5135 -12244 97 -2452 65 -734 165 -198 233 -266 631 -198 12423 -12322 165 -796 67 -100 99 -98 67 -862 133 -728 263 -66 361 -166 129 -100 395 -166 625 -232 131 -66 8113 -12068 229 -132 65 -1394 99 -134 65 -300 165 -134 65 -102 99 -166 133 -766 297 -98 199 -102 1067 -166 859 -98 25307 -13210 65 -1764 97 -264 163 -496 133 -132 65 -66 427 -98 721 -68 531 -134 1591 -100 54955 -11122 65 -726 65 -368 65 -492 99 -428 233 -164 99 -266 131 -498 197 -430 295 -66 2793 -130 11307 -12324 97 -132 193 -1216 65 -1286 131 -594 399 -100 431 -266 495 -100 165 -132 63531 -12252 99 -166 165 -596 99 -496 99 -298 97 -368 65 -134 131 -198 165 -434 99 -266 301 -364 37153 -11928 65 -332 195 -528 131 -230 97 -1126 131 -530 99 -790 361 -100 895 -98 597 -66 699 -100 15803 -10136 99 -2044 65 -400 165 -534 165 -134 99 -434 65 -966 97 -100 133 -134 1125 -66 589 -100 26555 -12218 165 -334 65 -100 99 -2586 65 -732 531 -100 461 -132 3347 -10206 97 -2084 63 -296 99 -164 65 -1052 97 -66 231 -330 65 -232 331 -596 1119 -424 361 -66 28413 -12166 67 -264 161 -228 97 -390 65 -856 131 -66 763 -132 201 -132 9717 -13508 129 -990 65 -100 97 -296 165 -724 65 -368 231 -98 401 -66 527 -66 767 -100 637 -66 109351 -13036 165 -796 65 -200 133 -100 199 -600 133 -134 99 -932 461 -132 399 -264 47323 -12184 97 -566 231 -400 67 -1456 229 -132 97 -394 163 -230 1579 -66 231 -164 10685 -12812 99 -132 67 -464 133 -1162 331 -132 99 -266 167 -200 99 -268 791 -164 823 -132 329 -134 63603 -10646 65 -662 165 -234 163 -630 463 -98 233 -100 195 -262 131 -132 491 -12204 65 -1156 131 -954 295 -132 99 -332 65 -664 789 -328 RAW_Data: 1351 -8346 67 -4708 133 -400 99 -298 65 -556 65 -396 295 -66 263 -64 163 -100 131 -100 97 -68 131 -166 65 -166 497 -132 999 -132 5609 -4806 131 -4842 131 -298 133 -332 67 -596 131 -1186 263 -268 495 -100 461 -462 165 -66 525 -100 1579 -100 4557 -10356 165 -1614 165 -98 97 -630 65 -164 461 -164 65 -558 231 -130 131 -164 591 -66 557 -9122 65 -166 101 -6060 295 -68 65 -594 163 -368 263 -98 65 -98 99 -294 99 -66 363 -432 329 -66 1987 -100 25465 -9810 197 -100 131 -262 97 -530 99 -168 65 -166 431 -530 99 -232 167 -266 97 -234 1065 -66 131 -198 17549 -9930 899 -100 367 -994 67 -132 167 -794 231 -98 99 -464 299 -134 131 -100 199 -732 97 -296 131 -66 1157 -132 359 -130 47799 -12132 99 -630 197 -132 165 -502 195 -164 261 -98 261 -98 263 -66 195 -296 195 -198 65 -66 393 -66 955 -100 12501 -12452 97 -2942 165 -262 97 -228 65 -98 359 -130 625 -100 723 -66 365 -13612 99 -832 233 -66 99 -298 65 -464 233 -164 65 -164 1053 -362 10409 -11212 197 -794 131 -970 67 -132 99 -366 167 -366 165 -134 167 -664 99 -302 1253 -200 131 -15330 97 -132 259 -100 63 -558 165 -398 65 -860 231 -66 163 -98 263 -364 559 -100 1313 -66 89369 -10410 65 -1788 233 -132 133 -1062 165 -532 65 -632 63 -794 65 -166 97 -132 133 -66 431 -100 467 -132 199 -364 15615 -12276 99 -662 165 -66 133 -564 197 -1460 65 -66 65 -364 231 -396 165 -134 5835 -12662 165 -436 163 -468 65 -100 299 -728 99 -534 265 -166 263 -100 627 -100 197 -66 43301 -12090 163 -96 197 -692 97 -862 129 -368 165 -232 65 -998 197 -66 393 -196 683 -98 6471 -12036 165 -662 133 -302 99 -566 727 -66 2289 -66 7119 -12372 99 -662 97 -300 99 -66 131 -962 165 -362 131 -168 65 -428 133 -134 1797 -66 63965 -10524 263 -1458 265 -298 99 -166 199 -130 789 -68 23871 -12668 65 -990 99 -196 331 -990 755 -100 233 -132 267 -13192 65 -932 233 -134 199 -164 133 -568 99 -898 331 -134 99 -66 961 -66 7013 -10302 65 -664 131 -432 99 -532 199 -466 329 -364 65 -134 429 -198 759 -132 617 -198 38455 -12426 199 -134 99 -1252 99 -396 229 -660 99 -362 197 -164 197 -132 689 -66 161 -98 357 -330 265 -100 15001 -11544 133 -636 131 -132 99 -232 65 -1488 165 -636 131 -266 133 -134 367 -66 197 -100 267 -6574 131 -260 165 -166 65 -132 65 -828 295 -66 589 -100 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/linear.sub ================================================ Filetype: Flipper SubGhz Key File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: Linear Bit: 10 Key: 00 00 00 00 00 00 01 E4 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/linear_delta3.sub ================================================ Filetype: Flipper SubGhz Key File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: LinearDelta3 Bit: 8 Key: 00 00 00 00 00 00 00 D0 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/linear_delta3_raw.sub ================================================ Filetype: Flipper SubGhz RAW File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: RAW RAW_Data: -66 11813 -100 14655 -98 40111 -66 1625 -2116 1933 -34732 501 -11730 235 -3728 1887 -2106 1933 -2092 1971 -2072 1959 -34712 511 -3554 445 -3556 1997 -2036 455 -3594 1963 -2046 1979 -2076 1961 -2070 1989 -34690 483 -7724 1739 -2226 355 -3684 1857 -2138 1929 -2078 1965 -2074 1947 -34750 487 -3538 473 -3544 1993 -2042 485 -3548 1961 -2070 1965 -2070 1969 -2042 1997 -34716 443 -7734 1753 -2236 323 -3676 1903 -2098 1945 -2102 1927 -2070 1989 -34710 521 -3532 473 -3544 1991 -2032 481 -3556 1969 -2076 1967 -2036 1991 -2066 1969 -34718 467 -7756 1739 -2192 363 -3654 1889 -2132 1929 -2096 1935 -2070 1987 -34716 511 -3522 471 -3554 2009 -2036 459 -3550 2003 -2038 1979 -2042 1999 -2042 1999 -34704 471 -11774 225 -3710 1879 -2162 1885 -2112 1925 -2110 1939 -34738 459 -3636 403 -3612 1939 -2062 451 -3566 1985 -2044 1995 -2040 2009 -2032 2003 -34684 495 -3680 295 -3648 1935 -2098 423 -3562 2001 -2038 1989 -2044 2003 -2036 1977 -34718 461 -3678 295 -3684 1901 -2098 429 -3596 1967 -2036 1981 -2048 1993 -2042 2013 -34686 521 -3530 457 -3568 1999 -2036 455 -3552 1999 -2032 2019 -2024 1995 -2022 1997 -34716 441 -15774 1809 -2192 1905 -2100 1919 -2112 1961 -34720 417 -3830 167 -3710 1863 -2144 357 -3674 1909 -2100 1955 -2062 1977 -2072 1965 -34710 487 -3562 453 -3554 1985 -2052 481 -3536 2019 -2010 2001 -2042 1997 -2038 2005 -34716 451 -3602 433 -3584 1959 -2070 451 -3560 2001 -2038 1993 -2042 1967 -2072 1973 -34712 459 -3622 393 -3624 1933 -2068 457 -3584 1965 -2064 1979 -2052 1967 -2044 1981 -34722 477 -3608 397 -3588 1961 -2096 413 -3596 1971 -2040 1979 -2072 1963 -2070 1959 -34714 495 -3558 483 -3538 1985 -2042 479 -3562 1985 -2046 1967 -2070 1973 -2054 1995 -34688 493 -3578 413 -3614 1939 -2074 465 -3560 1971 -2038 2017 -2018 1995 -2042 2013 -34726 479 -3528 475 -3556 1999 -2036 455 -3570 1999 -2040 1973 -2054 2001 -2032 1987 -34720 477 -3562 445 -3602 1949 -2054 481 -3562 1975 -2060 1963 -2064 1977 -2038 2005 -34702 485 -3570 447 -3550 2015 -2020 479 -3564 1983 -2048 1999 -2034 1971 -2064 1993 -34688 517 -3516 497 -3532 1999 -2038 481 -3558 1997 -2004 2027 -2042 1963 -2038 1997 -34716 491 -3562 461 -3548 1995 -2032 491 -3524 2005 -2036 1989 -2038 1995 -2046 1979 -34714 465 -3682 293 -3680 1905 -2096 431 -3592 1969 -2070 1977 -2052 1965 -2044 1981 -34734 479 -3564 463 -3556 1999 -2032 457 -3550 1995 -2044 2011 -2042 1997 -2006 2027 -34680 531 -3524 483 -3538 1987 -2044 479 -3534 2013 -2048 1965 -2062 1987 -2030 1997 -34712 473 -3592 445 -3562 1975 -2072 451 -3566 1965 -2042 2013 -2046 1963 -2064 1993 -34700 459 -3632 371 -3638 1915 -2084 449 -3568 1987 -2046 1971 -2070 1983 -2022 1997 -34726 487 -3524 477 -3562 1985 -2044 481 -3542 2005 -2040 1995 -2038 1967 -2046 1993 -34710 511 -3528 471 -3560 1967 -2070 459 -3558 1971 RAW_Data: -2072 1971 -2056 1971 -2074 1973 -34714 455 -3634 373 -3634 1901 -2110 419 -3620 1941 -2070 1991 -2040 1999 -2038 1965 -34740 467 -3562 481 -3534 1983 -2070 449 -3546 1999 -2044 1993 -2042 2003 -2036 1975 -34702 521 -3560 443 -3586 1969 -2044 449 -3562 1997 -2046 1987 -2042 2007 -2034 1973 -34732 487 -3562 443 -3582 1979 -2058 445 -3560 1995 -2044 1997 -2028 1987 -2034 2003 -34710 515 -3518 485 -3566 1977 -2036 483 -3536 1999 -2044 2009 -2024 1995 -2068 1973 -34710 487 -3564 471 -3558 1977 -2054 447 -3564 1991 -2042 1997 -2036 2007 -2034 2001 -34684 529 -3526 469 -3548 1989 -2038 483 -3562 1997 -2038 1973 -2034 1999 -2036 1997 -34728 487 -3536 479 -3534 2013 -2044 449 -3570 1985 -2042 1993 -2044 2005 -2014 1995 -34710 473 -3594 439 -3562 1995 -2040 457 -3564 2001 -2040 1975 -2046 1995 -2046 1999 -34704 491 -3548 451 -3570 1991 -2042 447 -3578 1967 -2046 1995 -2042 1999 -2034 2001 -34712 491 -3562 443 -3584 1981 -2018 479 -3562 1985 -2044 1997 -2030 1989 -2040 1997 -34722 489 -3554 459 -3560 1969 -2068 453 -3554 1999 -2034 1987 -2058 1997 -2046 1983 -34702 487 -3534 479 -3564 1983 -2040 483 -3538 1981 -2048 1993 -2048 2007 -2044 1995 -34696 489 -3550 453 -3570 1995 -2050 447 -3564 1983 -2040 1999 -2034 2003 -2034 1995 -34690 495 -3580 433 -3586 1969 -2064 453 -3552 1995 -2036 1991 -2056 1997 -2046 1987 -34706 441 -3636 373 -3626 1959 -2074 419 -3592 1963 -2074 1989 -2044 1971 -2070 1981 -34698 509 -3526 503 -3528 2005 -2034 481 -3528 1993 -2042 1999 -2066 1989 -2034 2003 -34678 495 -3540 481 -3546 1997 -2046 473 -3554 1999 -2034 2001 -2036 1995 -2046 1983 -34720 475 -3560 469 -3548 1997 -2030 485 -3566 1963 -2066 1983 -2046 1999 -2034 1973 -34734 487 -3560 443 -3584 1981 -2052 445 -3568 1987 -2044 1999 -2032 1993 -2034 2007 -34702 491 -3560 459 -3558 1967 -2070 455 -3556 2003 -2036 1977 -2042 2005 -2028 1997 -34730 461 -3564 473 -3536 2011 -2046 449 -3566 1989 -2044 1997 -2042 1971 -2054 2001 -34708 475 -3560 479 -3528 1999 -2040 485 -3566 1963 -2040 2013 -2042 1995 -2034 1987 -34694 519 -3554 441 -3582 1981 -2052 449 -3564 1985 -2040 1993 -2034 1991 -2062 1975 -34714 529 -3534 463 -3558 1969 -2068 451 -3560 2003 -2038 1993 -2042 1969 -2070 1975 -34720 493 -3582 383 -3616 1937 -2072 469 -3558 1995 -2036 1975 -2066 1995 -2042 1989 -34678 531 -3560 391 -3622 1937 -2094 429 -3588 1967 -2070 1981 -2054 1965 -2038 2021 -34682 525 -3524 481 -3564 1989 -2040 445 -3554 1997 -2040 2005 -2034 2001 -2024 1991 -34706 517 -3586 409 -3610 1927 -2076 451 -3558 1967 -2074 1993 -2038 2001 -2040 1975 -34714 495 -3588 409 -3602 1933 -2088 447 -3584 1965 -2044 1999 -2036 2007 -2030 1995 -34692 525 -3538 447 -3580 1981 -2042 487 -3542 1995 -2040 1969 -2072 1969 -2044 1991 -34714 443 -3636 399 -3630 1899 -2106 413 -3584 1997 RAW_Data: -2034 2007 -2038 1969 -2076 1965 -34708 493 -3564 451 -3570 1965 -2074 449 -3548 2003 -2044 1987 -2038 1999 -2030 1991 -34710 493 -3602 403 -3612 1943 -2092 419 -3596 1963 -2062 1963 -2042 2001 -2064 1967 -34716 497 -3616 357 -3648 1903 -2132 399 -3596 1963 -2068 1977 -2052 1967 -2046 2019 -34684 497 -3614 359 -3650 1909 -2100 405 -3630 1925 -2098 1965 -2066 1965 -2056 1971 -34712 477 -3634 371 -3628 1931 -2104 391 -3624 1939 -2066 1975 -2052 2005 -2036 1985 -34714 449 -3668 337 -3664 1901 -2124 417 -3594 1963 -2048 1995 -2028 1993 -2066 1971 -34698 463 -3642 353 -3650 1943 -2066 433 -3594 1963 -2066 1995 -2034 1997 -2046 1981 -34730 479 -3560 445 -3562 1997 -2032 485 -3560 1965 -2062 1989 -2044 1999 -2032 1971 -34724 463 -3608 399 -3620 1943 -2096 421 -3592 1961 -2074 1979 -2036 2011 -2032 1971 -34734 469 -3558 485 -3552 1999 -2028 473 -3552 2003 -2032 2003 -2032 1997 -2044 1993 -34704 443 -3602 431 -3596 1967 -2076 447 -3556 1975 -2058 1997 -2040 1991 -2048 1971 -161100 97 -428 165 -200 395 -428 97 -100 559 -130 97 -164 129 -98 391 -98 295 -166 52395 -66 16239 -66 42541 -66 755 -132 14015 -98 2885 -68 10385 -98 40045 -100 987 -68 25539 -66 19799 -98 136101 -100 5141 -66 5709 -68 23177 -66 11097 -66 329 -100 261 -66 15755 -98 20575 -66 3645 -100 51411 -66 14441 -132 4467 -66 3965 -132 3707 -66 33107 -66 10373 -66 1775 -66 4185 -132 1429 -68 4675 -100 13419 -66 33985 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/linear_raw.sub ================================================ Filetype: Flipper SubGhz RAW File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: RAW RAW_Data: 361 -4326 2555 -28090 65 -302 65 -1890 131 -2062 2547 -95068 2565 -48020 67 -47036 2551 -30016 2561 -47778 67 -14884 2481 -95118 2537 -95132 2549 -48496 65 -21526 2571 -16342 97 -4142 65 -1938 2543 -95008 2551 -44030 1579 -548 1469 -588 433 -1568 469 -1540 479 -1550 1489 -538 473 -1574 1467 -538 1493 -566 443 -22130 693 -3742 321 -1702 341 -1690 1353 -628 391 -1666 1401 -584 1445 -596 391 -22192 1487 -554 1471 -550 447 -1584 453 -1568 445 -1578 1469 -550 459 -1598 1465 -540 1461 -576 445 -22164 1479 -546 1501 -544 453 -1568 447 -1580 445 -1584 1451 -560 443 -1594 1473 -548 1479 -556 441 -22160 1475 -548 1487 -554 449 -1578 451 -1586 451 -1572 1469 -552 449 -1578 1473 -558 1469 -552 449 -22142 1507 -546 1479 -548 457 -1574 447 -1580 447 -1584 1475 -554 441 -1592 1465 -546 1473 -546 483 -22132 1157 -1082 67 -166 65 -198 65 -1150 257 -1706 339 -1666 365 -1642 1409 -610 407 -1626 1417 -620 1435 -580 409 -22184 1495 -572 1463 -552 447 -1584 453 -1574 447 -1580 1473 -548 459 -1568 1501 -520 1501 -552 463 -22124 535 -7674 339 -1680 1345 -678 361 -1664 1395 -618 1411 -646 373 -22194 1511 -526 1477 -550 483 -1542 479 -1562 471 -1566 1483 -546 445 -1574 1471 -534 1497 -548 483 -169938 2539 -89172 167 -5768 2551 -93014 967 -252 1571 -5844 2503 -87590 65 -5948 2523 -64008 1605 -520 1473 -554 449 -1584 449 -1576 447 -1546 1505 -546 451 -1574 1469 -546 1475 -548 459 -22160 1525 -506 1501 -516 479 -1550 469 -1570 469 -1570 1471 -538 471 -1568 1489 -516 1501 -554 443 -22152 1507 -522 1511 -518 481 -1580 451 -1542 483 -1548 1505 -546 451 -1570 1471 -552 1473 -548 455 -22180 1505 -522 1501 -544 451 -1560 475 -1548 481 -1556 1477 -552 475 -1546 1505 -516 1517 -516 473 -22148 1515 -518 1499 -546 485 -1570 443 -1580 447 -1582 1475 -526 483 -1548 1507 -546 1479 -558 449 -22138 1495 -586 1437 -616 403 -1594 429 -1608 417 -1606 1465 -556 433 -1606 1465 -536 1499 -544 445 -22170 1401 -792 1245 -770 271 -1716 325 -1680 359 -1664 1397 -620 393 -1644 1407 -614 1433 -586 429 -22202 1477 -572 1469 -548 449 -1576 457 -1578 479 -1544 1473 -590 429 -1570 1491 -540 1509 -554 429 -22196 1481 -556 1467 -580 439 -1592 431 -1608 415 -1608 1441 -586 463 -1568 1467 -552 1489 -534 473 -22166 1485 -574 1469 -580 453 -1572 443 -1578 447 -1578 1477 -554 447 -1580 1479 -550 1481 -550 475 -22160 1525 -542 1467 -540 483 -1574 447 -1582 451 -1578 1481 -558 447 -1560 1493 -550 1505 -544 449 -22182 1435 -646 1391 -664 369 -1642 385 -1652 395 -1600 1463 -584 417 -1606 1467 -576 1443 -586 429 -148588 275 -106 847 -128 877 -100 281 -97826 2541 -92318 2505 -12474 2563 -73674 2555 -41600 2543 -76554 1601 -516 1471 -554 RAW_Data: 487 -1556 453 -1570 441 -1590 1467 -556 469 -1538 1501 -522 1501 -552 463 -22124 1513 -514 1509 -548 445 -1582 461 -1568 443 -1574 1467 -536 465 -1574 1499 -516 1503 -556 441 -22150 1537 -484 1495 -544 479 -1558 459 -1574 447 -1580 1471 -548 459 -1576 1471 -554 1471 -550 459 -22160 1517 -516 1503 -546 447 -1574 473 -1546 481 -1576 1479 -520 467 -1572 1497 -550 1469 -556 441 -22156 1533 -528 1495 -530 469 -1568 445 -1566 485 -1548 1505 -544 451 -1572 1471 -554 1503 -516 495 -22160 1511 -520 1477 -546 483 -1542 485 -1546 481 -1542 1509 -526 455 -1578 1507 -544 1481 -524 485 -22146 1543 -510 1481 -552 475 -1546 473 -1568 481 -1540 1503 -522 473 -1556 1507 -558 1491 -518 479 -22164 1523 -520 1503 -544 453 -1566 479 -1550 469 -1572 1493 -546 447 -1576 1477 -552 1509 -544 451 -22178 639 -596 65 -926 63 -1954 237 -1680 355 -1670 383 -1636 1423 -596 439 -1578 1471 -574 1465 -576 445 -22182 1439 -676 1335 -702 339 -1648 387 -1648 409 -1608 1429 -618 419 -1612 1447 -578 1439 -614 425 -22186 1497 -530 1505 -556 471 -1540 479 -1582 431 -1570 1497 -546 481 -1536 1497 -554 1501 -556 463 -22178 1503 -566 1433 -586 433 -1604 445 -1576 441 -1580 1503 -548 453 -1572 1473 -578 1467 -558 469 -149080 311 -1034 895 -1084 939 -1006 337 -78790 97 -6890 2535 -28048 2511 -64482 2573 -88138 65 -6956 2515 -95140 2509 -61986 1589 -522 1475 -548 449 -1576 475 -1548 481 -1546 1475 -564 443 -1564 1477 -580 1477 -554 449 -22166 1503 -532 1481 -544 447 -1576 449 -1572 473 -1548 1473 -580 451 -1568 1463 -552 1477 -552 461 -22164 1521 -528 1493 -548 443 -1580 461 -1540 475 -1574 1473 -554 471 -1568 1489 -516 1497 -538 471 -22154 1385 -786 1245 -796 261 -1702 341 -1650 391 -1644 1411 -608 409 -1620 1415 -624 1409 -614 413 -22178 1533 -498 1519 -546 445 -1576 449 -1578 457 -1568 1503 -546 451 -1570 1467 -554 1503 -552 463 -22162 1401 -774 1257 -754 297 -1678 353 -1650 383 -1666 1397 -618 385 -1642 1437 -612 1433 -586 427 -22194 1483 -552 1477 -546 485 -1544 453 -1576 481 -1576 1479 -560 449 -1548 1507 -546 1479 -558 447 -22170 1413 -786 1245 -776 295 -1664 337 -1680 387 -1652 1385 -638 407 -1614 1441 -582 1451 -606 409 -22204 1503 -528 1507 -550 465 -1534 481 -1584 429 -1572 1497 -548 447 -1580 1481 -550 1503 -546 455 -22166 1519 -552 1469 -580 419 -1612 419 -1596 447 -1582 1479 -554 447 -1582 1479 -550 1519 -518 479 -134730 169 -172 559 -194 579 -676 257 -87040 99 -7384 2269 -488 313 -37888 65 -12084 2515 -33298 2247 -474 309 -42656 63 -51970 2233 -456 309 -94658 2233 -430 325 -90692 357 -186 2417 -518 1517 -514 475 -1550 467 -1570 471 -1538 1499 -556 443 -1564 1483 -552 1501 -524 RAW_Data: 481 -22144 1433 -668 1373 -666 337 -1680 355 -1634 383 -1634 1431 -622 399 -1606 1443 -582 1443 -586 431 -22166 1521 -512 1497 -548 447 -1580 459 -1568 447 -1574 1473 -554 465 -1572 1497 -516 1507 -554 453 -22148 1503 -540 1489 -546 479 -1542 449 -1578 457 -1576 1475 -546 483 -1540 1507 -552 1473 -548 453 -22154 1539 -516 1469 -586 431 -1574 447 -1576 479 -1558 1485 -554 439 -1580 1501 -550 1457 -552 473 -22154 1521 -550 1485 -540 447 -1578 457 -1578 447 -1572 1471 -556 485 -1540 1483 -552 1501 -556 443 -22186 1437 -662 1345 -704 339 -1688 361 -1646 375 -1640 1399 -616 421 -1612 1441 -614 1435 -586 429 -22200 1513 -520 1503 -544 453 -1572 447 -1580 483 -1550 1475 -552 475 -1548 1501 -554 1491 -540 475 -22184 1499 -530 1485 -548 457 -1570 477 -1578 443 -1576 1501 -546 449 -1562 1499 -538 1493 -572 443 -22166 1471 -612 1429 -624 401 -1608 417 -1620 431 -1600 1461 -582 419 -1610 1441 -582 1473 -548 459 -205658 1761 -436 863 -68558 2597 -23434 1775 -438 519 -94592 1803 -422 829 -86706 1727 -434 527 -66 319 -94536 1753 -444 865 -238 1489 -652 1385 -656 357 -1668 365 -1628 403 -1612 1439 -614 403 -1626 1425 -588 1443 -584 409 -22168 1531 -528 1491 -530 469 -1568 443 -1564 483 -1538 1505 -546 455 -1570 1469 -556 1503 -518 491 -22128 1455 -660 1359 -686 355 -1632 385 -1632 411 -1640 1411 -596 423 -1606 1437 -580 1443 -596 423 -22188 1495 -550 1467 -534 473 -1566 481 -1540 483 -1572 1477 -552 449 -1582 1477 -558 1471 -552 449 -22174 543 -3692 235 -1680 357 -1668 353 -1698 1375 -636 371 -1644 1409 -610 1437 -578 449 -22180 1499 -542 1491 -542 479 -1540 481 -1566 449 -1562 1499 -554 465 -1568 1463 -554 1493 -536 473 -22168 1405 -774 1257 -788 267 -1676 355 -1672 369 -1660 1387 -624 417 -1606 1427 -624 1425 -586 415 -22208 1507 -552 1489 -548 443 -1562 483 -1550 481 -1546 1505 -558 447 -1586 1473 -548 1481 -554 479 -22166 1383 -786 1245 -776 295 -1664 373 -1646 387 -1644 1403 -642 411 -1624 1417 -594 1445 -612 409 -22210 1515 -516 1503 -554 453 -1564 457 -1572 447 -1580 1501 -554 465 -1570 1467 -554 1493 -570 443 -195814 1353 -442 1267 -37900 99 -53710 411 -142 2207 -8336 2487 -46990 1301 -452 1317 -86162 65 -8376 1289 -444 1327 -94552 1311 -488 1251 -1726 1531 -544 1467 -580 417 -1578 457 -1578 443 -1576 1475 -566 441 -1568 1503 -512 1509 -526 455 -22168 1473 -582 1469 -538 483 -1538 459 -1574 447 -1580 1471 -582 429 -1572 1469 -552 1473 -548 461 -22170 1437 -640 1401 -620 393 -1636 385 -1634 409 -1604 1457 -588 415 -1608 1431 -590 1459 -554 449 -22188 1483 -556 1487 -542 445 -1578 459 -1576 443 -1574 1473 -556 469 -1570 1459 -550 1503 -554 443 -22160 1469 -590 RAW_Data: 1469 -582 409 -1620 429 -1608 415 -1602 1455 -568 441 -1578 1475 -552 1479 -560 467 -22166 1483 -572 1463 -546 451 -1580 453 -1580 481 -1542 1475 -588 451 -1570 1453 -550 1503 -540 469 -22158 1505 -554 1475 -554 487 -1556 453 -1562 477 -1546 1495 -546 479 -1544 1511 -554 1477 -532 471 -22180 1471 -602 1437 -602 407 -1610 421 -1614 421 -1606 1433 -582 457 -1578 1475 -550 1469 -586 465 -22164 1515 -546 1469 -546 483 -1572 447 -1558 471 -1580 1471 -578 451 -1568 1495 -542 1497 -530 471 -22194 1433 -644 1393 -662 371 -1640 385 -1642 413 -1628 1431 -584 431 -1602 1469 -540 1501 -576 443 -22180 1479 -592 1439 -608 407 -1620 427 -1610 415 -1606 1465 -570 441 -1612 1441 -586 1451 -576 445 -22196 1533 -522 1489 -540 477 -1574 481 -1544 455 -1568 1505 -546 459 -1572 1501 -556 1497 -530 471 -210202 685 -540 475 -138 839 -138 239 -9950 2501 -71112 761 -462 511 -66 1297 -85614 97 -8850 745 -466 1821 -94546 827 -468 481 -140 815 -164 237 -32934 1583 -540 1477 -554 441 -1582 447 -1580 453 -1568 1465 -554 479 -1556 1487 -558 1477 -550 453 -22174 1503 -516 1483 -584 429 -1572 449 -1576 447 -1588 1475 -558 449 -1580 1473 -546 1485 -556 449 -22168 1469 -586 1443 -614 401 -1624 401 -1608 415 -1608 1463 -570 441 -1574 1471 -586 1449 -572 445 -22164 1401 -772 1255 -756 301 -1674 353 -1708 329 -1662 1397 -650 387 -1632 1405 -614 1433 -584 431 -22200 1489 -566 1463 -582 419 -1580 457 -1596 447 -1576 1473 -554 443 -1580 1469 -582 1451 -550 479 -22174 1387 -786 1251 -792 257 -1704 331 -1690 337 -1706 1377 -632 395 -1632 1433 -586 1451 -584 413 -22198 1541 -512 1485 -554 481 -1574 445 -1560 461 -1568 1495 -556 469 -1568 1495 -518 1503 -554 469 -22160 1541 -516 1501 -556 443 -1564 495 -1536 479 -1550 1517 -544 445 -1576 1507 -556 1485 -542 445 -22202 1501 -530 1503 -554 465 -1574 445 -1582 461 -1574 1469 -546 479 -1568 1471 -556 1513 -550 463 -22170 1473 -614 1419 -602 439 -1614 417 -1610 415 -1590 1465 -588 429 -1606 1469 -586 1455 -570 441 -22200 1407 -760 1277 -772 267 -1692 363 -1678 355 -1668 1393 -660 369 -1642 1441 -584 1449 -574 445 -22206 1533 -528 1497 -530 471 -1572 449 -1576 455 -1578 1507 -544 455 -1572 1503 -556 1467 -560 469 -22188 1439 -678 1347 -672 375 -1648 393 -1646 387 -1636 1431 -588 431 -1610 1439 -618 1437 -596 437 -143610 67 -510 99 -66 223 -272 173 -70 273 -204 235 -64 483 -26542 2521 -65448 297 -348 2417 -76720 65 -8388 65 -9450 203 -332 587 -72 885 -92 899 -27534 67 -39500 221 -406 521 -72 885 -98 919 -29920 1581 -534 1491 -548 445 -1580 461 -1544 477 -1574 1465 -556 473 -1568 1455 -554 1501 -524 483 -22136 1529 -498 RAW_Data: 1493 -576 441 -1568 469 -1574 447 -1576 1465 -548 481 -1544 1503 -542 1473 -554 449 -22176 1499 -530 1505 -554 463 -1540 479 -1546 479 -1558 1483 -556 449 -1580 1473 -548 1483 -552 447 -22198 1511 -508 1507 -554 441 -1580 453 -1586 453 -1576 1473 -548 451 -1586 1475 -554 1499 -554 445 -22180 1503 -526 1481 -550 481 -1544 485 -1574 449 -1566 1479 -548 461 -1572 1503 -540 1499 -530 471 -22192 1499 -530 1475 -584 433 -1572 475 -1586 429 -1570 1495 -548 449 -1578 1473 -552 1505 -546 455 -22202 1499 -544 1469 -562 471 -1570 447 -1580 457 -1568 1505 -544 451 -1574 1471 -554 1503 -554 465 -22160 1533 -530 1485 -548 459 -1600 443 -1576 441 -1580 1505 -544 455 -1568 1497 -556 1495 -530 473 -22200 1499 -544 1491 -544 479 -1572 451 -1572 447 -1578 1479 -550 493 -1564 1465 -590 1451 -576 445 -22198 1531 -532 1483 -548 479 -1542 483 -1576 449 -1562 1501 -554 465 -1574 1469 -556 1491 -572 445 -22196 1533 -528 1495 -532 473 -1574 449 -1580 457 -1576 1505 -546 453 -1572 1503 -556 1465 -558 471 -22200 1499 -530 1517 -552 463 -1568 445 -1580 457 -1578 1471 -578 451 -1574 1473 -554 1503 -556 469 -22188 1501 -554 1473 -544 479 -1592 461 -1568 447 -1576 1493 -552 453 -1584 1475 -554 1503 -554 471 -141048 233 -68 741 -68 133 -100 467 -49002 2539 -43448 2529 -91062 2557 -95072 2545 -89712 641 -300 1759 -3612 463 -9880 1221 -712 327 -1694 1367 -616 1445 -582 409 -22192 1505 -522 1497 -554 447 -1584 455 -1570 449 -1578 1473 -548 459 -1572 1475 -576 1465 -554 469 -22142 1507 -526 1509 -548 455 -1574 447 -1578 447 -1580 1479 -554 441 -1580 1467 -584 1457 -554 445 -22200 1513 -510 1509 -526 473 -1562 481 -1554 455 -1574 1473 -544 479 -1556 1481 -550 1497 -554 453 -22156 1529 -524 1497 -552 453 -1588 451 -1574 449 -1582 1475 -546 455 -1572 1505 -520 1503 -554 465 -22156 1537 -516 1485 -548 459 -1570 481 -1550 467 -1570 1495 -548 447 -1576 1493 -552 1481 -548 459 -22194 1513 -524 1481 -578 453 -1574 451 -1564 485 -1558 1477 -556 449 -1580 1471 -582 1491 -516 479 -22170 1535 -530 1499 -548 449 -1580 457 -1574 445 -1576 1511 -554 431 -1572 1497 -548 1507 -556 429 -22194 1523 -546 1473 -568 429 -1598 443 -1606 451 -1574 1471 -546 485 -1562 1481 -554 1503 -540 471 -22190 1387 -788 1277 -776 263 -1696 335 -1680 385 -1652 1385 -638 407 -1614 1445 -594 1445 -612 411 -22212 1541 -518 1499 -554 445 -1562 461 -1568 475 -1560 1495 -554 481 -1556 1487 -552 1507 -556 443 -22214 1521 -514 1507 -552 451 -1570 461 -1606 447 -1578 1483 -556 467 -1572 1471 -552 1491 -574 445 -22232 1507 -528 1481 -562 473 -1574 447 -1580 457 -1578 1505 -546 459 -1574 1471 -588 1461 -562 473 -22200 1431 -694 RAW_Data: 1341 -740 305 -1690 361 -1644 387 -1670 1391 -626 403 -1644 1441 -598 1443 -608 411 -22244 1515 -518 1501 -552 439 -1598 469 -1572 447 -1576 1495 -554 453 -1586 1475 -552 1501 -554 467 -182986 65 -11040 2545 -94994 2537 -94978 2557 -10004 2527 -82554 2547 -84234 65 -10744 2497 -32446 1555 -544 1479 -558 421 -1608 447 -1582 451 -1542 1509 -552 449 -1548 1507 -528 1479 -550 481 -22134 1537 -518 1483 -548 457 -1566 477 -1574 441 -1572 1465 -552 481 -1576 1445 -586 1453 -552 477 -22154 1519 -522 1503 -546 449 -1570 441 -1578 485 -1558 1481 -558 449 -1550 1505 -544 1479 -558 449 -22154 1515 -542 1479 -556 447 -1594 459 -1544 475 -1570 1467 -558 469 -1566 1491 -548 1465 -558 487 -22132 1403 -776 1249 -800 271 -1678 357 -1648 393 -1634 1399 -650 389 -1610 1441 -610 1437 -584 429 -22204 1499 -528 1505 -552 463 -1574 447 -1578 443 -1558 1485 -552 479 -1548 1491 -574 1467 -546 483 -22168 1453 -632 1431 -614 389 -1614 419 -1634 411 -1584 1453 -616 391 -1636 1431 -582 1479 -554 443 -22204 887 -198 67 -950 65 -194 63 -200 65 -498 65 -910 261 -1696 339 -1646 387 -1650 1417 -640 377 -1614 1441 -612 1439 -618 401 -22186 1539 -516 1505 -556 437 -1596 463 -1572 447 -1582 1477 -546 481 -1540 1505 -552 1499 -554 453 -22184 1529 -500 1497 -586 431 -1570 471 -1576 447 -1576 1477 -552 481 -1580 1479 -558 1473 -554 481 -168716 2521 -95042 2539 -94986 2535 -25722 2535 -26624 2505 -18626 99 -76268 2541 -94974 2559 -17198 65 -6348 67 -42186 2539 -17892 131 -93800 99 -394 65 -7158 1331 -448 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/magellan.sub ================================================ Filetype: Flipper SubGhz Key File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: Magellan Bit: 32 Key: 00 00 00 00 37 AE 48 28 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/magellan_raw.sub ================================================ Filetype: Flipper SubGhz RAW File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: RAW RAW_Data: 29262 361 -68 2635 -66 24113 -66 1131 -100 4157 -66 26253 -130 621 -18438 99 -298 231 -66 197 -496 753 -230 7503 -16526 65 -396 65 -296 99 -196 293 -64 429 -132 397 -66 329 -66 37701 -66 13475 -100 54967 -64 18209 -18340 97 -462 197 -98 587 -232 97 -100 259 -98 197 -262 297 -64 557 -100 599 -100 333 -234 42493 -13212 6449 -206 173 -214 217 -176 195 -218 181 -218 181 -182 217 -182 217 -176 187 -214 215 -180 217 -182 217 -182 217 -178 185 -424 1177 -388 387 -240 381 -214 181 -398 211 -380 419 -176 217 -394 203 -394 205 -380 189 -402 421 -168 219 -398 393 -190 191 -398 205 -406 185 -402 381 -212 215 -362 241 -378 421 -176 377 -218 197 -378 427 -210 393 -172 429 -172 397 -212 217 -362 389 -228 197 -372 417 -204 395 -210 181 -398 391 -192 201 -216888 761 -200 299 -166 695 -132 15435 -66 5611 -66 21049 -66 4947 -66 2355 -66 1921 -100 2223 -100 2107 -100 397 -98 3643 -66 5301 -98 14205 -66 37371 -246 175 -216 179 -216 177 -224 149 -246 159 -228 181 -212 201 -204 159 -244 151 -254 169 -214 181 -210 197 -182 181 -454 1141 -444 357 -228 361 -246 177 -396 209 -412 367 -188 187 -434 201 -394 185 -406 193 -402 377 -238 181 -386 381 -234 153 -424 205 -412 157 -412 383 -240 181 -398 203 -392 385 -236 371 -212 179 -400 383 -240 359 -210 375 -220 381 -246 175 -394 383 -240 181 -398 363 -222 379 -246 175 -394 383 -204 217 -182856 99 -66 99 -300 133 -402 65 -198 99 -328 65 -100 491 -164 593 -100 3547 -64 361 -66 789 -68 2521 -66 22883 -66 2659 -98 3309 -130 3789 -100 9689 -17178 99 -1388 65 -266 197 -100 131 -134 99 -232 627 -130 233 -66 1949 -100 14567 -198 165 -256 181 -208 159 -214 183 -220 163 -244 149 -246 159 -236 181 -254 141 -226 151 -246 157 -228 181 -212 201 -400 1163 -428 379 -230 355 -244 177 -396 207 -412 367 -222 157 -418 189 -410 207 -412 171 -430 357 -226 165 -404 413 -204 181 -428 173 -428 169 -426 353 -236 173 -414 173 -408 381 -244 337 -222 201 -408 397 -208 393 -204 395 -208 359 -246 177 -394 387 -200 205 -380 415 -202 395 -208 181 -432 357 -226 169 -195084 65 -300 763 -66 297 -364 593 -68 2883 -66 1357 -68 363 -98 3841 -66 3119 -66 5153 -66 4023 -268 143 -246 133 -290 141 -250 139 -254 141 -226 181 -248 137 -254 143 -252 139 -252 143 -230 181 -250 139 -254 145 -436 1135 -448 349 -240 347 -254 157 -434 167 -426 377 -226 157 -434 167 -426 155 -440 163 -434 375 -206 215 -380 381 -234 153 RAW_Data: -424 205 -412 159 -412 381 -240 181 -398 203 -392 387 -236 369 -212 179 -400 383 -240 359 -244 339 -222 381 -246 175 -394 383 -240 181 -398 363 -222 381 -244 175 -392 383 -240 181 -184002 99 -360 63 -330 65 -132 129 -232 97 -198 295 -328 6031 -66 831 -132 3417 -66 2187 -64 2183 -100 6535 -66 1127 -66 2569 -66 2031 -66 2271 -66 2183 -66 3815 -66 3803 -66 493 -66 1909 -66 1627 -98 4805 -17512 67 -2164 131 -498 265 -430 163 -98 97 -64 99 -230 99 -100 229 -230 165 -196 63 -132 99 -66 927 -66 14955 -66 19621 -68 2627 -66 14305 -68 23247 -66 2891 -66 3941 -66 3021 -212 173 -242 181 -218 181 -214 181 -208 157 -250 141 -248 181 -218 179 -214 179 -210 159 -250 179 -214 181 -218 181 -404 1153 -404 389 -244 375 -192 181 -436 161 -414 383 -240 181 -398 205 -392 201 -394 205 -394 365 -246 177 -396 383 -204 217 -398 171 -426 167 -428 353 -242 173 -420 173 -408 373 -220 403 -208 175 -422 381 -194 399 -228 357 -246 355 -210 215 -400 387 -208 181 -398 391 -226 353 -246 177 -398 383 -204 217 -185098 163 -166 525 -98 293 -100 63 -66 229 -66 1183 -66 1507 -66 3089 -98 30187 -66 2847 -19112 133 -364 131 -394 97 -166 295 -66 229 -164 227 -66 263 -130 623 -98 2071 -66 493 -66 787 -98 691 -64 10249 -132 3879 -66 1949 -66 3453 -198 23157 -66 2845 -100 1193 -66 1587 -100 3797 -98 3187 -100 3319 -66 22119 -98 5513 -226 155 -244 153 -256 131 -248 151 -246 159 -262 121 -274 133 -272 127 -244 153 -254 167 -248 145 -244 133 -252 177 -398 1169 -418 381 -238 359 -242 141 -430 169 -426 357 -274 139 -422 171 -442 173 -428 167 -426 353 -236 171 -416 379 -226 149 -436 161 -438 173 -406 381 -234 153 -424 205 -380 389 -244 359 -206 215 -384 381 -246 335 -224 383 -246 355 -244 179 -404 385 -206 181 -432 359 -226 355 -246 175 -398 383 -240 181 -179760 97 -168 727 -66 97 -332 1389 -66 2793 -66 4955 -100 12453 -100 2425 -66 21965 -66 3809 -68 1683 -66 3095 -66 2153 -64 999 -208 173 -220 181 -214 191 -196 181 -212 183 -220 191 -212 181 -214 191 -198 181 -212 181 -222 191 -212 181 -214 191 -416 1167 -424 369 -220 373 -210 209 -390 207 -376 403 -190 187 -418 189 -408 209 -412 173 -428 357 -226 169 -404 399 -208 179 -412 209 -396 169 -428 355 -230 201 -378 205 -406 381 -244 339 -222 193 -400 413 -204 393 -208 347 -220 401 -210 175 -422 383 -202 217 -398 365 -222 377 -246 175 -390 385 -204 217 -179890 165 -1552 131 -164 65 RAW_Data: -1448 361 -17056 131 -134 233 -1462 131 -166 953 -100 261 -164 5077 -272 137 -268 143 -252 141 -248 143 -246 159 -252 141 -244 143 -290 107 -276 145 -244 131 -250 179 -248 143 -252 141 -414 1165 -424 373 -236 359 -242 145 -434 169 -428 355 -230 169 -442 173 -434 157 -406 193 -402 379 -238 181 -422 335 -252 157 -434 167 -428 185 -406 381 -208 211 -390 207 -410 381 -200 373 -236 171 -414 383 -202 393 -210 379 -220 373 -208 211 -390 383 -204 217 -398 365 -220 379 -244 175 -394 381 -240 181 -161030 97 -166 167 -930 593 -2670 1091 -132 229 -98 461 -164 1649 -66 6311 -100 44723 -16832 67 -2656 131 -132 99 -132 263 -100 399 -68 893 -18950 99 -164 165 -198 525 -998 335 -66 565 -66 1057 -17880 97 -360 195 -262 131 -332 625 -98 197 -230 455 -98 9343 -16498 67 -368 131 -598 65 -1066 333 -300 789 -130 757 -66 87207 -16554 97 -3520 97 -786 591 -64 461 -98 21495 -66 24811 -18448 131 -296 491 -134 163 -760 1091 -230 893 -66 927 -68 4581 -68 32965 -64 45217 -17292 131 -1684 231 -132 327 -64 163 -330 263 -230 25751 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/marantec.sub ================================================ Filetype: Flipper SubGhz Key File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: Marantec Bit: 49 Key: 00 01 30 07 10 DF 86 9F ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/marantec24.sub ================================================ Filetype: Flipper SubGhz Key File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: Marantec24 Bit: 24 Key: 00 00 00 00 00 AC 05 C4 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/marantec24_raw.sub ================================================ Filetype: Flipper SubGhz RAW File Version: 1 Frequency: 868350000 Preset: FuriHalSubGhzPresetOok650Async Protocol: RAW RAW_Data: 1224 -1300 1801 -3200 1615 -2374 821 -3198 1603 -2410 785 -3196 815 -3188 1605 -2398 1605 -2398 1607 -2400 1605 -2398 1605 -2396 1601 -2400 1605 -2398 809 -3184 1603 -2396 815 -3194 811 -3190 811 -3194 1603 -2398 1603 -2398 1601 -2392 811 -3194 1605 -2394 1607 -16170 131 -196 217 -493440 135 -1296 1807 -3210 1591 -2396 811 -3198 1591 -2394 807 -3218 807 -3188 1607 -2400 1605 -2394 1599 -2402 1601 -2392 1609 -2400 1605 -2392 1603 -2392 815 -3190 1609 -2402 809 -3188 813 -3192 813 -3190 1605 -2400 1603 -2396 1605 -2396 813 -3194 1601 -2402 1601 -16170 133 -200 219 -382462 101 -1314 1813 -3194 1581 -2414 801 -3214 1605 -2398 807 -3190 811 -3190 1601 -2394 1603 -2398 1607 -2398 1605 -2396 1605 -2394 1601 -2394 1609 -2396 815 -3194 1603 -2400 809 -3194 811 -3190 811 -3190 1603 -2396 1603 -2396 1607 -2398 811 -3192 1607 -2396 1601 -16176 131 -198 217 -348436 303 -1106 1817 -3194 1609 -2386 803 -3214 1597 -2392 811 -3186 815 -3192 1611 -2396 1601 -2394 1609 -2404 1605 -2396 1605 -2396 1607 -2392 1601 -2396 813 -3192 1603 -2394 813 -3190 815 -3188 811 -3194 1601 -2396 1607 -2394 1601 -2396 815 -3186 1611 -2396 1609 -16168 131 -198 217 -349492 347 -1080 1799 -3192 1617 -2388 801 -3218 1601 -2396 809 -3190 809 -3192 1605 -2394 1599 -2394 1605 -2398 1607 -2398 1599 -2398 1607 -2396 1601 -2396 811 -3192 1605 -2400 811 -3184 813 -3192 811 -3192 1607 -2398 1601 -2398 1607 -2400 811 -3190 1603 -2394 1607 -16176 131 -204 213 -447994 135 -1330 977 -1036 65 -230 181 -514880 135 -66 67 -1140 1815 -3192 1615 -2388 803 -3214 1603 -2396 813 -3190 811 -3190 1609 -2398 1601 -2392 1603 -2396 1607 -2398 1607 -2398 1607 -2398 1605 -2394 813 -3186 1611 -2404 809 -3186 811 -3192 813 -3188 1605 -2394 1607 -2400 1607 -2398 807 -3190 1605 -2398 1603 -16172 131 -200 217 -395118 99 -1304 1841 -3160 1621 -2388 805 -3186 1631 -2392 809 -3182 811 -3188 1605 -2402 1601 -2398 1601 -2402 1607 -2398 1605 -2398 1601 -2392 1605 -2404 809 -3188 1599 -2396 817 -3192 811 -3192 811 -3190 1599 -2392 1603 -2398 1607 -2404 809 -3192 1603 -2402 1605 -16164 133 -198 187 -382202 137 -1302 1803 -3192 1601 -2404 803 -3184 1633 -2392 807 -3190 811 -3188 1601 -2400 1607 -2402 1601 -2392 1601 -2396 1607 -2400 1603 -2398 1605 -2398 811 -3184 1601 -2400 813 -3188 809 -3190 811 -3192 1605 -2400 1605 -2396 1599 -2402 809 -3192 1607 -2400 1607 -16174 99 -232 181 -361858 65 -1368 1785 -3228 1567 -2426 777 -3222 1601 -2402 785 -3198 815 -3186 1609 -2402 1601 -2396 1605 -2402 1603 -2396 1605 -2398 1601 -2400 1603 -2398 813 -3194 1605 -2400 809 -3186 813 -3190 813 -3188 1607 -2396 1605 -2400 1605 -2394 809 -3182 1607 -2400 1607 -16210 65 -236 177 -379100 1819 -3192 1611 -2384 799 -3220 1601 -2396 811 -3186 809 -3188 1605 -2394 1607 -2398 RAW_Data: 1599 -2394 1603 -2396 1609 -2402 1603 -2396 1607 -2398 809 -3196 1603 -2394 809 -3188 813 -3194 809 -3188 1605 -2394 1599 -2396 1609 -2404 811 -3184 1605 -2400 1601 -16162 133 -234 191 -393094 97 -1316 1021 -1010 67 -246 173 -677840 131 -64 59 -1178 1773 -3210 1593 -2430 773 -3222 1601 -2396 811 -3186 813 -3190 1603 -2398 1603 -2396 1607 -2398 1605 -2400 1601 -2396 1605 -2396 1601 -2396 815 -3190 1607 -2402 811 -3190 811 -3186 811 -3192 1607 -2396 1603 -2396 1601 -2400 813 -3188 1607 -2404 1607 -15160 827 -3204 1577 -2404 813 -3200 1591 -2390 807 -3220 807 -3186 1599 -2400 1605 -2398 1603 -2400 1603 -2396 1605 -2398 1605 -2398 1599 -2394 809 -3190 1611 -2394 809 -3186 815 -3192 809 -3192 1603 -2398 1601 -2396 1599 -2396 815 -3188 1609 -2400 1605 -15178 801 -3222 1575 -2392 805 -3190 1615 -2396 809 -3190 819 -3198 1601 -2402 1577 -2402 1609 -2400 1605 -2398 1605 -2396 1605 -2398 1601 -2400 809 -3184 1605 -2396 809 -3190 811 -3192 813 -3190 1601 -2404 1605 -2394 1599 -2396 811 -3190 1605 -2400 1601 -15174 831 -3166 1615 -2396 783 -3200 1611 -2398 813 -3192 811 -3188 1601 -2396 1603 -2398 1607 -2396 1605 -2396 1603 -2398 1601 -2394 1601 -2398 811 -3192 1601 -2394 813 -3192 809 -3194 807 -3190 1605 -2394 1599 -2394 1601 -2394 813 -3194 1601 -2398 1603 -15178 793 -3228 1577 -2404 809 -3186 1611 -2396 815 -3192 811 -3188 1605 -2400 1577 -2404 1603 -2396 1607 -2400 1601 -2398 1603 -2394 1605 -2396 811 -3192 1605 -2394 811 -3190 811 -3188 807 -3186 1601 -2396 1605 -2398 1601 -2398 813 -3186 1601 -2394 1605 -15178 797 -3204 1581 -2400 813 -3188 1603 -2400 813 -3192 811 -3192 1607 -2398 1605 -2398 1607 -2394 1601 -2400 1605 -2398 1601 -2396 1601 -2394 809 -3190 1605 -2400 811 -3186 813 -3192 811 -3184 1601 -2396 1605 -2396 1605 -2400 809 -3184 1599 -2400 1605 -15146 827 -3188 1613 -2402 785 -3200 1605 -2396 815 -3192 811 -3190 1605 -2396 1605 -2396 1607 -2398 1601 -2398 1601 -2392 1599 -2398 1603 -2398 811 -3186 1605 -2396 811 -3190 811 -3192 809 -3190 1597 -2394 1599 -2398 1605 -2398 813 -3186 1599 -2396 1605 -15176 793 -3226 1577 -2398 817 -3198 1605 -2370 817 -3192 813 -3192 1609 -2396 1601 -2396 1605 -2396 1603 -2394 1605 -2394 1607 -2398 1607 -2394 809 -3188 1605 -2400 811 -3194 809 -3188 811 -3192 1605 -2400 1603 -2388 1605 -2394 811 -3186 1605 -2396 1605 -15180 797 -3202 1605 -2398 781 -3196 1605 -2396 815 -3184 817 -3196 1603 -2398 1605 -2398 1605 -2400 1603 -2394 1601 -2396 1607 -2398 1605 -2396 811 -3188 1605 -2396 809 -3186 807 -3194 811 -3194 1603 -2396 1597 -2396 1605 -2396 811 -3192 1603 -2396 1601 -15146 831 -3190 1603 -2404 777 -3224 1605 -2398 785 -3196 813 -3192 1607 -2396 1601 -2398 1607 -2394 1605 -2398 1603 -2394 1601 -2400 1599 -2396 807 -3192 1603 -2396 809 -3186 RAW_Data: 813 -3190 809 -3190 1603 -2400 1603 -2398 1599 -2390 813 -3192 1603 -2394 1603 -15146 823 -3204 1603 -2398 787 -3204 1595 -2388 805 -3216 807 -3192 1605 -2400 1601 -2398 1597 -2394 1605 -2396 1603 -2398 1605 -2392 1601 -2396 809 -3192 1605 -2398 807 -3190 809 -3186 811 -3194 1603 -2394 1605 -2394 1599 -2398 813 -3192 1609 -2394 1603 -15174 795 -3206 1605 -2398 783 -3196 1607 -2400 809 -3188 813 -3188 1609 -2402 1601 -2394 1609 -2396 1603 -2396 1603 -2400 1599 -2388 1599 -2400 811 -3192 1607 -2394 811 -3186 811 -3190 809 -3194 1603 -2400 1599 -2394 1601 -2392 813 -3192 1603 -2396 1605 -15162 799 -3218 1581 -2404 807 -3202 1603 -2396 787 -3196 819 -3192 1611 -2394 1603 -2396 1607 -2402 1601 -2392 1599 -2392 1601 -2400 1607 -2398 811 -3192 1603 -2396 811 -3190 813 -3188 813 -3186 1603 -2394 1601 -2392 1605 -2400 809 -3188 1609 -2394 1601 -15156 829 -3188 1601 -2414 797 -3182 1629 -2394 807 -3192 811 -3188 1603 -2398 1599 -2392 1603 -2398 1603 -2396 1603 -2396 1607 -2400 1607 -2392 809 -3186 1603 -2400 813 -3194 811 -3192 809 -3188 1599 -2400 1603 -2404 1609 -2394 809 -3194 1599 -2394 1607 -15176 829 -3158 1623 -2404 773 -3224 1605 -2386 799 -3210 811 -3190 1607 -2392 1605 -2398 1607 -2400 1601 -2388 1605 -2398 1603 -2402 1599 -2392 809 -3188 1605 -2400 811 -3186 813 -3190 809 -3190 1603 -2396 1599 -2404 1603 -2400 809 -3188 1605 -2396 1607 -15146 829 -3216 1561 -2414 817 -3196 1599 -2404 797 -3180 809 -3212 1607 -2400 1601 -2394 1603 -2400 1603 -2396 1599 -2400 1605 -2396 1605 -2394 813 -3186 1607 -2394 811 -3186 809 -3190 813 -3192 1607 -2398 1603 -2398 1601 -2396 813 -3192 1603 -2392 1605 -15144 827 -3188 1613 -2404 809 -3192 1615 -2370 811 -3188 811 -3188 1611 -2398 1603 -2400 1601 -2394 1601 -2402 1605 -2396 1601 -2394 1609 -2398 811 -3186 1603 -2392 813 -3196 811 -3182 809 -3188 1603 -2402 1605 -2400 1599 -2394 809 -3194 1607 -2398 1601 -15148 831 -3186 1587 -2424 811 -3192 1575 -2408 803 -3188 805 -3222 1599 -2392 1601 -2400 1609 -2398 1601 -2392 1597 -2394 1601 -2400 1601 -2400 807 -3190 1601 -2400 813 -3190 809 -3190 809 -3188 1607 -2398 1601 -2396 1605 -2398 809 -3184 1603 -2400 1605 -15176 795 -3200 1613 -2400 783 -3198 1603 -2398 813 -3192 809 -3186 1607 -2398 1605 -2398 1605 -2398 1599 -2394 1605 -2398 1603 -2392 1599 -2396 809 -3194 1609 -2390 811 -3194 813 -3188 811 -3188 1599 -2394 1603 -2398 1601 -2394 815 -3192 1605 -2402 1601 -15150 831 -3186 1605 -2412 799 -3206 1601 -2392 809 -3186 813 -3192 1603 -2402 1601 -2392 1605 -2398 1607 -2396 1601 -2392 1609 -2402 1599 -2396 811 -3186 1601 -2398 815 -3196 809 -3188 809 -3188 1607 -2394 1605 -2394 1603 -2394 811 -3194 1603 -2398 1607 -15174 797 -3218 1563 -2424 785 -3194 1633 -2396 795 -3178 805 -3214 1607 -2394 1603 -2400 RAW_Data: 1603 -2392 1603 -2398 1605 -2400 1597 -2392 1603 -2396 811 -3198 1603 -2390 809 -3192 811 -3188 813 -3192 1599 -2394 1607 -2398 1607 -2394 811 -3192 1601 -2394 1605 -15152 861 -3154 1603 -2410 799 -3186 1601 -2422 809 -3190 809 -3186 1601 -2392 1603 -2394 1611 -2398 1605 -2400 1601 -2392 1609 -2396 1603 -2398 809 -3186 1605 -2400 811 -3188 811 -3188 807 -3192 1605 -2402 1597 -2392 1603 -2396 813 -3194 1601 -2398 1605 -15174 795 -3200 1597 -2428 785 -3196 1613 -2398 785 -3192 815 -3192 1611 -2400 1603 -2394 1603 -2400 1601 -2398 1607 -2394 1603 -2398 1603 -2396 811 -3190 1605 -2394 811 -3194 811 -3182 811 -3192 1607 -2392 1599 -2394 1601 -2398 811 -3192 1607 -2392 1603 -15156 827 -3190 1607 -2408 797 -3210 1599 -2398 777 -3218 811 -3192 1601 -2400 1599 -2398 1601 -2396 1597 -2396 1601 -2392 1607 -2392 1605 -2400 813 -3190 1601 -2396 811 -3194 809 -3190 813 -3190 1603 -2394 1599 -2390 1603 -2400 811 -3190 1607 -2398 1605 -15150 825 -3192 1603 -2404 793 -3178 1605 -2422 777 -3222 775 -3218 1603 -2398 1605 -2398 1597 -2392 1603 -2398 1605 -2400 1601 -2394 1601 -2392 811 -3192 1609 -2398 813 -3190 809 -3182 809 -3184 1607 -2398 1603 -2396 1607 -2398 813 -3190 1607 -2396 1601 -15172 797 -3230 1563 -2424 805 -3190 1599 -2404 795 -3182 807 -3214 1601 -2402 1603 -2396 1601 -2396 1603 -2398 1605 -2398 1599 -2392 1601 -2402 813 -3192 1601 -2396 809 -3188 811 -3188 809 -3192 1605 -2400 1607 -2398 1599 -2394 809 -3190 1607 -2400 1605 -15180 827 -3190 1577 -2394 819 -3196 1613 -2366 815 -3196 813 -3190 1607 -2396 1607 -2402 1599 -2398 1605 -2400 1603 -2398 1601 -2392 1605 -2400 811 -3186 1603 -2400 813 -3190 809 -3196 807 -3182 1601 -2396 1609 -2398 1601 -2398 813 -3192 1601 -2394 1607 -15174 793 -3202 1599 -2424 787 -3196 1607 -2404 785 -3192 815 -3188 1609 -2404 1603 -2398 1607 -2396 1601 -2400 1603 -2394 1601 -2394 1603 -2400 811 -3190 1605 -2400 811 -3188 809 -3190 813 -3194 1597 -2398 1607 -2394 1603 -2394 809 -3190 1603 -2392 1607 -15180 795 -3230 1581 -2392 807 -3218 1593 -2408 777 -3220 781 -3204 1597 -2424 1605 -2394 1595 -2392 1605 -2394 1599 -2396 1605 -2402 1603 -2394 809 -3188 1601 -2396 813 -3194 811 -3188 813 -3190 1605 -2398 1607 -2392 1601 -2398 811 -3192 1599 -2400 1605 -15178 797 -3218 1595 -2400 803 -3198 1605 -2370 825 -3182 803 -3214 1603 -2396 1601 -2398 1601 -2394 1599 -2398 1603 -2396 1607 -2394 1605 -2394 809 -3190 1607 -2398 809 -3194 811 -3188 809 -3194 1605 -2394 1599 -2396 1605 -2396 809 -3196 1603 -2402 1599 -15160 829 -3192 1579 -2400 817 -3198 1605 -2398 783 -3194 813 -3190 1609 -2400 1607 -2400 1599 -2394 1601 -2394 1609 -2398 1601 -2396 1605 -2394 809 -3186 1609 -2400 811 -3186 809 -3196 811 -3190 1605 -2396 1601 -2398 1607 -2396 809 -3186 1605 -2398 1607 -15170 RAW_Data: 827 -3192 1595 -2376 813 -3192 1601 -2414 797 -3186 807 -3220 1601 -2398 1603 -2394 1599 -2396 1607 -2400 1605 -2394 1597 -2398 1603 -2398 813 -3192 1603 -2394 809 -3188 809 -3188 811 -3192 1607 -2396 1601 -2398 1605 -2398 811 -3188 1603 -2400 1603 -15174 829 -3162 1627 -2374 803 -3224 1571 -2412 801 -3186 807 -3222 1605 -2392 1605 -2392 1599 -2394 1605 -2404 1601 -2396 1607 -2396 1601 -2394 809 -3188 1601 -2398 811 -3190 815 -3194 811 -3184 1603 -2400 1605 -2400 1605 -2394 809 -3188 1609 -2394 1605 -15154 829 -3188 1603 -2412 801 -3210 1603 -2398 807 -3182 809 -3196 1605 -2400 1605 -2396 1599 -2402 1607 -2390 1599 -2396 1599 -2400 1607 -2396 811 -3192 1605 -2396 813 -3196 809 -3190 811 -3192 1609 -2394 1597 -2396 1607 -2398 809 -3186 1605 -2394 1605 -15178 795 -3216 1577 -2408 819 -3190 1607 -2394 817 -3194 779 -3194 1607 -2404 1605 -2398 1607 -2394 1601 -2398 1605 -2400 1603 -2402 1607 -2394 811 -3192 1601 -2396 809 -3186 813 -3194 811 -3188 1599 -2394 1601 -2402 1601 -2398 811 -3186 1603 -2396 1611 -15176 799 -3224 1567 -2424 785 -3202 1599 -2396 809 -3204 783 -3198 1605 -2398 1607 -2402 1605 -2398 1607 -2400 1599 -2398 1605 -2392 1603 -2400 811 -3186 1601 -2400 811 -3194 809 -3184 811 -3186 1603 -2396 1603 -2398 1607 -2398 811 -3188 1605 -2396 1605 -15174 829 -3166 1605 -2402 809 -3190 1615 -2368 815 -3194 815 -3192 1605 -2396 1603 -2400 1603 -2400 1605 -2392 1601 -2400 1607 -2400 1601 -2402 811 -3194 1599 -2392 809 -3188 813 -3184 813 -3192 1605 -2400 1605 -2400 1607 -2390 809 -3188 1607 -2398 1603 -15174 829 -3158 1617 -2400 787 -3192 1607 -2404 811 -3184 815 -3190 1607 -2402 1601 -2396 1605 -2400 1601 -2396 1603 -2396 1607 -2400 1603 -2394 809 -3188 1609 -2398 809 -3190 811 -3188 809 -3188 1607 -2396 1599 -2396 1607 -2400 809 -3188 1607 -2398 1603 -15172 797 -3228 1575 -2424 771 -3202 1615 -2386 801 -3198 807 -3218 1587 -2390 1603 -2394 1603 -2424 1603 -2396 1603 -2398 1599 -2394 1605 -2396 809 -3192 1605 -2400 807 -3184 809 -3190 813 -3190 1603 -2390 1601 -2394 1601 -2396 813 -3196 1607 -2402 1599 -15152 829 -3194 1605 -2408 793 -3182 1597 -2426 807 -3184 811 -3192 1607 -2392 1603 -2396 1605 -2400 1601 -2394 1603 -2394 1605 -2400 1605 -2394 809 -3190 1605 -2396 811 -3192 809 -3186 811 -3190 1601 -2394 1605 -2400 1607 -2398 809 -3186 1601 -2394 1603 -15174 829 -3160 1635 -2382 811 -3194 1609 -2400 779 -3220 781 -3222 1575 -2406 1603 -2398 1607 -2402 1601 -2394 1603 -2396 1601 -2402 1605 -2398 805 -3190 1605 -2394 813 -3194 809 -3188 811 -3192 1603 -2396 1599 -2394 1607 -2394 811 -3194 1603 -2394 1601 -15174 799 -3216 1599 -2402 785 -3198 1615 -2376 819 -3194 811 -3190 1599 -2394 1623 -2392 1599 -2396 1611 -2382 1599 -2390 1633 -2392 1599 -2396 811 -3194 1599 -2394 811 -3188 RAW_Data: 811 -3190 809 -3192 1603 -2398 1607 -2392 1599 -2398 811 -3190 1603 -2402 1601 -15172 795 -3194 1603 -2404 807 -3186 1599 -2394 821 -3196 785 -3196 1609 -2396 1609 -2398 1603 -2396 1605 -2400 1599 -2394 1605 -2396 1605 -2398 809 -3190 1601 -2396 811 -3190 809 -3194 809 -3188 1601 -2398 1603 -2398 1607 -2392 807 -3190 1603 -2402 1601 -15178 803 -3198 1579 -2410 807 -3188 1625 -2406 793 -3204 779 -3192 1609 -2408 1597 -2392 1595 -2424 1605 -2394 1601 -2394 1601 -2392 1601 -2396 809 -3194 1607 -2398 811 -3194 811 -3186 809 -3182 1607 -2398 1605 -2392 1605 -2392 809 -3190 1611 -2400 1605 -15154 799 -3228 1567 -2434 795 -3180 1627 -2392 809 -3190 809 -3186 1603 -2396 1599 -2394 1603 -2398 1603 -2398 1603 -2392 1607 -2400 1601 -2390 809 -3186 1601 -2404 811 -3188 811 -3190 813 -3186 1605 -2398 1605 -2392 1599 -2400 813 -3190 1599 -2396 1603 -15184 799 -3194 1607 -2410 795 -3176 1603 -2428 807 -3188 811 -3188 1603 -2394 1607 -2398 1599 -2396 1603 -2400 1605 -2394 1601 -2394 1607 -2400 809 -3186 1607 -2400 809 -3184 811 -3188 809 -3196 1605 -2396 1603 -2394 1607 -2392 809 -3188 1607 -2396 1609 -15176 795 -3226 1567 -2406 819 -3198 1579 -2406 809 -3190 821 -3198 1575 -2400 1603 -2398 1611 -2400 1603 -2398 1607 -2396 1601 -2394 1607 -2402 809 -3190 1603 -2396 811 -3186 809 -3192 811 -3192 1607 -2394 1603 -2398 1601 -2396 809 -3196 1605 -2398 1603 -15148 827 -3196 1597 -2426 775 -3200 1613 -2398 783 -3198 813 -3184 1613 -2400 1607 -2400 1605 -2398 1603 -2400 1601 -2394 1603 -2398 1605 -2398 809 -3192 1603 -2396 811 -3190 811 -3190 809 -3194 1605 -2394 1601 -2396 1601 -2400 811 -3192 1607 -2396 1603 -15162 797 -3244 1573 -2398 817 -3196 1603 -2404 795 -3210 775 -3220 1603 -2396 1603 -2396 1607 -2394 1607 -2368 1633 -2392 1601 -2396 1607 -2396 811 -3190 1605 -2400 807 -3186 811 -3194 809 -3186 1607 -2396 1603 -2392 1599 -2394 811 -3186 1611 -2396 1601 -15178 763 -3288 1501 -2496 741 -3254 1543 -2442 777 -3194 815 -3206 1585 -2390 1603 -2426 1601 -2392 1599 -2400 1605 -2396 1599 -2398 1603 -2398 809 -3190 1601 -2396 811 -3188 811 -3188 811 -3194 1607 -2396 1599 -2396 1605 -2398 813 -3190 1605 -2400 1603 -16206 65 -230 181 -579692 165 -1118 1797 -3196 1591 -2420 773 -3224 1603 -2394 809 -3188 809 -3188 1609 -2402 1603 -2398 1599 -2400 1605 -2400 1605 -2396 1605 -2396 1603 -2394 813 -3194 1607 -2398 809 -3188 809 -3192 809 -3196 1603 -2394 1599 -2396 1605 -2402 811 -3190 1605 -2400 1605 -15178 793 -3222 1577 -2402 809 -3192 1601 -2394 807 -3202 819 -3196 1609 -2396 1603 -2396 1601 -2392 1613 -2400 1579 -2398 1613 -2396 1603 -2396 813 -3192 1607 -2394 813 -3198 809 -3188 809 -3188 1599 -2398 1607 -2400 1607 -2398 807 -3186 1603 -2400 1607 -15178 823 -3168 1615 -2398 809 -3192 1615 -2398 783 -3228 RAW_Data: 779 -3200 1607 -2394 1605 -2402 1607 -2394 1601 -2396 1603 -2400 1607 -2398 1603 -2396 809 -3182 1607 -2402 813 -3194 811 -3188 811 -3186 1603 -2402 1605 -2398 1607 -2396 809 -3188 1603 -2398 1609 -15162 829 -3204 1575 -2428 783 -3202 1597 -2422 775 -3214 809 -3192 1605 -2400 1603 -2402 1601 -2392 1603 -2394 1605 -2392 1611 -2398 1603 -2398 811 -3182 1609 -2400 813 -3196 811 -3186 811 -3186 1609 -2400 1605 -2394 1601 -2402 807 -3190 1607 -2398 1607 -15178 829 -3182 1595 -2424 773 -3224 1589 -2384 805 -3222 809 -3188 1603 -2398 1605 -2400 1599 -2396 1601 -2392 1601 -2400 1609 -2396 1605 -2398 813 -3190 1603 -2396 813 -3186 811 -3194 811 -3196 1603 -2394 1603 -2400 1603 -2396 809 -3186 1609 -2400 1605 -15160 825 -3198 1605 -2402 785 -3208 1599 -2426 775 -3220 807 -3186 1601 -2396 1609 -2398 1607 -2392 1599 -2402 1605 -2398 1599 -2398 1603 -2402 807 -3190 1603 -2398 813 -3186 813 -3196 809 -3184 1601 -2394 1603 -2428 1571 -2400 815 -3220 1575 -2402 1609 -15178 793 -3234 1575 -2404 819 -3188 1599 -2398 807 -3204 819 -3192 1581 -2400 1607 -2396 1607 -2402 1601 -2392 1605 -2398 1605 -2400 1605 -2398 811 -3190 1609 -2396 811 -3186 811 -3194 811 -3186 1603 -2396 1609 -2396 1601 -2400 811 -3192 1603 -2394 1603 -15188 831 -3184 1609 -2382 803 -3190 1629 -2396 809 -3192 809 -3188 1607 -2396 1607 -2398 1607 -2392 1599 -2396 1607 -2398 1605 -2398 1605 -2394 811 -3188 1607 -2400 813 -3192 811 -3190 813 -3186 1603 -2400 1603 -2402 1599 -2394 811 -3190 1609 -2396 1609 -15164 823 -3196 1599 -2396 789 -3210 1595 -2424 809 -3188 811 -3186 1603 -2398 1605 -2390 1601 -2394 1609 -2400 1605 -2396 1607 -2394 1603 -2398 813 -3194 1599 -2394 815 -3194 809 -3192 809 -3190 1607 -2398 1605 -2396 1603 -2394 809 -3188 1605 -2402 1601 -15162 827 -3196 1579 -2426 805 -3206 1605 -2366 811 -3208 799 -3212 1603 -2400 1603 -2394 1601 -2398 1605 -2398 1599 -2394 1601 -2394 1609 -2394 813 -3192 1607 -2398 813 -3186 807 -3188 813 -3188 1601 -2396 1609 -2396 1603 -2392 811 -3194 1601 -2398 1611 -15174 831 -3186 1595 -2406 785 -3200 1625 -2378 813 -3190 815 -3202 1593 -2424 1603 -2400 1603 -2394 1597 -2400 1603 -2400 1605 -2396 1597 -2400 811 -3192 1601 -2400 811 -3190 811 -3190 811 -3192 1607 -2398 1603 -2392 1607 -2394 811 -3194 1603 -2396 1601 -15154 831 -3190 1605 -2404 797 -3180 1635 -2392 807 -3190 809 -3188 1605 -2400 1603 -2394 1605 -2396 1605 -2398 1601 -2394 1605 -2400 1605 -2396 811 -3192 1603 -2394 809 -3186 815 -3192 805 -3192 1601 -2396 1601 -2366 1629 -2388 807 -3192 1603 -2396 1599 -15118 825 -3198 1605 -2400 783 -3198 1589 -2392 809 -3180 809 -3186 1629 -2400 1573 -2390 1631 -2362 1633 -2360 1631 -2366 1599 -2394 1603 -2392 805 -3214 1601 -2396 809 -3184 811 -3190 807 -3160 1631 -2394 1601 -2364 1601 -2420 RAW_Data: 807 -3192 1603 -2360 1633 -15120 827 -3200 1575 -2400 809 -3196 1605 -2394 807 -3186 809 -3160 1633 -2392 1599 -2366 1599 -2394 1631 -2358 1635 -2366 1601 -2396 1629 -2390 777 -3190 1629 -2400 775 -3218 775 -3216 809 -3188 1603 -2362 1631 -2390 1601 -2396 811 -3190 1597 -2400 1601 -15128 809 -3220 1577 -2398 809 -3196 1603 -2364 811 -3194 811 -3192 1605 -2400 1605 -2360 1601 -2396 1601 -2392 1603 -2390 1631 -2394 1571 -2394 807 -3218 1603 -2396 775 -3214 807 -3186 807 -3162 1603 -2394 1601 -2390 1603 -2396 805 -3222 1603 -2364 1635 -15142 791 -3228 1571 -2400 811 -3188 1601 -2394 809 -3194 809 -3186 1605 -2398 1601 -2390 1603 -2362 1633 -2362 1601 -2394 1635 -2362 1631 -2390 807 -3190 1605 -2394 773 -3220 775 -3186 807 -3192 1599 -2424 1597 -2366 1603 -2396 807 -3216 1601 -2398 1601 -15140 813 -3196 1571 -2398 813 -3190 1601 -2396 811 -3186 811 -3192 1603 -2402 1601 -2392 1601 -2392 1609 -2394 1603 -2394 1607 -2394 1611 -2396 811 -3190 1605 -2400 811 -3190 811 -3190 813 -3190 1601 -2400 1603 -2394 1607 -2398 809 -3188 1607 -2398 1605 -15176 793 -3226 1579 -2400 811 -3186 1613 -2400 785 -3194 815 -3194 1611 -2396 1607 -2396 1601 -2400 1607 -2396 1605 -2398 1603 -2394 1599 -2392 811 -3190 1605 -2396 815 -3192 815 -3190 813 -3188 1601 -2398 1603 -2398 1603 -2398 811 -3194 1605 -2398 1601 -15156 859 -3148 1639 -2378 803 -3214 1569 -2430 807 -3186 809 -3194 1601 -2396 1605 -2398 1607 -2400 1605 -2396 1605 -2396 1607 -2392 1599 -2394 811 -3184 1609 -2400 815 -3194 809 -3188 809 -3196 1605 -2394 1607 -2394 1599 -2396 813 -3194 1603 -2398 1603 -15170 797 -3212 1595 -2402 819 -3184 1613 -2390 831 -3174 819 -3196 1597 -2402 1589 -2388 1601 -2396 1633 -2398 1601 -2392 1599 -2400 1607 -2396 811 -3186 1609 -2402 809 -3188 813 -3192 809 -3188 1607 -2396 1601 -2398 1601 -2398 811 -3192 1599 -2396 1607 -15174 831 -3186 1579 -2402 801 -3202 1615 -2388 827 -3178 803 -3188 1617 -2392 1601 -2392 1635 -2396 1599 -2392 1603 -2398 1605 -2400 1601 -2392 813 -3194 1601 -2400 813 -3190 811 -3190 809 -3188 1603 -2396 1601 -2398 1605 -2400 809 -3184 1601 -2396 1607 -15178 831 -3166 1611 -2398 815 -3198 1577 -2398 811 -3194 815 -3192 1607 -2400 1605 -2400 1599 -2398 1603 -2396 1601 -2398 1605 -2400 1609 -2392 811 -3192 1605 -2398 811 -3188 811 -3192 813 -3190 1607 -2394 1605 -2398 1603 -2400 809 -3190 1601 -2396 1609 -15174 795 -3230 1567 -2432 781 -3204 1597 -2394 807 -3222 807 -3182 1605 -2398 1603 -2392 1603 -2396 1607 -2396 1603 -2404 1605 -2400 1599 -2396 811 -3186 1611 -2398 813 -3188 811 -3192 811 -3188 1605 -2404 1603 -2400 1605 -2398 807 -3190 1605 -2396 1605 -15164 827 -3198 1605 -2398 783 -3206 1595 -2424 807 -3192 807 -3184 1605 -2396 1605 -2400 1607 -2398 1599 -2394 1607 -2396 1605 -2400 1599 -2394 RAW_Data: 809 -3184 1609 -2400 809 -3194 813 -3188 807 -3188 1603 -2400 1605 -2400 1599 -2398 809 -3190 1605 -2400 1603 -15170 803 -3208 1595 -2402 809 -3196 1589 -2388 807 -3216 809 -3182 1603 -2394 1607 -2398 1603 -2396 1607 -2396 1603 -2400 1605 -2396 1599 -2394 811 -3188 1605 -2396 817 -3196 811 -3182 811 -3192 1607 -2394 1603 -2394 1607 -2398 811 -3190 1603 -2398 1601 -15186 833 -3156 1605 -2412 799 -3218 1595 -2392 809 -3186 811 -3186 1609 -2404 1607 -2394 1605 -2396 1601 -2400 1607 -2396 1601 -2392 1607 -2400 809 -3192 1603 -2396 815 -3194 809 -3188 809 -3192 1603 -2400 1599 -2394 1605 -2400 811 -3188 1599 -2400 1605 -16142 167 -202 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/marantec_raw.sub ================================================ Filetype: Flipper SubGhz RAW File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: RAW RAW_Data: 3487 -68 18413 -66 6689 -17938 65 -68 495 -98 1129 -860 697 -166 395 -100 463 -100 163 -14692 263 -794 65 -64 99 -2922 131 -200 97 -168 99 -100 199 -962 495 -68 165 -98 299 -198 133 -168 3917 -98 963 -132 461 -100 1089 -166 331 -134 633 -164 201 -100 363 -164 335 -200 265 -68 531 -166 699 -132 529 -166 397 -98 895 -168 65 -100 399 -366 463 -66 197 -134 431 -66 163 -98 623 -166 301 -98 263 -98 263 -66 197 -98 329 -98 525 -66 331 -200 1025 -66 629 -132 763 -166 233 -66 431 -132 133 -100 429 -264 165 -132 299 -166 429 -68 4605 -134 593 -134 4917 -60834 167 -10282 1941 -1122 865 -2086 921 -1072 1921 -1042 939 -1056 945 -1044 939 -1052 945 -1024 971 -1024 973 -1002 969 -1010 989 -1996 1007 -994 979 -1014 1965 -1014 977 -1020 969 -2004 1993 -982 1011 -982 1005 -984 977 -2008 981 -1006 1993 -1966 999 -994 1007 -982 1005 -984 1007 -996 975 -1016 1987 -996 973 -1016 969 -1004 1013 -1970 1011 -984 1999 -1970 1995 -984 1021 -1968 1005 -994 1003 -970 999 -984 1023 -974 1015 -8920 1995 -1014 1001 -1966 1013 -986 1991 -986 1007 -996 973 -1012 999 -978 985 -1006 1005 -984 997 -978 1015 -1000 973 -1982 1025 -982 985 -1008 1973 -1004 1007 -982 983 -1998 2009 -972 1009 -980 999 -978 1011 -1970 1011 -986 1999 -1978 1007 -988 1007 -994 975 -1012 1003 -972 1009 -978 1987 -986 1007 -982 1017 -994 971 -1990 1009 -984 1997 -1978 1999 -1010 993 -1964 1005 -1000 1007 -980 997 -984 1017 -972 999 -8932 2031 -980 989 -1988 985 -1016 1983 -986 1007 -994 975 -1016 975 -998 977 -1012 999 -982 985 -1006 983 -1018 993 -1968 1017 -996 975 -1016 1965 -1012 979 -1018 971 -2004 1991 -978 1003 -984 1015 -992 973 -2004 1005 -976 1991 -2008 975 -986 1005 -998 977 -1012 999 -978 985 -1010 1973 -1004 1013 -980 981 -1004 1007 -1996 975 -986 1993 -2006 1961 -1002 1013 -1974 985 -1008 1011 -978 997 -1006 981 -1012 991 -8918 8005 -3924 1887 -174620 131 -3974 131 -298 559 -230 65 -132 265 -98 863 -168 333 -66 299 -234 463 -166 331 -102 697 -200 199 -98 265 -100 663 -166 331 -66 599 -132 99 -66 1261 -66 399 -100 265 -100 1199 -66 265 -166 101 -66 599 -232 197 -100 561 -66 499 -132 797 -132 427 -66 265 -298 465 -66 565 -198 97 -100 695 -100 531 -132 267 -66 429 -98 231 -100 331 -100 333 -98 363 -198 67 -100 165 -100 231 -100 729 -134 1061 -100 493 -164 665 -132 259 -128 257 -130 329 -98 361 -66 263 -100 227 -66 491 -98 295 -166 229 -132 229 -130 263 -130 233 -100 331 -232 99 -100 165 -66 667 -164 795 -66 695 -68 429 -132 RAW_Data: 559 -66 16863 -66 19215 -12276 65 -2086 131 -2188 65 -132 67 -166 299 -364 65 -100 131 -468 233 -200 497 -498 297 -100 363 -198 329 -130 327 -164 229 -64 427 -164 657 -132 829 -532 895 -66 297 -130 425 -166 363 -132 329 -100 465 -100 465 -198 65 -262 429 -98 495 -100 295 -528 131 -132 1129 -134 259 -130 327 -100 397 -66 261 -230 99 -66 229 -132 625 -68 131 -100 587 -66 329 -64 293 -130 1741 -132 325 -132 197 -98 261 -98 99 -132 561 -166 165 -66 391 -66 329 -98 231 -132 465 -100 331 -300 199 -132 299 -132 165 -164 229 -98 565 -100 395 -132 131 -100 327 -130 97 -98 163 -132 293 -98 557 -66 199 -166 233 -132 265 -166 627 -100 265 -132 595 -166 99 -98 199 -100 267 -166 795 -166 265 -166 297 -66 131 -166 331 -134 793 -164 263 -198 299 -100 265 -166 257 -100 197 -198 599 -132 333 -66 265 -100 229 -100 165 -204 465 -166 97 -232 365 -166 431 -68 199 -166 99 -236 365 -132 1297 -66 1361 -100 989 -98 297 -132 12467 -232 361 -100 263 -132 261 -196 229 -296 65 -66 329 -164 229 -164 263 -66 563 -232 3415 -132 11115 -100 97 -100 363 -164 99 -66 199 -100 99 -66 561 -164 259 -168 233 -132 333 -166 567 -98 297 -66 399 -66 399 -298 327 -132 685 -98 393 -98 819 -100 231 -270 429 -68 461 -132 131 -134 1121 -230 787 -132 1393 -132 233 -100 331 -66 497 -166 563 -196 425 -98 525 -66 723 -98 265 -134 365 -66 1297 -166 433 -98 165 -134 231 -134 263 -100 369 -198 99 -100 631 -634 331 -132 565 -132 265 -102 267 -98 467 -200 297 -130 731 -100 367 -98 229 -130 99 -98 263 -164 493 -100 297 -198 429 -66 425 -66 1021 -164 295 -198 97 -198 263 -132 425 -98 493 -98 197 -98 593 -264 65 -294 197 -66 295 -66 561 -196 565 -166 2675 -132 19393 -134 5403 -164 369 -166 467 -132 361 -526 395 -66 361 -132 529 -66 431 -66 465 -166 363 -98 65 -98 229 -98 359 -100 197 -132 201 -100 467 -166 397 -100 297 -130 229 -98 361 -98 199 -130 297 -66 659 -132 261 -98 819 -98 393 -132 329 -132 557 -132 163 -130 657 -66 295 -134 1189 -100 399 -102 861 -100 369 -132 331 -134 263 -666 65 -134 427 -64 197 -98 559 -68 297 -98 493 -164 197 -164 525 -66 131 -98 493 -66 595 -100 233 -100 265 -132 65 -66 465 -266 527 -98 855 -132 493 -66 393 -298 331 -100 131 -66 859 -198 495 -100 265 -98 367 -66 727 -196 535 -66 263 -66 397 -332 65 -198 331 -134 297 -330 RAW_Data: 261 -100 3291 -68 2553 -19050 1855 -100 1259 -200 165 -100 39479 -100 233 -68 1027 -166 595 -66 231 -168 199 -98 265 -232 563 -166 795 -98 99 -460 65 -362 1017 -98 229 -98 625 -66 231 -98 161 -196 363 -98 363 -100 631 -132 297 -66 333 -300 99 -66 295 -230 985 -100 623 -132 1319 -100 65 -68 231 -232 197 -232 331 -100 199 -168 567 -166 133 -232 823 -396 327 -132 855 -232 165 -100 401 -166 599 -198 167 -132 299 -198 663 -132 165 -134 67 -66 1687 -66 1705 -100 265 -232 297 -100 531 -66 333 -100 1263 -66 297 -164 299 -98 431 -398 97 -66 199 -296 231 -232 925 -100 131 -132 229 -164 361 -66 267 -166 197 -100 491 -132 261 -132 1183 -98 891 -100 265 -100 99 -100 725 -100 303 -60886 131 -10310 1911 -1226 749 -2146 899 -1084 1905 -1070 917 -1044 973 -1042 927 -1050 949 -1044 965 -1012 949 -1046 965 -1014 977 -2008 981 -980 995 -1012 1969 -1018 971 -1014 975 -2014 1967 -1016 971 -1014 977 -984 1003 -2006 973 -1000 2001 -1978 1013 -980 1001 -972 1009 -978 991 -1010 983 -1004 1989 -1012 983 -978 995 -1014 983 -2002 977 -984 2023 -1968 1997 -986 999 -1970 1003 -1000 1009 -978 1017 -974 1009 -978 1001 -8948 1975 -1016 973 -2004 999 -978 2001 -986 1001 -978 1009 -986 1001 -1010 975 -998 1011 -992 975 -982 1005 -1000 1009 -1970 1011 -982 1009 -984 2003 -978 1001 -976 1015 -1966 1999 -1010 989 -982 989 -1004 1001 -1978 1013 -978 2005 -1966 1019 -972 1011 -980 997 -976 1011 -1004 999 -966 1997 -1000 999 -1002 975 -986 999 -1994 1007 -980 1993 -1978 2001 -1008 991 -1970 1009 -998 975 -1016 971 -1006 1013 -980 1001 -8922 2001 -994 1009 -1972 997 -1012 1971 -984 1005 -1012 977 -998 1009 -978 1011 -984 977 -1012 979 -1016 977 -1010 977 -2010 981 -1006 971 -1020 1985 -984 1005 -978 999 -1990 1997 -980 997 -1010 981 -1014 989 -1976 1005 -966 1995 -1998 997 -982 1021 -972 1003 -986 997 -1012 975 -982 1995 -1014 999 -980 983 -1004 1003 -1976 1007 -980 1983 -2012 1983 -998 977 -2010 973 -1014 973 -1018 973 -1014 975 -1016 971 -8956 7999 -3926 1865 -177334 165 -166 199 -496 431 -66 1319 -132 297 -164 457 -68 231 -100 863 -98 603 -100 663 -100 789 -262 491 -166 729 -100 795 -364 365 -132 293 -100 197 -98 625 -200 231 -132 229 -132 227 -100 755 -526 329 -134 793 -100 167 -200 335 -66 65 -134 265 -66 201 -66 1023 -100 63 -21396 133 -198 65 -66 263 -98 393 -134 65 -66 329 -68 199 -432 263 -394 131 -130 195 -66 687 -66 295 -164 229 -196 97 -98 559 -98 1283 -98 531 -66 331 -68 435 -100 393 -628 431 -132 99 -66 RAW_Data: 329 -66 2519 -100 6759 -12690 463 -232 97 -3252 65 -2592 65 -132 99 -198 67 -496 99 -300 231 -132 233 -66 165 -132 131 -164 201 -66 4113 -66 1987 -68 15385 -98 8199 -16614 165 -1258 495 -1354 229 -166 297 -134 3653 -100 12533 -66 3759 -162 591 -132 361 -130 527 -100 327 -200 65 -66 461 -132 327 -132 461 -100 559 -198 263 -132 161 -98 329 -132 327 -68 395 -66 165 -132 163 -196 261 -66 361 -98 229 -132 301 -134 761 -66 399 -166 99 -66 461 -98 857 -98 131 -262 359 -132 199 -100 299 -166 363 -132 297 -132 199 -132 265 -166 133 -100 301 -268 463 -98 231 -134 265 -98 527 -298 265 -136 531 -132 363 -132 129 -130 527 -132 297 -66 297 -68 397 -466 99 -132 697 -98 233 -464 131 -132 365 -134 465 -98 635 -98 299 -66 497 -132 197 -132 489 -166 327 -98 1151 -130 295 -132 623 -164 97 -68 297 -100 1293 -100 1759 -66 1259 -132 729 -100 797 -66 99 -66 231 -98 529 -166 331 -166 299 -202 431 -134 467 -462 329 -462 1051 -98 625 -66 195 -100 461 -196 429 -132 197 -66 129 -66 229 -166 589 -164 629 -66 1053 -166 231 -98 263 -132 329 -132 267 -132 427 -130 65 -130 229 -166 4121 -66 15899 -19980 495 -264 165 -432 65 -132 65 -662 663 -100 793 -66 723 -164 565 -100 363 -166 199 -98 465 -100 299 -168 265 -198 695 -132 131 -268 497 -66 265 -134 199 -98 231 -134 499 -100 989 -132 429 -196 327 -132 131 -164 427 -66 263 -66 525 -132 1091 -100 793 -132 491 -66 195 -526 921 -134 363 -98 693 -230 165 -98 1711 -132 293 -66 659 -196 231 -66 261 -66 163 -66 1349 -166 363 -100 65 -100 299 -100 393 -66 495 -134 229 -98 131 -98 463 -362 361 -132 231 -66 491 -396 361 -132 97 -66 163 -198 229 -294 229 -198 165 -164 65 -100 623 -66 195 -98 261 -130 65 -98 563 -66 267 -166 1057 -632 531 -132 463 -100 663 -166 133 -100 569 -164 197 -66 431 -164 261 -132 363 -100 427 -164 263 -198 623 -66 589 -166 133 -166 199 -66 199 -268 65 -98 427 -66 163 -132 563 -198 363 -166 397 -98 1025 -66 197 -66 163 -132 693 -164 195 -66 427 -100 131 -66 433 -132 199 -402 231 -66 335 -100 993 -100 463 -232 65 -100 65 -66 7165 -66 6785 -66 895 -66 923 -198 97 -164 689 -166 361 -198 99 -66 753 -498 365 -66 567 -232 397 -66 199 -132 233 -200 995 -296 365 -166 597 -100 199 -134 99 -166 197 -332 431 -166 331 -66 199 -100 431 -232 493 -166 457 -98 231 -132 427 -230 559 -98 RAW_Data: 261 -132 1051 -66 7501 -98 22107 -19232 2271 -166 133 -60834 165 -10284 595 -5446 885 -1106 1891 -1088 897 -1068 949 -1050 929 -1040 947 -1048 959 -1008 985 -1008 973 -1012 993 -2004 979 -998 975 -1014 1987 -998 977 -1014 971 -1998 2007 -974 1013 -976 999 -982 1023 -1962 1005 -1000 1969 -2010 977 -1016 971 -1004 1009 -980 985 -1002 979 -1014 1977 -1012 979 -1016 971 -1012 977 -1986 1021 -974 2005 -1968 2007 -976 1011 -1966 1009 -984 1009 -984 985 -1020 969 -1002 997 -8952 1995 -986 1017 -1988 989 -976 1979 -1028 975 -988 1009 -986 1007 -992 973 -1014 1001 -974 1011 -978 995 -1006 979 -2004 975 -1022 973 -984 1999 -1014 977 -984 1003 -2004 1995 -976 1005 -998 999 -982 981 -2002 983 -986 1989 -1998 1009 -976 999 -1010 991 -978 1013 -968 1011 -986 1995 -982 1023 -974 981 -1020 993 -1970 1007 -996 1995 -1982 1999 -986 993 -2002 985 -998 975 -1014 969 -1004 1009 -978 997 -8962 1989 -990 1009 -1954 1025 -984 2007 -962 1011 -980 1001 -982 1009 -1002 1007 -980 1005 -976 1007 -980 997 -976 1009 -2002 977 -988 1005 -982 2001 -976 1009 -988 1005 -1968 2029 -974 1003 -990 1011 -958 1005 -1972 1039 -978 1999 -1978 1009 -954 1037 -978 1007 -954 1039 -980 1011 -958 1999 -974 1031 -990 993 -972 1011 -1980 1011 -978 2009 -1968 1993 -982 1003 -1974 1007 -1006 1001 -986 985 -986 1001 -982 1033 -8924 8013 -3924 1851 -170400 493 -132 131 -164 65 -724 461 -164 693 -100 265 -100 229 -100 199 -98 363 -232 363 -100 131 -68 531 -166 165 -134 265 -66 727 -300 131 -198 99 -132 99 -134 597 -102 295 -130 131 -230 129 -98 689 -264 263 -134 231 -134 199 -132 131 -68 295 -100 163 -130 591 -98 327 -164 231 -66 589 -98 2077 -134 1389 -66 2913 -66 3045 -66 4463 -98 391 -132 489 -164 295 -66 523 -166 329 -98 195 -98 165 -100 165 -66 231 -100 895 -98 265 -132 595 -132 297 -494 261 -198 331 -100 131 -134 429 -68 231 -298 1193 -66 99 -100 627 -132 331 -98 393 -98 657 -132 163 -392 359 -132 163 -64 655 -164 263 -64 531 -98 265 -164 499 -100 229 -64 459 -100 199 -66 165 -130 197 -132 393 -66 163 -228 229 -132 65 -132 263 -100 357 -98 991 -328 595 -132 197 -130 759 -66 131 -166 267 -100 1251 -64 361 -66 395 -954 559 -132 295 -98 327 -100 295 -100 367 -198 391 -298 363 -132 495 -132 523 -66 97 -132 763 -198 131 -66 197 -100 525 -130 1059 -64 461 -166 563 -134 331 -66 463 -134 329 -198 199 -166 265 -266 1061 -66 331 -366 65 -66 1225 -100 299 -66 299 -132 133 -298 265 -100 1129 -364 163 -460 297 -132 297 -100 299 -100 RAW_Data: 529 -166 2423 -100 199 -66 22473 -20988 131 -100 395 -166 165 -268 133 -100 17947 -68 8295 -132 267 -66 295 -100 627 -98 199 -200 597 -168 363 -266 365 -68 597 -66 431 -166 233 -98 465 -100 533 -132 299 -66 533 -66 361 -98 229 -98 459 -132 129 -232 63 -66 427 -132 395 -98 361 -98 359 -100 131 -134 1721 -66 431 -132 67 -398 395 -100 361 -66 1693 -230 1381 -98 1879 -100 693 -66 299 -100 233 -132 133 -134 2807 -132 5113 -66 1317 -68 5575 -98 199 -168 235 -432 463 -100 1679 -66 6115 -134 10653 -19120 97 -426 99 -162 99 -64 263 -166 227 -132 727 -100 99 -98 1163 -66 497 -132 197 -66 293 -98 789 -66 1051 -66 395 -64 293 -132 983 -66 1225 -66 65 -168 99 -100 299 -164 491 -166 365 -132 265 -100 397 -132 99 -100 265 -234 299 -100 233 -100 433 -232 363 -66 197 -130 789 -164 525 -132 331 -132 199 -66 195 -66 459 -98 163 -66 197 -164 229 -132 261 -130 65 -98 361 -64 625 -66 591 -66 863 -198 465 -132 631 -66 699 -100 131 -100 197 -166 535 -66 131 -100 297 -132 499 -66 599 -266 295 -132 359 -66 197 -196 263 -132 99 -98 261 -164 163 -66 493 -132 433 -134 495 -98 197 -132 391 -230 393 -66 263 -66 425 -66 261 -66 427 -200 397 -198 97 -132 99 -132 959 -100 13369 -66 1227 -100 295 -164 263 -232 261 -196 393 -230 227 -132 297 -100 97 -100 195 -262 893 -66 725 -66 331 -100 267 -134 1091 -132 133 -166 265 -100 461 -200 729 -100 431 -98 1093 -66 197 -168 265 -100 663 -98 363 -132 97 -132 523 -328 693 -98 397 -396 229 -164 491 -66 131 -132 591 -66 197 -66 823 -66 331 -66 459 -394 97 -100 529 -98 199 -100 563 -132 461 -166 231 -596 163 -132 687 -164 165 -164 165 -132 265 -68 563 -66 131 -66 233 -166 657 -166 395 -100 1147 -66 229 -132 199 -236 65 -66 263 -66 233 -66 235 -66 199 -266 561 -166 133 -166 199 -132 731 -100 363 -198 227 -132 261 -166 657 -98 459 -98 393 -100 229 -100 229 -130 297 -98 233 -98 463 -200 401 -64 99 -132 199 -132 131 -68 629 -66 265 -66 163 -100 529 -66 297 -166 299 -132 233 -100 199 -134 763 -66 297 -100 865 -236 99 -66 265 -432 265 -198 295 -68 463 -198 365 -166 131 -68 197 -168 731 -68 1293 -168 365 -132 725 -66 199 -64 627 -66 299 -134 231 -264 2051 -98 131 -66 425 -66 391 -100 163 -132 97 -132 523 -164 129 -162 427 -66 231 -100 335 -166 1423 -600 789 -164 165 -66 329 -262 691 -132 RAW_Data: 197 -162 4471 -64 9599 -60872 143 -10288 613 -890 131 -166 97 -4144 867 -1130 1871 -1104 897 -1048 941 -1076 933 -1048 941 -1046 939 -1048 943 -1012 973 -1048 945 -2002 987 -1008 985 -1014 1983 -984 1005 -998 975 -2008 1999 -978 1001 -978 1011 -976 997 -1984 1009 -990 1997 -1966 1005 -1000 977 -1012 999 -984 983 -1006 999 -988 1989 -982 1007 -1000 973 -1002 1019 -1966 1015 -986 1989 -1980 1991 -984 1009 -1990 985 -982 1021 -972 999 -996 1011 -980 1003 -8954 1991 -992 1007 -1972 1009 -978 2003 -982 985 -978 1019 -986 1019 -970 1015 -958 1025 -974 1011 -990 997 -978 1013 -1980 1007 -978 1019 -976 1995 -972 1007 -976 1009 -1994 2009 -952 1007 -1010 1011 -952 1005 -2000 1003 -974 2003 -1982 1007 -976 999 -978 1009 -978 1023 -986 1017 -972 2011 -972 1009 -978 1001 -974 1011 -1964 1015 -982 2023 -1950 1999 -988 1025 -1964 1021 -958 1005 -982 1029 -984 981 -1004 1001 -8932 1999 -986 1015 -1982 1001 -986 1991 -984 1007 -994 973 -1016 971 -1006 1011 -980 985 -1004 979 -1014 983 -1004 977 -2006 1005 -984 973 -1018 1969 -1016 969 -1006 1013 -1972 1999 -974 999 -1006 997 -974 1003 -2010 977 -1002 1991 -1970 1011 -1002 971 -1014 973 -1016 973 -1014 975 -1016 1995 -980 999 -976 1013 -978 995 -2006 975 -1018 1969 -2008 1967 -1014 969 -1990 1001 -1018 973 -1014 975 -986 1001 -1008 969 -8960 8009 -3874 1797 -165864 327 -132 955 -130 557 -100 229 -98 263 -66 129 -66 461 -198 265 -134 559 -100 165 -266 263 -166 529 -132 327 -130 65 -196 395 -100 165 -98 327 -66 395 -130 521 -66 693 -66 331 -66 365 -132 499 -66 331 -66 231 -164 659 -66 493 -198 263 -98 131 -100 695 -100 133 -98 431 -100 333 -234 265 -166 165 -68 729 -66 99 -66 459 -98 197 -98 327 -100 295 -166 231 -132 299 -66 331 -66 199 -132 197 -100 663 -98 461 -68 329 -196 295 -98 393 -100 459 -100 1701 -98 13057 -100 395 -66 397 -100 663 -100 563 -100 131 -66 331 -100 297 -100 593 -164 701 -66 297 -66 365 -66 331 -98 459 -130 361 -132 495 -264 331 -66 329 -64 165 -66 329 -266 331 -164 301 -266 97 -68 529 -66 233 -132 431 -132 231 -68 267 -66 199 -66 599 -134 65 -100 197 -66 1317 -98 165 -132 523 -130 131 -100 295 -460 65 -164 623 -164 293 -132 331 -166 1051 -130 227 -230 329 -134 265 -66 827 -98 525 -132 97 -66 497 -66 1097 -100 595 -66 99 -166 495 -66 525 -132 327 -100 329 -66 331 -68 263 -436 65 -100 929 -168 465 -266 731 -100 261 -66 525 -66 65 -66 295 -132 591 -98 623 -100 231 -166 231 -396 97 -66 565 -66 499 -100 RAW_Data: 231 -66 363 -66 2355 -16412 431 -66 1061 -926 99 -594 229 -528 97 -68 501 -100 197 -100 67 -166 22923 -64 3651 -66 25605 -100 23205 -68 10819 -98 327 -164 195 -132 425 -166 231 -134 597 -200 131 -68 431 -66 331 -132 329 -66 301 -100 297 -100 233 -132 529 -66 561 -232 395 -98 295 -98 521 -66 329 -166 467 -200 231 -364 99 -100 299 -198 395 -98 625 -68 131 -98 229 -98 295 -98 329 -98 557 -98 131 -66 491 -134 65 -100 233 -200 365 -232 459 -198 759 -98 165 -100 297 -134 431 -66 397 -134 195 -166 597 -66 1755 -66 955 -132 361 -132 293 -98 65 -66 197 -298 231 -100 559 -98 427 -132 655 -66 6771 -66 8835 -66 567 -68 625 -66 663 -100 493 -130 725 -66 63 -100 263 -134 299 -364 429 -100 395 -100 163 -100 297 -100 199 -66 531 -98 497 -132 595 -132 363 -66 261 -198 395 -130 425 -198 131 -166 429 -264 397 -166 727 -66 725 -132 361 -164 721 -132 195 -134 1151 -132 397 -98 21075 -134 267 -200 1097 -98 297 -100 725 -132 265 -200 597 -66 333 -198 97 -598 197 -66 233 -134 297 -234 659 -64 165 -66 227 -98 197 -100 327 -130 559 -98 991 -100 263 -130 229 -132 359 -100 325 -132 263 -100 399 -98 963 -132 431 -66 761 -68 723 -66 395 -130 493 -100 165 -66 297 -334 97 -132 787 -100 491 -232 949 -100 431 -232 99 -132 233 -164 299 -100 329 -64 233 -100 333 -66 365 -66 661 -200 393 -134 263 -102 297 -132 467 -66 493 -100 631 -66 265 -68 331 -100 295 -162 163 -164 395 -66 697 -66 663 -134 463 -168 65 -66 963 -66 265 -132 199 -134 723 -100 821 -66 163 -130 457 -362 97 -66 461 -98 563 -66 725 -132 727 -100 661 -66 1231 -100 231 -366 2455 -98 689 -132 635 -132 99 -166 729 -66 233 -100 465 -132 561 -168 697 -200 295 -298 65 -198 131 -66 329 -66 231 -134 465 -166 265 -132 299 -200 825 -66 361 -66 129 -198 667 -98 1021 -66 697 -100 397 -68 265 -100 429 -234 99 -98 953 -98 985 -166 293 -66 263 -66 131 -132 295 -66 723 -66 497 -66 265 -166 565 -68 465 -132 65 -66 531 -132 597 -166 331 -66 299 -66 65 -100 1461 -100 463 -66 293 -328 133 -132 499 -66 263 -100 167 -198 267 -66 993 -100 327 -98 493 -164 97 -98 263 -100 427 -66 229 -64 261 -98 325 -100 361 -66 393 -132 595 -164 363 -164 163 -66 131 -134 231 -66 731 -66 1025 -100 563 -134 131 -66 229 -134 233 -100 693 -100 299 -166 299 -134 693 -66 359 -166 499 -100 RAW_Data: 231 -100 23109 -60820 133 -10320 631 -5396 883 -1106 1887 -1072 943 -1040 957 -1012 987 -1010 957 -1012 983 -1002 999 -1012 977 -984 1003 -2002 999 -978 983 -1010 1977 -1002 1007 -968 999 -1996 1999 -986 995 -1012 977 -984 1001 -2000 999 -982 1979 -2010 983 -1010 989 -978 991 -1012 985 -982 1021 -976 1979 -1006 1013 -982 997 -976 1019 -1968 1005 -1000 1965 -2014 1967 -1016 993 -1970 1005 -998 973 -1014 999 -974 1011 -976 995 -8958 2009 -984 1007 -1968 997 -1008 1965 -994 1009 -984 1007 -986 1011 -962 1009 -984 1009 -1002 1007 -978 1003 -976 1009 -1970 1011 -982 1009 -988 2001 -972 997 -1000 1005 -1968 1985 -1006 1007 -978 999 -976 1009 -1996 983 -986 1989 -2014 973 -1014 1003 -974 1009 -974 997 -986 1023 -970 1987 -1014 981 -1010 989 -984 985 -2002 1009 -960 1995 -2002 1995 -986 997 -1970 1003 -1004 1007 -978 999 -980 1013 -978 1017 -8916 2003 -1016 973 -2002 1001 -976 2013 -988 975 -1020 975 -986 1005 -1000 977 -1014 1001 -974 1007 -1000 967 -1006 997 -2002 971 -1006 1009 -980 1993 -980 1003 -986 1005 -1992 1977 -1002 975 -1014 1001 -974 1009 -1994 975 -988 1993 -2010 973 -1014 997 -980 987 -1008 983 -1018 995 -978 1975 -1006 1009 -978 999 -1008 991 -1966 1005 -998 1993 -1980 2005 -988 995 -1968 1005 -1000 1009 -978 1001 -976 1009 -980 1015 -8920 8017 -3892 1773 -165206 65 -396 99 -332 65 -100 133 -364 329 -100 199 -102 791 -100 261 -264 131 -164 295 -130 261 -100 197 -130 625 -98 299 -166 199 -100 531 -66 823 -100 327 -98 395 -98 825 -200 889 -100 295 -328 131 -98 295 -166 329 -64 393 -100 523 -66 263 -130 427 -98 463 -100 363 -166 67 -66 231 -134 331 -98 629 -132 265 -130 99 -66 953 -98 919 -296 591 -132 129 -132 591 -330 361 -166 763 -98 167 -68 265 -132 265 -130 133 -100 333 -132 295 -132 459 -132 393 -66 555 -132 263 -164 97 -64 229 -100 131 -100 329 -66 425 -64 1717 -132 7375 -66 5079 -230 199 -132 467 -66 925 -100 197 -100 231 -66 829 -166 231 -166 333 -200 359 -100 393 -164 291 -134 461 -132 325 -166 99 -100 329 -100 195 -166 399 -232 165 -98 729 -66 531 -132 99 -98 661 -332 65 -100 761 -66 427 -162 629 -132 559 -66 327 -166 597 -100 163 -66 263 -100 553 -100 789 -230 591 -198 65 -362 263 -66 327 -98 425 -66 261 -166 753 -196 889 -134 429 -134 333 -134 429 -66 231 -100 131 -100 463 -130 131 -66 753 -164 361 -64 131 -260 263 -66 359 -98 295 -100 295 -166 1163 -66 267 -68 329 -134 99 -198 233 -134 231 -132 557 -196 65 -100 263 -98 391 -98 329 -98 129 -66 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/mastercode.sub ================================================ Filetype: Flipper SubGhz Key File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok270Async Protocol: Mastercode Bit: 36 Key: 00 00 00 0B 7E 00 3C 08 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/mastercode_raw.sub ================================================ Filetype: Flipper SubGhz RAW File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok270Async Protocol: RAW RAW_Data: 10389 -66 405095 -102 207 -106 1165 -130 963739 -1232 899 -2250 2003 -1190 2017 -1202 911 -2256 2021 -1162 2045 -1134 2047 -1164 2047 -1138 2031 -1180 2039 -1182 949 -2190 995 -2214 961 -2228 963 -2198 963 -2214 977 -2212 975 -2210 975 -2208 971 -2200 963 -2210 993 -2184 2075 -1130 2051 -1142 2055 -1136 2047 -1178 965 -2236 933 -2220 975 -2184 999 -2222 967 -2208 969 -2214 979 -2202 2027 -1156 975 -2242 943 -16080 2023 -1162 967 -2220 2057 -1114 2061 -1124 1007 -2242 2025 -1134 2055 -1168 2017 -1138 2075 -1134 2053 -1136 2075 -1130 979 -2214 979 -2174 999 -2182 1001 -2204 977 -2206 1003 -2188 979 -2176 999 -2182 1009 -2176 1009 -2176 1001 -2212 2029 -1116 2091 -1102 2109 -1092 2095 -1126 1001 -2150 1011 -2180 1011 -2180 1009 -2178 1009 -2172 1009 -2166 1001 -2198 2065 -1136 975 -2220 971 -16018 2097 -1166 951 -2240 2009 -1186 2011 -1160 979 -2208 2035 -1134 2053 -1138 2061 -1158 2045 -1152 2029 -1152 2051 -1166 963 -2188 993 -2222 951 -2214 963 -2220 965 -2212 979 -2212 977 -2180 1003 -2202 965 -2218 975 -2216 967 -2188 2061 -1124 2083 -1126 2071 -1130 2059 -1134 993 -2188 979 -2240 947 -2204 979 -2214 971 -2214 973 -2210 971 -2206 2053 -1130 979 -2216 969 -16056 2053 -1134 1001 -2224 2021 -1150 2051 -1154 953 -2240 2045 -1146 2023 -1168 2033 -1144 2065 -1146 2055 -1130 2071 -1160 961 -2192 973 -2190 1005 -2214 975 -2206 967 -2206 975 -2206 967 -2208 975 -2212 967 -2212 979 -2218 977 -2178 2063 -1156 2035 -1160 2061 -1126 2065 -1130 981 -2186 1003 -2210 977 -2208 973 -2202 977 -2200 965 -2248 943 -2206 2039 -1190 941 -48536 65 -7254 263 -68 363 -102 131 -232 263 -264 751 -230 225 -822 397 -634 231 -268 263 -134 267 -64 867 -132 305 -138 67 -100 331 -98 891 -66 455 -66 531 -100 299 -134 897 -98 693 -132 291 -132 333 -98 337 -68 331 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/megacode.sub ================================================ Filetype: Flipper SubGhz Key File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: MegaCode Bit: 24 Key: 00 00 00 00 00 8A E2 D2 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/megacode_raw.sub ================================================ Filetype: Flipper SubGhz RAW File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: RAW RAW_Data: -754 361 -17246 131 -8734 65 -71908 65 -27774 65 -1230 65 -13826 99 -800 65 -634 67 -796 99 -47716 65 -18338 67 -18176 131 -7986 65 -1084 131 -2090 65 -48694 163 -40926 65 -4538 65 -10224 65 -9874 20955 -1970 1023 -4928 1007 -4946 1011 -7910 981 -1992 1021 -7898 1013 -1962 1007 -7896 1019 -4930 995 -4962 987 -1974 1029 -4924 1019 -4920 1025 -7896 1005 -1964 1027 -7894 1007 -4932 1033 -1948 1009 -7916 1009 -1982 1001 -4942 1011 -7880 1011 -2000 1003 -13820 1011 -1990 985 -4944 1021 -4932 995 -7916 1025 -1944 1025 -7892 1015 -1970 1025 -7892 1001 -4934 1031 -4926 1015 -1970 989 -4938 1007 -4954 1019 -7874 1013 -2000 985 -7896 1011 -4950 1001 -1968 1023 -7900 999 -1968 1007 -4968 973 -7936 985 -1970 1009 -13856 1013 -1968 981 -4962 1009 -4926 1005 -7924 1003 -1968 1013 -7892 1003 -1992 985 -7904 1011 -4936 1023 -4948 997 -1960 1015 -4950 987 -4970 993 -7896 1005 -1970 1009 -7928 1005 -4914 1023 -1984 1001 -7894 1011 -1970 999 -4962 1003 -7890 1007 -1992 1013 -13810 1011 -1994 987 -4938 1005 -4964 999 -7904 1013 -1974 987 -7910 1021 -1964 1015 -7894 1021 -4912 1019 -4948 1007 -1970 1017 -4916 1021 -4946 985 -7914 1003 -1972 1009 -7898 1041 -4912 1013 -1994 985 -7892 1027 -1964 1013 -4938 1003 -7904 1023 -1966 1017 -13824 1025 -1968 983 -4950 1007 -4944 999 -7900 1029 -1964 1015 -7914 981 -2000 981 -7932 979 -4936 1021 -4926 1013 -1998 979 -4946 1035 -4908 1031 -7896 999 -1964 1025 -7902 1021 -4914 1023 -1966 1015 -7908 1007 -1970 1003 -4952 981 -7910 1001 -1974 1003 -13832 1015 -1976 999 -4958 1019 -4938 985 -7900 1025 -1966 1011 -7914 1015 -1964 1009 -7906 1017 -4908 1027 -4916 1011 -2000 981 -4954 1007 -4926 1017 -7920 1011 -1958 1009 -7906 1019 -4912 1025 -1980 1009 -7900 1013 -1948 1027 -4916 1011 -7918 1005 -1976 1003 -13846 1013 -1970 1005 -4914 1041 -4916 1007 -7918 987 -2000 987 -7902 1013 -1970 1015 -7894 1007 -4936 1019 -4944 1009 -1970 1013 -4918 1019 -4954 977 -7914 1019 -1964 1007 -7906 1003 -4956 983 -1982 1027 -7896 1005 -1962 1027 -4930 1007 -7906 999 -1972 1009 -13850 1009 -1952 1027 -4944 983 -4954 1023 -7894 1007 -1952 1031 -7882 1035 -1970 1011 -7894 1007 -4936 1025 -4920 1023 -1968 1011 -4928 1009 -4920 1015 -7902 1015 -1966 1021 -7894 1011 -4948 997 -1970 1009 -7902 1027 -1978 1011 -4930 999 -7918 1007 -1966 1013 -13824 1015 -1966 1027 -4918 1027 -4912 1021 -7888 1009 -1998 989 -7918 1019 -1960 989 -7930 983 -4946 1025 -4920 1013 -1970 1015 -4950 1009 -4926 1005 -7892 1037 -1942 1011 -7926 1005 -4918 1007 -1996 985 -7928 1011 -1964 993 -4946 1025 -7880 1003 -1972 1009 -13854 1011 -1948 1019 -4956 983 -4946 1025 -7898 1003 -1966 1025 -7900 1019 -1964 1011 -7890 1021 -4912 1017 -4930 1013 -1968 1015 -4952 1009 -4932 1007 -7920 1009 -1972 979 -7924 1009 -4944 1003 -1970 1015 -7894 1017 RAW_Data: -1968 997 -4952 1011 -7896 1013 -1954 1005 -13860 985 -2000 979 -4952 1005 -4946 993 -7930 979 -1990 1009 -7908 1017 -1968 1011 -7900 985 -4946 1027 -4920 1009 -1964 1015 -4942 1009 -263646 67 -9708 99 -68890 97 -48712 65 -62028 65 -4652 65 -108870 99 -71758 99 -3200 97 -47548 65 -7036 65 -104448 97 -38184 99 -6502 97 -17756 65 -10136 20983 -1968 999 -4950 1005 -4940 1001 -7898 1025 -1966 1011 -7876 1017 -1966 1023 -7918 981 -4936 1027 -4946 975 -2006 979 -4946 1017 -4954 977 -7930 983 -1980 1003 -7920 989 -4952 1007 -1970 1013 -7896 1007 -1970 1015 -4954 987 -7900 1007 -1970 1007 -13860 993 -1972 1007 -4956 1013 -4926 1005 -7908 995 -1972 1029 -7914 987 -1986 1009 -7906 981 -4956 1009 -4930 1005 -1966 1039 -4938 1007 -4916 1009 -7918 1019 -1968 989 -7892 1017 -4934 1027 -1956 1039 -7898 985 -1974 1007 -4960 981 -7930 985 -1996 989 -13824 1045 -1946 1025 -4928 1009 -4942 997 -7926 1011 -1968 1003 -7894 1023 -1962 993 -7902 1017 -4948 999 -4948 1007 -1968 1015 -4918 1045 -4926 999 -7888 1039 -1972 1013 -7888 1005 -4948 1001 -1970 1011 -7886 1013 -1974 1023 -4942 1005 -7890 1033 -1952 1021 -13806 1047 -1964 1001 -4936 1009 -4950 1001 -7882 1031 -1962 1007 -7906 1021 -1966 1011 -7908 985 -4946 1027 -4918 1011 -1968 1017 -4948 1009 -4932 1015 -7882 1009 -1964 1013 -7900 1017 -4950 1001 -1970 1013 -7916 1013 -1944 1031 -4916 1029 -7888 1007 -1976 1005 -13848 1013 -1968 995 -4952 1003 -4946 991 -7920 1019 -1968 983 -7904 1015 -1966 1019 -7894 1011 -4942 1027 -4924 1011 -1966 1015 -4944 1005 -4926 1007 -7914 1007 -1972 1013 -7884 1013 -4940 1027 -1968 1007 -7906 1001 -1980 999 -4944 1013 -7880 1009 -2000 1003 -13830 997 -1974 1009 -4930 1029 -4938 1013 -7880 1011 -1998 1001 -7908 997 -1966 1025 -7902 1013 -4938 983 -4962 979 -1998 1011 -4932 1005 -4924 1011 -7922 1009 -1970 1015 -7890 1011 -4946 1003 -1970 1013 -7892 1013 -1964 1027 -4928 1021 -7886 1007 -1980 1001 -13846 1013 -1968 999 -4948 1009 -4938 993 -7926 1011 -1964 991 -7926 1011 -1962 993 -7898 1041 -4906 1009 -4960 999 -1964 1023 -4932 1007 -4928 1013 -7898 1015 -1968 1013 -7894 1017 -4948 997 -1968 1031 -7892 1027 -1970 1005 -4914 1039 -7884 1023 -1964 1011 -13838 1013 -1948 1023 -4924 1015 -4942 1025 -7872 1029 -1964 1007 -7898 1025 -1960 1025 -7898 1021 -4912 1023 -4920 1011 -1970 1013 -4954 1011 -4926 1003 -7910 1011 -1968 1013 -7890 1009 -4938 1023 -1982 1007 -7902 1013 -1940 1023 -4926 1011 -7922 1007 -1980 997 -13816 1045 -1964 1001 -4948 1005 -4938 993 -7904 1005 -1966 1035 -7888 1027 -1964 1011 -7906 1015 -4916 1027 -4920 1011 -1968 1019 -4944 1009 -4928 1001 -7924 1009 -1972 979 -7914 1013 -4948 1001 -1970 1013 -7892 1015 -1966 1027 -4928 1021 -7872 1035 -1968 1011 -13832 1011 -1980 983 -4956 987 -4948 1025 -7892 1005 -1966 1007 -7914 1021 -1962 1007 RAW_Data: -7912 985 -4942 1023 -4926 1007 -1992 981 -4944 1035 -4920 1007 -7904 1025 -1962 991 -7934 981 -4948 995 -2004 1007 -7880 1007 -1992 983 -4946 1027 -7890 1007 -1982 999 -13830 1011 -1968 1025 -4926 1013 -4942 997 -7898 1027 -1960 1023 -7910 983 -2000 979 -7906 1015 -4940 1025 -4920 1011 -1968 1013 -225644 65 -2082 65 -155560 133 -5172 65 -1102 131 -48576 99 -24714 67 -6858 65 -1314 67 -38246 65 -64888 65 -4564 67 -59374 99 -20160 99 -17606 65 -42096 97 -11950 131 -29302 65 -19034 99 -32020 97 -366 65 -4430 131 -14620 99 -17318 65 -5556 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/nero_radio_raw.sub ================================================ Filetype: Flipper SubGhz RAW File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: RAW RAW_Data: 1487 -32700 235 -202 229 -218 217 -176 197 -220 217 -210 191 -218 217 -210 189 -218 217 -210 187 -212 181 -230 203 -194 211 -212 213 -226 197 -188 211 -212 213 -226 197 -186 211 -212 213 -228 195 -186 211 -212 239 -172 235 -218 181 -212 193 -218 219 -208 191 -212 211 -200 205 -224 181 -212 213 -228 197 -188 211 -212 213 -226 197 -186 211 -212 213 -226 197 -186 211 -212 213 -226 197 -186 211 -212 213 -226 197 -186 211 -212 237 -174 235 -218 789 -244 205 -384 415 -230 185 -418 419 -226 179 -436 419 -190 435 -198 415 -210 215 -406 187 -436 421 -190 213 -438 193 -404 413 -224 185 -430 411 -238 181 -432 201 -428 199 -404 207 -420 205 -426 385 -244 213 -400 411 -192 221 -400 239 -412 205 -426 205 -394 203 -412 243 -390 203 -426 417 -214 215 -402 211 -428 203 -392 205 -406 231 -396 411 -232 203 -408 207 -424 393 -232 203 -408 209 -422 395 -232 397 -244 391 -202 219 -430 389 -238 405 -208 425 -206 217 -394 389 -238 207 -388 243 -382 411 -244 383 -1234 219 -406 225 -198 255 -182 175 -204 211 -212 201 -208 227 -182 211 -214 227 -198 187 -212 211 -214 225 -198 185 -212 211 -240 171 -230 181 -212 213 -226 199 -188 211 -210 213 -228 195 -188 211 -212 213 -226 197 -186 211 -212 213 -228 195 -186 211 -212 213 -228 195 -188 209 -212 239 -172 227 -182 211 -212 227 -198 189 -212 211 -214 225 -198 187 -212 241 -182 227 -198 185 -212 211 -214 227 -196 185 -212 211 -240 173 -234 219 -182 209 -194 833 -210 213 -410 409 -232 199 -406 415 -204 215 -428 387 -244 391 -204 425 -206 215 -428 205 -382 419 -226 181 -434 195 -440 413 -192 219 -400 447 -202 217 -396 203 -418 189 -438 183 -436 195 -408 443 -194 217 -400 445 -204 217 -396 201 -430 199 -404 209 -422 205 -426 205 -412 193 -420 417 -202 223 -402 239 -408 207 -392 237 -382 223 -412 409 -226 191 -430 209 -416 395 -232 197 -404 209 -422 395 -232 397 -242 393 -202 217 -432 389 -238 407 -206 393 -238 217 -396 387 -238 209 -386 243 -388 411 -240 407 -4594 195 -408 245 -214 173 -218 211 -182 231 -204 223 -180 211 -214 227 -198 187 -212 211 -214 225 -198 185 -212 211 -214 227 -196 185 -212 211 -214 227 -196 185 -212 211 -240 173 -234 217 -182 211 -194 219 -218 207 -192 211 -212 199 -206 223 -182 211 -214 227 -198 187 -212 211 -240 171 -236 217 -182 211 -194 217 -220 207 -192 211 -212 201 -206 193 -212 241 -182 227 -200 187 -212 209 -240 173 -228 RAW_Data: 181 -212 211 -228 197 -188 211 -212 213 -228 815 -200 205 -404 437 -200 217 -432 389 -238 171 -414 445 -192 401 -244 389 -204 215 -426 203 -428 383 -246 177 -430 211 -428 389 -236 171 -412 413 -224 187 -430 239 -406 205 -394 237 -394 203 -410 415 -230 185 -432 411 -200 217 -432 203 -394 203 -436 201 -398 221 -404 227 -412 185 -436 423 -206 217 -416 207 -392 201 -418 223 -410 217 -404 425 -206 215 -418 205 -394 415 -244 211 -396 213 -426 387 -202 437 -208 391 -238 181 -432 387 -240 411 -206 425 -206 217 -396 387 -238 209 -388 243 -382 411 -244 383 -4672 243 -394 239 -182 253 -176 195 -182 211 -230 201 -192 209 -212 213 -192 231 -188 211 -212 211 -194 231 -186 211 -212 211 -194 231 -186 211 -212 211 -194 231 -186 211 -212 211 -228 197 -186 211 -212 211 -194 231 -186 211 -212 213 -192 231 -186 211 -212 211 -194 231 -186 211 -212 211 -194 231 -186 211 -212 211 -194 231 -186 211 -212 211 -194 229 -188 241 -182 211 -226 197 -188 211 -212 211 -194 231 -186 211 -212 211 -194 231 -186 211 -212 861 -188 211 -412 415 -210 211 -390 449 -190 215 -400 449 -166 465 -170 409 -210 251 -362 245 -396 423 -202 203 -408 247 -392 425 -200 201 -406 453 -170 253 -392 205 -380 257 -382 217 -404 227 -410 405 -200 231 -402 419 -204 217 -430 205 -380 221 -414 217 -404 227 -408 215 -404 227 -374 435 -198 233 -398 245 -390 205 -426 205 -378 257 -382 439 -194 225 -396 245 -388 395 -230 199 -404 247 -390 425 -200 431 -174 429 -202 219 -398 419 -204 441 -208 425 -170 253 -396 387 -240 207 -382 247 -390 409 -204 439 -4538 203 -408 229 -196 223 -182 217 -210 191 -220 217 -208 191 -210 211 -204 205 -194 211 -212 213 -192 231 -186 211 -212 213 -192 231 -186 211 -212 213 -192 231 -188 211 -212 211 -192 231 -186 211 -212 213 -192 231 -188 211 -212 211 -194 229 -186 211 -212 213 -192 231 -188 211 -212 211 -194 229 -188 211 -210 213 -194 229 -186 211 -212 213 -192 231 -186 243 -180 211 -228 197 -186 211 -212 213 -192 231 -188 211 -212 211 -194 229 -186 211 -212 833 -210 215 -408 407 -234 199 -404 417 -206 215 -430 415 -216 393 -204 427 -206 217 -394 241 -392 429 -186 213 -412 237 -394 431 -174 251 -376 437 -192 225 -396 245 -390 205 -394 237 -396 235 -378 447 -192 213 -400 447 -166 255 -396 201 -430 199 -400 245 -390 205 -426 205 -380 257 -382 439 -194 223 -398 211 -422 205 -394 237 -396 237 -376 453 -166 RAW_Data: 215 -432 203 -402 439 -204 203 -404 247 -390 425 -202 429 -176 427 -202 219 -396 421 -204 441 -208 427 -168 253 -396 387 -240 207 -382 245 -392 409 -204 439 -4532 225 -398 247 -178 241 -154 249 -182 217 -216 217 -176 239 -182 217 -212 191 -218 219 -176 221 -212 211 -202 205 -196 211 -212 211 -192 231 -186 211 -212 213 -192 231 -186 211 -212 211 -228 197 -186 211 -212 211 -228 197 -186 211 -212 211 -228 197 -186 211 -212 211 -194 231 -186 211 -212 213 -192 231 -188 211 -212 211 -192 231 -186 211 -212 213 -192 263 -156 211 -212 213 -192 231 -184 211 -212 213 -192 231 -186 211 -212 213 -192 231 -186 857 -202 217 -396 415 -212 213 -394 447 -190 215 -400 449 -166 447 -192 413 -212 215 -408 211 -428 387 -240 207 -382 247 -394 423 -202 203 -408 419 -204 251 -394 205 -380 255 -384 245 -394 203 -418 415 -206 217 -420 399 -194 229 -398 247 -390 205 -426 205 -380 255 -384 245 -394 203 -418 415 -206 217 -420 207 -394 237 -394 203 -406 247 -390 425 -202 201 -406 245 -392 425 -200 201 -406 245 -392 425 -200 431 -174 427 -204 217 -398 421 -202 441 -208 427 -168 255 -394 387 -240 207 -384 245 -392 407 -204 445 -4518 227 -398 241 -172 257 -152 211 -212 225 -200 217 -182 211 -212 227 -198 215 -182 211 -214 225 -198 217 -182 211 -212 225 -198 217 -180 211 -214 225 -198 217 -182 211 -212 227 -196 215 -182 211 -214 225 -198 217 -182 211 -212 227 -198 215 -182 211 -212 227 -196 217 -180 211 -214 225 -198 215 -182 211 -214 225 -198 217 -182 211 -212 225 -198 215 -182 211 -212 225 -198 217 -182 211 -212 227 -198 217 -182 211 -212 227 -196 217 -182 211 -212 855 -176 243 -380 453 -170 253 -392 417 -214 215 -366 445 -192 431 -216 431 -170 251 -392 205 -394 415 -212 249 -362 245 -396 423 -202 203 -408 453 -170 253 -392 205 -412 225 -384 217 -404 227 -410 421 -200 219 -400 445 -168 253 -396 203 -394 233 -398 247 -388 205 -426 205 -380 223 -416 419 -202 223 -400 241 -374 243 -394 237 -394 203 -406 419 -204 251 -394 205 -380 457 -204 217 -398 205 -426 415 -216 395 -204 427 -204 219 -394 417 -212 421 -206 425 -206 217 -396 417 -212 209 -388 247 -394 423 -202 435 -4428 207 -406 243 -180 211 -196 253 -182 209 -192 217 -218 209 -188 217 -220 207 -188 211 -180 231 -206 223 -182 211 -212 227 -198 215 -182 211 -212 227 -198 217 -180 211 -214 225 -198 215 -182 211 -214 225 -198 215 -182 211 -214 225 -198 RAW_Data: 217 -180 211 -214 225 -198 215 -182 211 -214 225 -198 215 -182 211 -214 225 -198 217 -182 209 -214 225 -198 215 -182 241 -182 227 -200 185 -212 211 -206 241 -164 211 -212 213 -226 197 -188 211 -212 213 -226 819 -200 241 -370 435 -202 217 -398 421 -202 241 -378 453 -166 429 -210 423 -206 215 -422 207 -392 417 -210 213 -394 247 -394 423 -202 203 -408 453 -170 251 -394 205 -410 225 -386 245 -394 203 -418 411 -190 213 -434 417 -190 211 -406 225 -398 245 -392 205 -428 205 -410 227 -386 245 -394 417 -212 207 -386 245 -394 203 -428 205 -410 227 -386 439 -194 223 -398 209 -422 395 -232 199 -406 245 -390 423 -202 399 -210 427 -202 217 -398 421 -204 439 -208 427 -168 253 -396 387 -240 207 -382 245 -392 409 -240 407 -4630 235 -388 213 -192 249 -162 215 -218 217 -210 189 -220 217 -176 221 -218 217 -178 217 -182 241 -202 205 -192 211 -212 211 -194 231 -186 211 -212 213 -192 231 -186 211 -212 211 -194 231 -186 211 -212 211 -194 231 -186 211 -212 213 -192 231 -186 211 -212 213 -192 231 -186 211 -212 213 -192 231 -186 211 -212 213 -192 231 -186 211 -212 213 -192 231 -186 211 -212 213 -192 231 -186 211 -212 213 -192 231 -186 211 -212 213 -192 231 -188 211 -212 829 -210 215 -410 407 -232 201 -404 419 -204 217 -430 385 -210 427 -204 427 -204 219 -394 239 -394 431 -176 251 -374 245 -394 417 -210 209 -388 445 -192 221 -380 223 -416 245 -394 203 -428 199 -400 419 -204 215 -430 383 -246 215 -364 245 -396 239 -392 207 -408 229 -388 217 -404 229 -410 419 -200 219 -400 239 -372 243 -392 239 -394 201 -406 451 -170 251 -392 205 -412 429 -202 217 -398 205 -426 417 -214 429 -168 427 -206 217 -396 417 -210 423 -206 425 -206 217 -396 417 -210 211 -390 245 -394 425 -202 435 -32700 389 -182 211 -212 211 -194 229 -186 211 -212 213 -226 197 -188 211 -212 211 -226 197 -188 211 -212 211 -228 197 -186 211 -212 211 -194 229 -186 211 -212 213 -226 197 -188 211 -212 211 -226 197 -188 211 -212 211 -226 197 -188 209 -212 213 -226 197 -186 211 -212 213 -226 197 -188 211 -212 211 -226 197 -188 211 -210 213 -226 197 -188 211 -212 211 -228 195 -188 211 -212 211 -226 197 -188 211 -210 213 -226 199 -186 211 -212 831 -218 213 -408 417 -210 211 -390 451 -198 183 -430 429 -190 435 -196 411 -212 217 -404 217 -404 425 -206 215 -418 207 -394 415 -210 211 -396 447 -192 221 -396 237 -380 243 -394 203 -428 205 -410 429 -202 RAW_Data: 219 -398 423 -202 203 -408 245 -388 205 -426 205 -410 227 -388 243 -394 417 -210 209 -386 245 -392 203 -428 205 -410 227 -388 245 -392 417 -210 209 -388 245 -394 421 -202 205 -410 243 -392 423 -202 399 -244 393 -202 217 -432 387 -238 205 -380 245 -392 203 -428 417 -214 215 -400 211 -396 423 -202 441 -1048 211 -396 237 -182 215 -214 217 -182 211 -200 211 -212 237 -174 227 -182 211 -214 225 -198 187 -212 211 -214 225 -198 185 -212 211 -214 225 -198 185 -212 211 -214 225 -198 185 -212 211 -214 225 -198 185 -212 211 -240 173 -230 181 -212 211 -228 197 -188 211 -212 213 -228 195 -186 211 -212 213 -228 195 -186 211 -212 213 -228 195 -186 211 -212 213 -226 229 -158 211 -212 237 -174 227 -180 211 -214 227 -198 187 -212 211 -214 227 -196 187 -210 831 -236 217 -394 395 -232 201 -406 415 -204 213 -430 417 -214 391 -204 425 -206 215 -428 205 -412 391 -238 217 -394 205 -426 385 -244 213 -398 417 -200 189 -432 203 -440 207 -394 201 -416 223 -410 409 -234 197 -402 417 -202 215 -430 205 -412 191 -418 217 -404 227 -410 185 -436 423 -206 215 -416 205 -394 201 -430 201 -408 245 -388 203 -426 417 -214 213 -402 211 -428 389 -238 203 -384 243 -390 423 -202 399 -244 391 -202 217 -432 387 -238 205 -384 243 -390 203 -428 417 -212 215 -402 211 -428 389 -238 405 -4628 201 -420 211 -216 243 -162 217 -218 207 -190 217 -218 209 -188 211 -182 229 -206 221 -182 211 -214 227 -196 187 -212 211 -214 225 -198 185 -212 211 -214 225 -198 185 -212 211 -214 225 -198 185 -212 211 -214 225 -198 185 -212 211 -214 225 -198 185 -212 211 -214 225 -198 185 -212 211 -214 225 -198 185 -212 211 -214 225 -198 185 -212 211 -240 171 -236 217 -182 211 -196 219 -218 207 -190 211 -182 231 -206 223 -182 211 -214 227 -198 185 -212 829 -224 211 -404 425 -206 215 -420 397 -230 197 -402 415 -204 407 -230 397 -244 217 -374 209 -428 417 -210 209 -388 243 -394 423 -202 203 -410 417 -240 213 -394 205 -410 227 -386 245 -394 201 -418 417 -206 215 -422 415 -206 203 -410 193 -418 245 -392 203 -428 199 -406 209 -422 395 -232 201 -406 245 -388 205 -426 205 -410 227 -386 245 -394 417 -208 209 -388 245 -392 423 -202 203 -410 243 -390 425 -202 433 -208 393 -202 217 -432 387 -240 203 -382 243 -394 203 -428 415 -214 215 -400 211 -430 389 -202 439 -4622 235 -388 215 -184 265 -170 201 -212 211 -202 207 -194 211 -212 213 -192 231 -186 211 -212 RAW_Data: 213 -192 231 -186 211 -212 213 -192 231 -188 211 -212 211 -192 231 -186 211 -212 213 -192 231 -188 211 -210 213 -192 231 -186 211 -212 211 -228 197 -186 211 -212 211 -228 197 -186 211 -212 213 -192 231 -186 211 -212 213 -192 231 -186 211 -212 211 -228 197 -186 241 -182 211 -226 199 -186 211 -212 211 -228 197 -186 211 -212 211 -228 197 -186 211 -212 865 -174 251 -376 439 -192 193 -428 419 -204 217 -396 417 -210 425 -206 425 -206 217 -396 203 -430 393 -210 251 -376 245 -394 417 -210 209 -384 453 -166 213 -430 201 -408 245 -394 203 -428 205 -408 429 -202 219 -398 423 -202 201 -406 247 -390 205 -428 205 -378 257 -384 245 -394 417 -210 211 -386 245 -394 205 -426 205 -410 227 -384 247 -394 415 -212 209 -386 247 -392 407 -204 241 -380 247 -392 407 -204 441 -188 435 -198 193 -428 419 -204 217 -396 239 -380 223 -408 407 -234 201 -400 247 -388 427 -200 429 -4488 243 -394 237 -182 217 -210 191 -212 211 -202 205 -196 211 -210 213 -194 231 -186 211 -212 211 -194 231 -186 211 -212 211 -194 231 -186 211 -212 211 -194 231 -186 211 -212 211 -194 231 -186 211 -212 211 -194 229 -188 211 -210 213 -226 199 -186 211 -212 211 -194 231 -186 211 -212 211 -194 231 -186 211 -212 211 -194 231 -186 211 -212 211 -228 197 -186 241 -182 211 -226 197 -188 211 -212 211 -194 231 -186 211 -212 211 -194 231 -186 211 -212 865 -176 251 -372 439 -202 199 -404 419 -204 217 -430 383 -212 429 -204 427 -204 219 -394 239 -394 431 -176 251 -374 245 -392 417 -212 209 -386 453 -166 213 -430 203 -408 245 -392 205 -426 205 -410 427 -204 217 -398 423 -202 203 -406 245 -392 205 -426 205 -380 257 -382 245 -396 415 -212 209 -386 245 -394 205 -428 205 -410 225 -384 247 -394 417 -210 209 -388 245 -394 423 -202 235 -376 247 -390 425 -202 429 -176 427 -202 219 -398 419 -204 239 -378 245 -394 205 -426 417 -214 217 -368 245 -396 423 -202 437 -4658 199 -416 213 -216 241 -160 219 -218 207 -186 211 -182 231 -204 223 -182 211 -212 227 -198 215 -182 211 -212 227 -198 185 -212 211 -214 225 -198 215 -182 211 -212 227 -198 215 -182 211 -212 227 -198 215 -182 211 -212 227 -196 217 -182 211 -212 227 -196 217 -182 211 -212 227 -198 215 -182 211 -212 227 -198 215 -182 211 -212 227 -196 217 -182 211 -212 261 -166 193 -212 211 -204 205 -194 211 -212 213 -226 197 -188 211 -212 211 -228 195 -188 857 -202 217 -394 417 -210 213 -394 447 -192 RAW_Data: 217 -400 445 -204 409 -194 413 -218 211 -410 199 -418 419 -204 215 -424 205 -394 415 -210 213 -398 443 -192 219 -400 239 -412 207 -392 239 -394 203 -408 451 -196 183 -432 409 -202 217 -432 203 -394 241 -370 231 -398 219 -404 227 -412 407 -234 197 -402 209 -420 205 -426 205 -412 193 -418 243 -394 417 -208 209 -388 245 -392 423 -202 205 -410 245 -388 425 -202 397 -244 393 -202 217 -432 387 -238 205 -382 243 -390 203 -428 417 -212 215 -404 211 -430 387 -204 439 -4628 237 -396 209 -216 243 -162 217 -218 209 -188 217 -218 209 -188 217 -218 207 -188 211 -182 231 -204 223 -182 211 -212 227 -198 215 -182 211 -212 227 -196 217 -182 211 -212 225 -198 217 -182 211 -212 225 -198 217 -182 211 -212 225 -198 217 -182 211 -212 227 -198 185 -212 211 -214 225 -198 215 -182 211 -212 227 -198 215 -182 211 -214 225 -198 215 -182 211 -212 225 -198 217 -182 211 -212 227 -198 215 -182 211 -212 225 -198 217 -182 211 -212 855 -178 243 -380 417 -204 251 -394 415 -216 215 -366 447 -190 433 -184 433 -196 219 -400 241 -378 433 -196 229 -398 247 -392 425 -200 199 -404 419 -204 217 -428 205 -412 193 -416 209 -430 201 -418 417 -206 215 -422 397 -196 229 -400 245 -388 205 -426 205 -410 227 -384 243 -394 417 -210 211 -386 245 -392 203 -428 205 -410 227 -388 243 -394 417 -210 209 -388 245 -394 425 -202 203 -408 245 -390 425 -202 431 -174 429 -202 217 -432 387 -202 241 -380 247 -392 203 -428 415 -214 215 -400 211 -428 387 -238 405 -4494 237 -392 241 -180 255 -180 215 -182 217 -210 191 -218 217 -208 189 -212 211 -202 203 -194 211 -212 211 -228 197 -188 211 -212 211 -226 197 -188 211 -212 211 -226 197 -188 211 -212 213 -226 197 -186 211 -212 213 -228 195 -186 211 -212 213 -194 229 -188 211 -210 213 -194 229 -186 211 -212 213 -192 231 -186 211 -212 213 -194 229 -186 211 -212 211 -228 197 -188 211 -212 213 -192 229 -186 211 -212 211 -226 197 -188 211 -212 211 -226 197 -188 859 -204 217 -396 415 -210 211 -392 453 -196 187 -418 419 -224 403 -198 423 -210 215 -408 211 -430 387 -240 205 -384 245 -394 423 -202 203 -408 417 -206 215 -428 205 -412 193 -416 245 -394 201 -428 393 -210 215 -410 405 -226 193 -428 209 -420 205 -428 203 -412 191 -418 209 -430 387 -240 207 -386 245 -392 205 -426 205 -410 227 -388 243 -394 417 -210 209 -388 245 -394 423 -202 203 -408 245 -392 423 -202 433 -210 393 -202 217 -432 387 -238 RAW_Data: 203 -380 245 -392 203 -428 417 -214 215 -400 213 -396 421 -202 441 -32700 249 -214 213 -192 227 -184 211 -212 213 -226 197 -186 211 -212 213 -226 197 -186 211 -212 213 -226 197 -186 211 -212 213 -226 197 -186 211 -212 213 -226 197 -186 211 -212 213 -226 197 -186 211 -212 213 -226 197 -186 211 -212 213 -226 197 -186 211 -212 213 -226 197 -186 211 -212 213 -226 197 -186 211 -212 213 -226 197 -186 211 -212 213 -226 197 -186 211 -212 213 -226 197 -186 211 -212 213 -226 197 -186 211 -212 213 -226 197 -186 857 -196 211 -404 435 -194 211 -404 427 -204 215 -410 411 -208 423 -206 425 -206 217 -396 201 -430 395 -244 215 -376 209 -428 417 -208 209 -388 451 -198 187 -428 201 -410 243 -392 201 -428 203 -412 429 -204 217 -398 425 -200 203 -410 243 -390 203 -428 203 -412 227 -386 209 -428 417 -210 209 -388 245 -390 203 -428 205 -410 227 -392 209 -428 417 -208 209 -390 245 -390 423 -202 203 -412 243 -390 425 -200 399 -244 393 -202 217 -432 387 -238 205 -380 245 -392 203 -426 417 -214 215 -404 211 -430 387 -204 439 -1154 195 -408 243 -196 185 -224 219 -218 209 -200 181 -212 213 -226 197 -186 211 -212 213 -226 197 -186 211 -212 213 -228 195 -186 211 -212 213 -228 195 -186 211 -212 213 -228 195 -186 211 -212 213 -226 197 -186 211 -212 213 -226 197 -186 211 -212 213 -226 195 -188 211 -212 213 -226 197 -186 211 -212 213 -226 197 -186 211 -212 213 -226 195 -188 211 -212 243 -202 203 -186 211 -212 199 -206 225 -182 211 -214 225 -198 187 -212 211 -212 227 -196 833 -196 225 -412 393 -236 217 -396 393 -232 201 -406 417 -204 435 -202 397 -244 215 -376 243 -394 417 -210 209 -388 245 -382 411 -244 193 -412 425 -202 203 -408 243 -390 203 -428 203 -412 227 -386 417 -202 233 -410 427 -202 217 -396 203 -428 205 -410 193 -418 209 -428 203 -428 393 -210 213 -412 209 -428 203 -428 197 -404 209 -422 205 -426 385 -246 213 -398 213 -396 421 -202 237 -380 245 -390 425 -200 399 -244 393 -202 217 -432 387 -240 203 -382 245 -390 205 -426 417 -214 215 -402 211 -430 387 -202 441 -4664 205 -398 211 -216 241 -164 217 -218 209 -188 217 -220 207 -188 211 -182 231 -204 223 -182 209 -214 227 -198 185 -212 211 -214 225 -198 185 -212 211 -214 227 -196 185 -212 211 -214 225 -198 185 -212 211 -214 227 -196 185 -212 211 -214 225 -198 185 -212 211 -214 225 -198 185 -212 211 -214 227 -196 187 -210 211 -214 227 -196 185 -212 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/nero_sketch_raw.sub ================================================ Filetype: Flipper SubGhz RAW File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: RAW RAW_Data: -2704 519 -368 279 -698 297 -712 259 -716 309 -688 647 -356 289 -710 615 -384 275 -692 345 -654 321 -696 619 -376 317 -658 335 -652 325 -684 655 -336 317 -698 295 -682 325 -678 639 -376 319 -662 331 -652 677 -352 631 -326 677 -326 315 -682 323 -680 317 -670 315 -702 637 -362 315 -654 679 -352 315 -658 315 -690 321 -676 647 -346 317 -660 337 -688 289 -686 655 -338 1007 -334 317 -350 301 -344 343 -350 315 -334 325 -352 313 -334 313 -346 349 -316 333 -326 351 -314 333 -348 315 -350 301 -344 343 -352 315 -302 353 -352 313 -334 313 -346 315 -350 301 -358 351 -314 333 -316 345 -350 303 -344 343 -352 313 -334 323 -350 315 -334 313 -344 349 -304 343 -340 317 -350 301 -356 315 -350 301 -346 345 -350 301 -344 343 -352 315 -302 353 -352 313 -334 313 -346 315 -350 333 -326 353 -314 333 -314 347 -350 1315 -320 681 -346 297 -680 317 -672 315 -700 311 -672 649 -354 323 -684 643 -352 313 -658 347 -654 323 -664 651 -376 317 -660 333 -652 323 -684 655 -338 317 -688 321 -676 293 -704 639 -338 353 -662 299 -684 647 -350 667 -326 677 -326 313 -676 323 -680 317 -670 315 -700 639 -362 315 -688 647 -352 313 -658 351 -662 297 -682 647 -350 349 -656 311 -688 321 -660 653 -342 1007 -334 317 -350 303 -344 343 -350 317 -332 325 -352 315 -336 311 -346 349 -316 333 -328 351 -316 303 -344 345 -350 303 -342 343 -316 351 -300 355 -350 315 -334 313 -344 315 -352 331 -328 351 -314 333 -316 345 -350 301 -344 341 -352 315 -332 323 -352 315 -334 313 -344 349 -316 333 -328 351 -316 333 -314 347 -350 301 -344 341 -352 315 -334 323 -352 315 -336 311 -346 313 -352 331 -328 351 -316 303 -344 345 -350 303 -342 343 -352 1281 -352 645 -346 333 -678 315 -672 313 -702 311 -672 643 -354 325 -676 645 -352 313 -690 315 -654 323 -704 649 -344 317 -660 335 -652 323 -684 671 -346 317 -660 335 -684 291 -682 671 -346 317 -660 335 -652 677 -352 627 -364 645 -324 351 -648 323 -682 317 -674 347 -656 643 -360 313 -676 649 -350 315 -692 307 -688 287 -690 653 -338 353 -664 297 -678 319 -684 655 -338 983 -362 315 -350 303 -342 341 -352 315 -334 323 -352 313 -334 313 -346 313 -352 333 -326 351 -316 303 -344 345 -350 303 -342 343 -316 351 -300 355 -352 313 -334 313 -346 313 -352 301 -358 351 -314 305 -344 345 -350 301 -342 343 -352 315 -302 353 -352 315 -334 313 -344 349 -304 341 -342 317 -350 301 -354 317 -350 301 -344 345 -350 315 RAW_Data: -334 325 -354 313 -334 313 -346 349 -302 341 -344 315 -352 301 -354 317 -348 303 -344 345 -350 1315 -324 677 -316 313 -706 293 -702 315 -670 313 -670 675 -322 329 -688 643 -352 315 -688 315 -654 323 -698 641 -348 315 -692 305 -688 289 -686 651 -342 353 -662 329 -652 323 -684 655 -334 317 -690 321 -676 649 -346 639 -354 637 -360 313 -676 323 -680 309 -688 317 -688 645 -350 315 -658 677 -320 329 -684 319 -660 341 -658 643 -354 327 -684 289 -688 341 -658 677 -320 989 -354 303 -352 315 -334 351 -350 315 -334 313 -342 315 -350 301 -358 351 -316 333 -314 345 -350 303 -342 341 -352 315 -334 323 -352 315 -334 311 -346 313 -352 301 -358 351 -314 305 -344 345 -350 315 -336 325 -352 313 -336 313 -346 349 -316 301 -358 351 -316 303 -344 345 -350 303 -342 341 -316 351 -332 323 -352 315 -334 311 -346 315 -350 303 -356 317 -350 301 -346 343 -350 303 -342 341 -318 349 -302 353 -352 313 -334 311 -346 1325 -350 655 -344 317 -662 333 -652 323 -680 317 -672 671 -334 317 -688 649 -350 301 -672 347 -656 347 -654 643 -352 313 -690 317 -654 323 -702 649 -346 317 -660 335 -652 323 -686 655 -338 351 -654 321 -676 647 -346 639 -356 635 -362 311 -676 323 -680 309 -688 317 -688 647 -352 313 -660 643 -354 325 -684 289 -688 343 -656 645 -354 323 -686 289 -682 317 -672 671 -336 975 -364 317 -350 303 -342 341 -352 317 -332 323 -352 315 -334 313 -344 315 -350 333 -326 351 -316 303 -346 345 -350 301 -344 341 -352 315 -302 353 -352 315 -334 313 -344 315 -350 333 -326 353 -314 303 -344 345 -350 315 -334 327 -352 313 -334 315 -346 349 -304 343 -342 315 -350 301 -356 315 -350 303 -344 345 -350 315 -334 325 -352 315 -334 315 -344 351 -302 343 -340 317 -352 299 -356 315 -350 303 -346 345 -350 313 -334 325 -352 1291 -346 655 -348 349 -658 309 -688 319 -658 343 -656 677 -320 327 -686 645 -350 313 -690 315 -652 323 -704 649 -346 317 -662 335 -652 323 -682 655 -338 319 -688 321 -676 295 -708 627 -364 317 -688 289 -704 651 -346 653 -322 659 -332 343 -670 317 -682 311 -688 317 -688 649 -352 315 -658 643 -356 323 -676 321 -662 343 -656 677 -322 325 -686 319 -658 343 -658 651 -354 987 -322 331 -354 313 -336 317 -382 313 -334 313 -342 315 -352 301 -358 315 -350 303 -344 347 -350 301 -344 341 -316 351 -332 323 -352 315 -336 311 -346 313 -352 301 -356 353 -314 305 -344 345 -350 315 -334 325 -354 313 -336 313 -346 349 RAW_Data: -316 301 -358 351 -316 333 -314 347 -350 301 -344 341 -316 349 -334 323 -352 315 -334 311 -344 349 -302 343 -342 315 -352 299 -354 315 -350 301 -346 343 -350 315 -334 327 -350 315 -336 313 -344 1311 -352 657 -338 351 -664 295 -684 323 -680 309 -688 645 -324 351 -650 677 -352 315 -658 347 -654 321 -662 651 -376 317 -662 333 -650 325 -678 641 -376 317 -662 331 -650 323 -680 639 -376 319 -660 333 -650 677 -352 629 -328 677 -326 317 -680 323 -680 315 -672 313 -702 639 -362 315 -652 681 -352 313 -660 315 -666 327 -682 647 -348 315 -690 309 -676 321 -664 685 -344 971 -336 317 -350 303 -344 345 -350 315 -334 325 -354 313 -336 313 -346 349 -316 333 -326 351 -316 303 -346 345 -350 301 -344 341 -352 315 -302 353 -352 313 -334 311 -346 315 -350 301 -358 351 -316 333 -314 347 -350 301 -344 339 -354 315 -300 355 -352 313 -334 313 -344 351 -316 301 -356 351 -316 301 -346 345 -350 315 -334 327 -352 313 -334 315 -346 349 -316 333 -326 351 -316 333 -314 347 -350 301 -342 343 -350 315 -334 323 -352 1293 -346 657 -348 317 -660 339 -654 321 -686 343 -654 651 -324 353 -650 677 -352 315 -658 345 -652 321 -664 653 -376 317 -662 331 -652 323 -682 657 -336 317 -666 327 -678 323 -682 655 -336 317 -688 321 -674 647 -348 637 -356 637 -330 343 -676 325 -676 315 -672 313 -702 641 -322 331 -688 643 -352 313 -690 315 -654 321 -702 649 -346 317 -662 333 -652 323 -682 655 -338 973 -364 317 -350 301 -342 343 -352 315 -332 323 -352 315 -336 311 -344 313 -352 333 -326 351 -316 301 -346 345 -350 301 -344 343 -350 315 -302 353 -352 313 -334 313 -346 315 -350 333 -326 351 -316 331 -318 345 -350 315 -334 325 -354 313 -336 313 -344 349 -304 341 -342 315 -350 301 -356 315 -350 303 -344 347 -350 315 -334 325 -352 315 -332 315 -346 349 -304 343 -340 317 -352 299 -356 317 -350 301 -344 345 -350 315 -336 325 -352 1289 -346 655 -348 315 -692 309 -688 319 -658 343 -656 677 -322 325 -686 643 -352 313 -658 347 -654 321 -668 683 -344 317 -660 335 -652 323 -680 671 -344 319 -660 333 -650 325 -680 671 -344 319 -660 333 -650 677 -352 629 -328 677 -324 317 -680 323 -680 317 -672 313 -702 643 -322 331 -686 643 -352 313 -690 315 -654 323 -702 649 -346 317 -660 335 -652 323 -684 657 -336 973 -364 317 -350 301 -346 341 -352 315 -334 323 -352 315 -334 313 -344 313 -352 301 -356 353 -314 301 -346 345 -350 301 -344 341 -318 349 RAW_Data: -302 353 -352 315 -334 311 -346 315 -350 303 -356 351 -314 333 -316 345 -350 315 -334 325 -354 313 -336 313 -344 315 -350 333 -326 353 -314 305 -344 345 -350 301 -342 343 -352 315 -302 353 -352 313 -334 313 -346 315 -350 301 -358 351 -314 333 -314 347 -350 301 -342 343 -350 315 -332 325 -352 1317 -316 659 -338 353 -662 299 -682 325 -680 311 -690 645 -326 315 -682 677 -318 349 -656 343 -654 321 -660 653 -374 319 -662 329 -652 323 -678 639 -376 319 -662 331 -650 323 -680 639 -376 319 -660 331 -652 679 -318 665 -326 679 -326 313 -674 319 -682 317 -670 347 -670 639 -328 347 -654 679 -350 315 -656 317 -688 321 -676 647 -346 317 -658 337 -652 323 -682 671 -346 969 -338 353 -314 303 -344 345 -350 315 -336 325 -352 313 -336 313 -344 315 -350 333 -326 351 -316 303 -346 343 -350 317 -334 325 -352 315 -334 313 -344 315 -350 333 -326 317 -350 305 -344 343 -350 317 -334 325 -350 315 -336 311 -346 349 -304 341 -342 315 -352 299 -354 317 -350 301 -344 345 -352 315 -334 323 -352 315 -334 311 -346 313 -352 301 -358 315 -352 303 -344 345 -350 315 -334 325 -352 315 -336 313 -344 315 -350 301 -358 1309 -350 665 -326 345 -670 321 -674 295 -702 315 -670 639 -362 315 -654 681 -352 313 -658 317 -688 321 -676 647 -346 315 -662 337 -654 323 -682 653 -338 353 -654 321 -676 295 -704 639 -340 351 -656 321 -676 647 -346 639 -352 639 -330 345 -670 319 -680 315 -670 315 -700 639 -328 347 -652 681 -352 313 -658 315 -666 329 -680 647 -348 315 -690 309 -688 289 -686 653 -374 949 -364 315 -350 303 -344 343 -352 315 -332 323 -352 313 -334 313 -344 315 -350 333 -326 317 -350 301 -346 345 -350 315 -332 327 -352 315 -334 313 -346 349 -316 301 -360 315 -350 303 -344 345 -350 303 -342 341 -318 349 -300 355 -350 313 -334 313 -346 313 -352 301 -356 351 -316 301 -346 345 -350 301 -344 341 -316 351 -300 353 -352 313 -334 313 -346 313 -352 301 -356 315 -350 303 -344 345 -350 315 -332 325 -352 313 -334 313 -346 1311 -346 671 -352 315 -656 345 -654 321 -662 341 -658 651 -354 323 -684 645 -352 313 -658 345 -654 321 -662 653 -376 319 -662 333 -650 325 -680 657 -334 317 -688 291 -704 295 -702 639 -338 351 -654 321 -676 649 -346 637 -356 635 -362 311 -676 325 -676 317 -670 313 -690 641 -344 301 -690 653 -340 351 -654 323 -678 293 -704 639 -338 353 -662 295 -684 323 -680 657 -336 977 -330 349 -354 317 -302 355 -352 315 RAW_Data: -304 341 -346 349 -318 333 -326 317 -350 303 -344 343 -354 315 -302 355 -352 315 -336 311 -344 317 -352 301 -356 351 -316 303 -344 343 -352 317 -302 353 -352 315 -336 311 -346 315 -352 301 -356 351 -316 303 -344 345 -352 315 -334 325 -352 315 -304 343 -344 317 -350 303 -356 353 -314 303 -344 345 -352 315 -334 325 -354 313 -304 343 -346 349 -316 333 -326 351 -316 303 -344 345 -350 315 -334 1319 -338 679 -322 321 -680 319 -658 345 -656 351 -630 657 -348 333 -674 641 -342 355 -660 331 -652 323 -682 655 -336 317 -658 353 -674 295 -670 665 -362 317 -656 321 -668 343 -658 677 -320 329 -678 319 -664 685 -310 689 -322 657 -332 309 -698 317 -678 311 -688 319 -668 667 -344 297 -682 653 -338 355 -630 329 -684 323 -676 639 -340 355 -662 331 -650 325 -678 671 -310 1007 -334 319 -350 303 -344 343 -352 317 -334 323 -352 315 -304 343 -346 315 -352 333 -326 351 -316 303 -344 343 -352 315 -334 327 -350 317 -334 313 -344 351 -318 333 -326 351 -316 303 -344 345 -350 315 -334 325 -354 315 -334 313 -344 349 -320 301 -356 351 -316 303 -344 343 -350 317 -332 325 -352 315 -336 311 -346 317 -350 333 -326 353 -314 305 -342 345 -352 315 -334 323 -354 313 -336 311 -346 315 -352 301 -358 351 -314 305 -342 1337 -348 655 -322 329 -688 319 -658 343 -656 353 -654 649 -350 301 -670 663 -328 347 -670 321 -678 293 -702 637 -340 353 -662 329 -648 325 -678 671 -344 319 -662 331 -652 323 -682 655 -338 351 -630 327 -682 647 -350 655 -322 663 -344 333 -662 343 -656 317 -690 321 -676 645 -348 317 -662 669 -346 299 -684 343 -654 317 -688 647 -314 343 -662 343 -656 353 -656 649 -346 999 -326 311 -346 349 -304 341 -342 317 -352 299 -354 317 -350 303 -344 343 -352 317 -334 323 -352 317 -304 343 -344 317 -352 301 -354 317 -352 303 -342 345 -350 301 -344 339 -318 351 -300 353 -352 315 -304 341 -346 317 -350 301 -356 317 -350 303 -344 343 -352 317 -332 323 -354 315 -334 313 -344 317 -352 301 -356 317 -352 303 -344 343 -352 315 -334 323 -352 315 -336 311 -346 315 -352 301 -356 351 -316 303 -344 345 -350 319 -302 1343 -338 645 -352 323 -688 287 -688 345 -658 317 -666 655 -348 333 -674 659 -334 317 -656 321 -700 295 -670 665 -328 349 -654 323 -664 329 -670 669 -338 319 -666 327 -682 323 -678 637 -342 353 -662 329 -652 679 -318 667 -324 675 -318 349 -646 323 -682 317 -670 345 -670 635 -364 317 -656 681 -316 351 -656 317 RAW_Data: -690 319 -676 649 -346 317 -660 337 -646 323 -684 653 -342 1009 -332 317 -346 311 -330 343 -316 351 -352 315 -304 345 -344 317 -350 301 -354 353 -316 303 -344 343 -352 317 -302 355 -352 315 -304 343 -344 317 -352 301 -354 353 -316 303 -344 345 -352 315 -302 355 -352 315 -304 343 -344 317 -350 303 -356 317 -350 303 -344 345 -352 315 -302 353 -354 313 -304 343 -346 315 -352 301 -354 317 -350 305 -342 345 -352 315 -302 355 -352 315 -336 311 -346 349 -316 301 -358 353 -314 303 -344 343 -352 1311 -320 679 -346 297 -680 317 -670 345 -670 309 -670 675 -322 327 -686 643 -352 315 -656 349 -654 321 -666 683 -344 319 -660 331 -654 323 -678 671 -310 353 -662 331 -652 323 -678 671 -310 353 -662 331 -650 681 -318 665 -326 675 -326 313 -680 323 -682 309 -688 317 -656 681 -316 349 -660 645 -354 323 -650 323 -682 317 -672 671 -336 319 -664 327 -680 325 -676 637 -344 1005 -334 319 -350 303 -344 343 -318 351 -302 353 -352 315 -304 343 -344 317 -352 301 -354 317 -352 303 -344 343 -350 317 -334 325 -352 315 -304 343 -346 315 -352 301 -356 351 -316 303 -344 345 -350 315 -334 325 -354 315 -334 313 -344 349 -304 341 -342 317 -352 299 -352 317 -350 303 -344 343 -352 315 -334 323 -352 315 -304 343 -344 317 -350 303 -354 317 -352 303 -344 343 -350 315 -334 325 -354 313 -336 311 -346 349 -316 301 -358 1339 -318 655 -354 305 -690 319 -658 343 -658 351 -656 651 -350 301 -670 669 -338 317 -690 319 -674 295 -672 669 -338 353 -654 321 -678 293 -702 637 -340 355 -654 321 -676 325 -676 651 -324 345 -654 321 -664 685 -344 643 -322 661 -344 331 -662 343 -656 317 -690 321 -674 649 -348 317 -662 665 -346 299 -684 345 -654 315 -656 683 -352 315 -658 317 -664 327 -682 647 -348 987 -336 353 -316 303 -344 343 -350 317 -334 325 -352 313 -336 311 -346 349 -316 333 -326 351 -316 303 -344 345 -350 315 -336 325 -354 313 -336 311 -346 315 -352 301 -356 351 -316 303 -344 345 -350 315 -334 325 -352 315 -336 311 -346 349 -316 333 -326 353 -316 303 -344 343 -352 317 -332 325 -352 313 -336 313 -344 317 -350 303 -358 351 -316 303 -344 343 -352 315 -334 325 -352 315 -334 313 -344 349 -318 333 -326 351 -316 303 -344 1337 -348 639 -354 339 -654 321 -660 317 -704 315 -670 669 -332 317 -654 681 -350 315 -658 351 -656 321 -674 649 -348 317 -662 337 -654 323 -682 655 -338 353 -662 297 -680 325 -680 657 -336 317 -690 319 -674 647 RAW_Data: -346 639 -354 639 -330 341 -676 323 -676 315 -672 313 -700 639 -328 347 -668 651 -348 301 -702 315 -670 313 -668 675 -320 331 -686 321 -658 343 -658 677 -320 985 -322 371 -318 313 -336 349 -318 349 -304 341 -344 317 -352 301 -354 317 -350 303 -344 345 -350 315 -334 327 -352 315 -334 313 -344 317 -352 301 -354 351 -316 303 -346 343 -350 315 -336 325 -352 315 -334 313 -346 349 -316 333 -328 351 -314 305 -342 345 -350 315 -334 327 -352 315 -334 313 -344 349 -304 341 -342 317 -350 301 -354 315 -352 303 -344 343 -352 317 -332 323 -352 315 -334 313 -344 349 -318 331 -326 351 -316 303 -344 1333 -350 653 -322 333 -686 321 -658 343 -658 351 -654 651 -350 301 -670 669 -336 319 -688 321 -674 293 -702 639 -338 353 -656 321 -674 295 -704 637 -340 353 -662 295 -684 323 -678 639 -342 353 -662 331 -652 645 -350 667 -324 675 -326 313 -676 323 -678 317 -670 313 -700 639 -330 347 -654 679 -318 349 -656 317 -690 319 -676 647 -348 317 -660 337 -652 323 -684 653 -338 983 -364 317 -350 301 -344 341 -316 351 -302 353 -352 315 -334 313 -344 317 -350 303 -356 351 -316 303 -344 343 -352 315 -334 325 -354 313 -336 313 -344 349 -318 333 -326 351 -316 303 -344 345 -350 301 -344 341 -318 349 -302 353 -350 315 -304 343 -346 315 -352 301 -356 351 -316 303 -344 343 -350 317 -334 325 -352 315 -336 311 -346 349 -302 341 -344 315 -352 299 -356 315 -350 303 -344 343 -350 317 -334 325 -352 315 -336 311 -346 1329 -350 655 -346 319 -660 333 -650 323 -684 343 -658 647 -324 351 -650 677 -352 315 -656 345 -654 321 -664 653 -342 355 -662 333 -650 325 -680 657 -336 317 -692 319 -676 293 -702 639 -338 353 -662 329 -652 645 -352 667 -326 675 -324 315 -678 325 -678 315 -670 313 -702 639 -328 347 -654 679 -352 315 -660 315 -690 323 -676 647 -346 317 -660 337 -678 317 -658 651 -344 1001 -348 309 -346 325 -348 311 -344 341 -310 313 -356 349 -312 313 -370 317 -352 299 -352 315 -350 303 -344 343 -352 315 -334 323 -352 315 -334 313 -344 349 -304 341 -342 315 -352 301 -354 317 -350 303 -344 343 -352 317 -334 323 -352 313 -336 311 -346 313 -352 333 -326 351 -316 303 -346 343 -350 303 -342 343 -318 349 -302 353 -350 315 -336 311 -346 315 -352 301 -356 351 -314 335 -314 347 -350 315 -334 97 -16804 99 -30844 99 -5628 511 -370 283 -718 287 -712 275 -722 275 -716 615 -382 277 -690 645 -358 289 -714 289 -688 341 -656 649 -354 323 RAW_Data: -682 289 -682 317 -672 671 -336 317 -688 321 -674 295 -704 639 -338 353 -660 297 -684 647 -350 667 -326 677 -326 313 -676 323 -680 317 -672 313 -704 641 -322 333 -686 645 -350 313 -690 315 -654 323 -704 649 -344 317 -660 335 -654 323 -682 671 -344 971 -338 317 -350 301 -346 345 -350 301 -344 339 -350 315 -334 323 -352 313 -334 313 -346 349 -302 343 -342 315 -352 301 -354 317 -350 301 -346 343 -350 315 -334 327 -352 315 -334 313 -344 351 -302 343 -340 317 -350 301 -354 317 -350 301 -346 343 -350 315 -334 325 -352 315 -334 313 -346 313 -352 333 -326 351 -316 303 -344 345 -350 303 -344 341 -318 349 -302 353 -352 313 -334 313 -346 313 -352 301 -358 351 -314 301 -346 345 -350 1315 -324 679 -346 299 -678 317 -670 313 -702 311 -672 645 -354 325 -684 643 -352 313 -658 347 -672 321 -674 647 -346 317 -660 337 -652 323 -686 655 -340 317 -698 295 -682 325 -680 657 -334 317 -690 321 -674 647 -348 637 -356 637 -328 345 -674 325 -680 309 -688 317 -666 651 -348 303 -704 639 -340 351 -664 295 -682 323 -680 639 -378 319 -662 331 -650 323 -682 655 -336 975 -364 317 -350 301 -344 343 -352 315 -334 323 -352 313 -334 313 -344 315 -350 303 -356 351 -316 303 -346 343 -350 303 -344 341 -316 351 -302 351 -352 313 -334 315 -344 315 -350 303 -356 351 -314 333 -316 345 -350 301 -344 341 -352 315 -334 321 -352 315 -334 313 -342 315 -350 303 -356 317 -350 301 -346 345 -350 315 -334 325 -350 313 -334 315 -346 315 -350 301 -358 351 -314 333 -316 343 -352 301 -344 339 -350 315 -334 323 -352 1289 -346 655 -348 315 -692 307 -656 323 -682 317 -672 671 -338 317 -658 681 -352 315 -660 317 -690 321 -674 649 -348 319 -660 335 -654 323 -682 653 -338 353 -632 327 -684 323 -682 657 -332 319 -688 319 -676 647 -348 653 -320 663 -342 301 -688 343 -656 317 -690 321 -674 647 -346 317 -660 669 -344 301 -680 317 -670 347 -668 637 -364 317 -654 321 -666 351 -674 637 -340 985 -364 317 -352 315 -334 325 -354 313 -336 313 -344 349 -318 333 -326 351 -316 303 -344 345 -350 315 -334 325 -354 313 -336 311 -346 349 -318 333 -326 351 -316 303 -344 345 -350 317 -334 325 -354 313 -336 311 -346 351 -316 333 -326 351 -316 303 -344 343 -350 317 -334 325 -354 315 -304 343 -344 351 -318 301 -358 317 -350 303 -344 345 -352 315 -302 355 -352 315 -304 343 -346 315 -352 301 -356 351 -316 303 -344 343 -350 317 -334 1319 -336 645 -354 325 RAW_Data: -676 319 -656 319 -672 347 -654 679 -326 315 -680 647 -350 317 -692 307 -690 289 -686 655 -340 353 -656 321 -676 295 -702 637 -340 353 -662 297 -684 323 -678 637 -342 353 -660 331 -652 647 -350 669 -324 675 -326 313 -678 325 -678 315 -670 313 -702 641 -322 333 -688 645 -352 313 -688 317 -656 321 -668 685 -346 319 -660 333 -652 323 -684 655 -336 977 -364 317 -350 303 -342 341 -318 349 -302 351 -352 315 -304 343 -346 351 -316 301 -356 351 -316 303 -344 343 -350 303 -342 341 -318 349 -302 353 -354 313 -306 341 -346 315 -352 301 -356 351 -316 303 -344 345 -350 315 -334 325 -352 315 -336 311 -344 317 -352 301 -356 353 -314 335 -314 345 -350 315 -334 327 -352 315 -334 313 -344 349 -304 341 -342 317 -350 301 -354 315 -352 303 -342 345 -352 315 -334 323 -352 315 -334 313 -344 1313 -350 659 -336 319 -690 321 -674 295 -672 347 -654 679 -324 315 -676 673 -352 313 -658 345 -640 321 -702 649 -346 317 -660 335 -646 321 -686 653 -340 353 -656 321 -676 295 -702 637 -340 353 -662 297 -684 645 -350 665 -324 675 -326 313 -680 323 -676 317 -670 313 -700 639 -328 349 -656 679 -316 351 -656 315 -690 319 -674 647 -346 317 -660 337 -654 323 -686 653 -338 975 -364 317 -350 303 -342 341 -318 349 -302 353 -352 315 -304 343 -342 317 -352 301 -356 349 -316 303 -344 345 -352 315 -334 323 -352 315 -334 313 -344 315 -352 301 -356 317 -350 303 -344 345 -350 315 -334 323 -352 315 -336 313 -344 317 -350 303 -354 317 -352 303 -344 343 -350 315 -334 325 -352 313 -336 311 -346 315 -350 303 -356 353 -314 335 -314 345 -352 315 -302 355 -352 315 -304 343 -344 317 -350 303 -356 317 -352 303 -344 1337 -346 653 -322 327 -688 289 -688 333 -668 315 -692 639 -344 301 -688 655 -340 349 -636 339 -654 323 -682 671 -346 317 -662 333 -654 323 -678 671 -346 317 -660 333 -654 323 -680 639 -376 319 -660 333 -650 679 -318 665 -326 677 -326 315 -680 323 -678 315 -672 343 -672 635 -362 317 -654 679 -352 315 -658 317 -688 321 -676 647 -346 317 -658 337 -654 323 -682 671 -346 969 -338 353 -316 303 -344 345 -350 315 -334 325 -352 315 -334 313 -344 349 -304 341 -342 317 -350 301 -356 315 -350 303 -344 343 -350 317 -334 323 -352 315 -336 311 -344 351 -316 301 -358 351 -316 303 -344 345 -350 315 -334 325 -352 315 -336 313 -344 349 -318 333 -326 351 -316 303 -344 345 -350 315 -334 327 -350 315 -336 311 -346 349 -302 343 -342 317 RAW_Data: -350 301 -354 351 -314 305 -342 345 -352 315 -334 323 -352 315 -336 311 -344 1325 -350 655 -346 317 -660 335 -654 323 -680 315 -672 669 -336 317 -690 649 -350 301 -668 347 -670 311 -670 677 -320 327 -686 289 -688 343 -656 643 -354 327 -686 287 -690 343 -656 649 -324 353 -650 321 -682 671 -346 641 -322 663 -330 343 -676 325 -674 315 -670 313 -670 685 -320 327 -686 643 -352 315 -656 347 -672 319 -676 647 -346 317 -658 337 -654 323 -682 671 -346 971 -338 351 -316 303 -344 345 -352 315 -334 325 -352 315 -334 313 -344 349 -304 341 -342 317 -350 301 -352 317 -352 303 -344 343 -350 315 -334 323 -352 315 -336 311 -346 317 -350 303 -356 351 -316 303 -344 345 -350 301 -342 343 -316 351 -300 353 -352 315 -304 343 -344 315 -352 333 -326 351 -316 303 -344 343 -350 315 -336 325 -352 313 -336 313 -344 349 -304 341 -342 317 -350 301 -354 315 -350 303 -344 343 -350 315 -334 327 -352 1289 -346 655 -348 317 -692 309 -688 289 -686 343 -656 643 -356 323 -686 645 -352 313 -658 347 -638 321 -706 647 -346 319 -660 333 -652 323 -682 671 -344 319 -660 331 -652 323 -678 639 -378 317 -662 331 -652 647 -350 665 -326 677 -326 315 -678 323 -678 315 -672 313 -702 641 -324 331 -688 645 -352 315 -656 347 -670 321 -676 647 -348 317 -660 337 -652 323 -682 671 -346 971 -338 353 -316 303 -344 343 -350 317 -334 325 -352 315 -334 313 -344 349 -316 333 -326 353 -314 335 -314 345 -350 315 -334 327 -352 315 -334 313 -344 349 -318 301 -358 315 -352 303 -344 343 -350 315 -334 325 -354 313 -336 313 -344 349 -304 341 -342 315 -352 299 -354 315 -352 303 -344 343 -350 317 -334 325 -352 315 -304 343 -344 317 -350 303 -356 315 -350 305 -344 345 -350 315 -334 323 -352 315 -336 311 -346 349 -316 333 -326 1335 -352 629 -328 345 -654 323 -666 343 -656 351 -662 661 -346 297 -678 671 -310 353 -662 331 -650 323 -678 639 -342 353 -662 329 -650 325 -678 639 -376 319 -662 329 -650 323 -680 639 -378 319 -660 331 -652 645 -350 667 -326 679 -326 313 -674 325 -678 315 -670 313 -702 653 -320 329 -686 643 -352 315 -660 347 -672 287 -706 647 -346 317 -662 333 -654 323 -684 655 -336 977 -362 317 -350 301 -344 341 -316 351 -300 353 -352 313 -306 341 -344 315 -352 301 -356 317 -350 303 -344 343 -352 315 -334 325 -352 315 -336 313 -344 317 -350 303 -354 317 -350 303 -344 345 -350 315 -334 323 -352 315 -336 311 -344 351 -316 301 -358 315 RAW_Data: -352 303 -346 343 -352 317 -334 323 -352 313 -336 311 -346 317 -350 301 -356 351 -316 303 -344 345 -350 315 -334 325 -352 315 -334 313 -344 317 -352 301 -358 315 -352 303 -344 1339 -346 639 -322 333 -690 319 -660 341 -658 351 -662 627 -346 333 -674 673 -310 353 -662 297 -684 323 -682 657 -336 317 -688 319 -674 295 -672 685 -324 343 -652 321 -664 343 -656 677 -322 325 -686 287 -690 653 -340 675 -320 655 -350 313 -676 325 -680 311 -656 349 -654 679 -316 349 -658 643 -356 321 -652 323 -684 345 -656 643 -356 321 -652 323 -682 317 -672 671 -336 975 -362 317 -350 315 -334 325 -352 315 -336 311 -346 313 -352 301 -356 317 -350 303 -344 345 -350 315 -334 323 -352 315 -334 311 -346 313 -352 301 -356 351 -316 303 -346 345 -352 315 -302 353 -352 315 -336 311 -346 315 -352 301 -356 315 -352 303 -344 343 -352 317 -332 323 -352 315 -306 343 -342 317 -350 301 -356 315 -352 303 -344 343 -350 317 -334 325 -352 313 -304 341 -346 313 -352 301 -356 351 -316 303 -344 343 -352 315 -334 1315 -336 645 -354 325 -684 289 -686 345 -656 315 -690 645 -350 301 -668 671 -336 353 -630 327 -682 323 -676 639 -340 353 -662 331 -650 323 -680 639 -342 353 -664 297 -684 323 -682 657 -332 317 -688 291 -704 649 -346 655 -320 659 -346 301 -688 343 -656 315 -656 323 -704 649 -348 317 -660 667 -344 297 -682 315 -674 349 -656 641 -332 343 -676 325 -674 315 -672 669 -332 973 -362 315 -350 317 -334 325 -352 313 -336 313 -344 349 -304 341 -342 315 -352 299 -354 317 -350 303 -344 343 -352 317 -334 323 -352 315 -304 343 -344 317 -352 301 -356 315 -350 303 -346 343 -350 317 -332 323 -352 315 -336 311 -346 349 -316 333 -326 351 -316 303 -344 345 -350 315 -334 325 -352 315 -334 313 -346 313 -352 301 -358 351 -316 303 -344 345 -350 315 -334 325 -352 315 -336 311 -346 315 -352 301 -356 317 -350 303 -344 1333 -348 639 -354 339 -640 323 -664 343 -660 351 -662 661 -310 333 -676 673 -310 353 -662 331 -650 325 -682 657 -334 317 -666 327 -676 317 -678 671 -346 319 -660 331 -652 325 -678 671 -310 355 -660 331 -652 679 -318 667 -326 673 -326 313 -676 319 -680 317 -672 343 -670 637 -362 317 -658 679 -318 349 -658 317 -658 351 -642 685 -346 319 -660 333 -654 323 -680 655 -338 977 -362 319 -352 315 -334 325 -352 315 -304 341 -346 351 -318 303 -356 351 -316 303 -344 345 -352 317 -302 353 -354 315 -304 341 -346 315 -354 301 -354 351 RAW_Data: -316 303 -344 343 -350 319 -302 355 -352 315 -304 341 -346 351 -318 303 -354 353 -316 303 -342 345 -352 315 -302 355 -354 313 -304 343 -344 351 -318 333 -326 353 -318 303 -342 343 -352 317 -302 355 -352 315 -304 341 -346 351 -318 301 -356 351 -316 303 -344 345 -352 317 -302 1343 -338 645 -354 323 -686 319 -656 343 -656 353 -654 649 -352 317 -658 679 -320 325 -678 319 -660 343 -658 679 -322 323 -654 351 -656 343 -658 647 -324 351 -652 323 -680 317 -670 667 -336 355 -632 327 -682 645 -350 669 -322 677 -296 341 -680 323 -674 315 -670 343 -636 669 -328 351 -668 649 -350 301 -668 345 -668 311 -668 679 -320 327 -656 353 -656 343 -658 679 -290 1015 -322 367 -322 317 -336 311 -350 351 -304 341 -342 319 -354 299 -348 319 -352 303 -342 343 -318 353 -304 349 -318 351 -32700 99 -8980 101 -14522 97 -32700 99 -22564 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/nice_flo.sub ================================================ Filetype: Flipper SubGhz Key File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: Nice FLO Bit: 24 Key: 00 00 00 00 00 02 FE C4 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/nice_flo_raw.sub ================================================ Filetype: Flipper SubGhz RAW File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: RAW RAW_Data: 32700 -4166 259 -25228 693 -724 1407 -1390 679 -714 1395 -1418 679 -1408 709 -1404 709 -678 1413 -680 1401 -718 1403 -688 1401 -720 1389 -1412 691 -710 1401 -1400 673 -730 1373 -724 1397 -1394 711 -1378 711 -1408 707 -678 1395 -710 1391 -1406 703 -710 1395 -712 1401 -25172 443 -12300 491 -932 1179 -834 1279 -800 1343 -766 1343 -762 1339 -1426 675 -750 1369 -1418 679 -716 1381 -714 1399 -1412 681 -1404 713 -1404 709 -676 1393 -712 1397 -1416 681 -714 1415 -680 1395 -25196 691 -746 1357 -1440 671 -714 1391 -1406 701 -1408 697 -1408 697 -678 1415 -686 1407 -698 1427 -676 1413 -678 1409 -1410 701 -700 1403 -1392 711 -686 1427 -696 1403 -1390 687 -1408 709 -1406 707 -676 1415 -680 1405 -1414 681 -704 1403 -718 1409 -25142 727 -706 1403 -1398 709 -690 1413 -1414 677 -1406 711 -1406 673 -706 1395 -714 1395 -720 1397 -696 1405 -696 1403 -1394 709 -684 1413 -1382 711 -714 1387 -714 1383 -1406 707 -1406 675 -1406 703 -710 1397 -712 1397 -1404 675 -710 1395 -712 1395 -25186 655 -846 1233 -1548 593 -788 1299 -1520 587 -1490 615 -1474 645 -744 1357 -746 1381 -714 1373 -736 1367 -706 1399 -1432 673 -728 1377 -1418 679 -714 1415 -682 1413 -1376 713 -1408 709 -1372 705 -710 1397 -712 1381 -1410 721 -680 1409 -690 1405 -25168 701 -760 1341 -1456 639 -756 1345 -1452 677 -1410 673 -1442 671 -712 1399 -712 1371 -718 1411 -688 1409 -690 1407 -1416 679 -712 1395 -1414 685 -716 1383 -714 1383 -1410 711 -1400 709 -1370 705 -710 1397 -710 1397 -1410 679 -712 1395 -686 1427 -25156 563 -7950 557 -1546 555 -1508 621 -790 1329 -758 1331 -778 1355 -714 1377 -714 1407 -1404 669 -730 1407 -1390 709 -686 1411 -684 1397 -1416 685 -1406 711 -1404 707 -676 1427 -682 1395 -1420 679 -712 1395 -688 1429 -25160 745 -712 1359 -1438 671 -712 1399 -1408 697 -1406 695 -1404 697 -682 1403 -714 1413 -686 1393 -710 1411 -686 1407 -1402 701 -676 1431 -1368 735 -674 1399 -704 1397 -1400 711 -1414 683 -1408 709 -678 1421 -678 1427 -1374 711 -710 1395 -686 1431 -25158 713 -708 1391 -1406 703 -712 1397 -1408 707 -1372 707 -1406 699 -712 1379 -716 1405 -688 1403 -720 1387 -684 1409 -1402 705 -712 1399 -1408 673 -722 1403 -694 1397 -1390 709 -1414 681 -1404 709 -680 1421 -680 1415 -1406 697 -714 1369 -718 1413 -25180 709 -688 1403 -1424 673 -696 1429 -1398 679 -1404 717 -1376 719 -700 1411 -696 1377 -724 1397 -700 1405 -698 1407 -1390 685 -716 1383 -1412 709 -714 1385 -712 1387 -1406 709 -1402 673 -1406 703 -710 1403 -680 1403 -1412 685 -718 1407 -692 1399 -25178 727 -686 1401 -1400 709 -686 1429 -1388 709 -1408 679 -1406 711 -678 1421 -680 1423 -680 1423 -676 1423 -678 1395 -1406 RAW_Data: 711 -716 1387 -1408 675 -710 1397 -710 1395 -1404 703 -1404 699 -1408 697 -712 1371 -716 1405 -1386 715 -684 1399 -718 1381 -25206 689 -716 1411 -1414 681 -716 1389 -1406 709 -1372 703 -1408 699 -712 1383 -718 1407 -686 1391 -688 1409 -716 1401 -1406 689 -688 1411 -1384 715 -716 1381 -712 1395 -1414 685 -1408 711 -1372 707 -708 1395 -710 1397 -1402 699 -710 1395 -708 1393 -25166 715 -712 1399 -1420 681 -714 1381 -1404 711 -1404 707 -1404 675 -712 1397 -710 1395 -710 1395 -684 1397 -724 1401 -1392 709 -686 1407 -1414 683 -710 1397 -690 1413 -1382 711 -1410 709 -1372 703 -712 1413 -680 1403 -1412 687 -718 1375 -728 1399 -32700 97 -132 327 -924 291 -98 625 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/nice_flor_s_raw.sub ================================================ Filetype: Flipper SubGhz RAW File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: RAW RAW_Data: 1938 -32700 1599 -1476 515 -1044 507 -1050 487 -1052 1007 -572 1009 -556 999 -548 1025 -546 1019 -510 517 -1044 513 -1042 1007 -514 507 -1074 1013 -546 515 -1046 515 -1044 513 -1040 513 -1040 1005 -514 1035 -516 509 -1072 513 -1040 513 -1042 1007 -576 1009 -512 1011 -546 1009 -548 1005 -516 1005 -586 1009 -546 1009 -544 515 -1042 513 -1042 511 -1044 513 -1010 511 -1042 515 -1076 475 -1074 511 -1040 1009 -548 1007 -546 513 -1040 511 -1038 475 -1040 507 -1074 513 -1042 1011 -578 981 -546 1009 -544 515 -1042 1007 -546 475 -1038 509 -1040 1497 -19024 1543 -1508 503 -1034 509 -1038 509 -1038 1003 -584 1005 -574 979 -576 483 -1074 483 -1042 513 -1044 513 -1038 1005 -514 509 -1072 1009 -548 513 -1042 515 -1042 513 -1042 513 -1044 1007 -514 1037 -516 511 -1068 513 -1040 513 -1042 1009 -546 1009 -546 1007 -546 1007 -548 1005 -514 1005 -584 1007 -548 1009 -546 515 -1042 513 -1044 513 -1040 511 -1038 477 -1038 507 -1076 513 -1044 515 -1040 1009 -546 1009 -546 515 -1042 513 -1010 511 -1042 513 -1078 479 -1072 1007 -546 1007 -548 1007 -546 513 -1040 1005 -514 509 -1038 509 -1008 1529 -19028 1545 -1508 513 -1046 483 -1052 489 -1050 1009 -568 1007 -558 995 -548 527 -1052 1015 -512 515 -1044 513 -1040 1003 -506 541 -1074 983 -578 483 -1044 515 -1042 513 -1042 515 -1040 1007 -546 1005 -516 507 -1072 513 -1040 517 -1042 1009 -544 1009 -544 1011 -544 1007 -540 1009 -546 1005 -548 1011 -578 981 -576 485 -1044 515 -1042 513 -1044 513 -1010 509 -1040 507 -1074 511 -1042 513 -1042 1013 -546 1007 -542 513 -1042 515 -1038 511 -1006 507 -1076 515 -1042 1011 -578 977 -574 1013 -544 481 -1044 1007 -546 511 -1008 511 -1042 1505 -19032 1541 -1488 507 -1074 479 -1044 513 -1046 975 -590 1011 -574 483 -1052 1007 -556 499 -1050 489 -1042 517 -1044 1005 -516 509 -1074 1011 -546 517 -1042 515 -1044 513 -1042 513 -1042 1009 -516 1009 -550 477 -1108 477 -1074 513 -1040 1009 -548 1009 -546 1009 -550 975 -548 1003 -554 999 -574 1009 -548 1009 -548 513 -1040 513 -1044 513 -1042 479 -1040 509 -1040 509 -1078 479 -1078 513 -1042 1011 -550 1007 -548 477 -1072 477 -1040 509 -1040 509 -1076 511 -1038 1011 -548 1009 -548 1009 -546 513 -1040 1009 -518 513 -1040 509 -1010 1527 -19010 1541 -1512 511 -1042 511 -1046 483 -1046 1001 -570 1013 -570 493 -1066 1001 -550 979 -564 503 -1052 485 -1048 1009 -516 509 -1076 1011 -546 517 -1044 517 -1044 515 -1044 479 -1076 971 -574 971 -550 509 -1076 481 -1076 513 -1040 1007 -544 1011 -546 1007 -548 1007 -514 1005 -550 1009 -556 1003 -584 1007 -550 479 -1076 479 -1076 479 -1042 513 -1044 483 -1044 507 -1082 507 -1068 477 -1074 RAW_Data: 1011 -550 973 -550 509 -1044 513 -1044 483 -1048 491 -1082 519 -1048 1005 -556 993 -548 1021 -546 487 -1046 1011 -548 479 -1044 513 -1012 1513 -19026 1535 -1534 507 -1046 483 -1056 491 -1034 1007 -572 1009 -558 501 -1052 525 -1044 487 -1042 515 -1040 513 -1040 1007 -514 507 -1072 1009 -546 515 -1074 483 -1042 515 -1044 515 -1044 1011 -516 1009 -522 519 -1082 507 -1042 509 -1042 1007 -550 1011 -552 1009 -522 1037 -522 1017 -512 1003 -584 999 -582 993 -546 523 -1046 483 -1042 515 -1042 513 -1040 511 -1006 511 -1074 513 -1042 513 -1042 1013 -546 1009 -540 515 -1042 513 -1040 511 -1004 509 -1074 515 -1044 1011 -544 1009 -578 977 -544 515 -1042 1007 -546 511 -1004 509 -1038 1529 -18994 1549 -1510 513 -1044 515 -1010 505 -1044 1001 -590 1017 -556 487 -1048 505 -1054 1019 -544 485 -1046 515 -1042 1007 -516 513 -1074 1007 -548 513 -1040 515 -1042 513 -1044 513 -1042 287 -32700 1577 -1544 481 -1034 507 -1046 509 -1048 1001 -588 989 -552 1013 -566 971 -584 989 -546 487 -1044 515 -1046 479 -1040 509 -1074 513 -1044 515 -1044 517 -1042 513 -1044 513 -1040 1011 -516 509 -1048 483 -1080 1007 -556 513 -1042 1003 -552 1001 -554 1011 -524 1015 -554 985 -538 503 -1086 499 -1050 1017 -546 521 -1048 483 -1044 515 -1040 513 -1040 1005 -518 513 -1076 1007 -548 511 -1042 1005 -542 1009 -548 515 -1040 513 -1038 1005 -516 509 -1072 1009 -546 1009 -578 977 -580 977 -544 515 -1042 1005 -542 1011 -514 509 -1012 1541 -18996 1571 -1504 515 -1014 519 -1020 537 -1018 1011 -568 1011 -556 997 -546 525 -1050 519 -1008 513 -1040 513 -1038 511 -1004 539 -1040 515 -1076 517 -1008 549 -1010 515 -1040 513 -1040 1011 -514 543 -1002 539 -1040 1011 -546 547 -1008 1043 -512 1045 -510 1043 -508 1041 -510 1005 -546 507 -1072 519 -1042 1013 -542 519 -1010 517 -1040 513 -1040 511 -1040 1003 -514 539 -1038 1043 -542 519 -1044 1011 -544 1011 -510 547 -1008 513 -1040 1009 -514 509 -1072 1041 -544 1011 -542 1013 -544 1017 -510 515 -1040 1009 -544 1007 -512 541 -1004 1527 -19000 513 -4202 99 -1444 853 -672 901 -676 867 -666 407 -1158 923 -618 423 -1114 451 -1082 451 -1082 455 -1110 493 -1080 483 -1076 471 -1056 491 -1082 483 -1042 1007 -546 511 -1006 509 -1072 1009 -576 483 -1076 979 -578 977 -544 1007 -542 1007 -546 1007 -546 477 -1072 517 -1076 977 -578 483 -1042 517 -1042 513 -1044 513 -1042 975 -550 481 -1078 1039 -550 477 -1072 1005 -540 1007 -546 513 -1044 513 -1006 1005 -550 507 -1080 1007 -548 1007 -546 1007 -548 1007 -546 511 -1038 1007 -546 1005 -514 509 -1006 1531 -18994 1447 -1714 323 -1204 399 -1134 407 -1132 925 -652 925 -618 425 -1150 917 -618 RAW_Data: 451 -1112 449 -1074 483 -1046 483 -1070 477 -1082 509 -1042 509 -1074 479 -1074 477 -1078 477 -1042 1007 -554 483 -1046 507 -1086 983 -548 517 -1064 995 -548 1019 -546 981 -544 1009 -544 1009 -514 511 -1074 513 -1076 979 -578 483 -1042 515 -1042 513 -1042 511 -1040 1005 -516 509 -1076 1009 -548 513 -1040 1007 -574 979 -546 513 -1042 515 -1038 1009 -514 507 -1074 1009 -548 1007 -546 1011 -548 1011 -546 513 -1046 1009 -516 1007 -520 507 -1042 1529 -18994 1457 -1686 321 -1212 385 -1150 389 -1142 937 -638 937 -630 437 -1088 961 -616 951 -584 451 -1112 451 -1078 449 -1078 477 -1120 449 -1110 447 -1080 481 -1072 515 -1046 483 -1046 999 -556 519 -1016 503 -1084 995 -550 527 -1048 981 -580 983 -546 1007 -546 1009 -548 1007 -516 515 -1076 477 -1072 1007 -548 513 -1042 513 -1038 515 -1040 513 -1040 975 -552 481 -32700 1607 -1490 513 -1044 513 -1046 483 -1050 1015 -554 1027 -550 1011 -532 1001 -584 989 -548 487 -1044 515 -1042 1007 -540 1005 -550 513 -1076 975 -580 483 -1044 515 -1044 1013 -548 1009 -518 513 -1048 979 -590 985 -586 475 -1076 1009 -550 991 -548 1015 -546 485 -1042 1013 -516 1009 -586 1007 -548 513 -1042 1011 -548 513 -1042 479 -1072 479 -1038 509 -1040 1005 -586 479 -1072 1009 -546 515 -1040 1009 -548 513 -1040 479 -1072 475 -1036 1009 -586 479 -1078 513 -1042 513 -1044 1011 -550 479 -1076 973 -550 511 -1042 1005 -494 1513 -19020 1555 -1504 509 -1048 507 -1052 473 -1058 1001 -578 1001 -546 1003 -574 511 -1024 527 -1048 487 -1044 513 -1044 1009 -518 1009 -590 479 -1076 1007 -550 477 -1070 513 -1040 1007 -548 1005 -514 511 -1040 1005 -588 975 -586 479 -1072 1007 -548 1007 -548 973 -550 511 -1042 1011 -526 1017 -572 1001 -538 517 -1050 1007 -558 501 -1052 487 -1048 513 -1044 479 -1044 1007 -590 475 -1074 1007 -548 513 -1040 1009 -546 513 -1040 481 -1038 511 -1042 1009 -560 511 -1074 477 -1074 477 -1074 1007 -550 477 -1070 973 -542 509 -1040 1005 -526 1511 -19024 1533 -1542 453 -1086 473 -1050 511 -1042 995 -582 993 -582 991 -548 491 -1080 983 -546 515 -1040 513 -1042 975 -554 1011 -586 487 -1048 1015 -544 513 -1030 525 -1046 981 -546 1009 -546 511 -1042 971 -584 1007 -574 485 -1076 977 -578 979 -546 1009 -548 511 -1042 1007 -516 1005 -588 1009 -550 479 -1074 1011 -548 481 -1072 479 -1072 475 -1040 509 -1044 1011 -558 509 -1074 971 -584 477 -1070 1007 -550 477 -1076 477 -1044 515 -1046 979 -590 491 -1050 519 -1044 501 -1054 1021 -548 483 -1044 1011 -548 475 -1040 1003 -520 1543 -18994 1573 -1468 515 -1052 521 -1018 523 -1008 1025 -580 997 -546 527 -1046 1015 -542 519 -1010 513 -1042 513 -1040 RAW_Data: 1007 -514 1039 -550 511 -1040 1009 -544 513 -1046 515 -1040 1009 -546 1005 -540 511 -1006 1041 -550 1013 -546 513 -1040 1011 -546 1009 -544 1007 -544 513 -1038 1009 -512 1037 -548 1009 -546 515 -1040 1041 -512 513 -1046 515 -1040 511 -1038 511 -1006 1037 -550 511 -1040 1041 -542 485 -1042 1039 -508 515 -1042 515 -1038 511 -1004 1037 -550 515 -1040 517 -1040 517 -1040 1011 -544 515 -1040 1007 -546 509 -1008 1009 -518 1543 -18992 1535 -1542 483 -1052 487 -1050 521 -1046 991 -578 995 -546 527 -1046 1015 -546 1015 -544 483 -1042 513 -1040 1009 -514 1007 -586 511 -1040 1007 -548 513 -1042 513 -1044 1011 -546 1009 -514 511 -1038 1009 -558 1007 -552 513 -1072 1005 -548 1005 -548 1005 -514 507 -1038 1035 -506 1003 -584 1005 -574 481 -1076 1009 -544 485 -1042 513 -1040 513 -1040 511 -1004 1039 -550 513 -1040 1011 -544 515 -1042 1009 -544 515 -1042 513 -1042 479 -1042 1011 -558 511 -1076 477 -1074 513 -1038 1007 -546 511 -1040 1005 -514 507 -1040 1001 -506 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/nice_one_raw.sub ================================================ Filetype: Flipper SubGhz RAW File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: RAW RAW_Data: 7855 -12784 1413 -1544 469 -1040 465 -1010 479 -1020 967 -548 445 -1046 973 -524 967 -520 981 -516 483 -1042 449 -1034 949 -528 495 -1008 479 -1016 985 -518 453 -1042 449 -1052 949 -514 483 -1012 985 -512 477 -1042 445 -1050 951 -548 971 -512 975 -520 967 -554 949 -548 451 -1040 967 -520 987 -518 455 -1038 475 -1016 977 -518 983 -514 473 -1018 975 -518 487 -1002 475 -1020 965 -516 477 -1012 1007 -522 445 -1034 491 -1008 973 -524 RAW_Data: 481 -992 481 -1010 483 -1030 977 -520 487 -1008 973 -522 987 -518 983 -514 965 -522 987 -520 489 -1004 473 -1018 471 -1016 1005 -476 511 -1012 457 -1018 1001 -510 975 -520 471 -1022 483 -1016 969 -536 1003 -454 981 -480 479 -986 981 -486 479 -946 989 -492 973 -484 473 -976 1503 -23606 1433 -1542 493 -1006 473 -1032 441 -1048 971 -514 483 -1012 985 -518 479 -1014 481 -1012 457 -1050 443 -1044 977 -520 473 -1004 495 -1004 969 -556 453 -1036 451 -1038 973 -520 485 -994 981 -520 457 -1050 477 -1014 977 -494 985 -538 961 -512 1005 -518 951 -526 491 -1006 969 -520 985 -524 455 -1044 447 -1048 983 -518 983 -514 441 -1050 981 -518 453 -1042 447 -1050 981 -518 451 -1046 975 -520 451 -1022 483 -1008 1001 -522 447 -1020 485 -1008 473 -1016 981 -550 449 -1044 977 -520 949 -550 979 -516 967 -520 983 -522 455 -1042 447 -1050 451 -1024 981 -520 483 -1018 963 -546 479 -1010 967 -520 483 -1022 975 -522 967 -552 487 -960 481 -990 451 -994 481 -980 479 -986 449 -984 969 -480 983 -510 1465 -23612 1473 -1520 479 -1026 453 -1044 451 -1036 943 -552 453 -1044 949 -518 481 -1018 977 -524 459 -1046 439 -1046 973 -528 463 -1012 471 -1046 943 -552 443 -1034 457 -1042 977 -518 479 -1028 949 -554 451 -1014 481 -1018 981 -524 985 -518 971 -514 979 -522 987 -512 477 -1016 977 -522 969 -552 449 -1016 483 -1014 985 -518 973 -516 481 -1012 967 -552 449 -1020 483 -1010 969 -554 447 -1022 977 -520 475 -1018 479 -1018 975 -522 457 -1036 479 -1016 479 -1002 969 -552 447 -1054 943 -548 969 -520 983 -520 983 -516 969 -518 479 -1030 453 -1044 449 -1048 943 -548 451 -1044 945 -552 975 -518 947 -552 449 -1034 975 -524 455 -1040 969 -520 449 -982 969 -518 945 -484 481 -984 481 -994 447 -986 477 -998 1435 -23658 1441 -1530 483 -1008 483 -1034 449 -1022 977 -520 485 -1018 479 -1018 975 -506 473 -1036 469 -1042 463 -1010 977 -520 487 -1030 451 -1010 981 -520 481 -1018 481 -1014 983 -518 479 -1016 975 -492 497 -1014 467 -1014 977 -520 975 -526 985 -516 979 -506 1005 -496 493 -1008 975 -522 983 -518 453 -1040 475 -1016 975 -524 987 -514 471 -1038 955 -514 473 -1046 445 -1044 967 -514 477 -1016 975 -520 457 -1050 477 -1010 973 -522 473 -1000 479 -1030 453 -1038 969 -506 473 -1050 971 -512 979 -524 955 -548 973 -512 975 -518 475 -1036 473 -1006 493 -1008 975 -520 973 -526 487 -1004 475 -1018 965 -516 1005 -512 481 -1014 985 -518 483 -986 975 -488 977 -480 977 -486 975 -482 481 -982 975 -480 977 -488 1477 -23618 1389 -1634 369 -1114 383 -1078 431 -1072 RAW_Data: 931 -550 451 -1046 447 -1042 967 -552 945 -522 459 -1042 445 -1050 943 -552 439 -1036 459 -1046 977 -508 477 -1030 455 -1044 945 -552 451 -1020 979 -524 459 -1046 443 -1048 979 -518 967 -534 957 -516 977 -518 973 -528 455 -1042 973 -520 975 -526 459 -1040 481 -1020 969 -510 967 -546 447 -1050 955 -544 441 -1044 449 -1048 953 -550 443 -1046 975 -518 485 -1010 455 -1044 943 -554 447 -1054 449 -1010 475 -1048 943 -550 453 -1040 969 -520 973 -522 985 -514 969 -554 949 -524 459 -1040 477 -1014 483 -1034 947 -520 981 -554 447 -1016 977 -524 983 -516 973 -516 483 -1016 455 -1046 973 -484 977 -518 449 -986 447 -1016 971 -482 449 -1018 443 -1014 449 -984 1461 -129764 65 -3200 133 -464 133 -298 429 -132 265 -98 231 -134 265 -164 3439 -132 727 -132 199 -2058 133 -1644 361 -166 65 -492 165 -264 591 -428 197 -198 201 -98 831 -68 2313 -100 5839 -10922 65 -1320 425 -262 297 -428 97 -362 2463 -98 1025 -66 5263 -5030 99 -6924 461 -1092 133 -98 333 -166 2739 -132 3131 -66 10535 -2008 131 -434 297 -1058 65 -132 99 -198 529 -198 97 -526 97 -66 493 -664 99 -232 2613 -132 5371 -11166 229 -198 163 -394 199 -398 365 -132 99 -166 2121 -100 1195 -68 1821 -100 10635 -468 67 -1256 65 -2144 229 -100 163 -394 593 -98 67 -166 1677 -66 791 -66 335 -98 11033 -566 65 -1460 165 -1520 497 -1254 491 -564 99 -330 99 -232 1227 -132 2973 -66 3661 -11964 131 -132 99 -398 131 -328 97 -232 363 -396 1379 -98 99 -166 1591 -66 12171 -4136 65 -298 265 -298 199 -462 99 -330 65 -166 163 -66 1591 -66 165 -166 12079 -1002 65 -366 465 -530 97 -134 561 -66 497 -494 99 -64 131 -134 1095 -66 6537 -5066 65 -5458 397 -724 165 -466 131 -166 14293 -436 65 -1590 65 -1462 459 -332 65 -396 563 -794 197 -300 1255 -12100 99 -130 495 -166 97 -296 97 -658 757 -98 959 -66 1029 -1346 165 -2620 395 -494 197 -166 163 -198 65 -98 195 -394 821 -98 3063 -100 4469 -12120 497 -166 65 -462 195 -164 295 -66 4361 -100 1755 -100 131 -66 9415 -3840 99 -530 197 -364 463 -330 365 -332 133 -100 165 -166 2113 -100 1461 -132 4175 -3772 97 -7124 231 -1258 165 -100 429 -1326 995 -200 1755 -66 1519 -100 6437 -7198 133 -300 527 -398 165 -232 131 -166 67 -164 16443 -3270 131 -658 131 -726 97 -858 97 -300 331 -100 629 -10288 67 -164 133 -1458 297 -364 65 -98 163 -758 1189 -66 199 -68 1791 -66 897 -132 165 -3410 163 -364 99 -98 99 -66 365 -232 789 -494 65 -328 629 -66 1259 -66 365 -11422 7923 -12864 1405 -1562 RAW_Data: 451 -1040 441 -1052 449 -1050 945 -554 449 -1052 451 -1020 481 -1010 473 -1050 449 -1052 451 -1040 969 -520 977 -520 455 -1042 977 -522 447 -1056 947 -518 979 -546 447 -1052 451 -1040 441 -1048 983 -518 455 -1044 449 -1018 979 -548 947 -554 449 -1032 481 -992 483 -1012 985 -514 999 -512 479 -1012 485 -1014 961 -544 477 -1010 965 -522 981 -512 483 -1012 487 -1020 477 -1014 479 -1016 459 -1014 471 -1012 1003 -492 997 -522 483 -1016 979 -522 985 -520 975 -512 975 -520 999 -488 985 -514 481 -1006 1001 -522 483 -990 483 -1008 483 -1020 977 -516 975 -518 999 -524 451 -1018 1009 -482 999 -506 983 -524 487 -1004 473 -980 501 -952 517 -940 497 -982 489 -974 987 -452 495 -974 487 -954 1485 -23662 1457 -1556 445 -1026 483 -1010 475 -1016 975 -518 483 -1014 487 -1034 447 -1022 977 -522 457 -1046 475 -1018 975 -524 985 -518 477 -1016 977 -524 459 -1048 969 -514 977 -522 457 -1038 479 -1018 481 -1002 1001 -520 447 -1054 449 -1008 1001 -520 977 -520 451 -1040 475 -1014 479 -1028 949 -518 983 -542 447 -1058 449 -1044 947 -552 447 -1024 977 -520 967 -542 479 -1024 451 -1040 441 -1050 451 -1028 481 -1014 483 -1010 965 -548 973 -518 485 -1010 981 -516 967 -520 983 -524 981 -514 969 -538 967 -518 481 -1016 973 -524 485 -1016 465 -1012 479 -1020 983 -532 959 -514 975 -554 949 -526 985 -512 969 -554 967 -534 461 -1042 443 -1014 967 -478 455 -1006 969 -486 967 -480 983 -486 969 -514 451 -982 1461 -23692 563 -4014 291 -1220 263 -1228 829 -620 883 -626 851 -608 903 -622 387 -1082 391 -1102 409 -1084 913 -588 941 -548 443 -1056 945 -522 445 -1046 971 -552 977 -516 441 -1048 481 -992 483 -1010 979 -554 451 -1018 481 -1014 983 -518 977 -514 479 -1040 447 -1034 485 -996 975 -520 979 -520 483 -1016 481 -1008 999 -506 471 -1050 971 -514 975 -520 473 -1000 483 -1020 481 -1008 473 -1018 481 -1020 481 -1008 967 -554 945 -518 481 -1038 967 -520 985 -520 981 -514 967 -520 985 -520 981 -508 479 -1016 1003 -518 479 -1010 479 -1010 473 -1018 975 -516 979 -520 983 -520 975 -514 977 -518 999 -520 979 -518 451 -1040 479 -986 479 -962 1007 -486 451 -986 975 -486 977 -482 483 -980 477 -982 1473 -23656 1453 -1548 447 -1016 485 -1012 491 -1012 973 -520 981 -526 983 -514 971 -554 947 -526 491 -1008 475 -1020 983 -498 989 -516 483 -1014 977 -524 453 -1044 979 -518 979 -520 453 -1042 449 -1048 447 -1022 975 -518 475 -1050 447 -1020 977 -522 983 -518 481 -1016 481 -1012 473 -1002 973 -550 945 -552 449 -1050 447 -1020 975 -522 487 -1034 973 -520 RAW_Data: 979 -514 443 -1046 479 -1028 451 -1042 451 -1048 447 -1022 485 -1014 983 -520 973 -516 483 -1012 983 -518 973 -516 977 -520 1003 -520 975 -520 981 -514 475 -1034 969 -516 479 -1016 447 -1046 475 -1018 975 -516 975 -522 983 -510 469 -1010 1007 -518 951 -530 989 -516 973 -556 951 -494 481 -978 487 -978 975 -460 1005 -466 979 -486 969 -508 981 -450 1489 -23666 571 -4036 269 -1224 257 -1250 787 -642 867 -622 883 -622 359 -1136 373 -1086 421 -1080 417 -1074 935 -550 947 -552 445 -1048 939 -552 451 -1046 947 -552 947 -550 451 -1040 443 -1048 453 -1024 977 -522 471 -1034 449 -1020 973 -540 975 -508 479 -1032 453 -1042 449 -1050 977 -518 979 -518 449 -1018 481 -1018 975 -518 473 -1034 963 -542 961 -544 447 -1044 473 -1020 479 -1014 481 -1010 473 -1032 471 -1010 959 -546 973 -492 499 -1006 997 -510 977 -524 953 -552 971 -512 973 -508 979 -554 451 -1016 977 -518 471 -1038 485 -1010 457 -1036 969 -506 999 -520 481 -1014 975 -522 967 -520 975 -548 451 -1038 475 -1022 965 -518 463 -978 985 -486 465 -978 457 -1016 463 -978 985 -486 963 -480 1477 -129906 495 -726 197 -328 295 -132 2547 -66 233 -98 11033 -1856 233 -1458 65 -198 165 -134 199 -168 101 -694 463 -530 165 -300 99 -232 2479 -98 1745 -98 3029 -132 163 -1460 65 -500 65 -400 99 -664 895 -398 65 -564 331 -166 97 -66 197 -98 3813 -98 10097 -3848 165 -232 67 -266 397 -596 165 -66 199 -166 99 -66 199 -398 165 -166 1721 -232 429 -166 133 -330 133 -698 493 -200 197 -428 11029 -12118 65 -198 199 -68 231 -230 101 -166 99 -664 131 -132 3163 -4238 331 -298 531 -398 299 -98 199 -166 563 -100 131 -98 893 -66 3141 -1556 133 -1722 131 -830 197 -262 195 -66 163 -462 195 -396 195 -134 499 -132 265 -66 1717 -166 3175 -11366 199 -164 131 -66 163 -98 525 -98 363 -264 4495 -100 229 -66 131 -66 593 -3002 97 -394 131 -426 99 -462 597 -692 295 -298 431 -230 4231 -66 9711 -3246 131 -100 99 -400 263 -498 65 -100 297 -98 99 -132 65 -862 131 -66 365 -396 99 -166 1991 -98 1611 -132 10333 -790 65 -1984 99 -896 165 -332 365 -232 131 -830 65 -66 397 -166 197 -66 65 -496 199 -100 9975 -1728 67 -5008 727 -98 131 -100 2873 -66 12011 -3150 67 -960 99 -234 99 -298 231 -232 195 -266 165 -296 261 -166 757 -66 629 -196 657 -100 197 -134 297 -364 11237 -1684 65 -2076 165 -462 491 -100 663 -630 329 -264 263 -100 1357 -66 461 -1676 99 -1782 295 -296 65 -296 163 -230 99 -132 295 -66 163 -362 197 -724 757 -66 RAW_Data: 3785 -66 13551 -1808 97 -730 65 -100 231 -132 131 -1230 593 -232 1579 -66 2667 -200 101 -3480 165 -692 133 -396 427 -1524 363 -66 431 -132 10305 -8288 461 -628 67 -430 725 -66 1053 -66 4501 -230 165 -66 331 -66 355 -266 263 -132 63 -562 459 -462 197 -66 129 -132 65 -100 2643 -132 2107 -66 9651 -3692 99 -100 195 -294 97 -660 759 -328 165 -560 891 -66 1953 -66 11305 -362 263 -662 131 -432 65 -134 563 -430 131 -132 1819 -100 165 -166 1061 -98 10089 -2476 65 -854 395 -198 99 -492 131 -164 229 -466 199 -428 299 -100 927 -200 1557 -134 4269 -10464 133 -1624 65 -198 265 -398 131 -430 729 -134 6189 -66 5421 -2082 165 -3342 19967 -12808 1439 -1536 453 -1046 449 -1032 449 -1056 947 -552 977 -522 977 -518 453 -1038 977 -522 977 -520 457 -1038 977 -506 1005 -496 495 -1008 975 -538 973 -530 465 -1008 975 -554 453 -1036 947 -518 487 -1008 475 -1042 443 -1050 461 -1008 1005 -510 447 -1048 985 -510 469 -1006 1005 -494 997 -514 975 -514 975 -504 999 -506 479 -1034 491 -1010 975 -508 973 -524 491 -1004 473 -1018 997 -520 975 -512 975 -518 473 -1030 983 -516 981 -514 471 -998 997 -522 481 -1012 481 -1012 457 -1050 973 -512 977 -524 459 -1016 1003 -512 479 -1014 459 -1016 475 -1012 1007 -522 969 -502 495 -1008 477 -1030 965 -522 975 -514 479 -1000 471 -1062 471 -964 483 -982 471 -1000 471 -980 979 -448 503 -988 465 -976 487 -974 1459 -23696 1407 -1616 401 -1068 429 -1080 419 -1058 935 -566 923 -584 417 -1078 939 -524 457 -1042 973 -550 443 -1028 949 -554 945 -552 447 -1022 979 -518 971 -542 479 -1024 947 -550 441 -1048 979 -518 453 -1044 449 -1050 449 -1020 485 -1014 981 -518 479 -1014 975 -524 459 -1036 973 -516 979 -518 971 -552 945 -550 945 -552 449 -1030 479 -1026 947 -554 949 -552 449 -1018 479 -1008 981 -518 975 -548 945 -554 451 -1034 967 -514 997 -514 445 -1036 967 -554 447 -1022 485 -1010 475 -1016 975 -518 977 -520 487 -1014 973 -552 451 -1040 441 -1050 447 -1022 485 -1014 987 -516 479 -1014 483 -1014 459 -1046 969 -514 449 -1044 967 -546 973 -488 447 -1016 443 -1000 973 -490 475 -980 983 -482 441 -1016 465 -976 1475 -23652 1451 -1548 479 -1014 461 -1014 471 -1044 975 -520 971 -502 495 -1012 977 -506 1005 -498 989 -516 481 -1016 975 -520 981 -514 475 -1014 979 -522 983 -512 475 -1022 965 -514 471 -1046 973 -494 473 -1016 475 -1046 447 -1050 463 -1012 999 -512 481 -1012 983 -520 477 -1014 977 -524 955 -548 973 -512 975 -520 967 -556 449 -1020 483 -1012 983 -520 973 -516 481 -1008 473 -1034 RAW_Data: 967 -538 963 -544 973 -522 471 -1006 989 -512 1007 -520 443 -1036 985 -516 449 -1048 451 -1022 483 -1012 983 -520 977 -514 481 -1012 979 -514 483 -1022 481 -1010 471 -1020 479 -1020 979 -524 457 -1048 973 -514 483 -1012 981 -520 483 -1018 481 -1014 485 -986 467 -980 981 -486 469 -978 457 -1004 963 -480 983 -486 971 -514 1441 -23704 1383 -1628 389 -1112 385 -1092 407 -1092 915 -552 941 -570 441 -1064 423 -1046 451 -1044 939 -556 455 -1048 945 -552 973 -522 453 -1046 945 -552 947 -550 451 -1040 969 -518 479 -1028 951 -552 451 -1018 479 -1018 483 -1014 459 -1044 971 -514 483 -1010 971 -544 447 -1020 977 -524 987 -518 973 -516 979 -524 985 -518 479 -1016 447 -1050 953 -548 971 -514 483 -1014 459 -1048 967 -514 977 -526 953 -548 443 -1046 975 -492 995 -512 471 -1050 943 -552 445 -1032 455 -1044 449 -1048 941 -550 945 -552 449 -1050 945 -552 451 -1044 449 -1018 479 -1016 479 -1002 969 -542 973 -522 455 -1040 477 -1022 967 -534 959 -514 975 -554 469 -1008 449 -980 469 -1008 943 -484 1001 -484 467 -980 983 -482 961 -514 1439 -23700 1469 -1510 495 -1008 473 -1036 463 -1012 969 -546 973 -522 473 -1018 479 -1014 975 -526 955 -516 475 -1046 975 -490 999 -518 481 -1014 975 -520 967 -514 481 -1022 979 -524 457 -1048 971 -514 481 -1010 485 -1020 477 -1014 479 -1000 1001 -522 451 -1020 977 -520 473 -1032 967 -538 959 -514 1005 -522 965 -504 989 -514 475 -1046 441 -1050 971 -514 975 -520 473 -1018 481 -1014 979 -520 983 -520 977 -516 485 -1010 979 -544 975 -518 453 -1042 981 -520 453 -1024 483 -1010 457 -1050 975 -512 975 -524 459 -1048 973 -514 481 -1010 473 -1016 479 -1016 477 -1036 967 -506 995 -512 965 -546 445 -1048 957 -516 1005 -512 445 -1046 979 -486 473 -980 979 -486 473 -980 981 -486 473 -980 485 -986 467 -976 1477 -142204 197 -1486 165 -198 165 -664 295 -232 99 -266 231 -166 3045 -100 13411 -3670 197 -498 131 -166 231 -198 165 -66 265 -134 129 -1062 431 -130 465 -134 13447 -3848 329 -100 163 -298 99 -164 463 -98 197 -98 131 -198 65 -296 493 -264 789 -66 7225 -12438 99 -164 463 -132 197 -630 65 -198 2487 -66 165 -100 10097 -6554 459 -664 297 -460 4925 -132 6063 -12078 497 -98 99 -200 97 -234 165 -298 1721 -134 265 -100 3035 -100 12081 -3674 231 -100 97 -200 97 -264 461 -100 99 -132 231 -100 97 -430 527 -200 231 -64 2081 -132 327 -100 529 -66 831 -66 3067 -4704 99 -5520 97 -496 67 -198 167 -498 693 -462 2341 -15926 65 -1392 659 -134 131 -298 165 -66 99 -298 4777 -4208 429 -66 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/phoenix_v2.sub ================================================ Filetype: Flipper SubGhz Key File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: Phoenix_V2 Bit: 52 Key: 00 0F 0F BD 7E 7F 10 AE ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/phoenix_v2_raw.sub ================================================ Filetype: Flipper SubGhz RAW File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: RAW RAW_Data: -465 9659 -100 885 -162 2507 -98 1805 -64 427 -98 1879 -198 489 -66 525 -98 851 -100 525 -66 819 -66 395 -98 459 -66 1155 -66 863 -68 265 -98 2359 -68 435 -166 2031 -66 829 -100 561 -66 701 -66 1365 -134 731 -132 655 -68 1623 -66 263 -98 1087 -98 591 -64 987 -132 299 -66 885 -66 1087 -66 2605 -100 303 -100 731 -132 1323 -66 267 -100 627 -66 431 -100 397 -100 1027 -66 559 -102 1565 -100 865 -66 629 -100 327 -66 1281 -98 851 -132 593 -132 429 -100 2931 -134 759 -298 2985 -132 1129 -66 1131 -166 235 -100 725 -66 199 -134 365 -64 293 -66 489 -130 15135 -132 899 -100 691 -100 1271 -134 1161 -66 1789 -100 293 -64 651 -130 719 -100 1061 -66 529 -66 501 -132 1523 -68 231 -68 895 -100 1557 -134 895 -66 2297 -68 4497 -134 1319 -64 525 -98 949 -66 463 -132 399 -134 1129 -66 263 -170 1027 -100 763 -98 265 -68 603 -66 563 -166 1221 -68 1253 -66 1163 -66 697 -134 699 -98 1929 -68 931 -100 399 -100 1589 -98 663 -98 261 -66 337 -100 497 -98 767 -66 471 -66 365 -66 1363 -68 967 -300 461 -66 879 -98 623 -98 623 -100 725 -98 1685 -66 1061 -264 1523 -66 665 -130 2239 -66 229 -130 1509 -66 763 -100 1301 -132 12207 -98 261 -98 3707 -66 323 -298 821 -66 623 -98 2467 -66 2177 -164 625 -100 629 -132 1263 -132 1027 -100 2093 -132 397 -98 1855 -66 2515 -64 391 -132 1163 -66 503 -68 499 -98 2383 -98 1143 -66 523 -66 821 -98 525 -98 163 -164 1775 -68 231 -134 2159 -100 3065 -66 401 -134 925 -200 165 -18904 99 -296 261 -1018 99 -198 235 -166 329 -298 133 -266 1877 -132 227 -198 797 -66 933 -100 1093 -98 197 -66 723 -98 293 -132 953 -66 1507 -132 261 -64 1183 -98 393 -66 461 -100 863 -66 463 -100 865 -66 2721 -200 11457 -66 4203 -100 969 -66 765 -234 229 -100 491 -66 433 -66 231 -134 1189 -100 1015 -96 1349 -66 687 -132 655 -100 365 -132 397 -132 761 -100 1393 -66 525 -100 397 -132 327 -68 495 -66 429 -68 533 -134 529 -66 565 -102 695 -102 1353 -66 793 -228 197 -100 801 -64 657 -98 1439 -98 393 -98 359 -130 2707 -100 1101 -166 1523 -100 961 -100 397 -66 1217 -66 531 -166 199 -102 365 -166 1863 -66 367 -66 361 -68 703 -100 763 -100 299 -66 501 -200 231 -100 2879 -98 2005 -66 825 -134 263 -66 1155 -132 929 -66 335 -100 13393 -100 4113 -266 99 -198 1357 -66 1015 -100 1627 -66 999 -132 1329 -132 529 -66 2591 -100 2545 -68 429 -100 499 -166 961 -66 467 -66 699 RAW_Data: -100 44175 -12032 99 -400 99 -334 65 -490 165 -328 65 -298 367 -1488 131 -166 131 -264 65 -66 99 -558 197 -198 129 -164 263 -100 2897 -66 33999 -98 1313 -166 657 -132 261 -66 197 -98 1477 -98 229 -66 1319 -66 231 -68 1199 -66 763 -100 857 -134 1963 -18216 99 -500 165 -330 65 -360 163 -202 65 -100 99 -366 267 -402 163 -68 233 -164 65 -66 167 -396 365 -100 1527 -66 393 -132 757 -66 1759 -100 821 -98 233 -66 1197 -66 399 -130 495 -100 435 -100 365 -66 199 -66 6399 -66 3541 -132 369 -132 1361 -98 597 -132 729 -68 733 -66 693 -100 199 -68 565 -134 363 -66 917 -68 267 -134 757 -132 1415 -132 327 -98 1053 -68 897 -166 263 -296 793 -102 297 -98 391 -100 893 -100 233 -68 563 -100 729 -66 431 -66 403 -68 397 -66 601 -164 563 -66 861 -132 1793 -66 637 -134 297 -66 525 -66 1421 -66 265 -100 463 -66 835 -100 699 -100 1029 -132 265 -166 567 -164 2155 -66 263 -66 1945 -100 10073 -132 463 -100 799 -66 729 -100 1655 -66 233 -66 265 -134 1961 -132 733 -98 301 -134 367 -134 1033 -64 889 -166 1463 -100 1327 -100 573 -132 497 -100 903 -100 1951 -66 427 -132 895 -198 1387 -98 723 -66 363 -100 263 -134 263 -166 561 -300 363 -198 929 -132 999 -168 65 -134 867 -132 719 -64 6625 -100 3415 -66 1553 -132 757 -130 329 -66 1625 -66 199 -66 265 -100 365 -132 267 -66 235 -100 703 -100 431 -100 601 -68 565 -100 399 -100 365 -100 365 -98 633 -100 2067 -100 495 -98 1121 -66 1253 -100 433 -132 199 -132 567 -100 99 -98 829 -198 363 -98 1717 -66 301 -132 403 -66 1791 -66 401 -100 633 -98 697 -66 1127 -66 433 -66 965 -100 2485 -66 461 -66 899 -98 231 -100 763 -100 523 -198 361 -132 1911 -66 2307 -168 265 -100 659 -134 461 -66 1165 -68 1423 -66 2693 -66 499 -66 733 -134 893 -98 435 -134 2359 -132 197 -68 661 -100 231 -68 369 -100 231 -66 495 -132 1751 -68 233 -68 1765 -132 233 -130 491 -162 855 -98 2113 -100 333 -134 765 -132 529 -66 293 -66 987 -132 329 -64 293 -98 99 -98 361 -100 367 -166 267 -68 261 -100 997 -408 855 -456 845 -868 417 -882 397 -900 411 -416 869 -884 417 -844 441 -846 427 -456 843 -452 831 -876 409 -898 409 -430 837 -462 839 -462 847 -854 417 -876 437 -880 397 -886 385 -486 841 -874 411 -868 415 -892 383 -878 439 -418 847 -466 835 -882 427 -440 843 -870 417 -882 411 -878 435 -846 427 -886 385 -886 415 -880 427 -870 409 -454 837 -888 419 RAW_Data: -448 837 -448 835 -880 413 -448 869 -414 885 -420 849 -450 843 -876 443 -440 841 -438 873 -862 413 -448 855 -876 413 -25804 2597 -422 879 -418 867 -884 419 -844 445 -876 399 -454 849 -886 417 -878 415 -872 419 -418 893 -410 865 -876 415 -876 437 -418 851 -450 875 -418 877 -874 405 -866 419 -884 413 -878 437 -418 883 -850 415 -882 425 -874 409 -884 419 -452 851 -418 885 -850 415 -452 859 -876 409 -898 407 -862 449 -844 449 -874 409 -872 435 -870 397 -882 425 -426 875 -868 413 -452 871 -418 881 -874 413 -448 839 -460 847 -424 879 -420 867 -890 417 -416 887 -418 885 -860 413 -450 869 -848 437 -25854 475 -3978 135 -398 65 -1128 225 -1058 225 -1032 299 -562 749 -994 307 -956 341 -946 369 -488 809 -494 803 -930 353 -932 383 -474 815 -510 815 -468 811 -928 377 -914 381 -914 407 -882 399 -454 839 -890 413 -900 409 -870 417 -880 425 -442 843 -476 841 -864 417 -454 867 -882 417 -876 411 -876 435 -846 429 -882 421 -886 419 -850 445 -872 411 -450 853 -878 419 -430 881 -418 867 -890 417 -416 889 -418 885 -432 871 -416 855 -878 451 -438 845 -458 843 -884 419 -446 837 -880 449 -25864 497 -9138 659 -1080 233 -1046 297 -976 295 -558 737 -578 763 -942 339 -972 341 -530 785 -492 807 -486 807 -916 397 -918 357 -922 387 -928 383 -482 801 -906 395 -898 407 -888 415 -882 411 -480 841 -448 839 -878 415 -448 871 -876 411 -880 437 -880 397 -884 423 -884 419 -882 413 -886 387 -912 397 -466 843 -866 413 -448 869 -456 837 -888 419 -450 837 -450 851 -450 871 -454 837 -888 419 -450 835 -450 871 -884 417 -448 837 -880 415 -172818 65 -1022 197 -1852 10287 -134 695 -132 263 -130 1717 -66 625 -100 1031 -68 301 -68 265 -100 665 -98 1059 -100 931 -66 1093 -132 333 -68 3011 -132 459 -66 659 -98 521 -98 1511 -98 163 -98 857 -132 231 -98 491 -66 587 -66 393 -98 1513 -98 263 -130 529 -100 299 -100 1545 -132 1313 -66 399 -68 299 -134 201 -68 265 -98 691 -132 1099 -66 427 -100 461 -264 427 -134 327 -100 227 -64 493 -66 633 -66 501 -66 2067 -228 595 -132 97 -66 231 -66 299 -66 925 -98 661 -100 433 -134 231 -166 999 -98 691 -66 197 -66 293 -66 265 -362 1557 -100 231 -134 265 -68 433 -66 2483 -66 333 -100 233 -166 917 -132 295 -132 949 -164 1775 -100 7629 -66 7259 -66 263 -202 1263 -100 265 -68 861 -166 365 -98 233 -164 569 -66 199 -100 399 -98 1189 -130 261 -100 655 -164 723 -264 231 -100 327 -130 395 RAW_Data: -130 84629 -16530 199 -594 163 -562 65 -164 65 -230 1383 -100 1031 -66 427 -66 401 -68 265 -102 233 -134 923 -100 493 -66 555 -132 619 -66 3165 -66 463 -198 1025 -68 233 -100 957 -132 793 -134 1233 -100 1553 -98 431 -100 1429 -100 393 -164 259 -166 65 -100 297 -134 263 -68 1797 -66 887 -100 497 -100 565 -134 363 -96 1649 -130 393 -98 327 -100 563 -68 891 -68 24545 -68 231 -134 167 -100 131 -68 863 -102 627 -164 267 -166 631 -66 569 -100 797 -66 231 -166 301 -102 569 -134 1423 -66 1115 -66 759 -66 599 -68 1265 -268 527 -134 531 -98 269 -68 231 -66 325 -98 329 -66 399 -64 393 -98 459 -98 921 -66 457 -100 2541 -266 927 -68 231 -64 357 -98 495 -166 133 -100 529 -98 1091 -100 199 -66 597 -100 931 -66 663 -134 333 -166 763 -68 599 -100 333 -102 333 -232 363 -66 1491 -132 697 -134 629 -66 369 -66 561 -134 863 -98 895 -100 199 -98 763 -100 299 -168 561 -100 331 -100 467 -100 1231 -100 1821 -66 229 -66 325 -66 1419 -66 195 -66 553 -132 363 -164 857 -66 491 -66 227 -98 227 -98 529 -100 2093 -164 501 -132 1441 -98 1095 -100 263 -66 931 -66 1397 -66 1627 -98 433 -66 697 -200 363 -266 297 -100 301 -200 263 -98 565 -134 65 -102 297 -100 165 -100 929 -266 1325 -66 3213 -100 4403 -100 665 -134 1859 -66 631 -66 967 -200 165 -134 1551 -66 791 -100 331 -132 163 -64 163 -98 361 -132 557 -98 629 -66 885 -100 1087 -100 959 -100 535 -66 265 -66 1931 -66 465 -66 1165 -100 565 -100 865 -100 493 -66 597 -166 1293 -100 463 -68 563 -66 565 -66 595 -100 197 -68 929 -66 665 -134 399 -66 665 -100 1255 -166 935 -98 1791 -98 265 -136 501 -100 1581 -66 265 -66 567 -98 699 -134 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/power_smart.sub ================================================ Filetype: Flipper SubGhz Key File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: Power Smart Bit: 64 Key: FD C1 36 AC AA 3E C9 52 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/power_smart_raw.sub ================================================ Filetype: Flipper SubGhz RAW File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: RAW RAW_Data: -68 521674 -200 213 -258 217 -218 217 -246 193 -242 211 -466 451 -450 225 -212 211 -242 211 -238 243 -200 223 -254 419 -226 221 -432 251 -212 467 -240 203 -450 449 -246 205 -238 217 -218 217 -444 439 -478 431 -230 211 -462 247 -214 435 -454 449 -456 441 -442 471 -448 449 -246 205 -238 215 -220 217 -244 201 -254 217 -430 235 -220 461 -198 223 -442 275 -212 429 -458 245 -212 203 -228 253 -218 431 -448 451 -442 235 -218 463 -426 485 -214 209 -234 221 -254 219 -214 207 -228 253 -428 459 -418 245 -216 243 -194 241 -212 241 -212 211 -244 441 -228 215 -460 217 -244 435 -236 235 -440 439 -246 213 -208 229 -256 217 -430 445 -450 445 -236 253 -420 225 -232 429 -450 465 -448 439 -448 449 -454 453 -230 225 -214 241 -212 211 -242 211 -244 237 -442 237 -218 429 -230 221 -442 241 -246 425 -458 245 -212 203 -228 255 -218 427 -448 451 -446 235 -256 425 -462 417 -244 251 -208 201 -256 217 -218 209 -232 255 -420 451 -448 217 -242 211 -238 209 -234 221 -256 217 -218 437 -238 217 -464 203 -256 419 -226 223 -464 441 -244 213 -240 197 -254 219 -430 445 -452 479 -204 253 -420 225 -222 463 -452 449 -450 449 -452 447 -450 451 -238 215 -220 217 -244 199 -256 217 -218 207 -440 241 -254 423 -238 217 -462 197 -224 471 -448 225 -220 213 -242 211 -212 465 -446 449 -456 245 -214 437 -456 449 -232 233 -216 219 -254 207 -204 253 -218 219 -440 451 -456 237 -216 217 -254 209 -202 253 -218 219 -210 437 -244 253 -422 237 -218 423 -226 247 -430 451 -242 203 -228 253 -220 217 -442 449 -454 449 -240 217 -430 237 -218 461 -426 453 -450 465 -448 451 -440 443 -246 215 -250 201 -224 255 -218 215 -208 227 -442 239 -208 457 -238 219 -464 201 -256 425 -464 201 -256 217 -210 241 -216 451 -426 445 -486 207 -236 441 -430 479 -194 223 -256 217 -218 209 -234 253 -218 217 -438 449 -454 239 -216 217 -256 207 -202 255 -218 217 -210 439 -244 253 -424 235 -218 457 -224 229 -436 449 -230 221 -214 211 -242 211 -468 447 -450 449 -250 207 -454 239 -218 431 -446 451 -448 443 -486 447 -448 431 -240 207 -232 223 -254 219 -216 209 -230 253 -426 233 -234 433 -244 213 -432 237 -218 463 -446 221 -212 211 -242 239 -208 457 -456 451 -456 223 -212 467 -450 453 -204 253 -218 211 -240 215 -218 255 -208 201 -442 479 -452 203 -254 217 -212 241 -216 217 -256 207 -202 439 -240 245 -430 237 -218 463 -240 217 -428 465 -202 253 -218 213 -234 219 RAW_Data: -444 443 -452 455 -244 213 -440 237 -254 427 -450 429 -480 417 -454 477 -430 445 -244 217 -250 203 -224 253 -220 215 -206 221 -462 217 -212 467 -234 231 -440 239 -220 427 -446 219 -242 211 -244 237 -206 451 -458 451 -458 203 -254 427 -450 441 -246 213 -242 193 -244 211 -242 211 -212 241 -442 451 -454 245 -214 241 -198 255 -218 217 -210 225 -212 461 -246 213 -440 225 -242 435 -240 209 -456 457 -246 211 -204 229 -254 219 -428 445 -452 445 -238 253 -426 231 -232 435 -448 455 -448 439 -446 449 -456 451 -230 223 -214 241 -212 211 -242 211 -244 237 -442 237 -218 427 -232 221 -442 239 -246 427 -458 245 -212 205 -228 253 -220 427 -446 471 -442 237 -216 451 -462 411 -244 251 -216 205 -222 211 -242 211 -242 211 -480 453 -418 245 -252 207 -202 253 -218 219 -210 229 -256 425 -232 221 -430 251 -212 469 -204 235 -446 441 -246 213 -242 193 -244 211 -464 451 -456 441 -248 215 -450 201 -256 427 -452 457 -450 455 -450 439 -446 451 -238 217 -256 207 -202 255 -218 217 -210 231 -442 237 -244 423 -240 217 -464 203 -254 419 -454 227 -210 243 -212 241 -212 477 -418 453 -484 199 -226 431 -267004 97 -422 97 -164 65 -490 97 -2222 559 -66 163 -64 295 -100 497 -100 263 -98 361 -460 793 -66 1803 -100 339 -68 1733 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/princeton.sub ================================================ Filetype: Flipper SubGhz Key File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: Princeton Bit: 24 Key: 00 00 00 00 00 95 D5 D4 TE: 400 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/princeton_raw.sub ================================================ Filetype: Flipper SubGhz RAW File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: RAW RAW_Data: 1711 -32700 621 -1600 1623 -564 1639 -552 1637 -520 1701 -514 1665 -516 579 -1556 607 -1562 571 -1570 1697 -484 605 -1544 1701 -500 611 -1544 1697 -528 1675 -518 1705 -492 589 -1580 593 -1536 609 -1562 583 -1574 595 -1542 603 -1568 1699 -490 1693 -496 613 -16342 623 -1538 1693 -520 1675 -486 1721 -492 1709 -520 1701 -486 579 -1588 573 -1578 589 -1568 1695 -482 605 -1582 1703 -492 589 -1578 1675 -518 1707 -484 1703 -500 609 -1576 571 -1574 611 -1532 627 -1538 603 -1546 607 -1548 1729 -474 1719 -490 613 -16368 591 -1570 1689 -504 1699 -484 1711 -506 1715 -486 1707 -488 619 -1576 583 -1540 611 -1562 1711 -486 615 -1546 1705 -490 621 -1542 1705 -506 1713 -486 1713 -486 629 -1540 609 -1564 589 -1574 599 -1540 607 -1568 611 -1546 1707 -492 1711 -480 609 -16394 597 -1566 1701 -494 1693 -492 1705 -520 1705 -474 1727 -502 585 -1574 599 -1570 575 -1566 1699 -520 593 -1570 1703 -480 605 -1572 1705 -490 1717 -482 1735 -486 603 -1566 611 -1532 615 -1562 587 -1578 585 -1574 579 -1586 1677 -512 1705 -490 621 -16376 603 -1556 1677 -540 1667 -516 1699 -506 1717 -486 1701 -510 591 -1576 579 -1562 625 -1538 1727 -492 605 -1566 1703 -484 605 -1570 1703 -492 1713 -482 1733 -482 603 -1570 611 -1548 611 -1564 581 -1558 613 -1548 603 -1574 1701 -484 1701 -520 581 -16396 603 -1568 1693 -514 1687 -486 1711 -486 1721 -492 1707 -520 577 -1568 611 -1564 581 -1580 1679 -516 603 -1544 1707 -512 609 -1564 1707 -482 1725 -476 1717 -520 587 -1548 613 -1552 613 -1564 581 -1580 581 -1578 581 -1554 1725 -488 1703 -520 581 -16392 615 -1588 1663 -514 1705 -514 1689 -518 1713 -484 1709 -492 613 -1576 593 -1540 607 -1578 1703 -492 621 -1542 1715 -502 587 -1572 1693 -520 1713 -482 1709 -510 591 -1570 605 -1568 611 -1562 581 -1580 581 -1580 585 -1546 1741 -484 1715 -500 585 -16404 605 -1566 1765 -516 349 -32700 633 -1566 1667 -512 1659 -550 1677 -490 1695 -492 1705 -510 575 -1576 577 -1566 611 -1536 1709 -492 603 -1534 1695 -516 599 -1546 1697 -502 1679 -520 1677 -492 613 -1570 595 -1544 603 -1538 609 -1568 1701 -462 1721 -488 613 -1538 625 -1548 599 -16338 625 -1544 1697 -506 1669 -522 1681 -488 1707 -484 1701 -504 577 -1586 571 -1570 605 -1554 1677 -512 575 -1578 1671 -520 587 -1578 1675 -506 1695 -500 1679 -518 577 -1570 577 -1568 615 -1548 577 -1564 1709 -490 1679 -512 605 -1554 589 -1574 597 -16376 605 -1532 1695 -508 1691 -486 1703 -480 1693 -500 1711 -484 585 -1572 609 -1556 587 -1568 1693 -486 583 -1598 1669 -488 603 -1572 1699 -482 1689 -520 1677 -522 585 -1576 585 -1542 609 -1560 587 -1570 1691 -518 1675 -490 605 -1568 577 -1562 591 -16398 615 -1568 1663 -518 RAW_Data: 1673 -492 1709 -480 1693 -512 1689 -504 579 -1592 589 -1542 587 -1578 1699 -484 605 -1544 1701 -518 577 -1568 1699 -484 1677 -520 1675 -518 579 -1598 563 -1576 603 -1568 575 -1566 1703 -492 1707 -480 611 -1556 587 -1572 601 -16374 619 -1566 1667 -516 1675 -524 1675 -516 1667 -514 1691 -506 581 -1580 583 -1560 579 -1588 1679 -512 573 -1580 1677 -520 579 -1572 1705 -494 1681 -514 1703 -478 593 -1576 603 -1574 575 -1576 577 -1568 1703 -492 1691 -492 613 -1570 597 -1542 607 -16402 563 -1620 1597 -592 1605 -586 1609 -606 1619 -544 1631 -588 515 -1620 559 -1600 569 -1564 1671 -526 585 -1580 1675 -518 579 -1564 1711 -486 1709 -494 1695 -514 575 -1562 589 -1576 603 -1544 607 -1566 1703 -494 1691 -490 611 -1572 595 -1544 603 -16400 615 -1536 1707 -494 1679 -514 1673 -510 1715 -486 1707 -494 587 -1582 587 -1574 579 -1546 1705 -522 577 -1580 1699 -494 603 -1534 1729 -482 1693 -502 1699 -510 577 -1586 587 -1570 601 -1544 609 -1578 1703 -492 1711 -480 609 -1560 591 -1576 603 -16408 581 -1588 1701 -516 1703 -514 1689 -32700 641 -1534 1703 -492 1693 -486 1673 -516 1689 -504 1669 -520 587 -1572 573 -1548 611 -1538 1715 -486 581 -1576 1663 -520 587 -1560 1699 -484 1703 -488 1699 -518 575 -1576 575 -1570 1663 -520 1677 -522 587 -1576 585 -1540 609 -1556 587 -1574 563 -16370 595 -1568 1689 -506 1669 -490 1677 -512 1699 -510 1681 -508 581 -1560 585 -1580 583 -1560 1665 -516 607 -1538 1703 -486 607 -1576 1663 -504 1703 -482 1695 -500 587 -1574 599 -1544 1697 -518 1671 -490 587 -1578 589 -1572 577 -1564 589 -1574 599 -16376 571 -1566 1693 -518 1673 -518 1649 -520 1679 -516 1665 -514 567 -1574 605 -1544 609 -1570 1669 -518 581 -1562 1669 -518 587 -1574 1667 -516 1691 -518 1671 -490 601 -1568 573 -1584 1673 -518 1673 -518 579 -1558 611 -1550 587 -1580 585 -1572 579 -16380 617 -1566 1649 -542 1669 -490 1679 -512 1703 -510 1655 -518 579 -1564 615 -1562 587 -1562 1677 -520 587 -1574 1667 -506 589 -1568 1691 -520 1679 -492 1675 -514 611 -1554 589 -1572 1687 -506 1675 -520 585 -1574 579 -1578 585 -1568 601 -1540 605 -16408 585 -1564 1663 -530 1663 -518 1667 -514 1689 -504 1699 -482 605 -1582 581 -1570 563 -1574 1693 -504 577 -1588 1659 -518 579 -1598 1655 -518 1707 -482 1701 -480 605 -1582 583 -1572 1687 -518 1671 -490 587 -1574 605 -1582 581 -1570 561 -1576 601 -16376 615 -1560 1673 -518 1663 -530 1671 -518 1671 -500 1697 -514 573 -1584 587 -1570 597 -1540 1699 -504 577 -1586 1693 -486 579 -1600 1681 -486 1711 -518 1677 -486 587 -1572 577 -1590 1677 -518 1673 -498 605 -1566 607 -1554 589 -1572 601 -1544 605 -16396 615 -1544 1673 -518 1667 -530 1673 -518 RAW_Data: 1669 -520 1677 -488 621 -1576 581 -1542 615 -1568 1689 -486 583 -1596 1669 -520 571 -1572 1703 -512 1697 -494 1691 -528 583 -1570 599 -1574 1703 -484 1703 -512 573 -1588 585 -1572 601 -1574 577 -1568 613 -16404 595 -1574 1697 -504 1711 -506 1733 -510 1717 -504 1371 -32700 613 -1572 1653 -536 1673 -488 1679 -514 1669 -508 1681 -518 579 -1580 575 -1570 577 -1572 1667 -518 581 -1564 1671 -490 587 -1580 1677 -516 1663 -514 1657 -508 1673 -516 1695 -500 587 -1572 565 -1574 603 -1574 575 -1570 575 -1570 579 -1580 575 -16372 585 -1566 1673 -520 1671 -508 1677 -514 1665 -512 1655 -512 577 -1568 585 -1572 581 -1582 1667 -522 587 -1548 1669 -500 613 -1544 1683 -520 1679 -478 1703 -480 1685 -520 1673 -508 579 -1562 577 -1588 571 -1566 605 -1558 589 -1576 563 -1576 601 -16382 581 -1566 1671 -520 1681 -492 1679 -512 1663 -506 1679 -518 575 -1570 577 -1568 581 -1576 1667 -518 587 -1578 1643 -530 571 -1566 1667 -510 1687 -518 1665 -520 1669 -492 1691 -486 581 -1600 561 -1570 605 -1574 575 -1568 575 -1570 579 -1580 577 -16412 581 -1588 1665 -516 1665 -510 1653 -518 1669 -504 1667 -518 573 -1572 579 -1594 561 -1572 1693 -486 583 -1578 1667 -502 577 -1584 1691 -484 1699 -486 1693 -486 1673 -500 1691 -514 577 -1562 591 -1576 567 -1576 605 -1544 609 -1570 577 -1578 577 -16392 617 -1564 1673 -486 1681 -490 1681 -514 1671 -504 1683 -520 575 -1572 577 -1568 579 -1576 1671 -520 583 -1546 1669 -530 573 -1572 1673 -504 1679 -518 1671 -508 1667 -508 1673 -516 575 -1562 591 -1568 603 -1542 607 -1546 609 -1574 577 -1568 577 -16416 583 -1582 1667 -516 1637 -542 1651 -510 1665 -518 1671 -524 585 -1544 585 -1572 577 -1588 1675 -484 611 -1574 1667 -506 581 -1562 1691 -486 1671 -516 1691 -488 1673 -522 1679 -494 571 -1566 607 -1556 591 -1568 603 -1572 577 -1576 577 -1572 577 -16396 617 -1564 1681 -492 1681 -514 1673 -500 1675 -514 1667 -504 577 -1588 589 -1546 603 -1572 1665 -514 567 -1576 1697 -476 613 -1564 1669 -520 1679 -482 1695 -512 1655 -520 1673 -520 581 -1562 579 -1590 571 -1568 607 -1554 587 -1570 567 -1574 607 -16402 593 -1572 1665 -504 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/revers_rb2.sub ================================================ Filetype: Flipper SubGhz Key File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: Revers_RB2 Bit: 64 Key: FF FF FF FF 39 F9 0A 00 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/revers_rb2_raw.sub ================================================ Filetype: Flipper SubGhz RAW File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: RAW RAW_Data: 215 -498 257 -246 243 -276 215 -280 215 -278 247 -250 507 -258 247 -504 479 -274 253 -254 219 -290 213 -530 485 -482 481 -308 217 -254 253 -252 241 -234 257 -250 249 -278 219 -252 247 -250 279 -544 235 -268 259 -226 255 -250 249 -280 219 -252 249 -250 215 -280 247 -252 249 -250 249 -280 219 -252 249 -250 215 -280 279 -218 251 -250 249 -280 219 -252 251 -248 281 -220 251 -250 249 -248 247 -278 219 -252 249 -250 279 -220 251 -250 247 -280 219 -254 249 -248 217 -280 277 -220 507 -258 247 -504 225 -278 245 -246 469 -292 213 -530 227 -276 215 -274 247 -248 249 -248 247 -248 501 -258 249 -502 479 -272 251 -254 255 -254 249 -476 481 -514 481 -274 253 -254 255 -250 239 -262 225 -254 249 -248 217 -278 247 -250 251 -572 267 -238 263 -224 251 -280 219 -252 249 -250 279 -220 251 -250 249 -280 219 -252 249 -248 249 -248 247 -250 251 -250 249 -280 219 -252 251 -248 217 -280 247 -250 249 -250 249 -280 219 -252 249 -250 279 -220 251 -250 249 -248 247 -280 219 -252 249 -248 281 -220 251 -250 247 -280 479 -228 279 -500 255 -216 277 -214 531 -228 279 -500 257 -216 275 -214 275 -216 277 -278 217 -250 505 -260 217 -500 509 -258 243 -246 273 -216 275 -500 479 -546 479 -238 253 -256 253 -250 243 -268 221 -250 247 -250 251 -250 247 -280 219 -574 265 -268 199 -292 219 -250 279 -220 251 -250 249 -248 249 -278 219 -252 249 -250 279 -220 251 -248 249 -280 219 -252 251 -248 217 -280 247 -250 251 -250 249 -280 219 -252 249 -250 279 -220 251 -250 249 -248 247 -280 219 -250 249 -250 279 -220 251 -250 249 -248 247 -280 219 -252 503 -260 217 -532 225 -276 215 -278 503 -238 251 -502 249 -244 241 -278 215 -272 215 -272 277 -214 493 -310 215 -530 483 -232 261 -258 223 -254 249 -538 483 -482 509 -274 217 -290 217 -252 241 -236 259 -250 247 -248 247 -280 217 -252 249 -602 203 -272 229 -256 281 -220 251 -250 249 -280 219 -252 249 -250 279 -222 251 -250 247 -248 249 -278 219 -252 249 -250 279 -220 251 -250 247 -280 221 -252 249 -250 215 -280 247 -250 251 -250 249 -280 219 -252 249 -250 279 -220 251 -250 249 -248 247 -280 219 -250 249 -250 279 -220 507 -258 215 -530 227 -278 215 -276 501 -258 215 -530 227 -278 215 -276 215 -276 247 -250 247 -250 501 -260 249 -502 481 -272 251 -254 219 -290 247 -474 481 -514 481 -274 289 -218 253 -252 241 -230 253 -282 217 -252 249 -248 279 -220 251 -574 267 -238 263 -222 RAW_Data: 251 -280 219 -252 249 -250 215 -280 279 -220 251 -248 249 -280 219 -252 249 -250 279 -220 251 -250 249 -248 247 -280 219 -252 249 -250 277 -222 251 -250 247 -280 219 -252 249 -250 217 -280 247 -250 251 -250 247 -280 219 -252 249 -250 279 -222 251 -250 247 -250 501 -258 249 -502 257 -218 275 -216 497 -272 287 -464 219 -274 275 -216 273 -216 271 -278 213 -274 499 -238 253 -498 479 -262 261 -228 257 -252 249 -506 481 -512 507 -236 291 -218 253 -290 211 -270 223 -250 247 -250 251 -250 247 -248 249 -568 267 -272 201 -292 221 -248 217 -280 247 -250 251 -250 247 -280 221 -252 249 -250 279 -220 251 -250 249 -248 247 -280 219 -250 249 -250 279 -220 251 -250 249 -248 247 -280 219 -250 249 -250 279 -222 251 -248 249 -280 219 -252 249 -250 217 -278 247 -252 251 -250 247 -280 219 -252 507 -260 217 -502 269 -252 253 -256 495 -236 265 -482 259 -250 247 -278 217 -252 249 -248 215 -280 503 -258 217 -532 515 -238 253 -254 255 -254 213 -504 513 -514 477 -274 215 -290 217 -256 247 -234 253 -252 249 -250 249 -280 219 -252 249 -602 203 -272 229 -256 281 -220 251 -250 249 -280 219 -252 249 -250 247 -248 249 -250 251 -250 249 -280 219 -250 249 -250 279 -222 251 -250 247 -250 247 -280 219 -250 249 -250 279 -220 251 -250 249 -248 247 -280 219 -252 249 -248 281 -220 249 -250 249 -280 219 -252 249 -250 215 -280 503 -260 217 -530 227 -280 213 -278 501 -258 217 -496 257 -276 215 -278 215 -278 245 -250 251 -250 501 -260 249 -502 479 -272 251 -256 217 -290 247 -474 483 -514 481 -274 251 -256 253 -252 241 -230 253 -282 217 -252 249 -248 217 -278 247 -576 269 -240 265 -222 251 -248 249 -278 219 -252 249 -250 279 -220 249 -250 249 -280 219 -252 249 -250 217 -278 279 -220 251 -250 249 -280 219 -252 249 -250 279 -220 251 -250 247 -250 247 -280 219 -250 249 -250 279 -220 251 -250 249 -248 247 -280 219 -250 249 -250 279 -220 251 -250 535 -226 251 -502 225 -246 275 -246 467 -290 245 -504 225 -276 245 -248 247 -246 247 -248 245 -280 475 -228 279 -500 479 -272 251 -256 253 -256 247 -470 483 -514 513 -238 289 -220 253 -288 209 -270 223 -250 215 -280 245 -250 251 -248 249 -570 267 -238 229 -288 221 -254 249 -250 279 -220 251 -250 249 -248 247 -280 219 -250 249 -250 279 -222 251 -250 247 -280 219 -252 249 -250 217 -278 247 -252 251 -250 247 -280 219 -252 249 -250 279 -222 251 -250 247 -248 249 -280 217 -252 RAW_Data: 249 -250 279 -220 251 -250 249 -278 221 -252 505 -228 245 -530 257 -214 275 -246 505 -226 247 -532 257 -214 275 -216 275 -246 249 -248 217 -280 503 -258 217 -498 543 -236 251 -254 255 -254 251 -474 513 -516 477 -238 253 -292 217 -254 245 -234 253 -252 251 -248 249 -278 219 -252 251 -602 203 -272 229 -258 279 -222 251 -250 247 -250 247 -280 217 -252 249 -250 279 -220 251 -250 249 -248 247 -280 219 -252 249 -248 279 -220 251 -250 249 -280 219 -252 249 -250 247 -248 279 -220 251 -248 249 -280 219 -252 249 -250 279 -220 253 -250 247 -248 249 -278 219 -252 249 -250 503 -258 217 -564 195 -278 215 -276 503 -258 215 -500 271 -288 215 -256 253 -250 207 -262 251 -252 505 -256 247 -504 481 -306 215 -254 253 -256 213 -534 487 -480 511 -274 215 -292 253 -218 247 -236 257 -250 247 -278 219 -250 249 -250 279 -544 235 -268 259 -226 253 -250 249 -280 219 -252 249 -250 279 -220 253 -250 247 -248 249 -278 219 -252 249 -250 279 -220 251 -250 249 -248 247 -280 219 -250 249 -250 279 -220 251 -250 249 -280 219 -252 249 -250 215 -280 277 -220 251 -250 247 -280 221 -252 249 -250 279 -220 251 -250 471 -290 247 -502 225 -278 245 -246 469 -306 251 -466 251 -242 245 -272 245 -246 241 -246 241 -278 497 -238 253 -500 483 -264 229 -258 283 -220 253 -508 481 -508 477 -308 253 -218 253 -254 243 -264 225 -256 247 -250 279 -220 249 -250 249 -570 269 -236 231 -286 223 -252 251 -248 217 -278 247 -252 249 -250 249 -280 219 -252 249 -250 279 -220 251 -250 249 -248 247 -280 219 -252 249 -250 279 -220 251 -250 247 -280 221 -252 249 -250 215 -280 247 -250 251 -250 247 -280 219 -254 249 -250 247 -248 277 -220 251 -250 247 -280 479 -228 279 -500 257 -216 275 -214 531 -228 279 -500 257 -216 275 -216 275 -246 249 -250 247 -250 503 -260 215 -500 541 -238 249 -256 253 -256 215 -508 481 -548 479 -238 253 -292 217 -254 245 -232 221 -280 247 -250 251 -250 247 -280 219 -574 263 -268 199 -292 219 -250 279 -220 253 -250 247 -280 221 -252 249 -248 249 -248 277 -220 251 -250 249 -280 219 -252 249 -250 279 -220 251 -250 249 -248 247 -280 219 -252 249 -248 279 -220 251 -250 249 -280 219 -252 249 -250 247 -248 279 -220 251 -250 247 -280 219 -252 249 -250 505 -260 217 -498 257 -276 213 -278 503 -260 215 -498 257 -246 243 -276 215 -280 215 -278 247 -252 505 -256 247 -506 479 -274 253 -254 219 -290 213 -530 485 -482 509 -274 RAW_Data: 215 -292 217 -252 243 -236 259 -250 249 -280 219 -250 249 -250 215 -632 205 -272 261 -226 255 -250 249 -248 247 -280 217 -252 249 -250 279 -220 251 -250 249 -280 219 -252 249 -250 215 -280 279 -220 249 -250 249 -280 219 -252 249 -250 279 -220 251 -250 249 -248 247 -280 219 -252 249 -248 279 -220 251 -250 249 -280 219 -252 249 -250 247 -248 279 -218 507 -258 247 -504 225 -278 215 -274 499 -258 215 -530 225 -280 213 -278 245 -250 249 -248 247 -248 501 -260 247 -502 479 -272 251 -256 253 -254 249 -476 481 -514 483 -274 253 -254 255 -252 239 -260 225 -254 249 -248 215 -280 247 -250 251 -572 267 -238 263 -224 249 -280 219 -252 249 -250 279 -220 251 -250 249 -280 219 -252 249 -250 217 -280 277 -220 251 -248 249 -280 219 -252 251 -248 247 -248 279 -220 251 -250 247 -282 219 -250 249 -250 279 -222 251 -250 247 -250 247 -280 219 -250 249 -250 279 -220 251 -250 249 -280 479 -228 277 -500 257 -214 275 -216 529 -228 279 -500 257 -216 275 -216 275 -216 277 -278 217 -250 507 -258 219 -500 511 -274 253 -254 255 -218 245 -500 483 -544 479 -226 273 -244 243 -276 213 -278 213 -278 245 -250 251 -248 247 -280 219 -572 265 -268 199 -292 219 -250 279 -222 251 -250 247 -248 249 -278 221 -250 249 -250 279 -220 251 -250 249 -280 219 -252 251 -248 247 -248 279 -220 251 -248 249 -280 219 -252 249 -250 247 -248 279 -220 251 -250 247 -280 219 -254 249 -248 281 -220 251 -250 247 -250 247 -280 219 -250 505 -260 217 -500 257 -276 215 -278 503 -236 249 -504 247 -246 241 -278 213 -274 243 -244 275 -214 493 -310 215 -516 477 -272 235 -262 227 -256 249 -504 509 -482 511 -274 215 -292 217 -252 279 -202 259 -250 249 -248 247 -278 219 -250 249 -604 205 -272 229 -254 281 -220 251 -250 249 -280 219 -252 249 -250 279 -220 251 -250 249 -248 247 -280 219 -250 249 -250 279 -222 249 -250 249 -280 219 -252 249 -250 247 -248 277 -220 251 -250 249 -280 219 -252 249 -250 247 -248 279 -220 251 -250 247 -280 221 -252 249 -248 279 -220 507 -256 215 -532 225 -280 213 -276 501 -258 217 -530 227 -280 213 -276 215 -276 247 -248 249 -250 535 -226 249 -502 479 -258 243 -276 213 -276 245 -502 481 -514 483 -272 253 -254 255 -250 239 -230 253 -280 219 -250 249 -248 279 -220 253 -572 267 -238 263 -224 249 -282 219 -250 249 -250 217 -280 277 -220 251 -250 247 -280 221 -252 249 -248 281 -220 251 -250 249 -248 247 -280 219 -250 RAW_Data: 249 -250 279 -220 251 -250 249 -280 219 -252 249 -250 247 -248 277 -220 251 -250 249 -280 219 -252 249 -250 279 -220 251 -250 249 -248 501 -260 249 -502 257 -216 275 -216 497 -272 287 -464 243 -290 253 -212 271 -226 251 -280 219 -250 505 -226 247 -530 477 -274 251 -256 253 -218 283 -472 483 -514 515 -236 291 -218 253 -288 209 -268 223 -250 247 -250 251 -250 247 -248 247 -570 267 -270 201 -294 219 -250 247 -248 279 -220 249 -250 249 -280 219 -252 249 -250 247 -248 279 -220 251 -250 249 -280 219 -252 249 -250 277 -222 251 -250 247 -250 247 -278 219 -252 249 -250 279 -220 251 -250 249 -280 219 -252 249 -250 215 -280 279 -220 249 -250 247 -280 221 -252 505 -260 219 -500 271 -252 253 -256 487 -234 267 -488 257 -250 247 -248 245 -278 219 -252 249 -248 505 -258 217 -532 515 -238 253 -254 255 -254 213 -506 511 -514 477 -274 215 -290 219 -290 211 -234 285 -220 251 -250 247 -280 219 -252 249 -602 239 -238 229 -256 281 -220 251 -250 249 -280 219 -252 249 -250 215 -280 279 -220 251 -250 247 -280 219 -252 249 -250 247 -248 247 -252 251 -248 249 -280 219 -252 249 -250 279 -220 253 -250 247 -248 249 -278 219 -252 249 -250 279 -220 251 -248 249 -280 219 -252 251 -248 249 -248 503 -258 217 -532 227 -278 215 -276 501 -260 215 -498 257 -276 213 -278 215 -278 245 -252 249 -250 535 -226 249 -504 479 -272 251 -254 217 -292 247 -474 483 -514 481 -274 253 -256 253 -252 239 -230 253 -280 219 -252 247 -250 215 -280 277 -544 269 -240 265 -224 251 -248 247 -278 219 -252 249 -250 279 -220 251 -250 249 -280 219 -252 249 -250 215 -280 277 -220 251 -250 249 -280 219 -252 249 -250 279 -220 251 -250 249 -248 247 -280 219 -252 249 -248 279 -220 253 -250 247 -248 249 -278 219 -252 249 -250 277 -222 251 -250 535 -228 249 -502 225 -246 275 -246 469 -306 251 -464 243 -290 253 -212 273 -226 251 -248 247 -280 475 -228 279 -500 477 -274 251 -254 255 -254 247 -472 481 -514 515 -226 273 -214 271 -246 241 -276 215 -278 215 -278 245 -252 249 -250 249 -570 267 -236 231 -288 221 -254 249 -250 277 -222 251 -248 249 -248 247 -280 219 -252 249 -248 281 -220 251 -250 249 -280 219 -252 249 -250 215 -280 247 -250 251 -250 247 -280 221 -252 249 -248 281 -220 251 -250 249 -248 247 -280 219 -250 249 -250 279 -220 251 -250 249 -248 247 -280 477 -228 279 -500 255 -216 275 -246 505 -228 247 -530 255 -216 275 -216 275 -246 RAW_Data: 247 -250 249 -248 503 -260 217 -498 541 -238 249 -256 253 -256 251 -474 513 -518 477 -238 253 -292 217 -254 243 -234 283 -222 249 -250 249 -248 247 -278 219 -606 239 -238 231 -256 249 -248 279 -220 249 -250 249 -280 219 -252 249 -250 279 -220 251 -250 249 -248 247 -280 219 -252 249 -250 279 -220 251 -250 249 -280 219 -250 249 -250 249 -248 247 -250 251 -250 247 -280 219 -252 251 -248 281 -220 251 -250 249 -248 247 -280 219 -252 249 -248 505 -258 217 -498 257 -276 215 -278 501 -258 217 -498 257 -276 215 -278 215 -278 215 -278 247 -250 505 -260 245 -504 481 -288 215 -274 215 -276 213 -530 515 -478 511 -274 215 -256 289 -220 243 -234 255 -250 245 -280 217 -252 249 -248 279 -544 237 -268 259 -224 255 -250 249 -280 219 -252 249 -250 279 -220 251 -250 249 -248 247 -280 219 -252 249 -248 279 -220 251 -250 249 -248 249 -278 219 -252 249 -248 279 -222 251 -250 247 -280 219 -254 249 -248 247 -248 279 -220 251 -250 249 -278 221 -252 249 -248 279 -222 251 -250 469 -292 245 -504 235 -288 253 -218 489 -266 269 -500 195 -280 215 -276 247 -248 249 -250 247 -280 479 -228 277 -502 477 -272 253 -254 253 -256 247 -474 481 -516 481 -276 253 -256 253 -214 273 -260 223 -254 249 -248 279 -220 251 -250 249 -570 267 -236 231 -288 221 -254 249 -250 215 -280 247 -252 249 -250 249 -280 219 -252 249 -250 279 -220 251 -250 249 -248 247 -280 219 -252 249 -248 279 -220 251 -250 249 -248 247 -280 219 -252 249 -248 279 -222 251 -250 247 -280 219 -252 249 -250 217 -280 247 -250 251 -250 249 -278 479 -228 279 -500 257 -214 275 -216 531 -228 279 -500 257 -214 275 -216 275 -248 247 -250 249 -248 503 -258 217 -500 545 -238 251 -256 253 -218 247 -502 481 -546 481 -238 289 -256 217 -290 213 -234 223 -280 247 -250 251 -250 247 -280 219 -574 263 -268 199 -292 219 -250 279 -220 251 -250 249 -280 219 -252 249 -250 247 -248 279 -220 251 -250 249 -280 219 -252 249 -248 281 -220 251 -250 247 -250 247 -280 219 -250 249 -250 279 -220 251 -250 249 -248 247 -280 219 -252 249 -248 279 -222 251 -250 247 -280 219 -252 249 -250 503 -260 217 -498 257 -276 215 -278 503 -258 217 -500 269 -254 253 -254 255 -250 205 -264 281 -220 507 -256 247 -504 481 -272 253 -256 217 -290 213 -532 487 -480 511 -274 215 -292 217 -252 243 -236 257 -250 247 -280 219 -250 249 -250 215 -632 205 -272 261 -226 255 -250 249 -248 249 -278 219 -252 RAW_Data: 249 -248 279 -222 251 -250 247 -280 219 -252 249 -250 247 -248 279 -220 249 -252 247 -280 219 -252 249 -250 279 -222 251 -250 247 -248 249 -278 221 -250 249 -250 279 -220 251 -250 249 -280 219 -252 249 -250 247 -248 279 -220 505 -258 245 -504 227 -278 213 -274 501 -258 215 -530 227 -280 213 -276 247 -248 249 -248 247 -248 501 -258 249 -502 479 -272 253 -254 253 -256 249 -474 483 -514 483 -274 255 -254 255 -214 273 -260 223 -254 249 -248 215 -280 247 -252 249 -574 267 -238 263 -224 249 -280 219 -252 249 -250 279 -220 251 -250 249 -248 247 -280 219 -250 249 -250 279 -220 253 -250 247 -280 219 -252 249 -250 247 -248 279 -220 251 -250 247 -280 219 -252 249 -250 279 -220 253 -250 247 -248 249 -278 219 -252 249 -250 279 -220 251 -250 249 -280 477 -228 279 -500 257 -216 275 -214 531 -226 279 -500 225 -244 277 -214 277 -216 277 -278 219 -250 505 -260 217 -500 513 -274 251 -256 253 -218 247 -500 481 -546 479 -238 289 -218 255 -286 211 -270 223 -250 247 -250 249 -250 249 -280 219 -572 265 -268 199 -292 221 -248 281 -220 251 -250 247 -250 247 -280 219 -250 249 -250 279 -220 251 -250 249 -248 247 -280 219 -252 249 -248 279 -220 251 -250 249 -280 219 -252 249 -250 217 -278 279 -220 249 -250 249 -280 219 -252 249 -250 279 -220 253 -250 247 -248 247 -280 219 -252 505 -260 217 -532 225 -276 215 -278 503 -236 251 -504 247 -254 251 -280 201 -260 251 -248 247 -252 505 -258 215 -530 513 -238 253 -254 255 -254 213 -504 513 -514 477 -274 215 -290 219 -252 281 -204 259 -252 247 -248 247 -278 219 -250 249 -604 203 -272 229 -256 281 -220 251 -250 247 -280 219 -252 251 -248 281 -220 251 -250 247 -250 247 -280 217 -252 249 -250 279 -220 251 -250 249 -280 219 -252 249 -250 215 -280 277 -220 251 -250 249 -280 219 -252 249 -250 217 -278 247 -252 249 -250 249 -280 219 -252 249 -250 279 -220 507 -258 215 -530 227 -278 215 -276 499 -260 215 -530 225 -280 213 -276 215 -278 247 -248 249 -248 503 -260 249 -502 479 -258 243 -274 215 -274 247 -504 481 -512 477 -274 251 -256 253 -252 241 -230 253 -280 219 -252 249 -248 279 -220 251 -574 267 -238 263 -224 249 -282 219 -250 249 -250 217 -280 245 -252 251 -250 247 -280 219 -254 249 -248 281 -220 251 -250 249 -248 247 -280 219 -250 249 -250 279 -220 251 -250 249 -280 219 -252 249 -248 217 -280 277 -220 251 -250 249 -280 219 -252 249 -250 215 -280 279 -220 RAW_Data: 249 -250 535 -228 249 -502 257 -218 275 -216 497 -272 285 -466 243 -290 253 -212 271 -226 251 -280 219 -250 505 -228 245 -530 479 -272 253 -254 253 -220 283 -470 481 -516 515 -236 255 -254 253 -288 209 -268 223 -248 217 -278 247 -250 251 -250 247 -570 267 -238 231 -286 221 -254 249 -250 279 -220 251 -250 249 -280 219 -252 249 -250 217 -278 247 -252 251 -248 249 -280 219 -252 249 -250 279 -222 251 -250 247 -248 249 -278 219 -252 249 -248 281 -220 251 -248 249 -280 219 -252 249 -250 249 -248 247 -252 249 -250 249 -280 219 -252 505 -228 247 -530 227 -246 273 -246 505 -228 245 -530 255 -216 275 -214 275 -248 247 -250 247 -250 503 -258 217 -564 483 -238 251 -256 253 -254 215 -504 515 -514 475 -258 213 -274 243 -276 213 -276 245 -248 247 -248 247 -280 219 -250 249 -604 203 -272 229 -256 281 -220 251 -250 247 -280 221 -252 249 -250 215 -280 277 -220 251 -250 249 -280 219 -252 249 -250 215 -280 279 -218 251 -250 249 -280 219 -252 249 -250 279 -220 251 -250 249 -248 247 -280 219 -252 249 -248 279 -220 253 -250 247 -280 219 -252 249 -250 217 -280 503 -258 217 -532 225 -280 213 -278 501 -258 217 -496 257 -276 215 -278 215 -278 247 -250 249 -250 469 -292 245 -504 481 -272 251 -254 217 -292 247 -474 485 -512 481 -274 253 -254 255 -252 239 -230 255 -280 219 -250 249 -248 217 -278 279 -544 269 -238 265 -224 251 -248 249 -278 219 -252 249 -250 279 -220 251 -250 247 -280 219 -252 249 -250 217 -280 247 -252 249 -250 249 -280 219 -252 249 -250 247 -248 279 -220 249 -250 249 -280 219 -252 249 -250 279 -220 251 -250 249 -248 247 -280 219 -250 249 -250 279 -220 251 -250 535 -228 249 -504 237 -250 291 -218 491 -264 265 -498 193 -280 247 -248 249 -248 249 -248 247 -278 477 -230 277 -500 479 -272 215 -292 253 -256 247 -472 481 -514 515 -236 291 -218 255 -252 239 -262 225 -252 249 -250 279 -220 249 -250 249 -570 267 -238 231 -286 221 -254 249 -250 279 -220 251 -250 249 -248 247 -280 219 -250 249 -250 279 -220 253 -250 247 -280 219 -252 249 -250 247 -248 279 -220 251 -248 249 -280 221 -252 249 -248 247 -248 279 -220 251 -250 249 -280 219 -252 249 -250 279 -220 251 -250 249 -248 247 -280 477 -228 277 -500 257 -216 275 -246 505 -226 247 -530 257 -214 275 -216 275 -246 249 -250 247 -250 503 -258 217 -498 541 -228 245 -244 243 -278 247 -500 511 -516 479 -238 253 -292 217 -252 209 -266 281 -222 RAW_Data: 249 -250 249 -248 247 -278 219 -606 239 -238 231 -258 249 -248 247 -250 251 -250 249 -280 219 -252 249 -250 279 -220 251 -250 249 -248 247 -280 219 -250 249 -250 279 -220 251 -250 249 -280 219 -252 249 -250 217 -278 279 -220 251 -250 249 -278 221 -250 249 -250 279 -222 251 -250 247 -248 249 -278 219 -252 249 -250 503 -260 217 -498 257 -276 215 -278 501 -258 217 -498 257 -276 215 -278 215 -278 215 -278 247 -250 505 -258 245 -506 479 -308 215 -254 219 -290 213 -534 487 -482 479 -288 213 -274 243 -246 275 -214 275 -216 277 -278 217 -250 247 -248 279 -546 235 -268 259 -226 253 -250 249 -280 219 -252 249 -250 247 -248 279 -220 251 -250 249 -280 219 -252 249 -248 281 -220 251 -250 249 -248 247 -280 219 -252 249 -248 279 -220 251 -250 249 -280 219 -252 249 -250 247 -248 279 -218 251 -250 249 -280 219 -252 249 -250 279 -220 251 -250 471 -292 245 -502 227 -276 245 -248 467 -308 215 -504 243 -290 217 -244 265 -228 253 -250 247 -280 477 -228 279 -500 479 -272 251 -256 253 -254 249 -472 483 -514 479 -256 275 -244 243 -246 243 -276 215 -278 215 -276 247 -250 249 -250 249 -570 267 -236 231 -286 221 -254 249 -250 217 -278 279 -220 251 -250 247 -280 221 -252 249 -248 247 -248 279 -220 251 -250 247 -280 219 -254 249 -248 279 -222 251 -250 247 -250 247 -280 219 -250 249 -250 279 -220 251 -250 249 -280 219 -252 249 -250 215 -280 279 -220 249 -250 249 -280 477 -228 277 -502 255 -216 275 -216 531 -228 279 -500 257 -216 275 -214 277 -246 249 -250 247 -250 503 -260 215 -500 541 -226 245 -246 243 -246 275 -500 477 -548 477 -236 255 -290 217 -254 245 -234 221 -282 247 -250 249 -250 249 -280 219 -572 265 -266 199 -292 221 -248 281 -220 251 -250 249 -278 221 -252 249 -250 247 -248 279 -220 249 -250 249 -280 219 -252 249 -250 279 -220 251 -250 249 -248 247 -280 219 -252 249 -250 279 -220 249 -250 249 -248 249 -278 219 -252 249 -250 279 -220 251 -250 249 -280 219 -252 249 -250 503 -260 217 -498 257 -276 215 -278 503 -258 217 -498 257 -244 243 -278 215 -278 217 -278 245 -252 505 -258 247 -506 479 -272 255 -254 217 -292 211 -532 485 -480 509 -274 217 -290 219 -252 243 -236 259 -250 247 -280 219 -250 249 -250 217 -630 205 -272 261 -226 255 -252 247 -248 247 -280 219 -250 249 -250 279 -220 251 -250 249 -280 219 -252 249 -250 217 -278 279 -220 251 -250 247 -280 219 -252 249 -250 279 -220 251 -250 RAW_Data: 249 -248 247 -280 219 -252 249 -248 279 -222 251 -250 247 -250 247 -280 217 -252 249 -250 279 -220 507 -258 247 -504 225 -278 213 -274 501 -258 215 -530 225 -280 213 -276 247 -248 249 -248 249 -246 501 -260 249 -502 479 -272 251 -254 255 -254 249 -476 481 -514 483 -274 253 -256 253 -250 239 -230 251 -280 219 -252 247 -250 279 -220 251 -572 269 -236 265 -222 251 -280 219 -252 249 -250 277 -222 251 -250 247 -250 247 -280 217 -252 249 -250 279 -220 251 -250 249 -280 219 -252 249 -250 215 -280 279 -220 251 -250 247 -280 219 -252 249 -250 279 -220 251 -250 249 -248 247 -280 219 -252 249 -248 279 -220 251 -252 247 -248 503 -258 249 -502 257 -216 277 -214 531 -228 279 -502 237 -254 253 -256 253 -216 271 -260 223 -254 505 -260 217 -500 513 -274 251 -256 253 -218 247 -498 483 -546 479 -238 289 -220 253 -288 209 -268 223 -250 247 -252 249 -250 249 -278 219 -574 265 -268 199 -292 219 -250 279 -220 251 -250 249 -248 247 -280 219 -252 249 -248 279 -222 251 -250 247 -248 249 -278 219 -252 249 -250 279 -220 251 -250 249 -278 221 -252 249 -250 215 -280 279 -220 249 -250 249 -280 219 -252 249 -250 279 -220 251 -250 249 -248 247 -280 219 -252 505 -258 219 -498 257 -276 215 -278 503 -238 249 -504 245 -254 253 -280 203 -260 219 -280 215 -278 503 -260 215 -532 515 -238 253 -254 255 -254 213 -506 511 -516 477 -272 215 -292 217 -254 279 -204 261 -250 249 -246 247 -278 219 -252 249 -602 205 -272 229 -256 281 -220 249 -250 249 -280 219 -252 249 -250 279 -220 251 -250 249 -248 247 -280 219 -252 249 -248 281 -220 249 -250 249 -248 247 -280 219 -252 249 -250 279 -220 251 -250 249 -280 219 -250 249 -250 217 -280 247 -252 249 -250 249 -280 219 -252 249 -248 281 -220 507 -258 215 -530 227 -280 213 -276 499 -258 215 -532 225 -280 213 -276 215 -276 247 -250 249 -248 503 -258 251 -502 479 -272 251 -254 219 -290 247 -474 515 -482 481 -274 253 -256 253 -252 239 -230 253 -280 219 -252 247 -250 279 -220 251 -572 269 -236 263 -224 251 -280 219 -252 249 -250 215 -280 279 -220 249 -250 249 -280 219 -252 249 -250 279 -220 251 -250 249 -248 247 -280 219 -250 249 -250 279 -220 251 -250 249 -248 247 -280 219 -252 249 -248 279 -220 253 -250 247 -280 219 -252 249 -250 217 -280 247 -250 251 -250 535 -226 251 -502 257 -216 277 -216 497 -272 287 -464 245 -288 253 -212 271 -224 251 -280 219 -250 507 -228 247 -528 RAW_Data: 477 -274 251 -254 255 -218 283 -472 481 -516 515 -236 255 -254 255 -250 245 -266 223 -250 217 -278 245 -252 249 -250 249 -570 267 -238 229 -288 221 -254 249 -250 279 -220 251 -250 247 -280 221 -252 249 -248 217 -278 279 -220 251 -250 247 -282 219 -252 249 -250 277 -222 251 -250 247 -250 247 -280 219 -250 249 -250 279 -220 251 -250 249 -280 219 -252 249 -250 217 -278 247 -252 251 -250 247 -280 219 -252 507 -228 247 -530 255 -216 275 -246 503 -228 245 -530 257 -214 275 -216 275 -246 249 -248 249 -248 503 -260 217 -532 515 -238 253 -254 253 -256 213 -506 511 -516 477 -272 215 -292 217 -254 245 -234 255 -252 249 -250 249 -278 219 -252 249 -602 205 -272 229 -256 281 -220 251 -250 249 -248 249 -278 219 -252 249 -250 279 -220 249 -250 249 -280 219 -254 249 -248 217 -280 277 -220 251 -250 247 -280 221 -252 249 -250 279 -220 251 -250 249 -248 247 -280 219 -250 249 -250 279 -220 251 -250 247 -280 221 -252 249 -248 249 -248 503 -258 217 -532 227 -280 213 -278 499 -258 215 -500 271 -288 217 -254 255 -248 241 -234 259 -250 469 -306 249 -464 501 -280 215 -284 207 -262 251 -508 515 -480 481 -274 253 -254 253 -254 241 -230 253 -282 219 -250 249 -248 217 -278 247 -576 269 -240 265 -222 251 -248 249 -278 219 -252 249 -248 279 -220 251 -250 249 -248 249 -278 219 -252 249 -248 281 -220 249 -250 249 -280 219 -252 249 -250 217 -280 247 -250 251 -250 247 -280 219 -254 249 -248 281 -220 251 -250 249 -248 247 -280 219 -250 249 -250 279 -220 251 -250 535 -228 249 -502 225 -246 275 -248 465 -290 245 -504 225 -276 245 -246 247 -248 247 -246 247 -278 477 -228 279 -500 477 -274 251 -254 255 -254 247 -474 483 -514 515 -238 253 -256 253 -250 239 -262 223 -254 249 -250 279 -220 249 -250 249 -570 267 -238 229 -288 221 -254 249 -250 279 -220 251 -250 249 -248 247 -280 219 -250 249 -250 279 -220 251 -250 249 -280 219 -252 249 -250 217 -278 247 -252 249 -250 249 -280 219 -252 249 -250 217 -278 279 -220 251 -248 249 -280 221 -252 249 -250 279 -220 251 -250 249 -248 247 -280 477 -228 277 -500 257 -216 275 -246 505 -228 245 -530 257 -214 275 -216 275 -246 249 -250 247 -250 503 -258 217 -498 543 -226 243 -246 243 -278 247 -500 479 -546 477 -238 255 -290 217 -252 245 -232 283 -222 249 -250 249 -248 247 -280 217 -608 239 -238 229 -256 219 -280 247 -250 251 -250 247 -280 219 -254 249 -248 281 -220 251 -250 RAW_Data: 247 -250 247 -280 219 -250 249 -250 279 -220 251 -250 249 -280 219 -252 249 -250 215 -280 247 -252 249 -250 249 -280 219 -252 249 -250 217 -278 279 -220 251 -250 247 -280 219 -252 249 -250 505 -258 217 -500 255 -278 215 -278 501 -260 215 -498 257 -276 215 -278 215 -278 215 -278 247 -252 505 -258 245 -504 481 -272 251 -254 217 -292 213 -532 485 -480 511 -274 215 -292 217 -252 243 -236 259 -250 249 -278 219 -252 249 -248 279 -546 235 -268 259 -226 255 -250 249 -278 221 -250 249 -250 215 -280 279 -220 251 -250 247 -280 219 -254 249 -248 281 -220 251 -250 249 -248 247 -280 219 -250 249 -250 279 -220 251 -250 249 -280 219 -252 249 -250 215 -280 247 -252 249 -250 249 -280 219 -252 249 -250 279 -220 251 -250 471 -288 247 -502 227 -276 245 -248 469 -292 213 -530 225 -278 213 -276 245 -250 247 -248 249 -278 477 -228 279 -500 477 -256 245 -242 277 -246 247 -502 479 -512 475 -274 291 -218 255 -250 241 -262 223 -254 249 -250 247 -252 249 -250 249 -570 267 -238 231 -286 221 -254 251 -248 217 -278 247 -252 251 -250 247 -280 219 -252 249 -250 217 -278 247 -252 251 -250 247 -280 221 -252 249 -248 279 -220 253 -250 247 -248 249 -278 219 -252 249 -250 279 -220 251 -250 247 -280 221 -252 249 -248 217 -280 247 -250 251 -250 249 -280 477 -228 279 -500 257 -214 275 -216 529 -228 279 -500 257 -216 275 -216 275 -216 277 -278 219 -250 505 -258 217 -500 547 -238 251 -254 255 -218 245 -502 481 -544 479 -236 291 -254 217 -292 213 -268 221 -250 247 -252 249 -250 249 -280 219 -572 265 -268 199 -292 219 -250 279 -222 251 -250 247 -282 219 -252 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/roger.sub ================================================ Filetype: Flipper SubGhz Key File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: Roger Bit: 28 Key: 00 00 00 00 05 AB A1 01 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/roger_raw.sub ================================================ Filetype: Flipper SubGhz RAW File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: RAW RAW_Data: 22710 -100 52363 -100 323 -66 1865 -66 32843 -66 753 -100 461 -100 19881 -66 16113 -66 20557 -66 6287 -64 25981 -100 587 -66 24707 -66 2367 -66 4681 -66 291 -98 4567 -100 1001 -100 33935 -66 20561 -100 5745 -66 2563 -66 4245 -66 22121 -66 1517 -100 2895 -66 15919 -66 20885 -100 12513 -890 839 -458 415 -914 843 -452 837 -482 387 -928 849 -446 415 -900 843 -474 415 -902 843 -470 841 -470 843 -468 383 -914 845 -460 415 -914 409 -884 423 -902 411 -902 835 -482 411 -880 423 -902 411 -908 397 -898 405 -920 411 -880 441 -896 835 -8268 411 -888 877 -430 415 -908 841 -460 869 -434 413 -920 845 -458 415 -912 845 -454 409 -884 879 -452 869 -428 873 -434 413 -904 871 -434 413 -918 415 -874 441 -882 425 -900 835 -448 443 -880 423 -904 409 -902 409 -904 409 -910 399 -896 417 -894 851 -8248 421 -912 853 -446 427 -872 863 -444 867 -446 441 -876 867 -456 415 -882 879 -452 419 -880 853 -448 881 -450 835 -460 415 -918 845 -454 409 -884 419 -906 411 -910 397 -898 865 -446 453 -860 421 -884 453 -876 415 -876 447 -878 441 -880 437 -882 861 -8216 457 -882 853 -456 405 -884 889 -420 879 -448 413 -890 873 -432 443 -892 841 -456 409 -922 843 -458 841 -460 873 -432 413 -918 843 -456 409 -918 387 -906 409 -912 427 -870 863 -446 439 -874 437 -888 409 -880 439 -898 419 -888 421 -880 453 -876 843 -8232 449 -874 891 -418 451 -878 865 -454 849 -448 413 -902 843 -474 411 -888 877 -432 413 -920 843 -454 869 -432 875 -432 413 -920 845 -458 415 -884 421 -910 395 -900 439 -888 839 -454 451 -880 419 -878 449 -876 415 -876 445 -878 439 -880 435 -870 867 -8246 423 -888 849 -454 445 -880 863 -418 879 -446 413 -896 875 -444 411 -902 873 -442 411 -904 839 -472 837 -472 837 -474 413 -874 871 -438 443 -892 415 -874 441 -878 439 -878 867 -454 417 -882 425 -908 399 -896 419 -896 419 -882 453 -876 413 -878 871 -8228 451 -876 853 -442 437 -904 841 -450 855 -450 449 -886 839 -474 411 -890 843 -460 415 -886 879 -456 843 -458 875 -428 409 -906 869 -436 413 -920 417 -884 423 -874 435 -892 857 -456 417 -880 453 -876 413 -910 413 -878 439 -870 439 -872 439 -870 871 -8248 421 -892 851 -454 445 -880 861 -452 843 -448 413 -896 877 -444 413 -898 853 -450 417 -898 877 -446 841 -474 839 -472 411 -892 843 -460 409 -918 417 -882 423 -872 435 -896 869 -418 453 -888 421 -878 451 -876 415 -876 443 -878 441 -876 437 -882 861 -8236 423 -878 883 -454 401 -884 RAW_Data: 857 -450 881 -446 413 -888 873 -434 415 -906 875 -428 411 -904 869 -434 873 -438 875 -436 413 -906 869 -434 413 -906 411 -904 411 -906 415 -908 835 -460 411 -906 409 -904 411 -908 417 -874 411 -910 415 -914 421 -884 849 -8232 453 -870 853 -440 439 -902 841 -450 885 -452 413 -870 861 -452 447 -862 877 -446 411 -900 877 -444 839 -474 839 -472 411 -902 841 -470 409 -890 415 -882 421 -910 425 -872 863 -446 451 -866 417 -906 417 -906 419 -868 451 -870 415 -900 413 -904 841 -8244 439 -886 855 -456 415 -908 853 -444 861 -452 421 -886 851 -452 447 -860 877 -448 413 -898 875 -444 873 -442 837 -474 409 -904 839 -472 409 -870 441 -898 421 -886 413 -890 873 -434 443 -890 417 -882 423 -876 433 -896 417 -894 421 -880 453 -876 843 -8254 435 -870 865 -448 409 -904 869 -454 843 -458 415 -912 843 -456 409 -914 835 -458 409 -920 841 -456 867 -432 873 -434 443 -888 845 -460 415 -910 417 -882 425 -872 435 -892 867 -448 407 -898 409 -902 417 -898 419 -880 453 -874 415 -908 413 -878 871 -8236 417 -904 845 -454 451 -880 863 -420 881 -448 413 -902 841 -476 411 -892 873 -430 415 -918 843 -456 875 -426 869 -434 443 -890 841 -458 409 -920 415 -882 425 -870 439 -904 835 -450 421 -912 427 -872 437 -888 419 -888 421 -882 453 -876 413 -880 871 -8234 457 -848 881 -444 435 -880 867 -450 847 -448 415 -920 841 -470 411 -888 845 -460 415 -916 847 -454 835 -460 871 -466 381 -920 843 -458 409 -916 417 -878 411 -912 425 -870 887 -418 445 -878 419 -914 419 -876 415 -908 413 -876 443 -880 441 -880 863 -8232 423 -880 881 -454 401 -904 865 -450 847 -446 415 -898 875 -444 411 -902 839 -476 411 -902 839 -474 837 -472 839 -472 411 -888 875 -430 415 -908 415 -908 409 -882 421 -904 837 -450 421 -910 425 -872 451 -868 419 -882 451 -874 413 -906 413 -902 843 -8256 419 -892 851 -472 405 -906 837 -480 821 -482 417 -904 823 -482 387 -918 843 -472 413 -884 845 -462 875 -432 875 -468 381 -916 843 -460 415 -914 387 -908 395 -938 399 -892 863 -444 409 -902 405 -918 409 -898 407 -920 411 -878 417 -918 417 -880 839 -8254 439 -898 837 -448 411 -906 869 -454 845 -460 415 -882 881 -450 409 -914 845 -452 409 -914 843 -456 843 -458 843 -462 415 -914 843 -456 413 -912 387 -910 423 -908 415 -870 873 -460 413 -910 381 -906 411 -906 409 -906 411 -904 411 -904 411 -904 839 -8254 409 -882 865 -446 439 -874 889 -418 873 -458 417 -878 885 -454 RAW_Data: 403 -884 857 -482 385 -918 843 -474 843 -468 839 -470 411 -906 837 -468 411 -904 379 -904 413 -900 415 -918 841 -474 381 -918 417 -912 385 -912 395 -900 451 -866 419 -918 417 -878 843 -8274 397 -896 865 -446 411 -904 871 -452 845 -458 417 -874 869 -458 415 -882 879 -454 417 -882 881 -448 837 -458 869 -432 413 -906 869 -434 413 -906 411 -904 411 -904 411 -904 869 -432 415 -916 387 -910 425 -908 415 -868 415 -908 415 -906 415 -876 879 -8236 409 -912 837 -454 451 -882 845 -452 875 -452 417 -890 849 -446 415 -896 877 -446 411 -900 841 -474 841 -470 839 -472 411 -904 839 -472 413 -886 415 -916 387 -904 411 -908 853 -448 409 -912 395 -900 435 -892 409 -916 407 -896 411 -912 409 -894 835 -8258 411 -890 871 -436 445 -888 841 -462 873 -430 413 -920 843 -456 409 -906 869 -430 415 -920 843 -454 869 -432 873 -434 413 -906 865 -470 411 -888 409 -884 449 -882 419 -890 845 -486 411 -870 437 -874 439 -870 439 -902 409 -902 409 -902 409 -902 839 -8252 405 -896 865 -446 441 -876 869 -454 845 -458 415 -882 879 -454 417 -882 879 -418 441 -882 881 -450 845 -456 867 -432 413 -906 869 -432 411 -906 409 -920 415 -884 425 -872 893 -412 439 -912 399 -892 409 -902 417 -900 421 -880 451 -878 413 -876 877 -8222 457 -886 845 -440 441 -880 869 -450 849 -450 415 -922 839 -472 411 -890 841 -462 413 -884 879 -452 869 -432 873 -434 413 -920 843 -458 409 -886 419 -912 417 -880 453 -882 847 -454 443 -880 399 -882 433 -884 427 -916 399 -886 429 -884 429 -886 853 -8258 423 -878 879 -454 403 -884 859 -452 877 -446 413 -888 873 -434 445 -890 843 -460 413 -884 879 -456 845 -458 867 -430 415 -920 843 -454 409 -920 385 -912 427 -872 435 -890 855 -456 419 -878 453 -876 415 -878 445 -878 439 -878 439 -880 401 -914 861 -8224 419 -906 845 -470 407 -902 841 -450 887 -418 451 -884 841 -474 413 -888 875 -432 413 -908 843 -460 867 -434 873 -436 443 -874 869 -436 443 -874 411 -920 415 -884 425 -874 893 -412 435 -894 441 -870 451 -862 419 -880 453 -876 417 -910 413 -878 869 -8234 457 -848 879 -456 403 -902 865 -452 847 -448 413 -896 877 -444 411 -900 873 -444 411 -902 841 -474 841 -472 839 -472 411 -890 845 -462 413 -884 421 -912 425 -872 437 -888 871 -418 445 -878 419 -914 419 -878 415 -910 413 -876 443 -880 439 -880 863 -8226 419 -904 841 -472 417 -872 879 -442 861 -450 423 -884 857 -450 451 -858 879 -448 411 -898 875 -444 RAW_Data: 841 -474 837 -474 411 -902 839 -472 411 -902 411 -904 409 -872 443 -898 845 -448 415 -900 413 -898 425 -886 425 -888 425 -886 425 -886 423 -898 863 -8226 451 -872 877 -434 409 -904 873 -416 891 -420 453 -886 841 -474 411 -888 873 -430 413 -908 843 -460 869 -432 873 -436 445 -874 869 -436 443 -890 415 -884 423 -902 409 -904 867 -418 419 -912 425 -872 435 -894 409 -914 407 -898 411 -880 447 -880 851 -8230 457 -868 879 -452 417 -868 869 -452 849 -450 449 -858 877 -448 411 -896 877 -444 413 -900 875 -446 841 -438 875 -438 445 -890 845 -460 415 -882 421 -912 395 -898 439 -870 867 -450 425 -910 399 -894 405 -920 413 -878 419 -914 419 -878 415 -910 843 -8232 457 -886 845 -442 439 -876 869 -454 855 -448 415 -886 875 -438 443 -876 875 -434 413 -904 871 -432 873 -434 873 -436 445 -874 869 -436 413 -920 417 -880 423 -902 411 -904 867 -418 421 -912 427 -868 437 -890 409 -916 413 -876 419 -914 417 -876 879 -8234 423 -888 843 -456 449 -880 863 -420 881 -448 413 -902 843 -476 413 -888 877 -430 413 -886 877 -454 867 -432 873 -434 413 -918 845 -460 415 -882 423 -908 397 -898 437 -890 855 -426 447 -874 453 -876 415 -878 447 -878 441 -878 437 -880 435 -880 859 -8212 457 -884 847 -454 445 -880 863 -420 881 -448 411 -902 875 -442 411 -902 839 -474 411 -888 875 -430 875 -432 875 -432 413 -922 843 -458 417 -884 421 -910 397 -898 453 -864 879 -454 415 -878 439 -878 435 -880 435 -882 395 -902 437 -868 437 -870 871 -8244 421 -894 845 -470 409 -908 843 -456 857 -448 415 -890 871 -436 445 -890 843 -460 415 -882 881 -452 869 -428 867 -436 443 -888 841 -460 409 -918 417 -882 453 -844 447 -876 853 -454 449 -880 435 -878 403 -916 397 -914 397 -884 431 -884 429 -884 889 -8228 425 -878 879 -422 435 -886 855 -452 877 -448 413 -888 877 -432 413 -886 877 -454 409 -886 891 -446 855 -444 867 -456 415 -882 851 -448 439 -884 425 -902 409 -874 435 -892 867 -444 409 -910 427 -872 437 -888 411 -880 439 -892 419 -890 421 -878 879 -8234 421 -894 881 -434 409 -902 841 -456 859 -450 415 -900 885 -420 451 -886 839 -472 411 -900 847 -448 877 -446 841 -474 411 -890 845 -460 415 -884 421 -906 409 -912 397 -898 889 -420 447 -876 421 -880 455 -880 411 -878 443 -878 439 -880 435 -882 861 -8210 437 -896 865 -442 407 -908 867 -452 845 -458 415 -912 843 -454 409 -884 879 -452 407 -908 867 -432 873 -432 873 -432 415 -904 869 -434 RAW_Data: 415 -904 411 -906 409 -906 409 -906 869 -430 415 -908 415 -880 439 -876 411 -906 411 -912 395 -898 437 -890 851 -8232 443 -890 845 -460 415 -884 879 -454 843 -458 415 -884 879 -454 409 -884 879 -448 409 -884 879 -454 841 -458 869 -432 413 -904 869 -434 413 -906 411 -904 409 -908 417 -882 881 -450 409 -880 441 -876 411 -910 425 -109718 133 -700 197 -334 133 -132 133 -166 131 -134 167 -200 427 -234 1129 -132 923 -100 22805 -66 22225 -66 655 -64 24395 -98 5203 -98 15817 -66 5793 -98 819 -98 4477 -66 12519 -68 64793 -66 425 -100 3651 -66 10365 -66 2361 -100 697 -66 13695 -100 15599 -66 1829 -100 21103 -66 40353 -64 1751 -98 14265 -132 54383 -66 2653 -98 13411 -66 15223 -66 8943 -892 857 -432 443 -876 843 -480 857 -452 421 -882 843 -474 413 -886 879 -432 415 -916 845 -454 837 -464 875 -432 415 -914 845 -458 411 -914 389 -908 427 -874 433 -894 867 -450 409 -898 409 -916 409 -896 417 -888 417 -880 449 -876 413 -908 839 -8254 415 -896 853 -470 407 -880 875 -450 853 -450 415 -920 843 -470 411 -872 869 -470 413 -888 843 -462 875 -430 875 -432 415 -918 847 -458 417 -880 425 -908 415 -904 407 -896 835 -456 443 -878 419 -882 449 -878 413 -908 413 -876 441 -876 439 -878 867 -8218 457 -886 845 -452 445 -876 865 -450 847 -450 417 -900 877 -444 413 -870 871 -440 441 -870 873 -438 873 -440 873 -438 443 -870 881 -446 417 -902 413 -902 417 -870 429 -886 891 -416 387 -978 355 -964 353 -930 387 -938 353 -942 385 -940 383 -912 845 -8258 421 -876 879 -422 469 -848 893 -420 843 -506 353 -944 813 -502 383 -912 849 -460 419 -904 837 -460 871 -466 843 -466 381 -900 875 -446 419 -912 383 -934 383 -914 415 -886 843 -462 411 -904 417 -916 417 -882 383 -964 343 -986 307 -982 345 -980 767 -8306 375 -934 839 -484 377 -932 837 -458 839 -466 407 -910 841 -478 395 -916 861 -446 421 -886 851 -448 877 -446 809 -536 353 -962 779 -502 385 -930 383 -936 387 -926 385 -926 815 -474 417 -914 381 -914 417 -912 419 -882 397 -900 405 -918 409 -898 861 -8248 437 -878 861 -450 419 -886 851 -448 877 -444 413 -884 873 -472 411 -886 845 -460 411 -916 847 -454 871 -430 877 -434 415 -916 845 -460 417 -880 423 -904 411 -908 399 -898 853 -454 415 -914 415 -882 415 -908 411 -910 409 -880 439 -878 435 -872 867 -8234 451 -864 875 -428 443 -876 875 -454 865 -482 355 -926 819 -504 355 -940 813 -504 385 -944 815 -488 819 -486 807 -492 387 -934 841 -458 RAW_Data: 413 -914 389 -904 393 -932 411 -906 825 -480 381 -930 413 -908 413 -866 413 -914 415 -884 449 -876 411 -912 803 -8306 381 -934 827 -480 381 -932 709 -24288 131 -15484 407 -916 799 -514 373 -914 829 -500 793 -510 393 -910 855 -448 387 -912 881 -444 383 -948 789 -524 791 -524 825 -490 375 -936 811 -456 407 -920 411 -918 373 -946 373 -920 831 -478 399 -918 395 -916 395 -914 395 -914 427 -882 431 -880 397 -918 893 -8186 479 -826 881 -438 265 -5122 99 -604 291 -990 785 -540 321 -958 815 -504 813 -472 849 -440 411 -916 845 -450 437 -900 411 -888 415 -916 413 -884 841 -478 393 -916 431 -882 431 -878 431 -878 431 -872 437 -876 437 -876 863 -8226 451 -890 849 -488 369 -920 825 -478 819 -510 385 -912 845 -470 383 -908 845 -476 415 -884 845 -464 877 -432 875 -436 417 -914 843 -460 417 -906 411 -880 425 -908 397 -900 849 -454 417 -914 417 -878 415 -910 411 -912 407 -878 439 -878 439 -876 865 -8228 437 -894 853 -428 449 -878 881 -442 857 -454 423 -888 883 -418 415 -890 875 -438 445 -888 845 -456 869 -432 875 -436 445 -868 869 -438 445 -878 447 -870 409 -886 451 -874 865 -420 441 -886 421 -912 429 -870 441 -854 455 -852 455 -878 451 -840 907 -8212 437 -876 857 -456 415 -918 845 -454 867 -450 417 -886 853 -446 413 -920 843 -440 441 -872 871 -438 871 -472 839 -472 411 -888 843 -464 415 -904 409 -910 417 -876 409 -912 853 -446 411 -906 411 -910 427 -870 453 -866 415 -910 419 -878 449 -876 843 -8242 453 -868 873 -450 415 -880 867 -446 849 -484 383 -918 843 -474 409 -906 841 -470 411 -886 843 -464 875 -432 875 -434 415 -914 845 -458 417 -884 423 -902 411 -906 397 -898 867 -446 409 -906 407 -918 407 -898 409 -900 409 -918 407 -898 417 -888 845 -8236 453 -872 849 -486 411 -872 871 -446 853 -482 417 -890 847 -446 413 -896 875 -446 413 -900 851 -448 875 -444 875 -442 413 -898 841 -474 411 -902 411 -902 411 -904 413 -886 843 -462 417 -906 417 -882 423 -906 397 -900 407 -922 417 -890 419 -880 875 -8242 407 -904 867 -420 421 -906 869 -456 835 -462 409 -918 843 -460 409 -884 879 -452 411 -906 835 -462 869 -434 873 -438 445 -870 871 -438 413 -920 417 -878 423 -902 409 -906 857 -448 429 -872 437 -892 419 -892 419 -880 451 -874 413 -878 441 -868 873 -8250 421 -890 853 -438 439 -878 873 -452 855 -450 415 -888 873 -438 445 -888 843 -462 415 -882 883 -452 835 -462 869 -434 415 -918 843 -458 409 -908 417 -874 RAW_Data: 439 -874 441 -876 869 -454 409 -908 415 -880 443 -880 427 -872 437 -894 409 -882 449 -878 877 -8236 415 -878 881 -452 411 -880 883 -450 837 -460 411 -916 847 -456 409 -914 845 -456 419 -880 851 -452 881 -452 837 -460 413 -914 843 -458 411 -916 387 -910 425 -906 415 -868 875 -460 415 -878 415 -908 413 -910 409 -878 439 -878 437 -880 437 -880 863 -8226 449 -878 853 -452 443 -878 861 -450 847 -450 415 -920 841 -438 445 -888 843 -462 415 -882 879 -454 867 -432 875 -432 415 -916 845 -460 417 -880 423 -904 409 -912 397 -900 867 -448 419 -890 419 -882 451 -876 415 -912 409 -880 439 -880 435 -872 867 -8242 409 -914 835 -442 451 -870 875 -460 845 -440 437 -902 839 -446 425 -904 863 -452 423 -888 851 -448 879 -444 845 -474 413 -886 843 -462 417 -916 387 -912 427 -872 451 -870 877 -432 441 -872 445 -872 411 -904 411 -904 409 -906 409 -904 411 -902 839 -8242 453 -866 877 -450 413 -874 871 -448 851 -484 383 -920 843 -472 413 -888 845 -462 415 -882 881 -452 837 -460 871 -436 413 -920 845 -460 415 -882 423 -902 411 -910 395 -902 861 -444 441 -874 437 -894 413 -882 419 -912 419 -880 415 -908 413 -880 869 -8228 457 -884 845 -442 435 -878 871 -452 853 -450 415 -896 881 -444 413 -904 841 -474 411 -884 879 -430 875 -432 875 -434 415 -904 869 -432 445 -888 417 -876 411 -906 411 -904 867 -452 411 -906 409 -882 421 -910 397 -900 451 -864 419 -882 449 -878 873 -8238 421 -890 843 -452 447 -878 865 -450 847 -450 415 -894 881 -444 413 -902 841 -474 413 -890 841 -462 869 -436 873 -436 415 -918 845 -462 409 -904 409 -916 387 -912 427 -872 863 -446 441 -872 451 -866 419 -912 419 -880 413 -908 413 -876 443 -880 867 -8224 447 -880 879 -430 445 -876 877 -422 859 -452 449 -860 875 -448 415 -898 851 -450 417 -894 875 -448 877 -446 841 -440 443 -890 877 -428 409 -904 411 -884 453 -880 425 -872 861 -446 441 -874 453 -866 415 -908 419 -880 451 -876 415 -876 443 -878 869 -8224 455 -884 843 -468 407 -906 841 -448 887 -448 417 -892 849 -448 415 -918 839 -472 413 -886 875 -432 845 -462 873 -432 411 -906 873 -434 415 -920 417 -880 425 -904 399 -898 865 -450 407 -902 415 -894 419 -912 417 -878 413 -908 413 -910 409 -878 869 -8234 449 -874 877 -450 413 -872 869 -448 883 -448 413 -872 889 -450 417 -890 847 -448 415 -920 841 -438 877 -436 875 -436 441 -874 873 -434 441 -872 441 -868 451 -884 413 -900 839 -476 413 -902 RAW_Data: 411 -886 417 -884 421 -910 397 -900 451 -864 415 -910 843 -8248 445 -858 879 -458 417 -882 881 -418 879 -454 409 -882 881 -452 411 -882 883 -418 443 -874 867 -458 871 -434 875 -434 415 -918 845 -460 417 -878 421 -908 427 -872 451 -864 879 -450 417 -880 439 -880 437 -878 435 -880 401 -914 429 -870 435 -870 867 -8252 411 -886 877 -430 447 -876 879 -414 887 -452 419 -886 851 -448 447 -860 877 -446 413 -896 877 -444 873 -444 871 -442 409 -902 839 -474 409 -900 411 -902 409 -900 411 -900 875 -442 411 -902 409 -902 409 -904 409 -900 421 -888 423 -888 423 -890 849 -8264 421 -878 877 -454 401 -884 857 -452 879 -446 411 -900 875 -444 411 -900 839 -474 411 -900 839 -474 839 -474 839 -472 409 -906 839 -472 411 -872 445 -888 417 -874 441 -882 851 -450 423 -912 427 -868 439 -888 411 -882 453 -884 419 -876 449 -874 841 -8238 453 -888 843 -470 407 -904 839 -446 887 -450 415 -904 825 -482 417 -890 849 -448 415 -898 877 -446 845 -474 843 -470 381 -918 845 -460 417 -882 421 -908 427 -872 451 -866 873 -444 413 -908 417 -878 449 -876 413 -908 411 -876 441 -876 439 -878 865 -8234 417 -906 851 -440 437 -904 839 -448 885 -448 419 -890 847 -446 415 -900 857 -450 417 -918 843 -474 841 -472 843 -468 383 -916 869 -430 411 -904 411 -904 411 -902 411 -904 869 -430 443 -870 411 -904 411 -904 411 -902 411 -904 411 -906 409 -906 837 -8266 413 -904 873 -414 453 -870 867 -450 883 -414 447 -860 875 -448 411 -888 873 -440 441 -874 875 -436 873 -436 871 -436 443 -874 875 -436 443 -890 415 -876 423 -910 395 -902 863 -448 441 -872 439 -888 421 -888 419 -880 451 -874 413 -910 411 -874 869 -8234 447 -876 875 -432 445 -874 877 -454 829 -450 449 -890 847 -446 413 -898 877 -444 411 -904 843 -472 841 -474 843 -470 413 -868 875 -436 445 -888 417 -880 423 -910 415 -874 877 -428 447 -876 449 -874 413 -910 411 -876 441 -878 439 -880 437 -878 863 -8232 417 -910 845 -470 405 -904 839 -478 855 -448 421 -882 845 -476 415 -884 875 -432 415 -916 845 -456 839 -464 875 -434 417 -914 845 -458 409 -916 387 -912 425 -906 399 -894 853 -456 413 -916 415 -880 413 -910 411 -912 409 -880 435 -874 437 -872 865 -8248 453 -866 879 -402 475 -842 907 -422 859 -450 415 -886 873 -438 443 -866 879 -446 415 -896 877 -446 873 -444 841 -474 411 -890 843 -462 415 -882 421 -912 427 -872 437 -892 857 -428 447 -880 449 -878 411 -904 409 -872 441 -872 RAW_Data: 441 -872 441 -872 871 -8252 413 -880 865 -446 439 -872 899 -416 867 -456 409 -904 869 -432 415 -886 877 -460 407 -904 867 -432 877 -434 875 -434 415 -916 845 -460 417 -882 423 -902 411 -902 411 -910 857 -444 411 -904 409 -904 411 -904 409 -902 411 -908 399 -894 407 -922 837 -8230 443 -902 873 -444 411 -898 871 -442 839 -442 443 -890 875 -432 415 -914 845 -456 409 -912 837 -462 845 -462 871 -432 415 -914 843 -462 409 -918 419 -878 409 -904 411 -902 869 -450 411 -880 423 -904 411 -904 409 -910 397 -896 407 -922 417 -890 851 -8226 463 -868 867 -448 415 -882 891 -420 879 -450 419 -886 851 -450 417 -920 839 -474 411 -890 877 -430 875 -432 877 -430 415 -904 869 -434 413 -906 409 -916 407 -906 409 -882 879 -418 443 -882 421 -912 397 -900 453 -862 421 -878 453 -874 449 -878 841 -8230 449 -876 879 -426 449 -876 881 -416 889 -418 447 -890 847 -450 449 -858 877 -446 413 -900 883 -418 879 -446 845 -474 409 -902 839 -474 409 -902 409 -900 411 -900 411 -888 873 -436 413 -920 417 -882 425 -870 453 -868 417 -906 415 -906 417 -874 875 -8238 425 -876 893 -418 445 -880 875 -440 877 -408 447 -874 877 -442 433 -870 871 -450 423 -882 889 -420 879 -446 877 -444 413 -900 839 -476 411 -888 415 -882 421 -912 429 -870 865 -446 453 -864 419 -882 449 -870 417 -910 411 -906 411 -904 407 -904 837 -8248 457 -864 875 -408 449 -874 881 -440 863 -454 427 -888 881 -416 417 -896 875 -446 413 -900 877 -444 841 -440 873 -440 445 -890 843 -460 415 -884 453 -880 429 -868 451 -866 875 -442 415 -874 449 -872 449 -872 447 -870 413 -902 413 -904 409 -904 873 -8206 449 -880 879 -452 415 -880 865 -450 845 -448 415 -894 875 -446 413 -902 853 -448 449 -858 877 -446 877 -444 875 -444 411 -888 877 -426 441 -874 409 -920 417 -880 425 -904 835 -448 441 -882 423 -904 407 -876 433 -900 409 -884 439 -896 411 -882 889 -8232 413 -886 867 -460 415 -884 881 -420 867 -462 415 -916 845 -454 409 -908 843 -460 409 -918 845 -454 869 -432 877 -432 413 -918 845 -460 417 -880 441 -880 451 -848 453 -888 851 -442 433 -880 439 -878 437 -880 435 -882 397 -902 435 -872 437 -874 869 -8244 441 -854 909 -420 415 -906 847 -440 877 -442 433 -870 871 -448 423 -882 891 -450 419 -886 851 -450 879 -446 843 -472 413 -872 875 -470 381 -918 417 -880 425 -906 399 -900 867 -448 409 -920 413 -880 417 -914 417 -878 415 -908 413 -880 439 -878 869 -8228 457 -852 RAW_Data: 883 -456 405 -882 889 -420 883 -448 415 -888 875 -434 445 -872 869 -436 443 -892 843 -458 869 -432 873 -434 445 -870 871 -436 445 -874 441 -886 415 -876 441 -882 885 -418 425 -902 409 -912 397 -898 419 -894 421 -882 451 -880 413 -876 875 -8222 447 -884 855 -452 449 -878 865 -454 849 -450 413 -902 875 -444 413 -888 875 -432 415 -908 843 -462 875 -430 867 -436 445 -890 843 -458 407 -888 451 -874 411 -906 409 -912 855 -448 429 -874 437 -892 413 -880 455 -880 419 -876 449 -878 413 -876 871 -8238 449 -876 879 -420 449 -878 863 -420 875 -448 413 -894 877 -446 413 -898 875 -444 411 -898 875 -444 839 -474 839 -474 409 -888 877 -432 415 -918 417 -880 411 -884 447 -880 877 -452 417 -876 439 -878 437 -878 437 -878 435 -878 435 -880 433 -848 893 -8224 457 -848 885 -456 437 -870 865 -420 879 -450 445 -862 877 -448 413 -890 873 -432 441 -876 869 -436 869 -438 867 -440 441 -900 847 -450 415 -900 413 -890 445 -890 417 -882 851 -450 421 -910 397 -900 439 -888 409 -886 453 -880 419 -880 449 -876 841 -8234 447 -878 891 -432 443 -876 843 -456 891 -418 415 -898 885 -420 451 -854 879 -450 413 -890 873 -438 875 -436 873 -436 443 -892 843 -458 409 -886 451 -874 439 -884 427 -872 891 -420 451 -852 453 -878 449 -842 445 -878 441 -880 439 -880 431 -870 869 -8242 435 -874 857 -458 413 -910 845 -440 865 -454 431 -884 887 -418 449 -886 841 -472 413 -888 877 -430 869 -434 875 -438 413 -918 843 -460 415 -906 409 -910 387 -912 425 -870 867 -450 425 -904 409 -904 411 -904 409 -908 415 -874 419 -914 417 -880 875 -8236 437 -884 855 -444 441 -880 853 -446 869 -446 429 -872 887 -418 447 -878 877 -430 445 -876 875 -420 895 -420 879 -448 413 -902 875 -444 411 -892 415 -884 421 -912 399 -900 867 -448 455 -860 423 -876 453 -872 449 -844 443 -870 443 -870 443 -870 873 -8232 451 -874 889 -402 441 -876 877 -456 853 -452 413 -896 877 -448 413 -890 875 -434 413 -884 879 -460 875 -426 869 -434 445 -892 845 -458 415 -886 423 -908 417 -872 455 -882 845 -440 433 -904 411 -878 443 -880 437 -882 435 -882 431 -870 433 -874 867 -8242 455 -862 879 -452 415 -880 867 -452 853 -448 415 -900 873 -446 411 -900 849 -450 415 -896 875 -446 873 -444 875 -410 443 -876 873 -436 443 -892 415 -884 451 -848 449 -878 879 -434 441 -870 447 -870 413 -902 411 -902 413 -870 445 -870 443 -900 839 -8242 453 -872 881 -452 413 -872 869 -448 849 -450 RAW_Data: 445 -870 889 -418 449 -892 847 -446 413 -896 879 -446 875 -442 843 -474 411 -888 845 -462 415 -884 423 -910 427 -870 451 -862 875 -428 443 -876 445 -872 413 -906 413 -904 411 -904 411 -904 409 -904 839 -8264 409 -884 887 -430 445 -876 843 -448 887 -450 417 -888 849 -448 449 -890 847 -446 413 -898 877 -444 871 -444 839 -474 411 -902 839 -474 409 -902 411 -900 409 -888 415 -884 881 -456 417 -882 423 -910 399 -898 419 -896 419 -880 453 -878 413 -878 875 -8236 449 -876 879 -434 441 -870 875 -414 889 -454 419 -890 845 -450 417 -886 871 -440 443 -868 879 -448 879 -444 843 -474 413 -888 845 -462 415 -882 421 -912 427 -872 437 -894 837 -454 449 -884 419 -880 415 -910 413 -878 443 -878 439 -880 437 -878 863 -8230 457 -848 879 -452 437 -872 865 -450 849 -450 415 -902 851 -450 417 -900 887 -418 451 -884 843 -474 839 -476 839 -472 411 -866 877 -448 415 -886 445 -888 417 -880 423 -910 853 -446 409 -912 395 -904 451 -866 415 -910 415 -874 449 -872 445 -874 873 -8212 455 -868 877 -428 445 -874 877 -446 863 -450 425 -882 843 -476 413 -904 839 -472 413 -888 875 -430 875 -432 875 -434 413 -904 873 -434 413 -904 411 -904 411 -916 417 -880 867 -456 409 -908 417 -876 409 -914 425 -872 451 -866 421 -882 415 -944 805 -8276 413 -900 839 -484 389 -908 855 -452 853 -450 425 -906 855 -450 395 -938 827 -448 435 -896 851 -456 841 -476 841 -468 407 -914 839 -452 429 -886 427 -884 427 -884 393 -982 757 -540 325 -992 357 -942 359 -942 355 -976 353 -944 353 -974 355 -942 813 -8292 405 -906 835 -450 431 -884 853 -480 847 -446 413 -886 875 -468 381 -920 845 -460 415 -916 845 -458 843 -458 869 -434 413 -920 843 -460 417 -878 411 -910 411 -908 427 -872 861 -446 441 -874 451 -866 419 -916 417 -878 415 -910 411 -880 443 -878 867 -8226 457 -882 851 -440 433 -904 837 -474 835 -446 427 -916 857 -450 419 -888 849 -448 415 -918 843 -472 845 -470 843 -470 383 -900 871 -468 381 -916 415 -884 423 -908 397 -902 863 -450 439 -874 437 -890 413 -882 419 -882 453 -876 449 -844 445 -876 871 -8232 451 -876 853 -450 445 -880 863 -452 853 -448 415 -886 871 -438 441 -886 871 -432 439 -890 845 -458 843 -460 871 -468 379 -898 879 -444 415 -918 381 -918 417 -880 423 -906 853 -450 427 -902 409 -908 399 -894 417 -894 419 -912 419 -876 415 -910 843 -8250 407 -902 851 -454 445 -878 841 -484 843 -452 427 -886 851 -482 385 -916 843 -472 RAW_Data: 413 -886 843 -464 843 -466 845 -466 415 -916 847 -458 417 -880 425 -906 413 -100576 129 -4900 97 -1286 555 -132 65 -198 361 -132 98215 -96 21029 -64 5709 -66 22509 -98 23929 -66 4017 -66 687 -98 1353 -66 3641 -66 1391 -64 565 -66 40435 -102 51423 -66 10357 -66 10493 -98 5979 -66 22915 -100 1281 -100 62401 -66 26927 -66 20563 -100 4151 -100 12369 -66 45939 -858 863 -446 437 -894 853 -458 845 -452 449 -878 863 -454 421 -888 849 -448 415 -886 875 -470 841 -470 839 -472 411 -888 843 -464 415 -910 419 -880 425 -872 437 -894 871 -416 449 -882 419 -880 453 -876 415 -906 413 -876 443 -876 441 -878 865 -8230 457 -850 879 -440 449 -872 875 -438 873 -422 433 -882 887 -422 451 -854 875 -440 443 -892 845 -460 875 -428 871 -436 413 -906 869 -434 443 -868 449 -890 419 -884 413 -888 875 -434 415 -916 415 -876 411 -908 411 -910 427 -870 437 -894 409 -882 871 -8250 409 -900 875 -444 411 -888 875 -434 873 -434 445 -864 877 -446 415 -900 873 -446 411 -888 873 -434 871 -436 873 -436 445 -892 841 -458 409 -886 451 -882 453 -844 451 -874 845 -486 415 -878 439 -880 435 -880 401 -914 399 -914 399 -914 397 -904 863 -8224 457 -882 845 -452 441 -872 865 -450 847 -450 417 -918 841 -472 413 -888 841 -464 413 -910 845 -460 875 -432 877 -432 413 -908 843 -460 409 -918 417 -884 425 -874 435 -894 853 -456 417 -880 451 -876 413 -912 411 -904 411 -880 435 -872 439 -872 871 -8244 409 -916 835 -446 439 -904 837 -448 869 -456 411 -906 869 -430 415 -918 845 -458 415 -876 867 -460 875 -430 875 -432 415 -904 869 -434 413 -904 411 -904 409 -906 409 -906 867 -432 413 -906 409 -918 417 -882 425 -870 439 -872 439 -872 439 -904 865 -8220 439 -868 871 -450 423 -884 857 -450 881 -446 413 -902 843 -474 411 -888 877 -430 415 -908 843 -460 869 -434 871 -436 445 -874 869 -436 443 -876 409 -906 409 -906 409 -906 871 -432 415 -916 417 -882 425 -908 399 -896 409 -916 409 -896 411 -880 887 -8232 449 -844 867 -446 439 -872 893 -412 895 -446 429 -868 855 -456 451 -884 845 -442 435 -878 869 -454 853 -448 881 -444 413 -890 875 -432 413 -918 409 -874 441 -876 441 -878 867 -456 415 -882 423 -910 397 -900 437 -888 413 -880 455 -880 419 -876 877 -8238 421 -890 843 -488 413 -880 863 -450 847 -446 415 -892 879 -448 411 -898 875 -444 413 -900 841 -476 843 -472 841 -470 413 -888 843 -464 415 -906 409 -884 421 -908 397 -900 885 -420 445 -880 417 -914 419 -876 RAW_Data: 415 -910 411 -880 441 -880 435 -872 867 -8254 421 -890 843 -444 445 -874 875 -442 865 -452 427 -890 849 -448 415 -918 841 -472 411 -886 841 -462 871 -434 873 -470 379 -920 843 -458 409 -900 413 -918 413 -886 415 -884 879 -452 409 -906 409 -884 421 -912 395 -900 437 -888 411 -880 441 -896 873 -8228 411 -902 843 -476 411 -888 877 -428 869 -434 415 -916 843 -460 415 -882 869 -458 409 -904 873 -432 875 -436 873 -436 413 -908 875 -430 413 -906 409 -886 419 -914 427 -872 889 -420 451 -882 419 -878 451 -876 415 -876 443 -878 439 -876 437 -878 869 -8228 421 -918 845 -452 403 -904 865 -444 853 -446 417 -924 847 -446 415 -920 839 -468 411 -904 841 -468 839 -468 839 -472 411 -902 841 -470 411 -904 411 -872 413 -902 413 -902 877 -434 411 -900 413 -906 411 -900 415 -916 379 -936 381 -916 415 -908 835 -8254 419 -910 841 -450 423 -884 855 -452 879 -448 417 -900 849 -448 415 -920 841 -472 411 -874 869 -438 871 -472 839 -470 411 -872 869 -440 445 -874 441 -866 449 -884 413 -888 875 -432 413 -906 409 -906 409 -906 409 -886 421 -908 427 -872 451 -866 875 -8236 415 -882 871 -460 417 -880 881 -454 845 -456 417 -880 879 -452 409 -884 881 -452 409 -880 881 -450 837 -462 871 -434 415 -914 845 -458 413 -916 387 -910 427 -904 401 -894 867 -450 411 -884 413 -908 419 -912 417 -876 415 -908 413 -910 409 -878 865 -8234 455 -882 843 -452 445 -880 859 -450 847 -446 415 -894 877 -444 415 -896 879 -444 413 -902 841 -472 841 -472 841 -472 411 -890 845 -462 415 -908 417 -876 411 -908 409 -912 851 -450 425 -908 399 -894 407 -904 437 -888 411 -880 447 -876 419 -880 881 -8238 439 -888 837 -456 451 -880 851 -452 871 -420 449 -892 845 -448 413 -894 879 -446 411 -900 875 -444 839 -474 837 -474 409 -904 839 -472 409 -902 411 -902 409 -904 409 -904 839 -472 409 -904 409 -872 443 -872 443 -890 417 -882 423 -910 417 -874 875 -8220 441 -904 841 -468 411 -904 841 -470 841 -470 413 -886 843 -462 417 -906 843 -458 411 -918 843 -456 869 -432 875 -434 415 -916 845 -456 411 -916 417 -876 411 -912 425 -870 889 -418 445 -882 421 -880 449 -878 415 -910 413 -878 441 -878 439 -880 865 -8230 417 -906 843 -468 407 -906 839 -478 857 -450 423 -884 843 -474 413 -886 877 -432 415 -916 845 -458 845 -460 871 -432 415 -916 845 -458 417 -916 387 -908 427 -870 437 -892 851 -458 415 -882 451 -876 413 -912 413 -878 439 -878 441 -880 435 -878 RAW_Data: 863 -8240 423 -888 841 -486 415 -878 869 -452 849 -448 415 -920 841 -470 381 -920 845 -460 415 -910 843 -454 869 -432 873 -434 415 -904 869 -436 413 -920 417 -876 441 -880 425 -908 857 -444 409 -910 399 -898 417 -894 419 -882 451 -874 415 -908 413 -878 873 -8254 405 -898 853 -458 417 -914 847 -452 865 -452 421 -884 845 -474 413 -886 873 -430 411 -904 873 -432 871 -470 837 -470 413 -886 843 -460 413 -918 417 -874 413 -906 411 -910 851 -446 411 -914 425 -872 451 -866 417 -916 419 -878 415 -910 413 -878 871 -8228 455 -884 845 -452 445 -880 863 -450 851 -446 413 -920 841 -470 409 -874 873 -468 409 -872 873 -470 843 -470 839 -470 381 -918 843 -462 415 -912 411 -880 423 -906 397 -900 865 -446 419 -894 419 -912 419 -878 413 -910 411 -910 409 -880 441 -878 865 -8254 413 -878 877 -430 445 -880 841 -458 863 -452 415 -920 841 -438 415 -908 871 -434 413 -914 845 -458 871 -466 841 -470 413 -884 843 -460 409 -920 417 -880 425 -872 435 -894 867 -448 407 -902 409 -916 407 -896 407 -902 409 -886 439 -898 411 -880 875 -8248 411 -900 843 -476 413 -886 873 -432 875 -434 413 -918 843 -460 411 -916 845 -454 411 -918 845 -456 845 -460 841 -462 411 -916 843 -456 411 -916 417 -880 425 -908 399 -896 851 -456 415 -916 417 -880 415 -908 413 -880 439 -870 439 -904 407 -874 871 -8238 439 -868 869 -448 411 -906 869 -454 837 -460 411 -916 843 -458 411 -916 843 -456 409 -906 871 -432 873 -434 875 -434 413 -918 845 -458 411 -916 387 -910 425 -908 415 -870 875 -428 447 -880 415 -908 413 -880 439 -872 439 -872 441 -872 439 -872 871 -8246 419 -896 847 -486 413 -882 865 -448 849 -446 415 -928 845 -446 415 -886 875 -468 381 -916 843 -460 843 -464 877 -432 413 -916 843 -458 411 -916 385 -906 411 -910 425 -906 823 -478 411 -902 411 -904 411 -906 397 -898 407 -918 411 -880 417 -916 847 -8236 435 -892 867 -448 397 -898 869 -448 869 -456 417 -906 837 -460 415 -914 847 -456 387 -908 849 -482 837 -458 871 -430 415 -914 847 -458 411 -916 385 -902 411 -910 423 -904 839 -450 423 -910 395 -900 405 -922 417 -888 417 -912 417 -876 415 -910 841 -8264 421 -890 843 -452 445 -880 863 -448 849 -448 417 -918 841 -470 413 -886 871 -430 411 -904 873 -466 837 -470 841 -468 411 -904 839 -470 411 -902 411 -902 381 -918 417 -906 839 -460 415 -914 389 -908 427 -870 437 -892 409 -916 407 -896 409 -916 853 -8234 425 -906 825 -480 401 -894 RAW_Data: 865 -450 851 -456 415 -918 845 -454 405 -902 865 -448 421 -902 829 -482 847 -446 875 -444 413 -898 845 -474 413 -902 411 -904 413 -904 383 -914 843 -462 411 -914 417 -880 423 -906 397 -900 405 -922 417 -890 417 -882 879 -8232 409 -904 871 -434 411 -904 871 -466 839 -470 381 -932 845 -446 415 -918 839 -470 381 -916 843 -460 873 -466 841 -468 381 -916 841 -460 413 -916 387 -910 423 -908 397 -896 869 -448 427 -906 399 -894 415 -894 417 -912 417 -880 415 -908 411 -882 869 -8228 455 -888 845 -452 409 -916 861 -450 847 -446 415 -896 877 -444 413 -902 853 -448 415 -894 879 -444 841 -476 843 -472 415 -902 839 -472 381 -914 417 -914 387 -910 395 -938 825 -446 437 -894 417 -892 417 -914 415 -876 413 -910 411 -910 409 -910 835 -8232 447 -878 853 -452 451 -880 863 -450 847 -448 413 -920 839 -472 411 -888 877 -430 415 -916 843 -456 843 -460 867 -436 443 -874 869 -436 443 -890 415 -884 421 -904 407 -912 855 -444 409 -906 409 -912 397 -898 439 -890 411 -880 453 -880 421 -872 879 -8246 417 -876 849 -482 411 -880 883 -450 837 -458 411 -916 847 -456 411 -916 847 -454 409 -916 845 -452 835 -462 875 -432 413 -916 843 -460 411 -912 409 -906 411 -878 421 -910 855 -446 411 -910 425 -872 435 -892 409 -918 413 -880 419 -880 451 -880 843 -8264 421 -890 843 -486 411 -872 867 -448 851 -448 417 -926 847 -444 415 -896 875 -442 415 -900 851 -448 877 -444 843 -476 415 -888 843 -462 415 -916 387 -910 425 -908 399 -894 867 -444 411 -908 395 -902 435 -894 417 -892 417 -882 451 -878 413 -878 871 -8250 405 -900 867 -448 409 -910 853 -446 869 -454 411 -914 845 -456 417 -880 881 -448 411 -880 881 -452 837 -460 873 -434 413 -916 845 -460 415 -882 421 -910 395 -902 437 -888 853 -458 415 -882 449 -878 413 -912 411 -880 439 -880 437 -878 435 -880 865 -8224 455 -884 843 -442 437 -878 869 -452 855 -448 415 -920 839 -472 413 -886 845 -462 417 -914 847 -454 869 -426 873 -434 415 -916 843 -460 409 -918 415 -882 425 -906 399 -896 865 -448 407 -902 439 -890 411 -880 417 -916 417 -878 417 -908 413 -880 873 -8230 457 -886 849 -452 407 -906 863 -450 849 -446 415 -894 877 -446 413 -898 877 -442 413 -904 839 -474 843 -472 843 -470 381 -918 843 -462 417 -914 387 -910 427 -872 435 -892 869 -450 407 -896 409 -900 407 -918 407 -896 409 -900 407 -918 407 -898 855 -8234 443 -892 845 -460 415 -916 845 -454 835 -462 417 -912 837 -460 RAW_Data: 411 -916 843 -458 417 -914 845 -454 835 -462 871 -468 381 -914 871 -430 415 -918 387 -910 425 -906 399 -896 849 -474 407 -896 409 -902 407 -918 407 -898 409 -916 409 -894 409 -884 875 -8230 443 -874 873 -434 413 -920 841 -460 871 -432 413 -918 847 -456 411 -904 871 -430 415 -916 845 -458 845 -460 875 -432 415 -916 843 -456 411 -916 387 -910 425 -908 415 -870 851 -486 411 -872 439 -870 441 -872 439 -904 409 -878 439 -878 437 -878 865 -8230 455 -882 845 -442 437 -878 869 -452 855 -448 415 -920 843 -470 381 -918 845 -460 415 -912 845 -454 869 -432 873 -434 415 -916 845 -458 411 -914 387 -910 425 -902 411 -902 835 -450 441 -880 425 -902 411 -908 397 -894 409 -902 435 -890 419 -892 843 -8266 395 -900 865 -446 439 -890 835 -474 867 -442 409 -910 853 -446 411 -912 851 -450 425 -902 837 -448 869 -458 841 -462 411 -916 843 -456 411 -916 387 -910 425 -908 399 -896 855 -458 415 -914 419 -876 415 -912 411 -880 439 -878 437 -882 401 -912 865 -8226 419 -910 843 -452 447 -880 863 -452 849 -446 413 -898 875 -444 413 -900 875 -442 411 -904 841 -472 841 -472 839 -472 411 -890 843 -460 409 -906 409 -920 417 -880 425 -874 889 -418 445 -880 421 -880 453 -880 413 -910 413 -880 439 -878 437 -878 863 -8238 417 -904 843 -470 405 -902 841 -478 859 -448 421 -890 849 -448 415 -918 841 -472 413 -886 843 -462 869 -468 841 -470 381 -916 845 -460 411 -918 387 -910 425 -906 399 -894 851 -456 415 -916 417 -880 415 -910 411 -912 405 -904 409 -904 407 -904 839 -8246 441 -886 855 -430 449 -878 879 -416 889 -450 415 -900 861 -420 449 -868 889 -418 453 -886 841 -474 839 -472 843 -470 411 -898 845 -450 415 -898 413 -886 445 -874 441 -890 841 -458 409 -898 413 -920 411 -872 441 -890 415 -884 421 -910 397 -902 853 -8254 415 -898 879 -444 413 -904 841 -472 841 -472 413 -886 841 -462 411 -916 843 -458 409 -916 845 -458 841 -462 869 -436 413 -904 869 -470 379 -920 417 -876 421 -908 425 -872 889 -418 451 -884 419 -880 449 -874 415 -908 411 -878 443 -880 435 -872 865 -8226 455 -886 845 -450 445 -880 863 -452 853 -444 415 -918 841 -470 381 -916 845 -462 415 -914 845 -456 837 -460 871 -470 381 -916 843 -460 411 -914 417 -880 423 -902 409 -904 837 -484 389 -910 427 -904 399 -896 407 -916 409 -892 409 -918 409 -896 835 -8254 413 -896 879 -444 413 -900 843 -474 841 -472 411 -902 841 -472 409 -904 839 -472 411 -902 843 -468 RAW_Data: 839 -472 843 -472 381 -916 843 -462 415 -918 387 -910 427 -870 435 -894 851 -456 415 -914 419 -880 413 -912 411 -880 441 -878 439 -880 401 -914 865 -8224 417 -908 843 -468 407 -904 839 -480 857 -448 421 -886 853 -448 417 -918 841 -472 413 -886 845 -462 867 -466 841 -470 381 -918 847 -460 415 -914 409 -878 413 -908 427 -906 825 -446 441 -902 409 -902 411 -908 397 -894 409 -900 417 -898 419 -914 843 -8246 425 -872 861 -480 399 -898 865 -448 867 -452 411 -880 881 -452 409 -908 845 -456 409 -914 835 -462 873 -432 877 -432 415 -904 869 -434 413 -916 417 -874 441 -880 411 -910 853 -448 411 -912 425 -872 451 -868 419 -914 419 -878 415 -908 411 -910 841 -8226 455 -886 843 -452 449 -878 863 -452 855 -446 415 -886 877 -434 415 -916 843 -462 415 -882 881 -454 845 -460 845 -460 411 -916 845 -456 411 -916 387 -910 425 -872 449 -870 875 -430 445 -880 413 -910 413 -878 441 -868 441 -872 441 -872 441 -902 841 -8246 421 -892 853 -452 443 -872 867 -448 849 -450 415 -926 847 -446 413 -898 877 -444 413 -900 845 -472 839 -470 839 -474 409 -902 843 -470 411 -872 445 -874 411 -904 411 -906 875 -432 413 -908 417 -884 423 -910 399 -898 407 -922 411 -880 445 -878 851 -8250 423 -904 857 -448 397 -902 853 -454 881 -430 443 -878 843 -478 431 -880 867 -450 423 -888 849 -448 843 -476 845 -474 413 -906 843 -470 381 -904 415 -914 417 -880 423 -902 837 -484 411 -878 425 -906 399 -896 405 -922 411 -916 381 -910 415 -910 841 -8232 453 -870 875 -430 447 -878 875 -442 841 -478 397 -912 861 -450 423 -886 845 -474 413 -906 841 -470 843 -470 839 -470 381 -916 843 -462 411 -918 387 -910 425 -902 411 -908 851 -450 411 -882 419 -914 417 -880 415 -908 415 -910 411 -878 439 -878 865 -8232 455 -882 845 -452 443 -880 861 -452 849 -448 417 -902 843 -474 413 -888 873 -430 411 -904 871 -434 869 -470 839 -472 409 -904 839 -470 413 -888 417 -906 411 -874 441 -876 869 -456 409 -886 419 -912 425 -870 451 -866 417 -908 415 -906 415 -872 877 -8248 407 -906 853 -446 411 -906 869 -452 847 -458 417 -880 883 -452 387 -912 851 -450 423 -906 853 -448 223 -124912 1217 -330 99 -132 163 -66 2031 -64 59635 -66 2765 -98 26085 -98 4367 -100 563 -66 24625 -66 1849 -66 10545 -68 21363 -66 15231 -100 42927 -100 3021 -66 55509 -100 4287 -66 2435 -98 1017 -132 3371 -66 11541 -100 1265 -100 799 -66 1859 -68 3385 -66 965 -100 2221 -100 2355 -68 6165 -66 1025 -100 RAW_Data: 899 -66 173525 -166 2373 -68 397 -66 40101 -66 1891 -66 10969 -132 2617 -66 20187 -66 10559 -100 10491 -98 35135 -66 2287 -68 2649 -66 3393 -98 12375 -100 1265 -100 5605 -66 9997 -68 435 -132 16583 -100 3003 -66 10083 -64 13329 -66 64855 -100 13269 -132 10773 -100 4673 -17250 97 -1358 297 -164 165 -132 199 -66 199 -66 165 -664 65 -98 265 -66 201 -132 531 -132 235 -66 3355 -68 2757 -98 16517 -66 12659 -66 3773 -66 26419 -66 12433 -66 531 -100 20227 -66 1851 -66 11499 -64 10717 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/scher_khan_magic_code.sub ================================================ Filetype: Flipper SubGhz RAW File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: RAW RAW_Data: 95 -240 191 -412 187 -152 95 -120 263 -220 373 -116 199 -88 239 -334 503 -142 167 -174 85 -172 143 -86 85 -96 119 -196 259 -96 167 -148 201 -96 481 -120 237 -264 143 -144 105 -790 257 -88 243 -144 143 -86 553 -216 103 -174 143 -142 119 -144 119 -224 307 -144 239 -120 127 -390 189 -168 119 -312 191 -142 215 -96 103 -86 307 -274 191 -104 143 -96 167 -120 357 -390 651 -218 197 -170 143 -164 85 -210 143 -116 143 -86 255 -160 95 -114 199 -88 545 -288 173 -114 115 -202 85 -316 145 -144 113 -562 105 -254 85 -144 287 -116 115 -202 87 -346 287 -244 103 -370 143 -230 143 -144 85 -88 113 -230 231 -984 119 -144 171 -144 201 -174 115 -288 113 -192 277 -114 345 -202 249 -316 83 -228 119 -146 151 -116 85 -202 85 -144 437 -272 115 -144 85 -86 173 -142 163 -260 205 -280 339 -88 229 -194 363 -144 585 -394 599 -144 85 -100 151 -574 171 -174 85 -114 239 -288 211 -410 115 -144 489 -116 115 -116 201 -336 95 -96 93 -120 95 -128 115 -116 257 -174 141 -292 113 -162 165 -192 287 -192 161 -192 1125 -202 85 -222 461 -144 113 -116 115 -114 201 -288 259 -288 401 -174 85 -106 119 -96 431 -130 85 -114 375 -494 95 -96 167 -288 281 -104 411 -214 335 -144 119 -534 85 -144 143 -144 229 -246 97 -82 85 -260 201 -304 403 -116 391 -172 229 -448 81 -82 95 -116 201 -86 521 -144 119 -336 119 -142 95 -144 119 -96 267 -170 283 -288 95 -190 167 -288 199 -116 247 -144 87 -144 85 -114 215 -260 115 -116 113 -338 103 -240 167 -96 119 -120 95 -96 405 -188 85 -116 191 -334 143 -164 85 -230 115 -154 119 -166 143 -288 195 -144 87 -86 343 -232 113 -202 115 -86 201 -278 201 -86 85 -86 303 -286 95 -120 95 -168 167 -118 129 -94 95 -432 151 -218 119 -186 235 -230 167 -632 143 -144 231 -156 153 -282 147 -96 143 -592 261 -120 191 -96 167 -576 333 -342 171 -462 173 -514 157 -432 87 -312 397 -378 287 -374 403 -230 117 -264 257 -170 189 -346 137 -528 117 -240 805 -454 539 -288 171 -86 173 -286 153 -288 115 -172 173 -158 399 -114 85 -116 201 -116 85 -216 215 -432 113 -100 113 -338 123 -146 289 -86 143 -114 343 -94 95 -96 311 -110 171 -86 143 -88 969 -312 119 -316 401 -134 255 -202 323 -86 87 -114 253 -228 95 -172 85 -170 165 -86 343 -192 119 -144 213 -112 191 -334 287 -96 359 -500 137 -120 261 -242 119 -118 283 -210 167 -178 287 -174 343 -268 RAW_Data: 185 -96 119 -978 215 -120 213 -96 265 -172 261 -168 225 -462 307 -312 87 -172 115 -288 423 -84 87 -230 143 -404 109 -114 233 -216 165 -240 95 -288 95 -192 215 -238 335 -116 199 -170 135 -144 109 -408 285 -130 97 -98 115 -86 85 -86 87 -120 167 -144 119 -264 171 -316 231 -202 257 -274 115 -114 421 -86 85 -202 143 -144 201 -86 229 -86 143 -116 115 -86 115 -114 85 -202 143 -288 163 -186 483 -202 167 -212 373 -288 115 -86 171 -116 113 -230 231 -230 201 -172 171 -318 113 -390 101 -200 317 -404 287 -220 171 -232 199 -490 171 -144 173 -168 223 -202 173 -200 115 -172 119 -288 209 -220 85 -86 85 -480 423 -450 201 -364 411 -216 143 -120 219 -538 513 -330 199 -120 119 -96 127 -138 141 -140 117 -312 429 -182 259 -422 1027 -280 303 -210 131 -168 85 -86 201 -230 547 -174 113 -88 259 -202 109 -96 215 -144 291 -168 151 -316 85 -258 287 -260 279 -302 171 -284 189 -168 95 -96 309 -240 167 -384 165 -96 169 -226 95 -216 271 -122 195 -102 113 -116 339 -168 85 -192 583 -114 297 -406 167 -326 209 -212 119 -262 143 -86 87 -114 125 -172 115 -172 173 -576 219 -192 335 -120 85 -116 171 -202 711 -116 85 -172 373 -232 381 -144 95 -244 173 -210 119 -198 85 -86 143 -312 211 -96 115 -86 113 -528 103 -150 191 -144 119 -98 333 -172 215 -114 87 -86 529 -490 85 -356 239 -374 143 -260 457 -312 157 -394 131 -116 353 -172 229 -490 171 -144 189 -166 305 -144 85 -288 201 -356 147 -106 167 -740 143 -312 95 -242 137 -88 465 -126 239 -358 167 -120 1385 -130 385 -192 95 -120 817 -218 805 -140 171 -394 143 -86 371 -430 143 -216 187 -84 143 -316 173 -86 115 -202 85 -114 215 -96 167 -316 107 -368 313 -120 95 -382 197 -216 289 -388 119 -264 109 -86 113 -202 963 -172 111 -104 113 -346 115 -266 255 -88 229 -202 109 -288 357 -348 365 -226 381 -144 455 -144 901 -532 531 -108 103 -142 225 -144 143 -230 85 -144 141 -142 645 -82 167 -116 143 -172 403 -230 85 -144 87 -288 229 -144 115 -144 371 -82 107 -306 333 -116 113 -88 143 -86 229 -174 617 -96 677 -286 95 -240 95 -168 141 -216 95 -212 209 -120 95 -144 95 -240 165 -116 765 -230 229 -88 141 -192 97 -86 111 -114 231 -172 143 -144 365 -96 291 -144 129 -144 87 -168 141 -120 215 -144 143 -238 215 -192 95 -96 95 -144 403 -216 163 -102 155 -120 95 -120 263 -120 403 -374 431 -230 303 -134 791 -288 RAW_Data: 201 -138 251 -262 95 -376 287 -230 143 -114 143 -144 259 -214 231 -238 167 -288 95 -166 119 -120 411 -144 143 -546 243 -260 143 -404 113 -450 137 -184 143 -230 375 -144 85 -230 129 -104 133 -112 171 -258 115 -316 259 -86 163 -96 95 -88 113 -350 167 -780 847 -174 143 -404 85 -314 109 -278 287 -86 101 -172 201 -258 115 -86 143 -144 115 -114 547 -86 423 -116 85 -144 507 -144 133 -518 85 -424 167 -246 143 -96 261 -192 109 -240 167 -240 117 -168 239 -192 85 -116 137 -264 143 -304 119 -96 191 -144 141 -264 95 -96 119 -144 95 -96 121 -478 229 -88 575 -230 85 -312 81 -102 103 -390 93 -96 119 -144 143 -238 215 -288 277 -96 115 -114 87 -288 113 -120 143 -114 261 -146 153 -116 335 -144 259 -136 85 -258 87 -144 85 -86 661 -86 161 -120 95 -110 191 -86 135 -408 103 -144 125 -192 119 -336 113 -86 173 -114 173 -216 335 -116 321 -186 559 -116 229 -316 115 -512 141 -168 191 -130 113 -120 143 -288 127 -174 215 -96 85 -318 1169 -174 85 -86 563 -146 315 -162 163 -96 339 -222 215 -230 229 -88 109 -218 493 -120 189 -264 253 -466 239 -240 157 -288 219 -268 309 -192 121 -156 241 -192 215 -144 95 -168 261 -86 397 -428 569 -88 411 -268 251 -168 167 -268 143 -288 453 -144 163 -86 115 -144 113 -296 81 -224 163 -458 171 -310 161 -88 85 -316 461 -508 201 -162 229 -114 145 -144 143 -86 143 -114 259 -144 345 -346 85 -124 143 -302 83 -116 113 -96 261 -84 297 -116 201 -240 143 -120 861 -144 117 -158 167 -96 215 -454 273 -304 239 -96 95 -204 189 -346 345 -286 545 -88 339 -104 171 -284 95 -360 239 -144 289 -96 95 -120 225 -106 197 -144 219 -208 145 -144 187 -282 95 -408 95 -338 187 -250 229 -86 115 -402 87 -86 143 -202 283 -98 329 -134 167 -88 229 -172 221 -138 169 -202 171 -196 111 -108 85 -144 479 -100 623 -212 133 -116 113 -144 403 -88 257 -462 287 -144 373 -210 239 -144 115 -172 289 -168 143 -98 119 -96 95 -96 357 -96 119 -216 143 -144 311 -192 95 -166 175 -416 351 -100 145 -94 119 -360 427 -94 95 -144 263 -144 115 -366 97 -98 95 -190 95 -264 541 -288 131 -140 85 -202 409 -226 229 -518 143 -202 363 -260 85 -86 269 -142 95 -120 215 -168 189 -208 239 -96 285 -456 129 -144 517 -114 589 -344 115 -288 235 -98 105 -282 109 -278 85 -312 171 -116 287 -316 87 -172 335 -430 119 -274 143 -164 229 -216 167 -232 343 -260 RAW_Data: 143 -86 565 -144 87 -460 115 -508 363 -86 143 -276 671 -144 115 -86 515 -116 199 -236 185 -140 143 -82 113 -116 85 -116 85 -408 95 -284 199 -88 315 -116 143 -114 717 -202 85 -86 173 -86 201 -144 333 -200 115 -86 85 -174 401 -174 263 -244 229 -86 143 -434 229 -202 231 -164 143 -86 165 -182 167 -172 85 -346 771 -252 81 -106 217 -96 119 -96 287 -140 85 -86 143 -374 143 -116 85 -114 83 -118 119 -164 201 -86 153 -166 359 -116 283 -86 187 -120 459 -280 201 -144 229 -258 143 -408 427 -144 373 -294 197 -120 287 -96 119 -264 143 -120 119 -528 95 -168 119 -192 117 -558 97 -148 143 -120 185 -188 167 -264 95 -176 215 -254 201 -258 263 -158 215 -168 119 -312 873 -388 95 -192 359 -278 341 -96 171 -116 143 -432 173 -316 403 -84 85 -144 113 -174 287 -346 243 -216 95 -394 161 -144 317 -200 199 -140 95 -86 143 -278 139 -86 143 -144 201 -114 191 -264 119 -238 163 -114 143 -766 143 -144 167 -604 349 -390 459 -86 201 -172 633 -114 549 -432 339 -114 201 -174 325 -220 287 -116 123 -264 137 -86 173 -336 171 -422 133 -144 661 -86 163 -96 93 -96 215 -168 105 -114 259 -238 115 -86 315 -86 229 -298 167 -168 319 -432 189 -336 167 -120 123 -250 95 -144 167 -346 97 -96 429 -86 517 -120 95 -480 85 -86 307 -84 109 -112 121 -136 227 -112 115 -114 85 -202 201 -230 201 -88 143 -144 229 -96 347 -172 143 -656 201 -508 199 -174 139 -192 171 -172 257 -86 223 -216 143 -144 215 -120 85 -264 185 -212 271 -112 85 -374 85 -116 113 -88 113 -174 431 -202 315 -264 87 -116 373 -336 201 -172 173 -374 201 -172 115 -114 115 -86 115 -86 489 -280 119 -86 115 -144 137 -144 253 -480 1225 -1598 631 -828 709 -782 689 -792 1063 -1152 1105 -1066 1141 -1076 761 -734 1125 -1090 761 -696 765 -698 817 -672 1183 -1012 1197 -1022 819 -686 775 -710 775 -680 835 -646 839 -646 1181 -1018 801 -710 1139 -1078 1151 -1066 813 -646 843 -644 843 -622 841 -650 1187 -1014 1205 -1018 825 -656 829 -652 1197 -1024 1197 -1016 1209 -990 1167 -1074 789 -676 1179 -1032 831 -644 839 -644 843 -650 813 -678 795 -684 769 -712 775 -708 777 -728 783 -676 817 -646 1205 -1006 1219 -998 845 -632 1189 -1044 1177 -980 1527 -1456 1483 -1440 1537 -1388 839 -672 817 -648 843 -676 1127 -1088 1177 -1022 1199 -1020 817 -648 1213 -1010 831 -624 833 -648 839 -646 1213 -1018 1191 -1022 815 -678 783 -710 779 -710 769 -684 773 -734 1115 -1078 785 -710 1147 -1068 RAW_Data: 1183 -992 855 -630 827 -664 839 -646 815 -644 1209 -1014 1191 -1050 765 -708 771 -738 1113 -1080 1181 -1006 1199 -1020 1185 -1042 815 -646 1181 -1032 827 -668 811 -670 815 -648 839 -676 769 -714 779 -710 773 -712 775 -708 777 -676 835 -644 1213 -1018 1143 -1078 763 -702 1177 -1008 1199 -994 1575 -1376 1525 -1428 1503 -1438 779 -718 817 -646 843 -650 1209 -1012 1179 -1024 1201 -1016 843 -644 1181 -1032 831 -622 831 -668 839 -644 1181 -1034 1197 -1024 811 -684 781 -712 771 -712 775 -680 775 -706 1177 -1024 807 -710 1137 -1076 1159 -1014 831 -652 835 -646 841 -646 839 -644 1183 -1040 1193 -996 837 -656 833 -686 1143 -1074 1161 -1016 1195 -1026 1185 -1012 831 -648 1207 -996 831 -684 771 -710 775 -702 809 -676 817 -646 817 -672 817 -672 817 -674 767 -734 771 -710 1137 -1076 1131 -1066 803 -642 1209 -1020 1197 -1018 1521 -1392 1549 -1416 1519 -1392 815 -670 841 -678 761 -736 1119 -1092 1155 -1018 1217 -1022 789 -702 1183 -1016 815 -648 815 -674 819 -648 1211 -1012 1199 -1022 833 -684 749 -712 769 -736 751 -678 829 -668 1179 -1016 797 -710 1139 -1078 1133 -1090 817 -644 819 -674 815 -676 789 -676 1153 -1064 1179 -1020 801 -712 773 -708 1141 -1076 1133 -1068 1187 -992 1197 -1046 793 -648 1209 -1012 829 -668 815 -674 819 -648 841 -674 761 -706 761 -732 767 -712 769 -712 777 -678 833 -648 1205 -1016 1161 -1074 817 -624 1207 -1006 1197 -996 1575 -1358 1573 -1386 1547 -1380 835 -686 775 -710 773 -704 1203 -996 1195 -1042 1187 -1018 831 -656 1195 -1026 811 -654 765 -736 771 -712 1139 -1078 1153 -1034 835 -646 817 -670 817 -650 841 -676 761 -704 1149 -1062 809 -646 1211 -1016 1191 -1024 839 -678 771 -710 775 -686 779 -712 1137 -1080 1129 -1040 835 -646 841 -646 1211 -1016 1193 -1022 1179 -1014 1197 -1022 835 -658 1143 -1068 817 -648 843 -674 765 -712 777 -712 769 -710 773 -704 781 -674 839 -648 845 -646 815 -674 1179 -1034 1201 -994 793 -714 1141 -1074 1159 -988 1557 -1404 1559 -1386 1509 -1438 809 -668 843 -674 813 -676 1135 -1070 1159 -1020 1169 -1072 817 -648 1207 -1012 839 -622 841 -646 843 -646 1179 -1034 1197 -1024 821 -686 749 -714 775 -710 775 -702 779 -694 1181 -1018 801 -708 1139 -1076 1127 -1088 811 -646 845 -646 841 -624 843 -650 1181 -1036 1203 -994 835 -658 829 -656 1191 -1050 1177 -1012 1179 -1000 1203 -1016 841 -646 1211 -1018 775 -710 777 -730 759 -702 815 -644 843 -646 817 -674 815 -678 785 -712 753 -734 773 -712 1115 -1076 1155 -1038 833 -648 1203 -994 1211 -1018 1519 -1388 1573 -1362 2045 -2332 103 -86 691 -116 229 -144 239 -120 135 -216 93 -202 315 -202 RAW_Data: 231 -432 229 -114 403 -116 569 -86 575 -404 133 -120 239 -96 95 -96 93 -240 95 -144 95 -96 95 -168 141 -250 431 -174 113 -116 401 -116 173 -144 143 -172 85 -230 115 -260 137 -96 129 -86 605 -172 257 -168 229 -314 113 -88 257 -466 197 -96 81 -330 139 -86 85 -260 277 -200 87 -202 229 -88 219 -168 109 -86 119 -96 143 -216 143 -364 523 -118 95 -120 225 -330 83 -170 115 -86 81 -302 125 -256 95 -144 117 -96 95 -96 119 -168 167 -386 173 -132 515 -232 277 -144 229 -376 229 -202 455 -262 175 -88 171 -174 85 -86 85 -508 143 -174 315 -130 105 -202 115 -114 173 -432 111 -144 221 -162 273 -118 143 -380 257 -356 315 -236 119 -124 325 -214 115 -530 193 -168 105 -86 109 -144 119 -352 93 -96 119 -216 387 -224 197 -120 463 -144 93 -1134 85 -86 259 -86 201 -192 173 -198 185 -144 307 -200 85 -116 115 -192 95 -104 143 -202 229 -120 285 -120 239 -144 143 -392 519 -296 95 -144 229 -202 85 -202 85 -116 95 -120 101 -200 119 -96 95 -96 95 -172 119 -142 143 -216 81 -316 119 -144 269 -286 167 -130 231 -324 221 -96 167 -240 119 -102 113 -116 143 -192 191 -288 143 -144 309 -114 187 -378 231 -172 171 -458 413 -430 201 -120 469 -94 143 -504 261 -96 95 -144 237 -120 455 -334 163 -116 191 -280 169 -288 99 -492 85 -458 141 -260 171 -244 713 -168 359 -96 195 -154 733 -168 119 -364 143 -88 171 -86 85 -116 339 -86 173 -334 359 -144 95 -540 95 -120 185 -144 317 -114 87 -86 113 -254 373 -86 345 -288 85 -96 151 -122 429 -202 113 -342 247 -202 139 -86 229 -172 143 -88 87 -296 755 -220 447 -330 259 -330 241 -118 95 -340 245 -194 239 -112 201 -200 367 -1020 431 -408 279 -120 95 -96 95 -166 95 -216 281 -116 549 -140 257 -166 157 -192 263 -186 95 -286 119 -170 287 -230 173 -258 343 -366 171 -144 143 -116 85 -86 115 -86 243 -422 319 -120 243 -86 115 -172 143 -116 259 -86 201 -202 257 -664 763 -356 289 -114 85 -86 113 -486 271 -144 229 -116 115 -122 423 -314 969 -144 171 -116 201 -230 101 -202 143 -200 317 -86 85 -116 85 -462 181 -172 115 -202 309 -114 287 -316 139 -430 157 -192 191 -84 137 -168 113 -116 259 -114 373 -86 201 -116 199 -88 85 -172 173 -86 169 -240 119 -174 85 -286 137 -200 143 -172 259 -244 147 -144 115 -116 201 -140 423 -172 85 -144 87 -200 87 -202 85 -86 345 -174 143 -202 315 -404 229 -144 141 -212 RAW_Data: 119 -114 231 -114 201 -318 431 -404 201 -82 167 -88 85 -114 81 -144 85 -202 85 -134 109 -144 461 -114 189 -354 171 -226 311 -152 115 -178 117 -360 239 -240 143 -286 143 -288 119 -268 315 -82 163 -196 173 -288 173 -192 215 -118 489 -88 143 -230 477 -110 459 -172 115 -172 403 -282 113 -116 143 -288 143 -172 139 -144 95 -214 167 -484 191 -444 95 -96 95 -202 117 -168 167 -120 325 -172 239 -202 229 -144 85 -404 115 -86 85 -528 143 -166 83 -172 403 -144 115 -144 507 -258 403 -156 171 -192 95 -120 293 -166 115 -86 547 -230 143 -192 315 -340 129 -84 229 -86 221 -202 143 -86 215 -178 85 -288 143 -164 141 -96 95 -144 287 -120 189 -216 143 -144 533 -192 85 -260 85 -86 115 -244 129 -134 229 -86 287 -174 171 -346 373 -86 229 -260 469 -100 83 -84 143 -118 95 -100 143 -116 431 -124 115 -114 345 -114 81 -314 199 -144 173 -192 95 -114 85 -88 171 -278 239 -288 171 -86 287 -202 201 -114 219 -336 199 -382 145 -144 121 -288 167 -240 299 -188 161 -96 117 -96 239 -120 213 -96 119 -336 127 -88 171 -390 163 -202 201 -216 119 -144 95 -144 157 -86 655 -206 699 -410 111 -126 135 -88 85 -172 115 -576 85 -116 85 -518 143 -86 87 -266 149 -120 129 -168 215 -110 167 -96 119 -168 95 -118 269 -306 201 -202 513 -96 99 -346 229 -288 115 -216 147 -172 173 -230 211 -124 87 -364 85 -172 259 -230 87 -114 143 -140 237 -88 85 -120 215 -238 95 -718 129 -214 167 -168 95 -262 665 -204 215 -418 97 -142 143 -288 95 -144 191 -168 301 -86 115 -202 113 -144 257 -116 173 -288 285 -198 85 -374 539 -244 119 -432 259 -400 175 -302 87 -402 259 -134 171 -88 113 -144 479 -202 85 -260 335 -266 131 -144 147 -144 143 -230 287 -144 231 -518 113 -144 143 -174 167 -172 201 -86 201 -230 171 -194 135 -86 345 -220 259 -144 85 -316 135 -406 191 -262 119 -96 113 -116 143 -144 143 -86 229 -260 115 -142 223 -318 85 -172 201 -86 373 -88 287 -490 105 -144 573 -116 695 -86 113 -82 209 -190 231 -172 605 -86 85 -646 143 -168 209 -168 153 -86 205 -144 143 -238 701 -262 163 -186 191 -96 197 -432 87 -114 341 -202 227 -120 335 -118 95 -240 191 -118 147 -144 87 -144 143 -172 115 -148 119 -130 345 -172 115 -358 493 -250 85 -172 167 -144 81 -548 143 -96 309 -282 159 -130 119 -96 95 -146 311 -86 191 -144 189 -120 155 -84 103 -96 165 -384 287 -120 527 -454 RAW_Data: 115 -138 349 -212 143 -116 143 -748 143 -148 95 -168 535 -164 403 -316 201 -144 85 -86 105 -120 95 -144 453 -106 167 -144 213 -192 365 -110 143 -96 119 -120 191 -88 229 -114 173 -144 95 -120 107 -462 173 -200 335 -266 377 -118 167 -568 85 -144 85 -318 247 -174 223 -288 123 -128 143 -336 399 -220 263 -192 161 -144 85 -116 257 -260 229 -174 143 -230 115 -172 115 -258 285 -172 143 -142 153 -432 143 -142 145 -96 267 -202 143 -120 95 -142 167 -116 143 -172 287 -116 171 -116 115 -230 315 -86 423 -360 95 -352 253 -96 407 -96 143 -478 311 -168 167 -164 85 -202 85 -202 85 -114 459 -202 421 -230 85 -174 85 -116 85 -86 85 -374 311 -302 171 -116 201 -172 575 -190 373 -116 403 -432 143 -202 115 -86 113 -290 167 -84 243 -172 345 -88 201 -200 113 -312 99 -112 155 -294 171 -430 239 -220 85 -336 95 -96 117 -144 215 -120 95 -144 287 -310 311 -374 85 -174 171 -86 133 -116 153 -102 143 -144 215 -250 85 -512 201 -116 267 -120 279 -356 213 -120 191 -110 335 -144 95 -216 191 -142 95 -216 119 -190 191 -96 95 -240 191 -164 333 -170 267 -120 95 -192 165 -158 229 -202 85 -144 259 -174 191 -116 113 -86 113 -258 173 -144 113 -174 257 -88 417 -110 169 -144 87 -114 173 -114 221 -94 105 -288 85 -88 85 -144 259 -214 149 -258 115 -86 85 -86 403 -192 95 -306 231 -144 113 -86 115 -200 115 -260 171 -236 95 -240 113 -312 197 -166 191 -168 95 -96 165 -96 167 -120 287 -138 339 -216 117 -98 105 -110 597 -144 359 -186 283 -96 261 -312 127 -140 113 -318 171 -174 143 -318 143 -200 345 -576 143 -116 143 -144 229 -316 143 -346 229 -786 85 -316 229 -244 339 -96 603 -304 173 -432 543 -84 111 -116 113 -466 103 -150 141 -88 381 -104 273 -98 215 -318 143 -100 87 -114 85 -174 201 -86 345 -144 521 -172 113 -86 85 -164 199 -174 85 -202 575 -114 87 -144 257 -146 199 -246 237 -274 329 -184 147 -96 311 -130 195 -312 93 -240 163 -140 141 -168 119 -168 455 -144 259 -202 85 -288 143 -174 113 -260 171 -174 633 -440 243 -250 391 -88 287 -144 143 -144 191 -86 239 -142 263 -246 105 -120 143 -142 263 -96 215 -168 85 -260 87 -480 277 -86 143 -144 403 -114 85 -462 767 -200 85 -174 315 -94 147 -408 85 -260 171 -112 143 -114 903 -116 201 -116 115 -86 173 -344 87 -114 115 -288 143 -288 85 -86 365 -230 143 -316 201 -86 569 -202 171 -202 143 -442 RAW_Data: 375 -172 211 -96 85 -264 429 -168 119 -116 163 -148 239 -168 95 -192 215 -230 95 -216 119 -144 167 -364 115 -316 115 -346 85 -116 229 -288 103 -480 305 -116 143 -86 85 -304 261 -168 167 -96 141 -144 95 -144 455 -106 113 -144 87 -86 229 -202 143 -316 143 -232 199 -174 233 -216 547 -278 143 -116 345 -288 369 -290 153 -316 305 -230 143 -116 545 -230 287 -168 237 -120 95 -370 201 -288 143 -258 173 -138 361 -82 345 -288 197 -168 165 -240 143 -186 263 -216 195 -202 171 -144 465 -194 501 -192 159 -172 143 -144 85 -192 253 -96 219 -300 205 -86 143 -86 311 -120 269 -634 185 -116 113 -456 97 -96 85 -174 85 -288 115 -144 173 -114 245 -144 119 -120 119 -96 93 -138 199 -144 173 -88 315 -202 157 -120 143 -96 167 -120 271 -268 287 -86 231 -144 143 -144 113 -346 259 -104 441 -204 249 -272 231 -114 345 -116 85 -86 85 -142 127 -100 169 -156 119 -96 167 -238 141 -86 143 -230 115 -114 115 -202 137 -168 143 -312 167 -110 193 -338 281 -230 721 -124 95 -120 309 -110 143 -144 563 -460 171 -88 143 -490 201 -144 85 -232 171 -144 201 -144 171 -144 95 -124 109 -572 633 -316 215 -264 161 -236 215 -202 115 -86 229 -260 257 -144 173 -172 259 -86 171 -264 129 -202 503 -350 161 -112 195 -144 401 -116 201 -230 287 -144 191 -96 167 -284 161 -164 119 -224 143 -376 209 -82 85 -144 201 -116 403 -114 231 -238 107 -174 85 -86 387 -200 173 -86 85 -116 87 -200 201 -174 287 -114 623 -86 143 -260 567 -108 113 -246 99 -396 115 -168 137 -396 85 -116 171 -86 87 -114 231 -144 235 -196 85 -144 305 -126 95 -218 417 -330 133 -116 85 -346 371 -134 345 -114 173 -372 111 -144 345 -402 115 -144 85 -86 87 -144 517 -86 413 -86 403 -120 431 -214 119 -264 191 -374 195 -86 287 -86 143 -608 143 -120 95 -216 263 -96 167 -120 113 -336 157 -192 285 -136 287 -200 87 -292 119 -216 109 -168 253 -118 167 -96 309 -96 191 -264 117 -170 119 -96 95 -406 167 -96 95 -120 167 -188 185 -96 417 -120 759 -144 85 -144 115 -86 173 -202 411 -188 263 -306 259 -288 229 -116 113 -88 171 -116 201 -114 365 -220 119 -398 181 -124 143 -202 85 -288 143 -288 229 -86 87 -114 229 -86 287 -88 143 -114 115 -258 287 -260 143 -86 335 -86 267 -240 119 -144 95 -238 119 -96 119 -246 405 -144 105 -144 147 -222 117 -110 129 -202 171 -86 229 -174 85 -96 109 -108 81 -86 95 -216 RAW_Data: 247 -86 113 -144 459 -140 115 -86 143 -144 229 -652 273 -96 81 -114 115 -172 87 -594 115 -230 85 -462 85 -86 85 -86 287 -240 263 -96 85 -458 363 -480 95 -192 119 -120 167 -288 105 -288 201 -172 201 -172 345 -144 115 -312 255 -144 167 -112 155 -96 167 -134 173 -114 201 -86 105 -114 347 -86 201 -144 173 -258 143 -260 215 -234 173 -114 229 -174 117 -168 335 -114 231 -114 191 -216 589 -120 141 -96 95 -168 335 -150 201 -230 259 -268 125 -100 287 -114 85 -174 201 -288 161 -166 125 -144 345 -116 575 -336 237 -120 421 -96 95 -96 119 -96 543 -258 115 -86 85 -116 85 -202 257 -202 409 -84 169 -114 115 -374 173 -374 85 -144 215 -168 195 -116 345 -230 173 -114 85 -398 81 -86 143 -144 345 -114 115 -86 173 -222 93 -116 113 -86 375 -114 153 -326 401 -116 87 -288 143 -460 143 -168 95 -168 253 -216 469 -96 167 -96 265 -244 111 -114 1439 -114 115 -140 119 -134 201 -144 199 -346 229 -202 489 -288 459 -222 81 -172 229 -288 335 -198 201 -200 143 -140 119 -134 383 -216 579 -86 85 -288 167 -116 143 -312 287 -192 113 -174 403 -460 287 -308 545 -284 333 -114 119 -190 145 -114 115 -96 153 -220 539 -192 829 -162 201 -216 143 -258 143 -116 171 -86 115 -86 115 -638 213 -120 431 -192 287 -144 239 -94 167 -192 95 -120 417 -162 95 -96 119 -142 167 -120 357 -168 431 -214 81 -516 197 -114 361 -86 257 -136 141 -288 87 -86 143 -288 143 -86 115 -172 143 -174 113 -174 85 -144 171 -144 143 -144 85 -116 257 -116 219 -176 949 -342 107 -140 115 -144 359 -142 95 -120 119 -240 95 -96 167 -96 95 -164 185 -172 197 -112 101 -116 171 -144 229 -202 85 -202 115 -114 263 -168 143 -122 213 -216 95 -96 381 -168 319 -202 171 -230 271 -278 259 -278 95 -220 489 -144 259 -132 315 -202 113 -86 143 -144 287 -174 393 -116 173 -346 143 -262 129 -142 119 -86 115 -138 399 -230 257 -422 315 -306 147 -96 285 -192 455 -130 263 -144 113 -144 461 -278 369 -120 97 -136 81 -144 113 -232 85 -258 317 -144 633 -86 173 -316 119 -192 163 -96 115 -86 173 -518 85 -174 285 -108 107 -488 201 -264 93 -232 85 -240 215 -124 215 -344 169 -94 143 -120 119 -120 179 -140 255 -146 119 -280 141 -316 143 -418 147 -442 127 -174 201 -172 115 -172 85 -346 115 -144 85 -144 259 -172 201 -316 87 -86 127 -96 263 -192 173 -114 367 -120 133 -552 313 -144 143 -96 85 -260 109 -614 RAW_Data: 333 -140 141 -114 287 -394 257 -88 145 -314 113 -86 113 -178 367 -198 199 -136 229 -662 489 -174 181 -134 171 -82 201 -288 367 -196 85 -88 171 -172 259 -116 85 -144 505 -260 85 -318 489 -114 143 -116 143 -172 115 -116 401 -278 167 -96 335 -120 143 -168 249 -184 95 -86 229 -144 187 -114 87 -86 171 -398 461 -326 95 -96 287 -112 181 -124 115 -178 95 -106 85 -192 109 -120 311 -470 95 -190 825 -114 317 -86 113 -146 113 -174 199 -88 85 -192 261 -332 85 -86 115 -116 661 -86 115 -114 287 -144 259 -202 143 -174 113 -322 297 -202 673 -106 111 -202 171 -232 305 -518 173 -346 113 -404 229 -86 253 -226 113 -144 487 -106 249 -302 195 -120 95 -120 311 -216 209 -192 95 -96 171 -96 95 -168 215 -214 167 -140 311 -140 83 -82 191 -336 95 -216 167 -354 107 -234 315 -88 85 -172 113 -86 315 -236 115 -172 201 -316 115 -374 141 -82 185 -190 325 -274 115 -86 143 -164 191 -86 201 -114 215 -170 95 -264 143 -96 119 -196 229 -82 289 -234 143 -264 201 -86 115 -346 229 -172 143 -202 143 -86 345 -86 173 -138 95 -102 575 -144 143 -230 221 -158 251 -168 103 -96 133 -172 173 -336 143 -188 309 -86 143 -116 85 -144 85 -306 201 -116 215 -286 283 -396 305 -148 317 -216 115 -490 115 -186 111 -144 201 -86 143 -192 285 -128 137 -86 85 -116 173 -216 119 -118 215 -96 95 -216 107 -82 173 -258 115 -168 263 -182 459 -288 143 -86 115 -490 143 -230 115 -144 229 -764 93 -112 81 -118 249 -144 229 -174 201 -374 201 -230 171 -88 223 -304 115 -200 143 -86 87 -174 85 -116 169 -172 429 -168 165 -216 603 -188 119 -120 269 -86 249 -120 141 -216 229 -174 85 -202 251 -186 87 -114 121 -254 649 -144 399 -86 201 -104 169 -162 103 -122 165 -168 119 -120 213 -84 143 -86 143 -168 173 -258 85 -232 315 -86 229 -116 95 -288 217 -124 335 -144 191 -120 333 -120 191 -216 143 -574 375 -86 311 -110 143 -202 287 -86 113 -174 345 -96 511 -88 109 -96 143 -638 133 -120 167 -360 95 -96 95 -144 143 -116 403 -480 341 -88 85 -114 115 -230 111 -226 115 -86 171 -404 259 -144 215 -288 405 -240 105 -402 255 -572 115 -168 113 -216 115 -144 143 -116 143 -374 85 -116 113 -116 287 -162 87 -86 219 -240 113 -116 863 -86 305 -126 113 -202 143 -378 143 -376 391 -88 229 -144 171 -200 259 -86 87 -144 109 -140 85 -116 327 -140 363 -114 143 -244 85 -116 335 -96 309 -352 RAW_Data: 95 -168 219 -96 95 -168 95 -312 333 -144 117 -290 119 -94 373 -240 215 -96 229 -338 135 -202 257 -490 201 -116 85 -202 257 -144 113 -346 85 -86 289 -230 143 -144 109 -168 167 -96 189 -144 239 -114 143 -144 199 -116 85 -202 85 -174 165 -88 113 -112 315 -116 229 -164 119 -110 113 -116 115 -144 85 -202 113 -116 115 -200 115 -86 231 -114 85 -86 287 -168 93 -168 85 -88 257 -144 201 -230 715 -86 115 -144 373 -202 85 -116 85 -194 217 -144 201 -202 143 -172 143 -86 163 -202 115 -402 187 -244 251 -152 191 -336 117 -216 95 -144 253 -114 201 -456 95 -646 85 -288 85 -84 443 -576 115 -116 143 -432 115 -346 257 -334 621 -96 95 -264 171 -198 147 -452 229 -144 215 -288 93 -96 287 -96 165 -96 287 -138 777 -202 363 -190 191 -240 81 -114 119 -118 283 -138 95 -166 229 -194 119 -198 189 -192 167 -168 215 -94 119 -124 81 -196 351 -286 183 -140 969 -346 171 -586 87 -172 201 -164 267 -130 113 -144 191 -98 191 -96 243 -202 201 -174 199 -202 713 -454 95 -144 107 -144 451 -110 201 -174 143 -116 143 -144 285 -84 83 -328 117 -424 119 -144 95 -214 135 -402 115 -114 115 -174 257 -406 215 -336 193 -288 113 -116 229 -86 345 -260 113 -232 101 -264 167 -94 95 -216 401 -202 373 -114 173 -232 279 -690 259 -172 143 -404 229 -220 115 -114 173 -230 171 -318 309 -156 113 -170 223 -172 287 -174 315 -116 229 -332 111 -116 85 -258 431 -404 201 -86 171 -106 115 -96 369 -124 239 -206 115 -230 389 -200 115 -86 565 -488 83 -82 585 -172 459 -198 87 -86 85 -116 143 -202 371 -96 287 -392 221 -174 85 -230 461 -474 93 -120 95 -274 171 -144 339 -226 143 -184 81 -230 141 -216 143 -216 117 -120 167 -216 167 -96 265 -108 165 -86 315 -260 229 -172 87 -312 587 -150 341 -200 187 -432 171 -84 85 -202 85 -116 85 -116 431 -114 201 -84 169 -86 85 -114 313 -346 85 -86 85 -142 159 -646 143 -88 119 -120 521 -134 173 -128 315 -462 99 -362 227 -144 167 -120 165 -246 215 -86 825 -168 443 -536 835 -316 85 -174 113 -144 85 -144 173 -458 143 -288 81 -170 143 -268 215 -192 285 -360 113 -258 225 -168 163 -334 113 -116 257 -296 287 -312 277 -116 603 -82 255 -96 95 -336 301 -82 95 -552 141 -332 281 -110 201 -172 145 -200 115 -144 95 -344 201 -116 171 -96 119 -120 143 -144 421 -96 199 -394 107 -110 115 -114 145 -316 315 -288 115 -200 87 -114 115 -288 RAW_Data: 85 -374 259 -260 113 -174 287 -144 507 -202 229 -144 221 -142 115 -124 143 -216 95 -96 117 -216 143 -144 85 -144 143 -144 201 -144 85 -284 469 -190 149 -86 143 -316 283 -290 95 -216 119 -180 167 -200 375 -86 111 -192 143 -144 213 -404 85 -144 719 -202 85 -434 143 -144 143 -172 287 -264 111 -114 315 -96 115 -576 85 -230 85 -144 143 -174 281 -198 201 -86 201 -144 575 -116 85 -174 143 -164 315 -168 171 -268 85 -536 111 -172 153 -462 239 -158 333 -174 361 -258 343 -96 453 -240 119 -256 113 -88 171 -172 259 -230 173 -110 113 -202 113 -88 113 -232 315 -100 165 -422 99 -316 311 -262 191 -120 555 -280 85 -174 431 -86 259 -210 119 -168 885 -462 433 -106 107 -116 113 -644 127 -278 115 -86 87 -226 159 -346 115 -144 85 -144 85 -768 541 -168 113 -86 87 -374 113 -144 747 -230 187 -268 521 -346 311 -1194 383 -478 313 -110 229 -202 171 -144 287 -722 285 -138 225 -188 133 -346 85 -174 199 -374 229 -112 135 -194 95 -216 143 -120 377 -86 245 -120 93 -96 95 -178 217 -86 277 -312 517 -530 505 -192 259 -106 119 -94 143 -336 293 -348 219 -316 87 -258 85 -174 143 -86 85 -116 171 -398 167 -88 85 -116 85 -202 459 -314 143 -202 459 -222 253 -202 171 -462 143 -490 143 -264 249 -340 147 -88 143 -144 113 -144 461 -258 85 -86 115 -202 171 -86 317 -86 115 -114 283 -86 287 -116 373 -86 287 -156 659 -158 87 -114 201 -124 95 -86 287 -172 87 -172 113 -144 663 -230 143 -162 95 -116 143 -116 113 -86 173 -356 99 -198 391 -140 191 -144 219 -172 171 -318 191 -374 201 -328 87 -230 85 -86 143 -116 195 -96 99 -226 383 -382 119 -264 431 -120 167 -120 95 -312 191 -106 85 -172 143 -520 95 -238 299 -288 359 -108 375 -172 185 -150 213 -168 119 -120 127 -146 171 -86 143 -202 115 -144 113 -202 201 -116 113 -144 365 -142 143 -22490 523 -858 969 -1190 1065 -1160 1067 -1146 683 -754 1133 -1100 747 -712 775 -708 779 -702 1125 -1102 1119 -1094 767 -698 763 -728 759 -734 755 -710 757 -738 1117 -1070 815 -648 1207 -1010 1197 -1024 835 -658 779 -710 771 -710 779 -706 1115 -1102 1133 -1066 815 -644 843 -650 1203 -1010 1207 -998 1197 -1042 1153 -1020 803 -710 1141 -1076 791 -678 785 -708 767 -712 773 -710 775 -704 779 -704 815 -646 839 -646 843 -648 813 -656 1205 -1012 1205 -1020 1193 -1020 815 -644 843 -624 1551 -1394 1553 -1364 1575 -1390 819 -672 841 -680 755 -712 1141 -1076 1185 -1016 1191 -1050 763 -704 RAW_Data: 1183 -1014 813 -646 841 -644 843 -648 1203 -1010 1207 -996 805 -714 775 -710 775 -678 835 -648 813 -672 1181 -1016 799 -710 1139 -1076 1151 -1064 811 -646 845 -646 843 -622 843 -650 1205 -1012 1177 -1022 805 -712 775 -714 1139 -1076 1149 -1034 1205 -998 1177 -1040 811 -670 1183 -1012 855 -626 835 -674 817 -644 843 -648 843 -624 845 -674 761 -732 755 -712 779 -714 773 -710 1139 -1080 1127 -1092 1149 -1024 811 -658 831 -658 1499 -1406 1555 -1404 1557 -1408 805 -668 815 -676 817 -678 1131 -1092 1159 -1018 1213 -1022 815 -676 1131 -1092 789 -642 843 -646 841 -648 1185 -1036 1181 -1018 801 -710 775 -678 829 -668 815 -644 845 -646 1181 -1038 831 -650 1207 -992 1211 -1048 791 -650 843 -676 763 -706 763 -734 1119 -1094 1153 -1018 823 -656 829 -676 1179 -1022 1159 -1070 1179 -1006 1191 -1022 815 -706 1125 -1066 813 -648 845 -646 841 -650 815 -678 783 -710 755 -712 779 -710 769 -710 775 -706 835 -646 1181 -1020 1193 -1022 1185 -1016 833 -654 833 -624 1559 -1410 1515 -1384 1569 -1414 789 -674 843 -674 761 -730 1133 -1068 1177 -1010 1195 -1026 817 -678 1151 -1066 813 -646 817 -672 819 -646 1209 -1012 1197 -1024 835 -658 769 -710 799 -710 749 -690 835 -640 1211 -1018 777 -736 1115 -1078 1151 -1064 809 -644 841 -646 841 -624 841 -650 1201 -1010 1205 -1018 803 -712 773 -704 1145 -1076 1121 -1092 1157 -1016 1185 -1048 791 -674 1179 -1012 835 -648 841 -646 843 -646 843 -674 767 -708 769 -714 777 -714 747 -734 777 -668 843 -644 1205 -1006 1193 -1048 1177 -1012 805 -668 843 -620 1545 -1418 1521 -1388 1575 -1360 841 -672 819 -682 769 -712 1139 -1076 1157 -1040 1197 -1026 835 -658 1143 -1072 817 -620 845 -646 843 -674 1185 -988 1205 -1018 801 -712 777 -706 781 -674 841 -646 817 -648 1207 -1008 831 -652 1199 -1024 1199 -1042 817 -644 817 -648 841 -676 765 -706 1149 -1064 1179 -1020 829 -658 825 -654 1197 -1024 1179 -1012 1205 -992 1183 -1072 789 -674 1183 -1010 837 -650 841 -644 843 -646 843 -678 789 -676 763 -706 793 -710 769 -712 775 -706 781 -674 1205 -1022 1139 -1098 1157 -1014 827 -652 829 -640 1537 -1388 1567 -1388 1541 -1392 813 -698 815 -676 767 -734 1133 -1076 1131 -1040 1195 -1052 811 -678 1133 -1070 819 -620 843 -646 843 -676 1125 -1090 1179 -994 859 -632 797 -710 775 -702 839 -622 841 -644 1211 -992 801 -710 1139 -1078 1151 -1062 813 -646 843 -646 843 -622 841 -650 1205 -1010 1203 -1020 823 -658 825 -654 1195 -1022 1201 -1040 1155 -1016 1185 -1046 815 -650 1177 -1034 833 -644 843 -646 819 -674 815 -676 767 -710 769 -712 775 -710 775 -678 861 -620 841 -646 1205 -1008 RAW_Data: 1221 -1022 1185 -1016 813 -646 841 -618 1573 -1364 1577 -1362 1811 -2658 227 -138 191 -120 333 -488 345 -86 403 -86 115 -604 283 -82 343 -202 143 -316 87 -128 311 -230 119 -264 165 -168 247 -216 199 -166 283 -230 81 -132 487 -114 115 -142 921 -260 345 -114 373 -116 115 -114 115 -166 191 -192 171 -116 417 -242 167 -240 285 -120 283 -86 257 -230 335 -244 167 -96 167 -188 161 -96 85 -232 173 -114 201 -144 363 -144 87 -86 507 -88 143 -490 103 -124 143 -460 517 -144 219 -202 173 -144 113 -318 229 -174 401 -442 143 -88 603 -144 259 -86 115 -116 113 -144 113 -142 297 -202 171 -86 201 -86 115 -374 163 -364 471 -104 169 -88 201 -144 237 -234 203 -160 113 -86 269 -96 95 -240 431 -94 295 -328 191 -144 239 -240 165 -96 119 -168 421 -238 191 -144 119 -168 143 -120 143 -96 209 -164 239 -240 335 -116 201 -316 115 -172 201 -114 115 -172 173 -86 431 -202 143 -86 229 -116 171 -86 317 -162 143 -174 113 -174 85 -228 85 -142 139 -196 305 -106 85 -232 171 -168 531 -86 85 -86 173 -172 143 -260 137 -342 257 -174 85 -100 115 -170 139 -174 829 -96 191 -192 311 -240 311 -82 211 -144 475 -114 201 -86 85 -286 239 -144 95 -264 227 -120 387 -202 251 -142 143 -316 345 -450 85 -174 315 -372 251 -258 143 -230 221 -156 431 -170 85 -114 431 -364 633 -174 421 -114 259 -86 201 -116 115 -86 229 -174 103 -96 115 -244 307 -86 345 -356 259 -450 693 -98 263 -456 191 -96 357 -116 85 -86 115 -230 201 -88 161 -518 259 -340 173 -116 315 -140 107 -218 517 -96 285 -124 95 -382 119 -144 167 -168 357 -168 119 -144 287 -142 95 -200 143 -260 201 -306 173 -604 479 -224 285 -106 507 -116 165 -408 359 -288 97 -116 225 -430 85 -144 449 -374 113 -120 95 -96 241 -106 101 -86 123 -120 117 -214 107 -144 263 -268 119 -120 141 -96 119 -216 229 -306 287 -150 135 -172 287 -114 215 -168 143 -172 115 -462 113 -144 143 -490 199 -116 403 -116 171 -590 637 -304 113 -86 143 -100 111 -534 149 -312 237 -236 143 -202 85 -202 171 -488 109 -572 201 -238 95 -174 397 -202 283 -164 87 -662 201 -244 315 -562 143 -86 325 -96 575 -190 191 -144 85 -202 189 -358 287 -618 835 -160 163 -142 85 -172 139 -144 215 -82 287 -114 87 -144 541 -438 143 -240 167 -144 359 -190 95 -120 263 -108 109 -184 215 -100 113 -288 119 -144 95 -406 81 -114 87 -256 315 -316 171 -100 105 -144 263 -302 229 -174 RAW_Data: 113 -232 197 -176 143 -200 187 -240 537 -96 95 -118 263 -432 141 -96 119 -216 761 -282 119 -526 119 -120 185 -116 171 -168 81 -86 143 -172 173 -86 113 -144 489 -202 143 -174 287 -186 373 -168 373 -174 85 -168 119 -330 325 -174 113 -144 373 -202 143 -138 195 -174 185 -192 119 -412 115 -114 283 -120 143 -360 525 -120 119 -120 367 -116 115 -144 345 -114 87 -120 287 -240 239 -96 503 -168 459 -144 317 -242 95 -104 255 -82 227 -172 307 -314 119 -264 901 -282 171 -202 171 -346 201 -576 167 -196 201 -288 315 -116 85 -144 85 -290 143 -264 303 -532 173 -120 215 -272 603 -86 143 -86 85 -190 167 -144 431 -238 119 -96 119 -96 455 -96 285 -144 287 -618 85 -288 253 -592 105 -104 139 -188 335 -120 511 -166 431 -202 373 -86 87 -114 231 -206 83 -190 199 -288 201 -86 171 -88 195 -120 201 -116 257 -202 161 -156 229 -144 143 -298 263 -166 119 -158 115 -326 455 -166 95 -144 119 -168 141 -216 455 -334 95 -144 95 -214 143 -96 143 -196 143 -190 479 -364 287 -114 163 -86 287 -130 297 -96 167 -96 431 -144 95 -190 119 -144 141 -120 335 -144 285 -188 497 -112 429 -258 143 -140 111 -232 87 -116 143 -96 285 -204 273 -632 371 -144 85 -202 115 -172 499 -144 143 -120 119 -120 95 -360 143 -258 173 -930 315 -134 431 -144 115 -114 257 -740 373 -174 95 -144 297 -268 167 -96 143 -834 171 -168 95 -172 119 -96 85 -88 199 -88 315 -172 259 -216 311 -202 85 -260 257 -144 657 -120 119 -116 223 -286 233 -130 115 -202 85 -144 143 -172 115 -88 85 -114 95 -114 345 -288 85 -116 471 -124 173 -114 335 -260 115 -658 339 -260 113 -86 201 -480 217 -470 105 -114 259 -134 137 -86 171 -326 191 -120 263 -144 95 -148 289 -124 121 -384 95 -322 171 -142 193 -288 143 -172 211 -266 109 -144 325 -168 213 -96 685 -310 239 -262 143 -216 143 -316 393 -126 215 -216 387 -202 201 -230 143 -116 85 -144 201 -268 143 -262 311 -86 115 -316 167 -86 229 -116 335 -144 117 -302 113 -116 241 -86 143 -202 201 -116 453 -288 293 -272 367 -120 651 -170 565 -116 143 -882 557 -116 181 -588 119 -168 287 -168 119 -118 191 -168 143 -282 115 -88 171 -404 719 -202 115 -172 253 -144 143 -532 121 -144 239 -96 167 -120 119 -456 199 -114 311 -86 201 -352 111 -144 115 -114 173 -86 85 -538 113 -88 257 -116 143 -96 95 -144 121 -198 127 -172 173 -114 229 -116 143 -144 173 -368 111 -200 163 -116 RAW_Data: 113 -292 169 -200 145 -86 85 -230 259 -86 85 -86 439 -96 85 -116 115 -86 113 -86 85 -192 191 -214 263 -264 119 -96 345 -116 85 -86 173 -288 85 -104 145 -130 85 -662 243 -390 263 -96 129 -422 223 -288 219 -172 655 -108 361 -96 271 -432 167 -120 421 -278 217 -248 143 -96 165 -240 109 -628 99 -96 95 -168 95 -216 119 -144 171 -172 115 -86 85 -174 387 -190 239 -384 143 -344 115 -114 143 -86 233 -140 85 -724 119 -82 85 -144 115 -144 115 -144 143 -114 201 -174 215 -96 109 -144 85 -144 599 -144 115 -258 249 -206 171 -86 143 -110 255 -86 85 -86 287 -208 225 -100 193 -200 143 -288 139 -460 113 -498 85 -144 143 -88 85 -144 229 -144 85 -144 171 -288 261 -202 113 -88 87 -114 143 -288 373 -366 229 -202 201 -172 173 -172 421 -280 153 -120 81 -160 137 -116 201 -250 141 -230 115 -318 863 -206 119 -462 143 -144 85 -86 201 -230 407 -96 223 -112 143 -94 95 -106 479 -86 113 -174 171 -284 119 -158 239 -190 167 -204 185 -408 215 -168 259 -202 201 -86 85 -202 87 -448 249 -332 363 -490 85 -172 115 -114 145 -114 259 -144 101 -142 119 -240 143 -188 387 -384 425 -144 173 -506 137 -162 139 -174 253 -116 131 -106 115 -130 117 -144 95 -86 239 -192 407 -120 237 -144 143 -82 487 -102 439 -112 199 -88 201 -262 269 -230 229 -192 219 -252 133 -96 191 -346 135 -288 621 -232 661 -202 327 -164 143 -144 139 -536 115 -114 143 -174 85 -100 99 -86 85 -174 85 -144 345 -172 243 -408 115 -86 115 -202 229 -114 87 -114 229 -740 801 -158 143 -168 479 -124 103 -264 119 -240 171 -88 219 -278 431 -402 513 -264 465 -256 141 -168 115 -358 251 -316 387 -172 101 -96 683 -192 95 -120 191 -120 95 -462 261 -96 121 -180 167 -878 287 -86 143 -86 311 -118 287 -168 191 -96 167 -158 85 -86 315 -434 165 -822 171 -316 231 -84 415 -174 87 -296 229 -222 93 -192 167 -190 143 -96 95 -96 237 -168 259 -86 115 -346 171 -116 115 -114 317 -114 95 -140 373 -116 143 -286 207 -260 171 -202 171 -134 119 -320 453 -96 293 -168 143 -144 119 -172 143 -202 237 -360 225 -86 287 -86 201 -202 109 -120 133 -214 215 -116 85 -260 267 -122 335 -316 111 -604 87 -172 259 -258 235 -96 173 -230 339 -140 115 -86 287 -288 143 -186 95 -96 95 -96 339 -256 147 -158 143 -246 223 -264 213 -202 85 -110 95 -168 95 -118 119 -168 95 -264 191 -316 119 -144 119 -382 167 -120 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/security_pls_1_0.sub ================================================ Filetype: Flipper SubGhz Key File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: Security+ 1.0 Bit: 42 Key: 1C 41 D2 39 E6 A3 8B CC ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/security_pls_1_0_raw.sub ================================================ Filetype: Flipper SubGhz RAW File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: RAW RAW_Data: 297 -1592 167 -1594 231 -366 65 -598 65 -600 197 -98 199 -1098 99 -98 65 -862 133 -628 165 -597 361 -6828 65 -1668 231 -632 65 -792 163 -1284 163 -5554 199 -1588 165 -5300 97 -992 65 -432 197 -2566 99 -2340 63 -5932 65 -1462 65 -1062 131 -2454 65 -1446 133 -1682 65 -1260 65 -368 131 -1482 65 -134 131 -1512 197 -1710 131 -824 99 -66 133 -464 131 -866 65 -698 65 -200 65 -894 99 -1692 233 -1130 97 -2160 265 -1392 99 -132 131 -166 65 -1318 327 -1548 163 -6980 165 -994 65 -698 131 -1580 129 -132 63 -758 97 -466 99 -1590 395 -1024 97 -600 99 -732 63 -228 129 -98 165 -292 99 -696 231 -232 197 -166 133 -132 131 -430 165 -664 199 -1596 197 -530 65 -1054 63 -3474 165 -4504 65 -2980 99 -268 133 -2356 131 -798 99 -132 99 -796 97 -1692 97 -3804 199 -166 67 -66 97 -132 99 -5058 129 -1512 163 -1290 65 -298 199 -398 65 -1034 65 -1332 167 -3448 65 -1750 65 -1186 131 -462 65 -920 65 -166 97 -362 131 -1704 131 -1748 65 -2124 65 -1064 133 -1694 197 -5148 99 -566 131 -1696 99 -598 65 -698 231 -692 267 -2490 99 -1618 165 -1760 197 -2152 165 -1226 195 -100 99 -66 131 -100 99 -400 65 -456 131 -198 165 -368 261 -826 365 -858 99 -132 163 -460 229 -264 65 -664 165 -234 231 -98 165 -100 99 -1986 99 -2526 65 -832 167 -1762 231 -728 67 -530 133 -2082 97 -960 67 -498 199 -1658 133 -1488 99 -2652 99 -1258 165 -5284 99 -1660 65 -1790 65 -432 65 -3804 197 -2170 131 -196 129 -66 97 -832 99 -2466 97 -1622 99 -1624 163 -394 163 -1018 133 -1856 99 -430 67 -826 197 -3156 65 -166 97 -558 65 -1690 131 -1498 99 -66 65 -2716 161 -658 99 -1054 65 -230 65 -2074 97 -2042 65 -3074 263 -1698 165 -492 65 -400 131 -196 131 -368 165 -134 203 -168 201 -134 165 -398 301 -628 99 -1032 99 -830 65 -66 65 -432 229 -230 161 -394 197 -228 197 -330 327 -66 197 -822 231 -392 131 -892 393 -1456 131 -64 163 -1418 65 -166 165 -1428 133 -1526 163 -954 65 -888 99 -1956 133 -1194 131 -3514 65 -1728 97 -662 67 -1590 167 -2714 65 -930 65 -166 65 -728 131 -2752 65 -434 133 -1828 99 -3704 129 -1912 133 -1544 227 -494 133 -202 97 -466 65 -200 131 -1580 263 -1708 65 -626 65 -626 199 -166 133 -3446 99 -3420 99 -398 131 -1164 131 -7018 131 -3468 63 -1658 199 -956 101 -598 99 -1790 97 -1192 65 -362 133 -630 65 -100 429 -794 65 -696 231 -1130 65 -268 395 -730 131 -466 431 -66 233 -168 197 -998 97 -264 65 -796 163 -236 RAW_Data: 265 -100 133 -1464 99 -464 67 -592 229 -362 131 -262 163 -134 325 -164 163 -130 97 -164 65 -724 97 -132 97 -958 131 -594 131 -264 161 -98 229 -100 97 -890 131 -364 99 -198 97 -262 131 -234 2497 -134 65 -68 165 -400 563 -400 433 -496 99 -100 131 -266 99 -100 65 -200 231 -894 65 -166 463 -200 201 -1228 131 -266 65 -496 99 -300 97 -202 165 -896 365 -132 163 -1698 165 -132 99 -168 67 -166 67 -796 165 -400 131 -200 165 -796 165 -98 2161 -66 65 -166 293 -228 887 -66 395 -656 297 -100 97 -530 97 -66 97 -594 65 -428 97 -332 65 -400 131 -164 261 -66 299 -334 65 -596 97 -166 99 -1184 161 -460 131 -132 229 -398 299 -664 165 -722 165 -166 263 -300 99 -232 199 -266 267 -660 97 -758 133 -530 65 -632 99 -264 329 -1028 67 -166 2451 -562 427 -464 163 -198 229 -264 229 -790 295 -164 297 -132 263 -726 267 -66 99 -364 197 -564 99 -1162 67 -960 97 -198 163 -630 133 -66 163 -132 195 -1288 197 -430 197 -1546 65 -890 97 -394 231 -924 2173 -100 65 -594 165 -100 99 -528 99 -166 99 -298 497 -66 65 -100 131 -198 265 -362 131 -198 293 -294 129 -1150 263 -262 65 -100 131 -494 231 -166 231 -468 99 -66 165 -1262 197 -298 65 -298 397 -432 297 -498 361 -200 65 -466 131 -166 101 -496 231 -364 233 -64 197 -196 65 -426 265 -198 99 -1218 97 -200 67 -232 131 -200 167 -200 99 -66 165 -928 67 -1722 99 -764 65 -892 99 -232 133 -300 133 -1080 621 -1526 487 -1504 507 -506 1517 -1524 519 -1508 509 -1512 447 -546 1503 -1038 1035 -1482 547 -976 1007 -1208 823 -490 1503 -532 1481 -1048 989 -1534 499 -524 1507 -514 1499 -1014 1007 -524 1503 -1530 473 -60198 1533 -1516 481 -1040 985 -1044 981 -1554 479 -1530 479 -1044 1007 -1502 511 -1538 483 -516 1503 -1542 473 -1016 1033 -1510 483 -1542 505 -1002 1003 -508 1521 -1010 1015 -1512 507 -526 1515 -518 1505 -1016 1007 -59156 529 -1528 463 -1580 447 -542 1507 -1544 469 -1554 481 -1512 499 -518 1507 -1016 1007 -1512 511 -1012 1021 -1010 1007 -518 1529 -472 1555 -982 1023 -1502 505 -508 1537 -488 1545 -1012 1003 -480 1531 -1516 507 -60180 493 -12296 821 -1698 299 -1686 387 -590 1465 -1570 459 -1046 979 -1546 475 -1534 489 -1044 1009 -482 1529 -1032 973 -1538 513 -480 1537 -492 1523 -1012 1017 -59154 497 -11798 301 -704 1325 -1148 913 -1612 417 -1102 897 -1118 945 -586 1437 -568 1465 -1058 977 -1534 477 -550 1495 -502 1515 -1006 1037 -494 1527 -1510 489 -60174 531 -16794 355 -640 1399 -1608 449 -1050 989 -1540 461 -1546 477 -1068 973 -518 RAW_Data: 1503 -1024 1009 -1536 473 -552 1503 -498 1517 -1010 1017 -59162 513 -9838 227 -1670 371 -604 1425 -1116 949 -1554 477 -1030 981 -1042 973 -550 1477 -532 1511 -1010 1003 -1544 511 -496 1515 -516 1509 -1018 1007 -488 1539 -1504 503 -60216 1525 -1530 485 -1018 999 -1012 1019 -1538 475 -1546 477 -1012 1025 -1506 517 -1530 505 -510 1507 -1512 513 -1010 999 -1516 507 -1520 513 -1012 1015 -506 1527 -1014 991 -1542 483 -524 1517 -482 1529 -1008 1005 -137640 165 -1660 165 -1362 231 -3114 67 -2286 131 -1652 197 -1448 195 -1648 97 -3534 163 -988 65 -556 65 -132 133 -2594 199 -2054 65 -1918 65 -1458 163 -690 65 -1134 131 -1194 67 -1158 131 -1656 199 -198 99 -298 199 -2676 67 -2122 231 -1762 263 -1560 131 -1228 99 -198 197 -830 99 -166 97 -6274 99 -1058 163 -1676 97 -1788 65 -5742 99 -3890 131 -2682 195 -166 65 -1394 265 -432 99 -368 99 -100 67 -198 163 -564 133 -992 131 -266 133 -962 233 -200 131 -196 231 -560 131 -66 65 -764 131 -1058 133 -564 99 -1792 133 -2820 65 -3480 165 -9536 99 -66 97 -626 97 -1828 199 -1860 99 -66 197 -1060 99 -1746 65 -1690 99 -198 99 -1660 165 -1764 65 -1558 199 -1456 99 -164 65 -1318 395 -5966 131 -928 165 -1026 99 -534 65 -434 99 -100 97 -100 97 -3272 65 -2168 131 -2904 231 -1564 67 -958 263 -3780 65 -166 99 -3506 99 -1594 165 -1492 197 -164 63 -1382 197 -1162 65 -364 133 -822 65 -498 495 -230 165 -366 65 -464 231 -666 231 -198 65 -332 163 -566 65 -164 67 -332 231 -232 265 -198 97 -1254 361 -200 65 -2056 129 -430 131 -100 65 -1588 263 -198 97 -2992 97 -528 297 -134 97 -368 427 -66 67 -132 65 -132 367 -330 65 -266 229 -66 65 -66 65 -198 231 -66 133 -528 363 -162 161 -230 525 -230 65 -230 461 -132 327 -330 295 -130 197 -230 165 -270 265 -464 65 -698 265 -264 229 -400 99 -3476 97 -1490 199 -134 99 -2970 165 -1618 167 -1598 65 -1162 99 -234 167 -1162 135 -464 65 -664 165 -1126 197 -362 97 -1222 65 -3496 65 -7024 131 -1592 131 -530 97 -6464 231 -998 263 -428 65 -698 131 -198 131 -1414 63 -1346 165 -1060 65 -1664 167 -566 263 -666 165 -566 331 -100 131 -1522 167 -368 199 -896 229 -232 99 -968 99 -168 231 -66 197 -68 131 -168 133 -400 131 -268 233 -596 233 -132 97 -494 131 -1710 197 -1616 67 -592 99 -1226 267 -268 65 -266 133 -1986 165 -332 99 -366 131 -2700 97 -1398 65 -130 269 -198 65 -1664 131 -3180 165 -992 65 -866 99 -166 163 -2782 65 -2354 265 -5176 65 -66 163 -1290 67 -164 99 -2584 67 -3084 RAW_Data: 195 -364 65 -164 229 -958 63 -166 193 -130 65 -556 99 -332 199 -430 197 -996 297 -1426 235 -1160 2053 -166 1063 -100 501 -132 535 -198 67 -66 165 -98 165 -460 365 -366 97 -432 329 -264 133 -100 165 -328 197 -360 1087 -264 97 -166 63 -166 233 -98 195 -294 97 -264 163 -266 197 -100 359 -66 65 -1958 165 -694 99 -166 99 -596 299 -466 97 -66 99 -696 231 -1492 297 -1554 165 -1680 165 -368 99 -166 99 -168 65 -794 197 -194 2581 -98 1151 -592 99 -426 197 -328 295 -164 65 -232 163 -530 165 -264 129 -98 229 -294 493 -426 99 -66 163 -164 261 -264 129 -166 229 -68 65 -558 131 -132 65 -132 197 -1550 361 -98 67 -132 99 -132 131 -786 99 -198 301 -366 165 -530 99 -234 2159 -264 1691 -166 367 -132 231 -100 197 -166 97 -366 163 -68 131 -366 165 -268 133 -430 233 -100 133 -132 199 -932 561 -1416 231 -794 199 -1296 165 -564 165 -666 99 -490 97 -760 163 -1582 295 -464 267 -330 2561 -134 931 -66 65 -132 99 -264 63 -132 99 -198 97 -364 129 -460 65 -230 263 -164 163 -100 365 -100 131 -398 97 -530 65 -266 299 -1028 133 -100 97 -166 65 -296 65 -166 133 -498 331 -962 99 -98 199 -1328 165 -200 65 -234 99 -400 231 -632 65 -232 199 -530 65 -866 429 -958 197 -368 165 -668 65 -984 163 -100 129 -1088 259 -752 97 -522 131 -892 65 -298 67 -364 199 -132 65 -788 97 -396 363 -1052 99 -228 131 -98 99 -1526 463 -330 131 -898 263 -332 97 -996 163 -494 99 -2950 65 -798 131 -2490 165 -1424 65 -1694 65 -1822 65 -1756 67 -3820 65 -2536 97 -2410 65 -1030 131 -404 263 -732 165 -1566 197 -1554 199 -400 65 -100 99 -566 165 -3584 65 -764 101 -2630 65 -2896 163 -364 67 -100 65 -1228 263 -232 63 -884 65 -4092 133 -1622 325 -166 99 -2352 65 -500 65 -1324 99 -366 65 -1592 297 -5134 131 -1130 65 -1962 99 -66 99 -1454 67 -1130 99 -134 199 -134 165 -1222 229 -166 131 -464 197 -196 263 -234 99 -534 65 -132 131 -166 133 -134 199 -1590 231 -66 131 -1160 131 -300 65 -698 199 -462 133 -3446 99 -2876 65 -596 65 -1716 133 -2886 97 -134 199 -1628 131 -1790 67 -2556 615 -1510 453 -1584 443 -1566 485 -1014 977 -1054 1003 -516 1501 -1010 1007 -520 1495 -1034 1005 -1530 481 -514 1541 -492 1523 -1012 1001 -1508 521 -1016 999 -512 1527 -1506 509 -488 1521 -1040 989 -1538 473 -60194 1519 -1540 511 -1010 1001 -1020 1009 -1516 515 -1010 1001 -518 1507 -524 1503 -1534 493 -1510 501 -1022 1011 -516 1507 -522 1507 -1512 509 -1506 519 -516 RAW_Data: 1499 -1542 485 -492 1535 -1508 491 -1046 1005 -1008 1001 -59158 547 -1508 515 -1510 505 -1510 523 -976 1033 -1000 1031 -472 1527 -1008 1039 -482 1541 -1010 1017 -1512 485 -514 1533 -482 1527 -1000 1019 -1534 479 -1044 1011 -488 1505 -1522 511 -512 1529 -984 1013 -1522 509 -60190 1543 -1522 477 -1038 999 -1002 1029 -1504 523 -1012 1009 -482 1541 -486 1543 -1510 481 -1544 505 -1008 997 -516 1507 -520 1513 -1508 517 -1510 519 -490 1521 -1540 485 -514 1503 -1540 487 -1016 1019 -1008 1003 -59184 521 -1536 511 -1506 489 -1548 475 -1026 1011 -1014 1019 -488 1513 -1014 1043 -484 1513 -1012 1023 -1506 519 -492 1525 -520 1507 -1008 1005 -1542 479 -1012 1023 -514 1507 -1508 521 -516 1523 -1008 1009 -1516 511 -60208 1513 -1524 477 -1042 1013 -984 1011 -1516 509 -1008 1015 -522 1505 -526 1509 -1504 503 -1526 513 -1008 1015 -512 1497 -522 1513 -1504 527 -1514 481 -516 1527 -1528 509 -494 1511 -1540 493 -1018 1005 -1014 1003 -59166 553 -1502 511 -1504 487 -1546 511 -992 1011 -1010 1015 -520 1517 -1016 1007 -480 1527 -1016 1009 -1512 509 -510 1529 -490 1525 -1018 999 -1542 481 -1014 1035 -488 1541 -1506 481 -520 1509 -1018 1035 -1510 481 -60216 1525 -1508 521 -1024 1005 -1008 1017 -1504 487 -1018 1009 -526 1517 -516 1509 -1532 475 -1518 511 -1008 1031 -506 1495 -520 1507 -1540 483 -1544 477 -514 1531 -1506 487 -520 1513 -1516 509 -1006 1037 -1016 1011 -139572 133 -1724 99 -1590 165 -1660 65 -168 67 -1000 529 -598 65 -296 131 -130 197 -566 99 -732 99 -832 65 -4560 131 -1156 161 -982 261 -788 65 -720 65 -1286 65 -100 131 -368 131 -298 65 -500 65 -2674 65 -758 197 -168 131 -294 63 -1744 163 -5304 131 -3408 199 -2122 65 -2626 131 -832 67 -166 65 -4384 163 -1608 65 -66 97 -262 65 -1418 65 -390 65 -230 65 -66 165 -1666 133 -1690 165 -1744 65 -2206 131 -392 165 -398 95 -594 97 -864 197 -632 99 -66 101 -364 331 -494 65 -1024 197 -762 165 -200 133 -298 229 -524 97 -560 97 -98 297 -522 65 -166 165 -360 195 -1514 229 -896 99 -562 261 -1552 195 -1422 263 -98 167 -396 99 -4540 165 -266 67 -398 97 -1660 263 -230 131 -1092 99 -134 65 -464 231 -98 99 -1458 97 -5494 99 -3342 65 -432 99 -2910 131 -1492 99 -3612 65 -1684 197 -1608 195 -996 65 -132 99 -1728 165 -1196 65 -862 131 -626 231 -796 65 -732 165 -1462 197 -2710 65 -790 97 -3198 165 -1778 65 -4158 165 -100 229 -5170 133 -2622 65 -3872 97 -754 165 -1260 365 -100 133 -98 133 -98 199 -562 131 -262 165 -1216 197 -230 131 -1612 165 -528 163 -228 63 -264 97 -328 99 -728 299 -758 163 -164 327 -228 65 -164 RAW_Data: 197 -130 65 -264 163 -462 231 -100 65 -296 163 -196 97 -262 163 -728 299 -462 299 -1492 165 -200 99 -232 65 -1054 2385 -100 395 -132 99 -664 99 -132 365 -596 99 -794 329 -564 133 -298 165 -166 235 -366 229 -132 163 -590 197 -66 197 -1252 293 -262 129 -592 259 -232 163 -526 65 -230 165 -368 101 -1160 99 -826 97 -396 65 -198 3377 -66 791 -100 133 -168 99 -166 199 -100 465 -230 67 -400 197 -396 295 -1310 791 -1228 229 -560 65 -264 129 -326 199 -332 99 -264 65 -426 293 -132 197 -1316 99 -754 131 -822 197 -66 97 -460 65 -756 295 -166 3453 -198 65 -800 97 -100 199 -462 99 -198 67 -66 135 -298 299 -302 65 -300 99 -598 531 -466 233 -234 395 -200 133 -962 99 -100 199 -928 99 -628 97 -100 97 -730 99 -696 233 -528 67 -98 67 -694 365 -198 67 -896 295 -1484 97 -626 2563 -66 525 -100 561 -166 163 -232 265 -396 67 -234 99 -166 495 -166 97 -134 231 -132 133 -436 263 -298 97 -264 129 -230 65 -164 131 -164 393 -98 99 -294 65 -426 261 -264 131 -362 97 -196 65 -462 131 -1906 97 -260 65 -394 129 -660 133 -132 165 -264 231 -730 99 -560 197 -790 65 -896 65 -200 99 -764 261 -404 165 -164 165 -100 97 -164 395 -98 97 -164 99 -98 131 -132 163 -562 229 -532 99 -198 65 -332 99 -200 301 -330 165 -200 99 -928 2555 -362 731 -464 165 -492 165 -134 131 -732 131 -494 99 -164 99 -362 97 -166 97 -362 97 -134 97 -134 131 -166 99 -166 133 -468 329 -296 133 -1198 65 -2178 229 -3362 131 -1792 65 -7008 99 -164 65 -1448 65 -590 65 -134 67 -498 131 -1228 131 -532 131 -132 67 -364 65 -2128 165 -2358 99 -1526 265 -1154 65 -2240 97 -558 65 -2306 605 -1000 999 -1008 1035 -1510 513 -482 1531 -1496 543 -496 1507 -510 1529 -1514 511 -990 1007 -1002 1047 -984 1015 -492 1537 -512 1499 -1020 1011 -490 1539 -1000 1033 -988 1039 -476 1549 -474 1533 -1018 1001 -60188 1493 -1592 449 -1046 949 -1598 439 -564 1455 -552 1475 -548 1505 -1020 975 -544 1497 -1530 511 -1500 513 -1008 1003 -1540 507 -1512 501 -1022 1011 -1014 985 -1532 513 -500 1509 -1534 505 -522 1479 -528 1507 -59194 517 -1006 1017 -1006 1003 -1508 537 -482 1535 -1508 509 -512 1497 -520 1505 -1520 513 -1006 1033 -988 1039 -1006 1015 -480 1533 -490 1525 -1006 1035 -486 1539 -1014 987 -1018 1033 -484 1541 -484 1517 -1016 999 -60216 1481 -1620 387 -1118 923 -1602 431 -556 1481 -556 1447 -578 1467 -1048 977 -520 1505 -1542 499 -1516 481 -1048 989 -1544 493 -1516 515 -1010 1017 -986 1033 -1508 507 -514 RAW_Data: 1495 -1514 509 -528 1509 -516 1503 -59178 493 -1064 983 -1050 983 -1534 479 -540 1487 -1544 481 -520 1501 -518 1511 -1544 487 -1012 1019 -1010 1013 -1016 1003 -514 1519 -478 1531 -1016 1001 -514 1533 -1012 1003 -1000 1035 -486 1517 -524 1513 -1012 1019 -60160 1525 -1580 443 -1070 929 -1580 451 -556 1505 -548 1467 -520 1511 -1020 999 -514 1527 -1502 505 -1512 511 -1012 1021 -1508 517 -1518 513 -1006 1017 -1006 1001 -1512 511 -514 1527 -1500 507 -524 1517 -486 1535 -59184 527 -1018 993 -1016 1013 -1516 511 -508 1495 -1538 491 -520 1511 -522 1507 -1534 473 -1016 1011 -1024 1007 -1008 1001 -518 1515 -524 1507 -1008 1001 -520 1501 -1026 1009 -1008 1031 -508 1495 -518 1507 -1046 975 -60196 1551 -1516 483 -1050 989 -1532 497 -522 1511 -484 1511 -518 1509 -1044 1007 -484 1517 -1544 495 -1508 509 -1010 1017 -1514 503 -1516 515 -1012 1017 -1018 1005 -1512 515 -482 1529 -1514 503 -524 1505 -512 1499 -135388 65 -928 99 -3478 197 -164 131 -558 65 -1120 131 -2416 265 -1562 99 -4088 133 -1460 165 -202 65 -1428 97 -1518 199 -332 133 -2388 197 -1590 67 -2016 133 -1624 97 -1094 65 -1692 99 -3458 163 -570 131 -4418 229 -296 97 -198 97 -164 297 -132 461 -164 163 -1284 299 -332 131 -1064 133 -796 67 -232 67 -264 201 -432 133 -330 133 -198 99 -166 99 -768 65 -462 133 -98 99 -100 397 -1228 133 -532 65 -5202 163 -2542 99 -766 263 -1686 65 -298 67 -1230 65 -266 197 -262 163 -1296 229 -1742 65 -1054 65 -2286 133 -366 165 -2936 229 -1158 167 -198 67 -3148 263 -3174 165 -1720 133 -1766 131 -5204 163 -1814 67 -1664 65 -4348 97 -364 131 -1532 267 -3838 163 -1348 65 -3364 231 -3336 65 -100 97 -466 65 -730 67 -3524 129 -296 163 -1118 97 -66 231 -786 131 -262 97 -428 429 -528 195 -68 165 -964 99 -366 295 -460 99 -930 197 -300 99 -598 63 -600 131 -430 131 -66 131 -762 363 -1554 99 -168 135 -1452 65 -466 165 -692 99 -296 131 -592 97 -726 131 -134 97 -3000 99 -1608 131 -492 65 -854 193 -1058 99 -498 99 -1694 65 -996 199 -530 97 -1582 165 -1718 131 -3418 131 -1592 267 -1622 99 -530 99 -466 197 -5108 131 -100 67 -1656 95 -1318 65 -3530 133 -1196 65 -1886 131 -490 165 -2222 197 -1694 97 -2076 65 -1022 65 -758 163 -98 97 -164 97 -198 63 -688 97 -1086 65 -1614 65 -1822 67 -1028 133 -398 99 -430 131 -2932 165 -1122 99 -334 297 -2028 65 -1392 97 -622 131 -296 99 -100 165 -100 199 -100 99 -300 497 -100 197 -302 265 -102 99 -1428 165 -168 297 -234 65 -798 131 -68 197 -466 165 -230 67 -132 99 -166 167 -598 231 -264 RAW_Data: 265 -136 233 -764 165 -100 297 -232 67 -166 2513 -66 1745 -232 165 -436 99 -366 131 -466 99 -468 199 -466 131 -102 527 -764 99 -98 199 -166 133 -266 133 -166 99 -68 197 -434 65 -268 231 -132 131 -200 65 -330 65 -200 131 -232 165 -134 65 -1160 97 -134 99 -200 99 -1200 429 -920 97 -590 2475 -132 1095 -132 133 -66 233 -430 167 -168 429 -166 427 -164 423 -66 99 -230 229 -262 325 -164 65 -330 129 -132 231 -300 329 -332 133 -462 197 -564 99 -996 67 -264 233 -764 99 -98 299 -1462 363 -824 133 -132 99 -298 99 -100 197 -68 65 -132 4251 -132 67 -234 133 -166 199 -100 131 -200 131 -198 67 -330 199 -364 197 -298 99 -66 199 -268 197 -298 397 -430 131 -528 99 -266 231 -328 595 -402 65 -500 129 -298 229 -64 99 -1290 231 -822 229 -328 131 -1116 263 -228 361 -862 99 -66 133 -796 65 -698 3715 -166 463 -564 97 -198 97 -132 97 -230 295 -98 229 -330 393 -164 131 -230 297 -526 229 -98 97 -66 363 -722 295 -64 163 -400 167 -762 363 -66 165 -234 133 -864 97 -798 65 -332 431 -498 65 -928 197 -68 133 -266 165 -594 65 -200 99 -464 265 -230 2321 -196 1857 -98 297 -132 431 -266 431 -462 131 -100 397 -330 65 -364 65 -432 229 -166 297 -66 295 -954 163 -626 163 -526 495 -466 201 -660 327 -666 131 -998 197 -166 67 -468 97 -564 99 -1460 163 -926 299 -926 99 -598 133 -498 67 -232 199 -828 131 -1328 327 -166 99 -598 231 -402 65 -132 65 -566 97 -264 167 -1560 67 -1330 67 -858 65 -1366 131 -2754 99 -1786 131 -5130 195 -164 67 -134 131 -1984 65 -1286 97 -294 99 -228 65 -1062 65 -3418 131 -68 131 -1096 563 -1016 975 -1042 983 -1046 1005 -1516 485 -518 1531 -518 1507 -1514 515 -1014 989 -1516 523 -1016 1007 -1506 505 -1002 1011 -1520 511 -1012 1017 -1000 1005 -1532 513 -510 1499 -518 1497 -1018 1035 -1510 481 -60186 1543 -1514 513 -1014 987 -1518 527 -486 1537 -1008 999 -1018 1009 -1520 513 -1506 519 -1018 991 -516 1503 -520 1515 -1512 527 -1512 481 -1016 1019 -1008 1021 -1506 521 -992 1037 -510 1491 -1010 1017 -1512 507 -59178 481 -1116 879 -1138 897 -1118 915 -1614 409 -608 1423 -586 1441 -1580 441 -1070 957 -1580 455 -1044 1007 -1528 479 -1040 1003 -1518 481 -1034 1017 -1008 1015 -1520 481 -506 1521 -514 1507 -1016 1007 -1518 511 -60172 459 -4210 815 -1730 299 -658 1411 -1108 941 -1074 945 -1562 483 -1542 493 -1012 1005 -526 1507 -512 1497 -1520 513 -1524 511 -1004 1001 -1014 1029 -1494 515 -1002 1043 -478 1529 -1018 1001 -1538 495 -59140 529 -7690 365 -624 RAW_Data: 1381 -658 1397 -1602 423 -1114 911 -1582 441 -1070 955 -1572 481 -1036 971 -1566 479 -1034 981 -1012 1015 -1514 505 -530 1513 -516 1511 -1018 1007 -1514 481 -60210 459 -7710 1381 -1140 903 -1126 915 -1602 415 -1588 443 -1060 983 -550 1475 -550 1469 -1558 479 -1540 493 -1018 1005 -1018 1009 -1506 503 -1006 1037 -484 1535 -1010 1017 -1518 497 -59168 525 -1008 997 -1046 1009 -1016 989 -1510 527 -486 1539 -480 1527 -1532 515 -1006 1011 -1506 519 -990 1019 -1534 479 -1042 1015 -1512 477 -1026 1009 -1010 1015 -1512 507 -526 1513 -484 1543 -1018 1003 -1510 509 -60172 1509 -1612 389 -1104 939 -1596 419 -582 1471 -1074 961 -1040 991 -1542 453 -1548 481 -1038 1017 -514 1505 -492 1543 -1502 515 -1506 515 -1002 1033 -986 1035 -1514 481 -1016 1027 -518 1503 -1014 1011 -1514 521 -133944 165 -1586 97 -294 63 -5014 99 -492 231 -1222 65 -396 131 -3086 99 -1920 65 -266 129 -1918 65 -922 195 -1908 65 -2080 97 -1894 99 -1558 165 -1424 165 -5468 99 -1694 65 -1756 65 -1812 99 -490 65 -1710 229 -98 99 -132 131 -992 99 -168 131 -68 65 -2322 199 -1888 133 -132 199 -800 97 -662 201 -666 97 -134 65 -132 65 -134 133 -166 199 -396 65 -558 231 -330 99 -692 199 -264 133 -332 99 -268 65 -366 231 -732 163 -264 327 -132 129 -132 99 -724 367 -234 133 -130 363 -598 331 -166 199 -1068 299 -466 99 -2822 65 -66 131 -1562 65 -1684 131 -556 99 -198 199 -1254 99 -1032 65 -1296 65 -100 133 -1330 65 -1058 65 -1096 65 -632 65 -1856 65 -134 163 -890 65 -1646 65 -664 65 -528 65 -392 99 -1624 165 -496 99 -1428 129 -2826 65 -466 65 -864 65 -4422 131 -1926 99 -1466 131 -6930 99 -894 131 -1754 97 -1640 65 -66 97 -396 99 -130 65 -1086 99 -756 65 -198 65 -2188 261 -1594 131 -1722 65 -130 97 -6642 97 -134 131 -2376 67 -1590 65 -66 65 -998 165 -930 165 -264 65 -132 65 -296 97 -558 65 -66 99 -1086 363 -230 131 -1194 165 -1490 231 -166 133 -636 229 -428 363 -826 261 -130 97 -132 97 -164 131 -66 131 -2902 359 -1518 165 -598 133 -990 161 -396 301 -5214 261 -2776 65 -2326 99 -1698 65 -1618 99 -1358 65 -3480 231 -1558 131 -4656 97 -1554 65 -166 199 -200 201 -926 99 -664 133 -1656 229 -98 99 -1030 99 -1656 131 -1294 67 -396 131 -3038 165 -332 427 -230 361 -266 1027 -166 329 -166 265 -100 67 -230 799 -166 135 -200 631 -298 99 -168 297 -464 497 -264 429 -66 597 -164 197 -200 67 -232 97 -300 595 -132 165 -234 163 -100 65 -432 65 -4370 65 -722 131 -1688 131 -398 65 -1162 199 -2120 263 -1098 133 -758 RAW_Data: 99 -296 97 -300 231 -200 133 -364 163 -532 199 -536 265 -762 399 -66 131 -332 99 -466 97 -132 431 -198 131 -100 131 -234 465 -164 231 -564 131 -398 131 -334 301 -132 99 -132 131 -498 65 -462 99 -1094 65 -66 99 -266 99 -800 65 -432 65 -562 65 -792 65 -166 99 -1230 131 -1248 65 -770 197 -1260 1985 -134 747 -66 655 -198 99 -530 299 -198 65 -166 299 -134 131 -200 531 -328 131 -624 165 -98 97 -230 97 -560 97 -560 131 -1654 131 -200 65 -166 99 -666 297 -796 67 -132 297 -664 199 -100 65 -532 131 -168 65 -466 165 -728 131 -624 2073 -166 233 -168 863 -166 131 -464 463 -100 131 -266 165 -196 399 -330 563 -632 65 -232 97 -66 131 -166 129 -98 131 -1386 99 -462 131 -1254 131 -1548 231 -824 65 -198 265 -996 99 -1062 231 -862 329 -264 261 -658 2367 -66 631 -98 859 -230 231 -558 129 -396 129 -66 297 -98 201 -134 131 -166 231 -162 295 -432 263 -66 331 -1384 65 -198 197 -98 131 -228 65 -132 65 -692 261 -560 97 -262 163 -232 99 -132 99 -134 65 -200 133 -132 99 -798 231 -1624 131 -498 67 -630 99 -300 165 -1126 293 -694 65 -98 65 -100 2267 -98 393 -494 197 -426 131 -166 67 -198 199 -266 429 -166 65 -300 131 -66 65 -232 133 -102 365 -134 97 -332 67 -232 331 -66 363 -366 97 -796 65 -166 165 -1260 263 -164 99 -266 527 -758 65 -428 197 -564 65 -366 429 -166 267 -830 133 -598 333 -666 65 -134 197 -398 97 -132 65 -168 133 -502 65 -364 131 -98 65 -630 197 -166 129 -822 65 -230 295 -64 65 -164 65 -790 97 -230 129 -364 163 -330 131 -132 65 -230 67 -166 97 -66 165 -632 231 -264 97 -294 99 -856 229 -694 261 -1546 97 -2076 65 -462 133 -5548 199 -732 99 -4170 133 -1232 99 -164 165 -1656 65 -766 167 -2258 163 -1610 197 -2020 99 -2518 131 -1020 65 -364 97 -200 97 -1664 163 -526 65 -1096 165 -1684 65 -986 99 -4860 131 -966 131 -1622 65 -1658 65 -1266 97 -266 165 -200 99 -964 99 -330 65 -3440 131 -166 99 -68 65 -1164 65 -132 99 -200 67 -792 163 -496 99 -860 427 -492 195 -230 99 -466 163 -1364 295 -132 165 -364 67 -1026 231 -370 65 -566 65 -530 363 -196 97 -164 97 -594 63 -164 165 -228 163 -66 233 -862 97 -692 65 -1744 163 -1416 67 -132 99 -1718 65 -556 131 -496 99 -1328 99 -132 167 -466 131 -4690 165 -1654 65 -1114 263 -1620 65 -1796 97 -1426 99 -1922 99 -7098 97 -466 131 -1578 131 -2384 165 -298 133 -766 131 -330 295 -2348 RAW_Data: 131 -534 99 -798 2211 -134 297 -66 361 -66 197 -198 97 -398 199 -100 163 -100 65 -464 133 -134 233 -68 229 -696 199 -200 265 -330 65 -1218 163 -166 97 -426 229 -698 165 -100 99 -134 165 -372 65 -1426 65 -266 99 -794 65 -832 199 -464 165 -698 99 -266 165 -794 99 -298 133 -734 165 -266 99 -864 131 -232 1893 -166 1465 -1484 263 -560 99 -230 65 -462 197 -66 97 -890 165 -130 97 -132 163 -232 97 -132 161 -162 263 -262 99 -362 65 -432 65 -830 97 -234 99 -628 199 -66 99 -166 101 -268 265 -594 131 -1030 97 -1156 595 -800 167 -1920 65 -464 165 -264 131 -66 167 -134 233 -632 329 -100 97 -166 199 -466 199 -98 267 -200 97 -266 199 -300 65 -496 563 -100 101 -166 165 -730 233 -166 131 -590 97 -232 131 -164 359 -428 3159 -792 65 -624 197 -98 229 -132 393 -398 199 -200 133 -366 99 -132 67 -528 265 -730 197 -166 65 -200 397 -1358 131 -1712 363 -1462 299 -132 67 -1792 65 -794 99 -368 131 -134 165 -134 67 -266 265 -430 2315 -98 1473 -100 129 -66 229 -198 261 -166 97 -426 97 -100 229 -496 197 -162 163 -392 231 -166 229 -660 131 -366 297 -166 299 -232 97 -332 301 -866 133 -596 267 -364 99 -502 99 -1988 131 -134 65 -66 165 -366 231 -266 165 -690 99 -234 65 -498 67 -166 133 -762 2459 -166 1019 -264 99 -200 265 -562 65 -328 295 -330 197 -360 131 -98 227 -232 65 -426 259 -166 99 -496 131 -500 399 -992 67 -432 133 -66 99 -1394 231 -1524 133 -430 65 -886 65 -1716 131 -2818 63 -430 229 -296 97 -1706 131 -164 65 -1478 131 -458 99 -1568 165 -756 197 -890 99 -1088 359 -660 97 -98 229 -166 65 -500 99 -266 65 -566 65 -432 365 -200 99 -798 99 -296 327 -1218 165 -132 99 -466 165 -168 133 -632 363 -1482 163 -802 131 -862 133 -1332 65 -100 431 -830 97 -596 165 -3422 99 -896 65 -766 97 -3766 65 -132 65 -1152 163 -1810 99 -230 97 -654 229 -458 165 -200 67 -166 297 -134 99 -4840 133 -762 67 -764 231 -1248 97 -1780 97 -3332 65 -100 261 -1186 99 -3360 99 -364 97 -1738 163 -294 97 -4918 129 -1550 295 -1028 199 -1264 99 -1560 99 -2156 167 -1556 231 -1852 167 -998 67 -1116 65 -562 167 -334 133 -266 165 -394 99 -166 97 -3082 99 -232 301 -5148 131 -502 67 -732 197 -434 199 -200 99 -432 65 -232 199 -464 133 -1060 97 -1582 97 -98 97 -924 129 -462 229 -560 65 -132 97 -166 161 -164 97 -166 229 -360 97 -132 63 -198 131 -162 525 -1714 67 -732 99 -958 RAW_Data: 65 -1166 165 -200 199 -166 133 -100 65 -1294 99 -166 265 -992 297 -728 65 -332 431 -166 261 -132 65 -132 65 -98 363 -230 163 -430 165 -230 129 -660 129 -66 131 -398 2453 -132 1329 -166 1187 -232 1657 -166 499 -68 99 -132 233 -894 99 -232 99 -134 363 -628 67 -998 131 -234 99 -266 197 -398 97 -200 167 -334 197 -430 429 -168 263 -1160 99 -364 131 -264 97 -1318 131 -790 99 -432 131 -132 199 -100 131 -930 133 -1424 99 -398 165 -1486 299 -166 165 -334 2325 -66 795 -102 397 -100 533 -100 429 -98 131 -464 65 -532 329 -366 165 -332 99 -432 295 -132 99 -662 67 -332 331 -1226 131 -102 199 -562 469 -430 97 -232 63 -328 65 -1914 133 -466 131 -832 163 -1660 331 -464 199 -828 131 -696 65 -132 2139 -66 2051 -66 263 -790 99 -566 429 -428 99 -330 297 -698 65 -200 197 -68 461 -1292 131 -168 165 -634 131 -234 133 -594 163 -360 165 -700 99 -964 133 -1026 65 -532 197 -1520 263 -688 65 -888 295 -658 65 -824 67 -598 97 -426 65 -130 161 -132 63 -658 99 -64 165 -522 199 -298 65 -428 197 -560 65 -200 165 -100 167 -594 229 -100 297 -268 65 -100 459 -200 97 -334 2997 -200 597 -498 97 -626 97 -134 363 -166 333 -266 65 -664 331 -300 299 -568 529 -662 263 -626 67 -594 99 -266 165 -230 361 -462 67 -66 131 -694 397 -1490 167 -132 165 -768 165 -130 165 -466 99 -298 99 -952 163 -428 97 -296 97 -360 99 -196 65 -658 65 -4052 229 -6240 165 -228 65 -426 99 -994 99 -398 363 -1512 161 -2042 65 -592 131 -2866 65 -500 167 -5246 97 -462 67 -1156 99 -2428 99 -960 65 -132 99 -164 65 -166 329 -2484 263 -232 67 -1368 99 -996 267 -498 67 -4612 131 -4866 65 -100 363 -464 231 -264 231 -262 297 -1594 99 -1596 65 -136 133 -1662 67 -1694 429 -1290 197 -198 293 -858 99 -1976 165 -66 97 -460 131 -460 97 -328 163 -1624 397 -300 67 -166 97 -430 299 -300 299 -1792 65 -4438 131 -622 67 -500 131 -1064 65 -400 65 -426 261 -1644 131 -3468 165 -1684 99 -866 101 -66 231 -464 65 -498 133 -492 97 -1712 99 -98 197 -66 265 -1586 199 -1334 99 -1948 97 -200 99 -266 65 -666 131 -132 99 -264 195 -3066 99 -3512 99 -1746 65 -598 97 -6068 167 -600 99 -1262 65 -166 65 -134 65 -132 131 -1520 99 -1254 97 -1828 197 -1294 129 -66 65 -1248 97 -754 165 -6542 231 -662 197 -560 359 -98 97 -130 99 -3080 63 -952 129 -296 65 -230 63 -428 99 -1788 133 -100 65 -462 199 -66 165 -1094 99 -66 RAW_Data: 167 -3190 265 -1128 195 -298 525 -166 65 -594 597 -664 131 -498 165 -232 65 -296 129 -296 65 -494 297 -498 297 -596 201 -332 2027 -132 593 -68 891 -66 893 -98 365 -396 97 -398 99 -300 199 -366 163 -598 99 -100 131 -234 65 -132 331 -532 165 -166 231 -1660 133 -532 265 -100 131 -100 131 -298 199 -396 199 -334 197 -166 67 -334 131 -1662 165 -298 97 -534 65 -628 65 -534 65 -266 97 -826 133 -696 65 -294 233 -198 165 -134 2081 -66 929 -198 167 -300 99 -232 297 -234 199 -662 67 -166 99 -66 233 -132 433 -232 265 -300 297 -132 65 -132 97 -496 199 -360 465 -132 65 -132 297 -460 293 -64 161 -262 97 -492 199 -200 233 -132 97 -396 99 -858 199 -864 65 -66 99 -532 131 -1608 297 -1550 163 -432 229 -66 163 -394 1953 -134 1491 -100 991 -66 165 -232 265 -130 299 -432 167 -724 363 -134 167 -200 231 -66 199 -98 395 -66 165 -266 99 -332 197 -268 265 -466 265 -166 493 -362 65 -132 99 -360 199 -200 133 -758 99 -330 165 -298 163 -428 199 -368 165 -334 131 -500 163 -986 97 -394 329 -196 97 -558 195 -230 97 -532 2373 -232 165 -232 795 -132 267 -168 363 -166 297 -298 131 -134 65 -466 131 -464 65 -232 67 -266 229 -364 231 -232 297 -464 65 -198 133 -398 529 -134 65 -364 163 -732 233 -298 299 -134 231 -66 129 -264 397 -132 131 -200 329 -430 131 -132 265 -1292 65 -362 131 -264 97 -1020 165 -398 131 -364 65 -300 265 -924 195 -396 331 -166 167 -132 433 -198 99 -464 297 -266 165 -396 131 -1226 165 -694 65 -230 197 -896 65 -594 2969 -164 461 -298 133 -330 133 -234 65 -134 131 -66 65 -68 97 -66 99 -132 231 -694 363 -298 267 -268 231 -368 131 -300 99 -134 65 -166 461 -396 263 -66 165 -298 131 -66 229 -1644 163 -1610 229 -658 97 -132 129 -162 97 -428 65 -66 129 -1912 65 -1194 233 -2218 133 -360 65 -132 229 -3428 65 -262 65 -3208 133 -1224 99 -296 65 -2212 65 -496 65 -200 199 -498 65 -1144 65 -1764 165 -1726 65 -434 65 -898 165 -2354 67 -134 99 -464 99 -792 263 -954 1161 -100 295 -296 131 -132 457 -462 363 -200 725 -298 131 -134 231 -68 531 -166 667 -298 99 -66 595 -794 165 -202 199 -68 99 -298 165 -68 231 -202 201 -200 97 -1360 197 -266 165 -334 99 -234 165 -200 165 -100 131 -664 65 -566 397 -100 165 -132 199 -132 165 -988 197 -394 99 -164 65 -294 99 -262 63 -1288 233 -132 199 -168 265 -64 99 -728 133 -1192 65 -334 165 -132 199 -200 RAW_Data: 131 -400 65 -398 165 -866 131 -264 393 -1680 231 -1494 299 -894 265 -364 65 -132 131 -960 99 -296 165 -824 65 -1716 99 -664 97 -134 165 -1526 165 -634 131 -166 135 -466 231 -696 2331 -100 329 -100 961 -198 65 -164 199 -98 331 -132 65 -298 731 -66 163 -332 265 -894 65 -132 265 -300 97 -334 229 -100 65 -1026 233 -366 329 -922 99 -266 329 -428 97 -462 361 -758 163 -1886 65 -498 229 -558 65 -600 267 -68 65 -1592 133 -202 2299 -332 393 -132 329 -326 231 -232 97 -590 231 -136 201 -1226 265 -530 199 -134 65 -232 297 -398 65 -564 65 -1458 65 -500 99 -302 99 -1120 65 -66 131 -98 197 -66 133 -66 65 -730 99 -200 197 -730 165 -664 297 -1462 165 -664 133 -168 65 -168 133 -368 197 -466 1957 -66 1525 -266 131 -366 65 -394 65 -98 163 -296 99 -130 265 -696 65 -398 131 -1128 197 -134 67 -894 97 -296 231 -166 401 -98 131 -928 265 -398 131 -798 131 -298 165 -830 65 -230 231 -168 97 -1252 131 -590 65 -460 229 -692 97 -332 65 -366 265 -732 2297 -66 197 -66 131 -166 231 -100 99 -298 365 -168 361 -130 129 -66 161 -198 97 -626 593 -66 99 -98 99 -556 297 -132 65 -134 65 -526 295 -196 197 -68 163 -264 327 -130 855 -66 393 -132 131 -100 65 -98 227 -164 197 -758 131 -268 99 -430 65 -1686 131 -1652 197 -788 63 -726 165 -100 131 -264 197 -1026 197 -1250 131 -1650 65 -1980 97 -132 63 -1424 97 -198 99 -100 65 -1090 65 -398 99 -1686 99 -754 63 -1714 97 -1842 65 -2988 65 -4980 165 -1624 65 -232 67 -1464 65 -3048 65 -166 97 -1986 65 -1062 99 -862 131 -2732 99 -2360 97 -1620 65 -1326 65 -330 197 -3238 67 -266 131 -2968 67 -132 135 -1688 131 -1718 97 -1648 65 -166 65 -1292 65 -1908 99 -424 131 -1222 197 -798 99 -700 97 -1758 165 -1562 99 -396 165 -166 99 -98 65 -366 65 -762 131 -332 233 -498 133 -98 163 -562 65 -68 131 -858 65 -896 65 -366 233 -532 197 -168 65 -68 65 -630 195 -724 231 -296 361 -164 261 -2862 233 -232 99 -3186 67 -232 163 -496 165 -1620 97 -1622 131 -7022 267 -268 165 -466 63 -528 295 -200 197 -332 65 -1656 131 -5478 65 -1296 99 -130 161 -694 67 -1694 131 -734 99 -2590 99 -1056 65 -432 327 -66 165 -164 65 -1120 229 -1656 165 -1128 131 -1232 99 -1560 65 -568 131 -360 231 -1598 99 -3250 67 -1818 65 -1216 263 -3328 65 -1508 133 -2600 65 -528 65 -2418 65 -460 97 -100 97 -164 65 -1560 133 -1822 163 -296 165 -1090 165 -168 133 -1264 RAW_Data: 229 -1458 165 -66 133 -1626 197 -132 65 -394 65 -724 229 -132 65 -200 263 -296 97 -264 131 -130 229 -132 161 -1230 431 -132 99 -234 233 -362 99 -698 67 -334 65 -366 299 -398 99 -328 131 -396 165 -1458 99 -926 2239 -66 763 -68 1727 -266 65 -364 65 -464 365 -366 97 -664 165 -200 265 -234 261 -264 395 -362 329 -690 261 -164 495 -232 131 -326 165 -264 99 -198 397 -928 299 -268 299 -166 99 -298 167 -436 65 -266 67 -498 231 -896 367 -428 97 -332 133 -628 165 -1394 231 -926 131 -232 3127 -132 921 -428 263 -66 97 -230 97 -1022 329 -430 97 -166 65 -198 63 -100 65 -66 97 -66 361 -132 67 -232 131 -268 99 -366 99 -98 331 -364 99 -428 97 -66 491 -164 99 -164 65 -428 131 -260 429 -1380 263 -1564 65 -300 65 -498 99 -364 167 -200 231 -264 67 -264 365 -266 231 -262 65 -724 65 -130 2213 -130 361 -166 2065 -166 165 -100 133 -264 299 -332 99 -98 229 -198 65 -328 131 -100 263 -628 131 -330 231 -98 65 -132 129 -264 65 -130 163 -692 131 -66 99 -532 133 -234 99 -232 367 -298 401 -702 165 -498 399 -166 65 -132 131 -400 165 -1232 165 -1296 65 -232 165 -300 97 -396 2033 -198 463 -230 67 -68 563 -262 295 -330 197 -1190 197 -66 167 -66 263 -430 263 -100 163 -198 167 -102 165 -100 99 -234 67 -66 267 -396 197 -296 131 -1190 331 -200 67 -234 231 -530 263 -1610 263 -264 329 -196 129 -98 131 -132 227 -132 425 -526 129 -694 299 -856 63 -132 165 -166 165 -436 297 -1430 65 -66 99 -198 167 -266 65 -864 267 -996 65 -500 265 -1456 297 -726 163 -66 579 -1508 523 -1504 509 -1006 1033 -486 1513 -1514 507 -510 1537 -982 1011 -528 1509 -512 1495 -1034 999 -1016 999 -516 1539 -1014 989 -1510 527 -486 1537 -1508 517 -1512 485 -1546 483 -524 1519 -484 1529 -60168 1539 -1506 507 -1006 1015 -1016 1007 -1512 509 -1006 1033 -506 1495 -1544 497 -1014 1007 -1008 1001 -1544 477 -1024 1011 -1538 485 -1512 525 -1010 1005 -482 1529 -1018 1005 -1020 1009 -1532 475 -540 1507 -512 1491 -59188 513 -1506 515 -1512 519 -1020 985 -506 1519 -1538 491 -504 1533 -998 1013 -516 1505 -522 1505 -1018 1005 -1002 1035 -494 1525 -1014 995 -1546 483 -524 1513 -1504 515 -1502 509 -1512 509 -514 1527 -514 1501 -60186 1539 -1506 509 -1008 1003 -1016 1009 -1520 515 -1014 989 -518 1509 -1544 485 -1016 999 -1016 1003 -1544 483 -1016 1017 -1506 515 -1534 475 -1036 987 -520 1507 -1012 1035 -1006 1017 -1502 503 -526 1503 -508 1533 -59160 523 -1508 507 -1502 537 -984 1013 -528 1505 -1504 503 -520 1537 -994 RAW_Data: 1007 -508 1533 -474 1527 -1008 1037 -1012 1003 -510 1503 -1018 1009 -1518 513 -514 1495 -1546 477 -1520 509 -1528 505 -492 1527 -520 1505 -60188 1543 -1514 483 -1044 1001 -1000 1009 -1520 513 -1012 1019 -508 1505 -1516 515 -1008 999 -1016 1007 -1516 513 -1010 1017 -1514 503 -1520 513 -1008 1001 -530 1495 -1012 1021 -1010 1001 -1530 503 -518 1507 -516 1507 -59162 517 -1554 479 -1540 493 -1034 981 -538 1483 -1534 505 -506 1497 -1038 1007 -488 1537 -484 1539 -1020 1007 -1016 1009 -484 1539 -1000 1005 -1532 511 -480 1535 -1514 513 -1504 515 -1508 519 -494 1529 -486 1535 -60182 1515 -1556 479 -1044 983 -1016 1005 -1512 507 -1036 1001 -488 1529 -1536 495 -1020 1009 -1010 1017 -1510 487 -1014 1039 -1510 505 -1510 521 -980 1039 -484 1539 -986 1039 -1016 1007 -1504 503 -520 1507 -516 1507 -131494 295 -198 195 -98 99 -362 97 -196 165 -130 233 -1528 197 -1756 165 -1024 129 -326 97 -1794 131 -1562 65 -1692 99 -100 99 -532 99 -1728 231 -5256 65 -7488 133 -164 133 -100 97 -266 327 -166 99 -1294 131 -628 97 -502 163 -1122 131 -856 65 -1480 63 -3748 131 -1356 65 -1152 99 -2316 131 -2640 65 -798 131 -2520 99 -66 133 -5954 129 -1680 131 -3458 131 -1086 65 -532 67 -632 165 -3482 65 -1024 163 -2800 65 -362 197 -1880 97 -494 99 -100 65 -1120 131 -3212 299 -266 99 -698 329 -1328 165 -66 133 -534 131 -794 227 -990 65 -164 133 -130 131 -198 65 -196 63 -66 165 -196 131 -98 329 -298 99 -230 65 -164 425 -100 523 -266 65 -1686 65 -1182 163 -3614 131 -3386 133 -6578 65 -432 231 -1682 131 -1680 99 -588 99 -2222 97 -364 131 -5214 131 -698 133 -394 327 -296 295 -396 199 -1256 131 -1190 99 -234 65 -3596 163 -2036 163 -660 133 -430 199 -800 67 -2854 165 -3516 99 -1660 131 -1596 99 -1726 133 -2326 65 -168 65 -530 165 -166 67 -1384 229 -494 165 -1248 99 -1224 65 -1624 99 -468 233 -4386 165 -1264 133 -762 65 -296 229 -1678 165 -1518 163 -1580 65 -132 65 -530 261 -166 161 -428 199 -134 99 -730 99 -558 99 -266 65 -1164 499 -468 131 -462 229 -362 131 -1480 327 -230 65 -732 65 -928 395 -298 65 -568 99 -232 99 -200 99 -1098 65 -3106 97 -266 99 -2356 67 -494 65 -1816 163 -390 165 -1032 67 -2308 165 -134 99 -1284 97 -1550 99 -494 97 -1326 97 -3530 65 -3702 99 -1382 231 -1228 165 -496 97 -968 265 -1452 99 -4736 131 -3916 65 -1282 65 -364 65 -3530 97 -1352 97 -1742 133 -5274 99 -3490 65 -3418 65 -1850 97 -2782 99 -1720 133 -2258 65 -100 65 -1620 65 -1160 65 -1558 99 -662 65 -1458 99 -230 129 -98 163 -392 RAW_Data: 129 -694 401 -1526 67 -298 65 -1258 231 -102 199 -298 99 -790 99 -100 97 -100 131 -100 97 -164 161 -266 65 -234 133 -132 299 -628 65 -702 197 -330 65 -962 231 -366 165 -330 133 -792 65 -628 2059 -196 633 -166 231 -264 97 -166 163 -336 231 -202 65 -266 65 -266 131 -134 99 -200 197 -330 165 -132 65 -200 99 -266 197 -264 97 -198 559 -66 163 -754 229 -98 65 -64 363 -164 229 -196 363 -426 231 -68 201 -1288 97 -634 331 -2022 99 -264 67 -166 197 -464 3065 -98 97 -132 97 -66 327 -132 853 -132 97 -164 99 -396 63 -100 393 -196 131 -1052 465 -1458 427 -198 97 -198 391 -262 65 -66 165 -494 131 -262 97 -264 97 -264 265 -168 197 -764 97 -232 163 -464 65 -66 131 -398 65 -896 133 -598 67 -430 165 -1230 165 -200 65 -1130 65 -198 263 -230 2753 -66 565 -100 1129 -132 99 -134 67 -532 99 -400 299 -166 131 -134 65 -464 231 -234 329 -132 231 -262 163 -132 65 -394 131 -98 131 -66 397 -100 65 -68 461 -198 99 -296 199 -500 231 -1552 195 -66 65 -1586 195 -1350 197 -1418 131 -488 2647 -396 229 -526 129 -262 97 -262 97 -328 165 -664 99 -166 99 -232 133 -234 131 -726 129 -130 65 -198 129 -132 161 -330 65 -426 97 -694 531 -364 99 -862 165 -694 301 -66 163 -302 65 -232 233 -700 65 -98 165 -628 65 -100 163 -1516 327 -362 65 -956 231 -626 131 -464 65 -232 99 -828 131 -164 99 -400 363 -1324 99 -264 97 -1560 101 -66 65 -464 65 -498 99 -300 297 -100 65 -200 65 -600 97 -166 2321 -100 603 -200 67 -468 299 -300 65 -100 133 -796 131 -66 67 -700 165 -432 97 -332 233 -534 197 -398 199 -166 297 -362 131 -1132 233 -562 165 -166 99 -530 197 -700 131 -856 133 -398 65 -892 97 -2990 65 -4596 99 -130 163 -1770 65 -2256 99 -860 65 -232 131 -1662 267 -232 101 -1166 165 -1160 99 -466 163 -100 97 -366 65 -2828 65 -1624 263 -1786 65 -164 131 -1214 131 -460 227 -2998 63 -494 67 -1658 97 -3456 65 -3618 99 -2554 99 -2484 231 -4088 97 -560 165 -296 129 -2144 197 -528 363 -166 231 -428 163 -296 197 -132 129 -1354 199 -664 163 -624 131 -98 131 -688 131 -590 263 -164 97 -494 197 -362 131 -298 133 -3478 65 -334 583 -1526 509 -1526 481 -514 1509 -1544 475 -1024 1011 -1012 1017 -506 1501 -528 1507 -1530 473 -538 1493 -520 1507 -1014 1011 -520 1515 -1512 491 -1046 1007 -482 1529 -1016 1007 -1512 507 -1004 1039 -990 1015 -60210 1503 -1524 513 -998 1015 -1542 483 -520 1505 -516 1507 -522 1519 -516 RAW_Data: 1503 -1508 487 -554 1477 -1526 513 -514 1501 -1028 1005 -1526 481 -514 1541 -518 1503 -498 1515 -1506 501 -1544 499 -1020 1005 -1002 1001 -59198 529 -1518 481 -1544 507 -514 1497 -1536 473 -1044 1001 -1018 1009 -490 1539 -482 1529 -1512 507 -526 1507 -512 1503 -1016 1011 -524 1513 -1504 505 -1020 1005 -526 1507 -1008 1001 -1530 517 -1010 1013 -1012 1013 -60178 1557 -1508 489 -1016 1009 -1522 513 -514 1505 -520 1513 -524 1505 -512 1499 -1546 475 -526 1513 -1506 505 -506 1527 -1014 997 -1542 483 -522 1513 -518 1503 -516 1501 -1534 505 -1508 523 -1012 1007 -1014 987 -59186 515 -1578 419 -1608 449 -544 1471 -1546 485 -1050 977 -1042 991 -518 1507 -524 1487 -1538 489 -518 1503 -518 1529 -1002 1005 -524 1511 -1508 503 -1008 1035 -486 1541 -1014 987 -1538 495 -1018 1007 -1008 1001 -60188 453 -4246 817 -1716 295 -674 1393 -594 1449 -586 1447 -546 1467 -1578 447 -550 1497 -1530 511 -510 1489 -1038 1003 -1514 513 -512 1525 -478 1535 -492 1525 -1506 515 -1534 475 -1014 1031 -1000 1011 -59180 507 -11528 557 -686 1341 -674 1363 -1646 383 -620 1409 -610 1431 -1090 947 -554 1477 -1566 477 -1032 981 -516 1505 -1016 1005 -1522 511 -1012 1019 -1020 1005 -60176 1469 -1672 337 -1166 889 -1606 449 -578 1439 -566 1485 -518 1509 -516 1503 -1546 479 -514 1497 -1528 511 -512 1523 -1008 1003 -1514 513 -512 1525 -478 1541 -486 1517 -1522 511 -1508 521 -1010 995 -1010 1033 -133296 65 -1252 99 -332 65 -1220 131 -594 129 -394 99 -1546 131 -856 65 -1494 433 -132 99 -334 263 -164 199 -198 133 -3348 131 -626 65 -2598 65 -66 99 -1284 131 -1588 197 -1664 63 -694 65 -2206 197 -134 131 -300 65 -1146 67 -3524 197 -296 99 -1226 65 -1360 131 -1620 165 -260 231 -786 131 -1018 129 -1224 131 -302 65 -796 129 -396 97 -1744 67 -464 67 -166 131 -766 99 -398 65 -98 233 -66 97 -396 65 -1096 65 -298 99 -500 99 -3474 99 -996 97 -232 67 -2218 197 -1420 131 -1692 297 -6442 99 -368 99 -366 131 -164 65 -2038 65 -232 99 -1526 233 -5196 65 -298 65 -498 65 -1064 263 -232 627 -364 67 -132 129 -728 131 -166 65 -200 133 -596 197 -232 197 -390 97 -1088 331 -496 99 -300 65 -430 265 -402 197 -164 163 -596 165 -430 199 -1026 99 -1460 133 -1394 99 -1998 165 -300 65 -2360 165 -600 65 -3364 197 -658 131 -6356 99 -530 97 -166 165 -200 131 -132 133 -600 65 -5300 67 -762 131 -860 97 -1480 67 -1814 99 -1330 65 -266 99 -1918 99 -1360 165 -234 133 -5506 99 -468 65 -1894 131 -98 65 -1624 99 -98 67 -1808 65 -230 63 -786 99 -1970 131 -3506 99 -196 163 -1058 99 -164 67 -1730 165 -3516 RAW_Data: 99 -666 99 -700 133 -98 133 -1086 163 -768 65 -1026 2523 -166 2747 -964 195 -362 265 -966 131 -198 197 -100 331 -330 65 -164 131 -528 163 -230 229 -68 97 -332 393 -134 197 -132 197 -330 165 -268 165 -198 133 -564 65 -232 233 -266 267 -432 199 -232 99 -66 131 -532 97 -132 299 -1252 133 -166 199 -796 99 -98 233 -398 197 -1590 163 -826 65 -764 165 -1658 163 -66 165 -698 165 -198 67 -164 99 -998 2029 -232 331 -100 691 -66 523 -98 561 -166 725 -560 65 -362 163 -132 395 -526 67 -166 67 -960 265 -298 131 -464 131 -200 329 -598 199 -132 163 -294 129 -754 99 -294 197 -432 165 -232 67 -202 99 -234 199 -326 163 -824 229 -132 259 -462 99 -266 65 -328 131 -326 229 -562 97 -230 97 -132 3077 -100 1031 -100 131 -100 165 -132 295 -68 97 -364 233 -264 65 -200 131 -562 331 -396 195 -228 197 -166 167 -266 165 -266 133 -662 165 -100 65 -466 531 -364 297 -526 65 -560 163 -364 99 -1678 131 -562 99 -268 65 -200 133 -1714 263 -986 2071 -624 99 -392 359 -296 99 -264 97 -230 295 -230 165 -766 165 -232 129 -302 97 -562 197 -66 97 -526 461 -166 131 -1146 131 -264 229 -788 65 -68 165 -66 97 -100 133 -100 99 -400 65 -198 97 -526 65 -360 195 -854 163 -362 97 -198 65 -362 97 -230 97 -690 99 -424 295 -200 197 -1052 2919 -134 565 -634 99 -498 331 -634 99 -300 65 -598 131 -330 131 -166 163 -132 65 -98 231 -130 65 -296 65 -166 259 -396 99 -362 65 -464 165 -232 131 -196 97 -526 97 -824 261 -330 229 -68 297 -560 397 -466 131 -796 329 -334 231 -166 133 -100 167 -236 335 -364 529 -762 199 -232 201 -1130 131 -866 99 -698 133 -1556 97 -664 99 -300 165 -598 131 -1688 199 -1062 97 -398 331 -164 65 -922 657 -198 393 -98 229 -428 555 -130 163 -394 397 -132 261 -264 65 -130 65 -262 493 -132 363 -134 165 -66 133 -402 265 -330 199 -132 565 -366 99 -134 163 -134 165 -200 99 -132 167 -332 431 -66 399 -200 199 -266 65 -830 133 -2050 97 -888 129 -2404 97 -2646 133 -2058 65 -1924 65 -530 97 -1646 65 -234 97 -3752 65 -1550 165 -2670 99 -328 97 -5326 97 -2246 65 -1094 165 -1672 97 -1582 97 -3722 65 -5080 65 -1676 197 -2936 665 -462 131 -264 65 -168 233 -298 65 -132 65 -600 67 -132 163 -296 99 -1318 131 -562 495 -396 263 -132 133 -200 131 -132 129 -264 263 -164 97 -132 131 -2308 99 -1956 167 -298 99 -592 163 -462 67 -3200 295 -620 65 -824 133 -64 131 -1552 RAW_Data: 165 -1526 131 -690 65 -526 97 -132 129 -362 65 -198 97 -456 131 -262 575 -1010 1019 -1008 1003 -520 1513 -1016 999 -1012 1009 -522 1511 -1504 517 -1012 1011 -1514 511 -1010 1021 -514 1501 -1514 511 -1504 517 -1510 521 -492 1525 -1506 517 -514 1505 -522 1515 -484 1531 -1012 1011 -60190 1519 -1538 493 -1018 1005 -1514 515 -514 1495 -1528 513 -1502 515 -1010 1011 -1516 517 -514 1489 -1538 475 -1024 1003 -1534 515 -1498 505 -1036 987 -1018 1033 -1510 483 -1538 507 -1000 1009 -526 1505 -1534 491 -59172 529 -1018 1007 -1008 1001 -518 1507 -1024 1009 -1008 1035 -518 1499 -1526 481 -1044 979 -1546 475 -1026 1011 -516 1503 -1516 503 -1524 513 -1512 519 -482 1525 -1540 473 -510 1513 -518 1507 -518 1505 -1048 983 -60204 1495 -1594 439 -1062 983 -1542 461 -548 1503 -1548 449 -1540 507 -1034 1003 -1514 489 -516 1537 -1510 507 -1014 993 -1542 481 -1512 521 -1012 1015 -1006 1007 -1510 503 -1548 495 -1018 1007 -482 1531 -1514 505 -59196 507 -1042 979 -1048 973 -530 1515 -1012 1015 -1018 1005 -522 1505 -1508 519 -1014 993 -1542 483 -1018 997 -514 1529 -1508 517 -1528 473 -1546 495 -524 1505 -1504 501 -518 1505 -518 1505 -518 1513 -1016 997 -60198 495 -7704 1361 -1648 391 -1632 407 -1100 949 -1576 425 -566 1495 -1526 481 -1042 981 -1552 481 -1534 513 -1010 1013 -990 1007 -1536 511 -1506 487 -1020 1011 -526 1511 -1504 503 -59194 513 -1022 1013 -1016 989 -552 1465 -1046 1009 -1014 987 -518 1507 -1544 483 -1016 1017 -1508 515 -1010 1009 -488 1545 -1506 515 -1504 505 -1542 477 -516 1529 -1508 523 -486 1535 -500 1511 -516 1509 -1018 1011 -60166 1513 -1600 431 -1088 945 -1568 447 -580 1471 -1548 479 -1540 475 -1046 973 -1554 479 -510 1533 -1514 481 -1038 1017 -1506 487 -1548 509 -994 1013 -1008 1017 -1514 505 -1514 509 -1004 1015 -520 1517 -1516 513 -136452 65 -496 99 -796 131 -830 197 -168 99 -166 67 -2820 97 -134 65 -298 65 -168 99 -2792 97 -800 67 -3482 231 -166 99 -564 67 -266 99 -932 99 -68 397 -462 165 -66 165 -100 199 -68 497 -98 265 -498 593 -130 99 -360 561 -164 721 -66 131 -392 133 -198 201 -134 233 -66 99 -66 265 -558 163 -232 99 -66 729 -66 165 -164 99 -2250 65 -2340 131 -2166 99 -3386 63 -786 99 -426 197 -1022 197 -1564 131 -5336 99 -294 231 -166 65 -8582 133 -530 133 -234 131 -660 133 -1922 99 -3746 197 -402 65 -302 99 -1456 65 -954 65 -2616 197 -1694 165 -1584 261 -432 65 -986 65 -890 229 -132 97 -298 197 -266 67 -66 65 -200 229 -1018 99 -524 195 -228 165 -166 101 -398 99 -332 331 -1514 259 -164 97 -198 63 -198 95 -690 657 -232 233 -66 133 -68 RAW_Data: 131 -298 99 -560 199 -984 227 -294 265 -462 97 -230 2307 -68 201 -100 99 -132 2079 -134 163 -234 399 -366 67 -366 131 -268 65 -202 165 -100 97 -364 99 -200 65 -234 199 -230 297 -132 199 -100 99 -696 133 -100 333 -534 165 -166 67 -498 331 -266 165 -696 459 -592 197 -330 131 -98 261 -1578 131 -1016 97 -66 97 -426 99 -630 263 -166 4367 -198 99 -166 99 -334 65 -400 299 -330 67 -926 265 -134 231 -134 197 -66 459 -200 265 -166 131 -132 67 -166 197 -400 165 -134 165 -664 197 -1196 99 -398 65 -564 167 -730 97 -266 165 -430 265 -634 133 -566 199 -66 2627 -366 297 -98 97 -100 131 -164 163 -628 197 -98 97 -428 397 -466 131 -68 99 -132 131 -1286 231 -98 165 -430 97 -364 129 -98 97 -562 65 -200 133 -996 131 -166 65 -234 67 -796 99 -630 297 -1058 165 -134 133 -1230 1931 -98 783 -196 99 -66 97 -532 65 -330 165 -400 333 -696 131 -398 65 -166 297 -198 65 -368 133 -366 199 -132 65 -134 197 -166 167 -266 99 -666 65 -458 197 -1418 229 -130 65 -562 131 -762 99 -564 97 -1064 65 -1158 99 -1364 2125 -132 231 -232 1221 -68 133 -200 165 -198 65 -664 231 -332 261 -494 97 -788 99 -166 131 -368 99 -762 197 -66 131 -134 331 -922 293 -200 165 -198 131 -132 163 -362 395 -64 263 -986 297 -724 163 -888 195 -164 65 -264 129 -196 493 -896 131 -332 165 -434 65 -232 101 -98 97 -598 99 -566 99 -398 165 -200 133 -100 267 -396 65 -332 131 -624 65 -558 63 -396 97 -596 261 -1120 99 -786 131 -130 131 -360 363 -462 233 -366 97 -166 265 -230 65 -756 131 -1646 195 -166 295 -1658 65 -66 195 -1684 65 -6928 99 -1488 65 -164 197 -556 99 -330 97 -528 195 -1352 197 -1590 99 -66 133 -1328 131 -366 97 -2218 65 -600 65 -66 265 -232 133 -1496 133 -462 97 -66 131 -2352 99 -196 67 -2794 99 -2374 97 -100 99 -198 63 -2074 65 -5114 65 -166 99 -3616 133 -1588 97 -1622 163 -98 97 -888 131 -328 195 -196 197 -362 99 -792 161 -164 131 -266 133 -100 65 -234 65 -500 97 -864 131 -132 99 -664 99 -300 99 -300 65 -98 99 -1296 165 -168 231 -796 99 -232 233 -1092 131 -264 361 -964 165 -100 99 -200 263 -2502 165 -630 65 -134 65 -3342 131 -436 199 -564 65 -466 131 -1458 131 -662 131 -936 65 -2260 99 -630 163 -132 65 -4312 197 -330 65 -1126 265 -1694 65 -166 97 -558 97 -694 97 -1754 65 -1656 65 -366 97 -1118 263 -1550 295 -1448 165 -1618 99 -132 163 -1622 165 -1198 RAW_Data: 231 -730 99 -432 63 -1350 131 -226 197 -432 2459 -66 165 -64 493 -98 1215 -232 229 -494 131 -396 197 -726 165 -196 195 -330 197 -130 99 -134 399 -334 131 -532 99 -1018 99 -164 227 -230 97 -592 295 -66 131 -66 229 -132 559 -724 97 -164 297 -1396 65 -662 65 -1086 97 -1226 65 -166 133 -232 65 -1196 331 -234 67 -564 2619 -132 131 -164 1089 -68 97 -100 997 -66 165 -98 463 -198 133 -266 199 -100 333 -234 197 -198 199 -564 197 -564 163 -792 65 -230 329 -98 65 -234 99 -598 99 -330 327 -198 197 -166 163 -130 131 -1678 575 -1000 1041 -990 1009 -1532 503 -502 1527 -1516 499 -488 1541 -1506 505 -1014 1031 -482 1543 -1504 503 -504 1527 -480 1547 -476 1527 -1002 1021 -514 1527 -1010 1013 -1518 481 -1036 1015 -480 1537 -1516 485 -60180 1555 -994 1009 -512 1503 -506 1531 -518 1505 -1008 1009 -1016 997 -1544 487 -1546 483 -1512 519 -1012 1017 -1508 489 -1544 477 -530 1515 -1510 519 -1506 489 -1048 1005 -1010 1001 -1526 509 -992 1011 -1038 1005 -59156 527 -1090 885 -1112 909 -1604 439 -572 1457 -1580 457 -548 1463 -1562 481 -1046 981 -506 1527 -1510 523 -482 1539 -482 1529 -520 1503 -1018 1011 -514 1497 -1016 1011 -1520 511 -1014 1019 -488 1537 -1510 515 -60180 1501 -1080 947 -546 1493 -538 1485 -518 1505 -1044 973 -1058 983 -1538 465 -1542 501 -1512 509 -1006 1011 -1532 513 -1502 515 -514 1503 -1516 517 -1506 515 -1012 1009 -1018 1001 -1510 527 -1014 1009 -1014 987 -59196 515 -1014 1009 -1016 1015 -1538 483 -516 1507 -1542 479 -512 1531 -1506 489 -1018 1009 -530 1515 -1506 519 -488 1533 -514 1509 -488 1545 -1008 1015 -512 1497 -1016 999 -1548 497 -1014 1009 -482 1543 -1514 499 -60192 493 -7688 1397 -1156 881 -1120 891 -1632 397 -1618 417 -1580 479 -1042 967 -1548 483 -1542 475 -542 1505 -1516 515 -1504 505 -1018 1007 -1018 1009 -1504 537 -984 1013 -1022 1007 -59174 501 -11466 659 -1656 353 -1180 847 -632 1425 -1592 451 -550 1473 -548 1463 -570 1481 -1042 971 -540 1495 -1014 1001 -1544 479 -1034 1001 -518 1509 -1514 513 -60202 1527 -1042 963 -554 1471 -550 1499 -516 1503 -1018 1009 -1012 1019 -1512 501 -1518 513 -1508 501 -1038 1005 -1508 513 -1506 521 -488 1531 -1508 521 -1512 513 -990 1009 -1038 1003 -1514 515 -1008 1017 -1010 1011 -132210 97 -1712 231 -2272 97 -4094 65 -526 65 -2118 67 -432 99 -300 131 -364 165 -1226 199 -134 99 -100 465 -232 99 -726 133 -532 199 -266 133 -232 65 -234 265 -1586 131 -528 99 -696 99 -132 297 -398 67 -464 131 -166 267 -466 165 -764 197 -100 65 -1026 65 -3972 65 -1718 133 -630 99 -200 131 -68 65 -4004 163 -2078 65 -464 131 -496 RAW_Data: 99 -134 131 -398 65 -1090 295 -132 65 -1646 65 -1396 233 -1296 199 -100 97 -134 65 -764 265 -760 197 -296 65 -526 197 -100 197 -198 63 -1414 163 -1316 195 -98 229 -200 97 -824 99 -100 131 -66 3137 -198 393 -164 131 -824 101 -66 399 -200 67 -232 133 -168 99 -198 65 -366 597 -898 197 -98 65 -330 131 -362 133 -864 97 -632 131 -654 195 -1260 231 -398 99 -626 65 -460 131 -722 99 -300 65 -464 165 -1060 165 -366 67 -132 2189 -66 299 -166 97 -464 99 -200 165 -596 231 -596 65 -134 65 -166 197 -232 265 -266 67 -232 133 -400 199 -232 333 -200 65 -466 65 -430 363 -230 97 -64 197 -758 131 -66 65 -592 131 -558 165 -266 133 -264 165 -1102 131 -134 97 -926 67 -496 197 -1252 2593 -66 229 -66 687 -98 1119 -66 659 -98 197 -960 297 -166 99 -524 429 -1022 99 -364 201 -200 65 -100 199 -498 99 -198 67 -132 399 -432 99 -492 295 -66 197 -66 131 -3066 395 -1156 131 -302 99 -792 161 -264 329 -66 163 -98 259 -762 131 -994 165 -1742 229 -830 165 -430 323 -98 295 -130 99 -368 65 -266 265 -1554 197 -492 2511 -68 795 -132 699 -132 99 -66 633 -562 197 -204 499 -364 99 -200 99 -794 231 -266 99 -564 65 -200 197 -68 429 -198 99 -830 165 -794 99 -166 133 -534 359 -298 99 -234 199 -492 67 -98 167 -528 65 -1858 97 -856 65 -64 131 -462 129 -592 131 -198 97 -396 131 -690 99 -232 2427 -68 2469 -396 467 -264 99 -532 133 -232 63 -362 229 -462 525 -264 97 -260 97 -230 165 -132 131 -992 133 -796 129 -1682 129 -362 99 -230 99 -132 99 -100 65 -1590 265 -1690 197 -1590 97 -392 231 -1454 133 -1298 65 -2296 65 -230 133 -300 99 -2750 65 -560 131 -2966 97 -230 129 -1054 133 -1296 65 -992 67 -5244 167 -200 65 -6756 229 -1608 229 -166 65 -66 97 -396 97 -130 197 -728 163 -2338 197 -132 131 -66 99 -100 97 -300 99 -664 265 -432 99 -696 133 -132 131 -866 233 -134 97 -266 199 -266 229 -1126 99 -100 131 -1424 199 -1594 131 -2186 99 -5780 67 -760 133 -1630 167 -832 99 -2854 65 -2846 65 -5308 231 -1616 97 -1684 131 -236 65 -3044 99 -1594 131 -2108 99 -1660 97 -3448 99 -3556 65 -2690 97 -1648 165 -1858 65 -1492 165 -2882 199 -402 99 -1196 131 -132 99 -66 65 -1728 67 -132 99 -1164 265 -398 99 -166 129 -132 131 -2468 65 -1658 201 -1688 99 -1712 131 -132 99 -992 65 -428 65 -100 165 -498 165 -666 199 -500 329 -732 99 -132 67 -692 65 -362 197 -132 97 -1314 325 -596 RAW_Data: 165 -66 165 -666 165 -632 65 -198 263 -564 263 -198 99 -230 97 -228 263 -524 231 -98 133 -498 265 -166 99 -924 325 -328 65 -360 165 -196 129 -166 327 -822 99 -398 99 -266 131 -562 99 -460 97 -164 295 -200 197 -964 99 -796 99 -596 165 -1088 65 -200 129 -724 131 -662 295 -724 65 -398 131 -234 99 -430 3857 -66 163 -66 1023 -794 99 -198 363 -68 65 -198 99 -132 265 -296 65 -264 197 -66 167 -530 165 -462 131 -66 425 -428 131 -162 65 -594 493 -362 131 -394 165 -130 297 -394 557 -760 97 -1284 197 -1490 163 -1680 131 -392 231 -264 65 -624 229 -1090 2037 -134 457 -98 131 -164 1691 -100 65 -300 199 -798 99 -528 99 -198 97 -296 99 -262 131 -66 197 -292 133 -198 99 -166 197 -66 199 -1454 229 -396 131 -130 131 -690 99 -98 97 -66 65 -362 63 -98 163 -164 397 -1028 65 -232 99 -66 197 -264 67 -166 165 -202 65 -1134 99 -132 567 -364 197 -696 267 -628 133 -200 133 -166 2173 -296 561 -66 765 -164 97 -266 99 -366 263 -332 99 -566 231 -98 99 -100 265 -132 67 -398 65 -166 97 -230 163 -396 99 -164 97 -98 163 -260 99 -164 229 -1448 163 -298 723 -428 99 -366 65 -330 131 -400 97 -366 131 -596 65 -166 133 -332 99 -366 99 -628 65 -532 165 -66 133 -264 131 -2726 267 -270 131 -232 65 -66 67 -432 165 -200 67 -1030 167 -166 165 -630 231 -196 63 -428 65 -764 2901 -132 99 -198 131 -132 359 -198 63 -132 129 -692 65 -200 233 -98 165 -332 67 -330 133 -166 297 -532 497 -68 165 -168 331 -132 165 -230 333 -564 165 -100 65 -1258 165 -266 99 -760 65 -298 133 -532 163 -464 197 -592 165 -1678 97 -1086 99 -460 65 -2510 97 -66 165 -1428 131 -1280 65 -66 97 -2108 99 -394 129 -230 129 -298 97 -1446 97 -266 97 -230 577 -1538 475 -1542 485 -1018 1023 -514 1503 -490 1523 -1014 1021 -1510 519 -1512 513 -992 1011 -1012 1013 -1032 997 -514 1497 -518 1535 -1010 1001 -1530 481 -504 1521 -1534 473 -522 1539 -1492 513 -514 1511 -60178 1531 -1034 971 -518 1509 -518 1505 -518 1533 -488 1509 -516 1509 -1546 475 -1044 989 -1012 1007 -1544 475 -516 1531 -1008 1011 -490 1545 -1002 1017 -1506 487 -552 1501 -500 1517 -516 1511 -504 1501 -1026 1011 -59168 491 -7578 461 -670 1359 -1184 881 -1614 435 -1566 461 -1050 977 -1050 975 -1042 993 -518 1509 -524 1517 -1014 991 -1508 519 -490 1541 -1502 513 -514 1533 -1506 507 -484 1535 -60182 1535 -1060 949 -554 1483 -540 1467 -558 1475 -550 1469 -538 1499 -1554 481 -1008 1001 -1050 975 -1524 511 -516 RAW_Data: 1503 -1018 1011 -526 1511 -1014 1017 -1518 495 -488 1537 -482 1527 -522 1503 -526 1505 -1006 1015 -59192 495 -1582 451 -1542 479 -1038 975 -568 1481 -514 1499 -1036 1003 -1512 493 -1544 483 -1012 1033 -1016 1003 -1016 1009 -514 1497 -520 1511 -1018 1011 -1506 519 -490 1533 -1508 519 -492 1525 -1508 515 -514 1501 -60200 1545 -1014 1011 -482 1543 -488 1541 -484 1531 -506 1497 -522 1509 -1520 513 -1012 1019 -986 1037 -1514 513 -486 1541 -1006 1009 -486 1539 -1014 987 -1534 501 -490 1545 -482 1539 -488 1545 -484 1533 -1006 1017 -59174 499 -7598 461 -644 1401 -1094 915 -1614 425 -1572 471 -1060 977 -1012 1019 -1012 1007 -524 1505 -514 1497 -1038 983 -1534 513 -478 1535 -1516 519 -480 1523 -1536 503 -504 1527 -60172 1523 -1078 949 -546 1465 -566 1449 -554 1477 -550 1501 -526 1507 -1508 507 -1014 1005 -1022 1011 -1504 505 -520 1511 -1022 1009 -516 1505 -1018 1007 -1516 511 -506 1529 -488 1517 -524 1507 -512 1529 -984 1011 -132432 263 -1692 97 -1216 65 -788 65 -1320 231 -6950 229 -1658 133 -3184 97 -166 131 -1296 99 -196 99 -2900 165 -1658 131 -1856 99 -1952 133 -632 133 -4016 131 -136 99 -166 99 -1352 95 -2420 99 -98 97 -856 129 -5964 99 -1588 163 -66 65 -1720 65 -2716 67 -398 67 -398 97 -1284 65 -100 65 -788 131 -1748 97 -1596 263 -66 163 -332 431 -130 1161 -198 165 -164 133 -100 199 -338 131 -432 163 -736 231 -660 101 -100 99 -266 99 -102 231 -966 99 -402 465 -464 65 -398 463 -492 231 -430 165 -3936 65 -6980 131 -1248 65 -428 133 -434 199 -728 65 -756 99 -198 97 -4038 133 -2028 65 -2102 65 -660 99 -2552 65 -1860 65 -466 131 -798 65 -1780 165 -1710 261 -132 65 -394 65 -1828 165 -730 65 -1394 97 -132 259 -296 63 -1674 97 -3318 133 -1658 133 -502 65 -2886 131 -1626 163 -196 97 -1414 65 -3520 99 -794 195 -2476 65 -1846 131 -2044 99 -1450 99 -922 99 -1908 65 -262 97 -1776 97 -996 233 -1460 231 -232 131 -702 99 -166 67 -166 165 -168 67 -500 131 -396 99 -298 199 -232 65 -934 299 -334 99 -100 65 -632 165 -168 65 -1226 163 -66 265 -202 233 -862 99 -166 233 -202 231 -762 99 -266 65 -300 65 -1390 67 -3772 131 -528 99 -1316 65 -694 63 -864 197 -1228 67 -430 97 -1712 163 -5212 165 -1624 165 -434 99 -1092 165 -3986 131 -5164 65 -496 65 -4734 163 -1648 97 -1710 199 -1714 99 -1460 359 -1578 165 -1096 67 -626 65 -2172 65 -1580 65 -164 65 -1450 131 -3556 163 -4194 165 -6992 233 -264 97 -464 131 -730 65 -366 65 -528 67 -66 197 -796 131 -298 163 -264 131 -262 131 -826 195 -166 127 -130 RAW_Data: 293 -328 97 -460 197 -624 65 -262 63 -626 295 -100 131 -66 163 -132 163 -294 97 -164 165 -168 65 -400 299 -68 265 -198 331 -1494 97 -66 131 -1094 1955 -66 723 -132 593 -66 391 -132 1063 -264 2121 -100 1093 -66 165 -100 197 -264 233 -730 263 -166 99 -166 397 -234 165 -728 231 -132 261 -130 163 -194 99 -796 199 -668 131 -826 165 -1626 131 -198 99 -1360 131 -200 131 -132 67 -1058 99 -200 67 -200 67 -768 2605 -96 163 -130 691 -64 1149 -98 163 -132 97 -198 261 -98 131 -1258 297 -430 97 -500 65 -430 131 -398 65 -264 165 -298 165 -134 463 -366 131 -432 565 -166 197 -98 97 -198 133 -230 197 -132 261 -100 65 -592 65 -824 65 -3266 231 -68 65 -432 129 -392 2799 -100 1151 -64 883 -98 99 -562 131 -66 197 -430 195 -196 99 -200 463 -400 99 -1032 131 -330 231 -1092 163 -858 97 -164 97 -226 65 -394 163 -1050 261 -950 263 -230 199 -1786 65 -558 65 -168 65 -396 131 -196 197 -264 99 -588 97 -230 163 -692 97 -262 97 -164 2923 -100 131 -66 561 -162 163 -198 97 -732 133 -732 165 -930 67 -1228 361 -298 131 -928 65 -166 201 -1096 329 -134 299 -432 197 -166 133 -630 165 -896 133 -1126 97 -164 295 -266 265 -134 199 -564 129 -896 131 -600 131 -658 65 -166 499 -232 133 -332 195 -332 497 -100 65 -330 97 -230 129 -362 131 -330 199 -1256 65 -660 65 -790 165 -1358 199 -166 133 -1226 2239 -66 627 -100 595 -132 233 -166 99 -102 299 -66 99 -66 133 -198 167 -266 163 -98 197 -200 233 -466 331 -198 233 -98 99 -332 99 -132 629 -330 497 -466 65 -334 65 -166 131 -300 65 -564 165 -168 99 -1462 65 -134 131 -924 99 -266 233 -300 67 -494 129 -364 97 -662 357 -786 197 -1626 131 -200 65 -396 99 -666 131 -896 131 -600 163 -136 65 -1594 65 -2042 65 -1584 99 -1920 65 -3128 195 -3316 99 -890 195 -626 131 -722 161 -98 97 -626 527 -66 465 -100 295 -200 65 -66 233 -66 163 -166 423 -164 65 -458 295 -524 593 -64 197 -162 65 -98 97 -264 131 -100 327 -132 229 -98 131 -556 395 -66 197 -1060 131 -232 233 -134 65 -464 793 -1620 67 -4074 97 -1018 163 -328 97 -5922 65 -624 133 -668 97 -830 267 -166 133 -100 165 -694 99 -134 231 -230 97 -592 65 -100 229 -490 65 -790 229 -954 97 -198 163 -368 99 -664 65 -100 65 -168 199 -166 233 -600 101 -132 99 -68 65 -232 167 -268 199 -330 263 -496 65 -830 133 -892 99 -1450 129 -3654 63 -1680 99 -1384 97 -2114 97 -430 RAW_Data: 199 -232 65 -530 131 -1814 65 -164 195 -66 97 -164 65 -232 97 -858 231 -296 163 -164 1939 -266 829 -200 1229 -132 167 -200 231 -230 133 -166 99 -300 331 -332 99 -132 167 -232 67 -864 131 -266 65 -266 131 -200 167 -334 99 -132 231 -134 65 -232 133 -500 65 -66 99 -66 165 -660 99 -198 367 -364 97 -396 131 -1158 63 -1312 131 -164 163 -858 99 -628 363 -330 99 -166 99 -430 97 -330 65 -558 165 -562 2495 -164 423 -66 1653 -166 199 -566 165 -134 97 -234 97 -234 265 -234 99 -232 67 -98 99 -98 131 -266 231 -66 67 -168 197 -996 133 -66 165 -132 133 -198 99 -830 295 -530 99 -166 297 -332 199 -296 129 -1284 165 -694 97 -732 263 -1554 65 -2058 231 -432 99 -264 2167 -164 99 -66 261 -98 719 -496 131 -564 231 -364 65 -466 201 -400 199 -200 67 -232 363 -630 99 -98 65 -500 333 -332 99 -200 397 -366 331 -560 99 -394 231 -130 195 -230 165 -1034 97 -66 131 -1060 97 -562 163 -488 131 -822 229 -500 197 -530 65 -796 197 -164 261 -756 163 -430 65 -530 131 -434 133 -168 133 -298 65 -530 427 -494 65 -628 261 -162 129 -196 131 -1624 65 -332 97 -498 231 -328 99 -166 101 -664 1211 -1510 491 -1542 485 -1020 1015 -510 1493 -1540 489 -534 1501 -1526 479 -1034 1001 -1508 507 -1016 1037 -484 1533 -1500 503 -1030 1007 -998 1009 -1038 1009 -1514 511 -496 1511 -512 1533 -486 1507 -1020 1007 -60200 1525 -1016 999 -514 1539 -484 1511 -520 1507 -514 1529 -474 1537 -522 1505 -1508 505 -1002 1033 -492 1531 -1506 523 -1012 1005 -480 1527 -1018 1011 -1024 1007 -1500 535 -1498 513 -1008 1023 -1008 1013 -492 1527 -59182 477 -1646 337 -1694 365 -1122 881 -618 1405 -1638 407 -600 1455 -1546 461 -1076 971 -1552 447 -1042 1015 -518 1503 -1512 515 -1008 1001 -1016 1011 -1024 1009 -1506 501 -512 1539 -484 1541 -484 1543 -1006 1005 -60182 535 -11720 1363 -658 1347 -1682 373 -1136 897 -590 1447 -1582 441 -1072 957 -550 1501 -1018 997 -1044 989 -1546 485 -1516 517 -1010 1011 -1010 1009 -492 1541 -59174 443 -11526 625 -1648 397 -1106 933 -1584 451 -1084 957 -546 1465 -1548 485 -1046 969 -1052 1001 -1018 977 -1540 507 -520 1505 -490 1535 -482 1531 -1018 1009 -60222 1533 -974 1047 -478 1537 -490 1527 -520 1505 -514 1507 -518 1527 -480 1543 -1506 507 -1008 1001 -522 1501 -1520 511 -1008 1033 -486 1515 -1020 1011 -1012 1013 -1532 511 -1488 513 -1006 1033 -1006 997 -516 1523 -59176 497 -1632 329 -1714 353 -1114 905 -608 1429 -1580 453 -580 1433 -1596 451 -1048 981 -1542 473 -1060 979 -518 1505 -1526 509 -996 1013 -1010 1015 -1016 1007 -1520 511 -516 RAW_Data: 1505 -522 1509 -488 1537 -1014 1017 -60198 1533 -978 1025 -520 1503 -516 1503 -518 1527 -486 1543 -484 1533 -508 1495 -1548 475 -1026 1013 -516 1503 -1514 505 -1024 1009 -516 1503 -1018 1007 -1018 1009 -1504 501 -1544 497 -1020 1009 -1010 1017 -488 1539 -137350 65 -794 165 -166 65 -432 295 -428 329 -164 131 -324 97 -198 65 -230 165 -166 431 -532 263 -232 67 -430 197 -66 893 -1522 165 -3076 65 -328 163 -2006 65 -894 197 -1362 99 -132 99 -1660 231 -1580 263 -1126 99 -266 133 -864 65 -4456 163 -196 199 -3214 167 -398 67 -1322 63 -1148 197 -1698 197 -1014 65 -7018 133 -462 165 -1664 99 -894 65 -634 327 -1222 97 -6562 97 -2512 131 -758 65 -592 131 -1182 97 -1792 65 -230 129 -1284 65 -1020 65 -988 99 -5252 163 -1692 131 -1970 65 -198 197 -728 65 -366 363 -1592 131 -1216 165 -360 163 -526 99 -460 99 -332 201 -232 65 -200 67 -268 165 -532 197 -268 167 -566 265 -132 231 -194 129 -198 163 -198 195 -394 361 -762 99 -166 99 -536 99 -3384 65 -1684 99 -66 99 -790 133 -1716 97 -1710 165 -1624 231 -2062 99 -1362 299 -3378 65 -196 97 -854 65 -1120 99 -200 99 -268 133 -432 131 -1956 67 -664 65 -1556 65 -1050 97 -132 97 -4740 131 -132 99 -1660 199 -864 165 -1582 133 -1614 131 -590 63 -4394 263 -296 231 -3032 197 -1670 65 -756 131 -4392 131 -1654 167 -168 67 -368 65 -832 99 -100 133 -1532 133 -1690 99 -868 131 -662 131 -3508 97 -852 63 -1120 65 -3144 163 -662 97 -594 97 -98 229 -1126 67 -266 65 -132 195 -296 65 -196 129 -262 99 -462 199 -762 65 -396 65 -328 229 -530 231 -264 165 -200 301 -894 65 -264 195 -166 99 -852 195 -1186 97 -66 97 -166 63 -3368 65 -230 65 -1152 99 -1624 165 -1624 65 -1656 165 -1754 99 -430 131 -3440 65 -3044 99 -2126 199 -1190 233 -232 133 -1722 65 -1658 197 -3220 263 -1780 65 -1590 97 -134 133 -1386 97 -3256 165 -164 99 -1856 99 -232 133 -1298 231 -2322 65 -200 131 -3254 97 -2892 131 -534 231 -364 99 -862 99 -68 99 -1388 65 -2078 131 -632 97 -1850 65 -724 97 -166 197 -100 201 -534 99 -264 131 -100 133 -300 133 -334 99 -1158 163 -300 99 -364 99 -300 165 -1024 97 -66 131 -230 525 -298 131 -564 527 -432 65 -692 65 -2642 65 -568 133 -1884 65 -856 131 -922 65 -3040 99 -100 97 -1896 65 -300 165 -466 67 -98 233 -132 297 -5044 231 -2354 65 -3878 65 -626 99 -1746 99 -1850 131 -230 97 -2434 431 -200 199 -100 167 -298 65 -2452 133 -396 199 -1058 65 -624 131 -5426 129 -2438 229 -956 RAW_Data: 197 -490 163 -662 163 -396 393 -66 163 -262 65 -328 65 -362 2243 -100 595 -100 1361 -334 299 -230 527 -594 199 -498 461 -798 265 -200 329 -166 267 -466 231 -132 197 -98 99 -264 163 -232 99 -364 99 -132 133 -200 131 -132 99 -68 99 -166 297 -66 297 -198 131 -324 67 -232 97 -166 99 -166 99 -830 99 -264 433 -66 133 -2620 65 -232 233 -556 197 -198 129 -428 197 -228 163 -630 265 -200 133 -200 133 -100 165 -264 131 -100 197 -832 97 -400 231 -300 67 -266 99 -232 67 -532 327 -662 65 -268 99 -332 265 -232 99 -498 3293 -98 67 -98 365 -134 97 -626 65 -166 129 -230 229 -798 165 -164 195 -98 65 -166 163 -298 233 -398 199 -232 163 -100 65 -196 261 -264 295 -328 99 -690 361 -264 195 -722 65 -132 261 -328 65 -822 129 -66 559 -624 97 -1390 99 -866 65 -630 163 -398 65 -200 65 -598 4821 -98 99 -360 561 -98 297 -428 197 -98 197 -690 427 -98 97 -66 99 -1128 297 -266 65 -364 165 -432 133 -366 65 -198 199 -166 97 -364 397 -964 67 -1560 165 -100 361 -630 129 -788 131 -818 67 -132 131 -556 99 -558 99 -722 99 -196 2437 -264 2337 -360 197 -166 65 -330 689 -166 395 -98 65 -396 131 -164 97 -66 593 -262 163 -398 331 -100 267 -266 231 -166 65 -232 231 -166 263 -394 97 -66 65 -730 133 -200 131 -100 429 -230 227 -560 65 -100 97 -132 131 -166 65 -662 131 -166 231 -986 99 -132 263 -200 265 -166 65 -164 163 -164 197 -1184 259 -294 2681 -100 1061 -134 133 -100 65 -530 199 -726 97 -566 497 -630 99 -300 199 -132 363 -168 97 -230 165 -100 263 -198 165 -330 99 -826 133 -1166 365 -1224 165 -1130 131 -134 165 -132 229 -828 99 -330 99 -694 67 -230 163 -558 231 -726 97 -132 129 -166 195 -560 65 -262 63 -396 165 -998 65 -134 99 -200 231 -66 131 -266 165 -362 229 -894 65 -3690 133 -132 131 -132 65 -828 67 -666 131 -1430 99 -200 99 -4978 67 -596 67 -132 99 -664 259 -3486 65 -794 63 -2578 165 -592 99 -236 197 -296 129 -2202 131 -892 197 -2080 263 -66 231 -200 131 -402 233 -896 65 -666 131 -4786 99 -3204 99 -2322 165 -2566 97 -1252 197 -1716 65 -198 97 -7054 99 -934 195 -1616 99 -3522 99 -3344 97 -66 131 -1652 299 -966 297 -1494 65 -3432 131 -1792 65 -1586 101 -1624 65 -66 65 -2622 65 -398 65 -852 165 -3880 99 -1660 197 -1592 129 -1386 131 -164 131 -394 97 -66 97 -824 195 -362 163 -66 131 -694 331 -300 65 -332 97 -296 163 -298 295 -464 RAW_Data: 97 -764 329 -1064 233 -464 165 -64 129 -328 131 -330 229 -166 65 -332 65 -66 165 -162 163 -198 63 -98 63 -166 97 -298 63 -960 231 -394 99 -1128 133 -500 297 -764 97 -166 199 -334 97 -68 131 -330 99 -66 197 -200 65 -332 397 -1648 197 -526 97 -560 2903 -98 493 -98 99 -230 129 -756 231 -164 429 -362 133 -132 167 -432 263 -234 167 -166 265 -296 163 -98 361 -132 67 -164 67 -496 229 -296 193 -364 131 -1226 165 -164 99 -602 99 -132 231 -1394 65 -232 99 -166 165 -1254 165 -298 199 -330 99 -820 129 -928 65 -330 165 -66 133 -630 67 -166 197 -166 2079 -200 791 -98 1263 -564 363 -624 163 -230 131 -360 233 -130 63 -526 65 -528 363 -296 163 -270 131 -200 261 -166 531 -1434 297 -462 99 -100 131 -464 567 -402 67 -462 131 -494 131 -1196 67 -858 165 -230 97 -198 65 -196 197 -362 131 -2038 295 -166 2333 -66 165 -64 327 -98 65 -164 261 -432 165 -134 131 -100 233 -536 65 -266 631 -360 263 -66 97 -68 231 -396 133 -766 329 -230 65 -296 163 -294 65 -66 329 -230 301 -532 197 -334 133 -1160 199 -562 131 -332 131 -298 97 -928 199 -132 197 -664 197 -230 2811 -66 665 -134 165 -102 365 -166 267 -66 131 -198 201 -266 99 -166 131 -232 593 -264 131 -594 131 -100 263 -164 131 -198 97 -362 163 -164 131 -164 329 -262 295 -526 131 -66 197 -434 195 -66 195 -262 97 -98 525 -228 229 -890 429 -198 131 -268 67 -430 131 -1150 265 -198 99 -956 329 -1186 161 -262 163 -918 99 -332 65 -664 195 -262 295 -1480 297 -492 131 -494 231 -990 65 -198 65 -164 163 -1544 167 -868 65 -164 97 -98 97 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/security_pls_2_0.sub ================================================ Filetype: Flipper SubGhz Key File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: Security+ 2.0 Bit: 62 Key: 00 00 3D 29 0F B9 BE EE Secplus_packet_1: 00 00 3C 01 6B 19 DD 60 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/security_pls_2_0_raw.sub ================================================ Filetype: Flipper SubGhz RAW File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: RAW RAW_Data: -130 1115 -68 55471 -1962 167 -1664 99 -364 427 -232 759 -132 199 -100 267 -134 527 -132 99 -1292 99 -266 65 -68 131 -762 327 -98 393 -298 37611 -730 131 -428 1487 -3910 327 -100 295 -98 491 -492 65 -98 197 -860 97 -98 131 -856 131 -134 231 -792 229 -66 919 -198 7527 -7444 131 -722 97 -230 65 -98 527 -100 267 -68 229 -262 361 -528 195 -624 131 -164 495 -66 1697 -66 1791 -132 3715 -8320 65 -394 165 -166 461 -1094 297 -532 131 -764 197 -98 261 -230 165 -100 6235 -12144 265 -600 131 -134 65 -298 233 -958 163 -196 97 -756 263 -98 465 -134 97 -164 3051 -16552 431 -68 131 -166 131 -264 331 -298 561 -166 689 -66 557 -264 3173 -8316 65 -166 531 -298 197 -234 233 -134 233 -892 163 -296 65 -890 161 -232 331 -100 397 -15072 199 -100 99 -394 165 -164 129 -132 197 -132 199 -798 99 -1032 67 -398 427 -100 391 -98 363 -166 297 -66 2869 -66 2299 -12300 97 -660 99 -662 263 -594 131 -662 133 -66 199 -332 97 -134 99 -132 65 -134 131 -100 431 -100 2143 -66 429 -8840 97 -6976 97 -66 397 -66 65 -166 131 -230 131 -294 99 -228 97 -230 129 -756 133 -1298 1293 -132 529 -100 2567 -15654 229 -328 97 -198 131 -66 195 -1492 131 -398 99 -134 99 -366 265 -168 99 -100 235 -100 131 -396 299 -200 1029 -66 6461 -6804 99 -1062 65 -960 65 -232 131 -98 195 -1708 63 -196 261 -164 331 -66 261 -12094 65 -298 265 -198 163 -592 131 -2402 63 -66 297 -198 97 -66 393 -264 4003 -15878 231 -98 261 -496 229 -264 65 -858 131 -994 133 -66 331 -66 429 -100 165 -132 297 -15004 99 -1466 97 -266 165 -198 463 -796 231 -66 131 -298 99 -100 133 -134 167 -430 99 -66 365 -100 297 -134 265 -132 563 -98 1217 -66 6399 -8742 99 -592 99 -426 397 -2338 199 -66 995 -134 229 -132 65 -164 3989 -66 3675 -6962 165 -466 65 -564 399 -66 199 -134 263 -396 97 -132 97 -100 97 -428 393 -624 131 -988 229 -66 363 -230 791 -164 7883 -8286 165 -134 99 -66 197 -100 99 -68 131 -164 163 -398 197 -2162 2005 -66 97 -100 4365 -98 1255 -12012 99 -132 165 -462 65 -166 97 -564 65 -100 331 -794 199 -364 261 -496 331 -132 823 -66 6233 -10976 165 -764 165 -200 195 -296 97 -19176 195 -230 129 -658 131 -132 293 -66 133 -860 65 -858 131 -64 229 -66 227 -66 161 -66 9051 -7316 65 -1494 131 -98 165 -198 65 -134 365 -398 297 -100 3969 -14874 99 -998 65 -564 67 -364 263 -132 163 -528 197 -132 65 -264 65 -264 431 -100 301 -66 297 RAW_Data: -164 6323 -10770 65 -1420 227 -196 263 -198 197 -1086 99 -98 163 -164 163 -426 65 -362 97 -264 295 -132 197 -13586 65 -1808 131 -166 301 -66 465 -432 165 -330 65 -332 297 -962 99 -266 97 -166 265 -132 327 -198 329 -98 293 -14984 99 -862 131 -166 331 -68 165 -98 233 -132 201 -300 197 -364 133 -662 99 -398 99 -166 65 -432 133 -132 1447 -5882 197 -1082 65 -198 163 -1580 129 -264 67 -632 625 -134 165 -68 827 -100 165 -100 99 -164 3949 -9126 67 -164 131 -986 241 -534 309 -208 267 -226 247 -250 247 -248 247 -250 247 -250 249 -250 249 -248 249 -250 247 -250 249 -250 247 -250 249 -250 247 -250 247 -250 249 -504 257 -248 245 -246 247 -248 501 -258 247 -246 245 -248 247 -248 249 -248 249 -504 513 -226 243 -274 243 -500 513 -238 253 -256 253 -492 231 -262 485 -514 223 -244 527 -478 507 -274 255 -218 253 -498 261 -224 251 -250 503 -258 247 -246 243 -246 247 -504 515 -238 251 -472 277 -242 497 -246 289 -220 247 -498 513 -476 255 -68610 311 -208 235 -256 249 -248 247 -248 249 -248 249 -248 249 -250 249 -248 249 -250 247 -250 249 -248 249 -250 249 -248 249 -248 249 -250 249 -504 257 -248 245 -246 247 -248 503 -514 479 -274 253 -256 217 -254 247 -236 255 -250 247 -502 513 -240 251 -256 253 -254 249 -240 227 -252 249 -502 259 -246 245 -246 501 -514 237 -254 473 -280 253 -250 239 -230 251 -250 247 -504 257 -246 501 -226 245 -276 245 -246 245 -248 247 -504 515 -478 255 -244 495 -274 253 -476 511 -240 241 -69142 321 -218 243 -230 251 -248 247 -248 247 -250 247 -250 247 -250 249 -250 247 -250 249 -250 249 -248 249 -250 247 -250 249 -250 247 -250 249 -506 257 -248 243 -246 247 -248 501 -258 247 -246 245 -246 247 -248 249 -248 249 -504 513 -238 251 -254 255 -490 499 -228 253 -250 249 -506 259 -248 499 -478 257 -244 495 -510 509 -238 255 -254 253 -494 227 -254 249 -248 505 -258 247 -246 245 -248 247 -504 513 -238 253 -472 279 -254 491 -226 253 -250 249 -504 513 -478 257 -68880 315 -216 241 -258 249 -248 247 -248 247 -248 249 -248 249 -250 249 -250 247 -250 249 -248 249 -250 247 -250 249 -250 247 -250 249 -250 249 -504 257 -246 245 -246 247 -248 503 -516 477 -274 253 -256 217 -254 247 -236 255 -250 249 -502 481 -272 253 -254 255 -254 249 -238 227 -250 249 -504 257 -248 243 -246 501 -516 237 -254 473 -280 253 -250 239 -230 251 -250 247 -504 257 -248 499 -228 245 -274 245 -246 245 -248 247 RAW_Data: -504 513 -478 257 -244 495 -274 253 -500 483 -232 265 -69136 287 -256 249 -238 227 -250 249 -248 249 -248 249 -248 249 -250 247 -250 247 -250 249 -250 247 -250 249 -250 249 -248 249 -248 249 -250 249 -504 257 -248 245 -246 245 -248 503 -260 245 -246 245 -246 247 -248 249 -250 247 -504 513 -238 251 -256 253 -496 499 -228 249 -250 249 -504 257 -248 499 -478 257 -244 495 -510 509 -238 255 -254 255 -492 227 -256 249 -248 505 -258 247 -246 245 -248 245 -504 513 -238 253 -472 279 -254 491 -228 253 -250 249 -504 513 -478 257 -68886 309 -208 235 -256 249 -248 249 -248 249 -248 249 -250 247 -250 249 -250 247 -250 247 -250 249 -250 249 -248 249 -250 247 -250 249 -250 249 -504 257 -248 245 -246 245 -248 503 -514 477 -274 253 -254 217 -256 247 -238 255 -250 247 -504 513 -238 251 -256 253 -256 249 -240 227 -252 249 -504 257 -248 243 -246 501 -514 237 -252 473 -280 253 -250 241 -228 253 -248 249 -504 257 -246 499 -226 245 -276 245 -246 245 -248 247 -506 511 -478 257 -244 495 -272 255 -474 511 -240 241 -69150 323 -220 251 -242 229 -252 247 -248 247 -248 249 -248 249 -248 249 -250 249 -248 249 -250 249 -248 249 -250 247 -250 249 -248 249 -250 249 -504 257 -248 243 -248 247 -248 503 -258 245 -246 245 -248 245 -250 247 -250 247 -504 515 -236 253 -254 253 -496 499 -228 251 -250 247 -504 257 -248 499 -478 257 -244 495 -510 509 -240 253 -256 253 -492 229 -254 249 -250 505 -258 247 -246 245 -246 247 -504 513 -238 253 -472 247 -272 501 -246 253 -254 243 -494 513 -476 255 -68934 287 -254 213 -240 257 -250 249 -248 247 -250 247 -250 247 -250 249 -250 247 -250 247 -250 249 -250 249 -248 249 -250 247 -250 249 -250 247 -506 257 -248 245 -246 245 -248 503 -516 479 -272 255 -254 217 -256 245 -236 255 -250 247 -504 513 -238 253 -254 253 -256 249 -238 229 -252 249 -504 257 -246 245 -246 501 -514 237 -254 473 -280 253 -250 239 -230 251 -250 247 -504 257 -248 499 -226 245 -276 245 -246 245 -248 247 -504 511 -478 255 -244 495 -256 243 -496 509 -274 253 -69130 309 -218 253 -256 249 -240 227 -252 249 -250 247 -248 249 -248 249 -250 247 -250 249 -250 247 -250 249 -250 247 -250 247 -250 249 -250 249 -504 259 -246 245 -246 247 -248 501 -258 247 -244 245 -248 247 -248 247 -250 249 -504 511 -226 245 -276 243 -500 477 -272 253 -254 255 -494 231 -262 481 -514 225 -246 527 -478 507 -256 241 -244 243 -494 257 -244 243 RAW_Data: -246 527 -228 243 -276 245 -246 245 -500 513 -238 253 -474 279 -254 489 -228 251 -250 249 -506 513 -478 255 -68936 287 -218 249 -236 255 -248 247 -248 247 -248 249 -248 249 -248 249 -250 247 -250 249 -250 247 -250 249 -248 249 -250 249 -250 247 -250 249 -506 257 -246 245 -246 245 -248 503 -514 477 -272 255 -254 255 -218 247 -240 255 -250 247 -502 511 -226 273 -244 243 -244 247 -246 247 -250 247 -506 259 -246 245 -246 501 -512 225 -244 527 -238 251 -256 253 -254 251 -242 227 -508 257 -216 527 -226 275 -244 243 -246 245 -248 247 -504 513 -478 257 -242 527 -238 255 -472 511 -242 281 -119614 299 -200 65 -470 65 -466 297 -630 97 -1592 133 -166 299 -66 231 -100 131 -98 265 -134 165 -166 433 -100 2287 -9916 231 -166 65 -98 199 -166 133 -166 165 -756 65 -724 195 -428 231 -260 263 -98 229 -130 261 -66 163 -264 65 -132 1181 -66 6315 -6798 131 -296 559 -334 131 -166 233 -132 165 -66 133 -264 99 -66 65 -366 99 -630 301 -166 97 -100 167 -164 535 -202 7269 -8266 197 -1022 131 -756 99 -98 99 -164 163 -990 65 -530 163 -230 297 -136 635 -66 2113 -8426 67 -6674 97 -722 197 -362 263 -232 165 -134 99 -234 297 -362 129 -198 131 -556 297 -68 167 -98 331 -200 165 -66 295 -66 8689 -4994 65 -1750 165 -762 163 -864 135 -100 167 -694 1093 -66 695 -102 99 -100 9899 -1650 297 -1216 97 -66 99 -396 65 -198 165 -164 233 -1658 199 -98 465 -134 463 -166 1883 -98 6283 -7302 99 -932 133 -696 263 -298 97 -98 165 -1708 131 -820 229 -98 231 -130 163 -590 131 -130 99 -66 97 -16220 261 -1062 265 -998 197 -1290 97 -362 165 -494 895 -264 7839 -7804 99 -66 99 -364 231 -630 133 -166 427 -496 131 -1252 263 -100 233 -66 133 -132 165 -66 259 -98 3109 -10438 101 -5322 99 -100 65 -666 65 -166 331 -98 197 -132 233 -662 261 -1516 559 -66 263 -130 689 -132 229 -64 3613 -15976 231 -166 133 -66 399 -264 99 -132 295 -366 97 -1692 99 -398 529 -68 397 -130 899 -164 3559 -98 1197 -12106 199 -98 65 -166 99 -266 99 -134 231 -100 133 -132 297 -430 99 -1394 299 -64 397 -166 99 -100 465 -200 331 -132 599 -100 2333 -15214 65 -1230 231 -266 265 -432 165 -398 65 -532 333 -632 65 -232 957 -98 9785 -6320 97 -830 167 -166 133 -732 299 -958 327 -98 197 -66 229 -164 327 -98 653 -66 7993 -6418 65 -1284 97 -458 129 -196 197 -166 393 -134 99 -332 427 -132 131 -66 133 -98 233 -66 133 -364 163 -566 4873 -16030 97 RAW_Data: -360 65 -364 65 -68 857 -98 65 -232 131 -264 63 -98 391 -396 65 -130 99 -98 65 -66 861 -166 265 -166 7611 -10336 65 -1822 165 -300 165 -166 295 -134 199 -100 67 -264 165 -166 99 -500 99 -198 97 -200 165 -268 197 -130 65 -300 629 -166 561 -132 333 -132 7459 -6294 131 -1096 165 -964 197 -332 65 -166 129 -132 99 -130 99 -100 97 -134 65 -164 131 -494 165 -396 97 -164 131 -198 99 -232 229 -66 821 -64 131 -14954 97 -788 65 -100 263 -66 99 -300 65 -400 131 -198 293 -294 163 -132 65 -692 99 -132 131 -200 1847 -132 8773 -5968 133 -330 65 -66 295 -430 197 -166 565 -132 467 -98 65 -430 165 -262 131 -528 131 -296 131 -100 131 -66 557 -166 787 -98 3221 -16236 299 -166 133 -562 199 -1692 99 -66 65 -364 65 -366 231 -168 367 -100 5541 -14968 297 -164 97 -132 163 -328 99 -532 99 -134 131 -370 397 -66 397 -98 293 -98 197 -98 1151 -66 7019 -6746 129 -296 163 -954 261 -230 229 -64 231 -264 431 -100 99 -466 165 -100 333 -166 133 -666 695 -200 67 -134 397 -100 1667 -7686 97 -426 195 -266 97 -330 63 -98 99 -594 97 -132 133 -270 131 -600 131 -362 833 -98 297 -166 199 -66 99 -200 65 -66 197 -100 2963 -98 1125 -2238 199 -554 275 -242 273 -212 271 -242 241 -242 271 -244 241 -244 273 -244 245 -246 247 -248 247 -250 247 -250 249 -250 249 -248 249 -248 249 -250 249 -504 257 -248 245 -246 247 -248 503 -258 247 -244 245 -246 247 -248 249 -250 247 -504 513 -228 243 -244 273 -246 245 -500 513 -478 257 -242 241 -244 273 -244 499 -512 225 -244 525 -228 273 -496 475 -508 507 -240 253 -254 255 -494 261 -222 505 -258 245 -246 245 -246 245 -250 247 -506 513 -478 257 -242 241 -244 273 -244 499 -68858 319 -218 245 -230 251 -248 245 -248 247 -250 247 -250 249 -248 249 -248 249 -250 249 -250 249 -248 249 -248 249 -250 249 -248 249 -250 247 -506 257 -246 245 -246 247 -248 503 -516 477 -274 253 -474 511 -478 527 -484 511 -240 253 -472 281 -254 489 -484 513 -478 513 -480 255 -242 523 -472 507 -276 253 -462 275 -240 491 -258 247 -244 245 -246 247 -502 515 -238 253 -254 253 -492 497 -230 253 -250 247 -250 247 -250 247 -250 247 -506 257 -68880 279 -248 241 -266 223 -252 249 -250 249 -248 249 -250 247 -250 249 -250 247 -250 249 -250 247 -250 249 -250 247 -250 249 -248 249 -250 249 -506 225 -280 213 -278 245 -248 503 -260 215 -276 245 -246 247 -248 247 -250 247 -504 481 -272 251 RAW_Data: -254 255 -254 213 -506 483 -514 271 -254 217 -292 217 -248 497 -516 237 -254 473 -278 251 -488 489 -516 477 -272 253 -254 219 -494 261 -260 481 -260 215 -278 247 -248 247 -248 247 -504 481 -514 235 -290 217 -256 253 -244 497 -69132 311 -212 235 -258 249 -248 247 -248 249 -248 249 -248 249 -250 249 -250 247 -250 247 -250 249 -250 247 -250 249 -250 247 -250 249 -248 249 -506 257 -248 245 -246 245 -248 503 -512 479 -272 253 -474 513 -478 527 -482 513 -238 253 -472 281 -254 487 -486 515 -478 509 -480 255 -242 529 -480 509 -240 255 -496 271 -234 487 -260 247 -244 245 -248 247 -504 511 -226 243 -244 275 -498 479 -272 253 -254 255 -254 249 -238 225 -252 247 -504 257 -68882 319 -188 265 -280 235 -228 251 -250 249 -248 249 -248 249 -248 249 -250 249 -250 247 -250 249 -248 249 -250 249 -248 249 -250 247 -250 249 -504 257 -248 245 -246 247 -248 503 -258 247 -244 245 -248 245 -250 247 -250 249 -504 515 -238 251 -256 253 -256 249 -472 515 -480 271 -256 253 -218 255 -248 497 -482 271 -252 473 -280 253 -490 487 -516 477 -274 253 -256 217 -496 261 -224 507 -258 249 -246 245 -248 247 -248 249 -504 511 -478 255 -244 243 -244 275 -246 499 -69134 311 -208 231 -254 249 -246 247 -250 247 -248 249 -250 247 -250 249 -250 247 -250 249 -248 249 -250 249 -248 249 -248 249 -250 249 -248 249 -506 259 -246 245 -246 247 -246 503 -516 479 -274 253 -464 519 -496 487 -516 477 -274 255 -498 249 -248 469 -514 479 -516 483 -488 277 -254 491 -498 487 -260 247 -498 227 -244 529 -228 243 -274 245 -246 245 -502 515 -238 251 -256 253 -496 497 -226 251 -248 249 -248 249 -248 249 -250 249 -504 257 -68898 247 -274 213 -312 185 -312 185 -312 185 -312 185 -312 185 -312 185 -310 185 -310 185 -310 215 -278 217 -278 215 -278 217 -278 217 -280 215 -532 237 -288 217 -290 215 -276 461 -260 219 -280 217 -280 217 -278 215 -280 247 -506 481 -270 251 -256 217 -290 213 -502 483 -514 271 -254 253 -218 255 -246 499 -482 271 -254 473 -282 253 -488 485 -516 477 -274 253 -256 217 -496 263 -224 507 -260 247 -246 245 -246 247 -248 249 -504 513 -478 255 -242 243 -244 275 -246 499 -69122 319 -220 243 -228 251 -248 247 -248 247 -250 247 -250 249 -248 249 -250 249 -248 249 -248 249 -250 249 -250 247 -250 249 -250 247 -250 249 -504 257 -248 245 -246 247 -246 505 -514 479 -274 253 -476 511 -476 493 -516 481 -270 253 -474 279 -254 487 -484 513 RAW_Data: -478 507 -506 225 -272 495 -482 505 -254 241 -494 255 -242 525 -226 241 -274 243 -242 243 -496 509 -274 253 -254 219 -494 491 -258 249 -248 247 -248 249 -248 249 -248 249 -504 257 -68896 281 -214 241 -260 247 -248 247 -248 247 -250 247 -250 249 -248 249 -250 247 -250 249 -250 247 -250 249 -248 249 -250 249 -248 249 -250 249 -504 257 -248 245 -246 245 -248 503 -260 245 -246 245 -248 247 -248 247 -248 249 -504 513 -238 251 -254 255 -254 251 -474 515 -478 273 -254 255 -218 253 -248 499 -514 237 -254 473 -280 253 -490 485 -516 479 -274 253 -256 217 -496 263 -224 507 -258 247 -248 245 -246 247 -250 247 -504 513 -478 257 -244 241 -244 275 -246 499 -69128 321 -218 241 -230 249 -248 247 -246 249 -248 249 -248 249 -248 249 -250 249 -250 247 -250 247 -250 249 -250 247 -250 249 -250 249 -248 249 -504 257 -248 245 -246 245 -250 503 -514 477 -272 255 -474 515 -480 491 -518 479 -274 253 -474 281 -254 483 -486 479 -512 507 -506 223 -242 527 -482 509 -240 253 -496 273 -236 487 -260 247 -246 245 -246 247 -504 513 -238 251 -256 253 -492 495 -228 253 -250 249 -250 249 -250 249 -248 249 -504 257 -68860 273 -242 233 -256 249 -250 247 -248 247 -250 247 -250 249 -250 247 -250 249 -250 247 -250 249 -250 247 -250 249 -248 249 -250 249 -248 249 -504 257 -248 245 -246 247 -248 503 -258 247 -244 245 -248 247 -248 247 -248 249 -504 513 -238 253 -254 253 -256 249 -474 515 -480 273 -254 255 -218 253 -248 497 -516 237 -252 473 -280 253 -490 487 -514 479 -274 253 -254 219 -496 263 -224 507 -258 247 -246 245 -246 247 -248 249 -504 513 -476 257 -242 243 -244 273 -246 499 -68728 129 -604 249 -242 243 -276 213 -276 245 -244 245 -246 245 -278 215 -278 215 -278 247 -248 247 -248 247 -248 249 -248 247 -250 247 -250 247 -250 247 -504 259 -246 245 -246 247 -248 503 -514 477 -272 255 -474 511 -478 527 -484 481 -272 253 -472 281 -254 485 -486 511 -478 511 -480 255 -242 527 -482 505 -254 241 -494 253 -242 495 -254 241 -244 273 -244 243 -494 509 -238 255 -254 255 -492 489 -260 247 -248 245 -248 247 -248 249 -248 249 -504 257 -129658 99 -98 131 -132 97 -100 97 -132 131 -98 131 -496 297 -266 163 -198 99 -398 165 -626 133 -198 531 -166 67 -66 431 -132 331 -100 65 -132 99 -100 2725 -9960 65 -3686 295 -1552 99 -362 195 -100 887 -98 263 -100 1495 -8372 67 -298 99 -100 131 -332 133 -198 233 -398 65 -1060 99 -164 327 RAW_Data: -460 129 -262 97 -100 755 -132 6515 -12306 229 -296 625 -198 131 -200 131 -398 165 -1634 231 -68 331 -166 133 -132 5259 -8900 67 -6298 99 -264 199 -66 133 -100 429 -200 131 -132 195 -266 163 -100 229 -462 165 -334 199 -132 63 -264 163 -264 231 -66 363 -68 331 -66 563 -100 6577 -10216 67 -962 99 -794 131 -198 133 -132 299 -66 133 -66 331 -630 163 -266 163 -132 99 -500 97 -232 195 -394 231 -66 133 -100 329 -400 7509 -12254 65 -166 65 -328 361 -266 65 -68 131 -100 65 -926 65 -758 99 -592 459 -66 557 -98 327 -66 1317 -100 3491 -16028 263 -132 227 -96 297 -68 165 -1160 133 -1030 97 -796 199 -134 65 -132 361 -100 389 -198 3891 -16112 131 -98 229 -1120 163 -1648 131 -392 429 -166 231 -926 2655 -16140 395 -230 227 -296 65 -98 199 -200 99 -1062 99 -134 695 -66 231 -100 97 -198 265 -198 67 -100 2705 -16076 99 -66 263 -398 229 -264 131 -132 63 -100 129 -1780 65 -362 229 -98 295 -132 555 -266 4985 -11336 65 -924 99 -200 263 -330 265 -298 133 -100 163 -628 97 -528 163 -228 459 -132 65 -66 297 -100 261 -100 131 -198 295 -98 229 -66 3967 -10946 131 -830 131 -102 663 -66 361 -396 165 -66 131 -1394 99 -98 131 -166 327 -66 559 -98 295 -134 65 -98 97 -132 427 -328 2763 -15960 131 -432 299 -798 131 -1030 295 -732 197 -132 231 -100 99 -98 199 -134 233 -134 331 -200 7663 -7818 163 -532 99 -264 267 -266 229 -1188 97 -98 99 -1492 463 -132 233 -168 97 -132 825 -66 6395 -13604 131 -430 133 -166 133 -864 65 -1162 397 -198 365 -134 165 -100 365 -66 8413 -8042 163 -164 131 -398 65 -1722 229 -428 97 -130 65 -596 395 -100 429 -100 131 -200 331 -98 433 -68 2937 -7902 65 -332 131 -7288 333 -396 65 -366 99 -232 99 -232 333 -1126 131 -594 99 -398 65 -100 893 -296 163 -66 525 -98 3767 -15992 265 -694 199 -366 231 -1000 65 -1358 97 -134 463 -100 231 -134 3623 -15876 129 -328 129 -132 65 -596 199 -566 231 -530 99 -596 595 -166 593 -200 97 -68 3353 -16312 131 -134 231 -202 133 -134 97 -234 131 -66 165 -628 101 -596 1027 -134 331 -198 3715 -66 195 -10652 229 -164 591 -362 97 -560 359 -464 97 -68 197 -266 165 -332 7019 -9984 199 -1166 363 -132 97 -100 131 -198 133 -232 229 -1058 67 -200 529 -198 65 -98 897 -66 265 -134 6685 -9926 297 -530 589 -66 97 -230 131 -98 99 -724 163 -164 163 -196 229 -164 267 -132 167 -68 333 -66 199 -100 131 -66 497 -66 4929 -9050 97 -5010 65 -1394 99 RAW_Data: -562 165 -98 493 -66 65 -494 63 -132 397 -502 263 -1020 363 -68 8779 -5986 133 -1590 99 -894 165 -66 167 -136 99 -732 265 -66 133 -166 131 -266 267 -564 197 -68 941 -100 3631 -66 4059 -6506 263 -958 165 -568 167 -334 397 -530 231 -166 367 -364 133 -100 131 -134 133 -598 99 -200 2261 -8366 65 -6804 97 -262 263 -132 65 -98 231 -430 97 -164 97 -428 65 -134 99 -668 131 -296 233 -200 499 -98 889 -98 6325 -502 211 -558 271 -240 265 -224 249 -248 247 -248 249 -248 249 -250 247 -250 249 -250 249 -248 249 -250 247 -250 249 -248 249 -250 249 -248 249 -250 249 -504 257 -248 245 -246 245 -248 503 -258 247 -246 245 -246 247 -248 249 -504 257 -246 499 -480 507 -256 241 -244 273 -496 509 -224 243 -526 477 -510 507 -240 253 -498 245 -244 497 -260 245 -246 243 -502 255 -248 243 -246 501 -258 247 -244 245 -500 511 -476 257 -242 527 -476 505 -254 241 -494 507 -480 255 -68596 289 -214 247 -250 249 -252 249 -250 249 -250 249 -250 249 -250 247 -250 249 -248 249 -250 247 -250 249 -250 247 -250 247 -250 249 -250 249 -504 257 -248 245 -246 247 -248 503 -514 477 -272 255 -254 217 -496 491 -516 481 -512 255 -242 497 -274 253 -254 219 -496 263 -224 251 -250 505 -514 477 -256 243 -244 243 -276 243 -500 225 -278 497 -478 509 -512 473 -256 241 -244 273 -496 255 -242 243 -244 495 -274 251 -474 279 -254 487 -486 257 -248 243 -68886 271 -238 265 -226 251 -250 249 -248 249 -250 249 -248 249 -250 247 -250 249 -248 249 -250 249 -250 247 -250 249 -250 247 -250 247 -250 249 -504 257 -248 245 -248 245 -248 503 -260 245 -246 243 -248 247 -248 249 -504 257 -248 499 -480 507 -256 241 -244 243 -530 475 -256 243 -494 509 -482 507 -274 255 -484 237 -244 499 -260 247 -246 245 -504 257 -246 245 -244 501 -258 245 -246 245 -500 513 -480 273 -256 473 -484 509 -262 225 -508 513 -478 255 -68906 287 -254 211 -272 225 -252 247 -250 247 -250 247 -250 249 -250 247 -250 249 -250 249 -248 249 -250 247 -250 249 -248 249 -250 249 -248 249 -506 227 -278 245 -246 247 -246 505 -514 477 -272 253 -254 217 -496 491 -516 479 -510 257 -244 497 -272 253 -254 217 -498 261 -224 253 -250 505 -516 475 -256 243 -246 245 -244 245 -530 225 -246 529 -478 507 -510 483 -276 217 -292 217 -486 259 -248 247 -250 501 -258 215 -532 225 -244 529 -478 257 -242 243 -68922 239 -244 271 -226 251 -248 247 -250 247 -250 247 -250 247 -250 249 -248 249 RAW_Data: -250 249 -250 249 -248 249 -248 249 -250 249 -250 247 -250 247 -506 257 -248 245 -246 245 -248 503 -258 245 -246 245 -248 247 -248 247 -506 257 -248 497 -480 509 -272 255 -254 255 -460 525 -226 249 -500 511 -478 507 -238 291 -476 245 -252 481 -260 247 -246 245 -502 255 -248 245 -246 501 -258 245 -246 245 -500 511 -476 255 -244 525 -478 505 -254 243 -492 507 -480 255 -68946 283 -250 241 -226 251 -248 247 -248 247 -250 247 -250 249 -250 249 -248 249 -248 249 -250 249 -250 247 -250 249 -248 249 -250 249 -248 249 -506 257 -248 245 -246 245 -248 503 -512 477 -274 253 -254 255 -460 493 -518 479 -510 255 -244 495 -274 253 -256 217 -496 261 -226 251 -250 503 -514 477 -274 253 -256 253 -218 249 -500 259 -246 499 -480 513 -482 505 -254 241 -244 243 -526 223 -272 243 -244 495 -272 255 -500 249 -246 473 -516 227 -244 243 -68908 317 -218 243 -258 247 -246 245 -248 247 -248 249 -248 249 -250 247 -250 249 -250 247 -250 249 -250 247 -248 249 -250 249 -250 247 -250 249 -504 257 -248 245 -246 247 -248 503 -258 247 -244 245 -248 245 -250 247 -504 257 -248 499 -480 507 -274 253 -254 255 -460 527 -224 249 -502 511 -476 505 -256 241 -494 255 -242 527 -240 253 -254 255 -458 261 -262 223 -252 505 -260 245 -246 245 -500 511 -476 257 -242 525 -474 509 -238 289 -464 519 -496 225 -68914 283 -252 243 -266 223 -252 249 -252 249 -248 249 -250 249 -250 249 -250 247 -248 247 -250 247 -250 247 -250 249 -250 247 -250 247 -250 249 -506 225 -278 245 -246 247 -248 503 -516 479 -274 215 -292 217 -494 491 -516 477 -510 255 -244 497 -272 217 -290 219 -494 261 -258 221 -252 505 -514 479 -272 251 -256 217 -254 247 -500 227 -278 499 -480 509 -514 477 -276 253 -256 217 -520 225 -252 247 -248 503 -260 215 -530 225 -246 495 -510 257 -244 245 -68932 283 -218 247 -240 257 -250 247 -248 247 -248 249 -248 249 -248 249 -248 249 -250 249 -250 247 -250 249 -248 249 -250 249 -248 249 -250 247 -506 259 -246 245 -246 245 -248 503 -260 245 -246 245 -246 247 -248 249 -504 259 -248 497 -482 509 -274 255 -218 253 -498 491 -258 247 -500 511 -478 507 -238 289 -466 283 -210 503 -258 247 -244 245 -500 257 -246 245 -244 501 -260 245 -244 245 -500 511 -476 257 -242 525 -474 509 -238 289 -464 519 -496 225 -68912 285 -250 243 -230 253 -250 247 -250 247 -250 247 -250 247 -250 249 -250 249 -250 247 -250 247 -250 249 -250 247 -250 249 -248 249 RAW_Data: -250 247 -504 227 -280 245 -246 247 -248 501 -514 477 -272 253 -254 219 -496 493 -514 481 -512 223 -276 495 -274 217 -290 217 -496 229 -256 253 -250 507 -516 477 -258 243 -244 245 -244 245 -530 225 -246 497 -512 511 -482 509 -240 253 -256 251 -482 257 -250 247 -248 505 -258 215 -532 235 -252 473 -518 243 -280 235 -68898 281 -248 239 -230 253 -250 247 -248 247 -250 247 -250 249 -248 249 -250 249 -250 247 -250 249 -250 249 -248 249 -250 249 -248 249 -250 249 -504 257 -248 245 -246 245 -248 505 -258 247 -244 245 -248 247 -248 247 -504 257 -246 501 -480 513 -238 289 -220 253 -494 489 -260 247 -502 479 -508 509 -238 253 -482 277 -248 479 -260 247 -248 247 -502 257 -246 245 -246 499 -258 247 -244 245 -502 515 -476 257 -242 495 -512 475 -272 255 -496 481 -492 259 -68570 131 -550 315 -218 253 -256 245 -236 255 -248 247 -250 247 -248 249 -248 249 -248 249 -250 249 -248 249 -250 249 -248 249 -248 249 -250 249 -250 249 -504 257 -248 243 -248 245 -248 503 -512 477 -274 253 -254 255 -458 525 -482 515 -478 255 -242 495 -274 253 -256 217 -496 261 -226 253 -250 505 -514 475 -256 243 -244 273 -244 245 -498 257 -246 499 -478 507 -506 507 -238 255 -254 255 -492 227 -254 249 -248 503 -258 247 -498 257 -214 527 -480 271 -256 253 -138338 231 -728 97 -596 199 -556 163 -262 427 -330 359 -164 727 -66 663 -396 4171 -7546 65 -864 131 -362 529 -326 131 -2650 231 -298 197 -66 335 -264 529 -66 2745 -16072 201 -132 133 -664 265 -2520 433 -132 465 -134 459 -364 267 -66 1303 -8330 297 -368 133 -890 197 -1992 131 -462 67 -66 265 -266 561 -296 197 -198 195 -132 459 -66 3345 -16118 99 -164 297 -66 229 -332 97 -234 65 -166 65 -764 97 -700 67 -232 465 -134 563 -200 363 -100 1487 -96 5715 -8386 195 -298 163 -130 295 -100 97 -494 99 -754 327 -164 295 -132 195 -66 425 -66 3351 -64 1925 -6840 231 -64 97 -66 131 -462 99 -98 131 -494 197 -2274 397 -68 163 -166 565 -166 197 -100 3691 -64 3991 -8380 65 -164 197 -194 327 -100 367 -860 233 -596 629 -100 231 -132 1957 -100 1993 -66 3287 -6542 97 -1854 331 -132 131 -662 297 -494 99 -100 201 -1730 365 -166 559 -100 199 -66 331 -198 2209 -130 3295 -13088 99 -332 131 -790 263 -98 163 -1252 165 -196 263 -130 99 -132 361 -132 291 -262 99 -196 6531 -12274 133 -630 65 -302 165 -334 99 -1590 165 -828 291 -98 691 -198 561 -132 133 -68 7049 -9118 331 -662 165 -66 65 -132 65 RAW_Data: -364 129 -98 265 -98 97 -66 589 -5626 67 -2546 231 -230 197 -232 197 -262 261 -464 97 -594 229 -296 165 -130 65 -166 99 -166 97 -66 229 -100 99 -66 131 -132 3567 -7898 95 -6038 99 -802 163 -68 97 -232 131 -326 65 -298 97 -132 231 -302 99 -298 65 -132 231 -1024 97 -100 331 -100 397 -232 99 -66 263 -68 231 -298 7371 -8180 165 -100 261 -68 165 -430 229 -198 67 -132 131 -300 65 -266 165 -498 165 -66 531 -232 263 -68 593 -134 131 -13852 65 -198 133 -634 97 -1128 97 -264 131 -66 165 -198 293 -494 99 -428 99 -962 99 -132 133 -264 833 -98 233 -14108 65 -1496 131 -230 67 -100 133 -666 131 -132 133 -232 65 -268 99 -400 99 -1854 597 -132 263 -98 493 -230 893 -98 3963 -15854 197 -130 165 -98 195 -330 261 -330 97 -132 97 -664 65 -500 5941 -132 1485 -11064 97 -992 163 -132 65 -434 197 -532 97 -134 297 -922 329 -658 163 -132 421 -264 429 -100 265 -298 229 -134 3353 -15986 131 -362 131 -132 459 -230 199 -66 393 -1060 99 -1096 131 -134 263 -66 163 -132 259 -130 97 -328 331 -66 99 -166 2561 -14808 65 -762 65 -66 197 -100 299 -398 133 -134 131 -66 65 -98 297 -10702 97 -464 131 -1526 133 -198 129 -100 131 -164 99 -132 163 -1098 129 -962 163 -300 65 -66 963 -166 3181 -8734 363 -2112 163 -1062 297 -98 427 -100 165 -100 231 -100 7535 -6418 65 -1522 65 -196 97 -64 131 -166 97 -332 65 -166 197 -100 265 -1564 65 -132 67 -696 133 -198 535 -98 297 -164 263 -8472 97 -560 327 -100 129 -64 65 -228 165 -162 163 -2146 561 -100 827 -232 463 -66 731 -66 4783 -10516 131 -300 131 -832 99 -100 331 -198 133 -232 99 -234 165 -266 165 -362 231 -66 297 -134 495 -98 165 -266 99 -132 859 -66 163 -98 165 -98 5587 -12622 131 -200 165 -1460 99 -432 265 -860 65 -262 591 -66 195 -100 425 -166 259 -66 227 -100 9819 -556 65 -3310 295 -562 199 -98 267 -200 131 -66 131 -168 99 -962 131 -534 99 -1848 197 -100 365 -132 1031 -66 2057 -66 2023 -7754 97 -7222 263 -698 165 -264 131 -366 97 -464 65 -466 65 -298 231 -430 97 -98 263 -64 953 -66 4093 -100 4171 -6616 65 -1220 99 -268 99 -98 99 -200 201 -134 97 -98 165 -164 295 -132 357 -396 165 -98 65 -230 163 -164 423 -130 651 -64 3641 -130 859 -7392 165 -100 165 -166 99 -66 167 -132 101 -132 67 -166 165 -100 333 -660 99 -162 97 -162 63 -424 131 -98 129 -392 131 -68 395 -132 389 -66 161 -17386 261 -298 99 -134 131 RAW_Data: -100 65 -366 131 -166 197 -68 97 -166 165 -788 131 -198 97 -132 129 -164 163 -132 199 -66 267 -232 165 -68 165 -98 199 -134 1197 -568 273 -256 253 -256 249 -240 225 -252 247 -248 247 -248 247 -250 247 -250 249 -248 249 -250 249 -248 249 -250 247 -250 249 -250 249 -248 249 -504 257 -248 245 -246 247 -248 503 -258 247 -244 245 -248 245 -250 247 -504 257 -248 499 -226 277 -496 255 -216 525 -480 257 -242 273 -242 497 -480 511 -274 253 -474 513 -478 263 -224 253 -250 247 -250 503 -260 245 -246 245 -500 257 -248 243 -248 499 -514 477 -272 255 -474 511 -478 263 -260 479 -514 477 -68856 257 -248 247 -248 247 -248 249 -248 249 -248 249 -250 249 -248 249 -250 249 -250 249 -248 249 -248 249 -250 247 -250 249 -250 249 -250 247 -504 257 -248 245 -246 247 -248 503 -514 477 -274 253 -256 217 -494 523 -228 249 -502 513 -238 253 -254 253 -492 231 -264 227 -254 505 -258 247 -246 245 -248 245 -250 247 -504 257 -248 499 -478 509 -274 253 -500 249 -246 237 -228 509 -516 477 -516 483 -490 501 -518 479 -262 225 -512 257 -248 499 -69120 321 -218 245 -234 253 -250 247 -250 247 -250 247 -250 247 -250 247 -250 249 -250 249 -248 249 -250 247 -250 249 -250 247 -250 249 -248 249 -506 257 -248 245 -246 245 -248 503 -260 245 -246 245 -246 247 -248 249 -504 257 -248 499 -228 243 -530 225 -244 529 -478 257 -242 243 -244 529 -476 509 -238 255 -512 479 -506 259 -226 251 -252 249 -250 505 -258 245 -246 245 -504 257 -246 245 -244 501 -516 479 -274 253 -476 479 -508 261 -226 511 -514 477 -69158 271 -240 263 -226 249 -250 247 -250 247 -250 249 -250 247 -250 249 -250 247 -250 249 -248 249 -250 249 -248 249 -248 249 -250 249 -250 249 -504 257 -246 245 -246 247 -248 505 -514 475 -256 243 -244 243 -526 479 -272 255 -474 511 -240 243 -270 225 -508 257 -246 245 -246 501 -258 245 -244 245 -248 247 -248 247 -504 257 -248 499 -480 509 -274 253 -464 285 -246 239 -228 507 -482 509 -506 509 -482 507 -486 515 -240 241 -500 259 -248 499 -69138 283 -254 241 -230 251 -248 247 -248 249 -248 249 -248 249 -250 247 -250 249 -248 249 -250 249 -250 249 -248 249 -248 249 -250 249 -248 249 -504 257 -248 245 -246 247 -248 503 -258 247 -246 243 -248 247 -248 247 -504 257 -248 499 -228 245 -530 237 -252 503 -486 279 -246 237 -230 507 -516 479 -274 253 -464 517 -496 227 -254 249 -250 247 -250 505 -258 247 -246 245 -502 257 -246 245 RAW_Data: -244 501 -512 477 -272 255 -474 511 -478 263 -228 511 -514 475 -69198 287 -218 249 -238 255 -250 249 -248 247 -250 249 -248 249 -250 247 -250 249 -248 249 -250 249 -250 247 -250 247 -250 247 -250 249 -250 249 -504 257 -248 245 -246 247 -248 503 -514 477 -272 255 -254 217 -498 493 -258 249 -504 479 -272 253 -254 255 -490 231 -262 225 -252 507 -258 247 -246 245 -248 245 -250 247 -504 257 -248 499 -480 513 -238 255 -498 247 -280 237 -228 507 -514 479 -516 483 -490 503 -506 505 -248 253 -492 229 -254 505 -69150 317 -284 135 -324 159 -348 157 -346 157 -346 157 -314 189 -312 187 -314 187 -312 187 -312 187 -312 185 -312 187 -280 217 -280 215 -312 185 -566 195 -278 215 -278 215 -278 469 -306 213 -290 219 -288 207 -268 223 -510 225 -280 467 -272 249 -506 247 -254 489 -490 257 -248 245 -248 501 -516 477 -256 243 -494 509 -508 237 -256 253 -256 249 -240 487 -260 245 -246 245 -500 257 -248 243 -246 501 -512 475 -274 253 -476 511 -478 263 -260 477 -514 479 -69176 271 -240 265 -224 251 -250 249 -250 249 -250 247 -250 247 -250 249 -250 247 -250 249 -250 247 -250 249 -248 249 -250 249 -250 247 -250 249 -506 257 -248 245 -246 245 -248 503 -514 477 -256 243 -244 243 -530 477 -274 253 -476 479 -272 239 -266 225 -508 259 -248 245 -246 501 -258 215 -276 245 -246 247 -248 247 -504 257 -248 501 -480 511 -256 243 -496 255 -242 243 -244 497 -512 475 -516 509 -520 477 -510 495 -226 251 -504 257 -248 499 -69162 285 -218 249 -240 257 -250 247 -248 247 -250 247 -250 249 -250 247 -250 249 -250 247 -250 249 -248 249 -250 247 -250 249 -248 249 -250 249 -504 257 -248 245 -246 247 -248 503 -258 247 -244 245 -246 247 -248 249 -504 257 -248 499 -226 277 -498 225 -244 527 -478 257 -244 243 -244 527 -476 507 -258 241 -494 507 -510 237 -256 253 -254 251 -242 491 -226 277 -244 245 -500 255 -248 243 -246 501 -512 477 -256 243 -494 507 -506 253 -244 495 -480 505 -69176 261 -258 221 -252 251 -250 249 -250 249 -250 249 -250 249 -250 249 -248 249 -250 249 -248 249 -250 249 -250 247 -250 247 -250 249 -250 247 -506 227 -280 245 -246 245 -248 503 -516 477 -256 243 -244 245 -496 509 -256 243 -496 509 -238 255 -254 255 -490 229 -254 251 -250 505 -258 215 -278 245 -246 247 -250 247 -504 227 -278 499 -480 511 -274 217 -514 243 -248 243 -266 483 -514 481 -512 475 -520 473 -506 507 -248 243 -500 249 -244 497 -69180 273 -256 217 RAW_Data: -290 219 -246 235 -256 251 -248 249 -248 249 -248 249 -250 249 -250 247 -250 249 -248 249 -250 249 -248 249 -250 247 -250 249 -504 227 -278 245 -246 247 -246 505 -258 215 -278 245 -246 247 -248 247 -506 225 -278 499 -228 245 -530 225 -244 497 -508 257 -244 243 -246 497 -512 477 -272 255 -482 511 -500 229 -254 251 -250 249 -250 503 -260 215 -278 215 -534 225 -246 245 -276 499 -482 513 -238 253 -500 483 -528 227 -252 505 -514 479 -68732 173 -546 275 -240 233 -256 247 -250 247 -250 247 -250 247 -250 249 -250 247 -250 247 -250 249 -250 247 -250 249 -250 247 -250 249 -250 247 -250 249 -504 257 -248 245 -246 247 -248 503 -514 477 -272 255 -254 217 -498 493 -260 249 -500 479 -272 253 -254 255 -494 233 -262 223 -252 505 -258 247 -246 245 -246 247 -250 247 -504 257 -248 499 -482 511 -238 255 -498 245 -280 237 -228 507 -516 479 -512 477 -518 475 -518 481 -270 237 -494 259 -250 501 -136574 65 -1160 65 -770 395 -198 199 -66 65 -330 231 -436 65 -1228 165 -664 727 -198 199 -166 229 -196 457 -64 493 -66 1987 -15790 99 -100 131 -234 231 -496 893 -234 297 -66 8071 -8244 99 -236 165 -134 199 -132 67 -198 165 -1094 65 -1782 195 -66 921 -66 229 -100 391 -132 7785 -7282 65 -402 65 -166 267 -266 165 -100 231 -166 461 -166 65 -696 65 -298 131 -166 99 -232 263 -100 397 -166 499 -66 165 -364 7435 -8394 331 -198 99 -198 99 -234 99 -1738 991 -198 333 -198 499 -132 891 -98 3239 -15978 165 -896 97 -100 131 -198 97 -532 65 -300 67 -1330 329 -66 859 -66 199 -232 397 -100 7707 -8162 363 -232 165 -98 231 -130 165 -294 131 -858 99 -932 65 -164 131 -264 565 -198 165 -132 233 -366 7109 -6100 65 -3046 165 -500 131 -232 67 -1028 99 -232 97 -300 65 -434 727 -166 363 -100 367 -64 263 -100 3147 -15114 65 -164 197 -296 97 -66 229 -264 497 -332 67 -98 99 -432 163 -132 65 -794 199 -166 297 -200 6509 -12574 199 -234 65 -132 99 -334 67 -264 131 -100 331 -168 65 -266 99 -166 397 -266 431 -98 565 -166 527 -100 3021 -68 3551 -12844 163 -294 165 -300 461 -856 331 -66 99 -1160 131 -132 293 -132 493 -166 261 -196 1149 -132 2177 -68 961 -15018 65 -992 99 -266 99 -200 229 -164 197 -956 231 -368 67 -100 99 -930 297 -360 623 -166 695 -134 1631 -66 957 -100 3451 -10430 65 -100 65 -1120 65 -198 65 -98 567 -200 199 -560 297 -792 65 -196 97 -690 197 -164 295 -66 295 -132 6963 -7554 131 -952 197 -228 131 RAW_Data: -332 97 -264 295 -492 65 -1418 131 -396 363 -66 265 -134 731 -100 165 -68 133 -66 7537 -7378 65 -922 197 -164 229 -230 529 -66 165 -98 199 -132 65 -726 65 -164 97 -824 97 -230 427 -166 1363 -8016 97 -3030 65 -892 133 -164 99 -162 395 -230 163 -230 163 -230 197 -626 65 -166 97 -498 97 -700 495 -66 1215 -164 327 -10158 129 -1690 595 -198 163 -232 165 -164 365 -100 97 -732 99 -498 197 -364 365 -166 165 -134 797 -100 563 -100 3113 -9966 97 -426 165 -5434 393 -332 65 -98 99 -164 97 -232 65 -726 99 -266 265 -232 67 -298 461 -100 663 -68 9469 -8388 165 -396 231 -134 197 -166 67 -1556 97 -132 95 -230 65 -130 99 -98 657 -66 327 -68 527 -98 4249 -7974 97 -300 131 -264 397 -132 165 -562 99 -1060 65 -732 497 -134 531 -100 199 -66 203 -66 2987 -100 1657 -12228 97 -364 265 -200 165 -792 65 -396 129 -1312 623 -164 261 -98 165 -162 465 -66 3855 -8016 97 -6056 65 -1896 65 -366 99 -266 133 -132 99 -332 231 -864 133 -100 725 -98 261 -328 363 -98 293 -66 4765 -12278 99 -434 165 -64 65 -166 197 -498 65 -166 231 -500 99 -398 199 -398 695 -132 431 -100 131 -132 165 -66 199 -302 1463 -3364 241 -526 317 -212 235 -254 247 -248 245 -248 247 -250 247 -250 249 -248 249 -250 249 -248 249 -250 249 -248 249 -250 247 -250 249 -248 249 -250 249 -504 257 -248 245 -246 245 -248 503 -258 247 -246 245 -246 247 -248 249 -248 249 -248 249 -506 513 -238 251 -256 253 -490 499 -488 513 -476 509 -274 255 -474 479 -272 237 -266 225 -508 511 -226 245 -244 275 -500 225 -246 275 -244 501 -228 245 -528 225 -246 529 -478 257 -244 243 -244 245 -276 499 -226 245 -276 245 -246 245 -68834 321 -218 243 -232 253 -248 245 -248 247 -250 247 -250 249 -250 247 -250 249 -248 249 -250 249 -248 249 -250 249 -248 249 -250 247 -250 249 -504 257 -248 245 -246 247 -248 503 -512 477 -272 255 -500 483 -500 489 -514 479 -274 253 -254 219 -254 247 -236 255 -250 247 -504 257 -248 497 -226 245 -530 477 -274 253 -254 255 -458 525 -484 511 -476 509 -482 507 -274 255 -254 217 -488 259 -250 247 -248 245 -250 503 -260 245 -500 479 -272 255 -69110 309 -218 253 -256 253 -246 231 -254 247 -248 247 -248 247 -248 249 -250 247 -250 249 -248 249 -250 249 -250 247 -250 249 -248 249 -250 247 -506 257 -248 245 -246 245 -248 503 -260 245 -246 245 -248 245 -248 249 -248 249 -250 247 -506 513 -226 273 -244 243 -498 513 -476 509 RAW_Data: -482 519 -240 255 -496 505 -228 253 -250 247 -504 513 -226 273 -244 243 -498 257 -246 245 -244 499 -258 245 -500 257 -214 527 -478 257 -242 273 -244 243 -246 501 -258 245 -246 245 -246 247 -69160 247 -274 213 -274 245 -242 245 -276 213 -276 245 -244 245 -246 245 -278 213 -278 245 -248 249 -248 247 -250 249 -248 249 -250 247 -248 249 -504 257 -246 245 -246 247 -248 503 -512 477 -274 251 -476 509 -512 461 -518 479 -258 243 -244 245 -276 245 -246 247 -248 247 -504 257 -248 501 -226 245 -530 477 -256 243 -244 245 -532 479 -480 509 -520 485 -488 509 -262 221 -252 249 -506 257 -248 245 -246 247 -248 503 -258 247 -498 477 -258 243 -69136 303 -236 227 -256 247 -250 247 -250 247 -250 249 -250 249 -248 249 -248 249 -250 247 -250 249 -250 249 -248 249 -248 249 -250 249 -248 249 -506 257 -248 243 -246 247 -248 505 -258 247 -244 245 -246 247 -250 247 -248 249 -250 247 -506 513 -226 243 -274 245 -498 511 -476 507 -482 507 -274 255 -484 475 -264 261 -222 251 -506 513 -238 251 -256 253 -496 233 -264 225 -252 505 -260 247 -498 225 -246 529 -478 257 -244 243 -244 275 -244 499 -258 245 -244 245 -246 247 -69174 321 -218 253 -242 231 -252 249 -248 247 -248 249 -248 249 -248 249 -250 249 -248 249 -250 247 -250 249 -250 247 -250 249 -248 249 -250 247 -504 259 -246 245 -248 245 -248 505 -514 479 -274 253 -476 511 -478 493 -516 481 -272 255 -254 253 -220 247 -240 257 -250 247 -502 257 -248 499 -228 245 -528 479 -272 255 -254 253 -460 525 -482 515 -476 509 -482 505 -254 241 -242 243 -526 225 -272 243 -242 243 -244 529 -238 253 -472 511 -276 247 -69140 309 -212 241 -244 273 -242 243 -242 243 -274 243 -244 241 -244 245 -276 245 -244 247 -248 247 -248 249 -250 247 -250 249 -250 247 -250 247 -506 257 -248 245 -246 245 -248 503 -258 245 -246 247 -246 247 -248 249 -248 249 -250 249 -504 513 -238 251 -254 255 -494 501 -484 513 -478 509 -238 253 -514 481 -270 235 -264 223 -506 513 -238 253 -254 255 -490 231 -266 225 -254 507 -258 247 -500 225 -246 529 -480 271 -256 253 -256 217 -248 501 -258 247 -244 245 -246 247 -69188 287 -218 247 -234 255 -250 247 -248 249 -248 249 -248 249 -248 249 -250 249 -250 247 -250 249 -250 247 -250 249 -248 249 -250 247 -250 249 -504 257 -248 245 -248 245 -250 503 -514 479 -274 253 -498 483 -500 487 -514 477 -258 241 -244 243 -246 275 -244 245 -248 245 -504 257 -248 499 -228 245 RAW_Data: -528 477 -256 243 -244 245 -530 475 -508 509 -482 509 -492 505 -246 253 -254 243 -494 227 -278 245 -248 245 -248 503 -258 215 -530 479 -272 251 -69146 297 -230 225 -252 249 -250 249 -250 249 -250 249 -250 247 -250 249 -250 247 -250 249 -248 249 -250 249 -248 249 -250 249 -248 249 -250 247 -506 259 -246 245 -246 247 -248 501 -258 247 -244 245 -248 247 -248 249 -248 249 -250 247 -506 513 -238 251 -254 255 -494 501 -484 513 -478 509 -238 253 -514 479 -270 237 -264 223 -508 513 -238 253 -254 255 -494 233 -262 225 -252 505 -258 247 -500 225 -246 529 -478 257 -242 243 -244 275 -246 499 -258 215 -276 245 -246 245 -69160 287 -254 251 -238 227 -252 249 -248 247 -250 247 -250 247 -250 249 -250 249 -250 249 -250 247 -250 249 -248 249 -250 247 -250 249 -250 247 -506 227 -280 215 -276 245 -248 505 -480 511 -272 253 -476 479 -506 493 -514 479 -260 243 -246 245 -276 245 -246 247 -248 247 -504 227 -278 499 -238 249 -504 473 -280 241 -244 243 -500 505 -520 485 -500 487 -518 479 -274 251 -256 217 -496 263 -224 251 -252 249 -250 503 -258 247 -500 479 -258 243 -131656 133 -100 133 -200 165 -100 97 -232 627 -1028 133 -992 163 -132 635 -264 197 -100 4009 -10800 163 -230 231 -168 65 -132 201 -400 395 -98 99 -296 393 -100 295 -66 1425 -6868 99 -1394 129 -164 65 -392 329 -1518 229 -198 163 -100 665 -66 199 -166 335 -166 165 -98 3141 -8982 65 -6896 163 -262 391 -230 195 -428 163 -526 131 -98 165 -196 65 -98 65 -724 131 -200 1585 -164 6977 -13106 131 -164 65 -692 97 -894 65 -998 297 -66 165 -166 401 -132 233 -66 561 -266 1987 -64 555 -13660 99 -430 131 -232 131 -398 99 -630 99 -100 267 -464 97 -924 99 -66 265 -526 561 -132 165 -68 199 -134 1951 -66 1643 -15920 231 -528 163 -162 65 -458 229 -98 65 -622 97 -68 97 -132 163 -134 631 -398 131 -198 883 -66 759 -64 1083 -16320 699 -464 163 -328 131 -232 231 -230 97 -690 263 -294 557 -100 729 -230 427 -98 65 -130 7841 -8604 131 -262 163 -200 199 -398 99 -98 263 -490 97 -132 97 -130 129 -626 229 -396 557 -66 229 -164 393 -262 395 -98 2347 -16232 297 -300 99 -68 297 -3186 461 -330 229 -68 131 -130 1389 -66 3247 -10450 131 -1522 229 -496 131 -100 195 -132 129 -66 327 -64 99 -196 133 -1794 67 -132 329 -100 197 -498 165 -132 165 -166 263 -132 7439 -7152 99 -502 131 -134 65 -200 199 -164 133 -100 401 -266 367 -1260 197 -366 297 -428 399 -198 897 RAW_Data: -66 3765 -13986 497 -562 97 -732 297 -266 99 -232 429 -132 65 -298 197 -268 97 -1192 1259 -68 65 -132 97 -100 8047 -6842 97 -362 165 -130 131 -66 459 -164 197 -164 263 -164 359 -462 195 -262 65 -1122 229 -66 755 -100 465 -132 6211 -9870 99 -66 129 -100 163 -98 131 -264 131 -162 97 -198 97 -196 197 -262 229 -958 165 -266 65 -98 697 -200 5723 -12050 299 -66 231 -232 99 -528 99 -66 233 -134 65 -534 131 -1028 97 -300 63 -266 97 -100 133 -134 891 -100 4201 -100 3703 -8722 229 -360 263 -164 459 -66 819 -132 163 -1126 267 -66 231 -200 731 -232 229 -8678 131 -132 229 -198 295 -592 165 -820 65 -756 99 -66 65 -68 99 -200 199 -332 297 -100 565 -7800 65 -500 65 -7518 465 -368 99 -230 65 -832 99 -2356 627 -198 131 -100 361 -130 295 -132 3819 -96 5271 -6210 65 -266 393 -98 131 -64 329 -362 365 -66 133 -132 67 -632 65 -430 265 -166 65 -566 131 -132 461 -66 1429 -134 4601 -10498 65 -402 65 -430 229 -328 359 -98 263 -624 165 -168 199 -166 97 -494 197 -196 99 -98 261 -132 297 -166 99 -66 4183 -66 2927 -6458 99 -1894 427 -498 331 -562 131 -1458 229 -690 1785 -68 231 -100 731 -12140 165 -168 67 -134 131 -100 233 -198 99 -662 265 -730 299 -166 227 -328 97 -164 821 -66 2903 -66 1043 -7904 65 -3146 65 -4854 99 -98 133 -132 133 -760 99 -692 259 -1554 65 -98 495 -230 261 -64 491 -166 163 -98 227 -16058 97 -100 163 -294 197 -164 195 -100 129 -362 163 -626 65 -166 129 -526 65 -132 829 -100 597 -68 197 -366 1025 -66 497 -98 1387 -66 329 -12300 99 -232 99 -232 65 -532 99 -100 165 -402 131 -1326 395 -98 565 -232 131 -168 65 -166 1621 -66 2509 -13018 165 -362 99 -1982 99 -66 65 -764 593 -430 229 -132 329 -164 263 -100 2629 -15978 297 -68 131 -662 65 -98 99 -526 133 -132 133 -498 97 -560 229 -66 855 -98 593 -98 7597 -8606 427 -164 131 -822 65 -98 67 -296 97 -496 131 -198 97 -164 97 -394 1449 -230 397 -66 2897 -8398 165 -236 97 -1752 65 -330 65 -462 231 -134 131 -2680 1025 -132 633 -130 7803 -6500 65 -2808 67 -332 197 -164 97 -66 163 -2234 195 -132 425 -66 755 -98 2687 -66 5177 -6880 65 -1510 97 -232 195 -232 131 -234 197 -200 65 -166 65 -198 165 -134 67 -1262 395 -100 297 -98 165 -402 331 -134 5357 -12090 197 -232 99 -332 97 -2278 265 -66 563 -134 297 -66 3607 -10024 65 -4678 363 -166 201 -200 165 -100 163 -392 131 -98 129 -624 195 -332 65 -962 295 RAW_Data: -132 165 -132 3857 -11128 241 -562 311 -208 235 -256 249 -250 247 -248 249 -248 247 -250 249 -250 249 -250 247 -250 249 -248 249 -250 247 -250 249 -248 249 -250 249 -250 247 -504 259 -246 245 -246 247 -248 503 -258 247 -246 245 -248 245 -250 247 -250 247 -250 247 -506 513 -238 251 -256 253 -256 247 -474 259 -248 501 -480 509 -274 217 -514 477 -272 237 -266 223 -508 481 -512 509 -482 509 -490 505 -520 247 -246 241 -230 255 -250 249 -250 247 -250 505 -514 479 -512 475 -274 255 -68824 287 -218 273 -250 237 -230 251 -248 247 -248 247 -250 247 -250 247 -250 249 -250 247 -250 249 -250 247 -250 249 -248 249 -250 249 -248 249 -504 257 -248 245 -246 247 -248 503 -514 477 -256 243 -494 509 -274 253 -476 245 -252 517 -226 249 -502 511 -224 243 -528 475 -508 505 -474 255 -242 273 -242 495 -274 253 -500 485 -498 227 -254 247 -250 503 -260 245 -498 513 -478 511 -472 507 -274 255 -254 255 -212 271 -480 511 -226 241 -69142 299 -230 225 -254 249 -250 249 -250 247 -250 249 -248 249 -250 247 -250 249 -250 249 -248 249 -250 249 -248 249 -250 249 -248 249 -250 249 -504 257 -246 245 -246 247 -248 501 -258 247 -246 245 -248 247 -248 247 -250 247 -250 249 -504 513 -226 243 -276 243 -246 245 -502 257 -246 499 -478 509 -274 253 -500 485 -232 263 -226 251 -506 513 -476 509 -480 505 -508 489 -504 249 -242 241 -274 243 -242 241 -274 243 -242 495 -512 507 -482 509 -240 253 -69136 287 -254 249 -240 227 -252 249 -248 249 -248 249 -248 249 -250 249 -250 247 -250 249 -248 249 -250 249 -250 249 -248 249 -248 249 -250 249 -504 257 -248 245 -246 245 -248 503 -516 477 -256 243 -496 509 -238 253 -514 243 -248 479 -260 249 -504 479 -258 243 -498 509 -514 475 -522 241 -254 255 -250 473 -260 249 -502 477 -510 255 -244 243 -246 497 -272 251 -474 509 -512 497 -486 483 -270 253 -254 255 -254 213 -506 481 -272 251 -69172 263 -226 285 -218 249 -250 249 -250 249 -250 247 -250 249 -250 247 -250 249 -250 249 -248 249 -248 249 -250 249 -248 249 -250 249 -248 249 -506 257 -246 245 -246 247 -248 503 -258 247 -244 245 -248 247 -248 247 -250 249 -250 247 -504 513 -228 243 -244 273 -244 245 -502 259 -246 499 -480 511 -274 255 -474 513 -240 239 -232 257 -506 513 -476 509 -478 505 -516 503 -472 279 -254 253 -252 239 -228 249 -248 247 -248 503 -514 477 -510 509 -238 253 -69168 273 -254 253 -220 253 -248 237 -256 249 -248 247 -250 247 RAW_Data: -250 247 -250 249 -250 247 -250 249 -248 249 -250 249 -250 247 -250 247 -250 249 -504 257 -248 245 -246 247 -248 501 -514 479 -272 255 -500 483 -234 263 -486 257 -248 501 -226 247 -528 479 -274 253 -474 511 -510 497 -482 259 -246 245 -244 501 -258 247 -498 477 -510 257 -242 243 -244 495 -272 251 -474 509 -512 497 -486 511 -226 245 -276 243 -246 245 -502 513 -240 251 -69164 295 -228 223 -252 249 -250 251 -250 249 -248 249 -250 249 -250 247 -250 249 -250 247 -250 249 -248 249 -250 247 -250 249 -248 249 -250 249 -506 257 -248 243 -246 247 -248 503 -258 245 -246 245 -248 247 -248 247 -250 249 -248 249 -504 513 -226 243 -246 275 -246 243 -502 257 -246 499 -478 509 -274 255 -474 479 -272 241 -266 223 -508 515 -478 509 -482 487 -520 481 -508 263 -228 253 -252 249 -250 249 -250 247 -250 503 -514 475 -508 507 -226 241 -69190 287 -218 249 -240 257 -250 247 -248 249 -248 247 -250 249 -250 249 -248 249 -250 249 -250 247 -250 249 -248 249 -250 247 -250 249 -248 249 -506 257 -248 245 -246 245 -248 503 -514 477 -274 253 -474 511 -240 241 -500 259 -248 499 -258 245 -498 477 -274 253 -474 511 -512 495 -484 257 -246 245 -246 501 -258 245 -500 481 -512 253 -244 241 -244 495 -272 255 -474 517 -480 493 -516 511 -240 251 -256 253 -254 249 -470 515 -240 251 -69160 255 -244 243 -248 249 -250 249 -250 247 -250 249 -250 247 -250 249 -248 249 -250 249 -250 247 -250 249 -250 247 -250 249 -250 247 -250 249 -506 257 -248 245 -246 247 -248 503 -258 215 -278 245 -246 247 -248 249 -248 249 -248 249 -506 481 -270 253 -254 253 -256 213 -506 257 -250 501 -482 513 -238 255 -514 477 -270 233 -262 223 -508 479 -514 509 -508 475 -520 475 -518 247 -248 243 -268 223 -250 249 -250 247 -250 505 -516 479 -514 475 -256 241 -69148 295 -226 223 -252 249 -250 249 -250 249 -250 249 -250 247 -250 249 -250 247 -250 247 -250 249 -250 249 -248 249 -250 247 -250 249 -248 249 -504 257 -248 245 -246 247 -248 503 -514 475 -256 243 -494 513 -238 289 -464 283 -210 505 -258 247 -498 513 -238 255 -474 509 -514 497 -484 257 -248 243 -246 499 -258 247 -498 509 -474 257 -242 243 -244 527 -238 251 -502 503 -490 515 -496 481 -258 245 -246 245 -246 247 -504 513 -238 253 -124420 65 -360 97 -98 129 -328 97 -426 99 -296 65 -232 231 -168 497 -232 163 -592 197 -392 131 -728 1593 -134 365 -66 97 -100 3173 -66 2309 -11768 163 -724 457 -100 197 RAW_Data: -200 461 -66 165 -496 131 -134 99 -98 133 -98 97 -494 165 -230 97 -166 963 -266 3041 -15870 131 -98 231 -166 133 -68 199 -100 133 -132 633 -100 265 -198 65 -334 365 -198 131 -466 1129 -166 299 -234 3643 -16164 99 -364 231 -68 233 -598 133 -232 197 -100 133 -66 229 -66 297 -394 1219 -100 163 -166 3307 -7734 65 -4936 95 -1288 333 -232 233 -200 65 -364 333 -300 131 -100 165 -634 65 -564 131 -200 761 -232 563 -13840 133 -200 67 -464 65 -1318 231 -302 263 -100 199 -132 99 -166 99 -166 197 -328 163 -66 691 -262 497 -66 5665 -9958 99 -364 65 -1028 165 -398 265 -196 65 -132 561 -230 165 -66 461 -266 331 -364 131 -398 165 -166 595 -100 199 -102 729 -132 5765 -10908 65 -1388 129 -658 97 -98 295 -132 99 -132 131 -1152 265 -66 199 -98 731 -98 197 -66 751 -98 2631 -100 1691 -11754 263 -198 131 -132 133 -168 199 -132 99 -66 97 -1580 231 -100 4231 -14088 65 -1810 97 -690 65 -98 99 -164 397 -232 299 -2124 565 -64 267 -15924 99 -266 67 -132 565 -66 331 -266 165 -664 231 -1358 663 -264 297 -134 5749 -12972 197 -854 97 -1782 131 -100 63 -428 461 -66 891 -98 329 -64 1185 -15082 99 -468 97 -68 231 -396 165 -232 65 -134 65 -264 201 -430 231 -98 1097 -68 233 -132 5943 -12230 261 -756 99 -596 97 -132 97 -362 229 -198 163 -194 65 -64 395 -98 199 -100 133 -66 299 -11664 129 -658 97 -66 131 -98 263 -394 163 -132 129 -100 229 -1714 231 -166 99 -66 231 -132 599 -100 1127 -68 431 -100 1119 -14044 65 -1032 131 -826 99 -596 499 -266 199 -862 133 -1292 395 -100 921 -198 331 -132 363 -15244 97 -624 231 -134 163 -500 131 -530 201 -134 133 -132 67 -464 131 -998 965 -66 365 -100 3769 -9910 65 -6926 265 -264 133 -166 131 -166 233 -130 99 -132 65 -396 195 -196 65 -98 97 -98 557 -98 165 -66 397 -66 7539 -8488 199 -332 65 -200 199 -1458 65 -466 99 -66 65 -698 297 -68 361 -132 531 -134 165 -68 6531 -11410 65 -896 99 -264 67 -132 197 -98 165 -532 99 -100 165 -562 99 -100 297 -728 983 -98 131 -98 229 -230 63 -262 4137 -16250 427 -298 329 -430 99 -360 131 -724 131 -264 97 -796 825 -166 265 -134 3663 -14070 97 -1750 197 -68 163 -132 229 -530 165 -428 65 -132 65 -98 65 -1684 229 -100 229 -66 97 -330 131 -134 231 -100 3781 -8504 65 -7400 67 -164 131 -66 495 -164 133 -166 131 -202 65 -102 165 -568 65 -134 65 -498 229 -132 129 -394 197 -98 295 -66 427 -66 397 -68 2533 RAW_Data: -16126 133 -268 131 -200 63 -196 229 -394 295 -758 131 -358 65 -164 263 -594 427 -66 131 -66 393 -5360 199 -132 165 -526 65 -230 165 -262 65 -66 97 -296 131 -556 65 -792 131 -402 331 -132 97 -168 429 -100 365 -66 401 -4724 65 -1924 99 -300 65 -1066 65 -266 65 -332 165 -366 65 -332 131 -166 233 -166 499 -264 65 -300 67 -132 99 -132 65 -432 397 -164 657 -64 263 -66 555 -66 2729 -10288 65 -5204 97 -100 591 -166 99 -496 97 -100 65 -98 99 -296 97 -428 265 -100 229 -164 263 -100 765 -100 263 -66 3453 -7586 133 -7046 99 -962 131 -98 131 -134 565 -66 131 -134 593 -66 131 -1384 97 -330 131 -402 5065 -15884 65 -664 297 -266 167 -134 101 -134 99 -596 165 -496 99 -564 2351 -66 6223 -11750 65 -330 365 -68 99 -132 99 -634 131 -860 163 -130 65 -1226 197 -98 861 -134 495 -266 2219 -11598 65 -1316 99 -758 229 -2510 131 -100 167 -68 303 -100 499 -164 131 -100 397 -7704 65 -7902 299 -100 131 -100 199 -166 531 -66 133 -298 199 -398 131 -100 65 -166 133 -66 199 -100 635 -132 599 -66 199 -134 361 -66 3253 -226 425 -15180 133 -568 297 -132 199 -132 793 -330 65 -526 97 -132 425 -526 331 -68 303 -548 297 -230 225 -254 249 -250 249 -250 249 -250 247 -250 249 -248 249 -250 249 -248 249 -250 247 -250 249 -250 247 -250 249 -248 249 -250 249 -506 257 -248 245 -246 245 -248 503 -260 245 -246 243 -248 247 -502 515 -238 253 -472 277 -242 499 -508 481 -504 489 -516 477 -274 253 -256 253 -460 495 -260 249 -248 247 -250 247 -504 257 -248 245 -246 501 -512 475 -508 255 -242 243 -242 245 -274 499 -478 257 -244 243 -244 529 -476 509 -274 253 -218 255 -68836 285 -252 243 -228 249 -248 245 -248 247 -250 247 -250 249 -248 249 -248 249 -250 249 -248 249 -250 249 -250 247 -250 247 -250 249 -250 249 -504 259 -248 243 -246 247 -248 503 -514 475 -256 243 -494 509 -274 253 -218 255 -254 247 -496 257 -246 497 -226 275 -496 511 -474 507 -480 255 -242 273 -242 495 -274 253 -464 523 -498 225 -250 503 -258 245 -244 245 -502 511 -476 509 -510 473 -508 521 -488 249 -252 481 -516 225 -256 289 -68864 259 -224 249 -252 251 -250 251 -250 249 -248 249 -250 249 -250 249 -248 249 -250 247 -250 249 -248 249 -250 249 -250 249 -248 249 -250 247 -504 257 -248 245 -246 247 -248 503 -258 245 -246 245 -248 247 -504 513 -240 251 -474 247 -272 499 -508 483 -506 489 -516 477 -274 253 -256 217 -496 491 -260 247 RAW_Data: -248 249 -248 247 -504 257 -248 245 -246 501 -512 477 -512 253 -244 241 -244 243 -246 529 -478 257 -242 243 -244 529 -478 509 -238 253 -254 255 -69126 287 -254 251 -240 227 -252 247 -248 247 -250 247 -250 247 -250 249 -250 247 -250 249 -248 249 -250 249 -250 247 -250 247 -250 249 -250 249 -504 257 -248 245 -246 245 -248 503 -516 479 -272 255 -476 511 -238 241 -268 223 -252 249 -504 257 -248 499 -228 243 -530 477 -512 505 -474 255 -242 243 -274 495 -274 255 -474 485 -506 261 -222 507 -260 247 -246 245 -502 511 -478 509 -480 507 -488 499 -510 277 -246 471 -516 225 -256 253 -68936 271 -238 231 -256 249 -248 249 -248 249 -250 249 -248 249 -250 247 -250 249 -250 247 -250 249 -250 249 -248 249 -248 249 -250 249 -248 249 -504 257 -248 245 -246 247 -248 503 -260 245 -246 245 -246 247 -504 513 -238 251 -504 249 -254 489 -488 513 -476 509 -512 475 -274 255 -254 253 -488 483 -258 215 -276 245 -246 245 -504 255 -248 245 -246 503 -514 477 -512 225 -242 273 -242 243 -244 529 -476 255 -244 243 -244 529 -478 509 -238 253 -254 255 -69140 307 -220 253 -254 253 -246 231 -256 247 -248 247 -250 247 -250 247 -250 249 -248 249 -250 249 -250 247 -250 249 -250 247 -250 247 -250 249 -506 257 -248 245 -246 245 -248 503 -514 477 -272 255 -474 515 -242 239 -268 223 -252 247 -504 259 -246 501 -226 245 -530 479 -512 509 -482 253 -242 241 -244 529 -238 253 -498 481 -528 225 -250 503 -260 245 -244 245 -502 511 -478 509 -482 505 -506 505 -486 249 -252 487 -516 227 -256 251 -68924 311 -210 233 -258 247 -250 247 -250 247 -248 249 -250 247 -250 249 -250 247 -250 247 -250 249 -250 249 -250 247 -250 249 -248 249 -250 249 -506 257 -248 245 -244 247 -246 505 -258 247 -244 245 -246 247 -504 515 -238 253 -472 281 -254 487 -486 513 -478 509 -512 475 -274 253 -256 253 -488 483 -228 255 -290 217 -254 255 -494 229 -254 249 -250 505 -514 477 -512 255 -242 243 -242 243 -244 529 -478 257 -242 243 -244 529 -480 513 -240 253 -254 255 -69136 321 -218 253 -246 229 -254 247 -246 247 -248 249 -248 249 -248 249 -248 249 -250 249 -250 247 -250 249 -250 247 -250 249 -250 249 -248 249 -504 257 -248 245 -246 247 -248 503 -514 479 -272 255 -474 511 -240 241 -270 225 -252 247 -504 259 -246 499 -228 273 -498 511 -476 509 -480 253 -242 273 -242 491 -256 241 -494 507 -504 255 -242 491 -256 243 -242 243 -526 475 -506 505 -506 473 -504 505 RAW_Data: -504 251 -242 495 -490 249 -242 271 -68916 273 -238 229 -256 249 -248 249 -250 247 -250 247 -250 249 -250 247 -250 249 -250 247 -250 249 -248 249 -250 249 -248 249 -250 249 -250 247 -506 257 -248 245 -246 245 -248 503 -258 245 -246 247 -246 247 -504 481 -258 243 -528 225 -244 495 -512 509 -482 507 -504 475 -276 255 -254 249 -474 515 -238 251 -254 255 -254 249 -474 257 -250 245 -248 501 -514 479 -512 225 -242 273 -244 243 -246 495 -508 255 -244 243 -246 497 -512 483 -272 255 -254 253 -69136 283 -254 241 -230 251 -248 245 -248 249 -248 249 -248 249 -250 249 -248 249 -250 247 -250 249 -248 249 -250 249 -250 247 -250 249 -250 247 -504 259 -246 245 -246 247 -248 503 -514 477 -274 253 -500 483 -232 265 -228 253 -250 249 -506 259 -248 499 -226 245 -528 477 -508 509 -484 253 -244 241 -244 497 -272 255 -496 479 -528 225 -252 505 -260 215 -276 245 -500 479 -510 509 -482 507 -510 491 -508 245 -246 479 -518 227 -292 215 -68942 321 -218 233 -274 235 -260 223 -250 249 -250 249 -250 249 -250 247 -250 249 -248 249 -250 249 -250 247 -250 249 -248 249 -250 247 -250 249 -506 225 -280 213 -278 245 -248 503 -260 215 -276 215 -278 245 -504 479 -258 245 -496 257 -246 497 -514 475 -508 507 -508 461 -280 251 -252 241 -496 481 -272 251 -256 253 -254 249 -470 259 -248 245 -248 499 -512 475 -510 237 -256 253 -256 251 -244 493 -514 223 -244 245 -276 497 -480 509 -256 243 -244 243 -68750 131 -586 287 -220 253 -246 233 -254 249 -248 247 -248 249 -248 249 -248 249 -250 249 -248 249 -250 249 -248 249 -248 249 -250 249 -250 247 -250 249 -504 259 -248 243 -248 245 -248 501 -514 477 -274 253 -474 513 -240 241 -268 227 -250 249 -504 257 -248 499 -226 245 -530 477 -510 507 -482 255 -242 241 -244 523 -256 241 -494 505 -474 257 -242 525 -224 273 -242 243 -494 507 -508 481 -506 505 -504 471 -506 249 -242 527 -472 251 -242 271 -119988 65 -164 163 -1380 229 -262 65 -1322 65 -564 99 -860 65 -566 501 -66 499 -164 395 -132 199 -100 895 -11996 131 -166 295 -132 165 -234 65 -164 231 -102 199 -134 97 -498 199 -164 265 -66 197 -132 65 -100 99 -664 1297 -98 8085 -7700 99 -634 365 -134 363 -954 99 -2236 261 -66 789 -98 425 -100 459 -12258 99 -198 267 -100 99 -102 97 -200 133 -300 67 -166 163 -464 133 -66 99 -828 927 -132 331 -166 9065 -7016 67 -98 67 -1290 131 -396 165 -134 131 -1026 97 -1118 65 -1048 919 -134 699 RAW_Data: -100 3443 -13736 133 -1852 65 -232 363 -202 431 -100 133 -98 265 -166 197 -66 299 -526 131 -100 163 -832 727 -168 131 -200 65 -132 197 -102 331 -16028 99 -132 99 -198 99 -68 133 -364 163 -432 197 -464 131 -100 133 -298 97 -466 165 -200 133 -396 331 -66 823 -66 7065 -12144 97 -428 359 -164 65 -100 593 -198 163 -164 131 -132 99 -98 131 -1448 1193 -100 365 -132 10335 -1482 65 -364 63 -1844 97 -134 231 -630 131 -200 265 -232 65 -166 65 -368 197 -1126 297 -132 131 -66 1259 -134 129 -66 99 -66 8323 -6196 263 -298 97 -164 97 -492 231 -794 131 -166 67 -428 65 -954 755 -98 261 -66 261 -230 131 -230 1425 -11490 167 -562 197 -364 63 -428 65 -228 463 -166 65 -19728 165 -134 363 -100 131 -168 197 -198 101 -826 99 -1678 99 -66 561 -98 161 -66 229 -230 163 -398 265 -166 699 -9874 67 -2192 165 -200 67 -1096 131 -2282 227 -332 231 -98 165 -68 165 -364 3503 -7996 65 -430 99 -662 231 -266 165 -66 133 -134 199 -164 99 -168 65 -398 65 -730 231 -100 297 -198 67 -132 863 -134 231 -102 267 -68 871 -68 765 -66 823 -9234 99 -4694 231 -134 197 -166 99 -368 363 -100 233 -694 231 -400 65 -464 131 -234 99 -230 65 -400 297 -66 8683 -7160 233 -1030 129 -298 263 -100 299 -264 165 -100 229 -792 65 -164 131 -294 65 -264 459 -426 525 -132 229 -298 5509 -9856 131 -100 263 -232 163 -266 531 -232 99 -398 65 -332 165 -534 131 -68 293 -596 887 -232 4775 -16286 197 -364 65 -132 99 -98 163 -1350 131 -100 167 -398 99 -432 533 -100 929 -66 65 -228 3861 -3258 99 -434 65 -232 99 -332 133 -860 265 -66 233 -166 131 -100 197 -100 99 -66 99 -530 65 -564 65 -132 165 -232 265 -200 199 -100 165 -100 67 -98 531 -132 427 -10628 165 -232 199 -132 131 -366 199 -464 65 -2290 399 -198 333 -168 597 -166 533 -66 2453 -66 4151 -7656 99 -1062 131 -232 133 -98 131 -68 163 -198 133 -334 67 -596 923 -132 161 -98 327 -362 4939 -12358 195 -230 131 -528 65 -1744 65 -360 97 -396 63 -166 1047 -198 65 -196 231 -130 97 -12510 131 -198 99 -668 97 -166 199 -1224 99 -1128 65 -98 429 -132 365 -198 765 -132 1227 -9838 65 -5956 295 -266 297 -430 229 -1286 65 -392 197 -988 163 -132 625 -100 165 -66 525 -66 4229 -16222 129 -132 295 -66 163 -132 97 -66 97 -692 97 -462 65 -1026 265 -132 827 -166 163 -166 167 -234 6731 -12228 233 -166 99 -200 131 -632 133 -332 65 -498 263 -100 229 -262 463 -100 199 -100 733 RAW_Data: -100 3989 -11100 131 -894 131 -464 65 -332 99 -132 133 -132 101 -236 99 -1328 165 -100 133 -198 1027 -360 3341 -9980 133 -1858 65 -166 133 -166 67 -134 395 -166 99 -930 97 -100 199 -234 99 -428 99 -164 1051 -66 657 -100 9339 -3804 197 -624 65 -2224 131 -900 529 -264 197 -296 231 -98 727 -132 199 -100 265 -66 99 -68 6671 -12588 165 -132 165 -132 233 -928 165 -934 99 -200 1557 -100 331 -166 7333 -8240 295 -164 263 -98 97 -132 97 -198 261 -230 197 -298 229 -692 197 -662 661 -200 231 -66 197 -15936 199 -960 65 -234 165 -466 231 -2022 431 -98 801 -232 463 -66 229 -164 3261 -8456 67 -5980 65 -1990 133 -364 97 -400 65 -132 99 -134 99 -132 99 -1292 429 -166 265 -68 3517 -8746 65 -862 165 -332 267 -198 67 -200 65 -166 299 -100 165 -2022 465 -430 165 -134 301 -136 297 -66 3287 -100 951 -132 3825 -8094 197 -132 129 -364 129 -66 163 -164 295 -428 131 -392 99 -394 459 -396 463 -164 4081 -10550 99 -266 67 -2688 203 -582 261 -260 223 -252 249 -250 249 -250 249 -250 249 -248 249 -250 249 -248 249 -250 247 -250 249 -250 249 -248 249 -250 247 -250 249 -248 249 -506 257 -248 245 -246 245 -248 503 -260 245 -246 245 -246 247 -504 511 -226 243 -528 225 -244 529 -238 253 -472 517 -244 279 -238 227 -252 247 -250 247 -504 513 -226 243 -528 477 -274 253 -256 217 -254 247 -500 259 -246 499 -226 245 -274 245 -246 245 -502 513 -476 255 -244 495 -274 253 -254 255 -218 247 -502 513 -476 257 -68588 311 -208 233 -256 249 -248 249 -248 247 -250 247 -250 249 -250 247 -250 249 -248 249 -250 249 -248 249 -250 249 -248 249 -250 249 -248 249 -504 257 -248 245 -246 247 -248 503 -514 477 -272 255 -254 217 -498 263 -226 509 -514 475 -274 253 -256 253 -460 525 -482 513 -478 507 -506 223 -244 271 -244 495 -274 253 -476 243 -252 247 -238 259 -248 503 -260 245 -246 245 -246 247 -248 249 -504 257 -248 245 -246 501 -514 479 -274 253 -218 255 -254 247 -234 255 -69132 319 -220 243 -232 251 -248 247 -248 247 -250 247 -250 249 -248 249 -250 247 -250 249 -250 247 -250 249 -250 247 -250 249 -248 249 -250 249 -504 257 -248 245 -246 245 -248 503 -258 247 -246 245 -246 247 -504 515 -238 251 -474 279 -254 489 -228 253 -506 513 -238 251 -256 253 -254 251 -240 227 -510 479 -258 243 -528 475 -274 253 -256 217 -254 247 -500 257 -248 499 -226 245 -276 243 -246 245 -502 513 -478 257 -242 495 -274 253 -256 217 -254 247 -500 513 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/smc5326.sub ================================================ Filetype: Flipper SubGhz Key File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: SMC5326 Bit: 25 Key: 00 00 00 00 01 7D 55 80 TE: 210 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/smc5326_raw.sub ================================================ Filetype: Flipper SubGhz RAW File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: RAW RAW_Data: 2442 -312 275 -972 949 -310 941 -322 923 -342 921 -352 923 -334 281 -954 945 -350 279 -958 907 -354 289 -980 909 -352 281 -962 907 -330 311 -964 913 -350 317 -930 933 -344 921 -352 893 -330 311 -954 943 -318 315 -958 909 -324 947 -7854 953 -322 289 -948 939 -354 927 -332 911 -324 943 -344 917 -318 317 -964 905 -344 303 -942 947 -312 319 -960 913 -348 281 -958 941 -322 295 -978 905 -350 279 -962 931 -328 947 -324 939 -346 267 -964 935 -348 283 -938 953 -318 931 -7868 935 -346 269 -968 953 -310 941 -322 921 -330 935 -342 931 -318 311 -962 939 -290 337 -950 909 -352 317 -924 943 -324 313 -938 941 -318 317 -932 939 -344 301 -938 933 -350 921 -322 959 -310 301 -942 933 -352 317 -926 957 -314 919 -7868 943 -314 317 -958 909 -322 951 -344 919 -352 921 -324 937 -326 281 -964 941 -318 317 -930 939 -344 301 -938 933 -352 281 -962 953 -314 317 -922 933 -330 315 -954 943 -318 921 -342 943 -320 291 -980 909 -354 281 -962 943 -296 967 -7836 943 -332 309 -950 935 -318 929 -340 943 -320 921 -344 921 -354 283 -960 943 -296 309 -964 945 -318 279 -964 941 -322 333 -944 939 -314 279 -992 903 -342 319 -932 933 -330 931 -340 929 -348 281 -964 935 -334 281 -970 927 -346 921 -7862 951 -314 319 -922 953 -320 923 -346 921 -320 965 -298 943 -324 313 -942 941 -320 317 -930 941 -344 303 -940 945 -312 321 -940 953 -314 303 -960 933 -348 287 -962 911 -352 917 -350 905 -324 333 -918 971 -322 317 -924 945 -324 937 -7872 919 -324 317 -942 941 -318 933 -330 943 -324 943 -310 951 -318 317 -930 939 -344 301 -938 933 -352 317 -926 953 -314 319 -924 939 -324 331 -950 907 -354 315 -926 945 -324 939 -312 953 -318 317 -930 937 -344 301 -940 947 -348 909 -7864 949 -310 319 -956 915 -350 919 -348 905 -322 963 -296 935 -348 317 -922 951 -322 295 -976 939 -314 281 -996 915 -326 307 -940 959 -310 301 -966 935 -346 285 -958 915 -348 921 -348 903 -354 303 -948 911 -350 315 -926 945 -324 941 -7874 943 -290 319 -942 973 -318 929 -314 937 -328 941 -324 939 -310 303 -962 933 -352 285 -962 949 -314 319 -924 951 -320 293 -948 941 -354 283 -962 943 -294 309 -966 943 -320 931 -328 943 -326 311 -940 939 -320 309 -958 933 -338 943 -7840 933 -352 277 -964 941 -322 923 -344 923 -350 931 -310 955 -320 291 -974 907 -350 281 -958 963 -298 313 -956 945 -314 311 -960 937 -312 311 -966 909 -324 319 -944 941 -354 929 -298 945 -324 315 -940 RAW_Data: 943 -354 281 -964 905 -330 933 -7868 951 -324 315 -938 943 -354 893 -330 943 -324 943 -344 919 -318 317 -962 903 -344 301 -974 903 -350 317 -932 931 -342 269 -972 949 -346 285 -938 955 -310 301 -964 935 -348 921 -320 921 -344 301 -940 935 -350 317 -930 929 -318 937 -7872 939 -344 301 -940 947 -346 917 -322 921 -344 923 -352 927 -334 281 -970 925 -334 277 -982 943 -318 317 -932 931 -344 301 -936 935 -350 281 -960 957 -312 303 -960 935 -346 907 -322 929 -344 301 -942 935 -350 317 -924 955 -312 951 -7858 919 -342 309 -940 949 -348 909 -322 923 -344 923 -352 923 -336 317 -924 945 -312 311 -966 921 -340 317 -924 947 -350 281 -958 941 -322 291 -976 905 -350 279 -960 935 -342 943 -320 919 -330 311 -958 943 -320 315 -932 935 -344 919 -7866 957 -312 303 -964 917 -342 945 -320 923 -344 923 -354 929 -298 315 -956 941 -318 315 -960 911 -324 317 -942 939 -354 281 -964 941 -294 311 -968 943 -318 317 -932 937 -330 931 -350 919 -348 283 -960 917 -350 317 -922 939 -322 965 -7864 921 -324 329 -950 909 -354 923 -336 913 -322 947 -344 919 -354 281 -962 941 -294 311 -960 935 -354 281 -962 939 -294 311 -964 937 -354 281 -964 941 -296 309 -964 939 -318 931 -330 945 -324 315 -940 939 -354 281 -964 909 -344 921 -7862 963 -304 307 -976 933 -320 929 -328 941 -324 939 -348 915 -320 317 -930 939 -344 301 -940 965 -320 319 -926 953 -312 303 -960 933 -312 321 -960 913 -348 319 -924 943 -320 959 -310 921 -354 319 -924 943 -324 311 -938 941 -318 957 -7862 943 -318 317 -932 933 -344 925 -352 897 -332 943 -324 943 -346 267 -966 951 -310 321 -960 911 -350 281 -958 949 -320 291 -978 937 -316 279 -964 949 -326 309 -944 943 -314 959 -318 933 -336 317 -934 933 -344 267 -964 937 -350 905 -7896 943 -318 319 -926 955 -314 919 -350 935 -324 941 -294 967 -312 303 -962 933 -348 285 -960 917 -348 317 -922 941 -322 329 -950 907 -354 315 -926 943 -326 313 -940 941 -352 893 -332 949 -324 315 -938 941 -352 283 -962 943 -310 925 -7890 931 -344 269 -968 949 -310 943 -320 923 -350 937 -310 955 -318 317 -930 935 -344 301 -942 947 -346 285 -958 915 -346 317 -924 951 -322 295 -982 905 -352 317 -924 945 -324 941 -346 917 -318 317 -962 905 -330 311 -956 937 -352 897 -7878 939 -354 283 -960 941 -294 965 -312 953 -318 385 -201512 165 -198 265 -526 229 -298 755 -164 61687 -17310 131 -1056 99 -296 195 -296 65 -66 1617 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/somfy_keytis_raw.sub ================================================ Filetype: Flipper SubGhz RAW File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: RAW RAW_Data: 1753 -32700 2581 -2598 2513 -2604 2535 -2568 2529 -2602 2519 -2608 2523 -2574 2529 -2598 2517 -2604 2537 -2596 2521 -2574 2523 -2600 2515 -2530 4829 -1304 1305 -1308 1309 -678 669 -1280 1305 -680 639 -678 653 -1308 1273 -1334 645 -686 645 -684 611 -716 645 -684 1273 -1340 1269 -1338 641 -684 643 -684 643 -684 609 -714 1273 -682 643 -680 643 -1340 643 -684 1271 -1310 645 -684 1303 -682 643 -1308 1301 -1312 645 -682 1275 -1350 649 -644 649 -702 647 -678 679 -654 645 -646 681 -644 683 -642 1309 -672 647 -690 645 -1314 635 -680 1297 -688 651 -1316 647 -682 617 -686 649 -682 1307 -660 639 -704 639 -1304 1293 -688 653 -672 621 -696 653 -664 653 -668 651 -670 647 -704 613 -704 617 -704 613 -708 613 -708 613 -710 613 -1336 665 -652 1285 -680 655 -1340 583 -1734 2523 -2570 2543 -2572 2529 -2564 2533 -2570 2531 -2596 2519 -2478 4805 -1310 1299 -1314 1313 -680 637 -1328 1289 -684 623 -690 653 -1322 1289 -1308 651 -668 651 -688 615 -688 679 -654 1305 -1304 1305 -1304 645 -686 645 -688 643 -652 643 -712 1273 -680 653 -680 651 -1312 647 -682 1273 -1342 639 -680 1271 -718 613 -1348 1281 -1310 639 -680 1295 -1314 653 -678 645 -682 645 -678 675 -648 651 -678 651 -678 647 -678 1281 -698 613 -706 613 -1336 669 -658 1293 -684 639 -1330 629 -686 653 -686 653 -654 1309 -678 621 -1340 1273 -712 603 -712 639 -672 653 -664 651 -666 651 -670 651 -702 617 -672 649 -704 613 -706 615 -706 615 -708 613 -1334 1293 -688 621 -1316 659 -686 1281 -2338 2501 -2600 2511 -2606 2491 -2624 2481 -2610 2521 -2560 2527 -2506 4797 -1308 1299 -1312 1317 -678 635 -1294 1323 -682 619 -692 635 -1334 1291 -1312 653 -658 679 -656 647 -688 643 -654 1303 -1336 1301 -1304 643 -690 641 -654 675 -654 643 -682 1303 -678 655 -680 645 -1308 677 -654 1309 -1310 645 -682 1275 -686 647 -1320 1281 -1318 679 -642 1317 -1300 667 -636 677 -660 673 -656 705 -612 671 -670 643 -670 681 -646 1309 -660 669 -674 637 -1310 673 -658 1293 -690 653 -1290 657 -688 649 -656 679 -658 1303 -676 635 -1314 657 -658 1307 -678 669 -670 621 -690 635 -672 649 -674 647 -674 647 -674 647 -708 613 -710 645 -676 647 -676 613 -1336 631 -688 1285 -680 655 -1306 647 -688 611 -1706 2535 -2592 2529 -2570 2533 -2566 2543 -2570 2529 -2572 2533 -2474 4807 -1294 1325 -1314 1279 -680 665 -1290 1323 -648 659 -688 653 -1290 1317 -1310 657 -656 679 -658 641 -688 643 -656 1303 -1334 1299 -1302 675 -646 675 -644 677 -658 643 -688 1303 -676 641 -676 633 -1314 691 -654 1277 -1336 649 -656 1305 -674 667 -1284 1315 -1308 653 -656 1305 -1306 679 -658 645 -690 RAW_Data: 641 -656 709 -624 673 -656 679 -652 675 -648 1301 -678 645 -670 643 -1332 645 -656 1305 -678 645 -1336 641 -692 641 -656 673 -654 1307 -1308 1303 -678 679 -642 647 -678 647 -680 655 -648 655 -686 647 -656 675 -656 655 -656 683 -658 643 -688 643 -654 675 -1314 1275 -692 651 -1288 1319 -678 635 -1296 661 -1684 2527 -2602 2515 -2568 2541 -2602 2479 -2612 2523 -2578 2509 -2502 4783 -1344 1273 -1320 1283 -710 637 -1292 1319 -680 637 -668 649 -1332 1291 -1316 653 -656 679 -642 645 -688 679 -670 1289 -1310 1283 -1308 679 -670 629 -688 653 -654 647 -688 1311 -676 621 -708 641 -1306 677 -646 1307 -1306 643 -678 1303 -676 635 -1318 1289 -1340 651 -672 1275 -1338 649 -670 631 -688 655 -686 679 -636 667 -654 653 -656 681 -676 1277 -680 653 -676 655 -1304 645 -688 1271 -710 635 -1308 653 -668 671 -658 1295 -686 637 -1330 1295 -1310 1281 -678 665 -648 667 -664 647 -670 649 -702 613 -708 613 -710 645 -676 645 -676 647 -642 681 -1304 1295 -1314 653 -656 1309 -678 635 -680 633 -32700 2601 -2608 2491 -2602 2525 -2598 2521 -2604 2511 -2604 2531 -2584 2535 -2602 2503 -2620 2493 -2602 2533 -2600 2505 -2610 2533 -2474 4829 -1338 1297 -1316 1283 -716 651 -1280 1303 -676 635 -688 637 -1334 1297 -1310 653 -656 681 -644 645 -680 1307 -676 655 -1308 1305 -1304 645 -688 643 -656 643 -684 1307 -678 655 -682 647 -680 647 -1302 645 -680 1305 -1310 643 -682 1303 -682 621 -1312 1311 -1314 671 -644 1313 -1316 637 -680 669 -658 637 -696 637 -682 677 -648 643 -684 643 -68 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/somfy_telis_raw.sub ================================================ Filetype: Flipper SubGhz RAW File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: RAW RAW_Data: 675 -624 645 -648 643 -1278 1319 -1242 675 -626 2435 -727768 3971 -2848 681 -1752 2603 -2562 2599 -2534 4613 -1258 1333 -1252 1305 -644 649 -1270 681 -610 667 -614 679 -608 1311 -638 665 -614 665 -620 695 -608 651 -1278 665 -634 667 -614 1303 -652 653 -632 671 -610 649 -642 649 -620 699 -1250 651 -650 1291 -618 675 -642 649 -1268 1331 -616 671 -1250 685 -616 1293 -622 675 -1272 673 -618 1309 -1286 631 -656 665 -626 1289 -628 673 -618 679 -1242 1341 -612 681 -608 651 -1278 1325 -624 643 -646 667 -1248 1319 -616 679 -608 681 -32648 9731 -7680 2595 -2560 2597 -2534 4615 -1256 1303 -1286 1305 -642 649 -1270 665 -616 691 -624 663 -624 1291 -628 673 -1276 1295 -618 665 -1280 677 -628 643 -646 1295 -622 659 -1288 1307 -630 669 -612 681 -1240 679 -614 1319 -628 673 -1244 697 -592 1337 -608 685 -616 669 -1250 1311 -638 669 -614 681 -1236 1341 -1246 1323 -1272 1305 -632 665 -1256 677 -630 1305 -614 673 -1254 685 -616 1295 -622 675 -1270 669 -626 1307 -624 655 -1294 639 -14120 2597 -2568 2589 -2540 2625 -2542 2589 -2572 2593 -2546 2623 -2536 2589 -2586 4593 -1248 1325 -1278 1303 -606 683 -1270 667 -612 665 -636 669 -614 1305 -650 653 -1258 1305 -644 649 -1270 667 -616 695 -624 1291 -640 641 -1286 1297 -620 675 -640 649 -1274 683 -608 1323 -616 675 -1246 661 -628 1335 -608 651 -652 667 -1252 1313 -630 667 -612 679 -1272 1305 -1244 1321 -1290 1305 -626 671 -1240 673 -618 1339 -618 669 -1250 653 -650 1291 -620 697 -1250 677 -612 1297 -642 683 -1242 667 -14104 2623 -2526 2621 -2532 2619 -2532 2623 -2534 2619 -2530 2623 -2534 2619 -2532 4629 -1244 1323 -1274 1303 -642 649 -1268 669 -614 661 -624 699 -594 1319 -614 693 -1256 1303 -644 649 -1268 667 -614 693 -594 1323 -628 673 -1278 1291 -616 665 -622 667 -1280 675 -628 1303 -612 677 -1254 695 -608 1307 -634 671 -614 647 -1272 1341 -616 669 -596 681 -1256 1333 -1256 1305 -1270 1303 -642 649 -1282 667 -618 1303 -618 691 -1256 679 -612 1301 -644 649 -1278 665 -634 1297 -624 681 -1236 683 -32670 9703 -7674 2591 -2582 2575 -2564 4603 -1260 1309 -1274 1301 -644 683 -1246 665 -618 677 -608 685 -612 1333 -622 665 -624 637 -644 647 -642 649 -654 631 -1268 683 -612 1335 -626 637 -644 645 -638 679 -604 679 -1256 679 -606 685 -614 1301 -652 639 -642 647 -1266 1339 -614 671 -1252 687 -616 1293 -622 691 -1272 643 -616 1319 -1270 683 -616 673 -624 1301 -608 683 -614 679 -1256 1313 -630 667 -630 665 -1256 1305 -644 649 -642 649 -1280 1297 -616 679 -614 659 -14758 2623 -2534 2621 -2520 2619 -2558 2609 -2534 2603 -2560 2595 -2546 2605 -2560 4603 -1258 1307 -1274 1337 -608 RAW_Data: 651 -1280 665 -616 677 -608 683 -612 1333 -624 665 -626 665 -624 665 -624 665 -626 665 -1254 675 -628 1305 -610 677 -624 653 -628 673 -624 681 -1238 679 -628 675 -620 1315 -624 643 -626 679 -1272 1309 -614 681 -1238 677 -614 1319 -626 675 -1250 695 -594 1335 -1272 641 -618 693 -628 1297 -624 681 -608 663 -1278 1301 -610 683 -610 679 -1256 1339 -608 665 -616 665 -1278 1305 -642 649 -644 649 -14760 2597 -2544 2619 -2534 2589 -2588 2587 -2560 2577 -2576 2597 -2564 2567 -2568 4613 -1274 1305 -1252 1307 -642 681 -1240 679 -614 665 -618 667 -620 1323 -642 641 -650 643 -616 693 -592 699 -622 665 -1250 679 -626 1303 -612 679 -626 675 -628 643 -648 655 -1254 675 -628 641 -654 1281 -658 641 -616 677 -1278 1315 -612 681 -1270 643 -616 1317 -626 675 -1280 667 -626 1305 -1270 641 -652 655 -630 1283 -654 653 -630 669 -1242 1333 -608 681 -604 677 -1284 1297 -618 679 -614 663 -1282 1301 -640 651 -610 679 -32664 9707 -7678 2607 -2556 2577 -2576 4589 -1266 1309 -1266 1339 -612 645 -1300 641 -652 653 -630 671 -612 1305 -1276 655 -628 1301 -644 649 -1278 665 -632 671 -612 1305 -1278 653 -628 1303 -644 649 -620 695 -1258 649 -642 1307 -1258 677 -628 643 -652 1279 -1288 1309 -1258 1309 -1272 1303 -1270 1341 -616 673 -624 641 -1284 1295 -1282 675 -594 677 -616 1317 -1288 647 -622 659 -628 1335 -1270 645 -652 655 -626 1291 -1256 679 -622 661 -14126 2589 -2572 2593 -2542 2615 -2532 2621 -2556 2585 -2560 2579 -2572 2591 -2562 4621 -1242 1305 -1268 1343 -614 669 -1252 685 -616 669 -626 641 -626 1307 -1280 663 -620 1325 -628 641 -1280 661 -626 675 -618 1311 -1282 671 -612 1309 -612 693 -624 641 -1270 673 -624 1309 -1284 659 -608 685 -610 1301 -1282 1303 -1270 1301 -1302 1305 -1244 1321 -626 675 -624 653 -1262 1309 -1274 673 -618 681 -610 1325 -1254 677 -624 675 -616 1305 -1272 651 -634 665 -618 1303 -1280 657 -636 675 -14100 2585 -2572 2593 -2548 2591 -2570 2591 -2552 2621 -2532 2609 -2568 2597 -2528 4615 -1278 1305 -1272 1305 -612 679 -1284 639 -644 647 -644 647 -650 1291 -1280 675 -616 1305 -610 679 -1254 685 -614 673 -626 1305 -1272 677 -618 1315 -624 641 -650 641 -1276 655 -626 1333 -1266 671 -618 655 -632 1295 -1276 1297 -1282 1303 -1274 1333 -1238 1337 -616 673 -624 641 -1276 1301 -1284 677 -612 675 -622 1311 -1254 685 -616 671 -626 1301 -1272 675 -622 655 -628 1297 -1284 667 -596 681 -32664 9707 -7662 2623 -2532 2619 -2556 4595 -1276 1297 -1278 1305 -644 647 -1272 685 -606 665 -616 665 -622 1325 -612 673 -624 679 -612 661 -1276 677 -614 675 -622 651 -636 1297 -624 681 -610 665 -618 665 -1280 1305 -1268 RAW_Data: 669 -624 1309 -622 659 -660 643 -1282 1293 -620 677 -1270 675 -624 1317 -592 675 -1278 671 -624 1301 -1272 675 -622 655 -632 1297 -624 679 -610 663 -1284 1305 -608 685 -612 675 -1252 1341 -604 665 -618 675 -1268 1297 -642 649 -652 631 -14758 2625 -2528 2625 -2546 2581 -2562 2595 -2576 2579 -2564 2593 -2546 2611 -2562 4605 -1254 1337 -1240 1329 -610 683 -1272 667 -610 667 -614 665 -618 1325 -628 673 -622 649 -636 667 -1274 641 -646 669 -620 653 -634 1291 -650 641 -650 653 -634 669 -1242 1333 -1266 669 -618 1311 -626 643 -648 675 -1248 1317 -612 667 -1274 677 -614 1301 -642 649 -1284 665 -626 1291 -1290 649 -622 657 -628 1333 -608 685 -614 673 -1252 1311 -634 665 -614 679 -1272 1303 -614 677 -624 653 -1286 1307 -626 671 -612 681 -14722 2623 -2550 2591 -2570 2591 -2544 2621 -2530 2615 -2542 2597 -2570 2591 -2544 4609 -1286 1297 -1284 1293 -620 675 -1272 675 -620 653 -632 669 -614 1305 -614 691 -630 639 -644 649 -1272 679 -612 661 -620 693 -608 1309 -634 671 -612 679 -608 651 -1280 1321 -1256 679 -624 1313 -612 679 -608 685 -1242 1325 -624 655 -1286 649 -652 1291 -616 665 -1280 675 -614 1301 -1272 679 -610 665 -618 1325 -630 675 -618 653 -1262 1307 -644 647 -644 647 -1280 1327 -624 641 -618 677 -1274 1315 -614 679 -608 649 -32690 9699 -7666 2621 -2560 2589 -2544 4597 -1290 1307 -1254 1305 -644 647 -1294 669 -620 653 -632 665 -626 1293 -638 675 -616 675 -616 667 -1272 651 -608 1333 -1270 1305 -610 681 -624 657 -626 673 -1282 1289 -618 665 -1280 1303 -644 647 -644 647 -1282 1293 -626 679 -1272 653 -626 1303 -644 649 -1284 667 -612 1305 -1276 659 -628 677 -618 1311 -626 655 -626 675 -1278 1291 -616 677 -608 683 -1272 1293 -652 667 -598 679 -1256 1335 -622 665 -594 697 -14730 2627 -2526 2609 -2538 2629 -2528 2607 -2566 2595 -2556 2579 -2584 2591 -2562 4589 -1272 1313 -1278 1301 -610 683 -1278 653 -632 637 -646 681 -608 1307 -632 671 -612 647 -644 653 -1282 665 -614 1323 -1272 1305 -628 671 -612 679 -608 681 -1262 1293 -652 631 -1288 1309 -632 661 -608 685 -1278 1281 -634 677 -1256 675 -626 1315 -616 647 -1272 679 -612 1321 -1256 679 -622 655 -626 1337 -610 649 -654 633 -1286 1311 -630 667 -614 679 -1270 1305 -616 677 -624 643 -1276 1303 -654 639 -642 649 -14754 2611 -2544 2593 -2572 2587 -2544 2623 -2530 2627 -2544 2615 -2530 2617 -2544 4605 -1284 1299 -1248 1323 -618 679 -1268 669 -622 651 -634 665 -614 1327 -612 673 -618 681 -610 663 -1278 675 -594 1339 -1246 1321 -626 675 -624 651 -634 669 -1242 1335 -608 685 -1244 1319 -642 641 -648 643 -1280 1315 -614 679 -1272 645 -650 1287 -626 RAW_Data: 675 -1278 669 -624 1301 -1270 643 -652 657 -630 1297 -618 681 -614 665 -1276 1301 -642 649 -610 679 -1254 1333 -624 681 -606 665 -1280 1301 -608 681 -612 677 -32676 9683 -7690 2587 -2562 2609 -2536 4601 -1274 1335 -1252 1309 -640 649 -1270 669 -612 693 -592 699 -590 1325 -1266 683 -614 1297 -1278 677 -616 1301 -1272 1311 -1284 671 -612 1305 -1276 1313 -614 679 -1274 1303 -1274 655 -630 671 -612 1305 -1278 1313 -1274 1305 -1270 1303 -1278 1315 -598 679 -628 641 -1276 1319 -1274 675 -614 667 -624 1309 -1254 685 -614 671 -626 1305 -1272 677 -618 651 -636 1295 -1284 669 -626 641 -14100 2633 -2546 2597 -2562 2597 -2546 2601 -2556 2613 -2544 2591 -2572 2591 -2540 4599 -1264 1339 -1268 1309 -614 681 -1234 701 -616 667 -608 665 -634 1291 -1296 649 -644 1305 -1254 677 -628 1303 -1274 1313 -1254 683 -616 1297 -1282 1307 -608 685 -1274 1313 -1260 645 -638 685 -616 1293 -1280 1309 -1270 1303 -1270 1307 -1282 1295 -624 677 -612 661 -1284 1303 -1270 671 -624 679 -612 1325 -1240 679 -624 655 -628 1335 -1238 677 -614 693 -594 1321 -1276 657 -626 675 -14088 2609 -2544 2627 -2530 2607 -2572 2601 -2528 2605 -2574 2601 -2528 2605 -2574 4575 -1286 1295 -1286 1303 -640 649 -1272 667 -610 693 -592 673 -644 1307 -1274 653 -628 1303 -1274 649 -640 1291 -1286 1301 -1278 677 -612 1329 -1270 1303 -614 677 -1262 1307 -1276 651 -626 675 -622 1311 -1256 1303 -1280 1319 -1276 1301 -1272 1303 -644 647 -624 657 -1296 1307 -1270 649 -628 675 -620 1313 -1256 681 -608 685 -616 1295 -1278 675 -628 643 -650 1279 -1286 651 -650 633 -32690 9691 -7690 2587 -2562 2609 -2562 4603 -1240 1337 -1250 1305 -644 647 -1270 667 -652 657 -626 665 -626 1291 -1286 649 -622 1319 -1278 643 -646 667 -622 653 -634 1325 -1258 647 -644 1305 -1254 1339 -1240 669 -626 1307 -1278 665 -632 671 -614 1309 -1272 1315 -1240 1335 -1270 1301 -1272 1307 -622 657 -636 677 -1274 1305 -1254 677 -628 643 -652 1315 -1250 655 -618 697 -598 1309 -1274 675 -616 681 -610 1325 -1256 675 -626 649 -14098 2623 -2546 2585 -2566 2593 -2574 2579 -2558 ================================================ FILE: applications/debug/unit_tests/resources/unit_tests/subghz/test_random_raw.sub ================================================ Filetype: Flipper SubGhz RAW File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: RAW RAW_Data: 1160 -296 263 -166 65 -66 133 -98 133 -494 97 -226 361 -100 295 -66 131 -164 397 -66 431 -198 989 -100 431 -66 131 -66 197 -1052 231 -400 165 -102 199 -100 199 -100 299 -68 229 -234 167 -98 201 -136 267 -132 165 -100 131 -66 67 -66 131 -68 231 -100 99 -134 165 -132 665 -66 231 -100 267 -66 197 -100 659 -66 231 -266 197 -98 229 -990 297 -98 67 -796 99 -562 231 -300 65 -100 363 -1094 163 -336 331 -132 327 -98 261 -98 293 -100 265 -100 1265 -66 335 -134 267 -98 333 -134 99 -66 331 -66 195 -66 227 -164 263 -100 65 -692 163 -1978 97 -232 63 -132 131 -66 263 -66 293 -98 727 -132 65 -66 97 -66 295 -132 97 -66 263 -100 365 -100 165 -268 463 -66 65 -66 265 -1326 97 -100 197 -888 297 -130 327 -98 229 -264 65 -496 131 -266 195 -132 259 -132 361 -132 165 -98 927 -332 99 -66 99 -100 197 -658 65 -100 197 -164 133 -766 197 -236 199 -168 65 -98 233 -198 65 -100 129 -166 197 -790 97 -394 393 -130 557 -100 65 -230 333 -132 1389 -134 65 -66 99 -100 265 -134 99 -100 97 -460 327 -166 233 -266 199 -562 67 -898 197 -100 165 -1100 231 -100 263 -100 263 -132 1161 -66 463 -98 133 -98 165 -130 131 -66 65 -264 97 -266 97 -66 163 -166 97 -66 229 -296 99 -132 391 -98 327 -98 163 -200 631 -196 169 -102 131 -166 1327 -134 1361 -132 331 -134 99 -396 195 -364 97 -132 163 -66 99 -264 133 -200 165 -334 99 -134 65 -1332 165 -132 133 -298 367 -1124 295 -66 129 -66 593 -66 329 -264 397 -66 533 -66 461 -66 133 -132 65 -266 65 -132 99 -232 131 -2186 297 -98 165 -100 65 -66 97 -100 63 -566 99 -100 133 -66 333 -332 231 -364 231 -68 165 -300 497 -100 763 -100 365 -98 165 -200 65 -100 65 -696 65 -134 65 -262 65 -430 97 -66 131 -98 131 -330 293 -198 97 -132 163 -628 133 -98 131 -198 559 -98 459 -64 753 -98 361 -100 165 -132 133 -364 99 -66 197 -100 65 -132 197 -896 199 -66 65 -432 231 -168 231 -100 299 -528 131 -232 99 -134 97 -66 299 -66 197 -68 495 -100 65 -98 65 -100 563 -828 197 -732 267 -1260 65 -100 165 -898 65 -430 165 -496 199 -66 231 -66 131 -132 195 -66 193 -294 1259 -134 165 -100 199 -66 199 -166 233 -430 97 -366 97 -166 65 -1196 97 -132 97 -64 131 -196 97 -66 131 -960 229 -98 99 -264 233 -134 297 -98 467 -100 165 -98 365 -98 735 -98 197 -1464 233 -626 301 -432 97 -132 RAW_Data: 231 -100 163 -362 163 -132 261 -298 65 -232 67 -132 297 -100 229 -228 497 -66 395 -98 593 -132 165 -132 67 -100 397 -132 99 -600 297 -66 231 -132 495 -136 65 -860 197 -98 129 -260 129 -100 131 -134 331 -268 165 -98 167 -66 231 -68 131 -232 65 -396 99 -100 663 -200 231 -66 1067 -66 99 -166 331 -132 65 -196 65 -134 133 -66 795 -66 397 -100 233 -132 199 -66 233 -200 433 -362 67 -298 327 -100 397 -66 165 -66 233 -232 529 -66 165 -100 67 -66 397 -66 689 -100 195 -462 325 -164 227 -132 261 -426 331 -98 133 -66 97 -296 97 -98 197 -66 97 -428 163 -526 359 -132 327 -164 99 -66 231 -396 329 -64 525 -66 593 -856 195 -100 129 -132 227 -166 229 -130 129 -98 293 -132 163 -98 195 -130 195 -98 97 -66 165 -100 99 -66 199 -466 265 -66 131 -132 197 -198 163 -232 1857 -100 265 -264 67 -264 265 -368 297 -102 133 -66 233 -98 167 -66 201 -66 133 -134 167 -166 65 -168 99 -400 165 -498 97 -298 131 -198 227 -132 327 -98 97 -66 297 -230 593 -132 67 -132 1227 -68 199 -134 197 -102 131 -232 365 -962 133 -298 297 -66 265 -266 333 -230 165 -102 165 -234 65 -98 131 -98 133 -66 167 -134 1357 -134 599 -532 265 -268 99 -298 199 -100 165 -166 131 -100 231 -266 65 -68 231 -334 67 -266 97 -134 65 -198 133 -100 163 -336 165 -234 65 -332 163 -690 97 -564 263 -64 165 -66 499 -100 563 -230 229 -132 99 -166 165 -132 199 -66 497 -66 659 -166 233 -68 331 -100 331 -66 165 -202 133 -896 133 -228 163 -196 131 -66 229 -130 263 -164 65 -98 263 -164 889 -66 261 -164 99 -494 97 -132 131 -64 65 -462 65 -262 99 -332 65 -102 65 -496 99 -132 197 -230 299 -134 65 -166 99 -430 99 -100 563 -66 165 -330 199 -264 197 -68 231 -100 367 -134 365 -68 299 -68 495 -68 165 -100 65 -498 397 -66 327 -100 195 -98 163 -132 163 -360 197 -98 65 -462 97 -526 427 -100 1419 -66 265 -66 333 -98 299 -98 99 -132 97 -100 197 -134 97 -100 231 -68 133 -100 165 -100 97 -100 133 -98 133 -66 165 -166 267 -132 229 -68 299 -66 97 -964 131 -66 133 -98 99 -66 297 -132 131 -68 167 -134 201 -68 167 -66 301 -166 133 -68 365 -100 527 -130 165 -130 233 -262 95 -628 97 -66 231 -168 99 -498 99 -100 229 -100 99 -166 299 -232 65 -100 99 -468 131 -68 197 -100 99 -66 297 -330 99 -100 463 -100 231 -68 133 -234 131 -134 231 -98 RAW_Data: 561 -264 131 -100 65 -98 99 -66 133 -134 165 -132 65 -68 97 -68 131 -896 329 -198 65 -100 295 -230 199 -264 97 -196 327 -132 131 -100 131 -100 1293 -66 131 -202 463 -198 65 -68 99 -298 65 -232 333 -566 199 -168 99 -168 65 -498 295 -134 167 -134 199 -100 431 -100 65 -530 233 -164 65 -98 297 -134 363 -100 557 -100 163 -100 261 -66 619 -132 231 -296 97 -596 97 -228 131 -66 97 -66 197 -66 97 -360 229 -98 129 -330 99 -130 99 -130 65 -100 65 -132 97 -460 63 -100 265 -330 331 -98 197 -66 855 -464 165 -66 99 -198 99 -868 231 -66 167 -636 329 -530 165 -130 131 -132 99 -528 165 -64 65 -164 65 -166 129 -162 425 -66 231 -100 133 -98 231 -68 333 -98 165 -200 361 -98 99 -66 297 -68 163 -168 65 -498 99 -232 295 -696 99 -266 131 -100 65 -100 99 -628 133 -132 65 -366 265 -398 261 -100 529 -100 297 -132 2535 -596 65 -932 199 -66 199 -866 65 -298 165 -66 67 -132 65 -100 165 -200 131 -166 299 -200 167 -166 199 -334 65 -694 365 -132 727 -232 265 -66 133 -102 65 -100 531 -232 65 -132 65 -100 131 -562 197 -66 297 -66 265 -100 433 -432 495 -332 197 -98 167 -332 97 -66 297 -758 65 -228 99 -194 295 -130 99 -98 261 -98 163 -66 231 -134 1029 -68 399 -200 133 -132 99 -266 163 -264 163 -130 229 -66 689 -166 131 -988 65 -592 97 -132 129 -164 197 -432 65 -100 165 -134 65 -166 133 -232 563 -66 231 -66 599 -66 265 -100 199 -498 231 -464 327 -262 131 -100 327 -430 197 -266 99 -132 65 -66 133 -132 101 -200 65 -100 433 -166 99 -266 265 -98 97 -66 229 -100 263 -200 631 -100 199 -66 167 -300 753 -262 457 -132 231 -98 163 -164 227 -164 65 -262 129 -594 229 -790 131 -66 129 -428 197 -164 197 -200 133 -100 131 -564 65 -134 661 -134 2925 -68 231 -134 167 -132 99 -98 133 -98 167 -98 197 -1086 329 -296 65 -130 65 -264 197 -132 163 -98 165 -66 97 -132 129 -100 261 -66 97 -66 197 -326 95 -134 629 -98 65 -262 65 -132 197 -264 129 -98 163 -230 131 -528 261 -298 197 -64 131 -394 131 -764 99 -132 99 -66 99 -464 367 -98 165 -98 1159 -134 963 -66 633 -562 133 -132 99 -66 131 -564 197 -134 263 -132 195 -66 131 -262 459 -332 197 -66 133 -1060 133 -66 331 -662 197 -134 231 -100 299 -232 1087 -232 131 -100 265 -462 131 -200 433 -168 101 -432 97 -196 65 -132 327 -100 129 -226 163 -100 163 -132 RAW_Data: 227 -330 129 -466 165 -200 163 -66 97 -130 97 -66 197 -164 457 -166 463 -166 361 -66 163 -66 97 -198 65 -64 99 -300 65 -68 263 -98 99 -134 197 -100 165 -134 231 -66 297 -98 67 -132 365 -66 197 -228 99 -428 195 -132 65 -330 265 -628 63 -130 97 -132 195 -232 195 -130 263 -132 167 -100 133 -166 1229 -264 165 -332 233 -1230 199 -102 167 -100 401 -166 229 -852 197 -264 229 -130 163 -198 65 -98 229 -66 199 -100 335 -98 899 -134 393 -528 97 -66 97 -300 99 -300 99 -664 329 -198 99 -400 131 -198 299 -330 99 -66 65 -132 67 -298 527 -66 493 -132 1085 -198 425 -232 197 -66 131 -164 165 -66 197 -1480 197 -330 65 -494 65 -330 197 -296 99 -66 97 -592 99 -164 97 -426 329 -66 131 -98 99 -66 265 -98 433 -66 131 -234 267 -234 65 -266 99 -98 65 -166 97 -164 197 -198 65 -866 67 -66 231 -430 131 -200 65 -100 631 -198 265 -526 99 -230 129 -68 165 -232 229 -98 427 -328 1053 -134 431 -198 365 -430 131 -100 131 -398 231 -134 1195 -132 131 -134 661 -100 333 -398 97 -400 97 -234 165 -468 65 -100 99 -66 299 -266 67 -98 397 -166 987 -132 97 -64 65 -266 97 -852 297 -132 163 -428 65 -298 99 -1124 97 -266 233 -66 165 -332 65 -800 297 -98 131 -164 469 -100 97 -658 165 -66 133 -132 531 -134 131 -98 297 -722 65 -132 821 -100 229 -132 459 -66 197 -98 985 -330 131 -100 133 -100 101 -198 299 -100 65 -134 363 -100 67 -830 131 -132 99 -100 299 -66 297 -366 99 -166 197 -66 131 -364 131 -200 331 -134 265 -530 99 -564 65 -68 231 -132 233 -134 165 -66 165 -66 431 -102 465 -132 99 -132 99 -364 133 -98 67 -198 133 -66 65 -264 99 -298 231 -100 199 -728 297 -132 65 -134 433 -926 263 -66 227 -528 65 -130 263 -100 97 -98 723 -100 131 -134 531 -66 267 -400 199 -66 65 -100 99 -498 99 -332 529 -98 197 -460 131 -296 231 -296 97 -66 65 -426 131 -132 133 -100 99 -66 99 -964 463 -68 631 -68 1325 -232 365 -68 163 -432 131 -432 301 -234 165 -432 99 -398 65 -100 133 -166 433 -230 163 -236 67 -132 97 -300 65 -66 199 -132 2355 -296 327 -98 65 -66 99 -294 197 -232 133 -100 67 -134 97 -66 65 -760 65 -98 131 -166 197 -132 63 -132 163 -98 163 -754 429 -230 163 -66 695 -132 199 -98 433 -100 1197 -394 491 -460 65 -460 65 -166 97 -68 131 -134 233 -66 299 -762 231 -200 265 -198 499 -132 167 -766 RAW_Data: 265 -66 165 -134 165 -66 365 -132 2091 -134 231 -632 297 -630 195 -264 65 -296 65 -64 131 -298 165 -100 99 -100 99 -562 165 -398 99 -566 99 -166 133 -334 99 -134 357 -68 97 -332 459 -130 161 -230 163 -132 163 -98 195 -164 97 -130 65 -1262 265 -166 563 -964 133 -100 99 -796 199 -868 67 -134 65 -232 67 -66 199 -132 295 -98 821 -332 1097 -296 129 -758 65 -200 67 -98 531 -198 265 -66 863 -66 65 -300 363 -100 99 -132 165 -100 267 -134 165 -234 231 -100 533 -198 1057 -200 497 -68 531 -100 63 -66 133 -100 163 -330 63 -230 161 -100 97 -66 131 -298 165 -68 167 -732 265 -396 265 -100 99 -166 99 -200 65 -596 131 -696 263 -200 135 -100 133 -66 65 -98 131 -66 399 -66 367 -130 765 -298 97 -98 231 -130 197 -130 65 -294 131 -98 195 -66 129 -66 131 -428 131 -66 197 -660 133 -66 131 -332 165 -628 65 -724 99 -164 131 -98 65 -166 395 -68 435 -68 299 -66 1323 -400 231 -298 99 -264 199 -428 131 -230 65 -1188 99 -98 163 -526 327 -66 197 -394 165 -66 65 -596 857 -66 163 -66 591 -166 129 -234 167 -624 265 -294 263 -500 131 -164 65 -98 195 -166 97 -100 195 -198 131 -1214 1017 -166 97 -428 425 -66 1183 -430 261 -230 65 -196 97 -100 195 -364 65 -328 65 -560 97 -1084 197 -694 99 -132 65 -132 97 -66 229 -332 163 -330 197 -66 327 -100 195 -98 327 -98 993 -132 697 -332 665 -166 199 -234 99 -168 199 -266 201 -66 199 -462 231 -298 195 -66 165 -884 165 -196 131 -66 365 -98 231 -98 329 -430 165 -66 1195 -300 133 -100 163 -132 65 -462 131 -196 163 -228 197 -992 163 -162 95 -824 131 -98 263 -98 97 -166 65 -98 131 -100 65 -496 131 -100 265 -134 199 -68 199 -98 329 -132 131 -66 983 -198 99 -132 295 -66 261 -460 329 -164 131 -426 65 -268 65 -466 131 -66 131 -230 263 -230 297 -200 895 -66 231 -460 1055 -134 433 -100 65 -66 231 -398 131 -400 97 -68 165 -330 297 -330 133 -396 99 -66 263 -262 97 -1644 295 -66 297 -100 729 -132 335 -68 491 -66 231 -326 393 -68 329 -166 65 -922 99 -1652 197 -266 265 -132 99 -432 265 -134 293 -134 65 -166 231 -232 199 -64 631 -400 163 -400 99 -66 131 -730 265 -100 195 -66 195 -330 163 -132 131 -166 67 -830 99 -66 297 -664 97 -134 65 -100 295 -66 133 -166 997 -66 299 -66 795 -98 493 -68 131 -166 131 -100 165 -198 67 -98 99 -598 65 -266 97 -268 199 -132 RAW_Data: 65 -364 97 -298 97 -692 129 -264 261 -66 263 -564 297 -298 97 -232 131 -66 97 -66 361 -100 199 -68 433 -66 331 -68 333 -438 165 -598 99 -134 65 -100 65 -264 399 -266 67 -764 197 -232 297 -498 199 -858 65 -100 97 -130 131 -230 231 -230 97 -362 229 -66 497 -66 329 -132 65 -64 423 -98 393 -132 65 -664 65 -198 99 -68 331 -100 97 -332 133 -166 199 -98 693 -332 429 -100 265 -166 363 -100 167 -66 497 -100 1365 -202 333 -200 65 -132 199 -100 99 -330 131 -300 229 -832 65 -764 65 -132 263 -200 131 -1026 97 -196 97 -132 165 -98 525 -232 431 -66 659 -66 461 -98 97 -132 65 -100 261 -66 129 -66 163 -100 229 -364 131 -1560 165 -364 133 -268 165 -132 99 -200 65 -434 97 -68 263 -298 131 -230 199 -132 199 -100 165 -68 1829 -134 463 -100 265 -890 395 -364 131 -362 97 -260 97 -462 65 -66 457 -296 197 -268 263 -66 363 -132 895 -66 435 -164 403 -464 165 -928 163 -134 167 -400 263 -660 131 -100 63 -428 199 -132 199 -700 397 -232 335 -66 497 -166 1425 -66 231 -102 231 -134 99 -132 133 -134 99 -530 133 -66 131 -66 165 -166 199 -266 65 -100 131 -100 527 -300 925 -266 363 -530 131 -898 165 -66 199 -134 165 -232 525 -100 1509 -100 99 -200 99 -168 67 -300 163 -404 263 -132 67 -66 263 -664 65 -494 199 -100 165 -100 263 -264 131 -264 161 -66 65 -428 131 -296 163 -264 559 -166 597 -132 199 -498 65 -66 263 -162 163 -66 65 -66 131 -762 197 -162 65 -98 297 -262 163 -66 131 -130 97 -100 131 -564 199 -100 333 -166 165 -66 1653 -100 689 -296 131 -230 229 -526 65 -462 131 -100 197 -398 99 -264 133 -428 233 -134 265 -132 65 -200 97 -100 131 -100 265 -232 99 -232 429 -196 263 -166 669 -230 293 -298 561 -100 65 -100 229 -100 99 -830 99 -132 65 -1058 133 -564 99 -100 131 -826 165 -100 101 -100 65 -100 99 -398 329 -266 65 -66 557 -132 67 -132 627 -464 99 -66 163 -200 99 -66 99 -232 65 -66 165 -132 167 -266 99 -598 65 -432 65 -134 99 -330 197 -202 65 -266 133 -598 99 -68 163 -66 165 -66 1957 -430 393 -134 97 -134 97 -530 65 -428 161 -1150 65 -64 131 -594 229 -326 131 -196 197 -132 65 -566 297 -68 367 -64 1119 -464 163 -334 165 -134 163 -102 99 -66 199 -460 99 -100 99 -132 67 -266 99 -98 99 -532 197 -992 129 -362 231 -166 65 -132 133 -98 599 -98 795 -66 235 -100 333 -232 331 -98 99 -430 RAW_Data: 131 -266 297 -232 231 -100 267 -266 397 -232 131 -132 133 -668 65 -98 99 -68 131 -398 1325 -66 333 -166 99 -100 199 -960 99 -66 231 -132 167 -134 199 -100 165 -100 495 -132 367 -332 99 -266 495 -66 65 -66 99 -66 65 -134 163 -134 199 -164 199 -98 531 -132 497 -100 65 -100 97 -530 99 -100 131 -68 131 -200 265 -102 97 -332 365 -66 265 -434 163 -68 97 -232 265 -132 65 -264 133 -198 497 -100 197 -68 729 -66 165 -330 165 -762 265 -430 397 -3844 67 -432 1197 -66 631 -66 521 -458 131 -132 197 -264 65 -922 163 -1586 99 -492 229 -530 65 -634 131 -134 65 -398 99 -398 363 -366 295 -1158 99 -134 65 -298 431 -432 97 -634 131 -66 133 -298 97 -466 99 -66 65 -332 65 -498 65 -962 133 -132 99 -464 233 -598 165 -196 199 -68 331 -66 231 -166 65 -200 133 -100 197 -162 393 -264 327 -1052 65 -164 163 -560 99 -98 63 -394 165 -132 99 -166 99 -100 97 -234 131 -1028 131 -66 99 -394 99 -164 97 -298 163 -66 359 -296 197 -66 499 -98 167 -462 695 -132 131 -134 97 -264 65 -100 265 -132 197 -896 195 -166 65 -262 99 -492 97 -196 99 -66 163 -164 97 -1414 133 -364 65 -132 99 -362 131 -164 195 -296 67 -334 197 -98 227 -66 265 -666 165 -430 167 -364 65 -98 97 -230 67 -364 133 -132 165 -134 65 -100 197 -230 97 -462 131 -296 195 -262 99 -98 327 -530 97 -464 99 -198 167 -234 97 -628 99 -266 131 -134 165 -166 65 -630 393 -100 197 -964 99 -400 163 -230 129 -264 97 -100 333 -332 165 -100 67 -66 199 -200 99 -166 133 -992 99 -66 163 -1590 65 -134 65 -366 331 -68 131 -1692 197 -166 99 -132 99 -100 429 -134 65 -100 367 -164 65 -166 329 -166 131 -234 99 -564 99 -100 99 -66 99 -100 263 -164 201 -436 131 -100 133 -268 231 -232 99 -366 65 -498 131 -100 131 -300 265 -432 199 -132 67 -100 163 -300 331 -100 263 -296 129 -68 97 -100 165 -234 99 -234 101 -66 67 -100 97 -1328 97 -264 99 -3316 261 -134 65 -300 65 -102 199 -98 99 -100 231 -1424 165 -164 195 -130 99 -396 129 -598 199 -264 97 -566 65 -762 99 -132 197 -464 131 -66 65 -494 97 -66 229 -66 525 -428 65 -428 229 -920 459 -556 97 -300 199 -100 99 -466 67 -1362 233 -430 131 -132 131 -294 197 -130 163 -98 163 -132 131 -1020 165 -132 165 -98 97 -232 329 -132 165 -130 129 -132 193 -592 197 -130 97 -2076 133 -164 163 -162 97 -98 63 -760 131 -100 RAW_Data: 659 -560 97 -98 165 -66 65 -396 163 -662 97 -230 133 -598 97 -796 399 -132 165 -132 133 -66 197 -66 131 -398 297 -232 231 -364 199 -430 65 -100 165 -1096 231 -98 165 -98 197 -560 297 -132 65 -1260 429 -824 97 -68 97 -664 199 -296 495 -630 263 -966 99 -234 167 -66 65 -264 231 -68 197 -68 367 -66 163 -132 163 -430 233 -100 399 -134 167 -98 165 -98 99 -132 231 -230 193 -98 161 -396 261 -494 163 -1290 265 -664 65 -66 461 -100 563 -66 431 -100 1087 -198 165 -166 165 -100 899 -102 169 -200 99 -200 265 -66 231 -68 165 -100 133 -396 231 -366 99 -466 65 -234 497 -66 133 -200 133 -100 99 -100 65 -398 199 -264 101 -132 201 -366 195 -228 229 -134 625 -66 163 -66 293 -164 523 -100 97 -196 163 -396 229 -330 99 -98 65 -100 359 -562 195 -98 131 -98 229 -132 63 -822 65 -100 99 -432 229 -100 261 -66 327 -100 325 -198 2007 -132 261 -98 65 -100 397 -164 133 -66 99 -332 65 -98 65 -696 99 -298 231 -260 97 -296 199 -98 229 -396 163 -398 65 -398 197 -100 363 -66 797 -66 199 -100 1259 -132 331 -330 265 -800 197 -200 97 -166 99 -730 133 -432 99 -168 265 -1060 165 -96 129 -164 163 -66 97 -64 295 -68 397 -100 1091 -98 533 -364 261 -64 163 -920 99 -98 65 -164 195 -462 99 -98 97 -198 97 -100 261 -230 131 -594 263 -100 163 -196 129 -328 97 -98 297 -66 129 -66 131 -66 229 -228 461 -100 1127 -64 359 -1052 231 -298 131 -232 163 -428 65 -230 261 -66 97 -366 131 -68 197 -332 231 -460 229 -262 461 -166 629 -200 367 -198 1745 -528 65 -266 67 -166 131 -564 165 -134 135 -1358 197 -198 229 -98 165 -690 131 -196 197 -66 261 -164 263 -98 63 -132 65 -100 229 -100 197 -100 299 -66 465 -66 165 -68 165 -432 131 -530 63 -330 65 -198 97 -326 97 -66 65 -132 195 -498 65 -98 165 -260 95 -264 295 -130 131 -98 197 -526 65 -896 65 -100 429 -98 163 -132 527 -132 1189 -330 299 -166 165 -232 97 -66 99 -198 67 -168 133 -100 167 -200 165 -100 101 -630 199 -596 199 -1354 99 -198 163 -64 227 -132 163 -98 163 -132 425 -100 461 -262 259 -130 195 -98 65 -130 97 -166 129 -66 165 -98 97 -658 99 -1374 163 -132 165 -328 195 -98 99 -496 63 -132 67 -98 197 -130 99 -66 129 -98 1147 -66 1219 -1120 165 -166 263 -66 65 -100 197 -130 99 -164 99 -100 99 -262 199 -332 97 -66 233 -760 65 -464 363 -696 131 -68 97 -68 RAW_Data: 329 -164 197 -302 429 -296 229 -232 99 -364 97 -98 131 -98 293 -164 133 -200 165 -270 233 -366 131 -400 399 -100 99 -464 133 -66 299 -198 297 -100 199 -66 365 -66 563 -464 425 -166 365 -166 101 -298 165 -166 99 -300 331 -264 329 -298 65 -200 99 -66 165 -1290 129 -594 99 -66 197 -262 197 -164 163 -100 229 -98 163 -96 1709 -100 65 -66 363 -132 99 -824 361 -1388 165 -98 99 -1952 99 -398 263 -200 201 -300 231 -134 265 -166 133 -66 399 -98 233 -232 461 -66 99 -132 165 -100 65 -298 135 -498 99 -394 297 -296 67 -66 165 -432 165 -98 97 -66 265 -66 563 -98 199 -66 265 -232 597 -100 691 -98 631 -132 99 -632 199 -730 97 -132 99 -528 361 -492 131 -296 65 -460 65 -66 97 -164 99 -262 263 -66 97 -98 263 -64 491 -66 851 -100 161 -132 97 -926 99 -100 99 -98 97 -632 163 -326 231 -290 99 -132 199 -66 199 -166 297 -68 167 -564 1059 -1018 1009 -1016 969 -1042 987 -1008 1005 -988 1013 -1032 483 -550 483 -550 225 -282 517 -522 261 -294 499 -560 495 -554 231 -298 269 -266 233 -298 495 -524 521 -520 263 -290 263 -268 271 -308 241 -274 507 -524 259 -260 521 -522 521 -520 523 -518 523 -518 527 -552 231 -298 265 -266 497 -522 263 -258 521 -524 261 -294 499 -558 233 -298 269 -274 271 -270 499 -520 261 -290 229 -296 267 -268 505 -560 233 -298 271 -272 507 -524 487 -550 487 -550 259 -288 225 -298 269 -306 239 -308 241 -276 507 -522 261 -258 259 -294 265 -268 269 -270 271 -304 239 -308 241 -274 273 -270 499 -520 489 -550 259 -288 229 -298 503 -558 231 -334 237 -274 997 -1008 1003 -984 1003 -1034 977 -1006 1013 -986 999 -1046 513 -514 511 -514 257 -280 513 -520 261 -292 497 -556 497 -554 233 -298 267 -268 233 -298 495 -522 527 -518 261 -290 263 -266 273 -306 243 -274 507 -524 261 -258 521 -522 523 -518 523 -516 523 -552 493 -552 231 -298 267 -266 497 -522 263 -256 523 -522 263 -294 497 -558 231 -300 269 -274 271 -272 497 -522 259 -290 227 -298 267 -270 505 -560 231 -300 271 -272 507 -522 521 -518 489 -548 259 -288 225 -298 269 -304 241 -308 241 -276 505 -524 259 -258 259 -294 265 -268 269 -270 271 -306 239 -308 241 -274 271 -270 499 -520 519 -518 261 -288 229 -298 503 -560 231 -300 269 -272 999 -1010 1013 -982 1007 -1018 973 -1016 999 -1010 987 -1044 481 -554 483 -520 273 -292 473 -552 245 -324 487 -532 501 -558 267 -268 269 -268 231 -298 495 -522 523 -520 259 -292 RAW_Data: 263 -268 271 -308 241 -276 507 -522 261 -256 523 -522 523 -518 521 -518 525 -518 525 -554 229 -298 267 -268 495 -524 261 -258 521 -522 263 -294 499 -556 231 -300 271 -272 271 -270 499 -522 261 -290 227 -296 269 -270 505 -556 233 -298 271 -274 505 -524 521 -516 487 -548 259 -288 227 -298 271 -304 241 -308 241 -274 507 -524 259 -258 259 -294 265 -268 267 -270 271 -272 273 -308 241 -276 271 -270 499 -520 489 -550 259 -288 261 -264 505 -558 233 -300 269 -274 997 -1008 1003 -986 1005 -1002 1011 -1010 987 -1006 997 -1044 479 -546 513 -512 259 -280 511 -518 263 -292 497 -556 497 -556 231 -300 267 -266 233 -298 497 -522 523 -518 263 -290 263 -268 273 -306 241 -276 507 -522 261 -258 521 -522 523 -518 521 -518 525 -518 525 -554 231 -298 265 -266 499 -522 261 -258 521 -522 263 -294 499 -556 231 -300 271 -272 273 -270 499 -520 261 -288 229 -296 267 -270 505 -560 231 -300 271 -274 505 -524 489 -548 487 -548 261 -286 225 -298 271 -306 239 -308 241 -274 507 -524 259 -258 257 -296 267 -266 269 -270 271 -272 273 -308 239 -276 273 -268 497 -520 491 -550 261 -288 227 -296 505 -560 233 -298 269 -274 997 -1012 1009 -988 1007 -996 1009 -1008 1003 -982 999 -1044 513 -512 511 -514 257 -282 511 -520 261 -294 497 -556 497 -556 231 -300 265 -268 233 -298 495 -522 525 -518 263 -290 263 -268 271 -306 243 -274 509 -522 261 -256 523 -522 523 -518 491 -548 523 -552 493 -552 231 -298 265 -268 497 -520 261 -290 493 -522 263 -292 497 -558 231 -300 271 -272 271 -270 501 -520 261 -290 227 -296 267 -270 505 -558 233 -298 271 -274 507 -522 489 -550 487 -550 227 -318 225 -298 269 -304 241 -308 239 -276 507 -522 261 -258 259 -296 265 -266 269 -270 271 -304 239 -308 241 -274 273 -270 497 -520 491 -550 259 -288 227 -298 505 -558 233 -330 237 -274 999 -1012 979 -1016 1005 -1018 977 -1016 983 -1038 977 -1036 475 -550 509 -514 257 -276 503 -548 259 -288 491 -556 497 -556 231 -298 265 -268 233 -298 497 -522 491 -550 261 -292 263 -300 237 -308 241 -276 505 -524 261 -290 491 -522 521 -518 523 -516 525 -550 495 -554 231 -296 231 -300 497 -522 261 -290 491 -522 261 -294 497 -558 231 -334 237 -274 271 -270 499 -520 261 -290 229 -298 267 -268 505 -558 231 -300 269 -274 505 -524 489 -550 487 -548 259 -288 227 -298 269 -306 239 -308 241 -274 509 -524 259 -256 259 -296 265 -268 269 -268 271 -304 239 -308 241 -276 271 -270 497 -522 489 -550 RAW_Data: 261 -288 227 -296 505 -558 231 -300 271 -272 1001 -1012 977 -1026 1007 -992 1011 -1008 1001 -1002 1001 -1014 513 -512 513 -514 257 -282 513 -520 263 -292 497 -556 497 -556 231 -300 267 -268 231 -298 495 -522 525 -518 261 -292 263 -266 271 -308 241 -276 507 -522 261 -288 491 -522 523 -518 523 -516 523 -520 525 -554 231 -296 265 -268 497 -522 259 -290 491 -522 263 -294 499 -556 265 -266 271 -274 271 -270 499 -520 261 -290 227 -298 267 -270 505 -558 233 -300 269 -274 505 -524 519 -516 487 -550 259 -286 259 -266 269 -306 241 -308 239 -276 507 -522 261 -256 259 -296 267 -266 269 -270 269 -272 273 -308 241 -276 271 -270 497 -520 521 -518 259 -290 259 -264 503 -560 265 -266 271 -274 999 -1014 977 -1016 1007 -984 1009 -1014 999 -1010 985 -1044 483 -520 519 -522 253 -276 529 -512 257 -282 517 -556 497 -554 231 -298 267 -268 233 -298 497 -522 521 -518 261 -290 265 -268 273 -308 241 -276 505 -524 259 -258 521 -520 525 -518 521 -518 525 -518 525 -552 231 -296 267 -268 497 -522 261 -256 523 -522 263 -294 499 -560 231 -298 269 -274 271 -270 497 -522 259 -292 227 -298 267 -268 505 -558 233 -300 271 -272 507 -522 521 -516 487 -550 259 -286 227 -298 271 -304 239 -308 241 -276 507 -520 261 -256 259 -296 265 -268 269 -268 273 -272 273 -306 241 -276 273 -268 497 -520 521 -516 261 -290 227 -298 505 -556 265 -266 271 -274 999 -1008 1005 -986 1005 -1000 1007 -1008 1001 -996 1009 -1016 515 -514 513 -514 259 -282 515 -520 263 -292 497 -556 499 -554 231 -300 265 -268 233 -298 497 -522 523 -518 261 -290 263 -302 239 -308 241 -276 505 -524 259 -258 521 -522 523 -518 523 -518 523 -518 525 -552 231 -298 265 -268 497 -524 259 -258 521 -524 261 -294 499 -556 233 -298 271 -272 273 -270 497 -522 259 -290 229 -296 267 -270 505 -558 231 -124104 99 -334 97 -794 165 -232 99 -136 595 -260 65 -66 163 -100 1353 -100 231 -134 233 -100 231 -962 99 -432 131 -134 231 -234 133 -98 99 -430 65 -100 99 -396 99 -1228 197 -66 97 -200 299 -100 265 -66 99 -262 99 -64 1447 -66 163 -98 65 -562 197 -66 129 -100 197 -164 65 -262 65 -264 65 -164 65 -1490 99 -66 99 -66 65 -166 197 -134 99 -66 131 -100 99 -66 97 -66 231 -266 465 -66 299 -66 461 -98 295 -132 65 -528 229 -164 129 -396 65 -962 133 -566 99 -198 163 -830 197 -100 201 -400 67 -66 99 -132 299 -66 463 -168 231 -66 433 -66 895 -956 65 -828 229 -468 RAW_Data: 197 -100 131 -130 97 -132 295 -66 97 -430 133 -198 65 -526 727 -66 229 -262 163 -98 525 -66 853 -132 165 -66 399 -166 99 -268 397 -134 233 -66 67 -298 131 -1130 133 -100 65 -134 297 -198 329 -134 197 -66 129 -590 133 -164 131 -132 131 -132 131 -98 2973 -230 65 -664 165 -134 165 -432 99 -166 165 -496 201 -132 99 -100 197 -68 131 -632 67 -98 133 -132 695 -100 293 -100 131 -98 199 -66 297 -100 199 -100 335 -100 265 -430 165 -66 297 -664 99 -264 199 -98 165 -134 167 -200 99 -100 65 -98 99 -296 65 -164 163 -494 99 -100 267 -198 99 -426 199 -134 99 -232 131 -330 65 -134 131 -134 201 -100 463 -232 97 -296 1087 -100 363 -134 97 -132 197 -300 131 -234 233 -990 133 -232 65 -266 65 -264 199 -200 265 -396 65 -134 165 -66 165 -66 65 -330 231 -300 431 -198 331 -266 99 -232 131 -432 65 -266 131 -100 265 -66 599 -498 97 -98 65 -298 197 -98 227 -328 231 -232 163 -660 197 -132 65 -134 363 -66 197 -166 631 -66 361 -132 231 -132 427 -328 99 -898 199 -332 365 -98 199 -162 197 -230 97 -166 561 -198 263 -196 295 -100 65 -428 65 -98 99 -166 199 -132 131 -100 165 -98 131 -66 1161 -66 167 -166 529 -364 163 -460 231 -196 291 -296 65 -66 97 -398 65 -100 133 -658 165 -164 195 -230 99 -132 229 -98 129 -430 691 -68 165 -100 167 -66 435 -100 597 -66 331 -98 99 -298 263 -262 131 -492 129 -788 97 -428 133 -100 65 -100 65 -98 131 -998 199 -98 235 -100 965 -232 793 -98 861 -100 199 -68 529 -398 195 -960 397 -100 131 -266 201 -66 65 -98 99 -132 233 -168 261 -66 131 -428 165 -66 261 -528 65 -66 195 -166 261 -66 361 -164 525 -200 697 -364 97 -66 131 -558 163 -266 65 -298 331 -464 199 -100 165 -100 97 -66 65 -994 331 -166 131 -534 199 -300 67 -98 329 -266 163 -66 227 -66 133 -66 261 -100 559 -466 231 -260 197 -68 227 -98 97 -96 65 -296 163 -296 131 -164 195 -230 263 -66 393 -230 457 -134 131 -534 133 -630 99 -98 399 -100 265 -266 431 -134 67 -100 789 -1584 165 -624 131 -134 263 -396 99 -692 165 -98 165 -398 295 -66 99 -592 163 -132 131 -328 265 -66 231 -100 363 -98 335 -66 167 -98 499 -100 397 -68 131 -100 231 -100 165 -134 165 -1228 99 -66 233 -1386 63 -924 99 -130 131 -392 231 -166 133 -166 165 -198 501 -66 265 -66 299 -98 299 -100 299 -134 231 -68 165 -232 99 -66 65 -200 165 -100 RAW_Data: 67 -132 199 -302 65 -1058 199 -798 133 -334 165 -894 65 -132 233 -164 329 -130 493 -66 893 -200 631 -100 1207 -984 1013 -1010 1017 -988 997 -1010 1013 -986 1007 -1032 257 -254 253 -292 265 -266 501 -524 525 -520 261 -294 265 -306 241 -276 507 -522 261 -256 521 -524 521 -518 261 -290 495 -558 497 -556 265 -264 267 -268 265 -264 497 -522 261 -292 261 -268 269 -274 273 -274 275 -276 273 -270 231 -296 265 -264 497 -522 527 -520 261 -294 267 -304 241 -276 273 -270 495 -520 261 -256 293 -264 269 -270 507 -556 265 -266 271 -274 507 -522 521 -516 517 -516 259 -256 291 -266 271 -272 273 -274 275 -276 507 -522 259 -256 259 -296 265 -268 269 -270 271 -270 273 -274 275 -276 507 -522 521 -514 519 -516 259 -254 291 -266 269 -274 511 -558 267 -266 991 -1010 1009 -1000 999 -974 1023 -1012 1009 -990 1007 -1032 225 -284 253 -292 263 -264 501 -524 525 -518 263 -296 265 -306 241 -276 507 -522 261 -256 521 -520 523 -518 261 -290 497 -556 499 -554 265 -266 1535 -556 1321 -340 201 -168 1009 -246 209 -304 1249 -320 489 -196 1129 -338 209 -316 1011 -562 197 -260 539 -66 219 -194 815 -260 515 -132 247 -144 825 -260 815 -272 1301 -262 519 -66 215 -230 533 -132 217 -178 1049 -134 213 -178 347 -208 507 -134 247 -142 511 -192 213 -94 519 -274 521 -278 793 -278 815 -278 521 -132 229 -154 503 -198 839 -228 1597 -262 259 -292 1553 -526 1593 -458 1103 -528 1345 -268 235 -298 1293 -260 523 -194 189 -122 525 -196 221 -94 805 -306 1041 -166 233 -144 493 -228 221 -72 1041 -238 253 -342 791 -314 375 -162 823 -256 1019 -166 213 -154 507 -194 213 -124 815 -266 505 -196 221 -122 407 -166 391 -134 983 -262 219 -312 1213 -360 479 -166 1191 -322 223 -262 1043 -560 229 -166 1035 -206 455 -330 1007 -332 469 -198 837 -196 251 -92 471 -264 519 -330 439 -100 419 -132 421 -132 439 -100 453 -230 549 -330 739 -332 769 -302 347 -210 1025 -98 285 -180 603 -416 619 -404 757 -340 305 -226 463 -134 267 -196 313 -192 1175 -512 1563 -522 1279 -288 253 -290 1553 -524 1579 -492 1075 -528 655 -306 343 -188 373 -164 647 -410 457 -170 615 -344 767 -308 469 -100 275 -178 361 -174 621 -416 625 -418 355 -204 593 -446 583 -466 289 -224 355 -202 327 -206 463 -168 287 -106 399 -134 753 -338 757 -326 283 -230 331 -204 1027 -66 277 -210 487 -100 1219 -324 249 -220 1093 -558 229 -132 995 -282 449 -264 1089 -304 475 -132 1017 -446 483 -68 1235 -338 211 -252 515 -102 243 -176 RAW_Data: 759 -296 497 -132 213 -214 333 -202 329 -204 331 -240 301 -206 369 -170 595 -442 609 -406 605 -440 347 -194 515 -164 211 -154 1041 -198 193 -180 1503 -516 1361 -258 291 -232 1083 -540 1557 -488 1303 -294 253 -288 1549 -524 393 -172 343 -174 533 -132 617 -264 629 -444 479 -200 217 -144 421 -106 1049 -174 243 -140 1025 -172 855 -166 229 -122 801 -314 1045 -134 239 -178 493 -164 217 -124 1047 -164 221 -122 525 -228 225 -100 457 -66 1041 -226 833 -196 1891 -298 523 -302 411 -100 1011 -290 477 -238 1123 -298 491 -66 1033 -478 1797 -320 225 -162 1001 -242 455 -300 1035 -296 231 -332 767 -302 345 -188 369 -194 567 -452 473 -172 233 -160 471 -208 279 -70 483 -342 605 -432 1511 -172 501 -352 1255 -526 1545 -514 1329 -298 263 -266 1063 -538 1553 -488 615 -310 385 -170 391 -136 621 -404 647 -410 389 -160 405 -132 997 -134 279 -178 987 -134 893 -166 241 -154 409 -130 667 -384 477 -200 613 -308 747 -306 483 -134 283 -146 377 -156 779 -298 795 -304 311 -188 797 -302 505 -502 815 -268 301 -240 305 -240 305 -242 271 -236 561 -470 777 -292 283 -260 1285 -298 267 -274 1573 -520 1483 -70 237 -322 219 -126 991 -314 449 -264 1045 -330 235 -304 1307 -340 209 -244 985 -100 475 -430 603 -426 347 -188 375 -176 513 -168 605 -288 367 -170 1365 -268 1527 -516 1471 -138 497 -386 1233 -486 1571 -514 1339 -262 291 -264 303 -244 821 -208 555 -496 543 -464 545 -98 249 -142 417 -140 1043 -140 241 -166 597 -424 813 -280 519 -100 675 -268 601 -442 515 -132 251 -144 367 -168 1053 -132 215 -178 387 -140 513 -206 211 -108 513 -238 1305 -188 867 -190 213 -94 1043 -280 1013 -276 2453 -282 1009 -262 787 -260 515 -260 1055 -232 225 -62 471 -100 489 -292 491 -196 1095 -298 233 -302 1329 -340 245 -176 1017 -136 459 -356 1043 -198 235 -320 1559 -550 1509 -206 253 -284 1277 -296 231 -298 1365 -276 1527 -528 1473 -100 505 -416 1195 -524 553 -302 739 -334 469 -196 251 -92 499 -234 263 -310 677 -324 1031 -264 165 -132 471 -568 201 -338 473 -558 499 -554 231 -300 233 -302 231 -300 497 -522 261 -292 229 -298 271 -306 239 -306 241 -274 273 -270 233 -298 231 -298 497 -556 493 -518 263 -294 265 -304 241 -276 273 -270 497 -520 261 -290 225 -298 267 -270 505 -558 233 -298 271 -274 505 -522 491 -550 487 -546 227 -286 259 -296 301 -114218 231 -100 97 -402 397 -298 99 -100 363 -164 201 -132 699 -100 1193 -100 199 -100 167 -66 429 -200 99 -1060 99 -400 99 -332 65 -168 RAW_Data: 199 -232 199 -100 99 -630 67 -962 231 -198 65 -366 427 -100 231 -102 299 -100 299 -66 593 -132 63 -98 457 -426 165 -724 261 -98 163 -164 263 -98 99 -230 195 -862 65 -132 133 -498 131 -266 65 -66 197 -298 663 -298 829 -132 299 -460 197 -930 99 -66 399 -132 99 -960 165 -134 231 -132 99 -66 395 -726 67 -132 99 -132 231 -132 597 -98 593 -66 133 -198 1131 -98 267 -298 97 -724 525 -196 623 -132 199 -98 295 -98 65 -98 97 -66 197 -264 497 -98 163 -134 233 -100 297 -198 131 -568 297 -100 99 -66 99 -98 465 -100 97 -100 199 -398 1051 -1046 951 -1046 967 -1018 1009 -1004 1003 -1012 993 -1046 237 -288 465 -554 245 -290 253 -286 247 -276 509 -558 497 -554 497 -522 523 -518 259 -254 519 -520 263 -292 263 -266 269 -306 239 -308 241 -274 273 -270 499 -520 487 -550 261 -288 493 -554 231 -296 267 -306 241 -276 271 -270 233 -298 495 -522 261 -294 493 -556 497 -554 495 -554 231 -296 265 -266 497 -524 261 -290 227 -298 267 -268 505 -558 231 -332 239 -272 507 -522 521 -518 487 -550 259 -286 227 -296 271 -304 241 -308 241 -274 507 -522 261 -258 259 -296 265 -266 269 -270 271 -272 271 -308 241 -274 507 -522 489 -548 259 -256 259 -296 499 -558 229 -298 269 -306 241 -274 999 -1012 981 -1026 975 -1024 1011 -980 995 -1012 1019 -1012 261 -274 501 -514 259 -282 253 -292 265 -268 507 -556 497 -556 497 -522 523 -520 227 -286 519 -520 261 -292 261 -266 271 -308 239 -306 241 -274 273 -270 497 -520 489 -550 261 -288 493 -556 231 -294 267 -304 241 -274 273 -272 233 -298 495 -520 261 -292 495 -558 493 -556 493 -552 231 -298 265 -268 499 -522 261 -290 227 -296 267 -270 505 -560 231 -298 269 -274 505 -524 489 -552 487 -550 227 -318 225 -298 269 -304 241 -306 241 -276 507 -522 261 -256 259 -296 265 -268 269 -270 271 -304 239 -308 241 -274 507 -524 487 -550 259 -254 259 -296 499 -558 231 -298 267 -304 241 -276 999 -1014 979 -1016 1005 -988 1007 -1014 1001 -1014 993 -1012 273 -288 465 -552 247 -290 251 -286 247 -278 507 -556 495 -556 497 -522 527 -518 227 -286 517 -522 261 -292 229 -300 269 -304 241 -306 241 -276 273 -270 497 -520 487 -550 261 -290 491 -556 231 -296 267 -304 241 -274 273 -270 233 -298 495 -522 261 -292 495 -556 497 -552 495 -554 231 -296 265 -268 499 -522 259 -292 227 -296 267 -268 505 -560 231 -300 271 -274 505 -524 489 -550 485 -550 227 -318 225 -298 269 -304 241 -308 241 -274 RAW_Data: 507 -522 261 -258 259 -296 231 -302 267 -270 271 -304 239 -308 241 -276 505 -524 487 -550 227 -288 257 -296 499 -558 229 -298 269 -304 241 -276 997 -1012 981 -1026 977 -1026 977 -1014 1001 -1014 993 -1046 235 -288 495 -528 239 -326 219 -290 253 -288 485 -564 501 -556 497 -522 493 -552 227 -286 515 -522 261 -292 231 -300 269 -304 239 -308 241 -274 273 -270 499 -520 489 -550 259 -290 489 -556 231 -296 267 -306 239 -276 273 -270 233 -298 497 -520 261 -292 493 -558 495 -554 495 -552 231 -298 233 -300 497 -522 261 -290 227 -296 267 -270 505 -558 231 -334 237 -272 507 -522 491 -552 485 -552 227 -318 225 -296 269 -304 239 -308 241 -276 505 -524 261 -290 227 -294 231 -302 269 -268 271 -304 239 -308 241 -276 507 -524 487 -552 227 -286 259 -294 501 -556 229 -298 269 -306 241 -276 997 -1010 1003 -986 1007 -998 1009 -1008 1001 -986 1001 -1048 227 -276 503 -550 259 -254 257 -298 267 -270 505 -558 497 -554 497 -524 521 -518 229 -286 517 -522 263 -290 263 -266 269 -306 241 -306 241 -274 273 -270 497 -520 521 -516 259 -290 493 -556 231 -296 269 -304 241 -274 273 -270 233 -298 495 -524 261 -290 493 -558 495 -552 497 -552 231 -298 265 -266 497 -522 259 -292 227 -298 267 -270 505 -558 231 -300 269 -274 505 -524 489 -550 487 -550 229 -286 257 -296 269 -304 241 -308 241 -276 507 -520 261 -258 259 -294 267 -266 269 -270 269 -306 239 -306 241 -276 507 -524 489 -548 259 -256 257 -294 501 -558 231 -296 269 -306 239 -276 999 -1012 979 -1028 975 -1024 1007 -1000 1001 -1000 1007 -1012 259 -280 507 -518 259 -290 225 -298 267 -270 503 -558 497 -554 497 -524 525 -518 227 -286 517 -522 261 -292 263 -266 269 -306 239 -308 241 -276 271 -270 499 -520 487 -550 259 -288 493 -556 229 -298 267 -304 241 -274 273 -270 235 -298 495 -520 261 -292 495 -556 495 -556 493 -554 231 -298 233 -300 497 -520 261 -290 227 -296 267 -270 505 -558 233 -298 271 -272 507 -522 491 -550 485 -550 227 -318 227 -296 271 -304 239 -308 241 -276 507 -522 261 -258 259 -294 265 -268 267 -270 271 -304 239 -308 241 -274 507 -524 489 -550 227 -286 257 -296 499 -558 231 -298 267 -304 241 -274 999 -1010 1001 -1004 983 -1004 1011 -1008 1003 -998 1003 -1018 257 -282 509 -518 259 -290 225 -298 267 -270 503 -560 497 -558 497 -520 521 -520 227 -286 517 -522 259 -292 263 -266 271 -304 239 -308 241 -276 273 -268 499 -522 487 -550 259 -288 491 -556 229 -298 267 -304 241 -274 RAW_Data: 273 -272 233 -296 495 -522 261 -294 493 -556 493 -554 495 -556 229 -298 265 -266 499 -520 261 -290 227 -296 267 -270 505 -558 233 -298 271 -272 507 -524 489 -548 489 -550 227 -316 227 -296 269 -306 239 -308 241 -274 507 -524 259 -258 259 -294 265 -266 269 -270 271 -304 239 -308 239 -276 507 -524 489 -550 227 -286 257 -294 501 -556 231 -296 269 -306 239 -276 999 -1012 981 -1018 1005 -980 1009 -1018 1003 -1008 977 -1038 255 -276 499 -516 259 -282 253 -290 265 -268 505 -556 499 -554 497 -520 525 -518 227 -288 517 -522 261 -292 229 -300 269 -304 239 -308 241 -276 273 -268 497 -522 489 -550 261 -288 489 -556 229 -296 267 -304 241 -276 271 -270 233 -300 495 -522 261 -292 495 -556 495 -552 495 -554 229 -298 231 -300 499 -522 261 -290 227 -296 267 -268 507 -558 231 -298 271 -272 505 -524 489 -552 487 -550 227 -318 225 -296 267 -304 239 -308 241 -274 507 -524 261 -290 227 -296 231 -300 269 -270 269 -306 239 -306 241 -274 505 -524 489 -550 227 -320 225 -296 499 -556 231 -298 267 -306 241 -274 999 -1012 979 -1016 1005 -982 1009 -1014 1003 -1010 979 -1044 237 -292 473 -552 247 -284 245 -276 277 -276 501 -546 515 -548 485 -550 487 -548 225 -286 515 -520 263 -290 263 -266 269 -306 239 -306 243 -274 273 -270 495 -520 491 -548 261 -288 491 -554 231 -296 267 -304 241 -276 273 -270 233 -298 495 -522 261 -290 495 -556 495 -520 527 -554 229 -298 267 -268 497 -522 259 -258 259 -296 269 -270 505 -558 231 -300 269 -274 507 -522 521 -514 489 -548 259 -256 289 -264 271 -272 273 -308 241 -276 505 -522 259 -258 257 -296 267 -266 271 -270 269 -272 273 -306 241 -274 507 -522 521 -516 259 -254 259 -296 501 -556 231 -296 269 -306 241 -276 1001 -1010 979 -1016 1003 -986 1009 -1014 1001 -1006 1011 -1006 253 -276 497 -516 259 -282 255 -292 267 -270 507 -556 497 -554 499 -522 523 -518 259 -254 517 -522 261 -292 265 -266 269 -272 273 -308 243 -274 273 -268 497 -522 521 -516 259 -288 491 -554 231 -298 267 -306 241 -276 273 -270 231 -298 493 -522 261 -292 495 -556 495 -520 527 -554 231 -296 267 -268 497 -520 261 -290 229 -296 267 -270 505 -558 233 -298 271 -272 507 -524 489 -550 487 -548 259 -252 291 -264 271 -272 273 -308 241 -274 507 -520 261 -258 259 -296 265 -266 269 -270 271 -270 273 -308 241 -276 505 -524 487 -548 259 -256 255 -298 501 -556 231 -298 267 -306 241 -276 999 -1004 1007 -988 1009 -998 1011 -1012 991 -982 1025 -1010 RAW_Data: 269 -290 465 -554 247 -290 251 -286 247 -278 505 -556 497 -554 497 -522 525 -516 227 -286 519 -522 261 -292 261 -266 271 -304 239 -308 241 -276 273 -270 497 -520 489 -550 259 -256 521 -556 231 -296 269 -306 241 -274 273 -270 233 -296 495 -522 261 -292 495 -556 495 -520 527 -554 231 -296 267 -266 499 -518 261 -290 229 -298 267 -268 507 -556 233 -298 271 -272 507 -526 487 -550 485 -548 259 -254 291 -264 271 -272 275 -308 241 -274 505 -522 259 -258 259 -296 265 -268 267 -270 271 -272 273 -274 273 -276 507 -520 521 -516 259 -254 291 -262 501 -556 231 -298 269 -306 241 -276 1001 -1010 979 -1018 1007 -982 1009 -1016 999 -984 1019 -1008 257 -274 499 -548 257 -254 257 -296 267 -270 505 -558 497 -554 499 -520 523 -516 259 -256 517 -524 261 -290 263 -266 271 -270 275 -274 275 -274 273 -268 499 -518 519 -516 261 -288 493 -524 263 -296 269 -270 275 -276 271 -270 233 -298 495 -518 263 -292 493 -524 529 -522 527 -522 265 -294 265 -266 497 -520 261 -258 293 -264 267 -270 507 -556 267 -264 271 -274 507 -522 523 -516 485 -548 259 -254 291 -264 271 -272 275 -274 275 -276 507 -520 259 -256 257 -296 265 -268 271 -270 271 -272 273 -272 275 -276 505 -520 523 -514 257 -256 289 -264 503 -524 263 -296 269 -272 275 -276 999 -1004 1001 -998 1019 -972 1007 -1006 1001 -996 1009 -1020 257 -280 511 -520 259 -256 293 -262 269 -272 505 -556 497 -554 497 -522 523 -518 259 -252 517 -522 261 -292 263 -266 273 -272 275 -272 277 -274 271 -236 529 -522 521 -514 261 -256 523 -522 297 -264 269 -270 275 -276 273 -236 265 -264 529 -520 261 -290 497 -522 527 -520 529 -552 265 -264 267 -234 531 -520 259 -258 291 -264 269 -272 507 -554 265 -266 271 -274 507 -522 519 -514 521 -514 259 -256 291 -266 271 -272 275 -274 275 -274 507 -522 259 -256 289 -264 265 -270 269 -270 269 -272 273 -274 275 -276 505 -522 519 -514 259 -254 291 -264 501 -522 299 -264 269 -272 277 -276 999 -978 1045 -958 1011 -1024 1007 -978 1019 -978 1013 -1008 271 -292 503 -490 283 -288 249 -278 273 -268 501 -522 529 -520 531 -520 525 -516 257 -254 519 -520 263 -292 265 -266 271 -274 273 -274 275 -276 269 -236 529 -520 521 -516 259 -256 523 -522 297 -264 269 -272 277 -274 273 -236 265 -262 527 -522 259 -292 495 -524 529 -520 529 -518 297 -264 267 -234 531 -520 259 -256 293 -264 269 -270 505 -556 267 -264 271 -274 507 -520 521 -518 517 -514 259 -256 293 -266 271 -270 RAW_Data: 275 -306 241 -276 507 -520 259 -258 257 -296 267 -266 269 -268 273 -272 273 -274 275 -274 505 -524 521 -514 259 -254 289 -264 501 -556 231 -298 269 -270 277 -276 997 -980 1011 -996 1009 -990 1045 -980 999 -1010 1015 -1008 271 -256 501 -536 251 -272 245 -276 277 -286 499 -558 499 -554 497 -522 523 -516 259 -254 517 -522 261 -292 265 -266 271 -272 273 -274 275 -274 271 -236 531 -520 521 -516 259 -256 523 -524 263 -296 269 -270 277 -276 273 -236 265 -262 527 -520 263 -292 495 -556 497 -518 527 -552 263 -266 267 -268 497 -520 261 -258 291 -264 269 -268 507 -554 267 -264 271 -276 507 -522 521 -514 519 -516 259 -254 293 -264 271 -272 273 -274 275 -274 507 -522 259 -256 291 -262 265 -268 271 -270 271 -272 273 -272 275 -276 505 -520 521 -516 259 -254 289 -264 501 -526 263 -298 267 -272 275 -276 999 -1004 1003 -986 1007 -1000 1013 -1010 985 -1014 1015 -1006 275 -254 501 -524 283 -256 251 -284 275 -272 501 -554 499 -554 497 -520 525 -516 259 -254 517 -520 261 -292 263 -268 271 -274 273 -274 275 -276 271 -236 529 -520 521 -516 259 -256 523 -524 295 -264 269 -272 277 -274 273 -270 231 -264 527 -522 263 -258 527 -522 527 -520 529 -552 265 -266 265 -268 497 -520 259 -258 293 -262 269 -272 507 -556 265 -264 271 -276 507 -520 521 -516 519 -514 259 -254 293 -264 271 -272 277 -274 275 -274 507 -522 259 -256 257 -294 267 -268 269 -270 271 -272 273 -274 275 -274 507 -522 519 -516 259 -254 289 -264 503 -522 263 -298 267 -272 277 -276 999 -1008 1009 -984 1009 -984 1005 -1012 999 -1012 1013 -1004 255 -274 499 -544 257 -252 289 -262 269 -270 507 -556 497 -552 497 -520 525 -518 259 -254 519 -520 261 -294 263 -266 271 -272 275 -274 275 -274 273 -234 531 -520 519 -516 261 -256 523 -522 263 -298 269 -272 275 -276 273 -270 231 -264 527 -522 261 -292 493 -524 359 -91592 331 -232 65 -2392 131 -496 329 -2040 231 -66 201 -200 133 -920 65 -232 97 -100 491 -100 195 -198 131 -196 295 -98 197 -66 655 -166 131 -428 99 -296 65 -330 163 -66 163 -98 97 -66 99 -1778 165 -66 195 -854 129 -494 297 -98 97 -66 197 -260 261 -262 165 -132 293 -66 423 -166 9931 -462 67 -762 99 -268 199 -862 65 -760 165 -232 131 -434 133 -1126 363 -132 165 -134 67 -332 97 -466 97 -66 265 -100 133 -100 231 -1590 65 -334 199 -98 67 -1592 201 -100 131 -66 165 -164 97 -1714 327 -66 329 -98 595 -100 993 -132 65 -100 165 -232 65 -100 RAW_Data: 97 -100 293 -330 99 -98 163 -458 99 -196 131 -66 163 -426 167 -298 99 -462 99 -66 67 -462 229 -66 195 -100 757 -66 425 -66 427 -100 529 -134 265 -1430 131 -302 97 -66 97 -132 65 -66 229 -100 97 -1530 133 -264 563 -66 1165 -200 1025 -198 167 -1294 265 -132 197 -962 131 -300 131 -66 99 -366 165 -198 167 -830 197 -230 195 -434 299 -98 965 -132 265 -894 99 -98 65 -860 461 -66 97 -398 67 -928 165 -200 199 -66 199 -1456 197 -334 133 -132 501 -198 1579 -66 1151 -132 463 -98 10275 -528 97 -966 263 -760 65 -264 197 -134 65 -512 479 -526 455 -572 443 -572 437 -550 451 -548 447 -552 481 -526 457 -542 483 -538 469 -548 449 -548 447 -554 449 -1048 975 -558 463 -548 451 -1046 449 -554 953 -1054 981 -540 443 -550 475 -1014 985 -1052 981 -516 475 -1048 473 -520 487 -534 463 -548 943 -1044 969 -554 449 -558 465 -1042 979 -520 485 -514 473 -548 453 -1042 973 -1048 981 -1014 483 -546 971 -522 473 -556 445 -1032 493 -51306 533 -514 457 -546 451 -550 477 -522 475 -542 471 -554 453 -538 467 -548 451 -546 447 -550 477 -524 473 -554 451 -540 469 -1044 977 -554 451 -546 441 -1042 483 -514 975 -1048 977 -522 493 -516 481 -1046 977 -1018 979 -552 453 -1042 481 -520 485 -516 471 -550 983 -1014 981 -546 477 -518 489 -1012 975 -554 451 -544 467 -550 451 -1042 975 -1050 949 -1046 483 -548 941 -554 483 -514 469 -1046 447 -51364 513 -518 451 -554 451 -544 469 -548 451 -546 481 -514 475 -522 475 -554 443 -572 443 -548 453 -546 479 -514 477 -554 447 -1050 975 -522 493 -512 483 -1040 471 -538 969 -1032 985 -534 467 -1046 977 -528 485 -1016 965 -1042 481 -524 489 -522 973 -524 493 -514 481 -1040 969 -1050 979 -1016 481 -514 475 -552 977 -522 479 -1028 493 -512 481 -546 975 -520 485 -514 473 -548 453 -544 481 -1016 981 -51834 519 -526 465 -514 481 -546 479 -514 473 -522 471 -558 487 -514 469 -548 451 -546 479 -514 475 -522 471 -538 471 -536 485 -1048 961 -546 445 -552 483 -1016 479 -536 965 -1042 977 -534 475 -1042 465 -548 979 -1014 485 -516 977 -1042 479 -514 1005 -1018 975 -1018 483 -544 975 -520 473 -1058 471 -516 975 -548 453 -546 479 -516 479 -522 471 -1052 985 -520 489 -1006 1005 -528 459 -1050 479 -518 489 -51332 483 -542 453 -546 445 -550 477 -522 483 -554 449 -554 461 -514 483 -548 445 -552 441 -588 447 -548 441 -550 455 -548 481 -1042 967 -540 441 -552 481 -1024 489 -514 975 -1034 971 -1050 973 -548 451 -548 447 -1048 485 -540 RAW_Data: 453 -542 467 -548 945 -1048 981 -544 449 -1056 453 -546 481 -516 973 -554 449 -544 469 -1046 975 -526 487 -508 485 -1038 489 -512 483 -516 479 -522 1001 -508 483 -1036 983 -514 475 -51832 491 -574 411 -604 399 -618 389 -618 385 -622 383 -610 415 -578 411 -602 437 -552 455 -550 449 -554 445 -584 445 -546 441 -1046 981 -522 485 -546 447 -1054 451 -546 973 -1052 953 -1046 965 -1042 977 -556 451 -542 467 -514 483 -1040 969 -1050 479 -532 961 -546 445 -552 481 -520 485 -516 473 -548 453 -546 481 -516 481 -522 475 -1046 481 -532 961 -1044 481 -530 461 -554 449 -524 987 -1040 969 -1052 449 -51326 525 -532 465 -548 451 -548 445 -552 443 -586 431 -546 477 -524 491 -514 481 -546 445 -552 441 -554 485 -516 473 -548 487 -1010 977 -554 451 -540 469 -1042 475 -508 1007 -1034 967 -1042 477 -518 983 -516 479 -524 487 -536 473 -1018 481 -526 987 -540 479 -516 475 -524 485 -540 453 -544 469 -1044 975 -526 483 -1014 505 -518 981 -1010 473 -556 485 -514 469 -548 451 -546 971 -542 483 -520 485 -1010 493 -512 975 -51842 491 -606 339 -662 333 -652 357 -654 385 -628 357 -642 377 -604 403 -622 391 -584 417 -590 421 -614 409 -574 439 -554 421 -1114 909 -578 415 -578 449 -1094 423 -550 975 -1034 969 -1038 477 -522 493 -514 975 -554 483 -1012 967 -1048 977 -518 481 -1028 987 -510 479 -1034 1005 -520 485 -534 465 -1014 1007 -492 517 -1012 999 -514 483 -1016 487 -520 975 -1060 949 -1050 457 -550 479 -530 467 -51296 517 -552 451 -578 421 -570 447 -572 407 -592 427 -584 417 -586 417 -578 415 -576 445 -576 447 -546 447 -568 465 -550 453 -1046 977 -510 467 -542 479 -1050 449 -542 973 -1052 483 -518 973 -514 483 -546 447 -552 483 -520 471 -1036 471 -516 1011 -1012 487 -506 1017 -510 471 -548 451 -1042 475 -510 483 -542 487 -506 983 -1036 987 -1046 975 -1020 979 -516 483 -1042 973 -1028 997 -512 471 -550 487 -51298 65 -1910 229 -230 99 -66 165 -922 97 -164 197 -66 131 -426 65 -68 231 -264 95 -66 361 -196 1023 -66 227 -98 195 -66 229 -98 4711 -100 233 -98 99 -66 1025 -66 10443 -130 233 -168 465 -66 2057 -100 6537 -66 821 -132 1841 -98 165 -98 7675 -66 1343 -232 67 -132 131 -134 329 -100 365 -132 3561 -66 297 -134 1691 -100 861 -66 497 -66 1359 -66 197 -198 429 -66 929 -66 2675 -100 261 -98 99 -98 459 -166 197 -66 195 -130 625 -98 295 -132 455 -66 391 -130 197 -132 5171 -66 1597 -66 1085 -68 1025 -66 565 -100 131 -132 4741 -66 559 -66 2343 -98 RAW_Data: 4573 -66 2455 -98 2333 -130 5301 -66 531 -66 1895 -66 163 -68 5167 -98 591 -100 1521 -166 7219 -100 2149 -100 1443 -98 1149 -66 9647 -66 5157 -100 1321 -164 917 -100 2083 -132 7551 -134 165 -68 1169 -100 1263 -68 3619 -166 963 -100 1229 -198 2393 -68 1661 -98 2109 -66 131 -68 299 -100 5029 -66 957 -100 1185 -66 1653 -98 4925 -66 1201 -66 1827 -96 163 -132 501 -66 165 -66 763 -100 163 -98 821 -66 4555 -264 1353 -132 499 -100 163 -66 1749 -100 1063 -132 1577 -100 763 -68 331 -102 299 -100 429 -66 265 -234 331 -66 1963 -68 627 -132 231 -102 763 -66 497 -66 265 -68 2061 -68 463 -66 297 -100 1393 -430 295 -100 823 -98 97 -100 631 -102 529 -66 1251 -68 1195 -66 361 -66 195 -100 4929 -134 231 -100 561 -66 829 -68 893 -66 6729 -66 901 -68 1259 -66 65 -166 131 -232 65 -100 131 -132 131 -100 131 -564 661 -98 329 -66 199 -66 263 -66 165 -68 97 -68 363 -566 197 -1064 395 -862 133 -200 99 -198 199 -596 229 -994 295 -928 163 -130 395 -98 229 -66 99 -98 997 -66 133 -566 165 -232 99 -100 99 -100 99 -530 99 -66 133 -66 165 -764 99 -398 199 -296 165 -96 129 -328 131 -560 227 -298 99 -100 465 -100 397 -66 67 -98 331 -132 199 -232 201 -438 263 -166 329 -166 463 -632 131 -398 99 -134 131 -1590 263 -66 67 -196 163 -298 195 -1220 227 -292 297 -132 591 -298 295 -100 493 -66 163 -162 325 -134 197 -64 197 -164 97 -460 65 -166 195 -266 97 -164 327 -264 229 -234 165 -66 163 -630 299 -532 197 -796 131 -100 65 -466 65 -98 99 -328 361 -66 197 -130 295 -66 197 -692 99 -166 99 -166 99 -66 131 -100 99 -66 165 -134 233 -130 267 -498 265 -66 167 -1192 67 -364 463 -132 133 -300 197 -100 99 -298 629 -66 331 -132 629 -134 65 -132 231 -100 65 -1392 65 -166 131 -230 199 -466 97 -100 233 -730 263 -296 99 -98 133 -100 163 -134 67 -100 131 -98 229 -100 231 -132 497 -264 989 -164 233 -98 65 -102 495 -264 197 -826 99 -496 133 -132 365 -64 131 -66 99 -98 65 -132 65 -100 329 -66 165 -100 131 -700 165 -492 231 -130 195 -130 131 -230 197 -200 691 -132 99 -66 331 -264 165 -100 131 -730 131 -200 131 -498 99 -100 197 -100 131 -66 165 -68 165 -534 65 -498 401 -166 65 -592 65 -98 65 -100 131 -66 231 -132 133 -100 299 -198 133 -164 265 -100 433 -66 429 -330 631 -98 163 -66 265 -232 65 -66 199 -100 165 -198 233 -66 131 -234 67 -564 RAW_Data: 163 -400 165 -464 131 -362 561 -332 263 -98 133 -132 165 -100 661 -232 591 -328 65 -98 133 -368 131 -560 97 -100 165 -464 131 -296 129 -558 131 -98 99 -196 65 -98 163 -100 97 -394 261 -558 259 -98 97 -426 299 -364 365 -66 599 -166 363 -428 231 -134 625 -98 359 -394 195 -164 197 -66 97 -98 263 -490 195 -98 261 -460 163 -100 199 -330 131 -198 163 -66 293 -66 885 -100 1315 -234 333 -234 365 -200 133 -596 197 -166 295 -100 197 -232 165 -66 131 -336 197 -268 231 -100 99 -696 163 -262 331 -132 197 -132 131 -132 361 -100 525 -66 195 -132 227 -232 163 -262 1233 -68 797 -98 427 -98 231 -200 331 -132 129 -98 163 -66 129 -100 97 -100 5243 -198 1295 -66 197 -66 165 -66 499 -23298 65 -68 131 -564 329 -100 133 -298 101 -166 199 -300 65 -764 133 -266 297 -130 165 -132 265 -66 2793 -198 4161 -66 1747 -100 1729 -98 603 -132 363 -530 99 -266 129 -100 231 -396 129 -198 133 -98 991 -132 397 -462 131 -330 295 -132 197 -134 99 -262 99 -232 229 -268 263 -1448 229 -68 65 -198 99 -134 165 -996 429 -396 631 -632 727 -98 297 -100 199 -134 65 -332 65 -234 165 -362 99 -428 263 -232 67 -1158 165 -196 129 -228 131 -132 195 -98 163 -698 65 -234 531 -728 295 -130 97 -98 229 -366 499 -66 99 -66 131 -66 297 -232 165 -100 65 -400 233 -66 265 -134 131 -134 165 -132 233 -134 97 -300 397 -102 65 -98 99 -98 6595 -132 65 -164 131 -100 529 -66 2157 -66 163 -100 99 -466 99 -530 163 -166 195 -264 197 -66 199 -66 199 -100 11433 -164 1055 -562 497 -134 233 -100 399 -100 131 -66 163 -234 733 -264 163 -236 65 -430 67 -332 133 -132 133 -66 465 -66 603 -98 265 -98 199 -66 3567 -100 391 -166 525 -132 1055 -98 627 -264 333 -100 795 -66 165 -66 297 -66 393 -134 263 -100 1317 -98 131 -98 529 -98 293 -66 99 -66 163 -100 493 -64 265 -164 231 -100 199 -132 265 -66 265 -100 99 -134 199 -132 431 -100 365 -132 231 -68 201 -132 891 -100 831 -98 167 -100 1191 -64 329 -66 393 -98 131 -64 131 -98 229 -132 2693 -132 10455 -66 297 -98 631 -100 431 -100 433 -98 165 -134 65 -100 65 -68 863 -132 499 -100 267 -134 99 -66 989 -66 657 -100 757 -594 395 -66 199 -66 463 -330 663 -264 4219 -66 851 -98 129 -132 915 -66 129 -66 363 -98 99 -100 699 -66 4847 -66 2153 -134 1993 -66 5935 -66 1435 -100 2119 -66 9535 -296 197 -624 131 -1446 129 -362 65 -198 RAW_Data: 67 -298 197 -226 131 -164 595 -66 463 -98 131 -198 395 -262 131 -66 1773 -516 455 -548 481 -516 479 -556 451 -554 451 -542 469 -548 451 -546 447 -552 449 -554 471 -542 477 -518 489 -512 481 -1044 977 -506 485 -540 469 -1044 481 -518 975 -1050 947 -548 489 -512 481 -1042 967 -1020 979 -550 455 -1038 477 -520 471 -556 483 -514 969 -1044 977 -536 473 -544 449 -1054 955 -552 447 -554 485 -514 471 -1046 975 -1020 485 -518 1003 -512 483 -548 447 -554 447 -556 485 -1010 491 -51312 527 -512 453 -544 477 -540 477 -514 473 -538 473 -524 471 -558 453 -542 467 -514 485 -546 479 -514 473 -522 471 -534 501 -1014 1001 -512 481 -514 479 -1052 459 -544 979 -1016 1009 -516 473 -522 469 -1044 995 -1010 1007 -524 475 -1004 495 -512 483 -544 479 -514 1003 -1018 977 -522 489 -512 479 -1034 1003 -522 487 -512 467 -514 483 -1044 975 -1020 485 -524 991 -514 477 -550 473 -524 473 -536 471 -1030 489 -51306 517 -520 493 -512 483 -546 445 -550 477 -520 469 -544 479 -518 495 -512 481 -514 475 -550 477 -526 471 -538 473 -538 471 -1018 979 -548 451 -546 479 -1010 473 -554 965 -1034 989 -516 479 -1048 967 -554 451 -1022 977 -1034 475 -554 473 -510 1003 -512 481 -546 443 -1064 969 -1034 977 -1020 483 -546 477 -516 967 -538 473 -1052 449 -562 461 -514 481 -546 477 -514 477 -522 999 -510 485 -1038 985 -51816 479 -3892 63 -722 289 -742 265 -734 271 -762 231 -722 291 -720 321 -644 373 -642 339 -626 395 -1114 911 -610 415 -580 413 -1098 425 -548 979 -1054 955 -544 443 -1080 449 -548 939 -1054 473 -550 949 -1048 481 -514 973 -1050 975 -1050 453 -544 971 -538 473 -1032 471 -538 967 -554 449 -524 495 -512 481 -546 479 -1008 473 -556 487 -512 965 -546 481 -516 473 -1036 487 -522 483 -97226 691 -134 1391 -396 231 -166 1025 -98 199 -132 99 -266 395 -100 165 -132 231 -98 689 -66 493 -98 65 -98 557 -134 365 -68 131 -164 425 -132 259 -98 1255 -232 195 -66 495 -64 1651 -100 199 -100 1099 -100 331 -132 265 -168 6433 -66 28525 -100 395 -66 395 -100 259 -164 559 -100 463 -66 327 -66 131 -100 685 -66 395 -98 199 -100 431 -66 101 -100 231 -66 333 -66 399 -266 165 -68 99 -100 165 -398 299 -98 197 -824 97 -132 229 -66 295 -264 97 -230 131 -394 469 -266 397 -198 165 -270 133 -562 165 -66 229 -266 99 -232 363 -530 427 -730 99 -166 97 -534 297 -100 297 -134 133 -132 67 -100 67 -66 361 -430 397 -330 65 -198 165 -200 167 -68 131 -132 199 -68 233 -100 RAW_Data: 99 -234 65 -300 263 -562 163 -66 199 -166 165 -132 99 -264 131 -262 261 -64 459 -66 427 -132 65 -132 131 -100 97 -228 163 -164 523 -328 297 -66 131 -332 199 -266 65 -134 165 -66 197 -68 697 -98 165 -134 233 -496 231 -164 63 -66 197 -264 297 -166 99 -198 131 -100 365 -266 299 -232 99 -66 627 -132 1415 -100 195 -198 165 -98 327 -98 523 -98 131 -228 229 -230 295 -694 499 -100 531 -66 131 -134 165 -300 165 -132 265 -300 997 -102 1921 -134 723 -98 195 -132 99 -164 163 -68 397 -100 331 -132 165 -266 467 -232 131 -66 465 -198 463 -132 165 -66 329 -100 2691 -100 431 -166 397 -100 199 -134 529 -100 1053 -66 18073 -98 1251 -130 1425 -66 497 -98 6625 -10518 1205 -578 607 -588 599 -612 597 -586 605 -582 587 -1214 1171 -1180 1207 -582 609 -588 613 -578 613 -592 611 -576 613 -1184 583 -580 1205 -1206 1169 -614 577 -590 629 -576 601 -1182 609 -598 1177 -578 627 -588 603 -1178 1207 -582 589 -1178 1209 -1178 613 -588 613 -576 1215 -1174 1181 -1204 1183 -604 579 -1218 1175 -604 579 -1186 1225 -562 615 -1184 611 -578 1207 -578 605 -1184 609 -568 1209 -580 629 -582 603 -574 605 -580 603 -612 577 -610 603 -77146 1139 -774 423 -1374 419 -716 495 -708 493 -682 1089 -1308 1095 -688 519 -638 539 -656 551 -638 539 -656 549 -638 575 -622 551 -1206 1179 -1204 585 -616 577 -620 1189 -594 581 -602 581 -1186 603 -614 1169 -1200 1207 -1176 613 -592 1181 -600 581 -1214 583 -580 611 -588 615 -576 615 -588 1173 -1212 579 -590 613 -590 587 -614 1169 -1212 579 -612 591 -580 1201 -588 615 -578 613 -1180 587 -616 1169 -1210 1201 -580 579 -622 591 -1170 1203 -612 575 -614 593 -77174 1201 -608 589 -1210 583 -622 549 -606 585 -626 1169 -1204 579 -608 1205 -578 601 -586 621 -582 589 -614 575 -1214 575 -620 563 -612 1193 -592 579 -1204 1183 -606 577 -1224 559 -614 1195 -588 611 -1182 581 -606 1205 -1176 611 -586 579 -628 1173 -1208 581 -604 1167 -616 571 -1216 1171 -618 585 -1210 1177 -1208 581 -586 1205 -580 589 -616 571 -1212 1171 -616 587 -1206 573 -594 615 -588 589 -614 1169 -618 583 -1212 1177 -578 609 -590 613 -578 611 -77168 1211 -612 565 -1242 549 -628 577 -620 583 -586 1173 -616 587 -612 587 -588 615 -578 611 -586 579 -628 579 -620 585 -1180 1197 -1194 1183 -600 583 -622 583 -1184 1193 -1180 1197 -604 577 -1214 585 -614 1169 -1210 1165 -614 577 -622 591 -580 603 -1182 609 -602 1173 -1204 577 -598 1203 -610 571 -616 575 -1202 581 -608 611 -592 577 -602 1203 -1172 611 -588 611 -578 611 -592 RAW_Data: 1171 -622 591 -580 603 -1180 1207 -580 599 -1208 579 -622 1173 -612 575 -590 613 -123688 65 -3788 133 -896 65 -168 65 -926 297 -168 65 -100 365 -66 297 -98 201 -1162 131 -428 195 -66 297 -166 99 -760 99 -196 131 -132 65 -98 197 -66 493 -264 99 -264 821 -66 793 -100 3007 -98 2067 -66 2411 -430 97 -98 197 -130 297 -230 465 -98 4123 -100 391 -132 163 -66 751 -164 161 -990 759 -64 1055 -264 129 -166 429 -66 3943 -66 399 -100 665 -432 431 -132 99 -132 97 -68 97 -330 295 -164 131 -66 291 -66 589 -264 563 -100 1227 -166 233 -298 699 -100 863 -534 131 -332 1619 -100 1595 -132 2191 -164 465 -66 233 -68 299 -66 561 -134 369 -68 233 -134 297 -168 463 -166 795 -100 265 -68 131 -100 3629 -66 227 -66 853 -66 529 -100 1191 -98 501 -132 1417 -64 229 -132 1115 -66 463 -66 231 -64 361 -66 231 -98 989 -98 265 -300 1125 -66 897 -68 197 -100 529 -66 787 -164 163 -66 2705 -66 1899 -132 929 -64 1197 -132 4387 -98 263 -96 261 -100 751 -66 229 -10520 1245 -566 609 -564 615 -572 613 -590 615 -594 589 -1174 1203 -1204 1195 -564 615 -592 617 -580 611 -560 627 -576 603 -1186 609 -564 1213 -1176 1211 -578 623 -588 611 -1176 1205 -582 583 -582 613 -588 611 -578 625 -1152 1205 -592 615 -1176 1217 -1172 601 -576 605 -590 1193 -1186 1191 -1184 1227 -576 615 -1150 1209 -604 613 -1152 1227 -576 591 -1188 613 -578 1207 -576 607 -1184 607 -600 1179 -578 629 -588 607 -582 587 -1182 613 -586 1209 -77154 1187 -666 541 -1242 523 -676 535 -618 553 -644 1163 -1212 1169 -628 577 -620 551 -616 609 -588 589 -614 573 -586 597 -610 599 -1182 1209 -1182 581 -592 613 -604 1169 -1216 577 -604 1175 -1206 1175 -1208 1173 -1206 579 -596 1201 -610 571 -1212 605 -584 587 -610 575 -618 583 -612 1171 -1210 577 -588 613 -580 611 -590 1205 -1170 611 -578 611 -592 1171 -622 591 -578 603 -1182 611 -600 1177 -1206 1177 -610 597 -586 601 -1178 615 -590 589 -578 1205 -77194 1193 -618 583 -1208 575 -624 577 -606 583 -588 1205 -1178 611 -572 1201 -612 575 -588 615 -576 611 -590 579 -1206 585 -616 575 -622 1183 -600 577 -1216 1177 -604 581 -592 611 -608 583 -1178 1197 -1196 573 -616 1199 -1174 611 -586 589 -614 1167 -1214 575 -620 1185 -600 577 -1216 1177 -604 575 -1220 1159 -1222 585 -582 1181 -622 579 -592 611 -1200 1175 -588 585 -1208 605 -576 605 -620 561 -612 1189 -606 581 -1212 1177 -1208 581 -586 1207 -77162 599 -4312 397 -788 425 -772 1027 -722 471 -708 487 -686 503 -678 521 -686 503 -680 523 -652 RAW_Data: 535 -1274 1109 -1240 1175 -614 559 -650 533 -1240 1177 -616 559 -1208 575 -628 577 -604 577 -620 1175 -1208 1171 -614 605 -578 601 -588 599 -1178 615 -588 1185 -1202 589 -614 1167 -618 583 -612 591 -1186 599 -584 601 -582 591 -618 1199 -1176 603 -580 591 -616 573 -616 1179 -624 581 -584 613 -1184 1173 -622 591 -1172 611 -592 579 -610 613 -588 1173 -122626 229 -330 197 -98 65 -98 97 -100 229 -166 129 -232 65 -66 131 -394 97 -66 97 -66 395 -66 557 -66 657 -64 489 -66 327 -100 65 -98 461 -64 5371 -64 691 -98 859 -66 631 -166 797 -66 299 -132 65 -66 4463 -134 331 -134 233 -132 1495 -264 699 -98 263 -134 1031 -692514 65 -100 97 -1392 131 -398 65 -134 201 -832 4061 -132 523 -66 431 -66 99 -132 99 -100 831 -66 165 -66 1969 -164 8553 -100 297 -68 523 -100 197 -130 957 -98 361 -98 2015 -98 263 -130 195 -130 4497 -66 999 -66 1357 -66 1189 -132 929 -66 4649 -66 263 -66 131 -64 657 -100 195 -68 231 -100 1025 -100 565 -68 931 -98 985 -98 661 -164 363 -100 501 -66 3719 -66 2015 -66 663 -132 299 -330 823 -66 1661 -66 4179 -66 433 -66 1523 -68 697 -68 197 -100 199 -66 1265 -98 629 -68 299 -168 629 -100 3539 -166 331 -66 495 -98 327 -132 589 -166 499 -66 463 -100 331 -66 627 -98 489 -64 129 -130 361 -98 195 -130 65 -100 793 -98 391 -66 1515 -66 129 -66 757 -132 561 -98 653 -64 197 -98 1577 -296 163 -100 789 -66 689 -66 3829 -100 533 -398 467 -166 531 -66 331 -198 753 -64 557 -98 693 -66 165 -100 4907 -134 199 -100 131 -66 333 -198 1345 -66 3781 -98 267 -100 597 -232 1449 -66 723 -330 197 -164 1021 -132 561 -98 591 -100 755 -66 559 -100 229 -228 131 -66 163 -198 689 -100 3365 -100 99 -68 431 -100 797 -66 431 -100 401 -68 397 -134 295 -66 297 -64 65 -100 1085 -132 3135 -66 497 -66 201 -98 99 -168 299 -66 165 -68 267 -366 231 -66 463 -266 733 -132 397 -66 297 -100 4563 -66 163 -66 293 -100 755 -100 697 -100 563 -100 4661 -132 65 -100 97 -494 691 -98 63 -66 459 -232 295 -230 229 -198 495 -66 457 -266 425 -685602 231 -202 133 -66 331 -66 167 -132 699 -98 231 -66 301 -66 299 -596 399 -66 557 -230 7389 -66 733 -98 657 -66 723 -100 789 -68 1661 -132 627 -66 1087 -134 97 -66 5173 -134 693 -134 1261 -132 4435 -66 131 -134 199 -66 891 -66 493 -100 397 -66 365 -100 297 -134 4287 -66 501 -166 1281 -100 195 -100 1151 -100 467 -266 265 -98 RAW_Data: 2027 -68 131 -66 5771 -98 2171 -130 163 -66 7573 -66 661 -66 653 -66 357 -130 7217 -98 229 -132 393 -66 997 -66 4689 -100 97 -134 9081 -66 163 -132 493 -100 1217 -132 529 -230 131 -66 235 -100 133 -134 1359 -66 5243 -98 329 -66 167 -100 299 -100 431 -66 7349 -132 1059 -66 1393 -100 1317 -66 629 -98 429 -100 495 -100 365 -66 397 -234 1489 -100 4599 -100 399 -100 1855 -68 433 -98 1393 -132 7409 -100 5607 -66 463 -66 665 -68 2553 -134 167 -102 2263 -686936 99 -800 67 -98 99 -66 133 -230 265 -66 3631 -100 229 -130 99 -66 825 -100 99 -232 231 -66 521 -66 593 -98 1413 -130 359 -66 4639 -66 131 -68 97 -202 799 -166 99 -68 365 -66 1595 -66 2987 -66 423 -100 131 -98 791 -132 433 -100 893 -66 4831 -100 101 -98 629 -66 1221 -98 197 -66 625 -98 261 -66 559 -66 665 -66 4409 -66 331 -268 2017 -166 199 -68 333 -98 1553 -68 401 -166 563 -66 393 -100 195 -66 1485 -230 265 -100 4353 -68 431 -100 2383 -66 6737 -98 493 -66 1017 -68 5915 -66 1085 -198 527 -66 4223 -100 163 -64 131 -66 1187 -98 393 -66 1747 -130 263 -66 597 -100 501 -100 431 -132 1491 -100 131 -66 599 -68 2595 -100 497 -68 265 -100 763 -100 265 -100 165 -66 595 -68 331 -100 1587 -66 163 -66 99 -164 559 -130 457 -66 1611 -100 991 -66 4403 -100 1427 -164 565 -132 499 -66 827 -298 299 -100 4637 -166 263 -100 995 -66 1083 -428 365 -424 369 -454 377 -420 377 -418 409 -418 377 -424 381 -436 357 -438 387 -444 383 -414 385 -4058 783 -452 797 -434 811 -412 417 -862 773 -474 779 -484 387 -874 383 -850 403 -822 809 -450 415 -834 807 -444 773 -482 381 -870 787 -478 791 -436 805 -448 803 -420 411 -842 403 -836 415 -838 391 -864 807 -480 395 -850 387 -840 385 -844 391 -858 381 -878 783 -452 795 -464 807 -450 817 -448 377 -858 807 -446 777 -450 789 -454 813 -448 819 -430 809 -448 411 -838 807 -446 385 -862 379 -870 769 -468 801 -446 809 -456 379 -872 409 -858 781 -448 383 -846 409 -846 775 -478 381 -848 415 -858 809 -444 813 -422 393 -868 781 -448 385 -850 409 -860 777 -480 385 -866 805 -444 805 -418 411 -808 391 -15820 421 -372 417 -388 419 -386 437 -394 395 -400 421 -408 385 -412 415 -384 415 -418 383 -420 383 -420 385 -4030 825 -410 845 -420 811 -418 423 -838 821 -420 815 -456 385 -878 419 -816 407 -816 835 -416 409 -842 821 -422 811 -456 387 -876 789 -454 825 -428 801 -414 821 -442 399 -850 381 -852 RAW_Data: 417 -824 447 -812 809 -462 413 -848 421 -816 399 -822 413 -850 419 -816 803 -440 809 -450 815 -446 821 -456 403 -820 821 -420 819 -418 807 -456 811 -412 821 -454 807 -470 379 -850 823 -416 423 -824 409 -844 789 -450 815 -432 807 -446 409 -838 439 -822 811 -414 409 -844 419 -822 803 -442 413 -848 409 -844 815 -448 811 -424 421 -838 787 -450 411 -810 407 -864 811 -418 415 -866 803 -448 817 -418 419 -776 417 -15782 437 -396 427 -378 407 -410 415 -376 415 -410 419 -388 419 -390 419 -388 411 -382 417 -400 409 -398 423 -4008 821 -420 815 -422 815 -446 405 -830 813 -450 811 -452 379 -876 407 -828 419 -810 813 -458 377 -842 823 -454 783 -458 385 -876 789 -456 827 -432 811 -412 821 -420 435 -820 393 -862 421 -810 429 -852 809 -444 409 -836 421 -812 425 -820 393 -828 421 -846 821 -432 809 -446 821 -448 821 -422 393 -854 787 -454 801 -432 803 -446 803 -446 821 -446 793 -472 381 -840 835 -418 415 -838 399 -820 837 -414 835 -410 835 -418 437 -858 389 -846 817 -432 385 -840 421 -812 827 -432 415 -848 421 -816 809 -472 811 -418 393 -866 785 -450 381 -852 419 -820 807 -440 411 -874 801 -448 803 -426 407 -804 413 -15800 397 -394 435 -388 409 -388 411 -386 447 -382 417 -384 417 -386 419 -388 415 -390 417 -420 385 -420 385 -4032 805 -440 803 -446 801 -416 437 -826 811 -448 809 -454 409 -844 407 -828 419 -834 817 -432 385 -842 819 -418 845 -428 415 -846 787 -456 831 -430 805 -414 821 -454 401 -834 381 -840 409 -866 415 -834 801 -472 379 -842 407 -832 419 -842 387 -832 409 -842 823 -454 785 -462 809 -448 817 -418 419 -846 795 -436 809 -414 829 -428 811 -450 811 -456 809 -444 409 -840 819 -420 383 -852 419 -822 799 -442 807 -452 815 -448 419 -854 413 -814 809 -422 409 -838 421 -844 795 -434 415 -848 419 -818 807 -476 809 -420 393 -834 813 -450 383 -852 417 -824 805 -474 381 -850 821 -454 805 -432 379 -808 417 -119860 67 -134 67 -98 133 -764 65 -398 133 -132 665 -200 597 -64 461 -66 4203 -96 227 -98 655 -98 327 -66 819 -66 589 -132 5777 -66 1495 -328 231 -130 131 -66 463 -66 265 -68 131 -68 429 -66 195 -98 5117 -100 797 -100 299 -166 459 -100 1731 -66 1759 -66 563 -66 825 -98 1081 -68 5321 -232 1291 -134 1955 -100 523 -68 795 -66 767 -66 3589 -66 827 -66 267 -100 2395 -100 4745 -66 2343 -66 1057 -100 1363 -100 6775 -166 329 -66 593 -66 1719 -98 6079 -100 427 -66 523 -66 525 -98 RAW_Data: 1195 -66 1157 -68 333 -100 533 -66 4957 -134 731 -66 297 -66 97 -98 2989 -66 6633 -66 981 -98 983 -66 993 -98 2015 -132 65 -68 857 -232 723 -66 165 -66 1283 -100 853 -66 5575 -102 627 -98 367 -100 265 -66 853 -66 261 -66 195 -66 751 -66 195 -98 657 -132 953 -66 163 -296 429 -264 263 -66 1511 -98 263 -262 297 -68 263 -66 2523 -66 163 -132 295 -96 1447 -66 199 -66 463 -68 795 -66 1795 -100 701 -66 1333 -66 99 -66 131 -264 1293 -100 99 -66 299 -68 397 -66 399 -66 329 -100 595 -100 795 -66 131 -66 2015 -100 295 -98 2673 -130 1571 -66 753 -66 887 -98 723 -98 821 -100 131 -66 889 -66 793 -66 1057 -132 399 -100 397 -298 165 -66 299 -100 465 -100 233 -132 763 -66 1391 -130 2395 -66 895 -132 99 -134 2029 -166 799 -100 593 -98 195 -64 131 -66 1545 -66 785 -100 97 -98 131 -98 1753 -130 295 -66 619 -198 853 -166 233 -66 1393 -98 1783 -66 291 -132 691 -100 997 -66 133 -332 231 -66 131 -66 525 -66 263 -64 2435 -68 2967 -68 1101 -100 165 -68 599 -66 167 -134 235 -134 297 -68 497 -384 377 -448 377 -418 375 -454 377 -432 369 -424 377 -438 377 -436 377 -430 381 -434 359 -436 387 -4046 383 -852 797 -436 387 -870 385 -848 403 -850 809 -454 379 -876 415 -822 405 -852 381 -846 417 -822 801 -440 415 -846 415 -856 805 -446 383 -874 379 -834 405 -838 813 -460 783 -446 817 -444 793 -472 383 -880 381 -862 773 -442 411 -842 377 -858 413 -846 387 -870 775 -484 771 -480 805 -420 415 -848 795 -438 811 -414 817 -452 803 -470 777 -450 819 -450 417 -822 801 -442 385 -876 385 -848 795 -438 809 -452 819 -450 385 -882 375 -848 811 -422 413 -840 383 -846 823 -434 385 -874 381 -886 771 -476 811 -420 411 -840 809 -450 385 -850 413 -832 809 -444 383 -880 771 -486 803 -430 403 -806 383 -15810 425 -384 401 -420 393 -420 391 -386 421 -422 389 -386 423 -386 423 -388 419 -388 421 -388 421 -388 421 -4026 407 -840 813 -418 411 -842 397 -113844 97 -66 97 -164 99 -328 99 -232 299 -366 99 -1066 165 -66 623 -134 1197 -68 931 -66 599 -66 99 -234 2323 -132 1281 -66 495 -198 555 -414 383 -418 383 -418 417 -386 417 -418 383 -422 375 -422 379 -436 385 -444 351 -446 383 -416 385 -4076 379 -844 421 -812 395 -854 377 -862 813 -452 385 -840 815 -450 799 -488 383 -822 807 -446 803 -420 419 -842 403 -852 779 -450 407 -856 387 -880 805 -430 385 -840 809 -454 385 -856 377 -856 RAW_Data: 777 -484 783 -454 807 -476 807 -410 797 -454 773 -462 383 -872 789 -454 787 -454 383 -870 797 -474 407 -822 813 -446 775 -448 785 -456 785 -484 783 -452 385 -872 385 -882 777 -442 809 -444 375 -864 777 -450 385 -886 789 -452 783 -470 383 -884 391 -858 779 -448 383 -848 385 -852 411 -856 379 -848 419 -852 777 -504 783 -418 801 -448 375 -852 811 -446 777 -450 813 -448 801 -458 419 -810 783 -424 379 -16422 413 -400 399 -396 405 -426 375 -424 411 -390 411 -390 413 -420 383 -420 383 -418 383 -418 415 -418 385 -4062 419 -816 383 -850 383 -852 409 -856 781 -448 385 -852 805 -468 779 -480 383 -844 819 -420 815 -418 391 -860 387 -880 763 -462 383 -876 417 -852 813 -446 381 -848 769 -456 397 -858 363 -882 779 -450 811 -454 807 -480 777 -446 803 -452 779 -432 383 -874 771 -488 765 -456 383 -878 795 -488 385 -854 773 -448 785 -456 777 -484 783 -450 771 -478 377 -860 407 -880 809 -418 813 -416 391 -862 779 -450 385 -888 791 -452 781 -468 381 -876 409 -834 777 -452 383 -872 377 -856 385 -866 405 -854 355 -898 787 -488 765 -460 777 -446 383 -852 807 -432 809 -446 783 -458 817 -454 391 -822 799 -418 399 -16448 421 -388 381 -424 417 -390 377 -456 379 -406 385 -442 383 -416 385 -418 387 -418 387 -452 355 -450 357 -4096 383 -840 387 -846 389 -858 365 -882 785 -444 385 -886 793 -452 781 -470 415 -844 791 -452 779 -432 379 -872 377 -884 779 -448 383 -872 379 -896 799 -430 411 -834 789 -456 383 -838 421 -846 799 -428 807 -444 803 -480 803 -446 767 -472 777 -448 383 -852 791 -488 775 -466 381 -848 793 -486 389 -852 775 -448 803 -446 801 -454 779 -468 775 -448 389 -896 387 -878 775 -438 807 -448 367 -848 813 -444 385 -848 789 -490 767 -458 383 -912 363 -850 813 -444 381 -848 385 -850 409 -854 385 -870 387 -846 803 -464 811 -418 801 -446 375 -884 779 -444 779 -484 779 -446 797 -472 381 -850 773 -416 407 -16410 409 -422 369 -410 403 -410 409 -410 379 -412 411 -408 377 -442 377 -428 379 -440 347 -444 381 -416 381 -4076 411 -844 375 -848 383 -850 385 -884 757 -488 385 -856 775 -480 769 -478 409 -840 787 -448 777 -450 391 -860 387 -848 793 -458 383 -878 417 -852 813 -412 383 -874 787 -454 389 -844 393 -854 785 -482 781 -454 807 -480 777 -446 801 -452 779 -434 381 -876 801 -454 765 -460 381 -878 787 -488 411 -826 775 -446 801 -458 779 -450 809 -450 803 -444 379 -862 419 -878 777 -438 807 -446 367 -878 RAW_Data: 777 -446 383 -850 791 -486 783 -468 381 -882 393 -856 777 -446 383 -848 383 -854 411 -858 379 -848 419 -850 775 -506 783 -450 769 -446 377 -852 813 -446 777 -484 779 -448 795 -454 417 -824 777 -414 405 -122598 99 -134 65 -100 199 -832 99 -200 829 -98 163 -100 165 -66 197 -100 361 -98 723 -66 2987 -100 561 -460 1415 -100 527 -164 621 -98 459 -100 797 -66 497 -66 365 -132 401 -134 131 -66 699 -100 231 -66 327 -164 197 -66 299 -66 359 -66 395 -66 1773 -98 591 -66 295 -64 261 -98 833 -132 4215 -66 735 -98 331 -100 431 -66 761 -266 331 -102 497 -200 5637 -66 97 -198 921 -100 531 -66 299 -100 1559 -98 99 -100 233 -100 4173 -68 431 -66 599 -100 231 -66 429 -166 331 -132 431 -100 489 -66 359 -98 131 -66 261 -134 5083 -134 299 -100 1921 -68 197 -136 5299 -100 263 -64 721 -100 399 -130 429 -100 99 -98 1351 -100 295 -66 1315 -164 129 -98 393 -164 925 -66 663 -68 131 -66 229 -100 231 -100 99 -98 427 -66 325 -130 165 -98 197 -130 197 -128 327 -100 429 -66 1227 -100 893 -98 3491 -68 699 -66 365 -100 529 -98 229 -396 261 -66 561 -98 227 -98 329 -426 393 -130 363 -66 133 -166 1353 -100 393 -200 197 -100 199 -100 333 -66 961 -66 199 -66 197 -64 593 -66 627 -66 1317 -66 165 -198 199 -98 99 -66 3621 -98 597 -98 165 -66 4527 -200 263 -66 2751 -100 2131 -66 229 -64 721 -132 1261 -266 629 -98 201 -68 1323 -100 1689 -66 233 -326 1283 -66 261 -66 1381 -66 201 -100 4351 -66 331 -100 565 -134 2025 -66 563 -198 1657 -98 3057 -68 397 -98 297 -66 231 -100 931 -98 365 -66 1127 -66 165 -132 201 -100 99 -66 961 -100 99 -66 425 -66 1087 -166 463 -64 6307 -530 329 -66 297 -100 329 -66 201 -100 1123 -66 723 -98 523 -64 985 -66 131 -134 99 -66 4897 -66 1451 -132 199 -66 659 -66 195 -66 557 -66 263 -68 569 -100 661 -164 1975 -100 1361 -66 3647 -66 335 -100 363 -100 919 -66 887 -166 1775 -166 501 -66 495 -66 2753 -98 887 -66 3259 -66 821 -464 797 -134 567 -66 2401 -98 5415 -100 435 -100 99 -100 427 -66 599 -68 465 -132 435 -100 1495 -66 301 -68 233 -200 431 -66 397 -100 265 -68 231 -100 461 -234 199 -98 893 -132 265 -298 131 -166 2055 -68 199 -66 497 -66 1697 -66 1857 -66 5599 -66 2351 -66 131 -100 4929 -66 265 -134 561 -66 765 -132 861 -66 5351 -134 265 -102 99 -66 563 -66 267 -136 333 -98 233 -100 601 -66 365 -98 RAW_Data: 1023 -66 5413 -232 631 -134 8367 -66 1583 -196 1901 -98 129 -66 1381 -98 3681 -98 1583 -98 133 -100 263 -134 1731 -100 465 -66 629 -66 4609 -166 201 -132 1995 -66 333 -66 499 -100 723 -134 561 -66 5317 -66 333 -66 1135 -66 1193 -66 1227 -100 885 -132 163 -230 719 -100 2305 -66 1025 -166 397 -68 793 -100 1381 -132 5385 -66 623 -164 763 -98 357 -396 3739 -134 4665 -66 393 -130 1153 -98 687 -66 229 -100 961 -66 467 -66 1301 -66 3647 -98 363 -66 329 -68 1589 -100 261 -66 5647 -66 2039 -66 297 -164 523 -66 197 -100 933 -66 99 -164 67 -66 97 -64 197 -64 559 -132 1151 -64 229 -98 2249 -64 1151 -66 533 -134 299 -134 665 -98 559 -98 1253 -66 2687 -134 995 -132 233 -68 131 -68 467 -132 297 -66 233 -66 167 -66 165 -134 201 -98 165 -166 1421 -428 333 -480 327 -448 361 -462 367 -424 371 -452 377 -420 379 -420 411 -418 381 -422 379 -424 381 -4072 773 -450 393 -852 397 -858 777 -448 811 -458 779 -480 793 -458 809 -448 385 -854 789 -426 411 -844 391 -852 815 -450 801 -444 415 -848 407 -848 383 -850 799 -450 409 -854 773 -450 395 -862 419 -844 401 -852 809 -456 379 -838 417 -848 397 -822 805 -446 411 -840 419 -848 799 -470 811 -418 411 -840 385 -844 423 -838 381 -882 369 -882 777 -480 383 -856 395 -862 385 -842 819 -432 387 -840 419 -850 399 -854 381 -850 403 -884 811 -418 415 -822 417 -826 405 -850 811 -420 817 -446 801 -452 811 -472 381 -840 833 -410 807 -454 785 -458 803 -444 805 -448 801 -458 417 -844 795 -440 809 -382 417 -16778 459 -354 455 -386 385 -422 419 -388 411 -382 405 -420 397 -398 421 -408 387 -410 385 -414 415 -418 383 -4046 787 -424 413 -844 427 -818 817 -416 835 -428 811 -450 811 -458 803 -448 409 -838 785 -450 383 -840 417 -862 809 -442 811 -416 421 -872 385 -850 403 -820 809 -452 397 -828 815 -446 413 -840 409 -838 413 -872 807 -412 411 -848 407 -824 415 -844 783 -460 379 -876 385 -850 807 -474 809 -418 411 -838 419 -810 429 -818 423 -838 419 -846 797 -436 413 -878 381 -828 411 -848 811 -418 411 -840 419 -846 397 -852 387 -870 387 -850 803 -442 413 -844 407 -824 415 -848 781 -462 809 -412 837 -448 803 -458 419 -810 827 -434 811 -414 801 -454 815 -450 779 -458 803 -450 395 -860 809 -416 809 -424 379 -16828 405 -414 379 -412 413 -410 383 -406 423 -396 399 -392 433 -382 407 -412 413 -380 411 -414 409 -394 413 -4044 805 -422 393 -854 395 -826 813 -448 RAW_Data: 811 -456 811 -412 821 -486 775 -438 411 -844 801 -442 395 -838 413 -838 803 -448 801 -456 413 -840 407 -836 417 -834 805 -446 387 -848 801 -438 415 -844 407 -848 417 -848 819 -432 385 -844 419 -816 429 -826 809 -446 411 -838 419 -848 797 -468 805 -418 393 -866 385 -846 389 -854 409 -838 415 -838 799 -472 379 -886 367 -850 417 -846 781 -458 379 -842 419 -848 401 -854 381 -884 369 -884 783 -450 415 -820 407 -848 413 -814 809 -460 809 -444 805 -448 801 -460 417 -844 795 -434 811 -412 801 -450 809 -436 805 -448 805 -446 417 -864 809 -412 803 -416 409 -16802 423 -386 411 -382 405 -420 377 -122006 97 -98 165 -66 97 -132 65 -428 427 -132 3981 -66 265 -66 161 -66 327 -66 1625 -66 727 -100 4773 -134 863 -66 665 -66 2605 -98 4311 -98 99 -66 1249 -98 263 -100 5105 -68 461 -100 5065 -66 965 -68 799 -164 5737 -19106 327 -196 131 -362 131 -332 229 -134 363 -1162 297 -132 1197 -100 99 -132 231 -66 425 -200 267 -100 395 -134 331 -134 267 -100 563 -100 231 -66 655 -66 427 -66 299 -98 197 -132 3997 -66 463 -134 133 -134 1827 -132 1847 -66 131 -66 933 -100 3749 -132 131 -328 887 -98 457 -66 457 -100 593 -98 1813 -66 3895 -98 1117 -66 199 -66 881 -98 987 -66 397 -98 749 -66 195 -100 953 -100 819 -100 1017 -98 1915 -100 1707 -130 3865 -98 567 -132 265 -132 333 -66 1033 -132 791 -100 165 -100 1261 -66 531 -68 4337 -68 1191 -100 933 -100 767 -66 499 -164 363 -132 65 -100 5559 -66 233 -66 167 -68 265 -232 195 -100 329 -98 1795 -132 5043 -132 197 -66 223 -132 265 -200 525 -66 1147 -132 793 -100 4221 -132 703 -66 197 -132 595 -100 3891 -100 333 -100 1451 -164 261 -328 199 -166 1277 -1574 1699 -490 1705 -516 1663 -516 1695 -518 1699 -484 617 -1538 609 -1562 585 -1576 1693 -518 587 -1576 1701 -514 581 -1554 1737 -484 1737 -484 1711 -528 583 -1572 599 -1576 609 -1530 615 -1560 1719 -494 1739 -520 581 -1560 631 -1534 609 -16396 609 -1576 1707 -490 1713 -516 1697 -520 1699 -508 1711 -530 579 -1572 599 -1576 609 -1544 1707 -518 587 -1570 1731 -484 605 -1578 1699 -516 1729 -476 1753 -494 605 -1568 609 -1566 593 -1540 607 -1566 1733 -510 1705 -512 599 -1578 611 -1544 615 -16410 631 -1536 1711 -530 1703 -500 1731 -516 1737 -518 1741 -480 639 -1566 599 -1568 615 -1580 1743 -482 641 -1534 1751 -486 655 -1542 1735 -520 1735 -514 1745 -512 595 -1570 613 -1546 651 -1548 603 -1574 1767 -484 1745 -516 609 -1570 595 -1580 611 -16402 631 -1542 1733 -486 1747 -480 1773 -484 RAW_Data: 1729 -486 1783 -462 643 -1542 637 -1548 613 -1562 1743 -480 611 -1566 1747 -490 623 -1540 1747 -502 1739 -492 1759 -500 615 -1544 639 -1532 617 -1556 623 -1542 1777 -462 1771 -490 623 -1540 619 -1570 609 -16422 629 -1546 1747 -486 1739 -474 1737 -516 1713 -506 1751 -488 621 -1574 611 -1558 617 -1542 1729 -520 619 -1534 1735 -512 611 -1546 1743 -508 1727 -514 1729 -482 647 -1554 615 -1546 605 -1568 613 -1560 1713 -512 1737 -486 607 -1568 613 -1562 621 -16400 643 -1538 1715 -518 1709 -482 1725 -514 1723 -520 1711 -530 581 -1570 603 -1596 575 -1592 1693 -516 601 -1580 1703 -520 591 -1574 1737 -484 1741 -482 1761 -482 605 -1576 611 -1560 613 -1548 623 -1538 1739 -478 1715 -520 587 -1556 603 -1568 607 -16414 661 -1524 1743 -478 1727 -486 1727 -486 1747 -490 1731 -522 587 -1558 623 -1546 623 -1574 1737 -484 597 -1566 1739 -480 635 -1560 1745 -464 1745 -516 1729 -504 619 -1546 623 -1546 623 -1574 609 -1560 1743 -486 1747 -480 639 -1572 337 -80934 65 -702 65 -960 165 -132 333 -100 1031 -134 163 -100 199 -398 2413 -66 853 -96 3999 -66 1027 -68 495 -66 431 -98 197 -134 65 -100 431 -68 663 -596 197 -132 525 -100 425 -100 397 -100 429 -100 263 -166 4697 -132 291 -228 459 -64 957 -66 233 -66 723 -364 5193 -198 759 -66 359 -98 231 -98 425 -66 265 -98 457 -66 3309 -198 863 -66 263 -166 393 -66 1025 -166 331 -134 463 -102 4119 -66 331 -66 465 -66 395 -66 267 -100 365 -136 97 -100 333 -134 363 -100 265 -100 799 -66 463 -132 1917 -100 2273 -132 99 -66 2537 -98 97 -100 195 -66 657 -98 1145 -66 359 -66 423 -98 227 -66 5391 -66 4069 -100 795 -130 455 -66 3877 -100 165 -98 365 -198 2085 -66 1059 -66 333 -66 7359 -102 431 -66 1349 -100 131 -66 459 -66 327 -66 4189 -98 533 -100 563 -66 365 -66 465 -66 863 -66 493 -66 1317 -66 3459 -98 99 -66 1153 -130 1875 -166 867 -232 5309 -132 363 -66 301 -66 1333 -166 1525 -66 865 -166 5313 -98 295 -98 363 -98 197 -98 229 -64 557 -100 97 -164 199 -66 99 -66 291 -66 393 -98 163 -326 327 -100 529 -134 467 -68 165 -66 201 -66 6277 -66 229 -64 361 -66 227 -66 1215 -66 525 -66 131 -66 1053 -66 1147 -66 1463 -100 565 -402 1127 -66 1329 -98 331 -66 97 -68 461 -66 265 -68 65 -66 1197 -66 831 -66 761 -66 233 -66 4805 -66 395 -68 297 -100 827 -198 625 -100 399 -66 1191 -68 429 -100 629 -66 499 -66 195 -100 2485 -66 655 -100 4745 -68 297 -66 1965 -134 4807 -68 99 -134 627 -66 233 -132 499 -66 RAW_Data: 5047 -98 165 -102 167 -66 533 -66 133 -100 1359 -166 493 -100 2385 -100 3759 -66 635 -132 331 -100 2115 -100 431 -66 5673 -66 631 -66 231 -100 1589 -100 9979 -100 2797 -394 327 -66 687 -66 899 -100 5425 -134 461 -100 623 -132 5885 -68 399 -100 165 -98 165 -100 1761 -230 697 -66 227 -98 919 -66 1921 -134 1099 -66 331 -66 333 -166 531 -100 793 -66 129 -164 197 -66 131 -98 887 -100 131 -198 295 -66 197 -68 761 -68 827 -100 297 -100 1585 -100 1083 -66 199 -66 1553 -68 433 -100 631 -232 165 -66 297 -234 431 -66 2297 -100 233 -66 565 -230 129 -196 4915 -66 297 -66 529 -134 365 -132 433 -66 297 -166 359 -66 695 -68 1259 -130 689 -66 1645 -98 525 -100 791 -66 295 -66 1413 -64 165 -68 261 -100 1627 -134 1677 -66 357 -66 633 -132 197 -132 1061 -100 5353 -66 233 -100 897 -66 395 -66 459 -66 129 -100 897 -134 4679 -66 857 -130 1841 -66 1023 -134 5191 -98 361 -98 527 -66 1021 -98 591 -66 493 -66 955 -100 231 -98 295 -364 99 -66 4471 -66 99 -132 1193 -66 563 -66 267 -68 661 -66 1261 -134 827 -98 4705 -66 1643 -132 2273 -166 263 -66 459 -100 3483 -66 565 -100 2155 -130 195 -100 1695 -100 529 -100 1053 -202 133 -100 885 -98 297 -98 853 -68 531 -66 263 -100 4855 -66 331 -66 563 -64 391 -164 333 -68 97 -132 1789 -132 165 -132 267 -66 1191 -66 727 -100 197 -66 601 -98 231 -100 331 -200 465 -66 863 -66 97 -98 361 -66 231 -100 959 -66 525 -66 167 -98 531 -100 4877 -100 829 -66 331 -66 363 -66 589 -64 227 -98 393 -132 99 -98 197 -132 197 -100 763 -100 399 -100 627 -98 301 -66 1595 -1492 511 -1044 513 -1040 507 -1042 1005 -558 1007 -554 1005 -574 1007 -548 1005 -546 1003 -542 477 -1072 1007 -516 1013 -556 1009 -552 513 -1076 975 -550 1009 -554 1013 -524 1017 -552 487 -1042 999 -580 993 -584 493 -1050 985 -580 977 -576 483 -1044 515 -1044 1007 -516 1005 -586 1011 -550 481 -1072 1013 -548 1013 -548 975 -552 515 -1042 475 -1050 1017 -574 491 -1084 983 -570 475 -1056 525 -1048 979 -546 515 -1042 479 -1040 1003 -584 515 -1040 515 -1044 513 -1046 515 -1042 1009 -548 1007 -516 509 -1040 1003 -524 1513 -19022 1537 -1536 477 -1048 507 -1032 509 -1046 1001 -570 1013 -572 979 -580 483 -1064 499 -1052 981 -546 513 -1044 1009 -518 1009 -586 1009 -548 513 -1040 1011 -548 1009 -546 1009 -546 1005 -516 511 -1044 977 -620 981 -570 495 -1050 1013 -534 999 -550 525 -1048 485 -1044 1009 -514 1003 -586 1009 -546 515 -1074 979 -546 RAW_Data: 1009 -542 1009 -546 513 -1040 479 -1040 1003 -586 513 -1040 1007 -576 483 -1074 483 -1044 1011 -548 479 -1044 511 -1042 1003 -588 477 -1076 479 -1074 513 -1040 513 -1040 1009 -548 1007 -516 509 -1040 1003 -522 1527 -18990 1541 -1550 481 -1042 509 -1048 481 -1046 1001 -588 1017 -554 985 -572 477 -1060 1023 -548 981 -544 515 -1040 1011 -514 1003 -586 1007 -548 513 -1042 1007 -576 981 -546 1013 -548 1007 -516 509 -1042 1005 -574 1005 -576 481 -1076 981 -578 977 -546 513 -1044 513 -1040 1005 -518 1007 -590 971 -584 479 -1074 1011 -548 1007 -548 1005 -516 511 -1040 509 -1044 975 -588 519 -1052 1003 -552 501 -1046 513 -1062 993 -548 485 -1042 515 -1040 1003 -574 485 -1076 485 -1076 485 -1076 483 -1042 1009 -548 1009 -516 509 -1040 1003 -520 1527 -19010 1537 -1524 481 -1076 481 -1046 511 -1044 1013 -554 1013 -552 519 -1044 1005 -556 497 -1050 983 -578 483 -1042 1011 -516 1009 -586 1009 -550 513 -115324 65 -2458 65 -66 231 -896 231 -68 131 -434 1191 -66 399 -66 295 -100 627 -132 561 -66 755 -100 593 -100 1155 -98 163 -66 3687 -100 793 -98 229 -98 425 -100 623 -98 393 -132 131 -132 393 -66 395 -66 259 -132 259 -132 99 -100 463 -166 5379 -132 631 -66 1131 -66 819 -164 1115 -66 1525 -66 3617 -98 297 -98 65 -66 497 -68 199 -100 267 -166 593 -66 787 -132 197 -68 5473 -68 527 -164 329 -66 229 -64 195 -230 359 -100 263 -66 391 -98 821 -66 165 -66 2935 -100 65 -68 1057 -66 267 -68 561 -98 559 -98 329 -166 367 -100 1925 -134 999 -66 399 -98 529 -66 299 -134 299 -164 4801 -132 299 -98 595 -66 265 -68 1259 -98 327 -132 755 -198 4311 -130 721 -68 1259 -200 399 -302 495 -100 1259 -66 665 -66 331 -66 531 -66 3979 -134 461 -66 1313 -66 325 -66 753 -68 329 -98 427 -66 5079 -66 299 -134 527 -68 165 -100 333 -100 1091 -66 195 -164 195 -66 4411 -66 199 -100 1695 -66 567 -66 435 -234 1415 -98 325 -98 97 -98 329 -66 165 -268 131 -164 1905 -132 1123 -68 263 -166 199 -234 533 -134 491 -98 293 -66 989 -98 4053 -134 299 -166 499 -98 893 -66 463 -134 5411 -66 4201 -100 4949 -66 533 -166 1327 -66 131 -100 1717 -100 2787 -166 471 -66 1051 -98 1183 -66 2895 -68 2289 -66 797 -66 295 -68 627 -200 697 -100 163 -66 5101 -100 1791 -66 965 -134 7887 -66 265 -100 99 -134 1891 -100 559 -66 661 -98 167 -68 465 -68 1851 -164 4741 -98 397 -66 261 -98 955 -198 567 -98 233 -132 699 -100 465 -66 265 -164 331 -66 131 -98 765 -100 461 -98 1125 -64 RAW_Data: 3701 -100 1033 -66 197 -68 4443 -68 595 -134 565 -66 499 -66 199 -134 5461 -66 645 -344 635 -326 677 -648 345 -312 697 -310 669 -350 667 -348 667 -634 345 -312 669 -650 373 -636 323 -348 635 -23014 363 -320 669 -322 641 -650 373 -312 667 -350 667 -346 667 -332 681 -642 351 -312 667 -640 319 -666 347 -318 645 -23022 349 -326 641 -352 659 -656 335 -350 661 -334 651 -354 657 -330 703 -658 329 -316 655 -646 349 -668 341 -318 625 -23038 323 -348 653 -322 663 -654 335 -354 661 -336 653 -322 685 -330 701 -652 321 -346 637 -648 351 -658 333 -354 623 -23022 319 -336 677 -320 661 -654 335 -354 661 -336 679 -322 687 -296 703 -656 331 -318 667 -652 353 -620 375 -318 625 -23036 321 -346 655 -322 661 -652 371 -320 659 -338 677 -322 691 -296 705 -654 333 -350 635 -634 345 -672 353 -300 635 -23040 349 -314 667 -314 665 -642 349 -352 645 -354 651 -344 693 -318 693 -644 345 -300 679 -626 361 -648 323 -354 651 -22990 345 -338 661 -346 653 -652 325 -350 647 -322 681 -350 673 -346 653 -654 321 -354 645 -646 349 -656 351 -340 609 -23046 321 -344 637 -328 679 -648 345 -314 697 -316 667 -348 669 -338 677 -646 351 -316 655 -646 343 -658 351 -314 655 -23016 333 -352 627 -328 681 -646 345 -350 655 -346 655 -322 691 -320 675 -652 337 -350 637 -666 315 -672 351 -300 669 -22998 349 -318 655 -340 653 -646 349 -348 667 -314 667 -352 669 -338 679 -646 351 -316 655 -646 345 -658 351 -314 653 -23020 335 -318 659 -322 665 -672 345 -316 659 -342 671 -330 677 -324 683 -650 341 -354 631 -656 349 -654 345 -352 621 -23002 329 -352 667 -322 641 -684 343 -316 659 -340 677 -322 695 -326 675 -654 333 -354 623 -648 353 -658 331 -354 629 -123230 99 -66 197 -568 97 -594 65 -100 229 -130 589 -134 5281 -66 99 -98 2761 -66 1385 -132 299 -66 4967 -230 1991 -200 627 -66 1515 -232 5531 -132 1693 -98 995 -66 465 -100 399 -66 893 -66 4501 -66 363 -66 197 -66 1989 -66 1727 -198 99 -66 499 -100 427 -98 1649 -132 165 -164 97 -98 295 -132 325 -98 131 -66 295 -66 657 -64 625 -66 295 -130 1515 -68 231 -66 455 -64 521 -66 559 -66 1977 -98 167 -166 335 -66 493 -66 233 -68 335 -66 199 -266 165 -134 167 -68 431 -100 425 -98 163 -98 197 -66 359 -98 691 -98 229 -66 689 -66 195 -66 785 -66 163 -230 231 -196 259 -66 425 -98 265 -102 597 -100 199 -100 231 -100 231 -68 565 -66 133 -166 165 -100 229 -66 629 -134 65 -132 RAW_Data: 231 -68 2745 -66 4279 -132 1093 -200 663 -98 2791 -66 299 -66 4055 -64 691 -66 529 -66 165 -68 865 -66 629 -66 133 -100 597 -266 297 -68 4367 -66 261 -130 519 -68 1265 -66 2189 -66 1423 -66 131 -66 4185 -66 165 -100 333 -132 1125 -66 363 -66 701 -66 1523 -534 3887 -66 1941 -100 293 -66 327 -164 131 -98 589 -98 133 -66 129 -66 429 -98 1415 -132 1021 -130 555 -100 1791 -134 299 -66 165 -66 331 -100 927 -298 231 -66 97 -68 1025 -66 297 -66 199 -68 699 -66 97 -66 97 -66 261 -166 393 -98 129 -98 161 -100 425 -100 1873 -66 759 -66 799 -100 427 -66 299 -66 1031 -134 267 -100 2349 -68 2659 -100 2097 -132 629 -100 1129 -166 231 -66 231 -66 1719 -132 427 -200 5213 -66 1399 -66 3055 -132 7835 -66 1327 -66 4625 -66 359 -66 2607 -420 373 -452 345 -452 347 -454 379 -422 377 -450 349 -466 359 -434 359 -436 389 -442 353 -444 385 -4052 781 -448 797 -436 379 -872 803 -430 807 -448 813 -458 779 -478 803 -450 805 -430 801 -446 381 -848 815 -444 789 -472 381 -846 819 -454 803 -434 413 -840 375 -858 409 -838 387 -852 395 -864 815 -450 385 -854 391 -870 383 -846 389 -852 395 -860 383 -844 393 -886 781 -448 415 -858 411 -816 417 -820 405 -850 411 -848 779 -458 805 -446 805 -450 803 -458 415 -846 793 -434 387 -840 417 -848 791 -436 809 -448 805 -450 409 -860 383 -848 825 -434 387 -840 417 -846 793 -434 385 -874 383 -888 375 -882 779 -458 807 -416 803 -456 381 -842 821 -434 813 -450 413 -836 809 -444 811 -426 395 -828 409 -17022 421 -414 417 -382 417 -384 417 -386 417 -418 385 -420 409 -398 395 -398 391 -440 387 -408 387 -412 415 -4026 819 -420 793 -430 421 -838 811 -454 781 -462 813 -446 787 -488 777 -440 809 -450 793 -426 411 -844 817 -430 809 -448 397 -862 817 -452 783 -462 385 -838 419 -812 427 -820 393 -866 421 -810 823 -436 413 -842 409 -866 385 -844 389 -854 397 -826 419 -846 387 -854 813 -440 409 -848 419 -844 389 -856 399 -822 417 -844 783 -460 803 -446 801 -448 801 -454 417 -846 799 -438 385 -842 421 -846 793 -436 809 -448 821 -418 419 -848 407 -848 811 -420 409 -840 421 -810 823 -436 383 -874 407 -858 387 -844 821 -438 807 -414 835 -418 417 -844 797 -436 809 -450 395 -864 811 -452 785 -428 423 -804 415 -17028 413 -430 363 -450 339 -448 375 -450 343 -450 375 -452 371 -420 381 -432 351 -470 349 -442 381 -410 383 -4072 773 -446 805 -426 411 -844 787 -464 811 -448 RAW_Data: 793 -456 813 -450 789 -460 805 -416 803 -456 381 -844 825 -434 811 -448 415 -834 811 -446 813 -458 357 -870 383 -846 391 -852 395 -862 383 -872 793 -468 379 -874 397 -860 383 -844 387 -854 365 -856 415 -848 387 -854 819 -450 383 -886 375 -850 383 -850 417 -826 403 -852 777 -450 805 -446 805 -454 817 -450 395 -850 819 -418 415 -848 397 -850 779 -448 805 -458 777 -482 387 -850 393 -864 809 -450 385 -854 379 -862 773 -474 383 -846 415 -858 377 -882 785 -458 805 -414 803 -456 381 -844 821 -434 809 -448 379 -868 815 -452 789 -432 391 -832 413 -17034 411 -398 427 -380 407 -412 413 -378 413 -412 411 -382 417 -396 417 -396 409 -414 379 -436 387 -410 385 -4044 819 -420 789 -426 411 -840 809 -456 821 -430 809 -448 821 -418 831 -430 805 -450 811 -414 409 -838 811 -454 783 -456 409 -848 819 -448 791 -440 415 -814 421 -814 431 -824 413 -850 385 -850 805 -474 379 -850 419 -828 411 -848 381 -850 417 -822 405 -852 381 -850 823 -452 409 -856 381 -840 417 -830 407 -852 379 -850 821 -422 827 -432 807 -448 821 -418 419 -850 803 -438 409 -810 407 -854 811 -448 809 -418 815 -446 419 -858 417 -814 811 -422 409 -838 421 -812 827 -434 415 -848 419 -816 411 -848 813 -456 805 -412 833 -418 413 -822 807 -452 817 -418 419 -850 803 -472 809 -420 397 -794 411 -17034 429 -394 435 -388 409 -386 411 -416 415 -384 415 -386 417 -386 417 -420 385 -420 383 -422 385 -422 417 -4022 805 -414 807 -448 407 -838 785 -454 809 -456 811 -412 833 -448 801 -454 809 -420 815 -420 409 -838 821 -420 813 -458 387 -876 787 -454 827 -432 385 -840 421 -814 429 -820 421 -836 421 -844 795 -436 409 -874 377 -866 383 -836 425 -824 409 -844 407 -822 415 -836 821 -434 409 -874 377 -866 387 -844 389 -854 397 -824 813 -450 813 -452 811 -412 831 -442 407 -864 783 -450 381 -840 419 -822 805 -442 809 -450 817 -448 419 -850 413 -814 813 -422 409 -840 419 -812 823 -434 415 -846 419 -818 409 -848 811 -458 805 -414 831 -416 415 -820 807 -450 801 -446 409 -864 819 -452 783 -428 393 -834 413 -17032 409 -432 363 -424 369 -448 375 -448 343 -450 375 -450 339 -454 375 -434 377 -432 351 -464 357 -436 389 -4050 773 -444 785 -466 385 -874 771 -452 793 -464 811 -446 803 -448 803 -454 809 -418 813 -422 411 -838 817 -448 781 -462 411 -846 797 -486 777 -438 415 -842 383 -850 403 -852 379 -848 405 -848 811 -448 415 -856 395 -856 387 -846 385 -834 391 -868 RAW_Data: 387 -844 429 -852 781 -446 409 -862 419 -844 399 -824 385 -838 409 -854 811 -444 779 -452 815 -448 801 -472 385 -842 825 -434 387 -838 421 -812 827 -432 805 -450 819 -420 415 -850 411 -850 811 -422 393 -864 387 -846 787 -462 385 -876 385 -848 407 -848 811 -458 803 -414 831 -416 413 -852 773 -448 803 -446 405 -882 387 -113196 99 -362 163 -66 65 -1810 97 -66 165 -196 129 -98 523 -98 1525 -100 1095 -100 725 -66 6021 -66 261 -64 195 -98 293 -130 1745 -98 99 -132 397 -98 363 -98 199 -98 5181 -166 299 -66 429 -66 367 -66 431 -100 629 -134 1297 -98 229 -66 163 -100 4973 -132 995 -66 165 -98 395 -66 297 -66 1711 -200 5349 -100 1493 -232 663 -198 1721 -66 301 -100 5563 -66 1151 -66 331 -66 227 -66 97 -98 163 -100 65 -98 1975 -66 361 -66 97 -230 525 -66 657 -66 863 -66 4121 -230 231 -66 401 -132 129 -98 259 -98 263 -66 955 -100 327 -132 5011 -170 299 -64 763 -66 435 -100 297 -66 401 -132 827 -200 2287 -64 8629 -100 897 -66 1689 -100 2345 -132 97 -100 1155 -68 1915 -396 787 -66 1021 -130 1057 -100 267 -132 829 -100 4749 -68 599 -66 397 -100 329 -64 163 -296 99 -132 329 -66 4881 -66 2091 -66 165 -66 231 -98 359 -100 663 -98 297 -66 5775 -100 233 -98 699 -98 131 -66 361 -100 297 -66 331 -66 1017 -98 233 -66 231 -132 197 -98 1721 -130 523 -66 197 -98 953 -164 231 -164 231 -98 795 -100 1155 -66 753 -166 825 -66 4525 -98 955 -298 625 -66 885 -66 4759 -100 367 -66 495 -66 597 -100 465 -66 265 -100 601 -98 467 -230 463 -66 4177 -66 495 -66 693 -100 831 -66 431 -68 363 -132 295 -98 131 -166 265 -66 331 -100 3189 -66 395 -298 625 -64 327 -362 631 -66 333 -100 3927 -98 1743 -66 295 -100 197 -68 793 -66 891 -132 65 -100 5247 -132 427 -66 199 -66 263 -68 629 -68 297 -100 1345 -98 263 -66 693 -130 591 -68 263 -100 299 -66 399 -68 565 -200 231 -102 231 -100 497 -68 2259 -236 297 -66 663 -100 493 -98 133 -66 597 -132 265 -166 2459 -66 1857 -134 627 -100 827 -320 705 -354 695 -354 693 -354 721 -320 727 -322 733 -678 377 -358 677 -356 705 -644 381 -672 381 -348 691 -676 383 -672 415 -640 419 -324 697 -680 383 -650 381 -654 407 -658 365 -664 395 -382 685 -350 719 -350 653 -16570 709 -380 651 -384 687 -352 691 -346 701 -336 709 -362 715 -654 409 -352 681 -354 669 -678 383 -648 417 -326 711 -646 417 -648 413 -648 415 -326 711 -642 RAW_Data: 383 -684 377 -656 367 -684 387 -672 385 -350 685 -384 685 -386 651 -16538 737 -332 705 -334 705 -332 705 -362 707 -320 719 -354 723 -646 417 -324 697 -354 693 -678 385 -652 379 -344 691 -698 361 -686 385 -654 417 -350 685 -652 385 -674 355 -700 357 -664 391 -664 393 -364 685 -364 709 -360 677 -16510 773 -310 695 -354 709 -320 733 -320 727 -322 729 -322 733 -680 387 -326 699 -352 693 -678 385 -648 381 -330 739 -648 415 -648 413 -650 413 -328 675 -682 379 -656 371 -688 353 -686 381 -652 413 -352 689 -386 693 -348 669 -16546 733 -348 697 -344 701 -346 699 -352 685 -354 721 -354 695 -644 423 -340 699 -332 711 -650 383 -652 419 -324 721 -642 419 -646 385 -680 387 -356 687 -646 387 -682 379 -656 401 -654 385 -654 383 -352 717 -352 723 -352 659 -16524 759 -324 697 -374 675 -358 679 -356 709 -352 703 -354 703 -680 375 -358 677 -354 709 -644 385 -680 385 -326 713 -680 385 -650 415 -648 415 -326 713 -648 383 -656 405 -654 385 -654 383 -652 413 -350 689 -386 693 -348 687 -16514 759 -322 699 -348 699 -336 721 -322 709 -354 707 -354 707 -680 385 -326 703 -354 691 -680 383 -638 417 -328 709 -646 419 -650 415 -648 413 -328 675 -682 381 -654 369 -688 385 -656 381 -684 381 -350 721 -354 695 -348 689 -16510 763 -322 697 -350 703 -350 701 -348 703 -350 701 -350 701 -678 379 -350 685 -350 697 -666 379 -662 395 -326 719 -654 417 -656 385 -650 409 -358 677 -680 377 -646 379 -686 367 -680 379 -662 395 -362 687 -364 709 -358 649 -16538 763 -324 699 -348 701 -346 687 -362 711 -322 707 -356 705 -682 377 -358 685 -354 707 -644 385 -682 385 -328 711 -648 417 -648 415 -648 415 -328 679 -684 379 -656 371 -686 353 -684 383 -684 381 -350 689 -386 687 -372 653 -16534 757 -328 689 -320 737 -320 729 -320 731 -320 729 -320 731 -644 407 -360 711 -320 707 -644 387 -650 419 -326 709 -644 423 -646 417 -648 415 -326 711 -646 383 -652 407 -656 387 -656 381 -654 413 -352 689 -352 723 -338 689 -16532 729 -328 711 -354 703 -320 695 -352 727 -322 727 -322 733 -678 375 -358 685 -354 671 -678 385 -648 417 -328 709 -646 417 -648 415 -650 413 -328 679 -684 379 -656 371 -664 393 -652 387 -684 383 -350 723 -350 695 -348 665 -16554 763 -308 713 -322 713 -322 731 -320 729 -322 727 -320 735 -678 387 -326 701 -356 689 -678 385 -650 381 -346 725 -652 387 -654 415 -644 415 -354 685 -654 383 -674 355 -662 391 -662 391 -664 395 -364 687 -362 RAW_Data: 713 -326 679 -123960 161 -132 263 -624 263 -66 327 -162 131 -1094 131 -98 723 -66 621 -66 459 -66 229 -66 329 -66 591 -66 881 -66 3747 -66 1783 -66 3219 -68 263 -100 695 -66 165 -66 99 -66 1193 -98 531 -234 263 -68 7149 -66 461 -100 3253 -66 595 -134 561 -66 325 -66 685 -66 199 -98 359 -130 99 -98 787 -100 925 -100 5157 -66 591 -98 233 -100 827 -66 1345 -66 10323 -200 3355 -100 367 -100 965 -98 495 -98 233 -102 1923 -66 6641 -68 263 -68 299 -100 705 -198 827 -100 529 -68 625 -66 493 -66 3641 -98 897 -68 333 -100 6513 -68 825 -66 597 -132 231 -100 659 -100 1099 -102 963 -98 831 -68 261 -68 299 -134 4477 -66 561 -66 927 -98 393 -66 1871 -166 327 -132 229 -100 63 -66 561 -1216 479 -414 205 -636 517 -358 235 -642 243 -612 237 -628 227 -614 237 -682 241 -604 269 -628 525 -336 513 -348 537 -346 245 -600 513 -326 265 -644 279 -606 273 -596 257 -620 281 -556 281 -594 553 -314 283 -572 549 -324 299 -586 317 -550 567 -310 319 -558 555 -300 315 -554 281 -572 571 -324 557 -312 279 -598 289 -578 313 -552 577 -320 533 -312 559 -290 573 -342 285 -580 525 -350 279 -594 547 -318 283 -578 559 -310 269 -568 567 -346 281 -578 311 -564 545 -328 545 -350 513 -318 561 -316 283 -572 253 -628 579 -316 541 -318 279 -602 289 -574 313 -552 283 -560 555 -320 531 -288 1123 -1164 537 -332 279 -576 581 -320 283 -578 277 -568 287 -568 305 -550 315 -590 315 -564 275 -600 545 -328 543 -314 559 -320 285 -546 561 -310 285 -628 263 -608 283 -584 281 -600 269 -596 291 -558 549 -314 287 -554 577 -350 281 -598 257 -582 581 -320 283 -582 527 -344 269 -566 303 -548 579 -318 593 -314 283 -564 291 -578 313 -558 545 -318 571 -314 525 -292 569 -336 319 -562 569 -312 283 -596 549 -300 317 -556 553 -320 275 -566 543 -362 281 -594 281 -580 555 -324 541 -340 549 -318 543 -320 283 -540 309 -596 555 -338 549 -318 281 -580 311 -562 291 -578 275 -586 547 -320 511 -318 1099 -1150 557 -336 283 -594 539 -318 317 -534 291 -606 273 -552 317 -556 283 -604 287 -600 277 -586 547 -348 533 -320 541 -340 285 -542 565 -302 277 -632 283 -572 287 -594 303 -576 283 -594 283 -544 565 -310 285 -562 547 -362 283 -594 279 -580 551 -322 285 -604 553 -318 285 -548 281 -602 527 -346 557 -326 277 -588 283 -596 281 -578 553 -294 571 -302 551 -314 549 -352 279 -602 545 -324 275 -590 545 -318 319 -540 555 -324 279 -560 RAW_Data: 545 -350 317 -574 273 -594 557 -302 549 -352 521 -318 567 -294 277 -582 275 -624 537 -340 565 -290 301 -582 319 -566 285 -568 299 -544 547 -316 549 -318 1103 -1150 543 -326 275 -586 547 -352 281 -574 309 -562 257 -588 275 -590 283 -592 317 -574 271 -594 557 -336 549 -318 543 -318 283 -574 547 -290 283 -634 283 -584 277 -600 257 -604 311 -556 317 -560 541 -320 283 -538 583 -320 297 -582 317 -564 567 -314 283 -562 581 -298 313 -548 283 -572 539 -354 555 -346 245 -598 289 -580 313 -552 575 -316 535 -292 569 -304 547 -348 279 -602 555 -326 279 -594 551 -320 283 -546 565 -310 285 -562 547 -364 283 -594 281 -600 525 -344 557 -290 565 -314 555 -320 287 -562 283 -580 585 -322 555 -310 283 -588 317 -538 309 -564 289 -576 543 -312 549 -320 1071 -1150 579 -290 301 -584 545 -352 283 -574 273 -566 291 -582 277 -588 283 -592 279 -610 273 -596 557 -300 549 -352 533 -316 279 -580 543 -312 285 -596 315 -568 307 -564 291 -580 313 -556 283 -584 537 -316 283 -570 545 -356 307 -590 283 -562 565 -346 247 -594 553 -302 279 -590 283 -570 541 -356 557 -310 279 -600 289 -576 313 -554 545 -316 565 -288 569 -302 547 -348 279 -598 557 -334 283 -572 541 -322 283 -600 547 -320 245 -598 543 -328 313 -574 285 -596 533 -342 549 -316 535 -332 531 -330 273 -586 281 -606 541 -322 565 -312 279 -600 289 -576 275 -588 281 -572 571 -290 543 -304 1117 -1144 557 -326 281 -592 547 -320 281 -580 311 -564 257 -602 275 -586 283 -590 315 -572 273 -594 555 -336 549 -318 523 -320 283 -578 557 -294 277 -618 317 -560 315 -568 273 -602 257 -604 277 -590 547 -318 285 -564 537 -350 317 -560 293 -598 551 -320 283 -564 565 -312 283 -562 291 -580 543 -348 555 -318 283 -602 257 -604 275 -590 545 -318 537 -348 527 -292 569 -336 319 -560 535 -348 283 -596 551 -298 313 -556 545 -318 277 -564 579 -330 283 -594 279 -600 523 -344 561 -290 567 -312 549 -318 283 -566 279 -600 549 -324 585 -308 285 -588 281 -600 277 -572 273 -594 551 -298 543 -312 1077 -1150 585 -290 289 -606 547 -316 319 -540 309 -566 289 -576 275 -586 281 -622 277 -570 291 -602 543 -314 547 -318 569 -312 283 -564 545 -328 273 -618 283 -578 309 -562 291 -580 313 -556 283 -586 537 -314 283 -570 577 -320 311 -588 283 -598 527 -346 269 -564 573 -312 285 -554 317 -564 539 -352 553 -322 291 -578 283 -594 281 -566 563 -302 563 -292 569 -312 549 -348 281 -598 529 -340 283 -570 RAW_Data: 573 -290 285 -604 549 -318 245 -598 545 -358 281 -572 287 -596 567 -310 547 -320 535 -316 561 -294 277 -586 277 -624 557 -316 561 -326 281 -558 171 -112742 297 -66 231 -100 133 -98 131 -66 231 -66 65 -330 231 -790 165 -400 99 -434 459 -66 233 -132 1581 -98 163 -66 1049 -132 1849 -100 1855 -98 5435 -100 301 -68 761 -66 3115 -100 231 -68 2421 -68 765 -66 167 -68 233 -134 997 -66 233 -66 1061 -66 833 -98 565 -66 369 -102 131 -100 5197 -132 853 -232 825 -100 265 -100 765 -100 631 -66 827 -66 1749 -66 265 -136 165 -66 399 -100 3821 -98 793 -66 599 -100 231 -68 635 -68 197 -134 5091 -132 299 -68 1327 -100 757 -98 629 -66 601 -66 2887 -100 1167 -98 1879 -66 131 -98 295 -162 7033 -66 655 -68 1025 -100 261 -66 295 -66 195 -132 65 -66 9407 -100 4337 -68 795 -100 361 -132 99 -66 4915 -198 819 -100 327 -64 1611 -132 429 -100 331 -66 4037 -68 729 -66 827 -398 2751 -66 295 -66 4365 -98 1187 -66 389 -100 231 -166 1945 -66 431 -450 587 -458 587 -458 587 -458 587 -458 625 -424 623 -748 309 -424 627 -392 657 -716 343 -720 307 -408 657 -694 365 -692 365 -694 363 -410 653 -382 651 -382 651 -716 321 -704 355 -702 357 -370 717 -368 673 -364 675 -16544 735 -352 673 -362 677 -356 709 -320 733 -320 733 -352 703 -680 385 -358 669 -354 693 -678 381 -638 417 -328 709 -646 417 -646 417 -648 413 -326 713 -326 713 -326 713 -648 415 -650 379 -652 409 -346 723 -346 721 -346 653 -16532 777 -296 703 -360 709 -326 709 -348 689 -352 727 -320 731 -678 385 -326 701 -354 691 -678 385 -650 381 -346 725 -652 385 -656 415 -656 381 -386 685 -352 689 -330 711 -650 385 -652 419 -648 385 -328 751 -320 727 -352 671 -16536 757 -318 709 -320 731 -322 695 -352 725 -322 727 -322 731 -678 381 -348 705 -320 697 -676 383 -670 381 -346 687 -678 385 -680 383 -682 385 -326 717 -324 717 -326 711 -672 385 -650 415 -650 379 -330 737 -324 749 -320 699 -16538 747 -328 681 -354 705 -320 733 -320 729 -320 729 -354 703 -678 377 -358 677 -356 703 -642 385 -680 385 -328 711 -680 385 -650 417 -646 417 -326 713 -326 711 -326 713 -646 417 -650 379 -652 411 -344 725 -346 723 -346 653 -16538 707 -404 657 -376 653 -380 687 -382 655 -382 691 -380 679 -668 395 -366 671 -360 675 -682 381 -650 383 -358 687 -680 383 -682 383 -682 385 -326 715 -326 713 -326 715 -682 385 -650 379 -654 409 -346 723 -346 723 -348 651 -16540 743 -324 RAW_Data: 713 -324 717 -356 687 -354 687 -354 727 -320 729 -682 379 -350 671 -354 693 -678 381 -672 379 -350 687 -678 381 -672 381 -674 413 -348 667 -356 691 -354 689 -678 381 -672 379 -672 381 -350 721 -320 727 -354 671 -16544 747 -328 689 -354 703 -320 731 -320 729 -320 729 -322 733 -680 385 -326 701 -354 693 -678 385 -650 381 -344 693 -686 387 -670 387 -670 385 -350 685 -352 689 -350 695 -672 363 -688 393 -660 395 -328 741 -332 711 -360 685 -16498 781 -328 679 -354 707 -320 731 -318 729 -320 731 -320 733 -680 373 -360 687 -352 705 -642 389 -648 419 -326 707 -646 419 -648 417 -648 415 -326 711 -326 711 -324 713 -646 419 -648 381 -652 409 -346 725 -348 719 -348 651 -16530 775 -298 703 -360 709 -326 711 -326 713 -354 723 -320 725 -646 409 -358 677 -354 707 -644 385 -650 417 -328 709 -646 419 -648 417 -650 415 -326 711 -326 711 -326 711 -648 381 -684 379 -652 407 -346 723 -346 689 -382 651 -16542 739 -316 715 -324 715 -350 689 -354 723 -322 725 -322 729 -680 375 -358 677 -354 705 -644 385 -680 385 -328 713 -678 387 -650 415 -650 413 -328 711 -326 711 -326 713 -648 381 -684 379 -652 407 -346 723 -346 717 -316 705 -16506 781 -288 717 -354 689 -356 687 -354 723 -320 725 -320 731 -680 381 -348 705 -320 695 -676 381 -672 381 -346 687 -678 381 -674 381 -672 419 -324 695 -356 687 -354 687 -678 385 -650 381 -682 379 -346 727 -346 721 -346 653 -16534 739 -346 693 -342 699 -344 699 -342 731 -346 687 -382 685 -686 383 -352 683 -352 689 -680 357 -664 391 -362 687 -654 409 -662 395 -662 393 -366 671 -360 679 -354 703 -646 419 -646 385 -648 417 -328 711 -354 725 -354 671 -16506 783 -316 705 -322 729 -320 727 -320 727 -320 727 -352 703 -678 377 -358 677 -354 707 -644 381 -672 383 -346 691 -678 381 -672 415 -638 419 -326 699 -354 689 -350 689 -678 381 -672 381 -672 383 -348 721 -322 727 -354 669 -16544 747 -328 689 -352 703 -320 727 -320 727 -322 731 -322 733 -680 385 -326 701 -356 691 -678 385 -650 379 -346 689 -686 387 -670 387 -654 417 -352 683 -354 689 -346 687 -656 377 -686 379 -666 393 -362 687 -364 715 -358 649 -129582 163 -694 263 -100 197 -68 199 -166 199 -100 131 -200 65 -662 629 -66 625 -164 65 -100 987 -66 587 -66 163 -66 95 -66 4701 -300 1593 -66 587 -98 587 -98 1907 -100 4575 -264 195 -296 1449 -132 161 -132 195 -66 359 -132 129 -66 5365 -66 65 -132 595 -100 731 -134 299 -68 1361 -100 RAW_Data: 3975 -100 1023 -98 197 -132 887 -98 195 -100 261 -100 229 -132 1677 -98 5099 -132 1973 -98 2701 -130 4541 -102 165 -66 163 -66 163 -132 591 -66 791 -66 199 -102 4581 -68 1487 -100 161 -98 2113 -66 469 -66 3741 -100 4299 -66 163 -64 391 -166 65 -66 2619 -100 399 -66 4573 -66 2117 -132 6427 -66 1019 -132 529 -66 165 -66 797 -200 165 -102 199 -66 4713 -68 3163 -232 993 -100 363 -98 267 -66 5573 -98 263 -98 261 -66 197 -66 131 -100 2179 -264 4751 -166 467 -100 1727 -100 233 -100 2019 -100 4073 -66 861 -132 1359 -134 201 -66 235 -430 297 -66 599 -68 727 -100 263 -68 265 -68 4727 -100 499 -64 199 -134 65 -66 329 -100 97 -164 525 -64 485 -64 5219 -66 1149 -66 229 -230 1713 -66 131 -98 97 -66 1053 -66 5951 -66 2599 -100 131 -132 955 -132 259 -132 97 -66 99 -98 691 -66 889 -66 4877 -132 1543 -66 1147 -132 65 -298 793 -100 1329 -66 563 -66 595 -232 231 -66 165 -134 4975 -100 791 -100 231 -66 793 -68 1393 -100 463 -132 597 -132 165 -100 4941 -98 425 -132 165 -132 65 -68 231 -66 1033 -66 1003 -132 5379 -166 1745 -66 5759 -66 719 -200 2589 -66 5447 -66 2057 -234 1721 -100 467 -66 5485 -100 65 -66 1187 -134 599 -68 1131 -64 5741 -230 131 -66 819 -100 297 -68 133 -68 231 -132 5413 -100 131 -166 1157 -264 331 -66 727 -66 1283 -66 1513 -98 593 -66 265 -102 233 -66 797 -100 165 -134 665 -100 791 -132 99 -168 5317 -100 299 -100 929 -66 429 -66 835 -100 763 -100 165 -100 3941 -68 231 -68 699 -68 231 -68 1091 -66 299 -100 265 -100 365 -200 531 -66 761 -100 365 -68 5283 -100 299 -100 563 -166 999 -66 657 -132 5585 -64 131 -98 97 -132 361 -66 555 -98 293 -66 1247 -66 521 -196 263 -66 497 -132 6527 -66 399 -66 729 -100 197 -68 6605 -66 1115 -132 919 -98 7149 -66 1297 -66 197 -100 1151 -98 463 -266 197 -98 427 -68 891 -68 3379 -66 397 -68 67 -100 297 -98 983 -232 165 -132 883 -68 3773 -66 263 -64 653 -166 795 -100 397 -98 5091 -68 429 -66 297 -164 227 -98 621 -164 691 -130 2735 -64 1513 -98 299 -66 963 -166 333 -66 993 -100 4049 -66 555 -100 293 -98 815 -64 133 -66 729 -66 165 -66 1493 -66 1183 -234 165 -66 267 -202 1031 -100 693 -64 261 -66 261 -66 4057 -98 327 -98 425 -98 291 -100 65 -100 931 -68 297 -68 527 -68 463 -66 5135 -66 163 -98 5887 -4482 477 -1448 469 -1438 479 -1430 485 -518 467 -1440 451 -532 451 -1440 477 -1444 RAW_Data: 471 -1474 451 -1446 481 -518 449 -1446 483 -514 475 -520 445 -502 491 -546 453 -1470 449 -1450 473 -1432 473 -1444 479 -482 473 -1460 461 -1404 481 -1484 461 -1444 449 -1446 483 -1440 477 -522 453 -1436 479 -1414 479 -1428 473 -1444 481 -1444 471 -1440 481 -1426 473 -1446 483 -520 451 -508 491 -1402 481 -1448 469 -1474 447 -556 443 -538 467 -514 481 -518 449 -1432 483 -482 485 -1418 4439 -4500 485 -1452 479 -1408 507 -1412 479 -504 495 -1406 483 -526 449 -1432 479 -1444 471 -1450 477 -1448 469 -516 479 -1430 481 -522 449 -510 475 -488 503 -522 481 -1466 461 -1446 447 -1448 481 -1442 477 -484 481 -1440 477 -1410 481 -1456 459 -1438 479 -520 483 -506 481 -538 463 -514 479 -1408 469 -516 481 -514 509 -1440 477 -518 451 -1436 483 -524 485 -478 475 -1444 469 -514 477 -540 477 -1438 475 -520 485 -1402 485 -1420 487 -1436 473 -512 463 -514 479 -1404 4423 -4516 489 -1442 483 -1420 473 -1440 471 -506 481 -1426 471 -512 471 -1408 483 -1484 463 -1442 475 -1448 465 -514 481 -1438 477 -484 481 -512 473 -490 499 -548 481 -1420 469 -1442 487 -1418 481 -1446 463 -516 479 -1408 471 -1442 449 -1486 461 -514 481 -524 491 -510 479 -1404 509 -1410 481 -500 491 -478 475 -1476 479 -520 489 -1434 451 -526 489 -1402 483 -524 487 -1404 479 -490 481 -1468 485 -1426 473 -1440 487 -524 451 -1454 477 -508 463 -1406 483 -492 483 -1406 4439 -4518 491 -1438 481 -1420 471 -1442 487 -522 451 -1418 479 -506 495 -1404 481 -1444 503 -1418 479 -1446 469 -516 481 -1438 479 -486 483 -506 475 -520 473 -522 479 -1464 459 -1436 475 -1444 467 -1442 481 -496 491 -1404 481 -1412 481 -1462 457 -1468 481 -514 475 -1412 483 -512 475 -1444 465 -1408 483 -1414 481 -538 507 -516 485 -512 477 -514 475 -492 503 -490 483 -1414 481 -1426 487 -514 509 -516 451 -542 475 -1430 479 -1414 479 -504 493 -514 475 -482 473 -1428 4417 -4510 483 -1440 481 -1452 475 -1438 461 -512 479 -1416 487 -506 489 -1406 479 -1448 487 -1444 459 -1434 479 -520 487 -1414 477 -518 473 -502 479 -504 491 -546 449 -1466 485 -1416 471 -1438 481 -1414 493 -514 477 -1406 471 -1442 483 -1456 461 -518 483 -1446 471 -514 479 -520 485 -476 477 -516 473 -1428 481 -1440 481 -1448 473 -512 473 -1436 481 -1426 473 -512 481 -1416 481 -1426 473 -1444 475 -518 507 -1422 491 -1436 481 -496 489 -1404 481 -1418 481 -502 491 -1400 4449 -4492 493 -1438 481 -1422 469 -1444 487 -522 449 -1450 471 -486 475 -1440 483 -1454 459 -1440 479 -1446 469 -516 481 -1436 477 -486 483 -510 475 -488 501 -518 421 -129440 263 -162 65 -362 RAW_Data: 129 -264 65 -266 199 -132 67 -332 99 -98 3287 -100 4663 -132 4127 -98 331 -68 99 -66 5149 -200 1759 -66 65 -100 1051 -132 619 -66 5371 -132 1873 -232 195 -130 657 -132 357 -66 229 -66 4517 -100 365 -64 2447 -132 261 -66 633 -100 1153 -100 593 -132 259 -66 1589 -134 229 -66 65 -66 99 -66 491 -66 3789 -100 2059 -102 301 -66 663 -98 327 -98 5013 -98 4239 -164 987 -98 197 -66 163 -66 1479 -100 897 -66 99 -166 827 -66 465 -100 67 -100 563 -100 5179 -66 2043 -100 985 -66 1355 -66 431 -66 729 -232 165 -352 689 -346 685 -364 709 -322 709 -354 705 -354 701 -680 377 -360 675 -356 709 -644 385 -682 383 -328 711 -680 383 -648 415 -648 415 -328 711 -318 717 -326 713 -680 383 -650 379 -684 377 -330 741 -324 717 -354 691 -16506 751 -352 703 -322 693 -354 693 -354 725 -320 729 -322 731 -680 383 -356 669 -354 695 -678 385 -650 379 -344 691 -696 363 -686 387 -686 383 -352 685 -350 691 -346 699 -668 365 -684 367 -682 379 -366 685 -362 709 -360 677 -16540 731 -354 667 -352 699 -350 689 -362 711 -322 713 -354 707 -680 387 -326 737 -320 691 -676 383 -638 417 -316 715 -676 387 -648 421 -644 419 -326 711 -326 709 -326 713 -642 421 -648 415 -618 413 -346 725 -348 721 -314 685 -16528 775 -298 733 -326 709 -326 711 -324 715 -350 725 -320 731 -646 421 -326 699 -354 689 -678 383 -638 415 -318 711 -678 387 -648 417 -648 417 -326 715 -324 707 -318 717 -678 387 -648 381 -684 379 -346 725 -346 719 -348 651 -16544 741 -352 691 -354 687 -356 691 -348 691 -326 747 -320 743 -646 407 -330 725 -320 707 -644 389 -648 423 -296 735 -646 421 -648 417 -646 417 -326 707 -326 709 -324 711 -646 421 -648 381 -652 411 -346 725 -314 753 -316 683 -16546 649 -538 489 -574 455 -574 487 -542 557 -442 593 -474 575 -802 263 -464 599 -428 605 -752 319 -716 321 -422 639 -720 351 -720 319 -730 361 -366 669 -362 673 -356 705 -684 345 -686 381 -682 383 -326 715 -356 723 -354 669 -16540 747 -330 715 -320 707 -320 731 -320 729 -322 729 -354 701 -680 377 -358 675 -356 707 -646 381 -672 383 -328 717 -678 385 -680 383 -648 415 -326 717 -326 713 -326 713 -646 417 -652 379 -686 375 -346 723 -346 721 -346 653 -16542 775 -316 693 -354 687 -348 699 -354 691 -348 719 -332 711 -658 403 -354 677 -356 707 -644 385 -682 385 -328 713 -646 419 -650 415 -648 415 -326 713 -326 713 -326 711 -646 417 -648 379 -652 411 -344 725 -346 721 -346 RAW_Data: 653 -16540 741 -348 691 -348 685 -354 687 -350 697 -378 705 -332 719 -652 405 -352 677 -354 705 -644 385 -682 387 -326 713 -646 419 -648 415 -650 415 -326 713 -326 713 -326 713 -646 381 -684 379 -652 407 -346 723 -346 719 -314 705 -16508 781 -290 715 -354 687 -354 689 -354 723 -320 729 -320 731 -646 419 -324 701 -354 689 -680 385 -650 379 -350 711 -648 417 -648 413 -638 415 -326 715 -324 713 -324 713 -648 417 -650 379 -652 411 -344 725 -346 723 -348 651 -16538 745 -324 711 -324 717 -324 717 -354 687 -352 725 -322 727 -678 375 -360 685 -354 705 -644 385 -648 419 -326 709 -648 419 -648 413 -650 415 -326 707 -318 715 -326 713 -646 419 -648 379 -684 379 -344 725 -346 719 -348 653 -16544 741 -336 697 -334 703 -332 737 -328 707 -326 717 -352 725 -646 415 -348 671 -352 693 -678 381 -638 415 -318 715 -678 383 -672 383 -674 383 -348 693 -354 687 -356 689 -678 387 -648 381 -684 379 -332 737 -326 745 -320 695 -16504 781 -286 737 -322 693 -354 691 -354 727 -318 729 -322 731 -680 381 -348 705 -320 697 -678 383 -650 381 -360 707 -648 415 -650 413 -650 413 -326 677 -362 675 -360 711 -648 381 -684 379 -654 405 -344 723 -346 685 -382 651 -16544 743 -350 689 -352 685 -352 691 -346 685 -364 709 -358 711 -650 407 -352 679 -354 671 -678 385 -648 417 -328 709 -648 415 -648 415 -648 413 -328 677 -360 711 -328 713 -648 381 -684 377 -656 405 -346 689 -380 687 -382 653 -16540 741 -352 689 -320 719 -354 689 -336 719 -322 711 -352 707 -680 407 -328 709 -322 711 -644 387 -680 385 -328 711 -678 385 -648 417 -648 415 -326 715 -326 713 -326 711 -648 419 -648 381 -652 409 -346 723 -348 719 -348 651 -130012 261 -132 261 -198 199 -130 791 -66 531 -66 231 -100 463 -66 299 -66 299 -100 785 -332 131 -66 267 -66 4069 -66 657 -100 589 -100 129 -100 523 -166 1325 -66 99 -132 4995 -98 429 -132 1151 -100 231 -130 361 -98 261 -66 1709 -98 165 -98 4413 -100 723 -132 63 -66 259 -98 359 -66 427 -68 665 -266 297 -330 961 -166 2625 -66 763 -98 65 -98 327 -166 463 -198 269 -100 529 -132 97 -98 227 -66 259 -162 327 -198 429 -66 295 -66 133 -162 3959 -234 789 -266 97 -230 827 -98 129 -100 97 -66 97 -66 361 -98 65 -66 525 -100 165 -64 757 -266 163 -166 3769 -166 563 -132 399 -68 563 -68 363 -66 133 -100 263 -66 529 -100 1065 -102 989 -132 1091 -100 729 -66 497 -98 133 -66 67 -98 565 -66 265 -234 RAW_Data: 467 -166 499 -100 97 -66 4339 -100 165 -134 2121 -66 697 -134 531 -100 3557 -100 829 -130 461 -98 263 -300 199 -68 199 -66 733 -66 431 -132 365 -66 435 -66 637 -68 2411 -66 821 -66 65 -100 331 -100 693 -66 527 -200 131 -268 1959 -66 363 -464 5279 -132 199 -66 165 -200 329 -64 197 -98 1511 -132 525 -66 4411 -66 99 -100 131 -66 1161 -100 431 -66 165 -66 4607 -66 337 -68 267 -134 1623 -66 497 -66 295 -100 401 -100 65 -100 4201 -66 165 -68 233 -168 825 -100 599 -100 1857 -68 2819 -66 325 -164 359 -98 131 -298 99 -66 197 -66 4209 -100 1031 -66 131 -100 263 -66 267 -66 363 -100 1163 -132 633 -102 3097 -100 799 -66 265 -66 331 -100 763 -134 897 -100 333 -66 599 -66 467 -132 99 -66 3491 -66 821 -66 327 -66 557 -164 661 -68 165 -362 197 -98 757 -98 99 -98 525 -98 557 -134 1027 -132 197 -66 663 -100 991 -66 493 -68 131 -132 863 -132 529 -132 165 -102 397 -66 4095 -200 2929 -66 689 -66 397 -66 229 -98 163 -96 163 -98 227 -66 1063 -330 165 -66 495 -100 1021 -66 2569 -132 667 -134 331 -66 329 -64 555 -100 329 -66 227 -230 2225 -66 5081 -98 265 -66 669 -132 363 -100 265 -66 263 -132 731 -100 497 -98 199 -100 431 -166 233 -100 3069 -66 721 -132 329 -64 795 -66 535 -66 265 -100 531 -66 233 -3824 129 -706 305 -696 295 -688 323 -686 351 -644 353 -646 373 -644 375 -592 427 -584 421 -1078 909 -610 413 -602 399 -1080 451 -554 951 -1078 937 -552 455 -548 451 -1084 949 -1046 971 -516 481 -1046 449 -554 473 -542 475 -516 983 -1046 947 -552 451 -530 493 -1042 973 -522 473 -538 473 -540 471 -1040 975 -1006 477 -550 473 -508 1001 -522 487 -534 465 -548 451 -1044 447 -51358 455 -608 373 -628 365 -654 355 -652 353 -658 373 -640 373 -600 401 -618 389 -614 383 -622 415 -566 443 -580 407 -590 425 -1080 943 -564 413 -578 445 -1062 455 -548 943 -1078 947 -562 463 -548 451 -1044 967 -1050 983 -518 487 -1008 477 -524 485 -538 477 -510 1007 -1010 973 -556 453 -546 467 -1042 973 -542 447 -556 473 -510 475 -1044 979 -1016 499 -514 481 -526 991 -514 479 -522 483 -536 487 -1012 493 -51302 493 -3786 199 -670 339 -656 329 -684 321 -646 385 -628 373 -646 375 -626 365 -618 419 -586 417 -1088 909 -610 407 -590 427 -1082 415 -576 939 -1080 941 -584 425 -1074 941 -542 443 -1078 973 -1046 451 -548 445 -550 967 -554 475 -508 473 -1044 977 -1054 957 -1044 465 -516 483 -546 975 -520 485 -1048 461 -514 RAW_Data: 483 -546 445 -552 975 -1018 979 -552 455 -1044 977 -51850 457 -4674 299 -704 305 -694 297 -720 323 -654 355 -626 385 -642 341 -632 401 -620 389 -1116 883 -610 413 -602 401 -1112 419 -552 943 -1066 937 -590 427 -1078 449 -556 951 -1044 475 -556 921 -1076 445 -550 981 -1030 985 -1012 485 -522 977 -528 495 -1010 479 -554 975 -506 479 -538 473 -548 453 -544 481 -1010 473 -554 985 -530 465 -514 481 -546 479 -1010 473 -556 475 -51320 459 -688 263 -754 225 -750 289 -742 297 -640 339 -658 365 -652 355 -648 353 -644 363 -640 375 -626 397 -586 419 -584 417 -1104 911 -578 445 -560 429 -1080 449 -554 937 -1082 941 -1082 947 -558 421 -584 449 -1034 455 -548 483 -516 479 -540 967 -1050 977 -520 489 -1038 443 -552 471 -538 967 -554 453 -540 467 -1042 977 -522 469 -544 477 -1016 481 -514 1009 -1014 481 -534 963 -1044 977 -554 443 -111144 233 -134 197 -196 131 -132 2559 -98 699 -98 233 -100 895 -100 897 -98 297 -230 295 -64 527 -66 895 -132 65 -98 4231 -134 667 -100 65 -66 297 -100 231 -102 563 -100 2053 -300 3873 -100 957 -66 291 -66 1225 -66 1095 -100 1029 -98 235 -100 4947 -66 131 -132 1159 -232 4881 -130 1649 -130 429 -66 463 -66 327 -266 133 -66 5073 -66 229 -100 697 -134 1353 -66 133 -130 4655 -264 299 -132 1065 -100 65 -100 199 -66 631 -66 1531 -98 233 -100 4353 -66 661 -100 233 -66 167 -68 1657 -66 267 -100 397 -98 761 -66 493 -68 761 -64 823 -98 525 -98 163 -66 197 -98 231 -66 167 -66 133 -98 953 -66 689 -66 735 -66 163 -98 229 -100 595 -168 195 -130 263 -132 957 -66 493 -98 65 -132 723 -98 431 -166 4275 -132 333 -100 97 -68 827 -66 491 -198 327 -264 4271 -134 1087 -100 797 -134 131 -302 695 -66 261 -236 465 -66 4191 -66 663 -100 433 -66 1325 -100 229 -132 295 -100 261 -100 431 -66 531 -130 195 -98 4647 -66 229 -66 359 -264 525 -98 365 -232 165 -264 457 -100 231 -66 629 -366 229 -66 3411 -68 1163 -132 763 -66 165 -66 1657 -66 393 -132 521 -262 5821 -132 1221 -98 129 -100 1345 -66 425 -198 165 -66 525 -66 299 -100 465 -66 497 -100 599 -298 4711 -100 397 -66 99 -132 627 -66 793 -98 327 -98 97 -68 265 -66 99 -98 265 -1152602 163 -1918 65 -330 197 -98 97 -198 721 -66 897 -232 4175 -166 299 -134 299 -132 331 -100 363 -66 499 -166 527 -98 1327 -68 931 -66 701 -198 265 -298 131 -100 301 -132 1029 -132 295 -134 3515 -66 197 -100 427 -100 99 -100 165 -98 231 -100 RAW_Data: 4709 -232 163 -66 129 -96 1557 -100 229 -64 621 -100 4377 -100 1895 -66 2321 -66 4485 -66 167 -66 67 -66 1395 -68 65 -132 429 -134 1855 -68 231 -100 5991 -366 629 -100 2525 -68 233 -264 295 -98 853 -132 4433 -66 163 -66 457 -98 657 -66 331 -66 825 -66 785 -166 293 -66 559 -100 4747 -228 887 -66 895 -130 1457 -100 6935 -100 229 -66 329 -162 1051 -66 461 -100 97 -100 4427 -66 859 -68 299 -100 165 -100 1249 -132 197 -198 4129 -66 299 -268 927 -164 557 -98 261 -66 2419 -66 4739 -100 97 -66 2309 -66 97 -66 987 -198 325 -64 5109 -66 199 -100 1059 -66 723 -100 763 -100 5355 -98 201 -134 265 -100 165 -100 827 -66 595 -100 297 -100 231 -132 4787 -100 361 -100 429 -200 733 -66 633 -66 531 -330 4215 -68 1361 -200 5943 -66 1117 -132 953 -66 261 -132 199 -134 235 -200 261 -66 165 -132 65 -98 395 -266 197 -98 791 -134 229 -100 1195 -68 363 -100 99 -66 525 -98 759 -66 663 -98 163 -98 3411 -100 1033 -132 133 -134 133 -100 363 -100 663 -66 131 -66 331 -100 299 -134 65 -66 1025 -100 397 -66 2051 -66 697 -66 605 -390 415 -398 409 -400 393 -438 387 -410 387 -410 385 -448 383 -414 385 -416 387 -416 387 -448 387 -4030 787 -422 449 -810 425 -816 423 -838 417 -844 399 -852 805 -456 811 -412 837 -418 415 -814 823 -434 385 -878 385 -848 799 -474 383 -850 819 -452 405 -820 385 -844 415 -842 403 -848 809 -456 779 -446 417 -862 413 -814 417 -852 785 -452 799 -436 811 -450 415 -832 807 -444 411 -838 803 -446 407 -850 807 -410 807 -452 819 -418 817 -448 815 -434 809 -450 409 -840 817 -418 417 -818 417 -862 773 -476 773 -450 803 -446 409 -866 419 -848 793 -436 387 -838 419 -846 793 -438 415 -846 409 -846 811 -446 813 -422 423 -838 783 -448 413 -838 379 -866 807 -450 383 -862 807 -450 813 -412 415 -816 387 -15812 443 -358 433 -386 409 -386 447 -350 451 -382 419 -384 421 -384 419 -386 421 -386 421 -388 419 -388 419 -4024 837 -410 415 -814 421 -848 399 -822 413 -850 419 -824 841 -444 809 -422 815 -416 413 -842 801 -438 411 -844 409 -846 811 -446 413 -832 841 -414 409 -840 419 -812 425 -820 393 -866 811 -418 841 -430 415 -846 419 -820 405 -850 807 -418 819 -416 809 -454 395 -854 817 -450 419 -848 807 -412 413 -850 785 -450 811 -432 809 -412 837 -416 831 -458 811 -452 389 -854 787 -454 407 -824 413 -814 821 -448 815 -432 809 -450 395 -864 421 -814 827 -434 387 -840 421 -814 RAW_Data: 825 -434 415 -846 421 -816 837 -444 809 -420 423 -806 813 -450 383 -840 417 -864 807 -444 381 -848 821 -454 805 -434 379 -806 417 -15798 421 -428 321 -504 321 -474 323 -508 293 -508 325 -468 323 -476 365 -444 365 -444 333 -466 359 -464 331 -4092 749 -490 351 -870 381 -882 361 -888 381 -838 411 -860 807 -450 815 -434 809 -414 417 -824 803 -442 413 -846 417 -854 773 -476 381 -882 793 -426 413 -844 387 -854 397 -826 417 -848 787 -462 813 -448 395 -864 419 -812 429 -818 821 -418 809 -448 783 -460 411 -846 785 -486 399 -850 811 -414 415 -828 801 -442 809 -450 789 -456 807 -452 785 -458 805 -450 411 -836 819 -418 419 -820 415 -830 805 -474 777 -450 815 -450 417 -852 413 -812 811 -424 411 -838 419 -844 795 -436 385 -878 409 -844 809 -444 813 -424 423 -838 777 -450 413 -842 399 -860 777 -448 413 -868 803 -448 791 -424 411 -812 413 -15768 435 -396 429 -358 435 -378 411 -410 413 -380 439 -394 409 -406 379 -412 407 -414 409 -382 413 -410 417 -3998 837 -414 409 -840 421 -810 427 -820 421 -838 421 -844 797 -472 805 -418 815 -408 419 -850 799 -438 415 -816 421 -852 799 -438 411 -874 803 -416 413 -842 403 -836 413 -842 395 -826 813 -452 807 -458 407 -846 419 -822 409 -816 839 -118766 99 -132 819 -98 917 -132 233 -100 167 -66 533 -66 525 -64 163 -98 947 -66 327 -66 425 -132 229 -66 331 -68 1949 -98 261 -132 261 -66 1187 -66 295 -100 5279 -68 595 -98 527 -66 1293 -68 97 -134 527 -68 4543 -66 229 -64 927 -332 199 -132 363 -264 825 -100 829 -68 565 -200 3743 -66 2027 -66 1425 -100 1301 -66 229 -196 99 -98 4645 -422 353 -446 385 -418 385 -416 387 -450 357 -450 355 -450 357 -450 359 -450 357 -450 359 -450 359 -4096 779 -448 771 -474 777 -444 779 -480 775 -482 367 -880 779 -446 387 -918 781 -418 819 -416 813 -454 779 -448 385 -882 379 -854 779 -484 385 -872 787 -454 793 -456 781 -448 385 -850 405 -854 779 -448 803 -458 785 -484 395 -854 787 -430 809 -446 383 -842 793 -486 383 -856 777 -478 379 -906 381 -824 803 -432 807 -446 785 -442 783 -482 785 -454 381 -872 375 -918 787 -418 815 -418 391 -860 785 -448 385 -876 787 -460 775 -484 387 -890 385 -834 777 -450 385 -852 417 -854 379 -856 381 -882 369 -876 777 -482 791 -454 771 -446 377 -886 779 -446 383 -874 769 -458 819 -450 785 -456 779 -420 383 -16402 383 -444 385 -416 385 -448 355 -452 355 -450 359 -450 355 -450 357 -452 359 -450 RAW_Data: 357 -450 359 -450 357 -4096 777 -448 799 -446 761 -464 775 -478 769 -454 419 -846 799 -466 381 -876 799 -440 801 -440 775 -448 811 -448 379 -872 385 -848 803 -464 381 -876 781 -454 783 -448 783 -448 411 -836 421 -848 763 -494 775 -482 779 -480 379 -858 779 -448 777 -448 379 -866 787 -484 353 -886 785 -462 383 -878 411 -854 775 -444 769 -454 807 -454 789 -452 803 -446 377 -864 419 -878 779 -436 809 -414 415 -860 775 -434 383 -876 787 -486 765 -490 349 -906 379 -858 777 -446 383 -842 409 -856 387 -850 393 -856 391 -856 785 -518 763 -460 779 -446 385 -852 803 -430 381 -872 801 -452 783 -472 777 -450 785 -428 377 -16446 411 -422 355 -478 353 -448 353 -448 359 -448 361 -450 357 -450 357 -450 357 -450 359 -446 353 -450 361 -4086 807 -442 769 -454 809 -452 783 -448 773 -480 381 -860 777 -472 383 -908 769 -448 801 -452 779 -432 809 -448 365 -882 387 -846 795 -456 381 -910 787 -426 809 -446 779 -446 379 -862 407 -846 783 -472 779 -482 777 -482 391 -860 783 -446 779 -448 395 -852 777 -482 385 -872 773 -448 417 -888 385 -834 785 -456 777 -448 801 -456 769 -458 809 -444 391 -858 421 -878 777 -434 807 -444 377 -856 777 -448 387 -872 803 -450 801 -452 389 -886 391 -858 757 -454 381 -854 391 -856 387 -848 397 -866 377 -872 797 -488 781 -470 773 -446 369 -878 751 -476 383 -848 787 -482 763 -494 777 -448 789 -400 401 -16398 419 -418 355 -434 385 -442 351 -446 383 -450 353 -450 357 -450 355 -450 357 -448 359 -450 357 -450 357 -4088 805 -414 803 -458 781 -446 781 -482 783 -450 383 -882 771 -468 383 -884 783 -456 783 -446 779 -450 783 -456 417 -844 371 -888 777 -482 367 -910 769 -452 771 -460 777 -446 379 -886 385 -848 787 -456 807 -446 815 -482 379 -858 783 -446 779 -448 395 -852 775 -480 357 -872 803 -448 409 -890 383 -850 763 -460 779 -446 803 -460 777 -480 781 -448 381 -870 379 -914 769 -440 799 -434 383 -872 767 -486 383 -856 777 -478 771 -480 379 -890 383 -850 767 -462 385 -872 351 -882 367 -866 383 -878 365 -878 775 -516 767 -460 779 -448 383 -848 803 -464 349 -876 785 -486 763 -492 777 -412 787 -454 359 -16460 421 -392 415 -392 405 -412 379 -432 385 -440 351 -448 385 -416 385 -418 387 -450 355 -450 357 -450 357 -4092 775 -446 799 -454 769 -458 805 -444 769 -452 405 -882 785 -446 383 -884 813 -418 809 -454 785 -452 779 -448 375 -886 387 -848 787 -456 379 -908 801 -418 785 -452 813 -448 RAW_Data: 379 -838 421 -846 767 -494 777 -480 777 -480 379 -858 779 -446 779 -448 379 -898 755 -482 385 -842 803 -446 409 -890 383 -850 765 -462 775 -446 801 -458 775 -484 783 -450 379 -876 383 -886 783 -474 775 -446 365 -880 779 -448 385 -850 793 -486 779 -468 381 -884 391 -856 779 -446 383 -850 383 -854 409 -854 355 -900 385 -848 805 -464 813 -452 779 -420 419 -844 763 -460 383 -876 799 -454 769 -494 775 -444 771 -426 411 -16408 355 -436 383 -444 383 -416 385 -418 385 -452 353 -450 357 -450 357 -452 357 -446 355 -446 387 -410 391 -4094 775 -448 789 -430 807 -446 777 -450 813 -450 385 -848 807 -468 381 -884 783 -456 777 -123134 99 -266 65 -594 99 -232 301 -134 2911 -134 861 -66 529 -98 569 -66 1593 -68 429 -66 5405 -132 263 -98 821 -66 397 -66 361 -66 491 -100 165 -66 495 -66 3677 -132 825 -68 529 -134 299 -66 165 -68 661 -68 203 -134 135 -100 429 -100 397 -98 859 -66 365 -166 399 -98 2811 -68 229 -66 567 -164 1153 -168 167 -134 265 -100 631 -66 1493 -132 65 -98 199 -68 4269 -132 365 -202 1493 -132 299 -66 131 -66 465 -66 231 -98 229 -96 165 -130 3593 -100 927 -100 231 -200 1825 -68 265 -66 1557 -100 65 -100 463 -68 495 -100 2591 -232 1027 -100 229 -98 461 -66 1847 -100 265 -66 4369 -270 131 -100 131 -66 1725 -66 397 -98 1659 -66 329 -132 6605 -234 397 -134 1427 -100 231 -166 5117 -66 663 -98 499 -66 1331 -66 931 -66 563 -166 4219 -66 265 -164 491 -166 263 -164 557 -100 1483 -100 361 -98 461 -66 497 -102 4575 -100 1327 -98 265 -234 131 -100 399 -100 565 -100 637 -100 463 -64 3975 -166 197 -202 333 -132 199 -132 693 -68 631 -66 165 -100 265 -66 297 -200 165 -166 199 -364 3717 -198 761 -66 197 -134 395 -66 99 -66 695 -198 797 -132 397 -200 431 -102 6087 -198 199 -100 399 -100 361 -100 333 -100 827 -166 1135 -132 333 -100 497 -68 3915 -130 363 -98 897 -66 99 -66 297 -230 395 -66 195 -66 5099 -100 687 -66 915 -66 165 -66 95 -230 1181 -98 593 -98 301 -198 4807 -132 431 -232 367 -198 629 -164 199 -68 65 -100 331 -100 431 -132 1397 -66 165 -332 297 -66 1131 -466 533 -132 463 -198 861 -98 293 -66 4561 -100 459 -66 691 -130 557 -292 393 -66 161 -66 425 -66 163 -130 1147 -96 4103 -100 399 -132 395 -66 429 -66 131 -68 197 -98 199 -98 167 -100 65 -232 67 -132 165 -68 235 -66 467 -68 1027 -66 4281 -198 261 -66 861 -166 231 -198 333 -66 RAW_Data: 231 -196 1265 -100 133 -68 933 -100 7293 -66 331 -132 295 -68 1157 -98 261 -132 1223 -200 929 -98 1291 -68 3909 -132 199 -100 2729 -66 195 -134 829 -132 263 -262 329 -68 1559 -100 497 -66 5119 -64 949 -66 533 -166 397 -68 559 -98 263 -98 951 -66 3273 -134 665 -100 65 -100 231 -66 267 -132 267 -100 1131 -132 133 -66 129 -130 885 -66 193 -164 229 -264 65 -66 889 -130 259 -164 689 -66 4127 -130 229 -66 1545 -98 199 -100 131 -100 2059 -66 329 -98 197 -66 4261 -166 791 -98 199 -68 465 -66 233 -66 265 -66 2983 -64 327 -98 229 -66 2403 -132 259 -98 953 -100 1657 -100 761 -498 799 -66 433 -200 495 -98 229 -66 1179 -68 5479 -232 627 -66 693 -66 265 -66 265 -66 463 -100 231 -68 499 -66 133 -100 299 -66 4899 -66 195 -164 621 -130 229 -130 231 -98 261 -66 97 -334 397 -100 425 -98 729 -134 65 -134 367 -102 463 -66 3197 -132 893 -66 495 -164 461 -66 197 -164 1715 -100 663 -66 99 -166 265 -100 201 -98 233 -66 133 -100 829 -132 361 -68 561 -98 199 -66 431 -134 263 -100 2071 -100 661 -66 461 -98 227 -66 1149 -66 297 -98 631 -98 329 -66 463 -66 263 -66 951 -64 3587 -66 1413 -66 919 -66 689 -132 847 -132 459 -100 161 -196 4049 -66 301 -68 397 -134 427 -98 229 -100 263 -134 335 -68 397 -98 259 -100 823 -100 399 -66 165 -66 3571 -132 563 -166 231 -100 197 -132 867 -66 433 -68 761 -98 335 -100 99 -98 99 -66 1751 -230 1019 -100 765 -100 231 -68 365 -134 4643 -66 367 -68 297 -66 531 -166 1333 -66 531 -66 67 -98 959 -66 791 -66 3787 -66 261 -132 721 -362 133 -66 897 -134 629 -100 1395 -368 1127 -132 895 -100 463 -66 1793 -66 5239 -66 331 -66 1095 -68 433 -68 6899 -98 1527 -132 267 -66 67 -66 131 -100 495 -66 4027 -68 999 -132 959 -134 265 -66 199 -68 299 -132 999 -134 65 -66 497 -98 67 -66 265 -132 4751 -66 231 -98 263 -98 463 -66 99 -66 859 -66 327 -66 435 -66 2987 -100 993 -68 1025 -66 1491 -68 1095 -100 297 -66 4409 -98 787 -132 2569 -66 957 -68 795 -64 593 -100 335 -66 1675 -100 7041 -134 1727 -134 65 -100 1029 -132 1027 -66 4653 -66 65 -66 995 -100 1129 -66 267 -66 231 -68 469 -66 465 -134 4047 -68 165 -100 597 -166 729 -100 665 -66 1115 -68 293 -130 297 -66 1607 -398 393 -410 409 -410 415 -378 413 -412 413 -382 417 -396 419 -396 409 -382 409 -404 423 -408 385 -4052 417 -820 401 -820 809 -450 RAW_Data: 823 -420 417 -848 797 -472 381 -876 791 -428 413 -844 817 -426 379 -878 385 -848 403 -852 807 -452 379 -878 801 -452 801 -438 385 -838 419 -846 399 -852 379 -850 315 -110416 645 -1548 1691 -486 1667 -518 1695 -488 1671 -498 1697 -508 571 -1588 583 -1570 561 -1574 1689 -504 583 -1560 1679 -520 587 -1574 1677 -488 1701 -484 1697 -520 1677 -492 1693 -488 581 -1566 591 -1574 601 -1546 607 -1568 577 -1566 581 -1576 579 -16394 591 -1548 1679 -518 1671 -520 1679 -516 1663 -514 1689 -486 583 -1580 579 -1578 579 -1566 1701 -494 571 -1568 1697 -514 563 -1570 1693 -506 1669 -516 1695 -496 1681 -518 1667 -506 573 -1576 603 -1544 613 -1568 597 -1538 607 -1566 581 -1580 577 -16400 619 -1534 1703 -494 1677 -480 1697 -506 1675 -518 1669 -518 587 -1580 581 -1562 579 -1576 1683 -488 589 -1582 1677 -524 583 -1570 1653 -510 1703 -518 1641 -518 1693 -502 1677 -516 579 -1570 579 -1578 581 -1566 615 -1566 585 -1564 585 -1580 585 -16408 595 -1546 1685 -518 1673 -490 1669 -548 1665 -518 1675 -494 587 -1552 595 -1570 605 -1556 1673 -520 581 -1578 1665 -520 581 -1558 1701 -484 1681 -516 1667 -516 1697 -508 1675 -490 603 -1570 577 -1566 593 -1572 603 -1576 575 -1568 579 -1578 579 -16400 625 -1554 1667 -500 1699 -482 1691 -506 1679 -518 1673 -520 585 -1566 579 -1560 611 -1548 1697 -488 577 -1602 1651 -518 583 -1578 1667 -508 1691 -522 1675 -512 1665 -502 1699 -482 605 -1574 585 -1566 601 -1570 577 -1576 581 -1576 579 -1566 579 -16452 591 -1534 1693 -508 1683 -518 1673 -520 1673 -488 1711 -514 575 -1562 589 -1570 603 -1568 1667 -518 589 -1578 1677 -486 605 -1570 1701 -484 1701 -504 1697 -514 1667 -510 1717 -518 581 -1578 615 -91426 233 -298 197 -332 593 -162 261 -98 131 -68 163 -692 821 -132 227 -64 131 -66 197 -132 163 -66 263 -68 363 -134 461 -98 65 -66 229 -298 295 -66 3173 -64 987 -164 425 -98 193 -98 693 -66 723 -196 391 -496 431 -100 229 -68 499 -100 63 -66 165 -66 397 -98 133 -100 533 -166 1179 -166 361 -100 3973 -98 825 -100 131 -98 723 -66 1053 -66 131 -68 197 -100 199 -100 331 -66 165 -100 429 -68 231 -66 567 -66 533 -100 593 -68 1463 -66 2093 -100 599 -66 361 -66 361 -132 261 -462 263 -66 621 -98 555 -100 131 -68 4609 -200 199 -164 1033 -66 863 -132 131 -68 331 -100 4565 -98 229 -66 1313 -130 589 -166 3959 -100 531 -100 263 -132 361 -166 229 -64 165 -66 231 -328 261 -66 229 -66 165 -100 235 -100 299 -132 265 -266 165 -66 4417 -100 261 -68 1625 -64 165 -98 229 -160 259 -98 99 -332 593 -166 167 -102 RAW_Data: 199 -66 1063 -98 267 -100 263 -332 5513 -64 229 -232 685 -232 661 -98 431 -66 1021 -66 4085 -64 655 -66 2313 -66 531 -66 263 -100 197 -134 67 -132 901 -66 1591 -66 4217 -100 827 -100 165 -66 299 -166 1987 -166 4097 -66 365 -66 131 -332 131 -100 625 -66 361 -98 131 -196 1679 -66 163 -98 293 -100 2275 -98 1689 -66 825 -98 627 -164 297 -398 461 -66 4707 -66 795 -134 329 -132 597 -66 777 -6038 371 -1818 167 -668 693 -622 1573 -638 465 -1666 503 -1626 541 -1622 1635 -518 577 -1578 1669 -512 567 -1606 1667 -502 1677 -516 1693 -500 1673 -518 1675 -522 587 -1562 581 -1558 625 -1546 587 -1558 611 -1560 571 -1568 609 -16352 633 -1548 1689 -476 1707 -490 1687 -482 1709 -502 1675 -520 579 -1578 577 -1568 577 -1568 1705 -486 581 -1586 1695 -486 579 -1568 1679 -520 1673 -520 1669 -508 1707 -498 1677 -514 577 -1566 615 -1550 581 -1568 615 -1532 617 -1546 617 -1532 615 -16406 599 -1530 1691 -514 1695 -484 1679 -530 1659 -518 1669 -514 601 -1568 577 -1578 577 -1568 1699 -492 573 -1576 1707 -486 577 -1600 1655 -518 1669 -530 1691 -486 1673 -514 1691 -502 585 -1576 585 -1580 577 -1592 573 -1576 571 -1570 613 -1570 559 -16430 619 -1538 1703 -462 1723 -484 1697 -488 1691 -488 1715 -462 635 -1534 607 -1556 589 -1580 1685 -488 621 -1538 1711 -492 589 -1548 1717 -478 1693 -514 1687 -504 1693 -484 1705 -482 605 -1570 579 -1566 619 -1550 581 -1580 579 -1568 615 -1536 619 -16382 625 -1534 1709 -490 1683 -514 1673 -504 1677 -518 1671 -518 587 -1560 577 -1588 587 -1580 1681 -482 609 -1558 1677 -520 581 -1576 1663 -530 1659 -518 1673 -514 1691 -504 1697 -510 587 -1572 575 -1564 591 -1570 603 -1574 577 -1568 579 -1578 579 -16430 599 -1564 1693 -484 1695 -486 1675 -500 1713 -484 1709 -488 579 -1568 593 -1576 603 -1570 1665 -520 581 -1560 1699 -482 603 -1580 1677 -518 1667 -520 1671 -488 1711 -482 1699 -516 599 -1570 577 -1578 577 -1568 579 -1570 617 -1566 581 -1560 587 -16424 629 -1542 1677 -482 1695 -514 1687 -484 1711 -494 1675 -514 571 -1584 587 -1572 599 -1542 1695 -520 585 -1544 1701 -510 593 -1568 1665 -514 1689 -506 1669 -508 1679 -528 1669 -520 579 -1576 579 -1568 581 -1582 581 -1578 579 -1568 615 -1564 585 -16412 631 -1540 1683 -516 1671 -510 1653 -506 1691 -518 1671 -514 601 -1570 577 -1578 577 -1578 1665 -498 603 -1566 1693 -514 563 -1576 1699 -506 1663 -514 1701 -478 1687 -520 1669 -500 603 -1568 605 -1558 589 -1574 601 -1542 607 -1576 577 -1576 577 -16434 597 -1534 1695 -516 1687 -488 1707 -486 1683 -518 1693 -496 583 -1574 599 -1542 605 -1578 1665 -500 611 -1550 1711 -478 605 -1558 RAW_Data: 1679 -518 1675 -502 1699 -482 1693 -506 1679 -510 613 -1562 581 -1590 569 -1570 605 -1560 587 -1572 599 -1542 607 -16400 625 -1560 1669 -508 1677 -518 1667 -518 1695 -486 1709 -464 601 -1566 607 -1560 589 -1576 1691 -476 615 -1562 1677 -486 625 -1542 1709 -486 1703 -484 1697 -520 1673 -506 1695 -498 585 -1570 603 -1544 609 -1572 579 -1570 583 -1580 581 -1582 579 -16410 629 -1524 1715 -484 1679 -518 1673 -516 1663 -518 1697 -504 583 -1576 577 -1592 587 -1552 1681 -514 579 -1580 1681 -516 577 -1566 1705 -494 1689 -488 1705 -486 1695 -520 1675 -522 587 -1574 579 -1584 581 -1576 599 -1570 575 -1578 579 -1564 613 -89724 99 -1166 129 -1158 167 -532 163 -98 361 -198 299 -298 197 -66 2489 -66 3797 -66 1937 -66 1479 -98 557 -66 361 -66 1709 -66 6741 -98 1889 -132 5693 -68 7367 -100 8643 -100 2655 -100 3727 -66 1023 -66 865 -66 1161 -100 6287 -66 3987 -66 1961 -132 3307 -68 2183 -66 2429 -132 4179 -66 753 -66 461 -66 621 -64 5761 -100 331 -66 1683 -198 465 -66 629 -68 7341 -66 357 -198 261 -66 593 -234 331 -100 593 -64 293 -64 1611 -100 459 -100 297 -100 561 -134 1725 -66 6901 -100 1407 -68 8017 -200 1989 -66 5721 -100 199 -166 1251 -66 359 -130 9965 -66 4361 -100 819 -100 1051 -66 2187 -64 555 -66 861 -66 5889 -66 RAW_Data: 361 -4326 2555 -28090 65 -302 65 -1890 131 -2062 2547 -95068 2565 -48020 67 -47036 2551 -30016 2561 -47778 67 -14884 2481 -95118 2537 -95132 2549 -48496 65 -21526 2571 -16342 97 -4142 65 -1938 2543 -95008 2551 -44030 1579 -548 1469 -588 433 -1568 469 -1540 479 -1550 1489 -538 473 -1574 1467 -538 1493 -566 443 -22130 693 -3742 321 -1702 341 -1690 1353 -628 391 -1666 1401 -584 1445 -596 391 -22192 1487 -554 1471 -550 447 -1584 453 -1568 445 -1578 1469 -550 459 -1598 1465 -540 1461 -576 445 -22164 1479 -546 1501 -544 453 -1568 447 -1580 445 -1584 1451 -560 443 -1594 1473 -548 1479 -556 441 -22160 1475 -548 1487 -554 449 -1578 451 -1586 451 -1572 1469 -552 449 -1578 1473 -558 1469 -552 449 -22142 1507 -546 1479 -548 457 -1574 447 -1580 447 -1584 1475 -554 441 -1592 1465 -546 1473 -546 483 -22132 1157 -1082 67 -166 65 -198 65 -1150 257 -1706 339 -1666 365 -1642 1409 -610 407 -1626 1417 -620 1435 -580 409 -22184 1495 -572 1463 -552 447 -1584 453 -1574 447 -1580 1473 -548 459 -1568 1501 -520 1501 -552 463 -22124 535 -7674 339 -1680 1345 -678 361 -1664 1395 -618 1411 -646 373 -22194 1511 -526 1477 -550 483 -1542 479 -1562 471 -1566 1483 -546 445 -1574 1471 -534 1497 -548 483 -169938 2539 -89172 167 -5768 2551 -93014 967 -252 1571 -5844 2503 -87590 65 -5948 2523 -64008 1605 -520 1473 -554 449 -1584 449 -1576 447 -1546 1505 -546 451 -1574 1469 -546 1475 -548 459 -22160 1525 -506 1501 -516 479 -1550 469 -1570 469 -1570 1471 -538 471 -1568 1489 -516 1501 -554 443 -22152 1507 -522 1511 -518 481 -1580 451 -1542 483 -1548 1505 -546 451 -1570 1471 -552 1473 -548 455 -22180 1505 -522 1501 -544 451 -1560 475 -1548 481 -1556 1477 -552 475 -1546 1505 -516 1517 -516 473 -22148 1515 -518 1499 -546 485 -1570 443 -1580 447 -1582 1475 -526 483 -1548 1507 -546 1479 -558 449 -22138 1495 -586 1437 -616 403 -1594 429 -1608 417 -1606 1465 -556 433 -1606 1465 -536 1499 -544 445 -22170 1401 -792 1245 -770 271 -1716 325 -1680 359 -1664 1397 -620 393 -1644 1407 -614 1433 -586 429 -22202 1477 -572 1469 -548 449 -1576 457 -1578 479 -1544 1473 -590 429 -1570 1491 -540 1509 -554 429 -22196 1481 -556 1467 -580 439 -1592 431 -1608 415 -1608 1441 -586 463 -1568 1467 -552 1489 -534 473 -22166 1485 -574 1469 -580 453 -1572 443 -1578 447 -1578 1477 -554 447 -1580 1479 -550 1481 -550 475 -22160 1525 -542 1467 -540 483 -1574 447 -1582 451 -1578 1481 -558 447 -1560 1493 -550 1505 -544 449 -22182 1435 -646 1391 -664 369 -1642 385 -1652 395 -1600 1463 -584 417 -1606 1467 -576 1443 -586 429 -148588 275 -106 847 -128 877 -100 281 -97826 2541 -92318 2505 -12474 2563 -73674 2555 -41600 2543 -76554 1601 -516 1471 -554 RAW_Data: 487 -1556 453 -1570 441 -1590 1467 -556 469 -1538 1501 -522 1501 -552 463 -22124 1513 -514 1509 -548 445 -1582 461 -1568 443 -1574 1467 -536 465 -1574 1499 -516 1503 -556 441 -22150 1537 -484 1495 -544 479 -1558 459 -1574 447 -1580 1471 -548 459 -1576 1471 -554 1471 -550 459 -22160 1517 -516 1503 -546 447 -1574 473 -1546 481 -1576 1479 -520 467 -1572 1497 -550 1469 -556 441 -22156 1533 -528 1495 -530 469 -1568 445 -1566 485 -1548 1505 -544 451 -1572 1471 -554 1503 -516 495 -22160 1511 -520 1477 -546 483 -1542 485 -1546 481 -1542 1509 -526 455 -1578 1507 -544 1481 -524 485 -22146 1543 -510 1481 -552 475 -1546 473 -1568 481 -1540 1503 -522 473 -1556 1507 -558 1491 -518 479 -22164 1523 -520 1503 -544 453 -1566 479 -1550 469 -1572 1493 -546 447 -1576 1477 -552 1509 -544 451 -22178 639 -596 65 -926 63 -1954 237 -1680 355 -1670 383 -1636 1423 -596 439 -1578 1471 -574 1465 -576 445 -22182 1439 -676 1335 -702 339 -1648 387 -1648 409 -1608 1429 -618 419 -1612 1447 -578 1439 -614 425 -22186 1497 -530 1505 -556 471 -1540 479 -1582 431 -1570 1497 -546 481 -1536 1497 -554 1501 -556 463 -22178 1503 -566 1433 -586 433 -1604 445 -1576 441 -1580 1503 -548 453 -1572 1473 -578 1467 -558 469 -149080 311 -1034 895 -1084 939 -1006 337 -78790 97 -6890 2535 -28048 2511 -64482 2573 -88138 65 -6956 2515 -95140 2509 -61986 1589 -522 1475 -548 449 -1576 475 -1548 481 -1546 1475 -564 443 -1564 1477 -580 1477 -554 449 -22166 1503 -532 1481 -544 447 -1576 449 -1572 473 -1548 1473 -580 451 -1568 1463 -552 1477 -552 461 -22164 1521 -528 1493 -548 443 -1580 461 -1540 475 -1574 1473 -554 471 -1568 1489 -516 1497 -538 471 -22154 1385 -786 1245 -796 261 -1702 341 -1650 391 -1644 1411 -608 409 -1620 1415 -624 1409 -614 413 -22178 1533 -498 1519 -546 445 -1576 449 -1578 457 -1568 1503 -546 451 -1570 1467 -554 1503 -552 463 -22162 1401 -774 1257 -754 297 -1678 353 -1650 383 -1666 1397 -618 385 -1642 1437 -612 1433 -586 427 -22194 1483 -552 1477 -546 485 -1544 453 -1576 481 -1576 1479 -560 449 -1548 1507 -546 1479 -558 447 -22170 1413 -786 1245 -776 295 -1664 337 -1680 387 -1652 1385 -638 407 -1614 1441 -582 1451 -606 409 -22204 1503 -528 1507 -550 465 -1534 481 -1584 429 -1572 1497 -548 447 -1580 1481 -550 1503 -546 455 -22166 1519 -552 1469 -580 419 -1612 419 -1596 447 -1582 1479 -554 447 -1582 1479 -550 1519 -518 479 -134730 169 -172 559 -194 579 -676 257 -87040 99 -7384 2269 -488 313 -37888 65 -12084 2515 -33298 2247 -474 309 -42656 63 -51970 2233 -456 309 -94658 2233 -430 325 -90692 357 -186 2417 -518 1517 -514 475 -1550 467 -1570 471 -1538 1499 -556 443 -1564 1483 -552 1501 -524 RAW_Data: 481 -22144 1433 -668 1373 -666 337 -1680 355 -1634 383 -1634 1431 -622 399 -1606 1443 -582 1443 -586 431 -22166 1521 -512 1497 -548 447 -1580 459 -1568 447 -1574 1473 -554 465 -1572 1497 -516 1507 -554 453 -22148 1503 -540 1489 -546 479 -1542 449 -1578 457 -1576 1475 -546 483 -1540 1507 -552 1473 -548 453 -22154 1539 -516 1469 -586 431 -1574 447 -1576 479 -1558 1485 -554 439 -1580 1501 -550 1457 -552 473 -22154 1521 -550 1485 -540 447 -1578 457 -1578 447 -1572 1471 -556 485 -1540 1483 -552 1501 -556 443 -22186 1437 -662 1345 -704 339 -1688 361 -1646 375 -1640 1399 -616 421 -1612 1441 -614 1435 -586 429 -22200 1513 -520 1503 -544 453 -1572 447 -1580 483 -1550 1475 -552 475 -1548 1501 -554 1491 -540 475 -22184 1499 -530 1485 -548 457 -1570 477 -1578 443 -1576 1501 -546 449 -1562 1499 -538 1493 -572 443 -22166 1471 -612 1429 -624 401 -1608 417 -1620 431 -1600 1461 -582 419 -1610 1441 -582 1473 -548 459 -205658 1761 -436 863 -68558 2597 -23434 1775 -438 519 -94592 1803 -422 829 -86706 1727 -434 527 -66 319 -94536 1753 -444 865 -238 1489 -652 1385 -656 357 -1668 365 -1628 403 -1612 1439 -614 403 -1626 1425 -588 1443 -584 409 -22168 1531 -528 1491 -530 469 -1568 443 -1564 483 -1538 1505 -546 455 -1570 1469 -556 1503 -518 491 -22128 1455 -660 1359 -686 355 -1632 385 -1632 411 -1640 1411 -596 423 -1606 1437 -580 1443 -596 423 -22188 1495 -550 1467 -534 473 -1566 481 -1540 483 -1572 1477 -552 449 -1582 1477 -558 1471 -552 449 -22174 543 -3692 235 -1680 357 -1668 353 -1698 1375 -636 371 -1644 1409 -610 1437 -578 449 -22180 1499 -542 1491 -542 479 -1540 481 -1566 449 -1562 1499 -554 465 -1568 1463 -554 1493 -536 473 -22168 1405 -774 1257 -788 267 -1676 355 -1672 369 -1660 1387 -624 417 -1606 1427 -624 1425 -586 415 -22208 1507 -552 1489 -548 443 -1562 483 -1550 481 -1546 1505 -558 447 -1586 1473 -548 1481 -554 479 -22166 1383 -786 1245 -776 295 -1664 373 -1646 387 -1644 1403 -642 411 -1624 1417 -594 1445 -612 409 -22210 1515 -516 1503 -554 453 -1564 457 -1572 447 -1580 1501 -554 465 -1570 1467 -554 1493 -570 443 -195814 1353 -442 1267 -37900 99 -53710 411 -142 2207 -8336 2487 -46990 1301 -452 1317 -86162 65 -8376 1289 -444 1327 -94552 1311 -488 1251 -1726 1531 -544 1467 -580 417 -1578 457 -1578 443 -1576 1475 -566 441 -1568 1503 -512 1509 -526 455 -22168 1473 -582 1469 -538 483 -1538 459 -1574 447 -1580 1471 -582 429 -1572 1469 -552 1473 -548 461 -22170 1437 -640 1401 -620 393 -1636 385 -1634 409 -1604 1457 -588 415 -1608 1431 -590 1459 -554 449 -22188 1483 -556 1487 -542 445 -1578 459 -1576 443 -1574 1473 -556 469 -1570 1459 -550 1503 -554 443 -22160 1469 -590 RAW_Data: 1469 -582 409 -1620 429 -1608 415 -1602 1455 -568 441 -1578 1475 -552 1479 -560 467 -22166 1483 -572 1463 -546 451 -1580 453 -1580 481 -1542 1475 -588 451 -1570 1453 -550 1503 -540 469 -22158 1505 -554 1475 -554 487 -1556 453 -1562 477 -1546 1495 -546 479 -1544 1511 -554 1477 -532 471 -22180 1471 -602 1437 -602 407 -1610 421 -1614 421 -1606 1433 -582 457 -1578 1475 -550 1469 -586 465 -22164 1515 -546 1469 -546 483 -1572 447 -1558 471 -1580 1471 -578 451 -1568 1495 -542 1497 -530 471 -22194 1433 -644 1393 -662 371 -1640 385 -1642 413 -1628 1431 -584 431 -1602 1469 -540 1501 -576 443 -22180 1479 -592 1439 -608 407 -1620 427 -1610 415 -1606 1465 -570 441 -1612 1441 -586 1451 -576 445 -22196 1533 -522 1489 -540 477 -1574 481 -1544 455 -1568 1505 -546 459 -1572 1501 -556 1497 -530 471 -210202 685 -540 475 -138 839 -138 239 -9950 2501 -71112 761 -462 511 -66 1297 -85614 97 -8850 745 -466 1821 -94546 827 -468 481 -140 815 -164 237 -32934 1583 -540 1477 -554 441 -1582 447 -1580 453 -1568 1465 -554 479 -1556 1487 -558 1477 -550 453 -22174 1503 -516 1483 -584 429 -1572 449 -1576 447 -1588 1475 -558 449 -1580 1473 -546 1485 -556 449 -22168 1469 -586 1443 -614 401 -1624 401 -1608 415 -1608 1463 -570 441 -1574 1471 -586 1449 -572 445 -22164 1401 -772 1255 -756 301 -1674 353 -1708 329 -1662 1397 -650 387 -1632 1405 -614 1433 -584 431 -22200 1489 -566 1463 -582 419 -1580 457 -1596 447 -1576 1473 -554 443 -1580 1469 -582 1451 -550 479 -22174 1387 -786 1251 -792 257 -1704 331 -1690 337 -1706 1377 -632 395 -1632 1433 -586 1451 -584 413 -22198 1541 -512 1485 -554 481 -1574 445 -1560 461 -1568 1495 -556 469 -1568 1495 -518 1503 -554 469 -22160 1541 -516 1501 -556 443 -1564 495 -1536 479 -1550 1517 -544 445 -1576 1507 -556 1485 -542 445 -22202 1501 -530 1503 -554 465 -1574 445 -1582 461 -1574 1469 -546 479 -1568 1471 -556 1513 -550 463 -22170 1473 -614 1419 -602 439 -1614 417 -1610 415 -1590 1465 -588 429 -1606 1469 -586 1455 -570 441 -22200 1407 -760 1277 -772 267 -1692 363 -1678 355 -1668 1393 -660 369 -1642 1441 -584 1449 -574 445 -22206 1533 -528 1497 -530 471 -1572 449 -1576 455 -1578 1507 -544 455 -1572 1503 -556 1467 -560 469 -22188 1439 -678 1347 -672 375 -1648 393 -1646 387 -1636 1431 -588 431 -1610 1439 -618 1437 -596 437 -143610 67 -510 99 -66 223 -272 173 -70 273 -204 235 -64 483 -26542 2521 -65448 297 -348 2417 -76720 65 -8388 65 -9450 203 -332 587 -72 885 -92 899 -27534 67 -39500 221 -406 521 -72 885 -98 919 -29920 1581 -534 1491 -548 445 -1580 461 -1544 477 -1574 1465 -556 473 -1568 1455 -554 1501 -524 483 -22136 1529 -498 RAW_Data: -754 361 -17246 131 -8734 65 -71908 65 -27774 65 -1230 65 -13826 99 -800 65 -634 67 -796 99 -47716 65 -18338 67 -18176 131 -7986 65 -1084 131 -2090 65 -48694 163 -40926 65 -4538 65 -10224 65 -9874 20955 -1970 1023 -4928 1007 -4946 1011 -7910 981 -1992 1021 -7898 1013 -1962 1007 -7896 1019 -4930 995 -4962 987 -1974 1029 -4924 1019 -4920 1025 -7896 1005 -1964 1027 -7894 1007 -4932 1033 -1948 1009 -7916 1009 -1982 1001 -4942 1011 -7880 1011 -2000 1003 -13820 1011 -1990 985 -4944 1021 -4932 995 -7916 1025 -1944 1025 -7892 1015 -1970 1025 -7892 1001 -4934 1031 -4926 1015 -1970 989 -4938 1007 -4954 1019 -7874 1013 -2000 985 -7896 1011 -4950 1001 -1968 1023 -7900 999 -1968 1007 -4968 973 -7936 985 -1970 1009 -13856 1013 -1968 981 -4962 1009 -4926 1005 -7924 1003 -1968 1013 -7892 1003 -1992 985 -7904 1011 -4936 1023 -4948 997 -1960 1015 -4950 987 -4970 993 -7896 1005 -1970 1009 -7928 1005 -4914 1023 -1984 1001 -7894 1011 -1970 999 -4962 1003 -7890 1007 -1992 1013 -13810 1011 -1994 987 -4938 1005 -4964 999 -7904 1013 -1974 987 -7910 1021 -1964 1015 -7894 1021 -4912 1019 -4948 1007 -1970 1017 -4916 1021 -4946 985 -7914 1003 -1972 1009 -7898 1041 -4912 1013 -1994 985 -7892 1027 -1964 1013 -4938 1003 -7904 1023 -1966 1017 -13824 1025 -1968 983 -4950 1007 -4944 999 -7900 1029 -1964 1015 -7914 981 -2000 981 -7932 979 -4936 1021 -4926 1013 -1998 979 -4946 1035 -4908 1031 -7896 999 -1964 1025 -7902 1021 -4914 1023 -1966 1015 -7908 1007 -1970 1003 -4952 981 -7910 1001 -1974 1003 -13832 1015 -1976 999 -4958 1019 -4938 985 -7900 1025 -1966 1011 -7914 1015 -1964 1009 -7906 1017 -4908 1027 -4916 1011 -2000 981 -4954 1007 -4926 1017 -7920 1011 -1958 1009 -7906 1019 -4912 1025 -1980 1009 -7900 1013 -1948 1027 -4916 1011 -7918 1005 -1976 1003 -13846 1013 -1970 1005 -4914 1041 -4916 1007 -7918 987 -2000 987 -7902 1013 -1970 1015 -7894 1007 -4936 1019 -4944 1009 -1970 1013 -4918 1019 -4954 977 -7914 1019 -1964 1007 -7906 1003 -4956 983 -1982 1027 -7896 1005 -1962 1027 -4930 1007 -7906 999 -1972 1009 -13850 1009 -1952 1027 -4944 983 -4954 1023 -7894 1007 -1952 1031 -7882 1035 -1970 1011 -7894 1007 -4936 1025 -4920 1023 -1968 1011 -4928 1009 -4920 1015 -7902 1015 -1966 1021 -7894 1011 -4948 997 -1970 1009 -7902 1027 -1978 1011 -4930 999 -7918 1007 -1966 1013 -13824 1015 -1966 1027 -4918 1027 -4912 1021 -7888 1009 -1998 989 -7918 1019 -1960 989 -7930 983 -4946 1025 -4920 1013 -1970 1015 -4950 1009 -4926 1005 -7892 1037 -1942 1011 -7926 1005 -4918 1007 -1996 985 -7928 1011 -1964 993 -4946 1025 -7880 1003 -1972 1009 -13854 1011 -1948 1019 -4956 983 -4946 1025 -7898 1003 -1966 1025 -7900 1019 -1964 1011 -7890 1021 -4912 1017 -4930 1013 -1968 1015 -4952 1009 -4932 1007 -7920 1009 -1972 979 -7924 1009 -4944 1003 -1970 1015 -7894 1017 RAW_Data: 131 -534 99 -798 2211 -134 297 -66 361 -66 197 -198 97 -398 199 -100 163 -100 65 -464 133 -134 233 -68 229 -696 199 -200 265 -330 65 -1218 163 -166 97 -426 229 -698 165 -100 99 -134 165 -372 65 -1426 65 -266 99 -794 65 -832 199 -464 165 -698 99 -266 165 -794 99 -298 133 -734 165 -266 99 -864 131 -232 1893 -166 1465 -1484 263 -560 99 -230 65 -462 197 -66 97 -890 165 -130 97 -132 163 -232 97 -132 161 -162 263 -262 99 -362 65 -432 65 -830 97 -234 99 -628 199 -66 99 -166 101 -268 265 -594 131 -1030 97 -1156 595 -800 167 -1920 65 -464 165 -264 131 -66 167 -134 233 -632 329 -100 97 -166 199 -466 199 -98 267 -200 97 -266 199 -300 65 -496 563 -100 101 -166 165 -730 233 -166 131 -590 97 -232 131 -164 359 -428 3159 -792 65 -624 197 -98 229 -132 393 -398 199 -200 133 -366 99 -132 67 -528 265 -730 197 -166 65 -200 397 -1358 131 -1712 363 -1462 299 -132 67 -1792 65 -794 99 -368 131 -134 165 -134 67 -266 265 -430 2315 -98 1473 -100 129 -66 229 -198 261 -166 97 -426 97 -100 229 -496 197 -162 163 -392 231 -166 229 -660 131 -366 297 -166 299 -232 97 -332 301 -866 133 -596 267 -364 99 -502 99 -1988 131 -134 65 -66 165 -366 231 -266 165 -690 99 -234 65 -498 67 -166 133 -762 2459 -166 1019 -264 99 -200 265 -562 65 -328 295 -330 197 -360 131 -98 227 -232 65 -426 259 -166 99 -496 131 -500 399 -992 67 -432 133 -66 99 -1394 231 -1524 133 -430 65 -886 65 -1716 131 -2818 63 -430 229 -296 97 -1706 131 -164 65 -1478 131 -458 99 -1568 165 -756 197 -890 99 -1088 359 -660 97 -98 229 -166 65 -500 99 -266 65 -566 65 -432 365 -200 99 -798 99 -296 327 -1218 165 -132 99 -466 165 -168 133 -632 363 -1482 163 -802 131 -862 133 -1332 65 -100 431 -830 97 -596 165 -3422 99 -896 65 -766 97 -3766 65 -132 65 -1152 163 -1810 99 -230 97 -654 229 -458 165 -200 67 -166 297 -134 99 -4840 133 -762 67 -764 231 -1248 97 -1780 97 -3332 65 -100 261 -1186 99 -3360 99 -364 97 -1738 163 -294 97 -4918 129 -1550 295 -1028 199 -1264 99 -1560 99 -2156 167 -1556 231 -1852 167 -998 67 -1116 65 -562 167 -334 133 -266 165 -394 99 -166 97 -3082 99 -232 301 -5148 131 -502 67 -732 197 -434 199 -200 99 -432 65 -232 199 -464 133 -1060 97 -1582 97 -98 97 -924 129 -462 229 -560 65 -132 97 -166 161 -164 97 -166 229 -360 97 -132 63 -198 131 -162 525 -1714 67 -732 99 -958 RAW_Data: 65 -1166 165 -200 199 -166 133 -100 65 -1294 99 -166 265 -992 297 -728 65 -332 431 -166 261 -132 65 -132 65 -98 363 -230 163 -430 165 -230 129 -660 129 -66 131 -398 2453 -132 1329 -166 1187 -232 1657 -166 499 -68 99 -132 233 -894 99 -232 99 -134 363 -628 67 -998 131 -234 99 -266 197 -398 97 -200 167 -334 197 -430 429 -168 263 -1160 99 -364 131 -264 97 -1318 131 -790 99 -432 131 -132 199 -100 131 -930 133 -1424 99 -398 165 -1486 299 -166 165 -334 2325 -66 795 -102 397 -100 533 -100 429 -98 131 -464 65 -532 329 -366 165 -332 99 -432 295 -132 99 -662 67 -332 331 -1226 131 -102 199 -562 469 -430 97 -232 63 -328 65 -1914 133 -466 131 -832 163 -1660 331 -464 199 -828 131 -696 65 -132 2139 -66 2051 -66 263 -790 99 -566 429 -428 99 -330 297 -698 65 -200 197 -68 461 -1292 131 -168 165 -634 131 -234 133 -594 163 -360 165 -700 99 -964 133 -1026 65 -532 197 -1520 263 -688 65 -888 295 -658 65 -824 67 -598 97 -426 65 -130 161 -132 63 -658 99 -64 165 -522 199 -298 65 -428 197 -560 65 -200 165 -100 167 -594 229 -100 297 -268 65 -100 459 -200 97 -334 2997 -200 597 -498 97 -626 97 -134 363 -166 333 -266 65 -664 331 -300 299 -568 529 -662 263 -626 67 -594 99 -266 165 -230 361 -462 67 -66 131 -694 397 -1490 167 -132 165 -768 165 -130 165 -466 99 -298 99 -952 163 -428 97 -296 97 -360 99 -196 65 -658 65 -4052 229 -6240 165 -228 65 -426 99 -994 99 -398 363 -1512 161 -2042 65 -592 131 -2866 65 -500 167 -5246 97 -462 67 -1156 99 -2428 99 -960 65 -132 99 -164 65 -166 329 -2484 263 -232 67 -1368 99 -996 267 -498 67 -4612 131 -4866 65 -100 363 -464 231 -264 231 -262 297 -1594 99 -1596 65 -136 133 -1662 67 -1694 429 -1290 197 -198 293 -858 99 -1976 165 -66 97 -460 131 -460 97 -328 163 -1624 397 -300 67 -166 97 -430 299 -300 299 -1792 65 -4438 131 -622 67 -500 131 -1064 65 -400 65 -426 261 -1644 131 -3468 165 -1684 99 -866 101 -66 231 -464 65 -498 133 -492 97 -1712 99 -98 197 -66 265 -1586 199 -1334 99 -1948 97 -200 99 -266 65 -666 131 -132 99 -264 195 -3066 99 -3512 99 -1746 65 -598 97 -6068 167 -600 99 -1262 65 -166 65 -134 65 -132 131 -1520 99 -1254 97 -1828 197 -1294 129 -66 65 -1248 97 -754 165 -6542 231 -662 197 -560 359 -98 97 -130 99 -3080 63 -952 129 -296 65 -230 63 -428 99 -1788 133 -100 65 -462 199 -66 165 -1094 99 -66 RAW_Data: 167 -3190 265 -1128 195 -298 525 -166 65 -594 597 -664 131 -498 165 -232 65 -296 129 -296 65 -494 297 -498 297 -596 201 -332 2027 -132 593 -68 891 -66 893 -98 365 -396 97 -398 99 -300 199 -366 163 -598 99 -100 131 -234 65 -132 331 -532 165 -166 231 -1660 133 -532 265 -100 131 -100 131 -298 199 -396 199 -334 197 -166 67 -334 131 -1662 165 -298 97 -534 65 -628 65 -534 65 -266 97 -826 133 -696 65 -294 233 -198 165 -134 2081 -66 929 -198 167 -300 99 -232 297 -234 199 -662 67 -166 99 -66 233 -132 433 -232 265 -300 297 -132 65 -132 97 -496 199 -360 465 -132 65 -132 297 -460 293 -64 161 -262 97 -492 199 -200 233 -132 97 -396 99 -858 199 -864 65 -66 99 -532 131 -1608 297 -1550 163 -432 229 -66 163 -394 1953 -134 1491 -100 991 -66 165 -232 265 -130 299 -432 167 -724 363 -134 167 -200 231 -66 199 -98 395 -66 165 -266 99 -332 197 -268 265 -466 265 -166 493 -362 65 -132 99 -360 199 -200 133 -758 99 -330 165 -298 163 -428 199 -368 165 -334 131 -500 163 -986 97 -394 329 -196 97 -558 195 -230 97 -532 2373 -232 165 -232 795 -132 267 -168 363 -166 297 -298 131 -134 65 -466 131 -464 65 -232 67 -266 229 -364 231 -232 297 -464 65 -198 133 -398 529 -134 65 -364 163 -732 233 -298 299 -134 231 -66 129 -264 397 -132 131 -200 329 -430 131 -132 265 -1292 65 -362 131 -264 97 -1020 165 -398 131 -364 65 -300 265 -924 195 -396 331 -166 167 -132 433 -198 99 -464 297 -266 165 -396 131 -1226 165 -694 65 -230 197 -896 65 -594 2969 -164 461 -298 133 -330 133 -234 65 -134 131 -66 65 -68 97 -66 99 -132 231 -694 363 -298 267 -268 231 -368 131 -300 99 -134 65 -166 461 -396 263 -66 165 -298 131 -66 229 -1644 163 -1610 229 -658 97 -132 129 -162 97 -428 65 -66 129 -1912 65 -1194 233 -2218 133 -360 65 -132 229 -3428 65 -262 65 -3208 133 -1224 99 -296 65 -2212 65 -496 65 -200 199 -498 65 -1144 65 -1764 165 -1726 65 -434 65 -898 165 -2354 67 -134 99 -464 99 -792 263 -954 1161 -100 295 -296 131 -132 457 -462 363 -200 725 -298 131 -134 231 -68 531 -166 667 -298 99 -66 595 -794 165 -202 199 -68 99 -298 165 -68 231 -202 201 -200 97 -1360 197 -266 165 -334 99 -234 165 -200 165 -100 131 -664 65 -566 397 -100 165 -132 199 -132 165 -988 197 -394 99 -164 65 -294 99 -262 63 -1288 233 -132 199 -168 265 -64 99 -728 133 -1192 65 -334 165 -132 199 -200 RAW_Data: 131 -400 65 -398 165 -866 131 -264 393 -1680 231 -1494 299 -894 265 -364 65 -132 131 -960 99 -296 165 -824 65 -1716 99 -664 97 -134 165 -1526 165 -634 131 -166 135 -466 231 -696 2331 -100 329 -100 961 -198 65 -164 199 -98 331 -132 65 -298 731 -66 163 -332 265 -894 65 -132 265 -300 97 -334 229 -100 65 -1026 233 -366 329 -922 99 -266 329 -428 97 -462 361 -758 163 -1886 65 -498 229 -558 65 -600 267 -68 65 -1592 133 -202 2299 -332 393 -132 329 -326 231 -232 97 -590 231 -136 201 -1226 265 -530 199 -134 65 -232 297 -398 65 -564 65 -1458 65 -500 99 -302 99 -1120 65 -66 131 -98 197 -66 133 -66 65 -730 99 -200 197 -730 165 -664 297 -1462 165 -664 133 -168 65 -168 133 -368 197 -466 1957 -66 1525 -266 131 -366 65 -394 65 -98 163 -296 99 -130 265 -696 65 -398 131 -1128 197 -134 67 -894 97 -296 231 -166 401 -98 131 -928 265 -398 131 -798 131 -298 165 -830 65 -230 231 -168 97 -1252 131 -590 65 -460 229 -692 97 -332 65 -366 265 -732 2297 -66 197 -66 131 -166 231 -100 99 -298 365 -168 361 -130 129 -66 161 -198 97 -626 593 -66 99 -98 99 -556 297 -132 65 -134 65 -526 295 -196 197 -68 163 -264 327 -130 855 -66 393 -132 131 -100 65 -98 227 -164 197 -758 131 -268 99 -430 65 -1686 131 -1652 197 -788 63 -726 165 -100 131 -264 197 -1026 197 -1250 131 -1650 65 -1980 97 -132 63 -1424 97 -198 99 -100 65 -1090 65 -398 99 -1686 99 -754 63 -1714 97 -1842 65 -2988 65 -4980 165 -1624 65 -232 67 -1464 65 -3048 65 -166 97 -1986 65 -1062 99 -862 131 -2732 99 -2360 97 -1620 65 -1326 65 -330 197 -3238 67 -266 131 -2968 67 -132 135 -1688 131 -1718 97 -1648 65 -166 65 -1292 65 -1908 99 -424 131 -1222 197 -798 99 -700 97 -1758 165 -1562 99 -396 165 -166 99 -98 65 -366 65 -762 131 -332 233 -498 133 -98 163 -562 65 -68 131 -858 65 -896 65 -366 233 -532 197 -168 65 -68 65 -630 195 -724 231 -296 361 -164 261 -2862 233 -232 99 -3186 67 -232 163 -496 165 -1620 97 -1622 131 -7022 267 -268 165 -466 63 -528 295 -200 197 -332 65 -1656 131 -5478 65 -1296 99 -130 161 -694 67 -1694 131 -734 99 -2590 99 -1056 65 -432 327 -66 165 -164 65 -1120 229 -1656 165 -1128 131 -1232 99 -1560 65 -568 131 -360 231 -1598 99 -3250 67 -1818 65 -1216 263 -3328 65 -1508 133 -2600 65 -528 65 -2418 65 -460 97 -100 97 -164 65 -1560 133 -1822 163 -296 165 -1090 165 -168 133 -1264 RAW_Data: 229 -1458 165 -66 133 -1626 197 -132 65 -394 65 -724 229 -132 65 -200 263 -296 97 -264 131 -130 229 -132 161 -1230 431 -132 99 -234 233 -362 99 -698 67 -334 65 -366 299 -398 99 -328 131 -396 165 -1458 99 -926 2239 -66 763 -68 1727 -266 65 -364 65 -464 365 -366 97 -664 165 -200 265 -234 261 -264 395 -362 329 -690 261 -164 495 -232 131 -326 165 -264 99 -198 397 -928 299 -268 299 -166 99 -298 167 -436 65 -266 67 -498 231 -896 367 -428 97 -332 133 -628 165 -1394 231 -926 131 -232 3127 -132 921 -428 263 -66 97 -230 97 -1022 329 -430 97 -166 65 -198 63 -100 65 -66 97 -66 361 -132 67 -232 131 -268 99 -366 99 -98 331 -364 99 -428 97 -66 491 -164 99 -164 65 -428 131 -260 429 -1380 263 -1564 65 -300 65 -498 99 -364 167 -200 231 -264 67 -264 365 -266 231 -262 65 -724 65 -130 2213 -130 361 -166 2065 -166 165 -100 133 -264 299 -332 99 -98 229 -198 65 -328 131 -100 263 -628 131 -330 231 -98 65 -132 129 -264 65 -130 163 -692 131 -66 99 -532 133 -234 99 -232 367 -298 401 -702 165 -498 399 -166 65 -132 131 -400 165 -1232 165 -1296 65 -232 165 -300 97 -396 2033 -198 463 -230 67 -68 563 -262 295 -330 197 -1190 197 -66 167 -66 263 -430 263 -100 163 -198 167 -102 165 -100 99 -234 67 -66 267 -396 197 -296 131 -1190 331 -200 67 -234 231 -530 263 -1610 263 -264 329 -196 129 -98 131 -132 227 -132 425 -526 129 -694 299 -856 63 -132 165 -166 165 -436 297 -1430 65 -66 99 -198 167 -266 65 -864 267 -996 65 -500 265 -1456 297 -726 163 -66 579 -1508 523 -1504 509 -1006 1033 -486 1513 -1514 507 -510 1537 -982 1011 -528 1509 -512 1495 -1034 999 -1016 999 -516 1539 -1014 989 -1510 527 -486 1537 -1508 517 -1512 485 -1546 483 -524 1519 -484 1529 -60168 1539 -1506 507 -1006 1015 -1016 1007 -1512 509 -1006 1033 -506 1495 -1544 497 -1014 1007 -1008 1001 -1544 477 -1024 1011 -1538 485 -1512 525 -1010 1005 -482 1529 -1018 1005 -1020 1009 -1532 475 -540 1507 -512 1491 -59188 513 -1506 515 -1512 519 -1020 985 -506 1519 -1538 491 -504 1533 -998 1013 -516 1505 -522 1505 -1018 1005 -1002 1035 -494 1525 -1014 995 -1546 483 -524 1513 -1504 515 -1502 509 -1512 509 -514 1527 -514 1501 -60186 1539 -1506 509 -1008 1003 -1016 1009 -1520 515 -1014 989 -518 1509 -1544 485 -1016 999 -1016 1003 -1544 483 -1016 1017 -1506 515 -1534 475 -1036 987 -520 1507 -1012 1035 -1006 1017 -1502 503 -526 1503 -508 1533 -59160 523 -1508 507 -1502 537 -984 1013 -528 1505 -1504 503 -520 1537 -994 RAW_Data: -1968 997 -4952 1011 -7896 1013 -1954 1005 -13860 985 -2000 979 -4952 1005 -4946 993 -7930 979 -1990 1009 -7908 1017 -1968 1011 -7900 985 -4946 1027 -4920 1009 -1964 1015 -4942 1009 -263646 67 -9708 99 -68890 97 -48712 65 -62028 65 -4652 65 -108870 99 -71758 99 -3200 97 -47548 65 -7036 65 -104448 97 -38184 99 -6502 97 -17756 65 -10136 20983 -1968 999 -4950 1005 -4940 1001 -7898 1025 -1966 1011 -7876 1017 -1966 1023 -7918 981 -4936 1027 -4946 975 -2006 979 -4946 1017 -4954 977 -7930 983 -1980 1003 -7920 989 -4952 1007 -1970 1013 -7896 1007 -1970 1015 -4954 987 -7900 1007 -1970 1007 -13860 993 -1972 1007 -4956 1013 -4926 1005 -7908 995 -1972 1029 -7914 987 -1986 1009 -7906 981 -4956 1009 -4930 1005 -1966 1039 -4938 1007 -4916 1009 -7918 1019 -1968 989 -7892 1017 -4934 1027 -1956 1039 -7898 985 -1974 1007 -4960 981 -7930 985 -1996 989 -13824 1045 -1946 1025 -4928 1009 -4942 997 -7926 1011 -1968 1003 -7894 1023 -1962 993 -7902 1017 -4948 999 -4948 1007 -1968 1015 -4918 1045 -4926 999 -7888 1039 -1972 1013 -7888 1005 -4948 1001 -1970 1011 -7886 1013 -1974 1023 -4942 1005 -7890 1033 -1952 1021 -13806 1047 -1964 1001 -4936 1009 -4950 1001 -7882 1031 -1962 1007 -7906 1021 -1966 1011 -7908 985 -4946 1027 -4918 1011 -1968 1017 -4948 1009 -4932 1015 -7882 1009 -1964 1013 -7900 1017 -4950 1001 -1970 1013 -7916 1013 -1944 1031 -4916 1029 -7888 1007 -1976 1005 -13848 1013 -1968 995 -4952 1003 -4946 991 -7920 1019 -1968 983 -7904 1015 -1966 1019 -7894 1011 -4942 1027 -4924 1011 -1966 1015 -4944 1005 -4926 1007 -7914 1007 -1972 1013 -7884 1013 -4940 1027 -1968 1007 -7906 1001 -1980 999 -4944 1013 -7880 1009 -2000 1003 -13830 997 -1974 1009 -4930 1029 -4938 1013 -7880 1011 -1998 1001 -7908 997 -1966 1025 -7902 1013 -4938 983 -4962 979 -1998 1011 -4932 1005 -4924 1011 -7922 1009 -1970 1015 -7890 1011 -4946 1003 -1970 1013 -7892 1013 -1964 1027 -4928 1021 -7886 1007 -1980 1001 -13846 1013 -1968 999 -4948 1009 -4938 993 -7926 1011 -1964 991 -7926 1011 -1962 993 -7898 1041 -4906 1009 -4960 999 -1964 1023 -4932 1007 -4928 1013 -7898 1015 -1968 1013 -7894 1017 -4948 997 -1968 1031 -7892 1027 -1970 1005 -4914 1039 -7884 1023 -1964 1011 -13838 1013 -1948 1023 -4924 1015 -4942 1025 -7872 1029 -1964 1007 -7898 1025 -1960 1025 -7898 1021 -4912 1023 -4920 1011 -1970 1013 -4954 1011 -4926 1003 -7910 1011 -1968 1013 -7890 1009 -4938 1023 -1982 1007 -7902 1013 -1940 1023 -4926 1011 -7922 1007 -1980 997 -13816 1045 -1964 1001 -4948 1005 -4938 993 -7904 1005 -1966 1035 -7888 1027 -1964 1011 -7906 1015 -4916 1027 -4920 1011 -1968 1019 -4944 1009 -4928 1001 -7924 1009 -1972 979 -7914 1013 -4948 1001 -1970 1013 -7892 1015 -1966 1027 -4928 1021 -7872 1035 -1968 1011 -13832 1011 -1980 983 -4956 987 -4948 1025 -7892 1005 -1966 1007 -7914 1021 -1962 1007 RAW_Data: -7912 985 -4942 1023 -4926 1007 -1992 981 -4944 1035 -4920 1007 -7904 1025 -1962 991 -7934 981 -4948 995 -2004 1007 -7880 1007 -1992 983 -4946 1027 -7890 1007 -1982 999 -13830 1011 -1968 1025 -4926 1013 -4942 997 -7898 1027 -1960 1023 -7910 983 -2000 979 -7906 1015 -4940 1025 -4920 1011 -1968 1013 -225644 65 -2082 65 -155560 133 -5172 65 -1102 131 -48576 99 -24714 67 -6858 65 -1314 67 -38246 65 -64888 65 -4564 67 -59374 99 -20160 99 -17606 65 -42096 97 -11950 131 -29302 65 -19034 99 -32020 97 -366 65 -4430 131 -14620 99 -17318 65 -5556 RAW_Data: 297 -1592 167 -1594 231 -366 65 -598 65 -600 197 -98 199 -1098 99 -98 65 -862 133 -628 165 -597 361 -6828 65 -1668 231 -632 65 -792 163 -1284 163 -5554 199 -1588 165 -5300 97 -992 65 -432 197 -2566 99 -2340 63 -5932 65 -1462 65 -1062 131 -2454 65 -1446 133 -1682 65 -1260 65 -368 131 -1482 65 -134 131 -1512 197 -1710 131 -824 99 -66 133 -464 131 -866 65 -698 65 -200 65 -894 99 -1692 233 -1130 97 -2160 265 -1392 99 -132 131 -166 65 -1318 327 -1548 163 -6980 165 -994 65 -698 131 -1580 129 -132 63 -758 97 -466 99 -1590 395 -1024 97 -600 99 -732 63 -228 129 -98 165 -292 99 -696 231 -232 197 -166 133 -132 131 -430 165 -664 199 -1596 197 -530 65 -1054 63 -3474 165 -4504 65 -2980 99 -268 133 -2356 131 -798 99 -132 99 -796 97 -1692 97 -3804 199 -166 67 -66 97 -132 99 -5058 129 -1512 163 -1290 65 -298 199 -398 65 -1034 65 -1332 167 -3448 65 -1750 65 -1186 131 -462 65 -920 65 -166 97 -362 131 -1704 131 -1748 65 -2124 65 -1064 133 -1694 197 -5148 99 -566 131 -1696 99 -598 65 -698 231 -692 267 -2490 99 -1618 165 -1760 197 -2152 165 -1226 195 -100 99 -66 131 -100 99 -400 65 -456 131 -198 165 -368 261 -826 365 -858 99 -132 163 -460 229 -264 65 -664 165 -234 231 -98 165 -100 99 -1986 99 -2526 65 -832 167 -1762 231 -728 67 -530 133 -2082 97 -960 67 -498 199 -1658 133 -1488 99 -2652 99 -1258 165 -5284 99 -1660 65 -1790 65 -432 65 -3804 197 -2170 131 -196 129 -66 97 -832 99 -2466 97 -1622 99 -1624 163 -394 163 -1018 133 -1856 99 -430 67 -826 197 -3156 65 -166 97 -558 65 -1690 131 -1498 99 -66 65 -2716 161 -658 99 -1054 65 -230 65 -2074 97 -2042 65 -3074 263 -1698 165 -492 65 -400 131 -196 131 -368 165 -134 203 -168 201 -134 165 -398 301 -628 99 -1032 99 -830 65 -66 65 -432 229 -230 161 -394 197 -228 197 -330 327 -66 197 -822 231 -392 131 -892 393 -1456 131 -64 163 -1418 65 -166 165 -1428 133 -1526 163 -954 65 -888 99 -1956 133 -1194 131 -3514 65 -1728 97 -662 67 -1590 167 -2714 65 -930 65 -166 65 -728 131 -2752 65 -434 133 -1828 99 -3704 129 -1912 133 -1544 227 -494 133 -202 97 -466 65 -200 131 -1580 263 -1708 65 -626 65 -626 199 -166 133 -3446 99 -3420 99 -398 131 -1164 131 -7018 131 -3468 63 -1658 199 -956 101 -598 99 -1790 97 -1192 65 -362 133 -630 65 -100 429 -794 65 -696 231 -1130 65 -268 395 -730 131 -466 431 -66 233 -168 197 -998 97 -264 65 -796 163 -236 RAW_Data: 265 -100 133 -1464 99 -464 67 -592 229 -362 131 -262 163 -134 325 -164 163 -130 97 -164 65 -724 97 -132 97 -958 131 -594 131 -264 161 -98 229 -100 97 -890 131 -364 99 -198 97 -262 131 -234 2497 -134 65 -68 165 -400 563 -400 433 -496 99 -100 131 -266 99 -100 65 -200 231 -894 65 -166 463 -200 201 -1228 131 -266 65 -496 99 -300 97 -202 165 -896 365 -132 163 -1698 165 -132 99 -168 67 -166 67 -796 165 -400 131 -200 165 -796 165 -98 2161 -66 65 -166 293 -228 887 -66 395 -656 297 -100 97 -530 97 -66 97 -594 65 -428 97 -332 65 -400 131 -164 261 -66 299 -334 65 -596 97 -166 99 -1184 161 -460 131 -132 229 -398 299 -664 165 -722 165 -166 263 -300 99 -232 199 -266 267 -660 97 -758 133 -530 65 -632 99 -264 329 -1028 67 -166 2451 -562 427 -464 163 -198 229 -264 229 -790 295 -164 297 -132 263 -726 267 -66 99 -364 197 -564 99 -1162 67 -960 97 -198 163 -630 133 -66 163 -132 195 -1288 197 -430 197 -1546 65 -890 97 -394 231 -924 2173 -100 65 -594 165 -100 99 -528 99 -166 99 -298 497 -66 65 -100 131 -198 265 -362 131 -198 293 -294 129 -1150 263 -262 65 -100 131 -494 231 -166 231 -468 99 -66 165 -1262 197 -298 65 -298 397 -432 297 -498 361 -200 65 -466 131 -166 101 -496 231 -364 233 -64 197 -196 65 -426 265 -198 99 -1218 97 -200 67 -232 131 -200 167 -200 99 -66 165 -928 67 -1722 99 -764 65 -892 99 -232 133 -300 133 -1080 621 -1526 487 -1504 507 -506 1517 -1524 519 -1508 509 -1512 447 -546 1503 -1038 1035 -1482 547 -976 1007 -1208 823 -490 1503 -532 1481 -1048 989 -1534 499 -524 1507 -514 1499 -1014 1007 -524 1503 -1530 473 -60198 1533 -1516 481 -1040 985 -1044 981 -1554 479 -1530 479 -1044 1007 -1502 511 -1538 483 -516 1503 -1542 473 -1016 1033 -1510 483 -1542 505 -1002 1003 -508 1521 -1010 1015 -1512 507 -526 1515 -518 1505 -1016 1007 -59156 529 -1528 463 -1580 447 -542 1507 -1544 469 -1554 481 -1512 499 -518 1507 -1016 1007 -1512 511 -1012 1021 -1010 1007 -518 1529 -472 1555 -982 1023 -1502 505 -508 1537 -488 1545 -1012 1003 -480 1531 -1516 507 -60180 493 -12296 821 -1698 299 -1686 387 -590 1465 -1570 459 -1046 979 -1546 475 -1534 489 -1044 1009 -482 1529 -1032 973 -1538 513 -480 1537 -492 1523 -1012 1017 -59154 497 -11798 301 -704 1325 -1148 913 -1612 417 -1102 897 -1118 945 -586 1437 -568 1465 -1058 977 -1534 477 -550 1495 -502 1515 -1006 1037 -494 1527 -1510 489 -60174 531 -16794 355 -640 1399 -1608 449 -1050 989 -1540 461 -1546 477 -1068 973 -518 RAW_Data: 1503 -1024 1009 -1536 473 -552 1503 -498 1517 -1010 1017 -59162 513 -9838 227 -1670 371 -604 1425 -1116 949 -1554 477 -1030 981 -1042 973 -550 1477 -532 1511 -1010 1003 -1544 511 -496 1515 -516 1509 -1018 1007 -488 1539 -1504 503 -60216 1525 -1530 485 -1018 999 -1012 1019 -1538 475 -1546 477 -1012 1025 -1506 517 -1530 505 -510 1507 -1512 513 -1010 999 -1516 507 -1520 513 -1012 1015 -506 1527 -1014 991 -1542 483 -524 1517 -482 1529 -1008 1005 -137640 165 -1660 165 -1362 231 -3114 67 -2286 131 -1652 197 -1448 195 -1648 97 -3534 163 -988 65 -556 65 -132 133 -2594 199 -2054 65 -1918 65 -1458 163 -690 65 -1134 131 -1194 67 -1158 131 -1656 199 -198 99 -298 199 -2676 67 -2122 231 -1762 263 -1560 131 -1228 99 -198 197 -830 99 -166 97 -6274 99 -1058 163 -1676 97 -1788 65 -5742 99 -3890 131 -2682 195 -166 65 -1394 265 -432 99 -368 99 -100 67 -198 163 -564 133 -992 131 -266 133 -962 233 -200 131 -196 231 -560 131 -66 65 -764 131 -1058 133 -564 99 -1792 133 -2820 65 -3480 165 -9536 99 -66 97 -626 97 -1828 199 -1860 99 -66 197 -1060 99 -1746 65 -1690 99 -198 99 -1660 165 -1764 65 -1558 199 -1456 99 -164 65 -1318 395 -5966 131 -928 165 -1026 99 -534 65 -434 99 -100 97 -100 97 -3272 65 -2168 131 -2904 231 -1564 67 -958 263 -3780 65 -166 99 -3506 99 -1594 165 -1492 197 -164 63 -1382 197 -1162 65 -364 133 -822 65 -498 495 -230 165 -366 65 -464 231 -666 231 -198 65 -332 163 -566 65 -164 67 -332 231 -232 265 -198 97 -1254 361 -200 65 -2056 129 -430 131 -100 65 -1588 263 -198 97 -2992 97 -528 297 -134 97 -368 427 -66 67 -132 65 -132 367 -330 65 -266 229 -66 65 -66 65 -198 231 -66 133 -528 363 -162 161 -230 525 -230 65 -230 461 -132 327 -330 295 -130 197 -230 165 -270 265 -464 65 -698 265 -264 229 -400 99 -3476 97 -1490 199 -134 99 -2970 165 -1618 167 -1598 65 -1162 99 -234 167 -1162 135 -464 65 -664 165 -1126 197 -362 97 -1222 65 -3496 65 -7024 131 -1592 131 -530 97 -6464 231 -998 263 -428 65 -698 131 -198 131 -1414 63 -1346 165 -1060 65 -1664 167 -566 263 -666 165 -566 331 -100 131 -1522 167 -368 199 -896 229 -232 99 -968 99 -168 231 -66 197 -68 131 -168 133 -400 131 -268 233 -596 233 -132 97 -494 131 -1710 197 -1616 67 -592 99 -1226 267 -268 65 -266 133 -1986 165 -332 99 -366 131 -2700 97 -1398 65 -130 269 -198 65 -1664 131 -3180 165 -992 65 -866 99 -166 163 -2782 65 -2354 265 -5176 65 -66 163 -1290 67 -164 99 -2584 67 -3084 RAW_Data: 195 -364 65 -164 229 -958 63 -166 193 -130 65 -556 99 -332 199 -430 197 -996 297 -1426 235 -1160 2053 -166 1063 -100 501 -132 535 -198 67 -66 165 -98 165 -460 365 -366 97 -432 329 -264 133 -100 165 -328 197 -360 1087 -264 97 -166 63 -166 233 -98 195 -294 97 -264 163 -266 197 -100 359 -66 65 -1958 165 -694 99 -166 99 -596 299 -466 97 -66 99 -696 231 -1492 297 -1554 165 -1680 165 -368 99 -166 99 -168 65 -794 197 -194 2581 -98 1151 -592 99 -426 197 -328 295 -164 65 -232 163 -530 165 -264 129 -98 229 -294 493 -426 99 -66 163 -164 261 -264 129 -166 229 -68 65 -558 131 -132 65 -132 197 -1550 361 -98 67 -132 99 -132 131 -786 99 -198 301 -366 165 -530 99 -234 2159 -264 1691 -166 367 -132 231 -100 197 -166 97 -366 163 -68 131 -366 165 -268 133 -430 233 -100 133 -132 199 -932 561 -1416 231 -794 199 -1296 165 -564 165 -666 99 -490 97 -760 163 -1582 295 -464 267 -330 2561 -134 931 -66 65 -132 99 -264 63 -132 99 -198 97 -364 129 -460 65 -230 263 -164 163 -100 365 -100 131 -398 97 -530 65 -266 299 -1028 133 -100 97 -166 65 -296 65 -166 133 -498 331 -962 99 -98 199 -1328 165 -200 65 -234 99 -400 231 -632 65 -232 199 -530 65 -866 429 -958 197 -368 165 -668 65 -984 163 -100 129 -1088 259 -752 97 -522 131 -892 65 -298 67 -364 199 -132 65 -788 97 -396 363 -1052 99 -228 131 -98 99 -1526 463 -330 131 -898 263 -332 97 -996 163 -494 99 -2950 65 -798 131 -2490 165 -1424 65 -1694 65 -1822 65 -1756 67 -3820 65 -2536 97 -2410 65 -1030 131 -404 263 -732 165 -1566 197 -1554 199 -400 65 -100 99 -566 165 -3584 65 -764 101 -2630 65 -2896 163 -364 67 -100 65 -1228 263 -232 63 -884 65 -4092 133 -1622 325 -166 99 -2352 65 -500 65 -1324 99 -366 65 -1592 297 -5134 131 -1130 65 -1962 99 -66 99 -1454 67 -1130 99 -134 199 -134 165 -1222 229 -166 131 -464 197 -196 263 -234 99 -534 65 -132 131 -166 133 -134 199 -1590 231 -66 131 -1160 131 -300 65 -698 199 -462 133 -3446 99 -2876 65 -596 65 -1716 133 -2886 97 -134 199 -1628 131 -1790 67 -2556 615 -1510 453 -1584 443 -1566 485 -1014 977 -1054 1003 -516 1501 -1010 1007 -520 1495 -1034 1005 -1530 481 -514 1541 -492 1523 -1012 1001 -1508 521 -1016 999 -512 1527 -1506 509 -488 1521 -1040 989 -1538 473 -60194 1519 -1540 511 -1010 1001 -1020 1009 -1516 515 -1010 1001 -518 1507 -524 1503 -1534 493 -1510 501 -1022 1011 -516 1507 -522 1507 -1512 509 -1506 519 -516 RAW_Data: -130 1115 -68 55471 -1962 167 -1664 99 -364 427 -232 759 -132 199 -100 267 -134 527 -132 99 -1292 99 -266 65 -68 131 -762 327 -98 393 -298 37611 -730 131 -428 1487 -3910 327 -100 295 -98 491 -492 65 -98 197 -860 97 -98 131 -856 131 -134 231 -792 229 -66 919 -198 7527 -7444 131 -722 97 -230 65 -98 527 -100 267 -68 229 -262 361 -528 195 -624 131 -164 495 -66 1697 -66 1791 -132 3715 -8320 65 -394 165 -166 461 -1094 297 -532 131 -764 197 -98 261 -230 165 -100 6235 -12144 265 -600 131 -134 65 -298 233 -958 163 -196 97 -756 263 -98 465 -134 97 -164 3051 -16552 431 -68 131 -166 131 -264 331 -298 561 -166 689 -66 557 -264 3173 -8316 65 -166 531 -298 197 -234 233 -134 233 -892 163 -296 65 -890 161 -232 331 -100 397 -15072 199 -100 99 -394 165 -164 129 -132 197 -132 199 -798 99 -1032 67 -398 427 -100 391 -98 363 -166 297 -66 2869 -66 2299 -12300 97 -660 99 -662 263 -594 131 -662 133 -66 199 -332 97 -134 99 -132 65 -134 131 -100 431 -100 2143 -66 429 -8840 97 -6976 97 -66 397 -66 65 -166 131 -230 131 -294 99 -228 97 -230 129 -756 133 -1298 1293 -132 529 -100 2567 -15654 229 -328 97 -198 131 -66 195 -1492 131 -398 99 -134 99 -366 265 -168 99 -100 235 -100 131 -396 299 -200 1029 -66 6461 -6804 99 -1062 65 -960 65 -232 131 -98 195 -1708 63 -196 261 -164 331 -66 261 -12094 65 -298 265 -198 163 -592 131 -2402 63 -66 297 -198 97 -66 393 -264 4003 -15878 231 -98 261 -496 229 -264 65 -858 131 -994 133 -66 331 -66 429 -100 165 -132 297 -15004 99 -1466 97 -266 165 -198 463 -796 231 -66 131 -298 99 -100 133 -134 167 -430 99 -66 365 -100 297 -134 265 -132 563 -98 1217 -66 6399 -8742 99 -592 99 -426 397 -2338 199 -66 995 -134 229 -132 65 -164 3989 -66 3675 -6962 165 -466 65 -564 399 -66 199 -134 263 -396 97 -132 97 -100 97 -428 393 -624 131 -988 229 -66 363 -230 791 -164 7883 -8286 165 -134 99 -66 197 -100 99 -68 131 -164 163 -398 197 -2162 2005 -66 97 -100 4365 -98 1255 -12012 99 -132 165 -462 65 -166 97 -564 65 -100 331 -794 199 -364 261 -496 331 -132 823 -66 6233 -10976 165 -764 165 -200 195 -296 97 -19176 195 -230 129 -658 131 -132 293 -66 133 -860 65 -858 131 -64 229 -66 227 -66 161 -66 9051 -7316 65 -1494 131 -98 165 -198 65 -134 365 -398 297 -100 3969 -14874 99 -998 65 -564 67 -364 263 -132 163 -528 197 -132 65 -264 65 -264 431 -100 301 -66 297 RAW_Data: -164 6323 -10770 65 -1420 227 -196 263 -198 197 -1086 99 -98 163 -164 163 -426 65 -362 97 -264 295 -132 197 -13586 65 -1808 131 -166 301 -66 465 -432 165 -330 65 -332 297 -962 99 -266 97 -166 265 -132 327 -198 329 -98 293 -14984 99 -862 131 -166 331 -68 165 -98 233 -132 201 -300 197 -364 133 -662 99 -398 99 -166 65 -432 133 -132 1447 -5882 197 -1082 65 -198 163 -1580 129 -264 67 -632 625 -134 165 -68 827 -100 165 -100 99 -164 3949 -9126 67 -164 131 -986 241 -534 309 -208 267 -226 247 -250 247 -248 247 -250 247 -250 249 -250 249 -248 249 -250 247 -250 249 -250 247 -250 249 -250 247 -250 247 -250 249 -504 257 -248 245 -246 247 -248 501 -258 247 -246 245 -248 247 -248 249 -248 249 -504 513 -226 243 -274 243 -500 513 -238 253 -256 253 -492 231 -262 485 -514 223 -244 527 -478 507 -274 255 -218 253 -498 261 -224 251 -250 503 -258 247 -246 243 -246 247 -504 515 -238 251 -472 277 -242 497 -246 289 -220 247 -498 513 -476 255 -68610 311 -208 235 -256 249 -248 247 -248 249 -248 249 -248 249 -250 249 -248 249 -250 247 -250 249 -248 249 -250 249 -248 249 -248 249 -250 249 -504 257 -248 245 -246 247 -248 503 -514 479 -274 253 -256 217 -254 247 -236 255 -250 247 -502 513 -240 251 -256 253 -254 249 -240 227 -252 249 -502 259 -246 245 -246 501 -514 237 -254 473 -280 253 -250 239 -230 251 -250 247 -504 257 -246 501 -226 245 -276 245 -246 245 -248 247 -504 515 -478 255 -244 495 -274 253 -476 511 -240 241 -69142 321 -218 243 -230 251 -248 247 -248 247 -250 247 -250 247 -250 249 -250 247 -250 249 -250 249 -248 249 -250 247 -250 249 -250 247 -250 249 -506 257 -248 243 -246 247 -248 501 -258 247 -246 245 -246 247 -248 249 -248 249 -504 513 -238 251 -254 255 -490 499 -228 253 -250 249 -506 259 -248 499 -478 257 -244 495 -510 509 -238 255 -254 253 -494 227 -254 249 -248 505 -258 247 -246 245 -248 247 -504 513 -238 253 -472 279 -254 491 -226 253 -250 249 -504 513 -478 257 -68880 315 -216 241 -258 249 -248 247 -248 247 -248 249 -248 249 -250 249 -250 247 -250 249 -248 249 -250 247 -250 249 -250 247 -250 249 -250 249 -504 257 -246 245 -246 247 -248 503 -516 477 -274 253 -256 217 -254 247 -236 255 -250 249 -502 481 -272 253 -254 255 -254 249 -238 227 -250 249 -504 257 -248 243 -246 501 -516 237 -254 473 -280 253 -250 239 -230 251 -250 247 -504 257 -248 499 -228 245 -274 245 -246 245 -248 247 RAW_Data: -504 513 -478 257 -244 495 -274 253 -500 483 -232 265 -69136 287 -256 249 -238 227 -250 249 -248 249 -248 249 -248 249 -250 247 -250 247 -250 249 -250 247 -250 249 -250 249 -248 249 -248 249 -250 249 -504 257 -248 245 -246 245 -248 503 -260 245 -246 245 -246 247 -248 249 -250 247 -504 513 -238 251 -256 253 -496 499 -228 249 -250 249 -504 257 -248 499 -478 257 -244 495 -510 509 -238 255 -254 255 -492 227 -256 249 -248 505 -258 247 -246 245 -248 245 -504 513 -238 253 -472 279 -254 491 -228 253 -250 249 -504 513 -478 257 -68886 309 -208 235 -256 249 -248 249 -248 249 -248 249 -250 247 -250 249 -250 247 -250 247 -250 249 -250 249 -248 249 -250 247 -250 249 -250 249 -504 257 -248 245 -246 245 -248 503 -514 477 -274 253 -254 217 -256 247 -238 255 -250 247 -504 513 -238 251 -256 253 -256 249 -240 227 -252 249 -504 257 -248 243 -246 501 -514 237 -252 473 -280 253 -250 241 -228 253 -248 249 -504 257 -246 499 -226 245 -276 245 -246 245 -248 247 -506 511 -478 257 -244 495 -272 255 -474 511 -240 241 -69150 323 -220 251 -242 229 -252 247 -248 247 -248 249 -248 249 -248 249 -250 249 -248 249 -250 249 -248 249 -250 247 -250 249 -248 249 -250 249 -504 257 -248 243 -248 247 -248 503 -258 245 -246 245 -248 245 -250 247 -250 247 -504 515 -236 253 -254 253 -496 499 -228 251 -250 247 -504 257 -248 499 -478 257 -244 495 -510 509 -240 253 -256 253 -492 229 -254 249 -250 505 -258 247 -246 245 -246 247 -504 513 -238 253 -472 247 -272 501 -246 253 -254 243 -494 513 -476 255 -68934 287 -254 213 -240 257 -250 249 -248 247 -250 247 -250 247 -250 249 -250 247 -250 247 -250 249 -250 249 -248 249 -250 247 -250 249 -250 247 -506 257 -248 245 -246 245 -248 503 -516 479 -272 255 -254 217 -256 245 -236 255 -250 247 -504 513 -238 253 -254 253 -256 249 -238 229 -252 249 -504 257 -246 245 -246 501 -514 237 -254 473 -280 253 -250 239 -230 251 -250 247 -504 257 -248 499 -226 245 -276 245 -246 245 -248 247 -504 511 -478 255 -244 495 -256 243 -496 509 -274 253 -69130 309 -218 253 -256 249 -240 227 -252 249 -250 247 -248 249 -248 249 -250 247 -250 249 -250 247 -250 249 -250 247 -250 247 -250 249 -250 249 -504 259 -246 245 -246 247 -248 501 -258 247 -244 245 -248 247 -248 247 -250 249 -504 511 -226 245 -276 243 -500 477 -272 253 -254 255 -494 231 -262 481 -514 225 -246 527 -478 507 -256 241 -244 243 -494 257 -244 243 RAW_Data: -246 527 -228 243 -276 245 -246 245 -500 513 -238 253 -474 279 -254 489 -228 251 -250 249 -506 513 -478 255 -68936 287 -218 249 -236 255 -248 247 -248 247 -248 249 -248 249 -248 249 -250 247 -250 249 -250 247 -250 249 -248 249 -250 249 -250 247 -250 249 -506 257 -246 245 -246 245 -248 503 -514 477 -272 255 -254 255 -218 247 -240 255 -250 247 -502 511 -226 273 -244 243 -244 247 -246 247 -250 247 -506 259 -246 245 -246 501 -512 225 -244 527 -238 251 -256 253 -254 251 -242 227 -508 257 -216 527 -226 275 -244 243 -246 245 -248 247 -504 513 -478 257 -242 527 -238 255 -472 511 -242 281 -119614 299 -200 65 -470 65 -466 297 -630 97 -1592 133 -166 299 -66 231 -100 131 -98 265 -134 165 -166 433 -100 2287 -9916 231 -166 65 -98 199 -166 133 -166 165 -756 65 -724 195 -428 231 -260 263 -98 229 -130 261 -66 163 -264 65 -132 1181 -66 6315 -6798 131 -296 559 -334 131 -166 233 -132 165 -66 133 -264 99 -66 65 -366 99 -630 301 -166 97 -100 167 -164 535 -202 7269 -8266 197 -1022 131 -756 99 -98 99 -164 163 -990 65 -530 163 -230 297 -136 635 -66 2113 -8426 67 -6674 97 -722 197 -362 263 -232 165 -134 99 -234 297 -362 129 -198 131 -556 297 -68 167 -98 331 -200 165 -66 295 -66 8689 -4994 65 -1750 165 -762 163 -864 135 -100 167 -694 1093 -66 695 -102 99 -100 9899 -1650 297 -1216 97 -66 99 -396 65 -198 165 -164 233 -1658 199 -98 465 -134 463 -166 1883 -98 6283 -7302 99 -932 133 -696 263 -298 97 -98 165 -1708 131 -820 229 -98 231 -130 163 -590 131 -130 99 -66 97 -16220 261 -1062 265 -998 197 -1290 97 -362 165 -494 895 -264 7839 -7804 99 -66 99 -364 231 -630 133 -166 427 -496 131 -1252 263 -100 233 -66 133 -132 165 -66 259 -98 3109 -10438 101 -5322 99 -100 65 -666 65 -166 331 -98 197 -132 233 -662 261 -1516 559 -66 263 -130 689 -132 229 -64 3613 -15976 231 -166 133 -66 399 -264 99 -132 295 -366 97 -1692 99 -398 529 -68 397 -130 899 -164 3559 -98 1197 -12106 199 -98 65 -166 99 -266 99 -134 231 -100 133 -132 297 -430 99 -1394 299 -64 397 -166 99 -100 465 -200 331 -132 599 -100 2333 -15214 65 -1230 231 -266 265 -432 165 -398 65 -532 333 -632 65 -232 957 -98 9785 -6320 97 -830 167 -166 133 -732 299 -958 327 -98 197 -66 229 -164 327 -98 653 -66 7993 -6418 65 -1284 97 -458 129 -196 197 -166 393 -134 99 -332 427 -132 131 -66 133 -98 233 -66 133 -364 163 -566 4873 -16030 97 RAW_Data: -360 65 -364 65 -68 857 -98 65 -232 131 -264 63 -98 391 -396 65 -130 99 -98 65 -66 861 -166 265 -166 7611 -10336 65 -1822 165 -300 165 -166 295 -134 199 -100 67 -264 165 -166 99 -500 99 -198 97 -200 165 -268 197 -130 65 -300 629 -166 561 -132 333 -132 7459 -6294 131 -1096 165 -964 197 -332 65 -166 129 -132 99 -130 99 -100 97 -134 65 -164 131 -494 165 -396 97 -164 131 -198 99 -232 229 -66 821 -64 131 -14954 97 -788 65 -100 263 -66 99 -300 65 -400 131 -198 293 -294 163 -132 65 -692 99 -132 131 -200 1847 -132 8773 -5968 133 -330 65 -66 295 -430 197 -166 565 -132 467 -98 65 -430 165 -262 131 -528 131 -296 131 -100 131 -66 557 -166 787 -98 3221 -16236 299 -166 133 -562 199 -1692 99 -66 65 -364 65 -366 231 -168 367 -100 5541 -14968 297 -164 97 -132 163 -328 99 -532 99 -134 131 -370 397 -66 397 -98 293 -98 197 -98 1151 -66 7019 -6746 129 -296 163 -954 261 -230 229 -64 231 -264 431 -100 99 -466 165 -100 333 -166 133 -666 695 -200 67 -134 397 -100 1667 -7686 97 -426 195 -266 97 -330 63 -98 99 -594 97 -132 133 -270 131 -600 131 -362 833 -98 297 -166 199 -66 99 -200 65 -66 197 -100 2963 -98 1125 -2238 199 -554 275 -242 273 -212 271 -242 241 -242 271 -244 241 -244 273 -244 245 -246 247 -248 247 -250 247 -250 249 -250 249 -248 249 -248 249 -250 249 -504 257 -248 245 -246 247 -248 503 -258 247 -244 245 -246 247 -248 249 -250 247 -504 513 -228 243 -244 273 -246 245 -500 513 -478 257 -242 241 -244 273 -244 499 -512 225 -244 525 -228 273 -496 475 -508 507 -240 253 -254 255 -494 261 -222 505 -258 245 -246 245 -246 245 -250 247 -506 513 -478 257 -242 241 -244 273 -244 499 -68858 319 -218 245 -230 251 -248 245 -248 247 -250 247 -250 249 -248 249 -248 249 -250 249 -250 249 -248 249 -248 249 -250 249 -248 249 -250 247 -506 257 -246 245 -246 247 -248 503 -516 477 -274 253 -474 511 -478 527 -484 511 -240 253 -472 281 -254 489 -484 513 -478 513 -480 255 -242 523 -472 507 -276 253 -462 275 -240 491 -258 247 -244 245 -246 247 -502 515 -238 253 -254 253 -492 497 -230 253 -250 247 -250 247 -250 247 -250 247 -506 257 -68880 279 -248 241 -266 223 -252 249 -250 249 -248 249 -250 247 -250 249 -250 247 -250 249 -250 247 -250 249 -250 247 -250 249 -248 249 -250 249 -506 225 -280 213 -278 245 -248 503 -260 215 -276 245 -246 247 -248 247 -250 247 -504 481 -272 251 RAW_Data: -254 255 -254 213 -506 483 -514 271 -254 217 -292 217 -248 497 -516 237 -254 473 -278 251 -488 489 -516 477 -272 253 -254 219 -494 261 -260 481 -260 215 -278 247 -248 247 -248 247 -504 481 -514 235 -290 217 -256 253 -244 497 -69132 311 -212 235 -258 249 -248 247 -248 249 -248 249 -248 249 -250 249 -250 247 -250 247 -250 249 -250 247 -250 249 -250 247 -250 249 -248 249 -506 257 -248 245 -246 245 -248 503 -512 479 -272 253 -474 513 -478 527 -482 513 -238 253 -472 281 -254 487 -486 515 -478 509 -480 255 -242 529 -480 509 -240 255 -496 271 -234 487 -260 247 -244 245 -248 247 -504 511 -226 243 -244 275 -498 479 -272 253 -254 255 -254 249 -238 225 -252 247 -504 257 -68882 319 -188 265 -280 235 -228 251 -250 249 -248 249 -248 249 -248 249 -250 249 -250 247 -250 249 -248 249 -250 249 -248 249 -250 247 -250 249 -504 257 -248 245 -246 247 -248 503 -258 247 -244 245 -248 245 -250 247 -250 249 -504 515 -238 251 -256 253 -256 249 -472 515 -480 271 -256 253 -218 255 -248 497 -482 271 -252 473 -280 253 -490 487 -516 477 -274 253 -256 217 -496 261 -224 507 -258 249 -246 245 -248 247 -248 249 -504 511 -478 255 -244 243 -244 275 -246 499 -69134 311 -208 231 -254 249 -246 247 -250 247 -248 249 -250 247 -250 249 -250 247 -250 249 -248 249 -250 249 -248 249 -248 249 -250 249 -248 249 -506 259 -246 245 -246 247 -246 503 -516 479 -274 253 -464 519 -496 487 -516 477 -274 255 -498 249 -248 469 -514 479 -516 483 -488 277 -254 491 -498 487 -260 247 -498 227 -244 529 -228 243 -274 245 -246 245 -502 515 -238 251 -256 253 -496 497 -226 251 -248 249 -248 249 -248 249 -250 249 -504 257 -68898 247 -274 213 -312 185 -312 185 -312 185 -312 185 -312 185 -312 185 -310 185 -310 185 -310 215 -278 217 -278 215 -278 217 -278 217 -280 215 -532 237 -288 217 -290 215 -276 461 -260 219 -280 217 -280 217 -278 215 -280 247 -506 481 -270 251 -256 217 -290 213 -502 483 -514 271 -254 253 -218 255 -246 499 -482 271 -254 473 -282 253 -488 485 -516 477 -274 253 -256 217 -496 263 -224 507 -260 247 -246 245 -246 247 -248 249 -504 513 -478 255 -242 243 -244 275 -246 499 -69122 319 -220 243 -228 251 -248 247 -248 247 -250 247 -250 249 -248 249 -250 249 -248 249 -248 249 -250 249 -250 247 -250 249 -250 247 -250 249 -504 257 -248 245 -246 247 -246 505 -514 479 -274 253 -476 511 -476 493 -516 481 -270 253 -474 279 -254 487 -484 513 RAW_Data: -478 507 -506 225 -272 495 -482 505 -254 241 -494 255 -242 525 -226 241 -274 243 -242 243 -496 509 -274 253 -254 219 -494 491 -258 249 -248 247 -248 249 -248 249 -248 249 -504 257 -68896 281 -214 241 -260 247 -248 247 -248 247 -250 247 -250 249 -248 249 -250 247 -250 249 -250 247 -250 249 -248 249 -250 249 -248 249 -250 249 -504 257 -248 245 -246 245 -248 503 -260 245 -246 245 -248 247 -248 247 -248 249 -504 513 -238 251 -254 255 -254 251 -474 515 -478 273 -254 255 -218 253 -248 499 -514 237 -254 473 -280 253 -490 485 -516 479 -274 253 -256 217 -496 263 -224 507 -258 247 -248 245 -246 247 -250 247 -504 513 -478 257 -244 241 -244 275 -246 499 -69128 321 -218 241 -230 249 -248 247 -246 249 -248 249 -248 249 -248 249 -250 249 -250 247 -250 247 -250 249 -250 247 -250 249 -250 249 -248 249 -504 257 -248 245 -246 245 -250 503 -514 477 -272 255 -474 515 -480 491 -518 479 -274 253 -474 281 -254 483 -486 479 -512 507 -506 223 -242 527 -482 509 -240 253 -496 273 -236 487 -260 247 -246 245 -246 247 -504 513 -238 251 -256 253 -492 495 -228 253 -250 249 -250 249 -250 249 -248 249 -504 257 -68860 273 -242 233 -256 249 -250 247 -248 247 -250 247 -250 249 -250 247 -250 249 -250 247 -250 249 -250 247 -250 249 -248 249 -250 249 -248 249 -504 257 -248 245 -246 247 -248 503 -258 247 -244 245 -248 247 -248 247 -248 249 -504 513 -238 253 -254 253 -256 249 -474 515 -480 273 -254 255 -218 253 -248 497 -516 237 -252 473 -280 253 -490 487 -514 479 -274 253 -254 219 -496 263 -224 507 -258 247 -246 245 -246 247 -248 249 -504 513 -476 257 -242 243 -244 273 -246 499 -68728 129 -604 249 -242 243 -276 213 -276 245 -244 245 -246 245 -278 215 -278 215 -278 247 -248 247 -248 247 -248 249 -248 247 -250 247 -250 247 -250 247 -504 259 -246 245 -246 247 -248 503 -514 477 -272 255 -474 511 -478 527 -484 481 -272 253 -472 281 -254 485 -486 511 -478 511 -480 255 -242 527 -482 505 -254 241 -494 253 -242 495 -254 241 -244 273 -244 243 -494 509 -238 255 -254 255 -492 489 -260 247 -248 245 -248 247 -248 249 -248 249 -504 257 -129658 99 -98 131 -132 97 -100 97 -132 131 -98 131 -496 297 -266 163 -198 99 -398 165 -626 133 -198 531 -166 67 -66 431 -132 331 -100 65 -132 99 -100 2725 -9960 65 -3686 295 -1552 99 -362 195 -100 887 -98 263 -100 1495 -8372 67 -298 99 -100 131 -332 133 -198 233 -398 65 -1060 99 -164 327 RAW_Data: 2243 -98 331 -100 1129 -66 761 -100 1393 -100 165 -66 2883 -64 357 -66 4703 -68 927 -98 233 -134 461 -66 3855 -134 165 -98 1281 -100 2053 -66 3061 -98 331 -98 8981 -66 365 -66 631 -100 1027 -100 4521 -134 597 -66 3187 -66 2619 -100 3011 -98 1151 -66 953 -100 1423 -66 1755 -166 333 -98 1557 -66 761 -66 865 -66 4837 -132 357 -132 2419 -100 1023 -66 65 -66 2507 -66 131 -66 761 -66 997 -66 333 -100 2259 -68 431 -100 2523 -66 987 -100 363 -66 363 -66 1197 -68 1589 -164 951 -96 5351 -66 697 -100 163 -100 4683 -66 2265 -68 2051 -64 457 -64 3005 -132 1057 -66 2221 -100 1661 -98 695 -100 99 -66 861 -66 1957 -100 731 -132 1857 -100 3177 -98 1807 -98 463 -66 499 -134 1129 -100 3737 -100 1889 -66 263 -98 623 -66 2103 -98 3165 -66 131 -100 195 -66 691 -66 67 -132 531 -66 1857 -100 199 -68 97 -68 197 -68 697 -68 233 -100 3749 -134 1691 -68 3289 -66 3751 -68 65 -100 853 -66 531 -132 1299 -66 1585 -98 65 -98 1577 -66 785 -98 1151 -66 165 -68 397 -100 4255 -100 857 -100 1017 -66 1575 -130 1255 -234 1923 -66 199 -102 301 -66 231 -66 691 -64 227 -64 195 -66 1257 -100 2353 -100 235 -100 1163 -66 5423 -66 2049 -66 1807 -66 523 -198 693 -100 367 -100 597 -100 4013 -100 233 -166 365 -66 1827 -100 1491 -100 785 -64 885 -66 599 -134 2847 -100 667 -100 4943 -98 3319 -98 6729 -98 361 -96 391 -66 723 -132 503 -66 1583 -166 297 -234 2045 -66 1185 -134 661 -66 195 -66 291 -164 523 -98 1679 -134 233 -132 761 -394 855 -100 2003 -164 261 -66 229 -96 953 -66 3889 -66 929 -66 993 -68 3099 -132 1673 -66 1833 -100 563 -100 1131 -100 3219 -232 4411 -100 1095 -100 5315 -100 631 -198 461 -198 1907 -100 1743 -68 863 -132 4013 -64 295 -66 3883 -100 2707 -198 923 -100 2539 -166 629 -100 563 -100 3783 -68 893 -66 2987 -98 2357 -98 1665 -66 599 -66 1259 -232 165 -66 1361 -66 1645 -166 1543 -66 565 -66 401 -134 465 -100 831 -98 2405 -100 1055 -66 2109 -100 1161 -68 431 -100 265 -68 235 -66 463 -66 3453 -100 433 -66 2693 -132 263 -166 729 -134 763 -134 1327 -100 397 -234 795 -68 563 -66 1625 -98 267 -66 4835 -66 197 -66 589 -66 7575 -100 1959 -100 131 -68 297 -134 261 -98 433 -66 1427 -66 2421 -100 2925 -166 1921 -134 1645 -66 97 -132 5423 -100 2423 -98 1065 -66 1715 -132 963 -66 2403 -66 1117 -328 1981 -66 527 -100 427 -164 865 -66 2129 -232 165 -68 165 -66 131 -366 131 -100 2613 -450 RAW_Data: 937 -900 447 -454 969 -884 479 -466 939 -452 935 -454 981 -454 943 -452 955 -458 945 -452 979 -444 943 -486 945 -448 951 -464 977 -440 967 -478 935 -480 951 -456 969 -460 975 -450 973 -450 979 -470 977 -450 981 -910 485 -466 939 -928 489 -448 971 -940 445 -484 951 -928 485 -484 945 -948 479 -456 973 -918 481 -944 451 -928 471 -478 995 -912 487 -472 977 -15948 479 -444 1021 -910 521 -444 995 -942 471 -480 991 -450 1013 -452 1023 -446 1001 -484 981 -486 1007 -458 1015 -470 1007 -450 1033 -452 1005 -480 1005 -458 1013 -470 1007 -482 1015 -450 1023 -482 1009 -462 1015 -468 1011 -484 983 -482 1021 -944 487 -484 1015 -942 471 -486 1003 -948 503 -478 991 -948 501 -478 1031 -914 521 -486 991 -946 519 -916 511 -944 485 -474 1009 -974 487 -482 1015 -16224 521 -468 1005 -970 503 -478 1001 -954 505 -458 1035 -484 1019 -482 1039 -482 1019 -486 1031 -490 1009 -478 1033 -486 1033 -486 1011 -494 1039 -478 1039 -450 1049 -486 1033 -488 1005 -476 1071 -448 1067 -486 1017 -468 1045 -482 1045 -484 1015 -952 515 -482 1043 -944 519 -482 1049 -950 519 -454 1039 -956 523 -484 1011 -960 505 -486 1065 -956 509 -926 539 -944 519 -480 1017 -984 521 -454 1037 -16440 553 -440 1043 -976 507 -460 1069 -940 513 -486 1041 -480 1067 -482 1033 -476 1061 -472 1043 -510 1049 -486 1041 -482 1043 -482 1065 -476 1037 -486 1069 -492 1037 -484 1047 -504 1047 -486 1041 -484 1041 -514 1015 -520 1049 -476 1053 -490 1041 -980 519 -486 1043 -962 507 -482 1049 -994 507 -500 1043 -946 507 -516 1033 -982 517 -478 1049 -984 509 -976 505 -950 527 -490 1039 -980 519 -486 1047 -111258 195 -428 263 -162 163 -362 97 -132 65 -98 163 -132 825 -100 795 -100 1795 -134 587 -66 229 -100 1349 -164 3261 -66 2305 -132 2219 -66 5549 -234 497 -132 201 -66 667 -298 2369 -68 4381 -66 3909 -134 923 -98 723 -100 1651 -168 1197 -100 65 -66 199 -68 195 -100 197 -134 1135 -66 2787 -66 3163 -68 231 -68 197 -100 6675 -100 667 -98 1125 -66 67 -98 2423 -66 2017 -332 2949 -100 1129 -68 1655 -100 1229 -66 1285 -130 163 -132 1315 -66 525 -98 295 -100 131 -64 427 -132 2207 -98 1153 -66 99 -100 697 -98 1397 -166 863 -66 1393 -132 5005 -66 497 -100 1753 -100 597 -66 1667 -66 397 -100 961 -66 763 -134 859 -64 689 -98 1917 -134 199 -234 167 -100 131 -166 2061 -66 1521 -98 759 -100 983 -66 825 -166 459 -66 2049 -166 1615 -100 829 -234 631 -66 465 -66 1493 -68 433 -66 1623 -132 65 -100 1133 -132 3083 -66 199 -132 199 -68 1257 -66 RAW_Data: 265 -68 1061 -98 533 -100 1233 -68 1721 -68 995 -100 2535 -66 4193 -232 727 -100 727 -100 2773 -66 133 -98 399 -134 233 -232 67 -66 497 -100 267 -132 1127 -134 1063 -66 565 -132 97 -132 523 -132 919 -66 891 -66 855 -98 495 -66 3363 -296 3199 -98 563 -66 133 -100 495 -98 1165 -134 1161 -166 1849 -98 853 -132 5647 -134 563 -98 1827 -100 131 -100 1125 -132 1659 -132 265 -68 1121 -66 465 -232 431 -68 3589 -98 197 -68 97 -164 1717 -66 1645 -66 397 -66 97 -68 231 -166 631 -100 627 -66 1757 -66 131 -164 527 -98 1285 -328 1213 -134 2059 -100 1791 -68 931 -66 1611 -66 1511 -66 2211 -66 2597 -100 2545 -98 197 -162 1089 -98 589 -360 495 -132 1685 -202 1095 -100 729 -100 2825 -100 231 -100 567 -100 231 -66 1027 -66 131 -68 525 -132 1613 -232 461 -232 1597 -66 627 -198 231 -98 131 -98 65 -100 1229 -68 2507 -64 1349 -66 195 -134 97 -66 1321 -100 855 -132 163 -132 1151 -100 1025 -164 329 -66 891 -98 951 -132 163 -166 591 -98 1149 -132 955 -66 1329 -98 923 -66 331 -64 4269 -66 797 -134 399 -98 267 -170 197 -100 429 -198 1225 -100 331 -100 231 -132 1463 -100 597 -164 331 -66 1863 -134 659 -98 5507 -100 719 -100 131 -64 655 -164 1579 -98 1423 -130 1381 -98 1317 -132 467 -66 495 -132 361 -132 4417 -98 631 -364 299 -100 1499 -132 267 -68 663 -98 691 -100 2433 -66 953 -98 721 -66 1355 -232 897 -134 897 -134 365 -100 267 -132 2059 -132 199 -102 797 -68 695 -66 601 -66 265 -68 499 -66 1327 -164 1355 -64 1279 -66 3257 -66 1351 -66 131 -96 359 -132 499 -232 623 -96 427 -68 1909 -98 591 -98 4671 -100 4541 -66 1491 -66 3347 -98 1277 -100 1679 -198 295 -130 357 -98 697 -98 865 -100 2817 -66 329 -98 787 -64 1117 -66 3313 -202 1721 -100 199 -100 399 -66 199 -132 1891 -100 235 -100 201 -134 765 -166 761 -132 1529 -66 629 -202 861 -130 3501 -98 1377 -100 1741 -164 1509 -66 735 -68 733 -66 265 -166 2015 -134 131 -100 663 -100 2995 -132 1577 -98 1885 -66 2461 -100 1189 -66 1425 -100 201 -100 1691 -100 199 -98 499 -166 233 -100 233 -134 661 -68 1393 -100 295 -164 2079 -66 1289 -66 329 -198 599 -100 465 -98 3995 -98 199 -268 2045 -264 199 -66 1593 -66 165 -68 1561 -164 629 -66 635 -100 1251 -230 2733 -66 1727 -66 629 -100 1229 -132 731 -66 163 -198 131 -100 693 -66 3223 -68 565 -132 1091 -134 531 -100 3223 -68 729 -100 1527 -134 895 -166 1265 -66 527 -100 201 -200 1463 -66 1233 -132 RAW_Data: 2397 -200 167 -234 1803 -66 821 -100 1351 -66 1687 -100 165 -66 233 -66 1125 -100 2203 -132 197 -98 97 -66 593 -164 4187 -102 529 -66 1161 -68 799 -66 427 -232 263 -66 589 -68 495 -68 197 -100 525 -66 327 -98 427 -130 1551 -66 727 -102 133 -234 265 -98 459 -66 2337 -64 585 -68 297 -68 691 -98 1857 -134 665 -132 365 -66 931 -166 495 -430 689 -196 1191 -98 465 -100 931 -366 1351 -102 3185 -164 1151 -98 2465 -66 2193 -100 331 -134 165 -98 267 -166 1985 -98 889 -132 765 -66 531 -100 1449 -166 457 -98 1715 -66 299 -166 3131 -130 197 -98 817 -294 793 -100 97 -66 3415 -164 1019 -98 1675 -132 197 -100 133 -68 199 -134 3319 -298 297 -66 791 -66 1029 -134 2153 -100 1629 -132 1391 -68 1229 -100 665 -66 2039 -164 461 -64 261 -66 395 -202 395 -166 3159 -134 2253 -166 265 -132 395 -66 887 -98 163 -66 589 -98 227 -130 1151 -230 293 -66 591 -68 527 -132 2883 -100 231 -66 99 -232 761 -134 499 -64 929 -100 167 -300 2259 -100 691 -164 459 -66 493 -132 163 -64 1283 -164 757 -132 295 -264 1023 -100 197 -198 6635 -198 2407 -100 2091 -132 1531 -66 1889 -100 199 -134 3567 -100 2981 -100 263 -198 425 -164 595 -100 231 -68 2691 -66 965 -100 2907 -98 367 -132 885 -198 1721 -100 659 -100 97 -296 495 -166 299 -134 397 -132 699 -66 1165 -66 465 -68 197 -66 659 -66 1543 -66 819 -164 2913 -98 1061 -66 5475 -132 167 -100 1035 -66 3427 -298 429 -166 2723 -66 831 -98 133 -66 133 -66 495 -98 701 -66 1063 -98 1991 -100 3319 -66 263 -66 233 -66 695 -66 593 -132 595 -66 553 -66 459 -66 197 -164 2241 -66 165 -68 959 -98 1587 -166 65 -102 233 -66 465 -134 1227 -100 2359 -66 1959 -198 331 -232 165 -102 531 -100 63 -66 1999 -68 265 -100 429 -66 657 -166 297 -132 823 -100 129 -132 4511 -164 659 -68 299 -66 593 -66 99 -134 65 -100 397 -66 1561 -66 697 -100 429 -66 265 -134 361 -132 195 -130 1319 -66 133 -66 265 -100 397 -268 895 -100 363 -134 433 -66 133 -100 2321 -68 RAW_Data: -98 3573 -98 533 -68 961 -68 729 -132 559 -166 2189 -100 131 -68 657 -100 1387 -132 133 -68 2255 -68 429 -66 231 -134 793 -100 887 -98 361 -166 2141 -66 227 -130 663 -100 759 -100 1161 -134 1821 -66 327 -98 985 -130 757 -132 131 -132 1693 -66 361 -98 1411 -100 591 -132 1025 -66 663 -66 1065 -166 1059 -166 365 -66 723 -100 1659 -132 1883 -98 785 -132 1031 -66 261 -66 2501 -98 297 -66 1195 -100 691 -134 3009 -100 3921 -66 861 -66 363 -132 3361 -132 723 -66 459 -164 163 -164 333 -66 1291 -98 821 -230 591 -164 97 -262 361 -66 689 -66 733 -66 233 -134 1627 -66 533 -66 195 -100 521 -100 493 -98 493 -98 2173 -66 2037 -132 165 -100 429 -132 695 -100 67 -132 465 -68 1491 -100 1257 -66 965 -100 365 -68 929 -132 561 -66 899 -132 597 -132 861 -100 2627 -166 197 -98 2079 -66 2223 -100 1791 -364 895 -132 1027 -132 235 -68 599 -132 829 -66 197 -132 695 -66 133 -66 531 -68 333 -64 563 -66 265 -132 369 -134 2239 -164 4269 -100 793 -66 1495 -198 821 -164 133 -66 867 -66 797 -66 429 -66 365 -166 1729 -168 959 -100 1417 -66 233 -100 2579 -166 993 -164 461 -66 1529 -68 961 -66 1049 -98 1061 -132 2847 -66 229 -66 397 -134 263 -100 3285 -66 4115 -66 1547 -134 297 -132 431 -100 2895 -100 563 -66 1491 -66 399 -100 721 -66 395 -68 399 -66 1289 -66 293 -164 2307 -98 525 -66 3663 -64 927 -132 499 -134 1127 -264 397 -98 399 -198 131 -100 333 -100 663 -164 921 -166 1481 -262 691 -64 659 -64 2167 -98 3689 -100 833 -100 2085 -66 697 -100 595 -66 923 -134 893 -232 265 -98 367 -66 1157 -66 263 -130 1017 -66 623 -66 753 -100 2873 -132 395 -198 2787 -100 861 -132 3847 -100 297 -66 233 -98 1333 -100 495 -100 1325 -134 367 -66 595 -66 361 -230 4931 -66 1821 -98 329 -98 365 -168 333 -300 897 -100 2777 -66 1945 -132 2601 -66 951 -66 425 -98 789 -98 359 -64 1051 -66 1443 -132 851 -98 625 -100 97 -66 731 -232 263 -134 2757 -68 3021 -166 265 -100 1633 -132 427 -66 233 -98 799 -100 1059 -100 263 -98 557 -68 1063 -66 461 -100 1023 -98 163 -198 1481 -132 1227 -98 327 -100 327 -66 1317 -66 1853 -66 1061 -134 1287 -66 1315 -66 1345 -132 723 -66 1225 -68 1463 -166 3261 -98 2883 -66 563 -100 821 -100 2077 -166 3137 -66 565 -66 1355 -234 1415 -132 165 -66 397 -132 493 -132 563 -166 893 -66 1193 -66 1249 -100 333 -132 2083 -66 921 -100 1225 -262 861 -166 1321 -100 895 -100 591 -98 1249 RAW_Data: -98 97 -66 6825 -66 231 -68 14077 -66 1787 -66 1547 -64 2617 -66 2925 -66 1723 -132 1529 -66 865 -166 827 -198 431 -66 495 -66 1121 -198 1327 -100 397 -130 557 -66 97 -100 261 -98 723 -98 557 -98 463 -98 463 -100 325 -66 3703 -100 465 -198 1123 -98 2545 -66 361 -66 857 -64 3455 -132 663 -98 1991 -200 825 -100 919 -98 893 -164 1749 -66 7759 -132 3321 -66 1807 -132 527 -66 393 -100 817 -130 657 -164 1485 -98 2367 -66 4171 -100 197 -130 3665 -134 1059 -132 597 -66 533 -66 1023 -98 1253 -134 2021 -100 231 -100 233 -66 197 -66 199 -66 1961 -168 729 -100 531 -100 461 -98 1361 -100 11161 -100 659 -166 229 -98 1675 -98 1027 -100 2063 -298 431 -100 99 -134 1059 -66 199 -100 763 -134 231 -66 233 -102 1761 -98 331 -68 757 -132 425 -64 457 -132 99 -66 2091 -66 567 -164 2121 -68 2125 -132 595 -200 759 -102 797 -132 1345 -66 429 -132 1019 -66 195 -66 791 -68 1227 -68 797 -132 1591 -200 199 -134 165 -66 1053 -66 559 -98 853 -164 825 -100 329 -98 891 -196 689 -132 657 -100 2341 -98 1119 -66 1883 -100 2607 -100 467 -100 1067 -164 6935 -66 2409 -132 855 -66 1809 -98 1119 -164 65 -66 199 -100 233 -132 931 -132 563 -66 1393 -132 567 -66 301 -68 1295 -66 529 -98 793 -66 131 -134 533 -132 827 -132 731 -332 1251 -98 921 -98 327 -198 361 -234 529 -66 1577 -132 97 -134 199 -100 1099 -68 1193 -132 991 -100 953 -98 2895 -166 1679 -98 161 -130 129 -66 1019 -100 261 -264 531 -100 263 -134 299 -68 495 -98 831 -100 531 -66 1357 -100 2051 -100 229 -98 829 -66 427 -66 859 -134 995 -68 665 -66 1793 -134 361 -100 2349 -66 331 -100 197 -66 1591 -66 959 -66 431 -234 2219 -332 661 -66 1487 -100 3381 -68 261 -164 463 -134 3377 -68 1127 -134 691 -66 529 -132 99 -66 6687 -98 889 -132 197 -164 725 -100 963 -66 2947 -132 327 -132 889 -66 393 -98 1581 -100 193 -130 97 -66 293 -66 1675 -100 1887 -98 2017 -100 597 -66 293 -98 557 -100 259 -98 985 -100 1727 -100 165 -100 301 -232 329 -100 533 -98 727 -100 761 -66 961 -68 2759 -100 2019 -66 855 -230 859 -98 1215 -98 1887 -98 131 -98 819 -166 227 -130 723 -132 625 -66 501 -66 429 -66 831 -66 1291 -66 331 -132 431 -132 1389 -100 265 -166 1461 -66 1907 -490 911 -962 409 -508 919 -944 419 -486 913 -526 915 -480 925 -488 911 -488 943 -476 925 -486 947 -462 945 -482 933 -484 951 -460 977 -440 967 -484 945 -468 945 -466 975 -450 983 RAW_Data: -444 977 -458 975 -456 975 -444 965 -940 485 -430 967 -928 487 -448 981 -910 489 -446 963 -944 485 -430 975 -930 489 -912 485 -896 487 -452 977 -916 509 -454 977 -922 479 -448 985 -15898 487 -456 973 -926 493 -448 1001 -918 481 -484 981 -478 979 -450 1013 -476 977 -450 1017 -476 983 -448 999 -480 985 -484 983 -478 985 -484 981 -480 983 -476 1001 -474 979 -496 973 -486 1015 -476 977 -476 1005 -484 973 -486 1007 -920 505 -456 1011 -918 509 -458 1011 -950 497 -452 1011 -920 507 -458 1007 -950 477 -958 483 -942 481 -480 1003 -918 515 -446 1039 -922 505 -458 1007 -16154 501 -462 1013 -934 517 -474 999 -958 483 -478 993 -484 1037 -450 1027 -482 1027 -452 1037 -482 1025 -444 1035 -490 1009 -482 1013 -484 1001 -484 1039 -474 1003 -484 1045 -464 1011 -480 1049 -446 1037 -492 1007 -482 1013 -510 1005 -494 1005 -970 485 -482 1017 -974 473 -498 1007 -974 481 -486 1047 -948 479 -482 1051 -948 497 -952 519 -938 485 -482 1041 -946 517 -478 1013 -944 503 -472 415 -83640 97 -200 65 -632 131 -300 365 -364 231 -132 1061 -100 3047 -100 1393 -66 499 -66 1091 -66 333 -66 2353 -100 2273 -66 1427 -166 563 -132 1559 -132 427 -100 925 -98 13469 -100 2019 -98 821 -132 1097 -68 297 -100 897 -100 1129 -166 465 -166 961 -66 597 -100 165 -66 267 -100 201 -100 765 -134 297 -66 165 -66 3081 -100 1293 -100 1289 -136 233 -66 357 -66 1155 -166 295 -100 1197 -68 1089 -98 425 -132 1187 -100 523 -98 463 -98 197 -98 131 -98 493 -66 393 -98 2797 -164 359 -232 325 -66 229 -164 625 -98 1215 -164 425 -66 589 -98 195 -66 1083 -100 197 -68 1557 -66 1427 -66 525 -66 429 -132 863 -66 1129 -166 831 -98 265 -98 1183 -66 3157 -100 2735 -98 2819 -166 4645 -66 301 -68 1395 -132 1097 -100 897 -198 629 -200 1419 -132 493 -66 521 -132 697 -100 695 -66 459 -298 859 -66 559 -100 1029 -100 4113 -66 1167 -66 14017 -66 2123 -68 525 -132 861 -100 329 -66 399 -134 1523 -132 327 -64 691 -98 463 -132 1803 -132 853 -166 715 -66 953 -66 525 -98 723 -132 989 -132 461 -98 459 -164 2239 -66 1185 -66 589 -100 1945 -230 1483 -66 399 -66 265 -168 965 -66 197 -168 699 -68 1125 -68 529 -98 491 -66 987 -130 525 -168 397 -66 597 -100 561 -132 1353 -66 391 -132 393 -66 591 -98 557 -98 787 -66 463 -100 199 -134 395 -100 759 -66 295 -130 261 -98 229 -100 99 -100 1595 -66 699 -100 499 -66 595 -98 327 -132 957 -132 331 -100 493 -100 1313 -66 295 -132 197 -198 1279 RAW_Data: -66 9461 -100 329 -68 27921 -66 24331 -68 13415 -66 6439 -98 133 -66 4193 -98 395 -66 653 -66 983 -66 163 -66 955 -132 1791 -66 861 -100 363 -132 1659 -132 667 -166 467 -134 429 -166 265 -66 4065 -98 293 -98 3183 -130 555 -98 163 -162 259 -100 661 -100 7057 -100 931 -100 1297 -66 2559 -98 1193 -100 333 -100 563 -132 65 -100 793 -66 855 -64 659 -100 929 -102 893 -132 689 -66 3475 -68 1361 -198 331 -134 691 -66 295 -66 425 -164 731 -266 921 -100 599 -100 165 -66 227 -98 1091 -66 263 -66 1215 -100 227 -164 657 -66 953 -132 359 -66 1845 -66 1779 -132 753 -164 393 -66 731 -66 1195 -66 533 -66 797 -132 1623 -98 1281 -100 493 -98 659 -98 2417 -166 799 -132 1259 -100 559 -134 595 -166 199 -66 1461 -198 865 -100 459 -66 463 -166 165 -100 497 -66 1097 -66 1579 -100 1449 -98 885 -98 263 -100 1097 -132 627 -68 329 -132 487 -132 427 -132 361 -66 525 -98 687 -66 1161 -100 263 -66 729 -100 229 -98 559 -66 1213 -100 1015 -66 795 -66 5475 -66 4043 -66 1683 -166 1151 -132 429 -98 1447 -68 261 -98 985 -100 429 -100 1289 -198 2269 -132 7999 -98 1591 -132 3233 -66 861 -66 2087 -98 557 -98 719 -66 981 -98 563 -100 199 -100 523 -100 2319 -134 833 -100 495 -132 197 -66 295 -64 989 -66 1059 -198 7343 -66 2023 -66 963 -66 593 -66 2401 -100 491 -100 959 -66 297 -134 999 -132 99 -68 3609 -230 97 -198 1911 -66 265 -100 1195 -132 633 -132 595 -66 1381 -66 491 -66 1681 -100 297 -100 1827 -132 2269 -100 1351 -132 1513 -66 1225 -134 231 -66 1523 -100 363 -200 1227 -66 2943 -66 923 -134 2249 -66 1809 -100 1121 -132 265 -66 827 -98 199 -66 201 -100 3279 -100 565 -132 1689 -66 395 -66 2979 -134 1065 -66 367 -168 3585 -200 463 -100 563 -66 97 -166 2293 -66 265 -134 1255 -132 2401 -66 1579 -166 365 -100 861 -298 261 -98 761 -66 363 -132 657 -130 63 -130 557 -66 131 -130 2041 -100 233 -66 1791 -100 925 -134 265 -100 1063 -100 301 -168 661 -66 657 -64 263 -64 197 -66 1853 -100 663 -98 231 -66 731 -100 5539 -166 197 -68 1423 -134 361 -68 1727 -68 929 -100 1397 -134 1885 -66 1661 -66 265 -66 1183 -66 295 -166 263 -166 165 -66 329 -66 465 -100 1159 -134 697 -100 2443 -100 393 -98 1093 -66 953 -296 787 -132 425 -66 2019 -66 461 -98 1201 -100 397 -132 3551 -100 1431 -264 725 -330 1455 -66 263 -100 531 -296 499 -100 265 -100 163 -66 1145 -132 1313 -98 2101 -98 261 -132 1083 -66 5403 RAW_Data: -66 2223 -66 11583 -66 131 -66 5071 -66 3723 -132 1415 -132 6905 -64 9685 -102 4739 -66 3355 -66 5301 -98 29993 -508 897 -950 437 -490 909 -974 423 -510 935 -486 925 -508 943 -490 937 -494 947 -482 941 -484 979 -440 979 -456 1003 -462 975 -460 971 -458 977 -468 973 -484 975 -472 971 -450 1011 -452 1003 -446 983 -480 979 -450 1017 -908 487 -472 971 -944 471 -450 999 -944 485 -468 977 -918 493 -448 1011 -934 499 -920 487 -914 487 -452 1011 -912 521 -446 1009 -904 517 -468 1007 -16000 531 -444 1009 -908 519 -468 1009 -912 515 -466 1009 -452 1021 -466 1011 -450 1019 -480 1017 -448 1045 -448 1019 -460 1041 -450 1019 -480 1019 -450 1039 -474 1001 -480 1021 -484 1005 -476 1015 -480 1017 -484 1011 -486 1017 -464 1041 -446 1047 -922 503 -458 1037 -946 513 -442 1047 -938 503 -480 1023 -916 537 -450 1049 -926 521 -904 519 -942 519 -450 1055 -910 519 -486 1033 -916 519 -486 1029 -16258 533 -464 1015 -940 515 -456 1053 -946 511 -482 1051 -434 1075 -442 1075 -448 1065 -440 1065 -450 1049 -480 1067 -462 1041 -446 1075 -450 1063 -460 1053 -480 1047 -450 1075 -446 1079 -452 1055 -478 1051 -448 1067 -444 1065 -480 753 -66842 99 -1090 465 -332 131 -68 131 -134 99 -132 167 -200 429 -100 1809 -132 2385 -230 265 -102 597 -134 1025 -66 365 -100 361 -66 825 -168 1331 -100 797 -132 431 -132 299 -198 661 -168 501 -100 463 -164 329 -66 559 -98 391 -98 1085 -198 1939 -66 1871 -164 2251 -134 493 -66 719 -198 361 -98 361 -64 197 -132 391 -164 691 -300 489 -98 2139 -66 1413 -66 1875 -196 557 -66 263 -132 1359 -66 1397 -66 631 -100 793 -132 723 -100 65 -66 529 -134 463 -68 789 -100 227 -66 923 -100 2649 -166 363 -66 395 -200 295 -130 1757 -68 2057 -100 1023 -66 359 -66 391 -132 1679 -66 359 -66 1217 -98 663 -98 463 -100 821 -98 165 -98 1589 -132 2367 -98 559 -132 1079 -100 9617 -66 3669 -134 1787 -68 1679 -132 361 -66 555 -100 661 -66 1523 -100 2057 -198 1025 -66 4177 -100 165 -66 265 -132 465 -134 299 -232 265 -100 1125 -132 1461 -132 1295 -100 499 -132 367 -68 263 -66 331 -66 365 -100 1643 -130 197 -132 997 -98 867 -98 1191 -100 2945 -100 2339 -98 1779 -66 295 -132 597 -66 165 -100 665 -100 463 -66 331 -66 593 -100 459 -68 489 -164 855 -66 261 -64 163 -100 4449 -100 859 -100 699 -132 199 -100 1685 -66 301 -132 2317 -68 231 -100 827 -66 1749 -132 99 -64 1185 -100 329 -100 1253 -66 1127 -98 827 -198 363 -132 265 -134 365 -66 297 -66 1125 -66 261 RAW_Data: -266 29863 -66 2443 -66 5113 -100 5947 -21026 99 -134 301 -132 199 -132 131 -266 163 -196 131 -66 365 -66 465 -98 13819 -98 525 -98 329 -100 893 -66 1259 -66 431 -98 427 -130 1051 -392 463 -200 795 -164 399 -66 1489 -66 1377 -100 1423 -132 597 -100 689 -68 1559 -100 2263 -100 1327 -98 1059 -98 497 -66 595 -132 265 -66 299 -66 199 -66 563 -134 627 -66 165 -134 889 -66 2751 -232 893 -264 231 -66 299 -132 467 -132 861 -68 1263 -164 795 -66 2601 -100 429 -66 1525 -66 961 -98 265 -98 997 -66 233 -68 695 -100 697 -66 795 -66 1195 -66 1223 -68 2173 -66 467 -66 827 -66 535 -68 697 -100 1221 -166 165 -100 365 -132 723 -66 829 -132 2091 -232 265 -66 195 -66 459 -262 499 -100 461 -68 759 -100 1087 -66 259 -164 2845 -66 1365 -98 561 -200 331 -168 201 -166 1397 -198 197 -66 697 -68 1713 -68 293 -134 1317 -66 593 -328 395 -100 499 -132 2251 -100 563 -134 333 -134 1921 -134 1187 -68 561 -132 933 -66 797 -100 631 -100 399 -132 929 -66 2769 -66 851 -130 2047 -66 265 -100 7219 -66 1987 -66 299 -98 2199 -134 1063 -98 2843 -98 655 -132 231 -66 1123 -198 2137 -64 327 -66 3183 -66 1127 -66 631 -100 263 -102 3173 -132 267 -68 1289 -98 1593 -66 2415 -66 1185 -66 359 -132 1051 -66 2169 -66 427 -98 395 -132 793 -98 293 -166 727 -134 131 -100 1287 -98 427 -98 687 -164 823 -64 853 -66 865 -100 763 -66 2025 -100 959 -66 1891 -64 793 -100 763 -66 729 -166 99 -98 399 -134 763 -100 4203 -66 1321 -230 4023 -98 1053 -66 985 -98 1383 -66 3559 -164 1515 -100 2899 -66 797 -134 1169 -100 3055 -134 1615 -66 429 -100 495 -64 1583 -134 923 -66 921 -66 723 -68 1359 -98 787 -98 425 -100 393 -64 1189 -98 263 -98 491 -100 1455 -98 RAW_Data: -202 531 -66 531 -66 1093 -66 1389 -66 1551 -134 2699 -66 1291 -132 65 -64 657 -98 1083 -164 393 -98 1359 -134 1461 -66 393 -100 561 -130 2113 -132 597 -66 431 -102 1759 -302 985 -66 235 -100 1395 -66 901 -66 1061 -100 463 -66 5673 -66 227 -66 225 -66 855 -66 1581 -132 2503 -100 657 -66 2535 -98 259 -64 1015 -66 231 -132 1197 -66 827 -166 9641 -66 1823 -132 1565 -132 299 -66 797 -66 1631 -132 327 -132 2227 -232 433 -68 499 -100 1793 -66 1161 -132 525 -66 129 -100 361 -66 1765 -132 229 -66 491 -132 2255 -100 3043 -332 299 -100 499 -100 267 -68 2967 -66 991 -100 729 -100 633 -66 529 -98 825 -100 1033 -100 331 -66 723 -100 725 -264 2987 -68 825 -66 2601 -134 333 -100 3181 -134 1059 -100 299 -134 3279 -100 1221 -132 659 -66 3157 -98 1595 -132 1561 -98 201 -134 465 -66 1843 -130 589 -66 1413 -66 331 -100 333 -66 661 -100 265 -68 201 -234 1027 -166 297 -100 1161 -132 1561 -134 629 -66 431 -66 1025 -98 427 -198 1527 -66 793 -66 1903 -66 131 -130 1285 -66 299 -134 397 -98 229 -132 499 -132 4747 -100 2355 -100 263 -132 1915 -132 1749 -132 759 -66 2253 -100 4545 -66 391 -100 521 -100 1083 -100 929 -134 565 -66 2355 -66 1331 -66 167 -100 465 -100 1727 -132 633 -330 433 -66 897 -132 165 -134 331 -98 627 -66 231 -66 167 -66 1397 -66 729 -132 1397 -68 165 -66 1627 -134 2187 -66 231 -134 795 -200 6469 -232 829 -66 3929 -66 891 -98 1977 -100 525 -68 859 -66 921 -264 1029 -68 959 -134 1555 -66 259 -100 687 -66 429 -264 663 -66 1559 -100 1127 -100 2327 -132 1913 -64 4193 -132 293 -98 99 -100 5613 -132 1351 -66 1545 -66 1677 -66 295 -64 1943 -100 595 -132 1959 -166 765 -66 1389 -100 823 -66 1749 -66 1217 -100 597 -100 297 -66 2019 -98 165 -100 4165 -100 67 -100 2477 -262 295 -66 919 -200 3555 -66 229 -66 2531 -98 557 -66 2525 -66 1463 -100 1293 -68 197 -68 1391 -66 1421 -66 595 -164 327 -68 2285 -66 593 -98 99 -68 463 -98 1063 -100 165 -68 99 -100 631 -66 1085 -66 859 -98 6599 -66 1429 -66 233 -66 397 -98 231 -132 1975 -132 333 -66 131 -134 3373 -100 4277 -66 1363 -232 2893 -166 3133 -64 951 -66 2815 -100 425 -98 327 -66 599 -68 1031 -98 133 -68 633 -68 429 -100 1129 -66 327 -130 2679 -66 1321 -100 463 -200 367 -98 667 -66 493 -132 885 -98 2183 -166 559 -98 981 -66 3201 -164 593 -66 493 -130 1923 -166 565 -100 2421 -98 461 -66 1427 -130 1955 -64 197 -66 1643 RAW_Data: -132 2291 -66 3057 -68 2521 -166 333 -134 503 -400 3235 -66 2329 -68 995 -100 333 -100 97 -166 1757 -100 397 -100 165 -66 2755 -132 297 -134 163 -100 565 -100 1793 -100 1813 -162 1293 -98 97 -66 999 -66 1763 -68 261 -68 2391 -100 765 -364 859 -100 1855 -98 1399 -230 463 -134 301 -198 397 -100 961 -68 431 -134 695 -202 133 -100 365 -66 925 -98 165 -66 365 -132 663 -98 4573 -134 1479 -66 1019 -66 629 -66 233 -68 201 -66 569 -66 295 -134 1755 -296 3199 -100 3261 -168 3373 -132 1425 -100 759 -66 895 -98 201 -100 265 -166 99 -66 695 -66 1091 -66 855 -168 299 -100 229 -164 589 -66 521 -66 655 -134 329 -98 493 -200 429 -66 929 -66 673 -100 953 -66 823 -66 1283 -66 1979 -68 233 -66 1547 -164 589 -132 597 -66 131 -66 265 -100 761 -200 759 -66 689 -332 263 -100 1227 -68 1067 -164 2945 -100 959 -100 995 -100 399 -100 1193 -100 625 -66 399 -66 3021 -134 393 -66 4805 -66 1095 -68 231 -332 399 -166 1663 -68 561 -66 927 -98 1085 -164 1155 -98 627 -66 265 -132 263 -130 2211 -66 2159 -66 1029 -264 2669 -66 295 -66 8747 -100 329 -232 625 -134 429 -68 1329 -168 1355 -98 987 -66 1545 -98 1015 -98 699 -134 133 -134 1263 -66 4687 -166 8299 -66 1349 -434 933 -906 443 -452 949 -894 441 -480 909 -486 907 -456 947 -448 949 -434 969 -454 931 -460 941 -448 933 -450 979 -450 945 -450 935 -458 935 -486 927 -456 947 -450 951 -482 945 -428 975 -446 967 -452 955 -458 945 -912 485 -434 971 -902 481 -450 949 -926 451 -478 941 -920 481 -450 949 -920 473 -450 955 -916 471 -452 981 -918 449 -486 945 -910 483 -924 473 -15780 479 -450 967 -948 449 -482 943 -944 485 -468 941 -484 979 -446 1001 -444 999 -446 967 -484 969 -482 979 -478 947 -484 985 -470 973 -458 983 -492 971 -458 979 -494 971 -458 983 -494 973 -458 981 -498 975 -458 1013 -466 973 -952 475 -458 973 -950 489 -450 1011 -916 481 -478 1001 -918 481 -478 1001 -916 481 -478 1001 -920 483 -480 983 -946 479 -458 1013 -932 485 -952 479 -16040 493 -476 1009 -912 515 -464 1007 -910 517 -464 1007 -450 1001 -488 1001 -484 1011 -450 1019 -458 1039 -450 1031 -454 1005 -484 1009 -458 1015 -476 1009 -478 1035 -462 1015 -468 1007 -480 1001 -486 1015 -460 1041 -450 1017 -484 1019 -482 1009 -952 477 -494 1003 -944 485 -478 1013 -944 519 -482 1013 -942 487 -482 1013 -946 487 -484 1015 -944 487 -484 1015 -946 519 -454 1019 -942 505 -952 487 -16238 517 -468 1007 -942 521 -482 1011 -944 519 RAW_Data: -450 1019 -482 1035 -480 1033 -460 1047 -476 1017 -484 1007 -484 1051 -484 1027 -452 1039 -478 1035 -458 1049 -480 1017 -480 1035 -480 1035 -472 1047 -484 1027 -454 1039 -480 1033 -488 1031 -488 1009 -962 521 -486 1017 -966 485 -490 1015 -139210 229 -98 461 -364 165 -334 131 -168 2121 -66 1049 -66 1215 -166 297 -136 1449 -100 3877 -100 1495 -234 331 -64 1345 -262 393 -100 529 -132 2921 -164 1223 -132 1807 -66 765 -66 397 -98 3405 -132 2123 -230 231 -66 2541 -100 2489 -98 4397 -132 461 -98 293 -64 991 -66 1125 -166 401 -100 131 -100 99 -100 265 -100 2555 -100 499 -98 1361 -134 265 -166 895 -100 2253 -100 1057 -100 129 -296 1147 -198 197 -66 1163 -66 1935 -98 1675 -66 1103 -100 891 -100 989 -164 1019 -66 2967 -68 1293 -166 3161 -66 133 -264 1065 -100 731 -66 1693 -66 529 -100 165 -68 865 -66 825 -232 1117 -196 2401 -66 3051 -296 229 -132 1843 -132 1687 -68 1119 -68 299 -68 97 -66 4741 -66 197 -200 2319 -100 1097 -66 3765 -66 131 -100 695 -132 2753 -66 2287 -100 1129 -68 331 -98 1433 -132 893 -100 465 -100 801 -66 529 -66 1515 -264 393 -98 263 -66 1831 -166 3533 -100 633 -100 1051 -100 331 -98 795 -134 959 -132 1229 -100 627 -132 2517 -66 165 -98 131 -66 2301 -166 163 -134 465 -66 2767 -66 1019 -66 401 -134 397 -232 893 -66 397 -66 833 -66 199 -66 303 -66 2775 -66 2069 -98 1841 -100 399 -66 793 -98 2793 -68 3769 -100 867 -66 861 -100 399 -66 1859 -100 631 -132 755 -100 689 -66 163 -64 2045 -64 2191 -102 1127 -68 727 -68 625 -164 1381 -66 1153 -132 1115 -98 1017 -100 491 -100 593 -132 991 -98 1415 -98 4813 -66 331 -98 131 -102 1847 -98 197 -68 263 -100 3265 -66 431 -100 493 -98 435 -134 133 -68 1185 -134 395 -100 131 -66 399 -134 767 -134 1125 -66 429 -198 3185 -100 2261 -66 523 -230 2475 -168 1297 -66 3243 -66 1853 -100 1657 -66 459 -66 827 -100 263 -66 303 -234 197 -166 1167 -100 2299 -66 1329 -68 461 -100 763 -132 3819 -366 757 -66 591 -164 621 -98 1445 -100 2155 -100 231 -100 631 -68 1161 -66 131 -166 67 -98 1915 -166 1891 -66 1261 -68 999 -164 165 -132 133 -168 2695 -68 1055 -198 97 -98 229 -66 229 -66 1215 -66 885 -100 303 -132 297 -164 619 -198 459 -64 989 -66 229 -66 597 -134 693 -64 1255 -100 65 -132 331 -66 199 -98 529 -100 2831 -98 1259 -66 4855 -100 1163 -166 299 -66 395 -98 3141 -66 1319 -66 2139 -100 161 -132 261 -130 821 -200 263 -134 931 -330 65 -98 99 -134 793 RAW_Data: -66 597 -100 231 -68 167 -66 1659 -100 733 -66 1631 -100 165 -66 199 -66 233 -166 165 -100 1925 -68 595 -198 1785 -134 2177 -134 131 -66 1049 -98 3087 -132 195 -64 589 -66 397 -134 329 -66 2565 -164 327 -100 689 -64 1775 -100 5183 -132 1187 -66 329 -66 395 -132 165 -98 261 -98 1247 -64 1217 -66 927 -66 997 -66 199 -98 1419 -66 531 -166 1231 -66 697 -100 97 -66 563 -66 161 -264 3205 -200 525 -98 293 -100 291 -100 133 -66 759 -66 659 -100 983 -64 523 -130 431 -166 919 -66 1097 -100 1757 -66 1119 -66 917 -98 2647 -166 1247 -66 165 -264 1189 -100 899 -134 597 -68 2323 -66 1893 -66 1095 -100 533 -64 965 -100 1817 -130 1215 -66 1879 -64 821 -164 1117 -132 263 -132 131 -66 557 -66 431 -132 661 -100 1183 -98 629 -100 1679 -132 259 -66 623 -98 431 -66 399 -164 923 -100 297 -66 165 -166 2521 -198 99 -66 431 -132 1225 -66 1063 -68 131 -136 631 -66 163 -100 99 -298 965 -68 465 -68 465 -298 2545 -134 2639 -230 1489 -66 299 -66 1991 -234 65 -132 693 -134 429 -102 101 -68 461 -66 3333 -64 1229 -68 333 -66 265 -66 885 -64 3163 -100 467 -66 2651 -164 1221 -100 1527 -66 1259 -134 431 -232 1259 -100 6029 -164 297 -98 1151 -66 1415 -100 5289 -66 2467 -100 493 -132 495 -200 1121 -66 129 -66 757 -166 327 -130 5477 -66 1227 -230 395 -100 265 -132 497 -132 1133 -132 361 -100 1051 -164 3089 -132 1583 -100 65 -68 2315 -100 529 -132 2157 -68 1257 -66 1975 -98 427 -98 1347 -66 719 -164 857 -66 165 -66 1029 -132 297 -132 467 -100 731 -130 1985 -98 199 -166 899 -100 1391 -166 3425 -100 261 -132 721 -66 4845 -98 1193 -68 1225 -66 721 -100 1015 -64 983 -66 557 -130 693 -98 99 -64 1091 -98 197 -100 2321 -66 431 -134 727 -66 467 -102 891 -98 167 -134 2619 -66 393 -64 97 -100 589 -98 1583 -164 301 -68 1481 -98 295 -98 959 -66 365 -98 1253 -66 231 -100 1255 -132 1813 -132 1645 -100 361 -132 395 -100 427 -164 1197 -98 1001 -100 861 -66 1161 -98 195 -100 197 -66 1429 -66 663 -66 1427 -98 665 -66 699 -100 663 -66 855 -196 161 -100 361 -98 823 -66 227 -66 621 -132 1853 -230 461 -230 623 -100 557 -98 229 -98 133 -134 1291 -66 533 -166 627 -134 195 -134 593 -64 591 -66 1019 -66 1049 -262 297 -100 2921 -66 133 -66 963 -134 165 -100 RAW_Data: -68 521674 -200 213 -258 217 -218 217 -246 193 -242 211 -466 451 -450 225 -212 211 -242 211 -238 243 -200 223 -254 419 -226 221 -432 251 -212 467 -240 203 -450 449 -246 205 -238 217 -218 217 -444 439 -478 431 -230 211 -462 247 -214 435 -454 449 -456 441 -442 471 -448 449 -246 205 -238 215 -220 217 -244 201 -254 217 -430 235 -220 461 -198 223 -442 275 -212 429 -458 245 -212 203 -228 253 -218 431 -448 451 -442 235 -218 463 -426 485 -214 209 -234 221 -254 219 -214 207 -228 253 -428 459 -418 245 -216 243 -194 241 -212 241 -212 211 -244 441 -228 215 -460 217 -244 435 -236 235 -440 439 -246 213 -208 229 -256 217 -430 445 -450 445 -236 253 -420 225 -232 429 -450 465 -448 439 -448 449 -454 453 -230 225 -214 241 -212 211 -242 211 -244 237 -442 237 -218 429 -230 221 -442 241 -246 425 -458 245 -212 203 -228 255 -218 427 -448 451 -446 235 -256 425 -462 417 -244 251 -208 201 -256 217 -218 209 -232 255 -420 451 -448 217 -242 211 -238 209 -234 221 -256 217 -218 437 -238 217 -464 203 -256 419 -226 223 -464 441 -244 213 -240 197 -254 219 -430 445 -452 479 -204 253 -420 225 -222 463 -452 449 -450 449 -452 447 -450 451 -238 215 -220 217 -244 199 -256 217 -218 207 -440 241 -254 423 -238 217 -462 197 -224 471 -448 225 -220 213 -242 211 -212 465 -446 449 -456 245 -214 437 -456 449 -232 233 -216 219 -254 207 -204 253 -218 219 -440 451 -456 237 -216 217 -254 209 -202 253 -218 219 -210 437 -244 253 -422 237 -218 423 -226 247 -430 451 -242 203 -228 253 -220 217 -442 449 -454 449 -240 217 -430 237 -218 461 -426 453 -450 465 -448 451 -440 443 -246 215 -250 201 -224 255 -218 215 -208 227 -442 239 -208 457 -238 219 -464 201 -256 425 -464 201 -256 217 -210 241 -216 451 -426 445 -486 207 -236 441 -430 479 -194 223 -256 217 -218 209 -234 253 -218 217 -438 449 -454 239 -216 217 -256 207 -202 255 -218 217 -210 439 -244 253 -424 235 -218 457 -224 229 -436 449 -230 221 -214 211 -242 211 -468 447 -450 449 -250 207 -454 239 -218 431 -446 451 -448 443 -486 447 -448 431 -240 207 -232 223 -254 219 -216 209 -230 253 -426 233 -234 433 -244 213 -432 237 -218 463 -446 221 -212 211 -242 239 -208 457 -456 451 -456 223 -212 467 -450 453 -204 253 -218 211 -240 215 -218 255 -208 201 -442 479 -452 203 -254 217 -212 241 -216 217 -256 207 -202 439 -240 245 -430 237 -218 463 -240 217 -428 465 -202 253 -218 213 -234 219 RAW_Data: -444 443 -452 455 -244 213 -440 237 -254 427 -450 429 -480 417 -454 477 -430 445 -244 217 -250 203 -224 253 -220 215 -206 221 -462 217 -212 467 -234 231 -440 239 -220 427 -446 219 -242 211 -244 237 -206 451 -458 451 -458 203 -254 427 -450 441 -246 213 -242 193 -244 211 -242 211 -212 241 -442 451 -454 245 -214 241 -198 255 -218 217 -210 225 -212 461 -246 213 -440 225 -242 435 -240 209 -456 457 -246 211 -204 229 -254 219 -428 445 -452 445 -238 253 -426 231 -232 435 -448 455 -448 439 -446 449 -456 451 -230 223 -214 241 -212 211 -242 211 -244 237 -442 237 -218 427 -232 221 -442 239 -246 427 -458 245 -212 205 -228 253 -220 427 -446 471 -442 237 -216 451 -462 411 -244 251 -216 205 -222 211 -242 211 -242 211 -480 453 -418 245 -252 207 -202 253 -218 219 -210 229 -256 425 -232 221 -430 251 -212 469 -204 235 -446 441 -246 213 -242 193 -244 211 -464 451 -456 441 -248 215 -450 201 -256 427 -452 457 -450 455 -450 439 -446 451 -238 217 -256 207 -202 255 -218 217 -210 231 -442 237 -244 423 -240 217 -464 203 -254 419 -454 227 -210 243 -212 241 -212 477 -418 453 -484 199 -226 431 -267004 97 -422 97 -164 65 -490 97 -2222 559 -66 163 -64 295 -100 497 -100 263 -98 361 -460 793 -66 1803 -100 339 -68 1733 RAW_Data: 12477 16271 -64 12623 -102 40819 -98 3729 -66 14371 -66 14943 -64 5931 -66 11147 -68 74641 -102 54299 -70 18441 -66 82993 -100 66161 -68 61869 -66 6627 -66 12987 -68 30427 -68 25761 -98 6305 -66 5019 -64 30857 -132 23929 -68 25129 -39378 317 -2020 311 -2010 2033 -312 2017 -282 325 -2018 291 -2024 2035 -316 2023 -276 319 -2028 297 -2032 2029 -284 2023 -314 321 -2016 319 -2012 2003 -310 2015 -318 321 -1984 327 -16000 351 -1974 321 -2020 2041 -276 2047 -288 327 -1992 327 -2000 2055 -282 2053 -274 305 -2022 301 -2014 2049 -286 2055 -274 319 -1992 329 -2006 2065 -282 2023 -316 323 -1988 303 -16008 323 -2014 315 -1990 2053 -284 2061 -274 319 -1988 319 -2038 2033 -286 2055 -264 339 -2008 289 -2034 2035 -284 2061 -262 339 -2008 287 -2040 2037 -286 2035 -268 347 -2006 317 -15988 311 -2014 343 -2014 2027 -300 2031 -258 311 -2024 323 -2028 2023 -280 2051 -318 285 -2024 309 -2002 2039 -312 2017 -318 289 -2020 293 -2028 2035 -316 2023 -276 321 -2030 299 -15982 345 -1988 345 -2014 2029 -268 2069 -258 337 -1998 321 -2024 2025 -320 2025 -276 321 -1994 331 -2000 2057 -282 2043 -282 305 -2034 291 -2024 2039 -320 2019 -278 323 -1992 333 -15976 389 -1978 321 -1986 2069 -276 2053 -288 303 -2020 315 -1980 2067 -258 2075 -258 337 -1996 321 -2030 2027 -284 2059 -274 319 -2004 319 -2016 2033 -282 2059 -264 345 -2006 289 -16006 355 -1984 315 -2018 2033 -312 2015 -284 327 -2000 329 -2000 2063 -282 2049 -284 327 -1984 319 -2018 2035 -284 2057 -264 343 -2004 289 -2032 2059 -280 2019 -316 323 -1984 321 -15968 387 -1978 321 -1984 2069 -276 2049 -288 325 -1996 303 -2004 2055 -284 2049 -278 325 -2018 321 -1984 2075 -276 2049 -288 327 -1990 325 -1996 2031 -318 2025 -278 323 -2018 289 -16010 357 -1982 315 -2018 2035 -278 2053 -288 307 -2022 321 -2000 2049 -274 2045 -284 327 -2022 311 -2014 2033 -276 2053 -286 327 -2000 323 -2000 2061 -282 2015 -316 325 -2002 289 -15994 353 -1980 357 -1990 2035 -312 2015 -286 327 -2020 289 -2022 2033 -318 2019 -278 323 -2004 319 -2016 2059 -282 2023 -316 327 -1970 321 -2018 2059 -280 2019 -318 325 -1972 321 -15988 353 -1982 357 -1972 2071 -276 2051 -288 327 -1988 323 -1996 2061 -280 2053 -284 325 -1984 321 -2014 2031 -282 2059 -276 321 -2018 289 -2036 2031 -282 2059 -276 321 -2018 319 -15984 341 -1984 343 -2016 2029 -298 2033 -258 309 -2028 321 -2032 2035 -284 2017 -298 337 -2008 289 -2034 2027 -314 2023 -310 285 -2016 321 -2014 2035 -282 2027 -308 317 -2026 297 -15982 357 -1984 345 -1982 2067 -264 2057 -258 341 -1996 317 -2026 2057 -282 2017 -318 325 -1972 319 -2018 2059 -280 2029 -302 315 -2006 319 -2006 2059 -274 2047 -276 307 RAW_Data: -2024 311 -15984 349 -2004 317 -2012 2029 -276 2047 -312 305 -2018 311 -2018 2037 -258 2077 -258 337 -1998 321 -2026 2031 -278 2043 -284 327 -2020 311 -2018 2031 -278 2051 -288 325 -2004 323 -15962 353 -2018 317 -2014 2007 -308 2019 -320 287 -2024 325 -1998 2035 -314 2025 -302 311 -2004 319 -2010 2027 -312 2011 -310 309 -2028 303 -2018 2027 -304 2007 -294 309 -2024 323 -16002 361 -1946 347 -2008 2027 -286 2045 -312 325 -1978 319 -2024 2043 -276 2049 -286 325 -1988 341 -1978 2061 -278 2049 -284 327 -1990 321 -2020 2029 -318 2021 -278 323 -2008 321 -15990 355 -1982 355 -1984 2031 -284 2049 -278 325 -2018 321 -2000 2047 -276 2049 -286 327 -1994 341 -1976 2067 -274 2043 -284 303 -2018 341 -1982 2061 -266 2069 -258 339 -1998 321 -16002 311 -2014 329 -2012 2027 -318 1999 -298 339 -2008 287 -2042 2031 -282 2027 -306 317 -2012 291 -2044 2037 -284 2033 -302 315 -2004 321 -2012 2037 -282 2027 -306 317 -2028 297 -15980 345 -2018 285 -2026 2037 -320 2017 -278 323 -2024 299 -2002 2069 -278 2055 -286 325 -2002 289 -2024 2037 -282 2063 -276 321 -2016 287 -2036 2025 -320 2023 -278 323 -2018 287 -16006 355 -1982 355 -1986 2033 -302 2039 -282 307 -2032 309 -2014 2043 -264 2057 -258 341 -1992 319 -2036 2033 -284 2029 -306 319 -2000 319 -2014 2035 -282 2061 -266 343 -2006 289 -16018 331 -2010 313 -2014 2021 -320 2017 -278 323 -2010 321 -2016 2037 -284 2033 -304 317 -2018 287 -2036 2037 -284 2025 -296 339 -1978 321 -2028 2057 -282 2021 -278 359 -1972 321 -15990 355 -1978 355 -1990 2035 -300 2015 -312 305 -2016 315 -2016 2053 -290 2013 -316 277 -2020 353 -1980 2059 -256 2077 -276 307 -2020 311 -2012 2047 -258 2073 -256 341 -1998 321 -15976 369 -1976 313 -2018 2051 -280 2043 -290 317 -2004 321 -2024 2023 -282 2053 -282 327 -2020 313 -2020 2035 -278 2055 -284 325 -1986 321 -2016 2033 -280 2049 -282 325 -2020 313 -15986 315 -2026 319 -2028 2003 -318 2013 -294 339 -2008 289 -2032 2027 -316 2019 -302 311 -2004 321 -2014 2033 -314 1995 -308 317 -2028 297 -2032 2035 -276 2023 -316 321 -2014 289 -15998 347 -2014 283 -2020 2035 -292 2031 -288 311 -2024 321 -2036 2001 -310 2027 -318 275 -2054 277 -2026 2029 -296 2027 -292 311 -2024 321 -2030 2031 -282 2033 -304 313 -2004 321 -15992 329 -2010 349 -1980 2037 -292 2051 -256 339 -1998 319 -2034 2029 -286 2055 -264 339 -1978 321 -2030 2027 -280 2043 -316 327 -1984 315 -2016 2063 -278 2041 -288 327 -1990 325 -15964 389 -1978 319 -1984 2063 -256 2055 -292 307 -2016 323 -2028 2027 -286 2057 -274 319 -2010 319 -2010 2033 -282 2061 -276 321 -2018 289 -2032 2027 -318 2021 -278 321 -2020 319 -15974 355 -1980 357 -2000 2035 RAW_Data: -254 2079 -276 309 -2016 309 -2012 2035 -296 2063 -258 337 -1992 321 -2030 2037 -286 2027 -294 333 -1978 321 -2034 2029 -286 2031 -306 315 -2008 321 -15972 355 -1984 315 -2014 2037 -310 2011 -318 323 -1984 329 -2002 2033 -316 2029 -278 323 -2026 299 -2030 2035 -278 2019 -316 325 -1980 323 -2018 2053 -252 2075 -280 327 -1984 355 -15954 345 -2008 309 -2016 2045 -266 2065 -258 341 -235740 101 -202 65 -734 133 -372 401 -68 269 -236 505 -68 235 -234 875 -68 13969 -100 14297 -70 3863 -96 59337 -104 11859 -68 17409 -68 7317 -66 11443 -64 15589 -66 4381 -98 32297 -168 45445 -100 59295 -100 41417 -66 1539 -66 23001 RAW_Data: 1549 -1166 409 -1138 363 -1144 407 -1144 385 -408 1599 -1138 377 -430 1593 -1138 421 -1110 393 -1126 409 -1136 377 -1162 353 -24626 823 -1176 379 -1150 353 -1174 349 -1158 377 -454 1541 -450 1561 -1190 383 -1118 411 -398 1557 -460 1571 -450 1547 -482 1537 -450 1561 -482 1547 -470 1537 -450 1547 -482 1539 -1176 387 -422 1541 -474 1537 -448 1545 -444 1539 -450 1543 -1136 375 -414 1549 -1142 417 -1102 387 -1118 385 -1140 381 -406 1549 -1180 383 -392 1549 -1140 417 -1122 383 -1116 383 -1140 415 -1102 355 -24628 823 -1188 357 -1180 343 -1172 385 -1150 361 -440 1513 -450 1563 -1184 369 -1158 381 -448 1539 -448 1527 -482 1545 -456 1545 -450 1533 -454 1579 -450 1561 -458 1513 -450 1555 -1182 389 -390 1571 -436 1571 -418 1581 -446 1505 -456 1511 -1160 391 -390 1339 -1108 381 -1098 361 -1150 309 -1124 331 -416 1065 -1142 353 -420 1049 -1148 319 -1156 345 -1128 347 -1134 317 -1138 319 -24716 687 -1178 309 -1138 317 -1166 319 -1162 327 -408 1039 -448 1067 -1152 321 -1132 313 -436 1065 -426 1039 -442 1039 -448 1049 -418 1041 -450 1035 -426 1039 -444 1041 -418 1047 -1144 339 -402 1069 -414 1071 -422 1051 -450 1029 -424 1069 -1144 335 -418 1043 -1178 319 -1134 321 -1174 309 -1164 313 -454 1049 -1148 317 -410 1051 -1160 353 -1124 321 -1166 349 -1122 329 -1178 277 -24734 677 -1178 299 -1182 309 -1154 337 -1144 307 -430 1047 -448 1039 -1174 319 -1164 289 -452 1033 -444 1031 -450 1035 -426 1063 -412 1047 -448 1041 -446 1033 -426 1041 -438 1049 -1152 289 -438 1071 -414 1031 -448 1039 -460 1033 -414 1079 -1146 309 -428 1049 -1178 311 -1154 337 -1144 329 -1162 319 -408 1051 -1160 353 -404 1059 -1164 317 -1154 325 -1140 347 -1152 333 -1138 285 -24770 657 -1178 315 -1162 289 -1184 313 -1152 329 -446 1039 -416 1047 -1170 343 -1128 351 -418 1021 -454 1047 -416 1061 -422 1033 -454 1043 -446 1039 -416 1065 -414 1041 -424 1033 -1178 301 -450 1041 -416 1051 -452 1045 -422 1033 -454 1043 -1172 283 -436 1065 -1146 329 -1176 311 -1150 337 -1148 309 -430 1049 -1174 299 -432 1061 -1180 289 -1178 311 -1162 347 -1150 307 -1160 311 -24722 607 -1296 203 -1264 207 -1266 227 -1252 239 -498 969 -506 1013 -1214 275 -1166 289 -480 1005 -484 1003 -476 1009 -454 1009 -480 1025 -458 1003 -448 1045 -448 1009 -450 1035 -1146 321 -444 1033 -444 1029 -444 1041 -442 1041 -416 1081 -1148 343 -396 1081 -1146 345 -1120 341 -1150 345 -1120 343 -420 1077 -1146 321 -420 1053 -1152 355 -1122 321 -1162 349 -1150 297 -1178 311 -24720 523 -4340 133 -1370 99 -636 67 -1406 393 -98 397 -1320 207 -1260 225 -498 975 -522 937 -540 977 -488 973 -510 987 -490 1005 -456 1003 -476 RAW_Data: 1015 -450 1005 -1194 289 -454 1011 -478 1009 -478 1007 -450 1033 -446 1035 -1158 353 -404 1057 -1168 309 -1162 349 -1150 309 -1158 313 -452 1047 -1146 321 -420 1059 -1152 355 -1126 319 -1160 345 -1128 353 -1152 309 -78850 165 -1196 97 -3256 65 -626 165 -130 525 -66 625 -430 891 -492 163 -792 163 -66 197 -100 595 -132 229 -15220 165 -464 97 -66 197 -264 99 -998 67 -198 195 -132 65 -296 163 -198 65 -198 691 -66 985 -134 97 -66 1485 -15420 197 -200 63 -132 97 -526 231 -64 263 -754 425 -198 97 -166 97 -132 495 -100 555 -164 391 -98 261 -98 1221 -9074 97 -2604 65 -1942 195 -590 853 -132 1225 -66 987 -1058 97 -100 131 -132 593 -98 425 -66 3965 -11360 65 -730 299 -98 99 -66 133 -232 327 -132 65 -456 163 -132 97 -196 327 -364 561 -264 1851 -234 1191 -8710 65 -596 163 -134 99 -234 97 -168 131 -496 165 -202 65 -20716 231 -68 231 -134 363 -100 133 -132 133 -198 231 -168 131 -166 99 -162 131 -196 295 -66 261 -166 955 -98 695 -66 1215 -9510 65 -3698 165 -328 65 -492 131 -66 129 -692 231 -64 163 -132 163 -98 229 -132 131 -134 97 -100 563 -15732 197 -796 165 -132 99 -562 97 -168 295 -462 99 -66 131 -332 133 -100 299 -66 329 -132 301 -68 267 -12994 299 -98 197 -228 295 -922 63 -988 65 -100 129 -164 823 -98 931 -66 331 -98 955 -9454 231 -100 163 -134 99 -796 133 -628 263 -430 67 -364 399 -98 365 -66 889 -66 5041 -4044 131 -166 265 -298 231 -98 197 -232 197 -164 163 -198 197 -98 65 -132 3525 -15068 67 -698 133 -1056 199 -2322 959 -200 297 -232 1223 -13532 65 -1650 197 -198 65 -330 129 -100 295 -164 65 -66 131 -1290 99 -134 231 -262 889 -98 231 -64 489 -66 663 -66 563 -15458 97 -362 229 -98 165 -496 131 -266 65 -98 165 -832 729 -66 133 -18682 231 -298 263 -132 363 -132 195 -132 361 -232 197 -1480 131 -164 163 -12854 65 -2522 299 -166 1357 -132 99 -98 399 -166 329 -264 395 -64 195 -196 1055 -132 1417 -14994 197 -132 459 -824 131 -428 133 -832 231 -200 65 -432 231 -100 467 -66 1151 -100 1741 -8616 97 -6904 1085 -198 261 -196 261 -232 265 -132 563 -166 65 -166 197 -100 331 -134 2009 -8664 97 -164 65 -64 263 -132 357 -64 97 -166 493 -166 165 -98 195 -130 361 -854 891 -66 365 -166 1019 -15320 97 -198 331 -166 1359 -266 229 -134 65 -100 331 -98 65 -132 265 -20774 65 -2222 97 -66 229 -132 161 -162 133 -18134 229 -198 65 -132 197 -200 263 -364 97 -100 427 -526 65 -460 131 -428 RAW_Data: 655 -98 2625 -8562 99 -432 97 -1924 67 -632 199 -498 65 -100 1819 -132 197 -228 263 -232 133 -296 229 -66 97 -20434 199 -432 65 -764 65 -232 233 -232 133 -334 463 -232 329 -98 357 -130 131 -132 1423 -4018 133 -1984 65 -2926 99 -930 97 -430 1293 -100 531 -66 493 -100 131 -100 429 -134 465 -132 3063 -9636 67 -3696 97 -132 229 -298 131 -694 627 -132 1247 -132 297 -166 133 -66 199 -166 663 -21440 133 -400 131 -130 99 -66 531 -232 229 -134 131 -202 165 -564 131 -1258 65 -100 133 -132 299 -166 1325 -66 833 -66 1521 -9032 97 -1544 295 -98 231 -164 261 -66 131 -394 361 -296 163 -298 463 -66 195 -96 721 -13330 65 -468 99 -134 65 -4696 199 -166 659 -98 361 -198 229 -132 557 -166 625 -164 229 -66 329 -100 131 -130 263 -66 1221 -8436 329 -198 99 -66 99 -66 165 -398 65 -1326 97 -794 165 -592 131 -66 265 -266 99 -430 2421 -100 465 -100 199 -66 699 -100 65 -132 1351 -66 897 -130 1653 -15200 231 -264 195 -296 99 -328 295 -296 163 -98 129 -98 295 -264 131 -398 65 -232 97 -98 887 -132 3157 -12396 199 -134 131 -66 231 -200 267 -132 265 -500 97 -732 131 -200 165 -396 763 -166 859 -66 1391 -9164 65 -3808 165 -66 131 -1692 65 -100 1017 -330 65 -132 65 -196 685 -198 65 -198 165 -98 231 -68 99 -22854 231 -168 67 -200 65 -66 263 -100 201 -302 65 -134 65 -22948 165 -396 263 -134 131 -68 165 -862 231 -1494 1261 -66 399 -302 3089 -6572 65 -396 65 -4140 7317 -5010 7415 -15982 811 -1174 381 -1122 381 -1148 351 -1164 345 -466 1509 -482 1541 -1176 387 -1144 363 -416 1519 -478 1525 -470 1533 -460 1539 -444 1535 -460 1531 -476 1527 -448 1513 -482 1509 -1178 379 -398 1549 -444 1539 -450 1547 -446 1541 -450 1545 -1142 381 -426 1529 -1172 381 -1140 387 -1114 395 -1130 379 -438 1531 -1172 381 -398 1555 -1192 351 -1146 407 -1122 381 -1146 381 -1126 349 -24662 821 -1174 379 -1122 383 -1146 415 -1102 385 -426 1567 -432 1567 -1178 381 -1120 385 -444 1511 -482 1515 -480 1539 -452 1545 -446 1545 -486 1541 -442 1555 -456 1495 -466 1531 -1148 387 -422 1509 -466 1533 -456 1539 -470 1503 -458 1539 -1164 351 -424 1509 -1190 353 -1148 369 -1130 379 -1136 317 -404 1331 -1128 319 -406 1231 -1140 337 -1114 349 -1122 329 -1140 349 -1120 293 -24712 627 -1236 237 -1226 233 -1230 271 -1228 239 -480 1017 -452 1039 -1184 293 -1172 275 -464 1041 -444 1007 -450 1033 -448 1035 -430 1047 -450 1031 -428 1047 -444 1005 -466 1015 -1158 289 -460 1047 -430 1033 -440 1039 -442 1033 -442 1037 -1168 309 -436 1051 -1140 RAW_Data: 343 -1158 311 -1152 347 -1120 341 -420 1041 -1178 319 -422 1051 -1150 321 -1152 345 -1126 351 -1118 345 -1158 313 -24714 689 -1170 317 -1154 323 -1138 349 -1154 301 -448 1037 -416 1083 -1150 345 -1124 313 -454 1047 -418 1031 -446 1045 -448 1037 -416 1061 -412 1043 -442 1053 -426 1039 -436 1033 -1170 309 -418 1039 -454 1049 -418 1059 -424 1049 -452 1029 -1158 319 -454 1031 -1152 353 -1152 289 -1176 311 -1162 349 -418 1051 -1148 319 -454 1027 -1152 353 -1124 319 -1162 347 -1152 333 -1144 311 -24722 685 -1138 343 -1138 329 -1162 353 -1130 325 -412 1069 -414 1085 -1150 311 -1160 311 -422 1081 -416 1031 -444 1049 -414 1071 -416 1063 -430 1037 -440 1039 -412 1049 -450 1039 -1140 351 -420 1049 -418 1065 -420 1045 -448 1041 -414 1053 -1148 345 -398 1085 -1140 315 -1166 355 -1126 319 -1158 351 -398 1071 -1140 317 -432 1071 -1138 343 -1130 339 -1144 331 -1160 319 -1162 289 -24740 693 -1130 353 -1156 319 -1136 347 -1150 301 -448 1041 -416 1063 -1178 297 -1180 311 -428 1047 -448 1037 -416 1065 -428 1037 -442 1051 -428 1039 -440 1051 -428 1037 -434 1033 -1172 311 -414 1071 -420 1049 -428 1035 -440 1069 -414 1051 -1150 343 -398 1083 -1148 345 -1120 341 -1148 347 -1122 341 -416 1071 -1148 319 -420 1061 -1152 353 -1126 321 -1158 349 -1150 297 -1176 277 -24762 631 -1238 239 -1232 271 -1230 243 -1210 271 -470 1007 -476 993 -1222 281 -1202 269 -480 1011 -454 1035 -446 1039 -446 1041 -416 1047 -450 1045 -420 1033 -454 1015 -444 1051 -1154 321 -408 1071 -414 1065 -398 1065 -440 1049 -428 1037 -1172 317 -434 1069 -1138 317 -1152 327 -1170 315 -1164 319 -410 1081 -1162 319 -404 1061 -1166 317 -1154 325 -1140 347 -1152 333 -1148 311 -24742 691 -1138 341 -1138 317 -1164 353 -1124 319 -434 1069 -412 1069 -1148 325 -1140 347 -398 1075 -414 1069 -414 1051 -452 1047 -422 1051 -416 1057 -428 1049 -450 1029 -420 1033 -1166 335 -418 1041 -416 1063 -412 1079 -412 1071 -414 1065 -1148 325 -410 1069 -1142 351 -1152 309 -1160 349 -1116 329 -436 1051 -1162 319 -426 1051 -1148 327 -1172 311 -1156 337 -1150 345 -1120 305 -83468 65 -1920 133 -98 397 -1062 199 -464 165 -728 165 -168 97 -466 497 -132 1123 -66 3163 -12612 229 -198 65 -134 363 -66 67 -132 97 -896 197 -132 199 -166 165 -166 67 -134 165 -334 365 -134 2963 -15534 231 -132 231 -168 165 -262 97 -266 65 -724 65 -166 97 -198 295 -98 131 -132 563 -100 1483 -8892 99 -954 131 -234 67 -432 1087 -98 687 -132 163 -8794 165 -6460 165 -332 331 -498 99 -200 199 -266 67 -100 131 -596 165 -332 67 -98 299 -100 265 -68 633 -100 5793 -4102 99 -198 65 -566 RAW_Data: 65 -658 99 -132 165 -332 167 -198 99 -132 133 -2530 65 -166 795 -300 197 -366 227 -262 361 -66 2073 -20762 65 -598 231 -264 97 -592 327 -132 295 -132 297 -100 363 -68 763 -20474 63 -166 757 -200 391 -100 97 -134 131 -134 591 -98 261 -262 229 -64 195 -100 195 -100 65 -132 261 -100 919 -66 333 -13642 65 -2324 131 -130 193 -462 195 -930 865 -66 2157 -100 1923 -12176 65 -168 197 -196 131 -1250 65 -132 391 -232 659 -66 393 -100 459 -230 197 -296 3479 -12728 99 -166 131 -134 131 -366 131 -98 97 -198 263 -164 231 -2074 693 -66 597 -66 433 -98 2509 -15286 65 -198 65 -198 165 -200 461 -132 757 -16060 65 -6768 199 -98 131 -262 163 -130 197 -198 165 -398 233 -334 65 -132 131 -166 331 -134 231 -564 365 -66 265 -100 465 -66 433 -100 6915 -6612 99 -264 65 -230 63 -4800 97 -66 393 -134 65 -100 165 -100 265 -66 165 -1818 99 -230 331 -66 265 -13068 131 -100 295 -298 427 -132 131 -1530 65 -100 165 -500 165 -132 995 -68 1685 -15810 263 -130 163 -462 231 -100 233 -632 165 -528 327 -196 197 -198 1253 -100 3583 -6278 97 -788 99 -3200 65 -166 133 -438 99 -132 165 -300 329 -166 1723 -134 725 -164 133 -16880 97 -960 99 -696 65 -200 231 -132 299 -66 297 -164 131 -730 197 -23052 365 -66 99 -332 131 -166 297 -494 429 -1326 265 -132 295 -66 367 -232 263 -66 857 -15396 395 -130 229 -98 233 -132 331 -364 65 -100 529 -68 231 -830 297 -100 233 -66 8533 -5582 101 -168 67 -3968 231 -66 129 -132 163 -1154 97 -166 199 -166 233 -132 467 -134 263 -66 431 -66 363 -66 957 -100 1821 -132 497 -132 1159 -15358 397 -66 99 -98 65 -66 265 -564 65 -68 97 -166 99 -100 165 -134 297 -896 165 -330 97 -134 963 -132 4737 -7096 65 -5664 265 -266 97 -166 265 -598 65 -332 65 -66 65 -198 231 -132 329 -100 65 -17202 99 -1564 595 -98 329 -198 227 -66 459 -230 97 -1480 63 -66 131 -166 99 -166 931 -8662 133 -398 99 -134 265 -98 299 -264 233 -66 99 -100 99 -66 97 -166 199 -166 265 -234 5785 -10012 163 -2324 331 -196 331 -134 65 -100 297 -100 165 -100 131 -332 163 -302 297 -164 199 -300 199 -166 229 -68 99 -68 959 -15384 365 -134 263 -1818 229 -698 99 -232 131 -100 789 -66 491 -132 4039 -12084 99 -134 331 -796 265 -132 265 -362 167 -2310 65 -98 131 -100 525 -164 295 -15032 297 -560 197 -330 131 -196 397 -266 197 -200 263 -68 261 -496 329 -166 361 -166 1517 -66 331 -10126 97 -3736 99 -1626 131 -100 RAW_Data: 3487 -68 18413 -66 6689 -17938 65 -68 495 -98 1129 -860 697 -166 395 -100 463 -100 163 -14692 263 -794 65 -64 99 -2922 131 -200 97 -168 99 -100 199 -962 495 -68 165 -98 299 -198 133 -168 3917 -98 963 -132 461 -100 1089 -166 331 -134 633 -164 201 -100 363 -164 335 -200 265 -68 531 -166 699 -132 529 -166 397 -98 895 -168 65 -100 399 -366 463 -66 197 -134 431 -66 163 -98 623 -166 301 -98 263 -98 263 -66 197 -98 329 -98 525 -66 331 -200 1025 -66 629 -132 763 -166 233 -66 431 -132 133 -100 429 -264 165 -132 299 -166 429 -68 4605 -134 593 -134 4917 -60834 167 -10282 1941 -1122 865 -2086 921 -1072 1921 -1042 939 -1056 945 -1044 939 -1052 945 -1024 971 -1024 973 -1002 969 -1010 989 -1996 1007 -994 979 -1014 1965 -1014 977 -1020 969 -2004 1993 -982 1011 -982 1005 -984 977 -2008 981 -1006 1993 -1966 999 -994 1007 -982 1005 -984 1007 -996 975 -1016 1987 -996 973 -1016 969 -1004 1013 -1970 1011 -984 1999 -1970 1995 -984 1021 -1968 1005 -994 1003 -970 999 -984 1023 -974 1015 -8920 1995 -1014 1001 -1966 1013 -986 1991 -986 1007 -996 973 -1012 999 -978 985 -1006 1005 -984 997 -978 1015 -1000 973 -1982 1025 -982 985 -1008 1973 -1004 1007 -982 983 -1998 2009 -972 1009 -980 999 -978 1011 -1970 1011 -986 1999 -1978 1007 -988 1007 -994 975 -1012 1003 -972 1009 -978 1987 -986 1007 -982 1017 -994 971 -1990 1009 -984 1997 -1978 1999 -1010 993 -1964 1005 -1000 1007 -980 997 -984 1017 -972 999 -8932 2031 -980 989 -1988 985 -1016 1983 -986 1007 -994 975 -1016 975 -998 977 -1012 999 -982 985 -1006 983 -1018 993 -1968 1017 -996 975 -1016 1965 -1012 979 -1018 971 -2004 1991 -978 1003 -984 1015 -992 973 -2004 1005 -976 1991 -2008 975 -986 1005 -998 977 -1012 999 -978 985 -1010 1973 -1004 1013 -980 981 -1004 1007 -1996 975 -986 1993 -2006 1961 -1002 1013 -1974 985 -1008 1011 -978 997 -1006 981 -1012 991 -8918 8005 -3924 1887 -174620 131 -3974 131 -298 559 -230 65 -132 265 -98 863 -168 333 -66 299 -234 463 -166 331 -102 697 -200 199 -98 265 -100 663 -166 331 -66 599 -132 99 -66 1261 -66 399 -100 265 -100 1199 -66 265 -166 101 -66 599 -232 197 -100 561 -66 499 -132 797 -132 427 -66 265 -298 465 -66 565 -198 97 -100 695 -100 531 -132 267 -66 429 -98 231 -100 331 -100 333 -98 363 -198 67 -100 165 -100 231 -100 729 -134 1061 -100 493 -164 665 -132 259 -128 257 -130 329 -98 361 -66 263 -100 227 -66 491 -98 295 -166 229 -132 229 -130 263 -130 233 -100 331 -232 99 -100 165 -66 667 -164 795 -66 695 -68 429 -132 RAW_Data: 559 -66 16863 -66 19215 -12276 65 -2086 131 -2188 65 -132 67 -166 299 -364 65 -100 131 -468 233 -200 497 -498 297 -100 363 -198 329 -130 327 -164 229 -64 427 -164 657 -132 829 -532 895 -66 297 -130 425 -166 363 -132 329 -100 465 -100 465 -198 65 -262 429 -98 495 -100 295 -528 131 -132 1129 -134 259 -130 327 -100 397 -66 261 -230 99 -66 229 -132 625 -68 131 -100 587 -66 329 -64 293 -130 1741 -132 325 -132 197 -98 261 -98 99 -132 561 -166 165 -66 391 -66 329 -98 231 -132 465 -100 331 -300 199 -132 299 -132 165 -164 229 -98 565 -100 395 -132 131 -100 327 -130 97 -98 163 -132 293 -98 557 -66 199 -166 233 -132 265 -166 627 -100 265 -132 595 -166 99 -98 199 -100 267 -166 795 -166 265 -166 297 -66 131 -166 331 -134 793 -164 263 -198 299 -100 265 -166 257 -100 197 -198 599 -132 333 -66 265 -100 229 -100 165 -204 465 -166 97 -232 365 -166 431 -68 199 -166 99 -236 365 -132 1297 -66 1361 -100 989 -98 297 -132 12467 -232 361 -100 263 -132 261 -196 229 -296 65 -66 329 -164 229 -164 263 -66 563 -232 3415 -132 11115 -100 97 -100 363 -164 99 -66 199 -100 99 -66 561 -164 259 -168 233 -132 333 -166 567 -98 297 -66 399 -66 399 -298 327 -132 685 -98 393 -98 819 -100 231 -270 429 -68 461 -132 131 -134 1121 -230 787 -132 1393 -132 233 -100 331 -66 497 -166 563 -196 425 -98 525 -66 723 -98 265 -134 365 -66 1297 -166 433 -98 165 -134 231 -134 263 -100 369 -198 99 -100 631 -634 331 -132 565 -132 265 -102 267 -98 467 -200 297 -130 731 -100 367 -98 229 -130 99 -98 263 -164 493 -100 297 -198 429 -66 425 -66 1021 -164 295 -198 97 -198 263 -132 425 -98 493 -98 197 -98 593 -264 65 -294 197 -66 295 -66 561 -196 565 -166 2675 -132 19393 -134 5403 -164 369 -166 467 -132 361 -526 395 -66 361 -132 529 -66 431 -66 465 -166 363 -98 65 -98 229 -98 359 -100 197 -132 201 -100 467 -166 397 -100 297 -130 229 -98 361 -98 199 -130 297 -66 659 -132 261 -98 819 -98 393 -132 329 -132 557 -132 163 -130 657 -66 295 -134 1189 -100 399 -102 861 -100 369 -132 331 -134 263 -666 65 -134 427 -64 197 -98 559 -68 297 -98 493 -164 197 -164 525 -66 131 -98 493 -66 595 -100 233 -100 265 -132 65 -66 465 -266 527 -98 855 -132 493 -66 393 -298 331 -100 131 -66 859 -198 495 -100 265 -98 367 -66 727 -196 535 -66 263 -66 397 -332 65 -198 331 -134 297 -330 RAW_Data: 261 -100 3291 -68 2553 -19050 1855 -100 1259 -200 165 -100 39479 -100 233 -68 1027 -166 595 -66 231 -168 199 -98 265 -232 563 -166 795 -98 99 -460 65 -362 1017 -98 229 -98 625 -66 231 -98 161 -196 363 -98 363 -100 631 -132 297 -66 333 -300 99 -66 295 -230 985 -100 623 -132 1319 -100 65 -68 231 -232 197 -232 331 -100 199 -168 567 -166 133 -232 823 -396 327 -132 855 -232 165 -100 401 -166 599 -198 167 -132 299 -198 663 -132 165 -134 67 -66 1687 -66 1705 -100 265 -232 297 -100 531 -66 333 -100 1263 -66 297 -164 299 -98 431 -398 97 -66 199 -296 231 -232 925 -100 131 -132 229 -164 361 -66 267 -166 197 -100 491 -132 261 -132 1183 -98 891 -100 265 -100 99 -100 725 -100 303 -60886 131 -10310 1911 -1226 749 -2146 899 -1084 1905 -1070 917 -1044 973 -1042 927 -1050 949 -1044 965 -1012 949 -1046 965 -1014 977 -2008 981 -980 995 -1012 1969 -1018 971 -1014 975 -2014 1967 -1016 971 -1014 977 -984 1003 -2006 973 -1000 2001 -1978 1013 -980 1001 -972 1009 -978 991 -1010 983 -1004 1989 -1012 983 -978 995 -1014 983 -2002 977 -984 2023 -1968 1997 -986 999 -1970 1003 -1000 1009 -978 1017 -974 1009 -978 1001 -8948 1975 -1016 973 -2004 999 -978 2001 -986 1001 -978 1009 -986 1001 -1010 975 -998 1011 -992 975 -982 1005 -1000 1009 -1970 1011 -982 1009 -984 2003 -978 1001 -976 1015 -1966 1999 -1010 989 -982 989 -1004 1001 -1978 1013 -978 2005 -1966 1019 -972 1011 -980 997 -976 1011 -1004 999 -966 1997 -1000 999 -1002 975 -986 999 -1994 1007 -980 1993 -1978 2001 -1008 991 -1970 1009 -998 975 -1016 971 -1006 1013 -980 1001 -8922 2001 -994 1009 -1972 997 -1012 1971 -984 1005 -1012 977 -998 1009 -978 1011 -984 977 -1012 979 -1016 977 -1010 977 -2010 981 -1006 971 -1020 1985 -984 1005 -978 999 -1990 1997 -980 997 -1010 981 -1014 989 -1976 1005 -966 1995 -1998 997 -982 1021 -972 1003 -986 997 -1012 975 -982 1995 -1014 999 -980 983 -1004 1003 -1976 1007 -980 1983 -2012 1983 -998 977 -2010 973 -1014 973 -1018 973 -1014 975 -1016 971 -8956 7999 -3926 1865 -177334 165 -166 199 -496 431 -66 1319 -132 297 -164 457 -68 231 -100 863 -98 603 -100 663 -100 789 -262 491 -166 729 -100 795 -364 365 -132 293 -100 197 -98 625 -200 231 -132 229 -132 227 -100 755 -526 329 -134 793 -100 167 -200 335 -66 65 -134 265 -66 201 -66 1023 -100 63 -21396 133 -198 65 -66 263 -98 393 -134 65 -66 329 -68 199 -432 263 -394 131 -130 195 -66 687 -66 295 -164 229 -196 97 -98 559 -98 1283 -98 531 -66 331 -68 435 -100 393 -628 431 -132 99 -66 RAW_Data: 329 -66 2519 -100 6759 -12690 463 -232 97 -3252 65 -2592 65 -132 99 -198 67 -496 99 -300 231 -132 233 -66 165 -132 131 -164 201 -66 4113 -66 1987 -68 15385 -98 8199 -16614 165 -1258 495 -1354 229 -166 297 -134 3653 -100 12533 -66 3759 -162 591 -132 361 -130 527 -100 327 -200 65 -66 461 -132 327 -132 461 -100 559 -198 263 -132 161 -98 329 -132 327 -68 395 -66 165 -132 163 -196 261 -66 361 -98 229 -132 301 -134 761 -66 399 -166 99 -66 461 -98 857 -98 131 -262 359 -132 199 -100 299 -166 363 -132 297 -132 199 -132 265 -166 133 -100 301 -268 463 -98 231 -134 265 -98 527 -298 265 -136 531 -132 363 -132 129 -130 527 -132 297 -66 297 -68 397 -466 99 -132 697 -98 233 -464 131 -132 365 -134 465 -98 635 -98 299 -66 497 -132 197 -132 489 -166 327 -98 1151 -130 295 -132 623 -164 97 -68 297 -100 1293 -100 1759 -66 1259 -132 729 -100 797 -66 99 -66 231 -98 529 -166 331 -166 299 -202 431 -134 467 -462 329 -462 1051 -98 625 -66 195 -100 461 -196 429 -132 197 -66 129 -66 229 -166 589 -164 629 -66 1053 -166 231 -98 263 -132 329 -132 267 -132 427 -130 65 -130 229 -166 4121 -66 15899 -19980 495 -264 165 -432 65 -132 65 -662 663 -100 793 -66 723 -164 565 -100 363 -166 199 -98 465 -100 299 -168 265 -198 695 -132 131 -268 497 -66 265 -134 199 -98 231 -134 499 -100 989 -132 429 -196 327 -132 131 -164 427 -66 263 -66 525 -132 1091 -100 793 -132 491 -66 195 -526 921 -134 363 -98 693 -230 165 -98 1711 -132 293 -66 659 -196 231 -66 261 -66 163 -66 1349 -166 363 -100 65 -100 299 -100 393 -66 495 -134 229 -98 131 -98 463 -362 361 -132 231 -66 491 -396 361 -132 97 -66 163 -198 229 -294 229 -198 165 -164 65 -100 623 -66 195 -98 261 -130 65 -98 563 -66 267 -166 1057 -632 531 -132 463 -100 663 -166 133 -100 569 -164 197 -66 431 -164 261 -132 363 -100 427 -164 263 -198 623 -66 589 -166 133 -166 199 -66 199 -268 65 -98 427 -66 163 -132 563 -198 363 -166 397 -98 1025 -66 197 -66 163 -132 693 -164 195 -66 427 -100 131 -66 433 -132 199 -402 231 -66 335 -100 993 -100 463 -232 65 -100 65 -66 7165 -66 6785 -66 895 -66 923 -198 97 -164 689 -166 361 -198 99 -66 753 -498 365 -66 567 -232 397 -66 199 -132 233 -200 995 -296 365 -166 597 -100 199 -134 99 -166 197 -332 431 -166 331 -66 199 -100 431 -232 493 -166 457 -98 231 -132 427 -230 559 -98 RAW_Data: 261 -132 1051 -66 7501 -98 22107 -19232 2271 -166 133 -60834 165 -10284 595 -5446 885 -1106 1891 -1088 897 -1068 949 -1050 929 -1040 947 -1048 959 -1008 985 -1008 973 -1012 993 -2004 979 -998 975 -1014 1987 -998 977 -1014 971 -1998 2007 -974 1013 -976 999 -982 1023 -1962 1005 -1000 1969 -2010 977 -1016 971 -1004 1009 -980 985 -1002 979 -1014 1977 -1012 979 -1016 971 -1012 977 -1986 1021 -974 2005 -1968 2007 -976 1011 -1966 1009 -984 1009 -984 985 -1020 969 -1002 997 -8952 1995 -986 1017 -1988 989 -976 1979 -1028 975 -988 1009 -986 1007 -992 973 -1014 1001 -974 1011 -978 995 -1006 979 -2004 975 -1022 973 -984 1999 -1014 977 -984 1003 -2004 1995 -976 1005 -998 999 -982 981 -2002 983 -986 1989 -1998 1009 -976 999 -1010 991 -978 1013 -968 1011 -986 1995 -982 1023 -974 981 -1020 993 -1970 1007 -996 1995 -1982 1999 -986 993 -2002 985 -998 975 -1014 969 -1004 1009 -978 997 -8962 1989 -990 1009 -1954 1025 -984 2007 -962 1011 -980 1001 -982 1009 -1002 1007 -980 1005 -976 1007 -980 997 -976 1009 -2002 977 -988 1005 -982 2001 -976 1009 -988 1005 -1968 2029 -974 1003 -990 1011 -958 1005 -1972 1039 -978 1999 -1978 1009 -954 1037 -978 1007 -954 1039 -980 1011 -958 1999 -974 1031 -990 993 -972 1011 -1980 1011 -978 2009 -1968 1993 -982 1003 -1974 1007 -1006 1001 -986 985 -986 1001 -982 1033 -8924 8013 -3924 1851 -170400 493 -132 131 -164 65 -724 461 -164 693 -100 265 -100 229 -100 199 -98 363 -232 363 -100 131 -68 531 -166 165 -134 265 -66 727 -300 131 -198 99 -132 99 -134 597 -102 295 -130 131 -230 129 -98 689 -264 263 -134 231 -134 199 -132 131 -68 295 -100 163 -130 591 -98 327 -164 231 -66 589 -98 2077 -134 1389 -66 2913 -66 3045 -66 4463 -98 391 -132 489 -164 295 -66 523 -166 329 -98 195 -98 165 -100 165 -66 231 -100 895 -98 265 -132 595 -132 297 -494 261 -198 331 -100 131 -134 429 -68 231 -298 1193 -66 99 -100 627 -132 331 -98 393 -98 657 -132 163 -392 359 -132 163 -64 655 -164 263 -64 531 -98 265 -164 499 -100 229 -64 459 -100 199 -66 165 -130 197 -132 393 -66 163 -228 229 -132 65 -132 263 -100 357 -98 991 -328 595 -132 197 -130 759 -66 131 -166 267 -100 1251 -64 361 -66 395 -954 559 -132 295 -98 327 -100 295 -100 367 -198 391 -298 363 -132 495 -132 523 -66 97 -132 763 -198 131 -66 197 -100 525 -130 1059 -64 461 -166 563 -134 331 -66 463 -134 329 -198 199 -166 265 -266 1061 -66 331 -366 65 -66 1225 -100 299 -66 299 -132 133 -298 265 -100 1129 -364 163 -460 297 -132 297 -100 299 -100 RAW_Data: -465 9659 -100 885 -162 2507 -98 1805 -64 427 -98 1879 -198 489 -66 525 -98 851 -100 525 -66 819 -66 395 -98 459 -66 1155 -66 863 -68 265 -98 2359 -68 435 -166 2031 -66 829 -100 561 -66 701 -66 1365 -134 731 -132 655 -68 1623 -66 263 -98 1087 -98 591 -64 987 -132 299 -66 885 -66 1087 -66 2605 -100 303 -100 731 -132 1323 -66 267 -100 627 -66 431 -100 397 -100 1027 -66 559 -102 1565 -100 865 -66 629 -100 327 -66 1281 -98 851 -132 593 -132 429 -100 2931 -134 759 -298 2985 -132 1129 -66 1131 -166 235 -100 725 -66 199 -134 365 -64 293 -66 489 -130 15135 -132 899 -100 691 -100 1271 -134 1161 -66 1789 -100 293 -64 651 -130 719 -100 1061 -66 529 -66 501 -132 1523 -68 231 -68 895 -100 1557 -134 895 -66 2297 -68 4497 -134 1319 -64 525 -98 949 -66 463 -132 399 -134 1129 -66 263 -170 1027 -100 763 -98 265 -68 603 -66 563 -166 1221 -68 1253 -66 1163 -66 697 -134 699 -98 1929 -68 931 -100 399 -100 1589 -98 663 -98 261 -66 337 -100 497 -98 767 -66 471 -66 365 -66 1363 -68 967 -300 461 -66 879 -98 623 -98 623 -100 725 -98 1685 -66 1061 -264 1523 -66 665 -130 2239 -66 229 -130 1509 -66 763 -100 1301 -132 12207 -98 261 -98 3707 -66 323 -298 821 -66 623 -98 2467 -66 2177 -164 625 -100 629 -132 1263 -132 1027 -100 2093 -132 397 -98 1855 -66 2515 -64 391 -132 1163 -66 503 -68 499 -98 2383 -98 1143 -66 523 -66 821 -98 525 -98 163 -164 1775 -68 231 -134 2159 -100 3065 -66 401 -134 925 -200 165 -18904 99 -296 261 -1018 99 -198 235 -166 329 -298 133 -266 1877 -132 227 -198 797 -66 933 -100 1093 -98 197 -66 723 -98 293 -132 953 -66 1507 -132 261 -64 1183 -98 393 -66 461 -100 863 -66 463 -100 865 -66 2721 -200 11457 -66 4203 -100 969 -66 765 -234 229 -100 491 -66 433 -66 231 -134 1189 -100 1015 -96 1349 -66 687 -132 655 -100 365 -132 397 -132 761 -100 1393 -66 525 -100 397 -132 327 -68 495 -66 429 -68 533 -134 529 -66 565 -102 695 -102 1353 -66 793 -228 197 -100 801 -64 657 -98 1439 -98 393 -98 359 -130 2707 -100 1101 -166 1523 -100 961 -100 397 -66 1217 -66 531 -166 199 -102 365 -166 1863 -66 367 -66 361 -68 703 -100 763 -100 299 -66 501 -200 231 -100 2879 -98 2005 -66 825 -134 263 -66 1155 -132 929 -66 335 -100 13393 -100 4113 -266 99 -198 1357 -66 1015 -100 1627 -66 999 -132 1329 -132 529 -66 2591 -100 2545 -68 429 -100 499 -166 961 -66 467 -66 699 RAW_Data: -100 44175 -12032 99 -400 99 -334 65 -490 165 -328 65 -298 367 -1488 131 -166 131 -264 65 -66 99 -558 197 -198 129 -164 263 -100 2897 -66 33999 -98 1313 -166 657 -132 261 -66 197 -98 1477 -98 229 -66 1319 -66 231 -68 1199 -66 763 -100 857 -134 1963 -18216 99 -500 165 -330 65 -360 163 -202 65 -100 99 -366 267 -402 163 -68 233 -164 65 -66 167 -396 365 -100 1527 -66 393 -132 757 -66 1759 -100 821 -98 233 -66 1197 -66 399 -130 495 -100 435 -100 365 -66 199 -66 6399 -66 3541 -132 369 -132 1361 -98 597 -132 729 -68 733 -66 693 -100 199 -68 565 -134 363 -66 917 -68 267 -134 757 -132 1415 -132 327 -98 1053 -68 897 -166 263 -296 793 -102 297 -98 391 -100 893 -100 233 -68 563 -100 729 -66 431 -66 403 -68 397 -66 601 -164 563 -66 861 -132 1793 -66 637 -134 297 -66 525 -66 1421 -66 265 -100 463 -66 835 -100 699 -100 1029 -132 265 -166 567 -164 2155 -66 263 -66 1945 -100 10073 -132 463 -100 799 -66 729 -100 1655 -66 233 -66 265 -134 1961 -132 733 -98 301 -134 367 -134 1033 -64 889 -166 1463 -100 1327 -100 573 -132 497 -100 903 -100 1951 -66 427 -132 895 -198 1387 -98 723 -66 363 -100 263 -134 263 -166 561 -300 363 -198 929 -132 999 -168 65 -134 867 -132 719 -64 6625 -100 3415 -66 1553 -132 757 -130 329 -66 1625 -66 199 -66 265 -100 365 -132 267 -66 235 -100 703 -100 431 -100 601 -68 565 -100 399 -100 365 -100 365 -98 633 -100 2067 -100 495 -98 1121 -66 1253 -100 433 -132 199 -132 567 -100 99 -98 829 -198 363 -98 1717 -66 301 -132 403 -66 1791 -66 401 -100 633 -98 697 -66 1127 -66 433 -66 965 -100 2485 -66 461 -66 899 -98 231 -100 763 -100 523 -198 361 -132 1911 -66 2307 -168 265 -100 659 -134 461 -66 1165 -68 1423 -66 2693 -66 499 -66 733 -134 893 -98 435 -134 2359 -132 197 -68 661 -100 231 -68 369 -100 231 -66 495 -132 1751 -68 233 -68 1765 -132 233 -130 491 -162 855 -98 2113 -100 333 -134 765 -132 529 -66 293 -66 987 -132 329 -64 293 -98 99 -98 361 -100 367 -166 267 -68 261 -100 997 -408 855 -456 845 -868 417 -882 397 -900 411 -416 869 -884 417 -844 441 -846 427 -456 843 -452 831 -876 409 -898 409 -430 837 -462 839 -462 847 -854 417 -876 437 -880 397 -886 385 -486 841 -874 411 -868 415 -892 383 -878 439 -418 847 -466 835 -882 427 -440 843 -870 417 -882 411 -878 435 -846 427 -886 385 -886 415 -880 427 -870 409 -454 837 -888 419 RAW_Data: -448 837 -448 835 -880 413 -448 869 -414 885 -420 849 -450 843 -876 443 -440 841 -438 873 -862 413 -448 855 -876 413 -25804 2597 -422 879 -418 867 -884 419 -844 445 -876 399 -454 849 -886 417 -878 415 -872 419 -418 893 -410 865 -876 415 -876 437 -418 851 -450 875 -418 877 -874 405 -866 419 -884 413 -878 437 -418 883 -850 415 -882 425 -874 409 -884 419 -452 851 -418 885 -850 415 -452 859 -876 409 -898 407 -862 449 -844 449 -874 409 -872 435 -870 397 -882 425 -426 875 -868 413 -452 871 -418 881 -874 413 -448 839 -460 847 -424 879 -420 867 -890 417 -416 887 -418 885 -860 413 -450 869 -848 437 -25854 475 -3978 135 -398 65 -1128 225 -1058 225 -1032 299 -562 749 -994 307 -956 341 -946 369 -488 809 -494 803 -930 353 -932 383 -474 815 -510 815 -468 811 -928 377 -914 381 -914 407 -882 399 -454 839 -890 413 -900 409 -870 417 -880 425 -442 843 -476 841 -864 417 -454 867 -882 417 -876 411 -876 435 -846 429 -882 421 -886 419 -850 445 -872 411 -450 853 -878 419 -430 881 -418 867 -890 417 -416 889 -418 885 -432 871 -416 855 -878 451 -438 845 -458 843 -884 419 -446 837 -880 449 -25864 497 -9138 659 -1080 233 -1046 297 -976 295 -558 737 -578 763 -942 339 -972 341 -530 785 -492 807 -486 807 -916 397 -918 357 -922 387 -928 383 -482 801 -906 395 -898 407 -888 415 -882 411 -480 841 -448 839 -878 415 -448 871 -876 411 -880 437 -880 397 -884 423 -884 419 -882 413 -886 387 -912 397 -466 843 -866 413 -448 869 -456 837 -888 419 -450 837 -450 851 -450 871 -454 837 -888 419 -450 835 -450 871 -884 417 -448 837 -880 415 -172818 65 -1022 197 -1852 10287 -134 695 -132 263 -130 1717 -66 625 -100 1031 -68 301 -68 265 -100 665 -98 1059 -100 931 -66 1093 -132 333 -68 3011 -132 459 -66 659 -98 521 -98 1511 -98 163 -98 857 -132 231 -98 491 -66 587 -66 393 -98 1513 -98 263 -130 529 -100 299 -100 1545 -132 1313 -66 399 -68 299 -134 201 -68 265 -98 691 -132 1099 -66 427 -100 461 -264 427 -134 327 -100 227 -64 493 -66 633 -66 501 -66 2067 -228 595 -132 97 -66 231 -66 299 -66 925 -98 661 -100 433 -134 231 -166 999 -98 691 -66 197 -66 293 -66 265 -362 1557 -100 231 -134 265 -68 433 -66 2483 -66 333 -100 233 -166 917 -132 295 -132 949 -164 1775 -100 7629 -66 7259 -66 263 -202 1263 -100 265 -68 861 -166 365 -98 233 -164 569 -66 199 -100 399 -98 1189 -130 261 -100 655 -164 723 -264 231 -100 327 -130 395 RAW_Data: -130 84629 -16530 199 -594 163 -562 65 -164 65 -230 1383 -100 1031 -66 427 -66 401 -68 265 -102 233 -134 923 -100 493 -66 555 -132 619 -66 3165 -66 463 -198 1025 -68 233 -100 957 -132 793 -134 1233 -100 1553 -98 431 -100 1429 -100 393 -164 259 -166 65 -100 297 -134 263 -68 1797 -66 887 -100 497 -100 565 -134 363 -96 1649 -130 393 -98 327 -100 563 -68 891 -68 24545 -68 231 -134 167 -100 131 -68 863 -102 627 -164 267 -166 631 -66 569 -100 797 -66 231 -166 301 -102 569 -134 1423 -66 1115 -66 759 -66 599 -68 1265 -268 527 -134 531 -98 269 -68 231 -66 325 -98 329 -66 399 -64 393 -98 459 -98 921 -66 457 -100 2541 -266 927 -68 231 -64 357 -98 495 -166 133 -100 529 -98 1091 -100 199 -66 597 -100 931 -66 663 -134 333 -166 763 -68 599 -100 333 -102 333 -232 363 -66 1491 -132 697 -134 629 -66 369 -66 561 -134 863 -98 895 -100 199 -98 763 -100 299 -168 561 -100 331 -100 467 -100 1231 -100 1821 -66 229 -66 325 -66 1419 -66 195 -66 553 -132 363 -164 857 -66 491 -66 227 -98 227 -98 529 -100 2093 -164 501 -132 1441 -98 1095 -100 263 -66 931 -66 1397 -66 1627 -98 433 -66 697 -200 363 -266 297 -100 301 -200 263 -98 565 -134 65 -102 297 -100 165 -100 929 -266 1325 -66 3213 -100 4403 -100 665 -134 1859 -66 631 -66 967 -200 165 -134 1551 -66 791 -100 331 -132 163 -64 163 -98 361 -132 557 -98 629 -66 885 -100 1087 -100 959 -100 535 -66 265 -66 1931 -66 465 -66 1165 -100 565 -100 865 -100 493 -66 597 -166 1293 -100 463 -68 563 -66 565 -66 595 -100 197 -68 929 -66 665 -134 399 -66 665 -100 1255 -166 935 -98 1791 -98 265 -136 501 -100 1581 -66 265 -66 567 -98 699 -134 RAW_Data: 12477 16271 -64 12623 -102 40819 -98 3729 -66 14371 -66 14943 -64 5931 -66 11147 -68 74641 -102 54299 -70 18441 -66 82993 -100 66161 -68 61869 -66 6627 -66 12987 -68 30427 -68 25761 -98 6305 -66 5019 -64 30857 -132 23929 -68 25129 -39378 317 -2020 311 -2010 2033 -312 2017 -282 325 -2018 291 -2024 2035 -316 2023 -276 319 -2028 297 -2032 2029 -284 2023 -314 321 -2016 319 -2012 2003 -310 2015 -318 321 -1984 327 -16000 351 -1974 321 -2020 2041 -276 2047 -288 327 -1992 327 -2000 2055 -282 2053 -274 305 -2022 301 -2014 2049 -286 2055 -274 319 -1992 329 -2006 2065 -282 2023 -316 323 -1988 303 -16008 323 -2014 315 -1990 2053 -284 2061 -274 319 -1988 319 -2038 2033 -286 2055 -264 339 -2008 289 -2034 2035 -284 2061 -262 339 -2008 287 -2040 2037 -286 2035 -268 347 -2006 317 -15988 311 -2014 343 -2014 2027 -300 2031 -258 311 -2024 323 -2028 2023 -280 2051 -318 285 -2024 309 -2002 2039 -312 2017 -318 289 -2020 293 -2028 2035 -316 2023 -276 321 -2030 299 -15982 345 -1988 345 -2014 2029 -268 2069 -258 337 -1998 321 -2024 2025 -320 2025 -276 321 -1994 331 -2000 2057 -282 2043 -282 305 -2034 291 -2024 2039 -320 2019 -278 323 -1992 333 -15976 389 -1978 321 -1986 2069 -276 2053 -288 303 -2020 315 -1980 2067 -258 2075 -258 337 -1996 321 -2030 2027 -284 2059 -274 319 -2004 319 -2016 2033 -282 2059 -264 345 -2006 289 -16006 355 -1984 315 -2018 2033 -312 2015 -284 327 -2000 329 -2000 2063 -282 2049 -284 327 -1984 319 -2018 2035 -284 2057 -264 343 -2004 289 -2032 2059 -280 2019 -316 323 -1984 321 -15968 387 -1978 321 -1984 2069 -276 2049 -288 325 -1996 303 -2004 2055 -284 2049 -278 325 -2018 321 -1984 2075 -276 2049 -288 327 -1990 325 -1996 2031 -318 2025 -278 323 -2018 289 -16010 357 -1982 315 -2018 2035 -278 2053 -288 307 -2022 321 -2000 2049 -274 2045 -284 327 -2022 311 -2014 2033 -276 2053 -286 327 -2000 323 -2000 2061 -282 2015 -316 325 -2002 289 -15994 353 -1980 357 -1990 2035 -312 2015 -286 327 -2020 289 -2022 2033 -318 2019 -278 323 -2004 319 -2016 2059 -282 2023 -316 327 -1970 321 -2018 2059 -280 2019 -318 325 -1972 321 -15988 353 -1982 357 -1972 2071 -276 2051 -288 327 -1988 323 -1996 2061 -280 2053 -284 325 -1984 321 -2014 2031 -282 2059 -276 321 -2018 289 -2036 2031 -282 2059 -276 321 -2018 319 -15984 341 -1984 343 -2016 2029 -298 2033 -258 309 -2028 321 -2032 2035 -284 2017 -298 337 -2008 289 -2034 2027 -314 2023 -310 285 -2016 321 -2014 2035 -282 2027 -308 317 -2026 297 -15982 357 -1984 345 -1982 2067 -264 2057 -258 341 -1996 317 -2026 2057 -282 2017 -318 325 -1972 319 -2018 2059 -280 2029 -302 315 -2006 319 -2006 2059 -274 2047 -276 307 RAW_Data: -2024 311 -15984 349 -2004 317 -2012 2029 -276 2047 -312 305 -2018 311 -2018 2037 -258 2077 -258 337 -1998 321 -2026 2031 -278 2043 -284 327 -2020 311 -2018 2031 -278 2051 -288 325 -2004 323 -15962 353 -2018 317 -2014 2007 -308 2019 -320 287 -2024 325 -1998 2035 -314 2025 -302 311 -2004 319 -2010 2027 -312 2011 -310 309 -2028 303 -2018 2027 -304 2007 -294 309 -2024 323 -16002 361 -1946 347 -2008 2027 -286 2045 -312 325 -1978 319 -2024 2043 -276 2049 -286 325 -1988 341 -1978 2061 -278 2049 -284 327 -1990 321 -2020 2029 -318 2021 -278 323 -2008 321 -15990 355 -1982 355 -1984 2031 -284 2049 -278 325 -2018 321 -2000 2047 -276 2049 -286 327 -1994 341 -1976 2067 -274 2043 -284 303 -2018 341 -1982 2061 -266 2069 -258 339 -1998 321 -16002 311 -2014 329 -2012 2027 -318 1999 -298 339 -2008 287 -2042 2031 -282 2027 -306 317 -2012 291 -2044 2037 -284 2033 -302 315 -2004 321 -2012 2037 -282 2027 -306 317 -2028 297 -15980 345 -2018 285 -2026 2037 -320 2017 -278 323 -2024 299 -2002 2069 -278 2055 -286 325 -2002 289 -2024 2037 -282 2063 -276 321 -2016 287 -2036 2025 -320 2023 -278 323 -2018 287 -16006 355 -1982 355 -1986 2033 -302 2039 -282 307 -2032 309 -2014 2043 -264 2057 -258 341 -1992 319 -2036 2033 -284 2029 -306 319 -2000 319 -2014 2035 -282 2061 -266 343 -2006 289 -16018 331 -2010 313 -2014 2021 -320 2017 -278 323 -2010 321 -2016 2037 -284 2033 -304 317 -2018 287 -2036 2037 -284 2025 -296 339 -1978 321 -2028 2057 -282 2021 -278 359 -1972 321 -15990 355 -1978 355 -1990 2035 -300 2015 -312 305 -2016 315 -2016 2053 -290 2013 -316 277 -2020 353 -1980 2059 -256 2077 -276 307 -2020 311 -2012 2047 -258 2073 -256 341 -1998 321 -15976 369 -1976 313 -2018 2051 -280 2043 -290 317 -2004 321 -2024 2023 -282 2053 -282 327 -2020 313 -2020 2035 -278 2055 -284 325 -1986 321 -2016 2033 -280 2049 -282 325 -2020 313 -15986 315 -2026 319 -2028 2003 -318 2013 -294 339 -2008 289 -2032 2027 -316 2019 -302 311 -2004 321 -2014 2033 -314 1995 -308 317 -2028 297 -2032 2035 -276 2023 -316 321 -2014 289 -15998 347 -2014 283 -2020 2035 -292 2031 -288 311 -2024 321 -2036 2001 -310 2027 -318 275 -2054 277 -2026 2029 -296 2027 -292 311 -2024 321 -2030 2031 -282 2033 -304 313 -2004 321 -15992 329 -2010 349 -1980 2037 -292 2051 -256 339 -1998 319 -2034 2029 -286 2055 -264 339 -1978 321 -2030 2027 -280 2043 -316 327 -1984 315 -2016 2063 -278 2041 -288 327 -1990 325 -15964 389 -1978 319 -1984 2063 -256 2055 -292 307 -2016 323 -2028 2027 -286 2057 -274 319 -2010 319 -2010 2033 -282 2061 -276 321 -2018 289 -2032 2027 -318 2021 -278 321 -2020 319 -15974 355 -1980 357 -2000 2035 RAW_Data: -254 2079 -276 309 -2016 309 -2012 2035 -296 2063 -258 337 -1992 321 -2030 2037 -286 2027 -294 333 -1978 321 -2034 2029 -286 2031 -306 315 -2008 321 -15972 355 -1984 315 -2014 2037 -310 2011 -318 323 -1984 329 -2002 2033 -316 2029 -278 323 -2026 299 -2030 2035 -278 2019 -316 325 -1980 323 -2018 2053 -252 2075 -280 327 -1984 355 -15954 345 -2008 309 -2016 2045 -266 2065 -258 341 -235740 101 -202 65 -734 133 -372 401 -68 269 -236 505 -68 235 -234 875 -68 13969 -100 14297 -70 3863 -96 59337 -104 11859 -68 17409 -68 7317 -66 11443 -64 15589 -66 4381 -98 32297 -168 45445 -100 59295 -100 41417 -66 1539 -66 23001 RAW_Data: 171 -316 311 -154 187 -292 343 -134 337 -136 199 -286 311 -182 157 -294 327 -160 171 -316 161 -312 159 -314 333 -170 311 -164 141 -324 305 -164 299 -176 301 -170 167 -340 133 -338 163 -312 159 -294 189 -298 165 -314 311 -180 155 -294 189 -300 165 -312 187 -284 189 -312 159 -294 189 -296 167 -314 161 -310 189 -312 159 -292 189 -296 167 -312 161 -312 159 -314 193 -268 175 -304 193 -314 163 -312 159 -312 193 -294 495 -458 161 -338 301 -168 165 -304 331 -134 199 -286 309 -184 309 -170 141 -318 331 -162 143 -316 309 -182 157 -294 189 -302 163 -312 309 -184 311 -170 141 -318 331 -162 299 -150 319 -196 139 -314 165 -334 137 -340 159 -312 161 -302 149 -318 331 -162 173 -312 161 -312 163 -300 175 -296 195 -310 163 -312 159 -312 163 -312 159 -296 189 -300 193 -284 187 -284 189 -312 159 -292 189 -298 167 -312 161 -312 189 -300 173 -294 195 -282 191 -310 485 -472 167 -300 331 -134 171 -312 333 -170 169 -290 331 -162 299 -176 155 -300 333 -162 171 -300 323 -150 145 -340 159 -320 167 -302 319 -150 319 -166 169 -312 331 -162 299 -150 319 -194 139 -314 165 -308 163 -340 133 -338 163 -312 157 -296 327 -160 171 -316 163 -310 161 -312 163 -298 177 -302 193 -314 163 -310 161 -312 163 -300 173 -300 169 -318 177 -290 189 -300 165 -312 161 -312 189 -284 185 -292 189 -300 191 -286 187 -284 191 -312 471 -486 167 -314 313 -152 159 -300 335 -162 169 -308 319 -150 319 -166 169 -312 331 -162 143 -314 311 -180 157 -294 189 -300 165 -314 309 -182 311 -168 141 -318 333 -162 299 -174 295 -194 141 -314 165 -336 137 -338 135 -338 161 -312 159 -294 327 -160 171 -316 161 -312 159 -314 191 -270 201 -278 193 -314 163 -310 161 -312 163 -300 175 -300 169 -316 177 -292 189 -300 165 -312 161 -312 189 -284 183 -294 189 -298 193 -284 187 -312 163 -312 497 -460 145 -320 325 -168 171 -290 333 -162 171 -314 305 -160 317 -168 169 -290 333 -162 173 -312 283 -182 159 -294 189 -302 165 -312 309 -182 313 -168 143 -318 331 -162 301 -148 321 -194 141 -312 167 -334 135 -340 161 -310 163 -312 159 -294 327 -160 171 -316 163 -310 161 -312 163 -300 175 -302 195 -312 163 -312 159 -312 163 -300 175 -298 169 -318 177 -290 191 -300 165 -312 161 -310 189 -284 185 -292 189 -300 191 -286 187 -312 161 -300 487 -484 151 -318 335 -138 169 -322 305 -164 171 -314 305 -190 295 -166 171 -290 333 -162 173 -312 283 -182 159 -296 191 -300 RAW_Data: 165 -312 333 -160 311 -170 141 -318 331 -164 299 -148 321 -194 139 -316 165 -336 135 -340 133 -338 163 -300 149 -320 329 -164 171 -314 159 -312 163 -300 175 -298 193 -310 163 -312 159 -312 163 -300 175 -296 193 -312 163 -312 159 -312 163 -300 175 -298 167 -320 175 -290 191 -296 193 -286 187 -310 163 -300 175 -296 501 -458 187 -288 347 -154 151 -316 325 -162 171 -316 313 -152 301 -194 141 -316 331 -162 143 -314 311 -182 155 -294 189 -302 163 -314 309 -182 311 -168 143 -318 331 -162 301 -174 295 -194 141 -314 165 -336 135 -340 133 -338 163 -312 159 -294 327 -158 173 -314 163 -312 159 -306 173 -314 165 -306 191 -284 189 -284 189 -312 157 -294 191 -300 163 -314 187 -284 189 -284 187 -292 189 -296 165 -314 161 -312 189 -284 185 -294 189 -298 193 -286 485 -492 167 -298 323 -150 175 -302 331 -164 171 -300 321 -150 317 -166 167 -308 331 -134 171 -316 309 -182 129 -318 189 -302 163 -314 309 -182 311 -170 141 -318 331 -162 301 -148 321 -194 139 -314 167 -334 137 -338 161 -310 163 -312 159 -294 327 -160 171 -316 161 -312 159 -312 193 -270 175 -304 193 -314 163 -312 159 -312 161 -314 161 -296 189 -304 165 -312 187 -284 189 -276 173 -318 195 -278 193 -284 187 -312 163 -300 175 -298 169 -318 511 -460 147 -318 327 -168 169 -292 331 -164 171 -314 305 -160 315 -168 171 -290 333 -162 171 -314 283 -182 159 -294 189 -300 165 -314 307 -184 311 -170 141 -318 333 -162 299 -150 319 -194 141 -314 165 -336 135 -340 133 -338 163 -312 157 -294 327 -160 171 -316 163 -310 161 -304 175 -314 167 -304 191 -286 187 -284 189 -284 187 -292 189 -300 165 -312 189 -284 187 -286 185 -294 189 -296 165 -314 161 -312 187 -286 185 -294 189 -298 193 -284 485 -494 167 -298 321 -150 177 -312 313 -168 171 -292 331 -164 299 -174 151 -316 325 -162 171 -316 289 -176 151 -316 187 -296 167 -312 311 -180 307 -170 141 -318 331 -162 299 -150 319 -196 139 -314 165 -334 137 -340 159 -312 161 -302 149 -320 329 -164 171 -314 159 -312 163 -300 175 -298 193 -310 163 -312 161 -310 163 -312 161 -296 189 -302 191 -286 187 -284 189 -312 159 -292 189 -296 167 -314 161 -310 189 -284 187 -292 189 -300 193 -284 485 -494 167 -296 323 -150 175 -312 313 -170 169 -292 333 -162 299 -176 151 -314 327 -160 171 -316 291 -176 149 -316 189 -296 165 -314 309 -182 307 -168 141 -318 331 -164 299 -148 321 -194 141 -314 165 -334 137 -338 161 -312 RAW_Data: 161 -302 147 -320 331 -162 171 -314 161 -312 163 -300 175 -296 195 -310 163 -312 159 -312 163 -300 173 -296 193 -312 163 -312 159 -312 163 -300 175 -298 169 -318 177 -290 191 -296 195 -284 189 -284 189 -312 159 -296 513 -468 159 -300 333 -162 171 -300 323 -150 171 -314 325 -162 311 -164 171 -314 305 -160 159 -296 327 -160 171 -316 161 -312 161 -312 335 -170 311 -164 141 -324 321 -154 299 -194 309 -164 143 -326 167 -314 161 -312 159 -312 163 -302 173 -300 331 -162 173 -312 161 -312 163 -300 175 -300 167 -320 153 -312 191 -296 167 -312 161 -312 189 -312 159 -292 189 -298 167 -312 161 -312 159 -314 193 -268 177 -302 193 -316 161 -312 159 -312 193 -294 497 -456 187 -312 303 -166 165 -306 331 -132 201 -286 309 -182 313 -168 143 -318 331 -162 143 -314 311 -182 157 -294 189 -302 165 -312 309 -182 311 -170 141 -318 333 -162 299 -150 319 -194 141 -314 165 -334 137 -338 161 -312 161 -300 149 -320 331 -162 171 -314 161 -310 163 -302 173 -298 193 -310 165 -310 161 -310 163 -312 161 -296 189 -300 193 -286 187 -284 189 -312 157 -294 189 -298 165 -314 161 -310 189 -284 187 -292 189 -300 193 -284 485 -494 167 -298 321 -150 171 -318 323 -162 171 -314 289 -176 297 -194 141 -314 331 -162 143 -316 309 -182 155 -294 189 -302 163 -314 309 -182 311 -168 143 -318 331 -162 301 -148 321 -194 139 -314 167 -334 137 -338 161 -310 163 -300 149 -320 331 -162 171 -314 161 -312 163 -300 173 -298 193 -310 163 -312 159 -312 163 -300 175 -296 193 -312 163 -312 159 -312 163 -300 175 -298 167 -320 175 -290 191 -296 193 -286 187 -310 163 -312 161 -296 513 -468 159 -300 333 -162 171 -302 321 -150 175 -300 333 -162 311 -162 171 -316 289 -176 153 -314 327 -160 171 -316 163 -312 159 -312 307 -168 335 -138 169 -320 307 -164 297 -176 301 -194 141 -318 165 -336 137 -338 133 -338 163 -312 159 -294 327 -160 171 -316 161 -312 161 -312 163 -298 177 -302 169 -318 177 -292 189 -298 167 -312 189 -284 189 -312 157 -294 189 -298 167 -312 161 -312 159 -312 193 -270 203 -302 169 -314 161 -312 189 -310 467 -484 145 -318 327 -168 143 -316 331 -162 173 -312 307 -160 313 -170 141 -318 331 -164 143 -342 281 -184 157 -294 189 -302 165 -312 307 -184 313 -168 141 -320 331 -162 299 -150 319 -194 141 -314 165 -336 137 -338 135 -338 161 -312 159 -294 327 -158 173 -314 163 -310 161 -312 165 -298 175 -304 193 -312 163 -312 159 -312 RAW_Data: 163 -300 175 -298 169 -318 177 -290 191 -298 165 -314 161 -310 189 -284 185 -292 189 -298 193 -284 189 -310 163 -312 497 -460 145 -320 325 -170 169 -290 333 -162 171 -314 307 -158 317 -168 169 -290 333 -162 171 -314 281 -182 159 -296 189 -300 165 -312 309 -182 313 -168 143 -318 331 -162 301 -148 319 -196 139 -314 165 -336 137 -338 135 -338 161 -312 159 -294 327 -160 173 -314 163 -312 159 -312 163 -300 175 -302 195 -312 163 -312 159 -312 163 -300 175 -298 169 -318 175 -292 189 -300 165 -312 161 -312 187 -284 185 -292 189 -300 193 -284 187 -312 161 -314 471 -486 167 -314 313 -152 159 -300 335 -162 169 -308 321 -156 329 -170 127 -318 321 -176 155 -300 333 -164 169 -302 165 -314 161 -310 329 -168 299 -166 151 -328 311 -154 331 -168 299 -178 143 -318 153 -322 167 -332 149 -320 151 -318 165 -304 321 -156 181 -290 189 -300 173 -294 177 -294 189 -302 173 -294 177 -294 189 -302 173 -294 177 -318 193 -278 173 -294 179 -292 191 -302 173 -294 177 -294 189 -302 173 -320 177 -294 195 -278 175 -318 491 -460 163 -314 333 -158 159 -294 327 -160 171 -316 311 -180 307 -170 141 -318 331 -162 143 -316 309 -182 157 -294 189 -302 165 -312 309 -182 313 -168 141 -318 331 -164 299 -148 321 -194 141 -314 165 -334 137 -338 135 -338 161 -312 159 -294 329 -158 173 -314 163 -310 161 -306 173 -314 165 -304 193 -284 187 -286 189 -276 197 -294 193 -310 163 -312 161 -310 163 -300 175 -296 193 -310 165 -284 187 -310 163 -300 175 -300 169 -318 177 -316 483 -466 187 -292 341 -134 171 -308 319 -150 179 -300 333 -164 309 -162 171 -316 313 -152 153 -316 327 -160 171 -316 163 -310 161 -312 307 -166 337 -136 171 -322 305 -164 299 -174 301 -194 141 -318 165 -336 137 -338 161 -310 163 -300 149 -320 331 -162 171 -314 161 -312 163 -300 173 -296 195 -310 163 -312 159 -312 163 -312 159 -296 189 -302 165 -312 189 -284 189 -284 185 -294 189 -296 165 -314 161 -310 189 -284 187 -294 189 -298 193 -284 485 -494 167 -298 321 -150 177 -312 313 -168 171 -290 333 -162 299 -176 151 -316 325 -162 171 -316 289 -176 151 -314 189 -296 165 -314 309 -182 305 -170 141 -318 333 -162 299 -150 319 -194 141 -314 165 -334 137 -340 133 -338 161 -302 149 -320 329 -164 171 -286 187 -312 163 -300 173 -298 193 -310 163 -312 159 -312 163 -312 159 -296 189 -302 191 -286 187 -284 189 -312 159 -292 191 -296 165 -314 161 -310 189 -284 187 -292 RAW_Data: 189 -300 193 -284 485 -494 167 -298 321 -150 177 -300 327 -150 167 -328 305 -160 319 -168 171 -290 333 -162 171 -314 281 -184 159 -296 189 -300 165 -314 307 -184 311 -170 141 -318 333 -162 299 -150 319 -194 139 -314 167 -334 135 -340 133 -338 163 -312 159 -294 327 -158 173 -314 163 -312 159 -312 165 -298 177 -302 193 -314 163 -310 161 -312 163 -300 173 -300 167 -318 177 -292 189 -300 165 -312 161 -312 187 -284 185 -292 189 -300 191 -286 187 -284 189 -300 487 -484 149 -320 333 -138 171 -322 321 -154 151 -316 327 -160 311 -164 173 -312 307 -160 161 -298 355 -132 173 -314 163 -310 161 -312 335 -170 311 -164 143 -322 307 -164 323 -150 301 -196 141 -318 165 -334 137 -338 161 -312 161 -302 147 -320 331 -162 173 -312 161 -312 163 -300 173 -298 195 -310 163 -312 159 -312 163 -312 159 -296 189 -300 193 -284 189 -284 189 -284 185 -294 189 -296 165 -314 161 -312 189 -284 185 -294 189 -298 193 -286 485 -468 193 -296 323 -150 147 -340 313 -168 171 -292 331 -164 299 -174 151 -316 325 -160 173 -316 289 -176 149 -316 189 -294 165 -314 309 -182 307 -170 141 -318 331 -164 299 -148 321 -194 139 -314 167 -306 165 -338 133 -338 163 -312 159 -294 327 -160 173 -314 163 -312 161 -310 165 -300 175 -300 169 -318 177 -290 189 -298 165 -314 187 -284 189 -312 159 -294 189 -298 165 -314 161 -310 161 -306 173 -316 193 -280 191 -312 159 -312 163 -300 515 -460 161 -312 305 -190 135 -328 329 -134 201 -286 309 -182 311 -168 143 -318 331 -162 143 -316 309 -182 157 -294 189 -300 165 -312 309 -184 311 -168 143 -318 331 -162 301 -148 319 -196 139 -314 165 -334 137 -340 159 -312 163 -300 149 -318 331 -162 173 -312 161 -312 163 -300 175 -296 195 -310 163 -312 159 -312 163 -300 173 -296 193 -312 163 -312 159 -312 163 -312 161 -298 189 -300 165 -312 161 -312 189 -312 159 -292 191 -300 191 -286 485 -468 193 -298 323 -148 147 -342 323 -160 173 -314 289 -176 297 -196 139 -314 331 -162 143 -314 311 -180 157 -292 191 -300 165 -312 311 -182 309 -170 141 -318 333 -162 299 -150 319 -194 141 -314 165 -334 137 -338 161 -312 161 -312 159 -294 329 -158 173 -314 163 -310 161 -312 165 -298 175 -304 193 -312 163 -310 161 -310 163 -302 173 -300 169 -318 175 -292 189 -300 165 -312 161 -310 189 -278 173 -316 195 -280 191 -312 159 -312 163 -300 515 -460 163 -310 305 -190 137 -328 329 -134 199 -288 309 -182 311 -168 143 -318 RAW_Data: 331 -162 143 -316 309 -182 157 -292 191 -300 165 -312 309 -182 313 -168 141 -318 331 -164 299 -174 295 -194 141 -314 165 -334 137 -340 133 -338 163 -312 159 -292 327 -160 171 -316 163 -310 161 -312 165 -298 175 -304 193 -312 163 -312 159 -312 163 -300 175 -300 169 -316 177 -292 189 -298 167 -312 161 -310 189 -278 173 -316 193 -282 191 -312 159 -312 163 -300 515 -460 163 -310 305 -190 137 -326 331 -132 201 -286 309 -184 309 -170 141 -318 333 -162 143 -314 311 -180 159 -294 189 -300 165 -312 309 -184 311 -168 143 -318 331 -162 301 -148 319 -196 139 -314 165 -336 135 -340 159 -312 163 -300 149 -320 329 -164 171 -314 159 -312 163 -300 175 -296 195 -310 163 -312 159 -312 163 -300 175 -294 195 -310 163 -312 161 -310 163 -300 175 -298 169 -318 153 -314 191 -296 193 -286 187 -284 189 -312 161 -294 509 -468 159 -298 335 -162 169 -304 323 -150 175 -300 335 -162 311 -160 173 -316 313 -152 151 -316 327 -160 171 -316 163 -312 159 -312 307 -168 335 -138 169 -322 305 -164 299 -176 299 -194 141 -316 167 -334 137 -340 159 -312 161 -302 147 -320 331 -162 173 -312 161 -312 163 -300 175 -296 193 -310 165 -310 161 -312 161 -302 173 -296 195 -310 163 -312 161 -310 163 -300 175 -298 169 -318 177 -290 189 -296 193 -286 187 -310 163 -300 175 -296 501 -484 161 -288 347 -154 151 -316 325 -160 173 -314 313 -152 301 -196 141 -314 331 -162 143 -316 309 -182 157 -294 189 -300 165 -314 309 -182 311 -168 143 -318 331 -162 301 -148 319 -196 139 -314 165 -336 137 -338 133 -338 163 -312 159 -294 327 -158 173 -316 161 -312 159 -312 163 -298 177 -302 193 -314 163 -312 159 -312 163 -300 175 -298 169 -318 177 -290 191 -298 165 -314 161 -310 189 -284 193 -292 179 -308 167 -314 161 -312 189 -302 481 -460 173 -320 303 -168 169 -294 331 -164 171 -314 307 -160 319 -168 169 -292 331 -162 143 -342 283 -182 159 -294 189 -302 165 -312 309 -184 311 -168 143 -318 331 -162 299 -150 319 -194 141 -314 165 -336 135 -340 133 -338 163 -312 159 -294 327 -158 173 -316 161 -312 159 -312 165 -298 177 -302 193 -312 163 -312 161 -310 163 -314 161 -296 189 -302 165 -312 187 -284 189 -284 185 -294 189 -296 165 -314 187 -284 189 -302 173 -294 195 -310 491 -458 163 -318 319 -156 153 -314 327 -160 171 -316 311 -152 327 -170 141 -316 331 -164 143 -314 309 -182 157 -294 189 -300 165 -314 309 -182 311 -168 143 -316 333 -162 299 -150 RAW_Data: 15041 -66 15883 -66 12643 -66 12681 -66 3413 -68 2713 -68 33389 -66 1445 -66 1279 -68 1027 -66 6911 -98 25229 -66 3967 -100 3019 -100 6131 -66 955 -66 3605 -66 12411 -98 1419 -66 3593 -68 2753 -66 2457 -66 6007 -66 627 -100 1597 -66 3071 -98 22749 -66 333 -66 12829 -66 4313 -132 855 -66 44097 -64 20391 -98 29999 -66 3539 -98 557 -66 1489 -100 4081 -100 3857 -64 2895 -132 2261 -166 3089 -66 2429 -68 34467 -66 3585 -66 3087 -66 3329 -132 5287 -66 1063 -98 15259 -100 2535 -66 995 -66 13057 -100 24233 -68 531 -100 26415 -66 1761 -100 2717 -66 4071 -100 12191 -66 23367 -68 2323 -66 19809 -248 245 -1388 255 -242 275 -1358 273 -1370 277 -246 277 -1368 275 -246 275 -1362 275 -244 275 -1364 275 -244 275 -1362 275 -244 275 -1328 273 -278 273 -1358 275 -246 275 -238 263 -1384 275 -246 273 -1358 275 -244 273 -1358 275 -246 275 -1360 275 -1344 277 -246 275 -1358 275 -244 275 -234 263 -1382 277 -1344 277 -246 279 -1362 275 -246 271 -234 261 -1380 275 -246 273 -1360 275 -246 275 -1366 277 -1340 277 -248 279 -238 263 -1382 275 -1344 277 -246 279 -1364 277 -244 275 -234 263 -1382 277 -244 273 -1358 275 -1344 277 -248 279 -1368 275 -244 273 -1360 239 -280 271 -1358 275 -244 275 -1358 275 -174 269 -10298 289 -2660 267 -238 299 -1356 275 -244 275 -1356 275 -1344 277 -248 277 -1360 275 -246 275 -1328 309 -244 273 -1358 277 -244 275 -1356 275 -246 273 -1326 309 -244 275 -1356 275 -246 273 -234 263 -1380 277 -246 273 -1326 309 -244 273 -1356 277 -246 277 -1358 275 -1338 279 -248 279 -1364 275 -246 273 -234 261 -1380 277 -1344 279 -250 277 -1330 309 -244 273 -232 261 -1384 275 -246 273 -1356 275 -248 275 -1360 275 -1340 279 -248 277 -236 263 -1380 277 -1342 279 -248 279 -1366 275 -246 273 -234 263 -1380 275 -246 275 -1358 275 -1340 279 -248 281 -1336 309 -244 273 -1358 275 -246 273 -1360 275 -244 273 -1358 275 -176 267 -10306 257 -2646 299 -234 301 -1354 277 -246 275 -1356 277 -1340 279 -250 279 -1332 309 -244 275 -1358 275 -248 273 -1326 309 -246 273 -1326 309 -244 275 -1356 277 -248 275 -1328 309 -246 273 -234 261 -1382 277 -246 277 -1326 309 -244 275 -1358 277 -246 277 -1356 277 -1346 277 -250 277 -1358 277 -246 275 -234 263 -1382 279 -1346 279 -248 281 -1330 307 -246 273 -236 261 -1380 277 -246 277 -1360 277 -246 277 -1360 275 -1344 279 -248 279 -236 263 -1384 277 -1340 279 -250 281 -1338 307 -246 271 -234 261 -1384 277 -246 275 -1356 277 -1340 279 -250 283 -1336 309 -246 273 -1356 277 -246 273 -1360 277 -246 RAW_Data: 275 -1328 309 -174 269 -10296 289 -2648 267 -238 299 -1356 277 -246 275 -1324 307 -1342 279 -250 277 -1330 309 -244 275 -1362 277 -244 275 -1356 275 -248 273 -1328 309 -244 273 -1328 309 -244 275 -1360 277 -246 275 -234 259 -1384 277 -246 275 -1360 275 -246 273 -1358 277 -248 277 -1362 275 -1344 277 -248 277 -1328 307 -246 273 -236 261 -1384 277 -1348 279 -248 279 -1360 277 -246 273 -234 263 -1388 275 -246 275 -1360 277 -248 279 -1368 277 -1344 279 -248 279 -240 265 -1386 275 -1342 279 -286 247 -1372 275 -248 275 -238 265 -1386 277 -248 275 -1360 275 -1344 277 -286 247 -1374 275 -246 275 -1362 277 -246 275 -1360 277 -248 275 -1326 307 -174 269 -10290 287 -2654 269 -236 301 -1352 275 -248 273 -1326 311 -1340 277 -248 277 -1328 309 -244 273 -1358 275 -244 275 -1326 309 -244 273 -1356 277 -244 273 -1356 275 -246 275 -1358 275 -244 275 -234 261 -1382 277 -246 273 -1358 275 -246 273 -1360 277 -246 273 -1324 309 -1340 277 -248 277 -1328 307 -246 271 -234 259 -1382 277 -1346 279 -248 277 -1330 309 -244 271 -232 259 -1382 277 -244 275 -1356 277 -248 273 -1354 277 -1342 277 -248 275 -236 261 -1380 277 -1344 277 -248 279 -1330 307 -246 273 -234 261 -1378 277 -246 273 -1356 277 -1342 277 -248 277 -1330 309 -244 273 -1322 307 -246 273 -1326 309 -244 273 -1322 309 -176 267 -10298 257 -2682 265 -236 299 -1324 309 -248 273 -1324 311 -1342 277 -246 279 -1360 277 -244 275 -1362 275 -244 275 -1358 275 -244 275 -1360 275 -246 273 -1360 275 -244 277 -1360 275 -246 273 -234 263 -1384 275 -246 273 -1358 275 -246 275 -1360 277 -246 277 -1356 277 -1342 279 -248 277 -1364 275 -244 275 -234 261 -1384 275 -1344 277 -250 279 -1366 275 -246 273 -236 263 -1384 277 -246 275 -1358 277 -246 277 -1362 277 -1342 279 -248 279 -236 265 -1382 277 -1346 277 -248 281 -1366 275 -246 275 -234 265 -1384 275 -246 273 -1358 277 -1344 279 -248 279 -1364 275 -244 275 -1324 309 -246 273 -1324 307 -246 273 -1326 309 -174 267 -118796 133 -100 131 -892 329 -166 199 -132 131 -166 99 -100 265 -264 4663 -134 4889 -100 365 -98 5921 -100 5903 -68 4877 -98 2953 -98 1645 -64 1687 -66 981 -98 10769 -66 18319 -66 4831 -66 13301 -66 893 -132 5967 -100 15949 -66 3749 -66 497 -100 625 -66 1147 -66 469 -66 1261 -66 3651 -100 265 -100 26741 -68 6873 -66 4485 -100 2667 -68 3159 -68 2857 -132 2655 -66 12903 -66 1277 -66 1711 -66 787 -100 1327 -198 727 -64 1677 -100 1187 -66 1019 -66 891 -66 4303 -100 11297 -66 3923 -254 253 -1380 247 -292 253 -1344 RAW_Data: 277 -1346 277 -250 279 -1364 275 -244 275 -1362 275 -244 275 -1356 275 -246 273 -1358 241 -278 273 -1356 275 -246 273 -1360 275 -246 273 -234 263 -1382 275 -244 273 -1358 275 -246 273 -1360 275 -246 273 -1358 275 -1340 277 -248 277 -1362 275 -246 273 -234 261 -1380 277 -1344 277 -248 279 -1362 275 -244 273 -236 261 -1380 275 -244 275 -1360 275 -246 275 -1358 275 -1346 277 -246 275 -236 263 -1384 275 -1342 277 -248 277 -1364 277 -244 273 -234 261 -1378 277 -246 273 -1356 277 -1340 277 -248 281 -1334 307 -246 271 -1356 275 -246 273 -1358 275 -244 273 -1326 309 -174 267 -10296 257 -2650 297 -232 263 -1384 277 -244 273 -1358 275 -1340 279 -248 279 -1328 309 -244 275 -1328 307 -244 273 -1356 275 -244 275 -1358 275 -246 273 -1324 309 -244 275 -1328 307 -244 273 -234 261 -1382 275 -246 273 -1326 309 -244 273 -1358 275 -246 273 -1358 275 -1338 279 -248 279 -1330 309 -244 273 -232 261 -1380 277 -1344 279 -248 279 -1330 309 -244 271 -234 261 -1382 275 -246 273 -1358 277 -244 275 -1330 309 -1338 277 -246 277 -236 263 -1380 277 -1342 277 -248 279 -1364 275 -246 273 -232 261 -1380 275 -248 275 -1328 307 -1338 277 -248 279 -1334 309 -244 271 -1358 275 -244 275 -1324 307 -246 271 -1328 309 -174 265 -10270 291 -2640 297 -232 297 -1350 277 -248 275 -1326 309 -1340 277 -248 277 -1328 309 -244 273 -1358 275 -246 273 -1326 309 -244 273 -1354 275 -246 273 -1330 307 -244 273 -1358 275 -246 273 -234 263 -1380 275 -246 273 -1358 275 -246 273 -1360 275 -244 273 -1358 275 -1340 277 -248 279 -1364 275 -244 273 -232 261 -1380 277 -1342 279 -250 279 -1332 307 -244 271 -234 261 -1378 277 -246 273 -1358 275 -248 275 -1360 275 -1340 277 -248 275 -236 263 -1382 277 -1344 277 -246 277 -1364 275 -246 273 -234 259 -1380 275 -246 273 -1362 275 -1342 275 -248 277 -1334 309 -244 271 -1356 275 -244 275 -1326 307 -244 273 -1356 275 -176 267 -10290 289 -2644 267 -238 301 -1320 309 -246 273 -1324 309 -1340 277 -248 277 -1328 307 -246 273 -1326 307 -246 273 -1324 309 -246 273 -1322 309 -246 273 -1322 307 -246 275 -1326 309 -246 273 -234 259 -1382 275 -246 275 -1322 309 -246 273 -1326 309 -246 273 -1326 309 -1340 277 -248 275 -1326 309 -246 273 -232 261 -1380 279 -1346 277 -250 277 -1328 309 -244 271 -232 261 -1380 277 -246 273 -1358 275 -248 273 -1328 307 -1340 277 -248 277 -236 261 -1380 277 -1344 277 -248 279 -1328 309 -244 275 -232 261 -1378 277 -248 273 -1326 309 -1344 277 -248 277 -1358 277 -246 273 -1328 307 -244 271 -1324 309 -244 RAW_Data: 273 -1324 309 -174 267 -10270 289 -2638 297 -234 297 -1352 275 -248 275 -1328 307 -1340 277 -248 275 -1330 309 -244 273 -1358 275 -244 275 -1326 309 -244 271 -1356 275 -244 275 -1326 307 -246 273 -1326 309 -244 273 -234 261 -1378 275 -248 275 -1326 309 -244 271 -1356 277 -248 273 -1328 309 -1338 277 -248 277 -1328 309 -244 271 -232 261 -1380 277 -1348 279 -248 277 -1328 307 -246 271 -234 259 -1384 275 -244 275 -1356 277 -246 275 -1326 309 -1344 275 -248 275 -236 261 -1378 277 -1342 277 -250 279 -1334 309 -244 271 -232 261 -1380 277 -246 273 -1326 307 -1344 277 -248 277 -1328 309 -246 273 -1326 309 -244 271 -1324 309 -244 273 -1324 307 -176 267 -10288 287 -2618 299 -236 299 -1354 277 -244 273 -1326 307 -1340 279 -248 275 -1328 309 -244 275 -1326 309 -246 273 -1324 307 -246 273 -1322 309 -244 273 -1322 309 -244 275 -1328 309 -246 273 -232 261 -1380 277 -246 275 -1324 309 -244 273 -1356 277 -246 275 -1324 309 -1340 279 -246 277 -1328 309 -244 273 -232 261 -1382 277 -1344 279 -250 277 -1324 309 -246 273 -234 261 -1380 277 -246 273 -1358 277 -246 273 -1328 309 -1340 277 -248 275 -236 261 -1380 275 -1344 279 -248 279 -1360 277 -244 273 -234 261 -1380 277 -246 275 -1354 277 -1344 277 -248 277 -1328 311 -246 273 -1324 307 -244 273 -1324 309 -244 273 -1320 309 -176 269 -118210 761 -168 267 -66 563 -132 99 -132 3543 -66 5345 -100 4355 -66 4617 -68 20503 -166 2379 -132 293 -98 4117 -66 1151 -98 3353 -66 3485 -66 2491 -66 6133 -66 233 -68 16307 -68 16959 -98 357 -66 5419 -134 799 -100 327 -100 791 -66 2481 -66 963 -100 3481 -98 1679 -134 2473 -100 227 -68 3087 -66 11527 -130 4305 -98 435 -66 563 -100 2887 -100 267 -66 1787 -66 9655 -66 4793 -100 2119 -66 359 -98 1313 -132 3393 -234 995 -66 2681 -98 99 -130 1379 -100 3757 -100 21695 -132 5135 -100 693 -98 4631 -100 2325 -68 4937 -66 10409 -98 897 -100 1287 -66 2565 -66 3753 -66 4055 -66 2023 -68 1961 -68 629 -66 431 -66 5039 -66 2155 -100 2673 -66 1163 -98 6539 -100 825 -66 1197 -100 3053 -66 13973 -68 15515 -100 1861 -66 1027 -66 797 -98 959 -98 787 -132 787 -64 3811 -132 1747 -66 6683 -66 1033 -68 24927 -66 1259 -100 1125 -68 663 -66 1687 -66 4357 -132 4567 -66 3969 -98 3317 -132 433 -134 6043 -66 3249 -100 431 -98 2367 -100 11265 -66 5085 -68 2355 -64 1815 -66 1395 -274 241 -1366 275 -244 275 -1362 275 -1338 277 -284 243 -1368 239 -278 275 -1362 275 -244 275 -1360 241 -278 273 -1356 275 -246 275 -1360 239 -280 275 -1360 RAW_Data: 275 -244 275 -234 263 -1386 239 -280 273 -1356 275 -244 273 -1360 275 -244 277 -1364 275 -1336 277 -248 277 -1366 275 -244 273 -234 263 -1386 275 -1340 277 -248 279 -1364 275 -244 275 -234 263 -1384 273 -244 275 -1358 275 -244 275 -1364 275 -1342 275 -248 277 -236 265 -1384 275 -1340 277 -282 243 -1366 275 -246 273 -236 263 -1382 277 -244 275 -1358 275 -1342 277 -248 277 -1364 275 -246 275 -1360 239 -280 273 -1358 241 -278 275 -1356 275 -210 233 -10302 257 -2652 297 -232 297 -1354 277 -244 275 -1358 275 -1340 279 -248 279 -1360 275 -246 275 -1360 275 -246 273 -1360 275 -244 275 -1328 309 -242 273 -1324 309 -244 275 -1360 275 -246 273 -234 261 -1384 275 -246 273 -1358 275 -244 275 -1358 277 -248 273 -1358 275 -1340 279 -248 277 -1334 307 -242 273 -232 261 -1380 277 -1348 277 -250 277 -1364 275 -244 275 -234 261 -1380 277 -244 275 -1358 277 -246 277 -1360 277 -1342 275 -248 275 -236 263 -1380 277 -1344 277 -248 279 -1368 275 -244 275 -232 261 -1382 277 -244 275 -1356 275 -1344 277 -248 279 -1362 275 -246 275 -1360 275 -246 273 -1356 275 -246 273 -1356 275 -176 267 -10302 257 -2648 299 -234 297 -1352 277 -246 275 -1326 309 -1340 279 -248 277 -1330 309 -244 275 -1328 309 -244 273 -1324 309 -244 275 -1324 309 -246 273 -1324 307 -246 275 -1328 309 -244 273 -234 261 -1378 277 -248 275 -1328 309 -244 273 -1356 277 -248 275 -1326 309 -1344 277 -248 275 -1326 309 -246 273 -234 259 -1380 277 -1348 281 -248 279 -1328 307 -246 273 -234 259 -1382 277 -246 275 -1360 275 -248 275 -1324 309 -1340 279 -248 277 -238 261 -1382 277 -1344 277 -248 279 -1330 311 -244 273 -234 259 -1378 277 -248 275 -1326 309 -1340 279 -248 279 -1336 307 -246 271 -1324 309 -244 275 -1324 307 -246 273 -1326 309 -174 269 -10296 257 -2648 299 -234 297 -1352 277 -248 273 -1326 309 -1342 277 -248 277 -1328 309 -246 275 -1328 309 -244 273 -1326 309 -244 273 -1322 309 -244 273 -1328 307 -244 275 -1328 309 -246 273 -234 261 -1382 277 -246 275 -1326 309 -244 273 -1352 277 -248 275 -1330 309 -1340 277 -248 277 -1328 309 -244 275 -232 261 -1384 277 -1342 279 -250 279 -1328 309 -244 273 -234 263 -1380 277 -246 273 -1360 277 -246 275 -1326 309 -1340 277 -250 277 -236 263 -1382 277 -1342 277 -248 279 -1362 277 -246 273 -234 263 -1382 277 -244 275 -1356 277 -1340 279 -248 279 -1362 275 -246 275 -1328 307 -246 273 -1356 275 -246 273 -1356 275 -174 269 -10292 287 -2650 269 -236 301 -1354 275 -248 273 -1358 275 -1340 279 -248 277 -1332 307 -246 275 -1328 RAW_Data: 309 -244 273 -1324 309 -244 273 -1356 275 -246 273 -1358 275 -244 277 -1330 309 -244 273 -234 261 -1382 277 -244 275 -1358 275 -246 273 -1356 277 -248 275 -1360 275 -1340 277 -248 277 -1360 275 -246 273 -236 261 -1382 279 -1344 279 -248 279 -1360 277 -244 273 -234 261 -1380 277 -246 275 -1360 277 -246 273 -1360 275 -1342 279 -248 275 -236 263 -1382 275 -1344 279 -248 279 -1362 277 -246 273 -234 263 -1380 277 -246 275 -1356 275 -1342 277 -248 281 -1336 307 -246 271 -1354 277 -246 275 -1328 307 -244 273 -1352 277 -176 269 -10300 257 -2650 299 -232 297 -1354 277 -246 275 -1356 277 -1342 277 -248 279 -1328 309 -244 275 -1360 275 -246 273 -1328 307 -246 273 -1356 277 -246 277 -1326 309 -244 277 -1360 277 -246 273 -234 263 -1384 277 -246 275 -1324 309 -246 275 -1358 277 -246 277 -1360 277 -1344 277 -248 277 -1326 309 -246 273 -236 261 -1382 277 -1348 279 -250 281 -1330 307 -246 273 -234 263 -1386 277 -244 275 -1356 277 -248 277 -1362 277 -1342 277 -250 277 -238 263 -1384 277 -1342 277 -250 281 -1332 309 -246 273 -234 263 -1380 277 -246 275 -1360 277 -1342 279 -248 281 -1334 307 -246 273 -1356 275 -248 275 -1328 309 -244 275 -1324 309 -176 269 -115034 163 -362 67 -894 529 -166 14663 -98 4135 -66 3681 -100 299 -68 9829 -66 3517 -64 21569 -66 3251 -66 2209 -64 23701 -66 3359 -68 1057 -66 723 -66 299 -134 765 -66 589 -98 1687 -134 2153 -66 3081 -68 10447 -66 11643 -66 2451 -66 2277 -66 2897 -66 755 -100 5539 -64 5117 -132 4867 -134 3931 -64 625 -66 1317 -98 11597 -66 2255 -66 1165 -66 1123 -66 6371 -100 699 -68 1811 -66 621 -68 2191 -64 1291 -134 3003 -66 2423 -64 1463 -66 663 -100 1127 -100 6169 -100 489 -100 6087 -100 2027 -66 1195 -66 13195 -66 557 -66 40423 -98 1919 -100 1061 -132 201 -66 2553 -132 12549 -66 1789 -100 921 -134 1067 -66 729 -66 10029 -66 3909 -100 265 -100 16017 -134 21177 -68 2461 -66 2215 -68 1197 -66 5911 -66 2645 -66 3419 -132 16275 -64 5091 -68 2123 -66 2677 -64 10305 -66 12381 -100 427 -166 25331 -66 2457 -66 11859 -248 279 -1368 275 -246 275 -1360 275 -1340 277 -246 279 -1364 239 -278 275 -1358 275 -244 275 -1362 239 -278 273 -1358 239 -280 271 -1360 241 -278 273 -1360 275 -244 275 -234 261 -1384 239 -280 273 -1356 275 -244 273 -1360 275 -244 275 -1358 275 -1344 277 -248 275 -1358 275 -244 273 -236 261 -1384 275 -1342 279 -246 279 -1360 275 -244 275 -234 263 -1384 239 -278 273 -1358 275 -244 275 -1362 275 -1342 275 -248 275 -238 263 -1382 275 -1344 275 -248 RAW_Data: 277 -1364 275 -244 273 -234 263 -1380 275 -246 273 -1358 275 -1342 277 -246 279 -1366 275 -244 273 -1362 239 -278 239 -1386 275 -246 273 -1360 241 -208 269 -10290 257 -2686 265 -232 265 -1384 275 -246 275 -1358 275 -1344 277 -248 275 -1358 275 -246 275 -1360 277 -244 273 -1326 309 -244 271 -1354 275 -244 275 -1358 275 -246 273 -1358 275 -246 273 -234 263 -1378 275 -246 275 -1360 275 -244 273 -1356 275 -246 275 -1360 275 -1342 277 -246 277 -1360 275 -246 273 -232 261 -1382 277 -1342 279 -248 279 -1360 275 -244 275 -232 261 -1380 277 -244 275 -1356 277 -246 277 -1360 275 -1342 277 -246 275 -236 263 -1384 275 -1342 277 -248 277 -1362 275 -246 273 -234 261 -1378 277 -246 275 -1328 307 -1340 277 -246 279 -1366 275 -244 273 -1326 307 -244 273 -1324 309 -244 273 -1356 275 -174 267 -10304 255 -2648 297 -230 263 -1382 277 -244 275 -1330 307 -1338 277 -248 277 -1330 309 -244 273 -1356 275 -246 273 -1362 275 -244 273 -1356 275 -244 273 -1326 307 -244 273 -1360 273 -246 273 -236 261 -1380 275 -244 275 -1328 307 -244 273 -1358 275 -244 275 -1360 275 -1342 277 -246 277 -1364 275 -244 271 -232 261 -1384 277 -1340 279 -248 279 -1360 275 -246 273 -234 261 -1380 275 -244 275 -1360 277 -244 275 -1356 275 -1342 279 -246 277 -236 263 -1382 275 -1340 277 -248 279 -1366 275 -246 271 -234 261 -1382 277 -244 275 -1354 275 -1342 277 -248 277 -1364 273 -246 273 -1362 275 -244 271 -1360 275 -244 273 -1358 275 -174 267 -10272 289 -2646 265 -262 261 -1382 277 -244 275 -1356 275 -1342 277 -248 277 -1364 275 -244 275 -1360 275 -244 273 -1358 275 -244 273 -1358 275 -244 273 -1326 307 -244 275 -1358 275 -246 273 -234 261 -1382 275 -246 273 -1358 275 -244 273 -1358 275 -246 275 -1360 275 -1338 277 -248 277 -1362 277 -244 271 -234 261 -1380 277 -1344 279 -248 277 -1332 273 -278 271 -234 261 -1382 275 -244 275 -1356 277 -246 275 -1360 277 -1340 277 -246 277 -234 263 -1384 275 -1342 277 -248 277 -1366 275 -244 273 -234 261 -1380 275 -246 273 -1360 275 -1340 277 -246 279 -1334 307 -244 273 -1356 275 -246 273 -1360 275 -244 271 -1354 277 -174 269 -10300 257 -2648 297 -230 263 -1384 277 -244 273 -1356 277 -1342 277 -248 277 -1362 275 -244 275 -1330 307 -244 273 -1324 309 -244 273 -1324 307 -246 273 -1326 307 -244 273 -1358 275 -246 273 -234 261 -1380 277 -246 273 -1358 275 -244 275 -1354 277 -248 275 -1360 275 -1338 279 -246 277 -1360 275 -244 273 -234 261 -1378 279 -1344 279 -248 279 -1330 309 -244 271 -232 261 -1380 277 -246 273 -1360 RAW_Data: 277 -244 275 -1360 275 -1340 277 -246 277 -236 261 -1380 275 -1346 277 -248 277 -1362 275 -246 273 -234 263 -1380 275 -244 275 -1358 275 -1340 277 -248 279 -1334 309 -244 273 -1324 307 -246 273 -1356 275 -244 273 -1356 275 -174 269 -10302 257 -2644 297 -232 263 -1384 277 -246 275 -1354 275 -1344 277 -248 275 -1360 275 -246 275 -1358 275 -246 273 -1326 307 -246 273 -1324 307 -244 273 -1328 307 -244 273 -1358 275 -244 273 -236 261 -1380 275 -246 273 -1358 275 -244 273 -1358 275 -246 273 -1360 275 -1344 275 -248 275 -1360 275 -244 273 -234 261 -1378 277 -1344 279 -248 277 -1362 275 -246 273 -234 261 -1378 275 -244 275 -1360 275 -246 275 -1358 275 -1344 277 -246 277 -234 263 -1380 275 -1338 279 -246 281 -1368 275 -244 271 -234 261 -1386 275 -244 271 -1358 275 -1342 277 -246 279 -1362 275 -244 275 -1326 273 -278 273 -1358 239 -278 273 -1358 275 -174 267 -127478 195 -964 2317 -66 763 -98 1455 -100 16109 -66 5683 -98 11469 -66 34413 -66 5443 -66 11613 -66 2737 -66 12191 -66 2951 -68 1851 -68 1895 -68 2643 RAW_Data: 29262 361 -68 2635 -66 24113 -66 1131 -100 4157 -66 26253 -130 621 -18438 99 -298 231 -66 197 -496 753 -230 7503 -16526 65 -396 65 -296 99 -196 293 -64 429 -132 397 -66 329 -66 37701 -66 13475 -100 54967 -64 18209 -18340 97 -462 197 -98 587 -232 97 -100 259 -98 197 -262 297 -64 557 -100 599 -100 333 -234 42493 -13212 6449 -206 173 -214 217 -176 195 -218 181 -218 181 -182 217 -182 217 -176 187 -214 215 -180 217 -182 217 -182 217 -178 185 -424 1177 -388 387 -240 381 -214 181 -398 211 -380 419 -176 217 -394 203 -394 205 -380 189 -402 421 -168 219 -398 393 -190 191 -398 205 -406 185 -402 381 -212 215 -362 241 -378 421 -176 377 -218 197 -378 427 -210 393 -172 429 -172 397 -212 217 -362 389 -228 197 -372 417 -204 395 -210 181 -398 391 -192 201 -216888 761 -200 299 -166 695 -132 15435 -66 5611 -66 21049 -66 4947 -66 2355 -66 1921 -100 2223 -100 2107 -100 397 -98 3643 -66 5301 -98 14205 -66 37371 -246 175 -216 179 -216 177 -224 149 -246 159 -228 181 -212 201 -204 159 -244 151 -254 169 -214 181 -210 197 -182 181 -454 1141 -444 357 -228 361 -246 177 -396 209 -412 367 -188 187 -434 201 -394 185 -406 193 -402 377 -238 181 -386 381 -234 153 -424 205 -412 157 -412 383 -240 181 -398 203 -392 385 -236 371 -212 179 -400 383 -240 359 -210 375 -220 381 -246 175 -394 383 -240 181 -398 363 -222 379 -246 175 -394 383 -204 217 -182856 99 -66 99 -300 133 -402 65 -198 99 -328 65 -100 491 -164 593 -100 3547 -64 361 -66 789 -68 2521 -66 22883 -66 2659 -98 3309 -130 3789 -100 9689 -17178 99 -1388 65 -266 197 -100 131 -134 99 -232 627 -130 233 -66 1949 -100 14567 -198 165 -256 181 -208 159 -214 183 -220 163 -244 149 -246 159 -236 181 -254 141 -226 151 -246 157 -228 181 -212 201 -400 1163 -428 379 -230 355 -244 177 -396 207 -412 367 -222 157 -418 189 -410 207 -412 171 -430 357 -226 165 -404 413 -204 181 -428 173 -428 169 -426 353 -236 173 -414 173 -408 381 -244 337 -222 201 -408 397 -208 393 -204 395 -208 359 -246 177 -394 387 -200 205 -380 415 -202 395 -208 181 -432 357 -226 169 -195084 65 -300 763 -66 297 -364 593 -68 2883 -66 1357 -68 363 -98 3841 -66 3119 -66 5153 -66 4023 -268 143 -246 133 -290 141 -250 139 -254 141 -226 181 -248 137 -254 143 -252 139 -252 143 -230 181 -250 139 -254 145 -436 1135 -448 349 -240 347 -254 157 -434 167 -426 377 -226 157 -434 167 -426 155 -440 163 -434 375 -206 215 -380 381 -234 153 RAW_Data: -424 205 -412 159 -412 381 -240 181 -398 203 -392 387 -236 369 -212 179 -400 383 -240 359 -244 339 -222 381 -246 175 -394 383 -240 181 -398 363 -222 381 -244 175 -392 383 -240 181 -184002 99 -360 63 -330 65 -132 129 -232 97 -198 295 -328 6031 -66 831 -132 3417 -66 2187 -64 2183 -100 6535 -66 1127 -66 2569 -66 2031 -66 2271 -66 2183 -66 3815 -66 3803 -66 493 -66 1909 -66 1627 -98 4805 -17512 67 -2164 131 -498 265 -430 163 -98 97 -64 99 -230 99 -100 229 -230 165 -196 63 -132 99 -66 927 -66 14955 -66 19621 -68 2627 -66 14305 -68 23247 -66 2891 -66 3941 -66 3021 -212 173 -242 181 -218 181 -214 181 -208 157 -250 141 -248 181 -218 179 -214 179 -210 159 -250 179 -214 181 -218 181 -404 1153 -404 389 -244 375 -192 181 -436 161 -414 383 -240 181 -398 205 -392 201 -394 205 -394 365 -246 177 -396 383 -204 217 -398 171 -426 167 -428 353 -242 173 -420 173 -408 373 -220 403 -208 175 -422 381 -194 399 -228 357 -246 355 -210 215 -400 387 -208 181 -398 391 -226 353 -246 177 -398 383 -204 217 -185098 163 -166 525 -98 293 -100 63 -66 229 -66 1183 -66 1507 -66 3089 -98 30187 -66 2847 -19112 133 -364 131 -394 97 -166 295 -66 229 -164 227 -66 263 -130 623 -98 2071 -66 493 -66 787 -98 691 -64 10249 -132 3879 -66 1949 -66 3453 -198 23157 -66 2845 -100 1193 -66 1587 -100 3797 -98 3187 -100 3319 -66 22119 -98 5513 -226 155 -244 153 -256 131 -248 151 -246 159 -262 121 -274 133 -272 127 -244 153 -254 167 -248 145 -244 133 -252 177 -398 1169 -418 381 -238 359 -242 141 -430 169 -426 357 -274 139 -422 171 -442 173 -428 167 -426 353 -236 171 -416 379 -226 149 -436 161 -438 173 -406 381 -234 153 -424 205 -380 389 -244 359 -206 215 -384 381 -246 335 -224 383 -246 355 -244 179 -404 385 -206 181 -432 359 -226 355 -246 175 -398 383 -240 181 -179760 97 -168 727 -66 97 -332 1389 -66 2793 -66 4955 -100 12453 -100 2425 -66 21965 -66 3809 -68 1683 -66 3095 -66 2153 -64 999 -208 173 -220 181 -214 191 -196 181 -212 183 -220 191 -212 181 -214 191 -198 181 -212 181 -222 191 -212 181 -214 191 -416 1167 -424 369 -220 373 -210 209 -390 207 -376 403 -190 187 -418 189 -408 209 -412 173 -428 357 -226 169 -404 399 -208 179 -412 209 -396 169 -428 355 -230 201 -378 205 -406 381 -244 339 -222 193 -400 413 -204 393 -208 347 -220 401 -210 175 -422 383 -202 217 -398 365 -222 377 -246 175 -390 385 -204 217 -179890 165 -1552 131 -164 65 RAW_Data: -1448 361 -17056 131 -134 233 -1462 131 -166 953 -100 261 -164 5077 -272 137 -268 143 -252 141 -248 143 -246 159 -252 141 -244 143 -290 107 -276 145 -244 131 -250 179 -248 143 -252 141 -414 1165 -424 373 -236 359 -242 145 -434 169 -428 355 -230 169 -442 173 -434 157 -406 193 -402 379 -238 181 -422 335 -252 157 -434 167 -428 185 -406 381 -208 211 -390 207 -410 381 -200 373 -236 171 -414 383 -202 393 -210 379 -220 373 -208 211 -390 383 -204 217 -398 365 -220 379 -244 175 -394 381 -240 181 -161030 97 -166 167 -930 593 -2670 1091 -132 229 -98 461 -164 1649 -66 6311 -100 44723 -16832 67 -2656 131 -132 99 -132 263 -100 399 -68 893 -18950 99 -164 165 -198 525 -998 335 -66 565 -66 1057 -17880 97 -360 195 -262 131 -332 625 -98 197 -230 455 -98 9343 -16498 67 -368 131 -598 65 -1066 333 -300 789 -130 757 -66 87207 -16554 97 -3520 97 -786 591 -64 461 -98 21495 -66 24811 -18448 131 -296 491 -134 163 -760 1091 -230 893 -66 927 -68 4581 -68 32965 -64 45217 -17292 131 -1684 231 -132 327 -64 163 -330 263 -230 25751 RAW_Data: -66 529 -66 2519 -66 265 -68 10101 -1794 65 -1890 393 -562 97 -132 197 -98 493 -330 97 -164 97 -230 327 -326 99 -100 97 -164 65 -132 293 -98 297 -166 161 -130 297 -230 1391 -68 11185 -3800 229 -230 297 -66 65 -198 65 -466 99 -464 99 -430 67 -698 295 -132 165 -164 1095 -66 299 -66 1321 -264 12675 -66 99 -166 229 -134 65 -330 165 -164 65 -890 131 -830 67 -66 1157 -100 167 -168 265 -66 827 -66 2047 -100 261 -594 2279 -134 10701 -3890 163 -1384 67 -98 99 -1322 99 -98 65 -398 823 -66 65 -68 927 -100 495 -132 593 -100 165 -198 1387 -1022 131 -728 99 -662 97 -462 495 -200 829 -330 563 -100 297 -330 65 -598 165 -592 295 -166 131 -764 165 -164 565 -66 131 -166 165 -66 9675 -5052 165 -2878 199 -66 265 -432 265 -66 267 -898 163 -132 231 -198 229 -164 97 -100 4445 -66 7853 -636 199 -662 265 -298 233 -1428 331 -134 1791 -66 1649 -66 297 -100 361 -198 559 -98 363 -200 1315 -66 265 -98 1049 -132 1647 -66 265 -822 295 -526 131 -1712 199 -166 231 -200 165 -66 265 -166 97 -132 163 -164 395 -630 495 -168 297 -298 229 -266 629 -200 133 -132 133 -166 65 -132 99 -100 131 -66 67 -98 133 -496 1391 -98 1751 -164 359 -132 97 -164 263 -64 691 -66 199 -66 293 -98 589 -198 11299 -3968 65 -68 65 -2702 65 -1186 927 -166 65 -66 429 -134 197 -134 529 -200 67 -66 231 -100 2151 -4014 97 -1486 99 -464 65 -330 129 -330 331 -134 599 -66 497 -200 165 -66 661 -166 6881 -8830 295 -100 197 -232 725 -134 299 -166 229 -166 525 -198 295 -66 459 -66 329 -230 595 -98 299 -132 329 -66 99 -98 163 -134 229 -100 8345 -6726 131 -132 295 -66 1579 -66 329 -98 501 -132 231 -66 491 -298 331 -266 363 -132 1193 -168 8847 -4194 199 -828 65 -100 195 -262 197 -298 65 -898 65 -132 629 -66 229 -100 291 -100 623 -66 295 -66 461 -132 529 -632 597 -132 65 -100 97 -134 297 -100 297 -166 397 -168 527 -134 9603 -3850 99 -200 67 -896 959 -198 165 -100 229 -266 531 -64 165 -132 163 -296 3715 -11994 165 -1492 429 -68 263 -100 265 -330 199 -64 495 -132 363 -66 63 -166 297 -398 65 -100 231 -332 199 -100 7683 -4916 65 -1294 297 -1022 1325 -166 393 -132 165 -498 1255 -134 197 -198 427 -164 329 -132 631 -594 199 -196 99 -100 265 -134 1457 -100 3649 -8592 67 -268 131 -332 99 -100 65 -760 101 -198 297 -168 199 -132 369 -100 97 -132 99 -232 397 -198 99 -134 97 -100 231 -332 131 -796 329 -266 263 RAW_Data: -100 10841 -4030 163 -164 197 -398 195 -592 65 -132 63 -430 295 -298 263 -200 3517 -132 3763 -12296 99 -330 361 -98 99 -200 65 -430 165 -166 2327 -100 4051 -66 9653 -3478 197 -66 163 -198 167 -66 65 -598 165 -298 131 -666 199 -198 299 -298 165 -200 565 -66 797 -98 1125 -98 825 -100 4113 -6956 65 -5536 165 -266 99 -232 461 -198 65 -200 1989 -66 295 -66 723 -66 65 -98 329 -98 955 -66 559 -232 331 -66 10851 -1048 65 -3748 65 -498 99 -1392 99 -794 529 -98 331 -98 397 -164 363 -394 331 -266 299 -230 165 -66 3001 -568 197 -2872 2579 -468 2637 -472 2599 -488 2647 -426 2653 -448 2665 -392 379 -2734 381 -2700 2691 -388 377 -2732 2669 -420 355 -2726 2687 -394 403 -2706 2687 -388 377 -21248 2717 -388 377 -2738 2659 -408 2703 -382 2689 -416 2679 -408 2701 -382 2687 -418 365 -2736 365 -2722 2689 -384 391 -2696 2707 -386 379 -2734 2665 -410 361 -2726 2703 -418 357 -21246 2679 -466 297 -2768 2657 -448 2627 -434 2669 -450 2653 -416 2673 -408 2697 -386 383 -2728 369 -2706 2701 -382 387 -2726 2687 -418 357 -2708 2693 -418 361 -2702 2709 -396 401 -21232 2689 -406 361 -2736 2695 -386 2695 -406 2695 -382 2687 -418 2675 -410 2693 -414 375 -2692 389 -2706 2701 -404 363 -2724 2695 -388 389 -2702 2719 -358 405 -2704 2701 -402 363 -21262 2677 -414 367 -2738 2677 -386 2693 -420 2701 -400 2677 -386 2695 -420 2669 -430 369 -2718 353 -2730 2673 -412 361 -2734 2691 -420 357 -2698 2701 -394 401 -2702 2687 -424 347 -21244 2701 -418 365 -2726 2703 -382 2697 -420 2675 -400 2685 -384 2721 -398 2667 -418 355 -2744 343 -2722 2703 -420 353 -2724 2689 -396 363 -2736 2687 -390 377 -2730 2697 -386 357 -21274 2683 -414 375 -2726 2667 -420 2703 -398 2677 -388 2695 -420 2699 -398 2671 -384 415 -2698 357 -2738 2695 -382 383 -2724 2685 -416 357 -2706 2707 -384 391 -2726 2671 -384 415 -21238 2651 -476 293 -2776 2653 -462 2641 -446 2661 -422 2663 -418 2689 -412 2683 -414 357 -2706 385 -2698 2715 -378 379 -2710 2719 -388 377 -2708 2695 -406 361 -2724 2689 -416 361 -21244 2703 -386 413 -2698 2697 -414 2689 -384 2685 -386 2719 -378 2701 -416 2689 -386 377 -2728 387 -2700 2673 -410 361 -2730 2695 -420 357 -2732 2679 -386 377 -2734 2699 -378 361 -21262 2697 -392 405 -2702 2687 -406 2703 -382 2703 -418 2671 -406 2677 -416 2695 -386 387 -2700 381 -2704 2695 -418 357 -2712 2721 -388 375 -2702 2693 -408 363 -2730 2693 -420 355 -21248 2653 -494 289 -91206 131 -132 97 -232 559 -132 591 -98 691 -66 131 -130 297 -66 231 -66 331 -66 433 -100 499 -132 231 -166 197 -134 593 -100 11707 -4456 133 -200 131 RAW_Data: -66 133 -66 97 -166 561 -100 895 -132 1323 -66 10873 -3752 99 -722 229 -394 97 -66 99 -98 99 -328 297 -328 265 -298 3089 -132 10573 -1460 133 -432 99 -232 99 -132 333 -232 731 -164 65 -166 165 -132 131 -330 65 -98 131 -596 65 -198 133 -98 397 -568 65 -132 1157 -166 195 -130 131 -64 99 -66 63 -198 265 -98 297 -66 63 -166 295 -100 1747 -232 6099 -11348 199 -528 297 -266 97 -598 99 -198 231 -64 4433 -334 65 -298 65 -3284 67 -530 97 -432 133 -2356 493 -68 231 -168 297 -266 427 -100 559 -98 229 -460 197 -66 261 -132 65 -98 565 -132 231 -66 497 -100 3491 -12356 65 -660 197 -198 165 -132 331 -134 65 -98 2651 -134 4531 -10850 65 -1322 263 -68 431 -232 165 -134 165 -202 231 -300 5625 -66 6951 -8162 65 -398 99 -596 65 -132 461 -598 429 -132 97 -132 463 -232 229 -98 329 -100 397 -100 363 -100 231 -200 163 -200 961 -66 693 -100 397 -134 10601 -3872 263 -100 165 -100 131 -198 99 -696 233 -1524 331 -132 131 -164 229 -132 493 -98 631 -134 231 -100 595 -66 295 -66 5965 -8248 99 -296 99 -98 397 -66 65 -924 229 -398 299 -98 1425 -130 565 -198 827 -262 429 -598 725 -704 729 -12290 131 -98 99 -98 65 -100 163 -164 65 -494 231 -100 97 -100 863 -66 1751 -3948 165 -100 195 -66 165 -296 65 -2042 99 -200 495 -132 557 -100 827 -98 167 -66 433 -100 661 -164 689 -98 10803 -3906 231 -296 295 -232 99 -234 131 -332 395 -266 1283 -164 755 -466 397 -164 335 -66 1355 -14376 557 -66 331 -68 431 -134 599 -364 229 -100 763 -98 265 -132 525 -166 99 -396 495 -98 3867 -134 595 -168 865 -166 503 -200 467 -134 8145 -458 235 -794 599 -458 265 -436 231 -426 333 -368 299 -730 689 -360 327 -370 363 -326 367 -668 733 -328 363 -302 397 -328 371 -296 393 -666 725 -622 795 -634 433 -264 1023 -228 5041 -762 585 -466 233 -826 235 -470 631 -368 299 -402 299 -726 361 -328 331 -370 363 -332 701 -298 401 -692 369 -302 759 -268 461 -236 435 -622 423 -260 465 -266 719 -13608 65 -624 197 -558 921 -164 1315 -134 465 -134 263 -100 295 -132 293 -66 329 -98 197 -132 9977 -5036 197 -798 333 -828 295 -100 197 -100 165 -66 665 -100 763 -300 297 -166 165 -98 823 -8348 229 -100 427 -196 263 -624 197 -134 797 -100 263 -68 529 -132 233 -134 165 -264 131 -132 559 -66 263 -228 927 -132 731 -102 1061 -66 863 -8206 131 -332 299 -166 461 -100 99 -66 429 -66 3271 -98 465 -100 401 -232 331 -66 397 -430 10341 RAW_Data: -5434 65 -298 133 -132 131 -68 231 -200 661 -132 9517 -424 97 -1456 99 -1694 393 -100 131 -560 131 -196 197 -298 65 -428 229 -196 297 -266 131 -166 2435 -66 10161 -11230 65 -1320 131 -298 265 -532 231 -200 1291 -68 631 -66 12645 -4048 133 -66 67 -132 167 -266 163 -66 397 -132 197 -132 299 -98 197 -198 2903 -66 2361 -66 9627 -3588 197 -332 165 -68 331 -68 197 -132 99 -100 663 -66 363 -230 231 -166 131 -100 201 -298 163 -132 133 -202 363 -300 397 -102 263 -100 165 -66 1221 -66 1479 -132 165 -98 229 -12976 263 -66 363 -134 231 -66 629 -132 327 -100 97 -130 99 -164 227 -64 297 -132 397 -164 425 -198 97 -198 99 -66 365 -164 199 -102 97 -66 1817 -13524 231 -134 16907 -4086 233 -630 65 -396 201 -66 165 -198 67 -198 99 -664 2117 -166 12473 -446 2649 -440 2661 -420 2651 -422 2681 -418 2703 -400 365 -2724 387 -2696 2695 -414 357 -2704 2707 -386 389 -2700 2687 -392 405 -2706 2695 -402 363 -21268 2707 -388 377 -2706 2691 -404 2699 -382 2717 -382 2707 -378 2693 -416 2687 -396 363 -2736 355 -2748 2659 -416 365 -2708 2715 -388 377 -2708 2697 -404 363 -2730 2673 -420 355 -21268 2655 -460 319 -2766 2663 -448 2631 -436 2665 -418 2683 -410 2681 -416 2701 -386 383 -2700 375 -2744 2669 -416 353 -2730 2685 -416 357 -2708 2721 -380 369 -2724 2697 -382 385 -21260 2701 -418 353 -2720 2673 -418 2675 -408 2693 -384 2715 -386 2717 -386 2691 -404 363 -2732 387 -2702 2669 -412 359 -2736 2699 -380 381 -2728 2675 -416 381 -2720 2675 -414 347 -21280 2685 -390 377 -2724 2689 -416 2673 -408 2705 -382 2695 -410 2689 -414 2661 -418 385 -2704 369 -2704 2693 -416 375 -2726 2661 -420 355 -2728 2711 -388 375 -2702 2691 -410 363 -21252 2659 -488 287 -2794 2651 -448 2629 -436 2671 -416 2695 -416 2663 -406 2699 -384 383 -2730 367 -2702 2695 -418 385 -2702 2685 -412 349 -2744 2693 -366 389 -2714 2693 -394 381 -21266 2685 -418 363 -2730 2683 -382 2693 -418 2675 -410 2699 -384 2719 -382 2707 -380 359 -2734 387 -2704 2709 -380 361 -2732 2699 -418 357 -2728 2667 -416 383 -2696 2709 -380 391 -21228 2685 -458 307 -2800 2647 -412 2659 -432 2667 -416 2695 -416 2675 -406 2675 -416 383 -2700 361 -2730 2687 -414 375 -2696 2701 -420 353 -2720 2711 -382 367 -2728 2675 -416 385 -21222 2735 -386 355 -2744 2687 -396 2679 -418 2701 -386 2705 -382 2681 -410 2697 -384 385 -2736 365 -2704 2715 -384 377 -2696 2697 -416 349 -2722 2707 -386 379 -2732 2671 -410 361 -21258 2681 -464 297 -2796 2629 -456 2655 -420 2661 -448 2663 -404 2695 -382 2715 -380 371 -2740 355 -2744 2679 -384 391 -2728 2675 -388 379 RAW_Data: -2728 2695 -414 357 -2704 2705 -418 357 -21262 2673 -416 383 -2696 2709 -380 2703 -384 2699 -418 2671 -408 2695 -382 2713 -386 379 -2730 357 -2732 2695 -384 383 -2730 2679 -416 357 -2708 2701 -410 349 -2736 2697 -382 385 -21252 2669 -478 289 -2790 2647 -426 2651 -444 2653 -430 2659 -418 2695 -414 2681 -402 349 -2738 383 -2722 2677 -414 347 -2744 2691 -382 369 -2730 2691 -384 383 -2734 2679 -414 347 -21264 2705 -386 379 -2736 2667 -410 2695 -382 2715 -380 2709 -420 2665 -392 2713 -382 383 -2730 365 -2728 2665 -418 383 -2696 2693 -418 357 -2710 2711 -380 375 -2718 2701 -416 357 -21238 2677 -484 311 -2766 2635 -444 2657 -420 2663 -422 2695 -416 2667 -428 2675 -396 363 -73890 133 -98 131 -132 129 -658 99 -66 853 -100 63 -100 361 -98 1589 -66 1231 -132 65 -100 297 -198 65 -132 265 -66 9857 -4672 165 -1030 97 -1394 65 -200 2687 -68 6873 -8336 99 -1156 97 -66 163 -232 163 -262 197 -132 295 -132 263 -166 953 -100 263 -130 393 -164 295 -64 329 -66 393 -164 823 -130 165 -66 6133 -8436 165 -164 265 -266 65 -362 197 -696 3181 -132 363 -98 65 -166 131 -66 399 -132 663 -396 329 -66 7335 -7578 497 -230 627 -264 99 -366 99 -132 131 -134 265 -498 163 -100 1323 -66 265 -66 1129 -100 399 -132 365 -100 795 -68 397 -98 597 -364 297 -132 361 -132 265 -132 8591 -4740 65 -100 131 -166 199 -1088 97 -296 99 -528 131 -98 661 -66 401 -198 1157 -166 361 -164 495 -100 165 -66 297 -100 1423 -66 3067 -5658 67 -6406 197 -1092 65 -530 659 -68 265 -100 991 -68 231 -230 297 -66 327 -66 131 -132 659 -134 131 -100 1183 -132 263 -98 621 -66 2075 -6976 65 -5138 67 -132 129 -664 67 -132 165 -100 331 -466 231 -68 467 -98 563 -66 231 -100 531 -66 465 -66 1023 -166 297 -134 3409 -12290 67 -164 99 -532 133 -166 263 -66 231 -66 721 -64 131 -68 959 -134 495 -100 299 -98 497 -98 365 -100 397 -232 297 -98 531 -66 3029 -12216 265 -132 99 -364 199 -234 131 -66 431 -166 333 -166 397 -132 327 -100 395 -66 197 -132 395 -66 527 -98 295 -100 97 -98 789 -132 363 -132 297 -200 2815 -4914 65 -6620 65 -462 65 -134 297 -66 497 -264 231 -198 2773 -134 365 -100 831 -166 131 -100 297 -132 861 -132 299 -100 561 -66 1381 -6946 65 -5516 231 -266 97 -1362 1093 -68 1621 -134 165 -332 297 -98 361 -228 97 -132 797 -98 3487 -13224 229 -164 65 -132 913 -66 1123 -98 527 -134 929 -98 723 -100 12259 -270 165 -132 67 -132 165 -1326 99 -98 65 -1194 431 -66 695 -66 733 -134 197 RAW_Data: -134 10801 -166 67 -6130 133 -198 231 -334 365 -98 229 -132 165 -68 231 -166 14501 -524 65 -328 131 -498 129 -1288 65 -494 163 -64 165 -66 527 -132 131 -132 1019 -198 129 -166 393 -198 65 -164 6411 -66 3255 -10642 65 -1320 165 -164 493 -492 559 -264 2555 -66 695 -66 1657 -164 855 -66 4001 -10526 97 -596 133 -298 67 -264 65 -300 65 -100 263 -166 231 -134 99 -100 2703 -68 13643 -4922 297 -100 65 -232 133 -198 331 -300 231 -66 331 -100 12047 -3872 97 -196 65 -494 329 -66 65 -890 97 -98 229 -164 195 -596 797 -66 861 -132 65 -66 231 -100 565 -66 65 -66 1297 -132 265 -66 363 -134 265 -364 297 -164 299 -134 297 -134 495 -98 11309 -3790 131 -1380 65 -758 65 -164 129 -460 65 -360 199 -100 563 -68 497 -198 363 -266 263 -100 165 -66 697 -66 1933 -13594 65 -762 1223 -132 1119 -196 361 -134 131 -100 793 -166 695 -68 231 -68 463 -66 11727 -4204 363 -264 131 -132 133 -1124 97 -100 163 -100 327 -100 331 -198 397 -66 397 -100 395 -100 163 -66 197 -564 1059 -7962 65 -100 65 -198 129 -362 99 -394 197 -296 495 -100 1357 -68 459 -66 593 -66 265 -68 301 -132 465 -66 231 -200 397 -66 397 -232 199 -298 12077 -4350 231 -796 363 -198 133 -264 65 -1132 597 -332 3295 -100 755 -98 231 -164 97 -264 459 -166 759 -164 3265 -12138 99 -232 99 -1228 1025 -100 393 -66 531 -132 693 -132 1063 -66 427 -64 297 -294 229 -98 9723 -5404 67 -466 99 -796 267 -98 201 -100 167 -264 461 -98 1415 -66 861 -66 267 -66 331 -134 1663 -66 2089 -7012 65 -100 101 -4804 431 -728 99 -100 65 -100 995 -134 165 -66 929 -100 65 -66 927 -100 1093 -168 99 -100 497 -66 665 -200 6517 -8312 165 -66 129 -66 559 -166 99 -430 65 -398 67 -66 593 -198 459 -132 261 -132 263 -130 723 -66 459 -100 325 -166 67 -198 559 -66 493 -66 11475 -3896 99 -266 99 -66 197 -1092 129 -198 361 -166 163 -98 263 -196 759 -100 265 -100 365 -630 4635 -12748 65 -1712 461 -100 497 -66 395 -98 265 -98 229 -164 529 -132 297 -66 565 -132 987 -132 8665 -2820 2265 -450 313 -2774 2643 -442 325 -2772 2665 -416 359 -2734 2667 -386 379 -21274 2657 -474 293 -2810 2619 -466 2613 -476 2629 -452 2663 -388 2683 -418 2705 -400 365 -2722 387 -2700 2697 -380 361 -2732 2691 -418 361 -2732 2667 -416 383 -2698 2697 -416 357 -21238 2715 -384 383 -2732 2685 -416 2667 -416 2695 -398 2671 -418 2687 -390 2713 -382 383 -2730 365 -2728 2661 -416 379 -2716 2685 -384 379 -2720 2703 -378 401 -2718 2671 RAW_Data: 889 -130 325 -64 457 -560 165 -68 199 -170 67 -66 265 -132 133 -666 67 -166 431 -66 201 -98 297 -100 595 -66 199 -134 65 -100 795 -132 99 -168 501 -200 331 -132 265 -102 265 -134 423 -98 521 -226 65 -166 431 -134 99 -100 133 -464 195 -326 623 -100 673 -98 321 -200 65 -136 369 -166 65 -68 97 -166 165 -334 265 -102 231 -166 101 -170 65 -170 265 -136 931 -100 133 -134 563 -66 333 -100 427 -66 163 -390 231 -66 193 -130 461 -166 557 -100 99 -198 263 -100 197 -294 231 -232 299 -134 199 -170 267 -134 631 -98 235 -100 499 -68 463 -100 65 -134 335 -170 273 -134 297 -100 67 -66 197 -166 67 -134 301 -168 537 -470 99 -134 433 -132 199 -192 261 -100 523 -164 459 -132 259 -332 359 -64 227 -96 131 -132 687 -132 363 -136 329 -434 99 -334 133 -100 401 -132 233 -700 233 -170 337 -66 371 -68 233 -202 531 -266 731 -66 465 -100 167 -100 133 -232 335 -166 239 -102 367 -232 231 -100 167 -134 201 -136 301 -168 199 -300 231 -98 237 -134 233 -102 329 -132 261 -134 199 -66 265 -136 99 -170 167 -134 199 -166 167 -136 367 -298 197 -200 99 -166 469 -136 439 -66 303 -134 295 -100 433 -134 899 -266 363 -132 197 -160 555 -324 129 -96 97 -128 257 -132 97 -394 257 -98 195 -166 459 -332 395 -132 633 -134 301 -100 131 -332 169 -168 395 -166 263 -540 783 -100 287 -130 295 -96 225 -296 133 -98 99 -100 461 -164 545 -130 99 -66 301 -68 265 -100 235 -134 235 -70 333 -102 497 -66 233 -364 301 -170 103 -66 165 -336 733 -200 133 -100 263 -102 65 -136 465 -200 1035 -198 165 -170 67 -302 631 -100 429 -332 65 -128 129 -130 159 -128 159 -66 161 -96 325 -164 261 -100 197 -162 65 -96 99 -130 65 -102 333 -100 199 -98 389 -330 129 -128 229 -66 425 -366 229 -64 261 -100 227 -96 227 -526 301 -200 97 -66 699 -334 67 -100 399 -198 787 -98 297 -134 429 -100 3245 -64 527 -98 131 -526 633 -68 133 -302 1459 -164 971 -102 237 -136 1439 -266 1131 -66 599 -200 303 -332 325 -130 389 -166 371 -66 333 -102 65 -100 233 -234 327 -266 233 -166 297 -100 225 -130 163 -336 99 -596 199 -330 131 -66 331 -338 263 -358 197 -168 877 -66 227 -96 63 -130 263 -162 225 -290 197 -198 357 -132 297 -262 165 -456 227 -98 399 -296 95 -132 99 -98 457 -200 199 -168 535 -100 567 -134 327 -130 193 -130 683 -102 101 -132 233 -170 943 -166 827 -66 267 -102 503 -68 1325 -164 RAW_Data: 1607 -68 233 -166 1167 -70 531 -134 335 -168 131 -66 299 -402 899 -66 461 -66 457 -98 953 -98 165 -66 293 -230 881 -64 393 -166 589 -66 289 -66 1093 -204 333 -98 2745 -132 2019 -170 925 -68 269 -102 1469 -136 2301 -68 1355 -100 527 -66 975 -68 1445 -98 2397 -100 1733 -66 703 -100 995 -100 135 -136 235 -202 167 -134 2071 -166 339 -170 201 -268 129 -66 465 -66 365 -100 197 -164 129 -98 161 -96 423 -66 675 -66 1543 -136 567 -200 767 -202 65 -100 1401 -66 623 -136 567 -234 67 -236 197 -194 97 -66 263 -66 1827 -392 1893 -98 165 -268 133 -132 231 -162 225 -98 695 -198 563 -100 301 -332 267 -102 341 -66 99 -132 1299 -130 525 -68 161 -96 357 -98 353 -100 131 -100 131 -98 163 -132 323 -100 535 -66 1323 -130 133 -66 235 -134 1497 -132 387 -98 129 -162 2623 -134 163 -68 167 -66 959 -232 495 -68 131 -134 867 -134 865 -66 333 -98 305 -134 231 -98 765 -198 397 -432 165 -66 165 -366 265 -102 541 -100 261 -162 331 -134 457 -66 491 -196 97 -266 193 -262 65 -166 231 -266 497 -360 263 -98 587 -164 259 -98 231 -66 359 -100 267 -102 271 -168 97 -262 63 -66 261 -130 227 -130 295 -164 65 -66 265 -200 597 -134 267 -170 603 -100 97 -466 231 -264 97 -168 99 -66 65 -200 199 -100 267 -404 303 -102 201 -204 235 -134 131 -198 335 -298 327 -130 291 -164 63 -162 295 -262 197 -130 95 -130 195 -96 159 -130 161 -66 231 -100 165 -66 199 -134 363 -66 267 -168 165 -168 167 -100 165 -530 363 -432 99 -232 65 -132 395 -328 229 -98 197 -132 161 -96 191 -292 197 -204 133 -100 399 -166 531 -332 235 -168 99 -66 325 -158 553 -132 129 -226 231 -134 99 -462 129 -64 289 -100 193 -66 355 -164 291 -198 131 -298 197 -198 373 -268 335 -234 427 -68 199 -132 267 -232 131 -66 783 -326 63 -162 161 -130 227 -66 259 -562 233 -464 303 -102 201 -334 301 -134 297 -198 229 -66 127 -166 99 -100 197 -198 571 -66 457 -134 361 -424 131 -328 163 -98 63 -100 505 -102 201 -1094 229 -164 65 -230 789 -236 2505 -166 201 -170 163 -64 1139 -66 927 -100 295 -198 723 -100 365 -66 459 -196 3033 -272 199 -66 499 -202 1319 -232 295 -298 131 -362 97 -164 129 -132 65 -98 197 -130 129 -98 261 -130 97 -98 229 -96 425 -66 227 -166 483 -66 163 -326 567 -68 235 -68 67 -66 167 -66 235 -330 425 -164 63 -66 427 -102 167 -66 669 -132 429 -200 65 -102 133 -100 197 -368 RAW_Data: 65 -134 2481 -228 65 -130 229 -228 763 -136 603 -166 1619 -98 1763 -102 837 -166 321 -66 951 -130 2067 -66 259 -132 1835 -66 437 -102 701 -66 565 -68 363 -70 1113 -66 1989 -164 257 -128 351 -162 1055 -232 265 -170 309 -200 435 -166 833 -102 2467 -132 595 -66 773 -166 1615 -98 131 -96 485 -64 517 -166 197 -68 1231 -68 403 -100 263 -134 233 -100 503 -100 333 -266 729 -66 199 -100 369 -68 1239 -100 197 -68 299 -170 337 -100 825 -132 163 -66 4205 -64 161 -100 635 -66 907 -66 1017 -166 1709 -100 201 -266 657 -68 463 -166 331 -164 293 -64 259 -162 129 -262 597 -134 701 -136 67 -168 235 -136 303 -170 1417 -66 263 -98 857 -100 659 -166 97 -100 2497 -64 2495 -98 719 -128 227 -130 2217 -164 623 -264 719 -134 329 -98 1371 -100 553 -294 165 -66 1163 -100 329 -196 649 -200 1123 -68 263 -100 593 -266 333 -102 1133 -136 131 -132 603 -200 1819 -66 489 -66 563 -266 1113 -230 165 -66 423 -68 335 -100 101 -100 1073 -132 897 -100 101 -100 499 -134 173 -138 763 -238 371 -130 403 -166 203 -102 271 -136 269 -166 99 -168 263 -96 425 -66 331 -234 133 -400 231 -132 453 -66 459 -164 199 -68 237 -132 163 -198 161 -196 265 -132 65 -64 195 -130 357 -164 663 -68 167 -600 131 -98 133 -304 203 -134 433 -98 261 -130 199 -100 237 -100 229 -326 99 -98 331 -132 99 -294 165 -66 303 -134 99 -232 133 -136 99 -68 267 -198 233 -138 67 -166 367 -100 333 -168 267 -200 369 -266 135 -404 1939 -132 231 -160 161 -64 293 -98 331 -132 339 -104 135 -100 197 -430 263 -202 233 -64 195 -162 129 -64 227 -298 265 -68 697 -66 301 -68 231 -300 131 -368 769 -234 265 -98 195 -324 97 -752 229 -126 355 -98 257 -98 287 -64 427 -132 295 -262 197 -170 369 -102 267 -100 169 -68 201 -102 2551 -136 635 -134 639 -134 99 -132 197 -200 371 -66 731 -132 199 -138 733 -304 433 -68 729 -440 197 -68 99 -102 165 -266 261 -164 491 -296 489 -194 257 -164 133 -134 237 -68 335 -98 227 -130 229 -98 295 -98 231 -202 267 -236 233 -136 331 -130 195 -128 261 -430 261 -162 97 -224 99 -130 193 -96 197 -162 229 -396 97 -98 227 -364 267 -100 99 -100 233 -236 697 -164 227 -196 63 -98 327 -230 325 -66 129 -196 95 -98 195 -130 325 -430 131 -194 129 -454 161 -196 235 -68 433 -134 667 -164 355 -236 101 -98 2143 -134 1827 -198 63 -198 65 -64 2859 -64 619 -66 97 -130 3157 -66 679 -194 1491 -98 RAW_Data: 951 -64 393 -100 955 -132 4715 -100 131 -66 199 -204 1541 -66 929 -130 1347 -166 665 -132 233 -132 67 -102 433 -100 595 -228 997 -66 505 -68 133 -98 231 -68 571 -134 1371 -232 231 -270 135 -102 97 -66 867 -100 269 -68 967 -100 1649 -66 65 -66 951 -68 65 -202 363 -200 779 -102 1449 -294 419 -130 361 -230 1079 -164 163 -260 893 -102 333 -100 533 -166 467 -100 135 -66 135 -202 369 -100 199 -100 269 -134 301 -166 229 -66 101 -134 199 -134 1293 -64 779 -62 831 -66 1243 -68 267 -102 197 -100 395 -98 455 -64 621 -132 877 -98 199 -100 2101 -134 503 -100 2035 -134 735 -236 475 -136 237 -132 133 -134 1229 -100 133 -66 167 -68 2655 -100 1807 -100 1095 -264 825 -98 163 -66 491 -98 161 -128 953 -100 773 -100 131 -66 67 -134 457 -130 63 -64 389 -98 715 -66 425 -300 97 -100 1515 -66 303 -68 99 -98 721 -64 887 -132 65 -132 165 -66 635 -68 2801 -66 1561 -100 751 -98 129 -64 725 -136 201 -100 333 -204 573 -104 1745 -134 99 -66 129 -64 595 -134 167 -102 337 -134 567 -134 1131 -138 1207 -100 269 -68 135 -100 1143 -134 2139 -68 1701 -162 991 -596 431 -66 99 -132 657 -66 391 -320 357 -260 259 -98 429 -66 163 -228 65 -130 227 -66 261 -166 99 -98 131 -366 199 -134 463 -102 201 -98 231 -102 639 -238 301 -568 169 -610 265 -102 841 -198 297 -100 335 -132 263 -266 265 -68 469 -134 267 -68 933 -298 333 -298 729 -168 135 -136 437 -132 1137 -134 199 -68 265 -132 463 -166 129 -130 227 -98 297 -98 65 -132 97 -202 199 -232 305 -66 165 -198 365 -66 99 -98 299 -170 65 -136 301 -232 99 -564 133 -132 233 -170 99 -102 131 -134 65 -204 101 -98 297 -98 167 -762 233 -298 99 -326 395 -66 299 -132 369 -504 333 -98 483 -200 457 -164 63 -164 329 -162 65 -622 231 -268 131 -132 133 -134 131 -134 131 -66 99 -100 231 -66 167 -336 165 -98 197 -100 97 -264 321 -98 521 -132 163 -130 129 -294 297 -134 101 -102 265 -168 497 -68 197 -68 499 -134 269 -398 267 -130 203 -302 65 -498 271 -136 465 -292 131 -294 163 -198 329 -96 129 -98 193 -130 391 -330 165 -134 167 -170 297 -102 133 -136 135 -366 199 -132 423 -132 395 -168 65 -166 401 -98 229 -98 329 -98 99 -130 129 -228 261 -160 127 -426 389 -162 193 -132 131 -100 231 -168 67 -304 201 -68 765 -132 161 -162 193 -64 195 -64 295 -130 787 -98 419 -528 429 -66 363 -134 131 -100 133 -200 331 -98 RAW_Data: 431 -66 1167 -68 937 -68 1003 -66 99 -132 941 -134 65 -66 365 -274 165 -236 367 -96 557 -134 675 -66 261 -164 127 -96 391 -164 161 -98 391 -292 163 -98 519 -196 165 -98 523 -66 195 -160 3343 -66 661 -100 2589 -136 307 -100 629 -136 639 -100 133 -168 405 -100 267 -66 465 -132 1171 -64 749 -64 165 -98 983 -100 163 -202 537 -66 327 -100 669 -100 401 -236 2885 -164 439 -134 97 -426 1931 -66 1385 -98 715 -98 519 -66 289 -162 97 -360 297 -166 163 -66 289 -66 555 -334 167 -230 429 -102 267 -132 943 -136 401 -68 929 -130 193 -68 467 -198 335 -66 963 -100 597 -132 197 -260 523 -232 1115 -102 1935 -66 1395 -134 305 -100 99 -66 199 -66 1071 -66 2357 -66 367 -498 769 -234 163 -130 191 -64 1211 -200 133 -102 201 -100 561 -366 361 -98 195 -100 537 -64 165 -196 1041 -332 133 -102 441 -230 4217 -66 1033 -66 167 -66 933 -100 565 -66 331 -164 673 -104 441 -66 533 -66 2095 -164 525 -66 297 -170 965 -198 421 -100 663 -832 65 -100 331 -164 231 -166 135 -168 237 -466 761 -134 891 -196 791 -198 257 -160 161 -98 293 -66 1081 -98 229 -130 327 -66 1301 -200 331 -166 101 -66 461 -100 2619 -132 1663 -98 1609 -134 499 -332 165 -370 67 -264 97 -96 259 -98 701 -402 197 -128 527 -236 233 -102 167 -134 303 -134 99 -166 299 -132 165 -200 467 -68 305 -168 207 -102 465 -102 729 -136 101 -374 327 -96 259 -98 467 -202 65 -66 673 -98 335 -404 135 -66 339 -204 99 -366 233 -68 365 -166 133 -102 867 -198 163 -162 163 -294 463 -332 165 -68 269 -268 331 -100 131 -166 299 -132 231 -400 263 -164 131 -266 267 -264 367 -66 371 -134 229 -104 267 -232 67 -466 265 -100 101 -100 165 -200 65 -200 301 -66 199 -168 233 -98 267 -66 67 -134 261 -196 261 -234 427 -294 65 -194 193 -66 259 -132 849 -96 63 -198 167 -294 95 -98 361 -164 261 -196 131 -132 437 -100 597 -262 327 -162 295 -98 295 -164 259 -196 425 -230 321 -66 195 -66 261 -496 99 -200 529 -132 133 -966 133 -132 165 -66 63 -128 491 -402 65 -262 299 -66 299 -202 265 -100 99 -668 97 -134 65 -100 101 -66 65 -266 691 -66 431 -166 167 -134 199 -370 899 -134 99 -100 1093 -166 163 -166 399 -98 327 -100 99 -168 135 -200 133 -202 429 -98 65 -98 197 -556 65 -66 97 -326 331 -166 333 -200 135 -100 235 -234 265 -98 65 -68 135 -66 335 -66 133 -298 99 -66 233 -164 435 -232 97 -132 97 -392 RAW_Data: 99 -198 819 -66 1235 -98 321 -132 1091 -66 1307 -98 3059 -164 3305 -64 227 -98 591 -98 129 -66 229 -98 2143 -98 939 -68 563 -100 361 -232 945 -164 257 -96 229 -230 387 -64 195 -130 981 -294 587 -162 193 -98 1337 -66 293 -98 2665 -66 297 -98 647 -66 459 -132 491 -164 489 -96 595 -66 899 -66 837 -64 1151 -196 259 -98 357 -164 891 -132 1359 -134 197 -98 97 -98 261 -64 229 -96 461 -136 693 -100 201 -98 865 -66 599 -100 517 -132 709 -66 293 -298 655 -66 197 -130 129 -66 197 -98 4291 -66 673 -66 667 -132 1473 -132 133 -104 99 -66 163 -168 333 -134 1743 -132 1097 -132 99 -68 167 -602 1323 -352 99 -166 753 -98 423 -98 97 -66 1317 -228 1309 -98 1849 -66 1939 -132 601 -100 665 -100 1875 -66 695 -132 425 -66 425 -66 263 -134 165 -134 99 -98 829 -66 601 -166 131 -102 565 -66 301 -100 1099 -100 601 -138 533 -66 667 -234 561 -66 99 -68 2741 -98 199 -100 531 -168 101 -434 1027 -68 431 -66 403 -132 99 -98 565 -132 135 -100 399 -166 271 -236 233 -166 197 -366 99 -66 99 -168 503 -66 199 -170 207 -100 673 -368 99 -66 263 -168 133 -98 397 -268 337 -66 131 -132 231 -132 501 -134 99 -168 567 -138 103 -136 267 -298 231 -134 197 -160 321 -332 231 -98 131 -164 257 -64 163 -328 395 -66 331 -202 65 -168 133 -68 167 -100 233 -102 335 -66 197 -326 1101 -132 589 -100 811 -132 399 -136 269 -102 497 -66 559 -100 129 -98 855 -68 637 -102 65 -200 875 -68 233 -166 167 -66 529 -202 235 -102 231 -66 1237 -66 733 -98 1723 -132 101 -100 297 -66 829 -232 197 -100 367 -134 169 -166 167 -434 633 -100 235 -200 131 -134 233 -100 131 -100 331 -134 495 -432 65 -528 161 -130 295 -132 337 -136 133 -166 165 -100 269 -240 201 -336 133 -166 165 -238 199 -202 431 -434 99 -134 501 -166 231 -96 559 -202 167 -66 717 -98 987 -198 65 -64 163 -64 227 -98 555 -164 199 -64 361 -66 163 -98 129 -162 97 -130 161 -460 197 -230 681 -98 197 -98 329 -100 267 -266 291 -264 65 -100 329 -100 459 -200 363 -98 165 -134 231 -134 301 -134 231 -302 99 -132 101 -134 267 -136 233 -68 393 -422 163 -166 361 -166 99 -134 365 -134 133 -336 401 -66 495 -132 401 -168 133 -402 501 -136 1093 -862 165 -132 293 -300 289 -66 131 -164 391 -134 99 -360 359 -130 323 -200 423 -98 195 -162 295 -132 161 -98 129 -782 131 -426 227 -64 259 -166 63 -160 323 -98 261 -230 RAW_Data: 231 -66 921 -66 355 -64 1019 -98 227 -258 163 -66 597 -232 1313 -132 163 -404 467 -236 901 -164 483 -98 195 -96 489 -134 103 -238 169 -66 67 -68 299 -100 497 -68 65 -134 1635 -304 1153 -100 539 -168 265 -200 499 -166 535 -100 397 -168 931 -100 131 -66 631 -134 897 -270 1233 -100 65 -132 131 -334 663 -66 163 -66 131 -132 705 -98 571 -200 433 -100 237 -234 229 -132 1627 -66 569 -100 715 -66 1863 -272 265 -68 301 -98 465 -68 97 -134 99 -66 395 -136 1405 -66 529 -132 63 -196 579 -132 413 -260 129 -136 101 -166 1201 -134 833 -134 393 -66 335 -172 201 -68 1027 -96 753 -64 815 -66 97 -64 1341 -132 289 -160 127 -66 99 -228 1083 -96 163 -66 259 -64 159 -98 2409 -168 767 -200 367 -66 1675 -66 1067 -98 3407 -200 99 -66 1403 -166 99 -134 439 -200 329 -136 599 -66 637 -66 835 -66 1099 -98 99 -66 463 -166 165 -100 461 -164 3037 -66 655 -66 97 -98 229 -130 355 -132 1443 -66 527 -98 881 -98 229 -162 127 -96 583 -64 65 -162 489 -166 885 -194 257 -98 1539 -66 293 -166 229 -132 655 -98 757 -49522 271 -758 689 -1264 737 -670 293 -1152 811 -1144 341 -664 773 -678 327 -1118 807 -1144 835 -1146 781 -1126 873 -1096 347 -622 877 -624 321 -1106 843 -1098 871 -1098 843 -1106 379 -610 841 -584 381 -1122 365 -602 845 -1116 837 -610 381 -1056 889 -1078 383 -614 827 -1110 877 -592 353 -1108 845 -1120 839 -1120 347 -602 849 -1110 865 -612 361 -1072 869 -1114 351 -618 861 -618 343 -1090 853 -1106 387 -618 797 -674 347 -1084 389 -574 867 -584 381 -1114 841 -1102 845 -1116 839 -1112 843 -1098 875 -1086 383 -584 865 -588 375 -1100 861 -1112 851 -1084 853 -1108 847 -1106 381 -584 857 -610 383 -1080 357 -602 871 -602 385 -1084 383 -616 823 -610 373 -1086 381 -590 871 -1084 839 -628 353 -1102 875 -1100 349 -9404 875 -1060 871 -1086 887 -1088 879 -1058 863 -1086 855 -1132 845 -1078 871 -1076 857 -1098 881 -1082 861 -1088 843 -1120 853 -1074 879 -1074 879 -1068 889 -614 341 -1090 387 -616 863 -624 345 -1088 391 -590 857 -612 385 -1058 393 -596 843 -1088 889 -1078 879 -578 387 -1082 875 -1076 415 -550 881 -1070 877 -592 391 -1114 821 -1104 373 -620 821 -624 361 -1072 903 -1086 855 -1092 843 -1086 905 -1054 387 -614 863 -618 347 -1088 853 -1114 845 -1090 867 -1070 381 -610 885 -584 385 -1052 407 -578 877 -1052 899 -600 389 -1048 907 -1074 383 -586 877 -1072 877 -594 359 -1076 875 -1082 891 -1088 363 -616 855 -1084 857 -592 381 -1088 883 -1086 385 -572 RAW_Data: 889 -624 353 -1082 853 -1096 379 -594 853 -624 353 -1092 417 -582 847 -612 385 -1076 847 -1080 883 -1052 913 -1044 907 -1076 849 -1088 383 -602 867 -616 361 -1068 901 -1072 865 -1104 831 -1080 879 -1098 397 -586 855 -626 355 -1084 381 -592 873 -616 351 -1084 385 -624 821 -620 359 -1086 387 -584 883 -1086 877 -592 355 -1106 853 -1086 387 -69570 97 -100 99 -2620 131 -636 333 -102 235 -236 67 -68 363 -66 201 -100 567 -102 267 -164 101 -134 65 -68 197 -68 297 -166 671 -100 469 -336 165 -100 201 -66 169 -230 169 -204 329 -624 67 -98 265 -232 193 -168 299 -100 235 -138 101 -370 165 -294 333 -622 231 -130 129 -130 353 -132 195 -162 359 -164 67 -68 333 -100 133 -688 235 -236 497 -198 293 -98 129 -296 293 -164 229 -128 229 -132 193 -400 165 -66 163 -98 361 -164 355 -196 587 -164 131 -98 263 -554 99 -130 129 -130 191 -464 99 -132 67 -100 167 -604 329 -66 199 -68 133 -102 163 -66 2971 -132 785 -66 329 -96 323 -100 201 -136 301 -66 1959 -166 867 -134 467 -66 297 -100 835 -100 753 -166 165 -64 67 -370 335 -66 559 -232 165 -334 65 -162 129 -354 163 -64 131 -134 265 -300 263 -132 267 -296 327 -198 99 -132 535 -132 469 -866 231 -860 99 -232 503 -134 99 -198 233 -134 267 -200 97 -358 297 -164 259 -98 227 -166 135 -66 323 -100 97 -294 131 -164 129 -98 295 -96 129 -426 299 -100 67 -102 623 -100 163 -194 127 -360 563 -134 199 -428 493 -98 229 -130 257 -64 165 -100 131 -98 163 -692 357 -64 161 -98 321 -64 389 -230 65 -692 227 -130 261 -132 231 -162 287 -298 97 -460 393 -130 301 -168 331 -100 269 -202 101 -134 201 -102 99 -132 199 -204 235 -664 65 -562 133 -328 463 -100 291 -194 159 -162 227 -98 293 -328 165 -128 227 -574 535 -332 197 -168 65 -300 131 -66 389 -1078 131 -64 259 -64 223 -98 257 -164 63 -328 433 -134 65 -602 131 -68 333 -136 369 -66 297 -264 427 -66 97 -130 429 -102 133 -136 203 -240 167 -236 329 -526 67 -132 133 -168 331 -360 65 -66 331 -296 267 -134 469 -132 595 -230 661 -662 299 -100 265 -200 203 -168 801 -100 133 -68 399 -132 99 -100 161 -390 65 -298 65 -98 261 -130 161 -128 257 -66 67 -134 621 -98 227 -328 99 -230 129 -294 193 -96 195 -318 425 -526 129 -196 163 -162 65 -132 293 -130 63 -66 325 -128 63 -130 293 -66 199 -200 269 -206 133 -198 325 -98 163 -100 97 -98 261 -164 67 -98 167 -430 131 -494 131 -164 RAW_Data: 97 -98 861 -66 1199 -166 231 -100 651 -166 197 -104 439 -98 131 -64 493 -98 883 -96 99 -98 3327 -66 131 -264 733 -134 2133 -166 131 -102 303 -136 535 -134 701 -98 355 -228 131 -202 99 -134 99 -100 791 -166 169 -202 671 -100 741 -100 263 -66 165 -68 935 -132 197 -198 673 -100 605 -66 1457 -98 1195 -166 2347 -134 505 -100 1469 -66 391 -100 229 -100 1171 -98 939 -100 459 -170 369 -134 231 -162 127 -98 95 -66 195 -98 195 -66 299 -100 331 -98 65 -232 369 -132 201 -68 167 -166 1481 -102 501 -160 1257 -66 2307 -64 623 -164 2079 -66 1101 -98 423 -64 659 -68 431 -136 99 -100 435 -130 167 -168 835 -200 135 -104 133 -100 503 -68 1437 -232 821 -132 357 -96 463 -66 263 -64 683 -132 165 -96 655 -166 3939 -100 1169 -132 2443 -98 197 -132 425 -234 233 -162 1043 -66 197 -100 2793 -134 167 -104 675 -100 197 -134 1367 -102 763 -132 265 -230 133 -102 365 -100 167 -66 1069 -66 837 -100 295 -160 97 -64 129 -132 617 -164 197 -100 133 -136 337 -172 133 -66 557 -98 951 -66 263 -130 587 -66 729 -196 335 -166 933 -432 369 -100 199 -296 225 -98 355 -66 129 -64 557 -98 289 -66 355 -128 193 -162 267 -134 299 -98 165 -170 303 -640 1031 -134 99 -66 135 -68 771 -166 171 -104 201 -134 131 -68 635 -428 661 -292 749 -430 1161 -100 905 -98 65 -98 657 -262 2837 -132 67 -66 265 -132 631 -66 1037 -296 97 -98 1703 -302 367 -100 505 -232 497 -362 333 -134 591 -100 755 -232 67 -130 587 -66 231 -168 65 -332 99 -66 267 -232 393 -134 65 -132 131 -428 133 -200 165 -202 199 -168 165 -102 269 -100 333 -852 201 -134 233 -202 65 -200 563 -768 265 -136 169 -102 169 -598 333 -202 267 -134 267 -328 163 -130 625 -500 199 -200 99 -270 65 -134 65 -198 65 -100 99 -596 493 -66 99 -66 331 -232 103 -136 373 -168 831 -170 65 -672 163 -102 133 -136 331 -100 333 -234 101 -100 99 -200 99 -100 201 -302 199 -600 301 -202 135 -134 705 -166 435 -530 97 -198 131 -198 195 -66 163 -392 293 -66 295 -370 229 -198 65 -100 405 -134 165 -134 133 -170 337 -236 205 -274 267 -134 329 -132 195 -132 503 -132 133 -136 133 -334 197 -196 299 -168 101 -100 233 -100 439 -134 301 -332 331 -298 433 -406 433 -68 167 -100 203 -100 101 -102 99 -328 397 -234 205 -168 133 -364 63 -202 397 -198 95 -394 267 -134 569 -66 201 -102 133 -136 101 -102 99 -132 99 -196 197 -498 197 -102 135 -170 RAW_Data: 331 -164 63 -162 1267 -66 163 -130 129 -66 725 -164 231 -64 853 -66 101 -134 199 -102 99 -68 365 -66 357 -130 815 -64 357 -98 97 -98 97 -66 65 -466 231 -172 3749 -66 849 -130 917 -64 327 -64 1013 -98 555 -332 795 -100 571 -132 769 -132 401 -134 1297 -134 377 -138 435 -100 401 -100 667 -100 1761 -66 667 -66 1533 -236 233 -98 885 -130 457 -66 999 -66 165 -66 833 -134 695 -166 501 -66 499 -200 329 -64 197 -134 441 -100 2099 -98 491 -134 197 -130 2225 -132 65 -100 689 -64 193 -160 159 -96 195 -98 323 -164 259 -98 535 -472 771 -66 665 -270 665 -66 595 -266 2191 -64 643 -98 1287 -98 741 -100 233 -200 569 -194 261 -68 637 -100 97 -66 491 -158 395 -138 1017 -66 627 -262 559 -64 327 -98 263 -134 99 -102 201 -102 337 -66 167 -68 679 -100 471 -134 195 -66 133 -202 693 -96 197 -98 391 -164 99 -98 3883 -194 461 -100 237 -168 1891 -68 301 -68 969 -166 1439 -294 551 -130 389 -98 99 -196 167 -102 505 -66 569 -234 901 -98 407 -136 469 -66 769 -98 769 -166 1263 -266 297 -98 1701 -200 203 -168 329 -232 65 -100 329 -164 803 -100 135 -200 233 -166 135 -272 265 -134 197 -100 133 -134 539 -232 197 -396 165 -366 263 -68 233 -102 365 -132 233 -100 135 -266 199 -234 167 -232 97 -524 127 -128 389 -98 305 -364 261 -130 257 -162 589 -464 361 -66 229 -134 161 -100 203 -432 265 -66 199 -66 199 -366 229 -236 99 -134 99 -100 131 -168 133 -100 131 -236 267 -132 297 -264 291 -132 167 -234 65 -100 199 -66 333 -730 237 -440 365 -102 99 -100 99 -132 99 -100 1429 -134 427 -100 97 -100 131 -164 799 -170 1077 -100 431 -66 133 -168 737 -134 197 -230 65 -102 803 -132 491 -98 429 -198 471 -134 365 -66 299 -236 65 -66 2837 -102 399 -64 585 -64 523 -196 97 -98 295 -196 555 -160 261 -500 299 -396 333 -236 133 -68 327 -100 199 -204 699 -66 701 -100 65 -164 65 -370 195 -196 97 -66 193 -130 129 -360 195 -130 231 -96 291 -64 455 -228 293 -196 291 -162 97 -194 621 -130 847 -66 395 -66 161 -128 193 -130 293 -98 231 -170 67 -134 297 -360 167 -266 263 -526 263 -132 229 -98 191 -160 159 -100 721 -234 101 -100 99 -130 259 -258 265 -632 687 -164 133 -134 631 -100 199 -102 165 -560 299 -200 265 -332 431 -870 99 -266 503 -364 135 -66 269 -68 499 -100 265 -102 263 -102 569 -234 719 -132 99 -196 419 -262 163 -688 95 -66 165 -128 95 -66 RAW_Data: 295 -98 987 -196 517 -100 489 -66 355 -132 563 -198 867 -134 1413 -134 541 -134 767 -100 193 -98 1799 -102 467 -134 299 -96 323 -66 261 -100 259 -66 229 -96 851 -66 369 -266 469 -66 101 -98 163 -136 267 -432 859 -130 523 -66 197 -134 1027 -132 227 -194 393 -98 807 -166 235 -100 133 -66 165 -102 133 -136 371 -162 1411 -132 865 -200 471 -100 133 -68 299 -66 633 -98 329 -234 401 -98 1505 -132 133 -134 331 -262 163 -66 261 -98 289 -64 201 -68 1055 -96 391 -66 951 -298 265 -202 297 -66 401 -68 131 -100 1733 -98 941 -66 803 -98 847 -64 3701 -100 721 -160 357 -166 1799 -66 329 -100 99 -102 363 -198 167 -136 197 -66 567 -66 199 -236 1247 -166 2455 -68 1107 -200 235 -100 2355 -130 913 -98 877 -98 163 -196 97 -66 427 -100 801 -134 867 -98 263 -68 441 -134 561 -98 1671 -134 865 -68 935 -132 163 -102 975 -66 1343 -132 1339 -134 369 -100 1107 -66 1167 -168 631 -232 835 -66 1027 -132 333 -166 265 -98 1207 -98 223 -98 455 -64 2095 -134 933 -136 233 -68 335 -136 305 -100 1737 -66 427 -100 263 -130 323 -66 227 -66 717 -100 265 -100 65 -128 355 -66 367 -132 95 -230 229 -100 131 -64 493 -132 291 -396 393 -130 259 -196 227 -288 397 -68 229 -430 99 -302 237 -700 65 -66 65 -100 133 -200 101 -336 133 -166 237 -202 67 -302 67 -68 333 -132 263 -102 267 -296 163 -166 233 -168 363 -64 295 -298 537 -166 431 -200 431 -166 63 -258 363 -164 563 -234 199 -68 299 -100 325 -754 295 -196 65 -98 165 -132 301 -134 131 -134 97 -68 405 -68 233 -134 271 -134 67 -168 101 -136 133 -366 99 -132 67 -132 265 -200 233 -100 201 -136 101 -66 263 -132 129 -66 293 -582 263 -132 1103 -134 203 -168 97 -66 197 -264 131 -168 133 -132 65 -134 199 -134 101 -100 131 -436 99 -232 97 -398 231 -362 65 -202 301 -396 297 -98 199 -134 265 -164 101 -168 267 -102 405 -170 99 -102 397 -132 97 -98 295 -98 1179 -100 135 -136 131 -134 765 -134 465 -168 439 -232 403 -100 65 -134 931 -100 169 -136 237 -68 231 -234 199 -68 401 -134 541 -166 429 -166 1607 -368 533 -66 363 -66 133 -134 433 -166 297 -238 201 -100 201 -170 199 -134 273 -136 99 -134 167 -238 133 -66 265 -134 165 -132 165 -132 97 -228 723 -198 415 -64 491 -298 257 -66 231 -192 225 -96 227 -98 193 -96 521 -198 65 -66 231 -166 163 -98 465 -66 133 -132 195 -130 225 -162 521 -130 63 -66 199 -228 RAW_Data: 817 -162 449 -160 719 -198 469 -68 133 -68 1101 -132 593 -230 1105 -100 131 -134 231 -66 329 -196 685 -96 557 -68 1263 -68 101 -68 397 -100 65 -66 625 -66 97 -132 1099 -66 493 -66 757 -98 1151 -66 303 -134 1901 -66 99 -100 665 -262 991 -98 791 -66 1925 -168 865 -232 835 -98 505 -102 99 -100 535 -100 169 -134 427 -132 863 -68 167 -134 975 -100 133 -268 1339 -100 1453 -66 1445 -162 195 -64 3623 -66 237 -68 1063 -308 1449 -98 1111 -132 167 -102 855 -270 199 -134 297 -134 267 -168 863 -234 637 -66 567 -230 99 -200 3325 -198 845 -66 289 -66 131 -66 815 -130 1093 -100 167 -100 429 -98 1703 -166 195 -64 971 -98 163 -192 195 -168 439 -132 329 -132 67 -134 67 -134 1591 -168 407 -100 867 -68 399 -134 661 -100 663 -66 237 -136 395 -232 131 -66 695 -100 627 -264 913 -66 1083 -98 287 -66 199 -132 335 -100 1031 -68 99 -100 3815 -98 165 -66 129 -98 163 -128 563 -98 779 -96 223 -64 161 -164 2025 -66 1741 -172 101 -136 203 -102 665 -100 475 -64 167 -100 637 -98 997 -170 1207 -136 233 -166 233 -168 635 -132 199 -100 235 -270 199 -98 131 -102 169 -170 293 -98 323 -164 427 -334 233 -168 267 -68 369 -100 263 -368 101 -66 665 -98 265 -100 133 -100 99 -168 133 -66 133 -132 133 -66 269 -134 435 -68 267 -136 271 -500 163 -100 163 -166 355 -132 97 -98 323 -194 63 -688 463 -130 97 -396 65 -100 357 -194 461 -98 161 -130 223 -162 165 -352 461 -300 267 -166 233 -464 329 -100 293 -362 163 -228 289 -66 229 -66 195 -162 325 -66 261 -98 127 -424 299 -302 367 -68 265 -272 429 -98 161 -98 393 -296 65 -130 161 -196 261 -66 473 -234 97 -98 263 -160 323 -98 67 -132 697 -298 99 -134 233 -202 97 -134 301 -200 307 -100 101 -134 865 -166 231 -202 233 -100 301 -170 169 -102 169 -200 65 -98 595 -166 231 -234 661 -66 473 -334 165 -304 365 -266 97 -502 363 -134 133 -236 65 -100 99 -134 99 -170 235 -66 333 -100 195 -100 133 -300 133 -102 301 -304 65 -100 99 -100 131 -202 135 -134 65 -200 363 -66 263 -498 67 -68 295 -194 321 -368 435 -100 97 -664 99 -100 569 -66 133 -66 67 -134 199 -136 101 -68 301 -68 405 -198 133 -132 581 -132 165 -98 159 -98 197 -66 229 -130 131 -294 133 -96 423 -100 427 -300 357 -132 291 -64 95 -194 455 -98 263 -100 359 -196 65 -162 227 -162 157 -96 157 -230 589 -132 325 -134 535 -66 267 -100 135 -302 RAW_Data: 131 -134 599 -166 393 -98 369 -236 197 -100 401 -232 569 -134 135 -70 337 -134 101 -136 135 -100 1895 -66 401 -170 503 -66 1633 -66 601 -66 355 -96 683 -100 729 -68 133 -132 433 -68 569 -100 133 -68 201 -132 835 -100 465 -68 527 -98 193 -200 1129 -166 535 -100 199 -98 259 -132 227 -64 1597 -98 261 -192 753 -100 911 -66 667 -298 131 -100 263 -66 1051 -230 787 -66 935 -66 233 -98 885 -236 431 -66 197 -162 521 -68 167 -196 263 -96 589 -98 517 -66 1439 -64 777 -66 3219 -132 679 -134 205 -68 507 -198 749 -200 199 -168 167 -100 133 -134 201 -68 731 -66 495 -198 737 -66 237 -68 135 -100 167 -234 1535 -68 873 -66 373 -66 67 -232 297 -68 65 -66 1095 -68 327 -130 63 -132 1715 -66 2261 -100 321 -132 197 -164 457 -232 1291 -132 405 -68 1001 -68 1133 -272 471 -66 99 -134 1403 -68 167 -68 1091 -336 933 -134 1207 -132 265 -68 267 -66 99 -366 265 -66 1469 -258 367 -168 429 -132 129 -66 491 -132 343 -100 65 -100 263 -136 199 -164 273 -204 791 -100 901 -66 167 -98 165 -64 559 -132 619 -132 1087 -128 2283 -398 1467 -164 259 -130 1927 -130 421 -98 1085 -66 705 -68 1843 -168 875 -170 203 -136 341 -640 199 -66 133 -554 161 -196 63 -66 521 -292 163 -160 95 -158 127 -192 197 -100 587 -130 397 -662 261 -66 193 -130 259 -66 361 -64 459 -98 197 -560 655 -130 389 -66 1135 -100 133 -130 131 -98 1011 -100 561 -66 685 -164 457 -132 2469 -200 609 -66 665 -66 67 -132 327 -200 1657 -134 919 -132 651 -100 327 -230 191 -130 263 -358 95 -130 549 -98 99 -68 299 -100 461 -132 99 -472 165 -134 99 -66 99 -132 399 -102 169 -102 697 -166 233 -132 333 -632 197 -164 865 -266 101 -68 533 -166 299 -100 163 -228 259 -66 327 -200 65 -66 229 -100 363 -230 197 -336 165 -102 893 -300 65 -132 231 -370 265 -230 99 -98 229 -518 199 -100 401 -724 225 -98 63 -96 231 -64 291 -292 65 -98 131 -98 159 -158 127 -194 161 -292 65 -98 133 -66 297 -66 303 -168 97 -168 231 -234 269 -532 135 -168 99 -168 301 -528 99 -506 199 -368 399 -132 329 -372 99 -68 133 -264 197 -100 201 -200 67 -134 131 -270 133 -134 133 -198 327 -200 65 -100 331 -262 161 -166 469 -534 167 -738 131 -100 367 -232 101 -100 265 -604 65 -170 99 -166 299 -102 169 -132 99 -398 229 -330 197 -166 335 -366 97 -98 131 -200 269 -100 199 -168 131 -134 537 -98 265 -100 335 -236 99 -366 RAW_Data: 459 -100 453 -130 419 -130 519 -96 63 -130 2077 -66 767 -64 127 -134 1961 -296 529 -202 637 -134 527 -100 201 -68 633 -66 163 -360 1029 -68 765 -100 867 -66 503 -100 131 -66 841 -98 165 -68 237 -66 509 -100 501 -302 235 -66 99 -164 227 -130 551 -196 327 -66 1571 -132 99 -68 867 -66 163 -96 161 -130 129 -130 549 -130 487 -166 1801 -66 229 -66 197 -232 325 -66 425 -198 131 -64 295 -166 735 -66 533 -98 227 -130 129 -262 425 -100 263 -66 129 -132 97 -168 971 -170 405 -68 199 -134 475 -202 297 -98 1445 -98 395 -196 161 -66 225 -134 1803 -100 473 -102 1499 -66 199 -100 701 -132 165 -68 133 -102 303 -98 735 -102 805 -100 827 -100 235 -100 65 -266 637 -68 693 -66 1383 -228 819 -66 233 -304 435 -198 203 -136 1135 -270 1709 -64 227 -64 581 -134 505 -66 2203 -64 293 -64 753 -66 551 -132 747 -64 1303 -64 463 -66 229 -102 1877 -266 871 -166 1357 -64 819 -66 465 -198 693 -68 165 -64 95 -128 3785 -132 1465 -100 299 -102 329 -164 595 -134 1029 -66 299 -168 1263 -166 331 -68 967 -100 101 -102 603 -260 165 -132 467 -66 233 -66 235 -102 475 -100 135 -68 301 -134 297 -98 131 -102 269 -466 99 -134 237 -166 135 -168 203 -102 265 -68 503 -66 233 -66 637 -134 101 -200 199 -166 293 -554 361 -328 367 -264 533 -238 167 -68 135 -170 99 -300 591 -298 133 -236 299 -66 231 -368 263 -232 435 -136 133 -102 133 -200 133 -134 163 -134 167 -168 299 -66 265 -100 133 -240 135 -132 263 -170 269 -200 501 -396 263 -98 227 -132 129 -292 427 -66 165 -102 627 -602 99 -66 301 -168 199 -100 563 -330 165 -134 233 -136 65 -332 499 -100 131 -232 325 -96 65 -132 195 -98 393 -624 323 -68 133 -98 195 -162 231 -100 263 -132 231 -102 133 -236 99 -236 231 -166 65 -102 133 -268 101 -102 299 -136 267 -164 493 -64 229 -258 291 -326 263 -198 391 -134 167 -202 365 -594 133 -102 201 -134 503 -396 429 -204 169 -400 197 -170 267 -132 403 -466 297 -98 469 -234 395 -132 233 -100 165 -100 165 -66 197 -68 297 -166 501 -134 133 -100 65 -166 631 -68 297 -134 199 -100 165 -68 299 -266 133 -66 165 -100 231 -490 557 -134 371 -164 299 -170 733 -164 239 -334 335 -66 299 -300 199 -170 103 -100 233 -102 641 -168 65 -100 995 -66 265 -160 259 -130 129 -226 425 -100 355 -726 97 -688 99 -66 233 -266 299 -942 167 -102 167 -166 65 -100 367 -136 99 -134 199 -134 267 -164 RAW_Data: 67 -68 233 -66 899 -66 163 -96 485 -98 355 -130 943 -100 235 -168 499 -104 1367 -98 297 -100 635 -68 1169 -100 67 -134 835 -264 959 -164 129 -98 419 -196 589 -66 421 -66 1717 -100 133 -100 265 -134 227 -356 455 -166 163 -66 1055 -100 1455 -134 463 -98 2191 -132 295 -132 335 -66 709 -64 619 -98 959 -68 835 -170 603 -134 1033 -134 635 -168 759 -232 397 -198 397 -164 1267 -166 257 -198 1295 -100 239 -104 563 -204 335 -198 203 -68 901 -68 1255 -134 1697 -66 793 -66 1691 -68 201 -100 765 -66 165 -132 131 -230 131 -66 917 -66 335 -338 231 -170 827 -98 199 -136 301 -196 65 -98 199 -200 765 -134 403 -98 333 -68 1691 -132 2565 -64 569 -170 1255 -264 65 -132 1243 -132 2527 -66 259 -66 1739 -100 1309 -198 167 -238 337 -66 131 -68 1973 -362 299 -100 1387 -96 129 -164 423 -230 3875 -96 4283 -98 165 -98 515 -134 469 -68 171 -102 1163 -100 65 -298 461 -66 367 -136 205 -168 371 -98 491 -164 161 -262 1093 -100 299 -100 269 -334 1205 -98 63 -98 261 -64 457 -98 RAW_Data: 57 -144 401 -86 173 -202 143 -258 133 -88 257 -144 287 -58 402 -56 259 -230 259 -86 85 -96 95 -174 286 -162 57 -230 253 -400 229 -88 536 -58 85 -72 167 -110 263 -72 229 -58 85 -86 87 -262 119 -288 163 -210 321 -320 186 -140 261 -96 143 -456 117 -216 143 -246 239 -102 121 -72 71 -191 167 -263 191 -96 239 -80 57 -116 143 -118 167 -168 215 -288 191 -106 287 -114 517 -88 113 -394 173 -70 215 -100 661 -86 201 -114 259 -58 287 -86 57 -202 399 -200 57 -288 229 -144 115 -1425 83 -142 173 -86 459 -112 223 -144 201 -116 143 -114 196 -17422 287 -614 1075 -1132 533 -560 1125 -1112 561 -530 1133 -1088 585 -512 1129 -1104 563 -1102 571 -1072 591 -524 1137 -538 1115 -19392 589 -522 1139 -1090 569 -520 1137 -1100 587 -520 1135 -1092 569 -514 1155 -1076 599 -1062 585 -1086 585 -532 1125 -528 1145 -19396 581 -504 1155 -1064 619 -506 1145 -1080 595 -508 1149 -1062 587 -536 1129 -1088 585 -1090 589 -1062 587 -510 1177 -506 1149 -19394 587 -524 1147 -1076 597 -512 1129 -1072 617 -498 1159 -1066 599 -514 1147 -1076 595 -1060 613 -1060 589 -506 1179 -510 1155 -19378 605 -514 1129 -1098 601 -488 1177 -1062 583 -510 1161 -1072 587 -516 1169 -1058 587 -1082 589 -1076 593 -532 1121 -536 1127 -19444 549 -542 1129 -1092 601 -510 1147 -1098 581 -506 1123 -1100 585 -510 1147 -1106 591 -1060 597 -1060 595 -510 1151 -534 1157 -19390 593 -512 1163 -1064 597 -510 1173 -1042 617 -510 1159 -1056 579 -556 1133 -1054 609 -1060 607 -1078 585 -528 1147 -516 1135 -19444 559 -534 1165 -1052 605 -510 1149 -1062 599 -520 1173 -1054 591 -540 1111 -1116 573 -1088 593 -1042 615 -534 1117 -536 1129 -19436 569 -530 1157 -1052 605 -504 1177 -1062 591 -536 1113 -1114 589 -514 1125 -1112 563 -1084 587 -1080 589 -536 1123 -532 1165 -19392 599 -524 1143 -1080 595 -540 1125 -1090 563 -534 1149 -1084 567 -534 1147 -1092 587 -1086 585 -1064 565 -558 1123 -532 1143 -19450 549 -556 1121 -1086 585 -534 1137 -1094 583 -516 1133 -1114 563 -536 1123 -1108 573 -1082 597 -1078 565 -532 1143 -524 1135 -19464 561 -528 1149 -1066 613 -508 1151 -1076 587 -532 1125 -1076 609 -506 1175 -1076 563 -1106 563 -1084 591 -534 1157 -484 1179 -19414 589 -528 1131 -1096 587 -520 1163 -1080 563 -550 1121 -1098 555 -562 1117 -1082 575 -1112 563 -1104 559 -558 1121 -530 1149 -19442 591 -498 1175 -1066 585 -534 1121 -1114 565 -540 1115 -1096 585 -538 1123 -1110 559 -1086 585 -1084 589 -530 1125 -558 1121 -19454 563 -542 1163 -1044 585 -558 1131 -1092 571 -536 1133 -1088 587 -518 1149 -1086 601 -1058 587 -1080 611 -510 RAW_Data: 1125 -536 1145 -19444 567 -542 1151 -1086 581 -534 1133 -1084 583 -530 1141 -1090 587 -516 1121 -1114 591 -1062 595 -1092 567 -538 1131 -536 1145 -19448 589 -516 1143 -1076 591 -540 1115 -1090 591 -538 1115 -1096 597 -512 1155 -1078 581 -1082 585 -1104 559 -530 1153 -516 1147 -19438 589 -526 1157 -1056 609 -534 1137 -1078 585 -532 1149 -1076 585 -536 1123 -1104 587 -1062 597 -1082 587 -536 1121 -554 1121 -19464 555 -560 1123 -1104 563 -542 1131 -1096 565 -536 1143 -1060 621 -492 1175 -1078 571 -1100 577 -1092 591 -494 1167 -538 1117 -19452 593 -538 1133 -1074 603 -510 1157 -1062 595 -548 1115 -1102 573 -538 1139 -1094 567 -1094 583 -1092 567 -536 1127 -560 1113 -19478 563 -534 1151 -1084 569 -534 1135 -1116 565 -534 1135 -1084 583 -532 1155 -1060 587 -1084 589 -1084 581 -536 1125 -546 1141 -19460 577 -536 1123 -1102 565 -554 1119 -1096 593 -520 1133 -1108 563 -546 1131 -1088 569 -1094 573 -1100 583 -526 1147 -540 1123 -19466 587 -530 1129 -1100 587 -510 1143 -1084 609 -510 1131 -1110 567 -542 1121 -1102 567 -1110 563 -1106 567 -532 1149 -518 1145 -19458 573 -534 1147 -1082 575 -556 1149 -1048 589 -532 1157 -1088 565 -536 1129 -1088 589 -1106 563 -1086 587 -536 1129 -548 1147 -4298 103 -56 87 -344 87 -258 85 -278 215 -70 77 -344 279 -56 87 -56 197 -198 143 -288 362 -86 605 -144 57 -268 95 -114 143 -144 173 -144 143 -402 57 -202 259 -391 652 -340 427 -230 173 -356 97 -144 111 -246 219 -96 191 -114 173 -288 115 -56 109 -106 199 -106 73 -130 57 -172 85 -260 373 -56 629 -200 690 -230 273 -120 85 -460 85 -314 77 -78 111 -88 401 -116 171 -312 71 -500 81 -224 229 -88 257 -370 181 -172 200 -116 535 -174 113 -294 213 -359 445 -144 258 -114 115 -202 675 -509 239 -432 373 -538 85 -58 113 -86 761 -104 113 -318 443 -70 143 -144 647 -204 111 -334 87 -114 115 -144 113 -188 177 -144 199 -260 143 -86 87 -622 57 -116 171 -58 139 -222 55 -346 315 -76 345 -114 139 -171 195 -52 53 -98 119 -144 143 -244 95 -72 95 -96 167 -302 253 -186 307 -444 287 -449 115 -172 57 -172 316 -202 85 -370 697 -116 57 -144 171 -202 259 -114 85 -144 87 -315 85 -58 201 -116 171 -272 121 -358 171 -403 113 -86 115 -202 489 -229 115 -392 95 -116 171 -140 93 -102 143 -543 245 -358 215 -120 387 -288 171 -202 221 -202 115 -748 57 -316 143 -260 143 -288 115 -316 115 -58 85 -288 143 -460 485 -96 71 -104 199 -96 199 -202 143 -86 201 -116 85 -230 211 -288 115 -605 365 -126 53 -172 RAW_Data: 317 -144 57 -486 53 -282 115 -585 97 -72 229 -174 257 -440 225 -86 173 -518 243 -167 95 -259 137 -96 694 -58 227 -80 279 -287 71 -72 301 -72 121 -106 51 -84 57 -58 199 -260 143 -288 219 -174 113 -681 115 -172 403 -58 113 -116 113 -432 171 -202 55 -108 95 -212 113 -72 527 -166 95 -212 195 -108 603 -142 239 -296 173 -346 373 -287 53 -80 79 -72 95 -238 95 -312 167 -618 143 -288 95 -72 95 -72 141 -210 55 -258 143 -328 305 -58 87 -86 315 -116 195 -218 85 -290 285 -220 215 -189 201 -58 57 -645 119 -96 71 -144 119 -406 143 -72 191 -72 631 -268 344 -56 115 -260 315 -140 455 -518 57 -58 171 -144 488 -86 219 -232 257 -144 85 -174 171 -260 115 -56 87 -166 197 -58 83 -56 85 -288 113 -410 115 -172 163 -202 113 -58 201 -144 201 -86 143 -264 167 -212 113 -116 139 -72 181 -287 343 -430 201 -260 201 -462 143 -192 301 -230 191 -454 187 -144 315 -164 143 -477 165 -58 201 -114 143 -490 115 -86 201 -58 113 -88 85 -58 203 -198 375 -86 171 -346 95 -88 257 -170 81 -56 143 -172 335 -230 173 -202 133 -471 187 -264 215 -86 115 -198 159 -72 179 -112 195 -116 449 -216 93 -96 167 -216 71 -216 71 -166 235 -86 447 -102 101 -226 195 -213 71 -144 215 -144 215 -261 241 -136 269 -142 263 -311 215 -172 201 -144 265 -168 71 -404 259 -86 85 -230 115 -650 143 -202 749 -512 248 -316 201 -154 71 -96 95 -360 105 -56 57 -432 95 -288 95 -286 95 -96 166 -144 93 -144 167 -150 904 -162 95 -526 287 -244 95 -240 383 -120 167 -394 430 -854 95 -72 143 -194 227 -120 167 -264 405 -144 143 -72 143 -72 141 -120 187 -86 143 -164 170 -96 143 -58 143 -86 402 -166 153 -120 95 -96 69 -96 71 -359 404 -338 71 -225 93 -74 97 -54 161 -114 319 -288 113 -116 459 -202 115 -114 115 -116 143 -86 57 -56 87 -114 85 -375 113 -58 311 -240 203 -288 95 -72 119 -383 213 -384 115 -86 171 -58 53 -104 401 -58 115 -86 373 -116 143 -144 161 -216 406 -72 263 -96 215 -72 95 -94 167 -96 191 -240 95 -94 214 -120 403 -116 200 -114 57 -172 220 -120 137 -364 334 -392 115 -260 199 -116 373 -188 95 -110 143 -172 87 -114 172 -230 57 -316 201 -56 249 -485 171 -202 87 -86 85 -144 345 -86 171 -58 259 -58 295 -120 95 -120 71 -192 635 -118 167 -96 375 -72 119 -120 261 -144 167 -96 95 -96 923 -215 71 -433 71 -477 RAW_Data: 191 -240 85 -72 637 -408 213 -510 261 -168 143 -126 79 -106 167 -72 117 -218 251 -168 119 -96 215 -182 191 -238 517 -116 201 -144 255 -154 97 -94 215 -72 95 -120 71 -288 261 -106 434 -96 606 -232 229 -432 85 -174 343 -58 329 -156 55 -116 259 -144 488 -56 307 -339 115 -202 334 -88 113 -86 57 -174 143 -144 401 -376 85 -240 267 -82 95 -216 137 -158 85 -144 143 -58 221 -308 295 -114 87 -114 301 -120 358 -517 71 -262 191 -144 57 -140 165 -407 53 -262 217 -120 238 -358 119 -357 71 -72 119 -96 428 -72 95 -72 167 -72 93 -240 335 -96 357 -240 173 -230 143 -114 87 -200 143 -232 287 -150 97 -288 71 -72 93 -288 115 -58 143 -230 109 -264 71 -72 119 -72 238 -242 97 -78 163 -86 115 -518 79 -560 205 -449 969 -144 507 -86 231 -114 345 -58 979 -110 85 -288 287 -404 229 -202 57 -274 233 -86 115 -202 632 -230 85 -312 369 -392 460 -450 75 -280 85 -202 201 -86 229 -174 143 -144 233 -528 115 -212 127 -202 287 -172 403 -172 139 -128 165 -138 261 -392 143 -480 142 -189 291 -80 53 -283 167 -140 113 -1008 191 -144 119 -120 71 -193 241 -462 201 -58 143 -344 539 -316 113 -174 85 -116 113 -250 239 -168 405 -168 239 -158 85 -144 115 -86 57 -86 341 -144 171 -202 85 -202 115 -114 719 -88 55 -318 257 -56 254 -86 171 -116 459 -174 171 -329 95 -134 85 -314 431 -306 77 -316 401 -86 173 -404 281 -1073 488 -94 217 -78 101 -98 214 -120 215 -340 403 -535 143 -564 115 -116 199 -58 85 -174 315 -58 335 -136 55 -260 143 -144 229 -460 143 -58 143 -144 171 -202 115 -374 291 -130 339 -82 143 -58 171 -58 201 -86 85 -174 1022 -56 85 -82 255 -240 103 -202 431 -278 95 -216 119 -72 71 -96 71 -559 57 -144 171 -88 113 -86 231 -414 131 -192 237 -360 95 -168 145 -168 213 -120 167 -96 143 -110 57 -86 259 -56 87 -777 295 -96 57 -86 173 -86 171 -404 143 -172 231 -200 57 -441 55 -58 173 -56 87 -86 171 -72 287 -72 119 -262 119 -144 71 -72 121 -310 71 -302 113 -54 193 -80 307 -58 257 -232 143 -56 143 -116 219 -72 695 -70 71 -460 85 -232 719 -363 57 -402 604 -230 287 -138 83 -172 259 -58 171 -174 55 -88 489 -114 143 -116 171 -116 143 -58 199 -144 145 -343 374 -186 235 -140 77 -86 143 -202 143 -144 113 -144 143 -58 732 -96 263 -264 71 -206 95 -168 215 -144 271 -80 139 -88 85 -414 75 -100 RAW_Data: 285 -96 627 -362 53 -84 201 -374 113 -202 115 -202 421 -316 85 -58 139 -224 87 -86 229 -58 243 -178 267 -288 95 -336 171 -96 213 -288 71 -405 95 -96 95 -384 95 -72 213 -72 95 -96 95 -272 87 -1083 85 -58 113 -88 257 -116 143 -292 175 -318 95 -120 95 -144 95 -72 71 -216 368 -116 373 -172 115 -58 85 -116 143 -86 85 -144 201 -86 201 -202 257 -144 201 -174 113 -144 115 -144 257 -202 585 -364 173 -138 287 -422 431 -86 85 -96 869 -186 95 -52 115 -86 115 -58 55 -276 365 -86 85 -489 171 -140 577 -106 718 -144 391 -232 195 -82 143 -172 109 -120 167 -96 280 -216 145 -240 215 -186 163 -96 141 -172 159 -603 257 -108 629 -192 119 -80 87 -172 57 -144 286 -86 57 -230 344 -58 113 -537 75 -96 537 -86 403 -196 167 -264 119 -238 119 -120 167 -96 95 -478 95 -120 167 -216 1085 -96 358 -72 263 -72 69 -120 143 -96 71 -96 191 -362 55 -144 57 -260 113 -58 85 -174 55 -88 257 -86 231 -194 55 -58 115 -56 55 -339 55 -58 374 -172 139 -82 419 -98 119 -261 71 -72 71 -240 713 -86 143 -218 295 -72 53 -56 431 -58 317 -144 161 -144 373 -144 173 -144 57 -114 85 -116 195 -72 708 -172 115 -86 191 -96 506 -120 71 -174 85 -58 363 -114 317 -230 316 -200 87 -114 57 -230 115 -315 173 -280 694 -212 453 -256 143 -202 113 -540 352 -116 257 -116 457 -56 109 -58 143 -230 259 -144 259 -525 119 -408 247 -112 389 -72 431 -96 137 -236 97 -474 201 -298 71 -82 55 -116 55 -112 199 -174 191 -86 143 -144 115 -114 317 -86 85 -230 87 -114 259 -84 107 -130 143 -94 153 -86 135 -94 215 -72 239 -94 435 -96 263 -142 166 -334 87 -194 179 -96 115 -284 135 -56 57 -144 463 -204 143 -316 201 -58 403 -86 141 -288 85 -202 139 -397 171 -174 305 -202 85 -144 373 -253 161 -492 181 -191 95 -216 315 -191 71 -166 97 -126 337 -96 71 -96 189 -168 295 -84 197 -86 259 -345 137 -144 167 -796 115 -344 455 -72 119 -96 119 -550 209 -88 85 -86 143 -340 167 -260 143 -537 85 -226 51 -537 57 -260 315 -461 51 -84 199 -358 383 -96 143 -257 115 -86 173 -86 201 -144 143 -316 85 -86 479 -88 85 -72 71 -104 115 -116 267 -72 137 -144 143 -116 85 -86 373 -288 115 -200 87 -114 259 -114 259 -462 143 -144 171 -86 57 -58 137 -144 57 -634 343 -72 205 -86 143 -258 57 -232 113 -230 461 -58 185 -74 537 -86 RAW_Data: 535 -142 57 -58 55 -116 115 -432 85 -172 259 -192 167 -120 117 -72 119 -240 334 -72 71 -267 285 -144 119 -374 85 -88 85 -114 143 -202 229 -58 143 -202 115 -202 171 -86 71 -144 87 -56 173 -373 143 -116 113 -462 169 -80 215 -148 115 -336 85 -230 163 -432 85 -374 639 -174 85 -58 57 -82 295 -352 269 -532 414 -322 95 -287 263 -268 115 -56 259 -76 85 -282 401 -305 516 -114 115 -202 171 -86 451 -110 85 -346 201 -274 149 -202 85 -364 366 -258 57 -114 259 -172 142 -144 85 -116 85 -480 171 -144 57 -352 115 -116 535 -404 315 -202 163 -158 517 -316 215 -98 85 -346 85 -144 87 -86 257 -82 167 -58 85 -116 113 -894 233 -186 77 -266 147 -72 71 -82 57 -86 171 -58 57 -86 201 -364 143 -202 115 -114 85 -88 113 -86 87 -230 57 -76 613 -72 85 -96 209 -346 458 -58 547 -490 201 -315 315 -116 75 -168 359 -335 95 -384 93 -120 71 -312 251 -366 233 -96 189 -240 263 -192 271 -58 115 -58 229 -346 459 -174 113 -144 173 -144 218 -224 57 -116 215 -72 103 -202 513 -210 433 -116 113 -174 650 -273 147 -450 375 -86 115 -172 536 -84 85 -230 85 -58 195 -468 287 -110 551 -214 167 -311 213 -250 85 -58 85 -355 113 -230 115 -144 117 -288 195 -202 57 -376 123 -144 236 -168 553 -284 119 -72 143 -188 161 -120 93 -312 335 -58 55 -260 105 -244 143 -120 381 -268 173 -268 635 -168 453 -318 71 -167 71 -406 191 -172 215 -408 119 -144 93 -120 97 -130 143 -192 308 -122 147 -550 313 -96 139 -162 167 -96 431 -80 83 -112 201 -86 287 -86 229 -116 57 -288 113 -174 143 -116 113 -144 115 -518 57 -230 57 -172 231 -86 113 -314 183 -144 119 -72 165 -446 81 -86 135 -190 143 -96 71 -72 411 -96 143 -120 69 -216 349 -72 95 -96 517 -646 163 -86 113 -116 171 -116 143 -116 113 -287 259 -114 517 -168 141 -116 105 -72 95 -96 311 -118 159 -310 191 -54 143 -258 115 -450 219 -54 339 -372 239 -72 167 -174 113 -58 57 -144 259 -172 143 -336 113 -174 85 -230 83 -668 85 -202 113 -144 57 -116 373 -316 719 -288 115 -58 75 -120 139 -144 229 -144 57 -144 171 -192 391 -202 403 -58 315 -188 259 -56 115 -144 85 -404 57 -58 105 -102 429 -406 81 -172 57 -144 287 -230 287 -220 317 -458 283 -58 113 -86 269 -72 281 -58 85 -202 113 -52 421 -58 229 -480 259 -58 143 -660 155 -638 123 -86 57 -86 143 -346 143 -144 57 -144 RAW_Data: 2442 -312 275 -972 949 -310 941 -322 923 -342 921 -352 923 -334 281 -954 945 -350 279 -958 907 -354 289 -980 909 -352 281 -962 907 -330 311 -964 913 -350 317 -930 933 -344 921 -352 893 -330 311 -954 943 -318 315 -958 909 -324 947 -7854 953 -322 289 -948 939 -354 927 -332 911 -324 943 -344 917 -318 317 -964 905 -344 303 -942 947 -312 319 -960 913 -348 281 -958 941 -322 295 -978 905 -350 279 -962 931 -328 947 -324 939 -346 267 -964 935 -348 283 -938 953 -318 931 -7868 935 -346 269 -968 953 -310 941 -322 921 -330 935 -342 931 -318 311 -962 939 -290 337 -950 909 -352 317 -924 943 -324 313 -938 941 -318 317 -932 939 -344 301 -938 933 -350 921 -322 959 -310 301 -942 933 -352 317 -926 957 -314 919 -7868 943 -314 317 -958 909 -322 951 -344 919 -352 921 -324 937 -326 281 -964 941 -318 317 -930 939 -344 301 -938 933 -352 281 -962 953 -314 317 -922 933 -330 315 -954 943 -318 921 -342 943 -320 291 -980 909 -354 281 -962 943 -296 967 -7836 943 -332 309 -950 935 -318 929 -340 943 -320 921 -344 921 -354 283 -960 943 -296 309 -964 945 -318 279 -964 941 -322 333 -944 939 -314 279 -992 903 -342 319 -932 933 -330 931 -340 929 -348 281 -964 935 -334 281 -970 927 -346 921 -7862 951 -314 319 -922 953 -320 923 -346 921 -320 965 -298 943 -324 313 -942 941 -320 317 -930 941 -344 303 -940 945 -312 321 -940 953 -314 303 -960 933 -348 287 -962 911 -352 917 -350 905 -324 333 -918 971 -322 317 -924 945 -324 937 -7872 919 -324 317 -942 941 -318 933 -330 943 -324 943 -310 951 -318 317 -930 939 -344 301 -938 933 -352 317 -926 953 -314 319 -924 939 -324 331 -950 907 -354 315 -926 945 -324 939 -312 953 -318 317 -930 937 -344 301 -940 947 -348 909 -7864 949 -310 319 -956 915 -350 919 -348 905 -322 963 -296 935 -348 317 -922 951 -322 295 -976 939 -314 281 -996 915 -326 307 -940 959 -310 301 -966 935 -346 285 -958 915 -348 921 -348 903 -354 303 -948 911 -350 315 -926 945 -324 941 -7874 943 -290 319 -942 973 -318 929 -314 937 -328 941 -324 939 -310 303 -962 933 -352 285 -962 949 -314 319 -924 951 -320 293 -948 941 -354 283 -962 943 -294 309 -966 943 -320 931 -328 943 -326 311 -940 939 -320 309 -958 933 -338 943 -7840 933 -352 277 -964 941 -322 923 -344 923 -350 931 -310 955 -320 291 -974 907 -350 281 -958 963 -298 313 -956 945 -314 311 -960 937 -312 311 -966 909 -324 319 -944 941 -354 929 -298 945 -324 315 -940 RAW_Data: 943 -354 281 -964 905 -330 933 -7868 951 -324 315 -938 943 -354 893 -330 943 -324 943 -344 919 -318 317 -962 903 -344 301 -974 903 -350 317 -932 931 -342 269 -972 949 -346 285 -938 955 -310 301 -964 935 -348 921 -320 921 -344 301 -940 935 -350 317 -930 929 -318 937 -7872 939 -344 301 -940 947 -346 917 -322 921 -344 923 -352 927 -334 281 -970 925 -334 277 -982 943 -318 317 -932 931 -344 301 -936 935 -350 281 -960 957 -312 303 -960 935 -346 907 -322 929 -344 301 -942 935 -350 317 -924 955 -312 951 -7858 919 -342 309 -940 949 -348 909 -322 923 -344 923 -352 923 -336 317 -924 945 -312 311 -966 921 -340 317 -924 947 -350 281 -958 941 -322 291 -976 905 -350 279 -960 935 -342 943 -320 919 -330 311 -958 943 -320 315 -932 935 -344 919 -7866 957 -312 303 -964 917 -342 945 -320 923 -344 923 -354 929 -298 315 -956 941 -318 315 -960 911 -324 317 -942 939 -354 281 -964 941 -294 311 -968 943 -318 317 -932 937 -330 931 -350 919 -348 283 -960 917 -350 317 -922 939 -322 965 -7864 921 -324 329 -950 909 -354 923 -336 913 -322 947 -344 919 -354 281 -962 941 -294 311 -960 935 -354 281 -962 939 -294 311 -964 937 -354 281 -964 941 -296 309 -964 939 -318 931 -330 945 -324 315 -940 939 -354 281 -964 909 -344 921 -7862 963 -304 307 -976 933 -320 929 -328 941 -324 939 -348 915 -320 317 -930 939 -344 301 -940 965 -320 319 -926 953 -312 303 -960 933 -312 321 -960 913 -348 319 -924 943 -320 959 -310 921 -354 319 -924 943 -324 311 -938 941 -318 957 -7862 943 -318 317 -932 933 -344 925 -352 897 -332 943 -324 943 -346 267 -966 951 -310 321 -960 911 -350 281 -958 949 -320 291 -978 937 -316 279 -964 949 -326 309 -944 943 -314 959 -318 933 -336 317 -934 933 -344 267 -964 937 -350 905 -7896 943 -318 319 -926 955 -314 919 -350 935 -324 941 -294 967 -312 303 -962 933 -348 285 -960 917 -348 317 -922 941 -322 329 -950 907 -354 315 -926 943 -326 313 -940 941 -352 893 -332 949 -324 315 -938 941 -352 283 -962 943 -310 925 -7890 931 -344 269 -968 949 -310 943 -320 923 -350 937 -310 955 -318 317 -930 935 -344 301 -942 947 -346 285 -958 915 -346 317 -924 951 -322 295 -982 905 -352 317 -924 945 -324 941 -346 917 -318 317 -962 905 -330 311 -956 937 -352 897 -7878 939 -354 283 -960 941 -294 965 -312 953 -318 385 -201512 165 -198 265 -526 229 -298 755 -164 61687 -17310 131 -1056 99 -296 195 -296 65 -66 1617 RAW_Data: 77 -76 131 -244 81 -210 55 -1428 53 -344 53 -238 51 -448 51 -804 125 -1490 51 -452 79 -1816 51 -176 197 -700 133 -563 51 -386 79 -474 109 -626 55 -266 103 -616 283 -1932 51 -1034 51 -2809 75 -244 83 -5339 77 -260 105 -839 107 -1806 53 -1408 81 -810 135 -488 187 -1469 73 -2596 75 -74 51 -726 113 -136 83 -406 55 -194 133 -606 55 -1018 55 -1774 51 -1954 75 -910 51 -944 137 -1337 51 -1606 101 -566 75 -584 51 -1470 133 -242 159 -2798 51 -1568 97 -100 71 -556 77 -1234 53 -320 53 -274 68337 -252 333 -278 333 -74 533 -280 307 -276 331 -6948 347 -262 329 -278 329 -278 329 -278 303 -304 303 -302 303 -304 303 -278 329 -278 329 -74 533 -294 325 -270 317 -6944 335 -282 309 -304 309 -304 281 -328 293 -310 281 -326 281 -326 281 -326 279 -302 305 -100 503 -306 305 -302 293 -6992 295 -294 291 -314 285 -336 283 -334 257 -328 283 -328 291 -310 281 -328 279 -328 279 -124 479 -332 279 -328 255 -7012 295 -324 271 -330 267 -346 261 -342 259 -334 257 -358 255 -356 257 -354 231 -354 255 -152 453 -356 257 -352 255 -7024 255 -352 257 -352 255 -354 255 -326 257 -352 255 -352 255 -354 255 -352 253 -352 255 -150 453 -356 255 -354 253 -7030 255 -352 267 -344 251 -354 253 -354 253 -354 267 -322 267 -350 261 -344 257 -364 231 -154 459 -360 257 -354 231 -7062 231 -380 231 -380 231 -352 257 -352 257 -352 257 -352 257 -352 257 -352 255 -354 231 -174 457 -360 229 -378 229 -7084 239 -364 239 -366 229 -380 229 -378 229 -380 229 -378 255 -354 255 -354 255 -352 255 -150 457 -364 253 -354 255 -9542 101 -3126 53 -814 109 -406 51 -162 109 -2219 183 -496 103 -1369 81 -603 99 -2172 79 -1103 75 -676 77 -560 103 -378 51 -654 95 -888 155 -1322 111 -1626 53 -182 51 -166 83 -52 181 -182 71 -2132 77 -2839 103 -4022 79 -362 81 -466 75 -970 203 -998 51 -2085 51 -1853 99 -328 75 -346 55 -1949 79 -2648 79 -434 75 -6757 51 -1920 109 -306 51 -612 101 -996 77 -764 81 -790 125 -1489 99 -430 77 -4142 165 -372 101 -198 71 -1688 51 -1636 99 -434 81 -794 135 -1973 79 -188 109 -2678 81 -196 109 -2099 51 -504 77 -1854 51 -910 107 -948 75 -122 131 -78 79 -1781 103 -3344 111 -406 79 -184 51 -408 103 -54 79 -1474 127 -1789 213 -683 131 -348 161 -5237 53 -2675 101 -52 105 -474 103 -1336 99 -3548 105 -1724 161 -2180 107 -2514 97 -3784 51 -910 77 -505 71 -494 131 -1154 79 -2295 75 -350 161 -274 81 -222 RAW_Data: 107 -1501 77 -1518 53 -704 113 -390 107 -650 73 -932 51 -3641 169 -704 187 -574 79 -332 51 -3765 51 -1042 75 -1413 103 -2163 75 -218 73 -4118 73 -716 51 -1720 51 -176 145 -817 79 -602 55 -1270 53 -2290 81 -346 79 -1840 53 -596 97 -1135 155 -1672 157 -1150 53 -52 101 -2753 153 -1546 158 -698 79 -2962 215 -490 161 -766 51 -2170 55 -811 51 -694 51 -1461 103 -2590 149 -3785 130 -54 103 -1108 103 -3978 51 -1626 81 -1825 109 -452 129 -1000 79 -1651 157 -276 53 -104 81 -2440 81 -1780 53 -1554 51 -512 131 -2508 99 -176 73 -914 51 -76 81 -202 111 -690 109 -790 109 -584 53 -244 79 -706 73 -550 129 -142 127 -546 77 -296 53 -874 105 -2623 51 -1004 77 -3131 79 -552 81 -2008 187 -1168 55 -1173 51 -2146 99 -700 51 -1580 101 -252 75 -474 77 -569 73 -5817 77 -614 77 -712 149 -228 73 -562 201 -274 127 -648 77 -578 75 -1810 109 -2106 171 -5996 81 -366 159 -274 55 -1228 77 -3386 53 -106 81 -1024 133 -2331 53 -2636 53 -780 149 -842 79 -2288 53 -2807 107 -1410 51 -620 75 -428 71 -272 75 -1140 103 -4912 55 -2261 53 -716 53 -3093 109 -502 111 -1492 53 -4317 51 -500 83 -338 129 -698 105 -1565 103 -1874 105 -344 77 -546 79 -2826 105 -260 75 -616 103 -1254 113 -2687 77 -977 73 -246 97 -1054 109 -4681 67101 -252 357 -252 333 -276 333 -252 355 -254 333 -276 331 -6932 347 -272 353 -242 343 -268 339 -286 309 -282 309 -306 307 -304 283 -328 281 -328 281 -102 505 -308 291 -314 279 -6996 281 -326 279 -328 277 -328 277 -328 279 -328 277 -328 279 -328 279 -328 277 -330 277 -124 483 -322 297 -298 293 -6972 283 -336 281 -332 257 -330 281 -328 283 -328 281 -330 265 -338 255 -352 253 -352 255 -150 455 -336 279 -328 279 -6992 295 -322 265 -348 261 -342 259 -334 259 -356 257 -356 255 -330 257 -354 257 -352 255 -152 455 -358 239 -368 253 -7026 243 -352 243 -350 265 -344 261 -362 231 -358 255 -356 257 -354 231 -380 229 -354 255 -150 455 -360 231 -376 231 -7050 229 -378 229 -378 229 -378 229 -378 229 -378 229 -378 229 -352 255 -352 253 -352 255 -150 455 -362 229 -378 227 -7050 253 -354 229 -378 229 -378 229 -378 227 -378 229 -378 229 -378 229 -378 229 -376 229 -174 431 -374 243 -378 241 -7032 261 -370 233 -362 233 -384 233 -356 233 -380 231 -380 231 -380 231 -380 231 -378 231 -176 431 -384 231 -380 211 -7114 231 -384 231 -384 205 -408 207 -408 207 -408 231 -384 231 -412 207 -412 181 -530 77 -1144 RAW_Data: 79 -4798 53 -918 83 -4847 51 -755 103 -732 81 -388 55 -1026 77 -1506 101 -242 107 -469 51 -2026 79 -686 77 -348 51 -104 131 -860 129 -148 73 -446 75 -440 97 -306 99 -600 51 -626 105 -1350 95 -674 83 -230 119 -1714 135 -396 155 -1111 109 -652 111 -482 51 -506 55 -1715 103 -968 207 -1156 81 -164 57 -404 99 -508 205 -126 75 -1417 51 -186 77 -588 53 -54 103 -2854 73 -1010 53 -800 51 -2494 53 -106 105 -52 51 -104 79 -1116 51 -654 103 -220 77 -162 71 -5385 137 -2232 79 -1159 79 -250 57 -108 79 -164 107 -1660 79 -3927 129 -992 73 -1913 51 -1430 51 -1498 55 -514 103 -586 81 -386 53 -2402 175 -1994 85 -3431 53 -3209 99 -372 79 -78 53 -1338 75 -682 97 -680 51 -206 101 -1708 101 -452 131 -1397 161 -2272 53 -456 77 -1413 193 -270 109 -466 53 -2432 77 -222 189 -474 107 -774 171 -192 79 -1327 75 -2141 51 -908 135 -3866 75 -804 129 -468 101 -1040 79 -1470 55 -869 77 -1448 105 -160 55 -1916 240 -588 79 -1587 53 -922 79 -2292 181 -1448 51 -552 77 -2189 75 -2545 77 -384 300 -2478 101 -1092 73 -558 79 -132 105 -884 103 -1177 109 -880 79 -2431 109 -1006 105 -468 53 -1378 235 -684 75 -285 73 -604 129 -528 77 -1582 51 -1240 105 -2750 75 -252 51 -1024 95 -1891 51 -864 107 -326 83 -887 159 -1058 163 -322 105 -722 83 -388 81 -936 155 -880 55 -220 83 -2123 135 -2100 73 -1926 103 -1633 149 -526 51 -324 51 -1538 103 -164 137 -964 81 -152 111 -781 225 -655 53 -2888 105 -151 131 -454 53 -4109 77 -1052 53 -178 163 -910 51 -733 207 -2070 53 -474 79 -54 53 -818 51 -1228 53 -2262 79 -788 79 -480 73 -2747 83 -316 183 -1880 105 -862 53 -662 53 -2287 153 -1630 51 -817 243 -806 55 -510 51 -1389 75 -986 135 -498 109 -532 131 -5521 99 -2948 209 -764 75 -1168 75 -886 83 -2065 53 -710 51 -596 77 -374 73 -628 99 -732 51 -202 73 -632 53 -222 55 -511 79 -4884 53 -1826 81 -1266 107 -356 55 -110 113 -280 83 -756 169 -252 81 -1854 51 -1556 157 -258 75 -748 53 -1438 291 -244 71 -1092 77 -1220 229 -1055 181 -1182 71 -1284 77 -864 79 -138 53 -160 53 -952 81 -80 127 -1272 51 -590 103 -502 77 -634 101 -74 51 -224 101 -912 77 -562 51 -164 83 -396 105 -4643 111 -3293 133 -1395 107 -3047 137 -2353 53 -298 83 -54 81 -80 53 -162 83 -392 105 -606 107 -787 53 -928 51 -2800 161 -1146 51 -182 103 -536 103 -994 81 -2044 83 -732 133 -1881 133 -2160 75 -178 RAW_Data: 75 -1694 101 -122 73 -864 51 -250 129 -406 77 -630 77 -610 101 -781 125 -128 51 -5075 77 -1992 83 -1272 176 -2100 53 -2044 53 -1234 79 -1704 157 -519 99 -2374 101 -100 103 -202 51 -360 77 -1962 103 -2153 77 -1820 191 -164 167 -1320 77 -1718 127 -1374 81 -1047 53 -54 79 -632 53 -656 51 -128 81 -216 51 -755 79 -2692 103 -1478 125 -452 51 -896 157 -3679 135 -632 105 -134 55 -112 77 -588 79 -188 55 -1118 79 -1152 51 -1950 109 -1858 103 -1104 81 -580 131 -226 255 -2932 77 -1536 51 -1044 159 -2135 67667 -252 333 -278 333 -276 333 -74 533 -280 307 -276 345 -6930 331 -276 329 -278 329 -278 327 -278 349 -270 325 -270 317 -290 313 -308 283 -306 309 -100 509 -306 283 -328 281 -6972 307 -302 281 -326 281 -326 281 -328 279 -328 281 -326 279 -328 279 -326 281 -328 279 -124 481 -308 281 -326 279 -6998 281 -326 279 -328 279 -328 277 -330 277 -328 279 -328 279 -328 277 -304 303 -302 303 -100 503 -306 295 -322 293 -6968 287 -342 259 -336 283 -332 257 -356 255 -328 283 -328 257 -352 257 -352 257 -352 255 -150 455 -334 281 -326 281 -6996 265 -342 253 -354 253 -354 253 -354 253 -354 267 -326 269 -350 263 -342 257 -336 259 -152 459 -360 257 -354 231 -7038 267 -338 255 -352 253 -354 253 -354 239 -354 269 -352 239 -372 233 -366 233 -358 257 -154 457 -360 231 -378 231 -7050 231 -380 231 -378 231 -380 231 -378 231 -354 255 -352 257 -352 255 -354 231 -378 229 -176 453 -358 229 -378 231 -7076 231 -378 231 -380 231 -380 229 -354 255 -354 257 -352 257 -352 257 -352 257 -354 255 -150 455 -358 265 -364 229 -4941 101 -1058 153 -670 157 -532 124 -1396 133 -82 165 -162 153 -258 207 -156 131 -1582 85 -714 53 -774 103 -396 274 -110 131 -1965 55 -402 159 -1026 79 -590 77 -3531 57 -500 51 -4770 109 -722 77 -186 53 -298 79 -502 165 -808 77 -438 53 -382 101 -1914 75 -504 77 -1969 135 -5517 99 -576 51 -608 243 -684 53 -2058 315 -1384 79 -1079 77 -232 79 -212 155 -1500 137 -258 75 -975 204 -752 83 -2542 51 -484 103 -78 77 -210 53 -922 157 -1900 107 -2173 83 -384 101 -80 128 -814 183 -978 127 -772 105 -2073 51 -708 53 -300 83 -739 237 -884 131 -3412 157 -1752 81 -164 83 -3373 53 -1406 105 -3809 79 -432 51 -724 77 -548 53 -1955 79 -807 81 -2096 103 -490 105 -1196 109 -108 79 -394 71 -1159 129 -126 143 -340 107 -556 81 -2390 135 -106 133 -690 133 -4347 189 -290 51 -110 53 -78 103 -1101 51 -1362 RAW_Data: 83 -320 81 -4648 101 -3726 173 -1418 85 -348 53 -2994 79 -1390 51 -1656 107 -764 53 -134 79 -1619 131 -932 55 -2810 107 -3218 79 -765 107 -654 103 -1498 77 -228 51 -134 247 -1526 51 -3903 103 -1495 179 -282 77 -392 53 -1756 105 -368 111 -486 51 -298 53 -216 113 -358 51 -266 187 -1059 81 -780 105 -238 51 -482 53 -791 109 -2169 77 -5304 53 -398 79 -650 51 -54 51 -1789 73 -198 101 -1580 101 -746 97 -4518 53 -744 51 -1064 101 -928 111 -392 185 -869 103 -320 133 -704 81 -244 53 -1628 75 -634 79 -666 183 -1276 83 -218 107 -1163 55 -1276 127 -1144 73 -1400 81 -266 77 -568 129 -806 121 -1420 103 -848 77 -982 103 -2132 81 -1610 101 -1218 55 -2208 75 -2735 53 -921 53 -724 51 -472 83 -3164 185 -400 77 -812 81 -306 215 -2167 53 -130 53 -272 81 -400 79 -1272 81 -418 51 -1381 73 -340 101 -2169 81 -2330 137 -2698 99 -2340 99 -126 51 -1714 55 -488 81 -3500 51 -404 77 -1422 77 -856 215 -80 51 -2308 53 -134 77 -2036 75 -5175 129 -946 239 -638 53 -244 55 -564 105 -826 71 -1632 77 -106 129 -246 135 -366 79 -724 79 -1535 57 -1085 113 -1320 79 -3111 127 -1578 75 -324 75 -102 173 -364 79 -1374 53 -1508 107 -622 51 -526 109 -584 187 -2648 51 -106 79 -380 103 -604 51 -1244 73 -5766 107 -1934 177 -702 51 -1277 53 -1643 79 -1446 81 -4098 75 -574 103 -432 189 -1436 107 -454 79 -132 105 -136 81 -112 113 -942 239 -1238 79 -952 157 -340 51 -314 191 -456 53 -3368 101 -150 99 -464 51 -718 73 -770 101 -150 73 -2132 75 -557 77 -680 81 -3512 151 -760 75 -332 75 -1212 131 -1468 79 -1955 101 -541 75 -344 79 -2146 53 -2299 97 -720 79 -2518 79 -3807 51 -1272 75 -352 77 -52 75 -586 53 -1142 79 -82 81 -2400 157 -324 81 -268 103 -1154 81 -1175 79 -1191 51 -1074 53 -2566 137 -854 75 -1497 51 -4533 51 -2290 51 -344 77 -348 55 -1182 77 -897 135 -874 51 -1064 51 -208 55 -140 55 -1334 133 -1238 157 -1669 113 -2128 75 -848 85 -510 83590 -126 333 -280 331 -252 331 -6946 331 -276 331 -276 329 -278 329 -276 331 -276 331 -276 331 -276 347 -238 351 -254 353 -268 323 -270 345 -6924 335 -282 307 -304 307 -304 281 -304 307 -302 307 -302 305 -302 307 -302 305 -302 281 -124 507 -282 305 -302 305 -6984 279 -328 277 -328 279 -328 277 -330 277 -304 303 -302 305 -302 305 -302 303 -304 303 -100 507 -314 295 -298 293 -6986 283 -334 281 -306 283 -328 283 -328 281 -328 283 -328 255 -352 RAW_Data: -66 11813 -100 14655 -98 40111 -66 1625 -2116 1933 -34732 501 -11730 235 -3728 1887 -2106 1933 -2092 1971 -2072 1959 -34712 511 -3554 445 -3556 1997 -2036 455 -3594 1963 -2046 1979 -2076 1961 -2070 1989 -34690 483 -7724 1739 -2226 355 -3684 1857 -2138 1929 -2078 1965 -2074 1947 -34750 487 -3538 473 -3544 1993 -2042 485 -3548 1961 -2070 1965 -2070 1969 -2042 1997 -34716 443 -7734 1753 -2236 323 -3676 1903 -2098 1945 -2102 1927 -2070 1989 -34710 521 -3532 473 -3544 1991 -2032 481 -3556 1969 -2076 1967 -2036 1991 -2066 1969 -34718 467 -7756 1739 -2192 363 -3654 1889 -2132 1929 -2096 1935 -2070 1987 -34716 511 -3522 471 -3554 2009 -2036 459 -3550 2003 -2038 1979 -2042 1999 -2042 1999 -34704 471 -11774 225 -3710 1879 -2162 1885 -2112 1925 -2110 1939 -34738 459 -3636 403 -3612 1939 -2062 451 -3566 1985 -2044 1995 -2040 2009 -2032 2003 -34684 495 -3680 295 -3648 1935 -2098 423 -3562 2001 -2038 1989 -2044 2003 -2036 1977 -34718 461 -3678 295 -3684 1901 -2098 429 -3596 1967 -2036 1981 -2048 1993 -2042 2013 -34686 521 -3530 457 -3568 1999 -2036 455 -3552 1999 -2032 2019 -2024 1995 -2022 1997 -34716 441 -15774 1809 -2192 1905 -2100 1919 -2112 1961 -34720 417 -3830 167 -3710 1863 -2144 357 -3674 1909 -2100 1955 -2062 1977 -2072 1965 -34710 487 -3562 453 -3554 1985 -2052 481 -3536 2019 -2010 2001 -2042 1997 -2038 2005 -34716 451 -3602 433 -3584 1959 -2070 451 -3560 2001 -2038 1993 -2042 1967 -2072 1973 -34712 459 -3622 393 -3624 1933 -2068 457 -3584 1965 -2064 1979 -2052 1967 -2044 1981 -34722 477 -3608 397 -3588 1961 -2096 413 -3596 1971 -2040 1979 -2072 1963 -2070 1959 -34714 495 -3558 483 -3538 1985 -2042 479 -3562 1985 -2046 1967 -2070 1973 -2054 1995 -34688 493 -3578 413 -3614 1939 -2074 465 -3560 1971 -2038 2017 -2018 1995 -2042 2013 -34726 479 -3528 475 -3556 1999 -2036 455 -3570 1999 -2040 1973 -2054 2001 -2032 1987 -34720 477 -3562 445 -3602 1949 -2054 481 -3562 1975 -2060 1963 -2064 1977 -2038 2005 -34702 485 -3570 447 -3550 2015 -2020 479 -3564 1983 -2048 1999 -2034 1971 -2064 1993 -34688 517 -3516 497 -3532 1999 -2038 481 -3558 1997 -2004 2027 -2042 1963 -2038 1997 -34716 491 -3562 461 -3548 1995 -2032 491 -3524 2005 -2036 1989 -2038 1995 -2046 1979 -34714 465 -3682 293 -3680 1905 -2096 431 -3592 1969 -2070 1977 -2052 1965 -2044 1981 -34734 479 -3564 463 -3556 1999 -2032 457 -3550 1995 -2044 2011 -2042 1997 -2006 2027 -34680 531 -3524 483 -3538 1987 -2044 479 -3534 2013 -2048 1965 -2062 1987 -2030 1997 -34712 473 -3592 445 -3562 1975 -2072 451 -3566 1965 -2042 2013 -2046 1963 -2064 1993 -34700 459 -3632 371 -3638 1915 -2084 449 -3568 1987 -2046 1971 -2070 1983 -2022 1997 -34726 487 -3524 477 -3562 1985 -2044 481 -3542 2005 -2040 1995 -2038 1967 -2046 1993 -34710 511 -3528 471 -3560 1967 -2070 459 -3558 1971 RAW_Data: -2072 1971 -2056 1971 -2074 1973 -34714 455 -3634 373 -3634 1901 -2110 419 -3620 1941 -2070 1991 -2040 1999 -2038 1965 -34740 467 -3562 481 -3534 1983 -2070 449 -3546 1999 -2044 1993 -2042 2003 -2036 1975 -34702 521 -3560 443 -3586 1969 -2044 449 -3562 1997 -2046 1987 -2042 2007 -2034 1973 -34732 487 -3562 443 -3582 1979 -2058 445 -3560 1995 -2044 1997 -2028 1987 -2034 2003 -34710 515 -3518 485 -3566 1977 -2036 483 -3536 1999 -2044 2009 -2024 1995 -2068 1973 -34710 487 -3564 471 -3558 1977 -2054 447 -3564 1991 -2042 1997 -2036 2007 -2034 2001 -34684 529 -3526 469 -3548 1989 -2038 483 -3562 1997 -2038 1973 -2034 1999 -2036 1997 -34728 487 -3536 479 -3534 2013 -2044 449 -3570 1985 -2042 1993 -2044 2005 -2014 1995 -34710 473 -3594 439 -3562 1995 -2040 457 -3564 2001 -2040 1975 -2046 1995 -2046 1999 -34704 491 -3548 451 -3570 1991 -2042 447 -3578 1967 -2046 1995 -2042 1999 -2034 2001 -34712 491 -3562 443 -3584 1981 -2018 479 -3562 1985 -2044 1997 -2030 1989 -2040 1997 -34722 489 -3554 459 -3560 1969 -2068 453 -3554 1999 -2034 1987 -2058 1997 -2046 1983 -34702 487 -3534 479 -3564 1983 -2040 483 -3538 1981 -2048 1993 -2048 2007 -2044 1995 -34696 489 -3550 453 -3570 1995 -2050 447 -3564 1983 -2040 1999 -2034 2003 -2034 1995 -34690 495 -3580 433 -3586 1969 -2064 453 -3552 1995 -2036 1991 -2056 1997 -2046 1987 -34706 441 -3636 373 -3626 1959 -2074 419 -3592 1963 -2074 1989 -2044 1971 -2070 1981 -34698 509 -3526 503 -3528 2005 -2034 481 -3528 1993 -2042 1999 -2066 1989 -2034 2003 -34678 495 -3540 481 -3546 1997 -2046 473 -3554 1999 -2034 2001 -2036 1995 -2046 1983 -34720 475 -3560 469 -3548 1997 -2030 485 -3566 1963 -2066 1983 -2046 1999 -2034 1973 -34734 487 -3560 443 -3584 1981 -2052 445 -3568 1987 -2044 1999 -2032 1993 -2034 2007 -34702 491 -3560 459 -3558 1967 -2070 455 -3556 2003 -2036 1977 -2042 2005 -2028 1997 -34730 461 -3564 473 -3536 2011 -2046 449 -3566 1989 -2044 1997 -2042 1971 -2054 2001 -34708 475 -3560 479 -3528 1999 -2040 485 -3566 1963 -2040 2013 -2042 1995 -2034 1987 -34694 519 -3554 441 -3582 1981 -2052 449 -3564 1985 -2040 1993 -2034 1991 -2062 1975 -34714 529 -3534 463 -3558 1969 -2068 451 -3560 2003 -2038 1993 -2042 1969 -2070 1975 -34720 493 -3582 383 -3616 1937 -2072 469 -3558 1995 -2036 1975 -2066 1995 -2042 1989 -34678 531 -3560 391 -3622 1937 -2094 429 -3588 1967 -2070 1981 -2054 1965 -2038 2021 -34682 525 -3524 481 -3564 1989 -2040 445 -3554 1997 -2040 2005 -2034 2001 -2024 1991 -34706 517 -3586 409 -3610 1927 -2076 451 -3558 1967 -2074 1993 -2038 2001 -2040 1975 -34714 495 -3588 409 -3602 1933 -2088 447 -3584 1965 -2044 1999 -2036 2007 -2030 1995 -34692 525 -3538 447 -3580 1981 -2042 487 -3542 1995 -2040 1969 -2072 1969 -2044 1991 -34714 443 -3636 399 -3630 1899 -2106 413 -3584 1997 RAW_Data: 4046 -17306 65 -298 97 -100 133 -268 265 -330 133 -132 1723 -16806 165 -132 99 -920 65 -622 789 -130 99 -66 361 -98 295 -166 73573 -17510 97 -492 129 -728 529 -100 1063 -164 295 -66 1119 -14962 627 -166 363 -264 427 -132 593 -100 633 -132 39555 -16938 99 -2024 65 -100 97 -164 99 -66 399 -100 123891 -16736 163 -200 97 -200 165 -264 65 -828 427 -132 871 -5132 591 -490 595 -486 605 -454 275 -822 241 -824 273 -784 321 -782 649 -444 653 -408 657 -428 321 -744 693 -388 699 -388 707 -392 313 -752 345 -750 317 -744 351 -730 355 -738 323 -774 327 -748 329 -750 695 -386 701 -354 381 -722 351 -720 385 -718 351 -718 345 -738 705 -382 329 -736 713 -360 387 -718 369 -718 367 -706 735 -352 375 -726 351 -722 351 -720 719 -7808 4845 -1474 743 -332 741 -370 705 -370 349 -718 383 -716 345 -712 381 -704 747 -326 747 -350 737 -352 351 -718 719 -360 741 -366 687 -362 375 -704 381 -724 351 -740 353 -712 357 -718 359 -744 363 -688 365 -722 727 -354 727 -354 379 -724 351 -722 353 -720 387 -718 353 -718 703 -374 351 -716 735 -354 365 -708 353 -734 351 -746 717 -356 359 -720 371 -704 371 -720 731 -7786 4847 -1482 711 -386 711 -358 743 -330 373 -708 359 -748 349 -740 351 -716 719 -356 727 -354 739 -354 351 -718 719 -362 743 -364 721 -330 373 -706 381 -722 351 -740 353 -712 359 -720 361 -722 361 -720 361 -720 725 -354 731 -354 381 -720 353 -722 385 -720 351 -720 349 -716 735 -354 361 -748 711 -364 347 -740 365 -722 365 -720 695 -384 371 -704 381 -702 377 -710 709 -7804 4853 -1468 743 -336 735 -358 719 -352 379 -724 353 -722 353 -720 387 -686 721 -360 721 -362 743 -332 387 -718 721 -366 701 -382 701 -350 377 -720 351 -740 353 -714 357 -710 397 -710 365 -702 385 -688 377 -724 731 -352 703 -354 379 -736 343 -740 357 -720 349 -706 385 -718 719 -354 365 -724 735 -352 377 -724 355 -720 353 -720 721 -358 387 -686 387 -718 353 -718 733 -7796 4821 -1492 739 -350 719 -334 737 -350 365 -722 373 -722 367 -708 371 -702 747 -352 711 -358 743 -364 343 -706 749 -352 717 -350 717 -384 327 -736 351 -746 355 -716 357 -720 359 -710 365 -742 365 -708 367 -704 711 -354 743 -356 387 -684 373 -706 381 -722 351 -740 353 -714 721 -356 361 -720 733 -352 375 -694 385 -724 353 -722 719 -356 385 -686 385 -718 351 -716 731 -7792 4843 -1480 717 -354 719 -386 717 -354 359 -720 351 -708 387 -712 355 -718 721 -356 727 -354 739 -356 351 -718 741 -364 RAW_Data: 705 -370 703 -372 351 -718 383 -720 347 -720 347 -714 381 -704 353 -744 357 -718 355 -720 723 -356 725 -354 379 -722 351 -722 353 -722 385 -718 351 -718 721 -372 351 -716 719 -372 351 -718 383 -716 345 -714 743 -346 361 -740 353 -712 357 -710 725 -7818 4837 -1498 713 -356 709 -360 741 -332 375 -706 359 -750 351 -706 353 -748 719 -356 723 -352 739 -354 351 -718 709 -364 719 -362 721 -364 385 -718 353 -718 383 -682 377 -712 349 -734 353 -742 355 -712 359 -722 723 -354 729 -352 381 -722 353 -722 351 -720 387 -718 353 -716 701 -388 345 -722 737 -354 357 -722 351 -708 387 -712 717 -350 731 -354 741 -356 743 -330 375 -8180 4829 -1468 739 -364 707 -354 729 -352 379 -722 353 -720 387 -686 387 -718 707 -368 721 -366 707 -368 351 -718 735 -354 719 -354 719 -388 329 -746 349 -738 351 -712 359 -718 361 -742 365 -708 371 -706 373 -720 733 -320 733 -354 383 -720 353 -720 387 -718 351 -716 385 -714 703 -388 327 -746 705 -348 387 -702 385 -690 385 -724 713 -358 709 -362 743 -364 709 -370 351 -8162 4837 -1482 715 -388 715 -352 715 -384 325 -730 353 -744 353 -712 359 -720 723 -354 733 -354 745 -356 351 -720 719 -362 741 -330 737 -382 349 -722 345 -724 361 -744 349 -704 383 -716 357 -718 357 -720 361 -720 723 -354 733 -354 383 -720 387 -686 387 -718 353 -718 349 -716 731 -384 347 -724 721 -352 365 -706 353 -732 353 -746 717 -356 723 -352 739 -354 711 -360 385 -8146 4841 -1470 737 -344 739 -326 751 -352 377 -690 387 -724 353 -724 353 -722 711 -360 743 -364 721 -330 387 -716 703 -386 721 -356 721 -354 363 -706 349 -734 351 -746 355 -718 355 -712 363 -744 365 -708 369 -722 695 -352 731 -354 381 -722 353 -722 351 -734 351 -716 383 -720 723 -354 333 -736 739 -348 361 -708 351 -748 355 -712 725 -354 727 -352 741 -352 713 -358 385 -8134 4855 -1474 719 -358 709 -362 721 -364 387 -716 351 -718 385 -712 347 -712 739 -334 739 -354 729 -352 379 -722 717 -354 711 -360 743 -332 387 -718 351 -716 377 -708 349 -730 353 -742 355 -710 359 -720 359 -720 723 -354 729 -352 381 -720 353 -722 351 -722 387 -684 387 -716 703 -384 349 -722 737 -354 329 -750 349 -738 353 -712 719 -356 725 -354 741 -354 717 -358 385 -8126 4861 -1470 735 -344 731 -346 729 -348 383 -718 347 -712 353 -734 353 -746 715 -356 725 -350 741 -352 351 -718 741 -366 721 -366 705 -370 353 -718 385 -682 377 -710 349 -734 353 -744 355 -710 359 -710 397 -688 RAW_Data: 727 -354 729 -352 379 -724 353 -722 353 -718 387 -716 353 -716 735 -348 383 -682 727 -386 347 -722 347 -712 381 -706 747 -326 747 -350 737 -352 711 -358 RAW_Data: -854 811 -454 811 -444 409 -838 811 -454 823 -432 385 -842 811 -454 389 -854 821 -418 837 -444 401 -850 417 -854 395 -830 417 -846 819 -432 811 -448 789 -444 839 -454 401 -856 381 -850 825 -410 841 -418 417 -834 411 -840 827 -442 417 -844 799 -472 809 -420 411 -842 419 -848 397 -822 413 -850 799 -486 381 -848 415 -854 423 -16394 449 -358 437 -386 411 -384 449 -382 417 -384 419 -386 417 -386 419 -388 419 -388 419 -388 419 -390 437 -4036 421 -810 425 -820 393 -866 813 -422 415 -856 397 -858 811 -456 427 -820 815 -416 419 -850 401 -854 805 -420 835 -444 409 -842 809 -454 433 -820 421 -838 813 -420 417 -822 435 -820 419 -834 431 -852 411 -866 805 -420 815 -444 805 -454 403 -824 809 -448 819 -448 413 -844 811 -446 811 -456 409 -816 809 -456 389 -866 387 -842 809 -454 827 -432 413 -850 829 -428 809 -452 381 -852 799 -452 413 -852 807 -450 801 -444 409 -872 411 -840 413 -812 413 -832 807 -450 815 -442 801 -454 809 -454 429 -820 419 -838 811 -456 785 -428 409 -842 439 -824 813 -448 415 -858 819 -418 831 -426 449 -808 427 -820 393 -866 421 -808 825 -436 413 -852 403 -884 421 -16394 407 -478 257 -574 229 -576 229 -564 231 -592 267 -490 305 -520 307 -486 309 -522 307 -458 341 -486 337 -4096 343 -882 389 -880 341 -874 807 -476 351 -882 397 -860 807 -450 431 -824 811 -450 399 -824 417 -844 817 -432 807 -448 411 -872 801 -460 417 -810 425 -836 809 -420 411 -838 409 -852 417 -844 425 -852 385 -872 801 -426 841 -420 811 -422 409 -844 809 -454 823 -432 415 -842 835 -450 805 -454 403 -822 809 -450 399 -826 417 -844 821 -434 807 -448 411 -876 801 -440 807 -450 383 -850 833 -416 415 -852 807 -456 811 -444 411 -838 419 -848 401 -852 377 -850 819 -454 795 -436 809 -448 821 -448 411 -846 417 -842 817 -432 811 -412 411 -864 417 -844 791 -438 415 -876 793 -458 809 -450 383 -832 413 -840 407 -866 387 -844 821 -434 413 -874 377 -868 419 -16408 411 -392 421 -390 421 -388 421 -376 427 -394 433 -388 409 -386 411 -384 449 -382 419 -384 419 -384 419 -4018 343 -89684 97 -430 65 -166 163 -66 231 -100 161 -392 161 -64 229 -1056 97 -198 97 -198 259 -166 691 -66 395 -98 131 -100 99 -66 199 -198 1657 -406 365 -462 361 -436 357 -438 387 -444 353 -444 385 -414 387 -448 355 -448 355 -444 395 -394 399 -4050 819 -434 811 -414 819 -450 409 -852 809 -450 805 -448 805 -446 831 -428 409 -846 389 -854 395 -862 811 RAW_Data: -452 783 -462 811 -446 411 -874 383 -852 403 -852 777 -450 411 -838 805 -452 397 -858 805 -484 387 -872 803 -442 805 -448 383 -846 797 -484 777 -474 381 -846 831 -430 807 -482 387 -852 817 -418 805 -452 823 -430 385 -878 377 -876 411 -846 391 -884 811 -444 805 -420 415 -846 399 -852 807 -452 805 -444 803 -450 803 -454 807 -452 397 -850 395 -862 385 -844 427 -840 809 -456 379 -876 407 -880 383 -846 819 -432 387 -872 375 -854 413 -846 387 -886 779 -476 803 -450 801 -444 415 -846 793 -438 415 -846 417 -822 407 -852 417 -852 817 -444 409 -16426 443 -358 431 -388 409 -386 447 -350 449 -382 419 -386 419 -386 417 -386 419 -388 453 -354 453 -356 445 -4018 813 -416 839 -420 817 -418 451 -816 835 -444 809 -450 811 -440 803 -444 407 -830 419 -844 419 -836 805 -420 835 -444 803 -446 409 -868 421 -814 431 -822 807 -452 397 -828 819 -452 415 -856 787 -454 419 -848 837 -410 839 -416 395 -866 787 -450 811 -454 407 -850 805 -454 805 -470 381 -850 833 -418 805 -438 809 -448 397 -860 421 -810 431 -856 381 -888 791 -424 841 -422 415 -820 437 -818 813 -450 813 -454 803 -446 817 -448 829 -410 451 -816 403 -818 413 -850 409 -846 811 -448 415 -834 413 -884 399 -822 815 -452 381 -852 407 -846 415 -846 385 -866 807 -456 809 -446 835 -412 407 -834 815 -450 415 -822 405 -848 419 -844 427 -852 809 -442 407 -16420 425 -422 335 -486 309 -486 309 -522 307 -492 337 -454 351 -466 329 -498 327 -468 323 -472 355 -442 355 -4120 757 -456 773 -478 781 -458 381 -874 771 -482 801 -470 777 -482 805 -450 399 -826 415 -846 387 -866 805 -420 813 -446 831 -458 417 -846 401 -852 381 -840 835 -420 415 -846 795 -440 413 -842 835 -450 407 -860 811 -418 815 -424 413 -842 807 -454 823 -428 411 -842 801 -454 807 -488 401 -822 805 -448 803 -446 803 -426 447 -844 397 -856 381 -870 411 -870 777 -452 829 -432 385 -840 419 -848 797 -438 809 -450 815 -448 833 -440 803 -452 411 -820 415 -848 409 -844 411 -846 779 -462 409 -848 409 -864 421 -844 793 -438 385 -846 419 -850 399 -838 415 -872 777 -478 803 -448 799 -442 417 -848 799 -438 415 -842 409 -826 417 -844 427 -854 807 -452 409 -16402 461 -352 421 -386 421 -386 419 -388 453 -354 453 -354 447 -378 409 -386 439 -376 421 -410 385 -414 415 -4024 831 -418 809 -438 807 -444 409 -838 809 -456 821 -432 841 -414 255 -87638 131 -66 97 -296 97 -264 131 -196 65 -132 231 -632 197 -664 131 RAW_Data: -500 395 -132 461 -132 689 -98 2685 -100 997 -1508 99 -2186 231 -166 231 -134 133 -932 65 -268 99 -132 65 -200 97 -68 163 -234 65 -68 99 -930 331 -98 763 -100 2025 -418 353 -446 385 -414 385 -416 387 -448 355 -442 383 -412 397 -424 405 -388 409 -418 379 -418 415 -4014 443 -814 413 -822 817 -454 801 -436 409 -842 409 -866 415 -838 441 -836 811 -432 387 -842 419 -846 793 -440 807 -448 837 -446 803 -448 835 -420 807 -448 383 -868 379 -850 409 -866 387 -844 825 -468 381 -884 793 -426 415 -842 427 -818 817 -440 407 -830 419 -844 429 -852 387 -872 409 -826 811 -450 813 -418 837 -412 409 -864 417 -844 397 -852 809 -454 805 -448 409 -840 809 -420 813 -458 409 -844 407 -860 385 -878 793 -470 809 -420 817 -416 417 -850 403 -852 381 -852 827 -428 447 -844 401 -854 813 -424 421 -840 419 -812 823 -438 415 -846 409 -844 415 -846 389 -868 809 -458 803 -416 409 -866 813 -418 417 -854 397 -862 419 -842 401 -854 415 -16404 435 -376 409 -410 407 -384 439 -384 409 -410 417 -368 421 -410 407 -378 447 -376 415 -378 447 -380 407 -4022 421 -844 423 -822 821 -418 807 -454 429 -820 421 -836 439 -854 421 -810 821 -436 385 -840 441 -822 813 -448 811 -452 803 -444 835 -444 801 -446 801 -426 447 -808 423 -834 413 -852 407 -840 819 -452 389 -856 813 -444 409 -848 415 -812 809 -458 409 -848 411 -842 415 -844 421 -834 415 -834 835 -418 819 -418 807 -456 393 -856 393 -866 421 -846 799 -474 809 -420 421 -836 811 -420 813 -458 407 -850 413 -842 415 -846 819 -428 835 -416 835 -412 407 -832 421 -842 423 -822 813 -446 407 -864 419 -846 799 -440 413 -850 419 -816 797 -442 413 -850 409 -844 417 -846 423 -834 841 -428 805 -414 435 -822 813 -450 413 -822 437 -818 421 -844 429 -854 411 -16406 427 -418 309 -522 307 -488 303 -520 289 -530 295 -500 323 -470 325 -504 321 -476 321 -476 355 -444 357 -4080 355 -906 339 -882 771 -476 777 -486 381 -874 383 -884 375 -884 387 -852 819 -418 417 -846 399 -854 809 -418 815 -446 837 -420 839 -454 801 -436 807 -452 399 -826 417 -844 391 -852 423 -838 809 -452 431 -852 811 -414 409 -836 417 -844 821 -432 385 -876 385 -850 409 -848 415 -854 421 -840 817 -420 815 -424 817 -448 409 -848 413 -844 389 -854 815 -446 829 -426 413 -842 819 -434 809 -446 409 -838 419 -846 401 -852 811 -456 811 -444 803 -418 417 -848 403 -850 381 -864 805 -450 395 -866 419 -848 801 -474 381 -848 411 RAW_Data: -842 807 -446 381 -872 377 -866 421 -846 401 -854 813 -458 779 -446 407 -832 811 -450 415 -856 399 -856 385 -876 399 -854 411 -16398 435 -392 395 -400 421 -412 385 -412 417 -384 415 -386 415 -418 385 -420 385 -420 417 -390 417 -388 419 -4020 421 -838 421 -812 819 -434 809 -448 397 -864 421 -844 401 -850 413 -858 789 -426 413 -844 419 -836 807 -424 843 -410 829 -442 835 -446 801 -454 809 -420 417 -832 411 -848 249 -88020 133 -896 231 -466 67 -1062 131 -728 163 -98 621 -98 1051 -100 680933 -452 269 -522 273 -554 273 -558 239 -558 271 -490 337 -488 321 -498 295 -500 325 -470 323 -474 353 -4082 757 -492 375 -880 357 -872 777 -486 773 -480 807 -450 805 -444 805 -476 407 -812 413 -834 411 -848 407 -828 813 -450 811 -458 803 -448 835 -446 791 -424 447 -808 427 -818 423 -840 419 -848 401 -854 811 -458 809 -446 801 -416 439 -826 415 -848 813 -430 809 -450 395 -866 419 -846 403 -850 413 -820 407 -848 415 -846 781 -460 805 -446 803 -474 803 -448 835 -420 805 -454 389 -836 409 -842 407 -866 419 -842 399 -854 809 -456 809 -446 409 -840 385 -844 819 -434 809 -450 395 -860 811 -452 393 -886 779 -446 409 -830 419 -842 423 -818 423 -838 419 -844 799 -472 809 -454 385 -844 807 -454 391 -854 395 -860 385 -844 429 -852 809 -454 385 -874 409 -16402 427 -368 455 -358 433 -380 443 -378 415 -378 447 -380 411 -384 409 -406 421 -408 387 -412 415 -386 415 -4026 831 -398 441 -810 417 -832 837 -418 833 -444 803 -446 833 -448 801 -424 449 -810 427 -820 423 -838 419 -812 825 -438 841 -416 845 -446 825 -418 809 -422 419 -822 433 -822 419 -844 425 -820 421 -840 841 -458 797 -436 809 -414 435 -822 419 -844 819 -432 809 -448 395 -864 421 -846 407 -850 411 -808 433 -824 419 -844 819 -432 809 -446 823 -416 837 -454 807 -440 809 -414 435 -828 417 -844 425 -828 415 -848 419 -818 839 -446 807 -422 411 -844 419 -846 795 -438 807 -450 395 -866 811 -454 391 -854 845 -412 407 -832 421 -842 419 -832 411 -824 435 -820 815 -450 811 -460 409 -850 799 -454 407 -824 413 -848 411 -842 415 -844 815 -432 415 -848 405 -16400 441 -432 327 -492 301 -516 307 -484 309 -520 307 -492 339 -454 337 -490 331 -464 327 -500 325 -472 325 -4110 763 -480 373 -852 385 -878 759 -482 775 -474 813 -458 781 -482 789 -454 415 -846 397 -820 411 -840 405 -852 809 -450 811 -458 809 -450 817 -448 803 -426 411 -844 391 -854 393 -866 419 -848 399 -854 811 RAW_Data: -454 811 -444 803 -418 417 -846 403 -850 809 -452 805 -444 411 -840 419 -846 407 -850 415 -836 385 -842 419 -850 797 -438 807 -452 817 -446 801 -486 813 -444 775 -450 409 -838 419 -810 431 -854 379 -848 405 -884 809 -450 817 -430 385 -874 375 -856 811 -446 809 -422 421 -836 835 -452 419 -848 783 -460 409 -814 407 -856 415 -846 383 -870 381 -848 819 -450 811 -472 383 -850 803 -454 415 -838 399 -854 379 -850 407 -848 811 -448 415 -872 387 -16400 451 -374 445 -374 415 -378 415 -412 411 -384 405 -422 409 -410 387 -410 417 -382 417 -384 415 -420 383 -4030 827 -428 411 -842 425 -820 817 -418 833 -426 845 -452 815 -428 837 -416 409 -842 421 -810 431 -820 421 -89106 265 -662 99 -532 131 -598 97 -668 65 -300 761 -198 231 -132 265 -100 233 -100 197 RAW_Data: 7855 -12784 1413 -1544 469 -1040 465 -1010 479 -1020 967 -548 445 -1046 973 -524 967 -520 981 -516 483 -1042 449 -1034 949 -528 495 -1008 479 -1016 985 -518 453 -1042 449 -1052 949 -514 483 -1012 985 -512 477 -1042 445 -1050 951 -548 971 -512 975 -520 967 -554 949 -548 451 -1040 967 -520 987 -518 455 -1038 475 -1016 977 -518 983 -514 473 -1018 975 -518 487 -1002 475 -1020 965 -516 477 -1012 1007 -522 445 -1034 491 -1008 973 -524 RAW_Data: 481 -992 481 -1010 483 -1030 977 -520 487 -1008 973 -522 987 -518 983 -514 965 -522 987 -520 489 -1004 473 -1018 471 -1016 1005 -476 511 -1012 457 -1018 1001 -510 975 -520 471 -1022 483 -1016 969 -536 1003 -454 981 -480 479 -986 981 -486 479 -946 989 -492 973 -484 473 -976 1503 -23606 1433 -1542 493 -1006 473 -1032 441 -1048 971 -514 483 -1012 985 -518 479 -1014 481 -1012 457 -1050 443 -1044 977 -520 473 -1004 495 -1004 969 -556 453 -1036 451 -1038 973 -520 485 -994 981 -520 457 -1050 477 -1014 977 -494 985 -538 961 -512 1005 -518 951 -526 491 -1006 969 -520 985 -524 455 -1044 447 -1048 983 -518 983 -514 441 -1050 981 -518 453 -1042 447 -1050 981 -518 451 -1046 975 -520 451 -1022 483 -1008 1001 -522 447 -1020 485 -1008 473 -1016 981 -550 449 -1044 977 -520 949 -550 979 -516 967 -520 983 -522 455 -1042 447 -1050 451 -1024 981 -520 483 -1018 963 -546 479 -1010 967 -520 483 -1022 975 -522 967 -552 487 -960 481 -990 451 -994 481 -980 479 -986 449 -984 969 -480 983 -510 1465 -23612 1473 -1520 479 -1026 453 -1044 451 -1036 943 -552 453 -1044 949 -518 481 -1018 977 -524 459 -1046 439 -1046 973 -528 463 -1012 471 -1046 943 -552 443 -1034 457 -1042 977 -518 479 -1028 949 -554 451 -1014 481 -1018 981 -524 985 -518 971 -514 979 -522 987 -512 477 -1016 977 -522 969 -552 449 -1016 483 -1014 985 -518 973 -516 481 -1012 967 -552 449 -1020 483 -1010 969 -554 447 -1022 977 -520 475 -1018 479 -1018 975 -522 457 -1036 479 -1016 479 -1002 969 -552 447 -1054 943 -548 969 -520 983 -520 983 -516 969 -518 479 -1030 453 -1044 449 -1048 943 -548 451 -1044 945 -552 975 -518 947 -552 449 -1034 975 -524 455 -1040 969 -520 449 -982 969 -518 945 -484 481 -984 481 -994 447 -986 477 -998 1435 -23658 1441 -1530 483 -1008 483 -1034 449 -1022 977 -520 485 -1018 479 -1018 975 -506 473 -1036 469 -1042 463 -1010 977 -520 487 -1030 451 -1010 981 -520 481 -1018 481 -1014 983 -518 479 -1016 975 -492 497 -1014 467 -1014 977 -520 975 -526 985 -516 979 -506 1005 -496 493 -1008 975 -522 983 -518 453 -1040 475 -1016 975 -524 987 -514 471 -1038 955 -514 473 -1046 445 -1044 967 -514 477 -1016 975 -520 457 -1050 477 -1010 973 -522 473 -1000 479 -1030 453 -1038 969 -506 473 -1050 971 -512 979 -524 955 -548 973 -512 975 -518 475 -1036 473 -1006 493 -1008 975 -520 973 -526 487 -1004 475 -1018 965 -516 1005 -512 481 -1014 985 -518 483 -986 975 -488 977 -480 977 -486 975 -482 481 -982 975 -480 977 -488 1477 -23618 1389 -1634 369 -1114 383 -1078 431 -1072 RAW_Data: 931 -550 451 -1046 447 -1042 967 -552 945 -522 459 -1042 445 -1050 943 -552 439 -1036 459 -1046 977 -508 477 -1030 455 -1044 945 -552 451 -1020 979 -524 459 -1046 443 -1048 979 -518 967 -534 957 -516 977 -518 973 -528 455 -1042 973 -520 975 -526 459 -1040 481 -1020 969 -510 967 -546 447 -1050 955 -544 441 -1044 449 -1048 953 -550 443 -1046 975 -518 485 -1010 455 -1044 943 -554 447 -1054 449 -1010 475 -1048 943 -550 453 -1040 969 -520 973 -522 985 -514 969 -554 949 -524 459 -1040 477 -1014 483 -1034 947 -520 981 -554 447 -1016 977 -524 983 -516 973 -516 483 -1016 455 -1046 973 -484 977 -518 449 -986 447 -1016 971 -482 449 -1018 443 -1014 449 -984 1461 -129764 65 -3200 133 -464 133 -298 429 -132 265 -98 231 -134 265 -164 3439 -132 727 -132 199 -2058 133 -1644 361 -166 65 -492 165 -264 591 -428 197 -198 201 -98 831 -68 2313 -100 5839 -10922 65 -1320 425 -262 297 -428 97 -362 2463 -98 1025 -66 5263 -5030 99 -6924 461 -1092 133 -98 333 -166 2739 -132 3131 -66 10535 -2008 131 -434 297 -1058 65 -132 99 -198 529 -198 97 -526 97 -66 493 -664 99 -232 2613 -132 5371 -11166 229 -198 163 -394 199 -398 365 -132 99 -166 2121 -100 1195 -68 1821 -100 10635 -468 67 -1256 65 -2144 229 -100 163 -394 593 -98 67 -166 1677 -66 791 -66 335 -98 11033 -566 65 -1460 165 -1520 497 -1254 491 -564 99 -330 99 -232 1227 -132 2973 -66 3661 -11964 131 -132 99 -398 131 -328 97 -232 363 -396 1379 -98 99 -166 1591 -66 12171 -4136 65 -298 265 -298 199 -462 99 -330 65 -166 163 -66 1591 -66 165 -166 12079 -1002 65 -366 465 -530 97 -134 561 -66 497 -494 99 -64 131 -134 1095 -66 6537 -5066 65 -5458 397 -724 165 -466 131 -166 14293 -436 65 -1590 65 -1462 459 -332 65 -396 563 -794 197 -300 1255 -12100 99 -130 495 -166 97 -296 97 -658 757 -98 959 -66 1029 -1346 165 -2620 395 -494 197 -166 163 -198 65 -98 195 -394 821 -98 3063 -100 4469 -12120 497 -166 65 -462 195 -164 295 -66 4361 -100 1755 -100 131 -66 9415 -3840 99 -530 197 -364 463 -330 365 -332 133 -100 165 -166 2113 -100 1461 -132 4175 -3772 97 -7124 231 -1258 165 -100 429 -1326 995 -200 1755 -66 1519 -100 6437 -7198 133 -300 527 -398 165 -232 131 -166 67 -164 16443 -3270 131 -658 131 -726 97 -858 97 -300 331 -100 629 -10288 67 -164 133 -1458 297 -364 65 -98 163 -758 1189 -66 199 -68 1791 -66 897 -132 165 -3410 163 -364 99 -98 99 -66 365 -232 789 -494 65 -328 629 -66 1259 -66 365 -11422 7923 -12864 1405 -1562 RAW_Data: 451 -1040 441 -1052 449 -1050 945 -554 449 -1052 451 -1020 481 -1010 473 -1050 449 -1052 451 -1040 969 -520 977 -520 455 -1042 977 -522 447 -1056 947 -518 979 -546 447 -1052 451 -1040 441 -1048 983 -518 455 -1044 449 -1018 979 -548 947 -554 449 -1032 481 -992 483 -1012 985 -514 999 -512 479 -1012 485 -1014 961 -544 477 -1010 965 -522 981 -512 483 -1012 487 -1020 477 -1014 479 -1016 459 -1014 471 -1012 1003 -492 997 -522 483 -1016 979 -522 985 -520 975 -512 975 -520 999 -488 985 -514 481 -1006 1001 -522 483 -990 483 -1008 483 -1020 977 -516 975 -518 999 -524 451 -1018 1009 -482 999 -506 983 -524 487 -1004 473 -980 501 -952 517 -940 497 -982 489 -974 987 -452 495 -974 487 -954 1485 -23662 1457 -1556 445 -1026 483 -1010 475 -1016 975 -518 483 -1014 487 -1034 447 -1022 977 -522 457 -1046 475 -1018 975 -524 985 -518 477 -1016 977 -524 459 -1048 969 -514 977 -522 457 -1038 479 -1018 481 -1002 1001 -520 447 -1054 449 -1008 1001 -520 977 -520 451 -1040 475 -1014 479 -1028 949 -518 983 -542 447 -1058 449 -1044 947 -552 447 -1024 977 -520 967 -542 479 -1024 451 -1040 441 -1050 451 -1028 481 -1014 483 -1010 965 -548 973 -518 485 -1010 981 -516 967 -520 983 -524 981 -514 969 -538 967 -518 481 -1016 973 -524 485 -1016 465 -1012 479 -1020 983 -532 959 -514 975 -554 949 -526 985 -512 969 -554 967 -534 461 -1042 443 -1014 967 -478 455 -1006 969 -486 967 -480 983 -486 969 -514 451 -982 1461 -23692 563 -4014 291 -1220 263 -1228 829 -620 883 -626 851 -608 903 -622 387 -1082 391 -1102 409 -1084 913 -588 941 -548 443 -1056 945 -522 445 -1046 971 -552 977 -516 441 -1048 481 -992 483 -1010 979 -554 451 -1018 481 -1014 983 -518 977 -514 479 -1040 447 -1034 485 -996 975 -520 979 -520 483 -1016 481 -1008 999 -506 471 -1050 971 -514 975 -520 473 -1000 483 -1020 481 -1008 473 -1018 481 -1020 481 -1008 967 -554 945 -518 481 -1038 967 -520 985 -520 981 -514 967 -520 985 -520 981 -508 479 -1016 1003 -518 479 -1010 479 -1010 473 -1018 975 -516 979 -520 983 -520 975 -514 977 -518 999 -520 979 -518 451 -1040 479 -986 479 -962 1007 -486 451 -986 975 -486 977 -482 483 -980 477 -982 1473 -23656 1453 -1548 447 -1016 485 -1012 491 -1012 973 -520 981 -526 983 -514 971 -554 947 -526 491 -1008 475 -1020 983 -498 989 -516 483 -1014 977 -524 453 -1044 979 -518 979 -520 453 -1042 449 -1048 447 -1022 975 -518 475 -1050 447 -1020 977 -522 983 -518 481 -1016 481 -1012 473 -1002 973 -550 945 -552 449 -1050 447 -1020 975 -522 487 -1034 973 -520 RAW_Data: 979 -514 443 -1046 479 -1028 451 -1042 451 -1048 447 -1022 485 -1014 983 -520 973 -516 483 -1012 983 -518 973 -516 977 -520 1003 -520 975 -520 981 -514 475 -1034 969 -516 479 -1016 447 -1046 475 -1018 975 -516 975 -522 983 -510 469 -1010 1007 -518 951 -530 989 -516 973 -556 951 -494 481 -978 487 -978 975 -460 1005 -466 979 -486 969 -508 981 -450 1489 -23666 571 -4036 269 -1224 257 -1250 787 -642 867 -622 883 -622 359 -1136 373 -1086 421 -1080 417 -1074 935 -550 947 -552 445 -1048 939 -552 451 -1046 947 -552 947 -550 451 -1040 443 -1048 453 -1024 977 -522 471 -1034 449 -1020 973 -540 975 -508 479 -1032 453 -1042 449 -1050 977 -518 979 -518 449 -1018 481 -1018 975 -518 473 -1034 963 -542 961 -544 447 -1044 473 -1020 479 -1014 481 -1010 473 -1032 471 -1010 959 -546 973 -492 499 -1006 997 -510 977 -524 953 -552 971 -512 973 -508 979 -554 451 -1016 977 -518 471 -1038 485 -1010 457 -1036 969 -506 999 -520 481 -1014 975 -522 967 -520 975 -548 451 -1038 475 -1022 965 -518 463 -978 985 -486 465 -978 457 -1016 463 -978 985 -486 963 -480 1477 -129906 495 -726 197 -328 295 -132 2547 -66 233 -98 11033 -1856 233 -1458 65 -198 165 -134 199 -168 101 -694 463 -530 165 -300 99 -232 2479 -98 1745 -98 3029 -132 163 -1460 65 -500 65 -400 99 -664 895 -398 65 -564 331 -166 97 -66 197 -98 3813 -98 10097 -3848 165 -232 67 -266 397 -596 165 -66 199 -166 99 -66 199 -398 165 -166 1721 -232 429 -166 133 -330 133 -698 493 -200 197 -428 11029 -12118 65 -198 199 -68 231 -230 101 -166 99 -664 131 -132 3163 -4238 331 -298 531 -398 299 -98 199 -166 563 -100 131 -98 893 -66 3141 -1556 133 -1722 131 -830 197 -262 195 -66 163 -462 195 -396 195 -134 499 -132 265 -66 1717 -166 3175 -11366 199 -164 131 -66 163 -98 525 -98 363 -264 4495 -100 229 -66 131 -66 593 -3002 97 -394 131 -426 99 -462 597 -692 295 -298 431 -230 4231 -66 9711 -3246 131 -100 99 -400 263 -498 65 -100 297 -98 99 -132 65 -862 131 -66 365 -396 99 -166 1991 -98 1611 -132 10333 -790 65 -1984 99 -896 165 -332 365 -232 131 -830 65 -66 397 -166 197 -66 65 -496 199 -100 9975 -1728 67 -5008 727 -98 131 -100 2873 -66 12011 -3150 67 -960 99 -234 99 -298 231 -232 195 -266 165 -296 261 -166 757 -66 629 -196 657 -100 197 -134 297 -364 11237 -1684 65 -2076 165 -462 491 -100 663 -630 329 -264 263 -100 1357 -66 461 -1676 99 -1782 295 -296 65 -296 163 -230 99 -132 295 -66 163 -362 197 -724 757 -66 RAW_Data: 3785 -66 13551 -1808 97 -730 65 -100 231 -132 131 -1230 593 -232 1579 -66 2667 -200 101 -3480 165 -692 133 -396 427 -1524 363 -66 431 -132 10305 -8288 461 -628 67 -430 725 -66 1053 -66 4501 -230 165 -66 331 -66 355 -266 263 -132 63 -562 459 -462 197 -66 129 -132 65 -100 2643 -132 2107 -66 9651 -3692 99 -100 195 -294 97 -660 759 -328 165 -560 891 -66 1953 -66 11305 -362 263 -662 131 -432 65 -134 563 -430 131 -132 1819 -100 165 -166 1061 -98 10089 -2476 65 -854 395 -198 99 -492 131 -164 229 -466 199 -428 299 -100 927 -200 1557 -134 4269 -10464 133 -1624 65 -198 265 -398 131 -430 729 -134 6189 -66 5421 -2082 165 -3342 19967 -12808 1439 -1536 453 -1046 449 -1032 449 -1056 947 -552 977 -522 977 -518 453 -1038 977 -522 977 -520 457 -1038 977 -506 1005 -496 495 -1008 975 -538 973 -530 465 -1008 975 -554 453 -1036 947 -518 487 -1008 475 -1042 443 -1050 461 -1008 1005 -510 447 -1048 985 -510 469 -1006 1005 -494 997 -514 975 -514 975 -504 999 -506 479 -1034 491 -1010 975 -508 973 -524 491 -1004 473 -1018 997 -520 975 -512 975 -518 473 -1030 983 -516 981 -514 471 -998 997 -522 481 -1012 481 -1012 457 -1050 973 -512 977 -524 459 -1016 1003 -512 479 -1014 459 -1016 475 -1012 1007 -522 969 -502 495 -1008 477 -1030 965 -522 975 -514 479 -1000 471 -1062 471 -964 483 -982 471 -1000 471 -980 979 -448 503 -988 465 -976 487 -974 1459 -23696 1407 -1616 401 -1068 429 -1080 419 -1058 935 -566 923 -584 417 -1078 939 -524 457 -1042 973 -550 443 -1028 949 -554 945 -552 447 -1022 979 -518 971 -542 479 -1024 947 -550 441 -1048 979 -518 453 -1044 449 -1050 449 -1020 485 -1014 981 -518 479 -1014 975 -524 459 -1036 973 -516 979 -518 971 -552 945 -550 945 -552 449 -1030 479 -1026 947 -554 949 -552 449 -1018 479 -1008 981 -518 975 -548 945 -554 451 -1034 967 -514 997 -514 445 -1036 967 -554 447 -1022 485 -1010 475 -1016 975 -518 977 -520 487 -1014 973 -552 451 -1040 441 -1050 447 -1022 485 -1014 987 -516 479 -1014 483 -1014 459 -1046 969 -514 449 -1044 967 -546 973 -488 447 -1016 443 -1000 973 -490 475 -980 983 -482 441 -1016 465 -976 1475 -23652 1451 -1548 479 -1014 461 -1014 471 -1044 975 -520 971 -502 495 -1012 977 -506 1005 -498 989 -516 481 -1016 975 -520 981 -514 475 -1014 979 -522 983 -512 475 -1022 965 -514 471 -1046 973 -494 473 -1016 475 -1046 447 -1050 463 -1012 999 -512 481 -1012 983 -520 477 -1014 977 -524 955 -548 973 -512 975 -520 967 -556 449 -1020 483 -1012 983 -520 973 -516 481 -1008 473 -1034 RAW_Data: 967 -538 963 -544 973 -522 471 -1006 989 -512 1007 -520 443 -1036 985 -516 449 -1048 451 -1022 483 -1012 983 -520 977 -514 481 -1012 979 -514 483 -1022 481 -1010 471 -1020 479 -1020 979 -524 457 -1048 973 -514 483 -1012 981 -520 483 -1018 481 -1014 485 -986 467 -980 981 -486 469 -978 457 -1004 963 -480 983 -486 971 -514 1441 -23704 1383 -1628 389 -1112 385 -1092 407 -1092 915 -552 941 -570 441 -1064 423 -1046 451 -1044 939 -556 455 -1048 945 -552 973 -522 453 -1046 945 -552 947 -550 451 -1040 969 -518 479 -1028 951 -552 451 -1018 479 -1018 483 -1014 459 -1044 971 -514 483 -1010 971 -544 447 -1020 977 -524 987 -518 973 -516 979 -524 985 -518 479 -1016 447 -1050 953 -548 971 -514 483 -1014 459 -1048 967 -514 977 -526 953 -548 443 -1046 975 -492 995 -512 471 -1050 943 -552 445 -1032 455 -1044 449 -1048 941 -550 945 -552 449 -1050 945 -552 451 -1044 449 -1018 479 -1016 479 -1002 969 -542 973 -522 455 -1040 477 -1022 967 -534 959 -514 975 -554 469 -1008 449 -980 469 -1008 943 -484 1001 -484 467 -980 983 -482 961 -514 1439 -23700 1469 -1510 495 -1008 473 -1036 463 -1012 969 -546 973 -522 473 -1018 479 -1014 975 -526 955 -516 475 -1046 975 -490 999 -518 481 -1014 975 -520 967 -514 481 -1022 979 -524 457 -1048 971 -514 481 -1010 485 -1020 477 -1014 479 -1000 1001 -522 451 -1020 977 -520 473 -1032 967 -538 959 -514 1005 -522 965 -504 989 -514 475 -1046 441 -1050 971 -514 975 -520 473 -1018 481 -1014 979 -520 983 -520 977 -516 485 -1010 979 -544 975 -518 453 -1042 981 -520 453 -1024 483 -1010 457 -1050 975 -512 975 -524 459 -1048 973 -514 481 -1010 473 -1016 479 -1016 477 -1036 967 -506 995 -512 965 -546 445 -1048 957 -516 1005 -512 445 -1046 979 -486 473 -980 979 -486 473 -980 981 -486 473 -980 485 -986 467 -976 1477 -142204 197 -1486 165 -198 165 -664 295 -232 99 -266 231 -166 3045 -100 13411 -3670 197 -498 131 -166 231 -198 165 -66 265 -134 129 -1062 431 -130 465 -134 13447 -3848 329 -100 163 -298 99 -164 463 -98 197 -98 131 -198 65 -296 493 -264 789 -66 7225 -12438 99 -164 463 -132 197 -630 65 -198 2487 -66 165 -100 10097 -6554 459 -664 297 -460 4925 -132 6063 -12078 497 -98 99 -200 97 -234 165 -298 1721 -134 265 -100 3035 -100 12081 -3674 231 -100 97 -200 97 -264 461 -100 99 -132 231 -100 97 -430 527 -200 231 -64 2081 -132 327 -100 529 -66 831 -66 3067 -4704 99 -5520 97 -496 67 -198 167 -498 693 -462 2341 -15926 65 -1392 659 -134 131 -298 165 -66 99 -298 4777 -4208 429 -66 RAW_Data: 377 -386 1117 -410 1121 -352 1141 -384 1151 -378 1119 -350 1139 -386 1115 -1134 389 -1114 395 -1122 363 -1136 389 -358 1167 -356 1145 -1120 389 -1110 391 -356 1139 -1126 389 -1114 391 -1122 363 -1146 389 -1110 395 -1122 363 -1138 389 -1110 393 -1122 363 -1140 389 -1112 393 -1120 389 -1118 389 -1112 397 -1124 363 -1142 389 -1112 359 -1154 367 -1134 389 -1144 365 -1138 355 -394 1119 -380 1107 -1152 353 -398 1113 -384 1139 -1118 385 -376 1141 -386 1129 -350 1143 -388 1109 -1132 389 -1112 393 -390 1107 -1128 389 -1112 397 -388 1111 -1132 389 -358 1127 -1118 417 -1116 383 -1120 353 -1158 389 -1108 375 -384 1121 -408 1123 -350 1139 -386 1111 -1130 389 -1114 395 -1122 395 -1114 389 -1116 395 -1122 363 -1138 387 -9444 373 -374 379 -374 381 -346 403 -346 389 -376 389 -390 353 -376 359 -382 383 -360 419 -360 359 -386 359 -2264 777 -356 1127 -390 1143 -362 1131 -1138 365 -1122 359 -386 1153 -1106 377 -1152 385 -372 1113 -1140 385 -1118 381 -1114 383 -1150 383 -1120 355 -1122 389 -358 1165 -386 1113 -1128 389 -360 1125 -384 1131 -368 1157 -350 1139 -386 1115 -406 1099 -384 1141 -1122 383 -1110 373 -1130 385 -1128 393 -380 1131 -380 1129 -1112 383 -1132 391 -356 1143 -1124 383 -1130 367 -1136 385 -1136 387 -1112 371 -1120 389 -1118 383 -1130 371 -1130 383 -1110 383 -1120 413 -1118 383 -1144 347 -1144 389 -1110 393 -1122 363 -1140 389 -1112 359 -1154 363 -1146 389 -1110 393 -374 1115 -384 1115 -1144 385 -368 1141 -388 1111 -1110 421 -360 1125 -388 1109 -392 1137 -358 1125 -1144 365 -1138 389 -358 1123 -1118 401 -1138 389 -360 1121 -1120 417 -358 1109 -1154 355 -1120 375 -1138 385 -1130 391 -1136 355 -398 1115 -380 1141 -384 1121 -382 1119 -1104 413 -1118 355 -1156 387 -1112 377 -1122 389 -1118 387 -1112 397 -9422 417 -352 363 -416 355 -388 345 -382 377 -380 375 -380 375 -380 375 -380 385 -356 379 -366 385 -374 387 -2246 745 -380 1141 -386 1113 -370 1125 -1140 373 -1152 355 -394 1117 -1140 381 -1120 385 -374 1145 -1112 385 -1122 381 -1116 383 -1120 375 -1120 389 -1120 373 -380 1171 -358 1121 -1142 377 -356 1127 -384 1137 -378 1155 -390 1105 -366 1125 -386 1135 -386 1111 -1132 389 -1112 393 -1120 365 -1138 387 -360 1163 -356 1143 -1126 387 -1114 357 -386 1141 -1126 383 -1130 365 -1132 381 -1140 377 -1116 383 -1130 371 -1128 381 -1140 347 -1148 385 -1128 369 -1128 381 -1142 377 -1114 389 -1112 395 -1124 361 -1142 389 -1114 393 -1122 365 -1138 389 -1114 397 -1108 389 -392 1119 -350 1139 -1152 355 -396 1115 -382 1109 -1156 385 -374 1111 -384 1139 -368 1147 -388 1109 -1112 389 -1120 383 -388 1107 -1150 389 -1112 RAW_Data: 393 -390 1109 -1128 389 -360 1125 -1120 381 -1152 383 -1118 353 -1158 387 -1112 375 -386 1117 -408 1121 -350 1143 -388 1109 -1132 389 -1114 391 -1122 395 -1120 389 -1112 393 -1122 365 -1136 389 -9442 373 -376 389 -354 377 -366 387 -384 357 -378 361 -418 347 -394 385 -358 363 -382 361 -414 357 -392 333 -2290 751 -384 1113 -406 1121 -350 1137 -1136 353 -1160 385 -356 1135 -1120 361 -1146 385 -388 1137 -1108 361 -1150 387 -1112 395 -1136 349 -1154 353 -1142 371 -384 1145 -378 1117 -1138 381 -382 1087 -410 1121 -382 1143 -380 1121 -380 1115 -384 1107 -418 1115 -1106 385 -1148 365 -1118 359 -1146 387 -388 1135 -388 1113 -1126 383 -1130 367 -376 1113 -1142 383 -1114 375 -1154 355 -1160 385 -1110 371 -1152 357 -1118 385 -1146 365 -1122 361 -1146 387 -1114 395 -1134 355 -1160 351 -1146 369 -1154 355 -1120 387 -1114 397 -1136 357 -1118 407 -1144 351 -1134 359 -420 1111 -366 1131 -1142 379 -384 1089 -410 1119 -1142 379 -366 1141 -386 1109 -388 1131 -350 1141 -1118 391 -1114 375 -378 1153 -1116 385 -1136 383 -358 1139 -1120 359 -420 1099 -1142 383 -1118 383 -1138 347 -1144 385 -1144 369 -386 1113 -404 1089 -386 1141 -382 1099 -1136 381 -1128 375 -1130 383 -1140 359 -1146 387 -1114 395 -1138 357 -9430 383 -378 359 -418 347 -392 387 -360 363 -384 361 -414 357 -386 347 -384 375 -382 385 -358 383 -364 387 -2252 773 -354 1131 -384 1137 -386 1111 -1132 387 -1112 397 -388 1113 -1124 389 -1116 387 -388 1115 -1132 389 -1114 393 -1120 365 -1140 389 -1114 357 -1154 365 -378 1151 -358 1127 -1156 367 -376 1135 -358 1125 -388 1141 -368 1125 -386 1133 -388 1109 -370 1155 -1106 375 -1122 389 -1118 389 -1114 395 -386 1117 -410 1123 -1106 377 -1130 383 -388 1107 -1152 353 -1148 353 -1150 367 -1142 389 -1110 397 -1120 365 -1138 389 -1110 391 -1122 363 -1142 387 -1116 389 -1120 391 -1116 389 -1116 395 -1122 365 -1140 389 -1114 357 -1154 363 -1138 389 -1142 365 -1138 355 -396 1115 -382 1141 -1118 353 -400 1111 -384 1139 -1120 381 -386 1139 -366 1119 -392 1121 -388 1107 -1152 389 -1114 355 -388 1139 -1126 387 -1114 397 -376 1111 -1144 375 -380 1129 -1138 375 -1098 385 -1140 377 -1118 387 -1144 371 -386 1115 -404 1121 -348 1137 -386 1113 -1134 389 -1112 395 -1124 395 -1118 389 -1110 395 -1122 363 -1138 389 -9418 391 -360 407 -384 361 -388 355 -390 367 -376 373 -380 387 -356 377 -366 385 -388 355 -378 359 -384 377 -2266 777 -346 1149 -388 1107 -390 1129 -1104 415 -1118 353 -398 1113 -1138 383 -1122 381 -388 1141 -1118 389 -1112 357 -1154 365 -1138 389 -1114 357 -1154 363 -378 1155 -358 1123 -1156 381 -360 1107 -384 RAW_Data: 1153 -378 1119 -382 1143 -382 1121 -382 1117 -382 1113 -1120 389 -1120 387 -1112 399 -1120 393 -392 1119 -350 1141 -1154 357 -1116 389 -360 1163 -1120 365 -1138 387 -1114 389 -1122 389 -1116 387 -1114 397 -1104 379 -1156 353 -1148 367 -1118 377 -1122 423 -1110 373 -1122 389 -1118 383 -1130 373 -1128 383 -1140 345 -1146 383 -1130 399 -1130 353 -1142 377 -358 1127 -384 1143 -1118 385 -372 1111 -386 1137 -1120 381 -388 1141 -364 1127 -384 1133 -374 1111 -1148 383 -1114 373 -384 1115 -1136 387 -1144 371 -386 1115 -1132 387 -360 1123 -1150 345 -1148 383 -1128 371 -1132 381 -1140 379 -390 1123 -350 1139 -388 1113 -406 1089 -1142 373 -1120 389 -1118 423 -1110 371 -1120 379 -1122 407 -1104 417 -9440 389 -356 379 -366 385 -388 355 -378 359 -384 381 -394 387 -358 361 -386 359 -416 355 -388 345 -384 377 -2262 747 -384 1149 -380 1115 -382 1113 -1120 389 -1120 389 -360 1129 -1152 367 -1136 389 -358 1131 -1152 367 -1138 389 -1116 355 -1152 367 -1134 389 -1116 353 -388 1141 -368 1123 -1138 375 -386 1113 -408 1121 -350 1175 -372 1105 -386 1145 -352 1141 -366 1145 -1114 385 -1116 377 -1122 389 -1120 421 -354 1139 -388 1109 -1132 383 -1130 369 -374 1113 -1144 385 -1114 377 -1120 391 -1128 373 -1138 385 -1130 359 -1138 377 -1120 373 -1138 383 -1130 359 -1138 379 -1160 375 -1106 385 -1130 393 -1120 377 -1118 389 -1112 393 -1140 355 -1120 421 -1114 371 -1122 391 -390 1123 -350 1139 -1134 353 -402 1113 -384 1141 -1118 385 -376 1143 -352 1161 -352 1135 -386 1113 -1132 387 -1114 395 -388 1111 -1128 387 -1114 399 -374 1115 -1142 375 -380 1117 -1118 387 -1144 363 -1136 385 -1130 367 -1130 383 -388 1107 -392 1129 -380 1115 -384 1113 -1136 389 -1114 393 -1124 393 -1120 389 -1114 393 -1124 363 -1140 389 -9416 391 -360 405 -386 329 -416 357 -392 365 -374 377 -380 343 -412 341 -412 353 -390 375 -366 385 -386 355 -2264 743 -394 1123 -388 1111 -392 1133 -1110 395 -1120 363 -382 1133 -1142 381 -1118 383 -376 1111 -1146 383 -1122 383 -1146 347 -1150 381 -1116 353 -1158 343 -410 1133 -382 1111 -1152 355 -394 1119 -382 1109 -382 1153 -378 1131 -354 1137 -396 1119 -388 1111 -1150 351 -1152 351 -1150 365 -1136 387 -356 1131 -386 1143 -1122 387 -1112 357 -420 1107 -1128 387 -1114 359 -1152 363 -1148 387 -1114 395 -1122 361 -1140 387 -1110 395 -1120 361 -1140 387 -1114 393 -1154 355 -1120 387 -1146 365 -1118 361 -1146 387 -1112 395 -1120 363 -1140 385 -1144 367 -1120 359 -420 1099 -384 1139 -1118 383 -384 1109 -392 1129 -1138 379 -366 1147 -388 1109 -386 1099 -384 1139 -1132 349 -1158 375 -380 1131 -1104 411 -1122 351 -416 1111 -1148 RAW_Data: 353 -396 1121 -1142 347 -1150 381 -1116 355 -1156 375 -1144 387 -360 1119 -388 1107 -394 1131 -386 1101 -1152 363 -1138 387 -1112 391 -1152 357 -1116 375 -1136 383 -1122 383 -9448 357 -392 357 -398 363 -378 385 -358 383 -364 389 -386 357 -380 389 -386 347 -382 375 -384 375 -380 373 -2262 747 -376 1145 -390 1107 -386 1129 -1104 413 -1120 353 -396 1115 -1140 381 -1122 383 -376 1143 -1110 385 -1118 383 -1114 417 -1114 383 -1120 353 -1156 389 -356 1135 -386 1113 -1134 389 -358 1129 -390 1107 -392 1153 -358 1127 -388 1143 -362 1131 -356 1131 -1154 365 -1136 389 -1114 357 -1150 363 -386 1153 -358 1125 -1118 417 -1120 381 -350 1123 -1134 391 -1112 395 -1124 395 -1116 389 -1112 393 -1124 363 -1140 389 -1114 359 -1154 363 -1138 389 -1114 391 -1124 361 -1144 389 -1112 393 -1122 363 -1138 389 -1112 391 -1122 363 -1138 389 -1144 365 -1124 361 -382 1155 -350 1137 -1120 391 -386 1131 -350 1151 -1120 383 -378 1141 -352 1137 -394 1117 -390 1107 -1150 389 -1114 355 -388 1143 -1120 387 -1112 397 -388 1113 -1130 385 -344 1163 -1104 379 -1122 373 -1140 383 -1130 389 -1124 359 -386 1127 -386 1139 -368 1141 -390 1107 -1112 387 -1116 385 -1150 367 -1140 389 -1112 393 -1124 363 -1136 389 -9444 379 -340 417 -360 359 -386 359 -416 355 -386 347 -384 375 -382 375 -380 375 -378 375 -380 385 -356 379 -2278 745 -354 1151 -368 1141 -390 1105 -1114 387 -1116 385 -386 1141 -1120 389 -1114 389 -388 1113 -1130 389 -1112 393 -1124 363 -1138 389 -1112 389 -1122 363 -380 1159 -350 1137 -1122 391 -388 1097 -384 1139 -382 1125 -386 1145 -352 1141 -366 1145 -390 1107 -1110 387 -1150 353 -1150 367 -1138 387 -360 1125 -390 1109 -1152 389 -1112 357 -388 1141 -1122 389 -1110 391 -1122 395 -1112 389 -1110 397 -1120 363 -1144 389 -1114 391 -1122 365 -1138 389 -1116 389 -1142 355 -1120 389 -1112 397 -1122 363 -1140 389 -1110 393 -1130 349 -1140 405 -1134 389 -1112 357 -388 1141 -364 1129 -1142 367 -388 1111 -370 1131 -1140 383 -364 1149 -388 1109 -388 1137 -356 1127 -1118 383 -1120 413 -350 1121 -1132 407 -1140 355 -364 1149 -1112 371 -406 1129 -1104 409 -1098 383 -1116 417 -1118 381 -1118 385 -388 1111 -390 1129 -350 1137 -386 1113 -1138 389 -1114 395 -1122 393 -1120 389 -1112 393 -1124 363 -1138 389 -9444 379 -340 417 -360 359 -386 361 -414 357 -386 347 -384 375 -382 375 -380 375 -380 375 -378 373 -380 373 -2262 749 -386 1111 -408 1117 -348 1143 -1120 391 -1116 389 -358 1127 -1154 365 -1136 387 -360 1129 -1154 365 -1136 389 -1114 357 -1154 365 -1134 389 -1112 357 -390 1137 -406 1119 -1106 377 -386 1117 -406 1123 -350 1143 -384 RAW_Data: 1149 -378 1121 -350 1145 -380 1133 -1104 375 -1136 385 -1130 359 -1138 379 -400 1129 -354 1139 -1148 355 -1150 365 -378 1119 -1146 355 -1152 365 -1134 389 -1110 397 -1122 363 -1140 389 -1110 395 -1122 363 -1142 389 -1116 357 -1152 365 -1146 389 -1112 393 -1130 349 -1138 383 -1116 413 -1120 353 -1122 387 -1114 397 -1154 355 -1124 387 -360 1133 -384 1131 -1134 383 -376 1133 -352 1133 -1132 383 -376 1139 -378 1135 -380 1115 -382 1141 -1118 353 -1160 387 -356 1133 -1118 379 -1158 353 -392 1133 -1104 379 -398 1117 -1138 383 -1118 353 -1164 353 -1146 403 -1120 353 -398 1115 -382 1143 -384 1089 -412 1121 -1106 377 -1154 355 -1118 407 -1146 351 -1130 395 -1138 355 -1118 407 -9434 353 -396 363 -380 383 -360 383 -364 389 -386 357 -414 355 -386 345 -386 375 -382 375 -380 375 -378 375 -2256 769 -384 1119 -382 1117 -380 1113 -1122 389 -1118 389 -360 1131 -1140 377 -1118 421 -354 1139 -1140 355 -1118 405 -1104 387 -1128 391 -1122 363 -1138 387 -360 1157 -354 1143 -1128 387 -360 1121 -388 1141 -362 1129 -384 1139 -388 1111 -370 1127 -384 1135 -1122 363 -1140 389 -1116 393 -1122 395 -356 1129 -384 1141 -1120 383 -1134 387 -356 1133 -1130 349 -1140 383 -1116 413 -1118 381 -1110 377 -1146 389 -1114 391 -1124 365 -1138 391 -1112 357 -1150 365 -1144 387 -1112 395 -1122 361 -1140 387 -1112 393 -1104 379 -1158 353 -1144 403 -1118 353 -1158 353 -390 1133 -390 1107 -1130 389 -358 1125 -388 1111 -1154 389 -358 1129 -386 1131 -368 1129 -382 1139 -1118 353 -1164 387 -356 1135 -1120 393 -1118 389 -358 1131 -1154 365 -376 1135 -1108 395 -1136 347 -1126 387 -1144 403 -1120 353 -398 1115 -384 1141 -372 1103 -386 1145 -1108 387 -1120 383 -1116 403 -1140 389 -1116 353 -1146 361 -1144 389 -9420 393 -362 401 -338 377 -388 385 -374 361 -382 375 -382 375 -380 373 -380 373 -380 373 -380 389 -354 379 -2272 743 -388 1137 -360 1121 -386 1111 -1152 351 -1148 359 -384 1143 -1126 387 -1114 391 -384 1117 -1130 383 -1132 369 -1134 351 -1138 377 -1142 385 -1112 359 -420 1107 -406 1121 -1104 377 -384 1119 -406 1119 -352 1171 -382 1123 -378 1119 -384 1107 -384 1119 -1136 385 -1116 393 -1120 361 -1142 387 -388 1137 -386 1113 -1128 385 -1116 357 -420 1113 -1124 387 -1114 359 -1148 395 -1116 385 -1146 363 -1116 361 -1144 387 -1144 363 -1120 361 -1144 385 -1112 393 -1152 355 -1154 353 -1144 367 -1136 355 -1158 351 -1146 369 -1120 361 -1144 385 -1148 369 -1152 357 -392 1117 -380 1107 -1152 355 -398 1119 -382 1109 -1152 385 -374 1113 -386 1139 -366 1145 -388 1111 -1110 385 -1148 353 -386 1139 -1124 387 -1142 365 -386 1113 -1132 385 -360 1125 -1144 RAW_Data: 363 -1140 387 -1114 357 -1152 363 -1146 387 -358 1129 -386 1139 -366 1125 -384 1139 -1120 363 -1140 387 -1112 393 -1130 381 -1136 383 -1114 371 -1132 383 -116626 65 -934 133 -1954 131 -102 133 -136 97 -332 65 -430 299 -296 129 -100 265 -168 367 -100 65 -66 231 -336 9643 -7766 529 -68 467 -166 65 -134 99 -500 331 -132 65 -130 329 -98 497 -100 1195 -100 1959 -66 4163 -7346 97 -392 165 -194 97 -2978 433 -298 531 -298 65 -200 131 -132 261 -98 229 -68 12837 -340 99 -268 165 -134 65 -898 67 -100 265 -66 165 -100 597 -166 199 -298 199 -200 99 -132 233 -132 299 -132 233 -166 65 -66 4021 -168 133 -68 231 -168 4647 -130 1399 -7750 133 -1714 197 -2480 131 -200 65 -100 265 -890 63 -1152 197 -98 293 -134 65 -300 361 -100 1035 -100 231 -132 299 -100 3399 -66 6287 -4506 99 -100 65 -130 99 -196 461 -98 331 -164 97 -162 227 -64 197 -98 229 -130 195 -100 425 -526 165 -130 95 -522 457 -560 233 -98 261 -66 1155 -100 259 -130 1407 -98 553 -66 7793 -494 65 -232 65 -3652 229 -2716 361 -266 333 -200 133 -166 99 -132 267 -66 133 -132 199 -166 331 -132 331 -166 197 -950 229 -198 303 -298 365 -100 4839 -3816 165 -130 229 -696 131 -130 261 -262 97 -166 263 -894 165 -230 365 -566 129 -560 197 -324 99 -98 261 -134 131 -100 67 -334 67 -232 199 -132 165 -302 67 -100 1467 -98 459 -100 1081 -130 131 -66 8927 -232 165 -3104 99 -2812 65 -982 131 -98 195 -98 263 -264 231 -66 195 -132 193 -164 65 -100 365 -132 1629 -66 1009 -132 8383 -632 131 -3060 131 -492 425 -100 763 -166 371 -132 1197 -134 229 -694 461 -366 365 -98 329 -198 267 -168 399 -68 131 -332 493 -132 231 -132 569 -66 7765 -7568 99 -532 65 -634 133 -3540 65 -100 263 -592 261 -1484 299 -302 265 -234 1129 -304 99 -436 163 -360 97 -556 231 -166 265 -1164 165 -134 235 -100 163 -332 297 -100 197 -132 99 -566 133 -234 133 -328 295 -98 985 -98 163 -396 399 -134 1557 -134 297 -266 6875 -68 1759 -7194 133 -166 99 -266 65 -432 67 -432 393 -5086 99 -66 199 -68 263 -866 429 -100 359 -130 261 -132 267 -134 533 -134 9251 -4184 65 -1156 165 -198 65 -426 297 -492 67 -164 131 -198 259 -164 199 -100 733 -134 865 -100 397 -132 65 -100 197 -66 327 -164 227 -98 231 -132 97 -262 99 -130 229 -66 589 -96 1119 -98 1905 -7486 599 -66 561 -66 359 -98 757 -162 261 -66 323 -130 5573 -8538 99 -894 131 -594 229 -364 63 -1378 197 -1682 331 -100 199 -166 ================================================ FILE: applications/debug/unit_tests/test_runner.c ================================================ #include "test_runner.h" #include "tests/test_api.h" #include #include #include #include #include #include #include #include #include #include extern const ElfApiInterface* const unit_tests_api_interface; #define TAG "TestRunner" #define PLUGINS_PATH "/ext/apps_data/unit_tests/plugins" struct TestRunner { Storage* storage; Loader* loader; NotificationApp* notification; // Temporary used things PipeSide* pipe; FuriString* args; // ELF related stuff CompositeApiResolver* composite_resolver; // Report data int minunit_run; int minunit_assert; int minunit_fail; int minunit_status; }; TestRunner* test_runner_alloc(PipeSide* pipe, FuriString* args) { TestRunner* instance = malloc(sizeof(TestRunner)); instance->storage = furi_record_open(RECORD_STORAGE); instance->loader = furi_record_open(RECORD_LOADER); instance->notification = furi_record_open(RECORD_NOTIFICATION); instance->pipe = pipe; instance->args = args; instance->composite_resolver = composite_api_resolver_alloc(); composite_api_resolver_add(instance->composite_resolver, firmware_api_interface); composite_api_resolver_add(instance->composite_resolver, unit_tests_api_interface); return instance; } void test_runner_free(TestRunner* instance) { furi_assert(instance); composite_api_resolver_free(instance->composite_resolver); furi_record_close(RECORD_NOTIFICATION); instance->notification = NULL; furi_record_close(RECORD_LOADER); instance->loader = NULL; furi_record_close(RECORD_STORAGE); instance->storage = NULL; free(instance); } #define TEST_RUNNER_TMP_DIR EXT_PATH(".tmp") #define TEST_RUNNER_TMP_UNIT_TESTS_DIR TEST_RUNNER_TMP_DIR "/unit_tests" static bool test_runner_run_plugin(TestRunner* instance, const char* path) { furi_assert(instance); FURI_LOG_D(TAG, "Loading %s", path); FlipperApplication* lib = flipper_application_alloc( instance->storage, composite_api_resolver_get(instance->composite_resolver)); bool result = false; instance->minunit_fail = -1; do { FlipperApplicationPreloadStatus preload_res = flipper_application_preload(lib, path); if(preload_res != FlipperApplicationPreloadStatusSuccess) { FURI_LOG_E(TAG, "Failed to preload %s, %d", path, preload_res); break; } if(!flipper_application_is_plugin(lib)) { FURI_LOG_E(TAG, "Not a plugin %s", path); break; } FlipperApplicationLoadStatus load_status = flipper_application_map_to_memory(lib); if(load_status != FlipperApplicationLoadStatusSuccess) { FURI_LOG_E(TAG, "Failed to load %s", path); break; } const FlipperAppPluginDescriptor* app_descriptor = flipper_application_plugin_get_descriptor(lib); const TestApi* test = app_descriptor->entry_point; instance->minunit_fail = test->run(); instance->minunit_run += test->get_minunit_run(); instance->minunit_assert += test->get_minunit_assert(); instance->minunit_status += test->get_minunit_status(); result = (instance->minunit_fail == 0); } while(false); flipper_application_free(lib); return result; } static void test_runner_run_internal(TestRunner* instance) { furi_assert(instance); char file_name_buffer[256]; FuriString* file_name = furi_string_alloc(); FuriString* file_basename = furi_string_alloc(); File* directory = storage_file_alloc(instance->storage); do { if(!storage_simply_mkdir(instance->storage, TEST_RUNNER_TMP_DIR)) { FURI_LOG_E(TAG, "Cannot create dir %s", TEST_RUNNER_TMP_DIR); break; } if(!storage_simply_mkdir(instance->storage, TEST_RUNNER_TMP_UNIT_TESTS_DIR)) { FURI_LOG_E(TAG, "Cannot create dir %s", TEST_RUNNER_TMP_UNIT_TESTS_DIR); break; } if(!storage_dir_open(directory, PLUGINS_PATH)) { FURI_LOG_E(TAG, "Failed to open directory %s", PLUGINS_PATH); break; } while(true) { if(cli_is_pipe_broken_or_is_etx_next_char(instance->pipe)) { break; } 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(PLUGINS_PATH, file_name_buffer, file_name); path_extract_filename(file_name, file_basename, true); const char* file_basename_cstr = furi_string_get_cstr(file_basename); bool result = true; if(furi_string_size(instance->args)) { if(furi_string_cmp_str(instance->args, file_basename_cstr) == 0) { result = test_runner_run_plugin(instance, furi_string_get_cstr(file_name)); } else { printf("Skipping %s\r\n", file_basename_cstr); } } else { result = test_runner_run_plugin(instance, furi_string_get_cstr(file_name)); } if(!result) { printf("Failed to execute test: %s\r\n", file_basename_cstr); break; } } } while(false); storage_dir_close(directory); storage_file_free(directory); furi_string_free(file_name); furi_string_free(file_basename); } void test_runner_run(TestRunner* instance) { furi_assert(instance); // TODO FL-3491: lock device while test running if(loader_is_locked(instance->loader)) { printf("RPC: stop all applications to run tests\r\n"); notification_message(instance->notification, &sequence_blink_magenta_100); } else { notification_message_block(instance->notification, &sequence_set_only_blue_255); uint32_t heap_before = memmgr_get_free_heap(); uint32_t cycle_counter = furi_get_tick(); test_runner_run_internal(instance); if(instance->minunit_run != 0) { printf("\r\nFailed tests: %d\r\n", instance->minunit_fail); // Time report cycle_counter = (furi_get_tick() - cycle_counter); printf("Consumed: %lu ms\r\n", cycle_counter); // Wait for tested services and apps to deallocate memory furi_delay_ms(200); uint32_t heap_after = memmgr_get_free_heap(); printf("Leaked: %ld\r\n", heap_before - heap_after); // Final Report if(instance->minunit_fail == 0) { notification_message(instance->notification, &sequence_success); printf("Status: PASSED\r\n"); } else { notification_message(instance->notification, &sequence_error); printf("Status: FAILED\r\n"); } } } } ================================================ FILE: applications/debug/unit_tests/test_runner.h ================================================ #pragma once #include #include typedef struct TestRunner TestRunner; TestRunner* test_runner_alloc(PipeSide* pipe, FuriString* args); void test_runner_free(TestRunner* instance); void test_runner_run(TestRunner* instance); ================================================ FILE: applications/debug/unit_tests/tests/args/args_test.c ================================================ #include "../test.h" // IWYU pragma: keep #include const uint32_t one_ms = 1; const uint32_t one_s = 1000 * one_ms; const uint32_t one_m = 60 * one_s; const uint32_t one_h = 60 * one_m; MU_TEST(args_read_duration_default_values_test) { FuriString* args_string; uint32_t value = 0; // Check default == NULL (ms) args_string = furi_string_alloc_set_str("1"); mu_check(args_read_duration(args_string, &value, NULL)); mu_assert_int_eq(value, one_ms); furi_string_free(args_string); value = 0; // Check default == ms args_string = furi_string_alloc_set_str("1"); mu_check(args_read_duration(args_string, &value, "ms")); mu_assert_int_eq(value, one_ms); furi_string_free(args_string); value = 0; // Check default == s args_string = furi_string_alloc_set_str("1"); mu_check(args_read_duration(args_string, &value, "s")); mu_assert_int_eq(value, one_s); furi_string_free(args_string); value = 0; // Check default == m args_string = furi_string_alloc_set_str("1"); mu_check(args_read_duration(args_string, &value, "m")); mu_assert_int_eq(value, one_m); furi_string_free(args_string); value = 0; // Check default == h args_string = furi_string_alloc_set_str("1"); mu_check(args_read_duration(args_string, &value, "h")); mu_assert_int_eq(value, one_h); furi_string_free(args_string); value = 0; } MU_TEST(args_read_duration_suffix_values_test) { FuriString* args_string; uint32_t value = 0; // Check ms args_string = furi_string_alloc_set_str("1ms"); mu_check(args_read_duration(args_string, &value, NULL)); mu_assert_int_eq(value, one_ms); furi_string_free(args_string); value = 0; // Check s args_string = furi_string_alloc_set_str("1s"); mu_check(args_read_duration(args_string, &value, NULL)); mu_assert_int_eq(value, one_s); furi_string_free(args_string); value = 0; // Check m args_string = furi_string_alloc_set_str("1m"); mu_check(args_read_duration(args_string, &value, NULL)); mu_assert_int_eq(value, one_m); furi_string_free(args_string); value = 0; // Check h args_string = furi_string_alloc_set_str("1h"); mu_check(args_read_duration(args_string, &value, NULL)); mu_assert_int_eq(value, one_h); furi_string_free(args_string); value = 0; } MU_TEST(args_read_duration_values_test) { FuriString* args_string; uint32_t value = 0; // Check for ms args_string = furi_string_alloc_set_str("4294967295ms"); mu_check(args_read_duration(args_string, &value, NULL)); mu_assert_int_eq(value, 4294967295U); furi_string_free(args_string); // Check for s args_string = furi_string_alloc_set_str("4294967s"); mu_check(args_read_duration(args_string, &value, NULL)); mu_assert_int_eq(value, 4294967U * one_s); furi_string_free(args_string); // Check for m args_string = furi_string_alloc_set_str("71582m"); mu_check(args_read_duration(args_string, &value, NULL)); mu_assert_int_eq(value, 71582U * one_m); furi_string_free(args_string); // Check for h args_string = furi_string_alloc_set_str("1193h"); mu_check(args_read_duration(args_string, &value, NULL)); mu_assert_int_eq(value, 1193U * one_h); furi_string_free(args_string); // Check for ms in float args_string = furi_string_alloc_set_str("4.2ms"); mu_check(args_read_duration(args_string, &value, NULL)); mu_assert_int_eq(value, 4); furi_string_free(args_string); // Check for s in float args_string = furi_string_alloc_set_str("1.5s"); mu_check(args_read_duration(args_string, &value, NULL)); mu_assert_int_eq(value, (uint32_t)(1.5 * one_s)); furi_string_free(args_string); // Check for m in float args_string = furi_string_alloc_set_str("1.5m"); mu_check(args_read_duration(args_string, &value, NULL)); mu_assert_int_eq(value, (uint32_t)(1.5 * one_m)); furi_string_free(args_string); // Check for h in float args_string = furi_string_alloc_set_str("1.5h"); mu_check(args_read_duration(args_string, &value, NULL)); mu_assert_int_eq(value, (uint32_t)(1.5 * one_h)); furi_string_free(args_string); } MU_TEST(args_read_duration_errors_test) { FuriString* args_string; uint32_t value = 0; // Check wrong suffix args_string = furi_string_alloc_set_str("1x"); mu_check(!args_read_duration(args_string, &value, NULL)); mu_assert_int_eq(value, 0); furi_string_free(args_string); // Check wrong suffix args_string = furi_string_alloc_set_str("1xs"); mu_check(!args_read_duration(args_string, &value, NULL)); mu_assert_int_eq(value, 0); furi_string_free(args_string); // Check negative value args_string = furi_string_alloc_set_str("-1s"); mu_check(!args_read_duration(args_string, &value, NULL)); mu_assert_int_eq(value, 0); furi_string_free(args_string); // Check wrong values // Check only suffix args_string = furi_string_alloc_set_str("s"); mu_check(!args_read_duration(args_string, &value, NULL)); mu_assert_int_eq(value, 0); furi_string_free(args_string); // Check doubled point args_string = furi_string_alloc_set_str("0.1.1"); mu_check(!args_read_duration(args_string, &value, NULL)); mu_assert_int_eq(value, 0); furi_string_free(args_string); // Check overflow values // Check for ms args_string = furi_string_alloc_set_str("4294967296ms"); mu_check(!args_read_duration(args_string, &value, NULL)); mu_assert_int_eq(value, 0); furi_string_free(args_string); // Check for s args_string = furi_string_alloc_set_str("4294968s"); mu_check(!args_read_duration(args_string, &value, NULL)); mu_assert_int_eq(value, 0); furi_string_free(args_string); // Check for m args_string = furi_string_alloc_set_str("71583m"); mu_check(!args_read_duration(args_string, &value, NULL)); mu_assert_int_eq(value, 0); furi_string_free(args_string); // Check for h args_string = furi_string_alloc_set_str("1194h"); mu_check(!args_read_duration(args_string, &value, NULL)); mu_assert_int_eq(value, 0); furi_string_free(args_string); } MU_TEST_SUITE(toolbox_args_read_duration_suite) { MU_RUN_TEST(args_read_duration_default_values_test); MU_RUN_TEST(args_read_duration_suffix_values_test); MU_RUN_TEST(args_read_duration_values_test); MU_RUN_TEST(args_read_duration_errors_test); } int run_minunit_test_toolbox_args(void) { MU_RUN_SUITE(toolbox_args_read_duration_suite); return MU_EXIT_CODE; } TEST_API_DEFINE(run_minunit_test_toolbox_args) ================================================ FILE: applications/debug/unit_tests/tests/bit_lib/bit_lib_test.c ================================================ #include #include "../test.h" // IWYU pragma: keep #include MU_TEST(test_bit_lib_increment_index) { uint32_t index = 0; // test increment for(uint32_t i = 0; i < 31; ++i) { bit_lib_increment_index(index, 32); mu_assert_int_eq(i + 1, index); } // test wrap around for(uint32_t i = 0; i < 512; ++i) { bit_lib_increment_index(index, 32); mu_assert_int_less_than(32, index); } } MU_TEST(test_bit_lib_is_set) { uint32_t value = 0x0000FFFF; for(uint32_t i = 0; i < 16; ++i) { mu_check(bit_lib_bit_is_set(value, i)); mu_check(!bit_lib_bit_is_not_set(value, i)); } for(uint32_t i = 16; i < 32; ++i) { mu_check(!bit_lib_bit_is_set(value, i)); mu_check(bit_lib_bit_is_not_set(value, i)); } } MU_TEST(test_bit_lib_push) { #define TEST_BIT_LIB_PUSH_DATA_SIZE 4 uint8_t data[TEST_BIT_LIB_PUSH_DATA_SIZE] = {0}; uint8_t expected_data_1[TEST_BIT_LIB_PUSH_DATA_SIZE] = {0x00, 0x00, 0x0F, 0xFF}; uint8_t expected_data_2[TEST_BIT_LIB_PUSH_DATA_SIZE] = {0x00, 0xFF, 0xF0, 0x00}; uint8_t expected_data_3[TEST_BIT_LIB_PUSH_DATA_SIZE] = {0xFF, 0x00, 0x00, 0xFF}; uint8_t expected_data_4[TEST_BIT_LIB_PUSH_DATA_SIZE] = {0xFF, 0xFF, 0xFF, 0xFF}; uint8_t expected_data_5[TEST_BIT_LIB_PUSH_DATA_SIZE] = {0x00, 0x00, 0x00, 0x00}; uint8_t expected_data_6[TEST_BIT_LIB_PUSH_DATA_SIZE] = {0xCC, 0xCC, 0xCC, 0xCC}; for(uint32_t i = 0; i < 12; ++i) { bit_lib_push_bit(data, TEST_BIT_LIB_PUSH_DATA_SIZE, true); } mu_assert_mem_eq(expected_data_1, data, TEST_BIT_LIB_PUSH_DATA_SIZE); for(uint32_t i = 0; i < 12; ++i) { bit_lib_push_bit(data, TEST_BIT_LIB_PUSH_DATA_SIZE, false); } mu_assert_mem_eq(expected_data_2, data, TEST_BIT_LIB_PUSH_DATA_SIZE); for(uint32_t i = 0; i < 4; ++i) { bit_lib_push_bit(data, TEST_BIT_LIB_PUSH_DATA_SIZE, false); } for(uint32_t i = 0; i < 8; ++i) { bit_lib_push_bit(data, TEST_BIT_LIB_PUSH_DATA_SIZE, true); } mu_assert_mem_eq(expected_data_3, data, TEST_BIT_LIB_PUSH_DATA_SIZE); for(uint32_t i = 0; i < TEST_BIT_LIB_PUSH_DATA_SIZE * 8; ++i) { bit_lib_push_bit(data, TEST_BIT_LIB_PUSH_DATA_SIZE, true); } mu_assert_mem_eq(expected_data_4, data, TEST_BIT_LIB_PUSH_DATA_SIZE); for(uint32_t i = 0; i < TEST_BIT_LIB_PUSH_DATA_SIZE * 8; ++i) { bit_lib_push_bit(data, TEST_BIT_LIB_PUSH_DATA_SIZE, false); } mu_assert_mem_eq(expected_data_5, data, TEST_BIT_LIB_PUSH_DATA_SIZE); for(uint32_t i = 0; i < TEST_BIT_LIB_PUSH_DATA_SIZE * 2; ++i) { bit_lib_push_bit(data, TEST_BIT_LIB_PUSH_DATA_SIZE, true); bit_lib_push_bit(data, TEST_BIT_LIB_PUSH_DATA_SIZE, true); bit_lib_push_bit(data, TEST_BIT_LIB_PUSH_DATA_SIZE, false); bit_lib_push_bit(data, TEST_BIT_LIB_PUSH_DATA_SIZE, false); } mu_assert_mem_eq(expected_data_6, data, TEST_BIT_LIB_PUSH_DATA_SIZE); } MU_TEST(test_bit_lib_set_bit) { uint8_t value[2] = {0x00, 0xFF}; bit_lib_set_bit(value, 15, false); mu_assert_mem_eq(value, ((uint8_t[]){0x00, 0xFE}), 2); bit_lib_set_bit(value, 14, false); mu_assert_mem_eq(value, ((uint8_t[]){0x00, 0xFC}), 2); bit_lib_set_bit(value, 13, false); mu_assert_mem_eq(value, ((uint8_t[]){0x00, 0xF8}), 2); bit_lib_set_bit(value, 12, false); mu_assert_mem_eq(value, ((uint8_t[]){0x00, 0xF0}), 2); bit_lib_set_bit(value, 11, false); mu_assert_mem_eq(value, ((uint8_t[]){0x00, 0xE0}), 2); bit_lib_set_bit(value, 10, false); mu_assert_mem_eq(value, ((uint8_t[]){0x00, 0xC0}), 2); bit_lib_set_bit(value, 9, false); mu_assert_mem_eq(value, ((uint8_t[]){0x00, 0x80}), 2); bit_lib_set_bit(value, 8, false); mu_assert_mem_eq(value, ((uint8_t[]){0x00, 0x00}), 2); bit_lib_set_bit(value, 7, true); mu_assert_mem_eq(value, ((uint8_t[]){0x01, 0x00}), 2); bit_lib_set_bit(value, 6, true); mu_assert_mem_eq(value, ((uint8_t[]){0x03, 0x00}), 2); bit_lib_set_bit(value, 5, true); mu_assert_mem_eq(value, ((uint8_t[]){0x07, 0x00}), 2); bit_lib_set_bit(value, 4, true); mu_assert_mem_eq(value, ((uint8_t[]){0x0F, 0x00}), 2); bit_lib_set_bit(value, 3, true); mu_assert_mem_eq(value, ((uint8_t[]){0x1F, 0x00}), 2); bit_lib_set_bit(value, 2, true); mu_assert_mem_eq(value, ((uint8_t[]){0x3F, 0x00}), 2); bit_lib_set_bit(value, 1, true); mu_assert_mem_eq(value, ((uint8_t[]){0x7F, 0x00}), 2); bit_lib_set_bit(value, 0, true); mu_assert_mem_eq(value, ((uint8_t[]){0xFF, 0x00}), 2); } MU_TEST(test_bit_lib_set_bits) { uint8_t value[2] = {0b00000000, 0b11111111}; // set 4 bits to 0b0100 from 12 index bit_lib_set_bits(value, 12, 0b0100, 4); // [0100] mu_assert_mem_eq(value, ((uint8_t[]){0b00000000, 0b11110100}), 2); // set 2 bits to 0b11 from 11 index bit_lib_set_bits(value, 11, 0b11, 2); // [11] mu_assert_mem_eq(value, ((uint8_t[]){0b00000000, 0b11111100}), 2); // set 3 bits to 0b111 from 0 index bit_lib_set_bits(value, 0, 0b111, 3); // [111] mu_assert_mem_eq(value, ((uint8_t[]){0b11100000, 0b11111100}), 2); // set 8 bits to 0b11111000 from 3 index bit_lib_set_bits(value, 3, 0b11111000, 8); // [11111 000] mu_assert_mem_eq(value, ((uint8_t[]){0b11111111, 0b00011100}), 2); } MU_TEST(test_bit_lib_get_bit) { uint8_t value[2] = {0b00000000, 0b11111111}; for(uint32_t i = 0; i < 8; ++i) { mu_check(bit_lib_get_bit(value, i) == false); } for(uint32_t i = 8; i < 16; ++i) { mu_check(bit_lib_get_bit(value, i) == true); } } MU_TEST(test_bit_lib_get_bits) { uint8_t value[2] = {0b00000000, 0b11111111}; mu_assert_int_eq(0b00000000, bit_lib_get_bits(value, 0, 8)); mu_assert_int_eq(0b00000001, bit_lib_get_bits(value, 1, 8)); mu_assert_int_eq(0b00000011, bit_lib_get_bits(value, 2, 8)); mu_assert_int_eq(0b00000111, bit_lib_get_bits(value, 3, 8)); mu_assert_int_eq(0b00001111, bit_lib_get_bits(value, 4, 8)); mu_assert_int_eq(0b00011111, bit_lib_get_bits(value, 5, 8)); mu_assert_int_eq(0b00111111, bit_lib_get_bits(value, 6, 8)); mu_assert_int_eq(0b01111111, bit_lib_get_bits(value, 7, 8)); mu_assert_int_eq(0b11111111, bit_lib_get_bits(value, 8, 8)); } MU_TEST(test_bit_lib_get_bits_16) { uint8_t value[2] = {0b00001001, 0b10110001}; mu_assert_int_eq(0b0, bit_lib_get_bits_16(value, 0, 1)); mu_assert_int_eq(0b00, bit_lib_get_bits_16(value, 0, 2)); mu_assert_int_eq(0b000, bit_lib_get_bits_16(value, 0, 3)); mu_assert_int_eq(0b0000, bit_lib_get_bits_16(value, 0, 4)); mu_assert_int_eq(0b00001, bit_lib_get_bits_16(value, 0, 5)); mu_assert_int_eq(0b000010, bit_lib_get_bits_16(value, 0, 6)); mu_assert_int_eq(0b0000100, bit_lib_get_bits_16(value, 0, 7)); mu_assert_int_eq(0b00001001, bit_lib_get_bits_16(value, 0, 8)); mu_assert_int_eq(0b000010011, bit_lib_get_bits_16(value, 0, 9)); mu_assert_int_eq(0b0000100110, bit_lib_get_bits_16(value, 0, 10)); mu_assert_int_eq(0b00001001101, bit_lib_get_bits_16(value, 0, 11)); mu_assert_int_eq(0b000010011011, bit_lib_get_bits_16(value, 0, 12)); mu_assert_int_eq(0b0000100110110, bit_lib_get_bits_16(value, 0, 13)); mu_assert_int_eq(0b00001001101100, bit_lib_get_bits_16(value, 0, 14)); mu_assert_int_eq(0b000010011011000, bit_lib_get_bits_16(value, 0, 15)); mu_assert_int_eq(0b0000100110110001, bit_lib_get_bits_16(value, 0, 16)); } MU_TEST(test_bit_lib_get_bits_32) { uint8_t value[4] = {0b00001001, 0b10110001, 0b10001100, 0b01100010}; mu_assert_int_eq(0b0, bit_lib_get_bits_32(value, 0, 1)); mu_assert_int_eq(0b00, bit_lib_get_bits_32(value, 0, 2)); mu_assert_int_eq(0b000, bit_lib_get_bits_32(value, 0, 3)); mu_assert_int_eq(0b0000, bit_lib_get_bits_32(value, 0, 4)); mu_assert_int_eq(0b00001, bit_lib_get_bits_32(value, 0, 5)); mu_assert_int_eq(0b000010, bit_lib_get_bits_32(value, 0, 6)); mu_assert_int_eq(0b0000100, bit_lib_get_bits_32(value, 0, 7)); mu_assert_int_eq(0b00001001, bit_lib_get_bits_32(value, 0, 8)); mu_assert_int_eq(0b000010011, bit_lib_get_bits_32(value, 0, 9)); mu_assert_int_eq(0b0000100110, bit_lib_get_bits_32(value, 0, 10)); mu_assert_int_eq(0b00001001101, bit_lib_get_bits_32(value, 0, 11)); mu_assert_int_eq(0b000010011011, bit_lib_get_bits_32(value, 0, 12)); mu_assert_int_eq(0b0000100110110, bit_lib_get_bits_32(value, 0, 13)); mu_assert_int_eq(0b00001001101100, bit_lib_get_bits_32(value, 0, 14)); mu_assert_int_eq(0b000010011011000, bit_lib_get_bits_32(value, 0, 15)); mu_assert_int_eq(0b0000100110110001, bit_lib_get_bits_32(value, 0, 16)); mu_assert_int_eq(0b00001001101100011, bit_lib_get_bits_32(value, 0, 17)); mu_assert_int_eq(0b000010011011000110, bit_lib_get_bits_32(value, 0, 18)); mu_assert_int_eq(0b0000100110110001100, bit_lib_get_bits_32(value, 0, 19)); mu_assert_int_eq(0b00001001101100011000, bit_lib_get_bits_32(value, 0, 20)); mu_assert_int_eq(0b000010011011000110001, bit_lib_get_bits_32(value, 0, 21)); mu_assert_int_eq(0b0000100110110001100011, bit_lib_get_bits_32(value, 0, 22)); mu_assert_int_eq(0b00001001101100011000110, bit_lib_get_bits_32(value, 0, 23)); mu_assert_int_eq(0b000010011011000110001100, bit_lib_get_bits_32(value, 0, 24)); mu_assert_int_eq(0b0000100110110001100011000, bit_lib_get_bits_32(value, 0, 25)); mu_assert_int_eq(0b00001001101100011000110001, bit_lib_get_bits_32(value, 0, 26)); mu_assert_int_eq(0b000010011011000110001100011, bit_lib_get_bits_32(value, 0, 27)); mu_assert_int_eq(0b0000100110110001100011000110, bit_lib_get_bits_32(value, 0, 28)); mu_assert_int_eq(0b00001001101100011000110001100, bit_lib_get_bits_32(value, 0, 29)); mu_assert_int_eq(0b000010011011000110001100011000, bit_lib_get_bits_32(value, 0, 30)); mu_assert_int_eq(0b0000100110110001100011000110001, bit_lib_get_bits_32(value, 0, 31)); mu_assert_int_eq(0b00001001101100011000110001100010, bit_lib_get_bits_32(value, 0, 32)); } MU_TEST(test_bit_lib_get_bits_64) { uint8_t value[8] = { 0b00001001, 0b10110001, 0b10001100, 0b01100010, 0b00001001, 0b10110001, 0b10001100, 0b01100010}; mu_assert_int_eq(0b0, bit_lib_get_bits_64(value, 0, 1)); mu_assert_int_eq(0b00, bit_lib_get_bits_64(value, 0, 2)); mu_assert_int_eq(0b000, bit_lib_get_bits_64(value, 0, 3)); mu_assert_int_eq(0b0000, bit_lib_get_bits_64(value, 0, 4)); mu_assert_int_eq(0b00001, bit_lib_get_bits_64(value, 0, 5)); mu_assert_int_eq(0b000010, bit_lib_get_bits_64(value, 0, 6)); mu_assert_int_eq(0b0000100, bit_lib_get_bits_64(value, 0, 7)); mu_assert_int_eq(0b00001001, bit_lib_get_bits_64(value, 0, 8)); mu_assert_int_eq(0b000010011, bit_lib_get_bits_64(value, 0, 9)); mu_assert_int_eq(0b0000100110, bit_lib_get_bits_64(value, 0, 10)); mu_assert_int_eq(0b00001001101, bit_lib_get_bits_64(value, 0, 11)); mu_assert_int_eq(0b000010011011, bit_lib_get_bits_64(value, 0, 12)); mu_assert_int_eq(0b0000100110110, bit_lib_get_bits_64(value, 0, 13)); mu_assert_int_eq(0b00001001101100, bit_lib_get_bits_64(value, 0, 14)); mu_assert_int_eq(0b000010011011000, bit_lib_get_bits_64(value, 0, 15)); mu_assert_int_eq(0b0000100110110001, bit_lib_get_bits_64(value, 0, 16)); mu_assert_int_eq(0b00001001101100011, bit_lib_get_bits_64(value, 0, 17)); mu_assert_int_eq(0b000010011011000110, bit_lib_get_bits_64(value, 0, 18)); mu_assert_int_eq(0b0000100110110001100, bit_lib_get_bits_64(value, 0, 19)); mu_assert_int_eq(0b00001001101100011000, bit_lib_get_bits_64(value, 0, 20)); mu_assert_int_eq(0b000010011011000110001, bit_lib_get_bits_64(value, 0, 21)); mu_assert_int_eq(0b0000100110110001100011, bit_lib_get_bits_64(value, 0, 22)); mu_assert_int_eq(0b00001001101100011000110, bit_lib_get_bits_64(value, 0, 23)); mu_assert_int_eq(0b000010011011000110001100, bit_lib_get_bits_64(value, 0, 24)); mu_assert_int_eq(0b0000100110110001100011000, bit_lib_get_bits_64(value, 0, 25)); mu_assert_int_eq(0b00001001101100011000110001, bit_lib_get_bits_64(value, 0, 26)); mu_assert_int_eq(0b000010011011000110001100011, bit_lib_get_bits_64(value, 0, 27)); mu_assert_int_eq(0b0000100110110001100011000110, bit_lib_get_bits_64(value, 0, 28)); mu_assert_int_eq(0b00001001101100011000110001100, bit_lib_get_bits_64(value, 0, 29)); mu_assert_int_eq(0b000010011011000110001100011000, bit_lib_get_bits_64(value, 0, 30)); mu_assert_int_eq(0b0000100110110001100011000110001, bit_lib_get_bits_64(value, 0, 31)); mu_assert_int_eq(0b00001001101100011000110001100010, bit_lib_get_bits_64(value, 0, 32)); uint64_t res = bit_lib_get_bits_64(value, 0, 33); uint64_t expected = 0b000010011011000110001100011000100; mu_assert_mem_eq(&expected, &res, sizeof(expected)); res = bit_lib_get_bits_64(value, 0, 34); expected = 0b0000100110110001100011000110001000; mu_assert_mem_eq(&expected, &res, sizeof(expected)); res = bit_lib_get_bits_64(value, 0, 35); expected = 0b00001001101100011000110001100010000; mu_assert_mem_eq(&expected, &res, sizeof(expected)); res = bit_lib_get_bits_64(value, 0, 36); expected = 0b000010011011000110001100011000100000; mu_assert_mem_eq(&expected, &res, sizeof(expected)); res = bit_lib_get_bits_64(value, 0, 37); expected = 0b0000100110110001100011000110001000001; mu_assert_mem_eq(&expected, &res, sizeof(expected)); res = bit_lib_get_bits_64(value, 0, 38); expected = 0b00001001101100011000110001100010000010; mu_assert_mem_eq(&expected, &res, sizeof(expected)); res = bit_lib_get_bits_64(value, 0, 39); expected = 0b000010011011000110001100011000100000100; mu_assert_mem_eq(&expected, &res, sizeof(expected)); res = bit_lib_get_bits_64(value, 0, 40); expected = 0b0000100110110001100011000110001000001001; mu_assert_mem_eq(&expected, &res, sizeof(expected)); res = bit_lib_get_bits_64(value, 0, 41); expected = 0b00001001101100011000110001100010000010011; mu_assert_mem_eq(&expected, &res, sizeof(expected)); res = bit_lib_get_bits_64(value, 0, 42); expected = 0b000010011011000110001100011000100000100110; mu_assert_mem_eq(&expected, &res, sizeof(expected)); res = bit_lib_get_bits_64(value, 0, 43); expected = 0b0000100110110001100011000110001000001001101; mu_assert_mem_eq(&expected, &res, sizeof(expected)); res = bit_lib_get_bits_64(value, 0, 44); expected = 0b00001001101100011000110001100010000010011011; mu_assert_mem_eq(&expected, &res, sizeof(expected)); res = bit_lib_get_bits_64(value, 0, 45); expected = 0b000010011011000110001100011000100000100110110; mu_assert_mem_eq(&expected, &res, sizeof(expected)); res = bit_lib_get_bits_64(value, 0, 46); expected = 0b0000100110110001100011000110001000001001101100; mu_assert_mem_eq(&expected, &res, sizeof(expected)); res = bit_lib_get_bits_64(value, 0, 47); expected = 0b00001001101100011000110001100010000010011011000; mu_assert_mem_eq(&expected, &res, sizeof(expected)); res = bit_lib_get_bits_64(value, 0, 48); expected = 0b000010011011000110001100011000100000100110110001; mu_assert_mem_eq(&expected, &res, sizeof(expected)); res = bit_lib_get_bits_64(value, 0, 49); expected = 0b0000100110110001100011000110001000001001101100011; mu_assert_mem_eq(&expected, &res, sizeof(expected)); res = bit_lib_get_bits_64(value, 0, 50); expected = 0b00001001101100011000110001100010000010011011000110; mu_assert_mem_eq(&expected, &res, sizeof(expected)); res = bit_lib_get_bits_64(value, 0, 51); expected = 0b000010011011000110001100011000100000100110110001100; mu_assert_mem_eq(&expected, &res, sizeof(expected)); res = bit_lib_get_bits_64(value, 0, 52); expected = 0b0000100110110001100011000110001000001001101100011000; mu_assert_mem_eq(&expected, &res, sizeof(expected)); res = bit_lib_get_bits_64(value, 0, 53); expected = 0b00001001101100011000110001100010000010011011000110001; mu_assert_mem_eq(&expected, &res, sizeof(expected)); res = bit_lib_get_bits_64(value, 0, 54); expected = 0b000010011011000110001100011000100000100110110001100011; mu_assert_mem_eq(&expected, &res, sizeof(expected)); res = bit_lib_get_bits_64(value, 0, 55); expected = 0b0000100110110001100011000110001000001001101100011000110; mu_assert_mem_eq(&expected, &res, sizeof(expected)); res = bit_lib_get_bits_64(value, 0, 56); expected = 0b00001001101100011000110001100010000010011011000110001100; mu_assert_mem_eq(&expected, &res, sizeof(expected)); res = bit_lib_get_bits_64(value, 0, 57); expected = 0b000010011011000110001100011000100000100110110001100011000; mu_assert_mem_eq(&expected, &res, sizeof(expected)); res = bit_lib_get_bits_64(value, 0, 58); expected = 0b0000100110110001100011000110001000001001101100011000110001; mu_assert_mem_eq(&expected, &res, sizeof(expected)); res = bit_lib_get_bits_64(value, 0, 59); expected = 0b00001001101100011000110001100010000010011011000110001100011; mu_assert_mem_eq(&expected, &res, sizeof(expected)); res = bit_lib_get_bits_64(value, 0, 60); expected = 0b000010011011000110001100011000100000100110110001100011000110; mu_assert_mem_eq(&expected, &res, sizeof(expected)); res = bit_lib_get_bits_64(value, 0, 61); expected = 0b0000100110110001100011000110001000001001101100011000110001100; mu_assert_mem_eq(&expected, &res, sizeof(expected)); res = bit_lib_get_bits_64(value, 0, 62); expected = 0b00001001101100011000110001100010000010011011000110001100011000; mu_assert_mem_eq(&expected, &res, sizeof(expected)); res = bit_lib_get_bits_64(value, 0, 63); expected = 0b000010011011000110001100011000100000100110110001100011000110001; mu_assert_mem_eq(&expected, &res, sizeof(expected)); res = bit_lib_get_bits_64(value, 0, 64); expected = 0b0000100110110001100011000110001000001001101100011000110001100010; mu_assert_mem_eq(&expected, &res, sizeof(expected)); } MU_TEST(test_bit_lib_test_parity_u32) { // test even parity mu_assert_int_eq(bit_lib_test_parity_32(0b00000000, BitLibParityEven), 0); mu_assert_int_eq(bit_lib_test_parity_32(0b00000001, BitLibParityEven), 1); mu_assert_int_eq(bit_lib_test_parity_32(0b00000010, BitLibParityEven), 1); mu_assert_int_eq(bit_lib_test_parity_32(0b00000011, BitLibParityEven), 0); mu_assert_int_eq(bit_lib_test_parity_32(0b00000100, BitLibParityEven), 1); mu_assert_int_eq(bit_lib_test_parity_32(0b00000101, BitLibParityEven), 0); mu_assert_int_eq(bit_lib_test_parity_32(0b00000110, BitLibParityEven), 0); mu_assert_int_eq(bit_lib_test_parity_32(0b00000111, BitLibParityEven), 1); mu_assert_int_eq(bit_lib_test_parity_32(0b00001000, BitLibParityEven), 1); mu_assert_int_eq(bit_lib_test_parity_32(0b00001001, BitLibParityEven), 0); mu_assert_int_eq(bit_lib_test_parity_32(0b00001010, BitLibParityEven), 0); mu_assert_int_eq(bit_lib_test_parity_32(0b00001011, BitLibParityEven), 1); mu_assert_int_eq(bit_lib_test_parity_32(0b00001100, BitLibParityEven), 0); mu_assert_int_eq(bit_lib_test_parity_32(0b00001101, BitLibParityEven), 1); mu_assert_int_eq(bit_lib_test_parity_32(0b00001110, BitLibParityEven), 1); mu_assert_int_eq(bit_lib_test_parity_32(0b00001111, BitLibParityEven), 0); mu_assert_int_eq(bit_lib_test_parity_32(0b00010000, BitLibParityEven), 1); // test odd parity mu_assert_int_eq(bit_lib_test_parity_32(0b00000000, BitLibParityOdd), 1); mu_assert_int_eq(bit_lib_test_parity_32(0b00000001, BitLibParityOdd), 0); mu_assert_int_eq(bit_lib_test_parity_32(0b00000010, BitLibParityOdd), 0); mu_assert_int_eq(bit_lib_test_parity_32(0b00000011, BitLibParityOdd), 1); mu_assert_int_eq(bit_lib_test_parity_32(0b00000100, BitLibParityOdd), 0); mu_assert_int_eq(bit_lib_test_parity_32(0b00000101, BitLibParityOdd), 1); mu_assert_int_eq(bit_lib_test_parity_32(0b00000110, BitLibParityOdd), 1); mu_assert_int_eq(bit_lib_test_parity_32(0b00000111, BitLibParityOdd), 0); mu_assert_int_eq(bit_lib_test_parity_32(0b00001000, BitLibParityOdd), 0); mu_assert_int_eq(bit_lib_test_parity_32(0b00001001, BitLibParityOdd), 1); mu_assert_int_eq(bit_lib_test_parity_32(0b00001010, BitLibParityOdd), 1); mu_assert_int_eq(bit_lib_test_parity_32(0b00001011, BitLibParityOdd), 0); mu_assert_int_eq(bit_lib_test_parity_32(0b00001100, BitLibParityOdd), 1); mu_assert_int_eq(bit_lib_test_parity_32(0b00001101, BitLibParityOdd), 0); mu_assert_int_eq(bit_lib_test_parity_32(0b00001110, BitLibParityOdd), 0); mu_assert_int_eq(bit_lib_test_parity_32(0b00001111, BitLibParityOdd), 1); mu_assert_int_eq(bit_lib_test_parity_32(0b00010000, BitLibParityOdd), 0); } MU_TEST(test_bit_lib_test_parity) { // next data contains valid parity for 1-3 nibble and invalid for 4 nibble uint8_t data_always_0_parity[2] = {0b11101110, 0b11101111}; uint8_t data_always_1_parity[2] = {0b00010001, 0b00010000}; uint8_t data_always_odd_parity[2] = {0b00000011, 0b11110111}; uint8_t data_always_even_parity[2] = {0b00010111, 0b10110011}; // test alawys 0 parity mu_check(bit_lib_test_parity(data_always_0_parity, 0, 12, BitLibParityAlways0, 4)); mu_check(bit_lib_test_parity(data_always_0_parity, 4, 8, BitLibParityAlways0, 4)); mu_check(bit_lib_test_parity(data_always_0_parity, 8, 4, BitLibParityAlways0, 4)); mu_check(bit_lib_test_parity(data_always_1_parity, 12, 4, BitLibParityAlways0, 4)); mu_check(!bit_lib_test_parity(data_always_0_parity, 0, 16, BitLibParityAlways0, 4)); mu_check(!bit_lib_test_parity(data_always_0_parity, 4, 12, BitLibParityAlways0, 4)); mu_check(!bit_lib_test_parity(data_always_0_parity, 8, 8, BitLibParityAlways0, 4)); mu_check(!bit_lib_test_parity(data_always_0_parity, 12, 4, BitLibParityAlways0, 4)); // test alawys 1 parity mu_check(bit_lib_test_parity(data_always_1_parity, 0, 12, BitLibParityAlways1, 4)); mu_check(bit_lib_test_parity(data_always_1_parity, 4, 8, BitLibParityAlways1, 4)); mu_check(bit_lib_test_parity(data_always_1_parity, 8, 4, BitLibParityAlways1, 4)); mu_check(bit_lib_test_parity(data_always_0_parity, 12, 4, BitLibParityAlways1, 4)); mu_check(!bit_lib_test_parity(data_always_1_parity, 0, 16, BitLibParityAlways1, 4)); mu_check(!bit_lib_test_parity(data_always_1_parity, 4, 12, BitLibParityAlways1, 4)); mu_check(!bit_lib_test_parity(data_always_1_parity, 8, 8, BitLibParityAlways1, 4)); mu_check(!bit_lib_test_parity(data_always_1_parity, 12, 4, BitLibParityAlways1, 4)); // test odd parity mu_check(bit_lib_test_parity(data_always_odd_parity, 0, 12, BitLibParityOdd, 4)); mu_check(bit_lib_test_parity(data_always_odd_parity, 4, 8, BitLibParityOdd, 4)); mu_check(bit_lib_test_parity(data_always_odd_parity, 8, 4, BitLibParityOdd, 4)); mu_check(bit_lib_test_parity(data_always_even_parity, 12, 4, BitLibParityOdd, 4)); mu_check(!bit_lib_test_parity(data_always_odd_parity, 0, 16, BitLibParityOdd, 4)); mu_check(!bit_lib_test_parity(data_always_odd_parity, 4, 12, BitLibParityOdd, 4)); mu_check(!bit_lib_test_parity(data_always_odd_parity, 8, 8, BitLibParityOdd, 4)); mu_check(!bit_lib_test_parity(data_always_odd_parity, 12, 4, BitLibParityOdd, 4)); // test even parity mu_check(bit_lib_test_parity(data_always_even_parity, 0, 12, BitLibParityEven, 4)); mu_check(bit_lib_test_parity(data_always_even_parity, 4, 8, BitLibParityEven, 4)); mu_check(bit_lib_test_parity(data_always_even_parity, 8, 4, BitLibParityEven, 4)); mu_check(bit_lib_test_parity(data_always_odd_parity, 12, 4, BitLibParityEven, 4)); mu_check(!bit_lib_test_parity(data_always_even_parity, 0, 16, BitLibParityEven, 4)); mu_check(!bit_lib_test_parity(data_always_even_parity, 4, 12, BitLibParityEven, 4)); mu_check(!bit_lib_test_parity(data_always_even_parity, 8, 8, BitLibParityEven, 4)); mu_check(!bit_lib_test_parity(data_always_even_parity, 12, 4, BitLibParityEven, 4)); } MU_TEST(test_bit_lib_remove_bit_every_nth) { // TODO FL-3494: more tests uint8_t data_i[1] = {0b00001111}; uint8_t data_o[1] = {0b00011111}; size_t length; length = bit_lib_remove_bit_every_nth(data_i, 0, 8, 3); mu_assert_int_eq(6, length); mu_assert_mem_eq(data_o, data_i, 1); } MU_TEST(test_bit_lib_reverse_bits) { uint8_t data_1_i[2] = {0b11001010, 0b00011111}; uint8_t data_1_o[2] = {0b11111000, 0b01010011}; // reverse bits [0..15] bit_lib_reverse_bits(data_1_i, 0, 16); mu_assert_mem_eq(data_1_o, data_1_i, 2); uint8_t data_2_i[2] = {0b11001010, 0b00011111}; uint8_t data_2_o[2] = {0b11001000, 0b01011111}; // reverse bits [4..11] bit_lib_reverse_bits(data_2_i, 4, 8); mu_assert_mem_eq(data_2_o, data_2_i, 2); } MU_TEST(test_bit_lib_copy_bits) { uint8_t data_1_i[2] = {0b11001010, 0b00011111}; uint8_t data_1_o[2] = {0}; // data_1_o[0..15] = data_1_i[0..15] bit_lib_copy_bits(data_1_o, 0, 16, data_1_i, 0); mu_assert_mem_eq(data_1_i, data_1_o, 2); memset(data_1_o, 0, 2); // data_1_o[4..11] = data_1_i[0..7] bit_lib_copy_bits(data_1_o, 4, 8, data_1_i, 0); mu_assert_mem_eq(((uint8_t[]){0b00001100, 0b10100000}), data_1_o, 2); } MU_TEST(test_bit_lib_get_bit_count) { mu_assert_int_eq(0, bit_lib_get_bit_count(0)); mu_assert_int_eq(1, bit_lib_get_bit_count(0b1)); mu_assert_int_eq(1, bit_lib_get_bit_count(0b10)); mu_assert_int_eq(2, bit_lib_get_bit_count(0b11)); mu_assert_int_eq(4, bit_lib_get_bit_count(0b11000011)); mu_assert_int_eq(6, bit_lib_get_bit_count(0b11000011000011)); mu_assert_int_eq(8, bit_lib_get_bit_count(0b11111111)); mu_assert_int_eq(16, bit_lib_get_bit_count(0b11111110000000000000000111111111)); mu_assert_int_eq(32, bit_lib_get_bit_count(0b11111111111111111111111111111111)); } MU_TEST(test_bit_lib_reverse_16_fast) { mu_assert_int_eq(0b0000000000000000, bit_lib_reverse_16_fast(0b0000000000000000)); mu_assert_int_eq(0b1000000000000000, bit_lib_reverse_16_fast(0b0000000000000001)); mu_assert_int_eq(0b1100000000000000, bit_lib_reverse_16_fast(0b0000000000000011)); mu_assert_int_eq(0b0000100000001001, bit_lib_reverse_16_fast(0b1001000000010000)); } MU_TEST(test_bit_lib_crc16) { uint8_t data[9] = {'1', '2', '3', '4', '5', '6', '7', '8', '9'}; uint8_t data_size = 9; // Algorithm // Check Poly Init RefIn RefOut XorOut // CRC-16/CCITT-FALSE // 0x29B1 0x1021 0xFFFF false false 0x0000 mu_assert_int_eq(0x29B1, bit_lib_crc16(data, data_size, 0x1021, 0xFFFF, false, false, 0x0000)); // CRC-16/ARC // 0xBB3D 0x8005 0x0000 true true 0x0000 mu_assert_int_eq(0xBB3D, bit_lib_crc16(data, data_size, 0x8005, 0x0000, true, true, 0x0000)); // CRC-16/AUG-CCITT // 0xE5CC 0x1021 0x1D0F false false 0x0000 mu_assert_int_eq(0xE5CC, bit_lib_crc16(data, data_size, 0x1021, 0x1D0F, false, false, 0x0000)); // CRC-16/BUYPASS // 0xFEE8 0x8005 0x0000 false false 0x0000 mu_assert_int_eq(0xFEE8, bit_lib_crc16(data, data_size, 0x8005, 0x0000, false, false, 0x0000)); // CRC-16/CDMA2000 // 0x4C06 0xC867 0xFFFF false false 0x0000 mu_assert_int_eq(0x4C06, bit_lib_crc16(data, data_size, 0xC867, 0xFFFF, false, false, 0x0000)); // CRC-16/DDS-110 // 0x9ECF 0x8005 0x800D false false 0x0000 mu_assert_int_eq(0x9ECF, bit_lib_crc16(data, data_size, 0x8005, 0x800D, false, false, 0x0000)); // CRC-16/DECT-R // 0x007E 0x0589 0x0000 false false 0x0001 mu_assert_int_eq(0x007E, bit_lib_crc16(data, data_size, 0x0589, 0x0000, false, false, 0x0001)); // CRC-16/DECT-X // 0x007F 0x0589 0x0000 false false 0x0000 mu_assert_int_eq(0x007F, bit_lib_crc16(data, data_size, 0x0589, 0x0000, false, false, 0x0000)); // CRC-16/DNP // 0xEA82 0x3D65 0x0000 true true 0xFFFF mu_assert_int_eq(0xEA82, bit_lib_crc16(data, data_size, 0x3D65, 0x0000, true, true, 0xFFFF)); // CRC-16/EN-13757 // 0xC2B7 0x3D65 0x0000 false false 0xFFFF mu_assert_int_eq(0xC2B7, bit_lib_crc16(data, data_size, 0x3D65, 0x0000, false, false, 0xFFFF)); // CRC-16/GENIBUS // 0xD64E 0x1021 0xFFFF false false 0xFFFF mu_assert_int_eq(0xD64E, bit_lib_crc16(data, data_size, 0x1021, 0xFFFF, false, false, 0xFFFF)); // CRC-16/MAXIM // 0x44C2 0x8005 0x0000 true true 0xFFFF mu_assert_int_eq(0x44C2, bit_lib_crc16(data, data_size, 0x8005, 0x0000, true, true, 0xFFFF)); // CRC-16/MCRF4XX // 0x6F91 0x1021 0xFFFF true true 0x0000 mu_assert_int_eq(0x6F91, bit_lib_crc16(data, data_size, 0x1021, 0xFFFF, true, true, 0x0000)); // CRC-16/RIELLO // 0x63D0 0x1021 0xB2AA true true 0x0000 mu_assert_int_eq(0x63D0, bit_lib_crc16(data, data_size, 0x1021, 0xB2AA, true, true, 0x0000)); // CRC-16/T10-DIF // 0xD0DB 0x8BB7 0x0000 false false 0x0000 mu_assert_int_eq(0xD0DB, bit_lib_crc16(data, data_size, 0x8BB7, 0x0000, false, false, 0x0000)); // CRC-16/TELEDISK // 0x0FB3 0xA097 0x0000 false false 0x0000 mu_assert_int_eq(0x0FB3, bit_lib_crc16(data, data_size, 0xA097, 0x0000, false, false, 0x0000)); // CRC-16/TMS37157 // 0x26B1 0x1021 0x89EC true true 0x0000 mu_assert_int_eq(0x26B1, bit_lib_crc16(data, data_size, 0x1021, 0x89EC, true, true, 0x0000)); // CRC-16/USB // 0xB4C8 0x8005 0xFFFF true true 0xFFFF mu_assert_int_eq(0xB4C8, bit_lib_crc16(data, data_size, 0x8005, 0xFFFF, true, true, 0xFFFF)); // CRC-A // 0xBF05 0x1021 0xC6C6 true true 0x0000 mu_assert_int_eq(0xBF05, bit_lib_crc16(data, data_size, 0x1021, 0xC6C6, true, true, 0x0000)); // CRC-16/KERMIT // 0x2189 0x1021 0x0000 true true 0x0000 mu_assert_int_eq(0x2189, bit_lib_crc16(data, data_size, 0x1021, 0x0000, true, true, 0x0000)); // CRC-16/MODBUS // 0x4B37 0x8005 0xFFFF true true 0x0000 mu_assert_int_eq(0x4B37, bit_lib_crc16(data, data_size, 0x8005, 0xFFFF, true, true, 0x0000)); // CRC-16/X-25 // 0x906E 0x1021 0xFFFF true true 0xFFFF mu_assert_int_eq(0x906E, bit_lib_crc16(data, data_size, 0x1021, 0xFFFF, true, true, 0xFFFF)); // CRC-16/XMODEM // 0x31C3 0x1021 0x0000 false false 0x0000 mu_assert_int_eq(0x31C3, bit_lib_crc16(data, data_size, 0x1021, 0x0000, false, false, 0x0000)); } MU_TEST(test_bit_lib_num_to_bytes_be) { uint8_t src[8] = {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF}; uint8_t dest[8]; bit_lib_num_to_bytes_be(0x01, 1, dest); mu_assert_mem_eq(src, dest, sizeof(src[0])); bit_lib_num_to_bytes_be(0x0123456789ABCDEF, 4, dest); mu_assert_mem_eq(src + 4, dest, 4 * sizeof(src[0])); bit_lib_num_to_bytes_be(0x0123456789ABCDEF, 8, dest); mu_assert_mem_eq(src, dest, 8 * sizeof(src[0])); bit_lib_num_to_bytes_be(bit_lib_bytes_to_num_be(src, 8), 8, dest); mu_assert_mem_eq(src, dest, 8 * sizeof(src[0])); } MU_TEST(test_bit_lib_num_to_bytes_le) { uint8_t dest[8]; uint8_t n2b_le_expected_1[] = {0x01}; bit_lib_num_to_bytes_le(0x01, 1, dest); mu_assert_mem_eq(n2b_le_expected_1, dest, sizeof(n2b_le_expected_1[0])); uint8_t n2b_le_expected_2[] = {0xEF, 0xCD, 0xAB, 0x89}; bit_lib_num_to_bytes_le(0x0123456789ABCDEF, 4, dest); mu_assert_mem_eq(n2b_le_expected_2, dest, 4 * sizeof(n2b_le_expected_2[0])); uint8_t n2b_le_expected_3[] = {0xEF, 0xCD, 0xAB, 0x89, 0x67, 0x45, 0x23, 0x01}; bit_lib_num_to_bytes_le(0x0123456789ABCDEF, 8, dest); mu_assert_mem_eq(n2b_le_expected_3, dest, 8 * sizeof(n2b_le_expected_3[0])); bit_lib_num_to_bytes_le(bit_lib_bytes_to_num_le(n2b_le_expected_3, 8), 8, dest); mu_assert_mem_eq(n2b_le_expected_3, dest, 8 * sizeof(n2b_le_expected_3[0])); } MU_TEST(test_bit_lib_bytes_to_num_be) { uint8_t src[8] = {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF}; uint64_t res; res = bit_lib_bytes_to_num_be(src, 1); mu_assert_int_eq(0x01, res); res = bit_lib_bytes_to_num_be(src, 4); mu_assert_int_eq(0x01234567, res); res = bit_lib_bytes_to_num_be(src, 8); uint64_t expected = 0x0123456789ABCDEF; mu_assert_mem_eq(&expected, &res, sizeof(expected)); } MU_TEST(test_bit_lib_bytes_to_num_le) { uint8_t src[8] = {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF}; uint64_t res; res = bit_lib_bytes_to_num_le(src, 1); mu_assert_int_eq(0x01, res); res = bit_lib_bytes_to_num_le(src, 4); mu_assert_int_eq(0x67452301, res); res = bit_lib_bytes_to_num_le(src, 8); uint64_t expected = 0xEFCDAB8967452301; mu_assert_mem_eq(&expected, &res, sizeof(expected)); } MU_TEST(test_bit_lib_bytes_to_num_bcd) { uint8_t src[8] = {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF}; uint64_t res; bool is_bcd_res; res = bit_lib_bytes_to_num_bcd(src, 1, &is_bcd_res); mu_assert_int_eq(01, res); mu_assert_int_eq(true, is_bcd_res); res = bit_lib_bytes_to_num_bcd(src, 4, &is_bcd_res); mu_assert_int_eq(1234567, res); mu_assert_int_eq(true, is_bcd_res); uint8_t digits[5] = {0x98, 0x76, 0x54, 0x32, 0x10}; uint64_t expected = 9876543210; res = bit_lib_bytes_to_num_bcd(digits, 5, &is_bcd_res); mu_assert_mem_eq(&expected, &res, sizeof(expected)); mu_assert_int_eq(true, is_bcd_res); res = bit_lib_bytes_to_num_bcd(src, 8, &is_bcd_res); mu_assert_int_eq(false, is_bcd_res); } MU_TEST_SUITE(test_bit_lib) { MU_RUN_TEST(test_bit_lib_increment_index); MU_RUN_TEST(test_bit_lib_is_set); MU_RUN_TEST(test_bit_lib_push); MU_RUN_TEST(test_bit_lib_set_bit); MU_RUN_TEST(test_bit_lib_set_bits); MU_RUN_TEST(test_bit_lib_get_bit); MU_RUN_TEST(test_bit_lib_get_bits); MU_RUN_TEST(test_bit_lib_get_bits_16); MU_RUN_TEST(test_bit_lib_get_bits_32); MU_RUN_TEST(test_bit_lib_get_bits_64); MU_RUN_TEST(test_bit_lib_test_parity_u32); MU_RUN_TEST(test_bit_lib_test_parity); MU_RUN_TEST(test_bit_lib_remove_bit_every_nth); MU_RUN_TEST(test_bit_lib_copy_bits); MU_RUN_TEST(test_bit_lib_reverse_bits); MU_RUN_TEST(test_bit_lib_get_bit_count); MU_RUN_TEST(test_bit_lib_reverse_16_fast); MU_RUN_TEST(test_bit_lib_crc16); MU_RUN_TEST(test_bit_lib_num_to_bytes_be); MU_RUN_TEST(test_bit_lib_num_to_bytes_le); MU_RUN_TEST(test_bit_lib_bytes_to_num_be); MU_RUN_TEST(test_bit_lib_bytes_to_num_le); MU_RUN_TEST(test_bit_lib_bytes_to_num_bcd); } int run_minunit_test_bit_lib(void) { MU_RUN_SUITE(test_bit_lib); return MU_EXIT_CODE; } TEST_API_DEFINE(run_minunit_test_bit_lib) ================================================ FILE: applications/debug/unit_tests/tests/bt/bt_test.c ================================================ #include #include #include "../test.h" // IWYU pragma: keep #include #include #include #define BT_TEST_KEY_STORAGE_FILE_PATH EXT_PATH("unit_tests/bt_test.keys") #define BT_TEST_MIGRATION_FILE_PATH EXT_PATH("unit_tests/bt_migration_test.keys") #define BT_TEST_NVM_RAM_BUFF_SIZE (507 * 4) // The same as in ble NVM storage // Identity root key static const uint8_t gap_legacy_irk[16] = {0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0, 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0}; // Encryption root key static const uint8_t gap_legacy_erk[16] = {0xfe, 0xdc, 0xba, 0x09, 0x87, 0x65, 0x43, 0x21, 0xfe, 0xdc, 0xba, 0x09, 0x87, 0x65, 0x43, 0x21}; // Test constants for migration (matching bt_keys_storage.c) #define BT_KEYS_STORAGE_MAGIC_TEST (0x18) #define BT_KEYS_STORAGE_VERSION_1_TEST (1) typedef struct { Storage* storage; BtKeysStorage* bt_keys_storage; uint8_t* nvm_ram_buff_dut; uint8_t* nvm_ram_buff_ref; } BtTest; BtTest* bt_test = NULL; void bt_test_alloc(void) { bt_test = malloc(sizeof(BtTest)); bt_test->storage = furi_record_open(RECORD_STORAGE); bt_test->nvm_ram_buff_dut = malloc(BT_TEST_NVM_RAM_BUFF_SIZE); bt_test->nvm_ram_buff_ref = malloc(BT_TEST_NVM_RAM_BUFF_SIZE); bt_test->bt_keys_storage = bt_keys_storage_alloc(BT_TEST_KEY_STORAGE_FILE_PATH); bt_keys_storage_set_ram_params( bt_test->bt_keys_storage, bt_test->nvm_ram_buff_dut, BT_TEST_NVM_RAM_BUFF_SIZE); } void bt_test_free(void) { furi_check(bt_test); free(bt_test->nvm_ram_buff_ref); free(bt_test->nvm_ram_buff_dut); bt_keys_storage_free(bt_test->bt_keys_storage); furi_record_close(RECORD_STORAGE); free(bt_test); bt_test = NULL; } static void bt_test_keys_storage_profile(void) { // Emulate nvm change on initial connection const int nvm_change_size_on_connection = 88; for(size_t i = 0; i < nvm_change_size_on_connection; i++) { bt_test->nvm_ram_buff_dut[i] = rand(); bt_test->nvm_ram_buff_ref[i] = bt_test->nvm_ram_buff_dut[i]; } // Emulate update storage on initial connect mu_assert( bt_keys_storage_update( bt_test->bt_keys_storage, bt_test->nvm_ram_buff_dut, nvm_change_size_on_connection), "Failed to update key storage on initial connect"); memset(bt_test->nvm_ram_buff_dut, 0, BT_TEST_NVM_RAM_BUFF_SIZE); mu_assert(bt_keys_storage_load(bt_test->bt_keys_storage), "Failed to load NVM"); mu_assert( memcmp( bt_test->nvm_ram_buff_ref, bt_test->nvm_ram_buff_dut, nvm_change_size_on_connection) == 0, "Wrong buffer loaded"); const int nvm_disconnect_update_offset = 84; const int nvm_disconnect_update_size = 324; const int nvm_total_size = nvm_change_size_on_connection - (nvm_change_size_on_connection - nvm_disconnect_update_offset) + nvm_disconnect_update_size; // Emulate update storage on initial disconnect for(size_t i = nvm_disconnect_update_offset; i < nvm_disconnect_update_offset + nvm_disconnect_update_size; i++) { bt_test->nvm_ram_buff_dut[i] = rand(); bt_test->nvm_ram_buff_ref[i] = bt_test->nvm_ram_buff_dut[i]; } mu_assert( bt_keys_storage_update( bt_test->bt_keys_storage, &bt_test->nvm_ram_buff_dut[nvm_disconnect_update_offset], nvm_disconnect_update_size), "Failed to update key storage on initial disconnect"); memset(bt_test->nvm_ram_buff_dut, 0, BT_TEST_NVM_RAM_BUFF_SIZE); mu_assert(bt_keys_storage_load(bt_test->bt_keys_storage), "Failed to load NVM"); mu_assert( memcmp(bt_test->nvm_ram_buff_ref, bt_test->nvm_ram_buff_dut, nvm_total_size) == 0, "Wrong buffer loaded"); } static void bt_test_keys_remove_test_file(void) { mu_assert( storage_simply_remove(bt_test->storage, BT_TEST_KEY_STORAGE_FILE_PATH), "Can't remove test file"); } // Helper function to create a version 0 file manually static bool bt_test_create_v0_file(const char* file_path, const uint8_t* nvm_data, size_t nvm_size) { // Version 0 files use saved_struct format with magic 0x18, version 0, containing only BLE pairing data return saved_struct_save( file_path, nvm_data, nvm_size, BT_KEYS_STORAGE_MAGIC_TEST, 0); // Version 0 } // Helper function to verify file format version static bool bt_test_verify_file_version(const char* file_path, uint32_t expected_version) { uint8_t magic, version; size_t size; if(!saved_struct_get_metadata(file_path, &magic, &version, &size)) { return false; } return (magic == BT_KEYS_STORAGE_MAGIC_TEST && version == expected_version); } // Test migration from version 0 to version 1, including root key preservation static void bt_test_migration_v0_to_v1(void) { // Create test NVM data const size_t test_nvm_size = 100; uint8_t test_nvm_data[test_nvm_size]; for(size_t i = 0; i < test_nvm_size; i++) { test_nvm_data[i] = (uint8_t)(i & 0xFF); } // Create a version 0 file mu_assert( bt_test_create_v0_file(BT_TEST_MIGRATION_FILE_PATH, test_nvm_data, test_nvm_size), "Failed to create version 0 test file"); // Create BT keys storage and load the v0 file (should trigger migration) BtKeysStorage* migration_storage = bt_keys_storage_alloc(BT_TEST_MIGRATION_FILE_PATH); uint8_t loaded_buffer[BT_TEST_NVM_RAM_BUFF_SIZE]; memset(loaded_buffer, 0, sizeof(loaded_buffer)); bt_keys_storage_set_ram_params(migration_storage, loaded_buffer, sizeof(loaded_buffer)); // Load should succeed and migrate v0 to v1 mu_assert(bt_keys_storage_load(migration_storage), "Failed to load and migrate v0 file"); // Verify the file is now version 1 mu_assert( bt_test_verify_file_version(BT_TEST_MIGRATION_FILE_PATH, BT_KEYS_STORAGE_VERSION_1_TEST), "File was not migrated to version 1"); // Verify the NVM data was preserved during migration mu_assert( memcmp(test_nvm_data, loaded_buffer, test_nvm_size) == 0, "NVM data was corrupted during migration"); // Verify that legacy root keys are used after migration const GapRootSecurityKeys* migrated_keys = bt_keys_storage_get_root_keys(migration_storage); mu_assert( memcmp(migrated_keys->irk, gap_legacy_irk, sizeof(gap_legacy_irk)) == 0, "IRK not set to legacy after migration"); mu_assert( memcmp(migrated_keys->erk, gap_legacy_erk, sizeof(gap_legacy_erk)) == 0, "ERK not set to legacy after migration"); bt_keys_storage_free(migration_storage); storage_simply_remove(bt_test->storage, BT_TEST_MIGRATION_FILE_PATH); } // Test that migration preserves existing pairing data and root keys are not changed on reload static void bt_test_migration_preserves_pairings_and_keys(void) { const size_t pairing_data_size = 200; uint8_t pairing_data[pairing_data_size]; for(size_t i = 0; i < pairing_data_size; i++) { pairing_data[i] = (uint8_t)((i * 7 + 42) & 0xFF); } mu_assert( bt_test_create_v0_file(BT_TEST_MIGRATION_FILE_PATH, pairing_data, pairing_data_size), "Failed to create v0 file with pairing data"); GapRootSecurityKeys keys_after_first_load; for(int iteration = 0; iteration < 2; iteration++) { BtKeysStorage* storage = bt_keys_storage_alloc(BT_TEST_MIGRATION_FILE_PATH); uint8_t buffer[BT_TEST_NVM_RAM_BUFF_SIZE]; memset(buffer, 0, sizeof(buffer)); bt_keys_storage_set_ram_params(storage, buffer, sizeof(buffer)); mu_assert(bt_keys_storage_load(storage), "Failed to load on iteration"); mu_assert( memcmp(pairing_data, buffer, pairing_data_size) == 0, "Pairing data corrupted on iteration"); const GapRootSecurityKeys* keys = bt_keys_storage_get_root_keys(storage); if(iteration == 0) memcpy(&keys_after_first_load, keys, sizeof(GapRootSecurityKeys)); else mu_assert( memcmp(&keys_after_first_load, keys, sizeof(GapRootSecurityKeys)) == 0, "Root keys changed after reload"); bt_keys_storage_free(storage); } storage_simply_remove(bt_test->storage, BT_TEST_MIGRATION_FILE_PATH); } // Test that delete operation generates new secure keys in v1 and does not match legacy static void bt_test_delete_generates_new_keys_and_not_legacy(void) { BtKeysStorage* storage = bt_keys_storage_alloc(BT_TEST_MIGRATION_FILE_PATH); uint8_t buffer[BT_TEST_NVM_RAM_BUFF_SIZE]; memset(buffer, 0x55, sizeof(buffer)); bt_keys_storage_set_ram_params(storage, buffer, sizeof(buffer)); mu_assert(bt_keys_storage_update(storage, buffer, 100), "Failed to create initial v1 file"); const GapRootSecurityKeys* original_keys = bt_keys_storage_get_root_keys(storage); uint8_t original_keys_copy[sizeof(GapRootSecurityKeys)]; memcpy(original_keys_copy, original_keys, sizeof(original_keys_copy)); bt_keys_storage_delete(storage); const GapRootSecurityKeys* new_keys = bt_keys_storage_get_root_keys(storage); mu_assert( memcmp(original_keys_copy, new_keys, sizeof(original_keys_copy)) != 0, "Root keys were not regenerated after delete"); mu_assert( memcmp(new_keys->irk, gap_legacy_irk, sizeof(gap_legacy_irk)) != 0, "IRK after delete should not match legacy"); mu_assert( memcmp(new_keys->erk, gap_legacy_erk, sizeof(gap_legacy_erk)) != 0, "ERK after delete should not match legacy"); bt_keys_storage_free(storage); storage_simply_remove(bt_test->storage, BT_TEST_MIGRATION_FILE_PATH); } MU_TEST(bt_test_keys_storage_serial_profile) { furi_check(bt_test); bt_test_keys_remove_test_file(); bt_test_keys_storage_profile(); bt_test_keys_remove_test_file(); } MU_TEST(bt_test_migration_v0_to_v1_test) { furi_check(bt_test); bt_test_migration_v0_to_v1(); } MU_TEST(bt_test_migration_preserves_pairings_and_keys_test) { furi_check(bt_test); bt_test_migration_preserves_pairings_and_keys(); } MU_TEST(bt_test_delete_generates_new_keys_and_not_legacy_test) { furi_check(bt_test); bt_test_delete_generates_new_keys_and_not_legacy(); } MU_TEST_SUITE(test_bt) { bt_test_alloc(); MU_RUN_TEST(bt_test_keys_storage_serial_profile); MU_RUN_TEST(bt_test_migration_v0_to_v1_test); MU_RUN_TEST(bt_test_migration_preserves_pairings_and_keys_test); MU_RUN_TEST(bt_test_delete_generates_new_keys_and_not_legacy_test); bt_test_free(); } int run_minunit_test_bt(void) { MU_RUN_SUITE(test_bt); return MU_EXIT_CODE; } TEST_API_DEFINE(run_minunit_test_bt) ================================================ FILE: applications/debug/unit_tests/tests/common/common.c ================================================ #include "../test.h" #include "../minunit_vars.h" #include void minunit_print_progress(void) { static const char progress[] = {'\\', '|', '/', '-'}; static uint8_t progress_counter = 0; static uint32_t last_tick = 0; uint32_t current_tick = furi_get_tick(); if(current_tick - last_tick > 20) { last_tick = current_tick; printf("[%c]\033[3D", progress[++progress_counter % COUNT_OF(progress)]); fflush(stdout); } } void minunit_print_fail(const char* str) { printf(_FURI_LOG_CLR_E "%s\r\n" _FURI_LOG_CLR_RESET, str); } void minunit_printf_warning(const char* format, ...) { FuriString* str = furi_string_alloc(); va_list args; va_start(args, format); furi_string_vprintf(str, format, args); va_end(args); printf(_FURI_LOG_CLR_W "%s\r\n" _FURI_LOG_CLR_RESET, furi_string_get_cstr(str)); furi_string_free(str); } int get_minunit_run(void) { return minunit_run; } int get_minunit_assert(void) { return minunit_assert; } int get_minunit_status(void) { return minunit_status; } ================================================ FILE: applications/debug/unit_tests/tests/compress/compress_test.c ================================================ #include "../test.h" // IWYU pragma: keep #include #include #include #include #include #include #include #include #include #define COMPRESS_UNIT_TESTS_PATH(path) EXT_PATH("unit_tests/compress/" path) static void compress_test_reference_comp_decomp() { Storage* storage = furi_record_open(RECORD_STORAGE); File* compressed_file = storage_file_alloc(storage); File* decompressed_file = storage_file_alloc(storage); mu_assert( storage_file_open( compressed_file, COMPRESS_UNIT_TESTS_PATH("compressed.bin"), FSAM_READ, FSOM_OPEN_EXISTING), "Failed to open compressed file"); mu_assert( storage_file_open( decompressed_file, COMPRESS_UNIT_TESTS_PATH("uncompressed.bin"), FSAM_READ, FSOM_OPEN_EXISTING), "Failed to open decompressed file"); uint64_t compressed_ref_size = storage_file_size(compressed_file); uint64_t decompressed_ref_size = storage_file_size(decompressed_file); mu_assert(compressed_ref_size > 0 && decompressed_ref_size > 0, "Invalid file sizes"); uint8_t* compressed_ref_buff = malloc(compressed_ref_size); uint8_t* decompressed_ref_buff = malloc(decompressed_ref_size); mu_assert( storage_file_read(compressed_file, compressed_ref_buff, compressed_ref_size) == compressed_ref_size, "Failed to read compressed file"); mu_assert( storage_file_read(decompressed_file, decompressed_ref_buff, decompressed_ref_size) == decompressed_ref_size, "Failed to read decompressed file"); storage_file_free(compressed_file); storage_file_free(decompressed_file); furi_record_close(RECORD_STORAGE); uint8_t* temp_buffer = malloc(1024); Compress* comp = compress_alloc(CompressTypeHeatshrink, &compress_config_heatshrink_default); size_t encoded_size = 0; mu_assert( compress_encode( comp, decompressed_ref_buff, decompressed_ref_size, temp_buffer, 1024, &encoded_size), "Compress failed"); mu_assert(encoded_size == compressed_ref_size, "Encoded size is not equal to reference size"); mu_assert( memcmp(temp_buffer, compressed_ref_buff, compressed_ref_size) == 0, "Encoded buffer is not equal to reference"); size_t decoded_size = 0; mu_assert( compress_decode( comp, compressed_ref_buff, compressed_ref_size, temp_buffer, 1024, &decoded_size), "Decompress failed"); mu_assert( decoded_size == decompressed_ref_size, "Decoded size is not equal to reference size"); mu_assert( memcmp(temp_buffer, decompressed_ref_buff, decompressed_ref_size) == 0, "Decoded buffer is not equal to reference"); compress_free(comp); free(temp_buffer); free(compressed_ref_buff); free(decompressed_ref_buff); } static void compress_test_random_comp_decomp() { static const size_t src_buffer_size = 1024; static const size_t encoded_buffer_size = 1024; static const size_t small_buffer_size = src_buffer_size / 32; // We only fill half of the buffer with random data, so if anything goes wrong, there's no overflow static const size_t src_data_size = src_buffer_size / 2; Compress* comp = compress_alloc(CompressTypeHeatshrink, &compress_config_heatshrink_default); uint8_t* src_buff = malloc(src_buffer_size); uint8_t* encoded_buff = malloc(encoded_buffer_size); uint8_t* decoded_buff = malloc(src_buffer_size); uint8_t* small_buff = malloc(small_buffer_size); furi_hal_random_fill_buf(src_buff, src_data_size); size_t encoded_size = 0; mu_assert( compress_encode( comp, src_buff, src_data_size, encoded_buff, encoded_buffer_size, &encoded_size), "Compress failed"); mu_assert(encoded_size > 0, "Encoded size is zero"); size_t small_enc_dec_size = 0; mu_assert( compress_encode( comp, src_buff, src_data_size, small_buff, small_buffer_size, &small_enc_dec_size) == false, "Compress to small buffer failed"); size_t decoded_size = 0; mu_assert( compress_decode( comp, encoded_buff, encoded_size, decoded_buff, src_buffer_size, &decoded_size), "Decompress failed"); mu_assert(decoded_size == src_data_size, "Decoded size is not equal to source size"); mu_assert( memcmp(src_buff, decoded_buff, src_data_size) == 0, "Decoded buffer is not equal to source"); mu_assert( compress_decode( comp, encoded_buff, encoded_size, small_buff, small_buffer_size, &small_enc_dec_size) == false, "Decompress to small buffer failed"); free(small_buff); free(src_buff); free(encoded_buff); free(decoded_buff); compress_free(comp); } static int32_t hs_unpacker_file_read(void* context, uint8_t* buffer, size_t size) { File* file = (File*)context; return storage_file_read(file, buffer, size); } static int32_t hs_unpacker_file_write(void* context, uint8_t* buffer, size_t size) { File* file = (File*)context; return storage_file_write(file, buffer, size); } /* Source file was generated with: ```python3 import random, string random.seed(1337) with open("hsstream.out.bin", "wb") as f: for c in random.choices(string.printable, k=1024): for _ in range(random.randint(1, 10)): f.write(c.encode()) ``` It was compressed with heatshrink using the following command: `python3 -m heatshrink2 compress -w 9 -l 4 hsstream.out.bin hsstream.in.bin` */ #define HSSTREAM_IN COMPRESS_UNIT_TESTS_PATH("hsstream.in.bin") #define HSSTREAM_OUT COMPRESS_UNIT_TESTS_PATH("hsstream.out.bin") static void compress_test_heatshrink_stream() { Storage* api = furi_record_open(RECORD_STORAGE); File* comp_file = storage_file_alloc(api); File* dest_file = storage_file_alloc(api); CompressConfigHeatshrink config = { .window_sz2 = 9, .lookahead_sz2 = 4, .input_buffer_sz = 128, }; Compress* compress = compress_alloc(CompressTypeHeatshrink, &config); do { storage_simply_remove(api, HSSTREAM_OUT); mu_assert( storage_file_open(comp_file, HSSTREAM_IN, FSAM_READ, FSOM_OPEN_EXISTING), "Failed to open compressed file"); mu_assert( storage_file_open(dest_file, HSSTREAM_OUT, FSAM_WRITE, FSOM_OPEN_ALWAYS), "Failed to open decompressed file"); mu_assert( compress_decode_streamed( compress, hs_unpacker_file_read, comp_file, hs_unpacker_file_write, dest_file), "Decompression failed"); storage_file_close(dest_file); unsigned char md5[16]; FS_Error file_error; mu_assert( md5_calc_file(dest_file, HSSTREAM_OUT, md5, &file_error), "Failed to calculate md5"); const unsigned char expected_md5[16] = { 0xa3, 0x70, 0xe8, 0x8b, 0xa9, 0x42, 0x74, 0xf4, 0xaa, 0x12, 0x8d, 0x41, 0xd2, 0xb6, 0x71, 0xc9}; mu_assert(memcmp(md5, expected_md5, sizeof(md5)) == 0, "MD5 mismatch after decompression"); storage_simply_remove(api, HSSTREAM_OUT); } while(false); compress_free(compress); storage_file_free(comp_file); storage_file_free(dest_file); furi_record_close(RECORD_STORAGE); } #define HS_TAR_PATH COMPRESS_UNIT_TESTS_PATH("test.ths") #define HS_TAR_EXTRACT_PATH COMPRESS_UNIT_TESTS_PATH("tar_out") static bool file_counter(const char* name, bool is_dir, void* context) { UNUSED(name); UNUSED(is_dir); int32_t* n_entries = (int32_t*)context; (*n_entries)++; return true; } /* Heatshrink tar file contents and MD5 sums: file1.txt: 64295676ceed5cce2d0dcac402e4bda4 file2.txt: 188f67f297eedd7bf3d6a4d3c2fc31c4 dir/file3.txt: 34d98ad8135ffe502dba374690136d16 dir/big_file.txt: ee169c1e1791a4d319dbfaefaa850e98 dir/nested_dir/file4.txt: e099fcb2aaa0672375eaedc549247ee6 dir/nested_dir/empty_file.txt: d41d8cd98f00b204e9800998ecf8427e XOR of all MD5 sums: 92ed5729786d0e1176d047e35f52d376 */ static void compress_test_heatshrink_tar() { Storage* api = furi_record_open(RECORD_STORAGE); TarArchive* archive = tar_archive_alloc(api); FuriString* path = furi_string_alloc(); FileInfo fileinfo; File* file = storage_file_alloc(api); do { storage_simply_remove_recursive(api, HS_TAR_EXTRACT_PATH); mu_assert(storage_simply_mkdir(api, HS_TAR_EXTRACT_PATH), "Failed to create extract dir"); mu_assert( tar_archive_get_mode_for_path(HS_TAR_PATH) == TarOpenModeReadHeatshrink, "Invalid mode for heatshrink tar"); mu_assert( tar_archive_open(archive, HS_TAR_PATH, TarOpenModeReadHeatshrink), "Failed to open heatshrink tar"); int32_t n_entries = 0; tar_archive_set_file_callback(archive, file_counter, &n_entries); mu_assert( tar_archive_unpack_to(archive, HS_TAR_EXTRACT_PATH, NULL), "Failed to unpack heatshrink tar"); mu_assert(n_entries == 9, "Invalid number of entries in heatshrink tar"); uint8_t md5_total[16] = {0}, md5_file[16]; DirWalk* dir_walk = dir_walk_alloc(api); mu_assert(dir_walk_open(dir_walk, HS_TAR_EXTRACT_PATH), "Failed to open dirwalk"); while(dir_walk_read(dir_walk, path, &fileinfo) == DirWalkOK) { if(file_info_is_dir(&fileinfo)) { continue; } mu_assert( md5_calc_file(file, furi_string_get_cstr(path), md5_file, NULL), "Failed to calc md5"); for(size_t i = 0; i < 16; i++) { md5_total[i] ^= md5_file[i]; } } dir_walk_free(dir_walk); static const unsigned char expected_md5[16] = { 0x92, 0xed, 0x57, 0x29, 0x78, 0x6d, 0x0e, 0x11, 0x76, 0xd0, 0x47, 0xe3, 0x5f, 0x52, 0xd3, 0x76}; mu_assert(memcmp(md5_total, expected_md5, sizeof(md5_total)) == 0, "MD5 mismatch"); storage_simply_remove_recursive(api, HS_TAR_EXTRACT_PATH); } while(false); storage_file_free(file); furi_string_free(path); tar_archive_free(archive); furi_record_close(RECORD_STORAGE); } MU_TEST_SUITE(test_compress) { MU_RUN_TEST(compress_test_random_comp_decomp); MU_RUN_TEST(compress_test_reference_comp_decomp); MU_RUN_TEST(compress_test_heatshrink_stream); MU_RUN_TEST(compress_test_heatshrink_tar); } int run_minunit_test_compress(void) { MU_RUN_SUITE(test_compress); return MU_EXIT_CODE; } TEST_API_DEFINE(run_minunit_test_compress) ================================================ FILE: applications/debug/unit_tests/tests/datetime/datetimelib_test.c ================================================ #include #include "../test.h" // IWYU pragma: keep #include MU_TEST(test_datetime_validate_datetime_correct_min) { DateTime correct_min = {0, 0, 0, 1, 1, 2000, 1}; bool result = datetime_validate_datetime(&correct_min); mu_assert_int_eq(true, result); } MU_TEST(test_datetime_validate_datetime_correct_max) { DateTime correct_max = {23, 59, 59, 31, 12, 2099, 7}; bool result = datetime_validate_datetime(&correct_max); mu_assert_int_eq(true, result); } MU_TEST(test_datetime_validate_datetime_incorrect_second) { DateTime incorrect_sec = {0, 0, 60, 1, 1, 2000, 1}; bool result = datetime_validate_datetime(&incorrect_sec); mu_assert_int_eq(false, result); } MU_TEST(test_datetime_validate_datetime_incorrect_minute) { DateTime incorrect_min = {0, 60, 0, 1, 1, 2000, 1}; bool result = datetime_validate_datetime(&incorrect_min); mu_assert_int_eq(false, result); } MU_TEST(test_datetime_validate_datetime_incorrect_hour) { DateTime incorrect_hour = {24, 0, 0, 1, 1, 2000, 1}; bool result = datetime_validate_datetime(&incorrect_hour); mu_assert_int_eq(false, result); } MU_TEST(test_datetime_validate_datetime_incorrect_day_min) { DateTime incorrect_day_min = {0, 0, 0, 0, 1, 2000, 1}; bool result = datetime_validate_datetime(&incorrect_day_min); mu_assert_int_eq(false, result); } MU_TEST(test_datetime_validate_datetime_incorrect_day_max) { DateTime incorrect_day_max = {0, 0, 0, 32, 1, 2000, 1}; bool result = datetime_validate_datetime(&incorrect_day_max); mu_assert_int_eq(false, result); } MU_TEST(test_datetime_validate_datetime_incorrect_month_min) { DateTime incorrect_month_min = {0, 0, 0, 1, 0, 2000, 1}; bool result = datetime_validate_datetime(&incorrect_month_min); mu_assert_int_eq(false, result); } MU_TEST(test_datetime_validate_datetime_incorrect_month_max) { DateTime incorrect_month_max = {0, 0, 0, 1, 13, 2000, 1}; bool result = datetime_validate_datetime(&incorrect_month_max); mu_assert_int_eq(false, result); } MU_TEST(test_datetime_validate_datetime_incorrect_year_min) { DateTime incorrect_year_min = {0, 0, 0, 1, 1, 1999, 1}; bool result = datetime_validate_datetime(&incorrect_year_min); mu_assert_int_eq(false, result); } MU_TEST(test_datetime_validate_datetime_incorrect_year_max) { DateTime incorrect_year_max = {0, 0, 0, 1, 1, 2100, 1}; bool result = datetime_validate_datetime(&incorrect_year_max); mu_assert_int_eq(false, result); } MU_TEST(test_datetime_validate_datetime_incorrect_weekday_min) { DateTime incorrect_weekday_min = {0, 0, 0, 1, 1, 2000, 0}; bool result = datetime_validate_datetime(&incorrect_weekday_min); mu_assert_int_eq(false, result); } MU_TEST(test_datetime_validate_datetime_incorrect_weekday_max) { DateTime incorrect_weekday_max = {0, 0, 0, 1, 1, 2000, 8}; bool result = datetime_validate_datetime(&incorrect_weekday_max); mu_assert_int_eq(false, result); } MU_TEST_SUITE(test_datetime_validate_datetime) { MU_RUN_TEST(test_datetime_validate_datetime_correct_min); MU_RUN_TEST(test_datetime_validate_datetime_correct_max); MU_RUN_TEST(test_datetime_validate_datetime_incorrect_second); MU_RUN_TEST(test_datetime_validate_datetime_incorrect_minute); MU_RUN_TEST(test_datetime_validate_datetime_incorrect_hour); MU_RUN_TEST(test_datetime_validate_datetime_incorrect_day_min); MU_RUN_TEST(test_datetime_validate_datetime_incorrect_day_max); MU_RUN_TEST(test_datetime_validate_datetime_incorrect_month_min); MU_RUN_TEST(test_datetime_validate_datetime_incorrect_month_max); MU_RUN_TEST(test_datetime_validate_datetime_incorrect_year_min); MU_RUN_TEST(test_datetime_validate_datetime_incorrect_year_max); MU_RUN_TEST(test_datetime_validate_datetime_incorrect_weekday_min); MU_RUN_TEST(test_datetime_validate_datetime_incorrect_weekday_max); } MU_TEST(test_datetime_timestamp_to_datetime_min) { uint32_t test_value = 0; DateTime min_datetime_expected = {0, 0, 0, 1, 1, 1970, 4}; DateTime result = {0}; datetime_timestamp_to_datetime(test_value, &result); mu_assert_mem_eq(&min_datetime_expected, &result, sizeof(result)); } MU_TEST(test_datetime_timestamp_to_datetime_max) { uint32_t test_value = UINT32_MAX; DateTime max_datetime_expected = {6, 28, 15, 7, 2, 2106, 7}; DateTime result = {0}; datetime_timestamp_to_datetime(test_value, &result); mu_assert_mem_eq(&max_datetime_expected, &result, sizeof(result)); } MU_TEST(test_datetime_timestamp_to_datetime_to_timestamp) { uint32_t test_value = random(); DateTime datetime = {0}; datetime_timestamp_to_datetime(test_value, &datetime); uint32_t result = datetime_datetime_to_timestamp(&datetime); mu_assert_int_eq(test_value, result); } MU_TEST(test_datetime_timestamp_to_datetime_weekday) { uint32_t test_value = 1709748421; // Wed Mar 06 18:07:01 2024 UTC DateTime datetime = {0}; datetime_timestamp_to_datetime(test_value, &datetime); mu_assert_int_eq(datetime.hour, 18); mu_assert_int_eq(datetime.minute, 7); mu_assert_int_eq(datetime.second, 1); mu_assert_int_eq(datetime.day, 6); mu_assert_int_eq(datetime.month, 3); mu_assert_int_eq(datetime.weekday, 3); mu_assert_int_eq(datetime.year, 2024); } MU_TEST_SUITE(test_datetime_timestamp_to_datetime_suite) { MU_RUN_TEST(test_datetime_timestamp_to_datetime_min); MU_RUN_TEST(test_datetime_timestamp_to_datetime_max); MU_RUN_TEST(test_datetime_timestamp_to_datetime_to_timestamp); MU_RUN_TEST(test_datetime_timestamp_to_datetime_weekday); } MU_TEST(test_datetime_datetime_to_timestamp_min) { DateTime min_datetime = {0, 0, 0, 1, 1, 1970, 0}; uint32_t result = datetime_datetime_to_timestamp(&min_datetime); mu_assert_int_eq(0, result); } MU_TEST(test_datetime_datetime_to_timestamp_max) { DateTime max_datetime = {6, 28, 15, 7, 2, 2106, 0}; uint32_t result = datetime_datetime_to_timestamp(&max_datetime); mu_assert_int_eq(UINT32_MAX, result); } MU_TEST_SUITE(test_datetime_datetime_to_timestamp_suite) { MU_RUN_TEST(test_datetime_datetime_to_timestamp_min); MU_RUN_TEST(test_datetime_datetime_to_timestamp_max); } int run_minunit_test_datetime(void) { MU_RUN_SUITE(test_datetime_timestamp_to_datetime_suite); MU_RUN_SUITE(test_datetime_datetime_to_timestamp_suite); MU_RUN_SUITE(test_datetime_validate_datetime); return MU_EXIT_CODE; } TEST_API_DEFINE(run_minunit_test_datetime) ================================================ FILE: applications/debug/unit_tests/tests/dialogs_file_browser_options/dialogs_file_browser_options.c ================================================ #include #include "../test.h" // IWYU pragma: keep MU_TEST(test_dialog_file_browser_set_basic_options_should_init_all_fields) { mu_assert( sizeof(DialogsFileBrowserOptions) == 28, "Changes to `DialogsFileBrowserOptions` should also be reflected in `dialog_file_browser_set_basic_options`"); DialogsFileBrowserOptions options; dialog_file_browser_set_basic_options(&options, ".fap", NULL); // note: this assertions can safely be changed, their primary purpose is to remind the maintainer // to update `dialog_file_browser_set_basic_options` by including all structure fields in it mu_assert_string_eq(".fap", options.extension); mu_assert_null(options.base_path); mu_assert(options.skip_assets, "`skip_assets` should default to `true"); mu_assert(options.hide_dot_files, "`hide_dot_files` should default to `true"); mu_assert_null(options.icon); mu_assert(options.hide_ext, "`hide_ext` should default to `true"); mu_assert_null(options.item_loader_callback); mu_assert_null(options.item_loader_context); } MU_TEST_SUITE(dialogs_file_browser_options) { MU_RUN_TEST(test_dialog_file_browser_set_basic_options_should_init_all_fields); } int run_minunit_test_dialogs_file_browser_options(void) { MU_RUN_SUITE(dialogs_file_browser_options); return MU_EXIT_CODE; } TEST_API_DEFINE(run_minunit_test_dialogs_file_browser_options) ================================================ FILE: applications/debug/unit_tests/tests/dirwalk/dirwalk_test.c ================================================ #include "../test.h" // IWYU pragma: keep #include #include #include static const char* const storage_test_dirwalk_paths[] = { "1", "11", "111", "1/2", "1/22", "1/222", "11/2", "111/2", "111/22", "111/22/33", }; static const char* const storage_test_dirwalk_files[] = { "file1.test", "file2.test", "file3.ext_test", "1/file1.test", "111/22/33/file1.test", "111/22/33/file2.test", "111/22/33/file3.ext_test", "111/22/33/file4.ext_test", }; typedef struct { const char* const path; bool is_dir; } StorageTestPathDesc; const StorageTestPathDesc storage_test_dirwalk_full[] = { {.path = "1", .is_dir = true}, {.path = "11", .is_dir = true}, {.path = "111", .is_dir = true}, {.path = "1/2", .is_dir = true}, {.path = "1/22", .is_dir = true}, {.path = "1/222", .is_dir = true}, {.path = "11/2", .is_dir = true}, {.path = "111/2", .is_dir = true}, {.path = "111/22", .is_dir = true}, {.path = "111/22/33", .is_dir = true}, {.path = "file1.test", .is_dir = false}, {.path = "file2.test", .is_dir = false}, {.path = "file3.ext_test", .is_dir = false}, {.path = "1/file1.test", .is_dir = false}, {.path = "111/22/33/file1.test", .is_dir = false}, {.path = "111/22/33/file2.test", .is_dir = false}, {.path = "111/22/33/file3.ext_test", .is_dir = false}, {.path = "111/22/33/file4.ext_test", .is_dir = false}, }; const StorageTestPathDesc storage_test_dirwalk_no_recursive[] = { {.path = "1", .is_dir = true}, {.path = "11", .is_dir = true}, {.path = "111", .is_dir = true}, {.path = "file1.test", .is_dir = false}, {.path = "file2.test", .is_dir = false}, {.path = "file3.ext_test", .is_dir = false}, }; const StorageTestPathDesc storage_test_dirwalk_filter[] = { {.path = "file1.test", .is_dir = false}, {.path = "file2.test", .is_dir = false}, {.path = "1/file1.test", .is_dir = false}, {.path = "111/22/33/file1.test", .is_dir = false}, {.path = "111/22/33/file2.test", .is_dir = false}, }; typedef struct { bool is_dir; bool visited; } StorageTestPath; DICT_DEF2(StorageTestPathDict, FuriString*, FURI_STRING_OPLIST, StorageTestPath, M_POD_OPLIST) static StorageTestPathDict_t* storage_test_paths_alloc(const StorageTestPathDesc paths[], size_t paths_count) { StorageTestPathDict_t* data = malloc(sizeof(StorageTestPathDict_t)); StorageTestPathDict_init(*data); for(size_t i = 0; i < paths_count; i++) { FuriString* key; key = furi_string_alloc_set(paths[i].path); StorageTestPath value = { .is_dir = paths[i].is_dir, .visited = false, }; StorageTestPathDict_set_at(*data, key, value); furi_string_free(key); } return data; } static void storage_test_paths_free(StorageTestPathDict_t* data) { StorageTestPathDict_clear(*data); free(data); } static bool storage_test_paths_mark(StorageTestPathDict_t* data, FuriString* path, bool is_dir) { bool found = false; StorageTestPath* record = StorageTestPathDict_get(*data, path); if(record) { if(is_dir == record->is_dir) { if(record->visited == false) { record->visited = true; found = true; } } } return found; } static bool storage_test_paths_check(StorageTestPathDict_t* data) { bool error = false; StorageTestPathDict_it_t it; for(StorageTestPathDict_it(it, *data); !StorageTestPathDict_end_p(it); StorageTestPathDict_next(it)) { const StorageTestPathDict_itref_t* itref = StorageTestPathDict_cref(it); if(itref->value.visited == false) { error = true; break; } } return error; } static bool write_file_13DA(Storage* storage, const char* path) { File* file = storage_file_alloc(storage); bool result = false; if(storage_file_open(file, path, FSAM_WRITE, FSOM_CREATE_ALWAYS)) { result = (storage_file_write(file, "13DA", 4) == 4); } storage_file_close(file); storage_file_free(file); return result; } static void storage_dirs_create(Storage* storage, const char* base) { FuriString* path; path = furi_string_alloc(); storage_common_mkdir(storage, base); for(size_t i = 0; i < COUNT_OF(storage_test_dirwalk_paths); i++) { furi_string_printf(path, "%s/%s", base, storage_test_dirwalk_paths[i]); storage_common_mkdir(storage, furi_string_get_cstr(path)); } for(size_t i = 0; i < COUNT_OF(storage_test_dirwalk_files); i++) { furi_string_printf(path, "%s/%s", base, storage_test_dirwalk_files[i]); write_file_13DA(storage, furi_string_get_cstr(path)); } furi_string_free(path); } MU_TEST_1(test_dirwalk_full, Storage* storage) { FuriString* path; path = furi_string_alloc(); FileInfo fileinfo; StorageTestPathDict_t* paths = storage_test_paths_alloc(storage_test_dirwalk_full, COUNT_OF(storage_test_dirwalk_full)); DirWalk* dir_walk = dir_walk_alloc(storage); mu_check(dir_walk_open(dir_walk, EXT_PATH("dirwalk"))); while(dir_walk_read(dir_walk, path, &fileinfo) == DirWalkOK) { furi_string_right(path, strlen(EXT_PATH("dirwalk/"))); mu_check(storage_test_paths_mark(paths, path, file_info_is_dir(&fileinfo))); } dir_walk_free(dir_walk); furi_string_free(path); mu_check(storage_test_paths_check(paths) == false); storage_test_paths_free(paths); } MU_TEST_1(test_dirwalk_no_recursive, Storage* storage) { FuriString* path; path = furi_string_alloc(); FileInfo fileinfo; StorageTestPathDict_t* paths = storage_test_paths_alloc( storage_test_dirwalk_no_recursive, COUNT_OF(storage_test_dirwalk_no_recursive)); DirWalk* dir_walk = dir_walk_alloc(storage); dir_walk_set_recursive(dir_walk, false); mu_check(dir_walk_open(dir_walk, EXT_PATH("dirwalk"))); while(dir_walk_read(dir_walk, path, &fileinfo) == DirWalkOK) { furi_string_right(path, strlen(EXT_PATH("dirwalk/"))); mu_check(storage_test_paths_mark(paths, path, file_info_is_dir(&fileinfo))); } dir_walk_free(dir_walk); furi_string_free(path); mu_check(storage_test_paths_check(paths) == false); storage_test_paths_free(paths); } static bool test_dirwalk_filter_no_folder_ext(const char* name, FileInfo* fileinfo, void* ctx) { UNUSED(ctx); // only files if(!file_info_is_dir(fileinfo)) { // with ".test" in name if(strstr(name, ".test") != NULL) { return true; } } return false; } MU_TEST_1(test_dirwalk_filter, Storage* storage) { FuriString* path; path = furi_string_alloc(); FileInfo fileinfo; StorageTestPathDict_t* paths = storage_test_paths_alloc( storage_test_dirwalk_filter, COUNT_OF(storage_test_dirwalk_filter)); DirWalk* dir_walk = dir_walk_alloc(storage); dir_walk_set_filter_cb(dir_walk, test_dirwalk_filter_no_folder_ext, NULL); mu_check(dir_walk_open(dir_walk, EXT_PATH("dirwalk"))); while(dir_walk_read(dir_walk, path, &fileinfo) == DirWalkOK) { furi_string_right(path, strlen(EXT_PATH("dirwalk/"))); mu_check(storage_test_paths_mark(paths, path, file_info_is_dir(&fileinfo))); } dir_walk_free(dir_walk); furi_string_free(path); mu_check(storage_test_paths_check(paths) == false); storage_test_paths_free(paths); } MU_TEST_SUITE(test_dirwalk_suite) { Storage* storage = furi_record_open(RECORD_STORAGE); storage_dirs_create(storage, EXT_PATH("dirwalk")); MU_RUN_TEST_1(test_dirwalk_full, storage); MU_RUN_TEST_1(test_dirwalk_no_recursive, storage); MU_RUN_TEST_1(test_dirwalk_filter, storage); storage_simply_remove_recursive(storage, EXT_PATH("dirwalk")); furi_record_close(RECORD_STORAGE); } int run_minunit_test_dirwalk(void) { MU_RUN_SUITE(test_dirwalk_suite); return MU_EXIT_CODE; } TEST_API_DEFINE(run_minunit_test_dirwalk) ================================================ FILE: applications/debug/unit_tests/tests/expansion/expansion_test.c ================================================ #include "../test.h" // IWYU pragma: keep #include #include #include #define EXPANSION_TEST_GARBAGE_MAGIC (0xB19AF) #define EXPANSION_TEST_GARBAGE_BUF_SIZE (0x100U) #define EXPANSION_TEST_GARBAGE_ITERATIONS (100U) MU_TEST(test_expansion_encoded_size) { ExpansionFrame frame = {}; frame.header.type = ExpansionFrameTypeHeartbeat; mu_assert_int_eq(1, expansion_frame_get_encoded_size(&frame)); frame.header.type = ExpansionFrameTypeStatus; mu_assert_int_eq(2, expansion_frame_get_encoded_size(&frame)); frame.header.type = ExpansionFrameTypeBaudRate; mu_assert_int_eq(5, expansion_frame_get_encoded_size(&frame)); frame.header.type = ExpansionFrameTypeControl; mu_assert_int_eq(2, expansion_frame_get_encoded_size(&frame)); frame.header.type = ExpansionFrameTypeData; for(size_t i = 0; i <= EXPANSION_PROTOCOL_MAX_DATA_SIZE; ++i) { frame.content.data.size = i; mu_assert_int_eq(i + 2, expansion_frame_get_encoded_size(&frame)); } } MU_TEST(test_expansion_remaining_size) { ExpansionFrame frame = {}; size_t remaining_size; mu_check(expansion_frame_get_remaining_size(&frame, 0, &remaining_size)); mu_assert_int_eq(1, remaining_size); frame.header.type = ExpansionFrameTypeHeartbeat; mu_check(expansion_frame_get_remaining_size(&frame, 0, &remaining_size)); mu_assert_int_eq(1, remaining_size); mu_check(expansion_frame_get_remaining_size(&frame, 1, &remaining_size)); mu_assert_int_eq(0, remaining_size); mu_check(expansion_frame_get_remaining_size(&frame, 100, &remaining_size)); mu_assert_int_eq(0, remaining_size); frame.header.type = ExpansionFrameTypeStatus; mu_check(expansion_frame_get_remaining_size(&frame, 0, &remaining_size)); mu_assert_int_eq(1, remaining_size); mu_check(expansion_frame_get_remaining_size(&frame, 1, &remaining_size)); mu_assert_int_eq(1, remaining_size); mu_check(expansion_frame_get_remaining_size(&frame, 2, &remaining_size)); mu_assert_int_eq(0, remaining_size); mu_check(expansion_frame_get_remaining_size(&frame, 100, &remaining_size)); mu_assert_int_eq(0, remaining_size); frame.header.type = ExpansionFrameTypeBaudRate; mu_check(expansion_frame_get_remaining_size(&frame, 0, &remaining_size)); mu_assert_int_eq(1, remaining_size); mu_check(expansion_frame_get_remaining_size(&frame, 1, &remaining_size)); mu_assert_int_eq(4, remaining_size); mu_check(expansion_frame_get_remaining_size(&frame, 5, &remaining_size)); mu_assert_int_eq(0, remaining_size); mu_check(expansion_frame_get_remaining_size(&frame, 100, &remaining_size)); mu_assert_int_eq(0, remaining_size); frame.header.type = ExpansionFrameTypeControl; mu_check(expansion_frame_get_remaining_size(&frame, 0, &remaining_size)); mu_assert_int_eq(1, remaining_size); mu_check(expansion_frame_get_remaining_size(&frame, 1, &remaining_size)); mu_assert_int_eq(1, remaining_size); mu_check(expansion_frame_get_remaining_size(&frame, 2, &remaining_size)); mu_assert_int_eq(0, remaining_size); mu_check(expansion_frame_get_remaining_size(&frame, 100, &remaining_size)); mu_assert_int_eq(0, remaining_size); frame.header.type = ExpansionFrameTypeData; frame.content.data.size = EXPANSION_PROTOCOL_MAX_DATA_SIZE; mu_check(expansion_frame_get_remaining_size(&frame, 0, &remaining_size)); mu_assert_int_eq(1, remaining_size); mu_check(expansion_frame_get_remaining_size(&frame, 1, &remaining_size)); mu_assert_int_eq(1, remaining_size); mu_check(expansion_frame_get_remaining_size(&frame, 2, &remaining_size)); mu_assert_int_eq(EXPANSION_PROTOCOL_MAX_DATA_SIZE, remaining_size); for(size_t i = 0; i <= EXPANSION_PROTOCOL_MAX_DATA_SIZE; ++i) { mu_check(expansion_frame_get_remaining_size(&frame, i + 2, &remaining_size)); mu_assert_int_eq(EXPANSION_PROTOCOL_MAX_DATA_SIZE - i, remaining_size); } mu_check(expansion_frame_get_remaining_size(&frame, 100, &remaining_size)); mu_assert_int_eq(0, remaining_size); } typedef struct { void* data_out; size_t size_available; size_t size_sent; } TestExpansionSendStream; static size_t test_expansion_send_callback(const uint8_t* data, size_t data_size, void* context) { TestExpansionSendStream* stream = context; const size_t size_sent = MIN(data_size, stream->size_available); memcpy(stream->data_out + stream->size_sent, data, size_sent); stream->size_available -= size_sent; stream->size_sent += size_sent; return size_sent; } typedef struct { const void* data_in; size_t size_available; size_t size_received; } TestExpansionReceiveStream; static size_t test_expansion_receive_callback(uint8_t* data, size_t data_size, void* context) { TestExpansionReceiveStream* stream = context; const size_t size_received = MIN(data_size, stream->size_available); memcpy(data, stream->data_in + stream->size_received, size_received); stream->size_available -= size_received; stream->size_received += size_received; return size_received; } MU_TEST(test_expansion_encode_decode_frame) { const ExpansionFrame frame_in = { .header.type = ExpansionFrameTypeData, .content.data.size = 8, .content.data.bytes = {0xde, 0xad, 0xbe, 0xef, 0xfe, 0xed, 0xca, 0xfe}, }; uint8_t encoded_data[sizeof(ExpansionFrame) + sizeof(ExpansionFrameChecksum)]; memset(encoded_data, 0, sizeof(encoded_data)); TestExpansionSendStream send_stream = { .data_out = &encoded_data, .size_available = sizeof(encoded_data), .size_sent = 0, }; const size_t encoded_size = expansion_frame_get_encoded_size(&frame_in); mu_assert_int_eq( expansion_protocol_encode(&frame_in, test_expansion_send_callback, &send_stream), ExpansionProtocolStatusOk); mu_assert_int_eq(encoded_size + sizeof(ExpansionFrameChecksum), send_stream.size_sent); mu_assert_int_eq( expansion_protocol_get_checksum((const uint8_t*)&frame_in, encoded_size), encoded_data[encoded_size]); mu_assert_mem_eq(&frame_in, &encoded_data, encoded_size); TestExpansionReceiveStream stream = { .data_in = encoded_data, .size_available = send_stream.size_sent, .size_received = 0, }; ExpansionFrame frame_out; mu_assert_int_eq( expansion_protocol_decode(&frame_out, test_expansion_receive_callback, &stream), ExpansionProtocolStatusOk); mu_assert_int_eq(encoded_size + sizeof(ExpansionFrameChecksum), stream.size_received); mu_assert_mem_eq(&frame_in, &frame_out, encoded_size); } MU_TEST(test_expansion_garbage_input) { uint8_t garbage_data[EXPANSION_TEST_GARBAGE_BUF_SIZE]; for(uint32_t i = 0; i < EXPANSION_TEST_GARBAGE_ITERATIONS; ++i) { furi_hal_random_fill_buf(garbage_data, sizeof(garbage_data)); size_t remaining_size = EXPANSION_TEST_GARBAGE_MAGIC; if(expansion_frame_get_remaining_size( (ExpansionFrame*)garbage_data, sizeof(garbage_data), &remaining_size)) { // If by chance the garbage data is a valid frame, then the result // must be 0 because the amount of data provided is more than enough mu_assert_int_eq(0, remaining_size); } else { // If the frame is invalid, the remaining_size parameter should be untouched mu_assert_int_eq(EXPANSION_TEST_GARBAGE_MAGIC, remaining_size); } } } MU_TEST_SUITE(test_expansion_suite) { MU_RUN_TEST(test_expansion_encoded_size); MU_RUN_TEST(test_expansion_remaining_size); MU_RUN_TEST(test_expansion_encode_decode_frame); MU_RUN_TEST(test_expansion_garbage_input); } int run_minunit_test_expansion(void) { MU_RUN_SUITE(test_expansion_suite); return MU_EXIT_CODE; } TEST_API_DEFINE(run_minunit_test_expansion) ================================================ FILE: applications/debug/unit_tests/tests/flipper_format/flipper_format_test.c ================================================ #include #include #include #include #include "../test.h" // IWYU pragma: keep #define TEST_DIR_NAME EXT_PATH(".tmp/unit_tests/ff") #define TEST_DIR TEST_DIR_NAME "/" static const char* test_filetype = "Flipper File test"; static const uint32_t test_version = 666; static const char* test_string_key = "String data"; static const char* test_string_data = "String"; static const char* test_string_updated_data = "New string"; static const char* test_int_key = "Int32 data"; static const int32_t test_int_data[] = {1234, -6345, 7813, 0}; static const int32_t test_int_updated_data[] = {-1337, 69}; static const char* test_uint_key = "Uint32 data"; static const uint32_t test_uint_data[] = {1234, 0, 5678, 9098, 7654321}; static const uint32_t test_uint_updated_data[] = {8, 800, 555, 35, 35}; static const char* test_float_key = "Float data"; static const float test_float_data[] = {1.5f, 1000.0f}; static const float test_float_updated_data[] = {1.2f}; static const char* test_bool_key = "Bool data"; static const bool test_bool_data[] = {true, false}; static const bool test_bool_updated_data[] = {false, true, true}; static const char* test_hex_key = "Hex data"; static const uint8_t test_hex_data[] = {0xDE, 0xAD, 0xBE}; static const uint8_t test_hex_updated_data[] = {0xFE, 0xCA}; #define READ_TEST_NIX "ff_nix.test" static const char* test_data_nix = "Filetype: Flipper File test\n" "Version: 666\n" "# This is comment\n" "String data: String\n" "Int32 data: 1234 -6345 7813 0\n" "Uint32 data: 1234 0 5678 9098 7654321\n" "Float data: 1.5 1000.0\n" "Bool data: true false\n" "Hex data: DE AD BE"; #define READ_TEST_WIN "ff_win.test" static const char* test_data_win = "Filetype: Flipper File test\r\n" "Version: 666\r\n" "# This is comment\r\n" "String data: String\r\n" "Int32 data: 1234 -6345 7813 0\r\n" "Uint32 data: 1234 0 5678 9098 7654321\r\n" "Float data: 1.5 1000.0\r\n" "Bool data: true false\r\n" "Hex data: DE AD BE"; #define READ_TEST_FLP "ff_flp.test" #define READ_TEST_ODD "ff_oddities.test" static const char* test_data_odd = "Filetype: Flipper File test\n" // Tabs before newline "Version: 666\t\t\n" "# This is comment\n" // Windows newline in a UNIX file "String data: String\r\n" // Trailing whitespace "Int32 data: 1234 -6345 7813 0 \n" // Extra whitespace "Uint32 data: 1234 0 5678 9098 7654321 \n" // Mixed whitespace "Float data: 1.5\t \t1000.0\n" // Leading tabs after key "Bool data:\t\ttrue false\n" // Mixed trailing whitespace "Hex data: DE AD BE\t "; // data created by user on linux machine static const char* test_file_linux = TEST_DIR READ_TEST_NIX; // data created by user on windows machine static const char* test_file_windows = TEST_DIR READ_TEST_WIN; // data created by flipper itself static const char* test_file_flipper = TEST_DIR READ_TEST_FLP; // data containing odd user input static const char* test_file_oddities = TEST_DIR READ_TEST_ODD; static bool storage_write_string(const char* path, const char* data) { Storage* storage = furi_record_open(RECORD_STORAGE); File* file = storage_file_alloc(storage); bool result = false; do { if(!storage_file_open(file, path, FSAM_WRITE, FSOM_CREATE_ALWAYS)) break; if(storage_file_write(file, data, strlen(data)) != strlen(data)) break; result = true; } while(false); storage_file_close(file); storage_file_free(file); furi_record_close(RECORD_STORAGE); return result; } static void tests_setup(void) { Storage* storage = furi_record_open(RECORD_STORAGE); mu_assert(storage_simply_remove_recursive(storage, TEST_DIR_NAME), "Cannot clean data"); mu_assert(storage_simply_mkdir(storage, TEST_DIR_NAME), "Cannot create dir"); furi_record_close(RECORD_STORAGE); } static void tests_teardown(void) { Storage* storage = furi_record_open(RECORD_STORAGE); mu_assert(storage_simply_remove_recursive(storage, TEST_DIR_NAME), "Cannot clean data"); furi_record_close(RECORD_STORAGE); } static bool test_read(const char* file_name) { Storage* storage = furi_record_open(RECORD_STORAGE); bool result = false; FlipperFormat* file = flipper_format_file_alloc(storage); FuriString* string_value; string_value = furi_string_alloc(); uint32_t uint32_value; void* scratchpad = malloc(512); do { if(!flipper_format_file_open_existing(file, file_name)) break; if(!flipper_format_read_header(file, string_value, &uint32_value)) break; if(furi_string_cmp_str(string_value, test_filetype) != 0) break; if(uint32_value != test_version) break; if(!flipper_format_read_string(file, test_string_key, string_value)) break; if(furi_string_cmp_str(string_value, test_string_data) != 0) break; if(!flipper_format_get_value_count(file, test_int_key, &uint32_value)) break; if(uint32_value != COUNT_OF(test_int_data)) break; if(!flipper_format_read_int32(file, test_int_key, scratchpad, uint32_value)) break; if(memcmp(scratchpad, test_int_data, sizeof(int32_t) * COUNT_OF(test_int_data)) != 0) break; if(!flipper_format_get_value_count(file, test_uint_key, &uint32_value)) break; if(uint32_value != COUNT_OF(test_uint_data)) break; if(!flipper_format_read_uint32(file, test_uint_key, scratchpad, uint32_value)) break; if(memcmp(scratchpad, test_uint_data, sizeof(uint32_t) * COUNT_OF(test_uint_data)) != 0) break; if(!flipper_format_get_value_count(file, test_float_key, &uint32_value)) break; if(uint32_value != COUNT_OF(test_float_data)) break; if(!flipper_format_read_float(file, test_float_key, scratchpad, uint32_value)) break; if(memcmp(scratchpad, test_float_data, sizeof(float) * COUNT_OF(test_float_data)) != 0) break; if(!flipper_format_get_value_count(file, test_bool_key, &uint32_value)) break; if(uint32_value != COUNT_OF(test_bool_data)) break; if(!flipper_format_read_bool(file, test_bool_key, scratchpad, uint32_value)) break; if(memcmp(scratchpad, test_bool_data, sizeof(bool) * COUNT_OF(test_bool_data)) != 0) break; if(!flipper_format_get_value_count(file, test_hex_key, &uint32_value)) break; if(uint32_value != COUNT_OF(test_hex_data)) break; if(!flipper_format_read_hex(file, test_hex_key, scratchpad, uint32_value)) break; if(memcmp(scratchpad, test_hex_data, sizeof(uint8_t) * COUNT_OF(test_hex_data)) != 0) break; result = true; } while(false); free(scratchpad); furi_string_free(string_value); flipper_format_free(file); furi_record_close(RECORD_STORAGE); return result; } static bool test_read_updated(const char* file_name) { Storage* storage = furi_record_open(RECORD_STORAGE); bool result = false; FlipperFormat* file = flipper_format_file_alloc(storage); FuriString* string_value; string_value = furi_string_alloc(); uint32_t uint32_value; void* scratchpad = malloc(512); do { if(!flipper_format_file_open_existing(file, file_name)) break; if(!flipper_format_read_header(file, string_value, &uint32_value)) break; if(furi_string_cmp_str(string_value, test_filetype) != 0) break; if(uint32_value != test_version) break; if(!flipper_format_read_string(file, test_string_key, string_value)) break; if(furi_string_cmp_str(string_value, test_string_updated_data) != 0) break; if(!flipper_format_get_value_count(file, test_int_key, &uint32_value)) break; if(uint32_value != COUNT_OF(test_int_updated_data)) break; if(!flipper_format_read_int32(file, test_int_key, scratchpad, uint32_value)) break; if(memcmp( scratchpad, test_int_updated_data, sizeof(int32_t) * COUNT_OF(test_int_updated_data)) != 0) break; if(!flipper_format_get_value_count(file, test_uint_key, &uint32_value)) break; if(uint32_value != COUNT_OF(test_uint_updated_data)) break; if(!flipper_format_read_uint32(file, test_uint_key, scratchpad, uint32_value)) break; if(memcmp( scratchpad, test_uint_updated_data, sizeof(uint32_t) * COUNT_OF(test_uint_updated_data)) != 0) break; if(!flipper_format_get_value_count(file, test_float_key, &uint32_value)) break; if(uint32_value != COUNT_OF(test_float_updated_data)) break; if(!flipper_format_read_float(file, test_float_key, scratchpad, uint32_value)) break; if(memcmp( scratchpad, test_float_updated_data, sizeof(float) * COUNT_OF(test_float_updated_data)) != 0) break; if(!flipper_format_get_value_count(file, test_bool_key, &uint32_value)) break; if(uint32_value != COUNT_OF(test_bool_updated_data)) break; if(!flipper_format_read_bool(file, test_bool_key, scratchpad, uint32_value)) break; if(memcmp( scratchpad, test_bool_updated_data, sizeof(bool) * COUNT_OF(test_bool_updated_data)) != 0) break; if(!flipper_format_get_value_count(file, test_hex_key, &uint32_value)) break; if(uint32_value != COUNT_OF(test_hex_updated_data)) break; if(!flipper_format_read_hex(file, test_hex_key, scratchpad, uint32_value)) break; if(memcmp( scratchpad, test_hex_updated_data, sizeof(uint8_t) * COUNT_OF(test_hex_updated_data)) != 0) break; result = true; } while(false); free(scratchpad); furi_string_free(string_value); flipper_format_free(file); furi_record_close(RECORD_STORAGE); return result; } static bool test_write(const char* file_name) { Storage* storage = furi_record_open(RECORD_STORAGE); bool result = false; FlipperFormat* file = flipper_format_file_alloc(storage); do { if(!flipper_format_file_open_always(file, file_name)) break; if(!flipper_format_write_header_cstr(file, test_filetype, test_version)) break; if(!flipper_format_write_comment_cstr(file, "This is comment")) break; if(!flipper_format_write_empty_line(file)) break; if(!flipper_format_write_string_cstr(file, test_string_key, test_string_data)) break; if(!flipper_format_write_int32(file, test_int_key, test_int_data, COUNT_OF(test_int_data))) break; if(!flipper_format_write_uint32( file, test_uint_key, test_uint_data, COUNT_OF(test_uint_data))) break; if(!flipper_format_write_float( file, test_float_key, test_float_data, COUNT_OF(test_float_data))) break; if(!flipper_format_write_bool( file, test_bool_key, test_bool_data, COUNT_OF(test_bool_data))) break; if(!flipper_format_write_hex(file, test_hex_key, test_hex_data, COUNT_OF(test_hex_data))) break; result = true; } while(false); flipper_format_free(file); furi_record_close(RECORD_STORAGE); return result; } static bool test_delete_last_key(const char* file_name) { Storage* storage = furi_record_open(RECORD_STORAGE); bool result = false; FlipperFormat* file = flipper_format_file_alloc(storage); do { if(!flipper_format_file_open_existing(file, file_name)) break; if(!flipper_format_delete_key(file, test_hex_key)) break; result = true; } while(false); flipper_format_free(file); furi_record_close(RECORD_STORAGE); return result; } static bool test_append_key(const char* file_name) { Storage* storage = furi_record_open(RECORD_STORAGE); bool result = false; FlipperFormat* file = flipper_format_file_alloc(storage); do { if(!flipper_format_file_open_append(file, file_name)) break; if(!flipper_format_write_hex(file, test_hex_key, test_hex_data, COUNT_OF(test_hex_data))) break; result = true; } while(false); flipper_format_free(file); furi_record_close(RECORD_STORAGE); return result; } static bool test_update(const char* file_name) { Storage* storage = furi_record_open(RECORD_STORAGE); bool result = false; FlipperFormat* file = flipper_format_file_alloc(storage); do { if(!flipper_format_file_open_existing(file, file_name)) break; if(!flipper_format_update_string_cstr(file, test_string_key, test_string_updated_data)) break; if(!flipper_format_update_int32( file, test_int_key, test_int_updated_data, COUNT_OF(test_int_updated_data))) break; if(!flipper_format_update_uint32( file, test_uint_key, test_uint_updated_data, COUNT_OF(test_uint_updated_data))) break; if(!flipper_format_update_float( file, test_float_key, test_float_updated_data, COUNT_OF(test_float_updated_data))) break; if(!flipper_format_update_bool( file, test_bool_key, test_bool_updated_data, COUNT_OF(test_bool_updated_data))) break; if(!flipper_format_update_hex( file, test_hex_key, test_hex_updated_data, COUNT_OF(test_hex_updated_data))) break; result = true; } while(false); flipper_format_free(file); furi_record_close(RECORD_STORAGE); return result; } static bool test_update_backward(const char* file_name) { Storage* storage = furi_record_open(RECORD_STORAGE); bool result = false; FlipperFormat* file = flipper_format_file_alloc(storage); do { if(!flipper_format_file_open_existing(file, file_name)) break; if(!flipper_format_update_string_cstr(file, test_string_key, test_string_data)) break; if(!flipper_format_update_int32(file, test_int_key, test_int_data, COUNT_OF(test_int_data))) break; if(!flipper_format_update_uint32( file, test_uint_key, test_uint_data, COUNT_OF(test_uint_data))) break; if(!flipper_format_update_float( file, test_float_key, test_float_data, COUNT_OF(test_float_data))) break; if(!flipper_format_update_bool( file, test_bool_key, test_bool_data, COUNT_OF(test_bool_data))) break; if(!flipper_format_update_hex(file, test_hex_key, test_hex_data, COUNT_OF(test_hex_data))) break; result = true; } while(false); flipper_format_free(file); furi_record_close(RECORD_STORAGE); return result; } static bool test_write_multikey(const char* file_name) { Storage* storage = furi_record_open(RECORD_STORAGE); bool result = false; FlipperFormat* file = flipper_format_file_alloc(storage); do { if(!flipper_format_file_open_always(file, file_name)) break; if(!flipper_format_write_header_cstr(file, test_filetype, test_version)) break; bool error = false; for(uint8_t index = 0; index < 100; index++) { if(!flipper_format_write_hex(file, test_hex_key, &index, 1)) { error = true; break; } } if(error) break; result = true; } while(false); flipper_format_free(file); furi_record_close(RECORD_STORAGE); return result; } static bool test_read_multikey(const char* file_name) { Storage* storage = furi_record_open(RECORD_STORAGE); bool result = false; FlipperFormat* file = flipper_format_file_alloc(storage); FuriString* string_value; string_value = furi_string_alloc(); uint32_t uint32_value; do { if(!flipper_format_file_open_existing(file, file_name)) break; if(!flipper_format_read_header(file, string_value, &uint32_value)) break; if(furi_string_cmp_str(string_value, test_filetype) != 0) break; if(uint32_value != test_version) break; bool error = false; uint8_t uint8_value; for(uint8_t index = 0; index < 100; index++) { if(!flipper_format_read_hex(file, test_hex_key, &uint8_value, 1)) { error = true; break; } if(uint8_value != index) { error = true; break; } } if(error) break; result = true; } while(false); furi_string_free(string_value); flipper_format_free(file); furi_record_close(RECORD_STORAGE); return result; } MU_TEST(flipper_format_write_test) { mu_assert(storage_write_string(test_file_linux, test_data_nix), "Write test error [Linux]"); mu_assert( storage_write_string(test_file_windows, test_data_win), "Write test error [Windows]"); mu_assert(test_write(test_file_flipper), "Write test error [Flipper]"); } MU_TEST(flipper_format_read_test) { mu_assert(test_read(test_file_linux), "Read test error [Linux]"); mu_assert(test_read(test_file_windows), "Read test error [Windows]"); mu_assert(test_read(test_file_flipper), "Read test error [Flipper]"); } MU_TEST(flipper_format_delete_test) { mu_assert(test_delete_last_key(test_file_linux), "Cannot delete key [Linux]"); mu_assert(test_delete_last_key(test_file_windows), "Cannot delete key [Windows]"); mu_assert(test_delete_last_key(test_file_flipper), "Cannot delete key [Flipper]"); } MU_TEST(flipper_format_delete_result_test) { mu_assert(!test_read(test_file_linux), "Key deleted incorrectly [Linux]"); mu_assert(!test_read(test_file_windows), "Key deleted incorrectly [Windows]"); mu_assert(!test_read(test_file_flipper), "Key deleted incorrectly [Flipper]"); } MU_TEST(flipper_format_append_test) { mu_assert(test_append_key(test_file_linux), "Cannot append data [Linux]"); mu_assert(test_append_key(test_file_windows), "Cannot append data [Windows]"); mu_assert(test_append_key(test_file_flipper), "Cannot append data [Flipper]"); } MU_TEST(flipper_format_append_result_test) { mu_assert(test_read(test_file_linux), "Data appended incorrectly [Linux]"); mu_assert(test_read(test_file_windows), "Data appended incorrectly [Windows]"); mu_assert(test_read(test_file_flipper), "Data appended incorrectly [Flipper]"); } MU_TEST(flipper_format_update_1_test) { mu_assert(test_update(test_file_linux), "Cannot update data #1 [Linux]"); mu_assert(test_update(test_file_windows), "Cannot update data #1 [Windows]"); mu_assert(test_update(test_file_flipper), "Cannot update data #1 [Flipper]"); } MU_TEST(flipper_format_update_1_result_test) { mu_assert(test_read_updated(test_file_linux), "Data #1 updated incorrectly [Linux]"); mu_assert(test_read_updated(test_file_windows), "Data #1 updated incorrectly [Windows]"); mu_assert(test_read_updated(test_file_flipper), "Data #1 updated incorrectly [Flipper]"); } MU_TEST(flipper_format_update_2_test) { mu_assert(test_update_backward(test_file_linux), "Cannot update data #2 [Linux]"); mu_assert(test_update_backward(test_file_windows), "Cannot update data #2 [Windows]"); mu_assert(test_update_backward(test_file_flipper), "Cannot update data #2 [Flipper]"); } MU_TEST(flipper_format_update_2_result_test) { mu_assert(test_read(test_file_linux), "Data #2 updated incorrectly [Linux]"); mu_assert(test_read(test_file_windows), "Data #2 updated incorrectly [Windows]"); mu_assert(test_read(test_file_flipper), "Data #2 updated incorrectly [Flipper]"); } MU_TEST(flipper_format_multikey_test) { mu_assert(test_write_multikey(TEST_DIR "ff_multiline.test"), "Multikey write test error"); mu_assert(test_read_multikey(TEST_DIR "ff_multiline.test"), "Multikey read test error"); } MU_TEST(flipper_format_oddities_test) { mu_assert( storage_write_string(test_file_oddities, test_data_odd), "Write test error [Oddities]"); mu_assert(test_read(test_file_linux), "Read test error [Oddities]"); } MU_TEST_SUITE(flipper_format) { tests_setup(); MU_RUN_TEST(flipper_format_write_test); MU_RUN_TEST(flipper_format_read_test); MU_RUN_TEST(flipper_format_delete_test); MU_RUN_TEST(flipper_format_delete_result_test); MU_RUN_TEST(flipper_format_append_test); MU_RUN_TEST(flipper_format_append_result_test); MU_RUN_TEST(flipper_format_update_1_test); MU_RUN_TEST(flipper_format_update_1_result_test); MU_RUN_TEST(flipper_format_update_2_test); MU_RUN_TEST(flipper_format_update_2_result_test); MU_RUN_TEST(flipper_format_multikey_test); MU_RUN_TEST(flipper_format_oddities_test); tests_teardown(); } int run_minunit_test_flipper_format(void) { MU_RUN_SUITE(flipper_format); return MU_EXIT_CODE; } TEST_API_DEFINE(run_minunit_test_flipper_format) ================================================ FILE: applications/debug/unit_tests/tests/flipper_format_string/flipper_format_string_test.c ================================================ #include #include #include #include #include #include "../test.h" // IWYU pragma: keep static const char* test_filetype = "Flipper Format test"; static const uint32_t test_version = 666; static const char* test_string_key = "String data"; static const char* test_string_data = "String"; static const char* test_string_updated_data = "New string"; static const char* test_string_updated_2_data = "And some more"; static const char* test_int_key = "Int32 data"; static const int32_t test_int_data[] = {1234, -6345, 7813, 0}; static const int32_t test_int_updated_data[] = {-1337, 69}; static const int32_t test_int_updated_2_data[] = {-3, -2, -1, 0, 1, 2, 3}; static const char* test_uint_key = "Uint32 data"; static const uint32_t test_uint_data[] = {1234, 0, 5678, 9098, 7654321}; static const uint32_t test_uint_updated_data[] = {8, 800, 555, 35, 35}; static const uint32_t test_uint_updated_2_data[] = {20, 21}; static const char* test_float_key = "Float data"; static const float test_float_data[] = {1.5f, 1000.0f}; static const float test_float_updated_data[] = {1.2f}; static const float test_float_updated_2_data[] = {0.01f, 0.0f, -51.6f}; static const char* test_hex_key = "Hex data"; static const uint8_t test_hex_data[] = {0xDE, 0xAD, 0xBE}; static const uint8_t test_hex_updated_data[] = {0xFE, 0xCA}; static const uint8_t test_hex_updated_2_data[] = {0xCA, 0xCA, 0x05}; static const char* test_hex_new_key = "New Hex data"; static const uint8_t test_hex_new_data[] = {0xFF, 0x6A, 0x91}; static const char* test_data_nix = "Filetype: Flipper Format test\n" "Version: 666\n" "# This is comment\n" "String data: String\n" "Int32 data: 1234 -6345 7813 0\n" "Uint32 data: 1234 0 5678 9098 7654321\n" "Float data: 1.5 1000.0\n" "Hex data: DE AD BE"; static const char* test_data_win = "Filetype: Flipper Format test\r\n" "Version: 666\r\n" "# This is comment\r\n" "String data: String\r\n" "Int32 data: 1234 -6345 7813 0\r\n" "Uint32 data: 1234 0 5678 9098 7654321\r\n" "Float data: 1.5 1000.0\r\n" "Hex data: DE AD BE"; #define ARRAY_W_COUNT(x) (x), (COUNT_OF(x)) #define ARRAY_W_BSIZE(x) (x), (sizeof(x)) MU_TEST_1(flipper_format_read_and_update_test, FlipperFormat* flipper_format) { FuriString* tmpstr; uint32_t version; uint32_t uint32_data[COUNT_OF(test_uint_data)]; int32_t int32_data[COUNT_OF(test_int_data)]; float float_data[COUNT_OF(test_float_data)]; uint8_t hex_data[COUNT_OF(test_hex_data)]; uint32_t count; // key exist test size_t position_before = stream_tell(flipper_format_get_raw_stream(flipper_format)); mu_check(flipper_format_key_exist(flipper_format, test_hex_key)); mu_assert_int_eq(position_before, stream_tell(flipper_format_get_raw_stream(flipper_format))); mu_check(!flipper_format_key_exist(flipper_format, "invalid key")); mu_assert_int_eq(position_before, stream_tell(flipper_format_get_raw_stream(flipper_format))); // stream seek to end test mu_check(flipper_format_seek_to_end(flipper_format)); mu_assert_int_eq( stream_size(flipper_format_get_raw_stream(flipper_format)), stream_tell(flipper_format_get_raw_stream(flipper_format))); // key exist test position_before = stream_tell(flipper_format_get_raw_stream(flipper_format)); mu_check(flipper_format_key_exist(flipper_format, test_hex_key)); mu_assert_int_eq(position_before, stream_tell(flipper_format_get_raw_stream(flipper_format))); mu_check(!flipper_format_key_exist(flipper_format, "invalid key")); mu_assert_int_eq(position_before, stream_tell(flipper_format_get_raw_stream(flipper_format))); // rewind mu_check(flipper_format_rewind(flipper_format)); // key exist test position_before = stream_tell(flipper_format_get_raw_stream(flipper_format)); mu_check(flipper_format_key_exist(flipper_format, test_hex_key)); mu_assert_int_eq(position_before, stream_tell(flipper_format_get_raw_stream(flipper_format))); mu_check(!flipper_format_key_exist(flipper_format, "invalid key")); mu_assert_int_eq(position_before, stream_tell(flipper_format_get_raw_stream(flipper_format))); // read test tmpstr = furi_string_alloc(); mu_check(flipper_format_read_header(flipper_format, tmpstr, &version)); mu_assert_string_eq(test_filetype, furi_string_get_cstr(tmpstr)); mu_assert_int_eq(test_version, version); mu_check(flipper_format_read_string(flipper_format, test_string_key, tmpstr)); mu_assert_string_eq(test_string_data, furi_string_get_cstr(tmpstr)); mu_check(flipper_format_get_value_count(flipper_format, test_int_key, &count)); mu_assert_int_eq(COUNT_OF(test_int_data), count); mu_check(flipper_format_read_int32(flipper_format, test_int_key, ARRAY_W_COUNT(int32_data))); mu_check(memcmp(test_int_data, ARRAY_W_BSIZE(int32_data)) == 0); mu_check(flipper_format_get_value_count(flipper_format, test_uint_key, &count)); mu_assert_int_eq(COUNT_OF(test_uint_data), count); mu_check( flipper_format_read_uint32(flipper_format, test_uint_key, ARRAY_W_COUNT(uint32_data))); mu_check(memcmp(test_uint_data, ARRAY_W_BSIZE(uint32_data)) == 0); mu_check(flipper_format_get_value_count(flipper_format, test_float_key, &count)); mu_assert_int_eq(COUNT_OF(test_float_data), count); mu_check(flipper_format_read_float(flipper_format, test_float_key, ARRAY_W_COUNT(float_data))); mu_check(memcmp(test_float_data, ARRAY_W_BSIZE(float_data)) == 0); mu_check(flipper_format_get_value_count(flipper_format, test_hex_key, &count)); mu_assert_int_eq(COUNT_OF(test_hex_data), count); mu_check(flipper_format_read_hex(flipper_format, test_hex_key, ARRAY_W_COUNT(hex_data))); mu_check(memcmp(test_hex_data, ARRAY_W_BSIZE(hex_data)) == 0); mu_check(!flipper_format_read_string(flipper_format, "Key that doesn't exist", tmpstr)); furi_string_free(tmpstr); // update data mu_check(flipper_format_rewind(flipper_format)); mu_check(flipper_format_update_string_cstr( flipper_format, test_string_key, test_string_updated_data)); mu_check(flipper_format_update_int32( flipper_format, test_int_key, ARRAY_W_COUNT(test_int_updated_data))); mu_check(flipper_format_update_uint32( flipper_format, test_uint_key, ARRAY_W_COUNT(test_uint_updated_data))); mu_check(flipper_format_update_float( flipper_format, test_float_key, ARRAY_W_COUNT(test_float_updated_data))); mu_check(flipper_format_update_hex( flipper_format, test_hex_key, ARRAY_W_COUNT(test_hex_updated_data))); // read updated data test uint32_t uint32_updated_data[COUNT_OF(test_uint_updated_data)]; int32_t int32_updated_data[COUNT_OF(test_int_updated_data)]; float float_updated_data[COUNT_OF(test_float_updated_data)]; uint8_t hex_updated_data[COUNT_OF(test_hex_updated_data)]; mu_check(flipper_format_rewind(flipper_format)); tmpstr = furi_string_alloc(); mu_check(flipper_format_read_header(flipper_format, tmpstr, &version)); mu_assert_string_eq(test_filetype, furi_string_get_cstr(tmpstr)); mu_assert_int_eq(test_version, version); mu_check(flipper_format_read_string(flipper_format, test_string_key, tmpstr)); mu_assert_string_eq(test_string_updated_data, furi_string_get_cstr(tmpstr)); mu_check(flipper_format_get_value_count(flipper_format, test_int_key, &count)); mu_assert_int_eq(COUNT_OF(test_int_updated_data), count); mu_check(flipper_format_read_int32( flipper_format, test_int_key, ARRAY_W_COUNT(int32_updated_data))); mu_check(memcmp(test_int_updated_data, ARRAY_W_BSIZE(int32_updated_data)) == 0); mu_check(flipper_format_get_value_count(flipper_format, test_uint_key, &count)); mu_assert_int_eq(COUNT_OF(test_uint_updated_data), count); mu_check(flipper_format_read_uint32( flipper_format, test_uint_key, ARRAY_W_COUNT(uint32_updated_data))); mu_check(memcmp(test_uint_updated_data, ARRAY_W_BSIZE(uint32_updated_data)) == 0); mu_check(flipper_format_get_value_count(flipper_format, test_float_key, &count)); mu_assert_int_eq(COUNT_OF(test_float_updated_data), count); mu_check(flipper_format_read_float( flipper_format, test_float_key, ARRAY_W_COUNT(float_updated_data))); mu_check(memcmp(test_float_updated_data, ARRAY_W_BSIZE(float_updated_data)) == 0); mu_check(flipper_format_get_value_count(flipper_format, test_hex_key, &count)); mu_assert_int_eq(COUNT_OF(test_hex_updated_data), count); mu_check( flipper_format_read_hex(flipper_format, test_hex_key, ARRAY_W_COUNT(hex_updated_data))); mu_check(memcmp(test_hex_updated_data, ARRAY_W_BSIZE(hex_updated_data)) == 0); mu_check(!flipper_format_read_string(flipper_format, "Key that doesn't exist", tmpstr)); furi_string_free(tmpstr); // update data mu_check(flipper_format_rewind(flipper_format)); mu_check(flipper_format_insert_or_update_string_cstr( flipper_format, test_string_key, test_string_updated_2_data)); mu_check(flipper_format_insert_or_update_int32( flipper_format, test_int_key, ARRAY_W_COUNT(test_int_updated_2_data))); mu_check(flipper_format_insert_or_update_uint32( flipper_format, test_uint_key, ARRAY_W_COUNT(test_uint_updated_2_data))); mu_check(flipper_format_insert_or_update_float( flipper_format, test_float_key, ARRAY_W_COUNT(test_float_updated_2_data))); mu_check(flipper_format_insert_or_update_hex( flipper_format, test_hex_key, ARRAY_W_COUNT(test_hex_updated_2_data))); mu_check(flipper_format_insert_or_update_hex( flipper_format, test_hex_new_key, ARRAY_W_COUNT(test_hex_new_data))); uint32_t uint32_updated_2_data[COUNT_OF(test_uint_updated_2_data)]; int32_t int32_updated_2_data[COUNT_OF(test_int_updated_2_data)]; float float_updated_2_data[COUNT_OF(test_float_updated_2_data)]; uint8_t hex_updated_2_data[COUNT_OF(test_hex_updated_2_data)]; uint8_t hex_new_data[COUNT_OF(test_hex_new_data)]; mu_check(flipper_format_rewind(flipper_format)); tmpstr = furi_string_alloc(); mu_check(flipper_format_read_header(flipper_format, tmpstr, &version)); mu_assert_string_eq(test_filetype, furi_string_get_cstr(tmpstr)); mu_assert_int_eq(test_version, version); mu_check(flipper_format_read_string(flipper_format, test_string_key, tmpstr)); mu_assert_string_eq(test_string_updated_2_data, furi_string_get_cstr(tmpstr)); mu_check(flipper_format_get_value_count(flipper_format, test_int_key, &count)); mu_assert_int_eq(COUNT_OF(test_int_updated_2_data), count); mu_check(flipper_format_read_int32( flipper_format, test_int_key, ARRAY_W_COUNT(int32_updated_2_data))); mu_check(memcmp(test_int_updated_2_data, ARRAY_W_BSIZE(int32_updated_2_data)) == 0); mu_check(flipper_format_get_value_count(flipper_format, test_uint_key, &count)); mu_assert_int_eq(COUNT_OF(test_uint_updated_2_data), count); mu_check(flipper_format_read_uint32( flipper_format, test_uint_key, ARRAY_W_COUNT(uint32_updated_2_data))); mu_check(memcmp(test_uint_updated_2_data, ARRAY_W_BSIZE(uint32_updated_2_data)) == 0); mu_check(flipper_format_get_value_count(flipper_format, test_float_key, &count)); mu_assert_int_eq(COUNT_OF(test_float_updated_2_data), count); mu_check(flipper_format_read_float( flipper_format, test_float_key, ARRAY_W_COUNT(float_updated_2_data))); mu_check(memcmp(test_float_updated_2_data, ARRAY_W_BSIZE(float_updated_2_data)) == 0); mu_check(flipper_format_get_value_count(flipper_format, test_hex_key, &count)); mu_assert_int_eq(COUNT_OF(test_hex_updated_2_data), count); mu_check( flipper_format_read_hex(flipper_format, test_hex_key, ARRAY_W_COUNT(hex_updated_2_data))); mu_check(memcmp(test_hex_updated_2_data, ARRAY_W_BSIZE(hex_updated_2_data)) == 0); mu_check(flipper_format_get_value_count(flipper_format, test_hex_new_key, &count)); mu_assert_int_eq(COUNT_OF(test_hex_new_data), count); mu_check( flipper_format_read_hex(flipper_format, test_hex_new_key, ARRAY_W_COUNT(hex_new_data))); mu_check(memcmp(test_hex_new_data, ARRAY_W_BSIZE(hex_new_data)) == 0); mu_check(!flipper_format_read_string(flipper_format, "Key that doesn't exist", tmpstr)); furi_string_free(tmpstr); // delete key test mu_check(flipper_format_rewind(flipper_format)); mu_check(flipper_format_delete_key(flipper_format, test_uint_key)); // deleted key read test mu_check(flipper_format_rewind(flipper_format)); mu_check(!flipper_format_read_uint32( flipper_format, test_uint_key, ARRAY_W_COUNT(uint32_updated_data))); } MU_TEST(flipper_format_string_test) { FlipperFormat* flipper_format = flipper_format_string_alloc(); Stream* stream = flipper_format_get_raw_stream(flipper_format); mu_check(flipper_format_write_header_cstr(flipper_format, test_filetype, test_version)); mu_check(flipper_format_write_comment_cstr(flipper_format, "This is comment")); mu_check(flipper_format_write_string_cstr(flipper_format, test_string_key, test_string_data)); mu_check( flipper_format_write_int32(flipper_format, test_int_key, ARRAY_W_COUNT(test_int_data))); mu_check( flipper_format_write_uint32(flipper_format, test_uint_key, ARRAY_W_COUNT(test_uint_data))); mu_check(flipper_format_write_float( flipper_format, test_float_key, ARRAY_W_COUNT(test_float_data))); mu_check(flipper_format_write_hex(flipper_format, test_hex_key, ARRAY_W_COUNT(test_hex_data))); MU_RUN_TEST_1(flipper_format_read_and_update_test, flipper_format); stream_clean(stream); stream_write_cstring(stream, test_data_nix); MU_RUN_TEST_1(flipper_format_read_and_update_test, flipper_format); stream_clean(stream); stream_write_cstring(stream, test_data_win); MU_RUN_TEST_1(flipper_format_read_and_update_test, flipper_format); flipper_format_free(flipper_format); } MU_TEST(flipper_format_file_test) { Storage* storage = furi_record_open(RECORD_STORAGE); FlipperFormat* flipper_format = flipper_format_file_alloc(storage); mu_check( flipper_format_file_open_always(flipper_format, EXT_PATH(".tmp/unit_tests/flipper.fff"))); Stream* stream = flipper_format_get_raw_stream(flipper_format); mu_check(flipper_format_write_header_cstr(flipper_format, test_filetype, test_version)); mu_check(flipper_format_write_comment_cstr(flipper_format, "This is comment")); mu_check(flipper_format_write_string_cstr(flipper_format, test_string_key, test_string_data)); mu_check( flipper_format_write_int32(flipper_format, test_int_key, ARRAY_W_COUNT(test_int_data))); mu_check( flipper_format_write_uint32(flipper_format, test_uint_key, ARRAY_W_COUNT(test_uint_data))); mu_check(flipper_format_write_float( flipper_format, test_float_key, ARRAY_W_COUNT(test_float_data))); mu_check(flipper_format_write_hex(flipper_format, test_hex_key, ARRAY_W_COUNT(test_hex_data))); MU_RUN_TEST_1(flipper_format_read_and_update_test, flipper_format); stream_clean(stream); stream_write_cstring(stream, test_data_nix); MU_RUN_TEST_1(flipper_format_read_and_update_test, flipper_format); stream_clean(stream); stream_write_cstring(stream, test_data_win); MU_RUN_TEST_1(flipper_format_read_and_update_test, flipper_format); flipper_format_free(flipper_format); furi_record_close(RECORD_STORAGE); } MU_TEST_SUITE(flipper_format_string_suite) { MU_RUN_TEST(flipper_format_string_test); MU_RUN_TEST(flipper_format_file_test); } int run_minunit_test_flipper_format_string(void) { MU_RUN_SUITE(flipper_format_string_suite); return MU_EXIT_CODE; } TEST_API_DEFINE(run_minunit_test_flipper_format_string) ================================================ FILE: applications/debug/unit_tests/tests/float_tools/float_tools_test.c ================================================ #include #include #include "../test.h" // IWYU pragma: keep MU_TEST(float_tools_equal_test) { mu_check(float_is_equal(FLT_MAX, FLT_MAX)); mu_check(float_is_equal(FLT_MIN, FLT_MIN)); mu_check(float_is_equal(-FLT_MAX, -FLT_MAX)); mu_check(float_is_equal(-FLT_MIN, -FLT_MIN)); mu_check(!float_is_equal(FLT_MIN, FLT_MAX)); mu_check(!float_is_equal(-FLT_MIN, FLT_MAX)); mu_check(!float_is_equal(FLT_MIN, -FLT_MAX)); mu_check(!float_is_equal(-FLT_MIN, -FLT_MAX)); const float pi = 3.14159f; mu_check(float_is_equal(pi, pi)); mu_check(float_is_equal(-pi, -pi)); mu_check(!float_is_equal(pi, -pi)); mu_check(!float_is_equal(-pi, pi)); const float one_third = 1.f / 3.f; const float one_third_dec = 0.3333333f; mu_check(one_third != one_third_dec); mu_check(float_is_equal(one_third, one_third_dec)); const float big_num = 1.e12f; const float med_num = 95.389f; const float smol_num = 1.e-12f; mu_check(float_is_equal(big_num, big_num)); mu_check(float_is_equal(med_num, med_num)); mu_check(float_is_equal(smol_num, smol_num)); mu_check(!float_is_equal(smol_num, big_num)); mu_check(!float_is_equal(med_num, smol_num)); mu_check(!float_is_equal(big_num, med_num)); const float more_than_one = 1.f + FLT_EPSILON; const float less_than_one = 1.f - FLT_EPSILON; mu_check(!float_is_equal(more_than_one, less_than_one)); mu_check(!float_is_equal(more_than_one, -less_than_one)); mu_check(!float_is_equal(-more_than_one, less_than_one)); mu_check(!float_is_equal(-more_than_one, -less_than_one)); const float slightly_more_than_one = 1.f + FLT_EPSILON / 2.f; const float slightly_less_than_one = 1.f - FLT_EPSILON / 2.f; mu_check(float_is_equal(slightly_more_than_one, slightly_less_than_one)); mu_check(float_is_equal(-slightly_more_than_one, -slightly_less_than_one)); mu_check(!float_is_equal(slightly_more_than_one, -slightly_less_than_one)); mu_check(!float_is_equal(-slightly_more_than_one, slightly_less_than_one)); } MU_TEST_SUITE(float_tools_suite) { MU_RUN_TEST(float_tools_equal_test); } int run_minunit_test_float_tools(void) { MU_RUN_SUITE(float_tools_suite); return MU_EXIT_CODE; } TEST_API_DEFINE(run_minunit_test_float_tools) ================================================ FILE: applications/debug/unit_tests/tests/furi/furi_errno_test.c ================================================ #include #include #include "../test.h" // IWYU pragma: keep #define TAG "ErrnoTest" #define THREAD_CNT 16 #define ITER_CNT 1000 static int32_t errno_fuzzer(void* context) { int start_value = (int)context; int32_t fails = 0; for(int i = start_value; i < start_value + ITER_CNT; i++) { errno = i; furi_thread_yield(); if(errno != i) fails++; } for(int i = 0; i < ITER_CNT; i++) { errno = 0; furi_thread_yield(); UNUSED(strtol("123456", NULL, 10)); // -V530 furi_thread_yield(); if(errno != 0) fails++; errno = 0; furi_thread_yield(); UNUSED(strtol("123456123456123456123456123456123456123456123456", NULL, 10)); // -V530 furi_thread_yield(); if(errno != ERANGE) fails++; } return fails; } void test_errno_saving(void) { FuriThread* threads[THREAD_CNT]; for(int i = 0; i < THREAD_CNT; i++) { int start_value = i * ITER_CNT; threads[i] = furi_thread_alloc_ex("ErrnoFuzzer", 1024, errno_fuzzer, (void*)start_value); furi_thread_set_priority(threads[i], FuriThreadPriorityNormal); furi_thread_start(threads[i]); } for(int i = 0; i < THREAD_CNT; i++) { furi_thread_join(threads[i]); mu_assert_int_eq(0, furi_thread_get_return_code(threads[i])); furi_thread_free(threads[i]); } } ================================================ FILE: applications/debug/unit_tests/tests/furi/furi_event_loop_test.c ================================================ #include "../test.h" #include #include #include #include #define TAG "TestFuriEventLoop" #define MESSAGE_COUNT (256UL) #define EVENT_FLAG_COUNT (23UL) #define PRIMITIVE_COUNT (4UL) #define RUN_COUNT (2UL) typedef struct { FuriEventLoop* event_loop; uint32_t message_queue_count; uint32_t stream_buffer_count; uint32_t event_flag_count; uint32_t semaphore_count; uint32_t primitives_tested; } TestFuriEventLoopThread; typedef struct { FuriMessageQueue* message_queue; FuriStreamBuffer* stream_buffer; FuriEventFlag* event_flag; FuriSemaphore* semaphore; TestFuriEventLoopThread producer; TestFuriEventLoopThread consumer; } TestFuriEventLoopData; static void test_furi_event_loop_pending_callback(void* context) { furi_check(context); TestFuriEventLoopThread* test_thread = context; furi_check(test_thread->primitives_tested < PRIMITIVE_COUNT); test_thread->primitives_tested++; FURI_LOG_I(TAG, "primitives tested: %lu", test_thread->primitives_tested); if(test_thread->primitives_tested == PRIMITIVE_COUNT) { furi_event_loop_stop(test_thread->event_loop); } } static void test_furi_event_loop_thread_init(TestFuriEventLoopThread* test_thread) { memset(test_thread, 0, sizeof(TestFuriEventLoopThread)); test_thread->event_loop = furi_event_loop_alloc(); } static void test_furi_event_loop_thread_run_and_cleanup(TestFuriEventLoopThread* test_thread) { furi_event_loop_run(test_thread->event_loop); // 2 EventLoop index, 0xFFFFFFFF - all possible flags, emulate uncleared flags xTaskNotifyIndexed(xTaskGetCurrentTaskHandle(), 2, 0xFFFFFFFF, eSetBits); furi_event_loop_free(test_thread->event_loop); } static void test_furi_event_loop_producer_message_queue_callback( FuriEventLoopObject* object, void* context) { furi_check(context); TestFuriEventLoopData* data = context; furi_check(data->message_queue == object); FURI_LOG_I( TAG, "producer MessageQueue: %lu %lu", data->producer.message_queue_count, data->consumer.message_queue_count); if(data->producer.message_queue_count == MESSAGE_COUNT / 2) { furi_event_loop_unsubscribe(data->producer.event_loop, data->message_queue); furi_event_loop_subscribe_message_queue( data->producer.event_loop, data->message_queue, FuriEventLoopEventOut, test_furi_event_loop_producer_message_queue_callback, data); } else if(data->producer.message_queue_count == MESSAGE_COUNT) { furi_event_loop_unsubscribe(data->producer.event_loop, data->message_queue); furi_event_loop_pend_callback( data->producer.event_loop, test_furi_event_loop_pending_callback, &data->producer); return; } data->producer.message_queue_count++; furi_check( furi_message_queue_put(data->message_queue, &data->producer.message_queue_count, 0) == FuriStatusOk); furi_delay_us(furi_hal_random_get() % 100); } static void test_furi_event_loop_producer_stream_buffer_callback( FuriEventLoopObject* object, void* context) { furi_check(context); TestFuriEventLoopData* data = context; furi_check(data->stream_buffer == object); TestFuriEventLoopThread* producer = &data->producer; TestFuriEventLoopThread* consumer = &data->consumer; FURI_LOG_I( TAG, "producer StreamBuffer: %lu %lu", producer->stream_buffer_count, consumer->stream_buffer_count); if(producer->stream_buffer_count == MESSAGE_COUNT / 2) { furi_event_loop_unsubscribe(producer->event_loop, data->stream_buffer); furi_event_loop_subscribe_stream_buffer( producer->event_loop, data->stream_buffer, FuriEventLoopEventOut, test_furi_event_loop_producer_stream_buffer_callback, data); } else if(producer->stream_buffer_count == MESSAGE_COUNT) { furi_event_loop_unsubscribe(producer->event_loop, data->stream_buffer); furi_event_loop_pend_callback( producer->event_loop, test_furi_event_loop_pending_callback, producer); return; } producer->stream_buffer_count++; furi_check( furi_stream_buffer_send( data->stream_buffer, &producer->stream_buffer_count, sizeof(uint32_t), 0) == sizeof(uint32_t)); furi_delay_us(furi_hal_random_get() % 100); } static void test_furi_event_loop_producer_event_flag_callback(FuriEventLoopObject* object, void* context) { furi_check(context); TestFuriEventLoopData* data = context; furi_check(data->event_flag == object); const uint32_t producer_flags = (1UL << data->producer.event_flag_count); const uint32_t consumer_flags = (1UL << data->consumer.event_flag_count); FURI_LOG_I(TAG, "producer EventFlag: 0x%06lX 0x%06lX", producer_flags, consumer_flags); furi_check(furi_event_flag_set(data->event_flag, producer_flags) & producer_flags); if(data->producer.event_flag_count == EVENT_FLAG_COUNT / 2) { furi_event_loop_unsubscribe(data->producer.event_loop, data->event_flag); furi_event_loop_subscribe_event_flag( data->producer.event_loop, data->event_flag, FuriEventLoopEventOut, test_furi_event_loop_producer_event_flag_callback, data); } else if(data->producer.event_flag_count == EVENT_FLAG_COUNT) { furi_event_loop_unsubscribe(data->producer.event_loop, data->event_flag); furi_event_loop_pend_callback( data->producer.event_loop, test_furi_event_loop_pending_callback, &data->producer); return; } data->producer.event_flag_count++; furi_delay_us(furi_hal_random_get() % 100); } static void test_furi_event_loop_producer_semaphore_callback(FuriEventLoopObject* object, void* context) { furi_check(context); TestFuriEventLoopData* data = context; furi_check(data->semaphore == object); TestFuriEventLoopThread* producer = &data->producer; TestFuriEventLoopThread* consumer = &data->consumer; FURI_LOG_I( TAG, "producer Semaphore: %lu %lu", producer->semaphore_count, consumer->semaphore_count); furi_check(furi_semaphore_release(data->semaphore) == FuriStatusOk); if(producer->semaphore_count == MESSAGE_COUNT / 2) { furi_event_loop_unsubscribe(producer->event_loop, data->semaphore); furi_event_loop_subscribe_semaphore( producer->event_loop, data->semaphore, FuriEventLoopEventOut, test_furi_event_loop_producer_semaphore_callback, data); } else if(producer->semaphore_count == MESSAGE_COUNT) { furi_event_loop_unsubscribe(producer->event_loop, data->semaphore); furi_event_loop_pend_callback( producer->event_loop, test_furi_event_loop_pending_callback, producer); return; } data->producer.semaphore_count++; furi_delay_us(furi_hal_random_get() % 100); } static int32_t test_furi_event_loop_producer(void* p) { furi_check(p); TestFuriEventLoopData* data = p; TestFuriEventLoopThread* producer = &data->producer; for(uint32_t i = 0; i < RUN_COUNT; ++i) { FURI_LOG_I(TAG, "producer start run %lu", i); test_furi_event_loop_thread_init(producer); furi_event_loop_subscribe_message_queue( producer->event_loop, data->message_queue, FuriEventLoopEventOut, test_furi_event_loop_producer_message_queue_callback, data); furi_event_loop_subscribe_stream_buffer( producer->event_loop, data->stream_buffer, FuriEventLoopEventOut, test_furi_event_loop_producer_stream_buffer_callback, data); furi_event_loop_subscribe_event_flag( producer->event_loop, data->event_flag, FuriEventLoopEventOut, test_furi_event_loop_producer_event_flag_callback, data); furi_event_loop_subscribe_semaphore( producer->event_loop, data->semaphore, FuriEventLoopEventOut, test_furi_event_loop_producer_semaphore_callback, data); test_furi_event_loop_thread_run_and_cleanup(producer); } FURI_LOG_I(TAG, "producer end"); return 0; } static void test_furi_event_loop_consumer_message_queue_callback( FuriEventLoopObject* object, void* context) { furi_check(context); TestFuriEventLoopData* data = context; furi_check(data->message_queue == object); furi_delay_us(furi_hal_random_get() % 100); furi_check( furi_message_queue_get(data->message_queue, &data->consumer.message_queue_count, 0) == FuriStatusOk); FURI_LOG_I( TAG, "consumer MessageQueue: %lu %lu", data->producer.message_queue_count, data->consumer.message_queue_count); if(data->consumer.message_queue_count == MESSAGE_COUNT / 2) { furi_event_loop_unsubscribe(data->consumer.event_loop, data->message_queue); furi_event_loop_subscribe_message_queue( data->consumer.event_loop, data->message_queue, FuriEventLoopEventIn, test_furi_event_loop_consumer_message_queue_callback, data); } else if(data->consumer.message_queue_count == MESSAGE_COUNT) { furi_event_loop_unsubscribe(data->consumer.event_loop, data->message_queue); furi_event_loop_pend_callback( data->consumer.event_loop, test_furi_event_loop_pending_callback, &data->consumer); } } static void test_furi_event_loop_consumer_stream_buffer_callback( FuriEventLoopObject* object, void* context) { furi_check(context); TestFuriEventLoopData* data = context; furi_check(data->stream_buffer == object); TestFuriEventLoopThread* producer = &data->producer; TestFuriEventLoopThread* consumer = &data->consumer; furi_delay_us(furi_hal_random_get() % 100); furi_check( furi_stream_buffer_receive( data->stream_buffer, &consumer->stream_buffer_count, sizeof(uint32_t), 0) == sizeof(uint32_t)); FURI_LOG_I( TAG, "consumer StreamBuffer: %lu %lu", producer->stream_buffer_count, consumer->stream_buffer_count); if(consumer->stream_buffer_count == MESSAGE_COUNT / 2) { furi_event_loop_unsubscribe(consumer->event_loop, data->stream_buffer); furi_event_loop_subscribe_stream_buffer( consumer->event_loop, data->stream_buffer, FuriEventLoopEventIn, test_furi_event_loop_consumer_stream_buffer_callback, data); } else if(consumer->stream_buffer_count == MESSAGE_COUNT) { furi_event_loop_unsubscribe(data->consumer.event_loop, data->stream_buffer); furi_event_loop_pend_callback( consumer->event_loop, test_furi_event_loop_pending_callback, consumer); } } static void test_furi_event_loop_consumer_event_flag_callback(FuriEventLoopObject* object, void* context) { furi_check(context); TestFuriEventLoopData* data = context; furi_check(data->event_flag == object); furi_delay_us(furi_hal_random_get() % 100); const uint32_t producer_flags = (1UL << data->producer.event_flag_count); const uint32_t consumer_flags = (1UL << data->consumer.event_flag_count); furi_check( furi_event_flag_wait(data->event_flag, consumer_flags, FuriFlagWaitAny, 0) & consumer_flags); FURI_LOG_I(TAG, "consumer EventFlag: 0x%06lX 0x%06lX", producer_flags, consumer_flags); if(data->consumer.event_flag_count == EVENT_FLAG_COUNT / 2) { furi_event_loop_unsubscribe(data->consumer.event_loop, data->event_flag); furi_event_loop_subscribe_event_flag( data->consumer.event_loop, data->event_flag, FuriEventLoopEventIn, test_furi_event_loop_consumer_event_flag_callback, data); } else if(data->consumer.event_flag_count == EVENT_FLAG_COUNT) { furi_event_loop_unsubscribe(data->consumer.event_loop, data->event_flag); furi_event_loop_pend_callback( data->consumer.event_loop, test_furi_event_loop_pending_callback, &data->consumer); return; } data->consumer.event_flag_count++; } static void test_furi_event_loop_consumer_semaphore_callback(FuriEventLoopObject* object, void* context) { furi_check(context); TestFuriEventLoopData* data = context; furi_check(data->semaphore == object); furi_delay_us(furi_hal_random_get() % 100); TestFuriEventLoopThread* producer = &data->producer; TestFuriEventLoopThread* consumer = &data->consumer; furi_check(furi_semaphore_acquire(data->semaphore, 0) == FuriStatusOk); FURI_LOG_I( TAG, "consumer Semaphore: %lu %lu", producer->semaphore_count, consumer->semaphore_count); if(consumer->semaphore_count == MESSAGE_COUNT / 2) { furi_event_loop_unsubscribe(consumer->event_loop, data->semaphore); furi_event_loop_subscribe_semaphore( consumer->event_loop, data->semaphore, FuriEventLoopEventIn, test_furi_event_loop_consumer_semaphore_callback, data); } else if(consumer->semaphore_count == MESSAGE_COUNT) { furi_event_loop_unsubscribe(consumer->event_loop, data->semaphore); furi_event_loop_pend_callback( consumer->event_loop, test_furi_event_loop_pending_callback, consumer); return; } data->consumer.semaphore_count++; } static int32_t test_furi_event_loop_consumer(void* p) { furi_check(p); TestFuriEventLoopData* data = p; TestFuriEventLoopThread* consumer = &data->consumer; for(uint32_t i = 0; i < RUN_COUNT; ++i) { FURI_LOG_I(TAG, "consumer start run %lu", i); test_furi_event_loop_thread_init(consumer); furi_event_loop_subscribe_message_queue( consumer->event_loop, data->message_queue, FuriEventLoopEventIn, test_furi_event_loop_consumer_message_queue_callback, data); furi_event_loop_subscribe_stream_buffer( consumer->event_loop, data->stream_buffer, FuriEventLoopEventIn, test_furi_event_loop_consumer_stream_buffer_callback, data); furi_event_loop_subscribe_event_flag( consumer->event_loop, data->event_flag, FuriEventLoopEventIn, test_furi_event_loop_consumer_event_flag_callback, data); furi_event_loop_subscribe_semaphore( consumer->event_loop, data->semaphore, FuriEventLoopEventIn, test_furi_event_loop_consumer_semaphore_callback, data); test_furi_event_loop_thread_run_and_cleanup(consumer); } FURI_LOG_I(TAG, "consumer end"); return 0; } typedef struct { FuriEventLoop* event_loop; FuriSemaphore* semaphore; size_t counter; } SelfUnsubTestTimerContext; static void test_self_unsub_semaphore_callback(FuriEventLoopObject* object, void* context) { furi_event_loop_unsubscribe(context, object); // shouldn't crash here } static void test_self_unsub_timer_callback(void* arg) { SelfUnsubTestTimerContext* context = arg; if(context->counter == 0) { furi_semaphore_release(context->semaphore); } else if(context->counter == 1) { furi_event_loop_stop(context->event_loop); } context->counter++; } void test_furi_event_loop_self_unsubscribe(void) { FuriEventLoop* event_loop = furi_event_loop_alloc(); FuriSemaphore* semaphore = furi_semaphore_alloc(1, 0); furi_event_loop_subscribe_semaphore( event_loop, semaphore, FuriEventLoopEventIn, test_self_unsub_semaphore_callback, event_loop); SelfUnsubTestTimerContext timer_context = { .event_loop = event_loop, .semaphore = semaphore, .counter = 0, }; FuriEventLoopTimer* timer = furi_event_loop_timer_alloc( event_loop, test_self_unsub_timer_callback, FuriEventLoopTimerTypePeriodic, &timer_context); furi_event_loop_timer_start(timer, furi_ms_to_ticks(20)); furi_event_loop_run(event_loop); furi_event_loop_timer_free(timer); furi_semaphore_free(semaphore); furi_event_loop_free(event_loop); } void test_furi_event_loop(void) { TestFuriEventLoopData data = {}; data.message_queue = furi_message_queue_alloc(16, sizeof(uint32_t)); data.stream_buffer = furi_stream_buffer_alloc(16, sizeof(uint32_t)); data.event_flag = furi_event_flag_alloc(); data.semaphore = furi_semaphore_alloc(8, 0); FuriThread* producer_thread = furi_thread_alloc_ex("producer_thread", 1 * 1024, test_furi_event_loop_producer, &data); furi_thread_start(producer_thread); FuriThread* consumer_thread = furi_thread_alloc_ex("consumer_thread", 1 * 1024, test_furi_event_loop_consumer, &data); furi_thread_start(consumer_thread); // Wait for thread to complete their tasks furi_thread_join(producer_thread); furi_thread_join(consumer_thread); TestFuriEventLoopThread* producer = &data.producer; TestFuriEventLoopThread* consumer = &data.consumer; // The test itself mu_assert_int_eq(producer->message_queue_count, consumer->message_queue_count); mu_assert_int_eq(producer->message_queue_count, MESSAGE_COUNT); mu_assert_int_eq(producer->stream_buffer_count, consumer->stream_buffer_count); mu_assert_int_eq(producer->stream_buffer_count, MESSAGE_COUNT); mu_assert_int_eq(producer->event_flag_count, consumer->event_flag_count); mu_assert_int_eq(producer->event_flag_count, EVENT_FLAG_COUNT); mu_assert_int_eq(producer->semaphore_count, consumer->semaphore_count); mu_assert_int_eq(producer->semaphore_count, MESSAGE_COUNT); // Release memory furi_thread_free(consumer_thread); furi_thread_free(producer_thread); furi_message_queue_free(data.message_queue); furi_stream_buffer_free(data.stream_buffer); furi_event_flag_free(data.event_flag); furi_semaphore_free(data.semaphore); } ================================================ FILE: applications/debug/unit_tests/tests/furi/furi_memmgr_test.c ================================================ #include "../test.h" // IWYU pragma: keep #include #include #include #include void test_furi_memmgr(void) { void* ptr; // allocate memory case ptr = malloc(100); mu_check(ptr != NULL); // test that memory is zero-initialized after allocation for(int i = 0; i < 100; i++) { mu_assert_int_eq(0, ((uint8_t*)ptr)[i]); } free(ptr); // reallocate memory case ptr = malloc(100); memset(ptr, 66, 100); ptr = realloc(ptr, 200); mu_check(ptr != NULL); // test that memory is really reallocated for(int i = 0; i < 100; i++) { mu_assert_int_eq(66, ((uint8_t*)ptr)[i]); } free(ptr); // allocate and zero-initialize array (calloc) ptr = calloc(100, 2); mu_check(ptr != NULL); for(int i = 0; i < 100 * 2; i++) { mu_assert_int_eq(0, ((uint8_t*)ptr)[i]); } free(ptr); } ================================================ FILE: applications/debug/unit_tests/tests/furi/furi_primitives_test.c ================================================ #include #include "../test.h" // IWYU pragma: keep #define MESSAGE_QUEUE_CAPACITY (16U) #define MESSAGE_QUEUE_ELEMENT_SIZE (sizeof(uint32_t)) #define STREAM_BUFFER_SIZE (32U) #define STREAM_BUFFER_TRG_LEVEL (STREAM_BUFFER_SIZE / 2U) typedef struct { FuriMessageQueue* message_queue; FuriStreamBuffer* stream_buffer; } TestFuriPrimitivesData; static void test_furi_message_queue(TestFuriPrimitivesData* data) { FuriMessageQueue* message_queue = data->message_queue; mu_assert_int_eq(0, furi_message_queue_get_count(message_queue)); mu_assert_int_eq(MESSAGE_QUEUE_CAPACITY, furi_message_queue_get_space(message_queue)); mu_assert_int_eq(MESSAGE_QUEUE_CAPACITY, furi_message_queue_get_capacity(message_queue)); mu_assert_int_eq( MESSAGE_QUEUE_ELEMENT_SIZE, furi_message_queue_get_message_size(message_queue)); for(uint32_t i = 0;; ++i) { mu_assert_int_eq(MESSAGE_QUEUE_CAPACITY - i, furi_message_queue_get_space(message_queue)); mu_assert_int_eq(i, furi_message_queue_get_count(message_queue)); if(furi_message_queue_put(message_queue, &i, 0) != FuriStatusOk) { break; } } mu_assert_int_eq(0, furi_message_queue_get_space(message_queue)); mu_assert_int_eq(MESSAGE_QUEUE_CAPACITY, furi_message_queue_get_count(message_queue)); for(uint32_t i = 0;; ++i) { mu_assert_int_eq(i, furi_message_queue_get_space(message_queue)); mu_assert_int_eq(MESSAGE_QUEUE_CAPACITY - i, furi_message_queue_get_count(message_queue)); uint32_t value; if(furi_message_queue_get(message_queue, &value, 0) != FuriStatusOk) { break; } mu_assert_int_eq(i, value); } mu_assert_int_eq(0, furi_message_queue_get_count(message_queue)); mu_assert_int_eq(MESSAGE_QUEUE_CAPACITY, furi_message_queue_get_space(message_queue)); } static void test_furi_stream_buffer(TestFuriPrimitivesData* data) { FuriStreamBuffer* stream_buffer = data->stream_buffer; mu_assert(furi_stream_buffer_is_empty(stream_buffer), "Must be empty"); mu_assert(!furi_stream_buffer_is_full(stream_buffer), "Must be not full"); mu_assert_int_eq(0, furi_stream_buffer_bytes_available(stream_buffer)); mu_assert_int_eq(STREAM_BUFFER_SIZE, furi_stream_buffer_spaces_available(stream_buffer)); for(uint8_t i = 0;; ++i) { mu_assert_int_eq(i, furi_stream_buffer_bytes_available(stream_buffer)); mu_assert_int_eq( STREAM_BUFFER_SIZE - i, furi_stream_buffer_spaces_available(stream_buffer)); if(furi_stream_buffer_send(stream_buffer, &i, sizeof(uint8_t), 0) != sizeof(uint8_t)) { break; } } mu_assert(!furi_stream_buffer_is_empty(stream_buffer), "Must be not empty"); mu_assert(furi_stream_buffer_is_full(stream_buffer), "Must be full"); mu_assert_int_eq(STREAM_BUFFER_SIZE, furi_stream_buffer_bytes_available(stream_buffer)); mu_assert_int_eq(0, furi_stream_buffer_spaces_available(stream_buffer)); for(uint8_t i = 0;; ++i) { mu_assert_int_eq( STREAM_BUFFER_SIZE - i, furi_stream_buffer_bytes_available(stream_buffer)); mu_assert_int_eq(i, furi_stream_buffer_spaces_available(stream_buffer)); uint8_t value; if(furi_stream_buffer_receive(stream_buffer, &value, sizeof(uint8_t), 0) != sizeof(uint8_t)) { break; } mu_assert_int_eq(i, value); } } // This is a stub that needs expanding void test_furi_primitives(void) { TestFuriPrimitivesData data = { .message_queue = furi_message_queue_alloc(MESSAGE_QUEUE_CAPACITY, MESSAGE_QUEUE_ELEMENT_SIZE), .stream_buffer = furi_stream_buffer_alloc(STREAM_BUFFER_SIZE, STREAM_BUFFER_TRG_LEVEL), }; test_furi_message_queue(&data); test_furi_stream_buffer(&data); furi_message_queue_free(data.message_queue); furi_stream_buffer_free(data.stream_buffer); } ================================================ FILE: applications/debug/unit_tests/tests/furi/furi_pubsub_test.c ================================================ #include #include #include #include "../test.h" // IWYU pragma: keep const uint32_t context_value = 0xdeadbeef; const uint32_t notify_value_0 = 0x12345678; const uint32_t notify_value_1 = 0x11223344; uint32_t pubsub_value = 0; uint32_t pubsub_context_value = 0; void test_pubsub_handler(const void* arg, void* ctx) { pubsub_value = *(uint32_t*)arg; pubsub_context_value = *(uint32_t*)ctx; } void test_furi_pubsub(void) { FuriPubSub* test_pubsub = NULL; FuriPubSubSubscription* test_pubsub_subscription = NULL; // init pubsub case test_pubsub = furi_pubsub_alloc(); mu_assert_pointers_not_eq(test_pubsub, NULL); // subscribe pubsub case test_pubsub_subscription = furi_pubsub_subscribe(test_pubsub, test_pubsub_handler, (void*)&context_value); mu_assert_pointers_not_eq(test_pubsub_subscription, NULL); /// notify pubsub case furi_pubsub_publish(test_pubsub, (void*)¬ify_value_0); mu_assert_int_eq(pubsub_value, notify_value_0); mu_assert_int_eq(pubsub_context_value, context_value); // unsubscribe pubsub case furi_pubsub_unsubscribe(test_pubsub, test_pubsub_subscription); /// notify unsubscribed pubsub case furi_pubsub_publish(test_pubsub, (void*)¬ify_value_1); mu_assert_int_not_eq(pubsub_value, notify_value_1); // delete pubsub case furi_pubsub_free(test_pubsub); } ================================================ FILE: applications/debug/unit_tests/tests/furi/furi_record_test.c ================================================ #include #include "../test.h" // IWYU pragma: keep #define TEST_RECORD_NAME "test/holding" void test_furi_create_open(void) { // Test that record does not exist mu_check(furi_record_exists(TEST_RECORD_NAME) == false); // Create record uint8_t test_data = 0; furi_record_create(TEST_RECORD_NAME, (void*)&test_data); // Test that record exists mu_check(furi_record_exists(TEST_RECORD_NAME) == true); // Open it void* record = furi_record_open(TEST_RECORD_NAME); mu_assert_pointers_eq(record, &test_data); // Close it furi_record_close(TEST_RECORD_NAME); // Clean up furi_record_destroy(TEST_RECORD_NAME); // Test that record does not exist mu_check(furi_record_exists(TEST_RECORD_NAME) == false); } ================================================ FILE: applications/debug/unit_tests/tests/furi/furi_stdio_test.c ================================================ #include #include #include #include "../test.h" // IWYU pragma: keep #define TAG "StdioTest" #define CONTEXT_MAGIC ((void*)0xDEADBEEF) // stdin static char mock_in[256]; static size_t mock_in_len, mock_in_pos; static void set_mock_in(const char* str) { size_t len = strlen(str); strcpy(mock_in, str); mock_in_len = len; mock_in_pos = 0; } static size_t mock_in_cb(char* buffer, size_t size, FuriWait wait, void* context) { UNUSED(wait); furi_check(context == CONTEXT_MAGIC); size_t remaining = mock_in_len - mock_in_pos; size = MIN(remaining, size); memcpy(buffer, mock_in + mock_in_pos, size); mock_in_pos += size; return size; } void test_stdin(void) { FuriThreadStdinReadCallback in_cb; void* in_ctx; furi_thread_get_stdin_callback(&in_cb, &in_ctx); furi_thread_set_stdin_callback(mock_in_cb, CONTEXT_MAGIC); char buf[256]; // plain in set_mock_in("Hello, World!\n"); fgets(buf, sizeof(buf), stdin); mu_assert_string_eq("Hello, World!\n", buf); mu_assert_int_eq(EOF, getchar()); // ungetc ungetc('i', stdin); ungetc('H', stdin); fgets(buf, sizeof(buf), stdin); mu_assert_string_eq("Hi", buf); mu_assert_int_eq(EOF, getchar()); // ungetc + plain in set_mock_in(" World"); ungetc('i', stdin); ungetc('H', stdin); fgets(buf, sizeof(buf), stdin); mu_assert_string_eq("Hi World", buf); mu_assert_int_eq(EOF, getchar()); // partial plain in set_mock_in("Hello, World!\n"); fgets(buf, strlen("Hello") + 1, stdin); mu_assert_string_eq("Hello", buf); mu_assert_int_eq(',', getchar()); fgets(buf, sizeof(buf), stdin); mu_assert_string_eq(" World!\n", buf); furi_thread_set_stdin_callback(in_cb, in_ctx); } // stdout static FuriString* mock_out; static FuriThreadStdoutWriteCallback original_out_cb; static void* original_out_ctx; static void mock_out_cb(const char* data, size_t size, void* context) { furi_check(context == CONTEXT_MAGIC); // there's no furi_string_cat_strn :( for(size_t i = 0; i < size; i++) { furi_string_push_back(mock_out, data[i]); } } static void assert_and_clear_mock_out(const char* expected) { // return the original stdout callback for the duration of the check // if the check fails, we don't want the error to end up in our buffer, // we want to be able to see it! furi_thread_set_stdout_callback(original_out_cb, original_out_ctx); mu_assert_string_eq(expected, furi_string_get_cstr(mock_out)); furi_thread_set_stdout_callback(mock_out_cb, CONTEXT_MAGIC); furi_string_reset(mock_out); } void test_stdout(void) { furi_thread_get_stdout_callback(&original_out_cb, &original_out_ctx); furi_thread_set_stdout_callback(mock_out_cb, CONTEXT_MAGIC); mock_out = furi_string_alloc(); puts("Hello, World!"); assert_and_clear_mock_out("Hello, World!\n"); printf("He"); printf("llo!"); fflush(stdout); assert_and_clear_mock_out("Hello!"); furi_string_free(mock_out); furi_thread_set_stdout_callback(original_out_cb, original_out_ctx); } ================================================ FILE: applications/debug/unit_tests/tests/furi/furi_test.c ================================================ #include #include #include "../test.h" // IWYU pragma: keep // v2 tests void test_furi_create_open(void); void test_furi_concurrent_access(void); void test_furi_pubsub(void); void test_furi_memmgr(void); void test_furi_event_loop(void); void test_furi_event_loop_self_unsubscribe(void); void test_errno_saving(void); void test_furi_primitives(void); void test_stdin(void); void test_stdout(void); static int foo = 0; void test_setup(void) { foo = 7; } void test_teardown(void) { /* Nothing */ } MU_TEST(test_check) { mu_check(foo != 6); } // v2 tests MU_TEST(mu_test_furi_create_open) { test_furi_create_open(); } MU_TEST(mu_test_furi_pubsub) { test_furi_pubsub(); } MU_TEST(mu_test_furi_memmgr) { // this test is not accurate, but gives a basic understanding // that memory management is working fine test_furi_memmgr(); } MU_TEST(mu_test_furi_event_loop) { test_furi_event_loop(); } MU_TEST(mu_test_furi_event_loop_self_unsubscribe) { test_furi_event_loop_self_unsubscribe(); } MU_TEST(mu_test_errno_saving) { test_errno_saving(); } MU_TEST(mu_test_furi_primitives) { test_furi_primitives(); } MU_TEST(mu_test_stdio) { test_stdin(); test_stdout(); } MU_TEST_SUITE(test_suite) { MU_SUITE_CONFIGURE(&test_setup, &test_teardown); MU_RUN_TEST(test_check); // v2 tests MU_RUN_TEST(mu_test_furi_create_open); MU_RUN_TEST(mu_test_furi_pubsub); MU_RUN_TEST(mu_test_furi_memmgr); MU_RUN_TEST(mu_test_furi_event_loop); MU_RUN_TEST(mu_test_furi_event_loop_self_unsubscribe); MU_RUN_TEST(mu_test_stdio); MU_RUN_TEST(mu_test_errno_saving); MU_RUN_TEST(mu_test_furi_primitives); } int run_minunit_test_furi(void) { MU_RUN_SUITE(test_suite); return MU_EXIT_CODE; } TEST_API_DEFINE(run_minunit_test_furi) ================================================ FILE: applications/debug/unit_tests/tests/furi_hal/furi_hal_tests.c ================================================ #include #include #include #include #include #include "../test.h" // IWYU pragma: keep #define DATA_SIZE 4 #define EEPROM_ADDRESS 0b10101000 #define EEPROM_ADDRESS_HIGH (EEPROM_ADDRESS | 0b10) #define EEPROM_SIZE 512 #define EEPROM_PAGE_SIZE 16 #define EEPROM_WRITE_DELAY_MS 6 static void furi_hal_i2c_int_setup(void) { furi_hal_i2c_acquire(&furi_hal_i2c_handle_power); } static void furi_hal_i2c_int_teardown(void) { furi_hal_i2c_release(&furi_hal_i2c_handle_power); } static void furi_hal_i2c_ext_setup(void) { furi_hal_i2c_acquire(&furi_hal_i2c_handle_external); } static void furi_hal_i2c_ext_teardown(void) { furi_hal_i2c_release(&furi_hal_i2c_handle_external); } MU_TEST(furi_hal_i2c_int_1b) { bool ret = false; uint8_t data_one = 0; // 1 byte: read, write, read ret = furi_hal_i2c_read_reg_8( &furi_hal_i2c_handle_power, LP5562_ADDRESS, LP5562_CHANNEL_BLUE_CURRENT_REGISTER, &data_one, LP5562_I2C_TIMEOUT); mu_assert(ret, "0 read_reg_8 failed"); mu_assert(data_one != 0, "0 invalid data"); ret = furi_hal_i2c_write_reg_8( &furi_hal_i2c_handle_power, LP5562_ADDRESS, LP5562_CHANNEL_BLUE_CURRENT_REGISTER, data_one, LP5562_I2C_TIMEOUT); mu_assert(ret, "1 write_reg_8 failed"); ret = furi_hal_i2c_read_reg_8( &furi_hal_i2c_handle_power, LP5562_ADDRESS, LP5562_CHANNEL_BLUE_CURRENT_REGISTER, &data_one, LP5562_I2C_TIMEOUT); mu_assert(ret, "2 read_reg_8 failed"); mu_assert(data_one != 0, "2 invalid data"); } MU_TEST(furi_hal_i2c_int_3b) { bool ret = false; uint8_t data_many[DATA_SIZE] = {0}; // 3 byte: read, write, read data_many[0] = LP5562_CHANNEL_BLUE_CURRENT_REGISTER; ret = furi_hal_i2c_tx( &furi_hal_i2c_handle_power, LP5562_ADDRESS, data_many, 1, LP5562_I2C_TIMEOUT); mu_assert(ret, "3 tx failed"); ret = furi_hal_i2c_rx( &furi_hal_i2c_handle_power, LP5562_ADDRESS, data_many + 1, DATA_SIZE - 1, LP5562_I2C_TIMEOUT); mu_assert(ret, "4 rx failed"); for(size_t i = 0; i < DATA_SIZE; i++) mu_assert(data_many[i] != 0, "4 invalid data_many"); ret = furi_hal_i2c_tx( &furi_hal_i2c_handle_power, LP5562_ADDRESS, data_many, DATA_SIZE, LP5562_I2C_TIMEOUT); mu_assert(ret, "5 tx failed"); ret = furi_hal_i2c_tx( &furi_hal_i2c_handle_power, LP5562_ADDRESS, data_many, 1, LP5562_I2C_TIMEOUT); mu_assert(ret, "6 tx failed"); ret = furi_hal_i2c_rx( &furi_hal_i2c_handle_power, LP5562_ADDRESS, data_many + 1, DATA_SIZE - 1, LP5562_I2C_TIMEOUT); mu_assert(ret, "7 rx failed"); for(size_t i = 0; i < DATA_SIZE; i++) mu_assert(data_many[i] != 0, "7 invalid data_many"); } MU_TEST(furi_hal_i2c_int_1b_fail) { bool ret = false; uint8_t data_one = 0; // 1 byte: fail, read, fail, write, fail, read data_one = 0; ret = furi_hal_i2c_read_reg_8( &furi_hal_i2c_handle_power, LP5562_ADDRESS + 0x10, LP5562_CHANNEL_BLUE_CURRENT_REGISTER, &data_one, LP5562_I2C_TIMEOUT); mu_assert(!ret, "8 read_reg_8 failed"); mu_assert(data_one == 0, "8 invalid data"); ret = furi_hal_i2c_read_reg_8( &furi_hal_i2c_handle_power, LP5562_ADDRESS, LP5562_CHANNEL_BLUE_CURRENT_REGISTER, &data_one, LP5562_I2C_TIMEOUT); mu_assert(ret, "9 read_reg_8 failed"); mu_assert(data_one != 0, "9 invalid data"); } MU_TEST(furi_hal_i2c_int_ext_3b) { bool ret = false; uint8_t data_many[DATA_SIZE] = {0}; // 3 byte: read data_many[0] = LP5562_CHANNEL_BLUE_CURRENT_REGISTER; ret = furi_hal_i2c_tx_ext( &furi_hal_i2c_handle_power, LP5562_ADDRESS, false, data_many, 1, FuriHalI2cBeginStart, FuriHalI2cEndAwaitRestart, LP5562_I2C_TIMEOUT); mu_assert(ret, "3 tx failed"); // Send a RESTART condition, then read the 3 bytes one after the other ret = furi_hal_i2c_rx_ext( &furi_hal_i2c_handle_power, LP5562_ADDRESS, false, data_many + 1, 1, FuriHalI2cBeginRestart, FuriHalI2cEndPause, LP5562_I2C_TIMEOUT); mu_assert(ret, "4 rx failed"); mu_assert(data_many[1] != 0, "4 invalid data"); ret = furi_hal_i2c_rx_ext( &furi_hal_i2c_handle_power, LP5562_ADDRESS, false, data_many + 2, 1, FuriHalI2cBeginResume, FuriHalI2cEndPause, LP5562_I2C_TIMEOUT); mu_assert(ret, "5 rx failed"); mu_assert(data_many[2] != 0, "5 invalid data"); ret = furi_hal_i2c_rx_ext( &furi_hal_i2c_handle_power, LP5562_ADDRESS, false, data_many + 3, 1, FuriHalI2cBeginResume, FuriHalI2cEndStop, LP5562_I2C_TIMEOUT); mu_assert(ret, "6 rx failed"); mu_assert(data_many[3] != 0, "6 invalid data"); } MU_TEST(furi_hal_i2c_ext_eeprom) { if(!furi_hal_i2c_is_device_ready(&furi_hal_i2c_handle_external, EEPROM_ADDRESS, 100)) { printf("no device connected, skipping\r\n"); return; } bool ret = false; uint8_t buffer[EEPROM_SIZE] = {0}; for(size_t page = 0; page < (EEPROM_SIZE / EEPROM_PAGE_SIZE); ++page) { // Fill page buffer for(size_t page_byte = 0; page_byte < EEPROM_PAGE_SIZE; ++page_byte) { // Each byte is its position in the EEPROM modulo 256 uint8_t byte = ((page * EEPROM_PAGE_SIZE) + page_byte) % 256; buffer[page_byte] = byte; } uint8_t address = (page < 16) ? EEPROM_ADDRESS : EEPROM_ADDRESS_HIGH; ret = furi_hal_i2c_write_mem( &furi_hal_i2c_handle_external, address, page * EEPROM_PAGE_SIZE, buffer, EEPROM_PAGE_SIZE, 20); mu_assert(ret, "EEPROM write failed"); furi_delay_ms(EEPROM_WRITE_DELAY_MS); } ret = furi_hal_i2c_read_mem( &furi_hal_i2c_handle_external, EEPROM_ADDRESS, 0, buffer, EEPROM_SIZE, 100); mu_assert(ret, "EEPROM read failed"); for(size_t pos = 0; pos < EEPROM_SIZE; ++pos) { mu_assert_int_eq(pos % 256, buffer[pos]); } } MU_TEST_SUITE(furi_hal_i2c_int_suite) { MU_SUITE_CONFIGURE(&furi_hal_i2c_int_setup, &furi_hal_i2c_int_teardown); MU_RUN_TEST(furi_hal_i2c_int_1b); MU_RUN_TEST(furi_hal_i2c_int_3b); MU_RUN_TEST(furi_hal_i2c_int_ext_3b); MU_RUN_TEST(furi_hal_i2c_int_1b_fail); } MU_TEST_SUITE(furi_hal_i2c_ext_suite) { MU_SUITE_CONFIGURE(&furi_hal_i2c_ext_setup, &furi_hal_i2c_ext_teardown); MU_RUN_TEST(furi_hal_i2c_ext_eeprom); } int run_minunit_test_furi_hal(void) { MU_RUN_SUITE(furi_hal_i2c_int_suite); MU_RUN_SUITE(furi_hal_i2c_ext_suite); return MU_EXIT_CODE; } TEST_API_DEFINE(run_minunit_test_furi_hal) ================================================ FILE: applications/debug/unit_tests/tests/furi_hal_crypto/furi_hal_crypto_tests.c ================================================ #include #include #include "../test.h" // IWYU pragma: keep static const uint8_t key_ctr_1[32] = { 0x77, 0x6B, 0xEF, 0xF2, 0x85, 0x1D, 0xB0, 0x6F, 0x4C, 0x8A, 0x05, 0x42, 0xC8, 0x69, 0x6F, 0x6C, 0x6A, 0x81, 0xAF, 0x1E, 0xEC, 0x96, 0xB4, 0xD3, 0x7F, 0xC1, 0xD6, 0x89, 0xE6, 0xC1, 0xC1, 0x04, }; static const uint8_t iv_ctr_1[16] = { 0x00, 0x00, 0x00, 0x60, 0xDB, 0x56, 0x72, 0xC9, 0x7A, 0xA8, 0xF0, 0xB2, 0x00, 0x00, 0x00, 0x01, }; static const uint8_t pt_ctr_1[16] = { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62, 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67, }; static const uint8_t tv_ctr_ct_1[16] = { 0x14, 0x5A, 0xD0, 0x1D, 0xBF, 0x82, 0x4E, 0xC7, 0x56, 0x08, 0x63, 0xDC, 0x71, 0xE3, 0xE0, 0xC0, }; static const uint8_t key_ctr_2[32] = { 0x77, 0x6B, 0xEF, 0xF2, 0x85, 0x1D, 0xB0, 0x6F, 0x4C, 0x8A, 0x05, 0x42, 0xC8, 0x69, 0x6F, 0x6C, 0x6A, 0x81, 0xAF, 0x1E, 0xEC, 0x96, 0xB4, 0xD3, 0x7F, 0xC1, 0xD6, 0x89, 0xE6, 0xC1, 0xC1, 0x04, }; static const uint8_t iv_ctr_2[16] = { 0x00, 0x00, 0x00, 0x60, 0xDB, 0x56, 0x72, 0xC9, 0x7A, 0xA8, 0xF0, 0xB2, 0x00, 0x00, 0x00, 0x01, }; static const uint8_t pt_ctr_2[0] = {}; //static const uint8_t tv_ctr_ct_2[0] = {}; static const uint8_t key_ctr_3[32] = { 0xF6, 0xD6, 0x6D, 0x6B, 0xD5, 0x2D, 0x59, 0xBB, 0x07, 0x96, 0x36, 0x58, 0x79, 0xEF, 0xF8, 0x86, 0xC6, 0x6D, 0xD5, 0x1A, 0x5B, 0x6A, 0x99, 0x74, 0x4B, 0x50, 0x59, 0x0C, 0x87, 0xA2, 0x38, 0x84, }; static const uint8_t iv_ctr_3[16] = { 0x00, 0xFA, 0xAC, 0x24, 0xC1, 0x58, 0x5E, 0xF1, 0x5A, 0x43, 0xD8, 0x75, 0x00, 0x00, 0x00, 0x01, }; static const uint8_t pt_ctr_3[32] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, }; static const uint8_t tv_ctr_ct_3[32] = { 0xF0, 0x5E, 0x23, 0x1B, 0x38, 0x94, 0x61, 0x2C, 0x49, 0xEE, 0x00, 0x0B, 0x80, 0x4E, 0xB2, 0xA9, 0xB8, 0x30, 0x6B, 0x50, 0x8F, 0x83, 0x9D, 0x6A, 0x55, 0x30, 0x83, 0x1D, 0x93, 0x44, 0xAF, 0x1C, }; static const uint8_t key_ctr_4[32] = { 0xFF, 0x7A, 0x61, 0x7C, 0xE6, 0x91, 0x48, 0xE4, 0xF1, 0x72, 0x6E, 0x2F, 0x43, 0x58, 0x1D, 0xE2, 0xAA, 0x62, 0xD9, 0xF8, 0x05, 0x53, 0x2E, 0xDF, 0xF1, 0xEE, 0xD6, 0x87, 0xFB, 0x54, 0x15, 0x3D, }; static const uint8_t iv_ctr_4[16] = { 0x00, 0x1C, 0xC5, 0xB7, 0x51, 0xA5, 0x1D, 0x70, 0xA1, 0xC1, 0x11, 0x48, 0x00, 0x00, 0x00, 0x01, }; static const uint8_t pt_ctr_4[36] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, }; static const uint8_t tv_ctr_ct_4[36] = { 0xEB, 0x6C, 0x52, 0x82, 0x1D, 0x0B, 0xBB, 0xF7, 0xCE, 0x75, 0x94, 0x46, 0x2A, 0xCA, 0x4F, 0xAA, 0xB4, 0x07, 0xDF, 0x86, 0x65, 0x69, 0xFD, 0x07, 0xF4, 0x8C, 0xC0, 0xB5, 0x83, 0xD6, 0x07, 0x1F, 0x1E, 0xC0, 0xE6, 0xB8, }; static const uint8_t key_ctr_5[32] = { 0xFF, 0x7A, 0x61, 0x7C, 0xE6, 0x91, 0x48, 0xE4, 0xF1, 0x72, 0x6E, 0x2F, 0x43, 0x58, 0x1D, 0xE2, 0xAA, 0x62, 0xD9, 0xF8, 0x05, 0x53, 0x2E, 0xDF, 0xF1, 0xEE, 0xD6, 0x87, 0xFB, 0x54, 0x15, 0x3D, }; static const uint8_t iv_ctr_5[16] = { 0x00, 0x1C, 0xC5, 0xB7, 0x51, 0xA5, 0x1D, 0x70, 0xA1, 0xC1, 0x11, 0x48, 0x00, 0x00, 0x00, 0x01, }; static const uint8_t pt_ctr_5[0] = {}; //static const uint8_t tv_ctr_ct_5[0] = {}; static const uint8_t key_gcm_1[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; static const uint8_t iv_gcm_1[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; static const uint8_t pt_gcm_1[0] = {}; //static const uint8_t tv_gcm_ct_1[0] = {}; static const uint8_t aad_gcm_1[0] = {}; static const uint8_t tv_gcm_tag_1[16] = { 0x53, 0x0F, 0x8A, 0xFB, 0xC7, 0x45, 0x36, 0xB9, 0xA9, 0x63, 0xB4, 0xF1, 0xC4, 0xCB, 0x73, 0x8B, }; static const uint8_t key_gcm_2[32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; static const uint8_t iv_gcm_2[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; static const uint8_t pt_gcm_2[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; static const uint8_t tv_gcm_ct_2[16] = { 0xCE, 0xA7, 0x40, 0x3D, 0x4D, 0x60, 0x6B, 0x6E, 0x07, 0x4E, 0xC5, 0xD3, 0xBA, 0xF3, 0x9D, 0x18, }; static const uint8_t aad_gcm_2[0] = {}; static const uint8_t tv_gcm_tag_2[16] = { 0xD0, 0xD1, 0xC8, 0xA7, 0x99, 0x99, 0x6B, 0xF0, 0x26, 0x5B, 0x98, 0xB5, 0xD4, 0x8A, 0xB9, 0x19, }; static const uint8_t key_gcm_3[32] = { 0xFE, 0xFF, 0xE9, 0x92, 0x86, 0x65, 0x73, 0x1C, 0x6D, 0x6A, 0x8F, 0x94, 0x67, 0x30, 0x83, 0x08, 0xFE, 0xFF, 0xE9, 0x92, 0x86, 0x65, 0x73, 0x1C, 0x6D, 0x6A, 0x8F, 0x94, 0x67, 0x30, 0x83, 0x08, }; static const uint8_t iv_gcm_3[16] = { 0xCA, 0xFE, 0xBA, 0xBE, 0xFA, 0xCE, 0xDB, 0xAD, 0xDE, 0xCA, 0xF8, 0x88, 0x00, 0x00, 0x00, 0x00, }; static const uint8_t pt_gcm_3[64] = { 0xD9, 0x31, 0x32, 0x25, 0xF8, 0x84, 0x06, 0xE5, 0xA5, 0x59, 0x09, 0xC5, 0xAF, 0xF5, 0x26, 0x9A, 0x86, 0xA7, 0xA9, 0x53, 0x15, 0x34, 0xF7, 0xDA, 0x2E, 0x4C, 0x30, 0x3D, 0x8A, 0x31, 0x8A, 0x72, 0x1C, 0x3C, 0x0C, 0x95, 0x95, 0x68, 0x09, 0x53, 0x2F, 0xCF, 0x0E, 0x24, 0x49, 0xA6, 0xB5, 0x25, 0xB1, 0x6A, 0xED, 0xF5, 0xAA, 0x0D, 0xE6, 0x57, 0xBA, 0x63, 0x7B, 0x39, 0x1A, 0xAF, 0xD2, 0x55, }; static const uint8_t tv_gcm_ct_3[64] = { 0x52, 0x2D, 0xC1, 0xF0, 0x99, 0x56, 0x7D, 0x07, 0xF4, 0x7F, 0x37, 0xA3, 0x2A, 0x84, 0x42, 0x7D, 0x64, 0x3A, 0x8C, 0xDC, 0xBF, 0xE5, 0xC0, 0xC9, 0x75, 0x98, 0xA2, 0xBD, 0x25, 0x55, 0xD1, 0xAA, 0x8C, 0xB0, 0x8E, 0x48, 0x59, 0x0D, 0xBB, 0x3D, 0xA7, 0xB0, 0x8B, 0x10, 0x56, 0x82, 0x88, 0x38, 0xC5, 0xF6, 0x1E, 0x63, 0x93, 0xBA, 0x7A, 0x0A, 0xBC, 0xC9, 0xF6, 0x62, 0x89, 0x80, 0x15, 0xAD, }; static const uint8_t aad_gcm_3[0] = {}; static const uint8_t tv_gcm_tag_3[16] = { 0xB0, 0x94, 0xDA, 0xC5, 0xD9, 0x34, 0x71, 0xBD, 0xEC, 0x1A, 0x50, 0x22, 0x70, 0xE3, 0xCC, 0x6C, }; static const uint8_t key_gcm_4[32] = { 0xFE, 0xFF, 0xE9, 0x92, 0x86, 0x65, 0x73, 0x1C, 0x6D, 0x6A, 0x8F, 0x94, 0x67, 0x30, 0x83, 0x08, 0xFE, 0xFF, 0xE9, 0x92, 0x86, 0x65, 0x73, 0x1C, 0x6D, 0x6A, 0x8F, 0x94, 0x67, 0x30, 0x83, 0x08, }; static const uint8_t iv_gcm_4[16] = { 0xCA, 0xFE, 0xBA, 0xBE, 0xFA, 0xCE, 0xDB, 0xAD, 0xDE, 0xCA, 0xF8, 0x88, 0x00, 0x00, 0x00, 0x00, }; static const uint8_t pt_gcm_4[60] = { 0xD9, 0x31, 0x32, 0x25, 0xF8, 0x84, 0x06, 0xE5, 0xA5, 0x59, 0x09, 0xC5, 0xAF, 0xF5, 0x26, 0x9A, 0x86, 0xA7, 0xA9, 0x53, 0x15, 0x34, 0xF7, 0xDA, 0x2E, 0x4C, 0x30, 0x3D, 0x8A, 0x31, 0x8A, 0x72, 0x1C, 0x3C, 0x0C, 0x95, 0x95, 0x68, 0x09, 0x53, 0x2F, 0xCF, 0x0E, 0x24, 0x49, 0xA6, 0xB5, 0x25, 0xB1, 0x6A, 0xED, 0xF5, 0xAA, 0x0D, 0xE6, 0x57, 0xBA, 0x63, 0x7B, 0x39, }; static const uint8_t tv_gcm_ct_4[60] = { 0x52, 0x2D, 0xC1, 0xF0, 0x99, 0x56, 0x7D, 0x07, 0xF4, 0x7F, 0x37, 0xA3, 0x2A, 0x84, 0x42, 0x7D, 0x64, 0x3A, 0x8C, 0xDC, 0xBF, 0xE5, 0xC0, 0xC9, 0x75, 0x98, 0xA2, 0xBD, 0x25, 0x55, 0xD1, 0xAA, 0x8C, 0xB0, 0x8E, 0x48, 0x59, 0x0D, 0xBB, 0x3D, 0xA7, 0xB0, 0x8B, 0x10, 0x56, 0x82, 0x88, 0x38, 0xC5, 0xF6, 0x1E, 0x63, 0x93, 0xBA, 0x7A, 0x0A, 0xBC, 0xC9, 0xF6, 0x62, }; static const uint8_t aad_gcm_4[20] = { 0xFE, 0xED, 0xFA, 0xCE, 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED, 0xFA, 0xCE, 0xDE, 0xAD, 0xBE, 0xEF, 0xAB, 0xAD, 0xDA, 0xD2, }; static const uint8_t tv_gcm_tag_4[16] = { 0x76, 0xFC, 0x6E, 0xCE, 0x0F, 0x4E, 0x17, 0x68, 0xCD, 0xDF, 0x88, 0x53, 0xBB, 0x2D, 0x55, 0x1B, }; static void furi_hal_crypto_ctr_setup(void) { } static void furi_hal_crypto_ctr_teardown(void) { } static void furi_hal_crypto_gcm_setup(void) { } static void furi_hal_crypto_gcm_teardown(void) { } MU_TEST(furi_hal_crypto_ctr_1) { bool ret = false; uint8_t ct[sizeof(pt_ctr_1)]; ret = furi_hal_crypto_ctr(key_ctr_1, iv_ctr_1, pt_ctr_1, ct, sizeof(pt_ctr_1)); mu_assert(ret, "CTR 1 failed"); mu_assert_mem_eq(tv_ctr_ct_1, ct, sizeof(pt_ctr_1)); } MU_TEST(furi_hal_crypto_ctr_2) { bool ret = false; uint8_t ct[sizeof(pt_ctr_2)]; ret = furi_hal_crypto_ctr(key_ctr_2, iv_ctr_2, pt_ctr_2, ct, sizeof(pt_ctr_2)); mu_assert(ret, "CTR 2 failed"); //mu_assert_mem_eq(tv_ctr_ct_2, ct, sizeof(pt_ctr_2)); } MU_TEST(furi_hal_crypto_ctr_3) { bool ret = false; uint8_t ct[sizeof(pt_ctr_3)]; ret = furi_hal_crypto_ctr(key_ctr_3, iv_ctr_3, pt_ctr_3, ct, sizeof(pt_ctr_3)); mu_assert(ret, "CTR 3 failed"); mu_assert_mem_eq(tv_ctr_ct_3, ct, sizeof(pt_ctr_3)); } MU_TEST(furi_hal_crypto_ctr_4) { bool ret = false; uint8_t ct[sizeof(pt_ctr_4)]; ret = furi_hal_crypto_ctr(key_ctr_4, iv_ctr_4, pt_ctr_4, ct, sizeof(pt_ctr_4)); mu_assert(ret, "CTR 4 failed"); mu_assert_mem_eq(tv_ctr_ct_4, ct, sizeof(pt_ctr_4)); } MU_TEST(furi_hal_crypto_ctr_5) { bool ret = false; uint8_t ct[sizeof(pt_ctr_5)]; ret = furi_hal_crypto_ctr(key_ctr_5, iv_ctr_5, pt_ctr_5, ct, sizeof(pt_ctr_5)); mu_assert(ret, "CTR 5 failed"); //mu_assert_mem_eq(tv_ctr_ct_5, ct, sizeof(pt_ctr_5)); } MU_TEST(furi_hal_crypto_gcm_1) { bool ret = false; uint8_t pt[sizeof(pt_gcm_1)]; uint8_t ct[sizeof(pt_gcm_1)]; uint8_t tag_enc[16]; uint8_t tag_dec[16]; ret = furi_hal_crypto_gcm( key_gcm_1, iv_gcm_1, aad_gcm_1, sizeof(aad_gcm_1), pt_gcm_1, ct, sizeof(pt_gcm_1), tag_enc, false); mu_assert(ret, "GCM 1 encryption failed"); //mu_assert_mem_eq(tv_gcm_ct_1, ct, sizeof(pt_gcm_1)); mu_assert_mem_eq(tv_gcm_tag_1, tag_enc, 16); ret = furi_hal_crypto_gcm( key_gcm_1, iv_gcm_1, aad_gcm_1, sizeof(aad_gcm_1), ct, pt, sizeof(pt_gcm_1), tag_dec, true); mu_assert(ret, "GCM 1 decryption failed"); //mu_assert_mem_eq(pt_gcm_1, pt, sizeof(pt_gcm_1)); mu_assert_mem_eq(tv_gcm_tag_1, tag_dec, 16); } MU_TEST(furi_hal_crypto_gcm_2) { bool ret = false; uint8_t pt[sizeof(pt_gcm_2)]; uint8_t ct[sizeof(pt_gcm_2)]; uint8_t tag_enc[16]; uint8_t tag_dec[16]; ret = furi_hal_crypto_gcm( key_gcm_2, iv_gcm_2, aad_gcm_2, sizeof(aad_gcm_2), pt_gcm_2, ct, sizeof(pt_gcm_2), tag_enc, false); mu_assert(ret, "GCM 2 encryption failed"); mu_assert_mem_eq(tv_gcm_ct_2, ct, sizeof(pt_gcm_2)); mu_assert_mem_eq(tv_gcm_tag_2, tag_enc, 16); ret = furi_hal_crypto_gcm( key_gcm_2, iv_gcm_2, aad_gcm_2, sizeof(aad_gcm_2), ct, pt, sizeof(pt_gcm_2), tag_dec, true); mu_assert(ret, "GCM 2 decryption failed"); mu_assert_mem_eq(pt_gcm_2, pt, sizeof(pt_gcm_2)); mu_assert_mem_eq(tv_gcm_tag_2, tag_dec, 16); } MU_TEST(furi_hal_crypto_gcm_3) { bool ret = false; uint8_t pt[sizeof(pt_gcm_3)]; uint8_t ct[sizeof(pt_gcm_3)]; uint8_t tag_enc[16]; uint8_t tag_dec[16]; ret = furi_hal_crypto_gcm( key_gcm_3, iv_gcm_3, aad_gcm_3, sizeof(aad_gcm_3), pt_gcm_3, ct, sizeof(pt_gcm_3), tag_enc, false); mu_assert(ret, "GCM 3 encryption failed"); mu_assert_mem_eq(tv_gcm_ct_3, ct, sizeof(pt_gcm_3)); mu_assert_mem_eq(tv_gcm_tag_3, tag_enc, 16); ret = furi_hal_crypto_gcm( key_gcm_3, iv_gcm_3, aad_gcm_3, sizeof(aad_gcm_3), ct, pt, sizeof(pt_gcm_3), tag_dec, true); mu_assert(ret, "GCM 3 decryption failed"); mu_assert_mem_eq(pt_gcm_3, pt, sizeof(pt_gcm_3)); mu_assert_mem_eq(tv_gcm_tag_3, tag_dec, 16); } MU_TEST(furi_hal_crypto_gcm_4) { bool ret = false; uint8_t pt[sizeof(pt_gcm_4)]; uint8_t ct[sizeof(pt_gcm_4)]; uint8_t tag_enc[16]; uint8_t tag_dec[16]; ret = furi_hal_crypto_gcm( key_gcm_4, iv_gcm_4, aad_gcm_4, sizeof(aad_gcm_4), pt_gcm_4, ct, sizeof(pt_gcm_4), tag_enc, false); mu_assert(ret, "GCM 4 encryption failed"); mu_assert_mem_eq(tv_gcm_ct_4, ct, sizeof(pt_gcm_4)); mu_assert_mem_eq(tv_gcm_tag_4, tag_enc, 16); ret = furi_hal_crypto_gcm( key_gcm_4, iv_gcm_4, aad_gcm_4, sizeof(aad_gcm_4), ct, pt, sizeof(pt_gcm_4), tag_dec, true); mu_assert(ret, "GCM 4 decryption failed"); mu_assert_mem_eq(pt_gcm_4, pt, sizeof(pt_gcm_4)); mu_assert_mem_eq(tv_gcm_tag_4, tag_dec, 16); } MU_TEST_SUITE(furi_hal_crypto_ctr_test) { MU_SUITE_CONFIGURE(&furi_hal_crypto_ctr_setup, &furi_hal_crypto_ctr_teardown); MU_RUN_TEST(furi_hal_crypto_ctr_1); MU_RUN_TEST(furi_hal_crypto_ctr_2); MU_RUN_TEST(furi_hal_crypto_ctr_3); MU_RUN_TEST(furi_hal_crypto_ctr_4); MU_RUN_TEST(furi_hal_crypto_ctr_5); } MU_TEST_SUITE(furi_hal_crypto_gcm_test) { MU_SUITE_CONFIGURE(&furi_hal_crypto_gcm_setup, &furi_hal_crypto_gcm_teardown); MU_RUN_TEST(furi_hal_crypto_gcm_1); MU_RUN_TEST(furi_hal_crypto_gcm_2); MU_RUN_TEST(furi_hal_crypto_gcm_3); MU_RUN_TEST(furi_hal_crypto_gcm_4); } int run_minunit_test_furi_hal_crypto(void) { MU_RUN_SUITE(furi_hal_crypto_ctr_test); MU_RUN_SUITE(furi_hal_crypto_gcm_test); return MU_EXIT_CODE; } TEST_API_DEFINE(run_minunit_test_furi_hal_crypto) ================================================ FILE: applications/debug/unit_tests/tests/furi_string/furi_string_test.c ================================================ #include #include "../test.h" // IWYU pragma: keep static void test_setup(void) { } static void test_teardown(void) { } static FuriString* furi_string_alloc_vprintf_test(const char format[], ...) { va_list args; va_start(args, format); FuriString* string = furi_string_alloc_vprintf(format, args); va_end(args); return string; } MU_TEST(mu_test_furi_string_alloc_free) { FuriString* tmp; FuriString* string; // test alloc and free string = furi_string_alloc(); mu_check(string != NULL); mu_check(furi_string_empty(string)); furi_string_free(string); // test furi_string_alloc_set_str and free string = furi_string_alloc_set_str("test"); mu_check(string != NULL); mu_check(!furi_string_empty(string)); mu_check(furi_string_cmp(string, "test") == 0); furi_string_free(string); // test furi_string_alloc_set and free tmp = furi_string_alloc_set("more"); string = furi_string_alloc_set(tmp); furi_string_free(tmp); mu_check(string != NULL); mu_check(!furi_string_empty(string)); mu_check(furi_string_cmp(string, "more") == 0); furi_string_free(string); // test alloc_printf and free string = furi_string_alloc_printf("test %d %s %c 0x%02x", 1, "two", '3', 0x04); mu_check(string != NULL); mu_check(!furi_string_empty(string)); mu_check(furi_string_cmp(string, "test 1 two 3 0x04") == 0); furi_string_free(string); // test alloc_vprintf and free string = furi_string_alloc_vprintf_test("test %d %s %c 0x%02x", 4, "five", '6', 0x07); mu_check(string != NULL); mu_check(!furi_string_empty(string)); mu_check(furi_string_cmp(string, "test 4 five 6 0x07") == 0); furi_string_free(string); // test alloc_move and free tmp = furi_string_alloc_set("move"); string = furi_string_alloc_move(tmp); mu_check(string != NULL); mu_check(!furi_string_empty(string)); mu_check(furi_string_cmp(string, "move") == 0); furi_string_free(string); } MU_TEST(mu_test_furi_string_mem) { FuriString* string = furi_string_alloc_set("test"); mu_check(string != NULL); mu_check(!furi_string_empty(string)); // TODO FL-3493: how to test furi_string_reserve? // test furi_string_reset furi_string_reset(string); mu_check(furi_string_empty(string)); // test furi_string_swap furi_string_set(string, "test"); FuriString* swap_string = furi_string_alloc_set("swap"); furi_string_swap(string, swap_string); mu_check(furi_string_cmp(string, "swap") == 0); mu_check(furi_string_cmp(swap_string, "test") == 0); furi_string_free(swap_string); // test furi_string_move FuriString* move_string = furi_string_alloc_set("move"); furi_string_move(string, move_string); mu_check(furi_string_cmp(string, "move") == 0); // move_string is now empty // and tested by leaked memory check at the end of the tests furi_string_set(string, "abracadabra"); // test furi_string_hash mu_assert_int_eq(0xc3bc16d7, furi_string_hash(string)); // test furi_string_size mu_assert_int_eq(11, furi_string_size(string)); // test furi_string_empty mu_check(!furi_string_empty(string)); furi_string_reset(string); mu_check(furi_string_empty(string)); furi_string_free(string); } MU_TEST(mu_test_furi_string_getters) { FuriString* string = furi_string_alloc_set("test"); // test furi_string_get_char mu_check(furi_string_get_char(string, 0) == 't'); mu_check(furi_string_get_char(string, 1) == 'e'); mu_check(furi_string_get_char(string, 2) == 's'); mu_check(furi_string_get_char(string, 3) == 't'); // test furi_string_get_cstr mu_assert_string_eq("test", furi_string_get_cstr(string)); furi_string_free(string); } static FuriString* furi_string_vprintf_test(FuriString* string, const char format[], ...) { va_list args; va_start(args, format); furi_string_vprintf(string, format, args); va_end(args); return string; } MU_TEST(mu_test_furi_string_setters) { FuriString* tmp; FuriString* string = furi_string_alloc(); // test furi_string_set_str furi_string_set_str(string, "test"); mu_assert_string_eq("test", furi_string_get_cstr(string)); // test furi_string_set tmp = furi_string_alloc_set("more"); furi_string_set(string, tmp); furi_string_free(tmp); mu_assert_string_eq("more", furi_string_get_cstr(string)); // test furi_string_set_strn furi_string_set_strn(string, "test", 2); mu_assert_string_eq("te", furi_string_get_cstr(string)); // test furi_string_set_char furi_string_set_char(string, 0, 'a'); furi_string_set_char(string, 1, 'b'); mu_assert_string_eq("ab", furi_string_get_cstr(string)); // test furi_string_set_n tmp = furi_string_alloc_set("dodecahedron"); furi_string_set_n(string, tmp, 4, 5); furi_string_free(tmp); mu_assert_string_eq("cahed", furi_string_get_cstr(string)); // test furi_string_printf furi_string_printf(string, "test %d %s %c 0x%02x", 1, "two", '3', 0x04); mu_assert_string_eq("test 1 two 3 0x04", furi_string_get_cstr(string)); // test furi_string_vprintf furi_string_vprintf_test(string, "test %d %s %c 0x%02x", 4, "five", '6', 0x07); mu_assert_string_eq("test 4 five 6 0x07", furi_string_get_cstr(string)); furi_string_free(string); } static FuriString* furi_string_cat_vprintf_test(FuriString* string, const char format[], ...) { va_list args; va_start(args, format); furi_string_cat_vprintf(string, format, args); va_end(args); return string; } MU_TEST(mu_test_furi_string_appends) { FuriString* tmp; FuriString* string = furi_string_alloc(); // test furi_string_push_back furi_string_push_back(string, 't'); furi_string_push_back(string, 'e'); furi_string_push_back(string, 's'); furi_string_push_back(string, 't'); mu_assert_string_eq("test", furi_string_get_cstr(string)); furi_string_push_back(string, '!'); mu_assert_string_eq("test!", furi_string_get_cstr(string)); // test furi_string_cat_str furi_string_cat_str(string, "test"); mu_assert_string_eq("test!test", furi_string_get_cstr(string)); // test furi_string_cat tmp = furi_string_alloc_set("more"); furi_string_cat(string, tmp); furi_string_free(tmp); mu_assert_string_eq("test!testmore", furi_string_get_cstr(string)); // test furi_string_cat_printf furi_string_cat_printf(string, "test %d %s %c 0x%02x", 1, "two", '3', 0x04); mu_assert_string_eq("test!testmoretest 1 two 3 0x04", furi_string_get_cstr(string)); // test furi_string_cat_vprintf furi_string_cat_vprintf_test(string, "test %d %s %c 0x%02x", 4, "five", '6', 0x07); mu_assert_string_eq( "test!testmoretest 1 two 3 0x04test 4 five 6 0x07", furi_string_get_cstr(string)); furi_string_free(string); } MU_TEST(mu_test_furi_string_compare) { FuriString* string_1 = furi_string_alloc_set("string_1"); FuriString* string_2 = furi_string_alloc_set("string_2"); // test furi_string_cmp mu_assert_int_eq(0, furi_string_cmp(string_1, string_1)); mu_assert_int_eq(0, furi_string_cmp(string_2, string_2)); mu_assert_int_eq(-1, furi_string_cmp(string_1, string_2)); mu_assert_int_eq(1, furi_string_cmp(string_2, string_1)); // test furi_string_cmp_str mu_assert_int_eq(0, furi_string_cmp_str(string_1, "string_1")); mu_assert_int_eq(0, furi_string_cmp_str(string_2, "string_2")); mu_assert_int_eq(-1, furi_string_cmp_str(string_1, "string_2")); mu_assert_int_eq(1, furi_string_cmp_str(string_2, "string_1")); // test furi_string_cmpi furi_string_set(string_1, "string"); furi_string_set(string_2, "StrIng"); mu_assert_int_eq(0, furi_string_cmpi(string_1, string_1)); mu_assert_int_eq(0, furi_string_cmpi(string_2, string_2)); mu_assert_int_eq(0, furi_string_cmpi(string_1, string_2)); mu_assert_int_eq(0, furi_string_cmpi(string_2, string_1)); furi_string_set(string_1, "string_1"); furi_string_set(string_2, "StrIng_2"); mu_assert_int_eq(32, furi_string_cmp(string_1, string_2)); mu_assert_int_eq(-32, furi_string_cmp(string_2, string_1)); mu_assert_int_eq(-1, furi_string_cmpi(string_1, string_2)); mu_assert_int_eq(1, furi_string_cmpi(string_2, string_1)); // test furi_string_cmpi_str furi_string_set(string_1, "string"); mu_assert_int_eq(0, furi_string_cmp_str(string_1, "string")); mu_assert_int_eq(32, furi_string_cmp_str(string_1, "String")); mu_assert_int_eq(32, furi_string_cmp_str(string_1, "STring")); mu_assert_int_eq(32, furi_string_cmp_str(string_1, "STRing")); mu_assert_int_eq(32, furi_string_cmp_str(string_1, "STRIng")); mu_assert_int_eq(32, furi_string_cmp_str(string_1, "STRINg")); mu_assert_int_eq(32, furi_string_cmp_str(string_1, "STRING")); mu_assert_int_eq(0, furi_string_cmpi_str(string_1, "string")); mu_assert_int_eq(0, furi_string_cmpi_str(string_1, "String")); mu_assert_int_eq(0, furi_string_cmpi_str(string_1, "STring")); mu_assert_int_eq(0, furi_string_cmpi_str(string_1, "STRing")); mu_assert_int_eq(0, furi_string_cmpi_str(string_1, "STRIng")); mu_assert_int_eq(0, furi_string_cmpi_str(string_1, "STRINg")); mu_assert_int_eq(0, furi_string_cmpi_str(string_1, "STRING")); furi_string_free(string_1); furi_string_free(string_2); } MU_TEST(mu_test_furi_string_search) { // 012345678901234567 FuriString* haystack = furi_string_alloc_set("test321test123test"); FuriString* needle = furi_string_alloc_set("test"); // test furi_string_search mu_assert_int_eq(0, furi_string_search(haystack, needle)); mu_assert_int_eq(7, furi_string_search(haystack, needle, 1)); mu_assert_int_eq(14, furi_string_search(haystack, needle, 8)); mu_assert_int_eq(FURI_STRING_FAILURE, furi_string_search(haystack, needle, 15)); FuriString* tmp = furi_string_alloc_set("testnone"); mu_assert_int_eq(FURI_STRING_FAILURE, furi_string_search(haystack, tmp)); furi_string_free(tmp); // test furi_string_search_str mu_assert_int_eq(0, furi_string_search_str(haystack, "test")); mu_assert_int_eq(7, furi_string_search_str(haystack, "test", 1)); mu_assert_int_eq(14, furi_string_search_str(haystack, "test", 8)); mu_assert_int_eq(4, furi_string_search_str(haystack, "321")); mu_assert_int_eq(11, furi_string_search_str(haystack, "123")); mu_assert_int_eq(FURI_STRING_FAILURE, furi_string_search_str(haystack, "testnone")); mu_assert_int_eq(FURI_STRING_FAILURE, furi_string_search_str(haystack, "test", 15)); // test furi_string_search_char mu_assert_int_eq(0, furi_string_search_char(haystack, 't')); mu_assert_int_eq(1, furi_string_search_char(haystack, 'e')); mu_assert_int_eq(2, furi_string_search_char(haystack, 's')); mu_assert_int_eq(3, furi_string_search_char(haystack, 't', 1)); mu_assert_int_eq(7, furi_string_search_char(haystack, 't', 4)); mu_assert_int_eq(FURI_STRING_FAILURE, furi_string_search_char(haystack, 'x')); // test furi_string_search_rchar mu_assert_int_eq(17, furi_string_search_rchar(haystack, 't')); mu_assert_int_eq(15, furi_string_search_rchar(haystack, 'e')); mu_assert_int_eq(16, furi_string_search_rchar(haystack, 's')); mu_assert_int_eq(13, furi_string_search_rchar(haystack, '3')); mu_assert_int_eq(FURI_STRING_FAILURE, furi_string_search_rchar(haystack, '3', 14)); mu_assert_int_eq(FURI_STRING_FAILURE, furi_string_search_rchar(haystack, 'x')); furi_string_free(haystack); furi_string_free(needle); } MU_TEST(mu_test_furi_string_equality) { FuriString* string = furi_string_alloc_set("test"); FuriString* string_eq = furi_string_alloc_set("test"); FuriString* string_neq = furi_string_alloc_set("test2"); // test furi_string_equal mu_check(furi_string_equal(string, string_eq)); mu_check(!furi_string_equal(string, string_neq)); // test furi_string_equal_str mu_check(furi_string_equal_str(string, "test")); mu_check(!furi_string_equal_str(string, "test2")); mu_check(furi_string_equal_str(string_neq, "test2")); mu_check(!furi_string_equal_str(string_neq, "test")); furi_string_free(string); furi_string_free(string_eq); furi_string_free(string_neq); } MU_TEST(mu_test_furi_string_replace) { FuriString* needle = furi_string_alloc_set("test"); FuriString* replace = furi_string_alloc_set("replace"); FuriString* string = furi_string_alloc_set("test123test"); // test furi_string_replace_at furi_string_replace_at(string, 4, 3, "!biglongword!"); mu_assert_string_eq("test!biglongword!test", furi_string_get_cstr(string)); // test furi_string_replace mu_assert_int_eq(17, furi_string_replace(string, needle, replace, 1)); mu_assert_string_eq("test!biglongword!replace", furi_string_get_cstr(string)); mu_assert_int_eq(0, furi_string_replace(string, needle, replace)); mu_assert_string_eq("replace!biglongword!replace", furi_string_get_cstr(string)); mu_assert_int_eq(FURI_STRING_FAILURE, furi_string_replace(string, needle, replace)); mu_assert_string_eq("replace!biglongword!replace", furi_string_get_cstr(string)); // test furi_string_replace_str mu_assert_int_eq(20, furi_string_replace_str(string, "replace", "test", 1)); mu_assert_string_eq("replace!biglongword!test", furi_string_get_cstr(string)); mu_assert_int_eq(0, furi_string_replace_str(string, "replace", "test")); mu_assert_string_eq("test!biglongword!test", furi_string_get_cstr(string)); mu_assert_int_eq(FURI_STRING_FAILURE, furi_string_replace_str(string, "replace", "test")); mu_assert_string_eq("test!biglongword!test", furi_string_get_cstr(string)); // test furi_string_replace_all furi_string_replace_all(string, needle, replace); mu_assert_string_eq("replace!biglongword!replace", furi_string_get_cstr(string)); // test furi_string_replace_all_str furi_string_replace_all_str(string, "replace", "test"); mu_assert_string_eq("test!biglongword!test", furi_string_get_cstr(string)); furi_string_free(string); furi_string_free(needle); furi_string_free(replace); } MU_TEST(mu_test_furi_string_start_end) { FuriString* string = furi_string_alloc_set("start_end"); FuriString* start = furi_string_alloc_set("start"); FuriString* end = furi_string_alloc_set("end"); // test furi_string_start_with mu_check(furi_string_start_with(string, start)); mu_check(!furi_string_start_with(string, end)); // test furi_string_start_with_str mu_check(furi_string_start_with_str(string, "start")); mu_check(!furi_string_start_with_str(string, "end")); // test furi_string_end_with mu_check(furi_string_end_with(string, end)); mu_check(!furi_string_end_with(string, start)); // test furi_string_end_with_str mu_check(furi_string_end_with_str(string, "end")); mu_check(!furi_string_end_with_str(string, "start")); furi_string_free(string); furi_string_free(start); furi_string_free(end); } MU_TEST(mu_test_furi_string_trim) { FuriString* string = furi_string_alloc_set("biglongstring"); // test furi_string_left furi_string_left(string, 7); mu_assert_string_eq("biglong", furi_string_get_cstr(string)); // test furi_string_right furi_string_right(string, 3); mu_assert_string_eq("long", furi_string_get_cstr(string)); // test furi_string_mid furi_string_mid(string, 1, 2); mu_assert_string_eq("on", furi_string_get_cstr(string)); // test furi_string_trim furi_string_set(string, " \n\r\tbiglongstring \n\r\t "); furi_string_trim(string); mu_assert_string_eq("biglongstring", furi_string_get_cstr(string)); furi_string_set(string, "aaaabaaaabbaaabaaaabbtestaaaaaabbaaabaababaa"); furi_string_trim(string, "ab"); mu_assert_string_eq("test", furi_string_get_cstr(string)); furi_string_free(string); } MU_TEST(mu_test_furi_string_utf8) { FuriString* utf8_string = furi_string_alloc_set("イルカ"); // test furi_string_utf8_length mu_assert_int_eq(9, furi_string_size(utf8_string)); mu_assert_int_eq(3, furi_string_utf8_length(utf8_string)); // test furi_string_utf8_decode const uint8_t dolphin_emoji_array[4] = {0xF0, 0x9F, 0x90, 0xAC}; FuriStringUTF8State state = FuriStringUTF8StateStarting; FuriStringUnicodeValue value = 0; furi_string_utf8_decode(dolphin_emoji_array[0], &state, &value); mu_assert_int_eq(FuriStringUTF8StateDecoding3, state); furi_string_utf8_decode(dolphin_emoji_array[1], &state, &value); mu_assert_int_eq(FuriStringUTF8StateDecoding2, state); furi_string_utf8_decode(dolphin_emoji_array[2], &state, &value); mu_assert_int_eq(FuriStringUTF8StateDecoding1, state); furi_string_utf8_decode(dolphin_emoji_array[3], &state, &value); mu_assert_int_eq(FuriStringUTF8StateStarting, state); mu_assert_int_eq(0x1F42C, value); // test furi_string_utf8_push furi_string_set(utf8_string, ""); furi_string_utf8_push(utf8_string, value); mu_assert_string_eq("🐬", furi_string_get_cstr(utf8_string)); furi_string_free(utf8_string); } MU_TEST_SUITE(test_suite) { MU_SUITE_CONFIGURE(&test_setup, &test_teardown); MU_RUN_TEST(mu_test_furi_string_alloc_free); MU_RUN_TEST(mu_test_furi_string_mem); MU_RUN_TEST(mu_test_furi_string_getters); MU_RUN_TEST(mu_test_furi_string_setters); MU_RUN_TEST(mu_test_furi_string_appends); MU_RUN_TEST(mu_test_furi_string_compare); MU_RUN_TEST(mu_test_furi_string_search); MU_RUN_TEST(mu_test_furi_string_equality); MU_RUN_TEST(mu_test_furi_string_replace); MU_RUN_TEST(mu_test_furi_string_start_end); MU_RUN_TEST(mu_test_furi_string_trim); MU_RUN_TEST(mu_test_furi_string_utf8); } int run_minunit_test_furi_string(void) { MU_RUN_SUITE(test_suite); return MU_EXIT_CODE; } TEST_API_DEFINE(run_minunit_test_furi_string) ================================================ FILE: applications/debug/unit_tests/tests/infrared/infrared_test.c ================================================ #include #include #include #include #include #include "../test.h" // IWYU pragma: keep #define IR_TEST_FILES_DIR EXT_PATH("unit_tests/infrared/") #define IR_TEST_FILE_PREFIX "test_" #define IR_TEST_FILE_SUFFIX ".irtest" typedef struct { InfraredDecoderHandler* decoder_handler; InfraredEncoderHandler* encoder_handler; FuriString* file_path; FlipperFormat* ff; InfraredBruteForce* brutedb; } InfraredTest; static InfraredTest* test; static void infrared_test_alloc(void) { Storage* storage = furi_record_open(RECORD_STORAGE); test = malloc(sizeof(InfraredTest)); test->decoder_handler = infrared_alloc_decoder(); test->encoder_handler = infrared_alloc_encoder(); test->ff = flipper_format_buffered_file_alloc(storage); test->file_path = furi_string_alloc(); test->brutedb = infrared_brute_force_alloc(); } static void infrared_test_free(void) { furi_check(test); infrared_free_decoder(test->decoder_handler); infrared_free_encoder(test->encoder_handler); infrared_brute_force_free(test->brutedb); flipper_format_free(test->ff); furi_string_free(test->file_path); furi_record_close(RECORD_STORAGE); free(test); test = NULL; } static bool infrared_test_prepare_file(const char* protocol_name) { FuriString* file_type; file_type = furi_string_alloc(); bool success = false; furi_string_printf( test->file_path, "%s%s%s%s", IR_TEST_FILES_DIR, IR_TEST_FILE_PREFIX, protocol_name, IR_TEST_FILE_SUFFIX); do { uint32_t format_version; if(!flipper_format_buffered_file_open_existing( test->ff, furi_string_get_cstr(test->file_path))) break; if(!flipper_format_read_header(test->ff, file_type, &format_version)) break; if(furi_string_cmp_str(file_type, "IR tests file") || format_version != 1) break; success = true; } while(false); furi_string_free(file_type); return success; } static bool infrared_test_load_raw_signal( FlipperFormat* ff, const char* signal_name, uint32_t** timings, uint32_t* timings_count) { FuriString* buf; buf = furi_string_alloc(); bool success = false; do { bool is_name_found = false; for(; !is_name_found && flipper_format_read_string(ff, "name", buf); is_name_found = !furi_string_cmp(buf, signal_name)) ; if(!is_name_found) break; if(!flipper_format_read_string(ff, "type", buf) || furi_string_cmp_str(buf, "raw")) break; if(!flipper_format_get_value_count(ff, "data", timings_count)) break; if(!*timings_count) break; *timings = malloc(*timings_count * sizeof(uint32_t*)); if(!flipper_format_read_uint32(ff, "data", *timings, *timings_count)) { free(*timings); break; } success = true; } while(false); furi_string_free(buf); return success; } static bool infrared_test_read_message(FlipperFormat* ff, InfraredMessage* message) { FuriString* buf; buf = furi_string_alloc(); bool success = false; do { if(!flipper_format_read_string(ff, "protocol", buf)) break; message->protocol = infrared_get_protocol_by_name(furi_string_get_cstr(buf)); if(!infrared_is_protocol_valid(message->protocol)) break; if(!flipper_format_read_hex(ff, "address", (uint8_t*)&message->address, sizeof(uint32_t))) break; if(!flipper_format_read_hex(ff, "command", (uint8_t*)&message->command, sizeof(uint32_t))) break; if(!flipper_format_read_bool(ff, "repeat", &message->repeat, 1)) break; success = true; } while(false); furi_string_free(buf); return success; } static bool infrared_test_load_messages( FlipperFormat* ff, const char* signal_name, InfraredMessage** messages, uint32_t* messages_count) { FuriString* buf; buf = furi_string_alloc(); bool success = false; do { bool is_name_found = false; for(; !is_name_found && flipper_format_read_string(ff, "name", buf); is_name_found = !furi_string_cmp(buf, signal_name)) ; if(!is_name_found) break; if(!flipper_format_read_string(ff, "type", buf) || furi_string_cmp_str(buf, "parsed_array")) break; if(!flipper_format_read_uint32(ff, "count", messages_count, 1)) break; if(!*messages_count) break; *messages = malloc(*messages_count * sizeof(InfraredMessage)); uint32_t i; for(i = 0; i < *messages_count; ++i) { if(!infrared_test_read_message(ff, (*messages) + i)) { break; } } if(*messages_count != i) { free(*messages); break; } success = true; } while(false); furi_string_free(buf); return success; } static void infrared_test_compare_message_results( const InfraredMessage* message_decoded, const InfraredMessage* message_expected) { mu_check(message_decoded->protocol == message_expected->protocol); mu_check(message_decoded->command == message_expected->command); mu_check(message_decoded->address == message_expected->address); if((message_expected->protocol == InfraredProtocolSIRC) || (message_expected->protocol == InfraredProtocolSIRC15) || (message_expected->protocol == InfraredProtocolSIRC20)) { mu_check(message_decoded->repeat == false); } else { mu_check(message_decoded->repeat == message_expected->repeat); } } /* Encodes signal and merges same levels (high+high, low+low) */ static void infrared_test_run_encoder_fill_array( InfraredEncoderHandler* handler, uint32_t* timings, uint32_t* timings_len, bool* start_level) { uint32_t duration = 0; bool level = false; bool level_read; InfraredStatus status = InfraredStatusError; size_t i = 0; bool first = true; while(1) { status = infrared_encode(handler, &duration, &level_read); if(first) { if(start_level) *start_level = level_read; first = false; timings[0] = 0; } else if(level_read != level) { ++i; furi_check(i < *timings_len); timings[i] = 0; } level = level_read; timings[i] += duration; furi_check((status == InfraredStatusOk) || (status == InfraredStatusDone)); if(status == InfraredStatusDone) break; } *timings_len = i + 1; } // messages in input array for encoder should have one protocol static void infrared_test_run_encoder(InfraredProtocol protocol, uint32_t test_index) { uint32_t* timings; uint32_t timings_count = 200; uint32_t* expected_timings; uint32_t expected_timings_count; InfraredMessage* input_messages; uint32_t input_messages_count; FuriString* buf; buf = furi_string_alloc(); const char* protocol_name = infrared_get_protocol_name(protocol); mu_assert(infrared_test_prepare_file(protocol_name), "Failed to prepare test file"); furi_string_printf(buf, "encoder_input%ld", test_index); mu_assert( infrared_test_load_messages( test->ff, furi_string_get_cstr(buf), &input_messages, &input_messages_count), "Failed to load messages from file"); furi_string_printf(buf, "encoder_expected%ld", test_index); mu_assert( infrared_test_load_raw_signal( test->ff, furi_string_get_cstr(buf), &expected_timings, &expected_timings_count), "Failed to load raw signal from file"); flipper_format_buffered_file_close(test->ff); furi_string_free(buf); uint32_t j = 0; timings = malloc(sizeof(uint32_t) * timings_count); for(uint32_t message_counter = 0; message_counter < input_messages_count; ++message_counter) { const InfraredMessage* message = &input_messages[message_counter]; if(!message->repeat) { infrared_reset_encoder(test->encoder_handler, message); } timings_count = 200; infrared_test_run_encoder_fill_array(test->encoder_handler, timings, &timings_count, NULL); furi_check(timings_count <= 200); for(size_t i = 0; i < timings_count; ++i, ++j) { mu_check(MATCH_TIMING(timings[i], expected_timings[j], 120)); mu_assert(j < expected_timings_count, "encoded more timings than expected"); } } free(input_messages); free(expected_timings); free(timings); mu_assert(j == expected_timings_count, "encoded less timings than expected"); } static void infrared_test_run_encoder_decoder(InfraredProtocol protocol, uint32_t test_index) { uint32_t* timings = 0; uint32_t timings_count = 200; InfraredMessage* input_messages; uint32_t input_messages_count; bool level = false; FuriString* buf; buf = furi_string_alloc(); timings = malloc(sizeof(uint32_t) * timings_count); const char* protocol_name = infrared_get_protocol_name(protocol); mu_assert(infrared_test_prepare_file(protocol_name), "Failed to prepare test file"); furi_string_printf(buf, "encoder_decoder_input%ld", test_index); mu_assert( infrared_test_load_messages( test->ff, furi_string_get_cstr(buf), &input_messages, &input_messages_count), "Failed to load messages from file"); flipper_format_buffered_file_close(test->ff); furi_string_free(buf); for(uint32_t message_counter = 0; message_counter < input_messages_count; ++message_counter) { const InfraredMessage* message_encoded = &input_messages[message_counter]; if(!message_encoded->repeat) { infrared_reset_encoder(test->encoder_handler, message_encoded); } timings_count = 200; infrared_test_run_encoder_fill_array( test->encoder_handler, timings, &timings_count, &level); furi_check(timings_count <= 200); const InfraredMessage* message_decoded = 0; for(size_t i = 0; i < timings_count; ++i) { message_decoded = infrared_decode(test->decoder_handler, level, timings[i]); if((i == timings_count - 2) && level && message_decoded) { /* In case we end with space timing - message can be decoded at last mark */ break; } else if(i < timings_count - 1) { mu_check(!message_decoded); } else { if(!message_decoded) { message_decoded = infrared_check_decoder_ready(test->decoder_handler); } mu_check(message_decoded); } level = !level; } if(message_decoded) { infrared_test_compare_message_results(message_decoded, message_encoded); } else { mu_check(0); } } free(input_messages); free(timings); } static void infrared_test_run_decoder(InfraredProtocol protocol, uint32_t test_index) { uint32_t* timings; uint32_t timings_count; InfraredMessage* messages; uint32_t messages_count; FuriString* buf; buf = furi_string_alloc(); mu_assert( infrared_test_prepare_file(infrared_get_protocol_name(protocol)), "Failed to prepare test file"); furi_string_printf(buf, "decoder_input%ld", test_index); mu_assert( infrared_test_load_raw_signal( test->ff, furi_string_get_cstr(buf), &timings, &timings_count), "Failed to load raw signal from file"); furi_string_printf(buf, "decoder_expected%ld", test_index); mu_assert( infrared_test_load_messages( test->ff, furi_string_get_cstr(buf), &messages, &messages_count), "Failed to load messages from file"); flipper_format_buffered_file_close(test->ff); furi_string_free(buf); InfraredMessage message_decoded_check_local; bool level = 0; uint32_t message_counter = 0; const InfraredMessage* message_decoded = 0; for(uint32_t i = 0; i < timings_count; ++i) { const InfraredMessage* message_decoded_check = 0; if(timings[i] > INFRARED_RAW_RX_TIMING_DELAY_US) { message_decoded_check = infrared_check_decoder_ready(test->decoder_handler); if(message_decoded_check) { /* infrared_decode() can reset message, but we have to call infrared_decode() to perform real * simulation: infrared_check() by timeout, then infrared_decode() when meet edge */ message_decoded_check_local = *message_decoded_check; message_decoded_check = &message_decoded_check_local; } } message_decoded = infrared_decode(test->decoder_handler, level, timings[i]); if(message_decoded_check || message_decoded) { mu_assert( !(message_decoded_check && message_decoded), "both messages decoded: check_ready() and infrared_decode()"); if(message_decoded_check) { message_decoded = message_decoded_check; } mu_assert(message_counter < messages_count, "decoded more than expected"); infrared_test_compare_message_results(message_decoded, &messages[message_counter]); ++message_counter; } level = !level; } message_decoded = infrared_check_decoder_ready(test->decoder_handler); if(message_decoded) { infrared_test_compare_message_results(message_decoded, &messages[message_counter]); ++message_counter; } free(timings); free(messages); mu_assert(message_counter == messages_count, "decoded less than expected"); } MU_TEST(infrared_test_decoder_samsung32) { infrared_test_run_decoder(InfraredProtocolSamsung32, 1); } MU_TEST(infrared_test_decoder_mixed) { infrared_test_run_decoder(InfraredProtocolRC5, 2); infrared_test_run_decoder(InfraredProtocolSIRC, 1); infrared_test_run_decoder(InfraredProtocolNECext, 1); infrared_test_run_decoder(InfraredProtocolRC6, 2); infrared_test_run_decoder(InfraredProtocolSamsung32, 1); infrared_test_run_decoder(InfraredProtocolRC6, 1); infrared_test_run_decoder(InfraredProtocolSamsung32, 1); infrared_test_run_decoder(InfraredProtocolRC5, 1); infrared_test_run_decoder(InfraredProtocolSIRC, 2); infrared_test_run_decoder(InfraredProtocolNECext, 1); infrared_test_run_decoder(InfraredProtocolSIRC, 4); infrared_test_run_decoder(InfraredProtocolNEC, 2); infrared_test_run_decoder(InfraredProtocolRC6, 1); infrared_test_run_decoder(InfraredProtocolNECext, 1); infrared_test_run_decoder(InfraredProtocolSIRC, 5); infrared_test_run_decoder(InfraredProtocolNEC, 3); infrared_test_run_decoder(InfraredProtocolRC5, 5); infrared_test_run_decoder(InfraredProtocolSamsung32, 1); infrared_test_run_decoder(InfraredProtocolSIRC, 3); infrared_test_run_decoder(InfraredProtocolKaseikyo, 1); infrared_test_run_decoder(InfraredProtocolRCA, 1); infrared_test_run_decoder(InfraredProtocolPioneer, 6); } MU_TEST(infrared_test_decoder_nec) { for(uint32_t i = 1; i <= 3; ++i) { infrared_test_run_decoder(InfraredProtocolNEC, i); } } MU_TEST(infrared_test_decoder_unexpected_end_in_sequence) { for(uint32_t i = 1; i <= 2; ++i) { infrared_test_run_decoder(InfraredProtocolNEC, i); infrared_test_run_decoder(InfraredProtocolNEC, i); } } MU_TEST(infrared_test_decoder_necext1) { for(uint32_t i = 0; i < 2; ++i) { UNUSED(i); infrared_test_run_decoder(InfraredProtocolNECext, 1); } } MU_TEST(infrared_test_decoder_long_packets_with_nec_start) { for(uint32_t i = 1; i <= 2; ++i) { infrared_test_run_decoder(InfraredProtocolNEC42ext, i); } } MU_TEST(infrared_test_encoder_sirc) { for(uint32_t i = 1; i <= 2; ++i) { infrared_test_run_encoder(InfraredProtocolSIRC, i); } } MU_TEST(infrared_test_decoder_sirc) { for(uint32_t i = 1; i <= 5; ++i) { infrared_test_run_decoder(InfraredProtocolSIRC, 5); } } MU_TEST(infrared_test_decoder_rc5) { infrared_test_run_decoder(InfraredProtocolRC5X, 1); for(uint32_t i = 1; i <= 7; ++i) { infrared_test_run_decoder(InfraredProtocolRC5, i); } } MU_TEST(infrared_test_encoder_rc5x) { infrared_test_run_encoder(InfraredProtocolRC5X, 1); } MU_TEST(infrared_test_encoder_rc5) { infrared_test_run_encoder(InfraredProtocolRC5, 1); } MU_TEST(infrared_test_decoder_rc6) { infrared_test_run_decoder(InfraredProtocolRC6, 1); } MU_TEST(infrared_test_encoder_rc6) { infrared_test_run_encoder(InfraredProtocolRC6, 1); } MU_TEST(infrared_test_decoder_kaseikyo) { for(uint32_t i = 1; i <= 6; ++i) { infrared_test_run_decoder(InfraredProtocolKaseikyo, i); } } MU_TEST(infrared_test_decoder_rca) { for(uint32_t i = 1; i <= 6; ++i) { infrared_test_run_decoder(InfraredProtocolRCA, i); } } MU_TEST(infrared_test_decoder_pioneer) { for(uint32_t i = 1; i <= 11; ++i) { infrared_test_run_decoder(InfraredProtocolPioneer, i); } } MU_TEST(infrared_test_encoder_decoder_all) { infrared_test_run_encoder_decoder(InfraredProtocolNEC, 1); infrared_test_run_encoder_decoder(InfraredProtocolNECext, 1); infrared_test_run_encoder_decoder(InfraredProtocolNEC42, 1); infrared_test_run_encoder_decoder(InfraredProtocolNEC42ext, 1); infrared_test_run_encoder_decoder(InfraredProtocolSamsung32, 1); infrared_test_run_encoder_decoder(InfraredProtocolRC6, 1); infrared_test_run_encoder_decoder(InfraredProtocolRC5, 1); infrared_test_run_encoder_decoder(InfraredProtocolSIRC, 1); infrared_test_run_encoder_decoder(InfraredProtocolKaseikyo, 1); infrared_test_run_encoder_decoder(InfraredProtocolRCA, 1); infrared_test_run_encoder_decoder(InfraredProtocolPioneer, 1); } MU_TEST(infrared_test_ac_database) { infrared_brute_force_set_db_filename(test->brutedb, EXT_PATH("infrared/assets/ac.ir")); uint32_t i = 0; infrared_brute_force_add_record(test->brutedb, i++, "Off"); infrared_brute_force_add_record(test->brutedb, i++, "Dh"); infrared_brute_force_add_record(test->brutedb, i++, "Cool_hi"); infrared_brute_force_add_record(test->brutedb, i++, "Heat_hi"); infrared_brute_force_add_record(test->brutedb, i++, "Cool_lo"); infrared_brute_force_add_record(test->brutedb, i++, "Heat_lo"); mu_assert( infrared_brute_force_calculate_messages(test->brutedb) == InfraredErrorCodeNone, "universal ac database is invalid"); infrared_brute_force_reset(test->brutedb); } MU_TEST(infrared_test_audio_database) { infrared_brute_force_set_db_filename(test->brutedb, EXT_PATH("infrared/assets/audio.ir")); uint32_t i = 0; infrared_brute_force_add_record(test->brutedb, i++, "Power"); infrared_brute_force_add_record(test->brutedb, i++, "Mute"); infrared_brute_force_add_record(test->brutedb, i++, "Play"); infrared_brute_force_add_record(test->brutedb, i++, "Pause"); infrared_brute_force_add_record(test->brutedb, i++, "Prev"); infrared_brute_force_add_record(test->brutedb, i++, "Next"); infrared_brute_force_add_record(test->brutedb, i++, "Vol_dn"); infrared_brute_force_add_record(test->brutedb, i++, "Vol_up"); mu_assert( infrared_brute_force_calculate_messages(test->brutedb) == InfraredErrorCodeNone, "universal audio database is invalid"); infrared_brute_force_reset(test->brutedb); } MU_TEST(infrared_test_projector_database) { infrared_brute_force_set_db_filename(test->brutedb, EXT_PATH("infrared/assets/projector.ir")); uint32_t i = 0; infrared_brute_force_add_record(test->brutedb, i++, "Power"); infrared_brute_force_add_record(test->brutedb, i++, "Mute"); infrared_brute_force_add_record(test->brutedb, i++, "Vol_up"); infrared_brute_force_add_record(test->brutedb, i++, "Vol_dn"); mu_assert( infrared_brute_force_calculate_messages(test->brutedb) == InfraredErrorCodeNone, "universal projector database is invalid"); infrared_brute_force_reset(test->brutedb); } MU_TEST(infrared_test_tv_database) { infrared_brute_force_set_db_filename(test->brutedb, EXT_PATH("infrared/assets/tv.ir")); uint32_t i = 0; infrared_brute_force_add_record(test->brutedb, i++, "Power"); infrared_brute_force_add_record(test->brutedb, i++, "Mute"); infrared_brute_force_add_record(test->brutedb, i++, "Vol_up"); infrared_brute_force_add_record(test->brutedb, i++, "Ch_next"); infrared_brute_force_add_record(test->brutedb, i++, "Vol_dn"); infrared_brute_force_add_record(test->brutedb, i++, "Ch_prev"); mu_assert( infrared_brute_force_calculate_messages(test->brutedb) == InfraredErrorCodeNone, "universal tv database is invalid"); infrared_brute_force_reset(test->brutedb); } MU_TEST_SUITE(infrared_test) { MU_SUITE_CONFIGURE(&infrared_test_alloc, &infrared_test_free); MU_RUN_TEST(infrared_test_encoder_sirc); MU_RUN_TEST(infrared_test_decoder_sirc); MU_RUN_TEST(infrared_test_encoder_rc5x); MU_RUN_TEST(infrared_test_encoder_rc5); MU_RUN_TEST(infrared_test_decoder_rc5); MU_RUN_TEST(infrared_test_decoder_rc6); MU_RUN_TEST(infrared_test_encoder_rc6); MU_RUN_TEST(infrared_test_decoder_unexpected_end_in_sequence); MU_RUN_TEST(infrared_test_decoder_long_packets_with_nec_start); MU_RUN_TEST(infrared_test_decoder_nec); MU_RUN_TEST(infrared_test_decoder_samsung32); MU_RUN_TEST(infrared_test_decoder_necext1); MU_RUN_TEST(infrared_test_decoder_kaseikyo); MU_RUN_TEST(infrared_test_decoder_rca); MU_RUN_TEST(infrared_test_decoder_pioneer); MU_RUN_TEST(infrared_test_decoder_mixed); MU_RUN_TEST(infrared_test_encoder_decoder_all); MU_RUN_TEST(infrared_test_ac_database); MU_RUN_TEST(infrared_test_audio_database); MU_RUN_TEST(infrared_test_projector_database); MU_RUN_TEST(infrared_test_tv_database); } int run_minunit_test_infrared(void) { MU_RUN_SUITE(infrared_test); return MU_EXIT_CODE; } TEST_API_DEFINE(run_minunit_test_infrared) ================================================ FILE: applications/debug/unit_tests/tests/js/js_test.c ================================================ #include "../test.h" // IWYU pragma: keep #include #include #include #include #include #include #include #define TAG "JsUnitTests" #define JS_SCRIPT_PATH(name) EXT_PATH("unit_tests/js/" name ".js") typedef enum { JsTestsFinished = 1, JsTestsError = 2, } JsTestFlag; typedef struct { FuriEventFlag* event_flags; FuriString* error_string; } JsTestCallbackContext; static void js_test_callback(JsThreadEvent event, const char* msg, void* param) { JsTestCallbackContext* context = param; if(event == JsThreadEventPrint) { FURI_LOG_I("js_test", "%s", msg); } else if(event == JsThreadEventError || event == JsThreadEventErrorTrace) { context->error_string = furi_string_alloc_set_str(msg); furi_event_flag_set(context->event_flags, JsTestsFinished | JsTestsError); } else if(event == JsThreadEventDone) { furi_event_flag_set(context->event_flags, JsTestsFinished); } } static void js_test_run(const char* script_path) { JsTestCallbackContext* context = malloc(sizeof(JsTestCallbackContext)); context->event_flags = furi_event_flag_alloc(); JsThread* thread = js_thread_run(script_path, js_test_callback, context); uint32_t flags = furi_event_flag_wait( context->event_flags, JsTestsFinished, FuriFlagWaitAny, FuriWaitForever); if(flags & FuriFlagError) { // getting the flags themselves should not fail furi_crash(); } FuriString* error_string = context->error_string; js_thread_stop(thread); furi_event_flag_free(context->event_flags); free(context); if(flags & JsTestsError) { // memory leak: not freeing the FuriString if the tests fail, // because mu_fail executes a return // // who cares tho? mu_fail(furi_string_get_cstr(error_string)); } } MU_TEST(js_test_basic) { js_test_run(JS_SCRIPT_PATH("basic")); } MU_TEST(js_test_math) { js_test_run(JS_SCRIPT_PATH("math")); } MU_TEST(js_test_event_loop) { js_test_run(JS_SCRIPT_PATH("event_loop")); } MU_TEST(js_test_storage) { js_test_run(JS_SCRIPT_PATH("storage")); } static void js_value_test_compatibility_matrix(struct mjs* mjs) { static const JsValueType types[] = { JsValueTypeAny, JsValueTypeAnyArray, JsValueTypeAnyObject, JsValueTypeFunction, JsValueTypeRawPointer, JsValueTypeInt32, JsValueTypeDouble, JsValueTypeString, JsValueTypeBool, }; mjs_val_t values[] = { mjs_mk_undefined(), mjs_mk_foreign(mjs, (void*)0xDEADBEEF), mjs_mk_array(mjs), mjs_mk_object(mjs), mjs_mk_number(mjs, 123.456), mjs_mk_string(mjs, "test", ~0, false), mjs_mk_boolean(mjs, true), }; // for proper matrix formatting and better readability #define YES true #define NO_ false static const bool success_matrix[COUNT_OF(types)][COUNT_OF(values)] = { // types: {YES, YES, YES, YES, YES, YES, YES}, // any {NO_, NO_, YES, NO_, NO_, NO_, NO_}, // array {NO_, NO_, YES, YES, NO_, NO_, NO_}, // obj {NO_, NO_, NO_, NO_, NO_, NO_, NO_}, // fn {NO_, YES, NO_, NO_, NO_, NO_, NO_}, // ptr {NO_, NO_, NO_, NO_, YES, NO_, NO_}, // int32 {NO_, NO_, NO_, NO_, YES, NO_, NO_}, // double {NO_, NO_, NO_, NO_, NO_, YES, NO_}, // str {NO_, NO_, NO_, NO_, NO_, NO_, YES}, // bool // //und ptr arr obj num str bool <- values }; #undef NO_ #undef YES for(size_t i = 0; i < COUNT_OF(types); i++) { for(size_t j = 0; j < COUNT_OF(values); j++) { const JsValueDeclaration declaration = { .type = types[i], .n_children = 0, }; // we only care about the status, not the result. double has the largest size out of // all the results uint8_t result[sizeof(double)]; JsValueParseStatus status; JS_VALUE_PARSE( mjs, JS_VALUE_PARSE_SOURCE_VALUE(&declaration), JsValueParseFlagNone, &status, &values[j], result); if((status == JsValueParseStatusOk) != success_matrix[i][j]) { FURI_LOG_E(TAG, "type %zu, value %zu", i, j); mu_fail("see serial logs"); } } } } static void js_value_test_literal(struct mjs* mjs) { static const JsValueType types[] = { JsValueTypeAny, JsValueTypeAnyArray, JsValueTypeAnyObject, }; mjs_val_t values[] = { mjs_mk_undefined(), mjs_mk_array(mjs), mjs_mk_object(mjs), }; mu_assert_int_eq(COUNT_OF(types), COUNT_OF(values)); for(size_t i = 0; i < COUNT_OF(types); i++) { const JsValueDeclaration declaration = { .type = types[i], .n_children = 0, }; mjs_val_t result; JsValueParseStatus status; JS_VALUE_PARSE( mjs, JS_VALUE_PARSE_SOURCE_VALUE(&declaration), JsValueParseFlagNone, &status, &values[i], &result); mu_assert_int_eq(JsValueParseStatusOk, status); mu_assert(result == values[i], "wrong result"); } } static void js_value_test_primitive( struct mjs* mjs, JsValueType type, const void* c_value, size_t c_value_size, mjs_val_t js_val) { const JsValueDeclaration declaration = { .type = type, .n_children = 0, }; uint8_t result[c_value_size]; JsValueParseStatus status; JS_VALUE_PARSE( mjs, JS_VALUE_PARSE_SOURCE_VALUE(&declaration), JsValueParseFlagNone, &status, &js_val, result); mu_assert_int_eq(JsValueParseStatusOk, status); if(type == JsValueTypeString) { const char* result_str = *(const char**)&result; mu_assert_string_eq(c_value, result_str); } else { mu_assert_mem_eq(c_value, result, c_value_size); } } static void js_value_test_primitives(struct mjs* mjs) { int32_t i32 = 123; js_value_test_primitive(mjs, JsValueTypeInt32, &i32, sizeof(i32), mjs_mk_number(mjs, i32)); double dbl = 123.456; js_value_test_primitive(mjs, JsValueTypeDouble, &dbl, sizeof(dbl), mjs_mk_number(mjs, dbl)); const char* str = "test"; js_value_test_primitive( mjs, JsValueTypeString, str, strlen(str) + 1, mjs_mk_string(mjs, str, ~0, false)); bool boolean = true; js_value_test_primitive( mjs, JsValueTypeBool, &boolean, sizeof(boolean), mjs_mk_boolean(mjs, boolean)); } static uint32_t js_value_test_enum(struct mjs* mjs, const JsValueDeclaration* decl, const char* value) { mjs_val_t str = mjs_mk_string(mjs, value, ~0, false); uint32_t result; JsValueParseStatus status; JS_VALUE_PARSE( mjs, JS_VALUE_PARSE_SOURCE_VALUE(decl), JsValueParseFlagNone, &status, &str, &result); if(status != JsValueParseStatusOk) return 0; return result; } static void js_value_test_enums(struct mjs* mjs) { static const JsValueEnumVariant enum_1_variants[] = { {"variant 1", 1}, {"variant 2", 2}, {"variant 3", 3}, }; static const JsValueDeclaration enum_1 = JS_VALUE_ENUM(uint32_t, enum_1_variants); static const JsValueEnumVariant enum_2_variants[] = { {"read", 4}, {"write", 8}, }; static const JsValueDeclaration enum_2 = JS_VALUE_ENUM(uint32_t, enum_2_variants); mu_assert_int_eq(1, js_value_test_enum(mjs, &enum_1, "variant 1")); mu_assert_int_eq(2, js_value_test_enum(mjs, &enum_1, "variant 2")); mu_assert_int_eq(3, js_value_test_enum(mjs, &enum_1, "variant 3")); mu_assert_int_eq(0, js_value_test_enum(mjs, &enum_1, "not a thing")); mu_assert_int_eq(0, js_value_test_enum(mjs, &enum_2, "variant 1")); mu_assert_int_eq(0, js_value_test_enum(mjs, &enum_2, "variant 2")); mu_assert_int_eq(0, js_value_test_enum(mjs, &enum_2, "variant 3")); mu_assert_int_eq(0, js_value_test_enum(mjs, &enum_2, "not a thing")); mu_assert_int_eq(4, js_value_test_enum(mjs, &enum_2, "read")); mu_assert_int_eq(8, js_value_test_enum(mjs, &enum_2, "write")); } static void js_value_test_object(struct mjs* mjs) { static const JsValueDeclaration int_decl = JS_VALUE_SIMPLE(JsValueTypeInt32); static const JsValueDeclaration str_decl = JS_VALUE_SIMPLE(JsValueTypeString); static const JsValueEnumVariant enum_variants[] = { {"variant 1", 1}, {"variant 2", 2}, {"variant 3", 3}, }; static const JsValueDeclaration enum_decl = JS_VALUE_ENUM(uint32_t, enum_variants); static const JsValueObjectField fields[] = { {"int", &int_decl}, {"str", &str_decl}, {"enum", &enum_decl}, }; static const JsValueDeclaration object_decl = JS_VALUE_OBJECT(fields); mjs_val_t object = mjs_mk_object(mjs); JS_ASSIGN_MULTI(mjs, object) { JS_FIELD("str", mjs_mk_string(mjs, "Helloooo!", ~0, false)); JS_FIELD("int", mjs_mk_number(mjs, 123)); JS_FIELD("enum", mjs_mk_string(mjs, "variant 2", ~0, false)); } const char* result_str; int32_t result_int; uint32_t result_enum; JsValueParseStatus status; JS_VALUE_PARSE( mjs, JS_VALUE_PARSE_SOURCE_VALUE(&object_decl), JsValueParseFlagNone, &status, &object, &result_int, &result_str, &result_enum); mu_assert_int_eq(JsValueParseStatusOk, status); mu_assert_string_eq("Helloooo!", result_str); mu_assert_int_eq(123, result_int); mu_assert_int_eq(2, result_enum); } static void js_value_test_default(struct mjs* mjs) { static const JsValueDeclaration int_decl = JS_VALUE_SIMPLE_W_DEFAULT(JsValueTypeInt32, int32_val, 123); static const JsValueDeclaration str_decl = JS_VALUE_SIMPLE(JsValueTypeString); static const JsValueObjectField fields[] = { {"int", &int_decl}, {"str", &str_decl}, }; static const JsValueDeclaration object_decl = JS_VALUE_OBJECT(fields); mjs_val_t object = mjs_mk_object(mjs); JS_ASSIGN_MULTI(mjs, object) { JS_FIELD("str", mjs_mk_string(mjs, "Helloooo!", ~0, false)); JS_FIELD("int", mjs_mk_undefined()); } const char* result_str; int32_t result_int; JsValueParseStatus status; JS_VALUE_PARSE( mjs, JS_VALUE_PARSE_SOURCE_VALUE(&object_decl), JsValueParseFlagNone, &status, &object, &result_int, &result_str); mu_assert_string_eq("Helloooo!", result_str); mu_assert_int_eq(123, result_int); } static void js_value_test_args_fn(struct mjs* mjs) { static const JsValueDeclaration arg_list[] = { JS_VALUE_SIMPLE(JsValueTypeInt32), JS_VALUE_SIMPLE(JsValueTypeInt32), JS_VALUE_SIMPLE(JsValueTypeInt32), }; static const JsValueArguments args = JS_VALUE_ARGS(arg_list); int32_t a, b, c; JS_VALUE_PARSE_ARGS_OR_RETURN(mjs, &args, &a, &b, &c); mu_assert_int_eq(123, a); mu_assert_int_eq(456, b); mu_assert_int_eq(-420, c); } static void js_value_test_args(struct mjs* mjs) { mjs_val_t function = MJS_MK_FN(js_value_test_args_fn); mjs_val_t result; mjs_val_t args[] = { mjs_mk_number(mjs, 123), mjs_mk_number(mjs, 456), mjs_mk_number(mjs, -420), }; mu_assert_int_eq( MJS_OK, mjs_apply(mjs, &result, function, MJS_UNDEFINED, COUNT_OF(args), args)); } MU_TEST(js_value_test) { struct mjs* mjs = mjs_create(NULL); js_value_test_compatibility_matrix(mjs); js_value_test_literal(mjs); js_value_test_primitives(mjs); js_value_test_enums(mjs); js_value_test_object(mjs); js_value_test_default(mjs); js_value_test_args(mjs); mjs_destroy(mjs); } MU_TEST_SUITE(test_js) { MU_RUN_TEST(js_value_test); MU_RUN_TEST(js_test_basic); MU_RUN_TEST(js_test_math); MU_RUN_TEST(js_test_event_loop); MU_RUN_TEST(js_test_storage); } int run_minunit_test_js(void) { MU_RUN_SUITE(test_js); return MU_EXIT_CODE; } TEST_API_DEFINE(run_minunit_test_js) ================================================ FILE: applications/debug/unit_tests/tests/lfrfid/lfrfid_protocols.c ================================================ #include #include "../test.h" // IWYU pragma: keep #include #include #include #define LF_RFID_READ_TIMING_MULTIPLIER 8 #define EM_TEST_DATA {0x58, 0x00, 0x85, 0x64, 0x02} #define EM_TEST_DATA_SIZE 5 #define EM_TEST_EMULATION_TIMINGS_COUNT (64 * 2) const int8_t em_test_timings[EM_TEST_EMULATION_TIMINGS_COUNT] = { 32, -32, 32, -32, 32, -32, 32, -32, 32, -32, 32, -32, 32, -32, 32, -32, 32, -32, -32, 32, 32, -32, -32, 32, 32, -32, -32, 32, 32, -32, -32, 32, -32, 32, -32, 32, 32, -32, -32, 32, -32, 32, -32, 32, -32, 32, -32, 32, -32, 32, -32, 32, -32, 32, -32, 32, -32, 32, 32, -32, -32, 32, -32, 32, -32, 32, 32, -32, -32, 32, 32, -32, -32, 32, 32, -32, -32, 32, -32, 32, 32, -32, 32, -32, -32, 32, -32, 32, -32, 32, 32, -32, -32, 32, -32, 32, 32, -32, -32, 32, -32, 32, -32, 32, -32, 32, -32, 32, -32, 32, -32, 32, 32, -32, -32, 32, 32, -32, -32, 32, -32, 32, -32, 32, -32, 32, -32, 32, }; #define HID10301_TEST_DATA {0x8D, 0x48, 0xA8} #define HID10301_TEST_DATA_SIZE 3 #define HID10301_TEST_EMULATION_TIMINGS_COUNT (541 * 2) const int8_t hid10301_test_timings[HID10301_TEST_EMULATION_TIMINGS_COUNT] = { 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, }; #define IOPROX_XSF_TEST_DATA {0x65, 0x01, 0x05, 0x39} #define IOPROX_XSF_TEST_DATA_SIZE 4 #define IOPROX_XSF_TEST_EMULATION_TIMINGS_COUNT (468 * 2) const int8_t ioprox_xsf_test_timings[IOPROX_XSF_TEST_EMULATION_TIMINGS_COUNT] = { 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 4, -4, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, 5, -5, }; #define INDALA26_EMULATION_TIMINGS_COUNT (1024 * 2) #define INDALA26_TEST_DATA {0x3B, 0x73, 0x64, 0xA8} #define INDALA26_TEST_DATA_SIZE 4 const int8_t indala26_test_timings[INDALA26_EMULATION_TIMINGS_COUNT] = { 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, -1, 1, }; #define FDXB_TEST_DATA {0x44, 0x88, 0x23, 0xF2, 0x5A, 0x6F, 0x00, 0x01, 0x00, 0x00, 0x00} #define FDXB_TEST_DATA_SIZE 11 #define FDXB_TEST_EMULATION_TIMINGS_COUNT (206) const int8_t fdxb_test_timings[FDXB_TEST_EMULATION_TIMINGS_COUNT] = { 32, -16, 16, -16, 16, -16, 16, -16, 16, -16, 16, -16, 16, -16, 16, -16, 16, -16, 16, -16, 16, -32, 16, -16, 32, -16, 16, -16, 16, -16, 16, -32, 16, -16, 16, -16, 32, -32, 16, -16, 16, -16, 16, -16, 32, -16, 16, -16, 16, -16, 16, -32, 16, -16, 16, -16, 32, -16, 16, -16, 16, -16, 16, -32, 32, -32, 32, -32, 32, -32, 16, -16, 16, -16, 32, -16, 16, -32, 16, -16, 32, -16, 16, -32, 32, -16, 16, -32, 16, -16, 32, -16, 16, -32, 32, -16, 16, -32, 32, -32, 32, -32, 16, -16, 16, -16, 16, -16, 16, -16, 16, -16, 16, -16, 16, -16, 16, -16, 32, -16, 16, -16, 16, -16, 16, -16, 16, -16, 16, -16, 16, -16, 16, -32, 32, -32, 32, -32, 32, -32, 16, -16, 32, -32, 32, -16, 16, -16, 16, -32, 32, -32, 32, -32, 32, -32, 16, -16, 16, -16, 16, -16, 16, -16, 16, -16, 16, -16, 16, -16, 16, -16, 32, -16, 16, -16, 16, -16, 16, -16, 16, -16, 16, -16, 16, -16, 16, -16, 16, -32, 16, -16, 16, -16, 16, -16, 16, -16, 16, -16, 16, -16, 16, -16, 16, -16, }; MU_TEST(test_lfrfid_protocol_em_read_simple) { ProtocolDict* dict = protocol_dict_alloc(lfrfid_protocols, LFRFIDProtocolMax); mu_assert_int_eq(EM_TEST_DATA_SIZE, protocol_dict_get_data_size(dict, LFRFIDProtocolEM4100)); mu_assert_string_eq("EM4100", protocol_dict_get_name(dict, LFRFIDProtocolEM4100)); mu_assert_string_eq("EM-Micro", protocol_dict_get_manufacturer(dict, LFRFIDProtocolEM4100)); const uint8_t data[EM_TEST_DATA_SIZE] = EM_TEST_DATA; protocol_dict_decoders_start(dict); ProtocolId protocol = PROTOCOL_NO; PulseGlue* pulse_glue = pulse_glue_alloc(); for(size_t i = 0; i < EM_TEST_EMULATION_TIMINGS_COUNT * 10; i++) { bool pulse_pop = pulse_glue_push( pulse_glue, em_test_timings[i % EM_TEST_EMULATION_TIMINGS_COUNT] >= 0, abs(em_test_timings[i % EM_TEST_EMULATION_TIMINGS_COUNT]) * LF_RFID_READ_TIMING_MULTIPLIER); if(pulse_pop) { uint32_t length, period; pulse_glue_pop(pulse_glue, &length, &period); protocol = protocol_dict_decoders_feed(dict, true, period); if(protocol != PROTOCOL_NO) break; protocol = protocol_dict_decoders_feed(dict, false, length - period); if(protocol != PROTOCOL_NO) break; } } pulse_glue_free(pulse_glue); mu_assert_int_eq(LFRFIDProtocolEM4100, protocol); uint8_t received_data[EM_TEST_DATA_SIZE] = {0}; protocol_dict_get_data(dict, protocol, received_data, EM_TEST_DATA_SIZE); mu_assert_mem_eq(data, received_data, EM_TEST_DATA_SIZE); protocol_dict_free(dict); } MU_TEST(test_lfrfid_protocol_em_emulate_simple) { ProtocolDict* dict = protocol_dict_alloc(lfrfid_protocols, LFRFIDProtocolMax); mu_assert_int_eq(EM_TEST_DATA_SIZE, protocol_dict_get_data_size(dict, LFRFIDProtocolEM4100)); mu_assert_string_eq("EM4100", protocol_dict_get_name(dict, LFRFIDProtocolEM4100)); mu_assert_string_eq("EM-Micro", protocol_dict_get_manufacturer(dict, LFRFIDProtocolEM4100)); const uint8_t data[EM_TEST_DATA_SIZE] = EM_TEST_DATA; protocol_dict_set_data(dict, LFRFIDProtocolEM4100, data, EM_TEST_DATA_SIZE); mu_check(protocol_dict_encoder_start(dict, LFRFIDProtocolEM4100)); for(size_t i = 0; i < EM_TEST_EMULATION_TIMINGS_COUNT; i++) { LevelDuration level_duration = protocol_dict_encoder_yield(dict, LFRFIDProtocolEM4100); if(level_duration_get_level(level_duration)) { mu_assert_int_eq(em_test_timings[i], level_duration_get_duration(level_duration)); } else { mu_assert_int_eq(em_test_timings[i], -level_duration_get_duration(level_duration)); } } protocol_dict_free(dict); } MU_TEST(test_lfrfid_protocol_h10301_read_simple) { ProtocolDict* dict = protocol_dict_alloc(lfrfid_protocols, LFRFIDProtocolMax); mu_assert_int_eq( HID10301_TEST_DATA_SIZE, protocol_dict_get_data_size(dict, LFRFIDProtocolH10301)); mu_assert_string_eq("H10301", protocol_dict_get_name(dict, LFRFIDProtocolH10301)); mu_assert_string_eq("HID", protocol_dict_get_manufacturer(dict, LFRFIDProtocolH10301)); const uint8_t data[HID10301_TEST_DATA_SIZE] = HID10301_TEST_DATA; protocol_dict_decoders_start(dict); ProtocolId protocol = PROTOCOL_NO; PulseGlue* pulse_glue = pulse_glue_alloc(); for(size_t i = 0; i < HID10301_TEST_EMULATION_TIMINGS_COUNT * 10; i++) { bool pulse_pop = pulse_glue_push( pulse_glue, hid10301_test_timings[i % HID10301_TEST_EMULATION_TIMINGS_COUNT] >= 0, abs(hid10301_test_timings[i % HID10301_TEST_EMULATION_TIMINGS_COUNT]) * LF_RFID_READ_TIMING_MULTIPLIER); if(pulse_pop) { uint32_t length, period; pulse_glue_pop(pulse_glue, &length, &period); protocol = protocol_dict_decoders_feed(dict, true, period); if(protocol != PROTOCOL_NO) break; protocol = protocol_dict_decoders_feed(dict, false, length - period); if(protocol != PROTOCOL_NO) break; } } pulse_glue_free(pulse_glue); mu_assert_int_eq(LFRFIDProtocolH10301, protocol); uint8_t received_data[HID10301_TEST_DATA_SIZE] = {0}; protocol_dict_get_data(dict, protocol, received_data, HID10301_TEST_DATA_SIZE); mu_assert_mem_eq(data, received_data, HID10301_TEST_DATA_SIZE); protocol_dict_free(dict); } MU_TEST(test_lfrfid_protocol_h10301_emulate_simple) { ProtocolDict* dict = protocol_dict_alloc(lfrfid_protocols, LFRFIDProtocolMax); mu_assert_int_eq( HID10301_TEST_DATA_SIZE, protocol_dict_get_data_size(dict, LFRFIDProtocolH10301)); mu_assert_string_eq("H10301", protocol_dict_get_name(dict, LFRFIDProtocolH10301)); mu_assert_string_eq("HID", protocol_dict_get_manufacturer(dict, LFRFIDProtocolH10301)); const uint8_t data[HID10301_TEST_DATA_SIZE] = HID10301_TEST_DATA; protocol_dict_set_data(dict, LFRFIDProtocolH10301, data, HID10301_TEST_DATA_SIZE); mu_check(protocol_dict_encoder_start(dict, LFRFIDProtocolH10301)); for(size_t i = 0; i < HID10301_TEST_EMULATION_TIMINGS_COUNT; i++) { LevelDuration level_duration = protocol_dict_encoder_yield(dict, LFRFIDProtocolH10301); if(level_duration_get_level(level_duration)) { mu_assert_int_eq( hid10301_test_timings[i], level_duration_get_duration(level_duration)); } else { mu_assert_int_eq( hid10301_test_timings[i], -level_duration_get_duration(level_duration)); } } protocol_dict_free(dict); } MU_TEST(test_lfrfid_protocol_ioprox_xsf_read_simple) { ProtocolDict* dict = protocol_dict_alloc(lfrfid_protocols, LFRFIDProtocolMax); mu_assert_int_eq( IOPROX_XSF_TEST_DATA_SIZE, protocol_dict_get_data_size(dict, LFRFIDProtocolIOProxXSF)); mu_assert_string_eq("IoProxXSF", protocol_dict_get_name(dict, LFRFIDProtocolIOProxXSF)); mu_assert_string_eq("Kantech", protocol_dict_get_manufacturer(dict, LFRFIDProtocolIOProxXSF)); const uint8_t data[IOPROX_XSF_TEST_DATA_SIZE] = IOPROX_XSF_TEST_DATA; protocol_dict_decoders_start(dict); ProtocolId protocol = PROTOCOL_NO; PulseGlue* pulse_glue = pulse_glue_alloc(); for(size_t i = 0; i < IOPROX_XSF_TEST_EMULATION_TIMINGS_COUNT * 10; i++) { bool pulse_pop = pulse_glue_push( pulse_glue, ioprox_xsf_test_timings[i % IOPROX_XSF_TEST_EMULATION_TIMINGS_COUNT] >= 0, abs(ioprox_xsf_test_timings[i % IOPROX_XSF_TEST_EMULATION_TIMINGS_COUNT]) * LF_RFID_READ_TIMING_MULTIPLIER); if(pulse_pop) { uint32_t length, period; pulse_glue_pop(pulse_glue, &length, &period); protocol = protocol_dict_decoders_feed(dict, true, period); if(protocol != PROTOCOL_NO) break; protocol = protocol_dict_decoders_feed(dict, false, length - period); if(protocol != PROTOCOL_NO) break; } } pulse_glue_free(pulse_glue); mu_assert_int_eq(LFRFIDProtocolIOProxXSF, protocol); uint8_t received_data[IOPROX_XSF_TEST_DATA_SIZE] = {0}; protocol_dict_get_data(dict, protocol, received_data, IOPROX_XSF_TEST_DATA_SIZE); mu_assert_mem_eq(data, received_data, IOPROX_XSF_TEST_DATA_SIZE); protocol_dict_free(dict); } MU_TEST(test_lfrfid_protocol_ioprox_xsf_emulate_simple) { ProtocolDict* dict = protocol_dict_alloc(lfrfid_protocols, LFRFIDProtocolMax); mu_assert_int_eq( IOPROX_XSF_TEST_DATA_SIZE, protocol_dict_get_data_size(dict, LFRFIDProtocolIOProxXSF)); mu_assert_string_eq("IoProxXSF", protocol_dict_get_name(dict, LFRFIDProtocolIOProxXSF)); mu_assert_string_eq("Kantech", protocol_dict_get_manufacturer(dict, LFRFIDProtocolIOProxXSF)); const uint8_t data[IOPROX_XSF_TEST_DATA_SIZE] = IOPROX_XSF_TEST_DATA; protocol_dict_set_data(dict, LFRFIDProtocolIOProxXSF, data, IOPROX_XSF_TEST_DATA_SIZE); mu_check(protocol_dict_encoder_start(dict, LFRFIDProtocolIOProxXSF)); for(size_t i = 0; i < IOPROX_XSF_TEST_EMULATION_TIMINGS_COUNT; i++) { LevelDuration level_duration = protocol_dict_encoder_yield(dict, LFRFIDProtocolIOProxXSF); if(level_duration_get_level(level_duration)) { mu_assert_int_eq( ioprox_xsf_test_timings[i], level_duration_get_duration(level_duration)); } else { mu_assert_int_eq( ioprox_xsf_test_timings[i], -level_duration_get_duration(level_duration)); } } protocol_dict_free(dict); } MU_TEST(test_lfrfid_protocol_inadala26_emulate_simple) { ProtocolDict* dict = protocol_dict_alloc(lfrfid_protocols, LFRFIDProtocolMax); mu_assert_int_eq( INDALA26_TEST_DATA_SIZE, protocol_dict_get_data_size(dict, LFRFIDProtocolIndala26)); mu_assert_string_eq("Indala26", protocol_dict_get_name(dict, LFRFIDProtocolIndala26)); mu_assert_string_eq("Motorola", protocol_dict_get_manufacturer(dict, LFRFIDProtocolIndala26)); const uint8_t data[INDALA26_TEST_DATA_SIZE] = INDALA26_TEST_DATA; protocol_dict_set_data(dict, LFRFIDProtocolIndala26, data, INDALA26_TEST_DATA_SIZE); mu_check(protocol_dict_encoder_start(dict, LFRFIDProtocolIndala26)); for(size_t i = 0; i < INDALA26_EMULATION_TIMINGS_COUNT; i++) { LevelDuration level_duration = protocol_dict_encoder_yield(dict, LFRFIDProtocolIndala26); if(level_duration_get_level(level_duration)) { mu_assert_int_eq( indala26_test_timings[i], level_duration_get_duration(level_duration)); } else { mu_assert_int_eq( indala26_test_timings[i], -level_duration_get_duration(level_duration)); } } protocol_dict_free(dict); } MU_TEST(test_lfrfid_protocol_fdxb_emulate_simple) { ProtocolDict* dict = protocol_dict_alloc(lfrfid_protocols, LFRFIDProtocolMax); mu_assert_int_eq(FDXB_TEST_DATA_SIZE, protocol_dict_get_data_size(dict, LFRFIDProtocolFDXB)); mu_assert_string_eq("FDX-B", protocol_dict_get_name(dict, LFRFIDProtocolFDXB)); mu_assert_string_eq("ISO", protocol_dict_get_manufacturer(dict, LFRFIDProtocolFDXB)); const uint8_t data[FDXB_TEST_DATA_SIZE] = FDXB_TEST_DATA; protocol_dict_set_data(dict, LFRFIDProtocolFDXB, data, FDXB_TEST_DATA_SIZE); mu_check(protocol_dict_encoder_start(dict, LFRFIDProtocolFDXB)); for(size_t i = 0; i < FDXB_TEST_EMULATION_TIMINGS_COUNT; i++) { LevelDuration level_duration = protocol_dict_encoder_yield(dict, LFRFIDProtocolFDXB); if(level_duration_get_level(level_duration)) { mu_assert_int_eq(fdxb_test_timings[i], level_duration_get_duration(level_duration)); } else { mu_assert_int_eq(fdxb_test_timings[i], -level_duration_get_duration(level_duration)); } } protocol_dict_free(dict); } MU_TEST(test_lfrfid_protocol_fdxb_read_simple) { ProtocolDict* dict = protocol_dict_alloc(lfrfid_protocols, LFRFIDProtocolMax); mu_assert_int_eq(FDXB_TEST_DATA_SIZE, protocol_dict_get_data_size(dict, LFRFIDProtocolFDXB)); mu_assert_string_eq("FDX-B", protocol_dict_get_name(dict, LFRFIDProtocolFDXB)); mu_assert_string_eq("ISO", protocol_dict_get_manufacturer(dict, LFRFIDProtocolFDXB)); const uint8_t data[FDXB_TEST_DATA_SIZE] = FDXB_TEST_DATA; protocol_dict_decoders_start(dict); ProtocolId protocol = PROTOCOL_NO; PulseGlue* pulse_glue = pulse_glue_alloc(); for(size_t i = 0; i < FDXB_TEST_EMULATION_TIMINGS_COUNT * 10; i++) { bool pulse_pop = pulse_glue_push( pulse_glue, fdxb_test_timings[i % FDXB_TEST_EMULATION_TIMINGS_COUNT] >= 0, abs(fdxb_test_timings[i % FDXB_TEST_EMULATION_TIMINGS_COUNT]) * LF_RFID_READ_TIMING_MULTIPLIER); if(pulse_pop) { uint32_t length, period; pulse_glue_pop(pulse_glue, &length, &period); protocol = protocol_dict_decoders_feed(dict, true, period); if(protocol != PROTOCOL_NO) break; protocol = protocol_dict_decoders_feed(dict, false, length - period); if(protocol != PROTOCOL_NO) break; } } pulse_glue_free(pulse_glue); mu_assert_int_eq(LFRFIDProtocolFDXB, protocol); uint8_t received_data[FDXB_TEST_DATA_SIZE] = {0}; protocol_dict_get_data(dict, protocol, received_data, FDXB_TEST_DATA_SIZE); mu_assert_mem_eq(data, received_data, FDXB_TEST_DATA_SIZE); protocol_dict_free(dict); } MU_TEST_SUITE(test_lfrfid_protocols_suite) { MU_RUN_TEST(test_lfrfid_protocol_em_read_simple); MU_RUN_TEST(test_lfrfid_protocol_em_emulate_simple); MU_RUN_TEST(test_lfrfid_protocol_h10301_read_simple); MU_RUN_TEST(test_lfrfid_protocol_h10301_emulate_simple); MU_RUN_TEST(test_lfrfid_protocol_ioprox_xsf_read_simple); MU_RUN_TEST(test_lfrfid_protocol_ioprox_xsf_emulate_simple); MU_RUN_TEST(test_lfrfid_protocol_inadala26_emulate_simple); MU_RUN_TEST(test_lfrfid_protocol_fdxb_read_simple); MU_RUN_TEST(test_lfrfid_protocol_fdxb_emulate_simple); } int run_minunit_test_lfrfid_protocols(void) { MU_RUN_SUITE(test_lfrfid_protocols_suite); return MU_EXIT_CODE; } TEST_API_DEFINE(run_minunit_test_lfrfid_protocols) ================================================ FILE: applications/debug/unit_tests/tests/manifest/manifest.c ================================================ #include #include "../test.h" // IWYU pragma: keep #include #define TAG "Manifest" MU_TEST(manifest_type_test) { mu_assert(ResourceManifestEntryTypeUnknown == 0, "ResourceManifestEntryTypeUnknown != 0\r\n"); mu_assert(ResourceManifestEntryTypeVersion == 1, "ResourceManifestEntryTypeVersion != 1\r\n"); mu_assert( ResourceManifestEntryTypeTimestamp == 2, "ResourceManifestEntryTypeTimestamp != 2\r\n"); mu_assert( ResourceManifestEntryTypeDirectory == 3, "ResourceManifestEntryTypeDirectory != 3\r\n"); mu_assert(ResourceManifestEntryTypeFile == 4, "ResourceManifestEntryTypeFile != 4\r\n"); } MU_TEST(manifest_iteration_test) { bool result = true; size_t counters[5] = {0}; Storage* storage = furi_record_open(RECORD_STORAGE); ResourceManifestReader* manifest_reader = resource_manifest_reader_alloc(storage); do { // Open manifest file if(!resource_manifest_reader_open(manifest_reader, EXT_PATH("unit_tests/Manifest_test"))) { result = false; break; } // Iterate forward ResourceManifestEntry* entry_ptr = NULL; while((entry_ptr = resource_manifest_reader_next(manifest_reader))) { FURI_LOG_D(TAG, "F:%u:%s", entry_ptr->type, furi_string_get_cstr(entry_ptr->name)); if(entry_ptr->type > 4) { mu_fail("entry_ptr->type > 4\r\n"); result = false; break; } counters[entry_ptr->type]++; } if(!result) break; // Iterate backward while((entry_ptr = resource_manifest_reader_previous(manifest_reader))) { FURI_LOG_D(TAG, "B:%u:%s", entry_ptr->type, furi_string_get_cstr(entry_ptr->name)); if(entry_ptr->type > 4) { mu_fail("entry_ptr->type > 4\r\n"); result = false; break; } counters[entry_ptr->type]--; } } while(false); resource_manifest_reader_free(manifest_reader); furi_record_close(RECORD_STORAGE); mu_assert(counters[ResourceManifestEntryTypeUnknown] == 0, "Unknown counter != 0\r\n"); mu_assert(counters[ResourceManifestEntryTypeVersion] == 0, "Version counter != 0\r\n"); mu_assert(counters[ResourceManifestEntryTypeTimestamp] == 0, "Timestamp counter != 0\r\n"); mu_assert(counters[ResourceManifestEntryTypeDirectory] == 0, "Directory counter != 0\r\n"); mu_assert(counters[ResourceManifestEntryTypeFile] == 0, "File counter != 0\r\n"); mu_assert(result, "Manifest forward iterate failed\r\n"); } MU_TEST_SUITE(manifest_suite) { MU_RUN_TEST(manifest_type_test); MU_RUN_TEST(manifest_iteration_test); } int run_minunit_test_manifest(void) { MU_RUN_SUITE(manifest_suite); return MU_EXIT_CODE; } TEST_API_DEFINE(run_minunit_test_manifest) ================================================ FILE: applications/debug/unit_tests/tests/minunit.h ================================================ /* * Copyright (c) 2012 David Siñuela Pastor, siu.4coders@gmail.com * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef MINUNIT_MINUNIT_H #define MINUNIT_MINUNIT_H #ifdef __cplusplus extern "C" { #endif #if defined(_WIN32) #include #if defined(_MSC_VER) && _MSC_VER < 1900 #define snprintf _snprintf #define __func__ __FUNCTION__ //-V1059 #endif #elif defined(__unix__) || defined(__unix) || defined(unix) || \ (defined(__APPLE__) && defined(__MACH__)) /* Change POSIX C SOURCE version for pure c99 compilers */ #if !defined(_POSIX_C_SOURCE) || _POSIX_C_SOURCE < 200112L #undef _POSIX_C_SOURCE #define _POSIX_C_SOURCE 200112L #endif #include /* POSIX flags */ #include /* clock_gettime(), time() */ #include /* gethrtime(), gettimeofday() */ #include #include #include #if defined(__MACH__) && defined(__APPLE__) #include #include #endif #if __GNUC__ >= 5 && !defined(__STDC_VERSION__) #define __func__ __extension__ __FUNCTION__ //-V1059 #endif #else // #error "Unable to define timers for an unknown OS." #endif #include #include /* Maximum length of last message */ #define MINUNIT_MESSAGE_LEN 1024 /* Accuracy with which floats are compared */ #define MINUNIT_EPSILON 1E-12 #include "minunit_vars_ex.h" /* Test setup and teardown function pointers */ __attribute__((unused)) static void (*minunit_setup)(void) = NULL; __attribute__((unused)) static void (*minunit_teardown)(void) = NULL; void minunit_print_progress(void); void minunit_print_fail(const char* error); void minunit_printf_warning(const char* format, ...); /* Definitions */ #define MU_TEST(method_name) static void method_name(void) #define MU_TEST_1(method_name, arg_1) static void method_name(arg_1) #define MU_TEST_SUITE(suite_name) static void suite_name(void) #define MU__SAFE_BLOCK(block) \ do { \ block \ } while(0) /* Run test suite and unset setup and teardown functions */ #define MU_RUN_SUITE(suite_name) \ MU__SAFE_BLOCK(suite_name(); minunit_setup = NULL; minunit_teardown = NULL;) /* Configure setup and teardown functions */ #define MU_SUITE_CONFIGURE(setup_fun, teardown_fun) \ MU__SAFE_BLOCK(minunit_setup = setup_fun; minunit_teardown = teardown_fun;) /* Test runner */ //-V:MU_RUN_TEST:550 #define MU_RUN_TEST(test) \ MU__SAFE_BLOCK( \ if(minunit_real_timer == 0 && minunit_proc_timer == 0) { \ minunit_real_timer = mu_timer_real(); \ minunit_proc_timer = mu_timer_cpu(); \ } if(minunit_setup) (*minunit_setup)(); \ minunit_status = 0; \ printf(#test "()\r\n"); \ test(); \ minunit_run++; \ if(minunit_status) { \ minunit_fail++; \ minunit_print_fail(minunit_last_message); \ minunit_status = 0; \ } fflush(stdout); \ if(minunit_teardown)(*minunit_teardown)();) #define MU_RUN_TEST_1(test, arg_1) \ MU__SAFE_BLOCK( \ if(minunit_real_timer == 0 && minunit_proc_timer == 0) { \ minunit_real_timer = mu_timer_real(); \ minunit_proc_timer = mu_timer_cpu(); \ } if(minunit_setup) (*minunit_setup)(); \ minunit_status = 0; \ printf(#test "(" #arg_1 ")\r\n"); \ test(arg_1); \ minunit_run++; \ if(minunit_status) { \ minunit_fail++; \ minunit_print_fail(minunit_last_message); \ minunit_status = 0; \ } fflush(stdout); \ if(minunit_teardown)(*minunit_teardown)();) /* Report */ #define MU_REPORT() \ MU__SAFE_BLOCK(double minunit_end_real_timer; double minunit_end_proc_timer; printf( \ "\n\n%d tests, %d assertions, %d failures\n", \ minunit_run, \ minunit_assert, \ minunit_fail); \ minunit_end_real_timer = mu_timer_real(); \ minunit_end_proc_timer = mu_timer_cpu(); \ printf( \ "\nFinished in %.8f seconds (real) %.8f seconds (proc)\n\n", \ minunit_end_real_timer - minunit_real_timer, \ minunit_end_proc_timer - minunit_proc_timer);) #define MU_EXIT_CODE minunit_fail /* Warnings */ #define mu_warn(message) \ MU__SAFE_BLOCK(minunit_printf_warning("%s:%d: %s", __FILE__, __LINE__, message);) /* Assertions */ #define mu_check(test) \ MU__SAFE_BLOCK( \ minunit_assert++; if(!(test)) { \ snprintf( \ minunit_last_message, \ MINUNIT_MESSAGE_LEN, \ "%s failed:\r\n\t%s:%d: %s", \ __func__, \ __FILE__, \ __LINE__, \ #test); \ minunit_status = 1; \ return; \ } else { minunit_print_progress(); }) #define mu_fail(message) \ MU__SAFE_BLOCK(minunit_assert++; snprintf( \ minunit_last_message, \ MINUNIT_MESSAGE_LEN, \ "%s failed:\r\n\t%s:%d: %s", \ __func__, \ __FILE__, \ __LINE__, \ message); \ minunit_status = 1; \ return;) #define mu_assert(test, message) \ MU__SAFE_BLOCK( \ minunit_assert++; if(!(test)) { \ snprintf( \ minunit_last_message, \ MINUNIT_MESSAGE_LEN, \ "%s failed:\r\n\t%s:%d: %s", \ __func__, \ __FILE__, \ __LINE__, \ message); \ minunit_status = 1; \ return; \ } else { minunit_print_progress(); }) #define mu_assert_int_eq(expected, result) \ MU__SAFE_BLOCK( \ int minunit_tmp_e; int minunit_tmp_r; minunit_assert++; minunit_tmp_e = (expected); \ minunit_tmp_r = (result); \ if(minunit_tmp_e != minunit_tmp_r) { \ snprintf( \ minunit_last_message, \ MINUNIT_MESSAGE_LEN, \ "%s failed:\r\n\t%s:%d: %d expected but was %d", \ __func__, \ __FILE__, \ __LINE__, \ minunit_tmp_e, \ minunit_tmp_r); \ minunit_status = 1; \ return; \ } else { minunit_print_progress(); }) #define mu_assert_int_not_eq(expected, result) \ MU__SAFE_BLOCK( \ int minunit_tmp_e; int minunit_tmp_r; minunit_assert++; minunit_tmp_e = (expected); \ minunit_tmp_r = (result); \ if(minunit_tmp_e == minunit_tmp_r) { \ snprintf( \ minunit_last_message, \ MINUNIT_MESSAGE_LEN, \ "%s failed:\r\n\t%s:%d: expected different results but both were %d", \ __func__, \ __FILE__, \ __LINE__, \ minunit_tmp_e); \ minunit_status = 1; \ return; \ } else { minunit_print_progress(); }) #define mu_assert_int_greater_than(val, result) \ MU__SAFE_BLOCK( \ int minunit_tmp_e; int minunit_tmp_r; minunit_assert++; minunit_tmp_e = (val); \ minunit_tmp_r = (result); \ if(val >= minunit_tmp_r) { \ snprintf( \ minunit_last_message, \ MINUNIT_MESSAGE_LEN, \ "%s failed:\r\n\t%s:%d: %d <= %d", \ __func__, \ __FILE__, \ __LINE__, \ minunit_tmp_r, \ minunit_tmp_e); \ minunit_status = 1; \ return; \ } else { minunit_print_progress(); }) #define mu_assert_int_less_than(val, result) \ MU__SAFE_BLOCK( \ int minunit_tmp_e; int minunit_tmp_r; minunit_assert++; minunit_tmp_e = (val); \ minunit_tmp_r = (result); \ if(val <= minunit_tmp_r) { \ snprintf( \ minunit_last_message, \ MINUNIT_MESSAGE_LEN, \ "%s failed:\r\n\t%s:%d: %d >= %d", \ __func__, \ __FILE__, \ __LINE__, \ minunit_tmp_r, \ minunit_tmp_e); \ minunit_status = 1; \ return; \ } else { minunit_print_progress(); }) #define mu_assert_int_between(expected_lower, expected_upper, result) \ MU__SAFE_BLOCK( \ int minunit_tmp_e; int minunit_tmp_m; int minunit_tmp_r; minunit_assert++; \ minunit_tmp_e = (expected_lower); \ minunit_tmp_m = (expected_upper); \ minunit_tmp_r = (result); \ if(result < minunit_tmp_e || result > minunit_tmp_m) { \ snprintf( \ minunit_last_message, \ MINUNIT_MESSAGE_LEN, \ "%s failed:\r\n\t%s:%d: %d was not between (inclusive) %d and %d", \ __func__, \ __FILE__, \ __LINE__, \ minunit_tmp_e, \ minunit_tmp_r, \ minunit_tmp_m); \ minunit_status = 1; \ return; \ } else { minunit_print_progress(); }) #define mu_assert_int_in(expected, array_length, result) \ MU__SAFE_BLOCK( \ int minunit_tmp_r; minunit_assert++; minunit_tmp_r = (result); int t = 0; int i; \ for(i = 0; i < array_length; i++) { \ if(expected[i] == minunit_tmp_r) t = 1; \ } if(t == 0) { \ char tmp[500] = {0}; \ tmp[0] = '['; \ for(i = 0; i < array_length; i++) { \ sprintf(tmp + strlen(tmp), "%d, ", expected[i]); \ } \ int len = strlen(tmp); \ tmp[len - 2] = ']'; \ tmp[len - 1] = '\0'; \ snprintf( \ minunit_last_message, \ MINUNIT_MESSAGE_LEN, \ "%s failed:\r\n\t%s:%d: expected to be one of %s but was %d", \ __func__, \ __FILE__, \ __LINE__, \ tmp, \ minunit_tmp_r); \ minunit_status = 1; \ return; \ } else { minunit_print_progress(); }) #define mu_assert_double_eq(expected, result) \ MU__SAFE_BLOCK( \ double minunit_tmp_e; double minunit_tmp_r; minunit_assert++; minunit_tmp_e = (expected); \ minunit_tmp_r = (result); \ if(fabs(minunit_tmp_e - minunit_tmp_r) > (double)MINUNIT_EPSILON) { \ int minunit_significant_figures = 1 - log10(MINUNIT_EPSILON); \ snprintf( \ minunit_last_message, \ MINUNIT_MESSAGE_LEN, \ "%s failed:\r\n\t%s:%d: %.*g expected but was %.*g", \ __func__, \ __FILE__, \ __LINE__, \ minunit_significant_figures, \ minunit_tmp_e, \ minunit_significant_figures, \ minunit_tmp_r); \ minunit_status = 1; \ return; \ } else { minunit_print_progress(); }) #define mu_assert_double_greater_than(val, result) \ MU__SAFE_BLOCK( \ double minunit_tmp_e; double minunit_tmp_r; minunit_assert++; minunit_tmp_e = (val); \ minunit_tmp_r = (result); \ if(val >= minunit_tmp_r) { \ snprintf( \ minunit_last_message, \ MINUNIT_MESSAGE_LEN, \ "%s failed:\r\n\t%s:%d: %f <= %f", \ __func__, \ __FILE__, \ __LINE__, \ minunit_tmp_r, \ minunit_tmp_e); \ minunit_status = 1; \ return; \ } else { minunit_print_progress(); }) #define mu_assert_double_less_than(val, result) \ MU__SAFE_BLOCK( \ double minunit_tmp_e; double minunit_tmp_r; minunit_assert++; minunit_tmp_e = (val); \ minunit_tmp_r = (result); \ if(val <= minunit_tmp_r) { \ snprintf( \ minunit_last_message, \ MINUNIT_MESSAGE_LEN, \ "%s failed:\r\n\t%s:%d: %f >= %f", \ __func__, \ __FILE__, \ __LINE__, \ minunit_tmp_r, \ minunit_tmp_e); \ minunit_status = 1; \ return; \ } else { minunit_print_progress(); }) #define mu_assert_double_between(expected_lower, expected_upper, result) \ MU__SAFE_BLOCK( \ double minunit_tmp_e; double minunit_tmp_m; double minunit_tmp_r; minunit_assert++; \ minunit_tmp_e = (expected_lower); \ minunit_tmp_m = (expected_upper); \ minunit_tmp_r = (result); \ if(result < minunit_tmp_e || result > minunit_tmp_m) { \ snprintf( \ minunit_last_message, \ MINUNIT_MESSAGE_LEN, \ "%s failed:\r\n\t%s:%d: %f was not between (inclusive) %f and %f", \ __func__, \ __FILE__, \ __LINE__, \ minunit_tmp_r, \ minunit_tmp_e, \ minunit_tmp_m); \ minunit_status = 1; \ return; \ } else { minunit_print_progress(); }) //-V:mu_assert_string_eq:526, 547 #define mu_assert_string_eq(expected, result) \ MU__SAFE_BLOCK( \ const char* minunit_tmp_e = expected; const char* minunit_tmp_r = result; \ minunit_assert++; \ if(!minunit_tmp_e) { minunit_tmp_e = ""; } if(!minunit_tmp_r) { \ minunit_tmp_r = ""; \ } if(strcmp(minunit_tmp_e, minunit_tmp_r)) { \ snprintf( \ minunit_last_message, \ MINUNIT_MESSAGE_LEN, \ "%s failed:\r\n\t%s:%d: '%s' expected but was '%s'", \ __func__, \ __FILE__, \ __LINE__, \ minunit_tmp_e, \ minunit_tmp_r); \ minunit_status = 1; \ return; \ } else { minunit_print_progress(); }) //-V:mu_assert_mem_eq:526 #define mu_assert_mem_eq(expected, result, size) \ MU__SAFE_BLOCK( \ const void* minunit_tmp_e = expected; const void* minunit_tmp_r = result; \ minunit_assert++; \ if(memcmp(minunit_tmp_e, minunit_tmp_r, size)) { \ snprintf( \ minunit_last_message, \ MINUNIT_MESSAGE_LEN, \ "%s failed:\r\n\t%s:%d: mem not equal\r\n\tEXP RES", \ __func__, \ __FILE__, \ __LINE__); \ for(size_t __index = 0; __index < size; __index++) { \ if(strlen(minunit_last_message) > MINUNIT_MESSAGE_LEN - 20) break; \ uint8_t __e = ((uint8_t*)minunit_tmp_e)[__index]; \ uint8_t __r = ((uint8_t*)minunit_tmp_r)[__index]; \ snprintf( \ minunit_last_message + strlen(minunit_last_message), \ MINUNIT_MESSAGE_LEN - strlen(minunit_last_message), \ "\r\n\t%02X %s %02X", \ __e, \ ((__e == __r) ? ".." : "!="), \ __r); \ } \ minunit_status = 1; \ return; \ } else { minunit_print_progress(); }) #define mu_assert_null(result) \ MU__SAFE_BLOCK( \ minunit_assert++; if(result == NULL) { minunit_print_progress(); } else { \ snprintf( \ minunit_last_message, \ MINUNIT_MESSAGE_LEN, \ "%s failed:\r\n\t%s:%d: Expected result was not NULL", \ __func__, \ __FILE__, \ __LINE__); \ minunit_status = 1; \ return; \ }) #define mu_assert_not_null(result) \ MU__SAFE_BLOCK( \ minunit_assert++; if(result != NULL) { minunit_print_progress(); } else { \ snprintf( \ minunit_last_message, \ MINUNIT_MESSAGE_LEN, \ "%s failed:\r\n\t%s:%d: Expected result was not NULL", \ __func__, \ __FILE__, \ __LINE__); \ minunit_status = 1; \ return; \ }) #define mu_assert_pointers_eq(pointer1, pointer2) \ MU__SAFE_BLOCK( \ minunit_assert++; if(pointer1 == pointer2) { minunit_print_progress(); } else { \ snprintf( \ minunit_last_message, \ MINUNIT_MESSAGE_LEN, \ "%s failed:\r\n\t%s:%d: Expected the pointers to point to the same memory location", \ __func__, \ __FILE__, \ __LINE__); \ minunit_status = 1; \ return; \ }) #define mu_assert_pointers_not_eq(pointer1, pointer2) \ MU__SAFE_BLOCK( \ minunit_assert++; if(pointer1 != pointer2) { minunit_print_progress(); } else { \ snprintf( \ minunit_last_message, \ MINUNIT_MESSAGE_LEN, \ "%s failed:\r\n\t%s:%d: Expected the pointers to point to the same memory location", \ __func__, \ __FILE__, \ __LINE__); \ minunit_status = 1; \ return; \ }) /* * The following two functions were written by David Robert Nadeau * from http://NadeauSoftware.com/ and distributed under the * Creative Commons Attribution 3.0 Unported License */ /** * Returns the real time, in seconds, or -1.0 if an error occurred. * * Time is measured since an arbitrary and OS-dependent start time. * The returned real time is only useful for computing an elapsed time * between two calls to this function. */ __attribute__((unused)) static double mu_timer_real(void) { #if defined(_WIN32) /* Windows 2000 and later. ---------------------------------- */ LARGE_INTEGER Time; LARGE_INTEGER Frequency; QueryPerformanceFrequency(&Frequency); QueryPerformanceCounter(&Time); Time.QuadPart *= 1000000; Time.QuadPart /= Frequency.QuadPart; return (double)Time.QuadPart / 1000000.0; #elif(defined(__hpux) || defined(hpux)) || \ ((defined(__sun__) || defined(__sun) || defined(sun)) && \ (defined(__SVR4) || defined(__svr4__))) /* HP-UX, Solaris. ------------------------------------------ */ return (double)gethrtime() / 1000000000.0; #elif defined(__MACH__) && defined(__APPLE__) /* OSX. ----------------------------------------------------- */ static double timeConvert = 0.0; if(timeConvert == 0.0) { mach_timebase_info_data_t timeBase; (void)mach_timebase_info(&timeBase); timeConvert = (double)timeBase.numer / (double)timeBase.denom / 1000000000.0; } return (double)mach_absolute_time() * timeConvert; #elif defined(_POSIX_VERSION) /* POSIX. --------------------------------------------------- */ struct timeval tm; #if defined(_POSIX_TIMERS) && (_POSIX_TIMERS > 0) { struct timespec ts; #if defined(CLOCK_MONOTONIC_PRECISE) /* BSD. --------------------------------------------- */ const clockid_t id = CLOCK_MONOTONIC_PRECISE; #elif defined(CLOCK_MONOTONIC_RAW) /* Linux. ------------------------------------------- */ const clockid_t id = CLOCK_MONOTONIC_RAW; #elif defined(CLOCK_HIGHRES) /* Solaris. ----------------------------------------- */ const clockid_t id = CLOCK_HIGHRES; #elif defined(CLOCK_MONOTONIC) /* AIX, BSD, Linux, POSIX, Solaris. ----------------- */ const clockid_t id = CLOCK_MONOTONIC; #elif defined(CLOCK_REALTIME) /* AIX, BSD, HP-UX, Linux, POSIX. ------------------- */ const clockid_t id = CLOCK_REALTIME; #else const clockid_t id = (clockid_t)-1; /* Unknown. */ #endif /* CLOCK_* */ if(id != (clockid_t)-1 && clock_gettime(id, &ts) != -1) return (double)ts.tv_sec + (double)ts.tv_nsec / 1000000000.0; /* Fall thru. */ } #endif /* _POSIX_TIMERS */ /* AIX, BSD, Cygwin, HP-UX, Linux, OSX, POSIX, Solaris. ----- */ gettimeofday(&tm, NULL); return (double)tm.tv_sec + (double)tm.tv_usec / 1000000.0; #else return -1.0; /* Failed. */ #endif } /** * Returns the amount of CPU time used by the current process, * in seconds, or -1.0 if an error occurred. */ __attribute__((unused)) static double mu_timer_cpu(void) { #if defined(_WIN32) /* Windows -------------------------------------------------- */ FILETIME createTime; FILETIME exitTime; FILETIME kernelTime; FILETIME userTime; /* This approach has a resolution of 1/64 second. Unfortunately, Windows' API does not offer better */ if(GetProcessTimes(GetCurrentProcess(), &createTime, &exitTime, &kernelTime, &userTime) != 0) { ULARGE_INTEGER userSystemTime; memcpy(&userSystemTime, &userTime, sizeof(ULARGE_INTEGER)); return (double)userSystemTime.QuadPart / 10000000.0; } #elif defined(__unix__) || defined(__unix) || defined(unix) || \ (defined(__APPLE__) && defined(__MACH__)) /* AIX, BSD, Cygwin, HP-UX, Linux, OSX, and Solaris --------- */ #if defined(_POSIX_TIMERS) && (_POSIX_TIMERS > 0) /* Prefer high-res POSIX timers, when available. */ { clockid_t id; struct timespec ts; #if _POSIX_CPUTIME > 0 /* Clock ids vary by OS. Query the id, if possible. */ if(clock_getcpuclockid(0, &id) == -1) #endif #if defined(CLOCK_PROCESS_CPUTIME_ID) /* Use known clock id for AIX, Linux, or Solaris. */ id = CLOCK_PROCESS_CPUTIME_ID; #elif defined(CLOCK_VIRTUAL) /* Use known clock id for BSD or HP-UX. */ id = CLOCK_VIRTUAL; #else id = (clockid_t)-1; #endif if(id != (clockid_t)-1 && clock_gettime(id, &ts) != -1) return (double)ts.tv_sec + (double)ts.tv_nsec / 1000000000.0; } #endif #if defined(RUSAGE_SELF) { struct rusage rusage; if(getrusage(RUSAGE_SELF, &rusage) != -1) return (double)rusage.ru_utime.tv_sec + (double)rusage.ru_utime.tv_usec / 1000000.0; } #endif #if defined(_SC_CLK_TCK) { const double ticks = (double)sysconf(_SC_CLK_TCK); struct tms tms; if(times(&tms) != (clock_t)-1) return (double)tms.tms_utime / ticks; } #endif #if defined(CLOCKS_PER_SEC) { clock_t cl = clock(); if(cl != (clock_t)-1) return (double)cl / (double)CLOCKS_PER_SEC; } #endif #endif return -1; /* Failed. */ } #ifdef __cplusplus } #endif #endif /* MINUNIT_MINUNIT_H */ ================================================ FILE: applications/debug/unit_tests/tests/minunit_vars.h ================================================ #pragma once #include "minunit.h" /* Misc. counters */ int minunit_run = 0; int minunit_assert = 0; int minunit_fail = 0; int minunit_status = 0; /* Timers */ double minunit_real_timer = 0; double minunit_proc_timer = 0; /* Last message */ char minunit_last_message[MINUNIT_MESSAGE_LEN]; ================================================ FILE: applications/debug/unit_tests/tests/minunit_vars_ex.h ================================================ #pragma once #include "minunit.h" /* Misc. counters */ extern int minunit_run; extern int minunit_assert; extern int minunit_fail; extern int minunit_status; /* Timers */ extern double minunit_real_timer; extern double minunit_proc_timer; /* Last message */ extern char minunit_last_message[MINUNIT_MESSAGE_LEN]; ================================================ FILE: applications/debug/unit_tests/tests/nfc/nfc_test.c ================================================ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "../test.h" // IWYU pragma: keep #define TAG "NfcTest" #define NFC_TEST_NFC_DEV_PATH EXT_PATH("unit_tests/nfc/nfc_device_test.nfc") #define NFC_APP_MF_CLASSIC_DICT_UNIT_TEST_PATH EXT_PATH("unit_tests/mf_dict.nfc") #define NFC_TEST_FLAG_WORKER_DONE (1) typedef enum { NfcTestMfClassicSendFrameTestStateAuth, NfcTestMfClassicSendFrameTestStateReadBlock, NfcTestMfClassicSendFrameTestStateFail, NfcTestMfClassicSendFrameTestStateSuccess, } NfcTestMfClassicSendFrameTestState; typedef struct { NfcTestMfClassicSendFrameTestState state; BitBuffer* tx_buf; BitBuffer* rx_buf; FuriThreadId thread_id; } NfcTestMfClassicSendFrameTest; typedef enum { NfcTestSlixPollerSetPasswordStateGetRandomNumber, NfcTestSlixPollerSetPasswordStateSetPassword, } NfcTestSlixPollerSetPasswordState; typedef struct { FuriThreadId thread_id; NfcTestSlixPollerSetPasswordState state; SlixRandomNumber random_number; SlixPassword password; SlixError error; } NfcTestSlixPollerSetPasswordContext; typedef struct { Storage* storage; } NfcTest; static NfcTest* nfc_test = NULL; static void nfc_test_alloc(void) { nfc_test = malloc(sizeof(NfcTest)); nfc_test->storage = furi_record_open(RECORD_STORAGE); } static void nfc_test_free(void) { furi_check(nfc_test); furi_record_close(RECORD_STORAGE); free(nfc_test); nfc_test = NULL; } static void nfc_test_save_and_load(NfcDevice* nfc_device_ref) { NfcDevice* nfc_device_dut = nfc_device_alloc(); mu_assert( nfc_device_save(nfc_device_ref, NFC_TEST_NFC_DEV_PATH), "nfc_device_save() failed\r\n"); mu_assert( nfc_device_load(nfc_device_dut, NFC_TEST_NFC_DEV_PATH), "nfc_device_load() failed\r\n"); mu_assert( nfc_device_is_equal(nfc_device_ref, nfc_device_dut), "nfc_device_data_dut != nfc_device_data_ref\r\n"); mu_assert( storage_simply_remove(nfc_test->storage, NFC_TEST_NFC_DEV_PATH), "storage_simply_remove() failed\r\n"); nfc_device_free(nfc_device_dut); } static void iso14443_3a_file_test(uint8_t uid_len) { NfcDevice* nfc_device = nfc_device_alloc(); Iso14443_3aData* data = iso14443_3a_alloc(); data->uid_len = uid_len; furi_hal_random_fill_buf(data->uid, uid_len); furi_hal_random_fill_buf(data->atqa, sizeof(data->atqa)); furi_hal_random_fill_buf(&data->sak, 1); nfc_device_set_data(nfc_device, NfcProtocolIso14443_3a, data); nfc_test_save_and_load(nfc_device); iso14443_3a_free(data); nfc_device_free(nfc_device); } static void nfc_file_test_with_generator(NfcDataGeneratorType type) { NfcDevice* nfc_device_ref = nfc_device_alloc(); nfc_data_generator_fill_data(type, nfc_device_ref); nfc_test_save_and_load(nfc_device_ref); nfc_device_free(nfc_device_ref); } MU_TEST(iso14443_3a_4b_file_test) { iso14443_3a_file_test(4); } MU_TEST(iso14443_3a_7b_file_test) { iso14443_3a_file_test(7); } MU_TEST(mf_ultralight_file_test) { nfc_file_test_with_generator(NfcDataGeneratorTypeMfUltralight); } MU_TEST(mf_ultralight_ev1_11_file_test) { nfc_file_test_with_generator(NfcDataGeneratorTypeMfUltralightEV1_11); } MU_TEST(mf_ultralight_ev1_h11_file_test) { nfc_file_test_with_generator(NfcDataGeneratorTypeMfUltralightEV1_H11); } MU_TEST(mf_ultralight_ev1_21_file_test) { nfc_file_test_with_generator(NfcDataGeneratorTypeMfUltralightEV1_21); } MU_TEST(mf_ultralight_ev1_h21_file_test) { nfc_file_test_with_generator(NfcDataGeneratorTypeMfUltralightEV1_H21); } MU_TEST(mf_ultralight_ntag_203_file_test) { nfc_file_test_with_generator(NfcDataGeneratorTypeNTAG203); } MU_TEST(mf_ultralight_ntag_213_file_test) { nfc_file_test_with_generator(NfcDataGeneratorTypeNTAG213); } MU_TEST(mf_ultralight_ntag_215_file_test) { nfc_file_test_with_generator(NfcDataGeneratorTypeNTAG215); } MU_TEST(mf_ultralight_ntag_216_file_test) { nfc_file_test_with_generator(NfcDataGeneratorTypeNTAG216); } MU_TEST(mf_ultralight_ntag_i2c_1k_file_test) { nfc_file_test_with_generator(NfcDataGeneratorTypeNTAGI2C1k); } MU_TEST(mf_ultralight_ntag_i2c_2k_file_test) { nfc_file_test_with_generator(NfcDataGeneratorTypeNTAGI2C2k); } MU_TEST(mf_ultralight_ntag_i2c_plus_1k_file_test) { nfc_file_test_with_generator(NfcDataGeneratorTypeNTAGI2CPlus1k); } MU_TEST(mf_ultralight_ntag_i2c_plus_2k_file_test) { nfc_file_test_with_generator(NfcDataGeneratorTypeNTAGI2CPlus2k); } MU_TEST(mf_classic_mini_file_test) { nfc_file_test_with_generator(NfcDataGeneratorTypeMfClassicMini); } MU_TEST(mf_classic_1k_4b_file_test) { nfc_file_test_with_generator(NfcDataGeneratorTypeMfClassic1k_4b); } MU_TEST(mf_classic_1k_7b_file_test) { nfc_file_test_with_generator(NfcDataGeneratorTypeMfClassic1k_7b); } MU_TEST(mf_classic_4k_4b_file_test) { nfc_file_test_with_generator(NfcDataGeneratorTypeMfClassic4k_4b); } MU_TEST(mf_classic_4k_7b_file_test) { nfc_file_test_with_generator(NfcDataGeneratorTypeMfClassic4k_7b); } MU_TEST(iso14443_3a_reader) { Nfc* poller = nfc_alloc(); Nfc* listener = nfc_alloc(); Iso14443_3aData iso14443_3a_listener_data = { .uid_len = 7, .uid = {0x04, 0x51, 0x5C, 0xFA, 0x6F, 0x73, 0x81}, .atqa = {0x44, 0x00}, .sak = 0x00, }; NfcListener* iso3_listener = nfc_listener_alloc(listener, NfcProtocolIso14443_3a, &iso14443_3a_listener_data); nfc_listener_start(iso3_listener, NULL, NULL); Iso14443_3aData iso14443_3a_poller_data = {}; mu_assert( iso14443_3a_poller_sync_read(poller, &iso14443_3a_poller_data) == Iso14443_3aErrorNone, "iso14443_3a_poller_sync_read() failed"); nfc_listener_stop(iso3_listener); mu_assert( iso14443_3a_is_equal(&iso14443_3a_poller_data, &iso14443_3a_listener_data), "Data not matches"); nfc_listener_free(iso3_listener); nfc_free(listener); nfc_free(poller); } static void mf_ultralight_reader_test(const char* path) { FURI_LOG_I(TAG, "Testing file: %s", path); Nfc* poller = nfc_alloc(); Nfc* listener = nfc_alloc(); NfcDevice* nfc_device = nfc_device_alloc(); mu_assert(nfc_device_load(nfc_device, path), "nfc_device_load() failed\r\n"); MfUltralightData* data = (MfUltralightData*)nfc_device_get_data(nfc_device, NfcProtocolMfUltralight); uint32_t features = mf_ultralight_get_feature_support_set(data->type); bool pwd_supported = mf_ultralight_support_feature(features, MfUltralightFeatureSupportPasswordAuth); uint8_t pwd_num = mf_ultralight_get_pwd_page_num(data->type); const uint8_t zero_pwd[4] = {0, 0, 0, 0}; if(pwd_supported && !memcmp(data->page[pwd_num].data, zero_pwd, sizeof(zero_pwd))) { data->pages_read -= 2; } NfcListener* mfu_listener = nfc_listener_alloc(listener, NfcProtocolMfUltralight, data); nfc_listener_start(mfu_listener, NULL, NULL); MfUltralightData* mfu_data = mf_ultralight_alloc(); MfUltralightError error = mf_ultralight_poller_sync_read_card(poller, mfu_data, NULL); mu_assert(error == MfUltralightErrorNone, "mf_ultralight_poller_sync_read_card() failed"); nfc_listener_stop(mfu_listener); nfc_listener_free(mfu_listener); MfUltralightData* mfu_other_data = (MfUltralightData*)nfc_device_get_data(nfc_device, NfcProtocolMfUltralight); mu_assert(mf_ultralight_is_equal(mfu_data, mfu_other_data), "Data mismatch"); mf_ultralight_free(mfu_data); nfc_device_free(nfc_device); nfc_free(listener); nfc_free(poller); } MU_TEST(mf_ultralight_11_reader) { mf_ultralight_reader_test(EXT_PATH("unit_tests/nfc/Ultralight_11.nfc")); } MU_TEST(mf_ultralight_21_reader) { mf_ultralight_reader_test(EXT_PATH("unit_tests/nfc/Ultralight_21.nfc")); } MU_TEST(mf_ultralight_c_reader) { mf_ultralight_reader_test(EXT_PATH("unit_tests/nfc/Ultralight_C.nfc")); } MU_TEST(ntag_215_reader) { mf_ultralight_reader_test(EXT_PATH("unit_tests/nfc/Ntag215.nfc")); } MU_TEST(ntag_216_reader) { mf_ultralight_reader_test(EXT_PATH("unit_tests/nfc/Ntag216.nfc")); } MU_TEST(ntag_213_locked_reader) { FURI_LOG_I(TAG, "Testing Ntag215 locked file"); Nfc* poller = nfc_alloc(); Nfc* listener = nfc_alloc(); NfcDeviceData* nfc_device = nfc_device_alloc(); mu_assert( nfc_device_load(nfc_device, EXT_PATH("unit_tests/nfc/Ntag213_locked.nfc")), "nfc_device_load() failed\r\n"); NfcListener* mfu_listener = nfc_listener_alloc( listener, NfcProtocolMfUltralight, nfc_device_get_data(nfc_device, NfcProtocolMfUltralight)); nfc_listener_start(mfu_listener, NULL, NULL); MfUltralightData* mfu_data = mf_ultralight_alloc(); MfUltralightError error = mf_ultralight_poller_sync_read_card(poller, mfu_data, NULL); mu_assert(error == MfUltralightErrorNone, "mf_ultralight_poller_sync_read_card() failed"); nfc_listener_stop(mfu_listener); nfc_listener_free(mfu_listener); MfUltralightConfigPages* config = NULL; const MfUltralightData* mfu_ref_data = nfc_device_get_data(nfc_device, NfcProtocolMfUltralight); mu_assert( mf_ultralight_get_config_page(mfu_ref_data, &config), "mf_ultralight_get_config_page() failed"); uint16_t pages_locked = config->auth0; mu_assert(mfu_data->pages_read == pages_locked, "Unexpected pages read"); mf_ultralight_free(mfu_data); nfc_device_free(nfc_device); nfc_free(listener); nfc_free(poller); } static void mf_ultralight_write(void) { Nfc* poller = nfc_alloc(); Nfc* listener = nfc_alloc(); NfcDevice* nfc_device = nfc_device_alloc(); nfc_data_generator_fill_data(NfcDataGeneratorTypeMfUltralightEV1_21, nfc_device); NfcListener* mfu_listener = nfc_listener_alloc( listener, NfcProtocolMfUltralight, nfc_device_get_data(nfc_device, NfcProtocolMfUltralight)); nfc_listener_start(mfu_listener, NULL, NULL); MfUltralightData* mfu_data = mf_ultralight_alloc(); // Initial read MfUltralightError error = mf_ultralight_poller_sync_read_card(poller, mfu_data, NULL); mu_assert(error == MfUltralightErrorNone, "mf_ultralight_poller_sync_read_card() failed"); mu_assert( mf_ultralight_is_equal(mfu_data, nfc_device_get_data(nfc_device, NfcProtocolMfUltralight)), "Data not matches"); // Write random data for(size_t i = 5; i < 15; i++) { MfUltralightPage page = {}; FURI_LOG_D(TAG, "Writing page %d", i); furi_hal_random_fill_buf(page.data, sizeof(MfUltralightPage)); mfu_data->page[i] = page; error = mf_ultralight_poller_sync_write_page(poller, i, &page); mu_assert(error == MfUltralightErrorNone, "mf_ultralight_poller_sync_write_page() failed"); } // Verification read error = mf_ultralight_poller_sync_read_card(poller, mfu_data, NULL); mu_assert(error == MfUltralightErrorNone, "mf_ultralight_poller_sync_read_card() failed"); nfc_listener_stop(mfu_listener); const MfUltralightData* mfu_listener_data = nfc_listener_get_data(mfu_listener, NfcProtocolMfUltralight); mu_assert(mf_ultralight_is_equal(mfu_data, mfu_listener_data), "Data not matches"); nfc_listener_free(mfu_listener); mf_ultralight_free(mfu_data); nfc_device_free(nfc_device); nfc_free(listener); nfc_free(poller); } static void mf_classic_reader(void) { Nfc* poller = nfc_alloc(); Nfc* listener = nfc_alloc(); NfcDevice* nfc_device = nfc_device_alloc(); nfc_data_generator_fill_data(NfcDataGeneratorTypeMfClassic4k_7b, nfc_device); NfcListener* mfc_listener = nfc_listener_alloc( listener, NfcProtocolMfClassic, nfc_device_get_data(nfc_device, NfcProtocolMfClassic)); nfc_listener_start(mfc_listener, NULL, NULL); MfClassicBlock block = {}; MfClassicKey key = {.data = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}}; mf_classic_poller_sync_read_block(poller, 0, &key, MfClassicKeyTypeA, &block); nfc_listener_stop(mfc_listener); nfc_listener_free(mfc_listener); const MfClassicData* mfc_data = nfc_device_get_data(nfc_device, NfcProtocolMfClassic); mu_assert(memcmp(&mfc_data->block[0], &block, sizeof(MfClassicBlock)) == 0, "Data mismatch"); nfc_device_free(nfc_device); nfc_free(listener); nfc_free(poller); } static void mf_classic_write(void) { Nfc* poller = nfc_alloc(); Nfc* listener = nfc_alloc(); NfcDevice* nfc_device = nfc_device_alloc(); nfc_data_generator_fill_data(NfcDataGeneratorTypeMfClassic4k_7b, nfc_device); NfcListener* mfc_listener = nfc_listener_alloc( listener, NfcProtocolMfClassic, nfc_device_get_data(nfc_device, NfcProtocolMfClassic)); nfc_listener_start(mfc_listener, NULL, NULL); MfClassicBlock block_write = {}; MfClassicBlock block_read = {}; furi_hal_random_fill_buf(block_write.data, sizeof(MfClassicBlock)); MfClassicKey key = {.data = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}}; mf_classic_poller_sync_write_block(poller, 1, &key, MfClassicKeyTypeA, &block_write); mf_classic_poller_sync_read_block(poller, 1, &key, MfClassicKeyTypeA, &block_read); nfc_listener_stop(mfc_listener); nfc_listener_free(mfc_listener); mu_assert(memcmp(&block_read, &block_write, sizeof(MfClassicBlock)) == 0, "Data mismatch"); nfc_device_free(nfc_device); nfc_free(listener); nfc_free(poller); } static void mf_classic_value_block(void) { Nfc* poller = nfc_alloc(); Nfc* listener = nfc_alloc(); NfcDevice* nfc_device = nfc_device_alloc(); nfc_data_generator_fill_data(NfcDataGeneratorTypeMfClassic4k_7b, nfc_device); NfcListener* mfc_listener = nfc_listener_alloc( listener, NfcProtocolMfClassic, nfc_device_get_data(nfc_device, NfcProtocolMfClassic)); nfc_listener_start(mfc_listener, NULL, NULL); MfClassicKey key = {.data = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}}; int32_t value = 228; MfClassicBlock block_write = {}; mf_classic_value_to_block(value, 1, &block_write); MfClassicError error = MfClassicErrorNone; error = mf_classic_poller_sync_write_block(poller, 1, &key, MfClassicKeyTypeA, &block_write); mu_assert(error == MfClassicErrorNone, "Write failed"); int32_t data = 200; int32_t new_value = 0; error = mf_classic_poller_sync_change_value(poller, 1, &key, MfClassicKeyTypeA, data, &new_value); mu_assert(error == MfClassicErrorNone, "Value increment failed"); mu_assert(new_value == value + data, "Value not match"); error = mf_classic_poller_sync_change_value(poller, 1, &key, MfClassicKeyTypeA, -data, &new_value); mu_assert(error == MfClassicErrorNone, "Value decrement failed"); mu_assert(new_value == value, "Value not match"); nfc_listener_stop(mfc_listener); nfc_listener_free(mfc_listener); nfc_device_free(nfc_device); nfc_free(listener); nfc_free(poller); } NfcCommand mf_classic_poller_send_frame_callback(NfcGenericEventEx event, void* context) { furi_check(event.poller); furi_check(event.parent_event_data); furi_check(context); NfcCommand command = NfcCommandContinue; MfClassicPoller* instance = event.poller; NfcTestMfClassicSendFrameTest* frame_test = context; Iso14443_3aPollerEvent* iso3_event = event.parent_event_data; MfClassicError error = MfClassicErrorNone; if(iso3_event->type == Iso14443_3aPollerEventTypeReady) { if(frame_test->state == NfcTestMfClassicSendFrameTestStateAuth) { MfClassicKey key = { .data = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, }; error = mf_classic_poller_auth(instance, 0, &key, MfClassicKeyTypeA, NULL, false); frame_test->state = (error == MfClassicErrorNone) ? NfcTestMfClassicSendFrameTestStateReadBlock : NfcTestMfClassicSendFrameTestStateFail; } else if(frame_test->state == NfcTestMfClassicSendFrameTestStateReadBlock) { do { const uint8_t read_block_cmd[] = { 0x30, 0x01, 0x8b, 0xb9, }; bit_buffer_copy_bytes(frame_test->tx_buf, read_block_cmd, sizeof(read_block_cmd)); error = mf_classic_poller_send_encrypted_frame( instance, frame_test->tx_buf, frame_test->rx_buf, 200000); if(error != MfClassicErrorNone) break; if(bit_buffer_get_size_bytes(frame_test->rx_buf) != 18) { error = MfClassicErrorProtocol; break; } const uint8_t* rx_data = bit_buffer_get_data(frame_test->rx_buf); const uint8_t rx_data_ref[16] = {0}; if(memcmp(rx_data, rx_data_ref, sizeof(rx_data_ref)) != 0) { error = MfClassicErrorProtocol; break; } } while(false); frame_test->state = (error == MfClassicErrorNone) ? NfcTestMfClassicSendFrameTestStateSuccess : NfcTestMfClassicSendFrameTestStateFail; } else if(frame_test->state == NfcTestMfClassicSendFrameTestStateSuccess) { command = NfcCommandStop; } else if(frame_test->state == NfcTestMfClassicSendFrameTestStateFail) { command = NfcCommandStop; } } else { frame_test->state = NfcTestMfClassicSendFrameTestStateFail; command = NfcCommandStop; } if(command == NfcCommandStop) { furi_thread_flags_set(frame_test->thread_id, NFC_TEST_FLAG_WORKER_DONE); } return command; } MU_TEST(mf_classic_send_frame_test) { Nfc* poller = nfc_alloc(); Nfc* listener = nfc_alloc(); NfcDevice* nfc_device = nfc_device_alloc(); nfc_data_generator_fill_data(NfcDataGeneratorTypeMfClassic4k_7b, nfc_device); NfcListener* mfc_listener = nfc_listener_alloc( listener, NfcProtocolMfClassic, nfc_device_get_data(nfc_device, NfcProtocolMfClassic)); nfc_listener_start(mfc_listener, NULL, NULL); NfcPoller* mfc_poller = nfc_poller_alloc(poller, NfcProtocolMfClassic); NfcTestMfClassicSendFrameTest context = { .state = NfcTestMfClassicSendFrameTestStateAuth, .thread_id = furi_thread_get_current_id(), .tx_buf = bit_buffer_alloc(32), .rx_buf = bit_buffer_alloc(32), }; nfc_poller_start_ex(mfc_poller, mf_classic_poller_send_frame_callback, &context); uint32_t flag = furi_thread_flags_wait(NFC_TEST_FLAG_WORKER_DONE, FuriFlagWaitAny, FuriWaitForever); mu_assert(flag == NFC_TEST_FLAG_WORKER_DONE, "Wrong thread flag"); nfc_poller_stop(mfc_poller); nfc_poller_free(mfc_poller); mu_assert( context.state == NfcTestMfClassicSendFrameTestStateSuccess, "Wrong test state at the end"); bit_buffer_free(context.tx_buf); bit_buffer_free(context.rx_buf); nfc_listener_stop(mfc_listener); nfc_listener_free(mfc_listener); nfc_device_free(nfc_device); nfc_free(listener); nfc_free(poller); } MU_TEST(mf_classic_dict_test) { Storage* storage = furi_record_open(RECORD_STORAGE); if(storage_common_stat(storage, NFC_APP_MF_CLASSIC_DICT_UNIT_TEST_PATH, NULL) == FSE_OK) { mu_assert( storage_simply_remove(storage, NFC_APP_MF_CLASSIC_DICT_UNIT_TEST_PATH), "Remove test dict failed"); } KeysDict* dict = keys_dict_alloc( NFC_APP_MF_CLASSIC_DICT_UNIT_TEST_PATH, KeysDictModeOpenAlways, sizeof(MfClassicKey)); mu_assert(dict != NULL, "keys_dict_alloc() failed"); size_t dict_keys_total = keys_dict_get_total_keys(dict); mu_assert(dict_keys_total == 0, "keys_dict_keys_total() failed"); const uint32_t test_key_num = 30; MfClassicKey* key_arr_ref = malloc(test_key_num * sizeof(MfClassicKey)); for(size_t i = 0; i < test_key_num; i++) { furi_hal_random_fill_buf(key_arr_ref[i].data, sizeof(MfClassicKey)); mu_assert( keys_dict_add_key(dict, key_arr_ref[i].data, sizeof(MfClassicKey)), "add key failed"); size_t dict_keys_total = keys_dict_get_total_keys(dict); mu_assert(dict_keys_total == (i + 1), "keys_dict_keys_total() failed"); } keys_dict_free(dict); dict = keys_dict_alloc( NFC_APP_MF_CLASSIC_DICT_UNIT_TEST_PATH, KeysDictModeOpenAlways, sizeof(MfClassicKey)); mu_assert(dict != NULL, "keys_dict_alloc() failed"); dict_keys_total = keys_dict_get_total_keys(dict); mu_assert(dict_keys_total == test_key_num, "keys_dict_keys_total() failed"); MfClassicKey key_dut = {}; size_t key_idx = 0; while(keys_dict_get_next_key(dict, key_dut.data, sizeof(MfClassicKey))) { mu_assert( memcmp(key_arr_ref[key_idx].data, key_dut.data, sizeof(MfClassicKey)) == 0, "Loaded key data mismatch"); key_idx++; } uint32_t delete_keys_idx[] = {1, 3, 9, 11, 19, 27}; for(size_t i = 0; i < COUNT_OF(delete_keys_idx); i++) { MfClassicKey* key = &key_arr_ref[delete_keys_idx[i]]; mu_assert( keys_dict_is_key_present(dict, key->data, sizeof(MfClassicKey)), "keys_dict_is_key_present() failed"); mu_assert( keys_dict_delete_key(dict, key->data, sizeof(MfClassicKey)), "keys_dict_delete_key() failed"); } dict_keys_total = keys_dict_get_total_keys(dict); mu_assert( dict_keys_total == test_key_num - COUNT_OF(delete_keys_idx), "keys_dict_keys_total() failed"); keys_dict_free(dict); free(key_arr_ref); mu_assert( storage_simply_remove(storage, NFC_APP_MF_CLASSIC_DICT_UNIT_TEST_PATH), "Remove test dict failed"); } static FelicaError felica_do_request_response(FelicaData* felica_data, const FelicaCardKey* card_key) { NfcDeviceData* nfc_device = nfc_device_alloc(); FelicaError error = FelicaErrorNone; if(!nfc_device_load(nfc_device, EXT_PATH("unit_tests/nfc/Felica.nfc"))) { error = FelicaErrorNotPresent; } else { Nfc* poller = nfc_alloc(); Nfc* listener = nfc_alloc(); NfcListener* felica_listener = nfc_listener_alloc( listener, NfcProtocolFelica, nfc_device_get_data(nfc_device, NfcProtocolFelica)); nfc_listener_start(felica_listener, NULL, NULL); error = felica_poller_sync_read(poller, felica_data, card_key); nfc_listener_stop(felica_listener); nfc_listener_free(felica_listener); nfc_free(listener); nfc_free(poller); } nfc_device_free(nfc_device); return error; } MU_TEST(felica_read) { FelicaData* felica_data = felica_alloc(); FelicaError error = felica_do_request_response(felica_data, NULL); mu_assert(error == FelicaErrorNone, "felica_poller() failed"); mu_assert(felica_data->data.fs.spad[4].SF1 == 0x01, "block[4].SF1 != 0x01"); mu_assert(felica_data->data.fs.spad[4].SF2 == 0xB1, "block[4].SF2 != 0xB1"); felica_free(felica_data); } MU_TEST(felica_read_auth) { FelicaData* felica_data = felica_alloc(); FelicaCardKey card_key; memset(card_key.data, 0xFF, FELICA_DATA_BLOCK_SIZE); FelicaError error = felica_do_request_response(felica_data, &card_key); mu_assert(error == FelicaErrorNone, "felica_poller() failed"); mu_assert(felica_data->data.fs.spad[4].SF1 == 0x00, "block[4].SF1 != 0x00"); mu_assert(felica_data->data.fs.spad[4].SF2 == 0x00, "block[4].SF2 != 0x00"); felica_free(felica_data); } MU_TEST(slix_file_with_capabilities_test) { NfcDevice* nfc_device_missed_cap = nfc_device_alloc(); mu_assert( nfc_device_load(nfc_device_missed_cap, EXT_PATH("unit_tests/nfc/Slix_cap_missed.nfc")), "nfc_device_load() failed\r\n"); NfcDevice* nfc_device_default_cap = nfc_device_alloc(); mu_assert( nfc_device_load(nfc_device_default_cap, EXT_PATH("unit_tests/nfc/Slix_cap_default.nfc")), "nfc_device_load() failed\r\n"); mu_assert( nfc_device_is_equal(nfc_device_missed_cap, nfc_device_default_cap), "nfc_device_is_equal() failed\r\n"); nfc_device_free(nfc_device_default_cap); nfc_device_free(nfc_device_missed_cap); } NfcCommand slix_poller_set_password_callback(NfcGenericEventEx event, void* context) { furi_check(event.poller); furi_check(event.parent_event_data); furi_check(context); NfcCommand command = NfcCommandContinue; Iso15693_3PollerEvent* iso15_event = event.parent_event_data; SlixPoller* poller = event.poller; NfcTestSlixPollerSetPasswordContext* slix_ctx = context; if(iso15_event->type == Iso15693_3PollerEventTypeReady) { iso15693_3_copy( poller->data->iso15693_3_data, iso15693_3_poller_get_data(poller->iso15693_3_poller)); if(slix_ctx->state == NfcTestSlixPollerSetPasswordStateGetRandomNumber) { slix_ctx->error = slix_poller_get_random_number(poller, &slix_ctx->random_number); if(slix_ctx->error != SlixErrorNone) { furi_thread_flags_set(slix_ctx->thread_id, NFC_TEST_FLAG_WORKER_DONE); command = NfcCommandStop; } else { slix_ctx->state = NfcTestSlixPollerSetPasswordStateSetPassword; } } else if(slix_ctx->state == NfcTestSlixPollerSetPasswordStateSetPassword) { slix_ctx->error = slix_poller_set_password( poller, SlixPasswordTypeRead, slix_ctx->password, slix_ctx->random_number); furi_thread_flags_set(slix_ctx->thread_id, NFC_TEST_FLAG_WORKER_DONE); command = NfcCommandStop; } } else { slix_ctx->error = slix_process_iso15693_3_error(iso15_event->data->error); furi_thread_flags_set(slix_ctx->thread_id, NFC_TEST_FLAG_WORKER_DONE); command = NfcCommandStop; } return command; } static void slix_set_password_test(const char* file_path, SlixPassword pass, bool correct_pass) { FURI_LOG_I(TAG, "Testing file: %s", file_path); Nfc* poller = nfc_alloc(); Nfc* listener = nfc_alloc(); NfcDevice* nfc_device = nfc_device_alloc(); mu_assert(nfc_device_load(nfc_device, file_path), "nfc_device_load() failed\r\n"); const SlixData* slix_data = nfc_device_get_data(nfc_device, NfcProtocolSlix); NfcListener* slix_listener = nfc_listener_alloc(listener, NfcProtocolSlix, slix_data); nfc_listener_start(slix_listener, NULL, NULL); SlixCapabilities slix_capabilities = slix_data->capabilities; NfcPoller* slix_poller = nfc_poller_alloc(poller, NfcProtocolSlix); NfcTestSlixPollerSetPasswordContext slix_poller_context = { .thread_id = furi_thread_get_current_id(), .state = NfcTestSlixPollerSetPasswordStateGetRandomNumber, .password = pass, .error = SlixErrorNone, }; nfc_poller_start_ex(slix_poller, slix_poller_set_password_callback, &slix_poller_context); uint32_t flag = furi_thread_flags_wait(NFC_TEST_FLAG_WORKER_DONE, FuriFlagWaitAny, FuriWaitForever); mu_assert(flag == NFC_TEST_FLAG_WORKER_DONE, "Wrong thread flag\r\n"); nfc_poller_stop(slix_poller); nfc_poller_free(slix_poller); nfc_listener_stop(slix_listener); nfc_listener_free(slix_listener); mu_assert( slix_poller_context.state == NfcTestSlixPollerSetPasswordStateSetPassword, "Poller failed before setting password\r\n"); if((slix_capabilities == SlixCapabilitiesAcceptAllPasswords) || (correct_pass)) { mu_assert(slix_poller_context.error == SlixErrorNone, "Failed to set password\r\n"); } else { mu_assert( slix_poller_context.error == SlixErrorTimeout, "Must have received SlixErrorTimeout\r\n"); } nfc_device_free(nfc_device); nfc_free(listener); nfc_free(poller); } MU_TEST(slix_set_password_default_cap_correct_pass) { slix_set_password_test(EXT_PATH("unit_tests/nfc/Slix_cap_default.nfc"), 0x00000000, true); } MU_TEST(slix_set_password_default_cap_incorrect_pass) { slix_set_password_test(EXT_PATH("unit_tests/nfc/Slix_cap_default.nfc"), 0x12341234, false); } MU_TEST(slix_set_password_access_all_passwords_cap) { slix_set_password_test( EXT_PATH("unit_tests/nfc/Slix_cap_accept_all_pass.nfc"), 0x12341234, false); } MU_TEST_SUITE(nfc) { nfc_test_alloc(); MU_RUN_TEST(iso14443_3a_reader); MU_RUN_TEST(mf_ultralight_11_reader); MU_RUN_TEST(mf_ultralight_21_reader); MU_RUN_TEST(ntag_215_reader); MU_RUN_TEST(ntag_216_reader); MU_RUN_TEST(ntag_213_locked_reader); MU_RUN_TEST(mf_ultralight_c_reader); MU_RUN_TEST(mf_ultralight_write); MU_RUN_TEST(iso14443_3a_4b_file_test); MU_RUN_TEST(iso14443_3a_7b_file_test); MU_RUN_TEST(mf_ultralight_file_test); MU_RUN_TEST(mf_ultralight_ev1_11_file_test); MU_RUN_TEST(mf_ultralight_ev1_h11_file_test); MU_RUN_TEST(mf_ultralight_ev1_21_file_test); MU_RUN_TEST(mf_ultralight_ev1_h21_file_test); MU_RUN_TEST(mf_ultralight_ntag_203_file_test); MU_RUN_TEST(mf_ultralight_ntag_213_file_test); MU_RUN_TEST(mf_ultralight_ntag_215_file_test); MU_RUN_TEST(mf_ultralight_ntag_216_file_test); MU_RUN_TEST(mf_ultralight_ntag_i2c_1k_file_test); MU_RUN_TEST(mf_ultralight_ntag_i2c_2k_file_test); MU_RUN_TEST(mf_ultralight_ntag_i2c_plus_1k_file_test); MU_RUN_TEST(mf_ultralight_ntag_i2c_plus_2k_file_test); MU_RUN_TEST(mf_classic_mini_file_test); MU_RUN_TEST(mf_classic_1k_4b_file_test); MU_RUN_TEST(mf_classic_1k_7b_file_test); MU_RUN_TEST(mf_classic_4k_4b_file_test); MU_RUN_TEST(mf_classic_4k_7b_file_test); MU_RUN_TEST(mf_classic_reader); MU_RUN_TEST(mf_classic_write); MU_RUN_TEST(mf_classic_value_block); MU_RUN_TEST(mf_classic_send_frame_test); MU_RUN_TEST(mf_classic_dict_test); MU_RUN_TEST(felica_read); MU_RUN_TEST(felica_read_auth); MU_RUN_TEST(slix_file_with_capabilities_test); MU_RUN_TEST(slix_set_password_default_cap_correct_pass); MU_RUN_TEST(slix_set_password_default_cap_incorrect_pass); MU_RUN_TEST(slix_set_password_access_all_passwords_cap); nfc_test_free(); } int run_minunit_test_nfc(void) { MU_RUN_SUITE(nfc); return MU_EXIT_CODE; } TEST_API_DEFINE(run_minunit_test_nfc) ================================================ FILE: applications/debug/unit_tests/tests/notification/notes_test.c ================================================ #include "../test.h" // IWYU pragma: keep #include #include void frequency_assert(const char* note_name, const NotificationMessage* message) { double a = notification_messages_notes_frequency_from_name(note_name); double b = message->data.sound.frequency; const double epsilon = message->data.sound.frequency > 5000 ? 0.02f : 0.01f; mu_assert_double_between(b - epsilon, b + epsilon, a); } MU_TEST(notification_messages_notes_frequency_from_name_test) { // Upper case mu_check(float_is_equal( notification_messages_notes_frequency_from_name("C0"), notification_messages_notes_frequency_from_name("c0"))); // Mixed case mu_check(float_is_equal( notification_messages_notes_frequency_from_name("Cs0"), notification_messages_notes_frequency_from_name("cs0"))); // Check errors mu_check( float_is_equal(notification_messages_notes_frequency_from_name("0"), 0.0)); // Without note mu_check(float_is_equal( notification_messages_notes_frequency_from_name("C"), 0.0)); // Without octave mu_check(float_is_equal( notification_messages_notes_frequency_from_name("C9"), 0.0)); // Unsupported octave mu_check(float_is_equal( notification_messages_notes_frequency_from_name("C10"), 0.0)); // Unsupported octave mu_check(float_is_equal( notification_messages_notes_frequency_from_name("X0"), 0.0)); // Unknown note mu_check(float_is_equal( notification_messages_notes_frequency_from_name("CCC0"), 0.0)); // Note name overflow // Notes and structures frequency_assert("c0", &message_note_c0); frequency_assert("cs0", &message_note_cs0); frequency_assert("d0", &message_note_d0); frequency_assert("ds0", &message_note_ds0); frequency_assert("e0", &message_note_e0); frequency_assert("f0", &message_note_f0); frequency_assert("fs0", &message_note_fs0); frequency_assert("g0", &message_note_g0); frequency_assert("gs0", &message_note_gs0); frequency_assert("a0", &message_note_a0); frequency_assert("as0", &message_note_as0); frequency_assert("b0", &message_note_b0); frequency_assert("c1", &message_note_c1); frequency_assert("cs1", &message_note_cs1); frequency_assert("d1", &message_note_d1); frequency_assert("ds1", &message_note_ds1); frequency_assert("e1", &message_note_e1); frequency_assert("f1", &message_note_f1); frequency_assert("fs1", &message_note_fs1); frequency_assert("g1", &message_note_g1); frequency_assert("gs1", &message_note_gs1); frequency_assert("a1", &message_note_a1); frequency_assert("as1", &message_note_as1); frequency_assert("b1", &message_note_b1); frequency_assert("c2", &message_note_c2); frequency_assert("cs2", &message_note_cs2); frequency_assert("d2", &message_note_d2); frequency_assert("ds2", &message_note_ds2); frequency_assert("e2", &message_note_e2); frequency_assert("f2", &message_note_f2); frequency_assert("fs2", &message_note_fs2); frequency_assert("g2", &message_note_g2); frequency_assert("gs2", &message_note_gs2); frequency_assert("a2", &message_note_a2); frequency_assert("as2", &message_note_as2); frequency_assert("b2", &message_note_b2); frequency_assert("c3", &message_note_c3); frequency_assert("cs3", &message_note_cs3); frequency_assert("d3", &message_note_d3); frequency_assert("ds3", &message_note_ds3); frequency_assert("e3", &message_note_e3); frequency_assert("f3", &message_note_f3); frequency_assert("fs3", &message_note_fs3); frequency_assert("g3", &message_note_g3); frequency_assert("gs3", &message_note_gs3); frequency_assert("a3", &message_note_a3); frequency_assert("as3", &message_note_as3); frequency_assert("b3", &message_note_b3); frequency_assert("c4", &message_note_c4); frequency_assert("cs4", &message_note_cs4); frequency_assert("d4", &message_note_d4); frequency_assert("ds4", &message_note_ds4); frequency_assert("e4", &message_note_e4); frequency_assert("f4", &message_note_f4); frequency_assert("fs4", &message_note_fs4); frequency_assert("g4", &message_note_g4); frequency_assert("gs4", &message_note_gs4); frequency_assert("a4", &message_note_a4); frequency_assert("as4", &message_note_as4); frequency_assert("b4", &message_note_b4); frequency_assert("c5", &message_note_c5); frequency_assert("cs5", &message_note_cs5); frequency_assert("d5", &message_note_d5); frequency_assert("ds5", &message_note_ds5); frequency_assert("e5", &message_note_e5); frequency_assert("f5", &message_note_f5); frequency_assert("fs5", &message_note_fs5); frequency_assert("g5", &message_note_g5); frequency_assert("gs5", &message_note_gs5); frequency_assert("a5", &message_note_a5); frequency_assert("as5", &message_note_as5); frequency_assert("b5", &message_note_b5); frequency_assert("c6", &message_note_c6); frequency_assert("cs6", &message_note_cs6); frequency_assert("d6", &message_note_d6); frequency_assert("ds6", &message_note_ds6); frequency_assert("e6", &message_note_e6); frequency_assert("f6", &message_note_f6); frequency_assert("fs6", &message_note_fs6); frequency_assert("g6", &message_note_g6); frequency_assert("gs6", &message_note_gs6); frequency_assert("a6", &message_note_a6); frequency_assert("as6", &message_note_as6); frequency_assert("b6", &message_note_b6); frequency_assert("c7", &message_note_c7); frequency_assert("cs7", &message_note_cs7); frequency_assert("d7", &message_note_d7); frequency_assert("ds7", &message_note_ds7); frequency_assert("e7", &message_note_e7); frequency_assert("f7", &message_note_f7); frequency_assert("fs7", &message_note_fs7); frequency_assert("g7", &message_note_g7); frequency_assert("gs7", &message_note_gs7); frequency_assert("a7", &message_note_a7); frequency_assert("as7", &message_note_as7); frequency_assert("b7", &message_note_b7); frequency_assert("c8", &message_note_c8); frequency_assert("cs8", &message_note_cs8); frequency_assert("d8", &message_note_d8); frequency_assert("ds8", &message_note_ds8); frequency_assert("e8", &message_note_e8); frequency_assert("f8", &message_note_f8); frequency_assert("fs8", &message_note_fs8); frequency_assert("g8", &message_note_g8); frequency_assert("gs8", &message_note_gs8); frequency_assert("a8", &message_note_a8); frequency_assert("as8", &message_note_as8); frequency_assert("b8", &message_note_b8); } MU_TEST_SUITE(notes_suite) { MU_RUN_TEST(notification_messages_notes_frequency_from_name_test); } int run_minunit_test_notes(void) { MU_RUN_SUITE(notes_suite); return MU_EXIT_CODE; } TEST_API_DEFINE(run_minunit_test_notes) ================================================ FILE: applications/debug/unit_tests/tests/pipe/pipe_test.c ================================================ #include "../test.h" // IWYU pragma: keep #include #include #define PIPE_SIZE 128U #define PIPE_TRG_LEVEL 1U MU_TEST(pipe_test_trivial) { PipeSideBundle bundle = pipe_alloc(PIPE_SIZE, PIPE_TRG_LEVEL); PipeSide* alice = bundle.alices_side; PipeSide* bob = bundle.bobs_side; mu_assert_int_eq(PipeRoleAlice, pipe_role(alice)); mu_assert_int_eq(PipeRoleBob, pipe_role(bob)); mu_assert_int_eq(PipeStateOpen, pipe_state(alice)); mu_assert_int_eq(PipeStateOpen, pipe_state(bob)); mu_assert_int_eq(PIPE_SIZE, pipe_spaces_available(alice)); mu_assert_int_eq(PIPE_SIZE, pipe_spaces_available(bob)); mu_assert_int_eq(0, pipe_bytes_available(alice)); mu_assert_int_eq(0, pipe_bytes_available(bob)); for(uint8_t i = 0;; ++i) { mu_assert_int_eq(PIPE_SIZE - i, pipe_spaces_available(alice)); mu_assert_int_eq(i, pipe_bytes_available(bob)); if(pipe_spaces_available(alice) == 0) break; furi_check(pipe_send(alice, &i, sizeof(uint8_t)) == sizeof(uint8_t)); mu_assert_int_eq(PIPE_SIZE - i, pipe_spaces_available(bob)); mu_assert_int_eq(i, pipe_bytes_available(alice)); furi_check(pipe_send(bob, &i, sizeof(uint8_t)) == sizeof(uint8_t)); } pipe_free(alice); mu_assert_int_eq(PipeStateBroken, pipe_state(bob)); for(uint8_t i = 0;; ++i) { mu_assert_int_eq(PIPE_SIZE - i, pipe_bytes_available(bob)); if(pipe_bytes_available(bob) == 0) break; uint8_t value; furi_check(pipe_receive(bob, &value, sizeof(uint8_t)) == sizeof(uint8_t)); mu_assert_int_eq(i, value); } pipe_free(bob); } typedef enum { TestFlagDataArrived = 1 << 0, TestFlagSpaceFreed = 1 << 1, TestFlagBecameBroken = 1 << 2, } TestFlag; typedef struct { TestFlag flag; FuriEventLoop* event_loop; } AncillaryThreadContext; static void on_data_arrived(PipeSide* pipe, void* context) { AncillaryThreadContext* ctx = context; ctx->flag |= TestFlagDataArrived; uint8_t input; size_t size = pipe_receive(pipe, &input, sizeof(input)); pipe_send(pipe, &input, size); } static void on_space_freed(PipeSide* pipe, void* context) { UNUSED(pipe); AncillaryThreadContext* ctx = context; ctx->flag |= TestFlagSpaceFreed; } static void on_became_broken(PipeSide* pipe, void* context) { UNUSED(pipe); AncillaryThreadContext* ctx = context; ctx->flag |= TestFlagBecameBroken; furi_event_loop_stop(ctx->event_loop); } static int32_t ancillary_thread(void* context) { PipeSide* pipe = context; AncillaryThreadContext thread_ctx = { .flag = 0, .event_loop = furi_event_loop_alloc(), }; pipe_attach_to_event_loop(pipe, thread_ctx.event_loop); pipe_set_callback_context(pipe, &thread_ctx); pipe_set_data_arrived_callback(pipe, on_data_arrived, 0); pipe_set_space_freed_callback(pipe, on_space_freed, FuriEventLoopEventFlagEdge); pipe_set_broken_callback(pipe, on_became_broken, 0); furi_event_loop_run(thread_ctx.event_loop); pipe_detach_from_event_loop(pipe); pipe_free(pipe); furi_event_loop_free(thread_ctx.event_loop); return thread_ctx.flag; } MU_TEST(pipe_test_event_loop) { PipeSideBundle bundle = pipe_alloc(PIPE_SIZE, PIPE_TRG_LEVEL); PipeSide* alice = bundle.alices_side; PipeSide* bob = bundle.bobs_side; FuriThread* thread = furi_thread_alloc_ex("PipeTestAnc", 2048, ancillary_thread, bob); furi_thread_start(thread); const char* message = "Hello!"; pipe_send(alice, message, strlen(message)); char buffer_1[16]; size_t size = pipe_receive(alice, buffer_1, strlen(message)); buffer_1[size] = 0; pipe_free(alice); furi_thread_join(thread); mu_assert_string_eq(message, buffer_1); mu_assert_int_eq( TestFlagDataArrived | TestFlagSpaceFreed | TestFlagBecameBroken, furi_thread_get_return_code(thread)); furi_thread_free(thread); } MU_TEST_SUITE(test_pipe) { MU_RUN_TEST(pipe_test_trivial); MU_RUN_TEST(pipe_test_event_loop); } int run_minunit_test_pipe(void) { MU_RUN_SUITE(test_pipe); return MU_EXIT_CODE; } TEST_API_DEFINE(run_minunit_test_pipe) ================================================ FILE: applications/debug/unit_tests/tests/power/power_test.c ================================================ #include #include #include "../test.h" // IWYU pragma: keep static void power_test_deinit(void) { // Try to reset to default charge voltage limit furi_hal_power_set_battery_charge_voltage_limit(4.208f); } MU_TEST(test_power_charge_voltage_limit_exact) { // Power of 16mV charge voltage limits get applied exactly // (bq25896 charge controller works in 16mV increments) // // This test may need adapted if other charge controllers are used in the future. for(uint16_t charge_mv = 3840; charge_mv <= 4208; charge_mv += 16) { float charge_volt = (float)charge_mv / 1000; furi_hal_power_set_battery_charge_voltage_limit(charge_volt); mu_assert_double_eq( (double)charge_volt, (double)furi_hal_power_get_battery_charge_voltage_limit()); } } MU_TEST(test_power_charge_voltage_limit_floating_imprecision) { // 4.016f should act as 4.016 V, even with floating point imprecision furi_hal_power_set_battery_charge_voltage_limit(4.016f); mu_assert_double_eq(4.016, (double)furi_hal_power_get_battery_charge_voltage_limit()); } MU_TEST(test_power_charge_voltage_limit_inexact) { // Charge voltage limits that are not power of 16mV get truncated down furi_hal_power_set_battery_charge_voltage_limit(3.841f); mu_assert_double_eq(3.840, (double)furi_hal_power_get_battery_charge_voltage_limit()); furi_hal_power_set_battery_charge_voltage_limit(3.900f); mu_assert_double_eq(3.888, (double)furi_hal_power_get_battery_charge_voltage_limit()); furi_hal_power_set_battery_charge_voltage_limit(4.200f); mu_assert_double_eq(4.192, (double)furi_hal_power_get_battery_charge_voltage_limit()); } MU_TEST(test_power_charge_voltage_limit_invalid_clamped) { // Out-of-range charge voltage limits get clamped to 3.840 V and 4.208 V furi_hal_power_set_battery_charge_voltage_limit(3.808f); mu_assert_double_eq(3.840, (double)furi_hal_power_get_battery_charge_voltage_limit()); furi_hal_power_set_battery_charge_voltage_limit(1.0f); mu_assert_double_eq(3.840, (double)furi_hal_power_get_battery_charge_voltage_limit()); // NOTE: Intentionally picking a small increment above 4.208 V to reduce the risk of an // unhappy battery if this fails. furi_hal_power_set_battery_charge_voltage_limit(4.240f); mu_assert_double_eq(4.208, (double)furi_hal_power_get_battery_charge_voltage_limit()); // Likewise, picking a number that the uint8_t wraparound in the driver would result in a // VREG value under 23 if this test fails. // E.g. (uint8_t)((8105-3840)/16) -> 10 furi_hal_power_set_battery_charge_voltage_limit(8.105f); mu_assert_double_eq(4.208, (double)furi_hal_power_get_battery_charge_voltage_limit()); } MU_TEST_SUITE(test_power_suite) { MU_RUN_TEST(test_power_charge_voltage_limit_exact); MU_RUN_TEST(test_power_charge_voltage_limit_floating_imprecision); MU_RUN_TEST(test_power_charge_voltage_limit_inexact); MU_RUN_TEST(test_power_charge_voltage_limit_invalid_clamped); power_test_deinit(); } int run_minunit_test_power(void) { MU_RUN_SUITE(test_power_suite); return MU_EXIT_CODE; } TEST_API_DEFINE(run_minunit_test_power) ================================================ FILE: applications/debug/unit_tests/tests/protocol_dict/protocol_dict_test.c ================================================ #include #include "../test.h" // IWYU pragma: keep #include typedef enum { TestDictProtocol0, TestDictProtocol1, TestDictProtocolMax, } TestDictProtocols; /*********************** PROTOCOL 0 START ***********************/ typedef struct { uint32_t data; size_t encoder_counter; } Protocol0Data; static const uint32_t protocol_0_decoder_result = 0xDEADBEEF; static void* protocol_0_alloc(void) { void* data = malloc(sizeof(Protocol0Data)); return data; } static void protocol_0_free(Protocol0Data* data) { free(data); } static uint8_t* protocol_0_get_data(Protocol0Data* data) { return (uint8_t*)&data->data; } static void protocol_0_decoder_start(Protocol0Data* data) { data->data = 0; } static bool protocol_0_decoder_feed(Protocol0Data* data, bool level, uint32_t duration) { if(level && duration == 666) { data->data = protocol_0_decoder_result; return true; } else { return false; } } static bool protocol_0_encoder_start(Protocol0Data* data) { data->encoder_counter = 0; return true; } static LevelDuration protocol_0_encoder_yield(Protocol0Data* data) { data->encoder_counter++; return level_duration_make(data->encoder_counter % 2, data->data); } /*********************** PROTOCOL 1 START ***********************/ typedef struct { uint64_t data; size_t encoder_counter; } Protocol1Data; static const uint64_t protocol_1_decoder_result = 0x1234567890ABCDEF; static void* protocol_1_alloc(void) { void* data = malloc(sizeof(Protocol1Data)); return data; } static void protocol_1_free(Protocol1Data* data) { free(data); } static uint8_t* protocol_1_get_data(Protocol1Data* data) { return (uint8_t*)&data->data; } static void protocol_1_decoder_start(Protocol1Data* data) { data->data = 0; } static bool protocol_1_decoder_feed(Protocol1Data* data, bool level, uint32_t duration) { if(level && duration == 543) { data->data = 0x1234567890ABCDEF; return true; } else { return false; } } static bool protocol_1_encoder_start(Protocol1Data* data) { data->encoder_counter = 0; return true; } static LevelDuration protocol_1_encoder_yield(Protocol1Data* data) { data->encoder_counter++; return level_duration_make(!(data->encoder_counter % 2), 100); } /*********************** PROTOCOLS DESCRIPTION ***********************/ static const ProtocolBase protocol_0 = { .name = "Protocol 0", .manufacturer = "Manufacturer 0", .data_size = 4, .alloc = (ProtocolAlloc)protocol_0_alloc, .free = (ProtocolFree)protocol_0_free, .get_data = (ProtocolGetData)protocol_0_get_data, .decoder = { .start = (ProtocolDecoderStart)protocol_0_decoder_start, .feed = (ProtocolDecoderFeed)protocol_0_decoder_feed, }, .encoder = { .start = (ProtocolEncoderStart)protocol_0_encoder_start, .yield = (ProtocolEncoderYield)protocol_0_encoder_yield, }, }; static const ProtocolBase protocol_1 = { .name = "Protocol 1", .manufacturer = "Manufacturer 1", .data_size = 8, .alloc = (ProtocolAlloc)protocol_1_alloc, .free = (ProtocolFree)protocol_1_free, .get_data = (ProtocolGetData)protocol_1_get_data, .decoder = { .start = (ProtocolDecoderStart)protocol_1_decoder_start, .feed = (ProtocolDecoderFeed)protocol_1_decoder_feed, }, .encoder = { .start = (ProtocolEncoderStart)protocol_1_encoder_start, .yield = (ProtocolEncoderYield)protocol_1_encoder_yield, }, }; static const ProtocolBase* test_protocols_base[] = { [TestDictProtocol0] = &protocol_0, [TestDictProtocol1] = &protocol_1, }; MU_TEST(test_protocol_dict) { ProtocolDict* dict = protocol_dict_alloc(test_protocols_base, TestDictProtocolMax); size_t max_data_size = protocol_dict_get_max_data_size(dict); mu_assert_int_eq(8, max_data_size); uint8_t* data = malloc(max_data_size); protocol_dict_decoders_start(dict); ProtocolId protocol_id = PROTOCOL_NO; for(size_t i = 0; i < 100; i++) { protocol_id = protocol_dict_decoders_feed(dict, i % 2, 100); mu_assert_int_eq(PROTOCOL_NO, protocol_id); } // trigger protocol 1 protocol_id = protocol_dict_decoders_feed(dict, true, 543); mu_assert_int_eq(TestDictProtocol1, protocol_id); mu_assert_string_eq("Protocol 1", protocol_dict_get_name(dict, protocol_id)); mu_assert_string_eq("Manufacturer 1", protocol_dict_get_manufacturer(dict, protocol_id)); size_t data_size = protocol_dict_get_data_size(dict, protocol_id); mu_assert_int_eq(8, data_size); protocol_dict_get_data(dict, protocol_id, data, data_size); mu_assert_mem_eq(&protocol_1_decoder_result, data, data_size); // trigger protocol 0 protocol_id = protocol_dict_decoders_feed(dict, true, 666); mu_assert_int_eq(TestDictProtocol0, protocol_id); mu_assert_string_eq("Protocol 0", protocol_dict_get_name(dict, protocol_id)); mu_assert_string_eq("Manufacturer 0", protocol_dict_get_manufacturer(dict, protocol_id)); data_size = protocol_dict_get_data_size(dict, protocol_id); mu_assert_int_eq(4, data_size); protocol_dict_get_data(dict, protocol_id, data, data_size); mu_assert_mem_eq(&protocol_0_decoder_result, data, data_size); protocol_dict_decoders_start(dict); protocol_id = TestDictProtocol0; const uint8_t protocol_0_test_data[4] = {100, 0, 0, 0}; protocol_dict_set_data(dict, protocol_id, protocol_0_test_data, 4); mu_check(protocol_dict_encoder_start(dict, protocol_id)); LevelDuration level; level = protocol_dict_encoder_yield(dict, protocol_id); mu_assert_int_eq(true, level_duration_get_level(level)); mu_assert_int_eq(100, level_duration_get_duration(level)); level = protocol_dict_encoder_yield(dict, protocol_id); mu_assert_int_eq(false, level_duration_get_level(level)); mu_assert_int_eq(100, level_duration_get_duration(level)); level = protocol_dict_encoder_yield(dict, protocol_id); mu_assert_int_eq(true, level_duration_get_level(level)); mu_assert_int_eq(100, level_duration_get_duration(level)); mu_check(protocol_dict_encoder_start(dict, protocol_id)); level = protocol_dict_encoder_yield(dict, protocol_id); mu_assert_int_eq(true, level_duration_get_level(level)); mu_assert_int_eq(100, level_duration_get_duration(level)); protocol_dict_free(dict); free(data); } MU_TEST_SUITE(test_protocol_dict_suite) { MU_RUN_TEST(test_protocol_dict); } int run_minunit_test_protocol_dict(void) { MU_RUN_SUITE(test_protocol_dict_suite); return MU_EXIT_CODE; } TEST_API_DEFINE(run_minunit_test_protocol_dict) ================================================ FILE: applications/debug/unit_tests/tests/rpc/rpc_test.c ================================================ #include #include #include #include #include #include #include #include #include #include #include #include "../test.h" // IWYU pragma: keep #include #include #include #include #include #include LIST_DEF(MsgList, PB_Main, M_POD_OPLIST) #define M_OPL_MsgList_t() LIST_OPLIST(MsgList) #define TEST_RPC_SESSIONS 2 /* MinUnit test framework doesn't allow passing context into tests, * so we have to use global variables */ static Rpc* rpc = NULL; static uint32_t command_id = 0; typedef struct { RpcSession* session; FuriStreamBuffer* output_stream; FuriApiLock session_close_lock; FuriApiLock session_terminate_lock; uint32_t timeout; } RpcSessionContext; static RpcSessionContext rpc_session[TEST_RPC_SESSIONS]; #define TAG "UnitTestsRpc" #define MAX_RECEIVE_OUTPUT_TIMEOUT 3000 #define MAX_NAME_LENGTH 255 #define MAX_DATA_SIZE 512u // have to be exact as in rpc_storage.c #define TEST_DIR_NAME EXT_PATH(".tmp/unit_tests/rpc") #define TEST_DIR TEST_DIR_NAME "/" #define MD5SUM_SIZE 16 #define PING_REQUEST 0 #define PING_RESPONSE 1 #define WRITE_REQUEST 0 #define READ_RESPONSE 1 #define DEBUG_PRINT 0 #define BYTES(x) (x), sizeof(x) #define DISABLE_TEST(code) \ do { \ volatile int a = 0; \ if(a) { \ code \ } \ } while(0) static void output_bytes_callback(void* ctx, uint8_t* got_bytes, size_t got_size); static void test_rpc_add_empty_to_list(MsgList_t msg_list, PB_CommandStatus status, uint32_t command_id); static void test_rpc_encode_and_feed(MsgList_t msg_list, uint8_t session); static void test_rpc_encode_and_feed_one(PB_Main* request, uint8_t session); static void test_rpc_compare_messages(PB_Main* result, PB_Main* expected); static void test_rpc_decode_and_compare(MsgList_t expected_msg_list, uint8_t session); static void test_rpc_free_msg_list(MsgList_t msg_list); static void test_rpc_session_close_callback(void* context); static void test_rpc_session_terminated_callback(void* context); static void test_rpc_setup(void) { furi_check(!rpc); furi_check(!(rpc_session[0].session)); rpc = furi_record_open(RECORD_RPC); for(int i = 0; !(rpc_session[0].session) && (i < 10000); ++i) { rpc_session[0].session = rpc_session_open(rpc, RpcOwnerUnknown); furi_delay_tick(1); } furi_check(rpc_session[0].session); rpc_session[0].output_stream = furi_stream_buffer_alloc(4096, 1); rpc_session_set_send_bytes_callback(rpc_session[0].session, output_bytes_callback); rpc_session[0].session_close_lock = api_lock_alloc_locked(); rpc_session[0].session_terminate_lock = api_lock_alloc_locked(); rpc_session_set_close_callback(rpc_session[0].session, test_rpc_session_close_callback); rpc_session_set_terminated_callback( rpc_session[0].session, test_rpc_session_terminated_callback); rpc_session_set_context(rpc_session[0].session, &rpc_session[0]); } static void test_rpc_setup_second_session(void) { furi_check(rpc); furi_check(!(rpc_session[1].session)); for(int i = 0; !(rpc_session[1].session) && (i < 10000); ++i) { rpc_session[1].session = rpc_session_open(rpc, RpcOwnerUnknown); furi_delay_tick(1); } furi_check(rpc_session[1].session); rpc_session[1].output_stream = furi_stream_buffer_alloc(1000, 1); rpc_session_set_send_bytes_callback(rpc_session[1].session, output_bytes_callback); rpc_session[1].session_close_lock = api_lock_alloc_locked(); rpc_session[1].session_terminate_lock = api_lock_alloc_locked(); rpc_session_set_close_callback(rpc_session[1].session, test_rpc_session_close_callback); rpc_session_set_terminated_callback( rpc_session[1].session, test_rpc_session_terminated_callback); rpc_session_set_context(rpc_session[1].session, &rpc_session[1]); } static void test_rpc_teardown(void) { furi_check(rpc_session[0].session_close_lock); api_lock_relock(rpc_session[0].session_terminate_lock); rpc_session_close(rpc_session[0].session); api_lock_wait_unlock(rpc_session[0].session_terminate_lock); furi_record_close(RECORD_RPC); furi_stream_buffer_free(rpc_session[0].output_stream); api_lock_free(rpc_session[0].session_close_lock); api_lock_free(rpc_session[0].session_terminate_lock); ++command_id; rpc_session[0].output_stream = NULL; rpc_session[0].session_close_lock = NULL; rpc = NULL; rpc_session[0].session = NULL; } static void test_rpc_teardown_second_session(void) { furi_check(rpc_session[1].session_close_lock); api_lock_relock(rpc_session[1].session_terminate_lock); rpc_session_close(rpc_session[1].session); api_lock_wait_unlock(rpc_session[1].session_terminate_lock); furi_stream_buffer_free(rpc_session[1].output_stream); api_lock_free(rpc_session[1].session_close_lock); api_lock_free(rpc_session[1].session_terminate_lock); ++command_id; rpc_session[1].output_stream = NULL; rpc_session[1].session_close_lock = NULL; rpc_session[1].session = NULL; } static void test_rpc_storage_clean_directory(Storage* fs_api, const char* clean_dir) { furi_check(fs_api); furi_check(clean_dir); storage_simply_remove_recursive(fs_api, clean_dir); FS_Error error = storage_common_mkdir(fs_api, clean_dir); furi_check(error == FSE_OK); } static void test_rpc_storage_create_file(Storage* fs_api, const char* path, size_t size) { File* file = storage_file_alloc(fs_api); bool success = false; do { if(!storage_file_open(file, path, FSAM_WRITE, FSOM_CREATE_ALWAYS)) break; if(!storage_file_seek(file, size, true)) break; success = true; } while(false); storage_file_close(file); storage_file_free(file); furi_check(success); } static void test_rpc_storage_setup(void) { test_rpc_setup(); Storage* fs_api = furi_record_open(RECORD_STORAGE); test_rpc_storage_clean_directory(fs_api, TEST_DIR_NAME); test_rpc_storage_create_file(fs_api, TEST_DIR_NAME "/file100", 100); test_rpc_storage_create_file(fs_api, TEST_DIR_NAME "/file250", 250); test_rpc_storage_create_file(fs_api, TEST_DIR_NAME "/file500", 200); test_rpc_storage_create_file(fs_api, TEST_DIR_NAME "/file1000", 1000); test_rpc_storage_create_file(fs_api, TEST_DIR_NAME "/file2500", 2500); test_rpc_storage_create_file(fs_api, TEST_DIR_NAME "/file5000", 5000); furi_record_close(RECORD_STORAGE); } static void test_rpc_storage_teardown(void) { test_rpc_teardown(); Storage* fs_api = furi_record_open(RECORD_STORAGE); test_rpc_storage_clean_directory(fs_api, TEST_DIR_NAME); furi_record_close(RECORD_STORAGE); } static void test_rpc_session_close_callback(void* context) { furi_check(context); RpcSessionContext* callbacks_context = context; api_lock_unlock(callbacks_context->session_close_lock); } static void test_rpc_session_terminated_callback(void* context) { furi_check(context); RpcSessionContext* callbacks_context = context; api_lock_unlock(callbacks_context->session_terminate_lock); } static void test_rpc_print_message_list(MsgList_t msg_list) { #if DEBUG_PRINT MsgList_reverse(msg_list); for M_EACH(msg, msg_list, MsgList_t) { rpc_debug_print_message(msg); } MsgList_reverse(msg_list); #else UNUSED(msg_list); #endif } static PB_CommandStatus test_rpc_storage_get_file_error(File* file) { FS_Error fs_error = storage_file_get_error(file); PB_CommandStatus pb_error; switch(fs_error) { case FSE_OK: pb_error = PB_CommandStatus_OK; break; case FSE_INVALID_NAME: pb_error = PB_CommandStatus_ERROR_STORAGE_INVALID_NAME; break; case FSE_INVALID_PARAMETER: pb_error = PB_CommandStatus_ERROR_STORAGE_INVALID_PARAMETER; break; case FSE_INTERNAL: pb_error = PB_CommandStatus_ERROR_STORAGE_INTERNAL; break; case FSE_ALREADY_OPEN: pb_error = PB_CommandStatus_ERROR_STORAGE_ALREADY_OPEN; break; case FSE_DENIED: pb_error = PB_CommandStatus_ERROR_STORAGE_DENIED; break; case FSE_EXIST: pb_error = PB_CommandStatus_ERROR_STORAGE_EXIST; break; case FSE_NOT_EXIST: pb_error = PB_CommandStatus_ERROR_STORAGE_NOT_EXIST; break; case FSE_NOT_READY: pb_error = PB_CommandStatus_ERROR_STORAGE_NOT_READY; break; case FSE_NOT_IMPLEMENTED: pb_error = PB_CommandStatus_ERROR_STORAGE_NOT_IMPLEMENTED; break; default: pb_error = PB_CommandStatus_ERROR; break; } return pb_error; } static void output_bytes_callback(void* ctx, uint8_t* got_bytes, size_t got_size) { RpcSessionContext* callbacks_context = ctx; size_t bytes_sent = furi_stream_buffer_send( callbacks_context->output_stream, got_bytes, got_size, FuriWaitForever); (void)bytes_sent; furi_check(bytes_sent == got_size); } static void test_rpc_add_ping_to_list(MsgList_t msg_list, bool request, uint32_t command_id) { PB_Main* response = MsgList_push_new(msg_list); response->command_id = command_id; response->command_status = PB_CommandStatus_OK; response->cb_content.funcs.encode = NULL; response->has_next = false; response->which_content = (request == PING_REQUEST) ? PB_Main_system_ping_request_tag : PB_Main_system_ping_response_tag; } static void test_rpc_fill_basic_message(PB_Main* message, uint16_t tag, uint32_t command_id) { message->command_id = command_id; message->command_status = PB_CommandStatus_OK; message->cb_content.funcs.encode = NULL; message->which_content = tag; message->has_next = false; } static void test_rpc_create_storage_list_request( PB_Main* message, const char* path, bool include_md5, uint32_t command_id, uint32_t filter_max_size) { furi_check(message); furi_check(path); test_rpc_fill_basic_message(message, PB_Main_storage_list_request_tag, command_id); message->content.storage_list_request.path = strdup(path); message->content.storage_list_request.include_md5 = include_md5; message->content.storage_list_request.filter_max_size = filter_max_size; } static void test_rpc_create_simple_message( PB_Main* message, uint16_t tag, const char* str, uint32_t command_id) { furi_check(message); char* str_copy = NULL; if(str) { str_copy = strdup(str); } test_rpc_fill_basic_message(message, tag, command_id); switch(tag) { case PB_Main_storage_info_request_tag: message->content.storage_info_request.path = str_copy; break; case PB_Main_storage_stat_request_tag: message->content.storage_stat_request.path = str_copy; break; case PB_Main_storage_mkdir_request_tag: message->content.storage_mkdir_request.path = str_copy; break; case PB_Main_storage_read_request_tag: message->content.storage_read_request.path = str_copy; break; case PB_Main_storage_delete_request_tag: message->content.storage_delete_request.path = str_copy; break; case PB_Main_storage_md5sum_request_tag: message->content.storage_md5sum_request.path = str_copy; break; case PB_Main_storage_md5sum_response_tag: { char* md5sum = message->content.storage_md5sum_response.md5sum; size_t md5sum_size = sizeof(message->content.storage_md5sum_response.md5sum); furi_check((strlen(str) + 1) <= md5sum_size); memcpy(md5sum, str_copy, md5sum_size); free(str_copy); break; } default: furi_check(0); break; } } static void test_rpc_add_read_or_write_to_list( MsgList_t msg_list, bool write, const char* path, const uint8_t* pattern, size_t pattern_size, size_t pattern_repeats, uint32_t command_id) { furi_check(pattern_repeats > 0); do { PB_Main* request = MsgList_push_new(msg_list); PB_Storage_File* msg_file = NULL; request->command_id = command_id; request->command_status = PB_CommandStatus_OK; if(write == WRITE_REQUEST) { request->content.storage_write_request.path = strdup(path); request->which_content = PB_Main_storage_write_request_tag; request->content.storage_write_request.has_file = true; msg_file = &request->content.storage_write_request.file; } else { request->which_content = PB_Main_storage_read_response_tag; request->content.storage_read_response.has_file = true; msg_file = &request->content.storage_read_response.file; } msg_file->data = malloc(PB_BYTES_ARRAY_T_ALLOCSIZE(pattern_size)); msg_file->data->size = pattern_size; memcpy(msg_file->data->bytes, pattern, pattern_size); --pattern_repeats; request->has_next = (pattern_repeats > 0); } while(pattern_repeats); } static void test_rpc_encode_and_feed_one(PB_Main* request, uint8_t session) { furi_check(request); furi_check(session < TEST_RPC_SESSIONS); pb_ostream_t ostream = PB_OSTREAM_SIZING; bool result = pb_encode_ex(&ostream, &PB_Main_msg, request, PB_ENCODE_DELIMITED); furi_check(result && ostream.bytes_written); uint8_t* buffer = malloc(ostream.bytes_written); ostream = pb_ostream_from_buffer(buffer, ostream.bytes_written); pb_encode_ex(&ostream, &PB_Main_msg, request, PB_ENCODE_DELIMITED); size_t bytes_left = ostream.bytes_written; uint8_t* buffer_ptr = buffer; do { size_t bytes_sent = rpc_session_feed(rpc_session[session].session, buffer_ptr, bytes_left, 1000); mu_check(bytes_sent > 0); bytes_left -= bytes_sent; buffer_ptr += bytes_sent; } while(bytes_left); free(buffer); pb_release(&PB_Main_msg, request); } static void test_rpc_encode_and_feed(MsgList_t msg_list, uint8_t session) { MsgList_reverse(msg_list); for M_EACH(request, msg_list, MsgList_t) { test_rpc_encode_and_feed_one(request, session); } MsgList_reverse(msg_list); } static void test_rpc_compare_file(PB_Storage_File* result_msg_file, PB_Storage_File* expected_msg_file) { mu_check(!result_msg_file->name == !expected_msg_file->name); if(result_msg_file->name) { mu_check(!strcmp(result_msg_file->name, expected_msg_file->name)); } mu_check(result_msg_file->size == expected_msg_file->size); mu_check(result_msg_file->type == expected_msg_file->type); mu_assert_string_eq(expected_msg_file->md5sum, result_msg_file->md5sum); if(result_msg_file->data && result_msg_file->type != PB_Storage_File_FileType_DIR) { mu_check(!result_msg_file->data == !expected_msg_file->data); // Zlo: WTF??? mu_check(result_msg_file->data->size == expected_msg_file->data->size); for(int i = 0; i < result_msg_file->data->size; ++i) { mu_check(result_msg_file->data->bytes[i] == expected_msg_file->data->bytes[i]); } } } static void test_rpc_compare_messages(PB_Main* result, PB_Main* expected) { mu_assert_int_eq(expected->command_id, result->command_id); mu_assert_int_eq(expected->command_status, result->command_status); mu_assert_int_eq(expected->has_next, result->has_next); mu_assert_int_eq(expected->which_content, result->which_content); if(result->command_status != PB_CommandStatus_OK) { mu_check(result->which_content == PB_Main_empty_tag); } switch(result->which_content) { case PB_Main_empty_tag: case PB_Main_system_ping_response_tag: /* nothing to check */ break; case PB_Main_system_ping_request_tag: case PB_Main_storage_list_request_tag: case PB_Main_storage_read_request_tag: case PB_Main_storage_write_request_tag: case PB_Main_storage_delete_request_tag: case PB_Main_storage_mkdir_request_tag: case PB_Main_storage_md5sum_request_tag: /* rpc doesn't send it */ mu_check(0); break; case PB_Main_app_lock_status_response_tag: { bool result_locked = result->content.app_lock_status_response.locked; bool expected_locked = expected->content.app_lock_status_response.locked; mu_check(result_locked == expected_locked); break; } case PB_Main_storage_info_response_tag: { uint64_t result_total_space = result->content.storage_info_response.total_space; uint64_t expected_total_space = expected->content.storage_info_response.total_space; mu_check(result_total_space == expected_total_space); uint64_t result_free_space = result->content.storage_info_response.free_space; uint64_t expected_free_space = expected->content.storage_info_response.free_space; mu_check(result_free_space == expected_free_space); } break; case PB_Main_storage_stat_response_tag: { bool result_has_msg_file = result->content.storage_stat_response.has_file; bool expected_has_msg_file = expected->content.storage_stat_response.has_file; mu_check(result_has_msg_file == expected_has_msg_file); if(result_has_msg_file) { PB_Storage_File* result_msg_file = &result->content.storage_stat_response.file; PB_Storage_File* expected_msg_file = &expected->content.storage_stat_response.file; test_rpc_compare_file(result_msg_file, expected_msg_file); } else { mu_check(0); } } break; case PB_Main_storage_read_response_tag: { bool result_has_msg_file = result->content.storage_read_response.has_file; bool expected_has_msg_file = expected->content.storage_read_response.has_file; mu_check(result_has_msg_file == expected_has_msg_file); if(result_has_msg_file) { PB_Storage_File* result_msg_file = &result->content.storage_read_response.file; PB_Storage_File* expected_msg_file = &expected->content.storage_read_response.file; test_rpc_compare_file(result_msg_file, expected_msg_file); } else { mu_check(0); } } break; case PB_Main_storage_list_response_tag: { size_t expected_msg_files = expected->content.storage_list_response.file_count; size_t result_msg_files = result->content.storage_list_response.file_count; mu_assert_int_eq(expected_msg_files, result_msg_files); for(size_t i = 0; i < expected_msg_files; ++i) { PB_Storage_File* result_msg_file = &result->content.storage_list_response.file[i]; PB_Storage_File* expected_msg_file = &expected->content.storage_list_response.file[i]; test_rpc_compare_file(result_msg_file, expected_msg_file); } break; } case PB_Main_storage_md5sum_response_tag: { char* result_md5sum = result->content.storage_md5sum_response.md5sum; char* expected_md5sum = expected->content.storage_md5sum_response.md5sum; mu_check(!strcmp(result_md5sum, expected_md5sum)); break; } case PB_Main_system_protobuf_version_response_tag: { uint32_t major_version_expected = expected->content.system_protobuf_version_response.major; uint32_t minor_version_expected = expected->content.system_protobuf_version_response.minor; uint32_t major_version_result = result->content.system_protobuf_version_response.major; uint32_t minor_version_result = result->content.system_protobuf_version_response.minor; mu_check(major_version_expected == major_version_result); mu_check(minor_version_expected == minor_version_result); break; } default: furi_check(0); break; } } static bool test_rpc_pb_stream_read(pb_istream_t* istream, pb_byte_t* buf, size_t count) { RpcSessionContext* session_context = istream->state; size_t bytes_received = 0; uint32_t now = furi_get_tick(); int32_t time_left = session_context->timeout - now; time_left = MAX(time_left, 0); bytes_received = furi_stream_buffer_receive(session_context->output_stream, buf, count, time_left); return count == bytes_received; } static void test_rpc_storage_list_create_expected_list_root(MsgList_t msg_list, uint32_t command_id) { PB_Main* message = MsgList_push_new(msg_list); message->has_next = false; message->cb_content.funcs.encode = NULL; message->command_id = command_id; message->which_content = PB_Main_storage_list_response_tag; message->content.storage_list_response.file_count = 3; message->content.storage_list_response.file[0].data = NULL; message->content.storage_list_response.file[1].data = NULL; message->content.storage_list_response.file[2].data = NULL; message->content.storage_list_response.file[0].size = 0; message->content.storage_list_response.file[1].size = 0; message->content.storage_list_response.file[2].size = 0; message->content.storage_list_response.file[0].type = PB_Storage_File_FileType_DIR; message->content.storage_list_response.file[1].type = PB_Storage_File_FileType_DIR; message->content.storage_list_response.file[2].type = PB_Storage_File_FileType_DIR; char* str = malloc(4); strcpy(str, "any"); message->content.storage_list_response.file[0].name = str; str = malloc(4); strcpy(str, "int"); message->content.storage_list_response.file[1].name = str; str = malloc(4); strcpy(str, "ext"); message->content.storage_list_response.file[2].name = str; } static bool test_rpc_system_storage_list_filter( const FileInfo* fileinfo, const char* name, size_t filter_max_size) { bool result = false; do { if(!path_contains_only_ascii(name)) break; if(filter_max_size) { if(fileinfo->size > filter_max_size) break; } result = true; } while(false); return result; } static void test_rpc_storage_list_create_expected_list( MsgList_t msg_list, const char* path, uint32_t command_id, bool append_md5, size_t filter_max_size) { Storage* fs_api = furi_record_open(RECORD_STORAGE); File* dir = storage_file_alloc(fs_api); FuriString* md5 = furi_string_alloc(); FuriString* md5_path = furi_string_alloc(); File* file = storage_file_alloc(fs_api); PB_Main response = { .command_id = command_id, .has_next = false, .which_content = PB_Main_storage_list_response_tag, /* other fields (e.g. msg_files ptrs) explicitly initialized by 0 */ }; PB_Storage_ListResponse* list = &response.content.storage_list_response; bool finish = false; int i = 0; if(storage_dir_open(dir, path)) { response.command_status = PB_CommandStatus_OK; } else { response.command_status = test_rpc_storage_get_file_error(dir); response.which_content = PB_Main_empty_tag; finish = true; } while(!finish) { FileInfo fileinfo; char* name = malloc(MAX_NAME_LENGTH + 1); if(storage_dir_read(dir, &fileinfo, name, MAX_NAME_LENGTH)) { if(i == COUNT_OF(list->file)) { list->file_count = i; response.has_next = true; MsgList_push_back(msg_list, response); i = 0; } if(test_rpc_system_storage_list_filter(&fileinfo, name, filter_max_size)) { list->file[i].type = file_info_is_dir(&fileinfo) ? PB_Storage_File_FileType_DIR : PB_Storage_File_FileType_FILE; list->file[i].size = fileinfo.size; list->file[i].data = NULL; /* memory free inside rpc_encode_and_send() -> pb_release() */ list->file[i].name = name; if(append_md5 && !file_info_is_dir(&fileinfo)) { furi_string_printf(md5_path, "%s/%s", path, name); if(md5_string_calc_file(file, furi_string_get_cstr(md5_path), md5, NULL)) { char* md5sum = list->file[i].md5sum; size_t md5sum_size = sizeof(list->file[i].md5sum); snprintf(md5sum, md5sum_size, "%s", furi_string_get_cstr(md5)); } } ++i; } } else { finish = true; free(name); } } list->file_count = i; response.has_next = false; MsgList_push_back(msg_list, response); furi_string_free(md5); furi_string_free(md5_path); storage_file_free(file); storage_dir_close(dir); storage_file_free(dir); furi_record_close(RECORD_STORAGE); } static void test_rpc_decode_and_compare(MsgList_t expected_msg_list, uint8_t session) { furi_check(!MsgList_empty_p(expected_msg_list)); furi_check(session < TEST_RPC_SESSIONS); rpc_session[session].timeout = furi_get_tick() + MAX_RECEIVE_OUTPUT_TIMEOUT; pb_istream_t istream = { .callback = test_rpc_pb_stream_read, .state = &rpc_session[session], .errmsg = NULL, .bytes_left = 0x7FFFFFFF, }; /* other fields explicitly initialized by 0 */ PB_Main result = {.cb_content.funcs.decode = NULL}; /* mlib adds msg_files into start of list, so reverse it */ MsgList_reverse(expected_msg_list); for M_EACH(expected_msg, expected_msg_list, MsgList_t) { if(!pb_decode_ex(&istream, &PB_Main_msg, &result, PB_DECODE_DELIMITED)) { mu_fail( "not all expected messages decoded (maybe increase MAX_RECEIVE_OUTPUT_TIMEOUT)"); break; } test_rpc_compare_messages(&result, expected_msg); pb_release(&PB_Main_msg, &result); } rpc_session[session].timeout = furi_get_tick() + 50; if(pb_decode_ex(&istream, &PB_Main_msg, &result, PB_DECODE_DELIMITED)) { mu_fail("decoded more than expected"); } MsgList_reverse(expected_msg_list); } static void test_rpc_free_msg_list(MsgList_t msg_list) { for M_EACH(it, msg_list, MsgList_t) { pb_release(&PB_Main_msg, it); } MsgList_clear(msg_list); } static void test_rpc_storage_list_run( const char* path, uint32_t command_id, bool md5, size_t filter_max_size) { PB_Main request; MsgList_t expected_msg_list; MsgList_init(expected_msg_list); test_rpc_create_storage_list_request(&request, path, md5, command_id, filter_max_size); if(!strcmp(path, "/")) { test_rpc_storage_list_create_expected_list_root(expected_msg_list, command_id); } else { test_rpc_storage_list_create_expected_list( expected_msg_list, path, command_id, md5, filter_max_size); } test_rpc_encode_and_feed_one(&request, 0); test_rpc_decode_and_compare(expected_msg_list, 0); pb_release(&PB_Main_msg, &request); test_rpc_free_msg_list(expected_msg_list); } MU_TEST(test_storage_list) { test_rpc_storage_list_run("/", ++command_id, false, 0); test_rpc_storage_list_run(EXT_PATH("nfc"), ++command_id, false, 0); test_rpc_storage_list_run(STORAGE_INT_PATH_PREFIX, ++command_id, false, 0); test_rpc_storage_list_run(STORAGE_EXT_PATH_PREFIX, ++command_id, false, 0); test_rpc_storage_list_run(EXT_PATH("infrared"), ++command_id, false, 0); test_rpc_storage_list_run(EXT_PATH("ibutton"), ++command_id, false, 0); test_rpc_storage_list_run(EXT_PATH("lfrfid"), ++command_id, false, 0); test_rpc_storage_list_run("error_path", ++command_id, false, 0); } MU_TEST(test_storage_list_md5) { test_rpc_storage_list_run("/", ++command_id, true, 0); test_rpc_storage_list_run(EXT_PATH("nfc"), ++command_id, true, 0); test_rpc_storage_list_run(STORAGE_INT_PATH_PREFIX, ++command_id, true, 0); test_rpc_storage_list_run(STORAGE_EXT_PATH_PREFIX, ++command_id, true, 0); test_rpc_storage_list_run(EXT_PATH("infrared"), ++command_id, true, 0); test_rpc_storage_list_run(EXT_PATH("ibutton"), ++command_id, true, 0); test_rpc_storage_list_run(EXT_PATH("lfrfid"), ++command_id, true, 0); test_rpc_storage_list_run("error_path", ++command_id, true, 0); } MU_TEST(test_storage_list_size) { test_rpc_storage_list_run(TEST_DIR_NAME, ++command_id, false, 0); test_rpc_storage_list_run(TEST_DIR_NAME, ++command_id, false, 1); test_rpc_storage_list_run(TEST_DIR_NAME, ++command_id, false, 1000); test_rpc_storage_list_run(TEST_DIR_NAME, ++command_id, false, 2500); } static void test_rpc_add_empty_to_list(MsgList_t msg_list, PB_CommandStatus status, uint32_t command_id) { PB_Main* response = MsgList_push_new(msg_list); response->command_id = command_id; response->command_status = status; response->cb_content.funcs.encode = NULL; response->has_next = false; response->which_content = PB_Main_empty_tag; } static void test_rpc_add_read_to_list_by_reading_real_file( MsgList_t msg_list, const char* path, uint32_t command_id) { furi_check(MsgList_empty_p(msg_list)); Storage* fs_api = furi_record_open(RECORD_STORAGE); File* file = storage_file_alloc(fs_api); bool result = false; if(storage_file_open(file, path, FSAM_READ, FSOM_OPEN_EXISTING)) { size_t size_left = storage_file_size(file); do { PB_Main* response = MsgList_push_new(msg_list); response->command_id = command_id; response->command_status = PB_CommandStatus_OK; response->has_next = false; response->which_content = PB_Main_storage_read_response_tag; response->content.storage_read_response.has_file = true; response->content.storage_read_response.file.data = malloc(PB_BYTES_ARRAY_T_ALLOCSIZE(MIN(size_left, MAX_DATA_SIZE))); uint8_t* buffer = response->content.storage_read_response.file.data->bytes; uint16_t* read_size_msg = &response->content.storage_read_response.file.data->size; size_t read_size = MIN(size_left, MAX_DATA_SIZE); *read_size_msg = storage_file_read(file, buffer, read_size); size_left -= read_size; result = (*read_size_msg == read_size); if(result) { response->has_next = (size_left > 0); } } while((size_left != 0) && result); if(!result) { test_rpc_add_empty_to_list( msg_list, test_rpc_storage_get_file_error(file), command_id); } } else { test_rpc_add_empty_to_list(msg_list, test_rpc_storage_get_file_error(file), command_id); } storage_file_close(file); storage_file_free(file); furi_record_close(RECORD_STORAGE); } static void test_storage_read_run(const char* path, uint32_t command_id) { PB_Main request; MsgList_t expected_msg_list; MsgList_init(expected_msg_list); test_rpc_add_read_to_list_by_reading_real_file(expected_msg_list, path, command_id); test_rpc_create_simple_message(&request, PB_Main_storage_read_request_tag, path, command_id); test_rpc_encode_and_feed_one(&request, 0); test_rpc_decode_and_compare(expected_msg_list, 0); pb_release(&PB_Main_msg, &request); test_rpc_free_msg_list(expected_msg_list); } static bool test_is_exists(const char* path) { Storage* fs_api = furi_record_open(RECORD_STORAGE); FileInfo fileinfo; FS_Error result = storage_common_stat(fs_api, path, &fileinfo); furi_check((result == FSE_OK) || (result == FSE_NOT_EXIST)); furi_record_close(RECORD_STORAGE); return result == FSE_OK; } static void test_create_dir(const char* path) { Storage* fs_api = furi_record_open(RECORD_STORAGE); FS_Error error = storage_common_mkdir(fs_api, path); (void)error; furi_check((error == FSE_OK) || (error == FSE_EXIST)); furi_record_close(RECORD_STORAGE); furi_check(test_is_exists(path)); } static void test_create_file(const char* path, size_t size) { Storage* fs_api = furi_record_open(RECORD_STORAGE); File* file = storage_file_alloc(fs_api); if(storage_file_open(file, path, FSAM_WRITE, FSOM_CREATE_ALWAYS)) { uint8_t buf[128] = {0}; for(size_t i = 0; i < sizeof(buf); ++i) { buf[i] = '0' + (i % 10); } while(size) { size_t written = storage_file_write(file, buf, MIN(size, sizeof(buf))); furi_check(written); size -= written; } } storage_file_close(file); storage_file_free(file); furi_record_close(RECORD_STORAGE); furi_check(test_is_exists(path)); } static void test_rpc_storage_info_run(const char* path, uint32_t command_id) { PB_Main request; MsgList_t expected_msg_list; MsgList_init(expected_msg_list); test_rpc_create_simple_message(&request, PB_Main_storage_info_request_tag, path, command_id); PB_Main* response = MsgList_push_new(expected_msg_list); response->command_id = command_id; Storage* fs_api = furi_record_open(RECORD_STORAGE); FS_Error error = storage_common_fs_info( fs_api, path, &response->content.storage_info_response.total_space, &response->content.storage_info_response.free_space); response->command_status = rpc_system_storage_get_error(error); if(error == FSE_OK) { response->which_content = PB_Main_storage_info_response_tag; } else { response->which_content = PB_Main_empty_tag; } test_rpc_encode_and_feed_one(&request, 0); test_rpc_decode_and_compare(expected_msg_list, 0); pb_release(&PB_Main_msg, &request); test_rpc_free_msg_list(expected_msg_list); } static void test_rpc_storage_stat_run(const char* path, uint32_t command_id) { PB_Main request; MsgList_t expected_msg_list; MsgList_init(expected_msg_list); test_rpc_create_simple_message(&request, PB_Main_storage_stat_request_tag, path, command_id); Storage* fs_api = furi_record_open(RECORD_STORAGE); FileInfo fileinfo; FS_Error error = storage_common_stat(fs_api, path, &fileinfo); furi_record_close(RECORD_STORAGE); PB_Main* response = MsgList_push_new(expected_msg_list); response->command_id = command_id; response->command_status = rpc_system_storage_get_error(error); response->has_next = false; response->which_content = PB_Main_empty_tag; if(error == FSE_OK) { response->which_content = PB_Main_storage_stat_response_tag; response->content.storage_stat_response.has_file = true; response->content.storage_stat_response.file.type = file_info_is_dir(&fileinfo) ? PB_Storage_File_FileType_DIR : PB_Storage_File_FileType_FILE; response->content.storage_stat_response.file.size = fileinfo.size; } test_rpc_encode_and_feed_one(&request, 0); test_rpc_decode_and_compare(expected_msg_list, 0); pb_release(&PB_Main_msg, &request); test_rpc_free_msg_list(expected_msg_list); } MU_TEST(test_storage_info) { test_rpc_storage_info_run(STORAGE_ANY_PATH_PREFIX, ++command_id); test_rpc_storage_info_run(STORAGE_INT_PATH_PREFIX, ++command_id); test_rpc_storage_info_run(STORAGE_EXT_PATH_PREFIX, ++command_id); } #define TEST_DIR_STAT_NAME TEST_DIR "stat_dir" #define TEST_DIR_STAT TEST_DIR_STAT_NAME "/" MU_TEST(test_storage_stat) { test_create_dir(TEST_DIR_STAT_NAME); test_create_file(TEST_DIR_STAT "empty.txt", 0); test_create_file(TEST_DIR_STAT "l33t.txt", 1337); test_rpc_storage_stat_run("/", ++command_id); test_rpc_storage_stat_run(STORAGE_INT_PATH_PREFIX, ++command_id); test_rpc_storage_stat_run(STORAGE_EXT_PATH_PREFIX, ++command_id); test_rpc_storage_stat_run(TEST_DIR_STAT "empty.txt", ++command_id); test_rpc_storage_stat_run(TEST_DIR_STAT "l33t.txt", ++command_id); test_rpc_storage_stat_run(TEST_DIR_STAT "missing", ++command_id); test_rpc_storage_stat_run(TEST_DIR_STAT_NAME, ++command_id); test_rpc_storage_stat_run(TEST_DIR_STAT, ++command_id); } MU_TEST(test_storage_read) { test_create_file(TEST_DIR "empty.txt", 0); test_create_file(TEST_DIR "file1.txt", 1); test_create_file(TEST_DIR "file2.txt", MAX_DATA_SIZE); test_create_file(TEST_DIR "file3.txt", MAX_DATA_SIZE + 1); test_create_file(TEST_DIR "file4.txt", (MAX_DATA_SIZE * 2) + 1); test_storage_read_run(TEST_DIR "empty.txt", ++command_id); test_storage_read_run(TEST_DIR "file1.txt", ++command_id); test_storage_read_run(TEST_DIR "file2.txt", ++command_id); test_storage_read_run(TEST_DIR "file3.txt", ++command_id); test_storage_read_run(TEST_DIR "file4.txt", ++command_id); } static void test_storage_write_run( const char* path, size_t write_size, size_t write_count, uint32_t command_id, PB_CommandStatus status) { MsgList_t input_msg_list; MsgList_init(input_msg_list); MsgList_t expected_msg_list; MsgList_init(expected_msg_list); uint8_t* buf = malloc(write_size); for(size_t i = 0; i < write_size; ++i) { buf[i] = '0' + (i % 10); } test_rpc_add_read_or_write_to_list( input_msg_list, WRITE_REQUEST, path, buf, write_size, write_count, command_id); test_rpc_add_empty_to_list(expected_msg_list, status, command_id); test_rpc_encode_and_feed(input_msg_list, 0); test_rpc_decode_and_compare(expected_msg_list, 0); test_rpc_free_msg_list(input_msg_list); test_rpc_free_msg_list(expected_msg_list); free(buf); } static void test_storage_write_read_run( const char* path, const uint8_t* pattern, size_t pattern_size, size_t pattern_repeats, uint32_t* command_id) { MsgList_t input_msg_list; MsgList_init(input_msg_list); MsgList_t expected_msg_list; MsgList_init(expected_msg_list); test_rpc_add_read_or_write_to_list( input_msg_list, WRITE_REQUEST, path, pattern, pattern_size, pattern_repeats, ++*command_id); test_rpc_add_empty_to_list(expected_msg_list, PB_CommandStatus_OK, *command_id); test_rpc_create_simple_message( MsgList_push_raw(input_msg_list), PB_Main_storage_read_request_tag, path, ++*command_id); test_rpc_add_read_or_write_to_list( expected_msg_list, READ_RESPONSE, path, pattern, pattern_size, pattern_repeats, *command_id); test_rpc_print_message_list(input_msg_list); test_rpc_print_message_list(expected_msg_list); test_rpc_encode_and_feed(input_msg_list, 0); test_rpc_decode_and_compare(expected_msg_list, 0); test_rpc_free_msg_list(input_msg_list); test_rpc_free_msg_list(expected_msg_list); } MU_TEST(test_storage_write_read) { uint8_t pattern1[] = "abcdefgh"; test_storage_write_read_run(TEST_DIR "test1.txt", pattern1, sizeof(pattern1), 1, &command_id); test_storage_write_read_run(TEST_DIR "test2.txt", pattern1, 1, 1, &command_id); test_storage_write_read_run(TEST_DIR "test3.txt", pattern1, 0, 1, &command_id); } MU_TEST(test_storage_write) { test_storage_write_run( TEST_DIR "afaefo/aefaef/aef/aef/test1.txt", 1, 1, ++command_id, PB_CommandStatus_ERROR_STORAGE_NOT_EXIST); test_storage_write_run(TEST_DIR "test1.txt", 100, 1, ++command_id, PB_CommandStatus_OK); test_storage_write_run(TEST_DIR "test2.txt", 100, 3, ++command_id, PB_CommandStatus_OK); test_storage_write_run(TEST_DIR "test1.txt", 100, 3, ++command_id, PB_CommandStatus_OK); test_storage_write_run(TEST_DIR "test2.txt", 100, 3, ++command_id, PB_CommandStatus_OK); test_storage_write_run( TEST_DIR "afaefo/aefaef/aef/aef/test1.txt", 1, 1, ++command_id, PB_CommandStatus_ERROR_STORAGE_NOT_EXIST); test_storage_write_run(TEST_DIR "test2.txt", 1, 50, ++command_id, PB_CommandStatus_OK); test_storage_write_run(TEST_DIR "test2.txt", 512, 3, ++command_id, PB_CommandStatus_OK); } MU_TEST(test_storage_interrupt_continuous_same_system) { MsgList_t input_msg_list; MsgList_init(input_msg_list); MsgList_t expected_msg_list; MsgList_init(expected_msg_list); uint8_t pattern[16] = {0}; test_rpc_add_read_or_write_to_list( input_msg_list, WRITE_REQUEST, TEST_DIR "test1.txt", pattern, sizeof(pattern), 3, command_id); /* replace last packet (has_next == false) with another command */ PB_Main message_to_remove; MsgList_pop_back(&message_to_remove, input_msg_list); pb_release(&PB_Main_msg, &message_to_remove); test_rpc_create_simple_message( MsgList_push_new(input_msg_list), PB_Main_storage_mkdir_request_tag, TEST_DIR "dir1", command_id + 1); test_rpc_add_read_or_write_to_list( input_msg_list, WRITE_REQUEST, TEST_DIR "test2.txt", pattern, sizeof(pattern), 3, command_id); test_rpc_add_empty_to_list( expected_msg_list, PB_CommandStatus_ERROR_CONTINUOUS_COMMAND_INTERRUPTED, command_id); test_rpc_add_empty_to_list(expected_msg_list, PB_CommandStatus_OK, command_id + 1); test_rpc_encode_and_feed(input_msg_list, 0); test_rpc_decode_and_compare(expected_msg_list, 0); test_rpc_free_msg_list(input_msg_list); test_rpc_free_msg_list(expected_msg_list); } MU_TEST(test_storage_interrupt_continuous_another_system) { MsgList_t input_msg_list; MsgList_init(input_msg_list); MsgList_t expected_msg_list; MsgList_init(expected_msg_list); uint8_t pattern[16] = {0}; test_rpc_add_read_or_write_to_list( input_msg_list, WRITE_REQUEST, TEST_DIR "test1.txt", pattern, sizeof(pattern), 3, command_id); PB_Main message = { .command_id = command_id + 1, .command_status = PB_CommandStatus_OK, .cb_content.funcs.encode = NULL, .has_next = false, .which_content = PB_Main_system_ping_request_tag, }; MsgList_it_t it; MsgList_it(it, input_msg_list); MsgList_next(it); MsgList_insert(input_msg_list, it, message); test_rpc_add_read_or_write_to_list( input_msg_list, WRITE_REQUEST, TEST_DIR "test2.txt", pattern, sizeof(pattern), 3, command_id + 2); test_rpc_add_ping_to_list(expected_msg_list, PING_RESPONSE, command_id + 1); test_rpc_add_empty_to_list(expected_msg_list, PB_CommandStatus_OK, command_id); test_rpc_add_empty_to_list(expected_msg_list, PB_CommandStatus_OK, command_id + 2); test_rpc_encode_and_feed(input_msg_list, 0); test_rpc_decode_and_compare(expected_msg_list, 0); test_rpc_free_msg_list(input_msg_list); test_rpc_free_msg_list(expected_msg_list); } static void test_storage_delete_run( const char* path, size_t command_id, PB_CommandStatus status, bool recursive) { PB_Main request; MsgList_t expected_msg_list; MsgList_init(expected_msg_list); test_rpc_create_simple_message(&request, PB_Main_storage_delete_request_tag, path, command_id); request.content.storage_delete_request.recursive = recursive; test_rpc_add_empty_to_list(expected_msg_list, status, command_id); test_rpc_encode_and_feed_one(&request, 0); test_rpc_decode_and_compare(expected_msg_list, 0); pb_release(&PB_Main_msg, &request); test_rpc_free_msg_list(expected_msg_list); } #define TEST_DIR_RMRF_NAME TEST_DIR "rmrf_test" #define TEST_DIR_RMRF TEST_DIR_RMRF_NAME "/" MU_TEST(test_storage_delete_recursive) { test_create_dir(TEST_DIR_RMRF_NAME); test_create_dir(TEST_DIR_RMRF "dir1"); test_create_file(TEST_DIR_RMRF "dir1/file1", 1); test_create_dir(TEST_DIR_RMRF "dir1/dir1"); test_create_dir(TEST_DIR_RMRF "dir1/dir2"); test_create_file(TEST_DIR_RMRF "dir1/dir2/file1", 1); test_create_file(TEST_DIR_RMRF "dir1/dir2/file2", 1); test_create_dir(TEST_DIR_RMRF "dir1/dir3"); test_create_dir(TEST_DIR_RMRF "dir1/dir3/dir1"); test_create_dir(TEST_DIR_RMRF "dir1/dir3/dir1/dir1"); test_create_dir(TEST_DIR_RMRF "dir1/dir3/dir1/dir1/dir1"); test_create_dir(TEST_DIR_RMRF "dir1/dir3/dir1/dir1/dir1/dir1"); test_create_dir(TEST_DIR_RMRF "dir2"); test_create_dir(TEST_DIR_RMRF "dir2/dir1"); test_create_dir(TEST_DIR_RMRF "dir2/dir2"); test_create_file(TEST_DIR_RMRF "dir2/dir2/file1", 1); test_create_dir(TEST_DIR_RMRF "dir2/dir2/dir1"); test_create_dir(TEST_DIR_RMRF "dir2/dir2/dir1/dir1"); test_create_dir(TEST_DIR_RMRF "dir2/dir2/dir1/dir1/dir1"); test_create_file(TEST_DIR_RMRF "dir2/dir2/dir1/dir1/dir1/file1", 1); test_storage_delete_run( TEST_DIR_RMRF_NAME, ++command_id, PB_CommandStatus_ERROR_STORAGE_DIR_NOT_EMPTY, false); mu_check(test_is_exists(TEST_DIR_RMRF_NAME)); test_storage_delete_run(TEST_DIR_RMRF_NAME, ++command_id, PB_CommandStatus_OK, true); mu_check(!test_is_exists(TEST_DIR_RMRF_NAME)); test_storage_delete_run(TEST_DIR_RMRF_NAME, ++command_id, PB_CommandStatus_OK, false); mu_check(!test_is_exists(TEST_DIR_RMRF_NAME)); test_create_dir(TEST_DIR_RMRF_NAME); test_storage_delete_run(TEST_DIR_RMRF_NAME, ++command_id, PB_CommandStatus_OK, true); mu_check(!test_is_exists(TEST_DIR_RMRF_NAME)); test_create_dir(TEST_DIR "file1"); test_storage_delete_run(TEST_DIR "file1", ++command_id, PB_CommandStatus_OK, true); mu_check(!test_is_exists(TEST_DIR "file1")); } MU_TEST(test_storage_delete) { test_storage_delete_run(NULL, ++command_id, PB_CommandStatus_ERROR_INVALID_PARAMETERS, false); furi_check(!test_is_exists(TEST_DIR "empty.txt")); test_storage_delete_run(TEST_DIR "empty.txt", ++command_id, PB_CommandStatus_OK, false); mu_check(!test_is_exists(TEST_DIR "empty.txt")); test_create_file(TEST_DIR "empty.txt", 0); test_storage_delete_run(TEST_DIR "empty.txt", ++command_id, PB_CommandStatus_OK, false); mu_check(!test_is_exists(TEST_DIR "empty.txt")); furi_check(!test_is_exists(TEST_DIR "dir1")); test_create_dir(TEST_DIR "dir1"); test_storage_delete_run(TEST_DIR "dir1", ++command_id, PB_CommandStatus_OK, false); mu_check(!test_is_exists(TEST_DIR "dir1")); test_storage_delete_run(TEST_DIR "dir1", ++command_id, PB_CommandStatus_OK, false); mu_check(!test_is_exists(TEST_DIR "dir1")); } static void test_storage_mkdir_run(const char* path, size_t command_id, PB_CommandStatus status) { PB_Main request; MsgList_t expected_msg_list; MsgList_init(expected_msg_list); test_rpc_create_simple_message(&request, PB_Main_storage_mkdir_request_tag, path, command_id); test_rpc_add_empty_to_list(expected_msg_list, status, command_id); test_rpc_encode_and_feed_one(&request, 0); test_rpc_decode_and_compare(expected_msg_list, 0); pb_release(&PB_Main_msg, &request); test_rpc_free_msg_list(expected_msg_list); } MU_TEST(test_storage_mkdir) { furi_check(!test_is_exists(TEST_DIR "dir1")); test_storage_mkdir_run(TEST_DIR "dir1", ++command_id, PB_CommandStatus_OK); mu_check(test_is_exists(TEST_DIR "dir1")); test_storage_mkdir_run(TEST_DIR "dir1", ++command_id, PB_CommandStatus_ERROR_STORAGE_EXIST); mu_check(test_is_exists(TEST_DIR "dir1")); furi_check(!test_is_exists(TEST_DIR "dir2")); test_create_dir(TEST_DIR "dir2"); test_storage_mkdir_run(TEST_DIR "dir2", ++command_id, PB_CommandStatus_ERROR_STORAGE_EXIST); mu_check(test_is_exists(TEST_DIR "dir2")); } static void test_storage_calculate_md5sum(const char* path, char* md5sum, size_t md5sum_size) { Storage* api = furi_record_open(RECORD_STORAGE); File* file = storage_file_alloc(api); FuriString* md5 = furi_string_alloc(); if(md5_string_calc_file(file, path, md5, NULL)) { snprintf(md5sum, md5sum_size, "%s", furi_string_get_cstr(md5)); } else { furi_check(0); } furi_string_free(md5); storage_file_close(file); storage_file_free(file); furi_record_close(RECORD_STORAGE); } static void test_storage_md5sum_run( const char* path, uint32_t command_id, const char* md5sum, PB_CommandStatus status) { PB_Main request; MsgList_t expected_msg_list; MsgList_init(expected_msg_list); test_rpc_create_simple_message(&request, PB_Main_storage_md5sum_request_tag, path, command_id); if(status == PB_CommandStatus_OK) { PB_Main* response = MsgList_push_new(expected_msg_list); test_rpc_create_simple_message( response, PB_Main_storage_md5sum_response_tag, md5sum, command_id); response->command_status = status; } else { test_rpc_add_empty_to_list(expected_msg_list, status, command_id); } test_rpc_encode_and_feed_one(&request, 0); test_rpc_decode_and_compare(expected_msg_list, 0); pb_release(&PB_Main_msg, &request); test_rpc_free_msg_list(expected_msg_list); } MU_TEST(test_storage_md5sum) { char md5sum1[MD5SUM_SIZE * 2 + 1] = {0}; char md5sum2[MD5SUM_SIZE * 2 + 1] = {0}; char md5sum3[MD5SUM_SIZE * 2 + 1] = {0}; test_storage_md5sum_run( TEST_DIR "test1.txt", ++command_id, "", PB_CommandStatus_ERROR_STORAGE_NOT_EXIST); test_create_file(TEST_DIR "file1.txt", 0); test_create_file(TEST_DIR "file2.txt", 1); test_create_file(TEST_DIR "file3.txt", 512); test_storage_calculate_md5sum(TEST_DIR "file1.txt", md5sum1, MD5SUM_SIZE * 2 + 1); test_storage_calculate_md5sum(TEST_DIR "file2.txt", md5sum2, MD5SUM_SIZE * 2 + 1); test_storage_calculate_md5sum(TEST_DIR "file3.txt", md5sum3, MD5SUM_SIZE * 2 + 1); test_storage_md5sum_run(TEST_DIR "file1.txt", ++command_id, md5sum1, PB_CommandStatus_OK); test_storage_md5sum_run(TEST_DIR "file1.txt", ++command_id, md5sum1, PB_CommandStatus_OK); test_storage_md5sum_run(TEST_DIR "file2.txt", ++command_id, md5sum2, PB_CommandStatus_OK); test_storage_md5sum_run(TEST_DIR "file2.txt", ++command_id, md5sum2, PB_CommandStatus_OK); test_storage_md5sum_run(TEST_DIR "file3.txt", ++command_id, md5sum3, PB_CommandStatus_OK); test_storage_md5sum_run(TEST_DIR "file3.txt", ++command_id, md5sum3, PB_CommandStatus_OK); test_storage_md5sum_run(TEST_DIR "file2.txt", ++command_id, md5sum2, PB_CommandStatus_OK); test_storage_md5sum_run(TEST_DIR "file3.txt", ++command_id, md5sum3, PB_CommandStatus_OK); test_storage_md5sum_run(TEST_DIR "file1.txt", ++command_id, md5sum1, PB_CommandStatus_OK); test_storage_md5sum_run(TEST_DIR "file2.txt", ++command_id, md5sum2, PB_CommandStatus_OK); } static void test_rpc_storage_rename_run( const char* old_path, const char* new_path, uint32_t command_id, PB_CommandStatus status) { PB_Main request; MsgList_t expected_msg_list; MsgList_init(expected_msg_list); char* str_old_path = strdup(old_path); char* str_new_path = strdup(new_path); request.command_id = command_id; request.command_status = PB_CommandStatus_OK; request.cb_content.funcs.encode = NULL; request.which_content = PB_Main_storage_rename_request_tag; request.has_next = false; request.content.storage_rename_request.old_path = str_old_path; request.content.storage_rename_request.new_path = str_new_path; test_rpc_add_empty_to_list(expected_msg_list, status, command_id); test_rpc_encode_and_feed_one(&request, 0); test_rpc_decode_and_compare(expected_msg_list, 0); pb_release(&PB_Main_msg, &request); test_rpc_free_msg_list(expected_msg_list); } MU_TEST(test_storage_rename) { test_rpc_storage_rename_run("", "", ++command_id, PB_CommandStatus_ERROR_STORAGE_INVALID_NAME); furi_check(!test_is_exists(TEST_DIR "empty.txt")); test_create_file(TEST_DIR "empty.txt", 0); test_rpc_storage_rename_run( TEST_DIR "empty.txt", TEST_DIR "empty2.txt", ++command_id, PB_CommandStatus_OK); mu_check(!test_is_exists(TEST_DIR "empty.txt")); mu_check(test_is_exists(TEST_DIR "empty2.txt")); furi_check(!test_is_exists(TEST_DIR "dir1")); test_create_dir(TEST_DIR "dir1"); test_rpc_storage_rename_run( TEST_DIR "dir1", TEST_DIR "dir2", ++command_id, PB_CommandStatus_OK); mu_check(!test_is_exists(TEST_DIR "dir1")); mu_check(test_is_exists(TEST_DIR "dir2")); } MU_TEST(test_ping) { MsgList_t input_msg_list; MsgList_init(input_msg_list); MsgList_t expected_msg_list; MsgList_init(expected_msg_list); test_rpc_add_ping_to_list(input_msg_list, PING_REQUEST, 0); test_rpc_add_ping_to_list(input_msg_list, PING_REQUEST, 1); test_rpc_add_ping_to_list(input_msg_list, PING_REQUEST, 0); test_rpc_add_ping_to_list(input_msg_list, PING_REQUEST, 500); test_rpc_add_ping_to_list(input_msg_list, PING_REQUEST, (uint32_t)-1); test_rpc_add_ping_to_list(input_msg_list, PING_REQUEST, 700); test_rpc_add_ping_to_list(input_msg_list, PING_REQUEST, 1); test_rpc_add_ping_to_list(expected_msg_list, PING_RESPONSE, 0); test_rpc_add_ping_to_list(expected_msg_list, PING_RESPONSE, 1); test_rpc_add_ping_to_list(expected_msg_list, PING_RESPONSE, 0); test_rpc_add_ping_to_list(expected_msg_list, PING_RESPONSE, 500); test_rpc_add_ping_to_list(expected_msg_list, PING_RESPONSE, (uint32_t)-1); test_rpc_add_ping_to_list(expected_msg_list, PING_RESPONSE, 700); test_rpc_add_ping_to_list(expected_msg_list, PING_RESPONSE, 1); test_rpc_encode_and_feed(input_msg_list, 0); test_rpc_decode_and_compare(expected_msg_list, 0); test_rpc_free_msg_list(input_msg_list); test_rpc_free_msg_list(expected_msg_list); } MU_TEST(test_system_protobuf_version) { MsgList_t expected_msg_list; MsgList_init(expected_msg_list); PB_Main request; request.command_id = ++command_id; request.command_status = PB_CommandStatus_OK; request.cb_content.funcs.decode = NULL; request.has_next = false; request.which_content = PB_Main_system_protobuf_version_request_tag; PB_Main* response = MsgList_push_new(expected_msg_list); response->command_id = command_id; response->command_status = PB_CommandStatus_OK; response->cb_content.funcs.encode = NULL; response->has_next = false; response->which_content = PB_Main_system_protobuf_version_response_tag; response->content.system_protobuf_version_response.major = PROTOBUF_MAJOR_VERSION; response->content.system_protobuf_version_response.minor = PROTOBUF_MINOR_VERSION; test_rpc_encode_and_feed_one(&request, 0); test_rpc_decode_and_compare(expected_msg_list, 0); test_rpc_free_msg_list(expected_msg_list); } MU_TEST_SUITE(test_rpc_system) { MU_SUITE_CONFIGURE(&test_rpc_setup, &test_rpc_teardown); MU_RUN_TEST(test_ping); MU_RUN_TEST(test_system_protobuf_version); } MU_TEST_SUITE(test_rpc_storage) { MU_SUITE_CONFIGURE(&test_rpc_storage_setup, &test_rpc_storage_teardown); MU_RUN_TEST(test_storage_info); MU_RUN_TEST(test_storage_stat); MU_RUN_TEST(test_storage_list); MU_RUN_TEST(test_storage_list_md5); MU_RUN_TEST(test_storage_list_size); MU_RUN_TEST(test_storage_read); MU_RUN_TEST(test_storage_write_read); MU_RUN_TEST(test_storage_write); MU_RUN_TEST(test_storage_delete); MU_RUN_TEST(test_storage_delete_recursive); MU_RUN_TEST(test_storage_mkdir); MU_RUN_TEST(test_storage_md5sum); MU_RUN_TEST(test_storage_rename); DISABLE_TEST(MU_RUN_TEST(test_storage_interrupt_continuous_same_system);); MU_RUN_TEST(test_storage_interrupt_continuous_another_system); } static void test_app_create_request( PB_Main* request, const char* app_name, const char* app_args, uint32_t command_id) { request->command_id = command_id; request->command_status = PB_CommandStatus_OK; request->cb_content.funcs.encode = NULL; request->which_content = PB_Main_app_start_request_tag; request->has_next = false; if(app_name) { char* msg_app_name = strdup(app_name); request->content.app_start_request.name = msg_app_name; } else { request->content.app_start_request.name = NULL; } if(app_args) { char* msg_app_args = strdup(app_args); request->content.app_start_request.args = msg_app_args; } else { request->content.app_start_request.args = NULL; } } static void test_app_start_run( const char* app_name, const char* app_args, PB_CommandStatus status, uint32_t command_id) { PB_Main request; MsgList_t expected_msg_list; MsgList_init(expected_msg_list); test_app_create_request(&request, app_name, app_args, command_id); test_rpc_add_empty_to_list(expected_msg_list, status, command_id); test_rpc_encode_and_feed_one(&request, 0); test_rpc_decode_and_compare(expected_msg_list, 0); pb_release(&PB_Main_msg, &request); test_rpc_free_msg_list(expected_msg_list); } static void test_app_get_status_lock_run(bool locked_expected, uint32_t command_id) { PB_Main request = { .command_id = command_id, .command_status = PB_CommandStatus_OK, .which_content = PB_Main_app_lock_status_request_tag, .has_next = false, }; MsgList_t expected_msg_list; MsgList_init(expected_msg_list); PB_Main* response = MsgList_push_new(expected_msg_list); response->command_id = command_id; response->command_status = PB_CommandStatus_OK; response->which_content = PB_Main_app_lock_status_response_tag; response->has_next = false; response->content.app_lock_status_response.locked = locked_expected; test_rpc_encode_and_feed_one(&request, 0); test_rpc_decode_and_compare(expected_msg_list, 0); pb_release(&PB_Main_msg, &request); test_rpc_free_msg_list(expected_msg_list); } MU_TEST(test_app_start_and_lock_status) { test_app_get_status_lock_run(false, ++command_id); test_app_start_run( NULL, EXT_PATH("file"), PB_CommandStatus_ERROR_INVALID_PARAMETERS, ++command_id); test_app_start_run(NULL, NULL, PB_CommandStatus_ERROR_INVALID_PARAMETERS, ++command_id); test_app_get_status_lock_run(false, ++command_id); test_app_start_run( "skynet_destroy_world_app", NULL, PB_CommandStatus_ERROR_INVALID_PARAMETERS, ++command_id); test_app_get_status_lock_run(false, ++command_id); test_app_start_run("Delay Test", "0", PB_CommandStatus_OK, ++command_id); furi_delay_ms(100); test_app_get_status_lock_run(false, ++command_id); test_app_start_run("Delay Test", "200", PB_CommandStatus_OK, ++command_id); test_app_get_status_lock_run(true, ++command_id); furi_delay_ms(100); test_app_get_status_lock_run(true, ++command_id); test_app_start_run("Delay Test", "0", PB_CommandStatus_ERROR_APP_SYSTEM_LOCKED, ++command_id); furi_delay_ms(200); test_app_get_status_lock_run(false, ++command_id); test_app_start_run("Delay Test", "500", PB_CommandStatus_OK, ++command_id); furi_delay_ms(100); test_app_get_status_lock_run(true, ++command_id); test_app_start_run("Infrared", "0", PB_CommandStatus_ERROR_APP_SYSTEM_LOCKED, ++command_id); furi_delay_ms(100); test_app_get_status_lock_run(true, ++command_id); test_app_start_run( "2_girls_1_app", "0", PB_CommandStatus_ERROR_INVALID_PARAMETERS, ++command_id); furi_delay_ms(100); test_app_get_status_lock_run(true, ++command_id); furi_delay_ms(500); test_app_get_status_lock_run(false, ++command_id); } MU_TEST_SUITE(test_rpc_app) { MU_SUITE_CONFIGURE(&test_rpc_setup, &test_rpc_teardown); DISABLE_TEST(MU_RUN_TEST(test_app_start_and_lock_status);); } static void test_send_rubbish(RpcSession* session, const char* pattern, size_t pattern_size, size_t size) { UNUSED(session); uint8_t* buf = malloc(size); for(size_t i = 0; i < size; ++i) { buf[i] = pattern[i % pattern_size]; } size_t bytes_sent = rpc_session_feed(rpc_session[0].session, buf, size, 1000); furi_check(bytes_sent == size); free(buf); } static void test_rpc_feed_rubbish_run( MsgList_t input_before, MsgList_t input_after, MsgList_t expected, const char* pattern, size_t pattern_size, size_t size) { test_rpc_setup(); test_rpc_add_empty_to_list(expected, PB_CommandStatus_ERROR_DECODE, 0); furi_check(api_lock_is_locked(rpc_session[0].session_close_lock)); test_rpc_encode_and_feed(input_before, 0); test_send_rubbish(rpc_session[0].session, pattern, pattern_size, size); test_rpc_encode_and_feed(input_after, 0); test_rpc_decode_and_compare(expected, 0); test_rpc_teardown(); } #define RUN_TEST_RPC_FEED_RUBBISH(ib, ia, e, b, c) \ test_rpc_feed_rubbish_run(ib, ia, e, b, sizeof(b), c) #define INIT_LISTS() \ MsgList_init(input_before); \ MsgList_init(input_after); \ MsgList_init(expected); #define FREE_LISTS() \ test_rpc_free_msg_list(input_before); \ test_rpc_free_msg_list(input_after); \ test_rpc_free_msg_list(expected); MU_TEST(test_rpc_feed_rubbish) { MsgList_t input_before; MsgList_t input_after; MsgList_t expected; INIT_LISTS(); // input is empty RUN_TEST_RPC_FEED_RUBBISH(input_before, input_after, expected, "\x12\x30rubbi\x42sh", 50); FREE_LISTS(); INIT_LISTS(); test_rpc_add_ping_to_list(input_before, PING_REQUEST, ++command_id); test_rpc_add_ping_to_list(expected, PING_RESPONSE, command_id); RUN_TEST_RPC_FEED_RUBBISH(input_before, input_after, expected, "\x2\x2\x2\x5\x99\x1", 30); FREE_LISTS(); INIT_LISTS(); test_rpc_add_ping_to_list(input_after, PING_REQUEST, ++command_id); RUN_TEST_RPC_FEED_RUBBISH(input_before, input_after, expected, "\x12\x30rubbi\x42sh", 50); FREE_LISTS(); INIT_LISTS(); test_rpc_add_ping_to_list(input_before, PING_REQUEST, ++command_id); test_rpc_add_ping_to_list(expected, PING_RESPONSE, command_id); test_rpc_add_ping_to_list(input_before, PING_REQUEST, ++command_id); test_rpc_add_ping_to_list(expected, PING_RESPONSE, command_id); test_rpc_add_ping_to_list(input_before, PING_REQUEST, ++command_id); test_rpc_add_ping_to_list(expected, PING_RESPONSE, command_id); test_rpc_add_ping_to_list(input_before, PING_REQUEST, ++command_id); test_rpc_add_ping_to_list(expected, PING_RESPONSE, command_id); test_rpc_add_ping_to_list(input_before, PING_REQUEST, ++command_id); test_rpc_add_ping_to_list(expected, PING_RESPONSE, command_id); test_rpc_add_ping_to_list(input_before, PING_REQUEST, ++command_id); test_rpc_add_ping_to_list(expected, PING_RESPONSE, command_id); test_rpc_add_ping_to_list(input_before, PING_REQUEST, ++command_id); test_rpc_add_ping_to_list(expected, PING_RESPONSE, command_id); test_rpc_add_ping_to_list(input_before, PING_REQUEST, ++command_id); test_rpc_add_ping_to_list(expected, PING_RESPONSE, command_id); test_rpc_add_ping_to_list(input_after, PING_REQUEST, command_id); test_rpc_add_ping_to_list(input_after, PING_REQUEST, command_id); test_rpc_add_ping_to_list(input_after, PING_REQUEST, command_id); RUN_TEST_RPC_FEED_RUBBISH(input_before, input_after, expected, "\x99\x2\x2\x5\x99\x1", 300); FREE_LISTS(); INIT_LISTS(); test_rpc_add_ping_to_list(input_after, PING_REQUEST, ++command_id); RUN_TEST_RPC_FEED_RUBBISH(input_before, input_after, expected, "\x1\x99\x2\x5\x99\x1", 300); FREE_LISTS(); INIT_LISTS(); test_rpc_add_ping_to_list(input_before, PING_REQUEST, ++command_id); test_rpc_add_ping_to_list(expected, PING_RESPONSE, command_id); RUN_TEST_RPC_FEED_RUBBISH(input_before, input_after, expected, "\x2\x2\x2\x5\x99\x1", 30); FREE_LISTS(); INIT_LISTS(); test_rpc_add_ping_to_list(input_before, PING_RESPONSE, ++command_id); test_rpc_add_empty_to_list(expected, PB_CommandStatus_ERROR_NOT_IMPLEMENTED, command_id); test_rpc_add_ping_to_list(input_before, PING_RESPONSE, ++command_id); test_rpc_add_empty_to_list(expected, PB_CommandStatus_ERROR_NOT_IMPLEMENTED, command_id); RUN_TEST_RPC_FEED_RUBBISH(input_before, input_after, expected, "\x12\x30rubbi\x42sh", 50); FREE_LISTS(); } MU_TEST(test_rpc_multisession_ping) { MsgList_t input_0; MsgList_init(input_0); MsgList_t input_1; MsgList_init(input_1); MsgList_t expected_0; MsgList_init(expected_0); MsgList_t expected_1; MsgList_init(expected_1); test_rpc_setup(); test_rpc_setup_second_session(); test_rpc_teardown_second_session(); test_rpc_setup_second_session(); test_rpc_add_ping_to_list(input_0, PING_REQUEST, 0); test_rpc_add_ping_to_list(input_1, PING_REQUEST, 1); test_rpc_add_ping_to_list(expected_0, PING_RESPONSE, 0); test_rpc_add_ping_to_list(expected_1, PING_RESPONSE, 1); test_rpc_encode_and_feed(input_0, 0); test_rpc_encode_and_feed(input_1, 1); test_rpc_decode_and_compare(expected_0, 0); test_rpc_decode_and_compare(expected_1, 1); test_rpc_free_msg_list(input_0); test_rpc_free_msg_list(input_1); test_rpc_free_msg_list(expected_0); test_rpc_free_msg_list(expected_1); test_rpc_teardown_second_session(); test_rpc_teardown(); } MU_TEST(test_rpc_multisession_storage) { MsgList_t input_0; MsgList_init(input_0); MsgList_t input_1; MsgList_init(input_1); MsgList_t expected_0; MsgList_init(expected_0); MsgList_t expected_1; MsgList_init(expected_1); test_rpc_storage_setup(); test_rpc_setup_second_session(); uint8_t pattern[16] = "0123456789abcdef"; test_rpc_add_read_or_write_to_list( input_0, WRITE_REQUEST, TEST_DIR "file0.txt", pattern, sizeof(pattern), 1, ++command_id); test_rpc_add_empty_to_list(expected_0, PB_CommandStatus_OK, command_id); test_rpc_add_read_or_write_to_list( input_1, WRITE_REQUEST, TEST_DIR "file1.txt", pattern, sizeof(pattern), 1, ++command_id); test_rpc_add_empty_to_list(expected_1, PB_CommandStatus_OK, command_id); test_rpc_create_simple_message( MsgList_push_raw(input_0), PB_Main_storage_read_request_tag, TEST_DIR "file0.txt", ++command_id); test_rpc_add_read_or_write_to_list( expected_0, READ_RESPONSE, TEST_DIR "file0.txt", pattern, sizeof(pattern), 1, command_id); test_rpc_create_simple_message( MsgList_push_raw(input_1), PB_Main_storage_read_request_tag, TEST_DIR "file1.txt", ++command_id); test_rpc_add_read_or_write_to_list( expected_1, READ_RESPONSE, TEST_DIR "file1.txt", pattern, sizeof(pattern), 1, command_id); test_rpc_print_message_list(input_0); test_rpc_print_message_list(input_1); test_rpc_print_message_list(expected_0); test_rpc_print_message_list(expected_1); test_rpc_encode_and_feed(input_0, 0); test_rpc_encode_and_feed(input_1, 1); test_rpc_decode_and_compare(expected_0, 0); test_rpc_decode_and_compare(expected_1, 1); test_rpc_free_msg_list(input_0); test_rpc_free_msg_list(input_1); test_rpc_free_msg_list(expected_0); test_rpc_free_msg_list(expected_1); test_rpc_teardown_second_session(); test_rpc_storage_teardown(); } MU_TEST_SUITE(test_rpc_session) { MU_RUN_TEST(test_rpc_feed_rubbish); MU_RUN_TEST(test_rpc_multisession_ping); Storage* storage = furi_record_open(RECORD_STORAGE); if(storage_sd_status(storage) != FSE_OK) { FURI_LOG_E(TAG, "SD card not mounted - skip storage tests"); } else { MU_RUN_TEST(test_rpc_multisession_storage); } furi_record_close(RECORD_STORAGE); } int run_minunit_test_rpc(void) { Storage* storage = furi_record_open(RECORD_STORAGE); if(storage_sd_status(storage) != FSE_OK) { FURI_LOG_E(TAG, "SD card not mounted - skip storage tests"); } else { MU_RUN_SUITE(test_rpc_storage); } furi_record_close(RECORD_STORAGE); MU_RUN_SUITE(test_rpc_system); MU_RUN_SUITE(test_rpc_app); MU_RUN_SUITE(test_rpc_session); return MU_EXIT_CODE; } int32_t delay_test_app(void* p) { int timeout = atoi((const char*)p); if(timeout > 0) { furi_delay_ms(timeout); } return 0; } TEST_API_DEFINE(run_minunit_test_rpc) ================================================ FILE: applications/debug/unit_tests/tests/storage/storage_test.c ================================================ #include "../test.h" // IWYU pragma: keep #include #include // DO NOT USE THIS IN PRODUCTION CODE // This is a hack to access internal storage functions and definitions #include #define UNIT_TESTS_RESOURCES_PATH(path) EXT_PATH("unit_tests/" path) #define UNIT_TESTS_PATH(path) EXT_PATH(".tmp/unit_tests/" path) #define STORAGE_LOCKED_FILE UNIT_TESTS_PATH("locked_file.test") #define STORAGE_LOCKED_DIR STORAGE_INT_PATH_PREFIX #define STORAGE_TEST_DIR UNIT_TESTS_PATH("test_dir") static bool storage_file_create(Storage* storage, const char* path, const char* data) { File* file = storage_file_alloc(storage); bool result = false; do { if(!storage_file_open(file, path, FSAM_WRITE, FSOM_CREATE_NEW)) { break; } if(storage_file_write(file, data, strlen(data)) != strlen(data)) { break; } if(!storage_file_close(file)) { break; } result = true; } while(0); storage_file_free(file); return result; } static void storage_file_open_lock_setup(void) { Storage* storage = furi_record_open(RECORD_STORAGE); File* file = storage_file_alloc(storage); storage_simply_remove(storage, STORAGE_LOCKED_FILE); mu_check(storage_file_open(file, STORAGE_LOCKED_FILE, FSAM_WRITE, FSOM_CREATE_NEW)); mu_check(storage_file_write(file, "0123", 4) == 4); mu_check(storage_file_close(file)); storage_file_free(file); furi_record_close(RECORD_STORAGE); } static void storage_file_open_lock_teardown(void) { Storage* storage = furi_record_open(RECORD_STORAGE); mu_check(storage_simply_remove(storage, STORAGE_LOCKED_FILE)); furi_record_close(RECORD_STORAGE); } static int32_t storage_file_locker(void* ctx) { Storage* storage = furi_record_open(RECORD_STORAGE); FuriSemaphore* semaphore = ctx; File* file = storage_file_alloc(storage); furi_check(storage_file_open(file, STORAGE_LOCKED_FILE, FSAM_READ_WRITE, FSOM_OPEN_EXISTING)); furi_semaphore_release(semaphore); furi_delay_ms(1000); furi_check(storage_file_close(file)); furi_record_close(RECORD_STORAGE); storage_file_free(file); return 0; } MU_TEST(storage_file_open_lock) { Storage* storage = furi_record_open(RECORD_STORAGE); bool result = false; FuriSemaphore* semaphore = furi_semaphore_alloc(1, 0); File* file = storage_file_alloc(storage); // file_locker thread start FuriThread* locker_thread = furi_thread_alloc_ex("StorageFileLocker", 2048, storage_file_locker, semaphore); furi_thread_start(locker_thread); // wait for file lock furi_semaphore_acquire(semaphore, FuriWaitForever); furi_semaphore_free(semaphore); result = storage_file_open(file, STORAGE_LOCKED_FILE, FSAM_READ_WRITE, FSOM_OPEN_EXISTING); storage_file_close(file); // file_locker thread stop mu_check(furi_thread_join(locker_thread)); furi_thread_free(locker_thread); // clean data storage_file_free(file); furi_record_close(RECORD_STORAGE); mu_assert(result, "cannot open locked file"); } MU_TEST(storage_file_open_close) { Storage* storage = furi_record_open(RECORD_STORAGE); File* file; file = storage_file_alloc(storage); mu_check(storage_file_open(file, STORAGE_LOCKED_FILE, FSAM_READ_WRITE, FSOM_OPEN_EXISTING)); storage_file_close(file); storage_file_free(file); for(size_t i = 0; i < 10; i++) { file = storage_file_alloc(storage); mu_check( storage_file_open(file, STORAGE_LOCKED_FILE, FSAM_READ_WRITE, FSOM_OPEN_EXISTING)); storage_file_free(file); } furi_record_close(RECORD_STORAGE); } static bool storage_file_read_write_test(File* file, uint8_t* data, size_t test_size) { const char* filename = UNIT_TESTS_PATH("storage_chunk.test"); // fill with pattern for(size_t i = 0; i < test_size; i++) { data[i] = (i % 113); } bool result = false; do { if(!storage_file_open(file, filename, FSAM_WRITE, FSOM_CREATE_ALWAYS)) break; if(test_size != storage_file_write(file, data, test_size)) break; storage_file_close(file); // reset data memset(data, 0, test_size); if(!storage_file_open(file, filename, FSAM_READ, FSOM_OPEN_EXISTING)) break; if(test_size != storage_file_read(file, data, test_size)) break; storage_file_close(file); // check that data is correct for(size_t i = 0; i < test_size; i++) { if(data[i] != (i % 113)) { break; } } result = true; } while(false); return result; } MU_TEST(storage_file_read_write_64k) { Storage* storage = furi_record_open(RECORD_STORAGE); File* file = storage_file_alloc(storage); size_t size_1k = 1024; size_t size_64k = size_1k + size_1k * 63; size_t size_65k = size_64k + size_1k; size_t size_max = size_65k + 8; size_t max_ram_block = memmgr_heap_get_max_free_block(); if(max_ram_block < size_max) { mu_warn("Not enough RAM for >64k block test"); } else { uint8_t* data = malloc(size_max); mu_check(storage_file_read_write_test(file, data, size_1k)); mu_check(storage_file_read_write_test(file, data, size_64k)); mu_check(storage_file_read_write_test(file, data, size_65k)); mu_check(storage_file_read_write_test(file, data, size_max)); free(data); } storage_file_free(file); furi_record_close(RECORD_STORAGE); } MU_TEST_SUITE(storage_file) { storage_file_open_lock_setup(); MU_RUN_TEST(storage_file_open_close); MU_RUN_TEST(storage_file_open_lock); storage_file_open_lock_teardown(); } MU_TEST_SUITE(storage_file_64k) { MU_RUN_TEST(storage_file_read_write_64k); } MU_TEST(storage_dir_open_close) { Storage* storage = furi_record_open(RECORD_STORAGE); File* file; file = storage_file_alloc(storage); mu_check(storage_dir_open(file, STORAGE_LOCKED_DIR)); storage_dir_close(file); storage_file_free(file); for(size_t i = 0; i < 10; i++) { file = storage_file_alloc(storage); mu_check(storage_dir_open(file, STORAGE_LOCKED_DIR)); storage_file_free(file); } furi_record_close(RECORD_STORAGE); } static int32_t storage_dir_locker(void* ctx) { Storage* storage = furi_record_open(RECORD_STORAGE); FuriSemaphore* semaphore = ctx; File* file = storage_file_alloc(storage); furi_check(storage_dir_open(file, STORAGE_LOCKED_DIR)); furi_semaphore_release(semaphore); furi_delay_ms(100); furi_check(storage_dir_close(file)); furi_record_close(RECORD_STORAGE); storage_file_free(file); return 0; } MU_TEST(storage_dir_open_lock) { Storage* storage = furi_record_open(RECORD_STORAGE); bool result = false; FuriSemaphore* semaphore = furi_semaphore_alloc(1, 0); File* file = storage_file_alloc(storage); // file_locker thread start FuriThread* locker_thread = furi_thread_alloc_ex("StorageDirLocker", 2048, storage_dir_locker, semaphore); furi_thread_start(locker_thread); // wait for dir lock furi_semaphore_acquire(semaphore, FuriWaitForever); furi_semaphore_free(semaphore); result = storage_dir_open(file, STORAGE_LOCKED_DIR); storage_dir_close(file); // file_locker thread stop mu_check(furi_thread_join(locker_thread)); furi_thread_free(locker_thread); // clean data storage_file_free(file); furi_record_close(RECORD_STORAGE); mu_assert(result, "cannot open locked dir"); } MU_TEST(storage_dir_exists_test) { Storage* storage = furi_record_open(RECORD_STORAGE); mu_check(!storage_dir_exists(storage, STORAGE_TEST_DIR)); mu_assert_int_eq(FSE_OK, storage_common_mkdir(storage, STORAGE_TEST_DIR)); mu_check(storage_dir_exists(storage, STORAGE_TEST_DIR)); mu_assert_int_eq(FSE_OK, storage_common_remove(storage, STORAGE_TEST_DIR)); furi_record_close(RECORD_STORAGE); } MU_TEST_SUITE(storage_dir) { MU_RUN_TEST(storage_dir_open_close); MU_RUN_TEST(storage_dir_open_lock); MU_RUN_TEST(storage_dir_exists_test); } static const char* const storage_copy_test_paths[] = { "1", "11", "111", "1/2", "1/22", "1/222", "11/1", "111/2", "111/22", "111/22/33", }; static const char* const storage_copy_test_files[] = { "file.test", "1/file.test", "111/22/33/file.test", }; static bool write_file_13DA(Storage* storage, const char* path) { File* file = storage_file_alloc(storage); bool result = false; if(storage_file_open(file, path, FSAM_WRITE, FSOM_CREATE_ALWAYS)) { result = storage_file_write(file, "13DA", 4) == 4; } storage_file_close(file); storage_file_free(file); return result; } static bool check_file_13DA(Storage* storage, const char* path) { File* file = storage_file_alloc(storage); bool result = false; if(storage_file_open(file, path, FSAM_READ, FSOM_OPEN_EXISTING)) { char data[10] = {0}; result = storage_file_read(file, data, 4) == 4; if(result) { result = memcmp(data, "13DA", 4) == 0; } } storage_file_close(file); storage_file_free(file); return result; } static void storage_dir_create(Storage* storage, const char* base) { FuriString* path; path = furi_string_alloc(); storage_common_mkdir(storage, base); for(size_t i = 0; i < COUNT_OF(storage_copy_test_paths); i++) { furi_string_printf(path, "%s/%s", base, storage_copy_test_paths[i]); storage_common_mkdir(storage, furi_string_get_cstr(path)); } for(size_t i = 0; i < COUNT_OF(storage_copy_test_files); i++) { furi_string_printf(path, "%s/%s", base, storage_copy_test_files[i]); write_file_13DA(storage, furi_string_get_cstr(path)); } furi_string_free(path); } static void storage_dir_remove(Storage* storage, const char* base) { storage_simply_remove_recursive(storage, base); } static bool storage_dir_rename_check(Storage* storage, const char* base) { bool result = false; FuriString* path; path = furi_string_alloc(); result = (storage_common_stat(storage, base, NULL) == FSE_OK); if(result) { for(size_t i = 0; i < COUNT_OF(storage_copy_test_paths); i++) { furi_string_printf(path, "%s/%s", base, storage_copy_test_paths[i]); result = (storage_common_stat(storage, furi_string_get_cstr(path), NULL) == FSE_OK); if(!result) { break; } } } if(result) { for(size_t i = 0; i < COUNT_OF(storage_copy_test_files); i++) { furi_string_printf(path, "%s/%s", base, storage_copy_test_files[i]); result = check_file_13DA(storage, furi_string_get_cstr(path)); if(!result) { break; } } } furi_string_free(path); return result; } MU_TEST(storage_file_rename) { Storage* storage = furi_record_open(RECORD_STORAGE); File* file = storage_file_alloc(storage); mu_check(write_file_13DA(storage, UNIT_TESTS_PATH("file.old"))); mu_check(check_file_13DA(storage, UNIT_TESTS_PATH("file.old"))); mu_assert_int_eq( FSE_OK, storage_common_rename(storage, UNIT_TESTS_PATH("file.old"), UNIT_TESTS_PATH("file.new"))); mu_assert_int_eq( FSE_NOT_EXIST, storage_common_stat(storage, UNIT_TESTS_PATH("file.old"), NULL)); mu_assert_int_eq(FSE_OK, storage_common_stat(storage, UNIT_TESTS_PATH("file.new"), NULL)); mu_check(check_file_13DA(storage, UNIT_TESTS_PATH("file.new"))); mu_assert_int_eq(FSE_OK, storage_common_remove(storage, UNIT_TESTS_PATH("file.new"))); storage_file_free(file); furi_record_close(RECORD_STORAGE); } static const char* dir_rename_tests[][2] = { {UNIT_TESTS_PATH("dir.old"), UNIT_TESTS_PATH("dir.new")}, {UNIT_TESTS_PATH("test_dir"), UNIT_TESTS_PATH("test_dir-new")}, {UNIT_TESTS_PATH("test"), UNIT_TESTS_PATH("test-test")}, }; MU_TEST(storage_dir_rename) { Storage* storage = furi_record_open(RECORD_STORAGE); for(size_t i = 0; i < COUNT_OF(dir_rename_tests); i++) { const char* old_path = dir_rename_tests[i][0]; const char* new_path = dir_rename_tests[i][1]; storage_dir_create(storage, old_path); mu_check(storage_dir_rename_check(storage, old_path)); mu_assert_int_eq(FSE_OK, storage_common_rename(storage, old_path, new_path)); mu_assert_int_eq(FSE_NOT_EXIST, storage_common_stat(storage, old_path, NULL)); mu_check(storage_dir_rename_check(storage, new_path)); storage_dir_remove(storage, new_path); mu_assert_int_eq(FSE_NOT_EXIST, storage_common_stat(storage, new_path, NULL)); } furi_record_close(RECORD_STORAGE); } MU_TEST(storage_equiv_and_subdir) { Storage* storage = furi_record_open(RECORD_STORAGE); mu_assert_int_eq( true, storage_common_equivalent_path(storage, UNIT_TESTS_PATH("blah"), UNIT_TESTS_PATH("blah"))); mu_assert_int_eq( true, storage_common_equivalent_path( storage, UNIT_TESTS_PATH("blah/"), UNIT_TESTS_PATH("blah/"))); mu_assert_int_eq( false, storage_common_equivalent_path( storage, UNIT_TESTS_PATH("blah"), UNIT_TESTS_PATH("blah-blah"))); mu_assert_int_eq( false, storage_common_equivalent_path( storage, UNIT_TESTS_PATH("blah/"), UNIT_TESTS_PATH("blah-blah/"))); mu_assert_int_eq( true, storage_common_is_subdir(storage, UNIT_TESTS_PATH("blah"), UNIT_TESTS_PATH("blah"))); mu_assert_int_eq( true, storage_common_is_subdir(storage, UNIT_TESTS_PATH("blah"), UNIT_TESTS_PATH("blah/blah"))); mu_assert_int_eq( false, storage_common_is_subdir(storage, UNIT_TESTS_PATH("blah/blah"), UNIT_TESTS_PATH("blah"))); mu_assert_int_eq( false, storage_common_is_subdir(storage, UNIT_TESTS_PATH("blah"), UNIT_TESTS_PATH("blah-blah"))); furi_record_close(RECORD_STORAGE); } MU_TEST_SUITE(storage_rename) { MU_RUN_TEST(storage_file_rename); MU_RUN_TEST(storage_dir_rename); MU_RUN_TEST(storage_equiv_and_subdir); Storage* storage = furi_record_open(RECORD_STORAGE); for(size_t i = 0; i < COUNT_OF(dir_rename_tests); i++) { storage_dir_remove(storage, dir_rename_tests[i][0]); storage_dir_remove(storage, dir_rename_tests[i][1]); } furi_record_close(RECORD_STORAGE); } #define APPSDATA_APP_PATH(path) APPS_DATA_PATH "/" path static const char* storage_test_apps[] = { "-_twilight_-", "-_rainbow_-", "-_pinkie_-", "-_apple_-", "-_flutter_-", "-_rare_-", }; 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, "/data/test"); int32_t ret = storage_file_create(storage, "/data/test", "test"); furi_record_close(RECORD_STORAGE); return ret; } MU_TEST(test_storage_data_path_apps) { for(size_t i = 0; i < storage_test_apps_count; i++) { FuriThread* thread = furi_thread_alloc_ex(storage_test_apps[i], 1024, storage_test_app, NULL); furi_thread_set_appid(thread, storage_test_apps[i]); furi_thread_start(thread); furi_thread_join(thread); mu_assert_int_eq(true, furi_thread_get_return_code(thread)); // Check if app data dir and file exists Storage* storage = furi_record_open(RECORD_STORAGE); FuriString* expected = furi_string_alloc(); furi_string_printf(expected, APPSDATA_APP_PATH("%s"), storage_test_apps[i]); mu_check(storage_dir_exists(storage, furi_string_get_cstr(expected))); furi_string_cat(expected, "/test"); mu_check(storage_file_exists(storage, furi_string_get_cstr(expected))); furi_string_printf(expected, APPSDATA_APP_PATH("%s"), storage_test_apps[i]); storage_simply_remove_recursive(storage, furi_string_get_cstr(expected)); furi_record_close(RECORD_STORAGE); furi_string_free(expected); furi_thread_free(thread); } } 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, "/data")); mu_check(storage_dir_close(file)); storage_file_free(file); // check that appsdata folder exists mu_check(storage_dir_exists(storage, APPS_DATA_PATH)); furi_record_close(RECORD_STORAGE); } MU_TEST(test_storage_common_migrate) { Storage* storage = furi_record_open(RECORD_STORAGE); // Setup test folders storage_simply_remove_recursive(storage, UNIT_TESTS_PATH("migrate_old")); storage_simply_remove_recursive(storage, UNIT_TESTS_PATH("migrate_new")); // Test migration from non existing mu_assert_int_eq( FSE_OK, storage_common_migrate( storage, UNIT_TESTS_PATH("migrate_old"), UNIT_TESTS_PATH("migrate_new"))); // Test migration from existing folder to non existing mu_assert_int_eq(FSE_OK, storage_common_mkdir(storage, UNIT_TESTS_PATH("migrate_old"))); mu_check(storage_file_create(storage, UNIT_TESTS_PATH("migrate_old/file1"), "test1")); mu_check(storage_file_create(storage, UNIT_TESTS_PATH("migrate_old/file2.ext"), "test2")); mu_check(storage_file_create(storage, UNIT_TESTS_PATH("migrate_old/file3.ext.ext"), "test3")); mu_assert_int_eq( FSE_OK, storage_common_migrate( storage, UNIT_TESTS_PATH("migrate_old"), UNIT_TESTS_PATH("migrate_new"))); mu_check(storage_file_exists(storage, UNIT_TESTS_PATH("migrate_new/file1"))); mu_check(storage_file_exists(storage, UNIT_TESTS_PATH("migrate_new/file2.ext"))); mu_check(storage_file_exists(storage, UNIT_TESTS_PATH("migrate_new/file3.ext.ext"))); mu_check(storage_dir_exists(storage, UNIT_TESTS_PATH("migrate_new"))); mu_check(!storage_dir_exists(storage, UNIT_TESTS_PATH("migrate_old"))); // Test migration from existing folder to existing folder mu_assert_int_eq(FSE_OK, storage_common_mkdir(storage, UNIT_TESTS_PATH("migrate_old"))); mu_check(storage_file_create(storage, UNIT_TESTS_PATH("migrate_old/file1"), "test1")); mu_check(storage_file_create(storage, UNIT_TESTS_PATH("migrate_old/file2.ext"), "test2")); mu_check(storage_file_create(storage, UNIT_TESTS_PATH("migrate_old/file3.ext.ext"), "test3")); mu_assert_int_eq( FSE_OK, storage_common_migrate( storage, UNIT_TESTS_PATH("migrate_old"), UNIT_TESTS_PATH("migrate_new"))); mu_check(storage_file_exists(storage, UNIT_TESTS_PATH("migrate_new/file1"))); mu_check(storage_file_exists(storage, UNIT_TESTS_PATH("migrate_new/file2.ext"))); mu_check(storage_file_exists(storage, UNIT_TESTS_PATH("migrate_new/file3.ext.ext"))); mu_check(storage_file_exists(storage, UNIT_TESTS_PATH("migrate_new/file11"))); mu_check(storage_file_exists(storage, UNIT_TESTS_PATH("migrate_new/file21.ext"))); mu_check(storage_file_exists(storage, UNIT_TESTS_PATH("migrate_new/file3.ext1.ext"))); mu_check(storage_dir_exists(storage, UNIT_TESTS_PATH("migrate_new"))); mu_check(!storage_dir_exists(storage, UNIT_TESTS_PATH("migrate_old"))); storage_simply_remove_recursive(storage, UNIT_TESTS_PATH("migrate_old")); storage_simply_remove_recursive(storage, UNIT_TESTS_PATH("migrate_new")); // Test migration from empty folder to existing file // Expected result: FSE_OK, folder removed, file untouched mu_assert_int_eq(FSE_OK, storage_common_mkdir(storage, UNIT_TESTS_PATH("migrate_old"))); mu_check(storage_file_create(storage, UNIT_TESTS_PATH("migrate_new"), "test1")); mu_assert_int_eq( FSE_OK, storage_common_migrate( storage, UNIT_TESTS_PATH("migrate_old"), UNIT_TESTS_PATH("migrate_new"))); mu_check(storage_file_exists(storage, UNIT_TESTS_PATH("migrate_new"))); mu_check(!storage_dir_exists(storage, UNIT_TESTS_PATH("migrate_old"))); storage_simply_remove_recursive(storage, UNIT_TESTS_PATH("migrate_old")); storage_simply_remove_recursive(storage, UNIT_TESTS_PATH("migrate_new")); // Test migration from empty folder to existing folder // Expected result: FSE_OK, old folder removed, new folder untouched mu_assert_int_eq(FSE_OK, storage_common_mkdir(storage, UNIT_TESTS_PATH("migrate_old"))); mu_assert_int_eq(FSE_OK, storage_common_mkdir(storage, UNIT_TESTS_PATH("migrate_new"))); mu_assert_int_eq( FSE_OK, storage_common_migrate( storage, UNIT_TESTS_PATH("migrate_old"), UNIT_TESTS_PATH("migrate_new"))); mu_check(storage_dir_exists(storage, UNIT_TESTS_PATH("migrate_new"))); mu_check(!storage_dir_exists(storage, UNIT_TESTS_PATH("migrate_old"))); storage_simply_remove_recursive(storage, UNIT_TESTS_PATH("migrate_old")); storage_simply_remove_recursive(storage, UNIT_TESTS_PATH("migrate_new")); // Test migration from existing file to non existing, no extension mu_check(storage_file_create(storage, UNIT_TESTS_PATH("migrate_old"), "test1")); mu_assert_int_eq( FSE_OK, storage_common_migrate( storage, UNIT_TESTS_PATH("migrate_old"), UNIT_TESTS_PATH("migrate_new"))); mu_check(storage_file_exists(storage, UNIT_TESTS_PATH("migrate_new"))); mu_check(!storage_file_exists(storage, UNIT_TESTS_PATH("migrate_old"))); storage_simply_remove_recursive(storage, UNIT_TESTS_PATH("migrate_old")); storage_simply_remove_recursive(storage, UNIT_TESTS_PATH("migrate_new")); // Test migration from existing file to non existing, with extension mu_check(storage_file_create(storage, UNIT_TESTS_PATH("migrate_old.file"), "test1")); mu_assert_int_eq( FSE_OK, storage_common_migrate( storage, UNIT_TESTS_PATH("migrate_old.file"), UNIT_TESTS_PATH("migrate_new.file"))); mu_check(storage_file_exists(storage, UNIT_TESTS_PATH("migrate_new.file"))); mu_check(!storage_file_exists(storage, UNIT_TESTS_PATH("migrate_old.file"))); storage_simply_remove_recursive(storage, UNIT_TESTS_PATH("migrate_old.file")); storage_simply_remove_recursive(storage, UNIT_TESTS_PATH("migrate_new.file")); // Test migration from existing file to existing file, no extension mu_check(storage_file_create(storage, UNIT_TESTS_PATH("migrate_old"), "test1")); mu_check(storage_file_create(storage, UNIT_TESTS_PATH("migrate_new"), "test2")); mu_assert_int_eq( FSE_OK, storage_common_migrate( storage, UNIT_TESTS_PATH("migrate_old"), UNIT_TESTS_PATH("migrate_new"))); mu_check(storage_file_exists(storage, UNIT_TESTS_PATH("migrate_new"))); mu_check(!storage_file_exists(storage, UNIT_TESTS_PATH("migrate_old"))); mu_check(storage_file_exists(storage, UNIT_TESTS_PATH("migrate_new1"))); storage_simply_remove_recursive(storage, UNIT_TESTS_PATH("migrate_old")); storage_simply_remove_recursive(storage, UNIT_TESTS_PATH("migrate_new")); storage_simply_remove_recursive(storage, UNIT_TESTS_PATH("migrate_new1")); // Test migration from existing file to existing file, with extension mu_check(storage_file_create(storage, UNIT_TESTS_PATH("migrate_old.file"), "test1")); mu_check(storage_file_create(storage, UNIT_TESTS_PATH("migrate_new.file"), "test2")); mu_assert_int_eq( FSE_OK, storage_common_migrate( storage, UNIT_TESTS_PATH("migrate_old.file"), UNIT_TESTS_PATH("migrate_new.file"))); mu_check(storage_file_exists(storage, UNIT_TESTS_PATH("migrate_new.file"))); mu_check(!storage_file_exists(storage, UNIT_TESTS_PATH("migrate_old.file"))); mu_check(storage_file_exists(storage, UNIT_TESTS_PATH("migrate_new1.file"))); storage_simply_remove_recursive(storage, UNIT_TESTS_PATH("migrate_old.file")); storage_simply_remove_recursive(storage, UNIT_TESTS_PATH("migrate_new.file")); storage_simply_remove_recursive(storage, UNIT_TESTS_PATH("migrate_new1.file")); // Test migration from existing file to existing folder mu_check(storage_file_create(storage, UNIT_TESTS_PATH("migrate_old"), "test1")); mu_assert_int_eq(FSE_OK, storage_common_mkdir(storage, UNIT_TESTS_PATH("migrate_new"))); mu_assert_int_eq( FSE_OK, storage_common_migrate( storage, UNIT_TESTS_PATH("migrate_old"), UNIT_TESTS_PATH("migrate_new"))); mu_check(storage_dir_exists(storage, UNIT_TESTS_PATH("migrate_new"))); mu_check(!storage_file_exists(storage, UNIT_TESTS_PATH("migrate_old"))); mu_check(storage_file_exists(storage, UNIT_TESTS_PATH("migrate_new1"))); storage_simply_remove_recursive(storage, UNIT_TESTS_PATH("migrate_old")); storage_simply_remove_recursive(storage, UNIT_TESTS_PATH("migrate_new")); storage_simply_remove_recursive(storage, UNIT_TESTS_PATH("migrate_new1")); furi_record_close(RECORD_STORAGE); } #define MD5_HASH_SIZE (16) #include MU_TEST(test_md5_calc) { Storage* storage = furi_record_open(RECORD_STORAGE); File* file = storage_file_alloc(storage); const char* path = UNIT_TESTS_RESOURCES_PATH("storage/md5.txt"); const char* md5_cstr = "2a456fa43e75088fdde41c93159d62a2"; const uint8_t md5[MD5_HASH_SIZE] = { 0x2a, 0x45, 0x6f, 0xa4, 0x3e, 0x75, 0x08, 0x8f, 0xdd, 0xe4, 0x1c, 0x93, 0x15, 0x9d, 0x62, 0xa2, }; uint8_t md5_output[MD5_HASH_SIZE]; FuriString* md5_output_str = furi_string_alloc(); memset(md5_output, 0, MD5_HASH_SIZE); mu_check(md5_calc_file(file, path, md5_output, NULL)); mu_check(md5_string_calc_file(file, path, md5_output_str, NULL)); mu_assert_mem_eq(md5, md5_output, MD5_HASH_SIZE); mu_assert_string_eq(md5_cstr, furi_string_get_cstr(md5_output_str)); storage_file_free(file); furi_string_free(md5_output_str); furi_record_close(RECORD_STORAGE); } MU_TEST_SUITE(test_data_path) { MU_RUN_TEST(test_storage_data_path); MU_RUN_TEST(test_storage_data_path_apps); } MU_TEST_SUITE(test_storage_common) { MU_RUN_TEST(test_storage_common_migrate); } MU_TEST_SUITE(test_md5_calc_suite) { MU_RUN_TEST(test_md5_calc); } int run_minunit_test_storage(void) { MU_RUN_SUITE(storage_file); MU_RUN_SUITE(storage_file_64k); MU_RUN_SUITE(storage_dir); MU_RUN_SUITE(storage_rename); MU_RUN_SUITE(test_data_path); MU_RUN_SUITE(test_storage_common); MU_RUN_SUITE(test_md5_calc_suite); return MU_EXIT_CODE; } TEST_API_DEFINE(run_minunit_test_storage) ================================================ FILE: applications/debug/unit_tests/tests/stream/stream_test.c ================================================ #include #include #include #include #include #include #include "../test.h" // IWYU pragma: keep static const char* stream_test_data = "I write differently from what I speak, " "I speak differently from what I think, " "I think differently from the way I ought to think, " "and so it all proceeds into deepest darkness."; static const char* stream_test_left_data = "There are two cardinal human sins "; static const char* stream_test_right_data = "from which all others derive: impatience and indolence."; #define FILESTREAM_PATH EXT_PATH(".tmp/unit_tests/filestream.str") MU_TEST_1(stream_composite_subtest, Stream* stream) { const size_t data_size = 128; uint8_t data[data_size]; FuriString* string_lee; string_lee = furi_string_alloc_set("lee"); // test that stream is empty // "" -> "" mu_check(stream_size(stream) == 0); mu_check(stream_eof(stream)); mu_check(stream_tell(stream) == 0); mu_check(stream_read(stream, data, data_size) == 0); mu_check(stream_eof(stream)); mu_check(stream_tell(stream) == 0); // write char // "" -> "2" mu_check(stream_write_char(stream, '2') == 1); mu_check(stream_size(stream) == 1); mu_check(stream_tell(stream) == 1); mu_check(stream_eof(stream)); // test rewind and eof stream_rewind(stream); mu_check(stream_size(stream) == 1); mu_check(stream_tell(stream) == 0); mu_check(!stream_eof(stream)); // add another char with replacement // "2" -> "1" mu_check(stream_write_char(stream, '1') == 1); mu_check(stream_size(stream) == 1); mu_check(stream_tell(stream) == 1); mu_check(stream_eof(stream)); // write string // "1" -> "1337_69" mu_check(stream_write_cstring(stream, "337_69") == 6); mu_check(stream_size(stream) == 7); mu_check(stream_tell(stream) == 7); mu_check(stream_eof(stream)); // read data memset(data, 0, data_size); stream_rewind(stream); mu_check(stream_read(stream, data, data_size) == 7); mu_check(strcmp((char*)data, "1337_69") == 0); // test misc seeks mu_check(stream_seek(stream, 2, StreamOffsetFromStart)); mu_check(stream_tell(stream) == 2); mu_check(!stream_seek(stream, 9000, StreamOffsetFromStart)); mu_check(stream_tell(stream) == 7); mu_check(stream_eof(stream)); mu_check(stream_seek(stream, -3, StreamOffsetFromEnd)); mu_check(stream_tell(stream) == 4); // test seeks to char. content: '1337_69' stream_rewind(stream); mu_check(stream_seek_to_char(stream, '3', StreamDirectionForward)); mu_check(stream_tell(stream) == 1); mu_check(stream_seek_to_char(stream, '3', StreamDirectionForward)); mu_check(stream_tell(stream) == 2); mu_check(stream_seek_to_char(stream, '_', StreamDirectionForward)); mu_check(stream_tell(stream) == 4); mu_check(stream_seek_to_char(stream, '9', StreamDirectionForward)); mu_check(stream_tell(stream) == 6); mu_check(!stream_seek_to_char(stream, '9', StreamDirectionForward)); mu_check(stream_tell(stream) == 6); mu_check(stream_seek_to_char(stream, '_', StreamDirectionBackward)); mu_check(stream_tell(stream) == 4); mu_check(stream_seek_to_char(stream, '3', StreamDirectionBackward)); mu_check(stream_tell(stream) == 2); mu_check(stream_seek_to_char(stream, '3', StreamDirectionBackward)); mu_check(stream_tell(stream) == 1); mu_check(!stream_seek_to_char(stream, '3', StreamDirectionBackward)); mu_check(stream_tell(stream) == 1); mu_check(stream_seek_to_char(stream, '1', StreamDirectionBackward)); mu_check(stream_tell(stream) == 0); // write string with replacement // "1337_69" -> "1337lee" mu_check(stream_seek(stream, 4, StreamOffsetFromStart)); mu_check(stream_write_string(stream, string_lee) == 3); mu_check(stream_size(stream) == 7); mu_check(stream_tell(stream) == 7); mu_check(stream_eof(stream)); // append char // "1337lee" -> "1337leet" mu_check(stream_write(stream, (uint8_t*)"t", 1) == 1); mu_check(stream_size(stream) == 8); mu_check(stream_tell(stream) == 8); mu_check(stream_eof(stream)); // read data memset(data, 0, data_size); stream_rewind(stream); mu_check(stream_read(stream, data, data_size) == 8); mu_check(strcmp((char*)data, "1337leet") == 0); mu_check(stream_tell(stream) == 8); mu_check(stream_eof(stream)); // negative seek from current position -> clamp to 0 mu_check(!stream_seek(stream, -9000, StreamOffsetFromCurrent)); mu_check(stream_tell(stream) == 0); // negative seek from start position -> clamp to 0 stream_rewind(stream); mu_check(!stream_seek(stream, -3, StreamOffsetFromStart)); mu_check(stream_tell(stream) == 0); // zero seek from current position -> clamp to stream size mu_check(stream_seek(stream, 0, StreamOffsetFromEnd)); mu_check(stream_tell(stream) == 8); // negative seek from end position -> clamp to 0 mu_check(!stream_seek(stream, -9000, StreamOffsetFromEnd)); mu_check(stream_tell(stream) == 0); // clean stream stream_clean(stream); mu_check(stream_size(stream) == 0); mu_check(stream_eof(stream)); mu_check(stream_tell(stream) == 0); // write format // "" -> "dio666" mu_check(stream_write_format(stream, "%s%d", "dio", 666) == 6); mu_check(stream_size(stream) == 6); mu_check(stream_eof(stream)); mu_check(stream_tell(stream) == 6); // read data memset(data, 0, data_size); stream_rewind(stream); mu_check(stream_read(stream, data, data_size) == 6); mu_check(strcmp((char*)data, "dio666") == 0); // clean and write cstring // "dio666" -> "" -> "1234567890" stream_clean(stream); mu_check(stream_write_cstring(stream, "1234567890") == 10); // delete 4 bytes from 1 pos // "1xxxx67890" -> "167890" mu_check(stream_seek(stream, 1, StreamOffsetFromStart)); mu_check(stream_delete(stream, 4)); mu_assert_int_eq(6, stream_size(stream)); // read data memset(data, 0, data_size); stream_rewind(stream); mu_assert_int_eq(6, stream_read(stream, data, data_size)); mu_check(strcmp((char*)data, "167890") == 0); // write cstring // "167890" -> "167890It Was Me, Dio!" mu_check(stream_write_cstring(stream, "It Was Me, Dio!") == 15); // delete 1337 bytes from 1 pos // and check that we can delete only 20 bytes // "1xxxxxxxxxxxxxxxxxxxx" -> "1" mu_check(stream_seek(stream, 1, StreamOffsetFromStart)); mu_check(stream_delete(stream, 1337)); mu_assert_int_eq(1, stream_size(stream)); // read data memset(data, 0, data_size); stream_rewind(stream); mu_check(stream_read(stream, data, data_size) == 1); mu_check(strcmp((char*)data, "1") == 0); // write cstring from 0 pos, replacing 1 byte // "1" -> "Oh? You're roaching me?" mu_check(stream_rewind(stream)); mu_assert_int_eq(23, stream_write_cstring(stream, "Oh? You're roaching me?")); // insert 11 bytes to 0 pos // "Oh? You're roaching me?" -> "Za Warudo! Oh? You're roaching me?" mu_check(stream_rewind(stream)); mu_check(stream_insert(stream, (uint8_t*)"Za Warudo! ", 11)); mu_assert_int_eq(34, stream_size(stream)); // read data memset(data, 0, data_size); stream_rewind(stream); mu_assert_int_eq(34, stream_read(stream, data, data_size)); mu_assert_string_eq("Za Warudo! Oh? You're roaching me?", (char*)data); // insert cstring to 22 pos // "Za Warudo! Oh? You're roaching me?" -> "Za Warudo! Oh? You're approaching me?" mu_check(stream_seek(stream, 22, StreamOffsetFromStart)); mu_check(stream_insert_cstring(stream, "app")); mu_assert_int_eq(37, stream_size(stream)); // read data memset(data, 0, data_size); stream_rewind(stream); mu_assert_int_eq(37, stream_read(stream, data, data_size)); mu_assert_string_eq("Za Warudo! Oh? You're approaching me?", (char*)data); // insert cstring to the end of the stream // "Za Warudo! Oh? You're approaching me?" -> "Za Warudo! Oh? You're approaching me? It was me, Dio!" mu_check(stream_seek(stream, 0, StreamOffsetFromEnd)); mu_check(stream_insert_cstring(stream, " It was me, Dio!")); mu_assert_int_eq(53, stream_size(stream)); // read data memset(data, 0, data_size); stream_rewind(stream); mu_assert_int_eq(53, stream_read(stream, data, data_size)); mu_assert_string_eq("Za Warudo! Oh? You're approaching me? It was me, Dio!", (char*)data); // delete 168430090 bytes from stream // and test that we can delete only 53 mu_check(stream_rewind(stream)); mu_check(stream_delete(stream, 0x0A0A0A0A)); mu_assert_int_eq(0, stream_size(stream)); mu_check(stream_eof(stream)); mu_assert_int_eq(0, stream_tell(stream)); // clean stream stream_clean(stream); mu_assert_int_eq(0, stream_size(stream)); mu_check(stream_eof(stream)); mu_assert_int_eq(0, stream_tell(stream)); // insert formatted string at the end of stream // "" -> "dio666" mu_check(stream_insert_format(stream, "%s%d", "dio", 666)); mu_assert_int_eq(6, stream_size(stream)); mu_check(stream_eof(stream)); mu_assert_int_eq(6, stream_tell(stream)); // insert formatted string at the end of stream // "dio666" -> "dio666zlo555" mu_check(stream_insert_format(stream, "%s%d", "zlo", 555)); mu_assert_int_eq(12, stream_size(stream)); mu_check(stream_eof(stream)); mu_assert_int_eq(12, stream_tell(stream)); // insert formatted string at the 6 pos // "dio666" -> "dio666baba13zlo555" mu_check(stream_seek(stream, 6, StreamOffsetFromStart)); mu_check(stream_insert_format(stream, "%s%d", "baba", 13)); mu_assert_int_eq(18, stream_size(stream)); mu_assert_int_eq(12, stream_tell(stream)); // read data memset(data, 0, data_size); stream_rewind(stream); mu_assert_int_eq(18, stream_read(stream, data, data_size)); mu_assert_string_eq("dio666baba13zlo555", (char*)data); // delete 6 chars from pos 6 and insert 1 chars // "dio666baba13zlo555" -> "dio666xzlo555" mu_check(stream_seek(stream, 6, StreamOffsetFromStart)); mu_check(stream_delete_and_insert_char(stream, 6, 'x')); mu_assert_int_eq(13, stream_size(stream)); mu_assert_int_eq(7, stream_tell(stream)); // read data memset(data, 0, data_size); stream_rewind(stream); mu_check(stream_read(stream, data, data_size) == 13); mu_assert_string_eq("dio666xzlo555", (char*)data); // delete 9000 chars from pos 6 and insert 3 chars from string // "dio666xzlo555" -> "dio666777" mu_check(stream_seek(stream, 6, StreamOffsetFromStart)); mu_check(stream_delete_and_insert_cstring(stream, 9000, "777")); mu_assert_int_eq(9, stream_size(stream)); mu_assert_int_eq(9, stream_tell(stream)); mu_check(stream_eof(stream)); furi_string_free(string_lee); } MU_TEST(stream_composite_test) { // test string stream Stream* stream; stream = string_stream_alloc(); MU_RUN_TEST_1(stream_composite_subtest, stream); stream_free(stream); // test file stream Storage* storage = furi_record_open(RECORD_STORAGE); stream = file_stream_alloc(storage); mu_check(file_stream_open(stream, FILESTREAM_PATH, FSAM_READ_WRITE, FSOM_CREATE_ALWAYS)); MU_RUN_TEST_1(stream_composite_subtest, stream); stream_free(stream); // test buffered file stream stream = buffered_file_stream_alloc(storage); mu_check( buffered_file_stream_open(stream, FILESTREAM_PATH, FSAM_READ_WRITE, FSOM_CREATE_ALWAYS)); MU_RUN_TEST_1(stream_composite_subtest, stream); stream_free(stream); furi_record_close(RECORD_STORAGE); } MU_TEST_1(stream_write_subtest, Stream* stream) { mu_assert_int_eq(strlen(stream_test_data), stream_write_cstring(stream, stream_test_data)); } MU_TEST_1(stream_read_subtest, Stream* stream) { uint8_t data[256] = {0}; mu_check(stream_rewind(stream)); mu_assert_int_eq(strlen(stream_test_data), stream_read(stream, data, 256)); mu_assert_string_eq(stream_test_data, (const char*)data); } MU_TEST(stream_write_read_save_load_test) { Stream* stream_orig = string_stream_alloc(); Stream* stream_copy = string_stream_alloc(); Storage* storage = furi_record_open(RECORD_STORAGE); // write, read MU_RUN_TEST_1(stream_write_subtest, stream_orig); MU_RUN_TEST_1(stream_read_subtest, stream_orig); // copy, read mu_assert_int_eq(strlen(stream_test_data), stream_copy_full(stream_orig, stream_copy)); MU_RUN_TEST_1(stream_read_subtest, stream_orig); // save to file mu_check(stream_seek(stream_orig, 0, StreamOffsetFromStart)); mu_assert_int_eq( strlen(stream_test_data), stream_save_to_file(stream_orig, storage, FILESTREAM_PATH, FSOM_CREATE_ALWAYS)); stream_free(stream_copy); stream_free(stream_orig); // load from file, read Stream* stream_new = string_stream_alloc(); mu_assert_int_eq( strlen(stream_test_data), stream_load_from_file(stream_new, storage, FILESTREAM_PATH)); MU_RUN_TEST_1(stream_read_subtest, stream_new); stream_free(stream_new); furi_record_close(RECORD_STORAGE); } MU_TEST_1(stream_split_subtest, Stream* stream) { stream_clean(stream); stream_write_cstring(stream, stream_test_left_data); stream_write_cstring(stream, stream_test_right_data); Stream* stream_left = string_stream_alloc(); Stream* stream_right = string_stream_alloc(); mu_check(stream_seek(stream, strlen(stream_test_left_data), StreamOffsetFromStart)); mu_check(stream_split(stream, stream_left, stream_right)); uint8_t data[256] = {0}; mu_check(stream_rewind(stream_left)); mu_assert_int_eq(strlen(stream_test_left_data), stream_read(stream_left, data, 256)); mu_assert_string_eq(stream_test_left_data, (const char*)data); mu_check(stream_rewind(stream_right)); mu_assert_int_eq(strlen(stream_test_right_data), stream_read(stream_right, data, 256)); mu_assert_string_eq(stream_test_right_data, (const char*)data); stream_free(stream_right); stream_free(stream_left); } MU_TEST(stream_split_test) { // test string stream Stream* stream; stream = string_stream_alloc(); MU_RUN_TEST_1(stream_split_subtest, stream); stream_free(stream); // test file stream Storage* storage = furi_record_open(RECORD_STORAGE); stream = file_stream_alloc(storage); mu_check(file_stream_open(stream, FILESTREAM_PATH, FSAM_READ_WRITE, FSOM_CREATE_ALWAYS)); MU_RUN_TEST_1(stream_split_subtest, stream); stream_free(stream); // test buffered stream stream = buffered_file_stream_alloc(storage); mu_check( buffered_file_stream_open(stream, FILESTREAM_PATH, FSAM_READ_WRITE, FSOM_CREATE_ALWAYS)); MU_RUN_TEST_1(stream_split_subtest, stream); stream_free(stream); furi_record_close(RECORD_STORAGE); } MU_TEST(stream_buffered_write_after_read_test) { const char* prefix = "I write "; const char* substr = "Hello there"; const size_t substr_len = strlen(substr); const size_t prefix_len = strlen(prefix); const size_t buf_size = substr_len + 1; char buf[buf_size]; memset(buf, 0, buf_size); Storage* storage = furi_record_open(RECORD_STORAGE); Stream* stream = buffered_file_stream_alloc(storage); mu_check( buffered_file_stream_open(stream, FILESTREAM_PATH, FSAM_READ_WRITE, FSOM_CREATE_ALWAYS)); mu_assert_int_eq(strlen(stream_test_data), stream_write_cstring(stream, stream_test_data)); mu_check(stream_rewind(stream)); mu_assert_int_eq(prefix_len, stream_read(stream, (uint8_t*)buf, prefix_len)); mu_assert_string_eq(prefix, buf); mu_assert_int_eq(substr_len, stream_write(stream, (uint8_t*)substr, substr_len)); mu_check(stream_seek(stream, prefix_len, StreamOffsetFromStart)); mu_assert_int_eq(substr_len, stream_read(stream, (uint8_t*)buf, substr_len)); mu_assert_string_eq(substr, buf); stream_free(stream); furi_record_close(RECORD_STORAGE); } MU_TEST(stream_buffered_large_file_test) { FuriString* input_data; FuriString* output_data; input_data = furi_string_alloc(); output_data = furi_string_alloc(); Storage* storage = furi_record_open(RECORD_STORAGE); // generate test data consisting of several identical lines const size_t data_size = 4096; const size_t line_size = strlen(stream_test_data); const size_t rep_count = data_size / line_size + 1; for(size_t i = 0; i < rep_count; ++i) { furi_string_cat_printf(input_data, "%s\n", stream_test_data); } // write test data to file Stream* stream = buffered_file_stream_alloc(storage); mu_check( buffered_file_stream_open(stream, FILESTREAM_PATH, FSAM_READ_WRITE, FSOM_CREATE_ALWAYS)); mu_assert_int_eq(0, stream_size(stream)); mu_assert_int_eq(furi_string_size(input_data), stream_write_string(stream, input_data)); mu_assert_int_eq(furi_string_size(input_data), stream_size(stream)); const size_t substr_start = 8; const size_t substr_len = 11; mu_check(stream_seek(stream, substr_start, StreamOffsetFromStart)); mu_assert_int_eq(substr_start, stream_tell(stream)); // copy one substring from test data char test_substr[substr_len + 1]; memset(test_substr, 0, substr_len + 1); memcpy(test_substr, stream_test_data + substr_start, substr_len); char buf[substr_len + 1]; memset(buf, 0, substr_len + 1); // read substring mu_assert_int_eq(substr_len, stream_read(stream, (uint8_t*)buf, substr_len)); mu_assert_string_eq(test_substr, buf); memset(buf, 0, substr_len + 1); // forward seek to cause a cache miss mu_check(stream_seek( stream, (line_size + 1) * (rep_count - 1) - substr_len, StreamOffsetFromCurrent)); // read same substring from a different line mu_assert_int_eq(substr_len, stream_read(stream, (uint8_t*)buf, substr_len)); mu_assert_string_eq(test_substr, buf); memset(buf, 0, substr_len + 1); // backward seek to cause a cache miss mu_check(stream_seek( stream, -((line_size + 1) * (rep_count - 1) + substr_len), StreamOffsetFromCurrent)); mu_assert_int_eq(substr_len, stream_read(stream, (uint8_t*)buf, substr_len)); mu_assert_string_eq(test_substr, buf); // read the whole file mu_check(stream_rewind(stream)); FuriString* tmp; tmp = furi_string_alloc(); while(stream_read_line(stream, tmp)) { furi_string_cat(output_data, tmp); } furi_string_free(tmp); // check against generated data mu_assert_int_eq(furi_string_size(input_data), furi_string_size(output_data)); mu_check(furi_string_equal(input_data, output_data)); mu_check(stream_eof(stream)); stream_free(stream); furi_record_close(RECORD_STORAGE); furi_string_free(input_data); furi_string_free(output_data); } MU_TEST_SUITE(stream_suite) { MU_RUN_TEST(stream_write_read_save_load_test); MU_RUN_TEST(stream_composite_test); MU_RUN_TEST(stream_split_test); MU_RUN_TEST(stream_buffered_write_after_read_test); MU_RUN_TEST(stream_buffered_large_file_test); } int run_minunit_test_stream(void) { MU_RUN_SUITE(stream_suite); return MU_EXIT_CODE; } TEST_API_DEFINE(run_minunit_test_stream) ================================================ FILE: applications/debug/unit_tests/tests/strint/strint_test.c ================================================ #include #include #include "../test.h" // IWYU pragma: keep #include MU_TEST(strint_test_basic) { uint32_t result = 0; mu_assert_int_eq(StrintParseNoError, strint_to_uint32("123456", NULL, &result, 10)); mu_assert_int_eq(123456, result); } MU_TEST(strint_test_junk) { uint32_t result = 0; mu_assert_int_eq(StrintParseNoError, strint_to_uint32(" 123456 ", NULL, &result, 10)); mu_assert_int_eq(123456, result); mu_assert_int_eq( StrintParseNoError, strint_to_uint32(" \r\n\r\n 123456 ", NULL, &result, 10)); mu_assert_int_eq(123456, result); } MU_TEST(strint_test_tail) { uint32_t result = 0; char* tail; mu_assert_int_eq(StrintParseNoError, strint_to_uint32("123456tail", &tail, &result, 10)); mu_assert_int_eq(123456, result); mu_assert_string_eq("tail", tail); mu_assert_int_eq( StrintParseNoError, strint_to_uint32(" \r\n 123456tail", &tail, &result, 10)); mu_assert_int_eq(123456, result); mu_assert_string_eq("tail", tail); } MU_TEST(strint_test_errors) { uint32_t result = 123; mu_assert_int_eq(StrintParseAbsentError, strint_to_uint32("", NULL, &result, 10)); mu_assert_int_eq(123, result); mu_assert_int_eq(StrintParseAbsentError, strint_to_uint32(" asd\r\n", NULL, &result, 10)); mu_assert_int_eq(123, result); mu_assert_int_eq(StrintParseSignError, strint_to_uint32("+++123456", NULL, &result, 10)); mu_assert_int_eq(123, result); mu_assert_int_eq(StrintParseSignError, strint_to_uint32("-1", NULL, &result, 10)); mu_assert_int_eq(123, result); mu_assert_int_eq( StrintParseOverflowError, strint_to_uint32("0xAAAAAAAAAAAAAAAADEADBEEF!!!!!!", NULL, &result, 0)); mu_assert_int_eq(123, result); mu_assert_int_eq(StrintParseOverflowError, strint_to_uint32("4294967296", NULL, &result, 0)); mu_assert_int_eq(123, result); int32_t result_i32 = 123; mu_assert_int_eq( StrintParseOverflowError, strint_to_int32("-2147483649", NULL, &result_i32, 0)); mu_assert_int_eq(123, result_i32); } MU_TEST(strint_test_bases) { uint32_t result = 0; mu_assert_int_eq(StrintParseNoError, strint_to_uint32("0x123", NULL, &result, 0)); mu_assert_int_eq(0x123, result); mu_assert_int_eq(StrintParseNoError, strint_to_uint32("0X123", NULL, &result, 0)); mu_assert_int_eq(0x123, result); mu_assert_int_eq(StrintParseNoError, strint_to_uint32("0xDEADBEEF", NULL, &result, 0)); mu_assert_int_eq(0xDEADBEEF, result); mu_assert_int_eq(StrintParseNoError, strint_to_uint32("0xDEADBEEF", NULL, &result, 16)); mu_assert_int_eq(0xDEADBEEF, result); mu_assert_int_eq(StrintParseNoError, strint_to_uint32("123", NULL, &result, 16)); mu_assert_int_eq(0x123, result); mu_assert_int_eq(StrintParseNoError, strint_to_uint32("123", NULL, &result, 0)); mu_assert_int_eq(123, result); mu_assert_int_eq(StrintParseNoError, strint_to_uint32("0123", NULL, &result, 0)); mu_assert_int_eq(0123, result); mu_assert_int_eq(StrintParseNoError, strint_to_uint32("0123", NULL, &result, 8)); mu_assert_int_eq(0123, result); mu_assert_int_eq(StrintParseNoError, strint_to_uint32("123", NULL, &result, 8)); mu_assert_int_eq(0123, result); mu_assert_int_eq(StrintParseNoError, strint_to_uint32("0b101", NULL, &result, 0)); mu_assert_int_eq(0b101, result); mu_assert_int_eq(StrintParseNoError, strint_to_uint32("0b101", NULL, &result, 2)); mu_assert_int_eq(0b101, result); mu_assert_int_eq(StrintParseNoError, strint_to_uint32("0B101", NULL, &result, 0)); mu_assert_int_eq(0b101, result); mu_assert_int_eq(StrintParseNoError, strint_to_uint32("101", NULL, &result, 2)); mu_assert_int_eq(0b101, result); } MU_TEST_SUITE(strint_test_limits) { uint64_t result_u64 = 0; mu_assert_int_eq( StrintParseNoError, strint_to_uint64("18446744073709551615", NULL, &result_u64, 0)); // `mu_assert_int_eq' does not support longs :( mu_assert(UINT64_MAX == result_u64, "result does not equal UINT64_MAX"); int64_t result_i64 = 0; mu_assert_int_eq( StrintParseNoError, strint_to_int64("9223372036854775807", NULL, &result_i64, 0)); mu_assert(INT64_MAX == result_i64, "result does not equal INT64_MAX"); mu_assert_int_eq( StrintParseNoError, strint_to_int64("-9223372036854775808", NULL, &result_i64, 0)); mu_assert(INT64_MIN == result_i64, "result does not equal INT64_MIN"); uint32_t result_u32 = 0; mu_assert_int_eq(StrintParseNoError, strint_to_uint32("4294967295", NULL, &result_u32, 0)); mu_assert_int_eq(UINT32_MAX, result_u32); int32_t result_i32 = 0; mu_assert_int_eq(StrintParseNoError, strint_to_int32("2147483647", NULL, &result_i32, 0)); mu_assert_int_eq(INT32_MAX, result_i32); mu_assert_int_eq(StrintParseNoError, strint_to_int32("-2147483648", NULL, &result_i32, 0)); mu_assert_int_eq(INT32_MIN, result_i32); uint16_t result_u16 = 0; mu_assert_int_eq(StrintParseNoError, strint_to_uint16("65535", NULL, &result_u16, 0)); mu_assert_int_eq(UINT16_MAX, result_u16); int16_t result_i16 = 0; mu_assert_int_eq(StrintParseNoError, strint_to_int16("32767", NULL, &result_i16, 0)); mu_assert_int_eq(INT16_MAX, result_i16); mu_assert_int_eq(StrintParseNoError, strint_to_int16("-32768", NULL, &result_i16, 0)); mu_assert_int_eq(INT16_MIN, result_i16); } MU_TEST_SUITE(test_strint_suite) { MU_RUN_TEST(strint_test_basic); MU_RUN_TEST(strint_test_junk); MU_RUN_TEST(strint_test_tail); MU_RUN_TEST(strint_test_errors); MU_RUN_TEST(strint_test_bases); MU_RUN_TEST(strint_test_limits); } int run_minunit_test_strint(void) { MU_RUN_SUITE(test_strint_suite); return MU_EXIT_CODE; } TEST_API_DEFINE(run_minunit_test_strint) ================================================ FILE: applications/debug/unit_tests/tests/subghz/subghz_test.c ================================================ #include #include #include "../test.h" // IWYU pragma: keep #include #include #include #include #include #include #include #include #define TAG "SubGhzTest" #define KEYSTORE_DIR_NAME EXT_PATH("subghz/assets/keeloq_mfcodes") #define CAME_ATOMO_DIR_NAME EXT_PATH("subghz/assets/came_atomo") #define NICE_FLOR_S_DIR_NAME EXT_PATH("subghz/assets/nice_flor_s") #define ALUTECH_AT_4N_DIR_NAME EXT_PATH("subghz/assets/alutech_at_4n") #define TEST_RANDOM_DIR_NAME EXT_PATH("unit_tests/subghz/test_random_raw.sub") #define TEST_RANDOM_COUNT_PARSE 328 #define TEST_TIMEOUT 10000 static SubGhzEnvironment* environment_handler; static SubGhzReceiver* receiver_handler; //static SubGhzTransmitter* transmitter_handler; static SubGhzFileEncoderWorker* file_worker_encoder_handler; static uint16_t subghz_test_decoder_count = 0; static void subghz_test_rx_callback( SubGhzReceiver* receiver, SubGhzProtocolDecoderBase* decoder_base, void* context) { UNUSED(receiver); UNUSED(context); FuriString* text; text = furi_string_alloc(); subghz_protocol_decoder_base_get_string(decoder_base, text); subghz_receiver_reset(receiver_handler); FURI_LOG_T(TAG, "\r\n%s", furi_string_get_cstr(text)); furi_string_free(text); subghz_test_decoder_count++; } static void subghz_test_init(void) { environment_handler = subghz_environment_alloc(); subghz_environment_set_came_atomo_rainbow_table_file_name( environment_handler, CAME_ATOMO_DIR_NAME); subghz_environment_set_nice_flor_s_rainbow_table_file_name( environment_handler, NICE_FLOR_S_DIR_NAME); subghz_environment_set_alutech_at_4n_rainbow_table_file_name( environment_handler, ALUTECH_AT_4N_DIR_NAME); subghz_environment_set_protocol_registry( environment_handler, (void*)&subghz_protocol_registry); subghz_devices_init(); receiver_handler = subghz_receiver_alloc_init(environment_handler); subghz_receiver_set_filter(receiver_handler, SubGhzProtocolFlag_Decodable); subghz_receiver_set_rx_callback(receiver_handler, subghz_test_rx_callback, NULL); } static void subghz_test_deinit(void) { subghz_devices_deinit(); subghz_receiver_free(receiver_handler); subghz_environment_free(environment_handler); } static bool subghz_decoder_test(const char* path, const char* name_decoder) { subghz_test_decoder_count = 0; uint32_t test_start = furi_get_tick(); SubGhzProtocolDecoderBase* decoder = subghz_receiver_search_decoder_base_by_name(receiver_handler, name_decoder); if(decoder) { file_worker_encoder_handler = subghz_file_encoder_worker_alloc(); if(subghz_file_encoder_worker_start(file_worker_encoder_handler, path, NULL)) { // the worker needs a file in order to open and read part of the file furi_delay_ms(100); LevelDuration level_duration; while(furi_get_tick() - test_start < TEST_TIMEOUT) { level_duration = subghz_file_encoder_worker_get_level_duration(file_worker_encoder_handler); if(!level_duration_is_reset(level_duration)) { bool level = level_duration_get_level(level_duration); uint32_t duration = level_duration_get_duration(level_duration); // Yield, to load data inside the worker furi_thread_yield(); decoder->protocol->decoder->feed(decoder, level, duration); } else { break; } } furi_delay_ms(10); } if(subghz_file_encoder_worker_is_running(file_worker_encoder_handler)) { subghz_file_encoder_worker_stop(file_worker_encoder_handler); } subghz_file_encoder_worker_free(file_worker_encoder_handler); } FURI_LOG_T(TAG, "Decoder count parse %d", subghz_test_decoder_count); if(furi_get_tick() - test_start > TEST_TIMEOUT) { printf("Test decoder %s ERROR TimeOut\r\n", name_decoder); return false; } else { return subghz_test_decoder_count ? true : false; } } static bool subghz_decode_random_test(const char* path) { subghz_test_decoder_count = 0; subghz_receiver_reset(receiver_handler); uint32_t test_start = furi_get_tick(); file_worker_encoder_handler = subghz_file_encoder_worker_alloc(); if(subghz_file_encoder_worker_start(file_worker_encoder_handler, path, NULL)) { // the worker needs a file in order to open and read part of the file furi_delay_ms(100); LevelDuration level_duration; while(furi_get_tick() - test_start < TEST_TIMEOUT * 10) { level_duration = subghz_file_encoder_worker_get_level_duration(file_worker_encoder_handler); if(!level_duration_is_reset(level_duration)) { bool level = level_duration_get_level(level_duration); uint32_t duration = level_duration_get_duration(level_duration); // Yield, to load data inside the worker furi_thread_yield(); subghz_receiver_decode(receiver_handler, level, duration); } else { break; } } furi_delay_ms(10); if(subghz_file_encoder_worker_is_running(file_worker_encoder_handler)) { subghz_file_encoder_worker_stop(file_worker_encoder_handler); } subghz_file_encoder_worker_free(file_worker_encoder_handler); } FURI_LOG_D(TAG, "Decoder count parse %d", subghz_test_decoder_count); if(furi_get_tick() - test_start > TEST_TIMEOUT * 10) { printf("Random test ERROR TimeOut\r\n"); return false; } else if(subghz_test_decoder_count == TEST_RANDOM_COUNT_PARSE) { return true; } else { return false; } } static bool subghz_encoder_test(const char* path) { subghz_test_decoder_count = 0; uint32_t test_start = furi_get_tick(); FuriString* temp_str; temp_str = furi_string_alloc(); bool file_load = false; Storage* storage = furi_record_open(RECORD_STORAGE); FlipperFormat* fff_data_file = flipper_format_file_alloc(storage); do { if(!flipper_format_file_open_existing(fff_data_file, path)) { FURI_LOG_E(TAG, "Error open file %s", path); break; } if(!flipper_format_read_string(fff_data_file, "Preset", temp_str)) { FURI_LOG_E(TAG, "Missing Preset"); break; } if(!flipper_format_read_string(fff_data_file, "Protocol", temp_str)) { FURI_LOG_E(TAG, "Missing Protocol"); break; } file_load = true; } while(false); if(file_load) { SubGhzTransmitter* transmitter = subghz_transmitter_alloc_init(environment_handler, furi_string_get_cstr(temp_str)); subghz_transmitter_deserialize(transmitter, fff_data_file); SubGhzProtocolDecoderBase* decoder = subghz_receiver_search_decoder_base_by_name( receiver_handler, furi_string_get_cstr(temp_str)); if(decoder) { LevelDuration level_duration; while(furi_get_tick() - test_start < TEST_TIMEOUT) { level_duration = subghz_transmitter_yield(transmitter); if(!level_duration_is_reset(level_duration)) { bool level = level_duration_get_level(level_duration); uint32_t duration = level_duration_get_duration(level_duration); decoder->protocol->decoder->feed(decoder, level, duration); } else { break; } } furi_delay_ms(10); } subghz_transmitter_free(transmitter); } flipper_format_free(fff_data_file); FURI_LOG_T(TAG, "Decoder count parse %d", subghz_test_decoder_count); if(furi_get_tick() - test_start > TEST_TIMEOUT) { printf("Test encoder %s ERROR TimeOut\r\n", furi_string_get_cstr(temp_str)); subghz_test_decoder_count = 0; } furi_string_free(temp_str); return subghz_test_decoder_count ? true : false; } MU_TEST(subghz_keystore_test) { mu_assert( subghz_environment_load_keystore(environment_handler, KEYSTORE_DIR_NAME), "Test keystore error"); } typedef enum { SubGhzHalAsyncTxTestTypeNormal, SubGhzHalAsyncTxTestTypeInvalidStart, SubGhzHalAsyncTxTestTypeInvalidMid, SubGhzHalAsyncTxTestTypeInvalidEnd, SubGhzHalAsyncTxTestTypeResetStart, SubGhzHalAsyncTxTestTypeResetMid, SubGhzHalAsyncTxTestTypeResetEnd, } SubGhzHalAsyncTxTestType; typedef struct { SubGhzHalAsyncTxTestType type; size_t pos; } SubGhzHalAsyncTxTest; #define SUBGHZ_HAL_TEST_DURATION 3 static LevelDuration subghz_hal_async_tx_test_yield(void* context) { SubGhzHalAsyncTxTest* test = context; bool is_odd = test->pos % 2; if(test->type == SubGhzHalAsyncTxTestTypeNormal) { if(test->pos < FURI_HAL_SUBGHZ_ASYNC_TX_BUFFER_FULL * 8) { test->pos++; return level_duration_make(is_odd, SUBGHZ_HAL_TEST_DURATION); } else if(test->pos == FURI_HAL_SUBGHZ_ASYNC_TX_BUFFER_FULL * 8) { test->pos++; return level_duration_reset(); } else { furi_crash("Yield after reset"); } } else if(test->type == SubGhzHalAsyncTxTestTypeInvalidStart) { if(test->pos == 0) { test->pos++; return level_duration_make(!is_odd, SUBGHZ_HAL_TEST_DURATION); } else if(test->pos < FURI_HAL_SUBGHZ_ASYNC_TX_BUFFER_FULL * 8) { test->pos++; return level_duration_make(is_odd, SUBGHZ_HAL_TEST_DURATION); } else if(test->pos == FURI_HAL_SUBGHZ_ASYNC_TX_BUFFER_FULL * 8) { test->pos++; return level_duration_reset(); } else { furi_crash("Yield after reset"); } } else if(test->type == SubGhzHalAsyncTxTestTypeInvalidMid) { if(test->pos == FURI_HAL_SUBGHZ_ASYNC_TX_BUFFER_HALF / 2) { test->pos++; return level_duration_make(!is_odd, SUBGHZ_HAL_TEST_DURATION); } else if(test->pos < FURI_HAL_SUBGHZ_ASYNC_TX_BUFFER_FULL * 8) { test->pos++; return level_duration_make(is_odd, SUBGHZ_HAL_TEST_DURATION); } else if(test->pos == FURI_HAL_SUBGHZ_ASYNC_TX_BUFFER_FULL * 8) { test->pos++; return level_duration_reset(); } else { furi_crash("Yield after reset"); } } else if(test->type == SubGhzHalAsyncTxTestTypeInvalidEnd) { if(test->pos == FURI_HAL_SUBGHZ_ASYNC_TX_BUFFER_FULL - 1) { test->pos++; return level_duration_make(!is_odd, SUBGHZ_HAL_TEST_DURATION); } else if(test->pos < FURI_HAL_SUBGHZ_ASYNC_TX_BUFFER_FULL * 8) { test->pos++; return level_duration_make(is_odd, SUBGHZ_HAL_TEST_DURATION); } else if(test->pos == FURI_HAL_SUBGHZ_ASYNC_TX_BUFFER_FULL * 8) { test->pos++; return level_duration_reset(); } else { furi_crash("Yield after reset"); } } else if(test->type == SubGhzHalAsyncTxTestTypeResetStart) { if(test->pos == 0) { test->pos++; return level_duration_reset(); } else { furi_crash("Yield after reset"); } } else if(test->type == SubGhzHalAsyncTxTestTypeResetMid) { if(test->pos < FURI_HAL_SUBGHZ_ASYNC_TX_BUFFER_HALF / 2) { test->pos++; return level_duration_make(is_odd, SUBGHZ_HAL_TEST_DURATION); } else if(test->pos == FURI_HAL_SUBGHZ_ASYNC_TX_BUFFER_HALF / 2) { test->pos++; return level_duration_reset(); } else { furi_crash("Yield after reset"); } } else if(test->type == SubGhzHalAsyncTxTestTypeResetEnd) { if(test->pos < FURI_HAL_SUBGHZ_ASYNC_TX_BUFFER_FULL) { test->pos++; return level_duration_make(is_odd, SUBGHZ_HAL_TEST_DURATION); } else if(test->pos == FURI_HAL_SUBGHZ_ASYNC_TX_BUFFER_FULL) { test->pos++; return level_duration_reset(); } else { furi_crash("Yield after reset"); } } else { furi_crash(); } } bool subghz_hal_async_tx_test_run(SubGhzHalAsyncTxTestType type) { SubGhzHalAsyncTxTest test = {0}; test.type = type; furi_hal_subghz_reset(); furi_hal_subghz_load_custom_preset(subghz_device_cc1101_preset_ook_650khz_async_regs); furi_hal_subghz_set_frequency_and_path(433920000); if(!furi_hal_subghz_start_async_tx(subghz_hal_async_tx_test_yield, &test)) { mu_warn("SubGHZ transmission is prohibited"); return false; } FuriHalCortexTimer timer = furi_hal_cortex_timer_get(30000000); while(!furi_hal_subghz_is_async_tx_complete()) { if(furi_hal_cortex_timer_is_expired(timer)) { furi_hal_subghz_stop_async_tx(); furi_hal_subghz_sleep(); return false; } furi_delay_ms(10); } furi_hal_subghz_stop_async_tx(); furi_hal_subghz_sleep(); return true; } MU_TEST(subghz_hal_async_tx_test) { mu_assert( subghz_hal_async_tx_test_run(SubGhzHalAsyncTxTestTypeNormal), "Test furi_hal_async_tx normal"); mu_assert( subghz_hal_async_tx_test_run(SubGhzHalAsyncTxTestTypeInvalidStart), "Test furi_hal_async_tx invalid start"); mu_assert( subghz_hal_async_tx_test_run(SubGhzHalAsyncTxTestTypeInvalidMid), "Test furi_hal_async_tx invalid mid"); mu_assert( subghz_hal_async_tx_test_run(SubGhzHalAsyncTxTestTypeInvalidEnd), "Test furi_hal_async_tx invalid end"); mu_assert( subghz_hal_async_tx_test_run(SubGhzHalAsyncTxTestTypeResetStart), "Test furi_hal_async_tx reset start"); mu_assert( subghz_hal_async_tx_test_run(SubGhzHalAsyncTxTestTypeResetMid), "Test furi_hal_async_tx reset mid"); mu_assert( subghz_hal_async_tx_test_run(SubGhzHalAsyncTxTestTypeResetEnd), "Test furi_hal_async_tx reset end"); } //test decoders MU_TEST(subghz_decoder_came_atomo_test) { mu_assert( subghz_decoder_test( EXT_PATH("unit_tests/subghz/came_atomo_raw.sub"), SUBGHZ_PROTOCOL_CAME_ATOMO_NAME), "Test decoder " SUBGHZ_PROTOCOL_CAME_ATOMO_NAME " error\r\n"); } MU_TEST(subghz_decoder_came_test) { mu_assert( subghz_decoder_test(EXT_PATH("unit_tests/subghz/came_raw.sub"), SUBGHZ_PROTOCOL_CAME_NAME), "Test decoder " SUBGHZ_PROTOCOL_CAME_NAME " error\r\n"); } MU_TEST(subghz_decoder_came_twee_test) { mu_assert( subghz_decoder_test( EXT_PATH("unit_tests/subghz/came_twee_raw.sub"), SUBGHZ_PROTOCOL_CAME_TWEE_NAME), "Test decoder " SUBGHZ_PROTOCOL_CAME_TWEE_NAME " error\r\n"); } MU_TEST(subghz_decoder_faac_slh_test) { mu_assert( subghz_decoder_test( EXT_PATH("unit_tests/subghz/faac_slh_raw.sub"), SUBGHZ_PROTOCOL_FAAC_SLH_NAME), "Test decoder " SUBGHZ_PROTOCOL_FAAC_SLH_NAME " error\r\n"); } MU_TEST(subghz_decoder_gate_tx_test) { mu_assert( subghz_decoder_test( EXT_PATH("unit_tests/subghz/gate_tx_raw.sub"), SUBGHZ_PROTOCOL_GATE_TX_NAME), "Test decoder " SUBGHZ_PROTOCOL_GATE_TX_NAME " error\r\n"); } MU_TEST(subghz_decoder_hormann_hsm_test) { mu_assert( subghz_decoder_test( EXT_PATH("unit_tests/subghz/hormann_hsm_raw.sub"), SUBGHZ_PROTOCOL_HORMANN_HSM_NAME), "Test decoder " SUBGHZ_PROTOCOL_HORMANN_HSM_NAME " error\r\n"); } MU_TEST(subghz_decoder_ido_test) { mu_assert( subghz_decoder_test( EXT_PATH("unit_tests/subghz/ido_117_111_raw.sub"), SUBGHZ_PROTOCOL_IDO_NAME), "Test decoder " SUBGHZ_PROTOCOL_IDO_NAME " error\r\n"); } MU_TEST(subghz_decoder_keeloq_test) { mu_assert( subghz_decoder_test( EXT_PATH("unit_tests/subghz/doorhan_raw.sub"), SUBGHZ_PROTOCOL_KEELOQ_NAME), "Test decoder " SUBGHZ_PROTOCOL_KEELOQ_NAME " error\r\n"); } MU_TEST(subghz_decoder_kia_seed_test) { mu_assert( subghz_decoder_test( EXT_PATH("unit_tests/subghz/kia_seed_raw.sub"), SUBGHZ_PROTOCOL_KIA_NAME), "Test decoder " SUBGHZ_PROTOCOL_KIA_NAME " error\r\n"); } MU_TEST(subghz_decoder_nero_radio_test) { mu_assert( subghz_decoder_test( EXT_PATH("unit_tests/subghz/nero_radio_raw.sub"), SUBGHZ_PROTOCOL_NERO_RADIO_NAME), "Test decoder " SUBGHZ_PROTOCOL_NERO_RADIO_NAME " error\r\n"); } MU_TEST(subghz_decoder_nero_sketch_test) { mu_assert( subghz_decoder_test( EXT_PATH("unit_tests/subghz/nero_sketch_raw.sub"), SUBGHZ_PROTOCOL_NERO_SKETCH_NAME), "Test decoder " SUBGHZ_PROTOCOL_NERO_SKETCH_NAME " error\r\n"); } MU_TEST(subghz_decoder_nice_flo_test) { mu_assert( subghz_decoder_test( EXT_PATH("unit_tests/subghz/nice_flo_raw.sub"), SUBGHZ_PROTOCOL_NICE_FLO_NAME), "Test decoder " SUBGHZ_PROTOCOL_NICE_FLO_NAME " error\r\n"); } MU_TEST(subghz_decoder_nice_flor_s_test) { mu_assert( subghz_decoder_test( EXT_PATH("unit_tests/subghz/nice_flor_s_raw.sub"), SUBGHZ_PROTOCOL_NICE_FLOR_S_NAME), "Test decoder " SUBGHZ_PROTOCOL_NICE_FLOR_S_NAME " error\r\n"); } MU_TEST(subghz_decoder_princeton_test) { mu_assert( subghz_decoder_test( EXT_PATH("unit_tests/subghz/Princeton_raw.sub"), SUBGHZ_PROTOCOL_PRINCETON_NAME), "Test decoder " SUBGHZ_PROTOCOL_PRINCETON_NAME " error\r\n"); } MU_TEST(subghz_decoder_scher_khan_magic_code_test) { mu_assert( subghz_decoder_test( EXT_PATH("unit_tests/subghz/scher_khan_magic_code.sub"), SUBGHZ_PROTOCOL_SCHER_KHAN_NAME), "Test decoder " SUBGHZ_PROTOCOL_SCHER_KHAN_NAME " error\r\n"); } MU_TEST(subghz_decoder_somfy_keytis_test) { mu_assert( subghz_decoder_test( EXT_PATH("unit_tests/subghz/Somfy_keytis_raw.sub"), SUBGHZ_PROTOCOL_SOMFY_KEYTIS_NAME), "Test decoder " SUBGHZ_PROTOCOL_SOMFY_KEYTIS_NAME " error\r\n"); } MU_TEST(subghz_decoder_somfy_telis_test) { mu_assert( subghz_decoder_test( EXT_PATH("unit_tests/subghz/somfy_telis_raw.sub"), SUBGHZ_PROTOCOL_SOMFY_TELIS_NAME), "Test decoder " SUBGHZ_PROTOCOL_SOMFY_TELIS_NAME " error\r\n"); } MU_TEST(subghz_decoder_star_line_test) { mu_assert( subghz_decoder_test( EXT_PATH("unit_tests/subghz/cenmax_raw.sub"), SUBGHZ_PROTOCOL_STAR_LINE_NAME), "Test decoder " SUBGHZ_PROTOCOL_STAR_LINE_NAME " error\r\n"); } MU_TEST(subghz_decoder_linear_test) { mu_assert( subghz_decoder_test( EXT_PATH("unit_tests/subghz/linear_raw.sub"), SUBGHZ_PROTOCOL_LINEAR_NAME), "Test decoder " SUBGHZ_PROTOCOL_LINEAR_NAME " error\r\n"); } MU_TEST(subghz_decoder_linear_delta3_test) { mu_assert( subghz_decoder_test( EXT_PATH("unit_tests/subghz/linear_delta3_raw.sub"), SUBGHZ_PROTOCOL_LINEAR_DELTA3_NAME), "Test decoder " SUBGHZ_PROTOCOL_LINEAR_DELTA3_NAME " error\r\n"); } MU_TEST(subghz_decoder_megacode_test) { mu_assert( subghz_decoder_test( EXT_PATH("unit_tests/subghz/megacode_raw.sub"), SUBGHZ_PROTOCOL_MEGACODE_NAME), "Test decoder " SUBGHZ_PROTOCOL_MEGACODE_NAME " error\r\n"); } MU_TEST(subghz_decoder_secplus_v1_test) { mu_assert( subghz_decoder_test( EXT_PATH("unit_tests/subghz/security_pls_1_0_raw.sub"), SUBGHZ_PROTOCOL_SECPLUS_V1_NAME), "Test decoder " SUBGHZ_PROTOCOL_SECPLUS_V1_NAME " error\r\n"); } MU_TEST(subghz_decoder_secplus_v2_test) { mu_assert( subghz_decoder_test( EXT_PATH("unit_tests/subghz/security_pls_2_0_raw.sub"), SUBGHZ_PROTOCOL_SECPLUS_V2_NAME), "Test decoder " SUBGHZ_PROTOCOL_SECPLUS_V2_NAME " error\r\n"); } MU_TEST(subghz_decoder_holtek_test) { mu_assert( subghz_decoder_test( EXT_PATH("unit_tests/subghz/holtek_raw.sub"), SUBGHZ_PROTOCOL_HOLTEK_NAME), "Test decoder " SUBGHZ_PROTOCOL_HOLTEK_NAME " error\r\n"); } MU_TEST(subghz_decoder_power_smart_test) { mu_assert( subghz_decoder_test( EXT_PATH("unit_tests/subghz/power_smart_raw.sub"), SUBGHZ_PROTOCOL_POWER_SMART_NAME), "Test decoder " SUBGHZ_PROTOCOL_POWER_SMART_NAME " error\r\n"); } MU_TEST(subghz_decoder_marantec_test) { mu_assert( subghz_decoder_test( EXT_PATH("unit_tests/subghz/marantec_raw.sub"), SUBGHZ_PROTOCOL_MARANTEC_NAME), "Test decoder " SUBGHZ_PROTOCOL_MARANTEC_NAME " error\r\n"); } MU_TEST(subghz_decoder_bett_test) { mu_assert( subghz_decoder_test(EXT_PATH("unit_tests/subghz/bett_raw.sub"), SUBGHZ_PROTOCOL_BETT_NAME), "Test decoder " SUBGHZ_PROTOCOL_BETT_NAME " error\r\n"); } MU_TEST(subghz_decoder_doitrand_test) { mu_assert( subghz_decoder_test( EXT_PATH("unit_tests/subghz/doitrand_raw.sub"), SUBGHZ_PROTOCOL_DOITRAND_NAME), "Test decoder " SUBGHZ_PROTOCOL_DOITRAND_NAME " error\r\n"); } MU_TEST(subghz_decoder_phoenix_v2_test) { mu_assert( subghz_decoder_test( EXT_PATH("unit_tests/subghz/phoenix_v2_raw.sub"), SUBGHZ_PROTOCOL_PHOENIX_V2_NAME), "Test decoder " SUBGHZ_PROTOCOL_PHOENIX_V2_NAME " error\r\n"); } MU_TEST(subghz_decoder_honeywell_wdb_test) { mu_assert( subghz_decoder_test( EXT_PATH("unit_tests/subghz/honeywell_wdb_raw.sub"), SUBGHZ_PROTOCOL_HONEYWELL_WDB_NAME), "Test decoder " SUBGHZ_PROTOCOL_HONEYWELL_WDB_NAME " error\r\n"); } MU_TEST(subghz_decoder_magellan_test) { mu_assert( subghz_decoder_test( EXT_PATH("unit_tests/subghz/magellan_raw.sub"), SUBGHZ_PROTOCOL_MAGELLAN_NAME), "Test decoder " SUBGHZ_PROTOCOL_MAGELLAN_NAME " error\r\n"); } MU_TEST(subghz_decoder_intertechno_v3_test) { mu_assert( subghz_decoder_test( EXT_PATH("unit_tests/subghz/intertechno_v3_raw.sub"), SUBGHZ_PROTOCOL_INTERTECHNO_V3_NAME), "Test decoder " SUBGHZ_PROTOCOL_INTERTECHNO_V3_NAME " error\r\n"); } MU_TEST(subghz_decoder_clemsa_test) { mu_assert( subghz_decoder_test( EXT_PATH("unit_tests/subghz/clemsa_raw.sub"), SUBGHZ_PROTOCOL_CLEMSA_NAME), "Test decoder " SUBGHZ_PROTOCOL_CLEMSA_NAME " error\r\n"); } MU_TEST(subghz_decoder_ansonic_test) { mu_assert( subghz_decoder_test( EXT_PATH("unit_tests/subghz/ansonic_raw.sub"), SUBGHZ_PROTOCOL_ANSONIC_NAME), "Test decoder " SUBGHZ_PROTOCOL_ANSONIC_NAME " error\r\n"); } MU_TEST(subghz_decoder_smc5326_test) { mu_assert( subghz_decoder_test( EXT_PATH("unit_tests/subghz/smc5326_raw.sub"), SUBGHZ_PROTOCOL_SMC5326_NAME), "Test decoder " SUBGHZ_PROTOCOL_SMC5326_NAME " error\r\n"); } MU_TEST(subghz_decoder_holtek_ht12x_test) { mu_assert( subghz_decoder_test( EXT_PATH("unit_tests/subghz/holtek_ht12x_raw.sub"), SUBGHZ_PROTOCOL_HOLTEK_HT12X_NAME), "Test decoder " SUBGHZ_PROTOCOL_HOLTEK_HT12X_NAME " error\r\n"); } MU_TEST(subghz_decoder_dooya_test) { mu_assert( subghz_decoder_test( EXT_PATH("unit_tests/subghz/dooya_raw.sub"), SUBGHZ_PROTOCOL_DOOYA_NAME), "Test decoder " SUBGHZ_PROTOCOL_DOOYA_NAME " error\r\n"); } MU_TEST(subghz_decoder_alutech_at_4n_test) { mu_assert( subghz_decoder_test( EXT_PATH("unit_tests/subghz/alutech_at_4n_raw.sub"), SUBGHZ_PROTOCOL_ALUTECH_AT_4N_NAME), "Test decoder " SUBGHZ_PROTOCOL_ALUTECH_AT_4N_NAME " error\r\n"); } MU_TEST(subghz_decoder_nice_one_test) { mu_assert( subghz_decoder_test( EXT_PATH("unit_tests/subghz/nice_one_raw.sub"), SUBGHZ_PROTOCOL_NICE_FLOR_S_NAME), "Test decoder " SUBGHZ_PROTOCOL_NICE_FLOR_S_NAME " error\r\n"); } MU_TEST(subghz_decoder_kinggates_stylo4k_test) { mu_assert( subghz_decoder_test( EXT_PATH("unit_tests/subghz/kinggates_stylo4k_raw.sub"), SUBGHZ_PROTOCOL_KINGGATES_STYLO_4K_NAME), "Test decoder " SUBGHZ_PROTOCOL_KINGGATES_STYLO_4K_NAME " error\r\n"); } MU_TEST(subghz_decoder_mastercode_test) { mu_assert( subghz_decoder_test( EXT_PATH("unit_tests/subghz/mastercode_raw.sub"), SUBGHZ_PROTOCOL_MASTERCODE_NAME), "Test decoder " SUBGHZ_PROTOCOL_MASTERCODE_NAME " error\r\n"); } MU_TEST(subghz_decoder_dickert_test) { mu_assert( subghz_decoder_test( EXT_PATH("unit_tests/subghz/dickert_raw.sub"), SUBGHZ_PROTOCOL_DICKERT_MAHS_NAME), "Test decoder " SUBGHZ_PROTOCOL_DICKERT_MAHS_NAME " error\r\n"); } MU_TEST(subghz_decoder_legrand_test) { mu_assert( subghz_decoder_test( EXT_PATH("unit_tests/subghz/legrand_raw.sub"), SUBGHZ_PROTOCOL_LEGRAND_NAME), "Test decoder " SUBGHZ_PROTOCOL_LEGRAND_NAME " error\r\n"); } MU_TEST(subghz_decoder_marantec24_test) { mu_assert( subghz_decoder_test( EXT_PATH("unit_tests/subghz/marantec24_raw.sub"), SUBGHZ_PROTOCOL_MARANTEC24_NAME), "Test decoder " SUBGHZ_PROTOCOL_MARANTEC24_NAME " error\r\n"); } MU_TEST(subghz_decoder_roger_test) { mu_assert( subghz_decoder_test( EXT_PATH("unit_tests/subghz/roger_raw.sub"), SUBGHZ_PROTOCOL_ROGER_NAME), "Test decoder " SUBGHZ_PROTOCOL_ROGER_NAME " error\r\n"); } MU_TEST(subghz_decoder_feron_test) { mu_assert( subghz_decoder_test( EXT_PATH("unit_tests/subghz/feron_raw.sub"), SUBGHZ_PROTOCOL_FERON_NAME), "Test decoder " SUBGHZ_PROTOCOL_FERON_NAME " error\r\n"); } MU_TEST(subghz_decoder_gangqi_test) { mu_assert( subghz_decoder_test( EXT_PATH("unit_tests/subghz/gangqi_raw.sub"), SUBGHZ_PROTOCOL_GANGQI_NAME), "Test decoder " SUBGHZ_PROTOCOL_GANGQI_NAME " error\r\n"); } MU_TEST(subghz_decoder_hollarm_test) { mu_assert( subghz_decoder_test( EXT_PATH("unit_tests/subghz/hollarm_raw.sub"), SUBGHZ_PROTOCOL_HOLLARM_NAME), "Test decoder " SUBGHZ_PROTOCOL_HOLLARM_NAME " error\r\n"); } MU_TEST(subghz_decoder_reversrb2_test) { mu_assert( subghz_decoder_test( EXT_PATH("unit_tests/subghz/revers_rb2_raw.sub"), SUBGHZ_PROTOCOL_REVERSRB2_NAME), "Test decoder " SUBGHZ_PROTOCOL_REVERSRB2_NAME " error\r\n"); } MU_TEST(subghz_decoder_hay21_test) { mu_assert( subghz_decoder_test( EXT_PATH("unit_tests/subghz/hay21_raw.sub"), SUBGHZ_PROTOCOL_HAY21_NAME), "Test decoder " SUBGHZ_PROTOCOL_HAY21_NAME " error\r\n"); } //test encoders MU_TEST(subghz_encoder_princeton_test) { mu_assert( subghz_encoder_test(EXT_PATH("unit_tests/subghz/princeton.sub")), "Test encoder " SUBGHZ_PROTOCOL_PRINCETON_NAME " error\r\n"); } MU_TEST(subghz_encoder_came_test) { mu_assert( subghz_encoder_test(EXT_PATH("unit_tests/subghz/came.sub")), "Test encoder " SUBGHZ_PROTOCOL_CAME_NAME " error\r\n"); } MU_TEST(subghz_encoder_came_twee_test) { mu_assert( subghz_encoder_test(EXT_PATH("unit_tests/subghz/came_twee.sub")), "Test encoder " SUBGHZ_PROTOCOL_CAME_TWEE_NAME " error\r\n"); } MU_TEST(subghz_encoder_gate_tx_test) { mu_assert( subghz_encoder_test(EXT_PATH("unit_tests/subghz/gate_tx.sub")), "Test encoder " SUBGHZ_PROTOCOL_GATE_TX_NAME " error\r\n"); } MU_TEST(subghz_encoder_nice_flo_test) { mu_assert( subghz_encoder_test(EXT_PATH("unit_tests/subghz/nice_flo.sub")), "Test encoder " SUBGHZ_PROTOCOL_NICE_FLO_NAME " error\r\n"); } MU_TEST(subghz_encoder_keeloq_test) { mu_assert( subghz_encoder_test(EXT_PATH("unit_tests/subghz/doorhan.sub")), "Test encoder " SUBGHZ_PROTOCOL_KEELOQ_NAME " error\r\n"); } MU_TEST(subghz_encoder_linear_test) { mu_assert( subghz_encoder_test(EXT_PATH("unit_tests/subghz/linear.sub")), "Test encoder " SUBGHZ_PROTOCOL_LINEAR_NAME " error\r\n"); } MU_TEST(subghz_encoder_linear_delta3_test) { mu_assert( subghz_encoder_test(EXT_PATH("unit_tests/subghz/linear_delta3.sub")), "Test encoder " SUBGHZ_PROTOCOL_LINEAR_DELTA3_NAME " error\r\n"); } MU_TEST(subghz_encoder_megacode_test) { mu_assert( subghz_encoder_test(EXT_PATH("unit_tests/subghz/megacode.sub")), "Test encoder " SUBGHZ_PROTOCOL_MEGACODE_NAME " error\r\n"); } MU_TEST(subghz_encoder_holtek_test) { mu_assert( subghz_encoder_test(EXT_PATH("unit_tests/subghz/holtek.sub")), "Test encoder " SUBGHZ_PROTOCOL_HOLTEK_NAME " error\r\n"); } MU_TEST(subghz_encoder_secplus_v1_test) { mu_assert( subghz_encoder_test(EXT_PATH("unit_tests/subghz/security_pls_1_0.sub")), "Test encoder " SUBGHZ_PROTOCOL_SECPLUS_V1_NAME " error\r\n"); } MU_TEST(subghz_encoder_secplus_v2_test) { mu_assert( subghz_encoder_test(EXT_PATH("unit_tests/subghz/security_pls_2_0.sub")), "Test encoder " SUBGHZ_PROTOCOL_SECPLUS_V2_NAME " error\r\n"); } MU_TEST(subghz_encoder_power_smart_test) { mu_assert( subghz_encoder_test(EXT_PATH("unit_tests/subghz/power_smart.sub")), "Test encoder " SUBGHZ_PROTOCOL_POWER_SMART_NAME " error\r\n"); } MU_TEST(subghz_encoder_marantec_test) { mu_assert( subghz_encoder_test(EXT_PATH("unit_tests/subghz/marantec.sub")), "Test encoder " SUBGHZ_PROTOCOL_MARANTEC_NAME " error\r\n"); } MU_TEST(subghz_encoder_bett_test) { mu_assert( subghz_encoder_test(EXT_PATH("unit_tests/subghz/bett.sub")), "Test encoder " SUBGHZ_PROTOCOL_BETT_NAME " error\r\n"); } MU_TEST(subghz_encoder_doitrand_test) { mu_assert( subghz_encoder_test(EXT_PATH("unit_tests/subghz/doitrand.sub")), "Test encoder " SUBGHZ_PROTOCOL_DOITRAND_NAME " error\r\n"); } MU_TEST(subghz_encoder_phoenix_v2_test) { mu_assert( subghz_encoder_test(EXT_PATH("unit_tests/subghz/phoenix_v2.sub")), "Test encoder " SUBGHZ_PROTOCOL_PHOENIX_V2_NAME " error\r\n"); } MU_TEST(subghz_encoder_honeywell_wdb_test) { mu_assert( subghz_encoder_test(EXT_PATH("unit_tests/subghz/honeywell_wdb.sub")), "Test encoder " SUBGHZ_PROTOCOL_HONEYWELL_WDB_NAME " error\r\n"); } MU_TEST(subghz_encoder_magellan_test) { mu_assert( subghz_encoder_test(EXT_PATH("unit_tests/subghz/magellan.sub")), "Test encoder " SUBGHZ_PROTOCOL_MAGELLAN_NAME " error\r\n"); } MU_TEST(subghz_encoder_intertechno_v3_test) { mu_assert( subghz_encoder_test(EXT_PATH("unit_tests/subghz/intertechno_v3.sub")), "Test encoder " SUBGHZ_PROTOCOL_INTERTECHNO_V3_NAME " error\r\n"); } MU_TEST(subghz_encoder_clemsa_test) { mu_assert( subghz_encoder_test(EXT_PATH("unit_tests/subghz/clemsa.sub")), "Test encoder " SUBGHZ_PROTOCOL_CLEMSA_NAME " error\r\n"); } MU_TEST(subghz_encoder_ansonic_test) { mu_assert( subghz_encoder_test(EXT_PATH("unit_tests/subghz/ansonic.sub")), "Test encoder " SUBGHZ_PROTOCOL_ANSONIC_NAME " error\r\n"); } MU_TEST(subghz_encoder_smc5326_test) { mu_assert( subghz_encoder_test(EXT_PATH("unit_tests/subghz/smc5326.sub")), "Test encoder " SUBGHZ_PROTOCOL_SMC5326_NAME " error\r\n"); } MU_TEST(subghz_encoder_holtek_ht12x_test) { mu_assert( subghz_encoder_test(EXT_PATH("unit_tests/subghz/holtek_ht12x.sub")), "Test encoder " SUBGHZ_PROTOCOL_HOLTEK_HT12X_NAME " error\r\n"); } MU_TEST(subghz_encoder_dooya_test) { mu_assert( subghz_encoder_test(EXT_PATH("unit_tests/subghz/dooya.sub")), "Test encoder " SUBGHZ_PROTOCOL_DOOYA_NAME " error\r\n"); } MU_TEST(subghz_encoder_mastercode_test) { mu_assert( subghz_encoder_test(EXT_PATH("unit_tests/subghz/mastercode.sub")), "Test encoder " SUBGHZ_PROTOCOL_MASTERCODE_NAME " error\r\n"); } MU_TEST(subghz_encoder_dickert_test) { mu_assert( subghz_encoder_test(EXT_PATH("unit_tests/subghz/dickert_mahs.sub")), "Test encoder " SUBGHZ_PROTOCOL_DICKERT_MAHS_NAME " error\r\n"); } MU_TEST(subghz_encoder_legrand_test) { mu_assert( subghz_encoder_test(EXT_PATH("unit_tests/subghz/legrand.sub")), "Test encoder " SUBGHZ_PROTOCOL_LEGRAND_NAME " error\r\n"); } MU_TEST(subghz_encoder_feron_test) { mu_assert( subghz_encoder_test(EXT_PATH("unit_tests/subghz/feron.sub")), "Test encoder " SUBGHZ_PROTOCOL_FERON_NAME " error\r\n"); } MU_TEST(subghz_encoder_gangqi_test) { mu_assert( subghz_encoder_test(EXT_PATH("unit_tests/subghz/gangqi.sub")), "Test encoder " SUBGHZ_PROTOCOL_GANGQI_NAME " error\r\n"); } MU_TEST(subghz_encoder_hollarm_test) { mu_assert( subghz_encoder_test(EXT_PATH("unit_tests/subghz/hollarm.sub")), "Test encoder " SUBGHZ_PROTOCOL_HOLLARM_NAME " error\r\n"); } MU_TEST(subghz_encoder_reversrb2_test) { mu_assert( subghz_encoder_test(EXT_PATH("unit_tests/subghz/revers_rb2.sub")), "Test encoder " SUBGHZ_PROTOCOL_REVERSRB2_NAME " error\r\n"); } MU_TEST(subghz_encoder_roger_test) { mu_assert( subghz_encoder_test(EXT_PATH("unit_tests/subghz/roger.sub")), "Test encoder " SUBGHZ_PROTOCOL_ROGER_NAME " error\r\n"); } MU_TEST(subghz_encoder_marantec24_test) { mu_assert( subghz_encoder_test(EXT_PATH("unit_tests/subghz/marantec24.sub")), "Test encoder " SUBGHZ_PROTOCOL_MARANTEC24_NAME " error\r\n"); } MU_TEST(subghz_random_test) { mu_assert(subghz_decode_random_test(TEST_RANDOM_DIR_NAME), "Random test error\r\n"); } MU_TEST_SUITE(subghz) { subghz_test_init(); MU_RUN_TEST(subghz_keystore_test); MU_RUN_TEST(subghz_hal_async_tx_test); MU_RUN_TEST(subghz_decoder_came_atomo_test); MU_RUN_TEST(subghz_decoder_came_test); MU_RUN_TEST(subghz_decoder_came_twee_test); MU_RUN_TEST(subghz_decoder_faac_slh_test); MU_RUN_TEST(subghz_decoder_gate_tx_test); MU_RUN_TEST(subghz_decoder_hormann_hsm_test); MU_RUN_TEST(subghz_decoder_ido_test); MU_RUN_TEST(subghz_decoder_keeloq_test); MU_RUN_TEST(subghz_decoder_kia_seed_test); MU_RUN_TEST(subghz_decoder_nero_radio_test); MU_RUN_TEST(subghz_decoder_nero_sketch_test); MU_RUN_TEST(subghz_decoder_nice_flo_test); MU_RUN_TEST(subghz_decoder_nice_flor_s_test); MU_RUN_TEST(subghz_decoder_princeton_test); MU_RUN_TEST(subghz_decoder_scher_khan_magic_code_test); MU_RUN_TEST(subghz_decoder_somfy_keytis_test); MU_RUN_TEST(subghz_decoder_somfy_telis_test); MU_RUN_TEST(subghz_decoder_star_line_test); MU_RUN_TEST(subghz_decoder_linear_test); MU_RUN_TEST(subghz_decoder_linear_delta3_test); MU_RUN_TEST(subghz_decoder_megacode_test); MU_RUN_TEST(subghz_decoder_secplus_v1_test); MU_RUN_TEST(subghz_decoder_secplus_v2_test); MU_RUN_TEST(subghz_decoder_holtek_test); MU_RUN_TEST(subghz_decoder_power_smart_test); MU_RUN_TEST(subghz_decoder_marantec_test); MU_RUN_TEST(subghz_decoder_bett_test); MU_RUN_TEST(subghz_decoder_doitrand_test); MU_RUN_TEST(subghz_decoder_phoenix_v2_test); MU_RUN_TEST(subghz_decoder_honeywell_wdb_test); MU_RUN_TEST(subghz_decoder_magellan_test); MU_RUN_TEST(subghz_decoder_intertechno_v3_test); MU_RUN_TEST(subghz_decoder_clemsa_test); MU_RUN_TEST(subghz_decoder_ansonic_test); MU_RUN_TEST(subghz_decoder_smc5326_test); MU_RUN_TEST(subghz_decoder_holtek_ht12x_test); MU_RUN_TEST(subghz_decoder_dooya_test); MU_RUN_TEST(subghz_decoder_alutech_at_4n_test); MU_RUN_TEST(subghz_decoder_nice_one_test); MU_RUN_TEST(subghz_decoder_kinggates_stylo4k_test); MU_RUN_TEST(subghz_decoder_mastercode_test); MU_RUN_TEST(subghz_decoder_dickert_test); MU_RUN_TEST(subghz_decoder_roger_test); MU_RUN_TEST(subghz_decoder_hollarm_test); MU_RUN_TEST(subghz_decoder_reversrb2_test); MU_RUN_TEST(subghz_decoder_gangqi_test); MU_RUN_TEST(subghz_decoder_hay21_test); MU_RUN_TEST(subghz_decoder_feron_test); MU_RUN_TEST(subghz_decoder_legrand_test); MU_RUN_TEST(subghz_decoder_marantec24_test); MU_RUN_TEST(subghz_encoder_princeton_test); MU_RUN_TEST(subghz_encoder_came_test); MU_RUN_TEST(subghz_encoder_came_twee_test); MU_RUN_TEST(subghz_encoder_gate_tx_test); MU_RUN_TEST(subghz_encoder_nice_flo_test); MU_RUN_TEST(subghz_encoder_keeloq_test); MU_RUN_TEST(subghz_encoder_linear_test); MU_RUN_TEST(subghz_encoder_linear_delta3_test); MU_RUN_TEST(subghz_encoder_megacode_test); MU_RUN_TEST(subghz_encoder_holtek_test); MU_RUN_TEST(subghz_encoder_secplus_v1_test); MU_RUN_TEST(subghz_encoder_secplus_v2_test); MU_RUN_TEST(subghz_encoder_power_smart_test); MU_RUN_TEST(subghz_encoder_marantec_test); MU_RUN_TEST(subghz_encoder_bett_test); MU_RUN_TEST(subghz_encoder_doitrand_test); MU_RUN_TEST(subghz_encoder_phoenix_v2_test); MU_RUN_TEST(subghz_encoder_honeywell_wdb_test); MU_RUN_TEST(subghz_encoder_magellan_test); MU_RUN_TEST(subghz_encoder_intertechno_v3_test); MU_RUN_TEST(subghz_encoder_clemsa_test); MU_RUN_TEST(subghz_encoder_ansonic_test); MU_RUN_TEST(subghz_encoder_smc5326_test); MU_RUN_TEST(subghz_encoder_holtek_ht12x_test); MU_RUN_TEST(subghz_encoder_dooya_test); MU_RUN_TEST(subghz_encoder_mastercode_test); MU_RUN_TEST(subghz_encoder_dickert_test); MU_RUN_TEST(subghz_encoder_feron_test); MU_RUN_TEST(subghz_encoder_roger_test); MU_RUN_TEST(subghz_encoder_gangqi_test); MU_RUN_TEST(subghz_encoder_marantec24_test); MU_RUN_TEST(subghz_encoder_hollarm_test); MU_RUN_TEST(subghz_encoder_reversrb2_test); MU_RUN_TEST(subghz_encoder_legrand_test); MU_RUN_TEST(subghz_random_test); subghz_test_deinit(); } int run_minunit_test_subghz(void) { MU_RUN_SUITE(subghz); return MU_EXIT_CODE; } TEST_API_DEFINE(run_minunit_test_subghz) ================================================ FILE: applications/debug/unit_tests/tests/test.h ================================================ #pragma once // Framework #include "minunit.h" #include "test_api.h" int get_minunit_run(void); int get_minunit_assert(void); int get_minunit_status(void); ================================================ FILE: applications/debug/unit_tests/tests/test_api.h ================================================ #pragma once #include #define APPID "UnitTest" #define API_VERSION (0u) typedef struct { int (*run)(void); int (*get_minunit_run)(void); int (*get_minunit_assert)(void); int (*get_minunit_status)(void); } TestApi; #define TEST_API_DEFINE(entrypoint) \ const TestApi test_api = { \ .run = entrypoint, \ .get_minunit_run = get_minunit_run, \ .get_minunit_assert = get_minunit_assert, \ .get_minunit_status = get_minunit_status, \ }; \ const FlipperAppPluginDescriptor app_descriptor = { \ .appid = APPID, \ .ep_api_version = API_VERSION, \ .entry_point = &test_api, \ }; \ const FlipperAppPluginDescriptor* get_api(void) { \ return &app_descriptor; \ } ================================================ FILE: applications/debug/unit_tests/tests/varint/varint_test.c ================================================ #include #include #include "../test.h" // IWYU pragma: keep #include #include MU_TEST(test_varint_basic_u) { mu_assert_int_eq(1, varint_uint32_length(0)); mu_assert_int_eq(5, varint_uint32_length(UINT32_MAX)); uint8_t data[8] = {}; uint32_t out_value; mu_assert_int_eq(1, varint_uint32_pack(0, data)); mu_assert_int_eq(1, varint_uint32_unpack(&out_value, data, 8)); mu_assert_int_eq(0, out_value); mu_assert_int_eq(5, varint_uint32_pack(UINT32_MAX, data)); mu_assert_int_eq(5, varint_uint32_unpack(&out_value, data, 8)); mu_assert_int_eq(UINT32_MAX, out_value); } MU_TEST(test_varint_basic_i) { mu_assert_int_eq(5, varint_int32_length(INT32_MIN / 2)); mu_assert_int_eq(1, varint_int32_length(0)); mu_assert_int_eq(5, varint_int32_length(INT32_MAX / 2)); mu_assert_int_eq(2, varint_int32_length(127)); mu_assert_int_eq(2, varint_int32_length(-127)); uint8_t data[8] = {}; int32_t out_value; mu_assert_int_eq(1, varint_int32_pack(0, data)); mu_assert_int_eq(1, varint_int32_unpack(&out_value, data, 8)); mu_assert_int_eq(0, out_value); mu_assert_int_eq(2, varint_int32_pack(127, data)); mu_assert_int_eq(2, varint_int32_unpack(&out_value, data, 8)); mu_assert_int_eq(127, out_value); mu_assert_int_eq(2, varint_int32_pack(-127, data)); mu_assert_int_eq(2, varint_int32_unpack(&out_value, data, 8)); mu_assert_int_eq(-127, out_value); mu_assert_int_eq(5, varint_int32_pack(INT32_MAX, data)); mu_assert_int_eq(5, varint_int32_unpack(&out_value, data, 8)); mu_assert_int_eq(INT32_MAX, out_value); mu_assert_int_eq(5, varint_int32_pack(INT32_MIN / 2 + 1, data)); mu_assert_int_eq(5, varint_int32_unpack(&out_value, data, 8)); mu_assert_int_eq(INT32_MIN / 2 + 1, out_value); } MU_TEST(test_varint_rand_u) { uint8_t data[8] = {}; uint32_t out_value; for(size_t i = 0; i < 200000; i++) { uint32_t rand_value = rand(); mu_assert_int_eq( varint_uint32_pack(rand_value, data), varint_uint32_unpack(&out_value, data, 8)); mu_assert_int_eq(rand_value, out_value); } } MU_TEST(test_varint_rand_i) { uint8_t data[8] = {}; int32_t out_value; for(size_t i = 0; i < 200000; i++) { int32_t rand_value = rand() + (INT32_MIN / 2 + 1); mu_assert_int_eq( varint_int32_pack(rand_value, data), varint_int32_unpack(&out_value, data, 8)); mu_assert_int_eq(rand_value, out_value); } } MU_TEST_SUITE(test_varint_suite) { MU_RUN_TEST(test_varint_basic_u); MU_RUN_TEST(test_varint_basic_i); MU_RUN_TEST(test_varint_rand_u); MU_RUN_TEST(test_varint_rand_i); } int run_minunit_test_varint(void) { MU_RUN_SUITE(test_varint_suite); return MU_EXIT_CODE; } TEST_API_DEFINE(run_minunit_test_varint) ================================================ FILE: applications/debug/unit_tests/unit_test_api_table.cpp ================================================ #include #include #include "unit_test_api_table_i.h" static_assert(!has_hash_collisions(unit_tests_api_table), "Detected API method hash collision!"); constexpr HashtableApiInterface unit_tests_hashtable_api_interface{ { .api_version_major = 0, .api_version_minor = 0, .resolver_callback = &elf_resolve_from_hashtable, }, unit_tests_api_table.cbegin(), unit_tests_api_table.cend(), }; extern "C" const ElfApiInterface* const unit_tests_api_interface = &unit_tests_hashtable_api_interface; ================================================ FILE: applications/debug/unit_tests/unit_test_api_table_i.h ================================================ #include #include #include #include #include #include #include #include #include #include static constexpr auto unit_tests_api_table = sort(create_array_t( API_METHOD(resource_manifest_reader_alloc, ResourceManifestReader*, (Storage*)), API_METHOD(resource_manifest_reader_free, void, (ResourceManifestReader*)), API_METHOD(resource_manifest_reader_open, bool, (ResourceManifestReader*, const char*)), API_METHOD(resource_manifest_reader_next, ResourceManifestEntry*, (ResourceManifestReader*)), API_METHOD(resource_manifest_reader_previous, ResourceManifestEntry*, (ResourceManifestReader*)), API_METHOD(slix_process_iso15693_3_error, SlixError, (Iso15693_3Error)), API_METHOD(iso15693_3_poller_get_data, const Iso15693_3Data*, (Iso15693_3Poller*)), API_METHOD(rpc_system_storage_get_error, PB_CommandStatus, (FS_Error)), API_METHOD(xQueueSemaphoreTake, BaseType_t, (QueueHandle_t, TickType_t)), API_METHOD( xTaskGenericNotify, BaseType_t, (TaskHandle_t, UBaseType_t, uint32_t, eNotifyAction, uint32_t*)), API_METHOD(xTaskGetCurrentTaskHandle, TaskHandle_t, ()), API_METHOD(vQueueDelete, void, (QueueHandle_t)), API_METHOD( xQueueGenericCreateStatic, QueueHandle_t, (const UBaseType_t, const UBaseType_t, uint8_t*, StaticQueue_t*, const uint8_t)), API_METHOD( xQueueGenericSend, BaseType_t, (QueueHandle_t, const void* const, TickType_t, const BaseType_t)), API_METHOD( js_thread_run, JsThread*, (const char* script_path, JsThreadCallback callback, void* context)), API_METHOD(js_thread_stop, void, (JsThread * worker)), API_METHOD(js_value_buffer_size, size_t, (const JsValueParseDeclaration declaration)), API_METHOD( js_value_parse, JsValueParseStatus, (struct mjs * mjs, const JsValueParseDeclaration declaration, JsValueParseFlag flags, mjs_val_t* buffer, size_t buf_size, mjs_val_t* source, size_t n_c_vals, ...)), API_VARIABLE(PB_Main_msg, PB_Main_msg_t))); ================================================ FILE: applications/debug/unit_tests/unit_tests.c ================================================ #include #include #include #include #include #include "test_runner.h" void unit_tests_cli(PipeSide* pipe, FuriString* args, void* context) { UNUSED(context); TestRunner* test_runner = test_runner_alloc(pipe, args); test_runner_run(test_runner); test_runner_free(test_runner); } void unit_tests_on_system_start(void) { #ifdef SRV_CLI CliRegistry* registry = furi_record_open(RECORD_CLI); cli_registry_add_command( registry, "unit_tests", CliCommandFlagParallelSafe, unit_tests_cli, NULL); furi_record_close(RECORD_CLI); #endif } ================================================ FILE: applications/debug/usb_mouse/application.fam ================================================ App( appid="usb_mouse", name="USB Mouse Demo", apptype=FlipperAppType.DEBUG, entry_point="usb_mouse_app", requires=["gui"], stack_size=1 * 1024, fap_category="Debug", ) ================================================ FILE: applications/debug/usb_mouse/usb_mouse.c ================================================ #include #include #include #include #define MOUSE_MOVE_SHORT 5 #define MOUSE_MOVE_LONG 20 typedef enum { EventTypeInput, } EventType; typedef struct { union { InputEvent input; }; EventType type; } UsbMouseEvent; static void usb_mouse_render_callback(Canvas* canvas, void* ctx) { UNUSED(ctx); canvas_clear(canvas); canvas_set_font(canvas, FontPrimary); canvas_draw_str(canvas, 0, 10, "USB Mouse Demo"); canvas_set_font(canvas, FontSecondary); canvas_draw_str(canvas, 0, 63, "Hold [back] to exit"); } static void usb_mouse_input_callback(InputEvent* input_event, void* ctx) { FuriMessageQueue* event_queue = ctx; UsbMouseEvent event; event.type = EventTypeInput; event.input = *input_event; furi_message_queue_put(event_queue, &event, FuriWaitForever); } int32_t usb_mouse_app(void* p) { UNUSED(p); FuriMessageQueue* event_queue = furi_message_queue_alloc(8, sizeof(UsbMouseEvent)); ViewPort* view_port = view_port_alloc(); FuriHalUsbInterface* usb_mode_prev = furi_hal_usb_get_config(); furi_hal_usb_unlock(); furi_check(furi_hal_usb_set_config(&usb_hid, NULL) == true); view_port_draw_callback_set(view_port, usb_mouse_render_callback, NULL); view_port_input_callback_set(view_port, usb_mouse_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); UsbMouseEvent event; while(1) { FuriStatus event_status = furi_message_queue_get(event_queue, &event, FuriWaitForever); if(event_status == FuriStatusOk) { if(event.type == EventTypeInput) { if(event.input.type == InputTypeLong && event.input.key == InputKeyBack) { break; } if(event.input.type == InputTypeShort && event.input.key == InputKeyBack) { furi_hal_hid_mouse_press(HID_MOUSE_BTN_RIGHT); furi_hal_hid_mouse_release(HID_MOUSE_BTN_RIGHT); } if(event.input.key == InputKeyOk) { if(event.input.type == InputTypePress) { furi_hal_hid_mouse_press(HID_MOUSE_BTN_LEFT); } else if(event.input.type == InputTypeRelease) { furi_hal_hid_mouse_release(HID_MOUSE_BTN_LEFT); } } if(event.input.key == InputKeyRight) { if(event.input.type == InputTypePress) { furi_hal_hid_mouse_move(MOUSE_MOVE_SHORT, 0); } else if(event.input.type == InputTypeRepeat) { furi_hal_hid_mouse_move(MOUSE_MOVE_LONG, 0); } } if(event.input.key == InputKeyLeft) { if(event.input.type == InputTypePress) { furi_hal_hid_mouse_move(-MOUSE_MOVE_SHORT, 0); } else if(event.input.type == InputTypeRepeat) { furi_hal_hid_mouse_move(-MOUSE_MOVE_LONG, 0); } } if(event.input.key == InputKeyDown) { if(event.input.type == InputTypePress) { furi_hal_hid_mouse_move(0, MOUSE_MOVE_SHORT); } else if(event.input.type == InputTypeRepeat) { furi_hal_hid_mouse_move(0, MOUSE_MOVE_LONG); } } if(event.input.key == InputKeyUp) { if(event.input.type == InputTypePress) { furi_hal_hid_mouse_move(0, -MOUSE_MOVE_SHORT); } else if(event.input.type == InputTypeRepeat) { furi_hal_hid_mouse_move(0, -MOUSE_MOVE_LONG); } } } } view_port_update(view_port); } furi_hal_usb_set_config(usb_mode_prev, NULL); // remove & free all stuff created by app gui_remove_view_port(gui, view_port); view_port_free(view_port); furi_message_queue_free(event_queue); return 0; } ================================================ FILE: applications/debug/usb_test/application.fam ================================================ App( appid="usb_test", name="USB Test", apptype=FlipperAppType.DEBUG, entry_point="usb_test_app", requires=["gui"], stack_size=1 * 1024, fap_category="Debug", ) ================================================ FILE: applications/debug/usb_test/usb_test.c ================================================ #include #include #include #include #include #include typedef struct { Gui* gui; ViewDispatcher* view_dispatcher; Submenu* submenu; FuriHalUsbHidConfig hid_cfg; } UsbTestApp; typedef enum { UsbTestSubmenuIndexEnable, UsbTestSubmenuIndexDisable, UsbTestSubmenuIndexRestart, UsbTestSubmenuIndexVcpSingle, UsbTestSubmenuIndexVcpDual, UsbTestSubmenuIndexHid, UsbTestSubmenuIndexHidWithParams, UsbTestSubmenuIndexHidU2F, } SubmenuIndex; void usb_test_submenu_callback(void* context, uint32_t index) { furi_assert(context); UsbTestApp* app = context; if(index == UsbTestSubmenuIndexEnable) { furi_hal_usb_enable(); } else if(index == UsbTestSubmenuIndexDisable) { furi_hal_usb_disable(); } else if(index == UsbTestSubmenuIndexRestart) { furi_hal_usb_reinit(); } else if(index == UsbTestSubmenuIndexVcpSingle) { furi_hal_usb_set_config(&usb_cdc_single, NULL); } else if(index == UsbTestSubmenuIndexVcpDual) { furi_hal_usb_set_config(&usb_cdc_dual, NULL); } else if(index == UsbTestSubmenuIndexHid) { furi_hal_usb_set_config(&usb_hid, NULL); } else if(index == UsbTestSubmenuIndexHidWithParams) { app->hid_cfg.vid = 0x1234; app->hid_cfg.pid = 0xabcd; strlcpy(app->hid_cfg.manuf, "WEN", sizeof(app->hid_cfg.manuf)); strlcpy(app->hid_cfg.product, "FLIP", sizeof(app->hid_cfg.product)); furi_hal_usb_set_config(&usb_hid, &app->hid_cfg); } else if(index == UsbTestSubmenuIndexHidU2F) { furi_hal_usb_set_config(&usb_hid_u2f, NULL); } } uint32_t usb_test_exit(void* context) { UNUSED(context); return VIEW_NONE; } UsbTestApp* usb_test_app_alloc(void) { UsbTestApp* app = malloc(sizeof(UsbTestApp)); // Gui app->gui = furi_record_open(RECORD_GUI); // View dispatcher app->view_dispatcher = view_dispatcher_alloc(); view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); // Views app->submenu = submenu_alloc(); submenu_add_item( app->submenu, "Enable", UsbTestSubmenuIndexEnable, usb_test_submenu_callback, app); submenu_add_item( app->submenu, "Disable", UsbTestSubmenuIndexDisable, usb_test_submenu_callback, app); submenu_add_item( app->submenu, "Restart", UsbTestSubmenuIndexRestart, usb_test_submenu_callback, app); submenu_add_item( app->submenu, "Single VCP", UsbTestSubmenuIndexVcpSingle, usb_test_submenu_callback, app); submenu_add_item( app->submenu, "Dual VCP", UsbTestSubmenuIndexVcpDual, usb_test_submenu_callback, app); submenu_add_item( app->submenu, "HID KB+Mouse", UsbTestSubmenuIndexHid, usb_test_submenu_callback, app); submenu_add_item( app->submenu, "HID KB+Mouse custom ID", UsbTestSubmenuIndexHidWithParams, usb_test_submenu_callback, app); submenu_add_item( app->submenu, "HID U2F", UsbTestSubmenuIndexHidU2F, usb_test_submenu_callback, app); view_set_previous_callback(submenu_get_view(app->submenu), usb_test_exit); view_dispatcher_add_view(app->view_dispatcher, 0, submenu_get_view(app->submenu)); // Switch to menu view_dispatcher_switch_to_view(app->view_dispatcher, 0); return app; } void usb_test_app_free(UsbTestApp* app) { furi_assert(app); // Free views view_dispatcher_remove_view(app->view_dispatcher, 0); submenu_free(app->submenu); view_dispatcher_free(app->view_dispatcher); // Close gui record furi_record_close(RECORD_GUI); app->gui = NULL; // Free rest free(app); } int32_t usb_test_app(void* p) { UNUSED(p); UsbTestApp* app = usb_test_app_alloc(); view_dispatcher_run(app->view_dispatcher); usb_test_app_free(app); return 0; } ================================================ FILE: applications/debug/vibro_test/application.fam ================================================ App( appid="vibro_test", name="Vibro Test", apptype=FlipperAppType.DEBUG, entry_point="vibro_test_app", requires=["gui"], stack_size=1 * 1024, fap_category="Debug", ) ================================================ FILE: applications/debug/vibro_test/vibro_test.c ================================================ #include #include #include #include #include void vibro_test_draw_callback(Canvas* canvas, void* ctx) { UNUSED(ctx); canvas_clear(canvas); canvas_set_font(canvas, FontPrimary); canvas_draw_str(canvas, 2, 10, "Vibro application"); canvas_set_font(canvas, FontSecondary); canvas_draw_str(canvas, 2, 22, "Press OK turns on vibro"); canvas_set_font(canvas, FontSecondary); canvas_draw_str(canvas, 2, 34, "Release OK turns off vibro"); } void vibro_test_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 vibro_test_app(void* p) { UNUSED(p); FuriMessageQueue* event_queue = furi_message_queue_alloc(8, sizeof(InputEvent)); // Configure view port ViewPort* view_port = view_port_alloc(); view_port_draw_callback_set(view_port, vibro_test_draw_callback, NULL); view_port_input_callback_set(view_port, vibro_test_input_callback, event_queue); // Register view port in GUI Gui* gui = furi_record_open(RECORD_GUI); gui_add_view_port(gui, view_port, GuiLayerFullscreen); NotificationApp* notification = furi_record_open(RECORD_NOTIFICATION); InputEvent event; while(furi_message_queue_get(event_queue, &event, FuriWaitForever) == FuriStatusOk) { if(event.type == InputTypeShort && event.key == InputKeyBack) { notification_message(notification, &sequence_reset_vibro); notification_message(notification, &sequence_reset_green); break; } if(event.key == InputKeyOk) { if(event.type == InputTypePress) { notification_message(notification, &sequence_set_vibro_on); notification_message(notification, &sequence_set_green_255); } else if(event.type == InputTypeRelease) { notification_message(notification, &sequence_reset_vibro); notification_message(notification, &sequence_reset_green); } } } gui_remove_view_port(gui, view_port); view_port_free(view_port); furi_message_queue_free(event_queue); furi_record_close(RECORD_NOTIFICATION); furi_record_close(RECORD_GUI); return 0; } ================================================ FILE: applications/drivers/application.fam ================================================ # Placeholder App( appid="drivers", name="Drivers device", apptype=FlipperAppType.METAPACKAGE, ) ================================================ FILE: applications/drivers/subghz/application.fam ================================================ App( appid="radio_device_cc1101_ext", apptype=FlipperAppType.PLUGIN, targets=["f7"], entry_point="subghz_device_cc1101_ext_ep", requires=["subghz"], sdk_headers=["cc1101_ext/cc1101_ext_interconnect.h"], fap_libs=["hwdrivers"], ) ================================================ FILE: applications/drivers/subghz/cc1101_ext/cc1101_ext.c ================================================ #include "cc1101_ext.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #define TAG "SubGhzDeviceCc1101Ext" #define SUBGHZ_DEVICE_CC1101_EXT_TX_GPIO (&gpio_ext_pb2) /* DMA Channels definition */ #define SUBGHZ_DEVICE_CC1101_EXT_DMA (DMA2) #define SUBGHZ_DEVICE_CC1101_EXT_DMA_CH3_CHANNEL (LL_DMA_CHANNEL_3) #define SUBGHZ_DEVICE_CC1101_EXT_DMA_CH4_CHANNEL (LL_DMA_CHANNEL_4) #define SUBGHZ_DEVICE_CC1101_EXT_DMA_CH5_CHANNEL (LL_DMA_CHANNEL_5) #define SUBGHZ_DEVICE_CC1101_EXT_DMA_CH3_IRQ (FuriHalInterruptIdDma2Ch3) #define SUBGHZ_DEVICE_CC1101_EXT_DMA_CH3_DEF \ SUBGHZ_DEVICE_CC1101_EXT_DMA, SUBGHZ_DEVICE_CC1101_EXT_DMA_CH3_CHANNEL #define SUBGHZ_DEVICE_CC1101_EXT_DMA_CH4_DEF \ SUBGHZ_DEVICE_CC1101_EXT_DMA, SUBGHZ_DEVICE_CC1101_EXT_DMA_CH4_CHANNEL #define SUBGHZ_DEVICE_CC1101_EXT_DMA_CH5_DEF \ SUBGHZ_DEVICE_CC1101_EXT_DMA, SUBGHZ_DEVICE_CC1101_EXT_DMA_CH5_CHANNEL /** Low level buffer dimensions and guard times */ #define SUBGHZ_DEVICE_CC1101_EXT_ASYNC_TX_BUFFER_FULL (256u) #define SUBGHZ_DEVICE_CC1101_EXT_ASYNC_TX_BUFFER_HALF \ (SUBGHZ_DEVICE_CC1101_EXT_ASYNC_TX_BUFFER_FULL / 2) #define SUBGHZ_DEVICE_CC1101_EXT_ASYNC_TX_GUARD_TIME (999u >> 1) /** SubGhz state */ typedef enum { SubGhzDeviceCC1101ExtStateInit, /**< Init pending */ SubGhzDeviceCC1101ExtStateIdle, /**< Idle, energy save mode */ SubGhzDeviceCC1101ExtStateAsyncRx, /**< Async RX started */ SubGhzDeviceCC1101ExtStateAsyncTx, /**< Async TX started, DMA and timer is on */ } SubGhzDeviceCC1101ExtState; /** SubGhz regulation, receive transmission on the current frequency for the * region */ typedef enum { SubGhzDeviceCC1101ExtRegulationOnlyRx, /**only Rx*/ SubGhzDeviceCC1101ExtRegulationTxRx, /**TxRx*/ } SubGhzDeviceCC1101ExtRegulation; typedef enum { SubGhzDeviceCC1101ExtAsyncTxMiddlewareStateIdle, SubGhzDeviceCC1101ExtAsyncTxMiddlewareStateReset, SubGhzDeviceCC1101ExtAsyncTxMiddlewareStateRun, } SubGhzDeviceCC1101ExtAsyncTxMiddlewareState; typedef struct { SubGhzDeviceCC1101ExtAsyncTxMiddlewareState state; bool is_odd_level; uint32_t adder_duration; } SubGhzDeviceCC1101ExtAsyncTxMiddleware; typedef struct { uint32_t* buffer; SubGhzDeviceCC1101ExtCallback callback; void* callback_context; uint32_t gpio_tx_buff[2]; uint32_t debug_gpio_buff[2]; SubGhzDeviceCC1101ExtAsyncTxMiddleware middleware; } SubGhzDeviceCC1101ExtAsyncTx; typedef struct { uint32_t capture_delta_duration; SubGhzDeviceCC1101ExtCaptureCallback capture_callback; void* capture_callback_context; } SubGhzDeviceCC1101ExtAsyncRx; typedef struct { volatile SubGhzDeviceCC1101ExtState state; volatile SubGhzDeviceCC1101ExtRegulation regulation; const GpioPin* async_mirror_pin; const FuriHalSpiBusHandle* spi_bus_handle; const GpioPin* g0_pin; SubGhzDeviceCC1101ExtAsyncTx async_tx; SubGhzDeviceCC1101ExtAsyncRx async_rx; } SubGhzDeviceCC1101Ext; static SubGhzDeviceCC1101Ext* subghz_device_cc1101_ext = NULL; static bool subghz_device_cc1101_ext_check_init(void) { furi_assert(subghz_device_cc1101_ext->state == SubGhzDeviceCC1101ExtStateInit); subghz_device_cc1101_ext->state = SubGhzDeviceCC1101ExtStateIdle; bool ret = false; CC1101Status cc1101_status = {0}; furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle); FuriHalCortexTimer timer = furi_hal_cortex_timer_get(100 * 1000); do { // Reset furi_hal_gpio_init( subghz_device_cc1101_ext->g0_pin, GpioModeAnalog, GpioPullNo, GpioSpeedLow); furi_hal_gpio_init( subghz_device_cc1101_ext->spi_bus_handle->miso, GpioModeInput, GpioPullUp, GpioSpeedLow); cc1101_status = cc1101_reset(subghz_device_cc1101_ext->spi_bus_handle); if(cc1101_status.CHIP_RDYn != 0) { //timeout or error break; } cc1101_status = cc1101_write_reg( subghz_device_cc1101_ext->spi_bus_handle, CC1101_IOCFG0, CC1101IocfgHighImpedance); if(cc1101_status.CHIP_RDYn != 0) { //timeout or error break; } // Prepare GD0 for power on self test furi_hal_gpio_init( subghz_device_cc1101_ext->g0_pin, GpioModeInput, GpioPullUp, GpioSpeedLow); // GD0 low cc1101_status = cc1101_write_reg( subghz_device_cc1101_ext->spi_bus_handle, CC1101_IOCFG0, CC1101IocfgHW); if(cc1101_status.CHIP_RDYn != 0) { //timeout or error break; } while(furi_hal_gpio_read(subghz_device_cc1101_ext->g0_pin) != false) { if(furi_hal_cortex_timer_is_expired(timer)) { //timeout break; } } if(furi_hal_cortex_timer_is_expired(timer)) { //timeout break; } // GD0 high furi_hal_gpio_init( subghz_device_cc1101_ext->g0_pin, GpioModeInput, GpioPullDown, GpioSpeedLow); cc1101_status = cc1101_write_reg( subghz_device_cc1101_ext->spi_bus_handle, CC1101_IOCFG0, CC1101IocfgHW | CC1101_IOCFG_INV); if(cc1101_status.CHIP_RDYn != 0) { //timeout or error break; } while(furi_hal_gpio_read(subghz_device_cc1101_ext->g0_pin) != true) { if(furi_hal_cortex_timer_is_expired(timer)) { //timeout break; } } if(furi_hal_cortex_timer_is_expired(timer)) { //timeout break; } // Reset GD0 to floating state cc1101_status = cc1101_write_reg( subghz_device_cc1101_ext->spi_bus_handle, CC1101_IOCFG0, CC1101IocfgHighImpedance); if(cc1101_status.CHIP_RDYn != 0) { //timeout or error break; } furi_hal_gpio_init( subghz_device_cc1101_ext->g0_pin, GpioModeAnalog, GpioPullNo, GpioSpeedLow); // Reset GDO2 (!TX/RX) to floating state cc1101_status = cc1101_write_reg( subghz_device_cc1101_ext->spi_bus_handle, CC1101_IOCFG2, CC1101IocfgHighImpedance); if(cc1101_status.CHIP_RDYn != 0) { //timeout or error break; } // Go to sleep cc1101_status = cc1101_shutdown(subghz_device_cc1101_ext->spi_bus_handle); if(cc1101_status.CHIP_RDYn != 0) { //timeout or error break; } ret = true; } while(false); furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle); if(ret) { FURI_LOG_I(TAG, "Init OK"); } else { FURI_LOG_E(TAG, "Init failed"); furi_hal_gpio_init( subghz_device_cc1101_ext->g0_pin, GpioModeAnalog, GpioPullNo, GpioSpeedLow); } return ret; } bool subghz_device_cc1101_ext_alloc(void) { furi_assert(subghz_device_cc1101_ext == NULL); subghz_device_cc1101_ext = malloc(sizeof(SubGhzDeviceCC1101Ext)); subghz_device_cc1101_ext->state = SubGhzDeviceCC1101ExtStateInit; subghz_device_cc1101_ext->regulation = SubGhzDeviceCC1101ExtRegulationTxRx; subghz_device_cc1101_ext->async_mirror_pin = NULL; subghz_device_cc1101_ext->spi_bus_handle = &furi_hal_spi_bus_handle_external; subghz_device_cc1101_ext->g0_pin = SUBGHZ_DEVICE_CC1101_EXT_TX_GPIO; subghz_device_cc1101_ext->async_rx.capture_delta_duration = 0; furi_hal_spi_bus_handle_init(subghz_device_cc1101_ext->spi_bus_handle); return subghz_device_cc1101_ext_check_init(); } void subghz_device_cc1101_ext_free(void) { furi_assert(subghz_device_cc1101_ext != NULL); furi_hal_spi_bus_handle_deinit(subghz_device_cc1101_ext->spi_bus_handle); free(subghz_device_cc1101_ext); subghz_device_cc1101_ext = NULL; } void subghz_device_cc1101_ext_set_async_mirror_pin(const GpioPin* pin) { subghz_device_cc1101_ext->async_mirror_pin = pin; } const GpioPin* subghz_device_cc1101_ext_get_data_gpio(void) { return subghz_device_cc1101_ext->g0_pin; } bool subghz_device_cc1101_ext_is_connect(void) { bool ret = false; if(subghz_device_cc1101_ext == NULL) { // not initialized ret = subghz_device_cc1101_ext_alloc(); subghz_device_cc1101_ext_free(); } else { // initialized furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle); uint8_t partnumber = cc1101_get_partnumber(subghz_device_cc1101_ext->spi_bus_handle); furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle); ret = (partnumber != 0) && (partnumber != 0xFF); } return ret; } void subghz_device_cc1101_ext_sleep(void) { furi_assert(subghz_device_cc1101_ext->state == SubGhzDeviceCC1101ExtStateIdle); furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle); cc1101_switch_to_idle(subghz_device_cc1101_ext->spi_bus_handle); cc1101_write_reg( subghz_device_cc1101_ext->spi_bus_handle, CC1101_IOCFG0, CC1101IocfgHighImpedance); furi_hal_gpio_init(subghz_device_cc1101_ext->g0_pin, GpioModeAnalog, GpioPullNo, GpioSpeedLow); cc1101_shutdown(subghz_device_cc1101_ext->spi_bus_handle); furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle); } void subghz_device_cc1101_ext_dump_state(void) { furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle); printf( "[subghz_device_cc1101_ext] cc1101 chip %d, version %d\r\n", cc1101_get_partnumber(subghz_device_cc1101_ext->spi_bus_handle), cc1101_get_version(subghz_device_cc1101_ext->spi_bus_handle)); furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle); } void subghz_device_cc1101_ext_load_custom_preset(const uint8_t* preset_data) { //load config subghz_device_cc1101_ext_reset(); furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle); uint32_t i = 0; uint8_t pa[8] = {0}; while(preset_data[i]) { cc1101_write_reg( subghz_device_cc1101_ext->spi_bus_handle, preset_data[i], preset_data[i + 1]); i += 2; } furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle); //load pa table memcpy(&pa[0], &preset_data[i + 2], 8); subghz_device_cc1101_ext_load_patable(pa); //show debug if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) { i = 0; FURI_LOG_D(TAG, "Loading custom preset"); while(preset_data[i]) { FURI_LOG_D(TAG, "Reg[%lu]: %02X=%02X", i, preset_data[i], preset_data[i + 1]); i += 2; } for(uint8_t y = i; y < i + 10; y++) { FURI_LOG_D(TAG, "PA[%u]: %02X", y, preset_data[y]); } } } void subghz_device_cc1101_ext_load_registers(const uint8_t* data) { subghz_device_cc1101_ext_reset(); furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle); uint32_t i = 0; while(data[i]) { cc1101_write_reg(subghz_device_cc1101_ext->spi_bus_handle, data[i], data[i + 1]); i += 2; } furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle); } void subghz_device_cc1101_ext_load_patable(const uint8_t data[8]) { furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle); cc1101_set_pa_table(subghz_device_cc1101_ext->spi_bus_handle, data); furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle); } void subghz_device_cc1101_ext_write_packet(const uint8_t* data, uint8_t size) { furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle); cc1101_flush_tx(subghz_device_cc1101_ext->spi_bus_handle); cc1101_write_reg(subghz_device_cc1101_ext->spi_bus_handle, CC1101_FIFO, size); cc1101_write_fifo(subghz_device_cc1101_ext->spi_bus_handle, data, size); furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle); } void subghz_device_cc1101_ext_flush_rx(void) { furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle); cc1101_flush_rx(subghz_device_cc1101_ext->spi_bus_handle); furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle); } void subghz_device_cc1101_ext_flush_tx(void) { furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle); cc1101_flush_tx(subghz_device_cc1101_ext->spi_bus_handle); furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle); } bool subghz_device_cc1101_ext_rx_pipe_not_empty(void) { CC1101RxBytes status[1]; furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle); cc1101_read_reg( subghz_device_cc1101_ext->spi_bus_handle, (CC1101_STATUS_RXBYTES) | CC1101_BURST, (uint8_t*)status); furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle); if(status->NUM_RXBYTES > 0) { return true; } else { return false; } } bool subghz_device_cc1101_ext_is_rx_data_crc_valid(void) { furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle); uint8_t data[1]; cc1101_read_reg( subghz_device_cc1101_ext->spi_bus_handle, CC1101_STATUS_LQI | CC1101_BURST, data); furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle); if((data[0] >> 7) & 0x01) { return true; } else { return false; } } void subghz_device_cc1101_ext_read_packet(uint8_t* data, uint8_t* size) { furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle); cc1101_read_fifo(subghz_device_cc1101_ext->spi_bus_handle, data, size); furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle); } void subghz_device_cc1101_ext_shutdown(void) { furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle); // Reset and shutdown cc1101_shutdown(subghz_device_cc1101_ext->spi_bus_handle); furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle); } void subghz_device_cc1101_ext_reset(void) { furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle); furi_hal_gpio_init(subghz_device_cc1101_ext->g0_pin, GpioModeAnalog, GpioPullNo, GpioSpeedLow); cc1101_switch_to_idle(subghz_device_cc1101_ext->spi_bus_handle); cc1101_reset(subghz_device_cc1101_ext->spi_bus_handle); // Warning: push pull cc1101 clock output on GD0 cc1101_write_reg( subghz_device_cc1101_ext->spi_bus_handle, CC1101_IOCFG0, CC1101IocfgHighImpedance); // Reset GDO2 (!TX/RX) to floating state cc1101_write_reg( subghz_device_cc1101_ext->spi_bus_handle, CC1101_IOCFG2, CC1101IocfgHighImpedance); furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle); } void subghz_device_cc1101_ext_idle(void) { furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle); cc1101_switch_to_idle(subghz_device_cc1101_ext->spi_bus_handle); //waiting for the chip to switch to IDLE mode furi_check(cc1101_wait_status_state( subghz_device_cc1101_ext->spi_bus_handle, CC1101StateIDLE, 10000)); // Reset GDO2 (!TX/RX) to floating state cc1101_write_reg( subghz_device_cc1101_ext->spi_bus_handle, CC1101_IOCFG2, CC1101IocfgHighImpedance); furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle); } void subghz_device_cc1101_ext_rx(void) { furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle); cc1101_switch_to_rx(subghz_device_cc1101_ext->spi_bus_handle); //waiting for the chip to switch to Rx mode furi_check( cc1101_wait_status_state(subghz_device_cc1101_ext->spi_bus_handle, CC1101StateRX, 10000)); // Go GDO2 (!TX/RX) to high (RX state) cc1101_write_reg( subghz_device_cc1101_ext->spi_bus_handle, CC1101_IOCFG2, CC1101IocfgHW | CC1101_IOCFG_INV); furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle); } bool subghz_device_cc1101_ext_tx(void) { if(subghz_device_cc1101_ext->regulation != SubGhzDeviceCC1101ExtRegulationTxRx) return false; furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle); cc1101_switch_to_tx(subghz_device_cc1101_ext->spi_bus_handle); //waiting for the chip to switch to Tx mode furi_check( cc1101_wait_status_state(subghz_device_cc1101_ext->spi_bus_handle, CC1101StateTX, 10000)); // Go GDO2 (!TX/RX) to low (TX state) cc1101_write_reg(subghz_device_cc1101_ext->spi_bus_handle, CC1101_IOCFG2, CC1101IocfgHW); furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle); return true; } float subghz_device_cc1101_ext_get_rssi(void) { furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle); int32_t rssi_dec = cc1101_get_rssi(subghz_device_cc1101_ext->spi_bus_handle); furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle); float rssi = rssi_dec; if(rssi_dec >= 128) { rssi = ((rssi - 256.0f) / 2.0f) - 74.0f; } else { rssi = (rssi / 2.0f) - 74.0f; } return rssi; } uint8_t subghz_device_cc1101_ext_get_lqi(void) { furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle); uint8_t data[1]; cc1101_read_reg( subghz_device_cc1101_ext->spi_bus_handle, CC1101_STATUS_LQI | CC1101_BURST, data); furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle); return data[0] & 0x7F; } bool subghz_device_cc1101_ext_is_frequency_valid(uint32_t value) { if(!(value >= 299999755 && value <= 348000335) && !(value >= 386999938 && value <= 464000000) && !(value >= 778999847 && value <= 928000000)) { return false; } return true; } uint32_t subghz_device_cc1101_ext_set_frequency(uint32_t value) { if(furi_hal_region_is_frequency_allowed(value)) { subghz_device_cc1101_ext->regulation = SubGhzDeviceCC1101ExtRegulationTxRx; } else { subghz_device_cc1101_ext->regulation = SubGhzDeviceCC1101ExtRegulationOnlyRx; } furi_hal_spi_acquire(subghz_device_cc1101_ext->spi_bus_handle); uint32_t real_frequency = cc1101_set_frequency(subghz_device_cc1101_ext->spi_bus_handle, value); cc1101_calibrate(subghz_device_cc1101_ext->spi_bus_handle); while(true) { CC1101Status status = cc1101_get_status(subghz_device_cc1101_ext->spi_bus_handle); if(status.STATE == CC1101StateIDLE) break; } furi_hal_spi_release(subghz_device_cc1101_ext->spi_bus_handle); return real_frequency; } static bool subghz_device_cc1101_ext_start_debug(void) { bool ret = false; if(subghz_device_cc1101_ext->async_mirror_pin != NULL) { furi_hal_gpio_init( subghz_device_cc1101_ext->async_mirror_pin, GpioModeOutputPushPull, GpioPullNo, GpioSpeedVeryHigh); ret = true; } return ret; } static bool subghz_device_cc1101_ext_stop_debug(void) { bool ret = false; if(subghz_device_cc1101_ext->async_mirror_pin != NULL) { furi_hal_gpio_init( subghz_device_cc1101_ext->async_mirror_pin, GpioModeAnalog, GpioPullNo, GpioSpeedLow); ret = true; } return ret; } static void subghz_device_cc1101_ext_capture_ISR(void* context) { UNUSED(context); if(!furi_hal_gpio_read(subghz_device_cc1101_ext->g0_pin)) { if(subghz_device_cc1101_ext->async_rx.capture_callback) { if(subghz_device_cc1101_ext->async_mirror_pin != NULL) furi_hal_gpio_write(subghz_device_cc1101_ext->async_mirror_pin, false); subghz_device_cc1101_ext->async_rx.capture_callback( true, LL_TIM_GetCounter(TIM17) << 1, (void*)subghz_device_cc1101_ext->async_rx.capture_callback_context); } } else { if(subghz_device_cc1101_ext->async_rx.capture_callback) { if(subghz_device_cc1101_ext->async_mirror_pin != NULL) furi_hal_gpio_write(subghz_device_cc1101_ext->async_mirror_pin, true); subghz_device_cc1101_ext->async_rx.capture_callback( false, LL_TIM_GetCounter(TIM17) << 1, (void*)subghz_device_cc1101_ext->async_rx.capture_callback_context); } } LL_TIM_SetCounter(TIM17, 4); //8>>1 } void subghz_device_cc1101_ext_start_async_rx( SubGhzDeviceCC1101ExtCaptureCallback callback, void* context) { furi_assert(subghz_device_cc1101_ext->state == SubGhzDeviceCC1101ExtStateIdle); subghz_device_cc1101_ext->state = SubGhzDeviceCC1101ExtStateAsyncRx; subghz_device_cc1101_ext->async_rx.capture_callback = callback; subghz_device_cc1101_ext->async_rx.capture_callback_context = context; furi_hal_bus_enable(FuriHalBusTIM17); // Configure TIM LL_TIM_InitTypeDef TIM_InitStruct = {0}; //Set the timer resolution to 2 us TIM_InitStruct.Prescaler = (64 << 1) - 1; TIM_InitStruct.CounterMode = LL_TIM_COUNTERMODE_UP; TIM_InitStruct.Autoreload = 0xFFFF; TIM_InitStruct.ClockDivision = LL_TIM_CLOCKDIVISION_DIV1; LL_TIM_Init(TIM17, &TIM_InitStruct); // Timer: advanced LL_TIM_SetClockSource(TIM17, LL_TIM_CLOCKSOURCE_INTERNAL); LL_TIM_DisableARRPreload(TIM17); LL_TIM_DisableDMAReq_TRIG(TIM17); LL_TIM_DisableIT_TRIG(TIM17); furi_hal_gpio_init( subghz_device_cc1101_ext->g0_pin, GpioModeInterruptRiseFall, GpioPullUp, GpioSpeedVeryHigh); furi_hal_gpio_remove_int_callback(subghz_device_cc1101_ext->g0_pin); furi_hal_gpio_add_int_callback( subghz_device_cc1101_ext->g0_pin, subghz_device_cc1101_ext_capture_ISR, subghz_device_cc1101_ext->async_rx.capture_callback); // Start timer LL_TIM_SetCounter(TIM17, 0); LL_TIM_EnableCounter(TIM17); // Start debug subghz_device_cc1101_ext_start_debug(); // Switch to RX subghz_device_cc1101_ext_rx(); //Clear the variable after the end of the session subghz_device_cc1101_ext->async_rx.capture_delta_duration = 0; } void subghz_device_cc1101_ext_stop_async_rx(void) { furi_assert(subghz_device_cc1101_ext->state == SubGhzDeviceCC1101ExtStateAsyncRx); subghz_device_cc1101_ext->state = SubGhzDeviceCC1101ExtStateIdle; // Shutdown radio subghz_device_cc1101_ext_idle(); FURI_CRITICAL_ENTER(); furi_hal_bus_disable(FuriHalBusTIM17); // Stop debug subghz_device_cc1101_ext_stop_debug(); FURI_CRITICAL_EXIT(); furi_hal_gpio_remove_int_callback(subghz_device_cc1101_ext->g0_pin); furi_hal_gpio_init(subghz_device_cc1101_ext->g0_pin, GpioModeAnalog, GpioPullNo, GpioSpeedLow); } void subghz_device_cc1101_ext_async_tx_middleware_idle( SubGhzDeviceCC1101ExtAsyncTxMiddleware* middleware) { middleware->state = SubGhzDeviceCC1101ExtAsyncTxMiddlewareStateIdle; middleware->is_odd_level = false; middleware->adder_duration = SUBGHZ_DEVICE_CC1101_EXT_ASYNC_TX_GUARD_TIME; } static inline uint32_t subghz_device_cc1101_ext_async_tx_middleware_get_duration( SubGhzDeviceCC1101ExtAsyncTxMiddleware* middleware, SubGhzDeviceCC1101ExtCallback callback) { uint32_t ret = 0; bool is_level = false; if(middleware->state == SubGhzDeviceCC1101ExtAsyncTxMiddlewareStateReset) return 0; while(1) { LevelDuration ld = callback(subghz_device_cc1101_ext->async_tx.callback_context); if(level_duration_is_reset(ld)) { middleware->state = SubGhzDeviceCC1101ExtAsyncTxMiddlewareStateReset; if(!middleware->is_odd_level) { return 0; } else { return middleware->adder_duration; } } else if(level_duration_is_wait(ld)) { middleware->is_odd_level = !middleware->is_odd_level; ret = middleware->adder_duration + SUBGHZ_DEVICE_CC1101_EXT_ASYNC_TX_GUARD_TIME; middleware->adder_duration = 0; return ret; } is_level = level_duration_get_level(ld); if(middleware->state == SubGhzDeviceCC1101ExtAsyncTxMiddlewareStateIdle) { if(is_level != middleware->is_odd_level) { middleware->state = SubGhzDeviceCC1101ExtAsyncTxMiddlewareStateRun; middleware->is_odd_level = is_level; middleware->adder_duration = level_duration_get_duration(ld); return SUBGHZ_DEVICE_CC1101_EXT_ASYNC_TX_GUARD_TIME; } else { continue; } } if(middleware->state == SubGhzDeviceCC1101ExtAsyncTxMiddlewareStateRun) { if(is_level == middleware->is_odd_level) { middleware->adder_duration += level_duration_get_duration(ld); continue; } else { middleware->is_odd_level = is_level; ret = middleware->adder_duration; middleware->adder_duration = level_duration_get_duration(ld); return ret; } } } } static void subghz_device_cc1101_ext_async_tx_refill(uint32_t* buffer, size_t samples) { furi_assert(subghz_device_cc1101_ext->state == SubGhzDeviceCC1101ExtStateAsyncTx); while(samples > 0) { volatile uint32_t duration = subghz_device_cc1101_ext_async_tx_middleware_get_duration( &subghz_device_cc1101_ext->async_tx.middleware, subghz_device_cc1101_ext->async_tx.callback); if(duration == 0) { *buffer = 0; buffer++; samples--; LL_DMA_DisableIT_HT(SUBGHZ_DEVICE_CC1101_EXT_DMA_CH3_DEF); LL_DMA_DisableIT_TC(SUBGHZ_DEVICE_CC1101_EXT_DMA_CH3_DEF); if(LL_DMA_IsActiveFlag_HT3(SUBGHZ_DEVICE_CC1101_EXT_DMA)) { LL_DMA_ClearFlag_HT3(SUBGHZ_DEVICE_CC1101_EXT_DMA); } if(LL_DMA_IsActiveFlag_TC3(SUBGHZ_DEVICE_CC1101_EXT_DMA)) { LL_DMA_ClearFlag_TC3(SUBGHZ_DEVICE_CC1101_EXT_DMA); } break; } else { // Lowest possible value is 4us if(duration < 4) duration = 4; // Divide by 2 since timer resolution is 2us // Subtract 1 since we counting from 0 *buffer = (duration >> 1) - 1; buffer++; samples--; } } } static void subghz_device_cc1101_ext_async_tx_dma_isr(void* context) { UNUSED(context); furi_assert(subghz_device_cc1101_ext->state == SubGhzDeviceCC1101ExtStateAsyncTx); #if SUBGHZ_DEVICE_CC1101_EXT_DMA_CH3_CHANNEL == LL_DMA_CHANNEL_3 if(LL_DMA_IsActiveFlag_HT3(SUBGHZ_DEVICE_CC1101_EXT_DMA)) { LL_DMA_ClearFlag_HT3(SUBGHZ_DEVICE_CC1101_EXT_DMA); subghz_device_cc1101_ext_async_tx_refill( subghz_device_cc1101_ext->async_tx.buffer, SUBGHZ_DEVICE_CC1101_EXT_ASYNC_TX_BUFFER_HALF); } if(LL_DMA_IsActiveFlag_TC3(SUBGHZ_DEVICE_CC1101_EXT_DMA)) { LL_DMA_ClearFlag_TC3(SUBGHZ_DEVICE_CC1101_EXT_DMA); subghz_device_cc1101_ext_async_tx_refill( subghz_device_cc1101_ext->async_tx.buffer + SUBGHZ_DEVICE_CC1101_EXT_ASYNC_TX_BUFFER_HALF, SUBGHZ_DEVICE_CC1101_EXT_ASYNC_TX_BUFFER_HALF); } #else #error Update this code. Would you kindly? #endif } bool subghz_device_cc1101_ext_start_async_tx(SubGhzDeviceCC1101ExtCallback callback, void* context) { furi_assert(subghz_device_cc1101_ext->state == SubGhzDeviceCC1101ExtStateIdle); furi_assert(callback); //If transmission is prohibited by regional settings if(subghz_device_cc1101_ext->regulation != SubGhzDeviceCC1101ExtRegulationTxRx) return false; subghz_device_cc1101_ext->async_tx.callback = callback; subghz_device_cc1101_ext->async_tx.callback_context = context; subghz_device_cc1101_ext->state = SubGhzDeviceCC1101ExtStateAsyncTx; subghz_device_cc1101_ext->async_tx.buffer = malloc(SUBGHZ_DEVICE_CC1101_EXT_ASYNC_TX_BUFFER_FULL * sizeof(uint32_t)); //Signal generation with mem-to-mem DMA furi_hal_gpio_write(subghz_device_cc1101_ext->g0_pin, false); furi_hal_gpio_init( subghz_device_cc1101_ext->g0_pin, GpioModeOutputPushPull, GpioPullNo, GpioSpeedVeryHigh); // Configure DMA update timer LL_DMA_SetMemoryAddress( SUBGHZ_DEVICE_CC1101_EXT_DMA_CH3_DEF, (uint32_t)subghz_device_cc1101_ext->async_tx.buffer); LL_DMA_SetPeriphAddress(SUBGHZ_DEVICE_CC1101_EXT_DMA_CH3_DEF, (uint32_t) & (TIM17->ARR)); LL_DMA_ConfigTransfer( SUBGHZ_DEVICE_CC1101_EXT_DMA_CH3_DEF, LL_DMA_DIRECTION_MEMORY_TO_PERIPH | LL_DMA_MODE_CIRCULAR | LL_DMA_PERIPH_NOINCREMENT | LL_DMA_MEMORY_INCREMENT | LL_DMA_PDATAALIGN_WORD | LL_DMA_MDATAALIGN_WORD | LL_DMA_PRIORITY_VERYHIGH); LL_DMA_SetDataLength( SUBGHZ_DEVICE_CC1101_EXT_DMA_CH3_DEF, SUBGHZ_DEVICE_CC1101_EXT_ASYNC_TX_BUFFER_FULL); LL_DMA_SetPeriphRequest(SUBGHZ_DEVICE_CC1101_EXT_DMA_CH3_DEF, LL_DMAMUX_REQ_TIM17_UP); LL_DMA_EnableIT_TC(SUBGHZ_DEVICE_CC1101_EXT_DMA_CH3_DEF); LL_DMA_EnableIT_HT(SUBGHZ_DEVICE_CC1101_EXT_DMA_CH3_DEF); LL_DMA_EnableChannel(SUBGHZ_DEVICE_CC1101_EXT_DMA_CH3_DEF); furi_hal_interrupt_set_isr( SUBGHZ_DEVICE_CC1101_EXT_DMA_CH3_IRQ, subghz_device_cc1101_ext_async_tx_dma_isr, NULL); furi_hal_bus_enable(FuriHalBusTIM17); // Configure TIM // Set the timer resolution to 2 us LL_TIM_SetCounterMode(TIM17, LL_TIM_COUNTERMODE_UP); LL_TIM_SetClockDivision(TIM17, LL_TIM_CLOCKDIVISION_DIV1); LL_TIM_SetAutoReload(TIM17, 500); LL_TIM_SetPrescaler(TIM17, (64 << 1) - 1); LL_TIM_SetClockSource(TIM17, LL_TIM_CLOCKSOURCE_INTERNAL); LL_TIM_DisableARRPreload(TIM17); subghz_device_cc1101_ext_async_tx_middleware_idle( &subghz_device_cc1101_ext->async_tx.middleware); subghz_device_cc1101_ext_async_tx_refill( subghz_device_cc1101_ext->async_tx.buffer, SUBGHZ_DEVICE_CC1101_EXT_ASYNC_TX_BUFFER_FULL); // Configure tx gpio dma const GpioPin* gpio = subghz_device_cc1101_ext->g0_pin; subghz_device_cc1101_ext->async_tx.gpio_tx_buff[0] = (uint32_t)gpio->pin << GPIO_NUMBER; subghz_device_cc1101_ext->async_tx.gpio_tx_buff[1] = gpio->pin; LL_DMA_SetMemoryAddress( SUBGHZ_DEVICE_CC1101_EXT_DMA_CH4_DEF, (uint32_t)subghz_device_cc1101_ext->async_tx.gpio_tx_buff); LL_DMA_SetPeriphAddress(SUBGHZ_DEVICE_CC1101_EXT_DMA_CH4_DEF, (uint32_t) & (gpio->port->BSRR)); LL_DMA_ConfigTransfer( SUBGHZ_DEVICE_CC1101_EXT_DMA_CH4_DEF, LL_DMA_DIRECTION_MEMORY_TO_PERIPH | LL_DMA_MODE_CIRCULAR | LL_DMA_PERIPH_NOINCREMENT | LL_DMA_MEMORY_INCREMENT | LL_DMA_PDATAALIGN_WORD | LL_DMA_MDATAALIGN_WORD | LL_DMA_PRIORITY_HIGH); LL_DMA_SetDataLength(SUBGHZ_DEVICE_CC1101_EXT_DMA_CH4_DEF, 2); LL_DMA_SetPeriphRequest(SUBGHZ_DEVICE_CC1101_EXT_DMA_CH4_DEF, LL_DMAMUX_REQ_TIM17_UP); LL_DMA_EnableChannel(SUBGHZ_DEVICE_CC1101_EXT_DMA_CH4_DEF); // Start debug if(subghz_device_cc1101_ext_start_debug()) { gpio = subghz_device_cc1101_ext->async_mirror_pin; subghz_device_cc1101_ext->async_tx.debug_gpio_buff[0] = (uint32_t)gpio->pin << GPIO_NUMBER; subghz_device_cc1101_ext->async_tx.debug_gpio_buff[1] = gpio->pin; LL_DMA_SetMemoryAddress( SUBGHZ_DEVICE_CC1101_EXT_DMA_CH5_DEF, (uint32_t)subghz_device_cc1101_ext->async_tx.debug_gpio_buff); LL_DMA_SetPeriphAddress( SUBGHZ_DEVICE_CC1101_EXT_DMA_CH5_DEF, (uint32_t) & (gpio->port->BSRR)); LL_DMA_ConfigTransfer( SUBGHZ_DEVICE_CC1101_EXT_DMA_CH5_DEF, LL_DMA_DIRECTION_MEMORY_TO_PERIPH | LL_DMA_MODE_CIRCULAR | LL_DMA_PERIPH_NOINCREMENT | LL_DMA_MEMORY_INCREMENT | LL_DMA_PDATAALIGN_WORD | LL_DMA_MDATAALIGN_WORD | LL_DMA_PRIORITY_LOW); LL_DMA_SetDataLength(SUBGHZ_DEVICE_CC1101_EXT_DMA_CH5_DEF, 2); LL_DMA_SetPeriphRequest(SUBGHZ_DEVICE_CC1101_EXT_DMA_CH5_DEF, LL_DMAMUX_REQ_TIM17_UP); LL_DMA_EnableChannel(SUBGHZ_DEVICE_CC1101_EXT_DMA_CH5_DEF); } // Start counter LL_TIM_EnableDMAReq_UPDATE(TIM17); subghz_device_cc1101_ext_tx(); LL_TIM_SetCounter(TIM17, 0); LL_TIM_EnableCounter(TIM17); return true; } bool subghz_device_cc1101_ext_is_async_tx_complete(void) { return (subghz_device_cc1101_ext->state == SubGhzDeviceCC1101ExtStateAsyncTx) && (LL_TIM_GetAutoReload(TIM17) == 0); } void subghz_device_cc1101_ext_stop_async_tx(void) { furi_assert(subghz_device_cc1101_ext->state == SubGhzDeviceCC1101ExtStateAsyncTx); // Shutdown radio subghz_device_cc1101_ext_idle(); // Deinitialize GPIO furi_hal_gpio_write(subghz_device_cc1101_ext->g0_pin, false); furi_hal_gpio_init(subghz_device_cc1101_ext->g0_pin, GpioModeAnalog, GpioPullNo, GpioSpeedLow); // Deinitialize Timer furi_hal_bus_disable(FuriHalBusTIM17); furi_hal_interrupt_set_isr(FuriHalInterruptIdTim1TrgComTim17, NULL, NULL); // Deinitialize DMA LL_DMA_DeInit(SUBGHZ_DEVICE_CC1101_EXT_DMA_CH3_DEF); LL_DMA_DisableChannel(SUBGHZ_DEVICE_CC1101_EXT_DMA_CH4_DEF); furi_hal_interrupt_set_isr(SUBGHZ_DEVICE_CC1101_EXT_DMA_CH3_IRQ, NULL, NULL); // Stop debug if(subghz_device_cc1101_ext_stop_debug()) { LL_DMA_DisableChannel(SUBGHZ_DEVICE_CC1101_EXT_DMA_CH5_DEF); } free(subghz_device_cc1101_ext->async_tx.buffer); subghz_device_cc1101_ext->state = SubGhzDeviceCC1101ExtStateIdle; } ================================================ FILE: applications/drivers/subghz/cc1101_ext/cc1101_ext.h ================================================ /** * @file cc1101_ext.h * @brief External CC1101 transceiver access API. */ #pragma once #include #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif /* Mirror RX/TX async modulation signal to specified pin * * @warning Configures pin to output mode. Make sure it is not connected * directly to power or ground. * * @param[in] pin pointer to the gpio pin structure or NULL to disable */ void subghz_device_cc1101_ext_set_async_mirror_pin(const GpioPin* pin); /** Get data GPIO * * @return pointer to the gpio pin structure */ const GpioPin* subghz_device_cc1101_ext_get_data_gpio(void); /** Initialize device * * @return true if success */ bool subghz_device_cc1101_ext_alloc(void); /** Deinitialize device */ void subghz_device_cc1101_ext_free(void); /** Check and switch to power save mode Used by internal API-HAL * initialization routine Can be used to reinitialize device to safe state and * send it to sleep */ bool subghz_device_cc1101_ext_is_connect(void); /** Send device to sleep mode */ void subghz_device_cc1101_ext_sleep(void); /** Dump info to stdout */ void subghz_device_cc1101_ext_dump_state(void); /** Load custom registers from preset * * @param preset_data registers to load */ void subghz_device_cc1101_ext_load_custom_preset(const uint8_t* preset_data); /** Load registers * * @param data Registers data */ void subghz_device_cc1101_ext_load_registers(const uint8_t* data); /** Load PATABLE * * @param data 8 uint8_t values */ void subghz_device_cc1101_ext_load_patable(const uint8_t data[8]); /** Write packet to FIFO * * @param data bytes array * @param size size */ void subghz_device_cc1101_ext_write_packet(const uint8_t* data, uint8_t size); /** Check if receive pipe is not empty * * @return true if not empty */ bool subghz_device_cc1101_ext_rx_pipe_not_empty(void); /** Check if received data crc is valid * * @return true if valid */ bool subghz_device_cc1101_ext_is_rx_data_crc_valid(void); /** Read packet from FIFO * * @param data pointer * @param size size */ void subghz_device_cc1101_ext_read_packet(uint8_t* data, uint8_t* size); /** Flush rx FIFO buffer */ void subghz_device_cc1101_ext_flush_rx(void); /** Flush tx FIFO buffer */ void subghz_device_cc1101_ext_flush_tx(void); /** Shutdown Issue SPWD command * @warning registers content will be lost */ void subghz_device_cc1101_ext_shutdown(void); /** Reset Issue reset command * @warning registers content will be lost */ void subghz_device_cc1101_ext_reset(void); /** Switch to Idle */ void subghz_device_cc1101_ext_idle(void); /** Switch to Receive */ void subghz_device_cc1101_ext_rx(void); /** Switch to Transmit * * @return true if the transfer is allowed by belonging to the region */ bool subghz_device_cc1101_ext_tx(void); /** Get RSSI value in dBm * * @return RSSI value */ float subghz_device_cc1101_ext_get_rssi(void); /** Get LQI * * @return LQI value */ uint8_t subghz_device_cc1101_ext_get_lqi(void); /** Check if frequency is in valid range * * @param value frequency in Hz * * @return true if frequency is valid, otherwise false */ bool subghz_device_cc1101_ext_is_frequency_valid(uint32_t value); /** Set frequency * * @param value frequency in Hz * * @return real frequency in Hz */ uint32_t subghz_device_cc1101_ext_set_frequency(uint32_t value); /* High Level API */ /** Signal Timings Capture callback */ typedef void (*SubGhzDeviceCC1101ExtCaptureCallback)(bool level, uint32_t duration, void* context); /** Enable signal timings capture Initializes GPIO and TIM2 for timings capture * * @param callback SubGhzDeviceCC1101ExtCaptureCallback * @param context callback context */ void subghz_device_cc1101_ext_start_async_rx( SubGhzDeviceCC1101ExtCaptureCallback callback, void* context); /** Disable signal timings capture Resets GPIO and TIM2 */ void subghz_device_cc1101_ext_stop_async_rx(void); /** Async TX callback type * @param context callback context * @return LevelDuration */ typedef LevelDuration (*SubGhzDeviceCC1101ExtCallback)(void* context); /** Start async TX Initializes GPIO, TIM2 and DMA1 for signal output * * @param callback SubGhzDeviceCC1101ExtCallback * @param context callback context * * @return true if the transfer is allowed by belonging to the region */ bool subghz_device_cc1101_ext_start_async_tx(SubGhzDeviceCC1101ExtCallback callback, void* context); /** Wait for async transmission to complete * * @return true if TX complete */ bool subghz_device_cc1101_ext_is_async_tx_complete(void); /** Stop async transmission and cleanup resources Resets GPIO, TIM2, and DMA1 */ void subghz_device_cc1101_ext_stop_async_tx(void); #ifdef __cplusplus } #endif ================================================ FILE: applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.c ================================================ #include "cc1101_ext_interconnect.h" #include "cc1101_ext.h" #include #define TAG "SubGhzDeviceCc1101Ext" static bool subghz_device_cc1101_ext_interconnect_is_frequency_valid(uint32_t frequency) { bool ret = subghz_device_cc1101_ext_is_frequency_valid(frequency); if(!ret) { furi_crash("SubGhz: Incorrect frequency."); } return ret; } static uint32_t subghz_device_cc1101_ext_interconnect_set_frequency(uint32_t frequency) { subghz_device_cc1101_ext_interconnect_is_frequency_valid(frequency); return subghz_device_cc1101_ext_set_frequency(frequency); } static bool subghz_device_cc1101_ext_interconnect_start_async_tx(void* callback, void* context) { return subghz_device_cc1101_ext_start_async_tx( (SubGhzDeviceCC1101ExtCallback)callback, context); } static void subghz_device_cc1101_ext_interconnect_start_async_rx(void* callback, void* context) { subghz_device_cc1101_ext_start_async_rx( (SubGhzDeviceCC1101ExtCaptureCallback)callback, context); } static void subghz_device_cc1101_ext_interconnect_load_preset( FuriHalSubGhzPreset preset, uint8_t* preset_data) { switch(preset) { case FuriHalSubGhzPresetOok650Async: subghz_device_cc1101_ext_load_custom_preset( subghz_device_cc1101_preset_ook_650khz_async_regs); break; case FuriHalSubGhzPresetOok270Async: subghz_device_cc1101_ext_load_custom_preset( subghz_device_cc1101_preset_ook_270khz_async_regs); break; case FuriHalSubGhzPreset2FSKDev238Async: subghz_device_cc1101_ext_load_custom_preset( subghz_device_cc1101_preset_2fsk_dev2_38khz_async_regs); break; case FuriHalSubGhzPreset2FSKDev476Async: subghz_device_cc1101_ext_load_custom_preset( subghz_device_cc1101_preset_2fsk_dev47_6khz_async_regs); break; case FuriHalSubGhzPresetMSK99_97KbAsync: subghz_device_cc1101_ext_load_custom_preset( subghz_device_cc1101_preset_msk_99_97kb_async_regs); break; case FuriHalSubGhzPresetGFSK9_99KbAsync: subghz_device_cc1101_ext_load_custom_preset( subghz_device_cc1101_preset_gfsk_9_99kb_async_regs); break; default: subghz_device_cc1101_ext_load_custom_preset(preset_data); } } const SubGhzDeviceInterconnect subghz_device_cc1101_ext_interconnect = { .begin = subghz_device_cc1101_ext_alloc, .end = subghz_device_cc1101_ext_free, .is_connect = subghz_device_cc1101_ext_is_connect, .reset = subghz_device_cc1101_ext_reset, .sleep = subghz_device_cc1101_ext_sleep, .idle = subghz_device_cc1101_ext_idle, .load_preset = subghz_device_cc1101_ext_interconnect_load_preset, .set_frequency = subghz_device_cc1101_ext_interconnect_set_frequency, .is_frequency_valid = subghz_device_cc1101_ext_is_frequency_valid, .set_async_mirror_pin = subghz_device_cc1101_ext_set_async_mirror_pin, .get_data_gpio = subghz_device_cc1101_ext_get_data_gpio, .set_tx = subghz_device_cc1101_ext_tx, .flush_tx = subghz_device_cc1101_ext_flush_tx, .start_async_tx = subghz_device_cc1101_ext_interconnect_start_async_tx, .is_async_complete_tx = subghz_device_cc1101_ext_is_async_tx_complete, .stop_async_tx = subghz_device_cc1101_ext_stop_async_tx, .set_rx = subghz_device_cc1101_ext_rx, .flush_rx = subghz_device_cc1101_ext_flush_rx, .start_async_rx = subghz_device_cc1101_ext_interconnect_start_async_rx, .stop_async_rx = subghz_device_cc1101_ext_stop_async_rx, .get_rssi = subghz_device_cc1101_ext_get_rssi, .get_lqi = subghz_device_cc1101_ext_get_lqi, .rx_pipe_not_empty = subghz_device_cc1101_ext_rx_pipe_not_empty, .is_rx_data_crc_valid = subghz_device_cc1101_ext_is_rx_data_crc_valid, .read_packet = subghz_device_cc1101_ext_read_packet, .write_packet = subghz_device_cc1101_ext_write_packet, }; const SubGhzDevice subghz_device_cc1101_ext = { .name = SUBGHZ_DEVICE_CC1101_EXT_NAME, .interconnect = &subghz_device_cc1101_ext_interconnect, }; static const FlipperAppPluginDescriptor subghz_device_cc1101_ext_descriptor = { .appid = SUBGHZ_RADIO_DEVICE_PLUGIN_APP_ID, .ep_api_version = SUBGHZ_RADIO_DEVICE_PLUGIN_API_VERSION, .entry_point = &subghz_device_cc1101_ext, }; const FlipperAppPluginDescriptor* subghz_device_cc1101_ext_ep(void) { return &subghz_device_cc1101_ext_descriptor; } ================================================ FILE: applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.h ================================================ #pragma once #include #define SUBGHZ_DEVICE_CC1101_EXT_NAME "cc1101_ext" typedef struct SubGhzDeviceCC1101Ext SubGhzDeviceCC1101Ext; const FlipperAppPluginDescriptor* subghz_device_cc1101_ext_ep(void); ================================================ FILE: applications/examples/application.fam ================================================ # Placeholder App( appid="example_apps", name="Example apps bundle", apptype=FlipperAppType.METAPACKAGE, ) ================================================ FILE: applications/examples/example_adc/application.fam ================================================ App( appid="example_adc", name="Example: ADC", apptype=FlipperAppType.EXTERNAL, entry_point="example_adc_main", requires=["gui"], stack_size=1 * 1024, fap_category="Examples", ) ================================================ FILE: applications/examples/example_adc/example_adc.c ================================================ /** * @file example_adc.c * @brief ADC example. */ #include #include #include #include #include const uint8_t font[] = "`\2\3\2\3\4\1\2\4\5\11\0\376\6\376\7\377\1M\2\263\3\370 \6\315\364\371\6!\12\315" "\364\201\260\35\312Q\0\42\11\315tJI\316\13\0#\14\315\264\223dP*\203R'\1$\15\315\264" "\262A\311\266D\251l\71\0%\15\315\264\7%\61)J\42\345 \0&\14\315\264\263$\13\223\266$" "\7\1'\10\315\364\201\60\347\10(\10\315\364\32[\313\0)\11\315\64\322b[\35\2*\12\315\264\263" "(\222j\71\15+\11\315\364I\331\226\23\1,\10\315\364\271\205Y\10-\10\315\364\31t\26\0.\10" "\315\364\71\346(\0/\14\315\364\221\60\13\263\60\13C\0\60\13\315\264\245Jb)E:\12\61\12\315" "\364\201Ll\333A\0\62\12\315\264\245bV\33r\20\63\13\315\264\245Z\232D\221\216\2\64\14\315\364" "\201LJ\242!\313v\20\65\14\315t\207$\134\223(\322Q\0\66\13\315\264\245p\252D\221\216\2\67" "\12\315t\207\60+\326a\0\70\13\315\264\245\222T\211\42\35\5\71\13\315\264\245J\24\215\221\216\2:" "\11\315\364i\71!G\1;\12\315\364I\71!\314B\0<\11\315\364\341\254Z\7\1=\12\315\364)" "C<\344$\0>\11\315\364\301\264V\207\1\77\12\315\264\245Z\35\312a\0@\14\315\264\245J\242$" "J\272\203\0A\15\315\264\245J\224\14I\224D\71\10B\13\315t\247\312T\211\222\35\5C\12\315\264" "\245JX\212t\24D\15\315t\247J\224DI\224\354(\0E\14\315t\207$\234\302p\310A\0F" "\12\315t\207$\234\302:\1G\14\315\264\245J\230(Q\244\243\0H\17\315t\243$J\206$J\242" "$\312A\0I\11\315\264\267\260m\7\1J\12\315\364\221\260%\212t\24K\14\315t\243\244\244iI" "T\7\1L\11\315t\303\216C\16\2M\17\315t\243dH\206$J\242$\312A\0N\16\315t\243" "D\251(Q\22%Q\16\2O\15\315\264\245J\224DI\24\351(\0P\12\315t\247J\224LaN" "Q\15\315\264\245J\224DI\42\251\61\0R\14\315t\247J\224L\225(\7\1S\13\315\264\245\222\232" "D\221\216\2T\10\315\264\267\260;\12U\16\315t\243$J\242$J\242HG\1V\15\315t\243$" "J\242$Jj\71\14W\17\315t\243$J\242dH\206$\312A\0X\15\315t\243$\212\64\251\22" "\345 \0Y\13\315t\243$Jja\35\6Z\12\315t\207\60k\34r\20[\10\315\264\264\260G\31" "\134\12\315\264\303\64L\303\64\14]\10\315t\304\276\351\0^\11\315\364\201,\311\271\1_\7\315\364y" "\35\4`\10\315t\322\234'\0a\14\315\364IK\224$R\222\203\0b\13\315t\303p\252D\311\216" "\2c\12\315\364IR%\335A\0d\14\315\364\221\60Z\242$\212v\20e\12\315\364I\322\220\244;" "\10f\12\315\364\221,\333\302:\12g\14\315\364IK\224D\321\30I\0h\14\315t\303p\252DI" "\224\203\0i\12\315\364\201\34\21k;\10j\12\315\364\201\34\21\273e\0k\13\315t\303J\244%Q" "\35\4l\10\315\264\305n;\10m\14\315\364)CRQ\22\245\216\1n\13\315\364)%\245\224D\71" "\10o\12\315\364IR%\212t\24p\13\315\364)S%J\246\60\4q\13\315\364IK\224D\321X" "\1r\11\315\364)%\245\230\23s\12\315\364I\313\232\354(\0t\13\315\364\201\60\333\302\64\7\1u" "\15\315\364)Q\22%\211\224\344 \0v\13\315\364)Q\22%\265\34\6w\13\315\364)\25%Q\272" "\203\0x\12\315\364)Q\244Iu\20y\15\315\364)Q\22%Q\64F\22\0z\12\315\364)CV" "\33r\20{\12\315\364\212\265\64\254&\0|\7\315\264\302~\7}\12\315t\322\260\232\205\265\14~\11" "\315\364II;\13\0\177\6\315\364\371\6\0\0\0\4\377\377\0"; #define FONT_HEIGHT (8u) typedef float (*ValueConverter)(FuriHalAdcHandle* handle, uint16_t value); typedef struct { const GpioPinRecord* pin; float value; ValueConverter converter; const char* suffix; } DataItem; typedef struct { size_t count; DataItem* items; } Data; const GpioPinRecord item_vref = {.name = "VREF", .channel = FuriHalAdcChannelVREFINT}; const GpioPinRecord item_temp = {.name = "TEMP", .channel = FuriHalAdcChannelTEMPSENSOR}; const GpioPinRecord item_vbat = {.name = "VBAT", .channel = FuriHalAdcChannelVBAT}; static void app_draw_callback(Canvas* canvas, void* ctx) { furi_assert(ctx); Data* data = ctx; canvas_set_custom_u8g2_font(canvas, font); char buffer[64]; int32_t x = 0, y = FONT_HEIGHT; for(size_t i = 0; i < data->count; i++) { if(i == canvas_height(canvas) / FONT_HEIGHT) { x = 64; y = FONT_HEIGHT; } snprintf( buffer, sizeof(buffer), "%4s: %4.0f%s\n", data->items[i].pin->name, (double)data->items[i].value, data->items[i].suffix); canvas_draw_str(canvas, x, y, buffer); y += FONT_HEIGHT; } } 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 example_adc_main(void* p) { UNUSED(p); // Data Data data = {}; for(size_t i = 0; i < gpio_pins_count; i++) { if(gpio_pins[i].channel != FuriHalAdcChannelNone) { data.count++; } } data.count += 3; // Special channels data.items = malloc(data.count * sizeof(DataItem)); size_t item_pos = 0; for(size_t i = 0; i < gpio_pins_count; i++) { if(gpio_pins[i].channel != FuriHalAdcChannelNone) { furi_hal_gpio_init(gpio_pins[i].pin, GpioModeAnalog, GpioPullNo, GpioSpeedLow); data.items[item_pos].pin = &gpio_pins[i]; data.items[item_pos].converter = furi_hal_adc_convert_to_voltage; data.items[item_pos].suffix = "mV"; item_pos++; } } data.items[item_pos].pin = &item_vref; data.items[item_pos].converter = furi_hal_adc_convert_vref; data.items[item_pos].suffix = "mV"; item_pos++; data.items[item_pos].pin = &item_temp; data.items[item_pos].converter = furi_hal_adc_convert_temp; data.items[item_pos].suffix = "C"; item_pos++; data.items[item_pos].pin = &item_vbat; data.items[item_pos].converter = furi_hal_adc_convert_vbat; data.items[item_pos].suffix = "mV"; item_pos++; furi_assert(item_pos == data.count); // Alloc message queue FuriMessageQueue* event_queue = furi_message_queue_alloc(8, sizeof(InputEvent)); // Configure view port ViewPort* view_port = view_port_alloc(); view_port_draw_callback_set(view_port, app_draw_callback, &data); view_port_input_callback_set(view_port, app_input_callback, event_queue); // Register view port in GUI Gui* gui = furi_record_open(RECORD_GUI); gui_add_view_port(gui, view_port, GuiLayerFullscreen); // Initialize ADC FuriHalAdcHandle* adc_handle = furi_hal_adc_acquire(); furi_hal_adc_configure(adc_handle); // Process events InputEvent event; bool running = true; while(running) { if(furi_message_queue_get(event_queue, &event, 100) == FuriStatusOk) { if(event.type == InputTypePress && event.key == InputKeyBack) { running = false; } } else { for(size_t i = 0; i < data.count; i++) { data.items[i].value = data.items[i].converter( adc_handle, furi_hal_adc_read(adc_handle, data.items[i].pin->channel)); } view_port_update(view_port); } } furi_hal_adc_release(adc_handle); view_port_enabled_set(view_port, false); gui_remove_view_port(gui, view_port); view_port_free(view_port); furi_message_queue_free(event_queue); furi_record_close(RECORD_GUI); free(data.items); return 0; } ================================================ FILE: applications/examples/example_apps_assets/README.md ================================================ # Apps Assets folder Example {#example_app_assets} 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. ## Source code Source code for this example can be found [here](https://github.com/flipperdevices/flipperzero-firmware/tree/dev/applications/examples/example_apps_assets). ## 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 (content 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. ================================================ FILE: applications/examples/example_apps_assets/application.fam ================================================ 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", ) ================================================ FILE: applications/examples/example_apps_assets/example_apps_assets.c ================================================ /** * @file example_apps_assets.c * @brief Application assets example. */ #include #include #include #include // Define log tag #define TAG "ExampleAppsAssets" 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; } ================================================ FILE: applications/examples/example_apps_assets/files/poems/a jelly-fish.txt ================================================ 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" ================================================ FILE: applications/examples/example_apps_assets/files/poems/my shadow.txt ================================================ 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" ================================================ FILE: applications/examples/example_apps_assets/files/poems/theme in yellow.txt ================================================ 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" ================================================ FILE: applications/examples/example_apps_assets/files/test_asset.txt ================================================ ## This is test file content ================================================ FILE: applications/examples/example_apps_data/README.md ================================================ # Apps Data folder Example {#example_app_data} This example demonstrates how to utilize the Apps Data folder to store data that is not part of the app itself, such as user data, configuration files, and so forth. ## Source code Source code for this example can be found [here](https://github.com/flipperdevices/flipperzero-firmware/tree/dev/applications/examples/example_apps_data). ## What is the Apps Data Folder? The **Apps Data** folder is a folder used to store data for external apps that are not part of the main firmware. 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 `/data` alias instead. ## How to get the path to the Apps Data folder? 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")`. ## 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 (content 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. ================================================ FILE: applications/examples/example_apps_data/application.fam ================================================ App( appid="example_apps_data", name="Example: Apps Data", apptype=FlipperAppType.EXTERNAL, entry_point="example_apps_data_main", requires=["gui"], stack_size=1 * 1024, fap_category="Examples", ) ================================================ FILE: applications/examples/example_apps_data/example_apps_data.c ================================================ /** * @file example_apps_data.c * @brief Application data example. */ #include #include // Define log tag #define TAG "ExampleAppsData" // Application entry point int32_t example_apps_data_main(void* p) { // Mark argument as unused UNUSED(p); // Open storage Storage* storage = furi_record_open(RECORD_STORAGE); // Allocate file File* file = storage_file_alloc(storage); // Get the path to the current application data folder // That is: /ext/apps_data/ // And it will create folders in the path if they don't exist // In this example it will create /ext/apps_data/example_apps_data // And file will be /ext/apps_data/example_apps_data/test.txt // Open file, write data and close it if(!storage_file_open(file, APP_DATA_PATH("test.txt"), FSAM_WRITE, FSOM_CREATE_ALWAYS)) { FURI_LOG_E(TAG, "Failed to open file"); } if(!storage_file_write(file, "Hello World!", strlen("Hello World!"))) { FURI_LOG_E(TAG, "Failed to write to file"); } storage_file_close(file); // Deallocate file storage_file_free(file); // Close storage furi_record_close(RECORD_STORAGE); return 0; } ================================================ FILE: applications/examples/example_ble_beacon/application.fam ================================================ App( appid="example_ble_beacon", name="Example: BLE Beacon", apptype=FlipperAppType.EXTERNAL, entry_point="ble_beacon_app", requires=["gui"], stack_size=1 * 1024, fap_icon="example_ble_beacon_10px.png", fap_category="Examples", fap_icon_assets="images", ) ================================================ FILE: applications/examples/example_ble_beacon/ble_beacon_app.c ================================================ #include "ble_beacon_app.h" #include #include #include #define TAG "BleBeaconApp" static bool ble_beacon_app_custom_event_callback(void* context, uint32_t event) { furi_assert(context); BleBeaconApp* app = context; return scene_manager_handle_custom_event(app->scene_manager, event); } static bool ble_beacon_app_back_event_callback(void* context) { furi_assert(context); BleBeaconApp* app = context; return scene_manager_handle_back_event(app->scene_manager); } static void ble_beacon_app_tick_event_callback(void* context) { furi_assert(context); BleBeaconApp* app = context; scene_manager_handle_tick_event(app->scene_manager); } static void ble_beacon_app_restore_beacon_state(BleBeaconApp* app) { // Restore beacon data from service GapExtraBeaconConfig* local_config = &app->beacon_config; const GapExtraBeaconConfig* config = furi_hal_bt_extra_beacon_get_config(); if(config) { // We have a config, copy it memcpy(local_config, config, sizeof(app->beacon_config)); } else { // No config, set up default values - they will stay until overriden or device is reset local_config->min_adv_interval_ms = 50; local_config->max_adv_interval_ms = 150; local_config->adv_channel_map = GapAdvChannelMapAll; local_config->adv_power_level = GapAdvPowerLevel_0dBm; local_config->address_type = GapAddressTypePublic; memcpy( local_config->address, furi_hal_version_get_ble_mac(), sizeof(local_config->address)); // Modify MAC address to make it different from the one used by the main app local_config->address[0] ^= 0xFF; local_config->address[3] ^= 0xFF; furi_check(furi_hal_bt_extra_beacon_set_config(local_config)); } // Get beacon state app->is_beacon_active = furi_hal_bt_extra_beacon_is_active(); // Restore last beacon data app->beacon_data_len = furi_hal_bt_extra_beacon_get_data(app->beacon_data); } static BleBeaconApp* ble_beacon_app_alloc(void) { BleBeaconApp* app = malloc(sizeof(BleBeaconApp)); app->gui = furi_record_open(RECORD_GUI); app->scene_manager = scene_manager_alloc(&ble_beacon_app_scene_handlers, app); app->view_dispatcher = view_dispatcher_alloc(); app->status_string = furi_string_alloc(); view_dispatcher_set_event_callback_context(app->view_dispatcher, app); view_dispatcher_set_custom_event_callback( app->view_dispatcher, ble_beacon_app_custom_event_callback); view_dispatcher_set_navigation_event_callback( app->view_dispatcher, ble_beacon_app_back_event_callback); view_dispatcher_set_tick_event_callback( app->view_dispatcher, ble_beacon_app_tick_event_callback, 100); view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); app->submenu = submenu_alloc(); view_dispatcher_add_view( app->view_dispatcher, BleBeaconAppViewSubmenu, submenu_get_view(app->submenu)); app->dialog_ex = dialog_ex_alloc(); view_dispatcher_add_view( app->view_dispatcher, BleBeaconAppViewDialog, dialog_ex_get_view(app->dialog_ex)); app->byte_input = byte_input_alloc(); view_dispatcher_add_view( app->view_dispatcher, BleBeaconAppViewByteInput, byte_input_get_view(app->byte_input)); ble_beacon_app_restore_beacon_state(app); return app; } static void ble_beacon_app_free(BleBeaconApp* app) { view_dispatcher_remove_view(app->view_dispatcher, BleBeaconAppViewByteInput); view_dispatcher_remove_view(app->view_dispatcher, BleBeaconAppViewSubmenu); view_dispatcher_remove_view(app->view_dispatcher, BleBeaconAppViewDialog); free(app->byte_input); free(app->submenu); free(app->dialog_ex); free(app->scene_manager); free(app->view_dispatcher); free(app->status_string); furi_record_close(RECORD_NOTIFICATION); furi_record_close(RECORD_GUI); app->gui = NULL; free(app); } int32_t ble_beacon_app(void* args) { UNUSED(args); BleBeaconApp* app = ble_beacon_app_alloc(); scene_manager_next_scene(app->scene_manager, BleBeaconAppSceneRunBeacon); view_dispatcher_run(app->view_dispatcher); ble_beacon_app_free(app); return 0; } void ble_beacon_app_update_state(BleBeaconApp* app) { furi_hal_bt_extra_beacon_stop(); furi_check(furi_hal_bt_extra_beacon_set_config(&app->beacon_config)); app->beacon_data_len = 0; while((app->beacon_data[app->beacon_data_len] != 0) && (app->beacon_data_len < sizeof(app->beacon_data))) { app->beacon_data_len++; } FURI_LOG_I(TAG, "beacon_data_len: %d", app->beacon_data_len); furi_check(furi_hal_bt_extra_beacon_set_data(app->beacon_data, app->beacon_data_len)); if(app->is_beacon_active) { furi_check(furi_hal_bt_extra_beacon_start()); } } ================================================ FILE: applications/examples/example_ble_beacon/ble_beacon_app.h ================================================ /** * @file ble_beacon_app.h * @brief BLE beacon example. */ #pragma once #include "extra_beacon.h" #include #include #include #include #include #include #include #include #include #include #include #include #include "scenes/scenes.h" #include typedef struct { Gui* gui; SceneManager* scene_manager; ViewDispatcher* view_dispatcher; Submenu* submenu; ByteInput* byte_input; DialogEx* dialog_ex; FuriString* status_string; GapExtraBeaconConfig beacon_config; uint8_t beacon_data[EXTRA_BEACON_MAX_DATA_SIZE]; uint8_t beacon_data_len; bool is_beacon_active; } BleBeaconApp; typedef enum { BleBeaconAppViewSubmenu, BleBeaconAppViewByteInput, BleBeaconAppViewDialog, } BleBeaconAppView; typedef enum { BleBeaconAppCustomEventDataEditResult = 100, } BleBeaconAppCustomEvent; void ble_beacon_app_update_state(BleBeaconApp* app); ================================================ FILE: applications/examples/example_ble_beacon/scenes/scene_config.h ================================================ ADD_SCENE(ble_beacon_app, menu, Menu) ADD_SCENE(ble_beacon_app, input_mac_addr, InputMacAddress) ADD_SCENE(ble_beacon_app, input_beacon_data, InputBeaconData) ADD_SCENE(ble_beacon_app, run_beacon, RunBeacon) ================================================ FILE: applications/examples/example_ble_beacon/scenes/scene_input_beacon_data.c ================================================ #include "../ble_beacon_app.h" static void ble_beacon_app_scene_add_type_byte_input_callback(void* context) { BleBeaconApp* ble_beacon = context; view_dispatcher_send_custom_event( ble_beacon->view_dispatcher, BleBeaconAppCustomEventDataEditResult); } void ble_beacon_app_scene_input_beacon_data_on_enter(void* context) { BleBeaconApp* ble_beacon = context; byte_input_set_header_text(ble_beacon->byte_input, "Enter beacon data"); byte_input_set_result_callback( ble_beacon->byte_input, ble_beacon_app_scene_add_type_byte_input_callback, NULL, context, ble_beacon->beacon_data, sizeof(ble_beacon->beacon_data)); view_dispatcher_switch_to_view(ble_beacon->view_dispatcher, BleBeaconAppViewByteInput); } bool ble_beacon_app_scene_input_beacon_data_on_event(void* context, SceneManagerEvent event) { BleBeaconApp* ble_beacon = context; SceneManager* scene_manager = ble_beacon->scene_manager; if(event.type == SceneManagerEventTypeCustom) { if(event.event == BleBeaconAppCustomEventDataEditResult) { ble_beacon_app_update_state(ble_beacon); scene_manager_previous_scene(scene_manager); return true; } } return false; } void ble_beacon_app_scene_input_beacon_data_on_exit(void* context) { BleBeaconApp* ble_beacon = context; byte_input_set_result_callback(ble_beacon->byte_input, NULL, NULL, NULL, NULL, 0); byte_input_set_header_text(ble_beacon->byte_input, NULL); } ================================================ FILE: applications/examples/example_ble_beacon/scenes/scene_input_mac_addr.c ================================================ #include "../ble_beacon_app.h" static void ble_beacon_app_scene_add_type_byte_input_callback(void* context) { BleBeaconApp* ble_beacon = context; view_dispatcher_send_custom_event( ble_beacon->view_dispatcher, BleBeaconAppCustomEventDataEditResult); } void ble_beacon_app_scene_input_mac_addr_on_enter(void* context) { BleBeaconApp* ble_beacon = context; byte_input_set_header_text(ble_beacon->byte_input, "Enter MAC (reversed)"); byte_input_set_result_callback( ble_beacon->byte_input, ble_beacon_app_scene_add_type_byte_input_callback, NULL, context, ble_beacon->beacon_config.address, sizeof(ble_beacon->beacon_config.address)); view_dispatcher_switch_to_view(ble_beacon->view_dispatcher, BleBeaconAppViewByteInput); } bool ble_beacon_app_scene_input_mac_addr_on_event(void* context, SceneManagerEvent event) { BleBeaconApp* ble_beacon = context; SceneManager* scene_manager = ble_beacon->scene_manager; if(event.type == SceneManagerEventTypeCustom) { if(event.event == BleBeaconAppCustomEventDataEditResult) { ble_beacon_app_update_state(ble_beacon); scene_manager_previous_scene(scene_manager); return true; } } return false; } void ble_beacon_app_scene_input_mac_addr_on_exit(void* context) { BleBeaconApp* ble_beacon = context; byte_input_set_result_callback(ble_beacon->byte_input, NULL, NULL, NULL, NULL, 0); byte_input_set_header_text(ble_beacon->byte_input, NULL); } ================================================ FILE: applications/examples/example_ble_beacon/scenes/scene_menu.c ================================================ #include "../ble_beacon_app.h" enum SubmenuIndex { SubmenuIndexSetMac, SubmenuIndexSetData, }; static void ble_beacon_app_scene_menu_submenu_callback(void* context, uint32_t index) { BleBeaconApp* ble_beacon = context; view_dispatcher_send_custom_event(ble_beacon->view_dispatcher, index); } void ble_beacon_app_scene_menu_on_enter(void* context) { BleBeaconApp* ble_beacon = context; Submenu* submenu = ble_beacon->submenu; submenu_add_item( submenu, "Set MAC", SubmenuIndexSetMac, ble_beacon_app_scene_menu_submenu_callback, ble_beacon); submenu_add_item( submenu, "Set Data", SubmenuIndexSetData, ble_beacon_app_scene_menu_submenu_callback, ble_beacon); view_dispatcher_switch_to_view(ble_beacon->view_dispatcher, BleBeaconAppViewSubmenu); } bool ble_beacon_app_scene_menu_on_event(void* context, SceneManagerEvent event) { BleBeaconApp* ble_beacon = context; SceneManager* scene_manager = ble_beacon->scene_manager; bool consumed = false; if(event.type == SceneManagerEventTypeCustom) { const uint32_t submenu_index = event.event; if(submenu_index == SubmenuIndexSetMac) { scene_manager_next_scene(scene_manager, BleBeaconAppSceneInputMacAddress); consumed = true; } else if(submenu_index == SubmenuIndexSetData) { scene_manager_next_scene(scene_manager, BleBeaconAppSceneInputBeaconData); consumed = true; } } return consumed; } void ble_beacon_app_scene_menu_on_exit(void* context) { BleBeaconApp* ble_beacon = context; submenu_reset(ble_beacon->submenu); } ================================================ FILE: applications/examples/example_ble_beacon/scenes/scene_run_beacon.c ================================================ #include "../ble_beacon_app.h" #include static void ble_beacon_app_scene_run_beacon_confirm_dialog_callback(DialogExResult result, void* context) { BleBeaconApp* ble_beacon = context; view_dispatcher_send_custom_event(ble_beacon->view_dispatcher, result); } static void update_status_text(BleBeaconApp* ble_beacon) { DialogEx* dialog_ex = ble_beacon->dialog_ex; dialog_ex_set_header(dialog_ex, "BLE Beacon Demo", 64, 0, AlignCenter, AlignTop); FuriString* status = ble_beacon->status_string; furi_string_reset(status); furi_string_cat_str(status, "Status: "); if(ble_beacon->is_beacon_active) { furi_string_cat_str(status, "Running\n"); } else { furi_string_cat_str(status, "Stopped\n"); } // Output MAC in reverse order for(int i = sizeof(ble_beacon->beacon_config.address) - 1; i >= 0; i--) { furi_string_cat_printf(status, "%02X", ble_beacon->beacon_config.address[i]); if(i > 0) { furi_string_cat_str(status, ":"); } } furi_string_cat_printf(status, "\nData length: %d", ble_beacon->beacon_data_len); dialog_ex_set_text(dialog_ex, furi_string_get_cstr(status), 0, 29, AlignLeft, AlignCenter); dialog_ex_set_icon(dialog_ex, 93, 20, &I_lighthouse_35x44); dialog_ex_set_left_button_text(dialog_ex, "Config"); dialog_ex_set_center_button_text(dialog_ex, ble_beacon->is_beacon_active ? "Stop" : "Start"); dialog_ex_set_result_callback( dialog_ex, ble_beacon_app_scene_run_beacon_confirm_dialog_callback); dialog_ex_set_context(dialog_ex, ble_beacon); } void ble_beacon_app_scene_run_beacon_on_enter(void* context) { BleBeaconApp* ble_beacon = context; update_status_text(ble_beacon); view_dispatcher_switch_to_view(ble_beacon->view_dispatcher, BleBeaconAppViewDialog); } bool ble_beacon_app_scene_run_beacon_on_event(void* context, SceneManagerEvent event) { BleBeaconApp* ble_beacon = context; SceneManager* scene_manager = ble_beacon->scene_manager; if(event.type == SceneManagerEventTypeCustom) { if(event.event == DialogExResultLeft) { scene_manager_next_scene(scene_manager, BleBeaconAppSceneMenu); return true; } else if(event.event == DialogExResultCenter) { ble_beacon->is_beacon_active = !ble_beacon->is_beacon_active; ble_beacon_app_update_state(ble_beacon); update_status_text(ble_beacon); return true; } } return false; } void ble_beacon_app_scene_run_beacon_on_exit(void* context) { BleBeaconApp* ble_beacon = context; UNUSED(ble_beacon); } ================================================ FILE: applications/examples/example_ble_beacon/scenes/scenes.c ================================================ #include "scenes.h" // Generate scene on_enter handlers array #define ADD_SCENE(prefix, name, id) prefix##_scene_##name##_on_enter, void (*const ble_beacon_app_on_enter_handlers[])(void*) = { #include "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 ble_beacon_app_on_event_handlers[])(void* context, SceneManagerEvent event) = { #include "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 ble_beacon_app_on_exit_handlers[])(void* context) = { #include "scene_config.h" }; #undef ADD_SCENE // Initialize scene handlers configuration structure const SceneManagerHandlers ble_beacon_app_scene_handlers = { .on_enter_handlers = ble_beacon_app_on_enter_handlers, .on_event_handlers = ble_beacon_app_on_event_handlers, .on_exit_handlers = ble_beacon_app_on_exit_handlers, .scene_num = BleBeaconAppSceneNum, }; ================================================ FILE: applications/examples/example_ble_beacon/scenes/scenes.h ================================================ #pragma once #include // Generate scene id and total number #define ADD_SCENE(prefix, name, id) BleBeaconAppScene##id, typedef enum { #include "scene_config.h" BleBeaconAppSceneNum, } BleBeaconAppScene; #undef ADD_SCENE extern const SceneManagerHandlers ble_beacon_app_scene_handlers; // Generate scene on_enter handlers declaration #define ADD_SCENE(prefix, name, id) void prefix##_scene_##name##_on_enter(void*); #include "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 "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 "scene_config.h" #undef ADD_SCENE ================================================ FILE: applications/examples/example_custom_font/application.fam ================================================ App( appid="example_custom_font", name="Example: custom font", apptype=FlipperAppType.EXTERNAL, entry_point="example_custom_font_main", requires=["gui"], stack_size=1 * 1024, fap_category="Examples", ) ================================================ FILE: applications/examples/example_custom_font/example_custom_font.c ================================================ /** * @file example_custom_font.c * @brief Custom font example. */ #include #include #include #include //This arrays contains the font itself. You can use any u8g2 font you want /* Fontname: -Misc-Fixed-Medium-R-Normal--6-60-75-75-C-40-ISO10646-1 Copyright: Public domain font. Share and enjoy. Glyphs: 191/919 BBX Build Mode: 0 */ const uint8_t u8g2_font_4x6_t_cyrillic[] = "\277\0\2\2\3\3\2\4\4\4\6\0\377\5\377\5\377\0\356\1\334\2\301 \5\200\315\0!\6\351\310" "\254\0\42\6\223\313$\25#\12\254\310\244\64T\32*\1$\11\263\307\245\241\301H\11%\10\253\310d" "\324F\1&\11\254\310\305\24\253\230\2'\5\321\313\10(\7\362\307\251f\0)\10\262\307\304T)\0" "*\7\253\310\244j\65+\10\253\310\305\264b\2,\6\222\307)\0-\5\213\312\14.\5\311\310\4/" "\7\253\310Ve\4\60\10\253\310UCU\0\61\7\253\310%Y\15\62\7\253\310\65S\32\63\10\253\310" "\314\224\301\2\64\10\253\310$\65b\1\65\10\253\310\214\250\301\2\66\7\253\310M\325\2\67\10\253\310\314" "TF\0\70\7\253\310\255\326\2\71\7\253\310\265\344\2:\6\341\310\304\0;\7\252\307e\250\0<\10" "\253\310\246\32d\20=\6\233\311l\60>\11\253\310d\220A*\1\77\11\253\310h\220\62L\0@\7" "\253\310-\33\10A\10\253\310UC\251\0B\10\253\310\250\264\322\2C\10\253\310U\62U\0D\10\253" "\310\250d-\0E\10\253\310\214\250\342\0F\10\253\310\214\250b\4G\10\253\310\315\244\222\0H\10\253" "\310$\65\224\12I\7\253\310\254X\15J\7\253\310\226\252\2K\10\253\310$\265\222\12L\7\253\310\304" "\346\0M\10\253\310\244\61\224\12N\10\253\310\252\241$\0O\7\253\310UV\5P\10\253\310\250\264b" "\4Q\10\263\307UV\15\2R\10\253\310\250\264\222\12S\10\253\310m\220\301\2T\7\253\310\254\330\2" "U\7\253\310$\327\10V\10\253\310$k\244\4W\10\253\310$\65\206\12X\10\253\310$\325R\1Y" "\10\253\310$UV\0Z\7\253\310\314T\16[\6\352\310\254J\134\11\253\310\304\14\62\210\1]\6\252" "\310\250j^\5\223\313\65_\5\213\307\14`\6\322\313\304\0a\7\243\310-\225\4b\10\253\310D\225" "\324\2c\7\243\310\315\14\4d\10\253\310\246\245\222\0e\6\243\310USf\10\253\310\246\264b\2g" "\10\253\307\255$\27\0h\10\253\310D\225\254\0i\10\253\310e$\323\0j\10\263\307fX.\0k" "\10\253\310\304\264\222\12l\7\253\310\310\326\0m\10\243\310\244\241T\0n\7\243\310\250d\5o\7\243" "\310U\252\2p\10\253\307\250\264b\4q\10\253\307-\225d\0r\10\243\310\244\25#\0s\10\243\310" "\215\14\26\0t\10\253\310\245\25\63\10u\7\243\310$+\11v\7\243\310$\253\2w\10\243\310$\65" "T\0x\7\243\310\244\62\25y\10\253\307$\225\344\2z\7\243\310\314\224\6{\10\263\307\246$k\20" "|\6\351\310\14\1}\11\263\307d\20UL\21~\7\224\313%\225\0\0\0\0\4\377\377\4\1\11\253" "\310\244\261\342\0\4\2\11\253\310\214\250\222\12\4\3\10\253\310\16Y\2\4\4\11\253\310M\225\201\0\4" "\5\11\253\310m\220\301\2\4\6\10\253\310\254X\15\4\7\11\253\310\244\221b\32\4\10\10\253\310\226\252" "\2\4\11\11\254\310L\325Z\2\4\12\11\254\310\244\326JK\4\13\11\253\310\250\250\222\12\4\14\10\253" "\310\312\264\12\4\16\11\263\307\244\32u\2\4\17\11\263\307$\327H\11\4\20\11\253\310UC\251\0\4" "\21\11\253\310\214\250\322\2\4\22\11\253\310\250\264\322\2\4\23\10\253\310\214\330\4\4\24\11\263\307\254\245" "\206\12\4\25\11\253\310\214\250\342\0\4\26\12\253\310\244\221\322H\1\4\27\12\253\310h\220\62X\0\4" "\30\11\253\310\304\64T\14\4\31\11\263\307\315\64T\14\4\32\11\253\310$\265\222\12\4\33\10\253\310-" "W\0\4\34\11\253\310\244\241\254\0\4\35\11\253\310$\65\224\12\4\36\10\253\310UV\5\4\37\10\253" "\310\214\344\12\4 \11\253\310\250\264b\4\4!\11\253\310U\62U\0\4\42\10\253\310\254\330\2\4#" "\11\263\307$\253L\21\4$\12\253\310\245\221FJ\0\4%\11\253\310$\325R\1\4&\10\253\310$" "\327\10\4'\11\253\310$\225d\1\4(\11\253\310$\65\216\0\4)\12\264\307\244\326#\203\0\4*" "\13\254\310h\220\201LI\1\4+\12\254\310D\271\324H\1\4,\11\253\310\304\250\322\2\4-\11\253" "\310h\220\344\2\4.\12\254\310\244\244.\225\0\4/\11\253\310\255\264T\0\4\60\10\243\310-\225\4" "\4\61\11\253\310\315\221*\0\4\62\11\243\310\14\225\26\0\4\63\10\243\310\214X\2\4\64\11\253\307-" "\65T\0\4\65\7\243\310US\4\66\11\244\310$S%\1\4\67\11\243\310\254\14\26\0\4\70\11\243" "\310\244\61T\0\4\71\11\253\310\244\326P\1\4:\10\243\310$\265\12\4;\7\243\310-+\4<\11" "\243\310\244\241T\0\4=\11\243\310\244\241T\0\4>\10\243\310U\252\2\4\77\10\243\310\214d\5\4" "@\11\253\307\250\264b\4\4A\10\243\310\315\14\4\4B\10\243\310\254X\1\4C\11\253\307$\225\344" "\2\4D\12\263\307\305\224T\231\0\4E\10\243\310\244\62\25\4F\11\253\307$k\304\0\4G\11\243" "\310$\225d\0\4H\10\243\310\244q\4\4I\11\254\307\244\364\310 \4J\12\244\310h SR\0" "\4K\11\244\310\304\245F\12\4L\11\243\310D\225\26\0\4M\10\243\310H\271\0\4N\12\244\310\244" "\244\226J\0\4O\10\243\310\255\264\2\4Q\10\253\310\244\326\24\4R\11\263\307D\25U\31\4S\11" "\253\310\246\64b\4\4T\11\243\310\215\224\201\0\4U\11\243\310\215\14\26\0\4V\11\253\310e$\323" "\0\4W\11\253\310\244\14d\32\4X\11\263\307fX.\0\4Y\10\244\310\251\326\22\4Z\11\244\310" "\244\264\322\22\4[\11\253\310D\25U\1\4\134\10\253\310\312\264\12\4^\11\263\307\244\32u\2\4_" "\11\253\307$k\244\4\4\220\10\253\310\16Y\2\4\221\10\243\310\16\31\1\4\222\11\253\310\251\264b\2" "\4\223\11\243\310\251\264\22\0\0"; // Screen is 128x64 px static void app_draw_callback(Canvas* canvas, void* ctx) { UNUSED(ctx); canvas_clear(canvas); canvas_set_custom_u8g2_font(canvas, u8g2_font_4x6_t_cyrillic); canvas_draw_str(canvas, 0, 6, "This is a tiny custom font"); canvas_draw_str(canvas, 0, 12, "012345.?! ,:;\"\'@#$%"); canvas_draw_str(canvas, 0, 18, "И немного юникода"); } 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 example_custom_font_main(void* p) { UNUSED(p); FuriMessageQueue* event_queue = furi_message_queue_alloc(8, sizeof(InputEvent)); // Configure view port ViewPort* view_port = view_port_alloc(); view_port_draw_callback_set(view_port, app_draw_callback, NULL); view_port_input_callback_set(view_port, app_input_callback, event_queue); // Register view port in GUI Gui* gui = furi_record_open(RECORD_GUI); gui_add_view_port(gui, view_port, GuiLayerFullscreen); InputEvent event; bool running = true; while(running) { if(furi_message_queue_get(event_queue, &event, 100) == FuriStatusOk) { if((event.type == InputTypePress) || (event.type == InputTypeRepeat)) { switch(event.key) { case InputKeyBack: running = false; break; default: break; } } } } view_port_enabled_set(view_port, false); gui_remove_view_port(gui, view_port); view_port_free(view_port); furi_message_queue_free(event_queue); furi_record_close(RECORD_GUI); return 0; } ================================================ FILE: applications/examples/example_event_loop/application.fam ================================================ App( appid="example_event_loop_event_flags", name="Example: Event Loop Event Flags", apptype=FlipperAppType.EXTERNAL, sources=["example_event_loop_event_flags.c"], entry_point="example_event_loop_event_flags_app", fap_category="Examples", ) App( appid="example_event_loop_timer", name="Example: Event Loop Timer", apptype=FlipperAppType.EXTERNAL, sources=["example_event_loop_timer.c"], entry_point="example_event_loop_timer_app", fap_category="Examples", ) App( appid="example_event_loop_mutex", name="Example: Event Loop Mutex", apptype=FlipperAppType.EXTERNAL, sources=["example_event_loop_mutex.c"], entry_point="example_event_loop_mutex_app", fap_category="Examples", ) App( appid="example_event_loop_stream_buffer", name="Example: Event Loop Stream Buffer", apptype=FlipperAppType.EXTERNAL, sources=["example_event_loop_stream_buffer.c"], entry_point="example_event_loop_stream_buffer_app", fap_category="Examples", ) App( appid="example_event_loop_multi", name="Example: Event Loop Multi", apptype=FlipperAppType.EXTERNAL, sources=["example_event_loop_multi.c"], entry_point="example_event_loop_multi_app", requires=["gui"], fap_category="Examples", ) ================================================ FILE: applications/examples/example_event_loop/example_event_loop_event_flags.c ================================================ /** * @file example_event_loop_event_flags.c * @brief Example application demonstrating the use of the FuriEventFlag primitive in FuriEventLoop instances. * * This application receives keystrokes from the input service and sets the appropriate flags, * which are subsequently processed in the event loop */ #include #include #include #include #define TAG "ExampleEventLoopEventFlags" typedef struct { Gui* gui; ViewPort* view_port; FuriEventLoop* event_loop; FuriEventFlag* event_flag; } EventLoopEventFlagsApp; typedef enum { EventLoopEventFlagsOk = (1 << 0), EventLoopEventFlagsUp = (1 << 1), EventLoopEventFlagsDown = (1 << 2), EventLoopEventFlagsLeft = (1 << 3), EventLoopEventFlagsRight = (1 << 4), EventLoopEventFlagsBack = (1 << 5), EventLoopEventFlagsExit = (1 << 6), } EventLoopEventFlags; #define EVENT_LOOP_EVENT_FLAGS_MASK \ (EventLoopEventFlagsOk | EventLoopEventFlagsUp | EventLoopEventFlagsDown | \ EventLoopEventFlagsLeft | EventLoopEventFlagsRight | EventLoopEventFlagsBack | \ EventLoopEventFlagsExit) // This function is executed in the GUI context each time an input event occurs (e.g. the user pressed a key) static void event_loop_event_flags_app_input_callback(InputEvent* event, void* context) { furi_assert(context); EventLoopEventFlagsApp* app = context; UNUSED(app); if(event->type == InputTypePress) { if(event->key == InputKeyOk) { furi_event_flag_set(app->event_flag, EventLoopEventFlagsOk); } else if(event->key == InputKeyUp) { furi_event_flag_set(app->event_flag, EventLoopEventFlagsUp); } else if(event->key == InputKeyDown) { furi_event_flag_set(app->event_flag, EventLoopEventFlagsDown); } else if(event->key == InputKeyLeft) { furi_event_flag_set(app->event_flag, EventLoopEventFlagsLeft); } else if(event->key == InputKeyRight) { furi_event_flag_set(app->event_flag, EventLoopEventFlagsRight); } else if(event->key == InputKeyBack) { furi_event_flag_set(app->event_flag, EventLoopEventFlagsBack); } } else if(event->type == InputTypeLong) { if(event->key == InputKeyBack) { furi_event_flag_set(app->event_flag, EventLoopEventFlagsExit); } } } // This function is executed each time a new event flag is inserted in the input event flag. static void event_loop_event_flags_app_event_flags_callback(FuriEventLoopObject* object, void* context) { furi_assert(context); EventLoopEventFlagsApp* app = context; furi_assert(object == app->event_flag); EventLoopEventFlags events = furi_event_flag_wait(app->event_flag, EVENT_LOOP_EVENT_FLAGS_MASK, FuriFlagWaitAny, 0); furi_check((events) != 0); if(events & EventLoopEventFlagsOk) { FURI_LOG_I(TAG, "Press \"Ok\""); } if(events & EventLoopEventFlagsUp) { FURI_LOG_I(TAG, "Press \"Up\""); } if(events & EventLoopEventFlagsDown) { FURI_LOG_I(TAG, "Press \"Down\""); } if(events & EventLoopEventFlagsLeft) { FURI_LOG_I(TAG, "Press \"Left\""); } if(events & EventLoopEventFlagsRight) { FURI_LOG_I(TAG, "Press \"Right\""); } if(events & EventLoopEventFlagsBack) { FURI_LOG_I(TAG, "Press \"Back\""); } if(events & EventLoopEventFlagsExit) { FURI_LOG_I(TAG, "Exit App"); furi_event_loop_stop(app->event_loop); } } static EventLoopEventFlagsApp* event_loop_event_flags_app_alloc(void) { EventLoopEventFlagsApp* app = malloc(sizeof(EventLoopEventFlagsApp)); // Create event loop instances. app->event_loop = furi_event_loop_alloc(); // Create event flag instances. app->event_flag = furi_event_flag_alloc(); // Create GUI instance. app->gui = furi_record_open(RECORD_GUI); app->view_port = view_port_alloc(); // Gain exclusive access to the input events view_port_input_callback_set(app->view_port, event_loop_event_flags_app_input_callback, app); gui_add_view_port(app->gui, app->view_port, GuiLayerFullscreen); // Notify the event loop about incoming messages in the event flag furi_event_loop_subscribe_event_flag( app->event_loop, app->event_flag, FuriEventLoopEventIn | FuriEventLoopEventFlagEdge, event_loop_event_flags_app_event_flags_callback, app); return app; } static void event_loop_event_flags_app_free(EventLoopEventFlagsApp* app) { gui_remove_view_port(app->gui, app->view_port); furi_record_close(RECORD_GUI); app->gui = NULL; // Delete all instances view_port_free(app->view_port); app->view_port = NULL; // IMPORTANT: The user code MUST unsubscribe from all events before deleting the event loop. // Failure to do so will result in a crash. furi_event_loop_unsubscribe(app->event_loop, app->event_flag); furi_event_flag_free(app->event_flag); app->event_flag = NULL; furi_event_loop_free(app->event_loop); app->event_loop = NULL; free(app); } static void event_loop_event_flags_app_run(EventLoopEventFlagsApp* app) { FURI_LOG_I(TAG, "Press keys to see them printed here."); FURI_LOG_I(TAG, "Quickly press different keys to generate events."); FURI_LOG_I(TAG, "Long press \"Back\" to exit app."); // Run the application event loop. This call will block until the application is about to exit. furi_event_loop_run(app->event_loop); } /******************************************************************* * vvv START HERE vvv * * The application's entry point - referenced in application.fam *******************************************************************/ int32_t example_event_loop_event_flags_app(void* arg) { UNUSED(arg); EventLoopEventFlagsApp* app = event_loop_event_flags_app_alloc(); event_loop_event_flags_app_run(app); event_loop_event_flags_app_free(app); return 0; } ================================================ FILE: applications/examples/example_event_loop/example_event_loop_multi.c ================================================ /** * @file example_event_loop_multi.c * @brief Example application that demonstrates multiple primitives used with two FuriEventLoop instances. * * This application simulates a complex use case of having two concurrent event loops (each one executing in * its own thread) using a stream buffer for communication and additional timers and message passing to handle * the keypad input. Additionally, it shows how to use thread signals to stop an event loop in another thread. * The GUI functionality is there only for the purpose of exclusive access to the input events. * * The application's functionality consists of the following: * - Print keypad key names and types when pressed, * - If the Back key is long-pressed, a countdown starts upon completion of which the app exits, * - The countdown can be cancelled by long-pressing the Ok button, it also resets the counter, * - Blocks of random data are periodically generated in a separate thread, * - When ready, the main application thread gets notified and prints the data. */ #include #include #include #include #define TAG "ExampleEventLoopMulti" #define COUNTDOWN_START_VALUE (5UL) #define COUNTDOWN_INTERVAL_MS (1000UL) #define WORKER_DATA_INTERVAL_MS (1500UL) #define INPUT_QUEUE_SIZE (8) #define STREAM_BUFFER_SIZE (16) typedef struct { FuriEventLoop* event_loop; FuriEventLoopTimer* timer; FuriStreamBuffer* stream_buffer; } EventLoopMultiAppWorker; typedef struct { Gui* gui; ViewPort* view_port; FuriThread* worker_thread; FuriEventLoop* event_loop; FuriMessageQueue* input_queue; FuriEventLoopTimer* exit_timer; FuriStreamBuffer* stream_buffer; uint32_t exit_countdown_value; } EventLoopMultiApp; /* * Worker functions */ // This function is executed each time the data is taken out of the stream buffer. It is used to restart the worker timer. static void event_loop_multi_app_stream_buffer_worker_callback(FuriEventLoopObject* object, void* context) { furi_assert(context); EventLoopMultiAppWorker* worker = context; furi_assert(object == worker->stream_buffer); FURI_LOG_I(TAG, "Data was removed from buffer"); // Restart the timer to generate another block of random data. furi_event_loop_timer_start(worker->timer, WORKER_DATA_INTERVAL_MS); } // This function is executed when the worker timer expires. The timer will NOT restart automatically // since it is of one-shot type. static void event_loop_multi_app_worker_timer_callback(void* context) { furi_assert(context); EventLoopMultiAppWorker* worker = context; // Generate a block of random data. uint8_t data[STREAM_BUFFER_SIZE]; furi_hal_random_fill_buf(data, sizeof(data)); // Put the generated data in the stream buffer. // IMPORTANT: No waiting in the event handlers! furi_check( furi_stream_buffer_send(worker->stream_buffer, &data, sizeof(data), 0) == sizeof(data)); } static EventLoopMultiAppWorker* event_loop_multi_app_worker_alloc(FuriStreamBuffer* stream_buffer) { EventLoopMultiAppWorker* worker = malloc(sizeof(EventLoopMultiAppWorker)); // Create the worker event loop. worker->event_loop = furi_event_loop_alloc(); // Create the timer governing the data generation. // It is of one-shot type, i.e. it will not restart automatically upon expiration. worker->timer = furi_event_loop_timer_alloc( worker->event_loop, event_loop_multi_app_worker_timer_callback, FuriEventLoopTimerTypeOnce, worker); // Using the same stream buffer as the main thread (it was already created beforehand). worker->stream_buffer = stream_buffer; // Notify the worker event loop about data being taken out of the stream buffer. furi_event_loop_subscribe_stream_buffer( worker->event_loop, worker->stream_buffer, FuriEventLoopEventOut | FuriEventLoopEventFlagEdge, event_loop_multi_app_stream_buffer_worker_callback, worker); return worker; } static void event_loop_multi_app_worker_free(EventLoopMultiAppWorker* worker) { // IMPORTANT: The user code MUST unsubscribe from all events before deleting the event loop. // Failure to do so will result in a crash. furi_event_loop_unsubscribe(worker->event_loop, worker->stream_buffer); // IMPORTANT: All timers MUST be deleted before deleting the associated event loop. // Failure to do so will result in a crash. furi_event_loop_timer_free(worker->timer); // Now it is okay to delete the event loop. furi_event_loop_free(worker->event_loop); free(worker); } static void event_loop_multi_app_worker_run(EventLoopMultiAppWorker* worker) { furi_event_loop_timer_start(worker->timer, WORKER_DATA_INTERVAL_MS); furi_event_loop_run(worker->event_loop); } // This function is the worker thread body and (obviously) is executed in the worker thread. static int32_t event_loop_multi_app_worker_thread(void* context) { furi_assert(context); EventLoopMultiApp* app = context; // Because an event loop is used, it MUST be created in the thread it will be run in. // Therefore, the worker creation and deletion is handled in the worker thread. EventLoopMultiAppWorker* worker = event_loop_multi_app_worker_alloc(app->stream_buffer); event_loop_multi_app_worker_run(worker); event_loop_multi_app_worker_free(worker); return 0; } /* * Main application functions */ // This function is executed in the GUI context each time an input event occurs (e.g. the user pressed a key) static void event_loop_multi_app_input_callback(InputEvent* event, void* context) { furi_assert(context); EventLoopMultiApp* app = context; // Pass the event to the the application's input queue furi_check(furi_message_queue_put(app->input_queue, event, FuriWaitForever) == FuriStatusOk); } // This function is executed each time new data is available in the stream buffer. static void event_loop_multi_app_stream_buffer_callback(FuriEventLoopObject* object, void* context) { furi_assert(context); EventLoopMultiApp* app = context; furi_assert(object == app->stream_buffer); // Get the data from the stream buffer uint8_t data[STREAM_BUFFER_SIZE]; // IMPORTANT: No waiting in the event handlers! furi_check( furi_stream_buffer_receive(app->stream_buffer, &data, sizeof(data), 0) == sizeof(data)); // Format the data for printing and print it to the debug output. FuriString* tmp_str = furi_string_alloc(); for(uint32_t i = 0; i < sizeof(data); ++i) { furi_string_cat_printf(tmp_str, "%02X ", data[i]); } FURI_LOG_I(TAG, "Received data: %s", furi_string_get_cstr(tmp_str)); furi_string_free(tmp_str); } // This function is executed each time a new message is inserted in the input queue. static void event_loop_multi_app_input_queue_callback(FuriEventLoopObject* object, void* context) { furi_assert(context); EventLoopMultiApp* app = context; furi_assert(object == app->input_queue); InputEvent event; // IMPORTANT: No waiting in the event handlers! furi_check(furi_message_queue_get(app->input_queue, &event, 0) == FuriStatusOk); if(event.type == InputTypeLong) { // The user has long-pressed the Back key, try starting the countdown. if(event.key == InputKeyBack) { if(!furi_event_loop_timer_is_running(app->exit_timer)) { // Actually start the countdown FURI_LOG_I(TAG, "Starting exit countdown!"); furi_event_loop_timer_start(app->exit_timer, COUNTDOWN_INTERVAL_MS); } else { // The countdown is already in progress, print a warning message FURI_LOG_W(TAG, "Countdown has already been started"); } // The user has long-pressed the Ok key, try stopping the countdown. } else if(event.key == InputKeyOk) { if(furi_event_loop_timer_is_running(app->exit_timer)) { // Actually cancel the countdown FURI_LOG_I(TAG, "Exit countdown cancelled!"); app->exit_countdown_value = COUNTDOWN_START_VALUE; furi_event_loop_timer_stop(app->exit_timer); } else { // The countdown is not running, print a warning message FURI_LOG_W(TAG, "Countdown has not been started yet"); } } else { // Not a Back or Ok key, just print its name. FURI_LOG_I(TAG, "Long press: %s", input_get_key_name(event.key)); } } else if(event.type == InputTypeShort) { // Not a long press, just print the key's name. FURI_LOG_I(TAG, "Short press: %s", input_get_key_name(event.key)); } } // This function is executed each time the countdown timer expires. static void event_loop_multi_app_exit_timer_callback(void* context) { furi_assert(context); EventLoopMultiApp* app = context; FURI_LOG_I(TAG, "Exiting in %lu ...", app->exit_countdown_value); // If the coundown value has reached 0, exit the application if(app->exit_countdown_value == 0) { FURI_LOG_I(TAG, "Exiting NOW!"); // Send a signal to the worker thread to exit. // A signal handler that handles FuriSignalExit is already set by default. furi_thread_signal(app->worker_thread, FuriSignalExit, NULL); // Request the application event loop to stop. furi_event_loop_stop(app->event_loop); // Otherwise just decrement it and wait for the next time the timer expires. } else { app->exit_countdown_value -= 1; } } static EventLoopMultiApp* event_loop_multi_app_alloc(void) { EventLoopMultiApp* app = malloc(sizeof(EventLoopMultiApp)); // Create event loop instances. app->event_loop = furi_event_loop_alloc(); // Create a worker thread instance. The worker event loop will execute inside it. app->worker_thread = furi_thread_alloc_ex( "EventLoopMultiWorker", 1024, event_loop_multi_app_worker_thread, app); // Create a message queue to receive the input events. app->input_queue = furi_message_queue_alloc(INPUT_QUEUE_SIZE, sizeof(InputEvent)); // Create a stream buffer to receive the generated data. app->stream_buffer = furi_stream_buffer_alloc(STREAM_BUFFER_SIZE, STREAM_BUFFER_SIZE); // Create a timer to run the countdown. app->exit_timer = furi_event_loop_timer_alloc( app->event_loop, event_loop_multi_app_exit_timer_callback, FuriEventLoopTimerTypePeriodic, app); app->gui = furi_record_open(RECORD_GUI); app->view_port = view_port_alloc(); // Start the countdown from this value app->exit_countdown_value = COUNTDOWN_START_VALUE; // Gain exclusive access to the input events view_port_input_callback_set(app->view_port, event_loop_multi_app_input_callback, app); gui_add_view_port(app->gui, app->view_port, GuiLayerFullscreen); // Notify the event loop about incoming messages in the queue furi_event_loop_subscribe_message_queue( app->event_loop, app->input_queue, FuriEventLoopEventIn, event_loop_multi_app_input_queue_callback, app); // Notify the event loop about new data in the stream buffer furi_event_loop_subscribe_stream_buffer( app->event_loop, app->stream_buffer, FuriEventLoopEventIn | FuriEventLoopEventFlagEdge, event_loop_multi_app_stream_buffer_callback, app); return app; } static void event_loop_multi_app_free(EventLoopMultiApp* app) { gui_remove_view_port(app->gui, app->view_port); furi_record_close(RECORD_GUI); // IMPORTANT: The user code MUST unsubscribe from all events before deleting the event loop. // Failure to do so will result in a crash. furi_event_loop_unsubscribe(app->event_loop, app->input_queue); furi_event_loop_unsubscribe(app->event_loop, app->stream_buffer); // Delete all instances view_port_free(app->view_port); furi_message_queue_free(app->input_queue); furi_stream_buffer_free(app->stream_buffer); // IMPORTANT: All timers MUST be deleted before deleting the associated event loop. // Failure to do so will result in a crash. furi_event_loop_timer_free(app->exit_timer); furi_thread_free(app->worker_thread); furi_event_loop_free(app->event_loop); free(app); } static void event_loop_multi_app_run(EventLoopMultiApp* app) { FURI_LOG_I(TAG, "Press keys to see them printed here."); FURI_LOG_I(TAG, "Long press \"Back\" to exit after %lu seconds.", COUNTDOWN_START_VALUE); FURI_LOG_I(TAG, "Long press \"Ok\" to cancel the countdown."); // Start the worker thread furi_thread_start(app->worker_thread); // Run the application event loop. This call will block until the application is about to exit. furi_event_loop_run(app->event_loop); // Wait for the worker thread to finish. furi_thread_join(app->worker_thread); } /******************************************************************* * vvv START HERE vvv * * The application's entry point - referenced in application.fam *******************************************************************/ int32_t example_event_loop_multi_app(void* arg) { UNUSED(arg); EventLoopMultiApp* app = event_loop_multi_app_alloc(); event_loop_multi_app_run(app); event_loop_multi_app_free(app); return 0; } ================================================ FILE: applications/examples/example_event_loop/example_event_loop_mutex.c ================================================ /** * @file example_event_loop_mutex.c * @brief Example application that demonstrates the FuriEventLoop and FuriMutex integration. * * This application simulates a use case where a time-consuming blocking operation is executed * in a separate thread and a mutex is being used for synchronization. The application runs 10 iterations * of the above mentioned simulated work and prints the results to the debug output each time, then exits. */ #include #include #define TAG "ExampleEventLoopMutex" #define WORKER_ITERATION_COUNT (10) // We are interested in IN events (for the mutex, that means that the mutex has been released), // using edge trigger mode (reacting only to changes in mutex state) and // employing one-shot mode to automatically unsubscribe before the event is processed. #define MUTEX_EVENT_AND_FLAGS \ (FuriEventLoopEventIn | FuriEventLoopEventFlagEdge | FuriEventLoopEventFlagOnce) typedef struct { FuriEventLoop* event_loop; FuriThread* worker_thread; FuriMutex* worker_mutex; uint8_t worker_result; } EventLoopMutexApp; // This funciton is being run in a separate thread to simulate lenghty blocking operations static int32_t event_loop_mutex_app_worker_thread(void* context) { furi_assert(context); EventLoopMutexApp* app = context; FURI_LOG_I(TAG, "Worker thread started"); // Run 10 iterations of simulated work for(uint32_t i = 0; i < WORKER_ITERATION_COUNT; ++i) { FURI_LOG_I(TAG, "Doing work ..."); // Take the mutex so that no-one can access the worker_result variable furi_check(furi_mutex_acquire(app->worker_mutex, FuriWaitForever) == FuriStatusOk); // Simulate a blocking operation with a random delay between 900 and 1100 ms const uint32_t work_time_ms = 900 + furi_hal_random_get() % 200; furi_delay_ms(work_time_ms); // Simulate a result with a random number between 0 and 255 app->worker_result = furi_hal_random_get() % 0xFF; FURI_LOG_I(TAG, "Work done in %lu ms", work_time_ms); // Release the mutex, which will notify the event loop that the result is ready furi_check(furi_mutex_release(app->worker_mutex) == FuriStatusOk); // Return control to the scheduler so that the event loop can take the mutex in its turn furi_thread_yield(); } FURI_LOG_I(TAG, "All work done, worker thread out!"); // Request the event loop to stop furi_event_loop_stop(app->event_loop); return 0; } // This function is being run each time when the mutex gets released static void event_loop_mutex_app_event_callback(FuriEventLoopObject* object, void* context) { furi_assert(context); EventLoopMutexApp* app = context; furi_assert(object == app->worker_mutex); // Take the mutex so that no-one can access the worker_result variable // IMPORTANT: the wait time MUST be 0, i.e. the event loop event callbacks // must NOT ever block. If it is possible that the mutex will be taken by // others, then the event callback code must take it into account. furi_check(furi_mutex_acquire(app->worker_mutex, 0) == FuriStatusOk); // Access the worker_result variable and print it. FURI_LOG_I(TAG, "Result available! Value: %u", app->worker_result); // Release the mutex, enabling the worker thread to continue when it's ready furi_check(furi_mutex_release(app->worker_mutex) == FuriStatusOk); // Subscribe for the mutex release events again, since we were unsubscribed automatically // before processing the event. furi_event_loop_subscribe_mutex( app->event_loop, app->worker_mutex, MUTEX_EVENT_AND_FLAGS, event_loop_mutex_app_event_callback, app); } static EventLoopMutexApp* event_loop_mutex_app_alloc(void) { EventLoopMutexApp* app = malloc(sizeof(EventLoopMutexApp)); // Create an event loop instance. app->event_loop = furi_event_loop_alloc(); // Create a worker thread instance. app->worker_thread = furi_thread_alloc_ex( "EventLoopMutexWorker", 1024, event_loop_mutex_app_worker_thread, app); // Create a mutex instance. app->worker_mutex = furi_mutex_alloc(FuriMutexTypeNormal); // Subscribe for the mutex release events. // Note that since FuriEventLoopEventFlagOneShot is used, we will be automatically unsubscribed // from events before entering the event processing callback. This is necessary in order to not // trigger on events caused by releasing the mutex in the callback. furi_event_loop_subscribe_mutex( app->event_loop, app->worker_mutex, MUTEX_EVENT_AND_FLAGS, event_loop_mutex_app_event_callback, app); return app; } static void event_loop_mutex_app_free(EventLoopMutexApp* app) { // IMPORTANT: The user code MUST unsubscribe from all events before deleting the event loop. // Failure to do so will result in a crash. furi_event_loop_unsubscribe(app->event_loop, app->worker_mutex); // Delete all instances furi_thread_free(app->worker_thread); furi_mutex_free(app->worker_mutex); furi_event_loop_free(app->event_loop); free(app); } static void event_loop_mutex_app_run(EventLoopMutexApp* app) { furi_thread_start(app->worker_thread); furi_event_loop_run(app->event_loop); furi_thread_join(app->worker_thread); } // The application's entry point - referenced in application.fam int32_t example_event_loop_mutex_app(void* arg) { UNUSED(arg); EventLoopMutexApp* app = event_loop_mutex_app_alloc(); event_loop_mutex_app_run(app); event_loop_mutex_app_free(app); return 0; } ================================================ FILE: applications/examples/example_event_loop/example_event_loop_stream_buffer.c ================================================ /** * @file example_event_loop_stream_buffer.c * @brief Example application that demonstrates the FuriEventLoop and FuriStreamBuffer integration. * * This application simulates a use case where some data data stream comes from a separate thread (or hardware) * and a stream buffer is used to act as an intermediate buffer. The worker thread produces 10 iterations of 32 * bytes of simulated data, and each time when the buffer is half-filled, the data is taken out of it and printed * to the debug output. After completing all iterations, the application exits. */ #include #include #define TAG "ExampleEventLoopStreamBuffer" #define WORKER_ITERATION_COUNT (10) #define STREAM_BUFFER_SIZE (32) #define STREAM_BUFFER_TRIG_LEVEL (STREAM_BUFFER_SIZE / 2) #define STREAM_BUFFER_EVENT_AND_FLAGS (FuriEventLoopEventIn | FuriEventLoopEventFlagEdge) typedef struct { FuriEventLoop* event_loop; FuriThread* worker_thread; FuriStreamBuffer* stream_buffer; } EventLoopStreamBufferApp; // This funciton is being run in a separate thread to simulate data coming from a producer thread or some device. static int32_t event_loop_stream_buffer_app_worker_thread(void* context) { furi_assert(context); EventLoopStreamBufferApp* app = context; FURI_LOG_I(TAG, "Worker thread started"); for(uint32_t i = 0; i < WORKER_ITERATION_COUNT; ++i) { // Produce 32 bytes of simulated data. for(uint32_t j = 0; j < STREAM_BUFFER_SIZE; ++j) { // Simulate incoming data by generating a random byte. uint8_t data = furi_hal_random_get() % 0xFF; // Put the byte in the buffer. Depending on the use case, it may or may be not acceptable // to wait for free space to become available. furi_check( furi_stream_buffer_send(app->stream_buffer, &data, 1, FuriWaitForever) == 1); // Delay between 30 and 50 ms to slow down the output for clarity. furi_delay_ms(30 + furi_hal_random_get() % 20); } } FURI_LOG_I(TAG, "All work done, worker thread out!"); // Request the event loop to stop furi_event_loop_stop(app->event_loop); return 0; } // This function is being run each time when the number of bytes in the buffer is above its trigger level. static void event_loop_stream_buffer_app_event_callback(FuriEventLoopObject* object, void* context) { furi_assert(context); EventLoopStreamBufferApp* app = context; furi_assert(object == app->stream_buffer); // Temporary buffer that can hold at most half of the stream buffer's capacity. uint8_t data[STREAM_BUFFER_TRIG_LEVEL]; // Receive the data. It is guaranteed that the amount of data in the buffer will be equal to // or greater than the trigger level, therefore, no waiting delay is necessary. furi_check( furi_stream_buffer_receive(app->stream_buffer, data, sizeof(data), 0) == sizeof(data)); // Format the data for printing and print it to the debug output. FuriString* tmp_str = furi_string_alloc(); for(uint32_t i = 0; i < sizeof(data); ++i) { furi_string_cat_printf(tmp_str, "%02X ", data[i]); } FURI_LOG_I(TAG, "Received data: %s", furi_string_get_cstr(tmp_str)); furi_string_free(tmp_str); } static EventLoopStreamBufferApp* event_loop_stream_buffer_app_alloc(void) { EventLoopStreamBufferApp* app = malloc(sizeof(EventLoopStreamBufferApp)); // Create an event loop instance. app->event_loop = furi_event_loop_alloc(); // Create a worker thread instance. app->worker_thread = furi_thread_alloc_ex( "EventLoopStreamBufferWorker", 1024, event_loop_stream_buffer_app_worker_thread, app); // Create a stream_buffer instance. app->stream_buffer = furi_stream_buffer_alloc(STREAM_BUFFER_SIZE, STREAM_BUFFER_TRIG_LEVEL); // Subscribe for the stream buffer IN events in edge triggered mode. furi_event_loop_subscribe_stream_buffer( app->event_loop, app->stream_buffer, STREAM_BUFFER_EVENT_AND_FLAGS, event_loop_stream_buffer_app_event_callback, app); return app; } static void event_loop_stream_buffer_app_free(EventLoopStreamBufferApp* app) { // IMPORTANT: The user code MUST unsubscribe from all events before deleting the event loop. // Failure to do so will result in a crash. furi_event_loop_unsubscribe(app->event_loop, app->stream_buffer); // Delete all instances furi_thread_free(app->worker_thread); furi_stream_buffer_free(app->stream_buffer); furi_event_loop_free(app->event_loop); free(app); } static void event_loop_stream_buffer_app_run(EventLoopStreamBufferApp* app) { furi_thread_start(app->worker_thread); furi_event_loop_run(app->event_loop); furi_thread_join(app->worker_thread); } // The application's entry point - referenced in application.fam int32_t example_event_loop_stream_buffer_app(void* arg) { UNUSED(arg); EventLoopStreamBufferApp* app = event_loop_stream_buffer_app_alloc(); event_loop_stream_buffer_app_run(app); event_loop_stream_buffer_app_free(app); return 0; } ================================================ FILE: applications/examples/example_event_loop/example_event_loop_timer.c ================================================ /** * @file example_event_loop_timer.c * @brief Example application that demonstrates FuriEventLoop's software timer capability. * * This application prints a countdown from 10 to 0 to the debug output and then exits. * Despite only one timer being used in this example for clarity, an event loop instance can have * an arbitrary number of independent timers of any type (periodic or one-shot). * */ #include #define TAG "ExampleEventLoopTimer" #define COUNTDOWN_START_VALUE (10) #define COUNTDOWN_INTERVAL_MS (1000) typedef struct { FuriEventLoop* event_loop; FuriEventLoopTimer* timer; uint32_t countdown_value; } EventLoopTimerApp; // This function is called each time the timer expires (i.e. once per 1000 ms (1s) in this example) static void event_loop_timer_callback(void* context) { furi_assert(context); EventLoopTimerApp* app = context; // Print the countdown value FURI_LOG_I(TAG, "T-00:00:%02lu", app->countdown_value); if(app->countdown_value == 0) { // If the countdown reached 0, print the final line and stop the event loop FURI_LOG_I(TAG, "Blast off to adventure!"); // After this call, the control will be returned back to event_loop_timers_app_run() furi_event_loop_stop(app->event_loop); } else { // Decrement the countdown value app->countdown_value -= 1; } } static EventLoopTimerApp* event_loop_timer_app_alloc(void) { EventLoopTimerApp* app = malloc(sizeof(EventLoopTimerApp)); // Create an event loop instance. app->event_loop = furi_event_loop_alloc(); // Create a software timer instance. // The timer is bound to the event loop instance and will execute in its context. // Here, the timer type is periodic, i.e. it will restart automatically after expiring. app->timer = furi_event_loop_timer_alloc( app->event_loop, event_loop_timer_callback, FuriEventLoopTimerTypePeriodic, app); // The countdown value will be tracked in this variable. app->countdown_value = COUNTDOWN_START_VALUE; return app; } static void event_loop_timer_app_free(EventLoopTimerApp* app) { // IMPORTANT: All event loop timers MUST be deleted BEFORE deleting the event loop itself. // Failure to do so will result in a crash. furi_event_loop_timer_free(app->timer); // With all timers deleted, it's safe to delete the event loop. furi_event_loop_free(app->event_loop); free(app); } static void event_loop_timer_app_run(EventLoopTimerApp* app) { FURI_LOG_I(TAG, "All systems go! Prepare for countdown!"); // Timers can be started either before the event loop is run, or in any // callback function called by a running event loop. furi_event_loop_timer_start(app->timer, COUNTDOWN_INTERVAL_MS); // This call will block until furi_event_loop_stop() is called. furi_event_loop_run(app->event_loop); } // The application's entry point - referenced in application.fam int32_t example_event_loop_timer_app(void* arg) { UNUSED(arg); EventLoopTimerApp* app = event_loop_timer_app_alloc(); event_loop_timer_app_run(app); event_loop_timer_app_free(app); return 0; } ================================================ FILE: applications/examples/example_images/ReadMe.md ================================================ # Application icons {#example_app_images} ## Source code Source code for this example can be found [here](https://github.com/flipperdevices/flipperzero-firmware/tree/dev/applications/examples/example_images). ## General principle To use icons, do the following: * Add a line to the application manifest: `fap_icon_assets="folder"`, where `folder` points to the folder where your icons are located * Add `#include "application_id_icons.h"` to the application code, where `application_id` is the appid from the manifest * Every icon in the folder will be available as a `I_icon_name` variable, where `icon_name` is the name of the icon file without the extension ## Example We have an application with the following manifest: ``` App( appid="example_images", ... fap_icon_assets="images", ) ``` So the icons are in the `images` folder and will be available in the generated `example_images_icons.h` file. The example code is located in `example_images_main.c` and contains the following line: ``` #include "example_images_icons.h" ``` Image `dolphin_71x25.png` is available as `I_dolphin_71x25`. ================================================ FILE: applications/examples/example_images/application.fam ================================================ App( appid="example_images", name="Example: Images", apptype=FlipperAppType.EXTERNAL, entry_point="example_images_main", requires=["gui"], stack_size=1 * 1024, fap_category="Examples", fap_icon_assets="images", ) ================================================ FILE: applications/examples/example_images/example_images.c ================================================ /** * @file example_images.c * @brief Custom images example. */ #include #include #include #include /* Magic happens here -- this file is generated by fbt. * Just set fap_icon_assets in application.fam and #include {APPID}_icons.h */ #include "example_images_icons.h" typedef struct { int32_t x, y; } ImagePosition; static ImagePosition image_position = {.x = 0, .y = 0}; // Screen is 128x64 px static void app_draw_callback(Canvas* canvas, void* ctx) { UNUSED(ctx); canvas_clear(canvas); canvas_draw_icon(canvas, image_position.x, image_position.y, &I_dolphin_71x25); } 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 example_images_main(void* p) { UNUSED(p); FuriMessageQueue* event_queue = furi_message_queue_alloc(8, sizeof(InputEvent)); // Configure view port ViewPort* view_port = view_port_alloc(); view_port_draw_callback_set(view_port, app_draw_callback, NULL); view_port_input_callback_set(view_port, app_input_callback, event_queue); // Register view port in GUI Gui* gui = furi_record_open(RECORD_GUI); gui_add_view_port(gui, view_port, GuiLayerFullscreen); InputEvent event; bool running = true; while(running) { if(furi_message_queue_get(event_queue, &event, 100) == FuriStatusOk) { if((event.type == InputTypePress) || (event.type == InputTypeRepeat)) { switch(event.key) { case InputKeyLeft: image_position.x -= 2; break; case InputKeyRight: image_position.x += 2; break; case InputKeyUp: image_position.y -= 2; break; case InputKeyDown: image_position.y += 2; break; default: running = false; break; } } } view_port_update(view_port); } view_port_enabled_set(view_port, false); gui_remove_view_port(gui, view_port); view_port_free(view_port); furi_message_queue_free(event_queue); furi_record_close(RECORD_GUI); return 0; } ================================================ FILE: applications/examples/example_number_input/ReadMe.md ================================================ # Number Input {#example_number_input} Simple keyboard that limits user inputs to a full number (integer). Useful to enforce correct entries without the need for intense validations after a user input. ## Source code Source code for this example can be found [here](https://github.com/flipperdevices/flipperzero-firmware/tree/dev/applications/examples/example_number_input). ## General principle Definition of min/max values is required. Numbers are of type int32_t. If negative numbers are allowed within min - max, an additional button is displayed to switch the sign between + and -. It is also possible to define a header text, as shown in this example app with the 3 different input options. ================================================ FILE: applications/examples/example_number_input/application.fam ================================================ App( appid="example_number_input", name="Example: Number Input", apptype=FlipperAppType.EXTERNAL, entry_point="example_number_input", requires=["gui"], stack_size=1 * 1024, fap_icon="example_number_input_10px.png", fap_category="Examples", ) ================================================ FILE: applications/examples/example_number_input/example_number_input.c ================================================ #include "example_number_input.h" bool example_number_input_custom_event_callback(void* context, uint32_t event) { furi_assert(context); ExampleNumberInput* app = context; return scene_manager_handle_custom_event(app->scene_manager, event); } static bool example_number_input_back_event_callback(void* context) { furi_assert(context); ExampleNumberInput* app = context; return scene_manager_handle_back_event(app->scene_manager); } static ExampleNumberInput* example_number_input_alloc() { ExampleNumberInput* app = malloc(sizeof(ExampleNumberInput)); app->gui = furi_record_open(RECORD_GUI); app->view_dispatcher = view_dispatcher_alloc(); app->scene_manager = scene_manager_alloc(&example_number_input_scene_handlers, app); view_dispatcher_set_event_callback_context(app->view_dispatcher, app); view_dispatcher_set_custom_event_callback( app->view_dispatcher, example_number_input_custom_event_callback); view_dispatcher_set_navigation_event_callback( app->view_dispatcher, example_number_input_back_event_callback); app->number_input = number_input_alloc(); view_dispatcher_add_view( app->view_dispatcher, ExampleNumberInputViewIdNumberInput, number_input_get_view(app->number_input)); app->dialog_ex = dialog_ex_alloc(); view_dispatcher_add_view( app->view_dispatcher, ExampleNumberInputViewIdShowNumber, dialog_ex_get_view(app->dialog_ex)); app->current_number = 5; app->min_value = INT32_MIN; app->max_value = INT32_MAX; return app; } static void example_number_input_free(ExampleNumberInput* app) { furi_assert(app); view_dispatcher_remove_view(app->view_dispatcher, ExampleNumberInputViewIdShowNumber); dialog_ex_free(app->dialog_ex); view_dispatcher_remove_view(app->view_dispatcher, ExampleNumberInputViewIdNumberInput); number_input_free(app->number_input); scene_manager_free(app->scene_manager); view_dispatcher_free(app->view_dispatcher); furi_record_close(RECORD_GUI); app->gui = NULL; //Remove whatever is left free(app); } int32_t example_number_input(void* p) { UNUSED(p); ExampleNumberInput* app = example_number_input_alloc(); view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); scene_manager_next_scene(app->scene_manager, ExampleNumberInputSceneShowNumber); view_dispatcher_run(app->view_dispatcher); example_number_input_free(app); return 0; } ================================================ FILE: applications/examples/example_number_input/example_number_input.h ================================================ #pragma once #include #include #include #include #include #include #include #include #include #include #include "scenes/example_number_input_scene.h" typedef struct ExampleNumberInputShowNumber ExampleNumberInputShowNumber; typedef enum { ExampleNumberInputViewIdShowNumber, ExampleNumberInputViewIdNumberInput, } ExampleNumberInputViewId; typedef struct { Gui* gui; SceneManager* scene_manager; ViewDispatcher* view_dispatcher; NumberInput* number_input; DialogEx* dialog_ex; int32_t current_number; int32_t min_value; int32_t max_value; } ExampleNumberInput; ================================================ FILE: applications/examples/example_number_input/scenes/example_number_input_scene.c ================================================ #include "example_number_input_scene.h" // Generate scene on_enter handlers array #define ADD_SCENE(prefix, name, id) prefix##_scene_##name##_on_enter, void (*const example_number_input_on_enter_handlers[])(void*) = { #include "example_number_input_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 example_number_input_on_event_handlers[])(void* context, SceneManagerEvent event) = { #include "example_number_input_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 example_number_input_on_exit_handlers[])(void* context) = { #include "example_number_input_scene_config.h" }; #undef ADD_SCENE // Initialize scene handlers configuration structure const SceneManagerHandlers example_number_input_scene_handlers = { .on_enter_handlers = example_number_input_on_enter_handlers, .on_event_handlers = example_number_input_on_event_handlers, .on_exit_handlers = example_number_input_on_exit_handlers, .scene_num = ExampleNumberInputSceneNum, }; ================================================ FILE: applications/examples/example_number_input/scenes/example_number_input_scene.h ================================================ #pragma once #include // Generate scene id and total number #define ADD_SCENE(prefix, name, id) ExampleNumberInputScene##id, typedef enum { #include "example_number_input_scene_config.h" ExampleNumberInputSceneNum, } ExampleNumberInputScene; #undef ADD_SCENE extern const SceneManagerHandlers example_number_input_scene_handlers; // Generate scene on_enter handlers declaration #define ADD_SCENE(prefix, name, id) void prefix##_scene_##name##_on_enter(void*); #include "example_number_input_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 "example_number_input_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 "example_number_input_scene_config.h" #undef ADD_SCENE ================================================ FILE: applications/examples/example_number_input/scenes/example_number_input_scene_config.h ================================================ ADD_SCENE(example_number_input, input_number, InputNumber) ADD_SCENE(example_number_input, show_number, ShowNumber) ADD_SCENE(example_number_input, input_max, InputMax) ADD_SCENE(example_number_input, input_min, InputMin) ================================================ FILE: applications/examples/example_number_input/scenes/example_number_input_scene_input_max.c ================================================ #include "../example_number_input.h" void example_number_input_scene_input_max_callback(void* context, int32_t number) { ExampleNumberInput* app = context; app->max_value = number; view_dispatcher_send_custom_event(app->view_dispatcher, 0); } void example_number_input_scene_input_max_on_enter(void* context) { furi_assert(context); ExampleNumberInput* app = context; NumberInput* number_input = app->number_input; number_input_set_header_text(number_input, "Enter the maximum value"); number_input_set_result_callback( number_input, example_number_input_scene_input_max_callback, context, app->max_value, app->min_value, INT32_MAX); view_dispatcher_switch_to_view(app->view_dispatcher, ExampleNumberInputViewIdNumberInput); } bool example_number_input_scene_input_max_on_event(void* context, SceneManagerEvent event) { ExampleNumberInput* app = context; bool consumed = false; if(event.type == SceneManagerEventTypeCustom) { scene_manager_previous_scene(app->scene_manager); return true; } return consumed; } void example_number_input_scene_input_max_on_exit(void* context) { UNUSED(context); } ================================================ FILE: applications/examples/example_number_input/scenes/example_number_input_scene_input_min.c ================================================ #include "../example_number_input.h" void example_number_input_scene_input_min_callback(void* context, int32_t number) { ExampleNumberInput* app = context; app->min_value = number; view_dispatcher_send_custom_event(app->view_dispatcher, 0); } void example_number_input_scene_input_min_on_enter(void* context) { furi_assert(context); ExampleNumberInput* app = context; NumberInput* number_input = app->number_input; number_input_set_header_text(number_input, "Enter the minimum value"); number_input_set_result_callback( number_input, example_number_input_scene_input_min_callback, context, app->min_value, INT32_MIN, app->max_value); view_dispatcher_switch_to_view(app->view_dispatcher, ExampleNumberInputViewIdNumberInput); } bool example_number_input_scene_input_min_on_event(void* context, SceneManagerEvent event) { ExampleNumberInput* app = context; bool consumed = false; if(event.type == SceneManagerEventTypeCustom) { scene_manager_previous_scene(app->scene_manager); return true; } return consumed; } void example_number_input_scene_input_min_on_exit(void* context) { UNUSED(context); } ================================================ FILE: applications/examples/example_number_input/scenes/example_number_input_scene_input_number.c ================================================ #include "../example_number_input.h" void example_number_input_scene_input_number_callback(void* context, int32_t number) { ExampleNumberInput* app = context; app->current_number = number; view_dispatcher_send_custom_event(app->view_dispatcher, 0); } void example_number_input_scene_input_number_on_enter(void* context) { furi_assert(context); ExampleNumberInput* app = context; NumberInput* number_input = app->number_input; char str[50]; snprintf(str, sizeof(str), "Set Number (%ld - %ld)", app->min_value, app->max_value); number_input_set_header_text(number_input, str); number_input_set_result_callback( number_input, example_number_input_scene_input_number_callback, context, app->current_number, app->min_value, app->max_value); view_dispatcher_switch_to_view(app->view_dispatcher, ExampleNumberInputViewIdNumberInput); } bool example_number_input_scene_input_number_on_event(void* context, SceneManagerEvent event) { ExampleNumberInput* app = context; bool consumed = false; if(event.type == SceneManagerEventTypeCustom) { //Back button pressed scene_manager_previous_scene(app->scene_manager); return true; } return consumed; } void example_number_input_scene_input_number_on_exit(void* context) { UNUSED(context); } ================================================ FILE: applications/examples/example_number_input/scenes/example_number_input_scene_show_number.c ================================================ #include "../example_number_input.h" static void example_number_input_scene_confirm_dialog_callback(DialogExResult result, void* context) { ExampleNumberInput* app = context; view_dispatcher_send_custom_event(app->view_dispatcher, result); } static void example_number_input_scene_update_view(void* context) { ExampleNumberInput* app = context; DialogEx* dialog_ex = app->dialog_ex; dialog_ex_set_header(dialog_ex, "The number is", 64, 0, AlignCenter, AlignTop); char buffer[12] = {}; snprintf(buffer, sizeof(buffer), "%ld", app->current_number); dialog_ex_set_text(dialog_ex, buffer, 64, 29, AlignCenter, AlignCenter); dialog_ex_set_left_button_text(dialog_ex, "Min"); dialog_ex_set_right_button_text(dialog_ex, "Max"); dialog_ex_set_center_button_text(dialog_ex, "Change"); dialog_ex_set_result_callback(dialog_ex, example_number_input_scene_confirm_dialog_callback); dialog_ex_set_context(dialog_ex, app); } void example_number_input_scene_show_number_on_enter(void* context) { furi_assert(context); ExampleNumberInput* app = context; example_number_input_scene_update_view(app); view_dispatcher_switch_to_view(app->view_dispatcher, ExampleNumberInputViewIdShowNumber); } bool example_number_input_scene_show_number_on_event(void* context, SceneManagerEvent event) { ExampleNumberInput* app = context; bool consumed = false; if(event.type == SceneManagerEventTypeCustom) { switch(event.event) { case DialogExResultCenter: scene_manager_next_scene(app->scene_manager, ExampleNumberInputSceneInputNumber); consumed = true; break; case DialogExResultLeft: scene_manager_next_scene(app->scene_manager, ExampleNumberInputSceneInputMin); consumed = true; break; case DialogExResultRight: scene_manager_next_scene(app->scene_manager, ExampleNumberInputSceneInputMax); consumed = true; break; default: break; } } return consumed; } void example_number_input_scene_show_number_on_exit(void* context) { UNUSED(context); } ================================================ FILE: applications/examples/example_plugins/application.fam ================================================ App( appid="example_plugins", name="Example: App w/plugin", apptype=FlipperAppType.EXTERNAL, entry_point="example_plugins_app", stack_size=2 * 1024, fap_category="Examples", sources=["*.c", "!plugin*.c"], ) 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"], sources=["plugin1.c"], ) App( appid="example_plugin2", apptype=FlipperAppType.PLUGIN, entry_point="example_plugin2_ep", requires=["example_plugins_multi"], sources=["plugin2.c"], ) ================================================ FILE: applications/examples/example_plugins/example_plugins.c ================================================ /** * @file example_plugins.c * @brief Plugin host application example. * * Loads a single plugin and calls its methods. */ #include "plugin_interface.h" #include #include #include #include #define TAG "ExamplePlugins" 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; } ================================================ FILE: applications/examples/example_plugins/example_plugins_multi.c ================================================ /** * @file example_plugins_multi.c * @brief Advanced plugin host application example. * * It uses PluginManager to load all plugins from a directory */ #include "plugin_interface.h" #include #include #include #include #define TAG "ExamplePlugins" 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; } ================================================ FILE: applications/examples/example_plugins/plugin1.c ================================================ /** * @file plugin1.c * @brief Plugin example 1. * * A simple plugin implementing example_plugins application's plugin interface */ #include "plugin_interface.h" #include static int example_plugin1_method1(void) { 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(void) { return &example_plugin1_descriptor; } ================================================ FILE: applications/examples/example_plugins/plugin2.c ================================================ /** * @file plugin2.c * @brief Plugin example 2. * * Second plugin implementing example_plugins application's plugin interface */ #include "plugin_interface.h" #include static int example_plugin2_method1(void) { 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(void) { return &example_plugin2_descriptor; } ================================================ FILE: applications/examples/example_plugins/plugin_interface.h ================================================ /** * @file plugin_interface.h * @brief Example plugin interface. * * Common interface between a plugin and host application */ #pragma once #define PLUGIN_APP_ID "example_plugins" #define PLUGIN_API_VERSION 1 typedef struct { const char* name; int (*method1)(void); int (*method2)(int, int); } ExamplePlugin; ================================================ FILE: applications/examples/example_plugins_advanced/app_api.c ================================================ #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(void) { 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; } ================================================ FILE: applications/examples/example_plugins_advanced/app_api.h ================================================ /** * @file app_api.h * @brief Application API example. * * 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. */ #pragma once #include #ifdef __cplusplus extern "C" { #endif void app_api_accumulator_set(uint32_t value); uint32_t app_api_accumulator_get(void); 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 ================================================ FILE: applications/examples/example_plugins_advanced/app_api_interface.h ================================================ #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; ================================================ FILE: applications/examples/example_plugins_advanced/app_api_table.cpp ================================================ #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 */ app_api_table.cbegin(), 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; ================================================ FILE: applications/examples/example_plugins_advanced/app_api_table_i.h ================================================ #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)))); ================================================ FILE: applications/examples/example_plugins_advanced/application.fam ================================================ 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", sources=["*.c*", "!plugin*.c"], ) App( appid="advanced_plugin1", apptype=FlipperAppType.PLUGIN, entry_point="advanced_plugin1_ep", requires=["example_advanced_plugins"], sources=["plugin1.c"], fal_embedded=True, ) App( appid="advanced_plugin2", apptype=FlipperAppType.PLUGIN, entry_point="advanced_plugin2_ep", requires=["example_advanced_plugins"], sources=["plugin2.c"], fal_embedded=True, ) ================================================ FILE: applications/examples/example_plugins_advanced/example_advanced_plugins.c ================================================ #include "app_api.h" #include "plugin_interface.h" #include "app_api_interface.h" #include #include #include #include #define TAG "ExampleAdvancedPlugins" 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 { // For built-in .fals (fal_embedded==True), use APP_ASSETS_PATH // Otherwise, use APP_DATA_PATH if(plugin_manager_load_all(manager, APP_ASSETS_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; } ================================================ FILE: applications/examples/example_plugins_advanced/plugin1.c ================================================ /** * @file plugin1.c * @brief Plugin example 1. * * 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(void) { /* 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(void) { return &advanced_plugin1_descriptor; } ================================================ FILE: applications/examples/example_plugins_advanced/plugin2.c ================================================ /** * @file plugin2.c * @brief Plugin example 2. * * 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(void) { /* 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(void) { return &advanced_plugin2_descriptor; } ================================================ FILE: applications/examples/example_plugins_advanced/plugin_interface.h ================================================ /** * @file plugin_interface.h * @brief Example plugin interface. * * Common interface between a plugin and host application */ #pragma once #define PLUGIN_APP_ID "example_plugins_advanced" #define PLUGIN_API_VERSION 1 typedef struct { const char* name; void (*method1)(int); void (*method2)(void); } AdvancedPlugin; ================================================ FILE: applications/examples/example_thermo/README.md ================================================ # 1-Wire Thermometer {#example_thermo} This example application demonstrates the use of the 1-Wire library with a DS18B20 thermometer. It also covers basic GUI, input handling, threads and localisation. ## Source code Source code for this example can be found [here](https://github.com/flipperdevices/flipperzero-firmware/tree/dev/applications/examples/example_thermo). ## Electrical connections Before launching the application, connect the sensor to Flipper's external GPIO according to the table below: | DS18B20 | Flipper | | :-----: | :-----: | | VDD | 9 | | GND | 18 | | DQ | 17 | *NOTE 1*: GND is also available on pins 8 and 11. *NOTE 2*: For any other pin than 17, connect an external 4.7k pull-up resistor to pin 9. ## Launching the application In order to launch this demo, follow the steps below: 1. Make sure your Flipper has an SD card installed. 2. Connect your Flipper to the computer via a USB cable. 3. Run `./fbt launch APPSRC=example_thermo` in your terminal emulator of choice. ## Changing the data pin It is possible to use other GPIO pin as a 1-Wire data pin. In order to change it, set the `THERMO_GPIO_PIN` macro to any of the options listed below: ```c /* Possible GPIO pin choices: - gpio_ext_pc0 - gpio_ext_pc1 - gpio_ext_pc3 - gpio_ext_pb2 - gpio_ext_pb3 - gpio_ext_pa4 - gpio_ext_pa6 - gpio_ext_pa7 - gpio_ibutton */ #define THERMO_GPIO_PIN (gpio_ibutton) ``` Do not forget about the external pull-up resistor as these pins do not have one built-in. With the changes been made, recompile and launch the application again. The on-screen text should reflect it by asking to connect the thermometer to another pin. ================================================ FILE: applications/examples/example_thermo/application.fam ================================================ App( appid="example_thermo", name="Example: Thermometer", apptype=FlipperAppType.EXTERNAL, entry_point="example_thermo_main", requires=["gui"], stack_size=1 * 1024, fap_icon="example_thermo_10px.png", fap_category="Examples", ) ================================================ FILE: applications/examples/example_thermo/example_thermo.c ================================================ /** * @file example_thermo.c * @brief 1-Wire thermometer example. * * This file contains an example application that reads and displays * the temperature from a DS18B20 1-wire thermometer. * * It also covers basic GUI, input handling, threads and localisation. * * References: * [1] DS18B20 Datasheet: https://www.analog.com/media/en/technical-documentation/data-sheets/DS18B20.pdf */ #include #include #include #include #include #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 #define DS18B20_CFG_RESOLUTION_POS 5U #define DS18B20_CFG_RESOLUTION_MASK 0x03U #define DS18B20_DECIMAL_PART_MASK 0x0fU #define DS18B20_SIGN_MASK 0xf0U /* Possible GPIO pin choices: - gpio_ext_pc0 - gpio_ext_pc1 - gpio_ext_pc3 - gpio_ext_pb2 - gpio_ext_pb3 - gpio_ext_pa4 - gpio_ext_pa6 - gpio_ext_pa7 - gpio_ibutton */ #define THERMO_GPIO_PIN (gpio_ibutton) /* Flags which the reader thread responds to */ typedef enum { ReaderThreadFlagExit = 1, } ReaderThreadFlag; typedef union { struct { uint8_t temp_lsb; /* Least significant byte of the temperature */ uint8_t temp_msb; /* Most significant byte of the temperature */ uint8_t user_alarm_high; /* User register 1 (Temp high alarm) */ uint8_t user_alarm_low; /* User register 2 (Temp low alarm) */ uint8_t config; /* Configuration register */ uint8_t reserved[3]; /* Not used */ uint8_t crc; /* CRC checksum for error detection */ } fields; uint8_t bytes[9]; } DS18B20Scratchpad; /* Application context structure */ typedef struct { Gui* gui; ViewPort* view_port; FuriThread* reader_thread; FuriMessageQueue* event_queue; OneWireHost* onewire; Power* power; float temp_celsius; bool has_device; } ExampleThermoContext; /*************** 1-Wire Communication and Processing *****************/ /* Commands the thermometer to begin measuring the temperature. */ static void example_thermo_request_temperature(ExampleThermoContext* context) { OneWireHost* onewire = context->onewire; /* All 1-wire transactions must happen in a critical section, i.e not interrupted by other threads. */ FURI_CRITICAL_ENTER(); bool success = false; do { /* Each communication with a 1-wire device starts by a reset. The function will return true if a device responded with a presence pulse. */ if(!onewire_host_reset(onewire)) break; /* 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_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); success = true; } while(false); context->has_device = success; FURI_CRITICAL_EXIT(); } /* Reads the measured temperature from the thermometer. */ static void example_thermo_read_temperature(ExampleThermoContext* context) { /* If there was no device detected, don't try to read the temperature */ if(!context->has_device) { return; } OneWireHost* onewire = context->onewire; /* All 1-wire transactions must happen in a critical section, i.e not interrupted by other threads. */ FURI_CRITICAL_ENTER(); bool success = false; do { DS18B20Scratchpad buf; /* Attempt reading the temperature 10 times before giving up */ size_t attempts_left = 10; do { /* Each communication with a 1-wire device starts by a reset. The function will return true if a device responded with a presence pulse. */ if(!onewire_host_reset(onewire)) continue; /* 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_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 prepare the device's internal buffer memory for reading. */ onewire_host_write(onewire, DS18B20_CMD_READ_SCRATCHPAD); /* The actual reading happens here. A total of 9 bytes is read. */ onewire_host_read_bytes(onewire, buf.bytes, sizeof(buf.bytes)); /* Calculate the checksum and compare it with one provided by the device. */ const uint8_t crc = maxim_crc8(buf.bytes, sizeof(buf.bytes) - 1, MAXIM_CRC8_INIT); /* Checksums match, exit the loop */ if(crc == buf.fields.crc) break; } while(--attempts_left); if(attempts_left == 0) break; /* Get the measurement resolution from the configuration register. (See [1] page 9) */ const uint8_t resolution_mode = (buf.fields.config >> DS18B20_CFG_RESOLUTION_POS) & DS18B20_CFG_RESOLUTION_MASK; /* Generate a mask for undefined bits in the decimal part. (See [1] page 6) */ const uint8_t decimal_mask = (DS18B20_DECIMAL_PART_MASK << (DS18B20_CFG_RESOLUTION_MASK - resolution_mode)) & DS18B20_DECIMAL_PART_MASK; /* Get the integer and decimal part of the temperature (See [1] page 6) */ const uint8_t integer_part = (buf.fields.temp_msb << 4U) | (buf.fields.temp_lsb >> 4U); const uint8_t decimal_part = buf.fields.temp_lsb & decimal_mask; /* Calculate the sign of the temperature (See [1] page 6) */ const bool is_negative = (buf.fields.temp_msb & DS18B20_SIGN_MASK) != 0; /* Combine the integer and decimal part together */ const float temp_celsius_abs = integer_part + decimal_part / 16.f; /* Set the appropriate sign */ context->temp_celsius = is_negative ? -temp_celsius_abs : temp_celsius_abs; success = true; } while(false); context->has_device = success; FURI_CRITICAL_EXIT(); } /* Periodically requests measurements and reads temperature. This function runs in a separare thread. */ static int32_t example_thermo_reader_thread_callback(void* ctx) { ExampleThermoContext* context = ctx; for(;;) { /* Tell the termometer to start measuring the temperature. The process may take up to 750ms. */ example_thermo_request_temperature(context); /* Wait for the measurement to finish. At the same time wait for an exit signal. */ const uint32_t flags = furi_thread_flags_wait(ReaderThreadFlagExit, FuriFlagWaitAny, UPDATE_PERIOD_MS); /* If an exit signal was received, return from this thread. */ if(flags != (unsigned)FuriFlagErrorTimeout) break; /* The measurement is now ready, read it from the termometer. */ example_thermo_read_temperature(context); } return 0; } /*************** GUI, Input and Main Loop *****************/ /* Draw the GUI of the application. The screen is completely redrawn during each call. */ static void example_thermo_draw_callback(Canvas* canvas, void* ctx) { ExampleThermoContext* context = ctx; char text_store[TEXT_STORE_SIZE]; const size_t middle_x = canvas_width(canvas) / 2U; canvas_set_font(canvas, FontPrimary); canvas_draw_str_aligned(canvas, middle_x, 12, AlignCenter, AlignBottom, "Thermometer Demo"); canvas_draw_line(canvas, 0, 16, 128, 16); canvas_set_font(canvas, FontSecondary); canvas_draw_str_aligned(canvas, middle_x, 30, AlignCenter, AlignBottom, "Connect thermometer"); snprintf( text_store, TEXT_STORE_SIZE, "to GPIO pin %ld", furi_hal_resources_get_ext_pin_number(&THERMO_GPIO_PIN)); canvas_draw_str_aligned(canvas, middle_x, 42, AlignCenter, AlignBottom, text_store); canvas_set_font(canvas, FontKeyboard); if(context->has_device) { float temp; char temp_units; /* The application is locale-aware. Change Settings->System->Units to check it out. */ switch(locale_get_measurement_unit()) { case LocaleMeasurementUnitsMetric: temp = context->temp_celsius; temp_units = 'C'; break; case LocaleMeasurementUnitsImperial: temp = locale_celsius_to_fahrenheit(context->temp_celsius); temp_units = 'F'; break; default: furi_crash("Illegal measurement units"); } /* If a reading is available, display it */ snprintf(text_store, TEXT_STORE_SIZE, "Temperature: %+.1f%c", (double)temp, temp_units); } else { /* Or show a message that no data is available */ strlcpy(text_store, "-- No data --", TEXT_STORE_SIZE); } canvas_draw_str_aligned(canvas, middle_x, 58, AlignCenter, AlignBottom, text_store); } /* This function is called from the GUI thread. All it does is put the event into the application's queue so it can be processed later. */ static void example_thermo_input_callback(InputEvent* event, void* ctx) { ExampleThermoContext* context = ctx; furi_message_queue_put(context->event_queue, event, FuriWaitForever); } /* Starts the reader thread and handles the input */ static void example_thermo_run(ExampleThermoContext* context) { /* Enable power on external pins */ power_enable_otg(context->power, true); /* Configure the hardware in host mode */ onewire_host_start(context->onewire); /* Start the reader thread. It will talk to the thermometer in the background. */ furi_thread_start(context->reader_thread); /* An endless loop which handles the input*/ for(bool is_running = true; is_running;) { InputEvent event; /* Wait for an input event. Input events come from the GUI thread via a callback. */ const FuriStatus status = furi_message_queue_get(context->event_queue, &event, FuriWaitForever); /* This application is only interested in short button presses. */ if((status != FuriStatusOk) || (event.type != InputTypeShort)) { continue; } /* When the user presses the "Back" button, break the loop and exit the application. */ if(event.key == InputKeyBack) { is_running = false; } } /* Signal the reader thread to cease operation and exit */ furi_thread_flags_set(furi_thread_get_id(context->reader_thread), ReaderThreadFlagExit); /* Wait for the reader thread to finish */ furi_thread_join(context->reader_thread); /* Reset the hardware */ onewire_host_stop(context->onewire); /* Disable power on external pins */ power_enable_otg(context->power, false); } /******************** Initialisation & startup *****************************/ /* Allocate the memory and initialise the variables */ static ExampleThermoContext* example_thermo_context_alloc(void) { ExampleThermoContext* context = malloc(sizeof(ExampleThermoContext)); context->view_port = view_port_alloc(); view_port_draw_callback_set(context->view_port, example_thermo_draw_callback, context); view_port_input_callback_set(context->view_port, example_thermo_input_callback, context); context->event_queue = furi_message_queue_alloc(8, sizeof(InputEvent)); context->reader_thread = furi_thread_alloc(); furi_thread_set_stack_size(context->reader_thread, 1024U); furi_thread_set_context(context->reader_thread, context); furi_thread_set_callback(context->reader_thread, example_thermo_reader_thread_callback); context->gui = furi_record_open(RECORD_GUI); gui_add_view_port(context->gui, context->view_port, GuiLayerFullscreen); context->onewire = onewire_host_alloc(&THERMO_GPIO_PIN); context->power = furi_record_open(RECORD_POWER); return context; } /* Release the unused resources and deallocate memory */ static void example_thermo_context_free(ExampleThermoContext* context) { view_port_enabled_set(context->view_port, false); gui_remove_view_port(context->gui, context->view_port); onewire_host_free(context->onewire); furi_thread_free(context->reader_thread); furi_message_queue_free(context->event_queue); view_port_free(context->view_port); furi_record_close(RECORD_GUI); furi_record_close(RECORD_POWER); } /* The application's entry point. Execution starts from here. */ int32_t example_thermo_main(void* p) { UNUSED(p); /* Allocate all of the necessary structures */ ExampleThermoContext* context = example_thermo_context_alloc(); /* Start the application's main loop. It won't return until the application was requested to exit. */ example_thermo_run(context); /* Release all unneeded resources */ example_thermo_context_free(context); return 0; } ================================================ FILE: applications/examples/example_view_dispatcher/application.fam ================================================ App( appid="example_view_dispatcher", name="Example: ViewDispatcher", apptype=FlipperAppType.EXTERNAL, entry_point="example_view_dispatcher_app", requires=["gui"], fap_category="Examples", ) ================================================ FILE: applications/examples/example_view_dispatcher/example_view_dispatcher.c ================================================ /** * @file example_view_dispatcher.c * @brief Example application demonstrating the usage of the ViewDispatcher library. * * This application can display one of two views: either a Widget or a Submenu. * Each view has its own way of switching to another one: * * - A center button in the Widget view. * - A submenu item in the Submenu view * * Press either to switch to a different view. Press Back to exit the application. * */ #include #include #include #include // Enumeration of the view indexes. typedef enum { ViewIndexWidget, ViewIndexSubmenu, ViewIndexCount, } ViewIndex; // Enumeration of submenu items. typedef enum { SubmenuIndexNothing, SubmenuIndexSwitchView, } SubmenuIndex; // Main application structure. typedef struct { ViewDispatcher* view_dispatcher; Widget* widget; Submenu* submenu; } ExampleViewDispatcherApp; // This function is called when the user has pressed the Back key. static bool example_view_dispatcher_app_navigation_callback(void* context) { furi_assert(context); ExampleViewDispatcherApp* app = context; // Back means exit the application, which can be done by stopping the ViewDispatcher. view_dispatcher_stop(app->view_dispatcher); return true; } // This function is called when there are custom events to process. static bool example_view_dispatcher_app_custom_event_callback(void* context, uint32_t event) { furi_assert(context); ExampleViewDispatcherApp* app = context; // The event numerical value can mean different things (the application is responsible to uphold its chosen convention) // In this example, the only possible meaning is the view index to switch to. furi_assert(event < ViewIndexCount); // Switch to the requested view. view_dispatcher_switch_to_view(app->view_dispatcher, event); return true; } // This function is called when the user presses the "Switch View" button on the Widget view. static void example_view_dispatcher_app_button_callback( GuiButtonType button_type, InputType input_type, void* context) { furi_assert(context); ExampleViewDispatcherApp* app = context; // Only request the view switch if the user short-presses the Center button. if(button_type == GuiButtonTypeCenter && input_type == InputTypeShort) { // Request switch to the Submenu view via the custom event queue. view_dispatcher_send_custom_event(app->view_dispatcher, ViewIndexSubmenu); } } // This function is called when the user activates the "Switch View" submenu item. static void example_view_dispatcher_app_submenu_callback(void* context, uint32_t index) { furi_assert(context); ExampleViewDispatcherApp* app = context; // Only request the view switch if the user activates the "Switch View" item. if(index == SubmenuIndexSwitchView) { // Request switch to the Widget view via the custom event queue. view_dispatcher_send_custom_event(app->view_dispatcher, ViewIndexWidget); } } // Application constructor function. static ExampleViewDispatcherApp* example_view_dispatcher_app_alloc() { ExampleViewDispatcherApp* app = malloc(sizeof(ExampleViewDispatcherApp)); // Access the GUI API instance. Gui* gui = furi_record_open(RECORD_GUI); // Create and initialize the Widget view. app->widget = widget_alloc(); widget_add_string_multiline_element( app->widget, 64, 32, AlignCenter, AlignCenter, FontSecondary, "Press the Button below"); widget_add_button_element( app->widget, GuiButtonTypeCenter, "Switch View", example_view_dispatcher_app_button_callback, app); // Create and initialize the Submenu view. app->submenu = submenu_alloc(); submenu_add_item(app->submenu, "Do Nothing", SubmenuIndexNothing, NULL, NULL); submenu_add_item( app->submenu, "Switch View", SubmenuIndexSwitchView, example_view_dispatcher_app_submenu_callback, app); // Create the ViewDispatcher instance. app->view_dispatcher = view_dispatcher_alloc(); // Let the GUI know about this ViewDispatcher instance. view_dispatcher_attach_to_gui(app->view_dispatcher, gui, ViewDispatcherTypeFullscreen); // Register the views within the ViewDispatcher instance. This alone will not show any of them on the screen. // Each view must have its own index to refer to it later (it is best done via an enumeration as shown here). view_dispatcher_add_view(app->view_dispatcher, ViewIndexWidget, widget_get_view(app->widget)); view_dispatcher_add_view( app->view_dispatcher, ViewIndexSubmenu, submenu_get_view(app->submenu)); // Set the custom event callback. It will be called each time a custom event is scheduled // using the view_dispatcher_send_custom_callback() function. view_dispatcher_set_custom_event_callback( app->view_dispatcher, example_view_dispatcher_app_custom_event_callback); // Set the navigation, or back button callback. It will be called if the user pressed the Back button // and the event was not handled in the currently displayed view. view_dispatcher_set_navigation_event_callback( app->view_dispatcher, example_view_dispatcher_app_navigation_callback); // The context will be passed to the callbacks as a parameter, so we have access to our application object. view_dispatcher_set_event_callback_context(app->view_dispatcher, app); return app; } // Application destructor function. static void example_view_dispatcher_app_free(ExampleViewDispatcherApp* app) { // All views must be un-registered (removed) from a ViewDispatcher instance // before deleting it. Failure to do so will result in a crash. view_dispatcher_remove_view(app->view_dispatcher, ViewIndexWidget); view_dispatcher_remove_view(app->view_dispatcher, ViewIndexSubmenu); // Now it is safe to delete the ViewDispatcher instance. view_dispatcher_free(app->view_dispatcher); // Delete the views widget_free(app->widget); submenu_free(app->submenu); // End access to hte the GUI API. furi_record_close(RECORD_GUI); // Free the remaining memory. free(app); } static void example_view_dispatcher_app_run(ExampleViewDispatcherApp* app) { // Display the Widget view on the screen. view_dispatcher_switch_to_view(app->view_dispatcher, ViewIndexWidget); // This function will block until view_dispatcher_stop() is called. // Internally, it uses a FuriEventLoop (see FuriEventLoop examples for more info on this). view_dispatcher_run(app->view_dispatcher); } /******************************************************************* * vvv START HERE vvv * * The application's entry point - referenced in application.fam *******************************************************************/ int32_t example_view_dispatcher_app(void* arg) { UNUSED(arg); ExampleViewDispatcherApp* app = example_view_dispatcher_app_alloc(); example_view_dispatcher_app_run(app); example_view_dispatcher_app_free(app); return 0; } ================================================ FILE: applications/examples/example_view_holder/application.fam ================================================ App( appid="example_view_holder", name="Example: ViewHolder", apptype=FlipperAppType.EXTERNAL, entry_point="example_view_holder_app", requires=["gui"], fap_category="Examples", ) ================================================ FILE: applications/examples/example_view_holder/example_view_holder.c ================================================ /** * @file example_view_holder.c * @brief Example application demonstrating the usage of the ViewHolder library. * * This application will display a text box with some scrollable text in it. * Press the Back key to exit the application. */ #include #include #include #include // This function will be called when the user presses the Back button. static void example_view_holder_back_callback(void* context) { FuriApiLock exit_lock = context; // Unlock the exit lock, thus enabling the app to exit. api_lock_unlock(exit_lock); } int32_t example_view_holder_app(void* arg) { UNUSED(arg); // Access the GUI API instance. Gui* gui = furi_record_open(RECORD_GUI); // Create a TextBox view. The Gui object only accepts // ViewPort instances, so we will need to address that later. TextBox* text_box = text_box_alloc(); // Set some text so that the text box is not empty. text_box_set_text( text_box, "ViewHolder is being used\n" "to show this TextBox view.\n\n" "Scroll down to see more.\n\n\n" "Press \"Back\" to exit."); // Create a ViewHolder instance. It will serve as an adapter to convert // between the View type provided by the TextBox view and the ViewPort type // that the GUI can actually display. ViewHolder* view_holder = view_holder_alloc(); // Let the GUI know about this ViewHolder instance. view_holder_attach_to_gui(view_holder, gui); // Set the view that we want to display. view_holder_set_view(view_holder, text_box_get_view(text_box)); // The part below is not really related to this example, but is necessary for it to function. // We need to somehow stall the application thread so that the view stays on the screen (otherwise // the app will just exit and won't display anything) and at the same time we need a way to quit out // of the application. // In this example, a simple FuriApiLock instance is used. A real-world application is likely to have some // kind of event handling loop here instead. (see the ViewDispatcher example or one of FuriEventLoop // examples for that). // Create a pre-locked FuriApiLock instance. FuriApiLock exit_lock = api_lock_alloc_locked(); // Set a Back event callback for the ViewHolder instance. It will be called when the user // presses the Back button. We pass the exit lock instance as the context to be able to access // it inside the callback function. view_holder_set_back_callback(view_holder, example_view_holder_back_callback, exit_lock); // This call will block the application thread from running until the exit lock gets unlocked somehow // (the only way it can happen in this example is via the back callback). api_lock_wait_unlock_and_free(exit_lock); // The back key has been pressed, which unlocked the exit lock. The application is about to exit. // The view must be removed from a ViewHolder instance before deleting it. view_holder_set_view(view_holder, NULL); // Delete everything to prevent memory leaks. view_holder_free(view_holder); text_box_free(text_box); // End access to the GUI API. furi_record_close(RECORD_GUI); return 0; } ================================================ FILE: applications/main/application.fam ================================================ App( appid="main_apps", name="Basic applications for main menu", apptype=FlipperAppType.METAPACKAGE, provides=[ "gpio", "ibutton", "infrared", "lfrfid", "nfc", "subghz", "bad_usb", "u2f", "archive", "main_apps_on_start", ], ) App( appid="main_apps_on_start", name="On start hooks", apptype=FlipperAppType.METAPACKAGE, provides=[ "cli", ], ) ================================================ FILE: applications/main/archive/application.fam ================================================ App( appid="archive", name="Archive", apptype=FlipperAppType.ARCHIVE, entry_point="archive_app", cdefines=["APP_ARCHIVE"], requires=["gui"], stack_size=4 * 1024, icon="A_FileManager_14", order=10, ) ================================================ FILE: applications/main/archive/archive.c ================================================ #include "archive_i.h" bool archive_custom_event_callback(void* context, uint32_t event) { furi_assert(context); ArchiveApp* archive = (ArchiveApp*)context; return scene_manager_handle_custom_event(archive->scene_manager, event); } bool archive_back_event_callback(void* context) { furi_assert(context); ArchiveApp* archive = (ArchiveApp*)context; return scene_manager_handle_back_event(archive->scene_manager); } ArchiveApp* archive_alloc(void) { ArchiveApp* archive = malloc(sizeof(ArchiveApp)); archive->gui = furi_record_open(RECORD_GUI); archive->loader = furi_record_open(RECORD_LOADER); archive->text_input = text_input_alloc(); archive->fav_move_str = furi_string_alloc(); archive->view_dispatcher = view_dispatcher_alloc(); archive->scene_manager = scene_manager_alloc(&archive_scene_handlers, archive); view_dispatcher_attach_to_gui( archive->view_dispatcher, archive->gui, ViewDispatcherTypeFullscreen); view_dispatcher_set_event_callback_context(archive->view_dispatcher, archive); view_dispatcher_set_custom_event_callback( archive->view_dispatcher, archive_custom_event_callback); view_dispatcher_set_navigation_event_callback( archive->view_dispatcher, archive_back_event_callback); archive->browser = browser_alloc(); view_dispatcher_add_view( archive->view_dispatcher, ArchiveViewBrowser, archive_browser_get_view(archive->browser)); view_dispatcher_add_view( archive->view_dispatcher, ArchiveViewTextInput, text_input_get_view(archive->text_input)); archive->widget = widget_alloc(); view_dispatcher_add_view( archive->view_dispatcher, ArchiveViewWidget, widget_get_view(archive->widget)); return archive; } void archive_free(ArchiveApp* archive) { furi_assert(archive); view_dispatcher_remove_view(archive->view_dispatcher, ArchiveViewBrowser); view_dispatcher_remove_view(archive->view_dispatcher, ArchiveViewTextInput); view_dispatcher_remove_view(archive->view_dispatcher, ArchiveViewWidget); widget_free(archive->widget); view_dispatcher_free(archive->view_dispatcher); scene_manager_free(archive->scene_manager); browser_free(archive->browser); furi_string_free(archive->fav_move_str); text_input_free(archive->text_input); furi_record_close(RECORD_LOADER); archive->loader = NULL; furi_record_close(RECORD_GUI); archive->gui = NULL; free(archive); } int32_t archive_app(void* p) { UNUSED(p); ArchiveApp* archive = archive_alloc(); scene_manager_next_scene(archive->scene_manager, ArchiveAppSceneBrowser); view_dispatcher_run(archive->view_dispatcher); archive_free(archive); return 0; } ================================================ FILE: applications/main/archive/archive.h ================================================ #pragma once typedef struct ArchiveApp ArchiveApp; ================================================ FILE: applications/main/archive/archive_i.h ================================================ #pragma once #include "archive.h" #include #include #include #include #include #include #include #include #include "views/archive_browser_view.h" #include "scenes/archive_scene.h" typedef enum { ArchiveViewBrowser, ArchiveViewTextInput, ArchiveViewWidget, ArchiveViewTotal, } ArchiveViewEnum; struct ArchiveApp { Gui* gui; Loader* loader; ViewDispatcher* view_dispatcher; SceneManager* scene_manager; ArchiveBrowserView* browser; TextInput* text_input; Widget* widget; FuriPubSubSubscription* loader_stop_subscription; FuriString* fav_move_str; char text_store[MAX_NAME_LEN]; char file_extension[MAX_EXT_LEN + 1]; }; ================================================ FILE: applications/main/archive/helpers/archive_apps.c ================================================ #include "archive_apps.h" #include "archive_browser.h" static const char* const known_apps[] = { [ArchiveAppTypeU2f] = "u2f", [ArchiveAppTypeSetting] = "setting", }; ArchiveAppTypeEnum archive_get_app_type(const char* path) { const char* app_name = strchr(path, ':'); if(app_name == NULL) { return ArchiveAppTypeUnknown; } app_name++; for(size_t i = 0; i < COUNT_OF(known_apps); i++) { //-V1008 if(strncmp(app_name, known_apps[i], strlen(known_apps[i])) == 0) { return i; } } return ArchiveAppTypeUnknown; } bool archive_app_is_available(void* context, const char* path) { UNUSED(context); furi_assert(path); ArchiveAppTypeEnum app = archive_get_app_type(path); if(app == ArchiveAppTypeU2f) { bool file_exists = false; Storage* storage = furi_record_open(RECORD_STORAGE); if(storage_file_exists(storage, EXT_PATH("u2f/key.u2f"))) { file_exists = storage_file_exists(storage, EXT_PATH("u2f/cnt.u2f")); } furi_record_close(RECORD_STORAGE); return file_exists; } else if(app == ArchiveAppTypeSetting) { return true; } else { return false; } } bool archive_app_read_dir(void* context, const char* path) { furi_assert(context); furi_assert(path); ArchiveBrowserView* browser = context; archive_file_array_rm_all(browser); ArchiveAppTypeEnum app = archive_get_app_type(path); if(app == ArchiveAppTypeU2f) { archive_add_app_item(browser, "/app:u2f/U2F Token"); return true; } else if(app == ArchiveAppTypeSetting) { archive_add_app_item(browser, path); return true; } else { return false; } } void archive_app_delete_file(void* context, const char* path) { furi_assert(context); furi_assert(path); ArchiveBrowserView* browser = context; ArchiveAppTypeEnum app = archive_get_app_type(path); bool res = false; if(app == ArchiveAppTypeU2f) { Storage* fs_api = furi_record_open(RECORD_STORAGE); res = (storage_common_remove(fs_api, EXT_PATH("u2f/key.u2f")) == FSE_OK); res |= (storage_common_remove(fs_api, EXT_PATH("u2f/cnt.u2f")) == FSE_OK); furi_record_close(RECORD_STORAGE); if(archive_is_favorite("/app:u2f/U2F Token")) { archive_favorites_delete("/app:u2f/U2F Token"); } } else if(app == ArchiveAppTypeSetting) { // can't delete a setting! } if(res) { archive_file_array_rm_selected(browser); } } ================================================ FILE: applications/main/archive/helpers/archive_apps.h ================================================ #pragma once #include "archive_files.h" typedef enum { ArchiveAppTypeU2f, ArchiveAppTypeSetting, ArchiveAppTypeUnknown, ArchiveAppsTotal, } ArchiveAppTypeEnum; static const ArchiveFileTypeEnum app_file_types[] = { [ArchiveAppTypeU2f] = ArchiveFileTypeU2f, [ArchiveAppTypeSetting] = ArchiveFileTypeSetting, [ArchiveAppTypeUnknown] = ArchiveFileTypeUnknown, }; static inline ArchiveFileTypeEnum archive_get_app_filetype(ArchiveAppTypeEnum app) { return app_file_types[app]; } ArchiveAppTypeEnum archive_get_app_type(const char* path); bool archive_app_is_available(void* context, const char* path); bool archive_app_read_dir(void* context, const char* path); void archive_app_delete_file(void* context, const char* path); ================================================ FILE: applications/main/archive/helpers/archive_browser.c ================================================ #include "archive_files.h" #include "archive_apps.h" #include "archive_browser.h" #include "../views/archive_browser_view.h" #include #include #include #include static void archive_folder_open_cb(void* context, uint32_t item_cnt, int32_t file_idx, bool is_root) { furi_assert(context); ArchiveBrowserView* browser = (ArchiveBrowserView*)context; int32_t load_offset = 0; browser->is_root = is_root; ArchiveTabEnum tab = archive_get_tab(browser); if((item_cnt == 0) && (archive_is_home(browser)) && (tab != ArchiveTabBrowser)) { archive_switch_tab(browser, browser->last_tab_switch_dir); } else if(!furi_string_start_with_str(browser->path, "/app:")) { with_view_model( browser->view, ArchiveBrowserViewModel * model, { files_array_reset(model->files); model->item_cnt = item_cnt; model->item_idx = (file_idx > 0) ? file_idx : 0; load_offset = CLAMP(model->item_idx - FILE_LIST_BUF_LEN / 2, (int32_t)model->item_cnt, 0); model->array_offset = 0; model->list_offset = 0; model->list_loading = true; model->folder_loading = false; }, false); archive_update_offset(browser); file_browser_worker_load(browser->worker, load_offset, FILE_LIST_BUF_LEN); } } static void archive_list_load_cb(void* context, uint32_t list_load_offset) { furi_assert(context); ArchiveBrowserView* browser = (ArchiveBrowserView*)context; with_view_model( browser->view, ArchiveBrowserViewModel * model, { files_array_reset(model->files); model->array_offset = list_load_offset; }, false); } static void archive_list_item_cb(void* context, FuriString* item_path, bool is_folder, bool is_last) { furi_assert(context); ArchiveBrowserView* browser = (ArchiveBrowserView*)context; if(!is_last) { archive_add_file_item(browser, is_folder, furi_string_get_cstr(item_path)); } else { bool load_again = false; with_view_model( browser->view, ArchiveBrowserViewModel * model, { model->list_loading = false; if(archive_is_file_list_load_required(model)) { load_again = true; } }, true); if(load_again) { archive_file_array_load(browser, 0); } } } static void archive_long_load_cb(void* context) { furi_assert(context); ArchiveBrowserView* browser = (ArchiveBrowserView*)context; with_view_model( browser->view, ArchiveBrowserViewModel * model, { model->folder_loading = true; }, true); } static void archive_file_browser_set_path( ArchiveBrowserView* browser, FuriString* path, const char* filter_ext, bool skip_assets, bool hide_dot_files) { furi_assert(browser); if(!browser->worker_running) { browser->worker = file_browser_worker_alloc(path, NULL, filter_ext, skip_assets, hide_dot_files); file_browser_worker_set_callback_context(browser->worker, browser); file_browser_worker_set_folder_callback(browser->worker, archive_folder_open_cb); file_browser_worker_set_list_callback(browser->worker, archive_list_load_cb); file_browser_worker_set_item_callback(browser->worker, archive_list_item_cb); file_browser_worker_set_long_load_callback(browser->worker, archive_long_load_cb); browser->worker_running = true; } else { furi_assert(browser->worker); file_browser_worker_set_config( browser->worker, path, filter_ext, skip_assets, hide_dot_files); } } bool archive_is_item_in_array(ArchiveBrowserViewModel* model, uint32_t idx) { size_t array_size = files_array_size(model->files); if((idx >= (uint32_t)model->array_offset + array_size) || (idx < (uint32_t)model->array_offset)) { return false; } return true; } bool archive_is_file_list_load_required(ArchiveBrowserViewModel* model) { size_t array_size = files_array_size(model->files); if((model->list_loading) || (array_size >= model->item_cnt)) { return false; } if((model->array_offset > 0) && (model->item_idx < (model->array_offset + FILE_LIST_BUF_LEN / 4))) { return true; } if(((model->array_offset + array_size) < model->item_cnt) && (model->item_idx > (int32_t)(model->array_offset + array_size - FILE_LIST_BUF_LEN / 4))) { return true; } return false; } void archive_update_offset(ArchiveBrowserView* browser) { furi_assert(browser); with_view_model( browser->view, ArchiveBrowserViewModel * model, { uint16_t bounds = model->item_cnt > 3 ? 2 : model->item_cnt; if((model->item_cnt > 3u) && (model->item_idx >= ((int32_t)model->item_cnt - 1))) { model->list_offset = model->item_idx - 3; } else if(model->list_offset < model->item_idx - bounds) { model->list_offset = CLAMP(model->item_idx - 2, (int32_t)model->item_cnt - bounds, 0); } else if(model->list_offset > model->item_idx - bounds) { model->list_offset = CLAMP(model->item_idx - 1, (int32_t)model->item_cnt - bounds, 0); } }, true); } void archive_update_focus(ArchiveBrowserView* browser, const char* target) { furi_assert(browser); furi_assert(target); archive_get_items(browser, furi_string_get_cstr(browser->path)); if(!archive_file_get_array_size(browser) && archive_is_home(browser)) { archive_switch_tab(browser, TAB_RIGHT); } else { with_view_model( browser->view, ArchiveBrowserViewModel * model, { uint16_t idx = 0; while(idx < files_array_size(model->files)) { ArchiveFile_t* current = files_array_get(model->files, idx); if(!furi_string_search(current->path, target)) { model->item_idx = idx + model->array_offset; break; } ++idx; } }, false); archive_update_offset(browser); } } size_t archive_file_get_array_size(ArchiveBrowserView* browser) { furi_assert(browser); uint16_t size = 0; with_view_model( browser->view, ArchiveBrowserViewModel * model, { size = files_array_size(model->files); }, false); return size; } void archive_set_item_count(ArchiveBrowserView* browser, uint32_t count) { furi_assert(browser); with_view_model( browser->view, ArchiveBrowserViewModel * model, { model->item_cnt = count; model->item_idx = CLAMP(model->item_idx, (int32_t)model->item_cnt - 1, 0); }, false); archive_update_offset(browser); } void archive_file_array_rm_selected(ArchiveBrowserView* browser) { furi_assert(browser); uint32_t items_cnt = 0; with_view_model( browser->view, ArchiveBrowserViewModel * model, { files_array_remove_v( model->files, model->item_idx - model->array_offset, model->item_idx - model->array_offset + 1); model->item_cnt--; model->item_idx = CLAMP(model->item_idx, (int32_t)model->item_cnt - 1, 0); items_cnt = model->item_cnt; }, false); if((items_cnt == 0) && (archive_is_home(browser))) { archive_switch_tab(browser, TAB_RIGHT); } archive_update_offset(browser); } void archive_file_array_swap(ArchiveBrowserView* browser, int8_t dir) { furi_assert(browser); with_view_model( browser->view, ArchiveBrowserViewModel * model, { ArchiveFile_t temp; size_t array_size = files_array_size(model->files) - 1; uint8_t swap_idx = CLAMP((size_t)(model->item_idx + dir), array_size, 0u); if(model->item_idx == 0 && dir < 0) { ArchiveFile_t_init(&temp); files_array_pop_at(&temp, model->files, array_size); files_array_push_at(model->files, model->item_idx, temp); ArchiveFile_t_clear(&temp); } else if(((uint32_t)model->item_idx == array_size) && (dir > 0)) { ArchiveFile_t_init(&temp); files_array_pop_at(&temp, model->files, 0); files_array_push_at(model->files, array_size, temp); ArchiveFile_t_clear(&temp); } else { files_array_swap_at(model->files, model->item_idx, swap_idx); } }, false); } void archive_file_array_rm_all(ArchiveBrowserView* browser) { furi_assert(browser); with_view_model( browser->view, ArchiveBrowserViewModel * model, { files_array_reset(model->files); }, false); } void archive_file_array_load(ArchiveBrowserView* browser, int8_t dir) { furi_assert(browser); int32_t offset_new = 0; with_view_model( browser->view, ArchiveBrowserViewModel * model, { if(model->item_cnt > FILE_LIST_BUF_LEN) { if(dir < 0) { offset_new = model->item_idx - FILE_LIST_BUF_LEN / 4 * 3; } else if(dir == 0) { offset_new = model->item_idx - FILE_LIST_BUF_LEN / 4 * 2; } else { offset_new = model->item_idx - FILE_LIST_BUF_LEN / 4 * 1; } if(offset_new > 0) { offset_new = CLAMP(offset_new, (int32_t)model->item_cnt, 0); } else { offset_new = 0; } } }, false); file_browser_worker_load(browser->worker, offset_new, FILE_LIST_BUF_LEN); } ArchiveFile_t* archive_get_current_file(ArchiveBrowserView* browser) { furi_assert(browser); ArchiveFile_t* selected = NULL; with_view_model( browser->view, ArchiveBrowserViewModel * model, { selected = files_array_size(model->files) ? files_array_get(model->files, model->item_idx - model->array_offset) : NULL; }, false); return selected; } ArchiveFile_t* archive_get_file_at(ArchiveBrowserView* browser, size_t idx) { furi_assert(browser); ArchiveFile_t* selected = NULL; with_view_model( browser->view, ArchiveBrowserViewModel * model, { idx = CLAMP(idx - model->array_offset, files_array_size(model->files), 0u); selected = files_array_size(model->files) ? files_array_get(model->files, idx) : NULL; }, false); return selected; } ArchiveTabEnum archive_get_tab(ArchiveBrowserView* browser) { furi_assert(browser); ArchiveTabEnum tab_id = 0; with_view_model( browser->view, ArchiveBrowserViewModel * model, { tab_id = model->tab_idx; }, false); return tab_id; } bool archive_is_home(ArchiveBrowserView* browser) { furi_assert(browser); if(browser->is_root) { return true; } const char* default_path = archive_get_default_path(archive_get_tab(browser)); return furi_string_cmp_str(browser->path, default_path) == 0; } const char* archive_get_name(ArchiveBrowserView* browser) { ArchiveFile_t* selected = archive_get_current_file(browser); return furi_string_get_cstr(selected->path); } void archive_set_tab(ArchiveBrowserView* browser, ArchiveTabEnum tab) { furi_assert(browser); with_view_model( browser->view, ArchiveBrowserViewModel * model, { model->tab_idx = tab; }, false); } void archive_add_app_item(ArchiveBrowserView* browser, const char* name) { furi_assert(browser); furi_assert(name); ArchiveFile_t item; ArchiveFile_t_init(&item); furi_string_set(item.path, name); archive_set_file_type(&item, name, false, true); with_view_model( browser->view, ArchiveBrowserViewModel * model, { files_array_push_back(model->files, item); model->item_cnt = files_array_size(model->files); }, false); ArchiveFile_t_clear(&item); } static bool archive_get_fap_meta(FuriString* file_path, FuriString* fap_name, uint8_t** icon_ptr) { Storage* storage = furi_record_open(RECORD_STORAGE); bool success = false; if(flipper_application_load_name_and_icon(file_path, storage, icon_ptr, fap_name)) { success = true; } furi_record_close(RECORD_STORAGE); return success; } void archive_add_file_item(ArchiveBrowserView* browser, bool is_folder, const char* name) { furi_assert(browser); furi_assert(name); ArchiveFile_t item; ArchiveFile_t_init(&item); furi_string_set(item.path, name); archive_set_file_type(&item, furi_string_get_cstr(browser->path), is_folder, false); if(item.type == ArchiveFileTypeApplication) { item.custom_icon_data = malloc(FAP_MANIFEST_MAX_ICON_SIZE); if(!archive_get_fap_meta(item.path, item.custom_name, &item.custom_icon_data)) { free(item.custom_icon_data); item.custom_icon_data = NULL; } } with_view_model( browser->view, ArchiveBrowserViewModel * model, { files_array_push_back(model->files, item); }, false); ArchiveFile_t_clear(&item); } void archive_show_file_menu(ArchiveBrowserView* browser, bool show) { furi_assert(browser); with_view_model( browser->view, ArchiveBrowserViewModel * model, { if(show) { if(archive_is_item_in_array(model, model->item_idx)) { model->menu = true; model->menu_idx = 0; ArchiveFile_t* selected = files_array_get(model->files, model->item_idx - model->array_offset); selected->fav = archive_is_favorite("%s", furi_string_get_cstr(selected->path)); } } else { model->menu = false; model->menu_idx = 0; } }, true); } void archive_favorites_move_mode(ArchiveBrowserView* browser, bool active) { furi_assert(browser); with_view_model( browser->view, ArchiveBrowserViewModel * model, { model->move_fav = active; }, true); } static bool archive_is_dir_exists(FuriString* path) { bool state = false; FileInfo file_info; Storage* storage = furi_record_open(RECORD_STORAGE); if(furi_string_equal(path, STORAGE_EXT_PATH_PREFIX)) { state = storage_sd_status(storage) == FSE_OK; } else if(storage_common_stat(storage, furi_string_get_cstr(path), &file_info) == FSE_OK) { state = file_info_is_dir(&file_info); } furi_record_close(RECORD_STORAGE); return state; } void archive_switch_tab(ArchiveBrowserView* browser, InputKey key) { furi_assert(browser); ArchiveTabEnum tab = archive_get_tab(browser); browser->last_tab_switch_dir = key; if(key == InputKeyLeft) { tab = ((tab - 1) + ArchiveTabTotal) % ArchiveTabTotal; } else { tab = (tab + 1) % ArchiveTabTotal; } browser->is_root = true; archive_set_tab(browser, tab); furi_string_set(browser->path, archive_get_default_path(tab)); bool tab_empty = true; if(tab == ArchiveTabFavorites) { if(archive_favorites_count(browser) > 0) { tab_empty = false; } } else if(furi_string_start_with_str(browser->path, "/app:")) { char* app_name = strchr(furi_string_get_cstr(browser->path), ':'); if(app_name != NULL) { if(archive_app_is_available(browser, furi_string_get_cstr(browser->path))) { tab_empty = false; } } } else { 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; 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 } } if((tab_empty) && (tab != ArchiveTabBrowser)) { archive_switch_tab(browser, key); } else { with_view_model( browser->view, ArchiveBrowserViewModel * model, { model->item_idx = 0; model->array_offset = 0; }, false); archive_get_items(browser, furi_string_get_cstr(browser->path)); archive_update_offset(browser); } } void archive_enter_dir(ArchiveBrowserView* browser, FuriString* path) { furi_assert(browser); furi_assert(path); int32_t idx_temp = 0; with_view_model( browser->view, ArchiveBrowserViewModel * model, { idx_temp = model->item_idx; }, false); furi_string_set(browser->path, path); file_browser_worker_folder_enter(browser->worker, path, idx_temp); } void archive_leave_dir(ArchiveBrowserView* browser) { furi_assert(browser); size_t dirname_start = furi_string_search_rchar(browser->path, '/'); furi_string_left(browser->path, dirname_start); file_browser_worker_folder_exit(browser->worker); } void archive_refresh_dir(ArchiveBrowserView* browser) { furi_assert(browser); int32_t idx_temp = 0; with_view_model( browser->view, ArchiveBrowserViewModel * model, { idx_temp = model->item_idx; }, false); file_browser_worker_folder_refresh(browser->worker, idx_temp); } ================================================ FILE: applications/main/archive/helpers/archive_browser.h ================================================ #pragma once #include "../archive_i.h" #include #define TAB_RIGHT InputKeyRight // Default tab switch direction #define TAB_DEFAULT ArchiveTabFavorites // Start tab #define FILE_LIST_BUF_LEN 50 static const char* const tab_default_paths[] = { [ArchiveTabFavorites] = "/app:favorites", [ArchiveTabIButton] = EXT_PATH("ibutton"), [ArchiveTabNFC] = EXT_PATH("nfc"), [ArchiveTabSubGhz] = EXT_PATH("subghz"), [ArchiveTabLFRFID] = EXT_PATH("lfrfid"), [ArchiveTabInfrared] = EXT_PATH("infrared"), [ArchiveTabBadUsb] = EXT_PATH("badusb"), [ArchiveTabU2f] = "/app:u2f", [ArchiveTabApplications] = EXT_PATH("apps"), [ArchiveTabBrowser] = STORAGE_EXT_PATH_PREFIX, }; static const char* const known_ext[] = { [ArchiveFileTypeIButton] = ".ibtn", [ArchiveFileTypeNFC] = ".nfc", [ArchiveFileTypeSubGhz] = ".sub", [ArchiveFileTypeLFRFID] = ".rfid", [ArchiveFileTypeInfrared] = ".ir", [ArchiveFileTypeBadUsb] = ".txt", [ArchiveFileTypeU2f] = "?", [ArchiveFileTypeApplication] = ".fap", [ArchiveFileTypeJS] = ".js", [ArchiveFileTypeUpdateManifest] = ".fuf", [ArchiveFileTypeFolder] = "?", [ArchiveFileTypeUnknown] = "*", [ArchiveFileTypeAppOrJs] = ".fap|.js", [ArchiveFileTypeSetting] = "?", }; static const ArchiveFileTypeEnum known_type[] = { [ArchiveTabFavorites] = ArchiveFileTypeUnknown, [ArchiveTabIButton] = ArchiveFileTypeIButton, [ArchiveTabNFC] = ArchiveFileTypeNFC, [ArchiveTabSubGhz] = ArchiveFileTypeSubGhz, [ArchiveTabLFRFID] = ArchiveFileTypeLFRFID, [ArchiveTabInfrared] = ArchiveFileTypeInfrared, [ArchiveTabBadUsb] = ArchiveFileTypeBadUsb, [ArchiveTabU2f] = ArchiveFileTypeU2f, [ArchiveTabApplications] = ArchiveFileTypeAppOrJs, [ArchiveTabBrowser] = ArchiveFileTypeUnknown, }; static inline ArchiveFileTypeEnum archive_get_tab_filetype(ArchiveTabEnum tab) { return known_type[tab]; } static inline const char* archive_get_tab_ext(ArchiveTabEnum tab) { return known_ext[archive_get_tab_filetype(tab)]; } static inline const char* archive_get_default_path(ArchiveTabEnum tab) { return tab_default_paths[tab]; } inline bool archive_is_known_app(ArchiveFileTypeEnum type) { return type != ArchiveFileTypeFolder && type != ArchiveFileTypeUnknown; } bool archive_is_item_in_array(ArchiveBrowserViewModel* model, uint32_t idx); bool archive_is_file_list_load_required(ArchiveBrowserViewModel* model); void archive_update_offset(ArchiveBrowserView* browser); void archive_update_focus(ArchiveBrowserView* browser, const char* target); void archive_file_array_load(ArchiveBrowserView* browser, int8_t dir); size_t archive_file_get_array_size(ArchiveBrowserView* browser); void archive_file_array_rm_selected(ArchiveBrowserView* browser); void archive_file_array_swap(ArchiveBrowserView* browser, int8_t dir); void archive_file_array_rm_all(ArchiveBrowserView* browser); void archive_set_item_count(ArchiveBrowserView* browser, uint32_t count); ArchiveFile_t* archive_get_current_file(ArchiveBrowserView* browser); ArchiveFile_t* archive_get_file_at(ArchiveBrowserView* browser, size_t idx); ArchiveTabEnum archive_get_tab(ArchiveBrowserView* browser); bool archive_is_home(ArchiveBrowserView* browser); const char* archive_get_name(ArchiveBrowserView* browser); void archive_add_app_item(ArchiveBrowserView* browser, const char* name); void archive_add_file_item(ArchiveBrowserView* browser, bool is_folder, const char* name); void archive_show_file_menu(ArchiveBrowserView* browser, bool show); void archive_favorites_move_mode(ArchiveBrowserView* browser, bool active); void archive_switch_tab(ArchiveBrowserView* browser, InputKey key); void archive_enter_dir(ArchiveBrowserView* browser, FuriString* name); void archive_leave_dir(ArchiveBrowserView* browser); void archive_refresh_dir(ArchiveBrowserView* browser); ================================================ FILE: applications/main/archive/helpers/archive_favorites.c ================================================ #include "archive_favorites.h" #include "archive_files.h" #include "archive_apps.h" #include "archive_browser.h" #include #define ARCHIVE_FAV_FILE_BUF_LEN 32 static bool archive_favorites_read_line(File* file, FuriString* str_result) { furi_string_reset(str_result); uint8_t buffer[ARCHIVE_FAV_FILE_BUF_LEN]; bool result = false; do { size_t read_count = storage_file_read(file, buffer, ARCHIVE_FAV_FILE_BUF_LEN); if(storage_file_get_error(file) != FSE_OK) { return false; } for(size_t i = 0; i < read_count; i++) { if(buffer[i] == '\n') { uint32_t position = storage_file_tell(file); if(storage_file_get_error(file) != FSE_OK) { return false; } position = position - read_count + i + 1; storage_file_seek(file, position, true); if(storage_file_get_error(file) != FSE_OK) { return false; } result = true; break; } else { furi_string_push_back(str_result, buffer[i]); } } if(result || read_count == 0) { break; } } while(true); return result; } uint16_t archive_favorites_count(void* context) { furi_assert(context); Storage* fs_api = furi_record_open(RECORD_STORAGE); File* file = storage_file_alloc(fs_api); FuriString* buffer; buffer = furi_string_alloc(); bool result = storage_file_open(file, ARCHIVE_FAV_PATH, FSAM_READ, FSOM_OPEN_EXISTING); uint16_t lines = 0; if(result) { while(1) { if(!archive_favorites_read_line(file, buffer)) { break; } if(!furi_string_size(buffer)) { continue; // Skip empty lines } ++lines; } } storage_file_close(file); furi_string_free(buffer); storage_file_free(file); furi_record_close(RECORD_STORAGE); return lines; } static bool archive_favourites_rescan(void) { FuriString* buffer; buffer = furi_string_alloc(); Storage* storage = furi_record_open(RECORD_STORAGE); File* file = storage_file_alloc(storage); bool result = storage_file_open(file, ARCHIVE_FAV_PATH, FSAM_READ, FSOM_OPEN_EXISTING); if(result) { while(1) { if(!archive_favorites_read_line(file, buffer)) { break; } if(!furi_string_size(buffer)) { continue; } if(furi_string_search(buffer, "/app:") == 0) { if(archive_app_is_available(NULL, furi_string_get_cstr(buffer))) { archive_file_append( ARCHIVE_FAV_TEMP_PATH, "%s\n", furi_string_get_cstr(buffer)); } } else { if(storage_file_exists(storage, furi_string_get_cstr(buffer))) { archive_file_append( ARCHIVE_FAV_TEMP_PATH, "%s\n", furi_string_get_cstr(buffer)); } } } } furi_string_free(buffer); storage_file_close(file); storage_common_remove(storage, ARCHIVE_FAV_PATH); storage_common_rename(storage, ARCHIVE_FAV_TEMP_PATH, ARCHIVE_FAV_PATH); storage_common_remove(storage, ARCHIVE_FAV_TEMP_PATH); storage_file_free(file); furi_record_close(RECORD_STORAGE); return result; } bool archive_favorites_read(void* context) { furi_assert(context); ArchiveBrowserView* browser = context; Storage* storage = furi_record_open(RECORD_STORAGE); File* file = storage_file_alloc(storage); FuriString* buffer; FileInfo file_info; buffer = furi_string_alloc(); bool need_refresh = false; uint16_t file_count = 0; archive_file_array_rm_all(browser); bool result = storage_file_open(file, ARCHIVE_FAV_PATH, FSAM_READ, FSOM_OPEN_EXISTING); if(result) { while(1) { if(!archive_favorites_read_line(file, buffer)) { break; } if(!furi_string_size(buffer)) { continue; } if(furi_string_search(buffer, "/app:") == 0) { if(archive_app_is_available(browser, furi_string_get_cstr(buffer))) { archive_add_app_item(browser, furi_string_get_cstr(buffer)); file_count++; } else { need_refresh = true; } } else { if(storage_file_exists(storage, furi_string_get_cstr(buffer))) { storage_common_stat(storage, furi_string_get_cstr(buffer), &file_info); archive_add_file_item( browser, file_info_is_dir(&file_info), furi_string_get_cstr(buffer)); file_count++; } else { need_refresh = true; } } furi_string_reset(buffer); } } storage_file_close(file); furi_string_free(buffer); storage_file_free(file); furi_record_close(RECORD_STORAGE); archive_set_item_count(browser, file_count); if(need_refresh) { //-V547 archive_favourites_rescan(); } return result; } bool archive_favorites_delete(const char* format, ...) { FuriString* buffer; FuriString* filename; va_list args; va_start(args, format); filename = furi_string_alloc_vprintf(format, args); va_end(args); buffer = furi_string_alloc(); Storage* fs_api = furi_record_open(RECORD_STORAGE); File* file = storage_file_alloc(fs_api); bool result = storage_file_open(file, ARCHIVE_FAV_PATH, FSAM_READ, FSOM_OPEN_EXISTING); if(result) { while(1) { if(!archive_favorites_read_line(file, buffer)) { break; } if(!furi_string_size(buffer)) { continue; } if(furi_string_search(buffer, filename)) { archive_file_append(ARCHIVE_FAV_TEMP_PATH, "%s\n", furi_string_get_cstr(buffer)); } } } furi_string_free(buffer); furi_string_free(filename); storage_file_close(file); storage_common_remove(fs_api, ARCHIVE_FAV_PATH); storage_common_rename(fs_api, ARCHIVE_FAV_TEMP_PATH, ARCHIVE_FAV_PATH); storage_common_remove(fs_api, ARCHIVE_FAV_TEMP_PATH); storage_file_free(file); furi_record_close(RECORD_STORAGE); return result; } bool archive_is_favorite(const char* format, ...) { FuriString* buffer; FuriString* filename; va_list args; va_start(args, format); filename = furi_string_alloc_vprintf(format, args); va_end(args); buffer = furi_string_alloc(); Storage* fs_api = furi_record_open(RECORD_STORAGE); File* file = storage_file_alloc(fs_api); bool found = false; bool result = storage_file_open(file, ARCHIVE_FAV_PATH, FSAM_READ, FSOM_OPEN_EXISTING); if(result) { while(1) { if(!archive_favorites_read_line(file, buffer)) { break; } if(!furi_string_size(buffer)) { continue; } if(!furi_string_search(buffer, filename)) { found = true; break; } } } storage_file_close(file); furi_string_free(buffer); furi_string_free(filename); storage_file_free(file); furi_record_close(RECORD_STORAGE); return found; } bool archive_favorites_rename(const char* src, const char* dst) { furi_assert(src); furi_assert(dst); Storage* fs_api = furi_record_open(RECORD_STORAGE); File* file = storage_file_alloc(fs_api); FuriString* path; FuriString* buffer; buffer = furi_string_alloc(); path = furi_string_alloc(); furi_string_printf(path, "%s", src); bool result = storage_file_open(file, ARCHIVE_FAV_PATH, FSAM_READ, FSOM_OPEN_EXISTING); if(result) { while(1) { if(!archive_favorites_read_line(file, buffer)) { break; } if(!furi_string_size(buffer)) { continue; } archive_file_append( ARCHIVE_FAV_TEMP_PATH, "%s\n", furi_string_search(buffer, path) ? furi_string_get_cstr(buffer) : dst); } } furi_string_free(buffer); furi_string_free(path); storage_file_close(file); storage_common_remove(fs_api, ARCHIVE_FAV_PATH); storage_common_rename(fs_api, ARCHIVE_FAV_TEMP_PATH, ARCHIVE_FAV_PATH); storage_common_remove(fs_api, ARCHIVE_FAV_TEMP_PATH); storage_file_free(file); furi_record_close(RECORD_STORAGE); return result; } void archive_add_to_favorites(const char* file_path) { furi_assert(file_path); archive_file_append(ARCHIVE_FAV_PATH, "%s\n", file_path); } void archive_favorites_save(void* context) { furi_assert(context); ArchiveBrowserView* browser = context; Storage* fs_api = furi_record_open(RECORD_STORAGE); File* file = storage_file_alloc(fs_api); for(size_t i = 0; i < archive_file_get_array_size(browser); i++) { ArchiveFile_t* item = archive_get_file_at(browser, i); archive_file_append(ARCHIVE_FAV_TEMP_PATH, "%s\n", furi_string_get_cstr(item->path)); } storage_common_remove(fs_api, ARCHIVE_FAV_PATH); storage_common_rename(fs_api, ARCHIVE_FAV_TEMP_PATH, ARCHIVE_FAV_PATH); storage_common_remove(fs_api, ARCHIVE_FAV_TEMP_PATH); storage_file_free(file); furi_record_close(RECORD_STORAGE); } void archive_favorites_handle_setting_pin_unpin(const char* app_name, const char* setting) { DialogMessage* message = dialog_message_alloc(); FuriString* setting_path = furi_string_alloc_set_str(app_name); if(setting) { furi_string_push_back(setting_path, '/'); furi_string_cat_str(setting_path, setting); } const char* setting_path_str = furi_string_get_cstr(setting_path); bool is_favorite = archive_is_favorite("/app:setting/%s", setting_path_str); dialog_message_set_header( message, is_favorite ? "Unpin This Setting?" : "Pin This Setting?", 64, 0, AlignCenter, AlignTop); dialog_message_set_text( message, is_favorite ? "It will no longer be\naccessible from the\nFavorites menu" : "It will be accessible from the\nFavorites menu", 64, 32, AlignCenter, AlignCenter); dialog_message_set_buttons( message, is_favorite ? "Unpin" : "Go back", NULL, is_favorite ? "Keep pinned" : "Pin"); DialogsApp* dialogs = furi_record_open(RECORD_DIALOGS); DialogMessageButton button = dialog_message_show(dialogs, message); furi_record_close(RECORD_DIALOGS); if(is_favorite && button == DialogMessageButtonLeft) { archive_favorites_delete("/app:setting/%s", setting_path_str); } else if(!is_favorite && button == DialogMessageButtonRight) { archive_file_append(ARCHIVE_FAV_PATH, "/app:setting/%s\n", setting_path_str); } furi_string_free(setting_path); dialog_message_free(message); } ================================================ FILE: applications/main/archive/helpers/archive_favorites.h ================================================ #pragma once #include #define ARCHIVE_FAV_PATH EXT_PATH("favorites.txt") #define ARCHIVE_FAV_TEMP_PATH EXT_PATH("favorites.tmp") uint16_t archive_favorites_count(void* context); bool archive_favorites_read(void* context); bool archive_favorites_delete(const char* format, ...) _ATTRIBUTE((__format__(__printf__, 1, 2))); bool archive_is_favorite(const char* format, ...) _ATTRIBUTE((__format__(__printf__, 1, 2))); bool archive_favorites_rename(const char* src, const char* dst); void archive_add_to_favorites(const char* file_path); void archive_favorites_save(void* context); /** * Intended to be called by settings apps to handle long presses, as well as * internally from within the archive * * @param app_name name of the referring application * @param setting name of the setting, which will be both displayed to the user * and passed to the application as an argument upon recall */ void archive_favorites_handle_setting_pin_unpin(const char* app_name, const char* setting); ================================================ FILE: applications/main/archive/helpers/archive_files.c ================================================ #include "archive_files.h" #include "archive_apps.h" #include "archive_browser.h" #define TAG "Archive" #define ASSETS_DIR "assets" void archive_set_file_type(ArchiveFile_t* file, const char* path, bool is_folder, bool is_app) { furi_assert(file); file->is_app = is_app; if(is_app) { file->type = archive_get_app_filetype(archive_get_app_type(path)); } else { for(size_t i = 0; i < COUNT_OF(known_ext); i++) { if((known_ext[i][0] == '?') || (known_ext[i][0] == '*')) continue; if(furi_string_end_withi(file->path, known_ext[i])) { if(i == ArchiveFileTypeBadUsb) { if(furi_string_search( file->path, archive_get_default_path(ArchiveTabBadUsb)) == 0) { file->type = i; return; // *.txt file is a BadUSB script only if it is in BadUSB folder } } else { file->type = i; return; } } } if(is_folder) { file->type = ArchiveFileTypeFolder; } else { file->type = ArchiveFileTypeUnknown; } } } bool archive_get_items(void* context, const char* path) { furi_assert(context); bool res = false; ArchiveBrowserView* browser = context; if(archive_get_tab(browser) == ArchiveTabFavorites) { res = archive_favorites_read(browser); } else if(strncmp(path, "/app:", 5) == 0) { res = archive_app_read_dir(browser, path); } return res; } void archive_file_append(const char* path, const char* format, ...) { furi_assert(path); FuriString* string; va_list args; va_start(args, format); string = furi_string_alloc_vprintf(format, args); va_end(args); Storage* fs_api = furi_record_open(RECORD_STORAGE); File* file = storage_file_alloc(fs_api); bool res = storage_file_open(file, path, FSAM_WRITE, FSOM_OPEN_APPEND); if(res) { storage_file_write(file, furi_string_get_cstr(string), furi_string_size(string)); } furi_string_free(string); storage_file_close(file); storage_file_free(file); furi_record_close(RECORD_STORAGE); } void archive_delete_file(void* context, const char* format, ...) { furi_assert(context); FuriString* filename; va_list args; va_start(args, format); filename = furi_string_alloc_vprintf(format, args); va_end(args); ArchiveBrowserView* browser = context; Storage* fs_api = furi_record_open(RECORD_STORAGE); FileInfo fileinfo; storage_common_stat(fs_api, furi_string_get_cstr(filename), &fileinfo); bool res = false; if(file_info_is_dir(&fileinfo)) { res = storage_simply_remove_recursive(fs_api, furi_string_get_cstr(filename)); } else { res = (storage_common_remove(fs_api, furi_string_get_cstr(filename)) == FSE_OK); } furi_record_close(RECORD_STORAGE); if(archive_is_favorite("%s", furi_string_get_cstr(filename))) { archive_favorites_delete("%s", furi_string_get_cstr(filename)); } if(res) { archive_file_array_rm_selected(browser); } furi_string_free(filename); } ================================================ FILE: applications/main/archive/helpers/archive_files.h ================================================ #pragma once #include #include #include #define FAP_MANIFEST_MAX_ICON_SIZE 32 typedef enum { ArchiveFileTypeIButton, ArchiveFileTypeNFC, ArchiveFileTypeSubGhz, ArchiveFileTypeLFRFID, ArchiveFileTypeInfrared, ArchiveFileTypeBadUsb, ArchiveFileTypeU2f, ArchiveFileTypeUpdateManifest, ArchiveFileTypeApplication, ArchiveFileTypeJS, ArchiveFileTypeFolder, ArchiveFileTypeUnknown, ArchiveFileTypeAppOrJs, ArchiveFileTypeSetting, ArchiveFileTypeLoading, } ArchiveFileTypeEnum; typedef struct { FuriString* path; ArchiveFileTypeEnum type; uint8_t* custom_icon_data; FuriString* custom_name; bool fav; bool is_app; } ArchiveFile_t; static void ArchiveFile_t_init(ArchiveFile_t* obj) { obj->path = furi_string_alloc(); obj->type = ArchiveFileTypeUnknown; obj->custom_icon_data = NULL; obj->custom_name = furi_string_alloc(); obj->fav = false; obj->is_app = false; } static void ArchiveFile_t_init_set(ArchiveFile_t* obj, const ArchiveFile_t* src) { obj->path = furi_string_alloc_set(src->path); obj->type = src->type; if(src->custom_icon_data) { obj->custom_icon_data = malloc(FAP_MANIFEST_MAX_ICON_SIZE); memcpy(obj->custom_icon_data, src->custom_icon_data, FAP_MANIFEST_MAX_ICON_SIZE); } else { obj->custom_icon_data = NULL; } obj->custom_name = furi_string_alloc_set(src->custom_name); obj->fav = src->fav; obj->is_app = src->is_app; } static void ArchiveFile_t_set(ArchiveFile_t* obj, const ArchiveFile_t* src) { furi_string_set(obj->path, src->path); obj->type = src->type; if(src->custom_icon_data) { obj->custom_icon_data = malloc(FAP_MANIFEST_MAX_ICON_SIZE); memcpy(obj->custom_icon_data, src->custom_icon_data, FAP_MANIFEST_MAX_ICON_SIZE); } else { obj->custom_icon_data = NULL; } furi_string_set(obj->custom_name, src->custom_name); obj->fav = src->fav; obj->is_app = src->is_app; } static void ArchiveFile_t_clear(ArchiveFile_t* obj) { furi_string_free(obj->path); if(obj->custom_icon_data) { free(obj->custom_icon_data); obj->custom_icon_data = NULL; } furi_string_free(obj->custom_name); } ARRAY_DEF( files_array, ArchiveFile_t, (INIT(API_2(ArchiveFile_t_init)), SET(API_6(ArchiveFile_t_set)), INIT_SET(API_6(ArchiveFile_t_init_set)), CLEAR(API_2(ArchiveFile_t_clear)))) void archive_set_file_type(ArchiveFile_t* file, const char* path, bool is_folder, bool is_app); bool archive_get_items(void* context, const char* path); void archive_file_append(const char* path, const char* format, ...) _ATTRIBUTE((__format__(__printf__, 2, 3))); void archive_delete_file(void* context, const char* format, ...) _ATTRIBUTE((__format__(__printf__, 2, 3))); ================================================ FILE: applications/main/archive/scenes/archive_scene.c ================================================ #include "archive_scene.h" // Generate scene on_enter handlers array #define ADD_SCENE(prefix, name, id) prefix##_scene_##name##_on_enter, void (*const archive_on_enter_handlers[])(void*) = { #include "archive_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 archive_on_event_handlers[])(void* context, SceneManagerEvent event) = { #include "archive_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 archive_on_exit_handlers[])(void* context) = { #include "archive_scene_config.h" }; #undef ADD_SCENE // Initialize scene handlers configuration structure const SceneManagerHandlers archive_scene_handlers = { .on_enter_handlers = archive_on_enter_handlers, .on_event_handlers = archive_on_event_handlers, .on_exit_handlers = archive_on_exit_handlers, .scene_num = ArchiveAppSceneNum, }; ================================================ FILE: applications/main/archive/scenes/archive_scene.h ================================================ #pragma once #include // Generate scene id and total number #define ADD_SCENE(prefix, name, id) ArchiveAppScene##id, typedef enum { #include "archive_scene_config.h" ArchiveAppSceneNum, } ArchiveAppScene; #undef ADD_SCENE extern const SceneManagerHandlers archive_scene_handlers; // Generate scene on_enter handlers declaration #define ADD_SCENE(prefix, name, id) void prefix##_scene_##name##_on_enter(void*); #include "archive_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 "archive_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 "archive_scene_config.h" #undef ADD_SCENE ================================================ FILE: applications/main/archive/scenes/archive_scene_browser.c ================================================ #include "../archive_i.h" #include "../helpers/archive_files.h" #include "../helpers/archive_favorites.h" #include "../helpers/archive_browser.h" #include "../views/archive_browser_view.h" #include "archive/scenes/archive_scene.h" #include #define TAG "ArchiveSceneBrowser" #define SCENE_STATE_DEFAULT (0) #define SCENE_STATE_NEED_REFRESH (1) static const char* archive_get_flipper_app_name(ArchiveFileTypeEnum file_type) { switch(file_type) { case ArchiveFileTypeIButton: return "iButton"; case ArchiveFileTypeNFC: return "NFC"; case ArchiveFileTypeSubGhz: return "Sub-GHz"; case ArchiveFileTypeLFRFID: return "125 kHz RFID"; case ArchiveFileTypeInfrared: return "Infrared"; case ArchiveFileTypeBadUsb: return "Bad USB"; case ArchiveFileTypeU2f: return "U2F"; case ArchiveFileTypeUpdateManifest: return "UpdaterApp"; case ArchiveFileTypeJS: return "JS Runner"; default: return NULL; } } static void archive_loader_callback(const void* message, void* context) { furi_assert(message); furi_assert(context); const LoaderEvent* event = message; ArchiveApp* archive = (ArchiveApp*)context; if(event->type == LoaderEventTypeNoMoreAppsInQueue) { view_dispatcher_send_custom_event( archive->view_dispatcher, ArchiveBrowserEventListRefresh); } } static void archive_run_in_app(ArchiveBrowserView* browser, ArchiveFile_t* selected) { UNUSED(browser); Loader* loader = furi_record_open(RECORD_LOADER); if(selected->type == ArchiveFileTypeSetting) { FuriString* app_name = furi_string_alloc_set(selected->path); furi_string_right(app_name, furi_string_search_char(app_name, '/', 1) + 1); size_t slash = furi_string_search_char(app_name, '/', 1); if(slash != FURI_STRING_FAILURE) { furi_string_left(app_name, slash); FuriString* app_args = furi_string_alloc_set_str(furi_string_get_cstr(app_name) + slash + 1); loader_start_with_gui_error( loader, furi_string_get_cstr(app_name), furi_string_get_cstr(app_args)); furi_string_free(app_args); } else { loader_start_with_gui_error(loader, furi_string_get_cstr(app_name), NULL); } furi_string_free(app_name); } else { const char* app_name = archive_get_flipper_app_name(selected->type); if(app_name) { if(selected->is_app) { char* param = strrchr(furi_string_get_cstr(selected->path), '/'); if(param != NULL) { param++; } loader_start_with_gui_error(loader, app_name, param); } else { loader_start_with_gui_error( loader, app_name, furi_string_get_cstr(selected->path)); } } else { loader_start_with_gui_error(loader, furi_string_get_cstr(selected->path), NULL); } } furi_record_close(RECORD_LOADER); } void archive_scene_browser_callback(ArchiveBrowserEvent event, void* context) { ArchiveApp* archive = (ArchiveApp*)context; view_dispatcher_send_custom_event(archive->view_dispatcher, event); } void archive_scene_browser_on_enter(void* context) { ArchiveApp* archive = (ArchiveApp*)context; ArchiveBrowserView* browser = archive->browser; browser->is_root = true; archive_browser_set_callback(browser, archive_scene_browser_callback, archive); archive_update_focus(browser, archive->text_store); view_dispatcher_switch_to_view(archive->view_dispatcher, ArchiveViewBrowser); archive->loader_stop_subscription = furi_pubsub_subscribe( loader_get_pubsub(archive->loader), archive_loader_callback, archive); uint32_t state = scene_manager_get_scene_state(archive->scene_manager, ArchiveAppSceneBrowser); if(state == SCENE_STATE_NEED_REFRESH) { view_dispatcher_send_custom_event( archive->view_dispatcher, ArchiveBrowserEventListRefresh); } scene_manager_set_scene_state( archive->scene_manager, ArchiveAppSceneBrowser, SCENE_STATE_DEFAULT); } bool archive_scene_browser_on_event(void* context, SceneManagerEvent event) { ArchiveApp* archive = (ArchiveApp*)context; ArchiveBrowserView* browser = archive->browser; ArchiveFile_t* selected = archive_get_current_file(browser); bool favorites = archive_get_tab(browser) == ArchiveTabFavorites; bool consumed = false; if(event.type == SceneManagerEventTypeCustom) { switch(event.event) { case ArchiveBrowserEventFileMenuOpen: archive_show_file_menu(browser, true); consumed = true; break; case ArchiveBrowserEventFileMenuClose: archive_show_file_menu(browser, false); consumed = true; break; case ArchiveBrowserEventFileMenuRun: if(archive_is_known_app(selected->type)) { archive_run_in_app(browser, selected); archive_show_file_menu(browser, false); } consumed = true; break; case ArchiveBrowserEventFileMenuPin: { const char* name = archive_get_name(browser); if(favorites) { archive_favorites_delete("%s", name); archive_file_array_rm_selected(browser); archive_show_file_menu(browser, false); } else if(archive_is_known_app(selected->type)) { if(archive_is_favorite("%s", name)) { archive_favorites_delete("%s", name); } else { archive_file_append(ARCHIVE_FAV_PATH, "%s\n", name); } archive_show_file_menu(browser, false); } consumed = true; } break; case ArchiveBrowserEventFileMenuRename: if(favorites) { browser->callback(ArchiveBrowserEventEnterFavMove, browser->context); } else if(selected->is_app == false) { archive_show_file_menu(browser, false); scene_manager_set_scene_state( archive->scene_manager, ArchiveAppSceneBrowser, SCENE_STATE_NEED_REFRESH); scene_manager_next_scene(archive->scene_manager, ArchiveAppSceneRename); } consumed = true; break; case ArchiveBrowserEventFileMenuDelete: if(archive_get_tab(browser) != ArchiveTabFavorites) { archive_show_file_menu(browser, false); scene_manager_set_scene_state( archive->scene_manager, ArchiveAppSceneBrowser, SCENE_STATE_NEED_REFRESH); scene_manager_next_scene(archive->scene_manager, ArchiveAppSceneDelete); } consumed = true; break; case ArchiveBrowserEventEnterDir: archive_enter_dir(browser, selected->path); consumed = true; break; case ArchiveBrowserEventFavMoveUp: archive_file_array_swap(browser, 1); consumed = true; break; case ArchiveBrowserEventFavMoveDown: archive_file_array_swap(browser, -1); consumed = true; break; case ArchiveBrowserEventEnterFavMove: furi_string_set(archive->fav_move_str, selected->path); archive_show_file_menu(browser, false); archive_favorites_move_mode(archive->browser, true); consumed = true; break; case ArchiveBrowserEventExitFavMove: archive_update_focus(browser, furi_string_get_cstr(archive->fav_move_str)); archive_favorites_move_mode(archive->browser, false); consumed = true; break; case ArchiveBrowserEventSaveFavMove: archive_favorites_move_mode(archive->browser, false); archive_favorites_save(archive->browser); consumed = true; break; case ArchiveBrowserEventLoadPrevItems: archive_file_array_load(archive->browser, -1); consumed = true; break; case ArchiveBrowserEventLoadNextItems: archive_file_array_load(archive->browser, 1); consumed = true; break; case ArchiveBrowserEventListRefresh: if(!favorites) { archive_refresh_dir(browser); } else { archive_favorites_read(browser); } consumed = true; break; case ArchiveBrowserEventExit: if(!archive_is_home(browser)) { archive_leave_dir(browser); } else { if(archive->loader_stop_subscription) { furi_pubsub_unsubscribe( loader_get_pubsub(archive->loader), archive->loader_stop_subscription); archive->loader_stop_subscription = NULL; } view_dispatcher_stop(archive->view_dispatcher); } consumed = true; break; default: break; } } return consumed; } void archive_scene_browser_on_exit(void* context) { ArchiveApp* archive = (ArchiveApp*)context; if(archive->loader_stop_subscription) { furi_pubsub_unsubscribe( loader_get_pubsub(archive->loader), archive->loader_stop_subscription); archive->loader_stop_subscription = NULL; } } ================================================ FILE: applications/main/archive/scenes/archive_scene_config.h ================================================ ADD_SCENE(archive, browser, Browser) ADD_SCENE(archive, rename, Rename) ADD_SCENE(archive, delete, Delete) ================================================ FILE: applications/main/archive/scenes/archive_scene_delete.c ================================================ #include "../archive_i.h" #include "../helpers/archive_files.h" #include "../helpers/archive_apps.h" #include "../helpers/archive_browser.h" #include "toolbox/path.h" #define SCENE_DELETE_CUSTOM_EVENT (0UL) #define MAX_TEXT_INPUT_LEN 22 void archive_scene_delete_widget_callback(GuiButtonType result, InputType type, void* context) { furi_assert(context); ArchiveApp* app = (ArchiveApp*)context; if(type == InputTypeShort) { view_dispatcher_send_custom_event(app->view_dispatcher, result); } } void archive_scene_delete_on_enter(void* context) { furi_assert(context); ArchiveApp* app = (ArchiveApp*)context; widget_add_button_element( app->widget, GuiButtonTypeLeft, "Cancel", archive_scene_delete_widget_callback, app); widget_add_button_element( app->widget, GuiButtonTypeRight, "Delete", archive_scene_delete_widget_callback, app); FuriString* filename; filename = furi_string_alloc(); ArchiveFile_t* current = archive_get_current_file(app->browser); FuriString* filename_no_ext = furi_string_alloc(); path_extract_filename(current->path, filename_no_ext, true); strlcpy(app->text_store, furi_string_get_cstr(filename_no_ext), MAX_NAME_LEN); furi_string_free(filename_no_ext); path_extract_filename(current->path, filename, false); char delete_str[64]; snprintf(delete_str, sizeof(delete_str), "\e#Delete %s?\e#", furi_string_get_cstr(filename)); widget_add_text_box_element( app->widget, 0, 0, 128, 23, AlignCenter, AlignCenter, delete_str, false); furi_string_free(filename); view_dispatcher_switch_to_view(app->view_dispatcher, ArchiveViewWidget); } bool archive_scene_delete_on_event(void* context, SceneManagerEvent event) { furi_assert(context); ArchiveApp* app = (ArchiveApp*)context; ArchiveBrowserView* browser = app->browser; ArchiveFile_t* selected = archive_get_current_file(browser); const char* name = archive_get_name(browser); if(event.type == SceneManagerEventTypeCustom) { if(event.event == GuiButtonTypeRight) { if(selected->is_app) { archive_app_delete_file(browser, name); } else { archive_delete_file(browser, "%s", name); } archive_show_file_menu(browser, false); return scene_manager_previous_scene(app->scene_manager); } else if(event.event == GuiButtonTypeLeft) { return scene_manager_previous_scene(app->scene_manager); } } return false; } void archive_scene_delete_on_exit(void* context) { furi_assert(context); ArchiveApp* app = (ArchiveApp*)context; widget_reset(app->widget); } ================================================ FILE: applications/main/archive/scenes/archive_scene_rename.c ================================================ #include "../archive_i.h" #include "../helpers/archive_favorites.h" #include "../helpers/archive_files.h" #include "../helpers/archive_browser.h" #include "archive/views/archive_browser_view.h" #include "toolbox/path.h" #define SCENE_RENAME_CUSTOM_EVENT (0UL) #define MAX_TEXT_INPUT_LEN 22 void archive_scene_rename_text_input_callback(void* context) { ArchiveApp* archive = (ArchiveApp*)context; view_dispatcher_send_custom_event(archive->view_dispatcher, SCENE_RENAME_CUSTOM_EVENT); } void archive_scene_rename_on_enter(void* context) { ArchiveApp* archive = (ArchiveApp*)context; TextInput* text_input = archive->text_input; ArchiveFile_t* current = archive_get_current_file(archive->browser); const bool is_file = current->type != ArchiveFileTypeFolder; FuriString* filename; filename = furi_string_alloc(); path_extract_filename(current->path, filename, is_file); strlcpy(archive->text_store, furi_string_get_cstr(filename), MAX_NAME_LEN); if(is_file) { path_extract_extension(current->path, archive->file_extension, MAX_EXT_LEN); } else { memset(archive->file_extension, 0, sizeof(archive->file_extension)); } text_input_set_header_text(text_input, "Rename:"); text_input_set_result_callback( text_input, archive_scene_rename_text_input_callback, archive, archive->text_store, MAX_TEXT_INPUT_LEN, false); ValidatorIsFile* validator_is_file = validator_is_file_alloc_init( furi_string_get_cstr(archive->browser->path), archive->file_extension, ""); text_input_set_validator(text_input, validator_is_file_callback, validator_is_file); furi_string_free(filename); view_dispatcher_switch_to_view(archive->view_dispatcher, ArchiveViewTextInput); } bool archive_scene_rename_on_event(void* context, SceneManagerEvent event) { ArchiveApp* archive = (ArchiveApp*)context; bool consumed = false; if(event.type == SceneManagerEventTypeCustom) { if(event.event == SCENE_RENAME_CUSTOM_EVENT) { Storage* fs_api = furi_record_open(RECORD_STORAGE); const char* path_src = archive_get_name(archive->browser); ArchiveFile_t* file = archive_get_current_file(archive->browser); FuriString* path_dst; path_dst = furi_string_alloc(); path_extract_dirname(path_src, path_dst); furi_string_cat_printf( path_dst, "/%s%s", archive->text_store, archive->file_extension); storage_common_rename(fs_api, path_src, furi_string_get_cstr(path_dst)); furi_record_close(RECORD_STORAGE); if(file->fav) { archive_favorites_rename(path_src, furi_string_get_cstr(path_dst)); } furi_string_free(path_dst); scene_manager_next_scene(archive->scene_manager, ArchiveAppSceneBrowser); consumed = true; } } return consumed; } void archive_scene_rename_on_exit(void* context) { ArchiveApp* archive = (ArchiveApp*)context; // Clear view void* validator_context = text_input_get_validator_callback_context(archive->text_input); text_input_set_validator(archive->text_input, NULL, NULL); validator_is_file_free(validator_context); text_input_reset(archive->text_input); } ================================================ FILE: applications/main/archive/views/archive_browser_view.c ================================================ #include "assets_icons.h" #include "toolbox/path.h" #include #include "archive_browser_view.h" #include "../helpers/archive_browser.h" #define SCROLL_INTERVAL (333) #define SCROLL_DELAY (2) static const char* ArchiveTabNames[] = { [ArchiveTabFavorites] = "Favorites", [ArchiveTabIButton] = "iButton", [ArchiveTabNFC] = "NFC", [ArchiveTabSubGhz] = "Sub-GHz", [ArchiveTabLFRFID] = "RFID LF", [ArchiveTabInfrared] = "Infrared", [ArchiveTabBadUsb] = "Bad USB", [ArchiveTabU2f] = "U2F", [ArchiveTabApplications] = "Apps", [ArchiveTabBrowser] = "Browser", }; static const Icon* ArchiveItemIcons[] = { [ArchiveFileTypeIButton] = &I_ibutt_10px, [ArchiveFileTypeNFC] = &I_Nfc_10px, [ArchiveFileTypeSubGhz] = &I_sub1_10px, [ArchiveFileTypeLFRFID] = &I_125_10px, [ArchiveFileTypeInfrared] = &I_ir_10px, [ArchiveFileTypeBadUsb] = &I_badusb_10px, [ArchiveFileTypeU2f] = &I_u2f_10px, [ArchiveFileTypeSetting] = &I_settings_10px, [ArchiveFileTypeUpdateManifest] = &I_update_10px, [ArchiveFileTypeFolder] = &I_dir_10px, [ArchiveFileTypeUnknown] = &I_unknown_10px, [ArchiveFileTypeLoading] = &I_loading_10px, [ArchiveFileTypeApplication] = &I_unknown_10px, [ArchiveFileTypeJS] = &I_js_script_10px, [ArchiveFileTypeAppOrJs] = &I_unknown_10px, }; void archive_browser_set_callback( ArchiveBrowserView* browser, ArchiveBrowserViewCallback callback, void* context) { furi_assert(browser); furi_assert(callback); browser->callback = callback; browser->context = context; } static void render_item_menu(Canvas* canvas, ArchiveBrowserViewModel* model) { canvas_set_color(canvas, ColorWhite); canvas_draw_box(canvas, 71, 17, 57, 46); canvas_set_color(canvas, ColorBlack); elements_slightly_rounded_frame(canvas, 70, 16, 58, 48); FuriString* menu[MENU_ITEMS]; menu[0] = furi_string_alloc_set("Run in app"); menu[1] = furi_string_alloc_set("Pin"); menu[2] = furi_string_alloc_set("Rename"); menu[3] = furi_string_alloc_set("Delete"); ArchiveFile_t* selected = files_array_get(model->files, model->item_idx - model->array_offset); if((selected->fav) || (model->tab_idx == ArchiveTabFavorites)) { furi_string_set(menu[1], "Unpin"); } if(!archive_is_known_app(selected->type)) { furi_string_set(menu[0], "---"); furi_string_set(menu[1], "---"); } else { if(model->tab_idx == ArchiveTabFavorites) { furi_string_set(menu[2], "Move"); furi_string_set(menu[3], "---"); } else if(selected->is_app) { furi_string_set(menu[2], "---"); } } for(size_t i = 0; i < MENU_ITEMS; i++) { canvas_draw_str(canvas, 82, 27 + i * 11, furi_string_get_cstr(menu[i])); furi_string_free(menu[i]); } canvas_draw_icon(canvas, 74, 20 + model->menu_idx * 11, &I_ButtonRight_4x7); } static void archive_draw_frame(Canvas* canvas, uint16_t idx, bool scrollbar, bool moving) { uint8_t x_offset = moving ? MOVE_OFFSET : 0; canvas_set_color(canvas, ColorBlack); canvas_draw_box( canvas, 0 + x_offset, 15 + idx * FRAME_HEIGHT, (scrollbar ? 122 : 127) - x_offset, FRAME_HEIGHT); canvas_set_color(canvas, ColorWhite); canvas_draw_dot(canvas, 0 + x_offset, 15 + idx * FRAME_HEIGHT); canvas_draw_dot(canvas, 1 + x_offset, 15 + idx * FRAME_HEIGHT); canvas_draw_dot(canvas, 0 + x_offset, (15 + idx * FRAME_HEIGHT) + 1); canvas_draw_dot(canvas, 0 + x_offset, (15 + idx * FRAME_HEIGHT) + 11); canvas_draw_dot(canvas, scrollbar ? 121 : 126, 15 + idx * FRAME_HEIGHT); canvas_draw_dot(canvas, scrollbar ? 121 : 126, (15 + idx * FRAME_HEIGHT) + 11); } static void archive_draw_loading(Canvas* canvas, ArchiveBrowserViewModel* model) { furi_assert(model); uint8_t x = 128 / 2 - 24 / 2; uint8_t y = 64 / 2 - 24 / 2; canvas_draw_icon(canvas, x, y, &A_Loading_24); } static void draw_list(Canvas* canvas, ArchiveBrowserViewModel* model) { furi_assert(model); size_t array_size = files_array_size(model->files); bool scrollbar = model->item_cnt > 4; for(uint32_t i = 0; i < MIN(model->item_cnt, MENU_ITEMS); ++i) { FuriString* str_buf; str_buf = furi_string_alloc(); int32_t idx = CLAMP((uint32_t)(i + model->list_offset), model->item_cnt, 0u); uint8_t x_offset = (model->move_fav && model->item_idx == idx) ? MOVE_OFFSET : 0; ArchiveFileTypeEnum file_type = ArchiveFileTypeLoading; uint8_t* custom_icon_data = NULL; if(archive_is_item_in_array(model, idx)) { ArchiveFile_t* file = files_array_get( model->files, CLAMP(idx - model->array_offset, (int32_t)(array_size - 1), 0)); file_type = file->type; if(file_type == ArchiveFileTypeApplication) { if(file->custom_icon_data) { custom_icon_data = file->custom_icon_data; furi_string_set(str_buf, file->custom_name); } else { file_type = ArchiveFileTypeUnknown; path_extract_filename(file->path, str_buf, archive_is_known_app(file->type)); } } else { path_extract_filename(file->path, str_buf, archive_is_known_app(file->type)); } } else { furi_string_set(str_buf, "---"); } size_t scroll_counter = model->scroll_counter; if(model->item_idx == idx) { archive_draw_frame(canvas, i, scrollbar, model->move_fav); if(scroll_counter < SCROLL_DELAY) { scroll_counter = 0; } else { scroll_counter -= SCROLL_DELAY; } } else { canvas_set_color(canvas, ColorBlack); scroll_counter = 0; } if(custom_icon_data) { canvas_draw_bitmap( canvas, 2 + x_offset, 16 + i * FRAME_HEIGHT, 11, 10, custom_icon_data); } else { canvas_draw_icon( canvas, 2 + x_offset, 16 + i * FRAME_HEIGHT, ArchiveItemIcons[file_type]); } elements_scrollable_text_line( canvas, 15 + x_offset, 24 + i * FRAME_HEIGHT, ((scrollbar ? MAX_LEN_PX - 6 : MAX_LEN_PX) - x_offset), str_buf, scroll_counter, (model->item_idx != idx)); furi_string_free(str_buf); } if(scrollbar) { elements_scrollbar_pos(canvas, 126, 15, 49, model->item_idx, model->item_cnt); } if(model->menu) { render_item_menu(canvas, model); } } static void archive_render_status_bar(Canvas* canvas, ArchiveBrowserViewModel* model) { furi_assert(model); const char* tab_name = ArchiveTabNames[model->tab_idx]; canvas_draw_icon(canvas, 0, 0, &I_Background_128x11); canvas_set_color(canvas, ColorWhite); canvas_draw_box(canvas, 0, 0, 50, 13); canvas_draw_box(canvas, 107, 0, 20, 13); canvas_set_color(canvas, ColorBlack); canvas_draw_rframe(canvas, 0, 0, 51, 13, 1); // frame canvas_draw_line(canvas, 49, 1, 49, 11); // shadow right canvas_draw_line(canvas, 1, 11, 49, 11); // shadow bottom canvas_draw_str_aligned(canvas, 25, 9, AlignCenter, AlignBottom, tab_name); canvas_draw_rframe(canvas, 107, 0, 21, 13, 1); canvas_draw_line(canvas, 126, 1, 126, 11); canvas_draw_line(canvas, 108, 11, 126, 11); if(model->move_fav) { canvas_draw_icon(canvas, 110, 4, &I_ButtonUp_7x4); canvas_draw_icon(canvas, 117, 4, &I_ButtonDown_7x4); } else { canvas_draw_icon(canvas, 111, 2, &I_ButtonLeft_4x7); canvas_draw_icon(canvas, 119, 2, &I_ButtonRight_4x7); } canvas_set_color(canvas, ColorWhite); canvas_draw_dot(canvas, 50, 0); canvas_draw_dot(canvas, 127, 0); canvas_set_color(canvas, ColorBlack); } static void archive_view_render(Canvas* canvas, void* mdl) { ArchiveBrowserViewModel* model = mdl; archive_render_status_bar(canvas, mdl); if(model->folder_loading) { archive_draw_loading(canvas, model); } else if(model->item_cnt > 0) { draw_list(canvas, model); } else { canvas_draw_str_aligned( canvas, GUI_DISPLAY_WIDTH / 2, 40, AlignCenter, AlignCenter, "Empty"); } } View* archive_browser_get_view(ArchiveBrowserView* browser) { furi_assert(browser); return browser->view; } static void file_list_rollover(ArchiveBrowserViewModel* model) { if(!model->list_loading && files_array_size(model->files) < model->item_cnt) { files_array_reset(model->files); } } static bool archive_view_input(InputEvent* event, void* context) { furi_assert(event); furi_assert(context); ArchiveBrowserView* browser = context; bool in_menu; bool move_fav_mode; with_view_model( browser->view, ArchiveBrowserViewModel * model, { in_menu = model->menu; move_fav_mode = model->move_fav; }, false); if(in_menu) { if(event->type == InputTypeShort) { if(event->key == InputKeyUp || event->key == InputKeyDown) { with_view_model( browser->view, ArchiveBrowserViewModel * model, { if(event->key == InputKeyUp) { model->menu_idx = ((model->menu_idx - 1) + MENU_ITEMS) % MENU_ITEMS; } else if(event->key == InputKeyDown) { model->menu_idx = (model->menu_idx + 1) % MENU_ITEMS; } }, true); } if(event->key == InputKeyOk) { uint8_t idx; with_view_model( browser->view, ArchiveBrowserViewModel * model, { idx = model->menu_idx; }, false); browser->callback(file_menu_actions[idx], browser->context); } else if(event->key == InputKeyBack) { browser->callback(ArchiveBrowserEventFileMenuClose, browser->context); } } } else { if(event->type == InputTypeShort) { if(event->key == InputKeyLeft || event->key == InputKeyRight) { if(move_fav_mode) return false; archive_switch_tab(browser, event->key); } else if(event->key == InputKeyBack) { if(move_fav_mode) { browser->callback(ArchiveBrowserEventExitFavMove, browser->context); } else { browser->callback(ArchiveBrowserEventExit, browser->context); } } } if((event->key == InputKeyUp || event->key == InputKeyDown) && (event->type == InputTypeShort || event->type == InputTypeRepeat)) { with_view_model( browser->view, ArchiveBrowserViewModel * model, { int32_t scroll_speed = 1; if(model->button_held_for_ticks > 5) { if(model->button_held_for_ticks % 2) { scroll_speed = 0; } else { scroll_speed = model->button_held_for_ticks > 9 ? 4 : 2; } } if(event->key == InputKeyUp) { if(model->item_idx < scroll_speed) { model->button_held_for_ticks = 0; model->item_idx = model->item_cnt - 1; file_list_rollover(model); } else { model->item_idx = ((model->item_idx - scroll_speed) + model->item_cnt) % model->item_cnt; } if(archive_is_file_list_load_required(model)) { model->list_loading = true; browser->callback(ArchiveBrowserEventLoadPrevItems, browser->context); } if(move_fav_mode) { browser->callback(ArchiveBrowserEventFavMoveUp, browser->context); } model->scroll_counter = 0; model->button_held_for_ticks += 1; } else if(event->key == InputKeyDown) { int32_t count = model->item_cnt; if(model->item_idx + scroll_speed >= count) { model->button_held_for_ticks = 0; model->item_idx = 0; file_list_rollover(model); } else { model->item_idx = (model->item_idx + scroll_speed) % model->item_cnt; } if(archive_is_file_list_load_required(model)) { model->list_loading = true; browser->callback(ArchiveBrowserEventLoadNextItems, browser->context); } if(move_fav_mode) { browser->callback(ArchiveBrowserEventFavMoveDown, browser->context); } model->scroll_counter = 0; model->button_held_for_ticks += 1; } }, true); archive_update_offset(browser); } if(event->key == InputKeyOk) { ArchiveFile_t* selected = archive_get_current_file(browser); if(selected) { bool favorites = archive_get_tab(browser) == ArchiveTabFavorites; bool folder = selected->type == ArchiveFileTypeFolder; if(event->type == InputTypeShort) { if(favorites) { if(move_fav_mode) { browser->callback(ArchiveBrowserEventSaveFavMove, browser->context); } else { browser->callback(ArchiveBrowserEventFileMenuRun, browser->context); } } else if(folder) { browser->callback(ArchiveBrowserEventEnterDir, browser->context); } else { browser->callback(ArchiveBrowserEventFileMenuOpen, browser->context); } } else if(event->type == InputTypeLong) { if(move_fav_mode) { browser->callback(ArchiveBrowserEventSaveFavMove, browser->context); } else if(folder || favorites) { browser->callback(ArchiveBrowserEventFileMenuOpen, browser->context); } } } } } if(event->type == InputTypeRelease) { with_view_model( browser->view, ArchiveBrowserViewModel * model, { model->button_held_for_ticks = 0; }, true); } return true; } static void browser_scroll_timer(void* context) { furi_assert(context); ArchiveBrowserView* browser = context; with_view_model( browser->view, ArchiveBrowserViewModel * model, { model->scroll_counter++; }, true); } static void browser_view_enter(void* context) { furi_assert(context); ArchiveBrowserView* browser = context; with_view_model( browser->view, ArchiveBrowserViewModel * model, { model->scroll_counter = 0; }, true); furi_timer_start(browser->scroll_timer, SCROLL_INTERVAL); } static void browser_view_exit(void* context) { furi_assert(context); ArchiveBrowserView* browser = context; furi_timer_stop(browser->scroll_timer); } ArchiveBrowserView* browser_alloc(void) { ArchiveBrowserView* browser = malloc(sizeof(ArchiveBrowserView)); browser->view = view_alloc(); view_allocate_model(browser->view, ViewModelTypeLocking, sizeof(ArchiveBrowserViewModel)); view_set_context(browser->view, browser); view_set_draw_callback(browser->view, archive_view_render); view_set_input_callback(browser->view, archive_view_input); view_set_enter_callback(browser->view, browser_view_enter); view_set_exit_callback(browser->view, browser_view_exit); browser->scroll_timer = furi_timer_alloc(browser_scroll_timer, FuriTimerTypePeriodic, browser); browser->path = furi_string_alloc_set(archive_get_default_path(TAB_DEFAULT)); with_view_model( browser->view, ArchiveBrowserViewModel * model, { files_array_init(model->files); model->tab_idx = TAB_DEFAULT; }, true); return browser; } void browser_free(ArchiveBrowserView* browser) { furi_assert(browser); furi_timer_free(browser->scroll_timer); if(browser->worker_running) { file_browser_worker_free(browser->worker); } with_view_model( browser->view, ArchiveBrowserViewModel * model, { files_array_clear(model->files); }, false); furi_string_free(browser->path); view_free(browser->view); free(browser); } ================================================ FILE: applications/main/archive/views/archive_browser_view.h ================================================ #pragma once #include "../helpers/archive_files.h" #include "../helpers/archive_favorites.h" #include #include #include #include #include #include #include #define MAX_LEN_PX 110 #define MAX_NAME_LEN 255 #define MAX_EXT_LEN 6 #define FRAME_HEIGHT 12 #define MENU_ITEMS 4u #define MOVE_OFFSET 5u typedef enum { ArchiveTabFavorites, ArchiveTabSubGhz, ArchiveTabLFRFID, ArchiveTabNFC, ArchiveTabInfrared, ArchiveTabIButton, ArchiveTabBadUsb, ArchiveTabU2f, ArchiveTabApplications, ArchiveTabBrowser, ArchiveTabTotal, } ArchiveTabEnum; typedef enum { ArchiveBrowserEventFileMenuOpen, ArchiveBrowserEventFileMenuClose, ArchiveBrowserEventFileMenuRun, ArchiveBrowserEventFileMenuPin, ArchiveBrowserEventFileMenuRename, ArchiveBrowserEventFileMenuDelete, ArchiveBrowserEventEnterDir, ArchiveBrowserEventFavMoveUp, ArchiveBrowserEventFavMoveDown, ArchiveBrowserEventEnterFavMove, ArchiveBrowserEventExitFavMove, ArchiveBrowserEventSaveFavMove, ArchiveBrowserEventLoadPrevItems, ArchiveBrowserEventLoadNextItems, ArchiveBrowserEventListRefresh, ArchiveBrowserEventExit, } ArchiveBrowserEvent; static const uint8_t file_menu_actions[MENU_ITEMS] = { [0] = ArchiveBrowserEventFileMenuRun, [1] = ArchiveBrowserEventFileMenuPin, [2] = ArchiveBrowserEventFileMenuRename, [3] = ArchiveBrowserEventFileMenuDelete, }; typedef struct ArchiveBrowserView ArchiveBrowserView; typedef void (*ArchiveBrowserViewCallback)(ArchiveBrowserEvent event, void* context); typedef enum { BrowserActionBrowse, BrowserActionItemMenu, BrowserActionTotal, } BrowserActionEnum; struct ArchiveBrowserView { View* view; BrowserWorker* worker; bool worker_running; ArchiveBrowserViewCallback callback; void* context; FuriString* path; InputKey last_tab_switch_dir; bool is_root; FuriTimer* scroll_timer; }; typedef struct { ArchiveTabEnum tab_idx; files_array_t files; uint8_t menu_idx; bool menu; bool move_fav; bool list_loading; bool folder_loading; uint32_t item_cnt; int32_t item_idx; int32_t array_offset; int32_t list_offset; size_t scroll_counter; uint32_t button_held_for_ticks; } ArchiveBrowserViewModel; void archive_browser_set_callback( ArchiveBrowserView* browser, ArchiveBrowserViewCallback callback, void* context); View* archive_browser_get_view(ArchiveBrowserView* browser); ArchiveBrowserView* browser_alloc(void); void browser_free(ArchiveBrowserView* browser); ================================================ FILE: applications/main/bad_usb/application.fam ================================================ App( appid="bad_usb", name="Bad USB", apptype=FlipperAppType.MENUEXTERNAL, entry_point="bad_usb_app", stack_size=2 * 1024, icon="A_BadUsb_14", order=70, resources="resources", fap_libs=["assets", "ble_profile"], fap_icon="icon.png", fap_category="USB", ) ================================================ FILE: applications/main/bad_usb/bad_usb_app.c ================================================ #include "bad_usb_app_i.h" #include #include #include #include #include #define BAD_USB_SETTINGS_PATH BAD_USB_APP_BASE_FOLDER "/.badusb.settings" #define BAD_USB_SETTINGS_FILE_TYPE "Flipper BadUSB Settings File" #define BAD_USB_SETTINGS_VERSION 1 #define BAD_USB_SETTINGS_DEFAULT_LAYOUT BAD_USB_APP_PATH_LAYOUT_FOLDER "/en-US.kl" static bool bad_usb_app_custom_event_callback(void* context, uint32_t event) { furi_assert(context); BadUsbApp* app = context; return scene_manager_handle_custom_event(app->scene_manager, event); } static bool bad_usb_app_back_event_callback(void* context) { furi_assert(context); BadUsbApp* app = context; return scene_manager_handle_back_event(app->scene_manager); } static void bad_usb_app_tick_event_callback(void* context) { furi_assert(context); BadUsbApp* app = context; scene_manager_handle_tick_event(app->scene_manager); } static void bad_usb_load_settings(BadUsbApp* app) { Storage* storage = furi_record_open(RECORD_STORAGE); FlipperFormat* fff = flipper_format_file_alloc(storage); bool state = false; FuriString* temp_str = furi_string_alloc(); uint32_t version = 0; uint32_t interface = 0; if(flipper_format_file_open_existing(fff, BAD_USB_SETTINGS_PATH)) { do { if(!flipper_format_read_header(fff, temp_str, &version)) break; if((strcmp(furi_string_get_cstr(temp_str), BAD_USB_SETTINGS_FILE_TYPE) != 0) || (version != BAD_USB_SETTINGS_VERSION)) break; if(!flipper_format_read_string(fff, "layout", temp_str)) break; if(!flipper_format_read_uint32(fff, "interface", &interface, 1)) break; if(interface > BadUsbHidInterfaceBle) break; state = true; } while(0); } flipper_format_free(fff); furi_record_close(RECORD_STORAGE); if(state) { furi_string_set(app->keyboard_layout, temp_str); app->interface = interface; Storage* fs_api = furi_record_open(RECORD_STORAGE); FileInfo layout_file_info; FS_Error file_check_err = storage_common_stat( fs_api, furi_string_get_cstr(app->keyboard_layout), &layout_file_info); furi_record_close(RECORD_STORAGE); if((file_check_err != FSE_OK) || (layout_file_info.size != 256)) { furi_string_set(app->keyboard_layout, BAD_USB_SETTINGS_DEFAULT_LAYOUT); } } else { furi_string_set(app->keyboard_layout, BAD_USB_SETTINGS_DEFAULT_LAYOUT); app->interface = BadUsbHidInterfaceUsb; } furi_string_free(temp_str); } static void bad_usb_save_settings(BadUsbApp* app) { Storage* storage = furi_record_open(RECORD_STORAGE); FlipperFormat* fff = flipper_format_file_alloc(storage); if(flipper_format_file_open_always(fff, BAD_USB_SETTINGS_PATH)) { do { if(!flipper_format_write_header_cstr( fff, BAD_USB_SETTINGS_FILE_TYPE, BAD_USB_SETTINGS_VERSION)) break; if(!flipper_format_write_string(fff, "layout", app->keyboard_layout)) break; uint32_t interface_id = app->interface; if(!flipper_format_write_uint32(fff, "interface", (const uint32_t*)&interface_id, 1)) break; } while(0); } flipper_format_free(fff); furi_record_close(RECORD_STORAGE); } void bad_usb_set_interface(BadUsbApp* app, BadUsbHidInterface interface) { app->interface = interface; bad_usb_view_set_interface(app->bad_usb_view, interface); } BadUsbApp* bad_usb_app_alloc(char* arg) { BadUsbApp* app = malloc(sizeof(BadUsbApp)); app->bad_usb_script = NULL; app->file_path = furi_string_alloc(); app->keyboard_layout = furi_string_alloc(); if(arg && strlen(arg)) { furi_string_set(app->file_path, arg); } bad_usb_load_settings(app); app->gui = furi_record_open(RECORD_GUI); app->notifications = furi_record_open(RECORD_NOTIFICATION); app->dialogs = furi_record_open(RECORD_DIALOGS); app->view_dispatcher = view_dispatcher_alloc(); app->scene_manager = scene_manager_alloc(&bad_usb_scene_handlers, app); view_dispatcher_set_event_callback_context(app->view_dispatcher, app); view_dispatcher_set_tick_event_callback( app->view_dispatcher, bad_usb_app_tick_event_callback, 500); view_dispatcher_set_custom_event_callback( app->view_dispatcher, bad_usb_app_custom_event_callback); view_dispatcher_set_navigation_event_callback( app->view_dispatcher, bad_usb_app_back_event_callback); // Custom Widget app->widget = widget_alloc(); view_dispatcher_add_view( app->view_dispatcher, BadUsbAppViewWidget, widget_get_view(app->widget)); // Popup app->popup = popup_alloc(); view_dispatcher_add_view(app->view_dispatcher, BadUsbAppViewPopup, popup_get_view(app->popup)); app->var_item_list = variable_item_list_alloc(); view_dispatcher_add_view( app->view_dispatcher, BadUsbAppViewConfig, variable_item_list_get_view(app->var_item_list)); app->bad_usb_view = bad_usb_view_alloc(); view_dispatcher_add_view( app->view_dispatcher, BadUsbAppViewWork, bad_usb_view_get_view(app->bad_usb_view)); view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen); if(furi_hal_usb_is_locked()) { app->error = BadUsbAppErrorCloseRpc; app->usb_if_prev = NULL; scene_manager_next_scene(app->scene_manager, BadUsbSceneError); } else { app->usb_if_prev = furi_hal_usb_get_config(); furi_check(furi_hal_usb_set_config(NULL, NULL)); if(!furi_string_empty(app->file_path)) { scene_manager_next_scene(app->scene_manager, BadUsbSceneWork); } else { furi_string_set(app->file_path, BAD_USB_APP_BASE_FOLDER); scene_manager_next_scene(app->scene_manager, BadUsbSceneFileSelect); } } return app; } void bad_usb_app_free(BadUsbApp* app) { furi_assert(app); if(app->bad_usb_script) { bad_usb_script_close(app->bad_usb_script); app->bad_usb_script = NULL; } // Views view_dispatcher_remove_view(app->view_dispatcher, BadUsbAppViewWork); bad_usb_view_free(app->bad_usb_view); // Custom Widget view_dispatcher_remove_view(app->view_dispatcher, BadUsbAppViewWidget); widget_free(app->widget); // Popup view_dispatcher_remove_view(app->view_dispatcher, BadUsbAppViewPopup); popup_free(app->popup); // Config menu view_dispatcher_remove_view(app->view_dispatcher, BadUsbAppViewConfig); variable_item_list_free(app->var_item_list); // View dispatcher view_dispatcher_free(app->view_dispatcher); scene_manager_free(app->scene_manager); // Close records furi_record_close(RECORD_GUI); furi_record_close(RECORD_NOTIFICATION); furi_record_close(RECORD_DIALOGS); bad_usb_save_settings(app); furi_string_free(app->file_path); furi_string_free(app->keyboard_layout); if(app->usb_if_prev) { furi_check(furi_hal_usb_set_config(app->usb_if_prev, NULL)); } free(app); } int32_t bad_usb_app(void* p) { BadUsbApp* bad_usb_app = bad_usb_app_alloc((char*)p); view_dispatcher_run(bad_usb_app->view_dispatcher); bad_usb_app_free(bad_usb_app); return 0; } ================================================ FILE: applications/main/bad_usb/bad_usb_app.h ================================================ #pragma once #ifdef __cplusplus extern "C" { #endif typedef struct BadUsbApp BadUsbApp; #ifdef __cplusplus } #endif ================================================ FILE: applications/main/bad_usb/bad_usb_app_i.h ================================================ #pragma once #include "bad_usb_app.h" #include "scenes/bad_usb_scene.h" #include "helpers/ducky_script.h" #include "helpers/bad_usb_hid.h" #include #include #include #include #include #include #include #include #include #include "views/bad_usb_view.h" #include #define BAD_USB_APP_BASE_FOLDER EXT_PATH("badusb") #define BAD_USB_APP_PATH_LAYOUT_FOLDER BAD_USB_APP_BASE_FOLDER "/assets/layouts" #define BAD_USB_APP_SCRIPT_EXTENSION ".txt" #define BAD_USB_APP_LAYOUT_EXTENSION ".kl" typedef enum { BadUsbAppErrorNoFiles, BadUsbAppErrorCloseRpc, } BadUsbAppError; struct BadUsbApp { Gui* gui; ViewDispatcher* view_dispatcher; SceneManager* scene_manager; NotificationApp* notifications; DialogsApp* dialogs; Widget* widget; Popup* popup; VariableItemList* var_item_list; BadUsbAppError error; FuriString* file_path; FuriString* keyboard_layout; BadUsb* bad_usb_view; BadUsbScript* bad_usb_script; BadUsbHidInterface interface; FuriHalUsbInterface* usb_if_prev; }; typedef enum { BadUsbAppViewWidget, BadUsbAppViewPopup, BadUsbAppViewWork, BadUsbAppViewConfig, } BadUsbAppView; void bad_usb_set_interface(BadUsbApp* app, BadUsbHidInterface interface); ================================================ FILE: applications/main/bad_usb/helpers/bad_usb_hid.c ================================================ #include "bad_usb_hid.h" #include #include #include #define TAG "BadUSB HID" #define HID_BT_KEYS_STORAGE_NAME ".bt_hid.keys" void* hid_usb_init(FuriHalUsbHidConfig* hid_cfg) { furi_check(furi_hal_usb_set_config(&usb_hid, hid_cfg)); return NULL; } void hid_usb_deinit(void* inst) { UNUSED(inst); furi_check(furi_hal_usb_set_config(NULL, NULL)); } void hid_usb_set_state_callback(void* inst, HidStateCallback cb, void* context) { UNUSED(inst); furi_hal_hid_set_state_callback(cb, context); } bool hid_usb_is_connected(void* inst) { UNUSED(inst); return furi_hal_hid_is_connected(); } bool hid_usb_kb_press(void* inst, uint16_t button) { UNUSED(inst); return furi_hal_hid_kb_press(button); } bool hid_usb_kb_release(void* inst, uint16_t button) { UNUSED(inst); return furi_hal_hid_kb_release(button); } bool hid_usb_mouse_press(void* inst, uint8_t button) { UNUSED(inst); return furi_hal_hid_mouse_press(button); } bool hid_usb_mouse_release(void* inst, uint8_t button) { UNUSED(inst); return furi_hal_hid_mouse_release(button); } bool hid_usb_mouse_scroll(void* inst, int8_t delta) { UNUSED(inst); return furi_hal_hid_mouse_scroll(delta); } bool hid_usb_mouse_move(void* inst, int8_t dx, int8_t dy) { UNUSED(inst); return furi_hal_hid_mouse_move(dx, dy); } bool hid_usb_mouse_release_all(void* inst) { UNUSED(inst); return furi_hal_hid_mouse_release(0); } bool hid_usb_consumer_press(void* inst, uint16_t button) { UNUSED(inst); return furi_hal_hid_consumer_key_press(button); } bool hid_usb_consumer_release(void* inst, uint16_t button) { UNUSED(inst); return furi_hal_hid_consumer_key_release(button); } bool hid_usb_release_all(void* inst) { UNUSED(inst); bool state = furi_hal_hid_kb_release_all(); state &= furi_hal_hid_consumer_key_release_all(); state &= hid_usb_mouse_release_all(inst); return state; } uint8_t hid_usb_get_led_state(void* inst) { UNUSED(inst); return furi_hal_hid_get_led_state(); } static const BadUsbHidApi hid_api_usb = { .init = hid_usb_init, .deinit = hid_usb_deinit, .set_state_callback = hid_usb_set_state_callback, .is_connected = hid_usb_is_connected, .kb_press = hid_usb_kb_press, .kb_release = hid_usb_kb_release, .mouse_press = hid_usb_mouse_press, .mouse_release = hid_usb_mouse_release, .mouse_scroll = hid_usb_mouse_scroll, .mouse_move = hid_usb_mouse_move, .consumer_press = hid_usb_consumer_press, .consumer_release = hid_usb_consumer_release, .release_all = hid_usb_release_all, .get_led_state = hid_usb_get_led_state, }; typedef struct { Bt* bt; FuriHalBleProfileBase* profile; HidStateCallback state_callback; void* callback_context; bool is_connected; } BleHidInstance; static const BleProfileHidParams ble_hid_params = { .device_name_prefix = "BadUSB", .mac_xor = 0x0002, }; static void hid_ble_connection_status_callback(BtStatus status, void* context) { furi_assert(context); BleHidInstance* ble_hid = context; ble_hid->is_connected = (status == BtStatusConnected); if(ble_hid->state_callback) { ble_hid->state_callback(ble_hid->is_connected, ble_hid->callback_context); } } void* hid_ble_init(FuriHalUsbHidConfig* hid_cfg) { UNUSED(hid_cfg); BleHidInstance* ble_hid = malloc(sizeof(BleHidInstance)); ble_hid->bt = furi_record_open(RECORD_BT); bt_disconnect(ble_hid->bt); // Wait 2nd core to update nvm storage furi_delay_ms(200); bt_keys_storage_set_storage_path(ble_hid->bt, APP_DATA_PATH(HID_BT_KEYS_STORAGE_NAME)); ble_hid->profile = bt_profile_start(ble_hid->bt, ble_profile_hid, (void*)&ble_hid_params); furi_check(ble_hid->profile); furi_hal_bt_start_advertising(); bt_set_status_changed_callback(ble_hid->bt, hid_ble_connection_status_callback, ble_hid); return ble_hid; } void hid_ble_deinit(void* inst) { BleHidInstance* ble_hid = inst; furi_assert(ble_hid); bt_set_status_changed_callback(ble_hid->bt, NULL, NULL); bt_disconnect(ble_hid->bt); // Wait 2nd core to update nvm storage furi_delay_ms(200); bt_keys_storage_set_default_path(ble_hid->bt); furi_check(bt_profile_restore_default(ble_hid->bt)); furi_record_close(RECORD_BT); free(ble_hid); } void hid_ble_set_state_callback(void* inst, HidStateCallback cb, void* context) { BleHidInstance* ble_hid = inst; furi_assert(ble_hid); ble_hid->state_callback = cb; ble_hid->callback_context = context; } bool hid_ble_is_connected(void* inst) { BleHidInstance* ble_hid = inst; furi_assert(ble_hid); return ble_hid->is_connected; } bool hid_ble_kb_press(void* inst, uint16_t button) { BleHidInstance* ble_hid = inst; furi_assert(ble_hid); return ble_profile_hid_kb_press(ble_hid->profile, button); } bool hid_ble_kb_release(void* inst, uint16_t button) { BleHidInstance* ble_hid = inst; furi_assert(ble_hid); return ble_profile_hid_kb_release(ble_hid->profile, button); } bool hid_ble_mouse_press(void* inst, uint8_t button) { BleHidInstance* ble_hid = inst; furi_assert(ble_hid); return ble_profile_hid_mouse_press(ble_hid->profile, button); } bool hid_ble_mouse_release(void* inst, uint8_t button) { BleHidInstance* ble_hid = inst; furi_assert(ble_hid); return ble_profile_hid_mouse_release(ble_hid->profile, button); } bool hid_ble_mouse_scroll(void* inst, int8_t delta) { BleHidInstance* ble_hid = inst; furi_assert(ble_hid); return ble_profile_hid_mouse_scroll(ble_hid->profile, delta); } bool hid_ble_mouse_move(void* inst, int8_t dx, int8_t dy) { BleHidInstance* ble_hid = inst; furi_assert(ble_hid); return ble_profile_hid_mouse_move(ble_hid->profile, dx, dy); } bool hid_ble_consumer_press(void* inst, uint16_t button) { BleHidInstance* ble_hid = inst; furi_assert(ble_hid); return ble_profile_hid_consumer_key_press(ble_hid->profile, button); } bool hid_ble_consumer_release(void* inst, uint16_t button) { BleHidInstance* ble_hid = inst; furi_assert(ble_hid); return ble_profile_hid_consumer_key_release(ble_hid->profile, button); } bool hid_ble_release_all(void* inst) { BleHidInstance* ble_hid = inst; furi_assert(ble_hid); bool state = ble_profile_hid_kb_release_all(ble_hid->profile); state &= ble_profile_hid_consumer_key_release_all(ble_hid->profile); state &= ble_profile_hid_mouse_release_all(ble_hid->profile); return state; } uint8_t hid_ble_get_led_state(void* inst) { UNUSED(inst); FURI_LOG_W(TAG, "hid_ble_get_led_state not implemented"); return 0; } static const BadUsbHidApi hid_api_ble = { .init = hid_ble_init, .deinit = hid_ble_deinit, .set_state_callback = hid_ble_set_state_callback, .is_connected = hid_ble_is_connected, .kb_press = hid_ble_kb_press, .kb_release = hid_ble_kb_release, .mouse_press = hid_ble_mouse_press, .mouse_release = hid_ble_mouse_release, .mouse_scroll = hid_ble_mouse_scroll, .mouse_move = hid_ble_mouse_move, .consumer_press = hid_ble_consumer_press, .consumer_release = hid_ble_consumer_release, .release_all = hid_ble_release_all, .get_led_state = hid_ble_get_led_state, }; const BadUsbHidApi* bad_usb_hid_get_interface(BadUsbHidInterface interface) { if(interface == BadUsbHidInterfaceUsb) { return &hid_api_usb; } else { return &hid_api_ble; } } void bad_usb_hid_ble_remove_pairing(void) { Bt* bt = furi_record_open(RECORD_BT); bt_disconnect(bt); // Wait 2nd core to update nvm storage furi_delay_ms(200); furi_hal_bt_stop_advertising(); bt_keys_storage_set_storage_path(bt, APP_DATA_PATH(HID_BT_KEYS_STORAGE_NAME)); bt_forget_bonded_devices(bt); // Wait 2nd core to update nvm storage furi_delay_ms(200); bt_keys_storage_set_default_path(bt); furi_check(bt_profile_restore_default(bt)); furi_record_close(RECORD_BT); } ================================================ FILE: applications/main/bad_usb/helpers/bad_usb_hid.h ================================================ #pragma once #ifdef __cplusplus extern "C" { #endif #include #include typedef enum { BadUsbHidInterfaceUsb, BadUsbHidInterfaceBle, } BadUsbHidInterface; typedef struct { void* (*init)(FuriHalUsbHidConfig* hid_cfg); void (*deinit)(void* inst); void (*set_state_callback)(void* inst, HidStateCallback cb, void* context); bool (*is_connected)(void* inst); bool (*kb_press)(void* inst, uint16_t button); bool (*kb_release)(void* inst, uint16_t button); bool (*mouse_press)(void* inst, uint8_t button); bool (*mouse_release)(void* inst, uint8_t button); bool (*mouse_scroll)(void* inst, int8_t delta); bool (*mouse_move)(void* inst, int8_t dx, int8_t dy); bool (*consumer_press)(void* inst, uint16_t button); bool (*consumer_release)(void* inst, uint16_t button); bool (*release_all)(void* inst); uint8_t (*get_led_state)(void* inst); } BadUsbHidApi; const BadUsbHidApi* bad_usb_hid_get_interface(BadUsbHidInterface interface); void bad_usb_hid_ble_remove_pairing(void); #ifdef __cplusplus } #endif ================================================ FILE: applications/main/bad_usb/helpers/ducky_script.c ================================================ #include #include #include #include #include #include #include #include "ducky_script.h" #include "ducky_script_i.h" #include #define TAG "BadUsb" #define WORKER_TAG TAG "Worker" #define BADUSB_ASCII_TO_KEY(script, x) \ (((uint8_t)x < 128) ? (script->layout[(uint8_t)x]) : HID_KEYBOARD_NONE) typedef enum { WorkerEvtStartStop = (1 << 0), WorkerEvtPauseResume = (1 << 1), WorkerEvtEnd = (1 << 2), WorkerEvtConnect = (1 << 3), WorkerEvtDisconnect = (1 << 4), } 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) { char* first_space = strchr(line, ' '); return first_space ? (first_space - line) : 0; } bool ducky_is_line_end(const char chr) { return (chr == ' ') || (chr == '\0') || (chr == '\r') || (chr == '\n'); } uint16_t ducky_get_keycode(BadUsbScript* bad_usb, const char* param, bool accept_modifiers) { uint16_t keycode = ducky_get_keycode_by_name(param); if(keycode != HID_KEYBOARD_NONE) { return keycode; } if(accept_modifiers) { uint16_t keycode = ducky_get_modifier_keycode_by_name(param); if(keycode != HID_KEYBOARD_NONE) { return keycode; } } if(strlen(param) > 0) { return BADUSB_ASCII_TO_KEY(bad_usb, param[0]) & 0xFF; } return 0; } bool ducky_get_number(const char* param, uint32_t* val) { uint32_t value = 0; if(strint_to_uint32(param, NULL, &value, 10) == StrintParseNoError) { *val = value; return true; } return false; } void ducky_numlock_on(BadUsbScript* bad_usb) { if((bad_usb->hid->get_led_state(bad_usb->hid_inst) & HID_KB_LED_NUM) == 0) { bad_usb->hid->kb_press(bad_usb->hid_inst, HID_KEYBOARD_LOCK_NUM_LOCK); bad_usb->hid->kb_release(bad_usb->hid_inst, HID_KEYBOARD_LOCK_NUM_LOCK); } } bool ducky_numpad_press(BadUsbScript* bad_usb, const char num) { if((num < '0') || (num > '9')) return false; uint16_t key = numpad_keys[num - '0']; bad_usb->hid->kb_press(bad_usb->hid_inst, key); bad_usb->hid->kb_release(bad_usb->hid_inst, key); return true; } bool ducky_altchar(BadUsbScript* bad_usb, const char* charcode) { uint8_t i = 0; bool state = false; bad_usb->hid->kb_press(bad_usb->hid_inst, KEY_MOD_LEFT_ALT); while(!ducky_is_line_end(charcode[i])) { state = ducky_numpad_press(bad_usb, charcode[i]); if(state == false) break; i++; } bad_usb->hid->kb_release(bad_usb->hid_inst, KEY_MOD_LEFT_ALT); return state; } bool ducky_altstring(BadUsbScript* bad_usb, const char* param) { uint32_t i = 0; bool state = false; while(param[i] != '\0') { if((param[i] < ' ') || (param[i] > '~')) { i++; continue; // Skip non-printable chars } char temp_str[4]; snprintf(temp_str, 4, "%u", param[i]); state = ducky_altchar(bad_usb, temp_str); if(state == false) break; i++; } return state; } int32_t ducky_error(BadUsbScript* bad_usb, const char* text, ...) { va_list args; va_start(args, text); vsnprintf(bad_usb->st.error, sizeof(bad_usb->st.error), text, args); va_end(args); return SCRIPT_STATE_ERROR; } bool ducky_string(BadUsbScript* bad_usb, const char* param) { uint32_t i = 0; while(param[i] != '\0') { if(param[i] != '\n') { uint16_t keycode = BADUSB_ASCII_TO_KEY(bad_usb, param[i]); if(keycode != HID_KEYBOARD_NONE) { bad_usb->hid->kb_press(bad_usb->hid_inst, keycode); bad_usb->hid->kb_release(bad_usb->hid_inst, keycode); } } else { bad_usb->hid->kb_press(bad_usb->hid_inst, HID_KEYBOARD_RETURN); bad_usb->hid->kb_release(bad_usb->hid_inst, HID_KEYBOARD_RETURN); } i++; } bad_usb->stringdelay = 0; return true; } static bool ducky_string_next(BadUsbScript* bad_usb) { if(bad_usb->string_print_pos >= furi_string_size(bad_usb->string_print)) { return true; } char print_char = furi_string_get_char(bad_usb->string_print, bad_usb->string_print_pos); if(print_char != '\n') { uint16_t keycode = BADUSB_ASCII_TO_KEY(bad_usb, print_char); if(keycode != HID_KEYBOARD_NONE) { bad_usb->hid->kb_press(bad_usb->hid_inst, keycode); bad_usb->hid->kb_release(bad_usb->hid_inst, keycode); } } else { bad_usb->hid->kb_press(bad_usb->hid_inst, HID_KEYBOARD_RETURN); bad_usb->hid->kb_release(bad_usb->hid_inst, HID_KEYBOARD_RETURN); } bad_usb->string_print_pos++; return false; } static int32_t ducky_parse_line(BadUsbScript* bad_usb, FuriString* line) { uint32_t line_len = furi_string_size(line); const char* line_cstr = furi_string_get_cstr(line); if(line_len == 0) { return SCRIPT_STATE_NEXT_LINE; // Skip empty lines } FURI_LOG_D(WORKER_TAG, "line:%s", line_cstr); // Ducky Lang Functions int32_t cmd_result = ducky_execute_cmd(bad_usb, line_cstr); if(cmd_result != SCRIPT_STATE_CMD_UNKNOWN) { return cmd_result; } // Mouse Keys uint16_t key = ducky_get_mouse_keycode_by_name(line_cstr); if(key != HID_MOUSE_INVALID) { bad_usb->hid->mouse_press(bad_usb->hid_inst, key); bad_usb->hid->mouse_release(bad_usb->hid_inst, key); return 0; } // Parse chain of modifiers linked by spaces and hyphens uint16_t modifiers = 0; while(1) { key = ducky_get_next_modifier_keycode_by_name(&line_cstr); if(key == HID_KEYBOARD_NONE) break; modifiers |= key; char next_char = *line_cstr; if(next_char == ' ' || next_char == '-') line_cstr++; } // Main key char next_char = *line_cstr; key = modifiers | ducky_get_keycode(bad_usb, line_cstr, false); if(key == 0 && next_char) ducky_error(bad_usb, "No keycode defined for %s", line_cstr); bad_usb->hid->kb_press(bad_usb->hid_inst, key); bad_usb->hid->kb_release(bad_usb->hid_inst, key); return 0; } static bool ducky_set_usb_id(BadUsbScript* bad_usb, const char* line) { if(sscanf(line, "%lX:%lX", &bad_usb->hid_cfg.vid, &bad_usb->hid_cfg.pid) == 2) { bad_usb->hid_cfg.manuf[0] = '\0'; bad_usb->hid_cfg.product[0] = '\0'; uint8_t id_len = ducky_get_command_len(line); if(!ducky_is_line_end(line[id_len + 1])) { sscanf( &line[id_len + 1], "%31[^\r\n:]:%31[^\r\n]", bad_usb->hid_cfg.manuf, bad_usb->hid_cfg.product); } FURI_LOG_D( WORKER_TAG, "set id: %04lX:%04lX mfr:%s product:%s", bad_usb->hid_cfg.vid, bad_usb->hid_cfg.pid, bad_usb->hid_cfg.manuf, bad_usb->hid_cfg.product); return true; } return false; } static void bad_usb_hid_state_callback(bool state, void* context) { furi_assert(context); BadUsbScript* bad_usb = context; if(state == true) { furi_thread_flags_set(furi_thread_get_id(bad_usb->thread), WorkerEvtConnect); } else { furi_thread_flags_set(furi_thread_get_id(bad_usb->thread), WorkerEvtDisconnect); } } static bool ducky_script_preload(BadUsbScript* bad_usb, File* script_file) { uint8_t ret = 0; uint32_t line_len = 0; furi_string_reset(bad_usb->line); do { ret = storage_file_read(script_file, bad_usb->file_buf, FILE_BUFFER_LEN); for(uint16_t i = 0; i < ret; i++) { if(bad_usb->file_buf[i] == '\n' && line_len > 0) { bad_usb->st.line_nb++; line_len = 0; } else { if(bad_usb->st.line_nb == 0) { // Save first line furi_string_push_back(bad_usb->line, bad_usb->file_buf[i]); } line_len++; } } if(storage_file_eof(script_file)) { if(line_len > 0) { bad_usb->st.line_nb++; break; } } } while(ret > 0); const char* line_tmp = furi_string_get_cstr(bad_usb->line); bool id_set = false; // Looking for ID command at first line if(strncmp(line_tmp, ducky_cmd_id, strlen(ducky_cmd_id)) == 0) { id_set = ducky_set_usb_id(bad_usb, &line_tmp[strlen(ducky_cmd_id) + 1]); } if(id_set) { bad_usb->hid_inst = bad_usb->hid->init(&bad_usb->hid_cfg); } else { bad_usb->hid_inst = bad_usb->hid->init(NULL); } bad_usb->hid->set_state_callback(bad_usb->hid_inst, bad_usb_hid_state_callback, bad_usb); storage_file_seek(script_file, 0, true); furi_string_reset(bad_usb->line); return true; } static int32_t ducky_script_execute_next(BadUsbScript* bad_usb, File* script_file) { int32_t delay_val = 0; if(bad_usb->repeat_cnt > 0) { bad_usb->repeat_cnt--; delay_val = ducky_parse_line(bad_usb, bad_usb->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_usb->st.error_line = bad_usb->st.line_cur - 1; FURI_LOG_E(WORKER_TAG, "Unknown command at line %zu", bad_usb->st.line_cur - 1U); return SCRIPT_STATE_ERROR; } else { return delay_val + bad_usb->defdelay; } } furi_string_set(bad_usb->line_prev, bad_usb->line); furi_string_reset(bad_usb->line); while(1) { if(bad_usb->buf_len == 0) { bad_usb->buf_len = storage_file_read(script_file, bad_usb->file_buf, FILE_BUFFER_LEN); if(storage_file_eof(script_file)) { if((bad_usb->buf_len < FILE_BUFFER_LEN) && (bad_usb->file_end == false)) { bad_usb->file_buf[bad_usb->buf_len] = '\n'; bad_usb->buf_len++; bad_usb->file_end = true; } } bad_usb->buf_start = 0; if(bad_usb->buf_len == 0) return SCRIPT_STATE_END; } for(uint8_t i = bad_usb->buf_start; i < (bad_usb->buf_start + bad_usb->buf_len); i++) { if(bad_usb->file_buf[i] == '\n' && furi_string_size(bad_usb->line) > 0) { bad_usb->st.line_cur++; bad_usb->buf_len = bad_usb->buf_len + bad_usb->buf_start - (i + 1); bad_usb->buf_start = i + 1; furi_string_trim(bad_usb->line); delay_val = ducky_parse_line(bad_usb, bad_usb->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_usb->st.error_line = bad_usb->st.line_cur; FURI_LOG_E(WORKER_TAG, "Unknown command at line %zu", bad_usb->st.line_cur); return SCRIPT_STATE_ERROR; } else { return delay_val + bad_usb->defdelay; } } else { furi_string_push_back(bad_usb->line, bad_usb->file_buf[i]); } } bad_usb->buf_len = 0; if(bad_usb->file_end) return SCRIPT_STATE_END; } return 0; } static uint32_t bad_usb_flags_get(uint32_t flags_mask, uint32_t timeout) { uint32_t flags = furi_thread_flags_get(); furi_check((flags & FuriFlagError) == 0); if(flags == 0) { flags = furi_thread_flags_wait(flags_mask, FuriFlagWaitAny, timeout); furi_check(((flags & FuriFlagError) == 0) || (flags == (unsigned)FuriFlagErrorTimeout)); } else { uint32_t state = furi_thread_flags_clear(flags); furi_check((state & FuriFlagError) == 0); } return flags; } static int32_t bad_usb_worker(void* context) { BadUsbScript* bad_usb = context; BadUsbWorkerState worker_state = BadUsbStateInit; BadUsbWorkerState pause_state = BadUsbStateRunning; int32_t delay_val = 0; FURI_LOG_I(WORKER_TAG, "Init"); File* script_file = storage_file_alloc(furi_record_open(RECORD_STORAGE)); bad_usb->line = furi_string_alloc(); bad_usb->line_prev = furi_string_alloc(); bad_usb->string_print = furi_string_alloc(); while(1) { if(worker_state == BadUsbStateInit) { // State: initialization if(storage_file_open( script_file, furi_string_get_cstr(bad_usb->file_path), FSAM_READ, FSOM_OPEN_EXISTING)) { if((ducky_script_preload(bad_usb, script_file)) && (bad_usb->st.line_nb > 0)) { if(bad_usb->hid->is_connected(bad_usb->hid_inst)) { worker_state = BadUsbStateIdle; // Ready to run } else { worker_state = BadUsbStateNotConnected; // USB not connected } } else { worker_state = BadUsbStateScriptError; // Script preload error } } else { FURI_LOG_E(WORKER_TAG, "File open error"); worker_state = BadUsbStateFileError; // File open error } bad_usb->st.state = worker_state; } else if(worker_state == BadUsbStateNotConnected) { // State: USB not connected uint32_t flags = bad_usb_flags_get( WorkerEvtEnd | WorkerEvtConnect | WorkerEvtDisconnect | WorkerEvtStartStop, FuriWaitForever); if(flags & WorkerEvtEnd) { break; } else if(flags & WorkerEvtConnect) { worker_state = BadUsbStateIdle; // Ready to run } else if(flags & WorkerEvtStartStop) { worker_state = BadUsbStateWillRun; // Will run when USB is connected } bad_usb->st.state = worker_state; } else if(worker_state == BadUsbStateIdle) { // State: ready to start uint32_t flags = bad_usb_flags_get( WorkerEvtEnd | WorkerEvtStartStop | WorkerEvtDisconnect, FuriWaitForever); if(flags & WorkerEvtEnd) { break; } else if(flags & WorkerEvtStartStop) { // Start executing script dolphin_deed(DolphinDeedBadUsbPlayScript); delay_val = 0; bad_usb->buf_len = 0; bad_usb->st.line_cur = 0; bad_usb->defdelay = 0; bad_usb->stringdelay = 0; bad_usb->defstringdelay = 0; bad_usb->repeat_cnt = 0; bad_usb->key_hold_nb = 0; bad_usb->file_end = false; storage_file_seek(script_file, 0, true); worker_state = BadUsbStateRunning; } else if(flags & WorkerEvtDisconnect) { worker_state = BadUsbStateNotConnected; // USB disconnected } bad_usb->st.state = worker_state; } else if(worker_state == BadUsbStateWillRun) { // State: start on connection uint32_t flags = bad_usb_flags_get( WorkerEvtEnd | WorkerEvtConnect | WorkerEvtStartStop, FuriWaitForever); if(flags & WorkerEvtEnd) { break; } else if(flags & WorkerEvtConnect) { // Start executing script dolphin_deed(DolphinDeedBadUsbPlayScript); delay_val = 0; bad_usb->buf_len = 0; bad_usb->st.line_cur = 0; bad_usb->defdelay = 0; bad_usb->stringdelay = 0; bad_usb->defstringdelay = 0; bad_usb->repeat_cnt = 0; bad_usb->file_end = false; storage_file_seek(script_file, 0, true); // extra time for PC to recognize Flipper as keyboard flags = furi_thread_flags_wait( WorkerEvtEnd | WorkerEvtDisconnect | WorkerEvtStartStop, FuriFlagWaitAny | FuriFlagNoClear, 1500); if(flags == (unsigned)FuriFlagErrorTimeout) { // If nothing happened - start script execution worker_state = BadUsbStateRunning; } else if(flags & WorkerEvtStartStop) { worker_state = BadUsbStateIdle; furi_thread_flags_clear(WorkerEvtStartStop); } } else if(flags & WorkerEvtStartStop) { // Cancel scheduled execution worker_state = BadUsbStateNotConnected; } bad_usb->st.state = worker_state; } else if(worker_state == BadUsbStateRunning) { // State: running uint16_t delay_cur = (delay_val > 1000) ? (1000) : (delay_val); uint32_t flags = furi_thread_flags_wait( WorkerEvtEnd | WorkerEvtStartStop | WorkerEvtPauseResume | WorkerEvtDisconnect, FuriFlagWaitAny, delay_cur); delay_val -= delay_cur; if(!(flags & FuriFlagError)) { if(flags & WorkerEvtEnd) { break; } else if(flags & WorkerEvtStartStop) { worker_state = BadUsbStateIdle; // Stop executing script bad_usb->hid->release_all(bad_usb->hid_inst); } else if(flags & WorkerEvtDisconnect) { worker_state = BadUsbStateNotConnected; // USB disconnected bad_usb->hid->release_all(bad_usb->hid_inst); } else if(flags & WorkerEvtPauseResume) { pause_state = BadUsbStateRunning; worker_state = BadUsbStatePaused; // Pause } bad_usb->st.state = worker_state; continue; } else if( (flags == (unsigned)FuriFlagErrorTimeout) || (flags == (unsigned)FuriFlagErrorResource)) { if(delay_val > 0) { bad_usb->st.delay_remain--; continue; } bad_usb->st.state = BadUsbStateRunning; delay_val = ducky_script_execute_next(bad_usb, script_file); if(delay_val == SCRIPT_STATE_ERROR) { // Script error delay_val = 0; worker_state = BadUsbStateScriptError; bad_usb->st.state = worker_state; bad_usb->hid->release_all(bad_usb->hid_inst); } else if(delay_val == SCRIPT_STATE_END) { // End of script delay_val = 0; worker_state = BadUsbStateIdle; bad_usb->st.state = BadUsbStateDone; bad_usb->hid->release_all(bad_usb->hid_inst); continue; } else if(delay_val == SCRIPT_STATE_STRING_START) { // Start printing string with delays delay_val = bad_usb->defdelay; bad_usb->string_print_pos = 0; worker_state = BadUsbStateStringDelay; } else if(delay_val == SCRIPT_STATE_WAIT_FOR_BTN) { // set state to wait for user input worker_state = BadUsbStateWaitForBtn; bad_usb->st.state = BadUsbStateWaitForBtn; // Show long delays } else if(delay_val > 1000) { bad_usb->st.state = BadUsbStateDelay; // Show long delays bad_usb->st.delay_remain = delay_val / 1000; } } else { furi_check((flags & FuriFlagError) == 0); } } else if(worker_state == BadUsbStateWaitForBtn) { // State: Wait for button Press uint32_t flags = bad_usb_flags_get( WorkerEvtEnd | WorkerEvtStartStop | WorkerEvtPauseResume | WorkerEvtDisconnect, FuriWaitForever); if(!(flags & FuriFlagError)) { if(flags & WorkerEvtEnd) { break; } else if(flags & WorkerEvtStartStop) { delay_val = 0; worker_state = BadUsbStateRunning; } else if(flags & WorkerEvtDisconnect) { worker_state = BadUsbStateNotConnected; // USB disconnected bad_usb->hid->release_all(bad_usb->hid_inst); } bad_usb->st.state = worker_state; continue; } } else if(worker_state == BadUsbStatePaused) { // State: Paused uint32_t flags = bad_usb_flags_get( WorkerEvtEnd | WorkerEvtStartStop | WorkerEvtPauseResume | WorkerEvtDisconnect, FuriWaitForever); if(!(flags & FuriFlagError)) { if(flags & WorkerEvtEnd) { break; } else if(flags & WorkerEvtStartStop) { worker_state = BadUsbStateIdle; // Stop executing script bad_usb->st.state = worker_state; bad_usb->hid->release_all(bad_usb->hid_inst); } else if(flags & WorkerEvtDisconnect) { worker_state = BadUsbStateNotConnected; // USB disconnected bad_usb->st.state = worker_state; bad_usb->hid->release_all(bad_usb->hid_inst); } else if(flags & WorkerEvtPauseResume) { if(pause_state == BadUsbStateRunning) { if(delay_val > 0) { bad_usb->st.state = BadUsbStateDelay; bad_usb->st.delay_remain = delay_val / 1000; } else { bad_usb->st.state = BadUsbStateRunning; delay_val = 0; } worker_state = BadUsbStateRunning; // Resume } else if(pause_state == BadUsbStateStringDelay) { bad_usb->st.state = BadUsbStateRunning; worker_state = BadUsbStateStringDelay; // Resume } } continue; } } else if(worker_state == BadUsbStateStringDelay) { // State: print string with delays uint32_t delay = (bad_usb->stringdelay == 0) ? bad_usb->defstringdelay : bad_usb->stringdelay; uint32_t flags = bad_usb_flags_get( WorkerEvtEnd | WorkerEvtStartStop | WorkerEvtPauseResume | WorkerEvtDisconnect, delay); if(!(flags & FuriFlagError)) { if(flags & WorkerEvtEnd) { break; } else if(flags & WorkerEvtStartStop) { worker_state = BadUsbStateIdle; // Stop executing script bad_usb->hid->release_all(bad_usb->hid_inst); } else if(flags & WorkerEvtDisconnect) { worker_state = BadUsbStateNotConnected; // USB disconnected bad_usb->hid->release_all(bad_usb->hid_inst); } else if(flags & WorkerEvtPauseResume) { pause_state = BadUsbStateStringDelay; worker_state = BadUsbStatePaused; // Pause } bad_usb->st.state = worker_state; continue; } else if( (flags == (unsigned)FuriFlagErrorTimeout) || (flags == (unsigned)FuriFlagErrorResource)) { bool string_end = ducky_string_next(bad_usb); if(string_end) { bad_usb->stringdelay = 0; worker_state = BadUsbStateRunning; } } else { furi_check((flags & FuriFlagError) == 0); } } else if( (worker_state == BadUsbStateFileError) || (worker_state == BadUsbStateScriptError)) { // State: error uint32_t flags = bad_usb_flags_get(WorkerEvtEnd, FuriWaitForever); // Waiting for exit command if(flags & WorkerEvtEnd) { break; } } } bad_usb->hid->set_state_callback(bad_usb->hid_inst, NULL, NULL); bad_usb->hid->deinit(bad_usb->hid_inst); storage_file_close(script_file); storage_file_free(script_file); furi_string_free(bad_usb->line); furi_string_free(bad_usb->line_prev); furi_string_free(bad_usb->string_print); FURI_LOG_I(WORKER_TAG, "End"); return 0; } static void bad_usb_script_set_default_keyboard_layout(BadUsbScript* bad_usb) { furi_assert(bad_usb); memset(bad_usb->layout, HID_KEYBOARD_NONE, sizeof(bad_usb->layout)); memcpy(bad_usb->layout, hid_asciimap, MIN(sizeof(hid_asciimap), sizeof(bad_usb->layout))); } BadUsbScript* bad_usb_script_open(FuriString* file_path, BadUsbHidInterface interface) { furi_assert(file_path); BadUsbScript* bad_usb = malloc(sizeof(BadUsbScript)); bad_usb->file_path = furi_string_alloc(); furi_string_set(bad_usb->file_path, file_path); bad_usb_script_set_default_keyboard_layout(bad_usb); bad_usb->st.state = BadUsbStateInit; bad_usb->st.error[0] = '\0'; bad_usb->hid = bad_usb_hid_get_interface(interface); bad_usb->thread = furi_thread_alloc_ex("BadUsbWorker", 2048, bad_usb_worker, bad_usb); furi_thread_start(bad_usb->thread); return bad_usb; } //-V773 void bad_usb_script_close(BadUsbScript* bad_usb) { furi_assert(bad_usb); furi_thread_flags_set(furi_thread_get_id(bad_usb->thread), WorkerEvtEnd); furi_thread_join(bad_usb->thread); furi_thread_free(bad_usb->thread); furi_string_free(bad_usb->file_path); free(bad_usb); } void bad_usb_script_set_keyboard_layout(BadUsbScript* bad_usb, FuriString* layout_path) { furi_assert(bad_usb); if((bad_usb->st.state == BadUsbStateRunning) || (bad_usb->st.state == BadUsbStateDelay)) { // do not update keyboard layout while a script is running return; } File* layout_file = storage_file_alloc(furi_record_open(RECORD_STORAGE)); if(!furi_string_empty(layout_path)) { //-V1051 if(storage_file_open( layout_file, furi_string_get_cstr(layout_path), FSAM_READ, FSOM_OPEN_EXISTING)) { uint16_t layout[128]; if(storage_file_read(layout_file, layout, sizeof(layout)) == sizeof(layout)) { memcpy(bad_usb->layout, layout, sizeof(layout)); } } storage_file_close(layout_file); } else { bad_usb_script_set_default_keyboard_layout(bad_usb); } storage_file_free(layout_file); } void bad_usb_script_start_stop(BadUsbScript* bad_usb) { furi_assert(bad_usb); furi_thread_flags_set(furi_thread_get_id(bad_usb->thread), WorkerEvtStartStop); } void bad_usb_script_pause_resume(BadUsbScript* bad_usb) { furi_assert(bad_usb); furi_thread_flags_set(furi_thread_get_id(bad_usb->thread), WorkerEvtPauseResume); } BadUsbState* bad_usb_script_get_state(BadUsbScript* bad_usb) { furi_assert(bad_usb); return &(bad_usb->st); } ================================================ FILE: applications/main/bad_usb/helpers/ducky_script.h ================================================ #pragma once #ifdef __cplusplus extern "C" { #endif #include #include #include "bad_usb_hid.h" typedef enum { BadUsbStateInit, BadUsbStateNotConnected, BadUsbStateIdle, BadUsbStateWillRun, BadUsbStateRunning, BadUsbStateDelay, BadUsbStateStringDelay, BadUsbStateWaitForBtn, BadUsbStatePaused, BadUsbStateDone, BadUsbStateScriptError, BadUsbStateFileError, } BadUsbWorkerState; typedef struct { BadUsbWorkerState state; size_t line_cur; size_t line_nb; uint32_t delay_remain; size_t error_line; char error[64]; } BadUsbState; typedef struct BadUsbScript BadUsbScript; BadUsbScript* bad_usb_script_open(FuriString* file_path, BadUsbHidInterface interface); void bad_usb_script_close(BadUsbScript* bad_usb); void bad_usb_script_set_keyboard_layout(BadUsbScript* bad_usb, FuriString* layout_path); void bad_usb_script_start(BadUsbScript* bad_usb); void bad_usb_script_stop(BadUsbScript* bad_usb); void bad_usb_script_start_stop(BadUsbScript* bad_usb); void bad_usb_script_pause_resume(BadUsbScript* bad_usb); BadUsbState* bad_usb_script_get_state(BadUsbScript* bad_usb); #ifdef __cplusplus } #endif ================================================ FILE: applications/main/bad_usb/helpers/ducky_script_commands.c ================================================ #include #include #include "ducky_script.h" #include "ducky_script_i.h" typedef int32_t (*DuckyCmdCallback)(BadUsbScript* bad_usb, const char* line, int32_t param); typedef struct { char* name; DuckyCmdCallback callback; int32_t param; } DuckyCmd; static int32_t ducky_fnc_delay(BadUsbScript* bad_usb, 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_usb, "Invalid number %s", line); } static int32_t ducky_fnc_defdelay(BadUsbScript* bad_usb, const char* line, int32_t param) { UNUSED(param); line = &line[ducky_get_command_len(line) + 1]; bool state = ducky_get_number(line, &bad_usb->defdelay); if(!state) { return ducky_error(bad_usb, "Invalid number %s", line); } return 0; } static int32_t ducky_fnc_strdelay(BadUsbScript* bad_usb, const char* line, int32_t param) { UNUSED(param); line = &line[ducky_get_command_len(line) + 1]; bool state = ducky_get_number(line, &bad_usb->stringdelay); if(!state) { return ducky_error(bad_usb, "Invalid number %s", line); } return 0; } static int32_t ducky_fnc_defstrdelay(BadUsbScript* bad_usb, const char* line, int32_t param) { UNUSED(param); line = &line[ducky_get_command_len(line) + 1]; bool state = ducky_get_number(line, &bad_usb->defstringdelay); if(!state) { return ducky_error(bad_usb, "Invalid number %s", line); } return 0; } static int32_t ducky_fnc_string(BadUsbScript* bad_usb, const char* line, int32_t param) { line = &line[ducky_get_command_len(line) + 1]; furi_string_set_str(bad_usb->string_print, line); if(param == 1) { furi_string_cat(bad_usb->string_print, "\n"); } if(bad_usb->stringdelay == 0 && bad_usb->defstringdelay == 0) { // stringdelay not set - run command immediately bool state = ducky_string(bad_usb, furi_string_get_cstr(bad_usb->string_print)); if(!state) { return ducky_error(bad_usb, "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(BadUsbScript* bad_usb, const char* line, int32_t param) { UNUSED(param); line = &line[ducky_get_command_len(line) + 1]; bool state = ducky_get_number(line, &bad_usb->repeat_cnt); if((!state) || (bad_usb->repeat_cnt == 0)) { return ducky_error(bad_usb, "Invalid number %s", line); } return 0; } static int32_t ducky_fnc_sysrq(BadUsbScript* bad_usb, const char* line, int32_t param) { UNUSED(param); line = &line[ducky_get_command_len(line) + 1]; uint16_t key = ducky_get_keycode(bad_usb, line, false); bad_usb->hid->kb_press(bad_usb->hid_inst, KEY_MOD_LEFT_ALT | HID_KEYBOARD_PRINT_SCREEN); bad_usb->hid->kb_press(bad_usb->hid_inst, key); bad_usb->hid->release_all(bad_usb->hid_inst); return 0; } static int32_t ducky_fnc_altchar(BadUsbScript* bad_usb, const char* line, int32_t param) { UNUSED(param); line = &line[ducky_get_command_len(line) + 1]; ducky_numlock_on(bad_usb); bool state = ducky_altchar(bad_usb, line); if(!state) { return ducky_error(bad_usb, "Invalid altchar %s", line); } return 0; } static int32_t ducky_fnc_altstring(BadUsbScript* bad_usb, const char* line, int32_t param) { UNUSED(param); line = &line[ducky_get_command_len(line) + 1]; ducky_numlock_on(bad_usb); bool state = ducky_altstring(bad_usb, line); if(!state) { return ducky_error(bad_usb, "Invalid altstring %s", line); } return 0; } static int32_t ducky_fnc_hold(BadUsbScript* bad_usb, const char* line, int32_t param) { UNUSED(param); line = &line[ducky_get_command_len(line) + 1]; if(bad_usb->key_hold_nb > (HID_KB_MAX_KEYS - 1)) { return ducky_error(bad_usb, "Too many keys are held"); } // Handle Mouse Keys here uint16_t key = ducky_get_mouse_keycode_by_name(line); if(key != HID_MOUSE_NONE) { bad_usb->key_hold_nb++; bad_usb->hid->mouse_press(bad_usb->hid_inst, key); return 0; } // Handle Keyboard keys here key = ducky_get_keycode(bad_usb, line, true); if(key != HID_KEYBOARD_NONE) { bad_usb->key_hold_nb++; bad_usb->hid->kb_press(bad_usb->hid_inst, key); return 0; } // keyboard and mouse were none return ducky_error(bad_usb, "Unknown keycode for %s", line); } static int32_t ducky_fnc_release(BadUsbScript* bad_usb, const char* line, int32_t param) { UNUSED(param); line = &line[ducky_get_command_len(line) + 1]; if(bad_usb->key_hold_nb == 0) { return ducky_error(bad_usb, "No keys are held"); } // Handle Mouse Keys here uint16_t key = ducky_get_mouse_keycode_by_name(line); if(key != HID_MOUSE_NONE) { bad_usb->key_hold_nb--; bad_usb->hid->mouse_release(bad_usb->hid_inst, key); return 0; } //Handle Keyboard Keys here key = ducky_get_keycode(bad_usb, line, true); if(key != HID_KEYBOARD_NONE) { bad_usb->key_hold_nb--; bad_usb->hid->kb_release(bad_usb->hid_inst, key); return 0; } // keyboard and mouse were none return ducky_error(bad_usb, "No keycode defined for %s", line); } static int32_t ducky_fnc_media(BadUsbScript* bad_usb, const char* line, int32_t param) { UNUSED(param); line = &line[ducky_get_command_len(line) + 1]; uint16_t key = ducky_get_media_keycode_by_name(line); if(key == HID_CONSUMER_UNASSIGNED) { return ducky_error(bad_usb, "No keycode defined for %s", line); } bad_usb->hid->consumer_press(bad_usb->hid_inst, key); bad_usb->hid->consumer_release(bad_usb->hid_inst, key); return 0; } static int32_t ducky_fnc_globe(BadUsbScript* bad_usb, const char* line, int32_t param) { UNUSED(param); line = &line[ducky_get_command_len(line) + 1]; uint16_t key = ducky_get_keycode(bad_usb, line, false); if(key == HID_KEYBOARD_NONE) { return ducky_error(bad_usb, "No keycode defined for %s", line); } bad_usb->hid->consumer_press(bad_usb->hid_inst, HID_CONSUMER_FN_GLOBE); bad_usb->hid->kb_press(bad_usb->hid_inst, key); bad_usb->hid->kb_release(bad_usb->hid_inst, key); bad_usb->hid->consumer_release(bad_usb->hid_inst, HID_CONSUMER_FN_GLOBE); return 0; } static int32_t ducky_fnc_waitforbutton(BadUsbScript* bad_usb, const char* line, int32_t param) { UNUSED(param); UNUSED(bad_usb); UNUSED(line); return SCRIPT_STATE_WAIT_FOR_BTN; } static int32_t ducky_fnc_mouse_scroll(BadUsbScript* bad_usb, const char* line, int32_t param) { UNUSED(param); line = &line[strcspn(line, " ") + 1]; int32_t mouse_scroll_dist = 0; if(strint_to_int32(line, NULL, &mouse_scroll_dist, 10) != StrintParseNoError) { return ducky_error(bad_usb, "Invalid Number %s", line); } bad_usb->hid->mouse_scroll(bad_usb->hid_inst, mouse_scroll_dist); return 0; } static int32_t ducky_fnc_mouse_move(BadUsbScript* bad_usb, const char* line, int32_t param) { UNUSED(param); line = &line[strcspn(line, " ") + 1]; int32_t mouse_move_x = 0; int32_t mouse_move_y = 0; if(strint_to_int32(line, NULL, &mouse_move_x, 10) != StrintParseNoError) { return ducky_error(bad_usb, "Invalid Number %s", line); } line = &line[strcspn(line, " ") + 1]; if(strint_to_int32(line, NULL, &mouse_move_y, 10) != StrintParseNoError) { return ducky_error(bad_usb, "Invalid Number %s", line); } bad_usb->hid->mouse_move(bad_usb->hid_inst, mouse_move_x, mouse_move_y); return 0; } 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}, {"DEFAULT_STRING_DELAY", ducky_fnc_defstrdelay, -1}, {"DEFAULTSTRINGDELAY", ducky_fnc_defstrdelay, -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}, {"MEDIA", ducky_fnc_media, -1}, {"GLOBE", ducky_fnc_globe, -1}, {"MOUSEMOVE", ducky_fnc_mouse_move, -1}, {"MOUSE_MOVE", ducky_fnc_mouse_move, -1}, {"MOUSESCROLL", ducky_fnc_mouse_scroll, -1}, {"MOUSE_SCROLL", ducky_fnc_mouse_scroll, -1}, }; #define TAG "BadUsb" #define WORKER_TAG TAG "Worker" int32_t ducky_execute_cmd(BadUsbScript* bad_usb, const char* line) { size_t cmd_word_len = strcspn(line, " "); for(size_t i = 0; i < COUNT_OF(ducky_commands); i++) { size_t cmd_compare_len = strlen(ducky_commands[i].name); if(cmd_compare_len != cmd_word_len) { continue; } if(strncmp(line, ducky_commands[i].name, cmd_compare_len) == 0) { if(ducky_commands[i].callback == NULL) { return 0; } else { return (ducky_commands[i].callback)(bad_usb, line, ducky_commands[i].param); } } } return SCRIPT_STATE_CMD_UNKNOWN; } ================================================ FILE: applications/main/bad_usb/helpers/ducky_script_i.h ================================================ #pragma once #ifdef __cplusplus extern "C" { #endif #include #include #include "ducky_script.h" #include "bad_usb_hid.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) #define FILE_BUFFER_LEN 16 #define HID_MOUSE_INVALID 0 #define HID_MOUSE_NONE 0 struct BadUsbScript { FuriHalUsbHidConfig hid_cfg; const BadUsbHidApi* hid; void* hid_inst; FuriThread* thread; BadUsbState st; FuriString* file_path; uint8_t file_buf[FILE_BUFFER_LEN + 1]; uint8_t buf_start; uint8_t buf_len; bool file_end; uint32_t defdelay; uint32_t stringdelay; uint32_t defstringdelay; uint16_t layout[128]; FuriString* line; FuriString* line_prev; uint32_t repeat_cnt; uint8_t key_hold_nb; FuriString* string_print; size_t string_print_pos; }; uint16_t ducky_get_keycode(BadUsbScript* bad_usb, const char* param, bool accept_modifiers); uint32_t ducky_get_command_len(const char* line); bool ducky_is_line_end(const char chr); uint16_t ducky_get_next_modifier_keycode_by_name(const char** param); uint16_t ducky_get_modifier_keycode_by_name(const char* param); uint16_t ducky_get_keycode_by_name(const char* param); uint16_t ducky_get_media_keycode_by_name(const char* param); uint8_t ducky_get_mouse_keycode_by_name(const char* param); bool ducky_get_number(const char* param, uint32_t* val); void ducky_numlock_on(BadUsbScript* bad_usb); bool ducky_numpad_press(BadUsbScript* bad_usb, const char num); bool ducky_altchar(BadUsbScript* bad_usb, const char* charcode); bool ducky_altstring(BadUsbScript* bad_usb, const char* param); bool ducky_string(BadUsbScript* bad_usb, const char* param); int32_t ducky_execute_cmd(BadUsbScript* bad_usb, const char* line); int32_t ducky_error(BadUsbScript* bad_usb, const char* text, ...); #ifdef __cplusplus } #endif ================================================ FILE: applications/main/bad_usb/helpers/ducky_script_keycodes.c ================================================ #include #include "ducky_script_i.h" typedef struct { char* name; uint16_t keycode; } DuckyKey; static const DuckyKey ducky_modifier_keys[] = { {"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}, }; static const DuckyKey ducky_keys[] = { {"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}, {"F13", HID_KEYBOARD_F13}, {"F14", HID_KEYBOARD_F14}, {"F15", HID_KEYBOARD_F15}, {"F16", HID_KEYBOARD_F16}, {"F17", HID_KEYBOARD_F17}, {"F18", HID_KEYBOARD_F18}, {"F19", HID_KEYBOARD_F19}, {"F20", HID_KEYBOARD_F20}, {"F21", HID_KEYBOARD_F21}, {"F22", HID_KEYBOARD_F22}, {"F23", HID_KEYBOARD_F23}, {"F24", HID_KEYBOARD_F24}, }; static const DuckyKey ducky_media_keys[] = { {"POWER", HID_CONSUMER_POWER}, {"REBOOT", HID_CONSUMER_RESET}, {"SLEEP", HID_CONSUMER_SLEEP}, {"LOGOFF", HID_CONSUMER_AL_LOGOFF}, {"EXIT", HID_CONSUMER_AC_EXIT}, {"HOME", HID_CONSUMER_AC_HOME}, {"BACK", HID_CONSUMER_AC_BACK}, {"FORWARD", HID_CONSUMER_AC_FORWARD}, {"REFRESH", HID_CONSUMER_AC_REFRESH}, {"SNAPSHOT", HID_CONSUMER_SNAPSHOT}, {"PLAY", HID_CONSUMER_PLAY}, {"PAUSE", HID_CONSUMER_PAUSE}, {"PLAY_PAUSE", HID_CONSUMER_PLAY_PAUSE}, {"NEXT_TRACK", HID_CONSUMER_SCAN_NEXT_TRACK}, {"PREV_TRACK", HID_CONSUMER_SCAN_PREVIOUS_TRACK}, {"STOP", HID_CONSUMER_STOP}, {"EJECT", HID_CONSUMER_EJECT}, {"MUTE", HID_CONSUMER_MUTE}, {"VOLUME_UP", HID_CONSUMER_VOLUME_INCREMENT}, {"VOLUME_DOWN", HID_CONSUMER_VOLUME_DECREMENT}, {"FN", HID_CONSUMER_FN_GLOBE}, {"BRIGHT_UP", HID_CONSUMER_BRIGHTNESS_INCREMENT}, {"BRIGHT_DOWN", HID_CONSUMER_BRIGHTNESS_DECREMENT}, }; static const DuckyKey ducky_mouse_keys[] = { {"LEFTCLICK", HID_MOUSE_BTN_LEFT}, {"LEFT_CLICK", HID_MOUSE_BTN_LEFT}, {"RIGHTCLICK", HID_MOUSE_BTN_RIGHT}, {"RIGHT_CLICK", HID_MOUSE_BTN_RIGHT}, {"MIDDLECLICK", HID_MOUSE_BTN_WHEEL}, {"MIDDLE_CLICK", HID_MOUSE_BTN_WHEEL}, {"WHEELCLICK", HID_MOUSE_BTN_WHEEL}, {"WHEEL_CLICK", HID_MOUSE_BTN_WHEEL}, }; uint16_t ducky_get_next_modifier_keycode_by_name(const char** param) { const char* input_str = *param; for(size_t i = 0; i < COUNT_OF(ducky_modifier_keys); i++) { size_t key_cmd_len = strlen(ducky_modifier_keys[i].name); if((strncmp(input_str, ducky_modifier_keys[i].name, key_cmd_len) == 0)) { char next_char_after_key = input_str[key_cmd_len]; if(ducky_is_line_end(next_char_after_key) || (next_char_after_key == '-')) { *param = &input_str[key_cmd_len]; return ducky_modifier_keys[i].keycode; } } } return HID_KEYBOARD_NONE; } uint16_t ducky_get_modifier_keycode_by_name(const char* param) { for(size_t i = 0; i < COUNT_OF(ducky_modifier_keys); i++) { size_t key_cmd_len = strlen(ducky_modifier_keys[i].name); if((strncmp(param, ducky_modifier_keys[i].name, key_cmd_len) == 0) && (ducky_is_line_end(param[key_cmd_len]))) { return ducky_modifier_keys[i].keycode; } } return HID_KEYBOARD_NONE; } 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; } uint16_t ducky_get_media_keycode_by_name(const char* param) { for(size_t i = 0; i < COUNT_OF(ducky_media_keys); i++) { size_t key_cmd_len = strlen(ducky_media_keys[i].name); if((strncmp(param, ducky_media_keys[i].name, key_cmd_len) == 0) && (ducky_is_line_end(param[key_cmd_len]))) { return ducky_media_keys[i].keycode; } } return HID_CONSUMER_UNASSIGNED; } uint8_t ducky_get_mouse_keycode_by_name(const char* param) { for(size_t i = 0; i < COUNT_OF(ducky_mouse_keys); i++) { size_t key_cmd_len = strlen(ducky_mouse_keys[i].name); if((strncmp(param, ducky_mouse_keys[i].name, key_cmd_len) == 0) && (ducky_is_line_end(param[key_cmd_len]))) { return ducky_mouse_keys[i].keycode; } } return HID_MOUSE_INVALID; } ================================================ FILE: applications/main/bad_usb/resources/badusb/Install_qFlipper_gnome.txt ================================================ ID 1234:abcd Generic:USB Keyboard REM Declare ourselves as a generic usb keyboard REM This will install qFlipper on Linux/Gnome, using the latest AppImage package REM Open a terminal ALT F2 DELAY 1000 STRINGLN gnome-terminal --maximize DELAY 1000 REM Ensure we have a folder to run executables from STRINGLN mkdir -p $HOME/.local/bin REM Download the latest AppImage STRINGLN curl -fsSL "https://update.flipperzero.one/qFlipper/release/linux-amd64/AppImage" -o "$HOME/.local/bin/qFlipper" DELAY 1000 REM Make it executable STRINGLN chmod +x $HOME/.local/bin/qFlipper REM Extract the appimage in /tmp to install icon and .desktop file STRINGLN cd /tmp STRINGLN $HOME/.local/bin/qFlipper --appimage-extract > /dev/null STRINGLN sed "s@Exec=qFlipper@Exec=$HOME/.local/bin/qFlipper@" squashfs-root/usr/share/applications/qFlipper.desktop > $HOME/.local/share/applications/qFlipper.desktop STRINGLN mkdir -p $HOME/.local/share/icons/hicolor/512x512/apps STRINGLN cp squashfs-root/usr/share/icons/hicolor/512x512/apps/qFlipper.png $HOME/.local/share/icons/hicolor/512x512/apps/qFlipper.png STRINGLN rm -rf squashfs-root STRINGLN cd REM Depending on the Linux distribution and display manager REM there might be several ways to update desktop entries REM try all STRINGLN xdg-desktop-menu forceupdate || true STRINGLN update-desktop-database ~/.local/share/applications || true STRINGLN echo " ENTER REPEAT 60 STRINGLN ========================================================================================== STRINGLN qFlipper has been installed to $HOME/.local/bin/ STRINGLN It should appear in your Applications menu. STRINGLN If it does not, you might want to log out and log in again. ENTER STRINGLN If you prefer to run qFlipper from your terminal, either use the absolute path STRINGLN or make sure $HOME/.local/bin/ is included in your PATH environment variable. ENTER STRINGLN Additional configurations might be required by your Linux distribution such as STRINGLN group membership, udev rules or else. STRINGLN ========================================================================================== STRINGLN " ================================================ FILE: applications/main/bad_usb/resources/badusb/Install_qFlipper_macOS.txt ================================================ ID 05ac:021e Apple:Keyboard REM Keep these 3 lines IF (and only if) it's the first time you are performing a badKB attack against a specific macOS target. REM In fact, it helps Flipper Zero bypass the macOS keyboard setup assistant. Otherwise the attack will not start. REM Author: 47LeCoste REM Version 1.0 (Flipper Ducky) REM Target: macOS DELAY 3000 F4 DELAY 2500 STRING Terminal DELAY 2500 ENTER DELAY 1500 STRING (cd /tmp && curl -L -o qFlipper.dmg https://update.flipperzero.one/qFlipper/release/macos-amd64/dmg && hdiutil attach qFlipper.dmg && app_volume=$(ls /Volumes | grep -i "qFlipper") && (test -e /Applications/qFlipper.app && rm -rf /Applications/qFlipper.app ); cp -R "/Volumes/$app_volume/qFlipper.app" /Applications/ && hdiutil detach "/Volumes/$app_volume" && rm qFlipper.dmg && open /Applications/qFlipper.app) DELAY 1000 ENTER ================================================ FILE: applications/main/bad_usb/resources/badusb/Install_qFlipper_windows.txt ================================================ REM Written by @dexv DELAY 2000 GUI r DELAY 500 STRING powershell ENTER DELAY 1000 STRING $url = "https://update.flipperzero.one/qFlipper/release/windows-amd64/portable" ENTER STRING $output = "$env:USERPROFILE\Documents\qFlipper.zip" ENTER STRING $destination = "$env:USERPROFILE\Documents\qFlipper" ENTER STRING $shortcutPath = "$env:USERPROFILE\Desktop\qFlipper.lnk" ENTER STRING $scriptPath = "$env:USERPROFILE\Documents\qFlipperInstall.ps1" ENTER STRING $driverPath = "$destination\STM32 Driver" ENTER STRING $installBat = "$driverPath\install.bat" ENTER STRING (New-Object System.Net.WebClient).DownloadFile($url, $output) ENTER STRING Expand-Archive -Path $output -DestinationPath $destination -Force ENTER STRING Set-Location -Path $destination ENTER STRING Start-Process -FilePath ".\qFlipper.exe" ENTER STRING Start-Process -Wait -FilePath "cmd.exe" -ArgumentList "/c $installBat" ENTER STRING $shell = New-Object -ComObject WScript.Shell ENTER STRING $shortcut = $shell.CreateShortcut($shortcutPath) ENTER STRING $shortcut.TargetPath = "$destination\qFlipper.exe" ENTER STRING $shortcut.Save() ENTER DELAY 500 STRING "powershell -ExecutionPolicy Bypass -File $scriptPath" ENTER ================================================ FILE: applications/main/bad_usb/resources/badusb/demo_chromeos.txt ================================================ REM This is BadUSB demo script for Chrome and ChromeOS by kowalski7cc REM Exit from Overview ESC REM Open a new tab CTRL t REM wait for some slower chromebooks DELAY 1000 REM Make sure we have omnibox focus CTRL l DELAY 200 REM Open an empty editable page DEFAULT_DELAY 50 STRING data:text/html, Flipper Zero BadUSB Demo