Full Code of qarmin/czkawka for AI

master 28ae8bae1ebe cached
452 files
4.4 MB
1.2M tokens
2658 symbols
1 requests
Download .txt
Showing preview only (4,742K chars total). Download the full file or copy to clipboard to get everything.
Repository: qarmin/czkawka
Branch: master
Commit: 28ae8bae1ebe
Files: 452
Total size: 4.4 MB

Directory structure:
gitextract_ixrhqrgv/

├── .cargo/
│   └── config.toml
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   └── feature_request.md
│   └── workflows/
│       ├── android.yml
│       ├── linux.yml
│       ├── mac.yml
│       ├── quality.yml
│       └── windows.yml
├── .gitignore
├── .mailmap
├── .rustfmt.toml
├── Cargo.toml
├── Changelog.md
├── LICENSE_CC_BY_4_ICONS
├── LICENSE_MIT_EVERYTHING_OUTSIDE_ANY_CARGO_APP_LIBRARY
├── README.md
├── cedinia/
│   ├── Cargo.toml
│   ├── LICENSE_CC_BY_4_ICONS
│   ├── LICENSE_GPL_APP
│   ├── LICENSE_MIT_CODE
│   ├── README.md
│   ├── TMP_INSTALL.md
│   ├── build.rs
│   ├── i18n/
│   │   ├── en/
│   │   │   └── cedinia.ftl
│   │   └── pl/
│   │       └── cedinia.ftl
│   ├── i18n.toml
│   ├── java/
│   │   ├── CediniaActivity.java
│   │   └── CediniaFilePicker.java
│   ├── res/
│   │   ├── drawable/
│   │   │   ├── ic_launcher_background.xml
│   │   │   └── ic_launcher_foreground.xml
│   │   ├── mipmap-anydpi-v26/
│   │   │   └── ic_launcher.xml
│   │   └── values/
│   │       └── strings.xml
│   ├── src/
│   │   ├── app.rs
│   │   ├── bin/
│   │   │   └── cedinia.rs
│   │   ├── callbacks/
│   │   │   ├── directories.rs
│   │   │   ├── misc.rs
│   │   │   ├── scan.rs
│   │   │   └── selection.rs
│   │   ├── callbacks.rs
│   │   ├── common.rs
│   │   ├── file_picker_android.rs
│   │   ├── lib.rs
│   │   ├── localizer_cedinia.rs
│   │   ├── model.rs
│   │   ├── scan_runner.rs
│   │   ├── scanners.rs
│   │   ├── set_initial_gui_infos.rs
│   │   ├── settings/
│   │   │   ├── gui_settings_values.rs
│   │   │   └── mod.rs
│   │   ├── thumbnail_loader.rs
│   │   ├── translations.rs
│   │   └── volumes.rs
│   └── ui/
│       ├── app_state.slint
│       ├── bottom_nav.slint
│       ├── colors.slint
│       ├── common.slint
│       ├── components.slint
│       ├── directories_screen.slint
│       ├── home_screen.slint
│       ├── main_window.slint
│       ├── results_list.slint
│       ├── scan_progress.slint
│       ├── settings_components.slint
│       ├── settings_screen.slint
│       ├── similar_images_gallery.slint
│       ├── top_bar.slint
│       └── translations.slint
├── ci_tester/
│   ├── Cargo.toml
│   └── src/
│       └── main.rs
├── clippy.toml
├── czkawka_cli/
│   ├── Cargo.toml
│   ├── LICENSE_MIT
│   ├── README.md
│   └── src/
│       ├── commands.rs
│       ├── main.rs
│       └── progress.rs
├── czkawka_core/
│   ├── Cargo.toml
│   ├── LICENSE_CC_BY_4_TEST_FILES
│   ├── LICENSE_MIT
│   ├── README.md
│   ├── benches/
│   │   └── hash_calculation_benchmark.rs
│   ├── build.rs
│   ├── i18n/
│   │   ├── ar/
│   │   │   └── czkawka_core.ftl
│   │   ├── bg/
│   │   │   └── czkawka_core.ftl
│   │   ├── cs/
│   │   │   └── czkawka_core.ftl
│   │   ├── de/
│   │   │   └── czkawka_core.ftl
│   │   ├── el/
│   │   │   └── czkawka_core.ftl
│   │   ├── en/
│   │   │   └── czkawka_core.ftl
│   │   ├── es-ES/
│   │   │   └── czkawka_core.ftl
│   │   ├── fa/
│   │   │   └── czkawka_core.ftl
│   │   ├── fr/
│   │   │   └── czkawka_core.ftl
│   │   ├── it/
│   │   │   └── czkawka_core.ftl
│   │   ├── ja/
│   │   │   └── czkawka_core.ftl
│   │   ├── ko/
│   │   │   └── czkawka_core.ftl
│   │   ├── nl/
│   │   │   └── czkawka_core.ftl
│   │   ├── no/
│   │   │   └── czkawka_core.ftl
│   │   ├── pl/
│   │   │   └── czkawka_core.ftl
│   │   ├── pt-BR/
│   │   │   └── czkawka_core.ftl
│   │   ├── pt-PT/
│   │   │   └── czkawka_core.ftl
│   │   ├── ro/
│   │   │   └── czkawka_core.ftl
│   │   ├── ru/
│   │   │   └── czkawka_core.ftl
│   │   ├── sv-SE/
│   │   │   └── czkawka_core.ftl
│   │   ├── tr/
│   │   │   └── czkawka_core.ftl
│   │   ├── uk/
│   │   │   └── czkawka_core.ftl
│   │   ├── zh-CN/
│   │   │   └── czkawka_core.ftl
│   │   └── zh-TW/
│   │       └── czkawka_core.ftl
│   ├── i18n.toml
│   └── src/
│       ├── common/
│       │   ├── basic_gui_cli.rs
│       │   ├── cache/
│       │   │   └── cleaning.rs
│       │   ├── cache.rs
│       │   ├── config_cache_path.rs
│       │   ├── consts.rs
│       │   ├── dir_traversal.rs
│       │   ├── directories.rs
│       │   ├── extensions.rs
│       │   ├── ffmpeg_utils.rs
│       │   ├── image.rs
│       │   ├── items.rs
│       │   ├── logger.rs
│       │   ├── mod.rs
│       │   ├── model.rs
│       │   ├── process_utils.rs
│       │   ├── progress_data.rs
│       │   ├── progress_stop_handler.rs
│       │   ├── tool_data.rs
│       │   ├── traits.rs
│       │   └── video_utils.rs
│       ├── helpers/
│       │   ├── audio_checker.rs
│       │   ├── debug_timer.rs
│       │   ├── delayed_sender.rs
│       │   ├── ffprobe.rs
│       │   ├── messages.rs
│       │   └── mod.rs
│       ├── lib.rs
│       ├── localizer_core.rs
│       └── tools/
│           ├── bad_extensions/
│           │   ├── core.rs
│           │   ├── mod.rs
│           │   ├── tests.rs
│           │   ├── traits.rs
│           │   └── workarounds.rs
│           ├── bad_names/
│           │   ├── core.rs
│           │   ├── mod.rs
│           │   ├── tests.rs
│           │   └── traits.rs
│           ├── big_file/
│           │   ├── core.rs
│           │   ├── mod.rs
│           │   ├── tests.rs
│           │   └── traits.rs
│           ├── broken_files/
│           │   ├── core.rs
│           │   ├── mod.rs
│           │   ├── tests.rs
│           │   └── traits.rs
│           ├── duplicate/
│           │   ├── core.rs
│           │   ├── mod.rs
│           │   ├── tests.rs
│           │   └── traits.rs
│           ├── empty_files/
│           │   ├── core.rs
│           │   ├── mod.rs
│           │   ├── tests.rs
│           │   └── traits.rs
│           ├── empty_folder/
│           │   ├── core.rs
│           │   ├── mod.rs
│           │   ├── tests.rs
│           │   └── traits.rs
│           ├── exif_remover/
│           │   ├── core.rs
│           │   ├── mod.rs
│           │   ├── tests.rs
│           │   └── traits.rs
│           ├── invalid_symlinks/
│           │   ├── core.rs
│           │   ├── mod.rs
│           │   ├── tests.rs
│           │   └── traits.rs
│           ├── mod.rs
│           ├── same_music/
│           │   ├── core.rs
│           │   ├── mod.rs
│           │   ├── tests.rs
│           │   └── traits.rs
│           ├── similar_images/
│           │   ├── core.rs
│           │   ├── mod.rs
│           │   ├── tests.rs
│           │   └── traits.rs
│           ├── similar_videos/
│           │   ├── core.rs
│           │   ├── mod.rs
│           │   ├── tests.rs
│           │   └── traits.rs
│           ├── temporary/
│           │   ├── core.rs
│           │   ├── mod.rs
│           │   └── traits.rs
│           └── video_optimizer/
│               ├── core/
│               │   ├── video_converter.rs
│               │   └── video_cropper.rs
│               ├── core.rs
│               ├── mod.rs
│               ├── tests.rs
│               └── traits.rs
├── czkawka_gui/
│   ├── Cargo.toml
│   ├── LICENSE_CC_BY_4_ICONS
│   ├── LICENSE_MIT_APP_CODE
│   ├── LICENSE_MIT_WINDOWS_THEME
│   ├── README.md
│   ├── i18n/
│   │   ├── ar/
│   │   │   └── czkawka_gui.ftl
│   │   ├── bg/
│   │   │   └── czkawka_gui.ftl
│   │   ├── cs/
│   │   │   └── czkawka_gui.ftl
│   │   ├── de/
│   │   │   └── czkawka_gui.ftl
│   │   ├── el/
│   │   │   └── czkawka_gui.ftl
│   │   ├── en/
│   │   │   └── czkawka_gui.ftl
│   │   ├── es-ES/
│   │   │   └── czkawka_gui.ftl
│   │   ├── fa/
│   │   │   └── czkawka_gui.ftl
│   │   ├── fr/
│   │   │   └── czkawka_gui.ftl
│   │   ├── it/
│   │   │   └── czkawka_gui.ftl
│   │   ├── ja/
│   │   │   └── czkawka_gui.ftl
│   │   ├── ko/
│   │   │   └── czkawka_gui.ftl
│   │   ├── nl/
│   │   │   └── czkawka_gui.ftl
│   │   ├── no/
│   │   │   └── czkawka_gui.ftl
│   │   ├── pl/
│   │   │   └── czkawka_gui.ftl
│   │   ├── pt-BR/
│   │   │   └── czkawka_gui.ftl
│   │   ├── pt-PT/
│   │   │   └── czkawka_gui.ftl
│   │   ├── ro/
│   │   │   └── czkawka_gui.ftl
│   │   ├── ru/
│   │   │   └── czkawka_gui.ftl
│   │   ├── sv-SE/
│   │   │   └── czkawka_gui.ftl
│   │   ├── tr/
│   │   │   └── czkawka_gui.ftl
│   │   ├── uk/
│   │   │   └── czkawka_gui.ftl
│   │   ├── zh-CN/
│   │   │   └── czkawka_gui.ftl
│   │   └── zh-TW/
│   │       └── czkawka_gui.ftl
│   ├── i18n.toml
│   ├── src/
│   │   ├── compute_results.rs
│   │   ├── connect_things/
│   │   │   ├── connect_about_buttons.rs
│   │   │   ├── connect_button_compare.rs
│   │   │   ├── connect_button_delete.rs
│   │   │   ├── connect_button_hardlink.rs
│   │   │   ├── connect_button_move.rs
│   │   │   ├── connect_button_save.rs
│   │   │   ├── connect_button_search.rs
│   │   │   ├── connect_button_select.rs
│   │   │   ├── connect_button_sort.rs
│   │   │   ├── connect_button_stop.rs
│   │   │   ├── connect_change_language.rs
│   │   │   ├── connect_duplicate_buttons.rs
│   │   │   ├── connect_header_buttons.rs
│   │   │   ├── connect_krokiet_info_dialog.rs
│   │   │   ├── connect_notebook_tabs.rs
│   │   │   ├── connect_popovers_select.rs
│   │   │   ├── connect_popovers_sort.rs
│   │   │   ├── connect_progress_window.rs
│   │   │   ├── connect_same_music_mode_changed.rs
│   │   │   ├── connect_selection_of_directories.rs
│   │   │   ├── connect_settings.rs
│   │   │   ├── connect_show_hide_ui.rs
│   │   │   ├── connect_similar_image_size_change.rs
│   │   │   ├── file_chooser_helpers.rs
│   │   │   └── mod.rs
│   │   ├── gtk_traits.rs
│   │   ├── gui_structs/
│   │   │   ├── common_tree_view.rs
│   │   │   ├── common_upper_tree_view.rs
│   │   │   ├── gui_about.rs
│   │   │   ├── gui_bottom_buttons.rs
│   │   │   ├── gui_compare_images.rs
│   │   │   ├── gui_data.rs
│   │   │   ├── gui_header.rs
│   │   │   ├── gui_main_notebook.rs
│   │   │   ├── gui_popovers_select.rs
│   │   │   ├── gui_popovers_sort.rs
│   │   │   ├── gui_progress_dialog.rs
│   │   │   ├── gui_settings.rs
│   │   │   ├── gui_upper_notebook.rs
│   │   │   └── mod.rs
│   │   ├── help_combo_box.rs
│   │   ├── help_functions.rs
│   │   ├── helpers/
│   │   │   ├── enums.rs
│   │   │   ├── image_operations.rs
│   │   │   ├── list_store_operations.rs
│   │   │   ├── mod.rs
│   │   │   └── model_iter.rs
│   │   ├── initialize_gui.rs
│   │   ├── language_functions.rs
│   │   ├── localizer_gui.rs
│   │   ├── main.rs
│   │   ├── notebook_enums.rs
│   │   ├── notebook_info.rs
│   │   ├── opening_selecting_records.rs
│   │   ├── saving_loading.rs
│   │   ├── taskbar_progress.rs
│   │   ├── taskbar_progress_dummy.rs
│   │   └── taskbar_progress_win.rs
│   └── ui/
│       ├── about_dialog.ui
│       ├── compare_images.ui
│       ├── czkawka.cmb
│       ├── main_window.ui
│       ├── popover_right_click.ui
│       ├── popover_select.ui
│       ├── popover_sort.ui
│       ├── progress.ui
│       └── settings.ui
├── data/
│   ├── com.github.qarmin.czkawka.desktop
│   ├── com.github.qarmin.czkawka.metainfo.xml
│   ├── io.github.qarmin.krokiet.desktop
│   └── io.github.qarmin.krokiet.metainfo.xml
├── instructions/
│   ├── Instruction.md
│   └── Translations.md
├── justfile
├── krokiet/
│   ├── Cargo.toml
│   ├── LICENSE_CC_BY_4_AUDIO_FILES
│   ├── LICENSE_CC_BY_4_ICONS
│   ├── LICENSE_GPL_APP
│   ├── LICENSE_MIT_CODE
│   ├── README.md
│   ├── build.rs
│   ├── i18n/
│   │   ├── ar/
│   │   │   └── krokiet.ftl
│   │   ├── bg/
│   │   │   └── krokiet.ftl
│   │   ├── cs/
│   │   │   └── krokiet.ftl
│   │   ├── de/
│   │   │   └── krokiet.ftl
│   │   ├── el/
│   │   │   └── krokiet.ftl
│   │   ├── en/
│   │   │   └── krokiet.ftl
│   │   ├── es-ES/
│   │   │   └── krokiet.ftl
│   │   ├── fa/
│   │   │   └── krokiet.ftl
│   │   ├── fr/
│   │   │   └── krokiet.ftl
│   │   ├── it/
│   │   │   └── krokiet.ftl
│   │   ├── ja/
│   │   │   └── krokiet.ftl
│   │   ├── ko/
│   │   │   └── krokiet.ftl
│   │   ├── nl/
│   │   │   └── krokiet.ftl
│   │   ├── no/
│   │   │   └── krokiet.ftl
│   │   ├── pl/
│   │   │   └── krokiet.ftl
│   │   ├── pt-BR/
│   │   │   └── krokiet.ftl
│   │   ├── pt-PT/
│   │   │   └── krokiet.ftl
│   │   ├── ro/
│   │   │   └── krokiet.ftl
│   │   ├── ru/
│   │   │   └── krokiet.ftl
│   │   ├── sv-SE/
│   │   │   └── krokiet.ftl
│   │   ├── tr/
│   │   │   └── krokiet.ftl
│   │   ├── uk/
│   │   │   └── krokiet.ftl
│   │   ├── zh-CN/
│   │   │   └── krokiet.ftl
│   │   └── zh-TW/
│   │       └── krokiet.ftl
│   ├── i18n.toml
│   ├── src/
│   │   ├── audio_player.rs
│   │   ├── clear_outdated_video_thumbnails.rs
│   │   ├── common.rs
│   │   ├── connect_clean_cache.rs
│   │   ├── connect_directories_changes.rs
│   │   ├── connect_open.rs
│   │   ├── connect_progress_receiver.rs
│   │   ├── connect_rfd.rs
│   │   ├── connect_row_selection.rs
│   │   ├── connect_save.rs
│   │   ├── connect_scan/
│   │   │   ├── bad_extensions.rs
│   │   │   ├── bad_names.rs
│   │   │   ├── big_files.rs
│   │   │   ├── broken_files.rs
│   │   │   ├── duplicate.rs
│   │   │   ├── empty_files.rs
│   │   │   ├── empty_folders.rs
│   │   │   ├── exif_remover.rs
│   │   │   ├── invalid_symlinks.rs
│   │   │   ├── same_music.rs
│   │   │   ├── similar_images.rs
│   │   │   ├── similar_videos.rs
│   │   │   ├── temporary_files.rs
│   │   │   └── video_optimizer.rs
│   │   ├── connect_scan.rs
│   │   ├── connect_select/
│   │   │   ├── custom_select.rs
│   │   │   └── mod.rs
│   │   ├── connect_show_confirmation.rs
│   │   ├── connect_show_preview.rs
│   │   ├── connect_sort.rs
│   │   ├── connect_stop.rs
│   │   ├── connect_tab_changed.rs
│   │   ├── connect_translation.rs
│   │   ├── create_calculate_task_size.rs
│   │   ├── file_actions/
│   │   │   ├── connect_clean_exif.rs
│   │   │   ├── connect_delete.rs
│   │   │   ├── connect_hardlink.rs
│   │   │   ├── connect_move.rs
│   │   │   ├── connect_optimize_video.rs
│   │   │   ├── connect_rename.rs
│   │   │   ├── connect_symlink.rs
│   │   │   └── mod.rs
│   │   ├── localizer_krokiet.rs
│   │   ├── main.rs
│   │   ├── model_operations/
│   │   │   ├── mod.rs
│   │   │   └── model_processor.rs
│   │   ├── set_initial_gui_info.rs
│   │   ├── set_initial_scroll_list_data_indexes.rs
│   │   ├── settings/
│   │   │   ├── combo_box.rs
│   │   │   ├── mod.rs
│   │   │   └── model.rs
│   │   ├── shared_models.rs
│   │   ├── simpler_model.rs
│   │   └── test_common.rs
│   └── ui/
│       ├── about.slint
│       ├── action_buttons.slint
│       ├── bottom_panel.slint
│       ├── callabler.slint
│       ├── color_palette.slint
│       ├── common.slint
│       ├── fonts.slint
│       ├── gui_state.slint
│       ├── included_paths.slint
│       ├── left_side_panel.slint
│       ├── main_lists.slint
│       ├── main_window.slint
│       ├── popup_action_confirm.slint
│       ├── popup_base.slint
│       ├── popup_centered_text.slint
│       ├── popup_clean_cache.slint
│       ├── popup_clean_exif.slint
│       ├── popup_crop_video.slint
│       ├── popup_custom_select.slint
│       ├── popup_delete.slint
│       ├── popup_move_folders.slint
│       ├── popup_new_directories.slint
│       ├── popup_optimize.slint
│       ├── popup_rename_bad_extensions.slint
│       ├── popup_rename_bad_file_names.slint
│       ├── popup_save.slint
│       ├── popup_select_results.slint
│       ├── popup_sort.slint
│       ├── preview.slint
│       ├── progress.slint
│       ├── selectable_tree_view.slint
│       ├── settings.slint
│       ├── settings_list.slint
│       ├── tool_settings.slint
│       └── translations.slint
└── misc/
    ├── add_icon_exe/
    │   └── Cargo.toml
    ├── ai_translate/
    │   ├── ftl_utils.py
    │   ├── pyproject.toml
    │   ├── translate.py
    │   └── validate_translations.py
    ├── cargo/
    │   ├── PublishCore.sh
    │   └── PublishOther.sh
    ├── compare_files.sh
    ├── delete_unused_krokiet_slint_imports.py
    ├── docker/
    │   └── Dockerfile
    ├── find_unused_callbacks.py
    ├── find_unused_fluent_translations.py
    ├── find_unused_settings_properties.py
    ├── find_unused_slint_translations.py
    ├── flathub.sh
    ├── gen_android_icons.py
    ├── nix/
    │   ├── flake.nix
    │   └── packages.nix
    ├── remove_comments.py
    ├── run_checks.sh
    ├── simplify_and_minify_svg.py
    ├── test_compilation_speed_size/
    │   ├── Cargo.toml
    │   ├── README.md
    │   ├── generate_md_and_plots.py
    │   └── src/
    │       ├── main.rs
    │       ├── model.rs
    │       └── new_chart.rs
    ├── test_image_perf/
    │   ├── Cargo.toml
    │   └── src/
    │       └── main.rs
    └── test_read_perf/
        ├── Cargo.toml
        └── src/
            └── main.rs

================================================
FILE CONTENTS
================================================

================================================
FILE: .cargo/config.toml
================================================
[target.x86_64-pc-windows-msvc]
# Increase default stack size to avoid running out of stack
# space in debug builds. The size matches Linux's default.
rustflags = ["-C", "link-arg=/STACK:8000000"]
[target.aarch64-pc-windows-msvc]
# Increase default stack size to avoid running out of stack
# space in debug builds. The size matches Linux's default.
rustflags = ["-C", "link-arg=/STACK:8000000"]

================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms

github: qarmin # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a report to help us improve app
title: ''
labels: bug
assignees: ''

---

**Bug Description**

**Steps to reproduce:**
<!-- Please describe what you expected to see and what you saw instead. Also include screenshots or screencasts if needed. -->

**Terminal output** (optional):

```
<!--
Add terminal output only if needed - if there are some errors or warnings or you have performance/freeze issues.  
Very helpful in this situation will be logs from czkawka run with RUST_LOG environment variable set e.g. 
`RUST_LOG=debug ./czkawka` or `flatpak run --env=RUST_LOG=debug com.github.qarmin.czkawka` if you use flatpak, which will print more detailed info about executed function.
-->

<details>
<summary>Debug log</summary>

# UNCOMMENT DETAILS AND PUT LOGS HERE

</details>
```

**System**

<!-- OS and Czkawka/Krokiet version and other OS info - you can copy it from the logs if you run the app from a terminal or locate the log files manually
(Linux: `/home/username/.cache/czkawka`,
macOS: `/Users/Username/Library/Caches/pl.Qarmin.Czkawka`,
Windows: `C:\Users\Username\AppData\Local\Qarmin\Czkawka\cache`).
Note: the exact path depends on the installation method(you can open config/cache path from gui). -->
<!-- Example of logs: -->
<!-- Czkawka gtk version: 11.0.1, debug mode, rust 1.92.0 (2025-06-23), os Ubuntu 25.4.0 (x86_64 64-bit), 24 cpu/threads, features(1): [fast_image_resize], app cpu version: x86-64-v3 (AVX2) or x86-64-v4 (AVX-512), os cpu version: x86-64-v4 (AVX-512) -->
<!-- Config folder set to "/home/rafal/.config/czkawka" and cache folder set to "/home/rafal/.cache/czkawka" -->
<!-- Czkawka Gui - used thread number: 24, gtk version 4.18.5 -->

<!-- Please do not report feature request unique for Gtk Czkawka gui, because it is in maintenance mode. -->

- Czkawka/Krokiet version: <!--  e.g. 11.0.1 cli/gui -->
- OS version: <!--  e.g. Ubuntu 22.04, Windows 11, Mac 15.1 ARM -->
- Installation method: <!-- e.g. github binaries, flatpak, msys2 -->

<!-- If you use flatpak, please include the result of `flatpak info com.github.qarmin.czkawka`. -->


================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: enhancement
assignees: ''

---

**Feature Description**
...


================================================
FILE: .github/workflows/android.yml
================================================
name: 🤖 Android APK

on:
  push:
    branches: [ master, main ]
  pull_request:
    branches: [ master, main ]
  workflow_dispatch:

jobs:
  build-apk:
    name: Build Android APK
    runs-on: ubuntu-latest
    env:
      NDK_VERSION: 26.3.11579264

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Set up Java (required by Android SDK)
        uses: actions/setup-java@v4
        with:
          distribution: temurin
          java-version: '17'

      - name: Set up Android SDK
        uses: android-actions/setup-android@v3

      - name: Cache Android SDK
        uses: actions/cache@v4
        with:
          path: |
            ${{ env.ANDROID_SDK_ROOT }}/cmdline-tools
            ${{ env.ANDROID_SDK_ROOT }}/ndk
            ${{ env.ANDROID_SDK_ROOT }}/platforms
            ${{ env.ANDROID_SDK_ROOT }}/platform-tools
            ${{ env.ANDROID_SDK_ROOT }}/build-tools
          key: ${{ runner.os }}-android-sdk-${{ env.NDK_VERSION }}
          restore-keys: |
            ${{ runner.os }}-android-sdk-

      - name: Install Android NDK and tools
        run: |
          rustup target add aarch64-linux-android
          cargo install cargo-apk || true

          yes | sdkmanager --install "ndk;${NDK_VERSION}"
          echo "ANDROID_NDK_ROOT=$ANDROID_HOME/ndk/${NDK_VERSION}" >> $GITHUB_ENV

      - name: Cache Cargo
        uses: actions/cache@v4
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
            target
          key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}-android-v1
          restore-keys: |
            ${{ runner.os }}-cargo-

      - name: Generate keystores
        run: |
          sudo apt update || true
          sudo apt install -y just

          just gen_keystores

      - name: Build APK (release)
        if: ${{ github.ref == 'refs/heads/master' || github.ref == 'refs/heads/main' }}
        run: |
          echo "VERS=release" >> $GITHUB_ENV
          cargo apk build -p cedinia --lib --release
          mv target/release/apk/cedinia.apk cedinia.apk

      - name: Build APK (debug)
        if: ${{ github.ref != 'refs/heads/master' && github.ref != 'refs/heads/main' }}
        run: |
          echo "VERS=debug" >> $GITHUB_ENV
          cargo apk build -p cedinia --lib
          mv target/debug/apk/cedinia.apk cedinia.apk

      - name: Upload APK artifact
        uses: actions/upload-artifact@v4
        with:
          name: cedinia-${{ env.VERS }}
          path: cedinia.apk

      - name: Release
        uses: softprops/action-gh-release@v2
        if: ${{ github.ref == 'refs/heads/master' && vars.HAVE_PAT_REPOSITORY_TOKEN == '1' }}
        with:
          tag_name: "Nightly"
          files: |
            cedinia.apk
          token: ${{ secrets.PAT_REPOSITORY }}

================================================
FILE: .github/workflows/linux.yml
================================================
name: 🐧 Linux
on:
  push:
  pull_request:
  schedule:
    - cron: '0 0 * * 2'

env:
  CARGO_TERM_COLOR: always
  CZKAWKA_OFFICIAL_BUILD: ${{ vars.CZKAWKA_OFFICIAL_BUILD }}

jobs:
  linux-all:
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-22.04, ubuntu-22.04-arm]
    steps:
      - uses: actions/checkout@v4

      - name: Setup env
        run: |
          ARCHNAME=$([ "${{ runner.arch }}" = "ARM64" ] && echo arm64 || echo x86_64)
          echo "ARCHNAME=$ARCHNAME" >> $GITHUB_ENV

      - name: Install basic libraries
        run: sudo apt update || true; sudo apt install libheif-dev libraw-dev ffmpeg libgtk-4-dev p7zip-full -y

      - name: Setup rust version
        run: rustup default 1.92.0

      - name: Build Release
        if: ${{ github.ref == 'refs/heads/master' }}
        run: |
          sed -i 's/#lto = /lto = /g' Cargo.toml
          sed -i 's/#codegen-units /codegen-units /g' Cargo.toml
          
          echo "VERS=release" >> $GITHUB_ENV
          
          cargo build --release
          mv target/release/czkawka_cli linux_czkawka_cli_${{ env.ARCHNAME }}
          mv target/release/czkawka_gui linux_czkawka_gui_${{ env.ARCHNAME }}
          mv target/release/krokiet linux_krokiet_${{ env.ARCHNAME }}
          cargo build --release --bin krokiet --no-default-features --features "winit_skia_opengl,winit_software"
          mv target/release/krokiet linux_krokiet_skia_opengl_${{ env.ARCHNAME }}
          cargo build --release --bin krokiet --no-default-features --features "winit_skia_vulkan,winit_software"
          mv target/release/krokiet linux_krokiet_skia_vulkan_${{ env.ARCHNAME }}
          cargo build --release --bin krokiet --no-default-features --features "femtovg_wgpu"
          mv target/release/krokiet linux_krokiet_femtovg_wgpu_${{ env.ARCHNAME }}
          cargo build --release --bin krokiet --no-default-features --features "winit_femtovg,winit_skia_opengl,winit_skia_vulkan,winit_software,femtovg_wgpu"
          mv target/release/krokiet linux_krokiet_all_backends_${{ env.ARCHNAME }}

      # Fast CI profile, to avoid out of disk space errors
      # I doubt that anyone would use debug builds from here, because they are slow and contains not final changes
      - name: Build Debug
        if: ${{ github.ref != 'refs/heads/master' }}
        run: |
          sed -i 's/^\(\[profile\.dev\.package.*\)/#\1/' Cargo.toml
          sed -i 's|^opt-level = 3 # OPT PACKAGES|#opt-level = 3 # OPT PACKAGES|' Cargo.toml
          
          echo "VERS=debug" >> $GITHUB_ENV
          
          cargo build --profile fastci
          mv target/fastci/czkawka_cli linux_czkawka_cli_${{ env.ARCHNAME }}
          mv target/fastci/czkawka_gui linux_czkawka_gui_${{ env.ARCHNAME }}
          mv target/fastci/krokiet linux_krokiet_${{ env.ARCHNAME }}
          cargo build --bin krokiet --no-default-features --features "winit_skia_opengl,winit_software" --profile fastci
          mv target/fastci/krokiet linux_krokiet_skia_opengl_${{ env.ARCHNAME }}
          cargo build --bin krokiet --no-default-features --features "winit_skia_vulkan,winit_software" --profile fastci
          mv target/fastci/krokiet linux_krokiet_skia_vulkan_${{ env.ARCHNAME }}
          cargo build --bin krokiet --no-default-features --features "femtovg_wgpu" --profile fastci
          mv target/fastci/krokiet linux_krokiet_femtovg_wgpu_${{ env.ARCHNAME }}
          cargo build --bin krokiet --no-default-features --features "winit_femtovg,winit_skia_opengl,winit_skia_vulkan,winit_software,femtovg_wgpu" --profile fastci
          mv target/fastci/krokiet linux_krokiet_all_backends_${{ env.ARCHNAME }}

      - name: Pack with 7z
        run: |
          # 7z -mx=3 in rust files, takes 40% less space but is 2x slower than zip -mx=1
          # 7z -mx=3 is 8x faster than 7z -mx=5, but generates 20% bigger 
          # So looks that -mx=3 is the best option
          time 7z a -t7z -mx=3 czkawka_all.7z \
            linux_czkawka_cli_${{ env.ARCHNAME }} \
            linux_czkawka_gui_${{ env.ARCHNAME }} \
            linux_krokiet_${{ env.ARCHNAME }} \
            linux_krokiet_skia_opengl_${{ env.ARCHNAME }} \
            linux_krokiet_skia_vulkan_${{ env.ARCHNAME }} \
            linux_krokiet_femtovg_wgpu_${{ env.ARCHNAME }} \
            linux_krokiet_all_backends_${{ env.ARCHNAME }}

      - name: Store
        uses: actions/upload-artifact@v4
        with:
          name: all-${{ runner.os }}-${{ runner.arch }}-${{ env.VERS }}
          path: |
            czkawka_all.7z

      - name: Release
        if: ${{ github.ref == 'refs/heads/master' && vars.HAVE_PAT_REPOSITORY_TOKEN == '1' }}
        uses: softprops/action-gh-release@v2
        with:
          tag_name: "Nightly"
          files: |
            linux_czkawka_cli_${{ env.ARCHNAME }}
            linux_czkawka_gui_${{ env.ARCHNAME }}
            linux_krokiet_${{ env.ARCHNAME }}
            linux_krokiet_skia_opengl_${{ env.ARCHNAME }}
            linux_krokiet_skia_vulkan_${{ env.ARCHNAME }}
            linux_krokiet_femtovg_wgpu_${{ env.ARCHNAME }}
            linux_krokiet_all_backends_${{ env.ARCHNAME }}
          token: ${{ secrets.PAT_REPOSITORY }}

  # Some dependencies requires ubuntu 24.04
  linux-all-extra:
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-24.04, ubuntu-24.04-arm]
    steps:
      - uses: actions/checkout@v4

      - name: Setup env
        run: |
          ARCHNAME=$([ "${{ runner.arch }}" = "ARM64" ] && echo arm64 || echo x86_64)
          echo "ARCHNAME=$ARCHNAME" >> $GITHUB_ENV

      - name: Install basic libraries
        run: sudo apt update || true; sudo apt install libheif-dev libraw-dev ffmpeg libgtk-4-dev p7zip-full -y

      - name: Setup rust version
        run: rustup default 1.92.0

      - name: Build Release
        if: ${{ github.ref == 'refs/heads/master' }}
        run: |
          sed -i 's/#lto = /lto = /g' Cargo.toml
          sed -i 's/#codegen-units /codegen-units /g' Cargo.toml
          
          echo "VERS=release" >> $GITHUB_ENV
          
          cargo build --release --features "heif,libraw"
          mv target/release/czkawka_cli linux_czkawka_cli_heif_raw_${{ env.ARCHNAME }}
          mv target/release/czkawka_gui linux_czkawka_gui_heif_raw_${{ env.ARCHNAME }}
          mv target/release/krokiet linux_krokiet_heif_raw_${{ env.ARCHNAME }}
          cargo build --release --bin krokiet --no-default-features --features "winit_skia_opengl,winit_software,heif,libraw"
          mv target/release/krokiet linux_krokiet_heif_raw_skia_opengl_${{ env.ARCHNAME }}
          cargo build --release --bin krokiet --no-default-features --features "winit_skia_vulkan,winit_software,heif,libraw"
          mv target/release/krokiet linux_krokiet_heif_raw_skia_vulkan_${{ env.ARCHNAME }}
          cargo build --release --bin krokiet --no-default-features --features "femtovg_wgpu,heif,libraw"
          mv target/release/krokiet linux_krokiet_heif_raw_femtovg_wgpu_${{ env.ARCHNAME }}
          cargo build --release --bin krokiet --no-default-features --features "winit_femtovg,winit_skia_opengl,winit_skia_vulkan,winit_software,femtovg_wgpu,heif,libraw"
          mv target/release/krokiet linux_krokiet_heif_raw_all_backends_${{ env.ARCHNAME }}

      # Fast CI profile, to avoid out of disk space errors
      # I doubt that anyone would use debug builds from here, because they are slow and contains not final changes
      - name: Build Debug
        if: ${{ github.ref != 'refs/heads/master' }}
        run: |
          sed -i 's/^\(\[profile\.dev\.package.*\)/#\1/' Cargo.toml
          sed -i 's|^opt-level = 3 # OPT PACKAGES|#opt-level = 3 # OPT PACKAGES|' Cargo.toml
          
          echo "VERS=debug" >> $GITHUB_ENV
          
          cargo build --features "heif,libraw" --profile fastci
          mv target/fastci/czkawka_cli linux_czkawka_cli_heif_raw_${{ env.ARCHNAME }}
          mv target/fastci/czkawka_gui linux_czkawka_gui_heif_raw_${{ env.ARCHNAME }}
          mv target/fastci/krokiet linux_krokiet_heif_raw_${{ env.ARCHNAME }}
          cargo build --bin krokiet --no-default-features --features "winit_skia_opengl,winit_software,heif,libraw" --profile fastci
          mv target/fastci/krokiet linux_krokiet_heif_raw_skia_opengl_${{ env.ARCHNAME }}
          cargo build --bin krokiet --no-default-features --features "winit_skia_vulkan,winit_software,heif,libraw" --profile fastci
          mv target/fastci/krokiet linux_krokiet_heif_raw_skia_vulkan_${{ env.ARCHNAME }}
          cargo build --bin krokiet --no-default-features --features "femtovg_wgpu,heif,libraw" --profile fastci
          mv target/fastci/krokiet linux_krokiet_heif_raw_femtovg_wgpu_${{ env.ARCHNAME }}
          cargo build --bin krokiet --no-default-features --features "winit_femtovg,winit_skia_opengl,winit_skia_vulkan,winit_software,femtovg_wgpu,heif,libraw" --profile fastci
          mv target/fastci/krokiet linux_krokiet_heif_raw_all_backends_${{ env.ARCHNAME }}

      - name: Pack with 7z
        run: |
          # 7z -mx=3 in rust files, takes 40% less space but is 2x slower than zip -mx=1
          # 7z -mx=3 is 8x faster than 7z -mx=5, but generates 20% bigger 
          # So looks that -mx=3 is the best option
          time 7z a -t7z -mx=3 czkawka_all.7z \
            linux_czkawka_cli_heif_raw_${{ env.ARCHNAME }} \
            linux_czkawka_gui_heif_raw_${{ env.ARCHNAME }} \
            linux_krokiet_heif_raw_${{ env.ARCHNAME }} \
            linux_krokiet_heif_raw_skia_opengl_${{ env.ARCHNAME }} \
            linux_krokiet_heif_raw_skia_vulkan_${{ env.ARCHNAME }} \
            linux_krokiet_heif_raw_femtovg_wgpu_${{ env.ARCHNAME }} \
            linux_krokiet_heif_raw_all_backends_${{ env.ARCHNAME }}

      - name: Store
        uses: actions/upload-artifact@v4
        with:
          name: all-${{ runner.os }}-${{ runner.arch }}-${{ env.VERS }}-heif-libraw
          path: |
            czkawka_all.7z

      - name: Release
        if: ${{ github.ref == 'refs/heads/master' && vars.HAVE_PAT_REPOSITORY_TOKEN == '1' }}
        uses: softprops/action-gh-release@v2
        with:
          tag_name: "Nightly"
          files: |
            linux_czkawka_cli_heif_raw_${{ env.ARCHNAME }}
            linux_czkawka_gui_heif_raw_${{ env.ARCHNAME }}
            linux_krokiet_heif_raw_${{ env.ARCHNAME }}
            linux_krokiet_heif_raw_skia_opengl_${{ env.ARCHNAME }}
            linux_krokiet_heif_raw_skia_vulkan_${{ env.ARCHNAME }}
            linux_krokiet_heif_raw_femtovg_wgpu_${{ env.ARCHNAME }}
            linux_krokiet_heif_raw_all_backends_${{ env.ARCHNAME }}
          token: ${{ secrets.PAT_REPOSITORY }}

  ### MUSL CLI and Krokiet Release and Debug
  # GUI not works with MUSL :(
  # https://github.com/slint-ui/slint/issues/7586
  # https://github.com/rust-windowing/winit/issues/1818
  linux-cli-musl:
    runs-on: ubuntu-22.04
    steps:
      - uses: actions/checkout@v4

      - name: Install basic libraries
        run: |
          sudo apt update || true; sudo apt install musl-tools -y

      - name: Setup rust version
        run: |
          rustup default 1.92.0
          rustup target add x86_64-unknown-linux-musl

      - name: Build Release
        if: ${{ github.ref == 'refs/heads/master' }}
        run: |
          sed -i 's/#lto = /lto = /g' Cargo.toml
          sed -i 's/#codegen-units /codegen-units /g' Cargo.toml
          cargo build --release --bin czkawka_cli --target x86_64-unknown-linux-musl
          
          mv target/x86_64-unknown-linux-musl/release/czkawka_cli linux_czkawka_cli_musl

      - name: Build Debug
        if: ${{ github.ref != 'refs/heads/master' }}
        run: |
          sed -i 's/^\(\[profile\.dev\.package.*\)/#\1/' Cargo.toml
          sed -i 's|^opt-level = 3 # OPT PACKAGES|#opt-level = 3 # OPT PACKAGES|' Cargo.toml
          cargo build --bin czkawka_cli --target x86_64-unknown-linux-musl
          
          mv target/x86_64-unknown-linux-musl/debug/czkawka_cli linux_czkawka_cli_musl

      - name: Store Linux CLI
        uses: actions/upload-artifact@v4
        with:
          name: czkawka_cli-${{ runner.os }}-musl
          path: |
            linux_czkawka_cli_musl

      - name: Release
        uses: softprops/action-gh-release@v2
        if: ${{ github.ref == 'refs/heads/master' && vars.HAVE_PAT_REPOSITORY_TOKEN == '1' }}
        with:
          tag_name: "Nightly"
          files: |
            linux_czkawka_cli_musl
          token: ${{ secrets.PAT_REPOSITORY }}

  ### Below, builds that do not produce artifacts

  ### 32 bit CLI and Krokiet Release and Debug - TODO test also gtk gui but it requires gtk4:i386 and also would be good to test libraw and heif
  linux-all-debug-32bit:
    if: ${{ github.ref != 'refs/heads/master' }}
    runs-on: ubuntu-22.04
    steps:
      - uses: actions/checkout@v4

      - name: Install basic libraries
        run: |
          sudo apt update || true
          sudo apt install gcc-multilib -y

      - name: Setup rust version and target
        run: |
          rustup default 1.92.0
          rustup target add i686-unknown-linux-gnu

      - name: Build Debug for 32-bit
        run: |
          sed -i 's/^\(\[profile\.dev\.package.*\)/#\1/' Cargo.toml
          sed -i 's|^opt-level = 3 # OPT PACKAGES|#opt-level = 3 # OPT PACKAGES|' Cargo.toml
          cargo build --target i686-unknown-linux-gnu --bin czkawka_cli --bin krokiet
          mv target/i686-unknown-linux-gnu/debug/czkawka_cli linux_czkawka_cli_32bit
          mv target/i686-unknown-linux-gnu/debug/krokiet linux_krokiet_32bit

      - name: Store
        uses: actions/upload-artifact@v4
        with:
          name: all-32bit-${{ runner.os }}-${{ runner.arch }}-debug
          path: |
            linux_czkawka_cli_32bit
            linux_krokiet_32bit

  linux-stability:
    if: ${{ github.ref == 'refs/heads/master' }} # Runs only in master, because it is really time consuming
    runs-on: ubuntu-24.04
    steps:
      - uses: actions/checkout@v4

      - name: Install basic libraries
        run: sudo apt update || true; sudo apt install libgtk-4-dev libheif-dev libraw-dev -y

      - name: Setup rust version
        run: rustup default 1.92.0

      - name: Build packages
        run: |
          rm -rf target || true
          cargo build --features "heif,libraw"
          mv target/debug/czkawka_cli czkawka_cli_debug_1
          mv target/debug/czkawka_gui czkawka_gui_debug_1
          mv target/debug/krokiet krokiet_debug_1
          
          rm -rf target || true
          cargo build --release --features "heif,libraw"
          mv target/release/czkawka_cli czkawka_cli_release_1
          mv target/release/czkawka_gui czkawka_gui_release_1
          mv target/release/krokiet krokiet_release_1
          
          rm -rf target || true
          cargo build --features "heif,libraw"
          mv target/debug/czkawka_cli czkawka_cli_debug_2
          mv target/debug/czkawka_gui czkawka_gui_debug_2
          mv target/debug/krokiet krokiet_debug_2
          
          rm -rf target || true
          cargo build --release --features "heif,libraw"
          mv target/release/czkawka_cli czkawka_cli_release_2
          mv target/release/czkawka_gui czkawka_gui_release_2
          mv target/release/krokiet krokiet_release_2
          
          bash misc/compare_files.sh

  linux-tests:
    runs-on: ubuntu-22.04
    steps:
      - uses: actions/checkout@v4

      - name: Install basic libraries
        run: sudo apt update || true; sudo apt install libgtk-4-dev libheif-dev libraw-dev -y

      - name: Setup rust version
        run: rustup default 1.92.0

      - name: Test
        run: |
          sed -i 's/^\(\[profile\.dev\.package.*\)/#\1/' Cargo.toml
          sed -i 's|^opt-level = 3 # OPT PACKAGES|#opt-level = 3 # OPT PACKAGES|' Cargo.toml
          xvfb-run cargo test

  linux-regression-tests-on-minimal-rust-version:
    runs-on: ubuntu-22.04
    steps:
      - uses: actions/checkout@v4

      - name: Install basic libraries
        run: sudo apt update || true; sudo apt install libgtk-4-dev libheif-dev libraw-dev ffmpeg -y

      - name: Setup rust version
        run: rustup default 1.92.0

      - name: Build test version
        run: |
          sed -i 's/^\(\[profile\.dev\.package.*\)/#\1/' Cargo.toml
          sed -i 's|^opt-level = 3 # OPT PACKAGES|#opt-level = 3 # OPT PACKAGES|' Cargo.toml
          cargo build --profile test --bin czkawka_cli

      - name: Linux Regression Test
        run: |
          wget -q https://github.com/qarmin/czkawka/releases/download/6.0.0/TestFiles.zip
          cd ci_tester
          cargo build --release
          cd ..

          ci_tester/target/release/ci_tester target/debug/czkawka_cli

  android:
    if: ${{ github.ref == 'refs/heads/master' }}
    runs-on: ubuntu-22.04
    steps:
      - uses: actions/checkout@v4

      - name: Setup rust version and target
        run: |
          rustup default 1.92.0
          rustup target add aarch64-linux-android

      - name: Check for Android
        run: |
          cd czkawka_core
          cargo check --target aarch64-linux-android --features "blake_pure"


================================================
FILE: .github/workflows/mac.yml
================================================
name: 🍎 MacOS
on:
  push:
  pull_request:
  schedule:
    - cron: '0 0 * * 2'

env:
  CARGO_TERM_COLOR: always
  CZKAWKA_OFFICIAL_BUILD: ${{ vars.CZKAWKA_OFFICIAL_BUILD }}

jobs:
  macos:
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [macos-latest, macos-15-intel]
    steps:
      - uses: actions/checkout@v4

      - name: Setup env
        run: |
          ARCHNAME=$([ "${{ runner.arch }}" = "ARM64" ] && echo arm64 || echo x86_64)
          echo "ARCHNAME=$ARCHNAME" >> $GITHUB_ENV

      - name: Setup rust version
        run: rustup default 1.92.0

      - name: Install Homebrew
        run: /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

      - name: Install GTK4
        run: |
          brew link --overwrite python@3.13
          brew install gtk4 libheif libavif dav1d || true
          # brew link --overwrite python@3.13

      - name: Build Release
        if: ${{ github.ref == 'refs/heads/master' }}
        run: |
          set -e
          sed -i '' 's/#lto = "thin"/lto = "thin"/g' Cargo.toml
          sed -i '' 's/#codegen-units /codegen-units /g' Cargo.toml
          
          echo "VERS=release" >> $GITHUB_ENV
          
          export LIBRARY_PATH=$LIBRARY_PATH:$(brew --prefix)/lib
          
          cargo build --release
          mv target/release/czkawka_cli mac_czkawka_cli_${{ env.ARCHNAME }}
          mv target/release/czkawka_gui mac_czkawka_gui_${{ env.ARCHNAME }}
          mv target/release/krokiet mac_krokiet_${{ env.ARCHNAME }}
          cargo build --release --bin krokiet --no-default-features --features "winit_skia_vulkan,winit_software"
          mv target/release/krokiet mac_krokiet_skia_vulkan_${{ env.ARCHNAME }}
          cargo build --release --bin krokiet --no-default-features --features "femtovg_wgpu"
          mv target/release/krokiet mac_krokiet_femtovg_wgpu_${{ env.ARCHNAME }}
          cargo build --release --bin krokiet --no-default-features --features "winit_femtovg,winit_skia_opengl,winit_skia_vulkan,winit_software,femtovg_wgpu"
          mv target/release/krokiet mac_krokiet_all_backends_${{ env.ARCHNAME }}
          
          cargo build --release --features "heif,libavif"
          mv target/release/czkawka_cli mac_czkawka_cli_heif_avif_${{ env.ARCHNAME }}
          mv target/release/czkawka_gui mac_czkawka_gui_heif_avif_${{ env.ARCHNAME }}
          mv target/release/krokiet mac_krokiet_heif_avif_${{ env.ARCHNAME }}
          cargo build --release --bin krokiet --no-default-features --features "winit_skia_vulkan,winit_software,heif,libavif"
          mv target/release/krokiet mac_krokiet_skia_vulkan_heif_avif_${{ env.ARCHNAME }}
          cargo build --release --bin krokiet --no-default-features --features "femtovg_wgpu,heif,libavif"
          mv target/release/krokiet mac_krokiet_heif_avif_femtovg_wgpu_${{ env.ARCHNAME }}
          cargo build --release --bin krokiet --no-default-features --features "winit_femtovg,winit_skia_opengl,winit_skia_vulkan,winit_software,femtovg_wgpu,heif,libavif"
          mv target/release/krokiet mac_krokiet_heif_avif_all_backends_${{ env.ARCHNAME }}

      - name: Build Debug
        if: ${{ github.ref != 'refs/heads/master' }}
        run: |
          set -e
          sed -i '' 's/^\(\[profile\.dev\.package.*\)/#\1/' Cargo.toml
          sed -i '' 's|^opt-level = 3 # OPT PACKAGES|#opt-level = 3 # OPT PACKAGES|' Cargo.toml
          
          echo "VERS=debug" >> $GITHUB_ENV
          
          export LIBRARY_PATH=$LIBRARY_PATH:$(brew --prefix)/lib
          
          cargo build --profile fastci
          mv target/fastci/czkawka_cli mac_czkawka_cli_${{ env.ARCHNAME }}
          mv target/fastci/czkawka_gui mac_czkawka_gui_${{ env.ARCHNAME }}
          mv target/fastci/krokiet mac_krokiet_${{ env.ARCHNAME }}
          cargo build --profile fastci --bin krokiet --no-default-features --features "winit_skia_vulkan,winit_software"
          mv target/fastci/krokiet mac_krokiet_skia_vulkan_${{ env.ARCHNAME }}
          cargo build --profile fastci --bin krokiet --no-default-features --features "femtovg_wgpu"
          mv target/fastci/krokiet mac_krokiet_femtovg_wgpu_${{ env.ARCHNAME }}
          cargo build --profile fastci --bin krokiet --no-default-features --features "winit_femtovg,winit_skia_opengl,winit_skia_vulkan,winit_software,femtovg_wgpu"
          mv target/fastci/krokiet mac_krokiet_all_backends_${{ env.ARCHNAME }}
          
          cargo build --profile fastci --features "heif,libavif"
          mv target/fastci/czkawka_cli mac_czkawka_cli_heif_avif_${{ env.ARCHNAME }}
          mv target/fastci/czkawka_gui mac_czkawka_gui_heif_avif_${{ env.ARCHNAME }}
          mv target/fastci/krokiet mac_krokiet_heif_avif_${{ env.ARCHNAME }}
          cargo build --profile fastci --bin krokiet --no-default-features --features "winit_skia_vulkan,winit_software,heif,libavif"
          mv target/fastci/krokiet mac_krokiet_skia_vulkan_heif_avif_${{ env.ARCHNAME }}
          cargo build --profile fastci --bin krokiet --no-default-features --features "femtovg_wgpu,heif,libavif"
          mv target/fastci/krokiet mac_krokiet_heif_avif_femtovg_wgpu_${{ env.ARCHNAME }}
          cargo build --profile fastci --bin krokiet --no-default-features --features "winit_femtovg,winit_skia_opengl,winit_skia_vulkan,winit_software,femtovg_wgpu,heif,libavif"
          mv target/fastci/krokiet mac_krokiet_heif_avif_all_backends_${{ env.ARCHNAME }}

      - name: Store MacOS
        uses: actions/upload-artifact@v4
        with:
          name: all-${{ runner.os }}-${{ runner.arch }}-${{ env.VERS }}
          path: |
            mac_czkawka_cli_heif_avif_${{ env.ARCHNAME }}
            mac_czkawka_gui_heif_avif_${{ env.ARCHNAME }}
            mac_krokiet_heif_avif_${{ env.ARCHNAME }}
            mac_krokiet_heif_avif_femtovg_wgpu_${{ env.ARCHNAME }}
            mac_krokiet_heif_avif_all_backends_${{ env.ARCHNAME }}
            mac_czkawka_cli_${{ env.ARCHNAME }}
            mac_czkawka_gui_${{ env.ARCHNAME }}
            mac_krokiet_${{ env.ARCHNAME }}
            mac_krokiet_skia_vulkan_heif_avif_${{ env.ARCHNAME }}
            mac_krokiet_skia_vulkan_${{ env.ARCHNAME }}
            mac_krokiet_femtovg_wgpu_${{ env.ARCHNAME }}
            mac_krokiet_all_backends_${{ env.ARCHNAME }}

      - name: Release
        if: ${{ github.ref == 'refs/heads/master' && vars.HAVE_PAT_REPOSITORY_TOKEN == '1' }}
        uses: softprops/action-gh-release@v2
        with:
          tag_name: "Nightly"
          files: |
            mac_czkawka_cli_heif_avif_${{ env.ARCHNAME }}
            mac_czkawka_gui_heif_avif_${{ env.ARCHNAME }}
            mac_krokiet_heif_avif_${{ env.ARCHNAME }}
            mac_krokiet_heif_avif_femtovg_wgpu_${{ env.ARCHNAME }}
            mac_krokiet_heif_avif_all_backends_${{ env.ARCHNAME }}
            mac_czkawka_cli_${{ env.ARCHNAME }}
            mac_czkawka_gui_${{ env.ARCHNAME }}
            mac_krokiet_${{ env.ARCHNAME }}
            mac_krokiet_skia_vulkan_heif_avif_${{ env.ARCHNAME }}
            mac_krokiet_skia_vulkan_${{ env.ARCHNAME }}
            mac_krokiet_femtovg_wgpu_${{ env.ARCHNAME }}
            mac_krokiet_all_backends_${{ env.ARCHNAME }}
          token: ${{ secrets.PAT_REPOSITORY }}


================================================
FILE: .github/workflows/quality.yml
================================================
name: 🧹 Quality
on:
  push:
  pull_request:
  schedule:
    - cron: '0 0 * * 2'

env:
  CARGO_TERM_COLOR: always

jobs:
  quality:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Install Gtk 4
        run: sudo apt update || true; sudo apt install -y libgtk-4-dev libraw-dev libheif-dev libavif-dev libdav1d-dev libasound2-dev -y

      - name: Setup rust version
        run: |
          rustup default 1.92.0
          rustup component add rustfmt
          rustup component add clippy

      - name: Disable optimizations
        run: |
          sed -i 's/^\(\[profile\.dev\.package.*\)/#\1/' Cargo.toml
          sed -i 's|^opt-level = 3 # OPT PACKAGES|#opt-level = 3 # OPT PACKAGES|' Cargo.toml

      - name: Check the format
        run: cargo fmt --all -- --check

      - name: Run clippy
        run: |
          cargo clippy --all-targets --all-features -- -D warnings
          cargo clippy --all-targets -- -D warnings

      - name: Check tools
        run: |
          cd misc/test_image_perf
          cargo check
          cd ../../
          
          cd misc/test_read_perf
          cargo check
          cd ../../


================================================
FILE: .github/workflows/windows.yml
================================================
name: 🏁 Windows
on:
  push:
  pull_request:
  schedule:
    - cron: '0 0 * * 2'

env:
  CARGO_TERM_COLOR: always
  CZKAWKA_OFFICIAL_BUILD: ${{ vars.CZKAWKA_OFFICIAL_BUILD }}

jobs:
  krokiet-compiled-on-linux:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Install dependencies
        run: |
          sudo apt update || true
          sudo apt install -y mingw-w64 mingw-w64-x86-64-dev wget wget2 curl wine || true

      - name: Setup rust version
        run: |
          rustup default 1.92.0
          rustup target add x86_64-pc-windows-gnu

      - name: Download rcedit
        run: |
          curl -L https://github.com/electron/rcedit/releases/download/v2.0.0/rcedit-x64.exe -o rcedit-x64.exe

      - name: Compile Krokiet Release
        if: ${{ github.ref == 'refs/heads/master' }}
        run: |
          sed -i 's/#lto = /lto = /g' Cargo.toml
          sed -i 's/#codegen-units /codegen-units /g' Cargo.toml
          cargo build --release --target x86_64-pc-windows-gnu --bin krokiet
          mv target/x86_64-pc-windows-gnu/release/krokiet.exe windows_krokiet_on_linux.exe
          
          export WINEPREFIX=$(mktemp -d)
          wine rcedit-x64.exe windows_krokiet_on_linux.exe --set-icon krokiet/icons/krokiet_logo_flag.ico

      - name: Compile Krokiet Debug
        if: ${{ github.ref != 'refs/heads/master' }}
        run: |
          sed -i 's/^\(\[profile\.dev\.package.*\)/#\1/' Cargo.toml
          sed -i 's|^opt-level = 3 # OPT PACKAGES|#opt-level = 3 # OPT PACKAGES|' Cargo.toml
          cargo build --target x86_64-pc-windows-gnu --bin krokiet
          mv target/x86_64-pc-windows-gnu/debug/krokiet.exe windows_krokiet_on_linux.exe
          
          export WINEPREFIX=$(mktemp -d)
          wine rcedit-x64.exe windows_krokiet_on_linux.exe --set-icon krokiet/icons/krokiet_logo_flag.ico

      - name: Pack with 7z
        run: |
          time 7z a -t7z -mx=3 czkawka_all.7z \
            windows_krokiet_on_linux.exe

      - name: Upload artifacts
        uses: actions/upload-artifact@v4
        with:
          name: krokiet-windows-on-linux-${{ github.sha }}
          path: |
            czkawka_all.7z
          if-no-files-found: error

      - name: Release
        uses: softprops/action-gh-release@v2
        if: ${{ github.ref == 'refs/heads/master' && vars.HAVE_PAT_REPOSITORY_TOKEN == '1' }}
        with:
          tag_name: "Nightly"
          files: |
            windows_krokiet_on_linux.exe
          token: ${{ secrets.PAT_REPOSITORY }}

  # Skia not provides support for gnu toolchain, which is easy to cross-compile - https://github.com/rust-skia/rust-skia/issues/345
  # So need to compile krokiet on msvc Windows
  krokiet-compiled-on-windows:
    runs-on: windows-latest
    steps:
      - uses: actions/checkout@v4

      - name: Setup rust version
        run: |
          rustup default 1.92.0

      - name: Download rcedit
        run: |
          curl -L https://github.com/electron/rcedit/releases/download/v2.0.0/rcedit-x64.exe -o rcedit-x64.exe

      - name: Compile Krokiet Release
        if: ${{ github.ref == 'refs/heads/master' }}
        run: |
          powershell -Command "(Get-Content Cargo.toml) -replace '#lto = ', 'lto = ' | Set-Content Cargo.toml; (Get-Content Cargo.toml) -replace '#codegen-units ', 'codegen-units ' | Set-Content Cargo.toml"
          cargo build --release --bin krokiet --no-default-features --features "winit_skia_opengl,winit_software"
          mv target/release/krokiet.exe windows_krokiet_on_windows_skia_opengl.exe
          cargo build --release --bin krokiet --no-default-features --features "winit_skia_vulkan,winit_software"
          mv target/release/krokiet.exe windows_krokiet_on_windows_skia_vulkan.exe
          cargo build --release --bin krokiet --no-default-features --features "femtovg_wgpu"
          mv target/release/krokiet.exe windows_krokiet_on_windows_femtovg_wgpu.exe
          cargo build --release --bin krokiet --no-default-features --features "winit_femtovg,winit_skia_opengl,winit_skia_vulkan,winit_software,femtovg_wgpu"
          mv target/release/krokiet.exe windows_krokiet_on_windows_all_backends.exe
          Get-ChildItem windows_krokiet_on_windows_*.exe | ForEach-Object { ./rcedit-x64.exe $_.Name --set-icon krokiet/icons/krokiet_logo_flag.ico }

      - name: Compile Krokiet Debug
        if: ${{ github.ref != 'refs/heads/master' }}
        run: |
          (Get-Content Cargo.toml) -replace '#lto = ','lto = ' -replace '#codegen-units ','codegen-units ' -replace '^\[profile\.dev\.package','#\[profile.dev.package' -replace '^opt-level = 3 # OPT PACKAGES','#opt-level = 3 # OPT PACKAGES' | Set-Content Cargo.toml
          
          cargo build --bin krokiet --no-default-features --features "winit_skia_opengl,winit_software"
          mv target/debug/krokiet.exe windows_krokiet_on_windows_skia_opengl.exe
          cargo build --bin krokiet --no-default-features --features "winit_skia_vulkan,winit_software"
          mv target/debug/krokiet.exe windows_krokiet_on_windows_skia_vulkan.exe
          cargo build --bin krokiet --no-default-features --features "femtovg_wgpu"
          mv target/debug/krokiet.exe windows_krokiet_on_windows_femtovg_wgpu.exe
          cargo build --bin krokiet --no-default-features --features "winit_femtovg,winit_skia_opengl,winit_skia_vulkan,winit_software,femtovg_wgpu"
          mv target/debug/krokiet.exe windows_krokiet_on_windows_all_backends.exe
          
          Get-ChildItem windows_krokiet_on_windows_*.exe | ForEach-Object { ./rcedit-x64.exe $_.Name --set-icon krokiet/icons/krokiet_logo_flag.ico }

      - name: Upload artifacts
        uses: actions/upload-artifact@v4
        with:
          name: krokiet-windows-on-windows-${{ github.sha }}
          path: |
            windows_krokiet_on_windows_skia_opengl.exe
            windows_krokiet_on_windows_skia_vulkan.exe
            windows_krokiet_on_windows_femtovg_wgpu.exe
            windows_krokiet_on_windows_all_backends.exe
          if-no-files-found: error

      - name: Release
        uses: softprops/action-gh-release@v2
        if: ${{ github.ref == 'refs/heads/master' && vars.HAVE_PAT_REPOSITORY_TOKEN == '1' }}
        with:
          tag_name: "Nightly"
          files: |
            windows_krokiet_on_windows_skia_opengl.exe
            windows_krokiet_on_windows_skia_vulkan.exe
            windows_krokiet_on_windows_femtovg_wgpu.exe
            windows_krokiet_on_windows_all_backends.exe
          token: ${{ secrets.PAT_REPOSITORY }}

  container_4_12:
    runs-on: ubuntu-latest
    container:
      image: ghcr.io/mglolenstine/gtk4-cross:gtk-4.12
    steps:
      - uses: actions/checkout@v4
      - name: Install additional dependencies
        # gio is for the build script
        run: |
          dnf install curl wget2 wget unzip mingw64-bzip2.noarch mingw64-poppler mingw64-poppler-glib mingw32-python3 rust-gio-devel adwaita-icon-theme wine -y && dnf clean all -y
          curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
          source "$HOME/.cargo/env"
          rustup default 1.92.0
          rustup target add x86_64-pc-windows-gnu
          
          mkdir -p package
          curl -L https://github.com/electron/rcedit/releases/download/v2.0.0/rcedit-x64.exe -o rcedit-x64.exe

      - name: Cross compile for Windows - Release
        if: ${{ github.ref == 'refs/heads/master' }}
        run: |
          source "$HOME/.cargo/env"
          export PKG_CONFIG_PATH=/usr/lib64/pkgconfig:/usr/share/pkgconfig:$MINGW_PREFIX/lib/pkgconfig/:/usr/x86_64-w64-mingw32/lib/pkgconfig/
          cargo build --target=x86_64-pc-windows-gnu --release --locked
          cp target/x86_64-pc-windows-gnu/release/czkawka_gui.exe package/
          cp target/x86_64-pc-windows-gnu/release/czkawka_cli.exe package/
          
          export WINEPREFIX=$(mktemp -d)
          wine rcedit-x64.exe package/czkawka_gui.exe --set-icon czkawka_gui/icons/icon.ico

      - name: Cross compile for Windows - Debug
        if: ${{ github.ref != 'refs/heads/master' }}
        run: |
          source "$HOME/.cargo/env"
          export PKG_CONFIG_PATH=/usr/lib64/pkgconfig:/usr/share/pkgconfig:$MINGW_PREFIX/lib/pkgconfig/:/usr/x86_64-w64-mingw32/lib/pkgconfig/
          cargo build --target=x86_64-pc-windows-gnu --locked --profile fastci
          cp target/x86_64-pc-windows-gnu/fastci/czkawka_gui.exe package/
          cp target/x86_64-pc-windows-gnu/fastci/czkawka_cli.exe package/
          
          export WINEPREFIX=$(mktemp -d)
          wine rcedit-x64.exe package/czkawka_gui.exe --set-icon czkawka_gui/icons/icon.ico

      - name: Package
        run: |
          #!/bin/bash
          set -euo pipefail
          cp -t package $(pds -vv -f package/*.exe)
          # Add gdbus which is recommended on Windows (why?)
          cp $MINGW_PREFIX/bin/gdbus.exe package
          # Handle the glib schema compilation as well
          glib-compile-schemas $MINGW_PREFIX/share/glib-2.0/schemas/
          mkdir -p package/share/glib-2.0/schemas/
          cp -T $MINGW_PREFIX/share/glib-2.0/schemas/gschemas.compiled package/share/glib-2.0/schemas/gschemas.compiled
          # Pixbuf stuff, in order to get SVGs (scalable icons) to load
          mkdir -p package/lib/gdk-pixbuf-2.0
          cp -rT $MINGW_PREFIX/lib/gdk-pixbuf-2.0 package/lib/gdk-pixbuf-2.0
          cp -f -t package $(pds -vv -f $MINGW_PREFIX/lib/gdk-pixbuf-2.0/2.10.0/loaders/*)
          find package -iname "*.dll" -or -iname "*.exe" -type f -exec mingw-strip {} +

          cd package/share
          wget2 https://github.com/qarmin/czkawka/files/10832192/gtk4_theme.zip
          unzip gtk4_theme.zip
          rm gtk4_theme.zip
          cd ../..
          
          wget2 https://github.com/qarmin/Automated-Fuzzer/releases/download/test/libGL.zip
          unzip libGL.zip
          mv libEGL.dll package/
          mv libGLESv2.dll package/

      - name: Upload artifacts
        uses: actions/upload-artifact@v4
        with:
          name: czkawka-windows-${{ github.sha }}-4.12
          path: |
            ./package
          if-no-files-found: error

      - name: Prepare files to release
        run: |
          cd package
          zip -r ../windows_czkawka_gui_gtk_412.zip .
          cd ..

      - name: Release
        uses: softprops/action-gh-release@v2
        if: ${{ github.ref == 'refs/heads/master' && vars.HAVE_PAT_REPOSITORY_TOKEN == '1' }}
        with:
          tag_name: "Nightly"
          files: |
            windows_czkawka_gui_gtk_412.zip
          token: ${{ secrets.PAT_REPOSITORY }}



  windows-tests:
    runs-on: windows-latest
    steps:
      - uses: actions/checkout@v4

      - name: Setup rust version
        run: |
          rustup default 1.92.0

      # Both additional features and gtk gui are non-testable due really complicated setup of environment on Windows
      - name: Test
        run: |
          cargo test -p czkawka_core -p krokiet

================================================
FILE: .gitignore
================================================
/target
.idea/
*.iml
*~
*#
results*.txt
TestSuite*
*.snap
flatpak/
*.zip
*.zst
*.profraw
*.profdata
/lcov_report*
/report
ci_tester/target
ci_tester/Cargo.lock
krokiet/Cargo.lock
krokiet/target
*.json
*.mm_profdata
perf.data
perf.data.old
krokiet/ui/test.slint
*.html
misc/*/*.lock
misc/*/target/
misc/*/.idea
benchmarks
TestFiles
*.txt
.venv
charts*
*__pycache__*/
result
.direnv
cedinia/android/keystore/*.keystore
cedinia/docs

================================================
FILE: .mailmap
================================================
TheEvilSkeleton <theevilskeleton@riseup.net> Proprietary Chrome-chan <theevilskeleton@riseup.net>
Rafał Mikrut <mikrutrafal@protonmail.com> <mikrutrafal54@gmail.com> <41945903+qarmin@users.noreply.github.com>


================================================
FILE: .rustfmt.toml
================================================
newline_style = "Unix"
max_width = 180

# Enable only with nightly channel via - cargo +nightly fmt
imports_granularity = "Module"
group_imports = "StdExternalCrate"

================================================
FILE: Cargo.toml
================================================
[workspace]
members = [
    "czkawka_core",
    "czkawka_cli",
    "czkawka_gui",
    "krokiet",
    "cedinia"
]
exclude = [
    "misc/test_read_perf",
    "misc/test_image_perf",
    "misc/test_compilation_speed_size",
    "ci_tester",
]
resolver = "3"

# android-activity 0.6.0 panics when ANativeActivity_onCreate is called a second
# time (Activity recreation) because ndk_context::initialize_android_context
# asserts previous.is_none().  The fix (OnceLock, init once with Application ref)
# is merged to main but not yet released.  Remove this patch once 0.6.1+ ships.
# Affects only android-activity ^0.6 (cedinia); Slint's ^0.5 dependency is unaffected.
[patch.crates-io]
android-activity = { git = "https://github.com/rust-mobile/android-activity", rev = "43de2770b91b1b8ff870f00551f89f04062216cc" }

[profile.release]
# panic = "unwind" in opposite to "abort", allows to catch panic!()
# Since Czkawka parse different types of files with few libraries, it is possible
# that some files will cause crash, so at this moment I don't recommend to use "abort"
# until you are ready to occasional crashes
panic = "unwind"

# Should find more panics, that now are hidden from user - in long term it should decrease bugs in app
# It may cause some crashes, that are not handled via panic::catch_unwind, so feel free to disable it, if you want
overflow-checks = true

# LTO setting is disabled by default, because release mode is usually needed to develop app and compilation with LTO would take a lot of time
# But it is used to optimize release builds(and probably also in CI, where time is not so important as in local development)
# Fat lto, generates a lot smaller executable than thin lto
# Also using codegen-units = 1, to generate smaller binaries
#lto = "fat"
#codegen-units = 1

# Optimize all dependencies except application/workspaces, even in debug builds to get reasonable performance e.g. when opening images
[profile.dev.package."*"] # OPT PACKAGES
opt-level = 3 # OPT PACKAGES

[profile.fast_release]
inherits = "release"
incremental = true
overflow-checks = true
debug = false
strip = true

[profile.test]
debug-assertions = true # Forces to crash when there is duplicated item in cli
overflow-checks = true
opt-level = 3

# Fast compilation and small binary size
[profile.fastci]
inherits = "dev"
strip = "symbols"
debug = false
lto = "off"

[profile.rdebug]
inherits = "release"
debug = "full"
strip = "none"

# Unsafe profile, just to check, how fast and small app could be 
[profile.fastest]
inherits = "release"
panic = "abort"
lto = "fat"
strip = "symbols"
codegen-units = 1
opt-level = 3
debug = false

[workspace.lints]
clippy.unreachable = "allow" # This is a legitimate use case in most places
clippy.enum_variant_names = "allow" # Not always is possible to use different names
clippy.too_many_arguments = "allow" # Sometimes such functions are needed
clippy.type_complexity = "allow" # Sometimes such types are needed
clippy.collapsible_else_if = "allow" # Sometimes it is more readable
clippy.iter_on_single_items = "allow" # Allows to extend slice items, without needing to converting it when number of items change
clippy.needless_range_loop = "allow" # Sometimes it is more readable

clippy.doc_broken_link = "warn"
clippy.ip_constant = "warn"
clippy.unnecessary_semicolon = "warn"
clippy.trivially_copy_pass_by_ref = "warn"
clippy.indexing_slicing = "warn"
clippy.non_std_lazy_statics = "warn"
clippy.undocumented_unsafe_blocks = "warn"
clippy.manual_midpoint = "warn"
clippy.ignore_without_reason = "warn"
clippy.elidable_lifetime_names = "warn"
#clippy.duration_suboptimal_units = "warn"
#clippy.decimal_bitwise_operands = "warn"

clippy.allow_attributes = "warn"
clippy.assertions_on_result_states = "warn"
clippy.bool_to_int_with_if = "warn"
clippy.branches_sharing_code = "warn"
clippy.collection_is_never_read = "warn"
clippy.dbg_macro = "warn"
clippy.debug_assert_with_mut_call = "warn"
clippy.empty_enum_variants_with_brackets = "warn"
clippy.enum_glob_use = "warn"
clippy.equatable_if_let = "warn"
clippy.error_impl_error = "warn"
clippy.explicit_into_iter_loop = "warn"
clippy.explicit_iter_loop = "warn"
clippy.expl_impl_clone_on_copy = "warn"
clippy.fallible_impl_from = "warn"
clippy.filter_map_next = "warn"
clippy.flat_map_option = "warn"
clippy.float_cmp = "warn"
clippy.from_iter_instead_of_collect = "warn"
clippy.ignored_unit_patterns = "warn"
clippy.implicit_clone = "warn"
clippy.index_refutable_slice = "warn"
clippy.invalid_upcast_comparisons = "warn"
clippy.iter_filter_is_ok = "warn"
clippy.iter_filter_is_some = "warn"
clippy.iter_on_empty_collections = "warn"
clippy.iter_with_drain = "warn"
clippy.large_stack_arrays = "warn"
clippy.large_types_passed_by_value = "warn"
clippy.literal_string_with_formatting_args = "warn"
clippy.lossy_float_literal = "warn"
clippy.macro_use_imports = "warn"
clippy.manual_assert = "warn"
clippy.manual_instant_elapsed = "warn"
clippy.manual_is_variant_and = "warn"
clippy.manual_let_else = "warn"
clippy.manual_ok_or = "warn"
clippy.map_unwrap_or = "warn"
clippy.match_bool = "warn"
clippy.match_same_arms = "warn"
clippy.match_wildcard_for_single_variants = "warn"
clippy.mutex_atomic = "warn"
clippy.mutex_integer = "warn"
clippy.mut_mut = "warn"
clippy.needless_bitwise_bool = "warn"
clippy.needless_collect = "warn"
clippy.needless_continue = "warn"
clippy.needless_for_each = "warn"
clippy.needless_pass_by_ref_mut = "warn"
clippy.needless_pass_by_value = "warn"
clippy.needless_raw_strings = "warn"
clippy.nonstandard_macro_braces = "warn"
clippy.option_as_ref_cloned = "warn"
clippy.pathbuf_init_then_push = "warn"
clippy.path_buf_push_overwrite = "warn"
clippy.print_stderr = "warn"
clippy.print_stdout = "warn"
clippy.pub_underscore_fields = "warn"
clippy.question_mark = "warn"
clippy.range_minus_one = "warn"
clippy.range_plus_one = "warn"
clippy.redundant_clone = "warn"
clippy.redundant_else = "warn"
clippy.ref_binding_to_reference = "warn"
clippy.ref_option_ref = "warn"
clippy.same_functions_in_if_condition = "warn"
clippy.semicolon_if_nothing_returned = "warn"
clippy.set_contains_or_insert = "warn"
clippy.stable_sort_primitive = "warn"
clippy.string_add_assign = "warn"
clippy.string_slice = "warn"
clippy.suspicious_operation_groupings = "warn"
clippy.suspicious_xor_used_as_pow = "warn"
clippy.todo = "warn"
clippy.trait_duplication_in_bounds = "warn"
clippy.trivial_regex = "warn"
clippy.type_repetition_in_bounds = "warn"
clippy.unimplemented = "warn"
clippy.uninlined_format_args = "warn"
clippy.unnecessary_box_returns = "warn"
clippy.unnecessary_join = "warn"
clippy.unnecessary_wraps = "warn"
clippy.unnested_or_patterns = "warn"
clippy.unused_async = "warn"
clippy.unused_result_ok = "warn"
clippy.unused_rounding = "warn"
clippy.unused_self = "warn"
clippy.unwrap_used = "warn"
clippy.used_underscore_binding = "warn"
clippy.useless_let_if_seq = "warn"
clippy.use_self = "warn"
clippy.verbose_file_reads = "warn"
clippy.wildcard_imports = "warn"




================================================
FILE: Changelog.md
================================================
## Version 11.0.1 - 20.02.2026r
### Core
- Fixed issue with excluded folders not working on Windows - [#1808](https://github.com/qarmin/czkawka/pull/1808)

### GTK GUI
- Added missing Duration column to the similar videos tab, fixing a panic that occurred after video analysis - [#1793](https://github.com/qarmin/czkawka/pull/1793)
- Removed warning log message shown for non-existing excluded directories - [#1795](https://github.com/qarmin/czkawka/pull/1795)
- Fixed panic occurring when double-clicking a folder from the included or excluded directories list - [#1799](https://github.com/qarmin/czkawka/pull/1799)
- Updated to stable gtk4-rs 0.11 - [#1808](https://github.com/qarmin/czkawka/pull/1808)

### Krokiet
- Increased default maximum file size limit - [#1808](https://github.com/qarmin/czkawka/pull/1808)

## Prebuilt binaries
- Added new Krokiet wgpu binaries
- Added new all-in-one Krokiet binaries with all backends included

## CI
- Added Windows CI job running `cargo test`

## Version 11.0.0 - 14.02.2026r

### Breaking changes
#### Users
- The Czkawka GUI config file was migrated from a custom, broken format to JSON. All settings must be configured again. The old TXT file is not removed and can be used as a reference.
- In broken files mode, file type is no longer stored in cache. Existing cache files are incompatible with this version and will be automatically regenerated.
- The `Similarity Preset` enum in similar images mode was replaced with an integer argument `Max Difference` in range 0-40.
- HEIF images are now rotated only once instead of twice. Existing cache may contain incorrectly rotated images and should be regenerated by removing cache(but this requires manual intervention).

#### Devs
- Public API functions were slightly adjusted to avoid unnecessary cloning and referencing of copyable types.
- `Similarity` variables were renamed to `Difference`.
- Applications must call `register_image_decoding_hooks();` at startup to enable reading HEIF and JXL images.

### Core
- In similar images mode and previews, extension validation was removed in most cases - [#1623](https://github.com/qarmin/czkawka/pull/1623)
- Build-time and runtime versions of Musl and Glibc are now printed to logs - [#1604](https://github.com/qarmin/czkawka/pull/1604/files)
- Destination file removal during symlinking is now delayed to prevent data loss in case of failure - [#1672](https://github.com/qarmin/czkawka/pull/1672)
- Fixed invalid path canonicalization on Windows - [#1604](https://github.com/qarmin/czkawka/pull/1604/files)
- Comparison results are now deterministic - [#1654](https://github.com/qarmin/czkawka/pull/1654)
- Built-in JPEG previews are now read from RAW images when available - [#1655](https://github.com/qarmin/czkawka/pull/1655)
- Fixed silent panics when the logger could not write to the terminal - [#1658](https://github.com/qarmin/czkawka/pull/1658)
- Commit hash is now included in logs - [#1672](https://github.com/qarmin/czkawka/pull/1672)
- Improved and fixed logic for grouping similar images by similarity level - [#1685](https://github.com/qarmin/czkawka/pull/1685)
- Added scan time measurement - [#1674](https://github.com/qarmin/czkawka/pull/1674), [#1685](https://github.com/qarmin/czkawka/pull/1685)
- Added support for detecting broken video files in the broken files tool, via external ffmpeg and ffprobe - [#1745](https://github.com/qarmin/czkawka/pull/1745)
- Added new video optimizer mode to reencode videos with more efficient codecs and crop black/static bars, via external ffmpeg and ffprobe - [#1726](https://github.com/qarmin/czkawka/pull/1726), [#1745](https://github.com/qarmin/czkawka/pull/1745)
- Added new exif remover mode to remove selected EXIF tags from files - [#1745](https://github.com/qarmin/czkawka/pull/1745)
- Added new bad names mode to find and rename files with problematic names, e.g. non-ASCII characters or uppercase extensions - [#1754](https://github.com/qarmin/czkawka/pull/1754)
- Added ability to scan individual files, not only folders - [#1745](https://github.com/qarmin/czkawka/pull/1745)
- Limited supported image size to 2000 MP - [#1748](https://github.com/qarmin/czkawka/pull/1748)
- Automatic cleanup of outdated entries now runs at most once per week - [#1748](https://github.com/qarmin/czkawka/pull/1748)
- Added a function to manually remove outdated entries from cache files - [#1748](https://github.com/qarmin/czkawka/pull/1748)
- Added video property information, bitrate, codec, FPS, dimensions, duration for similar videos tool - [#1748](https://github.com/qarmin/czkawka/pull/1748)
- Fixed double rotation of HEIF images - [#1783](https://github.com/qarmin/czkawka/pull/1783)
- Fixed incorrect handling of some HEIF images by using built-in libheif-rs decoding methods - [#1783](https://github.com/qarmin/czkawka/pull/1783)

### CLI
- Enabled colored terminal output by default, can be disabled via feature flag - [#1672](https://github.com/qarmin/czkawka/pull/1672)
- Fixed a regression where results were not printed to the terminal - [#1672](https://github.com/qarmin/czkawka/pull/1672)
- Added `dry_run` and `move_to_trash` options to most of tools - [#1685](https://github.com/qarmin/czkawka/pull/1685)
- Fixed unbound `--excluded-extensions` option - [#1748](https://github.com/qarmin/czkawka/pull/1748)
- Added new modes: video optimizer, exif remover, and bad names - [#1760](https://github.com/qarmin/czkawka/pull/1760)

### GTK GUI
- Restored the sort button and fixed crashes related to sorting - [#1623](https://github.com/qarmin/czkawka/pull/1623)
- Configuration now uses JSON format instead of a custom one - [#1623](https://github.com/qarmin/czkawka/pull/1623)
- Added multithreaded creation of hard links, symbolic links, and file removal - [#1672](https://github.com/qarmin/czkawka/pull/1672)
- Fixed a GTK regression that caused image previews to appear extremely small - [#1658](https://github.com/qarmin/czkawka/pull/1658)
- Added a button to easily swap between compared images - [#1658](https://github.com/qarmin/czkawka/pull/1658)
- Performed refactoring to evaluate possible migration to GTK 5, currently not very feasible - [#1658](https://github.com/qarmin/czkawka/pull/1658)
- Fixed sorting by size in big files mode - [#1691](https://github.com/qarmin/czkawka/pull/1691)
- Fixed freezes caused by an invalid function declaration in gtk4-rs - [#1691](https://github.com/qarmin/czkawka/pull/1691)
- Added an About popup informing that Krokiet is the successor application - [#1718](https://github.com/qarmin/czkawka/pull/1718)
- Added `--cache` and `--config` CLI options to open cache and config paths - [#1745](https://github.com/qarmin/czkawka/pull/1745)
- Added shortest and longest path selection modes - [#1738](https://github.com/qarmin/czkawka/pull/1738)

### Krokiet
- Added a new logo - [#1726](https://github.com/qarmin/czkawka/pull/1726)
- Added video thumbnails, single and grid view - [#1714](https://github.com/qarmin/czkawka/pull/1714)
- Displayed cache, thumbnails, and logs size in settings - [#1714](https://github.com/qarmin/czkawka/pull/1714)
- Added sorting by clicking column headers - [#1718](https://github.com/qarmin/czkawka/pull/1718)
- Introduced a default limit of 500 message lines to prevent freezes caused by slow TextEdit performance - [#1718](https://github.com/qarmin/czkawka/pull/1718)
- Slightly increased font sizes to improve readability - [#1726](https://github.com/qarmin/czkawka/pull/1726)
- Added runtime application scaling, with some limitations - [#1726](https://github.com/qarmin/czkawka/pull/1726)
- Cleared messages in the bottom panel when a new scan starts - [#1726](https://github.com/qarmin/czkawka/pull/1726)
- Fixed a crash when clicking previous results while a new scan was in progress - [#1726](https://github.com/qarmin/czkawka/pull/1726)
- Changed default behavior to move files to trash instead of permanently deleting them - [#1726](https://github.com/qarmin/czkawka/pull/1726)
- Added a notification dialog when the application cannot be opened - [#1745](https://github.com/qarmin/czkawka/pull/1745)
- Added `--cache` and `--config` CLI options to open cache and config paths - [#1745](https://github.com/qarmin/czkawka/pull/1745)
- Added new modes: video optimizer, exif remover, and bad names - [#1726](https://github.com/qarmin/czkawka/pull/1726), [#1745](https://github.com/qarmin/czkawka/pull/1745), [#1754](https://github.com/qarmin/czkawka/pull/1754)
- Modification dates are now displayed in local time instead of UTC - [#1748](https://github.com/qarmin/czkawka/pull/1748)
- Added a new menu option to manually remove outdated cache entries - [#1748](https://github.com/qarmin/czkawka/pull/1748)
- Added an optional scan completion sound, hidden behind the `audio` feature flag - [#1754](https://github.com/qarmin/czkawka/pull/1754)
- Fixed an issue where sort options were not updating due to multiple invalid signal connections - [#1760](https://github.com/qarmin/czkawka/pull/1760)
- Added support for creating hard links and symbolic links - [#1760](https://github.com/qarmin/czkawka/pull/1760)
- Added shortest and longest path selection modes - [#1738](https://github.com/qarmin/czkawka/pull/1738)
- Fixed crashes caused by selection cache desynchronization - [#1783](https://github.com/qarmin/czkawka/pull/1783)

### External
- Wine 10.20 includes a bugfix that resolves crashes when opening file dialogs in Czkawka GUI - [Wine 49987 issue](https://bugs.winehq.org/show_bug.cgi?id=49987)

### Prebuilt binaries
- Krokiet Windows binaries with the Skia backend are now available, this only works with MSVC build and requires Visual C++ Redistributable
- Intel Mac binaries are now built with the latest available macOS version, currently 15
- Windows prebuilt binaries now bundle libEGL and libGLES, which fixes issues running GTK 4.12 builds on some systems, GTK 4.6 builds are no longer provided
- Krokiet macOS OpenGL binaries are deprecated due to outdated and broken Apple OpenGL drivers, Skia Vulkan binaries are now provided and recommended
- Some Linux binaries are now built on Ubuntu 24.04 to support a newer libheif-rs with improvements, including reading images with pixel formats other than rgb8
- Windows binaries now use an 8 MB stack size to match Linux, fixing stack overflows in debug builds
- Windows binaries now include built-in icons

## Version 10.0.0 - 18.08.2025r
### Breaking changes
#### Users
- Some languages now have unified names in Crowdin (e.g. `es` → `es-ES`). The GUI may not find them and will fall back to the default language.
- Cache files now use memory limits and are incompatible with previous versions.
- Cli image filter argument changed from `faussian` to `gaussian`

#### Devs
- `stop_flag` is now required argument in most of the core functions
- Visibility of some core functions has been reduced to `pub(crate)`
- The modules in czkawka_core have been split and reorganized a bit - imports need to be adjusted, although the actual behavior and item names should not be changed too much

### Core
- Replaced `println`/`eprintln` with logging functions - [#1478](https://github.com/qarmin/czkawka/pull/1478)
- Slightly improved cache loading and saving speed - [#1478](https://github.com/qarmin/czkawka/pull/1478)
- Messages and panics are now also logged to a file (can be disabled by setting the `DISABLE_FILE_LOGGING` environment variable) - [#1508](https://github.com/qarmin/czkawka/pull/1508)
- Added a 8GB memory limit when loading or saving cache to avoid out-of-memory crashes with broken cache files - [#1508](https://github.com/qarmin/czkawka/pull/1508)
- Czkawka binaries are now reproducible - [#1565](https://github.com/qarmin/czkawka/pull/1565)
- Added protection against deleting a folder that is no longer empty since the scan - [#1566](https://github.com/qarmin/czkawka/pull/1566)
- Replaced `pdf-rs` with the more popular `lopdf` library, which also has fewer dependencies - [#1566](https://github.com/qarmin/czkawka/pull/1566)
- Replaced `imagepipe` + `rawloader` with `rawler` which is still supported and faster to decode raw files - [#1572](https://github.com/qarmin/czkawka/pull/1572)
- Added more configuration options in video finder - [#1578](https://github.com/qarmin/czkawka/pull/1578)
- `fast_image_resize` feature is removed and `image_hasher/fast_resize_unstable` is enabled unconditionally - [#1586](https://github.com/qarmin/czkawka/pull/1586)

### CLI
- Improved logic for deleting files and added progress bar for this operation - [#1571](https://github.com/qarmin/czkawka/pull/1571)

### GTK GUI
- New icons - less visually appealing, but created by me and released under a truly free CC BY license - [#1478](https://github.com/qarmin/czkawka/pull/1478)
- Fixed crash when removing outdated cache - [#1508](https://github.com/qarmin/czkawka/pull/1508)
- Fixed missing file and folder names for similar videos in reference folders - [#1520](https://github.com/qarmin/czkawka/pull/1520)
- Fixed crashes when the SVG pixbuf loader is not available - [#1565](https://github.com/qarmin/czkawka/pull/1565)
- Fixed using custom select on referenced folders - [#1581](https://github.com/qarmin/czkawka/pull/1581)

### Krokiet
- Added the ability to select multiple items with mouse and keyboard - [#1478](https://github.com/qarmin/czkawka/pull/1478)
- Added sort button - [#1501](https://github.com/qarmin/czkawka/pull/1501)
- Window size is now remembered - [#1508](https://github.com/qarmin/czkawka/pull/1508)
- Added translations - [#1508](https://github.com/qarmin/czkawka/pull/1508), [#1513](https://github.com/qarmin/czkawka/pull/1513)
- Improved popup styling - [#1520](https://github.com/qarmin/czkawka/pull/1520)
- Dark and light themes can now be switched at runtime - [#1520](https://github.com/qarmin/czkawka/pull/1520)
- Changed icon color to white for dark theme to improve visibility - [#1520](https://github.com/qarmin/czkawka/pull/1520)
- Added the ability to hide text on buttons - [#1520](https://github.com/qarmin/czkawka/pull/1520)
- Multithreaded removing, moving, and renaming of files - [#1565](https://github.com/qarmin/czkawka/pull/1565)
- Files that fail to be removed, renamed, or moved are no longer deleted from the results list - [#1565](https://github.com/qarmin/czkawka/pull/1565)
- Progress information is shown when removing, renaming, or moving files, with the ability to stop the process - [#1565](https://github.com/qarmin/czkawka/pull/1565)
- Folders to scan can be now set via cli e.g. `krokiet /home/rafal` - for more info see `krokiet --help` - [#1566](https://github.com/qarmin/czkawka/pull/1566)
- Improved appearance of bottom directories panel - [#1569](https://github.com/qarmin/czkawka/pull/1569)
- Some buttons, are disabled, when there is no files selected - [#1586](https://github.com/qarmin/czkawka/pull/1586)
- Added info about the number of items selected to delete - [#1589](https://github.com/qarmin/czkawka/pull/1589)
- Limit image preview to max 1024 width/height, to speedup preview loading and fixing crash in software renderer - [#1590](https://github.com/qarmin/czkawka/pull/1590) 

### External
- There is a new unofficial Tauri-based frontend for Czkawka - [Czkawka Tauri](https://github.com/shixinhuang99/czkawka-tauri)
- Czkawka 8.0.0 is now available in Debian Sid - [Cli](https://packages.debian.org/sid/czkawka-cli)/[Gui Gtk](https://packages.debian.org/sid/czkawka-gui) 

### CI
- Compilation for 32-bit targets is now checked in CI
- Czkawka binaries are now checked for reproducibility in CI

### Prebuilt binaries
- AppImage binaries are no longer provided due to random bugs (not present in other packaging formats) and minimal added value compared to prebuilt Linux binaries or Flatpak
- HEIF Mac binaries are now provided
- CI now builds Linux binaries on Ubuntu 22.04 instead of 20.04(github removed 20.04 images)
- `musl` builds of `czkawka_cli` are now provided instead of `eyra` builds (slightly easier to maintain). GUI builds are not included due to limitations of `musl` and `eyra` :(
- Prebuilt Windows console binaries are no longer provided - logs are now saved to a file, which is easier to read than terminal output
- Skia opengl and vulkan backends are provided for Krokiet on Linux(no binaries on Windows, because don't know how to replace `sed`)
- Prebuilt binaries are now build with `lto fat` instead `lto thin` and `codegen-units=1` to greatly reduce binary size(~25% smaller binaries)

## Version 9.0.0 - 16.03.2025r

## Breaking changes

- Video, Duplicate (smaller prehash size), and Image cache (EXIF orientation + faster resize implementation) are incompatible with previous versions and need to be regenerated.

### Core
- Automatically rotating all images based on their EXIF orientation - [#1368](https://github.com/qarmin/czkawka/pull/1368)
- Fixed a crash caused by negative time values on some operating systems - [#1369](https://github.com/qarmin/czkawka/pull/1369)
- Updated `vid_dup_finder`; it can now detect similar videos shorter than 30 seconds - [#1425](https://github.com/qarmin/czkawka/pull/1425)
- Added support for more JXL image formats (using a built-in JXL → image-rs converter) - [#1425](https://github.com/qarmin/czkawka/pull/1425)
- Improved duplicate file detection by using a larger, reusable buffer for file reading - [#1425](https://github.com/qarmin/czkawka/pull/1425)
- Added an option for significantly faster image resizing to speed up image hashing - [#1458](https://github.com/qarmin/czkawka/pull/1458)
- Logs now include information about the operating system and compiled app features(only x86_64 versions) - [#1458](https://github.com/qarmin/czkawka/pull/1458)
- Added size progress tracking in certain modes - [#1458](https://github.com/qarmin/czkawka/pull/1458), [#1464](https://github.com/qarmin/czkawka/pull/1464)
- Ability to stop hash calculations for large files mid-process - [#1458](https://github.com/qarmin/czkawka/pull/1458)
- Implemented multithreading to speed up filtering of hard links - [#1458](https://github.com/qarmin/czkawka/pull/1458)
- Reduced prehash read file size to a maximum of 4 KB - [#1458](https://github.com/qarmin/czkawka/pull/1458)
- Fixed a slowdown at the end of scans when searching for duplicates on systems with a high number of CPU cores - [#1460](https://github.com/qarmin/czkawka/pull/1460)
- Improved scan cancellation speed when collecting files to check - [#1460](https://github.com/qarmin/czkawka/pull/1460)
- Added support for configuring config/cache paths using the `CZKAWKA_CONFIG_PATH` and `CZKAWKA_CACHE_PATH` environment variables - [#1464](https://github.com/qarmin/czkawka/pull/1464)
- Fixed a crash in debug mode when checking broken files named `.mp3` - [#1464](https://github.com/qarmin/czkawka/pull/1464)
- Catching panics from symphonia crashes in broken files mode - [#1466](https://github.com/qarmin/czkawka/pull/1466)
- Printing a warning, when using `panic=abort`(that may speed up app and cause occasional crashes) - [#1466](https://github.com/qarmin/czkawka/pull/1466)

### Krokiet
- Changed the default tab to "Duplicate Files" - [#1368](https://github.com/qarmin/czkawka/pull/1368)

### GTK GUI
- Added a window icon in Wayland - [#1400](https://github.com/qarmin/czkawka/pull/1400)
- Disabled the broken sort button - [#1400](https://github.com/qarmin/czkawka/pull/1400)

### CLI
- Added `-N` and `-M` flags to suppress printing results/warnings to the console - [#1464](https://github.com/qarmin/czkawka/pull/1464)
- Fixed an issue where messages were not cleared at the end of a scan - [#1464](https://github.com/qarmin/czkawka/pull/1464)
- Ability to disable cache via `-H` flag(useful for benchmarking) - [#1466](https://github.com/qarmin/czkawka/pull/1466)

### Prebuild-binaries
- This release is last version, that supports Ubuntu 20.04 - github actions drops this OS in its runners
- Linux and Mac binaries now are provided with two options x86_64 and arm64
- Arm linux builds needs at least Ubuntu 24.04
- Gtk 4.12 is used to build windows gtk gui instead gtk 4.10
- Dropping support for snap builds - too much time-consuming to maintain and testing(also it is broken currently)
- Removed native windows build krokiet version - now it is available only cross-compiled version from linux(should not be any difference) 

## Version 8.0.0 - 11.10.2024r

### Breaking changes

- Due to the removal image_type from image struct, old cache files are incompatible with new version and should be regenerated from scratch(it uses new name)
- Some CLI arguments could change short name, due fixing ambiguous names

### Known regressions

- Slint 1.8 which Krokiet uses requires femtovg 0.9.2 which broke font rendering - https://github.com/slint-ui/slint/issues/6298

### CI

- Providing nightly builds - [#1360](https://github.com/qarmin/czkawka/pull/1360) - https://github.com/qarmin/czkawka/releases/tag/Nightly
- Added finding duplicated options in CLI - [#1364](https://github.com/qarmin/czkawka/pull/1364)

### Core

- Removed some unnecessary panics - [#1354](https://github.com/qarmin/czkawka/pull/1354)
- Simplified usage of structures when sending/receiving progress information - [#1354](https://github.com/qarmin/czkawka/pull/1354)
- Added Median hash algorithm - [#1354](https://github.com/qarmin/czkawka/pull/1354)
- Fixed compilation with Rust >=1.80 - [#1354](https://github.com/qarmin/czkawka/pull/1354)
- Extracted tool input parameters, that helped to find not used parameters - [#1354](https://github.com/qarmin/czkawka/pull/1354)
- Added new mod to find similar music only in groups with similar title tag - [#1354](https://github.com/qarmin/czkawka/pull/1354)
- Printing to file/console no longer uses two backslashes in windows paths - [#1354](https://github.com/qarmin/czkawka/pull/1354)
- Fixed panic when failed to decode raw picture - [#1355](https://github.com/qarmin/czkawka/pull/1355)
- Remove useless saving/loading cache when there is no files to check - [#1358](https://github.com/qarmin/czkawka/pull/1358)
- Filtering hard links on windows - [#1316](https://github.com/qarmin/czkawka/pull/1316)
- Added jxl support - [#1358](https://github.com/qarmin/czkawka/pull/1358)
- Added avif support(via external C library, not enabled by default) - [#1358](https://github.com/qarmin/czkawka/pull/1358)
- Integer overflow are enabled by default(prepare for reporting bugs, slower performance and general unstability) - [#1358](https://github.com/qarmin/czkawka/pull/1358)
- Fixed crash when loading invalid image cache - [#1230](https://github.com/qarmin/czkawka/pull/1230)

### Krokiet

- Fixed invalid default hash size in similar images - [#1354](https://github.com/qarmin/czkawka/pull/1354)
- Fixed and added more input parameters to the application - [#1354](https://github.com/qarmin/czkawka/pull/1354)
- Fixed problem with loading invalid preset - [#1226](https://github.com/qarmin/czkawka/pull/1226)
- Fixed crash when using 8 hash size with small similarity - [#1359](https://github.com/qarmin/czkawka/pull/1359)
- Disabling buttons when no files were found - [#1359](https://github.com/qarmin/czkawka/pull/1359)
- Changed way to close/open panel at bottom - [#1359](https://github.com/qarmin/czkawka/pull/1359)
- Modify logo a little - [#1359](https://github.com/qarmin/czkawka/pull/1359)
- Avoid errors when trying to load preview of not supported file - [#1359](https://github.com/qarmin/czkawka/pull/1359)
- Added ability to show preview of referenced folders - [#1359](https://github.com/qarmin/czkawka/pull/1359)
- Enable selecting with space and jumping over entries with arrows and opening with enter - [#1359](https://github.com/qarmin/czkawka/pull/1359)
- Added button to rename files with invalid extension - [#1364](https://github.com/qarmin/czkawka/pull/1364)

### GTK GUI

- Fixed and added more input parameters to the application - [#1355](https://github.com/qarmin/czkawka/pull/1355)
- Added option to use external libraries instead gtk pixbuf loader for previews - [#1358](https://github.com/qarmin/czkawka/pull/1358)
- Using static runtime with zstd compression in appimage - [#1350](https://github.com/qarmin/czkawka/pull/1355)
- Restoring flatpak builds - [#1275](https://github.com/qarmin/czkawka/pull/1275)
- [External] Mac homebrew version of app - https://formulae.brew.sh/formula/czkawka

### CLI

- Added options to find/remove images by size - [#1255](https://github.com/qarmin/czkawka/pull/1255)
- Fixed and added more input parameters to the application - [#1354](https://github.com/qarmin/czkawka/pull/1354)
- Fixed crash when stopping scan multiple times - [#1355](https://github.com/qarmin/czkawka/pull/1355)
- Print results also in debug build - [#1355](https://github.com/qarmin/czkawka/pull/1355)
- Added support for selecting reference directories - [#1364](https://github.com/qarmin/czkawka/pull/1364)

## Version 7.0.0 - 19.02.2024r

### BREAKING CHANGES

- Reducing size of cache files, made old cache files incompatible with new version
- `-C` in CLI now saves as compact json

### GTK GUI

- Added drag&drop support for included/excluded folders - [#1106](https://github.com/qarmin/czkawka/pull/1106)
- Added information where are saved scan results - [#1102](https://github.com/qarmin/czkawka/pull/1102)

### CLI

- Providing full static rust binary with [Eyra](https://github.com/sunfishcode/eyra) - [#1102](https://github.com/qarmin/czkawka/pull/1102)
- Fixed duplicated `-c` argument, now saving as compact json is handled via `-C` - [#1153](https://github.com/qarmin/czkawka/pull/1153)
- Added scan progress bar - [#1183](https://github.com/qarmin/czkawka/pull/1183)
- Clean and safe cancelling of scan - [#1183](https://github.com/qarmin/czkawka/pull/1183)
- Unification of CLI arguments - [#1183](https://github.com/qarmin/czkawka/pull/1183)
- Hardlink support for similar images/videos - [#1201](https://github.com/qarmin/czkawka/pull/1201)

### Krokiet GUI

- Initial release of new gui - [#1102](https://github.com/qarmin/czkawka/pull/1102)

### Core

- Using normal crossbeam channels instead of asyncio tokio channel - [#1102](https://github.com/qarmin/czkawka/pull/1102)
- Fixed tool type when using progress of empty directories - [#1102](https://github.com/qarmin/czkawka/pull/1102)
- Fixed missing json support when saving size and name duplicate results - [#1102](https://github.com/qarmin/czkawka/pull/1102)
- Fix cross-compiled debug windows build - [#1102](https://github.com/qarmin/czkawka/pull/1102)
- Added bigger stack size by default(fixes stack overflow in some musl apps) - [#1102](https://github.com/qarmin/czkawka/pull/1102)
- Added optional libraw dependency(better single-core performance and support more raw files) - [#1102](https://github.com/qarmin/czkawka/pull/1102)
- Speedup checking for wildcards and fix invalid recognizing long excluded items - [#1152](https://github.com/qarmin/czkawka/pull/1152)
- Big speedup when searching for empty folders(especially with multithreading + cached FS schema) - [#1152](https://github.com/qarmin/czkawka/pull/1152)
- Collecting files for scan can be a lot of faster due lazy file metadata gathering - [#1152](https://github.com/qarmin/czkawka/pull/1152)
- Fixed recognizing not accessible folders as non-empty - [#1152](https://github.com/qarmin/czkawka/pull/1152)
- Unifying code for collecting files to scan - [#1159](https://github.com/qarmin/czkawka/pull/1159)
- Decrease memory usage when collecting files by removing unused fields in custom file entries structs - [#1159](https://github.com/qarmin/czkawka/pull/1159)
- Decrease a little size of cache by few percents and improve loading/saving speed - [#1159](https://github.com/qarmin/czkawka/pull/1159)
- Added ability to remove from scan files with excluded extensions - [#1184](https://github.com/qarmin/czkawka/pull/1102)
- Fixed not showing in similar images results, files with same hashes when using reference folders - [#1184](https://github.com/qarmin/czkawka/pull/1102)
- Optimize release binaries with LTO(~25/50% smaller, ~5/10% faster) - [#1184](https://github.com/qarmin/czkawka/pull/1102)

## Version 6.1.0 - 15.10.2023r

- BREAKING CHANGE - Changed cache saving method, deduplicated, optimized and simplified procedure(all files needs to be hashed again) - [#1072](https://github.com/qarmin/czkawka/pull/1072), [#1086](https://github.com/qarmin/czkawka/pull/1086)
- Remove up to 340ms of delay when waiting for results - [#1070](https://github.com/qarmin/czkawka/pull/1070)
- Added logger with useful info when debugging app (level can be adjusted via e.g. `RUST_LOG=debug` env) - [#1072](https://github.com/qarmin/czkawka/pull/1072), [#1070](https://github.com/qarmin/czkawka/pull/1070)
- Core code cleanup - [#1072](https://github.com/qarmin/czkawka/pull/1072), [#1070](https://github.com/qarmin/czkawka/pull/1070), [#1082](https://github.com/qarmin/czkawka/pull/1082)
- Updated list of bad extensions and support for finding invalid jar files - [#1070](https://github.com/qarmin/czkawka/pull/1070)
- More default excluded items on Windows(like pagefile) - [#1074](https://github.com/qarmin/czkawka/pull/1074)
- Unified printing/saving method to files/terminal and fixed some differences/bugs - [#1082](https://github.com/qarmin/czkawka/pull/1082)
- Uses fun_time library to print how much functions take time - [#1082](https://github.com/qarmin/czkawka/pull/1082)
- Added exporting results into json file format - [#1083](https://github.com/qarmin/czkawka/pull/1083)
- Added new test/regression suite for CI - [#1083](https://github.com/qarmin/czkawka/pull/1083)
- Added ability to use relative paths - [#1083](https://github.com/qarmin/czkawka/pull/1083)
- Allowed removing similar images/videos/music from cli - [#1087](https://github.com/qarmin/czkawka/pull/1087)
- Added info about saving/loading items to cache in duplicate and music mode - [#1091](https://github.com/qarmin/czkawka/pull/1091)
- Fixed number of files to check in duplicate mode - [#1091](https://github.com/qarmin/czkawka/pull/1091)
- Added support for qoi image format(without preview yet) - [e92a](https://github.com/qarmin/czkawka/commit/e92a8a65de9bd1250be482dbce06959125554849)
- Fixed stability problem, that could remove invalid file in CLI - [#1083](https://github.com/qarmin/czkawka/pull/1083)
- Fix Windows gui crashes by using gtk 4.6 instead 4.8 or 4.10 - [#992](https://github.com/qarmin/czkawka/pull/992)
- Fixed printing info about duplicated music files - [#1016](https://github.com/qarmin/czkawka/pull/1016)
- Fixed printing info about duplicated video files - [#1017](https://github.com/qarmin/czkawka/pull/1017)

## Version 6.0.0 - 11.06.2023r

- Add finding similar audio files by content - [#970](https://github.com/qarmin/czkawka/pull/970)
- Allow to find duplicates by name/size at once - [#956](https://github.com/qarmin/czkawka/pull/956)
- Fix, simplify and speed up finding similar images - [#983](https://github.com/qarmin/czkawka/pull/956)
- Fixed bug when cache for music tags not worked - [#970](https://github.com/qarmin/czkawka/pull/970)
- Allow to set number of threads from CLI - [#972](https://github.com/qarmin/czkawka/pull/972)
- Fix problem with invalid item sorting in bad extensions mode - [#972](https://github.com/qarmin/czkawka/pull/972)
- Big refactor/cleaning of code - [#956](https://github.com/qarmin/czkawka/pull/956)/[#970](https://github.com/qarmin/czkawka/pull/970)/[#972](https://github.com/qarmin/czkawka/pull/972)
- Use builtin gtk webp loader for previews - [#923](https://github.com/qarmin/czkawka/pull/923)
- Fixed docker build - [#947](https://github.com/qarmin/czkawka/pull/947)
- Restore snap builds broken since GTk 4 port - [#965](https://github.com/qarmin/czkawka/pull/947)
- Instruction how to build native ARM64 binaries on Mac - [#945](https://github.com/qarmin/czkawka/pull/945)/[#971](https://github.com/qarmin/czkawka/pull/971)

## Version 5.1.0 - 19.02.2023r

- Added sort button - [#894](https://github.com/qarmin/czkawka/pull/894)
- Allow to set number of thread used to scan - [#839](https://github.com/qarmin/czkawka/pull/839)
- Faster similar images comparing with reference folders - [#826](https://github.com/qarmin/czkawka/pull/826)
- Update to clap 4 - [#878](https://github.com/qarmin/czkawka/pull/878)
- Use FileChooserNative instead FileChooserDialog - [#894](https://github.com/qarmin/czkawka/pull/894)
- Fix invalid music tags in music files when using reference folders - [#894](https://github.com/qarmin/czkawka/pull/894)
- Updated pdf dependency(a lot of less amount of broken pdf false positives) - [#894](https://github.com/qarmin/czkawka/pull/894)
- Changed strange PDF error message - "Try at" - [#894](https://github.com/qarmin/czkawka/pull/894)
- Treat extensions Mp4 and m4v as identical - [#834](https://github.com/qarmin/czkawka/pull/834)
- Improve thumbnail quality - [#895](https://github.com/qarmin/czkawka/pull/895)
- Verify if hardlinking works, and if not, disable button with proper message - [#881](https://github.com/qarmin/czkawka/pull/881)
- Apply some pydantic clippy lints on project - [#901](https://github.com/qarmin/czkawka/pull/901)

## Version 5.0.2 - 30.08.2022r

- Fixed problem with missing some similar images when using similarity > 0 - [#799](https://github.com/qarmin/czkawka/pull/799)
- Prebuilt Linux binaries are compiled without heif support - [24b](https://github.com/qarmin/czkawka/commit/24b64a32c65904c506b54270f0977ccbe5098cc8)
- Similar videos stops to proceed video after certain amount of time(fixes freezes) - [#815](https://github.com/qarmin/czkawka/pull/815)
- Add --version argument for czkawka_cli - [#806](https://github.com/qarmin/czkawka/pull/806)
- Rewrite a little nonsense message about minimal file size - [#807](https://github.com/qarmin/czkawka/pull/807)

## Version 5.0.1 - 03.08.2022r

- Fixed problem with removing ending slash with empty disk window path - [975](https://github.com/qarmin/czkawka/commit/97563a7b2a70fb5fcf6463f28069e6ea3b0ff5c2)
- Added to CLI bad extensions mode - [#795](https://github.com/qarmin/czkawka/pull/795)
- Restore default sorting method in CLI where finding biggest files - [5d7](https://github.com/qarmin/czkawka/commit/5d79dc7ccfee6d5426e37c4e6a860fa555c5927a)
- Added tests to CI - [#791](https://github.com/qarmin/czkawka/pull/791)
- Show error message when all directories are set as reference folders - [#795](https://github.com/qarmin/czkawka/pull/795)
- Added more info about new requirements on Linux - [#795](https://github.com/qarmin/czkawka/pull/795)

## Version 5.0.0 - 28.07.2022r

- GUI ported to use GTK 4 - [#466](https://github.com/qarmin/czkawka/pull/466)
- Use multithreading and improved algorithm to compare image hashes - [#762](https://github.com/qarmin/czkawka/pull/762)
- Resize preview with window - [#466](https://github.com/qarmin/czkawka/pull/466)
- Fix removing only one item from list view - [#466](https://github.com/qarmin/czkawka/pull/466)
- Fix showing help command in duplicate CLI mode - [#720](https://github.com/qarmin/czkawka/pull/720)
- Fix freeze when not choosing any tag in similar music mode - [#732](https://github.com/qarmin/czkawka/pull/732)
- Fix preview of files with non-lowercase extensions - [#694](https://github.com/qarmin/czkawka/pull/694)
- Read more tags from music files - [#705](https://github.com/qarmin/czkawka/pull/705)
- Improve checking for invalid extensions - [#705](https://github.com/qarmin/czkawka/pull/705), [#747](https://github.com/qarmin/czkawka/pull/747), [#749](https://github.com/qarmin/czkawka/pull/749)
- Support for finding invalid PDF files - [#705](https://github.com/qarmin/czkawka/pull/705)
- Re-enable checking for broken music files(`libasound.so.2` no longer needed) - [#705](https://github.com/qarmin/czkawka/pull/705)
- Fix disabled ui when using invalid settings in similar music - [#740](https://github.com/qarmin/czkawka/pull/740)
- Speedup searching for invalid extensions - [#740](https://github.com/qarmin/czkawka/pull/740)
- Support for finding the smallest files - [#741](https://github.com/qarmin/czkawka/pull/741)
- Improved Windows CI - [#749](https://github.com/qarmin/czkawka/pull/749)
- Ability to check for broken files by types - [#749](https://github.com/qarmin/czkawka/pull/749)
- Add heif and Webp files support - [#750](https://github.com/qarmin/czkawka/pull/750)
- Use in CLI Clap library instead StructOpt - [#759](https://github.com/qarmin/czkawka/pull/759)
- Multiple directories can be added via Manual Add button - [#782](https://github.com/qarmin/czkawka/pull/782)
- Option to exclude files from other filesystems in GUI(Linux) - [#776](https://github.com/qarmin/czkawka/pull/776)

## Version 4.1.0 - 24.04.2022r

- New mode - finding files whose content not match with their extension - [#678](https://github.com/qarmin/czkawka/pull/678)
- Builtin icons - no more invalid, theme/OS dependent icons - [#659](https://github.com/qarmin/czkawka/pull/659)
- Big(usually 2x) speedup of showing previews of images(both previews in scan and compare window) - [#660](https://github.com/qarmin/czkawka/pull/660)
- Fix selecting records by custom selection popup - [#632](https://github.com/qarmin/czkawka/pull/632)
- Support more tags when comparing music files - [#590](https://github.com/qarmin/czkawka/pull/590)
- Fix not proper selecting path - [#656](https://github.com/qarmin/czkawka/pull/656)
- No more popups during scan for similar videos on Windows - [#656](https://github.com/qarmin/czkawka/pull/656) - external change [4056](https://github.com/Farmadupe/ffmpeg_cmdline_utils/commit/405687514f9d9e8984cbe2547c53e85b71e08b27)
- Custom selecting is now case-insensitive by default - [#657](https://github.com/qarmin/czkawka/pull/657)
- Better approximate comparison of tags - [#641](https://github.com/qarmin/czkawka/pull/641)
- Fix search problem due accumulated stop events - [#623](https://github.com/qarmin/czkawka/pull/623)
- Option to ignore other filesystems in Unix OS(for now only in CLI) - [#673](https://github.com/qarmin/czkawka/pull/673)
- Fix file hardlinking on Windows - [#668](https://github.com/qarmin/czkawka/pull/668)
- Support for case-insensitive name grouping of files - [#669](https://github.com/qarmin/czkawka/pull/669)
- Directories for search GUI can be passed by CLI - [#677](https://github.com/qarmin/czkawka/pull/677)
- Prevent from getting non respond app notification from display servers - [#625](https://github.com/qarmin/czkawka/pull/625)

## Version 4.0.0 - 20.01.2022r

- Multithreading support for collecting files to check(2/3x speedup on 4 thread processor and SSD) - [#502](https://github.com/qarmin/czkawka/pull/502), [#504](https://github.com/qarmin/czkawka/pull/504)
- Add multiple translations - Polish, Italian, French, German, Russian ... - [#469](https://github.com/qarmin/czkawka/pull/469), [#508](https://github.com/qarmin/czkawka/pull/508), [5be](https://github.com/qarmin/czkawka/commit/5be801e76395855f07ab1da43cdbb8bd0b843834)
- Add support for finding similar videos - [#460](https://github.com/qarmin/czkawka/pull/460)
- GUI code refactoring and search code unification - [#462](https://github.com/qarmin/czkawka/pull/462), [#531](https://github.com/qarmin/czkawka/pull/531)
- Fixed crash when trying to hard/symlink 0 files - [#462](https://github.com/qarmin/czkawka/pull/462)
- GTK 4 compatibility improvements for future change of toolkit - [#467](https://github.com/qarmin/czkawka/pull/467), [#468](https://github.com/qarmin/czkawka/pull/468), [#473](https://github.com/qarmin/czkawka/pull/473), [#474](https://github.com/qarmin/czkawka/pull/474), [#503](https://github.com/qarmin/czkawka/pull/503), [#505](https://github.com/qarmin/czkawka/pull/505)
- Change minimal supported OS to Ubuntu 20.04(needed by GTK) - [#468](https://github.com/qarmin/czkawka/pull/468)
- Increased performance by avoiding creating unnecessary image previews - [#468](https://github.com/qarmin/czkawka/pull/468)
- Improved performance due caching hash of broken/not supported images/videos = [#471](https://github.com/qarmin/czkawka/pull/471)
- Option to not remove cache from non-existent files(e.g. from unplugged pendrive) - [#472](https://github.com/qarmin/czkawka/pull/472)
- Add multiple tooltips with helpful messages - [#472](https://github.com/qarmin/czkawka/pull/472)
- Allow caching prehash - [#477](https://github.com/qarmin/czkawka/pull/477)
- Improve custom selecting of records(allows to use Rust regex) - [#489](https://github.com/qarmin/czkawka/pull/478)
- Remove support for finding zeroed files - [#461](https://github.com/qarmin/czkawka/pull/461)
- Remove HashMB mode - [#476](https://github.com/qarmin/czkawka/pull/476)
- Approximate comparison of music - [#483](https://github.com/qarmin/czkawka/pull/483)
- Enable column sorting for simple treeview - [#487](https://github.com/qarmin/czkawka/pull/487)
- Allow hiding upper panel - [#491](https://github.com/qarmin/czkawka/pull/491)
- Make UI take less space - [#500](https://github.com/qarmin/czkawka/pull/500)
- Add support for raw images(NEF, CR2, KDC...) - [#532](https://github.com/qarmin/czkawka/pull/532)
- Image compare performance and usability improvements - [#529](https://github.com/qarmin/czkawka/pull/529), [#528](https://github.com/qarmin/czkawka/pull/528), [#530](https://github.com/qarmin/czkawka/pull/530), [#525](https://github.com/qarmin/czkawka/pull/525)
- Reorganize(unify) saving/loading data from file - [#524](https://github.com/qarmin/czkawka/pull/524)
- Add "reference folders" - [#516](https://github.com/qarmin/czkawka/pull/516)
- Add cache for similar music files - [#558](https://github.com/qarmin/czkawka/pull/558)

## Version 3.3.1 - 22.11.2021r

- Fix crash when moving buttons [#457](https://github.com/qarmin/czkawka/pull/457)
- Hide move button at start [c9ca230](https://github.com/qarmin/czkawka/commit/c9ca230dfd05e2166b2d68683b091cfd45037edd)

## Version 3.3.0 - 20.11.2021r

- Select files by pressing space key [#415](https://github.com/qarmin/czkawka/pull/415)
- Add additional info to printed errors [#446](https://github.com/qarmin/czkawka/pull/446)
- Add support for multiple image filters, hashes and sizes in similar images tool [#447](https://github.com/qarmin/czkawka/pull/447), [#448](https://github.com/qarmin/czkawka/pull/448)
- Button to move files/folders to provided location [#449](https://github.com/qarmin/czkawka/pull/449)
- Add non-clickable button to fix white theme [#450](https://github.com/qarmin/czkawka/pull/450)
- Fixed freeze when opening in same thread file/folder [#448](https://github.com/qarmin/czkawka/pull/448)
- Tool to check performance of different image filters and hash types and sizes [#447](https://github.com/qarmin/czkawka/pull/447)
- Add scheduled CI and pin it to support Rust 1.53.0 [7bb](https://github.com/qarmin/czkawka/commit/7bbdf742739a513b80d0cc06ba61dfafec976b23), [#431](https://github.com/qarmin/czkawka/pull/431)
- Update snap file to use builtin rust plugin and update gnome extension [8f2](https://github.com/qarmin/czkawka/commit/8f232285e5c34bee6d5da8e1453d7f40a0ffd08d)
- Disable from checking in similar images `webp`, `gif`, `bmp`, `ico` extension which caused crashes [#445](https://github.com/qarmin/czkawka/pull/446), [49e](https://github.com/qarmin/czkawka/commit/49effca169adb57b33f666757966d43b244319cc)

## Version 3.2.0 - 07.08.2021r

- Use checkbox instead selection to select files [#392](https://github.com/qarmin/czkawka/pull/392)
- Re-enable hardlink on windows - [#410](https://github.com/qarmin/czkawka/pull/410)
- Fix symlink and hardlink creating - [#409](https://github.com/qarmin/czkawka/pull/409)
- Add image preview to duplicate finder [#408](https://github.com/qarmin/czkawka/pull/408)
- Add setting maximum file size [#407](https://github.com/qarmin/czkawka/pull/407)
- Add new grouping algorithm to similar images [#405](https://github.com/qarmin/czkawka/pull/405)
- Update to Rust 1.54 [#400](https://github.com/qarmin/czkawka/pull/400)
- Add webp support to similar images [#396](https://github.com/qarmin/czkawka/pull/396)
- Use GtkScale instead radio buttons for similarity [#397](https://github.com/qarmin/czkawka/pull/397)
- Update all dependencies [#405](https://github.com/qarmin/czkawka/pull/405), [#395](https://github.com/qarmin/czkawka/pull/395)
- Split UI into multiple files [#391](https://github.com/qarmin/czkawka/pull/391)
- Update to gtk-rs 0.14 [#383](https://github.com/qarmin/czkawka/pull/383)
- Fix bug with moving windows [#361](https://github.com/qarmin/czkawka/pull/361)
- Generate Minimal Appimage [#339](https://github.com/qarmin/czkawka/pull/339)

## Version 3.1.0 - 09.05.2021r

- Clean README, by moving instructions to different files - [9aea6e9b](https://github.com/qarmin/czkawka/commit/9aea6e9b1ef5ac1e56ccd008e7456b80401179d0)
- Fix excluded items on Windows - [#324](https://github.com/qarmin/czkawka/pull/324)
- Center windows and add missing settings icon - [#323](https://github.com/qarmin/czkawka/pull/323)
- Sort cache - [#322](https://github.com/qarmin/czkawka/pull/322)
- Add desktop file to Snap - [018d5bebb](https://github.com/qarmin/czkawka/commit/018d5bebb0b297ba35529b03b8e2e68eb0a9b474), [ade2a756e2](https://github.com/qarmin/czkawka/commit/ade2a756e29c5ce5739d6268fcab7e76f59ed5f6)
- Customize minimum file size of cached records - [#321](https://github.com/qarmin/czkawka/pull/321)
- Update benchmarks - [2044b9185](https://github.com/qarmin/czkawka/commit/2044b91852fea89dfaf10dc1ab79c1d00e9e0c12)
- Rearrange Instruction - [8e7ac4a2d7f5b0](https://github.com/qarmin/czkawka/commit/8e7ac4a2d7f5b0beba2552581fb3a0d19c2efeb5)
- Add info that Czkawka and Bleachbit are not alternatives to each other - [30602a486](https://github.com/qarmin/czkawka/commit/30602a486f6ade6f9b7b91a73708225b4f4c2a7d)
- Fix crashes with too small message queue - [#316](https://github.com/qarmin/czkawka/pull/316)
- Fix a little unsorted results - [#304](https://github.com/qarmin/czkawka/pull/304)
- Fix Appimage(external bug) - [#299](https://github.com/qarmin/czkawka/issues/299)
- Fix error with saving results of name duplicates - [#307](https://github.com/qarmin/czkawka/pull/307)
- Update to Rust 1.5.1 - [#302](https://github.com/qarmin/czkawka/pull/302)

## Version 3.0.0 - 11.03.2021r

- Option to not ignore hardlinks - [#273](https://github.com/qarmin/czkawka/pull/273)
- Hardlink support for GUI - [#276](https://github.com/qarmin/czkawka/pull/276)
- New settings window - [#262](https://github.com/qarmin/czkawka/pull/262)
- Unify file removing - [#278](https://github.com/qarmin/czkawka/pull/278)
- Dryrun in duplicates CLI - [#277](https://github.com/qarmin/czkawka/pull/277)
- Option to turn off cache - [#263](https://github.com/qarmin/czkawka/pull/263)
- Update Image dependency and fix crashes - [#270](https://github.com/qarmin/czkawka/pull/270), [e3aca69](https://github.com/qarmin/czkawka/commit/e3aca69499966499413e4b7cd4d1037bec6a5d68)
- Add confirmation dialog when trying to remove all files in group - [#281](https://github.com/qarmin/czkawka/pull/281)
- Add confirmation dialog when removing files with delete key - [#282](https://github.com/qarmin/czkawka/pull/282)
- Open file when clicking at the Enter button - [#285](https://github.com/qarmin/czkawka/pull/285)
- Allow to put files to trash instead fully remove them - [#284](https://github.com/qarmin/czkawka/pull/284)

## Version 2.4.0 - 22.02.2021r

- Add about dialog - [#226](https://github.com/qarmin/czkawka/pull/226)
- Remove checking for ico in similar images - [#227](https://github.com/qarmin/czkawka/pull/227)
- Change progress dialog to progress window - [#229](https://github.com/qarmin/czkawka/pull/229)
- Restore snap confinement - [#218](https://github.com/qarmin/czkawka/pull/218), [8dcb718](https://github.com/qarmin/czkawka/commit/8dcb7188434e1c1728368642e17ccec29a4b372d)
- Add support for CRC32 and XXH3 hash - [#243](https://github.com/qarmin/czkawka/pull/243)
- Add delete method to replace duplicate files with hard links - [#236](https://github.com/qarmin/czkawka/pull/236)
- Add checking for broken music opt-in - [#249](https://github.com/qarmin/czkawka/pull/249)
- Allow to save to file similar images results - [10156ccfd3](https://github.com/qarmin/czkawka/commit/10156ccfd3ba880d26d4bbad1e025b0050d7753b)
- Keep original file if replacing duplicate with hardlink fails - [#256](https://github.com/qarmin/czkawka/pull/256)
- Fix Windows theme - [#265](https://github.com/qarmin/czkawka/pull/265)
- Windows taskbar progress support - [#264](https://github.com/qarmin/czkawka/pull/264)
- Ignore duplicates if those are hard links - [#234](https://github.com/qarmin/czkawka/pull/234)
- Support the hash type parameter in the CLI - [#267](https://github.com/qarmin/czkawka/pull/267)
- Use one implementation for all hash calculations - [#268](https://github.com/qarmin/czkawka/pull/268)
- Disable for now broken tga and gif files - [#270](https://github.com/qarmin/czkawka/pull/270)

## Version 2.3.2 - 21.01.2021r

- Add support for moving selection by keyboard to update similar image preview [#223](https://github.com/qarmin/czkawka/pull/223)

This version is only needed to test flatpak build

## Version 2.3.1 - 20.01.2021r

- Added flatpak support - [#203](https://github.com/qarmin/czkawka/pull/203)
- Spell fixes - [#222](https://github.com/qarmin/czkawka/pull/222), [#219](https://github.com/qarmin/czkawka/pull/219)

## Version 2.3.0 - 15.01.2021r

- Add cache for duplicate finder - [#205](https://github.com/qarmin/czkawka/pull/205)
- Add cache for broken files - [#204](https://github.com/qarmin/czkawka/pull/204)
- Decrease ram usage - [#212](https://github.com/qarmin/czkawka/pull/212)
- Add support for finding broken zip and audio files - [#210](https://github.com/qarmin/czkawka/pull/210)
- Sort Results by path where it is possible - [#211](https://github.com/qarmin/czkawka/pull/211)
- Add missing popover info for invalid symlinks - [#209](https://github.com/qarmin/czkawka/pull/209)
- Use the oldest available OS in Linux and Mac CI and the newest on Windows - [#206](https://github.com/qarmin/czkawka/pull/206)
- Add broken files support - [#202](https://github.com/qarmin/czkawka/pull/202)
- Remove save workaround and fix crashes when loading/saving cache - [#200](https://github.com/qarmin/czkawka/pull/200)
- Fix error when closing dialog progress by X - [#199](https://github.com/qarmin/czkawka/pull/199)

## Version 2.2.0 - 11.01.2021r

- Adds Mac GUI - [#160](https://github.com/qarmin/czkawka/pull/160)
- Use master gtk plugin again - [#179](https://github.com/qarmin/czkawka/pull/179)
- Only show preview when 1 image is selected - [#183](https://github.com/qarmin/czkawka/pull/183)
- Add buffered write/read - [#186](https://github.com/qarmin/czkawka/pull/186)
- Fix included/excluded files which contains commas - [#195](https://github.com/qarmin/czkawka/pull/195)
- Move image cache to cache from config dir - [#197](https://github.com/qarmin/czkawka/pull/197)
- Reorganize GUI Code(no visible changes) - [#184](https://github.com/qarmin/czkawka/pull/184), [#184](https://github.com/qarmin/czkawka/pull/184), [#189](https://github.com/qarmin/czkawka/pull/189), [#190](https://github.com/qarmin/czkawka/pull/190), [#194](https://github.com/qarmin/czkawka/pull/194)

## Version 2.1.0 - 31.12.2020r

- Hide preview when deleting images or symlinking it - [#167](https://github.com/qarmin/czkawka/pull/167)
- Add manual adding of directories - [#165](https://github.com/qarmin/czkawka/pull/165), [#168](https://github.com/qarmin/czkawka/pull/168)
- Add resizable top panel - [#164](https://github.com/qarmin/czkawka/pull/164)
- Add support for delete button - [#159](https://github.com/qarmin/czkawka/pull/159)
- Allow to select multiple entries in File Chooser - [#154](https://github.com/qarmin/czkawka/pull/154)
- Add cache support for similar images - [#139](https://github.com/qarmin/czkawka/pull/139)
- Add selecting images with its size - [#138](https://github.com/qarmin/czkawka/pull/138)
- Modernize popovers code and simplify later changes - [#137](https://github.com/qarmin/czkawka/pull/137)

## Version 2.0.0 - 23.12.2020r

- Add Snap support - [ee3d4](https://github.com/qarmin/czkawka/commit/ee3d450552cd0c37a114b05c557ff9381ef92466)
- Select longer names by default - [#113](https://github.com/qarmin/czkawka/pull/113)
- Add setting for deletion confirmation dialog - [#114](https://github.com/qarmin/czkawka/pull/114)
- Add button to hide/show text view errors - [#115](https://github.com/qarmin/czkawka/pull/115)
- Remove console window in Windows - [#116](https://github.com/qarmin/czkawka/pull/116)
- Add custom selection/unselection - [#117](https://github.com/qarmin/czkawka/pull/117)
- Add Image preview to similar images - [#118](https://github.com/qarmin/czkawka/pull/118)
- Remove orbtk frontend - [#119](https://github.com/qarmin/czkawka/pull/119)
- Update Icon - [#120](https://github.com/qarmin/czkawka/pull/120)
- Add setting button to disable/enable previews(enabled by default) - [#121](https://github.com/qarmin/czkawka/pull/121)
- Add button to enable/disable in settings text view errors - [#122](https://github.com/qarmin/czkawka/pull/122)
- Add support for symbolic links - [#123](https://github.com/qarmin/czkawka/pull/123)
- Add support for checking for invalid symlinks - [#124](https://github.com/qarmin/czkawka/pull/124)
- Add new windows dark theme - [#125](https://github.com/qarmin/czkawka/pull/125)
- Fix appimage crash by adding PNG version of icon - [#126](https://github.com/qarmin/czkawka/pull/126)
- Split symlink path to two path and file name - [#127](https://github.com/qarmin/czkawka/pull/127)
- Add option to open folders by double right click - [#128](https://github.com/qarmin/czkawka/pull/128)
- Add minimal similarity level - [#129](https://github.com/qarmin/czkawka/pull/129)
- Show errors in image previewer when failed to generate it - [#130](https://github.com/qarmin/czkawka/pull/130)
- Added instruction - [58e6221a](https://github.com/qarmin/czkawka/commit/58e6221a0e02d17d07c71152f56b948f616751a8), [598aec345e](https://github.com/qarmin/czkawka/commit/598aec345e9f5ac199fc3d642c0699d5228100a6), [afaa402b](https://github.com/qarmin/czkawka/commit/afaa402b31526aa8e6b47f3670bc62b26ad9f60f)

## Version 1.5.1 - 08.12.2020r

- Fix errors in progress bar caused by dividing by 0 - [#109](https://github.com/qarmin/czkawka/pull/109)
- Add option to save file, store settings and load them - [#108](https://github.com/qarmin/czkawka/pull/108)
- Center dialog to current window - [a04](https://github.com/qarmin/czkawka/commit/a047380dbe8aa4d04f9c482364469e21d231fab2)

## Version 1.5.0 - 02.12.2020r

- Added progress bar - [#106](https://github.com/qarmin/czkawka/pull/106)
- Removed unused buttons - [#107](https://github.com/qarmin/czkawka/pull/107)

## Version 1.4.0 - 09.11.2020r

- Multithreading Support to most modules - [#98](https://github.com/qarmin/czkawka/pull/98) [#99](https://github.com/qarmin/czkawka/pull/99) [#100](https://github.com/qarmin/czkawka/pull/100) [#101](https://github.com/qarmin/czkawka/pull/101)
- Simplify GUI code [#96](https://github.com/qarmin/czkawka/pull/96)
- Group similar images - [#97](https://github.com/qarmin/czkawka/pull/97)
- Add select buttons to each type of mode - [#102](https://github.com/qarmin/czkawka/pull/102)
- Fix GUI behavior in GUI when deleting similar image - [#103](https://github.com/qarmin/czkawka/pull/103)
- Add new similarity level - [#104](https://github.com/qarmin/czkawka/pull/104)

## Version 1.3.0 - 02.11.2020r

- Appimage support - [#77](https://github.com/qarmin/czkawka/pull/77)
- Removed warnings about non-existed excluded directories - [#79](https://github.com/qarmin/czkawka/pull/79)
- Updated README - [8ec](https://github.com/qarmin/czkawka/commit/8ecde0fc9adb3e6cedf432c4ba749e698b645a7a)
- Added pre hash support(speedup for searching big duplicates) - [#83](https://github.com/qarmin/czkawka/pull/83)
- Support for searching duplicates by file name - [#84](https://github.com/qarmin/czkawka/pull/84)
- Added support for checking for zeroed file - [#88](https://github.com/qarmin/czkawka/pull/88)
- Refactored GUI code to faster and safer changing/adding code - [#89](https://github.com/qarmin/czkawka/pull/89)
- Added some missing options to CLI in some modes - [#90](https://github.com/qarmin/czkawka/pull/90)
- Implemented finding duplicates by music tags - [#95](https://github.com/qarmin/czkawka/pull/95)

## Version 1.2.1 - 17.10.2020r

- Make image similarity search significantly faster. [#72](https://github.com/qarmin/czkawka/pull/72)
- Improve similar images GUI a little and add sorting to Similarity Enum [#73](https://github.com/qarmin/czkawka/pull/73)
- Improve deleting files in Similar files in GUI [#75](https://github.com/qarmin/czkawka/pull/75)

## Version 1.2.0 - 15.10.2020r

- Replace String with PathBuf for paths [#59](https://github.com/qarmin/czkawka/pull/59)
- Add test suite to PR [#65](https://github.com/qarmin/czkawka/pull/65)
- Support for finding similar images to CLI [#66](https://github.com/qarmin/czkawka/pull/66)
- Fix grammar-related errors and Ponglish expressions [#62](https://github.com/qarmin/czkawka/pull/62), [#63](https://github.com/qarmin/czkawka/pull/63)
- Don't delete by default files in duplicate finder in CLI - [23f203](https://github.com/qarmin/czkawka/commit/23f203a061e254275c95ca23ca4f1a78bd941f02)
- Support for finding similar images to GUI [#69](https://github.com/qarmin/czkawka/pull/69)
- Add support for opening files/folders from GUI with double-click [#70](https://github.com/qarmin/czkawka/pull/70)

## Version 1.1.0 - 10.10.2020r

- Windows support [#58](https://github.com/qarmin/czkawka/pull/58)
- Improve code quality/Simplify codebase [#52](https://github.com/qarmin/czkawka/pull/52)
- Fixed skipping some correct results in specific situations [#52](https://github.com/qarmin/czkawka/pull/52#discussion_r502613895)
- Added support for searching in other thread [#51](https://github.com/qarmin/czkawka/pull/51)
- Divide CI across files [#48](https://github.com/qarmin/czkawka/pull/48)
- Added ability to stop task from GUI [#55](https://github.com/qarmin/czkawka/pull/55)
- Fixed removing directories which contains only empty directories from GUI [#57](https://github.com/qarmin/czkawka/pull/57)

## Version 1.0.1 - 06.10.2020r

- Replaced default argument parser with StructOpt [#37](https://github.com/qarmin/czkawka/pull/37)
- Added all(except macOS GTK build) builds to CI where can be freely downloaded [#41](https://github.com/qarmin/czkawka/pull/41) [#39](https://github.com/qarmin/czkawka/pull/39)
- App can be downloaded also from Arch AUR and Cargo [#36](https://github.com/qarmin/czkawka/pull/36)
- Fixed crash with invalid file modification date [#33](https://github.com/qarmin/czkawka/issues/33)
- Upper tabs can hide and show when this is necessary [#38](https://github.com/qarmin/czkawka/pull/38)
- Fixed crash when file/folder name have non Unicode character [#44](https://github.com/qarmin/czkawka/issues/44)
- Added support for finding similar pictures in GUI [#69](https://github.com/qarmin/czkawka/issues/69)

## Version 1.0.0 - 02.10.2020r

- Added confirmation dialog to delete button
- Updated Readme
- Tested a lot app, so I think that it version 1.0.0 can be freely released

## Version 0.1.4 - 01.10.2020r

- Fixes -f default argument
- Added save button to GUI
- Cleaned a little code
- Deleting files and folders i GUI
- Support for all notebooks items in GUI
- Support for deleting and adding directories to search and to exclude in GUI
- Support for light themes in GUI
- Changed SystemTime to u64 from EPOCH_TIME
- Selective selecting of rows duplicate finder in GUI
- Changed minimum version of GTK to 3.22
- Added save system to GUI
- Added Big, Temporary and Empty folders finder to GUI

## Version 0.1.3 - 27.09.2020r

- Big code refactoring - now is a lot of easier create new modules and maintain old ones
- Added finding empty files
- Added new option to find duplicates by checking hash max 1MB of file
- Added support for finding temporary folder finder
- Improved README
- Simplify CLI help and improve it

## Version 0.1.2 - 26.09.2020r

- Add basic search empty folders in GTK GUI
- Remember place where button are placed
- Read and parse more values from GUI
- Print errors/warnings/messages to text field in GUI
- Add upper notebook with included, excluded directories, items and extensions
- Improve a little GUI
- Add version argument which print version e.g. `czkawka_gui --version`
- Simple Empty folder support in GUI
- The biggest files support in CLI

## Version 0.1.1 - 20.09.2020r

- Added images to readme
- Better GTK buttons and glade file
- Basic search in GTK
- Cleaned core from println
- Core functions doesn't use now process::exit(everything is done with help of messages/errors/warnings)
- Added support for non-recursive search
- Improved finding number and size of duplicated files
- Saving results to file
- Print how much data was read by duplicate finder(debug only)
- Added GitHub CI
- Only debug build prints debug information's
- Clean code
- Add basic idea config to misc folder

## Version 0.1.0 - 07.09.2020r

- Initial Version
- Duplicate file finder
- Empty folder finder
- Very WIP Orbtk GUI frontend
- Basic GTK Frontend(without any logic)
- CLI

## Initial commit - 26.08.2020r


================================================
FILE: LICENSE_CC_BY_4_ICONS
================================================
All icons, in this project are licensed under Creative Commons Attribution 4.0 International (CC BY 4.0).

Copyright (c) 2020 [jannuary](https://github.com/jannuary)
- data/icons/com.github.qarmin.czkawka.Devel.svg
- data/icons/com.github.qarmin.czkawka.svg
- data/icons/com.github.qarmin.czkawka-symbolic.svg

Copyright (c) 2020-2026 Rafał Mikrut
- data/icons/io.github.qarmin.krokiet.svg

License: CC-BY-4.0
 Creative Commons Attribution 4.0 International Public License
 .
 By exercising the Licensed Rights (defined below), You accept and agree
 to be bound by the terms and conditions of this Creative Commons
 Attribution 4.0 International Public License ("Public
 License"). To the extent this Public License may be interpreted as a
 contract, You are granted the Licensed Rights in consideration of Your
 acceptance of these terms and conditions, and the Licensor grants You
 such rights in consideration of benefits the Licensor receives from
 making the Licensed Material available under these terms and
 conditions.
 .
 Section 1 -- Definitions.
 .
 a. Adapted Material means material subject to Copyright and Similar
 Rights that is derived from or based upon the Licensed Material
 and in which the Licensed Material is translated, altered,
 arranged, transformed, or otherwise modified in a manner requiring
 permission under the Copyright and Similar Rights held by the
 Licensor. For purposes of this Public License, where the Licensed
 Material is a musical work, performance, or sound recording,
 Adapted Material is always produced where the Licensed Material is
 synched in timed relation with a moving image.
 .
 b. Adapter's License means the license You apply to Your Copyright
 and Similar Rights in Your contributions to Adapted Material in
 accordance with the terms and conditions of this Public License.
 .
 c. Copyright and Similar Rights means copyright and/or similar rights
 closely related to copyright including, without limitation,
 performance, broadcast, sound recording, and Sui Generis Database
 Rights, without regard to how the rights are labeled or
 categorized. For purposes of this Public License, the rights
 specified in Section 2(b)(1)-(2) are not Copyright and Similar
 Rights.
 .
 d. Effective Technological Measures means those measures that, in the
 absence of proper authority, may not be circumvented under laws
 fulfilling obligations under Article 11 of the WIPO Copyright
 Treaty adopted on December 20, 1996, and/or similar international
 agreements.
 .
 e. Exceptions and Limitations means fair use, fair dealing, and/or
 any other exception or limitation to Copyright and Similar Rights
 that applies to Your use of the Licensed Material.
 .
 f. Licensed Material means the artistic or literary work, database,
 or other material to which the Licensor applied this Public
 License.
 .
 g. Licensed Rights means the rights granted to You subject to the
 terms and conditions of this Public License, which are limited to
 all Copyright and Similar Rights that apply to Your use of the
 Licensed Material and that the Licensor has authority to license.
 .
 h. Licensor means the individual(s) or entity(ies) granting rights
 under this Public License.
 .
 i. Share means to provide material to the public by any means or
 process that requires permission under the Licensed Rights, such
 as reproduction, public display, public performance, distribution,
 dissemination, communication, or importation, and to make material
 available to the public including in ways that members of the
 public may access the material from a place and at a time
 individually chosen by them.
 .
 j. Sui Generis Database Rights means rights other than copyright
 resulting from Directive 96/9/EC of the European Parliament and of
 the Council of 11 March 1996 on the legal protection of databases,
 as amended and/or succeeded, as well as other essentially
 equivalent rights anywhere in the world.
 .
 k. You means the individual or entity exercising the Licensed Rights
 under this Public License. Your has a corresponding meaning.
 .
 Section 2 -- Scope.
 .
 a. License grant.
 .
 1. Subject to the terms and conditions of this Public License,
 the Licensor hereby grants You a worldwide, royalty-free,
 non-sublicensable, non-exclusive, irrevocable license to
 exercise the Licensed Rights in the Licensed Material to:
 .
 a. reproduce and Share the Licensed Material, in whole or
 in part; and
 .
 b. produce, reproduce, and Share Adapted Material.
 .
 2. Exceptions and Limitations. For the avoidance of doubt, where
 Exceptions and Limitations apply to Your use, this Public
 License does not apply, and You do not need to comply with
 its terms and conditions.
 .
 3. Term. The term of this Public License is specified in Section
 6(a).
 .
 4. Media and formats; technical modifications allowed. The
 Licensor authorizes You to exercise the Licensed Rights in
 all media and formats whether now known or hereafter created,
 and to make technical modifications necessary to do so. The
 Licensor waives and/or agrees not to assert any right or
 authority to forbid You from making technical modifications
 necessary to exercise the Licensed Rights, including
 technical modifications necessary to circumvent Effective
 Technological Measures. For purposes of this Public License,
 simply making modifications authorized by this Section 2(a)
 (4) never produces Adapted Material.
 .
 5. Downstream recipients.
 .
 a. Offer from the Licensor -- Licensed Material. Every
 recipient of the Licensed Material automatically
 receives an offer from the Licensor to exercise the
 Licensed Rights under the terms and conditions of this
 Public License.
 .
 b. No downstream restrictions. You may not offer or impose
 any additional or different terms or conditions on, or
 apply any Effective Technological Measures to, the
 Licensed Material if doing so restricts exercise of the
 Licensed Rights by any recipient of the Licensed
 Material.
 .
 6. No endorsement. Nothing in this Public License constitutes or
 may be construed as permission to assert or imply that You
 are, or that Your use of the Licensed Material is, connected
 with, or sponsored, endorsed, or granted official status by,
 the Licensor or others designated to receive attribution as
 provided in Section 3(a)(1)(A)(i).
 .
 b. Other rights.
 .
 1. Moral rights, such as the right of integrity, are not
 licensed under this Public License, nor are publicity,
 privacy, and/or other similar personality rights; however, to
 the extent possible, the Licensor waives and/or agrees not to
 assert any such rights held by the Licensor to the limited
 extent necessary to allow You to exercise the Licensed
 Rights, but not otherwise.
 .
 2. Patent and trademark rights are not licensed under this
 Public License.
 .
 3. To the extent possible, the Licensor waives any right to
 collect royalties from You for the exercise of the Licensed
 Rights, whether directly or through a collecting society
 under any voluntary or waivable statutory or compulsory
 licensing scheme. In all other cases the Licensor expressly
 reserves any right to collect such royalties.
 .
 Section 3 -- License Conditions.
 .
 Your exercise of the Licensed Rights is expressly made subject to the
 following conditions.
 .
 a. Attribution.
 .
 1. If You Share the Licensed Material (including in modified
 form), You must:
 .
 a. retain the following if it is supplied by the Licensor
 with the Licensed Material:
 .
 i. identification of the creator(s) of the Licensed
 Material and any others designated to receive
 attribution, in any reasonable manner requested by
 the Licensor (including by pseudonym if
 designated);
 .
 ii. a copyright notice;
 .
 iii. a notice that refers to this Public License;
 .
 iv. a notice that refers to the disclaimer of
 warranties;
 .
 v. a URI or hyperlink to the Licensed Material to the
 extent reasonably practicable;
 .
 b. indicate if You modified the Licensed Material and
 retain an indication of any previous modifications; and
 .
 c. indicate the Licensed Material is licensed under this
 Public License, and include the text of, or the URI or
 hyperlink to, this Public License.
 .
 2. You may satisfy the conditions in Section 3(a)(1) in any
 reasonable manner based on the medium, means, and context in
 which You Share the Licensed Material. For example, it may be
 reasonable to satisfy the conditions by providing a URI or
 hyperlink to a resource that includes the required
 information.
 .
 3. If requested by the Licensor, You must remove any of the
 information required by Section 3(a)(1)(A) to the extent
 reasonably practicable.
 .
 4. If You Share Adapted Material You produce, the Adapter's
 License You apply must not prevent recipients of the Adapted
 Material from complying with this Public License.
 .
 Section 4 -- Sui Generis Database Rights.
 .
 Where the Licensed Rights include Sui Generis Database Rights that
 apply to Your use of the Licensed Material:
 .
 a. for the avoidance of doubt, Section 2(a)(1) grants You the right
 to extract, reuse, reproduce, and Share all or a substantial
 portion of the contents of the database;
 .
 b. if You include all or a substantial portion of the database
 contents in a database in which You have Sui Generis Database
 Rights, then the database in which You have Sui Generis Database
 Rights (but not its individual contents) is Adapted Material; and
 .
 c. You must comply with the conditions in Section 3(a) if You Share
 all or a substantial portion of the contents of the database.
 .
 For the avoidance of doubt, this Section 4 supplements and does not
 replace Your obligations under this Public License where the Licensed
 Rights include other Copyright and Similar Rights.
 .
 Section 5 -- Disclaimer of Warranties and Limitation of Liability.
 .
 a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE
 EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS
 AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF
 ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,
 IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,
 WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR
 PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,
 ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT
 KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT
 ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.
 .
 b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE
 TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,
 NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,
 INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,
 COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR
 USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN
 ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR
 DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR
 IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.
 .
 c. The disclaimer of warranties and limitation of liability provided
 above shall be interpreted in a manner that, to the extent
 possible, most closely approximates an absolute disclaimer and
 waiver of all liability.
 .
 Section 6 -- Term and Termination.
 .
 a. This Public License applies for the term of the Copyright and
 Similar Rights licensed here. However, if You fail to comply with
 this Public License, then Your rights under this Public License
 terminate automatically.
 .
 b. Where Your right to use the Licensed Material has terminated under
 Section 6(a), it reinstates:
 .
 1. automatically as of the date the violation is cured, provided
 it is cured within 30 days of Your discovery of the
 violation; or
 .
 2. upon express reinstatement by the Licensor.
 .
 For the avoidance of doubt, this Section 6(b) does not affect any
 right the Licensor may have to seek remedies for Your violations
 of this Public License.
 .
 c. For the avoidance of doubt, the Licensor may also offer the
 Licensed Material under separate terms or conditions or stop
 distributing the Licensed Material at any time; however, doing so
 will not terminate this Public License.
 .
 d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
 License.
 .
 Section 7 -- Other Terms and Conditions.
 .
 a. The Licensor shall not be bound by any additional or different
 terms or conditions communicated by You unless expressly agreed.
 .
 b. Any arrangements, understandings, or agreements regarding the
 Licensed Material not stated herein are separate from and
 independent of the terms and conditions of this Public License.
 .
 Section 8 -- Interpretation.
 .
 a. For the avoidance of doubt, this Public License does not, and
 shall not be interpreted to, reduce, limit, restrict, or impose
 conditions on any use of the Licensed Material that could lawfully
 be made without permission under this Public License.
 .
 b. To the extent possible, if any provision of this Public License is
 deemed unenforceable, it shall be automatically reformed to the
 minimum extent necessary to make it enforceable. If the provision
 cannot be reformed, it shall be severed from this Public License
 without affecting the enforceability of the remaining terms and
 conditions.
 .
 c. No term or condition of this Public License will be waived and no
 failure to comply consented to unless expressly agreed to by the
 Licensor.
 .
 d. Nothing in this Public License constitutes or may be interpreted
 as a limitation upon, or waiver of, any privileges and immunities
 that apply to the Licensor or You, including from the legal
 processes of any jurisdiction or authority.

================================================
FILE: LICENSE_MIT_EVERYTHING_OUTSIDE_ANY_CARGO_APP_LIBRARY
================================================
MIT License

Copyright (c) 2020-2026 Rafał Mikrut

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.

================================================
FILE: README.md
================================================
<div align="center"><img src="https://github.com/user-attachments/assets/f5e4b290-d001-4cf4-9f52-dab65a30e441" alt="krokiet_logo" width="600" /></div>
     
**Krokiet** ((IPA: [ˈkrɔcɛt]), "croquette" in Polish) new generation GUI frontend, simple, multiplatform, fast and free app to remove unnecessary files from your computer.


<div align="center"><img src="https://user-images.githubusercontent.com/41945903/102616149-66490400-4137-11eb-9cd6-813b2b070834.png" alt="czkawka_logo" width="600" /></div>

**Czkawka** (_tch•kav•ka_ (IPA: [ˈʧ̑kafka]), "hiccup" in Polish) older gtk4 GUI frontend, superseded by Krokiet, but still receiving bugfix updates.

## Features

- **Written in memory-safe Rust** - almost 100% unsafe code free
- **Amazingly fast** - due multithreading and efficient algorithms
- **Free, Open Source without any ads**
- **Multiplatform** - runs on Linux, Windows, macOS, FreeBSD, x86, ARM, RISC-V and even Android
- **Cache support** - second and further scans should be much faster than the first one
- **Easy to run, easy to compile** - minimal runtime and build dependencies, portable version available
- **CLI frontend** - for easy automation
- **GUI frontend** - uses Slint or GTK 4 frameworks
- **Core library** - allows to reuse functionality in other apps
- **Android app** - experimental touch-friendly frontend for Android devices
- **No spying** - Czkawka does not have access to the Internet, nor does it collect any user information or statistics
- **Multilingual** - support multiple languages like Polish, English or Italian
- **Multiple tools to use**:
    - **Duplicates** - Finds duplicates based on file name, size or hash
    - **Empty Folders** - Finds empty folders with the help of an advanced algorithm
    - **Big Files** - Finds the provided number of the biggest files in given location
    - **Empty Files** - Looks for empty files across the drive
    - **Temporary Files** - Finds temporary files
    - **Similar Images** - Finds images which are not exactly the same (different resolution, watermarks)
    - **Similar Videos** - Looks for visually similar videos
    - **Same Music** - Searches for similar music by tags or by reading content and comparing it
    - **Invalid Symbolic Links** - Shows symbolic links which point to non-existent files/directories
    - **Broken Files** - Finds files that are invalid or corrupted
    - **Bad Extensions** - Lists files whose content not match with their extension
    - **Exif Remover** - Removes Exif metadata from various file types
    - **Video Optimizer** - Crops from static parts and converts videos to more efficient formats
    - **Bad Names** - Finds files with names that may be not wanted (e.g., containing special characters)

![Krokiet](https://github.com/user-attachments/assets/3cc7ec6a-3d6a-42cb-9d33-4b0f0c547af6)

![Czkawka](https://github.com/user-attachments/assets/b0409515-1bec-4e13-8fac-7bdfa15f5848)

Changelog about each version can be found in [CHANGELOG.md](Changelog.md).

New releases can be found in [Github releases](https://github.com/qarmin/czkawka/releases) and nightly builds also in [Nightly releases](https://github.com/qarmin/czkawka/releases/tag/Nightly)

You can read more about the 11.0.0 release, its new features, and the issues that were fixed in the following articles:
- English article – https://medium.com/@qarmin/czkawka-krokiet-11-0-0f6cea385934
- Polish article – https://medium.com/@qarmin/czkawka-krokiet-11-0-c95ee35eccc2

## Usage, installation, compilation, requirements, license

Each tool uses different technologies, so you can find instructions for each of them in the appropriate file:

- [Krokiet GUI (Slint frontend)](krokiet/README.md)</br>
- [Czkawka GUI (GTK frontend)](czkawka_gui/README.md)</br>
- [Czkawka CLI](czkawka_cli/README.md)</br>
- [Czkawka Core](czkawka_core/README.md)</br>
- [Cedinia](cedinia/README.md)</br>

## Comparison to other tools

In this comparison remember, that even if app have same features they may work different(e.g. one app may have more
options to choose than other).

|                           |   Krokiet   |     Czkawka      | FSlint |     DupeGuru      |  Bleachbit  |
|:-------------------------:|:-----------:|:----------------:|:------:|:-----------------:|:-----------:|
|         Language          |    Rust     |       Rust       | Python |   Python/Obj-C    |   Python    |
|  Framework base language  |    Rust     |        C         |   C    | C/C++/Obj-C/Swift |      C      |
|         Framework         |    Slint    |      GTK 4       | PyGTK2 | Qt 5 (PyQt)/Cocoa |   PyGTK3    |
|            OS             | Lin,Mac,Win |   Lin,Mac,Win    |  Lin   |    Lin,Mac,Win    | Lin,Mac,Win |
|     Duplicate finder      |      ✔      |        ✔         |   ✔    |         ✔         |             |
|        Empty files        |      ✔      |        ✔         |   ✔    |                   |             |
|       Empty folders       |      ✔      |        ✔         |   ✔    |                   |             |
|      Temporary files      |      ✔      |        ✔         |   ✔    |                   |      ✔      |
|         Big files         |      ✔      |        ✔         |        |                   |             |
|      Similar images       |      ✔      |        ✔         |        |         ✔         |             |
|      Similar videos       |      ✔      |        ✔         |        |                   |             |
|  Music duplicates(tags)   |      ✔      |        ✔         |        |         ✔         |             |
| Music duplicates(content) |      ✔      |        ✔         |        |                   |             |
|     Invalid symlinks      |      ✔      |        ✔         |   ✔    |                   |             |
|       Broken files        |      ✔      |        ✔         |        |                   |             |
| Invalid names/extensions  |      ✔      |        ✔         |   ✔    |                   |             |
|       Exif cleaner        |      ✔      |                  |        |                   |             |
|      Video optimizer      |      ✔      |                  |        |                   |             |
|         Bad Names         |      ✔      |                  |        |                   |             |
|      Names conflict       |             |                  |   ✔    |                   |             |
|    Installed packages     |             |                  |   ✔    |                   |             |
|          Bad ID           |             |                  |   ✔    |                   |             |
|   Non stripped binaries   |             |                  |   ✔    |                   |             |
|   Redundant whitespace    |             |                  |   ✔    |                   |             |
|     Overwriting files     |             |                  |   ✔    |                   |      ✔      |
|     Portable version      |      ✔      |        ✔         |        |                   |      ✔      |
|    Multiple languages     |      ✔      |        ✔         |   ✔    |         ✔         |      ✔      |
|       Cache support       |      ✔      |        ✔         |        |         ✔         |             |
|   In active development   |     Yes     | Yes<sup>**</sup> |   No   |  No<sup>*</sup>   |     Yes     |

<p><sup>*</sup> Few small commits added recently and last version released in 2023</p> 
<p><sup>**</sup> Czkawka GTK is in maintenance mode receiving only bugfixes</p>

## Other apps

There are many similar applications to Czkawka on the Internet, which do some things better and some things worse:

### GUI

- [DupeGuru](https://github.com/arsenetar/dupeguru) - Many options to customize; great photo compare tool
- [FSlint](https://github.com/pixelb/fslint) - A little outdated, but still have some tools not available in Czkawka
- [AntiDupl.NET](https://github.com/ermig1979/AntiDupl) - Shows a lot of metadata of compared images
- [Video Duplicate Finder](https://github.com/0x90d/videoduplicatefinder) - Finds similar videos(surprising, isn't it)

### CLI

Due to limited time, the biggest emphasis is on the GUI version so if you are looking for really good and feature-packed
console apps, then take a look at these:

- [Fclones](https://github.com/pkolaczk/fclones) - One of the fastest tools to find duplicates; it is written also in
  Rust
- [Rmlint](https://github.com/sahib/rmlint) - Nice console interface and also is feature packed
- [RdFind](https://github.com/pauldreik/rdfind) - Fast, but written in C++ ¯\\\_(ツ)\_/¯


## Projects using Czkawka

Czkawka exposes its common functionality through a crate called **`czkawka_core`**, which can be reused by other projects.

It is written in Rust and is used by all Czkawka frontends (`czkawka_gui`, `czkawka_cli`, `krokiet`, `cedinia`).

It is also used by external projects, such as:

- **Czkawka Tauri** - https://github.com/shixinhuang99/czkawka-tauri - A Tauri-based GUI frontend for Czkawka.
- **page-dewarp** – https://github.com/lmmx/page-dewarp - A library for dewarping document images using a cubic sheet model.

Bindings are also available for:

- **Python** – https://pypi.org/project/czkawka/

Some projects work as wrappers around `czkawka_cli`. Without directly depending on `czkawka_core`, they allow simple scanning and retrieving results in JSON format:

- **Schluckauf** – https://github.com/fadykuzman/schluckauf

## Thanks

Big thanks to Pádraig Brady, creator of fantastic FSlint, because without his work I wouldn't create this tool.

Thanks also to all the people who contributed to the project in every possible way

Also, I really appreciate work of people that create crates on which Czkawka is based and for that I try to report bugs to make it even better.

## How to help?

- **Creating issues** - Mainly related to bugs, oddly behaving functionality, etc. As you can see from the issue tracker, there are plenty of ideas for new features, but most of them are either difficult to implement or not aligned with the vision of the project, which evolves slightly over time.
- **Creating pull requests** - Bug fixes are of course very welcome. Regarding new features, it is best to consult with me before implementing them to confirm they align with the project vision.
- **Updating translations** - The project uses the Crowdin platform, where translations can be created and updated. In the case of a new release and missing translations, I use machine translation, which is often inaccurate, so updating translations is highly appreciated.
- **Creating packages for various platforms** - Due to the difficulties related to adding and maintaining support for each new platform, such as learning package formats like deb or rpm, creating installers and packages, I decided to mainly focus on providing prebuilt binaries. However, having the project available in distribution repositories or in projects such as Chocolatey, Homebrew or Winget would be beneficial for users who prefer centralized repositories.
- **Creating articles, videos, tutorials, etc.** - Any material that helps people better understand this program and its capabilities is welcome.
- **Recommending it to friends, family, coworkers, etc.** - This is probably the simplest way to help the project become even more popular, which gives me motivation to continue developing the program. Here are a few example ways to naturally mention this program in a regular conversation:

**S** - Someone  
**Y** - You  

### Situation 1:

- **S** - Hey Anon, I have a lot of junk on my disk, what should I do?
- **Y** - Download Krokiet/Czkawka. They are completely free and works on almost every system.
- **S** - Thanks man!

### Situation 2:

- **S** - I am so thirsty...
- **Y** - Have you heard about Krokiet/Czkawka?
- **S** - Wait, what?
- **Y** - Krokiet and Czkawka, in case you did not know, let you clean unnecessary files from your disk. They are completely free...
- **S** - That is nice, but I am thirsty...
- **Y** - ...they work on Windows, Linux and macOS, and some people even port them to FreeBSD and Android...


## AI Policy
The vast majority of the code in this project was written by me(qarmin), without using AI. However, as AI tools have improved and can significantly simplify development and reduce boilerplate, I see no reason to forbid their use.

That said, every pull request, whether created with AI or not, must meet proper quality standards. The author must be able to clearly explain what the code does, without relying on AI for that explanation. I manually review every PR and test each change, so the risk of incorrect code slipping through is low. Still, to avoid wasting time, please refrain from submitting AI Slop PRs.

## Officially Supported Projects
Only this repository, [prebuild-binaries](https://github.com/qarmin/czkawka/releases), projects on [crates.io](https://crates.io/crates/czkawka_gui) and [flathub](https://flathub.org/apps/com.github.qarmin.czkawka) are directly maintained by me.  

Czkawka does not have an official website, so do not trust any sites that claim to be the official one.  

If you use packages from unofficial sources, make sure they are safe.

## License

The entire code in this repository is licensed under the [MIT](https://mit-license.org/) license.

All images and audio files are licensed under the [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/) license.

The Czkawka GTK GUI and CLI applications are licensed under the [MIT](https://mit-license.org/) license, while the Krokiet/Cedinia(due Slint license requirements) are licensed under the [GPL-3.0-only](https://www.gnu.org/licenses/gpl-3.0.en.html) license.

## Donations

If you are using the app, I would appreciate a donation for its further development, which can be
done [here](https://github.com/sponsors/qarmin).



================================================
FILE: cedinia/Cargo.toml
================================================
[package]
name = "cedinia"
version = "11.0.1"
authors = ["Rafał Mikrut <mikrutrafal@protonmail.com>"]
edition = "2024"
rust-version = "1.92.0"
description = "Android touch-friendly GUI for Czkawka Core – named after the Battle of Cedynia (972 AD)"
license = "GPL-3.0-only"
homepage = "https://github.com/qarmin/czkawka"
repository = "https://github.com/qarmin/czkawka"
build = "build.rs"

# Android requires a cdylib crate type
[lib]
name = "cedinia"
crate-type = ["cdylib", "rlib"]


[dependencies]
czkawka_core = { version = "11.0.1", path = "../czkawka_core" }
crossbeam-channel = "0.5"
log = "0.4"
humansize = "2.1"
filetime = "0.2"
serde = "1.0"
serde_json = "1.0"
image = { version = "0.25" }
fast_image_resize = { version = "6.0.0", features = ["image"] }

slint = { version = "1.15.0", default-features = false, features = [
    "std",
    "compat-1-2",
] }

# Translations
i18n-embed = { version = "0.16", features = ["fluent-system", "desktop-requester"] }
i18n-embed-fl = "0.10"
rust-embed = { version = "8.5", features = ["debug-embed"] }


[target.'cfg(target_os = "android")'.dependencies]
slint = { version = "1.15.0", default-features = false, features = [
    "std",
    "compat-1-2",
    "backend-android-activity-06",
] }
android-activity = { version = "0.6", features = ["native-activity"] }
# JNI bindings needed by file_picker_android.rs
jni = { version = "0.22.1", default-features = false }
# Log to Android logcat
android_logger = "0.15.1"

[target.'cfg(not(target_os = "android"))'.dependencies]
rfd = { version = "0.17", default-features = false, features = ["xdg-portal"] }
trash = "5.2.5"
slint = { version = "1.15.0", default-features = false, features = [
    "std",
    "compat-1-2",
    "backend-winit",
    "renderer-winit-femtovg",
    "renderer-winit-software",
] }

[build-dependencies]
slint-build = "1.15"
# Used by build.rs to compile Java helpers to DEX when cross-compiling for Android.
# The build.rs itself guards on TARGET containing "android" so this is a no-op on desktop.
android-build = "0.1.2"

[features]
default = []

# ── Android packaging metadata (used by cargo-apk) ───────────────────────────
[package.metadata.android]
package = "io.github.qarmin.cedinia"
label = "Cedinia"
resources = "res"

[package.metadata.android.sdk]
min_sdk_version = 21
target_sdk_version = 34

[package.metadata.android.application]
label = "@string/app_name"
icon = "@mipmap/ic_launcher"

# Use our NativeActivity subclass so that onActivityResult is intercepted
# and forwarded to CediniaFilePicker / the Rust JNI callback.
[package.metadata.android.application.activity]
name = "android.app.NativeActivity"
# Prevent Android from destroying and recreating the Activity on common
# configuration changes (nav-bar inset, keyboard, rotation, locale, …).
# Without this, setSystemUiVisibility(0) in setupNavBar() causes a
# screenSize change which Android defers until foreground → causes the
# "every-other-time restart" pattern.
config_changes = "orientation|keyboardHidden|screenSize|smallestScreenSize|navigation|uiMode|screenLayout|locale|density|fontScale"

# Full external storage access (needed to scan /sdcard root on Android 11+)
[[package.metadata.android.uses_permission]]
name = "android.permission.MANAGE_EXTERNAL_STORAGE"

[[package.metadata.android.uses_permission]]
name = "android.permission.READ_EXTERNAL_STORAGE"

[[package.metadata.android.uses_permission]]
name = "android.permission.WRITE_EXTERNAL_STORAGE"

[package.metadata.android.signing.dev]
path = "android/keystore/debug.keystore"
keystore_password = "123456"

[package.metadata.android.signing.release]
path = "android/keystore/release.keystore"
keystore_password = "123456"

[lints]
workspace = true

================================================
FILE: cedinia/LICENSE_CC_BY_4_ICONS
================================================
Icons
icons/*
res/*
ui/icons/*

Copyright (c) 2020-2026 Rafał Mikrut

License: CC-BY-4.0
 Creative Commons Attribution 4.0 International Public License
 .
 By exercising the Licensed Rights (defined below), You accept and agree
 to be bound by the terms and conditions of this Creative Commons
 Attribution 4.0 International Public License ("Public
 License"). To the extent this Public License may be interpreted as a
 contract, You are granted the Licensed Rights in consideration of Your
 acceptance of these terms and conditions, and the Licensor grants You
 such rights in consideration of benefits the Licensor receives from
 making the Licensed Material available under these terms and
 conditions.
 .
 Section 1 -- Definitions.
 .
 a. Adapted Material means material subject to Copyright and Similar
 Rights that is derived from or based upon the Licensed Material
 and in which the Licensed Material is translated, altered,
 arranged, transformed, or otherwise modified in a manner requiring
 permission under the Copyright and Similar Rights held by the
 Licensor. For purposes of this Public License, where the Licensed
 Material is a musical work, performance, or sound recording,
 Adapted Material is always produced where the Licensed Material is
 synched in timed relation with a moving image.
 .
 b. Adapter's License means the license You apply to Your Copyright
 and Similar Rights in Your contributions to Adapted Material in
 accordance with the terms and conditions of this Public License.
 .
 c. Copyright and Similar Rights means copyright and/or similar rights
 closely related to copyright including, without limitation,
 performance, broadcast, sound recording, and Sui Generis Database
 Rights, without regard to how the rights are labeled or
 categorized. For purposes of this Public License, the rights
 specified in Section 2(b)(1)-(2) are not Copyright and Similar
 Rights.
 .
 d. Effective Technological Measures means those measures that, in the
 absence of proper authority, may not be circumvented under laws
 fulfilling obligations under Article 11 of the WIPO Copyright
 Treaty adopted on December 20, 1996, and/or similar international
 agreements.
 .
 e. Exceptions and Limitations means fair use, fair dealing, and/or
 any other exception or limitation to Copyright and Similar Rights
 that applies to Your use of the Licensed Material.
 .
 f. Licensed Material means the artistic or literary work, database,
 or other material to which the Licensor applied this Public
 License.
 .
 g. Licensed Rights means the rights granted to You subject to the
 terms and conditions of this Public License, which are limited to
 all Copyright and Similar Rights that apply to Your use of the
 Licensed Material and that the Licensor has authority to license.
 .
 h. Licensor means the individual(s) or entity(ies) granting rights
 under this Public License.
 .
 i. Share means to provide material to the public by any means or
 process that requires permission under the Licensed Rights, such
 as reproduction, public display, public performance, distribution,
 dissemination, communication, or importation, and to make material
 available to the public including in ways that members of the
 public may access the material from a place and at a time
 individually chosen by them.
 .
 j. Sui Generis Database Rights means rights other than copyright
 resulting from Directive 96/9/EC of the European Parliament and of
 the Council of 11 March 1996 on the legal protection of databases,
 as amended and/or succeeded, as well as other essentially
 equivalent rights anywhere in the world.
 .
 k. You means the individual or entity exercising the Licensed Rights
 under this Public License. Your has a corresponding meaning.
 .
 Section 2 -- Scope.
 .
 a. License grant.
 .
 1. Subject to the terms and conditions of this Public License,
 the Licensor hereby grants You a worldwide, royalty-free,
 non-sublicensable, non-exclusive, irrevocable license to
 exercise the Licensed Rights in the Licensed Material to:
 .
 a. reproduce and Share the Licensed Material, in whole or
 in part; and
 .
 b. produce, reproduce, and Share Adapted Material.
 .
 2. Exceptions and Limitations. For the avoidance of doubt, where
 Exceptions and Limitations apply to Your use, this Public
 License does not apply, and You do not need to comply with
 its terms and conditions.
 .
 3. Term. The term of this Public License is specified in Section
 6(a).
 .
 4. Media and formats; technical modifications allowed. The
 Licensor authorizes You to exercise the Licensed Rights in
 all media and formats whether now known or hereafter created,
 and to make technical modifications necessary to do so. The
 Licensor waives and/or agrees not to assert any right or
 authority to forbid You from making technical modifications
 necessary to exercise the Licensed Rights, including
 technical modifications necessary to circumvent Effective
 Technological Measures. For purposes of this Public License,
 simply making modifications authorized by this Section 2(a)
 (4) never produces Adapted Material.
 .
 5. Downstream recipients.
 .
 a. Offer from the Licensor -- Licensed Material. Every
 recipient of the Licensed Material automatically
 receives an offer from the Licensor to exercise the
 Licensed Rights under the terms and conditions of this
 Public License.
 .
 b. No downstream restrictions. You may not offer or impose
 any additional or different terms or conditions on, or
 apply any Effective Technological Measures to, the
 Licensed Material if doing so restricts exercise of the
 Licensed Rights by any recipient of the Licensed
 Material.
 .
 6. No endorsement. Nothing in this Public License constitutes or
 may be construed as permission to assert or imply that You
 are, or that Your use of the Licensed Material is, connected
 with, or sponsored, endorsed, or granted official status by,
 the Licensor or others designated to receive attribution as
 provided in Section 3(a)(1)(A)(i).
 .
 b. Other rights.
 .
 1. Moral rights, such as the right of integrity, are not
 licensed under this Public License, nor are publicity,
 privacy, and/or other similar personality rights; however, to
 the extent possible, the Licensor waives and/or agrees not to
 assert any such rights held by the Licensor to the limited
 extent necessary to allow You to exercise the Licensed
 Rights, but not otherwise.
 .
 2. Patent and trademark rights are not licensed under this
 Public License.
 .
 3. To the extent possible, the Licensor waives any right to
 collect royalties from You for the exercise of the Licensed
 Rights, whether directly or through a collecting society
 under any voluntary or waivable statutory or compulsory
 licensing scheme. In all other cases the Licensor expressly
 reserves any right to collect such royalties.
 .
 Section 3 -- License Conditions.
 .
 Your exercise of the Licensed Rights is expressly made subject to the
 following conditions.
 .
 a. Attribution.
 .
 1. If You Share the Licensed Material (including in modified
 form), You must:
 .
 a. retain the following if it is supplied by the Licensor
 with the Licensed Material:
 .
 i. identification of the creator(s) of the Licensed
 Material and any others designated to receive
 attribution, in any reasonable manner requested by
 the Licensor (including by pseudonym if
 designated);
 .
 ii. a copyright notice;
 .
 iii. a notice that refers to this Public License;
 .
 iv. a notice that refers to the disclaimer of
 warranties;
 .
 v. a URI or hyperlink to the Licensed Material to the
 extent reasonably practicable;
 .
 b. indicate if You modified the Licensed Material and
 retain an indication of any previous modifications; and
 .
 c. indicate the Licensed Material is licensed under this
 Public License, and include the text of, or the URI or
 hyperlink to, this Public License.
 .
 2. You may satisfy the conditions in Section 3(a)(1) in any
 reasonable manner based on the medium, means, and context in
 which You Share the Licensed Material. For example, it may be
 reasonable to satisfy the conditions by providing a URI or
 hyperlink to a resource that includes the required
 information.
 .
 3. If requested by the Licensor, You must remove any of the
 information required by Section 3(a)(1)(A) to the extent
 reasonably practicable.
 .
 4. If You Share Adapted Material You produce, the Adapter's
 License You apply must not prevent recipients of the Adapted
 Material from complying with this Public License.
 .
 Section 4 -- Sui Generis Database Rights.
 .
 Where the Licensed Rights include Sui Generis Database Rights that
 apply to Your use of the Licensed Material:
 .
 a. for the avoidance of doubt, Section 2(a)(1) grants You the right
 to extract, reuse, reproduce, and Share all or a substantial
 portion of the contents of the database;
 .
 b. if You include all or a substantial portion of the database
 contents in a database in which You have Sui Generis Database
 Rights, then the database in which You have Sui Generis Database
 Rights (but not its individual contents) is Adapted Material; and
 .
 c. You must comply with the conditions in Section 3(a) if You Share
 all or a substantial portion of the contents of the database.
 .
 For the avoidance of doubt, this Section 4 supplements and does not
 replace Your obligations under this Public License where the Licensed
 Rights include other Copyright and Similar Rights.
 .
 Section 5 -- Disclaimer of Warranties and Limitation of Liability.
 .
 a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE
 EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS
 AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF
 ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,
 IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,
 WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR
 PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,
 ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT
 KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT
 ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.
 .
 b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE
 TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,
 NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,
 INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,
 COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR
 USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN
 ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR
 DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR
 IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.
 .
 c. The disclaimer of warranties and limitation of liability provided
 above shall be interpreted in a manner that, to the extent
 possible, most closely approximates an absolute disclaimer and
 waiver of all liability.
 .
 Section 6 -- Term and Termination.
 .
 a. This Public License applies for the term of the Copyright and
 Similar Rights licensed here. However, if You fail to comply with
 this Public License, then Your rights under this Public License
 terminate automatically.
 .
 b. Where Your right to use the Licensed Material has terminated under
 Section 6(a), it reinstates:
 .
 1. automatically as of the date the violation is cured, provided
 it is cured within 30 days of Your discovery of the
 violation; or
 .
 2. upon express reinstatement by the Licensor.
 .
 For the avoidance of doubt, this Section 6(b) does not affect any
 right the Licensor may have to seek remedies for Your violations
 of this Public License.
 .
 c. For the avoidance of doubt, the Licensor may also offer the
 Licensed Material under separate terms or conditions or stop
 distributing the Licensed Material at any time; however, doing so
 will not terminate this Public License.
 .
 d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
 License.
 .
 Section 7 -- Other Terms and Conditions.
 .
 a. The Licensor shall not be bound by any additional or different
 terms or conditions communicated by You unless expressly agreed.
 .
 b. Any arrangements, understandings, or agreements regarding the
 Licensed Material not stated herein are separate from and
 independent of the terms and conditions of this Public License.
 .
 Section 8 -- Interpretation.
 .
 a. For the avoidance of doubt, this Public License does not, and
 shall not be interpreted to, reduce, limit, restrict, or impose
 conditions on any use of the Licensed Material that could lawfully
 be made without permission under this Public License.
 .
 b. To the extent possible, if any provision of this Public License is
 deemed unenforceable, it shall be automatically reformed to the
 minimum extent necessary to make it enforceable. If the provision
 cannot be reformed, it shall be severed from this Public License
 without affecting the enforceability of the remaining terms and
 conditions.
 .
 c. No term or condition of this Public License will be waived and no
 failure to comply consented to unless expressly agreed to by the
 Licensor.
 .
 d. Nothing in this Public License constitutes or may be interpreted
 as a limitation upon, or waiver of, any privileges and immunities
 that apply to the Licensor or You, including from the legal
 processes of any jurisdiction or authority.

================================================
FILE: cedinia/LICENSE_GPL_APP
================================================
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007

Copyright © 2007 Free Software Foundation, Inc. <http://fsf.org/>

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.

     <one line to give the program's name and a brief idea of what it does.>
     Copyright (C) <year>  <name of author>

     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 <http://www.gnu.org/licenses/>.

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:

     Krokiet Copyright (C) 2024  Rafał Mikrut
     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 <http://www.gnu.org/licenses/>.

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 <http://www.gnu.org/philosophy/why-not-lgpl.html>.


================================================
FILE: cedinia/LICENSE_MIT_CODE
================================================
MIT License

Copyright (c) 2020-2026 Rafał Mikrut

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.

================================================
FILE: cedinia/README.md
================================================
# Cedinia

Cedinia is an experimental Android touch friendly GUI frontend for Czkawka Core, built with Slint. 

The name refers to the Battle of Cedynia in 972, a victory significant to the early Polish state.

## Installation
Probably the easiest way is to install it from prebuilt APKs, which can be found in the releases section.

## Compilation/Setup
Quite complicated - look for now at the CI or TMP_INSTALL.md for basic and not fully detailed instructions.

## AI usage
Because this project goes into parts of Android that I am not familiar with, I used a lot of AI assistance during development. I reviewed and guided every step myself, but AI helped speed things up. 

AI is a tool, like any other tool such as IntelliSense, debuggers, or documentation search, it can be used well or poorly. I simply try to use the available tools responsibly to build good software. 

I do not expect this project to become anything serious. It will most likely remain a small side experiment. If that changes, I will review all AI generated code and rewrite it where necessary so it works properly and meets my standards.

================================================
FILE: cedinia/TMP_INSTALL.md
================================================

```shell
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64   # must be JDK 17, see note above
export ANDROID_HOME=$HOME/android-sdk
export ANDROID_NDK_HOME=$ANDROID_HOME/ndk/26.3.11579264
export ANDROID_BUILD_TOOLS_VERSION=35.0.0              # set to 35 if you use JDK 21+
export PATH=$PATH:$ANDROID_HOME/cmdline-tools/latest/bin
export PATH=$PATH:$ANDROID_HOME/platform-tools

# Ubuntu / Debian - install Java (if you don't have it already)
sudo apt install openjdk-17-jdk

# Desktop (Rust) build/run
cargo build -p cedinia
cargo run -p cedinia

# Linux example – Android command-line tools setup (adjust paths to taste)
ANDROID_HOME=$HOME/android-sdk
mkdir -p $ANDROID_HOME/cmdline-tools
cd $ANDROID_HOME/cmdline-tools
# Download from https://developer.android.com/studio#command-tools, e.g. https://dl.google.com/android/repository/commandlinetools-linux-14742923_latest.zip
# unzip commandlinetools-linux-*.zip
# mv cmdline-tools latest

# Accept licences & install required packages
$ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --licenses
$ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager \
    "platform-tools" \
    "platforms;android-30" \
    "platforms;android-34" \
    "build-tools;34.0.0" \
    "build-tools;35.0.0" \
    "ndk;26.3.11579264"

# Reload the shell (if you added the exports to ~/.bashrc or ~/.zshrc)
source ~/.bashrc

# Install cargo-apk or cargo-xbuild
cargo install cargo-apk
# Or for an alternative toolchain
cargo install xbuild

# Add Android Rust targets
rustup target add \
    aarch64-linux-android \
    armv7-linux-androideabi \
    x86_64-linux-android \
    i686-linux-android

# Build the APK
# Debug APK
cargo apk build -p cedinia --lib

# Release APK (requires a signing key)
cargo apk build -p cedinia --lib --release

# Check connected devices
adb devices

# Install and launch on a connected device
adb install -r target/debug/apk/cedinia.apk
adb shell am start -n io.github.qarmin.cedinia/android.app.NativeActivity

# One-liner: build → install → launch
cargo apk build -p cedinia --lib && \
  adb install -r target/debug/apk/cedinia.apk && \
  adb shell am start -n io.github.qarmin.cedinia/android.app.NativeActivity

# Debugging: Live logs (Rust stdout/stderr, panics)
adb logcat -s RustStdoutStderr:V

# Full logcat filtered to Cedinia
adb logcat -s RustStdoutStderr:V io.github.qarmin.cedinia:V AndroidRuntime:E

# Crash / panic backtrace: set RUST_BACKTRACE=1 before building
RUST_BACKTRACE=1 cargo apk build -p cedinia --lib
# Then check adb logcat -s RustStdoutStderr:V

# Uninstall
adb uninstall io.github.qarmin.cedinia
```

================================================
FILE: cedinia/build.rs
================================================
use std::env;
use std::path::PathBuf;

fn main() {
    slint_build::compile_with_config("ui/main_window.slint", slint_build::CompilerConfiguration::new().with_style("material".into()))
        .expect(
Download .txt
gitextract_ixrhqrgv/

├── .cargo/
│   └── config.toml
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   └── feature_request.md
│   └── workflows/
│       ├── android.yml
│       ├── linux.yml
│       ├── mac.yml
│       ├── quality.yml
│       └── windows.yml
├── .gitignore
├── .mailmap
├── .rustfmt.toml
├── Cargo.toml
├── Changelog.md
├── LICENSE_CC_BY_4_ICONS
├── LICENSE_MIT_EVERYTHING_OUTSIDE_ANY_CARGO_APP_LIBRARY
├── README.md
├── cedinia/
│   ├── Cargo.toml
│   ├── LICENSE_CC_BY_4_ICONS
│   ├── LICENSE_GPL_APP
│   ├── LICENSE_MIT_CODE
│   ├── README.md
│   ├── TMP_INSTALL.md
│   ├── build.rs
│   ├── i18n/
│   │   ├── en/
│   │   │   └── cedinia.ftl
│   │   └── pl/
│   │       └── cedinia.ftl
│   ├── i18n.toml
│   ├── java/
│   │   ├── CediniaActivity.java
│   │   └── CediniaFilePicker.java
│   ├── res/
│   │   ├── drawable/
│   │   │   ├── ic_launcher_background.xml
│   │   │   └── ic_launcher_foreground.xml
│   │   ├── mipmap-anydpi-v26/
│   │   │   └── ic_launcher.xml
│   │   └── values/
│   │       └── strings.xml
│   ├── src/
│   │   ├── app.rs
│   │   ├── bin/
│   │   │   └── cedinia.rs
│   │   ├── callbacks/
│   │   │   ├── directories.rs
│   │   │   ├── misc.rs
│   │   │   ├── scan.rs
│   │   │   └── selection.rs
│   │   ├── callbacks.rs
│   │   ├── common.rs
│   │   ├── file_picker_android.rs
│   │   ├── lib.rs
│   │   ├── localizer_cedinia.rs
│   │   ├── model.rs
│   │   ├── scan_runner.rs
│   │   ├── scanners.rs
│   │   ├── set_initial_gui_infos.rs
│   │   ├── settings/
│   │   │   ├── gui_settings_values.rs
│   │   │   └── mod.rs
│   │   ├── thumbnail_loader.rs
│   │   ├── translations.rs
│   │   └── volumes.rs
│   └── ui/
│       ├── app_state.slint
│       ├── bottom_nav.slint
│       ├── colors.slint
│       ├── common.slint
│       ├── components.slint
│       ├── directories_screen.slint
│       ├── home_screen.slint
│       ├── main_window.slint
│       ├── results_list.slint
│       ├── scan_progress.slint
│       ├── settings_components.slint
│       ├── settings_screen.slint
│       ├── similar_images_gallery.slint
│       ├── top_bar.slint
│       └── translations.slint
├── ci_tester/
│   ├── Cargo.toml
│   └── src/
│       └── main.rs
├── clippy.toml
├── czkawka_cli/
│   ├── Cargo.toml
│   ├── LICENSE_MIT
│   ├── README.md
│   └── src/
│       ├── commands.rs
│       ├── main.rs
│       └── progress.rs
├── czkawka_core/
│   ├── Cargo.toml
│   ├── LICENSE_CC_BY_4_TEST_FILES
│   ├── LICENSE_MIT
│   ├── README.md
│   ├── benches/
│   │   └── hash_calculation_benchmark.rs
│   ├── build.rs
│   ├── i18n/
│   │   ├── ar/
│   │   │   └── czkawka_core.ftl
│   │   ├── bg/
│   │   │   └── czkawka_core.ftl
│   │   ├── cs/
│   │   │   └── czkawka_core.ftl
│   │   ├── de/
│   │   │   └── czkawka_core.ftl
│   │   ├── el/
│   │   │   └── czkawka_core.ftl
│   │   ├── en/
│   │   │   └── czkawka_core.ftl
│   │   ├── es-ES/
│   │   │   └── czkawka_core.ftl
│   │   ├── fa/
│   │   │   └── czkawka_core.ftl
│   │   ├── fr/
│   │   │   └── czkawka_core.ftl
│   │   ├── it/
│   │   │   └── czkawka_core.ftl
│   │   ├── ja/
│   │   │   └── czkawka_core.ftl
│   │   ├── ko/
│   │   │   └── czkawka_core.ftl
│   │   ├── nl/
│   │   │   └── czkawka_core.ftl
│   │   ├── no/
│   │   │   └── czkawka_core.ftl
│   │   ├── pl/
│   │   │   └── czkawka_core.ftl
│   │   ├── pt-BR/
│   │   │   └── czkawka_core.ftl
│   │   ├── pt-PT/
│   │   │   └── czkawka_core.ftl
│   │   ├── ro/
│   │   │   └── czkawka_core.ftl
│   │   ├── ru/
│   │   │   └── czkawka_core.ftl
│   │   ├── sv-SE/
│   │   │   └── czkawka_core.ftl
│   │   ├── tr/
│   │   │   └── czkawka_core.ftl
│   │   ├── uk/
│   │   │   └── czkawka_core.ftl
│   │   ├── zh-CN/
│   │   │   └── czkawka_core.ftl
│   │   └── zh-TW/
│   │       └── czkawka_core.ftl
│   ├── i18n.toml
│   └── src/
│       ├── common/
│       │   ├── basic_gui_cli.rs
│       │   ├── cache/
│       │   │   └── cleaning.rs
│       │   ├── cache.rs
│       │   ├── config_cache_path.rs
│       │   ├── consts.rs
│       │   ├── dir_traversal.rs
│       │   ├── directories.rs
│       │   ├── extensions.rs
│       │   ├── ffmpeg_utils.rs
│       │   ├── image.rs
│       │   ├── items.rs
│       │   ├── logger.rs
│       │   ├── mod.rs
│       │   ├── model.rs
│       │   ├── process_utils.rs
│       │   ├── progress_data.rs
│       │   ├── progress_stop_handler.rs
│       │   ├── tool_data.rs
│       │   ├── traits.rs
│       │   └── video_utils.rs
│       ├── helpers/
│       │   ├── audio_checker.rs
│       │   ├── debug_timer.rs
│       │   ├── delayed_sender.rs
│       │   ├── ffprobe.rs
│       │   ├── messages.rs
│       │   └── mod.rs
│       ├── lib.rs
│       ├── localizer_core.rs
│       └── tools/
│           ├── bad_extensions/
│           │   ├── core.rs
│           │   ├── mod.rs
│           │   ├── tests.rs
│           │   ├── traits.rs
│           │   └── workarounds.rs
│           ├── bad_names/
│           │   ├── core.rs
│           │   ├── mod.rs
│           │   ├── tests.rs
│           │   └── traits.rs
│           ├── big_file/
│           │   ├── core.rs
│           │   ├── mod.rs
│           │   ├── tests.rs
│           │   └── traits.rs
│           ├── broken_files/
│           │   ├── core.rs
│           │   ├── mod.rs
│           │   ├── tests.rs
│           │   └── traits.rs
│           ├── duplicate/
│           │   ├── core.rs
│           │   ├── mod.rs
│           │   ├── tests.rs
│           │   └── traits.rs
│           ├── empty_files/
│           │   ├── core.rs
│           │   ├── mod.rs
│           │   ├── tests.rs
│           │   └── traits.rs
│           ├── empty_folder/
│           │   ├── core.rs
│           │   ├── mod.rs
│           │   ├── tests.rs
│           │   └── traits.rs
│           ├── exif_remover/
│           │   ├── core.rs
│           │   ├── mod.rs
│           │   ├── tests.rs
│           │   └── traits.rs
│           ├── invalid_symlinks/
│           │   ├── core.rs
│           │   ├── mod.rs
│           │   ├── tests.rs
│           │   └── traits.rs
│           ├── mod.rs
│           ├── same_music/
│           │   ├── core.rs
│           │   ├── mod.rs
│           │   ├── tests.rs
│           │   └── traits.rs
│           ├── similar_images/
│           │   ├── core.rs
│           │   ├── mod.rs
│           │   ├── tests.rs
│           │   └── traits.rs
│           ├── similar_videos/
│           │   ├── core.rs
│           │   ├── mod.rs
│           │   ├── tests.rs
│           │   └── traits.rs
│           ├── temporary/
│           │   ├── core.rs
│           │   ├── mod.rs
│           │   └── traits.rs
│           └── video_optimizer/
│               ├── core/
│               │   ├── video_converter.rs
│               │   └── video_cropper.rs
│               ├── core.rs
│               ├── mod.rs
│               ├── tests.rs
│               └── traits.rs
├── czkawka_gui/
│   ├── Cargo.toml
│   ├── LICENSE_CC_BY_4_ICONS
│   ├── LICENSE_MIT_APP_CODE
│   ├── LICENSE_MIT_WINDOWS_THEME
│   ├── README.md
│   ├── i18n/
│   │   ├── ar/
│   │   │   └── czkawka_gui.ftl
│   │   ├── bg/
│   │   │   └── czkawka_gui.ftl
│   │   ├── cs/
│   │   │   └── czkawka_gui.ftl
│   │   ├── de/
│   │   │   └── czkawka_gui.ftl
│   │   ├── el/
│   │   │   └── czkawka_gui.ftl
│   │   ├── en/
│   │   │   └── czkawka_gui.ftl
│   │   ├── es-ES/
│   │   │   └── czkawka_gui.ftl
│   │   ├── fa/
│   │   │   └── czkawka_gui.ftl
│   │   ├── fr/
│   │   │   └── czkawka_gui.ftl
│   │   ├── it/
│   │   │   └── czkawka_gui.ftl
│   │   ├── ja/
│   │   │   └── czkawka_gui.ftl
│   │   ├── ko/
│   │   │   └── czkawka_gui.ftl
│   │   ├── nl/
│   │   │   └── czkawka_gui.ftl
│   │   ├── no/
│   │   │   └── czkawka_gui.ftl
│   │   ├── pl/
│   │   │   └── czkawka_gui.ftl
│   │   ├── pt-BR/
│   │   │   └── czkawka_gui.ftl
│   │   ├── pt-PT/
│   │   │   └── czkawka_gui.ftl
│   │   ├── ro/
│   │   │   └── czkawka_gui.ftl
│   │   ├── ru/
│   │   │   └── czkawka_gui.ftl
│   │   ├── sv-SE/
│   │   │   └── czkawka_gui.ftl
│   │   ├── tr/
│   │   │   └── czkawka_gui.ftl
│   │   ├── uk/
│   │   │   └── czkawka_gui.ftl
│   │   ├── zh-CN/
│   │   │   └── czkawka_gui.ftl
│   │   └── zh-TW/
│   │       └── czkawka_gui.ftl
│   ├── i18n.toml
│   ├── src/
│   │   ├── compute_results.rs
│   │   ├── connect_things/
│   │   │   ├── connect_about_buttons.rs
│   │   │   ├── connect_button_compare.rs
│   │   │   ├── connect_button_delete.rs
│   │   │   ├── connect_button_hardlink.rs
│   │   │   ├── connect_button_move.rs
│   │   │   ├── connect_button_save.rs
│   │   │   ├── connect_button_search.rs
│   │   │   ├── connect_button_select.rs
│   │   │   ├── connect_button_sort.rs
│   │   │   ├── connect_button_stop.rs
│   │   │   ├── connect_change_language.rs
│   │   │   ├── connect_duplicate_buttons.rs
│   │   │   ├── connect_header_buttons.rs
│   │   │   ├── connect_krokiet_info_dialog.rs
│   │   │   ├── connect_notebook_tabs.rs
│   │   │   ├── connect_popovers_select.rs
│   │   │   ├── connect_popovers_sort.rs
│   │   │   ├── connect_progress_window.rs
│   │   │   ├── connect_same_music_mode_changed.rs
│   │   │   ├── connect_selection_of_directories.rs
│   │   │   ├── connect_settings.rs
│   │   │   ├── connect_show_hide_ui.rs
│   │   │   ├── connect_similar_image_size_change.rs
│   │   │   ├── file_chooser_helpers.rs
│   │   │   └── mod.rs
│   │   ├── gtk_traits.rs
│   │   ├── gui_structs/
│   │   │   ├── common_tree_view.rs
│   │   │   ├── common_upper_tree_view.rs
│   │   │   ├── gui_about.rs
│   │   │   ├── gui_bottom_buttons.rs
│   │   │   ├── gui_compare_images.rs
│   │   │   ├── gui_data.rs
│   │   │   ├── gui_header.rs
│   │   │   ├── gui_main_notebook.rs
│   │   │   ├── gui_popovers_select.rs
│   │   │   ├── gui_popovers_sort.rs
│   │   │   ├── gui_progress_dialog.rs
│   │   │   ├── gui_settings.rs
│   │   │   ├── gui_upper_notebook.rs
│   │   │   └── mod.rs
│   │   ├── help_combo_box.rs
│   │   ├── help_functions.rs
│   │   ├── helpers/
│   │   │   ├── enums.rs
│   │   │   ├── image_operations.rs
│   │   │   ├── list_store_operations.rs
│   │   │   ├── mod.rs
│   │   │   └── model_iter.rs
│   │   ├── initialize_gui.rs
│   │   ├── language_functions.rs
│   │   ├── localizer_gui.rs
│   │   ├── main.rs
│   │   ├── notebook_enums.rs
│   │   ├── notebook_info.rs
│   │   ├── opening_selecting_records.rs
│   │   ├── saving_loading.rs
│   │   ├── taskbar_progress.rs
│   │   ├── taskbar_progress_dummy.rs
│   │   └── taskbar_progress_win.rs
│   └── ui/
│       ├── about_dialog.ui
│       ├── compare_images.ui
│       ├── czkawka.cmb
│       ├── main_window.ui
│       ├── popover_right_click.ui
│       ├── popover_select.ui
│       ├── popover_sort.ui
│       ├── progress.ui
│       └── settings.ui
├── data/
│   ├── com.github.qarmin.czkawka.desktop
│   ├── com.github.qarmin.czkawka.metainfo.xml
│   ├── io.github.qarmin.krokiet.desktop
│   └── io.github.qarmin.krokiet.metainfo.xml
├── instructions/
│   ├── Instruction.md
│   └── Translations.md
├── justfile
├── krokiet/
│   ├── Cargo.toml
│   ├── LICENSE_CC_BY_4_AUDIO_FILES
│   ├── LICENSE_CC_BY_4_ICONS
│   ├── LICENSE_GPL_APP
│   ├── LICENSE_MIT_CODE
│   ├── README.md
│   ├── build.rs
│   ├── i18n/
│   │   ├── ar/
│   │   │   └── krokiet.ftl
│   │   ├── bg/
│   │   │   └── krokiet.ftl
│   │   ├── cs/
│   │   │   └── krokiet.ftl
│   │   ├── de/
│   │   │   └── krokiet.ftl
│   │   ├── el/
│   │   │   └── krokiet.ftl
│   │   ├── en/
│   │   │   └── krokiet.ftl
│   │   ├── es-ES/
│   │   │   └── krokiet.ftl
│   │   ├── fa/
│   │   │   └── krokiet.ftl
│   │   ├── fr/
│   │   │   └── krokiet.ftl
│   │   ├── it/
│   │   │   └── krokiet.ftl
│   │   ├── ja/
│   │   │   └── krokiet.ftl
│   │   ├── ko/
│   │   │   └── krokiet.ftl
│   │   ├── nl/
│   │   │   └── krokiet.ftl
│   │   ├── no/
│   │   │   └── krokiet.ftl
│   │   ├── pl/
│   │   │   └── krokiet.ftl
│   │   ├── pt-BR/
│   │   │   └── krokiet.ftl
│   │   ├── pt-PT/
│   │   │   └── krokiet.ftl
│   │   ├── ro/
│   │   │   └── krokiet.ftl
│   │   ├── ru/
│   │   │   └── krokiet.ftl
│   │   ├── sv-SE/
│   │   │   └── krokiet.ftl
│   │   ├── tr/
│   │   │   └── krokiet.ftl
│   │   ├── uk/
│   │   │   └── krokiet.ftl
│   │   ├── zh-CN/
│   │   │   └── krokiet.ftl
│   │   └── zh-TW/
│   │       └── krokiet.ftl
│   ├── i18n.toml
│   ├── src/
│   │   ├── audio_player.rs
│   │   ├── clear_outdated_video_thumbnails.rs
│   │   ├── common.rs
│   │   ├── connect_clean_cache.rs
│   │   ├── connect_directories_changes.rs
│   │   ├── connect_open.rs
│   │   ├── connect_progress_receiver.rs
│   │   ├── connect_rfd.rs
│   │   ├── connect_row_selection.rs
│   │   ├── connect_save.rs
│   │   ├── connect_scan/
│   │   │   ├── bad_extensions.rs
│   │   │   ├── bad_names.rs
│   │   │   ├── big_files.rs
│   │   │   ├── broken_files.rs
│   │   │   ├── duplicate.rs
│   │   │   ├── empty_files.rs
│   │   │   ├── empty_folders.rs
│   │   │   ├── exif_remover.rs
│   │   │   ├── invalid_symlinks.rs
│   │   │   ├── same_music.rs
│   │   │   ├── similar_images.rs
│   │   │   ├── similar_videos.rs
│   │   │   ├── temporary_files.rs
│   │   │   └── video_optimizer.rs
│   │   ├── connect_scan.rs
│   │   ├── connect_select/
│   │   │   ├── custom_select.rs
│   │   │   └── mod.rs
│   │   ├── connect_show_confirmation.rs
│   │   ├── connect_show_preview.rs
│   │   ├── connect_sort.rs
│   │   ├── connect_stop.rs
│   │   ├── connect_tab_changed.rs
│   │   ├── connect_translation.rs
│   │   ├── create_calculate_task_size.rs
│   │   ├── file_actions/
│   │   │   ├── connect_clean_exif.rs
│   │   │   ├── connect_delete.rs
│   │   │   ├── connect_hardlink.rs
│   │   │   ├── connect_move.rs
│   │   │   ├── connect_optimize_video.rs
│   │   │   ├── connect_rename.rs
│   │   │   ├── connect_symlink.rs
│   │   │   └── mod.rs
│   │   ├── localizer_krokiet.rs
│   │   ├── main.rs
│   │   ├── model_operations/
│   │   │   ├── mod.rs
│   │   │   └── model_processor.rs
│   │   ├── set_initial_gui_info.rs
│   │   ├── set_initial_scroll_list_data_indexes.rs
│   │   ├── settings/
│   │   │   ├── combo_box.rs
│   │   │   ├── mod.rs
│   │   │   └── model.rs
│   │   ├── shared_models.rs
│   │   ├── simpler_model.rs
│   │   └── test_common.rs
│   └── ui/
│       ├── about.slint
│       ├── action_buttons.slint
│       ├── bottom_panel.slint
│       ├── callabler.slint
│       ├── color_palette.slint
│       ├── common.slint
│       ├── fonts.slint
│       ├── gui_state.slint
│       ├── included_paths.slint
│       ├── left_side_panel.slint
│       ├── main_lists.slint
│       ├── main_window.slint
│       ├── popup_action_confirm.slint
│       ├── popup_base.slint
│       ├── popup_centered_text.slint
│       ├── popup_clean_cache.slint
│       ├── popup_clean_exif.slint
│       ├── popup_crop_video.slint
│       ├── popup_custom_select.slint
│       ├── popup_delete.slint
│       ├── popup_move_folders.slint
│       ├── popup_new_directories.slint
│       ├── popup_optimize.slint
│       ├── popup_rename_bad_extensions.slint
│       ├── popup_rename_bad_file_names.slint
│       ├── popup_save.slint
│       ├── popup_select_results.slint
│       ├── popup_sort.slint
│       ├── preview.slint
│       ├── progress.slint
│       ├── selectable_tree_view.slint
│       ├── settings.slint
│       ├── settings_list.slint
│       ├── tool_settings.slint
│       └── translations.slint
└── misc/
    ├── add_icon_exe/
    │   └── Cargo.toml
    ├── ai_translate/
    │   ├── ftl_utils.py
    │   ├── pyproject.toml
    │   ├── translate.py
    │   └── validate_translations.py
    ├── cargo/
    │   ├── PublishCore.sh
    │   └── PublishOther.sh
    ├── compare_files.sh
    ├── delete_unused_krokiet_slint_imports.py
    ├── docker/
    │   └── Dockerfile
    ├── find_unused_callbacks.py
    ├── find_unused_fluent_translations.py
    ├── find_unused_settings_properties.py
    ├── find_unused_slint_translations.py
    ├── flathub.sh
    ├── gen_android_icons.py
    ├── nix/
    │   ├── flake.nix
    │   └── packages.nix
    ├── remove_comments.py
    ├── run_checks.sh
    ├── simplify_and_minify_svg.py
    ├── test_compilation_speed_size/
    │   ├── Cargo.toml
    │   ├── README.md
    │   ├── generate_md_and_plots.py
    │   └── src/
    │       ├── main.rs
    │       ├── model.rs
    │       └── new_chart.rs
    ├── test_image_perf/
    │   ├── Cargo.toml
    │   └── src/
    │       └── main.rs
    └── test_read_perf/
        ├── Cargo.toml
        └── src/
            └── main.rs
Download .txt
Showing preview only (262K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (2658 symbols across 237 files)

FILE: cedinia/build.rs
  function main (line 4) | fn main() {
  function compile_android_java (line 15) | fn compile_android_java() {

FILE: cedinia/java/CediniaActivity.java
  class CediniaActivity (line 16) | public class CediniaActivity extends NativeActivity {
    method onCreate (line 18) | @Override
    method onWindowFocusChanged (line 28) | @Override
    method onBackPressed (line 39) | @Override
    method onActivityResult (line 49) | @Override

FILE: cedinia/java/CediniaFilePicker.java
  class CediniaFilePicker (line 24) | public class CediniaFilePicker {
    method hasStoragePermission (line 39) | public static boolean hasStoragePermission(Activity activity) {
    method requestStoragePermission (line 57) | public static void requestStoragePermission(final Activity activity) {
    method setupNavBar (line 97) | public static void setupNavBar(final Activity activity) {
    method pickIncludeDirectory (line 121) | public static void pickIncludeDirectory(Activity activity) {
    method pickExcludeDirectory (line 128) | public static void pickExcludeDirectory(Activity activity) {
    method launchPicker (line 136) | private static void launchPicker(final Activity activity, final boolea...
    method showPathDialog (line 157) | static void showPathDialog(final Activity activity, final boolean isIn...
    method handleActivityResult (line 203) | public static void handleActivityResult(
    method persistPermission (line 234) | private static void persistPermission(Activity activity, Uri treeUri) {
    method resolveTreeUriToPath (line 247) | private static String resolveTreeUriToPath(Uri treeUri) {
    method onDirectoryPicked (line 289) | public static native void onDirectoryPicked(String path, boolean isInc...

FILE: cedinia/src/app.rs
  function on_directory_picked (line 34) | pub fn on_directory_picked(path: String, is_include: bool) {
  function run_app (line 55) | pub fn run_app() {
  function run_app_with_insets (line 65) | pub fn run_app_with_insets(inset_bottom_px: f32, scale: f32, android_app...
  function run_app_with_insets (line 70) | pub fn run_app_with_insets(inset_bottom_px: f32, scale: f32, _unused: ()) {
  function build_gallery_groups (line 74) | fn build_gallery_groups(items: &[FileItem], placeholder: &slint::Image) ...
  function show_delete_errors (line 116) | fn show_delete_errors(win: &MainWindow, errors: &[String]) {
  function rebuild_similar_images_after_delete (line 125) | fn rebuild_similar_images_after_delete(win: &MainWindow, deleted: &std::...
  type GuiHandler (line 181) | struct GuiHandler {
  method on_result (line 189) | fn on_result(&self, result: ScanResult) {
  function run_app_inner (line 330) | fn run_app_inner(
  function setup_logger_cache (line 622) | pub(crate) fn setup_logger_cache() {

FILE: cedinia/src/bin/cedinia.rs
  function main (line 1) | fn main() {

FILE: cedinia/src/callbacks/directories.rs
  function wire_directories (line 9) | pub(crate) fn wire_directories(window: &MainWindow, included_dirs: Rc<st...
  function build_dir_model (line 118) | pub(crate) fn build_dir_model(included: &[PathBuf], excluded: &[PathBuf]...

FILE: cedinia/src/callbacks/misc.rs
  function wire_open_path (line 13) | pub(crate) fn wire_open_path(window: &MainWindow) {
  function wire_permission (line 32) | pub(crate) fn wire_permission(window: &MainWindow) {
  function wire_collect_test (line 50) | pub(crate) fn wire_collect_test(window: &MainWindow) {
  function dir_size_recursive (line 112) | fn dir_size_recursive(path: &Path) -> u64 {
  function wire_cache_info (line 128) | pub(crate) fn wire_cache_info(window: &MainWindow) {
  function wire_language_change (line 187) | pub(crate) fn wire_language_change(window: &MainWindow) {
  function wire_open_url (line 198) | pub(crate) fn wire_open_url(window: &MainWindow) {
  function wire_save_settings_now (line 211) | pub(crate) fn wire_save_settings_now(window: &MainWindow, included_dirs:...

FILE: cedinia/src/callbacks/scan.rs
  function wire_scan (line 20) | pub(crate) fn wire_scan(
  function empty_entries (line 67) | fn empty_entries() -> ModelRc<FileEntry> {
  function clear_tool_results (line 71) | fn clear_tool_results(win: &MainWindow, tool: ActiveTool) {
  function build_common_filters (line 92) | fn build_common_filters(win: &MainWindow) -> CommonFilters {
  function build_scan_request (line 116) | fn build_scan_request(win: &MainWindow, tool: ActiveTool, dirs: Vec<Path...

FILE: cedinia/src/callbacks/selection.rs
  function delete_path (line 12) | fn delete_path(path: &str) -> Result<(), String> {
  function delete_path (line 17) | fn delete_path(path: &str) -> Result<(), String> {
  type DeleteEvent (line 21) | pub(crate) enum DeleteEvent {
  function vm_of (line 33) | fn vm_of(model: &ModelRc<FileEntry>) -> Option<&VecModel<FileEntry>> {
  function size_from_entry (line 37) | fn size_from_entry(e: &FileEntry) -> u64 {
  function get_val_str (line 43) | fn get_val_str(e: &FileEntry, idx: usize) -> String {
  function get_val_int (line 47) | fn get_val_int(e: &FileEntry, idx: usize) -> i32 {
  function full_path_of (line 51) | fn full_path_of(e: &FileEntry) -> String {
  function execute_delete_selected (line 57) | fn execute_delete_selected(win: &MainWindow, tx: std::sync::mpsc::Sender...
  function execute_rename_selected (line 97) | fn execute_rename_selected(win: &MainWindow, tx: std::sync::mpsc::Sender...
  function execute_rename_bad_names (line 153) | fn execute_rename_bad_names(win: &MainWindow, tx: std::sync::mpsc::Sende...
  function execute_clean_exif_selected (line 204) | fn execute_clean_exif_selected(win: &MainWindow, tx: std::sync::mpsc::Se...
  function clean_exif_all_tags (line 241) | fn clean_exif_all_tags(path: &str) -> Result<(), String> {
  function wire_selection (line 247) | pub(crate) fn wire_selection(window: &MainWindow, delete_tx: std::sync::...
  function get_model_for_tool (line 587) | pub(crate) fn get_model_for_tool(win: &MainWindow, tool: ActiveTool) -> ...
  function set_all_checked (line 604) | pub(crate) fn set_all_checked(model: &ModelRc<FileEntry>, state: bool) {
  function select_except_one_per_group (line 616) | pub(crate) fn select_except_one_per_group(model: &ModelRc<FileEntry>, se...
  function sync_gallery_if_similar (line 673) | fn sync_gallery_if_similar(win: &MainWindow, tool: ActiveTool) {
  function select_largest_per_group (line 679) | pub(crate) fn select_largest_per_group(model: &ModelRc<FileEntry>) {
  function select_all_except_largest (line 683) | pub(crate) fn select_all_except_largest(model: &ModelRc<FileEntry>) {
  function select_smallest_per_group (line 687) | pub(crate) fn select_smallest_per_group(model: &ModelRc<FileEntry>) {
  function select_all_except_smallest (line 691) | pub(crate) fn select_all_except_smallest(model: &ModelRc<FileEntry>) {
  function select_by_size_per_group (line 695) | fn select_by_size_per_group(model: &ModelRc<FileEntry>, largest: bool, s...
  function resolution_from_entry (line 724) | fn resolution_from_entry(e: &FileEntry) -> u64 {
  function select_by_resolution_per_group (line 730) | fn select_by_resolution_per_group(model: &ModelRc<FileEntry>, highest: b...
  function select_highest_resolution_per_group (line 766) | pub(crate) fn select_highest_resolution_per_group(model: &ModelRc<FileEn...
  function select_all_except_highest_resolution (line 769) | pub(crate) fn select_all_except_highest_resolution(model: &ModelRc<FileE...
  function select_lowest_resolution_per_group (line 772) | pub(crate) fn select_lowest_resolution_per_group(model: &ModelRc<FileEnt...
  function select_all_except_lowest_resolution (line 775) | pub(crate) fn select_all_except_lowest_resolution(model: &ModelRc<FileEn...
  function sync_gallery_checked_from_flat (line 778) | pub(crate) fn sync_gallery_checked_from_flat(win: &MainWindow) {

FILE: cedinia/src/common.rs
  constant STR_IDX_NAME (line 1) | pub const STR_IDX_NAME: usize = 0;
  constant STR_IDX_PATH (line 2) | pub const STR_IDX_PATH: usize = 1;
  constant STR_IDX_SIZE (line 3) | pub const STR_IDX_SIZE: usize = 2;
  constant STR_IDX_MODIFIED (line 4) | pub const STR_IDX_MODIFIED: usize = 3;
  constant STR_BASE_COUNT (line 5) | pub const STR_BASE_COUNT: usize = 4;
  constant INT_IDX_MOD_HI (line 7) | pub const INT_IDX_MOD_HI: usize = 0;
  constant INT_IDX_MOD_LO (line 8) | pub const INT_IDX_MOD_LO: usize = 1;
  constant INT_IDX_SIZE_HI (line 9) | pub const INT_IDX_SIZE_HI: usize = 2;
  constant INT_IDX_SIZE_LO (line 10) | pub const INT_IDX_SIZE_LO: usize = 3;
  constant INT_BASE_COUNT (line 11) | pub const INT_BASE_COUNT: usize = 4;
  type StrDataSimilarImages (line 15) | pub enum StrDataSimilarImages {
  constant MAX_STR_DATA_SIMILAR_IMAGES (line 18) | pub const MAX_STR_DATA_SIMILAR_IMAGES: usize = StrDataSimilarImages::Dim...
  type IntDataSimilarImages (line 22) | pub enum IntDataSimilarImages {
  constant MAX_INT_DATA_SIMILAR_IMAGES (line 27) | pub const MAX_INT_DATA_SIMILAR_IMAGES: usize = IntDataSimilarImages::Dif...
  type StrDataBrokenFiles (line 31) | pub enum StrDataBrokenFiles {
  constant MAX_STR_DATA_BROKEN_FILES (line 34) | pub const MAX_STR_DATA_BROKEN_FILES: usize = StrDataBrokenFiles::ErrorSt...
  type StrDataBadExtensions (line 38) | pub enum StrDataBadExtensions {
  constant MAX_STR_DATA_BAD_EXTENSIONS (line 42) | pub const MAX_STR_DATA_BAD_EXTENSIONS: usize = StrDataBadExtensions::Pro...
  type StrDataSameMusic (line 46) | pub enum StrDataSameMusic {
  constant MAX_STR_DATA_SAME_MUSIC (line 50) | pub const MAX_STR_DATA_SAME_MUSIC: usize = StrDataSameMusic::Title as us...
  type StrDataBadNames (line 54) | pub enum StrDataBadNames {
  constant MAX_STR_DATA_BAD_NAMES (line 57) | pub const MAX_STR_DATA_BAD_NAMES: usize = StrDataBadNames::NewName as us...
  type IntDataExifRemover (line 61) | pub enum IntDataExifRemover {
  constant MAX_INT_DATA_EXIF_REMOVER (line 64) | pub const MAX_INT_DATA_EXIF_REMOVER: usize = IntDataExifRemover::ExifTag...

FILE: cedinia/src/file_picker_android.rs
  function pending_pick (line 12) | fn pending_pick() -> &'static Arc<Mutex<Option<(String, bool)>>> {
  function Java_CediniaFilePicker_onDirectoryPicked (line 18) | unsafe extern "system" fn Java_CediniaFilePicker_onDirectoryPicked(mut u...
  function init (line 56) | pub fn init(app: &AndroidApp) {
  function launch_pick_directory (line 143) | pub fn launch_pick_directory(is_include: bool) {
  function setup_nav_bar (line 187) | pub fn setup_nav_bar() {
  function check_storage_permission (line 222) | pub fn check_storage_permission() -> bool {
  function request_storage_permission (line 255) | pub fn request_storage_permission() {

FILE: cedinia/src/lib.rs
  function android_files_path (line 24) | pub fn android_files_path() -> Option<&'static str> {
  function android_cache_path (line 27) | pub fn android_cache_path() -> Option<&'static str> {
  function setup_android_paths (line 32) | fn setup_android_paths(android_app: &slint::android::AndroidApp) {
  function android_main (line 62) | fn android_main(android_app: slint::android::AndroidApp) {

FILE: cedinia/src/localizer_cedinia.rs
  type Localizations (line 7) | struct Localizations;
  function localizer_cedinia (line 22) | pub(crate) fn localizer_cedinia() -> Box<dyn Localizer> {
  function detect_os_language_idx (line 28) | pub(crate) fn detect_os_language_idx() -> i32 {
  function apply_language_preference (line 41) | pub(crate) fn apply_language_preference(lang: &str) {

FILE: cedinia/src/model.rs
  function make_file_model (line 6) | pub fn make_file_model(items: Vec<FileItem>) -> ModelRc<FileEntry> {
  function toggle_row (line 24) | pub fn toggle_row(model: &ModelRc<FileEntry>, index: usize) {
  function count_checked (line 36) | pub fn count_checked(model: &ModelRc<FileEntry>) -> i32 {

FILE: cedinia/src/scan_runner.rs
  type FileItem (line 20) | pub struct FileItem {
  type CommonFilters (line 27) | pub struct CommonFilters {
  type ScanRequest (line 36) | pub enum ScanRequest {
  type ProgressUpdate (line 104) | pub struct ProgressUpdate {
  type ScanResult (line 113) | pub enum ScanResult {
  type ScanResultHandler (line 129) | pub trait ScanResultHandler: Send + Sync + 'static {
    method on_result (line 130) | fn on_result(&self, result: ScanResult);
  function start_worker (line 133) | pub fn start_worker<H: ScanResultHandler>(handler: H) -> (Sender<ScanReq...
  function worker_loop (line 146) | fn worker_loop<H: ScanResultHandler + Sync>(req_rx: &Receiver<ScanReques...
  function stage_uses_bytes (line 282) | fn stage_uses_bytes(stage: CurrentStage) -> bool {
  function stage_label (line 289) | fn stage_label(stage: CurrentStage) -> &'static str {
  function stage_label_full (line 330) | fn stage_label_full(pd: &CoreProgress) -> String {
  function apply_filters (line 344) | pub(crate) fn apply_filters<T: CommonData>(tool: &mut T, filters: &Commo...
  function spawn_progress_forwarder (line 362) | pub(crate) fn spawn_progress_forwarder<H: ScanResultHandler + Sync>(hand...
  function fmt_size (line 380) | pub(crate) fn fmt_size(bytes: u64) -> String {
  function fmt_date (line 384) | pub(crate) fn fmt_date(unix_secs: u64) -> String {
  function size_to_hi_lo (line 422) | pub(crate) fn size_to_hi_lo(size: u64) -> (i32, i32) {
  function file_name (line 428) | pub(crate) fn file_name(p: &std::path::Path) -> String {
  function parent_str (line 432) | pub(crate) fn parent_str(p: &std::path::Path) -> String {

FILE: cedinia/src/scanners.rs
  function base_item (line 15) | fn base_item(is_header: bool, name: String, path: String, size_str: Stri...
  function header_item (line 27) | fn header_item(label: String) -> FileItem {
  function item_name (line 37) | fn item_name(item: &FileItem) -> &str {
  function item_path (line 41) | fn item_path(item: &FileItem) -> &str {
  function item_size_u64 (line 45) | fn item_size_u64(item: &FileItem) -> u64 {
  function scan_duplicate_files (line 51) | pub(crate) fn scan_duplicate_files<H: ScanResultHandler>(
  function scan_empty_folders (line 99) | pub(crate) fn scan_empty_folders<H: ScanResultHandler>(dirs: Vec<PathBuf...
  function scan_similar_images (line 127) | pub(crate) fn scan_similar_images<H: ScanResultHandler>(
  function scan_empty_files (line 179) | pub(crate) fn scan_empty_files<H: ScanResultHandler>(dirs: Vec<PathBuf>,...
  function scan_temporary_files (line 208) | pub(crate) fn scan_temporary_files<H: ScanResultHandler>(dirs: Vec<PathB...
  function scan_big_files (line 237) | pub(crate) fn scan_big_files<H: ScanResultHandler>(
  function scan_broken_files (line 272) | pub(crate) fn scan_broken_files<H: ScanResultHandler>(
  function scan_bad_extensions (line 314) | pub(crate) fn scan_bad_extensions<H: ScanResultHandler>(dirs: Vec<PathBu...
  function scan_bad_names (line 356) | pub(crate) fn scan_bad_names<H: ScanResultHandler>(
  function scan_exif_remover (line 409) | pub(crate) fn scan_exif_remover<H: ScanResultHandler>(dirs: Vec<PathBuf>...
  function scan_same_music (line 442) | pub(crate) fn scan_same_music<H: ScanResultHandler>(

FILE: cedinia/src/set_initial_gui_infos.rs
  function set_initial_gui_infos (line 6) | pub(crate) fn set_initial_gui_infos(app: &MainWindow) {

FILE: cedinia/src/settings/gui_settings_values.rs
  type StringComboBoxItem (line 10) | pub struct StringComboBoxItem<T>
  type MinFileSize (line 20) | pub enum MinFileSize {
    method to_bytes (line 29) | pub fn to_bytes(self) -> u64 {
  type MaxFileSize (line 41) | pub enum MaxFileSize {
    method to_bytes (line 51) | pub fn to_bytes(self) -> Option<u64> {
  type StringComboBoxItems (line 62) | pub struct StringComboBoxItems {
    method new (line 83) | pub fn new() -> Self {
    method convert (line 162) | fn convert<T>(input: &[(&str, &str, T)]) -> Vec<StringComboBoxItem<T>>
    method idx_from_config_name (line 176) | pub fn idx_from_config_name<T: Clone + Debug>(config_name: &str, items...
    method value_from_idx (line 185) | pub fn value_from_idx<T: Clone + Debug>(items: &[StringComboBoxItem<T>...
    method config_name_from_idx (line 196) | pub fn config_name_from_idx<T: Clone + Debug>(items: &[StringComboBoxI...
    method value_from_config_name (line 206) | pub fn value_from_config_name<T: Clone + Debug>(config_name: &str, ite...
  method default (line 77) | fn default() -> Self {

FILE: cedinia/src/settings/mod.rs
  function default_check_method (line 11) | fn default_check_method() -> String {
  function default_hash_type (line 14) | fn default_hash_type() -> String {
  function default_hash_size (line 17) | fn default_hash_size() -> String {
  function ttrue (line 20) | fn ttrue() -> bool {
  function default_similarity_preset (line 23) | fn default_similarity_preset() -> String {
  function default_search_mode (line 26) | fn default_search_mode() -> String {
  function default_big_files_count (line 29) | fn default_big_files_count() -> String {
  function default_min_file_size_idx (line 32) | fn default_min_file_size_idx() -> i32 {
  function default_max_file_size_idx (line 35) | fn default_max_file_size_idx() -> i32 {
  function default_language (line 38) | fn default_language() -> String {
  function default_hash_alg (line 41) | fn default_hash_alg() -> String {
  function default_image_filter (line 44) | fn default_image_filter() -> String {
  function default_same_music_check_method (line 47) | fn default_same_music_check_method() -> String {
  function default_excluded_items (line 50) | fn default_excluded_items() -> String {
  type CediniaSettings (line 62) | pub struct CediniaSettings {
  method default (line 140) | fn default() -> Self {
  function get_dirs_file (line 180) | fn get_dirs_file() -> Option<PathBuf> {
  type DirConfig (line 186) | struct DirConfig {
  function save_dirs (line 191) | pub fn save_dirs(included: &[PathBuf], excluded: &[PathBuf]) {
  function load_dirs (line 218) | pub fn load_dirs() -> (Vec<PathBuf>, Vec<PathBuf>) {
  function get_config_file (line 244) | fn get_config_file() -> Option<PathBuf> {
  function load_settings (line 249) | pub fn load_settings() -> CediniaSettings {
  function save_settings (line 278) | pub fn save_settings(settings: &CediniaSettings) {
  function apply_settings_to_gui (line 307) | pub fn apply_settings_to_gui(win: &MainWindow, s: &CediniaSettings) {
  function collect_settings_from_gui (line 385) | pub fn collect_settings_from_gui(win: &MainWindow) -> CediniaSettings {

FILE: cedinia/src/thumbnail_loader.rs
  type ThumbnailData (line 13) | pub enum ThumbnailData {
  type ThumbnailResult (line 18) | pub struct ThumbnailResult {
  function get_total_ram_mb (line 25) | fn get_total_ram_mb() -> u64 {
  function cache_limit_bytes (line 39) | pub fn cache_limit_bytes() -> u64 {
  function thumbnail_cache_dir (line 53) | pub fn thumbnail_cache_dir() -> PathBuf {
  function cache_key (line 66) | fn cache_key(path: &str, mtime_secs: u64, file_size: u64) -> String {
  function try_read_png_cache (line 74) | fn try_read_png_cache(cache_path: &Path) -> Option<(Vec<u8>, u32, u32)> {
  function try_write_png_cache (line 83) | fn try_write_png_cache(cache_path: &Path, rgba: &[u8], w: u32, h: u32) {
  function make_placeholder_image (line 97) | pub fn make_placeholder_image() -> slint::Image {
  function rgba_to_slint_image (line 115) | pub fn rgba_to_slint_image(rgba: &[u8], width: u32, height: u32) -> slin...
  function load_and_resize_thumbnail (line 120) | pub fn load_and_resize_thumbnail(path: &str, cache_dir: &Path) -> Option...
  function collect_thumb_tasks (line 172) | pub fn collect_thumb_tasks(items: &[FileItem]) -> Vec<(usize, usize, Str...
  function cleanup_old_thumbnails (line 192) | pub fn cleanup_old_thumbnails() {
  function spawn_thumbnail_loader (line 206) | pub fn spawn_thumbnail_loader(tasks: Vec<(usize, usize, String)>, tx: st...

FILE: cedinia/src/translations.rs
  function translate_items (line 5) | pub(crate) fn translate_items(app: &MainWindow) {

FILE: cedinia/src/volumes.rs
  function home_dir (line 9) | pub(crate) fn home_dir() -> PathBuf {
  function detect_storage_volumes (line 20) | pub(crate) fn detect_storage_volumes() -> Vec<VolumeEntry> {
  function classify_mountpoint (line 106) | pub(crate) fn classify_mountpoint(path: &str) -> &'static str {
  function refresh_volumes_flags (line 123) | pub(crate) fn refresh_volumes_flags(win: &MainWindow, included: &[PathBu...
  function count_files_and_dirs_stoppable (line 137) | pub(crate) fn count_files_and_dirs_stoppable(root: &std::path::Path, sto...

FILE: ci_tester/src/main.rs
  type CollectedFiles (line 10) | struct CollectedFiles {
  constant ATTEMPTS (line 19) | const ATTEMPTS: u32 = 10;
  constant PRINT_MESSAGES_TO_TERMINAL_INSTEAD_OUTPUT (line 20) | const PRINT_MESSAGES_TO_TERMINAL_INSTEAD_OUTPUT: bool = true;
  function collect_output (line 22) | pub(crate) fn collect_output(output: &Output) -> String {
  function test_args (line 30) | fn test_args() {
  function main (line 41) | fn main() {
  function test_remove_videos_one_oldest (line 102) | fn test_remove_videos_one_oldest() {
  function test_remove_videos_one_newest (line 106) | fn test_remove_videos_one_newest() {
  function test_remove_videos_all_expect_oldest (line 110) | fn test_remove_videos_all_expect_oldest() {
  function test_remove_videos_all_expect_newest (line 119) | fn test_remove_videos_all_expect_newest() {
  function test_remove_videos_one_smallest (line 128) | fn test_remove_videos_one_smallest() {
  function test_remove_videos_one_biggest (line 132) | fn test_remove_videos_one_biggest() {
  function test_remove_videos_all_expect_smallest (line 136) | fn test_remove_videos_all_expect_smallest() {
  function test_remove_videos_all_expect_biggest (line 145) | fn test_remove_videos_all_expect_biggest() {
  function test_remove_same_music_content_one_newest (line 155) | fn test_remove_same_music_content_one_newest() {
  function test_remove_same_music_content_all_expect_newest (line 164) | fn test_remove_same_music_content_all_expect_newest() {
  function test_remove_same_music_content_all_expect_oldest (line 174) | fn test_remove_same_music_content_all_expect_oldest() {
  function test_remove_same_music_content_one_oldest (line 184) | fn test_remove_same_music_content_one_oldest() {
  function test_remove_same_music_content_one_biggest (line 193) | fn test_remove_same_music_content_one_biggest() {
  function test_remove_same_music_content_all_expect_biggest (line 202) | fn test_remove_same_music_content_all_expect_biggest() {
  function test_remove_same_music_content_all_expect_smallest (line 212) | fn test_remove_same_music_content_all_expect_smallest() {
  function test_remove_same_music_content_one_smallest (line 222) | fn test_remove_same_music_content_one_smallest() {
  function test_remove_same_music_tags_one_oldest (line 231) | fn test_remove_same_music_tags_one_oldest() {
  function test_remove_same_music_tags_one_newest (line 235) | fn test_remove_same_music_tags_one_newest() {
  function test_remove_same_music_tags_all_expect_oldest (line 239) | fn test_remove_same_music_tags_all_expect_oldest() {
  function test_remove_same_music_tags_all_expect_newest (line 248) | fn test_remove_same_music_tags_all_expect_newest() {
  function test_remove_same_music_tags_one_smallest (line 257) | fn test_remove_same_music_tags_one_smallest() {
  function test_remove_same_music_tags_one_biggest (line 261) | fn test_remove_same_music_tags_one_biggest() {
  function test_remove_same_music_tags_all_expect_smallest (line 265) | fn test_remove_same_music_tags_all_expect_smallest() {
  function test_remove_same_music_tags_all_expect_biggest (line 274) | fn test_remove_same_music_tags_all_expect_biggest() {
  function test_remove_duplicates_all_expect_oldest (line 283) | fn test_remove_duplicates_all_expect_oldest() {
  function test_remove_duplicates_all_expect_newest (line 292) | fn test_remove_duplicates_all_expect_newest() {
  function test_remove_duplicates_one_newest (line 302) | fn test_remove_duplicates_one_newest() {
  function test_remove_duplicates_one_oldest (line 311) | fn test_remove_duplicates_one_oldest() {
  function test_remove_duplicates_all_expect_smallest (line 320) | fn test_remove_duplicates_all_expect_smallest() {
  function test_remove_duplicates_all_expect_biggest (line 329) | fn test_remove_duplicates_all_expect_biggest() {
  function test_remove_duplicates_one_biggest (line 339) | fn test_remove_duplicates_one_biggest() {
  function test_remove_duplicates_one_smallest (line 348) | fn test_remove_duplicates_one_smallest() {
  function test_symlinks_files (line 358) | fn test_symlinks_files() {
  function test_temporary_files (line 362) | fn test_temporary_files() {
  function test_empty_folders (line 366) | fn test_empty_folders() {
  function test_biggest_files (line 376) | fn test_biggest_files() {
  function test_smallest_files (line 386) | fn test_smallest_files() {
  function test_empty_files (line 396) | fn test_empty_files() {
  function test_big_files (line 401) | fn test_big_files() {
  function run_test (line 412) | fn run_test(arguments: &[&str], expected_files_differences: Vec<&'static...
  function unzip_files (line 430) | fn unzip_files() {
  function remove_test_dir (line 433) | fn remove_test_dir() {
  function run_with_good_status (line 437) | fn run_with_good_status(str_command: &[&str], print_messages: bool) {
  function file_folder_diffs (line 452) | fn file_folder_diffs(
  function collect_all_files_and_dirs (line 488) | fn collect_all_files_and_dirs(dir: &str) -> std::io::Result<CollectedFil...

FILE: czkawka_cli/src/commands.rs
  constant CLAP_STYLING (line 17) | pub const CLAP_STYLING: Styles = Styles::styled()
  type Args (line 33) | pub struct Args {
  type Commands (line 39) | pub enum Commands {
  type DuplicatesArgs (line 119) | pub struct DuplicatesArgs {
  type EmptyFoldersArgs (line 194) | pub struct EmptyFoldersArgs {
  type BiggestFilesArgs (line 202) | pub struct BiggestFilesArgs {
  type EmptyFilesArgs (line 225) | pub struct EmptyFilesArgs {
  type TemporaryArgs (line 233) | pub struct TemporaryArgs {
  type SimilarImagesArgs (line 241) | pub struct SimilarImagesArgs {
  type SameMusicArgs (line 309) | pub struct SameMusicArgs {
  function parse_maximum_difference (line 386) | fn parse_maximum_difference(src: &str) -> Result<f64, String> {
  function parse_minimum_segment_duration (line 400) | fn parse_minimum_segment_duration(src: &str) -> Result<f32, String> {
  type InvalidSymlinksArgs (line 416) | pub struct InvalidSymlinksArgs {
  type BrokenFilesArgs (line 424) | pub struct BrokenFilesArgs {
  type SimilarVideosArgs (line 441) | pub struct SimilarVideosArgs {
  type BadExtensionsArgs (line 509) | pub struct BadExtensionsArgs {
  type BadNamesArgs (line 522) | pub struct BadNamesArgs {
  type VideoOptimizerArgs (line 574) | pub struct VideoOptimizerArgs {
  type VideoOptimizerMode (line 582) | pub enum VideoOptimizerMode {
  type TranscodeArgs (line 590) | pub struct TranscodeArgs {
  type CropArgs (line 663) | pub struct CropArgs {
  type ExifRemoverArgs (line 752) | pub struct ExifRemoverArgs {
  type CommonCliItems (line 774) | pub struct CommonCliItems {
  type DoNotPrint (line 854) | pub struct DoNotPrint {
  type DMethod (line 872) | pub struct DMethod {
  type SDMethod (line 900) | pub struct SDMethod {
  type FileToSave (line 920) | pub struct FileToSave {
    method file_name (line 1000) | pub(crate) fn file_name(&self) -> Option<&str> {
  type ReferenceDirectories (line 932) | pub struct ReferenceDirectories {
  type JsonCompactFileToSave (line 943) | pub struct JsonCompactFileToSave {
    method file_name (line 1009) | pub(crate) fn file_name(&self) -> Option<&str> {
  type JsonPrettyFileToSave (line 955) | pub struct JsonPrettyFileToSave {
    method file_name (line 1018) | pub(crate) fn file_name(&self) -> Option<&str> {
  type AllowHardLinks (line 967) | pub struct AllowHardLinks {
  type CaseSensitiveNameComparison (line 978) | pub struct CaseSensitiveNameComparison {
  type IgnoreSameSize (line 989) | pub struct IgnoreSameSize {
  function parse_scan_duration (line 1027) | fn parse_scan_duration(s: &str) -> Result<u32, String> {
  function parse_crop_detect (line 1040) | fn parse_crop_detect(src: &str) -> Result<Cropdetect, String> {
  function parse_skip_forward_amount (line 1047) | fn parse_skip_forward_amount(src: &str) -> Result<u32, String> {
  function parse_hash_type (line 1059) | fn parse_hash_type(src: &str) -> Result<HashType, &'static str> {
  function parse_tolerance (line 1068) | fn parse_tolerance(src: &str) -> Result<i32, &'static str> {
  function parse_checking_method_duplicate (line 1081) | fn parse_checking_method_duplicate(src: &str) -> Result<CheckingMethod, ...
  function parse_broken_files (line 1091) | fn parse_broken_files(src: &str) -> Result<CheckedTypes, &'static str> {
  function parse_checking_method_same_music (line 1102) | fn parse_checking_method_same_music(src: &str) -> Result<CheckingMethod,...
  function parse_video_codec (line 1110) | fn parse_video_codec(src: &str) -> Result<VideoCodec, &'static str> {
  function parse_max_samples (line 1120) | fn parse_max_samples(src: &str) -> Result<usize, String> {
  function parse_min_crop_size (line 1128) | fn parse_min_crop_size(src: &str) -> Result<u32, String> {
  function parse_delete_method (line 1136) | fn parse_delete_method(src: &str) -> Result<DeleteMethod, &'static str> {
  function parse_minimal_file_size (line 1152) | fn parse_minimal_file_size(src: &str) -> Result<u64, String> {
  function parse_maximal_file_size (line 1165) | fn parse_maximal_file_size(src: &str) -> Result<u64, String> {
  function parse_similar_image_filter (line 1172) | fn parse_similar_image_filter(src: &str) -> Result<FilterType, String> {
  function parse_similar_hash_algorithm (line 1184) | fn parse_similar_hash_algorithm(src: &str) -> Result<HashAlg, String> {
  function parse_image_hash_size (line 1197) | fn parse_image_hash_size(src: &str) -> Result<u8, String> {
  function parse_music_duplicate_type (line 1208) | fn parse_music_duplicate_type(src: &str) -> Result<MusicSimilarity, Stri...
  function parse_crop_mechanism (line 1243) | fn parse_crop_mechanism(src: &str) -> Result<String, String> {
  constant HELP_TEMPLATE (line 1250) | const HELP_TEMPLATE: &str = r#"

FILE: czkawka_cli/src/main.rs
  type CliOutput (line 45) | pub struct CliOutput {
  function main (line 51) | fn main() {
  function duplicates (line 117) | fn duplicates(duplicates: DuplicatesArgs, stop_flag: &Arc<AtomicBool>, p...
  function empty_folders (line 154) | fn empty_folders(empty_folders: EmptyFoldersArgs, stop_flag: &Arc<Atomic...
  function biggest_files (line 167) | fn biggest_files(biggest_files: BiggestFilesArgs, stop_flag: &Arc<Atomic...
  function empty_files (line 187) | fn empty_files(empty_files: EmptyFilesArgs, stop_flag: &Arc<AtomicBool>,...
  function temporary (line 200) | fn temporary(temporary: TemporaryArgs, stop_flag: &Arc<AtomicBool>, prog...
  function similar_images (line 213) | fn similar_images(similar_images: SimilarImagesArgs, stop_flag: &Arc<Ato...
  function same_music (line 242) | fn same_music(same_music: SameMusicArgs, stop_flag: &Arc<AtomicBool>, pr...
  function invalid_symlinks (line 277) | fn invalid_symlinks(invalid_symlinks: InvalidSymlinksArgs, stop_flag: &A...
  function broken_files (line 290) | fn broken_files(broken_files: BrokenFilesArgs, stop_flag: &Arc<AtomicBoo...
  function similar_videos (line 312) | fn similar_videos(similar_videos: SimilarVideosArgs, stop_flag: &Arc<Ato...
  function bad_extensions (line 351) | fn bad_extensions(bad_extensions: BadExtensionsArgs, stop_flag: &Arc<Ato...
  function bad_names (line 369) | fn bad_names(bad_names: BadNamesArgs, stop_flag: &Arc<AtomicBool>, progr...
  function video_optimizer (line 414) | fn video_optimizer(video_optimizer: VideoOptimizerArgs, stop_flag: &Arc<...
  function exif_remover (line 524) | fn exif_remover(exif_remover: ExifRemoverArgs, stop_flag: &Arc<AtomicBoo...
  function save_and_write_results_to_writer (line 549) | fn save_and_write_results_to_writer<T: CommonData + PrintResults>(compon...
  function set_simple_delete (line 594) | fn set_simple_delete<T>(component: &mut T, s_delete: SDMethod)
  function set_advanced_delete (line 605) | fn set_advanced_delete<T>(component: &mut T, a_delete: DMethod)
  function set_common_settings (line 614) | fn set_common_settings<T>(component: &mut T, common_cli_items: &CommonCl...

FILE: czkawka_cli/src/progress.rs
  function connect_progress (line 9) | pub(crate) fn connect_progress(progress_receiver: &Receiver<ProgressData...
  function get_progress_message (line 57) | pub(crate) fn get_progress_message(progress_data: &ProgressData) -> Stri...
  function get_progress_bar_for_collect_files (line 100) | pub(crate) fn get_progress_bar_for_collect_files() -> ProgressBar {
  function get_progress_known_values (line 112) | pub(crate) fn get_progress_known_values(max_value: u64) -> ProgressBar {
  function get_progress_loading_saving_cache (line 122) | pub(crate) fn get_progress_loading_saving_cache(loading: bool) -> Progre...

FILE: czkawka_core/benches/hash_calculation_benchmark.rs
  function setup_test_file (line 12) | fn setup_test_file(size: u64) -> PathBuf {
  function get_file_entry (line 19) | fn get_file_entry(size: u64) -> DuplicateEntry {
  function benchmark_hash_calculation_vec (line 29) | fn benchmark_hash_calculation_vec<const FILE_SIZE: u64, const BUFFER_SIZ...
  function benchmark_hash_calculation_arr (line 48) | fn benchmark_hash_calculation_arr<const FILE_SIZE: u64, const BUFFER_SIZ...

FILE: czkawka_core/build.rs
  function main (line 1) | fn main() {

FILE: czkawka_core/src/common/basic_gui_cli.rs
  type CliResult (line 9) | pub struct CliResult {
  type ExpectedArgs (line 15) | enum ExpectedArgs {
  function process_cli_args (line 25) | pub fn process_cli_args(app_display: &str, app_exec: &str, args: Vec<Str...
  function deduplicate_folders (line 140) | fn deduplicate_folders(folder_list: &mut Vec<String>) {
  function check_if_folder_is_valid (line 146) | fn check_if_folder_is_valid(folder: &str) -> Result<String, String> {
  function check_if_folder_is_valid (line 160) | fn check_if_folder_is_valid(folder: &str) -> Result<String, String> {
  function processes_include_folder (line 172) | fn processes_include_folder() {
  function processes_exclude_folder (line 181) | fn processes_exclude_folder() {
  function processes_referenced_folder (line 190) | fn processes_referenced_folder() {
  function processes_multiple_same_folder (line 199) | fn processes_multiple_same_folder() {
  function handles_invalid_folder (line 222) | fn handles_invalid_folder() {
  function handles_no_arguments (line 229) | fn handles_no_arguments() {

FILE: czkawka_core/src/common/cache.rs
  constant CACHE_VERSION (line 27) | pub(crate) const CACHE_VERSION: u8 = 100;
  constant CACHE_DUPLICATE_VERSION (line 28) | pub(crate) const CACHE_DUPLICATE_VERSION: u8 = 100;
  constant CACHE_IMAGE_VERSION (line 29) | pub(crate) const CACHE_IMAGE_VERSION: u8 = 100;
  constant CACHE_VIDEO_VERSION (line 30) | pub(crate) const CACHE_VIDEO_VERSION: u8 = 110;
  constant CACHE_BROKEN_FILES_VERSION (line 31) | pub(crate) const CACHE_BROKEN_FILES_VERSION: u8 = 110;
  constant CACHE_VIDEO_OPTIMIZE_VERSION (line 32) | pub(crate) const CACHE_VIDEO_OPTIMIZE_VERSION: u8 = 110;
  constant MEMORY_LIMIT (line 34) | const MEMORY_LIMIT: u64 = 8 * 1024 * 1024 * 1024;
  constant CLEANING_TIMESTAMPS_FILE (line 35) | const CLEANING_TIMESTAMPS_FILE: &str = "cleaning_timestamps.json";
  function get_cache_size (line 43) | fn get_cache_size(file_name: &Path) -> String {
  function save_cache_to_file_generalized (line 48) | pub fn save_cache_to_file_generalized<T>(cache_file_name: &str, hashmap:...
  function extract_loaded_cache (line 92) | pub(crate) fn extract_loaded_cache<T>(
  function load_cache_from_file_generalized_by_path (line 110) | pub fn load_cache_from_file_generalized_by_path<T>(cache_file_name: &str...
  function load_cache_from_file_generalized_by_size (line 146) | pub fn load_cache_from_file_generalized_by_size<T>(
  function load_cache_from_file_generalized (line 199) | fn load_cache_from_file_generalized<T, F>(cache_file_name: &str, delete_...
  function load_and_split_cache_generalized_by_path (line 290) | pub(crate) fn load_and_split_cache_generalized_by_path<C: CommonData, K>(
  function save_and_connect_cache_generalized_by_path (line 328) | pub(crate) fn save_and_connect_cache_generalized_by_path<C: CommonData, ...
  function setup_cache_path (line 362) | pub(crate) fn setup_cache_path() {
  type TestEntry (line 379) | struct TestEntry {
    method new (line 399) | fn new(path: &str, size: u64, modified_date: u64, value: u32) -> Self {
  method get_path (line 387) | fn get_path(&self) -> &Path {
  method get_modified_date (line 390) | fn get_modified_date(&self) -> u64 {
  method get_size (line 393) | fn get_size(&self) -> u64 {
  function test_extract_loaded_cache (line 410) | fn test_extract_loaded_cache() {
  function test_extract_loaded_cache_empty (line 435) | fn test_extract_loaded_cache_empty() {
  function test_extract_loaded_cache_all_cached (line 451) | fn test_extract_loaded_cache_all_cached() {
  function test_save_and_load_cache_by_path (line 470) | fn test_save_and_load_cache_by_path() {
  function test_save_and_load_cache_by_size (line 501) | fn test_save_and_load_cache_by_size() {
  function test_save_cache_with_minimum_file_size (line 549) | fn test_save_cache_with_minimum_file_size() {
  function test_load_cache_with_outdated_entries (line 577) | fn test_load_cache_with_outdated_entries() {
  function test_load_nonexistent_cache (line 621) | fn test_load_nonexistent_cache() {
  function test_save_cache_with_json (line 633) | fn test_save_cache_with_json() {
  function test_get_cache_size_nonexistent (line 649) | fn test_get_cache_size_nonexistent() {

FILE: czkawka_core/src/common/cache/cleaning.rs
  type CacheCleaningStatistics (line 29) | pub struct CacheCleaningStatistics {
  type CacheProgressCleaning (line 42) | pub struct CacheProgressCleaning {
  type CleaningTimestamps (line 51) | struct CleaningTimestamps {
  type SingleCleaningTimestamp (line 55) | struct SingleCleaningTimestamp {
  function get_timestamps_file_path (line 60) | fn get_timestamps_file_path() -> Option<std::path::PathBuf> {
  function should_clean_cache (line 64) | pub(crate) fn should_clean_cache(cache_file_name: &str) -> bool {
  function update_cleaning_timestamp (line 106) | pub(crate) fn update_cleaning_timestamp(cache_file_name: &str) {
  type CacheType (line 141) | enum CacheType {
    method from_filename (line 154) | fn from_filename(filename: &str) -> Option<Self> {
  function clean_all_cache_files (line 180) | pub fn clean_all_cache_files(stop_flag: &Arc<AtomicBool>, cache_progress...
  function clean_cache_file_typed (line 295) | fn clean_cache_file_typed<T>(
  type TestCacheEntry (line 402) | struct TestCacheEntry {
  method get_path (line 410) | fn get_path(&self) -> &Path {
  method get_size (line 413) | fn get_size(&self) -> u64 {
  method get_modified_date (line 416) | fn get_modified_date(&self) -> u64 {
  function setup_test_env (line 421) | fn setup_test_env() -> (PathBuf, PathBuf) {
  function create_test_file (line 427) | fn create_test_file(dir: &Path, name: &str, content: &str) -> (PathBuf, ...
  function create_cache_file (line 435) | fn create_cache_file(cache_dir: &Path, name: &str, entries: &[TestCacheE...
  function test_timestamp_operations_and_should_clean (line 445) | fn test_timestamp_operations_and_should_clean() {
  function test_clean_cache_file_typed_mixed_scenarios (line 466) | fn test_clean_cache_file_typed_mixed_scenarios() {
  function test_clean_cache_file_with_stop_flag (line 521) | fn test_clean_cache_file_with_stop_flag() {
  function test_cache_type_from_filename_all_variants (line 557) | fn test_cache_type_from_filename_all_variants() {
  function test_clean_cache_file_no_changes_needed (line 605) | fn test_clean_cache_file_no_changes_needed() {
  function test_clean_cache_file_all_entries_invalid (line 638) | fn test_clean_cache_file_all_entries_invalid() {
  function test_cache_progress_cleaning_struct (line 691) | fn test_cache_progress_cleaning_struct() {
  function test_cleaning_timestamps_serialization (line 708) | fn test_cleaning_timestamps_serialization() {

FILE: czkawka_core/src/common/config_cache_path.rs
  type ConfigCachePath (line 14) | pub struct ConfigCachePath {
  function get_config_cache_path (line 19) | pub fn get_config_cache_path() -> Option<ConfigCachePath> {
  function android_default_dirs (line 36) | fn android_default_dirs(cache_name: &str, config_name: &str) -> (Option<...
  function android_default_dirs (line 48) | fn android_default_dirs(_cache_name: &str, _config_name: &str) -> (Optio...
  function resolve_folder (line 52) | fn resolve_folder(env_var: &str, default_folder: Option<PathBuf>, name: ...
  function set_config_cache_path_test (line 92) | pub fn set_config_cache_path_test(cache_path: PathBuf, config_path: Path...
  type ConfigCachePathSetResult (line 101) | pub struct ConfigCachePathSetResult {
  function set_config_cache_path (line 111) | pub fn set_config_cache_path(cache_name: &'static str, config_name: &'st...
  function open_cache_folder (line 172) | pub(crate) fn open_cache_folder(
  function print_infos_and_warnings (line 218) | pub fn print_infos_and_warnings(infos: Vec<String>, warnings: Vec<String...

FILE: czkawka_core/src/common/consts.rs
  constant DEFAULT_THREAD_SIZE (line 1) | pub const DEFAULT_THREAD_SIZE: usize = 8 * 1024 * 1024;
  constant DEFAULT_WORKER_THREAD_SIZE (line 2) | pub const DEFAULT_WORKER_THREAD_SIZE: usize = 4 * 1024 * 1024;
  constant VIDEO_RESOLUTION_LIMIT (line 3) | pub const VIDEO_RESOLUTION_LIMIT: u32 = 16 * 1024;
  constant RAW_IMAGE_EXTENSIONS (line 5) | pub const RAW_IMAGE_EXTENSIONS: &[&str] = &[
  constant IMAGE_RS_EXTENSIONS (line 9) | pub const IMAGE_RS_EXTENSIONS: &[&str] = &[
  constant IMAGE_RS_EXTENSIONS (line 13) | pub const IMAGE_RS_EXTENSIONS: &[&str] = &[
  constant IMAGE_RS_SIMILAR_IMAGES_EXTENSIONS (line 17) | pub const IMAGE_RS_SIMILAR_IMAGES_EXTENSIONS: &[&str] = &["jpg", "jpeg",...
  constant IMAGE_RS_SIMILAR_IMAGES_EXTENSIONS (line 19) | pub const IMAGE_RS_SIMILAR_IMAGES_EXTENSIONS: &[&str] = &["jpg", "jpeg",...
  constant IMAGE_RS_BROKEN_FILES_EXTENSIONS (line 21) | pub const IMAGE_RS_BROKEN_FILES_EXTENSIONS: &[&str] = &[
  constant IMAGE_RS_BROKEN_FILES_EXTENSIONS (line 25) | pub const IMAGE_RS_BROKEN_FILES_EXTENSIONS: &[&str] = &[
  constant HEIC_EXTENSIONS (line 28) | pub const HEIC_EXTENSIONS: &[&str] = &["heif", "heifs", "heic", "heics",...
  constant ZIP_FILES_EXTENSIONS (line 29) | pub const ZIP_FILES_EXTENSIONS: &[&str] = &["zip", "jar"];
  constant PDF_FILES_EXTENSIONS (line 30) | pub const PDF_FILES_EXTENSIONS: &[&str] = &["pdf"];
  constant AUDIO_FILES_EXTENSIONS (line 31) | pub const AUDIO_FILES_EXTENSIONS: &[&str] = &[
  constant VIDEO_FILES_EXTENSIONS (line 34) | pub const VIDEO_FILES_EXTENSIONS: &[&str] = &[
  constant TEXT_FILES_EXTENSIONS (line 45) | pub const TEXT_FILES_EXTENSIONS: &[&str] = &["txt", "md", "csv", "log", ...
  constant EXIF_FILES_EXTENSIONS (line 48) | pub const EXIF_FILES_EXTENSIONS: &[&str] = &["jpg", "jpeg", "jfif", "png...

FILE: czkawka_core/src/common/dir_traversal.rs
  type Collect (line 26) | pub enum Collect {
  type EntryType (line 32) | enum EntryType {
  type DirTraversalBuilder (line 39) | pub struct DirTraversalBuilder<'b, F> {
  type DirTraversal (line 57) | pub struct DirTraversal<'b, F> {
  method default (line 75) | fn default() -> Self {
  function new (line 81) | pub fn new() -> Self {
  function common_data (line 102) | pub(crate) fn common_data(mut self, common_tool_data: &CommonToolData) -...
  function stop_flag (line 115) | pub(crate) fn stop_flag(mut self, stop_flag: &Arc<AtomicBool>) -> Self {
  function progress_sender (line 120) | pub(crate) fn progress_sender(mut self, progress_sender: Option<&'b Send...
  function checking_method (line 125) | pub(crate) fn checking_method(mut self, checking_method: CheckingMethod)...
  function minimal_file_size (line 130) | pub(crate) fn minimal_file_size(mut self, minimal_file_size: u64) -> Self {
  function maximal_file_size (line 135) | pub(crate) fn maximal_file_size(mut self, maximal_file_size: u64) -> Self {
  function collect (line 140) | pub(crate) fn collect(mut self, collect: Collect) -> Self {
  function group_by (line 145) | pub(crate) fn group_by<G, T>(self, group_by: G) -> DirTraversalBuilder<'...
  function build (line 167) | pub(crate) fn build(self) -> DirTraversal<'b, F> {
  type DirTraversalResult (line 187) | pub enum DirTraversalResult<T: Ord + PartialOrd> {
  function entry_type (line 195) | fn entry_type(file_type: FileType) -> EntryType {
  function run (line 213) | pub(crate) fn run(self) -> DirTraversalResult<T> {
  function process_file_in_file_mode (line 374) | fn process_file_in_file_mode(
  function process_file_in_file_mode_path_check (line 426) | fn process_file_in_file_mode_path_check(
  function process_dir_in_file_symlink_mode (line 467) | fn process_dir_in_file_symlink_mode(
  function process_symlink_in_symlink_mode (line 503) | fn process_symlink_in_symlink_mode(
  function process_symlink_in_symlink_mode_path_check (line 545) | fn process_symlink_in_symlink_mode_path_check(
  function common_read_dir (line 574) | pub(crate) fn common_read_dir(current_folder: &Path, warnings: &mut Vec<...
  function common_get_entry_data (line 583) | pub(crate) fn common_get_entry_data<'a>(entry: &'a Result<DirEntry, std:...
  function common_get_metadata_dir (line 597) | pub(crate) fn common_get_metadata_dir(entry_data: &DirEntry, warnings: &...
  function common_get_metadata_from_path (line 612) | pub(crate) fn common_get_metadata_from_path(path: &Path, warnings: &mut ...
  function get_modified_time (line 623) | pub(crate) fn get_modified_time(metadata: &Metadata, warnings: &mut Vec<...
  function inode (line 656) | pub(crate) fn inode(_fe: &FileEntry) -> Option<u64> {
  function inode (line 661) | pub(crate) fn inode(fe: &FileEntry) -> Option<u64> {
  function take_1_per_inode (line 665) | pub(crate) fn take_1_per_inode((k, mut v): (Option<u64>, Vec<FileEntry>)...
  type Info (line 685) | type Info = ();
  type Parameters (line 686) | type Parameters = ();
  method get_information (line 687) | fn get_information(&self) -> Self::Info {}
  method get_params (line 688) | fn get_params(&self) -> Self::Parameters {}
  method get_cd (line 689) | fn get_cd(&self) -> &CommonToolData {
  method get_cd_mut (line 692) | fn get_cd_mut(&mut self) -> &mut CommonToolData {
  method found_any_items (line 695) | fn found_any_items(&self) -> bool {
  constant CONTENT (line 701) | const CONTENT: &[u8; 1] = b"a";
  function normalize_path (line 703) | fn normalize_path(item: &Path) -> PathBuf {
  function create_files (line 725) | fn create_files(dir: &Path) -> io::Result<(PathBuf, PathBuf, PathBuf)> {
  function test_traversal (line 741) | fn test_traversal() -> io::Result<()> {
  function create_temp_structure (line 791) | fn create_temp_structure(dir: &Path) -> io::Result<(PathBuf, PathBuf, Pa...
  function run_traversal (line 812) | fn run_traversal(common_data: &CommonToolData) -> Vec<FileEntry> {
  function test_traversal_with_and_without_excluded_dir (line 827) | fn test_traversal_with_and_without_excluded_dir() -> io::Result<()> {
  function test_traversal_group_by_inode (line 940) | fn test_traversal_group_by_inode() -> io::Result<()> {
  function test_traversal_group_by_inode (line 987) | fn test_traversal_group_by_inode() -> io::Result<()> {

FILE: czkawka_core/src/common/directories.rs
  type Directories (line 10) | pub struct Directories {
    method new (line 28) | pub fn new() -> Self {
    method set_reference_paths (line 32) | pub(crate) fn set_reference_paths(&mut self, reference_paths: Vec<Path...
    method set_included_paths (line 39) | pub(crate) fn set_included_paths(&mut self, included_paths: Vec<PathBu...
    method set_excluded_paths (line 46) | pub(crate) fn set_excluded_paths(&mut self, excluded_paths: Vec<PathBu...
    method process_paths (line 53) | fn process_paths(&mut self, paths: Vec<PathBuf>, is_reference: bool, i...
    method canonicalize_and_clear_path (line 90) | fn canonicalize_and_clear_path(path: &Path, is_excluded: bool) -> (Opt...
    method set_exclude_other_filesystems (line 128) | pub(crate) fn set_exclude_other_filesystems(&mut self, exclude_other_f...
    method optimize_directories (line 132) | pub(crate) fn optimize_directories(&mut self, recursive_search: bool, ...
    method is_in_referenced_directory (line 246) | pub(crate) fn is_in_referenced_directory(&self, path: &Path) -> bool {
    method is_excluded_dir (line 252) | pub(crate) fn is_excluded_dir(&self, path: &Path) -> bool {
    method is_excluded_file (line 259) | pub(crate) fn is_excluded_file(&self, path: &Path) -> bool {
    method is_excluded_item_in_dir (line 268) | pub(crate) fn is_excluded_item_in_dir(&self, path: &Path) -> bool {
    method exclude_other_filesystems (line 279) | pub(crate) fn exclude_other_filesystems(&self) -> bool {
    method is_on_other_filesystems (line 284) | pub(crate) fn is_on_other_filesystems<P: AsRef<Path>>(&self, path: P) ...
    method filter_reference_folders (line 297) | pub(crate) fn filter_reference_folders<T>(&self, entries_to_check: Vec...
  function test_no_included_paths_errors (line 323) | fn test_no_included_paths_errors() {
  function test_dedup_included_directories (line 330) | fn test_dedup_included_directories() {
  function test_excluded_removes_included_inside (line 342) | fn test_excluded_removes_included_inside() {
  function test_optimize_nested_included_directories_dedup (line 354) | fn test_optimize_nested_included_directories_dedup() {
  function test_excluded_directories_pruned_to_inside_included (line 371) | fn test_excluded_directories_pruned_to_inside_included() {
  function test_reference_dirs_and_files_retained_correctly (line 386) | fn test_reference_dirs_and_files_retained_correctly() {
  function test_reference_equals_included_error (line 410) | fn test_reference_equals_included_error() {
  function test_included_files_removed_when_equal_to_excluded_directory (line 422) | fn test_included_files_removed_when_equal_to_excluded_directory() {

FILE: czkawka_core/src/common/extensions.rs
  type Extensions (line 10) | pub struct Extensions {
    method new (line 16) | pub fn new() -> Self {
    method filter_extensions (line 20) | pub(crate) fn filter_extensions(file_extensions: Vec<String>) -> (Inde...
    method set_allowed_extensions (line 53) | pub(crate) fn set_allowed_extensions(&mut self, allowed_extensions: Ve...
    method set_excluded_extensions (line 60) | pub(crate) fn set_excluded_extensions(&mut self, excluded_extensions: ...
    method check_if_entry_have_valid_extension (line 68) | pub(crate) fn check_if_entry_have_valid_extension(&self, file_name: &O...
    method intersection_allowed_extensions (line 93) | fn intersection_allowed_extensions(&mut self, file_extensions: &[&str]) {
    method set_and_validate_extensions (line 98) | pub(crate) fn set_and_validate_extensions(&mut self, tool_extensions: ...
  function test_filter_extensions_basic_and_replacements (line 140) | fn test_filter_extensions_basic_and_replacements() {
  function test_check_if_entry_have_valid_extension (line 178) | fn test_check_if_entry_have_valid_extension() {

FILE: czkawka_core/src/common/ffmpeg_utils.rs
  function check_if_ffprobe_ffmpeg_exists (line 5) | pub fn check_if_ffprobe_ffmpeg_exists() -> bool {

FILE: czkawka_core/src/common/image.rs
  constant MAXIMUM_IMAGE_PIXELS (line 15) | const MAXIMUM_IMAGE_PIXELS: u32 = 2_000_000_000;
  function register_image_decoding_hooks (line 17) | pub fn register_image_decoding_hooks() {
  function decode_normal_image (line 25) | pub(crate) fn decode_normal_image(path: &str) -> Result<DynamicImage, St...
  type LoadedImage (line 33) | pub struct LoadedImage {
  method fmt (line 39) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
  function get_dynamic_image_from_path (line 56) | pub fn get_dynamic_image_from_path(path: &str, opts: Option<ImgResizeOpt...
  type ImgResizeOptions (line 116) | pub struct ImgResizeOptions {
  function resize_image (line 122) | fn resize_image(img: DynamicImage, opts: ImgResizeOptions) -> DynamicIma...
  function get_raw_image (line 147) | pub(crate) fn get_raw_image<P: AsRef<Path>>(path: P) -> Result<DynamicIm...
  function get_raw_image (line 167) | pub(crate) fn get_raw_image<P: AsRef<Path> + std::fmt::Debug>(path: P) -...
  function check_if_can_display_image (line 213) | pub fn check_if_can_display_image(path: &str) -> bool {
  type ExifOrientation (line 228) | pub enum ExifOrientation {
  function get_rotation_from_exif (line 239) | pub(crate) fn get_rotation_from_exif(path: &str) -> Result<Option<ExifOr...
  constant TEST_NORMAL_IMAGE (line 284) | const TEST_NORMAL_IMAGE: &str = "test_resources/images/normal.jpg";
  constant TEST_ROTATED_IMAGE (line 285) | const TEST_ROTATED_IMAGE: &str = "test_resources/images/rotated.jpg";
  function test_image_loading_and_exif_rotation (line 288) | fn test_image_loading_and_exif_rotation() {
  function test_check_if_can_display_image (line 314) | fn test_check_if_can_display_image() {
  function test_error_handling (line 328) | fn test_error_handling() {

FILE: czkawka_core/src/common/items.rs
  constant DEFAULT_EXCLUDED_DIRECTORIES (line 7) | pub const DEFAULT_EXCLUDED_DIRECTORIES: &[&str] = &["/proc", "/dev", "/s...
  constant DEFAULT_EXCLUDED_DIRECTORIES (line 9) | pub const DEFAULT_EXCLUDED_DIRECTORIES: &[&str] = &["C:\\Windows"];
  constant DEFAULT_EXCLUDED_ITEMS (line 12) | pub const DEFAULT_EXCLUDED_ITEMS: &str = "*/.git/*,*/node_modules/*,*/lo...
  constant DEFAULT_EXCLUDED_ITEMS (line 15) | pub const DEFAULT_EXCLUDED_ITEMS: &str = "*/.git/*,*/node_modules/*,*/lo...
  constant DEFAULT_EXCLUDED_ITEMS (line 18) | pub const DEFAULT_EXCLUDED_ITEMS: &str = "*\\.git\\*,*\\node_modules\\*,...
  type ExcludedItems (line 21) | pub struct ExcludedItems {
    method new (line 34) | pub fn new() -> Self {
    method new_from (line 38) | pub fn new_from(excluded_items: Vec<String>) -> Self {
    method set_excluded_items (line 44) | pub(crate) fn set_excluded_items(&mut self, excluded_items: Vec<String...
    method get_excluded_items (line 88) | pub(crate) fn get_excluded_items(&self) -> &Vec<String> {
    method is_excluded (line 91) | pub(crate) fn is_excluded(&self, path: &Path) -> bool {
  type SingleExcludedItem (line 27) | pub struct SingleExcludedItem {
  function new_excluded_item (line 109) | pub fn new_excluded_item(expression: &str) -> SingleExcludedItem {
  function test_excluded_items_new_and_basic_operations (line 128) | fn test_excluded_items_new_and_basic_operations() {
  function test_set_excluded_items_with_default (line 139) | fn test_set_excluded_items_with_default() {
  function test_set_excluded_items_warnings (line 148) | fn test_set_excluded_items_warnings() {
  function test_is_excluded (line 157) | fn test_is_excluded() {
  function test_new_excluded_item (line 172) | fn test_new_excluded_item() {

FILE: czkawka_core/src/common/logger.rs
  function setup_logger (line 13) | pub fn setup_logger(disabled_terminal_printing: bool, app_name: &str, fi...
  function filtering_messages (line 68) | pub fn filtering_messages(record: &Record) -> bool {
  function print_version_mode (line 91) | pub fn print_version_mode(app: &str) {

FILE: czkawka_core/src/common/mod.rs
  constant MAX_SYMLINK_HARDLINK_ATTEMPTS (line 37) | const MAX_SYMLINK_HARDLINK_ATTEMPTS: u8 = 5;
  function with_runtime (line 45) | fn with_runtime<F, R>(f: F) -> Result<R, String>
  function get_number_of_threads (line 68) | pub fn get_number_of_threads() -> usize {
  function get_all_available_threads (line 73) | pub fn get_all_available_threads() -> usize {
  function set_number_of_threads (line 85) | pub fn set_number_of_threads(thread_number: usize) {
  function check_if_folder_contains_only_empty_folders (line 105) | pub fn check_if_folder_contains_only_empty_folders<P: AsRef<Path>>(path:...
  function trash_delete (line 160) | fn trash_delete<P: AsRef<Path>>(path: P) -> Result<(), String> {
  function remove_folder_if_contains_only_empty_folders (line 190) | pub fn remove_folder_if_contains_only_empty_folders<P: AsRef<Path>>(path...
  function remove_single_file (line 207) | pub fn remove_single_file<P: AsRef<Path>>(full_path: P, remove_to_trash:...
  function remove_single_folder (line 225) | pub fn remove_single_folder(full_path: &str, remove_to_trash: bool) -> R...
  function split_path (line 238) | pub fn split_path(path: &Path) -> (String, String) {
  function split_path_compare (line 246) | pub fn split_path_compare(path_a: &Path, path_b: &Path) -> Ordering {
  function format_time (line 253) | pub fn format_time(duration: Duration) -> String {
  function create_crash_message (line 275) | pub(crate) fn create_crash_message(library_name: &str, file_path: &str, ...
  function regex_check (line 283) | pub fn regex_check(expression_item: &SingleExcludedItem, directory_name:...
  function normalize_windows_path (line 327) | pub fn normalize_windows_path<P: AsRef<Path>>(path_to_change: P) -> Path...
  function make_hard_link (line 353) | pub fn make_hard_link<P: AsRef<Path>, Q: AsRef<Path>>(src: P, dst: Q) ->...
  function make_file_symlink (line 383) | pub fn make_file_symlink<P: AsRef<Path>, Q: AsRef<Path>>(src: P, dst: Q)...
  function make_file_symlink (line 422) | pub fn make_file_symlink<P: AsRef<Path>, Q: AsRef<Path>>(src: P, dst: Q)...
  function debug_save_file (line 426) | pub fn debug_save_file(path: &str, data: &str) {
  function assert_inode (line 446) | fn assert_inode(before: &Metadata, after: &Metadata) {
  function assert_inode (line 451) | fn assert_inode(_: &Metadata, _: &Metadata) {}
  function assert_different_inode (line 454) | fn assert_different_inode(before: &Metadata, after: &Metadata) {
  function assert_different_inode (line 459) | fn assert_different_inode(_before: &Metadata, _after: &Metadata) {}
  function test_make_hard_link (line 462) | fn test_make_hard_link() -> io::Result<()> {
  function test_make_file_symlink (line 672) | fn test_make_file_symlink() -> io::Result<()> {
  function test_make_file_symlink_fails (line 699) | fn test_make_file_symlink_fails() -> io::Result<()> {
  function test_remove_folder_if_contains_only_empty_folders (line 723) | fn test_remove_folder_if_contains_only_empty_folders() {
  function test_regex (line 747) | fn test_regex() {
  function test_windows_path (line 779) | fn test_windows_path() {
  function test_format_time (line 789) | fn test_format_time() {

FILE: czkawka_core/src/common/model.rs
  type ToolType (line 10) | pub enum ToolType {
    method may_use_reference_paths (line 30) | pub fn may_use_reference_paths(self) -> bool {
  type CheckingMethod (line 36) | pub enum CheckingMethod {
  type FileEntry (line 48) | pub struct FileEntry {
  method get_path (line 55) | fn get_path(&self) -> &Path {
  method get_modified_date (line 58) | fn get_modified_date(&self) -> u64 {
  method get_size (line 61) | fn get_size(&self) -> u64 {
  type HashType (line 67) | pub enum HashType {
    method hasher (line 75) | pub(crate) fn hasher(self) -> Box<dyn MyHasher> {
  type WorkContinueStatus (line 85) | pub enum WorkContinueStatus {
  function test_file_entry_basic_operations (line 95) | fn test_file_entry_basic_operations() {
  function test_hash_type_creates_hashers (line 111) | fn test_hash_type_creates_hashers() {
  function test_checking_method_default (line 123) | fn test_checking_method_default() {
  function test_tool_type_default (line 128) | fn test_tool_type_default() {
  function test_delete_method_default (line 133) | fn test_delete_method_default() {

FILE: czkawka_core/src/common/process_utils.rs
  function disable_windows_console_window (line 12) | pub fn disable_windows_console_window(command: &mut Command) {
  type CommandOutput (line 25) | pub struct CommandOutput {
  function run_command_interruptible (line 34) | pub fn run_command_interruptible(mut command: Command, stop_flag: &Arc<A...

FILE: czkawka_core/src/common/progress_data.rs
  type ProgressData (line 70) | pub struct ProgressData {
    method get_empty_state (line 83) | pub fn get_empty_state(current_stage: CurrentStage) -> Self {
    method validate (line 143) | pub(crate) fn validate(&self) {
  type CurrentStage (line 99) | pub enum CurrentStage {
    method is_special_non_tool_stage (line 243) | pub fn is_special_non_tool_stage(self) -> bool {
    method get_current_stage (line 250) | pub fn get_current_stage(self) -> u8 {
    method check_if_loading_saving_cache (line 292) | pub fn check_if_loading_saving_cache(self) -> bool {
    method check_if_loading_cache (line 295) | pub fn check_if_loading_cache(self) -> bool {
    method check_if_saving_cache (line 305) | pub fn check_if_saving_cache(self) -> bool {
  method get_max_stage (line 225) | pub(crate) fn get_max_stage(self, checking_method: CheckingMethod) -> u8 {
  function test_tool_type_and_current_stage_integration (line 318) | fn test_tool_type_and_current_stage_integration() {
  function test_cache_operations_detection (line 332) | fn test_cache_operations_detection() {
  function test_progress_data_validation_and_empty_state (line 340) | fn test_progress_data_validation_and_empty_state() {
  function test_validation_invalid_stage_idx (line 361) | fn test_validation_invalid_stage_idx() {
  function test_validation_too_many_entries (line 378) | fn test_validation_too_many_entries() {

FILE: czkawka_core/src/common/progress_stop_handler.rs
  constant LOOP_DURATION (line 12) | pub const LOOP_DURATION: u32 = 20;
  constant SEND_PROGRESS_DATA_TIME_BETWEEN (line 13) | pub const SEND_PROGRESS_DATA_TIME_BETWEEN: u32 = 200;
  type ProgressThreadHandler (line 15) | pub(crate) struct ProgressThreadHandler {
    method new (line 21) | pub fn new(progress_thread_handle: JoinHandle<()>, progress_thread_run...
    method join_thread (line 28) | pub fn join_thread(self) {
    method increase_items (line 34) | pub fn increase_items(&self, count: usize) {
    method increase_size (line 37) | pub fn increase_size(&self, size: u64) {
    method items_counter (line 40) | pub fn items_counter(&self) -> &Arc<AtomicUsize> {
    method size_counter (line 43) | pub fn size_counter(&self) -> &Arc<AtomicU64> {
  type ProgressStatus (line 49) | pub(crate) struct ProgressStatus {
    method new (line 54) | pub fn new() -> Self {
  function prepare_thread_handler_common (line 62) | pub(crate) fn prepare_thread_handler_common(
  function check_if_stop_received (line 113) | pub(crate) fn check_if_stop_received(stop_flag: &Arc<AtomicBool>) -> bool {
  function send_info_and_wait_for_ending_all_threads (line 118) | pub(crate) fn send_info_and_wait_for_ending_all_threads(progress_thread_...
  function test_progress_status_and_stop_flag (line 128) | fn test_progress_status_and_stop_flag() {
  function test_progress_thread_handler_with_sender (line 146) | fn test_progress_thread_handler_with_sender() {
  function test_progress_thread_handler_without_sender (line 165) | fn test_progress_thread_handler_without_sender() {
  function test_panics_on_none_tool_type (line 179) | fn test_panics_on_none_tool_type() {

FILE: czkawka_core/src/common/tool_data.rs
  type CommonToolData (line 23) | pub struct CommonToolData {
    method new (line 99) | pub fn new(tool_type: ToolType) -> Self {
  type DeleteResult (line 44) | pub struct DeleteResult {
    method add_to_messages (line 53) | pub(crate) fn add_to_messages(&self, messages: &mut Messages) {
  type DeleteItemType (line 60) | pub enum DeleteItemType<T: ResultEntry + Sized + Send + Sync> {
  function calculate_size_to_delete (line 67) | fn calculate_size_to_delete(&self) -> u64 {
  function calculate_entries_to_delete (line 74) | fn calculate_entries_to_delete(&self) -> usize {
  type DeleteMethod (line 83) | pub enum DeleteMethod {
  type CommonData (line 122) | pub trait CommonData {
    method get_information (line 126) | fn get_information(&self) -> Self::Info;
    method get_params (line 127) | fn get_params(&self) -> Self::Parameters;
    method get_cd (line 129) | fn get_cd(&self) -> &CommonToolData;
    method get_cd_mut (line 130) | fn get_cd_mut(&mut self) -> &mut CommonToolData;
    method get_check_method (line 131) | fn get_check_method(&self) -> CheckingMethod {
    method get_test_type (line 134) | fn get_test_type(&self) -> (ToolType, CheckingMethod) {
    method found_any_items (line 137) | fn found_any_items(&self) -> bool;
    method get_tool_type (line 139) | fn get_tool_type(&self) -> ToolType {
    method set_hide_hard_links (line 143) | fn set_hide_hard_links(&mut self, hide_hard_links: bool) {
    method get_hide_hard_links (line 146) | fn get_hide_hard_links(&self) -> bool {
    method set_dry_run (line 150) | fn set_dry_run(&mut self, dry_run: bool) {
    method get_dry_run (line 153) | fn get_dry_run(&self) -> bool {
    method set_use_cache (line 157) | fn set_use_cache(&mut self, use_cache: bool) {
    method get_use_cache (line 160) | fn get_use_cache(&self) -> bool {
    method set_delete_outdated_cache (line 164) | fn set_delete_outdated_cache(&mut self, delete_outdated_cache: bool) {
    method get_delete_outdated_cache (line 167) | fn get_delete_outdated_cache(&self) -> bool {
    method get_stopped_search (line 171) | fn get_stopped_search(&self) -> bool {
    method set_stopped_search (line 174) | fn set_stopped_search(&mut self, stopped_search: bool) {
    method set_maximal_file_size (line 178) | fn set_maximal_file_size(&mut self, maximal_file_size: u64) {
    method get_maximal_file_size (line 184) | fn get_maximal_file_size(&self) -> u64 {
    method set_minimal_file_size (line 188) | fn set_minimal_file_size(&mut self, minimal_file_size: u64) {
    method get_minimal_file_size (line 194) | fn get_minimal_file_size(&self) -> u64 {
    method set_exclude_other_filesystems (line 199) | fn set_exclude_other_filesystems(&mut self, exclude_other_filesystems:...
    method set_exclude_other_filesystems (line 203) | fn set_exclude_other_filesystems(&mut self, _exclude_other_filesystems...
    method get_text_messages (line 205) | fn get_text_messages(&self) -> &Messages {
    method get_text_messages_mut (line 208) | fn get_text_messages_mut(&mut self) -> &mut Messages {
    method set_save_also_as_json (line 212) | fn set_save_also_as_json(&mut self, save_also_as_json: bool) {
    method get_save_also_as_json (line 215) | fn get_save_also_as_json(&self) -> bool {
    method set_recursive_search (line 219) | fn set_recursive_search(&mut self, recursive_search: bool) {
    method get_recursive_search (line 222) | fn get_recursive_search(&self) -> bool {
    method set_use_reference_folders (line 226) | fn set_use_reference_folders(&mut self, use_reference_folders: bool) {
    method get_use_reference_folders (line 229) | fn get_use_reference_folders(&self) -> bool {
    method set_delete_method (line 233) | fn set_delete_method(&mut self, delete_method: DeleteMethod) {
    method get_delete_method (line 236) | fn get_delete_method(&self) -> DeleteMethod {
    method set_move_to_trash (line 241) | fn set_move_to_trash(&mut self, move_to_trash: bool) {
    method get_move_to_trash (line 244) | fn get_move_to_trash(&self) -> bool {
    method set_included_paths (line 248) | fn set_included_paths(&mut self, included_paths: Vec<PathBuf>) {
    method set_excluded_paths (line 253) | fn set_excluded_paths(&mut self, excluded_paths: Vec<PathBuf>) {
    method set_reference_paths (line 258) | fn set_reference_paths(&mut self, reference_paths: Vec<PathBuf>) {
    method set_allowed_extensions (line 263) | fn set_allowed_extensions(&mut self, allowed_extensions: Vec<String>) {
    method set_excluded_extensions (line 268) | fn set_excluded_extensions(&mut self, excluded_extensions: Vec<String>) {
    method set_excluded_items (line 273) | fn set_excluded_items(&mut self, excluded_items: Vec<String>) {
    method get_extensions_mut (line 278) | fn get_extensions_mut(&mut self) -> &mut Extensions {
    method prepare_items (line 283) | fn prepare_items(&mut self, tool_extensions: Option<&[&str]>) -> Resul...
    method delete_simple_elements_and_add_to_messages (line 304) | fn delete_simple_elements_and_add_to_messages<T: ResultEntry + Sized +...
    method delete_advanced_elements_and_add_to_messages (line 321) | fn delete_advanced_elements_and_add_to_messages<T: ResultEntry + Sized...
    method delete_elements (line 376) | fn delete_elements<T: ResultEntry + Sized + Send + Sync>(
    method debug_print_common (line 519) | fn debug_print_common(&self) {
    type Info (line 568) | type Info = ();
    type Parameters (line 569) | type Parameters = ();
    method get_information (line 571) | fn get_information(&self) -> Self::Info {}
    method get_params (line 572) | fn get_params(&self) -> Self::Parameters {}
    method get_cd (line 573) | fn get_cd(&self) -> &CommonToolData {
    method get_cd_mut (line 576) | fn get_cd_mut(&mut self) -> &mut CommonToolData {
    method found_any_items (line 579) | fn found_any_items(&self) -> bool {
  type MockTool (line 563) | struct MockTool {
    method new (line 585) | fn new() -> Self {
  function test_delete_result_add_to_messages (line 593) | fn test_delete_result_add_to_messages() {
  function test_delete_item_type_calculate_size_and_entries (line 612) | fn test_delete_item_type_calculate_size_and_entries() {
  function test_common_tool_data_new (line 648) | fn test_common_tool_data_new() {
  function test_delete_elements_dry_run (line 664) | fn test_delete_elements_dry_run() {
  function test_delete_elements_actual_deletion (line 699) | fn test_delete_elements_actual_deletion() {
  function test_delete_elements_with_stop_flag (line 731) | fn test_delete_elements_with_stop_flag() {
  function test_delete_elements_nonexistent_file (line 751) | fn test_delete_elements_nonexistent_file() {
  function test_delete_simple_elements_and_add_to_messages (line 771) | fn test_delete_simple_elements_and_add_to_messages() {
  function test_delete_simple_elements_with_stop_flag (line 802) | fn test_delete_simple_elements_with_stop_flag() {
  function test_delete_advanced_elements_all_except_newest (line 822) | fn test_delete_advanced_elements_all_except_newest() {
  function test_delete_advanced_elements_all_except_oldest (line 862) | fn test_delete_advanced_elements_all_except_oldest() {
  function test_delete_advanced_elements_one_oldest (line 902) | fn test_delete_advanced_elements_one_oldest() {
  function test_delete_advanced_elements_one_newest (line 942) | fn test_delete_advanced_elements_one_newest() {
  function test_delete_advanced_elements_all_except_biggest (line 982) | fn test_delete_advanced_elements_all_except_biggest() {
  function test_delete_advanced_elements_all_except_smallest (line 1022) | fn test_delete_advanced_elements_all_except_smallest() {
  function test_delete_advanced_elements_delete_all (line 1062) | fn test_delete_advanced_elements_delete_all() {
  function test_delete_advanced_elements_multiple_groups (line 1094) | fn test_delete_advanced_elements_multiple_groups() {
  function test_delete_advanced_elements_with_stop_flag (line 1146) | fn test_delete_advanced_elements_with_stop_flag() {

FILE: czkawka_core/src/common/traits.rs
  type DebugPrint (line 15) | pub trait DebugPrint {
    method debug_print (line 16) | fn debug_print(&self);
  type PrintResults (line 19) | pub trait PrintResults: CommonData {
    method write_base_search_paths (line 20) | fn write_base_search_paths<T: Write>(&self, writer: &mut T) -> std::io...
    method write_results (line 51) | fn write_results<T: Write>(&self, writer: &mut T) -> std::io::Result<()>;
    method print_results_to_output (line 54) | fn print_results_to_output(&self) {
    method print_results_to_file (line 63) | fn print_results_to_file(&self, file_name: &str) -> std::io::Result<()> {
    method print_results_to_writer (line 77) | fn print_results_to_writer<T: Write>(&self, writer: &mut T) -> std::io...
    method save_results_to_file_as_json (line 81) | fn save_results_to_file_as_json(&self, file_name: &str, pretty_print: ...
    method save_results_to_file_as_json_internal (line 83) | fn save_results_to_file_as_json_internal<T: Serialize + std::fmt::Debu...
    method save_results_to_file_as_json_pretty (line 92) | fn save_results_to_file_as_json_pretty<T: Serialize + std::fmt::Debug>...
    method save_results_to_file_as_json_compact (line 100) | fn save_results_to_file_as_json_compact<T: Serialize + std::fmt::Debug...
    method save_all_in_one (line 107) | fn save_all_in_one(&self, folder: &str, base_file_name: &str) -> std::...
  type DeletingItems (line 118) | pub trait DeletingItems {
    method delete_files (line 120) | fn delete_files(&mut self, stop_flag: &Arc<AtomicBool>, progress_sende...
  type FixingItems (line 123) | pub trait FixingItems {
    method fix_items (line 126) | fn fix_items(&mut self, stop_flag: &Arc<AtomicBool>, progress_sender: ...
  type ResultEntry (line 129) | pub trait ResultEntry {
    method get_path (line 130) | fn get_path(&self) -> &Path;
    method get_modified_date (line 131) | fn get_modified_date(&self) -> u64;
    method get_size (line 132) | fn get_size(&self) -> u64;
  type Search (line 135) | pub trait Search {
    method search (line 136) | fn search(&mut self, stop_flag: &Arc<AtomicBool>, progress_sender: Opt...
  type AllTraits (line 139) | pub trait AllTraits: DebugPrint + PrintResults + DeletingItems + CommonD...

FILE: czkawka_core/src/common/video_utils.rs
  constant VIDEO_THUMBNAILS_SUBFOLDER (line 17) | pub const VIDEO_THUMBNAILS_SUBFOLDER: &str = "video_thumbnails";
  type VideoMetadata (line 20) | pub struct VideoMetadata {
    method from_path (line 30) | pub fn from_path(path: &Path) -> Result<Self, String> {
  function extract_frame_ffmpeg (line 101) | pub(crate) fn extract_frame_ffmpeg(video_path: &Path, timestamp: f32, ma...
  function generate_thumbnail (line 148) | pub fn generate_thumbnail(

FILE: czkawka_core/src/helpers/audio_checker.rs
  function parse_audio_file (line 9) | pub fn parse_audio_file(file_handler: File) -> Result<(), Error> {

FILE: czkawka_core/src/helpers/debug_timer.rs
  type Timer (line 48) | pub struct Timer {
    method new (line 61) | pub fn new(base: &str) -> Self {
    method checkpoint (line 71) | pub fn checkpoint(&mut self, name: &str) {
    method report (line 81) | pub fn report(&mut self, all_steps_name: &str, in_one_line: bool) -> S...
  function test_timer_basic_functionality (line 105) | fn test_timer_basic_functionality() {
  function test_timer_report_multiline (line 122) | fn test_timer_report_multiline() {
  function test_timer_report_oneline (line 137) | fn test_timer_report_oneline() {
  function test_timer_no_checkpoints (line 154) | fn test_timer_no_checkpoints() {
  function test_timer_elapsed_time_accumulates (line 162) | fn test_timer_elapsed_time_accumulates() {

FILE: czkawka_core/src/helpers/delayed_sender.rs
  type DelayedSender (line 13) | pub struct DelayedSender<T: Send + 'static> {
  function new (line 24) | pub fn new(sender: crossbeam_channel::Sender<T>, wait_time: Duration) ->...
  function send (line 63) | pub fn send(&self, value: T) {
  method drop (line 70) | fn drop(&mut self) {
  function test_delayed_sender_basic_send (line 82) | fn test_delayed_sender_basic_send() {
  function test_delayed_sender_batching (line 95) | fn test_delayed_sender_batching() {
  function test_delayed_sender_multiple_sends (line 123) | fn test_delayed_sender_multiple_sends() {
  function test_delayed_sender_drop_stops_thread (line 143) | fn test_delayed_sender_drop_stops_thread() {
  function test_delayed_sender_no_send_without_wait (line 157) | fn test_delayed_sender_no_send_without_wait() {

FILE: czkawka_core/src/helpers/ffprobe.rs
  function ffprobe (line 33) | pub fn ffprobe(path: impl AsRef<std::path::Path>) -> Result<FfProbe, FfP...
  function ffprobe_config (line 45) | pub fn ffprobe_config(config: Config, path: impl AsRef<std::path::Path>)...
  type Config (line 76) | pub struct Config {
    method builder (line 83) | pub fn builder() -> ConfigBuilder {
  type ConfigBuilder (line 89) | pub struct ConfigBuilder {
    method new (line 94) | pub fn new() -> Self {
    method count_frames (line 106) | pub fn count_frames(mut self, count_frames: bool) -> Self {
    method ffprobe_bin (line 113) | pub fn ffprobe_bin(mut self, ffprobe_bin: impl AsRef<std::path::Path>)...
    method build (line 119) | pub fn build(self) -> Config {
    method run (line 124) | pub fn run(self, path: impl AsRef<std::path::Path>) -> Result<FfProbe,...
  method default (line 130) | fn default() -> Self {
  type FfProbeError (line 137) | pub enum FfProbeError {
    method fmt (line 144) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
  type FfProbe (line 159) | pub struct FfProbe {
  type Stream (line 166) | pub struct Stream {
  type SideData (line 223) | pub struct SideData {
  type Disposition (line 231) | pub struct Disposition {
  type StreamTags (line 249) | pub struct StreamTags {
  type Format (line 260) | pub struct Format {
    method try_get_duration (line 276) | pub fn try_get_duration(&self) -> Option<Result<std::time::Duration, s...
    method get_duration (line 287) | pub fn get_duration(&self) -> Option<std::time::Duration> {
  type FormatTags (line 293) | pub struct FormatTags {

FILE: czkawka_core/src/helpers/messages.rs
  type Messages (line 7) | pub struct Messages {
    method new (line 26) | pub fn new() -> Self {
    method new_from_errors (line 31) | pub fn new_from_errors(errors: Vec<String>) -> Self {
    method new_from_warnings (line 36) | pub fn new_from_warnings(warnings: Vec<String>) -> Self {
    method new_from_messages (line 41) | pub fn new_from_messages(messages: Vec<String>) -> Self {
    method print_messages_to_writer (line 46) | pub fn print_messages_to_writer<T: std::io::Write>(&self, writer: &mut...
    method create_messages_text (line 52) | pub fn create_messages_text(&self, limit: MessageLimit) -> String {
    method extend_with_another_messages (line 118) | pub fn extend_with_another_messages(&mut self, messages: Self) {
  type MessageLimit (line 18) | pub enum MessageLimit {
  function test_messages_constructors_and_text_formatting (line 134) | fn test_messages_constructors_and_text_formatting() {
  function test_extend_and_writer (line 179) | fn test_extend_and_writer() {

FILE: czkawka_core/src/lib.rs
  constant CZKAWKA_VERSION (line 12) | pub const CZKAWKA_VERSION: &str = env!("CARGO_PKG_VERSION");
  constant TOOLS_NUMBER (line 13) | pub const TOOLS_NUMBER: usize = 14;

FILE: czkawka_core/src/localizer_core.rs
  type Localizations (line 9) | struct Localizations;
  function localizer_core (line 26) | pub fn localizer_core() -> Box<dyn Localizer> {
  function generate_translation_hashmap (line 30) | pub fn generate_translation_hashmap(vec: Vec<(&'static str, String)>) ->...
  function fnc_get_similarity_very_high (line 38) | pub fn fnc_get_similarity_very_high() -> String {
  function fnc_get_similarity_minimal (line 42) | pub fn fnc_get_similarity_minimal() -> String {

FILE: czkawka_core/src/tools/bad_extensions/core.rs
  constant MAX_EXTENSION_LENGTH (line 22) | const MAX_EXTENSION_LENGTH: usize = 10;
  method new (line 25) | pub fn new(params: BadExtensionsParameters) -> Self {
  method check_files (line 36) | pub(crate) fn check_files(&mut self, stop_flag: &Arc<AtomicBool>, progre...
  method look_for_bad_extensions_files (line 58) | pub(crate) fn look_for_bad_extensions_files(&mut self, stop_flag: &Arc<A...
  method verify_extension_of_file (line 88) | fn verify_extension_of_file(&self, file_entry: FileEntry, workarounds: &...
  method verify_extensions (line 124) | fn verify_extensions(
  method get_and_validate_extension (line 146) | fn get_and_validate_extension(file_entry: &FileEntry, proper_extension: ...
  method check_for_all_extensions_that_file_can_use (line 170) | fn check_for_all_extensions_that_file_can_use(workarounds: &IndexMap<&st...
  method fix_bad_extensions (line 208) | pub fn fix_bad_extensions(&mut self, _fix_params: super::BadExtensionsFi...

FILE: czkawka_core/src/tools/bad_extensions/mod.rs
  type BadFileEntry (line 17) | pub struct BadFileEntry {
  method get_path (line 27) | fn get_path(&self) -> &Path {
  method get_modified_date (line 30) | fn get_modified_date(&self) -> u64 {
  method get_size (line 33) | fn get_size(&self) -> u64 {
  type Info (line 39) | pub struct Info {
  type BadExtensionsFixParams (line 45) | pub struct BadExtensionsFixParams {}
  type BadExtensionsParameters (line 48) | pub struct BadExtensionsParameters {
    method new (line 53) | pub fn new() -> Self {
  method default (line 60) | fn default() -> Self {
  type BadExtensions (line 65) | pub struct BadExtensions {
    method get_bad_extensions_files (line 74) | pub const fn get_bad_extensions_files(&self) -> &Vec<BadFileEntry> {

FILE: czkawka_core/src/tools/bad_extensions/tests.rs
  function test_find_bad_extension_png_as_jpg (line 13) | fn test_find_bad_extension_png_as_jpg() {
  function test_correct_extension (line 39) | fn test_correct_extension() {
  function test_file_without_extension_excluded (line 63) | fn test_file_without_extension_excluded() {
  function test_file_without_extension_included (line 87) | fn test_file_without_extension_included() {

FILE: czkawka_core/src/tools/bad_extensions/traits.rs
  method search (line 19) | fn search(&mut self, stop_flag: &Arc<AtomicBool>, progress_sender: Optio...
  method delete_files (line 44) | fn delete_files(&mut self, stop_flag: &Arc<AtomicBool>, progress_sender:...
  type FixParams (line 54) | type FixParams = BadExtensionsFixParams;
  method fix_items (line 57) | fn fix_items(&mut self, stop_flag: &Arc<AtomicBool>, _progress_sender: O...
  method debug_print (line 64) | fn debug_print(&self) {
  method write_results (line 75) | fn write_results<T: Write>(&self, writer: &mut T) -> std::io::Result<()> {
  method save_results_to_file_as_json (line 86) | fn save_results_to_file_as_json(&self, file_name: &str, pretty_print: bo...
  type Info (line 92) | type Info = Info;
  type Parameters (line 93) | type Parameters = BadExtensionsParameters;
  method get_information (line 95) | fn get_information(&self) -> Self::Info {
  method get_params (line 98) | fn get_params(&self) -> Self::Parameters {
  method get_cd (line 101) | fn get_cd(&self) -> &CommonToolData {
  method get_cd_mut (line 104) | fn get_cd_mut(&mut self) -> &mut CommonToolData {
  method found_any_items (line 107) | fn found_any_items(&self) -> bool {

FILE: czkawka_core/src/tools/bad_extensions/workarounds.rs
  constant DISABLED_EXTENSIONS (line 1) | pub(crate) const DISABLED_EXTENSIONS: &[&str] = &["file", "cache", "bak"...
  constant WORKAROUNDS (line 5) | pub(crate) const WORKAROUNDS: &[(&str, &str)] = &[

FILE: czkawka_core/src/tools/bad_names/core.rs
  method new (line 19) | pub fn new(params: BadNamesParameters) -> Self {
  method check_files (line 30) | pub(crate) fn check_files(&mut self, stop_flag: &Arc<AtomicBool>, progre...
  method look_for_bad_names_files (line 52) | pub(crate) fn look_for_bad_names_files(&mut self, stop_flag: &Arc<Atomic...
  method fix_bad_names (line 106) | pub fn fix_bad_names(&mut self, _fix_params: NameFixerParams, stop_flag:...
  function check_and_generate_new_name (line 130) | pub fn check_and_generate_new_name(path: &Path, checked_issues: &NameIss...
  function is_alphanumeric (line 191) | fn is_alphanumeric(c: char) -> bool {
  function remove_duplicated_non_alphanumeric (line 195) | fn remove_duplicated_non_alphanumeric(s: &str) -> String {
  function is_emoji (line 217) | fn is_emoji(c: char) -> bool {

FILE: czkawka_core/src/tools/bad_names/mod.rs
  type BadNameEntry (line 16) | pub struct BadNameEntry {
  method get_path (line 24) | fn get_path(&self) -> &Path {
  method get_modified_date (line 27) | fn get_modified_date(&self) -> u64 {
  method get_size (line 30) | fn get_size(&self) -> u64 {
  type NameIssues (line 36) | pub struct NameIssues {
    method all (line 46) | pub fn all() -> Self {
    method none (line 57) | pub fn none() -> Self {
    method is_empty (line 61) | pub fn is_empty(&self) -> bool {
  type NameFixerParams (line 72) | pub struct NameFixerParams {
  type Info (line 77) | pub struct Info {
  type BadNamesParameters (line 83) | pub struct BadNamesParameters {
    method new (line 88) | pub fn new(checked_issues: NameIssues) -> Self {
  method default (line 94) | fn default() -> Self {
  type BadNames (line 101) | pub struct BadNames {
    method get_bad_names_files (line 110) | pub const fn get_bad_names_files(&self) -> &Vec<BadNameEntry> {
    method get_params (line 114) | pub fn get_params(&self) -> &BadNamesParameters {
    method get_information (line 118) | pub const fn get_information(&self) -> Info {

FILE: czkawka_core/src/tools/bad_names/tests.rs
  function test_uppercase_extension_detection (line 12) | fn test_uppercase_extension_detection() {
  function test_emoji_detection (line 36) | fn test_emoji_detection() {
  function test_space_at_start_end_stem_detection (line 60) | fn test_space_at_start_end_stem_detection() {
  function test_space_at_start_end_extension_detection (line 84) | fn test_space_at_start_end_extension_detection() {
  function test_non_ascii_graphical_detection (line 108) | fn test_non_ascii_graphical_detection() {
  function test_restricted_charset_detection (line 132) | fn test_restricted_charset_detection() {
  function test_duplicated_non_alphanumeric (line 156) | fn test_duplicated_non_alphanumeric() {
  function test_multiple_issues (line 180) | fn test_multiple_issues() {
  function test_uppercase_extension_unit (line 200) | fn test_uppercase_extension_unit() {
  function test_emoji_removal_unit (line 250) | fn test_emoji_removal_unit() {
  function test_space_at_start_end_unit (line 298) | fn test_space_at_start_end_unit() {
  function test_non_ascii_graphical_unit (line 347) | fn test_non_ascii_graphical_unit() {
  function test_restricted_charset_unit (line 398) | fn test_restricted_charset_unit() {
  function test_duplicated_non_alphanumeric_unit (line 447) | fn test_duplicated_non_alphanumeric_unit() {
  function test_combined_all_issues_unit (line 506) | fn test_combined_all_issues_unit() {
  function test_no_issues_no_changes (line 555) | fn test_no_issues_no_changes() {
  function test_edge_cases_unit (line 583) | fn test_edge_cases_unit() {

FILE: czkawka_core/src/tools/bad_names/traits.rs
  method search (line 20) | fn search(&mut self, stop_flag: &Arc<AtomicBool>, progress_sender: Optio...
  method debug_print (line 55) | fn debug_print(&self) {
  method write_results (line 64) | fn write_results<T: Write>(&self, writer: &mut T) -> std::io::Result<()> {
  method save_results_to_file_as_json (line 79) | fn save_results_to_file_as_json(&self, file_name: &str, pretty_print: bo...
  method delete_files (line 86) | fn delete_files(&mut self, stop_flag: &Arc<AtomicBool>, progress_sender:...
  type FixParams (line 96) | type FixParams = NameFixerParams;
  method fix_items (line 98) | fn fix_items(&mut self, stop_flag: &Arc<AtomicBool>, _progress_sender: O...
  type Info (line 104) | type Info = Info;
  type Parameters (line 105) | type Parameters = BadNamesParameters;
  method get_information (line 107) | fn get_information(&self) -> Self::Info {
  method get_params (line 110) | fn get_params(&self) -> Self::Parameters {
  method get_cd (line 113) | fn get_cd(&self) -> &CommonToolData {
  method get_cd_mut (line 116) | fn get_cd_mut(&mut self) -> &mut CommonToolData {
  method found_any_items (line 119) | fn found_any_items(&self) -> bool {

FILE: czkawka_core/src/tools/big_file/core.rs
  method new (line 17) | pub fn new(params: BigFileParameters) -> Self {
  method look_for_big_files (line 27) | pub(crate) fn look_for_big_files(&mut self, stop_flag: &Arc<AtomicBool>,...

FILE: czkawka_core/src/tools/big_file/mod.rs
  type SearchMode (line 12) | pub enum SearchMode {
  type Info (line 18) | pub struct Info {
  type BigFileParameters (line 24) | pub struct BigFileParameters {
    method new (line 30) | pub fn new(number_of_files: usize, search_mode: SearchMode) -> Self {
  type BigFile (line 38) | pub struct BigFile {
    method get_big_files (line 46) | pub const fn get_big_files(&self) -> &Vec<FileEntry> {

FILE: czkawka_core/src/tools/big_file/tests.rs
  function test_find_biggest_files (line 12) | fn test_find_biggest_files() {
  function test_find_smallest_files (line 35) | fn test_find_smallest_files() {
  function test_limit_number_of_files (line 59) | fn test_limit_number_of_files() {
  function test_empty_directory (line 80) | fn test_empty_directory() {

FILE: czkawka_core/src/tools/big_file/traits.rs
  method delete_files (line 20) | fn delete_files(&mut self, stop_flag: &Arc<AtomicBool>, progress_sender:...
  method debug_print (line 31) | fn debug_print(&self) {
  method write_results (line 45) | fn write_results<T: Write>(&self, writer: &mut T) -> std::io::Result<()> {
  method save_results_to_file_as_json (line 70) | fn save_results_to_file_as_json(&self, file_name: &str, pretty_print: bo...
  method search (line 77) | fn search(&mut self, stop_flag: &Arc<AtomicBool>, progress_sender: Optio...
  type Info (line 102) | type Info = Info;
  type Parameters (line 103) | type Parameters = BigFileParameters;
  method get_information (line 105) | fn get_information(&self) -> Self::Info {
  method get_params (line 108) | fn get_params(&self) -> Self::Parameters {
  method get_cd (line 111) | fn get_cd(&self) -> &CommonToolData {
  method get_cd_mut (line 114) | fn get_cd_mut(&mut self) -> &mut CommonToolData {
  method found_any_items (line 117) | fn found_any_items(&self) -> bool {

FILE: czkawka_core/src/tools/broken_files/core.rs
  method new (line 28) | pub fn new(params: BrokenFilesParameters) -> Self {
  method check_files (line 39) | pub(crate) fn check_files(&mut self, stop_flag: &Arc<AtomicBool>, progre...
  method check_broken_image (line 67) | fn check_broken_image(mut file_entry: BrokenEntry) -> BrokenEntry {
  method check_broken_zip (line 90) | fn check_broken_zip(mut file_entry: BrokenEntry) -> Option<BrokenEntry> {
  method check_broken_audio (line 101) | fn check_broken_audio(mut file_entry: BrokenEntry) -> Option<BrokenEntry> {
  method check_broken_pdf (line 125) | fn check_broken_pdf(mut file_entry: BrokenEntry) -> BrokenEntry {
  method check_broken_video (line 149) | fn check_broken_video(mut file_entry: BrokenEntry, stop_flag: &Arc<Atomi...
  method load_cache (line 246) | fn load_cache(&mut self) -> (BTreeMap<String, BrokenEntry>, BTreeMap<Str...
  method save_to_cache (line 251) | fn save_to_cache(&mut self, vec_file_entry: &[BrokenEntry], loaded_hash_...
  method check_file (line 255) | fn check_file(file_entry: BrokenEntry, stop_flag: &Arc<AtomicBool>) -> O...
  method look_for_broken_files (line 270) | pub(crate) fn look_for_broken_files(&mut self, stop_flag: &Arc<AtomicBoo...
  function check_extension_availability (line 328) | fn check_extension_availability(full_name: &Path) -> TypeOfFile {
  function get_broken_files_cache_file (line 359) | pub fn get_broken_files_cache_file() -> String {

FILE: czkawka_core/src/tools/broken_files/mod.rs
  type BrokenEntry (line 19) | pub struct BrokenEntry {
  method get_path (line 26) | fn get_path(&self) -> &Path {
  method get_modified_date (line 29) | fn get_modified_date(&self) -> u64 {
  method get_size (line 32) | fn get_size(&self) -> u64 {
  method into_broken_entry (line 38) | fn into_broken_entry(self) -> BrokenEntry {
  type TypeOfFile (line 49) | pub enum TypeOfFile {
  type Info (line 72) | pub struct Info {
  type BrokenFilesParameters (line 78) | pub struct BrokenFilesParameters {
    method new (line 83) | pub fn new(checked_types: CheckedTypes) -> Self {
  type BrokenFiles (line 88) | pub struct BrokenFiles {
    method get_broken_files (line 97) | pub const fn get_broken_files(&self) -> &Vec<BrokenEntry> {
    method get_params (line 101) | pub(crate) fn get_params(&self) -> &BrokenFilesParameters {
    method get_information (line 105) | pub const fn get_information(&self) -> Info {

FILE: czkawka_core/src/tools/broken_files/tests.rs
  function get_test_resources_path (line 12) | fn get_test_resources_path() -> PathBuf {
  function corrupt_file (line 18) | fn corrupt_file(source: &PathBuf, dest: &PathBuf, bytes_to_corrupt: usiz...
  function test_find_broken_image (line 27) | fn test_find_broken_image() {
  function test_valid_image (line 50) | fn test_valid_image() {
  function test_broken_audio (line 72) | fn test_broken_audio() {
  function test_mixed_valid_and_broken_images (line 99) | fn test_mixed_valid_and_broken_images() {
  function test_multiple_file_types (line 126) | fn test_multiple_file_types() {
  function test_empty_directory (line 151) | fn test_empty_directory() {
  function test_no_file_types_selected (line 168) | fn test_no_file_types_selected() {

FILE: czkawka_core/src/tools/broken_files/traits.rs
  method search (line 22) | fn search(&mut self, stop_flag: &Arc<AtomicBool>, progress_sender: Optio...
  method debug_print (line 76) | fn debug_print(&self) {
  method write_results (line 85) | fn write_results<T: Write>(&self, writer: &mut T) -> std::io::Result<()> {
  method save_results_to_file_as_json (line 100) | fn save_results_to_file_as_json(&self, file_name: &str, pretty_print: bo...
  method delete_files (line 106) | fn delete_files(&mut self, stop_flag: &Arc<AtomicBool>, progress_sender:...
  type Info (line 116) | type Info = Info;
  type Parameters (line 117) | type Parameters = BrokenFilesParameters;
  method get_information (line 119) | fn get_information(&self) -> Self::Info {
  method get_params (line 122) | fn get_params(&self) -> Self::Parameters {
  method get_cd (line 125) | fn get_cd(&self) -> &CommonToolData {
  method get_cd_mut (line 128) | fn get_cd_mut(&mut self) -> &mut CommonToolData {
  method found_any_items (line 131) | fn found_any_items(&self) -> bool {

FILE: czkawka_core/src/tools/duplicate/core.rs
  method new (line 27) | pub fn new(params: DuplicateFinderParameters) -> Self {
  method check_files_name (line 44) | pub(crate) fn check_files_name(&mut self, stop_flag: &Arc<AtomicBool>, p...
  method calculate_name_stats (line 116) | fn calculate_name_stats(&mut self) {
  method check_files_size_name (line 131) | pub(crate) fn check_files_size_name(&mut self, stop_flag: &Arc<AtomicBoo...
  method calculate_size_name_stats (line 210) | fn calculate_size_name_stats(&mut self) {
  method check_files_size (line 227) | pub(crate) fn check_files_size(&mut self, stop_flag: &Arc<AtomicBool>, p...
  method calculate_size_stats (line 294) | fn calculate_size_stats(&mut self) {
  method filter_reference_folders_by_size (line 311) | fn filter_reference_folders_by_size(&mut self) {
  method prehash_load_cache_at_start (line 334) | fn prehash_load_cache_at_start(&mut self) -> (BTreeMap<u64, Vec<Duplicat...
  method prehash_save_cache_at_exit (line 367) | fn prehash_save_cache_at_exit(
  method prehashing (line 405) | fn prehashing(
  method diff_loaded_and_prechecked_files (line 505) | fn diff_loaded_and_prechecked_files(
  method full_hashing_load_cache_at_start (line 542) | fn full_hashing_load_cache_at_start(
  method full_hashing_save_cache_at_exit (line 576) | fn full_hashing_save_cache_at_exit(
  method full_hashing (line 628) | fn full_hashing(
  method hash_reference_folders (line 719) | fn hash_reference_folders(&mut self) {
  method check_files_hash (line 771) | pub(crate) fn check_files_hash(&mut self, stop_flag: &Arc<AtomicBool>, p...
  function get_duplicate_cache_file (line 793) | pub fn get_duplicate_cache_file(type_of_hash: HashType, is_prehash: bool...

FILE: czkawka_core/src/tools/duplicate/mod.rs
  constant PREHASHING_BUFFER_SIZE (line 32) | pub const PREHASHING_BUFFER_SIZE: u64 = 4 * 1024;
  constant THREAD_BUFFER_SIZE (line 33) | pub const THREAD_BUFFER_SIZE: usize = 2 * 1024 * 1024;
  type DuplicateEntry (line 40) | pub struct DuplicateEntry {
  method get_path (line 47) | fn get_path(&self) -> &Path {
  method get_modified_date (line 50) | fn get_modified_date(&self) -> u64 {
  method get_size (line 53) | fn get_size(&self) -> u64 {
  method into_duplicate_entry (line 59) | fn into_duplicate_entry(self) -> DuplicateEntry {
  type Info (line 70) | pub struct Info {
  type DuplicateFinderParameters (line 85) | pub struct DuplicateFinderParameters {
    method new (line 95) | pub fn new(
  type DuplicateFinder (line 114) | pub struct DuplicateFinder {
    method get_params (line 174) | pub fn get_params(&self) -> &DuplicateFinderParameters {
    method get_files_sorted_by_names (line 178) | pub const fn get_files_sorted_by_names(&self) -> &BTreeMap<String, Vec...
    method get_files_sorted_by_size (line 182) | pub const fn get_files_sorted_by_size(&self) -> &BTreeMap<u64, Vec<Dup...
    method get_files_sorted_by_size_name (line 186) | pub const fn get_files_sorted_by_size_name(&self) -> &BTreeMap<(u64, S...
    method get_files_sorted_by_hash (line 190) | pub const fn get_files_sorted_by_hash(&self) -> &BTreeMap<u64, Vec<Vec...
    method get_information (line 194) | pub const fn get_information(&self) -> Info {
    method set_dry_run (line 198) | pub fn set_dry_run(&mut self, dry_run: bool) {
    method get_use_reference (line 202) | pub fn get_use_reference(&self) -> bool {
    method get_files_with_identical_hashes_referenced (line 206) | pub fn get_files_with_identical_hashes_referenced(&self) -> &BTreeMap<...
    method get_files_with_identical_name_referenced (line 210) | pub fn get_files_with_identical_name_referenced(&self) -> &BTreeMap<St...
    method get_files_with_identical_size_referenced (line 214) | pub fn get_files_with_identical_size_referenced(&self) -> &BTreeMap<u6...
    method get_files_with_identical_size_names_referenced (line 218) | pub fn get_files_with_identical_size_names_referenced(&self) -> &BTree...
  function filter_hard_links (line 137) | fn filter_hard_links(vec_file_entry: Vec<FileEntry>) -> Vec<FileEntry> {
  function filter_hard_links (line 154) | fn filter_hard_links(vec_file_entry: Vec<FileEntry>) -> Vec<FileEntry> {
  type MyHasher (line 168) | pub trait MyHasher {
    method update (line 169) | fn update(&mut self, bytes: &[u8]);
    method finalize (line 170) | fn finalize(&self) -> String;
    method update (line 286) | fn update(&mut self, bytes: &[u8]) {
    method finalize (line 289) | fn finalize(&self) -> String {
    method update (line 295) | fn update(&mut self, bytes: &[u8]) {
    method finalize (line 298) | fn finalize(&self) -> String {
    method update (line 304) | fn update(&mut self, bytes: &[u8]) {
    method finalize (line 307) | fn finalize(&self) -> String {
  function hash_calculation_limit (line 223) | pub(crate) fn hash_calculation_limit(buffer: &mut [u8], file_entry: &Dup...
  function hash_calculation (line 253) | pub fn hash_calculation(
  function test_filter_hard_links_empty (line 322) | fn test_filter_hard_links_empty() {
  function test_filter_hard_links (line 329) | fn test_filter_hard_links() -> io::Result<()> {
  function test_filter_hard_links_regular_files (line 342) | fn test_filter_hard_links_regular_files() -> io::Result<()> {
  function test_hash_calculation (line 355) | fn test_hash_calculation() -> io::Result<()> {
  function test_hash_calculation_limit (line 372) | fn test_hash_calculation_limit() -> io::Result<()> {
  function test_hash_calculation_invalid_file (line 396) | fn test_hash_calculation_invalid_file() -> io::Result<()> {

FILE: czkawka_core/src/tools/duplicate/tests.rs
  function test_find_duplicates_by_hash (line 13) | fn test_find_duplicates_by_hash() {
  function test_find_duplicates_by_size (line 39) | fn test_find_duplicates_by_size() {
  function test_find_duplicates_by_name (line 65) | fn test_find_duplicates_by_name() {
  function test_no_duplicates_found (line 95) | fn test_no_duplicates_found() {
  function test_lost_space_calculation (line 120) | fn test_lost_space_calculation() {

FILE: czkawka_core/src/tools/duplicate/traits.rs
  method delete_files (line 21) | fn delete_files(&mut self, stop_flag: &Arc<AtomicBool>, progress_sender:...
  method search (line 39) | fn search(&mut self, stop_flag: &Arc<AtomicBool>, progress_sender: Optio...
  method debug_print (line 92) | fn debug_print(&self) {
  method write_results (line 137) | fn write_results<T: Write>(&self, writer: &mut T) -> io::Result<()> {
  method save_results_to_file_as_json (line 316) | fn save_results_to_file_as_json(&self, file_name: &str, pretty_print: bo...
  type Info (line 340) | type Info = Info;
  type Parameters (line 341) | type Parameters = DuplicateFinderParameters;
  method get_information (line 343) | fn get_information(&self) -> Self::Info {
  method get_params (line 346) | fn get_params(&self) -> Self::Parameters {
  method get_cd (line 349) | fn get_cd(&self) -> &CommonToolData {
  method get_cd_mut (line 352) | fn get_cd_mut(&mut self) -> &mut CommonToolData {
  method get_check_method (line 355) | fn get_check_method(&self) -> CheckingMethod {
  method found_any_items (line 358) | fn found_any_items(&self) -> bool {

FILE: czkawka_core/src/tools/empty_files/core.rs
  method new (line 15) | pub fn new() -> Self {
  method check_files (line 24) | pub(crate) fn check_files(&mut self, stop_flag: &Arc<AtomicBool>, progre...

FILE: czkawka_core/src/tools/empty_files/mod.rs
  type Info (line 12) | pub struct Info {
  type EmptyFiles (line 17) | pub struct EmptyFiles {
    method get_empty_files (line 30) | pub const fn get_empty_files(&self) -> &Vec<FileEntry> {
    method get_information (line 34) | pub const fn get_information(&self) -> Info {
  method default (line 24) | fn default() -> Self {

FILE: czkawka_core/src/tools/empty_files/tests.rs
  function test_find_empty_files (line 12) | fn test_find_empty_files() {
  function test_no_empty_files (line 34) | fn test_no_empty_files() {
  function test_recursive_search_empty_files (line 55) | fn test_recursive_search_empty_files() {

FILE: czkawka_core/src/tools/empty_files/traits.rs
  method search (line 19) | fn search(&mut self, stop_flag: &Arc<AtomicBool>, progress_sender: Optio...
  method debug_print (line 45) | fn debug_print(&self) {
  method write_results (line 57) | fn write_results<T: Write>(&self, writer: &mut T) -> std::io::Result<()> {
  method save_results_to_file_as_json (line 72) | fn save_results_to_file_as_json(&self, file_name: &str, pretty_print: bo...
  type Info (line 77) | type Info = Info;
  type Parameters (line 78) | type Parameters = ();
  method get_information (line 80) | fn get_information(&self) -> Self::Info {
  method get_params (line 83) | fn get_params(&self) -> Self::Parameters {}
  method get_cd (line 84) | fn get_cd(&self) -> &CommonToolData {
  method get_cd_mut (line 87) | fn get_cd_mut(&mut self) -> &mut CommonToolData {
  method found_any_items (line 90) | fn found_any_items(&self) -> bool {
  method delete_files (line 96) | fn delete_files(&mut self, stop_flag: &Arc<AtomicBool>, progress_sender:...

FILE: czkawka_core/src/tools/empty_folder/core.rs
  method new (line 22) | pub fn new() -> Self {
  method get_empty_folder_list (line 30) | pub const fn get_empty_folder_list(&self) -> &IndexMap<String, FolderEnt...
  method get_information (line 34) | pub const fn get_information(&self) -> Info {
  method optimize_folders (line 38) | pub(crate) fn optimize_folders(&mut self) {
  method check_for_empty_folders (line 58) | pub(crate) fn check_for_empty_folders(&mut self, stop_flag: &Arc<AtomicB...
  method set_as_not_empty_folder (line 174) | pub(crate) fn set_as_not_empty_folder(folder_entries: &mut IndexMap<Stri...
  method process_dir_in_dir_mode (line 200) | fn process_dir_in_dir_mode(

FILE: czkawka_core/src/tools/empty_folder/mod.rs
  type FolderEntry (line 15) | pub struct FolderEntry {
  method get_path (line 24) | fn get_path(&self) -> &Path {
  method get_modified_date (line 28) | fn get_modified_date(&self) -> u64 {
  method get_size (line 32) | fn get_size(&self) -> u64 {
  type EmptyFolder (line 37) | pub struct EmptyFolder {
  type FolderEmptiness (line 46) | pub(crate) enum FolderEmptiness {
  type Info (line 52) | pub struct Info {
  method default (line 58) | fn default() -> Self {

FILE: czkawka_core/src/tools/empty_folder/tests.rs
  function test_find_empty_folders (line 12) | fn test_find_empty_folders() {
  function test_nested_empty_folders (line 37) | fn test_nested_empty_folders() {
  function test_no_empty_folders (line 60) | fn test_no_empty_folders() {
  function test_folder_with_only_empty_subfolders (line 81) | fn test_folder_with_only_empty_subfolders() {

FILE: czkawka_core/src/tools/empty_folder/traits.rs
  method search (line 20) | fn search(&mut self, stop_flag: &Arc<AtomicBool>, progress_sender: Optio...
  method debug_print (line 48) | fn debug_print(&self) {
  method write_results (line 61) | fn write_results<T: Write>(&self, writer: &mut T) -> std::io::Result<()> {
  method save_results_to_file_as_json (line 78) | fn save_results_to_file_as_json(&self, file_name: &str, pretty_print: bo...
  type Info (line 84) | type Info = Info;
  type Parameters (line 85) | type Parameters = ();
  method get_information (line 87) | fn get_information(&self) -> Self::Info {
  method get_params (line 90) | fn get_params(&self) -> Self::Parameters {}
  method get_cd (line 91) | fn get_cd(&self) -> &CommonToolData {
  method get_cd_mut (line 94) | fn get_cd_mut(&mut self) -> &mut CommonToolData {
  method found_any_items (line 97) | fn found_any_items(&self) -> bool {
  method delete_files (line 104) | fn delete_files(&mut self, stop_flag: &Arc<AtomicBool>, progress_sender:...

FILE: czkawka_core/src/tools/exif_remover/core.rs
  method new (line 25) | pub fn new(params: ExifRemoverParameters) -> Self {
  method find_exif_files (line 54) | pub(crate) fn find_exif_files(&mut self, stop_flag: &Arc<AtomicBool>, pr...
  method load_cache (line 91) | fn load_cache(
  method save_to_cache (line 104) | fn save_to_cache(
  method check_exif_in_files (line 119) | pub(crate) fn check_exif_in_files(&mut self, stop_flag: &Arc<AtomicBool>...
  method fix_files (line 200) | pub(crate) fn fix_files(&mut self, stop_flag: &Arc<AtomicBool>, _progres...
  function clean_exif_tags (line 222) | pub fn clean_exif_tags(file_path: &str, tags_to_remove: &[(u16, String)]...
  function extract_exif_tags_public (line 257) | pub fn extract_exif_tags_public(path: &Path) -> Result<Vec<(u16, String)...
  function extract_exif_tags (line 262) | fn extract_exif_tags(path: &Path) -> Result<Vec<(String, u16, String)>, ...
  function file_extension_to_string (line 289) | pub fn file_extension_to_string(extension: FileExtension) -> &'static str {
  function string_to_file_extension (line 300) | pub fn string_to_file_extension(s: &str) -> FileExtension {
  function string_to_exif_tag_group (line 341) | pub fn string_to_exif_tag_group(tag: &str) -> Result<ExifTagGroup, Strin...
  function exif_tag_group_to_string (line 351) | pub fn exif_tag_group_to_string(tag_group: ExifTagGroup) -> String {
  function get_exif_remover_cache_file (line 360) | pub fn get_exif_remover_cache_file() -> String {

FILE: czkawka_core/src/tools/exif_remover/mod.rs
  type Info (line 16) | pub struct Info {
  type ExifRemoverParameters (line 22) | pub struct ExifRemoverParameters {
    method new (line 27) | pub fn new(ignored_tags: Vec<String>) -> Self {
  type ExifEntry (line 33) | pub struct ExifEntry {
  type ExifTagInfo (line 42) | pub struct ExifTagInfo {
  type ExifTagsFixerParams (line 49) | pub struct ExifTagsFixerParams {
  method get_path (line 54) | fn get_path(&self) -> &std::path::Path {
  method get_modified_date (line 57) | fn get_modified_date(&self) -> u64 {
  method get_size (line 60) | fn get_size(&self) -> u64 {
  type ExifRemover (line 65) | pub struct ExifRemover {
    method get_exif_files (line 75) | pub const fn get_exif_files(&self) -> &Vec<ExifEntry> {
    method get_information (line 79) | pub const fn get_information(&self) -> Info {

FILE: czkawka_core/src/tools/exif_remover/tests.rs
  function get_test_resources_path (line 12) | fn get_test_resources_path() -> PathBuf {
  function test_find_exif_files (line 17) | fn test_find_exif_files() {
  function test_empty_directory (line 40) | fn test_empty_directory() {
  function test_non_image_files (line 55) | fn test_non_image_files() {

FILE: czkawka_core/src/tools/exif_remover/traits.rs
  method delete_files (line 21) | fn delete_files(&mut self, stop_flag: &Arc<AtomicBool>, progress_sender:...
  type FixParams (line 34) | type FixParams = ExifTagsFixerParams;
  method fix_items (line 36) | fn fix_items(&mut self, stop_flag: &Arc<AtomicBool>, progress_sender: Op...
  method debug_print (line 43) | fn debug_print(&self) {
  method write_results (line 57) | fn write_results<T: Write>(&self, writer: &mut T) -> std::io::Result<()> {
  method save_results_to_file_as_json (line 80) | fn save_results_to_file_as_json(&self, file_name: &str, pretty_print: bo...
  method search (line 87) | fn search(&mut self, stop_flag: &Arc<AtomicBool>, progress_sender: Optio...
  type Info (line 118) | type Info = Info;
  type Parameters (line 119) | type Parameters = ExifRemoverParameters;
  method get_information (line 121) | fn get_information(&self) -> Self::Info {
  method get_params (line 124) | fn get_params(&self) -> Self::Parameters {
  method get_cd (line 127) | fn get_cd(&self) -> &CommonToolData {
  method get_cd_mut (line 130) | fn get_cd_mut(&mut self) -> &mut CommonToolData {
  method found_any_items (line 133) | fn found_any_items(&self) -> bool {

FILE: czkawka_core/src/tools/invalid_symlinks/core.rs
  method new (line 16) | pub fn new() -> Self {
  method check_files (line 25) | pub(crate) fn check_files(&mut self, stop_flag: &Arc<AtomicBool>, progre...
  method check_invalid_symlinks (line 54) | fn check_invalid_symlinks(current_file_name: &Path) -> Option<(PathBuf, ...

FILE: czkawka_core/src/tools/invalid_symlinks/mod.rs
  type Info (line 18) | pub struct Info {
  constant MAX_NUMBER_OF_SYMLINK_JUMPS (line 23) | const MAX_NUMBER_OF_SYMLINK_JUMPS: i32 = 20;
  type ErrorType (line 26) | pub enum ErrorType {
    method translate (line 32) | pub fn translate(self) -> String {
  method fmt (line 41) | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
  type SymlinkInfo (line 50) | pub struct SymlinkInfo {
  type SymlinksFileEntry (line 56) | pub struct SymlinksFileEntry {
  method get_path (line 64) | fn get_path(&self) -> &Path {
  method get_modified_date (line 67) | fn get_modified_date(&self) -> u64 {
  method get_size (line 70) | fn get_size(&self) -> u64 {
  method into_symlinks_entry (line 76) | fn into_symlinks_entry(self, symlink_info: SymlinkInfo) -> SymlinksFileE...
  type InvalidSymlinks (line 87) | pub struct InvalidSymlinks {
    method get_invalid_symlinks (line 100) | pub const fn get_invalid_symlinks(&self) -> &Vec<SymlinksFileEntry> {
    method get_information (line 104) | pub const fn get_information(&self) -> Info {
  method default (line 94) | fn default() -> Self {

FILE: czkawka_core/src/tools/invalid_symlinks/tests.rs
  function test_find_invalid_symlinks (line 20) | fn test_find_invalid_symlinks() {
  function test_no_invalid_symlinks (line 46) | fn test_no_invalid_symlinks() {
  function test_deleted_target_creates_invalid_symlink (line 69) | fn test_deleted_target_creates_invalid_symlink() {

FILE: czkawka_core/src/tools/invalid_symlinks/traits.rs
  method search (line 19) | fn search(&mut self, stop_flag: &Arc<AtomicBool>, progress_sender: Optio...
  method debug_print (line 45) | fn debug_print(&self) {
  method write_results (line 57) | fn write_results<T: Write>(&self, writer: &mut T) -> std::io::Result<()> {
  method save_results_to_file_as_json (line 80) | fn save_results_to_file_as_json(&self, file_name: &str, pretty_print: bo...
  type Info (line 86) | type Info = Info;
  type Parameters (line 87) | type Parameters = ();
  method get_information (line 89) | fn get_information(&self) -> Self::Info {
  method get_params (line 92) | fn get_params(&self) -> Self::Parameters {}
  method get_cd (line 93) | fn get_cd(&self) -> &CommonToolData {
  method get_cd_mut (line 96) | fn get_cd_mut(&mut self) -> &mut CommonToolData {
  method found_any_items (line 99) | fn found_any_items(&self) -> bool {
  method delete_files (line 105) | fn delete_files(&mut self, stop_flag: &Arc<AtomicBool>, progress_sender:...

FILE: czkawka_core/src/tools/same_music/core.rs
  method new (line 36) | pub fn new(params: SameMusicParameters) -> Self {
  method check_files (line 50) | pub(crate) fn check_files(&mut self, stop_flag: &Arc<AtomicBool>, progre...
  method load_cache (line 77) | fn load_cache(&mut self, checking_tags: bool) -> (BTreeMap<String, Music...
  method save_cache (line 82) | fn save_cache(&mut self, vec_file_entry: &[MusicEntry], loaded_hash_map:...
  method calculate_fingerprint (line 87) | pub(crate) fn calculate_fingerprint(&mut self, stop_flag: &Arc<AtomicBoo...
  method read_tags (line 171) | pub(crate) fn read_tags(&mut self, stop_flag: &Arc<AtomicBool>, progress...
  method check_for_duplicate_tags (line 229) | pub(crate) fn check_for_duplicate_tags(&mut self, stop_flag: &Arc<Atomic...
  method split_fingerprints_to_base_and_files_to_compare (line 339) | fn split_fingerprints_to_base_and_files_to_compare(&self, music_data: Ve...
  method get_entries_grouped_by_title (line 347) | fn get_entries_grouped_by_title(music_data: Vec<MusicEntry>) -> BTreeMap...
  method split_fingerprints_to_check (line 360) | fn split_fingerprints_to_check(&mut self) -> Vec<GroupedFilesToCheck> {
  method compare_fingerprints (line 391) | fn compare_fingerprints(
  method check_for_duplicate_fingerprints (line 455) | pub(crate) fn check_for_duplicate_fingerprints(&mut self, stop_flag: &Ar...
  method check_music_item (line 502) | fn check_music_item(
  function calc_fingerprint_helper (line 535) | fn calc_fingerprint_helper<P: AsRef<Path>>(path: P, config: &Configurati...
  function read_single_file_tags (line 615) | fn read_single_file_tags(path: &str, mut music_entry: MusicEntry) -> Opt...
  function format_audio_duration (line 685) | pub fn format_audio_duration(duration: u32) -> String {
  function get_simplified_name_internal (line 696) | fn get_simplified_name_internal(what: &str, ignore_numbers: bool) -> Str...
  function get_simplified_name (line 748) | fn get_simplified_name(what: &str) -> String {
  function get_similar_music_cache_file (line 766) | pub fn get_similar_music_cache_file(checking_tags: bool) -> String {
  function test_simplified_names (line 778) | fn test_simplified_names() {

FILE: czkawka_core/src/tools/same_music/mod.rs
  type MusicEntry (line 34) | pub struct MusicEntry {
  method get_path (line 50) | fn get_path(&self) -> &Path {
  method get_modified_date (line 53) | fn get_modified_date(&self) -> u64 {
  method get_size (line 56) | fn get_size(&self) -> u64 {
  method into_music_entry (line 62) | fn into_music_entry(self) -> MusicEntry {
  type GroupedFilesToCheck (line 79) | struct GroupedFilesToCheck {
  type Info (line 85) | pub struct Info {
  type SameMusicParameters (line 92) | pub struct SameMusicParameters {
    method new (line 102) | pub fn new(
  type SameMusic (line 123) | pub struct SameMusic {
    method get_duplicated_music_entries (line 135) | pub const fn get_duplicated_music_entries(&self) -> &Vec<Vec<MusicEntr...
    method get_params (line 139) | pub fn get_params(&self) -> &SameMusicParameters {
    method get_information (line 143) | pub const fn get_information(&self) -> Info {
    method get_similar_music_referenced (line 147) | pub fn get_similar_music_referenced(&self) -> &Vec<(MusicEntry, Vec<Mu...
    method get_number_of_base_duplicated_files (line 151) | pub fn get_number_of_base_duplicated_files(&self) -> usize {
    method get_use_reference (line 159) | pub fn get_use_reference(&self) -> bool {

FILE: czkawka_core/src/tools/same_music/tests.rs
  function get_test_resources_path (line 10) | fn get_test_resources_path() -> PathBuf {
  function test_same_music_by_content_high_similarity (line 19) | fn test_same_music_by_content_high_similarity() {
  function test_same_music_by_content_medium_similarity (line 42) | fn test_same_music_by_content_medium_similarity() {
  function test_same_music_by_content_low_similarity (line 65) | fn test_same_music_by_content_low_similarity() {
  function test_same_music_by_tags_title_artist (line 88) | fn test_same_music_by_tags_title_artist() {
  function test_same_music_by_tags_year (line 118) | fn test_same_music_by_tags_year() {
  function test_same_music_by_tags_genre (line 140) | fn test_same_music_by_tags_genre() {
  function test_same_music_by_tags_bitrate (line 163) | fn test_same_music_by_tags_bitrate() {
  function test_same_music_by_tags_all_criteria (line 186) | fn test_same_music_by_tags_all_criteria() {
  function test_same_music_approximate_comparison (line 215) | fn test_same_music_approximate_comparison() {
  function test_same_music_empty_directory (line 245) | fn test_same_music_empty_directory() {

FILE: czkawka_core/src/tools/same_music/traits.rs
  method search (line 22) | fn search(&mut self, stop_flag: &Arc<AtomicBool>, progress_sender: Optio...
  method debug_print (line 81) | fn debug_print(&self) {
  method write_results (line 94) | fn write_results<T: Write>(&self, writer: &mut T) -> std::io::Result<()> {
  method save_results_to_file_as_json (line 124) | fn save_results_to_file_as_json(&self, file_name: &str, pretty_print: bo...
  function write_music_entry (line 133) | fn write_music_entry<T: Write>(writer: &mut T, file_entry: &MusicEntry) ...
  type Info (line 148) | type Info = Info;
  type Parameters (line 149) | type Parameters = SameMusicParameters;
  method get_information (line 151) | fn get_information(&self) -> Self::Info {
  method get_params (line 154) | fn get_params(&self) -> Self::Parameters {
  method get_cd (line 157) | fn get_cd(&self) -> &CommonToolData {
  method get_cd_mut (line 160) | fn get_cd_mut(&mut self) -> &mut CommonToolData {
  method get_check_method (line 163) | fn get_check_method(&self) -> CheckingMethod {
  method found_any_items (line 166) | fn found_any_items(&self) -> bool {
  method delete_files (line 173) | fn delete_files(&mut self, stop_flag: &Arc<AtomicBool>, progress_sender:...

FILE: czkawka_core/src/tools/similar_images/core.rs
  method new (line 28) | pub fn new(params: SimilarImagesParameters) -> Self {
  method check_for_similar_images (line 42) | pub(crate) fn check_for_similar_images(&mut self, stop_flag: &Arc<Atomic...
  method hash_images_load_cache (line 76) | fn hash_images_load_cache(&mut self) -> (BTreeMap<String, ImagesEntry>, ...
  method save_to_cache (line 85) | fn save_to_cache(&mut self, vec_file_entry: &[ImagesEntry], loaded_hash_...
  method hash_images (line 95) | pub(crate) fn hash_images(&mut self, stop_flag: &Arc<AtomicBool>, progre...
  method collect_image_file_entry (line 155) | fn collect_image_file_entry(&self, mut file_entry: ImagesEntry) -> Resul...
  method split_hashes (line 176) | fn split_hashes(&mut self, all_hashed_images: &IndexMap<ImHash, Vec<Imag...
  method collect_hash_compare_result (line 218) | fn collect_hash_compare_result(
  method compare_hashes_with_non_zero_tolerance (line 248) | fn compare_hashes_with_non_zero_tolerance(
  method connect_results_simplified (line 327) | fn connect_results_simplified<'a>(
  method find_similar_hashes (line 410) | pub(crate) fn find_similar_hashes(&mut self, stop_flag: &Arc<AtomicBool>...
  method exclude_items_with_same_size (line 464) | fn exclude_items_with_same_size(&mut self) {
  method remove_multiple_records_from_reference_folders (line 482) | fn remove_multiple_records_from_reference_folders(&mut self) {
  method verify_duplicated_items (line 502) | pub(crate) fn verify_duplicated_items(collected_similar_images: &IndexMa...
  function is_in_reference_folder (line 535) | fn is_in_reference_folder(reference_directories: &[PathBuf], path: &Path...
  function get_string_from_similarity (line 540) | pub fn get_string_from_similarity(similarity: u32, hash_size: u8) -> Str...
  function return_similarity_from_similarity_preset (line 569) | pub fn return_similarity_from_similarity_preset(similarity_preset: Simil...
  function convert_filters_to_string (line 589) | pub(crate) fn convert_filters_to_string(image_filter: FilterType) -> Str...
  function convert_algorithm_to_string (line 600) | pub(crate) fn convert_algorithm_to_string(hash_alg: HashAlg) -> String {
  function debug_check_for_duplicated_things (line 620) | fn debug_check_for_duplicated_things(
  function get_similar_images_cache_file (line 676) | pub fn get_similar_images_cache_file(hash_size: u8, hash_alg: HashAlg, i...
  function get_default_parameters (line 697) | fn get_default_parameters() -> SimilarImagesParameters {
  function test_compare_no_images (line 736) | fn test_compare_no_images() {
  function test_compare_tolerance_0_normal_mode (line 746) | fn test_compare_tolerance_0_normal_mode() {
  function test_simple_normal_one_group (line 776) | fn test_simple_normal_one_group() {
  function test_2000_hashes (line 793) | fn test_2000_hashes() {
  function test_simple_normal_one_group_extended (line 812) | fn test_simple_normal_one_group_extended() {
  function test_simple_normal_one_group_extended2 (line 832) | fn test_simple_normal_one_group_extended2() {
  function test_simple_referenced_same_group (line 852) | fn test_simple_referenced_same_group() {
  function test_simple_referenced_group_extended (line 872) | fn test_simple_referenced_group_extended() {
  function test_simple_referenced_group_extended2 (line 893) | fn test_simple_referenced_group_extended2() {
  function test_simple_normal_too_small_similarity (line 918) | fn test_simple_normal_too_small_similarity() {
  function test_simple_normal_union_of_similarity (line 938) | fn test_simple_normal_union_of_similarity() {
  function test_reference_similarity_only_one (line 967) | fn test_reference_similarity_only_one() {
  function test_reference_too_small_similarity (line 991) | fn test_reference_too_small_similarity() {
  function test_reference_minimal (line 1012) | fn test_reference_minimal() {
  function test_reference_same (line 1046) | fn test_reference_same() {
  function test_reference_union (line 1068) | fn test_reference_union() {
  function test_tolerance (line 1094) | fn test_tolerance() {
  function add_hashes (line 1121) | fn add_hashes(hashmap: &mut IndexMap<ImHash, Vec<ImagesEntry>>, file_ent...
  function create_random_file_entry (line 1127) | fn create_random_file_entry(hash: Vec<u8>, name: &str) -> ImagesEntry {
  function test_connect_results_real_case (line 1148) | fn test_connect_results_real_case() {

FILE: czkawka_core/src/tools/similar_images/mod.rs
  type ImHash (line 23) | type ImHash = Vec<u8>;
  constant SIMILAR_VALUES (line 26) | pub const SIMILAR_VALUES: [[u32; 6]; 4] = [
  type ImagesEntry (line 34) | pub struct ImagesEntry {
  method get_path (line 45) | fn get_path(&self) -> &Path {
  method get_modified_date (line 48) | fn get_modified_date(&self) -> u64 {
  method get_size (line 51) | fn get_size(&self) -> u64 {
  method into_images_entry (line 56) | fn into_images_entry(self) -> ImagesEntry {
  type SimilarityPreset (line 71) | pub enum SimilarityPreset {
  type Hamming (line 82) | struct Hamming;
    method distance (line 85) | fn distance(&self, a: &ImHash, b: &ImHash) -> u32 {
    method threshold_distance (line 89) | fn threshold_distance(&self, a: &ImHash, b: &ImHash, _threshold: u32) ...
  type SimilarImagesParameters (line 95) | pub struct SimilarImagesParameters {
    method new (line 104) | pub fn new(max_difference: u32, hash_size: u8, hash_alg: HashAlg, imag...
  type SimilarImages (line 116) | pub struct SimilarImages {
    method get_params (line 137) | pub fn get_params(&self) -> &SimilarImagesParameters {
    method get_similar_images (line 141) | pub const fn get_similar_images(&self) -> &Vec<Vec<ImagesEntry>> {
    method get_similar_images_referenced (line 145) | pub fn get_similar_images_referenced(&self) -> &Vec<(ImagesEntry, Vec<...
    method get_use_reference (line 149) | pub fn get_use_reference(&self) -> bool {
    method get_information (line 153) | pub const fn get_information(&self) -> Info {
  type Info (line 129) | pub struct Info {

FILE: czkawka_core/src/tools/similar_images/tests.rs
  function get_test_resources_path (line 11) | fn get_test_resources_path() -> PathBuf {
  function test_similar_images (line 20) | fn test_similar_images() {
  function test_similar_images_exclude_same_size (line 69) | fn test_similar_images_exclude_same_size() {
  function test_similar_images_empty_directory (line 96) | fn test_similar_images_empty_directory() {

FILE: czkawka_core/src/tools/similar_images/traits.rs
  method search (line 22) | fn search(&mut self, stop_flag: &Arc<AtomicBool>, progress_sender: Optio...
  method debug_print (line 63) | fn debug_print(&self) {
  method write_results (line 75) | fn write_results<T: Write>(&self, writer: &mut T) -> std::io::Result<()> {
  method save_results_to_file_as_json (line 130) | fn save_results_to_file_as_json(&self, file_name: &str, pretty_print: bo...
  type Info (line 139) | type Info = Info;
  type Parameters (line 140) | type Parameters = SimilarImagesParameters;
  method get_information (line 142) | fn get_information(&self) -> Self::Info {
  method get_params (line 145) | fn get_params(&self) -> Self::Parameters {
  method get_cd (line 148) | fn get_cd(&self) -> &CommonToolData {
  method get_cd_mut (line 151) | fn get_cd_mut(&mut self) -> &mut CommonToolData {
  method found_any_items (line 154) | fn found_any_items(&self) -> bool {
  method delete_files (line 161) | fn delete_files(&mut self, stop_flag: &Arc<AtomicBool>, progress_sender:...

FILE: czkawka_core/src/tools/similar_videos/core.rs
  method new (line 25) | pub fn new(params: SimilarVideosParameters) -> Self {
  method check_for_similar_videos (line 38) | pub(crate) fn check_for_similar_videos(&mut self, stop_flag: &Arc<Atomic...
  method check_video_file_entry (line 63) | fn check_video_file_entry(&self, mut file_entry: VideosEntry) -> VideosE...
  method read_video_properties (line 83) | fn read_video_properties(mut file_entry: VideosEntry) -> VideosEntry {
  method sort_videos (line 103) | pub(crate) fn sort_videos(&mut self, stop_flag: &Arc<AtomicBool>, progre...
  method create_thumbnails (line 191) | fn create_thumbnails(&mut self, progress_sender: Option<&Sender<Progress...
  method save_cache (line 261) | fn save_cache(&mut self, vec_file_entry: &[VideosEntry], loaded_hash_map...
  method load_cache_at_start (line 271) | fn load_cache_at_start(&mut self) -> (BTreeMap<String, VideosEntry>, BTr...
  method match_groups_of_videos (line 280) | fn match_groups_of_videos(&mut self, vector_of_hashes: Vec<VideoHash>, h...
  method remove_from_reference_folders (line 310) | fn remove_from_reference_folders(&mut self) {
  function get_similar_videos_cache_file (line 329) | pub fn get_similar_videos_cache_file(skip_forward_amount: u32, duration:...
  function format_bitrate_opt (line 337) | pub fn format_bitrate_opt(bitrate: Option<u64>) -> String {
  function format_duration_opt (line 352) | pub fn format_duration_opt(duration: Option<f64>) -> String {

FILE: czkawka_core/src/tools/similar_videos/mod.rs
  constant MAX_TOLERANCE (line 19) | pub const MAX_TOLERANCE: i32 = 20;
  constant DEFAULT_CROP_DETECT (line 21) | pub const DEFAULT_CROP_DETECT: Cropdetect = Cropdetect::Letterbox;
  constant ALLOWED_SKIP_FORWARD_AMOUNT (line 23) | pub const ALLOWED_SKIP_FORWARD_AMOUNT: RangeInclusive<u32> = 0..=300;
  constant DEFAULT_SKIP_FORWARD_AMOUNT (line 24) | pub const DEFAULT_SKIP_FORWARD_AMOUNT: u32 = 15;
  constant ALLOWED_VID_HASH_DURATION (line 26) | pub const ALLOWED_VID_HASH_DURATION: RangeInclusive<u32> = 2..=60;
  constant DEFAULT_VID_HASH_DURATION (line 27) | pub const DEFAULT_VID_HASH_DURATION: u32 = 10;
  constant DEFAULT_VIDEO_PERCENTAGE_FOR_THUMBNAIL (line 29) | pub const DEFAULT_VIDEO_PERCENTAGE_FOR_THUMBNAIL: u8 = 10;
  type VideosEntry (line 32) | pub struct VideosEntry {
  method get_path (line 52) | fn get_path(&self) -> &Path {
  method get_modified_date (line 55) | fn get_modified_date(&self) -> u64 {
  method get_size (line 58) | fn get_size(&self) -> u64 {
  method into_videos_entry (line 64) | fn into_videos_entry(self) -> VideosEntry {
  type SimilarVideosParameters (line 84) | pub struct SimilarVideosParameters {
    method new (line 106) | pub fn new(
  function crop_detect_from_str_opt (line 96) | pub fn crop_detect_from_str_opt(s: &str) -> Option<Cropdetect> {
  type SimilarVideos (line 134) | pub struct SimilarVideos {
    method get_params (line 152) | pub fn get_params(&self) -> &SimilarVideosParameters {
    method get_similar_videos (line 156) | pub const fn get_similar_videos(&self) -> &Vec<Vec<VideosEntry>> {
    method get_information (line 160) | pub const fn get_information(&self) -> Info {
    method get_similar_videos_referenced (line 164) | pub fn get_similar_videos_referenced(&self) -> &Vec<(VideosEntry, Vec<...
    method get_number_of_base_duplicated_files (line 168) | pub fn get_number_of_base_duplicated_files(&self) -> usize {
    method get_use_reference (line 176) | pub fn get_use_reference(&self) -> bool {
  type Info (line 145) | pub struct Info {

FILE: czkawka_core/src/tools/similar_videos/tests.rs
  function test_similar_videos_empty_directory (line 15) | fn test_similar_videos_empty_directory() {

FILE: czkawka_core/src/tools/similar_videos/traits.rs
  method search (line 24) | fn search(&mut self, stop_flag: &Arc<AtomicBool>, progress_sender: Optio...
  method delete_files (line 62) | fn delete_files(&mut self, stop_flag: &Arc<AtomicBool>, progress_sender:...
  method debug_print (line 73) | fn debug_print(&self) {
  method write_results (line 85) | fn write_results<T: Write>(&self, writer: &mut T) -> std::io::Result<()> {
  method save_results_to_file_as_json (line 149) | fn save_results_to_file_as_json(&self, file_name: &str, pretty_print: bo...
  type Info (line 159) | type Info = Info;
  type Parameters (line 160) | type Parameters = SimilarVideosParameters;
  method get_information (line 162) | fn get_information(&self) -> Self::Info {
  method get_params (line 165) | fn get_params(&self) -> Self::Parameters {
  method get_cd (line 168) | fn get_cd(&self) -> &CommonToolData {
  method get_cd_mut (line 171) | fn get_cd_mut(&mut self) -> &mut CommonToolData {
  method found_any_items (line 174) | fn found_any_items(&self) -> bool {

FILE: czkawka_core/src/tools/temporary/core.rs
  method new (line 20) | pub fn new() -> Self {
  method check_files (line 29) | pub(crate) fn check_files(&mut self, stop_flag: &Arc<AtomicBool>, progre...
  method get_file_entry (line 98) | pub(crate) fn get_file_entry(&self, items_counter: &Arc<AtomicUsize>, en...
  function check_folder_children (line 126) | pub(crate) fn check_folder_children(

FILE: czkawka_core/src/tools/temporary/mod.rs
  constant TEMP_EXTENSIONS (line 12) | const TEMP_EXTENSIONS: &[&str] = &[
  type TemporaryFileEntry (line 29) | pub struct TemporaryFileEntry {
  method get_path (line 36) | fn get_path(&self) -> &Path {
  method get_modified_date (line 39) | fn get_modified_date(&self) -> u64 {
  method get_size (line 42) | fn get_size(&self) -> u64 {
  type Info (line 48) | pub struct Info {
  type Temporary (line 53) | pub struct Temporary {
    method get_temporary_files (line 66) | pub const fn get_temporary_files(&self) -> &Vec<TemporaryFileEntry> {
    method get_information (line 70) | pub const fn get_information(&self) -> Info {
  method default (line 60) | fn default() -> Self {

FILE: czkawka_core/src/tools/temporary/traits.rs
  method search (line 19) | fn search(&mut self, stop_flag: &Arc<AtomicBool>, progress_sender: Optio...
  method delete_files (line 45) | fn delete_files(&mut self, stop_flag: &Arc<AtomicBool>, progress_sender:...
  method write_results (line 55) | fn write_results<T: Write>(&self, writer: &mut T) -> std::io::Result<()> {
  method save_results_to_file_as_json (line 66) | fn save_results_to_file_as_json(&self, file_name: &str, pretty_print: bo...
  type Info (line 72) | type Info = Info;
  type Parameters (line 73) | type Parameters = ();
  method get_information (line 75) | fn get_information(&self) -> Self::Info {
  method get_params (line 78) | fn get_params(&self) -> Self::Parameters {}
  method get_cd (line 79) | fn get_cd(&self) -> &CommonToolData {
  method get_cd_mut (line 82) | fn get_cd_mut(&mut self) -> &mut CommonToolData {
  method found_any_items (line 85) | fn found_any_items(&self) -> bool {
  method debug_print (line 92) | fn debug_print(&self) {

FILE: czkawka_core/src/tools/video_optimizer/core.rs
  method new (line 34) | pub fn new(params: VideoOptimizerParameters) -> Self {
  method scan_files (line 47) | pub(crate) fn scan_files(&mut self, stop_flag: &Arc<AtomicBool>, progres...
  method check_files (line 86) | pub(crate) fn check_files(&mut self, stop_flag: &Arc<AtomicBool>, progre...
  method process_video_transcode (line 94) | fn process_video_transcode(&mut self, stop_flag: &Arc<AtomicBool>, progr...
  method process_video_crop (line 144) | fn process_video_crop(&mut self, stop_flag: &Arc<AtomicBool>, progress_s...
  method create_transcode_thumbnails (line 201) | fn create_transcode_thumbnails(&mut self, progress_sender: Option<&Sende...
  method create_crop_thumbnails (line 274) | fn create_crop_thumbnails(&mut self, progress_sender: Option<&Sender<Pro...
  method load_video_transcode_cache (line 349) | fn load_video_transcode_cache(
  method load_video_crop_cache (line 360) | fn load_video_crop_cache(&mut self, params: &VideoCropParams) -> (BTreeM...
  method save_video_transcode_cache (line 365) | fn save_video_transcode_cache(&mut self, vec_file_entry: &[VideoTranscod...
  method save_video_crop_cache (line 370) | fn save_video_crop_cache(&mut self, vec_file_entry: &[VideoCropEntry], p...
  method fix_files (line 375) | pub(crate) fn fix_files(&mut self, stop_flag: &Arc<AtomicBool>, _progres...
  function get_video_transcode_cache_file (line 436) | pub fn get_video_transcode_cache_file() -> String {
  function get_video_crop_cache_file (line 440) | pub fn get_video_crop_cache_file(params: &VideoCropParams) -> String {

FILE: czkawka_core/src/tools/video_optimizer/core/video_converter.rs
  function check_video (line 14) | pub fn check_video(mut entry: VideoTranscodeEntry) -> VideoTranscodeEntry {
  function process_video (line 49) | pub fn process_video(stop_flag: &Arc<AtomicBool>, video_path: &str, orig...

FILE: czkawka_core/src/tools/video_optimizer/core/video_cropper.rs
  constant MIN_SAMPLES (line 15) | const MIN_SAMPLES: usize = 3;
  constant MIN_SAMPLE_INTERVAL (line 16) | const MIN_SAMPLE_INTERVAL: f32 = 0.1;
  type Rectangle (line 19) | struct Rectangle {
    method new (line 27) | fn new(top: u32, bottom: u32, left: u32, right: u32) -> Self {
    method union (line 33) | fn union(&self, other: &Self) -> Self {
    method validate (line 44) | fn validate(&self) {
    method validate_image_size (line 54) | fn validate_image_size(&self, width: u32, height: u32) {
    method is_cropping_needed (line 65) | fn is_cropping_needed(&self, width: u32, height: u32, min_crop_size: u...
  function is_pixel_black (line 72) | fn is_pixel_black(img: &image::RgbImage, x: u32, y: u32, black_pixel_thr...
  type BlackBarResult (line 78) | enum BlackBarResult {
  function detect_black_bars (line 84) | fn detect_black_bars(rgb_img: &RgbImage, params: &VideoCropParams) -> Bl...
  function analyze_black_bars (line 140) | fn analyze_black_bars<F>(
  function diff_between_dynamic_images (line 219) | fn diff_between_dynamic_images(img_original: &RgbImage, mut consumed_tem...
  function analyze_static_image_parts (line 237) | fn analyze_static_image_parts<F>(
  function extract_video_metadata_for_crop (line 312) | fn extract_video_metadata_for_crop(entry: &mut VideoCropEntry) -> Result...
  function check_video_crop (line 352) | pub fn check_video_crop(mut entry: VideoCropEntry, params: &VideoCropPar...
  function fix_video_crop (line 417) | pub fn fix_video_crop(video_path: &Path, params: &VideoCropSingleFixPara...
  function default_test_params (line 514) | fn default_test_params() -> VideoCropParams {
  function create_colored_frame (line 528) | fn create_colored_frame(width: u32, height: u32, r: u8, g: u8, b: u8) ->...
  function create_frame_with_black_bars (line 536) | fn create_frame_with_black_bars(width: u32, height: u32, bar_size: u32) ...
  function test_is_pixel_black (line 549) | fn test_is_pixel_black() {
  function test_detect_black_bars_no_bars (line 566) | fn test_detect_black_bars_no_bars() {
  function test_detect_black_bars_with_bars (line 574) | fn test_detect_black_bars_with_bars() {
  function test_detect_black_bars_small_bars (line 589) | fn test_detect_black_bars_small_bars() {
  function test_rectangle_union (line 597) | fn test_rectangle_union() {
  function test_rectangle_is_cropping_needed (line 609) | fn test_rectangle_is_cropping_needed() {
  function test_analyze_black_bars_consistent_bars (line 626) | fn test_analyze_black_bars_consistent_bars() {
  function test_analyze_black_bars_no_bars (line 645) | fn test_analyze_black_bars_no_bars() {
  function test_analyze_black_bars_inconsistent_bars (line 664) | fn test_analyze_black_bars_inconsistent_bars() {
  function test_analyze_black_bars_variable_rectangles (line 689) | fn test_analyze_black_bars_variable_rectangles() {
  function test_detect_black_bars_fuzzer (line 720) | fn test_detect_black_bars_fuzzer() {

FILE: czkawka_core/src/tools/video_optimizer/mod.rs
  type VideoCodec (line 18) | pub enum VideoCodec {
    method as_str (line 26) | pub const fn as_str(&self) -> &str {
    method as_ffprobe_codec_name (line 35) | pub const fn as_ffprobe_codec_name(self) -> &'static str {
    type Err (line 46) | type Err = String;
    method from_str (line 48) | fn from_str(codec: &str) -> Result<Self, Self::Err> {
  type VideoCroppingMechanism (line 60) | pub enum VideoCroppingMechanism {
  type VideoOptimizerMode (line 65) | pub enum VideoOptimizerMode {
    type Err (line 71) | type Err = String;
    method from_str (line 73) | fn from_str(s: &str) -> Result<Self, Self::Err> {
  type VideoOptimizerFixParams (line 83) | pub enum VideoOptimizerFixParams {
  type VideoTranscodeFixParams (line 89) | pub struct VideoTranscodeFixParams {
  type VideoCropSingleFixParams (line 100) | pub struct VideoCropSingleFixParams {
  type VideoCropFixParams (line 109) | pub struct VideoCropFixParams {
  type Info (line 117) | pub struct Info {
  type VideoOptimizerParameters (line 124) | pub enum VideoOptimizerParameters {
    method get_generate_number_of_items_in_thumbnail_grid (line 130) | pub fn get_generate_number_of_items_in_thumbnail_grid(&self) -> u8 {
  type VideoTranscodeParams (line 141) | pub struct VideoTranscodeParams {
    method new (line 162) | pub fn new(
  type VideoCropParams (line 149) | pub struct VideoCropParams {
    method with_custom_params (line 191) | pub fn with_custom_params(
  method default (line 179) | fn default() -> Self {
  type VideoTranscodeEntry (line 225) | pub struct VideoTranscodeEntry {
  type VideoCropEntry (line 241) | pub struct VideoCropEntry {
  method get_path (line 258) | fn get_path(&self) -> &Path {
  method get_modified_date (line 261) | fn get_modified_date(&self) -> u64 {
  method get_size (line 264) | fn get_size(&self) -> u64 {
  method get_path (line 270) | fn get_path(&self) -> &Path {
  method get_modified_date (line 273) | fn get_modified_date(&self) -> u64 {
  method get_size (line 276) | fn get_size(&self) -> u64 {
  method into_video_transcode_entry (line 282) | fn into_video_transcode_entry(self) -> VideoTranscodeEntry {
  method into_video_crop_entry (line 296) | fn into_video_crop_entry(self) -> VideoCropEntry {
  type VideoOptimizerEntry (line 312) | pub enum VideoOptimizerEntry {
  type VideoOptimizer (line 317) | pub struct VideoOptimizer {
    method get_video_transcode_entries (line 328) | pub const fn get_video_transcode_entries(&self) -> &Vec<VideoTranscode...
    method get_video_crop_entries (line 332) | pub const fn get_video_crop_entries(&self) -> &Vec<VideoCropEntry> {
    method get_params (line 336) | pub const fn get_params(&self) -> &VideoOptimizerParameters {
    method get_information (line 340) | pub const fn get_information(&self) -> Info {

FILE: czkawka_core/src/tools/video_optimizer/traits.rs
  method delete_files (line 23) | fn delete_files(&mut self, _stop_flag: &Arc<AtomicBool>, _progress_sende...
  type FixParams (line 29) | type FixParams = VideoOptimizerFixParams;
  method fix_items (line 31) | fn fix_items(&mut self, stop_flag: &Arc<AtomicBool>, progress_sender: Op...
  method debug_print (line 38) | fn debug_print(&self) {
  method write_results (line 54) | fn write_results<T: Write>(&self, writer: &mut T) -> std::io::Result<()> {
  method save_results_to_file_as_json (line 117) | fn save_results_to_file_as_json(&self, file_name: &str, pretty_print: bo...
  method search (line 127) | fn search(&mut self, stop_flag: &Arc<AtomicBool>, progress_sender: Optio...
  type Info (line 159) | type Info = Info;
  type Parameters (line 160) | type Parameters = VideoOptimizerParameters;
  method get_information (line 162) | fn get_information(&self) -> Self::Info {
  method get_params (line 166) | fn get_params(&self) -> Self::Parameters {
  method get_cd (line 170) | fn get_cd(&self) -> &CommonToolData {
  method get_cd_mut (line 174) | fn get_cd_mut(&mut self) -> &mut CommonToolData {
  method found_any_items (line 178) | fn found_any_items(&self) -> bool {

FILE: czkawka_gui/src/compute_results.rs
  function handle_stopped_search (line 50) | fn handle_stopped_search<T: CommonData>(tool: &T, entry_info: &Entry) ->...
  function finalize_compute (line 60) | fn finalize_compute<T: Into<SharedModelEnum>>(subview: &SubView, tool: T...
  function conditional_sort_vector (line 65) | fn conditional_sort_vector<T>(vector: &[T]) -> Vec<T>
  function format_size_and_date (line 78) | fn format_size_and_date(size: u64, modified_date: u64, is_header: bool, ...
  function get_row_color (line 86) | fn get_row_color(is_header: bool) -> &'static str {
  function connect_compute_results (line 90) | pub(crate) fn connect_compute_results(gui_data: &GuiData, result_receive...
  function compute_bad_extensions (line 159) | fn compute_bad_extensions(be: BadExtensions, entry_info: &Entry, text_vi...
  function compute_broken_files (line 196) | fn compute_broken_files(br: BrokenFiles, entry_info: &Entry, text_view_e...
  function compute_invalid_symlinks (line 232) | fn compute_invalid_symlinks(ifs: InvalidSymlinks, entry_info: &Entry, te...
  function compute_same_music (line 269) | fn compute_same_music(mf: SameMusic, entry_info: &Entry, text_view_error...
  function compute_similar_videos (line 404) | fn compute_similar_videos(ff: SimilarVideos, entry_info: &Entry, text_vi...
  function compute_similar_images (line 509) | fn compute_similar_images(sf: SimilarImages, entry_info: &Entry, text_vi...
  function compute_temporary_files (line 605) | fn compute_temporary_files(tf: Temporary, entry_info: &Entry, text_view_...
  function compute_big_files (line 640) | fn compute_big_files(bf: BigFile, entry_info: &Entry, text_view_errors: ...
  function compute_empty_files (line 676) | fn compute_empty_files(vf: EmptyFiles, entry_info: &Entry, text_view_err...
  function compute_empty_folders (line 710) | fn compute_empty_folders(ef: EmptyFolder, entry_info: &Entry, text_view_...
  function compute_duplicate_finder (line 746) | fn compute_duplicate_finder(df: DuplicateFinder, entry_info: &Entry, tex...
  function vector_sort_unstable_entry_by_path (line 943) | fn vector_sort_unstable_entry_by_path<T>(vector: &[T]) -> Vec<T>
  function duplicates_add_to_list_store (line 956) | fn duplicates_add_to_list_store(list_store: &ListStore, file: &str, dire...
  function similar_images_add_to_list_store (line 977) | fn similar_images_add_to_list_store(
  function similar_videos_add_to_list_store (line 1012) | fn similar_videos_add_to_list_store(
  function same_music_add_to_list_store (line 1062) | fn same_music_add_to_list_store(
  function get_dt_timestamp_string (line 1106) | fn get_dt_timestamp_string(timestamp: u64) -> String {
  function set_specific_buttons_as_active (line 1112) | fn set_specific_buttons_as_active(buttons_array: &Rc<RefCell<HashMap<Not...

FILE: czkawka_gui/src/connect_things/connect_about_buttons.rs
  constant SPONSOR_SITE (line 6) | const SPONSOR_SITE: &str = "https://github.com/sponsors/qarmin";
  constant REPOSITORY_SITE (line 7) | const REPOSITORY_SITE: &str = "https://github.com/qarmin/czkawka";
  constant INSTRUCTION_SITE (line 8) | const INSTRUCTION_SITE: &str = "https://github.com/qarmin/czkawka/blob/m...
  constant TRANSLATION_SITE (line 9) | const TRANSLATION_SITE: &str = "https://crwd.in/czkawka";
  constant KROKIET_SITE (line 10) | const KROKIET_SITE: &str = "https://github.com/qarmin/czkawka/tree/maste...
  function connect_about_buttons (line 12) | pub(crate) fn connect_about_buttons(gui_data: &GuiData) {

FILE: czkawka_gui/src/connect_things/connect_button_compare.rs
  constant BIG_PREVIEW_SIZE (line 21) | const BIG_PREVIEW_SIZE: i32 = 1024;
  constant SMALL_PREVIEW_SIZE (line 22) | const SMALL_PREVIEW_SIZE: i32 = 130;
  function connect_button_compare (line 24) | pub(crate) fn connect_button_compare(gui_data: &GuiData) {
  function populate_groups_at_start (line 281) | fn populate_groups_at_start(
  function generate_cache_for_results (line 379) | fn generate_cache_for_results(vector_with_path: Vec<(String, String, Tre...
  function get_all_path (line 439) | fn get_all_path(model: &TreeModel, current_path: &TreePath, column_heade...
  function move_iter (line 480) | fn move_iter(model: &TreeModel, tree_path: &TreePath, column_header: i32...
  function populate_similar_scrolled_view (line 507) | fn populate_similar_scrolled_view(
  function update_bottom_buttons (line 601) | fn update_bottom_buttons(
  function get_current_group_and_iter_from_selection (line 623) | fn get_current_group_and_iter_from_selection(sv: &SubView) -> (u32, Tree...

FILE: czkawka_gui/src/connect_things/connect_button_delete.rs
  function connect_button_delete (line 17) | pub(crate) fn connect_button_delete(gui_data: &GuiData) {
  function delete_things (line 27) | pub async fn delete_things(gui_data: GuiData) {
  function check_if_can_delete_files (line 64) | pub async fn check_if_can_delete_files(
  function create_dialog_ask_for_deletion (line 89) | fn create_dialog_ask_for_deletion(window_main: &gtk4::Window, number_of_...
  function create_dialog_group_deletion (line 125) | fn create_dialog_group_deletion(window_main: &gtk4::Window) -> (Dialog, ...
  function check_if_deleting_all_files_in_group (line 150) | pub async fn check_if_deleting_all_files_in_group(sv: &SubView, window_m...
  function empty_folder_remover (line 204) | pub(crate) fn empty_folder_remover(sv: &SubView, check_button_settings_u...
  function basic_remove (line 208) | pub(crate) fn basic_remove(sv: &SubView, check_button_settings_use_trash...
  function tree_remove (line 212) | pub(crate) fn tree_remove(sv: &SubView, column_header: i32, check_button...
  function common_file_remove (line 218) | pub(crate) fn common_file_remove(sv: &SubView, check_button_settings_use...

FILE: czkawka_gui/src/connect_things/connect_button_hardlink.rs
  type TypeOfTool (line 14) | enum TypeOfTool {
  type SymHardlinkData (line 20) | struct SymHardlinkData {
  function connect_button_hardlink_symlink (line 25) | pub(crate) fn connect_button_hardlink_symlink(gui_data: &GuiData) {
  function sym_hard_link_things (line 49) | async fn sym_hard_link_things(gui_data: GuiData, hardlinking: TypeOfTool) {
  function hardlink_symlink (line 75) | fn hardlink_symlink(sv: &SubView, hardlinking: TypeOfTool, text_view_err...
  function create_dialog_non_group (line 198) | fn create_dialog_non_group(window_main: &gtk4::Window) -> Dialog {
  function check_if_changing_one_item_in_group_and_continue (line 223) | pub async fn check_if_changing_one_item_in_group_and_continue(sv: &SubVi...
  function check_if_anything_is_selected_async (line 266) | pub(crate) fn check_if_anything_is_selected_async(sv: &SubView) -> bool {
  function check_if_can_link_files (line 290) | pub async fn check_if_can_link_files(check_button_settings_confirm_link:...
  function create_dialog_ask_for_linking (line 310) | fn create_dialog_ask_for_linking(window_main: &gtk4::Window) -> (Dialog,...

FILE: czkawka_gui/src/connect_things/connect_button_move.rs
  function connect_button_move (line 16) | pub(crate) fn connect_button_move(gui_data: &GuiData) {
  function move_with_tree (line 59) | fn move_with_tree(sv: &SubView, destination_folder: &Path, entry_info: &...
  function move_with_list (line 92) | fn move_with_list(sv: &SubView, destination_folder: &Path, entry_info: &...
  function move_files_common (line 118) | fn move_files_common(

FILE: czkawka_gui/src/connect_things/connect_button_save.rs
  function connect_button_save (line 14) | pub(crate) fn connect_button_save(gui_data: &GuiData) {
  function post_save_things (line 42) | fn post_save_things(

FILE: czkawka_gui/src/connect_things/connect_button_search.rs
  function connect_button_search (line 42) | pub(crate) fn connect_button_search(gui_data: &GuiData, result_sender: S...
  type LoadedCommonItems (line 129) | struct LoadedCommonItems {
    method load_items (line 147) | fn load_items(gui_data: &GuiData) -> Self {
  function duplicate_search (line 224) | fn duplicate_search(
  function empty_files_search (line 280) | fn empty_files_search(
  function empty_dirs_search (line 304) | fn empty_dirs_search(
  function big_files_search (line 328) | fn big_files_search(
  function temporary_files_search (line 360) | fn temporary_files_search(
  function same_music_search (line 384) | fn same_music_search(
  function broken_files_search (line 483) | fn broken_files_search(
  function similar_image_search (line 560) | fn similar_image_search(
  function similar_video_search (line 610) | fn similar_video_search(
  function bad_symlinks_search (line 655) | fn bad_symlinks_search(
  function bad_extensions_search (line 679) | fn bad_extensions_search(
  function set_common_settings (line 704) | fn set_common_settings<T>(component: &mut T, loaded_commons: &LoadedComm...
  function clean_tree_view (line 724) | fn clean_tree_view(tree_view: &gtk4::TreeView) {

FILE: czkawka_gui/src/connect_things/connect_button_select.rs
  function connect_button_select (line 8) | pub(crate) fn connect_button_select(gui_data: &GuiData) {
  function show_required_popovers (line 18) | fn show_required_popovers(popovers_select: &GuiSelectPopovers, sv: &SubV...

FILE: czkawka_gui/src/connect_things/connect_button_sort.rs
  function connect_button_sort (line 8) | pub(crate) fn connect_button_sort(gui_data: &GuiData) {
  function show_required_popovers (line 17) | fn show_required_popovers(popovers_sort: &GuiSortPopovers, sv: &SubView) {

FILE: czkawka_gui/src/connect_things/connect_button_stop.rs
  function send_stop_message (line 10) | fn send_stop_message(stop_flag: &Arc<AtomicBool>) {
  function connect_button_stop (line 14) | pub(crate) fn connect_button_stop(gui_data: &GuiData) {

FILE: czkawka_gui/src/connect_things/connect_change_language.rs
  function connect_change_language (line 11) | pub(crate) fn connect_change_language(gui_data: &GuiData) {
  function change_language (line 21) | fn change_language(gui_data: &GuiData) {
  function load_system_language (line 38) | pub(crate) fn load_system_language(gui_data: &GuiData) {

FILE: czkawka_gui/src/connect_things/connect_duplicate_buttons.rs
  function connect_duplicate_combo_box (line 7) | pub(crate) fn connect_duplicate_combo_box(gui_data: &GuiData) {

FILE: czkawka_gui/src/connect_things/connect_header_buttons.rs
  function connect_button_about (line 5) | pub(crate) fn connect_button_about(gui_data: &GuiData) {

FILE: czkawka_gui/src/connect_things/connect_krokiet_info_dialog.rs
  function show_krokiet_info_dialog (line 6) | pub fn show_krokiet_info_dialog(window_main: &gtk4::Window) {

FILE: czkawka_gui/src/connect_things/connect_notebook_tabs.rs
  function connect_notebook_tabs (line 5) | pub(crate) fn connect_notebook_tabs(gui_data: &GuiData) {

FILE: czkawka_gui/src/connect_things/connect_popovers_select.rs
  function popover_select_all (line 18) | fn popover_select_all(popover: &gtk4::Popover, tree_view: &gtk4::TreeVie...
  function popover_unselect_all (line 44) | fn popover_unselect_all(popover: &gtk4::Popover, tree_view: &gtk4::TreeV...
  function popover_reverse (line 53) | fn popover_reverse(popover: &gtk4::Popover, tree_view: &gtk4::TreeView, ...
  function popover_all_except_longest_shortest_path (line 81) | fn popover_all_except_longest_shortest_path(
  function popover_all_except_oldest_newest (line 145) | fn popover_all_except_oldest_newest(
  function popover_one_oldest_newest (line 215) | fn popover_one_oldest_newest(
  function popover_custom_select_unselect (line 289) | fn popover_custom_select_unselect(
  function popover_all_except_biggest_smallest (line 568) | fn popover_all_except_biggest_smallest(
  function connect_popover_select (line 656) | pub(crate) fn connect_popover_select(gui_data: &GuiData) {

FILE: czkawka_gui/src/connect_things/connect_popovers_sort.rs
  function popover_sort_general_abs (line 9) | fn popover_sort_general_abs<T>(popover: &gtk4::Popover, sv: &SubView)
  function popover_sort_general (line 21) | fn popover_sort_general<T>(popover: &gtk4::Popover, tree_view: &gtk4::Tr...
  function sort_iters (line 64) | fn sort_iters<T>(model: &ListStore, mut iters: Vec<TreeIter>, column_sor...
  function connect_popover_sort (line 84) | pub(crate) fn connect_popover_sort(gui_data: &GuiData) {
  function test_sort_iters (line 128) | fn test_sort_iters() {
  function test_popover_sort_general_simple (line 158) | pub(crate) fn test_popover_sort_general_simple() {
  function test_popover_sort_general (line 181) | pub(crate) fn test_popover_sort_general() {
  function fuzzer_test (line 214) | pub(crate) fn fuzzer_test() {

FILE: czkawka_gui/src/connect_things/connect_progress_window.rs
  function connect_progress_window (line 20) | pub(crate) fn connect_progress_window(gui_data: &GuiData, progress_recei...
  function progress_save_load_cache (line 49) | fn progress_save_load_cache(gui_data: &GuiData, item: &ProgressData) {
  function progress_collect_items (line 85) | fn progress_collect_items(gui_data: &GuiData, item: &ProgressData, files...
  function progress_default (line 113) | fn progress_default(gui_data: &GuiData, item: &ProgressData) {
  function common_set_data (line 164) | fn common_set_data(item: &ProgressData, progress_bar_all_stages: &Progre...
  function file_number_tm (line 190) | fn file_number_tm(item: &ProgressData) -> HashMap<&'static str, String> {
  function progress_ratio_tm (line 194) | fn progress_ratio_tm(item: &ProgressData) -> HashMap<&'static str, Strin...

FILE: czkawka_gui/src/connect_things/connect_same_music_mode_changed.rs
  constant MINIMUM_SECONDS (line 9) | const MINIMUM_SECONDS: f64 = 0.5;
  constant MAXIMUM_SECONDS (line 10) | const MAXIMUM_SECONDS: f64 = 180.0;
  constant DEFAULT_SECONDS (line 11) | const DEFAULT_SECONDS: f64 = 15.0;
  constant MINIMUM_SIMILARITY (line 12) | const MINIMUM_SIMILARITY: f64 = 0.0;
  constant MAXIMUM_SIMILARITY (line 13) | const MAXIMUM_SIMILARITY: f64 = 10.0;
  constant DEFAULT_SIMILARITY (line 14) | const DEFAULT_SIMILARITY: f64 = 5.0;
  function connect_same_music_change_mode (line 16) | pub(crate) fn connect_same_music_change_mode(gui_data: &GuiData) {
  function disable_enable_buttons (line 67) | fn disable_enable_buttons(buttons: &[CheckButton; 7], reverse_buttons: &...

FILE: czkawka_gui/src/connect_things/connect_selection_of_directories.rs
  function connect_selection_of_directories (line 19) | pub(crate) fn connect_selection_of_directories(gui_data: &GuiData) {
  function remove_item_directory (line 95) | fn remove_item_directory(tree_view: &TreeView) {
  function configure_directory_drop (line 106) | fn configure_directory_drop(tree_view: &TreeView, excluded_items: bool) {
  function connect_file_dialog (line 132) | fn connect_file_dialog(file_dialog_include_exclude_folder_selection: &Fi...
  function add_directories (line 155) | fn add_directories(tree_view: &TreeView, folders: &Vec<PathBuf>, exclude...
  function add_manually_directories (line 174) | fn add_manually_directories(window_main: &Window, tree_view: &TreeView, ...
  function remove_ending_slashes (line 224) | fn remove_ending_slashes(original_string: &mut String) {
  function test_remove_ending_slashes (line 242) | pub(crate) fn test_remove_ending_slashes() {

FILE: czkawka_gui/src/connect_things/connect_settings.rs
  function connect_settings (line 24) | pub(crate) fn connect_settings(gui_data: &GuiData) {
  function create_clear_cache_dialog (line 237) | fn create_clear_cache_dialog(title_str: &str, window_settings: &Window) ...

FILE: czkawka_gui/src/connect_things/connect_show_hide_ui.rs
  function connect_show_hide_ui (line 5) | pub(crate) fn connect_show_hide_ui(gui_data: &GuiData) {

FILE: czkawka_gui/src/connect_things/connect_similar_image_size_change.rs
  function connect_similar_image_size_change (line 8) | pub(crate) fn connect_similar_image_size_change(gui_data: &GuiData) {

FILE: czkawka_gui/src/connect_things/file_chooser_helpers.rs
  function extract_paths_from_file_chooser (line 5) | pub fn extract_paths_from_file_chooser(file_chooser: &gtk4::FileChooserN...

FILE: czkawka_gui/src/gtk_traits.rs
  type ComboBoxTraits (line 7) | pub trait ComboBoxTraits {
    method set_model_and_first (line 8) | fn set_model_and_first<I, S>(&self, models: I)
    method set_model_and_first (line 15) | fn set_model_and_first<I, S>(&self, models: I)
  type DialogTraits (line 27) | pub trait DialogTraits {
    method get_box_child (line 28) | fn get_box_child(&self) -> GtkBox;
    method get_box_child (line 32) | fn get_box_child(&self) -> GtkBox {
  type WidgetTraits (line 39) | pub trait WidgetTraits {
    method get_all_direct_children (line 40) | fn get_all_direct_children(&self) -> Vec<Widget>;
    method get_all_widgets_of_type (line 41) | fn get_all_widgets_of_type<T: IsA<Widget>>(&self, recursive: bool) -> ...
    method get_widget_of_type (line 42) | fn get_widget_of_type<T: IsA<Widget>>(&self, recursive: bool) -> T;
    method get_all_boxes (line 43) | fn get_all_boxes(&self) -> Vec<GtkBox>;
    method debug_print_widget (line 44) | fn debug_print_widget(&self, print_only_direct_children: bool);
    method get_all_direct_children (line 48) | fn get_all_direct_children(&self) -> Vec<Widget> {
    method get_all_widgets_of_type (line 64) | fn get_all_widgets_of_type<T: IsA<Widget>>(&self, recursive: bool) -> ...
    method get_widget_of_type (line 85) | fn get_widget_of_type<T: IsA<Widget>>(&self, recursive: bool) -> T {
    method get_all_boxes (line 105) | fn get_all_boxes(&self) -> Vec<GtkBox> {
    method debug_print_widget (line 119) | fn debug_print_widget(&self, print_only_direct_children: bool) {
  function test_get_all_direct_children (line 156) | fn test_get_all_direct_children() {
  function test_get_all_boxes (line 170) | fn test_get_all_boxes() {
  function test_get_all_direct_children_empty (line 184) | fn test_get_all_direct_children_empty() {
  function test_get_all_boxes_nested (line 190) | fn test_get_all_boxes_nested() {
  function test_get_all_boxes_with_mixed_widgets (line 204) | fn test_get_all_boxes_with_mixed_widgets() {
  function test_combo_box_set_model_and_first (line 220) | fn test_combo_box_set_model_and_first() {
  function test_dialog_get_box_child (line 229) | fn test_dialog_get_box_child() {
  function test_get_custom_label_panic (line 238) | fn test_get_custom_label_panic() {
  function test_get_custom_image_panic (line 248) | fn test_get_custom_image_panic() {
  function test_get_all_widgets_of_type (line 257) | fn test_get_all_widgets_of_type() {
  function test_get_widget_of_type (line 304) | fn test_get_widget_of_type() {
  function test_get_widget_of_type_panic (line 356) | fn test_get_widget_of_type_panic() {
  function test_get_widget_of_type_panic_non_recursive (line 366) | fn test_get_widget_of_type_panic_non_recursive() {

FILE: czkawka_gui/src/gui_structs/common_tree_view.rs
  type CommonTreeViews (line 39) | pub struct CommonTreeViews {
    method get_subview (line 45) | pub fn get_subview(&self, item: NotebookMainEnum) -> &SubView {
    method get_current_page (line 48) | pub fn get_current_page(&self) -> NotebookMainEnum {
    method get_current_subview (line 52) | pub fn get_current_subview(&self) -> &SubView {
    method hide_preview (line 57) | pub fn hide_preview(&self) {
    method setup (line 72) | pub fn setup(&self, gui_data: &GuiData) {
  type TreeViewListStoreTrait (line 79) | pub trait TreeViewListStoreTrait {
    method get_model (line 80) | fn get_model(&self) -> ListStore;
    method get_model (line 83) | fn get_model(&self) -> ListStore {
  type GetTreeViewTrait (line 91) | pub trait GetTreeViewTrait {
    method get_tree_view (line 92) | fn get_tree_view(&self) -> TreeView;
    method get_tree_view (line 95) | fn get_tree_view(&self) -> TreeView {
    method get_tree_view (line 104) | fn get_tree_view(&self) -> TreeView {
  type SubView (line 114) | pub struct SubView {
    method get_model (line 132) | pub fn get_model(&self) -> ListStore {
    method get_tree_model (line 135) | pub fn get_tree_model(&self) -> TreeModel {
    method get_tree_selection (line 138) | pub fn get_tree_selection(&self) -> TreeSelection {
    method new (line 141) | pub fn new(
    method _setup_tree_view (line 181) | fn _setup_tree_view(&self) {
    method _setup_gesture_click (line 197) | fn _setup_gesture_click(&self) {
    method _setup_evk (line 203) | fn _setup_evk(&self, gui_data: &GuiData) {
    method _connect_show_mouse_preview (line 215) | fn _connect_show_mouse_preview(&self, gui_data: &GuiData, preview_path...
    method _connect_show_keyboard_preview (line 239) | fn _connect_show_keyboard_preview(&self, gui_data: &GuiData, preview_p...
    method setup (line 269) | fn setup(&self, preview_path: &Rc<RefCell<String>>, gui_data: &GuiData) {
    method _setup_tree_view_config (line 284) | fn _setup_tree_view_config(&self) {
  type PreviewStruct (line 126) | pub struct PreviewStruct {
  type ColumnSort (line 471) | pub enum ColumnSort {
  function create_default_selection_button_column (line 477) | pub(crate) fn create_default_selection_button_column(
  function create_default_columns (line 503) | pub(crate) fn create_default_columns(tree_view: &TreeView, columns: &[(i...
  function show_preview (line 524) | pub(crate) fn show_preview(
  type SharedModelEnum (line 619) | pub enum SharedModelEnum {
    method save_all_in_one (line 634) | pub(crate) fn save_all_in_one(&self, path: &str) -> Result<(), String> {
    method replace (line 653) | pub(crate) fn replace(&self, new_item: Self) {
    method from (line 693) | fn from(value: DuplicateFinder) -> Self {
    method from (line 698) | fn from(value: EmptyFolder) -> Self {
    method from (line 703) | fn from(value: EmptyFiles) -> Self {
    method from (line 708) | fn from(value: Temporary) -> Self {
    method from (line 713) | fn from(value: BigFile) -> Self {
    method from (line 718) | fn from(value: SimilarImages) -> Self {
    method from (line 723) | fn from(value: SimilarVideos) -> Self {
    method from (line 728) | fn from(value: SameMusic) -> Self {
    method from (line 733) | fn from(value: InvalidSymlinks) -> Self {
    method from (line 738) | fn from(value: BrokenFiles) -> Self {
    method from (line 743) | fn from(value: BadExtensions) -> Self {

FILE: czkawka_gui/src/gui_structs/common_upper_tree_view.rs
  type UpperTreeViewEnum (line 12) | pub enum UpperTreeViewEnum {
  type CommonUpperTreeViews (line 18) | pub struct CommonUpperTreeViews {
    method get_subview (line 35) | pub fn get_subview(&self, item: UpperTreeViewEnum) -> &UpperSubView {
    method get_tree_view (line 38) | pub fn get_tree_view(&self, item: UpperTreeViewEnum) -> &TreeView {
    method setup (line 45) | pub fn setup(&self) {
  type UpperSubView (line 23) | pub struct UpperSubView {
    method new (line 62) | pub fn new(builder: &Builder, scrolled_name: &str, enum_value: Noteboo...
    method _setup_tree_view (line 80) | fn _setup_tree_view(&self) {
    method _setup_gesture_click (line 90) | fn _setup_gesture_click(&self) {
    method _setup_evk (line 94) | fn _setup_evk(&self) {
    method setup (line 112) | fn setup(&self) {
    method _setup_tree_view_config (line 117) | fn _setup_tree_view_config(&self) {

FILE: czkawka_gui/src/gui_structs/gui_about.rs
  type GuiAbout (line 9) | pub struct GuiAbout {
    method create_from_builder (line 20) | pub(crate) fn create_from_builder(window_main: &Window, logo: &Pixbuf)...
    method update_language (line 136) | pub(crate) fn update_language(&self) {

FILE: czkawka_gui/src/gui_structs/gui_bottom_buttons.rs
  type GuiBottomButtons (line 14) | pub struct GuiBottomButtons {
    method create_from_builder (line 38) | pub(crate) fn create_from_builder(builder: &gtk4::Builder, popover_sel...
    method update_language (line 122) | pub(crate) fn update_language(&self) {
  function test_hardlinks (line 153) | fn test_hardlinks() -> bool {

FILE: czkawka_gui/src/gui_structs/gui_compare_images.rs
  type GuiCompareImages (line 12) | pub struct GuiCompareImages {
    method create_from_builder (line 37) | pub(crate) fn create_from_builder(window_main: &gtk4::Window) -> Self {
    method update_language (line 88) | pub(crate) fn update_language(&self) {

FILE: czkawka_gui/src/gui_structs/gui_data.rs
  constant ICON_ABOUT (line 27) | pub const ICON_ABOUT: &[u8] = include_bytes!("../../icons/icon_about.png");
  constant CZK_ICON_ADD (line 28) | pub const CZK_ICON_ADD: &[u8] = include_bytes!("../../icons/czk_add.svg");
  constant CZK_ICON_COMPARE (line 29) | pub const CZK_ICON_COMPARE: &[u8] = include_bytes!("../../icons/czk_comp...
  constant CZK_ICON_DELETE (line 30) | pub const CZK_ICON_DELETE: &[u8] = include_bytes!("../../icons/czk_delet...
  constant CZK_ICON_HARDLINK (line 31) | pub const CZK_ICON_HARDLINK: &[u8] = include_bytes!("../../icons/czk_har...
  constant CZK_ICON_HIDE_DOWN (line 32) | pub const CZK_ICON_HIDE_DOWN: &[u8] = include_bytes!("../../icons/czk_hi...
  constant CZK_ICON_HIDE_UP (line 33) | pub const CZK_ICON_HIDE_UP: &[u8] = include_bytes!("../../icons/czk_hide...
  constant CZK_ICON_INFO (line 34) | pub const CZK_ICON_INFO: &[u8] = include_bytes!("../../icons/czk_info.sv...
  constant CZK_ICON_LEFT (line 35) | pub const CZK_ICON_LEFT: &[u8] = include_bytes!("../../icons/czk_left.sv...
  constant CZK_ICON_MANUAL_ADD (line 36) | pub const CZK_ICON_MANUAL_ADD: &[u8] = include_bytes!("../../icons/czk_m...
  constant CZK_ICON_MOVE (line 37) | pub const CZK_ICON_MOVE: &[u8] = include_bytes!("../../icons/czk_move.sv...
  constant CZK_ICON_RIGHT (line 38) | pub const CZK_ICON_RIGHT: &[u8] = include_bytes!("../../icons/czk_right....
  constant CZK_ICON_SAVE (line 39) | pub const CZK_ICON_SAVE: &[u8] = include_bytes!("../../icons/czk_save.sv...
  constant CZK_ICON_SEARCH (line 40) | pub const CZK_ICON_SEARCH: &[u8] = include_bytes!("../../icons/czk_searc...
  constant CZK_ICON_SELECT (line 41) | pub const CZK_ICON_SELECT: &[u8] = include_bytes!("../../icons/czk_selec...
  constant CZK_ICON_SETTINGS (line 42) | pub const CZK_ICON_SETTINGS: &[u8] = include_bytes!("../../icons/czk_set...
  constant CZK_ICON_SORT (line 43) | pub const CZK_ICON_SORT: &[u8] = include_bytes!("../../icons/czk_sort.sv...
  constant CZK_ICON_STOP (line 44) | pub const CZK_ICON_STOP: &[u8] = include_bytes!("../../icons/czk_stop.sv...
  constant CZK_ICON_SYMLINK (line 45) | pub const CZK_ICON_SYMLINK: &[u8] = include_bytes!("../../icons/czk_syml...
  constant CZK_ICON_TRASH (line 46) | pub const CZK_ICON_TRASH: &[u8] = include_bytes!("../../icons/czk_trash....
  constant CZK_ICON_REPLACE (line 47) | pub const CZK_ICON_REPLACE: &[u8] = include_bytes!("../../icons/czk_repl...
  type GuiData (line 50) | pub struct GuiData {
    method new_with_application (line 86) | pub fn new_with_application(application: &gtk4::Application) -> Self {
    method setup (line 183) | pub(crate) fn setup(&self) {
    method update_language (line 188) | pub(crate) fn update_language(&self) {

FILE: czkawka_gui/src/gui_structs/gui_header.rs
  type GuiHeader (line 7) | pub struct GuiHeader {
    method create_from_builder (line 13) | pub(crate) fn create_from_builder(builder: &gtk4::Builder) -> Self {
    method update_language (line 23) | pub(crate) fn update_language(&self) {

FILE: czkawka_gui/src/gui_structs/gui_main_notebook.rs
  type GuiMainNotebook (line 23) | pub struct GuiMainNotebook {
    method create_from_builder (line 98) | pub(crate) fn create_from_builder(builder: &Builder, settings: &GuiSet...
    method setup (line 234) | pub(crate) fn setup(&self, gui_data: &GuiData) {
    method update_language (line 238) | pub(crate) fn update_language(&self) {

FILE: czkawka_gui/src/gui_structs/gui_popovers_select.rs
  type GuiSelectPopovers (line 7) | pub struct GuiSelectPopovers {
    method create_from_builder (line 39) | pub(crate) fn create_from_builder() -> Self {
    method update_language (line 99) | pub(crate) fn update_language(&self) {

FILE: czkawka_gui/src/gui_structs/gui_popovers_sort.rs
  type GuiSortPopovers (line 7) | pub struct GuiSortPopovers {
    method create_from_builder (line 18) | pub(crate) fn create_from_builder() -> Self {
    method update_language (line 39) | pub(crate) fn update_language(&self) {

FILE: czkawka_gui/src/gui_structs/gui_progress_dialog.rs
  type GuiProgressDialog (line 9) | pub struct GuiProgressDialog {
    method create_from_builder (line 26) | pub(crate) fn create_from_builder(window_main: &Window) -> Self {
    method update_language (line 62) | pub(crate) fn update_language(&self) {

FILE: czkawka_gui/src/gui_structs/gui_settings.rs
  type GuiSettings (line 8) | pub struct GuiSettings {
    method create_from_builder (line 61) | pub(crate) fn create_from_builder(window_main: &Window) -> Self {
    method update_language (line 162) | pub(crate) fn update_language(&self) {

FILE: czkawka_gui/src/gui_structs/gui_upper_notebook.rs
  type GuiUpperNotebook (line 11) | pub struct GuiUpperNotebook {
    method create_from_builder (line 41) | pub(crate) fn create_from_builder(builder: &gtk4::Builder) -> Self {
    method setup (line 117) | pub(crate) fn setup(&self) {
    method update_language (line 121) | pub(crate) fn update_language(&self) {

FILE: czkawka_gui/src/help_combo_box.rs
  type HashTypeStruct (line 5) | pub struct HashTypeStruct {
  constant DUPLICATES_HASH_TYPE_COMBO_BOX (line 10) | pub const DUPLICATES_HASH_TYPE_COMBO_BOX: [HashTypeStruct; 3] = [
  type CheckMethodStruct (line 25) | pub struct CheckMethodStruct {
  constant DUPLICATES_CHECK_METHOD_COMBO_BOX (line 30) | pub const DUPLICATES_CHECK_METHOD_COMBO_BOX: [CheckMethodStruct; 4] = [
  type AudioTypeStruct (line 50) | pub struct AudioTypeStruct {
  constant AUDIO_TYPE_CHECK_METHOD_COMBO_BOX (line 56) | pub const AUDIO_TYPE_CHECK_METHOD_COMBO_BOX: [AudioTypeStruct; 2] = [
  type SearchModeStruct (line 68) | pub struct SearchModeStruct {
  constant BIG_FILES_CHECK_METHOD_COMBO_BOX (line 74) | pub const BIG_FILES_CHECK_METHOD_COMBO_BOX: [SearchModeStruct; 2] = [
  type ImageResizeAlgStruct (line 85) | pub struct ImageResizeAlgStruct {
  constant IMAGES_RESIZE_ALGORITHM_COMBO_BOX (line 90) | pub const IMAGES_RESIZE_ALGORITHM_COMBO_BOX: [ImageResizeAlgStruct; 5] = [
  type ImageHashTypeStruct (line 113) | pub struct ImageHashTypeStruct {
  constant IMAGES_HASH_TYPE_COMBO_BOX (line 118) | pub const IMAGES_HASH_TYPE_COMBO_BOX: &[ImageHashTypeStruct] = &[
  constant IMAGES_HASH_SIZE_COMBO_BOX (line 145) | pub const IMAGES_HASH_SIZE_COMBO_BOX: [i32; 4] = [8, 16, 32, 64];

FILE: czkawka_gui/src/help_functions.rs
  constant KEY_DELETE (line 15) | pub const KEY_DELETE: u32 = 119;
  constant KEY_ENTER (line 16) | pub const KEY_ENTER: u32 = 36;
  constant KEY_SPACE (line 17) | pub const KEY_SPACE: u32 = 65;
  type SharedState (line 19) | pub type SharedState<T> = Rc<RefCell<Option<T>>>;
  constant MAIN_ROW_COLOR (line 21) | pub const MAIN_ROW_COLOR: &str = "#222222";
  constant HEADER_ROW_COLOR (line 22) | pub const HEADER_ROW_COLOR: &str = "#111111";
  constant TEXT_COLOR (line 23) | pub const TEXT_COLOR: &str = "#ffffff";
  function get_path_buf_from_vector_of_strings (line 25) | pub(crate) fn get_path_buf_from_vector_of_strings(vec_string: &[String])...
  function print_text_messages_to_text_view (line 29) | pub(crate) fn print_text_messages_to_text_view(text_messages: &Messages,...
  function reset_text_view (line 65) | pub(crate) fn reset_text_view(text_view: &TextView) {
  function add_text_to_text_view (line 69) | pub(crate) fn add_text_to_text_view(text_view: &TextView, string_to_appe...
  function set_buttons (line 79) | pub(crate) fn set_buttons(hashmap: &mut HashMap<BottomButtonsEnum, bool>...
  function hide_all_buttons (line 89) | pub(crate) fn hide_all_buttons(buttons_array: &[Widget]) {
  function change_dimension_to_krotka (line 95) | pub(crate) fn change_dimension_to_krotka(dimensions: &str) -> (u64, u64) {
  function get_notebook_upper_enum_from_tree_view (line 104) | pub(crate) fn get_notebook_upper_enum_from_tree_view(tree_view: &TreeVie...
  function get_notebook_object_from_tree_view (line 112) | pub(crate) fn get_notebook_object_from_tree_view(tree_view: &TreeView) -...
  function get_full_name_from_path_name (line 121) | pub(crate) fn get_full_name_from_path_name(path: &str, name: &str) -> St...
  function get_max_file_name (line 129) | pub(crate) fn get_max_file_name(file_name: &str, max_length: usize) -> S...
  function scale_set_min_max_values (line 153) | pub(crate) fn scale_set_min_max_values(scale: &Scale, minimum: f64, maxi...
  function scale_step_function (line 162) | pub(crate) fn scale_step_function(scale: &Scale, _scroll_type: ScrollTyp...
  function test_file_name_shortener (line 178) | fn test_file_name_shortener() {
  function test_get_path_buf_from_vector_of_strings (line 199) | fn test_get_path_buf_from_vector_of_strings() {
  function test_get_full_name_from_path_name (line 206) | fn test_get_full_name_from_path_name() {
  function test_set_and_hide_buttons (line 214) | fn test_set_and_hide_buttons() {
  function test_get_full_name_from_path_name (line 244) | fn test_get_full_name_from_path_name() {
  function test_change_dimension_to_krotka (line 252) | fn test_change_dimension_to_krotka() {
  function test_get_max_file_name_truncation (line 259) | fn test_get_max_file_name_truncation() {
  function test_get_path_buf_from_vector_of_strings (line 269) | fn test_get_path_buf_from_vector_of_strings() {

FILE: czkawka_gui/src/helpers/enums.rs
  type PopoverTypes (line 15) | pub enum PopoverTypes {
  type BottomButtonsEnum (line 25) | pub enum BottomButtonsEnum {
  type Message (line 37) | pub enum Message {
    method get_message_type (line 52) | pub(crate) fn get_message_type(&self) -> crate::notebook_enums::Notebo...
  type ColumnsDuplicates (line 70) | pub enum ColumnsDuplicates {
  type ColumnsEmptyFolders (line 86) | pub enum ColumnsEmptyFolders {
  type ColumnsIncludedDirectory (line 96) | pub enum ColumnsIncludedDirectory {
  type ColumnsExcludedDirectory (line 103) | pub enum ColumnsExcludedDirectory {
  type ColumnsBigFiles (line 109) | pub enum ColumnsBigFiles {
  type ColumnsEmptyFiles (line 120) | pub enum ColumnsEmptyFiles {
  type ColumnsTemporaryFiles (line 129) | pub enum ColumnsTemporaryFiles {
  type ColumnsSimilarImages (line 138) | pub enum ColumnsSimilarImages {
  type ColumnsSimilarVideos (line 155) | pub enum ColumnsSimilarVideos {
  type ColumnsSameMusic (line 175) | pub enum ColumnsSameMusic {
  type ColumnsInvalidSymlinks (line 197) | pub enum ColumnsInvalidSymlinks {
  type ColumnsBrokenFiles (line 208) | pub enum ColumnsBrokenFiles {
  type ColumnsBadExtensions (line 218) | pub enum ColumnsBadExtensions {

FILE: czkawka_gui/src/helpers/image_operations.rs
  constant SIZE_OF_ICON (line 16) | const SIZE_OF_ICON: i32 = 18;
  constant TYPE_OF_INTERPOLATION (line 17) | const TYPE_OF_INTERPOLATION: InterpType = InterpType::Tiles;
  function resize_pixbuf_dimension (line 20) | pub(crate) fn resize_pixbuf_dimension(pixbuf: &Pixbuf, requested_size: (...
  function svg_to_dynamic_image (line 36) | fn svg_to_dynamic_image(svg_data: &[u8]) -> Option<DynamicImage> {
  function dynamic_image_to_pixbuf (line 48) | fn dynamic_image_to_pixbuf(img: DynamicImage) -> Pixbuf {
  function set_icon_of_button (line 57) | pub(crate) fn set_icon_of_button<P: IsA<Widget>>(button: &P, data: &'sta...
  function get_pixbuf_from_dynamic_image (line 64) | pub(crate) fn get_pixbuf_from_dynamic_image(dynamic_image: DynamicImage)...
  function test_pixbuf_from_dynamic_image (line 83) | fn test_pixbuf_from_dynamic_image() {

FILE: czkawka_gui/src/helpers/list_store_operations.rs
  function get_string_from_list_store (line 8) | pub(crate) fn get_string_from_list_store(tree_view: &TreeView, column_fu...
  function get_from_list_store_fnc (line 31) | pub(crate) fn get_from_list_store_fnc<T>(tree_view: &TreeView, fnc: &dyn...
  function clean_invalid_headers (line 45) | pub(crate) fn clean_invalid_headers(model: &ListStore, column_header: i3...
  function check_how_much_elements_is_selected (line 163) | pub(crate) fn check_how_much_elements_is_selected(sv: &SubView) -> (u64,...
  function count_number_of_groups (line 202) | pub(crate) fn count_number_of_groups(sv: &SubView) -> u32 {
  function check_if_value_is_in_list_store (line 223) | pub(crate) fn check_if_value_is_in_list_store(model: &ListStore, column:...
  function check_if_list_store_column_have_all_same_values (line 236) | pub(crate) fn check_if_list_store_column_have_all_same_values(model: &Li...
  function append_row_to_list_store (line 251) | pub(crate) fn append_row_to_list_store(list_store: &ListStore, values: &...
  function get_test_sv_duplicate (line 267) | fn get_test_sv_duplicate() -> (crate::gui_structs::common_tree_view::Sub...
  function returns_empty_vector_when_list_store_is_empty (line 302) | fn returns_empty_vector_when_list_store_is_empty() {
  function filters_by_boolean_column_when_selection_specified (line 311) | fn filters_by_boolean_column_when_selection_specified() {
  function applies_custom_function_to_all_rows (line 329) | fn applies_custom_function_to_all_rows() {
  function removes_single_orphan_header_with_empty_path (line 346) | fn removes_single_orphan_header_with_empty_path() {
  function cleans_invalid_headers_properly (line 358) | fn cleans_invalid_headers_properly() {
  function keeps_header_with_multiple_children_when_path_empty (line 377) | fn keeps_header_with_multiple_children_when_path_empty() {
  function keeps_reference_folder_header_with_single_child (line 393) | fn keeps_reference_folder_header_with_single_child() {
  function counts_items_and_groups_correctly (line 408) | fn counts_items_and_groups_correctly() {
  function returns_zero_when_nothing_selected (line 445) | fn returns_zero_when_nothing_selected() {
  function returns_correct_count_of_groups (line 466) | fn returns_correct_count_of_groups() {
  function finds_existing_values_in_different_columns (line 481) | fn finds_existing_values_in_different_columns() {
  function detects_uniform_values_in_column (line 497) | fn detects_uniform_values_in_column() {
  function detects_mixed_values_in_column (line 510) | fn detects_mixed_values_in_column() {
  function adds_row_with_multiple_columns (line 523) | fn adds_row_with_multiple_columns() {

FILE: czkawka_gui/src/helpers/model_iter.rs
  function iter_list_with_break_init (line 4) | pub fn iter_list_with_break_init<G, F>(model: &ListStore, init: G, mut f...
  function iter_list_break_with_init (line 22) | pub fn iter_list_break_with_init<G, F>(model: &ListStore, init: G, mut f...
  function iter_list (line 41) | pub fn iter_list<F>(model: &ListStore, mut f: F)
  function iter_list_with_break (line 55) | pub fn iter_list_with_break<F>(model: &ListStore, mut f: F)
  function test_iter_list_collects_items (line 80) | fn test_iter_list_collects_items() {
  function test_iter_list_with_break_stops (line 97) | fn test_iter_list_with_break_stops() {
  function test_iter_list_with_break_init_runs_init_and_iterates (line 114) | fn test_iter_list_with_break_init_runs_init_and_iterates() {
  function test_iter_list_break_with_init_runs_init_and_can_break (line 133) | fn test_iter_list_break_with_init_runs_init_and_can_break() {

FILE: czkawka_gui/src/initialize_gui.rs
  function initialize_gui (line 13) | pub(crate) fn initialize_gui(gui_data: &GuiData) {

FILE: czkawka_gui/src/language_functions.rs
  type Language (line 2) | pub struct Language {
  constant LANGUAGES_ALL (line 7) | pub const LANGUAGES_ALL: &[Language] = &[
  function get_language_from_combo_box_text (line 102) | pub(crate) fn get_language_from_combo_box_text(combo_box_text: &str) -> ...

FILE: czkawka_gui/src/localizer_gui.rs
  type Localizations (line 7) | struct Localizations;
  function localizer_gui (line 25) | pub(crate) fn localizer_gui() -> Box<dyn Localizer> {

FILE: czkawka_gui/src/main.rs
  constant CZKAWKA_GTK_TOOL_NUMBER (line 73) | pub const CZKAWKA_GTK_TOOL_NUMBER: usize = TOOLS_NUMBER - 3;
  function main (line 75) | fn main() {
  function build_ui (line 115) | fn build_ui(application: &Application, cli_args: Option<&CliResult>, nee...
  function print_czkawka_gui_info (line 187) | pub(crate) fn print_czkawka_gui_info(thread_number: usize) {

FILE: czkawka_gui/src/notebook_enums.rs
  type NotebookMainEnum (line 5) | pub enum NotebookMainEnum {
  function to_notebook_main_enum (line 19) | pub(crate) fn to_notebook_main_enum(notebook_number: u32) -> NotebookMai...
  function get_all_main_tabs (line 36) | pub(crate) fn get_all_main_tabs() -> [NotebookMainEnum; CZKAWKA_GTK_TOOL...
  type NotebookUpperEnum (line 53) | pub enum NotebookUpperEnum {
  function to_notebook_upper_enum (line 59) | pub(crate) fn to_notebook_upper_enum(notebook_number: u32) -> NotebookUp...

FILE: czkawka_gui/src/notebook_info.rs
  type NotebookObject (line 11) | pub struct NotebookObject {

FILE: czkawka_gui/src/opening_selecting_records.rs
  function opening_enter_function_ported_upper_directories (line 13) | pub(crate) fn opening_enter_function_ported_upper_directories(
  function opening_middle_mouse_function (line 45) | pub(crate) fn opening_middle_mouse_function(gesture_click: &GestureClick...
  function opening_double_click_function_directories (line 56) | pub(crate) fn opening_double_click_function_directories(gesture_click: &...
  function opening_enter_function_ported (line 74) | pub(crate) fn opening_enter_function_ported(event_controller: &gtk4::Eve...
  function opening_double_click_function (line 92) | pub(crate) fn opening_double_click_function(gesture_click: &GestureClick...
  type OpenMode (line 105) | enum OpenMode {
  function common_mark_function (line 110) | fn common_mark_function(tree_view: &gtk4::TreeView, column_selection: i3...
  function common_open_function (line 127) | fn common_open_function(tree_view: &gtk4::TreeView, column_name: i32, co...
  function reverse_selection (line 146) | fn reverse_selection(tree_view: &gtk4::TreeView, column_header: i32, col...
  function common_open_function_upper_directories (line 191) | fn common_open_function_upper_directories(tree_view: &gtk4::TreeView, co...
  function handle_tree_keypress_upper_directories (line 204) | fn handle_tree_keypress_upper_directories(tree_view: &gtk4::TreeView, ke...
  function handle_tree_keypress (line 218) | fn handle_tree_keypress(tree_view: &gtk4::TreeView, key_code: u32, name_...
  function select_function_duplicates (line 230) | pub(crate) fn select_function_duplicates(tree_selection: &gtk4::TreeSele...
  function select_function_same_music (line 234) | pub(crate) fn select_function_same_music(tree_selection: &gtk4::TreeSele...
  function select_function_similar_images (line 238) | pub(crate) fn select_function_similar_images(
  function select_function_similar_videos (line 247) | pub(crate) fn select_function_similar_videos(
  function select_function_header (line 256) | pub(crate) fn select_function_header(header_id: i32) -> Box<dyn Fn(&Tree...
  function select_function_always_true (line 268) | pub(crate) fn select_function_always_true(

FILE: czkawka_gui/src/saving_loading.rs
  constant SAVE_FILE_NAME_JSON (line 26) | const SAVE_FILE_NAME_JSON: &str = "czkawka_gui_config.json";
  constant DEFAULT_SAVE_ON_EXIT (line 28) | const DEFAULT_SAVE_ON_EXIT: bool = true;
  constant DEFAULT_LOAD_AT_START (line 29) | const DEFAULT_LOAD_AT_START: bool = true;
  constant DEFAULT_CONFIRM_DELETION (line 30) | const DEFAULT_CONFIRM_DELETION: bool = true;
  constant DEFAULT_CONFIRM_LINK_DELETION (line 31) | const DEFAULT_CONFIRM_LINK_DELETION: bool = true;
  constant DEFAULT_CONFIRM_GROUP_DELETION (line 32) | const DEFAULT_CONFIRM_GROUP_DELETION: bool = true;
  constant DEFAULT_SHOW_IMAGE_PREVIEW (line 33) | const DEFAULT_SHOW_IMAGE_PREVIEW: bool = true;
  constant DEFAULT_SHOW_DUPLICATE_IMAGE_PREVIEW (line 34) | const DEFAULT_SHOW_DUPLICATE_IMAGE_PREVIEW: bool = true;
  constant DEFAULT_BOTTOM_TEXT_VIEW (line 35) | const DEFAULT_BOTTOM_TEXT_VIEW: bool = true;
  constant DEFAULT_USE_CACHE (line 36) | const DEFAULT_USE_CACHE: bool = true;
  constant DEFAULT_SAVE_ALSO_AS_JSON (line 37) | const DEFAULT_SAVE_ALSO_AS_JSON: bool = false;
  constant DEFAULT_HIDE_HARD_LINKS (line 38) | const DEFAULT_HIDE_HARD_LINKS: bool = true;
  constant DEFAULT_USE_PRECACHE (line 39) | const DEFAULT_USE_PRECACHE: bool = false;
  constant DEFAULT_USE_TRASH (line 40) | const DEFAULT_USE_TRASH: bool = false;
  constant DEFAULT_MINIMAL_CACHE_SIZE (line 41) | pub const DEFAULT_MINIMAL_CACHE_SIZE: &str = "257144";
  constant DEFAULT_PREHASH_MINIMAL_CACHE_SIZE (line 42) | const DEFAULT_PREHASH_MINIMAL_CACHE_SIZE: &str = "0";
  constant DEFAULT_VIDEO_REMOVE_AUTO_OUTDATED_CACHE (line 43) | const DEFAULT_VIDEO_REMOVE_AUTO_OUTDATED_CACHE: bool = false;
  constant DEFAULT_IMAGE_REMOVE_AUTO_OUTDATED_CACHE (line 44) | const DEFAULT_IMAGE_REMOVE_AUTO_OUTDATED_CACHE: bool = true;
  constant DEFAULT_DUPLICATE_REMOVE_AUTO_OUTDATED_CACHE (line 45) | const DEFAULT_DUPLICATE_REMOVE_AUTO_OUTDATED_CACHE: bool = true;
  constant DEFAULT_DUPLICATE_CASE_SENSITIVE_NAME_CHECKING (line 46) | const DEFAULT_DUPLICATE_CASE_SENSITIVE_NAME_CHECKING: bool = false;
  constant DEFAULT_GENERAL_IGNORE_OTHER_FILESYSTEMS (line 47) | const DEFAULT_GENERAL_IGNORE_OTHER_FILESYSTEMS: bool = false;
  constant DEFAULT_USING_RUST_LIBRARIES_TO_SHOW_PREVIEW (line 48) | const DEFAULT_USING_RUST_LIBRARIES_TO_SHOW_PREVIEW: bool = true;
  constant DEFAULT_MUSIC_APPROXIMATE_COMPARISON (line 50) | const DEFAULT_MUSIC_APPROXIMATE_COMPARISON: bool = false;
  constant DEFAULT_MUSIC_GROUP_CONTENT_BY_TITLE (line 51) | const DEFAULT_MUSIC_GROUP_CONTENT_BY_TITLE: bool = false;
  constant DEFAULT_BROKEN_FILES_PDF (line 53) | const DEFAULT_BROKEN_FILES_PDF: bool = true;
  constant DEFAULT_BROKEN_FILES_AUDIO (line 54) | const DEFAULT_BROKEN_FILES_AUDIO: bool = true;
  constant DEFAULT_BROKEN_FILES_ARCHIVE (line 55) | const DEFAULT_BROKEN_FILES_ARCHIVE: bool = true;
  constant DEFAULT_BROKEN_FILES_IMAGE (line 56) | const DEFAULT_BROKEN_FILES_IMAGE: bool = true;
  constant DEFAULT_BROKEN_FILES_VIDEO (line 57) | const DEFAULT_BROKEN_FILES_VIDEO: bool = false;
  constant DEFAULT_THREAD_NUMBER (line 59) | const DEFAULT_THREAD_NUMBER: u32 = 0;
  constant DEFAULT_NUMBER_OF_BIGGEST_FILES (line 61) | const DEFAULT_NUMBER_OF_BIGGEST_FILES: &str = "50";
  constant DEFAULT_SIMILAR_IMAGES_SIMILARITY (line 62) | const DEFAULT_SIMILAR_IMAGES_SIMILARITY: f32 = 0.0;
  constant DEFAULT_SIMILAR_IMAGES_IGNORE_SAME_SIZE (line 63) | const DEFAULT_SIMILAR_IMAGES_IGNORE_SAME_SIZE: bool = false;
  constant DEFAULT_SIMILAR_VIDEOS_SIMILARITY (line 64) | const DEFAULT_SIMILAR_VIDEOS_SIMILARITY: f32 = 15.0;
  constant DEFAULT_SIMILAR_VIDEOS_IGNORE_SAME_SIZE (line 65) | const DEFAULT_SIMILAR_VIDEOS_IGNORE_SAME_SIZE: bool = false;
  constant DEFAULT_MINIMAL_FILE_SIZE (line 67) | pub const DEFAULT_MINIMAL_FILE_SIZE: &str = "16384";
  constant DEFAULT_MAXIMAL_FILE_SIZE (line 68) | pub const DEFAULT_MAXIMAL_FILE_SIZE: &str = "999999999999";
  constant DEFAULT_EXCLUDED_DIRECTORIES (line 71) | const DEFAULT_EXCLUDED_DIRECTORIES: &[&str] = &["/proc", "/dev", "/sys",...
  constant DEFAULT_EXCLUDED_DIRECTORIES (line 73) | const DEFAULT_EXCLUDED_DIRECTORIES: &[&str] = &["C:\\Windows"];
  type LoadSaveStruct (line 75) | struct LoadSaveStruct {
    method with_text_view (line 80) | pub(crate) fn with_text_view() -> Self {
    method open_save_file_path (line 89) | fn open_save_file_path() -> Option<PathBuf> {
    method open_and_read_content (line 94) | pub(crate) fn open_and_read_content(&mut self, text_view_errors: &Text...
    method save_to_file (line 144) | pub(crate) fn save_to_file(&self, text_view_errors: &TextView) {
    method settings_mut (line 182) | pub(crate) fn settings_mut(&mut self) -> &mut SettingsJson {
  type SettingsJson (line 189) | pub struct SettingsJson {
  method default (line 337) | fn default() -> Self {
  function default_included_directories (line 343) | fn default_included_directories() -> Vec<String> {
  function default_excluded_directories (line 346) | fn default_excluded_directories() -> Vec<String> {
  function default_excluded_items (line 349) | fn default_excluded_items() -> String {
  function default_minimal_file_size (line 352) | fn default_minimal_file_size() -> String {
  function default_maximal_file_size (line 355) | fn default_maximal_file_size() -> String {
  function default_save_at_exit (line 358) | fn default_save_at_exit() -> bool {
  function default_load_at_start (line 361) | fn default_load_at_start() -> bool {
  function default_confirm_deletion (line 364) | fn default_confirm_deletion() -> bool {
  function default_confirm_group_deletion (line 367) | fn default_confirm_group_deletion() -> bool {
  function default_confirm_link_deletion (line 370) | fn default_confirm_link_deletion() -> bool {
  function default_show_bottom_text_panel (line 373) | fn default_show_bottom_text_panel() -> bool {
  function default_hide_hard_links (line 376) | fn default_hide_hard_links() -> bool {
  function default_use_cache (line 379) | fn default_use_cache() -> bool {
  function default_save_also_as_json (line 382) | fn default_save_also_as_json() -> bool {
  function default_delete_to_trash (line 385) | fn default_delete_to_trash() -> bool {
  function default_minimal_cache_size (line 388) | fn default_minimal_cache_size() -> String {
  function default_image_preview_image (line 391) | fn default_image_preview_image() -> bool {
  function default_duplicate_preview_image (line 394) | fn default_duplicate_preview_image() -> bool {
  function default_duplicate_delete_outdated_cache_entries (line 397) | fn default_duplicate_delete_outdated_cache_entries() -> bool {
  function default_image_delete_outdated_cache_entries (line 400) | fn default_image_delete_outdated_cache_entries() -> bool {
  function default_video_delete_outdated_cache_entries (line 403) | fn default_video_delete_outdated_cache_entries() -> bool {
  function default_use_prehash_cache (line 406) | fn default_use_prehash_cache() -> bool {
  function default_minimal_prehash_cache_size (line 409) | fn default_minimal_prehash_cache_size() -> String {
  function default_image_hash_size (line 412) | fn default_image_hash_size() -> u32 {
  function default_number_of_biggest_files (line 415) | fn default_number_of_biggest_files() -> String {
  function default_similar_images_similarity (line 418) | fn default_similar_images_similarity() -> f64 {
  function default_similar_images_ignore_same_size (line 421) | fn default_similar_images_ignore_same_size() -> bool {
  function default_similar_videos_similarity (line 424) | fn default_similar_videos_similarity() -> f64 {
  function default_similar_videos_ignore_same_size (line 427) | fn default_similar_videos_ignore_same_size() -> bool {
  function default_music_approximate_comparison (line 430) | fn default_music_approximate_comparison() -> bool {
  function default_duplicate_name_case_sensitive (line 433) | fn default_duplicate_name_case_sensitive() -> bool {
  function default_broken_files_pdf (line 436) | fn default_broken_files_pdf() -> bool {
  function default_broken_files_audio (line 439) | fn default_broken_files_audio() -> bool {
  function default_broken_files_image (line 442) | fn default_broken_files_image() -> bool {
  function default_broken_files_archive (line 445) | fn default_broken_files_archive() -> bool {
  function default_broken_files_video (line 448) | fn default_broken_files_video() -> bool {
  function default_ignore_other_filesystems (line 451) | fn default_ignore_other_filesystems() -> bool {
  function default_thread_number (line 454) | fn default_thread_number() -> u32 {
  function default_music_compare_by_title (line 457) | fn default_music_compare_by_title() -> bool {
  function default_use_rust_libraries_to_preview (line 460) | fn default_use_rust_libraries_to_preview() -> bool {
  function set_included_reference_folders (line 464) | fn set_included_reference_folders(tree_view_included_directories: &TreeV...
  function set_configuration_to_gui_internal (line 484) | fn set_configuration_to_gui_internal(upper_notebook: &GuiUpperNotebook, ...
  function get_current_directory (line 599) | fn get_current_directory() -> String {
  function gui_to_settings (line 614) | fn gui_to_settings(upper_notebook: &GuiUpperNotebook, main_notebook: &Gu...
  function load_configuration (line 690) | pub fn load_configuration(
  function set_directories (line 764) | fn set_directories(
  function save_configuration (line 783) | pub fn save_configuration(manual_execution: bool, upper_notebook: &GuiUp...
  function reset_configuration (line 798) | pub(crate) fn reset_configuration(manual_clearing: bool, upper_notebook:...

FILE: czkawka_gui/src/taskbar_progress_dummy.rs
  type HWND__ (line 8) | enum HWND__ {}
  type HWND (line 10) | type HWND = *mut HWND__;
  type TBPFLAG (line 13) | pub enum TBPFLAG {
  type TaskbarProgress (line 25) | pub struct TaskbarProgress {}
    method new (line 28) | pub fn new() -> Self {
    method set_progress_state (line 32) | pub(crate) fn set_progress_state(&self, _tbp_flags: TBPFLAG) {}
    method set_progress_value (line 34) | pub(crate) fn set_progress_value(&self, _completed: u64, _total: u64) {}
    method hide (line 36) | pub(crate) fn hide(&self) {}
    method show (line 38) | pub(crate) fn show(&self) {}
    method release (line 41) | pub(crate) fn release(&mut self) {}
    method from (line 45) | fn from(_hwnd: HWND) -> Self {
  method drop (line 51) | fn drop(&mut self) {}

FILE: czkawka_gui/src/taskbar_progress_win.rs
  type TaskbarProgress (line 20) | pub struct TaskbarProgress {
    method new (line 30) | pub fn new() -> TaskbarProgress {
    method set_progress_state (line 35) | pub(crate) fn set_progress_state(&self, tbp_flags: TBPFLAG) {
    method set_progress_value (line 51) | pub(crate) fn set_progress_value(&self, completed: u64, total: u64) {
    method hide (line 76) | pub(crate) fn hide(&self) {
    method show (line 81) | pub(crate) fn show(&self) {
    method release (line 87) | pub(crate) fn release(&mut self) {
    method from (line 105) | fn from(hwnd: HWND) -> Self {
  method drop (line 156) | fn drop(&mut self) {

FILE: krokiet/build.rs
  function main (line 3) | fn main() {

FILE: krokiet/src/audio_player.rs
  constant DEFAULT_STOP_AUDIO (line 9) | const DEFAULT_STOP_AUDIO: &[u8] = include_bytes!("../audio/stop_bit.mp3");
  type AudioPlayer (line 11) | pub struct AudioPlayer {
    method new (line 17) | pub fn new() -> Self {
    method load_audio_data (line 30) | fn load_audio_data() -> Vec<u8> {
    method play_scan_completed (line 55) | pub fn play_scan_completed(&self) {
    method play_audio_blocking (line 72) | fn play_audio_blocking(audio_data: &[u8]) -> Result<(), String> {
  method default (line 92) | fn default() -> Self {

FILE: krokiet/src/clear_outdated_video_thumbnails.rs
  constant DURATION_BEFORE_CLEANING_SECS (line 11) | const DURATION_BEFORE_CLEANING_SECS: u64 = 7 * 24 * 60 * 60;
  function clear_outdated_video_thumbnails (line 13) | pub fn clear_outdated_video_thumbnails(app: &MainWindow) {

FILE: krokiet/src/common.rs
  type IntDataDuplicateFiles (line 15) | pub enum IntDataDuplicateFiles {
  constant MAX_INT_DATA_DUPLICATE_FILES (line 21) | pub const MAX_INT_DATA_DUPLICATE_FILES: usize = IntDataDuplicateFiles::S...
  type StrDataDuplicateFiles (line 25) | pub enum StrDataDuplicateFiles {
  constant MAX_STR_DATA_DUPLICATE_FILES (line 31) | pub const MAX_STR_DATA_DUPLICATE_FILES: usize = StrDataDuplicateFiles::M...
  type IntDataEmptyFolders (line 36) | pub enum IntDataEmptyFolders {
  constant MAX_INT_DATA_EMPTY_FOLDERS (line 40) | pub const MAX_INT_DATA_EMPTY_FOLDERS: usize = IntDataEmptyFolders::Modif...
  type StrDataEmptyFolders (line 44) | pub enum StrDataEmptyFolders {
  constant MAX_STR_DATA_EMPTY_FOLDERS (line 49) | pub const MAX_STR_DATA_EMPTY_FOLDERS: usize = StrDataEmptyFolders::Modif...
  type IntDataBigFiles (line 53) | pub enum IntDataBigFiles {
  constant MAX_INT_DATA_BIG_FILES (line 59) | pub const MAX_INT_DATA_BIG_FILES: usize = IntDataBigFiles::SizePart2 as ...
  type StrDataBigFiles (line 63) | pub enum StrDataBigFiles {
  constant MAX_STR_DATA_BIG_FILES (line 69) | pub const MAX_STR_DATA_BIG_FILES: usize = StrDataBigFiles::ModificationD...
  type IntDataEmptyFiles (line 74) | pub enum IntDataEmptyFiles {
  constant MAX_INT_DATA_EMPTY_FILES (line 80) | pub const MAX_INT_DATA_EMPTY_FILES: usize = IntDataEmptyFiles::SizePart2...
  type StrDataEmptyFiles (line 84) | pub enum StrDataEmptyFiles {
  constant MAX_STR_DATA_EMPTY_FILES (line 89) | pub const MAX_STR_DATA_EMPTY_FILES: usize = StrDataEmptyFiles::Modificat...
  type IntDataTemporaryFiles (line 93) | pub enum IntDataTemporaryFiles {
  constant MAX_INT_DATA_TEMPORARY_FILES (line 99) | pub const MAX_INT_DATA_TEMPORARY_FILES: usize = IntDataTemporaryFiles::S...
  type StrDataTemporaryFiles (line 103) | pub enum StrDataTemporaryFiles {
  constant MAX_STR_DATA_TEMPORARY_FILES (line 108) | pub const MAX_STR_DATA_TEMPORARY_FILES: usize = StrDataTemporaryFiles::M...
  type IntDataSimilarImages (line 113) | pub enum IntDataSimilarImages {
  constant MAX_INT_DATA_SIMILAR_IMAGES (line 123) | pub const MAX_INT_DATA_SIMILAR_IMAGES: usize = IntDataSimilarImages::Sim...
  type StrDataSi
Condensed preview — 452 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (4,816K chars).
[
  {
    "path": ".cargo/config.toml",
    "chars": 394,
    "preview": "[target.x86_64-pc-windows-msvc]\n# Increase default stack size to avoid running out of stack\n# space in debug builds. The"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 140,
    "preview": "# These are supported funding model platforms\n\ngithub: qarmin # Replace with up to 4 GitHub Sponsors-enabled usernames e"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "chars": 2116,
    "preview": "---\nname: Bug report\nabout: Create a report to help us improve app\ntitle: ''\nlabels: bug\nassignees: ''\n\n---\n\n**Bug Descr"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "chars": 144,
    "preview": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: enhancement\nassignees: ''\n\n---\n\n**Fe"
  },
  {
    "path": ".github/workflows/android.yml",
    "chars": 2831,
    "preview": "name: 🤖 Android APK\n\non:\n  push:\n    branches: [ master, main ]\n  pull_request:\n    branches: [ master, main ]\n  workflo"
  },
  {
    "path": ".github/workflows/linux.yml",
    "chars": 17293,
    "preview": "name: 🐧 Linux\non:\n  push:\n  pull_request:\n  schedule:\n    - cron: '0 0 * * 2'\n\nenv:\n  CARGO_TERM_COLOR: always\n  CZKAWKA"
  },
  {
    "path": ".github/workflows/mac.yml",
    "chars": 7308,
    "preview": "name: 🍎 MacOS\non:\n  push:\n  pull_request:\n  schedule:\n    - cron: '0 0 * * 2'\n\nenv:\n  CARGO_TERM_COLOR: always\n  CZKAWKA"
  },
  {
    "path": ".github/workflows/quality.yml",
    "chars": 1176,
    "preview": "name: 🧹 Quality\non:\n  push:\n  pull_request:\n  schedule:\n    - cron: '0 0 * * 2'\n\nenv:\n  CARGO_TERM_COLOR: always\n\njobs:\n"
  },
  {
    "path": ".github/workflows/windows.yml",
    "chars": 11045,
    "preview": "name: 🏁 Windows\non:\n  push:\n  pull_request:\n  schedule:\n    - cron: '0 0 * * 2'\n\nenv:\n  CARGO_TERM_COLOR: always\n  CZKAW"
  },
  {
    "path": ".gitignore",
    "chars": 429,
    "preview": "/target\n.idea/\n*.iml\n*~\n*#\nresults*.txt\nTestSuite*\n*.snap\nflatpak/\n*.zip\n*.zst\n*.profraw\n*.profdata\n/lcov_report*\n/repor"
  },
  {
    "path": ".mailmap",
    "chars": 209,
    "preview": "TheEvilSkeleton <theevilskeleton@riseup.net> Proprietary Chrome-chan <theevilskeleton@riseup.net>\nRafał Mikrut <mikrutra"
  },
  {
    "path": ".rustfmt.toml",
    "chars": 165,
    "preview": "newline_style = \"Unix\"\nmax_width = 180\n\n# Enable only with nightly channel via - cargo +nightly fmt\nimports_granularity "
  },
  {
    "path": "Cargo.toml",
    "chars": 6975,
    "preview": "[workspace]\nmembers = [\n    \"czkawka_core\",\n    \"czkawka_cli\",\n    \"czkawka_gui\",\n    \"krokiet\",\n    \"cedinia\"\n]\nexclude"
  },
  {
    "path": "Changelog.md",
    "chars": 61397,
    "preview": "## Version 11.0.1 - 20.02.2026r\n### Core\n- Fixed issue with excluded folders not working on Windows - [#1808](https://gi"
  },
  {
    "path": "LICENSE_CC_BY_4_ICONS",
    "chars": 13728,
    "preview": "All icons, in this project are licensed under Creative Commons Attribution 4.0 International (CC BY 4.0).\n\nCopyright (c)"
  },
  {
    "path": "LICENSE_MIT_EVERYTHING_OUTSIDE_ANY_CARGO_APP_LIBRARY",
    "chars": 1073,
    "preview": "MIT License\n\nCopyright (c) 2020-2026 Rafał Mikrut\n\nPermission is hereby granted, free of charge, to any person obtaining"
  },
  {
    "path": "README.md",
    "chars": 13879,
    "preview": "<div align=\"center\"><img src=\"https://github.com/user-attachments/assets/f5e4b290-d001-4cf4-9f52-dab65a30e441\" alt=\"krok"
  },
  {
    "path": "cedinia/Cargo.toml",
    "chars": 3714,
    "preview": "[package]\nname = \"cedinia\"\nversion = \"11.0.1\"\nauthors = [\"Rafał Mikrut <mikrutrafal@protonmail.com>\"]\nedition = \"2024\"\nr"
  },
  {
    "path": "cedinia/LICENSE_CC_BY_4_ICONS",
    "chars": 13407,
    "preview": "Icons\nicons/*\nres/*\nui/icons/*\n\nCopyright (c) 2020-2026 Rafał Mikrut\n\nLicense: CC-BY-4.0\n Creative Commons Attribution 4"
  },
  {
    "path": "cedinia/LICENSE_GPL_APP",
    "chars": 34496,
    "preview": "GNU GENERAL PUBLIC LICENSE\nVersion 3, 29 June 2007\n\nCopyright © 2007 Free Software Foundation, Inc. <http://fsf.org/>\n\nE"
  },
  {
    "path": "cedinia/LICENSE_MIT_CODE",
    "chars": 1073,
    "preview": "MIT License\n\nCopyright (c) 2020-2026 Rafał Mikrut\n\nPermission is hereby granted, free of charge, to any person obtaining"
  },
  {
    "path": "cedinia/README.md",
    "chars": 1115,
    "preview": "# Cedinia\n\nCedinia is an experimental Android touch friendly GUI frontend for Czkawka Core, built with Slint. \n\nThe name"
  },
  {
    "path": "cedinia/TMP_INSTALL.md",
    "chars": 2589,
    "preview": "\n```shell\nexport JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64   # must be JDK 17, see note above\nexport ANDROID_HOME=$HO"
  },
  {
    "path": "cedinia/build.rs",
    "chars": 2817,
    "preview": "use std::env;\nuse std::path::PathBuf;\n\nfn main() {\n    slint_build::compile_with_config(\"ui/main_window.slint\", slint_bu"
  },
  {
    "path": "cedinia/i18n/en/cedinia.ftl",
    "chars": 7395,
    "preview": "# Cedinia – English (fallback)\n\n# App / top bar titles\napp_name = Cedinia\ntool_duplicate_files = Duplicates\ntool_empty_f"
  },
  {
    "path": "cedinia/i18n/pl/cedinia.ftl",
    "chars": 7008,
    "preview": "# Cedinia – Polski (Polish)\n\n# App / top bar titles\napp_name = Cedinia\ntool_duplicate_files = Duplikaty\ntool_empty_folde"
  },
  {
    "path": "cedinia/i18n.toml",
    "chars": 56,
    "preview": "fallback_language = \"en\"\n\n[fluent]\nassets_dir = \"i18n\"\n\n"
  },
  {
    "path": "cedinia/java/CediniaActivity.java",
    "chars": 2333,
    "preview": "// CediniaActivity.java\n// Thin NativeActivity subclass that intercepts onActivityResult and forwards\n// it to the Cedin"
  },
  {
    "path": "cedinia/java/CediniaFilePicker.java",
    "chars": 12627,
    "preview": "// CediniaFilePicker.java\n// Launches the Android Storage Access Framework folder picker and calls back into\n// Rust onc"
  },
  {
    "path": "cedinia/res/drawable/ic_launcher_background.xml",
    "chars": 205,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Dark navy background for the adaptive icon. -->\n<shape xmlns:android=\"http:/"
  },
  {
    "path": "cedinia/res/drawable/ic_launcher_foreground.xml",
    "chars": 185,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<inset xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:dra"
  },
  {
    "path": "cedinia/res/mipmap-anydpi-v26/ic_launcher.xml",
    "chars": 466,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Adaptive icon for Android 8.0+ (API 26+).\n     Uses a solid background + vec"
  },
  {
    "path": "cedinia/res/values/strings.xml",
    "chars": 109,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"app_name\">Cedinia</string>\n</resources>\n"
  },
  {
    "path": "cedinia/src/app.rs",
    "chars": 29960,
    "preview": "use std::path::PathBuf;\nuse std::rc::Rc;\nuse std::sync::Arc;\nuse std::sync::atomic::{AtomicBool, AtomicU32, Ordering};\n\n"
  },
  {
    "path": "cedinia/src/bin/cedinia.rs",
    "chars": 38,
    "preview": "fn main() {\n    cedinia::run_app();\n}\n"
  },
  {
    "path": "cedinia/src/callbacks/directories.rs",
    "chars": 5365,
    "preview": "use std::path::PathBuf;\nuse std::rc::Rc;\n\nuse slint::{ComponentHandle, ModelRc, SharedString, VecModel};\n\nuse crate::vol"
  },
  {
    "path": "cedinia/src/callbacks/misc.rs",
    "chars": 8481,
    "preview": "use std::path::{Path, PathBuf};\nuse std::rc::Rc;\nuse std::sync::Arc;\nuse std::sync::atomic::{AtomicBool, Ordering};\n\nuse"
  },
  {
    "path": "cedinia/src/callbacks/scan.rs",
    "chars": 10317,
    "preview": "use std::path::PathBuf;\nuse std::rc::Rc;\nuse std::sync::Arc;\nuse std::sync::atomic::{AtomicBool, AtomicU32, Ordering};\n\n"
  },
  {
    "path": "cedinia/src/callbacks/selection.rs",
    "chars": 31783,
    "preview": "use std::rc::Rc;\nuse std::sync::Arc;\nuse std::sync::atomic::{AtomicBool, Ordering};\n\nuse slint::{ComponentHandle, Model,"
  },
  {
    "path": "cedinia/src/callbacks.rs",
    "chars": 380,
    "preview": "mod directories;\nmod misc;\nmod scan;\nmod selection;\n\npub(crate) use directories::{build_dir_model, wire_directories};\npu"
  },
  {
    "path": "cedinia/src/common.rs",
    "chars": 1923,
    "preview": "pub const STR_IDX_NAME: usize = 0;\npub const STR_IDX_PATH: usize = 1;\npub const STR_IDX_SIZE: usize = 2;\npub const STR_I"
  },
  {
    "path": "cedinia/src/file_picker_android.rs",
    "chars": 11984,
    "preview": "use std::ffi::c_void;\nuse std::sync::{Arc, Mutex};\n\nuse android_activity::AndroidApp;\nuse jni::objects::{Global, JClass,"
  },
  {
    "path": "cedinia/src/lib.rs",
    "chars": 3858,
    "preview": "#![allow(clippy::unwrap_used)]\n#![allow(clippy::indexing_slicing)]\n#![allow(clippy::todo)]\nmod app;\nmod callbacks;\npub m"
  },
  {
    "path": "cedinia/src/localizer_cedinia.rs",
    "chars": 2049,
    "preview": "use i18n_embed::fluent::{FluentLanguageLoader, fluent_language_loader};\nuse i18n_embed::{DefaultLocalizer, LanguageLoade"
  },
  {
    "path": "cedinia/src/model.rs",
    "chars": 1347,
    "preview": "use slint::{Model, ModelRc, SharedString, VecModel};\n\nuse crate::FileEntry;\nuse crate::scan_runner::FileItem;\n\npub fn ma"
  },
  {
    "path": "cedinia/src/scan_runner.rs",
    "chars": 15779,
    "preview": "use std::path::PathBuf;\nuse std::sync::Arc;\nuse std::sync::atomic::AtomicBool;\nuse std::thread;\n\nuse crossbeam_channel::"
  },
  {
    "path": "cedinia/src/scanners.rs",
    "chars": 19722,
    "preview": "use std::cmp::Reverse;\nuse std::path::PathBuf;\nuse std::sync::Arc;\nuse std::sync::atomic::AtomicBool;\n\nuse czkawka_core:"
  },
  {
    "path": "cedinia/src/set_initial_gui_infos.rs",
    "chars": 2845,
    "preview": "use slint::{ComponentHandle, Model, SharedString};\n\nuse crate::settings::gui_settings_values::StringComboBoxItems;\nuse c"
  },
  {
    "path": "cedinia/src/settings/gui_settings_values.rs",
    "chars": 7642,
    "preview": "use std::fmt::Debug;\n\nuse czkawka_core::common::model::{CheckingMethod, HashType};\nuse czkawka_core::re_exported::{Filte"
  },
  {
    "path": "cedinia/src/settings/mod.rs",
    "chars": 18355,
    "preview": "pub mod gui_settings_values;\n\nuse std::path::PathBuf;\n\nuse czkawka_core::common::config_cache_path::get_config_cache_pat"
  },
  {
    "path": "cedinia/src/thumbnail_loader.rs",
    "chars": 9389,
    "preview": "use std::collections::hash_map::DefaultHasher;\nuse std::hash::{Hash, Hasher};\nuse std::path::{Path, PathBuf};\nuse std::s"
  },
  {
    "path": "cedinia/src/translations.rs",
    "chars": 13362,
    "preview": "use slint::ComponentHandle;\n\nuse crate::{MainWindow, Translations, flc};\n\npub(crate) fn translate_items(app: &MainWindow"
  },
  {
    "path": "cedinia/src/volumes.rs",
    "chars": 5696,
    "preview": "use std::path::PathBuf;\nuse std::sync::Arc;\nuse std::sync::atomic::{AtomicBool, Ordering};\n\nuse slint::{ComponentHandle,"
  },
  {
    "path": "cedinia/ui/app_state.slint",
    "chars": 7614,
    "preview": "import { ActiveTool, CollectTestResult, ProgressData, ScanState, VolumeEntry } from \"common.slint\";\n\nexport global Gener"
  },
  {
    "path": "cedinia/ui/bottom_nav.slint",
    "chars": 6330,
    "preview": "import { CediniaColors } from \"colors.slint\";\nimport { ActiveTool } from \"common.slint\";\nimport { AppState } from \"app_s"
  },
  {
    "path": "cedinia/ui/colors.slint",
    "chars": 1178,
    "preview": "export global CediniaColors {\n\n    out property <color> bg_primary:    #0d0d0d;       out property <color> bg_surface:  "
  },
  {
    "path": "cedinia/ui/common.slint",
    "chars": 1441,
    "preview": "export enum SettingsTab {\n    General,\n    Tools,\n    Diagnostics,\n}\n\nexport enum ActiveTool {\n    Home,\n    DuplicateFi"
  },
  {
    "path": "cedinia/ui/components.slint",
    "chars": 8379,
    "preview": "import { CediniaColors } from \"colors.slint\";\nimport { FileEntryIdx } from \"common.slint\";\n\nexport component TouchButton"
  },
  {
    "path": "cedinia/ui/directories_screen.slint",
    "chars": 12910,
    "preview": "import { CediniaColors } from \"colors.slint\";\nimport { DirectoryEntry } from \"common.slint\";\nimport { AppState } from \"a"
  },
  {
    "path": "cedinia/ui/home_screen.slint",
    "chars": 6054,
    "preview": "import { CediniaColors } from \"colors.slint\";\nimport { ActiveTool } from \"common.slint\";\nimport { AppState } from \"app_s"
  },
  {
    "path": "cedinia/ui/main_window.slint",
    "chars": 12748,
    "preview": "import { CediniaColors } from \"colors.slint\";\nimport { ActiveTool, DirectoryEntry, FileEntry, ScanState, SimilarGroupCar"
  },
  {
    "path": "cedinia/ui/results_list.slint",
    "chars": 21583,
    "preview": "import { CediniaColors } from \"colors.slint\";\nimport { FileEntry, FileEntryIdx, ScanState } from \"common.slint\";\nimport "
  },
  {
    "path": "cedinia/ui/scan_progress.slint",
    "chars": 2744,
    "preview": "import { CediniaColors } from \"colors.slint\";\nimport { AppState } from \"app_state.slint\";\nimport { ScanState } from \"com"
  },
  {
    "path": "cedinia/ui/settings_components.slint",
    "chars": 11019,
    "preview": "import { CediniaColors } from \"colors.slint\";\nimport { AppState } from \"app_state.slint\";\n\nexport component ToggleRow {\n"
  },
  {
    "path": "cedinia/ui/settings_screen.slint",
    "chars": 28139,
    "preview": "import { CediniaColors } from \"colors.slint\";\nimport { Divider, TouchButton } from \"components.slint\";\nimport { AppState"
  },
  {
    "path": "cedinia/ui/similar_images_gallery.slint",
    "chars": 22199,
    "preview": "import { CediniaColors } from \"colors.slint\";\nimport { ScanState, SimilarGroupCard } from \"common.slint\";\nimport { AppSt"
  },
  {
    "path": "cedinia/ui/top_bar.slint",
    "chars": 1968,
    "preview": "import { CediniaColors } from \"colors.slint\";\nimport { AppState } from \"app_state.slint\";\nimport { ScanState } from \"com"
  },
  {
    "path": "cedinia/ui/translations.slint",
    "chars": 15108,
    "preview": "export global Translations {\n    // App / top bar titles\n    in-out property <string> app_name_text:                \"Ced"
  },
  {
    "path": "ci_tester/Cargo.toml",
    "chars": 314,
    "preview": "[package]\nname = \"ci_tester\"\nversion = \"0.1.0\"\nedition = \"2021\"\n\n# See more keys and their definitions at https://doc.ru"
  },
  {
    "path": "ci_tester/src/main.rs",
    "chars": 18913,
    "preview": "use std::collections::BTreeSet;\nuse std::fs;\nuse std::process::{Command, Stdio};\nuse std::env;\nuse log::info;\nuse std::p"
  },
  {
    "path": "clippy.toml",
    "chars": 103,
    "preview": "allow-indexing-slicing-in-tests = true\nallow-unwrap-in-tests = true\navoid-breaking-exported-api = false"
  },
  {
    "path": "czkawka_cli/Cargo.toml",
    "chars": 1027,
    "preview": "[package]\nname = \"czkawka_cli\"\nversion = \"11.0.1\"\nauthors = [\"Rafał Mikrut <mikrutrafal@protonmail.com>\"]\nedition = \"202"
  },
  {
    "path": "czkawka_cli/LICENSE_MIT",
    "chars": 1073,
    "preview": "MIT License\n\nCopyright (c) 2020-2026 Rafał Mikrut\n\nPermission is hereby granted, free of charge, to any person obtaining"
  },
  {
    "path": "czkawka_cli/README.md",
    "chars": 2260,
    "preview": "# Czkawka CLI\n\nCLI frontend that allows you to use Czkawka from the terminal.\n\n## Requirements\n\nPrecompiled binaries sho"
  },
  {
    "path": "czkawka_cli/src/commands.rs",
    "chars": 47946,
    "preview": "use std::path::PathBuf;\n\n#[cfg(not(feature = \"no_colors\"))]\nuse clap::builder::Styles;\n#[cfg(not(feature = \"no_colors\"))"
  },
  {
    "path": "czkawka_cli/src/main.rs",
    "chars": 24735,
    "preview": "use std::path::PathBuf;\nuse std::sync::Arc;\nuse std::sync::atomic::AtomicBool;\nuse std::thread;\n\nuse clap::Parser;\nuse c"
  },
  {
    "path": "czkawka_cli/src/progress.rs",
    "chars": 6432,
    "preview": "use std::time::Duration;\n\nuse crossbeam_channel::Receiver;\nuse czkawka_core::common::model::ToolType;\nuse czkawka_core::"
  },
  {
    "path": "czkawka_core/Cargo.toml",
    "chars": 3601,
    "preview": "[package]\nname = \"czkawka_core\"\nversion = \"11.0.1\"\nauthors = [\"Rafał Mikrut <mikrutrafal@protonmail.com>\"]\nedition = \"20"
  },
  {
    "path": "czkawka_core/LICENSE_CC_BY_4_TEST_FILES",
    "chars": 13567,
    "preview": "All icons and audio files, in this project are licensed under Creative Commons Attribution 4.0 International (CC BY 4.0)"
  },
  {
    "path": "czkawka_core/LICENSE_MIT",
    "chars": 1073,
    "preview": "MIT License\n\nCopyright (c) 2020-2026 Rafał Mikrut\n\nPermission is hereby granted, free of charge, to any person obtaining"
  },
  {
    "path": "czkawka_core/README.md",
    "chars": 62,
    "preview": "# Czkawka Core\n\nCore of Czkawka GUI/CLI and Krokiet projects.\n"
  },
  {
    "path": "czkawka_core/benches/hash_calculation_benchmark.rs",
    "chars": 2445,
    "preview": "use std::env::temp_dir;\nuse std::fs::File;\nuse std::hint::black_box;\nuse std::io::Write;\nuse std::path::PathBuf;\nuse std"
  },
  {
    "path": "czkawka_core/build.rs",
    "chars": 2677,
    "preview": "fn main() {\n    let rust_version = match rustc_version::version_meta() {\n        Ok(meta) => {\n            let rust_v = "
  },
  {
    "path": "czkawka_core/i18n/ar/czkawka_core.ftl",
    "chars": 8769,
    "preview": "# Core\ncore_similarity_original = الأصل\ncore_similarity_very_high = عالية جدا\ncore_similarity_high = مرتفع\ncore_similari"
  },
  {
    "path": "czkawka_core/i18n/bg/czkawka_core.ftl",
    "chars": 9871,
    "preview": "# Core\ncore_similarity_original = Оригинален\ncore_similarity_very_high = Много високо\ncore_similarity_high = Високо\ncore"
  },
  {
    "path": "czkawka_core/i18n/cs/czkawka_core.ftl",
    "chars": 9304,
    "preview": "# Core\ncore_similarity_original = Originál\ncore_similarity_very_high = Velmi vysoká\ncore_similarity_high = Vysoká\ncore_s"
  },
  {
    "path": "czkawka_core/i18n/de/czkawka_core.ftl",
    "chars": 10348,
    "preview": "# Core\ncore_similarity_original = Original\ncore_similarity_very_high = Sehr Hoch\ncore_similarity_high = Hoch\ncore_simila"
  },
  {
    "path": "czkawka_core/i18n/el/czkawka_core.ftl",
    "chars": 10321,
    "preview": "# Core\ncore_similarity_original = Αρχικό\ncore_similarity_very_high = Πολύ Υψηλή\ncore_similarity_high = Υψηλή\ncore_simila"
  },
  {
    "path": "czkawka_core/i18n/en/czkawka_core.ftl",
    "chars": 9379,
    "preview": "# Core\ncore_similarity_original = Original\ncore_similarity_very_high = Very High\ncore_similarity_high = High\ncore_simila"
  },
  {
    "path": "czkawka_core/i18n/es-ES/czkawka_core.ftl",
    "chars": 10267,
    "preview": "# Core\ncore_similarity_original = Original\ncore_similarity_very_high = Muy alta\ncore_similarity_high = Alta\ncore_similar"
  },
  {
    "path": "czkawka_core/i18n/fa/czkawka_core.ftl",
    "chars": 9392,
    "preview": "# Core\ncore_similarity_original = اصولی\ncore_similarity_very_high = بسیار بلند\ncore_similarity_high = ارتفاع\ncore_simila"
  },
  {
    "path": "czkawka_core/i18n/fr/czkawka_core.ftl",
    "chars": 10513,
    "preview": "# Core\ncore_similarity_original = Originale\ncore_similarity_very_high = Très haute\ncore_similarity_high = Haute\ncore_sim"
  },
  {
    "path": "czkawka_core/i18n/it/czkawka_core.ftl",
    "chars": 10262,
    "preview": "# Core\ncore_similarity_original = Originali\ncore_similarity_very_high = Altissima\ncore_similarity_high = Alta\ncore_simil"
  },
  {
    "path": "czkawka_core/i18n/ja/czkawka_core.ftl",
    "chars": 7335,
    "preview": "# Core\ncore_similarity_original = 新規に作成\ncore_similarity_very_high = 非常に高い\ncore_similarity_high = 高い\ncore_similarity_medi"
  },
  {
    "path": "czkawka_core/i18n/ko/czkawka_core.ftl",
    "chars": 7515,
    "preview": "# Core\ncore_similarity_original = 원본\ncore_similarity_very_high = 매우 높음\ncore_similarity_high = 높음\ncore_similarity_medium "
  },
  {
    "path": "czkawka_core/i18n/nl/czkawka_core.ftl",
    "chars": 9975,
    "preview": "# Core\ncore_similarity_original = Origineel\ncore_similarity_very_high = Zeer hoog\ncore_similarity_high = hoog\ncore_simil"
  },
  {
    "path": "czkawka_core/i18n/no/czkawka_core.ftl",
    "chars": 9400,
    "preview": "# Core\ncore_similarity_original = Opprinnelig\ncore_similarity_very_high = Veldig høy\ncore_similarity_high = Høy\ncore_sim"
  },
  {
    "path": "czkawka_core/i18n/pl/czkawka_core.ftl",
    "chars": 9943,
    "preview": "# Core\ncore_similarity_original = Oryginalny\ncore_similarity_very_high = Bardzo Duże\ncore_similarity_high = Duże\ncore_si"
  },
  {
    "path": "czkawka_core/i18n/pt-BR/czkawka_core.ftl",
    "chars": 10523,
    "preview": "# Core\ncore_similarity_original = Please provide the text to translate\ncore_similarity_very_high = Muito grande\ncore_sim"
  },
  {
    "path": "czkawka_core/i18n/pt-PT/czkawka_core.ftl",
    "chars": 9903,
    "preview": "# Core\ncore_similarity_original = Original\ncore_similarity_very_high = Muito alto\ncore_similarity_high = Alto\ncore_simil"
  },
  {
    "path": "czkawka_core/i18n/ro/czkawka_core.ftl",
    "chars": 9792,
    "preview": "# Core\ncore_similarity_original = Originală\ncore_similarity_very_high = Foarte Mare\ncore_similarity_high = Ridicat\ncore_"
  },
  {
    "path": "czkawka_core/i18n/ru/czkawka_core.ftl",
    "chars": 9700,
    "preview": "# Core\ncore_similarity_original = Оригинальное\ncore_similarity_very_high = Очень высокое\ncore_similarity_high = Высокое\n"
  },
  {
    "path": "czkawka_core/i18n/sv-SE/czkawka_core.ftl",
    "chars": 9690,
    "preview": "# Core\ncore_similarity_original = Ursprunglig\ncore_similarity_very_high = Mycket Hög\ncore_similarity_high = Hög\ncore_sim"
  },
  {
    "path": "czkawka_core/i18n/tr/czkawka_core.ftl",
    "chars": 9468,
    "preview": "# Core\ncore_similarity_original = Asıl\ncore_similarity_very_high = Çok Yüksek\ncore_similarity_high = Yüksek\ncore_similar"
  },
  {
    "path": "czkawka_core/i18n/uk/czkawka_core.ftl",
    "chars": 9669,
    "preview": "# Core\ncore_similarity_original = Оригінал\ncore_similarity_very_high = Дуже висока\ncore_similarity_high = Висока\ncore_si"
  },
  {
    "path": "czkawka_core/i18n/zh-CN/czkawka_core.ftl",
    "chars": 6301,
    "preview": "# Core\ncore_similarity_original = 原版\ncore_similarity_very_high = 非常高\ncore_similarity_high = 高\ncore_similarity_medium = 中"
  },
  {
    "path": "czkawka_core/i18n/zh-TW/czkawka_core.ftl",
    "chars": 6636,
    "preview": "# Core\ncore_similarity_original = 原始\ncore_similarity_very_high = 極高\ncore_similarity_high = 高\ncore_similarity_medium = 中等"
  },
  {
    "path": "czkawka_core/i18n.toml",
    "chars": 457,
    "preview": "# (Required) The language identifier of the language used in the\n# source code for gettext system, and the primary fallb"
  },
  {
    "path": "czkawka_core/src/common/basic_gui_cli.rs",
    "chars": 8943,
    "preview": "use std::process;\n\nuse log::{error, warn};\n\nuse crate::common::config_cache_path::get_config_cache_path;\nuse crate::{CZK"
  },
  {
    "path": "czkawka_core/src/common/cache/cleaning.rs",
    "chars": 28978,
    "preview": "use std::fs;\nuse std::io::{BufReader, BufWriter};\nuse std::path::Path;\nuse std::sync::Arc;\nuse std::sync::atomic::{Atomi"
  },
  {
    "path": "czkawka_core/src/common/cache.rs",
    "chars": 28037,
    "preview": "#![allow(clippy::useless_let_if_seq)]\n\nmod cleaning;\n\nuse std::collections::BTreeMap;\nuse std::io::{BufReader, BufWriter"
  },
  {
    "path": "czkawka_core/src/common/config_cache_path.rs",
    "chars": 8947,
    "preview": "use std::fs::{File, OpenOptions};\nuse std::path::PathBuf;\nuse std::{env, fs};\n\nuse directories_next::ProjectDirs;\nuse lo"
  },
  {
    "path": "czkawka_core/src/common/consts.rs",
    "chars": 3135,
    "preview": "pub const DEFAULT_THREAD_SIZE: usize = 8 * 1024 * 1024; // 8 MB\npub const DEFAULT_WORKER_THREAD_SIZE: usize = 4 * 1024 *"
  },
  {
    "path": "czkawka_core/src/common/dir_traversal.rs",
    "chars": 36648,
    "preview": "use std::collections::BTreeMap;\nuse std::fs;\nuse std::fs::{DirEntry, FileType, Metadata};\n#[cfg(target_family = \"unix\")]"
  },
  {
    "path": "czkawka_core/src/common/directories.rs",
    "chars": 18343,
    "preview": "use std::path::{Path, PathBuf};\n#[cfg(target_family = \"unix\")]\nuse std::{fs, os::unix::fs::MetadataExt};\n\nuse crate::com"
  },
  {
    "path": "czkawka_core/src/common/extensions.rs",
    "chars": 10019,
    "preview": "use std::ffi::OsStr;\n\nuse indexmap::IndexSet;\n\nuse crate::common::consts::{AUDIO_FILES_EXTENSIONS, IMAGE_RS_EXTENSIONS, "
  },
  {
    "path": "czkawka_core/src/common/ffmpeg_utils.rs",
    "chars": 805,
    "preview": "use std::process::{Command, Stdio};\n\nuse crate::common::process_utils::disable_windows_console_window;\n\npub fn check_if_"
  },
  {
    "path": "czkawka_core/src/common/image.rs",
    "chars": 13018,
    "preview": "use std::fmt::Debug;\nuse std::fs::File;\nuse std::panic;\nuse std::path::Path;\n\nuse fast_image_resize::{FilterType as FirF"
  },
  {
    "path": "czkawka_core/src/common/items.rs",
    "chars": 6739,
    "preview": "use std::path::Path;\n\nuse crate::common::regex_check;\nuse crate::helpers::messages::Messages;\n\n#[cfg(target_family = \"un"
  },
  {
    "path": "czkawka_core/src/common/logger.rs",
    "chars": 7310,
    "preview": "use std::env;\n\nuse file_rotate::compression::Compression;\nuse file_rotate::suffix::{AppendTimestamp, FileLimit};\nuse fil"
  },
  {
    "path": "czkawka_core/src/common/mod.rs",
    "chars": 31131,
    "preview": "pub mod basic_gui_cli;\npub mod cache;\npub mod config_cache_path;\npub mod consts;\npub mod dir_traversal;\npub mod director"
  },
  {
    "path": "czkawka_core/src/common/model.rs",
    "chars": 3157,
    "preview": "use std::path::{Path, PathBuf};\n\nuse serde::{Deserialize, Serialize};\nuse xxhash_rust::xxh3::Xxh3;\n\nuse crate::common::t"
  },
  {
    "path": "czkawka_core/src/common/process_utils.rs",
    "chars": 5088,
    "preview": "use std::process::{Command, Stdio};\nuse std::sync::atomic::{AtomicBool, Ordering};\nuse std::sync::{Arc, Mutex};\nuse std:"
  },
  {
    "path": "czkawka_core/src/common/progress_data.rs",
    "chars": 14331,
    "preview": "use log::error;\n\nuse crate::common::model::{CheckingMethod, ToolType};\n// Empty files\n// 0 - Collecting files\n\n// Empty "
  },
  {
    "path": "czkawka_core/src/common/progress_stop_handler.rs",
    "chars": 7228,
    "preview": "use std::sync::atomic::{AtomicBool, AtomicU64, AtomicUsize};\nuse std::sync::{Arc, atomic};\nuse std::thread;\nuse std::thr"
  },
  {
    "path": "czkawka_core/src/common/tool_data.rs",
    "chars": 44198,
    "preview": "use std::path::PathBuf;\nuse std::sync::Arc;\nuse std::sync::atomic::AtomicBool;\nuse std::time::Duration;\n\nuse crossbeam_c"
  },
  {
    "path": "czkawka_core/src/common/traits.rs",
    "chars": 5790,
    "preview": "use std::fs::File;\nuse std::io::{BufWriter, Write};\nuse std::path::Path;\nuse std::sync::Arc;\nuse std::sync::atomic::Atom"
  },
  {
    "path": "czkawka_core/src/common/video_utils.rs",
    "chars": 9874,
    "preview": "use std::fs;\nuse std::path::{Path, PathBuf};\nuse std::process::{Command, Stdio};\nuse std::sync::Arc;\nuse std::sync::atom"
  },
  {
    "path": "czkawka_core/src/helpers/audio_checker.rs",
    "chars": 1573,
    "preview": "use std::fs::File;\nuse std::io;\n\nuse symphonia::core::codecs::CODEC_TYPE_NULL;\nuse symphonia::core::errors::Error;\nuse s"
  },
  {
    "path": "czkawka_core/src/helpers/debug_timer.rs",
    "chars": 5225,
    "preview": "use std::time::{Duration, Instant};\n\n/// Timer for measuring elapsed time between checkpoints.\n///\n/// # How to use - ex"
  },
  {
    "path": "czkawka_core/src/helpers/delayed_sender.rs",
    "chars": 6121,
    "preview": "//! DelayedSender: A utility for batching or throttling messages sent between threads.\n\nuse std::sync::atomic::AtomicBoo"
  },
  {
    "path": "czkawka_core/src/helpers/ffprobe.rs",
    "chars": 9571,
    "preview": "//! Simple wrapper for the [ffprobe](https://ffmpeg.org/ffprobe.html) CLI utility,\n//! which is part of the ffmpeg tool "
  },
  {
    "path": "czkawka_core/src/helpers/messages.rs",
    "chars": 7994,
    "preview": "//! Messages: Utility for collecting and printing messages, warnings, and errors.\n\nuse crate::flc;\n\n/// Stores messages,"
  },
  {
    "path": "czkawka_core/src/helpers/mod.rs",
    "chars": 199,
    "preview": "//! Helper modules: generic utilities, traits, structs, ready to copy/paste to other projects.\n\npub mod audio_checker;\np"
  },
  {
    "path": "czkawka_core/src/lib.rs",
    "chars": 348,
    "preview": "pub mod common;\npub mod helpers;\npub mod localizer_core;\npub mod tools;\n\npub mod re_exported {\n    pub use fast_image_re"
  },
  {
    "path": "czkawka_core/src/localizer_core.rs",
    "chars": 1272,
    "preview": "use std::collections::HashMap;\n\nuse i18n_embed::fluent::{FluentLanguageLoader, fluent_language_loader};\nuse i18n_embed::"
  },
  {
    "path": "czkawka_core/src/tools/bad_extensions/core.rs",
    "chars": 9148,
    "preview": "use std::collections::BTreeSet;\nuse std::mem;\nuse std::sync::Arc;\nuse std::sync::atomic::{AtomicBool, AtomicUsize, Order"
  },
  {
    "path": "czkawka_core/src/tools/bad_extensions/mod.rs",
    "chars": 1650,
    "preview": "pub mod core;\n#[cfg(test)]\nmod tests;\npub mod traits;\nmod workarounds;\n\nuse std::path::{Path, PathBuf};\nuse std::time::D"
  },
  {
    "path": "czkawka_core/src/tools/bad_extensions/tests.rs",
    "chars": 3922,
    "preview": "use std::fs;\nuse std::io::Write;\nuse std::sync::Arc;\nuse std::sync::atomic::AtomicBool;\n\nuse tempfile::TempDir;\n\nuse cra"
  },
  {
    "path": "czkawka_core/src/tools/bad_extensions/traits.rs",
    "chars": 3954,
    "preview": "use std::io::Write;\nuse std::sync::Arc;\nuse std::sync::atomic::AtomicBool;\nuse std::time::Instant;\n\nuse crossbeam_channe"
  },
  {
    "path": "czkawka_core/src/tools/bad_extensions/workarounds.rs",
    "chars": 5269,
    "preview": "pub(crate) const DISABLED_EXTENSIONS: &[&str] = &[\"file\", \"cache\", \"bak\", \"data\", \"tmp\"]; // Such files can have any typ"
  },
  {
    "path": "czkawka_core/src/tools/bad_names/core.rs",
    "chars": 8942,
    "preview": "use std::path::Path;\nuse std::sync::Arc;\nuse std::sync::atomic::AtomicBool;\nuse std::{fs, mem};\n\nuse crossbeam_channel::"
  },
  {
    "path": "czkawka_core/src/tools/bad_names/mod.rs",
    "chars": 2831,
    "preview": "pub mod core;\n#[cfg(test)]\nmod tests;\npub mod traits;\n\nuse std::path::{Path, PathBuf};\nuse std::time::Duration;\n\nuse ser"
  },
  {
    "path": "czkawka_core/src/tools/bad_names/tests.rs",
    "chars": 24168,
    "preview": "#[cfg(test)]\nmod tests2 {\n    use std::fs;\n    use std::sync::Arc;\n    use std::sync::atomic::AtomicBool;\n\n    use crate"
  },
  {
    "path": "czkawka_core/src/tools/bad_names/traits.rs",
    "chars": 4278,
    "preview": "use std::io::Write;\nuse std::sync::Arc;\nuse std::sync::atomic::AtomicBool;\nuse std::time::Instant;\n\nuse crossbeam_channe"
  },
  {
    "path": "czkawka_core/src/tools/big_file/core.rs",
    "chars": 2302,
    "preview": "use std::cmp::Reverse;\nuse std::sync::Arc;\nuse std::sync::atomic::AtomicBool;\n\nuse crossbeam_channel::Sender;\nuse fun_ti"
  },
  {
    "path": "czkawka_core/src/tools/big_file/mod.rs",
    "chars": 989,
    "preview": "pub mod core;\n#[cfg(test)]\nmod tests;\npub mod traits;\n\nuse std::time::Duration;\n\nuse crate::common::model::FileEntry;\nus"
  },
  {
    "path": "czkawka_core/src/tools/big_file/tests.rs",
    "chars": 3238,
    "preview": "use std::fs;\nuse std::sync::Arc;\nuse std::sync::atomic::AtomicBool;\n\nuse tempfile::TempDir;\n\nuse crate::common::tool_dat"
  },
  {
    "path": "czkawka_core/src/tools/big_file/traits.rs",
    "chars": 4173,
    "preview": "use std::io::Write;\nuse std::sync::Arc;\nuse std::sync::atomic::AtomicBool;\nuse std::time::Instant;\n\nuse crossbeam_channe"
  },
  {
    "path": "czkawka_core/src/tools/broken_files/core.rs",
    "chars": 16587,
    "preview": "use std::collections::BTreeMap;\nuse std::fs::File;\nuse std::path::Path;\nuse std::process::Command;\nuse std::sync::Arc;\nu"
  },
  {
    "path": "czkawka_core/src/tools/broken_files/mod.rs",
    "chars": 2270,
    "preview": "use bitflags::bitflags;\n\npub mod core;\n#[cfg(test)]\nmod tests;\npub mod traits;\n\nuse std::collections::BTreeMap;\nuse std:"
  },
  {
    "path": "czkawka_core/src/tools/broken_files/tests.rs",
    "chars": 6894,
    "preview": "use std::fs;\nuse std::path::PathBuf;\nuse std::sync::Arc;\nuse std::sync::atomic::AtomicBool;\n\nuse tempfile::TempDir;\n\nuse"
  },
  {
    "path": "czkawka_core/src/tools/broken_files/traits.rs",
    "chars": 5168,
    "preview": "use std::io::Write;\nuse std::sync::Arc;\nuse std::sync::atomic::AtomicBool;\nuse std::time::Instant;\n\nuse crossbeam_channe"
  },
  {
    "path": "czkawka_core/src/tools/duplicate/core.rs",
    "chars": 37053,
    "preview": "use std::collections::BTreeMap;\nuse std::path::Path;\nuse std::sync::Arc;\nuse std::sync::atomic::AtomicBool;\nuse std::tim"
  },
  {
    "path": "czkawka_core/src/tools/duplicate/mod.rs",
    "chars": 14103,
    "preview": "pub mod core;\n#[cfg(test)]\nmod tests;\npub mod traits;\n\nuse std::cell::RefCell;\nuse std::collections::BTreeMap;\nuse std::"
  },
  {
    "path": "czkawka_core/src/tools/duplicate/tests.rs",
    "chars": 5258,
    "preview": "use std::fs;\nuse std::sync::Arc;\nuse std::sync::atomic::AtomicBool;\n\nuse tempfile::TempDir;\n\nuse crate::common::model::{"
  },
  {
    "path": "czkawka_core/src/tools/duplicate/traits.rs",
    "chars": 19387,
    "preview": "use std::io::prelude::*;\nuse std::io::{self};\nuse std::sync::Arc;\nuse std::sync::atomic::AtomicBool;\nuse std::time::Inst"
  },
  {
    "path": "czkawka_core/src/tools/empty_files/core.rs",
    "chars": 1739,
    "preview": "use std::sync::Arc;\nuse std::sync::atomic::AtomicBool;\n\nuse crossbeam_channel::Sender;\nuse fun_time::fun_time;\nuse log::"
  },
  {
    "path": "czkawka_core/src/tools/empty_files/mod.rs",
    "chars": 686,
    "preview": "pub mod core;\n#[cfg(test)]\nmod tests;\npub mod traits;\n\nuse std::time::Duration;\n\nuse crate::common::model::FileEntry;\nus"
  },
  {
    "path": "czkawka_core/src/tools/empty_files/tests.rs",
    "chars": 2366,
    "preview": "use std::fs;\nuse std::sync::Arc;\nuse std::sync::atomic::AtomicBool;\n\nuse tempfile::TempDir;\n\nuse crate::common::tool_dat"
  },
  {
    "path": "czkawka_core/src/tools/empty_files/traits.rs",
    "chars": 3594,
    "preview": "use std::io::prelude::*;\nuse std::sync::Arc;\nuse std::sync::atomic::AtomicBool;\nuse std::time::Instant;\n\nuse crossbeam_c"
  },
  {
    "path": "czkawka_core/src/tools/empty_folder/core.rs",
    "chars": 10089,
    "preview": "use std::fs::DirEntry;\nuse std::path::{Path, PathBuf};\nuse std::sync::Arc;\nuse std::sync::atomic::AtomicBool;\n\nuse cross"
  },
  {
    "path": "czkawka_core/src/tools/empty_folder/mod.rs",
    "chars": 1309,
    "preview": "pub mod core;\n#[cfg(test)]\nmod tests;\npub mod traits;\n\nuse std::path::{Path, PathBuf};\nuse std::time::Duration;\n\nuse ind"
  },
  {
    "path": "czkawka_core/src/tools/empty_folder/tests.rs",
    "chars": 3208,
    "preview": "use std::fs;\nuse std::sync::Arc;\nuse std::sync::atomic::AtomicBool;\n\nuse tempfile::TempDir;\n\nuse crate::common::tool_dat"
  },
  {
    "path": "czkawka_core/src/tools/empty_folder/traits.rs",
    "chars": 4052,
    "preview": "use std::io::Write;\nuse std::sync::Arc;\nuse std::sync::atomic::AtomicBool;\nuse std::time::Instant;\n\nuse crossbeam_channe"
  },
  {
    "path": "czkawka_core/src/tools/exif_remover/core.rs",
    "chars": 15060,
    "preview": "use std::collections::BTreeMap;\nuse std::path::Path;\nuse std::sync::Arc;\nuse std::sync::atomic::AtomicBool;\nuse std::{fs"
  },
  {
    "path": "czkawka_core/src/tools/exif_remover/mod.rs",
    "chars": 1874,
    "preview": "pub mod core;\n#[cfg(test)]\nmod tests;\npub mod traits;\n\nuse std::collections::BTreeMap;\nuse std::path::PathBuf;\nuse std::"
  },
  {
    "path": "czkawka_core/src/tools/exif_remover/tests.rs",
    "chars": 2259,
    "preview": "use std::fs;\nuse std::path::PathBuf;\nuse std::sync::Arc;\nuse std::sync::atomic::AtomicBool;\n\nuse tempfile::TempDir;\n\nuse"
  },
  {
    "path": "czkawka_core/src/tools/exif_remover/traits.rs",
    "chars": 4896,
    "preview": "use std::io::Write;\nuse std::sync::Arc;\nuse std::sync::atomic::AtomicBool;\nuse std::time::Instant;\n\nuse crossbeam_channe"
  },
  {
    "path": "czkawka_core/src/tools/invalid_symlinks/core.rs",
    "chars": 3637,
    "preview": "use std::path::{Path, PathBuf};\nuse std::sync::Arc;\nuse std::sync::atomic::AtomicBool;\n\nuse crossbeam_channel::Sender;\nu"
  },
  {
    "path": "czkawka_core/src/tools/invalid_symlinks/mod.rs",
    "chars": 2502,
    "preview": "pub mod core;\n#[cfg(test)]\nmod tests;\npub mod traits;\n\nuse std::fmt::Display;\nuse std::path::{Path, PathBuf};\nuse std::t"
  },
  {
    "path": "czkawka_core/src/tools/invalid_symlinks/tests.rs",
    "chars": 2757,
    "preview": "#[cfg(target_family = \"unix\")]\nuse std::fs;\n#[cfg(target_family = \"unix\")]\nuse std::sync::Arc;\n#[cfg(target_family = \"un"
  },
  {
    "path": "czkawka_core/src/tools/invalid_symlinks/traits.rs",
    "chars": 4119,
    "preview": "use std::io::prelude::*;\nuse std::sync::Arc;\nuse std::sync::atomic::AtomicBool;\nuse std::time::Instant;\n\nuse crossbeam_c"
  },
  {
    "path": "czkawka_core/src/tools/mod.rs",
    "chars": 305,
    "preview": "pub mod bad_extensions;\npub mod bad_names;\npub mod big_file;\npub mod broken_files;\npub mod duplicate;\npub mod empty_file"
  },
  {
    "path": "czkawka_core/src/tools/same_music/core.rs",
    "chars": 32519,
    "preview": "use std::collections::BTreeMap;\nuse std::fs::File;\nuse std::path::Path;\nuse std::sync::Arc;\nuse std::sync::atomic::{Atom"
  },
  {
    "path": "czkawka_core/src/tools/same_music/mod.rs",
    "chars": 4162,
    "preview": "use bitflags::bitflags;\npub mod core;\npub mod traits;\n\n#[cfg(test)]\nmod tests;\n\nuse std::collections::BTreeMap;\nuse std:"
  },
  {
    "path": "czkawka_core/src/tools/same_music/tests.rs",
    "chars": 8424,
    "preview": "use std::path::PathBuf;\nuse std::sync::Arc;\nuse std::sync::atomic::AtomicBool;\n\nuse crate::common::model::CheckingMethod"
  },
  {
    "path": "czkawka_core/src/tools/same_music/traits.rs",
    "chars": 7350,
    "preview": "use std::io::prelude::*;\nuse std::sync::Arc;\nuse std::sync::atomic::AtomicBool;\nuse std::time::Instant;\n\nuse crossbeam_c"
  },
  {
    "path": "czkawka_core/src/tools/similar_images/core.rs",
    "chars": 53100,
    "preview": "use std::collections::{BTreeMap, BTreeSet};\nuse std::path::{Path, PathBuf};\nuse std::sync::Arc;\nuse std::sync::atomic::A"
  },
  {
    "path": "czkawka_core/src/tools/similar_images/mod.rs",
    "chars": 3847,
    "preview": "pub mod core;\npub mod traits;\n\npub use core::return_similarity_from_similarity_preset;\n\n#[cfg(test)]\nmod tests;\n\nuse std"
  },
  {
    "path": "czkawka_core/src/tools/similar_images/tests.rs",
    "chars": 4627,
    "preview": "use std::path::PathBuf;\nuse std::sync::Arc;\nuse std::sync::atomic::AtomicBool;\n\nuse image_hasher::{FilterType, HashAlg};"
  },
  {
    "path": "czkawka_core/src/tools/similar_images/traits.rs",
    "chars": 6800,
    "preview": "use std::io::Write;\nuse std::sync::Arc;\nuse std::sync::atomic::AtomicBool;\nuse std::time::Instant;\n\nuse crossbeam_channe"
  },
  {
    "path": "czkawka_core/src/tools/similar_videos/core.rs",
    "chars": 15242,
    "preview": "use std::collections::{BTreeMap, BTreeSet};\nuse std::mem;\nuse std::sync::Arc;\nuse std::sync::atomic::AtomicBool;\n\nuse cr"
  },
  {
    "path": "czkawka_core/src/tools/similar_videos/mod.rs",
    "chars": 4969,
    "preview": "pub mod core;\npub mod traits;\n\n#[cfg(test)]\nmod tests;\n\nuse std::collections::BTreeMap;\nuse std::ops::RangeInclusive;\nus"
  },
  {
    "path": "czkawka_core/src/tools/similar_videos/tests.rs",
    "chars": 1200,
    "preview": "use std::sync::Arc;\nuse std::sync::atomic::AtomicBool;\n\nuse tempfile::TempDir;\nuse vid_dup_finder_lib::Cropdetect;\n\nuse "
  },
  {
    "path": "czkawka_core/src/tools/similar_videos/traits.rs",
    "chars": 6800,
    "preview": "use std::io::Write;\nuse std::sync::Arc;\nuse std::sync::atomic::AtomicBool;\nuse std::time::Instant;\n\nuse crossbeam_channe"
  },
  {
    "path": "czkawka_core/src/tools/temporary/core.rs",
    "chars": 5932,
    "preview": "use std::fs::DirEntry;\nuse std::path::PathBuf;\nuse std::sync::Arc;\nuse std::sync::atomic::{AtomicBool, AtomicUsize, Orde"
  },
  {
    "path": "czkawka_core/src/tools/temporary/mod.rs",
    "chars": 1345,
    "preview": "pub mod core;\npub mod traits;\n\nuse std::path::{Path, PathBuf};\nuse std::time::Duration;\n\nuse serde::Serialize;\n\nuse crat"
  },
  {
    "path": "czkawka_core/src/tools/temporary/traits.rs",
    "chars": 3380,
    "preview": "use std::io::prelude::*;\nuse std::sync::Arc;\nuse std::sync::atomic::AtomicBool;\nuse std::time::Instant;\n\nuse crossbeam_c"
  },
  {
    "path": "czkawka_core/src/tools/video_optimizer/core/video_converter.rs",
    "chars": 4418,
    "preview": "use std::fs;\nuse std::path::Path;\nuse std::process::Command;\nuse std::sync::Arc;\nuse std::sync::atomic::AtomicBool;\n\nuse"
  },
  {
    "path": "czkawka_core/src/tools/video_optimizer/core/video_cropper.rs",
    "chars": 27648,
    "preview": "use std::path::Path;\nuse std::process::Command;\nuse std::sync::Arc;\nuse std::sync::atomic::{AtomicBool, Ordering};\n\nuse "
  },
  {
    "path": "czkawka_core/src/tools/video_optimizer/core.rs",
    "chars": 19346,
    "preview": "use std::collections::BTreeMap;\nuse std::mem;\nuse std::sync::Arc;\nuse std::sync::atomic::AtomicBool;\n\nuse crossbeam_chan"
  },
  {
    "path": "czkawka_core/src/tools/video_optimizer/mod.rs",
    "chars": 10041,
    "preview": "pub mod core;\n#[cfg(test)]\nmod tests;\npub mod traits;\n\nuse std::collections::BTreeMap;\nuse std::path::{Path, PathBuf};\nu"
  },
  {
    "path": "czkawka_core/src/tools/video_optimizer/tests.rs",
    "chars": 1,
    "preview": "\n"
  },
  {
    "path": "czkawka_core/src/tools/video_optimizer/traits.rs",
    "chars": 7499,
    "preview": "use std::io::Write;\nuse std::sync::Arc;\nuse std::sync::atomic::AtomicBool;\nuse std::time::Instant;\n\nuse crossbeam_channe"
  },
  {
    "path": "czkawka_gui/Cargo.toml",
    "chars": 1758,
    "preview": "[package]\nname = \"czkawka_gui\"\nversion = \"11.0.1\"\nauthors = [\"Rafał Mikrut <mikrutrafal@protonmail.com>\"]\nedition = \"202"
  },
  {
    "path": "czkawka_gui/LICENSE_CC_BY_4_ICONS",
    "chars": 13597,
    "preview": "All icons, in this project are licensed under Creative Commons Attribution 4.0 International (CC BY 4.0).\n\nCopyright (c)"
  },
  {
    "path": "czkawka_gui/LICENSE_MIT_APP_CODE",
    "chars": 1073,
    "preview": "MIT License\n\nCopyright (c) 2020-2026 Rafał Mikrut\n\nPermission is hereby granted, free of charge, to any person obtaining"
  },
  {
    "path": "czkawka_gui/LICENSE_MIT_WINDOWS_THEME",
    "chars": 1108,
    "preview": "(Used only in prebuild-binaries)\n\nMIT License\n\nCopyright (c) 2019-2020 Nick Rhodes\n\nPermission is hereby granted, free o"
  },
  {
    "path": "czkawka_gui/README.md",
    "chars": 5868,
    "preview": "![czkawka_logo](https://user-images.githubusercontent.com/41945903/102616149-66490400-4137-11eb-9cd6-813b2b070834.png)\n\n"
  }
]

// ... and 252 more files (download for full content)

About this extraction

This page contains the full source code of the qarmin/czkawka GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 452 files (4.4 MB), approximately 1.2M tokens, and a symbol index with 2658 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!