diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml index a8855805d..92ab91271 100644 --- a/.github/workflows/linux.yml +++ b/.github/workflows/linux.yml @@ -114,7 +114,7 @@ jobs: - name: Check. run: | - filePath="$REPO_NAME/out/Debug/bin/Kotatogram" + filePath="$REPO_NAME/out/Debug/Kotatogram" if test -f "$filePath"; then echo "Build successfully done! :)" @@ -128,7 +128,7 @@ jobs: - name: Move artifact. if: env.UPLOAD_ARTIFACT == 'true' run: | - cd $REPO_NAME/out/Debug/bin + cd $REPO_NAME/out/Debug mkdir artifact mv Kotatogram artifact/ - uses: actions/upload-artifact@master @@ -136,4 +136,4 @@ jobs: name: Upload artifact. with: name: ${{ env.ARTIFACT_NAME }} - path: ${{ env.REPO_NAME }}/out/Debug/bin/artifact/ + path: ${{ env.REPO_NAME }}/out/Debug/artifact/ diff --git a/.gitmodules b/.gitmodules index cde3030ca..9d9fea5b6 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,9 +4,6 @@ [submodule "Telegram/ThirdParty/GSL"] path = Telegram/ThirdParty/GSL url = https://github.com/Microsoft/GSL.git -[submodule "Telegram/ThirdParty/Catch"] - path = Telegram/ThirdParty/Catch - url = https://github.com/philsquared/Catch [submodule "Telegram/ThirdParty/xxHash"] path = Telegram/ThirdParty/xxHash url = https://github.com/Cyan4973/xxHash.git @@ -31,9 +28,6 @@ [submodule "Telegram/lib_ui"] path = Telegram/lib_ui url = https://github.com/kotatogram/lib_ui.git -[submodule "Telegram/lib_rlottie"] - path = Telegram/lib_rlottie - url = https://github.com/desktop-app/lib_rlottie.git [submodule "Telegram/lib_lottie"] path = Telegram/lib_lottie url = https://github.com/desktop-app/lib_lottie.git @@ -94,3 +88,9 @@ [submodule "Telegram/ThirdParty/jemalloc"] path = Telegram/ThirdParty/jemalloc url = https://github.com/jemalloc/jemalloc +[submodule "Telegram/ThirdParty/kwayland"] + path = Telegram/ThirdParty/kwayland + url = https://github.com/KDE/kwayland.git +[submodule "Telegram/ThirdParty/dispatch"] + path = Telegram/ThirdParty/dispatch + url = https://github.com/apple/swift-corelibs-libdispatch diff --git a/Telegram/CMakeLists.txt b/Telegram/CMakeLists.txt index bc35728b5..5ce9acdd4 100644 --- a/Telegram/CMakeLists.txt +++ b/Telegram/CMakeLists.txt @@ -153,8 +153,8 @@ PRIVATE api/api_user_privacy.h api/api_views.cpp api/api_views.h - api/api_who_read.cpp - api/api_who_read.h + api/api_who_reacted.cpp + api/api_who_reacted.h boxes/filters/edit_filter_box.cpp boxes/filters/edit_filter_box.h boxes/filters/edit_filter_chats_list.cpp @@ -180,6 +180,8 @@ PRIVATE boxes/peers/edit_peer_history_visibility_box.h boxes/peers/edit_peer_permissions_box.cpp boxes/peers/edit_peer_permissions_box.h + boxes/peers/edit_peer_reactions.cpp + boxes/peers/edit_peer_reactions.h boxes/peers/edit_peer_requests_box.cpp boxes/peers/edit_peer_requests_box.h boxes/peers/edit_peer_type_box.cpp @@ -445,6 +447,8 @@ PRIVATE data/data_media_types.h data/data_messages.cpp data/data_messages.h + data/data_message_reactions.cpp + data/data_message_reactions.h data/data_msg_id.h data/data_notify_settings.cpp data/data_notify_settings.h @@ -619,6 +623,12 @@ PRIVATE history/view/media/history_view_theme_document.cpp history/view/media/history_view_web_page.h history/view/media/history_view_web_page.cpp + history/view/reactions/message_reactions_list.cpp + history/view/reactions/message_reactions_list.h + history/view/reactions/message_reactions_selector.cpp + history/view/reactions/message_reactions_selector.h + history/view/history_view_bottom_info.cpp + history/view/history_view_bottom_info.h history/view/history_view_contact_status.cpp history/view/history_view_contact_status.h history/view/history_view_context_menu.cpp @@ -633,6 +643,7 @@ PRIVATE history/view/history_view_empty_list_bubble.h history/view/history_view_group_call_bar.cpp history/view/history_view_group_call_bar.h + history/view/history_view_item_preview.h history/view/history_view_list_widget.cpp history/view/history_view_list_widget.h history/view/history_view_message.cpp @@ -644,6 +655,10 @@ PRIVATE history/view/history_view_pinned_section.h history/view/history_view_pinned_tracker.cpp history/view/history_view_pinned_tracker.h + history/view/history_view_react_button.cpp + history/view/history_view_react_button.h + history/view/history_view_reactions.cpp + history/view/history_view_reactions.h history/view/history_view_replies_section.cpp history/view/history_view_replies_section.h history/view/history_view_requests_bar.cpp @@ -656,6 +671,8 @@ PRIVATE history/view/history_view_send_action.h history/view/history_view_service_message.cpp history/view/history_view_service_message.h + history/view/history_view_spoiler_click_handler.cpp + history/view/history_view_spoiler_click_handler.h history/view/history_view_top_bar_widget.cpp history/view/history_view_top_bar_widget.h history/view/history_view_view_button.cpp diff --git a/Telegram/Resources/export_html/css/style.css b/Telegram/Resources/export_html/css/style.css index 8493418e7..456d59f46 100644 --- a/Telegram/Resources/export_html/css/style.css +++ b/Telegram/Resources/export_html/css/style.css @@ -531,3 +531,16 @@ div.toast_shown { background-image: url(../images/media_video@2x.png) } } + +.spoiler { + background: #e8e8e8; +} +.spoiler.hidden { + background: #a9a9a9; + cursor: pointer; + border-radius: 3px; +} +.spoiler.hidden span { + opacity: 0; + user-select: none; +} diff --git a/Telegram/Resources/export_html/js/script.js b/Telegram/Resources/export_html/js/script.js index f206440a0..23b4009e5 100644 --- a/Telegram/Resources/export_html/js/script.js +++ b/Telegram/Resources/export_html/js/script.js @@ -52,6 +52,12 @@ function ShowMentionName() { return false; } +function ShowSpoiler(target) { + if (target.classList.contains("hidden")) { + target.classList.toggle("hidden"); + } +} + function AddClass(element, name) { var current = element.className; var expression = new RegExp('(^|\\s)' + name + '(\\s|$)', 'g'); diff --git a/Telegram/Resources/icons/chat/seen_checks.png b/Telegram/Resources/icons/chat/seen_checks.png deleted file mode 100644 index c65944de1..000000000 Binary files a/Telegram/Resources/icons/chat/seen_checks.png and /dev/null differ diff --git a/Telegram/Resources/icons/chat/seen_checks@2x.png b/Telegram/Resources/icons/chat/seen_checks@2x.png deleted file mode 100644 index 801e26d85..000000000 Binary files a/Telegram/Resources/icons/chat/seen_checks@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/chat/seen_checks@3x.png b/Telegram/Resources/icons/chat/seen_checks@3x.png deleted file mode 100644 index 49333c294..000000000 Binary files a/Telegram/Resources/icons/chat/seen_checks@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/chat/seen_played.png b/Telegram/Resources/icons/chat/seen_played.png deleted file mode 100644 index ca24dd2a5..000000000 Binary files a/Telegram/Resources/icons/chat/seen_played.png and /dev/null differ diff --git a/Telegram/Resources/icons/chat/seen_played@2x.png b/Telegram/Resources/icons/chat/seen_played@2x.png deleted file mode 100644 index 99884aae9..000000000 Binary files a/Telegram/Resources/icons/chat/seen_played@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/chat/seen_played@3x.png b/Telegram/Resources/icons/chat/seen_played@3x.png deleted file mode 100644 index cab65eb3b..000000000 Binary files a/Telegram/Resources/icons/chat/seen_played@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/contacts_add.png b/Telegram/Resources/icons/contacts_add.png deleted file mode 100644 index 3f3efebd0..000000000 Binary files a/Telegram/Resources/icons/contacts_add.png and /dev/null differ diff --git a/Telegram/Resources/icons/contacts_add@2x.png b/Telegram/Resources/icons/contacts_add@2x.png deleted file mode 100644 index 0b68e8665..000000000 Binary files a/Telegram/Resources/icons/contacts_add@2x.png and /dev/null differ diff --git a/Telegram/Resources/icons/contacts_add@3x.png b/Telegram/Resources/icons/contacts_add@3x.png deleted file mode 100644 index 8d20e2d44..000000000 Binary files a/Telegram/Resources/icons/contacts_add@3x.png and /dev/null differ diff --git a/Telegram/Resources/icons/contacts_alphabet.png b/Telegram/Resources/icons/contacts_alphabet.png new file mode 100644 index 000000000..8a8c99aa1 Binary files /dev/null and b/Telegram/Resources/icons/contacts_alphabet.png differ diff --git a/Telegram/Resources/icons/contacts_alphabet@2x.png b/Telegram/Resources/icons/contacts_alphabet@2x.png new file mode 100644 index 000000000..59b724d9b Binary files /dev/null and b/Telegram/Resources/icons/contacts_alphabet@2x.png differ diff --git a/Telegram/Resources/icons/contacts_alphabet@3x.png b/Telegram/Resources/icons/contacts_alphabet@3x.png new file mode 100644 index 000000000..72a22f9f5 Binary files /dev/null and b/Telegram/Resources/icons/contacts_alphabet@3x.png differ diff --git a/Telegram/Resources/icons/contacts_online.png b/Telegram/Resources/icons/contacts_online.png new file mode 100644 index 000000000..8fe7e9b16 Binary files /dev/null and b/Telegram/Resources/icons/contacts_online.png differ diff --git a/Telegram/Resources/icons/contacts_online@2x.png b/Telegram/Resources/icons/contacts_online@2x.png new file mode 100644 index 000000000..3549bc947 Binary files /dev/null and b/Telegram/Resources/icons/contacts_online@2x.png differ diff --git a/Telegram/Resources/icons/contacts_online@3x.png b/Telegram/Resources/icons/contacts_online@3x.png new file mode 100644 index 000000000..5cf60407b Binary files /dev/null and b/Telegram/Resources/icons/contacts_online@3x.png differ diff --git a/Telegram/Resources/icons/info/edit/group_manage_reactions.png b/Telegram/Resources/icons/info/edit/group_manage_reactions.png new file mode 100644 index 000000000..14265081a Binary files /dev/null and b/Telegram/Resources/icons/info/edit/group_manage_reactions.png differ diff --git a/Telegram/Resources/icons/info/edit/group_manage_reactions@2x.png b/Telegram/Resources/icons/info/edit/group_manage_reactions@2x.png new file mode 100644 index 000000000..029743d6b Binary files /dev/null and b/Telegram/Resources/icons/info/edit/group_manage_reactions@2x.png differ diff --git a/Telegram/Resources/icons/info/edit/group_manage_reactions@3x.png b/Telegram/Resources/icons/info/edit/group_manage_reactions@3x.png new file mode 100644 index 000000000..d3f774a2c Binary files /dev/null and b/Telegram/Resources/icons/info/edit/group_manage_reactions@3x.png differ diff --git a/Telegram/Resources/icons/menu/add_account.png b/Telegram/Resources/icons/menu/add_account.png new file mode 100644 index 000000000..535725f0b Binary files /dev/null and b/Telegram/Resources/icons/menu/add_account.png differ diff --git a/Telegram/Resources/icons/menu/add_account@2x.png b/Telegram/Resources/icons/menu/add_account@2x.png new file mode 100644 index 000000000..ef74df51a Binary files /dev/null and b/Telegram/Resources/icons/menu/add_account@2x.png differ diff --git a/Telegram/Resources/icons/menu/add_account@3x.png b/Telegram/Resources/icons/menu/add_account@3x.png new file mode 100644 index 000000000..22d6c56c4 Binary files /dev/null and b/Telegram/Resources/icons/menu/add_account@3x.png differ diff --git a/Telegram/Resources/icons/menu/admin.png b/Telegram/Resources/icons/menu/admin.png new file mode 100644 index 000000000..6ddda6a10 Binary files /dev/null and b/Telegram/Resources/icons/menu/admin.png differ diff --git a/Telegram/Resources/icons/menu/admin@2x.png b/Telegram/Resources/icons/menu/admin@2x.png new file mode 100644 index 000000000..d63fde8cc Binary files /dev/null and b/Telegram/Resources/icons/menu/admin@2x.png differ diff --git a/Telegram/Resources/icons/menu/admin@3x.png b/Telegram/Resources/icons/menu/admin@3x.png new file mode 100644 index 000000000..6d87a2798 Binary files /dev/null and b/Telegram/Resources/icons/menu/admin@3x.png differ diff --git a/Telegram/Resources/icons/menu/admin_promote.png b/Telegram/Resources/icons/menu/admin_promote.png new file mode 100644 index 000000000..9ad438f57 Binary files /dev/null and b/Telegram/Resources/icons/menu/admin_promote.png differ diff --git a/Telegram/Resources/icons/menu/admin_promote@2x.png b/Telegram/Resources/icons/menu/admin_promote@2x.png new file mode 100644 index 000000000..f76977c15 Binary files /dev/null and b/Telegram/Resources/icons/menu/admin_promote@2x.png differ diff --git a/Telegram/Resources/icons/menu/admin_promote@3x.png b/Telegram/Resources/icons/menu/admin_promote@3x.png new file mode 100644 index 000000000..2ab636832 Binary files /dev/null and b/Telegram/Resources/icons/menu/admin_promote@3x.png differ diff --git a/Telegram/Resources/icons/menu/all_media.png b/Telegram/Resources/icons/menu/all_media.png new file mode 100644 index 000000000..7d8119b3d Binary files /dev/null and b/Telegram/Resources/icons/menu/all_media.png differ diff --git a/Telegram/Resources/icons/menu/all_media@2x.png b/Telegram/Resources/icons/menu/all_media@2x.png new file mode 100644 index 000000000..a689a34bb Binary files /dev/null and b/Telegram/Resources/icons/menu/all_media@2x.png differ diff --git a/Telegram/Resources/icons/menu/all_media@3x.png b/Telegram/Resources/icons/menu/all_media@3x.png new file mode 100644 index 000000000..d5390cc6d Binary files /dev/null and b/Telegram/Resources/icons/menu/all_media@3x.png differ diff --git a/Telegram/Resources/icons/menu/archive.png b/Telegram/Resources/icons/menu/archive.png new file mode 100644 index 000000000..4fce81e92 Binary files /dev/null and b/Telegram/Resources/icons/menu/archive.png differ diff --git a/Telegram/Resources/icons/menu/archive@2x.png b/Telegram/Resources/icons/menu/archive@2x.png new file mode 100644 index 000000000..feb6cab45 Binary files /dev/null and b/Telegram/Resources/icons/menu/archive@2x.png differ diff --git a/Telegram/Resources/icons/menu/archive@3x.png b/Telegram/Resources/icons/menu/archive@3x.png new file mode 100644 index 000000000..9be5d6369 Binary files /dev/null and b/Telegram/Resources/icons/menu/archive@3x.png differ diff --git a/Telegram/Resources/icons/menu/block.png b/Telegram/Resources/icons/menu/block.png new file mode 100644 index 000000000..6c81ea74d Binary files /dev/null and b/Telegram/Resources/icons/menu/block.png differ diff --git a/Telegram/Resources/icons/menu/block@2x.png b/Telegram/Resources/icons/menu/block@2x.png new file mode 100644 index 000000000..90612c87d Binary files /dev/null and b/Telegram/Resources/icons/menu/block@2x.png differ diff --git a/Telegram/Resources/icons/menu/block@3x.png b/Telegram/Resources/icons/menu/block@3x.png new file mode 100644 index 000000000..7eb4c2925 Binary files /dev/null and b/Telegram/Resources/icons/menu/block@3x.png differ diff --git a/Telegram/Resources/icons/menu/calendar.png b/Telegram/Resources/icons/menu/calendar.png new file mode 100644 index 000000000..b61e0f528 Binary files /dev/null and b/Telegram/Resources/icons/menu/calendar.png differ diff --git a/Telegram/Resources/icons/menu/calendar@2x.png b/Telegram/Resources/icons/menu/calendar@2x.png new file mode 100644 index 000000000..7fbdb5060 Binary files /dev/null and b/Telegram/Resources/icons/menu/calendar@2x.png differ diff --git a/Telegram/Resources/icons/menu/calendar@3x.png b/Telegram/Resources/icons/menu/calendar@3x.png new file mode 100644 index 000000000..5f9447922 Binary files /dev/null and b/Telegram/Resources/icons/menu/calendar@3x.png differ diff --git a/Telegram/Resources/icons/menu/cancel.png b/Telegram/Resources/icons/menu/cancel.png new file mode 100644 index 000000000..c52cecef6 Binary files /dev/null and b/Telegram/Resources/icons/menu/cancel.png differ diff --git a/Telegram/Resources/icons/menu/cancel@2x.png b/Telegram/Resources/icons/menu/cancel@2x.png new file mode 100644 index 000000000..2bb92f3ee Binary files /dev/null and b/Telegram/Resources/icons/menu/cancel@2x.png differ diff --git a/Telegram/Resources/icons/menu/cancel@3x.png b/Telegram/Resources/icons/menu/cancel@3x.png new file mode 100644 index 000000000..3114f1ec0 Binary files /dev/null and b/Telegram/Resources/icons/menu/cancel@3x.png differ diff --git a/Telegram/Resources/icons/menu/clear.png b/Telegram/Resources/icons/menu/clear.png new file mode 100644 index 000000000..36dba229d Binary files /dev/null and b/Telegram/Resources/icons/menu/clear.png differ diff --git a/Telegram/Resources/icons/menu/clear@2x.png b/Telegram/Resources/icons/menu/clear@2x.png new file mode 100644 index 000000000..9b249b44c Binary files /dev/null and b/Telegram/Resources/icons/menu/clear@2x.png differ diff --git a/Telegram/Resources/icons/menu/clear@3x.png b/Telegram/Resources/icons/menu/clear@3x.png new file mode 100644 index 000000000..a83adaa89 Binary files /dev/null and b/Telegram/Resources/icons/menu/clear@3x.png differ diff --git a/Telegram/Resources/icons/menu/collapse.png b/Telegram/Resources/icons/menu/collapse.png new file mode 100644 index 000000000..956c75aa8 Binary files /dev/null and b/Telegram/Resources/icons/menu/collapse.png differ diff --git a/Telegram/Resources/icons/menu/collapse@2x.png b/Telegram/Resources/icons/menu/collapse@2x.png new file mode 100644 index 000000000..028c6cf9b Binary files /dev/null and b/Telegram/Resources/icons/menu/collapse@2x.png differ diff --git a/Telegram/Resources/icons/menu/collapse@3x.png b/Telegram/Resources/icons/menu/collapse@3x.png new file mode 100644 index 000000000..1f4936b5d Binary files /dev/null and b/Telegram/Resources/icons/menu/collapse@3x.png differ diff --git a/Telegram/Resources/icons/menu/colors.png b/Telegram/Resources/icons/menu/colors.png new file mode 100644 index 000000000..b4113d0f1 Binary files /dev/null and b/Telegram/Resources/icons/menu/colors.png differ diff --git a/Telegram/Resources/icons/menu/colors@2x.png b/Telegram/Resources/icons/menu/colors@2x.png new file mode 100644 index 000000000..868687c0d Binary files /dev/null and b/Telegram/Resources/icons/menu/colors@2x.png differ diff --git a/Telegram/Resources/icons/menu/colors@3x.png b/Telegram/Resources/icons/menu/colors@3x.png new file mode 100644 index 000000000..19641ef37 Binary files /dev/null and b/Telegram/Resources/icons/menu/colors@3x.png differ diff --git a/Telegram/Resources/icons/menu/copy.png b/Telegram/Resources/icons/menu/copy.png new file mode 100644 index 000000000..a7e8215e1 Binary files /dev/null and b/Telegram/Resources/icons/menu/copy.png differ diff --git a/Telegram/Resources/icons/menu/copy@2x.png b/Telegram/Resources/icons/menu/copy@2x.png new file mode 100644 index 000000000..54a5623e6 Binary files /dev/null and b/Telegram/Resources/icons/menu/copy@2x.png differ diff --git a/Telegram/Resources/icons/menu/copy@3x.png b/Telegram/Resources/icons/menu/copy@3x.png new file mode 100644 index 000000000..91f9b0582 Binary files /dev/null and b/Telegram/Resources/icons/menu/copy@3x.png differ diff --git a/Telegram/Resources/icons/menu/create_poll.png b/Telegram/Resources/icons/menu/create_poll.png new file mode 100644 index 000000000..de5f8018f Binary files /dev/null and b/Telegram/Resources/icons/menu/create_poll.png differ diff --git a/Telegram/Resources/icons/menu/create_poll@2x.png b/Telegram/Resources/icons/menu/create_poll@2x.png new file mode 100644 index 000000000..99a38d215 Binary files /dev/null and b/Telegram/Resources/icons/menu/create_poll@2x.png differ diff --git a/Telegram/Resources/icons/menu/create_poll@3x.png b/Telegram/Resources/icons/menu/create_poll@3x.png new file mode 100644 index 000000000..7e9732dc8 Binary files /dev/null and b/Telegram/Resources/icons/menu/create_poll@3x.png differ diff --git a/Telegram/Resources/icons/menu/delete.png b/Telegram/Resources/icons/menu/delete.png new file mode 100644 index 000000000..a87bbf735 Binary files /dev/null and b/Telegram/Resources/icons/menu/delete.png differ diff --git a/Telegram/Resources/icons/menu/delete@2x.png b/Telegram/Resources/icons/menu/delete@2x.png new file mode 100644 index 000000000..4c3b41ac6 Binary files /dev/null and b/Telegram/Resources/icons/menu/delete@2x.png differ diff --git a/Telegram/Resources/icons/menu/delete@3x.png b/Telegram/Resources/icons/menu/delete@3x.png new file mode 100644 index 000000000..d94002fdf Binary files /dev/null and b/Telegram/Resources/icons/menu/delete@3x.png differ diff --git a/Telegram/Resources/icons/menu/discussion.png b/Telegram/Resources/icons/menu/discussion.png new file mode 100644 index 000000000..180a17d2b Binary files /dev/null and b/Telegram/Resources/icons/menu/discussion.png differ diff --git a/Telegram/Resources/icons/menu/discussion@2x.png b/Telegram/Resources/icons/menu/discussion@2x.png new file mode 100644 index 000000000..c7f148d6d Binary files /dev/null and b/Telegram/Resources/icons/menu/discussion@2x.png differ diff --git a/Telegram/Resources/icons/menu/discussion@3x.png b/Telegram/Resources/icons/menu/discussion@3x.png new file mode 100644 index 000000000..44f2f40a1 Binary files /dev/null and b/Telegram/Resources/icons/menu/discussion@3x.png differ diff --git a/Telegram/Resources/icons/menu/download.png b/Telegram/Resources/icons/menu/download.png new file mode 100644 index 000000000..822e8716b Binary files /dev/null and b/Telegram/Resources/icons/menu/download.png differ diff --git a/Telegram/Resources/icons/menu/download@2x.png b/Telegram/Resources/icons/menu/download@2x.png new file mode 100644 index 000000000..e9a78093e Binary files /dev/null and b/Telegram/Resources/icons/menu/download@2x.png differ diff --git a/Telegram/Resources/icons/menu/download@3x.png b/Telegram/Resources/icons/menu/download@3x.png new file mode 100644 index 000000000..9c19c3c06 Binary files /dev/null and b/Telegram/Resources/icons/menu/download@3x.png differ diff --git a/Telegram/Resources/icons/menu/edit.png b/Telegram/Resources/icons/menu/edit.png new file mode 100644 index 000000000..b328e4b99 Binary files /dev/null and b/Telegram/Resources/icons/menu/edit.png differ diff --git a/Telegram/Resources/icons/menu/edit@2x.png b/Telegram/Resources/icons/menu/edit@2x.png new file mode 100644 index 000000000..208dd25f2 Binary files /dev/null and b/Telegram/Resources/icons/menu/edit@2x.png differ diff --git a/Telegram/Resources/icons/menu/edit@3x.png b/Telegram/Resources/icons/menu/edit@3x.png new file mode 100644 index 000000000..f95298a9d Binary files /dev/null and b/Telegram/Resources/icons/menu/edit@3x.png differ diff --git a/Telegram/Resources/icons/menu/expand.png b/Telegram/Resources/icons/menu/expand.png new file mode 100644 index 000000000..ad25da472 Binary files /dev/null and b/Telegram/Resources/icons/menu/expand.png differ diff --git a/Telegram/Resources/icons/menu/expand@2x.png b/Telegram/Resources/icons/menu/expand@2x.png new file mode 100644 index 000000000..7ababd7d5 Binary files /dev/null and b/Telegram/Resources/icons/menu/expand@2x.png differ diff --git a/Telegram/Resources/icons/menu/expand@3x.png b/Telegram/Resources/icons/menu/expand@3x.png new file mode 100644 index 000000000..0ad14a423 Binary files /dev/null and b/Telegram/Resources/icons/menu/expand@3x.png differ diff --git a/Telegram/Resources/icons/menu/export.png b/Telegram/Resources/icons/menu/export.png new file mode 100644 index 000000000..81303d4c8 Binary files /dev/null and b/Telegram/Resources/icons/menu/export.png differ diff --git a/Telegram/Resources/icons/menu/export@2x.png b/Telegram/Resources/icons/menu/export@2x.png new file mode 100644 index 000000000..e64e11e24 Binary files /dev/null and b/Telegram/Resources/icons/menu/export@2x.png differ diff --git a/Telegram/Resources/icons/menu/export@3x.png b/Telegram/Resources/icons/menu/export@3x.png new file mode 100644 index 000000000..76e573e13 Binary files /dev/null and b/Telegram/Resources/icons/menu/export@3x.png differ diff --git a/Telegram/Resources/icons/menu/export_theme.png b/Telegram/Resources/icons/menu/export_theme.png new file mode 100644 index 000000000..84a40f33e Binary files /dev/null and b/Telegram/Resources/icons/menu/export_theme.png differ diff --git a/Telegram/Resources/icons/menu/export_theme@2x.png b/Telegram/Resources/icons/menu/export_theme@2x.png new file mode 100644 index 000000000..845195c2a Binary files /dev/null and b/Telegram/Resources/icons/menu/export_theme@2x.png differ diff --git a/Telegram/Resources/icons/menu/export_theme@3x.png b/Telegram/Resources/icons/menu/export_theme@3x.png new file mode 100644 index 000000000..99e5001ee Binary files /dev/null and b/Telegram/Resources/icons/menu/export_theme@3x.png differ diff --git a/Telegram/Resources/icons/menu/favorite.png b/Telegram/Resources/icons/menu/favorite.png new file mode 100644 index 000000000..82cfd19a2 Binary files /dev/null and b/Telegram/Resources/icons/menu/favorite.png differ diff --git a/Telegram/Resources/icons/menu/favorite@2x.png b/Telegram/Resources/icons/menu/favorite@2x.png new file mode 100644 index 000000000..346986459 Binary files /dev/null and b/Telegram/Resources/icons/menu/favorite@2x.png differ diff --git a/Telegram/Resources/icons/menu/favorite@3x.png b/Telegram/Resources/icons/menu/favorite@3x.png new file mode 100644 index 000000000..5a58bcc49 Binary files /dev/null and b/Telegram/Resources/icons/menu/favorite@3x.png differ diff --git a/Telegram/Resources/icons/menu/flip.png b/Telegram/Resources/icons/menu/flip.png new file mode 100644 index 000000000..34acb7b99 Binary files /dev/null and b/Telegram/Resources/icons/menu/flip.png differ diff --git a/Telegram/Resources/icons/menu/flip@2x.png b/Telegram/Resources/icons/menu/flip@2x.png new file mode 100644 index 000000000..596076d1d Binary files /dev/null and b/Telegram/Resources/icons/menu/flip@2x.png differ diff --git a/Telegram/Resources/icons/menu/flip@3x.png b/Telegram/Resources/icons/menu/flip@3x.png new file mode 100644 index 000000000..f5dca8fe9 Binary files /dev/null and b/Telegram/Resources/icons/menu/flip@3x.png differ diff --git a/Telegram/Resources/icons/menu/forward.png b/Telegram/Resources/icons/menu/forward.png new file mode 100644 index 000000000..c2c141a05 Binary files /dev/null and b/Telegram/Resources/icons/menu/forward.png differ diff --git a/Telegram/Resources/icons/menu/forward@2x.png b/Telegram/Resources/icons/menu/forward@2x.png new file mode 100644 index 000000000..ad8b12b8d Binary files /dev/null and b/Telegram/Resources/icons/menu/forward@2x.png differ diff --git a/Telegram/Resources/icons/menu/forward@3x.png b/Telegram/Resources/icons/menu/forward@3x.png new file mode 100644 index 000000000..5a645c291 Binary files /dev/null and b/Telegram/Resources/icons/menu/forward@3x.png differ diff --git a/Telegram/Resources/icons/menu/gif.png b/Telegram/Resources/icons/menu/gif.png new file mode 100644 index 000000000..9a76a1c8f Binary files /dev/null and b/Telegram/Resources/icons/menu/gif.png differ diff --git a/Telegram/Resources/icons/menu/gif@2x.png b/Telegram/Resources/icons/menu/gif@2x.png new file mode 100644 index 000000000..4f87590c4 Binary files /dev/null and b/Telegram/Resources/icons/menu/gif@2x.png differ diff --git a/Telegram/Resources/icons/menu/gif@3x.png b/Telegram/Resources/icons/menu/gif@3x.png new file mode 100644 index 000000000..eccd873f1 Binary files /dev/null and b/Telegram/Resources/icons/menu/gif@3x.png differ diff --git a/Telegram/Resources/icons/menu/hide.png b/Telegram/Resources/icons/menu/hide.png new file mode 100644 index 000000000..1cdc079be Binary files /dev/null and b/Telegram/Resources/icons/menu/hide.png differ diff --git a/Telegram/Resources/icons/menu/hide@2x.png b/Telegram/Resources/icons/menu/hide@2x.png new file mode 100644 index 000000000..c5dc78095 Binary files /dev/null and b/Telegram/Resources/icons/menu/hide@2x.png differ diff --git a/Telegram/Resources/icons/menu/hide@3x.png b/Telegram/Resources/icons/menu/hide@3x.png new file mode 100644 index 000000000..e32ae8b29 Binary files /dev/null and b/Telegram/Resources/icons/menu/hide@3x.png differ diff --git a/Telegram/Resources/icons/menu/import_theme.png b/Telegram/Resources/icons/menu/import_theme.png new file mode 100644 index 000000000..f5af2f897 Binary files /dev/null and b/Telegram/Resources/icons/menu/import_theme.png differ diff --git a/Telegram/Resources/icons/menu/import_theme@2x.png b/Telegram/Resources/icons/menu/import_theme@2x.png new file mode 100644 index 000000000..575e1e439 Binary files /dev/null and b/Telegram/Resources/icons/menu/import_theme@2x.png differ diff --git a/Telegram/Resources/icons/menu/import_theme@3x.png b/Telegram/Resources/icons/menu/import_theme@3x.png new file mode 100644 index 000000000..2169f43c3 Binary files /dev/null and b/Telegram/Resources/icons/menu/import_theme@3x.png differ diff --git a/Telegram/Resources/icons/menu/info.png b/Telegram/Resources/icons/menu/info.png new file mode 100644 index 000000000..7753fe9f4 Binary files /dev/null and b/Telegram/Resources/icons/menu/info.png differ diff --git a/Telegram/Resources/icons/menu/info@2x.png b/Telegram/Resources/icons/menu/info@2x.png new file mode 100644 index 000000000..bf7e1d2d6 Binary files /dev/null and b/Telegram/Resources/icons/menu/info@2x.png differ diff --git a/Telegram/Resources/icons/menu/info@3x.png b/Telegram/Resources/icons/menu/info@3x.png new file mode 100644 index 000000000..af96e7cbf Binary files /dev/null and b/Telegram/Resources/icons/menu/info@3x.png differ diff --git a/Telegram/Resources/icons/menu/invite.png b/Telegram/Resources/icons/menu/invite.png new file mode 100644 index 000000000..ea0de5b30 Binary files /dev/null and b/Telegram/Resources/icons/menu/invite.png differ diff --git a/Telegram/Resources/icons/menu/invite@2x.png b/Telegram/Resources/icons/menu/invite@2x.png new file mode 100644 index 000000000..c2609e6df Binary files /dev/null and b/Telegram/Resources/icons/menu/invite@2x.png differ diff --git a/Telegram/Resources/icons/menu/invite@3x.png b/Telegram/Resources/icons/menu/invite@3x.png new file mode 100644 index 000000000..06bfa637b Binary files /dev/null and b/Telegram/Resources/icons/menu/invite@3x.png differ diff --git a/Telegram/Resources/icons/menu/leave.png b/Telegram/Resources/icons/menu/leave.png new file mode 100644 index 000000000..f5f97bc1b Binary files /dev/null and b/Telegram/Resources/icons/menu/leave.png differ diff --git a/Telegram/Resources/icons/menu/leave@2x.png b/Telegram/Resources/icons/menu/leave@2x.png new file mode 100644 index 000000000..055a952d9 Binary files /dev/null and b/Telegram/Resources/icons/menu/leave@2x.png differ diff --git a/Telegram/Resources/icons/menu/leave@3x.png b/Telegram/Resources/icons/menu/leave@3x.png new file mode 100644 index 000000000..ba42fe7b1 Binary files /dev/null and b/Telegram/Resources/icons/menu/leave@3x.png differ diff --git a/Telegram/Resources/icons/menu/link.png b/Telegram/Resources/icons/menu/link.png new file mode 100644 index 000000000..55f7d4f69 Binary files /dev/null and b/Telegram/Resources/icons/menu/link.png differ diff --git a/Telegram/Resources/icons/menu/link@2x.png b/Telegram/Resources/icons/menu/link@2x.png new file mode 100644 index 000000000..8eaf08544 Binary files /dev/null and b/Telegram/Resources/icons/menu/link@2x.png differ diff --git a/Telegram/Resources/icons/menu/link@3x.png b/Telegram/Resources/icons/menu/link@3x.png new file mode 100644 index 000000000..2b8a3d165 Binary files /dev/null and b/Telegram/Resources/icons/menu/link@3x.png differ diff --git a/Telegram/Resources/icons/menu/manage.png b/Telegram/Resources/icons/menu/manage.png new file mode 100644 index 000000000..36acf2de9 Binary files /dev/null and b/Telegram/Resources/icons/menu/manage.png differ diff --git a/Telegram/Resources/icons/menu/manage@2x.png b/Telegram/Resources/icons/menu/manage@2x.png new file mode 100644 index 000000000..21ccea940 Binary files /dev/null and b/Telegram/Resources/icons/menu/manage@2x.png differ diff --git a/Telegram/Resources/icons/menu/manage@3x.png b/Telegram/Resources/icons/menu/manage@3x.png new file mode 100644 index 000000000..7b9767c87 Binary files /dev/null and b/Telegram/Resources/icons/menu/manage@3x.png differ diff --git a/Telegram/Resources/icons/menu/mention.png b/Telegram/Resources/icons/menu/mention.png new file mode 100644 index 000000000..bf6e9f6c5 Binary files /dev/null and b/Telegram/Resources/icons/menu/mention.png differ diff --git a/Telegram/Resources/icons/menu/mention@2x.png b/Telegram/Resources/icons/menu/mention@2x.png new file mode 100644 index 000000000..f82cb39d7 Binary files /dev/null and b/Telegram/Resources/icons/menu/mention@2x.png differ diff --git a/Telegram/Resources/icons/menu/mention@3x.png b/Telegram/Resources/icons/menu/mention@3x.png new file mode 100644 index 000000000..0b0dcb6f5 Binary files /dev/null and b/Telegram/Resources/icons/menu/mention@3x.png differ diff --git a/Telegram/Resources/icons/menu/move_from_menu.png b/Telegram/Resources/icons/menu/move_from_menu.png new file mode 100644 index 000000000..0dc84b3df Binary files /dev/null and b/Telegram/Resources/icons/menu/move_from_menu.png differ diff --git a/Telegram/Resources/icons/menu/move_from_menu@2x.png b/Telegram/Resources/icons/menu/move_from_menu@2x.png new file mode 100644 index 000000000..ffb80903e Binary files /dev/null and b/Telegram/Resources/icons/menu/move_from_menu@2x.png differ diff --git a/Telegram/Resources/icons/menu/move_from_menu@3x.png b/Telegram/Resources/icons/menu/move_from_menu@3x.png new file mode 100644 index 000000000..9822e6f2c Binary files /dev/null and b/Telegram/Resources/icons/menu/move_from_menu@3x.png differ diff --git a/Telegram/Resources/icons/menu/move_to_menu.png b/Telegram/Resources/icons/menu/move_to_menu.png new file mode 100644 index 000000000..5fe3b32c5 Binary files /dev/null and b/Telegram/Resources/icons/menu/move_to_menu.png differ diff --git a/Telegram/Resources/icons/menu/move_to_menu@2x.png b/Telegram/Resources/icons/menu/move_to_menu@2x.png new file mode 100644 index 000000000..10a49d83b Binary files /dev/null and b/Telegram/Resources/icons/menu/move_to_menu@2x.png differ diff --git a/Telegram/Resources/icons/menu/move_to_menu@3x.png b/Telegram/Resources/icons/menu/move_to_menu@3x.png new file mode 100644 index 000000000..4cf99120c Binary files /dev/null and b/Telegram/Resources/icons/menu/move_to_menu@3x.png differ diff --git a/Telegram/Resources/icons/menu/mute.png b/Telegram/Resources/icons/menu/mute.png new file mode 100644 index 000000000..af32326f4 Binary files /dev/null and b/Telegram/Resources/icons/menu/mute.png differ diff --git a/Telegram/Resources/icons/menu/mute@2x.png b/Telegram/Resources/icons/menu/mute@2x.png new file mode 100644 index 000000000..935b2ece5 Binary files /dev/null and b/Telegram/Resources/icons/menu/mute@2x.png differ diff --git a/Telegram/Resources/icons/menu/mute@3x.png b/Telegram/Resources/icons/menu/mute@3x.png new file mode 100644 index 000000000..4762b83de Binary files /dev/null and b/Telegram/Resources/icons/menu/mute@3x.png differ diff --git a/Telegram/Resources/icons/menu/palette.png b/Telegram/Resources/icons/menu/palette.png new file mode 100644 index 000000000..2ce5d44a1 Binary files /dev/null and b/Telegram/Resources/icons/menu/palette.png differ diff --git a/Telegram/Resources/icons/menu/palette@2x.png b/Telegram/Resources/icons/menu/palette@2x.png new file mode 100644 index 000000000..b88969cf1 Binary files /dev/null and b/Telegram/Resources/icons/menu/palette@2x.png differ diff --git a/Telegram/Resources/icons/menu/palette@3x.png b/Telegram/Resources/icons/menu/palette@3x.png new file mode 100644 index 000000000..444a7c928 Binary files /dev/null and b/Telegram/Resources/icons/menu/palette@3x.png differ diff --git a/Telegram/Resources/icons/menu/permissions.png b/Telegram/Resources/icons/menu/permissions.png new file mode 100644 index 000000000..ab4309f71 Binary files /dev/null and b/Telegram/Resources/icons/menu/permissions.png differ diff --git a/Telegram/Resources/icons/menu/permissions@2x.png b/Telegram/Resources/icons/menu/permissions@2x.png new file mode 100644 index 000000000..777467dba Binary files /dev/null and b/Telegram/Resources/icons/menu/permissions@2x.png differ diff --git a/Telegram/Resources/icons/menu/permissions@3x.png b/Telegram/Resources/icons/menu/permissions@3x.png new file mode 100644 index 000000000..ec4c420d4 Binary files /dev/null and b/Telegram/Resources/icons/menu/permissions@3x.png differ diff --git a/Telegram/Resources/icons/menu/pin.png b/Telegram/Resources/icons/menu/pin.png new file mode 100644 index 000000000..33d71245d Binary files /dev/null and b/Telegram/Resources/icons/menu/pin.png differ diff --git a/Telegram/Resources/icons/menu/pin@2x.png b/Telegram/Resources/icons/menu/pin@2x.png new file mode 100644 index 000000000..08c797846 Binary files /dev/null and b/Telegram/Resources/icons/menu/pin@2x.png differ diff --git a/Telegram/Resources/icons/menu/pin@3x.png b/Telegram/Resources/icons/menu/pin@3x.png new file mode 100644 index 000000000..3540c235c Binary files /dev/null and b/Telegram/Resources/icons/menu/pin@3x.png differ diff --git a/Telegram/Resources/icons/menu/profile.png b/Telegram/Resources/icons/menu/profile.png new file mode 100644 index 000000000..df63a62ba Binary files /dev/null and b/Telegram/Resources/icons/menu/profile.png differ diff --git a/Telegram/Resources/icons/menu/profile@2x.png b/Telegram/Resources/icons/menu/profile@2x.png new file mode 100644 index 000000000..c029da4ef Binary files /dev/null and b/Telegram/Resources/icons/menu/profile@2x.png differ diff --git a/Telegram/Resources/icons/menu/profile@3x.png b/Telegram/Resources/icons/menu/profile@3x.png new file mode 100644 index 000000000..e7df675b1 Binary files /dev/null and b/Telegram/Resources/icons/menu/profile@3x.png differ diff --git a/Telegram/Resources/icons/menu/qr_code.png b/Telegram/Resources/icons/menu/qr_code.png new file mode 100644 index 000000000..81a8a966b Binary files /dev/null and b/Telegram/Resources/icons/menu/qr_code.png differ diff --git a/Telegram/Resources/icons/menu/qr_code@2x.png b/Telegram/Resources/icons/menu/qr_code@2x.png new file mode 100644 index 000000000..7b872deed Binary files /dev/null and b/Telegram/Resources/icons/menu/qr_code@2x.png differ diff --git a/Telegram/Resources/icons/menu/qr_code@3x.png b/Telegram/Resources/icons/menu/qr_code@3x.png new file mode 100644 index 000000000..79254064d Binary files /dev/null and b/Telegram/Resources/icons/menu/qr_code@3x.png differ diff --git a/Telegram/Resources/icons/menu/read.png b/Telegram/Resources/icons/menu/read.png new file mode 100644 index 000000000..748dceb40 Binary files /dev/null and b/Telegram/Resources/icons/menu/read.png differ diff --git a/Telegram/Resources/icons/menu/read@2x.png b/Telegram/Resources/icons/menu/read@2x.png new file mode 100644 index 000000000..aa2a81d5b Binary files /dev/null and b/Telegram/Resources/icons/menu/read@2x.png differ diff --git a/Telegram/Resources/icons/menu/read@3x.png b/Telegram/Resources/icons/menu/read@3x.png new file mode 100644 index 000000000..bf5e2b7ea Binary files /dev/null and b/Telegram/Resources/icons/menu/read@3x.png differ diff --git a/Telegram/Resources/icons/menu/read_audio.png b/Telegram/Resources/icons/menu/read_audio.png new file mode 100644 index 000000000..d5c17e8ee Binary files /dev/null and b/Telegram/Resources/icons/menu/read_audio.png differ diff --git a/Telegram/Resources/icons/menu/read_audio@2x.png b/Telegram/Resources/icons/menu/read_audio@2x.png new file mode 100644 index 000000000..02cc1967d Binary files /dev/null and b/Telegram/Resources/icons/menu/read_audio@2x.png differ diff --git a/Telegram/Resources/icons/menu/read_audio@3x.png b/Telegram/Resources/icons/menu/read_audio@3x.png new file mode 100644 index 000000000..3114aac3c Binary files /dev/null and b/Telegram/Resources/icons/menu/read_audio@3x.png differ diff --git a/Telegram/Resources/icons/menu/read_reactions.png b/Telegram/Resources/icons/menu/read_reactions.png new file mode 100644 index 000000000..b9a718528 Binary files /dev/null and b/Telegram/Resources/icons/menu/read_reactions.png differ diff --git a/Telegram/Resources/icons/menu/read_reactions@2x.png b/Telegram/Resources/icons/menu/read_reactions@2x.png new file mode 100644 index 000000000..aeb806f0f Binary files /dev/null and b/Telegram/Resources/icons/menu/read_reactions@2x.png differ diff --git a/Telegram/Resources/icons/menu/read_reactions@3x.png b/Telegram/Resources/icons/menu/read_reactions@3x.png new file mode 100644 index 000000000..e39e7e45a Binary files /dev/null and b/Telegram/Resources/icons/menu/read_reactions@3x.png differ diff --git a/Telegram/Resources/icons/menu/read_ticks.png b/Telegram/Resources/icons/menu/read_ticks.png new file mode 100644 index 000000000..69a7cf5c9 Binary files /dev/null and b/Telegram/Resources/icons/menu/read_ticks.png differ diff --git a/Telegram/Resources/icons/menu/read_ticks@2x.png b/Telegram/Resources/icons/menu/read_ticks@2x.png new file mode 100644 index 000000000..477f34d42 Binary files /dev/null and b/Telegram/Resources/icons/menu/read_ticks@2x.png differ diff --git a/Telegram/Resources/icons/menu/read_ticks@3x.png b/Telegram/Resources/icons/menu/read_ticks@3x.png new file mode 100644 index 000000000..86c38f0c2 Binary files /dev/null and b/Telegram/Resources/icons/menu/read_ticks@3x.png differ diff --git a/Telegram/Resources/icons/menu/reply.png b/Telegram/Resources/icons/menu/reply.png new file mode 100644 index 000000000..6d14fe2f3 Binary files /dev/null and b/Telegram/Resources/icons/menu/reply.png differ diff --git a/Telegram/Resources/icons/menu/reply@2x.png b/Telegram/Resources/icons/menu/reply@2x.png new file mode 100644 index 000000000..b0c2f125e Binary files /dev/null and b/Telegram/Resources/icons/menu/reply@2x.png differ diff --git a/Telegram/Resources/icons/menu/reply@3x.png b/Telegram/Resources/icons/menu/reply@3x.png new file mode 100644 index 000000000..4b006f222 Binary files /dev/null and b/Telegram/Resources/icons/menu/reply@3x.png differ diff --git a/Telegram/Resources/icons/menu/report.png b/Telegram/Resources/icons/menu/report.png new file mode 100644 index 000000000..f78d51534 Binary files /dev/null and b/Telegram/Resources/icons/menu/report.png differ diff --git a/Telegram/Resources/icons/menu/report@2x.png b/Telegram/Resources/icons/menu/report@2x.png new file mode 100644 index 000000000..607e9eb2c Binary files /dev/null and b/Telegram/Resources/icons/menu/report@2x.png differ diff --git a/Telegram/Resources/icons/menu/report@3x.png b/Telegram/Resources/icons/menu/report@3x.png new file mode 100644 index 000000000..83a0229f5 Binary files /dev/null and b/Telegram/Resources/icons/menu/report@3x.png differ diff --git a/Telegram/Resources/icons/menu/reschedule.png b/Telegram/Resources/icons/menu/reschedule.png new file mode 100644 index 000000000..52f25f4f1 Binary files /dev/null and b/Telegram/Resources/icons/menu/reschedule.png differ diff --git a/Telegram/Resources/icons/menu/reschedule@2x.png b/Telegram/Resources/icons/menu/reschedule@2x.png new file mode 100644 index 000000000..85464053a Binary files /dev/null and b/Telegram/Resources/icons/menu/reschedule@2x.png differ diff --git a/Telegram/Resources/icons/menu/reschedule@3x.png b/Telegram/Resources/icons/menu/reschedule@3x.png new file mode 100644 index 000000000..e64a3c489 Binary files /dev/null and b/Telegram/Resources/icons/menu/reschedule@3x.png differ diff --git a/Telegram/Resources/icons/menu/restart_bot.png b/Telegram/Resources/icons/menu/restart_bot.png new file mode 100644 index 000000000..713b28023 Binary files /dev/null and b/Telegram/Resources/icons/menu/restart_bot.png differ diff --git a/Telegram/Resources/icons/menu/restart_bot@2x.png b/Telegram/Resources/icons/menu/restart_bot@2x.png new file mode 100644 index 000000000..4f35a7aa3 Binary files /dev/null and b/Telegram/Resources/icons/menu/restart_bot@2x.png differ diff --git a/Telegram/Resources/icons/menu/restart_bot@3x.png b/Telegram/Resources/icons/menu/restart_bot@3x.png new file mode 100644 index 000000000..3429d712e Binary files /dev/null and b/Telegram/Resources/icons/menu/restart_bot@3x.png differ diff --git a/Telegram/Resources/icons/menu/restore.png b/Telegram/Resources/icons/menu/restore.png new file mode 100644 index 000000000..77c5cada6 Binary files /dev/null and b/Telegram/Resources/icons/menu/restore.png differ diff --git a/Telegram/Resources/icons/menu/restore@2x.png b/Telegram/Resources/icons/menu/restore@2x.png new file mode 100644 index 000000000..c375ba499 Binary files /dev/null and b/Telegram/Resources/icons/menu/restore@2x.png differ diff --git a/Telegram/Resources/icons/menu/restore@3x.png b/Telegram/Resources/icons/menu/restore@3x.png new file mode 100644 index 000000000..5afae757e Binary files /dev/null and b/Telegram/Resources/icons/menu/restore@3x.png differ diff --git a/Telegram/Resources/icons/menu/retract_vote.png b/Telegram/Resources/icons/menu/retract_vote.png new file mode 100644 index 000000000..ae18d51e9 Binary files /dev/null and b/Telegram/Resources/icons/menu/retract_vote.png differ diff --git a/Telegram/Resources/icons/menu/retract_vote@2x.png b/Telegram/Resources/icons/menu/retract_vote@2x.png new file mode 100644 index 000000000..20a18160b Binary files /dev/null and b/Telegram/Resources/icons/menu/retract_vote@2x.png differ diff --git a/Telegram/Resources/icons/menu/retract_vote@3x.png b/Telegram/Resources/icons/menu/retract_vote@3x.png new file mode 100644 index 000000000..ee6da2efd Binary files /dev/null and b/Telegram/Resources/icons/menu/retract_vote@3x.png differ diff --git a/Telegram/Resources/icons/menu/save_image.png b/Telegram/Resources/icons/menu/save_image.png new file mode 100644 index 000000000..51899e994 Binary files /dev/null and b/Telegram/Resources/icons/menu/save_image.png differ diff --git a/Telegram/Resources/icons/menu/save_image@2x.png b/Telegram/Resources/icons/menu/save_image@2x.png new file mode 100644 index 000000000..05d1dae5c Binary files /dev/null and b/Telegram/Resources/icons/menu/save_image@2x.png differ diff --git a/Telegram/Resources/icons/menu/save_image@3x.png b/Telegram/Resources/icons/menu/save_image@3x.png new file mode 100644 index 000000000..1464a3d67 Binary files /dev/null and b/Telegram/Resources/icons/menu/save_image@3x.png differ diff --git a/Telegram/Resources/icons/menu/search.png b/Telegram/Resources/icons/menu/search.png new file mode 100644 index 000000000..330527560 Binary files /dev/null and b/Telegram/Resources/icons/menu/search.png differ diff --git a/Telegram/Resources/icons/menu/search@2x.png b/Telegram/Resources/icons/menu/search@2x.png new file mode 100644 index 000000000..f01073322 Binary files /dev/null and b/Telegram/Resources/icons/menu/search@2x.png differ diff --git a/Telegram/Resources/icons/menu/search@3x.png b/Telegram/Resources/icons/menu/search@3x.png new file mode 100644 index 000000000..197f7a24c Binary files /dev/null and b/Telegram/Resources/icons/menu/search@3x.png differ diff --git a/Telegram/Resources/icons/menu/select.png b/Telegram/Resources/icons/menu/select.png new file mode 100644 index 000000000..b67513cf5 Binary files /dev/null and b/Telegram/Resources/icons/menu/select.png differ diff --git a/Telegram/Resources/icons/menu/select@2x.png b/Telegram/Resources/icons/menu/select@2x.png new file mode 100644 index 000000000..901bf9e49 Binary files /dev/null and b/Telegram/Resources/icons/menu/select@2x.png differ diff --git a/Telegram/Resources/icons/menu/select@3x.png b/Telegram/Resources/icons/menu/select@3x.png new file mode 100644 index 000000000..fad75def0 Binary files /dev/null and b/Telegram/Resources/icons/menu/select@3x.png differ diff --git a/Telegram/Resources/icons/menu/send.png b/Telegram/Resources/icons/menu/send.png new file mode 100644 index 000000000..3daa1f2d8 Binary files /dev/null and b/Telegram/Resources/icons/menu/send.png differ diff --git a/Telegram/Resources/icons/menu/send@2x.png b/Telegram/Resources/icons/menu/send@2x.png new file mode 100644 index 000000000..3c7fb0829 Binary files /dev/null and b/Telegram/Resources/icons/menu/send@2x.png differ diff --git a/Telegram/Resources/icons/menu/send@3x.png b/Telegram/Resources/icons/menu/send@3x.png new file mode 100644 index 000000000..3cf5d4a3e Binary files /dev/null and b/Telegram/Resources/icons/menu/send@3x.png differ diff --git a/Telegram/Resources/icons/menu/send_when_online.png b/Telegram/Resources/icons/menu/send_when_online.png new file mode 100644 index 000000000..c351562eb Binary files /dev/null and b/Telegram/Resources/icons/menu/send_when_online.png differ diff --git a/Telegram/Resources/icons/menu/send_when_online@2x.png b/Telegram/Resources/icons/menu/send_when_online@2x.png new file mode 100644 index 000000000..9099425f7 Binary files /dev/null and b/Telegram/Resources/icons/menu/send_when_online@2x.png differ diff --git a/Telegram/Resources/icons/menu/send_when_online@3x.png b/Telegram/Resources/icons/menu/send_when_online@3x.png new file mode 100644 index 000000000..57be0db3d Binary files /dev/null and b/Telegram/Resources/icons/menu/send_when_online@3x.png differ diff --git a/Telegram/Resources/icons/menu/settings.png b/Telegram/Resources/icons/menu/settings.png new file mode 100644 index 000000000..9b7ba02b3 Binary files /dev/null and b/Telegram/Resources/icons/menu/settings.png differ diff --git a/Telegram/Resources/icons/menu/settings@2x.png b/Telegram/Resources/icons/menu/settings@2x.png new file mode 100644 index 000000000..79cd023ac Binary files /dev/null and b/Telegram/Resources/icons/menu/settings@2x.png differ diff --git a/Telegram/Resources/icons/menu/settings@3x.png b/Telegram/Resources/icons/menu/settings@3x.png new file mode 100644 index 000000000..df1656833 Binary files /dev/null and b/Telegram/Resources/icons/menu/settings@3x.png differ diff --git a/Telegram/Resources/icons/menu/share.png b/Telegram/Resources/icons/menu/share.png new file mode 100644 index 000000000..0083d3ce9 Binary files /dev/null and b/Telegram/Resources/icons/menu/share.png differ diff --git a/Telegram/Resources/icons/menu/share2.png b/Telegram/Resources/icons/menu/share2.png new file mode 100644 index 000000000..cc8d32ac2 Binary files /dev/null and b/Telegram/Resources/icons/menu/share2.png differ diff --git a/Telegram/Resources/icons/menu/share2@2x.png b/Telegram/Resources/icons/menu/share2@2x.png new file mode 100644 index 000000000..5b5fe0069 Binary files /dev/null and b/Telegram/Resources/icons/menu/share2@2x.png differ diff --git a/Telegram/Resources/icons/menu/share2@3x.png b/Telegram/Resources/icons/menu/share2@3x.png new file mode 100644 index 000000000..450f17fdb Binary files /dev/null and b/Telegram/Resources/icons/menu/share2@3x.png differ diff --git a/Telegram/Resources/icons/menu/share@2x.png b/Telegram/Resources/icons/menu/share@2x.png new file mode 100644 index 000000000..71fd45bc8 Binary files /dev/null and b/Telegram/Resources/icons/menu/share@2x.png differ diff --git a/Telegram/Resources/icons/menu/share@3x.png b/Telegram/Resources/icons/menu/share@3x.png new file mode 100644 index 000000000..9f2dadbbd Binary files /dev/null and b/Telegram/Resources/icons/menu/share@3x.png differ diff --git a/Telegram/Resources/icons/menu/show_in_chat.png b/Telegram/Resources/icons/menu/show_in_chat.png new file mode 100644 index 000000000..e9e7c0b1b Binary files /dev/null and b/Telegram/Resources/icons/menu/show_in_chat.png differ diff --git a/Telegram/Resources/icons/menu/show_in_chat@2x.png b/Telegram/Resources/icons/menu/show_in_chat@2x.png new file mode 100644 index 000000000..a69a81931 Binary files /dev/null and b/Telegram/Resources/icons/menu/show_in_chat@2x.png differ diff --git a/Telegram/Resources/icons/menu/show_in_chat@3x.png b/Telegram/Resources/icons/menu/show_in_chat@3x.png new file mode 100644 index 000000000..3e363244c Binary files /dev/null and b/Telegram/Resources/icons/menu/show_in_chat@3x.png differ diff --git a/Telegram/Resources/icons/menu/show_in_folder.png b/Telegram/Resources/icons/menu/show_in_folder.png new file mode 100644 index 000000000..c10ca4ac1 Binary files /dev/null and b/Telegram/Resources/icons/menu/show_in_folder.png differ diff --git a/Telegram/Resources/icons/menu/show_in_folder@2x.png b/Telegram/Resources/icons/menu/show_in_folder@2x.png new file mode 100644 index 000000000..0ff5f823c Binary files /dev/null and b/Telegram/Resources/icons/menu/show_in_folder@2x.png differ diff --git a/Telegram/Resources/icons/menu/show_in_folder@3x.png b/Telegram/Resources/icons/menu/show_in_folder@3x.png new file mode 100644 index 000000000..fd4c34710 Binary files /dev/null and b/Telegram/Resources/icons/menu/show_in_folder@3x.png differ diff --git a/Telegram/Resources/icons/menu/stickers.png b/Telegram/Resources/icons/menu/stickers.png new file mode 100644 index 000000000..cd5982410 Binary files /dev/null and b/Telegram/Resources/icons/menu/stickers.png differ diff --git a/Telegram/Resources/icons/menu/stickers@2x.png b/Telegram/Resources/icons/menu/stickers@2x.png new file mode 100644 index 000000000..58b4c68fa Binary files /dev/null and b/Telegram/Resources/icons/menu/stickers@2x.png differ diff --git a/Telegram/Resources/icons/menu/stickers@3x.png b/Telegram/Resources/icons/menu/stickers@3x.png new file mode 100644 index 000000000..b2ee00182 Binary files /dev/null and b/Telegram/Resources/icons/menu/stickers@3x.png differ diff --git a/Telegram/Resources/icons/menu/stop_poll.png b/Telegram/Resources/icons/menu/stop_poll.png new file mode 100644 index 000000000..fefc3b20d Binary files /dev/null and b/Telegram/Resources/icons/menu/stop_poll.png differ diff --git a/Telegram/Resources/icons/menu/stop_poll@2x.png b/Telegram/Resources/icons/menu/stop_poll@2x.png new file mode 100644 index 000000000..36844744e Binary files /dev/null and b/Telegram/Resources/icons/menu/stop_poll@2x.png differ diff --git a/Telegram/Resources/icons/menu/stop_poll@3x.png b/Telegram/Resources/icons/menu/stop_poll@3x.png new file mode 100644 index 000000000..e776e66ad Binary files /dev/null and b/Telegram/Resources/icons/menu/stop_poll@3x.png differ diff --git a/Telegram/Resources/icons/menu/unarchive.png b/Telegram/Resources/icons/menu/unarchive.png new file mode 100644 index 000000000..358c6f38d Binary files /dev/null and b/Telegram/Resources/icons/menu/unarchive.png differ diff --git a/Telegram/Resources/icons/menu/unarchive@2x.png b/Telegram/Resources/icons/menu/unarchive@2x.png new file mode 100644 index 000000000..807a027da Binary files /dev/null and b/Telegram/Resources/icons/menu/unarchive@2x.png differ diff --git a/Telegram/Resources/icons/menu/unarchive@3x.png b/Telegram/Resources/icons/menu/unarchive@3x.png new file mode 100644 index 000000000..95e772123 Binary files /dev/null and b/Telegram/Resources/icons/menu/unarchive@3x.png differ diff --git a/Telegram/Resources/icons/menu/unblock.png b/Telegram/Resources/icons/menu/unblock.png new file mode 100644 index 000000000..9c204d83d Binary files /dev/null and b/Telegram/Resources/icons/menu/unblock.png differ diff --git a/Telegram/Resources/icons/menu/unblock@2x.png b/Telegram/Resources/icons/menu/unblock@2x.png new file mode 100644 index 000000000..3908aaedb Binary files /dev/null and b/Telegram/Resources/icons/menu/unblock@2x.png differ diff --git a/Telegram/Resources/icons/menu/unblock@3x.png b/Telegram/Resources/icons/menu/unblock@3x.png new file mode 100644 index 000000000..8307f541e Binary files /dev/null and b/Telegram/Resources/icons/menu/unblock@3x.png differ diff --git a/Telegram/Resources/icons/menu/unfavorite.png b/Telegram/Resources/icons/menu/unfavorite.png new file mode 100644 index 000000000..dbad8a154 Binary files /dev/null and b/Telegram/Resources/icons/menu/unfavorite.png differ diff --git a/Telegram/Resources/icons/menu/unfavorite@2x.png b/Telegram/Resources/icons/menu/unfavorite@2x.png new file mode 100644 index 000000000..976f45135 Binary files /dev/null and b/Telegram/Resources/icons/menu/unfavorite@2x.png differ diff --git a/Telegram/Resources/icons/menu/unfavorite@3x.png b/Telegram/Resources/icons/menu/unfavorite@3x.png new file mode 100644 index 000000000..65642ed70 Binary files /dev/null and b/Telegram/Resources/icons/menu/unfavorite@3x.png differ diff --git a/Telegram/Resources/icons/menu/unmute.png b/Telegram/Resources/icons/menu/unmute.png new file mode 100644 index 000000000..c6aa5c4cb Binary files /dev/null and b/Telegram/Resources/icons/menu/unmute.png differ diff --git a/Telegram/Resources/icons/menu/unmute@2x.png b/Telegram/Resources/icons/menu/unmute@2x.png new file mode 100644 index 000000000..b274b61ee Binary files /dev/null and b/Telegram/Resources/icons/menu/unmute@2x.png differ diff --git a/Telegram/Resources/icons/menu/unmute@3x.png b/Telegram/Resources/icons/menu/unmute@3x.png new file mode 100644 index 000000000..5808a5594 Binary files /dev/null and b/Telegram/Resources/icons/menu/unmute@3x.png differ diff --git a/Telegram/Resources/icons/menu/unpin.png b/Telegram/Resources/icons/menu/unpin.png new file mode 100644 index 000000000..9c62c0c33 Binary files /dev/null and b/Telegram/Resources/icons/menu/unpin.png differ diff --git a/Telegram/Resources/icons/menu/unpin@2x.png b/Telegram/Resources/icons/menu/unpin@2x.png new file mode 100644 index 000000000..37c34e80b Binary files /dev/null and b/Telegram/Resources/icons/menu/unpin@2x.png differ diff --git a/Telegram/Resources/icons/menu/unpin@3x.png b/Telegram/Resources/icons/menu/unpin@3x.png new file mode 100644 index 000000000..0151d858d Binary files /dev/null and b/Telegram/Resources/icons/menu/unpin@3x.png differ diff --git a/Telegram/Resources/icons/menu/unread.png b/Telegram/Resources/icons/menu/unread.png new file mode 100644 index 000000000..0e8396588 Binary files /dev/null and b/Telegram/Resources/icons/menu/unread.png differ diff --git a/Telegram/Resources/icons/menu/unread@2x.png b/Telegram/Resources/icons/menu/unread@2x.png new file mode 100644 index 000000000..b452b9e74 Binary files /dev/null and b/Telegram/Resources/icons/menu/unread@2x.png differ diff --git a/Telegram/Resources/icons/menu/unread@3x.png b/Telegram/Resources/icons/menu/unread@3x.png new file mode 100644 index 000000000..d8571a7c9 Binary files /dev/null and b/Telegram/Resources/icons/menu/unread@3x.png differ diff --git a/Telegram/Resources/icons/menu/view_replies.png b/Telegram/Resources/icons/menu/view_replies.png new file mode 100644 index 000000000..2f57201cc Binary files /dev/null and b/Telegram/Resources/icons/menu/view_replies.png differ diff --git a/Telegram/Resources/icons/menu/view_replies@2x.png b/Telegram/Resources/icons/menu/view_replies@2x.png new file mode 100644 index 000000000..4121c8a13 Binary files /dev/null and b/Telegram/Resources/icons/menu/view_replies@2x.png differ diff --git a/Telegram/Resources/icons/menu/view_replies@3x.png b/Telegram/Resources/icons/menu/view_replies@3x.png new file mode 100644 index 000000000..8055156bd Binary files /dev/null and b/Telegram/Resources/icons/menu/view_replies@3x.png differ diff --git a/Telegram/Resources/icons/settings_advanced.png b/Telegram/Resources/icons/settings/settings_advanced.png similarity index 100% rename from Telegram/Resources/icons/settings_advanced.png rename to Telegram/Resources/icons/settings/settings_advanced.png diff --git a/Telegram/Resources/icons/settings_advanced@2x.png b/Telegram/Resources/icons/settings/settings_advanced@2x.png similarity index 100% rename from Telegram/Resources/icons/settings_advanced@2x.png rename to Telegram/Resources/icons/settings/settings_advanced@2x.png diff --git a/Telegram/Resources/icons/settings_advanced@3x.png b/Telegram/Resources/icons/settings/settings_advanced@3x.png similarity index 100% rename from Telegram/Resources/icons/settings_advanced@3x.png rename to Telegram/Resources/icons/settings/settings_advanced@3x.png diff --git a/Telegram/Resources/icons/settings_chat.png b/Telegram/Resources/icons/settings/settings_chat.png similarity index 100% rename from Telegram/Resources/icons/settings_chat.png rename to Telegram/Resources/icons/settings/settings_chat.png diff --git a/Telegram/Resources/icons/settings_chat@2x.png b/Telegram/Resources/icons/settings/settings_chat@2x.png similarity index 100% rename from Telegram/Resources/icons/settings_chat@2x.png rename to Telegram/Resources/icons/settings/settings_chat@2x.png diff --git a/Telegram/Resources/icons/settings_chat@3x.png b/Telegram/Resources/icons/settings/settings_chat@3x.png similarity index 100% rename from Telegram/Resources/icons/settings_chat@3x.png rename to Telegram/Resources/icons/settings/settings_chat@3x.png diff --git a/Telegram/Resources/icons/settings_cloud.png b/Telegram/Resources/icons/settings/settings_cloud.png similarity index 100% rename from Telegram/Resources/icons/settings_cloud.png rename to Telegram/Resources/icons/settings/settings_cloud.png diff --git a/Telegram/Resources/icons/settings_cloud@2x.png b/Telegram/Resources/icons/settings/settings_cloud@2x.png similarity index 100% rename from Telegram/Resources/icons/settings_cloud@2x.png rename to Telegram/Resources/icons/settings/settings_cloud@2x.png diff --git a/Telegram/Resources/icons/settings_cloud@3x.png b/Telegram/Resources/icons/settings/settings_cloud@3x.png similarity index 100% rename from Telegram/Resources/icons/settings_cloud@3x.png rename to Telegram/Resources/icons/settings/settings_cloud@3x.png diff --git a/Telegram/Resources/icons/settings_edit.png b/Telegram/Resources/icons/settings/settings_edit.png similarity index 100% rename from Telegram/Resources/icons/settings_edit.png rename to Telegram/Resources/icons/settings/settings_edit.png diff --git a/Telegram/Resources/icons/settings_edit@2x.png b/Telegram/Resources/icons/settings/settings_edit@2x.png similarity index 100% rename from Telegram/Resources/icons/settings_edit@2x.png rename to Telegram/Resources/icons/settings/settings_edit@2x.png diff --git a/Telegram/Resources/icons/settings_edit@3x.png b/Telegram/Resources/icons/settings/settings_edit@3x.png similarity index 100% rename from Telegram/Resources/icons/settings_edit@3x.png rename to Telegram/Resources/icons/settings/settings_edit@3x.png diff --git a/Telegram/Resources/icons/settings_edit_name.png b/Telegram/Resources/icons/settings/settings_edit_name.png similarity index 100% rename from Telegram/Resources/icons/settings_edit_name.png rename to Telegram/Resources/icons/settings/settings_edit_name.png diff --git a/Telegram/Resources/icons/settings_edit_name@2x.png b/Telegram/Resources/icons/settings/settings_edit_name@2x.png similarity index 100% rename from Telegram/Resources/icons/settings_edit_name@2x.png rename to Telegram/Resources/icons/settings/settings_edit_name@2x.png diff --git a/Telegram/Resources/icons/settings_edit_name@3x.png b/Telegram/Resources/icons/settings/settings_edit_name@3x.png similarity index 100% rename from Telegram/Resources/icons/settings_edit_name@3x.png rename to Telegram/Resources/icons/settings/settings_edit_name@3x.png diff --git a/Telegram/Resources/icons/settings_emoji.png b/Telegram/Resources/icons/settings/settings_emoji.png similarity index 100% rename from Telegram/Resources/icons/settings_emoji.png rename to Telegram/Resources/icons/settings/settings_emoji.png diff --git a/Telegram/Resources/icons/settings_emoji@2x.png b/Telegram/Resources/icons/settings/settings_emoji@2x.png similarity index 100% rename from Telegram/Resources/icons/settings_emoji@2x.png rename to Telegram/Resources/icons/settings/settings_emoji@2x.png diff --git a/Telegram/Resources/icons/settings_emoji@3x.png b/Telegram/Resources/icons/settings/settings_emoji@3x.png similarity index 100% rename from Telegram/Resources/icons/settings_emoji@3x.png rename to Telegram/Resources/icons/settings/settings_emoji@3x.png diff --git a/Telegram/Resources/icons/settings_faq.png b/Telegram/Resources/icons/settings/settings_faq.png similarity index 100% rename from Telegram/Resources/icons/settings_faq.png rename to Telegram/Resources/icons/settings/settings_faq.png diff --git a/Telegram/Resources/icons/settings_faq@2x.png b/Telegram/Resources/icons/settings/settings_faq@2x.png similarity index 100% rename from Telegram/Resources/icons/settings_faq@2x.png rename to Telegram/Resources/icons/settings/settings_faq@2x.png diff --git a/Telegram/Resources/icons/settings_faq@3x.png b/Telegram/Resources/icons/settings/settings_faq@3x.png similarity index 100% rename from Telegram/Resources/icons/settings_faq@3x.png rename to Telegram/Resources/icons/settings/settings_faq@3x.png diff --git a/Telegram/Resources/icons/settings_folders.png b/Telegram/Resources/icons/settings/settings_folders.png similarity index 100% rename from Telegram/Resources/icons/settings_folders.png rename to Telegram/Resources/icons/settings/settings_folders.png diff --git a/Telegram/Resources/icons/settings_folders@2x.png b/Telegram/Resources/icons/settings/settings_folders@2x.png similarity index 100% rename from Telegram/Resources/icons/settings_folders@2x.png rename to Telegram/Resources/icons/settings/settings_folders@2x.png diff --git a/Telegram/Resources/icons/settings_folders@3x.png b/Telegram/Resources/icons/settings/settings_folders@3x.png similarity index 100% rename from Telegram/Resources/icons/settings_folders@3x.png rename to Telegram/Resources/icons/settings/settings_folders@3x.png diff --git a/Telegram/Resources/icons/settings_information.png b/Telegram/Resources/icons/settings/settings_information.png similarity index 100% rename from Telegram/Resources/icons/settings_information.png rename to Telegram/Resources/icons/settings/settings_information.png diff --git a/Telegram/Resources/icons/settings_information@2x.png b/Telegram/Resources/icons/settings/settings_information@2x.png similarity index 100% rename from Telegram/Resources/icons/settings_information@2x.png rename to Telegram/Resources/icons/settings/settings_information@2x.png diff --git a/Telegram/Resources/icons/settings_information@3x.png b/Telegram/Resources/icons/settings/settings_information@3x.png similarity index 100% rename from Telegram/Resources/icons/settings_information@3x.png rename to Telegram/Resources/icons/settings/settings_information@3x.png diff --git a/Telegram/Resources/icons/settings_interface_scale.png b/Telegram/Resources/icons/settings/settings_interface_scale.png similarity index 100% rename from Telegram/Resources/icons/settings_interface_scale.png rename to Telegram/Resources/icons/settings/settings_interface_scale.png diff --git a/Telegram/Resources/icons/settings_interface_scale@2x.png b/Telegram/Resources/icons/settings/settings_interface_scale@2x.png similarity index 100% rename from Telegram/Resources/icons/settings_interface_scale@2x.png rename to Telegram/Resources/icons/settings/settings_interface_scale@2x.png diff --git a/Telegram/Resources/icons/settings_interface_scale@3x.png b/Telegram/Resources/icons/settings/settings_interface_scale@3x.png similarity index 100% rename from Telegram/Resources/icons/settings_interface_scale@3x.png rename to Telegram/Resources/icons/settings/settings_interface_scale@3x.png diff --git a/Telegram/Resources/icons/settings_kotato.png b/Telegram/Resources/icons/settings/settings_kotato.png similarity index 100% rename from Telegram/Resources/icons/settings_kotato.png rename to Telegram/Resources/icons/settings/settings_kotato.png diff --git a/Telegram/Resources/icons/settings_kotato@2x.png b/Telegram/Resources/icons/settings/settings_kotato@2x.png similarity index 100% rename from Telegram/Resources/icons/settings_kotato@2x.png rename to Telegram/Resources/icons/settings/settings_kotato@2x.png diff --git a/Telegram/Resources/icons/settings_kotato@3x.png b/Telegram/Resources/icons/settings/settings_kotato@3x.png similarity index 100% rename from Telegram/Resources/icons/settings_kotato@3x.png rename to Telegram/Resources/icons/settings/settings_kotato@3x.png diff --git a/Telegram/Resources/icons/settings_kotato_old.png b/Telegram/Resources/icons/settings/settings_kotato_old.png similarity index 100% rename from Telegram/Resources/icons/settings_kotato_old.png rename to Telegram/Resources/icons/settings/settings_kotato_old.png diff --git a/Telegram/Resources/icons/settings_kotato_old@2x.png b/Telegram/Resources/icons/settings/settings_kotato_old@2x.png similarity index 100% rename from Telegram/Resources/icons/settings_kotato_old@2x.png rename to Telegram/Resources/icons/settings/settings_kotato_old@2x.png diff --git a/Telegram/Resources/icons/settings_kotato_old@3x.png b/Telegram/Resources/icons/settings/settings_kotato_old@3x.png similarity index 100% rename from Telegram/Resources/icons/settings_kotato_old@3x.png rename to Telegram/Resources/icons/settings/settings_kotato_old@3x.png diff --git a/Telegram/Resources/icons/settings_language.png b/Telegram/Resources/icons/settings/settings_language.png similarity index 100% rename from Telegram/Resources/icons/settings_language.png rename to Telegram/Resources/icons/settings/settings_language.png diff --git a/Telegram/Resources/icons/settings_language@2x.png b/Telegram/Resources/icons/settings/settings_language@2x.png similarity index 100% rename from Telegram/Resources/icons/settings_language@2x.png rename to Telegram/Resources/icons/settings/settings_language@2x.png diff --git a/Telegram/Resources/icons/settings_language@3x.png b/Telegram/Resources/icons/settings/settings_language@3x.png similarity index 100% rename from Telegram/Resources/icons/settings_language@3x.png rename to Telegram/Resources/icons/settings/settings_language@3x.png diff --git a/Telegram/Resources/icons/settings_name.png b/Telegram/Resources/icons/settings/settings_name.png similarity index 100% rename from Telegram/Resources/icons/settings_name.png rename to Telegram/Resources/icons/settings/settings_name.png diff --git a/Telegram/Resources/icons/settings_name@2x.png b/Telegram/Resources/icons/settings/settings_name@2x.png similarity index 100% rename from Telegram/Resources/icons/settings_name@2x.png rename to Telegram/Resources/icons/settings/settings_name@2x.png diff --git a/Telegram/Resources/icons/settings_name@3x.png b/Telegram/Resources/icons/settings/settings_name@3x.png similarity index 100% rename from Telegram/Resources/icons/settings_name@3x.png rename to Telegram/Resources/icons/settings/settings_name@3x.png diff --git a/Telegram/Resources/icons/settings_notifications.png b/Telegram/Resources/icons/settings/settings_notifications.png similarity index 100% rename from Telegram/Resources/icons/settings_notifications.png rename to Telegram/Resources/icons/settings/settings_notifications.png diff --git a/Telegram/Resources/icons/settings_notifications@2x.png b/Telegram/Resources/icons/settings/settings_notifications@2x.png similarity index 100% rename from Telegram/Resources/icons/settings_notifications@2x.png rename to Telegram/Resources/icons/settings/settings_notifications@2x.png diff --git a/Telegram/Resources/icons/settings_notifications@3x.png b/Telegram/Resources/icons/settings/settings_notifications@3x.png similarity index 100% rename from Telegram/Resources/icons/settings_notifications@3x.png rename to Telegram/Resources/icons/settings/settings_notifications@3x.png diff --git a/Telegram/Resources/icons/settings_phone_number.png b/Telegram/Resources/icons/settings/settings_phone_number.png similarity index 100% rename from Telegram/Resources/icons/settings_phone_number.png rename to Telegram/Resources/icons/settings/settings_phone_number.png diff --git a/Telegram/Resources/icons/settings_phone_number@2x.png b/Telegram/Resources/icons/settings/settings_phone_number@2x.png similarity index 100% rename from Telegram/Resources/icons/settings_phone_number@2x.png rename to Telegram/Resources/icons/settings/settings_phone_number@2x.png diff --git a/Telegram/Resources/icons/settings_phone_number@3x.png b/Telegram/Resources/icons/settings/settings_phone_number@3x.png similarity index 100% rename from Telegram/Resources/icons/settings_phone_number@3x.png rename to Telegram/Resources/icons/settings/settings_phone_number@3x.png diff --git a/Telegram/Resources/icons/settings_privacy_security.png b/Telegram/Resources/icons/settings/settings_privacy_security.png similarity index 100% rename from Telegram/Resources/icons/settings_privacy_security.png rename to Telegram/Resources/icons/settings/settings_privacy_security.png diff --git a/Telegram/Resources/icons/settings_privacy_security@2x.png b/Telegram/Resources/icons/settings/settings_privacy_security@2x.png similarity index 100% rename from Telegram/Resources/icons/settings_privacy_security@2x.png rename to Telegram/Resources/icons/settings/settings_privacy_security@2x.png diff --git a/Telegram/Resources/icons/settings_privacy_security@3x.png b/Telegram/Resources/icons/settings/settings_privacy_security@3x.png similarity index 100% rename from Telegram/Resources/icons/settings_privacy_security@3x.png rename to Telegram/Resources/icons/settings/settings_privacy_security@3x.png diff --git a/Telegram/Resources/icons/settings_stickers.png b/Telegram/Resources/icons/settings/settings_stickers.png similarity index 100% rename from Telegram/Resources/icons/settings_stickers.png rename to Telegram/Resources/icons/settings/settings_stickers.png diff --git a/Telegram/Resources/icons/settings_stickers@2x.png b/Telegram/Resources/icons/settings/settings_stickers@2x.png similarity index 100% rename from Telegram/Resources/icons/settings_stickers@2x.png rename to Telegram/Resources/icons/settings/settings_stickers@2x.png diff --git a/Telegram/Resources/icons/settings_stickers@3x.png b/Telegram/Resources/icons/settings/settings_stickers@3x.png similarity index 100% rename from Telegram/Resources/icons/settings_stickers@3x.png rename to Telegram/Resources/icons/settings/settings_stickers@3x.png diff --git a/Telegram/Resources/icons/settings_themes.png b/Telegram/Resources/icons/settings/settings_themes.png similarity index 100% rename from Telegram/Resources/icons/settings_themes.png rename to Telegram/Resources/icons/settings/settings_themes.png diff --git a/Telegram/Resources/icons/settings_themes@2x.png b/Telegram/Resources/icons/settings/settings_themes@2x.png similarity index 100% rename from Telegram/Resources/icons/settings_themes@2x.png rename to Telegram/Resources/icons/settings/settings_themes@2x.png diff --git a/Telegram/Resources/icons/settings_themes@3x.png b/Telegram/Resources/icons/settings/settings_themes@3x.png similarity index 100% rename from Telegram/Resources/icons/settings_themes@3x.png rename to Telegram/Resources/icons/settings/settings_themes@3x.png diff --git a/Telegram/Resources/icons/settings_username.png b/Telegram/Resources/icons/settings/settings_username.png similarity index 100% rename from Telegram/Resources/icons/settings_username.png rename to Telegram/Resources/icons/settings/settings_username.png diff --git a/Telegram/Resources/icons/settings_username@2x.png b/Telegram/Resources/icons/settings/settings_username@2x.png similarity index 100% rename from Telegram/Resources/icons/settings_username@2x.png rename to Telegram/Resources/icons/settings/settings_username@2x.png diff --git a/Telegram/Resources/icons/settings_username@3x.png b/Telegram/Resources/icons/settings/settings_username@3x.png similarity index 100% rename from Telegram/Resources/icons/settings_username@3x.png rename to Telegram/Resources/icons/settings/settings_username@3x.png diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index 9f2550f2d..a44bf5484 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -440,7 +440,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_settings_phone_label" = "Phone number"; "lng_settings_username_add" = "Add username"; "lng_settings_close_sure" = "Are you sure you want to close this page? You didn't save your changes."; -//"lng_settings_peer_to_peer" = "Peer-to-Peer"; "lng_settings_peer_to_peer_about" = "Disabling peer-to-peer will relay all calls through Telegram servers to avoid revealing your IP address, but may slightly decrease audio quality."; "lng_settings_advanced" = "Advanced"; "lng_settings_stickers_emoji" = "Stickers and emoji"; @@ -917,8 +916,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_profile_files_header" = "Files"; "lng_profile_audios#one" = "{count} voice message"; "lng_profile_audios#other" = "{count} voice messages"; -//"lng_profile_rounds#one" = "{count} video message"; -//"lng_profile_rounds#other" = "{count} video messages"; "lng_profile_audios_header" = "Voice messages"; "lng_profile_shared_links#one" = "{count} shared link"; "lng_profile_shared_links#other" = "{count} shared links"; @@ -978,8 +975,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_media_selected_file#other" = "{count} Files"; "lng_media_selected_audio#one" = "{count} Voice message"; "lng_media_selected_audio#other" = "{count} Voice messages"; -//"lng_media_selected_round#one" = "{count} Video message"; -//"lng_media_selected_round#other" = "{count} Video messages"; "lng_media_selected_link#one" = "{count} Shared link"; "lng_media_selected_link#other" = "{count} Shared links"; "lng_media_photo_empty" = "No photos here yet"; @@ -1005,9 +1000,16 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_manage_peer_removed_users" = "Removed users"; "lng_manage_peer_permissions" = "Permissions"; "lng_manage_peer_invite_links" = "Invite links"; +"lng_manage_peer_reactions" = "Reactions"; +"lng_manage_peer_reactions_off" = "Off"; "lng_manage_peer_requests" = "Member Requests"; "lng_manage_peer_requests_channel" = "Subscriber Requests"; +"lng_manage_peer_reactions_enable" = "Enable Reactions"; +"lng_manage_peer_reactions_about" = "Allow members to react to group messages."; +"lng_manage_peer_reactions_about_channel" = "Allow subscribers to react to channel posts."; +"lng_manage_peer_reactions_available" = "Available reactions"; + "lng_manage_peer_group_type" = "Group type"; "lng_manage_peer_channel_type" = "Channel type"; "lng_manage_peer_link_type" = "Link type"; @@ -1724,7 +1726,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_context_send_message" = "Send message"; "lng_context_view_group" = "View group info"; "lng_context_view_channel" = "View channel info"; -//"lng_context_view_feed_info" = "View feed info"; "lng_context_hide_psa" = "Hide this announcement"; "lng_context_pin_to_top" = "Pin to top"; "lng_context_unpin_from_top" = "Unpin from top"; @@ -1740,6 +1741,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_context_archive_to_list" = "Move to chats list"; "lng_context_archive_to_menu_info" = "Archive moved to the main menu!\nYou can return it from the context menu of the archive button."; +"lng_context_mute" = "Mute notifications"; +"lng_context_unmute" = "Unmute"; + "lng_context_promote_admin" = "Promote to admin"; "lng_context_edit_permissions" = "Edit permissions"; "lng_context_restrict_user" = "Restrict user"; @@ -1798,6 +1802,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_context_seen_watched#one" = "{count} Watched"; "lng_context_seen_watched#other" = "{count} Watched"; "lng_context_seen_watched_none" = "Nobody Watched"; +"lng_context_seen_reacted#one" = "{count} Reacted"; +"lng_context_seen_reacted#other" = "{count} Reacted"; +"lng_context_seen_reacted_none" = "Nobody Reacted"; +"lng_context_seen_reacted_all" = "Show All Reactions"; "lng_send_image_empty" = "Could not send an empty file: {name}"; "lng_send_image_too_large" = "Could not send a file, because it is larger than 1500 MB: {name}"; @@ -1958,6 +1966,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_menu_formatting_underline" = "Underline"; "lng_menu_formatting_strike_out" = "Strike-through"; "lng_menu_formatting_monospace" = "Monospace"; +"lng_menu_formatting_spoiler" = "Spoiler"; "lng_menu_formatting_link_create" = "Create link"; "lng_menu_formatting_link_edit" = "Edit link"; "lng_menu_formatting_clear" = "Plain text"; @@ -2579,6 +2588,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_admin_log_messages_ttl_set" = "{from} enabled messages auto-delete after {duration}"; "lng_admin_log_messages_ttl_changed" = "{from} changed messages auto-delete period from {previous} to {duration}"; "lng_admin_log_messages_ttl_removed" = "{from} disabled messages auto-deletion after {duration}"; +"lng_admin_log_reactions_disabled" = "{from} disabled reactions"; +"lng_admin_log_reactions_updated" = "{from} updated the list of allowed reactions to: {emoji}"; "lng_admin_log_edited_invite_link" = "edited invite link {link}"; "lng_admin_log_invite_link_expire_date" = "Expire date: {previous} -> {limit}"; "lng_admin_log_invite_link_usage_limit" = "Usage limit: {previous} -> {limit}"; diff --git a/Telegram/Resources/qrc/qmime/freedesktop.org.xml b/Telegram/Resources/qrc/qmime/freedesktop.org.xml deleted file mode 100644 index 1f4742875..000000000 --- a/Telegram/Resources/qrc/qmime/freedesktop.org.xml +++ /dev/null @@ -1,34056 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -]> - - - ATK inset - شكل ATK - Ustaŭka ATK - Сбор — ATK - inset ATK - Vložka ATK - ATK-indsættelse - ATK-Inset - ATK inset - inserción ATK - ATK sartzapena - ATK-osio - ATK innskot - encart ATK - intlis ATK - conxunto ATK - תוספת ATK - ATK betét - Inset ATK - Inset ATK - ATK インセット - ATK беті - ATK inset - ATK inset - ATK ielaidums - ATK-innsats - ATK-invoegsel - ATK-innskot - Wstawka ATK - Conjunto de entrada do ATK - Inset ATK - вкладка ATK - Vložka ATK - Vložka ATK - Inset ATK - ATK-inlägg - вкладка ATK - Bộ dát ATK - ATK 嵌入对象 - ATK - Andrew Toolkit - - - - - electronic book document - مستند كتاب إلكتروني - elektronnaja kniha - Документ — електронна книга - document de llibre electrònic - Dokument elektronické knihy - elektronisk bogdokument - Elektronisches Buch - έγγραφο ηλεκτρονικού βιβλίου - electronic book document - documento de libro electrónico - liburu elektronikoaren dokumentua - elektroninen kirja - elektroniskbóka skjal - document livre électronique - leabhar leictreonach - documento de libro electrónico - מסמך מסוג ספר אלקטרוני - dokument elektroničke knjige - elektronikus könyvdokumentum - dokumen buku elektronik - Documento libro elettronico - 電子ブックドキュメント - электронды кітабы - 전자책 문서 - elektroninės knygos dokumentas - elektroniskās grāmatas dokuments - elektronisch boek - elektronisk bok-dokument - Dokument książki elektronicznej - Documento de livro eletrônico - document carte electronică - электронная книга - Dokument elektronickej knihy - dokument elektronske knjige - Dokument libri elektronik - elektroniskt bokdokument - elektronik kitap belgesi - документ електронної книги - tài liệu cuốn sách điện tử - 电子书文档 - 電子書文件 - - - - - - - - - - - - - - Adobe Illustrator document - مستند أدوبي المصور - Dakument Adobe Illustrator - Документ — Adobe Illustrator - document d'Adobe Illustrator - Dokument Adobe Illustrator - Adobe Illustrator-dokument - Adobe-Illustrator-Dokument - έγγραφο Adobe Illustrator - Adobe Illustrator document - dokumento de Adobe Illustrator - documento de Adobe Illustrator - Adobe Illustrator dokumentua - Adobe Illustrator -asiakirja - Adobe Illustrator skjal - document Adobe Illustrator - cáipéis Adobe Illustrator - documento de Adobe Ilustrator - מסמך Adobe Ill - Adobe Illustrator dokument - Adobe Illustrator-dokumentum - Dokumen Adobe Illustrator - Documento Adobe Illustrator - Adobe Illustrator ドキュメント - Adobe Illustrator-ის დოკუმენტი - Adobe Illustrator құжаты - 어도비 일러스트레이터 문서 - Adobe Illustrator dokumentas - Adobe Illustrator dokuments - Dokumen Adobe Illustrator - Adobe Illustrator-dokument - Adobe Illustrator-document - Adobe Illustrator-dokument - Dokument Adobe Illustrator - documento Adobe Illustrator - Documento do Adobe Illustrator - Document Adobe Illustrator - документ Adobe Illustrator - Dokument Adobe Illustrator - Dokument Adobe Illustrator - Dokument Adobe Illustrator - Адоуби Илустратор документ - Adobe Illustrator-dokument - документ Adobe Illustrator - Tài liệu Adobe Illustrator - Adobe Illustrator 文档 - Adobe Illustrator 文件 - - - - - Macintosh BinHex-encoded file - ملف Macintosh BinHex مشفر - Macintosh BinHex-kodlanmış fayl - Fajł Macintosh, BinHex-zakadavany - Файл — кодиран във формат BinHex за Macintosh - fitxer codificat BinHex de Macintosh - Soubor kódovaný pomocí Macintosh BinHex - Ffeil BinHex-amgodwyd Macintosh - Macintosh BinHex-kodet fil - Macintosh-Datei (BinHex-kodiert) - αρχείο Macintosh κωδικοποίησης BinHex - Macintosh BinHex-encoded file - dosiero kodigita laŭ Macintosh BinHex - archivo Macintosh codificado con BinHex - Macintosh BinHex-ekin kodetutako fitxategia - Macintosh BinHex -koodattu tiedosto - Macintosh BinHex-bronglað fíla - fichier codé Macintosh BinHex - comhad ionchódaithe le Macintosh BinHex - ficheiro de Macintosh codificado con BinHex - קובץ מסוג Macintosh BinHex-encoded - Macintosh BinHex-kodirana datoteka - Macintosh BinHex kódolású fájl - Berkas tersandi Macintosh BinHex - File Macintosh codificato BinHex - Macintosh BinHex エンコードファイル - Macintosh BinHex кодталған файлы - 매킨토시 BinHex 인코딩된 압축 파일 - Macintosh BinHex-encoded failas - Macintosh BinHex-kodēts datne - Fail terenkod-BinHex Macintosh - Macintosh BinHe-kodet arkiv - Macintosh BinHex-gecodeerd bestand - Macintosh BinHex-koda fil - Zakodowany w BinHex plik Macintosh - ficheiro codificado em BinHex de Macintosh - Arquivo do Macintosh codificado com BinHex - Fișier codat Macintosh BinHex - файл (закодированный Macintosh BinHex) - Súbor kódovaný pomocou Macintosh BinHex - Kodirana datoteka Macintosh (BinHex) - File Macintosh i kodifikuar BinHex - Мекинтош BinHex-encoded датотека - Macintosh BinHex-kodad fil - файл закодований Macintosh BinHex - Tập tin đã mã hoá BinHex của Macintosh - Macintosh BinHex 编码的文件 - Macintosh BinHex 編碼檔 - - - - - - - Mathematica Notebook - مذكرة رياضيات - Natatnik Mathematica - Тетрадка — Mathematica - llibreta de notes de Mathematica - Sešit Mathematica - Mathematica Notebook - Mathematica-Dokument - σημειωματάριο Mathematica - Mathematica Notebook - notebook de Mathematica - Mathematica Notebook - Mathematica-muistilehtiö - Mathematica skriviblokkur - carnet de notes Mathematica - leabhar nótaí Mathematica - notebook de Mathematica - מחברת מתמטיקה - Mathematica notesz - Mathematica Notebook - Notebook Mathematica - Mathematica ノートブック - Mathematica Notebook - Mathematica 노트북 - Mathematica užrašinė - Mathematica bloknots - Mathematica notisblokk - Mathematica-notitieboek - Mathematica-notatbok - Notatnik Mathematica - Caderno do Mathematica - Carnețel Mathematica - Mathematica Notebook - Zošit Mathematica - Datoteka dokumenta Mathematica - Notebook matematike - Mathematica Notebook-dokument - математичний записник - Cuốn vở Mathematica - Mathematica 记事 - Mathematica Notebook - - - - - - - - - - - - MathML document - مستند MathML - MathML sənədi - Dakument MathML - Документ — MathML - document de MathML - Dokument MathML - Dogfen MathML - MathML-dokument - MathML-Dokument - έγγραφο MathML - MathML document - MathML-dokumento - documento MathML - MathML dokumentua - MathML-asiakirja - MathML skjal - document MathML - cáipéis MathML - documento de MathML - מסמך MathML - MathML dokument - MathML-dokumentum - Dokumen MathML - Documento MathML - MathML ドキュメント - MathML-ის დოკუმენტი - MathML құжаты - MathML 문서 - MathML dokumentas - MathML dokuments - Dokumen MathML - MathML-dokument - MathML-document - MathML-dokument - Dokument MathML - documento MathML - Documento do MathML - Document MathML - документ MathML - Dokument MathML - Dokument MathML - Dokument MathML - MathML документ - MathML-dokument - MathML belgesi - документ MathML - Tài liệu MathML - MathML 文档 - MathML 文件 - MathML - Mathematical Markup Language - - - - - - - mailbox file - ملف صندوق البريد - fajł paštovaj skryni - Файл — Mailbox - fitxer mailbox - Soubor mailbox - postkassefil - Mailbox-Datei - αρχείο mailbox - mailbox file - archivo de buzón de correo - mailbox fitxategia - mailbox-tiedosto - postkassafíla - fichier boîte aux lettres - comhad bhosca poist - ficheiro de caixa de correo - קובץ תיבת-דואר - datoteka poštanskog sandučića - mailbox fájl - berkas kotak surat - File mailbox - メールボックスファイル - пошта жәшігінің файлы - 메일함 파일 - pašto dėžutės failas - pastkastītes datne - postboksfil - mailbox-bestand - mailbox-fil - Plik poczty (Mailbox) - Arquivo de caixa de correio - fișier căsuță poștală - файл почтового ящика - Súbor mailbox - datoteka poštnega predala - File mailbox - brevlådefil - файл поштової скриньки - tập tin hộp thư - mailbox 文件 - 郵箱檔 - - - - - - - - - Metalink file - ملف ميتالنك - Изтегляне — Metalink - fitxer Metalink - Soubor metalink - Metahenvisningsfil - Metalink-Datei - αρχείο Metalink - Metalink file - Metalink-dosiero - archivo de metaenlace - Metaestekaren fitxategia - Metalink-tiedosto - Metalink fíla - fichier metalink - comhad Metalink - ficheiro Metalink - קובץ Metalink - Metalink fájl - Berkas Metalink - File Metalink - Metalink ファイル - Metalink файлы - Metalink 파일 - Metalink failas - Metalink datne - Metalink bestand - Plik Metalink - Arquivo Metalink - Fișier Metalink - файл Metalink - Súbor Metalink - Datoteka povezave Metalink - Metalink-fil - Metalink dosyası - файл метапосилання - 元链接文件 - Metalink 檔案 - - - - - - - - - Metalink file - ملف ميتالنك - Изтегляне — Metalink - fitxer Metalink - Soubor metalink - Metahenvisningsfil - Metalink-Datei - αρχείο Metalink - Metalink file - Metalink-dosiero - archivo de metaenlace - Metaestekaren fitxategia - Metalink-tiedosto - Metalink fíla - fichier metalink - comhad Metalink - ficheiro Metalink - קובץ Metalink - Metalink fájl - Berkas Metalink - File Metalink - Metalink ファイル - Metalink файлы - Metalink 파일 - Metalink failas - Metalink datne - Metalink bestand - Plik Metalink - Arquivo Metalink - Fișier Metalink - файл Metalink - Súbor Metalink - Datoteka povezave Metalink - Metalink-fil - Metalink dosyası - файл метапосилання - 元链接文件 - Metalink 檔案 - - - - - - - - - unknown - مجهول - nieviadomy - Неизвестен тип - desconegut - Neznámý - ukendt - Unbekannt - άγνωστο - unknown - nekonate - desconocido - ezezaguna - tuntematon - ókent - inconnu - anaithnid - descoñecido - לא ידוע - nepoznato - ismeretlen - tak diketahui - Sconosciuto - 不明 - უცნობი - белгісіз - 알 수 없음 - nežinoma - nezināms - Entah - ukjent - onbekend - ukjend - Nieznany typ - desconhecido - Desconhecido - necunoscut - неизвестно - Neznámy - neznano - Nuk njihet - непознато - okänd - невідомо - không rõ - 未知 - 不明 - - - - ODA document - مستند ODA - ODA sənədi - Dakument ODA - Документ — ODA - document ODA - Dokument ODA - Dogfen ODA - ODA-dokument - ODA-Dokument - έγγραφο ODA - ODA document - ODA-dokumento - documento ODA - ODA dokumentua - ODA-asiakirja - ODA skjal - document ODA - cáipéis ODA - documento ODA - מסמך ODA - ODA dokument - ODA-dokumentum - Dokumen ODA - Documento ODA - ODA ドキュメント - ODA დოკუმენტი - ODA құжаты - ODA 문서 - ODA dokumentas - ODA dokuments - Dokumen ODA - ODA-dokument - ODA-document - ODA-dokument - Dokument ODA - documento ODA - Documento ODA - Document ODA - документ ODA - Dokument ODA - Dokument ODA - Dokument ODA - ODA документ - ODA-dokument - ODA belgesi - документ ODA - Tài liệu ODA - ODA 文档 - ODA 文件 - ODA - Office Document Architecture - - - - - WWF document - Документ — WWF - document WWF - Dokument WWF - WWF-dokument - WWF-Dokument - έγγραφο WWF - WWF document - WWF-dokumento - Documento de WWF - WWF-asiakirja - document WWF - documento de WWF - מסמך WWF - WWF dokument - WWF dokumentum - Dokumen WWF - Documento WWF - WWF 文書 - WWF დოკუმენტი - WWF құжаты - WWF 문서 - WWF dokuments - WWF document - Dokument WWF - Documento WWF - документ WWF - Dokument WWF - WWF-dokument - документ WWF - WWF - WWF 文件 - - - - - - - PDF document - مستند PDF - Dakument PDF - Документ — PDF - document PDF - Dokument PDF - Dogfen PDF - PDF-dokument - PDF-Dokument - έγγραφο PDF - PDF document - PDF-dokumento - documento PDF - PDF dokumentua - PDF-asiakirja - PDF skjal - document PDF - cáipéis PDF - documento PDF - מסמך PDF - PDF-dokumentum - Dokumen PDF - Documento PDF - PDF ドキュメント - PDF құжаты - PDF 문서 - PDF dokumentas - PDF dokuments - Dokumen PDF - PDF-dokument - PDF-document - PDF-dokument - Dokument PDF - documento PDF - Documento PDF - Document PDF - документ PDF - Dokument PDF - Dokument PDF - Dokument PDF - PDF документ - PDF-dokument - PDF belgesi - документ PDF - Tài liệu PDF - PDF 文档 - PDF 文件 - PDF - Portable Document Format - - - - - - - - - - - XSPF playlist - قائمة تشغيل XSPF - Śpis piesień XSPF - Списък за изпълнение — XSPF - llista de reproducció XSPF - Seznam skladeb XSPF - XSPF-afspilningsliste - XSPF-Wiedergabeliste - λίστα αναπαραγωγής XSPF - XSPF playlist - XSPF-ludlisto - lista de reproducción XSPF - XSPF erreprodukzio-zerrenda - XSPF-soittolista - XSPF avspælingarlisti - liste de lecture XSPF - seinmliosta XSPF - lista de reprodución XSPF - רשימת השמעה XSPF - XSPF popis za reprodukciju - XSPF-lejátszólista - Senarai pular XSPF - Scaletta XSPF - XSPF 再生リスト - XSPF ойнау тізімі - XSPF 재생 목록 - XSPF grojaraštis - XSPF repertuārs - XSPF-spilleliste - XSPF-afspeellijst - XSPF-speleliste - Lista odtwarzania XSPF - Lista de reprodução XSPF - Listă XSPF - список воспроизведения XSPF - Zoznam skladieb XSPF - Seznam predvajanja XSPF - Listë titujsh XSPF - XSPF-spellista - список програвання XSPF - Danh mục nhạc XSPF - XSPF 播放列表 - XSPF 播放清單 - XSPF - XML Shareable Playlist Format - - - - - - - - - - - - Microsoft Windows theme pack - حزمة سمات Microsoft Works - Пакет с тема — Microsoft Windows - paquet de temes Windows de Microsoft - Balík motivů Microsoft Windows - Microsoft Windows-temapakke - Themenpaket für Microsoft Windows - θεματικό πάρκο Microsoft Windows - Microsoft Windows theme pack - paquete de tema para Microsoft Windows - Microsoft Windows-en gaiaren paketea - Microsoft Windows -teemapaketti - Microsoft Windows tema pakki - paquet de thèmes Microsoft Windows - paca téamaí Microsoft Windows - paquete de tema de Microsoft Windows - חבילת ערכות נושא של Microsoft Windows - Microsoft Windows paket tema - Microsoft Windows témacsomag - Pak tema Microsoft Windows - Pacchetto temi Microsoft Windows - Microsoft Windows テーマパック - Microsoft Windows-ის თემის შეკვრა - Microsoft Windows тема дестесі - 마이크로소프트 Windows 테마 패키지 - Microsoft Windows temų paketas - Microsoft Windows motīvu paka - Microsoft Windows thema pack - Pakiet motywu Microsoft Windows - Pacote de temas do Microsoft Windows - Pachet de teme Microsoft Windows - пакет темы Microsoft Windows - Balík tém Microsoft Windows - Datoteka teme Microsoft Windows - Microsoft Windows-temapaket - пакунок з темою Microsoft Windows - Microsoft Windows 主题包 - 微軟視窗佈景主題包 - - - - - - AmazonMP3 download file - - - - GSM 06.10 audio - GSM 06.10 سمعي - Аудио — GSM 06.10 - àudio GSM 06.10 - Zvuk GSM 06.10 - GSM 06.10-lyd - GSM-06.10-Audio - ήχος GSM 06.10 - GSM 06.10 audio - sonido GSM 06.10 - GSM 06.10 audioa - GSM 06.10 -ääni - GSM 06.10 ljóður - audio GSM 06.10 - fuaim GSM 06.10 - son de GSM 06.10 - שמע GSM 06.10 - GSM 06.10 audio - GSM 06.10 hang - Audio GSM 06.10 - Audio GSM 06.10 - GSM 06.10 オーディオ - GSM 06.10 აუდიო - GSM 06.10 аудиосы - GSM 06.10 오디오 - GSM 06.10 garso įrašas - GSM 06.10 audio - GSM 06.10 audio - Plik dźwiękowy GSM 06.10 - Áudio GSM 06.10 - GSM 06.10 audio - аудио GSM 06.10 - Zvuk GSM 06.10 - Zvočna datoteka GSM 06.10 - GSM 06.10-ljud - звук GSM 06.10 - Âm thanh GSM 06.10 - GSM 06.10 音频 - GSM 06.10 音訊 - GSM - Global System for Mobile communications - - - - iRiver Playlist - قائمة تشغيل iRiver - Śpis piesień iRiver - Списък за изпълнение — iRiver - llista de reproducció iRiver - Seznam skladeb iRiver - iRiver-afspilningsliste - iRiver-Wiedergabeliste - λίστα αναπαραγωγής iRiver - iRiver Playlist - iRiver-ludlisto - lista de reproducción de iRiver - iRiver erreprodukzio-zerrenda - iRiver-soittolista - iRiver avspælingarlisti - liste de lecture iRiver - seinmliosta iRiver - lista de reprodución de iRiver - רשימת השמעה של iRiver - iRiver popis za reprodukciju - iRiver lejátszólista - iRiver Playlist - Scaletta iRiver - iRiver 再生リスト - iRiver ойнау тізімі - iRiver 재생 목록 - iRiver grojaraštis - iRiver repertuārs - iRiver-spilleliste - iRiver-afspeellijst - iRiver speleliste - Lista odtwarzania iRiver - Lista de reprodução do iRiver - Listă iRiver - список воспроизведения iRiver - Zoznam skladieb iRiver - Seznam predvajanja iRiver - Listë titujsh iRiver - iRiver-spellista - список програвання iRiver - danh mục nhạc iRiver - iRiver 播放列表 - iRiver 播放清單 - - - - - - - PGP/MIME-encrypted message header - ترويسة رسالة PGP/MIME-مشفرة - Zahałovak paviedamleńnia, zašyfravany ŭ PGP/MIME - Заглавна част на шифрирано съобщение — PGP/MIME - capçalera de missatge xifrat amb PGP/MIME - Záhlaví zprávy zašifrované pomocí PGP/MIME - PGP-/MIME-krypteret meddelelseshoved - PGP/MIME-verschlüsselter Nachrichtenkopf - κεφαλίδα μηνύματος κρυπτογραφημένου κατά PGP/MIME - PGP/MIME-encrypted message header - PGP/MIME-ĉifrita ĉapo de mesaĝo - cabecera de mensaje cifrado PGP/MIME - PGP/MIME enkriptatutako mezu-goiburua - PGP/MIME-salattu viestiotsikko - PGP/MIME-encrypted boð tekshøvd - en-tête de message codé PGP/MIME - ceanntásc teachtaireachta ionchódaithe le PGP/MIME - cabeceira de mensaxe cifrado PGP/MIME - כותר של קובץ מוצפן מסוג PGP/MIME - PGP/MIME titkosított üzenetfejléc - Tajuk pesan terenkripsi PGP/MIME - Intestazione messaggio PGP/MIME-encrypted - PGP/MIME 暗号化メッセージヘッダー - PGP/MIME-шифрленген мәлімдеме тақырыптамасы - PGP/MIME으로 암호화된 메시지 헤더 - PGP/MIME užšifruota žinutės antraštė - PGP/MIME-šifrēta ziņas galvene - Pengepala mesej terenkripsi PGP/MIME - PGP/MIME-kryptert meldingshode - PGP/MIME-versleutelde berichtkopregels - PGP/MIME-kryptert meldingshovud - Nagłówek listu zaszyfrowanego PGP/MIME - cabeçalho de mensagem cifrada com PGP/MIME - Cabeçalho de mensagem criptografada PGP/MIME - Antet de mesaj encriptat PGP/MIME - заголовок сообщения, зашифрованный PGP/MIME - Hlavičke správy zašifrovaná pomocou PGP/MIME - Datoteka glave šifriranega sporočila PGP/MIME - Header mesazhi të kriptuar PGP/MIME - ПГП/МИМЕ шифровано заглавље поруке - PGP/MIME-krypterat meddelandehuvud - заголовок шифрованого PGP/MIME повідомлення - Phần đầu thông điệp đã mật mã bằng PGP/MIME - PGP/MIME 加密的信件头 - PGP/MIME 加密訊息標頭 - - - - - - - - - - - PGP keys - مفاتيح PGP - PGP açarları - Klučy PGP - Ключове — PGP - claus PGP - Klíče PGP - Allweddi PGP - PGP-nøgler - PGP-Schlüssel - κλειδιά PGP - PGP keys - PGP-ŝlosiloj - claves PGP - PGP giltzak - PGP-avainrengas - PGP lyklar - clés PGP - eochracha PGP - Chaves PGP - מפתח PGP - PGP-kulcs - Kunci PGP - Chiavi PGP - PGP 鍵 - PGP кілттері - PGP 키 - PGP raktai - PGP atslēgas - Kekunci PGP - PGP-nøkler - PGP-sleutels - PGP-nøkler - Klucze PGP - chaves PGP - Chaves PGP - Chei PGP - ключи PGP - Kľúče PGP - Datoteka ključa PGP - Kyçe PGP - PGP кључ - PGP-nycklar - PGP anahtarları - ключі PGP - Khoá PGP - PGP 密钥 - PGP 鑰匙 - PGP - Pretty Good Privacy - - - - - - - - - - - - - - - - - - detached OpenPGP signature - إمضاء OpenPGP مفصول - adłučany podpis OpenPGP - Отделен подпис — OpenPGP - signatura OpenPGP separada - Oddělený podpis OpenPGP - frigjort OpenPGP-signatur - Isolierte OpenPGP-Signatur - αποκομμένη υπογραφή OpenPGP - detached OpenPGP signature - dekroĉa OpenPGP-subskribo - firma OpenPGP separada - desuzturtako OpenPGP sinadura - erillinen OpenPGP-allekirjoitus - skild OpenPGP undirskrift - signature OpenPGP détachée - síniú OpenPGP scartha - sinatura de OpenPGP independente - חתימת OpenPGP מנותקת - odvojen OpenPGP potpis - leválasztott OpenPGP-aláírás - tanda tangan OpenPGP yang terlepas - Firma staccata OpenPGP - 分離 OpenPGP 署名 - бөлінген OpenPGP қолтаңбасы - 분리된 OpenPGP 서명 - neprisegtas OpenPGP parašas - atvienots OpenPGP paraksts - Tandatangan OpenPGP terlerai - frakoblet OpenPGP-signatur - losse OpenPGP-ondertekening - fråkopla OpenPGP-signatur - Oddzielony podpis OpenPGP - assinatura OpenPGP solta - Assinatura OpenPGP destacada - semnătură OpenPGP detașată - отсоединённая подпись OpenPGP - Oddelený podpis OpenPGP - odpet podpis OpenPGP - Firmë e shkëputur OpenPGP - одвојени ОпенПГП потпис - frikopplad OpenPGP-signatur - відокремлений OpenPGP підпис - chữ ký OpenPGP tách rời - 分离的 OpenPGP 签名 - 分離的 OpenPGP 簽章 - - - - - - - - - - - - - PKCS#7 Message or Certificate - PKCS - Public-Key Cryptography Standards - - - - - - detached S/MIME signature - إمضاء S/MIME مفصول - adłučany podpis S/MIME - Отделен подпис — S/MIME - signatura S/MIME separada - Oddělený podpis S/MIME - frigjort S/MIME-signatur - Isolierte S/MIME-Signatur - αποκομμένη υπογραφή S/MIME - detached S/MIME signature - dekroĉa S/MIME-subskribo - firma S/MIME separada - desuzturtako S/MIME sinadura - erillinen S/MIME-allekirjoitus - skild S/MIME undirskrift - signature S/MIME détachée - síniú S/MIME scartha - sinatura S/MIME independente - חתימת S/MIME מנותקת - odvojen S/MIME potpis - leválasztott S/MIME-aláírás - tanda tangan S/MIME yang terlepas - Firma staccata S/MIME - 分離 S/MIME 署名 - бөлінген S/MIME қолтаңбасы - 분리된 S/MIME 서명 - neprisegtas S/MIME parašas - atvienots S/MIME paraksts - Tandatangan S/MIME terlerai - frakoblet S/MIME-signatur - losse S/MIME-ondertekening - fråkopla S/MIME-signatur - Oddzielony podpis S/MIME - assinatura S/MIME solta - Assinatura S/MIME destacada - semnătură S/MIME detașată - отсоединённая подпись S/MIME - Oddelený podpis S/MIME - odpet podpis S/MIME - Firmë e shkëputur S/MIME - одвојени S/MIME потпис - frikopplad S/MIME-signatur - відокремлений S/MIME підпис - chữ ký S/MIME tách rời - 分离的 S/MIME 签名 - 分離的 S/MIME 簽章 - S/MIME - Secure/Multipurpose Internet Mail Extensions - - - - - - PKCS#8 private key - رزمة الشهادة PKCS#8 - Ключ, частен — PKCS#8 - clau privada PKCS#8 - Soukromý klíč PKCS#8 - PKCS#8-privat nøgle - PKCS#8 Geheimer Schlüssel - ιδιωτικό κλειδί PKCS#8 - PKCS#8 private key - clave privada PCKS#8 - PKCS#8 yksityinen avain - PKCS#8 privatur lykil - clé privée PKCS#8 - eochair phríobháideach PKCS#8 - Chave privada PKCS#8 - מפתח פרטי של PKCS#8 - PKCS#8 személyes kulcs - Kunci privat PKCS#8 - Chiave privata PKCS#8 - PKCS#8 秘密鍵 - PKCS#8 меншік кілті - PKCS#8 개인 키 - PKCS#8 asmeninis raktas - PKCS#8 privātā atslēga - PKCS#8 private sleutel - Klucz prywatny PKCS#8 - Chave privada PKCS#8 - Cheie privată PKCS#8 - личный ключ PKCS#8 - Súkromný kľúč PKCS#8 - Datoteka osebnega ključa PKCS#8 - Privat PKCS#8-nyckel - закритий ключ PKCS#8 - PKCS#8 私钥 - PKCS#8 私人金鑰 - PKCS - Public-Key Cryptography Standards - - - - PKCS#10 certification request - طلب شهادة PKCS#10 - Zapyt sertyfikacyi PKCS#10 - Заявка за сертификат — PKCS#10 - sol·licitud de certificació PKCS#10 - Požadavek na certifikát PKCS#10 - PKCS#10-certifikatanmodning - PKCS#10-Zertifikatanfrage - αίτηση πιστοποίησης PKCS#10 - PKCS#10 certification request - petición de certificados PKCS#10 - PKCS#10 ziurtagirien eskaera - PKCS#10-varmennepyyntö - PKCS#10 váttanarumbøn - requête de certification PKCS#10 - iarratas dheimhniúchán PKCS#10 - Solicitude de certificado PKCS#10 - בקשה מוסמכת PLCS#10 - PKCS#10-tanúsítványkérés - Permintaan sertifikasi PKCS#10 - Richiesta certificazione PKCS#10 - PKCS#10 証明書署名要求 - PKCS#10 сертификацияға сұранымы - PKCS#10 인증서 요청 - PKCS#10 liudijimų užklausa - PKCS#10 sertifikācijas pieprasījums - PKCS#10-sertifikatforespørsel - PKCS#10-certificatieverzoek - PKCS#10-sertifiseringsførespurnad - Żądanie certyfikatu PKCS#10 - Pedido de certificação PKCS#12 - Cerere de certificat PKCS#10 - запрос сертификации PKCS#10 - Požiadavka na certifikát PKCS#10 - Datoteka potrdila PKCS#10 - Kërkesë çertifikimi PKCS#10 - PKCS#10-certifikatbegäran - комплект сертифікатів PKCS#10 - Yêu cầu chứng nhận PKCS#10 - PKCS#10 认证请求 - PKCS#10 憑證請求 - PKCS - Public-Key Cryptography Standards - - - - - X.509 certificate - شهادة X.509 - Сертификат — X.509 - certificat X.509 - Certifikát X.509 - X.509-certifikat - X.509-Zertifikat - πιστοποιητικό X.509 - X.509 certificate - certificado X.509 - X.509 ziurtagiria - X.509-varmenne - X.509 prógv - certificat X.509 - teastas X.509 - Certificado X.509 - אישור X.509 - X.509 certifikat - X.509 tanúsítvány - Sertifikat X.509 - Certificato X.509 - X.509 証明書 - X.509 сертификаты - X.509 인증서 - X.509 liudijimas - X.509 sertifikāts - X.509 certificaat - Certyfikat X.509 - Certificado X.509 - Certificat X.509 - сертификат X.509 - Certifikát X.509 - Datoteka potrdila X.509 - X.509-certifikat - сертифікат X.509 - X.509 证书 - X.509 憑證 - - - - Certificate revocation list - قائمة إبطال الشهادات - Списък с отхвърлени сертификати - llista de revocació de certificats - Seznam odvolaných certifikátů - Certifikattilbagekaldelsesliste - Liste widerrufener Zertifikate - κατάλογος ανάκλησης πιστοποιητικού - Certificate revocation list - lista de revocación de certificados - Ziurtagiri-errebokatzeen zerrenda - Varmenteiden sulkulista - Prógv afturtøkulisti - liste de révocation de certificat - liosta teastas cúlghairmthe - lista de certificados de revogación - רשימת אישורים מבוטלים - popis povučenih certifikata - Tanúsítvány-visszavonási lista - Daftar pencabutan sertificat (CRL) - Elenco certificati di revoca - 証明書失効リスト - Сертификатты қайта шақыру тізімі - 인증서 철회 목록 - Panaikintų liudijimų sąrašas - Sertifikātu atsaukšanu saraksts - Certificaat revocation lijst - Lista unieważnień certyfikatów - Lista de revogação de certificado - Listă de revocare a certificatelor - Список аннулирования сертификатов - Zoznam zrušených certifikátov - Datoteka seznama preklica potrdil - Spärrlista för certifikat - список відкликання сертифікатів - 证书吊销列表 - 憑證撤銷清單 - - - - PkiPath certification path - مسار شهادة PkiPath - Сертификационна верига — PkiPath - ruta de certificació PkiPath - Cesta k certifikátu PkiPath - PkiPath-certifikationssti - PkiPath-Zertifikatspfad - διαδρομή πιστοποιητικού PkiPath - PkiPath certification path - ruta de certificación PkiPath - PkiPath ziurtagirien bide-izena - PkiPath-varmennepolku - PkiPath váttanleið - chemin de certification PkiPath - conair dheimhniúcháin PkiPath - Ruta de certificación PkiPath - נתיב מאושר של PkiPath - PkiPath tanúsítványútvonal - Alamat sertifikasi PkiPath - Percorso certificazione PkiPath - PkiPath 証明書パス - PkiPath сертификаттау жолы - PkiPath 인증서 요청 - PkiPath liudijimų maršrutas - PkiPath sertifikāta ceļš - PkiPath-certificatiepad - Ścieżka certyfikacji PkiPath - Pedido de certificação PkiPath - Cale certificare PkiPath - путь сертификации PkiPath - Cesta k certifikátu PkiPath - Datoteka poti potrdila PkiPath - PkiPath-certifikatsekvens - шлях сертифікації PkiPath - Đường dẫn cấp chứng nhận PkiPath - PkiPath 证书目录 - PkiPath 憑證路徑 - - - - PS document - مستند PS - Dakument PS - Документ — PS - document PS - Dokument PS - PS-dokument - PS-Dokument - έγγραφο PS - PS document - PS-dokumento - documento PS - PS dokumentua - PS-asiakirja - PS skjal - document PS - cáipéis PS - documento PS - מסמך PS - PS dokumentum - Dokumen PS - Documento PS - PS ドキュメント - PS құжаты - PS 문서 - PS dokumentas - PS dokuments - PS-dokument - PS-document - PS-dokument - Dokument PS - Documento PS - Document PS - документ PS - Dokument PS - Dokument PS - Dokument PS - PS-dokument - PS belgesi - документ PS - Tài liệu PS - PS 文档 - Ps 文件 - PS - PostScript - - - - - - - - - - Plucker document - مستند Plucker - Dakument Plucker - Документ — Plucker - document Plucker - Dokument Plucker - Pluckerdokument - Plucker-Dokument - έγγραφο Plucker - Plucker document - Plucker-dokumento - documento de Plucker - Plucker dokumentua - Plucker-asiakirja - Plucker skjal - document Plucker - cáipéis Plucker - documento de Plucker - מסמך של Plucker - Plucker dokumentum - Dokumen Plucker - Documento Plucker - Plucker ドキュメント - Plucker құжаты - Plucker 문서 - Plucker dokumentas - Plucker dokuments - Plucker-dokument - Plucker-document - Plucker-dokument - Dokument Plucker - Documento do Plucker - Document Plucker - документ Plucker - Dokument Plucker - Dokument Plucker - Dokument Plucker - Plucker-dokument - Plucker belgesi - документ Plucker - Tài liệu Plucker - Plucker 文档 - Plucker 文件 - - - - - - - RELAX NG XML schema - مخطط RELAX NG XML - Схема за XML — RELAX NG - esquema XML RELAX NG - Schéma RELAX NG XML - RELAX NG XML-skema - RELAX NG XML-Schema - σχήμα RELAX NG XML - RELAX NG XML schema - Esquema XML RELAX NG - RELAX NG XML-skeema - schéma XML RELAX NG - scéimre XML RELAX NG - Esquema XML RELAX NG - סכנת RELAX NG XML - RELAX NG XML shema - RELAX NG XML-séma - Skema XML RELAX NG - Schema XML RELAX NG - RELAX NG XML スキーマ - RELAX NG XML сұлбасы - RELAX NG XML 스키마 - RELAX NG XML schema - RELAX NG XML shēma - RELAX NG XML schema - Schemat XML RELAX NG - Esquema XML de RELAX NG - Schemă RELAX NG XML - XML-схема RELAX NG - XML schéma RELAX NG - Datoteka shema RELAX NG XML - RELAX NG XML-schema - XML-схема RELAX NG - RELAX NG XML 模式 - RELAX NG XML schema - RELAX NG - REgular LAnguage for XML Next Generation - - - - - - - RTF document - مستند RTF - Dakument RTF - Документ — RTF - document RTF - Dokument RTF - RTF-dokument - RTF-Dokument - έγγραφο RTF - RTF document - RTF-dokumento - documento RTF - RTF dokumentua - RTF-asiakirja - RTF skjal - document RTF - cáipéis RTF - documento RTF - מסמך RTF - RTF dokument - RTF dokumentum - Dokumen RTF - Documento RTF - RTF ドキュメント - RTF құжаты - RTF 문서 - RTF dokumentas - RTF dokuments - RTF-dokument - RTF-document - TRF-dokument - Dokument RTF - Documento RTF - Document RTF - документ RTF - Dokument RTF - Dokument RTF - Dokument RTF - RTF-dokument - документ RTF - Tài liệu RTF - RTF 文档 - RTF 文件 - RTF - Rich Text Format - - - - - - - - - - Sieve mail filter script - سكربت مرشح بريد Sieve - Skrypt filtravańnia pošty Sieve - Скрипт-филтър за пресяване на поща - script de filtre de correu Sieve - Skript poštovního filtru Sieve - Sieve e-post-filterprogram - Sieve-E-Mail-Filterskript - σενάριο φιλτραρίσματος αλληλογραφίας Sieve - Sieve mail filter script - script de filtro de correo Sieve - Sieve posta-iragazki script-a - Sieve-postinsuodatuskomentotiedosto - script de filtrage de courriel Sieve - script scagaire phost Sieve - Script de filtro de correo Sieve - תסריט סינון דואר של Sieve - Sieve levélszűrő parancsfájl - Skrip filter surat Sieve - Script filtro posta Sieve - Sieve メールフィルタスクリプト - Sieve пошталық фильтр сценарийі - Sieve 메일 필터 스크립트 - Sieve pašto filtro scenarijus - Sieve pasta filtra skripts - Sieve e-postfilter skript - Sieve mailfilter-script - Sieve e-postfilterskript - Skrypt filtra poczty Sieve - Script de filtro de mensagens do Sieve - Script filtrare email Sieve - сценарий почтового фильтра Sieve - Skript poštového filtra Sieve - Skriptna datoteka Sieve poštnega filtra - Script filtrim poste Sieve - Sieve-epostfilterskript - скрипт поштового фільтру Sieve - Văn lệnh lọc thư Sieve - Sieve 邮件过滤脚本 - Sieve 郵件過濾指令稿 - - - - - - SMIL document - مستند SMIL - Dakument SMIL - Документ — SMIL - document SMIL - Dokument SMIL - SMIL-dokument - SMIL-Dokument - έγγραφο SMIL - SMIL document - SMIL-dokumento - documento SMIL - SMIL dokumentua - SMIL-asiakirja - SMIL skjal - document SMIL - cáipéis SMIL - documento SMIL - מסמך SMIL - SMIL dokument - SMIL dokumentum - Dokumen SMIL - Documento SMIL - SMIL ドキュメント - SMIL құжаты - SMIL 문서 - SMIL dokumentas - SMIL dokuments - SMIL-dokument - SMIL-document - SMIL-dokument - Dokument SMIL - Documento SMIL - Document SMIL - документ SMIL - Dokument SMIL - Dokument SMIL - Dokument SMIL - SMIL-dokument - SMIL belgesi - документ SMIL - Tài liệu SMIL - SMIL 文档 - SMIL 文件 - SMIL - Synchronized Multimedia Integration Language - - - - - - - - - - - - - - - - WPL playlist - قائمة تشغيل WPL - Списък за изпълнение — WPL - llista de reproducció WPL - Seznam skladeb WPL - WPL-afspilningsliste - WPL-Wiedergabeliste - λίστα αναπαραγωγής WPL - WPL playlist - WPL-ludlisto - lista de reproducción WPL - WPL erreprodukzio-zerrenda - WPL-soittolista - WPL avspælingarlisti - liste de lecture WPL - seinmliosta WPL - lista de reprodución WPL - רשימת השמעה WPL - WPL popis za reprodukciju - WPL-lejátszólista - Senarai putar WPL - Scaletta WPL - WPL 再生リスト - WPL ойнау тізімі - WPL 재생 목록 - WPL grojaraštis - WPL repertuārs - WPL-afspeellijst - Lista odtwarzania WPL - Lista de reprodução do WPL - Listă redare WPL - список воспроизведения WPL - Zoznam skladieb WPL - Seznam predvajanja WPL - WPL-spellista - список відтворення WPL - Danh mục nhạc WPL - WPL 播放列表 - WPL 播放清單 - WPL - Windows Media Player Playlist - - - - - - - - SQLite2 database - قاعدة بيانات SQLite2 - Baza źviestak SQLite2 - База от данни — SQLite2 - base de dades SQLite2 - Databáze SQLite2 - SQLite2-database - SQLite2-Datenbank - βάση δεδομένων SQLite2 - SQLite2 database - SQLite2-datumbazo - base de datos SQLite2 - SQLite2 datu-basea - SQLite2-tietokanta - SQLite2 dátustovnur - base de données SQLite2 - bunachar sonraí SQLite2 - base de datos SQLite2 - בסיס מידע של SQLite2 - SQLite2 baza podataka - SQLite2 adatbázis - Basis data SQLite2 - Database SQLite2 - SQLite2 データベース - SQLite2 дерекқоры - SQLite2 데이터베이스 - SQLite2 duomenų bazė - SQLite2 datubāze - SQLite2-database - SQLite2-gegevensbank - SQLite2-database - Baza danych SQLite2 - Banco de dados do SQLite2 - Bază de date SQLite2 - база данных SQLite2 - Databáza SQLite2 - Podatkovna zbirka SQLite2 - Bazë me të dhëna SQLite2 - SQLite2-databas - SQLite2 veritabanı - База даних SQLite2 - Cơ sở dữ liệu SQLite2 - SQLite2 数据库 - SQLite2 資料庫 - - - - - - SQLite3 database - قاعدة بيانات SQLite3 - Baza źviestak SQLite3 - База от данни — SQLite3 - base de dades SQLite3 - Databáze SQLite3 - SQLite3-database - SQLite3-Datenbank - βάση δεδομένων SQLite3 - SQLite3 database - SQLite3-datumbazo - base de datos SQLite3 - SQLite3 datu-basea - SQLite3-tietokanta - SQLite3 dátustovnur - base de données SQLite3 - bunachar sonraí SQLite3 - base de datos SQLite3 - בסיס מידע של SQLite3 - SQLite3 baza podataka - SQLite3 adatbázis - Basis data SQLite3 - Database SQLite3 - SQLite3 データベース - SQLite3 дерекқоры - SQLite3 데이터베이스 - SQLite3 duomenų bazė - SQLite3 datubāze - SQLite3-database - SQLite3-gegevensbank - SQLite3-database - Baza danych SQLite3 - Banco de dados do SQLite3 - Bază de date SQLite3 - база данных SQLite3 - Databáza SQLite3 - Podatkovna zbirka SQLite3 - Bazë me të dhëna SQLite3 - SQLite3-databas - SQLite3 veritabanı - база даних SQLite3 - Cơ sở dữ liệu SQLite3 - SQLite3 数据库 - SQLite3 資料庫 - - - - - - GEDCOM family history - تاريخ عائلة GEDCOM - Siamiejnaja historyja GEDCOM - Родословно дърво — GEDCOM - història familiar GEDCOM - Rodokmen GEDCOM - GEDCOM-familiehistorie - GEDCOM-Stammbaum - οικογενειακό ιστορικό GEDCOM - GEDCOM family history - historia familiar GEDCOM - GEDCOM famili historia - GEDCOM-sukuhistoria - GEDCOM familjusøga - généalogie GEDCOM - stair theaghlach GEDCOM - historial de familia GEDCOM - היסטוריה משפחתית של GEDCOM - GEDCOM obiteljska povijest - GEDCOM családtörténet - Sejarah keluarga GEDCOM - Cronologia famiglia GEDCOM - GEDCOM 家系図データ - GEDCOM ოჯახის ისტორია - GEDCOM отбасы тарихы - GEDCOM 가족 내력 - GEDCOM šeimos istorija - GEDCOM ģimenes vēsture - GEDCOM-familiehistorikk - GEDCOM-stamboom - GEDCOM-familehistorie - Plik historii rodziny GEDCOM - Histórico familiar do GEDCOM - Tablou genealogic GEDCOM - история семьи GEDCOM - Rodokmeň GEDCOM - Datoteka družinske zgodovine GEDCOM - Kronollogji familje GEDCOM - GEDCOM-släktträd - історія родини GEDCOM - Lịch sử gia đình GEDCOM - GEDCOM 家谱 - GEDCOM 家族史 - GEDCOM - GEnealogical Data COMmunication - - - - - - - - - - Flash video - Flash مرئي - Videa Flash - Видео — Flash - vídeo de Flash - Video Flash - Flashvideo - Flash-Video - βίντεο Flash - Flash video - Flash-video - vídeo Flash - Flash bideoa - Flash-video - Flash video - vidéo Flash - físeán Flash - vídeo Flash - וידאו של פלאש - Flash video - Flash videó - Video Flash - Video Flash - Flash 動画 - Flash-ის ვიდეო - Flash видеосы - Flash 비디오 - Flash vaizdo įrašas - Flash video - Flash-film - Flash-video - Flash-video - Plik wideo Flash - Vídeo Flash - Video Flash - видео Flash - Video Flash - Video datoteka Flash - Video Flash - Flash-video - відеокліп Flash - Ảnh động Flash - Flash 影片 - Flash 視訊 - - - - - - - - - - - JavaFX video - Видео — JavaFX - vídeo JavaFX - Video JavaFX - JavaFX-video - JavaFX-Video - βίντεο JavaFX - JavaFX video - JavaFX-video - vídeo JavaFX - JavaFX-video - JavaFX video - vidéo JavaFX - físeán JavaFX - vídeo JavaFX - וידאו JavaFX - JavaFX video - JavaFX videó - Video JavaFX - Video JavaFX - JavaFX 動画 - JavaFX аудиосы - JavaFX 비디오 - JavaFX video - JavaFX video - Plik wideo JavaFX - Vídeo JavaFX - Video JavaFX - видео JavaFX - Video JavaFX - Video JavaFX - JavaFX-video - відеокліп JavaFX - JavaFX 视频 - JavaFX 視訊 - - - - - - - - - - SGF record - تسجيلة SGF - Zapisanaja hulnia SGF - Запис — SGF - registre SGF - Záznam SGF - SGF-optagelse - SGF-Aufzeichnung - εγγραφή SGF - SGF record - grabación SGF - SGF erregistroa - SGF-nauhoitus - SGF met - partie SGF - taifead SGF - Grabación SGF - הקלטת SGF - SGF zapis - SGF pontszám - Catatan SGF - Registrazione SGF - SGF レコード - SGF жазбасы - SGF 기록파일 - SGF įrašas - SGF ieraksts - SGF-oppføring - SGF-record - SGF-logg - Zapis gry SGF - Gravação SGF - Înregistrare SGF - запись SGF - Záznam SGF - Datoteka shranjene igre SGF - Regjistrim SGF - SGF-protokoll - SGF kaydı - запис SGF - Mục ghi SGF - SGF 记录 - SGF 紀錄 - SGF - Smart Game Format - - - - - - - - - - XLIFF translation file - ملف ترجمة XLIFF - Fajł pierakładu XLIFF - Превод — XLIFF - fitxer traducció XLIFF - Soubor překladu XLIFF - XLIFF-oversættelsesfil - XLIFF-Übersetzung - αρχείο προς μετάφραση XLIFF - XLIFF translation file - archivo de traducción XLIFF - XLIFF itzulpen-fitxategia - XLIFF-käännöstiedosto - XLIFF týðingarfíla - fichier de traduction XLIFF - comhad aistrithe XLIFF - ficheiro de tradución XLIFF - קובץ תרגום CLIFF - XLIFF datoteka prijevoda - XLIFF fordítási fájl - Berkas terjemahan XLIFF - File traduzione XLIFF - XLIFF 翻訳ファイル - XLIFF аударма файлы - XLIFF 번역 파일 - XLIFF vertimo failas - XLIFF tulkošanas datne - XLIFF-oversettelsesfil - XLIFF-vertalingsbestand - XLIFF-omsetjingsfil - Plik tłumaczenia XLIFF - Arquivo de tradução XLIFF - Fișier de traducere XLIFF - файл перевода XLIFF - Súbor prekladu XLIFF - Datoteka prevoda XLIFF - File përkthimesh XLIFF - XLIFF-översättningsfil - файл перекладу XLIFF - Tập tin dịch XLIFF - XLIFF 消息翻译文件 - XLIFF 翻譯檔 - XLIFF - XML Localization Interchange File Format - - - - - - - - - - - YAML document - مستند YAML - Документ — YAML - document YAML - Dokument YAML - YAML-dokument - YAML-Dokument - έγγραφο YAML - YAML document - YAML-dokumento - documento YAML - YAML-asiakirja - YAML skjal - document YAML - cáipéis YAML - documento YAML - מסמך YAML - YAML-dokumentum - Dokumen YAML - Documento YAML - YAML ドキュメント - YAML құжаты - YAML 문서 - YAML dokumentas - YAML dokuments - YAML document - Dokument YAML - Documento YAML - Document YAML - документ YAML - Dokument YAML - Dokument YAML - YAML-dokument - YAML belgesi - документ YAML - YAML 文档 - YAML 文件 - YAML - YAML Ain't Markup Language - - - - - - - - - - - - Corel Draw drawing - تصميم Corel Draw - Corel Draw çəkimi - Rysunak Corel Draw - Чертеж — Corel Draw - dibuix de Corel Draw - Kresba Corel Draw - Darlun Corel Draw - Corel Draw-tegning - Corel-Draw-Zeichnung - σχέδιο Corel Draw - Corel Draw drawing - grafikaĵo de Corel Draw - dibujo de Corel Draw - Corel Draw-eko marrazkia - Corel Draw -piirros - Corel Draw tekning - dessin Corel Draw - líníocht Corel Draw - debuxo de Corel Draw - ציור של Corel Draw - Corel Draw crtež - Corel Draw-rajz - Gambar Corel Draw - Disegno Corel Draw - Corel Draw ドロー - Corel Draw-ის ნახაზი - Corel Draw суреті - 코렐 드로우 드로잉 - Corel Draw piešinys - Corel Draw zīmējums - Lukisan Corel Draw - Corel Draw-tegning - Corel Draw-tekening - Corel Draw-teikning - Rysunek Corel Draw - desenho Corel Draw - Desenho do Corel Draw - Desen Corel Draw - изображение Corel Draw - Kresba Corel Draw - Datoteka risbe Corel Draw - Vizatim Corel Draw - Corel Draw цртеж - Corel Draw-teckning - малюнок Corel Draw - Bản vẽ Corel Draw - Corel Draw 图形 - Corel Draw 繪圖 - - - - - - - - - - - - - - - HPGL file - ملف HPGL - Fajł HPGL - Файл — HPGL - fitxer HPGL - Soubor HPGL - HPGL-fil - HPGL-Datei - αρχείο HPGL - HPGL file - HPGL-dosiero - archivo HPGL - HPGL fitxategia - HPGL-tiedosto - HPGL fíla - fichier HPGL - comhad HPGL - ficheiro HPGL - קובץ HGPL - HPGL datoteka - HPGL fájl - Berkas HPGL - File HPGL - HPGL ファイル - HPGL файлы - HPGL 파일 - HPGL failas - HPGL datne - HPGL-fil - HPGL-bestand - HPGL-fil - Plik HPGL - Arquivo HPGL - Fișier HPGL - файл HPGL - Súbor HPGL - Datoteka HPGL - File HPGL - HPGL-fil - файл HPGL - Tập tin HPGL - HPGL 文件 - HPGL 檔案 - HPGL - HP Graphics Language - - - - - PCL file - ملف PCL - Fajł PCL - Файл — PCL - fitxer PCL - Soubor PCL - PCL-fil - PCL-Datei - αρχείο PCL - PCL file - PCL-dosiero - archivo PCL - PCL fitxategia - PCL-tiedosto - PCL fíla - fichier PCL - comhad PCL - ficheiro PCL - קובץ PCL - PCL fájl - Berkas PCL - File PCL - PCL ファイル - PCL файлы - PCL 파일 - PCL failas - PCL datne - PCL-fil - PCL-bestand - PCL-fil - Plik PCL - Arquivo PCL - Fișier PCL - файл PCL - Súbor PCL - Datoteka PCL - File PCL - PCL-fil - PCL dosyası - файл PCL - Tập tin PCL - PCL 文件 - PCL 檔 - PCL - HP Printer Control Language - - - - - Lotus 1-2-3 spreadsheet - جدول Lotus 1-2-3 - Lotus 1-2-3 hesab cədvəli - Raźlikovy arkuš Lotus 1-2-3 - Таблица — Lotus 1-2-3 - full de càlcul de Lotus 1-2-3 - Sešit Lotus 1-2-3 - Taenlen Lotus 1-2-3 - Lotus 1-2-3-regneark - Lotus-1-2-3-Tabelle - λογιστικό φύλλο Lotus 1-2-3 - Lotus 1-2-3 spreadsheet - Kalkultabelo de Lotus 1-2-3 - hoja de cálculo de Lotus 1-2-3 - Lotus 1-2-3 kalkulu-orria - Lotus 1-2-3 -taulukko - Lotus 1-2-3 rokniark - feuille de calcul Lotus 1-2-3 - scarbhileog Lotus 1-2-3 - folla de cálculo de Lotus 1-2-3 - גליון נתונים של Lotus 1-2-3 - Lotus 1-2-3 proračunska tablica - Lotus 1-2-3-munkafüzet - Lembar sebar Lotus 1-2-3 - Foglio di calcolo Lotus 1-2-3 - Lotus 1-2-3 スプレッドシート - Lotus 1-2-3 электрондық кестесі - Lotus 1-2-3 스프레드시트 - Lotus 1-2-3 skaičialentė - Lotus 1-2-3 izklājlapa - Hamparan Lotus 1-2-3 - Lotus 1-2-3 regneark - Lotus 1-2-3-rekenblad - Lotus 1-2-3 rekneark - Arkusz Lotus 1-2-3 - folha de cálculo Lotus 1-2-3 - Planilha do Lotus 1-2-3 - Foaie de calcul Lotus 1-2-3 - электронная таблица Lotus 1-2-3 - Zošit Lotus 1-2-3 - Preglednica Lotus 1-2-3 - Fletë llogaritjesh Lotus 1-2-3 - Lotus 1-2-3 табеларни прорачун - Lotus 1-2-3-kalkylblad - ел. таблиця Lotus 1-2-3 - Bảng tính Lotus 1-2-3 - Lotus 1-2-3 工作簿 - Lotus 1-2-3 試算表 - - - - - - - - - - - - - - - - - Lotus Word Pro - - - - - - - - JET database - قاعدة بيانات JET - Baza źviestak JET - База от данни — JET - base de dades JET - Databáze JET - JET-database - JET-Datenbank - βάση δεδομένων JET - JET database - JET-datumbazo - base de datos JET - JET datu-basea - JET-tietokanta - JET dátustovnur - base de données JET - bunachar sonraí JET - base de datos JET - מסד נתונים JET - JET baza podataka - JET adatbázis - Basis data JET - Database JET - JET データベース - JET дерекқоры - JET 데이터베이스 - JET duomenų bazė - JET datubāze - JET-database - JET-gegevensbank - JET-database - Baza Danych JET - Banco de dados JET - Bază de date JET - база данных JET - Databáza JET - Podatkovna zbirka JET - Bazë me të dhëna JET - JET-databas - JET veritabanı - База даних JET - Cơ sở dữ liệu JET - JET 数据库 - JET 資料庫 - JET - Joint Engine Technology - - - - - - - - - - - - - - - Microsoft Cabinet archive - أرشيف Microsoft Cabinet - Архив — Microsoft Cabinet - arxiu Cabinet de Microsoft - Archiv Microsoft Cabinet - Microsoft Cabinet-arkiv - Microsoft-Cabinet-Archiv - συμπιεσμένο αρχείο Microsoft Cabinet - Microsoft Cabinet archive - archivador Microsoft Cabinet - Microsoft Cabinet artxiboa - Microsoft Cabinet -arkisto - Microsoft Cabinet skjalasavn - archive Cab Microsoft - cartlann Microsoft Cabinet - arquivo de Microsoft Cabinet - ארכיון CAB (מיקרוסופט) - Microsoft Cabinet arhiva - Microsoft Cabinet archívum - Arsip Microsoft Cabinet - Archivio Microsoft Cabinet - Microsoft Cabinet アーカイブ - Microsoft-ის Cabinet არქივი - Microsoft Cabinet архиві - 마이크로소프트 캐비닛 묶음 - Microsoft Cabinet archyvas - Microsoft kabineta arhīvs - Microsoft Cabinet-archief - Archiwum Microsoft Cabinet - Pacote do Microsoft Cabinet - Arhivă Microsoft Cabinet - архив Microsoft Cabinet - Archív Microsoft Cabinet - Datoteka arhiva Microsoft Cabinet - Microsoft Cabinet-arkiv - Microsoft Cabinet arşivi - архів Cabinet Microsoft - Kho lưu Cabinet Microsoft - Microsoft CAB 归档文件 - 微軟 Cabinet 封存檔 - - - - - - - - - Excel spreadsheet - جدول Excel - Raźlikovy akruš Excel - Таблица — Excel - full de càlcul d'Excel - Sešit Excel - Excelregneark - Excel-Tabelle - φύλλο εργασίας Excel - Excel spreadsheet - Excel-kalkultabelo - hoja de cálculo de Excel - Excel kalkulu-orria - Excel-taulukko - Excel rokniark - feuille de calcul Excel - scarbhileog Excel - folla de cálculo de Excel - גליון נתונים של אקסל - Excel proračunska tablica - Excel táblázat - Lembar sebar Excel - Foglio di calcolo Excel - Excel スプレッドシート - Excel-ის ცხრილი - Excel электрондық кестесі - 엑셀 스프레드시트 - Excel skaičialentė - Excel izklājlapa - Excel regneark - Excel-rekenblad - Excel-rekneark - Arkusz Excel - Planilha do Excel - Foaie de calcul Excel - электронная таблица Excel - Zošit Excel - Razpredelnica Microsoft Excel - Fletë llogaritje Excel - Excel-kalkylblad - ел. таблиця Excel - Bảng tính Excel - Microsoft Excel 工作簿 - Excel 試算表 - - - - - - - - - - - - - - - - - - Excel add-in - Приставка — Excel - complement d'Excel - Doplněk aplikace Excel - Excel-tilføjelse - Excel Add-in - πρόσθετο Excel - Excel add-in - Complemento de Excel - Excel-lisäosa - complément Excel - complemento de Excel - תוסף של Excel - Excel priključak - Excel bővítmény - Add-in Excel - Add-in Excel - Excel アドイン - Excel-ის დამატება - Excel қосымшасы - 엑셀 추가 기능 - Excel pievienojumprogramma - Excel add-in - Dodatek Excel - Suplemento do Excel - дополнение Excel - Vstavek Excel - додаток Excel - Excel 附加组件 - Excel 增益集 - - - - - - Excel 2007 binary spreadsheet - Таблица — Excel 2007, двоична - full de càlcul binari d'Excel 2007 - Binární formát sešitu Excel 2007 - Binært Excel 2007-regneark - Excel 2007-Tabelle (binär) - Excel 2007 binary spreadsheet - Hoja de cálculo de Excel 2007 - feuille de calcul binaire Excel 2007 - ficheiro binario de folla de cálculo Excel 2007 - גיליון נתונים בינרי של Excel 2007 - Excel 2007 binarna proračunska tablica - Excel 2007 bináris táblázat - Lembar kerja biner Excel 2007 - Foglio di calcolo binario Excel 2007 - Excel 2007 バイナリスプレッドシート - Excel 2007-ის ბინარული ცხრილი - Excel 2007 бинарды кестесі - 엑셀 2007 바이너리 스프레드시트 - Excel 2007 binārā izklājlapa - Excel 2007 binary spreadsheet - Binarny arkusz Excel 2007 - Planilha binária do Excel 2007 - двоичная электронная таблица Excel 2007 - Binarna preglednica Excel 2007 - бінарна електронна таблиця Excel 2007 - Excel 2007 二进制工作表 - Excel 2007 二進位試算表 - - - - - - Excel macro-enabled spreadsheet - Таблица — Excel, с макроси - full de càlcul amb macros d'Excel - Sešit Excel s podporou maker - Makro-aktiveret Excel-regneark - Excel-Tabelle mit aktivierten Makros - φύλο εργασίας Excel με ενεργοποιημένες μακροεντολές - Excel macro-enabled spreadsheet - Hoja de cálculo con macros activados de Excel - feuille de calcul Excel avec macros - folla de cálculo de Excel con macros activadas - גיליון נתונים עם תכונות מקרו פעילות של Excel - Excel proračunska tablica s omogućenim makro naredbama - Excel makrókat tartalmazó táblázat - Lembar kerja Excel dengan makro - Foglio di calcolo Excel con macro abilitate - Excel マクロ有効スプレッドシート - Excel-ის მაკროსიანი ცხრილი - макростары іске қосылған Excel кестесі - 엑셀 매크로 사용 스프레드시트 - Excel izklājlapa ar makrosiem - Excel macro-enabled spreadsheet - Arkusz z włączonymi makrami Excel - Planilha do Excel com macro ativada - электронная таблица Excel с включёнными макросами - Preglednica Excel z omogočenimi makri - електронна таблиця Excel з увімкненими макросами - Excel 启用宏的工作表 - Excel 巨集啟用試算表 - - - - - - Excel macro-enabled spreadsheet template - Шаблон за таблици — Excel, с макроси - plantilla de full de càlcul amb macros d'Excel - Šablona sešitu Excel s podporou maker - Makro-aktiveret Excel-regnearksskabelon - Excel-Tabellenvorlage mit aktivierten Makros - πρότυπο φύλλο εργασίας Excel με ενεργοποιημένες μακροεντολές - Excel macro-enabled spreadsheet template - Plantilla de hoja de cálculo con macros activados de Excel - modèle de feuille de calcul Excel avec macros - modelo de folla de cálculo de Excel con macros activadas - תבנית של גיליון נתונים עם תכונות מקרו פעילות של Excel - Excel predložak proračunske tablice s omogućenim makro naredbama - Excel makrókat tartalmazó táblázatsablon - Templat lembar kerja Excel dengan makro - Modello foglio di calcolo Excel con macro abilitate - Excel マクロ有効スプレッドシートテンプレート - Excel-ის მაკროსიანი ცხრილის შაბლონი - макростары іске қосылған Excel кестесінің үлгісі - 엑셀 매크로 사용 스프레드시트 서식 - Excel izklājlapas ar makrosiem veidne - Excel macro-enabled spreadsheet sjabloon - Szablon arkusza z włączonymi makrami Excel - Módulo de planilha do Excel com macro ativada - шаблон электронной таблицы Excel с включёнными макросами - Predloga preglednice Excel z omogočenimi makri - шаблон електронної таблиці Excel з увімкненими макросами - Excel 启用宏的工作表模板 - Excel 巨集啟用試算表範本 - - - - - - PowerPoint presentation - عرض تقديمي PowerPoint - Prezentacyja PowerPoint - Презентация — PowerPoint - presentació de PowerPoint - Prezentace PowerPoint - PowerPoint-præsentation - PowerPoint-Präsentation - παρουσίαση PowerPoint - PowerPoint presentation - PowerPoint-prezentaĵo - presentación de PowerPoint - PowerPoint aurkezpena - PowerPoint-esitys - PowerPoint framløga - présentation PowerPoint - láithreoireacht PowerPoint - presentación de PowerPoint - מצגת PowerPoint - PowerPoint prezentacija - PowerPoint prezentáció - Presentasi PowerPoint - Presentazione PowerPoint - PowerPoint プレゼンテーション - PowerPoint презентациясы - 파워포인트 프리젠테이션 - PowerPoint pateiktis - PowerPoint prezentācija - PowerPoint-presentasjon - PowerPoint-presentatie - PowerPoint-presentasjon - Prezentacja PowerPoint - Apresentação do PowerPoint - Prezentare PowerPoint - презентация PowerPoint - Prezentácia PowerPoint - Predstavitev Microsoft PowerPoint - Prezantim PowerPoint - PowerPoint-presentation - презентація PowerPoint - Trình diễn PowerPoint - Microsoft PowerPoint 演示文稿 - PowerPoint 簡報 - - - - - - - - - - - PowerPoint add-in - Приставка — PowerPoint - complement de - Doplněk PowerPoint - PowerPoint-tilføjelse - PowerPoint Add-in - πρόσθετο PowerPoint - PowerPoint add-in - Complemento de PowerPoint - PowerPoint-lisäosa - complément PowerPoint - complemento de PowerPoint - תוסף של PowerPoint - PowerPoint priključak - PowerPoint bővítmény - Add-in PowerPoint - Add-in PowerPoint - PowerPoint アドイン - PowerPoint-ის დამატება - PowerPoint қосымшасы - 파워포인트 추가 기능 - PowerPoint pievienojumprogramma - PowerPoint add-in - Dodatek PowerPoint - Suplemento do PowerPoint - дополнение PowerPoint - Vstavek PowerPoint - додаток PowerPoint - PowerPoint 附加组件 - PowerPoint 增益集 - - - - - PowerPoint macro-enabled presentation - Презентация — PowerPoint, с макроси - presentació amb macros - Prezentace PowerPoint s podporou maker - Makro-aktiveret PowerPoint-præsentation - PowerPoint-Präsentation mit aktivierten Makros - παρουσίαση PowerPoint με ενεργοποιημένες μακροεντολές - PowerPoint macro-enabled presentation - Presentación con macros activadas de PowerPoint - présentation PowerPoint avec macros - presentación con macros activadas de PowerPoint - מצגת של PowerPoint בעלת תכונות מקרו פעילות - PowerPoint prezentacija s omogućenim makro naredbama - PowerPoint makrókat tartalmazó bemutató - Presentasi PowerPoint dengan makro - Presentazione PowerPoint con macro abilitate - PowerPoint マクロ有効プレゼンテーション - PowerPoint-ის მაკროსიანი პრეზენტაცია - макростары іске қосылған PowerPoint презентациясы - 파워포인트 매크로 사용 프리젠테이션 - PowerPoint prezentācija ar makrosiem - PowerPoint macro-enabled presentatie - Prezentacja z włączonymi makrami PowerPoint - Apresentação do PowerPoint com macro ativada - презентация PowerPoint с включёнными макросами - Predstavitev PowerPoint z omogočenimi makri - презентація PowerPoint з увімкненими макросами - PowerPoint 启用宏的演示文稿 - PowerPoint 巨集啟用簡報 - - - - - - PowerPoint macro-enabled slide - Кадър — PowerPoint, с макроси - dispositiva amb macros - Snímek PowerPoint s podporou maker - Makro-aktiveret PowerPoint-slide - PowerPoint-Folie mit aktivierten Makros - σλάιντ PowerPoint με ενεργοποιημένες μακροεντολές - PowerPoint macro-enabled slide - Diapositiva con macros activadas de PowerPoint - diapositive PowerPoint avec macros - Diapositiva con macros activadas de Powerpoint - שקופית של PowerPoint בעלת תכונות מקרו פעילות - PowerPoint slajd s omogućenim makro naredbama - PowerPoint makrókat tartalmazó dia - Slide PowerPoint dengan makro - Diapositiva PowerPoint con macro abilitate - PowerPoint マクロ有効スライド - PowerPoint-ის მაკროსიანი სლაიდი - макростары іске қосылған PowerPoint слайды - 파워포인트 매크로 사용 슬라이드 - PowerPoint slaids ar makrosiem - PowerPoint macro-enabled dia - Slajd z włączonymi makrami PowerPoint - Slide do PowerPoint com macro ativada - слайд PowerPoint с включёнными макросами - Prosojnica PowerPoint z omogočenimi makri - слайд PowerPoint з увімкненими макросами - PowerPoint 启用宏的幻灯片 - PowerPoint 巨集啟用投影片 - - - - - - PowerPoint macro-enabled presentation - Презентация — PowerPoint, с макроси - presentació amb macros - Prezentace PowerPoint s podporou maker - Makro-aktiveret PowerPoint-præsentation - PowerPoint-Präsentation mit aktivierten Makros - παρουσίαση PowerPoint με ενεργοποιημένες μακροεντολές - PowerPoint macro-enabled presentation - Presentación con macros activadas de PowerPoint - présentation PowerPoint avec macros - presentación con macros activadas de PowerPoint - מצגת של PowerPoint בעלת תכונות מקרו פעילות - PowerPoint prezentacija s omogućenim makro naredbama - PowerPoint makrókat tartalmazó bemutató - Presentasi PowerPoint dengan makro - Presentazione PowerPoint con macro abilitate - PowerPoint マクロ有効プレゼンテーション - PowerPoint-ის მაკროსიანი პრეზენტაცია - макростары іске қосылған PowerPoint презентациясы - 파워포인트 매크로 사용 프리젠테이션 - PowerPoint prezentācija ar makrosiem - PowerPoint macro-enabled presentatie - Prezentacja z włączonymi makrami PowerPoint - Apresentação do PowerPoint com macro ativada - презентация PowerPoint с включёнными макросами - Predstavitev PowerPoint z omogočenimi makri - презентація PowerPoint з увімкненими макросами - PowerPoint 启用宏的演示文稿 - PowerPoint 巨集啟用簡報 - - - - - - PowerPoint macro-enabled presentation template - Шаблон за презентации — PowerPoint, с макроси - plantilla de presentació amb macros - Šablona prezentace PowerPoint s podporou maker - Makro-aktiveret PowerPoint-præsentationsskabelon - PowerPoint-Präsentationsvorlage mit aktivierten Makros - πρότυπη παρουσίαση PowerPoint με ενεργοποιημένες μακροεντολές - PowerPoint macro-enabled presentation template - Plantilla de presentación con macros activadas de PowerPoint - modèle de présentation PowerPoint avec macros - modelo de presentación con macros activadas de PowerPoint - תבנית של מצגת של PowerPoint בעלת תכונות מקרו פעילות - PowerPoint predložak prezentacije s omogućenim makro naredbama - PowerPoint makrókat tartalmazó bemutatósablon - Templat presentasi PowerPoint dengan makro - Modello presentazione PowerPoint con macro abilitate - PowerPoint マクロ有効プレゼンテーションテンプレート - PowerPoint-ის მაკროსიანი პრეზენტაციის შაბლონი - макростары іске қосылған PowerPoint презентациясының үлгісі - 파워포인트 매크로 사용 프리젠테이션 서식 - PowerPoint prezentācijas ar makrosiem veidne - PowerPoint macro-enabled presentatie-sjabloon - Szablon prezentacji z włączonymi makrami PowerPoint - Modelo de apresentação do PowerPoint com macro ativada - шаблон презентации PowerPoint с включёнными макросами - Predloga predstavitve PowerPoint z omogočenimi makri - шаблон презентації PowerPoint з увімкненими макросами - PowerPoint 启用宏的演示文稿模板 - PowerPoint 巨集啟用簡報範本 - - - - - - Word macro-enabled document - Документ — Word, с макроси - document amb macros de Word - Dokument Word s podporou maker - Makro-aktiveret Word-dokument - Word-Dokument mit aktivierten Makros - έγγραφο Word με ενεργοποιημένες μακροεντολές - Word macro-enabled document - Documento con macros activadas de Word - document Word avec macros - documento con macros activadas de Word - מסמך של Word בעל תכונות מקרו פעילות - Word dokument s omogućenim makro naredbama - Word makrókat tartalmazó dokumentum - Dokumen Word dengan makro - Documento Word con macro abilitate - Word マクロ有効文書 - Word-ის მაკროსიანი დოკუმენტი - макростары іске қосылған Word құжаты - 워드 매크로 사용 문서 - Word dokuments ar makrosiem - Word macro-enabled document - Dokument z włączonymi makrami Word - Documento do Word com macro ativada - документ Word с включёнными макросами - Dokument Word z omogočenimi makri - документ Word з увімкненими макросами - Word 启用宏的文档 - Word 巨集啟用文件 - - - - - - Word macro-enabled document template - Шаблон за документи — Word, с макроси - plantilla de document amb macros de Word - Šablona dokumentu Word s podporou maker - Makro-aktiveret Word-dokumentskabelon - Word-Dokumentvorlage mit aktivierten Makros - πρότυπο έγγραφο Word με ενεργοποιημένες μακροεντολές - Word macro-enabled document template - Plantilla de documento con macros activadas de Word - modèle de document Word avec macros - Plantilla de documento con macros activadas de Word - תבנית של מסמך של Word בעל תכונות מקרו פעילות - Word predložak dokumenta s omogućenim makro naredbama - Word makrókat tartalmazó dokumentumsablon - Templat dokumen Word dengan makro - Modello documento Word con macro abilitate - Word マクロ有効文書テンプレート - Word-ის მაკროსიანი დოკუმენტის შაბლონი - макростары іске қосылған Word құжатының үлгісі - 워드 매크로 사용 문서 서식 - Word dokumenta ar makrosiem veidne - Word macro-enabled document sjabloon - Szablon dokumentu z włączonymi makrami Word - Modelo de documento do Word com macro ativada - шаблон документа Word с включёнными макросами - Predloga dokumenta Word z omogočenimi makri - шаблон документа Word з увімкненими макросами - Word 启用宏的文档模板 - Word 巨集啟用文件範本 - - - - - - XPS document - مستند XPS - Dakument XPS - Документ — XPS - document XPS - Dokument XPS - XPS-dokument - XPS-Dokument - έγγραφο XPS - XPS document - XPS-dokumento - documento XPS - XPS dokumentua - XPS-asiakirja - XPS skjal - document XPS - cáipéis XPS - documento XPS - מסמך XPS - XPS dokument - XPS dokumentum - Dokumen XPS - Documento XPS - XPS ドキュメント - XPS құжаты - XPS 문서 - XPS dokumentas - XPS dokuments - XPS-dokument - XPS-document - XPS-dokument - Dokument XPS - Documento XPS - Document XPS - документ XPS - Dokument XPS - Dokument XPS - Dokument XPS - XPS-dokument - документ XPS - Tài liệu XPS - XPS 文档 - XPS 文件 - XPS - Open XML Paper Specification - - - - - - - - Microsoft Works document - مستند Microsoft Works - Dakument Microsoft Works - Документ — Microsoft Works - document Works de Microsoft - Dokument Microsoft Works - Microsoft Works-dokument - Microsoft-Works-Dokument - έγγραφο Microsoft Works - Microsoft Works document - documento de Microsoft Works - Microsoft Works dokumentua - Microsoft Works -asiakirja - Microsoft Works skjal - document Microsoft Works - cáipéis Microsoft Works - documento de Microsoft Works - מסמך Microsoft Works - Microsoft Works dokument - Microsoft Works dokumentum - Dokumen Microsoft Works - Documento Microsoft Works - Microsoft Works ドキュメント - Microsoft Works-ის დოკუმენტი - Microsoft Works құжаты - 마이크로소프트 Works 문서 - Microsoft Works dokumentas - Microsoft Works dokuments - Microsoft Works-dokument - Microsoft Works-document - Microsoft Works-dokument - Dokument Microsoft Works - Documento do Microsoft Works - Document Microsoft Works - документ Microsoft Works - Dokument Microsoft Works - Dokument Microsoft Works - Dokument Microsoft Works - Microsoft Works-dokument - Microsoft Works belgesi - документ Microsoft Works - Tài liệu Microsoft Works - Microsoft Works 文档 - 微軟 Works 文件 - - - - - - - - - - Microsoft Visio document - Документ — Microsoft Visio - document Visio de Microsoft - Microsoft Visio-dokument - Microsoft Visio-Dokument - έγγραφο Microsoft Visio - Microsoft Visio document - documento de Microsoft Visio - Microsoft Visio -asiakirja - document Microsoft Visio - Documento de Microsoft Visio - מסמך - Microsoft Visio dokument - Microsoft Visio dokumentum - Dokumen Microsoft Visio - Documento Microsoft Visio - Microsoft Visio ドキュメント - Microsoft Visio-ის დოკუმენტი - Microsoft Visio құжаты - 마이크로소프트 Visio 문서 - Microsoft Visio dokuments - Microsoft Visio document - Dokument Microsoft Visio - Documento do Microsoft Visio - документ Microsoft Visio - Dokument Microsoft Visio - документ Microsoft Visio - Microsoft Visio 文档 - Microsoft Visio文件 - - - - - - - - - Word document - مستند Word - Dakument Word - Документ — Word - document de Word - Dokument Word - Worddokument - Word-Dokument - έγγραφο Word - Word document - Word-dokumento - documento de Word - Word dokumentua - Word-asiakirja - Word skjal - document Word - cáipéis Word - documento de Word - מסמך Word - Word dokument - Word dokumentum - Dokumen Word - Documento Word - Word ドキュメント - Word құжаты - 워드 문서 - Word dokumentas - Word dokuments - Word-dokument - Word-document - Word-dokument - Dokument Word - Documento do Word - Document Word - документ Word - Dokument Word - Dokument Word - Dokument Word - Word-dokument - документ Word - Tài liệu Word - Microsoft Word 文档 - Word 文件 - - - - - - - - - - - - - - - - - - - - Word template - قالب Word - Šablon Word - Шаблон за документи — Word - plantilla de Word - Šablona Word - Wordskabelon - Word-Vorlage - πρότυπο έγγραφο Word - Word template - Word-ŝablono - plantilla de Word - Word txantiloia - Word-malli - Word formur - modèle Word - teimpléad Word - Plantilla de Word - תבנית Word - Word predložak - Word sablon - Templat Word - Modello Word - Word テンプレート - Word үлгісі - 워드 서식 - Word šablonas - Word veidne - Word-mal - Word-sjabloon - Word-mal - Szablon Word - Modelo do Word - Șablon Word - шаблон Word - Šablóna Word - Predloga dokumenta Microsoft Word - Model Word - Word-mall - шаблон Word - Mẫu Word - Word 模板 - Word 範本 - - - - - - GML document - GML - Geography Markup Language - - - - - - GNUnet search file - ملف بحث GNUnet - fajł pošuku GNUnet - Указател за търсене — GNUnet - fitxer de cerca GNUnet - Vyhledávací soubor GNUnet - GNunet-søgefil - GNUnet-Suchdatei - αρχείο αναζήτησης GNUnet - GNUnet search file - archivo de búsqueda GNUnet - GNUnet bilaketako fitxategia - GNUnet-hakutiedosto - GNUnet leitifíla - fichier de recherche GNUnet - comhad cuardaigh GNUnet - ficheiro de busca de GNUnet - קובץ חיפוש של GNUnet - GNUnet datoteka pretrage - GNUnet keresési fájl - Berkas telusur GNUnet - File ricerca GNUnet - GNUnet 検索ファイル - GNUnet ძებნის ფაილი - GNUnet іздеу файлы - GNUnet 검색 파일 - GNUnet paieškos failas - GNUnet meklēšanas datne - GNUnet søkefil - GNUnet-zoekbestand - GNUnet-søkjefil - Plik wyszukiwania GNUnet - Arquivo de pesquisa do GNUnet - Fișier căutare GNUnet - файл поиска GNUnet - Vyhľadávací súbor GNUnet - Iskalna datoteka GNUnet - File kërkimi GNUnet - GNUnet-sökfil - файл пошуку GNUnet - Tập tin tìm kiếm GNUnet - GNUnet 搜索文件 - GNUnet 搜尋檔案 - - - - - - - TNEF message - رسالة TNEF - List TNEF - Съобщение — TNEF - missatge TNEF - Zpráva TNEF - TNEF-meddelelse - TNEF-Nachricht - μήνυμα TNEF - TNEF message - mensaje TNEF - TNEF mezua - TNEF-viesti - TNEF boð - message TNEF - teachtaireacht TNEF - mensaxe TNEF - הודעת TNEF - TNEF poruka - TNEF üzenet - Pesan TNEF - Messaggio TNEF - TNEF メッセージ - TNEF мәлімдемесі - TNEF 메시지 - TNEF žinutė - TNEF ziņojums - TNEF-melding - TNEF-bericht - TNEF-melding - Wiadomość TNEF - Mensagem TNEF - Mesaj TNEF - сообщение TNEF - Správa TNEF - Datoteka sporočila TNEF - Mesazh TNEF - TNEF-meddelande - повідомлення TNEF - Thông điệp TNEF - TNEF 信件 - TNEF 訊息 - TNEF - Transport Neutral Encapsulation Format - - - - - - - - - - StarCalc spreadsheet - جدول StarCalc - StarCalc hesab cədvəli - Raźlikovy arkuš StarCalc - Таблица — StarCalc - full de càlcul de StarCalc - Sešit StarCalc - Taenlen StarCalc - StarCalc-regneark - StarCalc-Tabelle - λογιστικό φύλλο StarCalc - StarCalc spreadsheet - StarCalc-kalkultabelo - hoja de cálculo de StarCalc - StarCalc kalkulu-orria - StarCalc-taulukko - StarCalc rokniark - feuille de calcul StarCalc - scarbhileog StarCalc - folla de cálculo de StarCalc - גליון נתונים של StarCalc - StarCalc proračunska tablica - StarCalc-munkafüzet - Lembar sebar StarCalc - Foglio di calcolo StarCalc - StarCalc スプレッドシート - StarCalc электрондық кестесі - StarCalc 스프레드시트 - StarCalc skaičialentė - StarCalc izklājlapa - Hamparan StarCalc - StarCalc-regneark - StarCalc-rekenblad - StarCalc-rekneark - Arkusz StarCalc - folha de cálculo do StarCalc - Planilha do StarCalc - Foaie de calcul StarCalc - электронная таблица StarCalc - Zošit StarCalc - Preglednica StarCalc - Fletë llogaritjesh StarCalc - StarCalc табеларни прорачун - StarCalc-kalkylblad - ел. таблиця StarCalc - Bảng tính StarCalc - STarCalc 工作簿 - StarCalc 試算表 - - - - - StarChart chart - مخطط StarChart - StarChart cədvəli - Dyjahrama StarChart - Диаграма — StarChart - diagrama de StarChart - Graf StarChart - Siart StarChart - StarChart-diagram - StarChart-Diagramm - γράφημα StarChart - StarChart chart - StarChart-diagramo - gráfica de StarChart - StarChart diagrama - StarChart-kaavio - StarChart strikumynd - graphique StarChart - cairt StarChart - gráfica de StarChart - טבלה של StarChart - StarChart grafikon - StarChart-grafikon - Bagan StarChart - Grafico StarChart - StarChart チャート - StarChart диаграммасы - StarCalc 표 - StarChart diagrama - StarChart diagramma - Carta StarChart - StarChart graf - StarChart-kaart - StarChart-graf - Wykres StarChart - gráfico do StarChart - Gráfico do StarChart - Diagramă StarChart - диаграмма StarChart - Graf StarChart - Datoteka grafikona StarChart - Grafik StarChart - StarChart графикон - StarChart-diagram - діаграма StarChart - Đồ thị StarChart - STarChart 图表 - StarChart 圖表 - - - - - StarDraw drawing - تصميم StarDraw - StarDraw çəkimi - Rysunak StarDraw - Чертеж — StarDraw - dibuix de StarDraw - Kresba StarDraw - Darlun StarDraw - StarDraw-tegning - StarDraw-Zeichnung - σχέδιο StarDraw - StarDraw drawing - StarDraw-grafikaĵo - dibujo de StarDraw - StarDraw marrazkia - StarDraw-piirros - StarDraw tekning - dessin StarDraw - líníocht StarDraw - debuxo de StarDraw - ציור של StarDrawing - StarDraw crtež - StarDraw-rajz - Gambar StarDraw - Disegno StarDraw - StarDraw ドロー - StarDraw суреті - StarCalc 드로잉 - StarDraw piešinys - StarDraw zīmējums - Lukisan StarDraw - StarDraw tegning - StarDraw-tekening - StarDraw-teikning - Rysunek StarDraw - desenho do StarDraw - Desenho do StarDraw - Desen StarDraw - изображение StarDraw - Kresba StarDraw - Datoteka risbe StarDraw - Vizatim StarDraw - StarDraw drawing - StarDraw-teckning - малюнок StarDraw - Bản vẽ StarDraw - STarDraw 绘图 - StarDraw 繪圖 - - - - - StarImpress presentation - عرض تقديمي StarImpress - StarImpress təqdimatı - Prezentacyja StarImpress - Презентация — StarImpress - presentació de StarImpress - Prezentace StarImpress - Cyflwyniad StarImpress - StarImpress-præsentation - StarImpress-Präsentation - παρουσίαση StarImpress - StarImpress presentation - StarImpress-prezentaĵo - presentación de StarImpress - StarImpress aurkezpena - StarImpress-esitys - StarImpress framløga - présentation StarImpress - láithreoireacht StarImpress - presentación de StarImpress - מצגת של StarImpress - StarImpress prezentacija - StarImpress-bemutató - Presentasi StarImpress - Presentazione StarImpress - StarImpress プレゼンテーション - StarImpress презентациясы - StarImpress 프리젠테이션 - StarImpress pateiktis - StarImpress prezentācija - Persembahan StarImpress - StarImpress-presentasjon - StarImpress-presentatie - StarImpress-presentasjon - Prezentacja StarImpress - apresentação do StarImpress - Apresentação do StarImpress - Prezentare StarImpress - презентация StarImpress - Prezentácia StarImpress - Predstavitev StarImpress - Prezantim StarImpress - StarImpress презентација - StarImpress-presentation - презентація StarImpress - Trình diễn StarImpress - STarImpress 演示文稿 - StarImpress 簡報檔 - - - - - - StarMail email - بريد StarMail الإلكتروني - Email StarMail - Електронно писмо — StarMail - correu electrònic de StarMail - E-mail StarMail - StarMail-e-brev - StarMail-E-Mail - ηλ. μήνυμα StarMail - StarMail email - StarMail-retpoŝto - correo electrónico de StarMail - StarMail helb.el. - StarMail-sähköposti - StarMail t-postur - courriel StarMail - ríomhphost StarMail - Correo electrónico de StarMail - דוא"ל של StarMail - StarMail e-pošta - StarMail e-mail - Email StarMail - Email StarMail - StarMail メール - StarMail электрондық хаты - StarMail 전자우편 - StarMail el. laiškas - StarMail epasts - Emel StarMail - StarMail-melding - StarMail-e-mail - StarMail-fil - E-Mail StarMail - e-mail do StarMail - E-mail do StarMail - Email StarEmail - электронное письмо StarMail - E-mail StarMail - Datoteka pošte StarMail - Mesazh StarMail - StarMail пошта - StarMail-e-post - поштове повідомлення StarMail - Thư điện tử StarMail - STarMail 电子邮件 - StarMail 郵件 - - - - StarMath formula - صيغة StarMath - Formuła StarMath - Формула — StarMath - fórmula de StarMath - Vzorec StarMath - StarMath-formel - StarMath-Formel - μαθηματικός τύπος StarMath - StarMath formula - StarMath-formulo - fórmula de StarMath - StarMath formula - StarMath-kaava - StarMath frymil - formule StarMath - foirmle StarMath - fórmula de StarMath - נוסחה של StarMath - StarMath formula - StarMath-képlet - Formula StarMath - Formula StarMath - StarMath 計算式 - StarMath формуласы - StarMath 수식 - StarMath formulė - StarMath formula - Formula StarMath - StarMath-formel - StarMath-formule - StarMath-formel - Formuła StarMath - fórmula do StarMath - Fórmula do StarMath - Formulă StarMath - формула StarMath - Vzorec StarMath - Datoteka formule StarMath - Formulë StarMath - StarMath формула - StarMath-formel - формула StarMath - Công thức StarMath - STarMath 公式 - StarMath 公式 - - - - - StarWriter document - مستند StarWriter - StarWriter sənədi - Dakument StarWriter - Документ — StarWriter - document de StarWriter - Dokument StarWriter - Dogfen StarWriter - StarWriter-dokument - StarWriter-Dokument - έγγραφο StarWriter - StarWriter document - StarWriter-dokumento - documento de StarWriter - StarWriter dokumentua - StarWriter-asiakirja - StarWriter skjal - document StarWriter - cáipéis StarWriter - documento de StarWriter - מסמך של StarWriter - StarWriter dokument - StarWriter-dokumentum - Dokumen StarWriter - Documento StrarWriter - StarWriter ドキュメント - StarWriter құжаты - StarWriter 문서 - StarWriter dokumentas - StarWriter dokuments - Dokumen StarWriter - StarWriter-dokument - StarWriter-document - StarWriter document - Dokument StarWriter - documento do StarWriter - Documento do StarWriter - Document StarWriter - документ StarWriter - Dokument StarWriter - Dokument StarWriter - Dokument StarWriter - StarWriter документ - StarWriter-dokument - StarWriter belgesi - документ StarWriter - Tài liệu StarWriter - STarWriter 文档 - StarWriter 文件 - - - - - - - - - - OpenOffice Calc spreadsheet - جدول Calc المكتب المفتوح - Raźlikovy arkuš OpenOffice Calc - Таблица — OpenOffice Calc - full de càlcul d'OpenOffice Calc - Sešit OpenOffice Calc - OpenOffice Calc-regneark - OpenOffice-Calc-Tabelle - φύλλο εργασίας OpenOffice Calc - OpenOffice Calc spreadsheet - hoja de cálculo de OpenOffice Calc - OpenOffice.org Calc kalkulu-orria - OpenOffice Calc -taulukko - OpenOffice Calc rokniark - feuille de calcul OpenOffice Calc - scarbhileog OpenOffice Calc - folla de cálculo de OpenOffice Calc - גליון נתונים של OpenOffice Calc - OpenOffice Calc táblázat - Lembar sebar OpenOffice Calc - Foglio di calcolo OpenOffice Calc - OpenOffice Calc スプレッドシート - OpenOffice Calc-ის ცხრილი - OpenOffice Calc электрондық кестесі - OpenOffice Calc 스프레드시트 - OpenOffice Calc skaičialentė - OpenOffice Calc izklājlapa - OpenOffice Calc-regneark - OpenOffice.org Calc-rekenblad - OpenOffice Calc-rekneark - Arkusz kalkulacyjny OpenOffice.org Calc - Planilha do OpenOffice Calc - Foaie de calcul OpenOffice Calc - электронная таблица OpenOffice Calc - Zošit OpenOffice Calc - Razpredelnica OpenOffice.org Calc - Fletë llogaritjesh OpenOffice Calc - OpenOffice Calc-kalkylblad - ел. таблиця OpenOffice Calc - Bảng tính Calc của OpenOffice.org - OpenOffice.org Calc 工作簿 - OpenOffice Calc 試算表 - - - - - - - - - - - - - OpenOffice Calc template - قالب Calc المكتب المفتوح - Šablon OpenOffice Calc - Шаблон за таблици — OpenOffice Calc - plantilla d'OpenOffice Calc - Šablona OpenOffice Calc - OpenOffice Calc-skabelon - OpenOffice-Calc-Vorlage - πρότυπο OpenOffice Calc - OpenOffice Calc template - plantilla de OpenOffice Calc - OpenOffice Calc txantiloia - OpenOffice Calc -malli - OpenOffice Calc formur - modèle OpenOffice Calc - teimpléad OpenOffice Calc - modelo de OpenOffice Calc - תבנית של OpenOffice Calc - OpenOffice Calc sablon - Templat OpenOffice Calc - Modello OpenOffice Calc - OpenOffice Calc テンプレート - OpenOffice Calc-ის შაბლონი - OpenOffice Calc үлгісі - OpenOffice Calc 스프레드시트 문서 서식 - OpenOffice Calc šablonas - OpenOffice Calc veidne - OpenOffice Calc-mal - OpenOffice.org Calc-sjabloon - OpenOffice Calc-mal - Szablon arkusza OpenOffice.org Calc - Modelo do OpenOffice Calc - Șablon OpenOffice Calc - шаблон OpenOffice Calc - Šablóna OpenOffice Calc - Predloga OpenOffice.org Calc - Model OpenOffice Calc - OpenOffice Calc-mall - шаблон ел.таблиці OpenOffice Calc - Mẫu bảng tính Calc của OpenOffice.org - OpenOffice.org Calc 工作簿模板 - OpenOffice Calc 範本 - - - - - - - - - - - - - OpenOffice Draw drawing - تصميم Draw المكتب المفتوح - Rysunak OpenOffice Draw - Чертеж — OpenOffice Draw - dibuix d'OpenOffice Draw - Kresba OpenOffice Draw - OpenOffice Draw-tegning - OpenOffice-Draw-Zeichnung - σχέδιο OpenOffice Draw - OpenOffice Draw drawing - dibujo de OpenOffice Draw - OpenOffice.org Draw marrazkia - OpenOffice Draw -piirros - OpenOffice Draw tekning - dessin OpenOffice Draw - líníocht OpenOffice Draw - debuxo de OpenOffice Draw - ציור של OpenOffice Draw - OpenOffice Draw rajz - Gambar OpenOffice Draw - Disegno OpenOffice Draw - OpenOffice Draw ドロー - OpenOffice Draw-ის ნახაზი - OpenOffice Draw суреті - OpenOffice Draw 그림 - OpenOffice Draw piešinys - OpenOffice Draw zīmējums - OpenOffice Draw-tegning - OpenOffice.org Draw-tekening - OpenOffice Draw-teikning - Rysunek OpenOffice.org Draw - Desenho do OpenOffice Draw - Desen OpenOffice Draw - изображение OpenOffice Draw - Kresba OpenOffice Draw - Datoteka risbe OpenOffice.org Draw - Vizatim OpenOffice Draw - OpenOffice Draw-teckning - малюнок OpenOffice Draw - Bản vẽ Draw của OpenOffice.org - OpenOffice.org Draw 绘图 - OpenOffice Draw 繪圖 - - - - - - - - - - - - - OpenOffice Draw template - قالب Draw المكتب المفتوح - Šablon OpenOffice Draw - Шаблон за чертежи — OpenOffice Draw - plantilla d'OpenOffice Draw - Šablona OpenOffice Draw - OpenOffice Draw-skabelon - OpenOffice-Draw-Vorlage - πρότυπο OpenOffice Draw - OpenOffice Draw template - plantilla de OpenOffice.org Draw - OpenOffice Draw txantiloia - OpenOffice Draw -malli - OpenOffice Draw formur - modèle OpenOffice Draw - teimpléad OpenOffice Draw - modelo de OpenOffice Draw - תבנית של OpenOffice Draw - OpenOffice Draw sablon - Templat OpenOffice Draw - Modello OpenOffice Draw - OpenOffice Draw テンプレート - OpenOffice Draw-ის შაბლონი - OpenOffice Draw үлгісі - OpenOffice Draw 그림 문서 서식 - OpenOffice Draw šablonas - OpenOffice Draw veidne - OpenOffice Draw-mal - OpenOffice.org Draw-sjabloon - OpenOffice Draw-mal - Szablon rysunku OpenOffice.org Draw - Modelo do OpenOffice Draw - Șablon OpenOffice Draw - шаблон OpenOffice Draw - Šablóna OpenOffice Draw - Predloga OpenOffice.org Draw - Model OpenOffice Draw - OpenOffice Draw-mall - шаблон малюнку OpenOffice Draw - Mẫu bản vẽ Draw của OpenOffice.org - OpenOffice.org Draw 绘图模板 - OpenOffice Draw 範本 - - - - - - - - - - - - - OpenOffice Impress presentation - عرض تقديمي Impress المكتب المفتوح - OpenOffice Impress sənədi - Prezentacyja OpenOffice Impress - Презентация — OpenOffice Impress - presentació d'OpenOffice Impress - Prezentace OpenOffice Impress - Cyflwyniad OpenOffice (Impress) - OpenOffice Impress-præsentation - OpenOffice-Impress-Vorlage - παρουσίαση OpenOffice Impress - OpenOffice Impress presentation - presentación de OpenOffice Impress - OpenOffice.org Impress aurkezpena - OpenOffice Impress -esitys - OpenOffice Impress framløga - présentation OpenOffice Impress - láithreoireacht OpenOffice Impress - presentación de de OpenOffice Impress - מצגת של OpenOffice Impress - OpenOffice Impress bemutató - Presentasi OpenOffice Impress - Presentazione OpenOffice Impress - OpenOffice Impress プレゼンテーション - OpenOffice Impress-ის პრეზენტაცია - OpenOffice Impress презентациясы - OpenOffice Impress 프리젠테이션 - OpenOffice Impress pateiktis - OpenOffice Impress prezentācija - OpenOffice Impress-presentasjon - OpenOffice.org Impress-presentatie - OpenOffice Impress-presentasjon - Prezentacja OpenOffice.org Impress - Apresentação do OpenOffice Impress - Prezentare OpenOffice Impress - презентация OpenOffice Impress - Prezentácia OpenOffice Impress - Predstavitev OpenOffice.org Impress - Prezantim OpenOffice Impress - OpenOffice Impress-presentation - презентація OpenOffice Impress - Trình diễn Impress của OpenOffice.org - OpenOffice.org Impress 演示文稿 - OpenOffice Impress 簡報 - - - - - - - - - - - - - OpenOffice Impress template - قالب Impress المكتب المفتوح - Šablon OpenOffice Impress - Шаблон за презентации — OpenOffice Impress - plantilla d'OpenOffice Impress - Šablona OpenOffice Impress - OpenOffice Impress-skabelon - OpenOffice-Impress-Vorlage - πρότυπο OpenOffice Impress - OpenOffice Impress template - plantilla de OpenOffice Impress - OpenOffice Impress txantiloia - OpenOffice Impress -malli - OpenOffice Impress formur - modèle OpenOffice Impress - teimpléad OpenOffice Impress - modelo de OpenOffice Impress - תבנית של OpenOffice Impress - OpenOffice Impress sablon - Templat OpenOffice Impress - Modello OpenOffice Impress - OpenOffice Impress テンプレート - OpenOffice Impress-ის შაბლონი - OpenOffice Impress үлгісі - OpenOffice Impress 프리젠테이션 문서 서식 - OpenOffice Impress šablonas - OpenOffice Impress veidne - OpenOffice Impress-mal - OpenOffice.org Impress-sjabloon - OpenOffice Impress-mal - Szablon prezentacji OpenOffice.org Impress - Modelo do OpenOffice Impress - Șablon OpenOffice Impress - шаблон OpenOffice Impress - Šablóna OpenOffice Impress - Predloga OpenOffice.org Impress - Model OpenOffice Impress - OpenOffice Impress-mall - шаблон презентації OpenOffice Impress - Mẫu trình diễn Impress của OpenOffice.org - OpenOffice.org Impress 演示文稿模板 - OpenOffice Impress 範本 - - - - - - - - - - - - - OpenOffice Math formula - صيغة Math المكتب المفتوح - Formuła OpenOffice Math - Формула — OpenOffice Math - fórmula d'OpenOffice Math - Vzorec OpenOffice Math - OpenOffice Math-formel - OpenOffice-Math-Formel - μαθηματικός τύπος OpenOffice Math - OpenOffice Math formula - fórmula de OpenOffice Math - OpenOffice.org Math formula - OpenOffice Math -kaava - OpenOffice Math frymil - formule OpenOffice Math - foirmle OpenOffice Math - fórmula de OpenOffice Math - נוסחה של OpenOffice Math - OpenOffice Math képlet - Formula OpenOffice Math - Formula OpenOffice Math - OpenOffice Math 計算式 - OpenOffice Math-ის ფორმულა - OpenOffice Math формуласы - OpenOffice Math 수식 - OpenOffice Math formulė - OpenOffice Math formula - OpenOffice Math-formel - OpenOffice.org Math-formule - OpenOffice Math-formel - Formuła OpenOffice.org Math - Fórmula do OpenOffice Math - Formulă OpenOffice Math - формула OpenOffice Math - Vzorec OpenOffice Math - Dokument formule OpenOffice.org Math - Formulë OpenOffice Math - OpenOffice Math-formel - OpenOffice Math formülü - формула OpenOffice Math - Công thức Math của OpenOffice.org - OpenOffice.org Math 公式 - OpenOffice Math 公式 - - - - - - - - - - - - - OpenOffice Writer document - مستند Writer المكتب المفتوح - OpenOffice Writer sənədi - Dakument OpenOffice Writer - Документ — OpenOffice Writer - document d'OpenOffice Writer - Dokument OpenOffice Writer - Dogfen OpenOffice (Writer) - OpenOffice Writer-dokument - OpenOffice-Writer-Dokument - έγγραφο OpenOffice Writer - OpenOffice Writer document - documento de OpenOffice Writer - OpenOffice.org Writer dokumentua - OpenOffice Writer -asiakirja - OpenOffice Writer skjal - document OpenOffice Writer - cáipéis OpenOffice Writer - documento de OpenOffice Writer - מסמך של OpenOffice Writer - OpenOffice Writer dokumentum - Dokumen OpenOffice Writer - Documento OpenOffice Writer - OpenOffice Writer ドキュメント - OpenOffice Writer-ის დოკუმენტი - OpenOffice Writer құжаты - OpenOffice Writer 문서 - OpenOffice Writer dokumentas - OpenOffice Writer dokuments - OpenOffice Writer-dokument - OpenOffice.org Writer-document - OpenOffice Writer-dokument - Dokument OpenOffice.org Writer - Documento do OpenOffice Writer - Document OpenOffice Writer - документ OpenOffice Writer - Dokument OpenOffice Writer - Dokument OpenOffice.org Writer - Dokument OpenOffice Writer - OpenOffice Writer-dokument - OpenOffice Writer belgesi - документ OpenOffice Writer - Tài liệu Writer của OpenOffice.org - OpenOffice.org Writer 文档 - OpenOffice Writer 文件 - - - - - - - - - - - - - OpenOffice Writer global document - مستند المكتب المفتوح Writer العالمي - OpenOffice Writer qlobal sənədi - Hlabalny dakument OpenOffice Writer - Документ - глобален — OpenOffice Writer - document global d'OpenOffice Writer - Globální dokument OpenOffice Writer - Dogfen eang OpenOffice (Writer) - OpenOffice Writer-globalt dokument - OpenOffice-Writer-Globaldokument - παγκόσμιο έγγραφο OpenOffice Writer - OpenOffice Writer global document - documento global de OpenOffice Writer - OpenOffice.org Writer dokumentu globala - OpenOffice Writer - yleinen asiakirja - OpenOffice Writer heiltøkt skjal - document global OpenOffice Writer - cáipéis chomhchoiteann OpenOffice Writer - documento global de OpenOffice Writer - מסמך גלובלי של OpenOffice Writer - OpenOffice Writer globális dokumentum - Dokumen global OpenOffice Writer - Documento globale OpenOffice Writer - OpenOffice Writer グローバルドキュメント - OpenOffice Writer-ის გლობალური დოკუმენტი - OpenOffice Writer негізгі құжаты - OpenOffice Writer 글로벌 문서 - OpenOffice Writer bendrinis dokumentas - OpenOffice Writer globālais dokuments - Global OpenOffice Writer globalt dokument - OpenOffice.org Writer-globaal-document - OpenOffice Writer globalt dokument - Globalny dokument OpenOffice.org Writer - Documento global do OpenOffice Writer - Document global OpenOffice Writer - основной документ OpenOffice Writer - Globálny dokument OpenOffice Writer - Splošni dokument OpenOffice.org Writer - Dokument i përgjithshëm OpenOffice Writer - OpenOffice Writer-globaldokument - загальний документ OpenOffice Writer - Tài liệu toàn cục Writer của OpenOffice.org - OpenOffice.org Writer 全局文档 - OpenOffice Writer 主控文件 - - - - - - - - - - - - - OpenOffice Writer template - قالب Writer المكتب المفتوح - OpenOffice Writer şablonu - Šablon OpenOffice Writer - Шаблон за документи — OpenOffice Writer - plantilla d'OpenOffice Writer - Šablona OpenOffice Writer - Templed OpenOffice (Writer) - OpenOffice Writer-skabelon - OpenOffice-Writer-Vorlage - πρότυπο OpenOffice Writer - OpenOffice Writer template - plantilla de OpenOffice Writer - OpenOffice Writer txantiloia - OpenOffice Writer -malli - OpenOffice Writer formur - modèle OpenOffice Writer - teimpléad OpenOffice Writer - modelo de OpenOffice Writer - תסנית של OpenOffice Writer - OpenOffice Writer sablon - Templat OpenOffice Writer - Modello OpenOffice Writer - OpenOffice Writer ドキュメントテンプレート - OpenOffice Writer-ის შაბლონი - OpenOffice Writer үлгісі - OpenOffice Writer 문서 서식 - OpenOffice Writer šablonas - OpenOffice Writer veidne - Templat OpenOffice Writer - OpenOffice Writer-mal - OpenOffice.org Writer-sjabloon - OpenOffice Writer-mal - Szablon dokumentu OpenOffice.org Writer - Modelo do OpenOffice Writer - Șablon OpenOffice Writer - шаблон OpenOffice Writer - Šablóna OpenOffice Writer - Predloga OpenOffice.org Writer - Model OpenOffice Writer - OpenOffice Writer-mall - шаблон документа OpenOffice Writer - Mẫu tài liệu Writer của OpenOffice.org - OpenOffice.org Writer 文档模板 - OpenOffice Writer 範本 - - - - - - - - - - - - - ODT document - مستند ODT - Dakument ODT - Документ — ODT - document ODT - Dokument ODT - ODT-dokument - ODT-Dokument - έγγραφο ODT - ODT document - ODT-dokumento - documento ODT - ODT dokumentua - ODT-asiakirja - ODT skjal - document ODT - cáipéis ODT - documento ODT - מסמך ODT - ODT dokument - ODT-dokumentum - Dokumen ODT - Documento ODT - ODT ドキュメント - ODT დოკუმენტი - ODT құжаты - ODT 문서 - ODT dokumentas - ODT dokuments - ODT-dokument - ODT-document - ODT-dokument - Dokument ODT - Documento ODT - Document ODT - документ ODT - Dokument ODT - Dokument ODT - Dokument ODT - ODT-dokument - документ ODT - Tài liệu ODT - ODT 文档 - ODT 文件 - ODT - OpenDocument Text - - - - - - - - - - - - - ODT document (Flat XML) - مستند ODT (Flat XML) - Документ — ODT (само XML) - document ODT (XML pla) - Dokument ODT (Flat XML) - ODT-dokument (flad XML) - ODT-Dokument (Unkomprimiertes XML) - έγγραφο ODT (Flat XML) - ODT document (Flat XML) - documento ODT (XML plano) - ODT dokumentua (XML soila) - ODT skjal (Flat XML) - document ODT (XML plat) - cáipéis ODT (XML cothrom) - documento ODT (XML plano) - מסמך ODT‏ (Flat XML) - ODT-dokumentum (egyszerű XML) - Dokumen ODT (Flat XML) - Documento ODT (XML semplice) - ODT ドキュメント (Flat XML) - ODT დოკუმენტი (Flat XML) - ODT құжаты (Тек XML) - ODT 문서 (단일 XML) - ODT dokumentas (Flat XML) - ODT dokuments (plakans XML) - ODT document (Flat XML) - Dokument ODT (prosty XML) - Documento ODT (Flat XML) - Document ODT (XML simplu) - документ ODT (простой XML) - Dokument ODT (čisté XML) - Datoteka dokumenta ODT (nepovezan XML) - ODT-dokument (platt XML) - документ ODT (Flat XML) - ODT 文档(Flat XML) - ODT 文件 (Flat XML) - FODT - OpenDocument Text (Flat XML) - - - - - - ODT template - قالب ODT - Šablon ODT - Шаблон за документи — ODT - plantilla ODT - Šablona ODT - ODT-skabelon - ODT-Vorlage - πρότυπο ODT - ODT template - ODT-ŝablono - plantilla ODT - ODT txantiloia - ODT-malli - ODT formur - modèle ODT - teimpléad ODT - modelo ODT - תבנית ODT - ODT predložak - ODT-sablon - Templat ODT - Modello ODT - ODT テンプレート - ODT დოკუმენტი - ODT үлгісі - ODT 문서 서식 - ODT šablonas - ODT veidne - ODT-mal - ODT-sjabloon - ODT-mal - Szablon ODT - Modelo ODT - Șablon ODT - шаблон ODT - Šablóna ODT - Predloga dokumenta ODT - Model ODT - ODT-mall - шаблон ODT - Mẫu ODT - ODT 模板 - ODT 範本 - ODT - OpenDocument Text - - - - - - - - - - - - - OTH template - قالب OTH - Šablon OTH - Шаблон за страници — OTH - plantilla OTH - Šablona OTH - OTH-skabelon - OTH-Vorlage - πρότυπο OTH - OTH template - OTH-ŝablono - plantilla OTH - OTH txantiloia - OTH-malli - OTH formur - modèle OTH - teimpléad OTH - modelo OTH - תבנית OTH - OTH predložak - OTH-sablon - Templat OTH - Modello OTH - OTH テンプレート - OTH შაბლონი - OTH үлгісі - OTH 문서 서식 - OTH šablonas - OTH veidne - OTH-mal - OTH-sjabloon - OTH-mal - Szablon OTH - Modelo OTH - Șablon OTH - шаблон OTH - Šablóna OTH - Predloga OTH - Model OTH - OTH-mall - шаблон OTH - Mẫu ODH - OTH 模板 - OTH 範本 - OTH - OpenDocument HTML - - - - - - - - - - - - - ODM document - مستند ODM - Dakument ODM - Документ — ODM - document ODM - Dokument ODM - ODM-dokument - ODM-Dokument - έγγραφο ODM - ODM document - ODM-dokumento - documento ODM - ODM dokumentua - ODM-asiakirja - ODM skjal - document ODM - cáipéis ODM - documento ODM - מסמך ODM - ODM dokument - ODM-dokumentum - Dokumen ODM - Documento ODM - ODM ドキュメント - ODM დოკუმენტი - ODM құжаты - ODM 문서 - ODM dokumentas - ODM dokuments - ODM-dokument - ODM-document - ODM-dokument - Dokument ODM - Documento ODM - Document ODM - документ ODM - Dokument ODM - Dokument ODM - Dokument ODM - ODM-dokument - ODM belgesi - документ ODM - Tài liệu ODM - ODM 文档 - ODM 文件 - ODM - OpenDocument Master - - - - - - - - - - - - - ODG drawing - تصميم ODG - Rysunak ODG - Чертеж — ODG - dibuix ODG - Kresba ODG - ODG-tegning - ODG-Zeichnung - σχέδιο ODG - ODG drawing - ODG-desegnaĵo - dibujo ODG - ODG marrazkia - ODG-piirros - ODG tekning - dessin ODG - líníocht ODG - debuxo ODG - ציור ODG - ODG crtež - ODG-rajz - Gambar ODG - Disegno ODG - ODG ドロー - ODG-ის ნახაზი - ODG суреті - ODG 드로잉 - ODG piešinys - ODG zīmējums - ODG-tegning - ODG-tekening - ODG-teikning - Rysunek ODG - Desenho ODG - Desen ODG - изображение ODG - Kresba ODG - Datoteka risbe ODG - Vizatim ODG - ODG-teckning - малюнок ODG - Bản vẽ ODG - ODG 绘图 - ODG 繪圖 - ODG - OpenDocument Drawing - - - - - - - - - - - - - ODG drawing (Flat XML) - رسمة ODG (Flat XML) - Чертеж — ODG (само XML) - dibuix ODG (XML pla) - Kresba ODG (Flat XML) - ODG-tegning (flad XML) - ODG-Zeichnung (Unkomprimiertes XML) - ODG drawing (Flat XML) - dibujo ODG (XML plano) - ODG marrazkia (XML soila) - ODG tekning (Flat XML) - dessin ODG (XML plat) - líníocht ODG (XML cothrom) - debuxo ODB (XML plano) - ציור ODG (Flat XML( - ODG-rajz (egyszerű XML) - Gambar ODG (FLAT XML) - Disegno ODG (XML semplice) - ODG ドロー (Flat XML) - ODG-ის ნახაზი (Flat XML) - ODG сызбасы (Тек XML) - ODG 드로잉 (단일 XML) - ODG piešinys (Flat XML) - ODG zīmējums (plakans XML) - ODG-tekening (Flat XML) - Rysunek ODG (prosty XML) - Desenho ODG (Flat XML) - Desen ODG (XML simplu) - изображение ODG (простой XML) - Kresba ODG (čisté XML) - Datoteka risbe ODG (nepovezan XML) - ODG-teckning (platt XML) - малюнок ODG (Flat XML) - ODG 绘图(Flat XML) - ODG 繪圖 (Flat XML) - FODG - OpenDocument Drawing (Flat XML) - - - - - - ODG template - قالب ODG - Šablon ODG - Шаблон за чертежи — ODG - plantilla ODG - Šablona ODG - ODG-skabelon - ODG-Vorlage - πρότυπο ODG - ODG template - ODG-ŝablono - plantilla ODG - ODG txantiloia - ODG-malli - ODG formur - modèle ODG - teimpléad ODG - modelo ODG - תבנית ODG - ODG predložak - ODG-sablon - Templat ODG - Modello ODG - ODG テンプレート - ODG-ის შაბლონი - ODG үлгісі - ODG 문서 서식 - ODG šablonas - ODG veidne - ODG-mal - ODG-sjabloon - ODG-mal - Szablon ODG - Modelo ODG - Șablon ODG - шаблон ODG - Šablóna ODG - Predloga dokumenta ODG - Model ODG - ODG-mall - шаблон ODG - Mẫu ODG - ODG 模板 - ODG 範本 - ODG - OpenDocument Drawing - - - - - - - - - - - - - ODP presentation - عرض تقديمي ODP - Prezentacyja ODP - Презентация — ODP - presentació ODP - Prezentace ODP - ODP-præsentation - ODP-Präsentation - παρουσίαση ODP - ODP presentation - ODP-prezentaĵo - presentación ODP - ODP aurkezpena - ODP-esitys - ODP framløga - présentation ODP - láithreoireacht ODP - presentación ODP - מצגת ODP - ODP prezentacija - ODP-prezentáció - Presentasi ODP - Presentazione ODP - ODP プレゼンテーション - ODP პრეზენტაცია - ODP презентациясы - ODP 프리젠테이션 - ODP pateiktis - ODP prezentācija - ODP-presentasjon - ODP-presentatie - ODP-presentasjon - Prezentacja ODP - Apresentação ODP - Prezentare ODP - презентация ODP - Prezentácia ODP - Predstavitev ODP - Prezantim ODP - ODP-presentation - ODP sunumu - презентація ODP - Trình diễn ODM - ODP 演示文稿 - ODP 簡報 - ODP - OpenDocument Presentation - - - - - - - - - - - - - ODP presentation (Flat XML) - عرض ODP (Flat XML) - Презентация — ODP (само XML) - presentació ODP (XML pla) - Prezentace ODP (Flat XML) - ODP-præsentation (flad XML) - ODP-Präsentation (Unkomprimiertes XML) - παρουσίαση ODP (Flat XML) - ODP presentation (Flat XML) - presentación ODP (XML plano) - ODP aurkezpena (XML soila) - ODP framløga (Flat XML) - présentation ODP (XML plat) - láithreoireacht ODP (XML cothrom) - presentación ODP (XML plano) - מצגת ODP‏ (Flat XML) - ODP-prezentáció (egyszerű XML) - Presentasi ODP (Flat XML) - Presentazione ODP (XML semplice) - ODP プレゼンテーション (Flat XML) - ODP პრეზენტაცია (Flat XML) - ODP презентациясы (Тек XML) - ODP 프리젠테이션 (단일 XML) - ODP pateiktis (Flat XML) - ODP prezentācija (plakans XML) - ODP presentatie (Flat XML) - Prezentacja ODP (prosty XML) - Apresentação ODP (Flat XML) - Prezentare ODP (XML simplu) - презентация ODP (простой XML) - Prezentácia ODP (čisté XML) - Predstavitev ODP (nepovezan XML) - ODP-presentation (platt XML) - презентація ODP (Flat XML) - ODP 演示文稿(Flat XML) - ODP 範本 (Flat XML) - FODP - OpenDocument Presentation (Flat XML) - - - - - - ODP template - قالب ODP - Šablon ODP - Шаблон за презентации — ODP - plantilla ODP - Šablona ODP - ODP-skabelon - ODP-Vorlage - πρότυπο ODP - ODP template - ODP-ŝablono - plantilla ODP - ODP txantiloia - ODP-malli - ODP formur - modèle ODP - teimpléad ODP - modelo ODP - תבנית ODP - ODP predložak - ODP-sablon - Templat ODP - Modello ODP - ODP テンプレート - ODP შაბლონი - ODP үлгісі - ODP 문서 서식 - ODP šablonas - ODP veidne - ODP-mal - ODP-sjabloon - ODP-mal - Szablon ODP - Modelo ODP - Șablon ODP - шаблон ODP - Šablóna ODP - Predloga dokumenta ODP - Model ODP - ODP-mall - шаблон ODP - Mẫu ODP - ODP 模板 - ODP 範本 - ODP - OpenDocument Presentation - - - - - - - - - - - - - ODS spreadsheet - جدول ODS - Raźlikovy arkuš ODS - Таблица — ODS - full de càlcul ODS - Sešit ODS - ODS-regneark - ODS-Tabelle - φύλλο εργασίας ODS - ODS spreadsheet - ODS-kalkultabelo - hoja de cálculo ODS - ODS kalkulu-orria - ODS-taulukko - ODS rokniark - feuille de calcul ODS - scarbhileog ODS - folla de cálculo ODS - גליון נתונים ODS - ODS proračunska tablica - ODS-táblázat - Lembar sebar ODS - Foglio di calcolo ODS - ODS スプレッドシート - ODS ცხრილი - ODS электрондық кестесі - ODS 스프레드시트 - ODS skaičialentė - ODS izklājlapa - ODS-regneark - ODS-rekenblad - ODS-rekneark - Arkusz ODS - Planilha ODS - Foaie de calcul ODS - электронная таблица ODS - Zošit ODS - Preglednica ODS - Fletë llogaritjesh ODS - ODS-kalkylblad - ел. таблиця ODS - Bảng tính ODS - ODS 工作簿 - ODS 試算表 - ODS - OpenDocument Spreadsheet - - - - - - - - - - - - - ODS spreadsheet (Flat XML) - جدول ODS (Flat XML) - Таблица — ODS (само XML) - full de càlcul ODS (XML pla) - Sešit ODS (Flat XML) - ODS-regneark (flad XML) - ODS-Tabelle (Unkomprimiertes XML) - φύλλο εργασίας ODS (Flat XML) - ODS spreadsheet (Flat XML) - hoja de cálculo ODS (XML plano) - ODS kalkulu-orria (XML soila) - ODS rokniark (Flat XML) - feuille de calcul ODS (XML plat) - scarbhileog ODS (XML cothrom) - folla de cálculo ODS (XML plano) - גליון נתונים ODS‏ (XML פשוט) - ODS-táblázat (egyszerű XML) - Lembar sebar ODS (Flat XML) - Foglio di calcolo ODS (XML semplice) - ODS スプレッドシート (Flat XML) - ODS ცხრილი (Flat XML) - ODS электрондық кестесі (Тек XML) - ODS 스프레드시트 (단일 XML) - ODS skaičialentė (Flat XML) - ODS izklājlapa (plakans XML) - ODS spreadsheet (Flat XML) - Arkusz ODS (prosty XML) - Planilha ODS (Flat XML) - Foaie de calcul ODS (XML simplu) - электронная таблица ODS (простой XML) - Zošit ODS (čisté XML) - Preglednica ODS (nepovezan XML) - ODS-kalkylblad (platt XML) - ел. таблиця ODS (Flat XML) - ODS 工作簿(Flat XML) - ODS 試算表 (Flat XML) - FODS - OpenDocument Spreadsheet (Flat XML) - - - - - - ODS template - قالب ODS - Šablon ODS - Шаблон за таблици — ODS - plantilla ODS - Šablona ODS - ODS-skabelon - ODS-Vorlage - πρότυπο ODS - ODS template - ODS-ŝablono - plantilla ODS - ODS txantiloia - ODS-malli - ODS formur - modèle ODS - teimpléad ODS - modelo ODS - תבנית ODS - ODS predložak - ODS-sablon - Templat ODS - Modello ODS - ODS テンプレート - ODS-ის შაბლონი - ODS үлгісі - ODS 문서 서식 - ODS šablonas - ODS veidne - ODS-mal - ODS-sjabloon - ODS-mal - Szablon ODS - Modelo ODS - Șablon ODS - шаблон ODS - Šablóna ODS - Predloga dokumenta ODS - Model ODS - ODS-mall - шаблон ODS - Mẫu ODS - ODS 模板 - ODS 範本 - ODS - OpenDocument Spreadsheet - - - - - - - - - - - - - ODC chart - مخطط ODC - Dyjahrama ODC - Диаграма — ODC - diagrama ODC - Graf ODC - ODC-diagram - ODC-Diagramm - διάγραμμα ODC - ODC chart - ODC-diagramo - gráfica ODC - ODC diagrama - ODC-kaavio - ODC strikumynd - graphique ODC - cairt ODC - gráfica ODC - תו ODC - ODC grafikon - ODC-táblázat - Bagan ODC - Grafico ODC - ODC チャート - ODC диаграммасы - ODC 차트 - ODC diagrama - ODC diagramma - ODC-graf - ODC-grafiek - ODC-diagram - Wykres ODC - Gráfico ODC - Diagramă ODC - диаграмма ODC - Graf ODC - Datoteka grafikona ODC - Grafik ODC - ODC-diagram - діаграма ODC - Sơ đồ ODC - ODC 图表 - ODC 圖表 - ODC - OpenDocument Chart - - - - - - - - - - - - - ODC template - قالب ODC - Шаблон за диаграми — ODC - plantilla ODC - Šablona ODC - ODC-skabelon - ODC-Vorlage - πρότυπο ODC - ODC template - ODC-ŝablono - plantilla ODC - ODC txantiloia - ODC-malli - ODC formur - modèle ODC - teimpléad ODC - modelo ODC - תבנית ODC - ODC predložak - ODC-sablon - Templat ODC - Modello ODC - ODC テンプレート - ODC შაბლონი - ODC үлгісі - ODC 문서 서식 - ODC šablonas - ODC veidne - ODC-sjabloon - Szablon ODC - Modelo ODC - Șablon ODC - шаблон ODC - Šablóna ODC - Predloga ODC - ODC-mall - шаблон ODC - Mẫu ODC - ODC 模板 - ODC 範本 - ODC - OpenDocument Chart - - - - - - - - - - - - - ODF formula - صيغة ODF - Formuła ODF - Формула — ODF - fórmula ODF - Vzorec ODF - ODF-formel - ODF-Formel - μαθηματικός τύπος ODF - ODF formula - ODF-formulo - fórmula ODF - ODF formula - ODF-kaava - ODF frymil - formule ODF - foirmle ODF - Fórula ODF - נוסחת ODF - ODF formula - ODF-képlet - Formula ODF - Formula ODF - ODF 計算式 - ODF-ის ფორმულა - ODF формуласы - ODF 수식 - ODF formulė - ODF formula - ODF-formel - ODF-formule - ODF-formel - Formuła ODF - Fórmula ODF - Formulă ODF - формула ODF - Vzorec ODF - Dokument formule ODF - Formulë ODF - ODF-formel - формула ODF - Công thức ODF - ODF 公式 - ODF 公式 - ODF - OpenDocument Formula - - - - - - - - - - - - - ODF template - قالب ODF - Шаблон за формули — ODF - plantilla ODF - Šablona ODF - ODF-skabelon - ODF-Vorlage - πρότυπο ODF - ODF template - ODF-ŝablono - plantilla ODF - ODF txantiloia - ODF-malli - ODF formur - modèle ODF - teimpléad ODF - modelo ODF - תבנית ODF - ODF predložak - ODG-sablon - Templat ODF - Modello ODF - ODF テンプレート - ODF-ის შაბლონი - ODF үлгісі - ODF 문서 서식 - ODF šablonas - ODF veidne - ODF-sjabloon - Szablon ODF - Modelo ODF - Șablon ODF - шаблон ODF - Šablóna ODF - Predloga dokumenta ODF - ODF-mall - шаблон ODF - Mẫu ODF - ODF 模板 - ODF 範本 - ODF - OpenDocument Formula - - - - - - - - - - - - - ODB database - قاعدة بيانات ODB - Baza źviestak ODB - База от данни — ODB - base de dades ODB - Databáze ODB - ODB-database - ODB-Datenbank - Βάση δεδομένων ODB - ODB database - ODB-datumbazo - base de datos ODB - ODB datu-basea - ODB-tietokanta - ODB dátustovnur - base de données ODB - bunachar sonraí ODB - base de datos ODB - בסיס נתונים ODB - ODB baza podataka - ODB-adatbázis - Basis data ODB - Database ODB - ODB データベース - ODB-ის მონაცემთა ბაზა - ODB дерекқоры - ODB 데이터베이스 - ODB duomenų bazė - ODB datubāze - ODB-database - ODB-gegevensbank - ODB-database - Baza danych ODB - Banco de dados ODB - Bază de date ODB - база данных ODB - Databáza ODB - Podatkovna zbirka ODB - Bazë me të dhëna ODB - ODB-databas - ODB veritabanı - база даних ODB - Cơ sở dữ liệu ODB - ODB 数据库 - ODB 資料庫 - ODB - OpenDocument Database - - - - - - ODI image - صورة ODI - Vyjava ODI - Изображение — ODI - imatge ODI - Obrázek ODI - ODI-billede - ODI-Bild - εικόνα ODI - ODI image - ODI-bildo - imagen ODI - ODI irudia - ODI-kuva - ODI mynd - image ODI - íomhá ODI - imaxe ODI - תמונת ODI - ODI slika - ODI-kép - Citra ODI - Immagine ODI - ODI 画像 - ODI გამოსახულება - ODI суреті - ODI 그림 - ODI paveikslėlis - ODI attēls - ODI-bilde - ODI-afbeelding - ODI-bilete - Obraz ODI - Imagem ODI - Imagine ODI - изображение ODI - Obrázok ODI - Slikovna datoteka ODI - Figurë ODI - ODI-bild - ODI görüntüsü - зображення ODI - Ảnh ODI - ODI 图像 - ODI 影像 - ODI - OpenDocument Image - - - - - - - - - - - - - OpenOffice.org extension - امتداد OpenOffice.org - Pašyreńnie OpenOffice.org - Разширение — OpenOffice - extensió d'OpenOffice.org - Rozšíření OpenOffice.org - OpenOffice.org-udvidelse - OpenOffice.org-Erweiterung - επέκταση OpenOffice.org - OpenOffice.org extension - extensión de OpenOffice - OpenOffice.org luzapena - OpenOffice.org-laajennus - OpenOffice.org víðkan - extension OpenOffice.org - eisínteacht OpenOffice.org - Extensión de OpenOffice.org - הרחבה של OpenOffice.org - OpenOffice.org kiterjesztés - Ekstensi OpenOffice.org - Estensione OpenOffice.org - OpenOffice.org 拡張機能 - OpenOffice.org-ის გაფართოება - OpenOffice.org кеңейтуі - OpenOffice.org 확장 - OpenOffice.org plėtinys - OpenOffice.org paplašinājums - OpenOffice.org-uitbreiding - OpenOffice Writer-utviding - Rozszerzenie OpenOffice.org - Extensão do OpenOffice - Extensie OpenOffice.org - расширение OpenOffice.org - Rozšírenie OpenOffice.org - Razširitev OpenOffice.org - Shtojcë për OpenOffice.org - OpenOffice.org-tillägg - OpenOffice.org eklentisi - розширення OpenOffice.org - Phần mở rộng của OpenOffice.org - OpenOffice.org 扩展 - OpenOffice.org 擴充套件 - - - - - - Android package - Пакет — Android - paquet d'Android - Balíčky systému Android - Android-pakke - Android-Paket - πακέτο Android - Android package - Android-pakaĵo - Paquete de Android - Android-paketti - paquet Android - paquete de Android - חבילת אנדרויד - Android paket - Android csomag - Paket Android - Pacchetto Android - Android パッケージ - Android-ის პაკეტი - Android дестесі - 안드로이드 패키지 - Android pakotne - Android pakket - Pakiet Androida - Pacote do Android - пакет Android - Paket Android - Android-paket - пакунок Android - Android - Android 套件 - - - - - SIS package - حزمة SIS - Pakunak SIS - Пакет — SIS - paquet SIS - Balíček SIS - SIS-pakke - SIS-Paket - πακέτο SIS - SIS package - SIS-pakaĵo - paquete SIS - SIS paketea - SIS-paketti - SIS pakki - paquet SIS - pacáiste SIS - paquete SIS - חבילת SIS - SIS paket - SIS csomag - Paket SIS - Pacchetto SIS - SIS パッケージ - SIS дестесі - SIS 패키지 - SIS paketas - SIS pakotne - SIS-pakke - SIS-pakket - SIS-pakke - Pakiet SIS - Pacote SIS - Pachet SIS - пакет SIS - Balíček SIS - Datoteka paketa SIS - Paketë SIS - SIS-paket - SIS paketi - пакунок SIS - Gói SIS - SIS 软件包 - SIS 套件 - SIS - Symbian Installation File - - - - - - - - SISX package - حزمة SISX - Pakunak SISX - Пакет — SISX - paquet SISX - Balíček SISX - SISX-pakke - SISX-Paket - πακέτο SISX - SISX package - SISX-pakaĵo - paquete SISX - SISX paketea - SISX-paketti - SISX pakki - paquet SISX - pacáiste SISX - paquete SISX - חבילת SISX - SISX paket - SISX csomag - Paket SISX - Pacchetto SISX - SISX パッケージ - SISX дестесі - SISX 패키지 - SISX paketas - SISX pakotne - SISX-pakke - SISX-pakket - SISX-pakke - Pakiet SISX - Pacote SISX - Pachet SISX - пакет SISX - Balíček SISX - Datoteka paketa SISX - Paketë SISX - SISX-paket - SISX paketi - пакунок SISX - Gói SISX - SISX 软件包 - SISX 套件 - SIS - Symbian Installation File - - - - - - - - Network Packet Capture - Прихванати пакети по мрежата - captura de paquets de xarxa - Network Packet Capture - Netværkspakkeoptegnelse - Netzwerk-Paketmitschnitt - Σύλληψη Πακέτων Δικτύου - Network Packet Capture - Caputra de paquete de red - capture de paquet réseau - Captura de Network Packet - לכידה של מנות נתונים ברשת - Hálózati csomagelfogás - Tangkapan Paket Jaringan - Cattura pacchetti rete - ネットワークパケットキャプチャー - ქსელური პაკეტის ანაბეჭდი - ұсталған желілік пакеттер - 네트워크 패킷 캡처 - Network Packet Capture - Network Packet Capture - Przechwycenie pakietu sieciowego - Pacote de captura de rede - захваченные сетевые пакеты - Zajem omrežnih paketov - перехоплені дані мережевих пакетів - 网络包抓取 - 網路封包捕捉 - - - - - - - - - - - - WordPerfect document - مستند WordPerfect - WordPerfect sənədi - Dakument WordPerfect - Документ — WordPerfect - document de WordPerfect - Dokument WordPerfect - Dogfen WordPerfect - WordPerfect-dokument - WordPerfect-Dokument - έγγραφο WordPerfect - WordPerfect document - WordPerfect-dokumento - documento de WordPerfect - WordPerfect dokumentua - WordPerfect-asiakirja - WordPerfect skjal - document WordPerfect - cáipéis WordPerfect - documento de WordPerfect - מסמך WordPerfect - WordPerfect dokument - WordPerfect-dokumentum - Dokumen WordPerfect - Documento WordPerfect - WordPerfect ドキュメント - WordPerfect құжаты - 워드퍼펙트 문서 - WordPerfect dokumentas - WordPerfect dokuments - Dokumen WordPerfect - WordPerfect-dokument - WordPerfect-document - WordPerfect-dokument - Dokument WordPerfect - documento do WordPerfect - Documento do WordPerfect - Document WordPerfect - документ WordPerfect - Dokument WordPerfect - Dokument WordPerfect - Dokument WordPerfect - WordPerfect документ - WordPerfect-dokument - документ WordPerfect - Tài liệu WordPerfect - WordPerfect 文档 - WordPerfect 文件 - - - - - - - - - - - - - - - - SPSS Portable Data File - ملف بيانات SPSS متنقلة - Данни — SPSS, преносими - fitxer de dades portables SPSS - Soubor přenositelných dat SPSS - Portabel SPSS-datafil - SPSS portable Datendatei - φορητό αρχείο δεδομένων SPSS - SPSS Portable Data File - archivo de datos portable SPSS - SPSS datuen fitxategi eramangarria - SPSS flytifør dátufíla - fichier portable de données SPSS - comhad iniompartha sonraí SPSS - ficheiro de datos portábel SPSS - קובץ מידע נייד SPSS - SPSS prenosiva podatkovna datoteka - SPSS hordozható adatfájl - Berkas Data Portabel SPSS - File dati SPSS Portable - SPSS ポータブルデータファイル - SPSS тасымалы ақпарат файлы - SPSS 이동식 데이터 파일 - SPSS perkeliamų duomenų failas - SPSS pārvietojamu datu datne - SPSS Portable Databestand - Plik przenośnych danych SPSS - Arquivo de Dados Portáteis SPSS - Fișier portabil de date SPSS - файл переносимых данных SPSS - Súbor prenosných dát SPSS - Prenosna podatkovna datoteka SPSS - Portabel SPSS-datafil - файл даних SPSS Portable - SPSS 便携式数据文件 - SPSS 可攜式資料檔 - - - - - - - SPSS Data File - ملف بيانات SPSS - Данни — SPSS - fitxer de dades SPSS - Datový soubor SPSS - SPSS-datafil - SPSS-Datendatei - αρχείο δεδομένων SPSS - SPSS Data File - archivo de datos SPSS - SPSS datuen fitxategia - SPSS dátufíla - fichier de données SPSS - comhad sonraí SPSS - ficheiro de datos SPSS - קובץ מידע SPSS - SPSS podatkovna datoteka - SPSS adatfájl - Berkas Data SPSS - File dati SPSS - SPSS データファイル - SPSS ақпарат файлы - SPSS 데이터 파일 - SPSS duomenų failas - SPSS datu datne - SPSS Databstand - Plik danych SPSS - Arquivo de dados SPSS - Fișier date SPSS - файл данных SPSS - Dátový súbor SPSS - Podatkovna datoteka SPSS - SPSS-datafil - файл даних SPSS - SPSS 数据文件 - SPSS 資料檔 - - - - - - - - XBEL bookmarks - علامات XBEL - Zakładki XBEL - Отметки — XBEL - llista d'adreces d'interès XBEL - Záložky XBEL - XBEL-bogmærker - XBEL-Lesezeichen - σελιδοδείκτες XBEL - XBEL bookmarks - XBEL-legosignoj - marcadores XBEL - XBEL laster-markak - XBEL-kirjanmerkit - XBEL bókamerki - marque-pages XBEL - leabharmharcanna XBEL - Marcadores XBEL - סמניית XBEL - XBEL knjižne oznake - XBEL-könyvjelzők - Bookmark XBEL - Segnalibri XBEL - XBEL ブックマーク - XBEL бетбелгілері - XBEL 책갈피 - XBEL žymelės - XBEL grāmatzīmes - Tandabuku XBEL - XBEL-bokmerker - XBEL-bladwijzers - XBEL-bokmerker - Zakładki XBEL - marcadores XBEL - Marcadores do XBEL - Semne de carte XBEL - закладки XBEL - Záložky XBEL - Datoteka zaznamkov XBEL - Libërshënues XBEL - XBEL обележивачи - XBEL-bokmärken - закладки XBEL - Liên kết đã lưu XBEL - XBEL 书签 - XBEL 格式書籤 - XBEL - XML Bookmark Exchange Language - - - - - - - - - 7-zip archive - أرشيف 7-zip - Archiŭ 7-zip - Архив — 7-zip - arxiu 7-zip - Archiv 7-zip - 7-zip-arkiv - 7zip-Archiv - αρχείο 7-zip - 7-zip archive - 7z-arkivo - archivador 7-zip - 7-zip artxiboa - 7-zip-arkisto - 7-zip skjalasavn - archive 7-zip - cartlann 7-zip - arquivo 7-zip - ארכיון 7-zip - 7-zip arhiva - 7-zip archívum - Arsip 7-zip - Archivio 7-zip - 7-zip アーカイブ - 7-zip არქივი - 7-zip архиві - 7-ZIP 압축 파일 - 7-zip archyvas - 7-zip arhīvs - 7-zip-arkiv - 7-zip-archief - 7-zip-arkiv - Archiwum 7-zip - Pacote 7-zip - Arhivă 7-zip - архив 7-zip - Archív 7-zip - Datoteka arhiva 7-zip - Arkiv 7-zip - 7-zip-arkiv - 7-Zip arşivi - архів 7-zip - Kho nén 7-zip - 7-zip 归档文件 - 7-zip 封存檔 - - - - - - - - AbiWord document - مستند آبي وورد - Dakument AbiWord - Документ — AbiWord - document d'AbiWord - Dokument AbiWord - AbiWord-dokument - AbiWord-Dokument - έγγραφο AbiWord - AbiWord document - AbiWord-dokumento - documento de Abiword - AbiWord dokumentua - AbiWord-asiakirja - AbiWord skjal - document AbiWord - cáipéis AbiWord - documento de AbiWord - מסמך AbiWord - AbiWord dokument - AbiWord-dokumentum - Dokumen AbiWord - Documento AbiWord - AbiWord ドキュメント - AbiWord-ის დოკუმენტი - AbiWord құжаты - AbiWord 문서 - AbiWord dokumentas - AbiWord dokuments - Dokumen AbiWord - AbiWord-dokument - AbiWord-document - AbiWord-dokument - Dokument AbiWord - documento AbiWord - Documento do AbiWord - Document AbiWord - документ AbiWord - Dokument AbiWord - Dokument AbiWord - Dokument AbiWord - Абиворд документ - AbiWord-dokument - AbiWord belgesi - документ AbiWord - Tài liệu AbiWord - AbiWord 文档 - AbiWord 文件 - - - - - - - - - - - - - - CD image cuesheet - صفيحة صورة الـCD جديلة - Infarmacyjny arkuš vyjavy CD - Описание на изображение на CD - «cuesheet» d'imatge de CD - Rozvržení stop obrazu CD - Cd-aftrykscuesheet - CD-Abbild-Cuesheet - CD image cuesheet - cue sheet de una imagen de CD - CD irudiaren CUE orria - CD-vedos cuesheet - index de pistes de CD - bileog chiúáil íomhá CD - cue sheet dunha imaxe de CD - גליון נתונים לתמונת דיסק - CD kép cuesheet - Citra cuesheet CD - Cuesheet immagine CD - CD イメージキューシート - CD бейнесінің құрама кестесі - CD 이미지 큐시트 - CD atvaizdžio aprašas - CD attēla rindulapa - Filliste for CD-avtrykk - CD-inhoudsopgave - CD-bilete-indeksfil - Obraz cuesheet płyty CD - Índice de Imagem de CD - Imagine CD cuesheet - таблица содержания образа CD - Rozvrhnutie stôp obrazu CD - Datoteka razpredelnice odtisa CD cue - Cuesheet imazhi CD - Indexblad för cd-avbild - таблиця CUE образу CD - Tờ tín hiệu báo ảnh CD - CD 映像标记文件 - CD 映像指示表 - - - - - - Lotus AmiPro document - مستند Lotus AmiPro - Lotus AmiPro sənədi - Dakument Lotus AmiPro - Документ — Lotus AmiPro - document de Lotus AmiPro - Dokument Lotus AmiPro - Dogfen Lotus AmiPro - Lotus AmiPro-dokument - Lotus-AmiPro-Dokument - έγγραφο Lotus AmiPro - Lotus AmiPro document - dokumento de Lotus AmiPro - documento de Lotus AmiPro - Lotus AmiPro dokumentua - Lotus AmiPro -asiakirja - Lotus AmiPro skjal - document Lotus AmiPro - cáipéis Lotus AmiPro - documento de Lotus AmiPro - מסמך של Lotus AmiPro - Lotus AmiPro dokument - Lotus AmiPro-dokumentum - Dokumen Lotus AmiPro - Documento Lotus AmiPro - Lotus AmiPro ドキュメント - Lotus AmiPro құжаты - Lotus AmiPro 문서 - Lotus AmiPro dokumentas - Lotus AmiPro dokuments - Dokumen Lotus AmiPro - Lotus AmiPro-dokument - Lotus AmiPro-document - Lotus AmiPro-dokument - Dokument Lotus AmiPro - documento Lotus AmiPro - Documento do Lotus AmiPro - Document Lotus AmiPro - документ Lotus AmiPro - Dokument Lotus AmiPro - Dokument Lotus AmiPro - Dokument Lotus AmiPro - Лотус АмиПро документ - Lotus AmiPro-dokument - документ Lotus AmiPro - Tài liệu Lotus AmiPro - Lotus AmiPro 文档 - Lotus AmiPro 文件 - - - - - AportisDoc document - مستند AportisDoc - Документ — AportisDoc - document AportisDoc - Dokument AportisDoc - AportisDoc-dokument - AportisDoc-Dokument - έγγραφο AportisDoc - AportisDoc document - AportisDoc-dokumento - documento AportisDoc - AportisDoc dokumentua - AportisDoc-asiakirja - AportisDoc skjal - document AportisDoc - cáipéis AportisDoc - documento de AportiDoc - מסמך AportisDoc - AportisDoc dokument - AportisDoc-dokumentum - Dokumen AportisDoc - Documento AportisDoc - AportisDoc ドキュメント - AportisDoc-ის დოკუმენტი - AportisDoc құжаты - AportisDoc 문서 - AportisDoc dokumentas - AportisDoc dokuments - AportisDoc-document - Dokument AportisDoc - Documento do AportisDoc - Document AportisDoc - документ AportisDoc - Dokument AportisDoc - Dokument AportisDoc - AportisDoc-dokument - AportisDoc belgesi - документ AportisDoc - Tài liệu AportisDoc - AportisDoc 文档 - AportisDoc 文件 - - - - - - - - - - - Applix Spreadsheets spreadsheet - جداول بيانات Applix - Raźlikovy arkuš Applix Spreadsheets - Таблица — Applix Spreadsheets - full de càlcul d'Applix Spreadsheets - Sešit Applix Spreadsheets - Applix Spreadsheets-regneark - Applix-Spreadsheets-Tabelle - λογιστικό φύλλο Applix Spreadsheets - Applix Spreadsheets spreadsheet - sterntabelo de Applix Spreadsheets - hoja de cálculo de Applix Spreadsheets - Applix Spreadsheets kalkulu-orria - Applix Spreadsheets -taulukko - Applix Spreadsheets rokniark - feuille de calcul Applix - scarbhileog Applix Spreadsheets - folla de cálculo de Applix - גליון נתונים של Applix Spreadsheets - Applix Spreadsheets proračunska tablica - Applix Spreadsheets-munkafüzet - Lembar sebar Applix Spreadsheets - Foglio di calcolo Applix Spreadsheets - Applix Spreadsheets スプレッドシート - Applix Spreadsheets-ის ცხრილი - Applix Spreadsheets электрондық кестесі - Applix 스프레드시트 - Applix Spreadsheets skaičialentė - Applix Spreadsheets izklājlapa - Hamparan Applix Spreadsheets - Applix Spreadsheets-regneark - Applix Spreadsheets-rekenblad - Applix Spreadsheets-dokument - Arkusz Applix Spreadsheets - folha de cálculo Applix Spreadsheets - Planilha do Applix Spreadsheets - Foaie de calcul Applix - электронная таблица Applix Spreadsheets - Zošit Applix Spreadsheets - Razpredelnica Applix Spreadsheets - Fletë llogaritjesh Applix Spreadsheets - Applix табеларни документ - Applix Spreadsheets-kalkylblad - ел. таблиця Applix Spreadsheets - Bảng tính Applix Spreadsheets - Applix Spreadsheets 工作簿 - Applix Spreadsheets 試算表 - - - - - - - - - - - Applix Words document - مستند كلمات Applix - Applix Words sənədi - Dakument Applix Words - Документ — Applix Words - document d'Applix Words - Dokument Applix Words - Dogfen Applix Words - Applix Words-dokument - Applix-Words-Dokument - έγγραφο Applix Words - Applix Words document - dokumento de Applix Words - documento de Applix Words - Applix Words dokumentua - Applix Words -asiakirja - Applix Words skjal - document Applix Words - cáipéis Applix Words - documento de Applix Words - מסמך של Applix Words - Applix Words dokument - Applix Words-dokumentum - Dokumen Applix Words - Documento Applix Words - Applix Words ドキュメント - Applix Words-ის დოკუმენტი - Applix Words құжаты - Applix Words 문서 - Applix Words dokumentas - Applix Words dokuments - Dokumen Perkataan Applix - Applix Words-dokument - Applix Words-document - Applix Words dokument - Dokument Applix Words - documento Applix Words - Documento do Applix Words - Document Applix Words - документ Applix Words - Dokument Applix Words - Dokument Applix Words - Dokument Applix Words - Applix Words документ - Applix Words-dokument - документ Applix Words - Tài liệu Applix Words - Applix Words 文档 - Applix Words 文件 - - - - - - - - - - ARC archive - أرشيف ARC - Archiŭ ARC - Архив — ARC - arxiu ARC - Archiv ARC - ARC-arkiv - ARC-Archiv - αρχείο ARC - ARC archive - ARC-arkivo - archivador ARC - ARC artxiboa - ARC-arkisto - ARC skjalasavn - archive ARC - cartlann ARC - arquivo ARC - ארכיון ARC - ARC arhiva - ARC-archívum - Arsip ARC - Archivio ARC - ARC アーカイブ - ARC არქივი - ARC архиві - ARC 압축 파일 - ARC archyvas - ARC arhīvs - ARC-arkiv - ARC-archief - ARC-arkiv - Archiwum ARC - Pacote ARC - Arhivă ARC - архив ARC - Archív ARC - Datoteka arhiva ARC - Arkiv ARC - ARC-arkiv - ARC arşivi - архів ARC - Kho nén ARC - ARC 归档文件 - ARC 封存檔 - - - - - - - - - - - - AR archive - أرشيف AR - Archiŭ AR - Архив — AR - arxiu AR - Archiv AR - AR-arkiv - AR-Archiv - σρχείο AR - AR archive - AR-arkivo - archivador AR - AR artxiboa - AR-arkisto - AR skjalasavn - archive AR - cartlann AR - arquivo AR - ארכיון AR - AR arhiva - AR-archívum - Arsip AR - Archivio AR - AR アーカイブ - AR არქივი - AR архиві - AR 묶음 파일 - AR archyvas - AR arhīvs - Arkib AR - AR-arkiv - AR-archief - AR-arkiv - Archiwum AR - arquivo AR - Pacote AR - Arhivă AR - архив AR - Archív AR - Datoteka arhiva AR - Arkiv AR - АР архива - AR-arkiv - AR arşivi - архів AR - Kho nén AR - AR 归档文件 - AR 封存檔 - - - - - - - - - - ARJ archive - أرشيف ARJ - ARJ arxivi - Archiŭ ARJ - Архив — ARJ - arxiu ARJ - Archiv ARJ - Archif ARJ - ARJ-arkiv - ARJ-Archiv - αρχείο ARJ - ARJ archive - ARJ-arkivo - archivador ARJ - ARJ artxiboa - ARJ-arkisto - ARJ skjalasavn - archive ARJ - cartlann ARJ - arquivo ARJ - ארכיון ARJ - ARJ arhiva - ARJ-archívum - Arsip ARJ - Archivio ARJ - ARJ アーカイブ - ARJ არქივი - ARJ архиві - ARJ 압축 파일 - ARJ archyvas - ARJ arhīvs - Arkib ARJ - ARJ-arkiv - ARJ-archief - ARJ-arkiv - Archiwum ARJ - arquivo ARJ - Pacote ARJ - Arhivă ARJ - архив ARJ - Archív ARJ - Datoteka arhiva ARJ - Arkiv ARJ - ARJ архива - ARJ-arkiv - ARJ arşivi - архів ARJ - Kho nén ARJ - ARJ 归档文件 - ARJ 封存檔 - ARJ - Archived by Robert Jung - - - - - - - - ASP page - صفحة ASP - Staronka ASP - Страница — ASP - pàgina ASP - Stránka ASP - ASP-side - ASP-Seite - σελίδα ASP - ASP page - ASP-paĝo - página ASP - ASP orria - ASP-sivu - ASP síða - page ASP - leathanach ASP - páxina ASP - עמוד ASP - ASP stranica - ASP oldal - Halaman ASP - Pagina ASP - ASP ページ - ASP გვერდი - ASP парағы - ASP 페이지 - ASP puslapis - ASP lapa - ASP-side - ASP-pagina - ASP-side - Strona ASP - Página ASP - Pagină ASP - страница ASP - Stránka ASP - Datoteka spletne strani ASP - Faqe ASP - ASP-sida - сторінка ASP - Trang ASP - ASP 页面 - ASP 頁面 - ASP - Active Server Page - - - - - - AWK script - سكربت AWK - AWK skripti - Skrypt AWK - Скрипт — AWK - script AWK - Skript AWK - Sgript AWK - AWK-program - AWK-Skript - πρόγραμμα εντολών AWK - AWK script - AWK-skripto - script en AWK - AWK script-a - AWK-komentotiedosto - AWK boðrøð - script AWK - script AWK - script de AWK - תסריט AWK - AWK skripta - AWK-parancsfájl - Skrip AWK - Script AWK - AWK スクリプト - AWK სცენარი - AWK сценарийі - AWK 스크립트 - AWK scenarijus - AWK skripts - Skrip AWK - AWK-skript - AWK-script - WAK-skript - Skrypt AWK - 'script' AWK - Script AWK - Script AWK - сценарий AWK - Skript AWK - Skriptna datoteka AWK - Script AWK - AWK скрипта - AWK-skript - AWK betiği - скрипт AWK - Văn lệnh AWK - AWK 脚本 - AWK 指令稿 - - - - - - - - - - - - - - - - - - - BCPIO document - مستند BCPIO - BCPIO sənədi - Dakument BCPIO - Документ — BCPIO - document BCPIO - Dokument BCPIO - Dogfen BCPIO - BCPIO-dokument - BCPIO-Dokument - έγγραφο BCPIO - BCPIO document - BCPIO-dokumento - documento BCPIO - BCPIO dokumentua - BCPIO-asiakirja - BCPIO skjal - document BCPIO - cáipéis BCPIO - documento BCPIO - מסמך של BCPO - BCPIO dokument - BCPIO-dokumentum - Dokumen BCPIO - Documento BCPIO - BCPIO ドキュメント - BCPIO-ის დოკუმენტი - BCPIO құжаты - BCPIO 문서 - BCPIO dokumentas - BCPIO dokuments - Dokumen BCPIO - BCPIO-dokument - BCPIO-document - BCPIO-dokument - Dokument BCPIO - documento BCPIO - Documento BCPIO - Document BCPIO - документ BCPIO - Dokument BCPIO - Dokument BCPIO - Dokument BCPIO - BCPIO документ - BCPIO-dokument - BCPIO belgesi - документ BCPIO - Tài liệu BCPIO - BCPIO 文档 - BCPIO 文件 - BCPIO - Binary CPIO - - - - - BitTorrent seed file - ملف باذر البت تورنت - BitTorrent seed faylı - Fajł krynicy BitTorrent - Файл-източник — BitTorrent - fitxer llavor de BitTorrent - Soubor BitTorrent - Ffeil hadu BitTorrent - BitTorrent-frøfil - BitTorrent-Seed-Datei - αρχείο BitTorrent seed - BitTorrent seed file - BitTorrent-semdosiero - archivo semilla de BitTorrent - BitTorrent hazi-fitxategia - BitTorrent-siementiedosto - BitTorrent seed fíla - fichier graine BitTorrent - comhad síl BitTorrent - ficheiro de orixe BitTorrent - קובץ זריעה של BitTorrent - BitTorrent-magfájl - Berkas benih BitTorrent - File seed BitTorrent - BitTorrent シードファイル - BitTorrent көз файлы - 비트토렌트 시드 파일 - BitTorrent šaltinio failas - BitTorrent avota datne - Fail seed BitTorrent - Fil med utgangsverdi for BitTorrent - BitTorrent-bestand - Nedlastingsfil for BitTorrent - Plik ziarna BitTorrent - ficheiro de origem BitTorrent - Arquivo semente BitTorrent - Fișier sursă-completă BitTorrent - файл источника BitTorrent - Súbor BitTorrent - Datoteka sejanja BitTorrent - File bazë BitTorrent - Датотека са БитТорентовим полазиштима - BitTorrent-distributionsfil - файл поширення BitTorrent - Tải tập hạt BitTorrent - BitTorrent 种子文件 - BitTorrent 種子檔 - - - - - - - Blender scene - مشهد بلندر - Scena Blender - Сцена — Blender - escena Blender - Scéna Blender - Blenderscene - Blender-Szene - σκηνή Blender - Blender scene - Blender-sceno - escena de Blender - Blender-eko fitxategia - Blender-näkymä - Blender leikmynd - scène Blender - radharc Blender - escena de Blender - סצנת Blender - Blender scena - Blender-jelenet - Scene Blender - Scena Blender - Blender シーン - Blender-ის სცენა - Blender сахнасы - Blender 장면 - Blender scena - Blender aina - Babak Blender - Blender-scene - Blender-scène - Blender-scene - Scena programu Blender - cenário Blender - Cena do Blender - Scenă Blender - сцена Blender - Scéna Blender - Datoteka scene Blender - Skenë Blender - Блендер сцена - Blender-scen - сцена Blender - Cảnh Blender - Blender 场景 - Blender 場景 - - - - - - - - - - TeX DVI document (bzip-compressed) - مستند TeX DVI (مضغوط-bzip) - Dakument TeX DVI (bzip-skampresavany) - Документ — TeX DVI, компресиран с bzip - document TeX DVI (comprimit amb bzip) - Dokument TeX DVI (komprimovaný pomocí bzip) - TeX DVI-dokument (bzip-komprimeret) - TeX-DVI-Dokument (bzip-komprimiert) - αρχείο TeX DVI (συμπιεσμένο με bzip) - TeX DVI document (bzip-compressed) - documento DVI de TeX (comprimido con bzip) - TeX DVI dokumentua (bzip-ekin konprimitua) - TeX DVI -asiakirja (bzip-pakattu) - TeX DVI skjal (bzip-stappað) - document DVI TeX (compressé bzip) - cáipéis DVI TeX (comhbhrúite le bzip) - documento DVI de TeX (comprimido con bzip) - מסמך מסוג TeX DVI (מכווץ ע"י bzip) - TeX DVI dokument (komprimiran bzip-om) - TeX DVI dokumentum (bzip-pel tömörítve) - Dokumen TeX DVI (terkompresi bzip) - Documento TeX DVI (compresso con bzip) - Tex DVI ドキュメント (bzip 圧縮) - TeX DVI құжаты (bzip-пен сығылған) - TeX DVI 문서 (BZIP 압축) - TeX DVI dokumentas (suglaudintas su bzip) - TeX DVI dokuments (saspiests ar bzip) - TeX DVI-dokument (bzip-komprimert) - TeX DVI-document (ingepakt met bzip) - TeX DVI-dokument (pakka med bzip) - Dokument TeX DVI (kompresja bzip) - Documento DVI TeX (compactado com bzip) - Document TeX DVI (comprimat bzip) - документ TeX DVI (сжатый bzip) - Dokument TeX DVI (komprimovaný pomocou bzip) - Dokument TeX DVI (stisnjen z bzip) - Dokument Tex DVI (i kompresuar me bzip) - TeX DVI-dokument (bzip-komprimerat) - документ TeX DVI (стиснений bzip) - Tài liệu DVI TeX (đã nén bzip) - TeX DVI 文档(gzip 压缩) - TeX DVI 文件 (bzip 格式壓縮) - - - - - - Bzip archive - أرشيف Bzip - Archiŭ bzip - Архив — bzip - arxiu bzip - Archiv bzip - Bzip-arkiv - Bzip-Archiv - συμπιεσμένο αρχείο Bzip - Bzip archive - Bzip-arkivo - archivador Bzip - Bzip artxiboa - Bzip-arkisto - Bzip skjalasavn - archive bzip - cartlann Bzip - arquivo Bzip - ארכיון Bzip - Bzip arhiva - Bzip archívum - Arsip Bzip - Archivio bzip - Bzip アーカイブ - Bzip არქივი - Bzip архиві - BZIP 압축 파일 - Bzip archyvas - Bzip arhīvs - Bzip-arkiv - Bzip-archief - Bzip-arkiv - Archiwum bzip - Pacote Bzip - Arhivă Bzip - архив BZIP - Archív bzip - Datoteka arhiva Bzip - Arkiv bzip - Bzip-arkiv - Bzip arşivi - архів bzip - Kho nén bzip - bzip 归档文件 - Bzip 封存檔 - - - - - - - - - - Tar archive (bzip-compressed) - أرشيف Tar (مضغوط-bzip) - Archiŭ tar (bzip-skampresavany) - Архив — tar, компресиран с bzip - arxiu tar (comprimit amb bzip) - Archiv tar (komprimovaný pomocí bzip) - Tar-arkiv (bzip-komprimeret) - Tar-Archiv (bzip-komprimiert) - αρχείο Tar (συμπιεσμένο με bzip) - Tar archive (bzip-compressed) - archivador Tar (comprimido con bzip) - Tar artxiboa (bzip-ekin konprimitua) - Tar-arkisto (bzip-pakattu) - Tar skjalasavn (bzip-stappað) - archive tar (compressée bzip) - cartlann Tar (comhbhrúite le bzip) - arquivo Tar (comprimido con bzip) - ארכיון Tar (מכווץ ע"י bzip) - Tar arhiva (komprimirana bzip-om) - Tar archívum (bzip-pel tömörítve) - Arsip Tar (terkompresi bzip) - Archivio tar (compresso con bzip) - Tar アーカイブ (bzip 圧縮) - Tar архиві (bzip-пен сығылған) - TAR 묶음 파일 (BZIP 압축) - Tar archyvas (suglaudintas su bzip) - Tar arhīvs (saspiests ar bzip) - Tar-arkiv (bzip-komprimert) - Tar-archief (ingepakt met bzip) - Tar-arkiv (pakka med bzip) - Archiwum tar (kompresja bzip) - Pacote tar (compactado com bzip) - Arhivă Tar (comprimată bzip) - архив TAR (сжатый BZIP) - Archív tar (komprimovaný pomocou bzip) - Datoteka arhiva Tar (stisnjen z bzip) - Arkiv tar (i kompresuar me bzip) - Tar-arkiv (bzip-komprimerat) - архів tar (стиснений bzip) - Kho nén tar (đã nén bzip) - Tar 归档文件(bzip 压缩) - Tar 封存檔 (bzip 格式壓縮) - - - - - - - - - - PDF document (bzip-compressed) - مستند PDF (مضغوط-bzip) - Dakument PDF (bzip-skampresavany) - Документ — PDF, компресиран с bzip - document PDF (comprimit amb bzip) - Dokument PDF (komprimovaný pomocí bzip) - PDF-dokument (bzip-komprimeret) - PDF-Dokument (bzip-komprimiert) - έγγραφο PDF (συμπιεσμένο με bzip) - PDF document (bzip-compressed) - documento PDF (comprimido con bzip) - PostScript dokumentua (bzip-ekin konprimitua) - PDF-asiakirja (bzip-pakattu) - PDF skjal (bzip-stappað) - document PDF (compressé bzip) - cáipéis PDF (comhbhrúite le bzip) - documento PDF (comprimido en bzip) - מסמך PDF (מכווץ ע"י bzip) - PDF dokumentum (bzip-tömörítésű) - Dokumen PDF (terkompresi bzip) - Documento PDF (compresso con bzip) - PDF ドキュメント (bzip 圧縮) - PDF құжаты (bzip-пен сығылған) - PDF 문서 (BZIP 압축) - PDF dokumentas (suglaudintas su bzip) - PDF dokuments (saspiests ar bzip) - PDF-dokument (bzip-komprimert) - PDF-document (ingepakt met bzip) - PDF-dokument (pakka med bzip) - Dokument PDF (kompresja bzip) - Documento PDF (compactado com bzip) - Document PDF (comprimat bzip) - документ PDF (сжатый bzip) - Dokument PDF (komprimovaný pomocou bzip) - Dokument PDF (stisnjen z bzip) - Dokument PDF (i kompresuar me bzip) - PDF-dokument (bzip-komprimerat) - PDF belgesi (bzip ile sıkıştırılmış) - документ PDF (стиснений bzip) - Tài liệu PDF (đã nén bzip) - PDF 文档(bzip 压缩) - PDF 文件 (bzip 格式壓縮) - - - - - - PostScript document (bzip-compressed) - مستند PostScript (مضغوط-bzip) - Dakument PostScript (bzip-skampresavany) - Документ — PostScript, компресиран с bzip - document PostScript (comprimit amb bzip) - Dokument PostScript (komprimovaný pomocí bzip) - PostScript-dokument (bzip-komprimeret) - PostScript-Dokument (bzip-komprimiert) - έγγραφο PostScript (συμπιεσμένο με bzip) - PostScript document (bzip-compressed) - documento PostScript (comprimido con bzip) - PostScript dokumentua (bzip-ekin konprimitua) - PostScript-asiakirja (bzip-pakattu) - PostScript skjal (bzip-stappað) - document PostScript (compressé bzip) - cáipéis PostScript (comhbhrúite le bzip) - documento PostScript (comprimido con bzip) - מסמך PostDcript (מכווץ ע"י bzip) - PostScript dokumentum (bzip-tömörítésű) - Dokumen PostScript (terkompresi bzip) - Documento PostScript (compresso con bzip) - PostScript ドキュメント (bzip 圧縮) - PostScript құжаты (bzip-пен сығылған) - 포스트스크립트 문서 (BZIP 압축) - PostScript dokumentas (suglaudintas su bzip) - PostScript dokuments (saspiests ar bzip) - PostScript-dokument (bzip-komprimert) - PostScript-document (ingepakt met bzip) - PostScript-dokument (pakka med bzip) - Dokument Postscript (kompresja bzip) - Documento PostScript (compactado com bzip) - Document PostScript (comprimat bzip) - документ PostScript (сжатый bzip) - Dokument PostScript (komprimovaný pomocou bzip) - Dokument PostScript (stisnjen z bzip) - Dokument PostScript (i kompresuar me bzip) - Postscript-dokument (bzip-komprimerat) - документ PostScript (стиснене bzip) - Tài liệu PostScript (đã nén bzip) - PostScript 文档(bzip 压缩) - PostScript 文件 (bzip 格式壓縮) - - - - - - comic book archive - أرشيف comic book - archiŭ komiksaŭ - Архив — комикси - arxiu comic book - Archiv knihy komiksů - comic book-arkiv - Comic-Book-Archiv - συμπιεσμένο αρχείο κόμικ - comic book archive - archivador de libro de cómic - komiki artxiboa - sarjakuva-arkisto - teknisøgubóka skjalasavn - archive Comic Book - cartlann chartúin - ficheiro de libro de banda deseñada - ארכיון ספר קומי - képregényarchívum - arsip buku komik - Archivio comic book - コミックブックアーカイブ - комикстар архиві - 만화책 압축 파일 - komiksų knygos archyvas - komiksu grāmatas arhīvs - Tegneseriearkiv - stripboek-archief - teikneseriearkiv - Archiwum komiksu - Pacote de livro de revista em quadrinhos - arhivă benzi desenate - архив комиксов - Archív knihy komiksov - Datoteka arhiva stripov - Arkiv comic book - serietidningsarkiv - архів коміксів - Kho nén sách tranh chuyện vui - Comic Book 归档文件 - 漫畫書封存檔 - - - - - - comic book archive - أرشيف comic book - archiŭ komiksaŭ - Архив — комикси - arxiu comic book - Archiv knihy komiksů - comic book-arkiv - Comic-Book-Archiv - συμπιεσμένο αρχείο κόμικ - comic book archive - archivador de libro de cómic - komiki artxiboa - sarjakuva-arkisto - teknisøgubóka skjalasavn - archive Comic Book - cartlann chartúin - ficheiro de libro de banda deseñada - ארכיון ספר קומי - képregényarchívum - arsip buku komik - Archivio comic book - コミックブックアーカイブ - комикстар архиві - 만화책 압축 파일 - komiksų knygos archyvas - komiksu grāmatas arhīvs - Tegneseriearkiv - stripboek-archief - teikneseriearkiv - Archiwum komiksu - Pacote de livro de revista em quadrinhos - arhivă benzi desenate - архив комиксов - Archív knihy komiksov - Datoteka arhiva stripov - Arkiv comic book - serietidningsarkiv - архів коміксів - Kho nén sách tranh chuyện vui - Comic Book 归档文件 - 漫畫書封存檔 - - - - - - comic book archive - أرشيف comic book - archiŭ komiksaŭ - Архив — комикси - arxiu comic book - Archiv knihy komiksů - comic book-arkiv - Comic-Book-Archiv - συμπιεσμένο αρχείο κόμικ - comic book archive - archivador de libro de cómic - komiki artxiboa - sarjakuva-arkisto - teknisøgubóka skjalasavn - archive Comic Book - cartlann chartúin - ficheiro de libro de banda deseñada - ארכיון ספר קומי - képregényarchívum - arsip buku komik - Archivio comic book - コミックブックアーカイブ - комикстар архиві - 만화책 압축 파일 - komiksų knygos archyvas - komiksu grāmatas arhīvs - Tegneseriearkiv - stripboek-archief - teikneseriearkiv - Archiwum komiksu - Pacote de livro de revista em quadrinhos - arhivă benzi desenate - архив комиксов - Archív knihy komiksov - Datoteka arhiva stripov - Arkiv comic book - serietidningsarkiv - архів коміксів - Kho nén sách tranh chuyện vui - Comic Book 归档文件 - 漫畫書封存檔 - - - - - - comic book archive - أرشيف comic book - archiŭ komiksaŭ - Архив — комикси - arxiu comic book - Archiv knihy komiksů - comic book-arkiv - Comic-Book-Archiv - συμπιεσμένο αρχείο κόμικ - comic book archive - archivador de libro de cómic - komiki artxiboa - sarjakuva-arkisto - teknisøgubóka skjalasavn - archive Comic Book - cartlann chartúin - ficheiro de libro de banda deseñada - ארכיון ספר קומי - képregényarchívum - arsip buku komik - Archivio comic book - コミックブックアーカイブ - комикстар архиві - 만화책 압축 파일 - komiksų knygos archyvas - komiksu grāmatas arhīvs - Tegneseriearkiv - stripboek-archief - teikneseriearkiv - Archiwum komiksu - Pacote de livro de revista em quadrinhos - arhivă benzi desenate - архив комиксов - Archív knihy komiksov - Datoteka arhiva stripov - Arkiv comic book - serietidningsarkiv - архів коміксів - Kho nén sách tranh chuyện vui - Comic Book 归档文件 - 漫畫書封存檔 - - - - - - Lrzip archive - أرشيف Lrzip - Архив — lrzip - arxiu lrzip - Archiv Lrzip - Lrzip-arkiv - Lrzip-Archiv - συμπιεσμένο αρχείο Lrzip - Lrzip archive - Lrzip-arkivo - archivador Lrzip - Lrzip-arkisto - Lrzip skjalasavn - archive lrzip - cartlann Lrzip - arquivo Lrzip - ארכיון Lrzip - Lrzip arhiva - Lrzip archívum - Arsip Lrzip - Archivio Lrzip - Lrzip アーカイブ - Lrzip архиві - LRZIP 압축 파일 - Lrzip archyvas - Lrzip arhīvs - Lrzip archief - Archiwum lrzip - Pacote Lrzip - Arhivă Lrzip - архив LRZIP - Archív Lrzip - Datoteka arhiva Lrzip - Lrzip-arkiv - архів lrzip - Lrzip 归档文件 - Lrzip 封存檔 - - - - - - - - Tar archive (lrzip-compressed) - أرشيف Tar (مضغوط-lrzip) - Архив — tar, компресиран с lrzip - arxiu tar (comprimit amb lrzip) - Archiv tar (komprimovaný pomocí lrzip) - Tar-arkiv (lrzip-komprimeret) - Tar-Archiv (lrzip-komprimiert) - αρχείο Tar (συμπιεσμένο με lrzip) - Tar archive (lrzip-compressed) - archivador Tar (comprimido con lrzip) - Tar-arkisto (lrzip-pakattu) - Tar skjalasavn (lrzip-stappað) - archive tar (compressée lrzip) - cartlann Tar (comhbhrúite le lrzip) - arquivo Tar (comprimido con lrzip) - ארכיון Tar (מכווץ ע"י lrzip) - Tar arhiva (komprimirana lrzip-om) - Tar archívum (lrzip-pel tömörítve) - Arsip Tar (terkompresi lrzip) - Archivio tar (compresso con lrzip) - Tar アーカイブ (lrzip 圧縮) - Tar архиві (lrzip-пен сығылған) - TAR 묶음 파일 (LRZIP 압축) - Tar archyvas (suglaudintas su lrzip) - Tar arhīvs (saspiests ar lrzip) - Tar archief (lrzip-compressed) - Archiwum tar (kompresja lrzip) - Pacote tar (compactado com lrzip) - Arhivă Tar (comprimată lrzip) - архив TAR (сжатый LRZIP) - Archív tar (komprimovaný pomocou lrzip) - Datoteka arhiva Tar (stisnjen z lrzip) - Tar-arkiv (lrzip-komprimerat) - архів tar (стиснений lrzip) - Tar 归档文件 (lrzip 压缩) - Tar 封存檔 (lrzip 格式壓縮) - - - - - - - Apple disk image - Диск — Apple - imatge de disc d'Apple - Obraz disku Apple - Apple-diskaftryk - Apple-Datenträgerabbild - εικόνα δίσκου Apple - Apple disk image - imagen de disco de Apple - Apple-levytiedosto - image disque Apple - imaxe de disco de Appl - תמונת כונן Apple - Apple snimka diska - Apple lemezkép - Image disk Apple - Immagine disco Apple - Apple ディスクイメージ - Apple-ის სადისკო გამოსახულება - Apple диск бейнесі - 애플 디스크 이미지 - Apple diska attēls - Apple disk image - Obraz dysku Apple - Imagem de disco Apple - образ диска Apple Mac OS X - Obraz disku Apple - Odtis diska Apple - Apple-skivavbild - Apple disk görüntüsü - образ диска Apple - Apple 磁盘镜像 - Apple 磁碟映像 - - - - Raw disk image - - - - - Raw disk image (XZ-compressed) - - - - - - raw CD image - صورة CD خامة - suvoraja vyjava CD - Изображение — raw CD - imatge de CD en cru - Surový obraz CD - rå cd-aftryk - CD-Roh-Abbild - εικόνα περιεχομένου ψηφιακού δίσκου - raw CD image - kruda lumdiskbildo - imagen de CD en bruto - CD gordinaren irudia - raaka CD-vedos - rá CD mynd - image CD brute - amhíomhá dhlúthdhiosca - imaxe de CD en bruto - תמונת דיסק גולמית - nyers CD-lemezkép - citra CD mentah - Immagine raw CD - 生 CD イメージ - өңделмеген CD бейнесі - CD 이미지 - raw CD atvaizdis - CD jēlattēls - Imej CD mentah - rått CD-bilde - ruw CD-beeldbestand - rått CD-bilete - Surowy obraz CD - imagem em bruto de CD - Imagem bruta de CD - imagine de CD brută - образ компакт-диска - Surový obraz CD - surovi CD odtis - Imazh raw CD - сирови отисак ЦД-а - rå cd-avbild - образ raw CD - ảnh đĩa CD thô - 原始 CD 映像 - 原生 CD 映像 - - - - - - - CD Table Of Contents - جدول محتويات الـ CD - Źmieściva CD - Съдържание на CD - taula de continguts de CD - Obsah CD - Cd-indholdsfotegnelse - CD-Inhaltsverzeichnis - Πίνακας Περιεχομένων CD - CD Table Of Contents - Índice de contenidos de CD - CDaren edukien aurkibidea - CD-sisällysluettelo - CD innihaldsyvurlit - table des matières de CD - clár ábhar dlúthdhiosca - táboa de contidos de CD - תוכן עניינים של דיסק - CD sadržaj - CD tartalomjegyzék - Tabel Isi CD - Indice CD - CD Table Of Contents - CD құрама кестесі - CD 내용 목록 - CD turinys - CD satura rādītājs - Innholdsfortegnelse for CD - CD-inhoudsopgave - CD innhaldsliste - Plik zawartości płyty CD - Sumário de CD - Tabel conținut CD - таблица содержания CD - Obsah CD - Kazalo vsebine CD nosilca - Tregues CD - Cd-innehållsförteckning - зміст CD - Mục Lục của đĩa CD - CD 索引 - CD 內容目錄 - - - - - - - - - - - - - - - PGN chess game notation - تدوينة لعبة الشطرنج PGN - Zaciem ab šachmatnaj partyi PGN - Игра шах — PGN - notació de joc d'escacs PGN - Šachová notace PGN - PGN-skakspilsnotation - PGN-Schachspielnotation - σημειογραφία παιχνιδιού σκακιού PGN - PGN chess game notation - notación para juegos de ajedrez PGN - PGN xake jokoaren notazioa - PGN-šakkipelinotaatio - PGN talv teknskipan - notation de jeu d'échecs PGN - nodaireacht chluiche ficheall PGN - Notación de xogo de xadrez PGN - סימון משחק שח PGN - PGN sakkfeljegyzés - Notasi permainan catur PGN - Notazione partita a scacchi PGN - PGN チェスゲーム記録 - PGN шахмат ойыны - PGN 체스게임 기보 - PGN šachmatų žaidimo žymėjimas - PGN šaha spēles notācija - PGN sjakkspillnotasjon - PGN-schaakspelnotatie - PGN-sjakkspelnotasjon - Plik PGN notacji gry w szachy - Notação de jogo de xadrez PGN - Notație joc șah PGN - шахматная партия PGN - Šachová notácia PGN - Datoteka opomb šahovske igre PGN - Njoftim loje shahu PGN - PGN-schackpartinotation - запис гри у шахи PGN - Cách ghi lượt chơi cờ PGN - PGN 象棋游戏注记 - PGN 國際象棋棋譜 - - - - - - - - - CHM document - مستند CHM - Dakument CHM - Документ — CHM - document CHM - Dokument CHM - CHM-dokument - CHM-Dokument - έγγραφο CHM - CHM document - CHM-dokumento - documento CHM - CHM dokumentua - CHM-asiakirja - CHM skjal - document CHM - cáipéis CHM - documento CHM - מסמך CHM - CHM dokument - CHM dokumentum - Dokumen CHM - Documento CHM - CHM ドキュメント - CHM დოკუმენტი - CHM құжаты - CHM 문서 - CHM dokumentas - CHM dokuments - CHM-dokument - CHM-document - CHM-dokument - Dokument CHM - Documento CHM - Document CHM - документ CHM - Dokument CHM - Dokument CHM - Dokument CHM - CHM-dokument - документ CHM - Tài liệu CHM - CHM 文档 - CHM 文件 - CHM - Compiled Help Modules - - - - - - Java byte code - رمز بايت الـJava - Java bayt kodu - Bajtavy kod Java - Байт код за Java - codi byte de Java - Bajtový kód Java - Côd beit Java - Javabytekode - Java-Bytecode - συμβολοκώδικας Java - Java byte code - Java-bajtkodo - bytecode Java - Java byte-kodea - Java-tavukoodi - Java býtkota - code Java binaire - beartchód Java - byte code de Java - קוד Java byte - Java-bájtkód - Kode bita Java - Bytecode Java - Java バイトコード - Java байт коды - 자바 바이트코드 - Java baitinis kodas - Java bitu kods - Kod bait Java - Java-bytekode - Java-bytecode - Jave byte-kode - Kod bajtowy Java - 'byte-code' Java - Código compilado Java - Bytecode Java - байт-код Java - Bajtový kód Java - Datoteka bitne kode Java - Byte code Java - Јава бајтни ко̂д - Java-bytekod - Байт-код Java - Mã byte Java - Java 字节码 - Java 位元組碼 - - - UNIX-compressed file - ملف يونكس-مضغوط - Skampresavany UNIX-fajł - Файл — компресиран за UNIX - fitxer comprimit UNIX - Soubor komprimovaný v Unixu - UNIX-komprimeret fil - UNIX-komprimierte Datei - αρχείο συμπιεσμένο με compress - UNIX-compressed file - UNIX-kunpremita dosiero - archivo comprimido de Unix - UNIX-en konprimitutako fitxategia - UNIX-pakattu tiedosto - UNIX-stappað fíla - fichier compressé UNIX - comhad UNIX-comhbhrúite - ficheiro comprimido de UNIX - קובץ מכווץ של UNIX - UNIX-komprimirana datoteka - Tömörített UNIX-fájl - Berkas terkompresi UNIX - File compresso-UNIX - UNIX-compress ファイル - файл (UNIX-сығылған) - UNIX 압축 파일 - UNIX suglaudintas failas - UNIX saspiesta datne - Fail termampat-UNIX - UNIX-komprimert fil - UNIX-ingepakt bestand - UNIX-komprimert fil - Skompresowany plik systemu UNIX - ficheiro comprimido UNIX - Arquivo compactado do UNIX - Fișier comprimat UNIX - файл (UNIX-сжатый) - Súbor komprimovaný v Unixe - Skrčena Unix datoteka - File i kompresuar UNIX - UNIX-компресована датотека - UNIX-komprimerad fil - UNIX-sıkıştırılmış dosyası - стиснений файл UNIX - Tập tin đã nén UNIX - UNIX 压缩文件 - UNIX 格式壓縮檔 - - - - - - - - Tar archive (gzip-compressed) - أرشيف Tar (مضغوط-gzip) - Archiŭ tar (gzip-skampresavany) - Архив — tar, компресиран с gzip - arxiu tar (comprimit amb gzip) - Archiv tar (komprimovaný pomocí gzip) - Tar-arkiv (gzip-komprimeret) - Tar-Archiv (gzip-komprimiert) - αρχείο Tar (συμπιεσμένο με gzip) - Tar archive (gzip-compressed) - archivador Tar (comprimido con gzip) - Tar artxiboa (gzip-ekin konprimitua) - Tar-arkisto (gzip-pakattu) - Tar skjalasavn (gzip-stappað) - archive tar (compressée gzip) - cartlann Tar (comhbhrúite le gzip) - arquivo Tar (comprimido con gzip) - ארכיון Tar (מכווץ ע"י gzip) - Tar arhiva (komprimirana gzip-om) - Tar archívum (gzip-pel tömörítve) - Arsip Tar (terkompresi gzip) - Archivio tar (compresso con gzip) - Tar アーカイブ (gzip 圧縮) - Tar архиві (gzip-пен сығылған) - TAR 묶음 파일 (GZIP 압축) - Tar archyvas (suglaudintas su gzip) - Tar arhīvs (saspiests ar gzip) - Tar-arkiv (gzip-komprimert) - Tar-archief (ingepakt met gzip) - Tar-arkiv (pakka med gzip) - Archiwum tar (kompresja gzip) - Pacote tar (compactado com gzip) - Arhivă Tar (comprimată gzip) - архив TAR (сжатый GZIP) - Archív tar (komprimovaný pomocou gzip) - Datoteka arhiva Tar (stisnjen z gzip) - Arkiv tar (i kompresuar me gzip) - Tar-arkiv (gzip-komprimerat) - архів tar (стиснений gzip) - Kho nén tar (đã nén gzip) - Tar 归档文件(gzip 压缩) - Tar 封存檔 (gzip 格式壓縮) - - - - - - - program crash data - معلومات انهيار البرنامج - źviestki złamanaj prahramy - Данни от забиване на програма - dades de fallada de programa - Data o pádu programu - programnedbrudsdata - Daten zu Programmabsturz - δεδομένα από την κατάρρευση προγράμματος - program crash data - datumo pri kraŝo de programo - datos de cuelgue de programa - programaren kraskaduraren datuak - ohjelman kaatumistiedot - forrits sordáta - données de plantage de programme - sonraí thuairt ríomhchláir - datos de colgue do programa - מידע מקריסת תוכנה - podaci o rušenju programa - összeomlott program adatai - data program macet - Dati crash di applicazione - プログラムクラッシュデータ - апатты аяқтаудың мәліметтері - 프로그램 비정상 종료 데이터 - programos nulūžimo duomenys - programmas avārijas dati - Data program musnah - krasjdata fra program - programma-crashgegevens - data om programkrasj - Dane awarii programu - dados de estoiro de aplicação - Dados de travamento de programa - date eroare program - данные аварийного завершения - Údaje o páde programu - podatki sesutja programa - Të dhëna nga programi i bllokuar - подаци о кркљавини програма - programkraschdata - аварійні дані про програму - dữ liệu sụp đổ chương trình - 程序崩溃数据 - 程式當掉資料 - - - - - - - - - - - - - - - - - - - CPIO archive - أرشيف CPIO - CPIO arxivi - Archiŭ CPIO - Архив — CPIO - arxiu CPIO - Archiv CPIO - Archif CPIO - CPIO-arkiv - CPIO-Archiv - αρχείο CPIO - CPIO archive - CPIO-arkivo - archivador CPIO - CPIO artxiboa - CPIO-arkisto - CPIO skjalasavn - archive CPIO - cartlann CPIO - arquivo CPIO - ארכיון CPIO - CPIO arhiva - CPIO-archívum - Arsip CPIO - Archivio CPIO - CPIO アーカイブ - CPIO არქივი - CPIO архиві - CPIO 묶음 파일 - CPIO archyvas - CPIO arhīvs - Arkib CPIO - CPIO-arkiv - CPIO-archief - CPIO-arkiv - Archiwum CPIO - arquivo CPIO - Pacote CPIO - Arhivă CPIO - архив CPIO - Archív CPIO - Datoteka arhiva CPIO - Arkiv CPIO - CPIO архива - CPIO-arkiv - архів CPIO - Kho nén CPIO - CPIO 归档文件 - CPIO 封存檔 - - - - - - - - - - - CPIO archive (gzip-compressed) - أرشيف CPIO (مضغوط-gzip) - CPIO arxivi (gzip ilə sıxışdırılmış) - Archiŭ CPIO (gzip-skampresavany) - Архив — CPIO, компресиран с gzip - arxiu CPIO (comprimit amb gzip) - Archiv CPIO (komprimovaný pomocí gzip) - Archif CPIO (gywasgwyd drwy gzip) - CPIO-arkiv (gzip-komprimeret) - CPIO-Archiv (gzip-komprimiert) - αρχείο CPIO (συμπιεσμένο με gzip) - CPIO archive (gzip-compressed) - CPIO-arkivo (kunpremita per gzip) - archivador CPIO (comprimido con gzip) - CPIO artxiboa (gzip-ekin konprimitua) - CPIO-arkisto (gzip-pakattu) - CPIO skjalasavn (gzip-stappað) - archive CPIO (compressé gzip) - cartlann CPIO (comhbhrúite le gzip) - arquivo CPIO (comprimido con gzip) - ארכיון CPIO (מכווץ ע"י gzip) - CPIO arhiva (komprimirana gzip-om) - CPIO-archívum (gzip-pel tömörítve) - Arsip CPIO (terkompresi gzip) - Archivio CPIO (compresso con gzip) - CPIO (gzip 圧縮) アーカイブ - CPIO არქივი (gzip-ით შეკუმშული) - CPIO архиві (gzip-пен сығылған) - CPIO 묶음 파일 (GZIP 압축) - CPIO archyvas (suglaudintas su gzip) - CPIO arhīvs (saspiests ar gzip) - Arkib CPIO (dimampatkan-gzip) - CPIO-arkiv (gzip-komprimert) - CPIO-archief (ingepakt met gzip) - CPIO-arkiv (gzip-pakka) - Archiwum CPIO (kompresja gzip) - arquivo CPIO (comprimido com gzip) - Pacote CPIO (compactado com gzip) - Arhivă CPIO (compresie gzip) - архив CPIO (сжатый GZIP) - Archív CPIO (komprimovaný pomocou gzip) - Datoteka arhiva CPIO (skrčena z gzip) - Arkiv CPIO (kompresuar me gzip) - CPIO архива (компресована gzip-ом) - CPIO-arkiv (gzip-komprimerat) - архів CPIO (стиснений gzip) - Kho nén CPIO (đã nén gzip) - CPIO 归档文件(gzip 压缩) - CPIO 封存檔 (gzip 格式壓縮) - - - - - - C shell script - سكربت شِل سي - C qabıq skripti - Skrypt abałonki C - Скрипт — обвивка C - script en C - Skript shellu C - Sgript plisgyn C - C-skalprogram - C-Shell-Skript - πρόγραμμα εντολών φλοιού C - C shell script - skripto de C-ŝelo - script en C shell - C shell script-a - Csh-komentotiedosto - C skel boðrøð - script C shell - script bhlaosc C - script de C shell - תסריט מעטפת C - C skripta - C héj-parancsfájl - Skrip shell C - Script C shell - C シェルスクリプト - C shell сценарийі - C 셸 스크립트 - C shell scenarijus - C čaulas skripts - Skrip shell C - C-skallskript - C-shellscript - C-skalskript - Skrypt powłoki C - 'script' de consola C - Script de shell C - Script C shell - сценарий C shell - Skript shellu C - Skriptna datoteka lupine C - Script shell C - C скрипта окружења - Skalskript (csh) - C kabuk betiği - скрипт оболонки C - Văn lệnh trình bao C - C shell 脚本 - C shell 指令稿 - - - - - - - - - - - - - Xbase document - مستند Xbase - Dakument Xbase - Документ — Xbase - document Xbase - Dokument Xbase - Xbasedokument - Xbase-Dokument - έγγραφο Xbase - Xbase document - Xbase-dokumento - documento Xbase - Xbase dokumentua - Xbase-asiakirja - Xbase skjal - document Xbase - cáipéis Xbase - documento Xbase - מסמך Xbase - Xbase dokumentum - Dokumen Xbase - Documento Xbase - Xbase ドキュメント - Xbase құжаты - Xbase 문서 - Xbase dokumentas - Xbase dokuments - Xbase-dokument - Xbase-document - Xbase-dokument - Dokument Xbase - Documento do Xbase - Document Xbase - документ Xbase - Dokument Xbase - Dokument Xbase - Dokument Xbase - Xbase-dokument - Xbase belgesi - документ Xbase - Tài liệu Xbase - Xbase 文档 - Xbase 文件 - - - - - - - - ECMAScript program - برنامج ECMAScript - Prahrama ECMAScript - Програма — ECMAScript - programa ECMAScript - Program ECMAScript - ECMA-program - ECMAScript-Programm - πρόγραμμα ECMAScript - ECMAScript program - programa en ECMAScript - ECMAScript programa - ECMAScript-ohjelma - ECMAScript forrit - programme ECMAScript - ríomhchlár ECMAScript - programa en ECMAScript - תכנית EMCAScript - ECMAScript program - ECMAScript program - Program ECMAScript - Programma ECMAScript - ECMAScript プログラム - ECMAScript პროგრამა - ECMAScript программасы - ECMA스크립트 프로그램 - ECMAScript programa - ECMAScript programma - ECMAScript-program - ECMAScript-programma - ECMAScript-program - Pogram ECMAScript - Programa ECMAScript - Program ECMAScript - программа ECMAScript - Program ECMAScript - Programska datoteka ECMAScript - Program ECMAScript - ECMAScript-program - ECMAScript programı - програма мовою ECMAScript - Chương trình ECMAScript - ECMAScript 程序 - ECMAScript 程式 - - - - - - - Dreamcast ROM - Dreamcast ROM - Dreamcast ROM - ROM — Dreamcast - ROM de Dreamcast - ROM pro Dreamcast - Dreamcast-rom - Dreamcast-ROM - εικόνα μνήμης ROM Dreamcast - Dreamcast ROM - Dreamcast-NLM - ROM de Dreamcast - Dreamcast-en ROM - Dreamcast-ROM - Dreamcast ROM - ROM Dreamcast - ROM Dreamcast - ROM de Dreamcast - ROM של Dreamcast - Dreamcast ROM - Dreamcast ROM - Memori baca-saja Dreamcast - ROM Dreamcast - Dreamcast ROM - Dreamcast-ის ROM - Dreamcast ROM - 드림캐스트 롬 - Dreamcast ROM - Dreamcast ROM - ROM Dreamcast - Dreamcast-ROM - Dreamcast-ROM - Dreamcast-ROM - Plik ROM konsoli Dreamcast - ROM Dreamcast - ROM do Dreamcast - ROM Dreamcast - Dreamcast ROM - ROM pre Dreamcast - Bralni pomnilnik Dreamcast - ROM Dreamcast - Dreamcast ROM - Dreamcast-rom - ППП Dreamcast - ROM Dreamcast - Dreamcast ROM - Dreamcast ROM - - - - - Nintendo DS ROM - Nintendo DS ROM - Nintendo DS ROM - ROM — Nintendo DS - ROM de Nintendo DS - ROM pro Nintendo DS - Nintendo DS-rom - Nintendo-DS-ROM - εικόνα μνήημης ROM Nintendo DS - Nintendo DS ROM - ROM de Nintendo DS - Nintendo DS-ko ROMa - Nintendo DS-ROM - Nintendo DS ROM - ROM Nintendo DS - ROM Nintendo DS - ROM de Nintendo DS - ROM של Nintendo - Nintendo DS ROM - Nintendo DS ROM - Memori baca-saja Nintendo DS - ROM Nintendo DS - Nintendo DS ROM - Nintendo DS ROM - 닌텐도 DS 롬 - Nintendo DS ROM - Nintendo DS ROM - Nintendo DS-ROM - Nintendo-DS-ROM - Nintendo DS-ROM - Plik ROM konsoli Nintendo DS - ROM do Nintendo DS - ROM Nintendo DS - Nintendo DS ROM - ROM pre Nintendo DS - Bralni pomnilnik Nintendo DS - ROM Nintendo DS - Nintendo DS-rom - Nintendo DS ROM - ППП Nintendo - ROM DS Nintendo - Nintendo DS ROM - 任天堂 DS ROM - - - - - Debian package - حزمة ديبيان - Debian paketi - Pakunak Debian - Пакет — Debian - paquet Debian - Balíček Debianu - Pecyn Debian - Debianpakke - Debian-Paket - πακέτο Debian - Debian package - Debian-pakaĵo - paquete Debian - Debian paketea - Debian-paketti - Debian pakki - paquet Debian - pacáiste Debian - paquete de Debian - חבילת דביאן - Debian paket - Debian-csomag - Paket Debian - Pacchetto Debian - Debian パッケージ - Debian-ის პაკეტი - Debian дестесі - 데비안 패키지 - Debian paketas - Debian pakotne - Pakej Debian - Debian pakke - Debian-pakket - Debian pakke - Pakiet Debiana - pacote Debian - Pacote Debian - Pachet Debian - пакет Debian - Balíček Debianu - Datoteka paketa Debian - Paketë Debian - Debian пакет - Debianpaket - Debian paketi - пакунок Debian - Gói Debian - Debian 软件包 - Debian 套件 - - - - - - - - - - - Qt Designer file - ملف Qt Designer - Fajł Qt Designer - Файл — Qt Designer - fitxer de Qt Designer - Soubor Qt Designer - Qt Designer-fil - Qt-Designer-Datei - αρχείο Qt Designer - Qt Designer file - dosiero de Qt Designer - archivo de Qt Designer - Qt Designer Fitxategia - Qt Designer -tiedosto - Qt Designer fíla - fichier Qt Designer - comhad Qt Designer - ficheiro de Qt Designer - קובץ של Qt Designer - Qt Designer-fájl - Berkas Qt Designer - File Qt Designer - Qt Designer ファイル - Qt Designer файлы - Qt 디자이너 파일 - Qt Designer failas - Qt Designer datne - Fail Qt Designer - Qt Designer-fil - Qt Designer-bestand - Qt Designer-fil - Plik Qt Designer - ficheiro do Qt Designer - Arquivo do Qt Designer - Fișier Qt Designer - файл Qt Designer - Súbor Qt Designer - Datoteka Qt Designer - File Qt Designer - Qt Designer датотека - Qt Designer-fil - файл програми Qt-дизайнер - Tập tin thiết kế Qt Designer - Qt Designer 文件 - Qt Designer 檔案 - - - - - - - - - - Qt Markup Language file - Файл — Qt Markup - fitxer de llenguatge de marcadors Qt - Soubor Qt Markup Language - Qt Markup Language-fil - Qt-Auszeichnungssprachendatei - αρχείο Qt Markup Language - Qt Markup Language file - Archivo de lenguaje de marcado Qt - fichier Qt Markup Language - ficheiro de linguaxe de marcado Qt - קובץ שפת סימון של Qt - Qt jelölőnyelvű fájl - Berkas Bahasa Markup Qt - File Qt Markup Language - Qt マークアップ言語ファイル - Qt Markup Language файлы - Qt 마크업 언어 파일 - Qt marķēšanas valodas datne - Qt Markup Tallbestand - Plik języka znaczników Qt - Arquivo de Qt Markup Language - файл Qt Markup Language - Datoteka označevalnega jezika Qt - файл мови розмітки Qt - Qt - Qt 標記語言檔 - - - - - - - desktop configuration file - ملف تضبيط سطح المكتب - kanfihuracyjny fajł asiarodździa - Файл с информация за работния плот - fitxer de configuració d'escriptori - Soubor nastavení pracovní plochy - skrivebordskonfigurationsfil - Desktop-Konfigurationsdatei - ρυθμίσεις επιφάνειας εργασίας - desktop configuration file - dosiero de agordoj de labortablo - archivo de configuración del escritorio - Mahaigainaren konfigurazio-fitxategia - työpöydän asetustiedosto - skriviborðssamansetingarfíla - fichier de configuration desktop - comhad chumraíocht deisce - ficheiro de configuración de escritorio - קובץ הגדרות של שולחן העבודה - datoteka postavki radne površine - asztalbeállító fájl - berkas konfigurasi destop - File configurazione desktop - デスクトップ設定ファイル - жұмыс үстел баптаулар файлы - 데스크톱 설정 파일 - darbastalio konfigūracijos failas - darbvirsmas konfigurācijas datne - Fail konfigurasi desktop - konfigurasjonsfil for skrivebordet - bureaublad-configuratiebestand - skrivebordsoppsettfil - Plik konfiguracji środowiska - ficheiro de configuração de área de trabalho - Arquivo de configuração de área de trabalho - fișier de configurare al desktopului - файл настроек рабочего стола - Súbor nastavení pracovnej plochy - nastavitvena datoteka namizja - File konfigurimi desktop - датотека за подешавања радне површи - skrivbordskonfigurationsfil - файл конфігурації стільниці - tập tin cấu hình môi trường - 桌面配置文件 - 桌面組態檔 - - - - - - - - - - - - - - - FictionBook document - مستند FictionBook - Документ — FictionBook - document FictionBook - Dokument FictionBook - FictionBook-dokument - FictionBook-Dokument - έγγραφο FictionBook - FictionBook document - FictionBook-dokumento - documento FictionBook - FictionBook dokumentua - FictionBook-asiakirja - FictionBook skjal - document FictionBook - cáipéis FictionBook - documento de FictionBook - מסמך FictionBook - FictionBook dokument - FictionBook-dokumentum - Dokumen FictionBook - Documento FictionBook - FictionBook ドキュメント - FictionBook-ის დოკუმენტი - FictionBook құжаты - FictionBook 문서 - FictionBook dokumentas - FictionBook dokuments - FictionBook-document - Dokument FictionBook - Documento FictionBook - Document FictionBook - документ FictionBook - Dokument FictionBook - Dokument FictionBook - FictionBook-dokument - FictionBook belgesi - документ FictionBook - Tài liệu FictionBook - FictionBook 文档 - FictionBook 文件 - - - - - - - - - - Dia diagram - خطاطة Dia - Dia diaqramı - Dyjahrama Dia - Диаграма — Dia - diagrama de Dia - Diagram Dia - Diagram Dia - Dia-diagram - Dia-Diagramm - διάγραμμα Dia - Dia diagram - Dia-diagramo - diagrama de Dia - Dia diagrama - Dia-kaavio - Dia ritmynd - diagramme Dia - léaráid Dia - diagrama de Dia - גרף של Dia - Dia dijagram - Dia-diagram - Diagram Dia - Diagramma Dia - Dia ダイアグラム - Dia-ის დიაგრამა - Dia диаграммасы - Dia 도표 - Dia diagrama - Dia diagramma - Diagram Dia - Dia-diagram - Dia-diagram - Dia diagram - Diagram Dia - diagrama Dia - Diagrama do Dia - Diagramă Dia - диаграмма Dia - Diagram Dia - Datoteka diagrama Dia - Diagramë Dia - Диа дијаграм - Dia-diagram - діаграма Dia - Biểu đồ Dia - Dia 图表 - Dia 圖表 - - - - - - - - - - Dia shape - شكل Dia - Фигура — Dia - forma del Dia - Tvary Dia - Dia-figur - Dia-Form - σχήμα Dia - Dia shape - forma de Dia - Dia-ren forma - Dia skapur - forme Dia - cruth Dia - forma de Dia - צורה של Dia - Dia oblik - Dia alakzat - Shape Dia - Sagoma Dia - Dia 図形 - Dia сызбасы - Dia 그림 - Dia forma - Dia forma - Diavorm - Kształt Dia - Formato Dia - Figură Dia - фигура Dia - Datoteka oblik Dia - Dia-figur - форма Dia - Dia 形状 - Dia 形狀 - - - - - - - - - - TeX DVI document - مستند TeX DVI - Dakument TeX DVI - Документ — TeX DVI - document TeX DVI - Dokument TeX DVI - TeX DVI-dokument - TeX-DVI-Dokument - έγγραφο TeX DVI - TeX DVI document - DVI-dokumento de TeX - documento TeX DVI - TeX DVI dokumentua - TeX DVI -asiakirja - TeX DVI skjal - document TeX DVI - cáipéis DVI TeX - documento TeX DVI - מסמך מסוג TeX DVI - TeX DVI dokument - TeX DVI-dokumentum - Dokumen TeX DVI - Documento TeX DVI - TeX DVI ドキュメント - TeX DVI құжаты - TeX DVI 문서 - TeX DVI dokumentas - TeX DVI dokuments - Dokumen TeX DVI - TeX DVI-dokument - TeX DVI-document - TeX DVI-dokument - Dokument TeX DVI - documento TeX DVI - Documento DVI TeX - Document Tex DVI - документ TeX DVI - Dokument TeX DVI - Dokument TeX DVI - Dokument TeX DVI - ТеХ ДВИ документ - TeX DVI-dokument - документ TeX DVI - Tài liệu DVI Tex - TeX DVI 文档 - TeX DVI 文件 - DVI - Device independent file format - - - - - - - - Enlightenment theme - سمة Enlightenment - Enlightenment örtüyü - Matyŭ Enlightenment - Тема — Enlightenment - tema d'Enlightenment - Motiv Enlightenment - Thema Enlightenment - Enlightenmenttema - Enlightenment-Thema - Θέμα Enlightenment - Enlightenment theme - etoso de Enlightenment - tema de Enlightenment - Enlightenment gaia - Enlightenment-teema - Enlightenment tema - thème Enlightenment - téama Enlightenment - tema de Enlightenment - ערכת נושא של Enlightenment - Enlightenment tema - Enlightenment-téma - Tema Enlightenment - Tema Enlightenment - Enlightenment テーマ - Enlightenment-ის თემა - Enlightenment темасы - 인라이튼먼트 테마 - Enlightenment tema - Enlightenment motīvs - Tema Enlightenment - Enlightenment tema - Enlightenment-thema - Enlightenment-tema - Motyw Enlightenment - tema Enlightenment - Tema do Enlightenment - Temă Enlightenment - тема Enlightenment - Motív Enlightenment - Datoteka teme Enlightenment - Tema Enlightenment - Enlightenment тема - Enlightenment-tema - Enlightenment teması - тема Enlightenment - Sắc thái Enlightenment - Enlightenment 主题 - Enlightenment 佈景主題 - - - - Egon Animator animation - تحريكة محرك Egon - Animacyja Egon Animator - Анимация — Egon Animator - animació d'Egon Animator - Animace Egon Animator - Egon Animator-animation - Egon-Animator-Animation - κινούμενα σχέδια Egon Animator - Egon Animator animation - animacio de Egon Animator - animación de Egon Animator - Egon Animator-eko animazioa - Egon Animator -animaatio - Egon Animator teknimyndagerð - animation Egon Animator - beochan Egon Animator - animación de Egon Animator - אנימצייה של Egon Animator - Egon Animator animacija - Egon Animator-animáció - Animasi Egon Animator - Animazione Egon Animator - Egon Animator アニメーション - Egon Animator-ის ანიმაცია - Egon Animator анимациясы - Egon 애니메이터 애니메이션 - Egon Animator animacija - Egon Animator animācija - Animasi Egon Animator - Egon animator-animasjon - Egon Animator-animatie - Egon Animator-animasjon - Animacja Egon Animator - animação Egon Animator - Animação do Egon Animator - Animație Egon Animator - анимация Egon Animator - Animácia Egon Animator - Datoteka animacije Egon Animator - Animim Egon Animator - Егон аниматор анимација - Egon Animator-animering - анімація Egon Animator - Hoạt ảnh Egon Animator - Egon Animator 动画 - Egon Animator 動畫 - - - - - executable - تنفيذي - vykonvalny fajł - Изпълним файл - executable - Spustitelný soubor - kørbar - Programm - εκτελέσιμο - executable - plenumebla - ejecutable - exekutagarria - suoritettava ohjelma - inningarfør - exécutable - comhad inrite - executábel - קובץ הרצה - izvršna datoteka - futtatható - dapat dieksekusi - Eseguibile - 実行ファイル - орындалатын - 실행 파일 - vykdomasis failas - izpildāmais - Bolehlaksana - kjørbar - uitvoerbaar bestand - køyrbar - Program - executável - Executável - executabil - исполняемый - Spustiteľný súbor - izvedljiva datoteka - I ekzekutueshëm - извршна - körbar fil - çalıştırılabilir - виконуваний файл - thực hiện được - 可执行文件 - 可執行檔 - - - - - - - - - - - - - - - - - - - - - FLTK Fluid file - ملف FLTK Fluid - Fajł FLTK Fluid - Интерфейс — FLTK Fluid - fitxer Fluid FLTK - Soubor FLTK Fluid - FLTK Fluid-fil - FLTK-Fluid-Datei - FLTK Fluid file - archivo FLTK Fluid - FLTK Fluid fitxategia - FLTK Fluid -tiedosto - FLTK Fluid fíla - fichier Fluid FLTK - comhad FLTK Fluid - ficheiro FLTK Fluid - קובץ FLTK Fluid - FLTK Fluid datoteka - FLTK Fluid fájl - Berkas FLTK Fluid - File FLTK Fluid - FLTK Fluid ファイル - FLTK Fluid-ის ფაილი - FLTK Fluid файлы - FLTK Fluid 파일 - FLTK Fluid failas - FLTK Fluid datne - FLTK Fluid-fil - FLTK FLUID-bestand - FLTK Fluid-fil - Plik Fluid FLTK - Arquivo Fluid do FLTK - Fișier FLTK Fluid - файл FLTK Fluid - Súbor FLTK Fluid - Datoteka FLTK Fluid - File FLTK Fluid - FLTK Fluid-fil - FLTK Fluid dosyası - файл FLTK Fluid - Tập tin Fluid FLTK - FLTK 流体文档 - FLTK Fluid 檔 - FLTK - Fast Light Toolkit - - - - - - - - - WOFF font - WOFF - Web Open Font Format - - - - - - - - Postscript type-1 font - خط Postscript type-1 - Šryft Postscript type-1 - Шрифт — Postscript Type 1 - tipus de lletra Postscript type-1 - Písmo Postscript type-1 - PostScript type-1-skrifttype - Postscript-Typ-1-Schrift - Postscript type-1 font - tipografía PostScript tipo-1 - PostScript type-1 letra-tipoa - PostScript tyyppi-1 -asiakirja - Postscript type-1 stavasnið - police Postscript Type 1 - cló Postscript type-1 - tipo de letra PostScript tipo-1 - גופן של Postscript type-1 - Postscript type-1 betűkészlet - Fonta tipe-1 Postscript - Tipo carattere Postscript type-1 - PostScript type-1 フォント - Postscript type-1 қарібі - 포스트스크립트 Type-1 글꼴 - Postscript type-1 šriftas - Postscript 1-tipa fonts - Postscript type-1 skrift - PostScript type-1-lettertype - PostScript type 1-skrifttype - Czcionka PostScript Type-1 - Fonte PostScript tipo-1 - Font Postscript type-1 - шрифт PostScript Type-1 - Písmo Postscript type-1 - Datoteka pisave Postscript vrste-1 - Lloj gërmash Postscript type-1 - Postscript type-1-typsnitt - шрифт Postscript type-1 - Phông kiểu 1 PostScript - Postscript type-1 字体 - Postscript type-1 字型 - - - - - - - - - - - - - - - - Adobe font metrics - مقاييس خط أدوبي - Adobe yazı növü metrikləri - Metryka šryftu Adobe - Шрифтова метрика — Adobe - mètrica de tipus de lletra Adobe - Metrika písma Adobe - Metrigau Ffont Adobe - Adobe skrifttypefil - Adobe-Schriftmetriken - μετρικά γραμματοσειράς Adobe - Adobe font metrics - metrikoj de Adobe-tiparo - métricas de tipografía Adobe - Adobe letra-tipoen neurriak - Adobe-kirjasinmitat - métriques de police Adobe - meadarachtaí cló Adobe - métricas de fonte de Adobe - מדדי גופן של Adobe - Adobe mjere fonta - Adobe-betűmetrika - Metrik fonta Adobe - Metriche tipo carattere Adobe - Adobe フォントメトリック - Adobe қаріп метрикалары - 어도비 글꼴 메트릭 - Adobe šriftų metrika - Adobe fonta metrika - Metrik font Adobe - Adobe skrifttypefil - Adobe-lettertype-metrieken - Adobe skrifttypemetrikk - Metryka czcionki Adobe - métrica de tipos de letra Adobe - Métricas de fonte Adobe - Dimensiuni font Adobe - метрика шрифта Adobe - Metrika písma Adobe - Matrika pisave Adobe - Metrik lloj gërmash Adobe - Adobe метрика фонта - Adobe-typsnittsmetrik - метрики шрифту Adobe - Cách đo phông chữ Adobe - Adobe 字体参数 - Adobe 字型描述檔 - - - - - BDF font - خط BDF - BDF yazı növü - Šryft BDF - Шрифт — BDF - tipus de lletra BDF - Písmo BDF - Ffont BDF - BDF-skrifttype - BDF-Schrift - γραμματοσειρά BDF - BDF font - BDF-tiparo - tipografía BDF - BDF letra-tipoa - BDF-kirjasin - BDF stavasnið - police BDF - cló BDF - tipo de fonte BDF - גופן BDF - BDF font - BDF-betűkészlet - Fonta BDF - Tipo carattere BDF - BDF フォント - BDF қарібі - BDF 글꼴 - BDF šriftas - BDF fonts - Font BDF - BDF-skrifttype - BDF-lettertype - BDF-skrifttype - Czcionka BDF - tipo de letra BDF - Fonte BDF - Font BDF - шрифт BDF - Písmo BDF - Datoteka pisave BDF - Lloj gërme BDF - BDF фонт - BDF-typsnitt - BDF fontu - шрифт BDF - Phông chữ BDF - BDF 字体 - BDF 字型 - - - - - - - - DOS font - خط DOS - DOS yazı növü - Šryft DOS - Шрифт — DOS - tipus de lletra DOS - Písmo pro DOS - Ffont DOS - DOS-skrifttype - DOS-Schrift - γραμματοσειρά DOS - DOS font - DOS-tiparo - tipografía DOS - DOS letra-tipoa - DOS-kirjasin - DOS stavasnið - police DOS - cló DOS - tipo de fonte de DOS - גופן DOS - DOS font - DOS-betűkészlet - Fonta DOS - Tipo carattere DOS - DOS フォント - DOS қарібі - DOS 글꼴 - DOS šriftas - DOS fonts - Font DOS - DOS-skrifttype - DOS-lettertype - DOS-skrifttype - Czcionka DOS - tipo de letra DOS - Fonte do DOS - Font DOS - шрифт DOS - Písmo pre DOS - Datoteka pisave DOS - Gërmë DOS - DOS фонт - DOS-typsnitt - DOS fontu - шрифт DOS - Phông chữ DOS - DOS 字体 - DOS 字型 - - - - - - - - - Adobe FrameMaker font - خط أدوبي الصانع للإطارات - Adobe FrameMaker yazı növü - Šryft Adobe FrameMaker - Шрифт — Adobe FrameMaker - tipus de lletra d'Adobe FrameMaker - Písmo Adobe FrameMaker - Ffont Adobe FrameMaker - Adobe FrameMaker-skrifttype - Adobe-FrameMaker-Schrift - γραμματοσειρά Adobe FrameMaker - Adobe FrameMaker font - Tiparo de Adobe FrameMaker - tipografía de Adobe FrameMaker - Adobe FrameMaker-en letra-tipoa - Adobe FrameMaker -kirjasin - Adobe FrameMaker stavasnið - police Adobe FrameMaker - cló Adobe FrameMaker - tipo de fonte de Adobe FrameMaker - גופן של Adobe FrameMaker - Adobe FrameMaker font - Adobe FrameMaker-betűkészlet - Fonta Adobe FrameMaker - Tipo carattere Adobe FrameMaker - Adobe FrameMaker フォント - Adobe FrameMaker қарібі - 어도비 프레임메이커 글꼴 - Adobe FrameMaker šriftas - Adobe FrameMaker fonts - Font Adobe FrameMaker - Adobe FrameMaker skrifttype - Adobe FrameMaker-lettertype - Adobe FrameMaker-skrifttype - Czcionka Adobe FrameMaker - tipo de letra Adobe FrameMaker - Fonte do Adobe FrameMaker - Font Adobe FrameMaker - шрифт Adobe FrameMaker - Písmo Adobe FrameMaker - Datoteka pisave Adobe FrameMaker - Gërma Adobe FrameMaker - Adobe FrameMaker фонт - Adobe FrameMaker-typsnitt - шрифт Adobe FrameMaker - Phông chữ Adobe FrameMaker - Adobe FrameMaker 字体 - Adobe FrameMaker 字型 - - - - - - - LIBGRX font - خط LIBGRX - LIBGRX yazı növü - Šryft LIBGRX - Шрифт — LIBGRX - tipus de lletra LIBGRX - Písmo LIBGRX - Ffont LIBGRX - LIBGRX-skrifttype - LIBGRX-Schrift - γραμματοσειρά LIBGRX - LIBGRX font - LIBGRX-tiparo - tipografía LIBGRX - LIBGRX letra-tipoa - LIBGRX-kirjasin - LIBGRX stavasnið - police LIBGRX - cló LIBGRX - tipo de fonte en LIBGRX - גופן LIBGRX - LIBGRX font - LIBGRX-betűkészlet - Fonta LIBGRX - Tipo carattere LIBGRX - LIBGRX フォーマット - LIBGRX қарібі - LIBGRX 글꼴 - LIBGRX šriftas - LIBGRX fonts - Font LIBGRX - LIBGRX-skrifttype - LIBGRX-lettertype - LIBGRX skrifttype - Czcionka LIBGRX - tipo de letra LIBGRX - Fonte LIBGRX - Font LIBGRX - шрифт LIBGRX - Písmo LIBGRX - Datoteka pisave LIBGRX - Lloj gërme LIBGRX - LIBGRX фонт - LIBGRX-typsnitt - LIBGRX fontu - шрифт LIBGRX - Phông chữ LIBGRX - LIBGRX 字体 - LIBGRX 字型 - - - - - - - Linux PSF console font - خط كونسول PSF لينكس - Linux PSF konsol yazı növü - Kansolny šryft PSF dla Linuksa - Шрифт — PSF, за конзолата на Линукс - tipus de lletra de consola Linux PSF - Písmo PSF pro konzolu Linuxu - Ffont Linux PSF - Linux PSF-konsolskrifttype - Linux-PSF-Konsolenschrift - γραμματοσειρά κονσόλας PSF Linux - Linux PSF console font - PSF-tiparo de Linux-konzolo - tipografía de consola Linux PSF - Linux PSF kontsolako letra-tipoa - Linux PSF -konsolikirjasin - Linux PSF stýristøðs stavasnið - police console Linux PSF - cló chonsól Linux PSF - tipo de fonte de consola Linux PSF - גופן לקונסול מסוג Linux PSF - Linux PSF konzolni font - Linux PSF konzolos betűkészlet - Fonta konsol Linux PSF - Tipo carattere console Linux PSF - Linux PSF コンソールフォント - Linux PSF консольдік қарібі - 리눅스 PSF 콘솔 글꼴 - Linux PSF konsolės šriftas - Linux PSF konsoles fonts - Font konsol PSF Linux - Linux PSF konsollskrifttype - Linux PSF-console-lettertype - Linux PSF konsoll-skrifttype - Czcionka konsoli PSF Linux - tipo de letra de consola Linux PSF - Fonte de console Linux PSF - Font consolă Linux PSF - консольный шрифт Linux PSF - Písmo PSF pre konzolu Linuxu - Datoteka pisave konzole Linux PSF - Lloj gërme për konsolë Linux PSF - Линукс PSF конзолни фонт - Linux PSF-konsolltypsnitt - Linux PSF konsol fontu - консольний шрифт Linux PSF - Phông chữ bàn giao tiếp PSF Linux - Linux PSF 控制台字体 - Linux PSF console 字型 - - - - - - - - Linux PSF console font (gzip-compressed) - خط كونسول PSF لينكس (مضغوط-gzip) - Kansolny šryft PSF dla Linuksa (gzip-skampresavany) - Шрифт — Linux PSF, компресиран с gzip - tipus de lletra de consola Linux PSF (comprimida amb gzip) - Písmo PSF pro konzolu Linuxu (komprimované pomocí gzip) - Linux PSF-konsolskrifttype (gzip-komprimeret) - Linux-PSF-Konsolenschrift (gzip-komprimiert) - γραμματοσειρά κονσόλας PSF Linux (συμπιεσμένη με gzip) - Linux PSF console font (gzip-compressed) - tipografía de consola Linux PSF (comprimida con gzip) - Linux PSF kontsolako letra-tipoa (gzip-ekin konprimitua) - Linux PSF -konsolikirjasin (gzip-pakattu) - Linux PSF stýristøðs stavasnið (gzip-stappað) - police console Linux PSF (compressée gzip) - cló chonsól Linux PSF (comhbhrúite le gzip) - tipo de fonte de consola Linux PSF (comprimida con gzip) - גופן לקונסול מסוג Linux PSF (מכווץ ע"י gzip) - Linux PSF konzolni font (komprimiran gzip-om) - Linux PSF konzolos betűkészlet (gzip-tömörítésű) - Fonta konsol Linux PSF (terkompresi gzip) - Tipo carattere console Linux PSF (compresso con gzip) - Linux PSF コンソールフォント (gzip 圧縮) - Linux PSF консольдік қарібі (gzip-пен сығылған) - 리눅스 PSF 콘솔 글꼴 (GZIP 압축) - Linux PSF konsolės šriftas (suglaudintas su gzip) - Linux PSF konsoles fonts (saspiests ar gzip) - Linux PSF konsollskrifttype (gzip-komprimert) - Linux PSF-console-lettertype (ingepakt met gzip) - Linux PSF konsoll-skrifttype (gzip-pakka) - Czcionka konsoli PSF Linux (kompresja gzip) - Fonte de console Linux PSF (compactada com gzip) - Font consolă Linux PSF (compresie gzip) - консольный шрифт Linux PSF (сжатый gzip) - Písmo PSF pre konzolu Linuxu (komprimované pomocou gzip) - Datoteka pisave konzole Linux PSF (skrčena z gzip) - Lloj gërme për konsolë Linux PSF (komresuar me gzip) - Linux PSF-konsolltypsnitt (gzip-komprimerat) - Linux PSF konsol fontu (gzip ile sıkıştırılmış) - консольний шрифт Linux PSF (стиснений gzip) - Phông chữ bàn giao tiếp PSF Linux (đã nén gzip) - Linux PSF 控制台字体(gzip 压缩) - Linux PSF console 字型 (gzip 格式壓縮) - - - - - - PCF font - خط PCF - PCF yazı növü - Šryft PCF - Шрифт — PCF - tipus de lletra PCF - Písmo PCF - Ffont PCF - PCF-skrifttype - PCF-Schrift - γραμματοσειρά PCF - PCF font - PCF-tiparo - tipografía PCF - PCF letra-tipoa - PCF-kirjasin - PCF stavasnið - police PCF - cló PCF - tipo de letra PCF - פונט PCF - PCF-betűkészlet - Fonta PCF - Tipo carattere PCF - PCF フォント - PCF қарібі - PCF 글꼴 - PCF šriftas - PCF fonts - Font PCF - PCF-skrifttype - PCF-lettertype - PCF-skrifttype - Czcionka PCF - tipo de letra PCF - Fonte PCF - Font PCF - шрифт PCF - Písmo PCF - Datoteka pisave PCF - Gërma PCF - PCF фонт - PCF-typsnitt - PCF fontu - шрифт PCF - Phông chữ PCF - PCF 字体 - PCF 字型 - - - - - - - - - - OpenType font - خط OpenType - OpenType yazı növü - Šryft OpenType - Шрифт — OpenType - tipus de lletra OpenType - Písmo OpenType - Ffont OpenType - OpenType-skrifttype - OpenType-Schrift - γραμματοσειρά OpenType - OpenType font - OpenType-tiparo - tipografía de OpenType - OpenType letra-tipoa - OpenType-kirjasin - OpenType stavasnið - police OpenType - cló OpenType - tipo de fonte OpenType - גופן של OpenType - OpenType-betűkészlet - Fonta OpenType - Tipo carattere OpenType - OpenType フォント - OpenType қарібі - 오픈타입 글꼴 - OpenType šriftas - OpenType fonts - Font OpenType - OpenType-skrifttype - OpenType-lettertype - OpenType-skrifttype - Czcionka OpenType - tipo de letra OpenType - Fonte OpenType - Font OpenType - шрифт OpenType - Písmo OpenType - Datoteka pisave OpenType - Gërma OpenType - OpenType фонт - OpenType-typsnitt - OpenType fontu - шрифт OpenType - Phông chữ OpenType - OpenType 字体 - OpenType 字型 - - - - - - - - Speedo font - خط Speedo - Speedo yazı növü - Šryft Speedo - Шрифт — Speedo - tipus de lletra Speedo - Písmo Speedo - Ffont Speedo - Speedoskrifttype - Speedo-Schrift - γραμματοσειρά Speedo - Speedo font - Speedo-tiparo - tipografía Speedo - Speedo letra-tipoa - Speedo-kirjasin - Speedo stavasnið - police Speedo - cló Speedo - tipo de letra Speedo - גופן של Speedo - Speedo font - Speedo-betűkészlet - Fonta Speedo - Tipo carattere Speedo - Speedo フォント - Speedo қарібі - Speedo 글꼴 - Speedo šriftas - Speedo fonts - Font Speedo - Speedo-skrifttype - Speedo-lettertype - Speedo-skrifttype - Czcionka Speedo - tipo de letra Speedo - Fonte Speedo - Font Speedo - шрифт Speedo - Písmo Speedo - Datoteka pisave Speedo - Gërma Speedo - Speedo фонт - Speedo-typsnitt - Speedo fontu - шрифт Speedo - Phông chữ Speedo - Speedo 字体 - Speedo 字型 - - - - - - - - SunOS News font - خط SunOS News - SunOS News yazı növü - Šryft SunOS News - Шрифт — SunOS News - tipus de lletra SunOS News - Písmo SunOS News - Ffont SunOS News - SunOS News-skrifttype - SunOS-News-Schrift - γραμματοσειρά SunOS News - SunOS News font - tiparo de SunOS News - tipografía SunOS News - SunOs News letra-tipoa - SunOS News -kirjasin - SunOS News stavasnið - police SunOS News - cló SunOS News - tipo de letra SunOS News - גופן של SunOS News - SunOS News font - SunOS News-betűkészlet - Fonta SunOS News - Tipo carattere SunOS News - SunOS News フォント - SunOS News қарібі - SunOS News 글꼴 - SunOS News šriftas - SunOS News fonts - Font News SunOS - SunOS News-skrifttype - SunOS News-lettertype - SunOS NEWS-skrifttype - Czcionka SunOS News - tipo de letra SunOS News - Fonte SunOS News - Font SunOS News - шрифт SunOS News - Písmo SunOS News - Datoteka pisave SunOS News - Gërma SunOS News - SunOS News фонт - SunOS News-typsnitt - шрифт SunOS News - Phông chữ SunOS News - SunOS News 字体 - SunOS News 字型 - - - - - - - - - TeX font - خط TeX - TeX yazı növü - Šryft TeX - Шрифт — TeX - tipus de lletra TeX - Písmo TeX - Ffont TeX - TeX-skrifttype - TeX-Schrift - γραμματοσειρά TeX - TeX font - TeX-tiparo - tipografía de TeX - TeX letra-tipoa - TeX-kirjasin - TeX stavasnið - police TeX - cló TeX - tipo de letra de TeX - גופן TeX - TeX font - TeX-betűkészlet - Fonta TeX - Tipo carattere TeX - TeX フォント - TeX қарібі - TeX 글꼴 - TeX šriftas - TeX fonts - Font TeX - TeX-skrift - TeX-lettertype - TeX-skrifttype - Czcionka TeX - tipo de letra TeX - Fonte TeX - Font TeX - шрифт TeX - Písmo TeX - Datoteka pisave TeX - Gërma TeX - ТеХ фонт - TeX-typsnitt - TeX fontu - шрифт TeX - Phông chữ TeX - TeX 字体 - TeX 字型 - - - - - - - - - TeX font metrics - مقاييس خط TeX - TeX yazı növü metrikləri - Metryka šryftu TeX - Шрифтова метрика — TeX - mètrica de tipus de lletra TeX - Metrika písma TeX - Metrigau Ffont TeX - TeX-skrifttypeinformation - TeX-Schriftmetriken - μετρικά γραμματοσειράς TeX - TeX font metrics - metrikoj de TeX-tiparo - métricas de tipografía de TeX - TeX letra-tipoen neurriak - TeX-kirjasinmitat - métriques de police TeX - meadarachtaí cló TeX - Métricas de tipo de letra de TeX - גופן מטריקס של TeX - TeX mjere fonta - TeX-betűmetrika - Fonta metrik TeX - Metriche tipo carattere TeX - TeX フォントメトリック - TeX қаріп метрикалары - Tex 글꼴 메트릭 - TeX šriftų metrika - TeX fonta metrikas - Metrik font TeX - TeX skrifttypemetrikk - TeX-lettertype-metrieken - TeX skrifttypemetrikk - Metryki czcionki TeX - métricas de tipo de letra TeX - Métrica de fonte TeX - Dimensiuni font TeX - метрика шрифта TeX - Metrika písma TeX - Matrika pisave Tex - Gërma TeX metrics - ТеХ метрика фонта - TeX-typsnittsmetrik - метрики шрифту TeX - Cách đo phông chữ TeX - TeX 字体参数 - TeX 字型描述檔 - - - - - - - - TrueType font - خط TrueType - Šryft TrueType - Шрифт — TrueType - tipus de lletra TrueType - Písmo TrueType - TrueType-skrifttype - TrueType-Schrift - γραμματοσειρά TrueType - TrueType font - TrueType-tiparo - tipografía TrueType - TrueType letra-tipoa - TrueType-kirjasin - TrueType stavasnið - police Truetype - cló TrueType - tipo de letra TrueType - גופן מסוג TrueType - TrueType font - TrueType-betűkészlet - Fonta TrueType - Tipo carattere TrueType - TrueType フォント - TrueType қарібі - 트루타입 글꼴 - TrueType šriftas - TrueType fonts - Font TrueType - TrueType-skrift - TrueType-lettertype - TrueType-skrifttype - Czcionka TrueType - tipo de letra TrueType - Fonte TrueType - Font TrueType - шрифт TrueType - Písmo TrueType - Datoteka pisave TrueType - Lloj gërme TrueType - Трутајп фонт - Truetype-typsnitt - TrueType fontu - шрифт TrueType - Phông chữ TrueType - TrueType 字体 - TrueType 字型 - - - - - - - - - - - TrueType XML font - خط TrueType XML - Šryft TrueType XML - Шрифт — TrueType XML - tipus de lletra TrueType XML - Písmo TrueType XML - TrueType XML-skrifttype - TrueType-XML-Schrift - γραμματοσειρά XML TrueType - TrueType XML font - tipografía TrueType XML - TrueType XML letra-tipoa - TrueType-XML-kirjasin - TrueType XML stavasnið - police Truetype XML - cló XML TrueType - tipo de letra TrueType XML - גופן XML מסוג TrueType - TrueType XML font - TrueType XML betűkészlet - Fonta TrueType XML - Tipo carattere TrueType XML - TrueType XML フォント - TrueType XML қарібі - 트루타입 XML 글꼴 - TrueType XML šriftas - TrueType XML fonts - TrueType XML-skrift - TrueType XML-lettertype - TrueType XML-skrifttype - Czcionka TrueType XML - Fonte TrueType XML - Font XML TrueType - шрифт TrueType XML - Písmo TrueType XML - Datoteka pisave TrueType XML - Lloj gërme TrueType XML - Truetype XML-typsnitt - TrueType XML fontu - шрифт TrueType XML - Phông chữ XML TrueType - TrueType XML 字体 - TrueType XML 字型 - - - - - - - - - V font - خط V - V yazı növü - Šryft V - Шрифт — V - tipus de lletra V - Písmo V - Ffont V - V-skrifttype - V-Schrift - γραμματοσειρά V - V font - V-tiparo - tipografía V - V letra-tipoa - V-kirjasin - V stavasnið - police V - cló V - tipo de letra V - גופן של V - V font - V-betűkészlet - Fonta V - Tipo carattere V - V フォント - V font қарібі - V 글꼴 - V šriftas - V fonts - Font V - V-skrift - V-lettertype - V-skrifttype - Czcionka V - tipo de letra V - Fonte V - Font V - шрифт V font - Písmo V - Datoteka pisave V - Gërmë V - V фонт - V-typsnitt - V fontu - V-шрифт - Phông chữ V - V 字体 - V 字型 - - - - - - - Adobe FrameMaker document - مستند أدوبي الصانع للإطارات - Dakument Adobe FrameMaker - Документ — Adobe FrameMaker - document FrameMaker d'Adobe - Dokument Adobe FrameMaker - Adobe FrameMaker-dokument - Adobe-FrameMaker-Dokument - αρχείο Adobe FrameMaker - Adobe FrameMaker document - Dokumento de Adobe FrameMaker - documento de Adobe FrameMaker - Adobe FrameMaker-en dokumentua - Adobe FrameMaker -asiakirja - Adobe FrameMaker skjal - document Adobe FrameMaker - cáipéis Adobe FrameMaker - documento de Adobe FrameMaker - מסמך Adobe FrameMaker - Adobe FrameMaker dokument - Adobe FrameMaker-dokumentum - Dokumen Adobe FrameMaker - Documento Adobe FrameMaker - Adobe FrameMaker ドキュメント - Adobe FrameMaker-ის დოკუმენტი - Adobe FrameMaker құжаты - 어도비 프레임메이커 문서 - Adobe FrameMaker dokumentas - Adobe FrameMaker dokuments - Adobe FrameMaker-dokument - Adobe FrameMaker-document - Adobe FrameMaker-dokument - Dokument Adobe FrameMaker - Documento do Adobe FrameMaker - Document Adobe FrameMaker - документ Adobe FrameMaker - Dokument Adobe FrameMaker - Dokument Adobe FrameMaker - Dokument Adobe FrameMaker - Adobe FrameMaker-dokument - документ Adobe FrameMaker - Tài liệu Adobe FrameMaker - Adobe FrameMaker 文档 - Adobe FrameMaker 文件 - - - - - - - - - - - - - Game Boy ROM - Game Boy ROM - Game Boy ROM - ROM — Game Boy - ROM de Game Boy - ROM pro Game Boy - Game Boy-rom - Game-Boy-ROM - εικόνα μνήμης ROM GameBoy - Game Boy ROM - NLM de Game Boy - ROM de Game Boy - Game Boy-eko ROMa - Game Boy -ROM - Game Boy ROM - ROM Game Boy - ROM Game Boy - ROM de Game Boy - ROM של Game Boy - Game Boy ROM - Game Boy ROM - Memori baca-saja Game Boy - ROM Game Boy - ゲームボーイ ROM - Game Boy-ის ROM - Game Boy ROM - 게임보이 롬 - Game Boy ROM - Game Boy ROM - ROM Game Boy - Game Boy-ROM - Game Boy-ROM - Game Boy-ROM - Plik ROM konsoli Game Boy - ROM Game Boy - ROM do Game Boy - ROM Game Boy - Game Boy ROM - ROM pre Game Boy - Bralni pomnilnik Game Boy - ROM Game Boy - Гејмбој РОМ - Game Boy-rom - ППП Game Boy - ROM Game Boy - Game Boy ROM - Game Boy ROM - - - - - Game Boy Advance ROM - Game Boy Advance ROM - Game Boy Advance ROM - ROM — Game Boy Advance - ROM de Game Boy Advance - ROM pro Game Boy Advance - Game Boy Advance-rom - Game-Boy-Advance-ROM - εικόνα μνήμης Game Boy Advance - Game Boy Advance ROM - ROM de Game Boy Advance - Game Boy Advance-ko ROMa - Game Boy Advance -ROM - Game Boy Advance ROM - ROM Game Boy Advance - ROM Game Boy Advance - ROM de Game Boy Advance - ROM של Game Boy Advance - Game Boy Advance ROM - Game Boy Advance ROM - Memori baca-saja Game Boy Advance - ROM Game Boy Advance - ゲームボーイアドバンス ROM - Game Boy Advance-ის ROM - Game Boy Advance ROM - 게임보이 어드밴스 롬 - Game Boy Advance ROM - Game Boy Advance ROM - Game Boy Advance-ROM - Game Boy Advance-ROM - Game Boy Advance-ROM - Plik ROM konsoli Game Boy Advance - ROM do Game Boy Advance - ROM Game Boy Advance - Game Boy Advance ROM - ROM pre Game Boy Advance - Bralni pomnilnik Game Boy Advance - ROM Game Boy Advance - Game Boy Advance-rom - розширений ППП Game Boy - ROM Game Boy Advance - Game Boy Advance ROM - Game Boy Advance ROM - - - - - GDBM database - قاعدة بيانات GDBM - Baza źviestak GDBM - База от данни — GDBM - base de dades GDBM - Databáze GDBM - GDBM-database - GDBM-Datenbank - βάση δεδομένων GDBM - GDBM database - GDBM-datumbazo - base de datos GDBM - GDBM datu-basea - GDBM-tietokanta - GDBM dátustovnur - base de données GDBM - bunachar sonraí GDBM - base de datos GDBM - בסיס נתונים GDBM - GDBM baza podataka - GDBM adatbázis - Basis data GDBM - Database GDBM - GDBM データベース - GDBM მონაცემთა ბაზა - GDBM дерекқоры - GDBM 데이터베이스 - GDBM duomenų bazė - GDBM datubāze - GDBM-database - GDBM-gegevensbank - GDBM-database - Baza danych GDBM - Banco de dados GDBM - Bază de date GDBM - база данных GDBM - Databáza GDBM - Podatkovna zbirka GDBM - Bazë me të dhëna GDBM - GDBM-databas - GDBM veritabanı - база даних GDBM - Cơ sở dữ liệu GDBM - GDBM 数据库 - GDBM 資料庫 - GDBM - GNU Database Manager - - - - - - - - - Genesis ROM - Genesis ROM - Genesis ROM - ROM — Genesis - ROM de Genesis - ROM pro Genesis - Genesis-rom - Genesis-ROM - εικόνα μνήμης ROM Genesis - Genesis ROM - Genesis-NLM - ROM de Genesis (Mega Drive) - Genesis-eko ROMa - Genesis-ROM - Genesis ROM - ROM Mega Drive/Genesis - ROM Genesis - ROM xenérica - ROM של Genesis - Genesis ROM - Genesis ROM - Memori baca-saja Genesis - ROM Megadrive - メガドライブ ROM - Genesis ROM - 제네시스 롬 - Genesis ROM - Genesis ROM - ROM Genesis - Genesis-ROM - Mega Drive - Genesis-ROM - Plik ROM konsoli Mega Drive - ROM Genesis - ROM do Gênesis (Mega Drive) - ROM Genesis - Genesis ROM - ROM pre Megadrive - Bralni pomnilnik Genesis - ROM Genesis - Genesis РОМ - Genesis-rom - ППП Genesis - ROM Genesis - Genesis ROM - Genesis ROM - - - - - - - - - - translated messages (machine-readable) - رسائل مترجمة (مقروءة آليا) - pierakładzienyja paviedamleńni (dla čytańnia kamputaram) - Преведени съобщения — машинен формат - missatges traduïts (llegible per màquina) - Přeložené zprávy (strojově čitelné) - oversatte meddelelser (maskinlæsbare) - Übersetzte Meldungen (maschinenlesbar) - μεταφρασμένα μηνύματα (για μηχανική ανάγνωση) - translated messages (machine-readable) - tradukitaj mesaĝoj (maŝinlegebla) - mensajes traducidos (legibles por máquinas) - itzulitako mezuak (ordenagailuek irakurtzeko) - käännetyt viestit (koneluettava) - týdd boð (maskin-lesifør) - messages traduits (lisibles par machine) - teachtaireachtaí aistrithe (inléite ag meaisín) - mensaxes traducidos (lexíbeis por máquinas) - מסר מתורגם (מובן ע"י מכונה) - prevedene poruke (strojno čitljive) - lefordított üzenetek (gépi kód) - pesan diterjemahkan (dapat dibaca mesin) - Messaggi tradotti (leggibili da macchina) - 翻訳メッセージ (マシン用) - ნათარგმნი შეტყობინებები (მანქანისთვის განკუთვნილი) - аударылған хабарламалар (машиналық түрде) - 번역 메시지 (컴퓨터 사용 형식) - išversti užrašai (kompiuteriniu formatu) - pārtulkotie ziņojumi (mašīnlasāms) - Mesej diterjemah (bolehdibaca-mesin) - oversatte meldinger (maskinlesbar) - vertaalde berichten (machine-leesbaar) - oversette meldingar (maskinlesbare) - Przetłumaczone komunikaty (czytelne dla komputera) - mensagens traduzidas (leitura pelo computador) - Mensagens traduzidas (legível pelo computador) - mesaje traduse (citite de calculator) - переводы сообщений (откомпилированые) - Preložené správy (strojovo čitateľné) - prevedena sporočila (strojni zapis) - Mesazhe të përkthyer (të lexueshëm nga makina) - преведене поруке (машинама читљиво) - översatta meddelanden (maskinläsbara) - перекладені повідомлення (у машинній формі) - thông điệp đã dịch (máy đọc được) - 消息翻译(机读) - 翻譯訊息 (程式讀取格式) - - - - - - - - - GTK+ Builder - - - - - - - - - Glade project - مشروع Glade - Glade layihəsi - Prajekt Glade - Проект — Glade - projecte de Glade - Projekt Glade - Prosiect Glade - Gladeprojekt - Glade-Projekt - έργο Glade - Glade project - Glade-projekto - proyecto de Glade - Glade proiektua - Glade-projekti - Glade verkætlan - projet Glade - tionscadal Glade - proxecto de Glade - מיזם Glade - Glade projekt - Glade-projekt - Proyek Glade - Progetto Glade - Glade プロジェクト - Glade жобасы - Glade 프로젝트 - Glade projektas - Glade projekts - Projek Glade - Glade prosjekt - Glade-project - Glade prosjekt - Projekt Glade - projecto Glade - Projeto do Glade - Proiect Glade - проект Glade - Projekt Glade - Datoteka projekta Glade - Projekt Glade - Глејд пројекат - Glade-projekt - проект Glade - Dự án Glade - Glade 工程 - Glade 專案 - - - - - - - - - GMC link - وصلة GMC - GMC körpüsü - Spasyłka GMC - Връзка — GMC - enllaç GMC - Odkaz GMC - Cyswllt GMC - GMC-henvisning - GMC-Verweis - σύνδεσμος GMC - GMC link - GMC-ligilo - enlace GMC - GMC esteka - GMC-linkki - GMC leinkja - lien GMC - nasc GMC - ligazón GMC - קישור GMC - GMC veza - GMC-link - Taut GMC - Collegamento GMC - GMC リンク - GMC ბმული - GMC сілтемесі - GMC 연결 - GMC nuoroda - GMC saite - Pautan GMC - GMC-lenke - GMC-verwijzing - GMC-lenkje - Odnośnik GMC - 'link' GMC - Link GMC - Legătură GMC - ссылка GMC - Odkaz GMC - Datoteka povezave GMC - Lidhje GMC - GMC веза - GMC-länk - GMC bağlantısı - посилання GMC - Liên kết GMC - GMC 链接 - GMC 鏈結 - - - - - - - GnuCash financial data - معلومات GnuCash المالية - Финансови данни — GnuCash - dades financeres del GnuCash - Finanční data GnuCash - Finansielle data til GnuCash - GnuCash-Finanzdaten - οικονομικά στοιχεία GnuCash - GnuCash financial data - datos financieros GnuCash - GnuCash finantzako datuak - GnuCash-taloustiedot - GnuCash fíggjarligar dátur - données financières GnuCash - sonraí airgeadúla GnuCash - datos financeiros de GNUCash - מידע כלכלי של GnuCash - GnuCash financijski podaci - GnuCash pénzügyi adatok - Data keuangan GnuCash - Dati finanziari GnuCash - GnuCash 会計データ - GnuCash қаржы ақпараты - GnuCash 재정 자료 - GnuCash finansiniai duomenys - GnuCash finanšu dati - GnuCash financiële gegevens - Dane finansowe GnuCash - Dados financeiros do GnuCash - Date financiare GnuCash - финансовые данные GnuCash - Finančné údaje GnuCash - Datoteka finančnih podatkov GnuCash - GnuCash-finansdata - фінансові дані GnuCash - Dữ liệu tài chính GnuCash - GnuCash 财务数据 - GnuCash 財務資料 - - - - - - - Gnumeric spreadsheet - جدول Gnumeric - Raźlikovy arkuš Gnumeric - Таблица — Gnumeric - full de càlcul de Gnumeric - Sešit Gnumeric - Gnumeric-regneark - Gnumeric-Tabelle - Λογιστικό φύλλο Gnumeric - Gnumeric spreadsheet - Gnumeric-kalkultabelo - hoja de cálculo de Gnumeric - Gnumeric kalkulu-orria - Gnumeric-taulukko - Gnumeric rokniark - feuille de calcul Gnumeric - scarbhileog Gnumeric - folla de cálculo de Gnumeric - גליון עבודה Gnumeric - Gnumeric proračunska tablica - Gnumeric-munkafüzet - Lembar sebar Gnumeric - Foglio di calcolo Gnumeric - Gnumeric スプレッドシート - Gnumeric электрондық кестесі - Gnumeric 스프레드시트 - Gnumeric skaičialentė - Gnumeric izklājlapa - Hamparan Gnumeric - Gnumeric-regneark - Gnumeric-rekenblad - Gnumeric-rekneark - Arkusz Gnumeric - folha de cálculo Gnumeric - Planilha do Gnumeric - Foaie de calcul Gnumeric - электронная таблица Gnumeric - Zošit Gnumeric - Razpredelnica Gnumeric - Fletë llogaritjesh Gnumeric - Гнумерик табеларни рачун - Gnumeric-kalkylblad - ел. таблиця Gnumeric - Bảng tính Gnumeric. - Gnumeric 工作簿 - Gnumeric 試算表 - - - - - - - - - Gnuplot document - مستند Gnuplot - Dakument Gnuplot - Документ — Gnuplot - document gnuplot - Dokument Gnuplot - Gnuplotdokument - Gnuplot-Dokument - έγγραφο Gnuplot - Gnuplot document - Gnuplot-dokumento - documento de Gnuplot - Gnuplot dokumentua - Gnuplot-asiakirja - Gnuplot skjal - document Gnuplot - cáipéis Gnuplot - documento de Gnuplot - מסמך Gnuplot - Gnuplot dokument - Gnuplot dokumentum - Dokumen Gnuplot - Documento Gnuplot - Gnuplot ドキュメント - Gnuplot құжаты - Gnuplot 문서 - Gnuplot dokumentas - Gnuplot dokuments - Gnuplot-dokument - Gnuplot-document - Gnuplot-dokument - Dokument Gnuplot - Documento do Gnuplot - Document Gnuplot - документ Gnuplot - Dokument Gnuplot - Dokument Gnuplot - Dokument Gnuplot - Gnuplot-dokument - документ Gnuplot - Tài liệu Gnuplot - Gnuplot 文档 - Gnuplot 文件 - - - - - - - - Graphite scientific graph - مبيان الجرافيت العلمي - Navukovy hrafik Graphite - Графика — Graphite - gràfic científic Graphite - Vědecký graf Graphite - Graphite videnskabelig graf - Wissenschaftlicher Graphite-Graph - επιστημονικό γράφημα Graphite - Graphite scientific graph - scienca grafikaĵo de Graphite - gráfica científica de Graphite - Graphite - grafiko zientifikoak - Graphite- tieteellinen graafi - Grapite vísindarlig ritmynd - graphe Graphite scientific - graf eolaíoch Graphite - gráfica científica de Graphite - גרך מדעי של Graphite - Graphite znanstveni grafikon - Graphite tudományos grafikon - Grafik sains Graphite - Grafico scientifico Graphite - Graphite scientific グラフ - Graphite ғылыми кескіні - Graphite 과학 그래프 - Graphite mokslinė diagrama - Graphite zinātniskais grafiks - Graf saintifik Graphite - Vitenskapelig graf fra Graphite - Graphite wetenschappelijke grafiek - Graphite vitskaplege graf - Wykres naukowy Graphite - gráfico científico Graphite - Gráfico científico do Graphite - Grafic științific Graphite - научная диаграмма Graphite - Vedecký graf Graphite - Datoteka znanstvenega grafa Graphite - Grafik shkencor Graphite - Graphite научни графикони - Vetenskaplig Graphite-grafer - наукова графіка Graphite - Biểu đồ khoa học Graphite - Graphite 科学图形 - Graphite 科學圖表 - - - - - GTKtalog catalog - كتالوج GTKtalog - Kataloh GTKtalog - Каталог — Gtktalog - catàleg de GTKtalog - Katalog GTKtalog - GTKtalog-katalog - GTKtalog-Katalog - Κατάλογος GTKtalog - GTKtalog catalogue - katalogo de GTKtalog - catálogo de GTKtalog - Gtktalog katalogoa - GTKtalog-luettelo - GTKtalog skrá - catalogue Gtktalog - catalóg GTKtalog - catálogo de GTKtalog - קטלוג GTKtalog - GTKtalog katalog - GTKtalog-katalógus - Katalog GTKtalog - Catalogo GTKtalog - GTKtalog カタログ - GTKtalog-ის კატალოგი - GTKtalog каталогы - GTKtalog 카탈로그 - GTKtalog katalogas - GTKtalog katalogs - Katalog GTKtalog - GTKtalog-katalog - GTKtalog-catalogus - GTKtalog-katalog - Katalog programu GTKtalog - catálogo GTKtalog - Catálogo GTKtalog - Catalog GTKalog - каталог GTKtalog - Katalóg GTKtalog - Datoteka kataloga GTKtalog - Katallog GTKtalog - Гткталог каталог - GTKtalog-katalog - каталог GTKtalog - Phân loại GTKtalog - GTKtalog 目录 - GTKtalog 光碟目錄 - - - - - - - TeX DVI document (gzip-compressed) - مستند TeX DVI (مضغوط-gzip) - Dakument TeX DVI (gzip-skampresavany) - Документ — TeX DVI, компресиран с gzip - document TeX DVI (comprimit amb gzip) - Dokument TeX DVI (komprimovaný pomocí gzip) - TeX DVI-dokument (gzip-komprimeret) - TeX-DVI-Dokument (gzip-komprimiert) - αρχείο TeX DVI (συμπιεσμένο με gzip) - TeX DVI document (gzip-compressed) - documento DVI de TeX (comprimido con gzip) - TeX DVI dokumentua (gzip-ekin konprimitua) - TeX DVI -asiakirja (gzip-pakattu) - TeX DVI skjal (gzip-stappað) - document DVI TeX (compressé gzip) - cáipéis DVI TeX (comhbhrúite le gzip) - documento DVI de TeX (comprimido con gzip) - מסמך מסוג TeX DVI (מכווץ ע"י gzip) - TeX DVI dokument (komprimiran gzip-om) - TeX DVI dokumentum (gzip-pel tömörítve) - Dokumen TeX DVI (terkompresi gzip) - Documento Tex DVI (compresso con gzip) - Tex DVI ドキュメント (gzip 圧縮) - TeX DVI құжаты (gzip-пен сығылған) - TeX DVI 문서 (GZIP 압축) - TeX DVI dokumentas (suglaudintas su gzip) - TeX DVI dokuments (saspiests ar gzip) - TeX DVI-dokument (gzip-komprimert) - TeX DVI-document (ingepakt met gzip) - TeX DVI-dokument (pakka med gzip) - Dokument TeX DVI (kompresja gzip) - Documento DVI TeX (compactado com gzip) - Document TeX DVI (comprimat gzip) - документ TeX DVI (сжатый gzip) - Dokument TeX DVI (komprimovaný pomocou gzip) - Dokument TeX DVI (stisnjen z gzip) - Dokument TeX DVI (i kompresuar me gzip) - TeX DVI-dokument (gzip-komprimerat) - TeX DVI belgesi (gzip ile sıkıştırılmış) - документ TeX DVI (стиснений gzip) - Tài liệu DVI TeX (đã nén gzip) - TeX DVI 文档(gzip 压缩) - TeX DVI 文件 (gzip 格式壓縮) - - - - - - Gzip archive - أرشيف Gzip - Archiŭ gzip - Архив — gzip - arxiu gzip - Archiv gzip - Gzip-arkiv - Gzip-Archiv - συμπιεσμένο αρχείο Gzip - Gzip archive - Gzip-arkivo - archivador Gzip - Gzip artxiboa - Gzip-arkisto - Gzip skjalasavn - archive gzip - cartlann Gzip - arquivo Gzip - ארכיון Gzip - Gzip arhiva - Gzip archívum - Arsip Gzip - Archivio gzip - Gzip アーカイブ - Gzip архиві - GZIP 압축 파일 - Gzip archyvas - Gzip arhīvs - Gzip-arkiv - Gzip-archief - Gzip-arkiv - Archiwum gzip - Pacote Gzip - Arhivă Gzip - архив GZIP - Archív gzip - Datoteka arhiva Gzip - Arkiv gzip - Gzip-arkiv - архів gzip - Kho nén gzip - Gzip 归档文件 - Gzip 封存檔 - - - - - - - - - PDF document (gzip-compressed) - مستند PDF (مضغوط-gzip) - Dakument PDF (gzip-skampresavany) - Документ — PDF, компресиран с gzip - document PDF (comprimit amb gzip) - Dokument PDF (komprimovaný pomocí gzip) - PDF-dokument (gzip-komprimeret) - PDF-Dokument (gzip-komprimiert) - έγγραφο PDF (συμπιεσμένο με gzip) - PDF document (gzip-compressed) - documento PDF (comprimido con gzip) - PDF dokumentua (gzip-ekin konprimitua) - PDF-asiakirja (gzip-pakattu) - PDF skjal (gzip-stappað) - document PDF (compressé gzip) - cáipéis PDF (comhbhrúite le gzip) - documento PDF (comprimido en gzip) - מסמך PDF (מכווץ ע"י gzip) - PDF dokumentum (gzip-tömörítésű) - Dokumen PDF (terkompresi gzip) - Documento PDF (compresso con gzip) - PDF ドキュメント (gzip 圧縮) - PDF құжаты (gzip-пен сығылған) - PDF 문서 (GZIP 압축) - PDF dokumentas (suglaudintas su gzip) - PDF dokuments (saspiests ar gzip) - PDF-dokument (gzip-komprimert) - PDF-document (ingepakt met gzip) - PDF-dokument (pakka med gzip) - Dokument PDF (kompresja gzip) - Documento PDF (compactado com gzip) - Document PDF (comprimat gzip) - документ PDF (сжатый gzip) - Dokument PDF (komprimovaný pomocou gzip) - Dokument PDF (stisnjen z gzip) - Dokument PDF (i kompresuar me gzip) - PDF-dokument (gzip-komprimerat) - PDF belgesi (gzip ile sıkıştırılmış) - документ PDF (стиснений gzip) - Tài liệu PDF (đã nén gzip) - PDF 文档(gzip 压缩) - PDF 文件 (gzip 格式壓縮) - - - - - - PostScript document (gzip-compressed) - مستند PostScript (مضغوط-gzip) - Dakument PostScript (gzip-skampresavany) - Документ — PostScript, компресиран с gzip - document PostScript (comprimit amb gzip) - Dokument PostScript (komprimovaný pomocí gzip) - PostScript-dokument (gzip-komprimeret) - PostScript-Dokument (gzip-komprimiert) - έγγραφο PostScript (συμπιεσμένο με gzip) - PostScript document (gzip-compressed) - PostScript-dokumento (kunpremita per gzip) - documento PostScript (comprimido con gzip) - PostScript dokumentua (gzip-konprimitua) - PostScript-asiakirja (gzip-pakattu) - PostScript skjal (gzip-stappað) - document PostScript (compressé gzip) - cáipéis PostScript (comhbhrúite le gzip) - documento PostScript (comprimido con gzip) - מסמך PostScript (מכוות ע"י gzip) - PostScript-dokumentum (gzip-pel tömörítve) - Dokumen PostScript (terkompresi gzip) - Documento PostScript (compresso con gzip) - PostScript ドキュメント (gzip 圧縮) - PostScript құжаты (gzip-пен сығылған) - 포스트스크립트 문서 (GZIP 압축) - PostScript dokumentas (suglaudintas su gzip) - PostScript dokuments (saspiests ar gzip) - Dokumen PostScript (dimampatkan-gzip) - PostScript-dokument (gzip-komprimert) - PostScript-document (ingepakt met gzip) - PostScript-dokument (pakka med gzip) - Dokument Postscript (kompresja gzip) - documento PostScript (comprimido com gzip) - Documento PostScript (compactado com gzip) - Document PostScript (comprimat gzip) - документ PostScript (сжатый gzip) - Dokument PostScript (komprimovaný pomocou gzip) - Dokument PostScript (stisnjen z gzip) - Dokument PostScript (i kompresuar me gzip) - Постскрипт документ (компресована gzip-ом) - Postscript-dokument (gzip-komprimerat) - документ PostScript (стиснене gzip) - Tài liệu PostScript (đã nén gzip) - PostScript 文档(gzip 压缩) - PostScript 文件 (gzip 格式壓縮) - - - - - - HDF document - مستند HDF - HDF sənədi - Dakument HDF - Документ — HDF - document HDF - Dokument HDF - Dogfen HDF - HDF-dokument - HDF-Dokument - έγγραφο HDF - HDF document - HDF-dokumento - documento HDF - HDF dokumentua - HDF-asiakirja - HDF skjal - document HDF - cáipéis HDF - documento HDF - מסמך HDF - HDF dokument - HDF-dokumentum - Dokumen HDF - Documento HDF - HDF ドキュメント - HDF құжаты - HDF 문서 - HDF dokumentas - HDF dokuments - Dokumen HDF - HDF-dokument - HDF-document - HDF-dokument - Dokument HDF - documento HDF - Documento HDF - Document HDF - документ HDF - Dokument HDF - Dokument HDF - Dokument HDF - HDF документ - HDF-dokument - документ HDF - Tài liệu HDF - HDF 文档 - HDF 文件 - HDF - Hierarchical Data Format - - - - - - - - - - - - - IFF file - IFF - Interchange File Format - - - - - - iPod firmware - برنامج عتاد الـiPod - Firmware iPod - Фърмуер за iPod - microprogramari d'iPod - Firmware iPod - iPod-styreprogram - iPod-Firmware - εικόνα μνήμης firmware iPod - iPod firmware - iPod-mikroprogramaro - firmware de iPod - iPod firmwarea - iPod-laiteohjelmisto - iPod fastbúnaður - firmware iPod - dochtearraí iPod - firmware de iPod - קושחת ipod - iPod-firmware - peranti tegar iPod - Firmware iPod - iPod ファームウェア - iPod микробағдарламасы - iPod 펌웨어 - iPod programinė įranga - iPod aparātprogrammatūra - Firmware iPod - iPod-firmware - iPod-firmware - iPod-firmvare - Oprogramowanie wewnętrzne iPod - 'firmware' iPod - Firmware do iPod - Firmware iPod - микропрограмма iPod - Firmware iPod - Programska strojna oprema iPod - Firmware iPod - iPod програм - fast iPod-program - мікропрограма iPod - phần vững iPod - iPod 固件 - iPod 韌體 - - - - - - Java archive - أرشيف Java - Archiŭ Java - Архив — Java - arxiu Java - Archiv Java - Javaarkiv - Java-Archiv - αρχείο Java - Java archive - Java-arkivo - archivador Java - Java artxiboa - Java-arkisto - Java skjalasavn - archive Java - cartlann Java - arquivo Java - ארכיון Java - Java arhiva - Java-archívum - Arsip Java - Archivio Java - Java アーカイブ - Java архиві - 자바 묶음 파일 - Java archyvas - Java arhīvs - Arkib Java - Java-arkiv - Java-archief - Java-arkiv - Archiwum Java - arquivo Java - Pacote Java - Arhivă Java - архив Java - Archív Java - Datoteka arhiva Java - Arkiv Java - Јава архива - Java-arkiv - Java arşivi - архів Java - Kho nén Java - Java 归档文件 - Java 封存檔 - - - - - - - - Java class - صنف java - Klasa Java - Клас на Java - classe Java - Třída Java - Javaklasse - Java-Klasse - κλάση Java - Java class - Java-klaso - clase Java - Java-ko klasea - Java-luokka - Java flokkur - classe Java - aicme Java - clase de Java - מחלקת Java - Java klasa - Java-osztály - Kelas Java - Classe Java - Java クラス - Java класы - 자바 클래스 - Java klasė - Java klase - Kelas Java - Java-klasse - Java-klasse - Java-klasse - Klasa Java - classe Java - Classe Java - Clasă Java - класс Java - Trieda Java - Datoteka razreda Java - Klasë Java - Јава класа - Java-klass - Java sınıfı - клас Java - Hạng Java - Java 类 - Java class - - - - - - - - - - - - JNLP file - ملف JNLP - Fajł JNLP - Файл — JNLP - fitxer JNLP - Soubor JNLP - JNPL-fil - JNLP-Datei - αρχείο JNLP - JNLP file - JNLP-dosiero - archivo JNPL - JNLP fitxategia - JNLP-tiedosto - JNLP fíla - fichier JNLP - comhad JNLP - ficheiro JNLP - קובץ JNLP - JNLP datoteka - JNLP fájl - Berkas JNLP - File JNPL - JNLP ファイル - JNLP файлы - JNLP 파일 - JNLP failas - JNLP datne - JNLP-fil - JNLP-bestand - JNLP-fil - Plik JNLP - Arquivo JNLP - Fișier JNLP - файл JNLP - Súbor JNLP - Datoteka JNLP - File JNLP - JNLP-fil - JNLP dosyası - файл JNLP - Tập tin JNLP - JNLP 文件 - JNLP 檔案 - JNLP - Java Network Launching Protocol - - - - - - - - - Java keystore - مخزن مفاتيح جافا - Ключодържател — Java - magatzem de claus Java - Java keystore - Javanøglelager - Java-Schlüsselbund - χώρος αποθήκευσης κλειδιών Java - Java keystore - almacén de claves de Java - Java-ren gako-biltegia - Java-avainvarasto - Java lyklagoymsla - stockage de clés Java - eochairstór Java - almacén de chaves de Java - הקשת מקלדת של Java - Java kulcstároló - Penyimpanan kunci Java - Keystore Java - Java キーストア - Java сақталымы - 자바 키 저장소 - Java raktų saugykla - Java keystore - Java keystore - Baza kluczy Java - Keystore de Java - Stocare chei Java - хранилище ключей Java - Úložisko kľúčov Java - Datoteka tipkovne razporeditve Java - Java-nyckellager - сховище ключів Java - Java 密钥库 - Java 金鑰儲存 - - - - - - - - - Java JCE keystore - مخزن مفاتيح Java JCE - Ключодържател — Java JCE - magatzem de claus JCE Java - Java JCE keystore - Java JCE-nøglelager - Java JCE-Schlüsselbund - Java JCE keystore - almacén de claves JCE de Java - Java JCE-ren gako-biltegia - Java JCE -avainvarasto - Java JCE lyklagoymsla - stockage de clés Java JCE - eochairstór Java JCE - almacén de chves JCE de Java - הקשה מסוג Java JCE - Java JCE kulcstároló - Penyimpanan kunci Java JCE - Keystore Java JCE - Java JCE キーストア - Java JCE сақталымы - 자바 JCE 키 저장소 - Java JCE raktų saugykla - Java JCE keystore - Java JCE keystore - Baza kluczy Java JCE - Keystore JCE do Java - Stocare chei Java JCE - хранилище ключей Java JCE - Úložisko kľúčov Java JCE - Datoteka tipkovne razporeditve Java JCE - Java JCE-nyckellager - сховище ключів JCE Java - Java JCE 密钥库 - Java JCE 金鑰儲存 - JCE - Java Cryptography Extension - - - - - - - Pack200 Java archive - أرشيف Pack200 Java - Archiŭ Pack200 Java - Архив — Java Pack200 - arxiu Java Pack200 - Archiv Java Pack200 - Pack200 Java-arkiv - Pack200-Java-Archiv - αρχείο Java Pack200 - Pack200 Java archive - archivador Pack200 Java - Pack2000 Java artxiboa - Pack200-Java-arkisto - Pack200 Java skjalasavn - archive Java Pack200 - cartlann Java Pack200 - arquivo Pack200 Java - ארכיון מסוג Pack200 Java - Pack200 Java-archívum - Arsip Pack200 Java - Archivio Pack200 Java - Pack200 Java アーカイブ - Pack200 Java архиві - Pack200 자바 압축 파일 - Pack200 Java archyvas - Pack200 Java arhīvs - Pack200 Java-arkiv - Pack200 Java-archief - Pack200 Java-arkiv - Archiwum Java Pack200 - Pacote Java Pack200 - Arhivă Java Pack2000 - архив Java Pack200 - Archív Java Pack200 - Datoteka arhiva Pack200 Java - Arkiv Java Pack200 - Pack200 Java-arkiv - Pack200 Java arşivi - архів Java Pack200 - Kho nén Java Pack200 - Pack200 Java 归档文件 - Pack200 Java 封存檔 - - - - - - - - JavaScript program - برنامج جافاسكربت - Prahrama JavaScript - Програма на JavaScript - programa JavaScript - Program v JavaScriptu - JavaScript-program - JavaScript-Programm - πρόγραμμα JavaScript - JavaScript program - JavaScript-programo - programa en JavaScript - JavaScript programa - JavaScript-ohjelma - JavaScript forrit - programme JavaScript - ríomhchlár JavaScript - programa JavaScript - תכנית JavaScript - JavaScript program - JavaScript-program - Program JavaScript - Programma JavaScript - JavaScript プログラム - JavaScript бағдарламасы - 자바스크립트 프로그램 - JavaScript programa - JavaScript programma - Program JavaScript - JavaScript-program - JavaScript-programma - JavaScript-program - Pogram JavaScript - Programa JavaScript - Program JavaScript - сценарий JavaScript - Program jazyka JavaScript - Programska datoteka JavaScript - Program JavaScript - JavaScript-program - JavaScript programı - програма мовою JavaScript - Chương trình JavaScript - Javascript 程序 - JavaScript 程式 - - - - - - - - JBuilder project - مشروع JBuilder - Prajekt JBuilder - Проект — JBuilder - projecte de JBuilder - Projekt JBuilder - JBuilder-projekt - JBuilder-Projekt - έργο JBuilder - JBuilder project - JBuilder-projekto - proyecto JBuilder - JBuilder proiektua - JBuilder-projekti - JBuilder verkætlan - projet JBuilder - tionscadal JBuilder - proxecto de JBuilder - מיזם JBuilder - JBuilder projekt - JBuilder-projekt - Proyek JBuilder - Progetto JBuilder - JBuilder プロジェクト - JBuilder жобасы - JBuilder 프로젝트 - JBuilder projektas - JBuilder projekts - Projek JBuilder - JBuilder-prosjekt - JBuilder-project - JBuilder-prosjekt - Projekt JBuilder - projecto JBuilder - Projeto do JBuilder - Proiect JBuilder - проект JBuilder - Projekt JBuilder - Datoteka projekta JBuilder - Projekt JBuilder - JBuilder пројекат - JBuilder-projekt - JBuilder projesi - проект JBuilder - Dự án JBuilder - JBuilder 工程 - JBuilder 專案 - - - - - - Karbon14 drawing - تصميم Karbon14 - Rysunak Karbon14 - Чертеж — Karbon14 - dibuix de Karbon14 - Kresba Karbon14 - Karbon14-tegning - Karbon14-Zeichnung - σχέδιο Karbon14 - Karbon14 drawing - Karbon14-grafikaĵo - dibujo de Karbon14 - Karbon14 marrazkia - Karbon14-piirros - Karbon14 tekning - dessin Karbon14 - líníocht Karbon14 - debuxo de Karbon14 - ציור Karbon14 - Karbon14 crtež - Karbon14-rajz - Gambar Karbon14 - Disegno Karbon14 - Karbon14 ドロー - Karbon14 суреті - Karbon14 그림 - Karbon14 piešinys - Karbon14 zīmējums - Lukisan Karbon14 - Karbon14-tegning - Karbon14-tekening - Karbon14-teikning - Rysunek Karbon14 - desenho Karbon14 - Desenho do Karbon14 - Desen Karbon14 - изображение Karbon14 - Kresba Karbon14 - Datoteka risbe Karbon14 - Vizatim Karbon14 - Karbon14 цртеж - Karbon14-teckning - Karbon14 çizimi - малюнок Karbon14 - Bản vẽ Karbon14 - Karbon14 绘图 - Karbon14 繪圖 - - - - - - - - - - - - - - - - - KChart chart - رسم بياني KChart - Hrafik KChart - Диаграма — KChart - diagrama de KChart - Graf Chart - KChart-diagram - KChart-Diagramm - γράφημα KChart - KChart chart - KChart-diagramo - gráfica de KChart - KChart diagrama - KChart-kaavio - KChart strikumynd - graphique KChart - cairt KChart - gráfica de KChart - תרשים KChart - KChart grafikon - KChart-grafikon - Bagan KChart - Grafico KChart - KChart チャート - KChart диаграммасы - KChart 차트 - KChart diagrama - KChart diagramma - Carta KChart - KChart-graf - KChart-grafiek - KChart-diagram - Wykres KChart - gráfico KChart - Gráfico do KChart - Diagramă KChart - диаграмма KChart - Graf KChart - Datoteka grafikona KChart - Grafik KChart - KChart графикон - KChart-diagram - діаграма KChart - Sơ đồ KChart - KChart 图表 - KChart 圖表 - - - - - - - - - - - - - - - - - Kexi settings for database server connection - إعدادات Kexi للإتصال بخادم قاعدة البيانات - Връзка към база от данни — Kexi - configuració del Kexi per a la connexió al servidor de bases de dades - Nastavení Kexi ke spojení s databázovým serverem - Kexiopsætning til forbindelsen for databaseserveren - Kexi-Einstellungen für Verbindung zum Datenbankserver - ρυθμίσεις Kexi για σύνδεση με εξυπηρετητή βάσεων δεδομένων - Kexi settings for database server connection - configuración de Kexi para la conexión con el servidor de bases de datos - Kexi-ren ezarpenak datu-basearen zerbitzariarekin konektatzeko - Kexi-tietokantayhteysasetukset - Kexi stillingar fyri dátustovnsambætara sambinding - paramètres Kexi pour connexion au serveur de base de données - socruithe Kexi do cheangal le freastalaí bunachair sonraí - configuración de Kexi para conexión con servidor de base de datos - הגדרות של Kexi עבור חיבור שרת לבסיס נתונים - Kexi beállítások adatbáziskiszolgáló-kapcsolathoz - Tatanan Kexi bagi koneksi server basis data - Impostazioni Kexi per connessione a server di database - データベースサーバ接続用の Kexi 設定 - Дерекқор серверге байланыс Kexi баптаулары - Kexi 데이터베이스 서버 연결 설정 - Kexi duomenų bazės ryšio su serveriu parametrai - Kexi iestatījumi datubāzes servera savienojumam - Kexi instellingen voor database server connectie - Ustawienia Kexi dla połączenia serwera bazy danych - Configurações do Kexi para conexão a servidor de banco de dados - Configurări Kexi pentru conexiunea la serverul de baze de date - параметры Kexi для подключения к серверу БД - Nastavenia Kexi pre pripojenie k databázovému serveru - Strežniška povezava do nastavitvene datoteke Kexi. - Kexi-inställningar för anslutning till databasserver - параметри Kexi для встановлення з’єднання з сервером бази даних - Kexi 数据库服务器连接设置 - Kexi 設定值 (資料庫伺服器連線用) - - - - shortcut to Kexi project on database server - اختصار لمشروع Kexi على خادم قاعدة بيانات - Връзка към проект — Kexi - drecera a projecte del Kexi en un servidor de base de dades - Zástupce projektu Kexi na databázovém serveru - genvej til Kexiprojekt på databaseserver - Schnellzugriff zum Kexi-Projekt auf dem Datenbankserver - συντόμευση σε έργο Kexi στον εξυπηρετητή βάσης δεδομένων - shortcut to Kexi project on database server - acceso directo a proyecto Kexi en el servidor de bases de datos - lasterbidea datu-basearen zerbitzariko Kexi proiekturako - snarvegur til Kexi verkætlan á dátustovnsambætara - raccourci vers projet Kexi sur serveur de base de données - aicearra go tionscadal Kexi ar fhreastalaí bunachair sonraí - acceso directo a proxecto Kexi no servidor de bases de datos - קיצור דרך לפרוירט Kexi בשרת נתונים - prečac za Kexi projekt na poslužitelju baze podataka - indítóikon adatbázis-kiszolgálón lévő Kexi projektre - pintasan ke projek Kexi pada server basis data - Scorciatoia a progetto Kexi su server di database - データベースサーバの Kexi プロジェクトへのショートカット - дерекқор серверіндегі Kexi жобасына сілтеме - 데이터베이스 서버의 Kexi 프로젝트 바로 가기 - nuoroda į Kexi projektą duomenų bazės serveryje - īsceļš uz Kexi projektu datubāzes serverī - shortcut naar Kexi project op database server - Skrót do projektu Kexi na serwerze bazy danych - Atalho para projeto Kexi no servidor de banco de dados - scurtătură către un proiect Kexi pe un server de baze de date - ссылка на проект Kexi на сервере БД - bližnjica do Kexi projekta na podatkovnem strežniku - genväg till Kexi-projekt på databasserver - скорочення для проекту Kexi на сервері бази даних - 数据库服务器上 Kexi 项目的快捷方式 - 資料庫伺服器上 Kexi 專案的捷徑 - - - - Kexi database file-based project - مشروع قاعدة بيانات Kexi يعتمد على ملفات - Проект с база от данни — Kexi - projecte basat en fitxer de base de dades del Kexi - Projekt založený na souboru databáze Kexi - Filbaseret projekt for Kexidatabase - Dateibasiertes Kexi-Datenbankprojekt - Kexi database file-based project - proyecto basado en el archivo-base de datos Kexi - Kexi datu-baseko fitxategian oinarritutako proiektua - Kexi dátustovns fílugrundað verkætlan - projet de base de données Kexi en mode fichier - tionscadal bunachair sonraí Kexi bunaithe ar chomhaid - proxecto baseado no ficheiro-base de datos Kexi - פרויקט בסיס נתונים מבוסס-קובץ של Kexi - Kexi adatbázisfájl-alapú projekt - Projek berbasis berkas basis data Kexi - Progetto su file di database Kexi - Kexi データベース ファイルベースプロジェクト - Файл негізінде жоба үшін Kexi дерекқоры - Kexi 데이터베이스 파일 기반 프로젝트 - Kexi duomenų bazės failo tipo projektas - Kexi datubāzes datnes balstīts projekts - Kexi database bestandgebaseerd project - Projekt bazy danych Kexi oparty na pliku - Projeto de banco de dados baseado em arquivo do Kexi - Proiect bazat pe fișiere al bazei de date Kexi - файловый проект базы данных Kexi - Datoteka projekta podatkovne zbirke Kexi - Kexi-databas för filbaserat projekt - проект файлової бази даних Kexi - Kexi 基于文件的数据库项目 - Kexi 資料庫檔案基礎專案 - - - - - Kexi database file-based project - مشروع قاعدة بيانات Kexi يعتمد على ملفات - Проект с база от данни — Kexi - projecte basat en fitxer de base de dades del Kexi - Projekt založený na souboru databáze Kexi - Filbaseret projekt for Kexidatabase - Dateibasiertes Kexi-Datenbankprojekt - Kexi database file-based project - proyecto basado en el archivo-base de datos Kexi - Kexi datu-baseko fitxategian oinarritutako proiektua - Kexi dátustovns fílugrundað verkætlan - projet de base de données Kexi en mode fichier - tionscadal bunachair sonraí Kexi bunaithe ar chomhaid - proxecto baseado no ficheiro-base de datos Kexi - פרויקט בסיס נתונים מבוסס-קובץ של Kexi - Kexi adatbázisfájl-alapú projekt - Projek berbasis berkas basis data Kexi - Progetto su file di database Kexi - Kexi データベース ファイルベースプロジェクト - Файл негізінде жоба үшін Kexi дерекқоры - Kexi 데이터베이스 파일 기반 프로젝트 - Kexi duomenų bazės failo tipo projektas - Kexi datubāzes datnes balstīts projekts - Kexi database bestandgebaseerd project - Projekt bazy danych Kexi oparty na pliku - Projeto de banco de dados baseado em arquivo do Kexi - Proiect bazat pe fișiere al bazei de date Kexi - файловый проект базы данных Kexi - Datoteka projekta podatkovne zbirke Kexi - Kexi-databas för filbaserat projekt - проект файлової бази даних Kexi - Kexi 基于文件的数据库项目 - Kexi 資料庫檔案基礎專案 - - - - - - - KFormula formula - صيغة KFormula - Formuła KFormula - Формула — KFormula - fórmula de KFormula - Vzorec KFormula - KFormula-formel - KFormula-Formel - μαθηματικός τύπος KFormula - KFormula formula - KFormula-formulo - fórmula de KFormula - KFormula formula - KFormula-kaava - KFormula frymil - formule KFormula - foirmle KFormula - fórmula de KFormula - נוסחת KFormula - KFormula formula - KFormula-képlet - Formula KFormula - Formula KFormula - KFormula 計算式 - KFormula формуласы - KFormula 수식 - KFormula formulė - KFormula formula - Formula KFormula - KFormula-formel - KFormula-formule - KFormula-formel - Formuła KFormula - fórmula KFormula - Fórmula do KFormula - Formulă KFormula - формула KFormula - Vzorec KFormula - Datoteka formule KFormula - Formulë KFormula - KFormula формула - KFormula-formel - KFormula formülü - формула KFormula - Công thức KFormula - KFormula 公式 - KFormula 公式 - - - - - - - - - - - - - - - - - KIllustrator drawing - تصميم KIllustrator - Rysunak KIllustrator - Чертеж — KIllustrator - dibuix de KIllustrator - Kresba KIllustrator - KIllustrator-tegning - KIllustrator-Zeichnung - σχέδιο KIllustrator - KIllustrator drawing - KIllustrator-grafikaĵo - dibujo de KIllustrator - KIllustrator marrazkia - KIllustrator-piirros - KIllustrator tekning - dessin KIllustrator - líníocht KIllustrator - debuxo de KIllustrator - ציור KIllustrator - KIllustrator crtež - KIllustrator-rajz - Gambar KIllustrator - Disegno KIllustrator - KIllustrator ドロー - KIllustrator суреті - KIllustrator 그림 - KIllustrator piešinys - KIllustrator zīmējums - Lukisan KIllustrator - KIllustrator-tegning - KIllustrator-tekening - KIllustrator-teikning - Rysunek KIllustrator - desenho KIllustrator - Desenho do KIllustrator - Desen KIllustrator - изображение KIllustrator - Kresba KIllustrator - Datoteka risbe KIllustrator - Vizatim KIllustrator - KIllustrator цртеж - KIllustrator-teckning - KIllustrator çizimi - малюнок KIllustrator - Bản vẽ KIllustrator - KIllustrator 绘图 - KIllustrator 繪圖 - - - - - - - - - - - - Kivio flowchart - قائمة تدفق Kivio - Blok-schiema Kivio - Диаграма — Kivio - diagrama de flux de Kivio - Vývojový diagram Kivio - Kiviorutediagram - Kivio-Flussdiagramm - διάγραμμα ροής Kivio - Kivio flowchart - Kivo-fluskemo - diagrama de flujo de Kivio - Kivio diagrama - Kivio-vuokaavio - Kivio leiðarit - diagramme de flux Kivio - sreabhchairt Kivio - gráfica de fluxo de Kivio - תרשים זרימה של Kivio - Kivio dijagram toka - Kivio-folyamatábra - Bagan Kivio - Diagramma di flusso Kivio - Kivio フローチャート - Kivio диаграммасы - Kivio 흐름도 - Kivio eigos diagrama - Kivio blokshēma - Cartalir Kivio - Kivio-flytdiagram - Kivio-stroomschema - Kivio-flytdiagram - Diagram przepływów Kivio - gráfico de fluxo Kivio - Fluxograma do Kivio - Diagramă Kivio - диаграмма Kivio - Vývojový diagram Kivio - Datoteka grafikona Kivio - Diagramë fluksi Kivio - Kivio дијаграм - Kivio-flödesschema - блок-схема Kivio - Lược đồ Kivio - Kivio 流程图 - Kivio 圖表 - - - - - - - - - - - - - - - - - Kontour drawing - تصميم Kontour - Rysunak Kontour - Чертеж — Kontour - dibuix de Kontour - Kresba Kontour - Kontourtegning - Kontour-Zeichnung - σχέδιο Kontour - Kontour drawing - Kontour-grafikaĵo - dibujo de Kontour - Kontour marrazkia - Kontour-piirros - Kontour tekning - dessin Kontour - líníocht Kontour - debuxo de Kontour - ציור Kontour - Kontour crtež - Kontour-rajz - Gambar Kontour - Disegno Kontour - Kontour ドロー - Kontour суреті - Kontour 그림 - Kontour piešinys - Kontour zīmējums - Lukisan Kontour - Kontour-tegning - Kontour-tekening - Kontour-teikning - Rysunek Kontour - desenho Kontour - Desenho do Kontour - Desen Kontour - изображение Kontour - Kresba Kontour - Datoteka risbe Kontour - Vizatim Kontour - Kontour цртеж - Kontour-teckning - Kontour çizimi - малюнок Kontour - Bản vẽ Kontour - Kontour 绘图 - Kontour 繪圖 - - - - - - - - - - - - - - - - - KPovModeler scene - مشهد KPovModeler - Scena KPovModeler - Сцена — KPovModeler - escena de KPovModeler - Scéna KPovModeler - KPovModeler-scene - KPovModeler-Szene - σκηνή KPovModeler - KPovModeler scene - KPovModeler-sceno - escena de KPovModeler - KPovModeler eszena - KPovModeler-näkymä - KPovModeler leikmynd - scène KPovModeler - radharc KPovModeler - escena de KPovModeler - סצנת KPovModeler - KPovModeler scena - KPovModeler-jelenet - Scene KPovModeler - Scena KPovModeler - KPovModeler シーン - KPovModeler сахнасы - KPovModeler 장면 - KPovModeler scena - KPovModeler aina - Babak KPovModeler - KPovModeler-scene - KPovModeler-scène - KPovModeler-scene - Scena KPovModeler - cenário KPovModeler - Cena do KPovModeler - Scenă KPovModeler - сцена KPovModeler - Scéna KPovModeler - Datoteka scene KPovModeler - Skenë KPovModeler - KPovModeler сцена - KPovModeler-scen - сцена KPovModeler - Cảnh KPovModeler - KPovModeler 场景 - KPovModeler 場景 - - - - - KPresenter presentation - عرض تقديمي KPresenter - Prezentacyja KPresenter - Презентация — KPresenter - presentació de KPresenter - Prezentace KPresenter - KPresenter-præsentation - KPresenter-Präsentation - παρουσίαση KPresenter - KPresenter presentation - KPresenter-prezentaĵo - presentación de KPresenter - Kpresenter aurkezpena - KPresenter-esitys - KPresenter framløga - présentation KPresenter - láithreoireacht KPresenter - presentación de KPresenter - מצגת KPresenter - KPresenter prezentacija - KPresenter-bemutató - Presentasi KPresenter - Presentazione KPresenter - KPresenter プレゼンテーション - KPresenter презентациясы - KPresenter 프리젠테이션 - KPresenter pateiktis - KPresenter prezentācija - Persembahan Kpresenter - KPresenter-presentasjon - KPresenter-presentatie - KPresenter-presentasjon - Prezentacja KPresenter - apresentação KPresenter - Apresentação do KPresenter - Prezentare KPresenter - презентация KPresenter - Prezentácia KPresenter - Predstavitev KPresenter - Prezantim i KPresenter - KPresenter презентација - KPresenter-presentation - KPresenter sunum dosyası - презентація KPresenter - Trình diễn KPresenter - KPresenter 演示文稿 - KPresenter 簡報檔 - - - - - - - - - - - - - - - - - - Krita document - مستند Krita - Dakument Krita - Документ — Krita - document de Krita - Dokument Krita - Kritadokument - Krita-Dokument - έγγραφο Krita - Krita document - Krita-dokumento - documento de Krita - Krita dokumentua - Krita-asiakirja - Krita skjal - document Krita - cáipéis Krita - documento de Krita - מסמך Krita - Krita dokument - Krita-dokumentum - Dokumen Krita - Documento Krita - Krita ドキュメント - Krita құжаты - Krita 문서 - Krita dokumentas - Krita dokuments - Dokumen Krita - Krita-dokument - Krita-document - Krita-dokument - Dokument Krita - documento Krita - Documento do Krita - Document Krita - документ Krita - Dokument Krita - Dokument Krita - Dokument Krita - Krita документ - Krita-dokument - Krita belgesi - документ Krita - Tài liệu Krita - Krita 文档 - Krita 文件 - - - - - - - - - - - - - - - - - KSpread spreadsheet - جدول KSpread - Raźlikovy arkuš KSpread - Таблица — KSpread - full de càlcul de KSpread - Sešit KSpread - KSpread-regneark - KSpread-Tabelle - λογιστικό φύλλο KSpread - KSpread spreadsheet - KSpread-kalkultabelo - hoja de cálculo de KSpread - KSpread kalkulu-orria - KSpread-taulukko - KSpread rokniark - feuille de calcul KSpread - scarbhileog KSpread - folla de cálculo de KSpread - גליון נתונים של Kspread - KSpread proračunska tablica - KSpread-munkafüzet - Lembar sebar KSpread - Foglio di calcolo KSpread - KSpread スプレッドシート - KSpread электрондық кестесі - KSpread 스프레드시트 - KSpread skaičialentė - KSpread izklājlapa - Hamparan KSpread - KSpread-regneark - KSpread-rekenblad - KSpread-rekneark - Arkusz KSpread - folha de cálculo KSpread - Planilha do KSpread - Foaie de calcul KSpread - электронная таблица KSpread - Zošit KSpread - Preglednica KSpread - Fletë llogaritjesh KSpread - KSpread табеларни прорачун - KSpread-kalkylblad - ел. таблиця KSpread - Bảng tính KSpread - KSpread 工作簿 - KSpread 試算表 - - - - - - - - - - - - - - - - - KSpread spreadsheet (encrypted) - جدول KSpread (مشفر) - Raźlikovy arkuš KSpread (zašyfravany) - Таблица — KSpread, шифрирана - full de càlcul de KSpread (xifrat) - Sešit KSpread (šifrovaný) - KSpread-regneark (krypteret) - KSpread-Tabelle (verschlüsselt) - λογιστικό φύλλο KSpread (κρυπτογραφημένο) - KSpread spreadsheet (encrypted) - KSpread-kalkultabelo (ĉifrita) - hoja de cálculo de KSpread (cifrada) - KSpread kalkulu-orria (enkriptatua) - KSpread-taulukko (salattu) - KSpread rokniark (bronglað) - feuille de calcul KSpread (chiffrée) - scarbhileog KSpread (criptithe) - folla de cálculo de KSpread (cifrada) - גליון נתונים של KSpread (מוצפן) - KSpread proračunska tablica (šifrirana) - KSpread-munkafüzet (titkosított) - Lembar sebar KSpread (terenkripsi) - Foglio di calcolo KSpread (cifrato) - KSpread (暗号化) スプレッドシート - KSpread электрондық кестесі (шифрленген) - 암호화된 KSpread 스프레드시트 - KSpread skaičialentė (užšifruota) - KSpread izklājlapa (šifrēta) - Hampatan KSpread (terenkripsi) - KSpread-regneark (kryptert) - KSpread-rekenblad (versleuteld) - Kryptert KSpread-rekneark - Arkusz KSpread (zaszyfrowany) - folha de cálculo KSpread (cifrada) - Planilha do KSpread (criptografada) - Foaie de calcul KSpread (criptat) - электронная таблица KSpread (зашифрованная) - Zošit KSpread (šifrovaný) - Preglednica KSpread (šifrirana) - Fletë llogaritjesh KSpread (e kriptuar) - KSpread табеларни прорачун (шифровани) - KSpread-kalkylblad (krypterat) - ел. таблиця KSpread (зашифрована) - Bảng tính KSpread (đã mật mã) - KSpread 加密工作簿 - KSpread 試算表 (已加密) - - - - - - - KSysV init package - حزمة KSysV init - Inicyjalny pakunak KSysV - Пакет — KSysV init - paquet d'inici KSysV - Balíček init KSysV - KSsV init-pakke - KSysV-Init-Paket - KSysV init package - paquete de configuración de init para KSysV - KSysV hasieratzeko paketea - KSysV init -paketti - KSysV init pakki - paquet d'initialisation KSysV - pacáiste thosú KSysV - paquete de KsysV init - חבילת KSysV init - KSysV init paket - KSysV init csomag - Paket init KSysV - Pacchetto init KSysV - KSysV init パッケージ - KSysV инициализация дестесі - KSysV init 패키지 - KSysV init paketas - KSysV inicializācijas pakotne - KSysV init-pakke - KSysV-init-pakket - KSysV init-pakke - Pakiet KSysV init - Pacote init do KSysV - Pachet KSysV init - пакет инициализации KSysV - Balíček KSysV init - Datoteka paketa KSysV init - Paketë init KSysV - KSysV init-paket - пакунок KSysV init - Gói sở khởi KSysV - KSysV init 软件包 - KSysV init 套件 - - - - - - - - - Kugar document - مستند Kugar - Dakument Kugar - Документ — Kugar - document de Kugar - Dokument Kugar - Kugardokument - Kugar-Dokument - έγγραφο Kugar - Kugar document - Kugar-dokumento - documento de Kugar - Kugar dokumentua - Kugar-asiakirja - Kugar skjal - document Kugar - cáipéis Kugar - documento de Kugar - מסמך Kugar - Kugar dokument - Kugar-dokumentum - Dokumen Kugar - Documento Kugar - KuKrita ドキュメント - Kugar құжаты - Kugar 문서 - Kugar dokumentas - Kugar dokuments - Dokumen Kugar - Kugar-dokument - Kugar-document - Kugar-dokument - Dokument Kuguar - documento Kugar - Documento do Kugar - Document Kugar - документ Kugar - Dokument Kugar - Dokument Kugar - Dokument Kugar - Kugar документ - Kugar-dokument - Kugar belgesi - документ Kugar - Tài liệu Kugar - Kugar 文档 - Kugar 文件 - - - - - KWord document - مستند KWord - Dakument KWord - Документ — KWord - document de KWord - Dokument KWord - Dogfen KWord - KWord-dokument - KWord-Dokument - έγγραφο KWord - KWord document - KWord-dokumento - documento de KWord - KWord dokumentua - KWord-asiakirja - KWord skjal - document KWord - cáipéis KWord - documento de KWord - מסמך KWord - KWord dokument - KWord-dokumentum - Dokumen KWord - Documento KWord - KWord ドキュメント - KWord құжаты - KWord 문서 - KWord dokumentas - KWord dokuments - Dokumen KWord - KWord-dokument - KWord-document - KWord-dokument - Dokument KWord - documento KWord - Documento do KWord - Document KWord - документ KWord - Dokument KWord - Dokument KWord - Dokument KWord - KWord документ - KWord-dokument - KWord belgesi - документ KWord - Tài liệu KWord - KWord 文档 - KWord 文件 - - - - - - - - - - - - - - - - - - KWord document (encrypted) - مستند KWord (مشفر) - Dakument KWord (zašyfravany) - Документ — KWord, шифриран - document de KWord (xifrat) - Dokument KWord (šifrovaný) - KWord-dokument (krypteret) - KWord-Dokument (verschlüsselt) - έγγραφο KWord (κρυπτογραφημένο) - KWord document (encrypted) - KWord-dokumento (ĉifrita) - documento de KWord (cifrado) - KWord dokumentua (enkriptatua) - KWord-asiakirja (salattu) - KWord skjal (bronglað) - document KWord (chiffré) - cáipéis KWord (criptithe) - documento de KWord (cifrado) - מסמך KWord (מוצפן) - KWord dokument (šifriran) - KWord-dokumentum (titkosított) - Dokumen KWord (terenkripsi) - Documento KWord (cifrato) - KWord (暗号化) ドキュメント - KWord құжаты (шифрленген) - 암호화된 KWord 문서 - KWord dokumentas (užšifruotas) - KWord dokuments (šifrēts) - Dokumen Kword (terenkripsi) - KWord-dokument (kryptert) - KWord-document (versleuteld) - Kryptert KWord-dokument - Dokument KWord (zaszyfrowany) - documento KWord (cifrado) - Documento do KWord (criptografado) - Document KWord (criptat) - документ KWord (зашифрованный) - Dokument KWord (šifrovaný) - Dokument KWord (šifriran) - Dokument KWord (i kriptuar) - KWord документ (шифровани) - KWord-dokument (krypterat) - KWord belgesi (şifreli) - документ KWord (зашифрований) - Tài liệu KWord (đã mật mã) - KWord 加密文档 - KWord 文件 (已加密) - - - - - - - LHA archive - أرشيف LHA - LHA arxivi - Archiŭ LHA - Архив — LHA - arxiu LHA - Archiv LHA - Archif LHA - LHA-arkiv - LHA-Archiv - αρχείο LHA - LHA archive - LHA-arkivo - archivador LHA - LHA artxiboa - LHA-arkisto - LHA skjalasavn - archive LHA - cartlann LHA - arquivo LHA - ארכיון LHA - LHA arhiva - LHA-archívum - Arsip LHA - Archivio LHA - LHA アーカイブ - LHA архиві - LHA 압축 파일 - LHA archyvas - LHA arhīvs - Arkib LHA - LHA-arkiv - LHA-archief - LHA-arkiv - Archiwum LHA - arquivo LHA - Pacote LHA - Arhivă LHA - архив LHA - Archív LHA - Datoteka arhiva LHA - Arkiv LHA - LHA архива - LHA-arkiv - LHA arşivi - архів LHA - Kho nén LHA - LHA 归档文件 - LHA 封存檔 - - - - - - - - - - - - - - - - - - - - - LHZ archive - أرشيف LHZ - Archiŭ LHZ - Архив — LHZ - arxiu LHZ - Archiv LHZ - LHZ-arkiv - LHZ-Archiv - αρχείο LHZ - LHZ archive - LHZ-arkivo - archivador LHZ - LHZ artxiboa - LHZ-arkisto - LHZ skjalasavn - archive LHZ - cartlann LHZ - arquivo LHZ - ארכיון LHZ - LHZ arhiva - LHZ-archívum - Arsip LHZ - Archivio LHZ - LHZ アーカイブ - LHZ архиві - LHZ 압축 파일 - LHZ archyvas - LHZ arhīvs - Arkib LHZ - LHZ-arkiv - LHZ-archief - LHZ-arkiv - Archiwum LHZ - arquivo LHZ - Pacote LHZ - Arhivă LHZ - архив LHZ - Archív LHZ - Datoteka arhiva LHZ - Arkiv LHZ - LHZ архива - LHZ-arkiv - LHZ arşivi - архів LHZ - Kho nén LHZ (LHA đã nén) - LHZ 归档文件 - LHZ 封存檔 - - - - - message catalog - كتالوج الرسالة - kataloh paviedamleńniaŭ - Каталог със съобщения - catàleg de missatges - Katalog zpráv - meddelelseskatalog - Nachrichtenkatalog - κατάλογος μηνυμάτων - message catalogue - katalogo de mesaĝoj - catálogo de mensajes - mezuen katalogoa - viestiluettelo - boðskrá - catalogue de messages - catalóg theachtaireachtaí - catálogo de mensaxes - קטלוג הודעות - katalog poruka - üzenetkatalógus - katalog pesan - Catalogo di messaggi - メッセージカタログ - мәлімдемелер каталогы - 메시지 카탈로그 - laiškų katalogas - ziņojumu katalogs - Katalog mesej - meldingskatalog - berichtencatalogus - meldingskatalog - Katalog wiadomości - catálogo de mensagens - Catálogo de mensagens - catalog de mesaje - каталог сообщений - Katalóg správ - katalogov sporočil - Katallog mesazhesh - каталог порука - meddelandekatalog - каталог повідомлень - phân loại thông điệp - 消息库 - 訊息目錄 - - - - - - - - - LyX document - مستند LyX - Dakument LyX - Документ — LyX - document de LyX - Dokument LyX - LyX-dokument - LyX-Dokument - έγγραφο LyX - LyX document - LyX-dokumento - documento de LyX - LyX dokumentua - LyX-asiakirja - LyX skjal - document LyX - cáipéis LyX - documento LyX - מסמך Lyx - LyX dokument - LyX-dokumentum - Dokumen LyX - Documento LyX - LyX ドキュメント - LyX құжаты - LyX 문서 - LyX dokumentas - LyX dokuments - Dokumen LyX - LyX-dokument - LyX-document - LyX-dokument - Dokument LyX - documento LyX - Documento LyX - Document LyX - документ LyX - Dokument LyX - Dokument LyX - Dokument LyX - LyX документ - LyX-dokument - документ LyX - Tài liệu LyX - LyX 文档 - LyX 文件 - - - - - - - - - - Lzip archive - أرشيف Lzip - Архив — lzip - arxiu lzip - Archiv Lzip - Lzip-arkiv - Lzip-Archiv - συμπιεσμένο αρχείο Lzip - Lzip archive - Lzip-arkivo - archivador Lzip - Lzip artxiboa - Lzip-arkisto - Lzip skjalasavn - archive lzip - cartlann Lzip - arquivo Lzip - ארכיון Lzip - Lzip arhiva - Lzip archívum - Arsip Lzip - Archivio Lzip - Lzip アーカイブ - Lzip архиві - LZIP 압축 파일 - Lzip archyvas - Lzip arhīvs - Lzip archief - Archiwum lzip - Pacote Lzip - Arhivă Lzip - архив LZIP - Archív Lzip - Datoteka arhiva Lzip - Lzip-arkiv - архів lzip - Lzip 归档文件 - Lzip 封存檔 - - - - - - - - LZMA archive - أرشيف LZMA - Archiŭ LZMA - Архив — LZMA - arxiu LZMA - Archiv LZMA - LZHA-arkiv - LZMA-Archiv - συμπιεσμένο αρχείο LZMA - LZMA archive - LZMA-arkivo - archivador LZMA - LZMA artxiboa - LZMA-arkisto - LZMA skjalasavn - archive LZMA - cartlann LZMA - arquivo LZMA - ארכיון LZMA - LZMA arhiva - LZMA-archívum - Arsip LZMA - Archivio LZMA - LZMA アーカイブ - LZMA архиві - LZMA 압축 파일 - LZMA archyvas - LZMA arhīvs - LZMA-arkiv - LZMA-archief - LZMA-arkiv - Archiwum LZMA - Pacote LZMA - Arhivă LZMA - архив LZMA - Archív LZMA - Datoteka arhiva LZMA - Arkiv LZMA - LZMA-arkiv - LZMA arşivi - архів LZMA - Kho nén LZMA - LZMA 归档文件 - LZMA 封存檔 - LZMA - Lempel-Ziv-Markov chain-Algorithm - - - - - Tar archive (LZMA-compressed) - أرشيف Tar (مضغوط-LZMA) - Archiŭ tar (LZMA-skampresavany) - Архив — tar, компресиран с LZMA - arxiu tar (comprimit amb LZMA) - Archiv tar (komprimovaný pomocí LZMA) - Tar-arkiv (LZMA-komprimeret) - Tar-Archiv (LZMA-komprimiert) - αρχείο Tar (συμπιεσμένο με LZMA) - Tar archive (LZMA-compressed) - archivador Tar (comprimido con LZMA) - Tar artxiboa (LZMA-rekin konprimitua) - Tar-arkisto (LZMA-pakattu) - Tar skjalasavn (LZMA-stappað) - archive tar (compression LZMA) - cartlann Tar (comhbhrúite le LZMA) - arquivo Tar (comprimido con LZMA) - ארכיון Tar (מכווץ ע"י LZMA) - Tar arhiva (komprimirana LZMA-om) - Tar archívum (LZMA-val tömörítve) - Arsip Tar (terkompresi LZMA) - Archivio tar (compresso con LZMA) - Tar アーカイブ (LZMA 圧縮) - Tar архиві (LZMA-мен сығылған) - TAR 묶음 파일 (LZMA 압축) - Tar archyvas (suglaudintas su LZMA) - Tar arhīvs (saspiests ar LZMA) - Tar-arkiv (LZMA-komprimert) - Tar-archief (ingepakt met LZMA) - Tar-arkiv (pakka med LZMA) - Archiwum tar (kompresja LZMA) - Pacote tar (compactado com LZMA) - Arhivă Tar (comprimată LZMA) - архив TAR (сжатый LZMA) - Archív tar (komprimovaný pomocou LZMA) - Datoteka arhiva Tar (stisnjen z LZMA) - Arkiv tar (i kompresuar me LZMA) - Tar-arkiv (LZMA-komprimerat) - архів tar (стиснений LZMA) - Kho nén tar (đã nén LZMA) - Tar 归档文件 (LZMA 压缩) - Tar 封存檔 (LZMA 格式壓縮) - - - - - - - LZO archive - أرشيف LZO - Archiŭ LZO - Архив — LZO - arxiu LZO - Archiv LZO - LZO-arkiv - LZO-Archiv - αρχείο LZO - LZO archive - LZO-arkivo - archivador LZO - LZO artxiboa - LZO-arkisto - LZO skjalasavn - archive LZO - cartlann LZO - arquivo LZO - ארכיון LZO - LZO arhiva - LZO-archívum - Arsip LZO - Archivio LZO - LZO アーカイブ - LZO архиві - LZO 압축 파일 - LZO archyvas - LZO arhīvs - Arkib LZO - LZO-arkiv - LZO-archief - LZO-arkiv - Archiwum LZO - arquivo LZO - Pacote LZO - Arhivă LZO - архив LZO - Archív LZO - Datoteka arhiva LZO - Arkiv LZO - LZO архива - LZO-arkiv - LZO arşivi - архів LZO - Kho nén LZO - LZO 归档文件 - LZO 封存檔 - LZO - Lempel-Ziv-Oberhumer - - - - - - - - MagicPoint presentation - عرض تقديمي MagicPoint - Prezentacyja MagicPoint - Презентация — MagicPoint - presentació de MagicPoint - Prezentace MagicPoint - Cyflwyniad MagicPoint - MagicPoint-præsentation - MagicPoint-Präsentation - παρουσίαση MagicPoint - MagicPoint presentation - MagicPoint-prezentaĵo - presentación de MagicPoint - MagicPoint aurkezpena - MagicPoint-esitys - MagicPoint framløga - présentation MagicPoint - láithreoireacht MagicPoint - presentación de MagicPoint - מצגת MagicPoint - MagicPoint prezentacija - MagicPoint-bemutató - Presentasi MagicPoint - Presentazione MagicPoint - MagicPoint プレゼンテーション - MagicPoint-ის პრეზენტაცია - MagicPoint презентациясы - MagicPoint 프리젠테이션 - MagicPoint pateiktis - MagicPoint prezentācija - Persembahan MagicPoint - MagicPoint-presentasjon - MagicPoint-presentatie - MagicPoint-presentasjon - Prezentacja programu MagicPoint - apresentação MagicPoint - Apresentação do MagicPoint - Prezentare MagicPoint - презентация MagicPoint - Prezentácia MagicPoint - Predstavitev MagicPoint - Prezantim MagicPoint - MagicPoint презентација - MagicPoint-presentation - презентація MagicPoint - Trình diễn MagicPoint - MagicPoint 演示文稿 - MagicPoint 簡報檔 - - - - - - Macintosh MacBinary file - ملف Macintosh MacBinary - Fajł Macintosh MacBinary - Файл — MacBinary - fitxer MacBinary de Macintosh - Soubor MacBinary pro Macintosh - Macintosh MacBinary-fil - Macintosh-MacBinary-Datei - εκτελέσιμο Macintosh MacBinary - Macintosh MacBinary file - MacBinary-dosiero de Macintosh - archivo de Macintosh MacBinary - Macintosh MacBinary fitxategia - Macintosh MacBinary -tiedosto - Macintosh MacBinary fíla - fichier Macintosh MacBinary - comhad Macintosh MacBinary - ficheiro MacBinary de Macintosh - קובץ בינארי של מקינטוש - Macintosh MacBinary datoteka - Macintosh MacBinary-fájl - Berkas Macintosh MacBinary - File Macintosh MacBinary - MacBinary MacBinary ファイル - Macintosh MacBinary файлы - MacBinary 파일 - Macintosh MacBinary failas - Macintosh MacBinary datne - Fail MacBinary Macintosh - Macintosh MacBinary-fil - Macintosh MacBinary-bestand - Macintosh MacBinary-fil - Plik MacBinary Macintosh - ficheiro MacBinary de Macintosh - Arquivo do Macintosh MacBinary - Fișier Macintosh MacBinary - файл Macintosh MacBinary - Súbor pre Macintosh MacBinary - Izvedljiva dvojiška datoteka Macintosh MacBinary - File MacBinary Macintosh - Мекинтош MacBinary датотека - Macintosh MacBinary-fil - файл Macintosh MacBinary - Tập tin nhị phân MacBinary của Macintosh - Macintosh MacBinary 文件 - Macintosh MacBinary 檔 - - - - - - - Matroska stream - دفق Matroska - Płyń Matroska - Поток — Matroska - flux Matroska - Proud Matroska - Matroskastrøm - Matroska-Datenstrom - ροή Matroska - Matroska stream - flujo Matroska - Matroska korrontea - Matroska-virta - Matroska streymur - flux Matroska - sruth Matroska - fluxo de Matroska - זרימת Matroska - Matroska adatfolyam - Stream Matroska - Stream Matroska - Matroska ストリーム - Matroska-ის ნაკადი - Matroska ағымы - Matroska 스트림 - Matroska srautas - Matroska straume - Matroska-stream - Matroska-straum - Strumień Matroska - Transmissão do Matroska - Flux Matroska - поток Matroska - Stream Matroska - Pretočni vir Matroska - Stream Matroska - Matroska-ström - потік даних Matroska - Luồng Matroska - Matroska 流 - Matroska 串流 - - - - - - - - - - - - - - Matroska video - Matroska مرئي - Videa Matroska - Видео — Matroska - vídeo Matroska - Video Matroska - Matroskavideo - Matroska-Video - βίντεο Matroska - Matroska video - Matroska-video - vídeo Matroska - Matroska bideoa - Matroska-video - Matroska video - vidéo Matroska - físeán Matroska - vídeo de Matroska - וידאו Matroska - Matroska video - Matroska-videó - Video Matroska - Video Matroska - Matroska 動画 - Matroska-ის ვიდეო - Matroska видеосы - Matroska 비디오 - Matroska vaizdo įrašas - Matroska video - Video Matroska - Matroska-film - Matroska-video - Matroska-video - Plik wideo Matroska - vídeo Matroska - Vídeo Matroska - Video Matroska - видео Matroska - Video Matroska - Video datoteka Matroska - Video Matroska - Матрошка видео - Matroska-video - відеокліп Matroska - Ảnh động Matroska - Matroska 视频 - Matroska 視訊 - - - - - Matroska 3D video - - - - - Matroska audio - سمعي Matroska - Aŭdyjo Matroska - Аудио — Matroska - àudio Matroska - Zvuk Matroska - Matroskalyd - Matroska-Audio - ήχος Matroska - Matroska audio - Matroska-sondosiero - sonido Matroska - Matroska audioa - Matroska-ääni - Matroska ljóður - audio Matroska - fuaim Matroska - son de Matroska - שמע Matroska - Matroska audio - Matroska hang - Audio Matroska - Audio Matroska - Matroska オーディオ - Matroska-ის აუდიო - Matroska аудиосы - Matroska 오디오 - Matroska garso įrašas - Matroska audio - Matroska-lyd - Matroska-audio - Matroska-lyd - Plik dźwiękowy Matroska - Áudio Matroska - Audio Matroska - аудио Matroska - Zvuk Matroska - Zvočna datoteka Matroska - Audio Matroska - Matroska-ljud - звук Matroska - Âm thanh Matroska - Matroska 音频 - Matroska 音訊 - - - - - WebM video - WebM مرئي - Видео — WebM - vídeo WebM - Video WebM - WebM-video - WebM-Video - βίντεο WebM - WebM video - WebM-video - vídeo WebM - WebM-video - WebM video - vidéo WebM - físeán WebM - vídeo WebM - וידאו WebM - WebM video - WebM videó - Video WebM - Video WebM - WebM 動画 - WebM видеосы - WebM 비디오 - WebM vaizdo įrašas - WebM video - WebM video - Plik wideo WebM - Vídeo WebM - Video WebM - видео WebM - Video WebM - Video datoteka WebM - WebM-video - відео WebM - WebM 视频 - WebM 視訊 - - - - - - - - - - - - - - WebM audio - WebM سمعي - Аудио — WebM - àudio WebM - Zvuk WebM - WebM-lyd - WebM-Audio - ήχος WebM - WebM audio - WebM-sondosiero - sonido WebM - WebM-ääni - WebM ljóður - audio WebM - fuaim WebM - son WebM - שמע WebM - WebM audio - WebM hang - Audio WebM - Audio WebM - WebM オーディオ - WebM аудиосы - WebM 오디오 - WebM garso įrašas - WebM audio - WebM audio - Plik dźwiękowy WebM - Áudio WebM - Audio WebM - аудио WebM - Zvuk WebM - Zvočna datoteka WebM - WebM-ljud - звук WebM - WebM 音频 - WebM 音訊 - - - - MHTML web archive - MHTML - MIME HTML - - - - - - MXF video - MXF مرئي - Видео — MXF - vídeo MXF - Video MXF - MXF-video - MXF-Video - βίντεο MXF - MXF video - MXF-video - vídeo MXF - MXF bideoa - MXF-video - MXF video - vidéo MXF - físeán MXF - vídeo MXF - וידאו MXF - MXF video - MXF videó - Video MXF - Video MXF - MXF 動画 - MXF ვიდეო - MXF видеосы - MXF 비디오 - MXF vaizdo įrašas - MXF video - MXF video - Plik wideo MXF - Vídeo MXF - Video MXF - видео MXF - Video MXF - Video datoteka MXF - MXF-video - відеокліп MXF - MXF 视频 - MXF 視訊 - MXF - Material Exchange Format - - - - - - - - OCL file - ملف OCL - Fajł OCL - Файл — OCL - fitxer OCL - Soubor OCL - OCL-fil - OCL-Datei - αρχείο OCL - OCL file - OCL-dosiero - archivo OCL - OCL fitxategia - OCL-tiedosto - OCL fíla - fichier OCL - comhad OCL - ficheiro OCL - קובץ OCL - OCL datoteka - OCL fájl - Berkas OCL - File OCL - OCL ファイル - OCL файлы - OCL 파일 - OCL failas - OCL datne - OCL-fil - OCL-bestand - OCL-fil - Plik OCL - Arquivo OCL - Fișier OCL - файл OCL - Súbor OCL - Datoteka OCL - File OCL - OCL-fil - OCL dosyası - файл OCL - Tập tin OCL - OCL 文件 - OCL 檔 - OCL - Object Constraint Language - - - - - COBOL source file - Изходен код — COBOL - codi font en COBOL - Zdrojový soubor COBOL - COBOL-kildefil - COBOL-Quelldatei - πηγαίο αρχείο COBOL - COBOL source file - COBOL-fontdosiero - Archivo fuente de COBOL - COBOL-lähdekoodi - fichier source COBOL - ficheiro fonte de COBOL - קובץ מקור של COBOL - COBOL izvorna datoteka - COBOL forrásfájl - Berkas sumber COBOL - File sorgente COBOL - COBOL ソースファイル - COBOL-ის საწყისი ფაილი - COBOL бастапқы коды - COBOL 소스 파일 - COBOL pirmkods - COBOL bronbestand - Plik źródłowy COBOL - Arquivo de código-fonte em COBOL - файл исходного кода на COBOL - Izvorna koda COBOL - COBOL-källkodsfil - вихідний код мовою COBOL - COBOL 源 - COBOL 源檔 - COBOL - COmmon Business Oriented Language - - - - - - Mobipocket e-book - Е-книга — Mobipocket - llibre electrònic Mobipocket - Elektronická kniha Mobipocket - Mobipocket e-bog - Mobipocket E-Book - ηλεκτρονικό βιβλίο Mobipocket - Mobipocket e-book - Libro electrónico Mobipocket - Mobipocket e-kirja - livre numérique Mobipocket - E-book Mobipocket - ספר אלקטרוני של Mobipocket - Mobipocket e-knjiga - Mobipocket e-könyv - e-book Mobipocket - E-book Mobipocket - Mobipocket 電子書籍 - Mobipocket-ის ელწიგნი - Mobipocket эл. кітабы - Mobipocket 전자책 - Mobipocket e-grāmata - Mobipocket e-book - E-book Mobipocket - E-book Mobipocket - электронная книга Mobipocket - e-knjiga Mobipocket - електронна книга Mobipocket - Mobipocket 电子书 - Mobipocket e-book - - - - - - - - - - - - - - Adobe FrameMaker MIF document - مستند أدوبي الصانع للإطارات MIF - Dakument Adobe FrameMaker MIF - Документ — Adobe FrameMaker MIF - document de FrameMaker MIF d'Adobe - Dokument Adobe FrameMaker MIF - Adobe FrameMaker MIF-dokument - Adobe-FrameMaker-MIF-Dokument - αρχείο MIF του Adobe FrameMaker - Adobe FrameMaker MIF document - MIF-dokumento de Adobe FrameMaker - documento MIF de Adobe FrameMaker - Adobe FrameMaker-en MIF dokumentua - Adobe FrameMaker MIF -asiakirja - Adobe FrameMaker MIF skjal - document MIF Adobe FrameMaker - cáipéis MIF Adobe FrameMaker - documento MIF de Adobe FrameMaker - מסמך MIF של Adobe FrameMaker - Adobe FrameMaker MIF dokument - Adobe FrameMaker MIF-dokumentum - Dokumen Adobe FrameMaker MIF - Documento MIF Adobe FrameMaker - Adobe FrameMaker MIF ドキュメント - Adobe FrameMaker-ის MIF დოკუმენტი - Adobe FrameMaker MIF құжаты - 어도비 프레임메이커 MIF 문서 - Adobe FrameMaker MIF dokumentas - Adobe FrameMaker MIF dokuments - Adobe FrameMaker MIF-dokument - Adobe FrameMaker MIF-document - Adobe FrameMaker MIF-dokument - Dokument MIF Adobe FrameMaker - Documento MIF do Adobe FrameMaker - Document Adobe FrameMaker MIF - документ Adobe FrameMaker MIF - Dokument Adobe FrameMaker MIF - Dokument Adobe FrameMaker MIF - Dokument MIF Adobe FrameMaker - Adobe FrameMaker MIF-dokument - документ Adobe FrameMaker MIF - Tài liệu Adobe FrameMaker MIF - Adobe FrameMaker MIF 文档 - Adobe FrameMaker MIF 文件 - - - - Mozilla bookmarks - علامات موزيلا - Zakładki Mozilla - Отметки — Mozilla - llista d'adreces d'interès de Mozilla - Záložky Mozilla - Mozillabogmærker - Mozilla-Lesezeichen - σελιδοδείκτες Mozilla - Mozilla bookmarks - Mozilla-legosignoj - marcadores de Mozilla - Mozillako laster-markak - Mozilla-kirjanmerkit - Mozilla bókamerki - marque-pages Mozilla - leabharmharcanna Mozilla - Marcadores de Mozilla - סמניה של Mozilla - Mozilla knjižne oznake - Mozilla-könyvjelzők - Bookmark Mozilla - Segnalibri Mozilla - Mozilla ブックマーク - Mozilla бетбелгілері - 모질라 책갈피 - Mozilla žymelės - Mozilla grāmatzīmes - Tandabuku Mozilla - Mozilla-bokmerker - Mozilla-bladwijzers - Mozilla-bokmerker - Zakładki Mozilla - marcadores do Mozilla - Marcadores do Mozilla - Semne de carte Mozilla - закладки Mozilla - Záložky Mozilla - Datoteka zaznamkov Mozilla - Libërshënues Mozilla - Mozilla обележивачи - Mozilla-bokmärken - закладки Mozilla - Liên kết đã lưu Mozilla - Mozilla 书签 - Mozilla 書籤 - - - - - - - - - DOS/Windows executable - تنفيذي DOS/Windows - Vykonvalny fajł DOS/Windows - Изпълним файл — DOS/Windows - executable de DOS/Windows - Spustitelný soubor pro DOS/Windows - DOS-/Windowskørbar - DOS/Windows-Programm - εκτελέσιμο DOS/Windows - DOS/Windows executable - DOS/Windows-plenumebla - ejecutable de DOS/Windows - DOS/Windows-eko exekutagarria - DOS/Windows-ohjelma - DOS/Windows inningarfør - exécutable DOS/Windows - comhad inrite DOS/Windows - executábel de DOS/Windows - קובץ בר־הרצה של DOS/חלונות - DOS/Windows izvršna datoteka - DOS/Windows futtatható - DOS/Windows dapat dieksekusi - Eseguibile DOS/Windows - DOS/Windows 実行ファイル - DOS/Windows გაშვებადი ფაილი - DOS/Windows орындалатын файлы - DOS/Windows 실행 파일 - DOS/Windows vykdomasis failas - DOS/Windows izpildāmais - Bolehlaksana DOS/Windows - Kjørbar fil for DOS/Windows - DOS/Windows-uitvoerbaar bestand - DOS/Windows køyrbar fil - Program DOS/Windows - executável DOS/Windows - Executável do DOS/Windows - Executabil DOS/Windows - исполняемый файл DOS/Windows - Spustiteľný súbor pre DOS/Windows - Izvedljiva datoteka DOS/Windows - I ekzekutueshëm DOS/Windows - ДОС/Виндоуз извршна датотека - Körbar DOS/Windows-fil - DOS/Windows çalıştırılabilir - виконуваний файл DOS/Windows - Tập tin có thực hiện được DOS/Windows - DOS/Windows 可执行文件 - DOS/Windows 可執行檔 - - - - - - - - Internet shortcut - اختصار الإنترنت - Sieciŭnaja spasyłka - Адрес в Интернет - drecera d'Internet - Odkaz do Internetu - Internetgenvej - Internet-Verweis - συντόμευση διαδικτύου - Internet shortcut - acceso directo a Internet - Interneteko lasterbidea - Internet-pikakuvake - Alnetssnarvegur - raccourci Internet - aicearra Idirlín - atallo de Internet - קיצור דרך של האינטרנט - Internetski prečac - Internetes indítóikon - Jalan pintas Internet - Scorciatoia Internet - インターネットショートカット - Интернет сілтемесі - 인터넷 바로 가기 - Interneto nuoroda - Interneta īsceļš - Internettsnarvei - internetkoppeling - Internett-snarveg - Skrót internetowy - Atalho da internet - Scurtătură Internet - Интернет-ссылка - Internetový odkaz - Internetna bližnjica - Shkurtim internet - Internetgenväg - інтернет-посилання - Lối tắt Internet - Internet 快捷方式 - 網際網路捷徑 - - - - - - - - - - WRI document - مستند WRI - Dakument WRI - Документ — WRI - document WRI - Dokument WRI - WRI-dokument - WRI-Dokument - έγγραφο WRI - WRI document - WRI-dokumento - documento WRI - WRI dokumentua - WRI-asiakirja - WRI skjal - document WRI - cáipéis WRI - documento WRI - מסמך WRI - WRI dokument - WRI dokumentum - Dokumen WRI - Documento WRI - WRI ドキュメント - WRI құжаты - WRI 문서 - WRI dokumentas - WRI dokuments - WRI-dokument - WRI-document - WRI-dokument - Dokument WRI - Documento WRI - Document WRI - документ WRI - Dokument WRI - Dokument WRI - Dokument WRI - WRI-dokument - WRI belgesi - документ WRI - Tài liệu WRI - WRI 文档 - WRI 文件 - - - - - MSX ROM - MSX ROM - MSX ROM - ROM — MSX - ROM de MSX - ROM pro MSX - ROM MSX - MSX-rom - MSX-ROM - εικόνα μνήμης ROM MSX - MSX ROM - MSX-NLM - ROM de MSX - MSX-ko ROMa - MSX-ROM - MSX ROM - ROM MSX - ROM MSX - ROM de MSX - MSX ROM - MSX ROM - MSX ROM - Memori baca-saja MSX - ROM MSX - MSX ROM - MSX-ის ROM - MSX ROM - MSX 롬 - MSX ROM - MSX ROM - ROM MSX - MSX-ROM - MSX-ROM - MSX-ROM - Plik ROM konsoli MSX - ROM MSX - ROM do MSX - ROM MSX - MSX ROM - ROM pre MSX - Bralni pomnilnik MSX - ROM MSX - MSX ром - MSX-rom - ППП MSX - ROM MSX - MSX ROM - MSX ROM - - - - - M4 macro - M4 macro - Makras M4 - Макроси — M4 - macro M4 - Makro M4 - M4-makro - M4-Makro - μακροεντολή m4 - M4 macro - macro M4 - M4 makroa - M4-makro - M4 fjølvi - macro M4 - macra M4 - macro M4 - מאקרו M4 - M4 makro - M4 makró - Makro M4 - Macro M4 - M4 マクロ - M4 макросы - M4 매크로 - M4 macro - M4 makross - M4-makro - M4-macro - M4-makro - Makro M4 - Macro M4 - Macro M4 - макрос M4 - Makro M4 - Makro datoteka M4 - Macro M4 - M4-makro - макрос M4 - Vĩ lệnh M4 - M4 宏 - M4 巨集 - - - - - - Nintendo64 ROM - Nintendo64 ROM - Nintendo64 ROM - ROM — Nintendo64 - ROM de Nintendo64 - ROM pro Nintendo64 - Nintendo64-rom - Nintendo64-ROM - εικόνα μνήμης ROM Nintendo64 - Nintendo64 ROM - Nintendo64-NLM - ROM de Nintendo64 - Nintendo64-ko ROMa - Nintendo64-ROM - Nintendo64 ROM - ROM Nintendo64 - ROM Nintendo64 - ROM de Nintendo64 - ROM של Nןמאקמגם64 - Nintendo64 ROM - Nintendo64 ROM - Memori baca-saja Nintendo64 - ROM Nintendo64 - Nintendo64 ROM - Nintendo64 ROM - 닌텐도 64 롬 - Nintendo64 ROM - Nintendo64 ROM - ROM Nintendo64 - Nintendo64-ROM - Nintendo64-ROM - Nintendo64-ROM - Plik ROM konsoli Nintendo64 - ROM Nintendo64 - ROM do Nintendo64 - ROM Nintendo64 - Nintendo64 ROM - ROM pre Nintendo64 - Bralni pomnilnik Nintendo64 - ROM Nintendo64 - Нинтендо64 РОМ - Nintendo64-rom - Nintendo64 ROM - ППП Nintendo64 - ROM Nintendo64 - Nintendo64 ROM - Nintendo64 ROM - - - - - Nautilus link - وصلة Nautilus - Nautilus körpüsü - Spasyłka Nautilus - Връзка — Nautilus - enllaç de Nautilus - Odkaz Nautilus - Cyswllt Nautilus - Nautilus-henvisning - Nautilus-Verknüpfung - σύνδεσμος Nautilus - Nautilus link - Nautilus-ligilo - enlace de Nautilus - Nautilus esteka - Nautilus-linkki - Nautilus leinkja - lien Nautilus - nasc Nautilus - ligazón de nautilus - קישור של Nautilus - Nautilus veza - Nautilus-link - Taut Nautilus - Collegamento Nautilus - Nautilus リンク - Nautilus сілтемесі - 노틸러스 바로 가기 - Nautilus nuoroda - Nautilus saite - Pautan Nautilus - Nautilus-lenke - Nautilus-verwijzing - Nautilus-lenke - Odnośnik Nautilus - atalho Nautilus - Link do Nautilus - Legătură Nautilus - ссылка Nautilus - Odkaz Nautilus - Datoteka povezave Nautilus - Lidhje Nautilus - Наутилус веза - Nautiluslänk - Nautilus bağlantısı - посилання Nautilus - Liên kết Nautilus - Nautilus 链接 - Nautilus 鏈結 - - - - - - - - - NES ROM - NES ROM - NES ROM - ROM — NES - ROM de NES - ROM pro NES - ROM NES - NES-rom - NES-ROM - εικόνα μνήμης ROM NES - NES ROM - NES-NLM - ROM de NES - NES-eko ROMa - NES-ROM - NES ROM - ROM NES - ROM NES - ROM de NES - ROM של NES - NES ROM - NES ROM - Memori baca-saja NES - ROM NES - ファミコン ROM - NES ROM - NES 롬 - NES ROM - NES ROM - ROM NES - NES ROM - Nintendo - NES-ROM - Plik ROM konsoli NES - ROM NES - ROM do NES - ROM NES - NES ROM - ROM pre NES - Bralni pomnilnik NES - ROM NES - NES ром - NES-rom - NES ROM - ППП NES - ROM NES - NES ROM - 任天堂 ROM - - - - - Unidata NetCDF document - مستند Unidata NetCDF - Dakument Unidata NetCDF - Документ — Unidata NetCDF - document Unidata NetCDF - Dokument Unidata NetCDF - Unidata NetCDF-dokument - Unidata-NetCDF-Dokument - έγγραφο Unidata NetCDF - Unidata NetCDF document - dokumento en NetCDF-formato de Unidata - documento de Unidata NetCDF - Unidata NetCDF dokumentua - Unidata NetCDF -asiakirja - Unidata NetCDF skjal - document Unidata NetCDF - cáipéis Unidata NetCDF - Documentno de Unixdata NetCDF - מסמך של Unidata NetCDF - Unidata NetCDF dokument - Unidata NetCDF-dokumentum - Dokumen Unidata NetCDF - Documento Unidata NetCDF - Unidata NetCDF ドキュメント - Unidata NetCDF құжаты - Unidata NetCDF 문서 - Unidata NetCDF dokumentas - Unidata NetCDF dokuments - Dokumen Unidata NetCDF - Unidata NetCDF-dokument - Unidata NetCDF-document - Unidata netCDF-dokument - Dokument Unidata NetCDF - documento Unidata NetCDF - Documento do Unidata NetCDF - Document Unidata NetCDF - документ Unidata NetCDF - Dokument Unidata NetCDF - Dokument Unidata NetCDF - Dokument Unidata NetCDF - Unidata NetCDF документ - Unidata NetCDF-dokument - Unidata NetCDF belgesi - документ Unidata NetCDF - Tài liệu NetCDF Unidata - Unidata NetCDF 文档 - Unidata NetCDF 文件 - NetCDF - Network Common Data Form - - - - - - NewzBin usenet index - Индекс — Usenet, NewzBin - índex d'Usenet NewzBin - Index NewzBin diskuzních skupin Usenet - NewzBin-brugernetindex - NewzBin-Usenet-Index - ευρετήριο usenet NewzBin - NewzBin usenet index - Índice NewzBin de usenet - index usenet - Índice de usenet NEwzBin - אינדקס שרתי חדשות NewzBin - NewzBin usenet index - Indeks usenet NewzBin - Indice Usenet NewzBiz - NewzBin Usenet インデックス - NewzBin usenet индексі - NewzBin 유즈넷 인덱스 - NewzBin usenet rādītājs - NewzBin usenet index - Indeks grup dyskusyjnych NewzBin - Índice de usenet NewzBin - индекс usenet NewzBin - Kazalo usenet NewzBin - покажчик usenet NewzBin - NewzBin usenet 索引 - NewzBin usenet 索引 - - - - - - - - object code - رمز الكائن - abjektny kod - Обектен код - codi objecte - Objektový kód - objektkode - Objekt-Code - μεταφρασμένος κώδικας - object code - celkodo - código objeto - objektu kodea - objektikoodi - code objet - cód réada - código obxecto - קוד אובייקט - kod objekta - tárgykód - kode object - Codice oggetto - オブジェクトコード - объектті коды - 개체 코드 - objektinis kodas - objekta kods - Kod objek - objektkode - objectcode - objektkode - Kod obiektowy - código de objecto - Código-objeto - cod sursă obiect - объектный код - Objektový kód - predmetna koda - Kod objekti - објектни ко̂д - objektkod - об'єктний код - mã đối tượng - 目标代码 - 目的碼 - - - - - - - - - - - - - - - - - Annodex exchange format - صيغة Annodex البديلة - Формат за обмяна — Annodex - format d'intercanvi Annodex - Výměnný formát Annodex - Udvekslingsformat for Annodex - Annodex-Wechselformat - μορφή ανταλλαγής Annodex - Annodex exchange format - formato de intercambio Annodex - Annodex trukatze-formatua - Annodex-siirtomuoto - Annodex umbýtingarsnið - format d'échange Annodex - formáid mhalairte Annodex - formato intercambiábel de Annodex - פורמט החלפת Annodex - Annodex oblik za razmjenu - Annodex csereformátum - Format pertukaran Annodex - Formato di scambio Annodex - Annodex 交換フォーマット - Annodex-ის გაცვლითი ფორმატი - Annodex алмасу пішімі - Annodex 교환 형식 - Annodex mainų formatas - Annodex apmaiņas formāts - Annodex-exchange - Format wymiany Annodex - Formato de troca Annodex - Format schimb Annodex - формат обмена Annodex - Formát pre výmenu Annodex - Izmenjalna datoteka Annodex - Annodex-utväxlingsformat - формат обміну даними Annodex - Định dạng trao đổi Annodex - Annodex 交换格式 - Annodex 交換格式 - - - - - - - - - - - - - Annodex Video - Annodex مرئي - Видео — Annodex - Annodex Video - Annodex Video - Annodexvideo - Annodex-Video - βίντεο Annodex - Annodex Video - Annodex-video - vídeo Annodex - Annodex bideoa - Annodex-video - Annodex video - vidéo Annodex - físeán Annodex - vídeo de Annodex - וידאו Annodex - Annodex Video - Annodex videó - Video Annodex - Video Annodex - Annodex 動画 - Annodex-ის ვიდეო - Annodex видеосы - Annodex 비디오 - Annodex vaizdo įrašas - Annodex video - Annodex Video - Plik wideo Annodex - Vídeo Annodex - Video Annodex - видео Annodex - Video Annodex - Video datoteka Annodex - Annodex-video - відеокліп Annodex - Ảnh động Annodex - Annodex 视频 - Annodex 視訊 - - - - - - - - - - - - - Annodex Audio - Annodex سمعي - Аудио — Annodex - Annodex Audio - Annodex Audio - Annodexlyd - Annodex-Audio - ήχος Annodex - Annodex Audio - Annodex-sondosiero - sonido Annodex - Annodex audioa - Annodex-ääni - Annodex ljóður - audio Annodex - fuaim Annodex - son de Annodex - שמע Annodex - Annodex Audio - Annodex hang - Audio Annodex - Audio Annodex - Annodex オーディオ - Annodex-ის აუდიო - Annodex аудиосы - Annodex 오디오 - Annodex garso įrašas - Annodex audio - Annodex Audio - Plik dźwiękowy Annodex - Áudio Annodex - Audio Annodex - аудио Annodex - Zvuk Annodex - Zvočna datoteka Annodex - Annodex-ljud - звук Annodex - Âm thanh Annodex - Annodex 音频 - Annodex 音訊 - - - - - - - - - - - - - Ogg multimedia file - ملف وسائط متعددة Ogg - Multymedyjny fajł Ogg - Мултимедия — Ogg - fitxer Ogg multimèdia - Soubor multimédií Ogg - Ogg multimedie-fil - Ogg-Multimediadatei - Αρχείο πολυμέσων Ogg - Ogg multimedia file - archivo multimedia Ogg - Ogg multimediako fitxategia - Ogg-multimediatiedosto - Ogg margmiðlafíla - fichier multimédia Ogg - comhad ilmheán Ogg - ficheiro multimedia Ogg - קובץ מולטימדיה Ogg - Ogg multimédiafájl - Berkas multimedia Ogg - File multimediale Ogg - Ogg マルチメディアファイル - Ogg-ის მულტიმედია ფაილი - Ogg мультимедиа файлы - Ogg 멀티미디어 파일 - Ogg multimedijos failas - Ogg multimediju datne - Ogg-multimediafil - Ogg-multimediabestand - Ogg multimediafil - Plik multimedialny Ogg - Arquivo multimídia Ogg - Fișier multimedia Ogg - мультимедийный файл Ogg - Súbor multimédií Ogg - Večpredstavnostna datoteka Ogg - File multimedial Ogg - Ogg-multimediafil - мультимедійний файл Ogg - Tập tin đa phương tiện Ogg - Ogg 多媒体文件 - Ogg 多媒體檔案 - - - - - - - - - Ogg Audio - Ogg سمعي - Aŭdyjo Ogg - Аудио — Ogg - àudio Ogg - Zvuk Ogg - Ogg-lyd - Ogg-Audio - ήχος Ogg - Ogg Audio - sonido Ogg - Ogg audioa - Ogg-ääni - Ogg ljóður - audio Ogg - fuaim Ogg - son Ogg - שמע Ogg - Ogg hang - Audio Ogg - Audio Ogg - Ogg オーディオ - Ogg-ის აუდიო - Ogg аудиосы - Ogg 오디오 - Ogg garso įrašas - Ogg audio - Ogg lyd - Ogg-audio - Ogg-lyd - Plik dźwiękowy Ogg - Áudio Ogg - Audio Ogg - аудио Ogg - Zvuk Ogg - Zvočna datoteka Ogg - Audio Ogg - Ogg-ljud - звук ogg - Âm thanh Ogg - Ogg 音频 - Ogg 音訊 - - - - - - - - - - Ogg Video - Ogg مرئي - Videa Ogg - Видео — Ogg - vídeo Ogg - Video Ogg - Ogg-video - Ogg-Video - βίντεο Ogg - Ogg Video - vídeo Ogg - Ogg bideoa - Ogg-video - Ogg Video - vidéo Ogg - físeán Ogg - vídeo Ogg - וידאו Ogg - Ogg videó - Video Ogg - Video Ogg - Ogg 動画 - Ogg ვიდეო - Ogg видеосы - Ogg 비디오 - Ogg vaizdo įrašas - Ogg video - Ogg video - Ogg-video - Ogg-video - Plik wideo Ogg - Vídeo Ogg - Video Ogg - видео Ogg - Video Ogg - Video datoteka Ogg - Video Ogg - Ogg-video - відеокліп ogg - Ảnh động Ogg - Ogg 视频 - Ogg 視訊 - - - - - - - - - - Ogg Vorbis audio - Ogg Vorbis سمعي - Ogg Vorbis audio faylı - Aŭdyjo Ogg Vorbis - Аудио — Ogg Vorbis - àudio Ogg Vorbis - Zvuk Ogg Vorbis - Sain Ogg Vorbis - Ogg Vorbis-lyd - Ogg-Vorbis-Audio - ήχος Ogg Vobris - Ogg Vorbis audio - Ogg-Vorbis-sondosiero - sonido Ogg Vorbis - Ogg Vorbis audioa - Ogg Vorbis -ääni - Ogg Vorbis ljóður - audio Ogg Vorbis - fuaim Ogg Vorbis - son Ogg Vorbis - שמע Ogg Vorbis - Ogg Vorbis hang - Audio Ogg Vorbis - Audio Ogg Vorbis - Ogg Vorbis オーディオ - Ogg Vorbis აუდიო - Ogg Vorbis аудиосы - Ogg Vorbis 오디오 - Ogg Vorbis garso įrašas - Ogg Vorbis audio - Audio Ogg Vorbis - Ogg Vorbis lyd - Ogg Vorbis-audio - Ogg Vorbis-lyd - Plik dźwiękowy Ogg Vorbis - áudio Ogg Vorbis - Áudio do Ogg Vorbis - Audio Ogg Vorbis - аудио Ogg Vorbis - Zvuk Ogg Vorbis - Zvočna datoteka Ogg Vorbis - Audio Ogg Vorbis - Ог-ворбис звучни запис - Ogg Vorbis-ljud - звук ogg Vorbis - Âm thanh Vorbis Ogg - Ogg Vorbis 音频 - Ogg Vorbis 音訊 - - - - - - - - - - - - - Ogg FLAC audio - Ogg FLAC سمعي - Aŭdyjo Ogg FLAC - Аудио — Ogg FLAC - àudio Ogg FLAC - Zvuk Ogg FLAC - Ogg FLAC-lyd - Ogg-FLAC-Audio - ήχος Ogg FLAC - Ogg FLAC audio - sonido Ogg FLAC - Ogg FLAC audioa - Ogg FLAC -ääni - Ogg FLAC ljóður - audio Ogg FLAC - fuaim Ogg FLAC - son Ogg FLAC - שמע Ogg FLAC - Ogg FLAC hang - Audio Ogg FLAC - Audio Ogg FLAC - Ogg FLAC オーディオ - Ogg FLAC აუდიო - Ogg FLAC аудиосы - Ogg FLAC 오디오 - Ogg FLAC garso įrašas - Ogg FLAC audio - Ogg FLAC-lyd - Ogg FLAC-audio - Ogg FLAC-lyd - Plik dźwiękowy Ogg FLAC - Áudio FLAC Ogg - Audio Ogg FLAC - аудио Ogg FLAC - Zvuk Ogg FLAC - Zvočna datoteka Ogg FLAC - Audio Ogg FLAC - Ogg FLAC-ljud - звук ogg FLAC - Âm thanh FLAC Ogg - Ogg FLAC 音频 - Ogg FLAC 音訊 - - - - - - - - - - - - - - - Ogg Speex audio - Ogg Speex سمعي - Aŭdyjo Ogg Speex - Аудио — Ogg Speex - àudio Ogg Speex - Zvuk Ogg Speex - Ogg Speex-lyd - Ogg-Speex-Audio - ήχος Ogg Speex - Ogg Speex audio - sonido Ogg Speex - Ogg Speex audioa - Ogg Speex -ääni - Ogg Speex ljóður - audio Ogg Speex - fuaim Ogg Speex - son Ogg Speex - שמע Ogg Speex - Ogg Speex hang - Audio Ogg Speex - Audio Ogg Speex - Ogg Speex オーディオ - Ogg Speex აუდიო - Ogg Speex аудиосы - Ogg Speex 오디오 - Ogg Speex garso įrašas - Ogg Speex audio - Ogg Speex lyd - Ogg Speex-audio - Ogg Speex-lyd - Plik dźwiękowy Ogg Speex - Áudio Speex Ogg - Audio Ogg Speex - аудио Ogg Speex - Zvuk Ogg Speex - Zvočna datoteka Ogg Speex - Audio Ogg Speex - Ogg Speex-ljud - звук ogg Speex - Âm thanh Speex Ogg - Ogg Speex 音频 - Ogg Speex 音訊 - - - - - - - - - - - Speex audio - Speex سمعي - Aŭdyjo Speex - Аудио — Speex - àudio Speex - Zvuk Speex - Speexlyd - Speex-Audio - ήχος Speex - Speex audio - sonido Speex - Speex audioa - Speex-ääni - Speex ljóður - audio Speex - fuaim Speex - son Speex - שמע של Speex - Speex audio - Speex hang - Audio Speex - Audio Speex - Speex オーディオ - Speex аудиосы - Speex 오디오 - Speex garso įrašas - Speex audio - Speex lyd - Speex-audio - Speex-lyd - Plik dźwiękowy Speex - Áudio Speex - Audio Speex - аудио Speex - Zvuk Speex - Zvočna datoteka Speex - Audio Speex - Speex-ljud - звук Speex - Âm thanh Speex - Speex 音频 - Speex 音訊 - - - - - - - Ogg Theora video - Ogg Theora مرئي - Videa Ogg Theora - Видео — Ogg Theora - vídeo Ogg Theora - Video Ogg Theora - Ogg Theora-video - Ogg-Theora-Video - βίντεο Ogg Theora - Ogg Theora video - vídeo Ogg Theora - Ogg Theora bideoa - Ogg Theora -video - Ogg Theora video - vidéo Ogg Theora - físeán Ogg Theora - vídeo Ogg Theora - שמע Ogg Theora - Ogg Theora videó - Video Ogg Theora - Video Ogg Theora - Ogg Theora 動画 - Ogg Theora ვიდეო - Ogg Theora видеосы - Ogg Theora 비디오 - Ogg Theora vaizdo įrašas - Ogg Theora video - Ogg Theora video - Ogg Theora-video - Ogg Theora-video - Plik wideo Ogg Theora - Vídeo do Ogg Theora - Video Ogg Theora - видео Ogg Theora - Video Ogg Theora - Video datoteka Ogg Theora - Video Ogg Theora - Ogg Theora-video - відеокліп ogg Theora - Ảnh động Theora Ogg - Ogg Theora 视频 - Ogg Theora 視訊 - - - - - - - - - - - OGM video - OGM مرئي - Videa OGM - Видео — OGM - vídeo OGM - Video OGM - OGM-video - OGM-Video - βίντεο OGM - OGM video - OGM-video - vídeo OGM - OGM bideoa - OGM-video - OGM video - vidéo OGM - físeán OGM - vídeo OGM - וידאו OGM - OGM video - OGM-videó - Video OGM - Video OGM - OGM 動画 - OGM ვიდეო - OGM видеосы - OGM 비디오 - OGM vaizdo įrašas - OGM video - OGM-film - OGM-video - OGM-video - Plik wideo OGM - Vídeo OGM - Video OGM - видео OGM - Video OGM - Video datoteka OGM - Video OGM - OGM-video - відеокліп OGM - Ảnh động OGM - OGM 视频 - OGM 視訊 - - - - - - - - - - - - OLE2 compound document storage - تخزين مجمع مستند OLE2 - Schovišča dla kampanentaŭ dakumentu OLE2 - Съставен документ-хранилище — OLE2 - emmagatzematge de documents composats OLE2 - Úložiště složeného dokumentu OLE2 - OLE2-sammensat dokumentlager - OLE2-Verbunddokumentenspeicher - αρχείο συμπαγούς αποθήκευσης εγγράφων OLE2 - OLE2 compound document storage - OLE2-deponejo de parentezaj dokumentoj - almacenamiento de documentos compuestos OLE2 - OLE2 konposatutako dokumentu-bilduma - OLE2-yhdisteasiakirjatallenne - OLE2 samansett skjalagoymsla - document de stockage composé OLE2 - stóras cháipéisí comhshuite OLE2 - almacenamento de documento composto OLE2 - אחסון מסמך משותף OLE2 - OLE2 összetett dokumentumtároló - penyimpan dokumen kompon OLE2 - Memorizzazione documento composto OLE2 - OLE2 複合ドキュメントストレージ - OLE2 құрама құжаттар қоймасы - OLE2 복합 문서 - OLE2 sudėtinių dokumentų laikmena - OLE2 savienoto dokumentu glabātuve - Storan dokumen halaman OLE2 - OLE-lager for sammensatte dokumenter - OLE2-samengestelde documentopslag - OLE2 lager for samansett dokument - Magazyn dokumentu złożonego OLE2 - armazenamento de documento composto OLE2 - Armazenamento de documento composto OLE2 - Document de stocare compus OLE2 - хранилище составных документов OLE2 - Úložisko zloženého dokumentu OLE2 - Združeni dokument OLE2 - Arkiv dokumenti i përbërë OLE2 - ОЛЕ2 сједињени документ - Sammansatt OLE2-dokumentlager - сховище складних документів OLE2 - Kho lưu tài liệu ghép OLE2 - OLE2 组合文档存储 - OLE2 複合文件儲存 - - - - - - - - Microsoft Publisher document - - - - - Windows Installer package - حزمة مثبّت ويندوز - Pakunak Windows Installer - Пакет — инсталация за Windows - paquet de Windows Installer - Balíček Windows Installer - Windows Installer-pakke - Windows Installationspaket - πακέτο Windows Installer - Windows Installer package - paquete de instalación de Windows - Windows-eko pakete instalatzailea - Windows-asennuspaketti - Windows innleggingarpakki - paquet d'installation Windows - pacáiste Windows Installer - paquete de instalación de Windows - חבילה של Windows Installer - Windows Installer paket - Windows Installer csomag - Paket Windows Installer - Pacchetto Windows Installer - Windodws インストーラパッケージ - Windows Installer дестесі - Windows 설치 패키지 - Windows Installer paketas - Windows Installer pakotne - Windows-installatiepakket - Windows Installer-pakke - Pakiet instalatora Windows - Pacote do instalador do Windows - Pachet instalator Windows - пакет Windows Installer - Balík Windows Installer - Datoteka paketa Windows namestilnika - Paketë Windows Installer - Windows Installer-paket - Windows Installer paketi - пакунок Windows Installer - Gói cài đặt Windows - Windows 程序安装包 - Windows Installer 套件 - - - - - GNU Oleo spreadsheet - جدول جنو Oleo - Raźlikovy arkuš GNU Oleo - Таблица — GNU Oleo - full de càlcul de GNU Oleo - Sešit GNU Oleo - GNU Oleo-regneark - GNU-Oleo-Tabelle - λογιστικό φύλλο GNU Oleo - GNU Oleo spreadsheet - Kalkultabelo de GNU Oleo - hoja de cálculo de GNU Oleo - GNU Oleo kalkulu-orria - GNU Oleo -taulukko - GNU Oleo rokniark - feuille de calcul GNU Oleo - scarbhileog GNU Oleo - folla de cálculo de Oleo GNU - גליון נתונים של GNU Oleo - GNU Oleo proračunska tablica - GNU Oleo-munkafüzet - Lembar sebar GNU Oleo - Foglio di calcolo GNU Oleo - GNU Oleo スプレッドシート - GNU Oleo ცხრილი - GNU Oleo электрондық кестесі - GNU Oleo 스프레드시트 - GNU Oleo skaičialentė - GNU Oleo izklājlapa - Hamparan GNU Oleo - GNU Oleo regneark - GNU Oleo-rekenblad - GNU Oleo-rekneark - Arkusz GNU Oleo - folha de cálculo GNU Oleo - Planilha do GNU Oleo - Foaie de calcul GNU Oleo - электронная таблица GNU Oleo - Zošit GNU Oleo - Preglednica GNU Oleo - Fletë llogaritje GNU Oleo - ГНУ Oleo табеларни прорачун - GNU Oleo-kalkylblad - ел. таблиця GNU Oleo - Bảng tính Oleo của GNU - GNU Oleo 工作簿 - GNU Oleo 試算表 - - - - - - - - PAK archive - أرشيف PAK - Archiŭ PAK - Архив — PAK - arxiu PAK - Archiv PAK - PAK-arkiv - PAK-Archiv - συμπιεσμένο αρχείο PAK - PAK archive - PAK-arkivo - archivador PAK - PAK artxiboa - PAK-arkisto - PAK skjalasavn - archive PAK - cartlann PAK - arquivo PAK - ארכיון PAK - PAK-archívum - Arsip PAK - Archivio PAK - PAK アーカイブ - PAK არქივი - PAK архиві - PAK 압축 파일 - PAK archyvas - PAK arhīvs - PAK-arkiv - PAK-archief - PAK-arkiv - Archiwum PAK - Pacote PAK - Arhivă PAK - архив PAK - Archív PAK - Datoteka arhiva PAK - Arkiv PAK - PAK-arkiv - PAK arşivi - архів PAK - Kho nén PAK - AR 归档文件 - PAK 封存檔 - - - - - - - - Palm OS database - قاعدة بيانات Palm OS - Palm OS mə'lumat bazası - Baza źviestak Palm OS - База от данни — Palm OS - base de dades Palm OS - Databáze Palm OS - Cronfa Ddata Palm OS - Palm OS-database - Palm-OS-Datenbank - βάση δεδομένων Palm OS - Palm OS database - datumbazo de Palm OS - base de datos de Palm OS - Palm OS datu-basea - Palm OS -tietokanta - Palm OS dátustovnur - base de données Palm OS - bunachar sonraí Palm OS - base de datos de Palm OS - מסד נתונים של Palm OS - Palm OS-adatbázis - Basis data Palm OS - Database Palm OS - Palm OS データベース - Palm OS дерекқоры - Palm OS 데이터베이스 - Palm OS duomenų bazė - Palm OS datubāze - Pangkalandata PalmOS - Palm OS-database - Palm OS-gegevensbank - Palm OS-database - Baza danych Palm OS - base de dados do Palm OS - Banco de dados do Palm OS - Bază de date Palm OS - база данных Palm OS - Databáza Palm OS - Podatkovna zbirka Palm OS - Bankë me të dhëna Palm OS - Palm OS база података - Palm OS-databas - Palm OS veritabanı - база даних Palm OS - Cơ sở dữ liệu PalmOS - Palm OS 数据库 - Palm OS 資料庫 - - - - - - - - Parchive archive - أرشيف Parchive - Archiŭ Parchive - Архив — parchive - arxiu Parchive - Archiv Parchive - Parchive-arkiv - Parchive-Archiv - συμπιεσμένο αρχείο Parchive - Parchive archive - archivador Parchive - Parchive artxiboa - Parchive-arkisto - Parchive skjalasavn - archive Parchive - cartlann Parchive - arquivo Parchive - ארכיון של Parchive - Parchive archívum - Arsip Parchive - Archivio Parchive - Parchive アーカイブ - Parchive архиві - Parchive 압축 파일 - Parchive archyvas - Parchive arhīvs - Parchive-arkiv - Parchive-archief - Parchive-arkiv - Archiwum parchive - Pacote Parchive - Arhivă Parchive - архив Parchive - Archív Parchive - Datoteka arhiva Parchive - Arkiv Parchive - Parchive-arkiv - Parchive arşivi - архів Parchive - Kho nén Parchive - Parchive 归档文件 - Parchive 封存檔 - Parchive - Parity Volume Set Archive - - - - - - - - - PEF executable - PEF تنفيذي - Vykonvalny fajł PEF - Изпълним файл — PEF - executable PEF - Spustitelný soubor PEF - PEF-kørbar - PEF-Programm - εκτελέσιμο PEF - PEF executable - PEF-plenumebla - ejecutable PEF - PEF exekutagarria - PEF-ohjelma - PEF inningarfør - exécutable PEF - comhad inrite PEF - Executábel PEF - קובץ הרצה PEF - PEF futtatható - PEF dapat dieksekusi - Eseguibile PEF - PEF 実行ファイル - PEF орындалатын файлы - PEF 실행 파일 - PEF vykdomasis failas - PEF izpildāmais - Bolehlaksana PEF - PEF-kjørbar - PEF-uitvoerbaar bestand - Køyrbar PEF-fil - Program PEF - executável PEF - Executável PEF - Executabil PEF - исполняемый файл PEF - Spustiteľný súbor PEF - Izvedljiva datoteka PEF - E ekzekutueshme PEF - PEF извршна - Körbar PEF-fil - PEF çalıştırılabilir - виконуваний файл PEF - Tập tin thực hiện được PEF - PEF 可执行文件 - PEF 可執行檔 - - - - - - - Perl script - سكربت بيرل - Skrypt Perl - Скрипт — Perl - script Perl - Skript v Perlu - Sgript Perl - Perlprogram - Perl-Skript - πρόγραμμα εντολών Perl - Perl script - Perl-skripto - script en Perl - Perl script-a - Perl-komentotiedosto - Perl boðrøð - script Perl - script Perl - Script de Perl - תסריט מעטפת של Perl - Perl-parancsfájl - Skrip Perl - Script Perl - Perl スクリプト - Perl сценарийі - 펄 스크립트 - Perl scenarijus - Perl skripts - Skrip Perl - Perl skript - Perl-script - Perl-skript - Skrypt Perl - 'script' Perl - Script Perl - Script Perl - сценарий Perl - Skript jazyka Perl - Skriptna datoteka Perl - Script Perl - Перл скрипта - Perlskript - Perl betiği - скрипт на Perl - Văn lệnh Perl - Perl 脚本 - Perl 指令稿 - - - - - - - - - - - - - - - - - - - - - - - - - - - - PHP script - سكربت PHP - PHP skripti - Skrypt PHP - Скрипт — PHP - script PHP - Skript PHP - Sgript PHP - PHP-program - PHP-Skript - πρόγραμμα εντολών PHP - PHP script - PHP-skripto - script en PHP - PHP script-a - PHP-komentotiedosto - PHP boðrøð - script PHP - script PHP - Script de PHP - תסריט מעטפת של PHP - PHP-parancsfájl - Skrip PHP - Script PHP - PHP スクリプト - PHP сценарийі - PHP 스크립트 - PHP scenarijus - PHP skripts - Skrip PHP - PHP-skript - PHP-script - PHP-skript - Skrypt PHP - 'script' PHP - Script PHP - Script PHP - сценарий PHP - Skript PHP - Skriptna datoteka PHP - Script PHP - PHP скрипта - PHP-skript - PHP betiği - скрипт PHP - Văn lệnh PHP - PHP 脚本 - PHP 指令稿 - - - - - - - - - - - - - PKCS#7 certificate bundle - رزمة الشهادة PKCS#7 - Сбор със сертификати — PKCS#7 - conjunt de certificats PKCS#7 - Svazek certifikátů PKCS#7 - PKCS#7-certifikatbundt - PKCS#7-Zertifikatspaket - πακέτο ψηφιακών πιστοποιητικών PKCS#7 - PKCS#7 certificate bundle - lote de certificados PCKS#7 - PKCS#7 zertifikazio sorta - PKCS#7-varmennenippu - PKCS#7 váttanar bundi - lot de certificats PKCS#7 - cuach theastas PKCS#7 - paquete de certificado PKCS#7 - בקשה מוסמכת PKCS#7 - PKCS#7-tanúsítványcsomag - Bundel sertifikat PKCS#7 - Bundle certificato PKCS#7 - PKCS#7 証明書 - PKCS#7 сертификаттар дестесі - PKCS#7 인증서 묶음 - PKCS#7 liudijimų ryšulys - PKCS#7 sertifikātu saišķis - PKCS#7-certificaatbundel - Pakiet certyfikatu PKCS#7 - Pacote de certificados PKCS#7 - Pachet certificat PKCS#7 - пакет сертификатов PKCS#7 - Zväzok certifikátov PKCS#7 - Datoteka potrdila PKCS#7 - PKCS#7-certifikatsamling - комплект сертифікатів PKCS#7 - Bó chứng nhận PKCS#7 - PKCS#7 证书束 - PKCS#7 憑證綁包 - PKCS - Public-Key Cryptography Standards - - - - - PKCS#12 certificate bundle - رزمة الشهادة PKCS#12 - Viazka sertyfikataŭ PKCS#12 - Сбор със сертификати — PKCS#12 - conjunt de certificats PKCS#12 - Svazek certifikátů PKCS#12 - PKCS#12-certifikatbundt - PKCS#12-Zertifikatspaket - πακέτο ψηφιακών πιστοποιητικών PKCS#12 - PKCS#12 certificate bundle - ligaĵo de PKCS#12-atestiloj - lote de certificados PCKS#12 - PKCS#12 zertifikazio sorta - PKCS#12-varmennenippu - PKCS#12 váttanar bundi - lot de certificats PKCS#12 - cuach theastas PKCS#12 - paquete de certificado PKCS#12 - בקשה מוסמכת PKCS#12 - PKCS#12-tanúsítványcsomag - Bundel sertifikat PKCS#12 - Bundle certificato PKCS#12 - PKCS#12 証明書 - PKCS#12 сертификаттар дестесі - PKCS#12 인증서 묶음 - PKCS#12 liudijimų ryšulys - PKCS#12 sertifikātu saišķis - Sijil PKCS#12 - PKCS#12 sertifikathaug - PKCS#12-certificaatbundel - PKCS#12-sertifikatbunt - Pakiet certyfikatu PKCS#12 - conjunto de certificados PKCS#12 - Pacote de certificados PKCS#12 - Certificat împachetat PKCS#12 - пакет сертификатов PKCS#12 - Zväzok certifikátov PKCS#12 - Datoteka potrdila PKCS#12 - Bundle çertifikate PKCS#12 - PKCS#12 пакет сертификата - PKCS#12-certifikatsamling - комплект сертифікатів PKCS#12 - Bó chứng nhận PKCS#12 - PKCS#12 证书束 - PKCS#12 憑證檔 - PKCS - Public-Key Cryptography Standards - - - - - PlanPerfect spreadsheet - جدول PlanPerfect - Raźlikovy arkuš PlanPerfect - Таблица — PlanPerfect - full de càlcul de PlanPerfect - Sešit PlanPerfect - PlanPerfect-regneark - PlanPerfect-Tabelle - φύλλο εργασίας PlanPerfect - PlanPerfect spreadsheet - hoja de cálculo de PlanPerfect - PlanPerfect kalkulu-orria - PlanPerfect-taulukko - PlanPerfect rokniark - feuille de calcul PlanPerfect - scarbhileog PlanPerfect - folla de cálculo de PlanPerfect - גליון נתונים של PlanPerfect - PlanPerfect táblázat - Lembar sebar PlanPerfect - Foglio di calcolo PlanPerfect - PlanPerfect スプレッドシート - PlanPerfect электрондық кестесі - PlanPerfect 스프레드시트 - PlanPerfect skaičialentė - PlanPerfect izklājlapa - PlanPerfect-regneark - PlanPerfect-rekenblad - PlanPerfect-rekneark - Arkusz PlanPerfect - Planilha do PlanPerfect - Foaie de calcul PlanPerfect - электронная таблица PlanPerfect - Zošit PlanPerfect - Preglednica PlanPerfect - Fletë llogaritjesh PlanPerfect - PlanPerfect-kalkylblad - ел. таблиця PlanPerfect - Bảng tính PlanPerfect - PlanPerfect 工作簿 - PlanPerfect 試算表 - - - - - Pocket Word document - مستند Pocket Word - Документ — Pocket Word - document Pocket Word - Dokument Pocket Word - Pocket Word-dokument - Pocket-Word-Dokument - έγγραφο Pocket Word - Pocket Word document - documento de Pocket Word - Pocket Word dokumentua - Pocket Word -asiakirja - Pocket Word skjal - document Pocket Word - cáipéis Pocket Word - documento de Pocket Word - מסמך של Pocket Word - Pocket Word dokumentum - Dokumen Pocket Word - Documento Pocket Word - Pocket Word ドキュメント - Pocket Word құжаты - Pocket Word 문서 - Pocket Word dokumentas - Pocket Word dokuments - Pocket Word-document - Dokument Pocket Word - Documento do Pocket Word - Document Pocket Word - документ Pocket Word - Dokument Pocket Word - Dokument Pocket Word - Pocket Word-dokument - Pocket Word belgesi - документ Pocket Word - Tài liệu Pocket Word - Pocket Word 文档 - Pocket Word 文件 - - - - - - - - profiler results - نتائج المحلل - profiler nəticələri - vyniki profilera - Резултати от анализатора - resultats del perfilador - Výsledky profiler - canlyniadau proffeilio - profileringsresultater - Profiler-Ergebnisse - αποτελέσματα μετρήσεων για την εκτέλεση προγράμματος - profiler results - resultoj de profililo - resultados del perfilador - profiler-aren emaitzak - profilointitulokset - résultats de profileur - torthaí próifíleora - resultados do perfilador - תוצאות מאבחן - profilírozó-eredmények - hasil profiler - Risultati profiler - プロファイラー結果 - прифильдеу нәтижелері - 프로파일러 결과 - profiliklio rezultatai - profilētāja rezultāti - Hasil pemprofil - profileingsresultat - profiler-resultaten - profileringsresultat - Wyniki profilowania - resultados do 'profiler' - Resultados do profiler - rezultate profiler - результаты профилирования - Výsledky profilera - rezultati profilirnika - Rezultate të profiluesit - резултати профилатора - profilerarresultat - результати профілювання - kết quả nét hiện trạng - profiler 结果 - 硬體資訊產生器成果 - - - - - - Pathetic Writer document - مستند Pathetic Writer - Dakument Pathetic Writer - Документ — Pathetic Writer - document de Pathetic Writer - Dokument Pathetic Writer - Pathetic Writer-dokument - Pathetic-Writer-Dokument - έγγραφο Pathetic Writer - Pathetic Writer document - dokumento de Pathetic Writer - documento de Pathetic Writer - Pathetic Writer dokumentua - Pathetic Writer -asiakirja - Pathetic Writer skjal - document Pathetic Writer - cáipéis Pathetic Writer - documento de Pathetic Writer - מסמך של Pathetic Writer - Pathetic Writer-dokumentum - Dokumen Pathetic Writer - Documento Pathetic Writer - Pathetic Writer ドキュメント - Pathetic Writer құжаты - Pathetic Writer 문서 - Pathetic Writer dokumentas - Pathetic Writer dokuments - Dokumen Pathetic Writer - Pathetic Writer-dokument - Pathetic Writer-document - Pathetic Writer-dokument - Dokument Pathetic Writer - documento do Pathetic Writer - Documento do Pathetic Writer - Document Pathetic Writer - документ Pathetic Writer - Dokument Pathetic Writer - Dokument Pathetic Writer - Dokument Pathetic Writer - Документ Патетичног писца - Pathetic Writer-dokument - Pathetic Writer belgesi - документ Pathetic Writer - Tài liệu Pathetic Writer - Pathetic Writer 文档 - Pathetic Writer 文件 - - - - - Python bytecode - Python bytecode - Python bayt kodu - Bajtavy kod Python - Байт код — Python - bytecode de Python - Bajtový kód Python - Côd beit Python - Pythonbytekode - Python-Bytecode - συμβολοκώδικας Python - Python bytecode - Python-bajtkodo - bytecode Python - Python byte-kodea - Python-tavukoodi - Python býtkota - bytecode Python - beartchód Python - bytecode de Python - Bytecode של Python - Python-bájtkód - Kode bita Python - Bytecode Python - Python バイトコード - Python байткоды - 파이썬 바이트코드 - Python baitinis kodas - Python bitkods - Kodbait Python - Python-bytekode - Python-bytecode - Python-bytekode - Kod bajtowy Python - código binário Python - Código compilado Python - Bytecode Python - байт-код Python - Bajtový kód Python - Datoteka bitne kode Python - Bytecode Python - Питонов бајт ко̂д - Python-bytekod - байт-код Python - Mã byte Python - Python 字节码 - Python 位元組碼 - - - - - - - - QtiPlot document - - - - - - - - - - Quattro Pro spreadsheet - جدول Quattro Pro - Raźlikovy arkuš Quattro Pro - Таблица — Quattro Pro - full de càlcul de Quattro Pro - Sešit Quattro Pro - Quattro Pro-regneark - Quattro-Pro-Tabelle - λογιστικό φύλλο Quattro Pro - Quattro Pro spreadsheet - sterntabelo de Quattro Pro - hoja de cálculo Quattro Pro - Quattro Pro kalkulu-orria - Quattro Pro -taulukko - Quattro Pro rokniark - feuille de calcul Quattro Pro - scarbhileog Quattro Pro - folla de cálculo Quattro Pro - גליון נתונים של Quattro Pro - Quattro Pro proračunska tablica - Quattro Pro-munkafüzet - Lembar sebar Quattro Pro - Foglio di calcolo Quattro Pro - Quattro Pro スプレッドシート - Quattro Pro электрондық кестесі - Quattro Pro 스프레드시트 - Quattro Pro skaičialentė - Quattro Pro izklājlapa - Hamparan Quatro Pro - Quattro Pro-regneark - Quattro Pro-rekenblad - Quattro Pro-rekneark - Arkusz Quattro Pro - folha de cálculo Quattro Pro - Planilha do Quattro Pro - Foaie de calcul Quattro Pro - электронная таблица Quattro Pro - Zošit Quattro Pro - Preglednica Quattro Pro - Fletë llogaritjesh Quattro Pro - Quattro Pro табеларни рачун - Quattro Pro-kalkylblad - ел. таблиця Quattro Pro - Bảng tính Quattro Pro - Quattro Pro 工作簿 - Quattro Pro 試算表 - - - - - - - QuickTime metalink playlist - قائمة تشغيل QuickTime metalink - śpis metaspasyłak na pieśni QuickTime - Списък за изпълнение — QuickTime - llista de reproducció de metaenllaços QuickTime - Seznam skladeb metalink QuickTime - QuickTime metalink-afspilningsliste - QuickTime-Metalink-Wiedergabeliste - λίστα αναπαραγωγής metalinks QuickTime - QuickTime metalink playlist - lista de reproducción de metaenlaces QuickTime - QuickTime meta-esteken erreprodukzio-zerrenda - QuickTime metalink -soittolista - QuickTime metaleinkju avspælingarlisti - liste de lecture metalink QuickTime - seinmliosta meiteanasc QuickTime - lista de reprodución de metaligazóns QuickTime - רשימת השמעה מקושרת של QuickTime - QuickTime metalink lejátszólista - Senarai berkas taut meta QuickTime - Scaletta metalink QuickTime - QuickTime メタリンク再生リスト - QuickTime метасілтемелер ойнау тізімі - 퀵타임 메타링크 재생 목록 - QuickTime metanuorodos grojaraštis - QuickTime metasaites repertuārs - QuickTime metalink-spilleliste - QuickTime metalink-afspeellijst - QuickTime metalink-speleliste - Lista odtwarzania metaodnośników QuickTime - Lista de reprodução metalink do QuickTime - Listă cu metalegături QuickTime - список воспроизведения мета-ссылок QuickTime - Zoznam skladieb metalink QuickTime - Seznam predvajanja QuickTime - Listë titujsh metalink QuickTime - QuickTime-metalänkspellista - список відтворення QuickTime metalink - Danh mục nhạc siêu liên kết Quicktime - QuickTime 元链接播放列表 - QuickTime metalink 播放清單 - - - - - - - - - - - - - - - Quicken document - مستند Quicken - Quicken sənədi - Dakument Quicken - Документ — Quicken - document de Quicken - Dokument Quicken - Dogfen Quicken - Quickendokument - Quicken-Dokument - έγγραφο Quicken - Quicken document - Quicken-dokumento - documento de Quicken - Quicken dokumentua - Quicken-asiakirja - Quicken skjal - document Quicken - cáipéis Quicken - documento de Quicken - מסמך של Quicken - Quicken dokument - Quicken-dokumentum - Dokumen Quicken - Documento Quicken - Quicken ドキュメント - Quicken құжаты - Quicken 문서 - Quicken dokumentas - Quicken dokuments - Dokumen Quicken - Quicken-dokument - Quicken-document - Quicken-dokument - Dokument Quicken - documento Quicken - Documento do Quicken - Document Quicken - документ Quicken - Dokument Quicken - Dokument Quicken - Dokument Quicken - Quicken документ - Quicken-dokument - документ Quicken - Tài liệu Quicken - Quicken 文档 - Quicken 文件 - - - - - RAR archive - أرشيف RAR - Archiŭ RAR - Архив — RAR - arxiu RAR - Archiv RAR - Archif RAR - RAR-arkiv - RAR-Archiv - αρχείο RAR - RAR archive - RAR-arkivo - archivador RAR - RAR artxiboa - RAR-arkisto - RAR skjalasavn - archive RAR - cartlann RAR - ficheiro RAR - ארכיון RAR - RAR arhiva - RAR-archívum - Arsip RAR - Archivio RAR - RAR アーカイブ - RAR архиві - RAR 압축 파일 - RAR archyvas - RAR arhīvs - Arkib RAR - RAR-arkiv - RAR-archief - RAR-arkiv - Archiwum RAR - arquivo RAR - Pacote RAR - Arhivă RAR - архив RAR - Archív RAR - Datoteka arhiva RAR - Arkiv RAR - РАР архива - RAR-arkiv - архів RAR - Kho nén RAR - RAR 归档文件 - RAR 封存檔 - RAR - Roshal ARchive - - - - - - - - - DAR archive - أرشيف DAR - Archiŭ DAR - Архив — DAR - arxiu DAR - Archiv DAR - DAR-arkiv - DAR-Archiv - συμπιεσμένο αρχείο DAR - DAR archive - DAR-arkivo - archivador DAR - DAR artxiboa - DAR-arkisto - DAR skjalasavn - archive DAR - cartlann DAR - arquivo DAR - ארכיון DAR - DAR arhiva - DAR archívum - Arsip DAR - Archivio DAR - DAR アーカイブ - DAR არქივი - DAR архиві - DAR 묶음 파일 - DAR archyvas - DAR arhīvs - DAR-arkiv - DAR-archief - DAR-arkiv - Archiwum DAR - Pacote DAR - Arhivă DAR - архив DAR - Archív DAR - Datoteka arhiva DAR - Arkiv DAR - DAR-arkiv - архів DAR - Kho nén DAR - DAR 归档文件 - DAR 封存檔 - - - - - - - - Alzip archive - أرشيف Alzip - Archiŭ Alzip - Архив — alzip - arxiu Alzip - Archiv Alzip - Alziparkiv - Alzip-Archiv - Alzip archive - Alzip-arkivo - archivador Alzip - Alzip artxiboa - Alzip-arkisto - Alsip skjalasavn - archive alzip - cartlann Alzip - arquivo Alzip - ארכיון Alzip - Alzip arhiva - Alzip archívum - Arsip Alzip - Archivio Alzip - Alzip アーカイブ - Alzip არქივი - Alzip архиві - 알집 압축 파일 - Alzip archyvas - Alzip arhīvs - Alzip-arkiv - Alzip-archief - Alzip-arkiv - Archiwum alzip - Pacote Alzip - Arhivă Alzip - архив ALZIP - Archív Alzip - Datoteka arhiva Alzip - Arkiv Alzip - Alzip-arkiv - Alzip arşivi - архів Alzip - Kho nén Alzip - Alzip 归档文件 - Alzip 封存檔 - - - - - - - - rejected patch - رقعة مرفوضة - niepryniaty patch - Отхвърлен файл с кръпка - pedaç rebutjat - Odmítnutá záplata - afvist tekstlap - Abgelehnter Patch - μπάλωμα που απορρίφθηκε - rejected patch - reĵeta flikaĵo - parche rechazado - baztertutako bide-izena - hylättyjen muutosten tiedosto - vrakað rætting - correctif rejeté - paiste diúltaithe - parche rexeitado - תלאי שנדחה - odbijena zakrpa - visszautasított folt - patch ditolak - Patch rifiutata - 拒否されたパッチ - алынбаған патч - 거부된 패치 파일 - atmestas lopas - noraidītais ceļš - Tampungan ditolak - avvist patchfil - verworpen patch - avvist programfiks - Odrzucona łata - ficheiro de patch rejeitado - Arquivo de patch rejeitado - petec respsins - отвергнутый патч - Odmietnutá záplata - zavrnjen popravek - Patch i kthyer mbrapsht - одбијена закрпа - avvisad programfix - відхилена латка - đắp vá bị từ chối - 拒绝的补丁 - 回絕的修補 - - - - - - - RPM package - حزمة RPM - Pakunak RPM - Пакет — RPM - paquet RPM - Balíček RPM - RPM-pakke - RPM-Paket - πακέτο RPM - RPM package - RPM-pakaĵo - paquete RPM - RPM paketea - RPM-paketti - RPM pakki - paquet RPM - pacáiste RPM - paquete RFM - חבילת RPM - RPM paket - RPM-csomag - Paket RPM - Pacchetto RPM - RPM パッケージ - RPM дестесі - RPM 패키지 - RPM paketas - RPM pakotne - Pakej RPM - RPM-pakke - RPM-pakket - RPM-pakke - Pakiet RPM - pacote RPM - Pacote RPM - Pachet RPM - пакет RPM - Balík RPM - Datoteka paketa RPM - Paketë RPM - RPM пакет - RPM-paket - пакунок RPM - Gói RPM - RPM 软件包 - RPM 套件 - - - - - - - - - Source RPM package - - - - - - - Ruby script - سكربت روبي - Skrypt Ruby - Скрипт — Ruby - script Ruby - Skript v Ruby - Rubyprogram - Ruby-Skript - πρόγραμμα εντολών Ruby - Ruby script - Ruby-skripto - script en Ruby - Ruby script-a - Ruby-komentotiedosto - Ruby boðrøð - script Ruby - script Ruby - Script de Ruby - תסריט Ruby - Ruby skripta - Ruby-parancsfájl - Skrip Ruby - Script Ruby - Ruby スクリプト - Ruby сценарийі - 루비 스크립트 - Ruby scenarijus - Ruby skripts - Skrip Ruby - Ruby-skript - Ruby-script - Ruby-skript - Skrypt Ruby - 'script' Ruby - Script Ruby - Script Ruby - сценарий Ruby - Skript Ruby - Skriptna datoteka Ruby - Script Ruby - Руби скрипта - Ruby-skript - Ruby betiği - скрипт Ruby - Văn lệnh Ruby - Ruby 脚本 - Ruby 指令稿 - - - - - - - - - - - Markaby script - سكربت Markaby - Skrypt Markaby - Скрипт — Markaby - script Markaby - Skript Markaby - Markabyprogram - Markaby-Skript - δέσμη εντολών Markaby - Markaby script - Markaby-skripto - script en Markaby - Markaby script-a - Markaby-komentotiedosto - Markaby boðrøð - script Markaby - script Markaby - Script de Markaby - תסריט Markby - Markaby skripta - Markaby parancsfájl - Skrip Markaby - Script Markaby - Markaby スクリプト - Markaby-ის სცენარი - Markaby сценарийі - Markaby 스크립트 - Markaby scenarijus - Markaby skripts - Markaby-skript - Markaby-script - Markaby-skript - Skrypt Markaby - Script Markaby - Script Markaby - сценарий Markaby - Skript Markaby - Skriptna datoteka Markaby - Script Markaby - Markaby-skript - Markaby betiği - скрипт Markaby - Văn lệnh Markaby - RMarkaby 脚本 - Markaby 指令稿 - - - - - - SC/Xspread spreadsheet - جدول SC/Xspread - Raźlikovy arkuš SC/Xspread - Таблица — SC/Xspread - full de càlcul de SC/Xspread - Sešit SC/Xspread - SC/Xspread-regneark - SX/Xspread-Tabelle - φύλλο εργασίας SC/Xspread - SC/Xspread spreadsheet - SC/Xspread-kalkultabelo - hoja de cálculo SC/Xspread - SC/Xspread kalkulu-orria - SC/Xspread-taulukko - SC/Xspread rokniark - feuille de calcul SC/Xspread - scarbhileog SC/Xspread - folla de cálculo SC/Xspread - גליון נתונית של SC/Xspread - SC/Xspread proračunska tablica - SC/Xspread táblázat - Lembar sebar SC/Xspread - Foglio di calcolo SC/Xspread - SC/Xspread スプレッドシート - SC/Xspread электрондық кестесі - SC/Xspread 스프레드시트 - SC/Xspread skaičialentė - SC/Xspread izklājlapa - SC/Xspread-regneark - SC/Xspread-rekenblad - SC/Xspread-rekneark - Arkusz SC/Xspread - Planilha do SC/Xspread - Foaie de calcul SC/Xspread - электронная таблица SC/Xspread - Zošit SC/Xspread - Preglednica SC/Xspread - Fletë llogaritjesh SC/Xspread - SC/Xspread-kalkylblad - ел. таблиця SC/Xspread - Bảng tính SC/Xspread - SC/Xspread 工作簿 - SC/Xspread 試算表 - - - - - - - shell archive - أرشيف شِل - qabıq arxivi - archiŭ abałonki - Архив на обвивката - arxiu d'intèrpret d'ordres - Archiv shellu - archif plisgyn - skalarkiv - Shell-Archiv - αρχείο φλοιού (SHAR) - shell archive - ŝel-arkivo - archivador shell - shell artxiboa - komentotulkkiarkisto - skel savn - archive shell - cartlann bhlaoisce - ficheiro shell - ארכיון מעטפת - arhiva ljuske - héjarchívum - arsip shell - Archivio shell - シェルアーカイブ - қоршам архиві - 셸 압축 파일 - shell archyvas - čaulas arhīvs - Arkib shell - skallarkiv - shell-archief - skal-arkiv - Archiwum powłoki - arquivo de consola - Pacote shell - arhivă shell - архив оболочки UNIX - Archív shellu - lupinski arhiv - Arkiv shell - Архива љуске (SHAR) - skalarkiv - архів оболонки - kho trình bao - shell 归档文件 - shell 封存檔 - - - - - libtool shared library - مكتبة libtool المشتركة - supolnaja biblijateka libtool - Споделена библиотека — libtool - biblioteca compartida libtool - Sdílená knihovna libtool - libtool delt bibliotek - Gemeinsame libtool-Bibliothek - κοινόχρηστη βιβλιοθήκη libtool - libtool shared library - biblioteca compartida de libtool - libtool partekatutako liburutegia - jaettu libtool-kirjasto - libtool felagssavn - bibliothèque partagée libtool - comhleabharlann libtool - biblioteca compartida de libtool - ספריה משותפת של libtool - libtool dijeljena biblioteka - libtool osztott programkönyvtár - pustaka bersama libtool - Libreria condivisa libtool - libtool 共有ライブラリ - libtool ортақ жинағы - libtool 공유 라이브러리 - libtool bendroji biblioteka - libtool koplietotā bibliotēka - libtool delt bibliotek - gedeelde libtool-bibliotheek - libtool delt bibliotek - Biblioteka współdzielona libtool - Biblioteca compartilhada libtool - bibliotecă partajată libtool - разделяемая библиотека libtool - Zdieľaná knižnica libtool - Souporabna knjižnica libtool - Librari e përbashkët libtool - delat libtool-bibliotek - спільна бібліотека libtool - thư viện dùng chung libtool - libtool 共享库 - libtool 共享函式庫 - - - - - - shared library - مكتبة مشتركة - bölüşülmüş kitabxana - supolnaja biblijateka - Споделена библиотека - biblioteca compartida - Sdílená knihovna - llyfrgell wedi ei rhannu - delt bibliotek - Gemeinsame Bibliothek - αρχείο κοινόχρηστης βιβλιοθήκης - shared library - dinamike bindebla biblioteko - biblioteca compartida - partekatutako liburutegia - jaettu kirjasto - felagssavn - bibliothèque partagée - comhleabharlann - biblioteca compartida - ספרייה משותפת - dijeljena biblioteka - osztott programkönyvtár - pustaka bersama - Libreria condivisa - 共有ライブラリ - бөлісетін библиотека - 공유 라이브러리 - bendroji biblioteka - koplietotā bibliotēka - Pustaka terkongsi - delt bibliotek - gedeelde bibliotheek - delt bibliotek - Biblioteka współdzielona - biblioteca partilhada - Biblioteca compartilhada - bibliotecă partajată - разделяемая библиотека - Zdieľaná knižnica - souporabljena knjižnica - Librari e përbashkët - дељена библиотека - delat bibliotek - спільна бібліотека - thư viện dùng chung - 共享库 - 共享函式庫 - - - - - - - - - - - - - - - - - - - - shell script - سكربت شِل - qabıq skripti - skrypt abałonki - Скрипт на обвивката - script d'intèrpret d'ordres - Skript shellu - sgript plisgyn - skalprogram - Shell-Skript - αρχείο εντολών φλοιού - shell script - ŝelskripto - script en shell - shell script-a - komentotulkin komentotiedosto - skel boðrøð - script shell - script bhlaoisce - script de shell - תסריט מעטפת - skripta ljuske - héj-parancsfájl - skrip shell - Script shell - シェルスクリプト - қоршам сценарийі - 셸 스크립트 - shell scenarijus - čaulas skripts - Skrip shell - skallskript - shellscript - skalskript - Skrypt powłoki - 'script' de consola - Script shell - script shell - сценарий оболочки UNIX - Skript shellu - lupinski skript - Script shell - скрипта љуске - skalskript - скрипт оболонки - văn lệnh trình bao - shell 脚本 - shell 指令稿 - - - - - - - - - - - - - - - - - - - - - Shockwave Flash file - ملف Shockwave Flash - Fajł Shockwave Flash - Файл — Shockwave Flash - fitxer Shockwave Flash - Soubor Shockwave Flash - Shockwave Flash-fil - Shockwave-Flash-Datei - αρχείο Shockwave Flash - Shockwave Flash file - dosiero de Shockwave Flash - archivo Shockwave Flash - Shockwave Flash fitxategia - Shockwave Flash -tiedosto - Shockwave Flash fíla - fichier Shockwave Flash - comhad Shockwave Flash - ficheiro sockwave Flash - קובץ של Shockwave Flash - Shockwave Flash datoteka - Shockwave Flash-fájl - Berkas Shockwave Flash - File Shockwave Flash - Shockwave Flash ファイル - Shockwave Flash файлы - Shockwave 플래시 파일 - Shockwave Flash failas - Shockwave Flash datne - Fail Shockwave Flash - Shockwave Flash-fil - Shockwave Flash-bestand - Shockwave Flash-fil - Plik Shockwave Flash - ficheiro Shockwave Flash - Arquivo Shockwave Flash - Fișier Shockwave Flash - файл Shockwave Flash - Súbor Shockwave Flash - Datoteka Shockwave Flash - File Flash Shockwave - Шоквејв Флеш датотека - Shockwave Flash-fil - файл Shockwave Flash - Tập tin Flash Shockwave - Shockwave Flash 文件 - Shockwave Flash 檔 - - - - - - - - - - - - - Shorten audio - Shorten سمعي - Aŭdyjo Shorten - Аудио — Shorten - àudio Shorten - Zvuk Shorten - Shortenlyd - Shorten-Audio - ήχος Shorten - Shorten audio - Shorten-sondosiero - sonido Shorten - Shorten audioa - Shorten-ääni - Shorten ljóður - audio Shorten - fuaim Shorten - son Shorten - שמע של Shorten - Shorten audio - Shorten hang - Audio Shorten - Audio Shorten - Shorten オーディオ - Shorten аудиосы - Shorten 오디오 - Shorten garso įrašas - Shorten audio - Shorten lyd - Shorten-audio - Shorten-lyd - Plik dźwiękowy Shorten - Áudio Shorten - Audio Shorten - аудио Shorten - Zvuk Shorten - Zvočna datoteka Shorten - Audio Shorten - Shorten-ljud - звук Shorten - Âm thanh Shorten - Shorten 音频 - Shorten 音訊 - - - - - - - - Siag spreadsheet - جدول Siag - Raźlikovy arkuš Siag - Таблица — Siag - full de càlcul Siag - Sešit Siag - Siagregneark - Siag-Tabelle - λογιστικό φύλλο Siag - Siag spreadsheet - Siag-kalkultabelo - hoja de cálculo de Siag - Siag kalkulu-orria - Siag-taulukko - Siag rokniark - feuille de calcul Siag - scarbhileog Siag - folla de cálculo de Siag - גליון נתונים של Siag - Siag proračunska tablica - Siag-munkafüzet - Lembar sebar Siag - Foglio di calcolo Siag - Siag スプレッドシート - Siag электрондық кестесі - Siag 스프레드시트 - Siag skaičialentė - Siag izklājlapa - Hamparan Siag - Siag-regneark - Siag-rekenblad - Siag-rekneark - Arkusz Siag - folha de cálculo Siag - Planilha do Siag - Foaie de calcul Siag - электронная таблица Siag - Zošit Siag - Preglednica Siag - Fletë llogaritjesh Siag - Siag табеларни прорачун - Siag-kalkylblad - ел. таблиця Siag - Bảng tính Slag - Siag 工作簿 - Siag 試算表 - - - - - Skencil document - مستند Skencil - Dakument Skencil - Документ — Skencil - document Skencil - Dokument Skencil - Skencildokument - Skencil-Dokument - έγγραφο Skencil - Skencil document - Skencil-dokumento - documento Skencil - Skencil dokumentua - Skencil-asiakirja - Skencil skjal - document Skencil - cáipéis Skencil - documento Skencil - מסמך Skencil - Skencil dokument - Skencil-dokumentum - Dokumen Skencil - Documento Skencil - Skencil ドキュメント - Skencil құжаты - Skencil 문서 - Skencil dokumentas - Skencil dokuments - Skencil-document - Skencil-dokument - Dokument Skencil - Documento do Skencil - Document Skencil - документ Skencil - Dokument Skencil - Dokument Skencil - Dokument Skencil - Skencil-dokument - Skencil belgesi - документ Skencil - Tài liệu Skencil - Skencil 文档 - Skencil 文件 - - - - - - - - Stampede package - حزمة Stampede - Stampede paketi - Pakunak Stampede - Пакет — Stampede - paquet Stampede - Balíček Stampede - Pecyn Stampede - Stampedepakke - Stampede-Paket - πακέτο Stampede - Stampede package - Stampede-pakaĵo - paquete Stampede - Stampede paketea - Stampede-paketti - Stampede pakki - paquet Stampede - pacáiste Stampede - paquete Stampede - חבילה של Stampede - Stampede paket - Stampede-csomag - Paket Stampede - Pacchetto Stampede - Stampede パッケージ - Stampede дестесі - Stampete 패키지 - Stampede paketas - Stampede pakotne - Pakej Stampede - Stampede-pakke - Stampede-pakket - Stampede-pakke - Pakiet Stampede - pacote Stampede - Pacote Stampede - Pachet Stampede - пакет Stampede - Balíček Stampede - Datoteka paketa Stampede - Paketë Stampede - Stampede пакет - Stampede-paket - Stampede paketi - пакунок Stampede - Gói Stampede - Stampede 软件包 - Stampede 套件 - - - - Sega Master System/Game Gear ROM - ROM الخاص بدولاب لعبة/نظام سيجا ماستر - Sega Master System/Game Gear ROM - ROM — Sega Master System/Game Gear - ROM de Sega Master System/Game Gear - ROM pro Sega Master System/Game Gear - Sega Master System/Game Gear-rom - Sega-Master-System/Game-Gear-ROM - Εικόνα μνήμης ROM Sega Master System/Game Gear - Sega Master System/Game Gear ROM - ROM de Sega Master System/Game Gear - Sega Master System/Game Gear-eko ROMa - Sega Master System/Game Gear -ROM - Sega Master System/Game Gear ROM - ROM Sega Master System/Game Gear - ROM Sega Master System/Game Gear - ROM de Sega Master System/Game Gear - Sega Master System/Game Gear של ROM - Sega Master System/Game Gear ROM - Sega Master System/Game Gear ROM - Memori baca-saja Sega Master System/Game Gear - ROM Sega Master System/Game Gear - セガ マスターシステム/ゲームギア ROM - Sega Master System/Game Gear ROM - 세가 마스터 시스템/게임 기어 롬 - Sega Master System/Game Gear ROM - Sega Master System/Game Gear ROM - Sega Master System/Game Gear-ROM - Sega Master System/Game Gear-ROM - Sega Master System/Game Gear-ROM - Plik ROM konsoli SMS/Game Gear - ROM do Sega Master System/Game Gear - ROM Sega Master System/Game Gear - Sega Master System/Game Gear ROM - ROM pre Sega Master System/Game Gear - Bralni pomnilnik Sega Master System/Game Gear - ROM Sega Master System/Game Gear - Sega Master System/Game Gear-rom - ППП Sega Master System/Game Gear - ROM Sega Master System/Game Gear - Sega Master System/Game Gear ROM - Sega Master System/Game Gear ROM - - - - - - - Super NES ROM - Super NES ROM - Super Nintendo ROM - ROM — Super NES - ROM de Super NES - ROM pro Super Nintendo - Super NES-rom - Super-NES-ROM - εικόνα μνήημης ROM Super NES - Super NES ROM - ROM de Super NES - Super Nintendo-ko ROMa - Super Nintendo -ROM - Super NES ROM - ROM Super Nintendo - ROM Super NES - ROM de Super NES - ROM של Super NES - Super NES ROM - Super NES ROM - Memori baca-saja Super Nintendo - ROM Super Nintendo - スーパーファミコン ROM - Super NES ROM - 수퍼 NES 롬 - Super NES ROM - Super NES ROM - Super Nintendo ROM - Super Nintendo - Super NES-ROM - Plik ROM konsoli SNES - ROM do Super Nintendo - ROM Super Nintendo - Super NES ROM - ROM pre Super Nintendo - Bralni pomnilnik Super NES - ROM Super NES - Super NES-rom - ППП Super NES - ROM Super Nintendo - Super NES ROM - 超級任天堂 ROM - - - - - - - StuffIt archive - أرشيف StuffIt - Archiŭ StuffIt - Архив — StuffIt - arxiu StuffIt - Archiv StuffIt - StuffIt-arkiv - StuffIt-Archiv - συμπιεσμένο αρχείο StuffIt - StuffIt archive - StuffIt-arkivo - archivador StuffIt - StuffIt artxiboa - StuffIt-arkisto - StuffIt skjalasavn - archive StuffIt - cartlann StuffIt - arquivo StuffIt - ארכיון של Sאוככןא - StuffIt arhiva - StuffIt-archívum - Arsip StuffIt - Archivio StuffIt - StuffIt アーカイブ - StuffIt архиві - StuffIt 압축 파일 - StuffIt archyvas - StuffIt arhīvs - StuffIt arkiv - StuffIt-archief - StuffIt-arkiv - Archiwum StuffIt - Pacote StuffIt - Arhivă StuffIt - архив StuffIt - Archív StuffIt - Datoteka arhiva StuffIt - Arkiv StuffIt - StuffIt архива - StuffIt-arkiv - StuffIt arşivi - архів StuffIt - Kho nén Stuffit - Macintosh StuffIt 归档文件 - StuffIt 封存檔 - - - - - - - - - - - SubRip subtitles - ترجمات SubRip - Subtytry SubRip - Субтитри — SubRip - subtítols SubRip - Titulky SubRip - SubRip-undertekster - SubRip-Untertitel - υπότιτλοι SubRip - SubRip subtitles - SubRip-subtekstoj - subtítulos SubRip - SubRip azpitituluak - SubRip-tekstitykset - SubRip undirtekstir - sous-titres SubRip - fotheidil SubRip - subtítulos SubRip - כתוביות של SubRip - SubRip titlovi - SubRip feliratok - Subjudul SubRip - Sottotitoli SubRip - SubRip 字幕 - SubRip субтитрлары - SubRip 자막 파일 - SubRip subtitrai - SubRip subtitri - SubRip undertekst - SubRip-ondertitels - SubRip-teksting - Napisy SubRip - Legendas SubRip - Subtitrare SubRip - субтитры SubRip - Titulky SubRip - Datoteka podnapisov SubRip - Nëntituj SubRip - SubRip-undertexter - SubRip altyazıları - субтитри SubRip - Phụ đề SubRip - SubRip 字幕 - SubRip 字幕 - - - - - - - - - - - - WebVTT subtitles - Субтитри — WebVTT - subtítols WebVTT - Titulky WebVTT - WebVTT-undertekster - WebVTT-Untertitel - υπότιτλοι WebVTT - WebVTT subtitles - Subtítulos WebVTT - WebVTT-tekstitykset - sous-titres WebVTT - subtítulos WebVTT - כתוביות WebVTT - WebVTT titlovi - WebVTT feliratok - Subtitel WebVTT - Sottotitoli WebVTT - WebVTT サブタイトル - WebVTT ქვეტიტრები - WebVTT субтитрлары - WebVTT 자막 - WebVTT subtitri - WebVTT ondertitels - Napisy WebVTT - Legendas WebVTT - субтитры WebVTT - Podnapisi WebVTT - WebVTT-undertexter - субтитри WebVTT - WebVTT 字幕 - WebVTT 字幕 - VTT - Video Text Tracks - - - - - - - - - SAMI subtitles - ترجمات SAMI - Subtytry SAMI - Субтитри — SAMI - subtítols SAMI - Titulky SAMI - SAMI-undertekster - SAMI-Untertitel - υπότιτλοι SAMI - SAMI subtitles - SAMI-subtekstoj - subtítulos SAMI - SAMI azpitituluak - SAMI-tekstitykset - SAMI undirtekstir - sous-titres SAMI - fotheidil SAMI - subtítulos SAMI - כתוביות SAMI - SAMI titlovi - SAMI feliratok - Subjudul SAMI - Sottotitoli SAMI - SAMI 字幕 - SAMI субтитрлары - SAMI 자막 파일 - SAMI subtitrai - SAMI subtitri - SAMI undertekst - SAMI-ondertitels - SAMI teksting - Napisy SAMI - Legendas SAMI - Subtitrări SAMI - субтитры SAMI - Titulky SAMI - Datoteka podnapisov SAMI - Nëntituj SAMI - SAMI-undertexter - SAMI altyazıları - субтитри SAMI - Phụ đề SAMI - SAMI 字幕 - SAMI 字幕 - SAMI - Synchronized Accessible Media Interchange - - - - - - - - - - MicroDVD subtitles - ترجمات MicroDVD - Subtytry MicroDVD - Субтитри — MicroDVD - subtítols MicroDVD - Titulky MicroDVD - MicroDVD-undertekster - MicroDVD-Untertitel - υπότιτλοι MicroDVD - MicroDVD subtitles - MicroDVD-subtekstoj - subtítulos MicroDVD - MicroDVD azpitituluak - MicroDVD-tekstitykset - MicroDVD undirtekstir - sous-titres MicroDVD - fotheidil MicroDVD - subtítulos de MicroDVD - כתוביות של MicroDVD - MicroDVD titlovi - MicroDVD feliratok - Subjudul MicroDVD - Sottotitoli MicroDVD - MicroDVD 字幕 - MicroDVD-ის ქვეტიტრები - MicroDVD субтитрлары - MicroDVD 자막 파일 - MicroDVD subtitrai - MicroDVD subtitri - MicroDVD undertekst - MicroDVD-ondertitels - MicroDVD-teksting - Napisy MicroDVD - Legendas MicroDVD - Subtitrări MicroDVD - субтитры MicroDVD - Titulky MicroDVD - Datoteka podnapisov MicroDVD - Nëntituj MicroDVD - MicroDVD-undertexter - MicroDVD altyazısı - субтитри MicroDVD - Phụ đề MicroDVD - MicroDVD 字幕 - MicroDVD 字幕 - - - - - - - - - - MPSub subtitles - ترجمات MPSub - Subtytry MPSub - Субтитри — MPSub - subtítols MPSub - Titulky MPSub - MPSub-undertekster - MPSub-Untertitel - υπότιτλοι MPSub - MPSub subtitles - MPSub-subtekstoj - subtítulos MPSub - MPSub azpitituluak - MPSub-tekstitykset - MPSub undirtekstir - sous-titres MPSub - fotheidil MPSub - subtítulos MPSub - כתוביות MPSub - MPSub titlovi - MPSub feliratok - Subjudul MPSub - Sottotitoli MPSub - MPSub サブタイトル - MPSub ქვეტიტრები - MPSub субтитрлары - MPSub 자막 파일 - MPSub subtitrai - MPSub subtitri - MPSub undertekst - MPSub-ondertitels - MPSub-undertekstar - Napisy MPSub - Legendas MPSub - Subtitrări MPSub - субтитры MPSub - Titulky MPSub - Datoteka podnapisov MPSub - Nëntituj MPSub - MPSub-undertexter - субтитри MPSub - Phụ đề MPSub - MPSub 字幕 - MPSub 字幕 - MPSub - MPlayer Subtitle - - - - - - - - SSA subtitles - ترجمات SSA - Subtytry SSA - Субтитри — SSA - subtítols SSA - Titulky SSA - SSA-undertekster - SSA-Untertitel - υπότιτλοι SSA - SSA subtitles - SSA-subtekstoj - subtítulos SSA - SSA azpitituluak - SSA-tekstitykset - SSA undirtekstir - sous-titres SSA - fotheidil SSA - Subtitulos SSA - כתובית SSA - SSA titlovi - SSA feliratok - Subjudul SSA - Sottotitoli SSA - SSA 字幕 - SSA субтитрлары - SSA 자막 파일 - SSA subtitrai - SSA subtitri - SSA undertekst - SSA-ondertitels - SSA-teksting - Napisy SSA - Legendas SSA - Subtitrări SSA - субтитры SSA - Titulky SSA - Datoteka podnapisov SSA - Nëntituj SSA - SSA-undertexter - SSA altyazıları - субтитри SSA - Phụ đề SSA - SSA 字幕 - SSA 字幕 - SSA - SubStation Alpha - - - - - - - - - - SubViewer subtitles - ترجمات SubViewer - Subtytry SubViewer - Субтитри — SubViewer - subtítols SubViewer - Titulky SubViewer - SubViewer-undertekster - SubViewer-Untertitel - υπότιτλοι SubViewer - SubViewer subtitles - SubViewer-subtekstoj - subtítulos SubViewer - SubViewer azpitituluak - SubViewer-tekstitykset - SubViewer undirtekstir - sous-titres SubViewer - fotheidil SubViewer - subtítulos SubViewer - כתוביות של SubViewe - SubViewer titlovi - SubViewer feliratok - Subjudul SubViewer - Sottotitoli SubViewer - SubViewer 字幕 - SubViewer субтитрлары - SubViewer 자막 파일 - SubViewer subtitrai - SubViewer subtitri - SubViewer undertekst - SubViewer-ondertitels - SubViewer-teksting - Napisy SubViewer - Legendas SubViewer - Subtitrare SubViewer - субтитры SubViewer - Titulky SubViewer - Datoteka podnapisov SubViewer - Nëntituj SubViewer - SubViewer-undertexter - субтитри SubViewer - Phụ đề SubViewer - SubViewer 字幕 - SubViewer 字幕 - - - - - - - - iMelody ringtone - نغمة iMelody - Rington iMelody - Аудио — iMelody - to de trucada iMelody - Vyzváněcí melodie iMelody - iMelody-ringetone - iMelody-Klingelton - ringtone iMelody - iMelody ringtone - tono de llamada iMelody - iMelody doinua - iMelody-soittoääni - iMelody ringitóni - sonnerie iMelody - ton buailte iMelody - Melodía de iMelody - רינגטון של iMelody - iMelody ton zvonjenja - iMelody csengőhang - nada dering iMelody - Suoneria iMelody - iMelody リングトーン - iMelody әуені - iMelody 벨소리 - iMelody skambučio melodija - iMelody melodija - iMelody ringetone - iMelody-beltoon - iMelody-ringetone - Dzwonek iMelody - Toque de celular do iMelody - Sonerie iMelody - мелодия iMelody - Vyzváňacie melódie iMelody - Zvonjenje iMelody - Zile iMelody - iMelody-ringsignal - рінгтон iMelody - tiếng réo iMelody - iMelody 铃声 - iMelody 鈴聲 - - - - - - - - - - SMAF audio - SMAF سمعي - Aŭdyjo SMAF - Аудио — SMAF - àudio SMAF - Zvuk SMAF - SMAF-lyd - SMAF-Audio - ήχος SMAF - SMAF audio - SMAF-sondosiero - sonido SMAF - SMAF audioa - SMAF-ääni - SMAF ljóður - audio SMAF - fuaim SMAF - son SMAF - שמע SMAF - SMAF audio - SMAF hang - Audio SMAF - Audio SMAF - SMAF オーディオ - SMAF аудиосы - SMAF 오디오 - SMAF garso įrašas - SMAF audio - SMAF-lyd - SMAF-audio - SMAF-lyd - Plik dźwiękowy SMAF - Áudio SMAF - Audio SMAF - аудио SMAF - Zvuk SMAF - Zvočna datoteka SMAF - Audio SMAF - SMAF-ljud - звук SMAF - Âm thanh SMAF - SMAF 音频 - SMAF 音訊 - SMAF - Synthetic music Mobile Application Format - - - - - - - - - - MRML playlist - قائمة تشغيل MRML - Śpis piesień MRML - Списък за изпълнение — MRML - llista de reproducció MRML - Seznam skladeb MRML - MRML-afspilningsliste - MRML-Wiedergabeliste - λίστα αναπαραγωγής MRML - MRML playlist - MRML-ludlisto - lista de reproducción MRML - MRML erreprodukzio-zerrenda - MRML-soittolista - MRML avspælingarlisti - liste de lecture MRML - seinmliosta MRML - lista de reprodución MRML - רשימת השמעה MRML - MRML popis za reprodukciju - MRML-lejátszólista - Senarai putar MRML - Scaletta MRML - MPML 再生リスト - MRML რეპერტუარი - MRML ойнау тізімі - MRML 재생 목록 - MRML grojaraštis - MRML repertuārs - MRML-spilleliste - MRML-afspeellijst - MRML-speleliste - Lista odtwarzania MRML - Lista de reprodução do MRML - Listă redare MRML - список воспроизведения MRML - Zoznam skladieb MRML - Seznam predvajanja MRML - Listë titujsh MRML - MRML-spellista - список відтворення MRML - Danh mục nhạc MRML - MRML 播放列表 - MRML 播放清單 - MRML - Multimedia Retrieval Markup Language - - - - - - - - XMF audio - XMF سمعي - Aŭdyjo XMF - Аудио — XMF - àudio XMF - Zvuk XMF - XMF-lyd - XMF-Audio - ήχος XMF - XMF audio - XMF-sondosiero - sonido XMF - XMF audioa - XMF-ääni - XMF ljóður - audio XMF - fuaim XMF - son XMF - שמע XMF - XMF audio - XMF hang - Audio XMF - Audio XMF - XMF オーディオ - XMF аудиосы - XMF 오디오 - XMF garso įrašas - XMF audio - XMF-lyd - XMF-audio - XMF-lyd - Plik dźwiękowy XMF - Áudio XMF - Audio XMF - аудио XMF - Zvuk XMF - Zvočna datoteka XMF - Audio XMF - XMF-ljud - звук XMF - Âm thanh XMF - XMF 音频 - XMF 音訊 - XMF - eXtensible Music Format - - - - - - - - - - SV4 CPIO archive - أرشيف SV4 CPIO - SV4 CPIO arxivi - Archiŭ SV4 CPIO - Архив — SV4 CPIO - arxiu CPIO SV4 - Archiv SV4 CPIO - Archif CPIO SV4 - SV4 CPIO-arkiv - SV4-CPIO-Archiv - αρχείο SV4 CPIO - SV4 CPIO archive - SV4-CPIO-arkivo - archivador SV4 CPIO - SV4 CPIO artxiboa - SV4 CPIO -arkisto - SV4 CPIO skjalasavn - archive SV4 CPIO - cartlann SV4 CPIO - arquivo SV4 CPIO - ארכיון של SV4 SPIO - SV4 CPIO arhiva - SV4 CPIO-archívum - Arsip SV4 CPIO - Archivio SV4 CPIO - SV4 CPIO アーカイブ - SV4 CPIO архиві - SV4 CPIO 묶음 파일 - SV4 CPIO archyvas - SV4 CPIO arhīvs - Arkib CPIO SV4 - SV4 CPIO-arkiv - SV4 CPIO-archief - SV4 CPIO-arkiv - Archiwum SV4 CPIO - ficheiro SV4 CPIO - Pacote SV4 CPIO - Arhivă SV4 CPIO - архив SV4 CPIO - Archív SV4 CPIO - Datoteka arhiva SV4 CPIO - Arkiv SV4 CPIO - SV4 CPIO архива - SV4 CPIO-arkiv - SV4 CPIO arşivi - архів SV4 CPIO - Kho nén CPIO SV4 - SV4 CPIO 归档文件 - SV4 CPIO 封存檔 - - - - - SV4 CPIO archive (with CRC) - أرشيف SV4 CPIO (مع CRC) - Archiŭ SV4 CPIO (z CRC) - Архив — SV4 CPIO, проверка за грешки CRC - arxiu CPIO SV4 (amb CRC) - Archiv SV4 CPIO (s CRC) - SV4 CPIO-arkiv (med CRC) - SV4-CPIO-Archiv (mit CRC) - αρχείο SV4 CPIO (με CRC) - SV4 CPIO archive (with CRC) - SV4-CPIO-arkivo (kun CRC) - archivador SV4 CPIO (con CRC) - SV4 CPIO artxiboa (CRC-rekin) - SV4 CPIO -arkisto (CRC:llä) - SV4 CPIO skjalasavn (við CRC) - archive SV4 CPIO (avec CRC) - cartlann SV4 CPIO (le CRC) - Arquivador SV4 CPIO (con CRC) - ארכיון של SV4 SPIO (עם CRC) - SV4 CPIO arhiva (s CRC-om) - SV4 CPIO-archívum (CRC-vel) - Arsip SV4 CPIO (dengan CRC) - Archivio SV4 CPIO (con CRC) - SV4 CPIO アーカイブ (CRC 有り) - SV4 CPIO архиві (CRC бар) - SV4 CPIO 묶음 파일 (CRC 포함) - SV4 CPII archyvas (su CRC) - SV4 CPIO arhīvs (ar CRC) - Arkib CPIO SV4 (dengan CRC) - SV4 CPIO-arkiv (med CRC) - SV4 CPIO-archief (met CRC) - SV4 CPIO arkiv (med CRC) - Archiwum SV4 CPIO (z sumą kontrolną) - Pacote SV4 CPIO (com CRC) - Arhivă SV4 CPIO (cu CRC) - архив SV4 CPIP (с CRC) - Archív SV4 CPIO (s CRC) - Datoteka arhiva SV4 CPIO (z razpršilom CRC) - Arkiv SV4 CPIO (me CRC) - SV4 CPIO-arkiv (med CRC) - SV4 CPIO arşivi (CRC ile) - архів SV4 CPIO (з CRC) - Kho nén CPIO SV4 (với CRC) - SV4 CPIP 归档文件(带有 CRC) - SV4 CPIO 封存檔 (具有 CRC) - - - - - Tar archive - أرشيف Tar - Tar arxivi - Archiŭ tar - Архив — tar - arxiu tar - Archiv tar - Archif tar - Tar-arkiv - Tar-Archiv - συμπιεσμένο αρχείο Tar - Tar archive - archivador Tar - Tar artxiboa - Tar-arkisto - Tar skjalasavn - archive tar - cartlann Tar - arquivo Tar - ארכיון Tar - Tar arhiva - Tar archívum - Arsip Tar - Archivio tar - Tar アーカイブ - Tar архиві - TAR 묶음 파일 - Tar archyvas - Tar arhīvs - Arkib Tar - Tar-arkiv - Tar-archief - Tar-arkiv - Archiwum tar - Pacote tar - Arhivă Tar - архив TAR - Archív tar - Datoteka arhiva Tar - Arkiv tar - Тар архива - Tar-arkiv - архів tar - Kho nén tar - Tar 归档文件 - Tar 封存檔 - - - - - - - - - - - - Tar archive (compressed) - أرشيف Tar (مضغوط) - Archiŭ tar (skampresavany) - Архив — tar, компресиран - arxiu tar (comprimit) - Archiv tar (komprimovaný) - Tar-arkiv (komprimeret) - Tar-Archiv (komprimiert) - αρχείο Tar (συμπιεσμένο) - Tar archive (compressed) - archivador Tar (comprimido) - Tar artxiboa (konprimitua) - Tar-arkisto (pakattu) - Tar skjalasavn (stappað) - archive tar (compressée) - cartlann Tar (comhbhrúite) - arquivo Tar (comprimido) - ארכיון Tar (מכווץ) - Tar arhiva (komprimirana) - Tar archívum (tömörített) - Arsip Tar (terkompresi) - Archivio tar (compresso) - Tar アーカイブ (compress 圧縮) - Tar архиві (сығылған) - TAR 묶음 파일 (압축) - Tar archyvas (suglaudintas) - Tar arhīvs (saspiests) - Tar-arkiv (komprimert) - Tar-archief (ingepakt) - Tar-arkiv (pakka) - Archiwum tar (skompresowane) - Pacote tar (compactado) - Arhivă Tar (comprimată) - архив TAR (сжатый) - Archív tar (komprimovaný) - Datoteka arhiva Tar (stisnjen) - Arkiv tar (i kompresuar) - Tar-arkiv (komprimerat) - архів tar (стиснений) - Kho nén tar (đã nén) - Tar 归档文件(压缩) - Tar 封存檔 (UNIX 格式壓縮) - - - - - - - generic font file - ملف الخط العام - zvyčajny fajł šryftu - Шрифт - fitxer genèric de tipus de lletra - Obecný soubor písma - general skrifttypefil - Allgemeine Schriftdatei - γενικό αρχείο γραμματοσειράς - generic font file - genera tipara dosiero - tipografía genérico - letra-tipo orokorra - yleinen kirjasintiedosto - felagsstavasniðsfíla - fichier de polices générique - comhad cló ginearálta - ficheiro de tipo de fonte xenérica - קובץ גופן גנרי - općenita datoteka fonta - általános betűkészletfájl - berkas fonta generik - File tipo carattere generico - 一般フォントファイル - қаріп файлы - 일반 글꼴 파일 - bendras šrifto failas - vispārēja fonta datne - Fail font generik - vanlig skriftfil - algemeen lettertypebestand - vanleg skrifttypefil - Zwykły plik czcionki - ficheiro genérico de tipo de letra - Arquivo de fonte genérico - fișier de font generic - файл шрифта - Obyčajný súbor písma - izvorna datoteka pisave - File lloj gërme i përgjithshëm - општа датотека фонта - allmän typsnittsfil - загальний файл шрифту - tập tin phông giống loài - 通用字体文件 - 通用字型檔 - - - - - packed font file - ملف الخط المرزم - zapakavany fajł šryftu - Шрифт — компресиран - fitxer empaquetat de tipus de lletra - Komprimovaný soubor písma - pakket skrifttypefil - Gepackte Schriftdatei - αρχείο συμπιεσμένης γραμματοσειράς - packed font file - pakigita tipara dosiero - archivo de tipografía empaquetada - Letra-tipo fitxategi paketatua - pakattu kirjasintiedosto - pakkað stavasniðsfíla - fichier de polices empaquetées - comhad cló pacáilte - ficheiro de fonte empaquetada - קובץ גופן ארוז - pakirana datoteka fonta - packed font-fájl - berkas fonta terkemas - File tipo carattere condensato - パックされたフォントファイル - қаріп файлы (дестеленген) - 글꼴 묶음 파일 - supakuotas šrifto failas - sapakota fonta datne - Fail font dipek - pakket skriftfil - ingepakt lettertypebestand - pakka skrifttypefil - Plik ze spakowaną czcionką - ficheiro de fontes empacotadas - Arquivo de fonte empacotado - fișier font împachetat - сжатый файл шрифта - Komprimovaný súbor písma - pakirana datoteka pisave - File lloj gërmash i kondensuar - пакована датотека са фонтом - packad typsnittsfil - запакований файл шрифту - tập tin phông chữ đã đóng gói - 打包的字体文件 - 包裝字型檔 - - - - - TGIF document - مستند TGIF - Dakument TGIF - Документ — TGIF - document TGIF - Dokument TGIF - TGIF-dokument - TGIF-Dokument - Σχέδιο TGIF - TGIF document - TGIF-dokumento - documento TGIF - TGIF dokumentua - TGIF-asiakirja - TGIF skjal - document TGIF - cáipéis TGIF - documento TGIF - מסמך TGIF - TGIF dokument - TGIF-dokumentum - Dokumen TGIF - Documento TGIF - TGIF ドキュメント - TGIF құжаты - TGIF 문서 - TGIF dokumentas - TGIF dokuments - Dokumen TGIF - TGIF-dokument - TGIF-document - TGIF-dokument - Dokument TGIF - documento TGIF - Documento TGIF - Document TGIF - документ TGIF - Dokument TGIF - Dokument TGIF - Dokument TGIF - TGIF документ - TGIF-dokument - документ TGIF - Tài liệu TGIF - TGIF 文档 - TGIF 文件 - - - - - - - - theme - سمة - örtük - matyŭ - Тема - tema - Motiv - thema - tema - Thema - Θέμα - theme - etoso - tema - gaia - teema - tema - thème - téama - tema - ערכת נושא - tema - téma - tema - Tema - テーマ - თემა - тема - 테마 - tema - motīvs - Tema - tema - thema - drakt - Motyw - tema - Tema - temă - тема - Motív - tema - Temë - тема - tema - тема - sắc thái - 主题 - 佈景主題 - - - - - - ToutDoux document - مستند ToutDoux - ToutDoux sənədi - Dakument ToutDoux - Документ — ToutDoux - document ToutDoux - Dokument ToutDoux - Dogfen ToutDoux - ToutDoux-dokument - ToutDoux-Dokument - έγγραφο ToutDoux - ToutDoux document - ToutDoux-dokumento - documento de ToutDoux - ToutDoux dokumentua - ToutDoux-asiakirja - ToutDoux skjal - document ToutDoux - cáipéis ToutDoux - documento de ToutDoux - משמך של ToutDoux - ToutDoux dokument - ToutDoux-dokumentum - Dokumen ToutDoux - Documento ToutDoux - ToutDoux ドキュメント - ToutDoux құжаты - ToutDoux 문서 - ToutDoux dokumentas - ToutDoux dokuments - Dokumen ToutDoux - ToutDoux-dokument - ToutDoux-document - ToutDoux-dokument - Dokument ToutDoux - documento ToutDoux - Documento do ToutDoux - Document ToutDoux - документ ToutDoux - Dokument ToutDoux - Dokument ToutDoux - Dokument ToutDoux - ToutDoux документ - ToutDoux-dokument - ToutDoux belgesi - документ ToutDoux - Tài liệu ToutDoux - ToutDoux 文档 - ToutDoux 文件 - - - - backup file - ملف النسخ الاحتياطي - zapasny fajł - Резервно копие - fitxer de còpia de seguretat - Záložní soubor - sikkerhedskopi - Sicherungsdatei - αντίγραφο ασφαλείας - backup file - restaŭrkopio - archivo de respaldo - babes-kopiako fitxategia - varmuuskopio - trygdarritsfíla - fichier de sauvegarde - comhad cúltaca - ficheiro de copia de seguridade - קובץ גיבוי - biztonsági mentés - berkas cadangan - File di backup - バックアップファイル - резервті көшірмесі - 백업 파일 - atsarginis failas - dublējuma datne - Fail backup - sikkerhetskopi - reservekopiebestand - tryggleikskopi - Plik zapasowy - cópia de segurança - Arquivo de backup - fișier de backup - резервная копия - Záložný súbor - varnostna kopija datoteke - File backup - резервна копија - säkerhetskopia - yedek dosyası - резервна копія - tập tin sao lưu - 备份文件 - 備份檔 - - - - - - - - Troff document - مستند Troff - Troff sənədi - Dakument Troff - Документ — Troff - document Troff - Dokument troff - Dogfen troff - Troffdokument - Troff-Dokument - έγγραφο troff - Troff document - Troff-dokumento - documento troff - Troff dokumentua - Troff-asiakirja - Troff skjal - document Troff - cáipéis Troff - documento Troff - מסמך Troff - Troff dokument - Troff-dokumentum - Dokumen Troff - Documento Troff - Troff 入力ドキュメント - Troff құжаты - Troff 문서 - Troff dokumentas - Troff dokuments - Dokumen Troff - Troff-dokument - Troff-document - Troff-dokument - Dokument Troff - documento Troff - Documento troff - Document Troff - документ Troff - Dokument troff - Dokument Troff - Dokument Troff - Troff документ - Troff-dokument - Troff belgesi - документ Troff - Tài liệu Troff - Troff 文档 - Troff 文件 - - - - - - - - - - - - - - - Troff document (with manpage macros) - مستند Troff (مع اختصارات صفحة المساعدة) - Dakument Troff (z makrasam man-staronak) - Документ — Troff, с макроси за справочни страници - document Troff (amb macros de pàgines de manual) - Dokument troff (s makry pro manuálové stránky) - Troffdokument (med manualsidemakroer) - Troff-Dokument (mit man-Seitenmakros) - έγγραφο troff (με μακροεντολές manpage) - Troff document (with manpage macros) - Troff-dokumento (kun manpaĝaj makrooj) - documento troff (con macros de páginas de manual) - Troff dokumentua (manpage makroekin) - Troff-asiakirja (man-sivu-makroilla) - Troff skjal (við manpage fjølvi) - document Troff (avec macros manpage) - cáipéis Troff (le macraí manpage) - documento Troff (con macros de páxinas de manual) - מסמך של Troff (עם מאקרו בmanpage) - Troff dokument (s makro naredbama priručnika) - Troff-dokumentum (manpage-makrókkal) - Dokumen Troff (dengan makro halaman manual) - Documento Troff (con macro per manpage) - Troff 入力ドキュメント (man ページマクロ有り) - Troff құжаты (әдістемелік парақтар макростарымен) - Troff 문서 (man 페이지 매크로 포함) - Troff dokumentas (su žin. puslapių makrokomandomis) - Troff dokuments (ar manpage makrosiem) - Dokumen Troff (dengan macros halaman man) - Troff-dokument (med manualsidemakroer) - Troff-document (met man-macro's) - Troff-dokument med manualside-makroar - Dokument Troff (z makrami stron pomocy) - documento Troff (com macros manpage) - Documento troff (com macros de páginas de manual) - Document Troff (cu macro-uri manpage) - документ Troff (с макросами страниц руководства) - Dokument troff (s makrami pre manuálové stránky) - Dokument Troff (z makroji manpage) - Dokumet Troff (me makro për manpage) - Troff документ (са макроима за ман странице) - Troff-dokument (med manualsidemakron) - документ Troff (з макросами manpage) - Tài liệu Troff (có vĩ lệnh trang hướng dẫn) - Troff 文档(带 Man 手册宏) - Troff 文件 (含有手冊頁面巨集) - - - - - - manual page (compressed) - صفحة المساعدة (مضغوطة) - man səhifəsi (sıxışdırılmış) - staronka dapamohi (skampresavanaja) - Страница от справочника, компресирана - pàgina de manual (comprimida) - Manuálová stránka (komprimovaná) - tudalen llawlyfr (wedi ei gywasgu) - manualside (komprimeret) - Handbuchseite (komprimiert) - σελίδα οδηγιών (συμπιεσμένη) - manual page (compressed) - manpaĝo (kunpremita) - página de manual (comprimida) - eskuliburu orria (konprimitua) - manuaalisivu (pakattu) - handbókasíða (stappað) - page de manuel (compressée) - leathanach lámhleabhair (comhbhrúite) - páxina de manual (comprimida) - דף עזר (מכווץ) - stranica priručnika (komprimirana) - kézikönyvoldal (tömörített) - halaman manual (terkompresi) - Pagina di manuale (compressa) - (圧縮) man ページ - әдістемелік парағы (сығылған) - man 페이지 (압축) - žinyno puslapis (suglaudintas) - rokasgrāmatas lapa (saspiesta) - Halaman manual (termampat) - manualside (komprimert) - handleidingspagina (ingepakt) - manualside (pakka) - Strona podręcznika (skompresowana) - página de manual (comprimida) - Página de manual (compactada) - pagină de manual (comprimată) - страница руководства (сжатая) - Manuálová stránka (komprimovaná) - stran priročnika (stisnjena) - Faqe manuali (e kompresuar) - страна упутства (компресована) - manualsida (komprimerad) - сторінка посібника (стиснена) - trang hướng dẫn (đã nén) - 手册页 (压缩) - 手冊頁面 (壓縮版) - - - - Tar archive (LZO-compressed) - أرشيف Tar (مضغوط-LZO) - Archiŭ tar (LZO-skampresavany) - Архив — tar, компресиран с LZO - arxiu tar (comprimit amb LZO) - Archiv tar (komprimovaný pomocí LZO) - Tar-arkiv (LZO-komprimeret) - Tar-Archiv (LZO-komprimiert) - αρχείο Tar (συμπιεσμένο με LZO) - Tar archive (LZO-compressed) - archivador Tar (comprimido con LZO) - Tar artxiboa (LZO-rekin konprimitua) - Tar-arkisto (LZO-pakattu) - Tar skjalasavn (LZO-stappað) - archive tar (compression LZO) - cartlann Tar (comhbhrúite le LZO) - arquivo Tar (comprimido con LZO) - ארכיון Tar (מכווץ ע"י LZO) - Tar arhiva (komprimirana LZO-om) - Tar archívum (LZO-val tömörítve) - Arsip Tar (terkompresi LZO) - Archivio tar (compresso con LZO) - Tar アーカイブ (LZO 圧縮) - Tar архиві (LZO-мен сығылған) - TAR 묶음 파일 (LZO 압축) - Tar archyvas (suglaudintas su LZO) - Tar arhīvs (saspiests ar LZO) - Tar-arkiv (LZO-komprimert) - Tar-archief (ingepakt met LZO) - Tar-arkiv (pakka med LZO) - Archiwum tar (kompresja LZO) - Pacote tar (compactado com LZO) - Arhivă Tar (comprimată LZO) - архив TAR (сжатый LZO) - Archív tar (komprimovaný pomocou LZO) - Datoteka arhiva Tar (stisnjen z LZO) - Arkiv tar (i kompresuar me LZO) - Tar-arkiv (LZO-komprimerat) - архів tar (стиснений LZO) - Kho nén tar (đã nén LZO) - Tar 归档文件(LZO 压缩) - Tar 封存檔 (LZO 格式壓縮) - - - - - - - XZ archive - أرشيف XZ - Архив — XZ - arxiu XZ - Archiv XZ - XZ-arkiv - XZ-Archiv - συμπιεσμένο αρχείο XZ - XZ archive - XZ-arkivo - archivador XZ - XZ artxiboa - XZ-arkisto - XZ skjalasavn - archive XZ - cartlann XZ - ficheiro XZ - ארכיון XZ - XZ-archívum - Arsip XZ - Archivio XZ - XZ アーカイブ - XZ архиві - XZ 압축 파일 - XZ archyvas - XZ arhīvs - XZ archief - Archiwum XZ - Pacote XZ - Arhivă XZ - архив XZ - Archív XZ - Datoteka arhiva XZ - XZ-arkiv - XZ arşivi - архів XZ - XZ 归档文件 - XZ 封存檔 - - - - - - - - Tar archive (XZ-compressed) - أرشيف Tar (مضغوط-XZ) - Архив — tar, компресиран с XZ - arxiu tar (comprimit amb XZ) - Archiv tar (komprimovaný pomocí XZ) - Tar-arkiv (XZ-komprimeret) - Tar-Archiv (XZ-komprimiert) - αρχείο Tar (συμπιεσμένο με XZ) - Tar archive (XZ-compressed) - archivador Tar (comprimido con XZ) - Tar artxiboa (XZ-rekin konprimitua) - Tar-arkisto (XZ-pakattu) - Tar skjalasavn(XZ-stappað) - archive tar (compression XZ) - cartlann Tar (comhbhrúite le XZ) - arquivo Tar (comprimido con XZ) - ארכיון Tar (מכווץ ע"י XZ) - Tar arhiva (komprimirana XZ-om) - Tar archívum (XZ-vel tömörítve) - Arsip Tar (terkompresi XZ) - Archivio tar (compresso con XZ) - Tar アーカイブ (XZ 圧縮) - Tar архиві (XZ-мен сығылған) - TAR 묶음 파일 (XZ 압축) - Tar archyvas (suglaudintas su XZ) - Tar arhīvs (saspiests ar XZ) - Tar archief (XZ-compressed) - Archiwum tar (kompresja XZ) - Pacote tar (compactado com XZ) - Arhivă Tar (comprimată XZ) - архив TAR (сжатый XZ) - Archív tar (komprimovaný pomocou XZ) - Datoteka arhiva Tar (stisnjen z XZ) - Tar-arkiv (XZ-komprimerat) - архів tar (стиснений XZ) - Tar 归档文件(XZ 压缩) - Tar 封存檔 (XZ 格式壓縮) - - - - - - - PDF document (XZ-compressed) - Документ — PDF, компресиран с XZ - document PDF (comprimit amb XZ) - Dokument PDF (komprimovaný pomocí XZ) - PDF-dokument (XZ-komprimeret) - PDF-Dokument (XZ-komprimiert) - έγγραφο PDF (συμπιεσμένο με XZ) - PDF document (XZ-compressed) - Documento PDF (comprimido en XZ) - PDF-asiakirja (XZ-pakattu) - document PDF (compressé XZ) - documento PDF (comprimido en XZ) - מסמך PDF (בדחיסת XZ) - PDF dokument (komprimiran XZ-om) - PDF dokumentum (XZ-vel tömörített) - Dokumen PDF (terkompresi XZ) - Documento PDF (compresso con XZ) - PDF 文書(XZ 圧縮) - PDF დოკუმენტი (XZ-ით შეკუმშული) - PDF құжаты (XZ-мен сығылған) - PDF 문서 (XZ 압축) - PDF dokuments (saspiests ar XZ) - PDF document (XZ-compressed) - Dokument PDF (kompresja XZ) - Documento PDF (compactado com XZ) - документ PDF (сжатый XZ) - Dokument PDF (XZ-stisnjen) - PDF-dokument (XZ-komprimerad) - документ PDF (стиснений xz) - PDF 文档(XZ) - PDF 文件 (XZ 格式壓縮) - - - - - - Ustar archive - أرشيف Ustar - Archiŭ ustar - Архив — ustar - arxiu ustar - Archiv ustar - Ustararkiv - Ustar-Archiv - συμπιεσμένο αρχείο Ustar - Ustar archive - Ustar-arkivo - archivador Ustar - Ustar artxiboa - Ustar-arkisto - Ustar skjalasavn - archive Ustar - cartlann Ustar - arquivo Ustar - ארכיון Ustar - Ustar arhiva - Ustar archívum - Arsip Ustar - Archivio ustar - Ustar アーカイブ - Ustar архиві - Ustar 압축 파일 - Ustar archyvas - Ustar arhīvs - Ustar-arkiv - Ustar-archief - Ustar-arkiv - Archiwum ustar - Pacote Ustar - Arhivă Ustar - архив Ustar - Archív ustar - Datoteka arhiva Ustar - Arkiv Ustar - Ustar-arkiv - Ustar arşivi - архів ustar - Kho nén ustar - Ustar 归档文件 - Ustar 封存檔 - - - - - WAIS source code - شفرة مصدر WAIS - WAIS mənbə faylı - Kryničny kod WAIS - Изходен код — WAIS - codi font en WAIS - Zdrojový kód WAIS - Ffynhonnell Rhaglen WAIS - WAIS-kildekode - WAIS-Quelltext - πηγαίος κώδικας WAIS - WAIS source code - WAIS-fontkodo - código fuente WAIS - WAIS iturburu-kodea - WAIS-lähdekoodi - WAIS keldukota - code source WAIS - cód foinseach WAIS - código fonte WAIS - קוד מקור של WAIS - WAIS izvorni kod - WAIS-forráskód - Kode program WAIS - Codice sorgente WAIS - WAIS ソースコード - WAIS бастапқы коды - WAIS 소스 코드 - WAIS pradinis kodas - WAIS pirmkods - Kod sumber WAIS - WAIS-kildekode - WAIS-broncode - WAIS-kjeldekode - Plik źródłowy WAIS - código fonte WAIS - Código-fonte WAIS - Cod sursă WAIS - исходный код WAIS - Zdrojový kód WAIS - Datoteka izvorne kode WAIS - Kod burues WAIS - WAIS изворни ко̂д - WAIS-källkod - WAIS kaynak kodu - вихідний код мовою WAIS - Mã nguồn WAIS - WAIS 源代码 - WAIS 源碼 - - - - - WordPerfect/Drawperfect image - صورة WordPerfect/Drawperfect - Vyjava WordPerfect/Drawperfect - Изображение — WordPerfect/Drawperfect - imatge de WordPerfect/Drawperfect - Obrázek WordPerfect/Drawperfect - WordPerfect/Drawperfect-billede - WordPerfect/DrawPerfect-Bild - εικόνα WordPerfect/Drawperfect - WordPerfect/Drawperfect image - WordPerfect/Drawperfect-bildo - imagen de WordPerfect/Drawperfect - WordPerfect/Drawperfect irudia - WordPerfect/Drawperfect-kuva - WordPerfect/Drawperfect mynd - image WordPerfect/DrawPerfect - íomhá WordPerfect/Drawperfect - imaxe de WordPerfect/DrawPerfect - תמונה של WordPerfect/Drawperfect - WordPerfect/Drawperfect slika - WordPerfect/Drawperfect-kép - Gambar WordPerfect/Drawperfect - Immagine WordPerfect/Drawperfect - WordPerfect/Drawperfect 画像 - WordPerfect/Drawperfect суреті - 워드퍼펙트/드로퍼펙트 그림 - WordPerfect/Drawperfect paveikslėlis - WordPerfect/Drawperfect attēls - Imej WordPerfect/Drawperfect - WordPerfect-/Drawperfect-bilde - WordPerfect/Drawperfect-afbeelding - WordPerfect/DrawPerfect-bilete - Obraz WordPerfect/DrawPerfect - imagem do WordPerfect/Drawperfect - Imagem do WordPerfect/Drawperfect - Imagine WordPerfect/Drawperfect - изображение WordPerfect/Drawperfect - Obrázok WordPerfect/Drawperfect - Slikovna datoteka Drawperfect - Figurë WordPerfect/Drawperfect - WordPerfect/Drawperfect слика - WordPerfect/Drawperfect-bild - зображення WordPerfect/Drawperfect - Ảnh WordPerfect/Drawperfect - WordPerfect/Drawperfect 图像 - WordPerfect/Drawperfect 影像 - - - - - DER/PEM/Netscape-encoded X.509 certificate - شهادة DER/PEM/Netscape-encoded X.509 - Sertyfikat X.509, zakadavany ŭ DER/PEM/Netscape - Сертификат — DER/PEM/Netscape X.509 - certificat X.509 codificat com DER/PEM/Netscape - Certifikát X.509 kódovaný jako DER/PEM/Netscape - DER-/PEM-/Netscapekodet X.509-certifikat - DER/PEM/Netscape-kodiertes X.509-Zertifikat - ψηφιακό πιστοποιητικό X.509 κωδικοποιημένο κατά DER/PEM/Netscape - DER/PEM/Netscape-encoded X.509 certificate - DER/PEM/Netscape-kodigita X.509-atestilo - certificado X.509 codificado con DER/PEM/Netscape - X.509rekin kodetutako DER, PEM edo Netscape zertifikatua - DER/PEM/Netscape-koodattu X.509-varmenne - DER/PEM/Netscape-encoded X.509 váttan - certificat X.509 codé DER/PEM/Netscape - teastas X.509 ionchódaithe le DER/PEM/Netscape - certificado X.509 codificado con DER/PEM/Netscape - אישור מסוג X.509 של DER/PEM/Netscape-encoded - DER/PEM/Netscape-kodiran X.509 certifikat - DER/PEM/Netscape formátumú X.509-tanúsítvány - Sertifikat DER/PEM/Netscape-tersandi X.509 - Certificato DER/PEM/Netscape-encoded X.509 - DER/PEM/Netscape エンコード X.509 証明書 - DER/PEM/Netscape კოდირებული X.509 სერტიფიკატი - X.509 сертификаты (DER/PEM/Netscape кодталған) - DER/PEM/넷스케이프로 인코딩된 X.509 인증서 - DER/PEM/Netscape-encoded X.509 liudijimas - DER/PEM/Netscape-encoded X.509 sertifikāts - Sijil X.509 dienkod /DER/PEM/Netscape - DER/PEM/Netscape-kodet X.509-sertifikat - DER/PEM/Netscape-gecodeerd X.509-certificaat - DER/PEM/Netscape-koda X.509-sertifikat - Zakodowany w DER/PEM/Netscape certyfikat X.509 - certificado X.509 codificado com DER/PEM/Netscape - Certificado X.509 codificado com DER/PEM/Netscape - Certificat DER/PEM/Netscape-codat X.509 - сертификат X.509 (DER/PEM/Netscape-закодированный) - Certifikát X.509 kódovaný ako DER/PEM/Netscape - Datoteka potrdila DER/PEM/Netscape X.509 - Çertifikatë DER/PEM/Netscape-encoded X.509 - DER, PEM или Нетскејп кодирани сертификат X.509 - DER/PEM/Netscape-kodat X.509-certifikat - сертифікат X.509 у форматі DER/PEM/Netscape - Chứng nhận X.509 mã hoá bằng Netscape/PEM/DER - DER/PEM/Netscape-encoded X.509 证书 - DER/PEM/Netscape 編碼的 X.509 憑證 - - - - - - - - empty document - مستند فارغ - pusty dakument - Празен документ - document buit - Prázdný dokument - tomt dokument - Leeres Dokument - κενό έγγραφο - empty document - malplena dokumento - documento vacío - dokumentu hutsa - tyhjä asiakirja - tómt skjal - document vide - cáipéis fholamh - documeto baleiro - מסמך ריק - prazan dokument - üres dokumentum - dokumen kosong - Documento vuoto - 空のドキュメント - бос құжат - 빈 문서 - tuščias dokumentas - tukšs dokuments - Dokumen kosong - tomt dokument - leeg document - tomt dokument - Pusty dokument - documento vazio - Documento vazio - document gol - пустой документ - Prázdny dokument - prazen dokument - Dokument bosh - празан документ - tomt dokument - boş belge - порожній документ - tài liệu rỗng - 空文档 - 空白文件 - - - Zoo archive - أرشيف Zoo - Zoo arxivi - Archiŭ zoo - Архив — zoo - arxiu zoo - Archiv zoo - Archif zoo - Zooarkiv - Zoo-Archiv - συμπιεσμένο αρχείο Zoo - Zoo archive - Zoo-arkivo - archivador Zoo - Zoo artxiboa - Zoo-arkisto - Zoo skjalasavn - archive zoo - cartlann Zoo - ficheiro Zoo - ארכיון Zoo - Zoo archívum - Arsip Zoo - Archivio zoo - Zoo アーカイブ - Zoo архиві - ZOO 압축 파일 - Zoo archyvas - Zoo arhīvs - Zoo-arkiv - Zoo-archief - Zoo-arkiv - Archiwum zoo - Pacote Zoo - Arhivă Zoo - архив ZOO - Archív zoo - Datoteka arhiva ZOO - Arkiv zoo - Zoo-arkiv - Zoo arşivi - архів zoo - Kho nén zoo - Zoo 归档文件 - Zoo 封存檔 - - - - - - - - XHTML page - صفحة XHTML - Staronka XHTML - Страница — XHTML - pàgina XHTML - Stránka XHTML - XHTML-side - XHTML-Seite - σελίδα XHTML - XHTML page - XHTML-paĝo - página XHTML - XHTML orria - XHTML-sivu - XHTML síða - page XHTML - leathanach XHTML - Páxina XHTML - דף XHTML - XHTML stranica - XHTML-oldal - Halaman XHTML - Pagina XHTML - XHTML ページ - XHTML парағы - XHTML 페이지 - XHTML puslapis - XHTML lapa - Laman XHTML - XHTML-side - XHTML-pagina - XHTML-side - Strona XHTML - página XHTML - Página XHTML - Pagină XHTML - страница XHTML - Stránka XHTML - Datoteka spletne strani XHTML - Faqe XHTML - XHTML страна - XHTML-sida - сторінка XHTML - Trang XHTML - XHTML 页面 - XHTML 網頁 - XHTML - Extensible HyperText Markup Language - - - - - - - Zip archive - أرشيف Zip - Zip arxivi - Archiŭ zip - Архив — zip - arxiu zip - Archiv ZIP - Archif ZIP - Ziparkiv - Zip-Archiv - συμπιεσμένο αρχείο Zip - Zip archive - Zip-arkivo - archivador Zip - Zip artxiboa - Zip-arkisto - Zip skjalasavn - archive zip - cartlann Zip - ficheiro Zip - ארכיון Zip - Zip archívum - Arsip Zip - Archivio zip - Zip アーカイブ - Zip архиві - ZIP 압축 파일 - Zip archyvas - Zip arhīvs - Zip-arkiv - Zip-archief - Zip-arkiv - Archiwum ZIP - Pacote Zip - Arhivă zip - архив ZIP - Archív ZIP - Datoteka arhiva ZIP - Arkiv zip - Zip-arkiv - Zip arşivi - архів zip - Kho nén zip - Zip 归档文件 - Zip 封存檔 - - - - - - - - - - Windows Imaging Format Disk Image - Диск — Windows Imaging - imatge de disc «Windows Imaging Format» - Windows Imaging Format Disk Image - Windows Imaging Format-diskaftryk - Windows-Imaging-Format-Datenträgerabbild - εικόνα δίσκου Windows Image Format - Windows Imaging Format Disk Image - imagen de disco de Windows Imaging Format - image disque Windows Imaging Format - imaxe de disco de Windows Imaging Format - מבנה תמונת כונן של Windows Imaging - Windows Imaging Format lemezkép - Image Disk Windows Imaging Format - Immagine disco formato Windows Imaging - Windows イメージング形式 ディスクイメージ - Windows Imaging Format Disk бейнесі - Windows 이미지 포맷 디스크 이미지 - Windows Imaging Format diska attēls - Windows Imaging Format Disk Image - Obraz dysku Windows Imaging Format - Imagem de Disco de Formato Windows Imaging - Imagine de disc „Windows Imaging Format” - образ диска Windows - Odtis slike Windows Imaging - Windows Imaging Format Disk-avbild - формат образів дисків Windows Imaging - Windows Imaging 格式磁盘镜像 - Windows Imaging Format Disk 映像 - - - - - - - - Dolby Digital audio - Dolby Digital سمعي - Dolby Digital audio - Aŭdyjo Dolby Digital - Аудио — Dolby Digital - àudio Dolby Digital - Zvuk Dolby Digital - Sain Dolby Digital - Dolby Ditital-lyd - Dolby-Digital-Audio - ψηφιακός Ήχος Dolby - Dolby Digital audio - Sondosiero en Dolby Digital - sonido Dolby Digital - Dolby audio digitala - Dolby Digital -ääni - Dolby Digital ljóður - audio Dolby Digital - fuaim Dolby Digital - son Dolby Digital - שמע Dolby Digital - Dolby Digital audio - Dolby Digital hang - Audio Dolby Digital - Audio Dolby Digital - ドルビーデジタルオーディオ - Dolby Digital-ის აუდიო - Dolby Digital аудиосы - 돌비 디지털 오디오 - Dolby Digital garso įrašas - Dolby Digital audio - Audio Digital Dolby - Dolby digital lyd - Dolby Digital-audio - Dolby Digital lyd - Plik dźwiękowy Dolby Digital - áudio Dolby Digital - Áudio Dolby Digital - Audio Dolby Digital - аудио Dolby Digital - Zvuk Dolby Digital - Zvočna datoteka Dolby Digital - Audio Dolby Digital - Дигитални Dolby звучни запис - Dolby Digital-ljud - звук Dolby Digital - Âm thanh Dolby Digital - 杜比数字音频 - 杜比數位音訊 - - - - - - - DTS audio - - - - - - - - - - - DTSHD audio - - - - - - - - - AMR audio - AMR سمعي - Aŭdyjo AMR - Аудио — AMR - àudio AMR - Zvuk AMR - AMR-lyd - AMR-Audio - ήχος AMR - AMR audio - AMR-sondosiero - sonido AMR - AMR audioa - AMR-ääni - AMR ljóður - audio AMR - fuaim AMR - son AMR - שמע AMR - AMR audio - AMR hang - Audio AMR - Audio AMR - AMR オーディオ - AMR აუდიო - AMR аудиосы - AMR 오디오 - AMR garso įrašas - AMR audio - AMR-lyd - AMR-audio - AMR-lyd - Plik dźwiękowy AMR - Áudio AMR - Audio AMR - аудио AMR - Zvuk AMR - Zvočna datoteka AMR - Audio AMR - AMR-ljud - звук AMR - Âm thanh AMR - AMR 音频 - AMR 音訊 - AMR - Adaptive Multi-Rate - - - - - - - - AMR-WB audio - AMR-WB سمعي - Aŭdyjo AMR-WB - Аудио — AMR-WB - àudio AMR-WB - Zvuk AMR-WB - AMR-WB-lyd - AMR-WB-Audio - ήχος AMR-WB - AMR-WB audio - AMR-WB-sondosiero - sonido AMR-WB - AMR-WB audioa - AMR-WB-ääni - AMR-WB ljóður - audio AMR-WB - fuaim AMR-WB - son AMR-WB - שמע AMR-WN - AMR-WB audio - AMR-WB hang - Audio AMR-WB - Audio AMR-WB - AMR-WB オーディオ - AMR-WB აუდიო - AMR-WB аудиосы - AMR-WB 오디오 - AMR-WB garso įrašas - AMR-WB audio - AMR-WB-lyd - AMR-WB-audio - AMR-WB-lyd - Plik dźwiękowy AMR-WB - Áudio AMR-WB - Audio AMR-WB - аудио AMR-WB - Zvuk AMR-WB - Zvočna datoteka AMR-WB - Audio AMR-WB - AMR-WB-ljud - звук AMR-WB - Âm thanh AMR-WB - AMR-WB 音频 - AMR-WB 音訊 - AMR-WB - Adaptive Multi-Rate Wideband - - - - - - - - ULAW (Sun) audio - ULAW (صن) سمعي - ULAW (Sun) audio faylı - Aŭdyjo ULAW (Sun) - Аудио — ULAW, Sun - àudio ULAW (Sun) - Zvuk ULAW (Sun) - Sain ULAW (Sun) - ULAW-lyd (Sun) - ULAW-Audio (Sun) - ήχος ULAW (Sun) - ULAW (Sun) audio - ULAW-sondosiero (Sun) - sonido ULAW (Sun) - ULAW (sun) audioa - ULAW (Sun) -ääni - ULAW (Sun) ljóður - audio ULAW (Sun) - fuaim ULAW (Sun) - son ULAW (Sun) - שמע ULAW (של Sun) - ULAW (Sun) hang - Audio ULAW (Sun) - Audio ULAW (Sun) - ULAW (Sun) オーディオ - ULAW (Sun) аудиосы - ULAW (Sun) 오디오 - ULAW (Sun) garso įrašas - ULAW (Sun) audio - Audio ULAW (Sun) - ULAW-lyd (Sun) - (Sun) ULAW-audio - ULAW (Sun)-lyd - Plik dźwiękowy ULAW (Sun) - áudio ULAW (Sun) - Áudio ULAW (Sun) - Fișier audio ULAW (Sun) - аудио ULAW (Sun) - Zvuk ULAW (Sun) - Zvočna datoteka ULAW (Sun) - Audio ULAW (Sun) - ULAW (Sun) звучни запис - ULAW-ljud (Sun) - звук ULAW (Sun) - Âm thanh ULAW (Sun) - ULAW (Sun) 音频 - ULAW (Sun) 音訊 - - - - - - - - Commodore 64 audio - Commodore 64 سمعي - Aŭdyjo Commodore 64 - Аудио — Commodore 64 - àudio Commodore 64 - Zvuk Commodore 64 - Commodore 64-lyd - Commodore-64-Audio - ήχος Commodore 64 - Commodore 64 audio - Sondosiero de Commodore 64 - sonido de Commodore 64 - Commodore 64 Audioa - Commodore 64 -ääni - Commodore 64 ljóð - audio Commodore 64 - fuaim Commodore 64 - son de Commodore 64 - שמע של Commodore 64 - Commodore 64 audio - Commodore 64 hang - Audio Commodore 64 - Audio Commodore 64 - Commodore 64 オーディオ - Commodore 64-ის აუდიო - Commodore 64 аудиосы - Commodore 64 오디오 - Commodore 64 garso įrašas - Commodore 64 audio - Audio Commodore 64 - Commodore 64-lyd - Commodore 64-audio - Commodore 64-lyd - Plik dźwiękowy Commodore 64 - áudio Commodore 64 - Áudio Commodore 64 - Audio Commodore 64 - аудио Commodore 64 - Zvuk Commodore 64 - Zvočna datoteka Commodore 64 - Audio Commodore 64 - Комодор 64 звучни запис - Commodore 64-ljud - звук Commodore 64 - Âm thanh Commodore 64 - Commodore 64 音频 - Commodore 64 音訊 - - - - - - - - PCM audio - سمعي PCM - PCM audio faylı - Aŭdyjo PCM - Аудио — PCM - àudio PCM - Zvuk PCM - Sain PCM - PCM-lyd - PCM-Audio - ήχος PCM - PCM audio - PCM-sondosiero - sonido PCM - PCM audioa - PCM-ääni - PCM ljóður - audio PCM - fuaim PCM - son PCM - שמע PCM - PCM hang - Audio PCM - Audio PCM - PCM オーディオ - PCM аудиосы - PCM 오디오 - PCM garso įrašas - PCM audio - Audio PCM - PCM-lyd - PCM-audio - PCM-lyd - Plik dźwiękowy PCM - áudio PCM - Áudio PCM - Audio PCM - аудио PCM - Zvuk PCM - Zvočna datoteka PCM - Audio PCM - PCM звучни запис - PCM-ljud - звук PCM - Âm thanh PCM - PCM 音频 - PCM 音訊 - - - - - - - - - - - - - - - - - - AIFC audio - AIFC سمعي - AIFC audio faylı - Aŭdyjo AIFC - Аудио — AIFC - àudio AIFC - Zvuk AIFC - Sain AIFC - AIFC-lyd - AIFC-Audio - ήχος AIFC - AIFC audio - AIFC-sondosiero - sonido AIFC - AIFC audioa - AIFC-ääni - AIFC ljóður - audio AIFC - fuaim AIFC - son AIFC - שמע AIFC - AIFC audio - AIFC hang - Audio AIFC - Audio AIFC - AIFC オーディオ - AIFC აუდიო - AIFC аудиосы - AIFC 오디오 - AIFC garso įrašas - AIFC audio - Audio AIFC - AIFC-lyd - AIFC-audio - AIFC-lyd - Plik dźwiękowy AIFC - áudio AIFC - Áudio AIFC - Fișier audio AIFC - аудио AIFC - Zvuk AIFC - Zvočna datoteka AIFC - Audio AIFC - AIFC звучни запис - AIFC-ljud - звук AIFC - Âm thanh AIFC - AIFC 音频 - AIFC 音訊 - AIFC - Audio Interchange File format Compressed - - - - - - - - - - AIFF/Amiga/Mac audio - AIFF/Amiga/Mac سمعي - AIFF/Amiga/Mac audio faylı - Aŭdyjo AIFF/Amiga/Mac - Аудио — AIFF/Amiga/Mac - àudio AIFF/Amiga/Mac - Zvuk AIFF/Amiga/Mac - Sain AIFF/Amiga/Mac - AIFF-/Amiga-/Maclyd - AIFF/Amiga/Mac-Audio - ήχος AIFF/Amiga/Mac - AIFF/Amiga/Mac audio - AIFF/Amiga/Mac-sondosiero - sonido AIFF/Amiga/Mac - AIFF/Amiga/Mac audioa - AIFF/Amiga/Mac-ääni - AIFF/Amiga/Mac ljóður - audio AIFF/Amiga/Mac - fuaim AIFF/Amiga/Mac - son AIFF/Amiga/Mac - שמע AIFF/Amiga/Mac - AIFF/Amiga/Mac audio - AIFF/Amiga/Mac hang - Audio AIFF/Amiga/Mac - Audio AIFF/Amiga/Mac - AIFF/Amiga/Mac オーディオ - AIFF/Amiga/Mac აუდიო - AIFF/Amiga/Mac аудиосы - AIFF/Amiga/Mac 오디오 - AIFF/Amiga/Mac garso įrašas - AIFF/Amiga/Mac audio - Audio AIFF/Amiga/Mac - AIFF/Amiga/Mac-lyd - AIFF/Amiga/Mac-audio - AIFF/Amiga/Mac-lyd - Plik dźwiękowy AIFF/Amiga/Mac - áudio AIFF/Amiga/Mac - Áudio AIFF/Amiga/Mac - Audio AIFF/Amiga/Mac - аудио AIFF/Amiga/Mac - Zvuk AIFF/Amiga/Mac - Zvočna datoteka AIFF/Amiga/Mac - Audio AIFF/Amiga/Mac - AIFF/Амига/Мекинтош звучни запис - AIFF/Amiga/Mac-ljud - звук AIFF/Amiga/Mac - Âm thanh AIFF/Amiga/Mac - AIFF/Amiga/Mac 音频 - AIFF/Amiga/Mac 音訊 - AIFF - Audio Interchange File Format - - - - - - - - - - Monkey's audio - Monkey سمعي - Aŭdyjo Monkey's - Аудио — Monkey - àudio Monkey - Zvuk Monkey's - Monkeys lyd - Monkey's-Audio - ήχος Monkey's - Monkey's audio - sonido Monkey - Monkey audioa - Monkey's Audio -ääni - Monkey's ljóður - audio Monkey - fuaim Monkey's - son de Monkey - שמע של Monkey's - Monkey hang - Audio Monkey - Audio Monkey's - Monkey's オーディオ - Monkey аудиосы - Monkey's 오디오 - Monkey garso įrašas - Monkey's audio - Monkey's-lyd - Monkey's-audio - Monkey's Audio-lyd - Plik dźwiękowy Monkey's Audio - Áudio Monkey's - Audio Monkey's - аудио Monkey's - Zvuk Monkey's - Zvočna datoteka Monkey - Audio Monkey's - Monkey's audio - звук Monkey's - Âm thanh cua Monkey - Monkey's audio 音频 - Monkey's 音訊 - - - - - - - Impulse Tracker audio - Impulse Tracker سمعي - Impulse Tracker audio faylı - Aŭdyjo Impulse Tracker - Аудио — Impulse Tracker - àudio d'Impulse Tracker - Zvuk Impulse Tracker - Sain Impulse Tracker - Impulse Tracker-lyd - Impulse-Tracker-Audio - ήχος Impulse Tracker - Impulse Tracker audio - Sondosiero de Impulse Tracker - sonido Impulse Tracker - Impulse Tracker audioa - Impulse Tracker -ääni - Impulse Tracker ljóður - audio Impulse Tracker - fuaim Impulse Tracker - son de Impulse Tracker - שמע של Impulse Tracker - Impulse Tracker audio - Impulse Tracker hang - Audio Impulse Tracker - Audio Impulse Tracker - Impulse Tracker オーディオ - Impulse Tracker аудиосы - Impulse Tracker 오디오 - Impulse Tracker garso įrašas - Impulse Tracker audio - Audio Impulse Tracker - Impulse Tracker-lyd - Impulse Tracker-audio - Impulse Tracker lyd - Plik dźwiękowy Impulse Tracker - áudio Impulse Tracker - Áudio Impulse Tracker - Audio Impulse Tracker - аудио Impulse Tracker - Zvuk Impulse Tracker - Zvočna datoteka Impulse Tracker - Audio Impulse Tracker - Impulse Tracker звучни запис - Impulse Tracker-ljud - звук Impulse Tracker - Âm thanh Impulse Tracker - Impulse Tracker 音频 - Impulse Tracker 音訊 - - - - - - - FLAC audio - FLAC سمعي - Aŭdyjo FLAC - Аудио — FLAC - àudio FLAC - Zvuk FLAC - FLAC-lyd - FLAC-Audio - Ήχος FLAC - FLAC audio - FLAC-sondosiero - sonido FLAC - FLAC audioa - FLAC-ääni - FLAC ljóður - audio FLAC - fuaim FLAC - son FLAC - קובץ שמע מסוג FLAC - FLAC audio - FLAC hang - Audio FLAC - Audio FLAC - FLAC オーディオ - FLAC აუდიო - FLAC аудиосы - FLAC 오디오 - FLAC garso įrašas - FLAC audio - Audio FLAC - FLAC-lyd - FLAC-audio - FLAC-lyd - Plik dźwiękowy FLAC - áudio FLAC - Áudio FLAC - Audio FLAC - аудио FLAC - Zvuk FLAC - Zvočna datoteka Flac - Audio FLAC - FLAC звучни запис - FLAC-ljud - звук FLAC - Âm thanh FLAC - FLAC 音频 - FLAC 音訊 - - - - - - - - WavPack audio - WavPack سمعي - Aŭdyjo WavPack - Аудио — WavPack - àudio WavPack - Zvuk WavPack - WavPack-lyd - WavPack-Audio - ήχος WavePack - WavPack audio - WavPack-sondosiero - sonido WavPack - WavPack audioa - WavPack-ääni - WavPack ljóður - audio WavPack - fuaim WavPack - son WavPack - שמע WavPack - WavPack audio - WavPack hang - Audio WavPack - Audio WavPack - WavPack オーディオ - WavPack аудиосы - WavPack 오디오 - WavPack garso įrašas - WavPack audio - WavPack-lyd - WavPack-audio - WavPack-lyd - Plik dźwiękowy WavPack - Áudio WavPack - Audio WavPack - аудио WavPack - Zvuk WavPack - Zvočna datoteka WavPack - Audio WavPack - WavPack-ljud - звук WavPack - Âm thanh WavPack - WavPack 音频 - WavPack 音訊 - - - - - - - - WavPack audio correction file - ملف تصحيح WavPack السمعي - Fajł aŭdyjokarekcyi WavPack - Файл за корекции на аудио — WavPack - fitxer de correcció d'àudio WavPack - Opravný zvukový soubor WavPack - WavPack-lydkorrektionsfil - WavPack-Audiokorrekturdatei - αρχείο διόρθωσης ήχου WavePack - WavPack audio correction file - archivo de corrección de sonido WavPack - WavPack audio-zuzenketaren fitxategia - WavPack-äänikorjaustiedosto - WavPack ljóðrættingarfíla - fichier de correction audio WavPack - comhad cheartú fhuaim WavPack - ficheiro de corrección de son WavPack - קובץ תיקון שמע של WavPack - WavPack hangjavítási fájl - Berkas koreksi audio WavPack - File correzione audio WavPack - WavPack オーディオコレクションファイル - WavPack аудио түзету файлы - WavPack 오디오 교정 파일 - WavPack garso korekcijos failas - WavPack audio korekciju datne - WavPack lydkorrigeringsfil - WavPack-audio-correctiebestand - WawPack lydopprettingsfil - Plik korekcji dźwięku WavPack - Arquivo de correção de áudio WavPack - Fișier audio de corecție WavPack - файл коррекции аудио WavPack - Opravný zvukový súbor WavPack - popravljalna zvočna datoteka WavPack - File korrigjgimi audio WavPack - WavPack-ljudkorrigeringsfil - файл корекції звуку WavPack - Tập tin sửa chữa âm thanh WavPack - WavPack 音频校正文档 - WavPack 音訊校正檔 - - - - - - - MIDI audio - MIDI سمعي - MIDI audio faylı - Aŭdyjo MIDI - Аудио — MIDI - àudio MIDI - Zvuk MIDI - Sain MIDI - MIDI-lyd - MIDI-Audio - ήχος MIDI - MIDI audio - MIDI-sondosiero - sonido MIDI - MIDI audioa - MIDI-ääni - MIDI ljóður - audio MIDI - fuaim MIDI - son MIDI - שמע MIDI - MIDI audio - MIDI hang - Audio MIDI - Audio MIDI - MIDI オーディオ - MIDI аудиосы - 미디 오디오 - MIDI garso įrašas - MIDI audio - Audio MIDI - MIDI-lyd - MIDI-audio - MIDI-lyd - Plik dźwiękowy MIDI - áudio MIDI - Áudio MIDI - Audio MIDI - аудио MIDI - Zvuk MIDI - Zvočna datoteka MIDI - Audio MIDI - MIDI звучни запис - MIDI-ljud - звук MIDI - Âm thanh MIDI - MIDI 音频 - MIDI 音訊 - - - - - - - - - - compressed Tracker audio - Tracker سمعي مضغوط - aŭdyjo skampresavanaha Trackera - Аудио — Tracker, компресирано - àudio Tracker comprimit - Komprimovaný zvuk Tracker - Trackerkomprimeret lyd - Komprimiertes Tracker-Audio - συμπιεσμένος ήχος Tracker - compressed Tracker audio - tracker de sonido comprimido - konprimitutako Tracker audioa - pakattu Tracker-ääni - stappað Tracker ljóður - audio Tracker compressé - fuaim chomhbhrúite Tracker - son comprimido de Tracker - שמע גשש מכווץ - komprimirani Tracker audio - tömörített Tracker hang - audio Tracker terkompresi - Audio compresso Tracker - 圧縮 Tracker オーディオ - сығылған Tracker аудиосы - 압축된 Tracker 오디오 - suglaudintas Tracker garso įrašas - saspiests Tracker audio - ingepakte Tracker-audio - komprimert Tracker-lyd - Skompresowany plik dźwiękowy Tracker - Áudio Tracker compactado - Tracker audio comprimat - аудио Tracker (сжатое) - Komprimovaný zvuk Tracker - Skrčena zvočna datoteka Tracker - Audio Tracker e kompresuar - komprimerat Tracker-ljud - стиснутий звук Tracker - âm thanh Tracker đã nén - 压缩的 Tracker 音频 - 壓縮版 Tracker 音訊 - - - - - - - AAC audio - AAC - Advanced Audio Coding - - - - - - - - MPEG-4 audio - MPEG-4 سمعي - Aŭdyjo MPEG-4 - Аудио — MPEG-4 - àudio MPEG-4 - Zvuk MPEG-4 - MPEG4-lyd - MPEG-4-Audio - ήχος MPEG-4 - MPEG-4 audio - MPEG4-sondosiero - sonido MPEG-4 - MPEG-4 audioa - MPEG-4-ääni - MPEG-4 ljóður - audio MPEG-4 - fuaim MPEG-4 - son MPEG-4 - שמע MPEG-4 - MPEG-4 audio - MPEG-4 hang - Audio MPEG-4 - Audio MPEG-4 - MPEG-4 オーディオ - MPEG-4 აუდიო - MPEG-4 аудиосы - MPEG-4 오디오 - MPEG-4 garso įrašas - MPEG-4 audio - MPEG-4-lyd - MPEG4-audio - MPEG-4-lyd - Plik dźwiękowy MPEG-4 - Áudio MPEG-4 - Audio MPEG-4 - аудио MPEG-4 - Zvuk MPEG-4 - Zvočna datoteka MPEG-4 - Audio MPEG-4 - MPEG-4-ljud - звук MPEG-4 - Âm thanh MPEG-4 - MPEG-4 音频 - MPEG-4 音訊 - - - - - - - - - MPEG-4 video - MPEG-4 مرئي - Videa MPEG-4 - Видео — MPEG-4 - vídeo MPEG-4 - Video MPEG-4 - MPEG4-video - MPEG-4-Video - βίντεο MPEG-4 - MPEG-4 video - MPEG-4-video - vídeo MPEG-4 - MPEG-4 bideoa - MPEG-4-video - MPEG-4 video - vidéo MPEG-4 - físeán MPEG-4 - vídeo MPEG-4 - וידאו MPEG-4 - MPEG-4 video - MPEG-4 videó - Video MPEG-4 - Video MPEG-4 - MPEG-4 動画 - MPEG-4 ვიდეო - MPEG-4 видеосы - MPEG-4 비디오 - MPEG-4 vaizdo įrašas - MPEG-4 video - MPEG-4-film - MPEG4-video - MPEG-4-video - Plik wideo MPEG-4 - Vídeo MPEG-4 - Video MPEG-4 - видео MPEG-4 - Video MPEG-4 - Video datoteka MPEG-4 - Video MPEG-4 - MPEG-4-video - відеокліп MPEG-4 - Ảnh động MPEG-4 - MPEG-4 视频 - MPEG-4 視訊 - - - - - - - - - - - - - - - MPEG-4 audio book - كتاب MPEG-4 السمعي - Aŭdyjokniha MPEG-4 - Аудио книга — MPEG-4 - llibre d'àudio MPEG-4 - Zvuková kniha MPEG-4 - MPEG4-lydbog - MPEG-4-Hörbuch - ηχητικό βιβλίο MPEG-4 - MPEG-4 audio book - MPEG-4-sonlibro - audiolibro en MPEG-4 - MPEG-4 audio-liburua - MPEG-4-äänikirja - MPEG-4 ljóðbók - livre audio MPEG-4 - leabhar fhuaim MPEG-4 - sonlibro de MPEG-4 - ספר דיגיטלי MPEG-4 - MPEG-4 audio knjiga - MPEG-4 hangoskönyv - Buku audio MPEG-4 - Audiolibro MPEG-4 - MPEG-4 オーディオブック - MPEG-4 აუდიოწიგნი - MPEG-4 аудио кітабы - MPEG-4 오디오북 - MPEG-4 garso knyga - MPEG-4 audio grāmata - MPEG-4-lydbok - MPEG4-audioboek - MPEG-4-lydbok - Książka dźwiękowa MPEG-4 - Áudio livro MPEG-4 - Carte audio MPEG-4 - аудиокнига MPEG-4 - Zvuková kniha MPEG-4 - Zvočna knjiga MPEG-4 - Audiolibër MPEG-4 - MPEG-4-ljudbok - аудіокнига MPEG-4 - Sách âm thanh MPEG-4 - MPEG-4 有声书 - MPEG-4 音訊書 - - - - - - - - - 3GPP multimedia file - ملف وسائط متعددة 3GPP - Multymedyjny fajł 3GPP - Мултимедия — 3GPP - fitxer multimèdia 3GPP - Soubor multimédií 3GPP - 3GPP multimedie-fil - 3GPP-Multimediadatei - αρχείο πολυμέσων 3GPP - 3GPP multimedia file - archivo multimedia 3GPP - 3GPP multimediako fitxategia - 3GPP-multimediatiedosto - 3GGP margmiðlafíla - fichier multimédia 3GPP - comhad ilmheán 3GPP - ficheiro multimedia 3GPP - קובץ מולטימדיה מסוג 3GPP - 3GPP multimedijska datoteka - 3GPP multimédiafájl - Berkas multimedia 3GPP - File multimediale 3GPP - 3GPP マルチメディアファイル - 3GPP მულტიმედიური ფაილი - 3GPP мультимедиялық файлы - 3GPP 멀티미디어 파일 - 3GPP multimedijos failas - 3GPP multimediju datne - 3GPP-multimediafil - 3GPP-multimediabestand - 3GPP-multimediafil - Plik multimedialny 3GPP - Arquivo multimídia 3GPP - Fișier multimedia 3GPP - мультимедийный файл 3GPP - Súbor multimédií 3GPP - Večpredstavnostna datoteka 3GPP - File multimedial 3GPP - 3GPP-multimediafil - 3GPP multimedya dosyası - файл мультимедійних даних 3GPP - Tập tin đa phương tiện 3GPP - 3GPP 多媒体文件 - 3GPP 多媒體檔案 - 3GPP - 3rd Generation Partnership Project - - - - - - - - - - - - - - - - - - - - - - - - - 3GPP2 multimedia file - Мултимедия — 3GPP2 - fitxer multimèdia 3GPP2 - Soubor multimédií 3GPP2 - 3GPP2 multimedie-fil - 3GPP2-Multimediadatei - αρχείο πολυμέσων 3GPP2 - 3GPP2 multimedia file - archivo multimedia 3GPP2 - 3GPP2-multimediatiedosto - 3GGP2 margmiðlafíla - fichier multimédia 3GPP2 - comhad ilmheán 3GPP2 - ficheiro multimedia 3GPP2 - קובץ מולטימדיה 3GPP2 - 3GPP2 multimedijska datoteka - 3GPP2 multimédiafájl - Berkas multimedia 3GPP2 - File multimediale 3GPP2 - 3GPP2 マルチメディアファイル - 3GPP2 მულტიმედიური ფაილი - 3GPP2 мультимедиялық файлы - 3GPP2 멀티미디어 파일 - 3GPP2 multimediju datne - 3GPP2 multimedia bestand - Plik multimedialny 3GPP2 - Arquivo multimídia 3GPP2 - Fișier multimedia 3GPP2 - мультимедийный файл 3GPP2 - Súbor multimédií 3GPP2 - Večpredstavnostna datoteka 3GPP2 - 3GPP2-multimediafil - 3GPP2 multimedya dosyası - файл мультимедійних даних 3GPP2 - 3GPP2 多媒体文件 - 3GPP2 多媒體檔案 - 3GPP2 - 3rd Generation Partnership Project 2 - - - - - - - - - - - Amiga SoundTracker audio - مقتفي صوت Amiga السمعي - Aŭdyjo Amiga SoundTracker - Аудио — Amiga SoundTracker - àudio Amiga SoundTracker - Zvuk Amiga SoundTracker - Amiga SoundTracker-lyd - Amiga-SoundTracker-Audio - ήχος Amiga SoundTracker - Amiga SoundTracker audio - Sondosiero de Amiga SoundTracker - sonido de Amiga SoundTracker - Amiga soundtracker audioa - Amiga SoundTracker -ääni - Amiga SoundTracker ljóður - audio SoundTracker Amiga - fuaim Amiga SoundTracker - son de Amiga SoundTracker - קובץ שמע של Amiga SoundTracker - Amiga SoundTracker audio - Amiga SoundTracker hang - Audio Amida SoundTracker - Audio Amiga SoundTracker - Amiga SoundTracker オーディオ - Amiga SoundTracker-ის აუდიო - Amiga SoundTracker аудиосы - Amiga SoundTracker 오디오 - Amiga SoundTracker garso įrašas - Amiga SoundTracker audio - Audio Amiga Soundtracker - Amiga SoundTracker-lyd - Amiga SoundTracker-audio - Amiga soundtracker-lyd - Plik dźwiękowy Amiga SoundTracker - áudio SoundTracker do Amiga - Áudio Amiga SoundTracker - Audio Amiga SoundTracker - аудио Amiga SoundTracker - Zvuk Amiga SoundTracker - Zvočna datoteka Amiga SoundTracker - Audio Amiga SoundTracker - Амига soundtracker звук - Amiga SoundTracker-ljud - звук Amiga SoundTracker - Âm thanh Amiga SoundTracker - Amiga SoundTracker 音频 - Amiga SoundTracker 音訊 - - - - - - - - - - MP2 audio - MP2 سمعي - Aŭdyjo MP2 - Аудио — MP2 - àudio MP2 - Zvuk MP2 - MP2-lyd - MP2-Audio - ήχος MP2 - MP2 audio - MP2-sondosiero - sonido MP2 - MP2 audioa - MP2-ääni - MP2 ljóður - audio MP2 - fuaim MP2 - son MP2 - שמע MP2 - MP2 audio - MP2 hang - Audio MP2 - Audio MP2 - MP2 オーディオ - MP2 аудиосы - MP2 오디오 - MP2 garso įrašas - MP2 audio - MP2-lyd - MP2-audio - MP2-lyd - Plik dźwiękowy MP2 - Áudio MP2 - Audio MP2 - аудио MP2 - Zvuk MP2 - Zvočna datoteka MP2 - Audio MP2 - MP2-ljud - звук MP2 - Âm thanh MP2 - MP2 音频 - MP2 音訊 - - - - - MP3 audio - MP3 سمعي - MP3 audio faylı - Aŭdyjo MP3 - Аудио — MP3 - àudio MP3 - Zvuk MP3 - Sain MP3 - MP3-lyd - MP3-Audio - ήχος MP3 - MP3 audio - MP3-sondosiero - sonido MP3 - MP3 audioa - MP3-ääni - MP3 ljóður - audio MP3 - fuaim MP3 - son MP3 - שמע MP3 - MP3 audio - MP3 hang - Audio MP3 - Audio MP3 - MP3 オーディオ - MP3 აუდიო - MP3 аудиосы - MP3 오디오 - MP3 garso įrašas - MP3 audio - Audio MP3 - MP3-lyd - MP3-audio - MP3-lyd - Plik dźwiękowy MP3 - áudio MP3 - Áudio MP3 - Audio MP3 - аудио MP3 - Zvuk MP3 - Zvočna datoteka MP3 - Audio MP3 - MP3 звучни запис - MP3-ljud - звук MP3 - Âm thanh MP3 - MP3 音频 - MP3 音訊 - - - - - - - - - - - - MP3 audio (streamed) - MP3 سمعي (تدفق) - Aŭdyjo MP3 (płyń) - Аудио — MP3, поточно - àudio MP3 (flux) - Zvuk MP3 (proud) - MP3-lyd (strøm) - MP3-Audio (Stream) - ήχος MP3 (εκπεμπόμενος) - MP3 audio (streamed) - MP3-sondosiero (fluigate) - sonido MP3 (en flujo) - MP3 audioa (korrontea) - MP3-ääni (virtaus) - MP3 ljóður (streymað) - audio MP3 (flux) - fuaim MP3 (sruthaithe) - son MP3 (en stream) - שמע MP3 (מוזרם) - MP3 hang (sugárzott) - Audio MP3 (stream) - Audio MP3 (in streaming) - MP3 オーディオ (ストリーム) - MP3 აუდიო (ნაკადი) - MP3 аудиосы (ағымдық) - MP3 오디오 (스트림) - MP3 garso įrašas (transliuojamas) - MP3 audio (straumēts) - Audio MP3 (aliran) - MP3-lyd (streaming) - MP3-audio (gestreamd) - Strauma MP3-lyd - Dźwięk MP3 (strumień) - áudio MP3 (em fluxo) - Áudio MP3 (em fluxo) - Audio MP3 (flux) - аудио MP3 (потоковое) - Zvuk MP3 (streamovaný) - Zvočna datoteka MP3 (pretočna) - Audio MP3 (streamed) - MP3 звучни запис (непрекидан) - MP3-ljud (flöde) - звук MP3 (потоковий) - Âm thanh MP3 (chạy luồng) - MP3 流音频 - MP3 音訊 (串流) - - - - - - - - - - - - - - - HTTP Live Streaming playlist - قائمة بث HTTP حية - Списък за изпълнение — поток по HTTP - llista de reproducció en temps real HTTP - Seznam skladeb HTTP Live Streaming - Afspilningsliste til HTTP-livestrøm - HTTP Live-Streaming-Wiedergabeliste - HTTP Live Streaming playlist - lista de reproducción de flujo en directo HTTP - HTTP zuzeneko korrontearen erreprodukzio-zerrenda - HTTP beinleiðis streymaður avspælingarlisti - liste de lecture de flux HTTP Live - seinmliosta sruthaithe bheo HTTP - lista de reprodución de fluxo HTTP - רשימת השמעה הזרימה של HTTP - HTTP élő lejátszólista - Daftar putar HTTP Live Streaming - Scaletta Live Steaming HTTP - HTTP ライブストリーミング再生リスト - HTTP тірі ағым ойнау тізімі - HTTP 라이브 스트리밍 재생 목록 - HTTP tiesioginio transliavimo grojaraštis - HTTP dzīvās straumēšanas repertuārs - HTTP Live Streaming afspeellijst - Lista odtwarzania strumieniowego na żywo HTTP - Lista de Reprodução Streaming ao Vivo de HTTP - Listă de redare difuzată ca flux HTTP - список воспроизведения HTTP-потока - Seznam predvajanja živega pretoka HTTP - HTTP Live Streaming-spellista - список відтворення HTTP Live Streaming - HTTP 直播流播放列表 - HTTP 即時串流播放清單 - - - - - - - - - - - Microsoft ASX playlist - قائمة تشغيل مايكروسوفت ASX - Śpis Microsoft ASX - Списък за изпълнение — Microsoft ASX - llista de reproducció ASX de Microsoft - Seznam skladeb Microsoft ASX - Microsoft ASX-afspilningsliste - Microsoft-ASX-Wiedergabeliste - λίστα αναπαραγωγής Microsoft ASX - Microsoft ASX playlist - lista de reproducción ASX de Microsoft - Microsoft ASX erreprodukzio-zerrenda - Microsoft ASX -soittolista - Microsoft ASX avspælingarlisti - liste de lecture Microsoft ASX - seinmliosta Microsoft ASX - lista de reprodución Microsoft ASX - רשימת השמעה ASX (מיקרוסופט) - Microsoft ASX popis za reprodukciju - Microsoft ASX lejátszólista - Senarai putar Microsoft ASX - Scaletta Microsoft ASX - Microsoft ASX 再生リスト - Microsoft-ის ASX რეპერტუარი - Microsoft ASX ойнау тізімі - 마이크로소프트 ASX 재생 목록 - Microsoft ASX grojaraštis - Microsoft ASX repertuārs - Microsoft ASX-spilleliste - Microsoft ASX-afspeellijst - Microsoft ASX-speleliste - Lista odtwarzania Microsoft ASX - Lista de reprodução do Microsoft ASX - Listă redare Microsoft ASX - список воспроизведения Microsoft ASX - Zoznam skladieb Microsoft ASX - Seznam predvajanja Microsoft ASX - Listë titujsh Microsoft ASF - Microsoft ASX-spellista - список відтворення ASX Microsoft - Danh mục nhạc Microsoft ASX - Microsoft ASX 播放列表 - 微軟 ASX 播放清單 - - - - - - - - - - - - - - - - - PSF audio - PSF سمعي - Aŭdyjo PSF - Аудио — PSF - àudio PSF - Zvuk PSF - PSF-lyd - PSF-Audio - ήχος PSF - PSF audio - PSF-sondosiero - sonido PSF - PSF audioa - PSF-ääni - PSF ljóður - audio PSF - fuaim PSF - son PSF - שמע PSF - PSF hang - Audio PSF - Audio PSF - PSF オーディオ - PSF аудиосы - PSF 오디오 - PSF garso įrašas - PSF audio - PSF-lyd - PSF-audio - PSF-lyd - Plik dźwiękowy PSF - Áudio PSF - Audio PSF - аудио PSF - Zvuk PSF - Zvočna datoteka PSF - Audio PSF - PSF-ljud - звук PSF - Âm thanh PSF - PSF 音频 - PSF 音訊 - PSF - Portable Sound Format - - - - - - - MiniPSF audio - MiniPSF سمعي - Aŭdyjo MiniPSF - Аудио — MiniPSF - àudio MiniPSF - Zvuk MiniPSF - MiniPSF-lyd - MiniPSF-Audio - ήχος MiniPSF - MiniPSF audio - MiniPSF-sondosiero - sonido MiniPSF - MiniPSF audioa - MiniPSF-ääni - MiniPSF ljóður - audio MiniPSF - fuaim MiniPSF - son MiniPSF - שמע של MiniPSP - MiniPSF audio - MiniPSF hang - Audio MiniPSF - Audio MiniPSF - MiniPSF オーディオ - MiniPSF-ის აუდიო - MiniPSF аудиосы - MiniPSF 오디오 - MiniPSF garso įrašas - MiniPSF audio - MiniPSF-lyd - MiniPSF-audio - MiniPSF-lyd - Plik dźwiękowy MiniPSF - Áudio MiniPSF - Audio MiniPSF - аудио MiniPSF - Zvuk MiniPSF - Zvočna datoteka MiniPSF - Audio MiniPSF - MiniPSF-ljud - звук MiniPSF - Âm thanh MiniPSF - MiniPSF 音频 - MiniPSF 音訊 - MiniPSF - Miniature Portable Sound Format - - - - - PSFlib audio library - مكتبة PSFlib السمعية - Aŭdyjobiblijateka PSFlib - Аудио библиотека — PSFlib - biblioteca d'àudio PSFlib - Zvuková knihovna PSFlib - PSFlib-lydbibliotek - PSFlib-Audiobibliothek - βιβλιοθήκη ήχου PSFlib - PSFlib audio library - biblioteca de sonido PSFlib - PSFlib audioaren liburutegia - PSFlib-äänikirjasto - PSFlib ljóðsavn - bibliothèque audio PSFlib - leabharlann fhuaim PSFlib - Biblioteca de son PSFlib - ספריית שמע PSFlib - PSFlib hanggyűjtemény - Pustaka audio PSFlib - Libreria audio PSFlib - PSFlib オーディオライブラリ - PSFlib аудио жинағы - PSFlib 오디오 라이브러리 - PSFlib garso biblioteka - PSFlib fonotēka - PSFlib-lydbibliotek - PSFlib-audiobibliotheek - PSFlib lydbibliotek - Biblioteka dźwiękowa PSFlib - Biblioteca de áudio PSFlib - Bibliotecă audio PSFlib - фонотека PSFlib - Zvuková knižnica PSFlib - Zvočna knjižnica PSFlib - Librari audio PSFlib - PSFlib-ljudbibliotek - аудіобібліотека PSFlib - Thư viện âm thanh PSFlib - PSFlib 音频库文件 - PSFlib 音訊庫 - PSFlib - Portable Sound Format Library - - - - - Windows Media audio - Windows Media سمعي - Aŭdyjo Windows Media - Аудио — Windows Media - àudio Windows Media - Zvuk Windows Media - Windows Media-lyd - Windows-Media-Audio - ήχος Windows Media - Windows Media audio - sonido de Windows Media - Windows Media audioa - Windows Media -ääni - Windows Media ljóður - audio Windows Media - fuaim Windows Media - son de Windows Media - שמע של Windows Media - Windows Media audio - Windows Media hang - Audio Windows Media - Audio Windows Media - Windows Media オーディオ - Windows Media аудиосы - Windows 미디어 오디오 - Windows Media garso įrašas - Windows Media audio - Windows Media lyd - Windows Media-audio - Windows Media-lyd - Plik dźwiękowy Windows Media - Áudio do Windows Media - Audio Windows Media - аудио Windows Media - Zvuk Windows Media - Zvočna datoteka Windows Media - Audio Windows Media - Windows Media-ljud - звук Windows Media - Âm thanh Windows Media - Windows Media 音频 - Windows Media 音訊 - - - - - - Musepack audio - Musepack سمعي - Aŭdyjo Musepack - Аудио — Musepack - àudio Musepack - Zvuk Musepack - Musepacklyd - Musepack-Audio - ήχος Musepack - Musepack audio - sonido Musepack - Musepack audioa - Musepack-ääni - Musepack ljóður - audio Musepack - fuaim Musepack - son de Musepack - שמע של Musepack - Musepack audio - Musepack hang - Audio Musepack - Audio Musepack - Musepack オーディオ - Musepack аудиосы - Musepack 오디오 - Musepack garso įrašas - Musepack audio - Musepack-lyd - Musepack-audio - Musepack-lyd - Plik dźwiękowy Musepack - Áudio Musepack - Audio Musepack - аудио Musepack - Zvuk Musepack - Zvočna datoteka Musepack - Audio Musepack - Musepack-ljud - звук Musepack - Âm thanh Musepack - Musepack 音频 - Musepack 音訊 - - - - - - - - - RealAudio document - مستند RealAudio - Dakument RealAudio - Документ — RealAudio - document RealAudio - Dokument RealAudio - RealAudio-dokument - RealAudio-Dokument - έγγραφο RealAudio - RealAudio document - RealAudio-dokumento - documento RealAudio - RealAudio dokumentua - RealAudio-asiakirja - RealAudio skjal - document RealAudio - cáipéis RealAudio - documento Realson - מסמך של RealAudio - RealAudio dokument - RealAudio dokumentum - Dokumen RealAudio - Documento RealAudio - RealAudio ドキュメント - RealAudio құжаты - RealAudio 문서 - RealAudio dokumentas - RealAudio dokuments - RealAudio-dokument - RealAudio-document - RealAudio-dokument - Dokument RealAudio - Documento RealAudio - Document RealAudio - документ RealAudio - Dokument RealAudio - Dokument RealAudio - Dokument RealAudio - RealAudio-dokument - документ RealAudio - Tài liệu âm thanh RealAudio - RealAudio 文档 - RealAudio 文件 - - - - - - - RealMedia Metafile - ملف تعريف RealMedia - Metafajł RealMedia - Метафайл — RealMedia - metafitxer RealMedia - RealMedia Metafile - RealMedia-metafil - RealMedia-Metadatei - Metafile RealMedia - RealMedia Metafile - metarchivo RealMedia - RealMedia metafitxategia - RealMedia-metatiedosto - RealMedia metafíla - métafichier RealMedia - meiteachomhad RealMedia - Metaficheiro RealMedia - קובץ מטא של RealMedia - RealMedia metafájl - RealMedia Metafile - Metafile RealMedia - RealMedia メタファイル - RealMedia метафайлы - RealMedia 메타파일 - RealMedia metafailas - RealMedia metadatne - RealMedia-metafil - RealMedia-metabestand - RealMedia-metafil - Metaplik RealMedia - Meta arquivo do RealMedia - Metafișier RealMedia - мета-файл RealMedia - RealMedia Metafile - Metadatoteka RealMedia - Metafile RealMedia - RealMedia-metafil - метафайл RealMedia - Siêu tập tin RealMedia - RealMedia 元文件 - RealMedia 中介檔 - - - - RealVideo document - مستند RealVideo - Dakument RealVideo - Документ — RealVideo - document RealVideo - Dokument RealVideo - RealAudio-dokument - RealVideo-Dokument - έγγραφο RealVideo - RealVideo document - RealVideo-dokumento - documento RealVideo - RealVideo dokumentua - RealVideo-asiakirja - RealVideo skjal - document RealVideo - cáipéis RealVideo - documento RealVideo - מסמך של RealVideo - RealVideo dokument - RealVideo dokumentum - Dokumen RealVideo - Documento RealVideo - RealVideo ドキュメント - RealVideo құжаты - RealVideo 문서 - RealVideo dokumentas - RealVideo dokuments - RealAudio-dokument - RealVideo-document - RealVideo-dokument - Dokument RealVideo - Documento RealVideo - Document RealVideo - документ RealVideo - Dokument RealVideo - Video datoteka RealVideo - Dokument RealVideo - RealVideo-dokument - документ RealVideo - Tài liệu ảnh động RealVideo - RealAudio 文档 - RealVideo 文件 - - - - - - RealMedia document - مستند RealMedia - Dakument RealMedia - Документ — RealMedia - document RealMedia - Dokument RealMedia - RealMedia-dokument - RealMedia-Dokument - έγγραφο RealMedia - RealMedia document - RealMedia-dokumento - documento RealMedia - RealMedia dokumentua - RealMedia-asiakirja - RealMedia skjal - document RealMedia - cáipéis RealMedia - documento RealMedia - מסמך של RealMedia - RealMedia dokument - RealMedia dokumentum - Dokumen RealMedia - Documento RealMedia - RealMedia ドキュメント - RealMedia құжаты - RealMedia 문서 - RealMedia dokumentas - RealMedia dokuments - RealMedia-dokument - RealMedia-document - RealMedia-dokument - Dokument RealMedia - Documento RealMedia - Document RealMedia - документ RealMedia - Dokument RealMedia - Dokument RealMedia - Dokument RealMedia - RealMedia-dokument - документ RealMedia - Tài liệu RealMedia - RealMedia 文档 - RealMedia 文件 - - - - - - - - - - - - - RealPix document - مستند RealPix - Dakument RealPix - Документ — RealPix - document RealPix - Dokument RealPix - RealPix-dokument - RealPix-Dokument - έγγραφο RealPix - RealPix document - RealPix-dokumento - documento RealPix - RealPix dokumentua - RealPix-asiakirja - RealPix skjal - document RealPix - cáipéis RealPix - documento RealPix - מסמך של RealPix - RealPix dokument - RealPix dokumentum - Dokumen RealPix - Documento RealPix - RealPix ドキュメント - RealPix құжаты - RealPix 문서 - RealPix dokumentas - RealPix dokuments - RealPix-dokument - RealPix-document - RealPix-dokument - Dokument RealPix - Documento RealPix - Document RealPix - документ RealPix - Dokument RealPix - Dokument RealPix - Dokument RealPix - RealPix-dokument - документ RealPix - Tài liệu ảnh RealPix - RealPix 文档 - RealPix 文件 - - - - RealText document - مستند RealText - Dakument RealText - Документ — RealText - document RealText - Dokument RealText - RealText-dokument - RealText-Dokument - έγγραφο RealText - RealText document - RealText-dokumento - documento RealText - RealText dokumentua - RealText-asiakirja - RealText skjal - document RealText - cáipéis RealText - documento RealText - מסמך של RealText - RealText dokument - RealText dokumentum - Dokumen RealText - Documento RealText - RealText ドキュメント - RealText құжаты - RealText 문서 - RealText dokumentas - RealText dokuments - RealText-dokument - RealText-document - RealText-dokument - Dokument RealText - Documento RealText - Document RealText - документ RealText - Dokument RealText - Dokument RealText - Dokument RealText - RealText-dokument - документ RealText - Tài liệu văn bản RealText - RealText 文档 - RealText 文件 - - - - RIFF audio - RIFF سمعي - RIFF audio faylı - Aŭdyjo RIFF - Аудио — RIFF - àudio RIFF - Zvuk RIFF - Sain RIFF - RIFF-lyd - RIFF-Audio - ήχος RIFF - RIFF audio - RIFF-sondosiero - sonido RIFF - RIFF audioa - RIFF-ääni - RIFF ljóð - audio RIFF - fuaim RIFF - son RIFF - שמע RIFF - RIFF audio - RIFF-kép - Audio RIFF - Audio RIFF - RIFF オーディオ - RIFF аудиосы - RIFF 오디오 - RIFF garso įrašas - RIFF audio - Audio RIFF - RIFF-lyd - RIFF-audio - RIFF-lyd - Plik dźwiękowy RIFF - áudio RIFF - Áudio RIFF - Audio RIFF - аудио RIFF - Zvuk RIFF - Zvočna datoteka RIFF - Audio RIFF - RIFF звучни запис - RIFF-ljud - звук RIFF - Âm thanh RIFF - RIFF 音频 - RIFF 音訊 - - - - - - - Scream Tracker 3 audio - Scream Tracker 3 سمعي - Scream Tracker 3 audio faylı - Aŭdyjo Scream Tracker 3 - Аудио — Scream Tracker 3 - àudio de Scream Tracker 3 - Skladba Scream Tracker 3 - Sain Scream Tracker 3 - Scream Tracker 3-lyd - Scream-Tracker-3-Audio - ήχος Scream Tracker 3 - Scream Tracker 3 audio - Sondosiero de Scream Tracker 3 - sonido Scream Tracker 3 - Scream Tracker 3 audioa - Scream Tracker 3 -ääni - Scream Tracker 3 ljóður - audio Scream Tracker 3 - fuaim Scream Tracker 3 - son Scream Tracker 3 - שמע של Scream Tracker 3 - Scream Tracker 3 audio - Scream Tracker 3 hang - Audio Scream Tracker 3 - Audio Scream Tracker 3 - Scream Tracker 3 オーディオ - Scream Tracker 3 аудиосы - Scream Tracker 3 오디오 - Scream Tracker 3 garso įrašas - Scream Tracker 3 audio - Audio Scream Tracker 3 - Scream Tracker 3-lyd - Scream Tracker 3-audio - Sream Tracker 3 lyd - Plik dźwiękowy Scream Tracker 3 - áudio Scream Tracker 3 - Áudio Scream Tracker 3 - Audio Scream Tracker 3 - аудио Scream Tracker 3 - Skladba Scream Tracker 3 - Zvočna datoteka Scream Tracker 3 - Audio Scream Tracker 3 - Scream Tracker 3 звучни запис - Scream Tracker 3-ljud - звук Scream Tracker 3 - Âm thanh Scream Tracker 3 - Scheme Tracker 3 音频 - Scream Tracker 3 音訊 - - - - - - - MP3 ShoutCast playlist - قائمة تشغيل MP3 ShoutCast - Śpis piesień dla tranślacyi MP3 - Списък за изпълнение — MP3 ShoutCast - llista de reproducció MP3 ShoutCast - Seznam skladeb MP3 ShoutCast - MP3 ShoutCast-afspilningsliste - MP3-ShoutCast-Wiedergabeliste - Λίστα αναπαραγωγής MP3 ShoutCast - MP3 ShoutCast playlist - MP3-ludlisto de ShoutCast - lista de reproducción MP3 ShoutCast - MP3 ShoutCast erreprodukzio-zerrenda - MP3 ShoutCast -soittolista - MP3 ShoutCast avspælingarlisti - liste de lecture MP3 ShoutCast - seinmliosta MP3 ShoutCast - lista de reprodución MP3 de ShoutCast - רשימת השמעה MP3 של ShoutCast - MP3 ShoutCast popis za reprodukciju - MP3 ShoutCast-lejátszólista - Senarai putar MP3 ShoutCast - Scaletta MP3 ShoutCast - MP3 ShoutCast 再生リスト - MP3 ShoutCast ойнау тізімі - MP3 ShoutCast 재생 목록 - MP3 ShoutCast grojaraštis - MP3 ShoutCast repertuārs - Senaraimain ShoutCast MP3 - MP3 ShoutCast-spilleliste - MP3 ShoutCast-afspeellijst - MP3 ShoutCast-speleliste - Lista odtwarzania MP3 ShoutCast - lista de reprodução MP3 ShoutCast - Lista de reprodução MP3 ShoutCast - Listă MP3 ShoutCast - список воспроизведения MP3 ShoutCast - Zoznam skladieb MP3 ShoutCast - Seznam predvajanja MP3 ShoutCast - Listë titujsh MP3 ShoutCast - MP3 ShoutCast списак песама - MP3 ShoutCast-spellista - список програвання MP3 ShoutCast - Danh mục nhạc MP3 ShoutCast - MP3 ShoutCast 播放列表 - MP3 ShoutCast 播放清單 - - - - - - - - - - Scream Tracker audio - Scream Tracker سمعي - Scream Tracker audio faylı - Aŭdyjo Scream Tracker - Аудио — Scream Tracker - àudio de Scream Tracker - Skladba Scream Tracker - Sain Scream Tracker - Scream Tracker-lyd - Scream-Tracker-Audio - ήχος Scream Tracker - Scream Tracker audio - Sondosiero de Scream Tracker - sonido Scream Tracker - Scream Tracker audioa - Scream Tracker -ääni - Scream Tracker ljóður - audio Scream Tracker - fuaim Scream Tracker - son Scream Tracker - שמע של Scream Tracker - Scream Tracker audio - Scream Tracker hang - Audio Scream Tracker - Audio Scream Tracker - Scream Tracker オーディオ - Scream Tracker аудиосы - Scream Tracker 오디오 - Scream Tracker garso įrašas - Scream Tracker audio - Audio Scream Tracker - Scream Tracker-lyd - Scream Tracker-audio - Scream Tracker lyd - Plik dźwiękowy Scream Tracker - áudio Scream Tracker - Áudio Scream Tracker - Audio Scream Tracker - аудио Scream Tracker - Skladba Scream Tracker - Zvočna datoteka Scream Tracker - Audio Scream Tracker - Scream Tracker звучни запис - Scream Tracker-ljud - звук Scream Tracker - Âm thanh Scream Tracker - Scream Tracker 音频 - Scream Tracker 音訊 - - - - - - - - - VOC audio - VOC سمعي - VOC audio faylı - Aŭdyjo VOC - Аудио — VOC - àudio VOC - Zvuk VOC - Sain VOC - VOC-lyd - VOC-Audio - ήχος VOC - VOC audio - VOC-sondosiero - sonido VOC - VOC audioa - VOC-ääni - VOC ljóður - audio VOC - fuaim VOC - son VOC - שמע VOC - VOC audio - VOC hang - Audio VOC - Audio VOC - VOC オーディオ - VOC аудиосы - VOC 오디오 - VOC garso įrašas - VOC audio - Audio VOC - VOC-lyd - VOC-audio - VOC-lyd - Plik dźwiękowy VOC - áudio VOC - Áudio VOC - Audio VOC - аудио VOC - Zvuk VOC - Zvočna datoteka VOC - Audio VOC - VOC звучни запис - VOC-ljud - звук VOC - Âm thanh VOC - VOC 音频 - VOC 音訊 - - - - WAV audio - WAV سمعي - WAV audio faylı - Aŭdyjo WAV - Аудио — WAV - àudio WAV - Zvuk WAV - Sain WAV - WAV-lyd - WAV-Audio - ήχος WAV - WAV audio - WAV-sonkodo - sonido WAV - WAV audioa - WAV-ääni - WAV ljóður - audio WAV - fuaim WAV - son WAV - שמע WAV - WAV audio - WAV hang - Audio WAV - Audio WAV - WAV オーディオ - WAV аудиосы - WAV 오디오 - WAV garso įrašas - WAV audio - Audio VOC - WAV-lyd - WAV-audio - WAV-lyd - Plik dźwiękowy WAV - áudio WAV - Áudio WAV - Audio WAV - аудио WAV - Zvuk WAV - Zvočna datoteka WAV - Audio WAV - WAV звучни запис - WAV-ljud - звук WAV - Âm thanh WAV - WAV 音频 - WAV 音訊 - - - - - - - - - - Scream Tracker instrument - آلة Scream Tracker - Scream Tracker instrumenti - Instrument Scream Tracker - Инструмент — Scream Tracker - instrument de Scream Tracker - Nástroj pro Scream Tracker - Offeryn Scream Tracker - Scream Tracker-instrument - Scream-Tracker-Instrument - μουσικό όργανο Scream Tracker - Scream Tracker instrument - instrumento de Scream Tracker - instrumento Scream Tracker - Scream Tracker instrumentua - Scream Tracker -soitin - Scream Tracker ljóðføri - instrument Scream Tracker - ionstraim Scream Tracker - Instrumento Scream Tracker - כלי של Scream Tracker - Scream Tracker instrument - Scream Tracker hangszer - Instrumen Scream Tracker - Strumento Scream Tracker - Scream Tracker インストゥルメント - Scream Tracker сайманы - Scream Tracker 악기 - Scream Tracker instrumentas - Scream Tracker instrumenti - Instrumen Scream Tracker - Scream Tracker-instrument - Scream Tracker-instrument - Scream Tracker instrument - Instrument Scream Tracker - instrumento Scream Tracker - Instrumento Scream Tracker - Instrument Scream Tracker - инструмент Scream Tracker - Nástroj pre Scream Tracker - Datoteka zvoka glasbila Scream Tracker - Instrument Scream Tracker - Scream Tracker инструмент - Scream Tracker-instrument - інструмент Scream Tracker - Nhạc khí Scream Tracker - Scream Tracker 乐器 - Scream Tracker 樂器檔 - - - - - - - FastTracker II audio - FastTracker II سمعي - FastTracker II audio faylı - Aŭdyjo FastTracker II - Аудио — FastTracker II - àudio de FastTracker II - Zvuk FastTracker II - Sain FastTracker II - FastTracker II-lyd - FastTracker-II-Audio - ήχος FastTracker II - FastTracker II audio - Sondosiero de FastTracker II - sonido FastTracker II - FastTracker II.ren audioa - FastTracker II -ääni - FastTracker II ljóður - audio FastTracker II - fuaim FastTracker II - son de FastTracker II - שמע FastTracker II - FastTracker II audio - FastTracker II hang - Audio FastTracker II - Audio FastTracker II - FastTracker II オーディオ - FastTracker II-ის აუდიო - FastTracker II аудиосы - FastTracker II 오디오 - FastTracker II garso įrašas - FastTracker II audio - Audio FastTracker II - FastTracker II-lyd - FastTracker II-audio - FastTracker II lyd - Plik dźwiękowy FastTracker II - áudio FastTracker II - Áudio FastTracker II - Audio FastTracker II - аудио FastTracker II - Zvuk FastTracker II - Zvočna datoteka FastTracker II - Audio FastTracker II - FastTracker II аудио запис - FastTracker II-ljud - звук FastTracker II - Âm thanh FastTracker II - FastTracker II 音频 - FastTracker II 音訊 - - - - - - - TrueAudio audio - TrueAudio سمعي - Aŭdyjo TrueAudio - Аудио — TrueAudio - àudio TrueAudio - Zvuk TrueAudio - TrueAudio-lyd - TrueAudio-Audio - ήχος TrueAudio - TrueAudio audio - TrueAudio-sondosiero - sonido TrueAudio - TrueAudio audioa - TrueAudio-ääni - TrueAudio ljóður - audio TrueAudio - fuaim TrueAudio - son Trueson - שמע TrueAudio - TrueAudio audio - TrueAudio hang - Audio TrueAudio - Audio TrueAudio - TrueAudio オーディオ - TrueAudio аудиосы - TrueAudio 오디오 - TrueAudio garso įrašas - TrueAudio audio - TrueAudio-lyd - TrueAudio-audio - TrueAudio-lyd - Plik dźwiękowy TrueAudio - Áudio TrueAudio - Audio TrueAudio - аудио TrueAudio - Zvuk TrueAudio - Zvočna datoteka TrueAudio - Audio TrueAudio - TrueAudio-ljud - звук TrueAudio - Âm thanh TrueAudio - TrueAudio 音频 - TrueAudio 音訊 - - - - - - - - Windows BMP image - صورة Windows BMP - Windows BMP rəsmi - Vyjava Windows BMP - Изображение — Windows BMP - imatge BMP de Windows - Obrázek Windows BMP - Delwedd BMP Windows - Windows BMP-billede - Windows-BMP-Bild - εικόνα Windows BMP - Windows BMP image - BMP-bildo de Vindozo - imagen BMP de Windows - Windows BMP irudia - Windows BMP -kuva - Windows BMP mynd - image Windows BMP - íomhá BMP Windows - imaxe BMP de Windows - תמונת BMP של Windows - Windows BMP slika - Windows BMP-kép - Citra Windows BMP - Immagine Windows BMP - Windows BMP 画像 - Windows BMP суреті - Windows BMP 그림 - Windows BMP paveikslėlis - Windows BMP attēls - Imej BMP Windows - Windows BMP-bilde - Windows BMP-afbeelding - Windows BMP-bilete - Obraz BMP Windows - imagem BMP Windows - Imagem BMP do Windows - Imagine Windows BMP - изображение Windows BMP - Obrázok Windows BMP - Slikovna datoteka Windows BMP - Figurë Windows BMP - Windows BMP слика - Windows BMP-bild - Windows BMP görüntüsü - зображення Windows BMP - Ảnh BMP Windows - Windows BMP 图像 - Windows BMP 影像 - - - - - - - - - - - - - - WBMP image - صورة WBMP - Vyjava WBMP - Изображение — WBMP - imatge WBMP - Obrázek WBMP - WBMP-billede - WBMP-Bild - εικόνα WBMP - WBMP image - WBMP-bildo - imagen WBMP - WBMP irudia - WBMP-kuva - WBMP mynd - image WBMP - íomhá WBMP - imaxe WBMP - תמונת WBMP - WBMP slika - WBMP kép - Citra WBMP - Immagine WBMP - WBMP 画像 - WBMP суреті - WBMP 그림 - WBMP paveikslėlis - WBMP attēls - WBMP-bilde - WBMP-afbeelding - WBMP-bilete - Obraz WBMP - Imagem WBMP - Imagine WBMP - изображение WBMP - Obrázok WBMP - Slikovna datoteka WBMP - Figurë WBMP - WBMP-bild - зображення WBMP - Ảnh WBMP - WBMP 图像 - WBMP 影像 - WBMP - WAP bitmap - - - - Computer Graphics Metafile - ملف تعريف رسوميات الحاسوب - Kompüter Qrafikası Meta Faylı - Metafajł Computer Graphics - Метафайл — Computer Graphics - metafitxer de Computer Graphics - Computer Graphics Metafile - Delwedd ffurf CGM - Computer Graphics-metafil - CGM-Datei - αρχείο Computer Graphics Metafile - Computer Graphics Metafile - metaarchivo de Computer Graphics - Ordenagailuko grafikoen meta-fitxategia - Computer Graphics -metatiedosto - Teldugrafikk metafíla - métafichier Computer Graphics - meiteachomhad Grafaicí Ríomhaire - metaficheiro de Computer Graphics - קובץ-מטה מסוג Computer Graphics - Computer Graphics-metafájl - Computer Graphics Metafile - Computer Graphics Metafile - コンピューターグラフィックメタファイル - компьютерлік графика метафайлы - 컴퓨터 그래픽스 메타파일 - Computer Graphics metafailas - Datorgrafikas metadatne - Failmeta Grafik Komputer - Computer Graphics Metafile - Computer Graphics-metabestand - Computer Graphics Metafile - Metaplik grafiki komputerowej (CGM) - Computer Graphics Metafile - Meta-arquivo do Computer Graphics - Metafișier Computer Graphics - метафайл компьютерной графики - Computer Graphics Metafile - Metadatoteka računalniške grafike (CGM) - Metafile Computer Graphics - Метадатотека са рачунарском графиком (CGM) - Computer Graphics Metafil - метафайл комп'ютерної графіки - Siêu tập tin đồ họa máy tính (CMF) - CGM 计算机图像元文件 - CGM 影像 - - - - CCITT G3 fax - فاكس CCITT G3 - Faks CCITT G3 - Факс — CCITT G3 - fax CCITT G3 - Fax CCITT G3 - CCITT G3-fax - CCITT-G3-Fax - φαξ σε μορφή CCITT G3 - CCITT G3 fax - G3-fakso de CCITT - fax de CCITT G3 - CCITT G3 faxa - CCITT G3 -faksi - CCITT G3 telefaks - télécopie G3 CCITT - facs CCITT G3 - fax de CCITT G3 - פקס של CCITT G3 - CCITT G3 faks - CCITT G3-fax - Faks CCITT G3 - Fax CCITT G3 - CCITT G3 FAX - CCITT G3 ფაქსი - CCITT G3 факсі - CCITT G3 팩스 - CCITT G3 faksas - CCITT G3 fakss - Faks g3 CCITT - CCITT G3-faks - CCITT G3-fax - CCITT G3-fax - Faks CCITT G3 - fax CCITT G3 - Fax do CCITT G3 - Fax CCITT G3 - факс CCITT G3 - Fax CCITT G3 - Datoteka faksimila CCITT G3 - Fax CCITT G3 - CCITT g3 факс - CCITT G3-fax - факс CCITT G3 - Điện thư G3 CCITT - CCITT G3 传真 - CCITT G3 傳真檔 - - - - G3 fax image - صورة فاكس G3 - G3 faks rəsmi - Faksavaja vyjava G3 - Изображение — факс G3 - imatge de fax G3 - Obrázek fax G3 - Delwedd Ffacs G3 - G3-faxbillede - G3-Faxbild - εικόνα φαξ G3 - G3 fax image - G3-faksbildo - imagen de fax G3 - G3 fax-irudia - G3-faksikuva - G3 fax mynd - image de télécopie G3 - íomhá fhacs G3 - imaxe de fax G3 - תמונת פקס של G3 - G3-faxkép - Citra faks G3 - Immagine fax G3 - G3 FAX 画像 - G3 fax გამოსახულება - G3 факс суреті - G3 팩스 그림 - G3 fax paveikslėlis - G3 faksa attēls - Imej fax G3 - G3-faksbilde - G3 faxafbeelding - G3 faksbilete - Obraz faksowy G3 - imagem de fax G3 - Imagem de fax G3 - Imagine fax G3 - факсовое изображение G3 - Obrázok fax G3 - Slikovna datoteka G3 fax - Figurë Fax G3 - G3 факс слика - G3-faxbild - G3 fax görüntüsü - факс G3 - Ảnh điện thư G3 - G3 传真文档 - G3 傳真圖 - - - GIF image - صورة GIF - GIF rəsmi - Vyjava GIF - Изображение — GIF - imatge GIF - Obrázek GIF - Delwedd GIF - GIF-billede - GIF-Bild - εικόνα GIF - GIF image - GIF-bildo - imagen GIF - GIF irudia - GIF-kuva - GIF mynd - image GIF - íomhá GIF - imaxe GIF - תמונת GIF - GIF slika - GIF-kép - Citra GIF - Immagine GIF - GIF 画像 - GIF გამოსახულება - GIF суреті - GIF 그림 - GIF paveikslėlis - GIF attēls - Imej GIF - GIF-bilde - GIF-afbeelding - GIF-bilete - Obraz GIF - imagem GIF - Imagem GIF - Imagine GIF - изображение GIF - Obrázok GIF - Slikovna datoteka GIF - Figurë GIF - GIF слика - GIF-bild - GIF görüntüsü - зображення GIF - Ảnh GIF - GIF 图像 - GIF 影像 - - - - - - - IEF image - صورة IEF - IEF rəsmi - Vyjava IEF - Изображение — IEF - imatge IEF - Obrázek IEF - Delwedd IEF - IEF-billede - IEF-Bild - εικόνα IEF - IEF image - IEF-bildo - imagen IEF - IEF irudia - IEF-kuva - IEF mynd - image IEF - íomhá IEF - imaxe IEF - תמונת IEF - IEF slika - IEF-kép - Citra IEF - Immagine IEF - IEF 画像 - IEF суреті - IEF 그림 - IEF paveikslėlis - IEF attēls - Imej IEF - IEF-bilde - IEF-afbeelding - IEF-bilete - Obraz IEF - imagem IEF - Imagem IEF - Imagine IEF - изображение IEF - Obrázok IEF - Slikovna datoteka IEF - Figurë IEF - IEF слика - IEF-bild - зображення IEF - Ảnh IEF - IEF 图像 - IEF 影像 - - - - JPEG image - صورة JPEG - JPEG rəsmi - Vyjava JPEG - Изображение — JPEG - imatge JPEG - Obrázek JPEG - Delwedd JPEG - JPEG-billede - JPEG-Bild - εικόνα JPEG - JPEG image - JPEG-bildo - imagen JPEG - JPEG irudia - JPEG-kuva - JPEG mynd - image JPEG - íomhá JPEG - imaxe JPEG - תמונת JPEG - JPEG slika - JPEG-kép - Citra JPEG - Immagine JPEG - JPEG 画像 - JPEG суреті - JPEG 그림 - JPEG paveikslėlis - JPEG attēls - Imej JPEG - JPEG-bilde - JPEG-afbeelding - JPEG-bilete - Obraz JPEG - imagem JPEG - Imagem JPEG - Imagine JPEG - изображение JPEG - Obrázok JPEG - Slikovna datoteka JPEG - Figurë JPEG - JPEG слика - JPEG-bild - JPEG görüntüsü - зображення JPEG - Ảnh JPEG - JPEG 图像 - JPEG 影像 - - - - - - - - - - - JPEG-2000 image - صورة JPEG-2000 - Vyjava JPEG-2000 - Изображение — JPEG-2000 - imatge JPEG-2000 - Obrázek JPEG-2000 - JPEG2000-billede - JPEG-2000-Bild - εικόνα JPEG-2000 - JPEG-2000 image - JPEG-2000-bildo - imagen JPEG-2000 - JPEG-2000 irudia - JPEG-2000-kuva - JPEG-2000 mynd - image JPEG-2000 - íomhá JPEG-2000 - imaxe JPEG-2000 - תמונת JPEG-2000 - JPEG-2000 slika - JPEG-2000 kép - Citra JPEG-2000 - Immagine JPEG-2000 - JPEG-2000 画像 - JPEG-2000 суреті - JPEG-2000 그림 - JPEG-2000 paveikslėlis - JPEG-2000 attēls - Imej JPEG-2000 - JPEG-2000-bilde - JPEG-2000-afbeelding - JPEG-2000-bilete - Obraz JPEG-2000 - imagem JPEG-2000 - Imagem JPEG-2000 - Imagine JPEG-2000 - изображение JPEG-2000 - Obrázok JPEG-2000 - Slikovna datoteka JPEG-2000 - Figurë JPEG-2000 - JPEG-2000 слика - JPEG-2000-bild - JPEG-2000 görüntüsü - зображення JPEG-2000 - Ảnh JPEG-2000 - JPEG-2000 图像 - JPEG-2000 影像 - - - - - - - - - - - - - - - - OpenRaster archiving image - صورة أرشيف OpenRaster - Изображение — OpenRaster - imatge d'arxivat OpenRaster - Archivační obraz OpenRaster - OpenRaster-arkivaftryk - OpenRaster-Archivierungsbild - εικόνα αρχειοθέτησης OpenRaster - OpenRaster archiving image - imagen de archivado de OpenRaster - OpenRaster artxiboaren irudia - OpenRaster goymslumynd - image d'archive OpenRaster - íomhá chartlannaithe OpenRaster - imaxe arquivada de OpenRaster - תמונת ארכיון של OpenRaster - OpenRaster archiválási kép - Gambar pengarsipan OpenRaster - Immagine archiviazione OpenRaster - OpenRaster アーカイブイメージ - OpenRaster-ის საარქივო გამოსახულება - OpenRaster архивтеу суреті - OpenRaster 압축 이미지 - OpenRaster archyvavimo paveikslėlis - OpenRaster arhivēšanas attēls - OpenRaster archiverings-image - Archiwalny obraz OpenRaster - Imagem de arquivamento OpenRaster - Arhivă imagine OpenRaster - архивное изображение OpenRaster - Odtis arhiva OpenRaster - OpenRaster-arkivbild - архівоване зображення OpenRaster - OpenRaster 归档映像 - OpenRaster 封存影像 - - - - - - - - - - - WebP image - صورة WebP - WebP rəsmi - Vyjava WebP - Изображение — WebP - imatge WebP - Obrázek WebP - Delwedd WebP - WebP-billede - WebP-Bild - εικόνα WebP - WebP image - WebP-bildo - imagen WebP - WebP irudia - WebP-kuva - WebP mynd - image WebP - íomhá WebP - imaxe WebP - תמונת WebP - WebP slika - WebP-kép - Citra WebP - Immagine WebP - WebP 画像 - WebP суреті - WebP 그림 - WebP paveikslėlis - WebP attēls - Imej WebP - WebP-bilde - WebP-afbeelding - WebP-bilete - Obraz WebP - imagem WebP - Imagem WebP - Imagine WebP - изображение WebP - Obrázok WebP - Slikovna datoteka WebP - Figurë WebP - WebP слика - WebP-bild - WebP görüntüsü - зображення WebP - Ảnh WebP - WebP 图像 - WebP 影像 - - - - - - - - - DirectDraw surface - مساحة DirectDraw - Pavierchnia DirectDraw - Изображение — повърхност на DirectDraw - superfície DirectDraw - Plocha DirectDraw - DirectDraw-overflade - DirectDraw-Oberfläche - επιφάνεια DirectDraw - DirectDraw surface - superficie DirectDraw - DirectDraw gainazala - DirectDraw-piirtoalue - DirectDraw yvirflata - surface DirectDraw - dromchla DirectDraw - superficie de DirectDraw - משטח של DirectDraw - DirectDraw ploha - DirectDraw felület - Permukaan DirectDraw - Superficie DirectDraw - DirectDraw サーフェイス - DirectDraw-ის ზედაპირი - DirectDraw жазықтығы - DirectDraw 서피스 - DirectDraw paviršius - DirectDraw virsma - DirectDraw-overflate - DirectDraw-oppervlak - DirectDraw-overflate - Powierzchnia DirectDraw - Superfície do DirectDraw - Suprafață DirectDraw - плоскость DirectDraw - Plocha DirectDraw - Datoteka predmeta DirectDraw - Superfaqe DirectDraw - DirectDraw-yta - поверхня DirectDraw - Mặt DirectDraw - DirectDraw 表面 - DirectDraw 表面 - - - - - - - X11 cursor - مؤشر X11 - Kursor X11 - Курсор — X11 - cursor X11 - Kurzor X11 - X11-markør - X11-Zeiger - δείκτης X11 - X11 cursor - cursor X11 - X11 kurtsorea - X11-osoitin - X11 vísi - curseur X11 - cúrsóir X11 - Cursor X11 - סמן של X11 - X11 kursor - X11 kurzor - Kursor X11 - Cursore X11 - X11 カーソル - X11 курсоры - X11 커서 - X11 žymiklis - X11 kursors - X11-markør - X11-muisaanwijzer - X11-peikar - Kursor X11 - Cursor do X11 - Cursor X11 - курсор X11 - Kurzor X11 - Datoteka kazalke X11 - Kursor X11 - X11-muspekare - курсор X11 - Con chạy X11 - X11 指针 - X11 滑鼠游標 - - - - - - EXR image - صورة EXR - Vyjava EXR - Изображение — EXR - imatge EXR - Obrázek EXR - EXR-billede - EXR-Bild - εικόνα EXR - EXR image - EXR-bildo - imagen EXR - EXR irudia - EXR-kuva - EXR mynd - image EXR - íomhá EXR - imaxe EXR - תמונת EXR - EXR slika - EXR kép - Citra EXR - Immagine EXR - EXR 画像 - EXR გამოსახულება - EXR суреті - EXR 그림 - EXR paveikslėlis - EXR attēls - EXR-bilde - EXR-afbeelding - EXR-bilete - Obraz EXR - Imagem EXR - Imagine EXR - изображение EXR - Obrázok EXR - Slikovna datoteka EXR - Figurë EXR - EXR-bild - EXR görüntüsü - зображення EXR - Ảnh EXR - EXR 图像 - EXR 影像 - - - - - - - Macintosh Quickdraw/PICT drawing - رسمة ماكنتوش Quickdraw/PICT - Rysunak Macintosh Quickdraw/PICT - Чертеж — Macintosh Quickdraw/PICT - dibuix Quickdraw/PICT de Macintosh - Kresba Macintosh Quickdraw/PICT - Macintosh Quickdraw/PICT-tegning - Macintosh-Quickdraw/PICT-Zeichnung - σχέδιο Macintosh Quickdraw/PICT - Macintosh Quickdraw/PICT drawing - Quickdraw/PICT-grafikaĵo de Macintosh - dibujo de Macintosh Quickdraw/PICT - Macintosh Quickdraw/PICT marrazkia - Macintosh Quickdraw/PICT -piirros - Macintosh Quickdraw/PICT tekning - dessin Macintosh Quickdraw/PICT - líníocht Macintosh Quickdraw/PICT - debuxo de Macintosh Quickdraw/PICT - ציור של Macintosh Quickdraw/PICT - Macintosh Quickdraw/PICT crtež - Macintosh Quickdraw/PICT-rajz - Gambar Macintosh Quickdraw/PICT - Disegno Macintosh Quickdraw/PICT - Macintosh Quickdraw/PICT ドロー - Macintosh Quickdraw/PICT суреті - 매킨토시 Quickdraw/PICT 그림 - Macintosh Quickdraw/PICT piešinys - Macintosh Quickdraw/PICT zīmējums - Lukisan Macintosh Quickdraw/PICT - Macintosh Quickdraw/PICT-tegning - Macintosh Quickdraw/PICT-tekening - Macintosh Quickdraw/PICT-teikning - Rysunek Quickdraw/PICT Macintosh - desenho Quickdraw/PICT de Macintosh - Desenho do Macintosh Quickdraw/PICT - Desen Macintosh Quickdraw/PICT - рисунок Macintosh Quickdraw/PICT - Kresba Macintosh QuickDraw/PICT - Datoteka risbe Macintosh Quickdraw/PICT - Vizatim Macintosh Quickdraw/PICT - Мекинтош Quickdraw/PICT цртеж - Macintosh Quickdraw/PICT-teckning - малюнок Macintosh Quickdraw/PICT - Bản vẽ Quickdraw/PICT của Macintosh - Macintosh Quickdraw/PICT 绘图 - Macintosh Quickdraw/PICT 繪圖 - - - - - - - - - - - - - - - - - - - - - - - - - UFRaw ID image - صورة UFRaw ID - Vyjava UFRaw ID - Изображение — UFRaw ID - imatge ID UFRaw - Obrázek ID UFRaw - UFRaw ID-billede - UFRaw-Bildbeschreibungsdatei - ταυτότητα UFRaw - UFRaw ID image - imagen de identificación UFRaw - UFRaw ID irudia - UFRaw ID -kuva - UFRaw ID mynd - image ID UFRaw - íomhá aitheantais UFRaw - imaxe de identificación UFRaw - תמונה של UFRaw ID - UFRaw azonosítófájl - Citra UFRaw ID - Immagine UFRaw ID - UFRaw ID イメージ - UFRaw ID суреті - UFRaw ID 그림 - UFRaw ID paveikslėlis - UFRaw ID attēls - UFRaw ID-bilde - UFRaw ID-afbeelding - UFRaw ID-bilete - Obraz UFRaw ID - Imagem ID do UFRaw - ID imagine UFRaw - изображение UFRaw ID - Obrázok ID UFRaw - Slikovna datoteka UFRaw ID - Figurë UFRaw ID - UFRaw ID-bild - зображення UFRaw ID - Ảnh ID UFRaw - UFRaw ID 图像 - UFRaw ID 影像 - UFRaw - Unidentified Flying Raw - - - - - - digital raw image - صورة رقمية خامة - suvoraja ličbavaja vyjava - Изображение — digital raw - imatge digital en cru - Digitální surový obrázek - digitalt råbillede - Digitales Rohbild - ανεπεξέργαστη ψηφιακή εικόνα - digital raw image - imagen digital en bruto - irudi gordin digitala - digitaalinen raakakuva - talgild rámynd - image brute numérique - amhíomhá digiteach - imaxe en bruto dixital - תמונה דיגטלית גולמית - digitális nyers kép - citra mentah digital - Immagine raw digitale - デジタル raw 画像 - өңделмеген сандық суреттер - 디지털 원본 이미지 - skaitmeninis neapdorotas paveikslėlis - digitāls jēlattēls - digitalt raw-bilde - onbewerkt digitaal beeld - digitalt råbilete - Surowy obraz cyfrowy - Imagem digital bruta - imagine digitală brută - необработанные цифровые изображения - Digitálny surový obrázok - surova digitalna slika - Figurë raw dixhitale - digital råbild - зображення цифрового негатива - ảnh thô số - 数字化原始图像 - 數位原生影像 - - - Adobe DNG negative - Adobe DNG negative - Adobe DNG Negative - Изображение — Adobe DNG negative - negatiu DNG d'Adobe - Adobe Digital Negative (DNG) - Adobe DNG-negativ - Adobe Digitales Negativ - αρνητικό Adobe DNG - Adobe DNG negative - negativo digital de Adobe (ADN) - Adobe DNG negatiboa - Adobe-DNG-negatiivi - Adobe DNG negativ - négatif DNG Adobe - claonchló DNG Adobe - negativo DNG de Adobe - תשליל Adobe DNG - Adobe DNG negativ - Adobe DNG negatív - Negatif Adobe DNG - Negativo Adobe DNG - Adobe DNG ネガ - Adobe DNG-ის ნეგატივი - Adobe DNG негативі - 어도비 DNG 네거티브 - Adobe DNG negatyvas - Adobe DNG negatīvs - Adobe DNG-negativ - Adobe DNG-negatief - Adobe DNG-negativ - Negatyw DNG Adobe - Negativo DNG da Adobe - Negativ Adobe DNG - негатив Adobe DNG - Adobe Digital Negative (DNG) - Datoteka negativa Adobe DNG - Negativ Adobe DNG - Adobe DNG-negativ - цифровий негатив DNG Adobe - Âm bản Adobe DNG - Adobe DNG 负片 - Adobe DNG 負片 - DNG - Digital Negative - - - - - - - - Canon CRW raw image - صورة Canon CRW خامة - Suvoraja vyjava Canon CRW - Изображение — Canon CRW raw - imatge en cru de Canon CRW - Surový obrázek Canon CRW - Canon CRW-råbillede - Canon-CRW-Rohbild - ανεπεξέργαστη εικόνα Canon CRW - Canon CRW raw image - imagen en bruto CRW de Canon - Canon CRW irudi gordina - Canon-CRW-raakakuva - Canon CRW rámynd - image brute CRW Canon - amhíomhá Canon CRW - imaxe en bruto de Canon CRW - תמונה גולמית של Canon CRW - Canon CRW nyers kép - Citra mentah Canon CRW - Immagine raw Canon CRW - Canon CRW raw 画像 - Canon CRW raw გამოსახულება - Canon CRW өңделмеген суреті - 캐논 CRW 원본 이미지 - Canon CRW neapdorotas paveikslėlis - Canon CRW jēlattēls - Canon CRW raw-bilde - onbewerkt Canon CRW-beeld - Canon CRW råbilete - Surowy obraz CRW Canon - Imagem bruta CRW da Canon - Imagine brută Canon CRW - необработанное изображение Canon CRW - Surový obrázok Canon CRW - Surova slikovna datoteka Canon CRW - Figurë raw Canon CRW - Canon CRW-råbild - цифровий негатив CRW Canon - Ảnh thô Canon CRW - Canon CRW 原始图像 - Canon CRW 原生影像 - CRW - Canon RaW - - - - - - - - - Canon CR2 raw image - صورة Canon CR2 خامة - Suvoraja vyjava Canon CR2 - Изображение — Canon CR2 raw - imatge en cru de Canon CR2 - Surový obrázek Canon CR2 - Canon CR2-råbillede - Canon-CR2-Rohbild - ανεπεξέργαστη εικόνα Canon CR2 - Canon CR2 raw image - imagen en bruto CR2 de Canon - Canon CR2 irudi gordina - Canon-CR2-raakakuva - Canon CR2 rámynd - image brute CR2 Canon - amhíomhá Canon CR2 - imaxe en bruto de Canon CR2 - תמונה גולמית של Canon CR2 - Canon CR2 nyers kép - Citra mentah Canon CR2 - Immagine raw Canon CR2 - Canon CR2 raw 画像 - Canon CR2 raw გამოსახულება - Canon CR2 өңделмеген суреті - 캐논 CR2 원본 이미지 - Canon CR2 neapdorotas paveikslėlis - Canon CR2 jēlattēls - Canon CR2 raw-bilde - onbewerkt Canon CR2-beeld - Canon CR2 råbilete - Surowy obraz CR2 Canon - Imagem bruta CR2 da Canon - Imagine brută Canon CR2 - необработанное изображение Canon CR2 - Surový obrázok Canon CR2 - Surova slikovna datoteka Canon CR2 - Figurë raw Canon CR2 - Canon CR2-råbild - цифровий негатив CR2 Canon - Ảnh thô Canon CR2 - Canon CR2 原始图像 - Canon CR2 原生影像 - CR2 - Canon Raw 2 - - - - - - Fuji RAF raw image - صورة Fuji RAF خامة - Suvoraja vyjava Fuji RAF - Изображение — Fuji RAF raw - imatge en cru de Fuji RAF - Surový obrázek Fuji RAF - Fuji RAF-råbillede - Fuji-RAF-Rohbild - ανεπεξέργαστη εικόνα Fuji RAF - Fuji RAF raw image - imagen en bruto RAF de Fuji - Fuji RAF irudi gordina - Fuji-RAF-raakakuva - Fuji RAF raw mynd - image brute RAF Fuji - amhíomhá Fuji RAF - imaxe en bruto de Fuji RAF - תמונה גולמית של Fuji RAF - Fuji RAF nyers kép - Citra mentah Fuji RAF - Immagine raw Fuji RAF - Fuji RAF raw 画像 - Fuji RAF-ის raw გამოსახულება - Fuji RAF өңделмеген суреті - 후지 RAF 원본 이미지 - Fuji RAF neapdorotas paveikslėlis - Fuji RAF jēlattēls - Fuji RAF raw-bilde - onbewerkt Fuji RAF-beeld - Fuji RAF rått bilete - Surowy obraz RAF Fuji - Imagem bruta RAF da Fuji - Imagine brută Fuji RAF - необработанное изображение Fuji RAF - Surový obrázok Fuji RAF - Surova slikovna datoteka Fuji RAF - Figurë raw Fuji RAF - Fuji RAF-råbild - Цифровий негатив RAF Fuji - Ảnh thô Fuji RAF - 富士RAF 原始图像 - Fuji RAF 原生影像 - RAF - RAw Format - - - - - - - - Kodak DCR raw image - صورة Kodak DCR خامة - Suvoraja vyjava Kodak DCR - Изображение — Kodak DCR raw - imatge en cru de Kodak DCR - Surový obrázek Kodak DCR - Kodak DCR-råbillede - Kodak-DCR-Rohbild - ανεπεξέργαστη εικόνα Kodak DCR - Kodak DCR raw image - imagen en bruto DCR de Kodak - Kodak DCR irudi gordina - Kodak-DCR-raakakuva - Kodak DCR rámynd - image brute DCR Kodak - amhíomhá Kodak DCR - imaxe en bruto de Kodad DCR - תמונה גולמית של Kodak DCR - Kodak DCR nyers kép - Citra mentah Kodak DCR - Immagine raw Kodak DCR - Kodak DCR raw 画像 - Kodak DCR өңделмеген суреті - 코닥 DCR 원본 이미지 - Kodak DCR neapdorotas paveikslėlis - Kodak DCR jēlattēls - Kodak DCR raw-bilde - onbewerkt Kodak DCR-beeld - Kodak DCR råbilete - Surowy obraz DCR Kodak - Imagem bruta DCR da Kodak - Imagine brută Kodak DCR - необработанное изображение Kodak DCR - Surový obrázok Kodak DCR - Surova slikovna datoteka Kodak DCR - Figurë raw Kodak DCR - Kodak DCR-råbild - цифровий негатив DCR Kodak - Ảnh thô Kodak DCR - Kodak DCR 原始图像 - Kodak DCR 原生影像 - DCR - Digital Camera Raw - - - - - - Kodak K25 raw image - صورة Kodak K25 خامة - Suvoraja vyjava Kodak K25 - Изображение — Kodak K25 raw - imatge en cru de Kodak K25 - Surový obrázek Kodak K25 - Kodak K25-råbillede - Kodak-K25-Rohbild - ανεπεξέργαστη εικόνα Kodak K25 - Kodak K25 raw image - imagen en bruto K25 de Kodak - Kodak K25 raw image - Kodak-K25-raakakuva - Kodak K25 rámynd - image brute K25 Kodak - amhíomhá Kodak K25 - imaxe en bruto de Kodad K25 - תמונה גולמית של Kodak K25 - Kodak K25 nyers kép - Citra mentah Kodak K25 - Immagine raw Kodak K25 - Kodak K25 raw 画像 - Kodak K25 өңделмеген суреті - 코닥 K25 원본 이미지 - Kodak K25 neapdorotas paveikslėlis - Kodak K25 jēlattēls - Kodak K25 raw-bilde - onbewerkt Kodak K25-beeld - Kodak K25 råbilete - Surowy obraz K25 Kodak - Imagem bruta K25 da Kodak - Imagine brută Kodak K25 - необработанное изображение Kodak K25 - Surový obrázok Kodak K25 - Surova slikovna datoteka Kodak K25 - Figurë raw Kodak K25 - Kodak K25-råbild - цифровий негатив K25 Kodak - Ảnh thô Kodak K25 - Kodak K25 原始图像 - Kodak K25 原生影像 - K25 - Kodak DC25 - - - - - - Kodak KDC raw image - صورة Kodak KDC خامة - Suvoraja vyjava Kodak KDC - Изображение — Kodak KDC raw - imatge en cru de Kodak KDC - Surový obrázek Kodak KDC - Kodak KDC-råbillede - Kodak-KDC-Rohbild - ανεπεξέργαστη εικόνα Kodak KDC - Kodak KDC raw image - imagen en bruto KDC de Kodak - Kodak KDC irudi gordina - Kodak-KDC-raakakuva - Kodak KDC rámynd - image brute KDC Kodak - amhíomhá Kodak KDC - imaxe en bruto de Kodad KDC - תמונה גולמית של Kodak KDC - Kodak KDC nyers kép - Citra mentah Kodak KDC - Immagine raw Kodak KDC - Kodak KDC raw 画像 - Kodak KDC өңделмеген суреті - 코닥 KDC 원본 이미지 - Kodak KDC neapdorotas paveikslėlis - Kodak KDC jēlattēls - Kodak KDC raw-bilde - onbewerkt Kodak KDC-beeld - Kodak KDC råbilete - Surowy obraz KDC Kodak - Imagem bruta KDC da Kodak - Imagine brută Kodak KDC - необработанное изображение Kodak KDC - Surový obrázok Kodak KDC - Surova slikovna datoteka Kodak KDC - Figurë raw Kodak KDC - Kodak KDC-råbild - цифровий негатив KDC Kodak - Ảnh thô Kodak KDC - Kodak KDC 原始图像 - Kodak KDC 原生影像 - KDC - Kodak Digital Camera - - - - - - - - - Minolta MRW raw image - صورة Minolta MRW خامة - Suvoraja vyjava Minolta MRW - Изображение — Minolta MRW raw - imatge en cru de Minolta MRW - Surový obrázek Minolta MRW - Minolta MRW-råbillede - Minolta-MRW-Rohbild - ανεπεξέργαστη εικόνα Minolta MRW - Minolta MRW raw image - imagen en bruto MRW de Minolta - Minolta MRW irudi gordina - Minolta-MRW-raakakuva - Minolta MRW rámynd - image brute MRW Minolta - amhíomhá Minolta MRW - imaxe RAW de Minolta MRW - תמונה גולמית של Minolta MRW - Minolta MRW nyers kép - Citra mentah Minolta MRW - Immagine raw Minolta MRW - Minolta MRW raw 画像 - Minolta MRW өңделмеген суреті - 미놀타 MRW 원본 이미지 - Minolta MRW neapdorotas paveikslėlis - Minolta MRW jēlattēls - Minolta MRW raw-bilde - onbewerkt Minolta MRW-beeld - Minolta MRW råbilete - Surowy obraz MRW Minolta - Imagem bruta MRW do Minolta - Imagine brută Minolta MRW - необработанное изображение Minolta MRW - Surový obrázok Minolta MRW - Surova slikovna datoteka Minolta MRW - Figurë raw Minolta MRW - Minolta MRW-råbild - цифровий негатив MRW Minolta - Ảnh thô Minolta MRW - Minolta MRW 原始图像 - Minolta MRW 原生影像 - MRW - Minolta RaW - - - - - - - - Nikon NEF raw image - صورة Nikon NEF خامة - Suvoraja vyjava Nikon NEF - Изображение — Nikon NEF raw - imatge en cru de Nikon NEF - Surový obrázek Nikon NEF - Nikon NEF-råbillede - Nikon-NEF-Rohbild - ανεπεξέργαστη εικόνα Nikon NEF - Nikon NEF raw image - imagen en bruto NEF de Nikon - Nikon NEF irudi gordina - Nikon-NEF-raakakuva - Nikon NEF rámynd - image brute NEF Nikon - amhíomhá Nikon NEF - imaxe RAW NEF Nikon - תמונה גולמית של Nikon NEF - Nikon NEF nyers kép - Citra mentah Nikon NEF - Immagine raw Nikon NEF - Nikon NEF raw イメージ - Nikon NEF өңделмеген суреті - 니콘 NEF 원본 이미지 - Nikon NEF neapdorotas paveikslėlis - Nikon NEF jēlattēls - Nikon NEF raw-bilde - onbewerkt Nikon NEF-beeld - Nikon NEF råbilete - Surowy obraz NEF Nikon - Imagem bruta NEF da Nikon - Imagine brută Nikon NEF - необработанное изображение Nikon NEF - Surový obrázok Nikon NEF - Surova slikovna datoteka Nikon NEF - Figurë raw Nikon NEF - Nikon NEF-råbild - цифровий негатив NEF Nikon - Ảnh thô Nikon NEF - Nikon NEF 原始图像 - Nikon NEF 原生影像 - NEF - Nikon Electronic Format - - - - - - Olympus ORF raw image - صورة Olympus ORF خامة - Suvoraja vyjava Olympus ORF - Изображение — Olympus ORF raw - imatge en cru d'Olympus ORF - Surový obrázek Olympus ORF - Olympus ORF-råbillede - Olympus-ORF-Rohbild - ανεπεξέργαστη εικόνα Olympus ORF - Olympus ORF raw image - imagen en bruto ORF de Olympus - Olympus ORF irudi gordina - Olympus-ORF-raakakuva - Olympus ORF rámynd - image brute ORF Olympus - amhíomhá Olympus ORF - imaxe en bruto de Olympus ORF - תמונה גולמית של Olympus ORF - Olympus ORF nyers kép - Citra mentah Olympus ORF - Immagine raw Olympus ORF - Olympus ORF raw 画像 - Olympus ORF-ის raw გამოსახულება - Olympus ORF өңделмеген суреті - 올림푸스 ORF 원본 이미지 - Olympus ORF neapdorotas paveikslėlis - Olympus ORF jēlattēls - Olympus ORF raw-bilde - onbewerkt Olympus ORF-beeld - Olympus ORF råbilete - Surowy obraz Olympus ORF - Imagem bruta ORF da Olympus - Imagine brută Olympus ORF - необработанное изображение Olympus ORF - Surový obrázok Olympus ORF - Surova slikovna datoteka Olympus ORF - Figurë raw Olympus ORF - Olympus ORF-råbild - цифровий негатив ORF Olympus - Ảnh thô Olympus ORF - Olympus ORF 原始图像 - Olympus ORF 原生影像 - ORF - Olympus Raw Format - - - - - - - - - - - - - Panasonic raw image - صورة Panasonic خامة - Suvoraja vyjava Panasonic - Изображение — Panasonic raw - imatge en cru de Panasonic - Surový obrázek Panasonic - Panasonicråbillede (raw) - Panasonic-Rohbild - Panasonic raw image - imagen en bruto de Panasonic - Panasonic irudi gordina - Panasonic-raakakuva - Panasonic rámynd - image brute Panasonic - amhíomhá Panasonic - imaxe en bruto de Panasonic - תמונה גולמית של Panasonic - Panasonic nyers kép - Citra mentah Panasonic - Immagine raw Panasonic - Panasonic raw 画像 - Panasonic өңделмеген суреті - 파나소닉 원본 이미지 - Panasonic neapdorotas paveikslėlis - Panasonic jēlattēls - Panasonic raw-bilde - onbewerkt Panasonic-beeld - Panasonic råbilete - Obraz raw Panasonic - Imagem bruta da Panasonic - Imagine brută Panasonic - необработанное изображение Panasonic - Surový obrázok Panasonic - Surova slikovna datoteka Panasonic - Figurë raw Panasonic - Panasonic-råbild - цифровий негатив Panasonic - Ảnh thô Panasonic - Panasonic 原始图像 - Panasonic 原生影像 - - - - - - - - - Panasonic raw2 image - Изображение — Panasonic raw2 - imatge «RAW2» de Panasonic - Surový obrázek Panasonic raw2 - Panasonic-rå2-billede (raw) - Panasonic raw2-Bild - Panasonic raw2 image - imagen en bruto raw2 de Panasonic - Panasonic raw2 -kuva - image raw2 Panasonic - imaxe en bruto raw2 de Panasonic - תמונת raw2 של Panasonic - Panasonic raw2 kép - Image Panasonic raw2 - Immagine raw2 Panasonic - Panasonic raw2 画像 - Panasonic raw2 суреті - 파나소닉 원본 이미지 2 - Panasonic raw2 jēlattēls - Panasonic raw2 image - Obraz raw2 Panasonic - Imagem raw2 da Panasonic - необработанное изображение Panasonic RAW 2 - Surový obrázok Panasonic raw2 - Slikovna datoteka Panasonic raw2 - Panasonic raw2-bild - Panasonic raw2 görüntüsü - зображення формату raw2 Panasonic - Panasonic raw2 图像 - Panasonic raw2 影像 - - - - - - - - - Pentax PEF raw image - صورة Pentax PEF خامة - Suvoraja vyjava Pentax PEF - Изображение — Pentax PEF raw - imatge en cru de Pentax PEF - Surový obrázek Pentax PEF - Pentax PEF-råbillede - Pentax-PEF-Rohbild - ανεπεξέργαστη εικόνα Pentax PEF - Pentax PEF raw image - imagen en bruto PEF de Pentax - Pentax PEF irudi gordina - Pentax-PEF-raakakuva - Pentax PEF rámynd - image brute PEF Pentax - amhíomhá Pentax PEF - imaxe en bruto PEF de Pentax - תמונה גולמית של Pentax PEF - Pentax PEF nyers kép - Citra mentah Pentax PEF - Immagine raw Pentax PEF - Pentax PEF raw 画像 - Pentax PEF өңделмеген суреті - 펜탁스 PEF 원본 이미지 - Pentax PEF neapdorotas paveikslėlis - Pentax PEF jēlattēls - Pentax PEF raw-bilde - onbewerkt Pentax PEF-beeld - Pentax PEF råbilete - Surowy obraz Pentax PEF - Imagem bruta PEF da Pentax - Imagine brută Pentax PEF - необработанное изображение Pentax PEF - Surový obrázok Pentax PEF - Surova slikovna datoteka Pentax PEF - Figurë raw Pentax PEF - Pentax PEF-råbild - цифровий негатив PEF Pentax - Ảnh thô Pentax PEF - Pentax PEF 原始图像 - Pentax PEF 原生影像 - PEF - Pentax Electronic Format - - - - - - Sigma X3F raw image - صورة Sigma X3F خامة - Suvoraja vyjava Sigma X3F - Изображение — Sigma X3F raw - imatge en cru de Sigma X3F - Surový obrázek Sigma X3F - Sigma X3F-råbillede - Sigma-X3F-Rohbild - ανεπεξέργαστη εικόνα Sigma X3F - Sigma X3F raw image - imagen en bruto X3F de Sigma - Sigma X3F irudi gordina - Sigma-X3F-raakakuva - Sigma X3F rámynd - image brute X3F Sigma - amhíomhá Sigma X3F - imaxe en bruto X3F de Sigma - תמונה גולמית של Sigma X3F - Sigma XF3 nyers kép - Citra mentah Sigma X3F - Immagine raw Sigma X3F - Sigma X3F raw 画像 - Sigma X3F өңделмеген суреті - 시그마 X3F 원본 이미지 - Sigma X3F neapdorotas paveikslėlis - Sigma X3F jēlattēls - Sigma X3F raw-bilde - onbewerkt Sigma X3F-beeld - Sigma X3F råbilete - Surowy obraz X3F Sigma - Imagem bruta X3F da Sigma - Imagine brută Sigma X3F - необработанное изображение Sigma X3F - Surový obrázok Sigma X3F - Surova slikovna datoteka Sigma X3F - Fifurë raw Sigma X3F - Sigma X3F-råbild - цифровий негатив X3F Sigma - Ảnh thô Sigma X3F - Sigma X3F 原始图像 - Sigma X3F 原生影像 - X3F - X3 Foveon - - - - - - - - - - - - Sony SRF raw image - صورة Sony SRF خامة - Suvoraja vyjava Sony SRF - Изображение — Sony SRF raw - imatge en cru de Sony SRF - Surový obrázek Sony SRF - Sony SRF-råbillede - Sony-SRF-Rohbild - ανεπεξέργαστη εικόνα Sony SRF - Sony SRF raw image - imagen en bruto SRF de Sony - Sony SRF irudi gordina - Sony-SRF-raakakuva - Sony SRF rámynd - image brute SRF Sony - amhíomhá Sony SRF - imaxe en bruto SRF de sony - תמונה גולמית של Sony SRF - Sony SRF nyers kép - Citra mentah Sony SRF - Immagine raw Sony SRF - Sony SRF raw 画像 - Sony SRF өңделмеген суреті - 소니 SRF 원본 이미지 - Sony SRF neapdorotas paveikslėlis - Sony SRF jēlattēls - Sony SRF raw-bilde - onbewerkt Sony SRF-beeld - Sony SRF råbilete - Surowy obraz SRF Sony - Imagem bruta SRF da Sony - Imagine brută Sony SRF - необработанное изображение Sony SRF - Surový obrázok Sony SRF - Surova slikovna datoteka Sony SRF - Figurë raw Sony SRF - Sony SRF-råbild - цифровий негатив SRF Sony - Ảnh thô Sony SRF - Sony SRF 原始映像 - Sony SRF 原生影像 - SRF - Sony Raw Format - - - - - - Sony SR2 raw image - صورة Sony SR2 خامة - Suvoraja vyjava Sony SR2 - Изображение — Sony SR2 raw - imatge en cru de Sony SR2 - Surový obrázek Sony SR2 - Sony SR2-råbillede - Sony-SR2-Rohbild - ανεπεξέργαστη εικόνα Sony SR2 - Sony SR2 raw image - imagen en bruto SR2 de Sony - Sony SR2 irudi gordina - Sony-SR2-raakakuva - Sony SR2 rámynd - image brute SR2 Sony - amhíomhá Sony SR2 - imaxe en bruto SR2 de sony - תמונה גולמית של Sony SR2 - Sony SR2 nyers kép - Citra mentah Sony SR2 - Immagine raw Sony SR2 - Sony SR2 raw 画像 - Sony SR2 өңделмеген суреті - 소니 SR2 원본 이미지 - Sony SR2 neapdorotas paveikslėlis - Sony SR2 jēlattēls - Sony SR2 raw-bilde - onbewerkt Sony SR2-beeld - Sony SR2 råbilete - Surowy obraz SR2 Sony - Imagem bruta SR2 da Sony - Imagine brută Sony SR2 - необработанное изображение Sony SR2 - Surový obrázok Sony SR2 - Surova slikovna datoteka Sony SR2 - Figurë raw Sony SR2 - Sony SR2-råbild - цифровий негатив SR2 Sony - Ảnh thô Sony SR2 - Sony SR2 原始映像 - Sony SR2 原生影像 - SR2 - Sony Raw format 2 - - - - - - Sony ARW raw image - صورة Sony ARW خامة - Suvoraja vyjava Sony ARW - Изображение — Sony ARW raw - imatge en cru de Sony ARW - Surový obrázek Sony ARW - Sony ARW-råbillede - Sony-ARW-Rohbild - ανεπεξέργαστη εικόνα Sony ARW - Sony ARW raw image - imagen en bruto ARW de Sony - Sony ARW irudi gordina - Sony-ARW-raakakuva - Sony ARW rámynd - image brute ARW Sony - amhíomhá Sony ARW - imaxe en bruto ARW de sony - תמונה גולמית של Sony ARW - Sony ARW nyers kép - Citra mentah Sony ARW - Immagine raw Sony ARW - Sony ARW raw 画像 - Sony ARW өңделмеген суреті - 소니 ARW 원본 이미지 - Sony ARW neapdorotas paveikslėlis - Sony ARW jēlattēls - Sony ARW raw-bilde - onbewerkt Sony ARW-beeld - Sony ARW råbilete - Surowy obraz ARW Sony - Imagem bruta ARW da Sony - Imagine brută Sony ARW - необработанное изображение Sony ARW - Surový obrázok Sony ARW - Surova slikovna datoteka Sony ARW - Figurë raw Sony ARW - Sony ARW-råbild - цифровий негатив ARW Sony - Ảnh thô Sony ARW - Sony ARW 原始映像 - Sony ARW 原生影像 - ARW - Alpha Raw format - - - - - - PNG image - صورة PNG - PNG rəsmi - Vyjava PNG - Изображение — PNG - imatge PNG - Obrázek PNG - Delwedd PNG - PNG-billede - PNG-Bild - εικόνα PNG - PNG image - PNG-bildo - imagen PNG - PNG irudia - PNG-kuva - PNG mynd - image PNG - íomhá PNG - imaxe PNG - תמונת PNG - PNG-kép - Citra PNG - Immagine PNG - PNG 画像 - PNG суреті - PNG 그림 - PNG paveikslėlis - PNG attēls - Imej PNG - PNG-bilde - PNG-afbeelding - PNG-bilete - Obraz PNG - imagem PNG - Imagem PNG - Imagine PNG - изображение PNG - Obrázok PNG - Slikovna datoteka PNG - Figurë PNG - PNG слика - PNG-bild - зображення PNG - Ảnh PNG - PNG 图像 - PNG 影像 - - - - - - - Apple optimised PNG image - - - - - - - - - Run Length Encoded bitmap image - تشغيل صورة نقطية طولية الترميز - Bitmapnaja vyjava, zakadavanaja ŭ Run Length - Изображение — RLE Bitmap - imatge de mapa de bits «Run Lenght Encoded» - Obrázek bitové mapy Run Length Encoded - Run Length Encoded-bitmapbillede - Lauflängenkodiertes Bitmap-Bild - Run Length Encoded bitmap image - mapa de bits con codificación del tamaño durante la ejecución - 'Run Lenght Encoded' bitmap irudia - RLE-koodattu bittikartta - image matricielle Run Length Encoded - íomhá mhapa giotáin Run Length Encoded - mapa de bits con codificación do tamaño durante a execución - מקודד מפת סיביות של Run Length - Run Length Encoded bitkép - Citra peta bit Run Length Encoded - Immagine bitmap RLE (Run Length Encoded) - ランレングス符号化ビットマップ画像 - RLE сығылған растрлік суреті - RLE 인코딩된 비트맵 그림 - Run Length Encoded rastrinis paveikslėlis - Secīgo atkārtojumu kodēts bitkartes attēls - Run Length Encoded bitmap bilde - RLE-gecodeerde bitmap-afbeelding - Run Length Encoded punktgrafikk - Obraz bitmapy RLE - Classe de comprimento imagem bitmap codificada - Imagine bitmap codată RLE - растровое изображение (сжатое RLE) - Bitmapový obrázok Run Length Encoded - Zaporedno kodirana bitna slika (RLE) - Figurë bitmap RLE (Run Length Encoded) - Körlängdskodad bitmappbild - растрове зображення RLE - Ảnh mảng mã hóa chiều dài chạy (RLE) - 游程编码位图 - Run Length Encoded 點陣影像 - - - - SVG image - صورة SVG - Vyjava SVG - Изображение — SVG - imatge SVG - Obrázek SVG - SVG-billede - SVG-Bild - εικόνα SVG - SVG image - SVG-bildo - imagen SVG - SVG irudia - SVG-kuva - SVG mynd - image SVG - íomhá SVG - imaxe SVG - תמונת SVG - SVG slika - SVG kép - Citra SVG - Immagine SVG - SVG 画像 - SVG суреті - SVG 그림 - SVG paveikslėlis - SVG attēls - SVG-bilde - SVG-afbeelding - SVG-bilete - Obraz SVG - Imagem SVG - Imagine SVG - изображение SVG - Obrázok SVG - Slikovna vektorska datoteka SVG - Figurë SVG - SVG-bild - SVG görüntüsü - зображення SVG - Ảnh SVG - SVG 图像 - SVG 影像 - SVG - Scalable Vector Graphics - - - - - - - - - - compressed SVG image - صورة SVG مضغوطة - skampresavanaja vyjava SVG - Изображение — SVG, компресирано - imatge SVG comprimida - Komprimovaný obrázek SVG - SVG-komprimeret billede - Komprimiertes SVG-Bild - συμπιεσμένη εικόνα SVG - compressed SVG image - imagen SVG comprimida - konprimitutako SVG irudia - pakattu SVG-kuva - stappað SVG mynd - image SVG compressée - íomhá SVG comhbhrúite - imaxe SVG comprimida - תמונת SVG מכוצת - komprimirana SVG slika - tömörített SVG kép - Citra SVG terkompresi - Immagine SVG compressa - 圧縮 SVG 画像 - сығылған SVG суреті - 압축된 SVG 그림 - suglaudintas SVG paveikslėlis - saspiests SVG attēls - komprimert SVG-bilde - ingepakte SVG-afbeelding - komprimert SVG-bilete - Skompresowany obraz SVG - Imagem compactada SVG - imagine comprimată SVG - сжатое изображение SVG - Komprimovaný obrázok SVG - Slikovna datoteka SVG (stisnjena) - Figurë SVG e kompresuar - komprimerad SVG-bild - стиснене зображення SVG - ảnh SVG đã nén - 压缩的 SVG 图像 - 壓縮版 SVG 影像 - SVG - Scalable Vector Graphics - - - - - TIFF image - صورة TIFF - Vyjava TIFF - Изображение — TIFF - imatge TIFF - Obrázek TIFF - TIFF-billede - TIFF-Bild - εικόνα TIFF - TIFF image - TIFF-bildo - imagen TIFF - TIFF irudia - TIFF-kuva - TIFF mynd - image TIFF - íomhá TIFF - imaxe TIFF - תמונת TIFF - TIFF slika - TIFF-kép - Citra TIFF - Immagine TIFF - TIFF 画像 - TIFF суреті - TIFF 그림 - TIFF paveikslėlis - TIFF attēls - Imej TIFF - TIFF-bilde - TIFF-afbeelding - TIFF-bilete - Obraz TIFF - imagem TIFF - Imagem TIFF - Imagine TIFF - изображение TIFF - Obrázok TIFF - Slikovna datoteka TIFF - Figurë TIFF - TIFF слика - TIFF-bild - зображення TIFF - Ảnh TIFF - TIFF 图像 - TIFF 影像 - TIFF - Tagged Image File Format - - - - - - - - - AutoCAD image - صورة AutoCAD - AutoCAD rəsmi - Vyjava AutoCAD - Изображение — AutoCAD - imatge d'AutoCAD - Obrázek AutoCAD - Delwedd AutoCAD - AutoCAD-billede - AutoCAD-Bild - εικόνα AutoCAD - AutoCAD image - AutoCAD-bildo - imagen de AutoCAD - AutoCAD-eko irudia - AutoCAD-kuva - AutoCAD mynd - image AutoCAD - íomhá AutoCAD - imaxe de AutoCAD - תמונה של AutoCAD - AutoCAD slika - AutoCAD-kép - Citra AutoCAD - Immagine AutoCAD - AutoCAD 画像 - AutoCAD-ის გამოსახულება - AutoCAD суреті - AutoCAD 그림 - AutoCAD paveikslėlis - AutoCAD attēls - Imej AutoCAD - AutoCAD-bilde - AutoCAD-afbeelding - AutoCAD-bilete - Obraz AutoCAD - imagem AutoCAD - Imagem do AutoCAD - Imagine AutoCAD - изображение AutoCAD - Obrázok AutoCAD - Slikovna datoteka AutoCAD - Figurë AutoCAD - AutoCAD слика - AutoCAD-bild - AutoCAD görüntüsü - зображення AutoCAD - Ảnh AutoCAD - AutoCAD 图像 - AutoCAD 影像 - - - - DXF vector image - صورة DXF نقطية - Vektarnaja vyjava DXF - Изображение — DXF - imatge vectorial DXF - Vektorový obrázek DXF - DXF-vektorbillede - DXF-Vektorbild - ανυσματική εικόνα DXF - DXF vector image - vektora DXF-bildo - imagen vectorial DXF - DXF bektore-grafikoa - DXF-vektorikuva - DXF vektormynd - image vectorielle DXF - íomhá veicteoir DXF - imaxe de vector DXF - תמונת DXF וקטורית - DXF vektorska slika - DXF-vektorkép - Citra vektor DXF - Immagine vettoriale DXF - DXF ベクター画像 - DXF ვექტორული გამოსახულება - DXF векторлық суреті - DXF 벡터 그림 - DXF vektorinis paveikslėlis - DXF vektora attēls - Imej vektor DXF - DXF-vektorgrafikk - DXF-vectorafbeelding - DXF-vektorgrafikk - Obraz wektorowy DXF - imagem de vectores DXF - Imagem vetorial DXF - Imagine vectorială DXF - векторное изображение DXF - Vektorový obrázok DXF - Slikovna vektorska datoteka DXF - Figurë vektoriale DFX - DXF векторска графика - DXF-vektorbild - векторне зображення DXF - Ảnh véc-tơ DXF - DXF 矢量图像 - DXF 向量圖 - - - - - - - - Microsoft Document Imaging format - صيغة مستند تصوير مايكروسوفت - Изображение — Microsoft Document Imaging - format Microsoft Document Imaging - Formát Microsoft Document Imaging - Microsofts dokumentbilledformat - Microsoft-Document-Imaging-Bildformat - μορφή Microsoft Document Imaging - Microsoft Document Imaging format - formato de imagen de Microsoft Document - Microsoft Document Imaging formatua - Microsoft Document Imaging -muoto - Microsoft Document Imaging snið - format Document Imaging Microsoft - formáid Microsoft Document Imaging - formato de Microsoft Document Imaging - פורמט של Microsoft Document Imaging - Microsoft Document Imaging formátum - Format Microsoft Document Imaging - Formato MDI (Microsoft Document Imaging) - Microsoft ドキュメントイメージフォーマット - Microsoft Document Imaging пішімі - 마이크로소프트 문서 이미지 형식 - Microsoft Document Imaging formatas - Microsoft dokumentu attēlošanas formāts - Microsoft Document Imaging - Format Microsoft Document Imaging - Formato do Microsoft Document Imaging - Format Microsoft Document Imaging - формат Microsoft Document Imaging - Formát Microsoft Document Imaging - Zapis Microsoft Document Imaging - Microsoft Document Imaging-format - формат Microsoft Document Imaging - Định dạng tạo ảnh tài liệu Microsoft - Microsoft Document Imaging 扫描图像 - 微軟文件影像格式 - MDI - Microsoft Document Imaging - - - - - - - 3D Studio image - صورة استديو ثلاثية الأبعاد - 3D Studio rəsmi - Vyjava 3D Studio - Изображение — 3D Studio - imatge de 3D Studio - Obrázek 3D Studio - Delwedd "3D Studio" - 3D Studio-billede - 3D-Studio-Bild - εικόνα 3D Studio - 3D Studio image - bildo de 3D Studio - imagen de 3D Studio - 3D Studio-ko irudia - 3D Studio -kuva - 3D Studio mynd - image 3D Studio - íomhá 3D Studio - imaxe de 3D Studio - תמונת 3D Studio - 3D Studio slika - 3D Studio-kép - Citra 3D Studio - Immagine 3D Studio - 3D Studio 画像 - 3D Studio-ის გამოსახულება - 3D Studio суреті - 3D Studio 그림 - 3D Studio paveikslėlis - 3D Studio attēls - Imej 3D Studio - 3D Studio-bilde - 3D-Studio-afbeelding - 3D Studio-bilete - Obraz 3D Studio - imagem 3D Studio - Imagem do 3D Studio - Imagine 3D Studio - сцена 3D Studio - Obrázok 3D Studio - Slikovna datoteka 3D Studio - Figurë 3D Studio - 3D Studio слика - 3D Studio-bild - 3D Studio görüntüsü - зображення 3D Studio - Ảnh xuởng vẽ 3D - 3D Studio 图像 - 3D Studio 影像 - - - - Applix Graphics image - صورة رسوميات Applix - Vyjava Applix Graphics - Изображение — Applix Graphics - imatge d'Applix Graphics - Obrázek Applix Graphics - Applix Graphics-billede - Applix-Graphics-Bild - εικόνα Applix Graphics - Applix Graphics image - bildo de Applix Graphics - imagen de Applix Graphics - Applix Graphics irudia - Applix Graphics -kuva - Applix Graphics mynd - image Applix Graphics - íomhá Applix Graphics - imaxe de Applix Graphics - תמונה של Applix Graphics - Applix Graphics slika - Applix Graphics-kép - Citra Applix Graphics - Immagine Applix Graphics - Applix Graphics 画像 - Applix Graphics-ის გამოსახულება - Applix Graphics суреті - Applix Graphics 그림 - Applix Graphics paveikslėlis - Applix Graphics attēls - Imej Applix Graphics - Applix Graphics-dokument - Applix Graphics-afbeelding - Applix Graphics-dokument - Obraz Applix Graphics - imagem Applix Graphics - Imagem do Applix Graphics - Imagine Applix Graphics - изображение Applix Graphics - Obrázok Applix Graphics - Slikovna datoteka Applix Graphics - Figurë Applix Graphics - Applix графички документ - Applix Graphics-bild - зображення Applix Graphics - Ảnh Applix Graphics - Applix Graphics 图像 - Applix Graphics 影像 - - - - - - - - - EPS image (bzip-compressed) - صورة EPS (مضغوط-bzip) - Vyjava EPS (bzip-skampresavanaja) - Изображение — EPS, компресирано с bzip - imatge EPS (comprimida amb bzip) - Obrázek EPS (komprimovaný pomocí bzip) - EPS-billede (bzip-komprimeret) - EPS-Bild (bzip-komprimiert) - EPS image (bzip-compressed) - imagen EPS (comprimida con bzip) - EPS irudia (bzip-ekin konprimitua) - EPS-kuva (bzip-pakattu) - EPS mynd (bzip-stappað) - image EPS (compressée bzip) - íomhá EPS (comhbhrúite le bzip) - imaxe EPS (comprimida con bzip) - תמונת EPS (מכווץ בbzip) - EPS slika (komprimirana bzip-om) - EPS kép (bzip-tömörítésű) - Citra EPS (terkompresi bzip) - Immagine EPS (compressa con bzip) - EPS 画像 (bzip 圧縮) - EPS გამოსახულება (bzip-ით შეკუმშული) - EPS суреті (bzip-пен сығылған) - EPS 그림 (BZIP 압축) - EPS paveikslėlis (suglaudintas su bzip) - EPS attēls (saspiests ar bzip) - EPS-bilde (bzip-komprimert) - EPS-afbeelding (ingepakt met bzip) - EPS-bilete (pakka med bzip) - Obraz EPS (kompresja bzip) - Imagem EPS (compactada com bzip) - Imagine EPS (compresie bzip) - изображение EPS (сжатое bzip) - Obrázok EPS (komprimovaný pomocou bzip) - Slikovna datoteka EPS (stisnjena z bzip) - Figurë EPS (e kompresuar me bzip) - EPS-bild (bzip-komprimerad) - EPS görüntüsü (bzip ile sıkıştırılmış) - зображення EPS (стиснене bzip) - Ảnh EPS (đã nén bzip) - EPS 图像(bzip 压缩) - EPS 影像 (bzip 格式壓縮) - - - - - - - CMU raster image - صورة CMU نقطية - CMU raster rəsmi - Rastravaja vyjava CMU - Изображение — CMU raster - imatge ràster CMU - Rastrový obrázek CMU - Delwedd raster CMU - CMU-rasterbillede - CMU-Rasterbild - εικόνα ράστερ CMU - CMU raster image - rastruma bildo de CMU - imagen ráster CMU - CMU bilbe-irudia - CMU-rasterikuva - CMU raster mynd - image raster CMU - íomhá rastar CMU - imaxe raster CMU - תמונת סריקה CMU - CMU-raszterkép - Citra raster CMU - Immagine raster CMU - CMU ラスター画像 - CMU-ის რასტრული გამოსახულება - CMU растрлық суреті - CMU 래스터 그림 - CMU rastrinis paveikslėlis - CMU rastra attēls - Imej raster CMU - CMU-rasterbilde - CMU-rasterafbeelding - CMU rasterbilete - Obraz rastrowy CMU - imagem rasterizada CMU - Imagem raster CMU - Imagine raster CMU - растровое изображение CMU - Rastrový obrázok CMU - Slikovna rastrska datoteka CMU - Figurë raster CMU - CMU растерска слика - CMU-rasterbild - растрове зображення CMU - Ảnh mành CMU - CMU 矢量图像 - CMU raster 影像 - - - - compressed GIMP image - صورة GIMP مضغوطة - skampresavanaja vyjava GIMP - Изображение — GIMP, компресирано - imatge GIMP comprimida - Komprimovaný obrázek GIMP - komprimeret GIMP-billede - Komprimiertes GIMP-Bild - συμπιεσμένη εικόνα GIMP - compressed GIMP image - imagen GIMP comprimida - konprimitutako GIMP irudia - pakattu GIMP-kuva - stappað GIMP mynd - image GIMP compressée - íomhá GIMP comhbhrúite - imaxe de GIMP comprimida - תמונת GIMP מכווצת - tömörített GIMP kép - Citra GIMP terkompresi - Immagine GIMP compressa - 圧縮 GIMP 画像 - сығылған GIMP суреті - 압축된 GIMP 그림 - suglaudintas GIMP paveikslėlis - saspiests GIMP attēls - komprimert GIMP-bilde - ingepakte GIMP-afbeelding - komprimert GIMP-bilete - Skompresowany obraz GIMP - Imagem compactada do GIMP - imagine comprimată GIMP - сжатое изображение GIMP - Komprimovaný obrázok GIMP - Slikovna datoteka GIMP (stisnjena) - Figurë GIMP e kompresuar - komprimerad GIMP-bild - стиснене зображення GIMP - ảnh GIMP đã nén - 压缩的 GIMP 图像 - 壓縮版 GIMP 影像 - - - - - DICOM image - صورة DICOM - Vyjava DICOM - Изображение — DICOM - imatge DICOM - Obrázek DICOM - DICOM-billede - DICOM-Bild - εικόνα DICOM - DICOM image - DICOM-bildo - imagen DICOM - DICOM irudia - DICOM-kuva - DICOM mynd - image DICOM - íomhá DICOM - imaxe DICOM - תמונת DICOM - DICOM slika - DICOM kép - Citra DICOM - Immagine DICOM - DICOM 画像 - DICOM გამოსახულება - DICOM суреті - DICOM 그림 - DICOM paveikslėlis - DICOM attēls - DICOM-bilde - DICOM-afbeelding - DICOM-bilete - Obraz DICOM - Imagem DICOM - Imagine DICOM - изображение DICOM - Obrázok DICOM - Slikovna datoteka DICOM - Figurë DICOM - DICOM-bild - DICOM görüntüsü - зображення DICOM - Ảnh DICOM - DICOM 图像 - DICOM 影像 - DICOM - Digital Imaging and Communications in Medicine - - - - - - - - - DocBook document - مستند DocBook - Dakument DocBook - Документ — DocBook - document DocBook - Dokument DocBook - DocBook-dokument - DocBook-Dokument - έγγραφο DocBook - DocBook document - DocBook-dokumento - documento DocBook - DocBook dokumentua - DocBook-asiakirja - DocBook skjal - document DocBook - cáipéis DocBook - documento de DocBook - מסמך DocBook - DocBook dokument - DocBook dokumentum - Dokumen DocBook - Documento DocBook - DocBook ドキュメント - DocBook-ის დოკუმენტი - DocBook құжаты - DocBook 문서 - DocBook dokumentas - DocBook dokuments - DocBook-dokument - DocBook-document - DocBook-dokument - Dokument DocBook - Documento DocBook - Document DocBook - документ DocBook - Dokument DocBook - Dokument DocBook - Dokument DocBook - DocBook-dokument - DocBook belgesi - документ DocBook - Tài liệu DocBook - DocBook 文档 - DocBook 文件 - - - - - - - - - - - - - - DIB image - صورة DIB - Vyjava DIB - Изображение — DIB - imatge DIB - Obrázek DIB - DIB-billede - DIB-Bild - εικόνα DIB - DIB image - DIB-bildo - imagen DIB - DIB irudia - DIB-kuva - DIB mynd - image DIB - íomhá DIB - imaxe DIB - תמונת DIB - DIB slika - DIB kép - Citra DIB - Immagine DIB - DIB 画像 - DIB გამოსახულება - DIB суреті - DIB 그림 - DIB paveikslėlis - DIB attēls - DIB-bilde - DIB-afbeelding - DIB-bilete - Obraz DIB - Imagem DIB - Imagine DIB - изображение DIB - Obrázok DIB - Slikovna datoteka DIB - Figurë DIB - DIB-bild - DIB görüntüsü - зображення DIB - Ảnh DIB - DIB 图像 - DIB 影像 - DIB - Device Independent Bitmap - - - - - - DjVu image - صورة DjVu - Vyjava DjVu - Изображение — DjVu - imatge DjVu - Obrázek DjVu - DjVu-billede - DjVu-Bild - εικόνα DjVu - DjVu image - DjVu-bildo - imagen DjVu - DjVU-ko irudia - DjVu-kuva - DjVu mynd - image DjVu - íomhá DjVu - imaxe de DjVu - תמונת DjVu - DjVu slika - DjVu-kép - Citra DjVu - Immagine DjVu - DjVu 画像 - DjVu გამოსახულება - DjVu суреті - DjVu 그림 - DjVu paveikslėlis - DjVu attēls - Imej DjVu - DjVu-bilde - DjVu-afbeelding - DjVu-bilete - Obraz DjVu - imagem DjVu - Imagem DjVu - Imagine DjVu - изображение DjVu - Obrázok DjVu - Slikovna datoteka DjVu - Figurë DjVu - DjVu слика - DjVu-bild - DjVu görüntüsü - зображення DjVu - Ảnh DjVu - DjVu 图像 - DjVu 影像 - - - - - - - - - - - - - - - - - DPX image - صورة DPX - Vyjava DPX - Изображение — DPX - imatge DPX - Obrázek DPX - DPX-billede - DPX-Bild - εικόνα DPX - DPX image - DPX-bildo - imagen DPX - DPX irudia - DPX-kuva - DPX mynd - image DPX - íomhá DPX - imaxe DPX - תמונת DPX - DPX slika - DPX kép - Citra DPX - Immagine DPX - DPX 画像 - DPX გამოსახულება - DPX суреті - DPX 그림 - DPX paveikslėlis - DPX attēls - DPX-bilde - DPX-afbeelding - DPX-bilete - Obraz DPX - Imagem DPX - Imagine DPX - изображение DPX - Obrázok DPX - Slikovna datoteka DPX - Figurë DPX - DPX-bild - DPX görüntüsü - зображення DPX - Ảnh DPX - DPX 图像 - DPX 影像 - DPX - Digital Moving Picture Exchange - - - - - - EPS image - صورة EPS - Vyjava EPS - Изображение — EPS - imatge EPS - Obrázek EPS - EPS-billede - EPS-Bild - εικόνα EPS - EPS image - EPS-bildo - imagen EPS - EPS irudia - EPS-kuva - EPS mynd - image EPS - íomhá EPS - imaxe EPS - תמונת EPS - EPS slika - EPS kép - Citra EPS - Immagine EPS - EPS 画像 - EPS გამოსახულება - EPS суреті - EPS 그림 - EPS paveikslėlis - EPS attēls - EPS-bilde - EPS-afbeelding - EPS-bilete - Obraz EPS - Imagem EPS - Imagine EPS - изображение EPS - Obrázok EPS - Slikovna datoteka EPS - Figurë EPS - EPS-bild - EPS görüntüsü - зображення EPS - Ảnh EPS - EPS 图像 - EPS 影像 - EPS - Encapsulated PostScript - - - - - - - - - - - - - - - - FITS document - مستند FITS - Dakument FITS - Документ — FITS - document FITS - Dokument FITS - FITS-dokument - FITS-Dokument - έγγραφο FITS - FITS document - FITS-dokumento - documento FITS - FITS dokumentua - FITS-asiakirja - FITS skjal - document FITS - cáipéis FITS - documento FICT - מסמך FITS - FITS dokument - FITS dokumentum - Dokumen FITS - Documento FITS - FITS ドキュメント - FITS დოკუმენტი - FITS құжаты - FITS 문서 - FITS dokumentas - FITS dokuments - FITS-dokument - FITS-document - FITS-dokument - Dokument FITS - Documento FITS - Document FITS - документ FITS - Dokument FITS - Dokument FITS - Dokument FITS - FITS-dokument - документ FITS - Tài liệu FITS - FITS 文档 - FITS 文件 - FITS - Flexible Image Transport System - - - - - - - - FPX image - صورة FPX - Vyjava FPX - Изображение — FPX - imatge FPX - Obrázek FPX - FPX-billede - FPX-Bild - εικόνα FPX - FPX image - FPX-bildo - imagen FPX - FPX irudia - FPX-kuva - FPX mynd - image FPX - íomhá FPX - imaxe FPX - תמונת FPX - FPX slika - FPX kép - Citra FPX - Immagine FPX - FPX 画像 - FPX გამოსახულება - FPX суреті - FPX 그림 - FPX paveikslėlis - FPX attēls - FPX-bilde - FPX-afbeelding - FPX-bilete - Obraz FPX - Imagem FPX - Imagine FPX - изображение FPX - Obrázok FPX - Slikovna datoteka FPX - Figurë FPX - FPX-bild - FPX görüntüsü - зображення FPX - Ảnh FPX - FPX 图像 - FPX 影像 - FPX - FlashPiX - - - - - - EPS image (gzip-compressed) - صورة EPS (مضغوط-gzip) - Vyjava EPS (gzip-skampresavanaja) - Изображение — EPS, компресирано с gzip - imatge EPS (comprimida amb gzip) - Obrázek EPS (komprimovaný pomocí gzip) - EPS-billede (gzip-komprimeret) - EPS-Bild (gzip-komprimiert) - EPS image (gzip-compressed) - imagen EPS (comprimida con gzip) - EPS irudia (gzip-ekin konprimitua) - EPS-kuva (gzip-pakattu) - EPS mynd (gzip-stappað) - image EPS (compressée gzip) - íomhá EPS (comhbhrúite le gzip) - imaxe EPS (comprimida con gzip) - תמונת EPS (מכווץ בgzip) - EPS slika (komprimirana gzip-om) - EPS kép (gzip-tömörítésű) - Citra EPS (terkompresi gzip) - Immagine EPS (compressa con gzip) - EPS 画像 (gzip 圧縮) - EPS გამოსახულება (gzip-ით შეკუმშული) - EPS суреті (gzip-пен сығылған) - EPS 그림 (GZIP 압축) - EPS paveikslėlis (suglaudintas su gzip) - EPS attēls (saspiests ar gzip) - EPS-bilde (gzip-komprimert) - EPS-afbeelding (ingepakt met gzip) - EPS-bilete (pakka med gzip) - Obraz EPS (kompresja gzip) - Imagem EPS (compactada com gzip) - Imagine EPS (compresie gzip) - изображение EPS (сжатое gzip) - Obrázok EPS (komprimovaný pomocou gzip) - Slikovna datoteka EPS (stisnjena z gzip) - Figurë EPS (e kompresuar me gzip) - EPS-bild (gzip-komprimerad) - EPS görüntüsü (gzip ile sıkıştırılmış) - зображення EPS (стиснене gzip) - Ảnh EPS (đã nén gzip) - EPS 图像(gzip 压缩) - EPS 影像 (gzip 格式壓縮) - - - - - - - Microsoft icon - أيقونة مايكروسوفت - Икона — Microsoft - icona de Microsoft - Ikona Microsoft - Microsoftikon - Microsoft-Symbol - εικονίδιο Microsoft - Microsoft icon - Microsoft-piktogramo - icono de Microsoft - Microsoft ikonoa - Microsoft-kuvake - Microsoft ímynd - icône Microsoft - deilbhín Microsoft - Icona de microsoft - אייקון של Microsofr - Microsoft ikona - Microsoft ikon - Ikon Microsoft - Icona Microsoft - Microsoft アイコン - Microsoft-ის ხატულა - Microsoft таңбашасы - 마이크로소프트 아이콘 - Microsoft piktograma - Microsoft ikona - Microsoft pictogram - Ikona Microsoft - Ícone da Microsoft - Iconiță Microsoft - значок Microsoft - Ikona Microsoft - Datoteka ikone Microsoft Windows - Microsoft-ikon - піктограма Microsoft - Biểu tượng Microsoft - Microsoft 图标 - 微軟圖示 - - - - - - - - - - - - - - - MacOS X icon - أيقونة MacOS X - Ikona MacOS X - Икона — MacOS X - icona MacOS X - Ikona MacOS X - MacOS X-ikon - MacOS-X-Symbol - εικονίδιο MacOS X - MacOS X icon - MacOS-X-piktogramo - icono de MacOS X - MacOS X ikonoa - MacOS X -kuvake - MacOS X ímynd - icône MacOS X - deilbhín MacOS X - Icona de MacOS X - אייקון של MacOS X - MacOS X ikona - MacOS X ikon - Ikon MacOS X - Icona MacOS X - MacOS X アイコン - MacOS X-ის ხატულა - MacOS X таңбашасы - MacOS X 아이콘 - MacOS X piktograma - MacOS X ikona - MacOS X-ikon - MacOS-X-pictogram - MacOS X-ikon - Ikona Mac OS X - Ícone do MacOS X - Iconiță MacOS X - значок MacOS X - Ikona MacOS X - Datoteka ikone MacOS X - Ikonë MacOS X - MacOS X-ikon - піктограма MacOS X - Biểu tượng MacOS X - MacOS X 图标 - MacOS X 圖示 - - - - - - - ILBM image - صورة ILBM - ILBM rəsmi - Vyjava ILBM - Изображение — ILBM - imatge ILBM - Obrázek ILMB - Delwedd ILBM - ILBM-billede - ILBM-Bild - εικόνα ILBM - ILBM image - ILBM-bildo - imagen ILBM - ILBM irudia - ILBM-kuva - ILBM mynd - image ILBM - íomhá ILBM - imaxe ILBM - תמונת ILBM - ILBM slika - ILBM-kép - Citra ILBM - Immagine ILBM - ILBM 画像 - ILBM суреті - ILBM 그림 - ILBM paveikslėlis - ILBM attēls - Imej ILBM - ILBM-bilde - ILBM-afbeelding - ILMB-bilete - Obraz ILBM - imagem ILBM - Imagem ILBM - Imagine ILBM - изображение ILBM - Obrázok ILMB - Slikovna datoteka ILBM - Figurë ILBM - ILBM слика - ILBM-bild - зображення ILBM - Ảnh ILBM - ILBM 图像 - ILBM 影像 - ILBM - InterLeaved BitMap - - - - - - - - - - - - JNG image - صورة JNG - JNG rəsmi - Vyjava JNG - Изображение — JNG - imatge JNG - Obrázek JNG - Delwedd JNG - JNG-billede - JNG-Bild - εικόνα JNG - JNG image - JNG-bildo - imagen JNG - JNG irudia - JNG-kuva - JNG mynd - image JNG - íomhá JNG - imaxe JNG - תמונת JNG - JNG slika - JNG-kép - Citra JNG - Immagine JNG - JNG 画像 - JNG суреті - JNG 그림 - JNG paveikslėlis - JNG attēls - Imej PNG - JNG-bilde - JNG-afbeelding - JNG-bilete - Obraz JNG - imagem JNG - Imagem JNG - Imagine JNG - изображение JNG - Obrázok JNG - Slikovna datoteka JNG - Figurë JNG - JNG слика - JNG-bild - JNG görüntüsü - зображення JNG - Ảnh JNG - JNG 图像 - JNG 影像 - JNG - JPEG Network Graphics - - - - LightWave object - كائن LightWave - LightWave cismi - Abjekt LightWave - Обект — LightWave - objecte de LightWave - Objekt LightWave - Gwrthrych LightWave - LightWave-objekt - LightWave-Objekt - αντικείμενο LightWave - LightWave object - LightWave-objekto - objeto LightWave - LightWave objektua - LightWave-esine - LightWave lutur - objet LightWave - réad LightWave - obxecto de LightWave - עצם LightWave - LightWave objekt - LightWave-objektum - Proyek LightWave - Oggetto LightWave - LightWave オブジェクト - LightWave объекті - LightWave 개체 - LightWave objektas - LightWave objekts - Objek LightWave - LightWave-objekt - LightWave-object - LightWave-objekt - Obiekt LightWave - Objecto LightWave - Objeto LightWave - Obiect LightWave - объект LightWave - Objekt LightWave - Datoteka predmeta LightWave - Objekt LightWave - LightWave објекат - LightWave-objekt - LightWave nesnesi - об'єкт LightWave - Đối tượng LightWave - LightWave 对象 - LightWave 物件 - - - - - LightWave scene - مشهد LightWave - LightWave səhnəsi - Scena LightWave - Сцена — LightWave - escena de LightWave - Scéna LightWave - Golygfa LightWave - LightWave-scene - LightWave-Szene - σκηνή LightWave - LightWave scene - LightWave-sceno - escena LightWave - LightWave eszena - LightWave-maisema - LightWave leikmynd - scène LightWave - radharc LightWave - escena de LightWave - סצנה של LightWave - LightWave scena - LightWave-jelenet - Scene LightWave - Scena LightWave - LightWave シーン - LightWave сахнасы - LightWave 장면 - LightWave scena - LightWave aina - Babak LightWave - LightWave-scene - LightWave-scène - LightWave-scene - Scena Lightwave - cenário LightWave - Cena LightWave - Scenă LightWave - сцена LightWave - Scéna LightWave - Datoteka scene LightWave - Skenë LightWave - LightWave сцена - LightWave-scen - сцена LightWave - Cảnh LightWave - LightWave 场景 - LightWave 場景 - - - - MacPaint Bitmap image - صورة MacPaint Bitmap - Bitmapnaja vyjava MacPaint - Изображение — MacPaint Bitmap - imatge de mapa de bits MacPaint - Obrázek MacPaint Bitmap - MacPaint BitMap-billede - MacPaint-Bitmap-Datei - εικόνα Bitmap MacPaint - MacPaint Bitmap image - imagen en mapa de bits de MacPaint - MacPaint Bitmap irudia - MacPaint-bittikartta - MacPaint Bitmap mynd - image matricielle MacPaint - íomhá MacPaint Bitmap - imaxe de mapa de bits MacPaint - תמונת מפת-סיביות של MacPaint - MacPaint bitkép - Citra MacPaint Bitmap - Immagine Bitmap MacPaint - MacPaint ビットマップ画像 - MacPaint растрлық суреті - MacPaint 비트맵 그림 - MacPaint rastrinis paveikslėlis - MacPaint bitkartes attēls - MacPaint Bitmap-bilde - MacPaint-bitmap-afbeelding - MacPaint punktbilete - Obraz bitmapowy MacPaint - Imagem de bitmap do MacPaint - Imagine MacPaint Bitmap - растровое изображение MacPaint - Obrázok MacPaint Bitmap - Slikovna bitna datoteka MacPaint - Figurë BitMap MacPaint - MacPaint Bitmap-bild - растрове зображення MacPaint - Ảnh mảng MacPaint - MacPaint 位图 - MacPaint 點陣影像 - - - - Office drawing - تصميم أوفيس - Ofisny rysunak - Чертеж — Office - dibuix d'Office - Kresba Office - Officetegning - Office-Zeichnung - σχέδιο Office - Office drawing - dibujo de Office - Office marrazkia - Office-piirros - Office tekning - dessin Office - líníocht Office - debuxo de Office - ציור של Office - Office rajz - Gambar Office - Disegno Office - Office ドロー - Office суреті - 오피스 드로잉 - Office piešinys - Office zīmējums - Office-tegning - Office-tekening - Office-teikning - Rysunek Office - Desenho do Office - Desen Office - изображение Office - Kresba Office - Datoteka risbe Office - Vizatim Office - Office-teckning - малюнок Office - Bản vẽ Office - Microsoft Office 绘图 - Office 繪圖 - - - - NIFF image - صورة NIFF - Vyjava NIFF - Изображение — NIFF - imatge NIFF - Obrázek NIFF - NIFF-billede - NIFF-Bild - εικόνα NIFF - NIFF image - NIFF-bildo - imagen NIFF - NIFF irudia - NIFF-kuva - NIFF mynd - image NIFF - íomhá NIFF - imaxe NIFF - תמונת NIFF - NIFF slika - NIFF kép - Citra NIFF - Immagine NIFF - NIFF 画像 - NIFF суреті - NIFF 그림 - NIFF paveikslėlis - NIFF attēls - NIFF-bilde - NIFF-afbeelding - NIFF-bilete - Obraz NIFF - Imagem NIFF - Imagine NIF - изображение NIFF - Obrázok NIFF - Slikovna datoteka NIFF - Figurë NIFF - NIFF-bild - NIFF görüntüsü - зображення NIFF - Ảnh NIFF - NIFF 图像 - NIFF 影像 - - - - - - PCX image - صورة PCX - Vyjava PCX - Изображение — PCX - imatge PCX - Obrázek PCX - PCX-billede - PCX-Bild - εικόνα PCX - PCX image - PCX-bildo - imagen PCX - PCX irudia - PCX-kuva - PCX mynd - image PCX - íomhá PCX - imaxe PCX - תמונת PCX - PCX kép - Citra PCX - Immagine PCX - PCX 画像 - PCX суреті - PCX 그림 - PCX paveikslėlis - PCX attēls - PCX-bilde - PCX-afbeelding - PCX-bilete - Obraz PCX - Imagem PCX - Imagine PCX - изображение PCX - Obrázok PCX - Slikovna datoteka PCX - Figurë PCX - PCX-bild - PCX görüntüsü - зображення PCX - Ảnh PCX - PCX 图像 - PCX 影像 - PCX - PiCture eXchange - - - - - - - - - - - - PCD image - صورة PCD - Vyjava PCD - Изображение — PCD - imatge PCD - Obrázek PCD - PCD-billede - PCD-Bild - εικόνα PCD - PCD image - PCD-bildo - imagen PCD - PCD irudia - PCD-kuva - PCD mynd - image PCD - íomhá PCD - imaxe PCD - תמונת PCD - PCD kép - Citra PCD - Immagine PCD - PCD 画像 - PCD გამოსახულება - PCD суреті - PCD 그림 - PCD paveikslėlis - PCD attēls - PCD-bilde - PCD-afbeelding - PCD-bilete - Obraz PCD - Imagem PCD - Imagine PCD - изображение PCD - Obrázok PCD - Slikovna datoteka PCD - Figurë PCD - PCD-bild - PCD görüntüsü - зображення PCD - Ảnh PCD - PCD 图像 - PCD 影像 - PCD - PhotoCD - - - - PNM image - صورة PNM - PNM rəsmi - Vyjava PNM - Изображение — PNM - imatge PNM - Obrázek PNM - Delwedd PNM - PNM-billede - PNM-Bild - εικόνα PNM - PNM image - PNM-bildo - imagen PNM - PNM irudia - PNM-kuva - PNM mynd - image PNM - íomhá PNM - imaxe PNM - תמונת PNM - PNM-kép - Citra PNM - Immagine PNM - PNM 画像 - PNM суреті - PNM 그림 - PNM paveikslėlis - PNM attēls - Imej PNM - PNM-bilde - PNM-afbeelding - PNM-bilete - Obraz PNM - imagem PNM - Imagem PNM - Imagine PNM - изображение PNM - Obrázok PNM - Slikovna datoteka PNM - Figurë PNM - PNM слика - PNM-bild - PNM görüntüsü - зображення PNM - Ảnh PNM - PNM 图像 - PNM 影像 - - - - PBM image - صورة PBM - Vyjava PBM - Изображение — PBM - imatge PBM - Obrázek PBM - Delwedd PBM - PBM-billede - PBM-Bild - εικόνα PBM - PBM image - PBM-bildo - imagen PBM - PBM irudia - PBM-kuva - PBM mynd - image PBM - íomhá PBM - imaxe PBM - תמונת PBM - PBM kép - Citra PBM - Immagine PBM - PBM 画像 - PBM გამოსახულება - PBM суреті - PBM 그림 - PBM paveikslėlis - PBM attēls - PBM-bilde - PBM-afbeelding - PBM-bilete - Obraz PBM - Imagem PBM - Imagine PBM - изображение PBM - Obrázok PBM - Slikovna datoteka PBM - Figurë PBM - PBM слика - PBM-bild - PBM görüntüsü - зображення PBM - Ảnh PBM - PBM 图像 - PBM 影像 - PBM - Portable BitMap - - - - - - - - - - - - - - - - - - - PGM image - صورة PGM - Vyjava PGM - Изображение — PGM - imatge PGM - Obrázek PGM - Delwedd PGM - PGM-billede - PGM-Bild - εικόνα PGM - PGM image - PGM-bildo - imagen PGM - PGM irudia - PGM-kuva - PGM mynd - image PGM - íomhá PGM - imaxe PGM - תמונת PGM - PGM kép - Citra PGM - Immagine PGM - PGM 画像 - PGM суреті - PGM 그림 - PGM paveikslėlis - PGM attēls - PGM-bilde - PGM-afbeelding - PGM-bilete - Obraz PGM - Imagem PGM - Imagine PGM - изображение PGM - Obrázok PGM - Slikovna datoteka PGM - Figurë PGM - PGM-bild - PGM görüntüsü - зображення PGM - Ảnh PGM - PGM 图像 - PGM 影像 - PGM - Portable GrayMap - - - - - - - - - - - - - - - - - - - PPM image - صورة PPM - Vyjava PPM - Изображение — PPM - imatge PPM - Obrázek PPM - Delwedd PPM - PPM-billede - PPM-Bild - εικόνα PPM - PPM image - PPM-bildo - imagen PPM - PPM irudia - PPM-kuva - PPM mynd - image PPM - íomhá PPM - imaxe PPM - תמונת PPM - PPM kép - Citra PPM - Immagine PPM - PPM 画像 - PPM суреті - PPM 그림 - PPM paveikslėlis - PPM attēls - PPM-bilde - PPM-afbeelding - PPM-bilete - Obraz PPM - Imagem PPM - Imagine PPM - изображение PPM - Obrázok PPM - Slikovna datoteka PPM - Figurë PPM - PPM слика - PPM-bild - PPM görüntüsü - зображення PPM - Ảnh PPM - PPM 图像 - PPM 影像 - PPM - Portable PixMap - - - - - - - - - - - - - - - - - - - Photoshop image - صورة فوتوشوب - Изображение — Photoshop - imatge de Photoshop - Obrázek Photoshop - Photoshop-billede - Photoshop-Bild - εικόνα Photoshop - Photoshop image - Photoshop-bildo - imagen de Photoshop - Photoshop irudia - Photoshop-kuva - Photoshop mynd - image Photoshop - íomhá Photoshop - imaxe de Photoshop - תמונת Photoshop - Photoshop-kép - Citra Photoshop - Immagine Photoshop - Photoshop 画像 - изображение Photoshop - 포토샵 이미지 - Photoshop paveikslėlis - Photoshop attēls - Imej Photoshop - Photoshop-afbeelding - Obraz Photoshop - imagem do Photoshop - Imagem do Photoshop - Imagine Photoshop - изображение Photoshop - Obrázok Photoshop - Slikovna datoteka Photoshop - Фотошоп слика - Photoshop-bild - Photoshop görüntüsü - зображення Photoshop - Ảnh Photoshop - Photoshop 图像 - Photoshop 影像 - - - - - - - - - - - - - RGB image - صورة RGB - RGB rəsmi - Vyjava RGB - Изображение — RGB - imatge RGB - Obrázek RGB - Delwedd RGB - RGB-billede - RGB-Bild - εικόνα RGB - RGB image - RGB-bildo - imagen RGB - RGB irudia - RGB-kuva - RGB mynd - image RGB - íomhá RGB - imaxe RGB - תמונת RGB - RGB slika - RGB-kép - Citra RGB - Immagine RGB - RGB 画像 - RGB суреті - RGB 그림 - RGB paveikslėlis - RGB attēls - Imej RGB - RGB-bilde - RGB-afbeelding - RGB-bilete - Obraz RGB - imagem RGB - Imagem RGB - Imagine RGB - изображение RGB - Obrázok RGB - Slikovna datoteka RGB - Figurë RGB - RGB слика - RGB-bild - зображення RGB - Ảnh kiểu RGB - RGB 图像 - RGB 影像 - - - - SGI image - صورة SGI - Vyjava SGI - Изображение — SGI - imatge SGI - Obrázek SGI - SGI-billede - SGI-Bild - εικόνα SGI - SGI image - SGI-bildo - imagen SGI - SGI irudia - SGI-kuva - SGI mynd - image SGI - íomhá SGI - imaxe SGI - תמונת SGI - SGI slika - SGI kép - Citra SGI - Immagine SGI - SGI 画像 - SGI суреті - SGI 그림 - SGI paveikslėlis - SGI attēls - SGI-bilde - SGI-afbeelding - SGI-bilete - Obraz SGI - Imagem SGI - Imagine SGI - изображение SGI - Obrázok SGI - Slikovna datoteka SGI - Figurë SGI - SGI-bild - SGI görüntüsü - зображення SGI - Ảnh SGI - SGI 图像 - SGI 影像 - - - - Sun raster image - صورة Sun raster - Rastravaja vyjava Sun - Изображение — Sun raster - imatge ràster Sun - Rastrový obrázek Sun - Sun rasterbillede - Sun-Rasterbild - εικόνα Sun raster - Sun raster image - imagen ráster de Sun - Sun raster irudia - Sun-rasterikuva - Sun raster mynd - image raster Sun - íomhá rastar Sun - imaxe ráster de Sun - תמונה סרוקה של Sun - SUN raszterkép - Citra raster Sun - Immagine raster Sun - Sun ラスタ画像 - Sun растрлық суреті - Sun 래스터 그림 - Sun rastrinis paveikslėlis - Sun rastra attēls - Sun rasterbilde - Sun-rasterafbeelding - Sun rasterbilete - Obraz rastrowy Sun - Imagem raster da Sun - Imagine rasterizată Sun - растровое изображение Sun - Rastrový obrázok Sun - Slikovna rastrska datoteka Sun - Figurë raster Sun - Sun-rasterbild - растрове зображення Sun - Ảnh mành Sun - Sun 光栅图像 - Sun raster 影像 - - - - - - - TGA image - صورة TGA - Vyjava TGA - Изображение — TGA - imatge TGA - Obrázek TGA - TGA-billede - TGA-Bild - εικόνα TGA - TGA image - TGA-bildo - imagen TGA - TGA irudia - TGA-kuva - TGA mynd - image TGA - íomhá TGA - imaxe TGA - תמונת TGA - TGA slika - TGA kép - Citra TGA - Immagine TGA - TGA 画像 - TGA суреті - TGA 그림 - TGA paveikslėlis - TGA attēls - TGA-bilde - TGA-afbeelding - TGA-bilete - Obraz TGA - Imagem TGA - Imagine TGA - изображение TGA - Obrázok TGA - Slikovna datoteka TGA - Figurë TGA - TGA-bild - зображення TGA - Ảnh TGA - TGA 图像 - TGA 影像 - TGA - Truevision Graphics Adapter - - - - - - - - - - - - - - - - - - - - - - - - Windows cursor - مؤشر ويندوز - Kursor Windows - Курсор — Windows - cursor de Windows - Kurzor Windows - Windowsmarkør - Windows-Cursor - δείκτης παραθυρικού περιβάλλοντος - Windows cursor - Windows-kursoro - cursor de Windows - Windows kurtsorea - Windows-osoitin - Windows vísi - curseur Windows - cúrsóir Windows - Cursor de Windows - סמן של Windows - Windows kursor - Windows-kurzor - Kursor Windows - Cursore Windows - Windows カーソル - Windows курсоры - Windows 커서 - Windows žymiklis - Windows kursors - Kursor Windows - Windows-markør - Windows-muisaanwijzer - Windows-peikar - Kursor Windows - cursor Windows - Cursor do Windows - Cursor Windows - курсор Windows - Kurzor Windows - Datoteka kazalke Windows - Kursor Windows - Виндуз курзор - Windows-muspekare - курсор Windows - Con chạy Windows - Windows 光标 - Windows 滑鼠指標 - - - - - - - - - Windows animated cursor - مؤشر ويندوز المتحرك - Animavany kursor Windows - Курсор — Windows, анимиран - cursor animat de Windows - Animovaný kurzor Windows - Windowsanimeret markør - Animierter Windows-Cursor - κινούμενος δρομέας Windows - Windows animated cursor - cursor animado de Windows - Windows-eko kurtsore animatua - animoitu Windows-osoitin - Windows livindaigjørdur vísi - curseur animé Windows - cúrsóir beo Windows - Cursor animado de Windows - סמן מונפש של Windows - Windows animirani kursor - Windows animált kurzor - Kursor animasi Windows - Cursore animato Windows - Windows アニメーションカーソル - Windows анимациясы бар курсор - Windows 움직이는 커서 - Animuotas Windows žymiklis - Windows animēts kursors - geanimeerde Windows-muisaanwijzer - Windows animert peikar - Animowany kursor Windows - Cursor animado do Windows - Cursor animat Windows - анимированный курсор Windows - Animovaný kurzor Windows - Datoteka animirane kazalke Windows - Kursor i animuar Windows - Animerad Windows-muspekare - анімований курсор Windows - Con chạy hoạt họa Windows - Windows 动画光标 - Windows 滑鼠動畫游標 - - - - - - - - - EMF image - صورة EMF - Vyjava EMF - Изображение — EMF - imatge EMF - Obrázek EMF - EMF-billede - EMF-Bild - εικόνα EMF - EMF image - EMF-bildo - imagen EMF - EMF irudia - EMF-kuva - EMF mynd - image EMF - íomhá EMF - imaxe EMF - תמונת EMF - EMF slika - EMF kép - Citra EMF - Immagine EMF - EMF 画像 - EMF გამოსახულება - EMF суреті - EMF 그림 - EMF paveikslėlis - EMF attēls - EMF-bilde - EMF-afbeelding - EMF-bilete - Obraz EMF - Imagem EMF - Imagine EMF - изображение EMF - Obrázok EMF - Slikovna datoteka EMF - Figurë EMF - EMF-bild - EMF görüntüsü - зображення EMF - Ảnh EMF - EMF 图像 - EMF 影像 - EMF - Enhanced MetaFile - - - - - - - - - - - - - - - - WMF image - صورة WMF - Vyjava WMF - Изображение — WMF - imatge WMF - Obrázek WMF - WMF-billede - WMF-Bild - εικόνα WML - WMF image - WMF-bildo - imagen WMF - WMF irudia - WMF-kuva - WMF mynd - image WMF - íomhá WMF - imaxe WMF - תמונת WMF - WMF slika - WMF kép - Citra WMF - Immagine WMF - WMF 画像 - WMF суреті - WMF 그림 - WMF paveikslėlis - WMF attēls - WMF-bilde - WMF-afbeelding - WMF-bilete - Obraz WMF - Imagem WMF - Imagine WMF - изображение WMF - Obrázok WMF - Slikovna datoteka WMF - Figurë WMF - WMF-bild - WMF görüntüsü - зображення WMF - Ảnh WMF - WMF 图像 - WMF 影像 - WMF - Windows Metafile - - - - - - - - - - - - - - - - - - - - - - XBM image - صورة XBM - Vyjava XBM - Изображение — XBM - imatge XBM - Obrázek XBM - XBM-billede - XBM-Bild - εικόνα XBM - XBM image - XBM-bildo - imagen XBM - XBM irudia - XBM-kuva - XBM mynd - image XBM - íomhá XBM - imaxe XBM - תמונת XBM - XBM slika - XBM-kép - Citra XBM - Immagine XBM - XBM 画像 - XBM суреті - XBM 그림 - XBM paveikslėlis - XBM attēls - XBM-bilde - XBM-afbeelding - XBM-bilete - Obraz XBM - Imagem XBM - Imagine XBM - изображение XBM - Obrázok XBM - Slikovna datoteka XBM - Figurë XBM - XBM-bild - зображення XBM - Ảnh XBM - XBM 图像 - XBM 影像 - XBM - X BitMap - - - - GIMP image - صورة GIMP - Vyjava GIMP - Изображение — GIMP - imatge del GIMP - Obrázek GIMP - GIMP-billede - GIMP-Bild - εικόνα GIMP - GIMP image - GIMP-bildo - imagen del GIMP - GIMP irudia - GIMP-kuva - GIMP mynd - image GIMP - íomhá GIMP - imaxe de GIMP - תמונת GIMP - GIMP slika - GIMP-kép - Citra GIMP - Immagine GIMP - GIMP 画像 - GIMP გამოსახულება - GIMP суреті - GIMP 그림 - GIMP paveikslėlis - GIMP attēls - Imej GIMP - GIMP-bilde - GIMP-afbeelding - GIMP-bilete - Obraz GIMP - imagem do GIMP - Imagem do GIMP - Imagine GIMP - изображение GIMP - Obrázok GIMP - Slikovna datoteka GIMP - Figurë GIMP - Гимп слика - GIMP-bild - GIMP görüntüsü - зображення GIMP - Ảnh GIMP - GIMP 图像 - GIMP 影像 - - - - - - - - - XFig image - صورة XFig - Vyjava XFig - Изображение — XFig - imatge de XFig - Obrázek XFig - XFig-billede - XFig-Bild - εικόνα XFig - XFig image - XFig-bildo - imagen de XFig - XFig irudia - XFig-kuva - XFig mynd - image XFig - íomhá XFig - imaxe de XFig - תמונת XFig - XFig slika - XFig-kép - Citra XFig - Immagine XFig - XFig 画像 - XFig суреті - XFig 그림 - XFig paveikslėlis - XFig attēls - Imej XFig - XFig-bilde - XFig-afbeelding - XFig-bilete - Obraz XFig - imagem XFig - Imagem do XFig - Imagine XFig - изображение XFig - Obrázok XFig - Slikovna datoteka XFig - Figurë XFig - XFig слика - XFig-bild - зображення XFig - Ảnh XFig - XFig 图像 - XFig 影像 - - - - - - - XPM image - صورة XPM - Vyjava XPM - Изображение — XPM - imatge XPM - Obrázek XPM - Delwedd XPM - XPM-billede - XPM-Bild - εικόνα XPM - XPM image - XPM-bildo - imagen XPM - XPM irudia - XPM-kuva - XPM mynd - image XPM - íomhá XPM - imaxe XPM - תמונת XPM - XPM slika - XPM kép - Citra XPM - Immagine XPM - XPM 画像 - XPM суреті - XPM 그림 - XPM paveikslėlis - XPM attēls - XPM-bilde - XPM-afbeelding - XPM-bilete - Obraz XPM - Imagem XPM - Imagine XPM - изображение XPM - Obrázok XPM - Slikovna datoteka XPM - Figurë XPM - XPM-bild - зображення XPM - Ảnh XPM - XPM 图像 - XPM 影像 - XPM - X PixMap - - - - - - - - X window image - صورة X window - X window rəsmi - Vyjava vakna X - Изображение — X Window - imatge de X window - Obrázek X window - Delwedd ffenest X - X-billede - X-Window-Bild - εικόνα περιβάλλοντος X - X window image - bildo de X window - imagen de X window - X window irudia - X-ikkunakuva - X vindeyga mynd - image X window - íomhá fhuinneog X - imaxe de X Window - תמונת חלון של X - X window slika - X window-kép - Citra X window - Immagine X window - X window 画像 - X window суреті - X 윈도 그림 - X window paveikslėlis - X window attēls - Imej tetingkap X - X-Windows skjermbilde - X-window-afbeelding - X window bilete - Obraz X Window - imagem de janela X - Imagem de janela do X - Imagine X window - изображение X window - Obrázok X window - slika X oken - Figurë X window - X прозор слика - X-fönsterbild - зображення X window - Ảnh cửa sổ X - X window 图像 - X window 影像 - - - - block device - جهاز كتلي - blokavaja pryłada - Блоково устройство - dispositiu de blocs - Blokové zařízení - blokenhed - Blockorientiertes Gerät - συσκευή block - block device - bloka disponaĵo - dispositivo de bloques - bloke-gailua - laitetiedosto - blokka tóleind - périphérique de blocs - gléas bloc - dispositivo de bloque - התקן בלוק - blokkos eszköz - blok divais - Device a blocchi - ブロックデバイス - блоктық құрылғысы - 블록 장치 - blokinis įrenginys - bloka ierīce - Peranti blok - blokkenhet - blok-apparaat - blokk-eining - Urządzenie blokowe - dispositivo de bloco - Dispositivo de bloco - dispozitiv bloc - блочное устройство - Blokové zariadenie - bločna naprava - device me blloqe - блок уређај - blockenhet - blok aygıtı - блоковий пристрій - thiết bị khối - 块设备 - 區塊裝置 - - - character device - جهاز حرفي - znakavaja pryłada - Символно устройство - dispositiu de caràcters - Znakové zařízení - tegnenhed - Zeichenorientiertes Gerät - συσκευή χαρακτήρων - character device - signa disponaĵo - dispositivo de caracteres - karaktereen gailua - merkkilaite - stavatóleind - périphérique de caractères - gléas carachtar - dispositivo de caracter - התקן תכונה - karakteres eszköz - karakter divais - Device a caratteri - キャラクタデバイス - символдық құрылғысы - 문자 장치 - simbolinis įrenginys - rakstzīmju ierīce - Peranti aksara - tegnenhet - byte-apparaat - teikneining - Urządzenie znakowe - dispositivo de caracteres - Dispositivo de caractere - dispozitiv caracter - символьное устройство - Znakové zariadenie - znakovna naprava - device me karaktere - знаковни уређај - teckenenhet - karakter aygıtı - символьний пристрій - thiết bị ký tự - 字符设备 - 字元裝置 - - - folder - مجلّد - kataloh - Папка - carpeta - Složka - mappe - Ordner - φάκελος - folder - dosierujo - carpeta - karpeta - kansio - mappa - dossier - fillteán - cartafol - תיקייה - direktorij - mappa - folder - Cartella - フォルダー - бума - 폴더 - aplankas - mape - Folder - mappe - map - mappe - Katalog - pasta - Pasta - dosar - папка - Priečinok - mapa - Kartelë - директоријум - mapp - dizin - тека - thư mục - 文件夹 - 資料夾 - - - - pipe - إنبوب - kanvejer - Конвейер - conducte - Roura - datakanal - Pipe - σωλήνωση - pipe - dukto - tubería - kanalizazioa - putki - rør - tube - píopa - tubería - צינור - adatcsatorna - pipa - Pipe - パイプ - арна - 파이프 - konvejeris - programmkanāls - Paip - rør - pijp - røyr - Potok - canal - Pipe - canal pipe - канал - Rúra - cev - Pipe - цев - rör - канал - ống dẫn - 管道 - 管線 - - - mount point - نقطة الوصْل - punkt mantavańnia - Точка на монтиране - punt de muntatge - Místo připojení - monteringspunkt - Einhängepunkt - σημείο προσάρτησης - mount point - surmetingo - punto de montaje - muntatze-puntua - liitospiste - ísetingarpunkt - point d'accès - pointe feistithe - punto de montaxe - נקודת עיגון - točka montiranja - csatolási pont - titik mount - Punto di mount - マウントポイント - тіркеу нүктесі - 마운트 위치 - prijungimo taškas - montēšanas punkts - Titik lekapan - monteringspunkt - aankoppelingspunt - monteringspunkt - Punkt montowania - ponto de montagem - Ponto de montagem - loc montare - точка монтирования - Miesto pripojenia - priklopna točka - Pikë montimi - тачка прикључења - monteringspunkt - точка монтування - điểm lắp - 挂载点 - 掛載點 - - - - socket - مقبس - sokiet - Гнездо - sòcol - Socket - sokkel - Socket - υποδοχή - socket - kontaktoskatolo - socket - socketa - pistoke - sokkul - connecteur réseau - soicéad - socket - נקודת חיבור - utičnica - illesztőpont - soket - Socket - ソケット - сокет - 소켓 - lizdas - sokets - Soket - plugg - socket - sokkel - Gniazdo - 'socket' - Socket - socket - сокет - Soket - vtič - Socket - сокет - uttag - сокет - ổ cắm - 套接字 - socket - - - symbolic link - وصلة رمزية - simvolik körpü - symbalnaja spasyłka - Символна връзка - enllaç simbòlic - Symbolický odkaz - cyswllt symbolaidd - symbolsk henvisning - Symbolische Verknüpfung - συμβολικός σύνδεσμος - symbolic link - simbola ligilo - enlace simbólico - esteka sinbolikoa - symbolinen linkki - tykislig leinkja - lien symbolique - nasc siombalach - ligazón simbólica - קישור סימבולי - simbolička veza - szimbolikus link - taut simbolik - Collegamento simbolico - シンボリックリンク - სიმბოლური ბმული - символдық сілтеме - 심볼릭 링크 - simbolinė nuoroda - simboliskā saite - Pautan simbolik - symbolsk lenke - symbolische koppeling - symbolsk lenkje - Dowiązanie symboliczne - ligação simbólica - Ligação simbólica - legătură simbolică - символьная ссылка - Symbolický odkaz - simbolna povezava - Lidhje simbolike - симболичка веза - symbolisk länk - символічне посилання - liên kết tượng trưng - 符号链接 - 符號鏈結 - - - mail delivery report - تقرير تسليم البريد - poçt yollama raportu - rapart ab dastaŭcy pošty - Отчет за пристигналата поща - informe de lliurament de correu - Zpráva o doručení pošty - Adroddiad trosgludo post - postleveringsrapport - E-Mail-Zustellungsbericht - αναφορά παράδοσης μηνύματος - mail delivery report - raporto pri transdono de retpoŝto - informe de entrega de correo - posta banaketako txostena - viestin jakeluilmoitus - post útberingarfrásøgn - rapport de livraison de courriels - tuairisc sheachadadh poist - informe de entrega de correo - דוח העברת דואר - izvještaj dostave pošte - jelentés levélkézbesítésről - laporan pengantaran surat - Rapporto di consegna posta - メール配送ポート - пошта жеткізілгені туралы отчет - 메일 배달 보고서 - pašto pristatymo ataskaita - pasta piegādes atskaite - Laporan penghantaran mel - e-postleveranserapport - e-mail-bezorgingsbericht - e-post-leveringsrapport - Raport z dostarczenia poczty - relatório de entrega de e-mail - Relatório de entrega de correspondência - raport de trimitere email - отчёт о доставке сообщения - Správa o doručení pošty - poročilo dostave pošte - Raport mbi dorëzimin e mesazhit - извештај доставе поруке - e-postleveransrapport - звіт про доставку пошти - thông báo phát thư - 邮件投递报告 - 郵件寄送回報 - - - - - mail disposition report - تقرير ترتيب البريد - poçt qayıtma raportu - rapart ab raźmiaščeńni pošty - Отчет за състоянието на пощата - informe de disposició de correu - Zpráva o předání pošty - adroddiad ffurf post - postdisponeringsrapport - E-Mail-Übertragungsbericht - αναφορά διάθεσης μηνύματος - mail disposition report - raporto pri dispono de retpoŝto - informe de disposición de correo - posta joerako txostena - viestin kuittausilmoitus - post avhendingarfrásøgn - rapport de disposition de courriels - tuairisc chóiriú poist - informe de disposición de correo - דוח אספקת דואר - jelentés levélkidobásról - laporan disposisi surat - Rapporto di disposizione posta - メール停止レポート - пошта жылжытылғаны туралы отчет - 메일 처리 보고서 - pašto charakteristikos ataskaita - pasta izvietojuma atskaite - Laporan pelupusan mel - e-postdispositionsrapport - e-mail-plaatsingsbericht - e-post-disposisjonsrapport - Raport z wysyłania poczty - relatório de disposição de e-mail - Relatório de disposição de correspondência - confirmare primire email - отчёт о перемещении почты - Správa o odovzdaní pošty - poročilo razporeditve pošte - Raport mbi njoftimin e mesazhit - извештај слања поруке - e-postdispositionsrapport - звіт про розташування пошти - thông báo chuyển nhượng thư - 邮件接收报告 - 郵件處置回報 - - - - - reference to remote file - مرجع إلى ملف بعيد - uzaq fayla göstəriş - spasyłka da addalenaha fajłu - Препратка към отдалечен файл - referència a fitxer remot - Odkaz na vzdálený soubor - cyfeiriad at ffeil bell - reference til fjern fil - Verweis auf entfernte Datei - αναφορά σε απόμακρο αρχείο - reference to remote file - referenco al fora dosiero - referencia a un archivo remoto - erreferentzia urruneko fitxategiari - viittaus etätiedostoon - tilvísing til fjarfílu - référence au fichier distant - tagairt do chomhad cianda - referencia a un ficheiro remoto - התיחסות לקובץ מרוחק - referenca na udaljenu datoteku - hivatkozás távoli fájlra - referensi ke berkas jarak jauh - Riferimento a file remoto - リモートファイルへの参照 - қашықтағы файлға сілтеме - 원격 파일 참조 - nuoroda į nutolusį failą - norāde uz attālinātu datni - Rujukan ke fail jauh - referanse til ekstern fil - verwijzing naar bestand op afstand - referanse til fil over nettverk - Odwołanie do pliku zdalnego - referência a um ficheiro remoto - Referência a um arquivo remoto - referință fișier la distanță - ссылка на удалённый файл - Odkaz na vzdialený súbor - sklic do oddaljene datoteke - Referim për tek file në distancë - референца на удаљену датотеку - referens till fjärrfil - посилання на віддалений файл - tham chiếu đến tập tin ở xa - 到远程文件的引用 - 遠端檔案的參照 - - - - Usenet news message - رسالة أخبار Usenet - Usenet xəbərlər ismarışı - Navina Usenet - Съобщение — Usenet - missatge de notícies Usenet - Příspěvek do diskusních skupin Usenet - Neges newyddion Usenet - Usenetnyhedsmeddelelse - Usenet-News-Nachricht - μήνυμα ομάδων συζητήσεων Usenet - Usenet news message - novaĵmesaĝo de Usenet - mensaje de noticias de Usenet - Usenet berrien mezua - nyyssiviesti - Usenet news boð - message de groupe d'échange Usenet - teachtaireacht nuacht Usenet - mensaxes de noticias de Usenet - הודעת חדשות של Usenet - Usenet poruka novosti - USENET-hírcsoportüzenet - Pesan berita Usenet - Messaggio news Usenet - Usenet news メッセージ - Usenet жаңалық мәлімдемесі - 유즈넷 뉴스 메시지 - Usenet naujienų žinutė - Usenet jaunumu ziņojums - Mesej berita USENET - Usenet nyhetsmelding - Usenet-nieuwsbericht - USENET diskusjonsmelding - Wiadomość grupy dyskusyjnej - mensagem de notícias Usenet - Mensagem de notícias da Usenet - Mesaj Usenet de știri - новостное сообщение Usenet - Príspevok do diskusných skupín Usenet - novičarsko sporočilo Usenet - Mesazh lajmesh Usenet - Порука са дискусионе групе - Usenet-diskussionsgruppsmeddelande - повідомлення новин Usenet - Thông điệp tin tức USENET - Usenet 新闻信 - Usenet 新聞訊息 - - - - - - - - - - partial email message - رسالة البريد الإلكتروني الجزئية - qismi poçt ismarışı - niapoŭny list email - Част от електронно писмо - missatge de correu electrònic parcial - Částečná e-mailová zpráva - darn o neges e-bost - delvis postmeddelelse - E-Mail-Nachrichtenfragment - τμηματικό ηλ. μήνυμα - partial email message - parta retpoŝta mesaĝo - mensaje de correo electrónico parcial - posta mezu partziala - osittainen sähköpostiviesti - message partiel de courriel - teachtaireacht ríomhphoist neamhiomlán - mensaxe de correo electrónico parcial - מסר דוא"ל חלקי - djelomična poruka e-pošte - részleges elektronikus levél - pesan email sebagian - Messaggio email parziale - 部分メールメッセージ - электронды поштаның үзінді мәлімдемесі - 부분적 전자 우편 메시지 - nepilnas el. laiškas - daļēja e-pasta vēstule - Bahagian mesej emel - del av e-postmelding - gedeeltelijk e-mailbericht - del av e-post-melding - Częściowa wiadomość e-mail - mensagem parcial de e-mail - Mensagem de e-mail parcial - mesaj de email parțial - фрагмент сообщения электронной почты - Čiastočná e-mailová správa - delno elektronsko sporočilo - Mesazh poste i pjesëshëm - делимична е-порука - del av e-postmeddelande - часткове поштове повідомлення - thư điện tử riêng phần - 部分电子邮件 - 部份電子郵件訊息 - - - - - email message - رسالة البريد الإلكتروني - list email - Съобщение по електронната поща - missatge de correu electrònic - E-mailová zpráva - postmeddelelse - E-Mail-Nachricht - ηλ. μήνυμα - email message - retpoŝta mesaĝo - mensaje de correo electrónico - helbide elektronikoen mezua - sähköpostiviesti - t-post boð - message de courriel - teachtaireacht ríomhphoist - mensaxe de correo electrónico - הודעת דואר אלקטרוני - poruka e-pošte - elektronikus levél - pesan email - Messaggio email - メール本文 - пошталық мәлімдеме - 전자 우편 본문 - el. laiškas - e-pasta vēstule - Mesej emel - e-postmelding - e-mailbericht - e-postmelding - Wiadomość e-mail - mensagem de e-mail - Mensagem de e-mail - mesaj email - почтовое сообщение - E-mailová správa - sporočilo elektronske pošte - Mesazh poste - е-порука - e-postmeddelande - повідомлення email - thư điện tử - 电子邮件 - 電子郵件內容 - - - - - - - - - - - - - - - - - - GNU mail message - رسالة بريد جنو - GNU poçt ismarışı - List GNU - Съобщение — GNU mail - missatge de GNU mail - Zpráva GNU mail - Neges E-Bost GNU - GNU-postmeddelelse - GNU-Mail-Nachricht - μήνυμα αλληλογραφίας GNU - GNU mail message - mesaĝo de GNU mail - mensaje de GNU mail - GNU posta mezua - GNU-postiviesti - GNU mail boð - message de courriel GNU - teachtaireacht phost GNU - mensaxe de correo electrónico de GNU - הודעת דואר של GNU - GNU poruka pošte - GNU elektronikus levél - Pesan surat GNU - Messaggio GNU mail - GNU メールメッセージ - GNU mail შეტყობინება - GNU пошта хабарламасы - GNU 메일 메시지 - GNU pašto žinutė - GNU pasta vēstule - Mesej emel GNU - GNU e-postmelding - GNU-mailbericht - GNU e-postmelding - Wiadomość pocztowa GNU - mensagem de e-mail GNU - Mensagem de correio GNU - Mesaj GNU mail - почтовое сообщение GNU - Správa GNU mail - Sporočilo pošte GNU - Mesazh GNU mail - ГНУ е-писмо - GNU-epostmeddelande - поштове повідомлення GNU - Thư điện tử của GNU - GNU mail 信件 - GNU 郵件訊息 - - - - - VRML document - مستند VRML - VRML sənədi - Dakument VRML - Документ — VRML - document VRML - Dokument VRML - Dogfen VRML - VRML-dokument - VRML-Dokument - έγγραφο VRML - VRML document - VRML-dokumento - documento VRML - VRML dokumentua - VRML-asiakirja - VRML skjal - document VRML - cáipéis VRML - documento VRML - מסמך VRML - VRML dokument - VRML-dokumentum - Dokumen VRML - Documento VRML - VRML ドキュメント - VRML құжаты - VRML 문서 - VRML dokumentas - VRML dokuments - Dokumen VRML - VRML-dokument - VRML-document - VRML-dokument - Dokument VRML - documento VRML - Documento VRML - Document VRML - документ VRML - Dokument VRML - Dokument VRML - Dokument VRML - VRML документ - VRML-dokument - VRML belgesi - документ VRML - Tài liệu VRML - VRML 文档 - VRML 文件 - VRML - Virtual Reality Modeling Language - - - - - - - - message in several formats - رسالة في عدة صيغ - verici formatlarında ismarış - paviedamleńnie ŭ niekalkich farmatach - Съобщение в няколко формата - missatge en varis formats - Zpráva v několika formátech - neges mewn sawl fformat - meddelelse i flere formater - Nachricht in mehreren Formaten - μήνυμα σε διάφορες μορφές - message in several formats - mesaĝo en pluraj formatoj - mensaje en varios formatos - hainbat formatuko mezua - viesti useissa muodoissa - boð í fleiri sniðum - message en formats divers - teachtaireacht i roinnt fhormáidí - mensaxe en varios formatos - הודעה במספר פורמטים - poruka u nekoliko oblika - többféle formátumú üzenet - pesan dalam beberapa format - Messaggio in diversi formati - いくつかの形式でのメッセージ - бірнеше пішімдегі мәлімдеме - 여러가지 형식의 메시지 - laiškas keletu formatų - ziņojums dažādos formātos - Mesej dalam beberapa format - melding i flere formater - bericht in meerdere opmaken - melding i fleire format - Wiadomość w wielu formatach - mensagem em vários formatos - Mensagem em vários formatos - mesaj în diferite formate - сообщение в нескольких форматах - Správa v niekoľkých formátoch - sporočilo v več zapisih - Mesazh në formate të ndryshëm - поруке у више записа - meddelande i flera format - повідомлення у кількох форматах - thông điệp có vài định dạng - 各种格式的消息 - 多種格式的訊息 - - - Macintosh AppleDouble-encoded file - ملف Macintosh AppleDouble مشفر - Macintosh AppleDouble-kodlanmış fayl - Fajł Macintosh, AppleDouble-zakadavany - Файл — кодиран с Macintosh AppleDouble - fitxer codificat AppleDouble de Macintosh - Soubor kódovaný pomocí Macintosh AppleDouble - Ffeil AppleDouble-amgodedig Macintosh - Macintosh AppleDouble-kodet fil - Macintosh-Datei (AppleDouble-kodiert) - αρχείο Macintosh κωδικοποίησης AppleDouble - Macintosh AppleDouble-encoded file - dosiero kodigita laŭ Macintosh AppleDouble - archivo Macintosh codificado con AppleDouble - Macintosh AppleDouble-rekin kodetutako fitxategia - Macintosh AppleDouble -koodattu tiedosto - Macintosh AppleDouble-bronglað fíla - fichier codé Macintosh AppleDouble - comhad ionchódaithe le Macintosh AppleDouble - ficheiro de Macintosh codificado con AppleDouble - קובץ מסוג Macintosh AppleDouble-encoded - Macintosh AppleDouble-kodirana datoteka - Macintosh AppleDouble kódolású fájl - Berkas tersandi Macintosh AppleDouble - File Macintosh codificato AppleDouble - Macintosh AppleDouble エンコードファイル - Macintosh AppleDouble кодталған файлы - 매킨토시 AppleDouble 인코딩된 파일 - Macintosh AppleDouble-encoded failas - Macintosh AppleDouble-kodēts datne - Fail terenkod-AppleDouble Macintosh - dokument kodet med Macintosh AppleDouble - Macintosh AppleDouble-gecodeerd bestand - Macintosh AppleDouble-koda fil - Zakodowany w AppleDouble plik Macintosh - ficheiro codificado em AppleDouble de Macintosh - Arquivo do Macintosh codificado com AppleDouble - Fișier codat Macintosh AppleDouble - файл (закодированный Macintosh AppleDouble) - Súbor kódovaný pomocou Macintosh AppleDouble - Kodirana datoteka Macintosh (AppleDouble) - File Macintosh i kodifikuar AppleDouble - Мекинтош AppleDouble-encoded датотека - Macintosh AppleDouble-kodad fil - файл закодований Macintosh AppleDouble - Tập tin đã mã hoá Apple-Double của Macintosh - Macintosh AppleDouble 编码的文件 - Macintosh AppleDouble 編碼檔 - - - message digest - خلاصة الرسالة - ismarış daycesti - digest paviedamleńniaŭ - Извадка от съобщение - recopilació de missatges - Přehled zpráv - crynodeb negeseuon - meddelelsessammendrag - Nachrichtensammlung - περίληψη μηνύματος - message digest - mesaĝaro - recopilación de mensajes - mezu laburra - viestikokoelma - boð samandráttur - condensé de message - achoimre theachtaireachtaí - recompilación de mensaxe - תקציר ההודעה - ömlesztett üzenet - pesan digest - Digest di messaggi - メッセージダイジェスト - мәлімдеме профилі - 메시지 묶음 - laiškų santrauka - ziņojumu apkopojums - Jilid mesej - medldingssamling - berichtenbundel - meldingsamandrag - Wiadomość przetwarzania - 'digest' de mensagens - Resumo de mensagem - colecție mesaje email - профиль сообщения - Prehľad správ - povzetek sporočila - Shpërndarje mesazhesh - гомила порука - meddelandesamling - збірка повідомлень - bản tóm tắt thông điệp - 消息摘要 - 訊息摘要 - - - encrypted message - رسالة مشفرة - şifrələnmiş ismarış - zašyfravanaje paviedamleńnie - Шифрирано съобщение - missatge xifrat - Zašifrovaná zpráva - Neges wedi ei hamgryptio - krypteret meddelelse - Verschlüsselte Nachricht - κρυπτογραφημένο μήνυμα - encrypted message - ĉifrita mesaĝo - mensaje cifrado - mezu enkriptatua - salattu viesti - bronglað boð - message chiffré - teachtaireacht chriptithe - mensaxe cifrado - הודעה מוצפנת - šifrirana poruka - titkosított üzenet - pesan terenkripsi - Messaggio cifrato - 暗号化メッセージ - шифрленген мәлімдеме - 암호화된 메시지 - užšifruotas laiškas - šifrēta vēstule - Mesej terenkripsi - kryptert melding - versleuteld bericht - kryptert melding - Wiadomość zaszyfrowana - mensagem cifrada - Mensagem criptografada - mesaj criptat - зашифрованное сообщение - Zašifrovaná správa - šifrirano sporočilo - Mesazh i kriptuar - шифрована порука - krypterat meddelande - şifrelenmiş mesaj - шифроване повідомлення - thông điệp đã mật mã - 加密信件 - 加密訊息 - - - compound documents - مستندات مركبة - składanyja dakumenty - Съставни документи - documents composats - Složené dokumenty - sammensatte dokumenter - Verbunddokumente - σύνθετα έγγραφα - compound documents - parentezaj dokumentoj - documentos compuestos - konposatutako dokumentuak - yhdisteasiakirjat - samansett skjøl - documents composés - cáipéisí comhshuite - documentos compostos - מסמכים מורכבים - összetett dokumentumok - dokumen kompon - Documenti composti - 複合ドキュメント - құрама құжаттары - 복합 문서 - sudurtiniai dokumentai - salikti dokumenti - Dokumen halaman - sammensatte dokumenter - samengestelde documenten - samansette dokument - Dokumenty złożone - documentos compostos - Documentos compostos - documente compuse - составные документы - Zložené dokumenty - združeni dokumenti - dokumente të përbërë - сједињени документи - sammansatta dokument - складні документи - tài liệu ghép - 组合文档 - 複合文件 - - - compound document - مستند مركب - birləşik sənəd - składany dakument - Съставен документ - document composat - Složený dokument - dogfen gyfansawdd - sammensat dokument - Verbunddokument - σύνθετο έγγραφο - compound document - parenteza dokumento - documento compuesto - konposatutako dokumentua - yhdisteasiakirja - samansett skjal - document composé - cáipéis comhshuite - documento composto - מסמך מורכב - összetett dokumentum - dokumen kompon - Documento composto - 複合ドキュメント - құрама құжаты - 복합 문서 - sudurtinis dokumentas - salikts dokuments - Dokumen halaman - sammensatt dokument - samengesteld document - samansett dokument - Dokument złożony - documento composto - Documento composto - document compus - составной документ - Zložený dokument - združeni dokument - dokumet i përbërë - сједињени документ - sammansatt dokument - складний документ - tài liệu ghép - 组合文档 - 複合文件 - - - mail system report - تقرير نظام البريد - poçt sistemi raportu - rapart paštovaj systemy - Отчет за пощенската система - informe de sistema de correu - Zpráva poštovního systému - adroddiad system bost - postsystemrapport - E-Mail-Systembericht - αναφορά συστήματος ηλ. ταχυδρομείου - mail system report - raporto de retpoŝta sistemo - informe del sistema de correo - posta sistemako txostena - viestijärjestelmän ilmoitus - postkervisfrásøgn - rapport système de courriels - tuairisc chóras poist - informe do sistema de correo - דו"ח של מערכת הדואר - levelezőrendszer jelentése - laporan sistem surat - Rapporto di sistema posta - メールシステムレポート - пошта жүйесінің мәлімдемесі - 메일 시스템 보고서 - pašto sistemos ataskaita - pasta sistēmas atskaite - Laporan sistem mel - e-postsystemrapport - e-mail-systeembericht - e-post-systemrapport - Raport systemu pocztowego - relatório de sistema de e-mail - Relatório do sistema de correspondência - raport sistem email - отчёт почтовой системы - Správa poštového systému - poročilo poštnega sistema - Raport i sistemit të postës - извештај поштанског система - e-postsystemrapport - звіт поштової системи - thông báo hệ thống thư - 邮件系统报告 - 郵件系統回報 - - - signed message - رسالة موقّعة - imzalanmış ismarış - padpisanaje paviedamleńnie - Подписано съобщение - missatge signat - Podepsaná zpráva - neges lofnodwyd - signeret meddelelse - Signierte Nachricht - υπογεγραμμένο μήνυμα - signed message - pruvita mesaĝo - mensaje firmado - sinatutako mezua - allekirjoitettu viesti - undirskrivað boð - message signé - teachtaireacht sínithe - mensaxe firmado - הודעה חתומה - potpisana poruka - aláírt üzenet - pesan ditandatangani - Messaggio firmato - 署名付きメッセージ - қолтаңбасы бар мәлімдеме - 서명된 메시지 - pasirašytas laiškas - parakstīta ziņa - Mesej ditandatangani - signert melding - ondertekend bericht - signert melding - Podpisana wiadomość - mensagem assinada - Mensagem assinada - mesaj semnat - подписанное сообщение - Podpísaná správa - podpisano sporočilo - Mesazh i firmosur - потписана порука - signerat meddelande - підписане повідомлення - thông điệp đã ký - 签名信件 - 簽署的訊息 - - - stream of data (server push) - دفق بيانات (دفع خادم) - płyń źviestak (ad servera) - Поток от данни, от страна на сървър - flux de dades (enviat pel servidor) - Proud dat (posílaný serverem) - datastrøm (serverskubbet) - Datenstrom (Server-Push) - χείμαρρος δεδομένων (στελλόμενα από τον εξυπηρετητή) - stream of data (server push) - datumstrio (puŝata per servilo) - flujo de datos (por iniciativa del servidor) - datu-korrontea (zerbitzari igortzailea) - tietovirta (palvelin työntää) - streymur av dáta (ambætara skump) - flux de données (émis par le serveur) - sruth sonraí (brú freastalaí) - fluxo de datos (por iniciativa do servidor) - מידע בזרימה (דחיפה ע"י השרת) - sugárzott adatfolyam (kiszolgálóról) - arus data (dorongan server) - Flusso di dati (server push) - データストリーム (サーバープッシュ型) - мәліметтер ағымы (server push) - 데이터 스트림 (서버 푸시) - duomenų srautas (iš serverio) - datu straume (servera grūsta) - Aliran dara (paksaan pelayan) - datastrøm (server push) - gegevensstroom (server duwt) - datastraum (dytta av tenaren) - Strumień danych (wymuszenie serwera) - fluxo de dados (empurrados pelo servidor) - Fluxo de dados (por iniciativa do servidor) - flux de date (de la server) - поток данных (server push) - Prúd dát (posielaný serverom) - pretok podatkov (strežniški) - Fluks me të dhëna (server push) - проток података (гурање са сервера) - dataflöde (serverutsändning) - потік даних (від сервера) - luồng dữ liệu (trình phục vụ đẩy) - 数据流(服务器推送) - 資料串流 (server push) - - - VCS/ICS calendar - سجل VCS/ICS - Kalandar VCS/ICS - Календар — VCS/ICS - calendari VCS/ICS - Kalendář VCS/ICS - VCS/ICS-kalender - VCS/ICS-Kalender - ημερολόγιο VCS/ICS - VCS/ICS calendar - VCS/ICS-kalendaro - calendario VCS/ICS - VCS/ICS egutegia - VCS/ICS-kalenteri - VCS/ICS kalendari - calendrier VCS/ICS - féilire VCS/ICS - Calendario VCS/ICS - לוח שנה VCS/ICS - VCS/ICS kalendar - VCS/ICS naptár - Kalender VCS/ICS - Calendario VCS/ICS - VCS/ICS カレンダー - VCS/ICS күнтізбесі - VCS/ICS 달력 - VCS/ICS kalendorius - VCS/ICS kalendārs - VCS/ICS-kalender - VCS/ICS-kalender - VCS/ICS-kalender - Kalendarz VCS/ICS - Calendário VCS/ICS - Calendar VCS/ICS - календарь VCS/ICS - Kalendár VCS/ICS - Datoteka koledarja VCS/ICS - Kalendar VCS/ICS - VCS/ICS-kalender - VCS/ICS takvimi - календар VCS/ICS - Lịch VCS/ICS - VCS/ICS 日历 - VCS/ICS 行事曆 - VCS/ICS - vCalendar/iCalendar - - - - - - - - - - - - CSS stylesheet - نمط CSS - Arkuš stylaŭ CSS - Стилове — CSS - llista d'estil CSS - Styl CSS - CSS-stilark - CSS-Stilvorlage - φύλο στυλ CSS - CSS stylesheet - CSS-stilfolio - hoja de estilo CSS - CSS estilo-orria - CSS-tyylitiedosto - CSS sniðark - feuille de style CSS - stílbhileog CSS - folla de estilos CSS - גליון עיצוב CSS - CSS stilska tablica - CSS stíluslap - Lembar gaya CSS - Foglio di stile CSS - CSS スタイルシート - CSS სტილი - CSS стильдер кестесі - CSS 스타일시트 - CSS stiliaus aprašas - CSS stilu saraksts - CSS-stilark - CSS-stijlblad - CSS-stilark - Arkusz stylów CSS - Folha de estilo CSS - Pagină de stil CSS - таблица стилей CSS - Štýly CSS - Slogovna predloga CSS - Fletë stili CSS - CSS-stilmall - таблиця стилів CSS - Tờ kiểu dáng CSS - CSS 样式表 - CSS 樣式表 - CSS - Cascading Style Sheets - - - - - - electronic business card - بطاقة أعمال إلكترونية - elektronnaja biznes-kartka - Електронна визитна картичка - targeta de visita electrònica - Elektronická navštívenka - elektronisk visitkort - Elektronische Visitenkarte - ηλεκτρονική επαγγελματική κάρτα - electronic business card - elektronika vizitkarto - tarjeta de visita electrónica - enpresako txartel elektronikoa - sähköinen käyntikortti - elektroniskt handilskort - carte de visite électronique - cárta gnó leictreonach - tarxeta de negocio electrónica - כרטיס ביקור אלקטרוני - elektronička posjetnica - elektronikus névjegykártya - kartu bisnis elektronik - Biglietto da visita elettronico - 電子名刺 - электронда визит карточкасы - 전자 명함 - elektroninė vizitinė kortelė - elektroniskā biznesa kartiņa - elektronisch visitekaartje - elektronisk visittkort - Wizytówka elektroniczna - cartão de visita electrónico - Cartão de visitas eletrônico - carte de vizită electronică - электронная визитная карточка - Elektronická vizitka - elektronska poslovna vizitka - Skedë elektronike biznesi - elektroniskt visitkort - електронна бізнес-картка - danh thiếp điện tử - 电子商务卡 - 電子商務名片 - - - - - - - - - - - - - - txt2tags document - مستند txt2tags - dakument txt2tags - Документ — txt2tags - document txt2tags - Dokument txt2tags - txt2tags-dokument - txt2tags-Dokument - αρχείο txt2tags - txt2tags document - txt2tags-dokumento - documento txt2tags - txt2tags dokumentua - txt2tags-asiakirja - txt2tags skjal - document txt2tags - cáipéis txt2tags - documento txt2tags - מסמך txt2tags - txt2tags dokument - txt2tags dokumentum - dokumen txt2tags - Documento txt2tags - txt2tags ドキュメント - txt2tags დოკუმენტი - txt2tags құжаты - txt2tags 문서 - txt2tags dokumentas - txt2tags dokuments - txt2tags-dokument - txt2tags-document - txt2tags-dokument - Dokument txt2tags - Documento do txt2tags - document txt2tags - документ txt2tags - Dokument txt2tags - Dokument txt2tags - Dokument txt2tags - txt2tags-dokument - документ txt2tags - tài liệu txt2tags - txt2tags 文档 - txt2tags 文件 - - - - - - - - - Verilog source code - Изходен код — Verilog - codi font en Verilog - Zdrojový kód Verilog - Verilog-kildekode - Verilog-Quellcode - πηγαίος κώδικας Verilog - Verilog source code - Verilog-fontkodo - código fuente en Verilog - Verilog-lähdekoodi - code source Verilog - código fonte en Verilog - קוד מקור של - Verilog izvorni kod - Verilog-forráskód - Kode sumber Verilog - Codice sorgente Verilog - Verilog ソースコード - Verilog бастапқы коды - Verilog 소스 코드 - Verilog pirmkods - Verilog broncode - Kod źródłowy Verilog - Código-fonte Verilog - исходный код Verilog - Zdrojový kód Verilog - Datoteka izvorne kode Verilog - Verilog-källkod - Verilog kaynak kodu - вихідний код мовою Verilog - Verilog 源代码 - Verilog 源碼 - - - - - SystemVerilog header - Заглавен файл — SystemVerilog - capçalera de SystemVerilog - Záhlaví SystemVerilog - SystemVerilog-teksthoved - SystemVerilog-Header - κεφαλίδα SystemVerilog - SystemVerilog header - cabeceras de SystemVerilog - SystemVerilog-otsake - en-tête - Cabeceiras de SystemVerilog - כותרת SystemVerilog - SystemVerilog zaglavlje - SystemVerilog fejléc - Header SystemVerilog - Header SystemVerilog - SystemVerilog ヘッダー - SystemVerilog тақырыптамасы - SystemVerilog 헤더 - SystemVerilog galvene - SystemVerilog header - Nagłówek SystemVerilog - Cabeçalho de SystemVerilog - заголовочный файл SystemVerilog - Hlavičky SystemVerilog - Datoteka glave SystemVerilog - SystemVerilog-headerfil - заголовки SystemVerilog - SystemVerilog 头 - SystemVerilog 標頭 - - - - - SystemVerilog source code - Изходен код — SystemVerilog - codi font en SystemVerilog - Zdrojový kód SystemVerilog - SystemVerilog-kildekode - SystemVerilog-Quellcode - πηγαίος κώδικας SystemVerilog - SystemVerilog source code - código fuente en SystemVerilog - SystemVerilog-lähdekoodi - code source - código fonte en SystemVerilog - קוד מקור של SystemVerilog - SystemVerilog izvorni kod - SystemVerilog-forráskód - Kode sumber SystemVerilog - Codice sorgente - SystemVerilog ソースコード - SystemVerilog бастапқы коды - SystemVerilog 소스 코드 - SystemVerilog pirmkods - SystemVerilog broncode - Kod źródłowy SystemVerilog - Código-fonte de SystemVerilog - исходный код SystemVerilog - Zdrojový kód SystemVerilog - Datoteka izvorne kode SystemVerilog - SystemVerilog-källkod - вихідний файл мовою SystemVerilog - SystemVerilog 源代码 - SystemVerilog 源碼 - - - - - VHDL source code - Изходен код — VHDL - codi font en VHDL - Zdrojový kód VHDL - VHDL-kildekode - VHDL-Quellcode - πηγαίος κώδικας VHDL - VHDL source code - VHDL-fontkodo - código fuente en VHDL - VHDL-lähdekoodi - code source VHDL - código fonte en VHDL - קוד מקור של VHDL - VHDL izvorni kod - VHDL-forráskód - Kode sumber VHDL - Codice sorgente VHDL - VHDL ソースコード - VHDL бастапқы коды - VHDL 소스 코드 - VHDL pirmkods - VHDL broncode - Kod źródłowy VHDL - Código-fonte VHDL - исходный код VHDL - Zdrojový kód VHDL - Datoteka izvorne kode VHDL - VHDL-källkod - VHDL kaynak kodu - вихідний код мовою VHDL - VHDL 源代码 - VHDL 源碼 - VHDL - Very-High-Speed Integrated Circuit Hardware Description Language - - - - - - enriched text document - مستند نصي مغنى - zəngin mətn sənədi - azdobleny tekstavy dakument - Документ с обогатен текст - document de text enriquit - Rozšířený textový dokument - Dogfen testun wedi ei gyfoethogi - beriget tekstdokument - Angereichertes Textdokument - εγγραφο εμπλουτισμένου κειμένου - enriched text document - riĉigita teksta dokumento - documento de texto enriquecido - aberastutako testu dokumentua - rikastettu tekstiasiakirja - ríkað tekstskjal - document texte enrichi - cáipéis téacs saibhrithe - documento de texto enriquecido - מסמך טקסט מועשר - obogaćeni tekstualni dokument - enriched text dokumentum - dokumen teks diperkaya - Documento testo arricchito - リッチテキストドキュメント - пішімделген мәтіндік құжаты - 확장된 텍스트 문서 - praturtinto teksto dokumentas - bagātināta teksta formāts - Dokumen teks diperkaya - riktekst-dokument - verrijkt tekstdocument - rik tekst tekstdokument - Wzbogacony dokument tekstowy - documento de texto rico - Documento de texto enriquecido - document text îmbogățit - форматированный текстовый документ - Rozšírený textový dokument - dokument z obogatenim besedilom - Dokument teksti i pasuruar - обогаћени текстуални документ - berikat textdokument - форматований текстовий документ - tài liệu văn bản có kiểu dáng - 富文本文档 - 豐富化文字文件 - - - - help page - صفحة المساعدة - yardım səhifəsi - staronka dapamohi - Страница от помощта - pàgina d'ajuda - Stránka nápovědy - tudalen gymorth - hjælpeside - Hilfeseite - σελίδα βοήθειας - help page - help-paĝo - página de ayuda - laguntzako orria - ohjesivu - hjálparsíða - page d'aide - leathanach cabhrach - páxina de axuda - דף עזרה - stranica pomoći - súgóoldal - halaman bantuan - Pagina di aiuto - ヘルプページ - анықтама парағы - 도움말 페이지 - žinyno puslapis - palīdzības lapa - Halaman bantuan - hjelpside - hulppagina - hjelpeside - Strona pomocy - página de ajuda - Página de ajuda - pagină de ajutor - страница справки - Stránka Pomocníka - stran pomoči - Faqe ndihme - страна помоћи - hjälpsida - yardım sayfası - сторінка довідки - trang trợ giúp - 帮助页面 - 幫助頁面 - - - - plain text document - مستند نصي مجرد - prosty tekstavy dakument - Документ с неформатиран текст - document de text pla - Prostý textový dokument - rent tekstdokument - Einfaches Textdokument - έγγραφο απλού κειμένου - plain text document - plata teksta dokumento - documento de texto sencillo - testu soileko dokumentua - perustekstiasiakirja - document texte brut - cáipéis ghnáth-théacs - documento de texto sinxelo - מסמך טקסט פשוט - običan tekstualni dokument - egyszerű szöveg - dokumen teks biasa - Documento in testo semplice - 平文テキストドキュメント - мәтіндік құжаты - 일반 텍스트 문서 - paprastas tekstinis dokumentas - vienkāršs teksta dokuments - Dokumen teks jernih - vanlig tekstdokument - plattetekst-document - vanleg tekstdokument - Zwykły dokument tekstowy - documento em texto simples - Documento somente texto - document text simplu - текстовый документ - Obyčajný textový dokument - običajna besedilna datoteka - Dokument në tekst të thjeshtë - обичан текстуални документ - vanligt textdokument - звичайний текстовий документ - tài liệu nhập thô - 纯文本文档 - 純文字文件 - - - - - - - - - - RDF file - ملف RDF - Fajł RDF - Файл — RDF - fitxer RDF - Soubor RDF - RDF-fil - RDF-Datei - αρχείο RDF - RDF file - RDF-dosiero - archivo RDF - RDF fitxategia - RDF-tiedosto - RDF fíla - fichier RDF - comhad RDF - ficheiro RDF - קובץ RDF - RDF datoteka - RDF fájl - Arsip RDF - File RDF - RDF ファイル - RDF файлы - RDF 파일 - RDF failas - RDF datne - RDF-fil - RDF-bestand - RDF-fil - Plik RDF - Arquivo RDF - Fișier RDF - файл RDF - Súbor RDF - Datoteka RDF - File RDF - RDF-fil - файл RDF - Tập tin RDF - RDF 文件 - RDF 檔 - RDF - Resource Description Framework - - - - - - - - - email headers - ترويسة البريد الإلكتروني - epoçt başlıqları - paštovyja zahałoŭki - Заглавни части на електронни писма - capçaleres de correu electrònic - Záhlaví e-mailu - penawdau e-bost - posthoveder - E-Mail-Kopfzeilen - κεφαλίδες ηλ. μηνυμάτων - email headers - retpoŝtaj ĉapoj - cabeceras de correo electrónico - helbide elektronikoen goiburuak - sähköpostiotsakkeet - t-post tekshøvd - en-têtes de courriel - ceanntásca ríomhphoist - cabeceiras de correo electrónico - כותרת דוא"ל - zaglavlja e-pošte - levélfejléc - tajuk email - Intestazioni email - メールヘッダー - пошталық тақырыптамалары - 전자 우편 헤더 - el. laiško antraštės - e-pasta galvene - Pengepala emel - e-posthode - e-mail-kopregels - e-post-hovud - Nagłówki wiadomości e-mail - cabeçalhos de e-mail - Cabeçalhos de e-mail - antete email - почтовые заголовки - Hlavičky e-mailu - glava elektronske pošte - Header email - заглавља е-порука - e-posthuvuden - eposta başlığı - заголовки email - dòng đầu thư điện tử - 电子邮件头 - 電子郵件標頭 - - - - rich text document - مستند نصي غني - zəngin mətn sənədi - azdobleny tekstavy dakument - Документ — rich text - document de text enriquit - Textový dokument RTF - dogfen testun gyfoethog (rtf) - richtekstdokument - RTF-Textdokument - έγγραφο εμπλουτισμένου κειμένου (RTF) - rich text document - riĉteksta dokumento - documento de texto enriquecido - aberastutako testu formatua - RTF-asiakirja - document « rich text » - cáipéis mhéith-théacs - documento do texto enriquecido - מסמך טקסט עשיר - obogaćeni tekstualni dokument - rich text-dokumentum - dokumen teks kaya - Documento rich text - リッチテキストドキュメント - пішімделген мәтіні бар құжаты - 서식있는 텍스트 문서 - praturtinto teksto dokumentas - bagātā teksta dokuments - Dokumen teks diperkaya - rik tekst-dokument - opgemaakt tekstdocument - rik tekst-dokument - Dokument Rich Text - documento em texto rico - Documento rich text - document text îmbogățit - документ с форматированным текстом - Textový dokument RTF - dokument z oblikovanim besedilom - Dokument rich text - обогаћени текстуални документ - RTF-textdokument - форматований текстовий документ - tài liệu văn bản có kiểu dáng (RTF) - RTF 丰富文本文档 - 豐富文字文件 - - - - - RSS summary - ملخص RSS - Karotki ahlad RSS - Обобщение за сайтове — RSS - resum RSS - Souhrn RSS - RSS-sammendrag - RSS-Zusammenfassung - σύνοψη RSS - RSS summary - resumen RSS - RSS laburpena - RSS-tiivistelmä - RSS samandráttur - résumé RSS - achoimre RSS - Resumo RSS - תקציר RSS - RSS sažetak - RSS összefoglaló - Ringkasan RSS - Sommario RSS - RSS サマリ - RSS жинақталғаны - RSS 요약 - RSS santrauka - RSS kopsavilkums - RSS-sammendrag - RSS-samenvatting - RSS-samandrag - Podsumowanie RSS - Resumo RSS - Rezumat RSS - сводка RSS - Súhrn RSS - Datoteka povzetek RSS - Përmbledhje RSS - RSS-sammanfattning - зведення сайту RSS - Bản tóm tắt RSS - RSS 摘要 - RSS 摘要 - RSS - RDF Site Summary - - - - - - - - - - - Atom syndication feed - مروج تغذية Atom - Syndykacyjny kanał navinaŭ Atom - Емисия — Atom - canal de sindicació Atom - Kanál Atom - Atom syndication-feed - Atom-Nachrichtenquelle - Atom syndication feed - proveedor de noticias Atom - Atom harpidetze-iturria - Atom-yhdistevirta - fil de syndication Atom - fotha sindeacáitithe Atom - fonte de sindicación Atom - הזנה דרך הרשת של Atom - Atom egyesítőfolyam - Umpan sindikasi Atom - Feed di distribuzione Atom - Atom 配信フィード - Atom жаңалықтар таспасы - Atom 동기화 피드 - Atom sindikacijos kanalas - Atom sindikāta barotne - Atom syndikeringsstrøm - Atom-syndicatie-feed - Atom-kjelde - Kanał Atom - Fonte de notícias Atom - Flux agregare Atom - лента новостей Atom - Kanál Atom - Sindikalni vir Atom - Feed për përhapje Atom - Atom-syndikeringskanal - трансляція подач Atom - Nguồn tin tức Atom - Atom 更新种子 - Atom 聯合供稿饋流 - - - - - - - - - - OPML syndication feed - مروج تغذية OPML - Syndykacyjny kanał OPML - Емисия — OPML - canal de sindicació OPML - Kanál OPML - OPML-syndikeringsfeed - OPML-Nachrichtenquelle - ροή φορέα OPML - OPML syndication feed - proveedor de noticias OPML - OPML harpidetze-iturria - OPML-yhdistevirta - fil de syndication OPML - fotha sindeacáitithe OPML - fonte de sindicación OPML - הזנה דרך הרשת OPML - OPML egyesítőfolyam - Umpan sindikasi OPML - Feed di distribuzione OPML - OPML 配信フィード - OPML жаңалықтар таспасы - OPML 묶음 feed - OPML sindikacijos kanalas - OPML sindikāta barotne - OPML syndikeringsstrøm - OPML-syndicatie-feed - OPML-kjelde - Kanał OPML - Fonte de notícias OPML - Flux OPML syndication - лента новостей OPML - Kanál OPML - Sindikalni vir OPML - Feed për përhapje OPML - OPML-syndikeringskanal - трансляція подач OPML - Nguồn tin tức OPML - OPML 聚合种子 - OPML 聯合供稿饋流 - - - - - - - - - - SGML document - مستند SGML - Dakument SGML - Документ — SGML - document SGML - Dokument SGML - Dogfen SGML - SGML-dokument - SGML-Dokument - έγγραφο SGML - SGML document - SGML-dokumento - documento SGML - SGML dokumentua - SGML-asiakirja - SGML skjal - document SGML - cáipéis SGML - documento SGML - מסמך SGML - SGML dokument - SGML-dokumentum - Dokumen SGML - Documento SGML - SGML ドキュメント - SGML құжаты - SGML 문서 - SGML dokumentas - SGML dokuments - Dokumen SGML - SGML-dokument - SGML-document - SGML-dokument - Dokument SGML - documento SGML - Documento SGML - Document SGML - документ SGML - Dokument SGML - Dokument SGML - Dokument SGML - SGML документ - SGML-dokument - SGML belgesi - документ SGML - Tài liệu SGML - SGML 文档 - SGML 文件 - SGML - Standard Generalized Markup Language - - - - - - spreadsheet interchange document - مستند تبادل الجدول - dakument dla abmienu raźlikovymi arkušami - Документ за обмяна между програми за електронни таблици - document d'intercanvi de full de càlcul - Sešitový přenosový dokument - regnearksudvekslingsdokument - Tabellenkalkulations-Austauschdokument - έγγραφο ανταλλαγής λογιστικού φύλλου - spreadsheet interchange document - documento de intercambio de hojas de cálculo - kalkulu-orriak trukatzeko dokumentua - taulukkovälitysasiakirja - rokniarks umbýtisskjal - document d'échange de feuilles de calcul - cáipéis idirmhalartaithe scarbhileog - documento de intercambio de follas de cálculo - מסמך גליון נתונים מתחלף - spreadsheet-cserélhetődokumentum - dokumen lembar sebar saling tukar - Documento di scambio per foglio di calcolo - スプレッドシート交換ドキュメント - spreadsheet interchange құжаты - 스프레드시트 교환 문서 - skaičialenčių apsikeitimo dokumentas - izklājlapu apmaiņas dokuments - dokument for regnearkutveksling - rekenblad-uitwisselingsdocument - Utvekslingsdokument for rekneark - Dokument wymiany arkuszy kalkulacyjnych - Documento de intercâmbio de planilhas - document schimb filă de calcul - документ Spreadsheet Interchange - Zošitový prenosový dokument - dokument izmenjeve preglednic - Dokument shkëmbimi për fletë llogaritje - spreadsheet interchange-dokument - документ обміну ел. таблицями - tài liệu hoán đổi bảng tính - 电子表格交换文档 - 試算表交換文件 - - - - - - - - - TSV document - مستند TSV - Dakument TSV - Документ — TSV - document TSV - Dokument TSV - TSV-dokument - TSV-Dokument - έγγραφο TSV - TSV document - documento TSV - TSV dokumentua - TSV-asiakirja - TSV skjal - document TSV - cáipéis TSV - documento TSV - מסמך TSV - TSV dokument - TSV dokumentum - Dokumen TSV - Documento TSV - TSV ドキュメント - TSV құжаты - TSV 문서 - TSV dokumentas - TSV dokuments - TSV-dokument - TSV-document - TSV-dokument - Dokument TSV - Documento TSV - Document TSV - документ TSV - Dokument TSV - Dokument TSV - Dokument TSV - TSV-dokument - документ TSV - Tài liệu TSV - TSV 文档 - TSV 文件 - TSV - Tab Separated Values - - - - - Graphviz DOT graph - مبيان Graphviz DOT - Граф — Graphviz DOT - gràfic Graphviz DOT - Graf Graphviz DOT - Graphviz DOT-graf - Graphviz-DOT-Graph - Γράφημα Graphviz DOT - Graphviz DOT graph - gráfico Graphviz DOT - Graphviz DOT grafikoa - Graphviz DOT -graafi - Graphviz DOT ritmynd - graphe Graphviz DOT - graf DOT Graphviz - gráfica DOT de Graphviz - גרף של Graphviz DOT - Graphviz DOT grafikon - Graphviz DOT-grafikon - Grafik Graphviz DOT - Grafico Graphviz DOT - Graphviz DOT グラフ - Graphviz DOT сызбасы - Graphviz DOT 그래프 - Graphviz DOT diagrama - Graphviz DOT grafiks - Graphviz wetenschappelijke grafiek - Wykres DOT Graphviz - Gráfico do Graphviz DOT - Grafic Graphviz DOT - Диаграмма Graphviz DOT - Graf Graphviz DOT - Datoteka grafikona Graphviz DOT - Graphviz DOT-graf - граф DOT Graphviz - Biểu đồ DOT Graphviz - Graphviz DOT 科学图形 - Graphviz DOT 圖 - - - - - - - - - - - - JAD document - مستند JAD - Dakument JAD - Документ — JAD - document JAD - Dokument JAD - JAD-dokument - JAD-Dokument - έγγραφο JAD - JAD document - JAD-dokumento - documento JAD - JAD dokumentua - JAD-asiakirja - JAD skjal - document JAD - cáipéis JAD - documento JAD - מסמך JAD - JAD dokument - JAD dokumentum - Dokumen JAD - Documento JAD - JAD ドキュメント - JAD құжаты - JAD 문서 - JAD dokumentas - JAD dokuments - JAD-dokument - JAD-document - JAD-dokument - Dokument JAD - Documento JAD - Document JAD - документ JAD - Dokument JAD - Dokument JAD - Dokument JAD - JAD-dokument - JAD belgesi - документ JAD - Tài liệu JAD - JAD 文档 - JAD 文件 - JAD - Java Application Descriptor - - - - - - - WML document - مستند WML - WML sənədi - Dakument WML - Документ — WML - document WML - Dokument WML - Dogfen WML - WML-dokument - WML-Dokument - έγγραφο WML - WML document - WML-dokumento - documento WML - WML dokumentua - WML-asiakirja - WML skjal - document WML - cáipéis WML - documento WML - מסמך WML - WML dokument - WML-dokumentum - Dokumen WML - Documento WML - WML ドキュメント - WML құжаты - WML 문서 - WML dokumentas - WML dokuments - Dokumen XML - WML-dokument - WML-document - WML-dokument - Dokument WML - documento WML - Documento WML - Document WML - документ WML - Dokument WML - Dokument WML - Dokument WML - WML документ - WML-dokument - WML belgesi - документ WML - Tài liệu WML - WML 文档 - WML 文件 - WML - Wireless Markup Language - - - - - WMLScript program - برنامج WMLScript - Prahrama WMLScript - Програма — WMLScript - programa WMLScript - Program WMLScript - WMLScript-program - WMLScript-Programm - πρόγραμμα WMLScript - WMLScript program - programa en WMLScript - WMLScript programa - WMLScript-ohjelma - WMLScript forrit - programme WMLScript - ríomhchlár WMLScript - programa en WMLScript - תוכנית של WMLScript - WMLScript program - WMLScript program - Program WMLScript - Programma WMLScript - WMLScript プログラム - WMLScript бағдарламасы - WMLScript 프로그램 - WMLScript programa - WMLScript programma - WMLScript-program - WMLScript-programma - WMLScript-program - Pogram WMLScript - Programa WMLScript - Program WMLScript - сценарий WMLScript - Program WMLScript - Programska datoteka WMLScript - Program WMLScript - WMLScript-program - WMLScript programı - програма мовою WMLScript - Chương trình WMLScript - WMLScript 程序 - WMLScript 程式 - - - - ACE archive - أرشيف ACE - Archiŭ ACE - Архив — ACE - arxiu ACE - Archiv ACE - ACE-arkiv - ACE-Archiv - αρχείο ACE - ACE archive - ACE-arkivo - archivador ACE - ACE artxiboa - ACE-arkisto - ACE skjalasavn - archive ACE - cartlann ACE - arquivo ACE - ארכיון ACE - ACE arhiva - ACE archívum - Arsip ACE - Archivio ACE - ACE アーカイブ - ACE არქივი - ACE архиві - ACE 압축 파일 - ACE archyvas - ACE arhīvs - ACE-arkiv - ACE-archief - ACE-arkiv - Archiwum ACE - Pacote ACE - Arhivă ACE - архив ACE - Archív ACE - Datoteka arhiva ACE - Arkiv ACE - ACE-arkiv - ACE arşivi - архів ACE - Kho nén ACE - ACE 归档文件 - ACE 封存檔 - - - - - - - - Ada source code - شفرة مصدر Ada - Kryničny kod Ada - Изходен код — Ada - codi font en Ada - Zdrojový kód v Adě - Ada-kildekode - Ada-Quelltext - πηγαίος κώδικας Ada - Ada source code - Ada-fontkodo - código fuente en Ada - Ada iturburu-kodea - Ada-lähdekoodi - Ada keldukota - code source Ada - cód foinseach Ada - código fonte en Ada - קוד מקור Ada - Ada izvorni kod - Ada-forráskód - Kode program Ada - Codice sorgente Ada - Ada ソースコード - Ada-ის საწყისი კოდი - Ada бастапқы коды - Ada 소스 코드 - Ada pradinis kodas - Ada pirmkods - Kod sumber Ada - Ada-kildekode - Ada-broncode - Ada-kjeldekode - Kod źródłowy Ada - código fonte Ada - Código-fonte Ada - Cod sursă Ada - исходный код Ada - Zdrojový kód jazyka Ada - Datoteka izvorne kode Ada - Kod burues Ada - Ада изворни ко̂д - Ada-källkod - Ada kaynak kodu - вихідний код мовою Ada - Mã nguồn Ada - Ada 源代码 - Ada 源碼 - - - - - - author list - لائحة المؤلف - śpis aŭtaraŭ - Списък на авторите - llista d'autors - Seznam autorů - forfatterliste - Autorenliste - κατάλογος συγγραφέων - author list - listo de aŭtoroj - lista de autores - egile-zerrenda - tekijäluettelo - høvundalisti - liste d'auteurs - liosta údar - lista de autores - רשימת יוצרים - szerzőlista - senarai penulis - Elenco autori - 著者リスト - авторлар тізімі - 저자 목록 - autorių sąrašas - autoru saraksts - Senarai penulis - forfatterliste - auteurslijst - forfattarliste - Lista autorów - lista de autores - Lista de autores - listă autori - список авторов - Zoznam autorov - seznam avtorjev - Lista e autorëve - списак аутора - författarlista - yazar listesi - перелік авторів - danh sách tác giả - 作者列表 - 作者清單 - - - - - BibTeX document - مستند BibTeX - Dakument BibTeX - Документ — BibTeX - document BibTeX - Dokument BibTeX - BibTeX-dokument - BibTeX-Dokument - έγγραφο BibTeX - BibTeX document - BibTeX-dokumento - documento BibTeX - BibTeX dokumentua - BibTeX-asiakirja - BibTeX skjal - document BibTeX - cáipéis BibTeX - documento BibTex - מסמך BibTeX - BibTeX dokument - BibTeX dokumentum - Dokumen BibTeX - Documento BibTeX - BibTeX ドキュメント - BibTeX-ის დოკუმენტი - BibTeX құжаты - BibTeX 문서 - BibTeX dokumentas - BibTeX dokuments - BibTeX-dokument - BibTeX-document - BibTeX-dokument - Dokument BibTeX - Documento BibTeX - Document BibTeX - документ BibTeX - Dokument BibTeX - Dokument BibTeX - Dokument BibTeX - BibTeX-dokument - BibTeX belgesi - документ BibTeX - Tài liệu BibTeX - BibTeX 文档 - BibTeX 文件 - - - - - - - - C++ header - ترويسة سي++ - Zahałoŭny fajł C++ - Заглавен файл — C++ - capçalera en C++ - Záhlaví v C++ - C++-posthoved - C++-Header - κεφαλίδα C++ - C++ header - cabecera de código fuente en C++ - C++ goiburua - C++-otsake - C++ tekshøvd - en-tête C++ - ceanntásc C++ - cabeceira de código fonte en C++ - כותר ++C - C++ zaglavlje - C++ fejléc - Tajuk C++ - Header C++ - C++ ヘッダー - C++-ის თავსართი - C++ тақырыптама файлы - C++ 헤더 - C++ antraštė - C++ galvene - C++-kildekodeheader - C++-header - C++-kjeldekode-hovud - Plik nagłówkowy C++ - Cabeçalho C++ - Antet C++ - заголовочный файл C++ - Hlavičky jazyka C++ - Datoteka glave C++ - Header C++ - C++-huvud - файл заголовків мовою C++ - Phần đầu mã nguồn C++ - C++ 源代码头文件 - C++ 標頭檔 - - - - - - - - - C++ source code - شفرة مصدر سي++ - Kryničny kod C++ - Изходен код — C++ - codi font en C++ - Zdrojový kód v C++ - C++-kildekode - C++-Quelltext - πηγαίος κώδικας C++ - C++ source code - C++-fontkodo - código fuente en C++ - C++ iturburu-kodea - C++-lähdekoodi - C++ keldukota - code source C++ - cód foinseach C++ - código fonte de C++ - קוד מקור של C++ - C++ izvorni kod - C++-forráskód - Kode program C++ - Codice sorgente C++ - C++ ソースコード - C++-ის საწყისი კოდი - C++ бастапқы коды - C++ 소스 코드 - C++ pradinis kodas - C++ pirmkods - Kod sumber C++ - C++-kildekode - C++-broncode - C++-kjeldekode - Kod źródłowy C++ - código fonte C++ - Código-fonte C++ - Cod sursă C++ - исходный код C++ - Zdrojový kód jazyka C++ - Datoteka izvorne kode C++ - Kod burues C++ - C++ изворни ко̂д - C++-källkod - вихідний код мовою C++ - Mã nguồn C++ - C++ 源代码 - C++ 源碼 - - - - - - - - - ChangeLog document - مستند ChangeLog - Dakument zafiksavanych źmienaŭ ChangeLog - Дневник за промени — ChangeLog - document de registre de canvis - Dokument ChangeLog - ChangeLot-dokument - Änderungsprotokoll - έγγραφο ChangeLog - ChangeLog document - documento de cambios - ChangeLog dokumentua - Muutoslokiasiakirja - ChangeLog skjal - document ChangeLog - cáipéis ChangeLog - documento Changelog - מסמך של ChangeLog - ChangeLog dokumentum - Dokumen ChangeLog - Documento ChangeLog - ChangeLog ドキュメント - ChangeLog დოკუმენტი - ChangeLog құжаты - ChangeLog 문서 - ChangeLog dokumentas - ChangeLog dokuments - ChangeLog-dokument - ChangeLog-document - ChangeLog-dokument - Dokument zmian (ChangeLog) - Documento ChangeLog - Document ChangeLog - протокол изменений - Dokument ChangeLog - Dokument ChangeLog - Dokument ChangeLog - Ändringsloggsdokument - документ ChangeLog - Tài liệu ChangeLog (ghi lưu thay đổi) - 变更日志文档 - ChangeLog 文件 - - - - - C header - ترويسة C - Zahałoŭny fajł C - Заглавен файл — C - capçalera en C - Záhlaví v C - C-posthoved - C-Header - κεφαλίδα C - C header - cabecera de código fuente en C - C goiburua - C-otsake - C tekshøvd - en-tête C - ceanntásc C - cabeceira de códifo fonte de C - כותר C - C zaglavlje - C fejléc - Tajuk C - Header C - C ヘッダー - C-ის თავსართი - C тақырыптама файлы - C 헤더 - C antraštė - C galvene - C-kildekodeheader - C-header - C-kjeldekode-hovud - Plik nagłówkowy C - Cabeçalho C - Antet C - заголовочный файл C - Hlavičky jazyka C - Datoteka glave C - Header C - C-huvud - C başlığı - файл заголовків мовою C - Phần đầu mã nguồn C - C 程序头文件 - C 標頭檔 - - - - - CMake source code - شفرة مصدر CMake - Kryničny kod CMake - Изходен код — CMake - codi font en CMake - Zdrojový kód CMake - CMake-kildekode - CMake-Quelltext - πηγαίος κώδικας CMake - CMake source code - CMake-fontkodo - código fuente en CMake - CMake iturburu-kodea - CMake-lähdekoodi - CMake keldukota - code source CMake - cód foinseach CMake - código fonte de CMake - קוד מקור של CMake - CMake izvorni kod - CMake-forráskód - Kode program CMake - Codice sorgente CMake - CMake ソースコード - CMake-ის საწყისი კოდი - CMake бастапқы коды - CMake 소스 코드 - CMake pirminis tekstas - CMake pirmkods - CMake-kildekode - CMake-broncode - CMake-kjeldekode - Kod źródłowy CMake - Código-fonte CMake - Cod sursă CMake - исходный код CMake - Zdrojový kód CMake - Datoteka izvorne kode CMake - Kod burues CMake - CMake-källkod - вихідний код CMake - Mã nguồn CMake - CMake 源代码 - CMake 源碼 - - - - - - CSV document - مستند CSV - Dakument CSV - Документ — CSV - document CSV - Dokument CSV - CSV-dokument - CSV-Dokument - αρχείο CSV - CSV document - CSV-dokumento - documento CSV - CSV dokumentua - CSV-asiakirja - CSV skjal - document CSV - cáipéis CSV - documento CSV - מסמך CSV - CSV dokument - CSV dokumentum - Dokumen CSV - Documento CSV - CSV ドキュメント - CSV დოკუმენტი - CSV құжаты - CSV 문서 - CSV dokumentas - CSV dokuments - CSV-dokument - CSV-document - CSV-dokument - Dokument CSV - Documento CSV - Document CSV - документ CSV - Dokument CSV - Dokument CSV - Dokument CSV - CSV-dokument - документ CSV - Tài liệu CSV - CSV 文档 - CSV 文件 - CSV - Comma Separated Values - - - - - - - license terms - شروط الترخيص - licenzijnyja ŭmovy - Лицензни условия - condicions de llicència - Licenční podmínky - licensbetingelser - Lizenzbedingungen - όροι άδειας - licence terms - términos de licencia - lizentzia baldintzak - lisenssiehdot - loyvistreytir - termes de licence - téarmaí ceadúnais - termos de licenza - תנאי רישיון - uvjeti licence - licencfeltételek - persyaratan lisensi - Termini di licenza - ソフトウェアライセンス条項 - лицензиялық келісімі - 라이선스 조항 - licencijos sąlygos - licences nosacījumi - lisensbestemmelser - licentievoorwaarden - lisensvilkår - Warunki licencji - Termos de licença - termeni de licență - лицензионное соглашение - Licenčné podmienky - pogoji in dovoljenja uporabe - Kushte liçence - licensvillkor - ліцензійні умови - điều kiện giấy phép - 软件许可条款 - 授權條款 - - - - - author credits - شكر وتقدير المؤلف - zasłuhi aŭtara - Благодарности към авторите - atribucions d'autor - Autorské zásluhy - bidragydere - Autorendanksagung - author credits - reconocimiento de autoría - tekijöiden kiitokset - høvundaheiður - remerciements - admhálacha údar - créditos de autor - קרדיטים של היוצר - szerzők listája - kredit penulis - Riconoscimenti autori - ソフトウェア作者クレジット - бағдарлама авторлары - 저작자 크레딧 - padėkos autoriams - veidotāji - liste med bidragsytere - auteursinformatie - forfattarliste - Podziękowania autorów programu - Créditos do autor - mulțumiri autori - авторы программы - Autorské zásluhy - avtorske zasluge - Kreditë e autorëve - författarlista - подяки авторам програми - công trạng tác giả - 软件作者致谢 - 作者致謝名單 - - - - - C source code - شفرة مصدر سي - Kryničny kod C - Изходен код — C - codi font en C - Zdrojový kód v C - C-kildekode - C-Quelltext - πηγαίος κώδικας C - C source code - C-fontkodo - código fuente en C - C iturburu-kodea - C-lähdekoodi - C keldukota - code source C - cód foinseach C - código fonte en C - קוד מקור של C - C izvorni kod - C-forráskód - Kode program C - Codice sorgente C - C ソースコード - C-ის საწყისი კოდი - C бастапқы коды - C 소스 코드 - C pradinis kodas - C pirmkods - Kod sumber C - C-kildekode - C-broncode - C-kjeldekode - Kod źródłowy C - código fonte C - Código-fonte C - Cod sursă C - исходный код C - Zdrojový kód jazyka C - Datoteka izvorne kode C - Kod burues C - C изворни ко̂д - C-källkod - C kaynak kodu - вихідний код мовою C - Mã nguồn C - C 源代码 - C 源碼 - - - - - - - - - - - C# source code - شفرة مصدر سي# - Kryničny kod C# - Изходен код — C# - codi font en C# - Zdrojový kód v C# - C#-kildekode - C#-Quelltext - πηγαίος κώδικας C# - C# source code - C#-fontkodo - código fuente en C# - C# iturburu-kodea - C#-lähdekoodi - C# keldukota - code source C# - cód foinseach C# - código fonte en C# - קוד מקור של C# - C# izvorni kod - C#-forráskód - Kode program C# - Codice sorgente C# - C# ソースコード - C#-ის საწყისი კოდი - C# бастапқы коды - C# 소스 코드 - C# pradinis kodas - C# pirmkods - Kod sumber C# - C#-kildekode - C#-broncode - C#-kjeldekode - Kod źródłowy C# - código fonte C# - Código-fonte C# - Cod sursă C# - исходный код C# - Zdrojový kód jazyka C# - Datoteka izvorne kode C# - Kod burues C# - C# изворни ко̂д - C#-källkod - C# kaynak kodu - вихідний код мовою C# - Mã nguồn C# - C# 源代码 - C# 源碼 - - - - - Vala source code - شفرة مصدر Vala - Kryničny kod Vala - Изходен код — Vala - codi font en Vala - Zdrojový kód Vala - Valakildekode - Vala-Quelltext - πηγαίος κώδικας Vala - Vala source code - Vala-fontkodo - código fuente en Vala - Vala iturburu-kodea - Vala-lähdekoodi - Vala keldukota - code source Vala - cód foinseach Vala - código fonte en Vala - קוד מקור של Vala - Vala izvorni kod - Vala forráskód - Kode program Vala - Codice sorgente Vala - Vala ソースコード - Vala бастапқы коды - Vala 소스 코드 - Vala pradinis kodas - Vala pirmkods - Vala-kildekode - Vala-broncode - Vala-kjeldekode - Kod źródłowy Vala - Código-fonte Vala - Cod sursă Vala - исходный код Vala - Zdrojový kód Vala - Datoteka izvorne kode Vala - Kod burues Vala - Vala-källkod - Vala kaynak kodu - вихідний код мовою Vala - Mã nguồn Vala - Vala 源代码 - Vala 源碼 - - - - - - OOC source code - Изходен код — OOC - codi font en OOC - Zdrojový kód OOC - OOC-kildekode - OOC-Quellcode - πηγαίος κώδικας OOC - OOC source code - OOC-fontkodo - Código fuente en OOC - OOC-lähdekoodi - source code OOC - código fonte de OOC - קוד מקור של OOC - OOC izvorni kod - OOC forráskód - Kode sumber OOC - Codice sorgente OOC - OOC ソースコード - OOC-ის საწყისი კოდი - OOC бастапқы коды - OOC 소스 코드 - OOC pirmkods - OOC broncode - Kod źródłowy OOC - Código-fonte OOC - исходный код OOC - Izvorna koda OOC - OOC-källkod - вихідний код мовою OOC - OOC - OOC 源碼 - OOC - Out Of Class - - - - - DCL script - سكربت DCL - DCL skripti - Skrypt DCL - Скрипт — DCL - script DCL - Skript DCL - Sgript DCL - DCL-program - DCL-Skript - πρόγραμμα εντολών DCL - DCL script - DCL-skripto - script en DCL - DCL script-a - DCL-komentotiedosto - DCL boðrøð - script DCL - script DCL - script de DCL - תסריט DCL - DCL skripta - DCL-parancsfájl - Skrip DCL - Script DCL - DCL スクリプト - DCL სცენარი - DCL сценарийі - DCL 스크립트 - DCL scenarijus - DCL skripts - Skrip DCL - DCL-skript - DCL-script - DCL-skript - Skrypt DCL - 'script' DCL - Script DCL - Script DCL - сценарий DCL - Skript DCL - Skriptna datoteka DCL - Script DCL - DCL скрипта - DCL-skript - DCL betiği - скрипт DCL - Văn lệnh DCL - DCL 脚本 - DCL 指令稿 - DCL - Data Conversion Laboratory - - - - - DSSSL document - مستند DSSSL - DSSSL sənədi - Dakument DSSSL - Документ — DSSSL - document DSSSL - Dokument DSSSL - Dogfen DSSSL - DSSSL-dokument - DSSSL-Dokument - έγγραφο DSSSL - DSSSL document - DSSSL-dokumento - documento DSSSL - DSSSL dokumentua - DSSSL-asiakirja - DSSSL skjal - document DSSSL - cáipéis DSSSL - documento DSSSL - מסמך DSSSL - DSSSL dokument - DSSSL-dokumentum - Dokumen DSSSL - Documento DSSSL - DSSSL ドキュメント - DSSSL დოკუმენტი - DSSSL құжаты - DSSSL 문서 - DSSSL dokumentas - DSSSL dokuments - Dokumen DSSSL - DSSSL-dokument - DSSSL-document - DSSSL-dokument - Dokument DSSSL - documento DSSSL - Documento DSSSL - Document DSSSL - документ DSSSL - Dokument DSSSL - Dokument DSSSL - Dokument DSSSL - DSSSL документ - DSSSL-dokument - DSSSL belgesi - документ DSSSL - Tài liệu DSSSL - DSSSL 文档 - DSSSL 文件 - DSSSL - Document Style Semantics and Specification Language - - - - - D source code - شفرة مصدر D - Kryničny kod D - Изходен код — D - codi font en D - Zdrojový kód v D - D-kildekode - D-Quelltext - πηγαίος κώδικας D - D source code - D-fontkodo - código fuente en D - D iturburu-kodea - D-lähdekoodi - D keldukota - code source D - cód foinseach D - código fonte de D - קוד מקור לשפת D - D izvorni kod - D-forráskód - Kode program D - Codice sorgente D - D ソースコード - D-ის საწყისი კოდი - D бастапқы коды - D 소스 코드 - D pradinis kodas - D pirmkods - D-kildekode - D-broncode - D-kjeldekode - Kod źródłowy D - Código-fonte D - Cod sursă D - исходный код D - Zdrojový kód jazyka D - Datoteka izvorne kode D - Kod burues D - D изворни ко̂д - D-källkod - вихідний код мовою D - Mã nguồn D - D 源代码 - D 源碼 - - - - - - DTD file - ملف DTD - Fajł DTD - Документ — DTD - fitxer DTD - Soubor DTD - DTD-fil - DTD-Datei - αρχείο DTD - DTD file - DTD-dosiero - archivo DTD - DTD fitxategia - DTD-tiedosto - DTD fíla - fichier DTD - comhad DTD - ficheiro DTD - מסמך DTD - DTD datoteka - DTD fájl - Berkas DTD - File DTD - DTD ファイル - DTD ფაილი - DTD файлы - DTD 파일 - DTD failas - DTD datne - DTD-fil - DTD-bestand - DTD-fil - Plik DTD - Arquivo DTD - Fișier DTD - файл DTD - Súbor DTD - Datoteka DTD - File DTD - DTD-fil - DTD dosyası - файл DTD - Tập tin DTD - DTD 文件 - DTD 檔 - DTD - Document Type Definition - - - - - - - Eiffel source code - شفرة مصدر Eiffel - Kryničny kod Eiffel - Изходен код — Eiffel - codi font en Eiffel - Zdrojový kód Eiffel - Eiffelkildekode - Eiffel-Quelltext - πηγαίος κώδικας Eiffel - Eiffel source code - Eiffel-fontkodo - código fuente en Eiffel - Eiffel iturburu-kodea - Eiffel-lähdekoodi - Eiffel keldukota - code source Eiffel - cód foinseach Eiffel - código fone de Eiffel - קוד מקור של Eiffel - Eiffel izvorni kod - Eiffel forráskód - Kode program Eiffel - Codice sorgente Eiffel - Eiffel ソースコード - Eiffel-ის საწყისი კოდი - Eiffel бастапқы коды - Eiffel 소스 코드 - Eiffel pirminis programos tekstas - Eiffel pirmkods - Eiffel-kildekode - Eiffel-broncode - Eiffel-kjeldekode - Kod źródłowy Eiffel - Código-fonte Eiffel - Cod sursă Eiffel - исходный код Eiffel - Zdrojový kód Eiffel - Datoteka izvorne kode Eiffel - Kod burues Eiffel - Eiffel-källkod - Eiffel kaynak kodu - вихідний код мовою Eiffel - Mã nguồn Eiffel - Eiffel 源代码 - Eiffel 源碼 - - - - - - Emacs Lisp source code - شفرة مصدر Emacs Lisp - Emacs Lisp mənbə kodu - Kryničny kod Emacs Lisp - Изходен код — Emacs Lisp - codi font en Emacs Lisp - Zdrojový kód Emacs Lisp - Ffynhonnell rhaglen EMACS LISP - Emacs Lisp-kildekode - Emacs-Lisp-Quelltext - πηγαίος κώδικας Emacs Lisp - Emacs Lisp source code - fontkodo en Emacs Lisp - código fuente en Lisp de Emacs - Emacs Lisp iturburu-kodea - Emacs Lisp -lähdekoodi - Emacs Lisp keldukota - code source Emacs Lisp - cód foinseach Emacs Lisp - código fonte de Emacs Lisp - קוד מקור של Emcas Lisp - Emacs Lisp izvorni kod - Emacs Lisp-forráskód - Kode sumber Emacs Lisp - Codice sorgente Emacs Lisp - Emacs Lisp ソースコード - Emacs-ის Lisp საწყისი კოდი - Emacs Lisp бастапқы коды - Emacs Lisp 소스 코드 - Emacs Lisp pradinis kodas - Emacs Lisp pirmkods - Kod sumber Emacs Lisp - Emacs Lisp-kildekode - Emacs Lisp-broncode - Emacs Lisp kjeldekode - Plik źródłowy Emacs Lisp - código fonte Emacs Lisp - Código-fonte Lisp do Emacs - Cod sursă Emacs Lisp - исходный код Emacs Lisp - Zdrojový kód Emacs Lisp - Datoteka izvorne kode Emacs Lisp - Kod burues Emacs Lisp - Емакс Лисп изворни ко̂д - Emacs Lisp-källkod - Emacs Lisp kaynak kodu - вихідний код мовою Emacs Lisp - Mã nguồn Lisp Emacs - Emacs Lisp 源代码 - Emacs Lisp 源碼 - - - - - - - - - Erlang source code - شفرة مصدر Erlang - Kryničny kod Erlang - Изходен код — Erlang - codi font en Erlang - Zdrojový kód Erlang - Erlangkildekode - Erlang-Quelltext - πηγαίος κώδικας Erlang - Erlang source code - Erlang-fontkodo - código fuente en Erlang - Erlang iturburu-kodea - Erlang-lähdekoodi - Erlang keldukota - code source Erlang - cód foinseach Erlang - código fonte de Erlang - קוד מקור של Erlang - Erlang izvorni kod - Erlang forráskód - Kode program Erlang - Codice sorgente Erlang - Erlang ソースコード - Erlang-ის საწყისი კოდი - Erlang бастапқы коды - Erlang 소스 코드 - Erlang pradinis kodas - Erlang pirmkods - Erlang-kildekode - Erlang-broncode - Erlang-kjeldekode - Kod źródłowy Erlang - Código-fonte Erlang - Cod sursă Erlang - исходный код Erlang - Zdrojový kód Erlang - Datoteka izvorne kode Erlang - Kod burues Erlang - Erlang-källkod - Erlang kaynak kodu - вихідний код мовою Erlang - Mã nguồn Erlang - Erlang 源代码 - Erlang 源碼 - - - - - Fortran source code - شفرة مصدر Fortran - Fortran mənbə kodu - Kryničny kod Fortran - Изходен код — Fortran - codi font en Fortran - Zdrojový kód Fortran - Ffynhonnell rhaglen FORTRAN - Fortrankildekode - Fortran-Quelltext - πηγαίος κώδικας Fortran - Fortran source code - Fotran-fontkodo - código fuente en Fortran - Fortran-en iturburu-kodea - Fortran-lähdekoodi - Fortran keldukota - code source Fortran - cód foinseach Fortran - código fonte de Fortran - קוד מקור של Fortran - Fortran izvorni kod - Fortran-forráskód - Kode program Fortran - Codice sorgente Fortran - Fortran ソースコード - Fortran-ის საწყისი კოდი - Fortran бастапқы коды - 포트란 소스 코드 - Fortran pradinis kodas - Fortran pirmkods - kod sumber Fortran - Fortran-kildekode - Fortran-broncode - Fortran-kjeldekode - Kod źródłowy Fortran - código fonte Fortran - Código-fonte Fortran - Cod sursă Fortran - исходный код Fortran - Zdrojový kód Fortran - Datoteka izvorne kode Fortran - Kod burues Fortran - Фортран изворни ко̂д - Fortran-källkod - Fortran kaynak kodu - вихідний код мовою Fortran - Mã nguồn Fortran - Fortran 源代码 - Fortran 源碼 - - - - - - - - translation file - ملف الترجمة - fajł pierakładu - Превод - fitxer traducció - Soubor překladu - oversættelsesfil - Übersetzungsdatei - αρχείο μετάφρασης - translation file - tradukad-dosiero - archivo de traducción - itzulpen-fitxategia - käännöstiedosto - týðingarfíla - fichier de traduction - comhad aistrithe - ficheiro de tradución - קובץ תרגום - datoteka prijevoda - fordítási fájl - berkas terjemahan - File traduzione - 翻訳ファイル - თარგმნის ფაილი - аудармалар файлы - 번역 파일 - vertimo failas - tulkošanas datne - oversettelsesfil - vertalingsbestand - omsetjingsfil - Plik tłumaczenia - Arquivo de tradução - fișier traducere - файл переводов - Súbor prekladu - datoteka prevoda programa - File përkthimesh - översättningsfil - файл перекладу - tập tin dịch - 消息翻译文件 - 翻譯檔 - - - - - - - translation template - قالب الترجمة - šablon dla pierakładu - Шаблон за преводи - plantilla de traducció - Šablona překladu - oversættelsesskabelon - Übersetzungsvorlage - πρότυπο μετάφρασης - translation template - tradukad-ŝablono - plantilla de traducción - itzulpenen txantiloia - käännösmalli - týðingarformur - modèle de traduction - teimpléad aistrithe - plantilla de tradución - תבנית תרגום - predložak prijevoda - fordítási sablon - templat terjemahan - Modello di traduzione - 翻訳テンプレート - თარგმნის შაბლონი - аудармалар үлгісі - 메시지 번역 서식 - vertimo šablonas - tulkošanas veidne - mal for oversetting - vertalingssjabloon - omsetjingsmal - Szablon tłumaczenia - Modelo de tradução - șablon de traducere - шаблон переводов - Šablóna prekladu - predloga datoteke prevoda programa - Model përkthimesh - översättningsmall - шаблон перекладу - mẫu dịch - 消息翻译模板 - 翻譯模版 - - - - - - - - - HTML document - مستند HTML - Dakument HTML - Документ — HTML - document HTML - Dokument HTML - HTML-dokument - HTML-Dokument - έγγραφο HTML - HTML document - HTML-dokumento - documento HTML - HTML dokumentua - HTML-asiakirja - HTML skjal - document HTML - cáipéis HTML - documento HTML - מסמך HTML - HTML dokument - HTML dokumentum - Dokumen HTML - Documento HTML - HTML ドキュメント - HTML құжаты - HTML 문서 - HTML dokumentas - HTML dokuments - HTML-dokument - HTML-document - HTML-dokument - Dokument HTML - Documento HTML - Document HTML - документ HTML - Dokument HTML - Dokument HTML - Dokument HTML - HTML-dokument - документ HTML - Tài liệu HTML - HTML 文档 - HTML 文件 - HTML - HyperText Markup Language - - - - - - - - - - - - - - - - - - - - - - - - - Web application cache manifest - قائمة التخزين الموقت لتطبيق الويب - Манифест за кеша на уеб приложение - manifest de memòria cau d'aplicació Web - Manifest mezipaměti webové aplikace - Manifest for internetprogrammellemlager - Webanwendungscache-Manifest - Web application cache manifest - manifiesto de caché de aplicación web - Web aplikazioaren cache-aren agiria - Net nýtsluskipanarkova manifest - manifeste de cache d'application Web - lastliosta taisce d'fheidhmchlár Gréasáin - manifesto de caché de aplicativo web - הצהרה של מטמון של תוכנית ברשת - Webalkalmazás gyorsítótár-összefoglalója - Manifes singgahan aplikasi web - Manifesto cache applicazione Web - Web アプリケーションキャッシュ manifest - Веб қолданбасының кэш манифесті - 웹 애플리케이션 캐시 정의 - Žiniatinklio programos podėlio manifestas - Tīmekļa lietotņu keša manifests - Webapplicatie cache manifest - Manifest pamięci podręcznej aplikacji WWW - Manifest de cache de aplicação web - Manifest de cache pentru aplicații web - манифест кэша веб-приложения - Predpomnilnik spletnega programa - Cachemanifest för webbapplikation - маніфест кешу веб-програми - 网络应用程序缓存清单 - 網頁應用程式快取聲明 - - - - - - - - - - - - - Google Video Pointer - مؤشر فيديو جوجل - Pakazalnik Google Video - Документ-указател към видео на Google - apuntador a vídeo de Google - Google Video Pointer - Google Video-peger - Google Video Pointer - Google Video Pointer - lista de reproducción de Google Video (GVP) - Google Video-ren erreprodukzio-zerrenda - Google-video-osoitin - Google Video Pointer - pointeur vidéo Google - pointeoir Google Video - punteiro de vídeo de Google - מצביע וידאו של Google - Google Video Pointer - Google Video Pointer - Puntatore Google Video - Google ビデオポインター - Google Video Pointer - 구글 비디오 포인터 - Google Video Pointer - Google Video Pointer - Peker til Google Video - Google-videoverwijzing - Google Video-peikar - Lista odtwarzania Google Video - Ponteiro do Google Vídeo - Indicator Google Video - Google Video Pointer - Google Video Pointer - Kazalec Google Video - Puntues Google Video - Google Video-pekare - вказівник відео Google - Con trỏ ảnh động Google - Google 视频指向 - Google Video Pointer - - - - - - - - - Haskell source code - شفرة مصدر Haskell - Haskell mənbə kodu - Kryničny kod Haskell - Изходен код на Haskell - codi font en Haskell - Zdrojový kód Haskell - Ffynhonnell rhaglen Haskell - Haskellkildekode - Haskell-Quelltext - πηγαίος κώδικας Haskell - Haskell source code - Haskell-fontkodo - código fuente en Haskell - Haskell iturburu-kodea - Haskell-lähdekoodi - Haskell keldukota - code source Haskell - cód foinseach Haskell - código fonte de Haskell - קוד מקור של Haskell - Haskell izvorni kod - Haskell-forráskód - Kode program Haskell - Codice sorgente Haskell - Haskell ソースコード - Haskell бастапқы коды - Haskell 소스 코드 - Haskell pradinis kodas - Haskell pirmkods - Kod sumber Haskell - Haskell-kildekode - Haskell-broncode - Haskell-kjeldekode - Kod źródłowy Haskell - código fonte Haskell - Código-fonte Haskell - Cod sursă Haskell - исходный код Haskell - Zdrojový kód Haskell - Datoteka izvorne kode Haskell - Kod burues Haskell - Haskell изворни ко̂д - Haskell-källkod - вихідний код мовою Haskell - Mã nguồn Haskell - Haskell 源代码 - Haskell 源碼 - - - - - IDL document - مستند IDL - IDL sənədi - Dakument IDL - Документ — IDL - document IDL - Dokument IDL - Dogfen IDL - IDL-dokument - IDL-Dokument - έγγραφο IDL - IDL document - IDL-dokumento - documento IDL - IDL dokumentua - IDL-asiakirja - IDL skjal - document IDL - cáipéis IDL - documento IDL - מסמך IDL - IDL dokument - IDL-dokumentum - Dokumen IDL - Documento IDL - IDL ドキュメント - IDL құжаты - IDL 문서 - IDL dokumentas - IDL dokuments - Dokumen IDL - IDL-dokument - IDL-document - IDL-dokument - Dokument IDL - documento IDL - Documento IDL - Document IDL - документ IDL - Dokument IDL - Dokument IDL - Dokument IDL - IDL документ - IDL-dokument - документ IDL - Tài liệu IDL - IDL 文档 - IDL 文件 - IDL - Interface Definition Language - - - - - installation instructions - تعليمات التثبيت - instrukcyja dla instalavańnia - Инструкции за инсталация - instruccions d'instal·lació - Návod k instalaci - installationsinstruktioner - Installationsanleitung - οδηγίες εγκατάστασης - installation instructions - instrucciones de instalación - instalazioaren instrukzioak - asennusohjeet - innleggingar vegleiðing - instructions d'installation - treoracha suiteála - instrucións de instalación - הוראות התקנה - upute za instalaciju - telepítési utasítások - instruksi instalasi - Istruzioni di installazione - ソフトウェアインストール説明 - бағдарламаны орнату нұсқаулары - 설치 방법 - diegimo instrukcijos - instalācijas instrukcijas - installationsinstruksjoner - installatie-instructies - installasjonsinstruksjonar - Instrukcje instalacji - Instruções de instalação - instrucțiuni de instalare - инструкции по установке программы - Návod na inštaláciu - navodila namestitve - Udhëzime instalimi - installationsinstruktioner - інструкції з встановлення - hướng dẫn cài đặt - 软件安装指南 - 安裝指引 - - - - - Java source code - شفرة مصدر Java - Kryničny kod Java - Изходен код на Java - codi font en Java - Zdrojový kód v Javě - Javakildekode - Java-Quelltext - πηγαίος κώδικας Java - Java source code - Java-fontkodo - código fuente en Java - Java iturburu-kodea - Java-lähdekoodi - Java keldukota - code source Java - cód foinseach Java - código fonte de Java - קוד מקור ב־Java - Java izvorni kod - Java-forráskód - Kode program Java - Codice sorgente Java - Java ソースコード - Java бастапқы коды - 자바 소스 코드 - Java pradinis kodas - Java pirmkods - Kod sumber Java - Java-kildekode - Java-broncode - Java-kjeldekode - Kod źródłowy Java - código fonte Java - Código-fonte Java - Cod sursă Java - исходный код Java - Zdrojový kód Java - Datoteka izvorne kode Java - Kod burues Java - Јава изворни ко̂д - Java-källkod - Java kaynak kodu - вихідний код мовою Java - Mã nguồn Java - Java 源代码 - Java 源碼 - - - - - LDIF address book - دفتر عناوين LDIF - Adrasnaja kniha LDIF - Адресна книга — LDIF - llibreta d'adreces LDIF - Adresář LDIF - LDIF-adressebog - LDIF-Adressbuch - διευθυνσιολόγιο LDIF - LDIF address book - LDIF-adresaro - libreta de direcciones LDIF - LDIF helbide-liburua - LDIF-osoitekirja - LDIF adressubók - carnet d'adresses LDIF - leabhar sheoltaí LDIF - lista de enderezos LDIF - ספר כתובות של LDIF - LDIF adresar - LDIF címjegyzék - Buku alamat LDIF - Rubrica LDIF - LDIF アドレス帳 - LDIF адрестер кітабы - LDIF 주소록 - LDIF adresų knygelė - LDIF adrešu grāmata - LDIF-adressebok - LDIF-adresboek - LDIF-adressebok - Książka adresowa LDIF - Livro de endereços LDIF - Agendă LDIF - адресная книга LDIF - Adresár LDIF - Datoteka imenika naslovov LDIF - Rubrikë LDIF - LDIF-adressbok - LDIF adres defteri - адресна книга LDIF - Sổ địa chỉ LDIF - LDIF 地址簿 - LDIF 通訊錄 - LDIF - LDAP Data Interchange Format - - - - - - - - - Lilypond music sheet - صفحة موسيقى Lilypond - Muzyčny arkuš Lilypond - Нотация на Lilypond - full de música Lilypond - Notový papír Lilypond - Lilypondmusikkort - Lilypond-Notenblatt - παρτιτούρα Lilypond - Lilypond music sheet - partitura de LilyPond - Lilypond musika-orria - Lilypond-nuotit - Lilypond tónleika ark - partition musicale Lilypond - bileog cheoil Lilypond - folla de música de Lilypond - דף מוזיקה של Lilypond - Lilypond kotta - Lembar musik Lilypond - Partitura Lilypond - Lilypond 楽譜データ - Lilypond музыка тізімі - Lilypond 악보 - Lilypond muzikos lapas - Lilypond mūzikas lapa - Lilypond-muziekblad - Lilypond noteark - Plik partytury Lilypond - Partitura do Lilypond - Fișă muzică Lilypond - список музыки Lilypond - Notový papier Lilypond - Glasbena predloga Lilypond - Partiturë Lilypond - Lilypond-notblad - нотний запис Lilypond - Bản nhạc Lilypond - Lilypond 乐谱 - Lilypond 樂譜 - - - - - LHS source code - شفرة مصدر LHS - Kryničny kod LHS - Изходен код на LHS - codi font en LHS - Zdrojový kód v LHS - LHS-kildekode - LHS-Quelltext - πηγαίος κώδικας LHS - LHS source code - LHS-fontkodo - código fuente en LHS - LHS iturburu-kodea - LHS-lähdekoodi - LHS keld - code source LHS - cód foinseach LHS - código fonte en LHS - קוד מקור של LHS - LHS izvorni kod - LHS forráskód - Kode program LHS - Codice sorgente LHS - LHS ソースコード - LHS бастапқы коды - LHS 소스 코드 - LHS pradinis kodas - LHS pirmkods - LHS-kildekode - LHS-broncode - LHS-kjeldekode - Kod źródłowy LHS - Código-fonte LHS - Cod sursă LHS - исходный код LHS - Zdrojový kód LHS - Datoteka izvorne kode LHS - Kod burues LHS - LHS-källkod - LHS kaynak kodu - вихідний код LHS - Mã nguồn LHS - LHS 源代码 - LHS 源碼 - LHS - Literate Haskell source code - - - - - application log - سجل التطبيق - časopis aplikacyi - Файл-дневник на приложение - registre d'aplicació - Záznam aplikace - programlog - Anwendungsprotokoll - ημερολόγιο συμβάντων εφαρμογής - application log - protokolo de aplikaĵo - registro de aplicación - aplikazio egunkaria - sovelluksen lokitiedosto - nýtsluskipan logg - journal d'application - logchomhad feidhmchláir - rexistro de aplicativo - יומן התוכנה - alkalmazás naplója - log aplikasi - Log applicazione - アプリケーションログ - мәлімдемелер журналы - 프로그램 기록 - programos žurnalas - lietotnes žurnāls - Log aplikasi - applikasjonslogg - programma-logbestand - programlogg - Dziennik programu - registo de aplicação - Registro de aplicativo - înregistrare aplicație - журнал сообщений - Záznam aplikácie - dnevnik programa - log i mesazheve të programit - дневник програма - programlogg - uygulama günlüğü - журнал програми - bản ghi ứng dụng - 应用程序日志 - 程式紀錄檔 - - - - - Makefile - ملف Makefile - İnşa faylı - Makefile - Файл — make - Makefile - Makefile - Ffeil "make" - Bygningsfil - Makefile - Makefile - Makefile - Muntodosiero - Makefile - Makefile - Makefile - Makefile - makefile - Makefile - Makefile - Makefile - Makefile - Makefile - Makefile - Makefile - Makefile - Makefile (жинау файлы) - Makefile - Makefile - Makefile - Makefile - Makefile - Makefile - Makefile - Plik make - Makefile - Makefile (arquivo do make) - Makefile - Makefile (файл сборки) - Makefile - Datoteka Makefile - Makefile - Производна датотека - Makefil - файл проекту make - Tập tin tạo ứng dụng (Makefile) - Makefile - Makefile - - - - - - - - - - - - - Markdown document - Документ — Markdown - document Markdown - Dokument Markdown - Markdown-dokument - Markdown-Dokument - Markdown document - Documento de Markdown - Markdown-asiakirja - document Markdown - documento de Markdown - מסמך Markdown - Markdown dokument - Markdown dokumentum - Dokumen markdown - Documento Markdown - Markdown - Markdown құжаты - 마크다운 문서 - Markdown dokuments - Markdown document - Dokument Markdown - Documento Markdown - документ Markdown - Dokument Markdown - документ Markdown - Markdown 文档 - Markdown 文件 - - - - - - - Qt MOC file - ملف Qt MOC - Fajł Qt MOC - Файл — Qt MOC - fitxer MOC de Qt - Soubor Qt MOC - Qt MOC-fil - Qt-MOC-Datei - αρχείο Qt MOC - Qt MOC file - archivo MOC Qt - Qt MOC fitxategia - Qt MOC -tiedosto - Qt MOC fíla - fichier Qt MOC - comhad MOC Qt - ficheiro MOC Qt - קובץ Qt MOC - Qt MOC datoteka - Qt MOC fájl - Berkas Qt MOC - File MOC Qt - Qt MOC ファイル - Qt MOC файлы - Qt MOC 파일 - Qt MOC failas - Qt MOC datne - Qt MOC-fil - Qt MOC-bestand - Qt MOC-fil - Plik Qt MOC - Arquivo Qt MOC - Fișier Qt MOC - файл Qt MOC - Súbor Qt MOC - Datoteka Qt MOC - File Qt MOC - Qt MOC-fil - файл-метаоб'єкт Qt - Tập tin MOC của Qt - Qt 元对象编译文件 - Qt MOC 檔 - Qt MOC - Qt Meta Object Compiler - - - - - Windows Registry extract - استخراج مسجل ويندوز - Element rehistru Windows - Извадка от регистъра на Windows - extracte del registre de Windows - Část registrů Windows - Windows Registy-udtrækning - Windows-Registry-Auszug - αποσυμπίεση Windows Registry - Windows Registry extract - extracto del registro de Windows - Windows-eko erregistro erauzlea - Windows-rekisteritietue - Windows Registry úrdráttur - extrait de registre Windows - sliocht as Clárlann Windows - Extracto do rexistro de Windows - קובץ Registry של Windows - Windows Registry kivonat - Ekstrak Windows Registry - Estratto Windows Registry - WIndows レジストリ抽出ファイル - Windows Registry бөлігі - Windows 레지스트리 파일 - Windows registro ištrauka - Windows Registry izvilkums - Utdrag av Windows Registry - Windows Registry-extract - Windows Registry-utdrag - Wycinek rejestru Windows - Extrator de registro do Windows - Extras al registrului Windows - фрагмент Windows Registry - Časť registrov Windows - izvleček vpisnika Windows - Pjesë Windows Registry - Windows Registry-utdrag - частина реєстру Windows - Bản trích Registry Windows - Windows 注册表文件 - Windows Registry 抽出 - - - - - - - - - - Managed Object Format - صيغة كائن مدار - Farmat Managed Object - Управлявани обекти — MOF - format d'objecte gestionat - Managed Object Format - Håndteret objektformat - Managed Object Format - Μορφή Διαχειριζόμενου Αντικειμένου - Managed Object Format - formato de objeto manejado - Kudeatutako objektu formatua - Managed Object Format - format Managed Object - formáid réada bainistithe - formato de obxecto xestionado - פורמט ניהול אובייקט - Felügyelt objektum (MO) formátum - Managed Object Format - Managed Object Format - 管理オブジェクトフォーマット - Басқарылатын объект пішімі - 관리되는 오브젝트 형식 - Sutvarkytų objektų formatas - Pārvaldītu objektu formāts - Managed Object Format - Managed Object Format - Managed Object Format - Plik Managed Object Format - Formato de objeto gerenciado - Managed Object Format - формат управляемого объекта - Formát Managed Object - Datoteka Managed Object - Managed Object Format - Managed Object Format - формат керування об’єктами - Định dạng Đối tượng đã Quản lý - 托管对象格式 - Managed Object Format - - - - - Mup publication - منشور Mup - Publikacyja Mup - Издание — Mup - publicació Mup - Publikace Mup - Mupudgivelse - Mup-Veröffentlichung - δημοσίευση Mup - Mup publication - publicación Mup - Mup publikazioa - Mup-julkaisu - Mup útgáva - publication Mup - foilseachán Mup - publicación Mup - פרסום של Mup - Mup publikáció - Publikasi Mup - Pubblicazione Mup - Mup 出版ファイル - Mup жариялымы - Mup 출판물 - Mup leidinys - Mup publikācija - Mup publikasjon - Mup-publicatie - Mup-publikasjon - Publikacja Mup - Publicação do Mup - Publicație Mup - публикация Mup - Publikácie Mup - Datoteka objave Mup - Publikim Mup - Mup-publicering - публікація Mup - Bản xuất Mup - Mup 应用程序 - Mup 出版品 - - - - - - - - - Objective-C source code - شفرة مصدر الهدف-C - Kryničny kod Objective-C - Изходен код — Objective C - codi font en Objective-C - Zdrojový kód v Objective-C - Objektiv C-kildekode - Objective-C-Quelltext - πηγαίος κώδικας Objective-C - Objective-C source code - fontkodo en Objective-C - código fuente en Objective-C - Objective-C iturburu-kodea - Objective-C-lähdekoodi - Objective-C keldukota - code source Objective-C - cód foinseach Objective-C - código fonte de Objective-C - קוד מקור של Objective-C - Objective-C forráskód - Kode program Objective-C - Codice sorgente Objective-C - Objective-C ソースコード - Objective-C-ის საწყისი კოდი - Objective-C бастапқы коды - Objective-C 소스 코드 - Objective-C pradinis kodas - Objective-C pirmkods - Kod sumber Objective-C - Objective-C-kildekode - Objective-C-broncode - Objective-C-kjeldekode - Kod źródłowy Objective-C - código fonte Objective-C - Código-fonte Objective-C - Cod sursă Objective-C - исходный код Objective-C - Zdrojový kód Objective-C - Datoteka izvorne kode Objective-C - Kod burues C objekt - Објектни-C изворни ко̂д - Objective-C-källkod - вихідний код мовою Objective-C - Mã nguồn Objective-C - Objective-C 源代码 - Objective-C 源碼 - - - - - - - - OCaml source code - شفرة مصدر OCaml - Kryničny kod OCaml - Изходен код — OCaml - codi font en OCaml - Zdrojový kód OCaml - OCaml-kildekode - OCaml-Quelltext - πηγαίος κώδικας OCaml - OCaml source code - OCaml-fontkodo - código fuente en OCaml - OCaml iturburu-kodea - OCaml-lähdekoodi - OCaml keldukota - code source OCaml - cód foinseach OCaml - código fonte de OCaml - קוד מקור של OCaml - OCaml izvorni kod - OCaml forráskód - Kode program OCaml - Codice sorgente OCaml - OCaml ソースコード - OCaml бастапқы коды - OCaml 소스 코드 - OCaml pradinis kodas - OCaml pirmkods - OCaml-kildekode - OCaml-broncode - OCaml-kjeldekode - Kod źródłowy OCaml - Código-fonte OCaml - Cod sursă OCaml - исходный код OCaml - Zdrojový kód OCaml - Datoteka izvorne kode OCaml - Kod burues OCaml - OCaml-källkod - OCaml kaynak kodu - первинний код мовою OCaml - Mã nguồn OCaml - OCaml 源代码 - OCaml 源碼 - - - - - MATLAB script/function - سكربت/وظيفة MATLAB - Skrypt/funkcyja MATLAB - Скрипт/функция — MATLAB - script/funció MATLAB - Skript/funkce MATLAB - MATLAB-program/-funktion - MATLAB-Skript/-Funktion - δέσμη εντολών / συνάρτηση MATLAB - MATLAB script/function - script/función de MATLAB - MATLAB script/funtzioa - MATLAB-komentotiedosto/funktio - MATLAB boðrøð/funka - script/fonction MATLAB - script/feidhm MATLAB - función/script de MATLAB - תסריט/פונקציית MATLAB - MATLAB skripta/funkcija - MATLAB parancsfájl/funkció - Skrip/fungsi MATLAB - Script/Funzione MATLAB - MATLAB スクリプト/関数 - MATLAB сценарий/функциясы - MATLAB 스크립트/함수 - MATLAB scenarijus / funkcija - MATLAB skripts/funkcija - Skript/funksjon for MATLAB - MATLAB-script/functie - MATLAB-skript/funksjon - Skrypt/funkcja MATLAB - Script/função do MATLAB - Funcție/script MATLAB - сценарий/функция MATLAB - Skript/funkcia MATLAB - Skriptna datoteka MATLAB - Script/Funksion MATLAB - MATLAB-skript/funktion - скрипт/функція MATLAB - Văn lệnh/chức năng MATLAB - MATLAB 脚本/函数 - MATLAB 指令稿/函式 - - - - - - - - - - - - - - - Modelica model - - - - - - - - - - - - - - - - - - - - Pascal source code - شفرة مصدر باسكال - Kryničny kod Pascal - Изходен код — Pascal - codi font en Pascal - Zdrojový kód v Pascalu - Pascalkildekode - Pascal-Quelltext - πηγαίος κώδικας Pascal - Pascal source code - Pascal-fontkodo - código fuente en Pascal - Pascal iturburu-kodea - Pascal-lähdekoodi - Pascal keldukota - code source Pascal - cód foinseach Pascal - código fonte en Pascal - קוד מקור של Pascal - Pascal-forráskód - Kode program Pascal - Codice sorgente Pascal - Pascal ソースコード - Pascal бастапқы коды - 파스칼 소스 코드 - Pascal pradinis kodas - Pascal pirmkods - Kod sumber Pascal - Pascal-kildekode - Pascal-broncode - Pascal-kjeldekode - Kod źródłowy Pascal - código fonte Pascal - Código-fonte Pascal - Cod sursă Pascal - исходный код Pascal - Zdrojový kód Pascal - Datoteka izvorne kode Pascal - Kod burues Pascal - Паскал изворни ко̂д - Pascal-källkod - Pascal kaynak kodu - вихідний код мовою Pascal - Mã nguồn Pascal - Pascal 源代码 - Pascal 源碼 - - - - - - differences between files - الاختلافات بين الملفات - adroźnieńni pamiž fajłami - Разлики между файлове - diferències entre fitxers - Rozdíly mezi soubory - forskel mellem filer - Unterschiede zwischen Dateien - διαφορές μεταξύ αρχείων - differences between files - diferencoj inter dosieroj - diferencias entre archivos - fitxategien arteko ezberdintasunak - tiedostojen väliset erot - munur millum fílur - différences entre fichiers - difríochtaí idir chomhaid - diferenzas entre ficheiros - ההבדל בין קבצים - razlike između datoteka - diff-különbségfájl - perbedaan diantara berkas - Differenze tra file - ファイル間差分 - файлдар арасындағы айырмашылықтары - 파일 사이의 차이점 - skirtumai tarp failų - divu datņu atšķirība - Perbezaan antara fail - forskjeller mellom filer - verschillen tussen bestanden - skilnader mellom filer - Różnica pomiędzy plikami - diferenças entre ficheiros - Diferenças entre arquivos - diferențe între fișiere - различия между файлами - Rozdiely medzi súbormi - razlike med datotekami - Diferencë midis file - разлике међу датотекама - skillnader mellan filer - різниця між файлами - khác biệt giữa các tập tin - 文件的区别 - 檔案內容差異 - - - - - - - - - - - - - - - - - - - Go source code - Изходен код — Go - codi font en Go - Zdrojový kód Go - Go-kildekode - Go-Quellcode - πηγαίος κώδικας Go - Go source code - Go-fontkodo - Ir al código fuente - Go-lähdekoodi - code source Go - código fonte de Go - קוד מקור של Go - Go izvorni kod - Go forráskód - Kode sumber Go - Codice sorgente Go - Go ソースコード - Go-ის საწყისი კოდი - Go бастапқы коды - Go 소스 코드 - Go pirmkods - Go broncode - Kod źródłowy Go - Código-fonte Go - исходный код Go - Izvorna koda Go - вихідний код мовою Go - Go - Go 源碼 - - - - - Python script - سكربت بايثون - Skrypt Python - Скрипт — Python - script Python - Skript v Pythonu - Pythonprogram - Python-Skript - πρόγραμμα εντολών Python - Python script - Python-skripto - script en Python - Python script-a - Python-komentotiedosto - Python boðrøð - script Python - script Python - Script en Python - תסריט Python - Python skripta - Python-parancsfájl - Skrip Python - Script Python - Python スクリプト - Python сценарийі - 파이썬 스크립트 - Python scenarijus - Python skripts - Skrip Python - Python-skript - Python-script - Python-skript - Skrypt Python - 'script' Python - Script Python - Script Python - сценарий Python - Skript Python - Skriptna datoteka Python - Script Python - Питон скрипта - Pythonskript - скрипт мовою Python - Văn lệnh Python - Python 脚本 - Python 指令稿 - - - - - - - - - - - - - - - - - - - - Lua script - سكربت Lua - Skrypt Lua - Скрипт на Lua - script Lua - Skript Lua - Luaprogram - Lua-Skript - δέσμη εντολών Lua - Lua script - Lua-skripto - script en Lua - Lua script-a - Lua-komentotiedosto - Lua boðrøð - script Lua - script Lua - script de Lua - תסריט Lua - Lua skripta - Lua parancsfájl - Skrip Lua - Script Lua - Lua スクリプト - Lua сценарийі - Lua 스크립트 - Lua scenarijus - Lua skripts - Lua-skript - Lua-script - Lua-skript - Skrypt Lua - Script Lua - Script Lua - сценарий Lua - Skript Lua - Skriptna datoteka Lua - Script Lua - Lua-skript - скрипт Lua - Văn lệnh Lua - Lua 脚本 - Lua 指令稿 - - - - - - - - - - - - README document - مستند README - README sənədi - Dakument README - Документ — „Да се прочете“ - document README - Dokument README - Dogfen README - README-dokument - README-Dokument - έγγραφο README - README document - README-dokumento - documento README - README dokumentua - LUEMINUT-asiakirja - README skjal - document LISEZ-MOI - cáipéis README - documento README - מסמך README - README dokument - README-dokumentum - Dokumen README - Documento README - README ドキュメント - README құжаты - README 문서 - README dokumentas - README dokuments - Dokumen README - README-dokument - LEESMIJ-document - README-dokument - Dokument README - documento LEIA-ME - Documento README - Document README - документ README - Dokument README - Dokument README - Dokument README - ПРОЧИТАЈМЕ документ - README-dokument - документ README - Tài liệu Đọc Đi (README) - README 文档 - README 說明文件 - - - - - NFO document - مستند NFO - Dakument NFO - Документ — NFO - document NFO - Dokument NFO - NFO-dokument - NFO-Dokument - έγγραφο NFO - NFO document - NFO-dokumento - documento NFO - NFO dokumentua - NFO-asiakirja - NFO skjal - document NFO - cáipéis NFO - documento NFO - מסמך NFO - NFO dokument - NFO-dokumentum - Dokumen NFO - Documento NFO - NFO ドキュメント - NFO құжаты - NFO 문서 - NFO dokumentas - NFO dokuments - NFO-dokument - NFO-document - NFO-dokument - Dokument NFO - Documento NFO - Document NFO - документ NFO - Dokument NFO - Dokument NFO - Dokument NFO - NFO-dokument - NFO belgesi - документ NFO - Tài liệu NFO - NFO 文档 - NFO 文件 - - - - - RPM spec file - ملف مواصفات RPM - Specyfikacyjny fajł RPM - Файл — спецификация за RPM - fitxer spec RPM - Soubor spec RPM - RPM spec-fil - RPM-Spezifikationsdatei - αρχείο spec RPM - RPM spec file - archivo de especificaciones RPM - RPM espezifikazio fitxategia - RPM spec -tiedosto - RPM tøknilýsingarfíla - fichier de spécification RPM - comhad spec RPM - ficheiro de especificacións RPM - קובץ מפרט RPM - RPM spec fájl - Berkas spesifikasi RPM - File specifica RPM - RPM spec ファイル - RPM анықтама файлы - RPM spec 파일 - RPM spec failas - RPM specifikācijas datne - RPM-spesifikasjonsfil - RPM-spec-bestand - RPM spec-fil - Plik spec RPM - Arquivo de especificação RPM - Fișier RPM spec - файл описания RPM - Súbor RPM spec - Določilna datoteka RPM - File specifikimi RPM - RPM spec-fil - spec-файл RPM - Tập tin đặc tả RPM - RPM spec 文件 - RPM spec 規格檔 - RPM - Red Hat Package Manager - - - - - - - - - Scala source code - Изходен код — Scala - codi font en Scala - Zdrojový kód Scala - Scala-kildekode - Scala-Quellcode - πηγαίος κώδικας Scala - Scala source code - Código fuente en Scala - Scala-lähdekoodi - code source Scala - código fnote en Scala - קוד מקור של Scala - Scala izvorni kod - Scala forráskód - Kode sumber Scala - Codice sorgente Scala - Scala ソースコード - Scala-ის საწყისი კოდი - Scala бастапқы коды - Scala 소스 코드 - Scala pirmkods - Scala broncode - Kod źródłowy Scala - Código-fonte Scala - исходный код Scala - Izvorna koda Scala - Scala-källkod - вихідний код мовою Scala - Scala 源代码 - Scala 源碼 - - - - - Scheme source code - شفرة مصدر Scheme - Sxem mənbə kodu - Kryničny kod Scheme - Изходен код — Scheme - codi font en Scheme - Zdrojový kód Scheme - Ffynhonnell Rhaglen Scheme - Schemekildekode - Scheme-Quelltext - πηγαίος κώδικας Scheme - Scheme source code - Scheme-fontkodo - código fuente en Scheme - Scheme iturburu-kodea - Scheme-lähdekoodi - Scheme keldukota - code source Scheme - cód foinseach Scheme - código fonte en Scheme - קוד מקור של Scheme - Scheme izvorni kod - Scheme-forráskód - Kode program Scheme - Codice sorgente Scheme - Scheme ソースコード - Scheme бастапқы коды - Scheme 소스 코드 - Scheme pradinis kodas - Scheme pirmkods - Kod sumber Scheme - Scheme-kildekode - Scheme-broncode - Scheme-kjeldekode - Kod źródłowy Scheme - código fonte Scheme - Código-fonte Scheme - Cod sursă Scheme - исходный код Scheme - Zdrojový kód Scheme - Datoteka izvorne kode Scheme - Kod burues Scheme - Scheme изворни ко̂д - Scheme-källkod - Scheme kaynak kodu - вихідний файл мовою Scheme - Mã nguồn Scheme - Scheme 源代码 - Scheme 源碼 - - - - - - Setext document - مستند Setext - Setext sənədi - Dakument Setext - Документ — Setext - document Setext - Dokument Setext - Dogfen Setext - Setextdokument - Setext-Dokument - έγγραφο Setext - Setext document - Setext-dokumento - documento Setext - Setext dokumentua - Setext-asiakirja - Setext skjal - document Setext - cáipéis Setext - documento Settext - מסמך של Setext - Setext dokument - Setext-dokumentum - Dokumen Setext - Documento Setext - Setext ドキュメント - Setext құжаты - Setext 문서 - Setext dokumentas - Setext dokuments - Dokumen Setext - Setext-dokument - Setext-document - Setext-dokument - Dokument Setext - documento Setext - Documento Setext - Document Setext - документ Setext - Dokument Setext - Dokument Setext - Dokument Setext - Setext документ - Setext-dokument - Setext belgesi - документ Setext - Tài liệu Setext - Setext 文档 - Setext 文件 - - - - - SQL code - شفرة SQL - SQL kodu - Kod SQL - Код — SQL - codi en SQL - Kód SQL - Côd SQL - SQL-kode - SQL-Befehle - κώδικας SQL - SQL code - SQL-kodo - código SQL - SQL kodea - SQL-koodi - SQL kota - code SQL - cód SQL - código SQL - קוד SQL - SQL kod - SQL-kód - Kode SQL - Codice SQL - SQL コード - SQL коды - SQL 코드 - SQL kodas - SQL kods - Kod SQL - SQL-kildekode - SQL-code - SQL-kode - Kod SQL - código SQL - Código SQL - Cod SQL - код SQL - Kód SQL - Datoteka kode SQL - Kod SQL - SQL ко̂д - SQL-kod - SQL kodu - код SQL - Mã SQL - SQL 代码 - SQL 代碼 - - - - - - Tcl script - سكربت Tcl - Skrypt Tcl - Скрипт — Tcl - script Tcl - Skript v Tcl - Tcl-program - Tcl-Skript - πρόγραμμα εντολών Tcl - Tcl script - Tcl-skripto - script en Tcl - Tcl script-a - Tcl-komentotiedosto - Tcl boðrøð - script Tcl - script Tcl - Script en Tcl - תסריט Tcl - Tcl skripta - Tcl-parancsfájl - Skrip Tcl - Script Tcl - Tcl スクリプト - Tcl сценарийі - Tcl 스크립트 - Tcl scenarijus - Tcl skripts - Skrip Tcl - Tcl-skript - Tcl-script - Tcl-skript - Skrypt Tcl - 'script' Tcl - Script Tcl - Script Tcl - сценарий Tcl - Skript Tcl - Skriptna datoteka Tcl - Script Tcl - Tcl скрипта - Tcl-skript - скрипт Tcl - Văn lệnh Tcl - Tcl 脚本 - Tcl 描述語言檔 - - - - - - TeX document - مستند TeX - Dakument TeX - Документ — TeX - document TeX - Dokument TeX - Dogfen TeX - TeX-dokument - TeX-Dokument - έγγραφο TeX - TeX document - TeX-dokumento - documento TeX - TeX dokumentua - TeX-asiakirja - TeX skjal - document TeX - cáipéis TeX - documenton TeX - מסמך TeX - TeX dokument - TeX-dokumentum - Dokumen TeX - Documento TeX - TeX ドキュメント - TeX құжаты - TeX 문서 - TeX dokumentas - TeX dokuments - Dokumen TeX - TeX-dokument - TeX-document - TeX-dokument - Dokument TeX - documento TeX - Documento TeX - Document TeX - документ TeX - Dokument TeX - Dokument TeX - Dokument TeX - ТеХ документ - TeX-dokument - TeX belgesi - документ TeX - Tài liệu TeX - TeX 文档 - TeX 文件 - - - - - - - - - - - - - - - - - - TeXInfo document - مستند TeXInfo - TeXInfo sənədi - Dakument TeXInfo - Документ — TeXInfo - document TeXInfo - Dokument TeXInfo - Dogfen TeXInfo - TeXInfo-dokument - TeXInfo-Dokument - έγγραφο TeXInfo - TeXInfo document - TeXInfo-dokumento - documento TeXInfo - TeXInfo dokumentua - TeXInfo-asiakirja - TeXInfo skjal - document TeXInfo - cáipéis TeXInfo - documento TeXInfo - מסמך של TeXInfo - TeXInfo dokument - TeXInfo-dokumentum - Dokumen TeXInfo - Documento TeXInfo - TeXInfo ドキュメント - TeXInfo құжаты - TeXInfo 문서 - TeXInfo dokumentas - TeXInfo dokuments - Dokumen TeXInfo - TeXInfo-dokument - TeXInfo-document - TeXInfo-dokument - Dokument TeXInfo - documento TeXInfo - Documento TeXInfo - Document TexInfo - документ TeXInfo - Dokument TeXInfo - Dokument TeXInfo - Dokument TeXInfo - ТеХинфо документ - TeXInfo-dokument - TeXInfo belgesi - документ TeXInfo - Tài liệu TeXInfo - TeXInfo 文档 - TeXInfo 文件 - - - - - - Troff ME input document - مستند Troff ME input - Uvodny dakument Troff ME - Изходен документ — Troff ME - document d'entrada Troff ME - Vstupní dokument Troff ME - Troff ME inddata-dokument - Troff-ME-Eingabedokument - έγγραφο/πρόγραμμα εντολών troff ME - Troff ME input document - eniga dokumento de Troff ME - documento de entrada Troff ME - Troff ME sarrerako dokumentua - Troff ME -syöteasiakirja - Troff ME inntaksskjal - document d'entrée Troff ME - cáipéis ionchur Troff ME - documento de entrada Troff ME - מסמך קלט של Troff ME - Troff ME ulazni dokument - Troff ME bemeneti dokumentum - Dokumen masukan Troff ME - Documento di input Troff ME - Troff ME 入力ドキュメント - Troff ME кіріс құжаты - Troff ME 입력 문서 - Troff ME įvesties dokumentas - Troff ME ievades dokuments - Dokumen input Troff ME - Troff ME-inndatadokument - Troff ME-invoerdocument - Troff ME inndata-dokument - Dokument wejściowy Troff ME - documento origem Troff ME - Documento de entrada Troff ME - Document intrare Troff ME - входной документ Troff ME - Vstupný dokument Troff ME - Vnosni dokument Troff ME - Dokument i input Troff ME - Troff ME улазни документ - Troff ME-indatadokument - Troff ME girdi belgesi - вхідний документ Troff ME - Tài liệu nhập ME Troff - Troff ME 输入文档 - Troff ME 輸入文件 - - - - - Troff MM input document - مستند Troff MM input - Uvodny dakument Troff MM - Изходен документ — Troff MM - document d'entrada Troff MM - Vstupní dokument Troff MM - Troff MM inddata-dokument - Troff-MM-Eingabedokument - έγγραφο/πρόγραμμα εντολών troff MM - Troff MM input document - eniga dokumento de Troff MM - documento de entrada Troff MM - Troff MM sarrerako dokumentua - Troff MM -syöteasiakirja - Troff MM inntaksskjal - document d'entrée Troff MM - cáipéis ionchur Troff MM - documento de entrada Troff MM - מסמך קלט של Troff MM - Troff MM ulazni dokument - Troff MM bemeneti dokumentum - Dokumen masukan Troff MM - Documento di input Troff MM - Troff MM 入力ドキュメント - Troff MM кіріс құжаты - Troff MM 입력 문서 - Troff MM įvesties dokumentas - Troff MM ievades dokuments - Dokumen input Troff MM - Troff MM-inndatadokument - Troff MM-invoerdocument - Troff MM inndata-dokument - Dokument wejściowy Troff MM - documento origem Troff MM - Documento de entrada Troff MM - Document intrare Troff MM - входной документ Troff MM - Vstupný dokument Troff MM - Vnosni dokument Troff MM - Dokument i input Troff MM - Troff MM улазни документ - Troff MM-indatadokument - Troff MM girdi belgesi - вхідний документ Troff MM - Tài liệu nhập MM Troff - Troff MM 输入文档 - Troff MM 輸入文件 - - - - - Troff MS input document - مستند Troff MS input - Uvodny dakument Troff MS - Изходен документ — Troff MS - document d'entrada Troff MS - Vstupní dokument Troff MS - Troff MS inddata-dokument - Troff-MS-Eingabedokument - έγγραφο/πρόγραμμα εντολών troff MS - Troff MS input document - eniga dokumento de Troff MS - documento de entrada Troff MS - Troff MS sarrerako dokumentua - Troff MS -syöteasiakirja - Troff MS inntaksskjal - document d'entrée Troff MS - cáipéis ionchur Troff MS - documento de entrada Troff MS - מסמך קלט של Troff MS - Troff MS ulazni dokument - Troff MS bemeneti dokumentum - Dokumen masukan Troff MS - Documento di input Troff MS - Troff MS 入力ドキュメント - Troff MS кіріс құжаты - Troff MS 입력 문서 - Troff MS įvesties dokumentas - Troff MS ievades dokuments - Dokumen input Troff MS - Troff MS-inndatadokument - Troff MS-invoerdocument - Troff MS inndata-dokument - Dokument wejściowy Troff MS - documento origem Troff MS - Documento de entrada Troff MS - Document intrare Troff MS - входной документ Troff MS - Vstupný dokument Troff MS - Vnosni dokument Troff MS - Dokument i input Troff MS - Troff MS улазни документ - Troff MS-indatadokument - Troff MS girdi belgesi - вхідний документ Troff MS - Tài liệu nhập MS Troff - Troff MS 输入文档 - Troff MS 輸入文件 - - - - - X-Motif UIL table - جدول X-Motif UIL - Tablica X-Motif UIL - Таблица — X-Motif UIL - taula UIL de X-Motif - Tabulka X-Motif UIL - X-Motif UIL-tabel - X-Motif-UIL-Tabelle - πίνακας X-Motif UIL - X-Motif UIL table - tabla de X-Motif UIL - X-Motif UIL taula - X-Motif UIL -taulukko - X-Motif UIL talva - table X-Motif UIL - tábla X-Motif UIL - Táboa de X-Motif UIL - טבלה של X-Motif UIL - X-Motif UIL tablica - X-Motif UIL-táblázat - Tabel X-Motif UIL - Tabella UIL X-Motif - X-Motif UIL 表 - X-Motif UIL кестесі - X-Motif UIL 테이블 - X-Motif UIL lentelė - X-Motif UIL tabula - Jadual X-Motif UIL - X-Motif UIL-tabell - X-Motif UIL-tabel - X-Motif UIL-tabell - Tabela UIL X-Motif - tabela UIL do X-Motif - Tabela UIL do X-Motif - Tabel X-Motif UIL - таблица UIL X-Motif - Tabuľka X-Motif UIL - Preglednica X-Motif UIL - Tabelë X-Motif UIL - X-Motif UIL табела - X-Motif UIL-tabell - таблиця X-Motif UIL - Bảng UIL X-Motif - X-Motif UIL 表 - X-Motif UIL 表格 - - - - - resource location - موقع المورد - pałažeńnie resursu - Местоположение на ресурс - localització de recurs - Umístění zdroje - resurseplacering - Ressourcenort - τοποθεσία πόρου - resource location - loko de risurco - ubicación del recurso - baliabidearen kokalekua - resurssisijainti - tilfeingisstaður - localisation de ressource - suíomh acmhainne - localización do recurso - מיקומו של המקור - položaj resursa - erőforrás-hely - lokasi sumber daya - Posizione risorsa - リソースの場所 - ресурс орналасуы - 자원 위치 - resurso vieta - resursa atrašanās vieta - Lokasi sumber - ressurslokasjon - bronlocatie - ressursplassering - Położenie zasobu - localização de recurso - Localização de recurso - locație de resursă - расположение ресурса - Umiestnenie zdroja - mesto vira - Pozicion rezerve - путања ресурса - resursplats - розташування ресурсу - địa điểm tài nguyên - 资源位置 - 資源位置 - - - - - uuencoded file - - - - - - - - - XMI file - ملف XMI - Fajł XMI - Файл — XMI - fitxer XMI - Soubor XMI - XMI-fil - XMI-Datei - αρχείο XML - XMI file - XMI-dosiero - archivo XMI - XMI fitxategia - XMI-tiedosto - XMI fíla - fichier XMI - comhad XMI - ficheiro XMI - קובץ XMI - XMI datoteka - XMI fájl - Berkas XMI - File XMI - XMI ファイル - XMI файлы - XMI 파일 - XMI failas - XMI datne - XMI-fil - XMI-bestand - XMI-fil - Plik XMI - Arquivo XMI - Fișier XMI - файл XMI - Súbor XMI - Datoteka XMI - File XMI - XMI-fil - файл XMI - Tập tin XMI - XMI 文件 - XMI 檔 - XMI - XML Metadata Interchange - - - - - - - XSL FO file - ملف XSL FO - Fajł XSL FO - Форматиращ файл — XSL FO - fitxer FO XSL - Soubor XSL FO - XML FO-fil - XSL-FO-Datei - αρχείο XSL FO - XSL FO file - XSL-FO-dosiero - archivo XSL FO - XSL FO fitxategia - XSL FO -tiedosto - XSL FO fíla - fichier XSL FO - comhad XSL FO - ficheiro XSL FO - קובץ XSL FO - XSL FO datoteka - XSL FO fájl - Berkas XSL FO - File XSL FO - XSL FO ファイル - XSL FO файлы - XSL 포매팅 개체 파일 - XSL FO failas - XSL FO datne - FO-fil for XSL - XSL FO-bestand - XSL FO-fil - Plik XSL FO - Arquivo XSL FO - Fișier XSL FO - файл XSL FO - Súbor XSL FO - Datoteka XSL FO - File XSL FO - XSL FO-fil - файл XSL FO - Tập tin FO của XSL (XFO) - XSL 格式化对象文件 - XSL FO 檔 - XSL FO - XSL Formatting Objects - - - - - - - iptables configuration file - ملف تضبيط iptables - kanfihuracyjny fajł iptables - Настройки за iptables - fitxer de configuració d'iptables - Soubor nastavení iptables - iptableskonfigurationsfil - iptables-Konfigurationsdatei - αρχείο ρυθμίσεων iptables - iptables configuration file - archivo de configuración de iptables - iptables konfigurazio-fitxategia - iptables-asetustiedosto - iptables samansetingarfíla - fichier de configuration iptables - comhad cumraíochta iptables - ficheiro de configuración de iptables - קובץ הגדרה של iptables - iptables datoteka s postavkama - iptables beállítófájl - berkas konfigurasi iptables - File configurazione iptables - iptables 設定ファイル - iptables баптаулар файлы - iptables 설정 파일 - iptables konfigūracijos failas - iptables konfigurācijas datne - konfigurasjonsfil for iptables - iptables-configuratiebestand - iptables oppsettfil - Plik konfiguracji iptables - Arquivo de configuração do iptables - fișier configurare iptables - конфигурационный файл iptables - Súbor nastavení iptables - nastavitvena datoteka iptables - File konfigurimi iptables - iptables-konfigurationsfil - файл налаштувань iptables - tập tin cấu hình iptables - iptables 防火墙配置文件 - iptables 組態檔 - - - - - - - - - - - - - - - - - - - - - - - - - XSLT stylesheet - نمط XSLT - Arkuš stylaŭ XSLT - Стилове — XSLT - full d'estil XSLT - Styl XSLT - XSLT-stilark - XSLT-Stylesheet - φύλλο στυλ XSLT - XSLT stylesheet - XSLT-stilfolio - hoja de estilo XSLT - XSLT estilo-orria - XSLT-tyylitiedosto - XSLT sniðark - feuille de style XSLT - stílbhileog XSLT - folla de estilo XSLT - סגנון גליון XSLT - XSLT stilska tablica - XSLT-stíluslap - Lembar gaya XSLT - Foglio di stile XSLT - XSLT スタイルシート - XSLT стильдер кестесі - XSLT 스타일시트 - XSLT stiliaus aprašas - XSLT izklājlapa - Helaian Gaya XSLT - XSLT-stilark - XSLT-stijlblad - XSLT-stilark - Arkusz stylów XSLT - folha de estilos XSLT - Folha de estilo XSLT - Fișă de stil XSLT - таблица стилей XSLT - Štýl XSLT - Slogovna predloga XSLT - Fletë stili XSLT - Датотека са XSLT стилом - XSLT-stilmall - таблиця стилів XSLT - Tờ kiểu dáng XSLT - XSLT 样式表 - XSLT 樣式表 - XSLT - eXtensible Stylesheet Language Transformation - - - - - - - - - - - XMCD CD database - قاعدة بيانات XMCD CD - Baza źviestak ab dyskach XMCD - База от данни за CD-та — XMCD - base de dades de CD XMCD - Databáze XMCD CD - XMCD-cd-database - XMCD-CD-Datenbank - βάση δεδομένων CD XMCD - XMCD CD database - base de datos de CD XMCD - XMCD CD datu-basea - XMCD CD -tietokanta - XMCD fløgu dátustovnur - base de données de CD XMCD - bunachar sonraí XMCD CD - base de datos de CD XMCD - בסיס נתונים XMCD CD - XMCD CD baza podataka - XMCD CD-adatbázis - Basis data XMCD CD - Database XMCD CD - XMCD CD データベース - XMCD CD дерекқоры - XMCD CD 데이터베이스 - XMCD CD duomenų bazė - XMCD CD datubāze - XMCD CD-database - XMCD CD-gegevensbank - XMCD CD-database - Baza danych CD XMCD - Banco de dados de CD XMCD - Bază de date XMCD CD - база данных компакт-дисков XMCD - Databáza XMCD CD - Podatkovna zbirka XMCD CD - Bazë me të dhëna XMCD CD - XMCD cd-databas - база даних XMCD CD - Cơ sở dữ liệu CD XMCD - XMCD CD 数据库 - XMCD CD 資料庫 - - - - - - - XML document - مستند XML - Dakument XML - Документ — XML - document XML - Dokument XML - XML-dokument - XML-Dokument - έγγραφο XML - XML document - XML-dokumento - documento XML - XML dokumentua - XML-asiakirja - XML skjal - document XML - cáipéis XML - documento XML - מסמך XML - XML dokument - XML dokumentum - Dokumen XML - Documento XML - XML ドキュメント - XML құжаты - XML 문서 - XML dokumentas - XML dokuments - XML-dokument - XML-document - XML-dokument - Dokument XML - Documento XML - Document XML - документ XML - Dokument XML - Dokument XML - Dokument XML - XML-dokument - документ XML - Tài liệu XML - XML 文档 - XML 文件 - XML - eXtensible Markup Language - - - - - - - - - - - - - - XML entities document - مستند كيانات XML - Dakument elementaŭ XML - Документ — заместващи последователности в XML - document d'entitats XML - Dokument entit XML - XML-enhedsdokument - XML-Dokument-Entitäten - έγγραφο οντοτήτων XML - XML entities document - documento de entidades XML - XML entitateen dokumentua - XML-entiteettiasiakirja - XML einindisskjal - document d'entités XML - cáipéis aonán XML - documento de entidades XML - מסמך ישיות XML - XML egyeddokumentum - Dokumen entitas XML - Documento entità XML - XML エントリドキュメント - XML мәндер құжаты - XML 엔티티 문서 - XML esybių dokumentas - XML vienību dokuments - XML-entitetsdokument - XML entiteiten-document - XML-entitet-dokument - Dokument jednostek XML - Documento de entidades XML - Document entități XML - файл сущностей XML - Dokument entít XML - Dokument XML določil - Dokument njësish XML - XML-entitetsdokument - документ об’єктів XML - Tài liệu thực thể XML - XML 特征文档 - XML 實體文件 - XML - eXtensible Markup Language - - - - - - - DV video - DV مرئي - Videa DV - Видео — DV - vídeo DV - Video DV - DV-video - DV-Video - βίντεο DV - DV video - DV-video - vídeo DV - DV bideoa - DV-video - DV video - vidéo DV - físeán DV - vídeo DV - וידאו DV - DV video - DV videó - Video DV - Video DV - DV 動画 - DV ვიდეო - DV видеосы - DV 비디오 - DV vaizdo įrašas - DV video - DV-film - DV-video - DV-video - Plik wideo DV - Vídeo DV - Video DV - видео DV - Video DV - Video datoteka DV - Video DV - DV-video - відеокліп DV - Ảnh động DV - DV 视频 - DV 視訊 - DV - Digital Video - - - - - - - ISI video - مرئي ISI - ISI video faylı - Videa ISI - Видео — ISI - vídeo ISI - Video ISI - Fideo ISI - ISI-video - ISI-Video - βίντεο ISI - ISI video - ISI-video - vídeo ISI - ISI bideoa - ISI-video - ISI video - vidéo ISI - físeán ISI - vídeo ISI - וידאו ISI - ISI video - ISI-videó - Video ISI - Video ISI - ISI 動画 - ISI видеосы - ISI 비디오 - ISI vaizdo įrašas - ISI video - Video ISI - ISI-film - ISI-video - ISI video - Plik wideo ISI - vídeoISI - Vídeo ISI - Video ISI - видео ISI - Video ISI - Video datoteka ISI - Video ISI - ISI видео - ISI-video - відеокліп ISI - Ảnh động ISI - ISI 视频 - ISI 視訊 - - - MPEG-2 transport stream - بث نقل MPEG-2 - Поток — транспорт по MPEG-2 - flux de transport MPEG-2 - Přenosový proud MPEG-2 - MPEG-2-transportstrøm - MPEG-2-Transportstrom - ροή μεταφορών MPEG-2 - MPEG-2 transport stream - flujo de transporte MPEG-2 - MPEG-2 -siirtobittivirta - MPEG-2 flutningsstreymur - flux de transport MPEG-2 - Sruth aistrithe MPEG-2 - fluxo de transporte MPEG-2 - העברת זרימה של MPEG-2 - MPEG-2 átviteli adatfolyam - Stream transport MPEG-2 - Stream di trasporto MPEG-2 - MPEG-2 トランスポートストリーム - MPEG-2-ის ტრანსპორტული ნაკადი - MPEG-2 көліктік ағыны - MPEG-2 전송 스트림 - MPEG-2 transportavimo srautas - MPEG-2 transporta straume - MPEG-2 transport stream - Strumień przesyłania MPEG-2 - Fluxo de transporte de MPEG-2 - Flux transport MPEG-2 - транспортный поток MPEG-2 - Pretočni vir prenosega MPEG - MPEG-2 transportström - потік передавання даних MPEG-2 - MPEG-2 传输流 - MPEG-2 傳輸串流 - MPEG-2 TS - Moving Picture Experts Group 2 Transport Stream - - - - - - - - - - - - - - - - MPEG video - MPEG مرئي - Videa MPEG - Видео — MPEG - vídeo MPEG - Video MPEG - MPEG-video - MPEG-Video - βίντεο MPEG - MPEG video - MPEG-video - vídeo MPEG - MPEG bideoa - MPEG-video - MPEG video - vidéo MPEG - físeán MPEG - vídeo MPEG - וידאו MPEG - MPEG video - MPEG-videó - Video MPEG - Video MPEG - MPEG 動画 - MPEG ვიდეო - MPEG видеосы - MPEG 비디오 - MPEG vaizdo įrašas - MPEG video - Video MPEG - MPEG-film - MPEG-video - MPEG-video - Plik wideo MPEG - vídeo MPEG - Vídeo MPEG - Video MPEG - видео MPEG - Video MPEG - Video datoteka MPEG - Video MPEG - MPEG видео - MPEG-video - відеокліп MPEG - Ảnh động MPEG - MPEG 视频 - MPEG 視訊 - MPEG - Moving Picture Experts Group - - - - - - - - - - - - - - - - MPEG video (streamed) - Видео — MPEG, поточно - vídeo MPEG (flux) - Video MPEG (proud) - MPEG-video (streamet) - MPEG-Video (Datenstrom) - βίντεο MPEG (εκπεμπόμενο) - MPEG video (streamed) - Vídeo MPEG (flujo) - MPEG-video (virtaus) - vidéo MPEG (flux) - vídeo MPEG (en stream) - קובץ MPEG (בהזרמה) - MPEG videó (szórt) - Video MPEG (di-stream-kan) - Video MPEG (streamed) - MPEG ビデオ(ストリーム) - MPEG ვიდეო (ნაკადი) - MPEG видео (ағымдық) - MPEG 비디오 (스트리밍) - MPEG video (straumēts) - MPEG video (streamed) - Plik wideo MPEG (strumień) - Vídeo MPEG (fluxo) - видео MPEG (потоковое) - MPEG-video (pretočni) - MPEG-video (strömmad) - відеокліп MPEG (потоковий) - MPEG 视频流媒体 - MPEG 視訊 (串流) - - - - - - - - - - - QuickTime video - QuickTime مرئي - Videa QuickTime - Видео — QuickTime - vídeo QuickTime - Video QuickTime - QuickTime-video - QuickTime-Video - βίντεο QuickTime - QuickTime video - QuickTime-video - vídeo QuickTime - QuickTime bideoa - QuickTime-video - QuickTime video - vidéo QuickTime - físeán QuickTime - vídeo QuickTime - וידאו של QuickTime - QuickTime video - QuickTime videó - Video QuickTime - Video QuickTime - QuickTime 動画 - QuickTime видеосы - 퀵타임 비디오 - QuickTime vaizdo įrašas - QuickTime video - Video QuickTime - Quicktime film - QuickTime-video - QuickTime-video - Plik wideo QuickTime - vídeo QuickTime - Vídeo do QuickTime - Video QuickTime - видео QuickTime - Video QuickTime - Video datoteka QuickTime - Video QuickTime - QuickTime видео - QuickTime-video - відеокліп QuickTime - Ảnh động QuickTime - QuickTime 视频 - QuickTime 視訊 - - - - - - - - - - - - - QuickTime image - صورة QuickTime - Vyjava QuickTime - Изображение — QuickTime - imatge QuickTime - Obrázek QuickTime - QuickTime-billede - QuickTime-Bild - εικόνα QuickTime - QuickTime image - QuickTime-bildo - imagen QuickTime - QuickTime irudia - QuickTime-kuva - QuickTime mynd - image QuickTime - íomhá QuickTime - imaxe QuickTime - תמונה של QuickTime - QuickTime slika - QuickTime kép - Citra QuickTime - Immagine QuickTime - QuickTime 画像 - QuickTime суреті - 퀵타임 그림 - QuickTime paveikslėlis - QuickTime attēls - Quicktime bilde - QuickTime-afbeelding - QuickTime-bilete - Obraz QuickTime - Imagem do QuickTime - Imagine QuickTime - изображение QuickTime - Obrázok QuickTime - Slikovna datoteka QuickTime - Figurë QuickTime - QuickTime-bild - зображення QuickTime - Ảnh QuickTime - QuickTime 图像 - QuickTime 影像 - - - - - - - - Vivo video - Vivo مرئي - Vivo video faylı - Videa Vivo - Видео — Vivo - vídeo Vivo - Video Vivo - Fideo Vivo - Vivo-video - Vivo-Video - βίντεο Vivo - Vivo video - Vivo-video - vídeo Vivo - Vivo bideoa - Vivo-video - Vivo video - vidéo Vivo - físeán Vivo - vídeo Vivo - וידאו של Vivo - Vivo video - Vivo-videó - Video Vivo - Video Vivo - Vivo 動画 - Vivo видеосы - Vivo 비디오 - Vivo vaizdo įrašas - Vivo video - Video Vivo - Vivo-film - Vivo-video - Vivo-film - Plik wideo Vivo - vídeo Vivo - Vídeo Vivo - Video Vivo - видео Vivo - Video Vivo - Video datoteka Vivo - Video Vivo - Vivo видео - Vivo-video - відео Vivo - Ảnh động Vivo - Vivo 视频 - Vivo 視訊 - - - - - - Wavelet video - Wavelet مرئي - Wavelet video faylı - Videa Wavelet - Видео — Wavelet - vídeo Wavelet - Video Wavelet - Fideo Wavelet - Waveletvideo - Wavelet-Video - βίντεο Wavelet - Wavelet video - Wavelet-video - vídeo Wavelet - Wavelet bideoa - Wavelet-video - Wavelet video - vidéo Wavelet - físeán Wavelet - vídeo Wavelet - וידאו של Wavelet - Wavelet video - Wavelet-videó - Video Wavelet - Video Wavelet - Wavelet 動画 - Wavelet видеосы - Wavelet 비디오 - Wavelet vaizdo įrašas - Wavelet video - Video Wavelet - Wavelet-film - Wavelet-video - Wavelet video - Plik wideo Wavelet - vídeo Wavelet - Vídeo Wavelet - Video Wavelet - видео Wavelet - Video Wavelet - Video datoteka Wavelet - Video Wavelet - Wavelet видео - Wavelet-video - відеокліп Wavelet - Ảnh động Wavelet - Wavelet 视频 - Wavelet 視訊 - - - ANIM animation - تحريكة ANIM - ANIM animasiyası - Animacyja ANIM - Анимация — ANIM - animació ANIM - Animace ANIM - Animeiddiad ANIM - ANIM-animation - ANIM-Animation - κινούμενο σχέδιο ANIM - ANIM animation - ANIM-animacio - animación ANIM - ANIM animazioa - ANIM-animaatio - ANIM teknmyndagerð - animation ANIM - beochan ANIM - animación ANIM - הנפשת ANIM - ANIM animacija - ANIM-animáció - Animasi ANIM - Animazione ANIM - ANIM アニメーション - ANIM ანიმაცია - ANIM анимациясы - ANIM 동화상 - ANIM animacija - ANIM animācija - Animasi ANIM - ANIM-animasjon - ANIM-animatie - ANIM-animasjon - Plik animacji ANIM - animação ANIM - Animação ANIM - Animație ANIM - анимация ANIM - Animácia ANIM - Datoteka animacije ANIM - Animim ANIM - ANIM анимација - ANIM-animering - анімація ANIM - Hoạt ảnh ANIM - ANIM 动画 - ANIM 動畫 - - - - FLIC animation - تحريكة FLIC - Animacyja FLIC - Анимация — FLIC - animació FLIC - Animace FLIC - FLIC-animation - FLIC-Animation - κινούμενες εικόνες FLIC - FLIC animation - animación FLIC - FLIC animazioa - FLIC-animaatio - FLIC teknimyndagerð - animation FLIC - beochan FLIC - animación FLIC - הנפשת FLIC - FLIC animacija - FLIC animáció - Animasi FLIC - Animazione FLIC - FLIC アニメーション - FLIC ანიმაცია - FLIC анимациясы - FLIC 동화상 - FLIC animacija - FLIC animācija - FLIC-animasjon - FLIC-animatie - FLIC-animasjon - Plik animacji FLIC - Animação FLIC - Animație FLIC - анимация FLIC - Animácia FLIC - Datoteka animacije FLIC - Animim FLIC - FLIC-animering - FLIC animasyonu - анімація FLIC - Hoạt ảnh FLIC - FLIC 动画 - FLIC 動畫 - - - - - - - - - - - Haansoft Hangul document - مستند Haansoft Hangul - Dakument Haansoft Hangul - Документ — Haansoft Hangul - document Haansoft Hangul - Dokument Haansoft Hangul - Haansoft Hangul-dokument - Haansoft-Hangul-Dokument - έγγραφο Haansoft Hangul - Haansoft Hangul document - documento de Haansoft Hangul - Haansoft Hangul dokumentua - Haansoft Hangul -asiakirja - Haansoft Hangul skjal - document Haansoft Hangul - cáipéis Haansoft Hangul - documento de Haansoft Hangul - מסמך Haansoft Hangul - Haansoft Hangul dokument - Haansoft hangul dokumentum - Dokumen Haansoft Hangul - Documento Haansoft Hangul - Haansoft Hangul ドキュメント - Haansoft Hangul құжаты - 한소프트 한글 문서 - Haansoft Hangul dokumentas - Haansoft Hangul dokuments - Haansoft Hangul-dokument - Haansoft Hangul-document - Haansoft Hangul-dokument - Dokument Haansoft Hangul - Documento do Haansoft Hangul - Document Haansoft Hangul - документ Haansoft Hangul - Dokument Haansoft Hangul - Dokument Haansoft Hangul - Dokument Haansoft Hangul - Haansoft Hangul-dokument - документ Haansoft Hangul - Tài liệu Hangul Haansoft - Haansoft Hangul 文档 - Haansoft 韓文文件 - - - - - - - - - Haansoft Hangul document template - قالب مستند Haansoft Hangul - Šablon dakumentu Haansoft Hangul - Шаблон за документи — Haansoft Hangul - plantilla de document Haansoft Hangul - Šablona dokumentu Haansoft Hangul - Haansoft Hangul-dokumentskabelon - Haansoft-Hangul-Dokumentvorlage - πρότυπο εγγράφου Haansoft Hangul - Haansoft Hangul document template - plantilla de documento de Haansoft Hangul - Haansoft Hangul dokumentuaren txantiloia - Haansoft Hangul -asiakirjamalli - Haansoft Hangul skjalaformur - modèle de document Haansoft Hangul - teimpléad cháipéis Haansoft Hangul - modelo de documento de Haansoft Hangul - תבנית מסמך של Haansoft Hangul - Haansoft Hangul predložak dokumenta - Haansoft hangul dokumentumsablon - Templat dokumen Haansoft Hangul - Modello documento Haansoft Hangul - Haansoft Hangul ドキュメントテンプレート - Haansoft Hangul құжат үлгісі - 한소프트 한글 문서 서식 - Haansoft Hangul dokumento šablonas - Haansoft Hangul dokumentu veidne - Haansoft Hangul-dokumentmal - Haansoft Hangul-documentsjabloon - Haansoft Hangul-dokumentmal - Szablon dokumentu Haansoft Hangul - Modelo de documento do Haansoft Hangul - Document șablon Haansoft Hangul - шаблон документа Haansoft Hangul - Šablóna dokumentu Haansoft Hangul - Predloga dokumenta Haansoft Hangul - Model dokumenti Haansoft Hangul - Haansoft Hangul-dokumentmall - шаблон документа Haansoft Hangul - Mẫu tài liệu Hangul Haansoft - Haansoft Hangul 文档模板 - Haansoft 韓文文件範本 - - - - - - MNG animation - تحريكة MNG - Animacyja MNG - Анимация — MNG - animació MNG - Animace MNG - MNG-animation - MNG-Animation - κινούμενα σχέδια MNG - MNG animation - MNG-animacio - animación MNG - MNG animazioa - MNG-animaatio - MNG teknimyndagerð - animation MNG - beochan MNG - animación MNG - הנפשת MNG - MNG animacija - MNG-animáció - Animasi MNG - Animazione MNG - MNG アニメーション - MNG анимациясы - MNG 동화상 - MNG animacija - MNG animācija - Animasi MNG - MNG-animasjon - MNG-animatie - MNG-animasjon - Animacja MNG - animação MNG - Animação MNG - Animație MNG - анимация MNG - Animácia MNG - Datoteka animacije MNG - Animim MNG - MNG анимација - MNG-animering - анімація MNG - Hoạt ảnh MNG - MNG 动画 - MNG 動畫 - MNG - Multiple-Image Network Graphics - - - - - - - ASF video - ASF مرئي - Videa ASF - Видео — ASF - vídeo ASF - Video ASF - ASF-video - ASF-Video - βίντεο ASF - ASF video - ASF-video - vídeo ASF - ASF bideoa - ASF-video - ASF video - vidéo ASF - físeán ASF - vídeo ASF - וידאו ASF - ASF video - ASF videó - Video ASF - Video ASF - ASF 動画 - ASF ვიდეო - ASF видеосы - ASF 비디오 - ASF vaizdo įrašas - ASF video - ASF-film - ASF-video - ASF-video - Plik wideo ASF - Vídeo ASF - Video ASF - видео ASF - Video ASF - Video datoteka ASF - Video ASF - ASF-video - відеокліп ASF - Ảnh động ASF - ASF 视频 - ASF 視訊 - ASF - Advanced Streaming Format - - - - - - - - - - Windows Media Station file - ملف محطة Windows Media - Fajł Windows Media Station - Файл — Windows Media Station - fitxer Windows Media Station - Soubor Windows Media Station - Windows Media Station-fil - Windows-Media-Streamingbeschreibung - αρχείο Windows Media Station - Windows Media Station file - archivo de emisora de Windows Media - Windows Media Station fitxategia - Windows Media Station-tiedosto - Windows Media Station fíla - fichier Windows Media Station - comhad Windows Media Station - ficheiro de emisora de Windows Media - קובץ תחנה של Windows Media - Windows Media Station fájl - Berkas Windows Media Station - File Windows Media Station - Windows Media Station ファイル - Windows Media Station файлы - Windows 미디어 방송국 파일 - Windows Media Station failas - Windows Media Station datne - Windows Media Station-fil - Windows Media Station-bestand - Windows Media Station-fil - Plik Windows Media Station - Arquivo de estação do Windows Media - Fișier Windows Media Station - файл Windows Media Station - Súbor Windows Media Station - Datoteka Windows Media Station - File Windows Media Station - Windows Media Station-fil - Windows Media Station dosyası - файл Windows Media Station - Tập tin Windows Media Station - Windows 媒体工作站文件 - Windows Media Station 檔 - - - - - - - - - Windows Media video - Windows Media مرئي - Videa Windows Media - Видео — Windows Media - vídeo Windows Media - Video Windows Media - Windows Medie-video - Windows-Media-Video - βίντεο Windows Media - Windows Media video - vídeo de Windows Media - Windows Media bideoa - Windows Media -video - Windows Media video - vidéo Windows Media - físeán Windows Media - vídeo de Windows Media - וידאו של Windows Media - Windows Media video - Windows Media videó - Video Windows Media - Video Windows Media - Windows Media 動画 - Windows Media видеосы - Windows 미디어 오디오 - Windows Media vaizdo įrašas - Windows Media video - Windows Media film - Windows Media-video - Windows Media-video - Plik wideo Windows Media - Vídeo do Windows Media - Video Windows Media - видео Windows Media - Video Windows Media - Video datoteka Windows Media - Video Windows Media - Windows Media-video - відеокліп Windows Media - Ảnh động Windows Media - Windows Media 视频 - Windows Media 視訊 - - - - - AVI video - AVI مرئي - AVI video faylı - Videa AVI - Видео — AVI - vídeo AVI - Video AVI - Fideo AVI - AVI-video - AVI-Video - βίντεο AVI - AVI video - AVI-video - vídeo AVI - AVI bideoa - AVI-video - AVI video - vidéo AVI - físeán AVI - vídeo AVI - וידאו AVI - AVI video - AVI-videó - Video AVI - Video AVI - AVI 動画 - AVI ვიდეო - AVI видеосы - AVI 비디오 - AVI vaizdo įrašas - AVI video - Video AVI - AVI-film - AVI-video - AVI-video - Plik wideo AVI - vídeo AVI - Vídeo AVI - Video AVI - видео AVI - Video AVI - Video datoteka AVI - Video AVI - AVI видео - AVI-video - відеокліп AVI - Ảnh động AVI - AVI 视频 - AVI 視訊 - AVI - Audio Video Interleave - - - - - - - - - - - - - - - - - - - NullSoft video - NullSoft مرئي - Videa NullSoft - Видео — NullSoft - vídeo NullSoft - Video NullSoft - NullSoft-video - NullSoft-Video - βίντεο Nullsoft - NullSoft video - NullSoft-video - vídeo NullSoft - NullSoft bideoa - NullSoft-video - NullSoft video - vidéo NullSoft - físeán NullSoft - vídeo de NullSoft - וידאו של NullSot - NullSoft video - NullSoft videó - Video NullSoft - Video NullSoft - NullSoft 動画 - NullSoft видеосы - 널소프트 비디오 - NullSoft vaizdo įrašas - NullSoft video - Nullsoft-film - NullSoft-video - NullSoft-video - Plik wideo NullSoft - Vídeo do NullSoft - Video NullSoft - видео Nullsoft - Video NullSoft - Video datoteka NullSoft - Video NullSoft - NullSoft-video - відеокліп NullSoft - Ảnh động NullSoft - Nullsoft 视频 - NullSoft 視訊 - - - - - - - SDP multicast stream file - ملف دفق متعدد البث SDP - Šmatadrasny płynievy fajł SDP - Файл за поток — SDP multicast - fitxer de flux de multidifusió SDP - Soubor vícesměrového vysílání proudu SDP - SDP multicast-strømfil - SDP-Multicast-Datenstromdatei - SDP multicast stream file - archivo de flujo multicast SDP - SDP multicast korrontearen fitxategia - SDP-monilähetysvirran tiedosto - SDP margvarpað streymafíla - fichier de flux multidiffusion SDP - comhad shruth ilchraolacháin SDP - ficheiro de fluxo multicast SDP - קובץ שידור בזרימה SDP - SDP multicast műsorfájl - Berkas SDP multicast stream - File stream multicast SDP - SDP マルチキャストストリームファイル - SDP мультикаст ағым файлы - SDP 멀티캐스트 스트림 파일 - SDP daugiaadresio srauto failas - SDP multiraides straumes datne - SDP-multicaststrøm - SDP-multicast-streambestand - SDP multicast straumfil - Plik strumienia multicast SDP - Arquivo de canal multicast SDP - Fișier flux multicast SDP - файл мультикаст-потока SDP - Súbor viacsmerového vysielania prúdu SDP - Pretočni vir večsmernega oddajanja - File stream multicast SDP - SDP multicast stream-fil - файл потокової трансляції SDP - Tập tin luồng truyền một-nhiều SDP - SDP 多播流文件 - SDP multicast 串流檔 - SDP - Session Description Protocol - - - - - - - - - - - - SGI video - SGI مرئي - SGI video faylı - Videa SGI - Видео — SGI - vídeo SGI - Video SGI - Video SGI - SGI-video - SGI-Video - βίντεο SGI - SGI video - SGI-video - vídeo SGI - SGI bideoa - SGI-video - SGI video - vidéo SGI - físeán SGI - vídeo SGI - וידאו SGI - SGI video - SGI-videó - Video SGI - Video SGI - SGI 動画 - SGI видеосы - SGI 비디오 - SGI vaizdo įrašas - SGI video - Video SGI - SGI-film - SGI-video - SGI-video - Plik wideo SGI - vídeo SGI - Vídeo SGI - Video SGI - видео SGI - Video SGI - Video datoteka SGI - Video SGI - SGI видео - SGI-video - відеокліп SGI - Ảnh động SGI - SGI 视频 - SGI 視訊 - - - - - - - eMusic download package - حزمة تنزيل eMusic - pakunak zahruzki eMusic - Пакет за сваляне — eMusic - paquet de descàrrega eMusic - Balíček stahování eMusic - eMusic-hentpakke - eMusic-Download-Paket - πακέτο eMusic - eMusic download package - paquete de descarga eMusic - eMusic deskargaren paketea - eMusic-imurointipaketti - eMusic niðurtøkupakki - paquet de téléchargement eMusic - pacáiste íosluchtú eMusic - paquete de descarga de eMusic - חבילת הורדה של eMusic - eMusic letöltési csomag - paket unduh eMusic - Pacchetto scaricamento eMusic - eMusic ダウンロードパッケージ - eMusic жүктемелер дестесі - eMusic 다운로드 패키지 - eMusic atsiuntimo paketas - eMusic lejupielādes paciņa - eMusic nedlastingspakke - eMusic-downloadpakket - eMusic nedlastingspakke - Pobieralny pakiet eMusic - Pacote de download do eMusic - pachet descărcare eMusic - пакет загрузок eMusic - Balíček sťahovania eMusic - Datoteka paketa eMusic - Paketë shkarkimi eMusic - eMusic-hämtningspaket - пакунок завантаження eMusic - gói nhạc tải xuống eMusic - eMusic 下载包 - eMusic 下載套件 - - - - - - - - KML geographic data - بيانات جغرافية KML - Географски данни — KML - dades geogràfiques KML - Geografická data KML - Geografiske data i KML-format - KML geographische Daten - γεωγραφικά δεδομένα KML - KML geographic data - datos geográficos KML - KML datu geografikoak - KML landafrøðilig dáta - données géographiques KML - sonraí geografacha KML - datos xeográficos KML - מידע גאוגרפי KML - KML geografski podaci - KML földrajzi adatok - Data geografis KML - Dati geografici KML - KML 地理データ - KML географилық ақпараты - KML 지리 정보 데이터 - KML geografiniai duomenys - KML ģeogrāfiskie dati - KML geographic data - Dane geograficzne KML - Dados geográficos KML - Date geografice KML - географические данные KML - Zemepisné údaje KML - Datoteka geografskih podatkov KML - KML geografisk data - географічні дані KML - KML 地理数据 - KML 地理資料 - KML - Keyhole Markup Language - - - - - - KML geographic compressed data - بيانات جغرافية مضغوطة KML - Географски данни — KML, компресирани - dades geogràfiques comprimides KML - Komprimovaná geografická data KML - KML-geografiske komprimerede data - KML geographische komprimierte Daten - γεωγραφικά συμπιεσμένα δεδομένα KML - KML geographic compressed data - datos geográficos comprimidos KML - KML datu geografiko konprimituak - KML landafrøðilig stappað dáta - données géographiques KML compressées - sonraí comhbhrúite geografacha KML - datos xeográficos KML comprimidos - מידע גאוגרפי דחוס KML - KML geografski komprimirani podaci - KML tömörített földrajzi adatok - Data geografis KML terkompresi - Dati geografici KML compressi - KML 地理圧縮データ - KML географиялық сығылған ақпарат - KML 지리 정보 압축 데이터 - KML geografiniai suglaudinti duomenys - KML saspiesti ģeogrāfiskie dati - KML geographic compressed data - Skompresowane dane geograficzne KML - Dados comprimidos geográficos KML - Date geografice comprimate KML - сжатые географические данные KML - Komprimované zemepisné údaje KML - Skrčeni geografski podatki KML - KML geografiskt komprimerat data - стиснуті географічні дані KML - KML 压缩地理数据 - KML 地理壓縮資料 - KML - Keyhole Markup Language - - - - - Citrix ICA settings file - ملف إعدادات Citrix ICA - Fajł naładaŭ Citrix ICA - Настройки — Citrix ICA - fitxer de paràmetres de Citrix ICA - Soubor nastavení Citrix ICA - Citrix ICA-opsætningsfil - Citrix-ICA-Einstellungsdatei - αρχείο ρυθμίσεων Citrix ICA - Citrix ICA settings file - archivo de opciones de Citrix ICA - Citrix ICA ezarpenen fitxategia - Citrix ICA -asetustiedosto - Citrix ICA stillingarfíla - fichier de paramètres ICA Citrix - comhad socruithe Citrix ICA - ficheiro de configuracións de Citrix ICA - קובץ הגדרות של Citrix ICA - Citrix ICA datoteka postavki - Citrix ICA beállításfájl - Berkas penataan Citrix ICA - File impostazioni Citrix ICA - Citrix ICA 設定ファイル - Citrix ICA-ის პარამეტრების ფაილი - Citrix ICA баптаулар файлы - 시트릭스 ICA 설정 파일 - Citrix ICA parametrų failas - Citrix ICA iestatījumu datne - Innstillingsfil for Citrix ICA - Citrix ICA-instellingen - Citrix ICA-innstillingsfil - Plik ustawień Citrix ICA - Arquivo de configurações do Citrix ICA - Fișier de configurări Citrix ICA - файл настроек Citrix ICA - Súbor nastavení Citrix ICA - Nastavitvena datoteka Citrix ICA - File rregullimesh Citrix ICA - Citrix ICA-inställningsfil - файл параметрів ICA Citrix - Tập tin thiết lập ICA Citrix - Citrix ICA 设置文件 - Citrix ICA 設定值檔案 - ICA - Independent Computing Architecture - - - - - - XUL interface document - مستند واجهة XUL - Interfejsny dakument XUL - Документ — интерфейс за XUL - document d'interfície XUL - Dokument rozhraní XUL - XUL-grænsefladedokument - XUL-Oberflächendokument - έγγραφο διεπαφής XUL - XUL interface document - documento de interfaz XUL - XUL interfazearen dokumentua - XUL-käyttöliittymäasiakirja - XUL markamótsskjal - document d'interface XUL - cáipéis chomhéadan XUL - documento de interface XUL - מסמך ממשק XUL - XUL-felületdokumentum - Dokumen antarmuka XUL - Documento interfaccia XUL - XUL インターフェイスドキュメント - XUL интерфейс құжаты - XUL 인터페이스 문서 - XUL sąsajos dokumentas - XUL saskarnes dokuments - XUL-grensesnittdokument - XUL-interface-document - XUL-grensesnitt-dokument - Dokument interfejsu XUL - Documento de interface XUL - Document interfață XUL - документ интерфейса XUL - Dokument rozhrania XUL - Dokument vmesnika XUL - Dokument interfaqe XUL - XUL-gränssnittsdokument - XUL arayüz belgesi - документ інтерфейсу XUL - Tài liệu giao diện XUL - XUL 界面文档 - XUL 介面文件 - XUL - XML User interface markup Language - - - - - - - XPInstall installer module - وحدة مثبت XPInstall - Пакет — инсталация XPInstall - mòdul instal·lador d'XPinstall - Modul instalátoru XPInstall - XPInstall-installationsmodul - XPInstall-Installermodul - XPInstall installer module - módulo del instalador XPInstall - XPInstall instalatzailearen modulua - XPInstall-asennuspaketti - XPInstall innleggjaramótul - module d'installation XPInstall - modúl suiteála XPInstall - Módulo do instalador XPInstall - מודול התקנה של XPInstall - XPInstall telepítőmodul - Modul installer XPInstall - Modulo installatore XPInstall - XPInstall インストーラモジュール - XPInstall орнату модулі - XPInstall 설치 프로그램 모듈 - XPInstall įdiegiklio modulis - XPInstall instalatora modulis - XPInstall installeer module - Moduł instalatora XPInstall - Módulo de instalador XPInstall - Modul de instalare XPInstall - модуль установщика XPInstall - Modul inštalátora XPInstall - modul namestilnika XPInstall - XPInstall-installeringsmodul - модуль засобу встановлення XPInstall - XPInstall 安装工具模块 - XPInstall 安裝程式模組 - - - - - Word 2007 document - مستند Word 2007 - Документ — Word 2007 - document de Word 2007 - Dokument Word 2007 - Word 2007-dokument - Word-2007-Dokument - έγγραφο Word 2007 - Word 2007 document - documento de Word 2007 - Word 2007 dokumentua - Word 2007 -asiakirja - Word 2007 skjal - document Word 2007 - cáipéis Word 2007 - documento de Word 2007 - מסמך Word 2007 - Word 2007 dokument - Word 2007 dokumentum - Dokumen Word 2007 - Documento Word 2007 - Word 2007 ドキュメント - Word 2007 құжаты - 워드 2007 문서 - Word 2007 dokumentas - Word 2007 dokuments - Word 2007-document - Dokument Word 2007 - Documento do Word 2007 - Document Word 2007 - документ Word 2007 - Dokument Word 2007 - Dokument Word 2007 - Word 2007-dokument - документ Word 2007 - Tài liệu Word 2007 - Microsoft Word 2007 文档 - Word 2007 文件 - - - - - - Word 2007 document template - Шаблон за документи — Word 2007 - plantilla de document de Word 2007 - Šablona dokumentu Word 2007 - Word 2007-dokumentskabelon - Word 2007-Dokumentvorlage - πρότυπο έγγραφο Word 2007 - Word 2007 document template - Plantilla de documento de Word 2007 - Word 2007 -asiakirjamalli - modèle de document Word 2007 - Plantilla de documento de Word 2007 - תבנית מסמך של Word 2007 - Word 2007 predložak dokumenta - Word 2007 dokumentumsablon - Templat dokumen Word 2007 - Modello documento Word 2007 - Word 2007 文書テンプレート - Word 2007-ის დოკუმენტის შაბლონი - Word 2007 құжатының үлгісі - 워드 2007 문서 서식 - Word 2007 dokumenta veidne - Word 2007 document sjabloon - Szablon dokumentu Word 2007 - Modelo de documento do Word 2007 - шаблон документа Word 2007 - Predloga dokumenta Word 2007 - Word 2007-dokumentmall - шаблон документа Word 2007 - Word 2007 文档模板 - Word 2007 文件範本 - - - - - - PowerPoint 2007 presentation - عرض تقديمي PowerPoint 2007 - Презентация — PowerPoint 2007 - presentació de PowerPoint 2007 - Prezentace PowerPoint 2007 - PowerPoint 2007-præsentation - PowerPoint-2007-Präsentation - παρουσίαση PowerPoint 2007 - PowerPoint 2007 presentation - presentación de PowerPoint 2007 - PowerPoint 2007 aurkezpena - PowerPoint 2007 -esitys - PowerPoint 2007 framløga - présentation PowerPoint 2007 - láithreoireacht PowerPoint 2007 - presentación de PowerPoint 2007 - מצגת של PowerPoint 2007 - PowerPoint 2007 prezentacija - PowerPoint 2007 prezentáció - Presentasi PowerPoint 2007 - Presentazione standard PowerPoint 2007 - PowerPoint 2007 プレゼンテーション - PowerPoint 2007 презентациясы - 파워포인트 2007 프리젠테이션 - PowerPoint 2007 pateiktis - PowerPoint 2007 prezentācija - PowerPoint 2007-presentatie - Prezentacja PowerPoint 2007 - Apresentação do PowerPoint 2007 - Prezentare PowerPoint 2007 - презентация PowerPoint 2007 - Prezentácia PowerPoint 2007 - Predstavitev Microsoft PowerPoint 2007 - PowerPoint 2007-presentation - презентація PowerPoint 2007 - Trình diễn PowerPoint 2007 - Microsoft PowerPoint 2007 演示文稿 - PowerPoint 2007 簡報 - - - - - - PowerPoint 2007 slide - Кадър — PoerPoint 2007 - dispositiva de PowerPoint 2007 - Snímek PowerPoint 2007 - PowerPoint 2007-slide - PowerPoint 2007-Folie - σλάιντ PowerPoint 2007 - PowerPoint 2007 slide - Diapositiva de PowerPoint 2007 - diapositive PowerPoint 2007 - Diaporama de PowerPoint 2007 - שקופית של PowerPoint 2007 - PowerPoint 2007 slajd - PowerPoint 2007 dia - Slide PowerPoint 2007 - Diapositiva PowerPoint 2007 - PowerPoint 2007 スライド - PowerPoint 2007-ის სლაიდი - PowerPoint 2007 слайды - 파워포인트 2007 슬라이드 - PowerPoint 2007 slaids - PowerPoint 2007 dia - Slajd PowerPoint 2007 - Slide do PowerPoint 2007 - слайд PowerPoint 2007 - Prosojnica PowerPoint 2007 - слайд PowerPoint 2007 - PowerPoint 2007 文稿 - PowerPoint 2007 投影片 - - - - - - PowerPoint 2007 show - عرض PowerPoint 2007 - Презентация-шоу — PowerPoint 2007 - exposició de PowerPoint 2007 - Prezentace PowerPoint 2007 - PowerPoint 2007-dias - PowerPoint-2007-Präsentation - σόου PowerPoint 2007 - PowerPoint 2007 show - exposición de PowerPoint 2007 - PowerPoint 2007 ikuskizuna - PowerPoint 2007 -diaesitys - PowerPoint 2007 framsýning - diaporama PowerPoint 2007 - taispeántas PowerPoint 2007 - Exposición de PowerPoint 2007 - תצוגה של PowerPoint 2007 - PowerPoint 2007 prezentacija - PowerPoint 2007 bemutató - Presentasi PowerPoint 2007 - Solo presentazione PowerPoint 2007 - PowerPoint 2007 プレゼンテーション - PowerPoint 2007 көрсетілімі - 파워포인트 2007 쇼 - PowerPoint 2007 pateiktis - PowerPoint 2007 slīdrāde - PowerPoint 2007 show - Pokaz PowerPoint 2007 - Apresentação do PowerPoint 2007 - Prezentare PowerPoint 2007 - презентация PowerPoint 2007 - Ukážka PowerPoint 2007 - Zagonska predstavitev PowerPoint 2007 - PowerPoint 2007-visning - показ слайдів PowerPoint 2007 - Microsoft PowerPoint 2007 演示文稿 - PowerPoint 2007 展示 - - - - - - PowerPoint 2007 presentation template - Шаблон за презентации — PowerPoint 2007 - plantilla de presentació de PowerPoint 2007 - Šablona prezentace PowerPoint 2007 - PowerPoint 2007-præsentationsskabelon - PowerPoint 2007-Präsentationsvorlage - πρότυπο παρουσίασης PowerPoint 2007 - PowerPoint 2007 presentation template - Plantilla de presentación de PowerPoint 2007 - PowerPoint 2007 -esitysmalli - modèle de présentation PowerPoint 2007 - modelo de presentación de PowerPoint 2007 - תבנית למצגת של PowerPoint 2007 - PowerPoint 2007 predložak prezentacije - PowerPoint 2007 bemutatósablon - Templat presentasi PowerPoint 2007 - Modello presentazione PowerPoint 2007 - PowerPoint 2007 プレゼンテーションテンプレート - PowerPoint 2007-ის პრეზენტაციის შაბლონი - PowerPoint 2007 презентация шаблоны - 파워포인트 2007 프리젠테이션 서식 - PowerPoint 2007 prezentācijas veidne - PowerPoint 2007 presentation sjabloon - Szablon prezentacji PowerPoint 2007 - Modelo de apresentação do PowerPoint 2007 - шаблон презентации PowerPoint 2007 - Predloga predstavitve PowerPoint 2007 - PowerPoint 2007-presentationsmall - шаблон презентації PowerPoint 2007 - PowerPoint 2007 演示文稿模板 - PowerPoint 2007 簡報範本 - - - - - - Excel 2007 spreadsheet - جدول Excel 2007 - Таблица — Excel 2007 - full de càlcul d'Excel 2007 - Sešit Excel 2007 - Excel 2007-regneark - Excel-2007-Tabelle - φύλλο εργασίας Excel 2007 - Excel 2007 spreadsheet - hoja de cálculo de Excel 2007 - Excel 2007 kalkulu-orria - Excel 2007 -taulukko - Excel 2007 rokniark - feuille de calcul Excel 2007 - scarbhileog Excel 2007 - folla de cálculo de Excel 2007 - גליון נתונים של אקסל 2007 - Excel 2007 proračunska tablica - Excel 2007 táblázat - Lembar sebar Excel 2007 - Foglio di calcolo Excel 2007 - Excel 2007 スプレッドシート - Excel 2007-ის ცხრილი - Excel 2007 электрондық кестесі - 엑셀 2007 스프레드시트 - Excel 2007 skaičialentė - Excel 2007 izklājlapa - Excel 2007-rekenblad - Arkusz Excel 2007 - Planilha do Excel 2007 - Foaie de calcul Excel 2007 - электронная таблица Excel 2007 - Zošit Excel 2007 - Razpredelnica Microsoft Excel 2007 - Excel 2007-kalkylblad - ел. таблиця Excel 2007 - Bảng tính Excel 2007 - Microsoft Excel 2007 工作簿 - Excel 2007 試算表 - - - - - - Excel 2007 spreadsheet template - Шаблон за таблици — Excel 2007 - plantilla de full de càlcul d'Excel 2007 - Šablona sešitu Excel 2007 - Excel 2007-regnearksskabelon - Excel 2007-Datenblattvorlage - πρότυπο φύλλου εργασίας Excel 2007 - Excel 2007 spreadsheet template - Plantilla de hoja de cálculo Excel 2007 - Excel 2007 -taulukkomalli - modèle de feuille de calcul Excel 2007 - modelo de folla de cálculo Excel 2007 - תבנית של גיליון נתונים של Excel 2007 - Excel 2007 predložak proračunske tablice - Excel 2007 táblázatsablon - Templat lembar kerja Excel 2007 - Modello foglio di calcolo Excel 2007 - Excel 2007 スプレッドシートテンプレート - Excel 2007-ის ცხრილის შაბლონი - Excel 2007 кесте шаблоны - 엑셀 2007 스프레드쉬트 - Excel 2007 izklājlapas veidne - Excel 2007 spreadsheet sjabloon - Szablon arkusza Excel 2007 - Modelo de planilha do Excel 2007 - шаблон электронной таблицы Excel 2007 - Predloga razpredelnice Excel 2007 - Excel 2007-kalkylarksmall - шаблон електронної таблиці Excel 2007 - Excel 2007 工作表模板 - Excel 2007 試算表範本 - - - - - - T602 document - مستند T602 - Dakument T602 - Документ — T602 - document T602 - Dokument T602 - T602-dokument - T602-Dokument - αρχείο T602 - T602 document - T602-dokumento - documento T602 - T602 dokumentua - T602-asiakirja - T602 skjal - document T602 - cáipéis T602 - documento T602 - מסמך T602 - T602 dokument - T602 dokumentum - Dokumen T602 - Documento T602 - T602 ドキュメント - T602 құжаты - T602 문서 - T602 dokumentas - T602 dokuments - T602-dokument - T602-document - T602-dokument - Dokument T602 - Documento T602 - Document T602 - документ T602 - Dokument T602 - Dokument T602 - Dokument T602 - T602-dokument - документ T602 - Tài liệu T602 - T602 文档 - T602 文件 - - - - - - - - - - Cisco VPN Settings - إعدادات Cisco VPN - Nałady Cisco VPN - Настройки — ВЧМ на Cisco - paràmetres VPN de Cisco - Nastavení Cisco VPN - Cisco VPN-opsætning - Cisco-VPN-Einstellungen - ρυθμίσεις Cisco VPN - Cisco VPN Settings - configuración VPN de Cisco - Cisco VPN ezarpenak - Cisco VPN -asetukset - Cisco VPN stillingar - paramètres VPN Cisco - socruithe VPN Cisco - configuracións de VPN de Cisco - הגדרות של Cisco VPN - Cisco VPN postavke - Cisco VPN beállítások - Penataan Cisco VPN - Impostazioni VPN Cisco - Cisco VPN 設定 - Cisco VPN-ის პარამეტრები - Cisco VPN баптаулары - Cisco VPN 설정 - Cisco VPN parametrai - Cisco VPN iestatījumi - Cisco VPN-innstillinger - Cisco VPN-instellingen - Cisco VPN-innstillingar - Ustawienia VPN Cisco - Configurações de VPN da Cisco - Configurări VPN Cisco - файл настроек Cisco VPN - Nastavenia Cisco VPN - Datoteka nastavitev Cisco VPN - Rregullime VPN Cisco - Cisco VPN-inställningar - параметри VPN Cisco - Thiết lập VPN Cisco - Cisco VPN 设置 - Cisco VPN 設定值 - - - - - - - - - - ICC profile - تشكيلة OCL - Цветови профил — OCL - perfil ICC - Profil ICC - ICC-profil - ICC-Profil - προφίλ ICC - ICC profile - ICC-profilo - perfil ICC - ICC profila - ICC-profiili - ICC umhvarv - profil ICC - próifíl ICC - perfíl ICC - פרופיל ICC - ICC profil - ICC profil - Profil ICC - Profilo ICC - ICC プロファイル - ICC профайлы - ICC 프로필 - ICC profilis - ICC profils - ICC profiel - Profil ICC - Perfil ICC - Profil ICC - профиль ICC - Profil farieb ICC - Datoteka profila ICC - ICC-profil - профіль ICC - ICC 文件 - ICC 設定檔 - - - - - - - - IT 8.7 color calibration file - ملف ضبط ألوان IT 8.7 - Файл за цветово калибриране — IT 8.7 - fitxer de calibratge de color IT 8.7 - Soubor kalibrace barev IT 8.7 - IT 8.7 farvekalibreringsfil - IT 8.7 Farbkalibrierungsdatei - αρχείο ρύθμισης χρώματος ΙΤ 8.7 - IT 8.7 color calibration file - archivo de calibración de color IT 8.7 - IT 8.7 kolore-kalibrazioaren fitxategia - IT 8.7 -värikalibrointitiedosto - IT 8.7 litstillingarfíla - fichier de calibration couleur IT 8.7 - comhad calabraithe dathanna IT 8.7 - ficheiro de calibración de cor IT 8.7 - קובץ כיול צבע IT 8.7 - IT 8.7 datoteka kalibracije boja - IT 8.7 színkalibrációs fájl - Berkas kalibrasi warna IT 8.7 - File calibrazione colore IT 8.7 - IT 8.7 カラーキャリブレーションファイル - IT 8.7 түс баптау файлы - IT 8.7 색 조율 파일 - IT 8.7 spalvų kalibravimo failas - IT 8.7 krāsu kalibrācijas datne - IT 8.7 kleurcalibratie bestand - Plik kalibracji kolorów IT 8.7 - Arquivo de calibração de cor IT 8.7 - Fișier de calibrare a culorii IT 8.7 - файл калибровки цвета IT 8.7 - Umeritvena datoteka barve IT 8.7 - IT 8.7-färgkalibreringsfil - файл калібрування кольорів IT 8.7 - IT 8.7 色彩校准文件 - IT 8.7 色彩校正檔 - - - - - - - - - CCMX color correction file - - - - - - - - - WinHelp help file - - - - - - - - - - - digital photos - الصور الرقمية - ličbavyja zdymki - Цифрови фотографии - fotos digitals - Digitální fotografie - digitale billeder - Digitale Fotos - ψηφιακές φωτογραφίες - digital photos - fotos digitales - argazki digitalak - digivalokuvia - talgildar myndir - photos numériques - grianghraif dhigiteacha - fotos dixitais - תמונות דיגיטליות - digitalne fotografije - digitális fényképek - foto digital - Foto digitali - デジタルフォト - сандық фотосуреттер - 디지털 사진 - skaitmeninės nuotraukos - digitāla fotogrāfija - digitale foto's - digitale fotografi - Zdjęcia cyfrowe - Fotos digitais - fotografii digitale - цифровые фотографии - Digitálne fotografie - digitalne fotografije - Fotografi dixhitale - digitalbilder - цифрові фотографії - ảnh chụp số - 数字化图像 - 數位相片 - - - - - - - - Video CD - Video CD - Videa CD - CD — видео - Video CD - Video CD - Video-cd - Video-CD - Video CD - Video CD - Video-KD - Video CD - Bideo CDa - Video CD - Video CD - CD vidéo - Video CD - Video CD - תקליטור וידאו - Video CD - Video CD - Video CD - Video CD - ビデオ CD - видео CD - 비디오 CD - Vaizdo CD - Video CD - video-CD - Video-CD - Video CD - CD de vídeo - CD video - видеодиск VCD - Video CD - Video CD - CD Video - Video-cd - Video CD - Đĩa CD ảnh động - VCD - Video CD - - - - - - - - Super Video CD - Super Video CD - Super Video CD - CD — супер видео - Super Video CD - Super Video CD - Super Video-cd - Super-Video-CD - Super Video CD - Super Video CD - Super-Video-KD - Super Video CD - Super Bideo CDa - Super Video CD - Super Video CD - Super VCD - Super Video CD - Super vídeo CD - Super Video CD - Super Video CD - Super Video CD - Super Video CD - Super Video CD - スーパービデオ CD - Super Video CD - 수퍼 비디오 CD - Super vaizdo CD - Super Video CD - super-video-CD - Super Video-CD - Super Video CD - CD de Super Vídeo (SVCD) - Super Video CD - компакт-диск Super Video - Super Video CD - Super Video CD - CD Super Video - Super Video CD - Super Video CD - Đĩa CD siêu ảnh động - SVCD - Super Video CD - - - - - - - - video DVD - DVD مرئي - videa DVD - DVD — видео - vídeo DVD - DVD-Video - video-dvd - Video-DVD - βίντεο DVD - video DVD - video-DVD - DVD de vídeo - bideo DVDa - video-DVD - video DVD - DVD vidéo - DVD físe - DVD de vídeo - DVD וידאו - video DVD - video DVD - DVD video - DVD video - ビデオ DVD - ვიდეო DVD - видео DVD - 비디오 CD - vaizdo DVD - video DVD - video-DVD - Video-DVD - DVD-Video - DVD de vídeo - DVD video - видео-DVD - DVD-Video - video DVD - DVD video - video-dvd - відео-DVD - đĩa DVD ảnh động - 视频 DVD - 視訊 DVD - - - - - - - - - - - audio CD - CD سمعي - aŭdyjo CD - CD — аудио - CD d'àudio - Zvukové CD - lyd-cd - Audio-CD - CD ήχου - audio CD - Son-KD - CD de sonido - Audio CDa - ääni-CD - audio CD - CD audio - dlúthdhiosca fuaime - CD de son - תקליטור שמע - hang CD - CD audio - CD audio - オーディオ CD - аудио CD - 오디오 CD - garso CD - audio CD - audio-CD - lyd-CD - CD-Audio - CD de áudio - CD audio - звуковой CD - Zvukové CD - zvočni CD - CD audio - ljud-cd - Müzik CD'si - звуковий CD - đĩa CD âm thanh - 音频 CD - 音訊 CD - - - - - blank CD disc - قرص CD فارغ - čysty dysk CD - CD — празно - disc CD en blanc - Prázdný disk CD - tom cd-disk - Leere CD - κενό CD - blank CD disc - disco CD virgen - CD disko hutsa - tyhjä CD-levy - blonk fløga - CD vierge - dlúthdhiosca folamh - disco de CD en brancho - תקליטור ריק - üres CD-lemez - cakram CD kosong - Disco vuoto CD - ブランク CD ディスク - таза CD дискі - 빈 CD 디스크 - tuščias CD diskas - tukšs CD disks - blanco CD - tom CD-plate - Pusta płyta CD - Disco CD vazio - disc gol CD - чистый компакт-диск - Prázdny disk CD - prazen CD disk - Disk bosh CD - tom cd-skiva - boş CD diski - порожній компакт-диск - đĩa CD trống - 空 CD 光盘 - 空白 CD 光碟 - - - - - blank DVD disc - قرص DVD فارغ - čysty dysk DVD - DVD — празно - disc DVD en blanc - Prázdný disk DVD - tom dvd-disk - Leere DVD - κενό DVD - blank DVD disc - disco DVD virgen - DVD disko hutsa - tyhjä DVD-levy - blonk margfløga - DVD vierge - DVD folamh - disco de DVD en branco - תקליטור DVD ריק - üres DVD-lemez - cakram DVD kosong - Disco vuoto DVD - ブランク DVD ディスク - таза DVD дискі - 빈 DVD 디스크 - tuščias DVD diskas - tukšs DVD disks - blanco DVD - tom DVD-plate - Pusta płyta DVD - Disco DVD vazio - disc gol DVD - чистый диск DVD - Prázdny disk DVD - prazen DVD disk - Disk bosh DVD - tom dvd-skiva - boş DVD diski - порожній диск DVD - đĩa DVD trống - 空 DVD 光盘 - 空白 DVD 光碟 - - - - - blank Blu-ray disc - قرص بلو-راي فارغ - čysty dysk Blu-ray - Blu-ray — празно - disc Blu-Ray en blanc - Prázdný disk Blu-ray - tom Blu-ray-disk - Leeres Blu-Ray-Medium - κενό Blu-ray - blank Blu-ray disc - disco Blu-ray virgen - Blu-ray disko hutsa - tyhjä Blu-ray-levy - blankur Blu-ray diskur - disque Blu-Ray vierge - diosca folamh Blu-Ray - disco Blu-ray en branco - תקליטור בלו־ריי ריק - üres Blu-Ray lemez - cakram Blu-ray kosong - Disco vuoto Blu-ray - ブランク Blu-ray ディスク - таза Blu-ray дискі - 빈 블루레이 디스크 - tuščias Blu-ray diskas - tukšs Blu-ray disks - blanco Blu-ray-disk - tom Blu-Ray-plate - Pusta płyta Blu-ray - Disco Blu-ray vazio - disc gol Blu-ray - чистый диск Blu-ray - Prázdny disk Blu-ray - prazen Blu-Ray disk - Disk bosh Blu-ray - tom Blu-ray-skiva - boş Blue-ray diski - порожній диск Blu-ray - đĩa Blu-ray trống - 空蓝光 DVD - 空白 Blu-ray 光碟 - - - - - blank HD DVD disc - قرص HD DVD فارغ - čysty dysk HD DVD - HD DVD — празно - disc DVD HD en blanc - Prázdný disk HD DVD - tom HD dvd-disk - Leere HD-DVD - κενό HD DVD - blank HD DVD disc - disco HD DVD virgen - HD DVD disko hutsa - tyhjä HD DVD -levy - blankur HD DVD diskur - disque HD-DVD vierge - HD DVD folamh - disco de HD DVD en branco - דיסק HD DVD ריק - üres HD DVD-lemez - cakram HD DVD kosong - Disco vuoto DVD HD - ブランク HD DVD ディスク - таза HD DVD дискі - 빈 HD DVD 디스크 - tuščias HD DVD diskas - tukšs HD DVD disks - blanco HD-DVD - tom HD-DVD-plate - Pusta płyta HD DVD - Disco DVD HD vazio - disc gol HD DVD - чистый диск HD DVD - Prázdny disk HD DVD - prazen HD DVD disk - Disk bosh DVD HD - tom HD DVD-skiva - boş HD DVD diski - порожній диск HD DVD - đĩa DVD HD trống - 空 HD DVD 光盘 - 空白 HD DVD 光碟 - - - - - audio DVD - DVD سمعي - aŭdyjo DVD - DVD — аудио - DVD d'àudio - Zvukové DVD - lyd-dvd - Audio-DVD - DVD ήχου - audio DVD - Son-DVD - DVD de sonido - audio DVDa - ääni-DVD - Ljóð DVD - DVD audio - DVD fuaime - DVD de son - DVD שמע - hang DVD - DVD audio - DVD audio - オーディオ DVD - аудио DVD - 오디오 DVD - garso DVD - audio DVD - audio-DVD - lyd-DVD - DVD-Audio - DVD de áudio - DVD audio - звуковой DVD - Zvukové DVD - zvočni DVD - DVD audio - ljud-dvd - Müzik DVD'si - звуковий DVD - đĩa DVD âm thanh - 音频 DVD - 音訊 DVD - - - - - - - - - Blu-ray video disc - قرص بلو-راي مرئي - Videadysk Blu-ray - Blu-ray — видео - disc de vídeo Blu-Ray - Videodisk Blu-ray - Blu-ray video-disk - Blu-ray-Videoscheibe - δίσκος βίντεο Blu-ray - Blu-ray video disc - disco de vídeo Blu-ray - Blu-ray bideo-diskoa - Blu-ray-videolevy - Blu-ray diskur - disque vidéo Blu-Ray - diosca físe Blu-Ray - disco de vídeo Blu-ray - תקליטור וידאו מסוג בלו־ריי - Blu-ray video disk - Blu-ray videolemez - Cakram video Blu-ray - Disco video Blu-ray - Blu-ray ビデオディスク - Blu-ray ვიდეო დისკი - Blu-ray видео дискі - 블루레이 비디오 디스크 - Blu-ray vaizdo diskas - Blu-ray video disks - Blu-ray-videodisk - Blu-Ray videoplate - Płyta wideo Blu-ray - Disco de vídeo Blu-ray - Disc video Blu-ray - видеодиск Blu-ray - Videodisk Blu-ray - Blu-ray video disk - Disk video Blu-ray - Blu-ray-videoskiva - відеодиск Blu-ray - Đĩa ảnh động Blu-ray - 蓝光视频光盘 - Blu-ray 視訊光碟 - - - - - - - - - HD DVD video disc - قرص HD DVD مرئي - Videadysk HD DVD - HD DVD — видео - disc de vídeo DVD HD - Videodisk HD DVD - HD DVD-videodisk - HD-DVD-Videoscheibe - δίσκος βίντεο HD DVD - HD DVD video disc - disco de vídeo HD DVD - HD DVD bideo-diskoa - HD DVD -videolevy - HD DVD video diskur - disque vidéo HD DVD - diosca físe HD DVD - disco de vídeo HD DVD - תקליטור וידאו HD DVD - HD DVD video disk - HD DVD videolemez - Cakram video HD DVD - Disco video DVD HD - HD DVD ビデオディスク - HD DVD видео дискі - HD DVD 비디오 디스크 - HD DVD vaizdo diskas - HD DVD video disks - HD-DVD-videodisk - HD-DVD-videodisk - Płyta wideo HD DVD - Disco de vídeo HD DVD - Disc video HD DVD - видеодиск HD DVD - Videodisk HD DVD - HD DVD video disk - Disk video DVD HD - HD DVD-videoskiva - відеодиск HD DVD - Đĩa ảnh động DVD HD - HD DVD 视频光盘 - HD DVD 視訊光碟 - - - - - - - - - - e-book reader - Четец на е-книги - lector de llibres electrònics - Čtečka elektronických knih - e-bogslæser - E-Book-Leser - αναγνώστης ηλεκτρονικών βιβλίων - e-book reader - lector de libros electrónicos - e-kirjan lukulaite - lecteur de livre numérique - lector de libros electrónicos - קורא ספרים אלקטרוניים - čitač e-knjiga - e-könyvolvasó - Pembaca e-book - Lettore e-book - 電子書籍リーダー - электронды кітаптарды оқу құрылғысы - 전자책 리더 - e-grāmatu lasītājs - e-book reader - Czytnik e-booków - Leitor de e-book - устройство для чтения электронных книг - Bralnik elektronskih knjig - e-book-läsare - e-kitap okuyucu - пристрій для читання електронних книг - 电子书阅读器 - e-book 閱讀器 - - - - - - - - Picture CD - Picture CD - Picture CD - CD — изображения - Picture CD - Picture CD - Billedcd - Bild-CD - CD εικόνων - Picture CD - Picture CD - Picture CD - Picture CD - Picture CD - CD Picture - Picture CD - Picture CD - תקליטור תמונות - Picture CD - CD Gambar - Picture CD - ピクチャー CD - Picture CD - Picture CD - Paveikslėlių CD - Attēlu CD - foto-CD - Bilete-CD - Picture CD - CD de Fotos - CD cu fotografii - Picture CD - Picture CD - Slikovni CD - Picture CD - Picture CD - Resim CD'si - CD з зображеннями - Đĩa CD ảnh - 柯达 Picture CD - 圖片 CD - - - - - - - - portable audio player - مشغل الملفات المسموعة المحمولة - pieranosny aŭdyjoplayer - Преносим аудио плеър - reproductor d'àudio portàtil - Přenosný zvukový přehrávač - bærbar lydafspiller - Portables Audio-Wiedergabegerät - φορητός αναπαραγωγέας μουσικής - portable audio player - dispositivo de sonido portable - audio erreproduzigailu eramangarria - siirrettävä äänisoitin - leysur ljóðavspælari - lecteur audio portable - seinnteoir iniompartha fuaime - dispositivo de son portábel - נגן מוזיקה נייד - prenosivi audio svirač - hordozható zenelejátszó - pemutar audio portable - Lettore audio portabile - ポータブルオーディオプレイヤー - тасымалы аудио плеер - 휴대용 오디오 플레이어 - nešiojamasis garso leistuvas - portatīvais audio atskaņotājs - draagbare audiospeler - portable audio layer - Przenośny odtwarzacz dźwięku - Reprodutor de áudio portátil - player audio portabil - портативный аудиопроигрыватель - Prenosný hudobný prehrávač - prenosni predvajalnik zvoka - Lexues audio portativ - bärbar ljudspelare - портативний аудіопрогравач - bộ phát nhạc di động - 便携式音频播放器 - 可攜式音訊播放程式 - - - - - software - برنامج - prahrama - Софтуер - programari - Software - software - Software - λογισμικό - software - software - softwarea - ohjelmisto - ritbúnaður - logiciel - bogearraí - software - תכנה - softver - szoftver - peranti lunak - Software - ソフトウェア - პროგრამული უზრუნველყოფა - бағдарламалық қамтама - 소프트웨어 - programinė įranga - programmatūra - software - programvare - Oprogramowanie - Aplicativo - software - программное обеспечение - Softvér - programska oprema - Software - programvara - програмне забезпечення - phần mềm - 软件 - 軟體 - - - - - UNIX software - برنامج يونكس - Софтуер за UNIX - programari UNIX - Software UNIX - UNIX-programmer - UNIX Software - λογισμικό UNIX - UNIX software - software de UNIX - UNIXeko softwarea - UNIX-ohjelmisto - UNIX ritbúnaður - logiciel UNIX - bogearraí UNIX - Software de UNIX - תוכנת UNIX - UNIX softver - UNIX-szoftver - Peranti lunak UNIX - Software UNIX - UNIX ソフトウェア - UNIX бағдарламасы - UNIX 소프트웨어 - UNIX programinė įranga - UNIX programmatūra - UNIX software - Oprogramowanie systemu UNIX - Software UNIX - Software UNIX - программа UNIX - Softvér UNIX - Programska datoteka UNIX - UNIX-programvara - UNIX yazılımı - програмне забезпечення UNIX - UNIX 软件 - UNIX 軟體 - - - - - - - - - - - Windows software - برنامج ويندوز - Софтуер — Windows - programari de Windows - Software Windows - Windowsprogram - Windows-Software - λογισμικό Windows - Windows software - software de Windows - Windows-eko softwarea - Windows-ohjelmisto - Windows ritbúnaður - logiciel Windows - bogearraí Windows - Software de Windows - תוכנה לWindows - Windows softver - Windows-szoftver - Piranti lunak Windows - Software Windows - Windows ソフトウェア - Windows бағдарламасы - Windows 소프트웨어 - Windows programinė įranga - Windows programmatūra - Windows software - Oprogramowanie systemu Windows - Programa do Windows - Software Windows - программа Windows - Softvér Windows - Programska oprema za okolje Windows - Windows-program - програмне забезпечення Windows - Windows 软件 - Windows 軟體 - - - - - - - - - - TriG RDF document - TriG - TriG RDF Graph Triple Language - - - - - \ No newline at end of file diff --git a/Telegram/Resources/qrc/telegram/telegram.qrc b/Telegram/Resources/qrc/telegram/telegram.qrc index cc93a15cf..a0b4d60bb 100644 --- a/Telegram/Resources/qrc/telegram/telegram.qrc +++ b/Telegram/Resources/qrc/telegram/telegram.qrc @@ -93,9 +93,6 @@ ../../icons/settings/devices/device_web_firefox.lottie ../../icons/settings/devices/device_web_safari.lottie - - ../qmime/freedesktop.org.xml - ../../default_shortcuts-custom.json ../../default_kotato-settings-custom.json diff --git a/Telegram/Resources/tl/api.tl b/Telegram/Resources/tl/api.tl index f113191df..7f1f7f43e 100644 --- a/Telegram/Resources/tl/api.tl +++ b/Telegram/Resources/tl/api.tl @@ -128,8 +128,8 @@ chatForbidden#6592a1a7 id:long title:string = Chat; channel#8261ac61 flags:# creator:flags.0?true left:flags.2?true broadcast:flags.5?true verified:flags.7?true megagroup:flags.8?true restricted:flags.9?true signatures:flags.11?true min:flags.12?true scam:flags.19?true has_link:flags.20?true has_geo:flags.21?true slowmode_enabled:flags.22?true call_active:flags.23?true call_not_empty:flags.24?true fake:flags.25?true gigagroup:flags.26?true noforwards:flags.27?true id:long access_hash:flags.13?long title:string username:flags.6?string photo:ChatPhoto date:int restriction_reason:flags.9?Vector admin_rights:flags.14?ChatAdminRights banned_rights:flags.15?ChatBannedRights default_banned_rights:flags.18?ChatBannedRights participants_count:flags.17?int = Chat; channelForbidden#17d493d5 flags:# broadcast:flags.5?true megagroup:flags.8?true id:long access_hash:long title:string until_date:flags.16?int = Chat; -chatFull#46a6ffb4 flags:# can_set_username:flags.7?true has_scheduled:flags.8?true id:long about:string participants:ChatParticipants chat_photo:flags.2?Photo notify_settings:PeerNotifySettings exported_invite:flags.13?ExportedChatInvite bot_info:flags.3?Vector pinned_msg_id:flags.6?int folder_id:flags.11?int call:flags.12?InputGroupCall ttl_period:flags.14?int groupcall_default_join_as:flags.15?Peer theme_emoticon:flags.16?string requests_pending:flags.17?int recent_requesters:flags.17?Vector = ChatFull; -channelFull#56662e2e flags:# can_view_participants:flags.3?true can_set_username:flags.6?true can_set_stickers:flags.7?true hidden_prehistory:flags.10?true can_set_location:flags.16?true has_scheduled:flags.19?true can_view_stats:flags.20?true blocked:flags.22?true id:long about:string participants_count:flags.0?int admins_count:flags.1?int kicked_count:flags.2?int banned_count:flags.2?int online_count:flags.13?int read_inbox_max_id:int read_outbox_max_id:int unread_count:int chat_photo:Photo notify_settings:PeerNotifySettings exported_invite:flags.23?ExportedChatInvite bot_info:Vector migrated_from_chat_id:flags.4?long migrated_from_max_id:flags.4?int pinned_msg_id:flags.5?int stickerset:flags.8?StickerSet available_min_id:flags.9?int folder_id:flags.11?int linked_chat_id:flags.14?long location:flags.15?ChannelLocation slowmode_seconds:flags.17?int slowmode_next_send_date:flags.18?int stats_dc:flags.12?int pts:int call:flags.21?InputGroupCall ttl_period:flags.24?int pending_suggestions:flags.25?Vector groupcall_default_join_as:flags.26?Peer theme_emoticon:flags.27?string requests_pending:flags.28?int recent_requesters:flags.28?Vector default_send_as:flags.29?Peer = ChatFull; +chatFull#d18ee226 flags:# can_set_username:flags.7?true has_scheduled:flags.8?true id:long about:string participants:ChatParticipants chat_photo:flags.2?Photo notify_settings:PeerNotifySettings exported_invite:flags.13?ExportedChatInvite bot_info:flags.3?Vector pinned_msg_id:flags.6?int folder_id:flags.11?int call:flags.12?InputGroupCall ttl_period:flags.14?int groupcall_default_join_as:flags.15?Peer theme_emoticon:flags.16?string requests_pending:flags.17?int recent_requesters:flags.17?Vector available_reactions:flags.18?Vector = ChatFull; +channelFull#e13c3d20 flags:# can_view_participants:flags.3?true can_set_username:flags.6?true can_set_stickers:flags.7?true hidden_prehistory:flags.10?true can_set_location:flags.16?true has_scheduled:flags.19?true can_view_stats:flags.20?true blocked:flags.22?true id:long about:string participants_count:flags.0?int admins_count:flags.1?int kicked_count:flags.2?int banned_count:flags.2?int online_count:flags.13?int read_inbox_max_id:int read_outbox_max_id:int unread_count:int chat_photo:Photo notify_settings:PeerNotifySettings exported_invite:flags.23?ExportedChatInvite bot_info:Vector migrated_from_chat_id:flags.4?long migrated_from_max_id:flags.4?int pinned_msg_id:flags.5?int stickerset:flags.8?StickerSet available_min_id:flags.9?int folder_id:flags.11?int linked_chat_id:flags.14?long location:flags.15?ChannelLocation slowmode_seconds:flags.17?int slowmode_next_send_date:flags.18?int stats_dc:flags.12?int pts:int call:flags.21?InputGroupCall ttl_period:flags.24?int pending_suggestions:flags.25?Vector groupcall_default_join_as:flags.26?Peer theme_emoticon:flags.27?string requests_pending:flags.28?int recent_requesters:flags.28?Vector default_send_as:flags.29?Peer available_reactions:flags.30?Vector = ChatFull; chatParticipant#c02d4007 user_id:long inviter_id:long date:int = ChatParticipant; chatParticipantCreator#e46bcee4 user_id:long = ChatParticipant; @@ -142,7 +142,7 @@ chatPhotoEmpty#37c1011c = ChatPhoto; chatPhoto#1c6e1c11 flags:# has_video:flags.0?true photo_id:long stripped_thumb:flags.1?bytes dc_id:int = ChatPhoto; messageEmpty#90a6ca84 flags:# id:int peer_id:flags.0?Peer = Message; -message#85d6cbe2 flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true post:flags.14?true from_scheduled:flags.18?true legacy:flags.19?true edit_hide:flags.21?true pinned:flags.24?true noforwards:flags.26?true id:int from_id:flags.8?Peer peer_id:Peer fwd_from:flags.2?MessageFwdHeader via_bot_id:flags.11?long reply_to:flags.3?MessageReplyHeader date:int message:string media:flags.9?MessageMedia reply_markup:flags.6?ReplyMarkup entities:flags.7?Vector views:flags.10?int forwards:flags.10?int replies:flags.23?MessageReplies edit_date:flags.15?int post_author:flags.16?string grouped_id:flags.17?long restriction_reason:flags.22?Vector ttl_period:flags.25?int = Message; +message#38116ee0 flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true post:flags.14?true from_scheduled:flags.18?true legacy:flags.19?true edit_hide:flags.21?true pinned:flags.24?true noforwards:flags.26?true id:int from_id:flags.8?Peer peer_id:Peer fwd_from:flags.2?MessageFwdHeader via_bot_id:flags.11?long reply_to:flags.3?MessageReplyHeader date:int message:string media:flags.9?MessageMedia reply_markup:flags.6?ReplyMarkup entities:flags.7?Vector views:flags.10?int forwards:flags.10?int replies:flags.23?MessageReplies edit_date:flags.15?int post_author:flags.16?string grouped_id:flags.17?long reactions:flags.20?MessageReactions restriction_reason:flags.22?Vector ttl_period:flags.25?int = Message; messageService#2b085862 flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true post:flags.14?true legacy:flags.19?true id:int from_id:flags.8?Peer peer_id:Peer reply_to:flags.3?MessageReplyHeader date:int action:MessageAction ttl_period:flags.25?int = Message; messageMediaEmpty#3ded6320 = MessageMedia; @@ -381,6 +381,7 @@ updateGroupCallConnection#b783982 flags:# presentation:flags.0?true params:DataJ updateBotCommands#4d712f2e peer:Peer bot_id:long commands:Vector = Update; updatePendingJoinRequests#7063c3db peer:Peer requests_pending:int recent_requesters:Vector = Update; updateBotChatInviteRequester#11dfa986 peer:Peer date:int user_id:long about:string invite:ExportedChatInvite qts:int = Update; +updateMessageReactions#154798c3 peer:Peer msg_id:int reactions:MessageReactions = Update; updates.state#a56c2a3e pts:int qts:int date:int seq:int unread_count:int = updates.State; @@ -614,6 +615,7 @@ messageEntityUnderline#9c4e7e8b offset:int length:int = MessageEntity; messageEntityStrike#bf0693d4 offset:int length:int = MessageEntity; messageEntityBlockquote#20df5d0 offset:int length:int = MessageEntity; messageEntityBankCard#761e6af4 offset:int length:int = MessageEntity; +messageEntitySpoiler#32ca960f offset:int length:int = MessageEntity; inputChannelEmpty#ee8c1e86 = InputChannel; inputChannel#f35aec28 channel_id:long access_hash:long = InputChannel; @@ -919,6 +921,7 @@ channelAdminLogEventActionChangeHistoryTTL#6e941a38 prev_value:int new_value:int channelAdminLogEventActionParticipantJoinByRequest#afb6144a invite:ExportedChatInvite approved_by:long = ChannelAdminLogEventAction; channelAdminLogEventActionToggleNoForwards#cb2ac766 new_value:Bool = ChannelAdminLogEventAction; channelAdminLogEventActionSendMessage#278f2868 message:Message = ChannelAdminLogEventAction; +channelAdminLogEventActionChangeAvailableReactions#9cf7f76a prev_value:Vector new_value:Vector = ChannelAdminLogEventAction; channelAdminLogEvent#1fad68cd id:long date:int user_id:long action:ChannelAdminLogEventAction = ChannelAdminLogEvent; @@ -1282,7 +1285,7 @@ account.resetPasswordFailedWait#e3779861 retry_date:int = account.ResetPasswordR account.resetPasswordRequestedWait#e9effc7d until_date:int = account.ResetPasswordResult; account.resetPasswordOk#e926d63e = account.ResetPasswordResult; -sponsoredMessage#d151e19a flags:# random_id:bytes from_id:Peer channel_post:flags.2?int start_param:flags.0?string message:string entities:flags.1?Vector = SponsoredMessage; +sponsoredMessage#3a836df8 flags:# random_id:bytes from_id:flags.3?Peer chat_invite:flags.4?ChatInvite chat_invite_hash:flags.4?string channel_post:flags.2?int start_param:flags.0?string message:string entities:flags.1?Vector = SponsoredMessage; messages.sponsoredMessages#65a4c7d5 messages:Vector chats:Vector users:Vector = messages.SponsoredMessages; @@ -1302,6 +1305,19 @@ messages.peerSettings#6880b94d settings:PeerSettings chats:Vector users:Ve auth.loggedOut#c3a2835f flags:# future_auth_token:flags.0?bytes = auth.LoggedOut; +reactionCount#6fb250d1 flags:# chosen:flags.0?true reaction:string count:int = ReactionCount; + +messageReactions#87b6e36 flags:# min:flags.0?true can_see_list:flags.2?true results:Vector recent_reactons:flags.1?Vector = MessageReactions; + +messageUserReaction#932844fa user_id:long reaction:string = MessageUserReaction; + +messages.messageReactionsList#a366923c flags:# count:int reactions:Vector users:Vector next_offset:flags.0?string = messages.MessageReactionsList; + +availableReaction#21d7c4b flags:# inactive:flags.0?true reaction:string title:string static_icon:Document appear_animation:Document select_animation:Document activate_animation:Document effect_animation:Document = AvailableReaction; + +messages.availableReactionsNotModified#9f071957 = messages.AvailableReactions; +messages.availableReactions#768e3aad hash:int reactions:Vector = messages.AvailableReactions; + ---functions--- invokeAfterMsg#cb9f372d {X:Type} msg_id:long query:!X = X; @@ -1440,9 +1456,9 @@ messages.deleteHistory#b08f922a flags:# just_clear:flags.0?true revoke:flags.1?t messages.deleteMessages#e58e95d2 flags:# revoke:flags.0?true id:Vector = messages.AffectedMessages; messages.receivedMessages#5a954c0 max_id:int = Vector; messages.setTyping#58943ee2 flags:# peer:InputPeer top_msg_id:flags.0?int action:SendMessageAction = Bool; -messages.sendMessage#d9d75a4 flags:# no_webpage:flags.1?true silent:flags.5?true background:flags.6?true clear_draft:flags.7?true peer:InputPeer reply_to_msg_id:flags.0?int message:string random_id:long reply_markup:flags.2?ReplyMarkup entities:flags.3?Vector schedule_date:flags.10?int send_as:flags.13?InputPeer = Updates; -messages.sendMedia#e25ff8e0 flags:# silent:flags.5?true background:flags.6?true clear_draft:flags.7?true peer:InputPeer reply_to_msg_id:flags.0?int media:InputMedia message:string random_id:long reply_markup:flags.2?ReplyMarkup entities:flags.3?Vector schedule_date:flags.10?int send_as:flags.13?InputPeer = Updates; -messages.forwardMessages#cc30290b flags:# silent:flags.5?true background:flags.6?true with_my_score:flags.8?true drop_author:flags.11?true drop_media_captions:flags.12?true from_peer:InputPeer id:Vector random_id:Vector to_peer:InputPeer schedule_date:flags.10?int send_as:flags.13?InputPeer = Updates; +messages.sendMessage#d9d75a4 flags:# no_webpage:flags.1?true silent:flags.5?true background:flags.6?true clear_draft:flags.7?true noforwards:flags.14?true peer:InputPeer reply_to_msg_id:flags.0?int message:string random_id:long reply_markup:flags.2?ReplyMarkup entities:flags.3?Vector schedule_date:flags.10?int send_as:flags.13?InputPeer = Updates; +messages.sendMedia#e25ff8e0 flags:# silent:flags.5?true background:flags.6?true clear_draft:flags.7?true noforwards:flags.14?true peer:InputPeer reply_to_msg_id:flags.0?int media:InputMedia message:string random_id:long reply_markup:flags.2?ReplyMarkup entities:flags.3?Vector schedule_date:flags.10?int send_as:flags.13?InputPeer = Updates; +messages.forwardMessages#cc30290b flags:# silent:flags.5?true background:flags.6?true with_my_score:flags.8?true drop_author:flags.11?true drop_media_captions:flags.12?true noforwards:flags.14?true from_peer:InputPeer id:Vector random_id:Vector to_peer:InputPeer schedule_date:flags.10?int send_as:flags.13?InputPeer = Updates; messages.reportSpam#cf1592db peer:InputPeer = Bool; messages.getPeerSettings#efd9a6a2 peer:InputPeer = messages.PeerSettings; messages.report#8953ab4e peer:InputPeer id:Vector reason:ReportReason message:string = Bool; @@ -1521,7 +1537,7 @@ messages.faveSticker#b9ffc55b id:InputDocument unfave:Bool = Bool; messages.getUnreadMentions#46578472 peer:InputPeer offset_id:int add_offset:int limit:int max_id:int min_id:int = messages.Messages; messages.readMentions#f0189d3 peer:InputPeer = messages.AffectedHistory; messages.getRecentLocations#702a40e0 peer:InputPeer limit:int hash:long = messages.Messages; -messages.sendMultiMedia#f803138f flags:# silent:flags.5?true background:flags.6?true clear_draft:flags.7?true peer:InputPeer reply_to_msg_id:flags.0?int multi_media:Vector schedule_date:flags.10?int send_as:flags.13?InputPeer = Updates; +messages.sendMultiMedia#f803138f flags:# silent:flags.5?true background:flags.6?true clear_draft:flags.7?true noforwards:flags.14?true peer:InputPeer reply_to_msg_id:flags.0?int multi_media:Vector schedule_date:flags.10?int send_as:flags.13?InputPeer = Updates; messages.uploadEncryptedFile#5057c497 peer:InputEncryptedChat file:InputEncryptedFile = EncryptedFile; messages.searchStickerSets#35705b8a flags:# exclude_featured:flags.0?true q:string hash:long = messages.FoundStickerSets; messages.getSplitRanges#1cff7e08 = Vector; @@ -1580,6 +1596,12 @@ messages.hideChatJoinRequest#7fe7e815 flags:# approved:flags.0?true peer:InputPe messages.hideAllChatJoinRequests#e085f4ea flags:# approved:flags.0?true peer:InputPeer link:flags.1?string = Updates; messages.toggleNoForwards#b11eafa2 peer:InputPeer enabled:Bool = Updates; messages.saveDefaultSendAs#ccfddf96 peer:InputPeer send_as:InputPeer = Bool; +messages.sendReaction#25690ce4 flags:# peer:InputPeer msg_id:int reaction:flags.0?string = Updates; +messages.getMessagesReactions#8bba90e6 peer:InputPeer id:Vector = Updates; +messages.getMessageReactionsList#e0ee6b77 flags:# peer:InputPeer id:int reaction:flags.0?string offset:flags.1?string limit:int = messages.MessageReactionsList; +messages.setChatAvailableReactions#14050ea6 peer:InputPeer available_reactions:Vector = Updates; +messages.getAvailableReactions#18dea0ac hash:int = messages.AvailableReactions; +messages.setDefaultReaction#d960c4d4 reaction:string = Bool; updates.getState#edd4882a = updates.State; updates.getDifference#25939651 flags:# pts:int pts_total_limit:flags.0?int date:int qts:int = updates.Difference; @@ -1728,4 +1750,4 @@ stats.getMegagroupStats#dcdf8607 flags:# dark:flags.0?true channel:InputChannel stats.getMessagePublicForwards#5630281b channel:InputChannel msg_id:int offset_rate:int offset_peer:InputPeer offset_id:int limit:int = messages.Messages; stats.getMessageStats#b6e0a3f5 flags:# dark:flags.0?true channel:InputChannel msg_id:int = stats.MessageStats; -// LAYER 135 +// LAYER 136 diff --git a/Telegram/Resources/uwp/AppX/AppxManifest.xml b/Telegram/Resources/uwp/AppX/AppxManifest.xml index 9e4755846..3e87f6b5d 100644 --- a/Telegram/Resources/uwp/AppX/AppxManifest.xml +++ b/Telegram/Resources/uwp/AppX/AppxManifest.xml @@ -10,7 +10,7 @@ + Version="3.4.3.0" /> Telegram Desktop Telegram Messenger LLP diff --git a/Telegram/Resources/winrc/Telegram.rc b/Telegram/Resources/winrc/Telegram.rc index 3e06cabaf..20c6bd17a 100644 --- a/Telegram/Resources/winrc/Telegram.rc +++ b/Telegram/Resources/winrc/Telegram.rc @@ -44,8 +44,8 @@ IDI_ICON1 ICON "..\\art\\icon256.ico" // VS_VERSION_INFO VERSIONINFO - FILEVERSION 3,3,0,0 - PRODUCTVERSION 3,3,0,0 + FILEVERSION 3,4,3,0 + PRODUCTVERSION 3,4,3,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -62,10 +62,10 @@ BEGIN BEGIN VALUE "CompanyName", "Telegram FZ-LLC" VALUE "FileDescription", "Telegram Desktop" - VALUE "FileVersion", "3.3.0.0" + VALUE "FileVersion", "3.4.3.0" VALUE "LegalCopyright", "Copyright (C) 2014-2021" VALUE "ProductName", "Telegram Desktop" - VALUE "ProductVersion", "3.3.0.0" + VALUE "ProductVersion", "3.4.3.0" END END BLOCK "VarFileInfo" diff --git a/Telegram/Resources/winrc/Updater.rc b/Telegram/Resources/winrc/Updater.rc index 7e621db0b..5a61a33f2 100644 --- a/Telegram/Resources/winrc/Updater.rc +++ b/Telegram/Resources/winrc/Updater.rc @@ -35,8 +35,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US // VS_VERSION_INFO VERSIONINFO - FILEVERSION 3,3,0,0 - PRODUCTVERSION 3,3,0,0 + FILEVERSION 3,4,3,0 + PRODUCTVERSION 3,4,3,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -53,10 +53,10 @@ BEGIN BEGIN VALUE "CompanyName", "Telegram FZ-LLC" VALUE "FileDescription", "Telegram Desktop Updater" - VALUE "FileVersion", "3.3.0.0" + VALUE "FileVersion", "3.4.3.0" VALUE "LegalCopyright", "Copyright (C) 2014-2021" VALUE "ProductName", "Telegram Desktop" - VALUE "ProductVersion", "3.3.0.0" + VALUE "ProductVersion", "3.4.3.0" END END BLOCK "VarFileInfo" diff --git a/Telegram/SourceFiles/api/api_peer_photo.cpp b/Telegram/SourceFiles/api/api_peer_photo.cpp index 28f47583f..97456fdd6 100644 --- a/Telegram/SourceFiles/api/api_peer_photo.cpp +++ b/Telegram/SourceFiles/api/api_peer_photo.cpp @@ -118,7 +118,7 @@ void PeerPhoto::upload(not_null peer, QImage &&image) { std::move(image)); const auto fakeId = FullMsgId( - peerToChannel(peer->id), + peer->id, _session->data().nextLocalMessageId()); const auto already = ranges::find( _uploads, diff --git a/Telegram/SourceFiles/api/api_sending.cpp b/Telegram/SourceFiles/api/api_sending.cpp index 2dd5ecef0..f072a490c 100644 --- a/Telegram/SourceFiles/api/api_sending.cpp +++ b/Telegram/SourceFiles/api/api_sending.cpp @@ -77,7 +77,7 @@ void SendExistingMedia( api->sendAction(message.action); const auto newId = FullMsgId( - peerToChannel(peer->id), + peer->id, session->data().nextLocalMessageId()); const auto randomId = base::RandomValue(); @@ -294,7 +294,7 @@ bool SendDice( api->sendAction(message.action); const auto newId = FullMsgId( - peerToChannel(peer->id), + peer->id, session->data().nextLocalMessageId()); const auto randomId = base::RandomValue(); @@ -390,10 +390,8 @@ void SendConfirmedFile( const std::shared_ptr &file) { const auto isEditing = (file->type != SendMediaType::Audio) && (file->to.replaceMediaOf != 0); - const auto channelId = peerToChannel(file->to.peer); - const auto newId = FullMsgId( - channelId, + file->to.peer, isEditing ? file->to.replaceMediaOf : session->data().nextLocalMessageId()); @@ -498,6 +496,7 @@ void SendConfirmedFile( edition.textWithEntities = caption; edition.useSameMarkup = true; edition.useSameReplies = true; + edition.useSameReactions = true; itemToEdit->applyEdition(std::move(edition)); } else { const auto viaBotId = UserId(); diff --git a/Telegram/SourceFiles/api/api_single_message_search.cpp b/Telegram/SourceFiles/api/api_single_message_search.cpp index 4b374f3bb..6f810eb86 100644 --- a/Telegram/SourceFiles/api/api_single_message_search.cpp +++ b/Telegram/SourceFiles/api/api_single_message_search.cpp @@ -87,7 +87,7 @@ std::optional SingleMessageSearch::performLookupByChannel( Expects(!_requestKey.empty()); const auto postId = _requestKey.postId; - if (const auto item = _session->data().message(channel, postId)) { + if (const auto item = _session->data().message(channel->id, postId)) { _cache.emplace(_requestKey, item->fullId()); return item; } else if (!ready) { @@ -112,7 +112,7 @@ std::optional SingleMessageSearch::performLookupByChannel( && received.messageIds.front() == postId) { _cache.emplace( _requestKey, - FullMsgId(peerToChannel(channel->id), postId)); + FullMsgId(channel->id, postId)); ready(); } else { fail(); diff --git a/Telegram/SourceFiles/api/api_text_entities.cpp b/Telegram/SourceFiles/api/api_text_entities.cpp index e74fb59fc..52b0aad47 100644 --- a/Telegram/SourceFiles/api/api_text_entities.cpp +++ b/Telegram/SourceFiles/api/api_text_entities.cpp @@ -75,6 +75,7 @@ EntitiesInText EntitiesFromMTP( case mtpc_messageEntityCode: { auto &d = entity.c_messageEntityCode(); result.push_back({ EntityType::Code, d.voffset().v, d.vlength().v }); } break; case mtpc_messageEntityPre: { auto &d = entity.c_messageEntityPre(); result.push_back({ EntityType::Pre, d.voffset().v, d.vlength().v, Clean(qs(d.vlanguage())) }); } break; case mtpc_messageEntityBankCard: break; // Skipping cards. + case mtpc_messageEntitySpoiler: { auto &d = entity.c_messageEntitySpoiler(); result.push_back({ EntityType::Spoiler, d.voffset().v, d.vlength().v }); } break; // #TODO entities } } @@ -98,6 +99,7 @@ MTPVector EntitiesToMTP( && entity.type() != EntityType::StrikeOut && entity.type() != EntityType::Code // #TODO entities && entity.type() != EntityType::Pre + && entity.type() != EntityType::Spoiler && entity.type() != EntityType::MentionName && entity.type() != EntityType::CustomUrl) { continue; @@ -169,6 +171,7 @@ MTPVector EntitiesToMTP( case EntityType::StrikeOut: v.push_back(MTP_messageEntityStrike(offset, length)); break; case EntityType::Code: v.push_back(MTP_messageEntityCode(offset, length)); break; // #TODO entities case EntityType::Pre: v.push_back(MTP_messageEntityPre(offset, length, MTP_string(entity.data()))); break; + case EntityType::Spoiler: v.push_back(MTP_messageEntitySpoiler(offset, length)); break; } } return MTP_vector(std::move(v)); diff --git a/Telegram/SourceFiles/api/api_updates.cpp b/Telegram/SourceFiles/api/api_updates.cpp index fb97541c2..17e0b1e0b 100644 --- a/Telegram/SourceFiles/api/api_updates.cpp +++ b/Telegram/SourceFiles/api/api_updates.cpp @@ -730,7 +730,7 @@ void Updates::addActiveChat(rpl::producer chat) { } void Updates::requestChannelRangeDifference(not_null history) { - Expects(history->isChannel()); + Expects(history->peer->isChannel()); const auto channel = history->peer->asChannel(); if (const auto requestId = _rangeDifferenceRequests.take(channel)) { @@ -1109,7 +1109,7 @@ void Updates::applyUpdatesNoPtsCheck(const MTPUpdates &updates) { MTPint(), // edit_date MTPstring(), MTPlong(), - //MTPMessageReactions(), + MTPMessageReactions(), MTPVector(), MTP_int(d.vttl_period().value_or_empty())), MessageFlags(), @@ -1140,7 +1140,7 @@ void Updates::applyUpdatesNoPtsCheck(const MTPUpdates &updates) { MTPint(), // edit_date MTPstring(), MTPlong(), - //MTPMessageReactions(), + MTPMessageReactions(), MTPVector(), MTP_int(d.vttl_period().value_or_empty())), MessageFlags(), @@ -1163,7 +1163,7 @@ void Updates::applyUpdateNoPtsCheck(const MTPUpdate &update) { auto needToAdd = true; if (d.vmessage().type() == mtpc_message) { // index forwarded messages to links _overview const auto &data = d.vmessage().c_message(); - if (_session->data().checkEntitiesAndViewsUpdate(data)) { // already in blocks + if (_session->data().updateExistingMessage(data)) { // already in blocks LOG(("Skipping message, because it is already in blocks!")); needToAdd = false; } @@ -1181,7 +1181,7 @@ void Updates::applyUpdateNoPtsCheck(const MTPUpdate &update) { const auto &d = update.c_updateReadMessagesContents(); auto possiblyReadMentions = base::flat_set(); for (const auto &msgId : d.vmessages().v) { - if (const auto item = _session->data().message(NoChannel, msgId.v)) { + if (const auto item = _session->data().nonChannelMessage(msgId.v)) { if (item->isUnreadMedia() || item->isUnreadMention()) { item->markMediaRead(); _session->data().requestItemRepaint(item); @@ -1249,7 +1249,7 @@ void Updates::applyUpdateNoPtsCheck(const MTPUpdate &update) { case mtpc_updateDeleteMessages: { auto &d = update.c_updateDeleteMessages(); - _session->data().processMessagesDeleted(NoChannel, d.vmessages().v); + _session->data().processNonChannelMessagesDeleted(d.vmessages().v); } break; case mtpc_updateNewChannelMessage: { @@ -1257,7 +1257,7 @@ void Updates::applyUpdateNoPtsCheck(const MTPUpdate &update) { auto needToAdd = true; if (d.vmessage().type() == mtpc_message) { // index forwarded messages to links _overview const auto &data = d.vmessage().c_message(); - if (_session->data().checkEntitiesAndViewsUpdate(data)) { // already in blocks + if (_session->data().updateExistingMessage(data)) { // already in blocks LOG(("Skipping message, because it is already in blocks!")); needToAdd = false; } @@ -1278,9 +1278,9 @@ void Updates::applyUpdateNoPtsCheck(const MTPUpdate &update) { case mtpc_updatePinnedChannelMessages: { const auto &d = update.c_updatePinnedChannelMessages(); - const auto channelId = d.vchannel_id().v; + const auto peerId = peerFromChannel(d.vchannel_id()); for (const auto &msgId : d.vmessages().v) { - const auto item = session().data().message(channelId, msgId.v); + const auto item = session().data().message(peerId, msgId.v); if (item) { item->setIsPinned(d.is_pinned()); } @@ -1299,13 +1299,16 @@ void Updates::applyUpdateNoPtsCheck(const MTPUpdate &update) { case mtpc_updateDeleteChannelMessages: { auto &d = update.c_updateDeleteChannelMessages(); - _session->data().processMessagesDeleted(d.vchannel_id().v, d.vmessages().v); + _session->data().processMessagesDeleted( + peerFromChannel(d.vchannel_id().v), + d.vmessages().v); } break; case mtpc_updatePinnedMessages: { const auto &d = update.c_updatePinnedMessages(); + const auto peerId = peerFromMTP(d.vpeer()); for (const auto &msgId : d.vmessages().v) { - const auto item = session().data().message(0, msgId.v); + const auto item = session().data().message(peerId, msgId.v); if (item) { item->setIsPinned(d.is_pinned()); } @@ -1424,7 +1427,7 @@ void Updates::applyUpdates( const auto sent = owner.messageSentData(randomId); const auto lookupMessage = [&] { return sent.peerId - ? owner.message(peerToChannel(sent.peerId), d.vid().v) + ? owner.message(sent.peerId, d.vid().v) : nullptr; }; if (const auto id = owner.messageIdByRandomId(randomId)) { @@ -1439,9 +1442,9 @@ void Updates::applyUpdates( const auto list = d.ventities(); if (list && !MentionUsersLoaded(&session(), *list)) { session().api().requestMessageData( - item->history()->peer->asChannel(), + item->history()->peer, item->id, - ApiWrap::RequestMessageDataCallback()); + nullptr); } item->applySentMessage(sent.text, d, wasAlready); } @@ -1527,9 +1530,8 @@ void Updates::feedUpdate(const MTPUpdate &update) { if (local->isScheduled()) { session().data().scheduledMessages().apply(d, local); } else { - const auto channel = id.channel; const auto existing = session().data().message( - channel, + id.peer, newId); if (existing && !local->mainView()) { const auto history = local->history(); @@ -1566,7 +1568,7 @@ void Updates::feedUpdate(const MTPUpdate &update) { } auto possiblyReadMentions = base::flat_set(); for (const auto &msgId : d.vmessages().v) { - if (auto item = session().data().message(channel, msgId.v)) { + if (auto item = session().data().message(channel->id, msgId.v)) { if (item->isUnreadMedia() || item->isUnreadMention()) { item->markMediaRead(); session().data().requestItemRepaint(item); @@ -1615,6 +1617,19 @@ void Updates::feedUpdate(const MTPUpdate &update) { } } break; + case mtpc_updateMessageReactions: { + const auto &d = update.c_updateMessageReactions(); + const auto peer = peerFromMTP(d.vpeer()); + if (const auto history = session().data().historyLoaded(peer)) { + const auto item = session().data().message( + peer, + d.vmsg_id().v); + if (item) { + item->updateReactions(&d.vreactions()); + } + } + } break; + // Messages being read. case mtpc_updateReadHistoryInbox: { auto &d = update.c_updateReadHistoryInbox(); @@ -2146,24 +2161,28 @@ void Updates::feedUpdate(const MTPUpdate &update) { case mtpc_updateChannelMessageViews: { const auto &d = update.c_updateChannelMessageViews(); - if (const auto item = session().data().message(d.vchannel_id().v, d.vid().v)) { - item->setViewsCount(d.vviews().v); + const auto peerId = peerFromChannel(d.vchannel_id()); + if (const auto item = session().data().message(peerId, d.vid().v)) { + if (item->changeViewsCount(d.vviews().v)) { + session().data().notifyItemDataChange(item); + } } } break; case mtpc_updateChannelMessageForwards: { const auto &d = update.c_updateChannelMessageForwards(); - if (const auto item = session().data().message(d.vchannel_id().v, d.vid().v)) { + const auto peerId = peerFromChannel(d.vchannel_id()); + if (const auto item = session().data().message(peerId, d.vid().v)) { item->setForwardsCount(d.vforwards().v); } } break; case mtpc_updateReadChannelDiscussionInbox: { const auto &d = update.c_updateReadChannelDiscussionInbox(); - const auto channelId = d.vchannel_id().v; + const auto peerId = peerFromChannel(d.vchannel_id()); const auto msgId = d.vtop_msg_id().v; const auto readTillId = d.vread_max_id().v; - const auto item = session().data().message(channelId, msgId); + const auto item = session().data().message(peerId, msgId); const auto unreadCount = item ? session().data().countUnreadRepliesLocally(item, readTillId) : std::nullopt; @@ -2175,7 +2194,7 @@ void Updates::feedUpdate(const MTPUpdate &update) { } if (const auto broadcastId = d.vbroadcast_id()) { if (const auto post = session().data().message( - broadcastId->v, + peerFromChannel(*broadcastId), d.vbroadcast_post()->v)) { post->setRepliesInboxReadTill(readTillId, unreadCount); } @@ -2184,10 +2203,10 @@ void Updates::feedUpdate(const MTPUpdate &update) { case mtpc_updateReadChannelDiscussionOutbox: { const auto &d = update.c_updateReadChannelDiscussionOutbox(); - const auto channelId = d.vchannel_id().v; + const auto peerId = peerFromChannel(d.vchannel_id()); const auto msgId = d.vtop_msg_id().v; const auto readTillId = d.vread_max_id().v; - const auto item = session().data().message(channelId, msgId); + const auto item = session().data().message(peerId, msgId); if (item) { item->setRepliesOutboxReadTill(readTillId); if (const auto post = item->lookupDiscussionPostOriginal()) { diff --git a/Telegram/SourceFiles/api/api_views.cpp b/Telegram/SourceFiles/api/api_views.cpp index 426b2d02a..dda9d7e69 100644 --- a/Telegram/SourceFiles/api/api_views.cpp +++ b/Telegram/SourceFiles/api/api_views.cpp @@ -95,12 +95,13 @@ void ViewsManager::done( if (id != requestId) { continue; } - const auto channel = peerToChannel(peer->id); for (auto j = 0, l = int(ids.size()); j < l; ++j) { - if (const auto item = owner.message(channel, ids[j].v)) { + if (const auto item = owner.message(peer->id, ids[j].v)) { v[j].match([&](const MTPDmessageViews &data) { if (const auto views = data.vviews()) { - item->setViewsCount(views->v); + if (item->changeViewsCount(views->v)) { + _session->data().notifyItemDataChange(item); + } } if (const auto forwards = data.vforwards()) { item->setForwardsCount(forwards->v); diff --git a/Telegram/SourceFiles/api/api_who_read.cpp b/Telegram/SourceFiles/api/api_who_reacted.cpp similarity index 50% rename from Telegram/SourceFiles/api/api_who_read.cpp rename to Telegram/SourceFiles/api/api_who_reacted.cpp index 40f659c95..deefd7f22 100644 --- a/Telegram/SourceFiles/api/api_who_read.cpp +++ b/Telegram/SourceFiles/api/api_who_reacted.cpp @@ -5,7 +5,7 @@ the official desktop application for the Telegram messaging service. For license and copyright information please follow this link: https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ -#include "api/api_who_read.h" +#include "api/api_who_reacted.h" #include "history/history_item.h" #include "history/history.h" @@ -22,39 +22,87 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "main/main_account.h" #include "base/unixtime.h" #include "base/weak_ptr.h" -#include "ui/controls/who_read_context_action.h" +#include "ui/controls/who_reacted_context_action.h" #include "apiwrap.h" #include "styles/style_chat.h" namespace Api { namespace { -struct Cached { - explicit Cached(PeerId unknownFlag) - : list(std::vector{ unknownFlag }) { +constexpr auto kContextReactionsLimit = 50; + +struct Peers { + std::vector list; + bool unknown = false; +}; +inline bool operator==(const Peers &a, const Peers &b) noexcept { + return (a.list == b.list) && (a.unknown == b.unknown); +} + +struct PeerWithReaction { + PeerId peer = 0; + QString reaction; +}; +inline bool operator==( + const PeerWithReaction &a, + const PeerWithReaction &b) noexcept { + return (a.peer == b.peer) && (a.reaction == b.reaction); +} + +struct PeersWithReactions { + std::vector list; + int fullReactionsCount = 0; + bool unknown = false; +}; +inline bool operator==( + const PeersWithReactions &a, + const PeersWithReactions &b) noexcept { + return (a.fullReactionsCount == b.fullReactionsCount) + && (a.list == b.list) + && (a.unknown == b.unknown); +} + +struct CachedRead { + CachedRead() + : data(Peers{ .unknown = true }) { } - rpl::variable> list; + rpl::variable data; + mtpRequestId requestId = 0; +}; + +struct CachedReacted { + CachedReacted() + : data(PeersWithReactions{ .unknown = true }) { + } + rpl::variable data; mtpRequestId requestId = 0; }; struct Context { - base::flat_map, Cached> cached; + base::flat_map, CachedRead> cachedRead; + base::flat_map, CachedReacted> cachedReacted; base::flat_map, rpl::lifetime> subscriptions; - [[nodiscard]] Cached &cache(not_null item) { - const auto i = cached.find(item); - if (i != end(cached)) { + [[nodiscard]] CachedRead &cacheRead(not_null item) { + const auto i = cachedRead.find(item); + if (i != end(cachedRead)) { return i->second; } - return cached.emplace( - item, - Cached(item->history()->session().userPeerId()) - ).first->second; + return cachedRead.emplace(item, CachedRead()).first->second; + } + + [[nodiscard]] CachedReacted &cacheReacted(not_null item) { + const auto i = cachedReacted.find(item); + if (i != end(cachedReacted)) { + return i->second; + } + return cachedReacted.emplace(item, CachedReacted()).first->second; } }; struct Userpic { not_null peer; + QString reaction; mutable std::shared_ptr view; mutable InMemoryKey uniqueKey; }; @@ -87,7 +135,12 @@ struct State { QObject::connect(key.get(), &QObject::destroyed, [=] { auto &contexts = Contexts(); const auto i = contexts.find(key); - for (auto &[item, entry] : i->second->cached) { + for (auto &[item, entry] : i->second->cachedRead) { + if (const auto requestId = entry.requestId) { + item->history()->session().api().request(requestId).cancel(); + } + } + for (auto &[item, entry] : i->second->cachedReacted) { if (const auto requestId = entry.requestId) { item->history()->session().api().request(requestId).cancel(); } @@ -97,6 +150,28 @@ struct State { return result; } +[[nodiscard]] not_null PreparedContextAt(not_null key, not_null session) { + const auto context = ContextAt(key); + if (context->subscriptions.contains(session)) { + return context; + } + session->changes().messageUpdates( + Data::MessageUpdate::Flag::Destroyed + ) | rpl::start_with_next([=](const Data::MessageUpdate &update) { + const auto i = context->cachedRead.find(update.item); + if (i != end(context->cachedRead)) { + session->api().request(i->second.requestId).cancel(); + context->cachedRead.erase(i); + } + const auto j = context->cachedReacted.find(update.item); + if (j != end(context->cachedReacted)) { + session->api().request(j->second.requestId).cancel(); + context->cachedReacted.erase(j); + } + }, context->subscriptions[session]); + return context; +} + [[nodiscard]] QImage GenerateUserpic(Userpic &userpic, int size) { size *= style::DevicePixelRatio(); auto result = userpic.peer->generateUserpicImage(userpic.view, size); @@ -104,14 +179,7 @@ struct State { return result; } -[[nodiscard]] bool ListUnknown( - const std::vector &list, - not_null item) { - return (list.size() == 1) - && (list.front() == item->history()->session().userPeerId()); -} - -[[nodiscard]] Ui::WhoReadType DetectType(not_null item) { +[[nodiscard]] Ui::WhoReadType DetectSeenType(not_null item) { if (const auto media = item->media()) { if (!media->webpage()) { if (const auto document = media->document()) { @@ -126,7 +194,7 @@ struct State { return Ui::WhoReadType::Seen; } -[[nodiscard]] rpl::producer> WhoReadIds( +[[nodiscard]] rpl::producer WhoReadIds( not_null item, not_null context) { auto weak = QPointer(context.get()); @@ -135,20 +203,8 @@ struct State { if (!weak) { return rpl::lifetime(); } - const auto context = ContextAt(weak.data()); - if (!context->subscriptions.contains(session)) { - session->changes().messageUpdates( - Data::MessageUpdate::Flag::Destroyed - ) | rpl::start_with_next([=](const Data::MessageUpdate &update) { - const auto i = context->cached.find(update.item); - if (i == end(context->cached)) { - return; - } - session->api().request(i->second.requestId).cancel(); - context->cached.erase(i); - }, context->subscriptions[session]); - } - auto &entry = context->cache(item); + const auto context = PreparedContextAt(weak.data(), session); + auto &entry = context->cacheRead(item); if (!entry.requestId) { entry.requestId = session->api().request( MTPmessages_GetMessageReadParticipants( @@ -156,53 +212,146 @@ struct State { MTP_int(item->id) ) ).done([=](const MTPVector &result) { - auto &entry = context->cache(item); + auto &entry = context->cacheRead(item); entry.requestId = 0; - auto peers = std::vector(); - peers.reserve(std::max(int(result.v.size()), 1)); + auto parsed = Peers(); + parsed.list.reserve(result.v.size()); for (const auto &id : result.v) { - peers.push_back(UserId(id)); + parsed.list.push_back(UserId(id)); } - entry.list = std::move(peers); + entry.data = std::move(parsed); }).fail([=] { - auto &entry = context->cache(item); + auto &entry = context->cacheRead(item); entry.requestId = 0; - if (ListUnknown(entry.list.current(), item)) { - entry.list = std::vector(); + if (entry.data.current().unknown) { + entry.data = Peers(); } }).send(); } - return entry.list.value().start_existing(consumer); + return entry.data.value().start_existing(consumer); }; } +[[nodiscard]] PeersWithReactions WithEmptyReactions( + const Peers &peers) { + return PeersWithReactions{ + .list = peers.list | ranges::views::transform([](PeerId peer) { + return PeerWithReaction{.peer = peer }; + }) | ranges::to_vector, + .unknown = peers.unknown, + }; +} + +[[nodiscard]] rpl::producer WhoReactedIds( + not_null item, + not_null context) { + auto weak = QPointer(context.get()); + const auto session = &item->history()->session(); + return [=](auto consumer) { + if (!weak) { + return rpl::lifetime(); + } + const auto context = PreparedContextAt(weak.data(), session); + auto &entry = context->cacheReacted(item); + if (!entry.requestId) { + entry.requestId = session->api().request( + MTPmessages_GetMessageReactionsList( + MTP_flags(0), + item->history()->peer->input, + MTP_int(item->id), + MTPstring(), // reaction + MTPstring(), // offset + MTP_int(kContextReactionsLimit) + ) + ).done([=](const MTPmessages_MessageReactionsList &result) { + auto &entry = context->cacheReacted(item); + entry.requestId = 0; + + result.match([&]( + const MTPDmessages_messageReactionsList &data) { + session->data().processUsers(data.vusers()); + + auto parsed = PeersWithReactions{ + .fullReactionsCount = data.vcount().v, + }; + parsed.list.reserve(data.vreactions().v.size()); + for (const auto &vote : data.vreactions().v) { + vote.match([&](const auto &data) { + parsed.list.push_back(PeerWithReaction{ + .peer = peerFromUser(data.vuser_id()), + .reaction = qs(data.vreaction()), + }); + }); + } + entry.data = std::move(parsed); + }); + }).fail([=] { + auto &entry = context->cacheReacted(item); + entry.requestId = 0; + if (entry.data.current().unknown) { + entry.data = PeersWithReactions(); + } + }).send(); + } + return entry.data.value().start_existing(consumer); + }; +} + +[[nodiscard]] auto WhoReadOrReactedIds( + not_null item, + not_null context) +-> rpl::producer { + return rpl::combine( + WhoReactedIds(item, context), + WhoReadIds(item, context) + ) | rpl::map([=](PeersWithReactions reacted, Peers read) { + if (reacted.unknown || read.unknown) { + return PeersWithReactions{ .unknown = true }; + } + auto &list = reacted.list; + for (const auto &peer : read.list) { + if (!ranges::contains(list, peer, &PeerWithReaction::peer)) { + list.push_back({ .peer = peer }); + } + } + return reacted; + }); +} + bool UpdateUserpics( not_null state, not_null item, - const std::vector &ids) { + const std::vector &ids) { auto &owner = item->history()->owner(); + struct ResolvedPeer { + PeerData *peer = nullptr; + QString reaction; + }; const auto peers = ranges::views::all( ids - ) | ranges::views::transform([&](PeerId id) { - return owner.peerLoaded(id); - }) | ranges::views::filter([](PeerData *peer) { - return peer != nullptr; - }) | ranges::views::transform([](PeerData *peer) { - return not_null(peer); + ) | ranges::views::transform([&](PeerWithReaction id) { + return ResolvedPeer{ + .peer = owner.peerLoaded(id.peer), + .reaction = id.reaction, + }; + }) | ranges::views::filter([](ResolvedPeer resolved) { + return resolved.peer != nullptr; }) | ranges::to_vector; const auto same = ranges::equal( state->userpics, peers, - ranges::less(), - &Userpic::peer); + ranges::equal_to(), + &Userpic::peer, + [](const ResolvedPeer &r) { return not_null{ r.peer }; }); if (same) { return false; } auto &was = state->userpics; auto now = std::vector(); - for (const auto &peer : peers) { + for (const auto &resolved : peers) { + const auto peer = not_null{ resolved.peer }; if (ranges::contains(now, peer, &Userpic::peer)) { continue; } @@ -213,6 +362,7 @@ bool UpdateUserpics( } now.push_back(Userpic{ .peer = peer, + .reaction = resolved.reaction, }); auto &userpic = now.back(); userpic.uniqueKey = peer->userpicUniqueKey(userpic.view); @@ -261,6 +411,7 @@ void RegenerateParticipants(not_null state, int small, int large) { } now.push_back({ .name = peer->name, + .reaction = userpic.reaction, .userpicLarge = GenerateUserpic(userpic, large), .userpicKey = userpic.uniqueKey, .id = id, @@ -278,7 +429,7 @@ bool WhoReadExists(not_null item) { if (!item->out()) { return false; } - const auto type = DetectType(item); + const auto type = DetectSeenType(item); const auto unseen = (type == Ui::WhoReadType::Seen) ? item->unread() : item->isUnreadMedia(); @@ -309,7 +460,11 @@ bool WhoReadExists(not_null item) { return true; } -rpl::producer WhoRead( +bool WhoReactedExists(not_null item) { + return item->canViewReactions() || WhoReadExists(item); +} + +rpl::producer WhoReacted( not_null item, not_null context, const style::WhoRead &st) { @@ -318,40 +473,51 @@ rpl::producer WhoRead( return [=](auto consumer) { auto lifetime = rpl::lifetime(); + const auto resolveWhoRead = WhoReadExists(item); + const auto state = lifetime.make_state(); - state->current.type = [&] { - if (const auto media = item->media()) { - if (!media->webpage()) { - if (const auto document = media->document()) { - if (document->isVoiceMessage()) { - return Ui::WhoReadType::Listened; - } else if (document->isVideoMessage()) { - return Ui::WhoReadType::Watched; - } - } - } - } - return Ui::WhoReadType::Seen; - }(); const auto pushNext = [=] { consumer.put_next_copy(state->current); }; - WhoReadIds( - item, - context - ) | rpl::start_with_next([=](const std::vector &peers) { - if (ListUnknown(peers, item)) { + const auto resolveWhoReacted = item->canViewReactions(); + auto idsWithReactions = (resolveWhoRead && resolveWhoReacted) + ? WhoReadOrReactedIds(item, context) + : resolveWhoRead + ? (WhoReadIds(item, context) | rpl::map(WithEmptyReactions)) + : WhoReactedIds(item, context); + state->current.type = resolveWhoRead + ? DetectSeenType(item) + : Ui::WhoReadType::Reacted; + if (resolveWhoReacted) { + const auto &list = item->reactions(); + state->current.fullReactionsCount = ranges::accumulate( + list, + 0, + ranges::plus{}, + [](const auto &pair) { return pair.second; }); + + // #TODO reactions + state->current.singleReaction = (list.size() == 1) + ? list.front().first + : QString(); + } + std::move( + idsWithReactions + ) | rpl::start_with_next([=](const PeersWithReactions &peers) { + if (peers.unknown) { state->userpics.clear(); consumer.put_next(Ui::WhoReadContent{ .type = state->current.type, .unknown = true, }); return; - } else if (UpdateUserpics(state, item, peers)) { + } + state->current.fullReactionsCount = peers.fullReactionsCount; + if (UpdateUserpics(state, item, peers.list)) { RegenerateParticipants(state, small, large); pushNext(); - } else if (peers.empty()) { + } else if (peers.list.empty()) { pushNext(); } }, lifetime); diff --git a/Telegram/SourceFiles/api/api_who_read.h b/Telegram/SourceFiles/api/api_who_reacted.h similarity index 84% rename from Telegram/SourceFiles/api/api_who_read.h rename to Telegram/SourceFiles/api/api_who_reacted.h index 9ea7f3051..fa5e342eb 100644 --- a/Telegram/SourceFiles/api/api_who_read.h +++ b/Telegram/SourceFiles/api/api_who_reacted.h @@ -20,9 +20,10 @@ struct WhoReadContent; namespace Api { [[nodiscard]] bool WhoReadExists(not_null item); +[[nodiscard]] bool WhoReactedExists(not_null item); // The context must be destroyed before the session holding this item. -[[nodiscard]] rpl::producer WhoRead( +[[nodiscard]] rpl::producer WhoReacted( not_null item, not_null context, const style::WhoRead &st); // Cache results for this lifetime. diff --git a/Telegram/SourceFiles/apiwrap.cpp b/Telegram/SourceFiles/apiwrap.cpp index e024f8ac2..b04407fc1 100644 --- a/Telegram/SourceFiles/apiwrap.cpp +++ b/Telegram/SourceFiles/apiwrap.cpp @@ -511,14 +511,14 @@ void ApiWrap::sendMessageFail( } void ApiWrap::requestMessageData( - ChannelData *channel, + PeerData *peer, MsgId msgId, - RequestMessageDataCallback callback) { - auto &requests = channel - ? _channelMessageDataRequests[channel][msgId] + Fn done) { + auto &requests = (peer && peer->isChannel()) + ? _channelMessageDataRequests[peer->asChannel()][msgId] : _messageDataRequests[msgId]; - if (callback) { - requests.callbacks.push_back(callback); + if (done) { + requests.callbacks.push_back(std::move(done)); } if (!requests.requestId) { _messageDataResolveDelayed.call(); @@ -540,19 +540,19 @@ QVector ApiWrap::collectMessageIds( auto ApiWrap::messageDataRequests(ChannelData *channel, bool onlyExisting) -> MessageDataRequests* { - if (channel) { - auto i = _channelMessageDataRequests.find(channel); - if (i == end(_channelMessageDataRequests)) { - if (onlyExisting) { - return nullptr; - } - i = _channelMessageDataRequests.emplace( - channel, - MessageDataRequests()).first; - } - return &i->second; + if (!channel) { + return &_messageDataRequests; } - return &_messageDataRequests; + const auto i = _channelMessageDataRequests.find(channel); + if (i != end(_channelMessageDataRequests)) { + return &i->second; + } else if (onlyExisting) { + return nullptr; + } + return &_channelMessageDataRequests.emplace( + channel, + MessageDataRequests() + ).first->second; } void ApiWrap::resolveMessageDatas() { @@ -615,20 +615,31 @@ void ApiWrap::finalizeMessageDataRequest( ChannelData *channel, mtpRequestId requestId) { auto requests = messageDataRequests(channel, true); - if (requests) { - for (auto i = requests->begin(); i != requests->cend();) { - if (i->second.requestId == requestId) { - for (const auto &callback : i->second.callbacks) { - callback(channel, i->first); - } - i = requests->erase(i); + if (!requests) { + return; + } + auto callbacks = std::vector>(); + for (auto i = requests->begin(); i != requests->cend();) { + if (i->second.requestId == requestId) { + auto &list = i->second.callbacks; + if (callbacks.empty()) { + callbacks = std::move(list); } else { - ++i; + callbacks.insert( + end(callbacks), + std::make_move_iterator(begin(list)), + std::make_move_iterator(end(list))); } + i = requests->erase(i); + } else { + ++i; } - if (channel && requests->empty()) { - _channelMessageDataRequests.remove(channel); - } + } + if (channel && requests->empty()) { + _channelMessageDataRequests.remove(channel); + } + for (const auto &callback : callbacks) { + callback(); } } @@ -647,7 +658,7 @@ QString ApiWrap::exportDirectMessageLink( if (inRepliesContext) { if (const auto rootId = item->replyToTop()) { const auto root = item->history()->owner().message( - peerToChannel(channel->id), + channel->id, rootId); const auto sender = root ? root->discussionPostOriginalSender() @@ -1389,9 +1400,8 @@ void ApiWrap::deleteAllFromParticipant( const auto ids = history ? history->collectMessagesFromParticipantToDelete(from) : std::vector(); - const auto channelId = peerToChannel(channel->id); for (const auto &msgId : ids) { - if (const auto item = _session->data().message(channelId, msgId)) { + if (const auto item = _session->data().message(channel->id, msgId)) { item->destroy(); } } @@ -2226,11 +2236,7 @@ void ApiWrap::resolveWebPages() { if (i.key()->pendingTill <= t) { const auto item = _session->data().findWebPageItem(i.key()); if (item) { - if (item->channelId() == NoChannel) { - ids.push_back(MTP_inputMessageID(MTP_int(item->id))); - i.value() = -1; - } else { - auto channel = item->history()->peer->asChannel(); + if (const auto channel = item->history()->peer->asChannel()) { auto channelMap = idsByChannel.find(channel); if (channelMap == idsByChannel.cend()) { channelMap = idsByChannel.emplace( @@ -2245,6 +2251,9 @@ void ApiWrap::resolveWebPages() { MTP_inputMessageID(MTP_int(item->id))); } i.value() = -channelMap->second.first - 2; + } else { + ids.push_back(MTP_inputMessageID(MTP_int(item->id))); + i.value() = -1; } } } else { @@ -2928,14 +2937,13 @@ void ApiWrap::preloadEnoughUnreadMentions(not_null history) { void ApiWrap::checkForUnreadMentions( const base::flat_set &possiblyReadMentions, ChannelData *channel) { - for (auto msgId : possiblyReadMentions) { - requestMessageData(channel, msgId, [=]( - ChannelData *channel, - MsgId msgId) { - if (const auto item = _session->data().message(channel, msgId)) { - if (item->mentionsMe()) { - item->markMediaRead(); - } + for (const auto &msgId : possiblyReadMentions) { + requestMessageData(channel, msgId, [=] { + const auto item = channel + ? _session->data().message(channel->id, msgId) + : _session->data().nonChannelMessage(msgId); + if (item && item->mentionsMe()) { + item->markMediaRead(); } }); } @@ -3214,7 +3222,7 @@ void ApiWrap::forwardMessages( const auto randomId = base::RandomValue(); if (genClientSideMessage) { const auto newId = FullMsgId( - peerToChannel(peer->id), + peer->id, _session->data().nextLocalMessageId()); const auto self = _session->user(); const auto messageFromId = sendAs @@ -3443,7 +3451,7 @@ void ApiWrap::forwardMessagesUnquoted( : MTPDinputSingleMedia::Flag(0); const auto newId = FullMsgId( - peerToChannel(peer->id), + peer->id, _session->data().nextLocalMessageId()); auto randomId = randomIds.takeFirst(); @@ -3773,7 +3781,7 @@ void ApiWrap::sendSharedContact( const auto peer = history->peer; const auto newId = FullMsgId( - history->channelId(), + peer->id, _session->data().nextLocalMessageId()); const auto anonymousPost = peer->amAnonymous(); @@ -4007,7 +4015,7 @@ void ApiWrap::sendMessage( while (TextUtilities::CutPart(sending, left, MaxMessageSize)) { auto newId = FullMsgId( - peerToChannel(peer->id), + peer->id, _session->data().nextLocalMessageId()); auto randomId = base::RandomValue(); @@ -4170,7 +4178,7 @@ void ApiWrap::sendInlineResult( const auto history = action.history; const auto peer = history->peer; const auto newId = FullMsgId( - peerToChannel(peer->id), + peer->id, _session->data().nextLocalMessageId()); const auto randomId = base::RandomValue(); @@ -4186,12 +4194,8 @@ void ApiWrap::sendInlineResult( if (silentPost) { sendFlags |= MTPmessages_SendInlineBotResult::Flag::f_silent; } - if (bot) { - if (action.options.hideVia) { - sendFlags |= MTPmessages_SendInlineBotResult::Flag::f_hide_via; - } else { - flags |= MessageFlag::HasViaBot; - } + if (bot && action.options.hideVia) { + sendFlags |= MTPmessages_SendInlineBotResult::Flag::f_hide_via; } if (action.options.scheduled) { flags |= MessageFlag::IsOrWasScheduled; diff --git a/Telegram/SourceFiles/apiwrap.h b/Telegram/SourceFiles/apiwrap.h index e3f3c5c03..01e1451ac 100644 --- a/Telegram/SourceFiles/apiwrap.h +++ b/Telegram/SourceFiles/apiwrap.h @@ -147,11 +147,7 @@ public: bool archived, Fn callback); - using RequestMessageDataCallback = Fn; - void requestMessageData( - ChannelData *channel, - MsgId msgId, - RequestMessageDataCallback callback); + void requestMessageData(PeerData *peer, MsgId msgId, Fn done); QString exportDirectMessageLink( not_null item, bool inRepliesContext); @@ -372,7 +368,7 @@ public: private: struct MessageDataRequest { - using Callbacks = std::vector; + using Callbacks = std::vector>; mtpRequestId requestId = 0; Callbacks callbacks; @@ -527,7 +523,7 @@ private: MessageDataRequests _messageDataRequests; base::flat_map< - ChannelData*, + not_null, MessageDataRequests> _channelMessageDataRequests; SingleQueuedInvokation _messageDataResolveDelayed; diff --git a/Telegram/SourceFiles/app.cpp b/Telegram/SourceFiles/app.cpp index b96161ef8..299c02cf4 100644 --- a/Telegram/SourceFiles/app.cpp +++ b/Telegram/SourceFiles/app.cpp @@ -18,8 +18,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL namespace { -constexpr auto kImageAreaLimit = 12'032 * 9'024; - App::LaunchState _launchState = App::Launched; HistoryView::Element *hoveredItem = nullptr, diff --git a/Telegram/SourceFiles/boxes/about_box.cpp b/Telegram/SourceFiles/boxes/about_box.cpp index dafc6d67a..b37db5c68 100644 --- a/Telegram/SourceFiles/boxes/about_box.cpp +++ b/Telegram/SourceFiles/boxes/about_box.cpp @@ -100,9 +100,15 @@ void AboutBox::prepare() { void AboutBox::resizeEvent(QResizeEvent *e) { BoxContent::resizeEvent(e); + const auto available = width() + - st::boxPadding.left() + - st::boxPadding.right(); _version->moveToLeft(st::boxPadding.left(), st::aboutVersionTop); + _text1->resizeToWidth(available); _text1->moveToLeft(st::boxPadding.left(), st::aboutTextTop); + _text2->resizeToWidth(available); _text2->moveToLeft(st::boxPadding.left(), _text1->y() + _text1->height() + st::aboutSkip); + _text3->resizeToWidth(available); _text3->moveToLeft(st::boxPadding.left(), _text2->y() + _text2->height() + st::aboutSkip); } diff --git a/Telegram/SourceFiles/boxes/add_contact_box.cpp b/Telegram/SourceFiles/boxes/add_contact_box.cpp index 3530680b4..8edf91009 100644 --- a/Telegram/SourceFiles/boxes/add_contact_box.cpp +++ b/Telegram/SourceFiles/boxes/add_contact_box.cpp @@ -418,32 +418,34 @@ void AddContactBox::save() { MTP_string(lastName))) )).done(crl::guard(this, [=]( const MTPcontacts_ImportedContacts &result) { - result.match([&](const MTPDcontacts_importedContacts &data) { - _session->data().processUsers(data.vusers()); - - const auto extractUser = [&](const MTPImportedContact &data) { - return data.match([&](const MTPDimportedContact &data) { - return (data.vclient_id().v == _contactId) - ? _session->data().userLoaded(data.vuser_id()) - : nullptr; - }); - }; - const auto &list = data.vimported().v; - const auto user = list.isEmpty() - ? nullptr - : extractUser(list.front()); - if (user) { - if (user->isContact() || user->session().supportMode()) { - Ui::showPeerHistory(user, ShowAtTheEndMsgId); - } - Ui::hideLayer(); - } else if (isBoxShown()) { - hideChildren(); - _retrying = true; - updateButtons(); - update(); - } + const auto &data = result.match([]( + const auto &data) -> const MTPDcontacts_importedContacts& { + return data; }); + _session->data().processUsers(data.vusers()); + + const auto extractUser = [&](const MTPImportedContact &data) { + return data.match([&](const MTPDimportedContact &data) { + return (data.vclient_id().v == _contactId) + ? _session->data().userLoaded(data.vuser_id()) + : nullptr; + }); + }; + const auto &list = data.vimported().v; + const auto user = list.isEmpty() + ? nullptr + : extractUser(list.front()); + if (user) { + if (user->isContact() || user->session().supportMode()) { + Ui::showPeerHistory(user, ShowAtTheEndMsgId); + } + Ui::hideLayer(); + } else if (isBoxShown()) { + hideChildren(); + _retrying = true; + updateButtons(); + update(); + } })).send(); } diff --git a/Telegram/SourceFiles/boxes/boxes.style b/Telegram/SourceFiles/boxes/boxes.style index 460d20397..bd9e063a5 100644 --- a/Telegram/SourceFiles/boxes/boxes.style +++ b/Telegram/SourceFiles/boxes/boxes.style @@ -135,8 +135,8 @@ editBioCountdownLabel: FlatLabel(defaultFlatLabel) { textFg: windowSubTextFg; } -contactUserIcon: icon {{ "settings_name", menuIconFg }}; -contactPhoneIcon: icon {{ "settings_phone_number", menuIconFg }}; +contactUserIcon: icon {{ "settings/settings_name", menuIconFg }}; +contactPhoneIcon: icon {{ "settings/settings_phone_number", menuIconFg }}; contactIconPosition: point(-5px, 23px); contactPadding: margins(49px, 2px, 0px, 12px); @@ -160,6 +160,21 @@ contactsAboutFg: windowSubTextFgOver; contactsAboutTop: 60px; contactsAboutBottom: 19px; +contactsSortButton: IconButton(defaultIconButton) { + width: 48px; + height: 54px; + icon: icon{{ "contacts_alphabet", boxTitleCloseFg }}; + iconOver: icon{{ "contacts_alphabet", boxTitleCloseFgOver }}; + iconPosition: point(10px, -1px); + rippleAreaPosition: point(1px, 6px); + rippleAreaSize: 42px; + ripple: RippleAnimation(defaultRippleAnimation) { + color: windowBgOver; + } +} +contactsSortOnlineIcon: icon{{ "contacts_online", boxTitleCloseFg }}; +contactsSortOnlineIconOver: icon{{ "contacts_online", boxTitleCloseFgOver }}; + contactsMarginTop: 4px; contactsMarginBottom: 4px; membersMarginTop: 10px; @@ -652,8 +667,8 @@ proxyRowEdit: IconButton(defaultIconButton) { width: 40px; height: 40px; - icon: icon {{ "settings_edit_name", menuIconFg }}; - iconOver: icon {{ "settings_edit_name", menuIconFgOver }}; + icon: icon {{ "settings/settings_edit_name", menuIconFg }}; + iconOver: icon {{ "settings/settings_edit_name", menuIconFgOver }}; iconPosition: point(12px, 13px); rippleAreaSize: 40px; diff --git a/Telegram/SourceFiles/boxes/connection_box.cpp b/Telegram/SourceFiles/boxes/connection_box.cpp index 0e8f9b331..3ddd36e3b 100644 --- a/Telegram/SourceFiles/boxes/connection_box.cpp +++ b/Telegram/SourceFiles/boxes/connection_box.cpp @@ -33,6 +33,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "styles/style_boxes.h" #include "styles/style_chat_helpers.h" #include "styles/style_info.h" +#include "styles/style_menu_icons.h" #include #include @@ -497,7 +498,9 @@ void ProxyRow::showMenu() { if (_menu) { return; } - _menu = base::make_unique_q(window()); + _menu = base::make_unique_q( + window(), + st::dropdownMenuWithIcons); const auto weak = _menu.get(); _menu->setHiddenCallback([=] { weak->deleteLater(); @@ -518,25 +521,26 @@ void ProxyRow::showMenu() { _menuToggle->installEventFilter(_menu); const auto addAction = [&]( const QString &text, - Fn callback) { - return _menu->addAction(text, std::move(callback)); + Fn callback, + const style::icon *icon) { + return _menu->addAction(text, std::move(callback), icon); }; addAction(tr::lng_proxy_menu_edit(tr::now), [=] { _editClicks.fire({}); - }); + }, &st::menuIconEdit); if (_view.supportsShare) { addAction(tr::lng_proxy_edit_share(tr::now), [=] { _shareClicks.fire({}); - }); + }, &st::menuIconShare); } if (_view.deleted) { addAction(tr::lng_proxy_menu_restore(tr::now), [=] { _restoreClicks.fire({}); - }); + }, &st::menuIconRestore); } else { addAction(tr::lng_proxy_menu_delete(tr::now), [=] { _deleteClicks.fire({}); - }); + }, &st::menuIconDelete); } const auto parentTopLeft = window()->mapToGlobal(QPoint()); const auto buttonTopLeft = _menuToggle->mapToGlobal(QPoint()); diff --git a/Telegram/SourceFiles/boxes/dictionaries_manager.cpp b/Telegram/SourceFiles/boxes/dictionaries_manager.cpp index d83c9cdef..6d3bbd113 100644 --- a/Telegram/SourceFiles/boxes/dictionaries_manager.cpp +++ b/Telegram/SourceFiles/boxes/dictionaries_manager.cpp @@ -16,9 +16,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "mainwidget.h" #include "mtproto/dedicated_file_loader.h" #include "spellcheck/spellcheck_utils.h" -#include "styles/style_layers.h" -#include "styles/style_settings.h" -#include "styles/style_boxes.h" #include "ui/wrap/vertical_layout.h" #include "ui/widgets/buttons.h" #include "ui/widgets/labels.h" @@ -27,6 +24,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/wrap/slide_wrap.h" #include "ui/effects/animations.h" #include "window/window_session_controller.h" +#include "styles/style_layers.h" +#include "styles/style_settings.h" +#include "styles/style_boxes.h" +#include "styles/style_menu_icons.h" namespace Ui { namespace { @@ -305,12 +306,14 @@ auto AddButtonWithLoader( if (!DictExists(id)) { return false; } - *contextMenu = base::make_unique_q(button); + *contextMenu = base::make_unique_q( + button, + st::popupMenuWithIcons); contextMenu->get()->addAction( tr::lng_settings_manage_remove_dictionary(tr::now), [=] { - Spellchecker::RemoveDictionary(id); - dictionaryRemoved->fire({}); - }); + Spellchecker::RemoveDictionary(id); + dictionaryRemoved->fire({}); + }, &st::menuIconDelete); contextMenu->get()->popup(QCursor::pos()); return true; }; diff --git a/Telegram/SourceFiles/boxes/language_box.cpp b/Telegram/SourceFiles/boxes/language_box.cpp index 060b1ff68..927a41cb2 100644 --- a/Telegram/SourceFiles/boxes/language_box.cpp +++ b/Telegram/SourceFiles/boxes/language_box.cpp @@ -33,6 +33,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "styles/style_info.h" #include "styles/style_passport.h" #include "styles/style_chat_helpers.h" +#include "styles/style_menu_icons.h" #include #include @@ -437,7 +438,9 @@ void Rows::showMenu(int index) { if (_menu || !hasMenu(row)) { return; } - _menu = base::make_unique_q(window()); + _menu = base::make_unique_q( + window(), + st::dropdownMenuWithIcons); const auto weak = _menu.get(); _menu->setHiddenCallback([=] { weak->deleteLater(); @@ -460,21 +463,25 @@ void Rows::showMenu(int index) { }); const auto addAction = [&]( const QString &text, - Fn callback) { - return _menu->addAction(text, std::move(callback)); + Fn callback, + const style::icon *icon) { + return _menu->addAction(text, std::move(callback), icon); }; if (canShare(row)) { - addAction(tr::lng_proxy_edit_share(tr::now), [=] { share(row); }); + addAction( + tr::lng_proxy_edit_share(tr::now), + [=] { share(row); }, + &st::menuIconShare); } if (canRemove(row)) { if (row->removed) { addAction(tr::lng_proxy_menu_restore(tr::now), [=] { restore(row); - }); + }, &st::menuIconRestore); } else { addAction(tr::lng_proxy_menu_delete(tr::now), [=] { remove(row); - }); + }, &st::menuIconDelete); } } const auto toggle = menuToggleArea(row); diff --git a/Telegram/SourceFiles/boxes/peer_list_box.cpp b/Telegram/SourceFiles/boxes/peer_list_box.cpp index 185714985..19756f848 100644 --- a/Telegram/SourceFiles/boxes/peer_list_box.cpp +++ b/Telegram/SourceFiles/boxes/peer_list_box.cpp @@ -101,8 +101,13 @@ void PeerListBox::createMultiSelect() { _select->moveToLeft(0, 0); } +void PeerListBox::setAddedTopScrollSkip(int skip) { + _addedTopScrollSkip = skip; + updateScrollSkips(); +} + int PeerListBox::getTopScrollSkip() const { - auto result = 0; + auto result = _addedTopScrollSkip; if (_select && !_select->isHidden()) { result += _select->height(); } @@ -113,7 +118,7 @@ void PeerListBox::updateScrollSkips() { // If we show / hide the search field scroll top is fixed. // If we resize search field by bubbles scroll bottom is fixed. setInnerTopSkip(getTopScrollSkip(), _scrollBottomFixed); - if (!_select->animating()) { + if (_select && !_select->animating()) { _scrollBottomFixed = true; } } @@ -190,8 +195,15 @@ void PeerListBox::paintEvent(QPaintEvent *e) { const auto &bg = (_controller->listSt() ? *_controller->listSt() : st::peerListBox).bg; + const auto fill = QRect( + 0, + _addedTopScrollSkip, + width(), + height() - _addedTopScrollSkip); for (const auto &rect : e->region()) { - p.fillRect(rect, bg); + if (const auto part = rect.intersected(fill); !part.isEmpty()) { + p.fillRect(part, bg); + } } } diff --git a/Telegram/SourceFiles/boxes/peer_list_box.h b/Telegram/SourceFiles/boxes/peer_list_box.h index 4289f7956..4fe28ff05 100644 --- a/Telegram/SourceFiles/boxes/peer_list_box.h +++ b/Telegram/SourceFiles/boxes/peer_list_box.h @@ -1020,6 +1020,8 @@ public: int peerListSelectedRowsCount() override; void peerListScrollToTop() override; + void setAddedTopScrollSkip(int skip); + protected: void prepare() override; void setInnerFocus() override; @@ -1059,5 +1061,6 @@ private: std::unique_ptr _controller; Fn _init; bool _scrollBottomFixed = false; + int _addedTopScrollSkip = 0; }; diff --git a/Telegram/SourceFiles/boxes/peer_list_controllers.cpp b/Telegram/SourceFiles/boxes/peer_list_controllers.cpp index 57a1dcf89..74c260b9c 100644 --- a/Telegram/SourceFiles/boxes/peer_list_controllers.cpp +++ b/Telegram/SourceFiles/boxes/peer_list_controllers.cpp @@ -19,6 +19,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_user.h" #include "data/data_folder.h" #include "data/data_histories.h" +#include "data/data_changes.h" #include "apiwrap.h" #include "mainwidget.h" #include "mainwindow.h" @@ -26,12 +27,15 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "history/history.h" #include "dialogs/dialogs_main_list.h" #include "window/window_session_controller.h" // showAddContact() +#include "base/unixtime.h" #include "facades.h" #include "styles/style_boxes.h" #include "styles/style_profile.h" namespace { +constexpr auto kSortByOnlineThrottle = 3 * crl::time(1000); + void ShareBotGame(not_null bot, not_null chat) { const auto history = chat->owner().history(chat); auto &histories = history->owner().histories(); @@ -110,17 +114,31 @@ void AddBotToGroup(not_null bot, not_null chat) { object_ptr PrepareContactsBox( not_null sessionController) { - const auto controller = sessionController; - auto delegate = [=](not_null box) { + using Mode = ContactsBoxController::SortMode; + auto controller = std::make_unique( + &sessionController->session()); + const auto raw = controller.get(); + auto init = [=](not_null box) { + struct State { + QPointer toggleSort; + Mode mode = ContactsBoxController::SortMode::Online; + }; + const auto state = box->lifetime().make_state(); box->addButton(tr::lng_close(), [=] { box->closeBox(); }); box->addLeftButton( tr::lng_profile_add_contact(), - [=] { controller->showAddContact(); }); + [=] { sessionController->showAddContact(); }); + state->toggleSort = box->addTopButton(st::contactsSortButton, [=] { + const auto online = (state->mode == Mode::Online); + state->mode = online ? Mode::Alphabet : Mode::Online; + raw->setSortMode(state->mode); + state->toggleSort->setIconOverride( + online ? &st::contactsSortOnlineIcon : nullptr, + online ? &st::contactsSortOnlineIconOver : nullptr); + }); + raw->setSortMode(Mode::Online); }; - return Box( - std::make_unique( - &sessionController->session()), - std::move(delegate)); + return Box(std::move(controller), std::move(init)); } void PeerListRowWithLink::setActionLink(const QString &action) { @@ -419,7 +437,8 @@ ContactsBoxController::ContactsBoxController( not_null session, std::unique_ptr searchController) : PeerListController(std::move(searchController)) -, _session(session) { +, _session(session) +, _sortByOnlineTimer([=] { sort(); }) { } Main::Session &ContactsBoxController::session() const { @@ -455,6 +474,7 @@ void ContactsBoxController::rebuildRows() { }; appendList(session().data().contactsList()); checkForEmptyRows(); + sort(); delegate()->peerListRefreshRows(); } @@ -478,6 +498,66 @@ void ContactsBoxController::rowClicked(not_null row) { Ui::showPeerHistory(row->peer(), ShowAtUnreadMsgId); } +void ContactsBoxController::setSortMode(SortMode mode) { + if (_sortMode == mode) { + return; + } + _sortMode = mode; + sort(); + if (_sortMode == SortMode::Online) { + session().changes().peerUpdates( + Data::PeerUpdate::Flag::OnlineStatus + ) | rpl::filter([=](const Data::PeerUpdate &update) { + return !_sortByOnlineTimer.isActive() + && delegate()->peerListFindRow(update.peer->id.value); + }) | rpl::start_with_next([=] { + _sortByOnlineTimer.callOnce(kSortByOnlineThrottle); + }, _sortByOnlineLifetime); + } else { + _sortByOnlineTimer.cancel(); + _sortByOnlineLifetime.destroy(); + } +} + +void ContactsBoxController::sort() { + switch (_sortMode) { + case SortMode::Alphabet: sortByName(); break; + case SortMode::Online: sortByOnline(); break; + default: Unexpected("SortMode in ContactsBoxController."); + } +} + +void ContactsBoxController::sortByName() { + auto keys = base::flat_map(); + keys.reserve(delegate()->peerListFullRowsCount()); + const auto key = [&](const PeerListRow &row) { + const auto id = row.id(); + const auto i = keys.find(id); + if (i != end(keys)) { + return i->second; + } + const auto peer = row.peer(); + const auto history = peer->owner().history(peer); + return keys.emplace(id, history->chatListNameSortKey()).first->second; + }; + const auto predicate = [&](const PeerListRow &a, const PeerListRow &b) { + return (key(a).compare(key(b)) < 0); + }; + delegate()->peerListSortRows(predicate); +} + +void ContactsBoxController::sortByOnline() { + const auto now = base::unixtime::now(); + const auto key = [&](const PeerListRow &row) { + const auto user = row.peer()->asUser(); + return user ? (std::min(user->onlineTill, now) + 1) : TimeId(); + }; + const auto predicate = [&](const PeerListRow &a, const PeerListRow &b) { + return key(a) > key(b); + }; + delegate()->peerListSortRows(predicate); +} + bool ContactsBoxController::appendRow(not_null user) { if (auto row = delegate()->peerListFindRow(user->id.value)) { updateRowHook(row); diff --git a/Telegram/SourceFiles/boxes/peer_list_controllers.h b/Telegram/SourceFiles/boxes/peer_list_controllers.h index b6e89a577..c3ddc5054 100644 --- a/Telegram/SourceFiles/boxes/peer_list_controllers.h +++ b/Telegram/SourceFiles/boxes/peer_list_controllers.h @@ -10,6 +10,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "boxes/peer_list_box.h" #include "base/flat_set.h" #include "base/weak_ptr.h" +#include "base/timer.h" // Not used for now. // @@ -153,6 +154,12 @@ public: not_null peer) override final; void rowClicked(not_null row) override; + enum class SortMode { + Alphabet, + Online, + }; + void setSortMode(SortMode mode); + protected: virtual std::unique_ptr createRow(not_null user); virtual void prepareViewHook() { @@ -161,11 +168,17 @@ protected: } private: + void sort(); + void sortByName(); + void sortByOnline(); void rebuildRows(); void checkForEmptyRows(); bool appendRow(not_null user); const not_null _session; + SortMode _sortMode = SortMode::Alphabet; + base::Timer _sortByOnlineTimer; + rpl::lifetime _sortByOnlineLifetime; }; diff --git a/Telegram/SourceFiles/boxes/peers/edit_participants_box.cpp b/Telegram/SourceFiles/boxes/peers/edit_participants_box.cpp index 4e37e711a..f7e0ca5a5 100644 --- a/Telegram/SourceFiles/boxes/peers/edit_participants_box.cpp +++ b/Telegram/SourceFiles/boxes/peers/edit_participants_box.cpp @@ -35,6 +35,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/ui_utility.h" #include "window/window_session_controller.h" #include "history/history.h" +#include "styles/style_menu_icons.h" namespace { @@ -1524,7 +1525,9 @@ base::unique_qptr ParticipantsBoxController::rowContextMenu( const auto channel = _peer->asChannel(); const auto participant = row->peer(); const auto user = participant->asUser(); - auto result = base::make_unique_q(parent); + auto result = base::make_unique_q( + parent, + st::popupMenuWithIcons); if (_navigation) { result->addAction( (participant->isUser() @@ -1533,7 +1536,10 @@ base::unique_qptr ParticipantsBoxController::rowContextMenu( ? tr::lng_context_view_channel : tr::lng_context_view_group)(tr::now), crl::guard(this, [=] { - _navigation->showPeerInfo(participant); })); + _navigation->showPeerInfo(participant); }), + (participant->isUser() + ? &st::menuIconProfile + : &st::menuIconInfo)); } if (const auto window = App::wnd()) { if (const auto mainwidget = window->sessionContent()) { @@ -1546,12 +1552,13 @@ base::unique_qptr ParticipantsBoxController::rowContextMenu( ? _peer->owner().history(_peer).get() : Dialogs::Key(), user); - })); + }), &st::menuIconSearch); if (const auto openedPeer = mainwidget->peer()) { if (openedPeer->canWrite()) { result->addAction( ktr("ktg_profile_mention_user"), - crl::guard(this, [=] { mainwidget->mentionUser(user); })); + crl::guard(this, [=] { mainwidget->mentionUser(user); }), + &st::menuIconMention); } } } @@ -1562,11 +1569,13 @@ base::unique_qptr ParticipantsBoxController::rowContextMenu( if (user && channel->canAddMembers()) { result->addAction( tr::lng_context_add_to_group(tr::now), - crl::guard(this, [=] { unkickParticipant(user); })); + crl::guard(this, [=] { unkickParticipant(user); }), + &st::menuIconInvite); } result->addAction( tr::lng_profile_delete_removed(tr::now), - crl::guard(this, [=] { removeKickedWithRow(participant); })); + crl::guard(this, [=] { removeKickedWithRow(participant); }), + &st::menuIconDelete); } return result; } @@ -1577,7 +1586,10 @@ base::unique_qptr ParticipantsBoxController::rowContextMenu( (isAdmin ? tr::lng_context_edit_permissions : tr::lng_context_promote_admin)(tr::now), - crl::guard(this, [=] { showAdmin(user); })); + crl::guard(this, [=] { showAdmin(user); }), + (isAdmin + ? &st::menuIconAdmin + : &st::menuIconPromote)); } if (user && _additional.canRestrictParticipant(participant)) { const auto canRestrictWithoutKick = [&] { @@ -1589,7 +1601,8 @@ base::unique_qptr ParticipantsBoxController::rowContextMenu( if (canRestrictWithoutKick) { result->addAction( tr::lng_context_restrict_user(tr::now), - crl::guard(this, [=] { showRestricted(user); })); + crl::guard(this, [=] { showRestricted(user); }), + &st::menuIconRestrict); } } if (user && _additional.canRemoveParticipant(participant)) { @@ -1599,7 +1612,8 @@ base::unique_qptr ParticipantsBoxController::rowContextMenu( (isGroup ? tr::lng_context_remove_from_group : tr::lng_profile_kick)(tr::now), - crl::guard(this, [=] { kickParticipant(user); })); + crl::guard(this, [=] { kickParticipant(user); }), + &st::menuIconRemove); } } return result; diff --git a/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp b/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp index d2d0de148..b04746bac 100644 --- a/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp +++ b/Telegram/SourceFiles/boxes/peers/edit_peer_info_box.cpp @@ -21,6 +21,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "boxes/peers/edit_peer_invite_links.h" #include "boxes/peers/edit_linked_chat_box.h" #include "boxes/peers/edit_peer_requests_box.h" +#include "boxes/peers/edit_peer_reactions.h" #include "boxes/stickers_box.h" #include "ui/boxes/single_choice_box.h" #include "chat_helpers/emoji_suggestions_widget.h" @@ -31,6 +32,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_peer.h" #include "data/data_session.h" #include "data/data_changes.h" +#include "data/data_message_reactions.h" #include "history/admin_log/history_admin_log_section.h" #include "info/profile/info_profile_values.h" #include "lang/lang_keys.h" @@ -288,7 +290,8 @@ private: object_ptr createManageGroupButtons(); object_ptr createStickersEdit(); - bool canEditInformation() const; + [[nodiscard]] bool canEditInformation() const; + [[nodiscard]] bool canEditReactions() const; void refreshHistoryVisibility(); void showEditPeerTypeBox( std::optional> error = {}); @@ -592,6 +595,17 @@ bool Controller::canEditInformation() const { return false; } +bool Controller::canEditReactions() const { + if (const auto channel = _peer->asChannel()) { + return channel->amCreator() + || (channel->adminRights() & ChatAdminRight::ChangeInfo); + } else if (const auto chat = _peer->asChat()) { + return chat->amCreator() + || (chat->adminRights() & ChatAdminRight::ChangeInfo); + } + return false; +} + void Controller::refreshHistoryVisibility() { if (!_controls.historyVisibilityWrap) { return; @@ -1013,6 +1027,40 @@ void Controller::fillManageSection() { }, wrap->lifetime()); } } + if (canEditReactions()) { + const auto session = &_peer->session(); + auto reactionsCount = Info::Profile::MigratedOrMeValue( + _peer + ) | rpl::map( + Info::Profile::AllowedReactionsCountValue + ) | rpl::flatten_latest(); + auto fullCount = Info::Profile::FullReactionsCountValue(session); + auto label = rpl::combine( + std::move(reactionsCount), + std::move(fullCount) + ) | rpl::map([=](int allowed, int total) { + return allowed + ? QString::number(allowed) + " / " + QString::number(total) + : tr::lng_manage_peer_reactions_off(tr::now); + }); + const auto done = [=](const std::vector &chosen) { + SaveAllowedReactions(_peer, chosen); + }; + AddButtonWithCount( + _controls.buttonsLayout, + tr::lng_manage_peer_reactions(), + std::move(label), + [=] { + _navigation->parentController()->show(Box( + EditAllowedReactionsBox, + !_peer->isBroadcast(), + session->data().reactions().list( + Data::Reactions::Type::Active), + session->data().reactions().list(_peer), + done)); + }, + st::infoIconReactions); + } if (canViewAdmins) { AddButtonWithCount( _controls.buttonsLayout, diff --git a/Telegram/SourceFiles/boxes/peers/edit_peer_invite_link.cpp b/Telegram/SourceFiles/boxes/peers/edit_peer_invite_link.cpp index 0520858b7..5f0b066a7 100644 --- a/Telegram/SourceFiles/boxes/peers/edit_peer_invite_link.cpp +++ b/Telegram/SourceFiles/boxes/peers/edit_peer_invite_link.cpp @@ -46,6 +46,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "styles/style_layers.h" // st::boxDividerLabel. #include "styles/style_info.h" #include "styles/style_settings.h" +#include "styles/style_menu_icons.h" #include #include @@ -349,28 +350,36 @@ void Controller::addHeaderBlock(not_null container) { }); const auto createMenu = [=] { - auto result = base::make_unique_q(container); + auto result = base::make_unique_q( + container, + st::popupMenuWithIcons); if (revoked) { result->addAction( tr::lng_group_invite_context_delete(tr::now), - deleteLink); + deleteLink, + &st::menuIconDelete); } else { result->addAction( tr::lng_group_invite_context_copy(tr::now), - copyLink); + copyLink, + &st::menuIconCopy); result->addAction( tr::lng_group_invite_context_share(tr::now), - shareLink); + shareLink, + &st::menuIconShare); result->addAction( tr::lng_group_invite_context_qr(tr::now), - getLinkQr); + getLinkQr, + &st::menuIconQrCode); if (!admin->isBot()) { result->addAction( tr::lng_group_invite_context_edit(tr::now), - editLink); + editLink, + &st::menuIconEdit); result->addAction( tr::lng_group_invite_context_revoke(tr::now), - revokeLink); + revokeLink, + &st::menuIconRemove); } } return result; @@ -745,16 +754,18 @@ base::unique_qptr Controller::createRowContextMenu( const auto user = row->peer()->asUser(); Assert(user != nullptr); - auto result = base::make_unique_q(parent); + auto result = base::make_unique_q( + parent, + st::popupMenuWithIcons); const auto add = _peer->isBroadcast() ? tr::lng_group_requests_add_channel(tr::now) : tr::lng_group_requests_add(tr::now); result->addAction(add, [=] { processRequest(user, true); - }); + }, &st::menuIconInvite); result->addAction(tr::lng_group_requests_dismiss(tr::now), [=] { processRequest(user, false); - }); + }, &st::menuIconRemove); return result; } @@ -960,20 +971,26 @@ void AddPermanentLinkBlock( : data.link; }); const auto createMenu = [=] { - auto result = base::make_unique_q(container); + auto result = base::make_unique_q( + container, + st::popupMenuWithIcons); result->addAction( tr::lng_group_invite_context_copy(tr::now), - copyLink); + copyLink, + &st::menuIconCopy); result->addAction( tr::lng_group_invite_context_share(tr::now), - shareLink); + shareLink, + &st::menuIconShare); result->addAction( tr::lng_group_invite_context_qr(tr::now), - getLinkQr); + getLinkQr, + &st::menuIconQrCode); if (!admin->isBot()) { result->addAction( tr::lng_group_invite_context_revoke(tr::now), - revokeLink); + revokeLink, + &st::menuIconRemove); } return result; }; diff --git a/Telegram/SourceFiles/boxes/peers/edit_peer_invite_links.cpp b/Telegram/SourceFiles/boxes/peers/edit_peer_invite_links.cpp index 5a187af23..91f592a66 100644 --- a/Telegram/SourceFiles/boxes/peers/edit_peer_invite_links.cpp +++ b/Telegram/SourceFiles/boxes/peers/edit_peer_invite_links.cpp @@ -28,6 +28,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "styles/style_info.h" #include "styles/style_layers.h" // st::boxDividerLabel #include "styles/style_settings.h" // st::settingsDividerLabelPadding +#include "styles/style_menu_icons.h" #include @@ -578,27 +579,29 @@ base::unique_qptr LinksController::createRowContextMenu( const auto real = static_cast(row.get()); const auto data = real->data(); const auto link = data.link; - auto result = base::make_unique_q(parent); + auto result = base::make_unique_q( + parent, + st::popupMenuWithIcons); if (data.revoked) { result->addAction(tr::lng_group_invite_context_delete(tr::now), [=] { DeleteLink(_peer, _admin, link); - }); + }, &st::menuIconDelete); } else { result->addAction(tr::lng_group_invite_context_copy(tr::now), [=] { CopyInviteLink(link); - }); + }, &st::menuIconCopy); result->addAction(tr::lng_group_invite_context_share(tr::now), [=] { ShareInviteLinkBox(_peer, link); - }); + }, &st::menuIconShare); result->addAction(tr::lng_group_invite_context_qr(tr::now), [=] { InviteLinkQrBox(link); - }); + }, &st::menuIconQrCode); result->addAction(tr::lng_group_invite_context_edit(tr::now), [=] { EditLink(_peer, data); - }); + }, &st::menuIconEdit); result->addAction(tr::lng_group_invite_context_revoke(tr::now), [=] { RevokeLink(_peer, _admin, link); - }); + }, &st::menuIconRemove); } return result; } diff --git a/Telegram/SourceFiles/boxes/peers/edit_peer_reactions.cpp b/Telegram/SourceFiles/boxes/peers/edit_peer_reactions.cpp new file mode 100644 index 000000000..2b81a96bb --- /dev/null +++ b/Telegram/SourceFiles/boxes/peers/edit_peer_reactions.cpp @@ -0,0 +1,206 @@ +/* +This file is part of Telegram Desktop, +the official desktop application for the Telegram messaging service. + +For license and copyright information please follow this link: +https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL +*/ +#include "boxes/peers/edit_peer_reactions.h" + +#include "data/data_message_reactions.h" +#include "data/data_document.h" +#include "data/data_document_media.h" +#include "data/data_peer.h" +#include "data/data_chat.h" +#include "data/data_channel.h" +#include "data/data_session.h" +#include "main/main_session.h" +#include "apiwrap.h" +#include "lang/lang_keys.h" +#include "ui/widgets/buttons.h" +#include "info/profile/info_profile_icon.h" +#include "settings/settings_common.h" +#include "styles/style_settings.h" +#include "styles/style_info.h" + +namespace { + +using Data::Reaction; + +void AddReactionIcon( + not_null button, + not_null document) { + struct State { + std::shared_ptr media; + QImage image; + }; + + const auto size = st::editPeerReactionsPreview; + const auto state = button->lifetime().make_state(State{ + .media = document->createMediaView(), + }); + const auto icon = Ui::CreateChild(button.get()); + icon->setAttribute(Qt::WA_TransparentForMouseEvents); + icon->resize(size, size); + button->sizeValue( + ) | rpl::start_with_next([=](QSize size) { + icon->moveToLeft( + st::settingsSectionIconLeft, + (size.height() - icon->height()) / 2, + size.width()); + }, icon->lifetime()); + + const auto setImage = [=](not_null image) { + state->image = Images::prepare( + image->original(), + size * style::DevicePixelRatio(), + size * style::DevicePixelRatio(), + Images::Option::Smooth | Images::Option::TransparentBackground, + size, + size); + icon->update(); + }; + if (const auto image = state->media->getStickerLarge()) { + setImage(image); + } else { + document->session().downloaderTaskFinished( + ) | rpl::map([=] { + return state->media->getStickerLarge(); + }) | rpl::filter_nullptr() | rpl::take( + 1 + ) | rpl::start_with_next([=](not_null image) { + setImage(image); + }, button->lifetime()); + } + + icon->paintRequest( + ) | rpl::start_with_next([=] { + Painter p(icon); + if (!state->image.isNull()) { + p.drawImage(0, 0, state->image); + } + }, icon->lifetime()); +} + +} // namespace + +void EditAllowedReactionsBox( + not_null box, + bool isGroup, + const std::vector &list, + const std::vector &selected, + Fn &)> callback) { + box->setTitle(tr::lng_manage_peer_reactions()); + + struct State { + base::flat_map> toggles; + rpl::variable anyToggled; + rpl::event_stream forceToggleAll; + }; + const auto state = box->lifetime().make_state(State{ + .anyToggled = !selected.empty(), + }); + + const auto collect = [=] { + auto result = std::vector(); + result.reserve(state->toggles.size()); + for (const auto &[emoji, button] : state->toggles) { + if (button->toggled()) { + result.push_back(emoji); + } + } + return result; + }; + + const auto container = box->verticalLayout(); + + const auto enabled = Settings::AddButton( + container, + tr::lng_manage_peer_reactions_enable(), + st::manageGroupButton.button); + Ui::CreateChild( + enabled.get(), + st::infoIconReactions, + st::manageGroupButton.iconPosition); + enabled->toggleOn(state->anyToggled.value()); + enabled->toggledChanges( + ) | rpl::filter([=](bool value) { + return (value != state->anyToggled.current()); + }) | rpl::start_to_stream(state->forceToggleAll, enabled->lifetime()); + + Settings::AddSkip(container); + Settings::AddDividerText( + container, + (isGroup + ? tr::lng_manage_peer_reactions_about + : tr::lng_manage_peer_reactions_about_channel)()); + + Settings::AddSkip(container); + Settings::AddSubsectionTitle( + container, + tr::lng_manage_peer_reactions_available()); + + const auto active = [&](const Data::Reaction &entry) { + return ranges::contains(selected, entry.emoji, &Reaction::emoji); + }; + const auto add = [&](const Data::Reaction &entry) { + const auto button = Settings::AddButton( + container, + rpl::single(entry.title), + st::manageGroupButton.button); + AddReactionIcon(button, entry.staticIcon); + state->toggles.emplace(entry.emoji, button); + button->toggleOn(rpl::single( + active(entry) + ) | rpl::then( + state->forceToggleAll.events() + )); + button->toggledChanges( + ) | rpl::start_with_next([=](bool toggled) { + if (toggled) { + state->anyToggled = true; + } else if (collect().empty()) { + state->anyToggled = false; + } + }, button->lifetime()); + }; + for (const auto &entry : list) { + add(entry); + } + + box->addButton(tr::lng_settings_save(), [=] { + const auto ids = collect(); + box->closeBox(); + callback(ids); + }); + box->addButton(tr::lng_cancel(), [=] { + box->closeBox(); + }); +} + +void SaveAllowedReactions( + not_null peer, + const std::vector &allowed) { + auto ids = allowed | ranges::views::transform([=](QString value) { + return MTP_string(value); + }) | ranges::to; + + peer->session().api().request(MTPmessages_SetChatAvailableReactions( + peer->input, + MTP_vector(ids) + )).done([=](const MTPUpdates &result) { + peer->session().api().applyUpdates(result); + if (const auto chat = peer->asChat()) { + chat->setAllowedReactions(allowed); + } else if (const auto channel = peer->asChannel()) { + channel->setAllowedReactions(allowed); + } else { + Unexpected("Invalid peer type in SaveAllowedReactions."); + } + }).fail([=](const MTP::Error &error) { + if (error.type() == qstr("REACTION_INVALID")) { + peer->updateFullForced(); + peer->owner().reactions().refresh(); + } + }).send(); +} diff --git a/Telegram/SourceFiles/boxes/peers/edit_peer_reactions.h b/Telegram/SourceFiles/boxes/peers/edit_peer_reactions.h new file mode 100644 index 000000000..917957b7f --- /dev/null +++ b/Telegram/SourceFiles/boxes/peers/edit_peer_reactions.h @@ -0,0 +1,27 @@ +/* +This file is part of Telegram Desktop, +the official desktop application for the Telegram messaging service. + +For license and copyright information please follow this link: +https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL +*/ +#pragma once + +#include "ui/layers/generic_box.h" + +class PeerData; + +namespace Data { +struct Reaction; +} // namespace Data + +void EditAllowedReactionsBox( + not_null box, + bool isGroup, + const std::vector &list, + const std::vector &selected, + Fn &)> callback); + +void SaveAllowedReactions( + not_null peer, + const std::vector &allowed); diff --git a/Telegram/SourceFiles/boxes/pin_messages_box.cpp b/Telegram/SourceFiles/boxes/pin_messages_box.cpp index af4c42a1d..a14b34c59 100644 --- a/Telegram/SourceFiles/boxes/pin_messages_box.cpp +++ b/Telegram/SourceFiles/boxes/pin_messages_box.cpp @@ -26,9 +26,9 @@ namespace { if (!top) { return false; } else if (peer == migrated) { - return top.channel || (id < top.msg); + return peerIsChannel(top.peer) || (id < top.msg); } else if (migrated) { - return top.channel && (id < top.msg); + return peerIsChannel(top.peer) && (id < top.msg); } else { return (id < top.msg); } diff --git a/Telegram/SourceFiles/boxes/share_box.cpp b/Telegram/SourceFiles/boxes/share_box.cpp index 518e8d7ad..8a2f8361d 100644 --- a/Telegram/SourceFiles/boxes/share_box.cpp +++ b/Telegram/SourceFiles/boxes/share_box.cpp @@ -1299,12 +1299,14 @@ QString AppendShareGameScoreUrl( const FullMsgId &fullId) { auto shareHashData = QByteArray(0x20, Qt::Uninitialized); auto shareHashDataInts = reinterpret_cast(shareHashData.data()); - auto channel = fullId.channel - ? session->data().channelLoaded(fullId.channel) - : static_cast(nullptr); - auto channelAccessHash = uint64(channel ? channel->access : 0); + const auto peer = fullId.peer + ? session->data().peerLoaded(fullId.peer) + : static_cast(nullptr); + const auto channelAccessHash = uint64((peer && peer->isChannel()) + ? peer->asChannel()->access + : 0); shareHashDataInts[0] = session->userId().bare; - shareHashDataInts[1] = fullId.channel.bare; + shareHashDataInts[1] = fullId.peer.value; shareHashDataInts[2] = uint64(fullId.msg.bare); shareHashDataInts[3] = channelAccessHash; @@ -1384,31 +1386,22 @@ void ShareGameScoreByHash( return; } - // Check first 32 bits of channel access hash. - auto channelAccessHash = hashDataInts[3]; - //auto channelAccessHashInts = reinterpret_cast(&channelAccessHash); - //if (channelAccessHashInts[0] != hashDataInts[3]) { - // Ui::show(Box(tr::lng_share_wrong_user(tr::now))); - // return; - //} - - if (((hashDataInts[1] >> 40) != 0) - || (!hashDataInts[1] && channelAccessHash)) { + const auto peerId = PeerId(hashDataInts[1]); + const auto channelAccessHash = hashDataInts[3]; + if (!peerIsChannel(peerId) && channelAccessHash) { // If there is no channel id, there should be no channel access_hash. Ui::show(Box(tr::lng_share_wrong_user(tr::now))); return; } - auto channelId = ChannelId(hashDataInts[1]); - auto msgId = MsgId(int64(hashDataInts[2])); - if (const auto item = session->data().message(channelId, msgId)) { + const auto msgId = MsgId(int64(hashDataInts[2])); + if (const auto item = session->data().message(peerId, msgId)) { FastShareMessage(item); } else { - auto resolveMessageAndShareScore = [=](ChannelData *channel) { - session->api().requestMessageData(channel, msgId, [=]( - ChannelData *channel, - MsgId msgId) { - if (const auto item = session->data().message(channel, msgId)) { + auto resolveMessageAndShareScore = [=](PeerData *peer) { + session->api().requestMessageData(peer, msgId, [=] { + const auto item = session->data().message(peerId, msgId); + if (item) { FastShareMessage(item); } else { Ui::show(Box( @@ -1417,24 +1410,24 @@ void ShareGameScoreByHash( }); }; - const auto channel = channelId - ? session->data().channelLoaded(channelId) + const auto peer = peerIsChannel(peerId) + ? session->data().peerLoaded(peerId) : nullptr; - if (channel || !channelId) { - resolveMessageAndShareScore(channel); + if (peer || !peerIsChannel(peerId)) { + resolveMessageAndShareScore(peer); } else { session->api().request(MTPchannels_GetChannels( MTP_vector( 1, MTP_inputChannel( - MTP_long(channelId.bare), + MTP_long(peerToChannel(peerId).bare), MTP_long(channelAccessHash))) )).done([=](const MTPmessages_Chats &result) { result.match([&](const auto &data) { session->data().processChats(data.vchats()); }); - if (const auto channel = session->data().channelLoaded(channelId)) { - resolveMessageAndShareScore(channel); + if (const auto peer = session->data().peerLoaded(peerId)) { + resolveMessageAndShareScore(peer); } }).send(); } diff --git a/Telegram/SourceFiles/boxes/sticker_set_box.cpp b/Telegram/SourceFiles/boxes/sticker_set_box.cpp index 0bd7ee38a..4a2c5db50 100644 --- a/Telegram/SourceFiles/boxes/sticker_set_box.cpp +++ b/Telegram/SourceFiles/boxes/sticker_set_box.cpp @@ -46,6 +46,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "styles/style_layers.h" #include "styles/style_chat_helpers.h" #include "styles/style_info.h" +#include "styles/style_menu_icons.h" #include #include @@ -312,12 +313,15 @@ void StickerSetBox::updateButtons() { const auto menu = std::make_shared>(); top->setClickedCallback([=] { - *menu = base::make_unique_q(top); + *menu = base::make_unique_q( + top, + st::popupMenuWithIcons); (*menu)->addAction( (isMasks ? tr::lng_stickers_share_masks : tr::lng_stickers_share_pack)(tr::now), - share); + share, + &st::menuIconShare); (*menu)->popup(QCursor::pos()); return true; }); @@ -345,12 +349,15 @@ void StickerSetBox::updateButtons() { const auto menu = std::make_shared>(); top->setClickedCallback([=] { - *menu = base::make_unique_q(top); + *menu = base::make_unique_q( + top, + st::popupMenuWithIcons); (*menu)->addAction( isMasks ? tr::lng_masks_archive_pack(tr::now) : tr::lng_stickers_archive_pack(tr::now), - archive); + archive, + &st::menuIconArchive); (*menu)->popup(QCursor::pos()); return true; }); @@ -369,7 +376,9 @@ bool StickerSetBox::showMenu(not_null button) { return true; } - _menu = base::make_unique_q(window()); + _menu = base::make_unique_q( + window(), + st::dropdownMenuWithIcons); const auto weak = _menu.get(); _menu->setHiddenCallback([=] { weak->deleteLater(); @@ -389,10 +398,16 @@ bool StickerSetBox::showMenu(not_null button) { }); button->installEventFilter(_menu); - _menu->addAction(ktr("ktg_stickers_copy_title"), [=] { copyTitle(); }); + _menu->addAction( + ktr("ktg_stickers_copy_title"), + [=] { copyTitle(); }, + &st::menuIconCopy); if (!_inner->shortName().isEmpty()) { - _menu->addAction(tr::lng_stickers_share_pack(tr::now), [=] { copyStickersLink(); }); + _menu->addAction( + tr::lng_stickers_share_pack(tr::now), + [=] { copyStickersLink(); }, + &st::menuIconShare); } if (!_inner->notInstalled()) { @@ -400,7 +415,10 @@ bool StickerSetBox::showMenu(not_null button) { _inner->archiveStickers(); closeBox(); }; - _menu->addAction(tr::lng_stickers_archive_pack(tr::now), archive); + _menu->addAction( + tr::lng_stickers_archive_pack(tr::now), + archive, + &st::menuIconArchive); } const auto parentTopLeft = window()->mapToGlobal(QPoint()); @@ -722,7 +740,9 @@ void StickerSetBox::Inner::contextMenuEvent(QContextMenuEvent *e) { return; } _previewTimer.cancel(); - _menu = base::make_unique_q(this); + _menu = base::make_unique_q( + this, + st::popupMenuWithIcons); const auto document = _pack[index]; const auto sendSelected = [=](Api::SendOptions options) { @@ -739,11 +759,15 @@ void StickerSetBox::Inner::contextMenuEvent(QContextMenuEvent *e) { document, Data::FileOriginStickerSet(Data::Stickers::FavedSetId, 0)); }; + const auto isFaved = document->owner().stickers().isFaved(document); _menu->addAction( - (document->owner().stickers().isFaved(document) + (isFaved ? tr::lng_faved_stickers_remove : tr::lng_faved_stickers_add)(tr::now), - toggleFavedSticker); + toggleFavedSticker, + (isFaved + ? &st::menuIconUnfave + : &st::menuIconFave)); _menu->popup(QCursor::pos()); } diff --git a/Telegram/SourceFiles/boxes/stickers_box.cpp b/Telegram/SourceFiles/boxes/stickers_box.cpp index 763ef4101..d11dcefa0 100644 --- a/Telegram/SourceFiles/boxes/stickers_box.cpp +++ b/Telegram/SourceFiles/boxes/stickers_box.cpp @@ -247,6 +247,7 @@ private: int32 _rowHeight; std::vector> _rows; + std::vector> _oldRows; std::vector _shiftingStartTimes; crl::time _aboveShadowFadeStart = 0; anim::value _aboveShadowFadeOpacity; @@ -547,7 +548,9 @@ void StickersBox::prepare() { } setNoContentMargin(true); _tabs->sectionActivated( - ) | rpl::start_with_next( + ) | rpl::filter([=] { + return !_ignoreTabActivation; + }) | rpl::start_with_next( [this] { switchTab(); }, lifetime()); refreshTabs(); @@ -665,12 +668,16 @@ void StickersBox::refreshTabs() { || (_tab == &_featured && !_tabIndices.contains(Section::Featured)) || (_tab == &_masks && !_tabIndices.contains(Section::Masks))) { switchTab(); - } else if (_tab == &_archived) { - _tabs->setActiveSectionFast(_tabIndices.indexOf(Section::Archived)); - } else if (_tab == &_featured) { - _tabs->setActiveSectionFast(_tabIndices.indexOf(Section::Featured)); - } else if (_tab == &_masks) { - _tabs->setActiveSectionFast(_tabIndices.indexOf(Section::Masks)); + } else { + _ignoreTabActivation = true; + _tabs->setActiveSectionFast(_tabIndices.indexOf((_tab == &_archived) + ? Section::Archived + : (_tab == &_featured) + ? Section::Featured + : (_tab == &_masks) + ? Section::Masks + : Section::Installed)); + _ignoreTabActivation = false; } updateTabsGeometry(); } @@ -1987,6 +1994,7 @@ void StickersBox::Inner::rebuild(bool masks) { auto maxNameWidth = countMaxNameWidth(); + _oldRows = std::move(_rows); clear(); const auto &order = ([&]() -> const StickersSetsOrder & { if (_section == Section::Installed) { @@ -2038,6 +2046,7 @@ void StickersBox::Inner::rebuild(bool masks) { set->accessHash); } } + _oldRows.clear(); session().api().requestStickerSets(); updateSize(); } @@ -2150,19 +2159,55 @@ void StickersBox::Inner::rebuildAppendSet( QString title = fillSetTitle(set, maxNameWidth, &titleWidth); int count = fillSetCount(set); - _rows.push_back(std::make_unique( - set, - sticker, - count, - title, - titleWidth, - installed, - official, - unread, - archived, - removed, - pixw, - pixh)); + const auto existing = [&]{ + const auto now = int(_rows.size()); + const auto setProj = [](const std::unique_ptr &row) { + return row ? row->set.get() : nullptr; + }; + if (_oldRows.size() > now + && setProj(_oldRows[now]) == set.get()) { + return _oldRows.begin() + now; + } + return ranges::find(_oldRows, set.get(), setProj); + }(); + if (existing != end(_oldRows)) { + const auto raw = existing->get(); + raw->sticker = sticker; + raw->count = count; + raw->title = title; + raw->titleWidth = titleWidth; + raw->installed = installed; + raw->official = official; + raw->unread = unread; + raw->archived = archived; + raw->removed = removed; + raw->pixw = pixw; + raw->pixh = pixh; + raw->yadd = {}; + auto oldStickerMedia = std::move(raw->stickerMedia); + auto oldThumbnailMedia = std::move(raw->thumbnailMedia); + raw->stickerMedia = sticker->activeMediaView(); + raw->thumbnailMedia = set->activeThumbnailView(); + if (raw->thumbnailMedia != oldThumbnailMedia + || (!raw->thumbnailMedia && raw->stickerMedia != oldStickerMedia)) { + raw->lottie = nullptr; + } + _rows.push_back(std::move(*existing)); + } else { + _rows.push_back(std::make_unique( + set, + sticker, + count, + title, + titleWidth, + installed, + official, + unread, + archived, + removed, + pixw, + pixh)); + } _shiftingStartTimes.push_back(0); } diff --git a/Telegram/SourceFiles/boxes/stickers_box.h b/Telegram/SourceFiles/boxes/stickers_box.h index 29c06b8f1..cde86ec27 100644 --- a/Telegram/SourceFiles/boxes/stickers_box.h +++ b/Telegram/SourceFiles/boxes/stickers_box.h @@ -143,6 +143,7 @@ private: object_ptr _tabs = { nullptr }; QList
_tabIndices; + bool _ignoreTabActivation = false; class CounterWidget; object_ptr _unreadBadge = { nullptr }; diff --git a/Telegram/SourceFiles/calls/calls_box_controller.cpp b/Telegram/SourceFiles/calls/calls_box_controller.cpp index 616a32687..2f1f92114 100644 --- a/Telegram/SourceFiles/calls/calls_box_controller.cpp +++ b/Telegram/SourceFiles/calls/calls_box_controller.cpp @@ -32,6 +32,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "styles/style_layers.h" // st::boxLabel. #include "styles/style_calls.h" #include "styles/style_boxes.h" +#include "styles/style_menu_icons.h" namespace Calls { namespace { @@ -358,12 +359,14 @@ base::unique_qptr BoxController::rowContextMenu( const auto session = &this->session(); const auto ids = session->data().itemsToIds(items); - auto result = base::make_unique_q(parent); + auto result = base::make_unique_q( + parent, + st::popupMenuWithIcons); result->addAction(tr::lng_context_delete_selected(tr::now), [=] { _window->show( Box(session, base::duplicate(ids)), Ui::LayerOption::KeepOther); - }); + }, &st::menuIconDelete); return result; } diff --git a/Telegram/SourceFiles/calls/group/calls_group_members.cpp b/Telegram/SourceFiles/calls/group/calls_group_members.cpp index 26e1ace96..be0499359 100644 --- a/Telegram/SourceFiles/calls/group/calls_group_members.cpp +++ b/Telegram/SourceFiles/calls/group/calls_group_members.cpp @@ -44,8 +44,6 @@ namespace Calls::Group { namespace { constexpr auto kKeepRaisedHandStatusDuration = 3 * crl::time(1000); -constexpr auto kUserpicSizeForBlur = 40; -constexpr auto kUserpicBlurRadius = 8; using Row = MembersRow; diff --git a/Telegram/SourceFiles/chat_helpers/bot_keyboard.cpp b/Telegram/SourceFiles/chat_helpers/bot_keyboard.cpp index d1d6b75f9..13e1e571d 100644 --- a/Telegram/SourceFiles/chat_helpers/bot_keyboard.cpp +++ b/Telegram/SourceFiles/chat_helpers/bot_keyboard.cpp @@ -245,11 +245,12 @@ bool BotKeyboard::updateMarkup(HistoryItem *to, bool force) { return false; } - if (_wasForMsgId == FullMsgId(to->channelId(), to->id) && !force) { + const auto peerId = to->history()->peer->id; + if (_wasForMsgId == FullMsgId(peerId, to->id) && !force) { return false; } - _wasForMsgId = FullMsgId(to->channelId(), to->id); + _wasForMsgId = FullMsgId(peerId, to->id); auto markupFlags = to->replyKeyboardFlags(); _forceReply = markupFlags & ReplyMarkupFlag::ForceReply; diff --git a/Telegram/SourceFiles/chat_helpers/emoji_interactions.cpp b/Telegram/SourceFiles/chat_helpers/emoji_interactions.cpp index 455bee476..d88e4d57e 100644 --- a/Telegram/SourceFiles/chat_helpers/emoji_interactions.cpp +++ b/Telegram/SourceFiles/chat_helpers/emoji_interactions.cpp @@ -164,7 +164,7 @@ void EmojiInteractions::startIncoming( if (!peer->isUser() || bunch.interactions.empty()) { return; } - const auto item = _session->data().message(nullptr, messageId); + const auto item = _session->data().message(peer->id, messageId); if (!item || !item->isRegular()) { return; } diff --git a/Telegram/SourceFiles/chat_helpers/field_autocomplete.cpp b/Telegram/SourceFiles/chat_helpers/field_autocomplete.cpp index c0aef0d3c..69f1e6455 100644 --- a/Telegram/SourceFiles/chat_helpers/field_autocomplete.cpp +++ b/Telegram/SourceFiles/chat_helpers/field_autocomplete.cpp @@ -37,12 +37,13 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/cached_round_corners.h" #include "base/unixtime.h" #include "base/random.h" +#include "base/qt_adapters.h" #include "window/window_adaptive.h" #include "window/window_session_controller.h" #include "styles/style_chat.h" #include "styles/style_widgets.h" #include "styles/style_chat_helpers.h" -#include "base/qt_adapters.h" +#include "styles/style_menu_icons.h" #include @@ -1210,7 +1211,9 @@ void FieldAutocomplete::Inner::contextMenuEvent(QContextMenuEvent *e) { ? _sendMenuType() : SendMenu::Type::Disabled; const auto method = FieldAutocomplete::ChooseMethod::ByClick; - _menu = base::make_unique_q(this); + _menu = base::make_unique_q( + this, + st::popupMenuWithIcons); const auto send = [=](Api::SendOptions options) { chooseAtIndex(method, index, options); diff --git a/Telegram/SourceFiles/chat_helpers/gifs_list_widget.cpp b/Telegram/SourceFiles/chat_helpers/gifs_list_widget.cpp index ac43fa5de..e22c79e8a 100644 --- a/Telegram/SourceFiles/chat_helpers/gifs_list_widget.cpp +++ b/Telegram/SourceFiles/chat_helpers/gifs_list_widget.cpp @@ -35,6 +35,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "history/view/history_view_cursor_state.h" #include "storage/storage_account.h" // Account::writeSavedGifs #include "styles/style_chat_helpers.h" +#include "styles/style_menu_icons.h" #include @@ -48,7 +49,7 @@ constexpr auto kSearchBotUsername = "gif"_cs; } // namespace void AddGifAction( - Fn &&)> callback, + Fn &&, const style::icon*)> callback, not_null document) { if (!document->isGifv()) { return; @@ -71,7 +72,7 @@ void AddGifAction( document->session().local().writeSavedGifs(); } data.stickers().notifySavedGifsUpdated(); - }); + }, saved ? &st::menuIconDelete : &st::menuIconGif); } class GifsListWidget::Footer : public TabbedSelector::InnerFooter { @@ -386,8 +387,11 @@ void GifsListWidget::fillContextMenu( ? item->getDocument() // Saved GIF. : item->getPreviewDocument(); // Searched GIF. if (document) { - auto callback = [&](const QString &text, Fn &&done) { - menu->addAction(text, std::move(done)); + auto callback = [&]( + const QString &text, + Fn &&done, + const style::icon *icon) { + menu->addAction(text, std::move(done), icon); }; AddGifAction(std::move(callback), document); } diff --git a/Telegram/SourceFiles/chat_helpers/gifs_list_widget.h b/Telegram/SourceFiles/chat_helpers/gifs_list_widget.h index b03485b32..f07044ebb 100644 --- a/Telegram/SourceFiles/chat_helpers/gifs_list_widget.h +++ b/Telegram/SourceFiles/chat_helpers/gifs_list_widget.h @@ -41,7 +41,7 @@ enum class Type; namespace ChatHelpers { void AddGifAction( - Fn &&)> callback, + Fn &&, const style::icon*)> callback, not_null document); class GifsListWidget diff --git a/Telegram/SourceFiles/chat_helpers/message_field.cpp b/Telegram/SourceFiles/chat_helpers/message_field.cpp index e85c1f8bb..da272a84f 100644 --- a/Telegram/SourceFiles/chat_helpers/message_field.cpp +++ b/Telegram/SourceFiles/chat_helpers/message_field.cpp @@ -543,7 +543,8 @@ void MessageLinksParser::parse() { return (tag == Ui::InputField::kTagBold) || (tag == Ui::InputField::kTagItalic) || (tag == Ui::InputField::kTagUnderline) - || (tag == Ui::InputField::kTagStrikeOut); + || (tag == Ui::InputField::kTagStrikeOut) + || (tag == Ui::InputField::kTagSpoiler); }; auto ranges = QVector(); diff --git a/Telegram/SourceFiles/chat_helpers/send_context_menu.cpp b/Telegram/SourceFiles/chat_helpers/send_context_menu.cpp index 0bd3cf82c..d45f22268 100644 --- a/Telegram/SourceFiles/chat_helpers/send_context_menu.cpp +++ b/Telegram/SourceFiles/chat_helpers/send_context_menu.cpp @@ -18,6 +18,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_peer.h" #include "main/main_session.h" #include "apiwrap.h" +#include "styles/style_menu_icons.h" #include @@ -58,14 +59,18 @@ FillMenuResult FillSendMenu( } if (silent && now != Type::Reminder) { - menu->addAction(tr::lng_send_silent_message(tr::now), silent); + menu->addAction( + tr::lng_send_silent_message(tr::now), + silent, + &st::menuIconMute); } if (schedule && now != Type::SilentOnly) { menu->addAction( (now == Type::Reminder ? tr::lng_reminder_message(tr::now) : tr::lng_schedule_message(tr::now)), - schedule); + schedule, + &st::menuIconSchedule); } return FillMenuResult::Success; } @@ -112,7 +117,9 @@ void SetupMenuAndShortcuts( } const auto menu = std::make_shared>(); const auto showMenu = [=] { - *menu = base::make_unique_q(button); + *menu = base::make_unique_q( + button, + st::popupMenuWithIcons); const auto result = FillSendMenu(*menu, type(), silent, schedule); const auto success = (result == FillMenuResult::Success); if (success) { @@ -184,7 +191,9 @@ void SetupUnreadMentionsMenu( if (!peer) { return; } - state->menu = base::make_unique_q(button); + state->menu = base::make_unique_q( + button, + st::popupMenuWithIcons); const auto text = tr::lng_context_mark_read_mentions_all(tr::now); state->menu->addAction(text, [=] { if (!state->sentForPeers.emplace(peer).second) { @@ -198,7 +207,7 @@ void SetupUnreadMentionsMenu( }).fail([=] { state->sentForPeers.remove(peer); }).send(); - }); + }, &st::menuIconMarkRead); state->menu->popup(QCursor::pos()); }; diff --git a/Telegram/SourceFiles/chat_helpers/stickers_list_widget.cpp b/Telegram/SourceFiles/chat_helpers/stickers_list_widget.cpp index 690b4b142..acebbc6c4 100644 --- a/Telegram/SourceFiles/chat_helpers/stickers_list_widget.cpp +++ b/Telegram/SourceFiles/chat_helpers/stickers_list_widget.cpp @@ -42,6 +42,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "api/api_toggling_media.h" // Api::ToggleFavedSticker #include "styles/style_chat_helpers.h" #include "styles/style_window.h" +#include "styles/style_menu_icons.h" #include @@ -2177,15 +2178,17 @@ void StickersListWidget::fillContextMenu( document, Data::FileOriginStickerSet(Data::Stickers::FavedSetId, 0)); }; + const auto isFaved = document->owner().stickers().isFaved(document); menu->addAction( - (document->owner().stickers().isFaved(document) + (isFaved ? tr::lng_faved_stickers_remove : tr::lng_faved_stickers_add)(tr::now), - toggleFavedSticker); + toggleFavedSticker, + isFaved ? &st::menuIconUnfave : &st::menuIconFave); menu->addAction(tr::lng_context_pack_info(tr::now), [=] { showStickerSetBox(document); - }); + }, &st::menuIconStickers); if (const auto id = set.id; id == Data::Stickers::RecentSetId) { menu->addAction(tr::lng_recent_stickers_remove(tr::now), [=] { @@ -2193,7 +2196,7 @@ void StickersListWidget::fillContextMenu( document, Data::FileOriginStickerSet(id, 0), false); - }); + }, &st::menuIconDelete); } } } diff --git a/Telegram/SourceFiles/chat_helpers/tabbed_selector.cpp b/Telegram/SourceFiles/chat_helpers/tabbed_selector.cpp index 47bfaf5f7..4b78b3f33 100644 --- a/Telegram/SourceFiles/chat_helpers/tabbed_selector.cpp +++ b/Telegram/SourceFiles/chat_helpers/tabbed_selector.cpp @@ -31,6 +31,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "mainwindow.h" #include "apiwrap.h" #include "styles/style_chat_helpers.h" +#include "styles/style_menu_icons.h" namespace ChatHelpers { @@ -1057,7 +1058,9 @@ void TabbedSelector::scrollToY(int y) { } void TabbedSelector::showMenuWithType(SendMenu::Type type) { - _menu = base::make_unique_q(this); + _menu = base::make_unique_q( + this, + st::popupMenuWithIcons); currentTab()->widget()->fillContextMenu(_menu, type); if (!_menu->empty()) { diff --git a/Telegram/SourceFiles/core/changelogs.cpp b/Telegram/SourceFiles/core/changelogs.cpp index 5b68c42fe..d435e5aec 100644 --- a/Telegram/SourceFiles/core/changelogs.cpp +++ b/Telegram/SourceFiles/core/changelogs.cpp @@ -26,109 +26,6 @@ namespace { std::map BetaLogs() { return { - { - 2009004, - "- Choose one from dozens of new gorgeous animated backgrounds" - " in Chat Settings > Chat background.\n" - }, - { - 2009005, - "- Tile chat background patterns horizontally.\n" - - "- Fix a rare crash in spellchecker on Windows.\n" - - "- Fix animated chat backgrounds in Saved Messages.\n" - - "- Fix \"Sorry, group is inaccessible\" message " - "in scheduled voice chats.\n", - }, - { - 2009013, - "- See unread comments count when scrolling discussions in channels." - }, - { - 3000002, - "- Check who've seen your message in small groups " - "from the context menu.\n" - - "- Enable recording with video in live streams and video chats." - }, - { - 3000004, - "- Fix a crash when joining video chat or live broadcast.\n" - - "- Add a \"Close to Taskbar\" option when tray icon is disabled " - "(Windows and Linux)." - }, - { - 3000005, - "- Add support for Emoji 13.1." - }, - { - 3001002, - "- Control video in fullscreen mode using arrows and numbers.\n" - - "- Open locations in browser if default Bing Maps is not installed.\n" - - "- Reconnect without timeout when network availability changes.\n" - - "- Crash fixes." - }, - { - 3001005, - "- Choose one of 8 new preset themes for any individual private chat.\n" - - "- Click on '...' menu > 'Change Colors' to pick a theme.\n" - - "- Both chat participants will see the same theme in that chat " - "– on all their devices.\n" - - "- Each new theme features colorful gradient message bubbles, " - "beautifully animated backgrounds and unique background patterns.\n" - - "- All chat themes have day and night versions and will follow " - "your overall dark mode settings.\n" - - "- Implement main window rounded corners on Windows 11.\n" - - "- Fix audio capture from AirPods on macOS.\n" - }, - { - 3001006, - "- Show small media previews in chats list.\n" - - "- Show media album previews and caption text in chats list.\n" - - "- Add \"Quick Reply\" and \"Mark as Read\" " - "to native Windows notifications.\n" - }, - { - 3001012, - "- Create special invite links that require admins " - "to approve users before they become members.\n" - - "- Admins can view the applicants' profiles and bios " - "by tapping the Join Requests bar at the top of the chat.\n" - - "- Add internal labels to your chat's Invite Links " - "to keep them organized.\n" - - "- Run natively on Apple Silicon (macOS only).\n" - }, - { - 3001013, - "- Fix requests to groups / channels processing.\n" - - "- Fix internal link previews with View Content button layout.\n" - - "- Fix crash in messages search with imported messages results.\n" - - "- Don't use fractional system UI scaling on Linux.\n" - - "- Fix invite link icons on macOS.\n" - - "- Several crash fixes.\n" - }, { 3002006, "- Try out the new audio player with playlist shuffle and repeat.\n" @@ -145,6 +42,34 @@ std::map BetaLogs() { "- Fix a crash in archived stickers loading.\n" "- Fix a crash in calls to old Telegram versions.\n" + }, + { + 3003001, + "- Switch between contacts list sorting modes.\n" + + "- Sort contacts list by last seen time by default.\n" + + "- Fix disappearing Send As Channel button after message editing.\n" + + "- Fix file upload cancelling.\n" + + "- Fix crash in video capture on macOS.\n" + + "- Fix labels in the About box.\n" + + "- Use Qt 6.2.2 for macOS and Linux builds.\n" + + "- Allow installing x64 Windows version on Windows ARM.\n" + }, + { + 3003002, + "- Select text when typing and choose 'Formatting > Spoiler' in the " + "context menu to hide some or all of the contents of a message.\n" + + "- Click on the spoiler in chat to reveal its hidden text.\n" + + "- Spoiler formatting hides text in chat, " + "as well as in the chat list and notifications.\n" } }; }; diff --git a/Telegram/SourceFiles/core/crash_report_window.cpp b/Telegram/SourceFiles/core/crash_report_window.cpp index f607fb5b0..430d16f3e 100644 --- a/Telegram/SourceFiles/core/crash_report_window.cpp +++ b/Telegram/SourceFiles/core/crash_report_window.cpp @@ -46,9 +46,7 @@ PreLaunchWindow::PreLaunchWindow(QString title) { p.setColor(QPalette::Window, QColor(255, 255, 255)); setPalette(p); - QLabel tmp(this); - tmp.setText(qsl("Tmp")); - _size = tmp.sizeHint().height(); + _size = QFontMetrics(QGuiApplication::font()).height(); int paddingVertical = (_size / 2); int paddingHorizontal = _size; diff --git a/Telegram/SourceFiles/core/launcher.cpp b/Telegram/SourceFiles/core/launcher.cpp index 9b8042576..5de08d549 100644 --- a/Telegram/SourceFiles/core/launcher.cpp +++ b/Telegram/SourceFiles/core/launcher.cpp @@ -10,6 +10,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "kotato/kotato_version.h" #include "platform/platform_launcher.h" #include "platform/platform_specific.h" +#include "platform/linux/linux_desktop_environment.h" #include "base/platform/base_platform_info.h" #include "base/platform/base_platform_file_utilities.h" #include "ui/main_queue_processor.h" @@ -64,7 +65,12 @@ FilteredCommandLineArguments::FilteredCommandLineArguments( pushArgument("cocoa:fontengine=freetype"); #endif // !Q_OS_WIN } -#endif // Q_OS_WIN || Q_OS_MAC +#elif defined Q_OS_UNIX + if (Platform::DesktopEnvironment::IsGnome()) { + pushArgument("-platform"); + pushArgument("xcb;wayland"); + } +#endif // Q_OS_WIN || Q_OS_MAC || Q_OS_UNIX pushArgument(nullptr); } @@ -485,7 +491,6 @@ void Launcher::processArguments() { auto parseMap = std::map { { "-debug" , KeyFormat::NoValues }, { "-freetype" , KeyFormat::NoValues }, - { "-many" , KeyFormat::NoValues }, { "-key" , KeyFormat::OneValue }, { "-autostart" , KeyFormat::NoValues }, { "-fixprevious" , KeyFormat::NoValues }, @@ -527,7 +532,6 @@ void Launcher::processArguments() { gUseFreeType = parseResult.contains("-freetype"); gDebugMode = parseResult.contains("-debug"); - gManyInstance = parseResult.contains("-many"); gKeyFile = parseResult.value("-key", {}).join(QString()).toLower(); gKeyFile = gKeyFile.replace(QRegularExpression("[^a-z0-9\\-_]"), {}); gLaunchMode = parseResult.contains("-autostart") ? LaunchModeAutoStart diff --git a/Telegram/SourceFiles/core/local_url_handlers.cpp b/Telegram/SourceFiles/core/local_url_handlers.cpp index 6d01a93b2..5fc5a1c4f 100644 --- a/Telegram/SourceFiles/core/local_url_handlers.cpp +++ b/Telegram/SourceFiles/core/local_url_handlers.cpp @@ -448,8 +448,8 @@ bool OpenMediaTimestamp( const auto parts = base.mid(3).split('_'); const auto documentId = parts.value(0).toULongLong(); const auto itemId = FullMsgId( - parts.value(1).toInt(), - parts.value(2).toInt()); + PeerId(parts.value(1).toULongLong()), + MsgId(parts.value(2).toLongLong())); const auto session = &controller->session(); const auto document = session->data().document(documentId); session->settings().setMediaLastPlaybackPosition( diff --git a/Telegram/SourceFiles/core/sandbox.cpp b/Telegram/SourceFiles/core/sandbox.cpp index 53ea7391c..6c219504e 100644 --- a/Telegram/SourceFiles/core/sandbox.cpp +++ b/Telegram/SourceFiles/core/sandbox.cpp @@ -29,6 +29,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/effects/animations.h" #include "app.h" +#include #include #include #include @@ -99,10 +100,35 @@ int Sandbox::start() { if (!Core::UpdaterDisabled()) { _updateChecker = std::make_unique(); } - const auto d = QFile::encodeName(QDir(cWorkingDir()).absolutePath()); - char h[33] = { 0 }; - hashMd5Hex(d.constData(), d.size(), h); - _localServerName = Platform::SingleInstanceLocalServerName(h); + + { + const auto d = QFile::encodeName(QDir(cWorkingDir()).absolutePath()); + char h[33] = { 0 }; + hashMd5Hex(d.constData(), d.size(), h); + _localServerName = Platform::SingleInstanceLocalServerName(h); + } + + { + const auto d = QFile::encodeName(cExeDir() + cExeName()); + QByteArray h; + h.resize(32); + hashMd5Hex(d.constData(), d.size(), h.data()); + _lockFile = std::make_unique(QDir::tempPath() + '/' + h + '-' + cGUIDStr()); + _lockFile->setStaleLockTime(0); + if (!_lockFile->tryLock() && _launcher->customWorkingDir()) { + // On Windows, QLockFile has problems detecting a stale lock + // if the machine's hostname contains characters outside the US-ASCII character set. + if constexpr (Platform::IsWindows()) { + // QLockFile::removeStaleLockFile returns false on Windows, + // when the application owning the lock is still running. + if (!_lockFile->removeStaleLockFile()) { + gManyInstance = true; + } + } else { + gManyInstance = true; + } + } + } connect( &_localSocket, @@ -149,13 +175,8 @@ int Sandbox::start() { restartHint, Qt::DirectConnection); - if (cManyInstance()) { - LOG(("Many instance allowed, starting...")); - singleInstanceChecked(); - } else { - LOG(("Connecting local socket to %1...").arg(_localServerName)); - _localSocket.connectToServer(_localServerName); - } + LOG(("Connecting local socket to %1...").arg(_localServerName)); + _localSocket.connectToServer(_localServerName); if (QuitOnStartRequested) { closeApplication(); @@ -339,7 +360,7 @@ void Sandbox::socketError(QLocalSocket::LocalSocketError e) { void Sandbox::singleInstanceChecked() { if (cManyInstance()) { - Logs::multipleInstances(); + LOG(("App Info: Detected another instance")); } if (!cQtScale()) { @@ -347,7 +368,7 @@ void Sandbox::singleInstanceChecked() { } refreshGlobalProxy(); - if (!Logs::started() || (!cManyInstance() && !Logs::instanceChecked())) { + if (!Logs::started() || !Logs::instanceChecked()) { new NotStartedWindow(); return; } diff --git a/Telegram/SourceFiles/core/sandbox.h b/Telegram/SourceFiles/core/sandbox.h index 7362f5554..944dee65e 100644 --- a/Telegram/SourceFiles/core/sandbox.h +++ b/Telegram/SourceFiles/core/sandbox.h @@ -15,6 +15,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include #include +class QLockFile; + namespace Core { class Launcher; @@ -119,6 +121,7 @@ private: QLocalServer _localServer; QLocalSocket _localSocket; LocalClients _localClients; + std::unique_ptr _lockFile; bool _secondInstance = false; bool _started = false; static bool QuitOnStartRequested; diff --git a/Telegram/SourceFiles/core/ui_integration.cpp b/Telegram/SourceFiles/core/ui_integration.cpp index 746879b65..69d8ecb01 100644 --- a/Telegram/SourceFiles/core/ui_integration.cpp +++ b/Telegram/SourceFiles/core/ui_integration.cpp @@ -329,6 +329,10 @@ QString UiIntegration::phraseFormattingMonospace() { return tr::lng_menu_formatting_monospace(tr::now); } +QString UiIntegration::phraseFormattingSpoiler() { + return tr::lng_menu_formatting_spoiler(tr::now); +} + bool OpenGLLastCheckFailed() { return QFile::exists(OpenGLCheckFilePath()); } diff --git a/Telegram/SourceFiles/core/ui_integration.h b/Telegram/SourceFiles/core/ui_integration.h index 70c3ffa9c..a62c68b53 100644 --- a/Telegram/SourceFiles/core/ui_integration.h +++ b/Telegram/SourceFiles/core/ui_integration.h @@ -71,6 +71,7 @@ public: QString phraseFormattingUnderline() override; QString phraseFormattingStrikeOut() override; QString phraseFormattingMonospace() override; + QString phraseFormattingSpoiler() override; }; diff --git a/Telegram/SourceFiles/core/utils.cpp b/Telegram/SourceFiles/core/utils.cpp index 160af3f77..00d07d25b 100644 --- a/Telegram/SourceFiles/core/utils.cpp +++ b/Telegram/SourceFiles/core/utils.cpp @@ -30,8 +30,6 @@ extern "C" { #include #endif -#include - uint64 _SharedMemoryLocation[4] = { 0x00, 0x01, 0x02, 0x03 }; // Base types compile-time check @@ -56,15 +54,6 @@ static_assert(sizeof(int) >= 4, "Basic types size check failed"); // Precise timing functions / rand init -struct CRYPTO_dynlock_value { - QMutex mutex; -}; - -namespace { - bool _sslInited = false; - QMutex *_sslLocks = nullptr; -} - namespace ThirdParty { void start() { @@ -94,45 +83,15 @@ namespace ThirdParty { LOG(("MTP Error: Could not init OpenSSL rand, RAND_status() is 0...")); } } - - // Force OpenSSL loading if it is linked in Qt, - // so that we won't mess with our OpenSSL locking with Qt OpenSSL locking. - auto sslSupported = QSslSocket::supportsSsl(); - if (!sslSupported) { - LOG(("Error: current Qt build doesn't support SSL requests.")); - } - if (!CRYPTO_get_locking_callback()) { - // Qt didn't initialize OpenSSL, so we will. - auto numLocks = CRYPTO_num_locks(); - if (numLocks) { - _sslLocks = new QMutex[numLocks]; - CRYPTO_set_locking_callback(_sslLockingCallback); - } else { - LOG(("MTP Error: Could not init OpenSSL threads, CRYPTO_num_locks() returned zero!")); - } - } - if (!CRYPTO_get_dynlock_create_callback()) { - CRYPTO_set_dynlock_create_callback(_sslCreateFunction); - CRYPTO_set_dynlock_lock_callback(_sslLockFunction); - CRYPTO_set_dynlock_destroy_callback(_sslDestroyFunction); - } else if (!CRYPTO_get_dynlock_lock_callback()) { - LOG(("MTP Error: dynlock_create callback is set without dynlock_lock callback!")); - } - - _sslInited = true; } void finish() { - CRYPTO_cleanup_all_ex_data(); -#ifndef LIBRESSL_VERSION_NUMBER +#if OPENSSL_VERSION_NUMBER >= 0x30000000L + EVP_default_properties_enable_fips(nullptr, 0); +#else FIPS_mode_set(0); #endif - ENGINE_cleanup(); CONF_modules_unload(1); - ERR_free_strings(); - EVP_cleanup(); - - delete[] base::take(_sslLocks); Platform::ThirdParty::finish(); } diff --git a/Telegram/SourceFiles/core/version.h b/Telegram/SourceFiles/core/version.h index d2f234c69..c3ef8dd13 100644 --- a/Telegram/SourceFiles/core/version.h +++ b/Telegram/SourceFiles/core/version.h @@ -22,7 +22,7 @@ constexpr auto AppId = "{C4A4AE8F-B9F7-4CC7-8A6C-BF7EEE87ACA5}"_cs; constexpr auto AppNameOld = "Telegram Win (Unofficial)"_cs; constexpr auto AppName = "Kotatogram Desktop"_cs; constexpr auto AppFile = "Kotatogram"_cs; -constexpr auto AppVersion = 3003000; -constexpr auto AppVersionStr = "3.3"; +constexpr auto AppVersion = 3004003; +constexpr auto AppVersionStr = "3.4.3"; constexpr auto AppBetaVersion = false; constexpr auto AppAlphaVersion = TDESKTOP_ALPHA_VERSION; diff --git a/Telegram/SourceFiles/data/data_changes.h b/Telegram/SourceFiles/data/data_changes.h index 1b8b768f1..9b64579ad 100644 --- a/Telegram/SourceFiles/data/data_changes.h +++ b/Telegram/SourceFiles/data/data_changes.h @@ -86,17 +86,18 @@ struct PeerUpdate { BannedUsers = (1ULL << 25), Rights = (1ULL << 26), PendingRequests = (1ULL << 27), + Reactions = (1ULL << 28), // For channels - ChannelAmIn = (1ULL << 28), - StickersSet = (1ULL << 29), - ChannelLinkedChat = (1ULL << 30), - ChannelLocation = (1ULL << 31), - Slowmode = (1ULL << 32), - GroupCall = (1ULL << 33), + ChannelAmIn = (1ULL << 29), + StickersSet = (1ULL << 30), + ChannelLinkedChat = (1ULL << 31), + ChannelLocation = (1ULL << 32), + Slowmode = (1ULL << 33), + GroupCall = (1ULL << 34), // For iteration - LastUsedBit = (1ULL << 33), + LastUsedBit = (1ULL << 34), }; using Flags = base::flags; friend inline constexpr auto is_flag_type(Flag) { return true; } diff --git a/Telegram/SourceFiles/data/data_channel.cpp b/Telegram/SourceFiles/data/data_channel.cpp index e6a8b4c9e..181fb8095 100644 --- a/Telegram/SourceFiles/data/data_channel.cpp +++ b/Telegram/SourceFiles/data/data_channel.cpp @@ -17,6 +17,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_location.h" #include "data/data_histories.h" #include "data/data_group_call.h" +#include "data/data_message_reactions.h" #include "lang/lang_keys.h" #include "main/main_session.h" #include "main/session/send_as_peers.h" @@ -781,6 +782,23 @@ PeerId ChannelData::groupCallDefaultJoinAs() const { return _callDefaultJoinAs; } +void ChannelData::setAllowedReactions(std::vector list) { + if (_allowedReactions != list) { + const auto toggled = (_allowedReactions.empty() != list.empty()); + _allowedReactions = std::move(list); + if (toggled) { + owner().reactions().updateAllInHistory( + this, + !_allowedReactions.empty()); + } + session().changes().peerUpdated(this, UpdateFlag::Reactions); + } +} + +const std::vector &ChannelData::allowedReactions() const { + return _allowedReactions; +} + namespace Data { void ApplyMigration( @@ -924,6 +942,8 @@ void ApplyChannelUpdate( } } channel->setThemeEmoji(qs(update.vtheme_emoticon().value_or_empty())); + channel->setAllowedReactions( + Data::Reactions::ParseAllowed(update.vavailable_reactions())); channel->fullUpdated(); channel->setPendingRequestsCount( update.vrequests_pending().value_or_empty(), diff --git a/Telegram/SourceFiles/data/data_channel.h b/Telegram/SourceFiles/data/data_channel.h index 256020d70..6ec606465 100644 --- a/Telegram/SourceFiles/data/data_channel.h +++ b/Telegram/SourceFiles/data/data_channel.h @@ -411,6 +411,9 @@ public: void setGroupCallDefaultJoinAs(PeerId peerId); [[nodiscard]] PeerId groupCallDefaultJoinAs() const; + void setAllowedReactions(std::vector list); + [[nodiscard]] const std::vector &allowedReactions() const; + // Still public data members. uint64 access = 0; @@ -458,6 +461,8 @@ private: QString _inviteLink; std::optional _linkedChat; + std::vector _allowedReactions; + std::unique_ptr _call; PeerId _callDefaultJoinAs = 0; diff --git a/Telegram/SourceFiles/data/data_chat.cpp b/Telegram/SourceFiles/data/data_chat.cpp index 731b595bf..16acd3694 100644 --- a/Telegram/SourceFiles/data/data_chat.cpp +++ b/Telegram/SourceFiles/data/data_chat.cpp @@ -12,6 +12,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_session.h" #include "data/data_changes.h" #include "data/data_group_call.h" +#include "data/data_message_reactions.h" #include "history/history.h" #include "main/main_session.h" #include "apiwrap.h" @@ -286,6 +287,23 @@ void ChatData::setPendingRequestsCount( } } +void ChatData::setAllowedReactions(std::vector list) { + if (_allowedReactions != list) { + const auto toggled = (_allowedReactions.empty() != list.empty()); + _allowedReactions = std::move(list); + if (toggled) { + owner().reactions().updateAllInHistory( + this, + !_allowedReactions.empty()); + } + session().changes().peerUpdated(this, UpdateFlag::Reactions); + } +} + +const std::vector &ChatData::allowedReactions() const { + return _allowedReactions; +} + namespace Data { void ApplyChatUpdate( @@ -457,6 +475,8 @@ void ApplyChatUpdate(not_null chat, const MTPDchatFull &update) { } chat->checkFolder(update.vfolder_id().value_or_empty()); chat->setThemeEmoji(qs(update.vtheme_emoticon().value_or_empty())); + chat->setAllowedReactions( + Data::Reactions::ParseAllowed(update.vavailable_reactions())); chat->fullUpdated(); chat->setAbout(qs(update.vabout())); chat->setPendingRequestsCount( diff --git a/Telegram/SourceFiles/data/data_chat.h b/Telegram/SourceFiles/data/data_chat.h index 69cd51627..8893a5889 100644 --- a/Telegram/SourceFiles/data/data_chat.h +++ b/Telegram/SourceFiles/data/data_chat.h @@ -175,6 +175,9 @@ public: int count, std::vector recentRequesters); + void setAllowedReactions(std::vector list); + [[nodiscard]] const std::vector &allowedReactions() const; + // Still public data members. const MTPlong inputChat; @@ -199,6 +202,8 @@ private: int _pendingRequestsCount = 0; std::vector _recentRequesters; + std::vector _allowedReactions; + std::unique_ptr _call; PeerId _callDefaultJoinAs = 0; base::flat_map> _botCommands; diff --git a/Telegram/SourceFiles/data/data_cloud_file.cpp b/Telegram/SourceFiles/data/data_cloud_file.cpp index f0801e13e..77ae77634 100644 --- a/Telegram/SourceFiles/data/data_cloud_file.cpp +++ b/Telegram/SourceFiles/data/data_cloud_file.cpp @@ -172,11 +172,25 @@ void UpdateCloudFile( return; } + const auto needStickerThumbnailUpdate = [&] { + const auto was = std::get_if( + &file.location.file().data); + const auto now = std::get_if( + &data.location.file().data); + using Type = StorageFileLocation::Type; + if (!was || !now || was->type() != Type::StickerSetThumb) { + return false; + } + return now->valid() + && (now->type() != Type::StickerSetThumb + || now->cacheKey() != was->cacheKey()); + }; const auto update = !file.location.valid() || (data.location.file().cacheKey() && (!file.location.file().cacheKey() || (file.location.width() < data.location.width()) - || (file.location.height() < data.location.height()))); + || (file.location.height() < data.location.height()) + || needStickerThumbnailUpdate())); if (!update) { return; } @@ -204,6 +218,8 @@ void UpdateCloudFile( } else if (file.loader) { const auto origin = base::take(file.loader)->fileOrigin(); restartLoader(origin); + } else if (file.flags & CloudFile::Flag::Failed) { + file.flags &= ~CloudFile::Flag::Failed; } } diff --git a/Telegram/SourceFiles/data/data_document.cpp b/Telegram/SourceFiles/data/data_document.cpp index e555f96ff..84c9ab377 100644 --- a/Telegram/SourceFiles/data/data_document.cpp +++ b/Telegram/SourceFiles/data/data_document.cpp @@ -1221,7 +1221,10 @@ bool DocumentData::hasWebLocation() const { } bool DocumentData::isNull() const { - return !hasRemoteLocation() && !hasWebLocation() && _url.isEmpty(); + return !hasRemoteLocation() + && !hasWebLocation() + && _url.isEmpty() + && !uploading(); } MTPInputDocument DocumentData::mtpInput() const { @@ -1337,7 +1340,7 @@ bool DocumentData::isSongWithCover() const { } bool DocumentData::isAudioFile() const { - if (isVoiceMessage()) { + if (isVoiceMessage() || isVideoFile()) { return false; } else if (isSong()) { return true; diff --git a/Telegram/SourceFiles/data/data_folder.cpp b/Telegram/SourceFiles/data/data_folder.cpp index 1e834595b..6a125a82a 100644 --- a/Telegram/SourceFiles/data/data_folder.cpp +++ b/Telegram/SourceFiles/data/data_folder.cpp @@ -323,9 +323,7 @@ void Folder::applyDialog(const MTPDdialogFolder &data) { _chatsList.updateCloudUnread(data); if (const auto peerId = peerFromMTP(data.vpeer())) { const auto history = owner().history(peerId); - const auto fullId = FullMsgId( - peerToChannel(peerId), - data.vtop_message().v); + const auto fullId = FullMsgId(peerId, data.vtop_message().v); history->setFolder(this, owner().message(fullId)); } else { _chatsList.clear(); diff --git a/Telegram/SourceFiles/data/data_histories.cpp b/Telegram/SourceFiles/data/data_histories.cpp index b6c1f2a26..95ce6d0a6 100644 --- a/Telegram/SourceFiles/data/data_histories.cpp +++ b/Telegram/SourceFiles/data/data_histories.cpp @@ -469,7 +469,7 @@ void Histories::requestGroupAround(not_null item) { result); _chatListGroupRequests.remove(history); history->migrateToOrMe()->applyChatListGroup( - history->channelId(), + history->peer->id, result); finish(); }).fail([=] { diff --git a/Telegram/SourceFiles/data/data_media_types.cpp b/Telegram/SourceFiles/data/data_media_types.cpp index ad43bb106..7572b1db7 100644 --- a/Telegram/SourceFiles/data/data_media_types.cpp +++ b/Telegram/SourceFiles/data/data_media_types.cpp @@ -11,6 +11,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "history/history_item.h" #include "history/history_location_manager.h" #include "history/view/history_view_element.h" +#include "history/view/history_view_item_preview.h" #include "history/view/media/history_view_photo.h" #include "history/view/media/history_view_sticker.h" #include "history/view/media/history_view_gif.h" @@ -68,13 +69,14 @@ using ItemPreviewImage = HistoryView::ItemPreviewImage; [[nodiscard]] QString WithCaptionDialogsText( const QString &attachType, const QString &caption, - bool hasMiniImages) { + bool hasMiniImages, + const HistoryView::ToPreviewOptions &options) { if (caption.isEmpty()) { return textcmdLink(1, TextUtilities::Clean(attachType)); } return hasMiniImages - ? TextUtilities::Clean(caption) + ? TextUtilities::Clean(caption, !options.ignoreSpoilers) : tr::lng_dialogs_text_media( tr::now, lt_media_part, @@ -83,7 +85,7 @@ using ItemPreviewImage = HistoryView::ItemPreviewImage; lt_media, TextUtilities::Clean(attachType))), lt_caption, - TextUtilities::Clean(caption)); + TextUtilities::Clean(caption, !options.ignoreSpoilers)); } [[nodiscard]] QString WithCaptionNotificationText( @@ -357,7 +359,11 @@ ItemPreview Media::toPreview(ToPreviewOptions options) const { auto result = notificationText(); auto text = result.isEmpty() ? QString() - : textcmdLink(1, TextUtilities::Clean(std::move(result))); + : textcmdLink( + 1, + TextUtilities::Clean( + std::move(result), + !options.ignoreSpoilers)); return { .text = std::move(text) }; } @@ -537,7 +543,7 @@ bool MediaPhoto::replyPreviewLoaded() const { QString MediaPhoto::notificationText() const { return WithCaptionNotificationText( tr::lng_in_dlg_photo(tr::now), - parent()->originalText().text); + TextUtilities::TextWithSpoilerCommands(parent()->originalText())); } ItemPreview MediaPhoto::toPreview(ToPreviewOptions options) const { @@ -568,9 +574,12 @@ ItemPreview MediaPhoto::toPreview(ToPreviewOptions options) const { const auto type = tr::lng_in_dlg_photo(tr::now); const auto caption = options.hideCaption ? QString() - : parent()->originalText().text; + : options.ignoreSpoilers + ? parent()->originalText().text + : TextUtilities::TextWithSpoilerCommands(parent()->originalText()); + const auto hasMiniImages = !images.empty(); return { - .text = WithCaptionDialogsText(type, caption, !images.empty()), + .text = WithCaptionDialogsText(type, caption, hasMiniImages, options), .images = std::move(images), .loadingContext = std::move(context), }; @@ -787,9 +796,12 @@ ItemPreview MediaFile::toPreview(ToPreviewOptions options) const { }(); const auto caption = options.hideCaption ? QString() - : parent()->originalText().text; + : options.ignoreSpoilers + ? parent()->originalText().text + : TextUtilities::TextWithSpoilerCommands(parent()->originalText()); + const auto hasMiniImages = !images.empty(); return { - .text = WithCaptionDialogsText(type, caption, !images.empty()), + .text = WithCaptionDialogsText(type, caption, hasMiniImages, options), .images = std::move(images), .loadingContext = std::move(context), }; @@ -817,7 +829,9 @@ QString MediaFile::notificationText() const { } return tr::lng_in_dlg_file(tr::now); }(); - return WithCaptionNotificationText(type, parent()->originalText().text); + return WithCaptionNotificationText( + type, + TextUtilities::TextWithSpoilerCommands(parent()->originalText())); } QString MediaFile::pinnedTextSubstring() const { @@ -1118,7 +1132,9 @@ const LocationPoint *MediaLocation::geoPoint() const { ItemPreview MediaLocation::toPreview(ToPreviewOptions options) const { const auto type = tr::lng_maps_point(tr::now); const auto hasMiniImages = false; - return { .text = WithCaptionDialogsText(type, _title, hasMiniImages) }; + return { + .text = WithCaptionDialogsText(type, _title, hasMiniImages, options), + }; } QString MediaLocation::notificationText() const { @@ -1314,7 +1330,7 @@ ItemPreview MediaWebPage::toPreview(ToPreviewOptions options) const { } QString MediaWebPage::notificationText() const { - return parent()->originalText().text; + return TextUtilities::TextWithSpoilerCommands(parent()->originalText()); } QString MediaWebPage::pinnedTextSubstring() const { diff --git a/Telegram/SourceFiles/data/data_message_reactions.cpp b/Telegram/SourceFiles/data/data_message_reactions.cpp new file mode 100644 index 000000000..8f8d9be33 --- /dev/null +++ b/Telegram/SourceFiles/data/data_message_reactions.cpp @@ -0,0 +1,471 @@ +/* +This file is part of Telegram Desktop, +the official desktop application for the Telegram messaging service. + +For license and copyright information please follow this link: +https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL +*/ +#include "data/data_message_reactions.h" + +#include "history/history.h" +#include "history/history_item.h" +#include "main/main_session.h" +#include "data/data_session.h" +#include "data/data_channel.h" +#include "data/data_chat.h" +#include "data/data_document.h" +#include "data/data_document_media.h" +#include "data/data_changes.h" +#include "base/timer_rpl.h" +#include "apiwrap.h" +#include "styles/style_chat.h" + +namespace Data { +namespace { + +constexpr auto kRefreshFullListEach = 60 * 60 * crl::time(1000); +constexpr auto kPollEach = 20 * crl::time(1000); + +} // namespace + +Reactions::Reactions(not_null owner) +: _owner(owner) +, _repaintTimer([=] { repaintCollected(); }) { + refresh(); + + base::timer_each( + kRefreshFullListEach + ) | rpl::start_with_next([=] { + refresh(); + }, _lifetime); + + _owner->session().changes().messageUpdates( + MessageUpdate::Flag::Destroyed + ) | rpl::start_with_next([=](const MessageUpdate &update) { + const auto item = update.item; + _pollingItems.remove(item); + _pollItems.remove(item); + _repaintItems.remove(item); + }, _lifetime); +} + +void Reactions::refresh() { + request(); +} + +const std::vector &Reactions::list(Type type) const { + switch (type) { + case Type::Active: return _active; + case Type::All: return _available; + } + Unexpected("Type in Reactions::list."); +} + +std::vector Reactions::list(not_null peer) const { + if (const auto chat = peer->asChat()) { + return filtered(chat->allowedReactions()); + } else if (const auto channel = peer->asChannel()) { + return filtered(channel->allowedReactions()); + } else { + return list(Type::Active); + } +} + +rpl::producer<> Reactions::updates() const { + return _updated.events(); +} + +void Reactions::preloadImageFor(const QString &emoji) { + if (_images.contains(emoji)) { + return; + } + auto &set = _images.emplace(emoji).first->second; + const auto i = ranges::find(_available, emoji, &Reaction::emoji); + const auto document = (i != end(_available)) + ? i->staticIcon.get() + : nullptr; + if (document) { + loadImage(set, document); + } else if (!_waitingForList) { + _waitingForList = true; + refresh(); + } +} + +QImage Reactions::resolveImageFor( + const QString &emoji, + ImageSize size) { + const auto i = _images.find(emoji); + if (i == end(_images)) { + preloadImageFor(emoji); + } + auto &set = (i != end(_images)) ? i->second : _images[emoji]; + switch (size) { + case ImageSize::BottomInfo: return set.bottomInfo; + case ImageSize::InlineList: return set.inlineList; + } + Unexpected("ImageSize in Reactions::resolveImageFor."); +} + +void Reactions::resolveImages() { + for (auto &[emoji, set] : _images) { + if (!set.bottomInfo.isNull() || set.media) { + continue; + } + const auto i = ranges::find(_available, emoji, &Reaction::emoji); + const auto document = (i != end(_available)) + ? i->staticIcon.get() + : nullptr; + if (document) { + loadImage(set, document); + } else { + LOG(("API Error: Reaction for emoji '%1' not found!" + ).arg(emoji)); + } + } +} + +void Reactions::loadImage( + ImageSet &set, + not_null document) { + if (!set.bottomInfo.isNull()) { + return; + } else if (!set.media) { + set.media = document->createMediaView(); + } + if (const auto image = set.media->getStickerLarge()) { + setImage(set, image->original()); + } else if (!_imagesLoadLifetime) { + document->session().downloaderTaskFinished( + ) | rpl::start_with_next([=] { + downloadTaskFinished(); + }, _imagesLoadLifetime); + } +} + +void Reactions::setImage(ImageSet &set, QImage large) { + set.media = nullptr; + const auto scale = [&](int size) { + const auto factor = style::DevicePixelRatio(); + return Images::prepare( + large, + size * factor, + size * factor, + Images::Option::Smooth, + size, + size); + }; + set.bottomInfo = scale(st::reactionInfoSize); + set.inlineList = scale(st::reactionBottomSize); +} + +void Reactions::downloadTaskFinished() { + auto hasOne = false; + for (auto &[emoji, set] : _images) { + if (!set.media) { + continue; + } else if (const auto image = set.media->getStickerLarge()) { + setImage(set, image->original()); + } else { + hasOne = true; + } + } + if (!hasOne) { + _imagesLoadLifetime.destroy(); + } +} + +std::vector Reactions::Filtered( + const std::vector &reactions, + const std::vector &emoji) { + auto result = std::vector(); + result.reserve(emoji.size()); + for (const auto &single : emoji) { + const auto i = ranges::find(reactions, single, &Reaction::emoji); + if (i != end(reactions)) { + result.push_back(*i); + } + } + return result; +} + +std::vector Reactions::filtered( + const std::vector &emoji) const { + return Filtered(list(Type::Active), emoji); +} + +std::vector Reactions::ParseAllowed( + const MTPVector *list) { + if (!list) { + return {}; + } + return list->v | ranges::view::transform([](const MTPstring &string) { + return qs(string); + }) | ranges::to_vector; +} + +void Reactions::request() { + auto &api = _owner->session().api(); + if (_requestId) { + return; + } + _requestId = api.request(MTPmessages_GetAvailableReactions( + MTP_int(_hash) + )).done([=](const MTPmessages_AvailableReactions &result) { + _requestId = 0; + result.match([&](const MTPDmessages_availableReactions &data) { + _hash = data.vhash().v; + + const auto &list = data.vreactions().v; + _active.clear(); + _available.clear(); + _active.reserve(list.size()); + _available.reserve(list.size()); + for (const auto &reaction : list) { + if (const auto parsed = parse(reaction)) { + _available.push_back(*parsed); + if (parsed->active) { + _active.push_back(*parsed); + } + } + } + if (_waitingForList) { + _waitingForList = false; + resolveImages(); + } + _updated.fire({}); + }, [&](const MTPDmessages_availableReactionsNotModified &) { + }); + }).fail([=] { + _requestId = 0; + _hash = 0; + }).send(); +} + +std::optional Reactions::parse(const MTPAvailableReaction &entry) { + return entry.match([&](const MTPDavailableReaction &data) { + const auto emoji = qs(data.vreaction()); + const auto known = (Ui::Emoji::Find(emoji) != nullptr); + if (!known) { + LOG(("API Error: Unknown emoji in reactions: %1").arg(emoji)); + } + return known + ? std::make_optional(Reaction{ + .emoji = emoji, + .title = qs(data.vtitle()), + .staticIcon = _owner->processDocument(data.vstatic_icon()), + .appearAnimation = _owner->processDocument( + data.vappear_animation()), + .selectAnimation = _owner->processDocument( + data.vselect_animation()), + .activateAnimation = _owner->processDocument( + data.vactivate_animation()), + .activateEffects = _owner->processDocument( + data.veffect_animation()), + .active = !data.is_inactive(), + }) + : std::nullopt; + }); +} + +void Reactions::send(not_null item, const QString &chosen) { + const auto id = item->fullId(); + auto &api = _owner->session().api(); + auto i = _sentRequests.find(id); + if (i != end(_sentRequests)) { + api.request(i->second).cancel(); + } else { + i = _sentRequests.emplace(id).first; + } + const auto flags = chosen.isEmpty() + ? MTPmessages_SendReaction::Flag(0) + : MTPmessages_SendReaction::Flag::f_reaction; + i->second = api.request(MTPmessages_SendReaction( + MTP_flags(flags), + item->history()->peer->input, + MTP_int(id.msg), + MTP_string(chosen) + )).done([=](const MTPUpdates &result) { + _sentRequests.remove(id); + _owner->session().api().applyUpdates(result); + }).fail([=](const MTP::Error &error) { + _sentRequests.remove(id); + }).send(); +} + +void Reactions::poll(not_null item, crl::time now) { + // Group them by one second. + const auto last = item->lastReactionsRefreshTime(); + const auto grouped = ((last + 999) / 1000) * 1000; + if (!grouped || item->history()->peer->isUser()) { + // First reaction always edits message. + return; + } else if (const auto left = grouped + kPollEach - now; left > 0) { + if (!_repaintItems.contains(item)) { + _repaintItems.emplace(item, grouped + kPollEach); + if (!_repaintTimer.isActive() + || _repaintTimer.remainingTime() > left) { + _repaintTimer.callOnce(left); + } + } + } else if (!_pollingItems.contains(item)) { + if (_pollItems.empty() && !_pollRequestId) { + crl::on_main(&_owner->session(), [=] { + pollCollected(); + }); + } + _pollItems.emplace(item); + } +} + +void Reactions::updateAllInHistory(not_null peer, bool enabled) { + if (const auto history = _owner->historyLoaded(peer)) { + history->reactionsEnabledChanged(enabled); + } +} + +void Reactions::repaintCollected() { + const auto now = crl::now(); + auto closest = 0; + for (auto i = begin(_repaintItems); i != end(_repaintItems);) { + if (i->second <= now) { + _owner->requestItemRepaint(i->first); + i = _repaintItems.erase(i); + } else { + if (!closest || i->second < closest) { + closest = i->second; + } + ++i; + } + } + if (closest) { + _repaintTimer.callOnce(closest - now); + } +} + +void Reactions::pollCollected() { + auto toRequest = base::flat_map, QVector>(); + _pollingItems = std::move(_pollItems); + for (const auto &item : _pollingItems) { + toRequest[item->history()->peer].push_back(MTP_int(item->id)); + } + auto &api = _owner->session().api(); + for (const auto &[peer, ids] : toRequest) { + const auto finalize = [=] { + const auto now = crl::now(); + for (const auto &item : base::take(_pollingItems)) { + const auto last = item->lastReactionsRefreshTime(); + if (last && last + kPollEach <= now) { + item->updateReactions(nullptr); + } + } + _pollRequestId = 0; + if (!_pollItems.empty()) { + crl::on_main(&_owner->session(), [=] { + pollCollected(); + }); + } + }; + _pollRequestId = api.request(MTPmessages_GetMessagesReactions( + peer->input, + MTP_vector(ids) + )).done([=](const MTPUpdates &result) { + _owner->session().api().applyUpdates(result); + finalize(); + }).fail([=] { + finalize(); + }).send(); + } +} + +bool Reactions::sending(not_null item) const { + return _sentRequests.contains(item->fullId()); +} + +MessageReactions::MessageReactions(not_null item) +: _item(item) { +} + +void MessageReactions::add(const QString &reaction) { + if (_chosen == reaction) { + return; + } + if (!_chosen.isEmpty()) { + const auto i = _list.find(_chosen); + Assert(i != end(_list)); + --i->second; + if (!i->second) { + _list.erase(i); + } + } + _chosen = reaction; + if (!reaction.isEmpty()) { + ++_list[reaction]; + } + auto &owner = _item->history()->owner(); + owner.reactions().send(_item, _chosen); + owner.notifyItemDataChange(_item); +} + +void MessageReactions::remove() { + add(QString()); +} + +void MessageReactions::set( + const QVector &list, + bool ignoreChosen) { + if (_item->history()->owner().reactions().sending(_item)) { + // We'll apply non-stale data from the request response. + return; + } + auto changed = false; + auto existing = base::flat_set(); + for (const auto &count : list) { + count.match([&](const MTPDreactionCount &data) { + const auto reaction = qs(data.vreaction()); + if (data.is_chosen() && !ignoreChosen) { + if (_chosen != reaction) { + _chosen = reaction; + changed = true; + } + } + const auto nowCount = data.vcount().v; + auto &wasCount = _list[reaction]; + if (wasCount != nowCount) { + wasCount = nowCount; + changed = true; + } + existing.emplace(reaction); + }); + } + if (_list.size() != existing.size()) { + changed = true; + for (auto i = begin(_list); i != end(_list);) { + if (!existing.contains(i->first)) { + i = _list.erase(i); + } else { + ++i; + } + } + if (!_chosen.isEmpty() && !_list.contains(_chosen)) { + _chosen = QString(); + } + } + if (changed) { + _item->history()->owner().notifyItemDataChange(_item); + } +} + +const base::flat_map &MessageReactions::list() const { + return _list; +} + +bool MessageReactions::empty() const { + return _list.empty(); +} + +QString MessageReactions::chosen() const { + return _chosen; +} + +} // namespace Data diff --git a/Telegram/SourceFiles/data/data_message_reactions.h b/Telegram/SourceFiles/data/data_message_reactions.h new file mode 100644 index 000000000..d6e7c1844 --- /dev/null +++ b/Telegram/SourceFiles/data/data_message_reactions.h @@ -0,0 +1,132 @@ +/* +This file is part of Telegram Desktop, +the official desktop application for the Telegram messaging service. + +For license and copyright information please follow this link: +https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL +*/ +#pragma once + +#include "base/timer.h" + +namespace Data { + +class DocumentMedia; +class Session; + +struct Reaction { + QString emoji; + QString title; + not_null staticIcon; + not_null appearAnimation; + not_null selectAnimation; + not_null activateAnimation; + not_null activateEffects; + bool active = false; +}; + +class Reactions final { +public: + explicit Reactions(not_null owner); + + void refresh(); + + enum class Type { + Active, + All, + }; + [[nodiscard]] const std::vector &list(Type type) const; + [[nodiscard]] std::vector list(not_null peer) const; + + [[nodiscard]] static std::vector Filtered( + const std::vector &reactions, + const std::vector &emoji); + [[nodiscard]] std::vector filtered( + const std::vector &emoji) const; + + [[nodiscard]] static std::vector ParseAllowed( + const MTPVector *list); + + [[nodiscard]] rpl::producer<> updates() const; + + enum class ImageSize { + BottomInfo, + InlineList, + }; + void preloadImageFor(const QString &emoji); + [[nodiscard]] QImage resolveImageFor( + const QString &emoji, + ImageSize size); + + void send(not_null item, const QString &chosen); + [[nodiscard]] bool sending(not_null item) const; + + void poll(not_null item, crl::time now); + + void updateAllInHistory(not_null peer, bool enabled); + +private: + struct ImageSet { + QImage bottomInfo; + QImage inlineList; + std::shared_ptr media; + }; + + void request(); + + [[nodiscard]] std::optional parse( + const MTPAvailableReaction &entry); + + void loadImage(ImageSet &set, not_null document); + void setImage(ImageSet &set, QImage large); + void resolveImages(); + void downloadTaskFinished(); + + void repaintCollected(); + void pollCollected(); + + const not_null _owner; + + std::vector _active; + std::vector _available; + rpl::event_stream<> _updated; + + mtpRequestId _requestId = 0; + int32 _hash = 0; + + base::flat_map _images; + rpl::lifetime _imagesLoadLifetime; + bool _waitingForList = false; + + base::flat_map _sentRequests; + + base::flat_map, crl::time> _repaintItems; + base::Timer _repaintTimer; + base::flat_set> _pollItems; + base::flat_set> _pollingItems; + mtpRequestId _pollRequestId = 0; + + rpl::lifetime _lifetime; + +}; + +class MessageReactions final { +public: + explicit MessageReactions(not_null item); + + void add(const QString &reaction); + void remove(); + void set(const QVector &list, bool ignoreChosen); + [[nodiscard]] const base::flat_map &list() const; + [[nodiscard]] QString chosen() const; + [[nodiscard]] bool empty() const; + +private: + const not_null _item; + + QString _chosen; + base::flat_map _list; + +}; + +} // namespace Data diff --git a/Telegram/SourceFiles/data/data_messages.cpp b/Telegram/SourceFiles/data/data_messages.cpp index 9d01a067d..fabee6fbf 100644 --- a/Telegram/SourceFiles/data/data_messages.cpp +++ b/Telegram/SourceFiles/data/data_messages.cpp @@ -157,26 +157,6 @@ void MessagesList::removeOne(MessagePosition messageId) { } } -void MessagesList::removeAll(ChannelId channelId) { - auto removed = 0; - for (auto i = begin(_slices); i != end(_slices); ++i) { - _slices.modify(i, [&](Slice &slice) { - auto &messages = slice.messages; - for (auto j = begin(messages); j != end(messages);) { - if (j->fullId.channel == channelId) { - j = messages.erase(j); - ++removed; - } else { - ++j; - } - } - }); - } - if (removed && _count) { - *_count -= removed; - } -} - void MessagesList::removeLessThan(MessagePosition messageId) { auto removed = 0; for (auto i = begin(_slices); i != end(_slices);) { @@ -390,22 +370,6 @@ bool MessagesSliceBuilder::removeAll() { return true; } -bool MessagesSliceBuilder::removeFromChannel(ChannelId channelId) { - for (auto i = _ids.begin(); i != _ids.end();) { - if ((*i).fullId.channel == channelId) { - i = _ids.erase(i); - if (_fullCount) { - --*_fullCount; - } - } else { - ++i; - } - } - _skippedBefore = _skippedAfter = std::nullopt; - checkInsufficient(); - return true; -} - bool MessagesSliceBuilder::invalidated() { _fullCount = _skippedBefore = _skippedAfter = std::nullopt; _ids.clear(); diff --git a/Telegram/SourceFiles/data/data_messages.h b/Telegram/SourceFiles/data/data_messages.h index baf73af75..b5919e53b 100644 --- a/Telegram/SourceFiles/data/data_messages.h +++ b/Telegram/SourceFiles/data/data_messages.h @@ -65,11 +65,11 @@ struct MessagesRange { constexpr auto MinDate = TimeId(0); constexpr auto MaxDate = std::numeric_limits::max(); constexpr auto MinMessagePosition = MessagePosition{ - .fullId = FullMsgId(NoChannel, 1), + .fullId = FullMsgId(PeerId(), 1), .date = MinDate, }; constexpr auto MaxMessagePosition = MessagePosition{ - .fullId = FullMsgId(NoChannel, ServerMaxMsgId - 1), + .fullId = FullMsgId(PeerId(), ServerMaxMsgId - 1), .date = MaxDate, }; constexpr auto FullMessagesRange = MessagesRange{ @@ -77,7 +77,7 @@ constexpr auto FullMessagesRange = MessagesRange{ .till = MaxMessagePosition, }; constexpr auto UnreadMessagePosition = MessagePosition{ - .fullId = FullMsgId(NoChannel, ShowAtUnreadMsgId), + .fullId = FullMsgId(PeerId(), ShowAtUnreadMsgId), .date = MinDate, }; @@ -117,7 +117,6 @@ public: MessagesRange noSkipRange, std::optional count); void removeOne(MessagePosition messageId); - void removeAll(ChannelId channelId); void removeLessThan(MessagePosition messageId); void invalidate(); void invalidateBottom(); @@ -191,7 +190,6 @@ public: bool applyInitial(const MessagesResult &result); bool applyUpdate(const MessagesSliceUpdate &update); bool removeOne(MessagePosition messageId); - bool removeFromChannel(ChannelId channelId); bool removeAll(); bool invalidated(); bool bottomInvalidated(); diff --git a/Telegram/SourceFiles/data/data_msg_id.h b/Telegram/SourceFiles/data/data_msg_id.h index 45d43644b..675e12572 100644 --- a/Telegram/SourceFiles/data/data_msg_id.h +++ b/Telegram/SourceFiles/data/data_msg_id.h @@ -122,9 +122,10 @@ struct MsgRange { struct FullMsgId { constexpr FullMsgId() noexcept = default; - constexpr FullMsgId(ChannelId channel, MsgId msg) noexcept - : channel(channel), msg(msg) { + constexpr FullMsgId(PeerId peer, MsgId msg) noexcept + : peer(peer), msg(msg) { } + FullMsgId(ChannelId channelId, MsgId msgId) = delete; constexpr explicit operator bool() const noexcept { return msg != 0; @@ -133,16 +134,16 @@ struct FullMsgId { return msg == 0; } - ChannelId channel = NoChannel; + PeerId peer = 0; MsgId msg = 0; }; [[nodiscard]] inline constexpr bool operator<( const FullMsgId &a, const FullMsgId &b) noexcept { - if (a.channel < b.channel) { + if (a.peer < b.peer) { return true; - } else if (a.channel > b.channel) { + } else if (a.peer > b.peer) { return false; } return a.msg < b.msg; @@ -169,7 +170,7 @@ struct FullMsgId { [[nodiscard]] inline constexpr bool operator==( const FullMsgId &a, const FullMsgId &b) noexcept { - return (a.channel == b.channel) && (a.msg == b.msg); + return (a.peer == b.peer) && (a.msg == b.msg); } [[nodiscard]] inline constexpr bool operator!=( diff --git a/Telegram/SourceFiles/data/data_peer.cpp b/Telegram/SourceFiles/data/data_peer.cpp index 4ede5f1e2..aef2abea5 100644 --- a/Telegram/SourceFiles/data/data_peer.cpp +++ b/Telegram/SourceFiles/data/data_peer.cpp @@ -1274,11 +1274,11 @@ FullMsgId ResolveTopPinnedId( .skippedAfter = 0, }; if (!slice.messageIds.empty()) { - return FullMsgId(peerToChannel(peer->id), slice.messageIds.back()); + return FullMsgId(peer->id, slice.messageIds.back()); } else if (!migrated || slice.count != 0 || old.messageIds.empty()) { return FullMsgId(); } else { - return FullMsgId(0, old.messageIds.back()); + return FullMsgId(migrated->id, old.messageIds.back()); } } @@ -1308,9 +1308,9 @@ FullMsgId ResolveMinPinnedId( .skippedAfter = 0, }; if (!old.messageIds.empty()) { - return FullMsgId(0, old.messageIds.front()); + return FullMsgId(migrated->id, old.messageIds.front()); } else if (old.count == 0 && !slice.messageIds.empty()) { - return FullMsgId(peerToChannel(peer->id), slice.messageIds.front()); + return FullMsgId(peer->id, slice.messageIds.front()); } else { return FullMsgId(); } diff --git a/Telegram/SourceFiles/data/data_peer.h b/Telegram/SourceFiles/data/data_peer.h index 65e26af05..d66510bb0 100644 --- a/Telegram/SourceFiles/data/data_peer.h +++ b/Telegram/SourceFiles/data/data_peer.h @@ -42,6 +42,8 @@ class CloudImageView; int PeerColorIndex(PeerId peerId); int PeerColorIndex(BareId bareId); style::color PeerUserpicColor(PeerId peerId); + +// Must be used only for PeerColor-s. PeerId FakePeerIdForJustName(const QString &name); class RestrictionCheckResult { diff --git a/Telegram/SourceFiles/data/data_peer_id.h b/Telegram/SourceFiles/data/data_peer_id.h index 5944173d5..c59d1f635 100644 --- a/Telegram/SourceFiles/data/data_peer_id.h +++ b/Telegram/SourceFiles/data/data_peer_id.h @@ -136,8 +136,6 @@ using ChatId = ChatIdType<1>; using ChannelId = ChatIdType<2>; using FakeChatId = ChatIdType<0x7F>; -inline constexpr auto NoChannel = ChannelId(0); - struct PeerIdHelper { BareId value = 0; constexpr PeerIdHelper(BareId value) noexcept : value(value) { diff --git a/Telegram/SourceFiles/data/data_peer_values.cpp b/Telegram/SourceFiles/data/data_peer_values.cpp index 2671c756f..c7f35925f 100644 --- a/Telegram/SourceFiles/data/data_peer_values.cpp +++ b/Telegram/SourceFiles/data/data_peer_values.cpp @@ -13,6 +13,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_chat.h" #include "data/data_user.h" #include "data/data_changes.h" +#include "data/data_session.h" +#include "data/data_message_reactions.h" #include "main/main_session.h" #include "ui/image/image_prepare.h" #include "base/unixtime.h" @@ -505,4 +507,18 @@ rpl::producer PeerUserpicImageValue( }; } +rpl::producer> PeerAllowedReactionsValue( + not_null peer) { + return rpl::combine( + rpl::single( + rpl::empty_value() + ) | rpl::then(peer->owner().reactions().updates()), + peer->session().changes().peerFlagsValue( + peer, + Data::PeerUpdate::Flag::Reactions) + ) | rpl::map([=] { + return peer->owner().reactions().list(peer); + }); +} + } // namespace Data diff --git a/Telegram/SourceFiles/data/data_peer_values.h b/Telegram/SourceFiles/data/data_peer_values.h index 31cbcb6b3..fa6a8042b 100644 --- a/Telegram/SourceFiles/data/data_peer_values.h +++ b/Telegram/SourceFiles/data/data_peer_values.h @@ -16,6 +16,8 @@ enum class ImageRoundRadius; namespace Data { +struct Reaction; + template inline auto FlagsValueWithMask( rpl::producer &&value, @@ -120,4 +122,7 @@ inline auto PeerFullFlagValue( int size, ImageRoundRadius radius); +[[nodiscard]] auto PeerAllowedReactionsValue(not_null peer) +-> rpl::producer>; + } // namespace Data diff --git a/Telegram/SourceFiles/data/data_replies_list.cpp b/Telegram/SourceFiles/data/data_replies_list.cpp index 6c41cdcc8..cec6d8893 100644 --- a/Telegram/SourceFiles/data/data_replies_list.cpp +++ b/Telegram/SourceFiles/data/data_replies_list.cpp @@ -196,10 +196,10 @@ std::optional RepliesList::fullUnreadCountAfter( || (fullLoaded && _list.empty()); const auto countIncoming = [&](auto from, auto till) { auto &owner = _history->owner(); - const auto channelId = _history->channelId(); + const auto peerId = _history->peer->id; auto count = 0; for (auto i = from; i != till; ++i) { - if (!owner.message(channelId, *i)->out()) { + if (!owner.message(peerId, *i)->out()) { ++count; } } @@ -340,7 +340,7 @@ bool RepliesList::buildFromData(not_null viewer) { = (*_skippedAfter + (availableAfter - useAfter)); } - const auto channelId = _history->channelId(); + const auto peerId = _history->peer->id; slice->ids.clear(); auto nearestToAround = std::optional(); slice->ids.reserve(useAfter + useBefore); @@ -350,10 +350,10 @@ bool RepliesList::buildFromData(not_null viewer) { ? *j : *(j - 1); } - slice->ids.emplace_back(channelId, *j); + slice->ids.emplace_back(peerId, *j); } slice->nearestToAround = FullMsgId( - channelId, + peerId, nearestToAround.value_or( slice->ids.empty() ? 0 : slice->ids.back().msg)); slice->fullCount = _fullCount.current(); @@ -422,7 +422,7 @@ Histories &RepliesList::histories() { } HistoryItem *RepliesList::lookupRoot() { - return _history->owner().message(_history->channelId(), _rootId); + return _history->owner().message(_history->peer->id, _rootId); } void RepliesList::loadAround(MsgId id) { diff --git a/Telegram/SourceFiles/data/data_scheduled_messages.cpp b/Telegram/SourceFiles/data/data_scheduled_messages.cpp index 292a332d6..fe68ac5ae 100644 --- a/Telegram/SourceFiles/data/data_scheduled_messages.cpp +++ b/Telegram/SourceFiles/data/data_scheduled_messages.cpp @@ -72,7 +72,7 @@ MTPMessage PrepareMessage(const MTPMessage &message) { MTP_int(data.vedit_date().value_or_empty()), MTP_bytes(data.vpost_author().value_or_empty()), MTP_long(data.vgrouped_id().value_or_empty()), - //MTPMessageReactions(), + MTPMessageReactions(), MTPVector(), MTP_int(data.vttl_period().value_or_empty())); }); @@ -145,7 +145,7 @@ HistoryItem *ScheduledMessages::lookupItem(PeerId peer, MsgId msg) const { } HistoryItem *ScheduledMessages::lookupItem(FullMsgId itemId) const { - return lookupItem(peerFromChannel(itemId.channel), itemId.msg); + return lookupItem(itemId.peer, itemId.msg); } int ScheduledMessages::count(not_null history) const { @@ -213,7 +213,7 @@ void ScheduledMessages::sendNowSimpleMessage( MTPint(), // edit_date MTP_string(), MTPlong(), - //MTPMessageReactions(), + MTPMessageReactions(), MTPVector(), MTP_int(update.vttl_period().value_or_empty())), localFlags, diff --git a/Telegram/SourceFiles/data/data_session.cpp b/Telegram/SourceFiles/data/data_session.cpp index aec22ee83..b807d8bcb 100644 --- a/Telegram/SourceFiles/data/data_session.cpp +++ b/Telegram/SourceFiles/data/data_session.cpp @@ -54,6 +54,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_scheduled_messages.h" #include "data/data_send_action.h" #include "data/data_sponsored_messages.h" +#include "data/data_message_reactions.h" #include "data/data_cloud_themes.h" #include "data/data_streaming.h" #include "data/data_media_rotation.h" @@ -241,7 +242,8 @@ Session::Session(not_null session) , _mediaRotation(std::make_unique()) , _histories(std::make_unique(this)) , _stickers(std::make_unique(this)) -, _sponsoredMessages(std::make_unique(this)) { +, _sponsoredMessages(std::make_unique(this)) +, _reactions(std::make_unique(this)) { _cache->open(_session->local().cacheKey()); _bigFileCache->open(_session->local().cacheBigFileKey()); @@ -271,7 +273,6 @@ Session::Session(not_null session) session->saveSettingsDelayed(); } }, _lifetime); - } void Session::clear() { @@ -285,7 +286,7 @@ void Session::clear() { _sponsoredMessages = nullptr; _dependentMessages.clear(); base::take(_messages); - base::take(_channelMessages); + base::take(_nonChannelMessages); _messageByRandomId.clear(); _sentMessagesData.clear(); cSetRecentInlineBots(RecentInlineBots()); @@ -1334,20 +1335,31 @@ rpl::producer> Session::newItemAdded() const { return _newItemAdded.events(); } -void Session::changeMessageId(ChannelId channel, MsgId wasId, MsgId nowId) { - const auto list = messagesListForInsert(channel); +void Session::changeMessageId(PeerId peerId, MsgId wasId, MsgId nowId) { + const auto list = messagesListForInsert(peerId); auto i = list->find(wasId); Assert(i != list->end()); - auto owned = std::move(i->second); + const auto item = i->second; list->erase(i); - const auto [j, ok] = list->emplace(nowId, std::move(owned)); + const auto [j, ok] = list->emplace(nowId, item); + + if (!peerIsChannel(peerId)) { + if (IsServerMsgId(wasId)) { + const auto k = _nonChannelMessages.find(wasId); + Assert(k != end(_nonChannelMessages)); + _nonChannelMessages.erase(k); + } + if (IsServerMsgId(nowId)) { + _nonChannelMessages.emplace(nowId, item); + } + } Ensures(ok); } void Session::notifyItemIdChange(IdChange event) { const auto item = event.item; - changeMessageId(item->history()->channelId(), event.oldId, item->id); + changeMessageId(item->history()->peer->id, event.oldId, item->id); _itemIdChanges.fire_copy(event); @@ -1437,6 +1449,14 @@ rpl::producer> Session::itemViewRefreshRequest() const { return _itemViewRefreshRequest.events(); } +void Session::notifyItemDataChange(not_null item) { + _itemDataChanges.fire_copy(item); +} + +rpl::producer> Session::itemDataChanges() const { + return _itemDataChanges.events(); +} + void Session::requestItemTextRefresh(not_null item) { if (const auto i = _views.find(item); i != _views.end()) { for (const auto view : i->second) { @@ -1576,6 +1596,25 @@ void Session::unloadHeavyViewParts( } } +void Session::registerShownSpoiler(FullMsgId id) { + if (const auto item = message(id)) { + _shownSpoilers.emplace(item); + } +} + +void Session::unregisterShownSpoiler(FullMsgId id) { + if (const auto item = message(id)) { + _shownSpoilers.remove(item); + } +} + +void Session::hideShownSpoilers() { + for (const auto &item : _shownSpoilers) { + item->hideSpoilers(); + } + _shownSpoilers = base::flat_set>(); +} + void Session::removeMegagroupParticipant( not_null channel, not_null user) { @@ -1798,9 +1837,9 @@ void Session::reorderTwoPinnedChats( notifyPinnedDialogsOrderUpdated(); } -bool Session::checkEntitiesAndViewsUpdate(const MTPDmessage &data) { +bool Session::updateExistingMessage(const MTPDmessage &data) { const auto peer = peerFromMTP(data.vpeer_id()); - const auto existing = message(peerToChannel(peer), data.vid().v); + const auto existing = message(peer, data.vid().v); if (!existing) { return false; } @@ -1820,14 +1859,13 @@ void Session::updateEditedMessage(const MTPMessage &data) { -> HistoryItem* { return nullptr; }, [&](const auto &data) { - const auto peer = peerFromMTP(data.vpeer_id()); - return message(peerToChannel(peer), data.vid().v); + return message(peerFromMTP(data.vpeer_id()), data.vid().v); }); if (!existing) { return; } if (existing->isLocalUpdateMedia() && data.type() == mtpc_message) { - checkEntitiesAndViewsUpdate(data.c_message()); + updateExistingMessage(data.c_message()); } data.match([](const MTPDmessageEmpty &) { }, [&](const MTPDmessageService &data) { @@ -1847,7 +1885,7 @@ void Session::processMessages( const auto &data = message.c_message(); // new message, index my forwarded messages to links overview if ((type == NewMessageType::Unread) - && checkEntitiesAndViewsUpdate(data)) { + && updateExistingMessage(data)) { continue; } } @@ -1888,23 +1926,19 @@ void Session::processExistingMessages( }); } -const Session::Messages *Session::messagesList(ChannelId channelId) const { - if (channelId == NoChannel) { - return &_messages; - } - const auto i = _channelMessages.find(channelId); - return (i != end(_channelMessages)) ? &i->second : nullptr; +const Session::Messages *Session::messagesList(PeerId peerId) const { + const auto i = _messages.find(peerId); + return (i != end(_messages)) ? &i->second : nullptr; } -auto Session::messagesListForInsert(ChannelId channelId) +auto Session::messagesListForInsert(PeerId peerId) -> not_null { - return (channelId == NoChannel) - ? &_messages - : &_channelMessages[channelId]; + return &_messages[peerId]; } void Session::registerMessage(not_null item) { - const auto list = messagesListForInsert(item->channelId()); + const auto peerId = item->history()->peer->id; + const auto list = messagesListForInsert(peerId); const auto itemId = item->id; const auto i = list->find(itemId); if (i != list->end()) { @@ -1912,6 +1946,10 @@ void Session::registerMessage(not_null item) { i->second->destroy(); } list->emplace(itemId, item); + + if (!peerIsChannel(peerId) && IsServerMsgId(itemId)) { + _nonChannelMessages.emplace(itemId, item); + } } void Session::registerMessageTTL(TimeId when, not_null item) { @@ -1966,12 +2004,10 @@ void Session::checkTTLs() { } void Session::processMessagesDeleted( - ChannelId channelId, + PeerId peerId, const QVector &data) { - const auto list = messagesList(channelId); - const auto affected = (channelId != NoChannel) - ? historyLoaded(peerFromChannel(channelId)) - : nullptr; + const auto list = messagesList(peerId); + const auto affected = historyLoaded(peerId); if (!list && !affected) { return; } @@ -1994,6 +2030,22 @@ void Session::processMessagesDeleted( } } +void Session::processNonChannelMessagesDeleted(const QVector &data) { + auto historiesToCheck = base::flat_set>(); + for (const auto &messageId : data) { + if (const auto item = nonChannelMessage(messageId.v)) { + const auto history = item->history(); + item->destroy(); + if (!history->chatListMessageKnown()) { + historiesToCheck.emplace(history); + } + } + } + for (const auto &history : historiesToCheck) { + history->requestChatListMessage(); + } +} + void Session::removeDependencyMessage(not_null item) { const auto i = _dependentMessages.find(item); if (i == end(_dependentMessages)) { @@ -2009,13 +2061,19 @@ void Session::removeDependencyMessage(not_null item) { void Session::unregisterMessage(not_null item) { const auto peerId = item->history()->peer->id; + const auto itemId = item->id; + _shownSpoilers.remove(item); _itemRemoved.fire_copy(item); session().changes().messageUpdated( item, Data::MessageUpdate::Flag::Destroyed); groups().unregisterMessage(item); removeDependencyMessage(item); - messagesListForInsert(peerToChannel(peerId))->erase(item->id); + messagesListForInsert(peerId)->erase(itemId); + + if (!peerIsChannel(peerId) && IsServerMsgId(itemId)) { + _nonChannelMessages.erase(itemId); + } } MsgId Session::nextLocalMessageId() { @@ -2038,12 +2096,12 @@ bool Session::suggestToGigagroup(not_null group) const { return _suggestToGigagroup.contains(group); } -HistoryItem *Session::message(ChannelId channelId, MsgId itemId) const { +HistoryItem *Session::message(PeerId peerId, MsgId itemId) const { if (!itemId) { return nullptr; } - const auto data = messagesList(channelId); + const auto data = messagesList(peerId); if (!data) { return nullptr; } @@ -2053,13 +2111,21 @@ HistoryItem *Session::message(ChannelId channelId, MsgId itemId) const { } HistoryItem *Session::message( - const ChannelData *channel, + not_null peer, MsgId itemId) const { - return message(channel ? peerToChannel(channel->id) : 0, itemId); + return message(peer->id, itemId); } HistoryItem *Session::message(FullMsgId itemId) const { - return message(itemId.channel, itemId.msg); + return message(itemId.peer, itemId.msg); +} + +HistoryItem *Session::nonChannelMessage(MsgId itemId) const { + if (!IsServerMsgId(itemId)) { + return nullptr; + } + const auto i = _nonChannelMessages.find(itemId); + return (i != end(_nonChannelMessages)) ? i->second.get() : nullptr; } void Session::updateDependentMessages(not_null item) { @@ -4012,7 +4078,7 @@ void Session::insertCheckedServiceNotification( MTPint(), // edit_date MTPstring(), MTPlong(), - //MTPMessageReactions(), + MTPMessageReactions(), MTPVector(), MTPint()), // ttl_period localFlags, diff --git a/Telegram/SourceFiles/data/data_session.h b/Telegram/SourceFiles/data/data_session.h index 27bd7cb9f..fb1bc7f80 100644 --- a/Telegram/SourceFiles/data/data_session.h +++ b/Telegram/SourceFiles/data/data_session.h @@ -52,6 +52,7 @@ class WallPaper; class ScheduledMessages; class SendActionManager; class SponsoredMessages; +class Reactions; class ChatFilters; class CloudThemes; class Streaming; @@ -113,6 +114,10 @@ public: [[nodiscard]] SponsoredMessages &sponsoredMessages() const { return *_sponsoredMessages; } + [[nodiscard]] Reactions &reactions() const { + return *_reactions; + } + [[nodiscard]] MsgId nextNonHistoryEntryId() { return ++_nonHistoryEntryId; } @@ -251,6 +256,8 @@ public: [[nodiscard]] rpl::producer> animationPlayInlineRequest() const; void notifyHistoryUnloaded(not_null history); [[nodiscard]] rpl::producer> historyUnloaded() const; + void notifyItemDataChange(not_null item); + [[nodiscard]] rpl::producer> itemDataChanges() const; [[nodiscard]] rpl::producer> itemRemoved() const; [[nodiscard]] rpl::producer> itemRemoved( @@ -275,6 +282,10 @@ public: int from, int till); + void registerShownSpoiler(FullMsgId id); + void unregisterShownSpoiler(FullMsgId id); + void hideShownSpoilers(); + using MegagroupParticipant = std::tuple< not_null, not_null>; @@ -337,7 +348,7 @@ public: void unregisterMessageTTL(TimeId when, not_null item); // Returns true if item found and it is not detached. - bool checkEntitiesAndViewsUpdate(const MTPDmessage &data); + bool updateExistingMessage(const MTPDmessage &data); void updateEditedMessage(const MTPMessage &data); void processMessages( const QVector &data, @@ -348,19 +359,22 @@ public: void processExistingMessages( ChannelData *channel, const MTPmessages_Messages &data); + void processNonChannelMessagesDeleted(const QVector &data); void processMessagesDeleted( - ChannelId channelId, + PeerId peerId, const QVector &data); [[nodiscard]] MsgId nextLocalMessageId(); [[nodiscard]] HistoryItem *message( - ChannelId channelId, + PeerId peerId, MsgId itemId) const; [[nodiscard]] HistoryItem *message( - const ChannelData *channel, + not_null peer, MsgId itemId) const; [[nodiscard]] HistoryItem *message(FullMsgId itemId) const; + [[nodiscard]] HistoryItem *nonChannelMessage(MsgId itemId) const; + void updateDependentMessages(not_null item); void registerDependentMessage( not_null dependent, @@ -698,11 +712,11 @@ private: Data::Folder *requestFolder, const MTPDdialogFolder &data); - const Messages *messagesList(ChannelId channelId) const; - not_null messagesListForInsert(ChannelId channelId); + const Messages *messagesList(PeerId peerId) const; + not_null messagesListForInsert(PeerId peerId); not_null registerMessage( std::unique_ptr item); - void changeMessageId(ChannelId channel, MsgId wasId, MsgId nowId); + void changeMessageId(PeerId peerId, MsgId wasId, MsgId nowId); void removeDependencyMessage(not_null item); void photoApplyFields( @@ -829,6 +843,7 @@ private: rpl::event_stream> _viewResizeRequest; rpl::event_stream> _itemViewRefreshRequest; rpl::event_stream> _itemTextRefreshRequest; + rpl::event_stream> _itemDataChanges; rpl::event_stream> _animationPlayInlineRequest; rpl::event_stream> _itemRemoved; rpl::event_stream> _viewRemoved; @@ -848,14 +863,15 @@ private: Dialogs::IndexedList _contactsNoChatsList; MsgId _localMessageIdCounter = StartClientMsgId; - Messages _messages; - std::map _channelMessages; + std::unordered_map _messages; std::map< not_null, base::flat_set>> _dependentMessages; std::map>> _ttlMessages; base::Timer _ttlCheckTimer; + std::unordered_map> _nonChannelMessages; + base::flat_map _messageByRandomId; base::flat_map _sentMessagesData; @@ -931,6 +947,8 @@ private: rpl::event_stream _invitesToCalls; base::flat_map>> _invitedToCallUsers; + base::flat_set> _shownSpoilers; + History *_topPromoted = nullptr; NotifySettings _defaultUserNotifySettings; @@ -955,15 +973,17 @@ private: uint64 _wallpapersHash = 0; Groups _groups; - std::unique_ptr _chatsFilters; + const std::unique_ptr _chatsFilters; std::unique_ptr _scheduledMessages; - std::unique_ptr _cloudThemes; - std::unique_ptr _sendActionManager; - std::unique_ptr _streaming; - std::unique_ptr _mediaRotation; - std::unique_ptr _histories; - std::unique_ptr _stickers; + const std::unique_ptr _cloudThemes; + const std::unique_ptr _sendActionManager; + const std::unique_ptr _streaming; + const std::unique_ptr _mediaRotation; + const std::unique_ptr _histories; + const std::unique_ptr _stickers; std::unique_ptr _sponsoredMessages; + const std::unique_ptr _reactions; + MsgId _nonHistoryEntryId = ServerMaxMsgId; rpl::lifetime _lifetime; diff --git a/Telegram/SourceFiles/data/data_shared_media.cpp b/Telegram/SourceFiles/data/data_shared_media.cpp index 6f584ecbb..87851c62f 100644 --- a/Telegram/SourceFiles/data/data_shared_media.cpp +++ b/Telegram/SourceFiles/data/data_shared_media.cpp @@ -365,7 +365,7 @@ std::optional SharedMediaWithLastSlice::indexOf(Value value) const { ? QString::number(*_ending->skippedAfter()) : QString("-")); if (const auto msgId = std::get_if(&value)) { - info.push_back("value:" + QString::number(msgId->channel.bare)); + info.push_back("value:" + QString::number(msgId->peer.value)); info.push_back(QString::number(msgId->msg.bare)); const auto index = _slice.indexOf(*std::get_if(&value)); info.push_back("index:" + (index diff --git a/Telegram/SourceFiles/data/data_shared_media.h b/Telegram/SourceFiles/data/data_shared_media.h index 393aab5ff..445dc2e2e 100644 --- a/Telegram/SourceFiles/data/data_shared_media.h +++ b/Telegram/SourceFiles/data/data_shared_media.h @@ -164,7 +164,7 @@ private: return (a && b) ? base::make_optional(*a + *b) : std::nullopt; } static Value ComputeId(PeerId peerId, MsgId msgId) { - return FullMsgId(peerToChannel(peerId), msgId); + return FullMsgId(peerId, msgId); } static Value ComputeId(const Key &key) { if (const auto messageId = std::get_if(&key.universalId)) { diff --git a/Telegram/SourceFiles/data/data_sparse_ids.h b/Telegram/SourceFiles/data/data_sparse_ids.h index 1fb2b5fad..e949b80c1 100644 --- a/Telegram/SourceFiles/data/data_sparse_ids.h +++ b/Telegram/SourceFiles/data/data_sparse_ids.h @@ -100,12 +100,10 @@ private: } static bool IsFromSlice(PeerId peerId, FullMsgId fullId) { - return peerIsChannel(peerId) - ? (peerId == peerFromChannel(fullId.channel)) - : !fullId.channel; + return (peerId == fullId.peer); } static FullMsgId ComputeId(PeerId peerId, MsgId msgId) { - return FullMsgId(peerToChannel(peerId), msgId); + return FullMsgId(peerId, msgId); } static FullMsgId ComputeId(const Key &key) { return (key.universalId >= 0) diff --git a/Telegram/SourceFiles/data/data_sponsored_messages.cpp b/Telegram/SourceFiles/data/data_sponsored_messages.cpp index 155dc5f90..66adb4d0f 100644 --- a/Telegram/SourceFiles/data/data_sponsored_messages.cpp +++ b/Telegram/SourceFiles/data/data_sponsored_messages.cpp @@ -10,6 +10,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "api/api_text_entities.h" #include "apiwrap.h" #include "base/unixtime.h" +#include "data/data_user.h" #include "data/data_channel.h" #include "data/data_peer_id.h" #include "data/data_session.h" @@ -71,29 +72,16 @@ bool SponsoredMessages::append(not_null history) { return false; } - const auto flags = MessageFlags(0) - | (history->isChannel() ? MessageFlag::Post : MessageFlags(0)) - | MessageFlag::HasFromId - | MessageFlag::IsSponsored - | MessageFlag::Local; - auto local = history->addNewLocalMessage( + entryIt->item.reset(history->addNewLocalMessage( _session->data().nextLocalMessageId(), - flags, - UserId(0), - MsgId(0), - HistoryItem::NewMessageDate(0), - entryIt->sponsored.fromId, - QString(), - entryIt->sponsored.textWithEntities, - MTP_messageMediaEmpty(), - HistoryMessageMarkupData()); - entryIt->item.reset(std::move(local)); + entryIt->sponsored.from, + entryIt->sponsored.textWithEntities)); return true; } bool SponsoredMessages::canHaveFor(not_null history) const { - return history->isChannel(); + return history->peer->isChannel(); } void SponsoredMessages::request(not_null history) { @@ -157,22 +145,70 @@ void SponsoredMessages::append( not_null history, List &list, const MTPSponsoredMessage &message) { - message.match([&](const MTPDsponsoredMessage &data) { - const auto randomId = data.vrandom_id().v; - auto sharedMessage = SponsoredMessage{ - .randomId = randomId, - .fromId = peerFromMTP(data.vfrom_id()), - .textWithEntities = { - .text = qs(data.vmessage()), - .entities = Api::EntitiesFromMTP( - _session, - data.ventities().value_or_empty()), - }, - .history = history, - .msgId = data.vchannel_post().value_or_empty(), - }; - list.entries.push_back({ nullptr, std::move(sharedMessage) }); + const auto &data = message.match([]( + const auto &data) -> const MTPDsponsoredMessage& { + return data; }); + const auto randomId = data.vrandom_id().v; + const auto hash = qs(data.vchat_invite_hash().value_or_empty()); + const auto makeFrom = []( + not_null peer, + bool exactPost = false) { + const auto channel = peer->asChannel(); + return SponsoredFrom{ + .peer = peer, + .title = peer->name, + .isBroadcast = (channel && channel->isBroadcast()), + .isMegagroup = (channel && channel->isMegagroup()), + .isChannel = (channel != nullptr), + .isPublic = (channel && channel->isPublic()), + .isBot = (peer->isUser() && peer->asUser()->isBot()), + .isExactPost = exactPost, + }; + }; + const auto from = [&]() -> SponsoredFrom { + if (data.vfrom_id()) { + return makeFrom( + _session->data().peer(peerFromMTP(*data.vfrom_id())), + (data.vchannel_post() != nullptr)); + } + Assert(data.vchat_invite()); + return data.vchat_invite()->match([](const MTPDchatInvite &data) { + return SponsoredFrom{ + .title = qs(data.vtitle()), + .isBroadcast = data.is_broadcast(), + .isMegagroup = data.is_megagroup(), + .isChannel = data.is_channel(), + .isPublic = data.is_public(), + }; + }, [&](const MTPDchatInviteAlready &data) { + const auto chat = _session->data().processChat(data.vchat()); + if (const auto channel = chat->asChannel()) { + channel->clearInvitePeek(); + } + return makeFrom(chat); + }, [&](const MTPDchatInvitePeek &data) { + const auto chat = _session->data().processChat(data.vchat()); + if (const auto channel = chat->asChannel()) { + channel->setInvitePeek(hash, data.vexpires().v); + } + return makeFrom(chat); + }); + }(); + auto sharedMessage = SponsoredMessage{ + .randomId = randomId, + .from = from, + .textWithEntities = { + .text = qs(data.vmessage()), + .entities = Api::EntitiesFromMTP( + _session, + data.ventities().value_or_empty()), + }, + .history = history, + .msgId = data.vchannel_post().value_or_empty(), + .chatInviteHash = hash, + }; + list.entries.push_back({ nullptr, std::move(sharedMessage) }); } void SponsoredMessages::clearItems(not_null history) { @@ -189,11 +225,10 @@ void SponsoredMessages::clearItems(not_null history) { const SponsoredMessages::Entry *SponsoredMessages::find( const FullMsgId &fullId) const { - if (!fullId.channel) { + if (!peerIsChannel(fullId.peer)) { return nullptr; } - const auto history = _session->data().history( - peerFromChannel(fullId.channel)); + const auto history = _session->data().history(fullId.peer); const auto it = _data.find(history); if (it == end(_data)) { return nullptr; @@ -233,13 +268,18 @@ void SponsoredMessages::view(const FullMsgId &fullId) { }).send(); } -MsgId SponsoredMessages::channelPost(const FullMsgId &fullId) const { +SponsoredMessages::Details SponsoredMessages::lookupDetails( + const FullMsgId &fullId) const { const auto entryPtr = find(fullId); if (!entryPtr) { - return ShowAtUnreadMsgId; + return {}; } - const auto msgId = entryPtr->sponsored.msgId; - return msgId ? msgId : ShowAtUnreadMsgId; + const auto &hash = entryPtr->sponsored.chatInviteHash; + return { + .hash = hash.isEmpty() ? std::nullopt : std::make_optional(hash), + .peer = entryPtr->sponsored.from.peer, + .msgId = entryPtr->sponsored.msgId, + }; } } // namespace Data diff --git a/Telegram/SourceFiles/data/data_sponsored_messages.h b/Telegram/SourceFiles/data/data_sponsored_messages.h index ab779190a..eaa980661 100644 --- a/Telegram/SourceFiles/data/data_sponsored_messages.h +++ b/Telegram/SourceFiles/data/data_sponsored_messages.h @@ -20,16 +20,33 @@ namespace Data { class Session; -struct SponsoredMessage final { +struct SponsoredFrom { + PeerData *peer = nullptr; + QString title; + bool isBroadcast = false; + bool isMegagroup = false; + bool isChannel = false; + bool isPublic = false; + bool isBot = false; + bool isExactPost = false; +}; + +struct SponsoredMessage { QByteArray randomId; - PeerId fromId; + SponsoredFrom from; TextWithEntities textWithEntities; History *history = nullptr; MsgId msgId; + QString chatInviteHash; }; class SponsoredMessages final { public: + struct Details { + std::optional hash; + PeerData *peer = nullptr; + MsgId msgId; + }; using RandomId = QByteArray; explicit SponsoredMessages(not_null owner); SponsoredMessages(const SponsoredMessages &other) = delete; @@ -40,7 +57,7 @@ public: void request(not_null history); [[nodiscard]] bool append(not_null history); void clearItems(not_null history); - [[nodiscard]] MsgId channelPost(const FullMsgId &fullId) const; + [[nodiscard]] Details lookupDetails(const FullMsgId &fullId) const; void view(const FullMsgId &fullId); diff --git a/Telegram/SourceFiles/data/data_types.h b/Telegram/SourceFiles/data/data_types.h index 1bb5f0db6..77e42ae9a 100644 --- a/Telegram/SourceFiles/data/data_types.h +++ b/Telegram/SourceFiles/data/data_types.h @@ -227,7 +227,7 @@ enum class MessageFlag : uint32 { HasPostAuthor = (1U << 4), HasViews = (1U << 5), HasReplyInfo = (1U << 6), - HasViaBot = (1U << 7), + CanViewReactions = (1U << 7), AdminLogEntry = (1U << 8), Post = (1U << 9), Silent = (1U << 10), @@ -280,9 +280,6 @@ enum class MessageFlag : uint32 { // Contact sign-up message, notification should be skipped for Silent. IsContactSignUp = (1U << 30), - - // In channels. - IsSponsored = (1U << 31), }; inline constexpr bool is_flag_type(MessageFlag) { return true; } using MessageFlags = base::flags; diff --git a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp index edcbf5afe..fe03460a3 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp @@ -52,10 +52,11 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/unread_badge.h" #include "boxes/filters/edit_filter_box.h" #include "api/api_chat_filters.h" +#include "base/qt_adapters.h" #include "styles/style_dialogs.h" #include "styles/style_chat_helpers.h" #include "styles/style_window.h" -#include "base/qt_adapters.h" +#include "styles/style_menu_icons.h" namespace Dialogs { namespace { @@ -710,7 +711,7 @@ bool InnerWidget::isSearchResultActive( const auto peer = item->history()->peer; return (item->fullId() == entry.fullId) || (peer->migrateTo() - && (peerToChannel(peer->migrateTo()->id) == entry.fullId.channel) + && (peer->migrateTo()->id == entry.fullId.peer) && (item->id == -entry.fullId.msg)) || (uniqueSearchResults() && peer == entry.key.peer()); } @@ -1585,7 +1586,7 @@ void InnerWidget::updateDialogRow( if (const auto migrated = from->owner().historyLoaded(from)) { row = RowDescriptor( migrated, - FullMsgId(0, -row.fullId.msg)); + FullMsgId(from->id, -row.fullId.msg)); } } } @@ -1793,7 +1794,9 @@ void InnerWidget::contextMenuEvent(QContextMenuEvent *e) { mousePressReleased(e->globalPos(), _pressButton); } - _menu = base::make_unique_q(this); + _menu = base::make_unique_q( + this, + row.fullId ? st::defaultPopupMenu : st::popupMenuWithIcons); if (row.fullId) { if (session().supportMode()) { fillSupportSearchMenu(_menu.get()); @@ -1808,8 +1811,11 @@ void InnerWidget::contextMenuEvent(QContextMenuEvent *e) { .section = Dialogs::EntryState::Section::ChatsList, .filterId = _filterId, }, - [&](const QString &text, Fn callback) { - return _menu->addAction(text, std::move(callback)); + [&]( + const QString &text, + Fn callback, + const style::icon *icon) { + return _menu->addAction(text, std::move(callback), icon); }); } connect(_menu.get(), &QObject::destroyed, [=] { @@ -2745,7 +2751,7 @@ RowDescriptor InnerWidget::chatListEntryBefore( if (i != list->cbegin()) { return RowDescriptor( (*(i - 1))->key(), - FullMsgId(NoChannel, ShowAtUnreadMsgId)); + FullMsgId(PeerId(), ShowAtUnreadMsgId)); } } return RowDescriptor(); @@ -2771,11 +2777,11 @@ RowDescriptor InnerWidget::chatListEntryBefore( } return RowDescriptor( _filterResults.back()->key(), - FullMsgId(NoChannel, ShowAtUnreadMsgId)); + FullMsgId(PeerId(), ShowAtUnreadMsgId)); } return RowDescriptor( session().data().history(_peerSearchResults.back()->peer), - FullMsgId(NoChannel, ShowAtUnreadMsgId)); + FullMsgId(PeerId(), ShowAtUnreadMsgId)); } } if (!_peerSearchResults.empty() @@ -2785,14 +2791,14 @@ RowDescriptor InnerWidget::chatListEntryBefore( } return RowDescriptor( _filterResults.back()->key(), - FullMsgId(NoChannel, ShowAtUnreadMsgId)); + FullMsgId(PeerId(), ShowAtUnreadMsgId)); } if (!_peerSearchResults.empty()) { for (auto b = _peerSearchResults.cbegin(), i = b + 1, e = _peerSearchResults.cend(); i != e; ++i) { if ((*i)->peer == whichHistory->peer) { return RowDescriptor( session().data().history((*(i - 1))->peer), - FullMsgId(NoChannel, ShowAtUnreadMsgId)); + FullMsgId(PeerId(), ShowAtUnreadMsgId)); } } } @@ -2804,7 +2810,7 @@ RowDescriptor InnerWidget::chatListEntryBefore( if ((*i)->key() == which.key) { return RowDescriptor( (*(i - 1))->key(), - FullMsgId(NoChannel, ShowAtUnreadMsgId)); + FullMsgId(PeerId(), ShowAtUnreadMsgId)); } } return RowDescriptor(); @@ -2822,7 +2828,7 @@ RowDescriptor InnerWidget::chatListEntryAfter( if (i != list->cend()) { return RowDescriptor( (*i)->key(), - FullMsgId(NoChannel, ShowAtUnreadMsgId)); + FullMsgId(PeerId(), ShowAtUnreadMsgId)); } } return RowDescriptor(); @@ -2848,7 +2854,7 @@ RowDescriptor InnerWidget::chatListEntryAfter( if (i != e) { return RowDescriptor( session().data().history((*i)->peer), - FullMsgId(NoChannel, ShowAtUnreadMsgId)); + FullMsgId(PeerId(), ShowAtUnreadMsgId)); } else if (!_searchResults.empty()) { return RowDescriptor( _searchResults.front()->item()->history(), @@ -2863,11 +2869,11 @@ RowDescriptor InnerWidget::chatListEntryAfter( if (i != e) { return RowDescriptor( (*i)->key(), - FullMsgId(NoChannel, ShowAtUnreadMsgId)); + FullMsgId(PeerId(), ShowAtUnreadMsgId)); } else if (!_peerSearchResults.empty()) { return RowDescriptor( session().data().history(_peerSearchResults.front()->peer), - FullMsgId(NoChannel, ShowAtUnreadMsgId)); + FullMsgId(PeerId(), ShowAtUnreadMsgId)); } else if (!_searchResults.empty()) { return RowDescriptor( _searchResults.front()->item()->history(), @@ -2886,17 +2892,17 @@ RowDescriptor InnerWidget::chatListEntryFirst() const { if (i != list->cend()) { return RowDescriptor( (*i)->key(), - FullMsgId(NoChannel, ShowAtUnreadMsgId)); + FullMsgId(PeerId(), ShowAtUnreadMsgId)); } return RowDescriptor(); } else if (!_filterResults.empty()) { return RowDescriptor( _filterResults.front()->key(), - FullMsgId(NoChannel, ShowAtUnreadMsgId)); + FullMsgId(PeerId(), ShowAtUnreadMsgId)); } else if (!_peerSearchResults.empty()) { return RowDescriptor( session().data().history(_peerSearchResults.front()->peer), - FullMsgId(NoChannel, ShowAtUnreadMsgId)); + FullMsgId(PeerId(), ShowAtUnreadMsgId)); } else if (!_searchResults.empty()) { return RowDescriptor( _searchResults.front()->item()->history(), @@ -2912,7 +2918,7 @@ RowDescriptor InnerWidget::chatListEntryLast() const { if (i != list->cbegin()) { return RowDescriptor( (*(i - 1))->key(), - FullMsgId(NoChannel, ShowAtUnreadMsgId)); + FullMsgId(PeerId(), ShowAtUnreadMsgId)); } return RowDescriptor(); } else if (!_searchResults.empty()) { @@ -2922,11 +2928,11 @@ RowDescriptor InnerWidget::chatListEntryLast() const { } else if (!_peerSearchResults.empty()) { return RowDescriptor( session().data().history(_peerSearchResults.back()->peer), - FullMsgId(NoChannel, ShowAtUnreadMsgId)); + FullMsgId(PeerId(), ShowAtUnreadMsgId)); } else if (!_filterResults.empty()) { return RowDescriptor( _filterResults.back()->key(), - FullMsgId(NoChannel, ShowAtUnreadMsgId)); + FullMsgId(PeerId(), ShowAtUnreadMsgId)); } return RowDescriptor(); } diff --git a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp index 85eef3638..189b23803 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp @@ -595,6 +595,7 @@ void Widget::checkUpdateStatus() { Core::checkReadyUpdate(); App::restart(); }); + _connecting->raise(); } else { if (!_updateTelegram) return; _updateTelegram.destroy(); diff --git a/Telegram/SourceFiles/dialogs/ui/dialogs_layout.cpp b/Telegram/SourceFiles/dialogs/ui/dialogs_layout.cpp index 1c1b84606..577671c77 100644 --- a/Telegram/SourceFiles/dialogs/ui/dialogs_layout.cpp +++ b/Telegram/SourceFiles/dialogs/ui/dialogs_layout.cpp @@ -22,6 +22,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "support/support_helper.h" #include "main/main_session.h" #include "history/view/history_view_send_action.h" +#include "history/view/history_view_item_preview.h" #include "history/history_item_components.h" #include "history/history_item.h" #include "history/history.h" diff --git a/Telegram/SourceFiles/dialogs/ui/dialogs_message_view.cpp b/Telegram/SourceFiles/dialogs/ui/dialogs_message_view.cpp index c451f51b5..06c9998c4 100644 --- a/Telegram/SourceFiles/dialogs/ui/dialogs_message_view.cpp +++ b/Telegram/SourceFiles/dialogs/ui/dialogs_message_view.cpp @@ -9,6 +9,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "history/history.h" #include "history/history_item.h" +#include "history/view/history_view_item_preview.h" #include "main/main_session.h" #include "ui/text/text_options.h" #include "ui/image/image.h" diff --git a/Telegram/SourceFiles/editor/editor.style b/Telegram/SourceFiles/editor/editor.style index 262ffa356..9190b9a29 100644 --- a/Telegram/SourceFiles/editor/editor.style +++ b/Telegram/SourceFiles/editor/editor.style @@ -72,10 +72,10 @@ photoEditorRedoButton: IconButton(photoEditorRotateButton) { } photoEditorStickersButton: IconButton(photoEditorRotateButton) { - icon: icon {{ "settings_stickers", photoEditorButtonIconFg }}; - iconOver: icon {{ "settings_stickers", photoEditorButtonIconFgOver }}; + icon: icon {{ "settings/settings_stickers", photoEditorButtonIconFg }}; + iconOver: icon {{ "settings/settings_stickers", photoEditorButtonIconFgOver }}; } -photoEditorStickersIconActive: icon {{ "settings_stickers", photoEditorButtonIconFgActive }}; +photoEditorStickersIconActive: icon {{ "settings/settings_stickers", photoEditorButtonIconFgActive }}; photoEditorUndoButtonInactive: icon {{ "photo_editor/undo", photoEditorButtonIconFgInactive }}; photoEditorRedoButtonInactive: icon {{ "photo_editor/undo-flip_horizontal", photoEditorButtonIconFgInactive }}; diff --git a/Telegram/SourceFiles/editor/scene/scene_item_base.cpp b/Telegram/SourceFiles/editor/scene/scene_item_base.cpp index 0e7484ea5..f4c7d5df0 100644 --- a/Telegram/SourceFiles/editor/scene/scene_item_base.cpp +++ b/Telegram/SourceFiles/editor/scene/scene_item_base.cpp @@ -11,6 +11,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "lang/lang_keys.h" #include "ui/widgets/popup_menu.h" #include "styles/style_editor.h" +#include "styles/style_menu_icons.h" #include #include @@ -195,26 +196,35 @@ void ItemBase::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) { const auto add = [&]( auto base, const QKeySequence &sequence, - Fn callback) { + Fn callback, + const style::icon *icon) { // TODO: refactor. const auto sequenceText = QChar('\t') + sequence.toString(QKeySequence::NativeText); - _menu->addAction(base(tr::now) + sequenceText, std::move(callback)); + _menu->addAction( + base(tr::now) + sequenceText, + std::move(callback), + icon); }; - _menu = base::make_unique_q(nullptr); + _menu = base::make_unique_q( + nullptr, + st::popupMenuWithIcons); add( tr::lng_photo_editor_menu_delete, kDeleteSequence, - [=] { actionDelete(); }); + [=] { actionDelete(); }, + &st::menuIconDelete); add( tr::lng_photo_editor_menu_flip, kFlipSequence, - [=] { actionFlip(); }); + [=] { actionFlip(); }, + &st::menuIconFlip); add( tr::lng_photo_editor_menu_duplicate, kDuplicateSequence, - [=] { actionDuplicate(); }); + [=] { actionDuplicate(); }, + &st::menuIconCopy); _menu->popup(event->screenPos()); } diff --git a/Telegram/SourceFiles/export/data/export_data_types.cpp b/Telegram/SourceFiles/export/data/export_data_types.cpp index 2048feb41..4a0a9b361 100644 --- a/Telegram/SourceFiles/export/data/export_data_types.cpp +++ b/Telegram/SourceFiles/export/data/export_data_types.cpp @@ -153,7 +153,8 @@ std::vector ParseText( [](const MTPDmessageEntityStrike&) { return Type::Strike; }, [](const MTPDmessageEntityBlockquote&) { return Type::Blockquote; }, - [](const MTPDmessageEntityBankCard&) { return Type::BankCard; }); + [](const MTPDmessageEntityBankCard&) { return Type::BankCard; }, + [](const MTPDmessageEntitySpoiler&) { return Type::Spoiler; }); part.text = mid(start, length); part.additional = entity.match( [](const MTPDmessageEntityPre &data) { diff --git a/Telegram/SourceFiles/export/data/export_data_types.h b/Telegram/SourceFiles/export/data/export_data_types.h index 495446814..c0871f2a8 100644 --- a/Telegram/SourceFiles/export/data/export_data_types.h +++ b/Telegram/SourceFiles/export/data/export_data_types.h @@ -541,6 +541,7 @@ struct TextPart { Strike, Blockquote, BankCard, + Spoiler, }; Type type = Type::Text; Utf8String text; diff --git a/Telegram/SourceFiles/export/output/export_output_html.cpp b/Telegram/SourceFiles/export/output/export_output_html.cpp index 0f8c31a89..d9408c229 100644 --- a/Telegram/SourceFiles/export/output/export_output_html.cpp +++ b/Telegram/SourceFiles/export/output/export_output_html.cpp @@ -270,6 +270,10 @@ QByteArray FormatText( return "
" + text + "
"; case Type::BankCard: return text; + case Type::Spoiler: return "" + "" + + text + ""; } Unexpected("Type in text entities serialization."); }) | ranges::to_vector); diff --git a/Telegram/SourceFiles/export/output/export_output_json.cpp b/Telegram/SourceFiles/export/output/export_output_json.cpp index 907dbeafc..b0240b9b0 100644 --- a/Telegram/SourceFiles/export/output/export_output_json.cpp +++ b/Telegram/SourceFiles/export/output/export_output_json.cpp @@ -176,6 +176,7 @@ QByteArray SerializeText( case Type::Strike: return "strikethrough"; case Type::Blockquote: return "blockquote"; case Type::BankCard: return "bank_card"; + case Type::Spoiler: return "spoiler"; } Unexpected("Type in SerializeText."); }(); diff --git a/Telegram/SourceFiles/export/view/export_view_top_bar.cpp b/Telegram/SourceFiles/export/view/export_view_top_bar.cpp index 6294b699c..aabde67d9 100644 --- a/Telegram/SourceFiles/export/view/export_view_top_bar.cpp +++ b/Telegram/SourceFiles/export/view/export_view_top_bar.cpp @@ -39,14 +39,13 @@ void TopBar::updateData(Content &&content) { return; } const auto &row = content.rows[0]; - const auto clean = &TextUtilities::Clean; _info->setRichText(textcmdStartSemibold() - + clean(tr::lng_export_progress_title(tr::now)) + + TextUtilities::Clean(tr::lng_export_progress_title(tr::now)) + textcmdStopSemibold() + QString::fromUtf8(" \xe2\x80\x93 ") - + clean(row.label) + + TextUtilities::Clean(row.label) + ' ' - + textcmdLink(1, clean(row.info))); + + textcmdLink(1, TextUtilities::Clean(row.info))); _progress->setValue(row.progress); } diff --git a/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.cpp b/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.cpp index 1b5bba577..0f2e3b8a4 100644 --- a/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.cpp +++ b/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.cpp @@ -58,6 +58,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "facades.h" #include "app.h" #include "styles/style_chat.h" +#include "styles/style_menu_icons.h" #include #include @@ -286,6 +287,12 @@ InnerWidget::InnerWidget( } } }, lifetime()); + session().data().itemDataChanges( + ) | rpl::start_with_next([=](not_null item) { + if (const auto view = viewForItem(item)) { + view->itemDataChanged(); + } + }, lifetime()); session().data().animationPlayInlineRequest( ) | rpl::start_with_next([=](auto item) { if (const auto view = viewForItem(item)) { @@ -664,6 +671,11 @@ void InnerWidget::elementReplyTo(const FullMsgId &to) { void InnerWidget::elementStartInteraction(not_null view) { } +void InnerWidget::elementShowSpoilerAnimation() { + _spoilerOpacity.stop(); + _spoilerOpacity.start([=] { update(); }, 0., 1., st::fadeWrapDuration); +} + void InnerWidget::saveState(not_null memento) { memento->setFilter(std::move(_filter)); memento->setAdmins(std::move(_admins)); @@ -960,10 +972,10 @@ void InnerWidget::paintEvent(QPaintEvent *e) { const auto height = view->height(); top += height; - context.viewport.translate(0, -height); - context.clip.translate(0, -height); + context.translate(0, -height); p.translate(0, height); } + context.translate(0, top); p.translate(0, -top); enumerateUserpics([&](not_null view, int userpicTop) { @@ -1150,7 +1162,9 @@ void InnerWidget::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { isUponSelected = hasSelected; } - _menu = base::make_unique_q(this); + _menu = base::make_unique_q( + this, + st::popupMenuWithIcons); const auto link = ClickHandler::getActive(); auto view = App::hoveredItem() @@ -1168,7 +1182,7 @@ void InnerWidget::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { if (isUponSelected > 0) { _menu->addAction(tr::lng_context_copy_selected(tr::now), [=] { copySelectedText(); - }); + }, &st::menuIconCopy); } if (lnkPhoto) { const auto photo = lnkPhoto->photo(); @@ -1176,10 +1190,10 @@ void InnerWidget::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { if (!photo->isNull() && media && media->loaded()) { _menu->addAction(tr::lng_context_save_image(tr::now), App::LambdaDelayed(st::defaultDropdownMenu.menu.ripple.hideDuration, this, [=] { savePhotoToFile(photo); - })); + }), &st::menuIconSaveImage); _menu->addAction(tr::lng_context_copy_image(tr::now), [=] { copyContextImage(photo); - }); + }, &st::menuIconCopy); } if (photo->hasAttachedStickers()) { const auto controller = _controller; @@ -1189,14 +1203,15 @@ void InnerWidget::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { }; _menu->addAction( tr::lng_context_attached_stickers(tr::now), - std::move(callback)); + std::move(callback), + &st::menuIconStickers); } } else { auto document = lnkDocument->document(); if (document->loading()) { _menu->addAction(tr::lng_context_cancel_download(tr::now), [=] { cancelContextDownload(document); - }); + }, &st::menuIconCancel); } else { const auto itemId = view ? view->data()->fullId() @@ -1212,17 +1227,17 @@ void InnerWidget::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { if (notAutoplayedGif) { _menu->addAction(tr::lng_context_open_gif(tr::now), [=] { openContextGif(itemId); - }); + }, &st::menuIconShowInChat); } } if (!document->filepath(true).isEmpty()) { _menu->addAction(Platform::IsMac() ? tr::lng_context_show_in_finder(tr::now) : tr::lng_context_show_in_folder(tr::now), [=] { showContextInFolder(document); - }); + }, &st::menuIconShowInFolder); } _menu->addAction(lnkIsVideo ? tr::lng_context_save_video(tr::now) : (lnkIsVoice ? tr::lng_context_save_audio(tr::now) : (lnkIsAudio ? tr::lng_context_save_audio_file(tr::now) : tr::lng_context_save_file(tr::now))), App::LambdaDelayed(st::defaultDropdownMenu.menu.ripple.hideDuration, this, [this, document] { saveDocumentToFile(document); - })); + }), &st::menuIconDownload); if (document->hasAttachedStickers()) { const auto controller = _controller; auto callback = [=, doc = document] { @@ -1231,7 +1246,8 @@ void InnerWidget::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { }; _menu->addAction( tr::lng_context_attached_stickers(tr::now), - std::move(callback)); + std::move(callback), + &st::menuIconStickers); } } } @@ -1245,7 +1261,10 @@ void InnerWidget::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { auto msg = dynamic_cast(item); if (isUponSelected > 0) { - _menu->addAction(tr::lng_context_copy_selected(tr::now), [this] { copySelectedText(); }); + _menu->addAction( + tr::lng_context_copy_selected(tr::now), + [this] { copySelectedText(); }, + &st::menuIconCopy); } else { if (item && !isUponSelected) { const auto media = view->media(); @@ -1254,7 +1273,7 @@ void InnerWidget::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { if (document->sticker()) { _menu->addAction(tr::lng_context_save_image(tr::now), App::LambdaDelayed(st::defaultDropdownMenu.menu.ripple.hideDuration, this, [this, document] { saveDocumentToFile(document); - })); + }), &st::menuIconDownload); } } if (msg @@ -1264,7 +1283,7 @@ void InnerWidget::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { || item->Has())) { _menu->addAction(tr::lng_context_copy_text(tr::now), [=] { copyContextText(itemId); - }); + }, &st::menuIconCopy); } } } @@ -1277,7 +1296,8 @@ void InnerWidget::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { actionText, [text = link->copyToClipboardText()] { QGuiApplication::clipboard()->setText(text); - }); + }, + &st::menuIconCopy); } } diff --git a/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.h b/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.h index 65792b3d4..c5a5c0cdf 100644 --- a/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.h +++ b/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.h @@ -139,6 +139,7 @@ public: void elementReplyTo(const FullMsgId &to) override; void elementStartInteraction( not_null view) override; + void elementShowSpoilerAnimation() override; ~InnerWidget(); @@ -322,6 +323,8 @@ private: QPoint _trippleClickPoint; base::Timer _trippleClickTimer; + Ui::Animations::Simple _spoilerOpacity; + FilterValue _filter; QString _searchQuery; std::vector> _admins; diff --git a/Telegram/SourceFiles/history/admin_log/history_admin_log_item.cpp b/Telegram/SourceFiles/history/admin_log/history_admin_log_item.cpp index 408279891..4544f6baf 100644 --- a/Telegram/SourceFiles/history/admin_log/history_admin_log_item.cpp +++ b/Telegram/SourceFiles/history/admin_log/history_admin_log_item.cpp @@ -119,7 +119,7 @@ MTPMessage PrepareLogMessage(const MTPMessage &message, TimeId newDate) { MTPint(), // edit_date MTP_string(), MTP_long(0), // grouped_id - //MTPMessageReactions(), + MTPMessageReactions(), MTPVector(), MTPint()); // ttl_period }); @@ -344,7 +344,7 @@ QString GenerateInviteLinkText(const MTPExportedChatInvite &data) { QString GenerateInviteLinkLink(const MTPExportedChatInvite &data) { const auto text = GenerateInviteLinkText(data); - return text.endsWith("...") + return text.endsWith(Ui::kQEllipsis) ? text : textcmdLink(InternalInviteLinkUrl(data), text); } @@ -353,7 +353,7 @@ TextWithEntities GenerateInviteLinkChangeText( const MTPExportedChatInvite &newLink, const MTPExportedChatInvite &prevLink) { auto link = TextWithEntities{ GenerateInviteLinkText(newLink) }; - if (!link.text.endsWith("...")) { + if (!link.text.endsWith(Ui::kQEllipsis)) { link.entities.push_back({ EntityType::CustomUrl, 0, @@ -675,6 +675,7 @@ void GenerateItems( MTPDchannelAdminLogEventActionParticipantJoinByRequest; using LogNoForwards = MTPDchannelAdminLogEventActionToggleNoForwards; using LogActionSendMessage = MTPDchannelAdminLogEventActionSendMessage; + using LogEventActionChangeAvailableReactions = MTPDchannelAdminLogEventActionChangeAvailableReactions; const auto session = &history->session(); const auto id = event.vid().v; @@ -1227,7 +1228,7 @@ void GenerateItems( ClickHandlerPtr additional = nullptr) { auto message = HistoryService::PreparedText{ text }; message.links.push_back(fromLink); - if (!ExtractInviteLink(data).endsWith("...")) { + if (!ExtractInviteLink(data).endsWith(Ui::kQEllipsis)) { message.links.push_back(std::make_shared( InternalInviteLinkUrl(data))); } @@ -1356,7 +1357,7 @@ void GenerateItems( ? tr::lng_admin_log_participant_approved_by_link : tr::lng_admin_log_participant_approved_by_link_channel); const auto linkText = GenerateInviteLinkLink(data.vinvite()); - const auto adminIndex = linkText.endsWith("...") ? 2 : 3; + const auto adminIndex = linkText.endsWith(Ui::kQEllipsis) ? 2 : 3; addInviteLinkServiceMessage( text( tr::now, @@ -1395,6 +1396,17 @@ void GenerateItems( ExtractSentDate(data.vmessage())); }; + const auto createChangeAvailableReactions = [&](const LogEventActionChangeAvailableReactions &data) { + auto list = QStringList(); + for (const auto &emoji : data.vnew_value().v) { + list.append(qs(emoji)); + } + const auto text = list.isEmpty() + ? tr::lng_admin_log_reactions_disabled(tr::now, lt_from, fromLinkText) + : tr::lng_admin_log_reactions_updated(tr::now, lt_from, fromLinkText, lt_emoji, list.join(", ")); + addSimpleServiceMessage(text); + }; + action.match([&](const LogTitle &data) { createChangeTitle(data); }, [&](const LogAbout &data) { @@ -1465,6 +1477,8 @@ void GenerateItems( createToggleNoForwards(data); }, [&](const LogActionSendMessage &data) { createSendMessage(data); + }, [&](const LogEventActionChangeAvailableReactions &data) { + createChangeAvailableReactions(data); }); } diff --git a/Telegram/SourceFiles/history/admin_log/history_admin_log_section.cpp b/Telegram/SourceFiles/history/admin_log/history_admin_log_section.cpp index 961da5fd6..56adbaff2 100644 --- a/Telegram/SourceFiles/history/admin_log/history_admin_log_section.cpp +++ b/Telegram/SourceFiles/history/admin_log/history_admin_log_section.cpp @@ -358,7 +358,7 @@ not_null Widget::channel() const { Dialogs::RowDescriptor Widget::activeChat() const { return { channel()->owner().history(channel()), - FullMsgId(peerToChannel(channel()->id), ShowAtUnreadMsgId) + FullMsgId(channel()->id, ShowAtUnreadMsgId) }; } diff --git a/Telegram/SourceFiles/history/history.cpp b/Telegram/SourceFiles/history/history.cpp index 3349855e7..51121862a 100644 --- a/Telegram/SourceFiles/history/history.cpp +++ b/Telegram/SourceFiles/history/history.cpp @@ -8,6 +8,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "history/history.h" #include "history/view/history_view_element.h" +#include "history/view/history_view_item_preview.h" #include "history/history_message.h" #include "history/history_service.h" #include "history/history_item_components.h" @@ -21,6 +22,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_changes.h" #include "data/data_chat_filters.h" #include "data/data_scheduled_messages.h" +#include "data/data_sponsored_messages.h" #include "data/data_send_action.h" #include "data/data_folder.h" #include "data/data_photo.h" @@ -35,6 +37,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "mainwidget.h" #include "mainwindow.h" #include "main/main_session.h" +#include "main/main_session_settings.h" #include "window/notifications_manager.h" #include "calls/calls_instance.h" #include "storage/localstorage.h" @@ -368,7 +371,7 @@ not_null History::createItem( const MTPMessage &message, MessageFlags localFlags, bool detachExistingItem) { - if (const auto result = owner().message(channelId(), id)) { + if (const auto result = owner().message(peer, id)) { if (detachExistingItem) { result->removeMainView(); } @@ -678,6 +681,18 @@ not_null History::addNewLocalMessage( true); } +not_null History::addNewLocalMessage( + MsgId id, + Data::SponsoredFrom from, + const TextWithEntities &textWithEntities) { + return addNewItem( + makeMessage( + id, + from, + textWithEntities), + true); +} + void History::setUnreadMentionsCount(int count) { const auto had = _unreadMentionsCount && (*_unreadMentionsCount > 0); if (_unreadMentions.size() > count) { @@ -2180,7 +2195,7 @@ bool History::isReadyFor(MsgId msgId) { } return loadedAtBottom(); } - const auto item = owner().message(channelId(), msgId); + const auto item = owner().message(peer, msgId); return item && (item->history() == this) && item->mainView(); } @@ -2452,15 +2467,15 @@ void History::setFakeChatListMessageFrom(const MTPmessages_Messages &data) { } void History::applyChatListGroup( - ChannelId channelId, + PeerId dataPeerId, const MTPmessages_Messages &data) { if (!isEmpty() || !_chatListMessage || !*_chatListMessage - || (*_chatListMessage)->history()->channelId() != channelId || (*_chatListMessage)->history() != this || !_lastMessage - || !*_lastMessage) { + || !*_lastMessage + || dataPeerId != peer->id) { return; } // Apply loaded album as a last slice. @@ -2469,7 +2484,7 @@ void History::applyChatListGroup( items.reserve(messages.v.size()); for (const auto &message : messages.v) { const auto id = IdFromMessage(message); - if (const auto message = owner().message(channelId, id)) { + if (const auto message = owner().message(dataPeerId, id)) { items.push_back(message); } } @@ -2590,7 +2605,7 @@ void History::applyDialog( } if (!channel->amCreator()) { const auto topMessageId = FullMsgId( - peerToChannel(channel->id), + channel->id, data.vtop_message().v); if (const auto item = owner().message(topMessageId)) { if (item->date() <= channel->date) { @@ -2725,9 +2740,7 @@ void History::applyDialogFields( void History::applyDialogTopMessage(MsgId topMessageId) { if (topMessageId) { - const auto itemId = FullMsgId( - channelId(), - topMessageId); + const auto itemId = FullMsgId(peer->id, topMessageId); if (const auto item = owner().message(itemId)) { setLastServerMessage(item); } else { @@ -2832,18 +2845,6 @@ void History::forceFullResize() { _flags |= Flag::f_has_pending_resized_items; } -ChannelId History::channelId() const { - return peerToChannel(peer->id); -} - -bool History::isChannel() const { - return peerIsChannel(peer->id); -} - -bool History::isMegagroup() const { - return peer->isMegagroup(); -} - not_null History::migrateToOrMe() const { if (const auto to = peer->migrateTo()) { return owner().history(to); @@ -2970,7 +2971,7 @@ void History::checkLocalMessages() { insertMessageToBlocks(item); } } - if (isChannel() + if (peer->isChannel() && !_joinedMessage && peer->asChannel()->inviter && goodDate(peer->asChannel()->inviteDate)) { @@ -2984,6 +2985,16 @@ void History::removeJoinedMessage() { } } +void History::reactionsEnabledChanged(bool enabled) { + if (!enabled) { + for (const auto &item : _messages) { + item->updateReactions(nullptr); + } + } else { + + } +} + bool History::isEmpty() const { return blocks.empty(); } @@ -3233,6 +3244,57 @@ void History::setHasPinnedMessages(bool has) { session().changes().historyUpdated(this, UpdateFlag::PinnedMessages); } +bool History::hasHiddenPinnedMessage() { + auto result = false; + const auto migrated = peer->migrateFrom(); + const auto currentPinnedId = Data::ResolveTopPinnedId(peer, migrated); + const auto universalPinnedId = !currentPinnedId + ? int32(0) + : (migrated && !peerIsChannel(currentPinnedId.peer)) + ? (currentPinnedId.msg - ServerMaxMsgId) + : currentPinnedId.msg; + if (universalPinnedId) { + const auto hiddenId = session().settings().hiddenPinnedMessageId(peer->id); + if (hiddenId == universalPinnedId) { + result = true; + } + } else { + session().api().requestFullPeer(peer); + } + return result; +} + +bool History::switchPinnedHidden(bool hidden) { + auto result = false; + if (hidden) { + const auto migrated = peer->migrateFrom(); + const auto currentPinnedId = Data::ResolveTopPinnedId(peer, migrated); + const auto universalPinnedId = !currentPinnedId + ? int32(0) + : (migrated && !peerIsChannel(currentPinnedId.peer)) + ? (currentPinnedId.msg - ServerMaxMsgId) + : currentPinnedId.msg; + if (universalPinnedId) { + session().settings().setHiddenPinnedMessageId(peer->id, universalPinnedId); + session().saveSettingsDelayed(); + result = true; + } else { + session().api().requestFullPeer(peer); + } + } else { + const auto hiddenId = session().settings().hiddenPinnedMessageId(peer->id); + if (hiddenId != 0) { + session().settings().setHiddenPinnedMessageId(peer->id, 0); + session().saveSettingsDelayed(); + result = true; + } + } + if (result) { + session().changes().historyUpdated(this, UpdateFlag::PinnedMessages); + } + return result; +} + History::~History() = default; HistoryBlock::HistoryBlock(not_null history) diff --git a/Telegram/SourceFiles/history/history.h b/Telegram/SourceFiles/history/history.h index 4ed26c193..9ac074796 100644 --- a/Telegram/SourceFiles/history/history.h +++ b/Telegram/SourceFiles/history/history.h @@ -35,6 +35,7 @@ struct Draft; class Session; class Folder; class ChatFilter; +struct SponsoredFrom; enum class ForwardOptions { PreserveInfo, @@ -91,15 +92,13 @@ public: History &operator=(const History &) = delete; ~History(); - ChannelId channelId() const; - bool isChannel() const; - bool isMegagroup() const; not_null migrateToOrMe() const; History *migrateFrom() const; MsgRange rangeForDifferenceRequest() const; void checkLocalMessages(); void removeJoinedMessage(); + void reactionsEnabledChanged(bool enabled); bool isEmpty() const; bool isDisplayedEmpty() const; @@ -202,6 +201,10 @@ public: const QString &postAuthor, not_null game, HistoryMessageMarkupData &&markup); + not_null addNewLocalMessage( + MsgId id, + Data::SponsoredFrom from, + const TextWithEntities &textWithEntities); // sponsored // Used only internally and for channel admin log. not_null createItem( @@ -421,7 +424,7 @@ public: void checkChatListMessageRemoved(not_null item); void applyChatListGroup( - ChannelId channelId, + PeerId dataPeerId, const MTPmessages_Messages &data); void forgetScrollState() { @@ -450,6 +453,9 @@ public: [[nodiscard]] bool hasPinnedMessages() const; void setHasPinnedMessages(bool has); + bool hasHiddenPinnedMessage(); + bool switchPinnedHidden(bool hidden); + // Still public data. std::deque> blocks; diff --git a/Telegram/SourceFiles/history/history_inner_widget.cpp b/Telegram/SourceFiles/history/history_inner_widget.cpp index 122450776..2a255f55a 100644 --- a/Telegram/SourceFiles/history/history_inner_widget.cpp +++ b/Telegram/SourceFiles/history/history_inner_widget.cpp @@ -16,13 +16,15 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "history/view/media/history_view_media.h" #include "history/view/media/history_view_sticker.h" #include "history/view/media/history_view_web_page.h" -#include "history/history_item_components.h" -#include "history/history_item_text.h" +#include "history/view/reactions/message_reactions_list.h" #include "history/view/history_view_message.h" #include "history/view/history_view_service_message.h" #include "history/view/history_view_cursor_state.h" #include "history/view/history_view_context_menu.h" +#include "history/view/history_view_react_button.h" #include "history/view/history_view_emoji_interactions.h" +#include "history/history_item_components.h" +#include "history/history_item_text.h" #include "ui/chat/chat_style.h" #include "ui/widgets/popup_menu.h" #include "ui/image/image.h" @@ -32,12 +34,13 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/boxes/report_box.h" #include "ui/layers/generic_box.h" #include "ui/controls/delete_message_context_action.h" -#include "ui/controls/who_read_context_action.h" +#include "ui/controls/who_reacted_context_action.h" #include "ui/ui_utility.h" #include "ui/cached_round_corners.h" #include "ui/inactive_press.h" #include "window/window_adaptive.h" #include "window/window_session_controller.h" +#include "window/window_controller.h" #include "window/window_peer_menu.h" #include "window/window_controller.h" #include "window/notifications_manager.h" @@ -48,6 +51,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "chat_helpers/emoji_interactions.h" #include "history/history_widget.h" #include "base/platform/base_platform_info.h" +#include "base/qt_adapters.h" #include "base/unixtime.h" #include "mainwindow.h" #include "layout/layout_selection.h" @@ -57,11 +61,12 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "apiwrap.h" #include "api/api_attached_stickers.h" #include "api/api_toggling_media.h" -#include "api/api_who_read.h" +#include "api/api_who_reacted.h" #include "api/api_views.h" #include "lang/lang_keys.h" #include "data/data_session.h" #include "data/data_media_types.h" +#include "data/data_message_reactions.h" #include "data/data_document.h" #include "data/data_channel.h" #include "data/data_poll.h" @@ -80,7 +85,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "app.h" #include "styles/style_chat.h" #include "styles/style_window.h" // st::windowMinWidth -#include "base/qt_adapters.h" +#include "styles/style_menu_icons.h" #include #include @@ -173,6 +178,10 @@ HistoryInner::HistoryInner( HistoryView::MakePathShiftGradient( controller->chatStyle(), [=] { update(); })) +, _reactionsManager( + std::make_unique( + this, + [=](QRect updated) { update(updated); })) , _touchSelectTimer([=] { onTouchSelect(); }) , _touchScrollTimer([=] { onTouchScrollTimer(); }) , _scrollDateCheck([this] { scrollDateCheck(); }) @@ -219,6 +228,14 @@ HistoryInner::HistoryInner( _controller->emojiInteractions().playStarted(_peer, std::move(emoji)); }, lifetime()); + using ChosenReaction = HistoryView::Reactions::Manager::Chosen; + _reactionsManager->chosen( + ) | rpl::start_with_next([=](ChosenReaction reaction) { + if (const auto item = session().data().message(reaction.context)) { + item->toggleReaction(reaction.emoji); + } + }, lifetime()); + session().data().itemRemoved( ) | rpl::start_with_next( [this](auto item) { itemRemoved(item); }, @@ -245,6 +262,14 @@ HistoryInner::HistoryInner( }) | rpl::start_with_next([this](not_null view) { mouseActionUpdate(); }, lifetime()); + + session().data().itemDataChanges( + ) | rpl::filter([=](not_null item) { + return item->mainView() != nullptr; + }) | rpl::start_with_next([=](not_null item) { + item->mainView()->itemDataChanged(); + }, lifetime()); + session().changes().historyUpdates( _history, Data::HistoryUpdate::Flag::OutboxRead @@ -252,6 +277,12 @@ HistoryInner::HistoryInner( update(); }, lifetime()); + Data::PeerAllowedReactionsValue( + _peer + ) | rpl::start_with_next([=](std::vector &&list) { + _reactionsManager->applyList(std::move(list)); + }, lifetime()); + controller->adaptive().chatWideValue( ) | rpl::start_with_next([=](bool wide) { _isChatWide = wide; @@ -649,6 +680,9 @@ void HistoryInner::paintEvent(QPaintEvent *e) { } if (hasPendingResizedItems()) { return; + } else if (_recountedAfterPendingResizedItems) { + _recountedAfterPendingResizedItems = false; + mouseActionUpdate(); } const auto guard = gsl::finally([&] { @@ -672,6 +706,7 @@ void HistoryInner::paintEvent(QPaintEvent *e) { width(), std::min(st::msgMaxWidth / 2, width() / 2)); + const auto now = crl::now(); const auto historyDisplayedEmpty = _history->isDisplayedEmpty() && (!_migrated || _migrated->isDisplayedEmpty()); bool noHistoryDisplayed = historyDisplayedEmpty; @@ -747,6 +782,7 @@ void HistoryInner::paintEvent(QPaintEvent *e) { readMentions.insert(item); _widget->enqueueMessageHighlight(view); } + session().data().reactions().poll(item, now); } top += height; @@ -765,8 +801,8 @@ void HistoryInner::paintEvent(QPaintEvent *e) { view = block->messages[iItem].get(); item = view->data(); } - p.translate(0, -top); context.translate(0, top); + p.translate(0, -top); } if (htop >= 0) { auto iBlock = (_curHistory == _history ? _curBlock : 0); @@ -790,17 +826,19 @@ void HistoryInner::paintEvent(QPaintEvent *e) { seltoy - htop); view->draw(p, context); + const auto item = view->data(); const auto middle = top + height / 2; const auto bottom = top + height; if (_visibleAreaBottom >= bottom) { - const auto item = view->data(); if (!item->out() && item->unread()) { readTill = item; } - if (item->isSponsored()) { - session().data().sponsoredMessages().view( - item->fullId()); - } + } + if (item->isSponsored() + && view->markSponsoredViewed( + _visibleAreaBottom - top)) { + session().data().sponsoredMessages().view( + item->fullId()); } if (_visibleAreaBottom >= middle && _visibleAreaTop <= middle) { @@ -812,6 +850,7 @@ void HistoryInner::paintEvent(QPaintEvent *e) { _widget->enqueueMessageHighlight(view); } } + session().data().reactions().poll(item, now); } top += height; context.translate(0, -height); @@ -829,6 +868,7 @@ void HistoryInner::paintEvent(QPaintEvent *e) { view = block->messages[iItem].get(); item = view->data(); } + context.translate(0, top); p.translate(0, -top); if (readTill && _widget->doWeReadServerHistory()) { @@ -857,7 +897,7 @@ void HistoryInner::paintEvent(QPaintEvent *e) { userpicTop, width(), st::msgPhotoSize); - } else if (const auto info = view->data()->hiddenForwardedInfo()) { + } else if (const auto info = view->data()->hiddenSenderInfo()) { info->userpic.paint( p, st::historyPhotoLeft, @@ -925,6 +965,9 @@ void HistoryInner::paintEvent(QPaintEvent *e) { return true; }); p.setOpacity(1.); + + _reactionsManager->paintButtons(p, context); + p.translate(0, _historyPaddingTop); _emojiInteractions->paint(p); } @@ -1402,6 +1445,7 @@ std::unique_ptr HistoryInner::prepareDrag() { void HistoryInner::performDrag() { if (auto mimeData = prepareDrag()) { // This call enters event loop and can destroy any QObject. + _reactionsManager->updateButton({}); _controller->widget()->launchDrag( std::move(mimeData), crl::guard(this, [=] { mouseActionUpdate(QCursor::pos()); })); @@ -1414,6 +1458,7 @@ void HistoryInner::itemRemoved(not_null item) { } _animatedStickersPlayed.remove(item); + _reactionsManager->remove(item->fullId()); auto i = _selected.find(item); if (i != _selected.cend()) { @@ -1659,11 +1704,11 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { isUponSelected = hasSelected; } - const auto hasWhoReadItem = _dragStateItem - && Api::WhoReadExists(_dragStateItem); + const auto hasWhoReactedItem = _dragStateItem + && Api::WhoReactedExists(_dragStateItem); _menu = base::make_unique_q( this, - hasWhoReadItem ? st::whoReadMenu : st::defaultPopupMenu); + hasWhoReactedItem ? st::whoReadMenu : st::popupMenuWithIcons); const auto session = &this->session(); const auto controller = _controller; const auto groupLeaderOrSelf = [](HistoryItem *item) -> HistoryItem* { @@ -1687,7 +1732,7 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { if (canSendMessages) { _menu->addAction(tr::lng_context_reply_msg(tr::now), [=] { _widget->replyToMessage(itemId); - }); + }, &st::menuIconReply); } const auto repliesCount = item->repliesCount(); const auto withReplies = (repliesCount > 0); @@ -1701,7 +1746,7 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { : tr::lng_replies_view_thread(tr::now); _menu->addAction(phrase, [=] { controller->showRepliesForMessage(_history, rootId); - }); + }, &st::menuIconViewReplies); } const auto t = base::unixtime::now(); const auto editItem = (albumPartItem && albumPartItem->allowsEdit(t)) @@ -1713,7 +1758,7 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { const auto editItemId = editItem->fullId(); _menu->addAction(tr::lng_context_edit_msg(tr::now), [=] { _widget->editMessage(editItemId); - }); + }, &st::menuIconEdit); } const auto pinItem = (item->canPin() && item->isPinned()) ? item @@ -1724,7 +1769,7 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { const auto controller = _controller; _menu->addAction(isPinned ? tr::lng_context_unpin_msg(tr::now) : tr::lng_context_pin_msg(tr::now), crl::guard(controller, [=] { Window::ToggleMessagePinned(controller, pinItemId, !isPinned); - })); + }), isPinned ? &st::menuIconUnpin : &st::menuIconPin); } const auto peer = item->history()->peer; if (peer->isChat() || peer->isMegagroup()) { @@ -1735,7 +1780,7 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { ? peer->owner().history(peer).get() : Dialogs::Key(), item->from()->asUser()); - }); + }, &st::menuIconSearch); } }; const auto addPhotoActions = [&](not_null photo, HistoryItem *item) { @@ -1744,24 +1789,24 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { if (!photo->isNull() && media && media->loaded() && !hasCopyRestriction(item)) { _menu->addAction(tr::lng_context_save_image(tr::now), App::LambdaDelayed(st::defaultDropdownMenu.menu.ripple.hideDuration, this, [=] { savePhotoToFile(photo); - })); + }), &st::menuIconSaveImage); _menu->addAction(tr::lng_context_copy_image(tr::now), [=] { copyContextImage(photo, itemId); - }); + }, &st::menuIconCopy); } if (photo->hasAttachedStickers()) { _menu->addAction(tr::lng_context_attached_stickers(tr::now), [=] { session->api().attachedStickers().requestAttachedStickerSets( controller, photo); - }); + }, &st::menuIconStickers); } }; const auto addDocumentActions = [&](not_null document, HistoryItem *item) { if (document->loading()) { _menu->addAction(tr::lng_context_cancel_download(tr::now), [=] { cancelContextDownload(document); - }); + }, &st::menuIconCancel); return; } const auto itemId = item ? item->fullId() : FullMsgId(); @@ -1780,30 +1825,30 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { if (notAutoplayedGif) { _menu->addAction(tr::lng_context_open_gif(tr::now), [=] { openContextGif(itemId); - }); + }, &st::menuIconShowInChat); } if (!hasCopyRestriction(item)) { _menu->addAction(tr::lng_context_save_gif(tr::now), [=] { saveContextGif(itemId); - }); + }, &st::menuIconGif); } } if (!document->filepath(true).isEmpty()) { _menu->addAction(Platform::IsMac() ? tr::lng_context_show_in_finder(tr::now) : tr::lng_context_show_in_folder(tr::now), [=] { showContextInFolder(document); - }); + }, &st::menuIconShowInFolder); } if (!hasCopyRestriction(item)) { _menu->addAction(lnkIsVideo ? tr::lng_context_save_video(tr::now) : (lnkIsVoice ? tr::lng_context_save_audio(tr::now) : (lnkIsAudio ? tr::lng_context_save_audio_file(tr::now) : tr::lng_context_save_file(tr::now))), App::LambdaDelayed(st::defaultDropdownMenu.menu.ripple.hideDuration, this, [=] { saveDocumentToFile(itemId, document); - })); + }), &st::menuIconDownload); } if (document->hasAttachedStickers()) { _menu->addAction(tr::lng_context_attached_stickers(tr::now), [=] { session->api().attachedStickers().requestAttachedStickerSets( controller, document); - }); + }, &st::menuIconStickers); } }; @@ -1826,22 +1871,10 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { _widget->updateTopBarSelection(); } } - }); + }, &st::menuIconSelect); } }; - if (hasWhoReadItem) { - const auto participantChosen = [=](uint64 id) { - controller->showPeerInfo(PeerId(id)); - }; - _menu->addAction(Ui::WhoReadContextAction( - _menu.get(), - Api::WhoRead(_dragStateItem, this, st::defaultWhoRead), - participantChosen, - cUserpicCornersType())); - _menu->addSeparator(); - } - const auto link = ClickHandler::getActive(); auto lnkPhoto = dynamic_cast(link.get()); auto lnkDocument = dynamic_cast(link.get()); @@ -1853,7 +1886,8 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { (isUponSelected > 1 ? tr::lng_context_copy_selected_items(tr::now) : tr::lng_context_copy_selected(tr::now)), - [=] { copySelectedText(); }); + [=] { copySelectedText(); }, + &st::menuIconCopy); } addItemActions(item, item); if (lnkPhoto) { @@ -1864,22 +1898,22 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { if (item && item->hasDirectLink() && isUponSelected != 2 && isUponSelected != -2) { _menu->addAction(item->history()->peer->isMegagroup() ? tr::lng_context_copy_message_link(tr::now) : tr::lng_context_copy_post_link(tr::now), [=] { HistoryView::CopyPostLink(session, itemId, HistoryView::Context::History); - }); + }, &st::menuIconLink); } if (isUponSelected > 1) { if (selectedState.count > 0 && selectedState.canForwardCount == selectedState.count) { _menu->addAction(tr::lng_context_forward_selected(tr::now), [=] { _widget->forwardSelected(); - }); + }, &st::menuIconForward); } if (selectedState.count > 0 && selectedState.canDeleteCount == selectedState.count) { _menu->addAction(tr::lng_context_delete_selected(tr::now), [=] { _widget->confirmDeleteSelected(); - }); + }, &st::menuIconDelete); } _menu->addAction(tr::lng_context_clear_selection(tr::now), [=] { _widget->clearSelected(); - }); + }, &st::menuIconSelect); } else if (item) { const auto itemId = item->fullId(); const auto blockSender = item->history()->peer->isRepliesChat(); @@ -1887,7 +1921,7 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { if (item->allowsForward()) { _menu->addAction(tr::lng_context_forward_msg(tr::now), [=] { forwardItem(itemId); - }); + }, &st::menuIconForward); } if (item->canDelete()) { _menu->addAction(Ui::DeleteMessageContextAction( @@ -1899,14 +1933,14 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { if (!blockSender && item->suggestReport()) { _menu->addAction(tr::lng_context_report_msg(tr::now), [=] { reportItem(itemId); - }); + }, &st::menuIconReport); } } addSelectMessageAction(item, false); if (isUponSelected != -2 && blockSender) { _menu->addAction(tr::lng_profile_block_user(tr::now), [=] { blockSenderItem(itemId); - }); + }, &st::menuIconBlock); } } } else { // maybe cursor on some text history item? @@ -1934,7 +1968,8 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { ((isUponSelected > 1) ? tr::lng_context_copy_selected_items(tr::now) : tr::lng_context_copy_selected(tr::now)), - [=] { copySelectedText(); }); + [=] { copySelectedText(); }, + &st::menuIconCopy); } addItemActions(item, item); } else { @@ -1947,15 +1982,16 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { if (document->sticker()->set) { _menu->addAction(document->isStickerSetInstalled() ? tr::lng_context_pack_info(tr::now) : tr::lng_context_pack_add(tr::now), [=] { showStickerPackInfo(document); - }); - _menu->addAction(session->data().stickers().isFaved(document) ? tr::lng_faved_stickers_remove(tr::now) : tr::lng_faved_stickers_add(tr::now), [=] { + }, &st::menuIconStickers); + const auto isFaved = session->data().stickers().isFaved(document); + _menu->addAction(isFaved ? tr::lng_faved_stickers_remove(tr::now) : tr::lng_faved_stickers_add(tr::now), [=] { Api::ToggleFavedSticker(document, itemId); - }); + }, isFaved ? &st::menuIconUnfave : &st::menuIconFave); } if (!hasCopyRestriction(item)) { _menu->addAction(tr::lng_context_save_image(tr::now), App::LambdaDelayed(st::defaultDropdownMenu.menu.ripple.hideDuration, this, [=] { saveDocumentToFile(itemId, document); - })); + }), &st::menuIconDownload); } } } @@ -1970,13 +2006,13 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { const auto phone = contact->phoneNumber; _menu->addAction(tr::lng_profile_copy_phone(tr::now), [=] { QGuiApplication::clipboard()->setText(phone); - }); + }, &st::menuIconCopy); } } if (item->isSponsored()) { _menu->addAction(tr::lng_sponsored_title({}), [=] { _controller->show(Box(Ui::AboutSponsoredBox)); - }); + }, &st::menuIconInfo); } if (!item->isService() && view @@ -1985,7 +2021,7 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { && (view->hasVisibleText() || mediaHasTextForCopy)) { _menu->addAction(tr::lng_context_copy_text(tr::now), [=] { copyContextText(itemId); - }); + }, &st::menuIconCopy); } } } @@ -1998,39 +2034,40 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { actionText, [text = link->copyToClipboardText()] { QGuiApplication::clipboard()->setText(text); - }); + }, + &st::menuIconCopy); } else if (item && item->hasDirectLink() && isUponSelected != 2 && isUponSelected != -2) { _menu->addAction(item->history()->peer->isMegagroup() ? tr::lng_context_copy_message_link(tr::now) : tr::lng_context_copy_post_link(tr::now), [=] { HistoryView::CopyPostLink(session, itemId, HistoryView::Context::History); - }); + }, &st::menuIconLink); } if (isUponSelected > 1) { if (selectedState.count > 0 && selectedState.count == selectedState.canForwardCount) { _menu->addAction(tr::lng_context_forward_selected(tr::now), [=] { _widget->forwardSelected(); - }); + }, &st::menuIconForward); } if (selectedState.count > 0 && selectedState.count == selectedState.canDeleteCount) { _menu->addAction(tr::lng_context_delete_selected(tr::now), [=] { _widget->confirmDeleteSelected(); - }); + }, &st::menuIconDelete); } _menu->addAction(tr::lng_context_clear_selection(tr::now), [=] { _widget->clearSelected(); - }); + }, &st::menuIconSelect); } else if (item && ((isUponSelected != -2 && (canForward || canDelete)) || item->isRegular())) { if (isUponSelected != -2) { if (canForward) { _menu->addAction(tr::lng_context_forward_msg(tr::now), [=] { forwardAsGroup(itemId); - }); + }, &st::menuIconForward); } if (canDelete) { const auto callback = [=] { deleteAsGroup(itemId); }; if (item->isUploading()) { - _menu->addAction(tr::lng_context_cancel_upload(tr::now), callback); + _menu->addAction(tr::lng_context_cancel_upload(tr::now), callback, &st::menuIconCancel); } else { _menu->addAction(Ui::DeleteMessageContextAction( _menu->menu(), @@ -2042,20 +2079,28 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) { if (!canBlockSender && canReport) { _menu->addAction(tr::lng_context_report_msg(tr::now), [=] { reportAsGroup(itemId); - }); + }, &st::menuIconReport); } } addSelectMessageAction(item); if (isUponSelected != -2 && canBlockSender) { _menu->addAction(tr::lng_profile_block_user(tr::now), [=] { blockSenderAsGroup(itemId); - }); + }, &st::menuIconBlock); } } else if (App::mousedItem()) { addSelectMessageAction(App::mousedItem()->data()); } } + if (hasWhoReactedItem) { + HistoryView::AddWhoReactedAction( + _menu, + this, + _dragStateItem, + _controller); + } + if (_menu->empty()) { _menu = nullptr; } else { @@ -2340,6 +2385,11 @@ void HistoryInner::checkHistoryActivation() { void HistoryInner::recountHistoryGeometry() { _contentWidth = _scroll->width(); + if (_history->hasPendingResizedItems() + || (_migrated && _migrated->hasPendingResizedItems())) { + _recountedAfterPendingResizedItems = true; + } + const auto visibleHeight = _scroll->height(); int oldHistoryPaddingTop = qMax(visibleHeight - historyHeight() - st::historyPaddingBottom, 0); if (_botAbout && !_botAbout->info->text.isEmpty()) { @@ -2641,6 +2691,7 @@ void HistoryInner::enterEventHook(QEnterEvent *e) { } void HistoryInner::leaveEventHook(QEvent *e) { + _reactionsManager->updateButton({}); if (auto item = App::hoveredItem()) { repaintItem(item); App::hoveredItem(nullptr); @@ -2752,13 +2803,13 @@ bool HistoryInner::canCopySelected() const { } bool HistoryInner::canDeleteSelected() const { - auto selectedState = getSelectionState(); - return (selectedState.count > 0) && (selectedState.count == selectedState.canDeleteCount); + const auto selectedState = getSelectionState(); + return (selectedState.count > 0) + && (selectedState.count == selectedState.canDeleteCount); } bool HistoryInner::inSelectionMode() const { - if (!_selected.empty() - && (_selected.begin()->second == FullSelection)) { + if (hasSelectedItems()) { return true; } else if (_mouseAction == MouseAction::Selecting && _dragSelFrom @@ -2860,6 +2911,11 @@ void HistoryInner::elementStartInteraction(not_null view) { _controller->emojiInteractions().startOutgoing(view); } +void HistoryInner::elementShowSpoilerAnimation() { + _spoilerOpacity.stop(); + _spoilerOpacity.start([=] { update(); }, 0., 1., st::fadeWrapDuration); +} + auto HistoryInner::getSelectionState() const -> HistoryView::TopBarWidget::SelectedState { auto result = HistoryView::TopBarWidget::SelectedState {}; @@ -2887,10 +2943,14 @@ void HistoryInner::clearSelected(bool onlyTextSelection) { } } +bool HistoryInner::hasSelectedItems() const { + return !_selected.empty() && _selected.cbegin()->second == FullSelection; +} + MessageIdsList HistoryInner::getSelectedItems() const { using namespace ranges; - if (_selected.empty() || _selected.cbegin()->second != FullSelection) { + if (!hasSelectedItems()) { return {}; } @@ -2905,7 +2965,9 @@ MessageIdsList HistoryInner::getSelectedItems() const { }) | to_vector; result |= actions::sort(less{}, [](const FullMsgId &msgId) { - return msgId.channel ? msgId.msg : (msgId.msg - ServerMaxMsgId); + return peerIsChannel(msgId.peer) + ? msgId.msg + : (msgId.msg - ServerMaxMsgId); }); return result; } @@ -2915,6 +2977,29 @@ void HistoryInner::onTouchSelect() { mouseActionStart(_touchPos, Qt::LeftButton); } +auto HistoryInner::reactionButtonParameters( + not_null view, + QPoint position, + const HistoryView::TextState &reactionState) const +-> HistoryView::Reactions::ButtonParameters { + const auto top = itemTop(view); + if (top < 0 + || !view->data()->canReact() + || _mouseAction == MouseAction::Dragging + || _mouseAction == MouseAction::Selecting + || inSelectionMode()) { + return {}; + } + auto result = view->reactionButtonParameters( + position, + reactionState + ).translated({ 0, itemTop(view) }); + result.visibleTop = _visibleAreaTop; + result.visibleBottom = _visibleAreaBottom; + result.globalPointer = _mousePosition; + return result; +} + void HistoryInner::mouseActionUpdate() { if (hasPendingResizedItems()) { return; @@ -2923,19 +3008,31 @@ void HistoryInner::mouseActionUpdate() { auto mousePos = mapFromGlobal(_mousePosition); auto point = _widget->clampMousePosition(mousePos); - auto block = (HistoryBlock*)nullptr; - auto item = (HistoryItem*)nullptr; - auto view = (Element*)nullptr; QPoint m; adjustCurrent(point.y()); - if (_curHistory && !_curHistory->isEmpty()) { - block = _curHistory->blocks[_curBlock].get(); - view = block->messages[_curItem].get(); - item = view->data(); - - App::mousedItem(view); + const auto reactionState = _reactionsManager->buttonTextState(point); + const auto reactionItem = session().data().message(reactionState.itemId); + const auto reactionView = reactionItem + ? reactionItem->mainView() + : nullptr; + const auto view = reactionView + ? reactionView + : (_curHistory && !_curHistory->isEmpty()) + ? _curHistory->blocks[_curBlock]->messages[_curItem].get() + : nullptr; + const auto item = view ? view->data().get() : nullptr; + if (view) { + if (App::mousedItem() != view) { + repaintItem(App::mousedItem()); + App::mousedItem(view); + repaintItem(App::mousedItem()); + } m = mapPointToItem(point, view); + _reactionsManager->updateButton(reactionButtonParameters( + view, + m, + reactionState)); if (view->pointState(m) != PointState::Outside) { if (App::hoveredItem() != view) { repaintItem(App::hoveredItem()); @@ -2946,6 +3043,12 @@ void HistoryInner::mouseActionUpdate() { repaintItem(App::hoveredItem()); App::hoveredItem(nullptr); } + } else { + if (App::mousedItem()) { + repaintItem(App::mousedItem()); + App::mousedItem(nullptr); + } + _reactionsManager->updateButton({}); } if (_mouseActionItem && !_mouseActionItem->mainView()) { mouseActionCancel(); @@ -2957,7 +3060,11 @@ void HistoryInner::mouseActionUpdate() { && (view == App::hoveredItem()) && !_selected.empty() && (_selected.cbegin()->second != FullSelection); - if (point.y() < _historyPaddingTop) { + const auto overReaction = reactionView && reactionState.link; + if (overReaction) { + dragState = reactionState; + lnkhost = reactionView; + } else if (point.y() < _historyPaddingTop) { if (_botAbout && !_botAbout->info->text.isEmpty() && _botAbout->height > 0) { dragState = TextState(nullptr, _botAbout->info->text.getState( point - _botAbout->rect.topLeft() - QPoint(st::msgPadding.left(), st::msgPadding.top() + st::botDescSkip + st::msgNameFont->height), @@ -3666,7 +3773,7 @@ not_null HistoryInner::ElementDelegate() { } bool elementUnderCursor( not_null view) override { - return (App::hoveredItem() == view); + return (App::mousedItem() == view); } crl::time elementHighlightTime( not_null item) override { @@ -3767,6 +3874,12 @@ not_null HistoryInner::ElementDelegate() { Instance->elementStartInteraction(view); } } + void elementShowSpoilerAnimation() override { + if (Instance) { + Instance->elementShowSpoilerAnimation(); + } + } + }; static Result result; diff --git a/Telegram/SourceFiles/history/history_inner_widget.h b/Telegram/SourceFiles/history/history_inner_widget.h index 8e0302223..e03150843 100644 --- a/Telegram/SourceFiles/history/history_inner_widget.h +++ b/Telegram/SourceFiles/history/history_inner_widget.h @@ -30,6 +30,11 @@ class EmptyPainter; class Element; } // namespace HistoryView +namespace HistoryView::Reactions { +class Manager; +struct ButtonParameters; +} // namespace HistoryView::Reactions + namespace Window { class SessionController; } // namespace Window @@ -57,6 +62,7 @@ public: not_null scroll, not_null controller, not_null history); + ~HistoryInner(); [[nodiscard]] Main::Session &session() const; [[nodiscard]] not_null theme() const { @@ -66,7 +72,7 @@ public: void messagesReceived(PeerData *peer, const QVector &messages); void messagesReceivedDown(PeerData *peer, const QVector &messages); - TextForMimeData getSelectedText() const; + [[nodiscard]] TextForMimeData getSelectedText() const; void touchScrollUpdated(const QPoint &screenPos); @@ -79,14 +85,16 @@ public: void repaintItem(const HistoryItem *item); void repaintItem(const Element *view); - bool canCopySelected() const; - bool canDeleteSelected() const; + [[nodiscard]] bool canCopySelected() const; + [[nodiscard]] bool canDeleteSelected() const; - HistoryView::TopBarWidget::SelectedState getSelectionState() const; + [[nodiscard]] auto getSelectionState() const + -> HistoryView::TopBarWidget::SelectedState; void clearSelected(bool onlyTextSelection = false); - MessageIdsList getSelectedItems() const; - bool inSelectionMode() const; - bool elementIntersectsRange( + [[nodiscard]] MessageIdsList getSelectedItems() const; + [[nodiscard]] bool hasSelectedItems() const; + [[nodiscard]] bool inSelectionMode() const; + [[nodiscard]] bool elementIntersectsRange( not_null view, int from, int till) const; @@ -116,6 +124,7 @@ public: not_null elementPathShiftGradient(); void elementReplyTo(const FullMsgId &to); void elementStartInteraction(not_null view); + void elementShowSpoilerAnimation(); void updateBotInfo(bool recount = true); @@ -154,8 +163,6 @@ public: // HistoryView::ElementDelegate interface. static not_null ElementDelegate(); - ~HistoryInner(); - protected: bool focusNextPrevChild(bool next) override; @@ -337,11 +344,16 @@ private: void deleteAsGroup(FullMsgId itemId); void reportItem(FullMsgId itemId); void reportAsGroup(FullMsgId itemId); - void reportItems(MessageIdsList ids); void blockSenderItem(FullMsgId itemId); void blockSenderAsGroup(FullMsgId itemId); void copySelectedText(); + [[nodiscard]] auto reactionButtonParameters( + not_null view, + QPoint position, + const HistoryView::TextState &reactionState) const + -> HistoryView::Reactions::ButtonParameters; + void setupSharingDisallowed(); [[nodiscard]] bool hasCopyRestriction(HistoryItem *item = nullptr) const; bool showCopyRestriction(HistoryItem *item = nullptr); @@ -394,6 +406,8 @@ private: not_null, std::shared_ptr> _userpics, _userpicsCache; + std::unique_ptr _reactionsManager; + MouseAction _mouseAction = MouseAction::None; TextSelectType _mouseSelectType = TextSelectType::Letters; QPoint _dragStartPosition; @@ -403,6 +417,7 @@ private: CursorState _mouseCursorState = CursorState(); uint16 _mouseTextSymbol = 0; bool _pressWasInactive = false; + bool _recountedAfterPendingResizedItems = false; QPoint _trippleClickPoint; base::Timer _trippleClickTimer; @@ -432,6 +447,8 @@ private: crl::time _touchTime = 0; base::Timer _touchScrollTimer; + Ui::Animations::Simple _spoilerOpacity; + base::unique_qptr _menu; bool _scrollDateShown = false; diff --git a/Telegram/SourceFiles/history/history_item.cpp b/Telegram/SourceFiles/history/history_item.cpp index 5449431e6..0e8c7786e 100644 --- a/Telegram/SourceFiles/history/history_item.cpp +++ b/Telegram/SourceFiles/history/history_item.cpp @@ -11,6 +11,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "lang/lang_keys.h" #include "mainwidget.h" #include "history/view/history_view_element.h" +#include "history/view/history_view_item_preview.h" #include "history/view/history_view_service_message.h" #include "history/history_item_components.h" #include "history/view/media/history_view_media_grouped.h" @@ -38,12 +39,14 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_scheduled_messages.h" // kScheduledUntilOnlineTimestamp #include "data/data_changes.h" #include "data/data_session.h" +#include "data/data_message_reactions.h" #include "data/data_messages.h" #include "data/data_media_types.h" #include "data/data_folder.h" #include "data/data_channel.h" #include "data/data_chat.h" #include "data/data_user.h" +#include "data/data_sponsored_messages.h" #include "styles/style_dialogs.h" #include "styles/style_chat.h" @@ -286,13 +289,17 @@ HistoryItem *HistoryItem::lookupDiscussionPostOriginal() const { return nullptr; } return _history->owner().message( - forwarded->savedFromPeer->asChannel(), + forwarded->savedFromPeer->id, forwarded->savedFromMsgId); } PeerData *HistoryItem::displayFrom() const { if (const auto sender = discussionPostOriginalSender()) { return sender; + } else if (const auto sponsored = Get()) { + if (sponsored->sender) { + return nullptr; + } } else if (const auto forwarded = Get()) { if (history()->peer->isSelf() || history()->peer->isRepliesChat() || forwarded->imported) { return forwarded->originalSender; @@ -376,10 +383,31 @@ void HistoryItem::setIsPinned(bool pinned) { id)); } if (changed) { - history()->owner().requestItemResize(this); + history()->owner().notifyItemDataChange(this); } } +void HistoryItem::returnSavedMedia() { +} + +void HistoryItem::savePreviousMedia() { + Expects(_media != nullptr); + + using Data = SavedMediaData; + _savedLocalEditMediaData = std::make_unique(Data{ + .text = originalText(), + .media = _media->clone(this), + }); +} + +bool HistoryItem::isEditingMedia() const { + return _savedLocalEditMediaData != nullptr; +} + +void HistoryItem::clearSavedMedia() { + _savedLocalEditMediaData = nullptr; +} + bool HistoryItem::definesReplyKeyboard() const { if (const auto markup = Get()) { if (markup->data.flags & ReplyMarkupFlag::Inline) { @@ -462,7 +490,7 @@ bool HistoryItem::isScheduled() const { } bool HistoryItem::isSponsored() const { - return (_flags & MessageFlag::IsSponsored); + return Has(); } bool HistoryItem::skipNotification() const { @@ -524,7 +552,7 @@ void HistoryItem::applySentMessage(const MTPDmessage &data) { }, data.vmedia()); updateReplyMarkup(HistoryMessageMarkupData(data.vreply_markup())); updateForwardedInfo(data.vfwd_from()); - setViewsCount(data.vviews().value_or(-1)); + changeViewsCount(data.vviews().value_or(-1)); if (const auto replies = data.vreplies()) { setReplies(HistoryMessageRepliesData(replies)); } else { @@ -541,6 +569,7 @@ void HistoryItem::applySentMessage(const MTPDmessage &data) { setPostAuthor(data.vpost_author().value_or_empty()); contributeToSlowmode(data.vdate().v); indexAsNewItem(); + history()->owner().notifyItemDataChange(this); history()->owner().requestItemTextRefresh(this); history()->owner().updateDependentMessages(this); } @@ -596,6 +625,7 @@ void HistoryItem::setRealId(MsgId newId) { } } + _history->owner().notifyItemDataChange(this); _history->owner().requestItemRepaint(this); } @@ -742,12 +772,101 @@ bool HistoryItem::suggestDeleteAllReport() const { return !isPost() && !out(); } +bool HistoryItem::canReact() const { + if (!isRegular() || isService()) { + return false; + } else if (const auto media = this->media()) { + if (media->call()) { + return false; + } + } + return true; +} + +void HistoryItem::addReaction(const QString &reaction) { + if (!_reactions) { + _reactions = std::make_unique(this); + } + _reactions->add(reaction); + history()->owner().notifyItemDataChange(this); +} + +void HistoryItem::toggleReaction(const QString &reaction) { + if (!_reactions) { + _reactions = std::make_unique(this); + _reactions->add(reaction); + } else if (_reactions->chosen() == reaction) { + _reactions->remove(); + if (_reactions->empty()) { + _reactions = nullptr; + history()->owner().notifyItemDataChange(this); + } + } else { + _reactions->add(reaction); + } + history()->owner().notifyItemDataChange(this); +} + +void HistoryItem::updateReactions(const MTPMessageReactions *reactions) { + if (reactions || _reactionsLastRefreshed) { + _reactionsLastRefreshed = crl::now(); + } + if (!reactions) { + _flags &= ~MessageFlag::CanViewReactions; + if (_reactions) { + _reactions = nullptr; + history()->owner().notifyItemDataChange(this); + } + return; + } + reactions->match([&](const MTPDmessageReactions &data) { + if (data.is_can_see_list()) { + _flags |= MessageFlag::CanViewReactions; + } else { + _flags &= ~MessageFlag::CanViewReactions; + } + if (data.vresults().v.isEmpty()) { + if (_reactions) { + _reactions = nullptr; + history()->owner().notifyItemDataChange(this); + } + return; + } else if (!_reactions) { + _reactions = std::make_unique(this); + } + _reactions->set(data.vresults().v, data.is_min()); + }); +} + +void HistoryItem::updateReactionsUnknown() { + _reactionsLastRefreshed = 1; +} + +const base::flat_map &HistoryItem::reactions() const { + static const auto kEmpty = base::flat_map(); + return _reactions ? _reactions->list() : kEmpty; +} + +bool HistoryItem::canViewReactions() const { + return (_flags & MessageFlag::CanViewReactions) + && _reactions + && !_reactions->list().empty(); +} + +QString HistoryItem::chosenReaction() const { + return _reactions ? _reactions->chosen() : QString(); +} + +crl::time HistoryItem::lastReactionsRefreshTime() const { + return _reactionsLastRefreshed; +} + bool HistoryItem::hasDirectLink() const { return isRegular() && _history->peer->isChannel(); } -ChannelId HistoryItem::channelId() const { - return _history->channelId(); +FullMsgId HistoryItem::fullId() const { + return FullMsgId(_history->peer->id, id); } Data::MessagePosition HistoryItem::position() const { @@ -787,8 +906,10 @@ PeerData *HistoryItem::senderOriginal() const { return (peer->isChannel() && !peer->isMegagroup()) ? peer : from(); } -const HiddenSenderInfo *HistoryItem::hiddenForwardedInfo() const { - if (const auto forwarded = Get()) { +const HiddenSenderInfo *HistoryItem::hiddenSenderInfo() const { + if (const auto sponsored = Get()) { + return sponsored->sender.get(); + } else if (const auto forwarded = Get()) { return forwarded->hiddenSenderInfo.get(); } return nullptr; @@ -882,6 +1003,7 @@ void HistoryItem::sendFailed() { Expects(!(_flags & MessageFlag::SendingFailed)); _flags = (_flags | MessageFlag::SendingFailed) & ~MessageFlag::BeingSent; + _history->owner().notifyItemDataChange(this); history()->session().changes().historyUpdated( history(), Data::HistoryUpdate::Flag::ClientSideMessages); @@ -958,13 +1080,18 @@ QString HistoryItem::notificationText() const { if (_media && !isService()) { return _media->notificationText(); } else if (!emptyText()) { - return _text.toString(); + return TextUtilities::TextWithSpoilerCommands( + _text.toTextWithEntities()); } return QString(); }(); return (result.size() <= kNotificationTextLimit) ? result - : result.mid(0, kNotificationTextLimit) + qsl("..."); + : TextUtilities::CutTextWithCommands( + result, + kNotificationTextLimit, + textcmdStartSpoiler(), + textcmdStopSpoiler()); } ItemPreview HistoryItem::toPreview(ToPreviewOptions options) const { @@ -972,7 +1099,14 @@ ItemPreview HistoryItem::toPreview(ToPreviewOptions options) const { if (_media) { return _media->toPreview(options); } else if (!emptyText()) { - return { .text = TextUtilities::Clean(_text.toString()) }; + return { + .text = TextUtilities::Clean( + options.ignoreSpoilers + ? _text.toString() + : TextUtilities::TextWithSpoilerCommands( + _text.toTextWithEntities()), + !options.ignoreSpoilers), + }; } return {}; }(); @@ -992,6 +1126,8 @@ ItemPreview HistoryItem::toPreview(ToPreviewOptions options) const { const auto sender = [&]() -> std::optional { if (options.hideSender || isPost() || isEmpty()) { return {}; + } else if (const auto sponsored = Get()) { + return sponsored->sender->name; } else if (!_history->peer->isUser()) { if (const auto from = displayFrom()) { return fromSender(from); @@ -1014,6 +1150,13 @@ ItemPreview HistoryItem::toPreview(ToPreviewOptions options) const { return Dialogs::Ui::PreviewWithSender(std::move(result), fromWrapped); } +QString HistoryItem::inReplyText() const { + return toPreview({ + .hideSender = true, + .generateImages = false, + }).text; +} + Ui::Text::IsolatedEmoji HistoryItem::isolatedEmoji() const { return Ui::Text::IsolatedEmoji(); } @@ -1086,7 +1229,6 @@ MessageFlags FlagsFromMTP( | ((flags & MTP::f_edit_hide) ? Flag::HideEdited : Flag()) | ((flags & MTP::f_pinned) ? Flag::Pinned : Flag()) | ((flags & MTP::f_from_id) ? Flag::HasFromId : Flag()) - | ((flags & MTP::f_via_bot_id) ? Flag::HasViaBot : Flag()) | ((flags & MTP::f_reply_to) ? Flag::HasReplyInfo : Flag()) | ((flags & MTP::f_reply_markup) ? Flag::HasReplyMarkup : Flag()) | ((flags & MTP::f_from_scheduled) ? Flag::IsOrWasScheduled : Flag()) diff --git a/Telegram/SourceFiles/history/history_item.h b/Telegram/SourceFiles/history/history_item.h index 82c1c996c..dae4f898d 100644 --- a/Telegram/SourceFiles/history/history_item.h +++ b/Telegram/SourceFiles/history/history_item.h @@ -43,6 +43,7 @@ struct RippleAnimation; namespace Data { struct MessagePosition; class Media; +class MessageReactions; } // namespace Data namespace Window { @@ -50,38 +51,12 @@ class SessionController; } // namespace Window namespace HistoryView { - struct TextState; struct StateRequest; enum class CursorState : char; enum class PointState : char; enum class Context : char; class ElementDelegate; - -struct ItemPreviewImage { - QImage data; - uint64 cacheKey = 0; - - explicit operator bool() const { - return !data.isNull(); - } -}; - -struct ItemPreview { - QString text; - std::vector images; - int imagesInTextPosition = 0; - std::any loadingContext; -}; - -struct ToPreviewOptions { - const std::vector *existing = nullptr; - bool hideSender = false; - bool hideCaption = false; - bool generateImages = true; - bool ignoreGroup = false; -}; - } // namespace HistoryView struct HiddenSenderInfo; @@ -171,19 +146,10 @@ public: void setIsPinned(bool isPinned); // For edit media in history_message. - virtual void returnSavedMedia() {}; - void savePreviousMedia() { - _savedLocalEditMediaData = { - originalText(), - _media->clone(this), - }; - } - [[nodiscard]] bool isEditingMedia() const { - return _savedLocalEditMediaData.media != nullptr; - } - void clearSavedMedia() { - _savedLocalEditMediaData = {}; - } + virtual void returnSavedMedia(); + void savePreviousMedia(); + [[nodiscard]] bool isEditingMedia() const; + void clearSavedMedia(); // Zero result means this message is not self-destructing right now. virtual crl::time getSelfDestructIn(crl::time now) { @@ -333,12 +299,7 @@ public: // Example: "[link1-start]You:[link1-end] [link1-start]Photo,[link1-end] caption text" [[nodiscard]] virtual ItemPreview toPreview( ToPreviewOptions options) const; - [[nodiscard]] virtual QString inReplyText() const { - return toPreview({ - .hideSender = true, - .generateImages = false, - }).text; - } + [[nodiscard]] virtual QString inReplyText() const; [[nodiscard]] virtual Ui::Text::IsolatedEmoji isolatedEmoji() const; [[nodiscard]] virtual TextWithEntities originalText() const { return TextWithEntities(); @@ -351,7 +312,8 @@ public: return TextForMimeData(); } - virtual void setViewsCount(int count) { + virtual bool changeViewsCount(int count) { + return false; } virtual void setForwardsCount(int count) { } @@ -371,6 +333,8 @@ public: virtual void setRealId(MsgId newId); virtual void incrementReplyToTopCounter() { } + virtual void hideSpoilers() { + } [[nodiscard]] bool emptyText() const { return _text.isEmpty(); @@ -389,12 +353,19 @@ public: [[nodiscard]] bool suggestBanReport() const; [[nodiscard]] bool suggestDeleteAllReport() const; + [[nodiscard]] bool canReact() const; + void addReaction(const QString &reaction); + void toggleReaction(const QString &reaction); + void updateReactions(const MTPMessageReactions *reactions); + void updateReactionsUnknown(); + [[nodiscard]] const base::flat_map &reactions() const; + [[nodiscard]] bool canViewReactions() const; + [[nodiscard]] QString chosenReaction() const; + [[nodiscard]] crl::time lastReactionsRefreshTime() const; + [[nodiscard]] bool hasDirectLink() const; - [[nodiscard]] ChannelId channelId() const; - [[nodiscard]] FullMsgId fullId() const { - return FullMsgId(channelId(), id); - } + [[nodiscard]] FullMsgId fullId() const; [[nodiscard]] Data::MessagePosition position() const; [[nodiscard]] TimeId date() const; @@ -416,7 +387,7 @@ public: [[nodiscard]] TimeId dateOriginal() const; [[nodiscard]] PeerData *senderOriginal() const; - [[nodiscard]] const HiddenSenderInfo *hiddenForwardedInfo() const; + [[nodiscard]] const HiddenSenderInfo *hiddenSenderInfo() const; [[nodiscard]] not_null fromOriginal() const; [[nodiscard]] QString authorOriginal() const; [[nodiscard]] MsgId idOriginal() const; @@ -470,7 +441,7 @@ protected: void finishEditionToEmpty(); const not_null _history; - not_null _from; + const not_null _from; MessageFlags _flags = 0; void invalidateChatListEntry(); @@ -490,8 +461,10 @@ protected: std::unique_ptr media; }; - SavedMediaData _savedLocalEditMediaData; + std::unique_ptr _savedLocalEditMediaData; std::unique_ptr _media; + std::unique_ptr _reactions; + crl::time _reactionsLastRefreshed = 0; private: diff --git a/Telegram/SourceFiles/history/history_item_components.cpp b/Telegram/SourceFiles/history/history_item_components.cpp index 8a3502ba2..c9bef4601 100644 --- a/Telegram/SourceFiles/history/history_item_components.cpp +++ b/Telegram/SourceFiles/history/history_item_components.cpp @@ -85,49 +85,6 @@ void HistoryMessageVia::resize(int32 availw) const { } } -void HistoryMessageSigned::refresh(const QString &date) { - Expects(!isAnonymousRank); - - auto name = author; - const auto time = qsl(", ") + date; - const auto timew = st::msgDateFont->width(time); - const auto namew = st::msgDateFont->width(name); - isElided = (timew + namew > st::maxSignatureSize); - if (isElided) { - name = st::msgDateFont->elided(author, st::maxSignatureSize - timew); - } - signature.setText( - st::msgDateTextStyle, - name + time, - Ui::NameTextOptions()); -} - -int HistoryMessageSigned::maxWidth() const { - return signature.maxWidth(); -} - -void HistoryMessageEdited::refresh(const QString &date, bool displayed) { - const auto prefix = displayed - ? (tr::lng_edited(tr::now) + ' ') - : QString(); - text.setText(st::msgDateTextStyle, prefix + date, Ui::NameTextOptions()); -} - -int HistoryMessageEdited::maxWidth() const { - return text.maxWidth(); -} - -HistoryMessageSponsored::HistoryMessageSponsored() { - text.setText( - st::msgDateTextStyle, - tr::lng_sponsored(tr::now), - Ui::NameTextOptions()); -} - -int HistoryMessageSponsored::maxWidth() const { - return text.maxWidth(); -} - HiddenSenderInfo::HiddenSenderInfo(const QString &name, bool external) : name(name) , colorPeerId(Data::FakePeerIdForJustName(name)) @@ -237,8 +194,8 @@ bool HistoryMessageReply::updateData( if (!replyToMsg) { replyToMsg = holder->history()->owner().message( (replyToPeerId - ? peerToChannel(replyToPeerId) - : holder->channelId()), + ? replyToPeerId + : holder->history()->peer->id), replyToMsgId); if (replyToMsg) { if (replyToMsg->isEmpty()) { diff --git a/Telegram/SourceFiles/history/history_item_components.h b/Telegram/SourceFiles/history/history_item_components.h index 880b10639..7a84be750 100644 --- a/Telegram/SourceFiles/history/history_item_components.h +++ b/Telegram/SourceFiles/history/history_item_components.h @@ -60,30 +60,12 @@ struct HistoryMessageViews : public RuntimeComponent { - void refresh(const QString &date); - int maxWidth() const; - QString author; - Ui::Text::String signature; - bool isElided = false; bool isAnonymousRank = false; }; struct HistoryMessageEdited : public RuntimeComponent { - void refresh(const QString &date, bool displayed); - int maxWidth() const; - TimeId date = 0; - Ui::Text::String text; -}; - -struct HistoryMessageSponsored : public RuntimeComponent< - HistoryMessageSponsored, - HistoryItem> { - HistoryMessageSponsored(); - int maxWidth() const; - - Ui::Text::String text; }; struct HiddenSenderInfo { @@ -120,6 +102,18 @@ struct HistoryMessageForwarded : public RuntimeComponent { + enum class Type : uchar { + User, + Group, + Broadcast, + Post, + Bot, + }; + std::unique_ptr sender; + Type type = Type::User; +}; + struct HistoryMessageReply : public RuntimeComponent { HistoryMessageReply() = default; HistoryMessageReply(const HistoryMessageReply &other) = delete; diff --git a/Telegram/SourceFiles/history/history_item_edition.cpp b/Telegram/SourceFiles/history/history_item_edition.cpp index 78935394a..a9bfd1125 100644 --- a/Telegram/SourceFiles/history/history_item_edition.cpp +++ b/Telegram/SourceFiles/history/history_item_edition.cpp @@ -23,6 +23,7 @@ HistoryMessageEdition::HistoryMessageEdition( }; replyMarkup = HistoryMessageMarkupData(message.vreply_markup()); mtpMedia = message.vmedia(); + mtpReactions = message.vreactions(); views = message.vviews().value_or(-1); forwards = message.vforwards().value_or(-1); if (const auto mtpReplies = message.vreplies()) { diff --git a/Telegram/SourceFiles/history/history_item_edition.h b/Telegram/SourceFiles/history/history_item_edition.h index 8bc25a1d5..10afd3fa3 100644 --- a/Telegram/SourceFiles/history/history_item_edition.h +++ b/Telegram/SourceFiles/history/history_item_edition.h @@ -26,8 +26,10 @@ struct HistoryMessageEdition { int ttl = 0; bool useSameReplies = false; bool useSameMarkup = false; + bool useSameReactions = false; TextWithEntities textWithEntities; HistoryMessageMarkupData replyMarkup; HistoryMessageRepliesData replies; const MTPMessageMedia *mtpMedia = nullptr; + const MTPMessageReactions *mtpReactions = nullptr; }; diff --git a/Telegram/SourceFiles/history/history_message.cpp b/Telegram/SourceFiles/history/history_message.cpp index 5f90e6aa9..6eb1ce720 100644 --- a/Telegram/SourceFiles/history/history_message.cpp +++ b/Telegram/SourceFiles/history/history_message.cpp @@ -20,6 +20,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "history/history_service.h" #include "history/view/history_view_service_message.h" #include "history/view/history_view_context_menu.h" // CopyPostLink. +#include "history/view/history_view_spoiler_click_handler.h" #include "history/view/media/history_view_media.h" // AddTimestampLinks. #include "chat_helpers/stickers_emoji_pack.h" #include "main/main_session.h" @@ -47,6 +48,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_user.h" #include "data/data_histories.h" #include "data/data_web_page.h" +#include "data/data_sponsored_messages.h" #include "styles/style_dialogs.h" #include "styles/style_widgets.h" #include "styles/style_chat.h" @@ -65,9 +67,6 @@ namespace { if (from) { result |= MessageFlag::HasFromId; } - if (fwd->Has()) { - result |= MessageFlag::HasViaBot; - } if (const auto media = fwd->media()) { if ((!peer->isChannel() || peer->isMegagroup()) && media->forwardedBecomesUnread()) { @@ -362,16 +361,15 @@ void RequestDependentMessageData( const auto fullId = item->fullId(); const auto history = item->history(); const auto session = &history->session(); + const auto done = [=] { + if (const auto item = session->data().message(fullId)) { + item->updateDependencyItem(); + } + }; history->session().api().requestMessageData( - (peerIsChannel(peerId) - ? history->owner().channel(peerToChannel(peerId)).get() - : history->peer->asChannel()), + (peerId ? history->owner().peer(peerId) : history->peer), msgId, - [=](ChannelData *channel, MsgId msgId) { - if (const auto item = session->data().message(fullId)) { - item->updateDependencyItem(); - } - }); + done); } MessageFlags NewMessageFlags(not_null peer) { @@ -390,7 +388,7 @@ bool ShouldSendSilent( MsgId LookupReplyToTop(not_null history, MsgId replyToId) { const auto &owner = history->owner(); - if (const auto item = owner.message(history->channelId(), replyToId)) { + if (const auto item = owner.message(history->peer, replyToId)) { return item->replyToTop(); } return 0; @@ -440,7 +438,6 @@ struct HistoryMessage::CreateConfig { HistoryMessageMarkupData markup; HistoryMessageRepliesData replies; bool imported = false; - bool sponsored = false; // For messages created from existing messages (forwarded). const HistoryMessageReplyMarkup *inlineMarkup = nullptr; @@ -520,6 +517,9 @@ HistoryMessage::HistoryMessage( setGroupId( MessageGroupId::FromRaw(history->peer->id, groupedId->v)); } + if (const auto reactions = data.vreactions()) { + updateReactions(reactions); + } applyTTL(data); } @@ -589,7 +589,7 @@ HistoryMessage::HistoryMessage( && (!originalMedia || !originalMedia->forceForwardedInfo())); if (!dropForwardInfo) { config.originalDate = original->dateOriginal(); - if (const auto info = original->hiddenForwardedInfo()) { + if (const auto info = original->hiddenSenderInfo()) { config.senderNameOriginal = info->name; } else if (const auto senderOriginal = original->senderOriginal()) { config.senderOriginal = senderOriginal->id; @@ -787,6 +787,29 @@ HistoryMessage::HistoryMessage( setEmptyText(); } +HistoryMessage::HistoryMessage( + not_null history, + MsgId id, + Data::SponsoredFrom from, + const TextWithEntities &textWithEntities) +: HistoryItem( + history, + id, + ((history->peer->isChannel() ? MessageFlag::Post : MessageFlag(0)) + //| (from.peer ? MessageFlag::HasFromId : MessageFlag(0)) + | MessageFlag::Local), + HistoryItem::NewMessageDate(0), + /*from.peer ? from.peer->id : */PeerId(0)) { + createComponentsHelper( + _flags, + MsgId(0), // replyTo + UserId(0), // viaBotId + QString(), // postAuthor + HistoryMessageMarkupData()); + setText(textWithEntities); + setSponsoredFrom(from); +} + void HistoryMessage::createComponentsHelper( MessageFlags flags, MsgId replyTo, @@ -794,7 +817,7 @@ void HistoryMessage::createComponentsHelper( const QString &postAuthor, HistoryMessageMarkupData &&markup) { auto config = CreateConfig(); - if (flags & MessageFlag::HasViaBot) config.viaBotId = viaBotId; + config.viaBotId = viaBotId; if (flags & MessageFlag::HasReplyInfo) { config.replyTo = replyTo; const auto replyToTop = LookupReplyToTop(history(), replyTo); @@ -803,9 +826,6 @@ void HistoryMessage::createComponentsHelper( config.markup = std::move(markup); if (flags & MessageFlag::HasPostAuthor) config.author = postAuthor; if (flags & MessageFlag::HasViews) config.viewsCount = 1; - if (flags & MessageFlag::IsSponsored) { - config.sponsored = true; - } createComponents(std::move(config)); } @@ -995,28 +1015,35 @@ bool HistoryMessage::areRepliesUnread() const { FullMsgId HistoryMessage::commentsItemId() const { if (const auto views = Get()) { - return FullMsgId(views->commentsMegagroupId, views->commentsRootId); + return FullMsgId( + PeerId(views->commentsMegagroupId), + views->commentsRootId); } return FullMsgId(); } void HistoryMessage::setCommentsItemId(FullMsgId id) { - if (id.channel == _history->channelId()) { + if (id.peer == _history->peer->id) { if (id.msg != this->id) { if (const auto reply = Get()) { reply->replyToMsgTop = id.msg; } } - return; } else if (const auto views = Get()) { - if (views->commentsMegagroupId != id.channel) { - views->commentsMegagroupId = id.channel; - history()->owner().requestItemResize(this); + if (const auto channelId = peerToChannel(id.peer)) { + if (views->commentsMegagroupId != channelId) { + views->commentsMegagroupId = channelId; + history()->owner().requestItemResize(this); + } + views->commentsRootId = id.msg; } - views->commentsRootId = id.msg; } } +void HistoryMessage::hideSpoilers() { + HistoryView::HideSpoilers(_text); +} + bool HistoryMessage::updateDependencyItem() { if (const auto reply = Get()) { const auto documentId = reply->replyToDocumentId; @@ -1108,9 +1135,6 @@ void HistoryMessage::createComponents(CreateConfig &&config) { if (config.editDate != TimeId(0)) { mask |= HistoryMessageEdited::Bit(); } - if (config.sponsored) { - mask |= HistoryMessageSponsored::Bit(); - } if (config.originalDate != 0) { mask |= HistoryMessageForwarded::Bit(); } @@ -1137,7 +1161,7 @@ void HistoryMessage::createComponents(CreateConfig &&config) { via->create(&history()->owner(), config.viaBotId); } if (const auto views = Get()) { - setViewsCount(config.viewsCount); + changeViewsCount(config.viewsCount); if (config.replies.isNull && isSending() && config.markup.isNull()) { @@ -1244,8 +1268,8 @@ void HistoryMessage::returnSavedMedia() { return; } const auto wasGrouped = history()->owner().groups().isGrouped(this); - _media = std::move(_savedLocalEditMediaData.media); - setText(_savedLocalEditMediaData.text); + _media = std::move(_savedLocalEditMediaData->media); + setText(_savedLocalEditMediaData->text); clearSavedMedia(); if (wasGrouped) { history()->owner().groups().refreshMessage(this, true); @@ -1436,7 +1460,10 @@ void HistoryMessage::applyEdition(HistoryMessageEdition &&edition) { if (!isLocalUpdateMedia()) { refreshMedia(edition.mtpMedia); } - setViewsCount(edition.views); + if (!edition.useSameReactions) { + updateReactions(edition.mtpReactions); + } + changeViewsCount(edition.views); setForwardsCount(edition.forwards); setText(_media ? edition.textWithEntities @@ -1462,7 +1489,7 @@ void HistoryMessage::applyEdition(const MTPDmessageService &message) { setReplyMarkup({}); refreshMedia(nullptr); setEmptyText(); - setViewsCount(-1); + changeViewsCount(-1); setForwardsCount(-1); if (wasGrouped) { history()->owner().groups().unregisterMessage(this); @@ -1641,6 +1668,7 @@ void HistoryMessage::setText(const TextWithEntities &textWithEntities) { withLocalEntities(textWithEntities), Ui::ItemTextOptions(this), context); + HistoryView::FillTextWithAnimatedSpoilers(_text); if (!textWithEntities.text.isEmpty() && _text.isEmpty()) { // If server has allowed some text that we've trim-ed entirely, // just replace it with something so that UI won't look buggy. @@ -1757,27 +1785,16 @@ bool HistoryMessage::textHasLinks() const { return emptyText() ? false : _text.hasLinks(); } -void HistoryMessage::setViewsCount(int count) { +bool HistoryMessage::changeViewsCount(int count) { const auto views = Get(); if (!views || views->views.count == count || (count >= 0 && views->views.count > count)) { - return; + return false; } views->views.count = count; - views->views.text = Lang::FormatCountToShort( - std::max(views->views.count, 1) - ).string; - const auto was = views->views.textWidth; - views->views.textWidth = views->views.text.isEmpty() - ? 0 - : st::msgDateFont->width(views->views.text); - if (was == views->views.textWidth) { - history()->owner().requestItemRepaint(this); - } else { - history()->owner().requestItemResize(this); - } + return true; } void HistoryMessage::setForwardsCount(int count) { @@ -1865,7 +1882,6 @@ void HistoryMessage::clearReplies() { void HistoryMessage::refreshRepliesText( not_null views, bool forceResize) { - const auto was = views->replies.textWidth; if (views->commentsMegagroupId) { views->replies.text = (views->replies.count > 0) ? tr::lng_comments_open_count( @@ -1880,15 +1896,8 @@ void HistoryMessage::refreshRepliesText( : QString(); views->repliesSmall.textWidth = st::semiboldFont->width( views->repliesSmall.text); - } else { - views->replies.text = (views->replies.count > 0) - ? Lang::FormatCountToShort(views->replies.count).string - : QString(); - views->replies.textWidth = views->replies.text.isEmpty() - ? 0 - : st::msgDateFont->width(views->replies.text); } - if (forceResize || views->replies.textWidth != was) { + if (forceResize) { history()->owner().requestItemResize(this); } else { history()->owner().requestItemRepaint(this); @@ -1932,6 +1941,7 @@ void HistoryMessage::changeRepliesCount( } } refreshRepliesText(views); + history()->owner().notifyItemDataChange(this); } void HistoryMessage::setUnreadRepliesCount( @@ -1947,6 +1957,25 @@ void HistoryMessage::setUnreadRepliesCount( Data::MessageUpdate::Flag::RepliesUnreadCount); } +void HistoryMessage::setSponsoredFrom(const Data::SponsoredFrom &from) { + AddComponents(HistoryMessageSponsored::Bit()); + const auto sponsored = Get(); + sponsored->sender = std::make_unique( + from.title, + false); + + using Type = HistoryMessageSponsored::Type; + sponsored->type = from.isExactPost + ? Type::Post + : from.isBot + ? Type::Bot + : from.isBroadcast + ? Type::Broadcast + : (from.peer && from.peer->isUser()) + ? Type::User + : Type::Group; +} + void HistoryMessage::setReplyToTop(MsgId replyToTop) { const auto reply = Get(); if (!reply @@ -1984,13 +2013,11 @@ void HistoryMessage::changeReplyToTopCounter( if (!isRegular() || !reply->replyToTop()) { return; } - const auto channelId = history()->channelId(); - if (!channelId) { + const auto peerId = _history->peer->id; + if (!peerIsChannel(peerId)) { return; } - const auto top = history()->owner().message( - channelId, - reply->replyToTop()); + const auto top = _history->owner().message(peerId, reply->replyToTop()); if (!top) { return; } diff --git a/Telegram/SourceFiles/history/history_message.h b/Telegram/SourceFiles/history/history_message.h index ff12ca5b5..37a79dddc 100644 --- a/Telegram/SourceFiles/history/history_message.h +++ b/Telegram/SourceFiles/history/history_message.h @@ -14,6 +14,10 @@ struct SendAction; struct SendOptions; } // namespace Api +namespace Data { +struct SponsoredFrom; +} // namespace Data + namespace HistoryView { class Message; } // namespace HistoryView @@ -117,6 +121,11 @@ public: const QString &postAuthor, not_null game, HistoryMessageMarkupData &&markup); // local game + HistoryMessage( + not_null history, + MsgId id, + Data::SponsoredFrom from, + const TextWithEntities &textWithEntities); // sponsored void refreshMedia(const MTPMessageMedia *media); void refreshSentMedia(const MTPMessageMedia *media); @@ -131,7 +140,7 @@ public: [[nodiscard]] bool allowsSendNow() const override; [[nodiscard]] bool allowsEdit(TimeId now) const override; - void setViewsCount(int count) override; + bool changeViewsCount(int count) override; void setForwardsCount(int count) override; void setReplies(HistoryMessageRepliesData &&data) override; void clearReplies() override; @@ -203,6 +212,7 @@ public: [[nodiscard]] MsgId dependencyMsgId() const override { return replyToId(); } + void hideSpoilers() override; void applySentMessage(const MTPDmessage &data) override; void applySentMessage( @@ -252,6 +262,7 @@ private: void setUnreadRepliesCount( not_null views, int count); + void setSponsoredFrom(const Data::SponsoredFrom &from); static void FillForwardedInfo( CreateConfig &config, @@ -265,10 +276,7 @@ private: [[nodiscard]] bool checkRepliesPts( const HistoryMessageRepliesData &data) const; - QString _timeText; - int _timeWidth = 0; - - mutable int32 _fromNameVersion = 0; + mutable int _fromNameVersion = 0; friend class HistoryView::Element; friend class HistoryView::Message; diff --git a/Telegram/SourceFiles/history/history_service.cpp b/Telegram/SourceFiles/history/history_service.cpp index 52567628e..047fc7a9c 100644 --- a/Telegram/SourceFiles/history/history_service.cpp +++ b/Telegram/SourceFiles/history/history_service.cpp @@ -17,6 +17,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "history/history_message.h" #include "history/history_item_components.h" #include "history/view/history_view_service_message.h" +#include "history/view/history_view_item_preview.h" +#include "history/view/history_view_spoiler_click_handler.h" #include "data/data_folder.h" #include "data/data_session.h" #include "data/data_media_types.h" @@ -615,8 +617,8 @@ bool HistoryService::updateDependent(bool force) { if (!dependent->msg) { dependent->msg = history()->owner().message( (dependent->peerId - ? peerToChannel(dependent->peerId) - : channelId()), + ? dependent->peerId + : _history->peer->id), dependent->msgId); if (dependent->msg) { if (dependent->msg->isEmpty()) { @@ -704,7 +706,8 @@ HistoryService::PreparedText HistoryService::preparePinnedText() { result.links.push_back(fromLink()); result.links.push_back(pinned->lnk); if (mediaText.isEmpty()) { - auto original = pinned->msg->originalText().text; + auto original = TextUtilities::TextWithSpoilerCommands( + pinned->msg->originalText()); auto cutAt = 0; auto limit = kPinnedMessageTextLimit; auto size = original.size(); @@ -718,7 +721,11 @@ HistoryService::PreparedText HistoryService::preparePinnedText() { } } if (!limit && cutAt + 5 < size) { - original = original.mid(0, cutAt) + qstr("..."); + original = TextUtilities::CutTextWithCommands( + std::move(original), + cutAt, + textcmdStartSpoiler(), + textcmdStopSpoiler()); } result.text = tr::lng_action_pinned_message(tr::now, lt_from, fromLinkText(), lt_text, textcmdLink(2, original)); } else { @@ -957,7 +964,9 @@ ItemPreview HistoryService::toPreview(ToPreviewOptions options) const { // Because larger version is shown exactly to the left of the preview. //auto media = _media ? _media->toPreview(options) : ItemPreview(); return { - .text = textcmdLink(1, TextUtilities::Clean(notificationText())), + .text = textcmdLink( + 1, + TextUtilities::Clean(notificationText(), true)), //.images = std::move(media.images), //.loadingContext = std::move(media.loadingContext), }; @@ -1009,6 +1018,7 @@ void HistoryService::setServiceText(const PreparedText &prepared) { st::serviceTextStyle, prepared.text, Ui::ItemTextServiceOptions()); + HistoryView::FillTextWithAnimatedSpoilers(_text); auto linkIndex = 0; for (const auto &link : prepared.links) { // Link indices start with 1. @@ -1018,6 +1028,10 @@ void HistoryService::setServiceText(const PreparedText &prepared) { _textHeight = 0; } +void HistoryService::hideSpoilers() { + HistoryView::HideSpoilers(_text); +} + void HistoryService::markMediaAsReadHook() { if (const auto selfdestruct = Get()) { if (!selfdestruct->destructAt) { @@ -1094,6 +1108,10 @@ void HistoryService::createFromMtp(const MTPDmessage &message) { default: Unexpected("Media type in HistoryService::createFromMtp()"); } + + if (const auto reactions = message.vreactions()) { + updateReactions(reactions); + } } void HistoryService::createFromMtp(const MTPDmessageService &message) { @@ -1275,14 +1293,14 @@ HistoryService::PreparedText GenerateJoinedText( if (inviter->id != history->session().userPeerId()) { auto result = HistoryService::PreparedText{}; result.links.push_back(inviter->createOpenLink()); - result.text = (history->isMegagroup() + result.text = (history->peer->isMegagroup() ? tr::lng_action_add_you_group : tr::lng_action_add_you)( tr::now, lt_from, textcmdLink(1, inviter->name)); return result; - } else if (history->isMegagroup()) { + } else if (history->peer->isMegagroup()) { if (viaRequest) { return { tr::lng_action_you_joined_by_request(tr::now) }; } diff --git a/Telegram/SourceFiles/history/history_service.h b/Telegram/SourceFiles/history/history_service.h index 6df7882a8..1ee82f02a 100644 --- a/Telegram/SourceFiles/history/history_service.h +++ b/Telegram/SourceFiles/history/history_service.h @@ -131,6 +131,8 @@ public: return _needTime; }; + void hideSpoilers() override; + ~HistoryService(); protected: diff --git a/Telegram/SourceFiles/history/history_widget.cpp b/Telegram/SourceFiles/history/history_widget.cpp index 350174879..7d5543ac1 100644 --- a/Telegram/SourceFiles/history/history_widget.cpp +++ b/Telegram/SourceFiles/history/history_widget.cpp @@ -89,6 +89,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "history/view/history_view_pinned_section.h" #include "history/view/history_view_pinned_bar.h" #include "history/view/history_view_group_call_bar.h" +#include "history/view/history_view_item_preview.h" #include "history/view/history_view_requests_bar.h" #include "history/view/media/history_view_media.h" #include "profile/profile_block_group_members.h" @@ -577,18 +578,6 @@ HistoryWidget::HistoryWidget( Window::ActivateWindow(controller); }); - controller->adaptive().changes( - ) | rpl::start_with_next([=] { - if (_history) { - _history->forceFullResize(); - if (_migrated) { - _migrated->forceFullResize(); - } - updateHistoryGeometry(); - update(); - } - }, lifetime()); - session().data().newItemAdded( ) | rpl::start_with_next([=](not_null item) { newItemAdded(item); @@ -606,6 +595,13 @@ HistoryWidget::HistoryWidget( } }, lifetime()); + session().data().itemDataChanges( + ) | rpl::filter([=](not_null item) { + return !_list && (item->mainView() != nullptr); + }) | rpl::start_with_next([=](not_null item) { + item->mainView()->itemDataChanged(); + }, lifetime()); + Core::App().settings().largeEmojiChanges( ) | rpl::start_with_next([=] { crl::on_main(this, [=] { @@ -932,7 +928,7 @@ HistoryWidget::HistoryWidget( return (action.history == _history); }) | rpl::start_with_next([=](const Api::SendAction &action) { const auto lastKeyboardUsed = lastForceReplyReplied(FullMsgId( - action.history->channelId(), + action.history->peer->id, action.replyTo)); if (action.options.scheduled) { cancelReply(lastKeyboardUsed); @@ -1264,7 +1260,7 @@ void HistoryWidget::animatedScrollToItem(MsgId msgId) { updateListSize(); } - auto to = session().data().message(_channel, msgId); + auto to = session().data().message(_history->peer, msgId); if (_list->itemTop(to) < 0) { return; } @@ -1971,18 +1967,22 @@ void HistoryWidget::setReplyReturns(PeerId peer, const QList &replyReturn if (_replyReturns.isEmpty()) { _replyReturn = nullptr; } else if (_replyReturns.back() < 0 && -_replyReturns.back() < ServerMaxMsgId) { - _replyReturn = session().data().message(0, -_replyReturns.back()); + _replyReturn = _migrated + ? session().data().message(_migrated->peer, -_replyReturns.back()) + : nullptr; } else { - _replyReturn = session().data().message(_channel, _replyReturns.back()); + _replyReturn = session().data().message(peer, _replyReturns.back()); } while (!_replyReturns.isEmpty() && !_replyReturn) { _replyReturns.pop_back(); if (_replyReturns.isEmpty()) { _replyReturn = nullptr; } else if (_replyReturns.back() < 0 && -_replyReturns.back() < ServerMaxMsgId) { - _replyReturn = session().data().message(0, -_replyReturns.back()); + _replyReturn = _migrated + ? session().data().message(_migrated->peer, -_replyReturns.back()) + : nullptr; } else { - _replyReturn = session().data().message(_channel, _replyReturns.back()); + _replyReturn = session().data().message(peer, _replyReturns.back()); } } } @@ -1994,9 +1994,13 @@ void HistoryWidget::calcNextReplyReturn() { if (_replyReturns.isEmpty()) { _replyReturn = nullptr; } else if (_replyReturns.back() < 0 && -_replyReturns.back() < ServerMaxMsgId) { - _replyReturn = session().data().message(0, -_replyReturns.back()); + _replyReturn = _migrated + ? session().data().message(_migrated->peer, -_replyReturns.back()) + : nullptr; } else { - _replyReturn = session().data().message(_channel, _replyReturns.back()); + _replyReturn = _peer + ? session().data().message(_peer, _replyReturns.back()) + : nullptr; } } if (!_replyReturn) { @@ -2195,6 +2199,7 @@ void HistoryWidget::showHistory( return; } else { session().data().sponsoredMessages().clearItems(_history); + session().data().hideShownSpoilers(); } session().sendProgressManager().update( _history, @@ -2230,7 +2235,6 @@ void HistoryWidget::showHistory( setHistory(nullptr); _list = nullptr; _peer = nullptr; - _channel = NoChannel; _canSendMessages = false; _silent.destroy(); updateBotKeyboard(); @@ -2261,7 +2265,6 @@ void HistoryWidget::showHistory( if (peerId) { _peer = session().data().peer(peerId); - _channel = peerToChannel(_peer->id); _canSendMessages = _peer->canWrite(); _contactStatus = std::make_unique( controller(), @@ -2314,7 +2317,7 @@ void HistoryWidget::showHistory( refreshTopBarActiveChat(); updateTopBarSelection(); - if (_channel) { + if (_peer->isChannel()) { updateNotifyControls(); session().data().requestNotifySettings(_peer); refreshSilentToggle(); @@ -2340,6 +2343,16 @@ void HistoryWidget::showHistory( object_ptr(this, _scroll, controller(), _history)); _list->show(); + controller()->adaptive().changes( + ) | rpl::start_with_next([=] { + _history->forceFullResize(); + if (_migrated) { + _migrated->forceFullResize(); + } + updateHistoryGeometry(); + update(); + }, _list->lifetime()); + if (_chooseForReport && _chooseForReport->active) { _list->setChooseReportReason(_chooseForReport->reason); } @@ -2421,7 +2434,7 @@ void HistoryWidget::showHistory( if (_history) { controller()->setActiveChatEntry({ _history, - FullMsgId(_history->channelId(), _showAtMsgId) }); + FullMsgId(_history->peer->id, _showAtMsgId) }); } update(); controller()->floatPlayerAreaUpdated(); @@ -2434,6 +2447,12 @@ void HistoryWidget::setHistory(History *history) { return; } unregisterDraftSources(); + if (_history) { + _history->forceFullResize(); + } + if (_migrated) { + _migrated->forceFullResize(); + } _history = history; _migrated = _history ? _history->migrateFrom() : nullptr; registerDraftSource(); @@ -3179,7 +3198,7 @@ void HistoryWidget::firstLoadMessages() { _history->getReadyFor(_showAtMsgId); offset = -loadCount / 2; offsetId = _showAtMsgId; - } else if (_showAtMsgId < 0 && _history->isChannel()) { + } else if (_showAtMsgId < 0 && _history->peer->isChannel()) { if (_showAtMsgId < 0 && -_showAtMsgId < ServerMaxMsgId && _migrated) { _history->getReadyFor(_showAtMsgId); from = _migrated; @@ -3350,7 +3369,7 @@ void HistoryWidget::delayedShowAt(MsgId showAtMsgId) { } else if (_delayedShowAtMsgId > 0) { offset = -loadCount / 2; offsetId = _delayedShowAtMsgId; - } else if (_delayedShowAtMsgId < 0 && _history->isChannel()) { + } else if (_delayedShowAtMsgId < 0 && _history->peer->isChannel()) { if (_delayedShowAtMsgId < 0 && -_delayedShowAtMsgId < ServerMaxMsgId && _migrated) { from = _migrated; offset = -loadCount / 2; @@ -3537,7 +3556,7 @@ void HistoryWidget::showNextUnreadMention() { // See https://github.com/telegramdesktop/tdesktop/issues/5623 if (msgId && already) { const auto item = _history->owner().message( - _history->channelId(), + _history->peer->id, msgId); if (const auto media = item ? item->media() : nullptr) { if (const auto document = media->document()) { @@ -3559,7 +3578,7 @@ void HistoryWidget::saveEditMsg() { return; } - const auto item = session().data().message(_channel, _editMsgId); + const auto item = session().data().message(_history->peer, _editMsgId); if (!item) { cancelEdit(); return; @@ -3889,7 +3908,7 @@ void HistoryWidget::setMsgId(MsgId showAtMsgId) { if (_history) { controller()->setActiveChatEntry({ _history, - FullMsgId(_history->channelId(), _showAtMsgId) }); + FullMsgId(_history->peer->id, _showAtMsgId) }); } } } @@ -4140,8 +4159,8 @@ void HistoryWidget::sendBotCommand(const Bot::SendCommandRequest &request) { } const auto lastKeyboardUsed = (_keyboard->forMsgId() - == FullMsgId(_channel, _history->lastKeyboardId)) - && (_keyboard->forMsgId() == FullMsgId(_channel, request.replyTo)); + == FullMsgId(_peer->id, _history->lastKeyboardId)) + && (_keyboard->forMsgId() == FullMsgId(_peer->id, request.replyTo)); // 'bot' may be nullptr in case of sending from FieldAutocomplete. const auto toSend = (request.replyTo/* || !bot*/) @@ -4173,7 +4192,8 @@ void HistoryWidget::sendBotCommand(const Bot::SendCommandRequest &request) { void HistoryWidget::hideSingleUseKeyboard(PeerData *peer, MsgId replyTo) { if (!_peer || _peer != peer) return; - bool lastKeyboardUsed = (_keyboard->forMsgId() == FullMsgId(_channel, _history->lastKeyboardId)) && (_keyboard->forMsgId() == FullMsgId(_channel, replyTo)); + bool lastKeyboardUsed = (_keyboard->forMsgId() == FullMsgId(_peer->id, _history->lastKeyboardId)) + && (_keyboard->forMsgId() == FullMsgId(_peer->id, replyTo)); if (replyTo) { if (_replyToId == replyTo) { cancelReply(); @@ -4427,7 +4447,11 @@ bool HistoryWidget::updateCmdStartShown() { } bool HistoryWidget::kbWasHidden() const { - return _history && (_keyboard->forMsgId() == FullMsgId(_history->channelId(), _history->lastKeyboardHiddenId)); + return _history + && (_keyboard->forMsgId() + == FullMsgId( + _history->peer->id, + _history->lastKeyboardHiddenId)); } void HistoryWidget::toggleKeyboard(bool manual) { @@ -5581,7 +5605,9 @@ void HistoryWidget::updateBotKeyboard(History *h, bool force) { changed = _keyboard->updateMarkup(_replyEditMsg, force); } else { const auto keyboardItem = _history->lastKeyboardId - ? session().data().message(_channel, _history->lastKeyboardId) + ? session().data().message( + _history->peer, + _history->lastKeyboardId) : nullptr; changed = _keyboard->updateMarkup(keyboardItem, force); } @@ -5592,7 +5618,11 @@ void HistoryWidget::updateBotKeyboard(History *h, bool force) { bool hasMarkup = _keyboard->hasMarkup(), forceReply = _keyboard->forceReply() && (!_replyToId || !_replyEditMsg); if (hasMarkup || forceReply) { - if (_keyboard->singleUse() && _keyboard->hasMarkup() && _keyboard->forMsgId() == FullMsgId(_channel, _history->lastKeyboardId) && _history->lastKeyboardUsed) { + if (_keyboard->singleUse() + && _keyboard->hasMarkup() + && (_keyboard->forMsgId() + == FullMsgId(_history->peer->id, _history->lastKeyboardId)) + && _history->lastKeyboardUsed) { _history->lastKeyboardHiddenId = _history->lastKeyboardId; } if (!isBotStart() && !isBlocked() && _canSendMessages && (wasVisible || (_replyToId && _replyEditMsg) || (!HasSendText(_field) && !kbWasHidden()))) { @@ -5664,8 +5694,8 @@ void HistoryWidget::botCallbackSent(not_null item) { } const auto keyId = _keyboard->forMsgId(); - const auto lastKeyboardUsed = (keyId == FullMsgId(_channel, item->id)) - && (keyId == FullMsgId(_channel, _history->lastKeyboardId)); + const auto lastKeyboardUsed = (keyId == FullMsgId(_peer->id, item->id)) + && (keyId == FullMsgId(_peer->id, _history->lastKeyboardId)); session().data().requestItemRepaint(item); @@ -6028,9 +6058,7 @@ bool HistoryWidget::replyToPreviousMessage() { if (!_history || _editMsgId) { return false; } - const auto fullId = FullMsgId( - _history->channelId(), - _replyToId); + const auto fullId = FullMsgId(_history->peer->id, _replyToId); if (const auto item = session().data().message(fullId)) { if (const auto view = item->mainView()) { if (const auto previousView = view->previousDisplayedInBlocks()) { @@ -6053,9 +6081,7 @@ bool HistoryWidget::replyToNextMessage() { if (!_history || _editMsgId) { return false; } - const auto fullId = FullMsgId( - _history->channelId(), - _replyToId); + const auto fullId = FullMsgId(_history->peer->id, _replyToId); if (const auto item = session().data().message(fullId)) { if (const auto view = item->mainView()) { if (const auto nextView = view->nextDisplayedInBlocks()) { @@ -6153,7 +6179,7 @@ void HistoryWidget::updatePinnedViewer() { : (view->data()->id + (offset > 0 ? 1 : 0)); const auto lastClickedId = !_pinnedClickedId ? (ServerMaxMsgId - 1) - : (!_migrated || _pinnedClickedId.channel) + : (!_migrated || peerIsChannel(_pinnedClickedId.peer)) ? _pinnedClickedId.msg : (_pinnedClickedId.msg - ServerMaxMsgId); if (_pinnedClickedId @@ -6192,57 +6218,6 @@ void HistoryWidget::checkLastPinnedClickedIdReset( } } -bool HistoryWidget::hasHiddenPinnedMessage(not_null peer) { - auto result = false; - auto &session = peer->session(); - const auto migrated = peer->migrateFrom(); - const auto top = Data::ResolveTopPinnedId(peer, migrated); - const auto universal = !top - ? int32(0) - : (migrated && !top.channel) - ? (top.msg - ServerMaxMsgId) - : top.msg; - if (universal) { - const auto hiddenId = session.settings().hiddenPinnedMessageId( - peer->id); - if (hiddenId == universal) { - result = true; - } - } else { - session.api().requestFullPeer(peer); - } - return result; -} - -bool HistoryWidget::switchPinnedHidden(not_null peer, bool hidden) { - auto result = false; - auto &session = peer->session(); - if (hidden) { - const auto migrated = peer->migrateFrom(); - const auto top = Data::ResolveTopPinnedId(peer, migrated); - const auto universal = !top - ? int32(0) - : (migrated && !top.channel) - ? (top.msg - ServerMaxMsgId) - : top.msg; - if (universal) { - session.settings().setHiddenPinnedMessageId(peer->id, universal); - session.saveSettingsDelayed(); - result = true; - } else { - session.api().requestFullPeer(peer); - } - } else { - const auto hiddenId = session.settings().hiddenPinnedMessageId(peer->id); - if (hiddenId != 0) { - session.settings().setHiddenPinnedMessageId(peer->id, 0); - session.saveSettingsDelayed(); - result = true; - } - } - return result; -} - void HistoryWidget::setupPinnedTracker() { Expects(_history != nullptr); @@ -6260,7 +6235,7 @@ void HistoryWidget::checkPinnedBarState() { _migrated ? _migrated->peer.get() : nullptr); const auto universalPinnedId = !currentPinnedId ? int32(0) - : (_migrated && !currentPinnedId.channel) + : (_migrated && !peerIsChannel(currentPinnedId.peer)) ? (currentPinnedId.msg - ServerMaxMsgId) : currentPinnedId.msg; if (universalPinnedId == hiddenId) { @@ -6411,7 +6386,7 @@ void HistoryWidget::refreshPinnedBarButton(bool many) { controller()->showSection( std::make_shared( _history, - ((!_migrated || id.message.channel) + ((!_migrated || peerIsChannel(id.message.peer)) ? id.message.msg : (id.message.msg - ServerMaxMsgId)))); } @@ -6521,13 +6496,14 @@ void HistoryWidget::setupRequestsBar() { } void HistoryWidget::requestMessageData(MsgId msgId) { - const auto callback = [=](ChannelData *channel, MsgId msgId) { - messageDataReceived(channel, msgId); - }; - session().api().requestMessageData( - _peer->asChannel(), - msgId, - crl::guard(this, callback)); + if (!_peer) { + return; + } + const auto peer = _peer; + const auto callback = crl::guard(this, [=] { + messageDataReceived(peer, msgId); + }); + session().api().requestMessageData(_peer, msgId, callback); } bool HistoryWidget::sendExistingDocument( @@ -6831,17 +6807,17 @@ void HistoryWidget::hidePinnedMessage(bool force) { } bool HistoryWidget::lastForceReplyReplied(const FullMsgId &replyTo) const { - if (replyTo.channel != _channel) { - return false; - } - return _keyboard->forceReply() - && _keyboard->forMsgId() == FullMsgId(_channel, _history->lastKeyboardId) + return _peer + && (replyTo.peer == _peer->id) + && _keyboard->forceReply() + && _keyboard->forMsgId() == FullMsgId(_peer->id, _history->lastKeyboardId) && _keyboard->forMsgId().msg == replyTo.msg; } bool HistoryWidget::lastForceReplyReplied() const { - return _keyboard->forceReply() - && _keyboard->forMsgId() == FullMsgId(_channel, _history->lastKeyboardId) + return _peer + && _keyboard->forceReply() + && _keyboard->forMsgId() == FullMsgId(_peer->id, _history->lastKeyboardId) && _keyboard->forMsgId().msg == replyToId(); } @@ -6930,9 +6906,7 @@ void HistoryWidget::cancelEdit() { fieldChanged(); _textUpdateEvents = old; - if (!canWriteMessage()) { - updateControlsVisibility(); - } + updateControlsVisibility(); updateBotKeyboard(); updateFieldPlaceholder(); @@ -7237,10 +7211,11 @@ void HistoryWidget::clearSelected() { } HistoryItem *HistoryWidget::getItemFromHistoryOrMigrated(MsgId genericMsgId) const { - if (genericMsgId < 0 && -genericMsgId < ServerMaxMsgId && _migrated) { - return session().data().message(_migrated->channelId(), -genericMsgId); - } - return session().data().message(_channel, genericMsgId); + return (genericMsgId < 0 && -genericMsgId < ServerMaxMsgId && _migrated) + ? session().data().message(_migrated->peer, -genericMsgId) + : _peer + ? session().data().message(_peer, genericMsgId) + : nullptr; } MessageIdsList HistoryWidget::getSelectedItems() const { @@ -7303,11 +7278,12 @@ void HistoryWidget::updateTopBarSelection() { update(); } -void HistoryWidget::messageDataReceived(ChannelData *channel, MsgId msgId) { - if (!_peer || _peer->asChannel() != channel || !msgId) { +void HistoryWidget::messageDataReceived( + not_null peer, + MsgId msgId) { + if (!_peer || _peer != peer || !msgId) { return; - } - if (_editMsgId == msgId || _replyToId == msgId) { + } else if (_editMsgId == msgId || _replyToId == msgId) { updateReplyEditTexts(true); } } @@ -7343,8 +7319,10 @@ void HistoryWidget::updateReplyEditTexts(bool force) { return; } } - if (!_replyEditMsg) { - _replyEditMsg = session().data().message(_channel, _editMsgId ? _editMsgId : _replyToId); + if (!_replyEditMsg && _peer) { + _replyEditMsg = session().data().message( + _peer->id, + _editMsgId ? _editMsgId : _replyToId); } if (_replyEditMsg) { updateReplyEditText(_replyEditMsg); @@ -7394,7 +7372,7 @@ void HistoryWidget::updateForwardingTexts() { fullname = from->name; } version += from->nameVersion; - } else if (const auto info = item->hiddenForwardedInfo()) { + } else if (const auto info = item->hiddenSenderInfo()) { if (!insertedNames.contains(info->name)) { insertedNames.emplace(info->name); names.push_back(info->firstName); @@ -7468,7 +7446,7 @@ void HistoryWidget::checkForwardingInfo() { for (const auto item : _toForward.items) { if (const auto from = item->senderOriginal()) { version += from->nameVersion; - } else if (const auto info = item->hiddenForwardedInfo()) { + } else if (const auto info = item->hiddenSenderInfo()) { ++version; } else { Unexpected("Corrupt forwarded information in message."); diff --git a/Telegram/SourceFiles/history/history_widget.h b/Telegram/SourceFiles/history/history_widget.h index ade902805..17ca4bf61 100644 --- a/Telegram/SourceFiles/history/history_widget.h +++ b/Telegram/SourceFiles/history/history_widget.h @@ -165,8 +165,6 @@ public: void sendFileConfirmed(const std::shared_ptr &file, const std::optional &oldId = std::nullopt); - static bool hasHiddenPinnedMessage(not_null peer); - static bool switchPinnedHidden(not_null peer, bool hidden); void updateControlsVisibility(); void updateControlsGeometry(); @@ -375,7 +373,7 @@ private: void refreshTopBarActiveChat(); void requestMessageData(MsgId msgId); - void messageDataReceived(ChannelData *channel, MsgId msgId); + void messageDataReceived(not_null peer, MsgId msgId); void addRecentBot(not_null bot); @@ -677,7 +675,6 @@ private: PeerData *_peer = nullptr; - ChannelId _channel = NoChannel; bool _canSendMessages = false; MsgId _showAtMsgId = ShowAtUnreadMsgId; diff --git a/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp b/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp index 374268c3f..d5fc80187 100644 --- a/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp +++ b/Telegram/SourceFiles/history/view/controls/history_view_compose_controls.cpp @@ -368,15 +368,14 @@ void FieldHeader::resolveMessageData() { if (!id) { return; } - const auto channel = id.channel - ? _data->channel(id.channel).get() - : nullptr; - const auto callback = [=](ChannelData *channel, MsgId msgId) { + const auto peer = _data->peer(id.peer); + const auto itemId = id.msg; + const auto callback = crl::guard(this, [=] { const auto now = (isEditingMessage() ? _editMsgId : _replyToId).current(); if (now == id && !_shownMessage) { - if (const auto message = _data->message(channel, msgId)) { + if (const auto message = _data->message(peer, itemId)) { setShownMessage(message); } else if (isEditingMessage()) { _editCancelled.fire({}); @@ -384,11 +383,8 @@ void FieldHeader::resolveMessageData() { _replyCancelled.fire({}); } } - }; - _data->session().api().requestMessageData( - channel, - id.msg, - crl::guard(this, callback)); + }); + _data->session().api().requestMessageData(peer, itemId, callback); } void FieldHeader::previewRequested( @@ -1549,10 +1545,10 @@ void ComposeControls::applyDraft(FieldHistoryAction fieldHistoryAction) { _previewSetState(draft->previewState); if (draft == editDraft) { - _header->editMessage({ _history->channelId(), draft->msgId }); + _header->editMessage({ _history->peer->id, draft->msgId }); _header->replyToMessage({}); } else { - _header->replyToMessage({ _history->channelId(), draft->msgId }); + _header->replyToMessage({ _history->peer->id, draft->msgId }); _header->editMessage({}); } } diff --git a/Telegram/SourceFiles/history/view/history_view_bottom_info.cpp b/Telegram/SourceFiles/history/view/history_view_bottom_info.cpp new file mode 100644 index 000000000..1e5fc9c9a --- /dev/null +++ b/Telegram/SourceFiles/history/view/history_view_bottom_info.cpp @@ -0,0 +1,458 @@ +/* +This file is part of Telegram Desktop, +the official desktop application for the Telegram messaging service. + +For license and copyright information please follow this link: +https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL +*/ +#include "history/view/history_view_bottom_info.h" + +#include "ui/chat/message_bubble.h" +#include "ui/chat/chat_style.h" +#include "ui/text/text_options.h" +#include "ui/text/text_utilities.h" +#include "lang/lang_keys.h" +#include "history/history_item_components.h" +#include "history/history_message.h" +#include "history/history.h" +#include "history/view/history_view_message.h" +#include "history/view/history_view_cursor_state.h" +#include "data/data_message_reactions.h" +#include "styles/style_chat.h" +#include "styles/style_dialogs.h" + +namespace HistoryView { + +BottomInfo::BottomInfo( + not_null<::Data::Reactions*> reactionsOwner, + Data &&data) +: _reactionsOwner(reactionsOwner) +, _data(std::move(data)) { + layout(); +} + +void BottomInfo::update(Data &&data, int availableWidth) { + _data = std::move(data); + layout(); + if (width() > 0) { + resizeGetHeight(std::min(maxWidth(), availableWidth)); + } +} + +int BottomInfo::countReactionsMaxWidth() const { + auto result = 0; + for (const auto &reaction : _reactions) { + result += st::reactionInfoSize; + if (reaction.countTextWidth > 0) { + result += st::reactionInfoSkip + + reaction.countTextWidth + + st::reactionInfoDigitSkip; + } else { + result += st::reactionInfoBetween; + } + } + if (result) { + result += (st::reactionInfoSkip - st::reactionInfoBetween); + } + return result; +} + +int BottomInfo::countReactionsHeight(int newWidth) const { + const auto left = 0; + auto x = 0; + auto y = 0; + auto widthLeft = newWidth; + for (const auto &reaction : _reactions) { + const auto add = (reaction.countTextWidth > 0) + ? st::reactionInfoDigitSkip + : st::reactionInfoBetween; + const auto width = st::reactionInfoSize + + (reaction.countTextWidth > 0 + ? (st::reactionInfoSkip + reaction.countTextWidth) + : 0); + if (x > left && widthLeft < width) { + x = left; + y += st::msgDateFont->height; + widthLeft = newWidth; + } + x += width + add; + widthLeft -= width + add; + } + if (x > left) { + y += st::msgDateFont->height; + } + return y; +} + +int BottomInfo::firstLineWidth() const { + if (height() == minHeight()) { + return width(); + } + return maxWidth() - _reactionsMaxWidth; +} + +bool BottomInfo::isWide() const { + return (_data.flags & Data::Flag::Edited) + || !_data.author.isEmpty() + || !_views.isEmpty() + || !_replies.isEmpty() + || !_reactions.empty(); +} + +TextState BottomInfo::textState( + not_null item, + QPoint position) const { + auto result = TextState(item); + const auto inTime = QRect( + width() - _dateWidth, + 0, + _dateWidth, + st::msgDateFont->height + ).contains(position); + if (inTime) { + result.cursor = CursorState::Date; + } + return result; +} + +bool BottomInfo::isSignedAuthorElided() const { + return _authorElided; +} + +void BottomInfo::paint( + Painter &p, + QPoint position, + int outerWidth, + bool unread, + bool inverted, + const PaintContext &context) const { + const auto st = context.st; + const auto stm = context.messageStyle(); + + auto right = position.x() + width(); + const auto firstLineBottom = position.y() + st::msgDateFont->height; + if (_data.flags & Data::Flag::OutLayout) { + const auto &icon = (_data.flags & Data::Flag::Sending) + ? (inverted + ? st->historySendingInvertedIcon() + : st->historySendingIcon()) + : unread + ? (inverted + ? st->historySentInvertedIcon() + : stm->historySentIcon) + : (inverted + ? st->historyReceivedInvertedIcon() + : stm->historyReceivedIcon); + icon.paint( + p, + QPoint(right, firstLineBottom) + st::historySendStatePosition, + outerWidth); + right -= st::historySendStateSpace; + } + + const auto authorEditedWidth = _authorEditedDate.maxWidth(); + right -= authorEditedWidth; + _authorEditedDate.drawLeft( + p, + right, + position.y(), + authorEditedWidth, + outerWidth); + + if (_data.flags & Data::Flag::Pinned) { + const auto &icon = inverted + ? st->historyPinInvertedIcon() + : stm->historyPinIcon; + right -= st::historyPinWidth; + icon.paint( + p, + right, + firstLineBottom + st::historyPinTop, + outerWidth); + } + if (!_views.isEmpty()) { + const auto viewsWidth = _views.maxWidth(); + right -= st::historyViewsSpace + viewsWidth; + _views.drawLeft(p, right, position.y(), viewsWidth, outerWidth); + + const auto &icon = inverted + ? st->historyViewsInvertedIcon() + : stm->historyViewsIcon; + right -= st::historyViewsWidth; + icon.paint( + p, + right, + firstLineBottom + st::historyViewsTop, + outerWidth); + } + if (!_replies.isEmpty()) { + const auto repliesWidth = _replies.maxWidth(); + right -= st::historyViewsSpace + repliesWidth; + _replies.drawLeft(p, right, position.y(), repliesWidth, outerWidth); + + const auto &icon = inverted + ? st->historyRepliesInvertedIcon() + : stm->historyRepliesIcon; + right -= st::historyViewsWidth; + icon.paint( + p, + right, + firstLineBottom + st::historyViewsTop, + outerWidth); + } + if ((_data.flags & Data::Flag::Sending) + && !(_data.flags & Data::Flag::OutLayout)) { + right -= st::historySendStateSpace; + const auto &icon = inverted + ? st->historyViewsSendingInvertedIcon() + : st->historyViewsSendingIcon(); + icon.paint( + p, + right, + firstLineBottom + st::historyViewsTop, + outerWidth); + } + if (!_reactions.empty()) { + auto left = position.x(); + auto top = position.y(); + auto available = width(); + if (height() != minHeight()) { + available = std::min(available, _reactionsMaxWidth); + left += width() - available; + top += st::msgDateFont->height; + } + paintReactions(p, left, top, available); + } +} + +void BottomInfo::paintReactions( + Painter &p, + int left, + int top, + int availableWidth) const { + auto x = left; + auto y = top; + auto widthLeft = availableWidth; + for (const auto &reaction : _reactions) { + const auto add = (reaction.countTextWidth > 0) + ? st::reactionInfoDigitSkip + : st::reactionInfoBetween; + const auto width = st::reactionInfoSize + + (reaction.countTextWidth > 0 + ? (st::reactionInfoSkip + reaction.countTextWidth) + : 0); + if (x > left && widthLeft < width) { + x = left; + y += st::msgDateFont->height; + widthLeft = availableWidth; + } + if (reaction.image.isNull()) { + reaction.image = _reactionsOwner->resolveImageFor( + reaction.emoji, + ::Data::Reactions::ImageSize::BottomInfo); + } + if (!reaction.image.isNull()) { + p.drawImage( + x, + y + (st::msgDateFont->height - st::reactionInfoSize) / 2, + reaction.image); + } + if (reaction.countTextWidth > 0) { + p.drawText( + x + st::reactionInfoSize + st::reactionInfoSkip, + y + st::msgDateFont->ascent, + reaction.countText); + } + x += width + add; + widthLeft -= width + add; + } +} + +QSize BottomInfo::countCurrentSize(int newWidth) { + if (newWidth >= maxWidth()) { + return optimalSize(); + } + const auto noReactionsWidth = maxWidth() - _reactionsMaxWidth; + accumulate_min(newWidth, std::max(noReactionsWidth, _reactionsMaxWidth)); + return QSize( + newWidth, + st::msgDateFont->height + countReactionsHeight(newWidth)); +} + +void BottomInfo::layout() { + layoutDateText(); + layoutViewsText(); + layoutRepliesText(); + layoutReactionsText(); + initDimensions(); +} + +void BottomInfo::layoutDateText() { + const auto edited = (_data.flags & Data::Flag::Edited) + ? (tr::lng_edited(tr::now) + ' ') + : QString(); + const auto author = _data.author; + const auto prefix = !author.isEmpty() ? qsl(", ") : QString(); + const auto date = edited + _data.date.toString(cTimeFormat()); + _dateWidth = st::msgDateFont->width(date); + const auto afterAuthor = prefix + date; + const auto afterAuthorWidth = st::msgDateFont->width(afterAuthor); + const auto authorWidth = st::msgDateFont->width(author); + const auto maxWidth = st::maxSignatureSize; + _authorElided = !author.isEmpty() + && (authorWidth + afterAuthorWidth > maxWidth); + const auto name = _authorElided + ? st::msgDateFont->elided(author, maxWidth - afterAuthorWidth) + : author; + const auto full = (_data.flags & Data::Flag::Sponsored) + ? tr::lng_sponsored(tr::now) + : name.isEmpty() ? date : (name + afterAuthor); + _authorEditedDate.setText( + st::msgDateTextStyle, + full, + Ui::NameTextOptions()); +} + +void BottomInfo::layoutViewsText() { + if (!_data.views || (_data.flags & Data::Flag::Sending)) { + _views.clear(); + return; + } + _views.setText( + st::msgDateTextStyle, + Lang::FormatCountToShort(std::max(*_data.views, 1)).string, + Ui::NameTextOptions()); +} + +void BottomInfo::layoutRepliesText() { + if (!_data.replies + || !*_data.replies + || (_data.flags & Data::Flag::RepliesContext) + || (_data.flags & Data::Flag::Sending)) { + _replies.clear(); + return; + } + _replies.setText( + st::msgDateTextStyle, + Lang::FormatCountToShort(*_data.replies).string, + Ui::NameTextOptions()); +} + +void BottomInfo::layoutReactionsText() { + if (_data.reactions.empty()) { + _reactions.clear(); + return; + } + auto sorted = ranges::view::all( + _data.reactions + ) | ranges::view::transform([](const auto &pair) { + return std::make_pair(pair.first, pair.second); + }) | ranges::to_vector; + ranges::sort(sorted, std::greater<>(), &std::pair::second); + + auto reactions = std::vector(); + reactions.reserve(sorted.size()); + for (const auto &[emoji, count] : sorted) { + const auto i = ranges::find(_reactions, emoji, &Reaction::emoji); + reactions.push_back((i != end(_reactions)) + ? std::move(*i) + : prepareReactionWithEmoji(emoji)); + setReactionCount(reactions.back(), count); + } + _reactions = std::move(reactions); +} + +QSize BottomInfo::countOptimalSize() { + auto width = 0; + if (_data.flags & (Data::Flag::OutLayout | Data::Flag::Sending)) { + width += st::historySendStateSpace; + } + width += _authorEditedDate.maxWidth(); + if (!_views.isEmpty()) { + width += st::historyViewsSpace + + _views.maxWidth() + + st::historyViewsWidth; + } + if (!_replies.isEmpty()) { + width += st::historyViewsSpace + + _replies.maxWidth() + + st::historyViewsWidth; + } + if (_data.flags & Data::Flag::Pinned) { + width += st::historyPinWidth; + } + _reactionsMaxWidth = countReactionsMaxWidth(); + width += _reactionsMaxWidth; + return QSize(width, st::msgDateFont->height); +} + +BottomInfo::Reaction BottomInfo::prepareReactionWithEmoji( + const QString &emoji) { + auto result = Reaction{ .emoji = emoji }; + _reactionsOwner->preloadImageFor(emoji); + return result; +} + +void BottomInfo::setReactionCount(Reaction &reaction, int count) { + if (reaction.count == count) { + return; + } + reaction.count = count; + reaction.countText = (count > 1) + ? Lang::FormatCountToShort(count).string + : QString(); + reaction.countTextWidth = (count > 1) + ? st::msgDateFont->width(reaction.countText) + : 0; +} + +BottomInfo::Data BottomInfoDataFromMessage(not_null message) { + using Flag = BottomInfo::Data::Flag; + const auto item = message->message(); + + auto result = BottomInfo::Data(); + result.date = message->dateTime(); + if (message->embedReactionsInBottomInfo()) { + result.reactions = item->reactions(); + } + if (message->hasOutLayout()) { + result.flags |= Flag::OutLayout; + } + if (message->context() == Context::Replies) { + result.flags |= Flag::RepliesContext; + } + if (item->isSponsored()) { + result.flags |= Flag::Sponsored; + } + if (item->isPinned() && message->context() != Context::Pinned) { + result.flags |= Flag::Pinned; + } + if (const auto msgsigned = item->Get()) { + if (!msgsigned->isAnonymousRank) { + result.author = msgsigned->author; + } + } + if (!item->hideEditedBadge()) { + if (const auto edited = message->displayedEditBadge()) { + result.flags |= Flag::Edited; + } + } + if (const auto views = item->Get()) { + if (views->views.count >= 0) { + result.views = views->views.count; + } + if (views->replies.count >= 0 && !views->commentsMegagroupId) { + result.replies = views->replies.count; + } + } + if (item->isSending() || item->hasFailed()) { + result.flags |= Flag::Sending; + } + // We don't want to pass and update it in Date for now. + //if (item->unread()) { + // result.flags |= Flag::Unread; + //} + return result; +} + +} // namespace HistoryView diff --git a/Telegram/SourceFiles/history/view/history_view_bottom_info.h b/Telegram/SourceFiles/history/view/history_view_bottom_info.h new file mode 100644 index 000000000..a44b035d0 --- /dev/null +++ b/Telegram/SourceFiles/history/view/history_view_bottom_info.h @@ -0,0 +1,114 @@ +/* +This file is part of Telegram Desktop, +the official desktop application for the Telegram messaging service. + +For license and copyright information please follow this link: +https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL +*/ +#pragma once + +#include "history/view/history_view_object.h" +#include "ui/text/text.h" +#include "base/flags.h" + +namespace Ui { +struct ChatPaintContext; +} // namespace Ui + +namespace Data { +class Reactions; +} // namespace Data + +namespace HistoryView { + +using PaintContext = Ui::ChatPaintContext; + +class Message; +struct TextState; + +class BottomInfo final : public Object { +public: + struct Data { + enum class Flag : uchar { + Edited = 0x01, + OutLayout = 0x02, + Sending = 0x04, + RepliesContext = 0x08, + Sponsored = 0x10, + Pinned = 0x20, + //Unread, // We don't want to pass and update it in Date for now. + }; + friend inline constexpr bool is_flag_type(Flag) { return true; }; + using Flags = base::flags; + + QDateTime date; + QString author; + base::flat_map reactions; + std::optional views; + std::optional replies; + Flags flags; + }; + BottomInfo(not_null<::Data::Reactions*> reactionsOwner, Data &&data); + + void update(Data &&data, int availableWidth); + + [[nodiscard]] int firstLineWidth() const; + [[nodiscard]] bool isWide() const; + [[nodiscard]] TextState textState( + not_null item, + QPoint position) const; + [[nodiscard]] bool isSignedAuthorElided() const; + + void paint( + Painter &p, + QPoint position, + int outerWidth, + bool unread, + bool inverted, + const PaintContext &context) const; + +private: + struct Reaction { + mutable QImage image; + QString emoji; + QString countText; + int count = 0; + int countTextWidth = 0; + }; + + void layout(); + void layoutDateText(); + void layoutViewsText(); + void layoutRepliesText(); + void layoutReactionsText(); + + [[nodiscard]] int countReactionsMaxWidth() const; + [[nodiscard]] int countReactionsHeight(int newWidth) const; + void paintReactions( + Painter &p, + int left, + int top, + int availableWidth) const; + + QSize countOptimalSize() override; + QSize countCurrentSize(int newWidth) override; + + void setReactionCount(Reaction &reaction, int count); + [[nodiscard]] Reaction prepareReactionWithEmoji(const QString &emoji); + + const not_null<::Data::Reactions*> _reactionsOwner; + Data _data; + Ui::Text::String _authorEditedDate; + Ui::Text::String _views; + Ui::Text::String _replies; + std::vector _reactions; + int _reactionsMaxWidth = 0; + int _dateWidth = 0; + bool _authorElided = false; + +}; + +[[nodiscard]] BottomInfo::Data BottomInfoDataFromMessage( + not_null message); + +} // namespace HistoryView diff --git a/Telegram/SourceFiles/history/view/history_view_context_menu.cpp b/Telegram/SourceFiles/history/view/history_view_context_menu.cpp index 94656658d..9fe715d17 100644 --- a/Telegram/SourceFiles/history/view/history_view_context_menu.cpp +++ b/Telegram/SourceFiles/history/view/history_view_context_menu.cpp @@ -10,6 +10,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "api/api_attached_stickers.h" #include "api/api_editing.h" #include "api/api_polls.h" +#include "api/api_who_reacted.h" #include "api/api_toggling_media.h" // Api::ToggleFavedSticker #include "base/unixtime.h" #include "history/view/history_view_list_widget.h" @@ -21,10 +22,12 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "history/view/history_view_schedule_box.h" #include "history/view/media/history_view_media.h" #include "history/view/media/history_view_web_page.h" +#include "history/view/reactions/message_reactions_list.h" #include "ui/widgets/popup_menu.h" #include "ui/image/image.h" #include "ui/toast/toast.h" #include "ui/controls/delete_message_context_action.h" +#include "ui/controls/who_reacted_context_action.h" #include "ui/boxes/report_box.h" #include "ui/ui_utility.h" #include "chat_helpers/send_context_menu.h" @@ -53,6 +56,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "main/main_session_settings.h" #include "apiwrap.h" #include "facades.h" +#include "styles/style_chat.h" +#include "styles/style_menu_icons.h" #include #include @@ -137,13 +142,14 @@ void AddPhotoActions( App::LambdaDelayed( st::defaultDropdownMenu.menu.ripple.hideDuration, &photo->session(), - [=] { SavePhotoToFile(photo); })); + [=] { SavePhotoToFile(photo); }), + &st::menuIconSaveImage); menu->addAction(tr::lng_context_copy_image(tr::now), [=] { const auto item = photo->owner().message(contextId); if (!list->showCopyRestriction(item)) { CopyImage(photo); } - }); + }, &st::menuIconCopy); } if (photo->hasAttachedStickers()) { const auto controller = list->controller(); @@ -153,7 +159,8 @@ void AddPhotoActions( }; menu->addAction( tr::lng_context_attached_stickers(tr::now), - std::move(callback)); + std::move(callback), + &st::menuIconStickers); } } @@ -218,7 +225,8 @@ void AddSaveDocumentAction( App::LambdaDelayed( st::defaultDropdownMenu.menu.ripple.hideDuration, &document->session(), - save)); + save), + &st::menuIconDownload); } void AddDocumentActions( @@ -229,7 +237,7 @@ void AddDocumentActions( if (document->loading()) { menu->addAction(tr::lng_context_cancel_download(tr::now), [=] { document->cancel(); - }); + }, &st::menuIconCancel); return; } const auto contextId = item ? item->fullId() : FullMsgId(); @@ -245,12 +253,12 @@ void AddDocumentActions( if (notAutoplayedGif) { menu->addAction(tr::lng_context_open_gif(tr::now), [=] { OpenGif(list->controller(), contextId); - }); + }, &st::menuIconShowInChat); } if (document->isGifv() && !list->hasCopyRestriction(item)) { menu->addAction(tr::lng_context_save_gif(tr::now), [=] { SaveGif(list->controller(), contextId); - }); + }, &st::menuIconGif); } } if (document->sticker() && document->sticker()->set) { @@ -258,19 +266,23 @@ void AddDocumentActions( (document->isStickerSetInstalled() ? tr::lng_context_pack_info(tr::now) : tr::lng_context_pack_add(tr::now)), - [=] { ShowStickerPackInfo(document, list); }); + [=] { ShowStickerPackInfo(document, list); }, + &st::menuIconStickers); + const auto isFaved = document->owner().stickers().isFaved(document); menu->addAction( - (document->owner().stickers().isFaved(document) + (isFaved ? tr::lng_faved_stickers_remove(tr::now) : tr::lng_faved_stickers_add(tr::now)), - [=] { ToggleFavedSticker(document, contextId); }); + [=] { ToggleFavedSticker(document, contextId); }, + isFaved ? &st::menuIconUnfave : &st::menuIconFave); } if (!document->filepath(true).isEmpty()) { menu->addAction( (Platform::IsMac() ? tr::lng_context_show_in_finder(tr::now) : tr::lng_context_show_in_folder(tr::now)), - [=] { ShowInFolder(document); }); + [=] { ShowInFolder(document); }, + &st::menuIconShowInFolder); } if (document->hasAttachedStickers()) { const auto controller = list->controller(); @@ -280,7 +292,8 @@ void AddDocumentActions( }; menu->addAction( tr::lng_context_attached_stickers(tr::now), - std::move(callback)); + std::move(callback), + &st::menuIconStickers); } AddSaveDocumentAction(menu, item, document, list); } @@ -306,7 +319,8 @@ void AddPostLinkAction( (item->history()->peer->isMegagroup() ? tr::lng_context_copy_message_link : tr::lng_context_copy_post_link)(tr::now), - [=] { CopyPostLink(session, itemId, context); }); + [=] { CopyPostLink(session, itemId, context); }, + &st::menuIconLink); } MessageIdsList ExtractIdsList(const SelectedItems &items) { @@ -339,7 +353,7 @@ bool AddForwardSelectedAction( request.navigation, ExtractIdsList(request.selectedItems), callback); - }); + }, &st::menuIconForward); return true; } @@ -371,7 +385,7 @@ bool AddForwardMessageAction( ? owner->itemOrItsGroup(item) : MessageIdsList{ 1, itemId })); } - }); + }, &st::menuIconForward); return true; } @@ -419,7 +433,7 @@ bool AddSendNowSelectedAction( history, ExtractIdsList(request.selectedItems), callback); - }); + }, &st::menuIconSend); return true; } @@ -452,7 +466,7 @@ bool AddSendNowMessageAction( ? owner->itemOrItsGroup(item) : MessageIdsList{ 1, itemId })); } - }); + }, &st::menuIconSend); return true; } @@ -543,7 +557,7 @@ bool AddRescheduleAction( box->closeBox(); } }, box->lifetime()); - }); + }, &st::menuIconReschedule); return true; } @@ -567,7 +581,7 @@ bool AddReplyToMessageAction( return; } list->replyToMessageRequestNotify(item->fullId()); - }); + }, &st::menuIconReply); return true; } @@ -598,7 +612,7 @@ bool AddViewRepliesAction( const auto history = item->history(); menu->addAction(phrase, crl::guard(controller, [=] { controller->showRepliesForMessage(history, rootId); - })); + }), &st::menuIconViewReplies); return true; } @@ -621,7 +635,7 @@ bool AddEditMessageAction( return; } list->editMessageRequestNotify(item->fullId()); - }); + }, &st::menuIconEdit); return true; } @@ -648,7 +662,7 @@ bool AddPinMessageAction( const auto controller = list->controller(); menu->addAction(isPinned ? tr::lng_context_unpin_msg(tr::now) : tr::lng_context_pin_msg(tr::now), crl::guard(controller, [=] { Window::ToggleMessagePinned(controller, pinItemId, !isPinned); - })); + }), isPinned ? &st::menuIconUnpin : &st::menuIconPin); return true; } @@ -671,7 +685,7 @@ bool AddGoToMessageAction( if (item) { goToMessageClickHandler(item)->onClick(ClickContext{}); } - })); + }), &st::menuIconShowInChat); return true; } @@ -703,7 +717,7 @@ bool AddDeleteSelectedAction( list->cancelSelection(); })); request.navigation->parentController()->show(std::move(box)); - }); + }, &st::menuIconDelete); return true; } @@ -752,7 +766,8 @@ bool AddDeleteMessageAction( if (item->isUploading()) { menu->addAction( tr::lng_context_cancel_upload(tr::now), - callback); + callback, + &st::menuIconCancel); return true; } menu->addAction(Ui::DeleteMessageContextAction( @@ -795,7 +810,10 @@ void AddReportAction( : MessageIdsList{ 1, itemId })); } }); - menu->addAction(tr::lng_context_report_msg(tr::now), callback); + menu->addAction( + tr::lng_context_report_msg(tr::now), + callback, + &st::menuIconReport); } bool AddClearSelectionAction( @@ -807,7 +825,7 @@ bool AddClearSelectionAction( } menu->addAction(tr::lng_context_clear_selection(tr::now), [=] { list->cancelSelection(); - }); + }, &st::menuIconSelect); return true; } @@ -835,7 +853,7 @@ bool AddSelectMessageAction( list->selectItem(item); } } - }); + }, &st::menuIconSelect); return true; } @@ -885,7 +903,8 @@ void AddCopyLinkAction( const auto text = link->copyToClipboardText(); menu->addAction( action, - [=] { QGuiApplication::clipboard()->setText(text); }); + [=] { QGuiApplication::clipboard()->setText(text); }, + &st::menuIconCopy); } } // namespace @@ -898,8 +917,6 @@ ContextMenuRequest::ContextMenuRequest( base::unique_qptr FillContextMenu( not_null list, const ContextMenuRequest &request) { - auto result = base::make_unique_q(list); - const auto link = request.link; const auto view = request.view; const auto item = request.item; @@ -916,6 +933,11 @@ base::unique_qptr FillContextMenu( : nullptr; const auto hasSelection = !request.selectedItems.empty() || !request.selectedText.empty(); + const auto hasWhoReactedItem = item && Api::WhoReactedExists(item); + + auto result = base::make_unique_q( + list, + hasWhoReactedItem ? st::whoReadMenu : st::popupMenuWithIcons); if (request.overSelection && !list->hasCopyRestrictionForSelected()) { const auto text = request.selectedItems.empty() @@ -925,7 +947,7 @@ base::unique_qptr FillContextMenu( if (!list->showCopyRestrictionForSelected()) { TextUtilities::SetClipboardText(list->getSelectedText()); } - }); + }, &st::menuIconCopy); } AddTopMessageActions(result, request, list); @@ -958,12 +980,17 @@ base::unique_qptr FillContextMenu( TextUtilities::SetClipboardText(HistoryItemText(item)); } } - }); + }, &st::menuIconCopy); } } AddCopyLinkAction(result, link); AddMessageActions(result, request, list); + + if (hasWhoReactedItem) { + AddWhoReactedAction(result, list, item, list->controller()); + } + return result; } @@ -986,7 +1013,7 @@ void CopyPostLink( Assert(channel != nullptr); if (const auto rootId = item->replyToTop()) { const auto root = item->history()->owner().message( - peerToChannel(channel->id), + channel->id, rootId); const auto sender = root ? root->discussionPostOriginalSender() @@ -1034,15 +1061,47 @@ void AddPollActions( if (poll->voted() && !poll->quiz()) { menu->addAction(tr::lng_polls_retract(tr::now), [=] { poll->session().api().polls().sendVotes(itemId, {}); - }); + }, &st::menuIconRetractVote); } if (item->canStopPoll()) { menu->addAction(tr::lng_polls_stop(tr::now), [=] { StopPoll(&poll->session(), itemId); - }); + }, &st::menuIconStopPoll); } } +void AddWhoReactedAction( + not_null menu, + not_null context, + not_null item, + not_null controller) { + const auto participantChosen = [=](uint64 id) { + controller->showPeerInfo(PeerId(id)); + }; + const auto weak = Ui::MakeWeak(menu.get()); + const auto showAllChosen = [=, itemId = item->fullId()]{ + // Pressing on an item that has a submenu doesn't hide it :( + if (const auto strong = weak.data()) { + strong->hideMenu(); + } + if (const auto item = controller->session().data().message(itemId)) { + controller->window().show(ReactionsListBox( + controller, + item, + QString())); + } + }; + if (!menu->empty()) { + menu->addSeparator(); + } + menu->addAction(Ui::WhoReactedContextAction( + menu.get(), + Api::WhoReacted(item, context, st::defaultWhoRead), + participantChosen, + showAllChosen, + cUserpicCornersType())); +} + void ShowReportItemsBox(not_null peer, MessageIdsList ids) { const auto chosen = [=](Ui::ReportReason reason) { Ui::show(Box(Ui::ReportDetailsBox, [=](const QString &text) { diff --git a/Telegram/SourceFiles/history/view/history_view_context_menu.h b/Telegram/SourceFiles/history/view/history_view_context_menu.h index b95f8ad7f..54ec85d63 100644 --- a/Telegram/SourceFiles/history/view/history_view_context_menu.h +++ b/Telegram/SourceFiles/history/view/history_view_context_menu.h @@ -60,6 +60,11 @@ void AddPollActions( not_null poll, not_null item, Context context); +void AddWhoReactedAction( + not_null menu, + not_null context, + not_null item, + not_null controller); void ShowReportItemsBox(not_null peer, MessageIdsList ids); void ShowReportPeerBox( diff --git a/Telegram/SourceFiles/history/view/history_view_element.cpp b/Telegram/SourceFiles/history/view/history_view_element.cpp index a005215ca..2fe825a53 100644 --- a/Telegram/SourceFiles/history/view/history_view_element.cpp +++ b/Telegram/SourceFiles/history/view/history_view_element.cpp @@ -8,6 +8,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "history/view/history_view_element.h" #include "kotato/kotato_lang.h" +#include "api/api_chat_invite.h" #include "history/view/history_view_service_message.h" #include "history/view/history_view_message.h" #include "history/history_item_components.h" @@ -16,6 +17,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "history/view/media/history_view_media_grouped.h" #include "history/view/media/history_view_sticker.h" #include "history/view/media/history_view_large_emoji.h" +#include "history/view/history_view_react_button.h" +#include "history/view/history_view_cursor_state.h" #include "history/history.h" #include "base/unixtime.h" #include "core/application.h" @@ -32,6 +35,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_session.h" #include "data/data_groups.h" #include "data/data_media_types.h" +#include "data/data_sponsored_messages.h" #include "lang/lang_keys.h" #include "app.h" #include "styles/style_chat.h" @@ -42,7 +46,7 @@ namespace { // A new message from the same sender is attached to previous within 15 minutes. constexpr int kAttachMessageToPreviousSecondsDelta = 900; -bool IsAttachedToPreviousInSavedMessages( +[[nodiscard]] bool IsAttachedToPreviousInSavedMessages( not_null previous, HistoryMessageForwarded *prevForwarded, not_null item, @@ -62,6 +66,22 @@ bool IsAttachedToPreviousInSavedMessages( return (*previousInfo == *itemInfo); } +[[nodiscard]] Window::SessionController *ContextOrSessionWindow( + const ClickHandlerContext &context, + not_null session) { + if (const auto controller = context.sessionWindow.get()) { + return controller; + } + const auto &windows = session->windows(); + if (windows.empty()) { + session->domain().activate(&session->account()); + if (windows.empty()) { + return nullptr; + } + } + return windows.front(); +} + } // namespace std::unique_ptr MakePathShiftGradient( @@ -180,11 +200,13 @@ auto SimpleElementDelegate::elementPathShiftGradient() void SimpleElementDelegate::elementReplyTo(const FullMsgId &to) { } - void SimpleElementDelegate::elementStartInteraction( not_null view) { } +void SimpleElementDelegate::elementShowSpoilerAnimation() { +} + TextSelection UnshiftItemSelection( TextSelection selection, uint16 byLength) { @@ -232,8 +254,8 @@ QString DateTooltipText(not_null view) { + "\n\n" + dateText; } } - if (const auto msgsigned = view->data()->Get()) { - if (msgsigned->isElided && !msgsigned->isAnonymousRank) { + if (view->isSignedAuthorElided()) { + if (const auto msgsigned = view->data()->Get()) { dateText += '\n' + tr::lng_signed_author(tr::now, lt_user, msgsigned->author); } @@ -474,6 +496,14 @@ int Element::plainMaxWidth() const { return 0; } +int Element::bottomInfoFirstLineWidth() const { + return 0; +} + +bool Element::bottomInfoIsWide() const { + return false; +} + bool Element::isHiddenByGroup() const { return _flags & Flag::HiddenByGroup; } @@ -537,6 +567,13 @@ void Element::nextInBlocksRemoved() { setAttachToNext(false); } +bool Element::markSponsoredViewed(int shownFromTop) const { + const auto sponsoredTextTop = height() + - st::msgPadding.bottom() + - st::historyViewButtonHeight; + return shownFromTop >= sponsoredTextTop; +} + void Element::refreshDataId() { if (const auto media = this->media()) { media->refreshParentId(data()); @@ -586,28 +623,34 @@ ClickHandlerPtr Element::fromLink() const { return _fromLink; } const auto item = data(); - if (const auto from = item->displayFrom()) { + if (item->isSponsored()) { + const auto session = &item->history()->session(); _fromLink = std::make_shared([=]( ClickContext context) { if (context.button != Qt::LeftButton) { return; } const auto my = context.other.value(); - const auto window = [&]() -> Window::SessionController* { - if (const auto controller = my.sessionWindow.get()) { - return controller; + if (const auto window = ContextOrSessionWindow(my, session)) { + auto &sponsored = session->data().sponsoredMessages(); + const auto details = sponsored.lookupDetails(my.itemId); + if (const auto &hash = details.hash) { + Api::CheckChatInvite(window, *hash); + } else if (const auto peer = details.peer) { + window->showPeerInfo(peer); } - const auto session = &from->session(); - const auto &windows = session->windows(); - if (windows.empty()) { - session->domain().activate(&session->account()); - if (windows.empty()) { - return nullptr; - } - } - return windows.front(); - }(); - if (window) { + } + }); + return _fromLink; + } else if (const auto from = item->displayFrom()) { + _fromLink = std::make_shared([=]( + ClickContext context) { + if (context.button != Qt::LeftButton) { + return; + } + const auto my = context.other.value(); + const auto session = &from->session(); + if (const auto window = ContextOrSessionWindow(my, session)) { window->showPeerInfo(from); } }); @@ -849,6 +892,13 @@ void Element::checkHeavyPart() { } } +bool Element::isSignedAuthorElided() const { + return false; +} + +void Element::itemDataChanged() { +} + void Element::unloadHeavyPart() { history()->owner().unregisterHeavyViewPart(this); if (_media) { @@ -953,12 +1003,12 @@ void Element::drawInfo( InfoDisplayType type) const { } -bool Element::pointInTime( +TextState Element::bottomInfoTextState( int right, int bottom, QPoint point, InfoDisplayType type) const { - return false; + return TextState(); } TextSelection Element::adjustSelection( @@ -967,6 +1017,12 @@ TextSelection Element::adjustSelection( return selection; } +Reactions::ButtonParameters Element::reactionButtonParameters( + QPoint position, + const TextState &reactionState) const { + return {}; +} + void Element::clickHandlerActiveChanged( const ClickHandlerPtr &handler, bool active) { diff --git a/Telegram/SourceFiles/history/view/history_view_element.h b/Telegram/SourceFiles/history/view/history_view_element.h index 8ee9cd581..f67014c11 100644 --- a/Telegram/SourceFiles/history/view/history_view_element.h +++ b/Telegram/SourceFiles/history/view/history_view_element.h @@ -18,6 +18,10 @@ class HistoryMessage; class HistoryService; struct HistoryMessageReply; +namespace Data { +struct Reaction; +} // namespace Data + namespace Window { class SessionController; } // namespace Window @@ -39,6 +43,10 @@ class Media; using PaintContext = Ui::ChatPaintContext; +namespace Reactions { +struct ButtonParameters; +} // namespace Reactions + enum class Context : char { History, Replies, @@ -91,6 +99,7 @@ public: virtual not_null elementPathShiftGradient() = 0; virtual void elementReplyTo(const FullMsgId &to) = 0; virtual void elementStartInteraction(not_null view) = 0; + virtual void elementShowSpoilerAnimation() = 0; virtual ~ElementDelegate() { } @@ -148,6 +157,7 @@ public: not_null elementPathShiftGradient() override; void elementReplyTo(const FullMsgId &to) override; void elementStartInteraction(not_null view) override; + void elementShowSpoilerAnimation() override; protected: [[nodiscard]] not_null controller() const { @@ -262,6 +272,8 @@ public: QString skipBlock() const; virtual int infoWidth() const; virtual int plainMaxWidth() const; + virtual int bottomInfoFirstLineWidth() const; + virtual bool bottomInfoIsWide() const; bool isHiddenByGroup() const; virtual bool isHidden() const; @@ -298,7 +310,7 @@ public: int bottom, int width, InfoDisplayType type) const; - virtual bool pointInTime( + virtual TextState bottomInfoTextState( int right, int bottom, QPoint point, @@ -309,6 +321,10 @@ public: TextSelection selection, TextSelectType type) const; + [[nodiscard]] virtual auto reactionButtonParameters( + QPoint position, + const TextState &reactionState) const -> Reactions::ButtonParameters; + // ClickHandlerHost interface. void clickHandlerActiveChanged( const ClickHandlerPtr &handler, @@ -319,31 +335,31 @@ public: // hasFromPhoto() returns true even if we don't display the photo // but we need to skip a place at the left side for this photo - virtual bool hasFromPhoto() const; - virtual bool displayFromPhoto() const; - virtual bool hasFromName() const; - virtual bool displayFromName() const; - virtual bool displayForwardedFrom() const; - virtual bool hasOutLayout() const; - virtual bool drawBubble() const; - virtual bool hasBubble() const; - virtual int minWidthForMedia() const { + [[nodiscard]] virtual bool hasFromPhoto() const; + [[nodiscard]] virtual bool displayFromPhoto() const; + [[nodiscard]] virtual bool hasFromName() const; + [[nodiscard]] virtual bool displayFromName() const; + [[nodiscard]] virtual bool displayForwardedFrom() const; + [[nodiscard]] virtual bool hasOutLayout() const; + [[nodiscard]] virtual bool drawBubble() const; + [[nodiscard]] virtual bool hasBubble() const; + [[nodiscard]] virtual int minWidthForMedia() const { return 0; } - virtual bool hasFastReply() const; - virtual bool displayFastReply() const; - virtual std::optional rightActionSize() const; + [[nodiscard]] virtual bool hasFastReply() const; + [[nodiscard]] virtual bool displayFastReply() const; + [[nodiscard]] virtual std::optional rightActionSize() const; virtual void drawRightAction( Painter &p, const PaintContext &context, int left, int top, int outerWidth) const; - virtual ClickHandlerPtr rightActionLink() const; - virtual bool displayEditedBadge() const; - virtual TimeId displayedEditDate() const; - virtual bool hasVisibleText() const; - virtual HistoryMessageReply *displayedReply() const; + [[nodiscard]] virtual ClickHandlerPtr rightActionLink() const; + [[nodiscard]] virtual bool displayEditedBadge() const; + [[nodiscard]] virtual TimeId displayedEditDate() const; + [[nodiscard]] virtual bool hasVisibleText() const; + [[nodiscard]] virtual HistoryMessageReply *displayedReply() const; virtual void applyGroupAdminChanges( const base::flat_set &changes) { } @@ -356,6 +372,10 @@ public: }; [[nodiscard]] virtual VerticalRepaintRange verticalRepaintRange() const; + [[nodiscard]] virtual bool isSignedAuthorElided() const; + + virtual void itemDataChanged(); + virtual bool hasHeavyPart() const; virtual void unloadHeavyPart(); void checkHeavyPart(); @@ -387,6 +407,8 @@ public: return fromLink(); } + [[nodiscard]] bool markSponsoredViewed(int shownFromTop) const; + virtual ~Element(); protected: diff --git a/Telegram/SourceFiles/history/view/history_view_item_preview.h b/Telegram/SourceFiles/history/view/history_view_item_preview.h new file mode 100644 index 000000000..b3e0ea159 --- /dev/null +++ b/Telegram/SourceFiles/history/view/history_view_item_preview.h @@ -0,0 +1,37 @@ +/* +This file is part of Telegram Desktop, +the official desktop application for the Telegram messaging service. + +For license and copyright information please follow this link: +https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL +*/ +#pragma once + +namespace HistoryView { + +struct ItemPreviewImage { + QImage data; + uint64 cacheKey = 0; + + explicit operator bool() const { + return !data.isNull(); + } +}; + +struct ItemPreview { + QString text; + std::vector images; + int imagesInTextPosition = 0; + std::any loadingContext; +}; + +struct ToPreviewOptions { + const std::vector *existing = nullptr; + bool hideSender = false; + bool hideCaption = false; + bool generateImages = true; + bool ignoreGroup = false; + bool ignoreSpoilers = false; +}; + +} // namespace HistoryView diff --git a/Telegram/SourceFiles/history/view/history_view_list_widget.cpp b/Telegram/SourceFiles/history/view/history_view_list_widget.cpp index ab943556d..fcebb2680 100644 --- a/Telegram/SourceFiles/history/view/history_view_list_widget.cpp +++ b/Telegram/SourceFiles/history/view/history_view_list_widget.cpp @@ -18,6 +18,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "history/view/history_view_message.h" #include "history/view/history_view_service_message.h" #include "history/view/history_view_cursor_state.h" +#include "history/view/history_view_react_button.h" #include "chat_helpers/message_field.h" #include "mainwindow.h" #include "mainwidget.h" @@ -47,6 +48,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_chat.h" #include "data/data_channel.h" #include "data/data_file_click_handler.h" +#include "data/data_message_reactions.h" #include "facades.h" #include "styles/style_chat.h" @@ -262,6 +264,10 @@ ListWidget::ListWidget( MakePathShiftGradient( controller->chatStyle(), [=] { update(); })) +, _reactionsManager( + std::make_unique( + this, + [=](QRect updated) { update(updated); })) , _scrollDateCheck([this] { scrollDateCheck(); }) , _applyUpdatedScrollState([this] { applyUpdatedScrollState(); }) , _selectEnabled(_delegate->listAllowsMultiSelect()) @@ -294,6 +300,12 @@ ListWidget::ListWidget( } } }, lifetime()); + session().data().itemDataChanges( + ) | rpl::start_with_next([=](not_null item) { + if (const auto view = viewForItem(item)) { + view->itemDataChanged(); + } + }, lifetime()); session().data().animationPlayInlineRequest( ) | rpl::start_with_next([this](auto item) { if (const auto view = viewForItem(item)) { @@ -324,6 +336,19 @@ ListWidget::ListWidget( } }); + using ChosenReaction = Reactions::Manager::Chosen; + _reactionsManager->chosen( + ) | rpl::start_with_next([=](ChosenReaction reaction) { + if (const auto item = session().data().message(reaction.context)) { + item->toggleReaction(reaction.emoji); + } + }, lifetime()); + + _delegate->listAllowedReactionsValue( + ) | rpl::start_with_next([=](std::vector &&list) { + _reactionsManager->applyList(std::move(list)); + }, lifetime()); + controller->adaptive().chatWideValue( ) | rpl::start_with_next([=](bool wide) { _isChatWide = wide; @@ -878,6 +903,10 @@ bool ListWidget::hasSelectedItems() const { return !_selected.empty(); } +bool ListWidget::inSelectionMode() const { + return hasSelectedItems() || !_dragSelected.empty(); +} + bool ListWidget::overSelectedItems() const { if (_overState.pointState == PointState::GroupPart) { return _overItemExact @@ -1368,7 +1397,7 @@ crl::time ListWidget::elementHighlightTime( } bool ListWidget::elementInSelectionMode() { - return hasSelectedItems() || !_dragSelected.empty(); + return inSelectionMode(); } bool ListWidget::elementIntersectsRange( @@ -1452,6 +1481,11 @@ void ListWidget::elementReplyTo(const FullMsgId &to) { void ListWidget::elementStartInteraction(not_null view) { } +void ListWidget::elementShowSpoilerAnimation() { + _spoilerOpacity.stop(); + _spoilerOpacity.start([=] { update(); }, 0., 1., st::fadeWrapDuration); +} + void ListWidget::saveState(not_null memento) { memento->setAroundPosition(_aroundPosition); auto state = countScrollState(); @@ -1697,10 +1731,10 @@ void ListWidget::paintEvent(QPaintEvent *e) { view->draw(p, context); const auto height = view->height(); top += height; - context.viewport.translate(0, -height); - context.clip.translate(0, -height); + context.translate(0, -height); p.translate(0, height); } + context.translate(0, top); p.translate(0, -top); enumerateUserpics([&](not_null view, int userpicTop) { @@ -1719,7 +1753,7 @@ void ListWidget::paintEvent(QPaintEvent *e) { userpicTop, view->width(), st::msgPhotoSize); - } else if (const auto info = view->data()->hiddenForwardedInfo()) { + } else if (const auto info = view->data()->hiddenSenderInfo()) { info->userpic.paint( p, st::historyPhotoLeft, @@ -1778,6 +1812,8 @@ void ListWidget::paintEvent(QPaintEvent *e) { } return true; }); + + _reactionsManager->paintButtons(p, context); } } @@ -2099,6 +2135,7 @@ void ListWidget::enterEventHook(QEnterEvent *e) { } void ListWidget::leaveEventHook(QEvent *e) { + _reactionsManager->updateButton({}); if (const auto view = _overElement) { if (_overState.pointState != PointState::Outside) { repaintItem(view); @@ -2377,6 +2414,27 @@ void ListWidget::mouseActionStart( } } +Reactions::ButtonParameters ListWidget::reactionButtonParameters( + not_null view, + QPoint position, + const TextState &reactionState) const { + const auto top = itemTop(view); + if (top < 0 + || !view->data()->canReact() + || _mouseAction == MouseAction::Dragging + || inSelectionMode()) { + return {}; + } + auto result = view->reactionButtonParameters( + position, + reactionState + ).translated({ 0, itemTop(view) }); + result.visibleTop = _visibleTop; + result.visibleBottom = _visibleBottom; + result.globalPointer = _mousePosition; + return result; +} + void ListWidget::mouseActionUpdate(const QPoint &globalPosition) { _mousePosition = globalPosition; mouseActionUpdate(); @@ -2492,7 +2550,12 @@ void ListWidget::mouseActionUpdate() { std::clamp(mousePosition.x(), 0, width()), std::clamp(mousePosition.y(), _visibleTop, _visibleBottom)); - const auto view = strictFindItemByY(point.y()); + const auto reactionState = _reactionsManager->buttonTextState(point); + const auto reactionItem = session().data().message(reactionState.itemId); + const auto reactionView = viewForItem(reactionItem); + const auto view = reactionView + ? reactionView + : strictFindItemByY(point.y()); const auto item = view ? view->data().get() : nullptr; const auto itemPoint = mapPointToItem(point, view); _overState = MouseState( @@ -2505,13 +2568,23 @@ void ListWidget::mouseActionUpdate() { _overElement = view; repaintItem(_overElement); } + _reactionsManager->updateButton(view + ? reactionButtonParameters( + view, + itemPoint, + reactionState) + : Reactions::ButtonParameters()); TextState dragState; ClickHandlerHost *lnkhost = nullptr; auto inTextSelection = (_overState.pointState != PointState::Outside) && (_overState.itemId == _pressState.itemId) && hasSelectedText(); - if (view) { + const auto overReaction = reactionView && reactionState.link; + if (overReaction) { + dragState = reactionState; + lnkhost = reactionView; + } else if (view) { auto cursorDeltaLength = [&] { auto cursorDelta = (_overState.point - _pressState.point); return cursorDelta.manhattanLength(); @@ -2784,6 +2857,7 @@ std::unique_ptr ListWidget::prepareDrag() { void ListWidget::performDrag() { if (auto mimeData = prepareDrag()) { // This call enters event loop and can destroy any QObject. + _reactionsManager->updateButton({}); _controller->widget()->launchDrag( std::move(mimeData), crl::guard(this, [=] { mouseActionUpdate(QCursor::pos()); }));; @@ -2945,6 +3019,7 @@ void ListWidget::itemRemoved(not_null item) { viewReplaced(view, nullptr); _views.erase(i); + _reactionsManager->remove(item->fullId()); updateItemsGeometry(); } diff --git a/Telegram/SourceFiles/history/view/history_view_list_widget.h b/Telegram/SourceFiles/history/view/history_view_list_widget.h index f12a1436c..062d3828d 100644 --- a/Telegram/SourceFiles/history/view/history_view_list_widget.h +++ b/Telegram/SourceFiles/history/view/history_view_list_widget.h @@ -31,8 +31,14 @@ class SessionController; namespace Data { struct Group; class CloudImageView; +struct Reaction; } // namespace Data +namespace HistoryView::Reactions { +class Manager; +struct ButtonParameters; +} // namespace HistoryView::Reactions + namespace HistoryView { struct TextState; @@ -106,7 +112,8 @@ public: return listCopyRestrictionType(nullptr); } virtual CopyRestrictionType listSelectRestrictionType() = 0; - + virtual auto listAllowedReactionsValue() + -> rpl::producer> = 0; }; struct SelectionData { @@ -236,6 +243,11 @@ public: [[nodiscard]] rpl::producer showMessageRequested() const; void replyNextMessage(FullMsgId fullId, bool next = true); + [[nodiscard]] Reactions::ButtonParameters reactionButtonParameters( + not_null view, + QPoint position, + const TextState &reactionState) const; + // ElementDelegate interface. Context elementContext() override; std::unique_ptr elementCreate( @@ -278,6 +290,7 @@ public: not_null elementPathShiftGradient() override; void elementReplyTo(const FullMsgId &to) override; void elementStartInteraction(not_null view) override; + void elementShowSpoilerAnimation() override; void setEmptyInfoWidget(base::unique_qptr &&w); @@ -422,6 +435,7 @@ private: const SelectedMap::const_iterator &i); bool hasSelectedText() const; bool hasSelectedItems() const; + bool inSelectionMode() const; bool overSelectedItems() const; void clearTextSelection(); void clearSelected(); @@ -550,6 +564,8 @@ private: base::unique_qptr _emptyInfo = nullptr; + std::unique_ptr _reactionsManager; + int _minHeight = 0; int _visibleTop = 0; int _visibleBottom = 0; @@ -607,6 +623,8 @@ private: FullMsgId _highlightedMessageId; base::Timer _highlightTimer; + Ui::Animations::Simple _spoilerOpacity; + Ui::SelectScrollManager _selectScroll; rpl::event_stream _requestedToEditMessage; diff --git a/Telegram/SourceFiles/history/view/history_view_message.cpp b/Telegram/SourceFiles/history/view/history_view_message.cpp index f1e395c80..e5d362bf1 100644 --- a/Telegram/SourceFiles/history/view/history_view_message.cpp +++ b/Telegram/SourceFiles/history/view/history_view_message.cpp @@ -13,6 +13,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "history/history_message.h" #include "history/view/media/history_view_media.h" #include "history/view/media/history_view_web_page.h" +#include "history/view/history_view_react_button.h" +#include "history/view/history_view_reactions.h" #include "history/view/history_view_group_call_bar.h" // UserpicInRow. #include "history/view/history_view_view_button.h" // ViewButton. #include "history/history.h" @@ -27,9 +29,12 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "data/data_session.h" #include "data/data_user.h" #include "data/data_channel.h" +#include "data/data_message_reactions.h" +#include "data/data_sponsored_messages.h" #include "lang/lang_keys.h" #include "mainwidget.h" #include "main/main_session.h" +#include "ui/text/text_options.h" #include "window/window_session_controller.h" #include "apiwrap.h" @@ -240,9 +245,13 @@ Message::Message( not_null delegate, not_null data, Element *replacing) -: Element(delegate, data, replacing) { +: Element(delegate, data, replacing) +, _bottomInfo( + &data->history()->owner().reactions(), + BottomInfoDataFromMessage(this)) { initLogEntryOriginal(); initPsa(); + refreshReactions(); } Message::~Message() { @@ -314,9 +323,13 @@ QSize Message::performCountOptimalSize() { updateViewButtonExistence(); updateMediaInBubbleState(); - refreshEditedBadge(); refreshRightBadge(); + refreshInfoSkipBlock(); + const auto reactionsInBubble = _reactions && embedReactionsInBubble(); + if (_reactions) { + _reactions->initDimensions(); + } if (drawBubble()) { const auto forwarded = item->Get(); const auto reply = displayedReply(); @@ -341,25 +354,35 @@ QSize Message::performCountOptimalSize() { // Entry page is always a bubble bottom. auto mediaOnBottom = (mediaDisplayed && media->isBubbleBottom()) || (entry/* && entry->isBubbleBottom()*/); auto mediaOnTop = (mediaDisplayed && media->isBubbleTop()) || (entry && entry->isBubbleTop()); - - if (mediaOnBottom || (mediaDisplayed && _viewButton)) { - if (item->_text.removeSkipBlock()) { - item->_textWidth = -1; - item->_textHeight = 0; - } - } else if (item->_text.updateSkipBlock(skipBlockWidth(), skipBlockHeight())) { - item->_textWidth = -1; - item->_textHeight = 0; - } - maxWidth = plainMaxWidth(); if (context() == Context::Replies && item->isDiscussionPost()) { maxWidth = std::max(maxWidth, st::msgMaxWidth); } minHeight = hasVisibleText() ? item->_text.minHeight() : 0; - if (!mediaOnBottom) { + if (reactionsInBubble) { + const auto reactionsMaxWidth = st::msgPadding.left() + + _reactions->maxWidth() + + st::msgPadding.right(); + accumulate_max( + maxWidth, + std::min(st::msgMaxWidth, reactionsMaxWidth)); + if (!mediaDisplayed) { + minHeight += st::mediaInBubbleSkip; + } + if (maxWidth >= reactionsMaxWidth) { + minHeight += _reactions->minHeight(); + } else { + const auto widthForReactions = maxWidth + - st::msgPadding.left() + - st::msgPadding.right(); + minHeight += _reactions->resizeGetHeight(widthForReactions); + } + } + if (!mediaOnBottom && (!_viewButton || !reactionsInBubble)) { minHeight += st::msgPadding.bottom(); - if (mediaDisplayed) minHeight += st::mediaInBubbleSkip; + if (mediaDisplayed) { + minHeight += st::mediaInBubbleSkip; + } } if (!mediaOnTop) { minHeight += st::msgPadding.top(); @@ -370,9 +393,17 @@ QSize Message::performCountOptimalSize() { // Parts don't participate in maxWidth() in case of media message. if (media->enforceBubbleWidth()) { maxWidth = media->maxWidth(); + const auto innerWidth = maxWidth + - st::msgPadding.left() + - st::msgPadding.right(); if (hasVisibleText() && maxWidth < plainMaxWidth()) { minHeight -= item->_text.minHeight(); - minHeight += item->_text.countHeight(maxWidth - st::msgPadding.left() - st::msgPadding.right()); + minHeight += item->_text.countHeight(innerWidth); + } + if (reactionsInBubble) { + minHeight -= _reactions->minHeight(); + minHeight + += _reactions->countCurrentSize(innerWidth).height(); } } else { accumulate_max(maxWidth, media->maxWidth()); @@ -385,7 +416,7 @@ QSize Message::performCountOptimalSize() { const auto from = item->displayFrom(); const auto &name = from ? from->nameText() - : item->hiddenForwardedInfo()->nameText; + : item->hiddenSenderInfo()->nameText; auto namew = st::msgPadding.left() + name.maxWidth() + st::msgPadding.right(); @@ -514,6 +545,9 @@ void Message::draw(Painter &p, const PaintContext &context) const { auto mediaOnBottom = (mediaDisplayed && media->isBubbleBottom()) || (entry/* && entry->isBubbleBottom()*/); auto mediaOnTop = (mediaDisplayed && media->isBubbleTop()) || (entry && entry->isBubbleTop()); + const auto displayInfo = needInfoDisplay(); + const auto reactionsInBubble = _reactions && embedReactionsInBubble(); + auto mediaSelectionIntervals = (!context.selected() && mediaDisplayed) ? media->getBubbleSelectionIntervals(context.selection) : std::vector(); @@ -527,7 +561,10 @@ void Message::draw(Painter &p, const PaintContext &context) const { if (_viewButton) { localMediaBottom -= st::mediaInBubbleSkip + _viewButton->height(); } - if (!mediaOnBottom) { + if (reactionsInBubble) { + localMediaBottom -= st::mediaInBubbleSkip + _reactions->height(); + } + if (!mediaOnBottom && (!_viewButton || !reactionsInBubble)) { localMediaBottom -= st::msgPadding.bottom(); } if (entry) { @@ -558,14 +595,26 @@ void Message::draw(Painter &p, const PaintContext &context) const { auto keyboard = item->inlineReplyKeyboard(); if (keyboard) { - auto keyboardHeight = st::msgBotKbButton.margin + keyboard->naturalHeight(); + const auto keyboardHeight = st::msgBotKbButton.margin + keyboard->naturalHeight(); g.setHeight(g.height() - keyboardHeight); - auto keyboardPosition = QPoint(g.left(), g.top() + g.height() + st::msgBotKbButton.margin); + const auto keyboardPosition = QPoint(g.left(), g.top() + g.height() + st::msgBotKbButton.margin); p.translate(keyboardPosition); keyboard->paint(p, context.st, g.width(), context.clip.translated(-keyboardPosition)); p.translate(-keyboardPosition); } + if (_reactions && !reactionsInBubble) { + const auto reactionsHeight = st::mediaInBubbleSkip + _reactions->height(); + const auto reactionsLeft = (!bubble && mediaDisplayed) + ? media->contentRectForReactions().x() + : 0; + g.setHeight(g.height() - reactionsHeight); + const auto reactionsPosition = QPoint(reactionsLeft + g.left(), g.top() + g.height() + st::mediaInBubbleSkip); + p.translate(reactionsPosition); + _reactions->paint(p, context, g.width(), context.clip.translated(-reactionsPosition)); + p.translate(-reactionsPosition); + } + if (bubble) { if (displayFromName() && item->displayFrom() @@ -603,17 +652,40 @@ void Message::draw(Painter &p, const PaintContext &context) const { paintCommentsButton(p, inner, context); auto trect = inner.marginsRemoved(st::msgPadding); + + const auto reactionsTop = (reactionsInBubble && !_viewButton) + ? st::mediaInBubbleSkip + : 0; + const auto reactionsHeight = reactionsInBubble + ? (reactionsTop + _reactions->height()) + : 0; + if (reactionsInBubble) { + trect.setHeight(trect.height() - reactionsHeight); + const auto reactionsPosition = QPoint(trect.left(), trect.top() + trect.height() + reactionsTop); + p.translate(reactionsPosition); + _reactions->paint(p, context, g.width(), context.clip.translated(-reactionsPosition)); + p.translate(-reactionsPosition); + } + if (_viewButton) { + const auto belowInfo = _viewButton->belowMessageInfo(); + const auto infoHeight = reactionsInBubble + ? (reactionsHeight + st::msgPadding.bottom()) + : _bottomInfo.height(); + const auto heightMargins = QMargins(0, 0, 0, infoHeight); _viewButton->draw( p, - _viewButton->countRect(inner), + _viewButton->countRect(belowInfo + ? inner + : inner - heightMargins), context); - // Inner should contain _viewButton height, because info is - // painted below the _viewButton. - // - // inner.setHeight(inner.height() - _viewButton->height()); + if (belowInfo) { + inner.setHeight(inner.height() - _viewButton->height()); + } trect.setHeight(trect.height() - _viewButton->height()); - if (mediaDisplayed) { + if (reactionsInBubble) { + trect.setHeight(trect.height() + st::msgPadding.bottom()); + } else if (mediaDisplayed) { trect.setHeight(trect.height() - st::mediaInBubbleSkip); } } @@ -632,6 +704,10 @@ void Message::draw(Painter &p, const PaintContext &context) const { if (entry) { trect.setHeight(trect.height() - entry->height()); } + if (displayInfo) { + trect.setHeight(trect.height() + - (_bottomInfo.height() - st::msgDateFont->height)); + } paintText(p, trect, context); if (mediaDisplayed) { auto mediaHeight = media->height(); @@ -658,12 +734,7 @@ void Message::draw(Painter &p, const PaintContext &context) const { entry->draw(p, entryContext); p.translate(-entryLeft, -entryTop); } - const auto needDrawInfo = entry - ? !entry->customInfoLayout() - : (mediaDisplayed - ? !media->customInfoLayout() - : true); - if (needDrawInfo) { + if (displayInfo) { const auto bottomSelected = context.selected() || (!mediaSelectionIntervals.empty() && (mediaSelectionIntervals.back().top @@ -677,10 +748,10 @@ void Message::draw(Painter &p, const PaintContext &context) const { inner.top() + inner.height(), 2 * inner.left() + inner.width(), InfoDisplayType::Default); - if (g != inner) { + if (_comments) { const auto o = p.opacity(); p.setOpacity(0.3); - p.fillRect(inner.left(), inner.top() + inner.height() - st::lineWidth, inner.width(), st::lineWidth, stm->msgDateFg); + p.fillRect(g.left(), g.top() + g.height() - st::historyCommentsButtonHeight - st::lineWidth, g.width(), st::lineWidth, stm->msgDateFg); p.setOpacity(o); } } @@ -861,7 +932,7 @@ void Message::paintFromName( } const auto chatTypeIcon = [&]() -> const style::icon * { - if (const auto sponsored = displayedSponsorBadge()) { + if (item->isSponsored()) { return context.selected() ? &st::msgNameSponsoredIconSelected : &st::msgNameSponsoredIcon; @@ -901,17 +972,24 @@ void Message::paintFromName( const auto nameText = [&]() -> const Ui::Text::String * { const auto from = item->displayFrom(); - if (context.outbg || item->isPost()) { - p.setPen(stm->msgServiceFg); + const auto service = (context.outbg || item->isPost()); + const auto st = context.st; + if (from) { + p.setPen(!service + ? FromNameFg(context, from->id) + : item->isSponsored() + ? st->boxTextFgGood() + : stm->msgServiceFg); return &from->nameText(); - } else if (from) { - p.setPen(FromNameFg(context, from->id)); - return &from->nameText(); - } else if (const auto info = item->hiddenForwardedInfo()) { - p.setPen(FromNameFg(context, info->colorPeerId)); + } else if (const auto info = item->hiddenSenderInfo()) { + p.setPen(!service + ? FromNameFg(context, info->colorPeerId) + : item->isSponsored() + ? st->boxTextFgGood() + : stm->msgServiceFg); return &info->nameText; } else { - Unexpected("Corrupt forwarded information in message."); + Unexpected("Corrupt sender information in message."); } }(); nameText->drawElided(p, availableLeft, trect.top(), availableWidth); @@ -1058,6 +1136,7 @@ PointState Message::pointState(QPoint point) const { const auto media = this->media(); const auto item = message(); + const auto reactionsInBubble = _reactions && embedReactionsInBubble(); if (drawBubble()) { if (!g.contains(point)) { return PointState::Outside; @@ -1074,9 +1153,16 @@ PointState Message::pointState(QPoint point) const { } auto trect = g.marginsRemoved(st::msgPadding); + if (reactionsInBubble) { + const auto reactionsHeight = (_viewButton ? 0 : st::mediaInBubbleSkip) + + _reactions->height(); + trect.setHeight(trect.height() - reactionsHeight); + } if (_viewButton) { trect.setHeight(trect.height() - _viewButton->height()); - if (mediaDisplayed) { + if (reactionsInBubble) { + trect.setHeight(trect.height() + st::msgPadding.bottom()); + } else if (mediaDisplayed) { trect.setHeight(trect.height() - st::mediaInBubbleSkip); } } @@ -1226,6 +1312,9 @@ TextState Message::textState( return result; } + const auto bubble = drawBubble(); + const auto reactionsInBubble = _reactions && embedReactionsInBubble(); + const auto mediaDisplayed = media && media->isDisplayed(); auto keyboard = item->inlineReplyKeyboard(); auto keyboardHeight = 0; if (keyboard) { @@ -1233,31 +1322,65 @@ TextState Message::textState( g.setHeight(g.height() - st::msgBotKbButton.margin - keyboardHeight); } - if (drawBubble()) { + if (_reactions && !reactionsInBubble) { + const auto reactionsHeight = st::mediaInBubbleSkip + _reactions->height(); + const auto reactionsLeft = (!bubble && mediaDisplayed) + ? media->contentRectForReactions().x() + : 0; + g.setHeight(g.height() - reactionsHeight); + const auto reactionsPosition = QPoint(reactionsLeft + g.left(), g.top() + g.height() + st::mediaInBubbleSkip); + if (_reactions->getState(point - reactionsPosition, &result)) { + return result; + } + } + + if (bubble) { const auto inBubble = g.contains(point); auto entry = logEntryOriginal(); - auto mediaDisplayed = media && media->isDisplayed(); // Entry page is always a bubble bottom. auto mediaOnBottom = (mediaDisplayed && media->isBubbleBottom()) || (entry/* && entry->isBubbleBottom()*/); auto mediaOnTop = (mediaDisplayed && media->isBubbleTop()) || (entry && entry->isBubbleTop()); - auto bubble = g; - if (getStateCommentsButton(point, bubble, &result)) { + auto inner = g; + if (getStateCommentsButton(point, inner, &result)) { return result; } - if (_viewButton - && _viewButton->getState( - point, - _viewButton->countRect(bubble), - &result)) { - return result; + auto trect = inner.marginsRemoved(st::msgPadding); + const auto reactionsTop = (reactionsInBubble && !_viewButton) + ? st::mediaInBubbleSkip + : 0; + const auto reactionsHeight = reactionsInBubble + ? (reactionsTop + _reactions->height()) + : 0; + if (reactionsInBubble) { + trect.setHeight(trect.height() - reactionsHeight); + const auto reactionsPosition = QPoint(trect.left(), trect.top() + trect.height() + reactionsTop); + if (_reactions->getState(point - reactionsPosition, &result)) { + return result; + } } - - auto trect = bubble.marginsRemoved(st::msgPadding); if (_viewButton) { + const auto belowInfo = _viewButton->belowMessageInfo(); + const auto infoHeight = reactionsInBubble + ? (reactionsHeight + st::msgPadding.bottom()) + : _bottomInfo.height(); + const auto heightMargins = QMargins(0, 0, 0, infoHeight); + if (_viewButton->getState( + point, + _viewButton->countRect(belowInfo + ? inner + : inner - heightMargins), + &result)) { + return result; + } + if (belowInfo) { + inner -= heightMargins; + } trect.setHeight(trect.height() - _viewButton->height()); - if (mediaDisplayed) { + if (reactionsInBubble) { + trect.setHeight(trect.height() + st::msgPadding.bottom()); + } else if (mediaDisplayed) { trect.setHeight(trect.height() - st::mediaInBubbleSkip); } } @@ -1285,7 +1408,7 @@ TextState Message::textState( if (entry) { auto entryHeight = entry->height(); trect.setHeight(trect.height() - entryHeight); - auto entryLeft = bubble.left(); + auto entryLeft = inner.left(); auto entryTop = trect.y() + trect.height(); if (point.y() >= entryTop && point.y() < entryTop + entryHeight) { result = entry->textState( @@ -1295,17 +1418,18 @@ TextState Message::textState( } } - auto checkForPointInTime = [&] { + auto checkBottomInfoState = [&] { if (mediaOnBottom && (entry || media->customInfoLayout())) { return; } - const auto inDate = pointInTime( - bubble.left() + bubble.width(), - bubble.top() + bubble.height(), + const auto bottomInfoResult = bottomInfoTextState( + inner.left() + inner.width(), + inner.top() + inner.height(), point, InfoDisplayType::Default); - if (inDate) { - result.cursor = CursorState::Date; + if (bottomInfoResult.link + || bottomInfoResult.cursor != CursorState::None) { + result = bottomInfoResult; } }; if (inBubble) { @@ -1318,19 +1442,19 @@ TextState Message::textState( result = media->textState(point - QPoint(mediaLeft, mediaTop), request); result.symbol += item->_text.length(); } else if (getStateText(point, trect, &result, request)) { - checkForPointInTime(); + checkBottomInfoState(); return result; } else if (point.y() >= trect.y() + trect.height()) { result.symbol = item->_text.length(); } } else if (getStateText(point, trect, &result, request)) { - checkForPointInTime(); + checkBottomInfoState(); return result; } else if (point.y() >= trect.y() + trect.height()) { result.symbol = item->_text.length(); } } - checkForPointInTime(); + checkBottomInfoState(); if (const auto size = rightActionSize()) { const auto fastShareSkip = std::clamp( (g.height() - size->height()) / 2, @@ -1438,7 +1562,7 @@ bool Message::getStateFromName( auto availableLeft = trect.left(); auto availableWidth = trect.width(); const auto hasChatTypeIcon = [&]() { - if (const auto sponsored = displayedSponsorBadge()) { + if (item->isSponsored()) { return true; } else if (!item->isPost() && item->displayFrom()) { const auto from = item->displayFrom(); @@ -1461,7 +1585,7 @@ bool Message::getStateFromName( const auto nameText = [&]() -> const Ui::Text::String * { if (from) { return &from->nameText(); - } else if (const auto info = item->hiddenForwardedInfo()) { + } else if (const auto info = item->hiddenSenderInfo()) { return &info->nameText; } else { Unexpected("Corrupt forwarded information in message."); @@ -1768,6 +1892,55 @@ TextSelection Message::adjustSelection( return result; } +Reactions::ButtonParameters Message::reactionButtonParameters( + QPoint position, + const TextState &reactionState) const { + using namespace Reactions; + auto result = ButtonParameters{ .context = data()->fullId() }; + const auto outbg = hasOutLayout(); + const auto outsideBubble = (!_comments && !embedReactionsInBubble()); + const auto geometry = countGeometry(); + result.pointer = position; + const auto onTheLeft = (outbg && !delegate()->elementIsChatWide()); + + const auto keyboard = data()->inlineReplyKeyboard(); + const auto keyboardHeight = keyboard + ? (st::msgBotKbButton.margin + keyboard->naturalHeight()) + : 0; + const auto reactionsHeight = (_reactions && !embedReactionsInBubble()) + ? (st::mediaInBubbleSkip + _reactions->height()) + : 0; + const auto innerHeight = geometry.height() + - keyboardHeight + - reactionsHeight; + const auto maybeRelativeCenter = outsideBubble + ? media()->reactionButtonCenterOverride() + : std::nullopt; + const auto addOnTheRight = [&] { + return (maybeRelativeCenter + || !(displayFastShare() || displayGoToOriginal())) + ? st::reactionCornerCenter.x() + : 0; + }; + const auto relativeCenter = QPoint( + maybeRelativeCenter.value_or(onTheLeft + ? -st::reactionCornerCenter.x() + : (geometry.width() + addOnTheRight())), + innerHeight + st::reactionCornerCenter.y()); + result.center = geometry.topLeft() + relativeCenter; + if (reactionState.itemId != result.context + && !geometry.contains(position)) { + result.outside = true; + } + const auto minSkip = (st::reactionCornerShadow.left() + + st::reactionCornerSize.width() + + st::reactionCornerShadow.right()) / 2; + result.center = QPoint( + std::min(std::max(result.center.x(), minSkip), width() - minSkip), + result.center.y()); + return result; +} + void Message::drawInfo( Painter &p, const PaintContext &context, @@ -1801,110 +1974,28 @@ void Message::drawInfo( break; } - const auto item = message(); - auto infoW = infoWidth(); - if (rtl()) infoRight = width - infoRight + infoW; - - auto dateX = infoRight - infoW; - auto dateY = infoBottom - st::msgDateFont->height; + const auto size = _bottomInfo.currentSize(); + const auto dateX = infoRight - size.width(); + const auto dateY = infoBottom - size.height(); if (type == InfoDisplayType::Image) { - auto dateW = infoW + 2 * st::msgDateImgPadding.x(), dateH = st::msgDateFont->height + 2 * st::msgDateImgPadding.y(); + const auto dateW = size.width() + 2 * st::msgDateImgPadding.x(); + const auto dateH = size.height() + 2 * st::msgDateImgPadding.y(); Ui::FillRoundRect(p, dateX - st::msgDateImgPadding.x(), dateY - st::msgDateImgPadding.y(), dateW, dateH, sti->msgDateImgBg, sti->msgDateImgBgCorners); } else if (type == InfoDisplayType::Background) { - auto dateW = infoW + 2 * st::msgDateImgPadding.x(), dateH = st::msgDateFont->height + 2 * st::msgDateImgPadding.y(); + const auto dateW = size.width() + 2 * st::msgDateImgPadding.x(); + const auto dateH = size.height() + 2 * st::msgDateImgPadding.y(); Ui::FillRoundRect(p, dateX - st::msgDateImgPadding.x(), dateY - st::msgDateImgPadding.y(), dateW, dateH, sti->msgServiceBg, sti->msgServiceBgCorners); } - dateX += timeLeft(); - - if (const auto msgsigned = item->Get() - ; msgsigned && !msgsigned->isAnonymousRank) { - msgsigned->signature.drawElided(p, dateX, dateY, item->_timeWidth); - } else if (const auto sponsored = displayedSponsorBadge()) { - const auto skipY = viewButtonHeight(); - sponsored->text.drawElided(p, dateX, dateY - skipY, item->_timeWidth); - } else if (const auto edited = displayedEditBadge()) { - edited->text.drawElided(p, dateX, dateY, item->_timeWidth); - } else { - p.drawText(dateX, dateY + st::msgDateFont->ascent, item->_timeText); - } - - const auto viewIconTop = infoBottom + st::historyViewsTop; - const auto pinIconTop = infoBottom + st::historyPinTop; - auto left = infoRight - infoW; - if (auto views = item->Get()) { - const auto textTop = infoBottom - st::msgDateFont->descent; - if (views->replies.count > 0 - && !views->commentsMegagroupId - && this->context() != Context::Replies) { - const auto &icon = (!item->isSending() && !item->hasFailed()) - ? (invertedsprites - ? st->historyRepliesInvertedIcon() - : stm->historyRepliesIcon) - : (invertedsprites - ? st->historyViewsSendingInvertedIcon() - : st->historyViewsSendingIcon()); - if (!item->isSending() && !item->hasFailed()) { - icon.paint(p, left, viewIconTop, width); - p.drawText(left + st::historyViewsWidth, textTop, views->replies.text); - } else if (!context.outbg && views->views.count < 0) { // sending outbg icon will be painted below - auto iconSkip = st::historyViewsSpace + views->replies.textWidth; - icon.paint(p, left + iconSkip, viewIconTop, width); - } - left += st::historyViewsSpace - + views->replies.textWidth - + st::historyViewsWidth; - } - if (views->views.count >= 0) { - const auto &icon = (!item->isSending() && !item->hasFailed()) - ? (invertedsprites - ? st->historyViewsInvertedIcon() - : stm->historyViewsIcon) - : (invertedsprites - ? st->historyViewsSendingInvertedIcon() - : st->historyViewsSendingIcon()); - if (!item->isSending() && !item->hasFailed()) { - icon.paint(p, left, viewIconTop, width); - p.drawText(left + st::historyViewsWidth, textTop, views->views.text); - } else if (!context.outbg) { // sending outbg icon will be painted below - auto iconSkip = st::historyViewsSpace + views->views.textWidth; - icon.paint(p, left + iconSkip, viewIconTop, width); - } - left += st::historyViewsSpace - + views->views.textWidth - + st::historyViewsWidth; - } - } else if ((item->isSending() || item->hasFailed()) - && item->history()->peer->isSelf() - && !context.outbg) { - const auto &icon = invertedsprites - ? st->historyViewsSendingInvertedIcon() - : st->historyViewsSendingIcon(); - icon.paint(p, left, viewIconTop, width); - } - if (displayPinIcon()) { - const auto &icon = invertedsprites - ? st->historyPinInvertedIcon() - : stm->historyPinIcon; - icon.paint(p, left, pinIconTop, width); - left += st::historyPinWidth; - } - if (context.outbg) { - const auto &icon = (item->isSending() || item->hasFailed()) - ? (invertedsprites - ? st->historySendingInvertedIcon() - : st->historySendingIcon()) - : delegate()->elementShownUnread(this) - ? (invertedsprites - ? st->historySentInvertedIcon() - : stm->historySentIcon) - : (invertedsprites - ? st->historyReceivedInvertedIcon() - : stm->historyReceivedIcon); - icon.paint(p, QPoint(infoRight, infoBottom) + st::historySendStatePosition, width); - } + _bottomInfo.paint( + p, + { dateX, dateY }, + width, + delegate()->elementShownUnread(this), + invertedsprites, + context); } -bool Message::pointInTime( +TextState Message::bottomInfoTextState( int right, int bottom, QPoint point, @@ -1925,50 +2016,89 @@ bool Message::pointInTime( infoBottom -= st::msgDateImgPadding.y(); break; } - const auto item = message(); - auto dateX = infoRight - infoWidth() + timeLeft(); - auto dateY = infoBottom - st::msgDateFont->height; - return QRect( - dateX, - dateY, - item->_timeWidth, - st::msgDateFont->height).contains(point); + const auto size = _bottomInfo.currentSize(); + const auto infoLeft = infoRight - size.width(); + const auto infoTop = infoBottom - size.height(); + return _bottomInfo.textState( + data(), + point - QPoint{ infoLeft, infoTop }); } int Message::infoWidth() const { - const auto item = message(); - auto result = item->_timeWidth; - if (auto views = item->Get()) { - if (views->views.count >= 0) { - result += st::historyViewsSpace - + views->views.textWidth - + st::historyViewsWidth; - } - if (views->replies.count > 0 - && !views->commentsMegagroupId - && context() != Context::Replies) { - result += st::historyViewsSpace - + views->replies.textWidth - + st::historyViewsWidth; - } - } else if ((item->isSending() || item->hasFailed()) - && item->history()->peer->isSelf()) { - if (!hasOutLayout()) { - result += st::historySendStateSpace; - } - } - if (displayPinIcon()) { - result += st::historyPinWidth; - } + return _bottomInfo.optimalSize().width(); +} - // When message is scheduled until online, time is not displayed, - // so message should have less space. - if (!item->_timeWidth) { - result += st::historyScheduledUntilOnlineStateSpace; - } else if (hasOutLayout()) { - result += st::historySendStateSpace; +int Message::bottomInfoFirstLineWidth() const { + return _bottomInfo.firstLineWidth(); +} + +bool Message::bottomInfoIsWide() const { + if (_reactions && embedReactionsInBubble()) { + return false; + } + return _bottomInfo.isWide(); +} + +bool Message::isSignedAuthorElided() const { + return _bottomInfo.isSignedAuthorElided(); +} + +bool Message::embedReactionsInBottomInfo() const { + return data()->history()->peer->isUser(); +} + +bool Message::embedReactionsInBubble() const { + return needInfoDisplay(); +} + +void Message::refreshReactions() { + const auto item = data(); + const auto &list = item->reactions(); + if (list.empty() || embedReactionsInBottomInfo()) { + _reactions = nullptr; + return; + } + using namespace Reactions; + auto reactionsData = InlineListDataFromMessage(this); + if (!_reactions) { + const auto handlerFactory = [=](QString emoji) { + const auto fullId = data()->fullId(); + return std::make_shared([=]( + ClickContext context) { + const auto my = context.other.value(); + if (const auto controller = my.sessionWindow.get()) { + const auto &data = controller->session().data(); + if (const auto item = data.message(fullId)) { + item->toggleReaction(emoji); + } + } + }); + }; + _reactions = std::make_unique( + &item->history()->owner().reactions(), + handlerFactory, + std::move(reactionsData)); + } else { + _reactions->update(std::move(reactionsData), width()); + } +} + +void Message::itemDataChanged() { + const auto wasInfo = _bottomInfo.currentSize(); + const auto wasReactions = _reactions + ? _reactions->currentSize() + : QSize(); + refreshReactions(); + _bottomInfo.update(BottomInfoDataFromMessage(this), width()); + const auto nowInfo = _bottomInfo.currentSize(); + const auto nowReactions = _reactions + ? _reactions->currentSize() + : QSize(); + if (wasInfo != nowInfo || wasReactions != nowReactions) { + history()->owner().requestViewResize(this); + } else { + history()->owner().requestViewRepaint(this); } - return result; } auto Message::verticalRepaintRange() const -> VerticalRepaintRange { @@ -1992,30 +2122,6 @@ void Message::refreshDataIdHook() { } } -int Message::timeLeft() const { - const auto item = message(); - auto result = 0; - if (auto views = item->Get()) { - if (views->views.count >= 0) { - result += st::historyViewsSpace + views->views.textWidth + st::historyViewsWidth; - } - if (views->replies.count > 0 - && !views->commentsMegagroupId - && context() != Context::Replies) { - result += st::historyViewsSpace + views->replies.textWidth + st::historyViewsWidth; - } - } else if ((item->isSending() || item->hasFailed()) - && item->history()->peer->isSelf()) { - if (!hasOutLayout()) { - result += st::historySendStateSpace; - } - } - if (displayPinIcon()) { - result += st::historyPinWidth; - } - return result; -} - int Message::plainMaxWidth() const { return st::msgPadding.left() + (hasVisibleText() ? message()->_text.maxWidth() : 0) @@ -2033,14 +2139,11 @@ int Message::viewButtonHeight() const { } void Message::updateViewButtonExistence() { - const auto has = [&] { - const auto item = data(); - if (item->isSponsored()) { - return true; - } - const auto media = item->media(); - return media && ViewButton::MediaHasViewButton(media); - }(); + const auto item = data(); + const auto sponsored = item->Get(); + const auto media = sponsored ? nullptr : item->media(); + const auto has = sponsored + || (media && ViewButton::MediaHasViewButton(media)); if (!has) { _viewButton = nullptr; return; @@ -2048,13 +2151,9 @@ void Message::updateViewButtonExistence() { return; } auto callback = [=] { history()->owner().requestViewRepaint(this); }; - _viewButton = data()->isSponsored() - ? std::make_unique( - data()->displayFrom(), - std::move(callback)) - : std::make_unique( - data()->media(), - std::move(callback)); + _viewButton = sponsored + ? std::make_unique(sponsored, std::move(callback)) + : std::make_unique(media, std::move(callback)); } void Message::initLogEntryOriginal() { @@ -2102,10 +2201,6 @@ bool Message::toggleSelectionByHandlerClick( return false; } -bool Message::displayPinIcon() const { - return data()->isPinned() && !isPinnedContext(); -} - bool Message::hasFromName() const { switch (context()) { case Context::AdminLog: @@ -2371,7 +2466,9 @@ ClickHandlerPtr Message::rightActionLink() const { const auto owner = &data()->history()->owner(); const auto itemId = data()->fullId(); const auto forwarded = data()->Get(); - const auto savedFromPeer = forwarded ? forwarded->savedFromPeer : nullptr; + const auto savedFromPeer = forwarded + ? forwarded->savedFromPeer + : nullptr; const auto savedFromMsgId = forwarded ? forwarded->savedFromMsgId : 0; using Callback = FnMut)>; @@ -2381,7 +2478,7 @@ ClickHandlerPtr Message::rightActionLink() const { *showByThread = [=, requested = 0]( not_null controller) mutable { const auto original = savedFromPeer->owner().message( - savedFromPeer->asChannel(), + savedFromPeer, savedFromMsgId); if (original && original->replyToTop()) { controller->showRepliesForMessage( @@ -2390,14 +2487,12 @@ ClickHandlerPtr Message::rightActionLink() const { original->id, Window::SectionShow::Way::Forward); } else if (!requested) { - const auto channel = savedFromPeer->asChannel(); const auto prequested = &requested; requested = 1; - channel->session().api().requestMessageData( - channel, + savedFromPeer->session().api().requestMessageData( + savedFromPeer, savedFromMsgId, - [=, weak = base::make_weak(controller.get())]( - ChannelData *gotChannel, MsgId gotId) { + [=, weak = base::make_weak(controller.get())] { if (const auto strong = showByThreadWeak.lock()) { if (const auto strongController = weak.get()) { *prequested = 2; @@ -2458,7 +2553,12 @@ void Message::updateMediaInBubbleState() { const auto item = message(); const auto media = this->media(); - auto mediaHasSomethingBelow = (_viewButton != nullptr); + if (media) { + media->updateNeedBubbleState(); + } + const auto reactionsInBubble = (_reactions && embedReactionsInBubble()); + auto mediaHasSomethingBelow = (_viewButton != nullptr) + || reactionsInBubble; auto mediaHasSomethingAbove = false; auto getMediaHasSomethingAbove = [&] { return displayFromName() @@ -2481,7 +2581,6 @@ void Message::updateMediaInBubbleState() { return; } - media->updateNeedBubbleState(); if (!drawBubble()) { media->setInBubbleState(MediaInBubbleState::None); return; @@ -2525,7 +2624,7 @@ void Message::fromNameUpdated(int width) const { const auto nameText = [&]() -> const Ui::Text::String * { if (from) { return &from->nameText(); - } else if (const auto info = item->hiddenForwardedInfo()) { + } else if (const auto info = item->hiddenSenderInfo()) { return &info->nameText; } else { Unexpected("Corrupted forwarded information in message."); @@ -2651,6 +2750,12 @@ int Message::resizeContentGetHeight(int newWidth) { } } } + const auto textWidth = qMax(contentWidth - st::msgPadding.left() - st::msgPadding.right(), 1); + const auto reactionsInBubble = _reactions && embedReactionsInBubble(); + const auto bottomInfoHeight = _bottomInfo.resizeGetHeight( + std::min( + _bottomInfo.optimalSize().width(), + textWidth - 2 * st::msgDateDelta.x())); if (bubble) { auto reply = displayedReply(); @@ -2661,6 +2766,10 @@ int Message::resizeContentGetHeight(int newWidth) { auto mediaOnBottom = (mediaDisplayed && media->isBubbleBottom()) || (entry/* && entry->isBubbleBottom()*/); auto mediaOnTop = (mediaDisplayed && media->isBubbleTop()) || (entry && entry->isBubbleTop()); + if (reactionsInBubble) { + _reactions->resizeGetHeight(textWidth); + } + if (!AdaptiveBubbles() && contentWidth == maxWidth()) { if (mediaDisplayed) { if (entry) { @@ -2672,7 +2781,6 @@ int Message::resizeContentGetHeight(int newWidth) { } } else { if (hasVisibleText()) { - auto textWidth = qMax(contentWidth - st::msgPadding.left() - st::msgPadding.right(), 1); if (textWidth != item->_textWidth) { item->_textWidth = textWidth; item->_textHeight = item->_text.countHeight(textWidth); @@ -2681,9 +2789,11 @@ int Message::resizeContentGetHeight(int newWidth) { } else { newHeight = 0; } - if (!mediaOnBottom) { + if (!mediaOnBottom && (!_viewButton || !reactionsInBubble)) { newHeight += st::msgPadding.bottom(); - if (mediaDisplayed) newHeight += st::mediaInBubbleSkip; + if (mediaDisplayed) { + newHeight += st::mediaInBubbleSkip; + } } if (!mediaOnTop) { newHeight += st::msgPadding.top(); @@ -2698,6 +2808,12 @@ int Message::resizeContentGetHeight(int newWidth) { } else if (entry) { newHeight += entry->resizeGetHeight(contentWidth); } + if (reactionsInBubble) { + if (!mediaDisplayed) { + newHeight += st::mediaInBubbleSkip; + } + newHeight += _reactions->height(); + } } if (displayFromName()) { @@ -2721,9 +2837,15 @@ int Message::resizeContentGetHeight(int newWidth) { reply->resize(contentWidth - st::msgPadding.left() - st::msgPadding.right()); newHeight += st::msgReplyPadding.top() + st::msgReplyBarSize.height() + st::msgReplyPadding.bottom(); } + if (needInfoDisplay()) { + newHeight += (bottomInfoHeight - st::msgDateFont->height); + } if (item->repliesAreComments() || item->externalReply()) { newHeight += st::historyCommentsButtonHeight; + } else if (_comments) { + _comments = nullptr; + checkHeavyPart(); } newHeight += viewButtonHeight(); } else if (mediaDisplayed) { @@ -2731,6 +2853,17 @@ int Message::resizeContentGetHeight(int newWidth) { } else { newHeight = 0; } + if (_reactions && !reactionsInBubble) { + const auto reactionsWidth = (!bubble && mediaDisplayed) + ? media->contentRectForReactions().width() + : contentWidth; + newHeight += st::mediaInBubbleSkip + + _reactions->resizeGetHeight(reactionsWidth); + if (hasOutLayout() && !delegate()->elementIsChatWide()) { + _reactions->flipToRight(); + } + } + if (const auto keyboard = item->inlineReplyKeyboard()) { const auto keyboardHeight = st::msgBotKbButton.margin + keyboard->naturalHeight(); newHeight += keyboardHeight; @@ -2741,6 +2874,17 @@ int Message::resizeContentGetHeight(int newWidth) { return newHeight; } +bool Message::needInfoDisplay() const { + const auto media = this->media(); + const auto mediaDisplayed = media ? media->isDisplayed() : false; + const auto entry = logEntryOriginal(); + return entry + ? !entry->customInfoLayout() + : (mediaDisplayed + ? !media->customInfoLayout() + : true); +} + bool Message::hasVisibleText() const { if (message()->emptyText()) { return false; @@ -2755,51 +2899,38 @@ QSize Message::performCountCurrentSize(int newWidth) { return { newWidth, newHeight }; } -void Message::refreshEditedBadge() { +void Message::refreshInfoSkipBlock() { const auto item = message(); - const auto edited = displayedEditBadge(); - const auto editDate = displayedEditDate(); - const auto dateText = dateTime().toString(cTimeFormat()); - if (edited) { - edited->refresh(dateText, editDate != 0); - } - if (const auto msgsigned = item->Get()) { - if (!msgsigned->isAnonymousRank) { - const auto text = (!edited || !editDate) - ? dateText - : edited->text.toString(); - msgsigned->refresh(text); + const auto media = this->media(); + const auto hasTextSkipBlock = [&] { + if (item->_text.isEmpty()) { + return false; + } else if (item->Has()) { + return false; + } else if (media && media->isDisplayed()) { + return false; + } else if (_reactions) { + return false; } - } - initTime(); -} - -void Message::initTime() const { - const auto item = message(); - if (const auto msgsigned = item->Get() - ; msgsigned && !msgsigned->isAnonymousRank) { - item->_timeWidth = msgsigned->maxWidth(); - } else if (const auto sponsored = displayedSponsorBadge()) { - item->_timeWidth = sponsored->maxWidth(); - } else if (const auto edited = displayedEditBadge()) { - item->_timeWidth = edited->maxWidth(); - } else { - const auto forwarded = item->Get(); - if (forwarded && forwarded->imported) { - const auto date = base::unixtime::parse(forwarded->originalDate); - item->_timeText = date.toString( - cDateFormat() + u", "_q + cTimeFormat() + ' ' - ) + tr::lng_imported(tr::now); + return true; + }(); + const auto skipWidth = skipBlockWidth(); + const auto skipHeight = skipBlockHeight(); + if (_reactions) { + if (needInfoDisplay()) { + _reactions->updateSkipBlock(skipWidth, skipHeight); } else { - item->_timeText = dateTime().toString(cTimeFormat()); + _reactions->removeSkipBlock(); } - item->_timeWidth = st::msgDateFont->width(item->_timeText); } - if (item->_text.hasSkipBlock()) { - if (item->_text.updateSkipBlock(skipBlockWidth(), skipBlockHeight())) { + if (!hasTextSkipBlock) { + if (item->_text.removeSkipBlock()) { item->_textWidth = -1; item->_textHeight = 0; } + } else if (item->_text.updateSkipBlock(skipWidth, skipHeight)) { + item->_textWidth = -1; + item->_textHeight = 0; } } @@ -2818,16 +2949,6 @@ TimeId Message::displayedEditDate() const { return TimeId(0); } -const HistoryMessageSponsored *Message::displayedSponsorBadge() const { - // Ignore media while sponsored messages are text only. - // if (const auto media = this->media()) { - // if (media->overrideEditedDate()) { - // return media->displayedEditBadge(); - // } - // } - return message()->Get(); -} - HistoryMessageEdited *Message::displayedEditBadge() { if (const auto media = this->media()) { if (media->overrideEditedDate()) { diff --git a/Telegram/SourceFiles/history/view/history_view_message.h b/Telegram/SourceFiles/history/view/history_view_message.h index f48f97dc3..4a4154079 100644 --- a/Telegram/SourceFiles/history/view/history_view_message.h +++ b/Telegram/SourceFiles/history/view/history_view_message.h @@ -8,12 +8,12 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #pragma once #include "history/view/history_view_element.h" +#include "history/view/history_view_bottom_info.h" #include "ui/effects/animations.h" #include "base/weak_ptr.h" class HistoryMessage; struct HistoryMessageEdited; -struct HistoryMessageSponsored; struct HistoryMessageForwarded; namespace HistoryView { @@ -21,6 +21,10 @@ namespace HistoryView { class ViewButton; class WebPage; +namespace Reactions { +class InlineList; +} // namespace Reactions + // Special type of Component for the channel actions log. struct LogEntryOriginal : public RuntimeComponent { @@ -51,6 +55,14 @@ public: const ClickHandlerPtr &handler, bool pressed) override; + not_null message() const; + + [[nodiscard]] const HistoryMessageEdited *displayedEditBadge() const; + [[nodiscard]] HistoryMessageEdited *displayedEditBadge(); + + [[nodiscard]] bool embedReactionsInBottomInfo() const; + [[nodiscard]] bool embedReactionsInBubble() const; + int marginTop() const override; int marginBottom() const override; void draw(Painter &p, const PaintContext &context) const override; @@ -66,7 +78,7 @@ public: int bottom, int width, InfoDisplayType type) const override; - bool pointInTime( + TextState bottomInfoTextState( int right, int bottom, QPoint point, @@ -76,6 +88,10 @@ public: TextSelection selection, TextSelectType type) const override; + Reactions::ButtonParameters reactionButtonParameters( + QPoint position, + const TextState &reactionState) const override; + bool hasHeavyPart() const override; void unloadHeavyPart() override; @@ -100,14 +116,19 @@ public: int left, int top, int outerWidth) const override; - ClickHandlerPtr rightActionLink() const override; - bool displayEditedBadge() const override; - TimeId displayedEditDate() const override; - HistoryMessageReply *displayedReply() const override; - bool toggleSelectionByHandlerClick( + [[nodiscard]] ClickHandlerPtr rightActionLink() const override; + [[nodiscard]] bool displayEditedBadge() const override; + [[nodiscard]] TimeId displayedEditDate() const override; + [[nodiscard]] HistoryMessageReply *displayedReply() const override; + [[nodiscard]] bool toggleSelectionByHandlerClick( const ClickHandlerPtr &handler) const override; - int infoWidth() const override; + [[nodiscard]] int infoWidth() const override; [[nodiscard]] int plainMaxWidth() const override; + [[nodiscard]] int bottomInfoFirstLineWidth() const override; + [[nodiscard]] bool bottomInfoIsWide() const override; + [[nodiscard]] bool isSignedAuthorElided() const override; + + void itemDataChanged() override; VerticalRepaintRange verticalRepaintRange() const override; @@ -120,11 +141,8 @@ protected: private: struct CommentsButton; - not_null message() const; - void initLogEntryOriginal(); void initPsa(); - void refreshEditedBadge(); void fromNameUpdated(int width) const; [[nodiscard]] bool showForwardsFromSender( @@ -197,42 +215,41 @@ private: QSize performCountOptimalSize() override; QSize performCountCurrentSize(int newWidth) override; bool hasVisibleText() const override; + [[nodiscard]] bool needInfoDisplay() const; [[nodiscard]] bool isPinnedContext() const; [[nodiscard]] bool displayFastShare() const; [[nodiscard]] bool displayGoToOriginal() const; [[nodiscard]] ClickHandlerPtr fastReplyLink() const; - [[nodiscard]] const HistoryMessageEdited *displayedEditBadge() const; - [[nodiscard]] HistoryMessageEdited *displayedEditBadge(); - [[nodiscard]] auto displayedSponsorBadge() const - -> const HistoryMessageSponsored*; - [[nodiscard]] bool displayPinIcon() const; - void initTime() const; - [[nodiscard]] int timeLeft() const; + void refreshInfoSkipBlock(); //[[nodiscard]] int plainMaxWidth() const; [[nodiscard]] int monospaceMaxWidth() const; void updateViewButtonExistence(); [[nodiscard]] int viewButtonHeight() const; - WebPage *logEntryOriginal() const; + [[nodiscard]] WebPage *logEntryOriginal() const; [[nodiscard]] ClickHandlerPtr createGoToCommentsLink() const; [[nodiscard]] ClickHandlerPtr psaTooltipLink() const; void psaTooltipToggled(bool shown) const; void refreshRightBadge(); + void refreshReactions(); mutable ClickHandlerPtr _rightActionLink; mutable ClickHandlerPtr _fastReplyLink; - mutable std::unique_ptr _comments; mutable std::unique_ptr _viewButton; + std::unique_ptr _reactions; + mutable std::unique_ptr _comments; Ui::Text::String _rightBadge; int _bubbleWidthLimit = 0; + BottomInfo _bottomInfo; + }; } // namespace HistoryView diff --git a/Telegram/SourceFiles/history/view/history_view_object.h b/Telegram/SourceFiles/history/view/history_view_object.h index 2e0ac67fd..9072b90be 100644 --- a/Telegram/SourceFiles/history/view/history_view_object.h +++ b/Telegram/SourceFiles/history/view/history_view_object.h @@ -23,16 +23,23 @@ public: return _height; } - int maxWidth() const { + [[nodiscard]] QSize optimalSize() const { + return { _maxWidth, _minHeight }; + } + [[nodiscard]] QSize currentSize() const { + return { _width, _height }; + } + + [[nodiscard]] int maxWidth() const { return _maxWidth; } - int minHeight() const { + [[nodiscard]] int minHeight() const { return _minHeight; } - int width() const { + [[nodiscard]] int width() const { return _width; } - int height() const { + [[nodiscard]] int height() const { return _height; } diff --git a/Telegram/SourceFiles/history/view/history_view_pinned_bar.cpp b/Telegram/SourceFiles/history/view/history_view_pinned_bar.cpp index 2c1d0ec2e..916555066 100644 --- a/Telegram/SourceFiles/history/view/history_view_pinned_bar.cpp +++ b/Telegram/SourceFiles/history/view/history_view_pinned_bar.cpp @@ -101,13 +101,9 @@ namespace { consumer.put_next(Ui::MessageBarContent{ .text = { tr::lng_contacts_loading(tr::now) }, }); - const auto channel = id.channel - ? session->data().channel(id.channel).get() - : nullptr; - const auto callback = [=](ChannelData *channel, MsgId id) { - consumer.put_done(); - }; - session->api().requestMessageData(channel, id.msg, callback); + const auto peer = session->data().peer(id.peer); + const auto callback = [=] { consumer.put_done(); }; + session->api().requestMessageData(peer, id.msg, callback); return rpl::lifetime(); }); return std::move( diff --git a/Telegram/SourceFiles/history/view/history_view_pinned_section.cpp b/Telegram/SourceFiles/history/view/history_view_pinned_section.cpp index 3115e0e1f..02a33c746 100644 --- a/Telegram/SourceFiles/history/view/history_view_pinned_section.cpp +++ b/Telegram/SourceFiles/history/view/history_view_pinned_section.cpp @@ -64,9 +64,7 @@ PinnedMemento::PinnedMemento( : _history(history) , _highlightId(highlightId) { _list.setAroundPosition({ - .fullId = FullMsgId( - history->channelId(), - highlightId), + .fullId = FullMsgId(history->peer->id, highlightId), .date = TimeId(0), }); } @@ -332,7 +330,7 @@ not_null PinnedWidget::history() const { Dialogs::RowDescriptor PinnedWidget::activeChat() const { return { _history, - FullMsgId(_history->channelId(), ShowAtUnreadMsgId) + FullMsgId(_history->peer->id, ShowAtUnreadMsgId) }; } @@ -391,8 +389,8 @@ void PinnedWidget::restoreState(not_null memento) { if (const auto highlight = memento->getHighlightId()) { const auto position = Data::MessagePosition{ .fullId = ((highlight > 0 || !_migratedPeer) - ? FullMsgId(_history->channelId(), highlight) - : FullMsgId(0, -highlight)), + ? FullMsgId(_history->peer->id, highlight) + : FullMsgId(_migratedPeer->id, -highlight)), .date = TimeId(0), }; _inner->showAroundPosition(position, [=] { @@ -685,6 +683,11 @@ CopyRestrictionType PinnedWidget::listSelectRestrictionType() { return SelectRestrictionTypeFor(_history->peer); } +auto PinnedWidget::listAllowedReactionsValue() +-> rpl::producer> { + return Data::PeerAllowedReactionsValue(_history->peer); +} + void PinnedWidget::confirmDeleteSelected() { ConfirmDeleteSelectedItems(_inner); } diff --git a/Telegram/SourceFiles/history/view/history_view_pinned_section.h b/Telegram/SourceFiles/history/view/history_view_pinned_section.h index 0021fdc24..49725bf54 100644 --- a/Telegram/SourceFiles/history/view/history_view_pinned_section.h +++ b/Telegram/SourceFiles/history/view/history_view_pinned_section.h @@ -105,6 +105,8 @@ public: not_null listChatTheme() override; CopyRestrictionType listCopyRestrictionType(HistoryItem *item) override; CopyRestrictionType listSelectRestrictionType() override; + auto listAllowedReactionsValue() + -> rpl::producer> override; protected: void resizeEvent(QResizeEvent *e) override; diff --git a/Telegram/SourceFiles/history/view/history_view_pinned_tracker.cpp b/Telegram/SourceFiles/history/view/history_view_pinned_tracker.cpp index ef26258d8..1f9cbe724 100644 --- a/Telegram/SourceFiles/history/view/history_view_pinned_tracker.cpp +++ b/Telegram/SourceFiles/history/view/history_view_pinned_tracker.cpp @@ -110,7 +110,7 @@ void PinnedTracker::refreshViewer() { void PinnedTracker::refreshCurrentFromSlice() { const auto proj1 = [](FullMsgId id) { - return id.channel ? id.msg : (id.msg - ServerMaxMsgId); + return peerIsChannel(id.peer) ? id.msg : (id.msg - ServerMaxMsgId); }; const auto proj2 = [](FullMsgId id) { return id.msg; diff --git a/Telegram/SourceFiles/history/view/history_view_react_button.cpp b/Telegram/SourceFiles/history/view/history_view_react_button.cpp new file mode 100644 index 000000000..972d54208 --- /dev/null +++ b/Telegram/SourceFiles/history/view/history_view_react_button.cpp @@ -0,0 +1,778 @@ +/* +This file is part of Telegram Desktop, +the official desktop application for the Telegram messaging service. + +For license and copyright information please follow this link: +https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL +*/ +#include "history/view/history_view_react_button.h" + +#include "history/view/history_view_cursor_state.h" +#include "ui/chat/chat_style.h" +#include "ui/chat/message_bubble.h" +#include "data/data_message_reactions.h" +#include "data/data_document.h" +#include "data/data_document_media.h" +#include "main/main_session.h" +#include "base/event_filter.h" +#include "styles/style_chat.h" + +namespace HistoryView::Reactions { +namespace { + +constexpr auto kToggleDuration = crl::time(80); +constexpr auto kActivateDuration = crl::time(150); +constexpr auto kExpandDuration = crl::time(150); +constexpr auto kBgCacheIndex = 0; +constexpr auto kShadowCacheIndex = 0; +constexpr auto kEmojiCacheIndex = 1; +constexpr auto kMaskCacheIndex = 2; +constexpr auto kCacheColumsCount = 3; +constexpr auto kButtonShowDelay = crl::time(300); +constexpr auto kButtonExpandDelay = crl::time(300); +constexpr auto kButtonHideDelay = crl::time(200); + +[[nodiscard]] QPoint LocalPosition(not_null e) { +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + return e->position().toPoint(); +#else // Qt >= 6.0 + return e->pos(); +#endif // Qt >= 6.0 +} + +[[nodiscard]] QSize CountMaxSizeWithMargins(style::margins margins) { + return QRect( + QPoint(), + st::reactionCornerSize + ).marginsAdded(margins).size(); +} + +[[nodiscard]] QSize CountOuterSize() { + return CountMaxSizeWithMargins(st::reactionCornerShadow); +} + +[[nodiscard]] int CornerImageSize(float64 scale) { + return int(base::SafeRound(st::reactionCornerImage * scale)); +} + +[[nodiscard]] QImage PrepareMaxOtherReaction(QImage image) { + const auto size = CornerImageSize(1.); + const auto factor = style::DevicePixelRatio(); + auto result = image.scaled( + QSize(size, size) * factor, + Qt::IgnoreAspectRatio, + Qt::SmoothTransformation); + result.setDevicePixelRatio(factor); + return result; +} + +} // namespace + +Button::Button( + Fn update, + ButtonParameters parameters, + Fn hideMe) +: _update(std::move(update)) +, _collapsed(QPoint(), CountOuterSize()) +, _finalHeight(_collapsed.height()) +, _expandTimer([=] { applyState(State::Inside, _update); }) +, _hideTimer(hideMe) { + applyParameters(parameters, nullptr); +} + +Button::~Button() = default; + +bool Button::isHidden() const { + return (_state == State::Hidden) && !_scaleAnimation.animating(); +} + +QRect Button::geometry() const { + return _geometry; +} + +int Button::scroll() const { + return _scroll; +} + +bool Button::expandUp() const { + return (_expandDirection == ExpandDirection::Up); +} + +bool Button::consumeWheelEvent(not_null e) { + const auto scrollMax = (_expandedInnerHeight - _expandedHeight); + if (_state != State::Inside + || scrollMax <= 0 + || !_geometry.contains(LocalPosition(e))) { + return false; + } + const auto delta = e->angleDelta(); + const auto horizontal = std::abs(delta.x()) > std::abs(delta.y()); + if (horizontal) { + return false; + } + const auto shift = delta.y() * (expandUp() ? 1 : -1); + _scroll = std::clamp(_scroll + shift, 0, scrollMax); + _update(_geometry); + e->accept(); + return true; +} + +void Button::applyParameters(ButtonParameters parameters) { + applyParameters(std::move(parameters), _update); +} + +void Button::applyParameters( + ButtonParameters parameters, + Fn update) { + const auto shift = parameters.center - _collapsed.center(); + _collapsed = _collapsed.translated(shift); + updateGeometry(update); + const auto inner = _geometry.marginsRemoved(st::reactionCornerShadow); + const auto active = inner.marginsAdded( + st::reactionCornerActiveAreaPadding + ).contains(parameters.pointer); + const auto inside = inner.contains(parameters.pointer) + || (active && (_state == State::Inside)); + if (_state != State::Inside && !_heightAnimation.animating()) { + updateExpandDirection(parameters); + } + const auto delayInside = inside && (_state != State::Inside); + if (!delayInside) { + _expandTimer.cancel(); + _lastGlobalPosition = std::nullopt; + } else { + const auto globalPositionChanged = _lastGlobalPosition + && (*_lastGlobalPosition != parameters.globalPointer); + if (globalPositionChanged || _state == State::Hidden) { + _expandTimer.callOnce(kButtonExpandDelay); + } + _lastGlobalPosition = parameters.globalPointer; + } + const auto state = (inside && !delayInside) + ? State::Inside + : active + ? State::Active + : State::Shown; + applyState(state, update); + if (parameters.outside && _state == State::Shown) { + _hideTimer.callOnce(kButtonHideDelay); + } else { + _hideTimer.cancel(); + } +} + +void Button::updateExpandDirection(const ButtonParameters ¶meters) { + const auto maxAddedHeight = (parameters.reactionsCount - 1) + * (st::reactionCornerSize.height() + st::reactionCornerSkip); + _expandedInnerHeight = _collapsed.height() + maxAddedHeight; + const auto addedHeight = std::min( + maxAddedHeight, + st::reactionCornerAddedHeightMax); + _expandedHeight = _collapsed.height() + addedHeight; + if (parameters.reactionsCount < 2) { + return; + } + const auto up = (_collapsed.y() - addedHeight >= parameters.visibleTop) + || (_collapsed.y() + _collapsed.height() + addedHeight + > parameters.visibleBottom); + _expandDirection = up ? ExpandDirection::Up : ExpandDirection::Down; +} + +void Button::updateGeometry(Fn update) { + const auto added = int(base::SafeRound( + _heightAnimation.value(_finalHeight) + )) - _collapsed.height(); + if (!added && _state != State::Inside) { + _scroll = 0; + } + const auto geometry = _collapsed.marginsAdded({ + 0, + (_expandDirection == ExpandDirection::Up) ? added : 0, + 0, + (_expandDirection == ExpandDirection::Down) ? added : 0, + }); + if (_geometry != geometry) { + if (update) { + update(_geometry); + } + _geometry = geometry; + if (update) { + update(_geometry); + } + } +} + +void Button::applyState(State state) { + applyState(state, _update); +} + +void Button::applyState(State state, Fn update) { + if (state == State::Hidden) { + _expandTimer.cancel(); + _hideTimer.cancel(); + } + const auto finalHeight = (state == State::Inside) + ? _expandedHeight + : _collapsed.height(); + if (_finalHeight != finalHeight) { + _heightAnimation.start( + [=] { updateGeometry(_update); }, + _finalHeight, + finalHeight, + kExpandDuration); + _finalHeight = finalHeight; + } + updateGeometry(update); + if (_state == state) { + return; + } + const auto duration = (state == State::Hidden + || _state == State::Hidden) + ? kToggleDuration + : kActivateDuration; + _scaleAnimation.start( + [=] { _update(_geometry); }, + ScaleForState(_state), + ScaleForState(state), + duration); + _state = state; +} + +float64 Button::ScaleForState(State state) { + switch (state) { + case State::Hidden: return 0.5; + case State::Shown: return 0.7; + case State::Active: + case State::Inside: return 1.; + } + Unexpected("State in ReactionButton::ScaleForState."); +} + +float64 Button::OpacityForScale(float64 scale) { + return std::min( + ((scale - ScaleForState(State::Hidden)) + / (ScaleForState(State::Shown) - ScaleForState(State::Hidden))), + 1.); +} + +float64 Button::currentScale() const { + return _scaleAnimation.value(ScaleForState(_state)); +} + +Manager::Manager( + QWidget *wheelEventsTarget, + Fn buttonUpdate) +: _outer(CountOuterSize()) +, _inner(QRect({}, st::reactionCornerSize)) +, _buttonShowTimer([=] { showButtonDelayed(); }) +, _buttonUpdate(std::move(buttonUpdate)) { + _inner.translate(QRect({}, _outer).center() - _inner.center()); + + const auto ratio = style::DevicePixelRatio(); + _cacheBg = QImage( + _outer.width() * ratio, + _outer.height() * kFramesCount * ratio, + QImage::Format_ARGB32_Premultiplied); + _cacheBg.setDevicePixelRatio(ratio); + _cacheBg.fill(Qt::transparent); + _cacheParts = QImage( + _outer.width() * kCacheColumsCount * ratio, + _outer.height() * kFramesCount * ratio, + QImage::Format_ARGB32_Premultiplied); + _cacheParts.setDevicePixelRatio(ratio); + _cacheParts.fill(Qt::transparent); + _shadowBuffer = QImage( + _outer * ratio, + QImage::Format_ARGB32_Premultiplied); + _shadowBuffer.setDevicePixelRatio(ratio); + + if (wheelEventsTarget) { + stealWheelEvents(wheelEventsTarget); + } + + _createChooseCallback = [=](QString emoji) { + return [=] { + if (const auto context = _buttonContext) { + updateButton({}); + _chosen.fire({ + .context = context, + .emoji = emoji, + }); + } + }; + }; +} + +void Manager::stealWheelEvents(not_null target) { + base::install_event_filter(target, [=](not_null e) { + return (e->type() == QEvent::Wheel + && consumeWheelEvent(static_cast(e.get()))) + ? base::EventFilterResult::Cancel + : base::EventFilterResult::Continue; + }); +} + +Manager::~Manager() = default; + +void Manager::updateButton(ButtonParameters parameters) { + const auto contextChanged = (_buttonContext != parameters.context); + if (contextChanged) { + if (_button) { + _button->applyState(ButtonState::Hidden); + _buttonHiding.push_back(std::move(_button)); + } + _buttonShowTimer.cancel(); + _scheduledParameters = std::nullopt; + } + _buttonContext = parameters.context; + parameters.reactionsCount = _list.size(); + if (!_buttonContext || _list.empty()) { + return; + } else if (_button) { + _button->applyParameters(parameters); + return; + } else if (parameters.outside) { + _buttonShowTimer.cancel(); + _scheduledParameters = std::nullopt; + return; + } + const auto globalPositionChanged = _scheduledParameters + && (_scheduledParameters->globalPointer != parameters.globalPointer); + const auto positionChanged = _scheduledParameters + && (_scheduledParameters->pointer != parameters.pointer); + _scheduledParameters = parameters; + if ((_buttonShowTimer.isActive() && positionChanged) + || globalPositionChanged) { + _buttonShowTimer.callOnce(kButtonShowDelay); + } +} + +void Manager::showButtonDelayed() { + _button = std::make_unique