From 6e0721d3849fa8dcbfe1c1239ca4c080754707c2 Mon Sep 17 00:00:00 2001 From: Stijn Peeters Date: Thu, 11 Jul 2024 16:49:04 +0200 Subject: [PATCH] Squashed commit of the following: commit eeb1ddeb7ca85b6802dfed3c74d1352062383d50 Merge: 2504c37b 43239467 Author: Stijn Peeters Date: Thu Jul 11 16:47:45 2024 +0200 Merge branch 'master' of https://github.com/digitalmethodsinitiative/4cat commit 43239467db046eea5eb5268f91d1b63a1042238d Author: Dale Wahl Date: Thu Jul 11 12:08:08 2024 +0200 fix processor more button would only show top level analysis if not logged in commit d6ab2b0783f8e40ecd8fadbc2abccffa6f093e39 Author: Dale Wahl Date: Tue Jul 9 15:35:25 2024 +0200 search_gab - use MappedItem commit 2504c37b67ff6f19720b44d8bb6054b1c3d5a155 Author: Stijn Peeters Date: Sat Jul 6 17:51:22 2024 +0200 Fix multiline spacing in multi select list commit fea66ce38be0717da6c1f847e7124f7069c096e2 Author: Dale Wahl Date: Fri Jul 5 13:15:45 2024 +0200 use processor media_type if dataset does not have media_type; set default media_type for downloaders commit d41fa34514e8177efdac7e64a31f2ee75c7d1652 Author: Dale Wahl Date: Fri Jul 5 12:57:18 2024 +0200 video_hasher: handle no metadata file commit 2820dcecc36ed4705a2776064d387ff7ed14e84f Author: Dale Wahl Date: Fri Jul 5 12:50:09 2024 +0200 num_rows not num_items() commit fb09162db902fa22fdf2d7a3ed171ce1489bd92f Author: Dale Wahl Date: Fri Jul 5 12:44:03 2024 +0200 Google vision API returning 400s; properly log and record processed entries; google networks should not run on empty datasets commit ebf39d8262d199895aedc4f7fa275c5685e58563 Author: Dale Wahl Date: Fri Jul 5 12:28:13 2024 +0200 fix image_category_wall whoops, cleared categories and post_values after filling them! commit 1ad9ec2c2e76604793ec37584c051f116af2fdab Author: Stijn Peeters Date: Fri Jul 5 12:03:54 2024 +0200 fsdfdsgd sorry commit c7254c08a477c6cdc8497507e8452c3eff7101c9 Author: Stijn Peeters Date: Fri Jul 5 12:01:21 2024 +0200 Fix razdel versioning commit b9a327abe99f2d9ede4f2747f34f20d1dc6803cb Author: Stijn Peeters Date: Fri Jul 5 11:57:47 2024 +0200 Reorganise tokeniser, stopwords commit fb13bc483af9ba0d677ee35fd045bf36ab1cddf7 Merge: 0b745692 e3046496 Author: Stijn Peeters Date: Fri Jul 5 11:56:08 2024 +0200 Merge branch 'master' of https://github.com/digitalmethodsinitiative/4cat commit e30464964262870c54c73f65a3bce630d6576f45 Author: Dale Wahl Date: Fri Jul 5 10:51:53 2024 +0200 media_upload allow setting for max_form_part and warn users of failure above certain number of files commit e4f982b4550b352a5d1a131abd78d52e6c196e48 Author: Dale Wahl Date: Fri Jul 5 09:50:49 2024 +0200 Update media_import help text; looks like failure happens somewhere between 600-1000 files due to Flask request size limits commit 0b74569280f8f87376a964a6b160ea1993cb3354 Author: Stijn Peeters Date: Thu Jul 4 17:55:36 2024 +0200 Add razdel as option for Russian tokenisation commit 9f15a2b8d666c3b6fddeb151b7c424cb44df18a6 Author: Dale Wahl Date: Thu Jul 4 17:13:15 2024 +0200 remove the log commit ffcb6a4239075ba190fb534b25b89507e09e5f56 Author: Dale Wahl Date: Thu Jul 4 17:12:43 2024 +0200 Inform user if too many files are uploaded I do not understand why this is appearing. app.config['MAX_CONTENT_LENGTH'] is set to None. Problem persists in Flask alone (i.e., does not appear to be Gunicorn/Nginx/Apache). commit 9cad12dd6f64a63c48d3b5b304b5c7d9d1a6ddb7 Author: Stijn Peeters Date: Thu Jul 4 15:09:42 2024 +0200 Bump version commit aad94f393de77cc9d4f578e1f5be66a3601a4c90 Author: Dale Wahl Date: Thu Jul 4 10:51:01 2024 +0200 Update setup.py to ensure videohash updates commit d9154a6f9c46a5c793909b88da751bc71d6f759f Author: Dale Wahl Date: Tue Jul 2 17:45:26 2024 +0200 clip: categorizing requires categories... seriously, guys? commit 0af9a5ec49bd2bcfbb87bda33976c65683f68777 Author: Dale Wahl Date: Tue Jul 2 17:31:49 2024 +0200 blip2: fix no metadata file found (uploads...) commit d695053f440bd938a57f06adea7b9c732ecf30d7 Author: Dale Wahl Date: Tue Jul 2 17:25:26 2024 +0200 cat_vis_wall - use str as category type if mixed i.e., use floats as string categories commit bcb914076760ea1fb0e277cdcd1782ffa101b535 Author: Sal Hagen Date: Tue Jul 2 16:06:43 2024 +0200 Add Twitter author profile pic and banner URLs commit 1b3b02f826578e8f702ea84a27c8ced7b1fab345 Author: Dale Wahl Date: Tue Jul 2 11:42:50 2024 +0200 add migrate.py log file in Docker commit 2aaa972e6888743fc329d721c37fa626cf2eeae3 Author: Dale Wahl Date: Tue Jul 2 11:42:22 2024 +0200 add necessary pip packages for upgrade in Docker environment; add error logging and save to file for trouble shooting commit 18b8a53c01b334e0f70610b1305d380b25dbe9c6 Author: Dale Wahl Date: Tue Jul 2 11:41:36 2024 +0200 update Dockerfile to keep build environment useful for interactive upgrade commit 7b224b9b798c9aaf956b5b618b98d742c4a2e7cd Author: Dale Wahl Date: Tue Jul 2 11:41:12 2024 +0200 remove docker-compose.yml versions commit acf5de0ed02e144b920a80abfdfa35986dd0ed4c Author: Stijn Peeters Date: Mon Jul 1 17:38:32 2024 +0200 Better issues.md, footer link commit 1953ca3895656ca9a12d2657e58019795ae64b3a Author: Dale Wahl Date: Mon Jul 1 12:00:07 2024 +0200 FIX: get_key() is more of a creating of a key then general getting of a key... commit 12289bb5c766d1af23799ff11278b46b48fc2841 Author: Dale Wahl Date: Mon Jul 1 11:37:06 2024 +0200 .metadata.json may not have top_parent via Media Uploader This may exist in other processors if a proper check is not in place; will need to review commit 25f4ed65ec2c32298a90490cf51037a7ea2d0bf9 Author: Dale Wahl <32108944+dale-wahl@users.noreply.github.com> Date: Tue Jun 25 14:43:40 2024 +0200 Media upload datasource! (#419) * basic changes to allow files box * basic imports, yay! * video_scene_timelines to work on video imports! * add is_compatible_with checks to processors that cannot run on new media top_datasets * more is_compatible fixes * necessary function for checking media_types * enable more processors on media datasets * consolidate user_input file type * detect mimetype from filename best I can do without downloading all the files first. * handle zip archives; allow log and metadata files * do not count metadata or log files in num_files * move machine learning processors so they can be imported elsewhere * audio_to_text datasource * When validating zip file uploads, send list of file attributes instead of the first 128K of the zip file * Check type of files in zip when uploading media * Skip useless files when uploading media as zip * check multiple zip types in JS * js !=== python * fix media_type for loose file imports; fix extension for audio_to_text preset; fix merge for some processors w/ media_type --------- Co-authored-by: Stijn Peeters commit 4ce689bdc3e441a7adf85883ddcda6bae0525ed9 Author: Stijn Peeters Date: Mon Jun 24 11:58:50 2024 +0200 Avoid KeyError commit 155522d0817d19ac7b6b0b0164242156d6f7443a Author: Dale Wahl Date: Thu Jun 20 15:58:21 2024 +0200 add generated images to image wall w/ text visual commit eecde519eab1208eeb6ee53c2d8febff7fb8febf Author: Dale Wahl Date: Thu Jun 20 15:57:56 2024 +0200 allow users to NOT generate all images from prompts commit d0b9574093a109997e63b1062b2bdd8e71300a29 Author: Stijn Peeters Date: Wed Jun 19 16:28:26 2024 +0200 ...don't mangle URLs in preview links commit c105e368a521ec54ae717bb9eb2fe9fae66cf6e8 Merge: 0028a999 8d4f99b2 Author: Dale Wahl Date: Wed Jun 19 16:25:36 2024 +0200 Merge branch 'master' of https://github.com/digitalmethodsinitiative/4cat commit 0028a9994d698611dd8b546b9b3bccbeec30b74f Author: Dale Wahl Date: Wed Jun 19 16:25:12 2024 +0200 add followups to processors commit 8d4f99b22e0308606c7f713ef704dfa939e85247 Author: Stijn Peeters Date: Wed Jun 19 16:17:22 2024 +0200 More flexible URL linking in CSV preview commit f4f8e6621bd6f2504dc3afc2078280bf5edb6444 Author: Dale Wahl Date: Wed Jun 19 13:54:00 2024 +0200 tokeniser fix: use default lang for word_tokenize if language is 'other' commit 127472e91d8e510f3de2a9cc4a87be6cf2d0deaa Author: Stijn Peeters Date: Tue Jun 18 16:45:01 2024 +0200 Better log messages for Telegram data source commit e8714b6fba72e00c690a8d643d8dc54d2250c94a Author: Stijn Peeters Date: Mon Jun 17 17:42:21 2024 +0200 Add 'crawl' feature to Telegram data source Fixes #321 (though might need a bit more testing) commit 25fded7b596097f7916e1793f1841bae2b63d453 Merge: d67cf440 b10e3bb8 Author: sal-phd-desktop Date: Fri Jun 14 16:23:02 2024 +0200 Merge branch 'master' of https://github.com/digitalmethodsinitiative/4cat commit d67cf440730ea1d4e124c76a4c21d65b56f39c68 Author: sal-phd-desktop Date: Fri Jun 14 16:22:59 2024 +0200 Fix export 4chan script and remove some unecessary code commit b10e3bb8f0c8a67aa5fdbba1962301d8acdf625c Author: Dale Wahl Date: Thu Jun 13 15:14:06 2024 +0200 video_hasher prefix: fix extension type commit ba565cdaa2ebeecf23fd60889d546c76b9ea5eb1 Author: Dale Wahl Date: Thu Jun 13 14:53:13 2024 +0200 video_hasher: fix to work with Pillow updates; add max amount videos commit 90da5d231eff6a4249bef5468fcdbf1ebcf9247a Author: Dale Wahl Date: Thu Jun 13 10:25:24 2024 +0200 image_cat_wall fix the fix commit a8b943d8e2c5471f82ea0442e2659d84fe8d9760 Author: Dale Wahl Date: Wed Jun 12 13:29:41 2024 +0200 add OCR processor to image w/ text visualization commit e7e636b6b89b6163fa6976e67edba68e7d75b7ac Author: Dale Wahl Date: Tue Jun 11 15:23:12 2024 +0200 add image_wall_w_text to follow on BLIP captions commit f74b97827f0465baf8483040471a77e4654e70b1 Author: Dale Wahl Date: Thu Jun 6 11:05:25 2024 +0200 image_category_wall: allow multiple images per item/post commit e3c9ea57d46b32ba47b00a6047a278ddd530adc1 Author: Dale Wahl Date: Thu May 30 16:27:50 2024 +0200 image_category_wall convert None to str for category commit 00874576c354235f4655f1d433ec4382010e18e3 Author: Dale Wahl Date: Thu May 30 14:54:51 2024 +0200 image_category_wall fix float categories commit e0c55a8ae132bedef5da27ecbbb9489a094d454c Author: Dale Wahl Date: Thu May 30 12:51:42 2024 +0200 download_images fix divide by zero when user can download all commit 3580fc9450501262badb8e61ef4b4df4b4c54322 Author: Dale Wahl Date: Thu May 30 12:51:24 2024 +0200 image_category_wall remove 'max' when user can use all images commit f2145bdeff1d68e46cdd3521ecbb61573f01a2f2 Author: Dale Wahl Date: Wed May 29 17:59:23 2024 +0200 rank_attributes: option to count missing data or blanks commit 01e7ab9677a75181bbedc62fa00e636ce2b17c18 Author: Dale Wahl Date: Wed May 29 16:53:57 2024 +0200 fix missing field strategy so default_stategy not overwritten on second loop default_stategy would be set to correctly to the callable, but overwritten on second loop (and map_missing is a dictionary at that point). --- .zenodo.json | 2 +- LICENSE-3DPARTY | 36 +- VERSION | 2 +- backend/lib/processor.py | 2 +- common/assets/stopwords-iso.json | 1 + common/assets/stopwords-languages.json | 58 + common/assets/wordlists/stopwords-iso-all.txt | 19170 ---------------- .../assets/wordlists/stopwords-iso-dutch.txt | 413 - .../wordlists/stopwords-iso-english.txt | 1298 -- common/assets/wordlists/stopwords-iso-zh.txt | 794 - .../wordlists/stopwords-terrier-english.txt | 733 - common/lib/config_definition.py | 8 + common/lib/dataset.py | 36 +- common/lib/helpers.py | 17 + common/lib/user_input.py | 2 +- datasources/audio_to_text/__init__.py | 6 + datasources/audio_to_text/audio_to_text.py | 53 + datasources/douyin/search_douyin.py | 2 +- datasources/gab/search_gab.py | 4 +- datasources/media_import/__init__.py | 6 + datasources/media_import/import_media.py | 257 + datasources/telegram/search_telegram.py | 159 +- datasources/twitter-import/search_twitter.py | 2 + docker-compose.yml | 2 - docker-compose_build.yml | 2 - docker-compose_public_ip.yml | 2 - docker/Dockerfile | 36 +- docker/docker-entrypoint.sh | 2 +- docker/wait-for-backend.sh | 2 +- helper-scripts/export_4chan.py | 8 +- helper-scripts/migrate.py | 40 +- processors/audio/audio_extractor.py | 6 +- processors/conversion/stringify.py | 10 + .../conversion/twitter_ndjson_to_tcat_json.py | 2 + processors/filtering/column_filter.py | 2 +- processors/filtering/write_annotations.py | 2 +- .../blip2_image_caption.py | 10 +- .../classify_images.py | 0 .../clip_categorize_images.py | 8 +- .../generate_images.py | 25 +- .../pix-plot.py | 17 +- .../text_from_image.py | 9 +- .../whisper_speech_to_text.py | 4 +- processors/metrics/clarifai_api.py | 4 +- processors/metrics/count_posts.py | 11 + processors/metrics/debate_metrics.py | 2 + processors/metrics/google_vision_api.py | 11 +- processors/metrics/hatebase.py | 12 + processors/metrics/most_quoted.py | 2 + processors/metrics/overtime-hatebase.py | 2 + processors/metrics/rank_attribute.py | 26 +- processors/metrics/thread_metadata.py | 12 + processors/metrics/top_hatebase.py | 2 + processors/metrics/top_images.py | 7 +- processors/metrics/url_titles.py | 12 + processors/metrics/vocabulary_overtime.py | 12 + processors/metrics/youtube_metadata.py | 4 +- processors/networks/colink_urls.py | 9 + .../google_vision_bipartite_network.py | 4 + processors/networks/google_vision_network.py | 4 + processors/networks/wikipedia_network.py | 9 + processors/presets/annotate-images.py | 10 + processors/presets/monthly-histogram.py | 12 + processors/presets/neologisms.py | 12 + processors/presets/similar-words.py | 12 + processors/presets/top-hashtags.py | 2 +- processors/presets/video-scene-timelines.py | 4 +- processors/text-analysis/collocations.py | 2 + .../text-analysis/documents_per_topic.py | 2 + .../text-analysis/generate_embeddings.py | 2 + processors/text-analysis/get_entities.py | 2 + processors/text-analysis/get_nouns.py | 2 + .../text-analysis/linguistic_extractor.py | 9 + processors/text-analysis/post_topic_matrix.py | 2 + processors/text-analysis/similar_words.py | 3 + processors/text-analysis/split_sentences.py | 2 + processors/text-analysis/tf_idf.py | 2 + processors/text-analysis/tokenise.py | 171 +- processors/text-analysis/top_vectors.py | 2 + processors/text-analysis/topic_modeling.py | 2 + processors/text-analysis/topic_words.py | 2 + processors/text-analysis/vectorise.py | 2 + .../visualisation/download-telegram-images.py | 4 + .../visualisation/download-telegram-videos.py | 4 + processors/visualisation/download_images.py | 12 +- processors/visualisation/download_tiktok.py | 8 + processors/visualisation/download_videos.py | 6 +- .../visualisation/image_category_wall.py | 240 +- processors/visualisation/image_wall.py | 2 +- processors/visualisation/image_wall_w_text.py | 279 + processors/visualisation/video_frames.py | 9 +- processors/visualisation/video_hasher.py | 78 +- .../visualisation/video_scene_frames.py | 9 +- .../visualisation/video_scene_identifier.py | 8 +- processors/visualisation/video_stack.py | 24 +- processors/visualisation/word-trees.py | 7 + .../visualisation/youtube_thumbnails.py | 3 + setup.py | 7 +- webtool/__init__.py | 4 + webtool/lib/template_filters.py | 22 + webtool/pages/issues.md | 26 +- webtool/static/css/dataset-page.css | 5 +- webtool/static/js/fourcat.js | 41 +- webtool/static/js/zip.min.js | 1 + .../components/datasource-option.html | 4 +- .../templates/components/result-child.html | 2 +- webtool/templates/layout.html | 3 +- webtool/templates/preview/csv.html | 6 +- webtool/views/views_misc.py | 4 + 109 files changed, 1711 insertions(+), 22761 deletions(-) create mode 100644 common/assets/stopwords-iso.json create mode 100644 common/assets/stopwords-languages.json delete mode 100644 common/assets/wordlists/stopwords-iso-all.txt delete mode 100644 common/assets/wordlists/stopwords-iso-dutch.txt delete mode 100644 common/assets/wordlists/stopwords-iso-english.txt delete mode 100644 common/assets/wordlists/stopwords-iso-zh.txt delete mode 100644 common/assets/wordlists/stopwords-terrier-english.txt create mode 100644 datasources/audio_to_text/__init__.py create mode 100644 datasources/audio_to_text/audio_to_text.py create mode 100644 datasources/media_import/__init__.py create mode 100644 datasources/media_import/import_media.py rename processors/{machine-learning => machine_learning}/blip2_image_caption.py (96%) rename processors/{machine-learning => machine_learning}/classify_images.py (100%) rename processors/{machine-learning => machine_learning}/clip_categorize_images.py (98%) rename processors/{machine-learning => machine_learning}/generate_images.py (90%) rename processors/{machine-learning => machine_learning}/pix-plot.py (94%) rename processors/{machine-learning => machine_learning}/text_from_image.py (97%) rename processors/{machine-learning => machine_learning}/whisper_speech_to_text.py (99%) create mode 100644 processors/visualisation/image_wall_w_text.py create mode 100644 webtool/static/js/zip.min.js diff --git a/.zenodo.json b/.zenodo.json index 8827b0659..3ab05ca45 100644 --- a/.zenodo.json +++ b/.zenodo.json @@ -3,7 +3,7 @@ "license": "MPL-2.0", "title": "4CAT Capture and Analysis Toolkit", "upload_type": "software", - "version": "v1.44", + "version": "v1.45", "keywords": [ "webmining", "scraping", diff --git a/LICENSE-3DPARTY b/LICENSE-3DPARTY index 4373ca127..db7a57f37 100644 --- a/LICENSE-3DPARTY +++ b/LICENSE-3DPARTY @@ -802,4 +802,38 @@ Incorporates the Graphology graph manipulation library AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. \ No newline at end of file + THE SOFTWARE. + +------------------------------------------------------------------------------- +Incorporates the zip.js library + - at /webtool/static/js/zip.min.js + - from https://github.com/gildas-lormeau/zip.js + + BSD 3-Clause License + + Copyright (c) 2023, Gildas Lormeau + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/VERSION b/VERSION index 7a39f43c7..6245ec1a2 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ -1.44 +1.45 This file should not be modified. It is used by 4CAT to determine whether it needs to run migration scripts to e.g. update the database structure to a more diff --git a/backend/lib/processor.py b/backend/lib/processor.py index ecfea2e67..c67fa7a9d 100644 --- a/backend/lib/processor.py +++ b/backend/lib/processor.py @@ -589,7 +589,7 @@ def extract_archived_file_by_name(self, filename, archive_path, staging_area=Non with zipfile.ZipFile(archive_path, "r") as archive_file: if filename not in archive_file.namelist(): - raise KeyError("File %s not found in archive %s" % (filename, archive_path)) + raise FileNotFoundError("File %s not found in archive %s" % (filename, archive_path)) else: archive_file.extract(filename, staging_area) return staging_area.joinpath(filename) diff --git a/common/assets/stopwords-iso.json b/common/assets/stopwords-iso.json new file mode 100644 index 000000000..36ae8f986 --- /dev/null +++ b/common/assets/stopwords-iso.json @@ -0,0 +1 @@ +{"af":["'n","aan","af","al","as","baie","by","daar","dag","dat","die","dit","een","ek","en","gaan","gesê","haar","het","hom","hulle","hy","in","is","jou","jy","kan","kom","ma","maar","met","my","na","nie","om","ons","op","saam","sal","se","sien","so","sy","te","toe","uit","van","vir","was","wat","ʼn"],"ar":["،","آض","آمينَ","آه","آهاً","آي","أ","أب","أجل","أجمع","أخ","أخذ","أصبح","أضحى","أقبل","أقل","أكثر","ألا","أم","أما","أمامك","أمامكَ","أمسى","أمّا","أن","أنا","أنت","أنتم","أنتما","أنتن","أنتِ","أنشأ","أنّى","أو","أوشك","أولئك","أولئكم","أولاء","أولالك","أوّهْ","أي","أيا","أين","أينما","أيّ","أَنَّ","أََيُّ","أُفٍّ","إذ","إذا","إذاً","إذما","إذن","إلى","إليكم","إليكما","إليكنّ","إليكَ","إلَيْكَ","إلّا","إمّا","إن","إنّما","إي","إياك","إياكم","إياكما","إياكن","إيانا","إياه","إياها","إياهم","إياهما","إياهن","إياي","إيهٍ","إِنَّ","ا","ابتدأ","اثر","اجل","احد","اخرى","اخلولق","اذا","اربعة","ارتدّ","استحال","اطار","اعادة","اعلنت","اف","اكثر","اكد","الألاء","الألى","الا","الاخيرة","الان","الاول","الاولى","التى","التي","الثاني","الثانية","الذاتي","الذى","الذي","الذين","السابق","الف","اللائي","اللاتي","اللتان","اللتيا","اللتين","اللذان","اللذين","اللواتي","الماضي","المقبل","الوقت","الى","اليوم","اما","امام","امس","ان","انبرى","انقلب","انه","انها","او","اول","اي","ايار","ايام","ايضا","ب","بات","باسم","بان","بخٍ","برس","بسبب","بسّ","بشكل","بضع","بطآن","بعد","بعض","بك","بكم","بكما","بكن","بل","بلى","بما","بماذا","بمن","بن","بنا","به","بها","بي","بيد","بين","بَسْ","بَلْهَ","بِئْسَ","تانِ","تانِك","تبدّل","تجاه","تحوّل","تلقاء","تلك","تلكم","تلكما","تم","تينك","تَيْنِ","تِه","تِي","ثلاثة","ثم","ثمّ","ثمّة","ثُمَّ","جعل","جلل","جميع","جير","حار","حاشا","حاليا","حاي","حتى","حرى","حسب","حم","حوالى","حول","حيث","حيثما","حين","حيَّ","حَبَّذَا","حَتَّى","حَذارِ","خلا","خلال","دون","دونك","ذا","ذات","ذاك","ذانك","ذانِ","ذلك","ذلكم","ذلكما","ذلكن","ذو","ذوا","ذواتا","ذواتي","ذيت","ذينك","ذَيْنِ","ذِه","ذِي","راح","رجع","رويدك","ريث","رُبَّ","زيارة","سبحان","سرعان","سنة","سنوات","سوف","سوى","سَاءَ","سَاءَمَا","شبه","شخصا","شرع","شَتَّانَ","صار","صباح","صفر","صهٍ","صهْ","ضد","ضمن","طاق","طالما","طفق","طَق","ظلّ","عاد","عام","عاما","عامة","عدا","عدة","عدد","عدم","عسى","عشر","عشرة","علق","على","عليك","عليه","عليها","علًّ","عن","عند","عندما","عوض","عين","عَدَسْ","عَمَّا","غدا","غير","ـ","ف","فان","فلان","فو","فى","في","فيم","فيما","فيه","فيها","قال","قام","قبل","قد","قطّ","قلما","قوة","كأنّما","كأين","كأيّ","كأيّن","كاد","كان","كانت","كذا","كذلك","كرب","كل","كلا","كلاهما","كلتا","كلم","كليكما","كليهما","كلّما","كلَّا","كم","كما","كي","كيت","كيف","كيفما","كَأَنَّ","كِخ","لئن","لا","لات","لاسيما","لدن","لدى","لعمر","لقاء","لك","لكم","لكما","لكن","لكنَّما","لكي","لكيلا","للامم","لم","لما","لمّا","لن","لنا","له","لها","لو","لوكالة","لولا","لوما","لي","لَسْتَ","لَسْتُ","لَسْتُم","لَسْتُمَا","لَسْتُنَّ","لَسْتِ","لَسْنَ","لَعَلَّ","لَكِنَّ","لَيْتَ","لَيْسَ","لَيْسَا","لَيْسَتَا","لَيْسَتْ","لَيْسُوا","لَِسْنَا","ما","ماانفك","مابرح","مادام","ماذا","مازال","مافتئ","مايو","متى","مثل","مذ","مساء","مع","معاذ","مقابل","مكانكم","مكانكما","مكانكنّ","مكانَك","مليار","مليون","مما","ممن","من","منذ","منها","مه","مهما","مَنْ","مِن","نحن","نحو","نعم","نفس","نفسه","نهاية","نَخْ","نِعِمّا","نِعْمَ","ها","هاؤم","هاكَ","هاهنا","هبّ","هذا","هذه","هكذا","هل","هلمَّ","هلّا","هم","هما","هن","هنا","هناك","هنالك","هو","هي","هيا","هيت","هيّا","هَؤلاء","هَاتانِ","هَاتَيْنِ","هَاتِه","هَاتِي","هَجْ","هَذا","هَذانِ","هَذَيْنِ","هَذِه","هَذِي","هَيْهَاتَ","و","و6","وا","واحد","واضاف","واضافت","واكد","وان","واهاً","واوضح","وراءَك","وفي","وقال","وقالت","وقد","وقف","وكان","وكانت","ولا","ولم","ومن","وهو","وهي","ويكأنّ","وَيْ","وُشْكَانََ","يكون","يمكن","يوم","ّأيّان"],"hy":["այդ","այլ","այն","այս","դու","դուք","եմ","են","ենք","ես","եք","է","էի","էին","էինք","էիր","էիք","էր","ըստ","թ","ի","ին","իսկ","իր","կամ","համար","հետ","հետո","մենք","մեջ","մի","ն","նա","նաև","նրա","նրանք","որ","որը","որոնք","որպես","ու","ում","պիտի","վրա","և"],"eu":["al","anitz","arabera","asko","baina","bat","batean","batek","bati","batzuei","batzuek","batzuetan","batzuk","bera","beraiek","berau","berauek","bere","berori","beroriek","beste","bezala","da","dago","dira","ditu","du","dute","edo","egin","ere","eta","eurak","ez","gainera","gu","gutxi","guzti","haiei","haiek","haietan","hainbeste","hala","han","handik","hango","hara","hari","hark","hartan","hau","hauei","hauek","hauetan","hemen","hemendik","hemengo","hi","hona","honek","honela","honetan","honi","hor","hori","horiei","horiek","horietan","horko","horra","horrek","horrela","horretan","horri","hortik","hura","izan","ni","noiz","nola","non","nondik","nongo","nor","nora","ze","zein","zen","zenbait","zenbat","zer","zergatik","ziren","zituen","zu","zuek","zuen","zuten"],"bn":["অতএব","অথচ","অথবা","অনুযায়ী","অনেক","অনেকে","অনেকেই","অন্তত","অন্য","অবধি","অবশ্য","অর্থাত","আই","আগামী","আগে","আগেই","আছে","আজ","আদ্যভাগে","আপনার","আপনি","আবার","আমরা","আমাকে","আমাদের","আমার","আমি","আর","আরও","ই","ইত্যাদি","ইহা","উচিত","উত্তর","উনি","উপর","উপরে","এ","এঁদের","এঁরা","এই","একই","একটি","একবার","একে","এক্","এখন","এখনও","এখানে","এখানেই","এটা","এটাই","এটি","এত","এতটাই","এতে","এদের","এব","এবং","এবার","এমন","এমনকী","এমনি","এর","এরা","এল","এস","এসে","ঐ","ও","ওঁদের","ওঁর","ওঁরা","ওই","ওকে","ওখানে","ওদের","ওর","ওরা","কখনও","কত","কবে","কমনে","কয়েক","কয়েকটি","করছে","করছেন","করতে","করবে","করবেন","করলে","করলেন","করা","করাই","করায়","করার","করি","করিতে","করিয়া","করিয়ে","করে","করেই","করেছিলেন","করেছে","করেছেন","করেন","কাউকে","কাছ","কাছে","কাজ","কাজে","কারও","কারণ","কি","কিংবা","কিছু","কিছুই","কিন্তু","কী","কে","কেউ","কেউই","কেখা","কেন","কোটি","কোন","কোনও","কোনো","ক্ষেত্রে","কয়েক","খুব","গিয়ে","গিয়েছে","গিয়ে","গুলি","গেছে","গেল","গেলে","গোটা","চলে","চান","চায়","চার","চালু","চেয়ে","চেষ্টা","ছাড়া","ছাড়াও","ছিল","ছিলেন","জন","জনকে","জনের","জন্য","জন্যওজে","জানতে","জানা","জানানো","জানায়","জানিয়ে","জানিয়েছে","জে","জ্নজন","টি","ঠিক","তখন","তত","তথা","তবু","তবে","তা","তাঁকে","তাঁদের","তাঁর","তাঁরা","তাঁাহারা","তাই","তাও","তাকে","তাতে","তাদের","তার","তারপর","তারা","তারৈ","তাহলে","তাহা","তাহাতে","তাহার","তিনঐ","তিনি","তিনিও","তুমি","তুলে","তেমন","তো","তোমার","থাকবে","থাকবেন","থাকা","থাকায়","থাকে","থাকেন","থেকে","থেকেই","থেকেও","দিকে","দিতে","দিন","দিয়ে","দিয়েছে","দিয়েছেন","দিলেন","দু","দুই","দুটি","দুটো","দেওয়া","দেওয়ার","দেওয়া","দেখতে","দেখা","দেখে","দেন","দেয়","দ্বারা","ধরা","ধরে","ধামার","নতুন","নয়","না","নাই","নাকি","নাগাদ","নানা","নিজে","নিজেই","নিজেদের","নিজের","নিতে","নিয়ে","নিয়ে","নেই","নেওয়া","নেওয়ার","নেওয়া","নয়","পক্ষে","পর","পরে","পরেই","পরেও","পর্যন্ত","পাওয়া","পাচ","পারি","পারে","পারেন","পি","পেয়ে","পেয়্র্","প্রতি","প্রথম","প্রভৃতি","প্রযন্ত","প্রাথমিক","প্রায়","প্রায়","ফলে","ফিরে","ফের","বক্তব্য","বদলে","বন","বরং","বলতে","বলল","বললেন","বলা","বলে","বলেছেন","বলেন","বসে","বহু","বা","বাদে","বার","বি","বিনা","বিভিন্ন","বিশেষ","বিষয়টি","বেশ","বেশি","ব্যবহার","ব্যাপারে","ভাবে","ভাবেই","মতো","মতোই","মধ্যভাগে","মধ্যে","মধ্যেই","মধ্যেও","মনে","মাত্র","মাধ্যমে","মোট","মোটেই","যখন","যত","যতটা","যথেষ্ট","যদি","যদিও","যা","যাঁর","যাঁরা","যাওয়া","যাওয়ার","যাওয়া","যাকে","যাচ্ছে","যাতে","যাদের","যান","যাবে","যায়","যার","যারা","যিনি","যে","যেখানে","যেতে","যেন","যেমন","র","রকম","রয়েছে","রাখা","রেখে","লক্ষ","শুধু","শুরু","সঙ্গে","সঙ্গেও","সব","সবার","সমস্ত","সম্প্রতি","সহ","সহিত","সাধারণ","সামনে","সি","সুতরাং","সে","সেই","সেখান","সেখানে","সেটা","সেটাই","সেটাও","সেটি","স্পষ্ট","স্বয়ং","হইতে","হইবে","হইয়া","হওয়া","হওয়ায়","হওয়ার","হচ্ছে","হত","হতে","হতেই","হন","হবে","হবেন","হয়","হয়তো","হয়নি","হয়ে","হয়েই","হয়েছিল","হয়েছে","হয়েছেন","হল","হলে","হলেই","হলেও","হলো","হাজার","হিসাবে","হৈলে","হোক","হয়"],"br":["'blam","'d","'m","'r","'ta","'vat","'z","'zo","a","a:","aba","abalamour","abaoe","ac'hane","ac'hanoc'h","ac'hanomp","ac'hanon","ac'hanout","adal","adalek","adarre","ae","aec'h","aed","aemp","aen","aent","aes","afe","afec'h","afed","afemp","afen","afent","afes","ag","ah","aimp","aint","aio","aiou","aje","ajec'h","ajed","ajemp","ajen","ajent","ajes","al","alato","alies","aliesañ","alkent","all","allas","allo","allô","am","amañ","amzer","an","anezhañ","anezhe","anezhi","anezho","anvet","aon","aotren","ar","arall","araok","araoki","araozañ","araozo","araozoc'h","araozomp","araozon","araozor","araozout","arbenn","arre","atalek","atav","az","azalek","azirazañ","azirazi","azirazo","azirazoc'h","azirazomp","azirazon","azirazor","azirazout","b:","ba","ba'l","ba'n","ba'r","bad","bah","bal","ban","bar","bastañ","befe","bell","benaos","benn","bennag","bennak","bennozh","bep","bepred","berr","berzh","bet","betek","betra","bev","bevet","bez","bezañ","beze","bezent","bezet","bezh","bezit","bezomp","bihan","bije","biou","biskoazh","blam","bo","boa","bominapl","boudoudom","bouez","boull","boum","bout","bras","brasañ","brav","bravo","bremañ","bres","brokenn","bronn","brrr","brutal","buhezek","c'h:","c'haout","c'he","c'hem","c'herz","c'heñver","c'hichen","c'hiz","c'hoazh","c'horre","c'houde","c'houst","c'hreiz","c'hwec'h","c'hwec'hvet","c'hwezek","c'hwi","ch:","chaous","chik","chit","chom","chut","d'","d'al","d'an","d'ar","d'az","d'e","d'he","d'ho","d'hol","d'hon","d'hor","d'o","d'ober","d'ul","d'un","d'ur","d:","da","dak","daka","dal","dalbezh","dalc'hmat","dalit","damdost","damheñvel","damm","dan","danvez","dao","daol","daonet","daou","daoust","daouzek","daouzekvet","darn","dastrewiñ","dav","davedoc'h","davedomp","davedon","davedor","davedout","davet","davetañ","davete","daveti","daveto","defe","dehou","dek","dekvet","den","deoc'h","deomp","deor","derc'hel","deus","dez","deze","dezhañ","dezhe","dezhi","dezho","di","diabarzh","diagent","diar","diaraok","diavaez","dibaoe","dibaot","dibar","dic'halañ","didiac'h","dienn","difer","diganeoc'h","diganeomp","diganeor","diganimp","diganin","diganit","digant","digantañ","digante","diganti","diganto","digemmesk","diget","digor","digoret","dija","dije","dimp","din","dinaou","dindan","dindanañ","dindani","dindano","dindanoc'h","dindanomp","dindanon","dindanor","dindanout","dioutañ","dioute","diouti","diouto","diouzh","diouzhin","diouzhit","diouzhoc'h","diouzhomp","diouzhor","dirak","dirazañ","dirazi","dirazo","dirazoc'h","dirazomp","dirazon","dirazor","dirazout","disheñvel","dispar","distank","dister","disterañ","disterig","distro","dit","divaez","diwar","diwezhat","diwezhañ","do","doa","doare","dont","dost","doue","douetus","douez","doug","draou","draoñ","dre","drede","dreist","dreistañ","dreisti","dreisto","dreistoc'h","dreistomp","dreiston","dreistor","dreistout","drek","dreñv","dring","dro","du","e","e:","eas","ebet","ec'h","edo","edoc'h","edod","edomp","edon","edont","edos","eer","eeun","efed","egedoc'h","egedomp","egedon","egedor","egedout","eget","egetañ","egete","egeti","egeto","eh","eil","eilvet","eizh","eizhvet","ejoc'h","ejod","ejomp","ejont","ejout","el","em","emaint","emaoc'h","emaomp","emaon","emaout","emañ","eme","emeur","emezañ","emezi","emezo","emezoc'h","emezomp","emezon","emezout","emporzhiañ","en","end","endan","endra","enep","ennañ","enni","enno","ennoc'h","ennomp","ennon","ennor","ennout","enta","eo","eomp","eont","eor","eot","er","erbet","erfin","esa","esae","espar","estlamm","estrañj","eta","etre","etreoc'h","etrezo","etrezoc'h","etrezomp","etrezor","euh","eur","eus","evel","evelato","eveldoc'h","eveldomp","eveldon","eveldor","eveldout","evelkent","eveltañ","evelte","evelti","evelto","evidoc'h","evidomp","evidon","evidor","evidout","evit","evitañ","evite","eviti","evito","ez","eñ","f:","fac'h","fall","fed","feiz","fenn","fezh","fin","finsalvet","foei","fouilhezañ","g:","gallout","ganeoc'h","ganeomp","ganin","ganit","gant","gantañ","ganti","ganto","gaout","gast","gein","gellout","genndost","gentañ","ger","gerz","get","geñver","gichen","gin","giz","glan","gloev","goll","gorre","goude","gouez","gouezit","gouezomp","goulz","gounnar","gour","goust","gouze","gouzout","gra","grak","grec'h","greiz","grenn","greomp","grit","groñs","gutez","gwall","gwashoc'h","gwazh","gwech","gwechall","gwechoù","gwell","gwezh","gwezhall","gwezharall","gwezhoù","gwig","gwirionez","gwitibunan","gêr","h:","ha","hag","han","hanter","hanterc'hantad","hanterkantved","harz","hañ","hañval","he","hebioù","hec'h","hei","hein","hem","hemañ","hen","hend","henhont","henn","hennezh","hent","hep","hervez","hervezañ","hervezi","hervezo","hervezoc'h","hervezomp","hervezon","hervezor","hervezout","heul","heuliañ","hevelep","heverk","heñvel","heñvelat","heñvelañ","heñveliñ","heñveloc'h","heñvelout","hi","hilh","hini","hirie","hirio","hiziv","hiziviken","ho","hoaliñ","hoc'h","hogen","hogos","hogozik","hol","holl","holà","homañ","hon","honhont","honnezh","hont","hop","hopala","hor","hou","houp","hudu","hue","hui","hum","hurrah","i","i:","in","int","is","ispisial","isurzhiet","it","ivez","izelañ","j:","just","k:","kae","kaer","kalon","kalz","kant","kaout","kar","kazi","keid","kein","keit","kel","kellies","keloù","kement","ken","kenkent","kenkoulz","kenment","kent","kentañ","kentizh","kentoc'h","kentre","ker","kerkent","kerz","kerzh","ket","keta","keñver","keñverel","keñverius","kichen","kichenik","kit","kiz","klak","klek","klik","komprenet","komz","kont","korf","korre","koulskoude","koulz","koust","krak","krampouezh","krec'h","kreiz","kuit","kwir","l:","la","laez","laoskel","laouen","lavar","lavaret","lavarout","lec'h","lein","leizh","lerc'h","leun","leuskel","lew","lies","liesañ","lod","lusk","lâr","lârout","m:","ma","ma'z","mac'h","mac'hat","mac'hañ","mac'hoc'h","mad","maez","maksimal","mann","mar","mard","marg","marzh","mat","mañ","me","memes","memestra","merkapl","mersi","mes","mesk","met","meur","mil","minimal","moan","moaniaat","mod","mont","mout","mui","muiañ","muioc'h","n","n'","n:","na","nag","naontek","naturel","nav","navet","ne","nebeudig","nebeut","nebeutañ","nebeutoc'h","neketa","nemedoc'h","nemedomp","nemedon","nemedor","nemedout","nemet","nemetañ","nemete","nemeti","nemeto","nemeur","neoac'h","nepell","nerzh","nes","neseser","netra","neubeudoù","neuhe","neuze","nevez","newazh","nez","ni","nikun","niverus","nul","o","o:","oa","oac'h","oad","oamp","oan","oant","oar","oas","ober","oc'h","oc'ho","oc'hola","oc'hpenn","oh","ohe","ollé","olole","olé","omp","on","ordin","ordinal","ouejoc'h","ouejod","ouejomp","ouejont","ouejout","ouek","ouezas","ouezi","ouezimp","ouezin","ouezint","ouezis","ouezo","ouezoc'h","ouezor","ouf","oufe","oufec'h","oufed","oufemp","oufen","oufent","oufes","ouie","ouiec'h","ouied","ouiemp","ouien","ouient","ouies","ouije","ouijec'h","ouijed","ouijemp","ouijen","ouijent","ouijes","out","outañ","outi","outo","ouzer","ouzh","ouzhin","ouzhit","ouzhoc'h","ouzhomp","ouzhor","ouzhpenn","ouzhpennik","ouzoc'h","ouzomp","ouzon","ouzont","ouzout","p'","p:","pa","pad","padal","paf","pan","panevedeoc'h","panevedo","panevedomp","panevedon","panevedout","panevet","panevetañ","paneveti","pas","paseet","pe","peadra","peder","pedervet","pedervetvet","pefe","pegeit","pegement","pegen","pegiz","pegoulz","pehini","pelec'h","pell","pemod","pemp","pempved","pemzek","penaos","penn","peogwir","peotramant","pep","perak","perc'hennañ","pergen","permetiñ","peseurt","pet","petiaoul","petoare","petra","peur","peurgetket","peurheñvel","peurliesañ","peurvuiañ","peus","peustost","peuz","pevar","pevare","pevarevet","pevarzek","pez","peze","pezh","pff","pfft","pfut","picher","pif","pife","pign","pije","pikol","pitiaoul","piv","plaouf","plok","plouf","po","poa","poelladus","pof","pok","posupl","pouah","pourc'henn","prest","prestik","prim","prin","provostapl","pst","pu","pur","r:","ra","rae","raec'h","raed","raemp","raen","raent","raes","rafe","rafec'h","rafed","rafemp","rafen","rafent","rafes","rag","raimp","raint","raio","raje","rajec'h","rajed","rajemp","rajen","rajent","rajes","rak","ral","ran","rankout","raok","razh","re","reas","reer","regennoù","reiñ","rejoc'h","rejod","rejomp","rejont","rejout","rener","rentañ","reoc'h","reomp","reont","reor","reot","resis","ret","reve","rez","ri","rik","rin","ris","rit","rouez","s:","sac'h","sant","sav","sañset","se","sed","seitek","seizh","seizhvet","sell","sellit","ser","setu","seul","seurt","siwazh","skignañ","skoaz","skouer","sort","souden","souvitañ","soñj","speriañ","spririñ","stad","stlabezañ","stop","stranañ","strewiñ","strishaat","stumm","sujed","surtoud","t:","ta","taer","tailh","tak","tal","talvoudegezh","tamm","tanav","taol","te","techet","teir","teirvet","telt","teltenn","teus","teut","teuteu","ti","tik","toa","tok","tost","tostig","toud","touesk","touez","toull","tra","trantenn","traoñ","trawalc'h","tre","trede","tregont","tremenet","tri","trivet","triwec'h","trizek","tro","trugarez","trumm","tsoin","tsouin","tu","tud","u:","ugent","uhel","uhelañ","ul","un","unan","unanez","unanig","unnek","unnekvet","ur","urzh","us","v:","va","vale","van","vare","vat","vefe","vefec'h","vefed","vefemp","vefen","vefent","vefes","vesk","vete","vez","vezan","vezañ","veze","vezec'h","vezed","vezemp","vezen","vezent","vezer","vezes","vezez","vezit","vezomp","vezont","vi","vihan","vihanañ","vije","vijec'h","vijed","vijemp","vijen","vijent","vijes","viken","vimp","vin","vint","vior","viot","virviken","viskoazh","vlan","vlaou","vo","vod","voe","voec'h","voed","voemp","voen","voent","voes","vont","vostapl","vrac'h","vrasañ","vremañ","w:","walc'h","war","warnañ","warni","warno","warnoc'h","warnomp","warnon","warnor","warnout","wazh","wech","wechoù","well","y:","you","youadenn","youc'hadenn","youc'hou","z:","za","zan","zaw","zeu","zi","ziar","zigarez","ziget","zindan","zioc'h","ziouzh","zirak","zivout","ziwar","ziwezhañ","zo","zoken","zokenoc'h","zouesk","zouez","zro","zu"],"bg":["а","автентичен","аз","ако","ала","бе","без","беше","би","бивш","бивша","бившо","бил","била","били","било","благодаря","близо","бъдат","бъде","бяха","в","вас","ваш","ваша","вероятно","вече","взема","ви","вие","винаги","внимава","време","все","всеки","всички","всичко","всяка","във","въпреки","върху","г","ги","главен","главна","главно","глас","го","година","години","годишен","д","да","дали","два","двама","двамата","две","двете","ден","днес","дни","до","добра","добре","добро","добър","докато","докога","дори","досега","доста","друг","друга","други","е","евтин","едва","един","една","еднаква","еднакви","еднакъв","едно","екип","ето","живот","за","забавям","зад","заедно","заради","засега","заспал","затова","защо","защото","и","из","или","им","има","имат","иска","й","каза","как","каква","какво","както","какъв","като","кога","когато","което","които","кой","който","колко","която","къде","където","към","лесен","лесно","ли","лош","м","май","малко","ме","между","мек","мен","месец","ми","много","мнозина","мога","могат","може","мокър","моля","момента","му","н","на","над","назад","най","направи","напред","например","нас","не","него","нещо","нея","ни","ние","никой","нито","нищо","но","нов","нова","нови","новина","някои","някой","няколко","няма","обаче","около","освен","особено","от","отгоре","отново","още","пак","по","повече","повечето","под","поне","поради","после","почти","прави","пред","преди","през","при","пък","първата","първи","първо","пъти","равен","равна","с","са","сам","само","се","сега","си","син","скоро","след","следващ","сме","смях","според","сред","срещу","сте","съм","със","също","т","т.н.","тази","така","такива","такъв","там","твой","те","тези","ти","то","това","тогава","този","той","толкова","точно","три","трябва","тук","тъй","тя","тях","у","утре","харесва","хиляди","ч","часа","че","често","чрез","ще","щом","юмрук","я","як"],"ca":["a","abans","ací","ah","així","això","al","aleshores","algun","alguna","algunes","alguns","alhora","allà","allí","allò","als","altra","altre","altres","amb","ambdues","ambdós","anar","ans","apa","aquell","aquella","aquelles","aquells","aquest","aquesta","aquestes","aquests","aquí","baix","bastant","bé","cada","cadascuna","cadascunes","cadascuns","cadascú","com","consegueixo","conseguim","conseguir","consigueix","consigueixen","consigueixes","contra","d'un","d'una","d'unes","d'uns","dalt","de","del","dels","des","des de","després","dins","dintre","donat","doncs","durant","e","eh","el","elles","ells","els","em","en","encara","ens","entre","era","erem","eren","eres","es","esta","estan","estat","estava","estaven","estem","esteu","estic","està","estàvem","estàveu","et","etc","ets","fa","faig","fan","fas","fem","fer","feu","fi","fins","fora","gairebé","ha","han","has","haver","havia","he","hem","heu","hi","ho","i","igual","iguals","inclòs","ja","jo","l'hi","la","les","li","li'n","llarg","llavors","m'he","ma","mal","malgrat","mateix","mateixa","mateixes","mateixos","me","mentre","meu","meus","meva","meves","mode","molt","molta","moltes","molts","mon","mons","més","n'he","n'hi","ne","ni","no","nogensmenys","només","nosaltres","nostra","nostre","nostres","o","oh","oi","on","pas","pel","pels","per","per que","perquè","però","poc","poca","pocs","podem","poden","poder","podeu","poques","potser","primer","propi","puc","qual","quals","quan","quant","que","quelcom","qui","quin","quina","quines","quins","què","s'ha","s'han","sa","sabem","saben","saber","sabeu","sap","saps","semblant","semblants","sense","ser","ses","seu","seus","seva","seves","si","sobre","sobretot","soc","solament","sols","som","son","sons","sota","sou","sóc","són","t'ha","t'han","t'he","ta","tal","també","tampoc","tan","tant","tanta","tantes","te","tene","tenim","tenir","teniu","teu","teus","teva","teves","tinc","ton","tons","tot","tota","totes","tots","un","una","unes","uns","us","va","vaig","vam","van","vas","veu","vosaltres","vostra","vostre","vostres","érem","éreu","és","éssent","últim","ús"],"zh":["、","。","〈","〉","《","》","一","一个","一些","一何","一切","一则","一方面","一旦","一来","一样","一种","一般","一转眼","七","万一","三","上","上下","下","不","不仅","不但","不光","不单","不只","不外乎","不如","不妨","不尽","不尽然","不得","不怕","不惟","不成","不拘","不料","不是","不比","不然","不特","不独","不管","不至于","不若","不论","不过","不问","与","与其","与其说","与否","与此同时","且","且不说","且说","两者","个","个别","中","临","为","为了","为什么","为何","为止","为此","为着","乃","乃至","乃至于","么","之","之一","之所以","之类","乌乎","乎","乘","九","也","也好","也罢","了","二","二来","于","于是","于是乎","云云","云尔","五","些","亦","人","人们","人家","什","什么","什么样","今","介于","仍","仍旧","从","从此","从而","他","他人","他们","他们们","以","以上","以为","以便","以免","以及","以故","以期","以来","以至","以至于","以致","们","任","任何","任凭","会","似的","但","但凡","但是","何","何以","何况","何处","何时","余外","作为","你","你们","使","使得","例如","依","依据","依照","便于","俺","俺们","倘","倘使","倘或","倘然","倘若","借","借傥然","假使","假如","假若","做","像","儿","先不先","光","光是","全体","全部","八","六","兮","共","关于","关于具体地说","其","其一","其中","其二","其他","其余","其它","其次","具体地说","具体说来","兼之","内","再","再其次","再则","再有","再者","再者说","再说","冒","冲","况且","几","几时","凡","凡是","凭","凭借","出于","出来","分","分别","则","则甚","别","别人","别处","别是","别的","别管","别说","到","前后","前此","前者","加之","加以","区","即","即令","即使","即便","即如","即或","即若","却","去","又","又及","及","及其","及至","反之","反而","反过来","反过来说","受到","另","另一方面","另外","另悉","只","只当","只怕","只是","只有","只消","只要","只限","叫","叮咚","可","可以","可是","可见","各","各个","各位","各种","各自","同","同时","后","后者","向","向使","向着","吓","吗","否则","吧","吧哒","含","吱","呀","呃","呕","呗","呜","呜呼","呢","呵","呵呵","呸","呼哧","咋","和","咚","咦","咧","咱","咱们","咳","哇","哈","哈哈","哉","哎","哎呀","哎哟","哗","哟","哦","哩","哪","哪个","哪些","哪儿","哪天","哪年","哪怕","哪样","哪边","哪里","哼","哼唷","唉","唯有","啊","啐","啥","啦","啪达","啷当","喂","喏","喔唷","喽","嗡","嗡嗡","嗬","嗯","嗳","嘎","嘎登","嘘","嘛","嘻","嘿","嘿嘿","四","因","因为","因了","因此","因着","因而","固然","在","在下","在于","地","基于","处在","多","多么","多少","大","大家","她","她们","好","如","如上","如上所述","如下","如何","如其","如同","如是","如果","如此","如若","始而","孰料","孰知","宁","宁可","宁愿","宁肯","它","它们","对","对于","对待","对方","对比","将","小","尔","尔后","尔尔","尚且","就","就是","就是了","就是说","就算","就要","尽","尽管","尽管如此","岂但","己","已","已矣","巴","巴巴","年","并","并且","庶乎","庶几","开外","开始","归","归齐","当","当地","当然","当着","彼","彼时","彼此","往","待","很","得","得了","怎","怎么","怎么办","怎么样","怎奈","怎样","总之","总的来看","总的来说","总的说来","总而言之","恰恰相反","您","惟其","慢说","我","我们","或","或则","或是","或曰","或者","截至","所","所以","所在","所幸","所有","才","才能","打","打从","把","抑或","拿","按","按照","换句话说","换言之","据","据此","接着","故","故此","故而","旁人","无","无宁","无论","既","既往","既是","既然","日","时","时候","是","是以","是的","更","曾","替","替代","最","月","有","有些","有关","有及","有时","有的","望","朝","朝着","本","本人","本地","本着","本身","来","来着","来自","来说","极了","果然","果真","某","某个","某些","某某","根据","欤","正值","正如","正巧","正是","此","此地","此处","此外","此时","此次","此间","毋宁","每","每当","比","比及","比如","比方","没奈何","沿","沿着","漫说","点","焉","然则","然后","然而","照","照着","犹且","犹自","甚且","甚么","甚或","甚而","甚至","甚至于","用","用来","由","由于","由是","由此","由此可见","的","的确","的话","直到","相对而言","省得","看","眨眼","着","着呢","矣","矣乎","矣哉","离","秒","称","竟而","第","等","等到","等等","简言之","管","类如","紧接着","纵","纵令","纵使","纵然","经","经过","结果","给","继之","继后","继而","综上所述","罢了","者","而","而且","而况","而后","而外","而已","而是","而言","能","能否","腾","自","自个儿","自从","自各儿","自后","自家","自己","自打","自身","至","至于","至今","至若","致","般的","若","若夫","若是","若果","若非","莫不然","莫如","莫若","虽","虽则","虽然","虽说","被","要","要不","要不是","要不然","要么","要是","譬喻","譬如","让","许多","论","设使","设或","设若","诚如","诚然","该","说","说来","请","诸","诸位","诸如","谁","谁人","谁料","谁知","贼死","赖以","赶","起","起见","趁","趁着","越是","距","跟","较","较之","边","过","还","还是","还有","还要","这","这一来","这个","这么","这么些","这么样","这么点儿","这些","这会儿","这儿","这就是说","这时","这样","这次","这般","这边","这里","进而","连","连同","逐步","通过","遵循","遵照","那","那个","那么","那么些","那么样","那些","那会儿","那儿","那时","那样","那般","那边","那里","都","鄙人","鉴于","针对","阿","除","除了","除外","除开","除此之外","除非","随","随后","随时","随着","难道说","零","非","非但","非徒","非特","非独","靠","顺","顺着","首先","︿","!","#","$","%","&","(",")","*","+",",","0","1","2","3","4","5","6","7","8","9",":",";","<",">","?","@","[","]","{","|","}","~","¥"],"hr":["a","ako","ali","bi","bih","bila","bili","bilo","bio","bismo","biste","biti","bumo","da","do","duž","ga","hoće","hoćemo","hoćete","hoćeš","hoću","i","iako","ih","ili","iz","ja","je","jedna","jedne","jedno","jer","jesam","jesi","jesmo","jest","jeste","jesu","jim","joj","još","ju","kada","kako","kao","koja","koje","koji","kojima","koju","kroz","li","me","mene","meni","mi","mimo","moj","moja","moje","mu","na","nad","nakon","nam","nama","nas","naš","naša","naše","našeg","ne","nego","neka","neki","nekog","neku","nema","netko","neće","nećemo","nećete","nećeš","neću","nešto","ni","nije","nikoga","nikoje","nikoju","nisam","nisi","nismo","niste","nisu","njega","njegov","njegova","njegovo","njemu","njezin","njezina","njezino","njih","njihov","njihova","njihovo","njim","njima","njoj","nju","no","o","od","odmah","on","ona","oni","ono","ova","pa","pak","po","pod","pored","prije","s","sa","sam","samo","se","sebe","sebi","si","smo","ste","su","sve","svi","svog","svoj","svoja","svoje","svom","ta","tada","taj","tako","te","tebe","tebi","ti","to","toj","tome","tu","tvoj","tvoja","tvoje","u","uz","vam","vama","vas","vaš","vaša","vaše","već","vi","vrlo","za","zar","će","ćemo","ćete","ćeš","ću","što"],"cs":["a","aby","ahoj","aj","ale","anebo","ani","aniž","ano","asi","aspoň","atd","atp","az","ačkoli","až","bez","beze","blízko","bohužel","brzo","bude","budem","budeme","budes","budete","budeš","budou","budu","by","byl","byla","byli","bylo","byly","bys","byt","být","během","chce","chceme","chcete","chceš","chci","chtít","chtějí","chut'","chuti","ci","clanek","clanku","clanky","co","coz","což","cz","daleko","dalsi","další","den","deset","design","devatenáct","devět","dnes","do","dobrý","docela","dva","dvacet","dvanáct","dvě","dál","dále","děkovat","děkujeme","děkuji","email","ho","hodně","i","jak","jakmile","jako","jakož","jde","je","jeden","jedenáct","jedna","jedno","jednou","jedou","jeho","jehož","jej","jeji","jejich","její","jelikož","jemu","jen","jenom","jenž","jeste","jestli","jestliže","ještě","jež","ji","jich","jimi","jinak","jine","jiné","jiz","již","jsem","jses","jseš","jsi","jsme","jsou","jste","já","jí","jím","jíž","jšte","k","kam","každý","kde","kdo","kdy","kdyz","když","ke","kolik","kromě","ktera","ktere","kteri","kterou","ktery","která","které","který","kteři","kteří","ku","kvůli","ma","mají","mate","me","mezi","mi","mit","mne","mnou","mně","moc","mohl","mohou","moje","moji","možná","muj","musí","muze","my","má","málo","mám","máme","máte","máš","mé","mí","mít","mě","můj","může","na","nad","nade","nam","napiste","napište","naproti","nas","nasi","načež","naše","naši","ne","nebo","nebyl","nebyla","nebyli","nebyly","nechť","nedělají","nedělá","nedělám","neděláme","neděláte","neděláš","neg","nejsi","nejsou","nemají","nemáme","nemáte","neměl","neni","není","nestačí","nevadí","nez","než","nic","nich","nimi","nove","novy","nové","nový","nula","ná","nám","námi","nás","náš","ní","ním","ně","něco","nějak","někde","někdo","němu","němuž","o","od","ode","on","ona","oni","ono","ony","osm","osmnáct","pak","patnáct","po","pod","podle","pokud","potom","pouze","pozdě","pořád","prave","pravé","pred","pres","pri","pro","proc","prostě","prosím","proti","proto","protoze","protože","proč","prvni","první","práve","pta","pět","před","přede","přes","přese","při","přičemž","re","rovně","s","se","sedm","sedmnáct","si","sice","skoro","smí","smějí","snad","spolu","sta","sto","strana","sté","sve","svych","svym","svymi","své","svých","svým","svými","svůj","ta","tady","tak","take","takhle","taky","takze","také","takže","tam","tamhle","tamhleto","tamto","tato","te","tebe","tebou","ted'","tedy","tema","ten","tento","teto","ti","tim","timto","tipy","tisíc","tisíce","to","tobě","tohle","toho","tohoto","tom","tomto","tomu","tomuto","toto","trošku","tu","tuto","tvoje","tvá","tvé","tvůj","ty","tyto","téma","této","tím","tímto","tě","těm","těma","těmu","třeba","tři","třináct","u","určitě","uz","už","v","vam","vas","vase","vaše","vaši","ve","vedle","večer","vice","vlastně","vsak","vy","vám","vámi","vás","váš","více","však","všechen","všechno","všichni","vůbec","vždy","z","za","zatímco","zač","zda","zde","ze","zpet","zpravy","zprávy","zpět","čau","či","článek","článku","články","čtrnáct","čtyři","šest","šestnáct","že"],"da":["ad","af","aldrig","alle","alt","anden","andet","andre","at","bare","begge","blev","blive","bliver","da","de","dem","den","denne","der","deres","det","dette","dig","din","dine","disse","dit","dog","du","efter","ej","eller","en","end","ene","eneste","enhver","er","et","far","fem","fik","fire","flere","fleste","for","fordi","forrige","fra","få","får","før","god","godt","ham","han","hans","har","havde","have","hej","helt","hende","hendes","her","hos","hun","hvad","hvem","hver","hvilken","hvis","hvor","hvordan","hvorfor","hvornår","i","ikke","ind","ingen","intet","ja","jeg","jer","jeres","jo","kan","kom","komme","kommer","kun","kunne","lad","lav","lidt","lige","lille","man","mand","mange","med","meget","men","mens","mere","mig","min","mine","mit","mod","må","ned","nej","ni","nogen","noget","nogle","nu","ny","nyt","når","nær","næste","næsten","og","også","okay","om","op","os","otte","over","på","se","seks","selv","ser","ses","sig","sige","sin","sine","sit","skal","skulle","som","stor","store","syv","så","sådan","tag","tage","thi","ti","til","to","tre","ud","under","var","ved","vi","vil","ville","vor","vores","være","været"],"nl":["aan","aangaande","aangezien","achte","achter","achterna","af","afgelopen","al","aldaar","aldus","alhoewel","alias","alle","allebei","alleen","alles","als","alsnog","altijd","altoos","ander","andere","anders","anderszins","beetje","behalve","behoudens","beide","beiden","ben","beneden","bent","bepaald","betreffende","bij","bijna","bijv","binnen","binnenin","blijkbaar","blijken","boven","bovenal","bovendien","bovengenoemd","bovenstaand","bovenvermeld","buiten","bv","daar","daardoor","daarheen","daarin","daarna","daarnet","daarom","daarop","daaruit","daarvanlangs","dan","dat","de","deden","deed","der","derde","derhalve","dertig","deze","dhr","die","dikwijls","dit","doch","doe","doen","doet","door","doorgaand","drie","duizend","dus","echter","een","eens","eer","eerdat","eerder","eerlang","eerst","eerste","eigen","eigenlijk","elk","elke","en","enig","enige","enigszins","enkel","er","erdoor","erg","ergens","etc","etcetera","even","eveneens","evenwel","gauw","ge","gedurende","geen","gehad","gekund","geleden","gelijk","gemoeten","gemogen","genoeg","geweest","gewoon","gewoonweg","haar","haarzelf","had","hadden","hare","heb","hebben","hebt","hedden","heeft","heel","hem","hemzelf","hen","het","hetzelfde","hier","hierbeneden","hierboven","hierin","hierna","hierom","hij","hijzelf","hoe","hoewel","honderd","hun","hunne","ieder","iedere","iedereen","iemand","iets","ik","ikzelf","in","inderdaad","inmiddels","intussen","inzake","is","ja","je","jezelf","jij","jijzelf","jou","jouw","jouwe","juist","jullie","kan","klaar","kon","konden","krachtens","kun","kunnen","kunt","laatst","later","liever","lijken","lijkt","maak","maakt","maakte","maakten","maar","mag","maken","me","meer","meest","meestal","men","met","mevr","mezelf","mij","mijn","mijnent","mijner","mijzelf","minder","miss","misschien","missen","mits","mocht","mochten","moest","moesten","moet","moeten","mogen","mr","mrs","mw","na","naar","nadat","nam","namelijk","nee","neem","negen","nemen","nergens","net","niemand","niet","niets","niks","noch","nochtans","nog","nogal","nooit","nu","nv","of","ofschoon","om","omdat","omhoog","omlaag","omstreeks","omtrent","omver","ondanks","onder","ondertussen","ongeveer","ons","onszelf","onze","onzeker","ooit","ook","op","opnieuw","opzij","over","overal","overeind","overige","overigens","paar","pas","per","precies","recent","redelijk","reeds","rond","rondom","samen","sedert","sinds","sindsdien","slechts","sommige","spoedig","steeds","tamelijk","te","tegen","tegenover","tenzij","terwijl","thans","tien","tiende","tijdens","tja","toch","toe","toen","toenmaals","toenmalig","tot","totdat","tussen","twee","tweede","u","uit","uitgezonderd","uw","vaak","vaakwat","van","vanaf","vandaan","vanuit","vanwege","veel","veeleer","veertig","verder","verscheidene","verschillende","vervolgens","via","vier","vierde","vijf","vijfde","vijftig","vol","volgend","volgens","voor","vooraf","vooral","vooralsnog","voorbij","voordat","voordezen","voordien","voorheen","voorop","voorts","vooruit","vrij","vroeg","waar","waarom","waarschijnlijk","wanneer","want","waren","was","wat","we","wederom","weer","weg","wegens","weinig","wel","weldra","welk","welke","werd","werden","werder","wezen","whatever","wie","wiens","wier","wij","wijzelf","wil","wilden","willen","word","worden","wordt","zal","ze","zei","zeker","zelf","zelfde","zelfs","zes","zeven","zich","zichzelf","zij","zijn","zijne","zijzelf","zo","zoals","zodat","zodra","zonder","zou","zouden","zowat","zulk","zulke","zullen","zult"],"en":["'ll","'tis","'twas","'ve","10","39","a","a's","able","ableabout","about","above","abroad","abst","accordance","according","accordingly","across","act","actually","ad","added","adj","adopted","ae","af","affected","affecting","affects","after","afterwards","ag","again","against","ago","ah","ahead","ai","ain't","aint","al","all","allow","allows","almost","alone","along","alongside","already","also","although","always","am","amid","amidst","among","amongst","amoungst","amount","an","and","announce","another","any","anybody","anyhow","anymore","anyone","anything","anyway","anyways","anywhere","ao","apart","apparently","appear","appreciate","appropriate","approximately","aq","ar","are","area","areas","aren","aren't","arent","arise","around","arpa","as","aside","ask","asked","asking","asks","associated","at","au","auth","available","aw","away","awfully","az","b","ba","back","backed","backing","backs","backward","backwards","bb","bd","be","became","because","become","becomes","becoming","been","before","beforehand","began","begin","beginning","beginnings","begins","behind","being","beings","believe","below","beside","besides","best","better","between","beyond","bf","bg","bh","bi","big","bill","billion","biol","bj","bm","bn","bo","both","bottom","br","brief","briefly","bs","bt","but","buy","bv","bw","by","bz","c","c'mon","c's","ca","call","came","can","can't","cannot","cant","caption","case","cases","cause","causes","cc","cd","certain","certainly","cf","cg","ch","changes","ci","ck","cl","clear","clearly","click","cm","cmon","cn","co","co.","com","come","comes","computer","con","concerning","consequently","consider","considering","contain","containing","contains","copy","corresponding","could","could've","couldn","couldn't","couldnt","course","cr","cry","cs","cu","currently","cv","cx","cy","cz","d","dare","daren't","darent","date","de","dear","definitely","describe","described","despite","detail","did","didn","didn't","didnt","differ","different","differently","directly","dj","dk","dm","do","does","doesn","doesn't","doesnt","doing","don","don't","done","dont","doubtful","down","downed","downing","downs","downwards","due","during","dz","e","each","early","ec","ed","edu","ee","effect","eg","eh","eight","eighty","either","eleven","else","elsewhere","empty","end","ended","ending","ends","enough","entirely","er","es","especially","et","et-al","etc","even","evenly","ever","evermore","every","everybody","everyone","everything","everywhere","ex","exactly","example","except","f","face","faces","fact","facts","fairly","far","farther","felt","few","fewer","ff","fi","fifteen","fifth","fifty","fify","fill","find","finds","fire","first","five","fix","fj","fk","fm","fo","followed","following","follows","for","forever","former","formerly","forth","forty","forward","found","four","fr","free","from","front","full","fully","further","furthered","furthering","furthermore","furthers","fx","g","ga","gave","gb","gd","ge","general","generally","get","gets","getting","gf","gg","gh","gi","give","given","gives","giving","gl","gm","gmt","gn","go","goes","going","gone","good","goods","got","gotten","gov","gp","gq","gr","great","greater","greatest","greetings","group","grouped","grouping","groups","gs","gt","gu","gw","gy","h","had","hadn't","hadnt","half","happens","hardly","has","hasn","hasn't","hasnt","have","haven","haven't","havent","having","he","he'd","he'll","he's","hed","hell","hello","help","hence","her","here","here's","hereafter","hereby","herein","heres","hereupon","hers","herself","herse”","hes","hi","hid","high","higher","highest","him","himself","himse”","his","hither","hk","hm","hn","home","homepage","hopefully","how","how'd","how'll","how's","howbeit","however","hr","ht","htm","html","http","hu","hundred","i","i'd","i'll","i'm","i've","i.e.","id","ie","if","ignored","ii","il","ill","im","immediate","immediately","importance","important","in","inasmuch","inc","inc.","indeed","index","indicate","indicated","indicates","information","inner","inside","insofar","instead","int","interest","interested","interesting","interests","into","invention","inward","io","iq","ir","is","isn","isn't","isnt","it","it'd","it'll","it's","itd","itll","its","itself","itse”","ive","j","je","jm","jo","join","jp","just","k","ke","keep","keeps","kept","keys","kg","kh","ki","kind","km","kn","knew","know","known","knows","kp","kr","kw","ky","kz","l","la","large","largely","last","lately","later","latest","latter","latterly","lb","lc","least","length","less","lest","let","let's","lets","li","like","liked","likely","likewise","line","little","lk","ll","long","longer","longest","look","looking","looks","low","lower","lr","ls","lt","ltd","lu","lv","ly","m","ma","made","mainly","make","makes","making","man","many","may","maybe","mayn't","maynt","mc","md","me","mean","means","meantime","meanwhile","member","members","men","merely","mg","mh","microsoft","might","might've","mightn't","mightnt","mil","mill","million","mine","minus","miss","mk","ml","mm","mn","mo","more","moreover","most","mostly","move","mp","mq","mr","mrs","ms","msie","mt","mu","much","mug","must","must've","mustn't","mustnt","mv","mw","mx","my","myself","myse”","mz","n","na","name","namely","nay","nc","nd","ne","near","nearly","necessarily","necessary","need","needed","needing","needn't","neednt","needs","neither","net","netscape","never","neverf","neverless","nevertheless","new","newer","newest","next","nf","ng","ni","nine","ninety","nl","no","no-one","nobody","non","none","nonetheless","noone","nor","normally","nos","not","noted","nothing","notwithstanding","novel","now","nowhere","np","nr","nu","null","number","numbers","nz","o","obtain","obtained","obviously","of","off","often","oh","ok","okay","old","older","oldest","om","omitted","on","once","one","one's","ones","only","onto","open","opened","opening","opens","opposite","or","ord","order","ordered","ordering","orders","org","other","others","otherwise","ought","oughtn't","oughtnt","our","ours","ourselves","out","outside","over","overall","owing","own","p","pa","page","pages","part","parted","particular","particularly","parting","parts","past","pe","per","perhaps","pf","pg","ph","pk","pl","place","placed","places","please","plus","pm","pmid","pn","point","pointed","pointing","points","poorly","possible","possibly","potentially","pp","pr","predominantly","present","presented","presenting","presents","presumably","previously","primarily","probably","problem","problems","promptly","proud","provided","provides","pt","put","puts","pw","py","q","qa","que","quickly","quite","qv","r","ran","rather","rd","re","readily","really","reasonably","recent","recently","ref","refs","regarding","regardless","regards","related","relatively","research","reserved","respectively","resulted","resulting","results","right","ring","ro","room","rooms","round","ru","run","rw","s","sa","said","same","saw","say","saying","says","sb","sc","sd","se","sec","second","secondly","seconds","section","see","seeing","seem","seemed","seeming","seems","seen","sees","self","selves","sensible","sent","serious","seriously","seven","seventy","several","sg","sh","shall","shan't","shant","she","she'd","she'll","she's","shed","shell","shes","should","should've","shouldn","shouldn't","shouldnt","show","showed","showing","shown","showns","shows","si","side","sides","significant","significantly","similar","similarly","since","sincere","site","six","sixty","sj","sk","sl","slightly","sm","small","smaller","smallest","sn","so","some","somebody","someday","somehow","someone","somethan","something","sometime","sometimes","somewhat","somewhere","soon","sorry","specifically","specified","specify","specifying","sr","st","state","states","still","stop","strongly","su","sub","substantially","successfully","such","sufficiently","suggest","sup","sure","sv","sy","system","sz","t","t's","take","taken","taking","tc","td","tell","ten","tends","test","text","tf","tg","th","than","thank","thanks","thanx","that","that'll","that's","that've","thatll","thats","thatve","the","their","theirs","them","themselves","then","thence","there","there'd","there'll","there're","there's","there've","thereafter","thereby","thered","therefore","therein","therell","thereof","therere","theres","thereto","thereupon","thereve","these","they","they'd","they'll","they're","they've","theyd","theyll","theyre","theyve","thick","thin","thing","things","think","thinks","third","thirty","this","thorough","thoroughly","those","thou","though","thoughh","thought","thoughts","thousand","three","throug","through","throughout","thru","thus","til","till","tip","tis","tj","tk","tm","tn","to","today","together","too","took","top","toward","towards","tp","tr","tried","tries","trillion","truly","try","trying","ts","tt","turn","turned","turning","turns","tv","tw","twas","twelve","twenty","twice","two","tz","u","ua","ug","uk","um","un","under","underneath","undoing","unfortunately","unless","unlike","unlikely","until","unto","up","upon","ups","upwards","us","use","used","useful","usefully","usefulness","uses","using","usually","uucp","uy","uz","v","va","value","various","vc","ve","versus","very","vg","vi","via","viz","vn","vol","vols","vs","vu","w","want","wanted","wanting","wants","was","wasn","wasn't","wasnt","way","ways","we","we'd","we'll","we're","we've","web","webpage","website","wed","welcome","well","wells","went","were","weren","weren't","werent","weve","wf","what","what'd","what'll","what's","what've","whatever","whatll","whats","whatve","when","when'd","when'll","when's","whence","whenever","where","where'd","where'll","where's","whereafter","whereas","whereby","wherein","wheres","whereupon","wherever","whether","which","whichever","while","whilst","whim","whither","who","who'd","who'll","who's","whod","whoever","whole","wholl","whom","whomever","whos","whose","why","why'd","why'll","why's","widely","width","will","willing","wish","with","within","without","won","won't","wonder","wont","words","work","worked","working","works","world","would","would've","wouldn","wouldn't","wouldnt","ws","www","x","y","ye","year","years","yes","yet","you","you'd","you'll","you're","you've","youd","youll","young","younger","youngest","your","youre","yours","yourself","yourselves","youve","yt","yu","z","za","zero","zm","zr"],"eo":["adiaŭ","ajn","al","ankoraŭ","antaŭ","aŭ","bonan","bonvole","bonvolu","bv","ci","cia","cian","cin","d-ro","da","de","dek","deka","do","doktor'","doktoro","du","dua","dum","eble","ekz","ekzemple","en","estas","estis","estos","estu","estus","eĉ","f-no","feliĉan","for","fraŭlino","ha","havas","havis","havos","havu","havus","he","ho","hu","ili","ilia","ilian","ilin","inter","io","ion","iu","iujn","iun","ja","jam","je","jes","k","kaj","ke","kio","kion","kiu","kiujn","kiun","kvankam","kvar","kvara","kvazaŭ","kvin","kvina","la","li","lia","lian","lin","malantaŭ","male","malgraŭ","mem","mi","mia","mian","min","minus","naŭ","naŭa","ne","nek","nenio","nenion","neniu","neniun","nepre","ni","nia","nian","nin","nu","nun","nur","ok","oka","oni","onia","onian","onin","plej","pli","plu","plus","por","post","preter","s-no","s-ro","se","sed","sep","sepa","ses","sesa","si","sia","sian","sin","sinjor'","sinjorino","sinjoro","sub","super","supren","sur","tamen","tio","tion","tiu","tiujn","tiun","tra","tri","tria","tuj","tute","unu","unua","ve","verŝajne","vi","via","vian","vin","ĉi","ĉio","ĉion","ĉiu","ĉiujn","ĉiun","ĉu","ĝi","ĝia","ĝian","ĝin","ĝis","ĵus","ŝi","ŝia","ŝin"],"et":["aga","ei","et","ja","jah","kas","kui","kõik","ma","me","mida","midagi","mind","minu","mis","mu","mul","mulle","nad","nii","oled","olen","oli","oma","on","pole","sa","seda","see","selle","siin","siis","ta","te","ära"],"fi":["aiemmin","aika","aikaa","aikaan","aikaisemmin","aikaisin","aikajen","aikana","aikoina","aikoo","aikovat","aina","ainakaan","ainakin","ainoa","ainoat","aiomme","aion","aiotte","aist","aivan","ajan","alas","alemmas","alkuisin","alkuun","alla","alle","aloitamme","aloitan","aloitat","aloitatte","aloitattivat","aloitettava","aloitettevaksi","aloitettu","aloitimme","aloitin","aloitit","aloititte","aloittaa","aloittamatta","aloitti","aloittivat","alta","aluksi","alussa","alusta","annettavaksi","annetteva","annettu","ansiosta","antaa","antamatta","antoi","aoua","apu","asia","asiaa","asian","asiasta","asiat","asioiden","asioihin","asioita","asti","avuksi","avulla","avun","avutta","edelle","edelleen","edellä","edeltä","edemmäs","edes","edessä","edestä","ehkä","ei","eikä","eilen","eivät","eli","ellei","elleivät","ellemme","ellen","ellet","ellette","emme","en","enemmän","eniten","ennen","ensi","ensimmäinen","ensimmäiseksi","ensimmäisen","ensimmäisenä","ensimmäiset","ensimmäisiksi","ensimmäisinä","ensimmäisiä","ensimmäistä","ensin","entinen","entisen","entisiä","entisten","entistä","enää","eri","erittäin","erityisesti","eräiden","eräs","eräät","esi","esiin","esillä","esimerkiksi","et","eteen","etenkin","etessa","ette","ettei","että","haikki","halua","haluaa","haluamatta","haluamme","haluan","haluat","haluatte","haluavat","halunnut","halusi","halusimme","halusin","halusit","halusitte","halusivat","halutessa","haluton","he","hei","heidän","heidät","heihin","heille","heillä","heiltä","heissä","heistä","heitä","helposti","heti","hetkellä","hieman","hitaasti","hoikein","huolimatta","huomenna","hyvien","hyviin","hyviksi","hyville","hyviltä","hyvin","hyvinä","hyvissä","hyvistä","hyviä","hyvä","hyvät","hyvää","hän","häneen","hänelle","hänellä","häneltä","hänen","hänessä","hänestä","hänet","häntä","ihan","ilman","ilmeisesti","itse","itsensä","itseään","ja","jo","johon","joiden","joihin","joiksi","joilla","joille","joilta","joina","joissa","joista","joita","joka","jokainen","jokin","joko","joksi","joku","jolla","jolle","jolloin","jolta","jompikumpi","jona","jonka","jonkin","jonne","joo","jopa","jos","joskus","jossa","josta","jota","jotain","joten","jotenkin","jotenkuten","jotka","jotta","jouduimme","jouduin","jouduit","jouduitte","joudumme","joudun","joudutte","joukkoon","joukossa","joukosta","joutua","joutui","joutuivat","joutumaan","joutuu","joutuvat","juuri","jälkeen","jälleen","jää","kahdeksan","kahdeksannen","kahdella","kahdelle","kahdelta","kahden","kahdessa","kahdesta","kahta","kahteen","kai","kaiken","kaikille","kaikilta","kaikkea","kaikki","kaikkia","kaikkiaan","kaikkialla","kaikkialle","kaikkialta","kaikkien","kaikkin","kaksi","kannalta","kannattaa","kanssa","kanssaan","kanssamme","kanssani","kanssanne","kanssasi","kauan","kauemmas","kaukana","kautta","kehen","keiden","keihin","keiksi","keille","keillä","keiltä","keinä","keissä","keistä","keitten","keittä","keitä","keneen","keneksi","kenelle","kenellä","keneltä","kenen","kenenä","kenessä","kenestä","kenet","kenettä","kennessästä","kenties","kerran","kerta","kertaa","keskellä","kesken","keskimäärin","ketkä","ketä","kiitos","kohti","koko","kokonaan","kolmas","kolme","kolmen","kolmesti","koska","koskaan","kovin","kuin","kuinka","kuinkan","kuitenkaan","kuitenkin","kuka","kukaan","kukin","kukka","kumpainen","kumpainenkaan","kumpi","kumpikaan","kumpikin","kun","kuten","kuuden","kuusi","kuutta","kylliksi","kyllä","kymmenen","kyse","liian","liki","lisäksi","lisää","lla","luo","luona","lähekkäin","lähelle","lähellä","läheltä","lähemmäs","lähes","lähinnä","lähtien","läpi","mahdollisimman","mahdollista","me","meidän","meidät","meihin","meille","meillä","meiltä","meissä","meistä","meitä","melkein","melko","menee","meneet","menemme","menen","menet","menette","menevät","meni","menimme","menin","menit","menivät","mennessä","mennyt","menossa","mihin","mikin","miksi","mikä","mikäli","mikään","mille","milloin","milloinkan","millä","miltä","minkä","minne","minua","minulla","minulle","minulta","minun","minussa","minusta","minut","minuun","minä","missä","mistä","miten","mitkä","mitä","mitään","moi","molemmat","mones","monesti","monet","moni","moniaalla","moniaalle","moniaalta","monta","muassa","muiden","muita","muka","mukaan","mukaansa","mukana","mutta","muu","muualla","muualle","muualta","muuanne","muulloin","muun","muut","muuta","muutama","muutaman","muuten","myöhemmin","myös","myöskin","myöskään","myötä","ne","neljä","neljän","neljää","niiden","niihin","niiksi","niille","niillä","niiltä","niin","niinä","niissä","niistä","niitä","noiden","noihin","noiksi","noilla","noille","noilta","noin","noina","noissa","noista","noita","nopeammin","nopeasti","nopeiten","nro","nuo","nyt","näiden","näihin","näiksi","näille","näillä","näiltä","näin","näinä","näissä","näissähin","näissälle","näissältä","näissästä","näistä","näitä","nämä","ohi","oikea","oikealla","oikein","ole","olemme","olen","olet","olette","oleva","olevan","olevat","oli","olimme","olin","olisi","olisimme","olisin","olisit","olisitte","olisivat","olit","olitte","olivat","olla","olleet","olli","ollut","oma","omaa","omaan","omaksi","omalle","omalta","oman","omassa","omat","omia","omien","omiin","omiksi","omille","omilta","omissa","omista","on","onkin","onko","ovat","paikoittain","paitsi","pakosti","paljon","paremmin","parempi","parhaillaan","parhaiten","perusteella","peräti","pian","pieneen","pieneksi","pienelle","pienellä","pieneltä","pienempi","pienestä","pieni","pienin","poikki","puolesta","puolestaan","päälle","runsaasti","saakka","sadam","sama","samaa","samaan","samalla","samallalta","samallassa","samallasta","saman","samat","samoin","sata","sataa","satojen","se","seitsemän","sekä","sen","seuraavat","siellä","sieltä","siihen","siinä","siis","siitä","sijaan","siksi","sille","silloin","sillä","silti","siltä","sinne","sinua","sinulla","sinulle","sinulta","sinun","sinussa","sinusta","sinut","sinuun","sinä","sisäkkäin","sisällä","siten","sitten","sitä","ssa","sta","suoraan","suuntaan","suuren","suuret","suuri","suuria","suurin","suurten","taa","taas","taemmas","tahansa","tai","takaa","takaisin","takana","takia","tallä","tapauksessa","tarpeeksi","tavalla","tavoitteena","te","teidän","teidät","teihin","teille","teillä","teiltä","teissä","teistä","teitä","tietysti","todella","toinen","toisaalla","toisaalle","toisaalta","toiseen","toiseksi","toisella","toiselle","toiselta","toisemme","toisen","toisensa","toisessa","toisesta","toista","toistaiseksi","toki","tosin","tuhannen","tuhat","tule","tulee","tulemme","tulen","tulet","tulette","tulevat","tulimme","tulin","tulisi","tulisimme","tulisin","tulisit","tulisitte","tulisivat","tulit","tulitte","tulivat","tulla","tulleet","tullut","tuntuu","tuo","tuohon","tuoksi","tuolla","tuolle","tuolloin","tuolta","tuon","tuona","tuonne","tuossa","tuosta","tuota","tuotä","tuskin","tykö","tähän","täksi","tälle","tällä","tällöin","tältä","tämä","tämän","tänne","tänä","tänään","tässä","tästä","täten","tätä","täysin","täytyvät","täytyy","täällä","täältä","ulkopuolella","usea","useasti","useimmiten","usein","useita","uudeksi","uudelleen","uuden","uudet","uusi","uusia","uusien","uusinta","uuteen","uutta","vaan","vahemmän","vai","vaiheessa","vaikea","vaikean","vaikeat","vaikeilla","vaikeille","vaikeilta","vaikeissa","vaikeista","vaikka","vain","varmasti","varsin","varsinkin","varten","vasen","vasenmalla","vasta","vastaan","vastakkain","vastan","verran","vielä","vierekkäin","vieressä","vieri","viiden","viime","viimeinen","viimeisen","viimeksi","viisi","voi","voidaan","voimme","voin","voisi","voit","voitte","voivat","vuoden","vuoksi","vuosi","vuosien","vuosina","vuotta","vähemmän","vähintään","vähiten","vähän","välillä","yhdeksän","yhden","yhdessä","yhteen","yhteensä","yhteydessä","yhteyteen","yhtä","yhtäälle","yhtäällä","yhtäältä","yhtään","yhä","yksi","yksin","yksittäin","yleensä","ylemmäs","yli","ylös","ympäri","älköön","älä"],"fr":["a","abord","absolument","afin","ah","ai","aie","aient","aies","ailleurs","ainsi","ait","allaient","allo","allons","allô","alors","anterieur","anterieure","anterieures","apres","après","as","assez","attendu","au","aucun","aucune","aucuns","aujourd","aujourd'hui","aupres","auquel","aura","aurai","auraient","aurais","aurait","auras","aurez","auriez","aurions","aurons","auront","aussi","autant","autre","autrefois","autrement","autres","autrui","aux","auxquelles","auxquels","avaient","avais","avait","avant","avec","avez","aviez","avions","avoir","avons","ayant","ayez","ayons","b","bah","bas","basee","bat","beau","beaucoup","bien","bigre","bon","boum","bravo","brrr","c","car","ce","ceci","cela","celle","celle-ci","celle-là","celles","celles-ci","celles-là","celui","celui-ci","celui-là","celà","cent","cependant","certain","certaine","certaines","certains","certes","ces","cet","cette","ceux","ceux-ci","ceux-là","chacun","chacune","chaque","cher","chers","chez","chiche","chut","chère","chères","ci","cinq","cinquantaine","cinquante","cinquantième","cinquième","clac","clic","combien","comme","comment","comparable","comparables","compris","concernant","contre","couic","crac","d","da","dans","de","debout","dedans","dehors","deja","delà","depuis","dernier","derniere","derriere","derrière","des","desormais","desquelles","desquels","dessous","dessus","deux","deuxième","deuxièmement","devant","devers","devra","devrait","different","differentes","differents","différent","différente","différentes","différents","dire","directe","directement","dit","dite","dits","divers","diverse","diverses","dix","dix-huit","dix-neuf","dix-sept","dixième","doit","doivent","donc","dont","dos","douze","douzième","dring","droite","du","duquel","durant","dès","début","désormais","e","effet","egale","egalement","egales","eh","elle","elle-même","elles","elles-mêmes","en","encore","enfin","entre","envers","environ","es","essai","est","et","etant","etc","etre","eu","eue","eues","euh","eurent","eus","eusse","eussent","eusses","eussiez","eussions","eut","eux","eux-mêmes","exactement","excepté","extenso","exterieur","eûmes","eût","eûtes","f","fais","faisaient","faisant","fait","faites","façon","feront","fi","flac","floc","fois","font","force","furent","fus","fusse","fussent","fusses","fussiez","fussions","fut","fûmes","fût","fûtes","g","gens","h","ha","haut","hein","hem","hep","hi","ho","holà","hop","hormis","hors","hou","houp","hue","hui","huit","huitième","hum","hurrah","hé","hélas","i","ici","il","ils","importe","j","je","jusqu","jusque","juste","k","l","la","laisser","laquelle","las","le","lequel","les","lesquelles","lesquels","leur","leurs","longtemps","lors","lorsque","lui","lui-meme","lui-même","là","lès","m","ma","maint","maintenant","mais","malgre","malgré","maximale","me","meme","memes","merci","mes","mien","mienne","miennes","miens","mille","mince","mine","minimale","moi","moi-meme","moi-même","moindres","moins","mon","mot","moyennant","multiple","multiples","même","mêmes","n","na","naturel","naturelle","naturelles","ne","neanmoins","necessaire","necessairement","neuf","neuvième","ni","nombreuses","nombreux","nommés","non","nos","notamment","notre","nous","nous-mêmes","nouveau","nouveaux","nul","néanmoins","nôtre","nôtres","o","oh","ohé","ollé","olé","on","ont","onze","onzième","ore","ou","ouf","ouias","oust","ouste","outre","ouvert","ouverte","ouverts","o|","où","p","paf","pan","par","parce","parfois","parle","parlent","parler","parmi","parole","parseme","partant","particulier","particulière","particulièrement","pas","passé","pendant","pense","permet","personne","personnes","peu","peut","peuvent","peux","pff","pfft","pfut","pif","pire","pièce","plein","plouf","plupart","plus","plusieurs","plutôt","possessif","possessifs","possible","possibles","pouah","pour","pourquoi","pourrais","pourrait","pouvait","prealable","precisement","premier","première","premièrement","pres","probable","probante","procedant","proche","près","psitt","pu","puis","puisque","pur","pure","q","qu","quand","quant","quant-à-soi","quanta","quarante","quatorze","quatre","quatre-vingt","quatrième","quatrièmement","que","quel","quelconque","quelle","quelles","quelqu'un","quelque","quelques","quels","qui","quiconque","quinze","quoi","quoique","r","rare","rarement","rares","relative","relativement","remarquable","rend","rendre","restant","reste","restent","restrictif","retour","revoici","revoilà","rien","s","sa","sacrebleu","sait","sans","sapristi","sauf","se","sein","seize","selon","semblable","semblaient","semble","semblent","sent","sept","septième","sera","serai","seraient","serais","serait","seras","serez","seriez","serions","serons","seront","ses","seul","seule","seulement","si","sien","sienne","siennes","siens","sinon","six","sixième","soi","soi-même","soient","sois","soit","soixante","sommes","son","sont","sous","souvent","soyez","soyons","specifique","specifiques","speculatif","stop","strictement","subtiles","suffisant","suffisante","suffit","suis","suit","suivant","suivante","suivantes","suivants","suivre","sujet","superpose","sur","surtout","t","ta","tac","tandis","tant","tardive","te","tel","telle","tellement","telles","tels","tenant","tend","tenir","tente","tes","tic","tien","tienne","tiennes","tiens","toc","toi","toi-même","ton","touchant","toujours","tous","tout","toute","toutefois","toutes","treize","trente","tres","trois","troisième","troisièmement","trop","très","tsoin","tsouin","tu","té","u","un","une","unes","uniformement","unique","uniques","uns","v","va","vais","valeur","vas","vers","via","vif","vifs","vingt","vivat","vive","vives","vlan","voici","voie","voient","voilà","voire","vont","vos","votre","vous","vous-mêmes","vu","vé","vôtre","vôtres","w","x","y","z","zut","à","â","ça","ès","étaient","étais","était","étant","état","étiez","étions","été","étée","étées","étés","êtes","être","ô"],"gl":["a","alí","ao","aos","aquel","aquela","aquelas","aqueles","aquilo","aquí","as","así","aínda","ben","cando","che","co","coa","coas","comigo","con","connosco","contigo","convosco","cos","cun","cunha","cunhas","cuns","da","dalgunha","dalgunhas","dalgún","dalgúns","das","de","del","dela","delas","deles","desde","deste","do","dos","dun","dunha","dunhas","duns","e","el","ela","elas","eles","en","era","eran","esa","esas","ese","eses","esta","estaba","estar","este","estes","estiven","estou","está","están","eu","facer","foi","foron","fun","había","hai","iso","isto","la","las","lle","lles","lo","los","mais","me","meu","meus","min","miña","miñas","moi","na","nas","neste","nin","no","non","nos","nosa","nosas","noso","nosos","nun","nunha","nunhas","nuns","nós","o","os","ou","para","pero","pode","pois","pola","polas","polo","polos","por","que","se","senón","ser","seu","seus","sexa","sido","sobre","súa","súas","tamén","tan","te","ten","ter","teu","teus","teñen","teño","ti","tido","tiven","tiña","túa","túas","un","unha","unhas","uns","vos","vosa","vosas","voso","vosos","vós","á","é","ó","ós"],"de":["a","ab","aber","ach","acht","achte","achten","achter","achtes","ag","alle","allein","allem","allen","aller","allerdings","alles","allgemeinen","als","also","am","an","ander","andere","anderem","anderen","anderer","anderes","anderm","andern","anderr","anders","au","auch","auf","aus","ausser","ausserdem","außer","außerdem","b","bald","bei","beide","beiden","beim","beispiel","bekannt","bereits","besonders","besser","besten","bin","bis","bisher","bist","c","d","d.h","da","dabei","dadurch","dafür","dagegen","daher","dahin","dahinter","damals","damit","danach","daneben","dank","dann","daran","darauf","daraus","darf","darfst","darin","darum","darunter","darüber","das","dasein","daselbst","dass","dasselbe","davon","davor","dazu","dazwischen","daß","dein","deine","deinem","deinen","deiner","deines","dem","dementsprechend","demgegenüber","demgemäss","demgemäß","demselben","demzufolge","den","denen","denn","denselben","der","deren","derer","derjenige","derjenigen","dermassen","dermaßen","derselbe","derselben","des","deshalb","desselben","dessen","deswegen","dich","die","diejenige","diejenigen","dies","diese","dieselbe","dieselben","diesem","diesen","dieser","dieses","dir","doch","dort","drei","drin","dritte","dritten","dritter","drittes","du","durch","durchaus","durfte","durften","dürfen","dürft","e","eben","ebenso","ehrlich","ei","ei,","eigen","eigene","eigenen","eigener","eigenes","ein","einander","eine","einem","einen","einer","eines","einig","einige","einigem","einigen","einiger","einiges","einmal","eins","elf","en","ende","endlich","entweder","er","ernst","erst","erste","ersten","erster","erstes","es","etwa","etwas","euch","euer","eure","eurem","euren","eurer","eures","f","folgende","früher","fünf","fünfte","fünften","fünfter","fünftes","für","g","gab","ganz","ganze","ganzen","ganzer","ganzes","gar","gedurft","gegen","gegenüber","gehabt","gehen","geht","gekannt","gekonnt","gemacht","gemocht","gemusst","genug","gerade","gern","gesagt","geschweige","gewesen","gewollt","geworden","gibt","ging","gleich","gott","gross","grosse","grossen","grosser","grosses","groß","große","großen","großer","großes","gut","gute","guter","gutes","h","hab","habe","haben","habt","hast","hat","hatte","hatten","hattest","hattet","heisst","her","heute","hier","hin","hinter","hoch","hätte","hätten","i","ich","ihm","ihn","ihnen","ihr","ihre","ihrem","ihren","ihrer","ihres","im","immer","in","indem","infolgedessen","ins","irgend","ist","j","ja","jahr","jahre","jahren","je","jede","jedem","jeden","jeder","jedermann","jedermanns","jedes","jedoch","jemand","jemandem","jemanden","jene","jenem","jenen","jener","jenes","jetzt","k","kam","kann","kannst","kaum","kein","keine","keinem","keinen","keiner","keines","kleine","kleinen","kleiner","kleines","kommen","kommt","konnte","konnten","kurz","können","könnt","könnte","l","lang","lange","leicht","leide","lieber","los","m","machen","macht","machte","mag","magst","mahn","mal","man","manche","manchem","manchen","mancher","manches","mann","mehr","mein","meine","meinem","meinen","meiner","meines","mensch","menschen","mich","mir","mit","mittel","mochte","mochten","morgen","muss","musst","musste","mussten","muß","mußt","möchte","mögen","möglich","mögt","müssen","müsst","müßt","n","na","nach","nachdem","nahm","natürlich","neben","nein","neue","neuen","neun","neunte","neunten","neunter","neuntes","nicht","nichts","nie","niemand","niemandem","niemanden","noch","nun","nur","o","ob","oben","oder","offen","oft","ohne","ordnung","p","q","r","recht","rechte","rechten","rechter","rechtes","richtig","rund","s","sa","sache","sagt","sagte","sah","satt","schlecht","schluss","schon","sechs","sechste","sechsten","sechster","sechstes","sehr","sei","seid","seien","sein","seine","seinem","seinen","seiner","seines","seit","seitdem","selbst","sich","sie","sieben","siebente","siebenten","siebenter","siebentes","sind","so","solang","solche","solchem","solchen","solcher","solches","soll","sollen","sollst","sollt","sollte","sollten","sondern","sonst","soweit","sowie","später","startseite","statt","steht","suche","t","tag","tage","tagen","tat","teil","tel","tritt","trotzdem","tun","u","uhr","um","und","uns","unse","unsem","unsen","unser","unsere","unserer","unses","unter","v","vergangenen","viel","viele","vielem","vielen","vielleicht","vier","vierte","vierten","vierter","viertes","vom","von","vor","w","wahr","wann","war","waren","warst","wart","warum","was","weg","wegen","weil","weit","weiter","weitere","weiteren","weiteres","welche","welchem","welchen","welcher","welches","wem","wen","wenig","wenige","weniger","weniges","wenigstens","wenn","wer","werde","werden","werdet","weshalb","wessen","wie","wieder","wieso","will","willst","wir","wird","wirklich","wirst","wissen","wo","woher","wohin","wohl","wollen","wollt","wollte","wollten","worden","wurde","wurden","während","währenddem","währenddessen","wäre","würde","würden","x","y","z","z.b","zehn","zehnte","zehnten","zehnter","zehntes","zeit","zu","zuerst","zugleich","zum","zunächst","zur","zurück","zusammen","zwanzig","zwar","zwei","zweite","zweiten","zweiter","zweites","zwischen","zwölf","über","überhaupt","übrigens"],"el":["ένα","έναν","ένας","αι","ακομα","ακομη","ακριβως","αληθεια","αληθινα","αλλα","αλλαχου","αλλες","αλλη","αλλην","αλλης","αλλιως","αλλιωτικα","αλλο","αλλοι","αλλοιως","αλλοιωτικα","αλλον","αλλος","αλλοτε","αλλου","αλλους","αλλων","αμα","αμεσα","αμεσως","αν","ανα","αναμεσα","αναμεταξυ","ανευ","αντι","αντιπερα","αντις","ανω","ανωτερω","αξαφνα","απ","απεναντι","απο","αποψε","από","αρα","αραγε","αργα","αργοτερο","αριστερα","αρκετα","αρχικα","ας","αυριο","αυτα","αυτες","αυτεσ","αυτη","αυτην","αυτης","αυτο","αυτοι","αυτον","αυτος","αυτοσ","αυτου","αυτους","αυτουσ","αυτων","αφοτου","αφου","αἱ","αἳ","αἵ","αὐτόσ","αὐτὸς","αὖ","α∆ιακοπα","βεβαια","βεβαιοτατα","γάρ","γα","γα^","γε","γι","για","γοῦν","γρηγορα","γυρω","γὰρ","δ'","δέ","δή","δαί","δαίσ","δαὶ","δαὶς","δε","δεν","δι","δι'","διά","δια","διὰ","δὲ","δὴ","δ’","εαν","εαυτο","εαυτον","εαυτου","εαυτους","εαυτων","εγκαιρα","εγκαιρως","εγω","ειθε","ειμαι","ειμαστε","ειναι","εις","εισαι","εισαστε","ειστε","ειτε","ειχα","ειχαμε","ειχαν","ειχατε","ειχε","ειχες","ει∆εμη","εκ","εκαστα","εκαστες","εκαστη","εκαστην","εκαστης","εκαστο","εκαστοι","εκαστον","εκαστος","εκαστου","εκαστους","εκαστων","εκει","εκεινα","εκεινες","εκεινεσ","εκεινη","εκεινην","εκεινης","εκεινο","εκεινοι","εκεινον","εκεινος","εκεινοσ","εκεινου","εκεινους","εκεινουσ","εκεινων","εκτος","εμας","εμεις","εμενα","εμπρος","εν","ενα","εναν","ενας","ενος","εντελως","εντος","εντωμεταξυ","ενω","ενός","εξ","εξαφνα","εξης","εξισου","εξω","επ","επί","επανω","επειτα","επει∆η","επι","επισης","επομενως","εσας","εσεις","εσενα","εστω","εσυ","ετερα","ετεραι","ετερας","ετερες","ετερη","ετερης","ετερο","ετεροι","ετερον","ετερος","ετερου","ετερους","ετερων","ετουτα","ετουτες","ετουτη","ετουτην","ετουτης","ετουτο","ετουτοι","ετουτον","ετουτος","ετουτου","ετουτους","ετουτων","ετσι","ευγε","ευθυς","ευτυχως","εφεξης","εχει","εχεις","εχετε","εχθες","εχομε","εχουμε","εχουν","εχτες","εχω","εως","εἰ","εἰμί","εἰμὶ","εἰς","εἰσ","εἴ","εἴμι","εἴτε","ε∆ω","η","ημασταν","ημαστε","ημουν","ησασταν","ησαστε","ησουν","ηταν","ητανε","ητοι","ηττον","η∆η","θα","ι","ιι","ιιι","ισαμε","ισια","ισως","ισωσ","ι∆ια","ι∆ιαν","ι∆ιας","ι∆ιες","ι∆ιο","ι∆ιοι","ι∆ιον","ι∆ιος","ι∆ιου","ι∆ιους","ι∆ιων","ι∆ιως","κ","καί","καίτοι","καθ","καθε","καθεμια","καθεμιας","καθενα","καθενας","καθενος","καθετι","καθολου","καθως","και","κακα","κακως","καλα","καλως","καμια","καμιαν","καμιας","καμποσα","καμποσες","καμποση","καμποσην","καμποσης","καμποσο","καμποσοι","καμποσον","καμποσος","καμποσου","καμποσους","καμποσων","κανεις","κανεν","κανενα","κανεναν","κανενας","κανενος","καποια","καποιαν","καποιας","καποιες","καποιο","καποιοι","καποιον","καποιος","καποιου","καποιους","καποιων","καποτε","καπου","καπως","κατ","κατά","κατα","κατι","κατιτι","κατοπιν","κατω","κατὰ","καὶ","κι","κιολας","κλπ","κοντα","κτλ","κυριως","κἀν","κἂν","λιγακι","λιγο","λιγωτερο","λογω","λοιπα","λοιπον","μέν","μέσα","μή","μήτε","μία","μα","μαζι","μακαρι","μακρυα","μαλιστα","μαλλον","μας","με","μεθ","μεθαυριο","μειον","μελει","μελλεται","μεμιας","μεν","μερικα","μερικες","μερικοι","μερικους","μερικων","μεσα","μετ","μετά","μετα","μεταξυ","μετὰ","μεχρι","μη","μην","μηπως","μητε","μη∆ε","μιά","μια","μιαν","μιας","μολις","μολονοτι","μοναχα","μονες","μονη","μονην","μονης","μονο","μονοι","μονομιας","μονος","μονου","μονους","μονων","μου","μπορει","μπορουν","μπραβο","μπρος","μἐν","μὲν","μὴ","μὴν","να","ναι","νωρις","ξανα","ξαφνικα","ο","οι","ολα","ολες","ολη","ολην","ολης","ολο","ολογυρα","ολοι","ολον","ολονεν","ολος","ολοτελα","ολου","ολους","ολων","ολως","ολως∆ιολου","ομως","ομωσ","οποια","οποιαν","οποιαν∆ηποτε","οποιας","οποιας∆ηποτε","οποια∆ηποτε","οποιες","οποιες∆ηποτε","οποιο","οποιοι","οποιον","οποιον∆ηποτε","οποιος","οποιος∆ηποτε","οποιου","οποιους","οποιους∆ηποτε","οποιου∆ηποτε","οποιο∆ηποτε","οποιων","οποιων∆ηποτε","οποι∆ηποτε","οποτε","οποτε∆ηποτε","οπου","οπου∆ηποτε","οπως","οπωσ","ορισμενα","ορισμενες","ορισμενων","ορισμενως","οσα","οσα∆ηποτε","οσες","οσες∆ηποτε","οση","οσην","οσην∆ηποτε","οσης","οσης∆ηποτε","οση∆ηποτε","οσο","οσοι","οσοι∆ηποτε","οσον","οσον∆ηποτε","οσος","οσος∆ηποτε","οσου","οσους","οσους∆ηποτε","οσου∆ηποτε","οσο∆ηποτε","οσων","οσων∆ηποτε","οταν","οτι","οτι∆ηποτε","οτου","ου","ουτε","ου∆ε","οχι","οἱ","οἳ","οἷς","οὐ","οὐδ","οὐδέ","οὐδείσ","οὐδεὶς","οὐδὲ","οὐδὲν","οὐκ","οὐχ","οὐχὶ","οὓς","οὔτε","οὕτω","οὕτως","οὕτωσ","οὖν","οὗ","οὗτος","οὗτοσ","παλι","παντοτε","παντου","παντως","παρ","παρά","παρα","παρὰ","περί","περα","περι","περιπου","περισσοτερο","περσι","περυσι","περὶ","πια","πιθανον","πιο","πισω","πλαι","πλεον","πλην","ποια","ποιαν","ποιας","ποιες","ποιεσ","ποιο","ποιοι","ποιον","ποιος","ποιοσ","ποιου","ποιους","ποιουσ","ποιων","πολυ","ποσες","ποση","ποσην","ποσης","ποσοι","ποσος","ποσους","ποτε","που","πουθε","πουθενα","ποῦ","πρεπει","πριν","προ","προκειμενου","προκειται","προπερσι","προς","προσ","προτου","προχθες","προχτες","πρωτυτερα","πρόσ","πρὸ","πρὸς","πως","πωσ","σαν","σας","σε","σεις","σημερα","σιγα","σου","στα","στη","στην","στης","στις","στο","στον","στου","στους","στων","συγχρονως","συν","συναμα","συνεπως","συνηθως","συχνα","συχνας","συχνες","συχνη","συχνην","συχνης","συχνο","συχνοι","συχνον","συχνος","συχνου","συχνους","συχνων","συχνως","σχε∆ον","σωστα","σόσ","σύ","σύν","σὸς","σὺ","σὺν","τά","τήν","τί","τίς","τίσ","τα","ταυτα","ταυτες","ταυτη","ταυτην","ταυτης","ταυτο,ταυτον","ταυτος","ταυτου","ταυτων","ταχα","ταχατε","ταῖς","τα∆ε","τε","τελικα","τελικως","τες","τετοια","τετοιαν","τετοιας","τετοιες","τετοιο","τετοιοι","τετοιον","τετοιος","τετοιου","τετοιους","τετοιων","τη","την","της","τησ","τι","τινα","τιποτα","τιποτε","τις","τισ","το","τοί","τοι","τοιοῦτος","τοιοῦτοσ","τον","τος","τοσα","τοσες","τοση","τοσην","τοσης","τοσο","τοσοι","τοσον","τοσος","τοσου","τοσους","τοσων","τοτε","του","τουλαχιστο","τουλαχιστον","τους","τουτα","τουτες","τουτη","τουτην","τουτης","τουτο","τουτοι","τουτοις","τουτον","τουτος","τουτου","τουτους","τουτων","τούσ","τοὺς","τοῖς","τοῦ","τυχον","των","τωρα","τό","τόν","τότε","τὰ","τὰς","τὴν","τὸ","τὸν","τῆς","τῆσ","τῇ","τῶν","τῷ","υπ","υπερ","υπο","υποψη","υποψιν","υπό","υστερα","φετος","χαμηλα","χθες","χτες","χωρις","χωριστα","ψηλα","ω","ωραια","ως","ωσ","ωσαν","ωσοτου","ωσπου","ωστε","ωστοσο","ωχ","ἀλλ'","ἀλλά","ἀλλὰ","ἀλλ’","ἀπ","ἀπό","ἀπὸ","ἀφ","ἂν","ἃ","ἄλλος","ἄλλοσ","ἄν","ἄρα","ἅμα","ἐάν","ἐγώ","ἐγὼ","ἐκ","ἐμόσ","ἐμὸς","ἐν","ἐξ","ἐπί","ἐπεὶ","ἐπὶ","ἐστι","ἐφ","ἐὰν","ἑαυτοῦ","ἔτι","ἡ","ἢ","ἣ","ἤ","ἥ","ἧς","ἵνα","ὁ","ὃ","ὃν","ὃς","ὅ","ὅδε","ὅθεν","ὅπερ","ὅς","ὅσ","ὅστις","ὅστισ","ὅτε","ὅτι","ὑμόσ","ὑπ","ὑπέρ","ὑπό","ὑπὲρ","ὑπὸ","ὡς","ὡσ","ὥς","ὥστε","ὦ","ᾧ","∆α","∆ε","∆εινα","∆εν","∆εξια","∆ηθεν","∆ηλα∆η","∆ι","∆ια","∆ιαρκως","∆ικα","∆ικο","∆ικοι","∆ικος","∆ικου","∆ικους","∆ιολου","∆ιπλα","∆ιχως"],"gu":["અંગે","અંદર","અથવા","અને","અમને","અમારું","અમે","અહીં","આ","આગળ","આથી","આનું","આને","આપણને","આપણું","આપણે","આપી","આર","આવી","આવે","ઉપર","ઉભા","ઊંચે","ઊભું","એ","એક","એન","એના","એનાં","એની","એનું","એને","એનો","એમ","એવા","એવાં","એવી","એવું","એવો","ઓછું","કંઈક","કઈ","કયું","કયો","કરતાં","કરવું","કરી","કરીએ","કરું","કરે","કરેલું","કર્યા","કર્યાં","કર્યું","કર્યો","કાંઈ","કે","કેટલું","કેમ","કેવી","કેવું","કોઈ","કોઈક","કોણ","કોણે","કોને","ક્યાં","ક્યારે","ખૂબ","ગઈ","ગયા","ગયાં","ગયું","ગયો","ઘણું","છ","છતાં","છીએ","છું","છે","છેક","છો","જ","જાય","જી","જે","જેટલું","જેને","જેમ","જેવી","જેવું","જેવો","જો","જોઈએ","જ્યાં","જ્યારે","ઝાઝું","તને","તમને","તમારું","તમે","તા","તારાથી","તારામાં","તારું","તું","તે","તેં","તેઓ","તેણે","તેથી","તેના","તેની","તેનું","તેને","તેમ","તેમનું","તેમને","તેવી","તેવું","તો","ત્યાં","ત્યારે","થઇ","થઈ","થઈએ","થતા","થતાં","થતી","થતું","થતો","થયા","થયાં","થયું","થયેલું","થયો","થવું","થાઉં","થાઓ","થાય","થી","થોડું","દરેક","ન","નં","નં.","નથી","નહિ","નહી","નહીં","ના","ની","નીચે","નું","ને","નો","પછી","પણ","પર","પરંતુ","પહેલાં","પાછળ","પાસે","પોતાનું","પ્રત્યેક","ફક્ત","ફરી","ફરીથી","બંને","બધા","બધું","બની","બહાર","બહુ","બાદ","બે","મને","મા","માં","માટે","માત્ર","મારું","મી","મૂકવું","મૂકી","મૂક્યા","મૂક્યાં","મૂક્યું","મેં","રહી","રહે","રહેવું","રહ્યા","રહ્યાં","રહ્યો","રીતે","રૂ.","રૂા","લેતા","લેતું","લેવા","વગેરે","વધુ","શકે","શા","શું","સરખું","સામે","સુધી","હતા","હતાં","હતી","હતું","હવે","હશે","હશો","હા","હું","હો","હોઈ","હોઈશ","હોઈશું","હોય","હોવા"],"ha":["a","amma","ba","ban","ce","cikin","da","don","ga","in","ina","ita","ji","ka","ko","kuma","lokacin","ma","mai","na","ne","ni","sai","shi","su","suka","sun","ta","tafi","take","tana","wani","wannan","wata","ya","yake","yana","yi","za"],"he":["אבל","או","אולי","אותה","אותו","אותי","אותך","אותם","אותן","אותנו","אז","אחר","אחרות","אחרי","אחריכן","אחרים","אחרת","אי","איזה","איך","אין","איפה","איתה","איתו","איתי","איתך","איתכם","איתכן","איתם","איתן","איתנו","אך","אל","אלה","אלו","אם","אנחנו","אני","אס","אף","אצל","אשר","את","אתה","אתכם","אתכן","אתם","אתן","באיזומידה","באמצע","באמצעות","בגלל","בין","בלי","במידה","במקוםשבו","ברם","בשביל","בשעהש","בתוך","גם","דרך","הוא","היא","היה","היכן","היתה","היתי","הם","הן","הנה","הסיבהשבגללה","הרי","ואילו","ואת","זאת","זה","זות","יהיה","יוכל","יוכלו","יותרמדי","יכול","יכולה","יכולות","יכולים","יכל","יכלה","יכלו","יש","כאן","כאשר","כולם","כולן","כזה","כי","כיצד","כך","ככה","כל","כלל","כמו","כן","כפי","כש","לא","לאו","לאיזותכלית","לאן","לבין","לה","להיות","להם","להן","לו","לי","לכם","לכן","למה","למטה","למעלה","למקוםשבו","למרות","לנו","לעבר","לעיכן","לפיכך","לפני","מאד","מאחורי","מאיזוסיבה","מאין","מאיפה","מבלי","מבעד","מדוע","מה","מהיכן","מול","מחוץ","מי","מכאן","מכיוון","מלבד","מן","מנין","מסוגל","מעט","מעטים","מעל","מצד","מקוםבו","מתחת","מתי","נגד","נגר","נו","עד","עז","על","עלי","עליה","עליהם","עליהן","עליו","עליך","עליכם","עלינו","עם","עצמה","עצמהם","עצמהן","עצמו","עצמי","עצמם","עצמן","עצמנו","פה","רק","שוב","של","שלה","שלהם","שלהן","שלו","שלי","שלך","שלכה","שלכם","שלכן","שלנו","שם","תהיה","תחת"],"hi":["अंदर","अत","अदि","अप","अपना","अपनि","अपनी","अपने","अभि","अभी","आदि","आप","इंहिं","इंहें","इंहों","इतयादि","इत्यादि","इन","इनका","इन्हीं","इन्हें","इन्हों","इस","इसका","इसकि","इसकी","इसके","इसमें","इसि","इसी","इसे","उंहिं","उंहें","उंहों","उन","उनका","उनकि","उनकी","उनके","उनको","उन्हीं","उन्हें","उन्हों","उस","उसके","उसि","उसी","उसे","एक","एवं","एस","एसे","ऐसे","ओर","और","कइ","कई","कर","करता","करते","करना","करने","करें","कहते","कहा","का","काफि","काफ़ी","कि","किंहें","किंहों","कितना","किन्हें","किन्हों","किया","किर","किस","किसि","किसी","किसे","की","कुछ","कुल","के","को","कोइ","कोई","कोन","कोनसा","कौन","कौनसा","गया","घर","जब","जहाँ","जहां","जा","जिंहें","जिंहों","जितना","जिधर","जिन","जिन्हें","जिन्हों","जिस","जिसे","जीधर","जेसा","जेसे","जैसा","जैसे","जो","तक","तब","तरह","तिंहें","तिंहों","तिन","तिन्हें","तिन्हों","तिस","तिसे","तो","था","थि","थी","थे","दबारा","दवारा","दिया","दुसरा","दुसरे","दूसरे","दो","द्वारा","न","नहिं","नहीं","ना","निचे","निहायत","नीचे","ने","पर","पहले","पुरा","पूरा","पे","फिर","बनि","बनी","बहि","बही","बहुत","बाद","बाला","बिलकुल","भि","भितर","भी","भीतर","मगर","मानो","मे","में","यदि","यह","यहाँ","यहां","यहि","यही","या","यिह","ये","रखें","रवासा","रहा","रहे","ऱ्वासा","लिए","लिये","लेकिन","व","वगेरह","वरग","वर्ग","वह","वहाँ","वहां","वहिं","वहीं","वाले","वुह","वे","वग़ैरह","संग","सकता","सकते","सबसे","सभि","सभी","साथ","साबुत","साभ","सारा","से","सो","हि","ही","हुअ","हुआ","हुइ","हुई","हुए","हे","हें","है","हैं","हो","होता","होति","होती","होते","होना","होने"],"hu":["a","abba","abban","abból","addig","ahhoz","ahogy","ahol","aki","akik","akkor","akár","alapján","alatt","alatta","alattad","alattam","alattatok","alattuk","alattunk","alá","alád","alájuk","alám","alánk","alátok","alól","alóla","alólad","alólam","alólatok","alóluk","alólunk","amely","amelybol","amelyek","amelyekben","amelyeket","amelyet","amelyik","amelynek","ami","amikor","amit","amolyan","amott","amíg","annak","annál","arra","arról","attól","az","aznap","azok","azokat","azokba","azokban","azokból","azokhoz","azokig","azokkal","azokká","azoknak","azoknál","azokon","azokra","azokról","azoktól","azokért","azon","azonban","azonnal","azt","aztán","azután","azzal","azzá","azért","bal","balra","ban","be","belé","beléd","beléjük","belém","belénk","belétek","belül","belőle","belőled","belőlem","belőletek","belőlük","belőlünk","ben","benne","benned","bennem","bennetek","bennük","bennünk","bár","bárcsak","bármilyen","búcsú","cikk","cikkek","cikkeket","csak","csakhogy","csupán","de","dehogy","e","ebbe","ebben","ebből","eddig","egy","egyebek","egyebet","egyedül","egyelőre","egyes","egyet","egyetlen","egyik","egymás","egyre","egyszerre","egyéb","együtt","egész","egészen","ehhez","ekkor","el","eleinte","ellen","ellenes","elleni","ellenére","elmondta","elsõ","első","elsők","elsősorban","elsőt","elé","eléd","elég","eléjük","elém","elénk","elétek","elõ","elõször","elõtt","elő","előbb","elől","előle","előled","előlem","előletek","előlük","előlünk","először","előtt","előtte","előtted","előttem","előttetek","előttük","előttünk","előző","emilyen","engem","ennek","ennyi","ennél","enyém","erre","erről","esetben","ettől","ez","ezek","ezekbe","ezekben","ezekből","ezeken","ezeket","ezekhez","ezekig","ezekkel","ezekké","ezeknek","ezeknél","ezekre","ezekről","ezektől","ezekért","ezen","ezentúl","ezer","ezret","ezt","ezután","ezzel","ezzé","ezért","fel","fele","felek","felet","felett","felé","fent","fenti","fél","fölé","gyakran","ha","halló","hamar","hanem","harmadik","harmadikat","harminc","hat","hatodik","hatodikat","hatot","hatvan","helyett","hetedik","hetediket","hetet","hetven","hirtelen","hiszen","hiába","hogy","hogyan","hol","holnap","holnapot","honnan","hova","hozzá","hozzád","hozzájuk","hozzám","hozzánk","hozzátok","hurrá","huszadik","hány","hányszor","hármat","három","hát","hátha","hátulsó","hét","húsz","ide","ide-оda","idén","igazán","igen","ill","ill.","illetve","ilyen","ilyenkor","immár","inkább","is","ismét","ison","itt","jelenleg","jobban","jobbra","jó","jól","jólesik","jóval","jövőre","kell","kellene","kellett","kelljen","keressünk","keresztül","ketten","kettő","kettőt","kevés","ki","kiben","kiből","kicsit","kicsoda","kihez","kik","kikbe","kikben","kikből","kiken","kiket","kikhez","kikkel","kikké","kiknek","kiknél","kikre","kikről","kiktől","kikért","kilenc","kilencedik","kilencediket","kilencet","kilencven","kin","kinek","kinél","kire","kiről","kit","kitől","kivel","kivé","kié","kiért","korábban","képest","kérem","kérlek","kész","késő","később","későn","két","kétszer","kívül","körül","köszönhetően","köszönöm","közben","közel","közepesen","közepén","közé","között","közül","külön","különben","különböző","különbözőbb","különbözőek","lassan","le","legalább","legyen","lehet","lehetetlen","lehetett","lehetőleg","lehetőség","lenne","lenni","lennék","lennének","lesz","leszek","lesznek","leszünk","lett","lettek","lettem","lettünk","lévő","ma","maga","magad","magam","magatokat","magukat","magunkat","magát","mai","majd","majdnem","manapság","meg","megcsinál","megcsinálnak","megint","megvan","mellett","mellette","melletted","mellettem","mellettetek","mellettük","mellettünk","mellé","melléd","melléjük","mellém","mellénk","mellétek","mellől","mellőle","mellőled","mellőlem","mellőletek","mellőlük","mellőlünk","mely","melyek","melyik","mennyi","mert","mi","miatt","miatta","miattad","miattam","miattatok","miattuk","miattunk","mibe","miben","miből","mihez","mik","mikbe","mikben","mikből","miken","miket","mikhez","mikkel","mikké","miknek","miknél","mikor","mikre","mikről","miktől","mikért","milyen","min","mind","mindegyik","mindegyiket","minden","mindenesetre","mindenki","mindent","mindenütt","mindig","mindketten","minek","minket","mint","mintha","minél","mire","miről","mit","mitől","mivel","mivé","miért","mondta","most","mostanáig","már","más","másik","másikat","másnap","második","másodszor","mások","másokat","mást","még","mégis","míg","mögé","mögéd","mögéjük","mögém","mögénk","mögétek","mögött","mögötte","mögötted","mögöttem","mögöttetek","mögöttük","mögöttünk","mögül","mögüle","mögüled","mögülem","mögületek","mögülük","mögülünk","múltkor","múlva","na","nagy","nagyobb","nagyon","naponta","napot","ne","negyedik","negyediket","negyven","neked","nekem","neki","nekik","nektek","nekünk","nem","nemcsak","nemrég","nincs","nyolc","nyolcadik","nyolcadikat","nyolcat","nyolcvan","nála","nálad","nálam","nálatok","náluk","nálunk","négy","négyet","néha","néhány","nélkül","o","oda","ok","olyan","onnan","ott","pedig","persze","pár","például","rajta","rajtad","rajtam","rajtatok","rajtuk","rajtunk","rendben","rosszul","rá","rád","rájuk","rám","ránk","rátok","régen","régóta","részére","róla","rólad","rólam","rólatok","róluk","rólunk","rögtön","s","saját","se","sem","semmi","semmilyen","semmiség","senki","soha","sok","sokan","sokat","sokkal","sokszor","sokáig","során","stb.","szemben","szerbusz","szerint","szerinte","szerinted","szerintem","szerintetek","szerintük","szerintünk","szervusz","szinte","számára","száz","századik","százat","szépen","szét","szíves","szívesen","szíveskedjék","sőt","talán","tavaly","te","tegnap","tegnapelőtt","tehát","tele","teljes","tessék","ti","tied","titeket","tizedik","tizediket","tizenegy","tizenegyedik","tizenhat","tizenhárom","tizenhét","tizenkettedik","tizenkettő","tizenkilenc","tizenkét","tizennyolc","tizennégy","tizenöt","tizet","tovább","további","továbbá","távol","téged","tényleg","tíz","több","többi","többször","túl","tőle","tőled","tőlem","tőletek","tőlük","tőlünk","ugyanakkor","ugyanez","ugyanis","ugye","urak","uram","urat","utoljára","utolsó","után","utána","vagy","vagyis","vagyok","vagytok","vagyunk","vajon","valahol","valaki","valakit","valamelyik","valami","valamint","való","van","vannak","vele","veled","velem","veletek","velük","velünk","vissza","viszlát","viszont","viszontlátásra","volna","volnának","volnék","volt","voltak","voltam","voltunk","végre","végén","végül","által","általában","ám","át","éljen","én","éppen","érte","érted","értem","értetek","értük","értünk","és","év","évben","éve","évek","éves","évi","évvel","így","óta","õ","õk","õket","ön","önbe","önben","önből","önhöz","önnek","önnel","önnél","önre","önről","önt","öntől","önért","önök","önökbe","önökben","önökből","önöket","önökhöz","önökkel","önöknek","önöknél","önökre","önökről","önöktől","önökért","önökön","önön","össze","öt","ötven","ötödik","ötödiket","ötöt","úgy","úgyis","úgynevezett","új","újabb","újra","úr","ő","ők","őket","őt"],"id":["ada","adalah","adanya","adapun","agak","agaknya","agar","akan","akankah","akhir","akhiri","akhirnya","aku","akulah","amat","amatlah","anda","andalah","antar","antara","antaranya","apa","apaan","apabila","apakah","apalagi","apatah","artinya","asal","asalkan","atas","atau","ataukah","ataupun","awal","awalnya","bagai","bagaikan","bagaimana","bagaimanakah","bagaimanapun","bagi","bagian","bahkan","bahwa","bahwasanya","baik","bakal","bakalan","balik","banyak","bapak","baru","bawah","beberapa","begini","beginian","beginikah","beginilah","begitu","begitukah","begitulah","begitupun","bekerja","belakang","belakangan","belum","belumlah","benar","benarkah","benarlah","berada","berakhir","berakhirlah","berakhirnya","berapa","berapakah","berapalah","berapapun","berarti","berawal","berbagai","berdatangan","beri","berikan","berikut","berikutnya","berjumlah","berkali-kali","berkata","berkehendak","berkeinginan","berkenaan","berlainan","berlalu","berlangsung","berlebihan","bermacam","bermacam-macam","bermaksud","bermula","bersama","bersama-sama","bersiap","bersiap-siap","bertanya","bertanya-tanya","berturut","berturut-turut","bertutur","berujar","berupa","besar","betul","betulkah","biasa","biasanya","bila","bilakah","bisa","bisakah","boleh","bolehkah","bolehlah","buat","bukan","bukankah","bukanlah","bukannya","bulan","bung","cara","caranya","cukup","cukupkah","cukuplah","cuma","dahulu","dalam","dan","dapat","dari","daripada","datang","dekat","demi","demikian","demikianlah","dengan","depan","di","dia","diakhiri","diakhirinya","dialah","diantara","diantaranya","diberi","diberikan","diberikannya","dibuat","dibuatnya","didapat","didatangkan","digunakan","diibaratkan","diibaratkannya","diingat","diingatkan","diinginkan","dijawab","dijelaskan","dijelaskannya","dikarenakan","dikatakan","dikatakannya","dikerjakan","diketahui","diketahuinya","dikira","dilakukan","dilalui","dilihat","dimaksud","dimaksudkan","dimaksudkannya","dimaksudnya","diminta","dimintai","dimisalkan","dimulai","dimulailah","dimulainya","dimungkinkan","dini","dipastikan","diperbuat","diperbuatnya","dipergunakan","diperkirakan","diperlihatkan","diperlukan","diperlukannya","dipersoalkan","dipertanyakan","dipunyai","diri","dirinya","disampaikan","disebut","disebutkan","disebutkannya","disini","disinilah","ditambahkan","ditandaskan","ditanya","ditanyai","ditanyakan","ditegaskan","ditujukan","ditunjuk","ditunjuki","ditunjukkan","ditunjukkannya","ditunjuknya","dituturkan","dituturkannya","diucapkan","diucapkannya","diungkapkan","dong","dua","dulu","empat","enggak","enggaknya","entah","entahlah","guna","gunakan","hal","hampir","hanya","hanyalah","hari","harus","haruslah","harusnya","hendak","hendaklah","hendaknya","hingga","ia","ialah","ibarat","ibaratkan","ibaratnya","ibu","ikut","ingat","ingat-ingat","ingin","inginkah","inginkan","ini","inikah","inilah","itu","itukah","itulah","jadi","jadilah","jadinya","jangan","jangankan","janganlah","jauh","jawab","jawaban","jawabnya","jelas","jelaskan","jelaslah","jelasnya","jika","jikalau","juga","jumlah","jumlahnya","justru","kala","kalau","kalaulah","kalaupun","kalian","kami","kamilah","kamu","kamulah","kan","kapan","kapankah","kapanpun","karena","karenanya","kasus","kata","katakan","katakanlah","katanya","ke","keadaan","kebetulan","kecil","kedua","keduanya","keinginan","kelamaan","kelihatan","kelihatannya","kelima","keluar","kembali","kemudian","kemungkinan","kemungkinannya","kenapa","kepada","kepadanya","kesampaian","keseluruhan","keseluruhannya","keterlaluan","ketika","khususnya","kini","kinilah","kira","kira-kira","kiranya","kita","kitalah","kok","kurang","lagi","lagian","lah","lain","lainnya","lalu","lama","lamanya","lanjut","lanjutnya","lebih","lewat","lima","luar","macam","maka","makanya","makin","malah","malahan","mampu","mampukah","mana","manakala","manalagi","masa","masalah","masalahnya","masih","masihkah","masing","masing-masing","mau","maupun","melainkan","melakukan","melalui","melihat","melihatnya","memang","memastikan","memberi","memberikan","membuat","memerlukan","memihak","meminta","memintakan","memisalkan","memperbuat","mempergunakan","memperkirakan","memperlihatkan","mempersiapkan","mempersoalkan","mempertanyakan","mempunyai","memulai","memungkinkan","menaiki","menambahkan","menandaskan","menanti","menanti-nanti","menantikan","menanya","menanyai","menanyakan","mendapat","mendapatkan","mendatang","mendatangi","mendatangkan","menegaskan","mengakhiri","mengapa","mengatakan","mengatakannya","mengenai","mengerjakan","mengetahui","menggunakan","menghendaki","mengibaratkan","mengibaratkannya","mengingat","mengingatkan","menginginkan","mengira","mengucapkan","mengucapkannya","mengungkapkan","menjadi","menjawab","menjelaskan","menuju","menunjuk","menunjuki","menunjukkan","menunjuknya","menurut","menuturkan","menyampaikan","menyangkut","menyatakan","menyebutkan","menyeluruh","menyiapkan","merasa","mereka","merekalah","merupakan","meski","meskipun","meyakini","meyakinkan","minta","mirip","misal","misalkan","misalnya","mula","mulai","mulailah","mulanya","mungkin","mungkinkah","nah","naik","namun","nanti","nantinya","nyaris","nyatanya","oleh","olehnya","pada","padahal","padanya","pak","paling","panjang","pantas","para","pasti","pastilah","penting","pentingnya","per","percuma","perlu","perlukah","perlunya","pernah","persoalan","pertama","pertama-tama","pertanyaan","pertanyakan","pihak","pihaknya","pukul","pula","pun","punya","rasa","rasanya","rata","rupanya","saat","saatnya","saja","sajalah","saling","sama","sama-sama","sambil","sampai","sampai-sampai","sampaikan","sana","sangat","sangatlah","satu","saya","sayalah","se","sebab","sebabnya","sebagai","sebagaimana","sebagainya","sebagian","sebaik","sebaik-baiknya","sebaiknya","sebaliknya","sebanyak","sebegini","sebegitu","sebelum","sebelumnya","sebenarnya","seberapa","sebesar","sebetulnya","sebisanya","sebuah","sebut","sebutlah","sebutnya","secara","secukupnya","sedang","sedangkan","sedemikian","sedikit","sedikitnya","seenaknya","segala","segalanya","segera","seharusnya","sehingga","seingat","sejak","sejauh","sejenak","sejumlah","sekadar","sekadarnya","sekali","sekali-kali","sekalian","sekaligus","sekalipun","sekarang","sekecil","seketika","sekiranya","sekitar","sekitarnya","sekurang-kurangnya","sekurangnya","sela","selagi","selain","selaku","selalu","selama","selama-lamanya","selamanya","selanjutnya","seluruh","seluruhnya","semacam","semakin","semampu","semampunya","semasa","semasih","semata","semata-mata","semaunya","sementara","semisal","semisalnya","sempat","semua","semuanya","semula","sendiri","sendirian","sendirinya","seolah","seolah-olah","seorang","sepanjang","sepantasnya","sepantasnyalah","seperlunya","seperti","sepertinya","sepihak","sering","seringnya","serta","serupa","sesaat","sesama","sesampai","sesegera","sesekali","seseorang","sesuatu","sesuatunya","sesudah","sesudahnya","setelah","setempat","setengah","seterusnya","setiap","setiba","setibanya","setidak-tidaknya","setidaknya","setinggi","seusai","sewaktu","siap","siapa","siapakah","siapapun","sini","sinilah","soal","soalnya","suatu","sudah","sudahkah","sudahlah","supaya","tadi","tadinya","tahu","tahun","tak","tambah","tambahnya","tampak","tampaknya","tandas","tandasnya","tanpa","tanya","tanyakan","tanyanya","tapi","tegas","tegasnya","telah","tempat","tengah","tentang","tentu","tentulah","tentunya","tepat","terakhir","terasa","terbanyak","terdahulu","terdapat","terdiri","terhadap","terhadapnya","teringat","teringat-ingat","terjadi","terjadilah","terjadinya","terkira","terlalu","terlebih","terlihat","termasuk","ternyata","tersampaikan","tersebut","tersebutlah","tertentu","tertuju","terus","terutama","tetap","tetapi","tiap","tiba","tiba-tiba","tidak","tidakkah","tidaklah","tiga","tinggi","toh","tunjuk","turut","tutur","tuturnya","ucap","ucapnya","ujar","ujarnya","umum","umumnya","ungkap","ungkapnya","untuk","usah","usai","waduh","wah","wahai","waktu","waktunya","walau","walaupun","wong","yaitu","yakin","yakni","yang"],"ga":["a","ach","ag","agus","an","aon","ar","arna","as","b'","ba","beirt","bhúr","caoga","ceathair","ceathrar","chomh","chtó","chuig","chun","cois","céad","cúig","cúigear","d'","daichead","dar","de","deich","deichniúr","den","dhá","do","don","dtí","dá","dár","dó","faoi","faoin","faoina","faoinár","fara","fiche","gach","gan","go","gur","haon","hocht","i","iad","idir","in","ina","ins","inár","is","le","leis","lena","lenár","m'","mar","mo","mé","na","nach","naoi","naonúr","ná","ní","níor","nó","nócha","ocht","ochtar","os","roimh","sa","seacht","seachtar","seachtó","seasca","seisear","siad","sibh","sinn","sna","sé","sí","tar","thar","thú","triúr","trí","trína","trínár","tríocha","tú","um","ár","é","éis","í","ó","ón","óna","ónár"],"it":["a","abbastanza","abbia","abbiamo","abbiano","abbiate","accidenti","ad","adesso","affinché","agl","agli","ahime","ahimè","ai","al","alcuna","alcuni","alcuno","all","alla","alle","allo","allora","altre","altri","altrimenti","altro","altrove","altrui","anche","ancora","anni","anno","ansa","anticipo","assai","attesa","attraverso","avanti","avemmo","avendo","avente","aver","avere","averlo","avesse","avessero","avessi","avessimo","aveste","avesti","avete","aveva","avevamo","avevano","avevate","avevi","avevo","avrai","avranno","avrebbe","avrebbero","avrei","avremmo","avremo","avreste","avresti","avrete","avrà","avrò","avuta","avute","avuti","avuto","basta","ben","bene","benissimo","brava","bravo","buono","c","caso","cento","certa","certe","certi","certo","che","chi","chicchessia","chiunque","ci","ciascuna","ciascuno","cima","cinque","cio","cioe","cioè","circa","citta","città","ciò","co","codesta","codesti","codesto","cogli","coi","col","colei","coll","coloro","colui","come","cominci","comprare","comunque","con","concernente","conclusione","consecutivi","consecutivo","consiglio","contro","cortesia","cos","cosa","cosi","così","cui","d","da","dagl","dagli","dai","dal","dall","dalla","dalle","dallo","dappertutto","davanti","degl","degli","dei","del","dell","della","delle","dello","dentro","detto","deve","devo","di","dice","dietro","dire","dirimpetto","diventa","diventare","diventato","dopo","doppio","dov","dove","dovra","dovrà","dovunque","due","dunque","durante","e","ebbe","ebbero","ebbi","ecc","ecco","ed","effettivamente","egli","ella","entrambi","eppure","era","erano","eravamo","eravate","eri","ero","esempio","esse","essendo","esser","essere","essi","ex","fa","faccia","facciamo","facciano","facciate","faccio","facemmo","facendo","facesse","facessero","facessi","facessimo","faceste","facesti","faceva","facevamo","facevano","facevate","facevi","facevo","fai","fanno","farai","faranno","fare","farebbe","farebbero","farei","faremmo","faremo","fareste","faresti","farete","farà","farò","fatto","favore","fece","fecero","feci","fin","finalmente","finche","fine","fino","forse","forza","fosse","fossero","fossi","fossimo","foste","fosti","fra","frattempo","fu","fui","fummo","fuori","furono","futuro","generale","gente","gia","giacche","giorni","giorno","giu","già","gli","gliela","gliele","glieli","glielo","gliene","grande","grazie","gruppo","ha","haha","hai","hanno","ho","i","ie","ieri","il","improvviso","in","inc","indietro","infatti","inoltre","insieme","intanto","intorno","invece","io","l","la","lasciato","lato","le","lei","li","lo","lontano","loro","lui","lungo","luogo","là","ma","macche","magari","maggior","mai","male","malgrado","malissimo","me","medesimo","mediante","meglio","meno","mentre","mesi","mezzo","mi","mia","mie","miei","mila","miliardi","milioni","minimi","mio","modo","molta","molti","moltissimo","molto","momento","mondo","ne","negl","negli","nei","nel","nell","nella","nelle","nello","nemmeno","neppure","nessun","nessuna","nessuno","niente","no","noi","nome","non","nondimeno","nonostante","nonsia","nostra","nostre","nostri","nostro","novanta","nove","nulla","nuovi","nuovo","o","od","oggi","ogni","ognuna","ognuno","oltre","oppure","ora","ore","osi","ossia","ottanta","otto","paese","parecchi","parecchie","parecchio","parte","partendo","peccato","peggio","per","perche","perchè","perché","percio","perciò","perfino","pero","persino","persone","però","piedi","pieno","piglia","piu","piuttosto","più","po","pochissimo","poco","poi","poiche","possa","possedere","posteriore","posto","potrebbe","preferibilmente","presa","press","prima","primo","principalmente","probabilmente","promesso","proprio","puo","pure","purtroppo","può","qua","qualche","qualcosa","qualcuna","qualcuno","quale","quali","qualunque","quando","quanta","quante","quanti","quanto","quantunque","quarto","quasi","quattro","quel","quella","quelle","quelli","quello","quest","questa","queste","questi","questo","qui","quindi","quinto","realmente","recente","recentemente","registrazione","relativo","riecco","rispetto","salvo","sara","sarai","saranno","sarebbe","sarebbero","sarei","saremmo","saremo","sareste","saresti","sarete","sarà","sarò","scola","scopo","scorso","se","secondo","seguente","seguito","sei","sembra","sembrare","sembrato","sembrava","sembri","sempre","senza","sette","si","sia","siamo","siano","siate","siete","sig","solito","solo","soltanto","sono","sopra","soprattutto","sotto","spesso","sta","stai","stando","stanno","starai","staranno","starebbe","starebbero","starei","staremmo","staremo","stareste","staresti","starete","starà","starò","stata","state","stati","stato","stava","stavamo","stavano","stavate","stavi","stavo","stemmo","stessa","stesse","stessero","stessi","stessimo","stesso","steste","stesti","stette","stettero","stetti","stia","stiamo","stiano","stiate","sto","su","sua","subito","successivamente","successivo","sue","sugl","sugli","sui","sul","sull","sulla","sulle","sullo","suo","suoi","tale","tali","talvolta","tanto","te","tempo","terzo","th","ti","titolo","tra","tranne","tre","trenta","triplo","troppo","trovato","tu","tua","tue","tuo","tuoi","tutta","tuttavia","tutte","tutti","tutto","uguali","ulteriore","ultimo","un","una","uno","uomo","va","vai","vale","vari","varia","varie","vario","verso","vi","vicino","visto","vita","voi","volta","volte","vostra","vostre","vostri","vostro","è"],"ja":["あそこ","あっ","あの","あのかた","あの人","あり","あります","ある","あれ","い","いう","います","いる","う","うち","え","お","および","おり","おります","か","かつて","から","が","き","ここ","こちら","こと","この","これ","これら","さ","さらに","し","しかし","する","ず","せ","せる","そこ","そして","その","その他","その後","それ","それぞれ","それで","た","ただし","たち","ため","たり","だ","だっ","だれ","つ","て","で","でき","できる","です","では","でも","と","という","といった","とき","ところ","として","とともに","とも","と共に","どこ","どの","な","ない","なお","なかっ","ながら","なく","なっ","など","なに","なら","なり","なる","なん","に","において","における","について","にて","によって","により","による","に対して","に対する","に関する","の","ので","のみ","は","ば","へ","ほか","ほとんど","ほど","ます","また","または","まで","も","もの","ものの","や","よう","より","ら","られ","られる","れ","れる","を","ん","何","及び","彼","彼女","我々","特に","私","私達","貴方","貴方方"],"ko":["!","\"","$","%","&","'","(",")","*","+",",","-",".","...","0","1","2","3","4","5","6","7","8","9",";","<","=",">","?","@","\\","^","_","`","|","~","·","—","——","‘","’","“","”","…","、","。","〈","〉","《","》","가","가까스로","가령","각","각각","각자","각종","갖고말하자면","같다","같이","개의치않고","거니와","거바","거의","것","것과 같이","것들","게다가","게우다","겨우","견지에서","결과에 이르다","결국","결론을 낼 수 있다","겸사겸사","고려하면","고로","곧","공동으로","과","과연","관계가 있다","관계없이","관련이 있다","관하여","관한","관해서는","구","구체적으로","구토하다","그","그들","그때","그래","그래도","그래서","그러나","그러니","그러니까","그러면","그러므로","그러한즉","그런 까닭에","그런데","그런즉","그럼","그럼에도 불구하고","그렇게 함으로써","그렇지","그렇지 않다면","그렇지 않으면","그렇지만","그렇지않으면","그리고","그리하여","그만이다","그에 따르는","그위에","그저","그중에서","그치지 않다","근거로","근거하여","기대여","기점으로","기준으로","기타","까닭으로","까악","까지","까지 미치다","까지도","꽈당","끙끙","끼익","나","나머지는","남들","남짓","너","너희","너희들","네","넷","년","논하지 않다","놀라다","누가 알겠는가","누구","다른","다른 방면으로","다만","다섯","다소","다수","다시 말하자면","다시말하면","다음","다음에","다음으로","단지","답다","당신","당장","대로 하다","대하면","대하여","대해 말하자면","대해서","댕그","더구나","더군다나","더라도","더불어","더욱더","더욱이는","도달하다","도착하다","동시에","동안","된바에야","된이상","두번째로","둘","둥둥","뒤따라","뒤이어","든간에","들","등","등등","딩동","따라","따라서","따위","따지지 않다","딱","때","때가 되어","때문에","또","또한","뚝뚝","라 해도","령","로","로 인하여","로부터","로써","륙","를","마음대로","마저","마저도","마치","막론하고","만 못하다","만약","만약에","만은 아니다","만이 아니다","만일","만큼","말하자면","말할것도 없고","매","매번","메쓰겁다","몇","모","모두","무렵","무릎쓰고","무슨","무엇","무엇때문에","물론","및","바꾸어말하면","바꾸어말하자면","바꾸어서 말하면","바꾸어서 한다면","바꿔 말하면","바로","바와같이","밖에 안된다","반대로","반대로 말하자면","반드시","버금","보는데서","보다더","보드득","본대로","봐","봐라","부류의 사람들","부터","불구하고","불문하고","붕붕","비걱거리다","비교적","비길수 없다","비로소","비록","비슷하다","비추어 보아","비하면","뿐만 아니라","뿐만아니라","뿐이다","삐걱","삐걱거리다","사","삼","상대적으로 말하자면","생각한대로","설령","설마","설사","셋","소생","소인","솨","쉿","습니까","습니다","시각","시간","시작하여","시초에","시키다","실로","심지어","아","아니","아니나다를가","아니라면","아니면","아니었다면","아래윗","아무거나","아무도","아야","아울러","아이","아이고","아이구","아이야","아이쿠","아하","아홉","안 그러면","않기 위하여","않기 위해서","알 수 있다","알았어","앗","앞에서","앞의것","야","약간","양자","어","어기여차","어느","어느 년도","어느것","어느곳","어느때","어느쪽","어느해","어디","어때","어떠한","어떤","어떤것","어떤것들","어떻게","어떻해","어이","어째서","어쨋든","어쩔수 없다","어찌","어찌됏든","어찌됏어","어찌하든지","어찌하여","언제","언젠가","얼마","얼마 안 되는 것","얼마간","얼마나","얼마든지","얼마만큼","얼마큼","엉엉","에","에 가서","에 달려 있다","에 대해","에 있다","에 한하다","에게","에서","여","여기","여덟","여러분","여보시오","여부","여섯","여전히","여차","연관되다","연이서","영","영차","옆사람","예","예를 들면","예를 들자면","예컨대","예하면","오","오로지","오르다","오자마자","오직","오호","오히려","와","와 같은 사람들","와르르","와아","왜","왜냐하면","외에도","요만큼","요만한 것","요만한걸","요컨대","우르르","우리","우리들","우선","우에 종합한것과같이","운운","월","위에서 서술한바와같이","위하여","위해서","윙윙","육","으로","으로 인하여","으로서","으로써","을","응","응당","의","의거하여","의지하여","의해","의해되다","의해서","이","이 되다","이 때문에","이 밖에","이 외에","이 정도의","이것","이곳","이때","이라면","이래","이러이러하다","이러한","이런","이럴정도로","이렇게 많은 것","이렇게되면","이렇게말하자면","이렇구나","이로 인하여","이르기까지","이리하여","이만큼","이번","이봐","이상","이어서","이었다","이와 같다","이와 같은","이와 반대로","이와같다면","이외에도","이용하여","이유만으로","이젠","이지만","이쪽","이천구","이천육","이천칠","이천팔","인 듯하다","인젠","일","일것이다","일곱","일단","일때","일반적으로","일지라도","임에 틀림없다","입각하여","입장에서","잇따라","있다","자","자기","자기집","자마자","자신","잠깐","잠시","저","저것","저것만큼","저기","저쪽","저희","전부","전자","전후","점에서 보아","정도에 이르다","제","제각기","제외하고","조금","조차","조차도","졸졸","좀","좋아","좍좍","주룩주룩","주저하지 않고","줄은 몰랏다","줄은모른다","중에서","중의하나","즈음하여","즉","즉시","지든지","지만","지말고","진짜로","쪽으로","차라리","참","참나","첫번째로","쳇","총적으로","총적으로 말하면","총적으로 보면","칠","콸콸","쾅쾅","쿵","타다","타인","탕탕","토하다","통하여","툭","퉤","틈타","팍","팔","퍽","펄렁","하","하게될것이다","하게하다","하겠는가","하고 있다","하고있었다","하곤하였다","하구나","하기 때문에","하기 위하여","하기는한데","하기만 하면","하기보다는","하기에","하나","하느니","하는 김에","하는 편이 낫다","하는것도","하는것만 못하다","하는것이 낫다","하는바","하더라도","하도다","하도록시키다","하도록하다","하든지","하려고하다","하마터면","하면 할수록","하면된다","하면서","하물며","하여금","하여야","하자마자","하지 않는다면","하지 않도록","하지마","하지마라","하지만","하하","한 까닭에","한 이유는","한 후","한다면","한다면 몰라도","한데","한마디","한적이있다","한켠으로는","한항목","할 따름이다","할 생각이다","할 줄 안다","할 지경이다","할 힘이 있다","할때","할만하다","할망정","할뿐","할수있다","할수있어","할줄알다","할지라도","할지언정","함께","해도된다","해도좋다","해봐요","해서는 안된다","해야한다","해요","했어요","향하다","향하여","향해서","허","허걱","허허","헉","헉헉","헐떡헐떡","형식으로 쓰여","혹시","혹은","혼자","훨씬","휘익","휴","흐흐","흥","힘입어","︿","!","#","$","%","&","(",")","*","+",",","0","1","2","3","4","5","6","7","8","9",":",";","<",">","?","@","[","]","{","|","}","~","¥"],"ku":["ئێمە","ئێوە","ئەم","ئەو","ئەوان","ئەوەی","بۆ","بێ","بێجگە","بە","بەبێ","بەدەم","بەردەم","بەرلە","بەرەوی","بەرەوە","بەلای","بەپێی","تۆ","تێ","جگە","دوای","دوو","دە","دەکات","دەگەڵ","سەر","لێ","لە","لەبابەت","لەباتی","لەبارەی","لەبرێتی","لەبن","لەبەر","لەبەینی","لەدەم","لەرێ","لەرێگا","لەرەوی","لەسەر","لەلایەن","لەناو","لەنێو","لەو","لەپێناوی","لەژێر","لەگەڵ","من","ناو","نێوان","هەر","هەروەها","و","وەک","پاش","پێ","پێش","چەند","کرد","کە","ی"],"la":["a","ab","ac","ad","at","atque","aut","autem","cum","de","dum","e","erant","erat","est","et","etiam","ex","haec","hic","hoc","in","ita","me","nec","neque","non","per","qua","quae","quam","qui","quibus","quidem","quo","quod","re","rebus","rem","res","sed","si","sic","sunt","tamen","tandem","te","ut","vel"],"lt":["abi","abidvi","abiejose","abiejuose","abiejø","abiem","abigaliai","abipus","abu","abudu","ai","ana","anaiptol","anaisiais","anajai","anajam","anajame","anapus","anas","anasai","anasis","anei","aniedvi","anieji","aniesiems","anoji","anojo","anojoje","anokia","anoks","anosiomis","anosioms","anosios","anosiose","anot","ant","antai","anuodu","anuoju","anuosiuose","anuosius","anàja","anàjà","anàjá","anàsias","anøjø","apie","aplink","ar","arba","argi","arti","aukðèiau","að","be","bei","beje","bemaþ","bent","bet","betgi","beveik","dar","dargi","daugmaþ","deja","dëka","dël","dëlei","dëlto","ech","et","gal","galbût","galgi","gan","gana","gi","greta","idant","iki","ir","irgi","it","itin","ið","iðilgai","iðvis","jaisiais","jajai","jajam","jajame","jei","jeigu","ji","jiedu","jiedvi","jieji","jiesiems","jinai","jis","jisai","jog","joji","jojo","jojoje","jokia","joks","josiomis","josioms","josios","josiose","judu","judvi","juk","jumis","jums","jumyse","juodu","juoju","juosiuose","juosius","jus","jàja","jàjà","jàsias","jájá","jøjø","jûs","jûsiðkis","jûsiðkë","jûsø","kad","kada","kadangi","kai","kaip","kaipgi","kas","katra","katras","katriedvi","katruodu","kaþin","kaþkas","kaþkatra","kaþkatras","kaþkokia","kaþkoks","kaþkuri","kaþkuris","kiaurai","kiek","kiekvienas","kieno","kita","kitas","kitokia","kitoks","kodël","kokia","koks","kol","kolei","kone","kuomet","kur","kurgi","kuri","kuriedvi","kuris","kuriuodu","lai","lig","ligi","link","lyg","man","manaisiais","manajai","manajam","manajame","manas","manasai","manasis","mane","manieji","maniesiems","manim","manimi","maniðkis","maniðkë","mano","manoji","manojo","manojoje","manosiomis","manosioms","manosios","manosiose","manuoju","manuosiuose","manuosius","manyje","manàja","manàjà","manàjá","manàsias","manæs","manøjø","mat","maþdaug","maþne","mes","mudu","mudvi","mumis","mums","mumyse","mus","mûsiðkis","mûsiðkë","mûsø","na","nagi","ne","nebe","nebent","negi","negu","nei","nejau","nejaugi","nekaip","nelyginant","nes","net","netgi","netoli","neva","nors","nuo","në","o","ogi","oi","paeiliui","pagal","pakeliui","palaipsniui","palei","pas","pasak","paskos","paskui","paskum","pat","pati","patiems","paties","pats","patys","patá","paèiais","paèiam","paèiame","paèiu","paèiuose","paèius","paèiø","per","pernelyg","pirm","pirma","pirmiau","po","prie","prieð","prieðais","pro","pusiau","rasi","rodos","sau","savaisiais","savajai","savajam","savajame","savas","savasai","savasis","save","savieji","saviesiems","savimi","saviðkis","saviðkë","savo","savoji","savojo","savojoje","savosiomis","savosioms","savosios","savosiose","savuoju","savuosiuose","savuosius","savyje","savàja","savàjà","savàjá","savàsias","savæs","savøjø","skersai","skradþiai","staèiai","su","sulig","ta","tad","tai","taigi","taip","taipogi","taisiais","tajai","tajam","tajame","tamsta","tarp","tarsi","tartum","tarytum","tas","tasai","tau","tavaisiais","tavajai","tavajam","tavajame","tavas","tavasai","tavasis","tave","tavieji","taviesiems","tavimi","taviðkis","taviðkë","tavo","tavoji","tavojo","tavojoje","tavosiomis","tavosioms","tavosios","tavosiose","tavuoju","tavuosiuose","tavuosius","tavyje","tavàja","tavàjà","tavàjá","tavàsias","tavæs","tavøjø","taèiau","te","tegu","tegul","tiedvi","tieji","ties","tiesiems","tiesiog","tik","tikriausiai","tiktai","toji","tojo","tojoje","tokia","toks","tol","tolei","toliau","tosiomis","tosioms","tosios","tosiose","tu","tuodu","tuoju","tuosiuose","tuosius","turbût","tàja","tàjà","tàjá","tàsias","tøjø","tûlas","uþ","uþtat","uþvis","va","vai","viduj","vidury","vien","vienas","vienokia","vienoks","vietoj","virð","virðuj","virðum","vis","vis dëlto","visa","visas","visgi","visokia","visoks","vos","vël","vëlgi","ypaè","á","ákypai","ástriþai","ðalia","ðe","ði","ðiaisiais","ðiajai","ðiajam","ðiajame","ðiapus","ðiedvi","ðieji","ðiesiems","ðioji","ðiojo","ðiojoje","ðiokia","ðioks","ðiosiomis","ðiosioms","ðiosios","ðiosiose","ðis","ðisai","ðit","ðita","ðitas","ðitiedvi","ðitokia","ðitoks","ðituodu","ðiuodu","ðiuoju","ðiuosiuose","ðiuosius","ðiàja","ðiàjà","ðiàsias","ðiøjø","ðtai","ðájá","þemiau"],"lv":["aiz","ap","apakš","apakšpus","ar","arī","augšpus","bet","bez","bija","biji","biju","bijām","bijāt","būs","būsi","būsiet","būsim","būt","būšu","caur","diemžēl","diezin","droši","dēļ","esam","esat","esi","esmu","gan","gar","iekam","iekams","iekām","iekāms","iekš","iekšpus","ik","ir","it","itin","iz","ja","jau","jeb","jebšu","jel","jo","jā","ka","kamēr","kaut","kolīdz","kopš","kā","kļuva","kļuvi","kļuvu","kļuvām","kļuvāt","kļūs","kļūsi","kļūsiet","kļūsim","kļūst","kļūstam","kļūstat","kļūsti","kļūstu","kļūt","kļūšu","labad","lai","lejpus","līdz","līdzko","ne","nebūt","nedz","nekā","nevis","nezin","no","nu","nē","otrpus","pa","par","pat","pie","pirms","pret","priekš","pār","pēc","starp","tad","tak","tapi","taps","tapsi","tapsiet","tapsim","tapt","tapāt","tapšu","taču","te","tiec","tiek","tiekam","tiekat","tieku","tik","tika","tikai","tiki","tikko","tiklab","tiklīdz","tiks","tiksiet","tiksim","tikt","tiku","tikvien","tikām","tikāt","tikšu","tomēr","topat","turpretim","turpretī","tā","tādēļ","tālab","tāpēc","un","uz","vai","var","varat","varēja","varēji","varēju","varējām","varējāt","varēs","varēsi","varēsiet","varēsim","varēt","varēšu","vien","virs","virspus","vis","viņpus","zem","ārpus","šaipus"],"ms":["abdul","abdullah","acara","ada","adalah","ahmad","air","akan","akhbar","akhir","aktiviti","alam","amat","amerika","anak","anggota","antara","antarabangsa","apa","apabila","april","as","asas","asean","asia","asing","atas","atau","australia","awal","awam","bagaimanapun","bagi","bahagian","bahan","baharu","bahawa","baik","bandar","bank","banyak","barangan","baru","baru-baru","bawah","beberapa","bekas","beliau","belum","berada","berakhir","berbanding","berdasarkan","berharap","berikutan","berjaya","berjumlah","berkaitan","berkata","berkenaan","berlaku","bermula","bernama","bernilai","bersama","berubah","besar","bhd","bidang","bilion","bn","boleh","bukan","bulan","bursa","cadangan","china","dagangan","dalam","dan","dana","dapat","dari","daripada","dasar","datang","datuk","demikian","dengan","depan","derivatives","dewan","di","diadakan","dibuka","dicatatkan","dijangka","diniagakan","dis","disember","ditutup","dolar","dr","dua","dunia","ekonomi","eksekutif","eksport","empat","enam","faedah","feb","global","hadapan","hanya","harga","hari","hasil","hingga","hubungan","ia","iaitu","ialah","indeks","india","indonesia","industri","ini","islam","isnin","isu","itu","jabatan","jalan","jan","jawatan","jawatankuasa","jepun","jika","jualan","juga","julai","jumaat","jumlah","jun","juta","kadar","kalangan","kali","kami","kata","katanya","kaunter","kawasan","ke","keadaan","kecil","kedua","kedua-dua","kedudukan","kekal","kementerian","kemudahan","kenaikan","kenyataan","kepada","kepentingan","keputusan","kerajaan","kerana","kereta","kerja","kerjasama","kes","keselamatan","keseluruhan","kesihatan","ketika","ketua","keuntungan","kewangan","khamis","kini","kira-kira","kita","klci","klibor","komposit","kontrak","kos","kuala","kuasa","kukuh","kumpulan","lagi","lain","langkah","laporan","lebih","lepas","lima","lot","luar","lumpur","mac","mahkamah","mahu","majlis","makanan","maklumat","malam","malaysia","mana","manakala","masa","masalah","masih","masing-masing","masyarakat","mata","media","mei","melalui","melihat","memandangkan","memastikan","membantu","membawa","memberi","memberikan","membolehkan","membuat","mempunyai","menambah","menarik","menawarkan","mencapai","mencatatkan","mendapat","mendapatkan","menerima","menerusi","mengadakan","mengambil","mengenai","menggalakkan","menggunakan","mengikut","mengumumkan","mengurangkan","meningkat","meningkatkan","menjadi","menjelang","menokok","menteri","menunjukkan","menurut","menyaksikan","menyediakan","mereka","merosot","merupakan","mesyuarat","minat","minggu","minyak","modal","mohd","mudah","mungkin","naik","najib","nasional","negara","negara-negara","negeri","niaga","nilai","nov","ogos","okt","oleh","operasi","orang","pada","pagi","paling","pameran","papan","para","paras","parlimen","parti","pasaran","pasukan","pegawai","pejabat","pekerja","pelabur","pelaburan","pelancongan","pelanggan","pelbagai","peluang","pembangunan","pemberita","pembinaan","pemimpin","pendapatan","pendidikan","penduduk","penerbangan","pengarah","pengeluaran","pengerusi","pengguna","pengurusan","peniaga","peningkatan","penting","peratus","perdagangan","perdana","peringkat","perjanjian","perkara","perkhidmatan","perladangan","perlu","permintaan","perniagaan","persekutuan","persidangan","pertama","pertubuhan","pertumbuhan","perusahaan","peserta","petang","pihak","pilihan","pinjaman","polis","politik","presiden","prestasi","produk","program","projek","proses","proton","pukul","pula","pusat","rabu","rakan","rakyat","ramai","rantau","raya","rendah","ringgit","rumah","sabah","sahaja","saham","sama","sarawak","satu","sawit","saya","sdn","sebagai","sebahagian","sebanyak","sebarang","sebelum","sebelumnya","sebuah","secara","sedang","segi","sehingga","sejak","sekarang","sektor","sekuriti","selain","selama","selasa","selatan","selepas","seluruh","semakin","semalam","semasa","sementara","semua","semula","sen","sendiri","seorang","sepanjang","seperti","sept","september","serantau","seri","serta","sesi","setiap","setiausaha","sidang","singapura","sini","sistem","sokongan","sri","sudah","sukan","suku","sumber","supaya","susut","syarikat","syed","tahap","tahun","tan","tanah","tanpa","tawaran","teknologi","telah","tempat","tempatan","tempoh","tenaga","tengah","tentang","terbaik","terbang","terbesar","terbuka","terdapat","terhadap","termasuk","tersebut","terus","tetapi","thailand","tiada","tidak","tiga","timbalan","timur","tindakan","tinggi","tun","tunai","turun","turut","umno","unit","untuk","untung","urus","usaha","utama","walaupun","wang","wanita","wilayah","yang"],"mr":["अधिक","अनेक","अशी","असलयाचे","असलेल्या","असा","असून","असे","आज","आणि","आता","आपल्या","आला","आली","आले","आहे","आहेत","एक","एका","कमी","करणयात","करून","का","काम","काय","काही","किवा","की","केला","केली","केले","कोटी","गेल्या","घेऊन","जात","झाला","झाली","झाले","झालेल्या","टा","डॉ","तर","तरी","तसेच","ता","ती","तीन","ते","तो","त्या","त्याचा","त्याची","त्याच्या","त्याना","त्यानी","त्यामुळे","त्री","दिली","दोन","न","नाही","निर्ण्य","पण","पम","परयतन","पाटील","म","मात्र","माहिती","मी","मुबी","म्हणजे","म्हणाले","म्हणून","या","याचा","याची","याच्या","याना","यानी","येणार","येत","येथील","येथे","लाख","व","व्यकत","सर्व","सागित्ले","सुरू","हजार","हा","ही","हे","होणार","होत","होता","होती","होते"],"no":["alle","andre","arbeid","at","av","bare","begge","ble","blei","bli","blir","blitt","bort","bra","bruke","både","båe","da","de","deg","dei","deim","deira","deires","dem","den","denne","der","dere","deres","det","dette","di","din","disse","ditt","du","dykk","dykkar","då","eg","ein","eit","eitt","eller","elles","en","ene","eneste","enhver","enn","er","et","ett","etter","folk","for","fordi","forsûke","fra","få","før","fûr","fûrst","gjorde","gjûre","god","gå","ha","hadde","han","hans","har","hennar","henne","hennes","her","hjå","ho","hoe","honom","hoss","hossen","hun","hva","hvem","hver","hvilke","hvilken","hvis","hvor","hvordan","hvorfor","i","ikke","ikkje","ingen","ingi","inkje","inn","innen","inni","ja","jeg","kan","kom","korleis","korso","kun","kunne","kva","kvar","kvarhelst","kven","kvi","kvifor","lage","lang","lik","like","makt","man","mange","me","med","medan","meg","meget","mellom","men","mens","mer","mest","mi","min","mine","mitt","mot","mye","mykje","må","måte","navn","ned","nei","no","noe","noen","noka","noko","nokon","nokor","nokre","ny","nå","når","og","også","om","opp","oss","over","part","punkt","på","rett","riktig","samme","sant","seg","selv","si","sia","sidan","siden","sin","sine","sist","sitt","sjøl","skal","skulle","slik","slutt","so","som","somme","somt","start","stille","så","sånn","tid","til","tilbake","tilstand","um","under","upp","ut","uten","var","vart","varte","ved","verdi","vere","verte","vi","vil","ville","vite","vore","vors","vort","vår","være","vært","vöre","vört","å"],"fa":["!",",",".",":",";","،","؛","؟","آباد","آره","آری","آمد","آمده","آن","آنان","آنجا","آنطور","آنقدر","آنكه","آنها","آنچه","آنکه","آورد","آورده","آيد","آی","آیا","آیند","اتفاقا","اثرِ","احتراما","احتمالا","اخیر","اری","از","ازجمله","اساسا","است","استفاد","استفاده","اش","اشکارا","اصلا","اصولا","اعلام","اغلب","اكنون","الان","البته","البتّه","ام","اما","امروز","امروزه","امسال","امشب","امور","ان","انجام","اند","انشاالله","انصافا","انطور","انقدر","انها","انچنان","انکه","انگار","او","اول","اولا","اي","ايشان","ايم","اين","اينكه","اکثرا","اکنون","اگر","ای","ایا","اید","ایشان","ایم","این","اینجا","ایند","اینطور","اینقدر","اینها","اینچنین","اینک","اینکه","اینگونه","با","بار","بارة","باره","بارها","باز","بازهم","باش","باشد","باشم","باشند","باشيم","باشی","باشید","باشیم","بالا","بالاخره","بالایِ","بالطبع","بايد","باید","بتوان","بتواند","بتوانی","بتوانیم","بخش","بخشی","بخواه","بخواهد","بخواهم","بخواهند","بخواهی","بخواهید","بخواهیم","بد","بدون","بر","برابر","برابرِ","براحتی","براساس","براستی","براي","برای","برایِ","برخوردار","برخي","برخی","برداري","برعکس","بروز","بزرگ","بزودی","بسا","بسيار","بسياري","بسیار","بسیاری","بطور","بعد","بعدا","بعدها","بعری","بعضا","بعضي","بلافاصله","بلكه","بله","بلکه","بلی","بنابراين","بنابراین","بندي","به","بهتر","بهترين","بود","بودم","بودن","بودند","بوده","بودی","بودید","بودیم","بویژه","بي","بيست","بيش","بيشتر","بيشتري","بين","بکن","بکند","بکنم","بکنند","بکنی","بکنید","بکنیم","بگو","بگوید","بگویم","بگویند","بگویی","بگویید","بگوییم","بگیر","بگیرد","بگیرم","بگیرند","بگیری","بگیرید","بگیریم","بی","بیا","بیاب","بیابد","بیابم","بیابند","بیابی","بیابید","بیابیم","بیاور","بیاورد","بیاورم","بیاورند","بیاوری","بیاورید","بیاوریم","بیاید","بیایم","بیایند","بیایی","بیایید","بیاییم","بیرون","بیرونِ","بیش","بیشتر","بیشتری","بین","ت","تا","تازه","تاكنون","تان","تاکنون","تحت","تر","تر براساس","ترين","تقریبا","تلویحا","تمام","تماما","تمامي","تنها","تو","تواند","توانست","توانستم","توانستن","توانستند","توانسته","توانستی","توانستیم","توانم","توانند","توانی","توانید","توانیم","توسط","تولِ","تویِ","ثانیا","جا","جاي","جايي","جای","جدا","جديد","جدید","جريان","جریان","جز","جلوگيري","جلویِ","جمعا","جناح","جهت","حاضر","حال","حالا","حتما","حتي","حتی","حداکثر","حدودا","حدودِ","حق","خارجِ","خب","خدمات","خصوصا","خلاصه","خواست","خواستم","خواستن","خواستند","خواسته","خواستی","خواستید","خواستیم","خواهد","خواهم","خواهند","خواهيم","خواهی","خواهید","خواهیم","خوب","خود","خودت","خودتان","خودش","خودشان","خودم","خودمان","خوشبختانه","خويش","خویش","خویشتن","خیاه","خیر","خیلی","داد","دادم","دادن","دادند","داده","دادی","دادید","دادیم","دار","دارد","دارم","دارند","داريم","داری","دارید","داریم","داشت","داشتم","داشتن","داشتند","داشته","داشتی","داشتید","داشتیم","دانست","دانند","دایم","دایما","در","درباره","درمجموع","درون","دریغ","دقیقا","دنبالِ","ده","دهد","دهم","دهند","دهی","دهید","دهیم","دو","دوباره","دوم","ديده","ديروز","ديگر","ديگران","ديگري","دیر","دیروز","دیگر","دیگران","دیگری","را","راحت","راسا","راستی","راه","رسما","رسید","رفت","رفته","رو","روب","روز","روزانه","روزهاي","روي","روی","رویِ","ريزي","زمان","زمانی","زمینه","زود","زياد","زير","زيرا","زیر","زیرِ","سابق","ساخته","سازي","سالانه","سالیانه","سایر","سراسر","سرانجام","سریعا","سریِ","سعي","سمتِ","سوم","سوي","سوی","سویِ","سپس","شان","شايد","شاید","شخصا","شد","شدم","شدن","شدند","شده","شدی","شدید","شدیدا","شدیم","شش","شش نداشته","شما","شناسي","شود","شوم","شوند","شونده","شوی","شوید","شویم","صرفا","صورت","ضدِّ","ضدِّ","ضمن","طبعا","طبقِ","طبیعتا","طرف","طريق","طریق","طور","طي","طی","ظاهرا","عدم","عقبِ","علّتِ","علیه","عمدا","عمدتا","عمل","عملا","عنوان","عنوانِ","غالبا","غير","غیر","فردا","فعلا","فقط","فكر","فوق","قابل","قبل","قبلا","قدری","قصدِ","قطعا","كرد","كردم","كردن","كردند","كرده","كسي","كل","كمتر","كند","كنم","كنند","كنيد","كنيم","كه","لااقل","لطفا","لطفاً","ما","مان","مانند","مانندِ","مبادا","متاسفانه","متعاقبا","مثل","مثلا","مثلِ","مجانی","مجددا","مجموعا","مختلف","مدام","مدت","مدّتی","مردم","مرسی","مستقیما","مسلما","مطمینا","معمولا","مقابل","ممکن","من","موارد","مورد","موقتا","مي","ميليارد","ميليون","مگر","می","می شود","میان","می‌رسد","می‌رود","می‌شود","می‌کنیم","ناشي","نام","ناگاه","ناگهان","ناگهانی","نبايد","نباید","نبود","نخست","نخستين","نخواهد","نخواهم","نخواهند","نخواهی","نخواهید","نخواهیم","ندارد","ندارم","ندارند","نداری","ندارید","نداریم","نداشت","نداشتم","نداشتند","نداشته","نداشتی","نداشتید","نداشتیم","نزديك","نزدِ","نزدیکِ","نسبتا","نشان","نشده","نظير","نظیر","نكرده","نمايد","نمي","نمی","نمی‌شود","نه","نهایتا","نوع","نوعي","نوعی","نيز","نيست","نگاه","نیز","نیست","ها","هاي","هايي","های","هایی","هبچ","هر","هرچه","هرگز","هزار","هست","هستم","هستند","هستيم","هستی","هستید","هستیم","هفت","هم","همان","همه","همواره","همين","همچنان","همچنين","همچنین","همچون","همیشه","همین","هنوز","هنگام","هنگامِ","هنگامی","هيچ","هیچ","هیچگاه","و","واقعا","واقعی","وجود","وسطِ","وضع","وقتي","وقتی","وقتیکه","ولی","وي","وگو","وی","ویژه","يا","يابد","يك","يكديگر","يكي","ّه","٪","پارسال","پاعینِ","پس","پنج","پيش","پیدا","پیش","پیشاپیش","پیشتر","پیشِ","چرا","چطور","چقدر","چنان","چنانچه","چنانکه","چند","چندین","چنين","چنین","چه","چهار","چو","چون","چيزي","چگونه","چیز","چیزی","چیست","کاش","کامل","کاملا","کتبا","کجا","کجاست","کدام","کرد","کردم","کردن","کردند","کرده","کردی","کردید","کردیم","کس","کسانی","کسی","کل","کلا","کم","کماکان","کمتر","کمتری","کمی","کن","کنار","کنارِ","کند","کنم","کنند","کننده","کنون","کنونی","کنی","کنید","کنیم","که","کو","کَی","کی","گاه","گاهی","گذاري","گذاشته","گذشته","گردد","گرفت","گرفتم","گرفتن","گرفتند","گرفته","گرفتی","گرفتید","گرفتیم","گروهي","گفت","گفتم","گفتن","گفتند","گفته","گفتی","گفتید","گفتیم","گه","گهگاه","گو","گويد","گويند","گویا","گوید","گویم","گویند","گویی","گویید","گوییم","گيرد","گيري","گیرد","گیرم","گیرند","گیری","گیرید","گیریم","ی","یا","یابد","یابم","یابند","یابی","یابید","یابیم","یافت","یافتم","یافتن","یافته","یافتی","یافتید","یافتیم","یعنی","یقینا","یه","یک","یکی","۰","۱","۲","۳","۴","۵","۶","۷","۸","۹"],"pl":["a","aby","ach","acz","aczkolwiek","aj","albo","ale","ależ","ani","aż","bardziej","bardzo","bez","bo","bowiem","by","byli","bym","bynajmniej","być","był","była","było","były","będzie","będą","cali","cała","cały","chce","choć","ci","ciebie","cię","co","cokolwiek","coraz","coś","czasami","czasem","czemu","czy","czyli","często","daleko","dla","dlaczego","dlatego","do","dobrze","dokąd","dość","dr","dużo","dwa","dwaj","dwie","dwoje","dzisiaj","dziś","gdy","gdyby","gdyż","gdzie","gdziekolwiek","gdzieś","go","godz","hab","i","ich","ii","iii","ile","im","inna","inne","inny","innych","inż","iv","ix","iż","ja","jak","jakaś","jakby","jaki","jakichś","jakie","jakiś","jakiż","jakkolwiek","jako","jakoś","je","jeden","jedna","jednak","jednakże","jedno","jednym","jedynie","jego","jej","jemu","jest","jestem","jeszcze","jeśli","jeżeli","już","ją","każdy","kiedy","kierunku","kilka","kilku","kimś","kto","ktokolwiek","ktoś","która","które","którego","której","który","których","którym","którzy","ku","lat","lecz","lub","ma","mają","mam","mamy","mało","mgr","mi","miał","mimo","między","mnie","mną","mogą","moi","moim","moja","moje","może","możliwe","można","mu","musi","my","mój","na","nad","nam","nami","nas","nasi","nasz","nasza","nasze","naszego","naszych","natomiast","natychmiast","nawet","nic","nich","nie","niech","niego","niej","niemu","nigdy","nim","nimi","nią","niż","no","nowe","np","nr","o","o.o.","obok","od","ok","około","on","ona","one","oni","ono","oraz","oto","owszem","pan","pana","pani","pl","po","pod","podczas","pomimo","ponad","ponieważ","powinien","powinna","powinni","powinno","poza","prawie","prof","przecież","przed","przede","przedtem","przez","przy","raz","razie","roku","również","sam","sama","się","skąd","sobie","sobą","sposób","swoje","są","ta","tak","taka","taki","takich","takie","także","tam","te","tego","tej","tel","temu","ten","teraz","też","to","tobie","tobą","toteż","totobą","trzeba","tu","tutaj","twoi","twoim","twoja","twoje","twym","twój","ty","tych","tylko","tym","tys","tzw","tę","u","ul","vi","vii","viii","vol","w","wam","wami","was","wasi","wasz","wasza","wasze","we","według","wie","wiele","wielu","więc","więcej","wszyscy","wszystkich","wszystkie","wszystkim","wszystko","wtedy","www","wy","właśnie","wśród","xi","xii","xiii","xiv","xv","z","za","zapewne","zawsze","zaś","ze","zeznowu","znowu","znów","został","zł","żaden","żadna","żadne","żadnych","że","żeby"],"pt":["a","acerca","adeus","agora","ainda","alem","algmas","algo","algumas","alguns","ali","além","ambas","ambos","ano","anos","antes","ao","aonde","aos","apenas","apoio","apontar","apos","após","aquela","aquelas","aquele","aqueles","aqui","aquilo","as","assim","através","atrás","até","aí","baixo","bastante","bem","boa","boas","bom","bons","breve","cada","caminho","catorze","cedo","cento","certamente","certeza","cima","cinco","coisa","com","como","comprido","conhecido","conselho","contra","contudo","corrente","cuja","cujas","cujo","cujos","custa","cá","da","daquela","daquelas","daquele","daqueles","dar","das","de","debaixo","dela","delas","dele","deles","demais","dentro","depois","desde","desligado","dessa","dessas","desse","desses","desta","destas","deste","destes","deve","devem","deverá","dez","dezanove","dezasseis","dezassete","dezoito","dia","diante","direita","dispoe","dispoem","diversa","diversas","diversos","diz","dizem","dizer","do","dois","dos","doze","duas","durante","dá","dão","dúvida","e","ela","elas","ele","eles","em","embora","enquanto","entao","entre","então","era","eram","essa","essas","esse","esses","esta","estado","estamos","estar","estará","estas","estava","estavam","este","esteja","estejam","estejamos","estes","esteve","estive","estivemos","estiver","estivera","estiveram","estiverem","estivermos","estivesse","estivessem","estiveste","estivestes","estivéramos","estivéssemos","estou","está","estás","estávamos","estão","eu","exemplo","falta","fará","favor","faz","fazeis","fazem","fazemos","fazer","fazes","fazia","faço","fez","fim","final","foi","fomos","for","fora","foram","forem","forma","formos","fosse","fossem","foste","fostes","fui","fôramos","fôssemos","geral","grande","grandes","grupo","ha","haja","hajam","hajamos","havemos","havia","hei","hoje","hora","horas","houve","houvemos","houver","houvera","houveram","houverei","houverem","houveremos","houveria","houveriam","houvermos","houverá","houverão","houveríamos","houvesse","houvessem","houvéramos","houvéssemos","há","hão","iniciar","inicio","ir","irá","isso","ista","iste","isto","já","lado","lhe","lhes","ligado","local","logo","longe","lugar","lá","maior","maioria","maiorias","mais","mal","mas","me","mediante","meio","menor","menos","meses","mesma","mesmas","mesmo","mesmos","meu","meus","mil","minha","minhas","momento","muito","muitos","máximo","mês","na","nada","nao","naquela","naquelas","naquele","naqueles","nas","nem","nenhuma","nessa","nessas","nesse","nesses","nesta","nestas","neste","nestes","no","noite","nome","nos","nossa","nossas","nosso","nossos","nova","novas","nove","novo","novos","num","numa","numas","nunca","nuns","não","nível","nós","número","o","obra","obrigada","obrigado","oitava","oitavo","oito","onde","ontem","onze","os","ou","outra","outras","outro","outros","para","parece","parte","partir","paucas","pegar","pela","pelas","pelo","pelos","perante","perto","pessoas","pode","podem","poder","poderá","podia","pois","ponto","pontos","por","porque","porquê","portanto","posição","possivelmente","posso","possível","pouca","pouco","poucos","povo","primeira","primeiras","primeiro","primeiros","promeiro","propios","proprio","própria","próprias","próprio","próprios","próxima","próximas","próximo","próximos","puderam","pôde","põe","põem","quais","qual","qualquer","quando","quanto","quarta","quarto","quatro","que","quem","quer","quereis","querem","queremas","queres","quero","questão","quieto","quinta","quinto","quinze","quáis","quê","relação","sabe","sabem","saber","se","segunda","segundo","sei","seis","seja","sejam","sejamos","sem","sempre","sendo","ser","serei","seremos","seria","seriam","será","serão","seríamos","sete","seu","seus","sexta","sexto","sim","sistema","sob","sobre","sois","somente","somos","sou","sua","suas","são","sétima","sétimo","só","tal","talvez","tambem","também","tanta","tantas","tanto","tarde","te","tem","temos","tempo","tendes","tenha","tenham","tenhamos","tenho","tens","tentar","tentaram","tente","tentei","ter","terceira","terceiro","terei","teremos","teria","teriam","terá","terão","teríamos","teu","teus","teve","tinha","tinham","tipo","tive","tivemos","tiver","tivera","tiveram","tiverem","tivermos","tivesse","tivessem","tiveste","tivestes","tivéramos","tivéssemos","toda","todas","todo","todos","trabalhar","trabalho","treze","três","tu","tua","tuas","tudo","tão","tém","têm","tínhamos","um","uma","umas","uns","usa","usar","vai","vais","valor","veja","vem","vens","ver","verdade","verdadeiro","vez","vezes","viagem","vindo","vinte","você","vocês","vos","vossa","vossas","vosso","vossos","vários","vão","vêm","vós","zero","à","às","área","é","éramos","és","último"],"ro":["a","abia","acea","aceasta","această","aceea","aceeasi","acei","aceia","acel","acela","acelasi","acele","acelea","acest","acesta","aceste","acestea","acestei","acestia","acestui","aceşti","aceştia","acolo","acord","acum","adica","ai","aia","aibă","aici","aiurea","al","ala","alaturi","ale","alea","alt","alta","altceva","altcineva","alte","altfel","alti","altii","altul","am","anume","apoi","ar","are","as","asa","asemenea","asta","astazi","astea","astfel","astăzi","asupra","atare","atat","atata","atatea","atatia","ati","atit","atita","atitea","atitia","atunci","au","avea","avem","aveţi","avut","azi","aş","aşadar","aţi","b","ba","bine","bucur","bună","c","ca","cam","cand","capat","care","careia","carora","caruia","cat","catre","caut","ce","cea","ceea","cei","ceilalti","cel","cele","celor","ceva","chiar","ci","cinci","cind","cine","cineva","cit","cita","cite","citeva","citi","citiva","conform","contra","cu","cui","cum","cumva","curând","curînd","când","cât","câte","câtva","câţi","cînd","cît","cîte","cîtva","cîţi","că","căci","cărei","căror","cărui","către","d","da","daca","dacă","dar","dat","datorită","dată","dau","de","deasupra","deci","decit","degraba","deja","deoarece","departe","desi","despre","deşi","din","dinaintea","dintr","dintr-","dintre","doar","doi","doilea","două","drept","dupa","după","dă","e","ea","ei","el","ele","era","eram","este","eu","exact","eşti","f","face","fara","fata","fel","fi","fie","fiecare","fii","fim","fiu","fiţi","foarte","fost","frumos","fără","g","geaba","graţie","h","halbă","i","ia","iar","ieri","ii","il","imi","in","inainte","inapoi","inca","incit","insa","intr","intre","isi","iti","j","k","l","la","le","li","lor","lui","lângă","lîngă","m","ma","mai","mare","mea","mei","mele","mereu","meu","mi","mie","mine","mod","mult","multa","multe","multi","multă","mulţi","mulţumesc","mâine","mîine","mă","n","ne","nevoie","ni","nici","niciodata","nicăieri","nimeni","nimeri","nimic","niste","nişte","noastre","noastră","noi","noroc","nostri","nostru","nou","noua","nouă","noştri","nu","numai","o","opt","or","ori","oricare","orice","oricine","oricum","oricând","oricât","oricînd","oricît","oriunde","p","pai","parca","patra","patru","patrulea","pe","pentru","peste","pic","pina","plus","poate","pot","prea","prima","primul","prin","printr-","putini","puţin","puţina","puţină","până","pînă","r","rog","s","sa","sa-mi","sa-ti","sai","sale","sau","se","si","sint","sintem","spate","spre","sub","sunt","suntem","sunteţi","sus","sută","sînt","sîntem","sînteţi","să","săi","său","t","ta","tale","te","ti","timp","tine","toata","toate","toată","tocmai","tot","toti","totul","totusi","totuşi","toţi","trei","treia","treilea","tu","tuturor","tăi","tău","u","ul","ului","un","una","unde","undeva","unei","uneia","unele","uneori","unii","unor","unora","unu","unui","unuia","unul","v","va","vi","voastre","voastră","voi","vom","vor","vostru","vouă","voştri","vreme","vreo","vreun","vă","x","z","zece","zero","zi","zice","îi","îl","îmi","împotriva","în","înainte","înaintea","încotro","încât","încît","între","întrucât","întrucît","îţi","ăla","ălea","ăsta","ăstea","ăştia","şapte","şase","şi","ştiu","ţi","ţie"],"ru":["c","а","алло","без","белый","близко","более","больше","большой","будем","будет","будете","будешь","будто","буду","будут","будь","бы","бывает","бывь","был","была","были","было","быть","в","важная","важное","важные","важный","вам","вами","вас","ваш","ваша","ваше","ваши","вверх","вдали","вдруг","ведь","везде","вернуться","весь","вечер","взгляд","взять","вид","видел","видеть","вместе","вне","вниз","внизу","во","вода","война","вокруг","вон","вообще","вопрос","восемнадцатый","восемнадцать","восемь","восьмой","вот","впрочем","времени","время","все","все еще","всегда","всего","всем","всеми","всему","всех","всею","всю","всюду","вся","всё","второй","вы","выйти","г","где","главный","глаз","говорил","говорит","говорить","год","года","году","голова","голос","город","да","давать","давно","даже","далекий","далеко","дальше","даром","дать","два","двадцатый","двадцать","две","двенадцатый","двенадцать","дверь","двух","девятнадцатый","девятнадцать","девятый","девять","действительно","дел","делал","делать","делаю","дело","день","деньги","десятый","десять","для","до","довольно","долго","должен","должно","должный","дом","дорога","друг","другая","другие","других","друго","другое","другой","думать","душа","е","его","ее","ей","ему","если","есть","еще","ещё","ею","её","ж","ждать","же","жена","женщина","жизнь","жить","за","занят","занята","занято","заняты","затем","зато","зачем","здесь","земля","знать","значит","значить","и","иди","идти","из","или","им","имеет","имел","именно","иметь","ими","имя","иногда","их","к","каждая","каждое","каждые","каждый","кажется","казаться","как","какая","какой","кем","книга","когда","кого","ком","комната","кому","конец","конечно","которая","которого","которой","которые","который","которых","кроме","кругом","кто","куда","лежать","лет","ли","лицо","лишь","лучше","любить","люди","м","маленький","мало","мать","машина","между","меля","менее","меньше","меня","место","миллионов","мимо","минута","мир","мира","мне","много","многочисленная","многочисленное","многочисленные","многочисленный","мной","мною","мог","могу","могут","мож","может","может быть","можно","можхо","мои","мой","мор","москва","мочь","моя","моё","мы","на","наверху","над","надо","назад","наиболее","найти","наконец","нам","нами","народ","нас","начала","начать","наш","наша","наше","наши","не","него","недавно","недалеко","нее","ней","некоторый","нельзя","нем","немного","нему","непрерывно","нередко","несколько","нет","нею","неё","ни","нибудь","ниже","низко","никакой","никогда","никто","никуда","ним","ними","них","ничего","ничто","но","новый","нога","ночь","ну","нужно","нужный","нх","о","об","оба","обычно","один","одиннадцатый","одиннадцать","однажды","однако","одного","одной","оказаться","окно","около","он","она","они","оно","опять","особенно","остаться","от","ответить","отец","откуда","отовсюду","отсюда","очень","первый","перед","писать","плечо","по","под","подойди","подумать","пожалуйста","позже","пойти","пока","пол","получить","помнить","понимать","понять","пор","пора","после","последний","посмотреть","посреди","потом","потому","почему","почти","правда","прекрасно","при","про","просто","против","процентов","путь","пятнадцатый","пятнадцать","пятый","пять","работа","работать","раз","разве","рано","раньше","ребенок","решить","россия","рука","русский","ряд","рядом","с","с кем","сам","сама","сами","самим","самими","самих","само","самого","самой","самом","самому","саму","самый","свет","свое","своего","своей","свои","своих","свой","свою","сделать","сеаой","себе","себя","сегодня","седьмой","сейчас","семнадцатый","семнадцать","семь","сидеть","сила","сих","сказал","сказала","сказать","сколько","слишком","слово","случай","смотреть","сначала","снова","со","собой","собою","советский","совсем","спасибо","спросить","сразу","стал","старый","стать","стол","сторона","стоять","страна","суть","считать","т","та","так","такая","также","таки","такие","такое","такой","там","твои","твой","твоя","твоё","те","тебе","тебя","тем","теми","теперь","тех","то","тобой","тобою","товарищ","тогда","того","тоже","только","том","тому","тот","тою","третий","три","тринадцатый","тринадцать","ту","туда","тут","ты","тысяч","у","увидеть","уж","уже","улица","уметь","утро","хороший","хорошо","хотел бы","хотеть","хоть","хотя","хочешь","час","часто","часть","чаще","чего","человек","чем","чему","через","четвертый","четыре","четырнадцатый","четырнадцать","что","чтоб","чтобы","чуть","шестнадцатый","шестнадцать","шестой","шесть","эта","эти","этим","этими","этих","это","этого","этой","этом","этому","этот","эту","я","являюсь"],"sk":["a","aby","aj","ak","akej","akejže","ako","akom","akomže","akou","akouže","akože","aká","akáže","aké","akého","akéhože","akému","akémuže","akéže","akú","akúže","aký","akých","akýchže","akým","akými","akýmiže","akýmže","akýže","ale","alebo","ani","asi","avšak","až","ba","bez","bezo","bol","bola","boli","bolo","bude","budem","budeme","budete","budeš","budú","buď","by","byť","cez","cezo","dnes","do","ešte","ho","hoci","i","iba","ich","im","inej","inom","iná","iné","iného","inému","iní","inú","iný","iných","iným","inými","ja","je","jeho","jej","jemu","ju","k","kam","kamže","každou","každá","každé","každého","každému","každí","každú","každý","každých","každým","každými","kde","kej","kejže","keď","keďže","kie","kieho","kiehože","kiemu","kiemuže","kieže","koho","kom","komu","kou","kouže","kto","ktorej","ktorou","ktorá","ktoré","ktorí","ktorú","ktorý","ktorých","ktorým","ktorými","ku","ká","káže","ké","kéže","kú","kúže","ký","kýho","kýhože","kým","kýmu","kýmuže","kýže","lebo","leda","ledaže","len","ma","majú","mal","mala","mali","mať","medzi","mi","mne","mnou","moja","moje","mojej","mojich","mojim","mojimi","mojou","moju","možno","mu","musia","musieť","musí","musím","musíme","musíte","musíš","my","má","mám","máme","máte","máš","môcť","môj","môjho","môže","môžem","môžeme","môžete","môžeš","môžu","mňa","na","nad","nado","najmä","nami","naša","naše","našej","naši","našich","našim","našimi","našou","ne","nech","neho","nej","nejakej","nejakom","nejakou","nejaká","nejaké","nejakého","nejakému","nejakú","nejaký","nejakých","nejakým","nejakými","nemu","než","nich","nie","niektorej","niektorom","niektorou","niektorá","niektoré","niektorého","niektorému","niektorú","niektorý","niektorých","niektorým","niektorými","nielen","niečo","nim","nimi","nič","ničoho","ničom","ničomu","ničím","no","nám","nás","náš","nášho","ním","o","od","odo","on","ona","oni","ono","ony","oň","oňho","po","pod","podo","podľa","pokiaľ","popod","popri","potom","poza","pre","pred","predo","preto","pretože","prečo","pri","práve","s","sa","seba","sebe","sebou","sem","si","sme","so","som","ste","svoj","svoja","svoje","svojho","svojich","svojim","svojimi","svojou","svoju","svojím","sú","ta","tak","takej","takejto","taká","takáto","také","takého","takéhoto","takému","takémuto","takéto","takí","takú","takúto","taký","takýto","takže","tam","teba","tebe","tebou","teda","tej","tejto","ten","tento","ti","tie","tieto","tiež","to","toho","tohoto","tohto","tom","tomto","tomu","tomuto","toto","tou","touto","tu","tvoj","tvoja","tvoje","tvojej","tvojho","tvoji","tvojich","tvojim","tvojimi","tvojím","ty","tá","táto","tí","títo","tú","túto","tých","tým","tými","týmto","u","už","v","vami","vaša","vaše","vašej","vaši","vašich","vašim","vaším","veď","viac","vo","vy","vám","vás","váš","vášho","však","všetci","všetka","všetko","všetky","všetok","z","za","začo","začože","zo","áno","čej","či","čia","čie","čieho","čiemu","čiu","čo","čoho","čom","čomu","čou","čože","čí","čím","čími","ďalšia","ďalšie","ďalšieho","ďalšiemu","ďalšiu","ďalšom","ďalšou","ďalší","ďalších","ďalším","ďalšími","ňom","ňou","ňu","že"],"sl":["a","ali","april","avgust","b","bi","bil","bila","bile","bili","bilo","biti","blizu","bo","bodo","bojo","bolj","bom","bomo","boste","bova","boš","brez","c","cel","cela","celi","celo","d","da","daleč","dan","danes","datum","december","deset","deseta","deseti","deseto","devet","deveta","deveti","deveto","do","dober","dobra","dobri","dobro","dokler","dol","dolg","dolga","dolgi","dovolj","drug","druga","drugi","drugo","dva","dve","e","eden","en","ena","ene","eni","enkrat","eno","etc.","f","februar","g","g.","ga","ga.","gor","gospa","gospod","h","halo","i","idr.","ii","iii","in","iv","ix","iz","j","januar","jaz","je","ji","jih","jim","jo","julij","junij","jutri","k","kadarkoli","kaj","kajti","kako","kakor","kamor","kamorkoli","kar","karkoli","katerikoli","kdaj","kdo","kdorkoli","ker","ki","kje","kjer","kjerkoli","ko","koder","koderkoli","koga","komu","kot","kratek","kratka","kratke","kratki","l","lahka","lahke","lahki","lahko","le","lep","lepa","lepe","lepi","lepo","leto","m","maj","majhen","majhna","majhni","malce","malo","manj","marec","me","med","medtem","mene","mesec","mi","midva","midve","mnogo","moj","moja","moje","mora","morajo","moram","moramo","morate","moraš","morem","mu","n","na","nad","naj","najina","najino","najmanj","naju","največ","nam","narobe","nas","nato","nazaj","naš","naša","naše","ne","nedavno","nedelja","nek","neka","nekaj","nekatere","nekateri","nekatero","nekdo","neke","nekega","neki","nekje","neko","nekoga","nekoč","ni","nikamor","nikdar","nikjer","nikoli","nič","nje","njega","njegov","njegova","njegovo","njej","njemu","njen","njena","njeno","nji","njih","njihov","njihova","njihovo","njiju","njim","njo","njun","njuna","njuno","no","nocoj","november","npr.","o","ob","oba","obe","oboje","od","odprt","odprta","odprti","okoli","oktober","on","onadva","one","oni","onidve","osem","osma","osmi","osmo","oz.","p","pa","pet","peta","petek","peti","peto","po","pod","pogosto","poleg","poln","polna","polni","polno","ponavadi","ponedeljek","ponovno","potem","povsod","pozdravljen","pozdravljeni","prav","prava","prave","pravi","pravo","prazen","prazna","prazno","prbl.","precej","pred","prej","preko","pri","pribl.","približno","primer","pripravljen","pripravljena","pripravljeni","proti","prva","prvi","prvo","r","ravno","redko","res","reč","s","saj","sam","sama","same","sami","samo","se","sebe","sebi","sedaj","sedem","sedma","sedmi","sedmo","sem","september","seveda","si","sicer","skoraj","skozi","slab","smo","so","sobota","spet","sreda","srednja","srednji","sta","ste","stran","stvar","sva","t","ta","tak","taka","take","taki","tako","takoj","tam","te","tebe","tebi","tega","težak","težka","težki","težko","ti","tista","tiste","tisti","tisto","tj.","tja","to","toda","torek","tretja","tretje","tretji","tri","tu","tudi","tukaj","tvoj","tvoja","tvoje","u","v","vaju","vam","vas","vaš","vaša","vaše","ve","vedno","velik","velika","veliki","veliko","vendar","ves","več","vi","vidva","vii","viii","visok","visoka","visoke","visoki","vsa","vsaj","vsak","vsaka","vsakdo","vsake","vsaki","vsakomur","vse","vsega","vsi","vso","včasih","včeraj","x","z","za","zadaj","zadnji","zakaj","zaprta","zaprti","zaprto","zdaj","zelo","zunaj","č","če","često","četrta","četrtek","četrti","četrto","čez","čigav","š","šest","šesta","šesti","šesto","štiri","ž","že"],"so":["aad","albaabkii","atabo","ay","ayaa","ayee","ayuu","dhan","hadana","in","inuu","isku","jiray","jirtay","ka","kale","kasoo","ku","kuu","lakin","markii","oo","si","soo","uga","ugu","uu","waa","waxa","waxuu"],"st":["a","ba","bane","bona","e","ea","eaba","empa","ena","ha","hae","hape","ho","hore","ka","ke","la","le","li","me","mo","moo","ne","o","oa","re","sa","se","tloha","tsa","tse"],"es":["0","1","2","3","4","5","6","7","8","9","_","a","actualmente","acuerdo","adelante","ademas","además","adrede","afirmó","agregó","ahi","ahora","ahí","al","algo","alguna","algunas","alguno","algunos","algún","alli","allí","alrededor","ambos","ampleamos","antano","antaño","ante","anterior","antes","apenas","aproximadamente","aquel","aquella","aquellas","aquello","aquellos","aqui","aquél","aquélla","aquéllas","aquéllos","aquí","arriba","arribaabajo","aseguró","asi","así","atras","aun","aunque","ayer","añadió","aún","b","bajo","bastante","bien","breve","buen","buena","buenas","bueno","buenos","c","cada","casi","cerca","cierta","ciertas","cierto","ciertos","cinco","claro","comentó","como","con","conmigo","conocer","conseguimos","conseguir","considera","consideró","consigo","consigue","consiguen","consigues","contigo","contra","cosas","creo","cual","cuales","cualquier","cuando","cuanta","cuantas","cuanto","cuantos","cuatro","cuenta","cuál","cuáles","cuándo","cuánta","cuántas","cuánto","cuántos","cómo","d","da","dado","dan","dar","de","debajo","debe","deben","debido","decir","dejó","del","delante","demasiado","demás","dentro","deprisa","desde","despacio","despues","después","detras","detrás","dia","dias","dice","dicen","dicho","dieron","diferente","diferentes","dijeron","dijo","dio","donde","dos","durante","día","días","dónde","e","ejemplo","el","ella","ellas","ello","ellos","embargo","empleais","emplean","emplear","empleas","empleo","en","encima","encuentra","enfrente","enseguida","entonces","entre","era","erais","eramos","eran","eras","eres","es","esa","esas","ese","eso","esos","esta","estaba","estabais","estaban","estabas","estad","estada","estadas","estado","estados","estais","estamos","estan","estando","estar","estaremos","estará","estarán","estarás","estaré","estaréis","estaría","estaríais","estaríamos","estarían","estarías","estas","este","estemos","esto","estos","estoy","estuve","estuviera","estuvierais","estuvieran","estuvieras","estuvieron","estuviese","estuvieseis","estuviesen","estuvieses","estuvimos","estuviste","estuvisteis","estuviéramos","estuviésemos","estuvo","está","estábamos","estáis","están","estás","esté","estéis","estén","estés","ex","excepto","existe","existen","explicó","expresó","f","fin","final","fue","fuera","fuerais","fueran","fueras","fueron","fuese","fueseis","fuesen","fueses","fui","fuimos","fuiste","fuisteis","fuéramos","fuésemos","g","general","gran","grandes","gueno","h","ha","haber","habia","habida","habidas","habido","habidos","habiendo","habla","hablan","habremos","habrá","habrán","habrás","habré","habréis","habría","habríais","habríamos","habrían","habrías","habéis","había","habíais","habíamos","habían","habías","hace","haceis","hacemos","hacen","hacer","hacerlo","haces","hacia","haciendo","hago","han","has","hasta","hay","haya","hayamos","hayan","hayas","hayáis","he","hecho","hemos","hicieron","hizo","horas","hoy","hube","hubiera","hubierais","hubieran","hubieras","hubieron","hubiese","hubieseis","hubiesen","hubieses","hubimos","hubiste","hubisteis","hubiéramos","hubiésemos","hubo","i","igual","incluso","indicó","informo","informó","intenta","intentais","intentamos","intentan","intentar","intentas","intento","ir","j","junto","k","l","la","lado","largo","las","le","lejos","les","llegó","lleva","llevar","lo","los","luego","lugar","m","mal","manera","manifestó","mas","mayor","me","mediante","medio","mejor","mencionó","menos","menudo","mi","mia","mias","mientras","mio","mios","mis","misma","mismas","mismo","mismos","modo","momento","mucha","muchas","mucho","muchos","muy","más","mí","mía","mías","mío","míos","n","nada","nadie","ni","ninguna","ningunas","ninguno","ningunos","ningún","no","nos","nosotras","nosotros","nuestra","nuestras","nuestro","nuestros","nueva","nuevas","nuevo","nuevos","nunca","o","ocho","os","otra","otras","otro","otros","p","pais","para","parece","parte","partir","pasada","pasado","paìs","peor","pero","pesar","poca","pocas","poco","pocos","podeis","podemos","poder","podria","podriais","podriamos","podrian","podrias","podrá","podrán","podría","podrían","poner","por","por qué","porque","posible","primer","primera","primero","primeros","principalmente","pronto","propia","propias","propio","propios","proximo","próximo","próximos","pudo","pueda","puede","pueden","puedo","pues","q","qeu","que","quedó","queremos","quien","quienes","quiere","quiza","quizas","quizá","quizás","quién","quiénes","qué","r","raras","realizado","realizar","realizó","repente","respecto","s","sabe","sabeis","sabemos","saben","saber","sabes","sal","salvo","se","sea","seamos","sean","seas","segun","segunda","segundo","según","seis","ser","sera","seremos","será","serán","serás","seré","seréis","sería","seríais","seríamos","serían","serías","seáis","señaló","si","sido","siempre","siendo","siete","sigue","siguiente","sin","sino","sobre","sois","sola","solamente","solas","solo","solos","somos","son","soy","soyos","su","supuesto","sus","suya","suyas","suyo","suyos","sé","sí","sólo","t","tal","tambien","también","tampoco","tan","tanto","tarde","te","temprano","tendremos","tendrá","tendrán","tendrás","tendré","tendréis","tendría","tendríais","tendríamos","tendrían","tendrías","tened","teneis","tenemos","tener","tenga","tengamos","tengan","tengas","tengo","tengáis","tenida","tenidas","tenido","tenidos","teniendo","tenéis","tenía","teníais","teníamos","tenían","tenías","tercera","ti","tiempo","tiene","tienen","tienes","toda","todas","todavia","todavía","todo","todos","total","trabaja","trabajais","trabajamos","trabajan","trabajar","trabajas","trabajo","tras","trata","través","tres","tu","tus","tuve","tuviera","tuvierais","tuvieran","tuvieras","tuvieron","tuviese","tuvieseis","tuviesen","tuvieses","tuvimos","tuviste","tuvisteis","tuviéramos","tuviésemos","tuvo","tuya","tuyas","tuyo","tuyos","tú","u","ultimo","un","una","unas","uno","unos","usa","usais","usamos","usan","usar","usas","uso","usted","ustedes","v","va","vais","valor","vamos","van","varias","varios","vaya","veces","ver","verdad","verdadera","verdadero","vez","vosotras","vosotros","voy","vuestra","vuestras","vuestro","vuestros","w","x","y","ya","yo","z","él","éramos","ésa","ésas","ése","ésos","ésta","éstas","éste","éstos","última","últimas","último","últimos"],"sw":["akasema","alikuwa","alisema","baada","basi","bila","cha","chini","hadi","hapo","hata","hivyo","hiyo","huku","huo","ili","ilikuwa","juu","kama","karibu","katika","kila","kima","kisha","kubwa","kutoka","kuwa","kwa","kwamba","kwenda","kwenye","la","lakini","mara","mdogo","mimi","mkubwa","mmoja","moja","muda","mwenye","na","naye","ndani","ng","ni","nini","nonkungu","pamoja","pia","sana","sasa","sauti","tafadhali","tena","tu","vile","wa","wakati","wake","walikuwa","wao","watu","wengine","wote","ya","yake","yangu","yao","yeye","yule","za","zaidi","zake"],"sv":["aderton","adertonde","adjö","aldrig","alla","allas","allt","alltid","alltså","andra","andras","annan","annat","artonde","artonn","att","av","bakom","bara","behöva","behövas","behövde","behövt","beslut","beslutat","beslutit","bland","blev","bli","blir","blivit","bort","borta","bra","bäst","bättre","båda","bådas","dag","dagar","dagarna","dagen","de","del","delen","dem","den","denna","deras","dess","dessa","det","detta","dig","din","dina","dit","ditt","dock","dom","du","där","därför","då","e","efter","eftersom","ej","elfte","eller","elva","emot","en","enkel","enkelt","enkla","enligt","ens","er","era","ers","ert","ett","ettusen","fanns","fem","femte","femtio","femtionde","femton","femtonde","fick","fin","finnas","finns","fjorton","fjortonde","fjärde","fler","flera","flesta","fram","framför","från","fyra","fyrtio","fyrtionde","få","får","fått","följande","för","före","förlåt","förra","första","genast","genom","gick","gjorde","gjort","god","goda","godare","godast","gott","gälla","gäller","gällt","gärna","gå","går","gått","gör","göra","ha","hade","haft","han","hans","har","heller","hellre","helst","helt","henne","hennes","hit","hon","honom","hundra","hundraen","hundraett","hur","här","hög","höger","högre","högst","i","ibland","icke","idag","igen","igår","imorgon","in","inför","inga","ingen","ingenting","inget","innan","inne","inom","inte","inuti","ja","jag","jo","ju","just","jämfört","kan","kanske","knappast","kom","komma","kommer","kommit","kr","kunde","kunna","kunnat","kvar","legat","ligga","ligger","lika","likställd","likställda","lilla","lite","liten","litet","länge","längre","längst","lätt","lättare","lättast","långsam","långsammare","långsammast","långsamt","långt","låt","man","med","mej","mellan","men","mer","mera","mest","mig","min","mina","mindre","minst","mitt","mittemot","mot","mycket","många","måste","möjlig","möjligen","möjligt","möjligtvis","ned","nederst","nedersta","nedre","nej","ner","ni","nio","nionde","nittio","nittionde","nitton","nittonde","nog","noll","nr","nu","nummer","när","nästa","någon","någonting","något","några","nån","nånting","nåt","nödvändig","nödvändiga","nödvändigt","nödvändigtvis","och","också","ofta","oftast","olika","olikt","om","oss","på","rakt","redan","rätt","sa","sade","sagt","samma","sedan","senare","senast","sent","sex","sextio","sextionde","sexton","sextonde","sig","sin","sina","sist","sista","siste","sitt","sitta","sju","sjunde","sjuttio","sjuttionde","sjutton","sjuttonde","själv","sjätte","ska","skall","skulle","slutligen","små","smått","snart","som","stor","stora","stort","större","störst","säga","säger","sämre","sämst","så","sådan","sådana","sådant","ta","tack","tar","tidig","tidigare","tidigast","tidigt","till","tills","tillsammans","tio","tionde","tjugo","tjugoen","tjugoett","tjugonde","tjugotre","tjugotvå","tjungo","tolfte","tolv","tre","tredje","trettio","trettionde","tretton","trettonde","två","tvåhundra","under","upp","ur","ursäkt","ut","utan","utanför","ute","va","vad","var","vara","varför","varifrån","varit","varje","varken","vars","varsågod","vart","vem","vems","verkligen","vi","vid","vidare","viktig","viktigare","viktigast","viktigt","vilka","vilkas","vilken","vilket","vill","väl","vänster","vänstra","värre","vår","våra","vårt","än","ännu","är","även","åt","åtminstone","åtta","åttio","åttionde","åttonde","över","övermorgon","överst","övre"],"th":["กล่าว","กว่า","กัน","กับ","การ","ก็","ก่อน","ขณะ","ขอ","ของ","ขึ้น","คง","ครั้ง","ความ","คือ","จะ","จัด","จาก","จึง","ช่วง","ซึ่ง","ดัง","ด้วย","ด้าน","ตั้ง","ตั้งแต่","ตาม","ต่อ","ต่าง","ต่างๆ","ต้อง","ถึง","ถูก","ถ้า","ทั้ง","ทั้งนี้","ทาง","ที่","ที่สุด","ทุก","ทํา","ทําให้","นอกจาก","นัก","นั้น","นี้","น่า","นํา","บาง","ผล","ผ่าน","พบ","พร้อม","มา","มาก","มี","ยัง","รวม","ระหว่าง","รับ","ราย","ร่วม","ลง","วัน","ว่า","สุด","ส่ง","ส่วน","สําหรับ","หนึ่ง","หรือ","หลัง","หลังจาก","หลาย","หาก","อยาก","อยู่","อย่าง","ออก","อะไร","อาจ","อีก","เขา","เข้า","เคย","เฉพาะ","เช่น","เดียว","เดียวกัน","เนื่องจาก","เปิด","เปิดเผย","เป็น","เป็นการ","เพราะ","เพื่อ","เมื่อ","เรา","เริ่ม","เลย","เห็น","เอง","แต่","แบบ","แรก","และ","แล้ว","แห่ง","โดย","ใน","ให้","ได้","ไป","ไม่","ไว้","้ง"],"tl":["akin","aking","ako","alin","am","amin","aming","ang","ano","anumang","apat","at","atin","ating","ay","bababa","bago","bakit","bawat","bilang","dahil","dalawa","dapat","din","dito","doon","gagawin","gayunman","ginagawa","ginawa","ginawang","gumawa","gusto","habang","hanggang","hindi","huwag","iba","ibaba","ibabaw","ibig","ikaw","ilagay","ilalim","ilan","inyong","isa","isang","itaas","ito","iyo","iyon","iyong","ka","kahit","kailangan","kailanman","kami","kanila","kanilang","kanino","kanya","kanyang","kapag","kapwa","karamihan","katiyakan","katulad","kaya","kaysa","ko","kong","kulang","kumuha","kung","laban","lahat","lamang","likod","lima","maaari","maaaring","maging","mahusay","makita","marami","marapat","masyado","may","mayroon","mga","minsan","mismo","mula","muli","na","nabanggit","naging","nagkaroon","nais","nakita","namin","napaka","narito","nasaan","ng","ngayon","ni","nila","nilang","nito","niya","niyang","noon","o","pa","paano","pababa","paggawa","pagitan","pagkakaroon","pagkatapos","palabas","pamamagitan","panahon","pangalawa","para","paraan","pareho","pataas","pero","pumunta","pumupunta","sa","saan","sabi","sabihin","sarili","sila","sino","siya","tatlo","tayo","tulad","tungkol","una","walang"],"tr":["acaba","acep","adamakıllı","adeta","ait","altmýþ","altmış","altý","altı","ama","amma","anca","ancak","arada","artýk","aslında","aynen","ayrıca","az","açıkça","açıkçası","bana","bari","bazen","bazý","bazı","başkası","baţka","belki","ben","benden","beni","benim","beri","beriki","beþ","beş","beţ","bilcümle","bile","bin","binaen","binaenaleyh","bir","biraz","birazdan","birbiri","birden","birdenbire","biri","birice","birileri","birisi","birkaç","birkaçı","birkez","birlikte","birçok","birçoğu","birþey","birþeyi","birşey","birşeyi","birţey","bitevi","biteviye","bittabi","biz","bizatihi","bizce","bizcileyin","bizden","bize","bizi","bizim","bizimki","bizzat","boşuna","bu","buna","bunda","bundan","bunlar","bunları","bunların","bunu","bunun","buracıkta","burada","buradan","burası","böyle","böylece","böylecene","böylelikle","böylemesine","böylesine","büsbütün","bütün","cuk","cümlesi","da","daha","dahi","dahil","dahilen","daima","dair","dayanarak","de","defa","dek","demin","demincek","deminden","denli","derakap","derhal","derken","deđil","değil","değin","diye","diđer","diğer","diğeri","doksan","dokuz","dolayı","dolayısıyla","doğru","dört","edecek","eden","ederek","edilecek","ediliyor","edilmesi","ediyor","elbet","elbette","elli","emme","en","enikonu","epey","epeyce","epeyi","esasen","esnasında","etmesi","etraflı","etraflıca","etti","ettiği","ettiğini","evleviyetle","evvel","evvela","evvelce","evvelden","evvelemirde","evveli","eđer","eğer","fakat","filanca","gah","gayet","gayetle","gayri","gayrı","gelgelelim","gene","gerek","gerçi","geçende","geçenlerde","gibi","gibilerden","gibisinden","gine","göre","gırla","hakeza","halbuki","halen","halihazırda","haliyle","handiyse","hangi","hangisi","hani","hariç","hasebiyle","hasılı","hatta","hele","hem","henüz","hep","hepsi","her","herhangi","herkes","herkesin","hiç","hiçbir","hiçbiri","hoş","hulasaten","iken","iki","ila","ile","ilen","ilgili","ilk","illa","illaki","imdi","indinde","inen","insermi","ise","ister","itibaren","itibariyle","itibarıyla","iyi","iyice","iyicene","için","iş","işte","iţte","kadar","kaffesi","kah","kala","kanýmca","karşın","katrilyon","kaynak","kaçı","kelli","kendi","kendilerine","kendini","kendisi","kendisine","kendisini","kere","kez","keza","kezalik","keşke","keţke","ki","kim","kimden","kime","kimi","kimisi","kimse","kimsecik","kimsecikler","külliyen","kýrk","kýsaca","kırk","kısaca","lakin","leh","lütfen","maada","madem","mademki","mamafih","mebni","međer","meğer","meğerki","meğerse","milyar","milyon","mu","mü","mý","mı","nasýl","nasıl","nasılsa","nazaran","naşi","ne","neden","nedeniyle","nedenle","nedense","nerde","nerden","nerdeyse","nere","nerede","nereden","neredeyse","neresi","nereye","netekim","neye","neyi","neyse","nice","nihayet","nihayetinde","nitekim","niye","niçin","o","olan","olarak","oldu","olduklarını","oldukça","olduğu","olduğunu","olmadı","olmadığı","olmak","olması","olmayan","olmaz","olsa","olsun","olup","olur","olursa","oluyor","on","ona","onca","onculayın","onda","ondan","onlar","onlardan","onlari","onlarýn","onları","onların","onu","onun","oracık","oracıkta","orada","oradan","oranca","oranla","oraya","otuz","oysa","oysaki","pek","pekala","peki","pekçe","peyderpey","rağmen","sadece","sahi","sahiden","sana","sanki","sekiz","seksen","sen","senden","seni","senin","siz","sizden","sizi","sizin","sonra","sonradan","sonraları","sonunda","tabii","tam","tamam","tamamen","tamamıyla","tarafından","tek","trilyon","tüm","var","vardı","vasıtasıyla","ve","velev","velhasıl","velhasılıkelam","veya","veyahut","ya","yahut","yakinen","yakında","yakından","yakınlarda","yalnız","yalnızca","yani","yapacak","yapmak","yaptı","yaptıkları","yaptığı","yaptığını","yapılan","yapılması","yapıyor","yedi","yeniden","yenilerde","yerine","yetmiþ","yetmiş","yetmiţ","yine","yirmi","yok","yoksa","yoluyla","yüz","yüzünden","zarfında","zaten","zati","zira","çabuk","çabukça","çeşitli","çok","çokları","çoklarınca","çokluk","çoklukla","çokça","çoğu","çoğun","çoğunca","çoğunlukla","çünkü","öbür","öbürkü","öbürü","önce","önceden","önceleri","öncelikle","öteki","ötekisi","öyle","öylece","öylelikle","öylemesine","öz","üzere","üç","þey","þeyden","þeyi","þeyler","þu","þuna","þunda","þundan","þunu","şayet","şey","şeyden","şeyi","şeyler","şu","şuna","şuncacık","şunda","şundan","şunlar","şunları","şunu","şunun","şura","şuracık","şuracıkta","şurası","şöyle","ţayet","ţimdi","ţu","ţöyle"],"uk":["авжеж","адже","але","б","без","був","була","були","було","бути","більш","вам","вас","весь","вздовж","ви","вниз","внизу","вона","вони","воно","все","всередині","всіх","від","він","да","давай","давати","де","дещо","для","до","з","завжди","замість","й","коли","ледве","майже","ми","навколо","навіть","нам","от","отже","отож","поза","про","під","та","так","такий","також","те","ти","тобто","тож","тощо","хоча","це","цей","чи","чого","що","як","який","якої","є","із","інших","їх","її"],"ur":["آئی","آئے","آج","آخر","آخرکبر","آدهی","آًب","آٹھ","آیب","اة","اخبزت","اختتبم","ادھر","ارد","اردگرد","ارکبى","اش","اضتعوبل","اضتعوبلات","اضطرذ","اضکب","اضکی","اضکے","اطراف","اغیب","افراد","الگ","اور","اوًچب","اوًچبئی","اوًچی","اوًچے","اى","اً","اًذر","اًہیں","اٹھبًب","اپٌب","اپٌے","اچھب","اچھی","اچھے","اکثر","اکٹھب","اکٹھی","اکٹھے","اکیلا","اکیلی","اکیلے","اگرچہ","اہن","ایطے","ایک","ب","ت","تبزٍ","تت","تر","ترتیت","تریي","تعذاد","تن","تو","توبم","توہی","توہیں","تٌہب","تک","تھب","تھوڑا","تھوڑی","تھوڑے","تھی","تھے","تیي","ثب","ثبئیں","ثبترتیت","ثبری","ثبرے","ثبعث","ثبلا","ثبلترتیت","ثبہر","ثدبئے","ثرآں","ثراں","ثرش","ثعذ","ثغیر","ثلٌذ","ثلٌذوثبلا","ثلکہ","ثي","ثٌب","ثٌبرہب","ثٌبرہی","ثٌبرہے","ثٌبًب","ثٌذ","ثٌذکرو","ثٌذکرًب","ثٌذی","ثڑا","ثڑوں","ثڑی","ثڑے","ثھر","ثھرا","ثھراہوا","ثھرپور","ثھی","ثہت","ثہتر","ثہتری","ثہتریي","ثیچ","ج","خب","خبرہب","خبرہی","خبرہے","خبهوظ","خبًب","خبًتب","خبًتی","خبًتے","خبًٌب","خت","ختن","خجکہ","خص","خططرذ","خلذی","خو","خواى","خوًہی","خوکہ","خٌبة","خگہ","خگہوں","خگہیں","خیطب","خیطبکہ","در","درخبت","درخہ","درخے","درزقیقت","درضت","دش","دفعہ","دلچطپ","دلچطپی","دلچطپیبں","دو","دور","دوراى","دوضرا","دوضروں","دوضری","دوضرے","دوًوں","دکھبئیں","دکھبتب","دکھبتی","دکھبتے","دکھبو","دکھبًب","دکھبیب","دی","دیب","دیتب","دیتی","دیتے","دیر","دیٌب","دیکھو","دیکھٌب","دیکھی","دیکھیں","دے","ر","راضتوں","راضتہ","راضتے","رریعہ","رریعے","رکي","رکھ","رکھب","رکھتب","رکھتبہوں","رکھتی","رکھتے","رکھی","رکھے","رہب","رہی","رہے","ز","زبصل","زبضر","زبل","زبلات","زبلیہ","زصوں","زصہ","زصے","زقبئق","زقیتیں","زقیقت","زکن","زکویہ","زیبدٍ","صبف","صسیر","صفر","صورت","صورتسبل","صورتوں","صورتیں","ض","ضبت","ضبتھ","ضبدٍ","ضبرا","ضبرے","ضبل","ضبلوں","ضت","ضرور","ضرورت","ضروری","ضلطلہ","ضوچ","ضوچب","ضوچتب","ضوچتی","ضوچتے","ضوچو","ضوچٌب","ضوچی","ضوچیں","ضکب","ضکتب","ضکتی","ضکتے","ضکٌب","ضکی","ضکے","ضیذھب","ضیذھی","ضیذھے","ضیکٌڈ","ضے","طرف","طریق","طریقوں","طریقہ","طریقے","طور","طورپر","ظبہر","ع","عذد","عظین","علاقوں","علاقہ","علاقے","علاوٍ","عووهی","غبیذ","غخص","غذ","غروع","غروعبت","غے","فرد","فی","ق","قجل","قجیلہ","قطن","لئے","لا","لازهی","لو","لوجب","لوجی","لوجے","لوسبت","لوسہ","لوگ","لوگوں","لڑکپي","لگتب","لگتی","لگتے","لگٌب","لگی","لگیں","لگے","لی","لیب","لیٌب","لیں","لے","ه","هتعلق","هختلف","هسترم","هسترهہ","هسطوش","هسیذ","هطئلہ","هطئلے","هطبئل","هطتعول","هطلق","هعلوم","هػتول","هلا","هوکي","هوکٌبت","هوکٌہ","هٌبضت","هڑا","هڑًب","هڑے","هکول","هگر","هہرثبى","هیرا","هیری","هیرے","هیں","و","وار","والے","وٍ","ًئی","ًئے","ًب","ًبپطٌذ","ًبگسیر","ًطجت","ًقطہ","ًو","ًوخواى","ًکبلٌب","ًکتہ","ًہ","ًہیں","ًیب","ًے","ٓ آش","ٹھیک","پبئے","پبش","پبًب","پبًچ","پر","پراًب","پطٌذ","پل","پورا","پوچھب","پوچھتب","پوچھتی","پوچھتے","پوچھو","پوچھوں","پوچھٌب","پوچھیں","پچھلا","پھر","پہلا","پہلی","پہلےضی","پہلےضے","پہلےضےہی","پیع","چبر","چبہب","چبہٌب","چبہے","چلا","چلو","چلیں","چلے","چکب","چکی","چکیں","چکے","چھوٹب","چھوٹوں","چھوٹی","چھوٹے","چھہ","چیسیں","ڈھوًڈا","ڈھوًڈلیب","ڈھوًڈو","ڈھوًڈًب","ڈھوًڈی","ڈھوًڈیں","ک","کئی","کئے","کب","کبفی","کبم","کت","کجھی","کرا","کرتب","کرتبہوں","کرتی","کرتے","کرتےہو","کررہب","کررہی","کررہے","کرو","کرًب","کریں","کرے","کطی","کل","کن","کوئی","کوتر","کورا","کوروں","کورٍ","کورے","کوطي","کوى","کوًطب","کوًطی","کوًطے","کھولا","کھولو","کھولٌب","کھولی","کھولیں","کھولے","کہ","کہب","کہتب","کہتی","کہتے","کہو","کہوں","کہٌب","کہی","کہیں","کہے","کی","کیب","کیطب","کیطرف","کیطے","کیلئے","کیوًکہ","کیوں","کیے","کے","کےثعذ","کےرریعے","گئی","گئے","گب","گرد","گروٍ","گروپ","گروہوں","گٌتی","گی","گیب","گے","ہر","ہن","ہو","ہوئی","ہوئے","ہوا","ہوبرا","ہوبری","ہوبرے","ہوتب","ہوتی","ہوتے","ہورہب","ہورہی","ہورہے","ہوضکتب","ہوضکتی","ہوضکتے","ہوًب","ہوًی","ہوًے","ہوچکب","ہوچکی","ہوچکے","ہوگئی","ہوگئے","ہوگیب","ہوں","ہی","ہیں","ہے","ی","یقیٌی","یہ","یہبں"],"vi":["a ha","a-lô","ai","ai ai","ai nấy","alô","amen","anh","bao giờ","bao lâu","bao nhiêu","bao nả","bay biến","biết","biết bao","biết bao nhiêu","biết chừng nào","biết mấy","biết đâu","biết đâu chừng","biết đâu đấy","bà","bài","bác","bây bẩy","bây chừ","bây giờ","bây nhiêu","bèn","béng","bông","bạn","bản","bất chợt","bất cứ","bất giác","bất kì","bất kể","bất kỳ","bất luận","bất nhược","bất quá","bất thình lình","bất tử","bất đồ","bấy","bấy chầy","bấy chừ","bấy giờ","bấy lâu","bấy lâu nay","bấy nay","bấy nhiêu","bập bà bập bõm","bập bõm","bắt đầu từ","bằng","bằng không","bằng nấy","bằng ấy","bển","bệt","bị","bỏ mẹ","bỗng","bỗng chốc","bỗng dưng","bỗng không","bỗng nhiên","bỗng đâu","bộ","bội phần","bớ","bởi","bởi chưng","bởi nhưng","bởi thế","bởi vì","bởi vậy","bức","cao","cha","cha chả","chao ôi","chiếc","cho","cho nên","cho tới","cho tới khi","cho đến","cho đến khi","choa","chu cha","chui cha","chung cục","chung qui","chung quy","chung quy lại","chuyện","chành chạnh","chí chết","chính","chính là","chính thị","chùn chùn","chùn chũn","chú","chú mày","chú mình","chúng mình","chúng ta","chúng tôi","chăn chắn","chăng","chưa","chầm chập","chậc","chắc","chắc hẳn","chẳng lẽ","chẳng những","chẳng nữa","chẳng phải","chết nỗi","chết thật","chết tiệt","chỉ","chỉn","chốc chốc","chớ","chớ chi","chợt","chủn","chứ","chứ lị","coi bộ","coi mòi","con","cu cậu","cuốn","cuộc","càng","các","cái","cây","còn","có","có chăng là","có dễ","có thể","có vẻ","cóc khô","cô","cô mình","công nhiên","cùng","cùng cực","cùng nhau","cùng với","căn","căn cắt","cũng","cũng như","cũng vậy","cũng vậy thôi","cơ","cơ chừng","cơ hồ","cơ mà","cơn","cả","cả thảy","cả thể","cảm ơn","cần","cật lực","cật sức","cậu","cổ lai","của","cứ","cứ việc","cực lực","do","do vì","do vậy","do đó","duy","dào","dì","dù cho","dù rằng","dưới","dạ","dần dà","dần dần","dầu sao","dẫu","dẫu sao","dễ sợ","dễ thường","dở chừng","dữ","em","giữa","gì","hay","hoàn toàn","hoặc","hơn","hầu hết","họ","hỏi","khi","khác","không","luôn","là","làm","lên","lúc","lại","lần","lớn","muốn","mà","mình","mỗi","một","một cách","mới","mợ","ngay","ngay cả","ngay khi","ngay lúc","ngay lập tức","ngay tức khắc","ngay từ","nghe chừng","nghe đâu","nghen","nghiễm nhiên","nghỉm","ngoài","ngoài ra","ngoải","ngày","ngày càng","ngày ngày","ngày xưa","ngày xửa","ngôi","ngõ hầu","ngăn ngắt","ngươi","người","ngọn","ngọt","ngộ nhỡ","nh","nhau","nhiên hậu","nhiều","nhiệt liệt","nhung nhăng","nhà","nhân dịp","nhân tiện","nhé","nhón nhén","như","như chơi","như không","như quả","như thể","như tuồng","như vậy","nhưng","nhưng mà","nhược bằng","nhất","nhất loạt","nhất luật","nhất mực","nhất nhất","nhất quyết","nhất sinh","nhất thiết","nhất tâm","nhất tề","nhất đán","nhất định","nhận","nhỉ","nhỡ ra","những","những ai","những như","nào","này","nên","nên chi","nó","nóc","nói","năm","nơi","nấy","nếu","nếu như","nền","nọ","nớ","nức nở","nữa","oai oái","oái","pho","phè","phóc","phót","phăn phắt","phương chi","phải","phải chi","phải chăng","phắt","phỉ phui","phỏng","phỏng như","phốc","phụt","phứt","qua","qua quít","qua quýt","quyết","quyết nhiên","quyển","quá","quá chừng","quá lắm","quá sá","quá thể","quá trời","quá xá","quá đỗi","quá độ","quá ư","quý hồ","quả","quả là","quả tang","quả thật","quả tình","quả vậy","quả đúng","ra","ra phết","ra sao","ra trò","ren rén","riu ríu","riêng","riệt","rày","ráo","ráo trọi","rén","rích","rón rén","rút cục","răng","rất","rằng","rằng là","rốt cuộc","rốt cục","rồi","rứa","sa sả","sao","sau","sau chót","sau cuối","sau cùng","sau đó","so","song le","suýt","sì","sạch","sất","sắp","sẽ","số","số là","sốt sột","sở dĩ","sự","tanh","tha hồ","than ôi","thanh","theo","thi thoảng","thoạt","thoạt nhiên","thoắt","thuần","thà","thà là","thà rằng","thành ra","thành thử","thái quá","tháng","thì","thì thôi","thình lình","thím","thôi","thúng thắng","thương ôi","thường","thảo hèn","thảo nào","thấy","thẩy","thậm","thậm chí","thật lực","thật ra","thật vậy","thế","thế là","thế mà","thế nào","thế nên","thế ra","thế thì","thế à","thếch","thỉnh thoảng","thỏm","thốc","thốc tháo","thốt","thốt nhiên","thộc","thời gian","thục mạng","thửa","thực ra","thực sự","thực vậy","tiếp theo","tiếp đó","tiện thể","toà","toé khói","toẹt","trong","trên","trước","trước kia","trước nay","trước tiên","trước đây","trước đó","trếu tráo","trển","trệt","trệu trạo","trỏng","trời đất ơi","trừ phi","tuy","tuy nhiên","tuy rằng","tuy thế","tuy vậy","tuyệt nhiên","tuần tự","tuốt luốt","tuốt tuồn tuột","tuốt tuột","tà tà","tênh","tít mù","tò te","tôi","tông tốc","tù tì","tăm tắp","tại","tại vì","tấm","tấn","tất cả","tất thảy","tất tần tật","tất tật","tắp","tắp lự","tọt","tỏ ra","tỏ vẻ","tốc tả","tối ư","tột","tớ","tới","tức thì","tức tốc","từ","từng","tự vì","tựu trung","veo","veo veo","việc","vung thiên địa","vung tàn tán","vung tán tàn","và","vào","vâng","vèo","vì","vì chưng","vì thế","vì vậy","ví bằng","ví dù","ví phỏng","ví thử","vô hình trung","vô kể","vô luận","vô vàn","văng tê","vạn nhất","vả chăng","vả lại","vẫn","vậy","vậy là","vậy thì","về","vị tất","vốn dĩ","với","với lại","vở","vụt","vừa","vừa mới","xa xả","xiết bao","xon xón","xoành xoạch","xoét","xoẳn","xoẹt","xuất kì bất ý","xuất kỳ bất ý","xuể","xuống","xăm xúi","xăm xăm","xăm xắm","xềnh xệch","xệp","à","à ơi","ào","á","á à","ái","ái chà","ái dà","áng","âu là","ô hay","ô hô","ô kê","ô kìa","ôi chao","ôi thôi","ông","úi","úi chà","úi dào","ý","ý chừng","ý da","đang","đi","điều","đành đạch","đáng lí","đáng lý","đáng lẽ","đánh đùng","đáo để","đây","đã","đó","được","đại loại","đại nhân","đại phàm","đại để","đến","đến nỗi","đều","để","ơ","ơ hay","ơ kìa","ơi","ư","ạ","ạ ơi","ấy","ầu ơ","ắt","ắt hẳn","ắt là","ối dào","ối giời","ối giời ơi","ồ","ổng","ớ","ờ","ở","ở trên","ủa","ứ hự","ứ ừ","ừ","ử"],"yo":["a","an","bá","bí","bẹ̀rẹ̀","fún","fẹ́","gbogbo","inú","jù","jẹ","jẹ́","kan","kì","kí","kò","láti","lè","lọ","mi","mo","máa","mọ̀","ni","náà","ní","nígbà","nítorí","nǹkan","o","padà","pé","púpọ̀","pẹ̀lú","rẹ̀","sì","sí","sínú","ṣ","ti","tí","wà","wá","wọn","wọ́n","yìí","àti","àwọn","é","í","òun","ó","ń","ńlá","ṣe","ṣé","ṣùgbọ́n","ẹmọ́","ọjọ́","ọ̀pọ̀lọpọ̀"],"zu":["futhi","kahle","kakhulu","kanye","khona","kodwa","kungani","kusho","la","lakhe","lapho","mina","ngesikhathi","nje","phansi","phezulu","u","ukuba","ukuthi","ukuze","uma","wahamba","wakhe","wami","wase","wathi","yakhe","zakhe","zonke"]} \ No newline at end of file diff --git a/common/assets/stopwords-languages.json b/common/assets/stopwords-languages.json new file mode 100644 index 000000000..745cac698 --- /dev/null +++ b/common/assets/stopwords-languages.json @@ -0,0 +1,58 @@ +{"af": "Afrikaans", +"ar": "Arabic", +"hy": "Armenian", +"eu": "Basque", +"bn": "Bengali", +"br": "Breton", +"bg": "Bulgarian", +"ca": "Catalan; Valencian", +"cs": "Czech", +"zh": "Chinese", +"da": "Danish", +"de": "German", +"nl": "Dutch", +"el": "Greek (Modern)", +"en": "English", +"eo": "Esperanto", +"et": "Estonian", +"fa": "Persian", +"fi": "Finnish", +"fr": "French", +"ga": "Irish", +"gl": "Galician", +"gu": "Gujarati", +"ha": "Hausa", +"he": "Hebrew", +"hi": "Hindi", +"hr": "Croatian", +"hu": "Hungarian", +"id": "Indonesian", +"it": "Italian", +"ja": "Japanese", +"ko": "Korean", +"ku": "Kurdish", +"la": "Latin", +"lv": "Latvian", +"lt": "Lithuanian", +"mr": "Marathi", +"ms": "Malay", +"no": "Norwegian", +"pl": "Polish", +"pt": "Portuguese", +"ro": "Romanian; Moldavian; Moldovan", +"ru": "Russian", +"sk": "Slovak", +"sl": "Slovenian", +"so": "Somali", +"st": "Sotho, Southern", +"es": "Spanish; Castilian", +"sw": "Swahili", +"sv": "Swedish", +"tl": "Tagalog", +"th": "Thai", +"tr": "Turkish", +"uk": "Ukrainian", +"ur": "Urdu", +"vi": "Vietnamese", +"yo": "Yoruba", +"zu": "Zulu"} \ No newline at end of file diff --git a/common/assets/wordlists/stopwords-iso-all.txt b/common/assets/wordlists/stopwords-iso-all.txt deleted file mode 100644 index be4d63d19..000000000 --- a/common/assets/wordlists/stopwords-iso-all.txt +++ /dev/null @@ -1,19170 +0,0 @@ -طورپر -অতএব -এখানেই -chom -nghe đâu -sa -eno -menet -közben -이리하여 -个 -savo -dindanañ -kanssani -mohou -evermore -jener -dere -тож -entao -aurait -всіх -دادن -etre -generally -مازال -couldn't -vosaltres -i've -لنا -بگوید -triúr -najib -然后 -или -非 -enikonu -yüz -takej -cơ mà -ανα -evenwel -nia -joutui -asta -jaz -bennetek -زيارة -menyebutkan -presa -sri -آی -видеть -hello -не -înaintea -નો -evvel -自后 -puţin -uno -есть -dito -í -thereof -तरह -sempat -μερικες -τετοιων -কেউ -어느해 -מעטים -d'o -دون -وكانت -minu -sekurangnya -vanuit -również -setu -زصوں -اوًچی -dia -예 -sjøl -că -อาจ -tertuju -asko -kaikkialle -çokluk -hármat -biết đâu -先不先 -surtout -反过来 -μεν -요만한걸 -하는 김에 -finsalvet -teriam -personnes -menaiki -plouf -kolme -kvifor -طریقوں -melihat -demi -adopted -estus -derniere -jumaat -ता -sukan -إياهم -τοσος -অন্য -tämä -此次 -kuka -ميليارد -trente -vir -ગયું -ἐφ -svoj -itulah -nôtres -luo -tua -húsz -مقابل -peuvent -souvitañ -مورد -ngôi -lenni -ὃ -minulla -tanah -आपल्या -ničím -happens -sondern -આપણું -banyak -συναμα -midva -honhont -τετοιας -research -mellettük -tiña -ðitokia -como -לי -bem -acz -olması -ایم -width -заедно -sn -berapakah -hacerlo -назад -avec -example -tej -belőlem -medtem -zijne -số là -اثر -eveldout -inward -tt -tend -तीन -quizas -vuestros -omitted -vid -ποιο -einige -ktere -sugli -دیکھٌب -ہیں -t'he -tuosta -quelqu'un -atat -perladangan -primeiras -unos -dovunque -celui-là -عدة -c'he -き -há -thence -比 -受到 -inikah -اینگونه -wissen -manasai -آورد -jelenleg -دارید -auraient -gospa -şunları -described -不 -através -nopeasti -也 -бывает -katulad -bat -hayas -talán -لدن -destas -tsa -horiek -rez -tých -עצמהן -vöre -startseite -vami -memberi -ran -آنجا -teir -egyebek -bih -meest -συχνης -nedersta -كأيّن -tiveram -ise -ر -souvent -szíves -이래 -importe -merupakan -peluang -koska -jene -peki -ออก -mele -及至 -group -হয় -wata -daca -faisaient -pegoulz -betul -conseguir -olleet -daselbst -ορισμενων -দ্বারা -بودی -anden -tuolla -particularly -하면 할수록 -موارد -който -désormais -sedem -disember -καμποσο -μία -ikut -everybody -たり -과 -tempoh -بیاید -tenhamos -chẳng những -jobbra -τουτους -คือ -况且 -меня -吓 -tinha -that's -conform -khác -tenida -henne -kuriedvi -halusi -rút cục -maþne -hyvin -strana -voec'h -tấn -بگو -boa -رکھی -m' -ginawang -everywhere -estàveu -vaikeissa -kilencedik -jestem -شخصا -kunde -אז -dal -другое -ετερο -ouejout -vaikeilla -ettei -saham -% -vostres -värre -h: -bấy nay -sinds -esmu -rajtatok -manàjà -将 -seja -پيش -betreffende -samallassa -ŝin -uuden -пожалуйста -tried -في -nous-mêmes -چندین -tretton -los -last -est -אין -suffisante -kroz -τετοιες -nuevos -kira -kahdeksan -bom -据此 -hầu hết -힘입어 -pat -所在 -أصبح -而是 -kilka -vänstra -xiết bao -grandes -“ -твои -nemeur -täällä -अदि -tanpa -اند -bara -whole -course -아울러 -কারণ -mademki -不独 -umas -ειτε -pais -કરું -kemudahan -∆ικοι -kaout -kulang -اغیب -οποιοι -onu -teva -nedělá -tipy -dix-sept -nola -ετουτα -wahr -সে -rakyat -ancak -peste -empleas -um -paèiais -iekām -παλι -bennem -দেখতে -nem -tavajame -esat -باشم -εγκαιρα -тобою -estabais -downs -się -eneste -тому -bank -ennomp -fezh -这样 -wam -ταυτα -nosa -เนื่องจาก -kelljen -ensimmäisiksi -tjugotvå -thereby -primeiro -bz -儿 -sebutlah -mesmos -તેમને -belakang -nemedor -primera -сам -seni -agora -sốt sột -daneben -tolfte -did -который -altres -vosotras -প্রতি -svými -ilen -weiteren -rett -อยู่ -nam -מלבד -somebody -εκεινης -deg -ahoj -مي -ae -váš -kannattaa -हो -paras -podrían -erat -مافتئ -along -由此可见 -sepantasnyalah -nessuno -komu -derjenigen -allow -mon -deiner -怎么 -dine -روب -följande -narito -дещо -bằng không -nhất loạt -vostra -hän -οσον -۱ -بگیرم -chomh -cando -avais -anderer -alhoewel -duas -przede -indicó -tome -صورتیں -ordin -کرے -sådan -потому -inej -phỉ phui -besonders -probably -에 대해 -önökért -trettio -bỗng -savøjø -κιολας -તારામાં -tuy vậy -về -이때 -még -són -केले -হিসাবে -digant -éssent -1 -anasis -gekannt -където -mojim -halusit -这里 -那些 -私 -нельзя -dezhañ -see -acolo -还有 -그렇지않으면 -heistä -volgend -czyli -设使 -甚或 -either -they'll -goda -onun -زصے -minusta -કેટલું -pp -mightnt -stata -옆사람 -thanh -miről -oda -vienas -বসে -suit -pembangunan -mọ̀ -floc -homañ -berikut -първо -nearly -deim -пятнадцатый -why -kazi -dată -rẹ̀ -soll -tendréis -d'una -moji -sembrare -mögött -rasi -suoi -előtted -забавям -mali -어떤 -njega -اجل -hélas -früher -друго -kimi -enemmän -guter -τοιοῦτοσ -circa -더구나 -değin -senin -איתן -为着 -specifically -yakında -mają -varat -végén -zpět -deras -אלה -manuoju -gg -آورده -چهار -hundra -آره -numbers -vrlo -그러면 -ওদের -또한 -중의하나 -kamu -sexto -nedelja -rağmen -nhau -havis -pelaburan -dezho -گفتی -] -sadam -feb -silloin -ahi -mahusay -земля -ت -estarás -estivesse -към -οὗτος -էին -kont -εν -հետ -_ -ながら -ji -none -إيهٍ -berakhirnya -한적이있다 -εξισου -totusi -weiter -کیوًکہ -eléd -vremañ -tek -dindanout -vol -haluatte -ezekhez -toisessa -toiselle -tantes -dappertutto -araozon -どの -kļuvu -start -жить -kung -sonunda -9 -joukosta -a's -آٹھ -नाही -alussa -uþtat -dicho -rw -etraflı -lille -padà -lado -مستقیما -diaraok -ser -antara -طریق -futuro -反过来说 -nebyli -sl -igen -midagi -非徒 -daarin -každé -비하면 -yirmi -σημερα -всего -själv -无论 -veel -mı -σου -времени -diingatkan -rád -birlikte -moi-même -σὺ -niistä -tardive -अपने -amzer -edellä -petang -tijdens -jenen -diibaratkannya -sektor -best -nyt -anajai -chúng mình -لگتب -bovendien -selbst -اثرِ -klek -ได้ -almost -sowie -以故 -不成 -ثہت -bất luận -alô -kukuh -teidät -επει∆η -như quả -mal -vas -kettő -trilyon -many -global -ĝia -साबुत -oni -meminta -forza -ðiokia -binnen -monta -rốt cục -εκαστη -weren -طی -ännu -ajen -cant -υπο -איתך -संग -miket -ее -bahagian -kreiz -بگیری -बहि -egyre -akých -пък -ἀφ -berzh -atrás -ht -ce -bisher -hau -vuestras -لها -aloitat -dunque -각자 -tido -kadangi -và -semmi -orders -着 -ignored -отсюда -denne -nuestras -auquel -그렇지 -εσενα -ی -пол -말할것도 없고 -авжеж -αλλιως -tercera -niya -tiba-tiba -nooit -furono -sedma -呸 -이어서 -sería -skradþiai -بویژه -joina -şu -haon -کہی -એમ -ضت -ואת -cała -sua -memperkirakan -依照 -estuviera -nije -nesse -song le -jokin -semblant -دوم -éppen -tenidas -bagaimanakah -pegawai -ὡσ -۰ -twój -работа -oma -meinen -مادام -朝着 -توہی -حالا -clac -راستی -flera -להן -朝 -τόν -করার -wirst -κτλ -jólesik -ezeken -aon -tallä -meg -môže -与否 -aotren -úgy -felt -旁人 -by -vijen -naturelles -khususnya -や -korleis -کردند -akémuže -algún -anojo -finnas -inilah -seacht -långsammare -bung -already -হলে -מהיכן -beliau -hiyo -gr -whereupon -jí -olla -như -হতেই -самого -tendrá -akhirnya -ọ̀pọ̀lọpọ̀ -gällt -sarà -különbözőek -ihrem -neva -faedah -böylemesine -hadana -eur -pasak -τισ -τοσες -gouezit -successivo -caranya -meget -बहुत -beroriek -tuolle -의지하여 -önt -trizek -什么 -be -avrò -algunas -consigue -tăm tắp -взема -wier -hänellä -לפיכך -hence -noina -dirinya -estaría -gbogbo -primo -frumos -neki -zulke -voştri -njuno -eppure -dreñv -쿵 -högst -nello -этого -me -adesso -così -اخیر -tuần tự -খুব -τι -нас -werent -kikké -را -ًوخواى -دور -τοσης -diđer -آض -improvviso -diganeoc'h -بسیار -שלהם -mes -unora -autre -pas -بیاور -એવો -det -četrti -pie -گويد -طالما -mikä -akýmiže -رریعہ -sant -asean -şi -હતાં -সেখান -ezektől -daquela -osmnáct -بودند -하도록하다 -слишком -której -wah -therefore -ici -noite -további -finche -lies -انقلب -우리 -habíais -στο -bezent -אתכם -倘 -tú -seconds -taa -peratus -делать -سوم -么 -vsake -interesting -هاكَ -vete -tulisin -haiek -bemaþ -nestes -эта -אלו -estat -дел -наверху -majlis -siltä -ты -lyg -está -대해서 -naszych -خلا -اخرى -لوگ -وهو -那么样 -shed -hatodikat -सबसे -tőletek -paèiu -bakom -parce -کنونی -anymore -underneath -būs -apakšpus -সঙ্গে -serez -mismos -general -troppo -voorts -tenéis -有些 -یابی -ὑπὲρ -ثٌبرہب -અથવા -さ -yoluyla -panevedout -tavasis -pta -ainsi -gekonnt -ι∆ιου -παντως -haha -તમારું -nez -juoju -մեջ -اذا -ouijes -等 -вече -maggior -너희들 -toc -vefen -suuret -parca -vidva -vaikean -ala -करें -st -intentan -seremos -noastră -eras -според -děkujeme -i'll -так -való -ทําให้ -nian -nhất sinh -ذاك -ّأيّان -eor -mw -۹ -có chăng là -jenem -mesk -بالایِ -kaikkialla -njuna -ثمّة -فيم -лучше -sesudah -pagi -tegul -veliko -οποτε -بکند -אתם -primeira -ký -reste -самим -kamulah -ние -barangan -minggu -encore -关于 -unfortunately -خو -莫如 -طَق -करणयात -خٌبة -ollut -now -toull -هرگز -biteviye -đành đạch -cependant -aiurea -hubieseis -จัด -ðiesiems -ثٌذی -vô vàn -oas -ene -раньше -legyen -были -tamhle -ευγε -voor -för -missen -ἐγώ -chtó -anàsias -chứ -подумать -هعلوم -quá thể -tästä -certaine -darin -jahren -nes -howbeit -y -petek -পর -pergen -đã -significantly -किसे -ئەوەی -tiap -նաև -گٌتی -nee -toenmalig -diventato -mellettem -след -tikt -rae -اللتيا -ταυτου -ama -کرًب -얼마큼 -반대로 말하자면 -mü -کدام -mí -каква -nestačí -általában -ведь -nadie -dulu -naponta -avšak -azokért -jemandem -jälkeen -steht -साभ -dár -degl -本身 -aber -cine -öz -ئێوە -如此 -صفر -だっ -behövas -เดียว -oraz -خگہیں -dan -hei -mode -conseguim -sesekali -omalta -minyak -eas -wherein -যেমন -... -musíme -خیاه -bunları -niinä -kļuva -بگیریم -ngay tức khắc -بندي -رکھتے -dibuatnya -mempunyai -निर्ण्य -反之 -کنید -chuti -mikké -يك -mukana -ωσοτου -kratka -เพราะ -ফলে -دونك -ا -oufed -näin -starei -estiveram -চায় -mă -niektoré -vagytok -kata -olduğu -ваша -ingenting -گرد -satu -jaki -njemu -اعادة -ouije -kichen -mellőle -zouesk -opening -seinem -עליך -腾 -μεμιας -hatodik -mindent -avessimo -لدى -mout -пятый -тут -জানিয়েছে -কিন্তু -ie -comparable -αλλοι -εἰμί -kļūsim -ако -cărui -onin -fler -suuri -toe -makin -tinggi -sabe -himse” -similarly -patra -непрерывно -tuolta -daß -gellout -seguito -jinak -starete -permet -που -supaya -keittä -година -birice -ще -そこ -orada -تولِ -말하자면 -conselho -પાછળ -ف -etwa -zodat -minder -top -împotriva -undeva -কখনও -ci -两者 -pire -و6 -till -ते -nionde -також -hangisi -leide -absolument -ειμαι -kiu -nemeti -sub -menin -kaum -môžem -njegovo -tengah -قصدِ -zivout -dre -solo -ئەوان -лесен -こと -נו -njun -tw -c'hwec'hvet -كان -allt -ضوچو -بە -eight -memes -attendu -vije -понять -consigueix -aangaande -hemzelf -ditu -quarante -કેમ -apoi -virs -巴巴 -nálam -sejam -باید -kesken -কয়েক -哪儿 -hattest -petra -saling -нередко -moram -某些 -trumm -d -næsten -önre -jika -buhezek -who's -누구 -εαυτους -उनका -realizó -kanýmca -ราย -هستی -ایطے -zeker -suntem -novy -euren -ثراں -wechoù -ćete -facessi -tots -4 -svojich -hiçbiri -tagen -ειχαμε -ditanyakan -oamp -τετοιους -anyway -dreistañ -meantime -پێش -nám -il -त्याची -patrulea -tepat -avesse -ouijemp -most -として -şey -ale -反而 -dem -mustnt -ετουτων -οὓς -diese -ĉiun -lejpus -inginkan -मी -้ง -তারা -tjugoett -trošku -چھوٹب -中 -olur -tavuosius -उसि -nemedon -归齐 -ہوبرا -honnan -মধ্যে -четвертый -kept -verdi -진짜로 -houverá -td -сторона -manàja -puts -mucha -recht -ke -sig -yao -azirazi -jeder -dreistomp -clearly -ri -بودن -good -uhr -αυτες -nosotros -sedmnáct -mengenai -sắp -trabalho -tema -nin -fut -لا -media -συνηθως -divers -그러니 -本地 -kterou -anàja -dig -hiç -mogen -zusammen -mukaansa -becomes -apat -nyolc -tien -h -joks -noi -왜 -voient -vašim -dtí -tale -이와같다면 -lik -ia -előtt -আছে -非独 -musi -مختلف -sechste -jeg -kadar -niemu -berikutnya -kerta -نیست -ensi -नीचे -albo -seperti -kdorkoli -随 -acep -helst -λιγο -tulisivat -čomu -ua -kuin -quelle -було -rem -enam -rólatok -estlamm -庶几 -tiende -哦 -then -kõik -suuntaan -虽说 -nekog -vanwege -line -won -tamen -∆ικους -jumyse -peder -بيشتر -sistema -другой -mojimi -estoy -dreist -zelfde -ہورہب -ταυτης -hulasaten -τῆσ -solos -cuns -holl -toa -or -rajen -tuyệt nhiên -pod -formerly -també -potentially -ăla -sembra -город -vefed -msie -în -હવે -형식으로 쓰여 -以及 -ομωσ -غبیذ -nemeto -itt -c'hem -ngõ hầu -હો -ch: -ωστοσο -kvina -jompikumpi -kio -ὅτε -sen -δή -일반적으로 -ایک -akkor -ang -andere -同时 -pieneksi -ud -touesk -hvornår -abu -کند -tvojej -自身 -deires -بکن -choa -оба -demin -malgre -pr -quals -tamam -জন -જાય -10 -joko -તા -quinto -함께 -cr -hennes -kejže -هیری -उंहिं -होने -moo -svojím -har -čiu -смях -cây -কিছুই -করেই -ik -text -nästa -selamanya -ref -গিয়েছে -ile -avevate -αυτην -paèiam -ve -eden -kısaca -batzuei -chui cha -ولم -mr -többi -bất chợt -ṣé -iso -כולם -quáis -εμπρος -custa -dalawa -lles -eusses -kétszer -کس -li'n -akého -honderd -keressünk -kumpainenkaan -iekam -rejod -előletek -gb -morgen -کَی -двенадцать -tất tật -mögülem -mitől -olduğunu -facessero -nincs -إِنَّ -եմ -আই -равна -ι∆ιους -থাকায় -useita -överst -chung qui -নাকি -hajamos -além -acei -εισαστε -ako -podriamos -kaysa -pekçe -ثبلترتیت -t's -如何 -gott -여보시오 -you've -lor -sinilah -certe -های -ε∆ω -budeme -καίτοι -αυτος -kihez -mibe -régóta -sebagai -داريم -indietro -nay -seseorang -bernilai -birisi -onlardan -هوکٌہ -ι∆ιως -diversos -kratek -کردم -thật lực -ετερου -بخواهند -这么点儿 -avemmo -proche -этому -宁肯 -tempatan -až -하자마자 -eines -آباد -olisimme -kewangan -دادیم -quienes -ই -bằng -ponovno -> -kanino -τουτου -کےثعذ -jullie -they'd -edelle -natychmiast -wao -μιαν -cite -aurai -اللواتي -bahwa -יכולות -dezoito -vefec'h -keñverius -uutta -naturelle -chết nỗi -uudeksi -herkes -aujourd -tuoi -lahat -exterieur -bine -annetteva -shouldnt -حسب -quatorze -这么 -hubiésemos -hány -εκαστοι -będzie -niye -nosos -itin -piglia -وضع -αἳ -要不 -tavimi -estados -bonvole -ještě -meme -hemos -vielem -plein -follows -हें -жена -μητε -ми -meskipun -putini -diakhiri -förlåt -αναμεταξυ -ið -тебя -obviously -дали -εἰ -noua -sok -fummo -well -tjugotre -jím -שלי -कोनसा -şeyi -iki -lahki -longer -즉 -mdogo -تٌہب -quá xá -dibaoe -szervusz -cuántos -使得 -prije -sejak -なる -دادید -aquél -ket -ec -pored -का -jesam -supren -хиляди -when'll -sau cùng -kuit -tilbake -memestra -trong -不但 -svoje -hemengo -neke -tillsammans -ńlá -emaint -اکیلی -flere -contra -nostre -citiva -din -therere -szíveskedjék -horko -יכולה -máme -имат -aes -لی -kerran -sav -ديگران -দিয়েছেন -toti -nitton -有的 -bona -এরা -นั้น -συγχρονως -heille -यिह -onia -लिए -그에 따르는 -জানায় -저것만큼 -área -amely -habían -darfst -τουτην -berlalu -lalu -sehr -저 -جمعا -ataupun -توانید -azokból -dipersoalkan -不光 -gs -而后 -etcetera -někdo -μου -sewaktu -phỏng như -наше -къде -seves -cơ chừng -গিয়ে -krampouezh -총적으로 보면 -રહી -pertanyaan -eues -kolmas -خواستن -lesquelles -akomže -njeno -halunnut -altrove -εισαι -하는바 -varējāt -bapak -त्या -próprias -deci -быть -докога -azonban -庶乎 -περὶ -કોણે -wem -하구나 -fuimos -auxquelles -hasebiyle -undoing -bilcümle -bari -önöktől -olevat -szerintetek -fûmes -pedig -gegenüber -sus -noiz -دهم -ایا -näistä -diferentes -ફરી -nejakých -吧 -करून -daarom -dister -dnes -sekuriti -ただし -neredeyse -一来 -trede -zweiter -berapalah -eigenlijk -öyle -mensch -anno -নিতে -accordingly -dj -samallasta -ès -नहीं -vastan -하면서 -mengerjakan -obtained -ہورہے -说 -不是 -तरी -quarta -이 밖에 -لوگوں -rondom -successfully -estéis -nuestra -고려하면 -внимава -generale -سایر -agregó -tienes -thế mà -למרות -gah -treilea -dehogy -triplo -jepun -한켠으로는 -naše -οπως -samaa -azalek -sebetulnya -들 -c'mon -する -dirazor -thing -tobě -∆ιαρκως -teissä -거의 -путь -bằng ấy -καποιοι -عشر -geht -can -χθες -buono -とも -نظير -então -それ -viktigare -meus -quibus -zult -musste -seingat -তাঁর -überhaupt -তারৈ -avresti -twoim -કેવું -حين -sillä -માં -tosiose -snart -כפי -mere -콸콸 -poner -מקוםבו -najino -politik -мокър -точно -derken -কোনো -ul -seluruhnya -خویشتن -vreo -ăştia -outside -china -dầu sao -jieji -будешь -últimas -entre -niste -असलयाचे -daher -první -بیاورد -زقیتیں -나머지는 -논하지 않다 -كرد -并且 -kerja -dije -same -봐 -máte -αυριο -mulai -bym -vás -ωστε -اکیلا -thường -hozzám -jauh -لكما -且不说 -cuma -لیں -일지라도 -menjelaskan -sincere -hendak -k: -など -másodszor -rakan -choć -нещо -нибудь -schon -alám -savajam -hadapan -درون -however -לכן -miatta -বিষয়টি -okay -습니다 -nade -پبًچ -رکھب -gets -turning -mykje -total -xa xả -بهترين -κατι -uns -menanti -lenár -старый -ons -artýk -bodo -います -ţu -לא -done -daqueles -citi -goods -へ -perlukah -ειστε -था -eurer -lest -pembinaan -jedno -đến -hiziviken -등등 -بلى -ooit -tot -जैसे -blizu -benim -şundan -tegu -taki -avute -zdaj -åt -ðiosiose -kvůli -hep -rather -امروزه -hat -nåt -ukuthi -ná -kiun -基于 -ここ -trois -včasih -همچنین -usan -szerbusz -doorgaand -binaen -näillä -chun -iţte -system -apabila -kimden -dëka -αυτουσ -seven -οὕτω -chceme -hoàn toàn -tj. -adrede -حق -hozzá -kyse -tady -час -করছেন -samoin -vannak -berkehendak -siz -ثٌبًب -até -eerste -podľa -tanta -ninguna -comparables -по -diouti -cat -curînd -menivät -xoẹt -περα -υπερ -إذن -vaak -deuxième -πουθενα -인 듯하다 -هاؤم -τος -nyatanya -consecutivi -diibaratkan -زمینه -zunaj -werde -miktől -gl -으로서 -katra -ειχες -لن -itseään -d'al -chẳng lẽ -akými -nikjer -ezen -arabera -dēļ -ends -droite -habíamos -именно -惟其 -taas -you'd -해도된다 -perkara -cel -mojou -meille -آیب -bây chừ -اطراف -หลาย -然则 -وقف -εξης -ebenso -وسطِ -俺 -afec'h -fj -بگویم -parti -chuig -jenom -같이 -azok -mellett -lec'h -była -nicăieri -necessairement -velhasıl -promptly -ام -અહીં -less -use -bagaimana -هەر -تلك -näiden -dibaot -ordering -berdatangan -συχνην -は -ثبہر -différent -टा -cổ lai -nich -从此 -vooral -nghiễm nhiên -έναν -avulla -unanig -eer -sepertinya -добра -diventare -ثدبئے -сме -fan -större -vastaan -nejakú -kleines -দিয়ে -niin -doncs -dvacet -door -havia -teño -achten -sinulta -hirio -indonesia -اساسا -により -tikai -بیابم -blev -mir -what'll -τίσ -aceste -aangezien -sebutnya -dokler -mendapat -cuándo -tidigare -sila -ibig -terá -qua quýt -hyville -নিজেই -anderes -před -quest -aukðèiau -somme -goulz -tulleet -tavøjø -arriba -éste -kellett -older -ثرآں -étée -perkhidmatan -erfin -تَيْنِ -որոնք -انها -ableabout -aniedvi -oss -ðiuoju -گروٍ -aucun -kettőt -dentro -csupán -any -ezeknek -atitia -intentamos -asioihin -할뿐 -aquelas -thương ôi -iti -taigi -۲ -tavo -সেটাই -haruslah -wieder -שלך -hablan -andre -fully -dasar -bấy chừ -seré -vian -часа -epeyce -πριν -douetus -ни -譬如 -لكم -自家 -didn't -followed -sup -nii -kenettä -poikki -επί -ἐκ -róluk -saremmo -بر -thực vậy -paties -viimeksi -اللتان -עלי -prea -بنا -waarschijnlijk -aimp -等等 -smaller -toho -nueva -siden -cezo -raec'h -depan -ger -meva -نداشتیم -اختتبم -differents -our -趁 -kenkoulz -indem -ðituodu -sonst -eveldoc'h -jemu -csakhogy -minut -حال -kto -અમને -本 -sesegera -tvojimi -ellette -what -który -uþvis -παρα -바꿔 말하면 -mnie -dindanomp -közepesen -allem -hetven -thousand -vós -doug -また -만일 -moramo -når -certains -因此 -twice -acele -никогда -επι -خیطبکہ -此 -dk -save -kecil -tentei -marapat -בין -tizedik -krachtens -همچون -mittemot -آمينَ -savajai -μονην -давати -sela -dở chừng -gueno -tengan -ki -εκεινου -vášho -kumuha -چنین -ante -può -tilstand -masyarakat -বললেন -شدید -två -memulai -partendo -häneltä -so -mimo -نداشتند -multi -вернуться -ro -kvankam -tiste -eveldon -apontar -всяка -مجددا -আমি -πρὸ -birdenbire -igazán -মতোই -چنانکه -cominci -novas -púpọ̀ -δὴ -viac -ahí -neun -بلكه -m: -tena -vsakdo -меньше -kommt -아니었다면 -diganeor -thoroughly -ihrer -neko -segunda -μα -صورتوں -akár -após -아이고 -하지마라 -kailanman -unses -horas -接着 -oleva -થયો -岂但 -nr -哪里 -c'haout -rejomp -兼之 -بخواهی -mera -呜呼 -πιθανον -بخواه -nenion -consigueixes -своих -remarquable -ketika -berubah -hyviksi -kdyz -zehn -mindig -seorang -bất tử -mezzo -گيرد -নতুন -anyhow -পরেই -nado -toiselta -καποιο -toţi -bijām -houveram -sembri -zadnji -varten -jak -참 -lidt -manches -d'ober -nocoj -available -pakosti -מחוץ -thi -mitään -auront -uu -asiasta -jàjà -kratki -dieser -moja -также -egedon -dolgi -prest -hubieran -کطی -ellen -lähtien -stort -em -mně -darf -kutoka -انشاالله -desse -тогда -při -solcher -—— -सुरू -갖고말하자면 -antaño -bonan -می‌شود -મને -kima -זה -podia -aren't -aikajen -docela -font -れ -করেছে -neseser -suis -까지도 -comprare -około -ἄρα -bakal -hayáis -tàsias -femtionde -tobie -اچھی -случай -pořád -ετουτους -tøjø -pamoja -thậm chí -rajtunk -seras -enta -hervez -usai -এটাই -alem -ضلطلہ -ًہ -reor -冲 -ذلك -περισσοτερο -せる -ţi -hoćete -אבל -دهی -should -his -tell -μὴν -دار -поза -jel -γοῦν -السابق -hogy -habang -beri -ει∆εμη -mga -ک -halua -mem -ennor -god -стать -양자 -pendidikan -desde -رویِ -skąd -onca -بنابراین -unele -são -ponavadi -harmadik -jelas -shouldn -avendo -paìs -lakhe -इसका -jûsiðkë -بخواهد -તમે -avremmo -hurrá -ceathair -varifrån -neednt -إياكن -tomto -sarei -chacun -she's -mac -mijner -sabah -somethan -nebeutoc'h -vais -ثہتری -pok -bersiap -nostro -આર -بەلای -habida -enough -دلچطپ -किसि -stette -fun -pikol -podle -یافتم -gayetle -cho tới -proc -new -whom -لەنێو -riệt -ouverts -beginnings -мога -بيش -kikért -بیابید -∆ιπλα -existe -stlabezañ -لَسْنَ -samallalta -tse -njihova -hasılı -겸사겸사 -nyolcadik -5 -'twas -换句话说 -given -gast -musst -tetapi -دیگری -kendi -હોઈ -হত -maintenant -તેની -تێ -t -azirazañ -miattunk -mereka -náà -ολος -cha chả -nz -present -이 때문에 -olet -pevar -bertutur -pa -tivéramos -কেখা -celà -վրա -petiaoul -결론을 낼 수 있다 -tc -哼唷 -kuitenkaan -respectively -digor -لیٌب -ketkä -이러한 -llarg -chaque -binaenaleyh -hu -قدری -luar -diperkirakan -همه -まで -تلقاء -dreistout -زیرِ -einem -zehnte -vagy -tys -قجیلہ -će -welke -vooruit -właśnie -maakt -μια -uomo -مه -do vậy -日 -revoici -manapság -dort -কাজে -kļuvāt -pak -drept -dürft -chú mày -peur -sienne -ph -comunque -dahinter -نشده -بعضي -επ -asalkan -semaunya -داشتی -shi -parece -হলেও -iu -গিয়ে -કરતાં -yetmiþ -jeji -چبہب -bijāt -کنم -فلان -siapa -ตาม -oradan -吱 -wielu -برابر -если -niektorej -atd -aquéllas -menschen -สําหรับ -κατ -iyice -jsou -azon -แบบ -ἢ -这么些 -ðiaisiais -întrucât -siellä -afterwards -шесть -manasis -hadn't -咱 -mikhez -они -tuossa -allà -antarabangsa -zal -amelybol -kami -już -hed -dix -بعری -kalian -entinen -بکنید -نداشت -pelos -có thể -tão -mac'h -hitaasti -mainly -इसकी -finds -tedy -سراسر -isku -bazı -pevarevet -tapt -outi -ваши -medan -جايي -oar -ălea -r -ningún -c'horre -esta -avere -خودش -واقعا -۵ -rafent -environ -bỗng không -هبچ -gäller -många -lt -th -slutt -因着 -برخوردار -tohto -connosco -volta -하려고하다 -휴 -tendrías -tuvisteis -trillion -dẫu sao -で -τα∆ε -ennek -dieses -avoir -이곳 -erre -둘 -ktorú -el -tato -ποιεσ -nell -کیلئے -excepté -b: -jag -tizenhét -varēsi -الذاتي -của -sebab -evidomp -πλην -eravamo -estarías -aktiviti -とき -avez -היכן -masing -tabii -bởi chưng -যাতে -varken -tàja -dalgúns -もの -mengetahui -hyvää -damals -exact -än -זאת -fussiez -あの人 -overigens -с -ettől -rá -naquele -anybody -polo -ли -तिसे -staranno -kepada -۶ -nu -contain -cin -wszystkich -jiedvi -душа -tente -هسترهہ -tuy nhiên -bir -أوشك -کرتب -približno -свою -ajed -즈음하여 -embora -दूसरे -navn -kje -fue -cara -দেওয়ার -inuti -拿 -tredje -دیکھو -رکھتبہوں -quanto -menurut -heñvelat -gein -tadinya -કયું -ra phết -lasciato -vuosina -sitä -مجانی -οσους -tỏ vẻ -तिन -لێ -i.e. -siapakah -tavas -този -solament -ημασταν -ebbi -만약 -خواستم -เปิด -કયો -più -그래도 -하하 -خودت -nála -tizenegy -છું -through -待 -pienelle -харесва -voilà -dreisti -בגלל -meu -caoga -لەبرێتی -혹은 -一些 -বা -hoc -শুরু -zar -goes -বলে -pt -bệt -cand -merosot -heverk -不过 -faz -شده -others -fuésemos -tivermos -cho -nantinya -become -voed -ny -diouzhor -itse” -ih -trenta -deja -ziwezhañ -τετοιον -mesec -مانندِ -بعد -nejaké -লক্ষ -störst -এখানে -为此 -nghen -pemberita -szerint -j: -trừ phi -ouezimp -sete -a-lô -گفتند -게다가 -over -eddig -mar -ἅμα -indeks -mayor -voivat -ديده -zouden -kawasan -bovengenoemd -spoedig -tutta -sejumlah -эти -সাধারণ -consider -superpose -negara-negara -innych -opt -bar -یابم -stavamo -월 -how -oled -memandangkan -possibly -existen -czy -bỗng chốc -other -stai -directement -或 -value -demgegenüber -promesso -súas -之所以 -tebe -μή -بیاوریم -بگیر -melyek -گرفتن -کرتبہوں -každou -maaari -ત્યારે -alikuwa -toẹt -ye -few -siitä -প্রথম -intentais -उनको -ồ -nama -sämre -lassan -więc -auch -син -ổng -ضکے -natürlich -ところ -gayri -puolesta -edo -нов -بگوییم -οσο∆ηποτε -لئن -singapura -других -abbiano -wengine -daveti -coi mòi -هَيْهَاتَ -~ -bé -parlimen -maiorias -դուք -sit -कहते -ilman -بیشتر -deseto -cật lực -sokszor -thatll -ほか -oboje -will -જેને -ĝis -alleen -takia -xăm xắm -leun -mana -کامل -свое -denen -dreistoc'h -gehad -hajam -katakanlah -ðiosioms -siis -maior -wasnt -ba -tidak -می‌کنیم -آج -те -amelyek -großes -point -بزرگ -로부터 -abiejose -kaynak -немного -elke -somente -against -εαυτον -sreda -бъдат -جگە -aloitit -sed -لَسْتِ -οτι∆ηποτε -ολονεν -menuju -κοντα -sarili -інших -non -d'uns -焉 -와아 -ثلٌذ -বদলে -toată -onkin -nimi -našich -ضبرا -there'd -elé -再有 -doch -uusia -삼 -joudutte -добро -contre -hoặc -grouped -oufec'h -fünftes -omilta -हजार -jos -successivamente -bet -ઉપર -hubo -menuturkan -kimse -করেন -være -βεβαιοτατα -다음 -niektorého -diventa -8 -dess -seitsemän -pertumbuhan -այն -njej -çoklukla -ją -z -état -ετερα -diketahui -pripravljen -девятнадцатый -nếu -لَعَلَّ -takich -zou -איך -três -dear -berawal -fuiste -其中 -cô -itaas -এঁদের -svojim -mendatang -الألاء -iná -soient -كل -πλεον -היא -sebelumnya -máximo -tiếp đó -아 -kikről -خارجِ -dus -diberikannya -nema -seperlunya -kaþkokia -hivyo -nhất quyết -vad -dindan -对于 -wäre -altfel -estaríamos -thế thì -сколько -úi -josioms -kurz -jis -هناك -čieho -তুলে -别人 -niciodata -亦 -przez -zehntes -kdy -yerine -hein -mind -bovenvermeld -জানানো -byl -αργοτερο -laporan -åtta -これら -contro -哎 -την -કર્યો -οὐδὲ -توانستم -ناگهانی -کسی -önben -ren rén -thế nào -places -그리고 -kļūsi -bezit -sia -przedtem -다시말하면 -táto -mz -next -damdost -গেলে -emezi -tvojím -čom -zero -hulle -یا -parted -schlecht -ouf -перед -bundan -inter -entisten -আপনি -בשעהש -cam -ہوبرے -katerikoli -chỉn -કઈ -gives -наконец -від -náš -નું -mene -newer -náluk -minussa -) -كَأَنَّ -diğer -але -vẫn -kilencven -کە -uusi -tímto -hango -fifty -iedere -رفت -rik -nokre -josta -deveto -etti -halló -ممن -بودید -ouvert -바꾸어말하면 -ei, -joji -veeleer -занята -roimh -일곱 -tat -chaous -lîngă -podeu -идти -মধ্যভাগে -milloinkan -jûsø -második -εξ -داشتم -কমনে -ڈھوًڈی -عليك -tegenover -du -huku -mendatangkan -muj -которой -weil -manifestó -laez -ہوں -alies -він -અંદર -semasih -şuracık -étaient -padal -بالطبع -يوم -этих -fünfte -би -nd -тях -doğru -diketahuinya -نوعي -向使 -later -رويدك -keluar -slik -παντοτε -idén -jumlah -acelea -după -yaptı -vont -davedoc'h -hemañ -kusho -bominapl -gounnar -that've -과연 -altmýþ -تر براساس -taisiais -jseš -spririñ -ολοτελα -دوضروں -kļūstat -برابرِ -σχε∆ον -lại -لما -হবে -要么 -certamente -tuvieses -je -mij -hamar -dimp -소생 -پہلا -τελικα -याना -afemp -ποτε -kenties -miał -tizenöt -mag -yleensä -কিছু -avons -namun -uguali -reas -啥 -ðiàjà -بايد -통하여 -enno -načež -استفاد -nosso -tandas -λιγωτερο -首先 -backward -한 까닭에 -fosse -anuodu -पम -এতটাই -estivéramos -eveneens -azokról -그 -může -tíz -fomos -ouejod -хороший -zaprta -palabas -bất thình lình -برایِ -不得 -mikért -τετοιαν -habrías -sorry -haver -hirtelen -z: -tulisit -ciebie -سالانه -ওঁর -leda -şuncacık -vsaki -jutri -ciertas -tenías -ผ่าน -pripravljena -کرده -stumm -经 -niektorému -gdy -dei -anumang -thoắt -cx -cio -koderkoli -ին -aj -توسط -estos -ἂν -balra -ga -werder -posto -jalan -другие -zarfında -toisaalla -زود -hierbeneden -per -sizin -# -أنت -बनी -that -prej -fuisteis -thì thôi -vaan -होति -vuestra -mendapatkan -marec -خططرذ -واقعی -کاملا -quinze -ejont -সেটি -magukat -ক্ষেত্রে -glielo -vem -打从 -pero -عليها -딱 -elsewhere -tentaram -smått -sinua -ves -kieho -tienen -dobra -despite -kam -why'll -hendes -encara -ολογυρα -disterañ -előlem -selama-lamanya -dël -pengerusi -थि -zr -şuracıkta -એને -نخواهیم -لوما -stille -lennék -cùng cực -놀라다 -般的 -málo -حوالى -ouzhomp -προς -لەرێ -μαλλον -ðitas -ơ kìa -alólad -malam -ðiuosiuose -علق -búcsú -teto -inému -خوکہ -इस -조차 -باشیم -یافت -किस -houve -لات -ettusen -jemanden -ًئے -нужно -youngest -re -গেল -compris -kone -pareho -biraz -jij -kenestä -οὐδέ -هسیذ -来 -eg -tizenkettő -실로 -οποτε∆ηποτε -فيه -诸如 -muulloin -poderá -beş -بیابی -ilagay -keinginan -啪达 -autant -nors -zem -هنا -vis -eleven -asking -azoknak -afe -resulted -hicieron -tenham -而已 -puţina -nepre -ι∆ιο -walaupun -esteu -ylös -uneia -ποιαν -mig -那里 -dëlei -על -બે -yksin -ماانفك -vu -drittes -wenigstens -nítorí -বি -raok -sådant -একই -egész -beginilah -dobro -કાંઈ -nevez -posição -estadas -semblable -למטה -lhes -yksittäin -mañ -tersampaikan -nella -그렇지만 -érte -habidas -mince -કર્યા -genom -哎哟 -toisen -shall -더불어 -would -semblaient -krec'h -mahkamah -فقط -когда -pff -fleste -نبود -ذِي -tandis -μπραβο -ψηλα -tajam -valamelyik -peniaga -οτι -yangu -tjugo -waktu -な -یافتی -iekš -jeigu -tiverem -اخلولق -οὐδείσ -secara -cogli -announce -muy -dindanoc'h -τοί -kuinkan -unser -عَدَسْ -tovább -kamēr -vừa -hacen -prestasi -sa sả -hanterc'hantad -ouzhor -jona -voltam -zece -aje -etc. -بل -甚至于 -jm -cikkeket -para -через -vaikeilta -visto -nimic -tiempo -luogo -借傥然 -caption -interests -ketä -envers -néanmoins -alguno -oba -مع -inapoi -της -savàjà -ditt -mussten -প্রভৃতি -sekurang-kurangnya -gibt -tobą -mês -omissa -muchas -panevedeoc'h -bức -nagy -doon -তাঁদের -以便 -aluksi -does -сами -paèiuose -haluton -četrtek -nödvändiga -ধরে -hocht -zawsze -રીતે -yalnız -trzeba -ouijed -那么 -এমনকী -نه -внизу -menossa -troisième -એ -brutal -ظاهرا -kumpikin -njen -cậu -often -أن -thoughts -因为 -regennoù -tiki -siguiente -älä -ક્યારે -pribl. -ez -hátha -nígbà -memerlukan -ei -tuodu -így -знать -hent -uma -ko -haces -dagen -kubwa -tends -ايشان -davet -şunu -אותן -anàjà -vart -کت -હું -иметь -ainoa -чему -res -értem -εκεινους -hänelle -ένας -سوی -kanssanne -aurez -anticipo -innen -ενος -outras -sétimo -dimulailah -menggalakkan -został -ugent -bác -chik -quindi -几 -bennozh -tavosiomis -diungkapkan -erem -kinilah -berkeinginan -कहा -недавно -room -będą -sagt -считать -taèiau -تلویحا -τοιοῦτος -terkira -mnogo -〈 -savojoje -when's -fra -multiple -tana -rond -vahemmän -sinn -ihn -kokonaan -їх -sesama -annak -kerajaan -ieder -μονοι -emot -ónár -мор -widely -hormis -douez -relativo -둥둥 -şöyle -ouzer -رریعے -ًے -hỏi -delas -nǹkan -加之 -diverse -unde -રહ્યા -당장 -rankout -overal -אך -suatu -josios -sekitarnya -abipus -yine -lep -κακα -unlike -винаги -cadascú -dat -meiltä -hin -esempio -vijec'h -been -toki -ι∆ιας -forward -namely -سنة -iekšpus -jẹ́ -ব্যবহার -virviken -durchaus -εις -tegasnya -شوند -各 -네 -juu -لوسبت -бивша -だ -할때 -vậy -suyo -leuskel -araozañ -fm -their -todo -кого -nabanggit -entisen -zwanzig -lieber -továbbá -tässä -е -よう -تواند -up -μακαρι -sedert -there -αληθινα -jedynie -正是 -joista -ebbe -전자 -dirazout -giving -amat -tenir -самой -industri -שלכן -dzisiaj -mengakhiri -fii -estuviesen -vardı -cadangan -ویژه -ngăn ngắt -kerjasama -bất kỳ -ọjọ́ -οποιες -버금 -我 -توانستیم -ส่ง -vão -doe -으로써 -various -दबारा -perdagangan -azirazor -wed -niektorý -коли -asia -nur -ほど -podeis -ہوتے -ŝia -should've -얼마든지 -posupl -至今 -nekem -vielleicht -tarp -vinte -ว่า -ι∆ια -met -সবার -chết tiệt -dürfen -somewhere -τό -yourself -erstes -ide-оda -ðisai -memihak -estuvimos -heul -tuto -kos -이만큼 -mgr -morem -某个 -akom -روي -οσους∆ηποτε -żeby -kumpi -αυτου -многочисленное -엉엉 -proses -apatah -soltanto -tendríais -tuviera -hozzád -seen -tiens -deshalb -ordinal -صورتسبل -moniaalla -neunten -هڑا -terjadi -dadurch -mie -yedi -abans -જોઈએ -uram -dialah -o -elsõ -jájá -ahmad -nič -näissästä -patnáct -twee -entweder -aan -one's -berturut -咧 -동시에 -sitta -laquelle -别的 -rechte -všetci -mennyi -september -provided -cơ hồ -گردد -nášho -açıkçası -هطتعول -hanem -στα -বন -نزدِ -seurt -fk -estas -ωσ -erano -ดัง -allora -seem -deoc'h -근거로 -راح -sixty -erster -torek -necessary -lehetőség -ô hay -tine -nostru -dijangka -结果 -别是 -ďalšie -إي -uw -ظبہر -körül -varēs -谁料 -maak -셋 -voastre -pro -어떻게 -তিনিও -כן -kiért -ialah -الذين -estivemos -takze -কয়েক -još -حدودا -dễ sợ -velhasılıkelam -вверх -glan -أجمع -moniaalta -थे -avranno -besten -което -quite -täysin -enggaknya -tegnapelőtt -لوكالة -जैसा -facevi -emezomp -jeres -решить -더욱더 -rén -zaidi -četrto -terlihat -kie -שלהן -vendar -dies -esam -ἐγὼ -quando -tými -aloitimme -mu -なお -就是说 -چیست -ouste -seizhvet -若 -emaomp -另外 -hozzánk -تنها -seriously -iným -harz -วัน -преди -iyicene -vefemp -作为 -ετσι -제각기 -其它 -کیطرف -হয়ে -کم -godast -seria -új -کھولیں -তাতে -sie -ensimmäisenä -trei -edod -navet -此地 -جاي -todos -never -어때 -sinjorino -ezután -সেখানে -dich -각 -sam -hubiesen -teil -solche -hore -estuvo -کہ -iyong -kļuvi -pět -claro -disse -inuu -معاذ -قال -因了 -mac'hat -pataas -کنیم -ilk -ellenére -no-one -avuta -gana -cm -মোটেই -لمّا -towards -הנה -ازجمله -يكديگر -vagyok -тук -havas -αλλο -bane -آهاً -varsinkin -stavano -imorgon -hadde -pek -bao lâu -اچھب -tatlo -samen -datang -mina -toisemme -نخستين -menandaskan -gf -หาก -gunakan -vaikka -هلا -alólunk -kentoc'h -— -pababa -posso -azokkal -helposti -chci -això -chut' -ring -anuosiuose -usefully -szívesen -आप -шестнадцать -kendilerine -ًکبلٌب -emaout -jelaskan -ezekről -要不是 -بان -kiranya -ask -طي -af -legat -zenbait -näitä -begitulah -tàjà -делал -aquello -کبفی -tuj -كيف -mio -malantaŭ -ecco -τουτη -aies -内 -empleo -araok -restent -mâine -vos -lesznek -manuosiuose -ετερους -એવાં -oriunde -ginagawa -dość -đến nỗi -پیشِ -korf -sokkal -रहा -כאן -voy -遵照 -kdaj -мимо -suivantes -pertanyakan -men -hay -كذلك -câtva -hubiéramos -younger -mat -别管 -虽然 -crac -whilst -ваше -mengikut -herhangi -nerden -τωρα -numas -या -minél -կամ -তখন -warum -semua -mumyse -非特 -ثلکہ -诸位 -bist -coś -という -kan -p -bliver -czasem -acel -säger -hare -nödvändigtvis -ra sao -հետո -kako -نداشته -wasi -전후 -näiksi -μὴ -десятый -dritter -سَاءَ -ذواتي -approximately -beyond -kol -tahu -tavaisiais -lors -joskus -сама -দুটি -即如 -跟 -tenían -tar -şayet -tít mù -yo -cadascuna -多么 -ister -’ -kim -tapauksessa -belénk -nunhas -dirak -সহিত -روز -ingin -idir -совсем -moeten -જી -yours -বক্তব্য -laoskel -کہتے -nesses -সঙ্গেও -haar -stiano -كنند -demselben -teringat-ingat -göre -gwezh -बाद -made -buenos -дверь -rupanya -debaixo -それで -可 -varsin -ندارم -不怕 -deinem -keskimäärin -siebenter -grupo -fazem -утро -últimos -ที่ -mendatangi -जिन -bakalan -mateixa -zein -voie -بێجگە -کررہے -seri -ochtar -öylece -však -dit -ay -گئی -nakon -mai -মনে -لەسەر -njezin -bra -إياكم -চলে -میان -någon -hani -tojoje -μονες -κ -inginkah -thảo hèn -eussent -ili -saj -ض -מעט -åttio -wasze -volgens -едва -ও -segera -manas -lesz -bună -handiyse -زبلیہ -rafed -بروز -તેં -według -последний -استحال -ee -bremañ -wieso -akú -щом -naju -自 -сред -fuesen -إذاً -primer -矣乎 -jonka -گرفتی -añadió -på -egetañ -δι -더욱이는 -sistem -eramos -甚么 -نوع -лет -bởi vậy -giz -acestui -προκειμενου -otherwise -इंहें -sokan -随后 -on -since -εστω -elől -cho tới khi -c'hwi -อีก -hanterkantved -esimerkiksi -тобой -ορισμενως -sinun -bout -가 -aio -αφου -밖에 안된다 -teuteu -manim -tốc tả -oc'h -tahansa -بما -鄙人 -ساخته -atras -terceiro -hasta -elleni -iguals -による -aikaa -ant -suoraan -böylelikle -来说 -my -sonradan -لەرەوی -kitalah -لكي -reer -ι∆ιον -gjûre -november -ebbero -מעל -möjligen -ba'l -kommen -által -כי -вдали -tie -cioe -εκαστου -pep -همچنان -αρα -before -auriez -ὅπερ -mellőlünk -হয় -알았어 -mei -bunda -বলেন -nouveaux -hyvien -vse -biskoazh -שלנו -বলা -musieť -nær -nejau -एवं -إياها -estivestes -phốc -zprávy -کنارِ -facevano -چند -serán -کردید -ed -forrige -ὅστισ -بارة -شان -cedo -senast -karamihan -দিয়েছে -ايام -هنالك -εαυτο -করি -इतयादि -häntä -allebei -havos -الاخيرة -waduh -ذوا -hubiste -você -kuri -而 -halusimme -berlebihan -хоча -những ai -아무도 -pokud -geschweige -möjligtvis -پل -だれ -čo -几时 -perfino -ypaè -કોને -nulla -consigueixen -iv -できる -अत -deasupra -tapsi -جعل -عدد -едно -три -touchant -ある -relação -sementara -| -kun -tendrían -tengo -pho -pozdě -مان -mersi -önért -pg -tud -weit -needs -gallout -pengarah -savàjá -ثڑوں -যথেষ্ট -prawie -darum -pagkakaroon -stareste -6 -ככה -总的说来 -quod -steeds -estão -чтоб -stia -에게 -bermacam-macam -ona -bấy lâu -quá -irgi -εκει -ðiuodu -gwig -quattro -gu -получить -kik -ihren -минута -այլ -यानी -گویم -펄렁 -euch -lavar -abban -intet -इसमें -neho -해봐요 -দিলেন -måte -即或 -দেওয়া -açıkça -'zo -phót -إمّا -صهٍ -keep -ἑαυτοῦ -त्यानी -skoraj -很 -deset -বেশ -deres -τῆς -desta -minat -segi -sinne -điều -думать -hyvä -heñveliñ -budes -n' -kichenik -তাহলে -ondertussen -böylesine -intussen -ги -aceeasi -szerintük -قطعا -azokra -lätt -cuốn -koja -hers -cümlesi -헉 -dagar -elle-même -immár -unas -kaçı -nekā -program -ολη -ছিলেন -অনেকেই -basee -کررہب -し -öbürkü -tisti -bijv -어 -diwar -fakat -khona -beţ -ðitiedvi -રહ્યાં -habla -len -આવી -sama-sama -pai -d'an -כלל -tizennyolc -vimp -aquí -tampoc -gwechall -不论 -datorită -كسي -خبهوظ -رہب -اکٹھب -încotro -therell -τουτοις -אולי -wollen -palei -bisakah -chủn -عدم -trop -seharusnya -sea -pihaknya -leis -ολης -varēšu -pouca -علاقہ -itibarıyla -úi dào -झाला -self -who'll -saviðkis -muuanne -οποιος -celor -sjunde -∆ηθεν -був -দেখে -null -lia -कइ -tizediket -godz -kendini -bastante -habías -çeşitli -olé -bất cứ -lato -یہبں -رجع -sumber -каза -für -その -últim -למקוםשבו -nagkaroon -gentañ -է -mîine -önből -tiga -ξανα -שוב -ikkje -erittäin -toutefois -differ -egete -cả thảy -bolehlah -recente -دادی -всё -եք -auras -kement -hunne -quanta -eli -s -pumunta -περί -plok -zes -cui -семнадцатый -nasional -iný -داریم -it'll -嘎 -حم -if -pourquoi -ganze -prvi -впрочем -taj -quo -двенадцатый -där -dhr -diganit -犹且 -fent -with -براستی -свой -hakeza -einiges -semata -peringkat -用来 -하게하다 -∆ικου -너희 -sejamos -pun -seizh -इसे -och -такий -down -kiknek -kinél -bizce -тринадцать -ثہتر -莫不然 -iun -خودم -prva -soalnya -которые -ολου -každými -sacrebleu -ποσοι -către -deseta -nikoga -zadaj -sjuttionde -bilion -cu cậu -им -باسم -paremmin -خت -dessas -stessimo -κατα -ouezoc'h -להיות -另 -sade -오히려 -najmä -cind -طفق -szinte -tuốt tuột -presumably -tivera -всеки -con -četrta -hape -jedne -সেটা -alí -ilikuwa -всех -nostri -ngọn -diouzhit -días -kinek -areas -words -الا -εκεινον -把 -ημαστε -citta -خودتان -другая -ของ -αλλοιωτικα -verkligen -کن -tieji -dr -velik -fa -处在 -vaše -certo -alsnog -जा -azután -secondo -varējām -において -quais -dina -ska -paraan -niverus -છેક -dallo -nessun -www -emañ -gutes -bukan -pirmiau -uneori -নয় -čau -berapa -ทั้ง -ἡ -posteriore -哪边 -zwar -thái quá -io -پچھلا -થયાં -ðiedvi -چطور -zelf -myöhemmin -celle-là -daka -rögtön -peggio -툭 -juodu -vidury -col -how'd -dirimpetto -tvoji -کیطے -sobota -ceux-ci -setidak-tidaknya -مثل -selepas -alli -như chơi -hoch -cikk -kailangan -kementerian -ainakaan -raimp -상대적으로 말하자면 -menjelang -hans -hom -tiedvi -prečo -ouezint -بێ -malaysia -enquanto -bland -उसे -thếch -amidst -宁愿 -chacune -darüber -برس -estaven -그런즉 -saan -nedeniyle -aby -ellenes -may -তাকে -چەند -किवा -relativement -且说 -accordance -напред -fẹ́ -го -さらに -tức tốc -které -warnomp -[ -إلّا -can't -אם -usa -लिये -হওয়ায় -berdasarkan -اری -ôi chao -arbeid -keterlaluan -اٹھبًب -naš -할지라도 -hadnt -ثي -9 -těm -va -বহু -вокруг -benar -καποιος -জনকে -ئەم -οποιου∆ηποτε -gerek -phương chi -kýho -εως -bấy giờ -yourselves -كلا -만약에 -nhận -kenessä -aloitettevaksi -اینها -ητοι -rebus -w: -διὰ -vähintään -οὐκ -nơi -হলো -warnout -diperlihatkan -inc -gwazh -thoughh -velük -نداشتم -ana -dál -gwall -उनके -بگویید -oňho -ambas -rajtad -بنابراين -tänä -vale -ذيت -ほとんど -causes -dementsprechend -juist -થયા -대하면 -ακριβως -dekat -다소 -beberapa -tutti -bio -why's -ajent -tant -asal -આનું -呗 -voimme -minne -jàsias -ถึง -কেউই -nějak -precej -needing -ditunjukkan -bây bẩy -이번 -گفتیم -সব -delà -למה -ena -siten -hozzátok -ὡς -এত -cho nên -هختلف -biol -tới -it -fusses -אני -ibabaw -rare -thục mạng -derriere -била -puc -τούσ -teniendo -pn -पर -près -얼마나 -tikāt -鉴于 -cinco -લેતા -ezekig -dits -manj -pagkatapos -quin -eveltañ -tőlük -tenido -ب -pel -nebyla -būsim -themselves -usein -zijzelf -hago -näissältä -kuala -vive -låt -ضبل -εχτες -ungkap -他们们 -fostes -ernst -takého -podrias -tuốt tuồn tuột -ниже -значит -youd -könnt -vänster -ثبعث -reomp -कई -donde -burası -αυτους -edilmesi -توہیں -بیایم -mittel -popod -suggest -чрез -l'hi -pôde -hetkellä -waktunya -thành ra -izelañ -kes -olmaz -vems -moj -négyet -οσοι -мой -menette -છતાં -위에서 서술한바와같이 -etmesi -欤 -wakati -vierter -asas -druga -mens -هطئلہ -มี -ngesikhathi -better -wszystkie -chiar -until -μεθ -avete -に関する -ندارید -एका -заняты -beslutat -stando -rovně -ăsta -eilvet -preferibilmente -ない -vier -nagyon -jaisiais -tout -weinig -vom -moltissimo -מכאן -جلوگيري -总而言之 -نخواهید -اكنون -若果 -何以 -oranca -mare -siempre -∆εν -egli -tüm -一种 -előlünk -tas -olisi -ba'r -sinon -cũng vậy thôi -diesem -tapšu -karenanya -hierboven -koji -ravno -hervezañ -∆ικο -ταχατε -merekalah -chậc -noista -després -עצמה -ehrlich -کمی -tych -úi chà -yani -∆α -오로지 -siete -off -ĉio -foarte -ďalšími -nekdo -förra -bizzat -önökről -请 -während -można -jojo -পর্যন্ত -wouldn't -के -mn -이렇게 많은 것 -diganto -anas -dietro -низко -fossem -এমন -אותנו -above -primarily -quam -русский -éstos -fino -molti -coz -ngoải -ειχα -beispiel -nedz -penting -ou -आला -하나 -allas -россия -δαί -dintre -surtoud -कोटी -section -parempi -বেশি -ain't -mást -kila -توانست -一旦 -må -ετουτοι -přede -pegar -þu -αλλες -εκ -efter -eigen -med -merasa -ثانیا -任何 -nimeri -abból -aderton -keneen -kenellä -çoğunlukla -بكم -sjutton -بماذا -bald -કંઈક -intr -homepage -denselben -это -po -jy -этими -چبہے -मगर -tampak -خوشبختانه -та -lớn -다시 말하자면 -aint -whoever -parseme -diezin -زبل -thà là -می -ничто -مهما -везде -eveldomp -비걱거리다 -totobą -vagyis -ταυτο,ταυτον -bởi thế -muuta -meningkatkan -coi bộ -jei -meur -teut -abroad -akan -চালু -could've -dite -كنم -হয়তো -jednym -жизнь -också -एक -sinulla -żaden -약간 -vous-mêmes -هگر -훨씬 -faisant -iş -jinai -بیا -wilden -dupa -lleva -mindenki -degli -haluat -ὑπέρ -呃 -mijnent -הן -مايو -sebanyak -prazen -пятнадцать -nie -ποιοι -لَيْسَ -bisa -아니 -그저 -cunha -tényleg -tietysti -이 -papan -tada -পারেন -miért -százat -coisa -viken -뚝뚝 -οὖν -chuyện -kh -aquell -συχνα -しかし -nejsi -parle -înainte -जहां -گی -আগেই -próximos -latest -юмрук -ec'h -сказала -भि -omassa -еще -εμεις -amin -essas -mezi -εἰσ -че -nhé -můj -eûtes -ετερος -η∆η -bronn -कोन -어느쪽 -vilka -सकता -olevan -نيز -purtroppo -anezho -그러나 -niektorú -sebi -luôn -iaitu -aseguró -ขณะ -ơi -states -gia -ouijent -બહાર -عَمَّا -tenho -двадцатый -अभि -savajame -cô mình -कितना -bent -esasen -سویِ -hoş -pani -demikianlah -ئەو -perchè -avions -กว่า -gusto -ইহা -szét -length -ওখানে -gagawin -ky -quero -eni -συχνες -rien -bitevi -以至于 -thành thử -act -sextionde -যাঁরা -إذا -nebeut -suuria -kurang -eit -upwards -lângă -predo -srednja -môžu -çoğunca -которых -guzti -하기보다는 -önön -যাওয়া -akik -unique -cia -cali -yenilerde -chung quy lại -kò -mightn't -aici -halo -oka -nagi -خواهم -پیشتر -ευθυς -todavia -但凡 -vaakwat -faço -esae -∆ιχως -vsakomur -minha -keillä -ble -tegas -خبًتی -چنانچه -às -nouă -cả -وَيْ -不若 -凡 -coa -شدن -继后 -virðuj -ફરીથી -خبًب -pfft -mancher -似的 -جميع -마저도 -tavajam -stora -esnasında -ṣe -aucuns -bawah -họ -out -efed -це -થાઓ -একটি -ὅς -wijzelf -آئی -väl -eussiez -ngay cả -yu -suurten -ημουν -بيد -ouzout -پیش -在于 -merci -hy -go -ہوضکتب -مِن -phăn phắt -μπορει -muda -invention -որը -તારાથી -inc. -faceste -ebet -کوروں -esa -olli -azokig -interest -kerz -isnt -喂 -pienellä -xuất kỳ bất ý -kungani -নাগাদ -huomenna -fez -纵使 -tullut -sasa -mand -sic -sú -da -επειτα -savuoju -seketika -tuas -more -azokban -ditunjuki -לפני -penn -perciò -haft -μονης -vy -varit -هیرے -dikira -two -low -kérem -kolmesti -أولئكم -এঁরা -che -кроме -siwazh -dolar -óna -direita -যাওয়া -teremos -后者 -ells -כמו -nödvändig -това -weiteres -восьмой -rener -myös -着呢 -uusinta -بيست -जो -allows -houver -照着 -näissälle -liten -iets -συχνοι -kin -mwenye -mengira -vergangenen -τουτης -bomo -tak -tulla -diejenigen -tizenhárom -lav -saying -deira -bg -αντις -kot -verdadero -wirklich -kaþkatras -haja -ছিল -harusnya -รับ -anot -还要 -teus -honela -综上所述 -geen -mías -; -pourrait -allein -цей -yhä -sollten -értük -berujar -genoeg -každému -takéhoto -jakiż -čtyři -trugarez -巴 -甚而 -recently -regards -có vẻ -ten -early -only -پیدا -nekateri -เขา -tiec -orang -mayn't -eräiden -이 정도의 -झाली -menos -어떻해 -часто -pirm -kr -তা -могат -hoe -joutua -doesn't -bovenstaand -mones -sieltä -belőle -nad -quello -ll -בשביל -couldnt -detta -ediliyor -ohé -en -se -deus -poleg -tuve -ternyata -اکٹھی -عمدتا -c'hwezek -buradan -mondta -misschien -pasado -· -számára -비길수 없다 -dm -menanyai -نخواهند -женщина -dertig -ova -took -随着 -sisäkkäin -لەبارەی -apoio -mano -dipunyai -vez -darn -aceasta -esté -자신 -vasıtasıyla -مساء -تِه -delante -لم -οποια∆ηποτε -dio -有 -همان -kehen -cy -اعلنت -؟ -kieno -ڈھوًڈا -ku -ત્યાં -toda -gemocht -cũng -noko -turun -arba -ins -નથી -اللذان -따라서 -båe -사 -evelto -huo -neděláš -জন্য -être -εσεις -, -자마자 -augšpus -kenment -εκεινες -there've -toen -بِئْسَ -wann -wakhe -입장에서 -tuoju -নিজেদের -omista -nerdeyse -joutuvat -kimsecikler -воно -ru -paljon -αλλου -sauti -mivel -의해 -douze -hoćemo -chúng ta -lew -modal -sendiri -menokok -'r -ngay khi -fût -otuz -بسياري -behind -demais -бил -اکٹھے -anebo -kýhože -którego -dek -тою -tarafından -mostly -bei -droši -도달하다 -μέσα -neg -oricine -ezért -เอง -เลย -۷ -gayrı -پێ -només -ضکٌب -просто -silti -जहाँ -τοῦ -اربعة -mille -ναι -must've -जेसा -কোন -零 -hingga -hanno -глас -anderen -giu -keputusan -sempre -خواهد -cîte -즉시 -ningunos -muassa -egy -он -سعي -ketua -εχουμε -şunda -ακομα -fois -dikatakan -sind -it'd -هر -dispar -vous -irgend -kaut -parmi -bowiem -دیتے -multa -trước đây -tafadhali -koks -cierta -bittabi -moet -درزقیقت -καμποση -zurück -teihin -erste -جای -بکنی -hangi -oc'hola -seamos -який -tidig -midve -هنگامِ -hoewel -agli -ĵus -bỏ mẹ -seiner -针对 -故而 -manchem -kalaulah -siste -estive -ákypai -lên -lähes -chung cục -kepadanya -οσος -sette -teistä -dijo -voit -sitten -некоторый -buenas -tk -pu -ثبری -گیرم -为止 -една -kannst -sadece -nine -mikbe -oito -monet -weshalb -cun -vanaf -num -već -ده -cuantos -τις -ajes -etiam -stran -أم -chut -습니까 -에 달려 있다 -ac'hanomp -پوچھیں -menyaksikan -چنان -haciendo -evleviyetle -ع -všechen -punya -اش -pièce -наши -হল -시초에 -einig -ὅθεν -välillä -જો -cinquantième -બધું -उंहें -faoinár -whos -машина -غالبا -怎 -keseluruhannya -প্রায় -لاسيما -fram -teljes -سابق -bao nhiêu -mg -얼마 -nopeiten -kimsecik -imdi -구체적으로 -getting -túl -pilihan -esi -berr -ibaratnya -何况 -keskellä -kire -잠시 -aproximadamente -soo -niyang -kļūšu -çabuk -ہوگیب -thoạt -съм -markii -tiun -ثبرے -seitdem -anezhe -ecc -ştiu -بیاب -codesti -حول -prav -اپٌب -bển -konnten -او -láti -zioc'h -muiañ -唉 -alátok -nhất đán -zu -heñveloc'h -siennes -chùn chùn -وان -لطفاً -každý -ungkapnya -झालेल्या -倘使 -육 -관계가 있다 -here's -αργα -उन्हें -ðiosiomis -انچنان -นอกจาก -disampaikan -ден -gdzie -vaším -souden -всею -ًہیں -dlaczego -dayanarak -رکي -tuosiuose -hierom -действительно -pois -seize -μονος -tostig -между -{ -elém -ایند -向 -diminta -পরে -līdzko -مثلا -ετουτου -iyon -klibor -nego -those -سوى -ταῖς -कमी -közé -im -ellei -những như -zeznowu -stor -hasn't -две -چیز -sinuun -daarop -ole -γα -ด้วย -bởi vì -nikamor -jedermanns -facevo -sige -kaikkia -klik -parole -nhất mực -vêm -batzuetan -svojou -sizden -वर्ग -জনের -všichni -不料 -njoj -шестой -وی -สุด -into -sekali-kali -cật sức -نشان -εχθες -চেষ্টা -ואילו -sebut -despre -کیے -cómo -duy -looks -keñver -très -τινα -derakap -d'he -کنی -נגד -shown -啐 -uten -fazer -kentizh -began -ayant -kanila -ouzomp -mahdollista -เป็นการ -اف -batean -काफ़ी -相对而言 -alatta -proprio -disheñvel -hervezo -除非 -मुबी -téma -computer -quarto -étés -powinien -एस -буду -зато -ezekből -estaba -zei -直到 -nálatok -altceva -са -… -skignañ -fussent -fussions -তাঁরা -war -lähekkäin -täytyvät -več -billion -اصلا -kikbe -uþ -neljän -যখন -neni -ذِه -d-ro -와 같은 사람들 -közepén -turpretim -jahr -dagangan -därför -kendisini -عظین -teñen -о -mûsiðkë -שלכה -מסוגל -ðis -صار -kuten -turpretī -varēt -unter -wasn -disebutkannya -femtonde -তবে -συν -memastikan -tego -κατοπιν -egedor -skulle -किंहें -poate -tuya -απεναντι -deze -voordat -yhtäällä -પહેલાં -بَلْهَ -amañ -باشيم -cuja -هَذانِ -pife -怎么办 -seolah-olah -দেওয়া -during -bonvolu -tavojoje -c'houde -بیابیم -tentar -nereden -eta -ἵνα -และ -semblent -vor -byly -dalt -comentó -pelas -도착하다 -pezh -вероятно -આ -эту -하는것만 못하다 -könnte -què -τουτο -rafes -meissä -να -той -dav -suku -κανενας -हुइ -aad -aldrig -joille -van -مَنْ -fx -había -s'han -yi -makes -किंहों -pada -tavojo -फिर -s-no -gedurft -şunlar -εἴτε -направи -حاشا -توانی -jednak -veja -7 -ucapnya -δια -dilakukan -응당 -name -જેટલું -abidvi -labad -آیند -ottanta -isi -будут -ночь -하 -ditanyai -berada -심지어 -토하다 -করায় -gene -miattuk -에서 -היתי -zituen -svom -toch -吗 -gliela -začože -artonde -tarsi -email -elles -yaptığı -ʼn -余外 -उसी -coll -muutama -habréis -lower -quedó -fify -hab -rechtes -σὸς -ennen -۸ -dezasseis -queremas -nimeni -найти -terhadapnya -ero -কাউকে -alájuk -fiecare -intenta -على -在下 -dun -راه -وقتیکه -reeds -война -lika -任 -sekalian -ثعذ -pegeit -etrezoc'h -nor -sposób -okt -skozi -रहे -omien -possivelmente -terjadilah -avaient -sabi -minsan -sh -ثٌب -quả vậy -কত -сделать -այդ -dovolj -jojoje -отже -χωρις -briefly -arent -hervezoc'h -شرع -하지만 -ثڑا -persone -이유만으로 -হৈলে -langkah -peogwir -bb -다만 -vore -dziś -ned -tulivat -keiden -αὖ -なく -所有 -môžete -daren't -hither -قام -precisement -bys -ouejont -kitől -gör -readily -heiltä -ברם -كي -এখনও -ch -উপরে -muualle -καποιες -οσες∆ηποτε -προχθες -ἧς -بارها -kahden -grossen -iken -کورے -từ -yt -terbesar -sintem -که -gewesen -gouez -kļūt -तसेच -pé -gh -sebagainya -管 -beraiek -jiz -peurgetket -specify -jimi -joudun -aist -ris -삐걱거리다 -어느곳 -azirazo -aż -namin -هستید -tayo -būt -pof -halihazırda -중에서 -καμιαν -shan't -lapho -önnek -좋아 -kuwa -vefent -anitz -hartan -dice -tip -થતો -yakından -lein -get -aga -मे -bukanlah -再 -abi -所以 -microsoft -vierekkäin -muitos -mesma -n'hi -qualcuno -seraient -virspus -hätten -ば -noastre -nais -étions -holnapot -meni -kellies -uitgezonderd -saviesiems -этот -简言之 -neither -totes -muß -ολον -ambdues -οὐδεὶς -mungkin -менее -pode -รวม -nein -maez -mt -예하면 -tuon -pertama-tama -kwa -darent -etter -tebou -persoalan -هو -useful -hubimos -prim -deđil -زکویہ -nevis -اى -şeyler -is -ging -außer -sve -étiez -bí -καί -nyolcat -digantañ -nikoje -svog -لڑکپي -needn't -果真 -گروہوں -cinquantaine -tivessem -только -raemp -whichever -ge -dolg -@ -tiekat -iii -твоё -dirazi -ito -feront -aqueles -چھوٹے -করছে -तिंहें -machte -দুটো -ihnen -que -ανωτερω -who'd -embargo -进而 -درمجموع -τιποτε -گرفتید -어찌하여 -দেয় -મેં -több -anàjá -ello -تن -pirms -ج -ainda -co -evelkent -kuu -واكد -راسا -mempertanyakan -その後 -все -adiaŭ -okoli -vezit -turns -quatre-vingt -જેવું -જેવો -oltre -ziget -呕 -eller -במידה -estejam -samma -যার -hindi -خلال -digoret -以为 -nek -μολονοτι -deveti -bev -jijzelf -particulièrement -하는 편이 낫다 -encima -ร่วม -《 -dagarna -ouzon -заради -there's -vilkas -túa -પોતાનું -naszego -veo veo -اینچنین -conseguimos -prin -warno -แรก -3 -mellan -alle -μερικοι -berauek -neuze -habríais -بگویند -ďalší -hubieses -tjugoen -kiemuže -اید -cao -kteří -lama -registrazione -puderam -fifth -sjuttio -mich -οὐδ -٪ -sådana -vare -করিতে -eitt -basta -ráo trọi -چھوٹی -ilin -noe -στης -bội phần -само -bármilyen -could -cię -أين -besser -greomp -עם -patru -вместе -如同 -让 -litet -tuvieras -zugleich -إليكَ -are -samat -досега -hubierais -want -থেকে -polas -enkelt -nhất tâm -己 -thered -pedervetvet -delen -нея -无宁 -nach -faceva -乘 -根据 -jestli -verso -wy -bất quá -ἀπό -δι' -fact -tion -semakin -经过 -کردن -große -pina -کتبا -facesti -sd -berarti -några -ποια -seis -tizennégy -tohle -melko -含 -önhöz -अनेक -হইয়া -گیرید -只怕 -مكانكما -ellet -इसके -least -ðiojoje -seinen -atav -بەرەوە -маленький -אחריכן -diwezhañ -تمام -เพื่อ -hierin -ktery -rechten -כיצד -nejaká -dare -rafec'h -ક્યાં -dilihat -алло -یہ -essendo -그렇지 않다면 -tất cả -daou -előtte -qua -riktig -بالاخره -? -기준으로 -peningkatan -kúže -forever -ними -meio -מאין -bizi -galgi -nereye -かつて -δέ -不管 -ऐसे -vô luận -нему -إياهن -bihan -mi -parecchie -hacia -কারও -strewiñ -üç -kojima -awam -rosszul -oufent -julij -تیي -אצל -som -jøjø -توانند -him -બંને -hn -ap -wiele -jabatan -misalkan -不妨 -kon -uudet -ciascuna -facesse -هَذِي -miknek -તેમ -вопрос -ผล -กัน -ansa -구 -هل -mam -ká -αλλην -achtes -horrek -ใน -ειναι -deoarece -avrai -korso -مردم -ugyanakkor -貴方 -oust -será -eğer -nome -由于 -téged -τὸν -વધુ -mest -try -pres -opnieuw -于是 -지든지 -ذات -estiverem -nova -день -loro -starai -再者说 -mögöttem -bucur -ô hô -goude -otras -纵然 -olisin -tunai -minden -ừ -quines -aloitamme -están -meses -οποι∆ηποτε -sist -ثٌبرہی -mnou -třináct -شدیم -голова -vëlgi -primero -avanti -nemáte -miben -australia -yana -manojo -tosin -그런데 -به -sa-ti -pli -nekatero -mevr -tämän -hue -önökhöz -离 -nogle -darunter -ので -sac'h -su -ouijec'h -说来 -τοση -aonde -después -важное -الماضي -digemmesk -nešto -در -diz -celui -thế à -mumis -hơn -amid -perlunya -niet -estábamos -γυρω -infolgedessen -ditanya -একে -downed -avessero -뿐만아니라 -beste -muchos -dần dần -nula -whomever -raent -ريث -cuanta -بخواهید -deseti -onlarýn -bila -jest -રહે -आहे -н -bập bà bập bõm -đáng lẽ -bennünk -ней -sein -যাকে -jokia -cały -niiltä -malahan -어이 -viz -seid -બાદ -nghe chừng -mußt -meglio -paskum -majdnem -estiveste -^ -kevés -sino -ceux-là -unhas -acord -ilan -quả tang -نگاه -jedoch -estarán -خبرہے -azokká -beslut -säga -wszystko -kumpikaan -restant -καθολου -eux -hacer -vostre -用 -paskos -tại -ngày ngày -ذو -તેના -ắt hẳn -eftersom -haben -οπου∆ηποτε -appear -称 -گهگاه -عشرة -stiamo -असा -diperlukannya -tol -farebbero -miens -nou -сразу -innan -تریي -mindegyik -seks -toata -خواهند -우리들 -এতে -apie -joiden -նա -dolga -maximale -sans -negen -sí -beside -azoknál -بخواهم -đều -γα^ -doesnt -καθ -előle -aşadar -واوضح -sono -ہوضکتے -صباح -grosses -hatot -deinen -fecero -hereupon -osma -didn -افراد -muze -adamakıllı -haiei -öbürü -близо -már -dilalui -δὲ -lewat -tha hồ -جریان -viskoazh -savosiose -چنين -fait -કરી -rechter -i'd -edemmäs -tra -akhbar -এবং -почему -cl -और -przy -gemusst -place -καποιων -شود -mely -naqueles -κατιτι -těmu -asks -মাধ্যমে -dastrewiñ -las -sullo -большой -môj -كذا -کےرریعے -čigav -biết bao -他人 -link -sc -morate -ที่สุด -谁人 -sent -ós -tendría -嗯 -whats -रवासा -môžeš -одиннадцать -连 -ton -再则 -nismo -noin -hereafter -marg -עליהן -mintha -savyje -надо -dì -azt -cùng -berjumlah -tikšu -jums -كلتا -přičemž -bw -ديگر -پر -કે -melletted -ثہتریي -ofta -そして -teníamos -那时 -poco -哈哈 -ὅτι -tavoji -بیایند -hervezomp -ought -valeur -પાસે -sebaiknya -tahun -관하여 -jego -possível -selalu -đánh đùng -共 -защото -egedoc'h -feliĉan -lian -वह -شدم -alato -böylecene -vedle -yakin -tamén -soy -ausserdem -emilyen -tuolloin -kahdesta -vossos -paneveti -throughout -ista -meinem -znowu -kama -nebeudig -çoklarınca -vite -поради -kanssasi -както -která -seva -няма -immediately -lehetetlen -memungkinkan -ieri -saresti -fiu -kanske -则甚 -وقد -مثلِ -对待 -gdyż -ومن -tens -τῶν -עלינו -nedre -ولی -bỗng đâu -cosa -také -نَخْ -απ -starà -omhoog -tulitte -tellement -satt -takému -করিয়ে -حداکثر -seríamos -chầm chập -ես -اضکی -tac -pozdravljen -ac'hane -buena -мало -akáže -kao -nói -كلم -brief -all -aver -ờ -곧 -انصافا -говорит -nul -whatever -home -viimeinen -pouze -evidout -arról -saakka -propio -被 -sollst -algumas -यहां -aloitattivat -ciertos -tretje -minhas -incit -großen -στον -illaki -grit -means -prieðais -jó -พบ -najmanj -来自 -девятнадцать -brzo -ajec'h -bizim -ihan -gdziekolwiek -facer -fuerais -where's -cái -hyvistä -desligado -þeyi -amelyekben -brava -anh -这一来 -既然 -마저 -어쨋든 -许多 -مسلما -pretože -destes -araozo -هست -negeri -עצמו -помнить -shows -כש -ancora -míg -شبه -hiçbir -دیکھیں -ہوگئے -ces -خوًہی -যাঁর -هن -have -veze -sols -ander -cn -fel -ist -solches -tiene -další -︿ -sees -world -নেওয়ার -tiujn -い -several -영 -usted -на -segalanya -hög -amma -ucap -바와같이 -تقریبا -altoos -nummer -вони -หนึ่ง -προκειται -cian -đó -हैं -biết chừng nào -yeniden -henhont -شَتَّانَ -ayuu -brez -做 -estarían -ouezas -quá trời -alcuni -quieto -چرا -ajn -seguente -하도록시키다 -aŭ -tja -derselbe -hervezor -ολο -miattam -의해되다 -ويكأنّ -одиннадцатый -olehnya -necessarily -یابیم -ต่อ -공동으로 -tampoco -wel -daar -dintr- -unii -逐步 -요만한 것 -havde -ολως∆ιολου -thốt nhiên -b -αλλος -tőlünk -averlo -annat -chưa -吧哒 -jine -bort -lerc'h -sz -라 해도 -around -berharap -خیطب -비로소 -ضکتی -alte -aikoo -যদি -omver -איתכם -gwech -webpage -ادھر -پیع -et -abbia -ذانك -nato -hogozik -nejakej -tylko -lainnya -být -بن -jeśli -罢了 -zulk -teríamos -piuttosto -چلے -blivit -ư -halusitte -tajai -sesuatunya -not -walc'h -eurem -אותך -그리하여 -odo -dva -reont -chẳng nữa -لطفا -inni -było -dicatatkan -那么些 -کوًطے -mp -προπερσι -ثڑے -হচ্ছে -lu -megint -nią -nun -ganzer -લેતું -개의치않고 -dibuat -få -tiek -inkje -около -vijf -algunes -하게될것이다 -manera -njegov -lettünk -دهید -posible -mientras -jesmo -fifteen -kelihatan -دوًوں -serás -одного -sometimes -öncelikle -farther -wohl -quand -عملا -果然 -αξαφνα -seul -이런 -neku -hebt -τησ -متاسفانه -要不然 -nongo -tù tì -zakhe -mikään -ناو -เข้า -menemme -molts -nro -διά -lần -die -iedereen -looking -εκεινα -moraš -final -thereupon -بمن -siksi -contigo -facevate -oldest -throug -kaikkea -إنّما -outañ -نوعی -اکنون -py -pl -թ -nisam -vámi -dir -即令 -אחרות -اضتعوبلات -یافتیم -ziren -mellőlem -einander -nhiều -toisesta -tels -pessoas -پورا -vô hình trung -ainakin -sex -tavasai -sin -یه -bulan -唯有 -algunos -پوچھٌب -doilea -them -ng -caso -môžeme -tuyas -ضیکٌڈ -osm -berkata -visokia -deveta -които -joo -námi -εκαστο -cîtva -ayez -aquela -تھے -pri -zouez -ditegaskan -कि -하면된다 -ἐπεὶ -dapat -voent -pefe -한데 -连同 -menanya -intre -bermula -قوة -didapat -vso -জানা -어느것 -tendremos -manyje -不至于 -knappast -کھولا -quereis -ڈھوًڈلیب -ἐπί -다음으로 -وقالت -mellettetek -类如 -hyvissä -ao -zenbat -ban -dezhe -puis -nezin -bekannt -divaez -αν -prof -eram -presiden -видел -pre -근거하여 -trabalhar -mít -tamm -vienokia -tối ư -setibanya -aspoň -acestia -seveda -finalmente -trantenn -그렇지 않으면 -atau -嘛 -οποια -alattad -jelasnya -portanto -asian -ils -jahre -prava -convosco -ciò -godare -saps -` -manojoje -mengadakan -kikre -ειθε -येत -глаз -paling -καποιαν -akým -dipertanyakan -keitten -زبصل -seus -långsam -εχετε -olisivat -又 -अप -nebe -начала -آدهی -または -fôssemos -değil -avevi -rajtam -남짓 -bông -thatve -ober -即 -tá -یافته -nećeš -subito -fûr -amount -puţină -ছাড়াও -furent -месец -previously -чаще -unless -đây -sendo -bepaald -οσον∆ηποτε -horretan -tizenhat -eurak -he'd -hatten -i -已 -mé -εἴμι -derer -betulkah -diucapkannya -kant -τετοιο -aika -alóluk -diesen -mögétek -quá ư -where -vezent -rằng là -হওয়ার -是的 -vsi -були -kiknél -kell -tvoja -changes -except -antaa -oň -বিনা -fará -불문하고 -tiež -мной -کہب -aloitettu -öntől -kenaikan -vì -ý chừng -هَاتِه -май -stato -gloev -کوًطب -هیچ -。 -hace -υπό -plusieurs -улица -مكانكم -सभि -sepantasnya -wanita -belakangan -arna -irá -նրա -soixante -bất kể -seachtó -му -اوًچبئی -yeye -κι -zigarez -mill -omia -كلّما -حاضر -måste -sebou -εξω -ում -آری -فعلا -должен -aloittaa -dabei -всюду -jede -sedangkan -вода -ej -avrebbero -rajemp -maken -inner -'d -کلا -neden -върху -neresi -erbet -panevedomp -彼女 -येथे -tenga -מתחת -bukankah -cosi -iste -terakhir -kļuvām -рядом -هَاتَيْنِ -när -sämst -알 수 있다 -zaten -саму -miken -뒤이어 -就是 -seda -بخواهیم -gumawa -rằng -viktig -enkrat -eerst -گذاري -mulţi -myöskin -skouer -mêmes -किन्हों -لەناو -tolv -odprt -انقدر -乃至 -belétek -따위 -heihin -tuturor -başkası -जिसे -egyelőre -spet -aikaisemmin -なり -johon -qualche -관해서는 -geçenlerde -何 -tolei -třeba -willing -gwitibunan -તેમનું -elmondta -demzufolge -sebenarnya -nekoč -được -manajame -εσας -doare -taking -دادم -તું -gute -может быть -dovrà -而外 -davetañ -hão -засега -bởi nhưng -alta -mikből -لەبابەت -اینقدر -potser -自从 -πουθε -dijawab -слово -ens -jól -viņpus -dahi -համար -پوچھوں -depois -вами -results -与其 -neem -tohoto -συχνον -puisque -시키다 -izan -тази -我々 -呜 -taviðkë -એવી -bruke -solito -všetok -bovenal -state -were -别 -tuoksi -welcher -ολα -terasa -شدیدا -nekünk -ikke -magad -néha -pernah -হইতে -voemp -sólo -hou -századik -добре -diganeomp -alkuun -tykö -sama -יכלו -queste -kekal -quiénes -niks -nebo -જે -ca -anosiose -이 외에 -ani -joku -vaši -neunte -fele -eşti -pentru -હા -或曰 -perquè -および -ouezor -tunjuk -حَذارِ -lâr -om -jeste -tất thảy -asked -kapwa -tvůj -главен -d'ar -تانِك -kdo -dindanor -এখন -personne -utoljára -ďalších -kitas -pokiaľ -ibland -terzo -دے -就算 -emezout -过 -ইত্যাদি -anuosius -wtedy -nekik -niektorých -onze -certeza -tò te -nokor -până -그래 -turn -dve -no -'tis -향해서 -önökben -તેવું -groñs -قجل -fél -anda -przed -خواهی -soyons -jen -tätä -br -فی -아홉 -كه -sido -němu -τη -dette -ezer -бы -μήτε -σὺν -selagi -করা -ช่วง -terutama -เป็น -خبرہی -they -tuy -অর্থাত -keinen -داده -નં -бившо -greetings -تت -甚且 -pameran -ĉi -chit -thereve -εφεξης -mamafih -nekaj -na -zuten -chú -bol -f: -нова -strongly -например -तक -lehetett -mert -które -עליו -dois -wollte -próxima -তথা -tened -gone -llevar -시각 -chính thị -gichen -મા -眨眼 -facemmo -f-no -یابید -couic -gemoeten -toà -titolo -semacam -everything -número -lütfen -آًب -omaa -daouzekvet -м -kasus -따라 -greiz -azirazoc'h -iz -نمی -bt -viii -bezala -, -不比 -quins -melalui -+ -kedua-dua -стол -ktorých -خبًتب -vždy -oufes -宁 -lad -چون -该 -onları -bây nhiêu -inclòs -nhà -estabas -저희 -sim -вся -kieže -某 -coloro -です -تم -urus -kimisi -ránk -altijd -also -αι -smějí -главно -mikben -aquele -tinham -einigen -wami -kenyataan -এটি -meyakini -dago -tiven -habrán -sian -bati -noissa -somewhat -лишь -对比 -εἴ -immer -anosioms -أيا -rd -ezentúl -orice -εκεινο -recentemente -ating -tisíce -מדוע -vara -mukaan -র -quyển -onnan -dasselbe -skoro -vezed -said -sait -estavam -ok -budem -am -ολως -أنتن -既是 -information -avait -تازه -między -pontos -diverses -akúže -iniciar -گیب -kwir -biju -اہن -প্রাথমিক -भितर -tênh -treia -tự vì -أو -ganti -koust -beléd -প্রায় -mało -ers -gern -à ơi -naoi -allô -भीतर -doet -diemžēl -мек -kvin -makita -estiven -op -tessék -ἀλλά -endlich -egyszerre -nikun -jangan -sou -kw -sebe -হয়েছেন -وەک -بەرلە -kýmuže -متى -zweite -aký -latter -kae -ετερων -бывь -lúc -多 -尽管如此 -bursa -siap -fac'h -estáis -den -neyi -говорил -ivez -mempergunakan -μεσα -이젠 -kannalta -নেওয়া -thoạt nhiên -ứ ừ -iyi -जब -velev -поне -là -währenddessen -बनि -що -fill -光 -мне -proč -لەبەینی -mara -été -duizend -likely -cois -فردا -bättre -asioita -же -کو -kikből -অবধি -tuviésemos -貴方方 -така -biji -gliene -apos -pravo -word -কেন -ετεροι -或者 -这般 -eigenen -mulanya -gainera -serious -răng -kjer -queres -bizcileyin -всю -مكانكنّ -welches -savasis -möjligt -noted -arribaabajo -tloha -raen -یکی -mögt -만은 아니다 -thick -ثبترتیت -cá -intentas -kleiner -habríamos -dahil -autrement -ngay -mac'hañ -tambah -不拘 -ń -thốc tháo -τελικως -yhtä -jumlahnya -willen -regarding -tvoj -jer -برخي -مدّتی -poden -unsem -ninguno -bár -之一 -slechts -č -eräät -mögéd -buiten -fuera -ourselves -beginian -kteri -ισωσ -اللاتي -τὸ -andra -chu cha -给 -zwölf -az -sal -bunlar -keines -d'ul -우에 종합한것과같이 -aq -થાય -veletek -никто -desquelles -mutta -这 -sekecil -évek -tà tà -假如 -aveste -ahead -edu -groß -k -elli -зачем -thú -τουτος -buna -hora -across -при -ezekért -kaukana -의해서 -انجام -tambem -elleivät -smo -njezino -hadden -vesk -thailand -multe -подойди -akýchže -passé -bấy chầy -c'hwec'h -怎么样 -awal -نِعْمَ -này -primeros -manuosius -pevare -nothing -year -apu -serai -반대로 -일것이다 -любить -nami -meno -spre -môjho -설사 -дело -serions -nuovi -لەو -sudahkah -ob -alólam -umumnya -tus -منذ -pagal -często -비추어 보아 -دوضرا -tizenkét -eins -cuánto -然而 -thereafter -akhiri -要 -uhelañ -horiei -bn -καμποσον -dado -soyos -pedervet -ناگهان -ًبپطٌذ -jenž -skoaz -muka -رہے -here -olin -totuşi -nhất tề -thought -damheñvel -благодаря -vuotta -dengan -でも -ejout -更 -net -awfully -ĉion -mengucapkan -যা -your -هایی -jää -لەپێناوی -menegaskan -före -dobri -tim -было -lättast -بات -kaksi -którym -última -dhá -ذلكما -cukuplah -어느 년도 -叮咚 -buen -verdad -front -längre -پطٌذ -egales -일때 -ثم -greatest -ktorým -почти -दवारा -너 -moindres -いる -tiekam -duns -cento -کل -ktorou -olimme -pourrais -web -algo -taký -neuntes -اضکب -anajam -went -gov -wonder -ea -berupa -لەرێگا -tailh -نخواهی -давно -semblants -túas -dykkar -hum -מצד -哎呀 -първи -във -galbût -valor -menghendaki -गेल्या -är -hänen -taky -medesimo -мог -رکھے -ạ -九 -inca -onadva -parting -kion -argi -noita -höger -seulement -pienin -դու -তার -persze -오자마자 -oldukça -dioute -suka -ibaba -v -오르다 -atabo -stessero -хотя -tuviéramos -qua quít -alti -sebagaimana -mian -છીએ -vijed -igual -taviðkis -ničoho -开始 -چلو -ڈھوًڈًب -zro -برای -zindan -borta -남들 -vijes -تاکنون -giữa -demincek -두번째로 -sahiden -任凭 -sở dĩ -εκαστους -دەکات -külön -podrán -诸 -किर -kepentingan -ćeš -thím -mejor -diucapkan -malgré -beginning -않기 위해서 -questi -alguna -verŝajne -كنيم -näihin -faresti -abalamour -إياك -egeto -neljä -below -fuéramos -min -itibariyle -রাখা -övermorgon -mengibaratkannya -cujos -uy -menevät -te -ωραια -liian -lot -всему -ầu ơ -turut -aemp -نیز -fusse -jsem -এক্ -使 -faremo -maakte -jelaslah -kvazaŭ -освен -hányszor -protoze -anderm -dopo -такие -aurais -वगेरह -estuvieseis -róla -sean -οὐχ -αυτων -со -pelancongan -particular -सो -разве -štiri -ezt -soyez -avrebbe -lui -다른 방면으로 -طرف -težak -vung tàn tán -бивш -هيچ -bẹ̀rẹ̀ -بین -esteja -koga -още -) -maakten -주룩주룩 -toteż -rafemp -呵呵 -ognuna -sechs -lla -করবে -seront -为什么 -tarpeeksi -моля -céad -পাওয়া -بلکه -keihin -επισης -batzuk -justru -deles -xiv -后 -kauan -vierte -tadi -flesta -ačkoli -inte -monesti -zonke -open -misalnya -inicio -গেছে -birkaçı -comes -vod -byla -atalek -ওই -overige -jota -يكون -onlar -sep -evito -r: -важная -kemudian -you'll -kez -ετουτες -thửa -ἄν -6 -asti -sieben -многочисленная -מאיפה -اکثر -toks -bizatihi -մի -하지마 -adeus -osmo -他们 -setengah -was -evelato -당신 -akin -với -jikalau -vijemp -ouezi -jẹ -много -accidenti -ποιος -devet -وٍ -yakhe -būsiet -niż -دیب -dào -teria -κατὰ -cs -suya -كلَّا -บาง -أنشأ -有及 -disini -지말고 -káže -help -ők -phè -melkein -farà -tika -بله -ه -doa -نعم -إياي -näiltä -jolle -betgi -tvåhundra -मात्र -vaikeille -mire -entrambi -jun -deşi -emezon -mc -تھی -אחרים -ý da -كند -者 -زیبدٍ -hic -laouen -zaw -只是 -menerusi -срещу -masyado -sẽ -chớ -също -जिंहों -dindani -بیاورید -esteve -ہوچکب -에 가서 -solchem -от -ebben -előttünk -어떠한 -тези -didatangkan -گفته -ต่างๆ -gayet -~ -добър -rak -heute -છે -આપી -másokat -ซึ่ง -याचा -rày -所 -vốn dĩ -isang -để -jedes -tandem -wegen -insa -día -significant -할지언정 -虽 -durante -מול -stetti -joilta -하도다 -tau -归 -while -ἀλλ’ -પરંતુ -empleais -γε -chứ lị -jam -berau -chceš -megvan -2 -inoltre -ničom -tenzij -ex -해서는 안된다 -все еще -假若 -nigdy -δαὶ -سرعان -mil -theyve -sînt -tou -عاما -ouijen -לבין -بخش -possessif -שם -흐흐 -menambah -anterior -jouwe -оно -quelconque -gli -درباره -pia -ઝાઝું -contains -dela -arall -önökből -是以 -niemand -μειον -ถ้า -segun -bilo -voici -became -嗳 -krak -milioni -mellétek -ví phỏng -aut -devrait -साथ -cuanto -احتمالا -tista -kaikkiaan -ingen -avreste -után -bay biến -ωσπου -benarlah -시작하여 -exactly -sebagian -iż -न -ensimmäiset -היה -голос -differentes -を -和 -aussi -esse -λογω -дори -ezret -evel -acht -chcete -mycket -mug -niiksi -estan -belőlünk -tiada -naik -设或 -lähellä -pēc -prvo -vi -aus -hele -enyém -savuosius -κυριως -tionde -অন্তত -îi -вне -később -sangat -স্বয়ং -راضتوں -that'll -কবে -હોવા -seringnya -vosa -yhtäältä -كليهما -ὥστε -nasz -houvemos -rares -ďalšia -noiksi -kikhez -persidangan -dein -رکھتی -বাদে -jämfört -ette -čími -kad -teknologi -kolīdz -حتما -म्हणाले -mus -niektorým -raint -тот -ötekisi -thật ra -کھولٌب -그럼 -keeps -nhỡ ra -voso -семь -أمّا -needed -joka -devem -کیب -kumpulan -disinilah -σαν -бъде -ἀλλὰ -소인 -tzw -کرتےہو -çokları -了 -không -করেছিলেন -jedem -belém -نفسه -喏 -différents -dalgún -советский -danes -diouzhin -near -થતાં -一样 -हे -sangatlah -afen -tanya -گویند -sijaan -إيانا -itll -vaš -mq -whether -kikkel -isn -adapun -تویِ -serían -چکب -keistä -mentre -秒 -bude -ennañ -perniagaan -setinggi -xuống -לאו -možná -ontem -ديروز -nejakým -thốc -جز -pochissimo -dinaintea -мы -unlikely -ου -així -astfel -تمامي -сегодня -nedense -onszelf -got -emezoc'h -sampai -vostro -diget -sara -비록 -才 -clanku -区 -uk -روزهاي -áng -hijzelf -لگیں -kvara -theirs -nao -visoki -iujn -aceşti -patys -kertaa -problems -unit -att -tulemme -toute -eles -ugyanez -moesten -eusse -sampai-sampai -하여금 -جهت -olup -bunun -yhteensä -كانت -tretja -aloittamatta -tột -tőled -총적으로 -ثٌذ -bova -kent -ám -gairebé -yahut -t'han -amongst -mits -diantaranya -rólam -dak -magát -gouezomp -gantañ -над -rólunk -faccio -kļūsiet -قابل -уже -મૂકી -tomu -ترين -sedan -các -overall -alea -kamorkoli -fim -sera -peti -غخص -näissähin -lets -từng -outros -akej -sechster -보다더 -嘿 -кой -piu -neye -خگہ -часть -都 -'ve -terus -تماما -explicó -لوجے -vô kể -呵 -aviez -παρὰ -kiek -raje -tőlem -isn't -whenever -कुछ -yhteen -donat -fui -design -trước nay -hetediket -kahle -hyviin -某某 -trên -ὑπό -visgi -ningunas -mochten -arise -besides -naŭa -طبعا -quels -ac -appreciate -képest -ihm -poiche -比方 -τὰς -może -qeu -phóc -sau cuối -kumpainen -καμποσος -乎 -allen -verran -telles -rốt cuộc -acaba -cujo -stati -fenn -وا -אחרי -anajame -8 -ugye -versus -دکھبًب -neunter -azzá -fuese -tsoin -לאן -missä -بدون -iných -otte -voen -我们 -totul -девятый -રહેવું -凭借 -large -aura -altrui -plaouf -svymi -ধরা -takú -էր -međer -estuviese -habiendo -related -duquel -কাছ -penaos -gemogen -답다 -alemmas -或是 -nyolcvan -raz -forth -công nhiên -其余 -ثرش -berlainan -vam -menyediakan -nada -date -ὥς -करना -去 -pemimpin -عمل -للامم -oricare -solang -akejže -por qué -trệt -ðiajame -onko -bagi -ето -des -관련이 있다 -خواستیم -говорить -hetet -pointing -ziwar -possibles -informo -وُشْكَانََ -noget -داد -böylece -হবেন -尔 -jokainen -toi-même -외에도 -haber -soprattutto -thà rằng -俺们 -akou -noroc -thời gian -стал -તેનું -fazia -anojoje -졸졸 -acerca -出于 -acela -önöknek -जिधर -diferente -iného -daleko -powinni -mikin -peurheñvel -περιπου -kí -nećete -ηττον -abiejø -übrigens -προτου -pomimo -ezekkel -svých -হয়নি -vezez -一般 -aiz -kanssaan -pan -kalau -each -köszönhetően -αἵ -vario -ποιας -tavosiose -questa -بیاوری -માટે -prie -esses -ouias -שלה -이용하여 -ч -kz -celles-ci -vaša -prvni -kukin -dog -отгоре -belőled -ismét -tvojho -tuviste -phắt -araozor -enää -vii -negyedik -lc -concernant -જેમ -qualcuna -toisella -bất nhược -có -piedi -powinno -семнадцать -мочь -doppio -hundraen -kva -た -هہرثبى -હોઈશ -fora -takáto -چکی -પ્રત્યેક -چلیں -তত -terjadinya -miei -atunci -av -συχνο -आता -আমার -علًّ -mard -নিয়ে -asi -siihen -ord -întrucît -এর -sất -jestliže -neljää -иска -મૂકવું -sesudahnya -그럼에도 불구하고 -katika -semula -régen -hubungan -skall -اکثرا -dimulai -blei -咚 -estará -ouzhpenn -woher -huszadik -pendapatan -tentulah -πρὸς -memisalkan -placed -todella -شش -কোটি -catre -tavàjá -palaipsniui -birazdan -ðita -دهیم -tuonne -倘然 -what've -långt -із -دوضری -chốc chốc -大家 -процентов -twelve -gyakran -嗡 -et-al -ものの -ở trên -որպես -τῇ -sajalah -veo -dels -기대여 -sides -kuris -바로 -واضافت -bất giác -klci -zweites -بیشتری -kymmenen -εκεινεσ -nessa -를 -پس -directly -araoki -dienn -ثمّ -beetje -μελει -할수있어 -malo -idag -ثیچ -спросить -vives -εκαστος -nawet -tắp -amelyet -tulen -하기 때문에 -уж -manosiomis -زقبئق -ties -hubieron -saw -desi -καὶ -की -마치 -geworden -faoina -عقبِ -τετοιοι -всегда -พร้อม -kolik -enggak -τετοιος -لَسْتُ -pourc'henn -zpravy -οποιες∆ηποτε -pravi -예를 들면 -hadi -อย่าง -पण -frattempo -marzh -rasanya -येणार -kaikkien -gegen -habrá -علاقے -καλως -ποσην -sudahlah -rứa -所幸 -koho -endra -kde -begini -vụt -otrpus -เห็น -륙 -nittonde -desquels -thank -ça -ગયો -하느니 -v: -veyahut -folk -หรือ -vào -groups -هذا -instead -tai -उन्हीं -autres -különben -davedomp -furthering -ya -makanya -хочешь -nedavno -couldn -ضدِّ -miknél -bin -значить -aniesiems -如其 -لكن -hervezout -sechsten -имел -пора -itibaren -keseluruhan -ktera -tuyo -해야한다 -prealable -οποιο -cela -однажды -edelleen -keinä -dù rằng -nữa -dute -segundo -anderem -ellos -ademas -mula -syed -แห่ง -daima -često -eso -аз -bennak -ahogy -apakš -راضتہ -какъв -derjenige -nálad -到 -denna -moju -여 -lett -하더라도 -razie -wasz -azi -fata -إذ -drie -也好 -آنان -સામે -če -hauei -ensimmäinen -hvor -keţke -mit -restrictif -längst -من -zaprto -aloitin -ossia -arbenn -koju -pantas -بسيار -when'd -suivre -liked -собою -حرى -says -geweest -parts -ellemme -także -انه -où -어떤것 -mûsø -elsőt -każdy -avrà -bi -npr. -您 -demgemäß -maga -strishaat -éve -quiere -еднаква -html -sopra -akouže -زقیقت -moyennant -এদের -showns -tuo -بخٍ -当地 -tavuosiuose -chớ chi -ir -ila -jajame -former -! -aivan -แต่ -jouw -dro -nunca -gesê -of -sekali -maniesiems -ah -negyven -vašej -απο -might -presenting -με -lecz -rooms -doue -aliesañ -αλλιωτικα -이러이러하다 -انکه -eikä -ouient -باشی -coi -只消 -mudah -로써 -bilakah -dermaßen -seitek -그치지 않다 -মধ্যেই -συχνως -iemand -具体地说 -سپس -repente -alone -corrente -preko -anca -damit -mesmo -membawa -vários -نيست -най -οσων∆ηποτε -ezekbe -τα -consiglio -καμποσου -chères -annál -보는데서 -توانیم -mojej -tulit -peu -及び -distank -haec -ـ -kaikilta -vår -tro -، -何处 -dargi -nemete -maniðkë -ら -ہن -sota -восемнадцатый -bỗng dưng -چيزي -teu -heñvelout -előbb -মাত্র -tritt -بلی -việc -ため -fi -více -دکھبتی -दिली -dá -twoje -alors -以至 -dank -якої -nghỉm -오 -ordered -mne -wen -بها -দিন -usas -已矣 -ắt -provostapl -cúig -rajec'h -ثلٌذوثبلا -برداري -zpet -oleh -quả thật -thộc -ετουτο -제 -혹시 -tapsiet -aveva -입각하여 -ती -oz. -nhất thiết -always -keşke -også -ز -أكثر -emaon -vezemp -foste -njegova -mucho -دایما -maka -dernier -þemiau -arada -ô kìa -njo -امشب -keta -总的来说 -vc -indeed -તેઓ -şunun -iar -怎奈 -kuomet -داشتند -xoẳn -ετερες -mencatatkan -paggawa -c's -enep -dès -กับ -위해서 -edon -neste -καποιας -били -let's -utána -ditunjuknya -누가 알겠는가 -nondik -spate -такива -เริ่ม -s-ro -jes -سوي -برخی -it's -projek -각종 -نداریم -halbuki -пред -facevamo -及其 -raio -vuosi -요만큼 -二来 -fiţi -poa -drug -cực lực -derhalve -estada -inn -hätte -beþ -sé -راضتے -вы -minst -after -poder -előled -によって -طريق -يا -nejakému -طبقِ -vì vậy -cinquante -whither -twoi -按 -ối dào -eléjük -seréis -করে -像 -گروپ -ποιοσ -honom -这会儿 -tiver -ouzh -бяха -alas -již -momento -총적으로 말하면 -tvá -lisää -asa -inga -tuviese -زکن -kah -ذلكن -أينما -ταυτος -varmasti -فكر -ott -ode -گه -هنوز -meski -tällöin -éis -생각한대로 -és -没奈何 -jolta -zuerst -vezen -kapan -quiza -perak -uniformement -اضطرذ -bili -वहाँ -あります -pirma -تر -তাহার -hyvät -sale -gach -teba -pic -nunha -คง -tutte -নাই -hiziv -jelikož -дом -ثھراہوا -trước -omstreeks -liever -کنار -cent -grosse -baixo -ái chà -aquesta -też -آنطور -varēsiet -dikerjakan -say -článek -maar -aquel -যেন -hiába -dużo -tills -brav -શા -caur -soi-même -mengingat -julai -berkali-kali -houverem -toisensa -ahhoz -három -ii -такое -دکھبتے -pengguna -á à -باش -依据 -sekitar -rón rén -заспал -nisi -tuvimos -} -دوباره -devatenáct -ý -tendríamos -quá chừng -kalangan -nấy -ouiemp -vähiten -εμενα -ví dù -jako -पे -során -کئی -âu là -mijzelf -luona -μέν -которая -hogen -بەرەوی -هػتول -nhưng mà -никой -붕붕 -однако -всеми -basi -lakini -own -sista -sache -podo -sui -ارکبى -προσ -ever -şase -कुल -tamto -keitä -pitiaoul -nemet -ďalším -οσες -esiin -informó -enig -assai -του -ميليون -بیرونِ -같다 -araozout -کننده -unuia -ihr -但 -making -minä -συχνας -mellettünk -ollé -să -chắc hẳn -পারি -semmilyen -ذانِ -ebből -sur -joita -anoji -گرفتیم -jste -他 -گاهی -daraus -minus -થઈ -vung thiên địa -את -nah -ceea -ginawa -ना -timur -ہوچکے -latterly -打 -neben -memang -keiltä -ted' -welche -weldra -entirely -nyaris -doktoro -bd -wech -mean -kteři -pempved -pointed -olitte -rájuk -αυτης -بعدا -seberapa -tulisimme -bá -kaipgi -ujarnya -estar -aloitatte -sv -ĝin -majhen -ennyi -kendisi -estuvieron -bằng nấy -našej -meine -nilang -alattuk -뿐만 아니라 -راحت -була -ezzel -welk -紧接着 -semisalnya -nossos -aupres -voire -한마디 -tarytum -نظیر -sjätte -nihayet -danvez -considera -chao ôi -povsod -leh -atp -manàsias -al -퉤 -ka -three -avuto -jonkin -leto -kou -dalle -گئے -biết bao nhiêu -căn -اللذين -যেখানে -soi -ગઈ -tại vì -τοσου -עליה -knew -οὕτως -esos -move -shouldn't -آنچه -هايي -neverless -aloitti -jiray -ktorý -zi -sayalah -অনেকে -všechno -או -dell -grak -dic'halañ -vuestro -'n -bill -medzi -יוכל -possedere -پہلی -ہوتب -multiples -. -سمتِ -нам -komma -又及 -quina -с кем -stvar -各自 -》 -keinem -njena -vita -meningkat -creo -pegement -ceux -હોય -انگار -hen -sahaja -اکیلے -bahkan -framför -departe -jich -واهاً -elle -tave -ra trò -tuskin -bunların -yetmiţ -ضبتھ -thấy -precies -szerintem -så -twoja -无 -ganeomp -ضوچی -fouilhezañ -sj -کہوں -mult -čou -اشکارا -farebbe -にて -cerca -voltunk -নিজে -하는것도 -اًہیں -ندارد -yapılan -εκεινοι -ضیذھی -similar -likställd -cez -trước kia -thúng thắng -daol -arpa -havent -fairly -mellől -yaptıkları -thỉnh thoảng -million -ըստ -tasai -fanno -akýmže -পাচ -kas -parte -lai -encuentra -panevetañ -diouto -ganto -أخذ -لوسہ -pekala -αμεσως -lamanya -kaj -celles-là -nitekim -假使 -tranne -from -iako -gwezhall -lehet -jemand -अपना -sept -则 -vivat -toto -estuvisteis -ls -каждый -gå -acea -জে -tipo -õ -চেয়ে -emeur -论 -તારું -بود -terlalu -остаться -صهْ -rajta -caruia -вниз -kelli -甚至 -přese -כזה -वरग -التي -wordt -таки -متعاقبا -chí chết -alltid -cîţi -ητανε -τουτων -keduanya -견지에서 -할 따름이다 -با -혼자 -πλαι -hetedik -harus -jawaban -الثاني -acara -här -ησαστε -çokça -sidang -никуда -våra -jossa -dobrze -بودم -afirmó -بازهم -تان -estuvieran -daarnet -ます -në -ανευ -emaoc'h -rispetto -debout -יכולים -आहेत -kiekvienas -sedang -rích -ετερη -sedmi -budete -wang -որ -siebenten -人 -jotenkuten -pihak -સરખું -کجھی -bouez -काय -ειχαν -mons -persino -stanno -ถูก -d' -tapsim -peuz -houvesse -draoñ -ตั้ง -batzuek -자기 -obra -можно -lately -う -pels -paèius -туда -abbastanza -biz -автентичен -pevarzek -trettonde -daquele -alád -mondo -هستند -tamhleto -ending -ustedes -unnekvet -هلّا -tutto -katras -خصوصا -fôramos -hoci -один -nên chi -非但 -在 -mienne -tf -concerning -sau chót -celo -のみ -قطّ -निहायत -afgelopen -quá lắm -prave -ponieważ -mampukah -ہو -kautta -niečo -ενω -don't -여덟 -bandar -oufemp -kilku -vien -ingat-ingat -inom -ix -milyar -+ -本人 -câte -tentunya -edos -meanwhile -hopefully -bolehkah -trabajamos -oa -owing -οποιας -خواست -sínú -meitä -ötödik -adica -hattet -t: -nemrég -abbiate -együtt -спасибо -toate -avgust -todavía -叫 -이천구 -houveríamos -hereby -може -παντου -kurgi -egedomp -哈 -os -hepsi -ὃν -trển -fún -specifiques -jotenkin -d'un -얼마 안 되는 것 -могу -peux -모두 -ًکتہ -کہتب -پاعینِ -legalább -یافتن -pinjaman -حدودِ -quant-à-soi -we'll -5 -до -οποιων∆ηποτε -weve -tp -melainkan -이상 -τον -terbuka -فى -não -perto -介于 -éreu -这边 -новый -هیں -¥ -nhón nhén -heillä -咋 -eeun -w -yoksa -kú -enige -была -herse” -∆ια -podria -unes -ذا -jednakże -vat -لَيْتَ -anezhi -էինք -volt -دوای -إلَيْكَ -自个儿 -توبم -sedm -прекрасно -baix -voin -вие -zij -aí -майже -sizi -ty -willst -moniaalle -drek -روزانه -мною -érem -juga -lè -아래윗 -起 -êtes -kiken -се -શકે -প্রযন্ত -menginginkan -pukul -emezo -før -ταυτες -ţimdi -ала -một -bezet -jûsiðkis -utanför -дорога -sien -còn -eo -اضکے -nonostante -以期 -sigue -azért -kā -jesu -ezek -obtain -kiedy -tuohon -kalon -termasuk -debajo -madem -哪年 -οποιους∆ηποτε -前此 -adanya -bütün -grouping -muualla -forse -물론 -quae -ennél -came -drei -μοναχα -tsouin -atata -kommer -waa -بعضا -mismo -když -ضد -وجود -قد -svym -반드시 -stemmo -aslında -wà -تجاه -колко -ailleurs -तो -ايضا -totdat -से -sidan -dewan -zergatik -vocês -kiehože -osem -близко -detto -naar -jadinya -پیشاپیش -boull -ἃ -uz -four -wird -એનું -ada -нови -moins -von -estuviésemos -birbiri -duž -một cách -उन्हों -ارتدّ -mateixos -cher -egyet -menggunakan -なっ -pelabur -lejos -ohe -jezelf -onde -év -아이쿠 -leurs -xii -holà -patá -quinta -belumlah -πισω -зад -gêr -anterieur -μη -although -unse -gur -нами -ziar -بوده -sollte -ŝi -anume -uga -mias -she'd -μιας -case -tizenkilenc -mudu -taer -außerdem -én -estado -메쓰겁다 -место -позже -estuve -i'm -felet -تلكما -단지 -unul -onto -kg -kui -arra -città -do đó -unserer -aquestes -estic -magari -häneen -ive -끙끙 -دادند -oracık -ớ -هوکٌبت -heres -opens -sepanjang -kit -nás -ekkor -aloititte -کررہی -belé -každí -felett -prieð -pense -diagent -か -طبیعتا -printr- -конечно -উত্তর -serupa -bahawa -درخے -le -uucp -μονομιας -آنکه -wil -τοσους -важный -যেতে -通过 -vols -panahon -abbiamo -vậy là -chú mình -啦 -male -moest -لَسْتَ -polis -علیه -þeyler -হয়েছিল -oc'ho -dagegen -десять -solchen -évben -عدا -теперь -blijken -manimi -前后 -első -jā -ison -χτες -μιά -οὐχὶ -∆ικα -majhni -avun -local -máa -dimulainya -highest -에 한하다 -אותם -serías -εχεις -tako -thinks -della -것들 -akulah -داشتید -kým -siinä -هكذا -son -หลัง -début -doen -sőt -אתן -kuusi -گرفتند -damm -mane -blir -αυτεσ -béng -isu -tal -même -αντι -deor -euer -ہوضکتی -myself -haluan -لكنَّما -بەدەم -τους -arre -podem -hij -bagaimanapun -c'hreiz -starò -કરેલું -rend -هطئلے -始而 -hej -οσου∆ηποτε -samo -benne -kapanpun -솨 -że -budeš -ese -bhúr -contudo -geleden -אל -probante -evvelden -κανεν -farò -diinginkan -wahai -εαν -dai -তুমি -komprenet -থাকবে -tampaknya -rarement -nh -nejsou -lamang -amoungst -própria -part -jajai -possessifs -۴ -ας -пока -мир -تبزٍ -mà -tengáis -ook -ein -wurde -svoja -enigszins -οσου -toisaalle -કેવી -soit -tu -inż -अशी -pangalawa -habéis -ж -hét -elles-mêmes -dirazoc'h -προ -cóc khô -مجموعا -valahol -sebegitu -ker -بگیرد -altmış -هنگام -συχνος -tiklab -birçok -tựu trung -临 -akože -যতটা -piv -daichead -vlastně -mein -त्यामुळे -kajti -regardless -nerede -nedělám -dieron -sun -quatre -τουτοι -dlatego -quien -kunna -jangankan -selaku -était -دی -kini -yaitu -quelles -seas -那会儿 -avevamo -εαυτου -tuota -你 -u -উপর -hoaliñ -bad -ill -kendisine -allí -seg -沿 -muualta -haluamatta -υποψιν -ses -abudu -gra -δαὶς -kļūst -avremo -اغلب -ની -那儿 -ami -altrimenti -ech -másikat -gens -végül -своей -ποιου -abiejuose -οσην∆ηποτε -megcsinálnak -daugmaþ -sy -siin -خص -чи -それぞれ -kembali -igår -specifique -siamo -不仅 -olsun -বলতে -ceilalti -दुसरे -پہلےضےہی -четыре -لەبن -tớ -ampleamos -desses -υπ -előttem -bunu -الوقت -vrac'h -毋宁 -mások -heñvel -mögöttük -hundred -nebeutañ -put -ἐμὸς -būšu -kira-kira -noiden -ur -one -איתנו -call -쾅쾅 -tad -tapāt -eût -jobban -derhal -εκεινοσ -পেয়্র্ -예컨대 -: -acestei -hasn -étant -더라도 -어기여차 -aquellos -podriais -তাই -아니나다를가 -nē -parfois -이천육 -ettiği -المقبل -שלכם -pouah -atatia -behövde -áno -যদিও -ماذا -perché -ont -davedon -ἀπὸ -sinjor' -∆ικος -bajo -nhiên hậu -sesuatu -nálunk -backs -blitt -binnenin -ด้าน -ضکی -седьмой -کہتی -兮 -fyra -تھوڑے -ওঁরা -adarre -seule -m'he -nemmeno -kedudukan -seáis -mencapai -peto -unha -の -има -quatrième -لەلایەن -greta -сеаой -particulier -kuitenkin -visoke -τουτες -sexta -daleč -bersama -elas -તમને -heti -다른 -setiausaha -nekoga -vars -kuinka -thế -nici -可见 -všetka -ouezin -ankoraŭ -visas -begin -بطور -dom -someone -بیرون -aunque -מבלי -nejakou -somt -manosiose -hal -할수있다 -дни -houvera -mencionó -boas -इसकि -kiz -सकते -houveremos -تينك -لگتی -őt -бе -mocht -walikuwa -benn -hube -趁着 -perusahaan -wederom -peserta -इंहों -join -מתי -sañset -seusai -nov -τετοια -كأنّما -tomuto -pocas -pînă -οση∆ηποτε -দেখা -nej -minulle -вон -suffit -със -자기집 -herself -وي -ничего -اپٌے -bija -großer -त्याच्या -polni -ennout -gwell -કોઈક -suo -gw -aina -directe -rendben -kvarhelst -pf -etwas -nji -ไป -ore -ergens -nf -evidoc'h -ωχ -wazh -takhle -इन्हीं -evidor -αμα -mempersoalkan -তাহা -lijkt -do -περι -staremmo -vossas -তবু -tôi -aká -dolayısıyla -berbagai -vezont -χαμηλα -với lại -sekalipun -دارند -qualquer -magatokat -pouvait -아무거나 -terbanyak -такой -por -aikaan -لگے -you're -someday -রেখে -peustost -vrasañ -doubtful -neuf -maþdaug -ordnung -egale -berakhir -malgraŭ -hurrah -furthermore -κατά -lähemmäs -mirip -napiste -tým -kesampaian -ni -alles -kanyang -четырнадцать -tríocha -dù cho -tid -wat -γρηγορα -tę -当着 -ditandaskan -سەر -રહ્યો -حَتَّى -tudo -mala -kunt -aujourd'hui -agus -peräti -primul -tjugonde -ssa -omaksi -vuosien -cuenta -آخر -nag -далекий -isnin -zan -aínda -れる -રૂ. -podemos -tivesse -likod -oikea -영차 -двадцать -hyviä -everyone -mien -altý -હોઈશું -jíž -d'ho -虽则 -maaaring -під -naša -elf -estis -לכם -ολων -nagyobb -intorno -असून -лицо -' -自各儿 -'ll -eren -ĉu -lehetőleg -beginikah -must -こちら -म -vidare -keselamatan -pernelyg -once -เมื่อ -stb. -ediyor -saja -kvar -deverá -προχτες -پوچھب -importance -vefes -vietoj -dhan -lá -чего -hellre -előlük -ครั้ง -pertama -aun -chành chạnh -gewoonweg -kaikkin -talvolta -haut -bèn -∆εξια -yakınlarda -тоже -ओर -tali -according -دیٌب -nový -fyrtionde -saját -tulisitte -باز -واحد -غدا -var -mint -prostě -सभी -majhna -övre -yhteyteen -operasi -szerintünk -noon -żadnych -sujed -aş -bây giờ -potem -nevadí -viiden -čí -ws -ago -menambahkan -tādēļ -b' -گيري -hit -seu -ثھرا -비교적 -theyre -bernama -তারপর -they've -mej -cv -vreme -unsere -kai -miña -ต้อง -شايد -hvordan -tegnap -ju -percio -brokenn -自打 -estais -pronto -sense -dimaksudnya -οἳ -তাঁকে -quizás -dias -года -استفاده -eus -újra -sebaliknya -توانستی -이럴정도로 -رُبَّ -berapapun -pez -ori -הרי -también -utan -much -jolla -siate -perdana -vere -حتی -том -sabemos -sinä -kahit -کرتی -coas -vijftig -rám -usah -ثبلا -tega -tiesiog -ongeveer -τὰ -bj -toistaiseksi -dalbezh -ομως -hata -bấy nhiêu -kylliksi -magst -reasonably -teve -ympäri -takéto -långsamt -saremo -ὦ -heidän -mợ -এ -નહીં -할줄알다 -săi -gehen -hk -lin -unnek -까지 -اتفاقا -nosas -propia -jedna -ligado -probabilmente -موقتا -mate -ًبگسیر -bagaikan -જ્યાં -úgyis -رو -verdadera -不尽然 -pentingnya -야 -એનો -mě -codesto -stavi -nio -vaig -velünk -priekš -nemcsak -nekatere -första -tan -aux -nånting -please -رکھتب -deines -viimeisen -bản -n'he -γάρ -فرد -dimaksudkan -kromě -muito -geçende -呢 -gmt -chắc -értetek -还 -sob -added -ہوتی -पुरा -نمی‌شود -ử -دانست -the -å -olsa -begitupun -فوق -عنوان -aming -behalve -خیلی -anvet -juosius -或则 -ορισμενα -اگرچہ -refs -nedělají -결과에 이르다 -その他 -हुई -καμποσοι -full -omille -נגר -egyéb -연이서 -menteri -sokongan -inú -farai -ngay lập tức -manche -fin -году -nhưng -στου -nazaran -hopala -हि -thans -cet -省得 -például -panevedo -taol -give -sois -kļūs -outro -fölé -这么样 -neverf -ouzoc'h -ktorá -ετουτος -trời đất ơi -habe -ejemplo -gelgelelim -dwoje -тем -sebuah -utama -savæs -ناگاه -tọt -bana -poucos -ڈھوًڈیں -તેથી -estad -ano -drugi -number -kaþkas -worden -naj -لو -inkább -πως -你们 -сидеть -offen -teníais -casi -macche -oluyor -perjanjian -we -kom -'z -hor -иногда -estrañj -sommige -では -longest -anieji -ðe -ainoat -look -won't -foron -neće -ulteriore -正值 -mea -mia -takémuto -كأيّ -tage -negara -tänne -هفت -fueseis -egin -beide -ở -mögötte -کیطب -laatst -millä -davanti -hennezh -varia -τουτα -deux -bukannya -kebetulan -likewise -매번 -dwa -ลง -vihan -mis -hyviltä -lequel -ποιων -নেওয়া -kennessästä -samaan -요컨대 -também -довольно -cuando -کوًطی -voordezen -theyll -do vì -altul -även -لەژێر -мнозина -poelladus -जिस -والے -까악 -habido -stad -xon xón -for -mau -carora -چقدر -aloitan -doar -too -seriez -jadi -werdet -tiklīdz -reot -rata -اكثر -diniagakan -face -ésta -어느 -pati -estás -jakaś -dirazo -посмотреть -обычно -ra -selon -زبلات -sedikitnya -아니면 -μελλεται -一则 -určitě -يابد -pelo -ezzé -جريان -再说 -aceia -deste -fo -hatte -katriedvi -wheres -persekutuan -타다 -должный -जीधर -ให้ -οσος∆ηποτε -thanx -which -στων -sana -смотреть -včeraj -akasema -ötöt -نمي -ovat -dele -aveţi -kn -sarebbe -sarò -hierna -불구하고 -আমরা -잇따라 -quyết nhiên -ndani -tajame -બહુ -vì thế -τοσην -enni -popri -büsbütün -થતા -votre -önökre -asing -nogal -끼익 -ones -بتوانی -sicer -varför -edilecek -abba -پھر -biti -ολοι -رسما -ponedeljek -soweit -dimungkinkan -ثغیر -sté -екип -potrebbe -než -ad -velem -καποιον -нею -elő -이렇게말하자면 -seien -ἀλλ' -مگر -εκεινος -curând -như thể -իսկ -hogos -أضحى -ના -bấy lâu nay -site -melléd -ways -ouezis -اینکه -quant -jebšu -keille -noilla -jälleen -unor -hva -selv -junto -sokat -thảo nào -kanssa -josiomis -daaruit -alapján -ése -dreistor -μακρυα -이렇구나 -graţie -tenidos -девять -möglich -ab -fus -lumpur -그런 까닭에 -ગયાં -τότε -oricît -onder -quelque -tenim -olivat -jo -semalam -αντιπερα -amatlah -tulee -tälle -dessous -때가 되어 -아하 -меля -이외에도 -کہو -bennag -altı -조차도 -vreun -哼 -あれ -팍 -allò -iba -another -μονους -át -হয়েই -เช่น -meğerki -nihayetinde -خگہوں -dạ -せ -fece -کنند -éramos -nosotras -হলেই -nasi -taviesiems -đáng lý -cứ việc -över -περυσι -moaniaat -hebben -interested -حيث -brasañ -מאחורי -dvě -paèiame -é -keys -것과 같이 -lahko -недалеко -neque -علاوٍ -докато -pienempi -ને -telle -人家 -títo -gut -trabajas -همچنين -algun -yli -شدی -esser -uudelleen -ataukah -אחר -будет -οποιων -essi -कौनसा -이와 같은 -总的来看 -jouduitte -ορισμενες -volte -xăm xúi -beje -στους -向着 -dacă -musím -myötä -hañ -einen -geñver -하여야 -çünkü -zde -penduduk -čie -eil -nớ -rồi -عندما -wanted -menyatakan -estén -señaló -kikben -dritten -রকম -tocmai -जिन्हें -omdat -איפה -होना -nećemo -nélkül -powinna -mengatakannya -datum -lanjut -那样 -boum -पाटील -han -рано -távol -doi -ďalšieho -where'll -gruppo -چیزی -什 -какая -bera -sahi -תחת -voidaan -hedden -fossi -horietan -ہوًے -notre -birileri -ολες -આને -trata -parecchi -celi -lain -estamos -nechť -اة -کیوں -preter -kahdeksannen -tím -etessa -여섯 -terei -bohužel -доста -乃至于 -önökbe -весь -anak -અંગે -तिंहों -deminden -omtrent -bene -vooraf -mul -એક -trína -čím -blijkbaar -lk -containing -far -mohl -jiné -teidän -τοσα -ممکن -ditunjuk -eûmes -dwaj -buat -miliardi -takí -mennyt -chez -pret -kanye -draou -dikatakannya -schluss -toliau -тя -visa -wa -ทํา -却 -selanjutnya -هاي -снова -hvilken -great -alól -her -πωσ -еднакъв -ours -bộ -여러분 -untuk -nemetañ -под -! -khi -notwithstanding -andern -স্পষ্ট -volnék -sepa -estivessem -habia -vezer -倘若 -اللائي -مذ -εχει -있다 -cinquième -propios -كِخ -despues -হওয়া -viele -چو -ötven -klak -gwezharall -oufen -antoi -μεθαυριο -partir -maj -दिया -test -याच्या -ًیب -dagli -stessa -ðit -nível -quickly -τυχον -kopš -său -ей -아야 -بسبب -yalnızca -nasze -baharu -elbette -八 -zda -게우다 -find -mulle -tavoitteena -важные -dasein -كردند -debe -βεβαια -zur -dar -oranla -αμεσα -obok -哪样 -manieji -ešte -eđer -dost -menunjuknya -گے -pemp -afes -hänet -છો -àti -estiver -бути -ensimmäiseksi -masalah -डॉ -ต่าง -dahulu -einiger -elõtt -莫若 -neked -buy -tegen -aside -sufficiently -ơ hay -ها -sedmo -amíg -visoka -ogi -bs -因 -нх -самый -тебе -dónde -ansiosta -为 -birkez -ريزي -této -gd -tàjá -honnezh -dahilen -además -şuna -ṣùgbọ́n -أنتِ -isto -云云 -曾 -ezeknél -morajo -artonn -কোনও -rejoc'h -ensin -cos -سالیانه -% -lige -elsősorban -były -هرچه -opp -восемь -trettionde -aen -tällä -līdz -esas -hacemos -دکھبتب -આપણને -oc'hpenn -haluaa -detras -ὅστις -vieri -أولاء -只要 -نداشتید -ouiec'h -serão -daardoor -makanan -més -jšte -anøjø -مانند -منها -هَجْ -开外 -minek -която -downwards -asemenea -پوچھو -حيثما -لیب -nonetheless -hodně -nommés -haliyle -vostri -anni -gick -etreoc'h -houvermos -houverei -τουλαχιστο -cînd -غير -утре -$ -sb -whereas -dum -amelyeket -μαλιστα -lepe -manoji -مابرح -chết thật -speculatif -inmiddels -mx -évi -أقبل -birþeyi -twym -خدمات -apenas -caminho -demikian -teillä -kiktől -ayaa -things -sagte -어디 -& -bon -è -secukupnya -tuhat -越是 -diperbuatnya -terlebih -menimme -sau -nebūt -اوًچے -mình -কি -tawaran -이로 인하여 -vasta -אותה -tuturnya -‘ -gant -brrr -eget -modo -inainte -insieme -elva -despacio -τετοιου -می‌رود -οἱ -hoćeš -ἀπ -jumis -زبضر -peurvuiañ -juta -tavalla -น่า -bababa -کوطي -کماکان -דרך -didiac'h -harga -ثٌذکرو -अपनि -hervezon -walang -থেকেও -καμια -sobretot -喽 -jajam -isurzhiet -앞에서 -днес -رسید -niille -sk -toutes -mögötted -sareste -られ -μεταξυ -usually -chce -kalaupun -někde -kjerkoli -euh -पूरा -仍旧 -不特 -ga. -težki -defe -gaan -ποσος -farei -ms -lima -صورت -dix-huit -étées -ذينك -تا -end -vouă -thế ra -eleinte -নিয়ে -ফের -שלו -eue -mögüled -za -且 -semble -uniques -даром -giacche -dibuka -folgende -hend -ukuze -baţka -takoj -다음에 -deve -যত -sine -našeg -ديگري -všetky -starp -nouveau -forty -niektorou -fünf -gutxi -cannot -deren -кажется -म्हणून -aibă -জানতে -好 -tavàja -rumah -从 -heissä -machen -давать -akému -horra -tom -으로 -پنج -hoću -т -už -hariç -יהיה -thẩy -ĝi -vielä -હતું -اللتين -주저하지 않고 -غے -نداشتی -går -sons -tyto -καμποσων -netoli -de -سوف -sice -tussen -căror -во -하기에 -نداری -baik -kahteen -kaip -beim -можхо -시간 -دیکھی -ví bằng -dekvet -θα -hemendik -porque -εξαφνα -kaþkoks -hast -יכול -high -vissza -napaka -akéže -enfin -它们 -egalement -mögénk -한다면 몰라도 -لَيْسُوا -cadascunes -menee -بگیرید -زمان -echter -чтобы -gälla -largely -adjö -tieku -olmak -啊 -vsaj -didnt -itsensä -ngộ nhỡ -onzième -આવે -তোমার -vice -tuvieron -indicate -sudah -seba -či -بەردەم -seisear -จาก -therein -αναμεσα -ag -mají -کردیم -hé -egészen -razh -premièrement -mới -إياهما -mikre -diavaez -lavarout -tehát -동안 -mengumumkan -habría -þey -'m -往 -其 -gerçi -بين -دارد -отож -vuoden -birşeyi -ly -sinut -یابند -certi -mögületek -의거하여 -todas -ayrıca -여기 -оказаться -ötödiket -devers -tento -本着 -habt -artinya -vis dëlto -oto -îmi -hainbeste -там -ضدِّ -iyo -tregont -olisitte -скоро -з -નહિ -les -seeing -halusin -kukka -tym -इंहिं -করেছেন -خواى -serta -indicated -极了 -shes -tanh -喔唷 -aren -ετερον -mihez -blam -nó -houvessem -numai -dijelaskan -ací -baina -кога -quelcom -devant -دیر -하는것이 낫다 -njihov -время -tafi -ezekben -nuevo -epeyi -تھوڑی -ơ -aurons -describe -små -خبًتے -phezulu -sinusta -? -ðioji -چبہٌب -защо -shell -paano -cùng nhau -cùng với -עצמי -ráo -oft -del -ребенок -小 -verschillende -اینجا -двете -oitavo -kiket -завжди -τοὺς -할 줄 안다 -laisser -diakhirinya -sarai -дальше -keit -третий -থাকেন -嘘 -jotka -ceathrar -한항목 -bekerja -weer -ligger -joukkoon -kanya -älköön -αυτο -μολις -tudi -لَيْسَا -팔 -través -oben -τε -οποιο∆ηποτε -toiseksi -cukupkah -sini -kentañ -такая -aion -κακως -যারা -amb -niektorými -têm -οποιας∆ηποτε -különböző -njima -seit -diperlukan -nanti -তাও -q -post -conmigo -комната -〉 -जिंहें -ο -sotto -下 -된이상 -; -aie -manàjá -شوید -yüzünden -کئے -ktorí -biasanya -valamint -wart -vả lại -aki -σύ -sunteţi -부류의 사람들 -داشت -nejakými -לעבר -lui-même -we'd -двама -贼死 -ului -καλα -bile -گروهي -savas -的 -她们 -т.н. -καθενας -korre -outo -대하여 -lepas -lite -masih -hae -আগামী -ποση -તેણે -ối giời ơi -osmi -thi thoảng -thế là -noihin -tele -wohin -малко -през -autrefois -દરેક -कर -saya -tokia -plej -asupra -avea -sebegini -aznap -σεις -толкова -ug -antaŭ -α∆ιακοπα -anosios -时 -taču -manajam -tes -તને -만 못하다 -filanca -جلل -further -täytyy -kicsit -왜냐하면 -aikovat -gelijk -हुअ -kiujn -केला -以致 -mida -houverão -especially -každého -عسى -addig -её -gırla -molt -perche -naquela -以免 -их -odprta -takúto -ấy -เปิดเผย -صسیر -alkuisin -molta -naŭ -pertubuhan -كمتر -tem -всичко -szerinte -اًذر -bal -honi -哩 -哪些 -alla -oughtn't -fais -mną -ďalšom -vamos -上 -čej -varie -अधिक -kelihatannya -meğer -ocht -doit -nobody -niektorá -لگتے -fik -citeva -κανενα -kwamba -netra -põe -valaki -pudo -amen -ayons -kellene -دیروز -pengurusan -sue -diabarzh -stesse -그러한즉 -keissä -zowat -fr -الف -hervezi -ziouzh -kunnen -tremenet -car -وفي -deed -davedout -כאשר -अंदर -helyett -infatti -maklumat -ita -prazno -detrás -怎样 -לעיכן -nasılsa -phải -mahn -jah -নানা -由此 -결국 -твоя -ide -logo -چگونه -beings -윙윙 -dinaou -bardziej -نام -ma -viertes -bagai -malgrado -его -اچھے -ওকে -ha -nevertheless -diantara -devo -aqui -mögöttetek -thats -neka -setempat -dă -ἐπὶ -فيها -thus -οὗ -sembrato -según -sextio -sem -vostapl -jednou -ضوچٌب -máš -itd -kyllä -proto -ايم -wszystkim -گذشته -лежать -unsen -哪个 -than ôi -ετερης -ninety -grec'h -aia -olette -hop -liesañ -noch -oitava -kar -parler -לו -vaju -cần -thôi -由是 -comme -s: -seríais -کرا -犹自 -ًقطہ -llavors -begitukah -나 -줄은모른다 -بیاییم -هَؤلاء -alrededor -نكرده -kanssamme -sich -μερικα -dört -soñj -tähän -الى -janganlah -l: -sepihak -بضع -ejoc'h -譬喻 -lv -uses -hors -οσοι∆ηποτε -kļūsti -mellé -inne -gått -تحوّل -pif -többször -стоять -я -olan -points -ثُمَّ -tn -મૂક્યું -دارم -から -quanti -главный -manajai -यदि -eizhvet -prosím -hát -οὐ -别处 -dermassen -anyone -seasca -dall -serait -every -ganeoc'h -warnon -gemacht -أوّهْ -किसी -ये -befe -kenkent -htm -tulevat -noka -ہوا -dis -آمده -heuliañ -reiñ -यह -خواهيم -þuna -chợt -estuvierais -nebyly -baru -بعض -ফিরে -úr -上下 -નહી -juk -eigenes -cum -d'hor -زیر -henn -myse” -ἐάν -empat -哪 -apart -بار -noso -μὲν -währenddem -akéhože -αλλαχου -από -بعدها -今 -kind -îţi -zeu -正如 -年 -nito -dirazomp -estaré -guna -děkovat -hardly -eerder -niaga -ὅσ -pian -cual -sell -οι -อยาก -ausser -doesn -ιιι -כולן -tamamıyla -व -phỏng -fins -tikām -至于 -따지지 않다 -hoc'h -її -anos -mesmas -այս -mann -nyolcadikat -ella -كرده -nekje -môcť -kunnat -bắt đầu từ -kitoks -gwirionez -olisit -tvojim -ઉભા -لي -ai nấy -sju -момента -откуда -pẹ̀lú -itukah -kamor -eaba -dz -যে -ne -næste -quel -etc -take -satojen -dunhas -syarikat -pravé -câţi -کجاست -哪天 -ещё -neděláme -hui -据 -مليون -nc -전부 -كيت -nenhuma -deprisa -gibi -suuren -tentu -junij -هەروەها -kenen -οπωσ -= -dreisto -خواسته -using -આપણે -понимать -不单 -differently -آنكه -از -chính -petoare -este -tule -ждать -κανεις -אס -di -deka -ποσες -زمانی -ενός -dezhi -nhất luật -若是 -lahke -bao nả -一方面 -daveto -которого -tras -شونده -예를 들자면 -eviti -이와 같다 -때 -โดย -tungkol -bezañ -diouzhoc'h -as -lang -گرفته -we've -second -sometime -kahdelle -מאד -aku -étais -berikan -οση -nhỉ -뿐이다 -önceleri -solas -derde -دکھبئیں -mengambil -거니와 -گرفت -eerdat -д -yet -šesti -araozomp -però -möchte -neyse -а -important -minuun -dire -- -selasa -olmadı -aquests -केली -aldaar -ali -önnél -kesihatan -परयतन -与此同时 -ετουτης -ὑμόσ -kisha -mindre -mv -juste -tertentu -gave -вообще -kemungkinan -enfrente -أخ -gedurende -હશો -گرفتم -cf -falta -zuek -imi -سبحان -4 -bv -sure -niçin -tuhannen -затем -מנין -cho đến -gt -отец -ert -zuen -въпреки -друг -tikvien -közül -การ -ضوچیں -لە -ارد -ó -sebaik -વગેરે -लेकिन -seenaknya -caut -miksi -उनकी -لعمر -twenty -proximo -wasza -šesto -ús -afed -kuuden -tersebut -이와 반대로 -κανενος -suas -szépen -varje -换言之 -αυτον -terão -우르르 -õket -هتعلق -সেটাও -этом -hebioù -suurin -bueno -ouzhin -zo -מבעד -nelle -आज -恰恰相反 -πρεπει -ţie -olit -دانند -fjortonde -કર્યાં -ти -сказать -cứ -wọn -zunächst -apres -ισως -sm -mengucapkannya -youadenn -sebaik-baiknya -panevedon -ārpus -põem -thì -без -呼哧 -另悉 -derivatives -pula -αποψε -zirak -ὅ -δεν -چیسیں -d'hon -und -ouzhoc'h -exactement -свои -fick -每当 -actually -براي -seachtar -ondanks -ledaže -kleinen -و -ogni -huit -kelima -đang -বরং -heidät -lugar -blive -καποιους -tuvo -tidigt -kwenye -kiitos -谁知 -εντελως -kenapa -fosti -obe -вид -stavo -både -acelasi -pot -aucune -itu -như vậy -vsega -دە -rantau -quatro -করতে -dëlto -повече -o| -pell -哪怕 -dix-neuf -tavieji -onidve -â -así -jawabnya -自己 -heeft -keadaan -ناشي -sint -musíte -सर्व -hubisteis -stesso -elsők -finns -此处 -vill -kratke -naging -ضکب -honek -iq -podrá -ngày càng -عوض -apa -vosso -أي -teringat -voitte -bawat -全体 -sous -kezalik -ylemmäs -tā -正巧 -backed -운운 -możliwe -giorni -이봐 -onculayın -nerzh -ترتیت -moreover -αφοτου -eben -kaþkatra -sau đó -permetiñ -minimi -senden -čtrnáct -nini -sejauh -alam -niente -savuosiuose -повечето -savosios -ďalšiemu -konden -ξαφνικα -tenant -menanti-nanti -selama -menanyakan -avut -нога -davon -ðiøjø -kommit -bất đồ -horri -મારું -对 -segala -cima -največ -あっ -statt -aniž -alt -viel -دیگر -cokolwiek -abord -первый -bigre -કરીએ -tuvieran -اً -he'll -ضبت -dimaksud -haikki -aquilo -कोई -থাকা -लाख -coraz -znów -เรา -nuo -aquella -verdadeiro -astazi -tông tốc -manosioms -foram -以 -αυτα -ouezo -具体说来 -ellas -míos -penerbangan -co. -обаче -может -muli -ối giời -ĉiu -waxa -doktor' -даже -可是 -kaikkialta -rafe -다섯 -à -باشید -zm -että -بلافاصله -puo -μερικους -nové -walau -jotain -najina -赶 -mehr -herkesin -felek -göra -boven -paèiø -איזה -عند -” -তাহাতে -καμιας -rajes -cette -لَسْتُم -看 -у -ποῦ -τήν -τοσον -હતા -mengungkapkan -grande -nekaip -ennon -вот -peseurt -دیگران -realizado -الذي -؛ -언제 -前者 -каждая -сначала -નં. -何时 -meiner -o: -ὑπ -איתי -казаться -навіть -啷当 -했어요 -jakby -dans -مرسی -semasa -lettek -dikarenakan -plu -bezomp -بالا -usamos -นัก -bao giờ -au -permintaan -εαυτων -muutaman -evenly -уметь -achte -omlaag -tapi -realizar -zich -آنقدر -شدند -lat -thực sự -いう -bolo -هطبئل -এমনি -lès -njiju -veertig -ποιους -потом -באמצע -teitä -práve -ισια -hozzájuk -tőle -diganin -eh -immediate -بيشتري -último -inget -nhân dịp -lr -seterusnya -estaríais -不惟 -οσων -hubiera -علاقوں -bennük -bagian -joutuu -में -disebutkan -многочисленные -ἥ -kouže -lilla -보드득 -taps -odprti -její -إياكما -kaunter -itself -আদ্যভাগে -mám -ved -show -点 -자 -parecchio -vindo -đáng lí -lhe -karkoli -ταχα -εντωμεταξυ -凭 -elõ -önöket -esetben -assim -sextonde -müsst -tě -colei -queremos -hon -kaþkuri -weg -merely -actualmente -jakmile -achter -mennessä -আমাদের -meğerse -pripravljeni -nombreuses -بهتر -за -দিকে -an -больше -alisema -ohne -भी -pelbagai -oder -redan -india -weren't -c'hoazh -c'houst -napište -tavajai -থাকে -qv -rajtuk -stesti -tanto -susut -الألى -lui-meme -zoken -adal -کسانی -kong -múltkor -saatnya -capat -трябва -some -उनकि -thru -serais -해요 -notamment -એના -manalagi -joten -aiemmin -savoji -sobie -dizem -ก็ -daarheen -lättare -kere -τοσο -ac'hanout -unan -אתה -detail -هي -toud -savasai -αυτοσ -אתכן -toujours -dafür -mulţumesc -याची -特に -bizden -cg -beforehand -گذاشته -उन -pelec'h -aurions -make -bermacam -néhány -agaknya -sedikit -除了 -之 -sellit -mitkä -estàvem -乃 -اردگرد -éves -werden -ingi -but -lijken -tidaklah -belül -traoñ -دریغ -mistä -alhora -jakkolwiek -работать -afent -અને -heitä -uuteen -jehož -voe -ním -οσην -দুই -seksen -quelli -bis -estaban -invece -dehou -mellőlük -svoju -करता -임에 틀림없다 -cei -heb -بخشی -pakeliui -wanting -عام -многочисленный -dol -ganin -wont -kleine -haluavat -ástriþai -光是 -lepa -تانِ -рука -diversa -کی -বলেছেন -intento -másik -diri -haven -φετος -ekzemple -دیتی -biết -majú -尔尔 -thou -أب -ًب -얼마만큼 -替 -nokon -trước đó -dindanon -сега -ðiosios -tener -veled -nå -ouejomp -olmadığı -turbût -vijent -houvéramos -già -czemu -beriki -ثلاثة -tidakkah -因而 -cit -لگی -پبش -υστερα -全部 -veces -kivel -bài -mögül -scola -كردن -little -kohti -هٌبضت -آن -pred -ketten -tři -теми -breve -vel -chtít -poorly -설마 -tenaga -τί -един -επομενως -하고 있다 -로 -poln -ετουτον -અમારું -ًو -ezeket -täten -روی -maynt -pk -oggi -fazemos -দেন -εσυ -wong -dẫu -menerima -eñ -anterieure -semisal -παρά -alattunk -blízko -ću -কাছে -telt -всички -hayamos -について -كليكما -másnap -chỉ -namelijk -rouez -उंहों -mer -xệp -εκαστα -cuáles -ουτε -emplear -ضوچتی -જ્યારે -thình lình -amolyan -jakiś -कोइ -primeiros -c'hichen -p: -saat -mmoja -jetzt -eran -femtio -孰料 -due -ὅδε -нее -bhd -atare -tengamos -самих -sabeu -줄은 몰랏다 -माहिती -zullen -εμας -ðiàsias -宁可 -جا -karibu -نِعِمّا -ral -mihin -dazu -रखें -توانستن -是 -ἐστι -نسبتا -otra -التى -volnának -kì -rodos -gar -काम -aztán -하겠는가 -muss -soc -իր -es -concernente -theyd -няколко -એન -નીચે -apaan -করিয়া -takejto -fjärde -mégis -åtminstone -pegiz -οὕτωσ -करने -dirazañ -칠 -εγω -حتى -tulisi -비슷하다 -doksan -ٓ آش -tắp lự -ἤ -varēju -ganz -ts -गया -seemed -których -estaremos -ac'hanoc'h -لَِسْنَا -কিংবা -لەباتی -scorso -え -、 -някои -غذ -ahora -miattad -przecież -هما -rin -memintakan -关于具体地说 -particulière -哇 -لەدەم -uusien -şeyden -perante -balik -यही -nämä -virðum -querem -kakhulu -there'll -d'e -sabeis -stava -γι -借 -tosiomis -mahu -kenenä -edomp -hanter -eures -mengatakan -לאיזותכלית -ahime -thirty -vers -kapankah -anokia -哉 -vám -enkel -via -molemmat -teille -gesagt -tv -hark -μην -होती -facciate -ponad -выйти -tarde -g: -لَكِنَّ -nejakom -ceva -boš -bertanya -cảm ơn -xăm xăm -遵循 -als -할 힘이 있다 -ησασταν -אי -nogen -berkaitan -رہی -kaya -较之 -什么样 -حَبَّذَا -hanya -kontrak -member -konnte -we're -els -sah -اولا -naşi -նրանք -: -ضوچتب -کبم -doing -ended -каждые -إليكما -και -રૂા -mahdollisimman -αλλοιως -আজ -foi -voltak -åttonde -mac'hoc'h -وهي -ὃς -пойти -tack -oi -comigo -hori -molto -जात -having -katanya -inna -betra -hun -fueron -گاه -mm -oái -beslutit -cumva -οσης -consigo -عذد -ظلّ -sulig -ðiuosius -ĉiujn -marami -jouduit -tosios -kaffesi -différente -jûs -voi -아이구 -sedaj -båda -težka -nonkungu -چکے -biste -hinter -oysaki -xiii -$ -ajan -faoin -já -facciamo -trí -temu -tvojich -ter -kada -اضتعوبل -થી -был -ঠিক -咦 -ṣ -knows -perlu -estuvieras -malah -바꾸어서 말하면 -jau -works -mindegyiket -berbanding -หลังจาก -hanggang -کہیں -को -recent -jeho -ποιουσ -alatt -плечо -hauek -douzième -ًطجت -dalam -故 -toh -čia -malce -هيا -dữ -pumupunta -foei -wollt -zer -tri -vort -πιο -else -mod -রয়েছে -index -لەگەڵ -vårt -meistä -üzere -peurliesañ -bm -godt -μαζι -naonúr -тъй -边 -suivants -estuviste -ทั้งนี้ -главна -어찌 -এবার -weitere -näissä -terbaik -száz -speriañ -propi -每 -trying -us -jež -ham -بي -dins -hasnt -مطمینا -poc -koulskoude -nemu -szemben -tuy thế -امام -참나 -οποιον -doivent -vlaou -kahta -who -以来 -ως -poi -siebentes -lakin -vung tán tàn -amerika -két -kýsaca -bf -જેવી -kwenda -gerz -થતું -λοιπα -fix -obrigada -stranañ -以上 -tanyakan -agl -fie -grenn -随时 -work -usefulness -tău -sata -ora -jiesiems -ðalia -بسّ -взгляд -yang -noone -p' -这时 -adalah -önről -dove -bäst -tiveste -stiate -quá đỗi -冒 -dykk -nas -kuriuodu -jan -三 -nenio -竟而 -આથી -ditujukan -useimmiten -zum -hendaklah -beveik -काही -vašich -expresó -نهایتا -kanilang -evvelemirde -maada -안 그러면 -slightly -nôtre -varēji -하든지 -aceea -이라면 -fire -تو -porquê -polna -هطلق -אנחנו -kiemu -أمامك -sina -هنگامی -diar -ενα -zapewne -বলল -ilian -hes -xoét -naturel -גם -müßt -beiden -musia -* -among -havu -illetve -इन -afin -tavosioms -decir -quer -maging -huwag -gy -ওর -varsågod -вздовж -કરે -долго -самом -sap -combien -باره -ही -iad -hag -x -них -об -whence -ňom -perc'hennañ -얼마간 -عمدا -excepto -alltså -แล้ว -ar -malgrat -সমস্ত -sataa -год -entonces -هڑًب -αὐτὸς -쳇 -obrigado -จึง -kemungkinannya -kedua -cause -इसी -نخست -od -greater -giorno -bidang -longe -tied -biết đâu đấy -nos -chère -ależ -ما -fara -वे -اصولا -после -hvis -rejont -להם -طاق -איתכן -ðiajam -सारा -ضبلوں -خبًٌب -such -aent -dolayı -assez -kuasa -توانسته -bynajmniej -bị -whod -יכל -ยัง -καθενα -kenelle -což -kész -ایشان -auxquels -vai -তেমন -עז -lb -могут -yaptığını -rất -xuất kì bất ý -rit -opened -neću -jouduimme -οποιον∆ηποτε -onian -senki -principalmente -kamilah -درضت -would've -jus -막론하고 -lévő -занято -realmente -sabes -jeden -anezhañ -kauemmas -что -慢说 -까닭으로 -phải chăng -זות -această -بکنند -ĝian -tiện thể -avessi -gin -hevelep -دهند -mindenesetre -agar -keine -zehnten -किया -timp -ditambahkan -тринадцатый -واضاف -∆ι -warnañ -двамата -goust -részére -હતી -difer -si -untung -bil -تک -dari -καθως -难道说 -beléjük -بیابد -sebisanya -ανω -nicht -mamy -нищо -bare -usais -'vat -g -way -vif -membantu -یک -ambos -questão -peut -estemos -nóc -làm -شوم -خواستید -watu -까지 미치다 -donc -mungkinkah -jakie -તે -一何 -dikwijls -espar -každú -trawalc'h -omp -lokacin -二 -∆εινα -bezh -ضوچتے -tém -نخواهد -omaan -danach -deben -に対して -saman -احتراما -wenn -嘎登 -tikriausiai -bize -masalahnya -siendo -틈타 -کہے -一个 -sebesar -neuen -niitä -bahwasanya -kaer -thereto -ugyanis -この -ati -oricum -ďalšiu -други -facciano -vari -slutligen -령 -своего -něco -белый -যাওয়ার -ondan -estava -어찌됏든 -خواستی -mögöttünk -maioria -þunu -diante -outra -πρωτυτερα -에 -mereu -zira -qualunque -vạn nhất -ngay từ -mimi -иди -moltes -dimaksudkannya -기점으로 -دهد -타인 -当 -πολυ -lähelle -तिन्हें -varēsim -trabaja -tiksiet -bell -inny -byt -komme -showing -davor -而且 -fossimo -ognuno -proud -itse -podrian -einigem -begge -iekāms -différentes -ὑπὸ -dixième -viduj -fazeis -nasaan -اور -come -dijelaskannya -ভাবে -होता -hendaknya -àwọn -hari -keza -effect -seuraavat -upp -향하다 -ωσαν -beneden -joilla -wani -chers -estivera -ngayon -할망정 -quá sá -nichts -twas -grosser -其一 -저기 -起见 -امسال -گفتم -второй -erg -y: -народ -کھولے -voorheen -think -سازي -meines -belum -anche -شش نداشته -chi -dokąd -分 -š -hizo -nostra -aiomme -vă -evite -azzal -fueras -riecco -vajon -기타 -habrían -quella -oftast -poques -sekä -has -لەبەر -ðájá -taemmas -comment -আমাকে -همین -أمامكَ -rendre -होते -xv -int -باشند -ver -此外 -beni -wells -پہلےضے -dao -derc'hel -chăng -sami -rätt -то -kiaurai -nevoie -estivéssemos -отново -unui -cả thể -astea -असलेल्या -raya -zaś -不然 -nosaltres -protože -bojo -如果 -lle -না -kokia -nittionde -quả đúng -nejaugi -의 -avem -দু -joksi -pour -ان -고로 -如上 -oricând -ilyenkor -بۆ -પર -固然 -this -önnel -inzake -'ta -mikkel -napot -először -sóc -berturut-turut -घेऊन -noştri -setelah -أنتما -jp -sarawak -aoua -eot -hanyalah -egedout -tavosios -paeiliui -& -eont -attesa -должно -toista -هوکي -yakinen -ck -oppure -seines -خواستند -الثانية -ans -< -emme -καμποσους -éstas -τοσων -مدام -debido -tulin -七 -bahan -reserved -ahimè -yakni -dreiston -niets -vosos -tuona -vierten -çoğun -erdoor -ville -nergens -alóla -böyle -与其说 -dimintai -τοῖς -päälle -possa -sebelum -fünften -উনি -mellém -hapo -kimś -איתו -boleh -بطآن -annettavaksi -μπορουν -weniges -καθετι -cuantas -cuántas -gibisinden -azokhoz -habidos -pur -tavuoju -پوچھتی -কে -pocos -ào -peccato -για -будем -및 -oricînd -mad -但是 -बही -ફક્ત -وكان -topat -পক্ষে -aleshores -نفس -seems -önökön -fas -这就是说 -ensimmäistä -에 있다 -meidän -kala -celles -위하여 -iðvis -oan -সম্প্রতি -handik -masihkah -might've -除开 -fost -estaréis -sisällä -dituturkan -biri -chăn chắn -atin -ᾧ -hr -ésos -cunhas -때문에 -سرانجام -tidigast -と -করলে -sinjoro -kahdessa -können -할 지경이다 -dúvida -занят -wiens -ἐν -geaba -mý -עצמם -oktober -λοιπον -sarebbero -kýrk -nhiệt liệt -quantunque -becoming -minun -ederek -ختن -amelynek -keloù -yhtään -hampir -allons -steste -ogos -tendes -bárcsak -허 -érted -small -lesquels -אשר -edeltä -येथील -wake -她 -ngươi -eens -معمولا -ն -توانم -hortik -qu -עד -alá -kalz -نزدیکِ -إذما -لَيْسَتْ -currently -azoktól -demgemäss -नहिं -mik -fare -کردی -články -vosas -luego -strictement -tienne -eniten -tam -tomēr -tỏ ra -mora -чого -zonder -tuvierais -toinen -следващ -forma -dong -er -ilgili -rátok -nedenle -rajed -neubeudoù -ôi thôi -had -cases -καποτε -허허 -αρκετα -바꾸어말하자면 -كنيد -vèo -ի -össze -є -d'az -pueda -dưới -mögé -थी -sao -çoğu -vedno -συνεπως -nowhere -sînteţi -tuntuu -( -wọ́n -utolsó -আবার -那边 -každým -કોઈ -아이야 -jusque -altii -paese -engem -的确 -能 -procedant -द्वारा -بەپێی -كردم -aké -dejó -fuori -เคย -bezo -সামনে -kvi -যাবে -bilang -belőlük -distro -vijfde -aba -fall -tebi -tempat -איתם -τες -affinché -ðiàja -arti -всем -menudo -peadra -alusta -between -uit -sec -∆ε -wśród -حاليا -misal -ma'z -terdapat -není -꽈당 -더군다나 -حتي -مكانَك -aec'h -ikaw -bởi -sort -free -kel -benarkah -moni -де -kp -menjadi -promeiro -raras -σύν -pela -同 -еднакви -त्याचा -roku -deine -hundraett -voorop -वग़ैरह -허걱 -اين -دەگەڵ -ταυτην -خود -mostanáig -úgynevezett -huolimatta -οὐδὲν -mellette -望 -adelante -hubiese -niillä -membolehkan -müssen -inasmuch -tag -اكد -kuutta -करते -diberi -nişte -estés -veu -xoành xoạch -δ' -vastakkain -redelijk -care -alin -کریں -أما -menunjuk -هَاتانِ -καθε -novos -tăi -와르르 -boli -nerde -لوجی -trệu trạo -naproti -nejaký -onlari -tous -bertanya-tanya -autem -થોડું -этим -hoy -한 이유는 -응 -valami -ðiapus -といった -óta -worked -wanneer -ذلكم -próximo -最 -pieneen -menyangkut -estivermos -پبئے -par -paskui -gour -richtig -hid -जिन्हों -тех -edont -eut -શું -થવું -fyrtio -ٹھیک -nền -অনুযায়ী -ngọt -berikutan -iðilgai -છ -uhel -mellénk -dispoem -då -paseet -houveriam -semmiség -faccia -epey -dag -quasi -tuvieseis -neniun -first -olyan -ben -그들 -yhdessä -և -μπρος -önbe -嘻 -magunkat -deich -pad -그래서 -habré -nemedomp -thậm -हुआ -läpi -kiben -anapus -pasaran -pelanggan -kilencediket -οὗτοσ -proton -gouzout -себе -teniu -though -ničomu -şurası -ktorej -dioutañ -tuyos -daouzek -durfte -правда -zake -azirazon -netko -oman -어찌하든지 -fiche -apalagi -aquells -està -geral -অবশ্য -आदि -tuosius -gran -그때 -일단 -tengas -comprido -under -hjå -kunne -neketa -γὰρ -kicsoda -auf -tanav -takže -tg -conhecido -backwards -οποιαν -muun -עצמהם -몇 -যান -eble -모 -গোটা -pár -বার -μετ -ðitoks -chúng tôi -ιι -c'heñver -zice -vsak -kodwa -mustn't -première -حيَّ -вас -daoust -hoss -خیر -کنون -elbet -آخرکبر -wenige -잠깐 -indinde -warnoc'h -آه -ensimmäisinä -كأين -she'll -hossen -tun -ποιον -betek -working -desormais -jotta -fareste -باشد -troisièmement -zijn -куда -בתוך -pastilah -години -aplink -keñverel -stessi -reve -inými -tive -aiotte -ব্যাপারে -rabu -diye -tandasnya -كاد -从而 -jeżeli -pueden -täältä -zeit -amikor -useasti -certa -부터 -který -előttetek -ακομη -ระหว่าง -usea -彼时 -해도좋다 -żadna -tel -为了 -ειμαστε -dezassete -sesaat -ilyen -יותרמדי -어쩔수 없다 -aos -sawit -anoks -tältä -按照 -পরেও -she -два -tetap -warni -ای -každá -biou -আরও -že -जितना -gliele -mengapa -ความ -quoique -altcineva -azirazout -substantially -insofar -vifs -fueran -birçoğu -biasa -nebent -چه -youc'hadenn -they're -فان -aloittivat -bah -да -আপনার -gleich -不问 -πρόσ -terhadap -як -tizenkettedik -egymás -boşuna -njim -그렇게 함으로써 -خجکہ -maint -aiou -vuoksi -αλλη -air -sg -anywhere -neděláte -นี้ -miattatok -hänestä -terdahulu -cuộc -moi-meme -bepred -possible -но -half -ту -بودیم -মোট -χωριστα -mesi -대해 말하자면 -narobe -มา -nel -خبرہب -bijna -차라리 -六 -une -кругом -тысяч -why'd -λιγακι -ion -olen -इन्हें -mellom -хоть -birţey -gn -milloin -both -evitañ -7 -hver -šest -yule -đại loại -puedo -મી -psitt -o.o. -vele -rendah -καθεμια -εκαστην -ι -ár -used -decit -túto -较 -aczkolwiek -nederst -karena -오호 -οποιου -sekaligus -ভাবেই -något -attraverso -قبل -verte -adeta -pemzek -zichzelf -davedor -všetko -来着 -sîntem -neue -týmto -hyvinä -keiksi -iné -অথবা -consegueixo -করলেন -mindenütt -vì chưng -и -când -kakor -सागित्ले -semampunya -kamže -依 -sembrava -without -super -juuri -অনেক -forem -antai -seriam -جلویِ -οποιος∆ηποτε -nv -ibu -celle-ci -мен -longtemps -دش -nên -মধ্যেও -sinussa -wij -nim -erről -اطار -etrezo -pfut -peze -особено -とともに -lusk -side -能否 -ff -が -vandaan -keresztül -mila -qualcosa -selves -그러니까 -ứ hự -higher -μονο -varte -egeti -nessuna -nogensmenys -którzy -tiennes -bazen -بتوانیم -jenes -بتواند -τουτον -ледве -gwezhoù -kolmen -þeyden -照 -gq -καπως -gi -کھولو -এসে -panevet -خویش -edessä -ησουν -sekadarnya -mío -noilta -waxuu -intanto -článku -与 -bismo -together -จะ -کمتر -gaout -cortesia -쉿 -aquélla -pasada -ضرورت -dó -l -καπου -wase -또 -faig -而况 -اخبزت -不如 -quả tình -koko -harminc -这次 -seeming -jawatan -eigene -semata-mata -viktigast -big -ضے -cuales -اینک -여부 -svych -ваш -yetmiş -considering -rafen -begins -koskaan -بکنیم -تلكم -femte -đại để -moi -vsaka -nachdem -tamelijk -ensimmäisiä -0 -conclusione -دو -bumo -vört -redko -ak -kerzh -sunt -делаю -kaikille -tenemos -بزودی -reoc'h -entistä -ઊભું -khamis -zeven -paucas -toiseen -mikäli -verdade -man -öt -прави -jej -andalah -товарищ -kaiken -berkenaan -било -within -fewer -pieni -novo -человек -reč -تبدّل -어찌됏어 -wouldnt -façon -voisi -extenso -nuovo -sebahagian -vin -قبلا -گیریم -aient -где -haya -pemod -دنبالِ -kadarkoli -meidät -berlaku -就是了 -podczas -suffisant -veya -durch -tiếp theo -flac -order -κἀν -dazwischen -不尽 -viszont -sonraları -tindakan -삐걱 -sapristi -یقینا -jakichś -enkla -ثھی -phansi -ujar -corresponding -ولا -1 -jedermann -μηπως -काफि -dalla -different -evit -id -یافتید -menantikan -kok -neuhe -qui -adertonde -mijn -adalek -地 -waar -gekund -belki -càng -اول -behövt -ejod -antar -" -chính là -lebih -ćemo -wilayah -nào -bấy -μονων -થયું -tahap -לנו -그위에 -ersten -noille -anosiomis -diouzh -αἱ -ん -catorze -ti -icke -kiből -可以 -nadat -jesi -cuatro -miltä -vg -шестнадцатый -maniðkis -ringgit -навколо -ăstea -çabukça -čiemu -rentañ -og -有时 -cc -kahdelta -ετουτη -achterna -puolestaan -এই -sei -andet -scopo -한 후 -עליהם -awalnya -sebarang -virð -attól -enligt -ón -presented -μετά -એવું -fraŭlino -whereby -대로 하다 -būsi -végre -gal -siad -laban -cho đến khi -slab -nemají -futhi -propias -mata -sesi -začo -ganzen -theo -vezan -کجا -terdiri -vezes -خواهیم -fünfter -natomiast -cuál -serons -years -faoi -öbür -pehini -mỗi -pues -triwec'h -viot -huitième -وقال -才能 -menawarkan -akýže -daarvanlangs -તેને -માત્ર -rakt -هزار -súa -tjungo -önökkel -altri -faranno -कौन -αὐτόσ -eteen -'blam -شاید -altre -mios -cry -berakhirlah -berlangsung -بگیرند -youc'hou -εκεινων -μη∆ε -除 -kej -demasiado -elfte -निचे -run -allgemeinen -هيت -melihatnya -آنها -امور -round -idant -savojo -сейчас -mňa -یابد -اوًچب -täksi -hura -sekiz -उस -mo -μονη -seolah -senza -staresti -cinci -здесь -sendirinya -тобто -ένα -구토하다 -kaþkuris -muốn -mateixes -انبرى -facendo -ضبرے -sna -olika -ktoré -seine -دقیقا -ně -annettu -próprios -alcuna -vaikeista -ciascuno -daripada -serei -autrui -aún -μεχρι -burada -۳ -ktoś -eerlang -himself -egyik -disterig -five -akhir -होणार -گويند -尚且 -wouldn -sixième -那个 -mitä -sensible -chini -nemedoc'h -estu -haceis -alebo -jakoś -samalla -ず -december -bola -সেই -ทาง -دکھبیب -really -εἰμὶ -theres -hvorfor -vaikeat -هذه -able -самому -dessa -noen -diberikan -manchen -to -haarzelf -wants -spesso -좀 -kýže -قطن -jouduin -usar -گویا -这个 -这儿 -tuotä -pmid -ком -zaprti -evveli -været -لوجب -belőletek -اي -করবেন -ouverte -بكن -treize -wessen -ní -starebbero -हा -odmah -самими -azokba -든간에 -houvéssemos -ennoc'h -emezañ -ouzhit -گیرند -pār -alongside -tikko -شناسي -москва -যাচ্ছে -بیش -estejamos -rasa -takýto -telah -teneis -hende -mögülük -cha -توانستند -داشتیم -هستم -långsammast -چبر -στην -gayunman -vært -sto -dahin -হোক -ouzont -sendirian -mezelf -वुह -sekarang -enseguida -going -avevano -чуть -našimi -aikana -તો -hubieras -ก่อน -derselben -kerana -جناح -kivé -bådas -αυτοι -hvem -două -meer -verscheidene -ő -hell -си -هلمَّ -verder -presents -aller -allerdings -kívül -mať -dituturkannya -< -نحن -megcsinál -tambahnya -なん -solamente -oikein -setidaknya -سریعا -pusat -aw -avutta -diingat -anything -veď -tene -연관되다 -thỏm -tuttavia -bij -哟 -herein -이렇게되면 -वाले -negi -waarom -masing-masing -sommes -cărei -સુધી -કરવું -drede -partant -καμποσες -ðtai -desselben -každých -sering -ligga -mûsiðkis -hátulsó -pengeluaran -ہوًب -时候 -к -öteki -preto -niech -keď -quién -אחרת -كرب -cât -kļūstam -故此 -હશે -घर -šaipus -youre -tulad -eivät -cmon -yake -顺着 -wollten -haietan -δε -memperbuat -οσα -تھب -henüz -percuma -致 -мои -каждое -hona -какво -again -voorbij -ära -尽 -yhdeksän -négy -گفت -cierto -ut -还是 -ثبئیں -只有 -sejenak -가까스로 -的话 -ทุก -它 -gärna -ţayet -senare -našim -нужный -несколько -heu -でき -ποσης -какой -meihin -staremo -urzh -چھوٹوں -jisai -tulimme -이 되다 -gdzieś -nous -より -diadakan -etenkin -इसि -muuten -ضرور -себя -کب -будете -うち -cujas -he's -budou -اما -الاول -durften -tieto -problem -estuvieses -至 -nice -gp -יוכלו -여전히 -aceştia -inen -toji -zoals -dimisalkan -τοτε -vase -jù -svůj -értünk -ditutup -غیر -էի -不只 -éljen -birden -ضوچب -paf -אותו -хотеть -feci -vůbec -quante -ею -vil -halusivat -largo -तिन्हों -koder -savieji -yes -ἔτι -mediante -بتوان -külliyen -năm -wszyscy -퍽 -specifying -jövőre -vị tất -なかっ -另一方面 -albaabkii -taip -여차 -ekz -झाले -kaikki -wherever -un -erant -cikin -مبادا -tretji -ثھرپور -boste -как -fûtes -serantau -ω -ส่วน -menarik -ihres -što -mikről -inár -daquelas -pogosto -纵令 -کرو -tất tần tật -一转眼 -cũng vậy -prazna -cadascuns -کاش -atatea -گوییم -podría -minulta -fûrst -muut -wie -waren -συχνους -avente -ony -dla -dezanove -čoho -ہی -plutôt -bien -gente -usaha -دفعہ -这些 -joudumme -gewollt -براساس -t'ha -aynen -c'herz -parhaillaan -tutur -及 -ق -tamamen -menyampaikan -нито -mochte -لَيْسَتَا -گویی -musíš -away -får -أجل -how'll -jakož -click -nestas -ví thử -teves -bỗng nhiên -het -abaoe -nhung nhăng -makt -heñvelañ -minkä -उसके -তিনঐ -একবার -nju -dont -εκαστες -februar -fine -oraya -tutaj -* -than -أ -tisíc -ετερας -pekerja -داشتن -همين -don -közel -genast -noll -nove -あそこ -như không -tiba -kerkent -das -են -vile -elõször -براحتی -quoi -про -至若 -থাকবেন -tenía -นํา -keďže -أيّ -quiconque -behöva -нет -пор -skersai -对方 -dalgunha -jualan -例如 -vo -press -yìí -naši -mögülünk -selle -zut -当然 -azokon -sekadar -ông -dieselben -ગયા -것 -e -tisto -ouies -keiner -neoac'h -wo -خوب -mampu -deuxièmement -pegen -لَسْتُمَا -phứt -nondimeno -clanek -مليار -ezekre -وار -codesta -ňou -quan -oac'h -尽管 -vain -kali -cioè -moim -macam -له -thuần -katiyakan -leicht -vlan -cineva -ἐὰν -دلچطپیبں -ви -زيرا -com -ngoài -嘿嘿 -五 -nielen -über -vé -οὔτε -ہوئی -consecutivo -ι∆ιοι -paitsi -macht -헐떡헐떡 -jolloin -εχω -nhược bằng -dibar -뒤따라 -premier -alattam -vingt -لگٌب -wahamba -정도에 이르다 -なら -very -spolu -vasenmalla -总之 -أنّى -dovra -| -welcome -ðiojo -무엇 -evelti -yok -કર્યું -dindano -faremmo -hayan -ibaratkan -þundan -nós -normally -kļūstu -تعذاد -vezec'h -으로 인하여 -omiin -3 -tiks -زياد -cele -atit -ela -gan -딩동 -näille -ön -של -jopa -ثب -llegó -byť -peus -onzeker -vậy thì -děkuji -οπου -turned -봐라 -kierunku -mange -পেয়ে -avuksi -diganimp -نحو -aikaisin -otros -گب -nopeammin -quelques -jóval -juosiuose -diwezhat -も -گیری -későn -سریِ -kereta -alattatok -teiltä -شوی -darauf -újabb -skal -sola -tavaly -högre -sobą -đại nhân -mateix -mögéjük -umno -بکنم -šestnáct -umum -מאיזוסיבה -겨우 -pasti -तर -اعلام -teda -再者 -矣 -tvoje -mebni -nån -haven't -نزديك -لولا -即使 -являюсь -сказал -সুতরাং -nog -vasen -hemen -شد -كيفما -miennes -些 -medio -درخہ -ضوچ -back -antano -ettiğini -cuánta -havus -więcej -fjorton -niiden -gab -ja -vsa -vefe -negyediket -tersebutlah -quidem -vả chăng -одной -неё -մենք -colui -করাই -στις -rag -mellőled -wurden -unua -त्री -koulz -تاكنون -vieressä -helt -رفته -seluruh -bere -月 -aikoina -olduklarını -inside -ocho -żadne -ตั้งแต่ -našou -denli -mismas -云尔 -abdullah -like -kaþin -jeszcze -çok -lebo -년 -kime -τά -继之 -继而 -ţöyle -ধামার -una -תהיה -tz -हुए -sonra -nektek -savosioms -годишен -αλλοτε -idr. -urak -πια -teraz -tendrán -third -minimale -jadilah -顺 -haluamme -baie -rejout -tm -diğeri -sinulle -ouek -you -zati -thực ra -đáo để -היתה -более -ثھر -voes -आले -ہورہی -îl -zen -acuerdo -svi -celle -ими -încât -gauw -ने -avevo -eure -ele -gì -ouejoc'h -estes -ltd -आणि -meillä -οσης∆ηποτε -tiesiems -جديد -tivéssemos -моя -начать -estando -tosioms -어느때 -των -a: -volna -вона -خلذی -and -thin -store -就 -моё -হন -αρχικα -nếu như -ek -temos -ему -mayroon -honetan -unanez -căci -پوچھتب -първата -하기만 하면 -dair -sul -често -εκεινη -lennének -επανω -siya -januar -bastañ -كلاهما -trivet -احد -takana -leszünk -horrela -keneltä -2 -hova -টি -거바 -mot -houveria -отовсюду -ạ ơi -talvez -backing -harmadikat -است -members -there're -کوئی -mui -căn cắt -миллионов -چھہ -c'h: -г -纵 -pole -katakan -ئێمە -fără -vosotros -pieno -যাদের -한다면 -vens -etrezomp -smallest -wholl -באיזומידה -tiku -μας -诚如 -أقل -պիտի -asiaa -αλλων -nombreux -şura -prestik -どこ -chiếc -allaient -varias -josiose -เดียวกัน -رکھ -ze -sexa -fenti -अभी -दोन -gdyby -kýmu -quali -ba'n -copy -nochtans -bớ -fed -pst -tuốt luốt -hatta -οχι -tanyanya -суть -batek -resulting -وراءَك -aloitettava -dalsi -ai -która -ขึ้น -jses -neppure -enhver -chiche -suyas -pe -ছাড়া -既往 -mrs -ejomp -neniu -এব -καποιου -καθενος -तब -ibarat -dwie -ďalšou -için -如上所述 -لك -kita -magam -rajent -dessus -acum -menyeluruh -מן -etrezor -aquelles -werd -cinq -й -april -هستیم -ngày xửa -lagi -نبايد -avesti -durant -سنوات -nemedout -أَنَّ -عاد -aed -如若 -secondly -zelo -sanki -ضکتے -consiguen -website -trovato -あのかた -nilai -sự -vrij -amit -késő -nowe -sjuttonde -f -ouzhpennik -sesa -قلما -niemandem -elég -并 -houp -njih -dini -איתה -milyon -oricât -åttionde -des de -hai -zwei -dira -दुसरा -pozdravljeni -赖以 -得了 -opposite -بد -paar -gouze -alólatok -언젠가 -מה -suýt -tria -мож -кто -tulet -него -دیتب -bất kì -dehors -negu -همواره -estávamos -čez -ina -heisst -设若 -siapapun -خويش -થાઉં -دوضرے -ڈھوًڈو -ultimo -aţi -hol -semampu -know -sehingga -olursa -ἄλλος -오직 -vierde -parlent -dobrý -težko -nepell -헉헉 -οτου -vors -bras -moje -nittio -于是乎 -hala -tûlas -εκαστης -nuestro -جير -eksekutif -dunha -sebabnya -entisiä -比及 -ওঁদের -новина -chiunque -ret -ini -그러므로 -kodël -tojo -viisi -page -alánk -benaos -ingat -이지만 -berori -страна -trếu tráo -korábban -おります -oant -نباید -آیا -eu -কাজ -mögém -clanky -seventy -ευτυχως -پارسال -ответить -بیاورند -rog -somehow -deomp -когато -s'ha -하곤하였다 -indicates -عامة -snad -ઓછું -anuoju -polno -lepi -sont -when -ho -sa-mi -ilalim -如下 -lettem -entah -sekiranya -조금 -altro -gospod -toé khói -muioc'h -whose -انطور -eme -goll -keuntungan -padahal -替代 -gotten -effettivamente -어째서 -kelamaan -ngoài ra -havemos -گویید -થઇ -hec'h -abdul -ulkopuolella -ঐ -viktigt -ambdós -bersama-sama -이르기까지 -whereafter -eksport -jejich -vaya -αλλης -আর -bardzo -sollt -двух -তিনি -عنوانِ -غروعبت -furthers -wasn't -hoikein -baru-baru -kovin -whim -sme -beaucoup -chung quy -กล่าว -בלי -dần dà -budu -sta -넷 -καθεμιας -هسترم -vagyunk -بی -하물며 -ποσους -داری -طریقہ -stavate -ме -hvilke -dua -כך -fossero -הם -嗬 -এস -á -kur -doze -એવા -지만 -মতো -terbang -setiap -οποιαν∆ηποτε -nessas -مما -að -наш -favore -کوتر -vaiheessa -τίς -καμποσην -setiba -tālab -peyderpey -ابتدأ -ન -دوو -할만하다 -eravate -suyos -svojimi -конец -kein -ضروری -هَذا -如 -lontano -prima -فيما -eĉ -komz -ňu -milyen -ετεραι -số -welchem -sobre -neměl -جدید -নেই -bh -right -etant -倘或 -即若 -õk -일 -kéže -ken -برعکس -raed -yhteydessä -alias -деньги -これ -anderr -phụt -σε -τοι -sulle -ذواتا -cikkek -hecho -هڑے -furthered -devět -erityisesti -savàsias -sitt -إليكنّ -ouien -أولئك -teirvet -tj -εκεινην -amott -εκαστων -fu -savàja -kolei -kven -lub -εκαστον -deichniúr -joukossa -diperbuat -抑或 -lig -yapılması -still -τιποτα -관한 -ngày xưa -leszek -só -heel -등 -будто -ու -tiu -owszem -nazaj -fått -nuevas -矣哉 -tok -কী -درخبت -پوچھتے -plupart -andras -hier -ac'hanon -گفتن -chtějí -arī -ّه -( -czasami -καποια -ajemp -عين -ilia -nesta -tavyje -ceci -بگویی -pejabat -ہوگئی -appropriate -ہر -하지 않는다면 -ml -دوراى -tantas -veliki -পি -netscape -ολην -würde -olemme -관계없이 -म्हणजे -점에서 보아 -عليه -maupun -azokat -tendrás -force -сте -acestea -哗 -daarna -lorsque -तिस -múlva -sibh -اينكه -araozoc'h -mogą -tio -peor -আগে -birþey -evvela -certainly -wannan -嗡嗡 -nuns -joj -relative -thốt -chicchessia -soal -tute -berjaya -tenha -αριστερα -meneet -εχουν -می‌رسد -meestal -bập bõm -essere -咱们 -nl -genug -quizá -vähemmän -vielen -zł -замість -に対する -antamatta -dizer -even -tost -كما -m -הסיבהשבגללה -memperlihatkan -kasoo -만이 아니다 -hennar -мира -عن -n: -ઊંચે -nere -memberikan -cúigear -پہلےضی -hem -jedenáct -truly -quả là -로 인하여 -menunjukkan -eräs -ألا -maksimal -septième -wá -الان -sétima -たち -pocs -runsaasti -ખૂબ -רק -gerade -viszlát -alkent -eveldor -પણ -하마터면 -dispoe -ohi -περσι -असे -fueses -einmal -ι∆ιος -امس -như tuồng -affecting -varios -εγκαιρως -aldus -hieman -np -우선 -vaikea -никакой -tik -pesar -gross -بك -läheltä -jeb -daran -બની -bons -ende -lisäksi -vähän -עצמנו -auth -ειχε -тощо -ضیذھے -miten -thế nên -hänessä -hi -taipogi -oh -naye -tháng -می شود -őket -গুলি -lungo -c'hiz -ett -leizh -maybe -گیرد -miñas -antaranya -era -tavàjà -negl -分别 -youll -relatively -gorre -gine -après -visok -dvanáct -manakala -md -别说 -hiszen -avuti -fanns -nekega -halen -během -jonne -নিজের -jawatankuasa -peotramant -εκεινουσ -antes -بسیاری -între -ktokolwiek -denn -atita -poza -nic -peta -gibilerden -oad -sull -suivante -сих -nje -respecto -bottom -habremos -dos -dov -tr -ہوئے -sì -ισαμε -judu -ayee -dritte -próximas -numa -đi -凡是 -pendant -jawab -provides -bạn -disebut -önök -thà -gehabt -হাজার -savaisiais -થતી -voastră -viszontlátásra -cît -lahka -है -wish -musí -إن -inderdaad -algmas -sexton -ets -being -polos -tizenegyedik -ayer -hm -가령 -वहिं -यहि -τὴν -tizet -these -무엇때문에 -možno -membuat -خب -své -فو -hont -各位 -stettero -cita -כל -mengurangkan -stop -found -trínár -mkubwa -bago -soon -isso -किन्हें -કોણ -omalle -meyakinkan -الاولى -окно -němuž -cuk -agak -varēja -area -suche -hini -শুধু -إلى -mh -egyebet -עליכם -nelyginant -داشته -هَذَيْنِ -încît -она -koje -થયેલું -vienoks -evvelce -有关 -omat -nonsia -لازهی -srednji -melyik -perhaps -dále -dedans -будь -nasıl -ثٌذکرًب -ủa -nócha -manaisiais -celui-ci -urat -若夫 -وقتی -taken -amelyik -diversas -dober -grazie -bà -lârout -anaiptol -savimi -ehhez -个别 -mas -holnap -dokuz -ach -vừa mới -astăzi -perusteella -manosios -pure -ποιες -شویم -menyiapkan -أنتم -muiden -무슨 -savosiomis -azirazomp -tamsta -g. -esto -datuk -dalc'hmat -lenne -let -iekams -для -那般 -aquest -elétek -매 -此间 -dez -essa -إياه -מכיוון -komposit -nikoli -ثٌبرہے -pola -aquéllos -人们 -eilen -મૂક્યા -dana -mellőletek -若非 -ειχατε -careia -femton -кому -downing -fatto -لااقل -hvad -genndost -ἐξ -favor -而言 -tivestes -κἂν -پبًب -toisaalta -tínhamos -judvi -incluso -좍좍 -особенно -joiksi -facts -apakah -hasil -edes -ursäkt -young -tavæs -sokáig -menor -便于 -ktorými -nức nở -xuể -terwijl -treze -صبف -niego -affected -除此之外 -опять -mengibaratkan -저것 -писать -önceden -하지 않도록 -timto -ô -ضبدٍ -touto -ἄλλοσ -除外 -kié -제외하고 -본대로 -очень -하기는한데 -هَذِه -edoc'h -från -σόσ -گفتید -sechstes -된바에야 -посреди -hirie -sr -μετα -جدا -felé -شما -elk -诚然 -lena -nemen -bersiap-siap -jog -certain -viagem -bermaksud -کوى -thanks -ολους -dễ thường -prbl. -ઘણું -má -מי -pasukan -cea -cũng như -گوید -като -toi -entahlah -ου∆ε -万一 -لكيلا -nei -त्याना -n -naontek -इत्यादि -四 -bakit -নয় -هَاتِي -kukaan -dring -niihin -之类 -baada -potom -hatvan -dalgunhas -csak -حاي -samme -cd -pagitan -xi -למעלה -mohd -加以 -마음대로 -saviðkë -صرفا -különbözőbb -lange -valakit -estuviéramos -moc -ðieji -जेसे -dunia -tiksim -minimal -সি -miből -empty -quatrièmement -kilenc -بیایی -forsûke -tis -misma -vôtres -yapıyor -niemanden -hudu -bep -mivé -अपनी -quale -alaturi -sarete -sugl -ὁ -tức thì -چلا -tivemos -dieselbe -sulla -만큼 -cualquier -vâng -ukuba -あの -boudoudom -előttük -anderszins -til -novanta -senón -એનાં -six -selain -budú -只限 -大 -于 -org -vezomp -begitu -hur -आली -다수 -لئے -أمسى -tuy rằng -unto -بیاورم -tons -digunakan -quê -svojho -ganzes -يمكن -sabem -how's -mempersiapkan -menen -られる -давай -ehkä -velika -supuesto -تھوڑا -συχνου -તેવી -empa -댕그 -neuvième -wir -kuma -saranno -iní -öylelikle -egyetlen -هسطوش -pw -앞의것 -nödvändigt -quý hồ -μονου -welchen -이천칠 -нем -gm -certes -dann -hoje -clear -આગળ -trước tiên -ہوچکی -eri -mój -ups -δ’ -sille -nasza -faites -ahol -хотел бы -بكما -toj -עצמן -वहां -gwechoù -những -eurent -пак -osi -설령 -unei -erais -eine -jàja -acesta -zweiten -σιγα -αλλα -bazý -bastant -mk -soha -οσα∆ηποτε -아니라면 -কয়েকটি -saben -यहाँ -menunjuki -abigaliai -bylo -anei -восемнадцать -ensimmäisen -intentar -trotzdem -באמצעות -viime -terceira -halutessa -emplean -olikt -dicen -vs -deswegen -εἰς -önce -ái -τουλαχιστον -retour -kiről -sambil -li -muita -likställda -كم -твой -앗 -@ -niissä -하기 위하여 -suivant -přes -pienestä -nahm -plus -vostru -consideró -طریقے -cinque -只 -somos -joutuivat -وگو -sută -هکول -beau -siebente -lanjutnya -ligi -próprio -هاهنا -sesampai -दो -eux-mêmes -klaar -wezen -benned -long -demás -nuestros -બધા -resis -oughtnt -olole -olarak -बिलकुल -vint -jirtay -беше -definitely -oo -anders -katruodu -वहीं -つ -fazes -tempo -کہٌب -ắt là -بەبێ -خواهید -nora -abia -থেকেই -subtiles -بیابند -раз -ihre -tvé -vior -dintr -tota -menjawab -무릎쓰고 -where'd -poca -njihovo -fordi -ilmeisesti -parhaiten -دکھبو -تِي -tinc -voordien -\ -ثڑی -kann -اليوم -wote -xềnh xệch -trỏng -জন্যওজে -lepo -newazh -svým -šesta -yapacak -derrière -takaa -एसे -vôtre -из -اینطور -swoje -şapte -öylemesine -تحت -nostres -mont -即便 -време -καμποσα -dello -увидеть -मानो -sampaikan -patiems -ենք -pign -等到 -j -一切 -થઈએ -книга -বিশেষ -এটা -затова -էիր -ké -ezekké -majd -dagl -hos -avrei -jsme -keneksi -těma -αραγε -affects -첫번째로 -kenet -eizh -manæs -четырнадцатый -mindketten -пъти -cada -netgi -enn -такъв -nila -มาก -hara -akankah -dalit -عووهی -cơn -някой -katrilyon -nikoju -essai -techet -گو -آئے -selatan -lage -vossa -nav -вам -συχνων -hetzelfde -hauetan -અમે -вечер -dessen -ekonomi -habrás -oysa -saber -anaisiais -dipergunakan -живот -thar -acest -jih -oli -zelfs -הוא -ἐμόσ -facessimo -کرد -jedou -hade -anterieures -defa -minua -clic -fem -overeind -συχνη -પછી -saam -ðioks -ž -aking -punkt -این -unu -বিভিন্ন -nikdar -ضمن -জ্নজন -البته -povo -більш -adj -manøjø -sabihin -무렵 -μἐν -پراًب -önöknél -જ -sånn -buracıkta -vama -dau -দিতে -যিনি -靠 -diejenige -nhất định -c -yksi -为何 -später -ste -也罢 -birkaç -produk -이쪽 -ésas -kérlek -hogyan -hañval -στη -آيد -d.h -дать -he -ضیذھب -هم -văng tê -лош -sauf -warst -αληθεια -kahdella -बाला -あり -против -أََيُّ -z.b -을 -οἷς -tweede -toenmaals -יכלה -panjang -نێوان -yhtäälle -zakaj -einer -ind -vicino -জানিয়ে -собой -하고있었다 -οταν -gjort -δαίσ -其二 -devra -ну -ésa -d: -diouzhomp -d'ur -zatímco -een -ugu -نهاية -benissimo -picher -أُفٍّ -ওরা -vihanañ -večer -lọ -κανεναν -ταυτων -仍 -old -دلچطپی -karşın -∆ιολου -হইবে -syv -biết mấy -oracıkta -کھولی -paikoittain -> -ہے -بشكل -semuanya -阿 -孰知 -netekim -vroeg -la -km -tentang -ضکتب -miss -εντος -휘익 -taka -formos -کمتری -ہوبری -näinä -diganti -probable -ouie -miatt -bolj -onda -whatll -ι∆ιαν -ditunjukkannya -delle -eomp -yhden -salvo -هیرا -αλλους -व्यकत -bu -ngày -得 -乌乎 -αυτη -に -gor -thorough -lei -свет -沿着 -lähinnä -quem -d'unes -多少 -mikor -leur -taká -ono -sva -certaines -адже -depuis -pamamagitan -lagian -vooralsnog -اگر -quá độ -whatve -nech -òun -إليكم -negli -一 -καμποσης -と共に -那 -altra -trabajo -أنا -azonnal -παρ -вдруг -bez -чем -における -তো -κατω -pats -eigener -alguns -más -tiktai -temprano -consequently -past -ikzelf -তাদের -ẹmọ́ -হয়েছে -asioiden -kilencet -פה -mudvi -nakita -są -ًئی -ι∆ιων -nec -mums -tejto -trabajan -quyết -μερικων -彼此 -мать -наиболее -เฉพาะ -呀 -någonting -jiedu -njezina -its -degraba -jusqu -padanya -인젠 -mye -کورا -egyedül -beze -apparently -wf -εχομε -farete -keid -sdn -نخواهم -نمايد -なに -زصہ -bres -omiksi -about -eighty -trabajar -edecek -ði -čože -pouco -byli -طور -হতে -由 -đại phàm -proti -далеко -взять -ofschoon -today -各种 -이것 -علّتِ -ऱ्वासा -漫说 -ngay lúc -לה -kentre -tambien -nisu -revoilà -pages -ἣ -nasýl -截至 -gewoon -էիք -neanmoins -ταυτη -atas -atque -a -بسا -nemáme -mögen -ไม่ -bizimki -کرتے -bereits -der -http -mine -jde -ним -υποψη -همیشه -malissimo -él -τοσοι -ενας -onların -لے -dock -того -alcuno -warnor -لقاء -بیایید -ái dà -hoće -οσο -consigues -সহ -彼 -oikealla -vn -yapmak -mesyuarat -زير -shant -siano -avant -bas -behoudens -наша -qa -сила -sindsdien -ute -davete -в -лесно -specified -εναν -tavàsias -οποιους -trabajais -oai oái -pije -mía -glieli -tre -тогава -탕탕 -dijeron -olmayan -tries -joutumaan -liki -cz -dipastikan -a ha -mengingatkan -أولالك -ramai -pusiau -deden -köszönöm -ô kê -mögüle -هستيم -tulette -phải chi -sạch -kitokia -vilket -niektorom -চার -nebyl -друга -asiat -mais -qué -ہوًی -isa -অথচ -gutez -i: -চান -vezañ -predominantly -melakukan -لَسْتُنَّ -feu -ηταν -یقیٌی -puede -dirazon -할 생각이다 -what's -raes -এল -d'hol -joihin -esillä -multă -와 -الذى -উচিত -siens -showed -ere -níor -ندارند -第 -starebbe -hilh -غروع -39 -sedemikian -etraflıca -ta -eres -пять -อะไร -て -bekas -امروز -যায় -dão -kırk -per que -effet -کورٍ -کے -dija -evidon -u: -feiz -in -vël -atitea -wer -bo -حار -этой -ขอ -người -gwashoc'h -moan -islam -cu -هبّ -rund -पहले -drin -흥 -евтин -elénk -お -być -tartum -おり -muu -digante -jsi -sujet -emporzhiañ -estou -如是 -تۆ -gjorde -इनका -wegens -illa -bravo -smí -birşey -anggota -what'd -각각 -tendré -μετὰ -имеет -quả -heller -tue -아이 -всередині -ряд -merkapl -就要 -something -tres -conocer -eussions -其次 -länge -比如 -vervolgens -各个 -私達 -લેવા -cosas -daha -oldu -chẳng phải -szerinted -∆ηλα∆η -có dễ -tuviesen -insermi -között -nhân tiện -fai -mojich -0 -τῷ -meves -riêng -zehnter -egyes -其他 -anyways -évvel -besar -előző -होत -خودمان -outre -möjlig -ai ai -مدت -staèiai -lod -işte -lavaret -既 -bli -دایم -otto -nossa -anasai -inyong -어떤것들 -خلاصه -یعنی -το -هیچگاه -αλλον -bije -endan -necessaire -وقتي -кем -tấm -σας -anar -minta -nossas -inför -teltenn -再其次 -出来 -beirt -במקוםשבו -menit -cukup -nejakého -خودشان -annan -ganit -allo -masa -known -tí -距 -سَاءَمَا -mitt -ذَيْنِ -ich -그만이다 -chùn chũn -zwischen -એની -touez -lah -इन्हों -pieneltä -б -thật vậy -kapag -zokenoc'h -drugo -kale -zodra -이천팔 -exemplo -benden -jim -sollen -dass -minket -just -naquelas -rólad -youve -ι∆ιες -이었다 -lo -ðiajai -e: -люди -바꾸어서 한다면 -weniger -ouied -পারে -newest -był -tāpēc -biết đâu chừng -谁 -ispisial -fer -তাঁাহারা -pet -associated -daonet -talvoudegezh -following -쪽으로 -tic -چکیں -halbă -myöskään -pana -会 -tänään -niej -ait -toward -η -sai -هيّا -البتّه -cơ -uso -εκτος -buď -wenig -jou -otro -بَسْ -хорошо -nhất nhất -저쪽 -אותי -равен -edestä -riu ríu -不外乎 -because -ponto -要是 -at -νωρις -향하여 -visoks -κλπ -melléjük -יש -abiem -zač -novel -avrete -يكي -们 -vores -મૂક્યાં -pm -würden -ill. -咳 -此时 -nọ -mulailah -否则 -vilken -آمد -oufe -پاش -takaisin -ετουτην -只当 -joissa -eses -bevet -آي -ايار -timbalan -الگ -estem -faces -evelte -believe -aquellas -questo -nhất -titeket -opzij -tukaj -ไว้ -abst -need -upon -않기 위하여 -σωστα -vở -té -אף -그중에서 -erst -имя -ner -wathi -takie -qual -尔后 -þunda diff --git a/common/assets/wordlists/stopwords-iso-dutch.txt b/common/assets/wordlists/stopwords-iso-dutch.txt deleted file mode 100644 index 9c46fa317..000000000 --- a/common/assets/wordlists/stopwords-iso-dutch.txt +++ /dev/null @@ -1,413 +0,0 @@ -aan -aangaande -aangezien -achte -achter -achterna -af -afgelopen -al -aldaar -aldus -alhoewel -alias -alle -allebei -alleen -alles -als -alsnog -altijd -altoos -ander -andere -anders -anderszins -beetje -behalve -behoudens -beide -beiden -ben -beneden -bent -bepaald -betreffende -bij -bijna -bijv -binnen -binnenin -blijkbaar -blijken -boven -bovenal -bovendien -bovengenoemd -bovenstaand -bovenvermeld -buiten -bv -daar -daardoor -daarheen -daarin -daarna -daarnet -daarom -daarop -daaruit -daarvanlangs -dan -dat -de -deden -deed -der -derde -derhalve -dertig -deze -dhr -die -dikwijls -dit -doch -doe -doen -doet -door -doorgaand -drie -duizend -dus -echter -een -eens -eer -eerdat -eerder -eerlang -eerst -eerste -eigen -eigenlijk -elk -elke -en -enig -enige -enigszins -enkel -er -erdoor -erg -ergens -etc -etcetera -even -eveneens -evenwel -gauw -ge -gedurende -geen -gehad -gekund -geleden -gelijk -gemoeten -gemogen -genoeg -geweest -gewoon -gewoonweg -haar -haarzelf -had -hadden -hare -heb -hebben -hebt -hedden -heeft -heel -hem -hemzelf -hen -het -hetzelfde -hier -hierbeneden -hierboven -hierin -hierna -hierom -hij -hijzelf -hoe -hoewel -honderd -hun -hunne -ieder -iedere -iedereen -iemand -iets -ik -ikzelf -in -inderdaad -inmiddels -intussen -inzake -is -ja -je -jezelf -jij -jijzelf -jou -jouw -jouwe -juist -jullie -kan -klaar -kon -konden -krachtens -kun -kunnen -kunt -laatst -later -liever -lijken -lijkt -maak -maakt -maakte -maakten -maar -mag -maken -me -meer -meest -meestal -men -met -mevr -mezelf -mij -mijn -mijnent -mijner -mijzelf -minder -miss -misschien -missen -mits -mocht -mochten -moest -moesten -moet -moeten -mogen -mr -mrs -mw -na -naar -nadat -nam -namelijk -nee -neem -negen -nemen -nergens -net -niemand -niet -niets -niks -noch -nochtans -nog -nogal -nooit -nu -nv -of -ofschoon -om -omdat -omhoog -omlaag -omstreeks -omtrent -omver -ondanks -onder -ondertussen -ongeveer -ons -onszelf -onze -onzeker -ooit -ook -op -opnieuw -opzij -over -overal -overeind -overige -overigens -paar -pas -per -precies -recent -redelijk -reeds -rond -rondom -samen -sedert -sinds -sindsdien -slechts -sommige -spoedig -steeds -tamelijk -te -tegen -tegenover -tenzij -terwijl -thans -tien -tiende -tijdens -tja -toch -toe -toen -toenmaals -toenmalig -tot -totdat -tussen -twee -tweede -u -uit -uitgezonderd -uw -vaak -vaakwat -van -vanaf -vandaan -vanuit -vanwege -veel -veeleer -veertig -verder -verscheidene -verschillende -vervolgens -via -vier -vierde -vijf -vijfde -vijftig -vol -volgend -volgens -voor -vooraf -vooral -vooralsnog -voorbij -voordat -voordezen -voordien -voorheen -voorop -voorts -vooruit -vrij -vroeg -waar -waarom -waarschijnlijk -wanneer -want -waren -was -wat -we -wederom -weer -weg -wegens -weinig -wel -weldra -welk -welke -werd -werden -werder -wezen -whatever -wie -wiens -wier -wij -wijzelf -wil -wilden -willen -word -worden -wordt -zal -ze -zei -zeker -zelf -zelfde -zelfs -zes -zeven -zich -zichzelf -zij -zijn -zijne -zijzelf -zo -zoals -zodat -zodra -zonder -zou -zouden -zowat -zulk -zulke -zullen -zult \ No newline at end of file diff --git a/common/assets/wordlists/stopwords-iso-english.txt b/common/assets/wordlists/stopwords-iso-english.txt deleted file mode 100644 index e0952162a..000000000 --- a/common/assets/wordlists/stopwords-iso-english.txt +++ /dev/null @@ -1,1298 +0,0 @@ -'ll -'tis -'twas -'ve -10 -39 -a -a's -able -ableabout -about -above -abroad -abst -accordance -according -accordingly -across -act -actually -ad -added -adj -adopted -ae -af -affected -affecting -affects -after -afterwards -ag -again -against -ago -ah -ahead -ai -ain't -aint -al -all -allow -allows -almost -alone -along -alongside -already -also -although -always -am -amid -amidst -among -amongst -amoungst -amount -an -and -announce -another -any -anybody -anyhow -anymore -anyone -anything -anyway -anyways -anywhere -ao -apart -apparently -appear -appreciate -appropriate -approximately -aq -ar -are -area -areas -aren -aren't -arent -arise -around -arpa -as -aside -ask -asked -asking -asks -associated -at -au -auth -available -aw -away -awfully -az -b -ba -back -backed -backing -backs -backward -backwards -bb -bd -be -became -because -become -becomes -becoming -been -before -beforehand -began -begin -beginning -beginnings -begins -behind -being -beings -believe -below -beside -besides -best -better -between -beyond -bf -bg -bh -bi -big -bill -billion -biol -bj -bm -bn -bo -both -bottom -br -brief -briefly -bs -bt -but -buy -bv -bw -by -bz -c -c'mon -c's -ca -call -came -can -can't -cannot -cant -caption -case -cases -cause -causes -cc -cd -certain -certainly -cf -cg -ch -changes -ci -ck -cl -clear -clearly -click -cm -cmon -cn -co -co. -com -come -comes -computer -con -concerning -consequently -consider -considering -contain -containing -contains -copy -corresponding -could -could've -couldn -couldn't -couldnt -course -cr -cry -cs -cu -currently -cv -cx -cy -cz -d -dare -daren't -darent -date -de -dear -definitely -describe -described -despite -detail -did -didn -didn't -didnt -differ -different -differently -directly -dj -dk -dm -do -does -doesn -doesn't -doesnt -doing -don -don't -done -dont -doubtful -down -downed -downing -downs -downwards -due -during -dz -e -each -early -ec -ed -edu -ee -effect -eg -eh -eight -eighty -either -eleven -else -elsewhere -empty -end -ended -ending -ends -enough -entirely -er -es -especially -et -et-al -etc -even -evenly -ever -evermore -every -everybody -everyone -everything -everywhere -ex -exactly -example -except -f -face -faces -fact -facts -fairly -far -farther -felt -few -fewer -ff -fi -fifteen -fifth -fifty -fify -fill -find -finds -fire -first -five -fix -fj -fk -fm -fo -followed -following -follows -for -forever -former -formerly -forth -forty -forward -found -four -fr -free -from -front -full -fully -further -furthered -furthering -furthermore -furthers -fx -g -ga -gave -gb -gd -ge -general -generally -get -gets -getting -gf -gg -gh -gi -give -given -gives -giving -gl -gm -gmt -gn -go -goes -going -gone -good -goods -got -gotten -gov -gp -gq -gr -great -greater -greatest -greetings -group -grouped -grouping -groups -gs -gt -gu -gw -gy -h -had -hadn't -hadnt -half -happens -hardly -has -hasn -hasn't -hasnt -have -haven -haven't -havent -having -he -he'd -he'll -he's -hed -hell -hello -help -hence -her -here -here's -hereafter -hereby -herein -heres -hereupon -hers -herself -herse” -hes -hi -hid -high -higher -highest -him -himself -himse” -his -hither -hk -hm -hn -home -homepage -hopefully -how -how'd -how'll -how's -howbeit -however -hr -ht -htm -html -http -hu -hundred -i -i'd -i'll -i'm -i've -i.e. -id -ie -if -ignored -ii -il -ill -im -immediate -immediately -importance -important -in -inasmuch -inc -inc. -indeed -index -indicate -indicated -indicates -information -inner -inside -insofar -instead -int -interest -interested -interesting -interests -into -invention -inward -io -iq -ir -is -isn -isn't -isnt -it -it'd -it'll -it's -itd -itll -its -itself -itse” -ive -j -je -jm -jo -join -jp -just -k -ke -keep -keeps -kept -keys -kg -kh -ki -kind -km -kn -knew -know -known -knows -kp -kr -kw -ky -kz -l -la -large -largely -last -lately -later -latest -latter -latterly -lb -lc -least -length -less -lest -let -let's -lets -li -like -liked -likely -likewise -line -little -lk -ll -long -longer -longest -look -looking -looks -low -lower -lr -ls -lt -ltd -lu -lv -ly -m -ma -made -mainly -make -makes -making -man -many -may -maybe -mayn't -maynt -mc -md -me -mean -means -meantime -meanwhile -member -members -men -merely -mg -mh -microsoft -might -might've -mightn't -mightnt -mil -mill -million -mine -minus -miss -mk -ml -mm -mn -mo -more -moreover -most -mostly -move -mp -mq -mr -mrs -ms -msie -mt -mu -much -mug -must -must've -mustn't -mustnt -mv -mw -mx -my -myself -myse” -mz -n -na -name -namely -nay -nc -nd -ne -near -nearly -necessarily -necessary -need -needed -needing -needn't -neednt -needs -neither -net -netscape -never -neverf -neverless -nevertheless -new -newer -newest -next -nf -ng -ni -nine -ninety -nl -no -no-one -nobody -non -none -nonetheless -noone -nor -normally -nos -not -noted -nothing -notwithstanding -novel -now -nowhere -np -nr -nu -null -number -numbers -nz -o -obtain -obtained -obviously -of -off -often -oh -ok -okay -old -older -oldest -om -omitted -on -once -one -one's -ones -only -onto -open -opened -opening -opens -opposite -or -ord -order -ordered -ordering -orders -org -other -others -otherwise -ought -oughtn't -oughtnt -our -ours -ourselves -out -outside -over -overall -owing -own -p -pa -page -pages -part -parted -particular -particularly -parting -parts -past -pe -per -perhaps -pf -pg -ph -pk -pl -place -placed -places -please -plus -pm -pmid -pn -point -pointed -pointing -points -poorly -possible -possibly -potentially -pp -pr -predominantly -present -presented -presenting -presents -presumably -previously -primarily -probably -problem -problems -promptly -proud -provided -provides -pt -put -puts -pw -py -q -qa -que -quickly -quite -qv -r -ran -rather -rd -re -readily -really -reasonably -recent -recently -ref -refs -regarding -regardless -regards -related -relatively -research -reserved -respectively -resulted -resulting -results -right -ring -ro -room -rooms -round -ru -run -rw -s -sa -said -same -saw -say -saying -says -sb -sc -sd -se -sec -second -secondly -seconds -section -see -seeing -seem -seemed -seeming -seems -seen -sees -self -selves -sensible -sent -serious -seriously -seven -seventy -several -sg -sh -shall -shan't -shant -she -she'd -she'll -she's -shed -shell -shes -should -should've -shouldn -shouldn't -shouldnt -show -showed -showing -shown -showns -shows -si -side -sides -significant -significantly -similar -similarly -since -sincere -site -six -sixty -sj -sk -sl -slightly -sm -small -smaller -smallest -sn -so -some -somebody -someday -somehow -someone -somethan -something -sometime -sometimes -somewhat -somewhere -soon -sorry -specifically -specified -specify -specifying -sr -st -state -states -still -stop -strongly -su -sub -substantially -successfully -such -sufficiently -suggest -sup -sure -sv -sy -system -sz -t -t's -take -taken -taking -tc -td -tell -ten -tends -test -text -tf -tg -th -than -thank -thanks -thanx -that -that'll -that's -that've -thatll -thats -thatve -the -their -theirs -them -themselves -then -thence -there -there'd -there'll -there're -there's -there've -thereafter -thereby -thered -therefore -therein -therell -thereof -therere -theres -thereto -thereupon -thereve -these -they -they'd -they'll -they're -they've -theyd -theyll -theyre -theyve -thick -thin -thing -things -think -thinks -third -thirty -this -thorough -thoroughly -those -thou -though -thoughh -thought -thoughts -thousand -three -throug -through -throughout -thru -thus -til -till -tip -tis -tj -tk -tm -tn -to -today -together -too -took -top -toward -towards -tp -tr -tried -tries -trillion -truly -try -trying -ts -tt -turn -turned -turning -turns -tv -tw -twas -twelve -twenty -twice -two -tz -u -ua -ug -uk -um -un -under -underneath -undoing -unfortunately -unless -unlike -unlikely -until -unto -up -upon -ups -upwards -us -use -used -useful -usefully -usefulness -uses -using -usually -uucp -uy -uz -v -va -value -various -vc -ve -versus -very -vg -vi -via -viz -vn -vol -vols -vs -vu -w -want -wanted -wanting -wants -was -wasn -wasn't -wasnt -way -ways -we -we'd -we'll -we're -we've -web -webpage -website -wed -welcome -well -wells -went -were -weren -weren't -werent -weve -wf -what -what'd -what'll -what's -what've -whatever -whatll -whats -whatve -when -when'd -when'll -when's -whence -whenever -where -where'd -where'll -where's -whereafter -whereas -whereby -wherein -wheres -whereupon -wherever -whether -which -whichever -while -whilst -whim -whither -who -who'd -who'll -who's -whod -whoever -whole -wholl -whom -whomever -whos -whose -why -why'd -why'll -why's -widely -width -will -willing -wish -with -within -without -won -won't -wonder -wont -words -work -worked -working -works -world -would -would've -wouldn -wouldn't -wouldnt -ws -www -x -y -ye -year -years -yes -yet -you -you'd -you'll -you're -you've -youd -youll -young -younger -youngest -your -youre -yours -yourself -yourselves -youve -yt -yu -z -za -zero -zm -zr \ No newline at end of file diff --git a/common/assets/wordlists/stopwords-iso-zh.txt b/common/assets/wordlists/stopwords-iso-zh.txt deleted file mode 100644 index bc313f5d7..000000000 --- a/common/assets/wordlists/stopwords-iso-zh.txt +++ /dev/null @@ -1,794 +0,0 @@ -、 -。 -〈 -〉 -《 -》 -一 -一个 -一些 -一何 -一切 -一则 -一方面 -一旦 -一来 -一样 -一种 -一般 -一转眼 -七 -万一 -三 -上 -上下 -下 -不 -不仅 -不但 -不光 -不单 -不只 -不外乎 -不如 -不妨 -不尽 -不尽然 -不得 -不怕 -不惟 -不成 -不拘 -不料 -不是 -不比 -不然 -不特 -不独 -不管 -不至于 -不若 -不论 -不过 -不问 -与 -与其 -与其说 -与否 -与此同时 -且 -且不说 -且说 -两者 -个 -个别 -中 -临 -为 -为了 -为什么 -为何 -为止 -为此 -为着 -乃 -乃至 -乃至于 -么 -之 -之一 -之所以 -之类 -乌乎 -乎 -乘 -九 -也 -也好 -也罢 -了 -二 -二来 -于 -于是 -于是乎 -云云 -云尔 -五 -些 -亦 -人 -人们 -人家 -什 -什么 -什么样 -今 -介于 -仍 -仍旧 -从 -从此 -从而 -他 -他人 -他们 -他们们 -以 -以上 -以为 -以便 -以免 -以及 -以故 -以期 -以来 -以至 -以至于 -以致 -们 -任 -任何 -任凭 -会 -似的 -但 -但凡 -但是 -何 -何以 -何况 -何处 -何时 -余外 -作为 -你 -你们 -使 -使得 -例如 -依 -依据 -依照 -便于 -俺 -俺们 -倘 -倘使 -倘或 -倘然 -倘若 -借 -借傥然 -假使 -假如 -假若 -做 -像 -儿 -先不先 -光 -光是 -全体 -全部 -八 -六 -兮 -共 -关于 -关于具体地说 -其 -其一 -其中 -其二 -其他 -其余 -其它 -其次 -具体地说 -具体说来 -兼之 -内 -再 -再其次 -再则 -再有 -再者 -再者说 -再说 -冒 -冲 -况且 -几 -几时 -凡 -凡是 -凭 -凭借 -出于 -出来 -分 -分别 -则 -则甚 -别 -别人 -别处 -别是 -别的 -别管 -别说 -到 -前后 -前此 -前者 -加之 -加以 -区 -即 -即令 -即使 -即便 -即如 -即或 -即若 -却 -去 -又 -又及 -及 -及其 -及至 -反之 -反而 -反过来 -反过来说 -受到 -另 -另一方面 -另外 -另悉 -只 -只当 -只怕 -只是 -只有 -只消 -只要 -只限 -叫 -叮咚 -可 -可以 -可是 -可见 -各 -各个 -各位 -各种 -各自 -同 -同时 -后 -后者 -向 -向使 -向着 -吓 -吗 -否则 -吧 -吧哒 -含 -吱 -呀 -呃 -呕 -呗 -呜 -呜呼 -呢 -呵 -呵呵 -呸 -呼哧 -咋 -和 -咚 -咦 -咧 -咱 -咱们 -咳 -哇 -哈 -哈哈 -哉 -哎 -哎呀 -哎哟 -哗 -哟 -哦 -哩 -哪 -哪个 -哪些 -哪儿 -哪天 -哪年 -哪怕 -哪样 -哪边 -哪里 -哼 -哼唷 -唉 -唯有 -啊 -啐 -啥 -啦 -啪达 -啷当 -喂 -喏 -喔唷 -喽 -嗡 -嗡嗡 -嗬 -嗯 -嗳 -嘎 -嘎登 -嘘 -嘛 -嘻 -嘿 -嘿嘿 -四 -因 -因为 -因了 -因此 -因着 -因而 -固然 -在 -在下 -在于 -地 -基于 -处在 -多 -多么 -多少 -大 -大家 -她 -她们 -好 -如 -如上 -如上所述 -如下 -如何 -如其 -如同 -如是 -如果 -如此 -如若 -始而 -孰料 -孰知 -宁 -宁可 -宁愿 -宁肯 -它 -它们 -对 -对于 -对待 -对方 -对比 -将 -小 -尔 -尔后 -尔尔 -尚且 -就 -就是 -就是了 -就是说 -就算 -就要 -尽 -尽管 -尽管如此 -岂但 -己 -已 -已矣 -巴 -巴巴 -年 -并 -并且 -庶乎 -庶几 -开外 -开始 -归 -归齐 -当 -当地 -当然 -当着 -彼 -彼时 -彼此 -往 -待 -很 -得 -得了 -怎 -怎么 -怎么办 -怎么样 -怎奈 -怎样 -总之 -总的来看 -总的来说 -总的说来 -总而言之 -恰恰相反 -您 -惟其 -慢说 -我 -我们 -或 -或则 -或是 -或曰 -或者 -截至 -所 -所以 -所在 -所幸 -所有 -才 -才能 -打 -打从 -把 -抑或 -拿 -按 -按照 -换句话说 -换言之 -据 -据此 -接着 -故 -故此 -故而 -旁人 -无 -无宁 -无论 -既 -既往 -既是 -既然 -日 -时 -时候 -是 -是以 -是的 -更 -曾 -替 -替代 -最 -月 -有 -有些 -有关 -有及 -有时 -有的 -望 -朝 -朝着 -本 -本人 -本地 -本着 -本身 -来 -来着 -来自 -来说 -极了 -果然 -果真 -某 -某个 -某些 -某某 -根据 -欤 -正值 -正如 -正巧 -正是 -此 -此地 -此处 -此外 -此时 -此次 -此间 -毋宁 -每 -每当 -比 -比及 -比如 -比方 -没奈何 -沿 -沿着 -漫说 -点 -焉 -然则 -然后 -然而 -照 -照着 -犹且 -犹自 -甚且 -甚么 -甚或 -甚而 -甚至 -甚至于 -用 -用来 -由 -由于 -由是 -由此 -由此可见 -的 -的确 -的话 -直到 -相对而言 -省得 -看 -眨眼 -着 -着呢 -矣 -矣乎 -矣哉 -离 -秒 -称 -竟而 -第 -等 -等到 -等等 -简言之 -管 -类如 -紧接着 -纵 -纵令 -纵使 -纵然 -经 -经过 -结果 -给 -继之 -继后 -继而 -综上所述 -罢了 -者 -而 -而且 -而况 -而后 -而外 -而已 -而是 -而言 -能 -能否 -腾 -自 -自个儿 -自从 -自各儿 -自后 -自家 -自己 -自打 -自身 -至 -至于 -至今 -至若 -致 -般的 -若 -若夫 -若是 -若果 -若非 -莫不然 -莫如 -莫若 -虽 -虽则 -虽然 -虽说 -被 -要 -要不 -要不是 -要不然 -要么 -要是 -譬喻 -譬如 -让 -许多 -论 -设使 -设或 -设若 -诚如 -诚然 -该 -说 -说来 -请 -诸 -诸位 -诸如 -谁 -谁人 -谁料 -谁知 -贼死 -赖以 -赶 -起 -起见 -趁 -趁着 -越是 -距 -跟 -较 -较之 -边 -过 -还 -还是 -还有 -还要 -这 -这一来 -这个 -这么 -这么些 -这么样 -这么点儿 -这些 -这会儿 -这儿 -这就是说 -这时 -这样 -这次 -这般 -这边 -这里 -进而 -连 -连同 -逐步 -通过 -遵循 -遵照 -那 -那个 -那么 -那么些 -那么样 -那些 -那会儿 -那儿 -那时 -那样 -那般 -那边 -那里 -都 -鄙人 -鉴于 -针对 -阿 -除 -除了 -除外 -除开 -除此之外 -除非 -随 -随后 -随时 -随着 -难道说 -零 -非 -非但 -非徒 -非特 -非独 -靠 -顺 -顺着 -首先 -︿ -! -# -$ -% -& -( -) -* -+ -, -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -: -; -< -> -? -@ -[ -] -{ -| -} -~ -¥ \ No newline at end of file diff --git a/common/assets/wordlists/stopwords-terrier-english.txt b/common/assets/wordlists/stopwords-terrier-english.txt deleted file mode 100644 index 11da93703..000000000 --- a/common/assets/wordlists/stopwords-terrier-english.txt +++ /dev/null @@ -1,733 +0,0 @@ -x -y -your -yours -yourself -yourselves -you -yond -yonder -yon -ye -yet -z -zillion -j -u -umpteen -usually -us -username -uponed -upons -uponing -upon -ups -upping -upped -up -unto -until -unless -unlike -unliker -unlikest -under -underneath -use -used -usedest -r -rath -rather -rathest -rathe -re -relate -related -relatively -regarding -really -res -respecting -respectively -q -quite -que -qua -n -neither -neaths -neath -nethe -nethermost -necessary -necessariest -necessarier -never -nevertheless -nigh -nighest -nigher -nine -noone -nobody -nobodies -nowhere -nowheres -no -noes -nor -nos -no-one -none -not -notwithstanding -nothings -nothing -nathless -natheless -t -ten -tills -till -tilled -tilling -to -towards -toward -towardest -towarder -together -too -thy -thyself -thus -than -that -those -thou -though -thous -thouses -thoroughest -thorougher -thorough -thoroughly -thru -thruer -thruest -thro -through -throughout -throughest -througher -thine -this -thises -they -thee -the -then -thence -thenest -thener -them -themselves -these -therer -there -thereby -therest -thereafter -therein -thereupon -therefore -their -theirs -thing -things -three -two -o -oh -owt -owning -owned -own -owns -others -other -otherwise -otherwisest -otherwiser -of -often -oftener -oftenest -off -offs -offest -one -ought -oughts -our -ours -ourselves -ourself -out -outest -outed -outwith -outs -outside -over -overallest -overaller -overalls -overall -overs -or -orer -orest -on -oneself -onest -ons -onto -a -atween -at -athwart -atop -afore -afterward -afterwards -after -afterest -afterer -ain -an -any -anything -anybody -anyone -anyhow -anywhere -anent -anear -and -andor -another -around -ares -are -aest -aer -against -again -accordingly -abaft -abafter -abaftest -abovest -above -abover -abouter -aboutest -about -aid -amidst -amid -among -amongst -apartest -aparter -apart -appeared -appears -appear -appearing -appropriating -appropriate -appropriatest -appropriates -appropriater -appropriated -already -always -also -along -alongside -although -almost -all -allest -aller -allyou -alls -albeit -awfully -as -aside -asides -aslant -ases -astrider -astride -astridest -astraddlest -astraddler -astraddle -availablest -availabler -available -aughts -aught -vs -v -variousest -variouser -various -via -vis-a-vis -vis-a-viser -vis-a-visest -viz -very -veriest -verier -versus -k -g -go -gone -good -got -gotta -gotten -get -gets -getting -b -by -byandby -by-and-by -bist -both -but -buts -be -beyond -because -became -becomes -become -becoming -becomings -becominger -becomingest -behind -behinds -before -beforehand -beforehandest -beforehander -bettered -betters -better -bettering -betwixt -between -beneath -been -below -besides -beside -m -my -myself -mucher -muchest -much -must -musts -musths -musth -main -make -mayest -many -mauger -maugre -me -meanwhiles -meanwhile -mostly -most -moreover -more -might -mights -midst -midsts -h -huh -humph -he -hers -herself -her -hereby -herein -hereafters -hereafter -hereupon -hence -hadst -had -having -haves -have -has -hast -hardly -hae -hath -him -himself -hither -hitherest -hitherer -his -how-do-you-do -however -how -howbeit -howdoyoudo -hoos -hoo -w -woulded -woulding -would -woulds -was -wast -we -wert -were -with -withal -without -within -why -what -whatever -whateverer -whateverest -whatsoeverer -whatsoeverest -whatsoever -whence -whencesoever -whenever -whensoever -when -whenas -whether -wheen -whereto -whereupon -wherever -whereon -whereof -where -whereby -wherewithal -wherewith -whereinto -wherein -whereafter -whereas -wheresoever -wherefrom -which -whichever -whichsoever -whilst -while -whiles -whithersoever -whither -whoever -whosoever -whoso -whose -whomever -s -syne -syn -shalling -shall -shalled -shalls -shoulding -should -shoulded -shoulds -she -sayyid -sayid -said -saider -saidest -same -samest -sames -samer -saved -sans -sanses -sanserifs -sanserif -so -soer -soest -sobeit -someone -somebody -somehow -some -somewhere -somewhat -something -sometimest -sometimes -sometimer -sometime -several -severaler -severalest -serious -seriousest -seriouser -senza -send -sent -seem -seems -seemed -seemingest -seeminger -seemings -seven -summat -sups -sup -supping -supped -such -since -sine -sines -sith -six -stop -stopped -p -plaintiff -plenty -plenties -please -pleased -pleases -per -perhaps -particulars -particularly -particular -particularest -particularer -pro -providing -provides -provided -provide -probably -l -layabout -layabouts -latter -latterest -latterer -latterly -latters -lots -lotting -lotted -lot -lest -less -ie -ifs -if -i -info -information -itself -its -it -is -idem -idemer -idemest -immediate -immediately -immediatest -immediater -in -inwards -inwardest -inwarder -inward -inasmuch -into -instead -insofar -indicates -indicated -indicate -indicating -indeed -inc -f -fact -facts -fs -figupon -figupons -figuponing -figuponed -few -fewer -fewest -frae -from -failing -failings -five -furthers -furtherer -furthered -furtherest -further -furthering -furthermore -fourscore -followthrough -for -forwhy -fornenst -formerly -former -formerer -formerest -formers -forbye -forby -fore -forever -forer -fores -four -d -ddays -dday -do -doing -doings -doe -does -doth -downwarder -downwardest -downward -downwards -downs -done -doner -dones -donest -dos -dost -did -differentest -differenter -different -describing -describe -describes -described -despiting -despites -despited -despite -during -c -cum -circa -chez -cer -certain -certainest -certainer -cest -canst -cannot -cant -cants -canting -cantest -canted -co -could -couldst -comeon -comeons -come-ons -come-on -concerning -concerninger -concerningest -consequently -considering -e -eg -eight -either -even -evens -evenser -evensest -evened -evenest -ever -everyone -everything -everybody -everywhere -every -ere -each -et -etc -elsewhere -else -ex -excepted -excepts -except -excepting -exes -enough \ No newline at end of file diff --git a/common/lib/config_definition.py b/common/lib/config_definition.py index 72b0f597e..c9601f78c 100644 --- a/common/lib/config_definition.py +++ b/common/lib/config_definition.py @@ -391,6 +391,14 @@ "tooltip": "Secret key for Flask, used for session cookies", "global": True }, + "flask.max_form_parts": { + "type": UserInput.OPTION_TEXT, + "default": 1000, + "help": "Max form parts per request", + "coerce_type": int, + "global": True, + "tooltip": "Affects approximate number of files that can be uploaded at once" + }, "flask.tag_order": { "type": UserInput.OPTION_TEXT_JSON, "default": ["admin"], diff --git a/common/lib/dataset.py b/common/lib/dataset.py index 891624ee3..8510a5adb 100644 --- a/common/lib/dataset.py +++ b/common/lib/dataset.py @@ -337,6 +337,14 @@ def iterate_items(self, processor=None, warn_unmappable=True, map_missing="defau if own_processor and own_processor.map_item_method_available(dataset=self): item_mapper = True + # missing field strategy can be for all fields at once, or per field + # if it is per field, it is a dictionary with field names and their strategy + # if it is for all fields, it is may be a callback, 'abort', or 'default' + default_strategy = "default" + if type(map_missing) is not dict: + default_strategy = map_missing + map_missing = {} + # Loop through items for i, item in enumerate(self._iterate_items(processor)): # Save original to yield @@ -355,15 +363,6 @@ def iterate_items(self, processor=None, warn_unmappable=True, map_missing="defau # check if fields have been marked as 'missing' in the # underlying data, and treat according to the chosen strategy if mapped_item.get_missing_fields(): - default_strategy = "default" - - # strategy can be for all fields at once, or per field - # if it is per field, it is a dictionary with field names and their strategy - # if it is for all fields, it is may be a callback, 'abort', or 'default' - if type(map_missing) is not dict: - default_strategy = map_missing - map_missing = {} - for missing_field in mapped_item.get_missing_fields(): strategy = map_missing.get(missing_field, default_strategy) @@ -1524,6 +1523,25 @@ def get_extension(self): return False + def get_media_type(self): + """ + Gets the media type of the dataset file. + + :return str: media type, e.g., "text" + """ + own_processor = self.get_own_processor() + if hasattr(self, "media_type"): + # media type can be defined explicitly in the dataset; this is the priority + return self.media_type + elif own_processor is not None: + # or media type can be defined in the processor + # some processors can set different media types for different datasets (e.g., import_media) + if hasattr(own_processor, "media_type"): + return own_processor.media_type + + # Default to text + return self.parameters.get("media_type", "text") + def get_result_url(self): """ Gets the 4CAT frontend URL of a dataset file. diff --git a/common/lib/helpers.py b/common/lib/helpers.py index c17d23cb6..f6767c929 100644 --- a/common/lib/helpers.py +++ b/common/lib/helpers.py @@ -300,6 +300,23 @@ def timify_long(number): return time_str + last_str +def andify(items): + """ + Format a list of items for use in text + + Returns a comma-separated list, the last item preceded by "and" + + :param items: Iterable list + :return str: Formatted string + """ + if len(items) == 0: + return "" + elif len(items) == 1: + return str(items[1]) + + result = f" and {items.pop()}" + return ", ".join([str(item) for item in items]) + result + def get_yt_compatible_ids(yt_ids): """ diff --git a/common/lib/user_input.py b/common/lib/user_input.py index 248421b5c..63999083a 100644 --- a/common/lib/user_input.py +++ b/common/lib/user_input.py @@ -177,7 +177,7 @@ def parse_value(settings, choice, other_input=None, silently_correct=True): # and the requirement isn't met if settings.get("requires"): try: - field, operator, value = re.findall(r"([a-zA-Z0-9_]+)([!=$~^]+)(.*)", settings.get("requires"))[0] + field, operator, value = re.findall(r"([a-zA-Z0-9_-]+)([!=$~^]+)(.*)", settings.get("requires"))[0] except IndexError: # invalid condition, interpret as 'does the field with this name have a value' field, operator, value = (choice, "!=", "") diff --git a/datasources/audio_to_text/__init__.py b/datasources/audio_to_text/__init__.py new file mode 100644 index 000000000..c7e641da0 --- /dev/null +++ b/datasources/audio_to_text/__init__.py @@ -0,0 +1,6 @@ +# Use default data source init function +from common.lib.helpers import init_datasource + +# Internal identifier for this data source +DATASOURCE = "upload-audio-to-text" +NAME = "Upload Audio to Text" \ No newline at end of file diff --git a/datasources/audio_to_text/audio_to_text.py b/datasources/audio_to_text/audio_to_text.py new file mode 100644 index 000000000..79ef43ed3 --- /dev/null +++ b/datasources/audio_to_text/audio_to_text.py @@ -0,0 +1,53 @@ +""" +Audio Upload to Text + +This data source acts similar to a Preset, but because it needs SearchMedia's validate_query and after_create methods +to run, chaining that processor does not work (Presets essentially only run the process and after_process methods +of their processors and skip those two datasource only methods). +""" + +from datasources.media_import.import_media import SearchMedia +from processors.machine_learning.whisper_speech_to_text import AudioToText + + +class AudioUploadToText(SearchMedia): + type = "upload-audio-to-text-search" # job ID + category = "Search" # category + title = "Convert speech to text" # title displayed in UI + description = "Upload your own audio and use OpenAI's Whisper model to create transcripts" # description displayed in UI + + @classmethod + def is_compatible_with(cls, module=None, user=None): + #TODO: False here does not appear to actually remove the datasource from the "Create dataset" page so technically + # this method is not necessary; if we can adjust that behavior, it ought to function as intended + + # Ensure the Whisper model is available + return AudioToText.is_compatible_with(module=module, user=user) + + @classmethod + def get_options(cls, parent_dataset=None, user=None): + # We need both sets of options for this datasource + media_options = SearchMedia.get_options(parent_dataset=parent_dataset, user=user) + whisper_options = AudioToText.get_options(parent_dataset=parent_dataset, user=user) + media_options.update(whisper_options) + + #TODO: there are some odd formatting issues if we use those derived options + # The intro help text is not displayed correct (does not wrap) + # Advanced Settings uses []() links which do not work on the "Create dataset" page, so we adjust + + media_options["intro"]["help"] = ("Upload audio files here to convert speech to text. " + "4CAT will use OpenAI's Whisper model to create transcripts." + "\n\nFor information on using advanced settings: [Command Line Arguments (CLI)](https://github.com/openai/whisper/blob/248b6cb124225dd263bb9bd32d060b6517e067f8/whisper/transcribe.py#LL374C3-L374C3)") + media_options["advanced"]["help"] = "Advanced Settings" + + return media_options + + @staticmethod + def validate_query(query, request, user): + # We need SearchMedia's validate_query to upload the media + media_query = SearchMedia.validate_query(query, request, user) + + # Here's the real trick: act like a preset and add another processor to the pipeline + media_query["next"] = [{"type": "audio-to-text", + "parameters": query.copy()}] + return media_query \ No newline at end of file diff --git a/datasources/douyin/search_douyin.py b/datasources/douyin/search_douyin.py index 5dfa6e7d3..e66b177ff 100644 --- a/datasources/douyin/search_douyin.py +++ b/datasources/douyin/search_douyin.py @@ -219,7 +219,7 @@ def map_item(item): "post_source_domain": urllib.parse.unquote(metadata.get("source_platform_url")), # Adding this as different Douyin pages contain different data "post_url": f"https://www.douyin.com/video/{item[aweme_id_key]}", - "region": item.get("region"), + "region": item.get("region", ""), "hashtags": ",".join( [tag[hashtag_key] for tag in (item[text_extra_key] if item[text_extra_key] is not None else []) if hashtag_key in tag]), diff --git a/datasources/gab/search_gab.py b/datasources/gab/search_gab.py index 967030870..4b200b667 100644 --- a/datasources/gab/search_gab.py +++ b/datasources/gab/search_gab.py @@ -2,9 +2,9 @@ Import scraped Gab data """ import datetime -import re from backend.lib.search import Search +from common.lib.item_mapping import MappedItem class SearchGab(Search): @@ -79,4 +79,4 @@ def map_item(post): "timestamp": post_time.strftime("%Y-%m-%d %H:%M:%S") } - return mapped_item + return MappedItem(mapped_item) diff --git a/datasources/media_import/__init__.py b/datasources/media_import/__init__.py new file mode 100644 index 000000000..abd598bb7 --- /dev/null +++ b/datasources/media_import/__init__.py @@ -0,0 +1,6 @@ +# Use default data source init function +from common.lib.helpers import init_datasource + +# Internal identifier for this data source +DATASOURCE = "media-import" +NAME = "Import/upload Media files" \ No newline at end of file diff --git a/datasources/media_import/import_media.py b/datasources/media_import/import_media.py new file mode 100644 index 000000000..d45016efd --- /dev/null +++ b/datasources/media_import/import_media.py @@ -0,0 +1,257 @@ +import re +import math +import json +import time +import zipfile +import mimetypes +from io import BytesIO + +from backend.lib.processor import BasicProcessor +from common.config_manager import config +from common.lib.exceptions import QueryParametersException +from common.lib.user_input import UserInput +from common.lib.helpers import andify + +# approximate number of files that can be uploaded in a single request rounded to 100 +max_files_approx = int((math.floor(config.get('flask.max_form_parts', 1000)-50)/100)) * 100 + +class SearchMedia(BasicProcessor): + type = "media-import-search" # job ID + category = "Search" # category + title = "Upload Media" # title displayed in UI + description = "Upload your own audio, video, or image files to be used as a dataset" # description displayed in UI + extension = "zip" # extension of result file, used internally and in UI + is_local = False # Whether this datasource is locally scraped + is_static = False # Whether this datasource is still updated + + max_workers = 1 + + disallowed_characters = re.compile(r"[^a-zA-Z0-9._+-]") + accepted_file_types = ["audio", "video", "image"] + + @classmethod + def get_options(cls, parent_dataset=None, user=None): + return { + "intro": { + "type": UserInput.OPTION_INFO, + # Large numbers of files fail possibly due to Flask request size limit (not file size) + "help": "Upload media files to make them be available for further analysis. " + "Please include only one type of file per dataset (image, audio, or video) and " + "4CAT will be able to run various processors on these media collections. " + f"\n\nFor collections **larger than a few hundred**, please upload a single " + f"ZIP file. More than ~{max_files_approx} files will fail (and a ZIP file will also load much faster)." + }, + "data_upload": { + "type": UserInput.OPTION_FILE, + "multiple": True, + "help": "Files" + }, + } + + @staticmethod + def validate_query(query, request, user): + """ + Step 1: Validate query and files + + Confirms that the uploaded files exist and that the media type is valid. + + :param dict query: Query parameters, from client-side. + :param request: Flask request + :param User user: User object of user who has submitted the query + :return dict: Safe query parameters + """ + # do we have uploaded files? + bad_files = [] + seen_types = set() + all_files = 0 + + uploaded_files = request.files.getlist("option-data_upload") + single_zip_file = uploaded_files and len(uploaded_files) == 1 and uploaded_files[0].filename.lower().endswith(".zip") + + if "option-data_upload-entries" in request.form or single_zip_file: + # we have a zip file! + try: + if single_zip_file: + # we have a single uploaded zip file + # i.e. the query has already been validated (else we would have + # -entries and no file) and we can get the file info from the + # zip file itself + uploaded_files[0].seek(0) + zip_file_data = BytesIO(uploaded_files[0].read()) + with zipfile.ZipFile(zip_file_data, "r") as uploaded_zip: + files = [{"filename": f} for f in uploaded_zip.namelist()] + else: + # validating - get file names from entries field + files = json.loads(request.form["option-data_upload-entries"]) + + # ignore known metadata files + files = [f for f in files if not ( + f["filename"].split("/")[-1].startswith(".") + or f["filename"].endswith(".log") + or f["filename"].split("/")[-1].startswith("__MACOSX") + or f["filename"].endswith(".DS_Store") + or f["filename"].endswith("/") # sub-directory + )] + + # figure out if we have mixed media types + seen_types = set() + for file in files: + try: + file_type = mimetypes.guess_type(file["filename"])[0].split("/")[0] + seen_types.add(file_type) + all_files += 1 + except (AttributeError, TypeError): + bad_files.append(file["filename"]) + + except (ValueError, zipfile.BadZipfile) as e: + raise QueryParametersException("Cannot read zip file - it may be encrypted or corrupted and cannot " + "be uploaded to 4CAT.") + + elif "option-data_upload" not in request.files: + raise QueryParametersException("No files were offered for upload.") + + elif len(uploaded_files) < 1: + raise QueryParametersException("No files were offered for upload.") + + else: + # we just have a bunch of separate files + # Check file types to ensure all are same type of media + for file in uploaded_files: + # Allow metadata files and log files to be uploaded + if file.filename == ".metadata.json" or file.filename.endswith(".log"): + continue + + # when uploading multiple files, we don't want zips + if file.filename.lower().endswith(".zip"): + raise QueryParametersException("When uploading media in a zip archive, please upload exactly one " + "zip file; 4CAT cannot combine multiple separate zip archives.") + + # Guess mime type from filename; we only have partial files at this point + mime_type = mimetypes.guess_type(file.filename)[0] + if mime_type is None: + bad_files.append(file.filename) + continue + + mime_type = mime_type.split('/')[0] + if mime_type not in SearchMedia.accepted_file_types: + raise QueryParametersException(f"This data source only accepts " + f"{andify(SearchMedia.accepted_file_types)} files; " + f"'{file.filename}' was detected as {mime_type}, which 4CAT cannot " + f"process.") + + seen_types.add(mime_type) + all_files += 1 + + # we need to at least be able to recognise the extension to know we can + # do something with the file... + if bad_files: + separator = "\n- " + raise QueryParametersException("The type of the following files cannot be determined; rename them or " + f"remove them from the archive or rename them\n{separator.join(bad_files)}") + + # this is not fool-proof, but uncommon extensions are less likely to work + # anyway and the user can still choose to proceed + if len(set(seen_types)) > 1: + raise QueryParametersException( + f"The zip file contains files of multiple media types ({andify(seen_types)}). 4CAT processors require " + "files of a single type to work properly. Please re-upload only a single type of media to proceed." + ) + + return { + "time": time.time(), + "media_type": seen_types.pop() if seen_types else None, # first validation check may not have seen any valid files + "num_files": all_files, + } + + @staticmethod + def after_create(query, dataset, request): + """ + Step 2: Hook to execute after the dataset for this source has been created + + In this case, save the files in a zip archive. + + :param dict query: Sanitised query parameters + :param DataSet dataset: Dataset created for this query + :param request: Flask request submitted for its creation + """ + mime_type = query.get("media_type") + saved_files = 0 + skipped_files = [] + with zipfile.ZipFile(dataset.get_results_path(), "w", compression=zipfile.ZIP_STORED) as new_zip_archive: + for file in request.files.getlist("option-data_upload"): + # Check if file is zip archive + file_mime_type = mimetypes.guess_type(file.filename)[0] + if file_mime_type is not None and file_mime_type.split('/')[0] == "application" and \ + file_mime_type.split('/')[1] == "zip": + # Save inner files from zip archive to new zip archive with all files + file.seek(0) + zip_file_data = BytesIO(file.read()) + with zipfile.ZipFile(zip_file_data, "r") as inner_zip_archive: + for inner_file in inner_zip_archive.infolist(): + if inner_file.is_dir(): + continue + + guessed_file_mime_type = mimetypes.guess_type(inner_file.filename) + if guessed_file_mime_type[0]: + mime_type = guessed_file_mime_type[0].split('/')[0] + + # skip useless metadata files + # also skip files not recognised as media files + clean_file_name = inner_file.filename.split("/")[-1] + if not guessed_file_mime_type[0] or ( + mime_type not in SearchMedia.accepted_file_types + and not clean_file_name.endswith(".log") + and not clean_file_name == ".metadata.json" + ) or clean_file_name.startswith("__MACOSX") \ + or inner_file.filename.startswith("__MACOSX"): + print(f"skipping {clean_file_name} ({guessed_file_mime_type})") + skipped_files.append(inner_file.filename) + continue + + # save inner file from the uploaded zip archive to the new zip with all files + new_filename = SearchMedia.get_safe_filename(inner_file.filename, new_zip_archive) + new_zip_archive.writestr(new_filename, inner_zip_archive.read(inner_file)) + + if not new_filename == ".metadata.json" or not new_filename.endswith(".log"): + saved_files += 1 + continue + + new_filename = SearchMedia.get_safe_filename(file.filename, new_zip_archive) + with new_zip_archive.open(new_filename, mode='w') as dest_file: + file.seek(0) + while True: + chunk = file.read(1024) + if len(chunk) == 0: + break + dest_file.write(chunk) + + if not new_filename == ".metadata.json" or not new_filename.endswith(".log"): + saved_files += 1 + + # update the number of files in the dataset + dataset.num_files = saved_files + dataset.media_type = mime_type + if skipped_files: + # todo: this now doesn't actually get logged because the log is + # re-initialised after after_create runs? + dataset.log("The following files in the uploaded zip archive were skipped because they were not recognised" + "as media files:" + "\n -".join(skipped_files)) + + def process(self): + """ + Step 3: Ummmm, we kinda did everything + """ + self.dataset.log(f"Uploaded {self.parameters.get('num_files')} files of type {self.parameters.get('media_type')}") + self.dataset.finish(self.parameters.get("num_files")) + + @staticmethod + def get_safe_filename(filename, zip_archive=None): + new_filename = SearchMedia.disallowed_characters.sub("", filename) + if zip_archive: + # check if file is in zip archive + index = 1 + while new_filename in zip_archive.namelist(): + new_filename = new_filename + "_" + str(index) + index += 1 + + return new_filename diff --git a/datasources/telegram/search_telegram.py b/datasources/telegram/search_telegram.py index e0e9bb142..158e62e02 100644 --- a/datasources/telegram/search_telegram.py +++ b/datasources/telegram/search_telegram.py @@ -66,6 +66,16 @@ class SearchTelegram(Search): "default": 25, "tooltip": "Amount of entities that can be queried at a time. Entities are groups or channels. 0 to " "disable limit." + }, + "telegram-search.max_crawl_depth": { + "type": UserInput.OPTION_TEXT, + "help": "Max crawl depth", + "coerce_type": int, + "min": 0, + "default": 0, + "tooltip": "If higher than 0, 4CAT can automatically add new entities to the query based on forwarded " + "messages. Recommended to leave at 0 for most users since this can exponentially increase " + "dataset sizes." } } @@ -151,7 +161,7 @@ def get_options(cls, parent_dataset=None, user=None): "type": UserInput.OPTION_INFO, "help": "4CAT can resolve the references to channels and user and replace the numeric ID with the full " "user, channel or group metadata. Doing so allows one to discover e.g. new relevant groups and " - "figure out where or who a message was forwarded from. However, this increases query time and " + "figure out where or who a message was forwarded from.\n\nHowever, this increases query time and " "for large datasets, increases the chance you will be rate-limited and your dataset isn't able " "to finish capturing. It will also dramatically increase the disk space needed to store the " "data, so only enable this if you really need it!" @@ -175,6 +185,36 @@ def get_options(cls, parent_dataset=None, user=None): options["max_posts"]["help"] = (f"Messages to collect per entity. You can query up to " f"{options['max_posts']['max']:,} messages per entity.") + if config.get("telegram-search.max_crawl_depth", 0, user=user) > 0: + options["crawl_intro"] = { + "type": UserInput.OPTION_INFO, + "help": "Optionally, 4CAT can 'discover' new entities via forwarded messages; for example, if a " + "channel X you are collecting data for contains a message forwarded from channel Y, 4CAT can " + "collect messages from both channel X and Y. **Use this feature with caution**, as datasets can " + "rapidly grow when adding newly discovered entities to the query this way. Note that dataset " + "progress cannot be accurately tracked when you use this feature." + } + options["crawl-depth"] = { + "type": UserInput.OPTION_TEXT, + "coerce_type": int, + "min": 0, + "max": config.get("telegram-search.max_crawl_depth"), + "default": 0, + "help": "Crawl depth", + "tooltip": "How many 'hops' to make when crawling messages. This is the distance from an initial " + "query, i.e. at most this many hops can be needed to reach the entity from one of the " + "starting entities." + } + options["crawl-threshold"] = { + "type": UserInput.OPTION_TEXT, + "coerce_type": int, + "min": 0, + "default": 5, + "help": "Crawl threshold", + "tooltip": "Entities need to be references at least this many times to be added to the query. Only " + "references discovered below the max crawl depth are taken into account." + } + return options @@ -222,7 +262,7 @@ async def execute_queries(self): query = self.parameters session_id = SearchTelegram.create_session_id(query["api_phone"], query["api_id"], query["api_hash"]) - self.dataset.log('Telegram session id: %s' % session_id) + self.dataset.log(f'Telegram session id: {session_id}') session_path = Path(config.get("PATH_ROOT")).joinpath(config.get("PATH_SESSIONS"), session_id + ".session") client = None @@ -249,7 +289,7 @@ async def execute_queries(self): except Exception as e: # not sure what exception specifically is triggered here, but it # always means the connection failed - self.log.error("Telegram: %s\n%s" % (str(e), traceback.format_exc())) + self.log.error(f"Telegram: {e}\n{traceback.format_exc()}") self.dataset.update_status("Error connecting to the Telegram API with provided credentials.", is_final=True) if client and hasattr(client, "disconnect"): await client.disconnect() @@ -287,7 +327,7 @@ async def execute_queries(self): # catch-all so we can disconnect properly # ...should we? self.dataset.update_status("Error scraping posts from Telegram") - self.log.error("Telegram scraping error: %s" % traceback.format_exc()) + self.log.error(f"Telegram scraping error: {traceback.format_exc()}") return [] finally: await client.disconnect() @@ -308,34 +348,62 @@ async def gather_posts(self, client, queries, max_items, min_date, max_date): # Adding flag to stop; using for rate limits no_additional_queries = False + # This is used for the 'crawl' feature so we know at which depth a + # given entity was discovered + depth_map = { + entity: 0 for entity in queries + } + + crawl_max_depth = self.parameters.get("crawl-depth", 0) + crawl_msg_threshold = self.parameters.get("crawl-threshold", 10) + + self.dataset.log(f"Max crawl depth: {crawl_max_depth}") + self.dataset.log(f"Crawl threshold: {crawl_msg_threshold}") + + # this keeps track of how often an entity not in the original query + # has been mentioned. When crawling is enabled and this exceeds the + # given threshold, the entity is added to the query + crawl_references = {} + queried_entities = list(queries) + full_query = list(queries) + + # we may not always know the 'entity username' for an entity ID, so + # keep a reference map as we go + entity_id_map = {} + # Collect queries + # Use while instead of for so we can change queries during iteration + # this is needed for the 'crawl' feature which can discover new + # entities during crawl processed = 0 - for query in queries: + total_messages = 0 + while queries: + query = queries.pop(0) + delay = 10 retries = 0 processed += 1 - self.dataset.update_progress(processed / len(queries)) + self.dataset.update_progress(processed / len(full_query)) if no_additional_queries: # Note that we are note completing this query - self.dataset.update_status("Rate-limited by Telegram; not executing query %s" % query) + self.dataset.update_status(f"Rate-limited by Telegram; not executing query {entity_id_map.get(query, query)}") continue while True: - self.dataset.update_status("Fetching messages for entity '%s'" % query) - i = 0 + self.dataset.update_status(f"Retrieving messages for entity '{entity_id_map.get(query, query)}'") try: entity_posts = 0 async for message in client.iter_messages(entity=query, offset_date=max_date): entity_posts += 1 - i += 1 + total_messages += 1 if self.interrupted: raise ProcessorInterruptedException( "Interrupted while fetching message data from the Telegram API") if entity_posts % 100 == 0: self.dataset.update_status( - "Retrieved %i posts for entity '%s' (%i total)" % (entity_posts, query, i)) + f"Retrieved {entity_posts:,} posts for entity '{entity_id_map.get(query, query)}' ({total_messages:,} total)") if message.action is not None: # e.g. someone joins the channel - not an actual message @@ -345,6 +413,12 @@ async def gather_posts(self, client, queries, max_items, min_date, max_date): # the channel a message was forwarded from (but that # needs extra API requests...) serialized_message = SearchTelegram.serialize_obj(message) + if "_chat" in serialized_message and query not in entity_id_map and serialized_message["_chat"]["id"] == query: + # once we know what a channel ID resolves to, use the username instead so it is easier to + # understand for the user + entity_id_map[query] = serialized_message["_chat"]["username"] + self.dataset.update_status(f"Fetching messages for entity '{entity_id_map[query]}' (channel ID {query})") + if resolve_refs: serialized_message = await self.resolve_groups(client, serialized_message) @@ -352,21 +426,45 @@ async def gather_posts(self, client, queries, max_items, min_date, max_date): if min_date and serialized_message.get("date") < min_date: break + # if crawling is enabled, see if we found something to add to the query + if crawl_max_depth > 0 and (not crawl_msg_threshold or depth_map.get(query) < crawl_msg_threshold): + message_fwd = serialized_message.get("fwd_from") + fwd_from = None + if message_fwd and message_fwd["from_id"] and message_fwd["from_id"].get("_type") == "PeerChannel": + # even if we haven't resolved the ID, we can feed the numeric ID + # to Telethon! this is nice because it means we don't have to + # resolve entities to crawl iteratively + fwd_from = int(message_fwd["from_id"]["channel_id"]) + + if fwd_from and fwd_from not in queried_entities and fwd_from not in queries: + # new entity discovered! + # might be discovered (before collection) multiple times, so retain lowest depth + depth_map[fwd_from] = min(depth_map.get(fwd_from, crawl_max_depth), depth_map[query] + 1) + if depth_map[query] < crawl_max_depth: + if fwd_from not in crawl_references: + crawl_references[fwd_from] = 0 + + crawl_references[fwd_from] += 1 + if crawl_references[fwd_from] >= crawl_msg_threshold and fwd_from not in queries: + queries.append(fwd_from) + full_query.append(fwd_from) + self.dataset.update_status(f"Discovered new entity {entity_id_map.get(fwd_from, fwd_from)} in {entity_id_map.get(query, query)} at crawl depth {depth_map[query]}, adding to query") + yield serialized_message if entity_posts >= max_items: break except ChannelPrivateError: - self.dataset.update_status("Entity %s is private, skipping" % query) + self.dataset.update_status(f"Entity {entity_id_map.get(query, query)} is private, skipping") self.flawless += 1 except (UsernameInvalidError,): - self.dataset.update_status("Could not scrape entity '%s', does not seem to exist, skipping" % query) + self.dataset.update_status(f"Could not scrape entity '{entity_id_map.get(query, query)}', does not seem to exist, skipping") self.flawless += 1 except FloodWaitError as e: - self.dataset.update_status("Rate-limited by Telegram: %s; waiting" % str(e)) + self.dataset.update_status(f"Rate-limited by Telegram: {e}; waiting") if e.seconds < self.end_if_rate_limited: time.sleep(e.seconds) continue @@ -374,35 +472,32 @@ async def gather_posts(self, client, queries, max_items, min_date, max_date): self.flawless += 1 no_additional_queries = True self.dataset.update_status( - "Telegram wait grown large than %i minutes, ending" % int(e.seconds / 60)) + f"Telegram wait grown larger than {int(e.seconds / 60)} minutes, ending") break except BadRequestError as e: self.dataset.update_status( - "Error '%s' while collecting entity %s, skipping" % (e.__class__.__name__, query)) + f"Error '{e.__class__.__name__}' while collecting entity {entity_id_map.get(query, query)}, skipping") self.flawless += 1 except ValueError as e: - self.dataset.update_status("Error '%s' while collecting entity %s, skipping" % (str(e), query)) + self.dataset.update_status(f"Error '{e}' while collecting entity {entity_id_map.get(query, query)}, skipping") self.flawless += 1 except ChannelPrivateError as e: self.dataset.update_status( - "QUERY '%s' unable to complete due to error %s. Skipping." % ( - query, str(e))) + f"QUERY '{entity_id_map.get(query, query)}' unable to complete due to error {e}. Skipping.") break except TimeoutError: if retries < 3: self.dataset.update_status( - "Tried to fetch messages for entity '%s' but timed out %i times. Skipping." % ( - query, retries)) + f"Tried to fetch messages for entity '{entity_id_map.get(query, query)}' but timed out {retries:,} times. Skipping.") self.flawless += 1 break self.dataset.update_status( - "Got a timeout from Telegram while fetching messages for entity '%s'. Trying again in %i seconds." % ( - query, delay)) + f"Got a timeout from Telegram while fetching messages for entity '{entity_id_map.get(query, query)}'. Trying again in {delay:,} seconds.") time.sleep(delay) delay *= 2 continue @@ -454,11 +549,9 @@ async def resolve_groups(self, client, message): except (TypeError, ChannelPrivateError, UsernameInvalidError) as e: self.failures_cache.add(value.get("channel_id", value.get("user_id"))) if type(e) in (ChannelPrivateError, UsernameInvalidError): - self.dataset.log("Cannot resolve entity with ID %s of type %s (%s), leaving as-is" % ( - str(value.get("channel_id", value.get("user_id"))), value["_type"], e.__class__.__name__)) + self.dataset.log(f"Cannot resolve entity with ID {value.get('channel_id', value.get('user_id'))} of type {value['_type']} ({e.__class__.__name__}), leaving as-is") else: - self.dataset.log("Cannot resolve entity with ID %s of type %s, leaving as-is" % ( - str(value.get("channel_id", value.get("user_id"))), value["_type"])) + self.dataset.log(f"Cannot resolve entity with ID {value.get('channel_id', value.get('user_id'))} of type {value['_type']}, leaving as-is") return resolved_message @@ -590,6 +683,7 @@ def map_item(message): # was the message forwarded from somewhere and if so when? forwarded_timestamp = "" forwarded_name = "" + forwarded_id = "" forwarded_username = "" if message.get("fwd_from") and "from_id" in message["fwd_from"] and not ( type(message["fwd_from"]["from_id"]) is int): @@ -601,7 +695,7 @@ def map_item(message): from_data = message["fwd_from"]["from_id"] if from_data: - forwarded_from_id = from_data.get("channel_id", from_data.get("user_id", "")) + forwarded_id = from_data.get("channel_id", from_data.get("user_id", "")) if message["fwd_from"].get("from_name"): forwarded_name = message["fwd_from"].get("from_name") @@ -662,6 +756,7 @@ def map_item(message): "unix_timestamp_edited": int(message["edit_date"]) if message["edit_date"] else "", "author_forwarded_from_name": forwarded_name, "author_forwarded_from_username": forwarded_username, + "author_forwarded_from_id": forwarded_id, "timestamp_forwarded_from": datetime.fromtimestamp(forwarded_timestamp).strftime( "%Y-%m-%d %H:%M:%S") if forwarded_timestamp else "", "unix_timestamp_forwarded_from": forwarded_timestamp, @@ -830,7 +925,7 @@ def validate_query(query, request, user): except ValueError as e: # this happens if 2FA is required raise QueryParametersException("Your account requires two-factor authentication. 4CAT at this time " - "does not support this authentication mode for Telegram. (%s)" % e) + f"does not support this authentication mode for Telegram. ({e})") except RuntimeError as e: # A code was sent to the given phone number needs_code = True @@ -848,7 +943,7 @@ def validate_query(query, request, user): except Exception as e: # ? raise QueryParametersException( - "An unexpected error (%s) occurred and your authentication could not be verified." % e) + f"An unexpected error ({e}) occurred and your authentication could not be verified.") finally: if client: client.disconnect() @@ -876,7 +971,9 @@ def validate_query(query, request, user): "save-session": query.get("save-session"), "resolve-entities": query.get("resolve-entities"), "min_date": min_date, - "max_date": max_date + "max_date": max_date, + "crawl-depth": query.get("crawl-depth"), + "crawl-threshold": query.get("crawl-threshold") } @staticmethod diff --git a/datasources/twitter-import/search_twitter.py b/datasources/twitter-import/search_twitter.py index cf5b7a89f..f566c1302 100644 --- a/datasources/twitter-import/search_twitter.py +++ b/datasources/twitter-import/search_twitter.py @@ -80,6 +80,8 @@ def map_item_modern(tweet): "author": tweet["core"]["user_results"]["result"]["legacy"]["screen_name"], "author_fullname": tweet["core"]["user_results"]["result"]["legacy"]["name"], "author_id": tweet["legacy"]["user_id_str"], + "author_avatar_url": tweet["core"]["user_results"]["result"]["legacy"]["profile_image_url_https"], + "author_banner_url": tweet["core"]["user_results"]["result"]["legacy"]["profile_banner_url"], "source": strip_tags(tweet["source"]), "language_guess": tweet["legacy"].get("lang"), "possibly_sensitive": "yes" if tweet.get("possibly_sensitive") else "no", diff --git a/docker-compose.yml b/docker-compose.yml index 0618227a5..8e5f17a49 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,5 +1,3 @@ -version: '3.6' - services: db: container_name: 4cat_db diff --git a/docker-compose_build.yml b/docker-compose_build.yml index bae3d886c..b1c1fa1af 100644 --- a/docker-compose_build.yml +++ b/docker-compose_build.yml @@ -1,5 +1,3 @@ -version: '3.6' - services: db: container_name: 4cat_db diff --git a/docker-compose_public_ip.yml b/docker-compose_public_ip.yml index 20e3b5ca3..9fc0ca326 100644 --- a/docker-compose_public_ip.yml +++ b/docker-compose_public_ip.yml @@ -6,8 +6,6 @@ # The issue this "solves" is allowing 4CAT to be deployed on an unknown # IP address which is only provided by SURF after 4CAT deployment. -version: '3.6' - services: db: container_name: 4cat_db diff --git a/docker/Dockerfile b/docker/Dockerfile index 308f1d9b9..709d68893 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -4,14 +4,22 @@ RUN apt-get update && apt install -y \ # General requirements: libpq-dev \ python3-dev \ - python3-pip + python3-pip \ + # Called in docker-entrypoint.sh: + curl \ + netcat-traditional \ + postgresql-client \ + postgresql-server-dev-all \ + # Called by 4CAT: + git \ + # Needed for video processing only (and only technically on backend) + ffmpeg # Set working directory WORKDIR /usr/src/app -# Make and use virtual environment -RUN python3 -m venv /opt/venv -ENV PATH="/opt/venv/bin:$PATH" +# Ensure that Python outputs everything that's printed inside to containers +ENV PYTHONUNBUFFERED=1 # Install dependencies RUN pip3 install --upgrade pip @@ -27,26 +35,6 @@ RUN pip3 install -r requirements.txt # Install frontend Docker requirements RUN pip3 install gunicorn -# Build image from compile-image -FROM python:3.8-slim AS build-image -COPY --from=compile-image /opt/venv /opt/venv -# Make virtual env available -ENV PATH="/opt/venv/bin:$PATH" PYTHONUNBUFFERED=1 - -RUN apt-get update && apt install -y \ - # Called in docker-entrypoint.sh: - curl \ - netcat-traditional \ - postgresql-client \ - postgresql-server-dev-all \ - # Called by 4CAT: - git \ - # Needed for video processing only (and only technically on backend) - ffmpeg - -# Set working directory -WORKDIR /usr/src/app - # Copy project COPY . /usr/src/app/ diff --git a/docker/docker-entrypoint.sh b/docker/docker-entrypoint.sh index 8e552a155..6f0cd2235 100755 --- a/docker/docker-entrypoint.sh +++ b/docker/docker-entrypoint.sh @@ -48,7 +48,7 @@ rm -f ./backend/4cat.pid export PYTHONPATH=/usr/src/app:$PYTHONPATH # Run migrate prior to setup (old builds pre 1.26 may not have config_manager) -python3 helper-scripts/migrate.py -y +python3 helper-scripts/migrate.py -y -o logs/migrate-backend.log # Run docker_setup to update any environment variables if they were changed python3 -m docker.docker_setup diff --git a/docker/wait-for-backend.sh b/docker/wait-for-backend.sh index ff485620a..f8838939e 100644 --- a/docker/wait-for-backend.sh +++ b/docker/wait-for-backend.sh @@ -11,7 +11,7 @@ done >&2 echo "Backend is up" # Run migrate to ensure 4CAT is up to date if version file has changed -python3 -m helper-scripts.migrate.py -y --component frontend --current-version config/.current-version-frontend +python3 -m helper-scripts.migrate.py -y -o logs/migrate-frontend.log --component frontend --current-version config/.current-version-frontend # Default values for Gunicorn (if not provided by environment) : "${worker_tmp_dir:=/dev/shm}" diff --git a/helper-scripts/export_4chan.py b/helper-scripts/export_4chan.py index cffd09bb9..56d3624fa 100644 --- a/helper-scripts/export_4chan.py +++ b/helper-scripts/export_4chan.py @@ -94,11 +94,6 @@ print("Exporting to %s" % args.output) -# Correct sticky threads for /pol/ -if "pol" in boards: - print("Updating sticky threads for /pol/.") - db.execute("UPDATE threads_4chan SET is_sticky = TRUE WHERE board = 'pol' AND id IN (385738122,383677565,431579660,375779341,374650701,421675128,438918345,401602799,430140262,406826265,376776209,393208524,419662044,415923186,422028606,406251049,415653885,431856910)") - # Get min and max thread IDs to query in batches and know when we're done print("Getting upper and lower boundaries of thread IDs.") min_thread_id = db.fetchone("SELECT min(id) FROM threads_4chan WHERE %s " % board_sql)["min"] @@ -205,7 +200,8 @@ def get_posts(min_id, itersize): deleted = True if (row["timestamp_deleted"] and row["timestamp_deleted"] > 0) and not post.get("op") else False if (deleted or thread_deleted) and row["id"] != row["thread_id"]: post["deleted"] = True - post["deleted_on"] = row["timestamp_deleted"] if (row["timestamp_deleted"] and row["timestamp_deleted"] > 0) else thread_data[0]["deleted_on"] + if not skip_deleted: # Deleted OP data might have been skipped, so we maybe can't get data from `thread_data` + post["deleted_on"] = row["timestamp_deleted"] if (row["timestamp_deleted"] and row["timestamp_deleted"] > 0) else thread_data[0]["deleted_on"] # Skip deleted posts, if indicated if skip_deleted and post.get("deleted"): diff --git a/helper-scripts/migrate.py b/helper-scripts/migrate.py index 005863ea9..fb85772ae 100644 --- a/helper-scripts/migrate.py +++ b/helper-scripts/migrate.py @@ -129,6 +129,9 @@ def finish(args, logger): logger = logging.getLogger("migrate") logger.setLevel(logging.INFO) if args.output: + # Add both a file and a stream handler if output is set + handler = logging.StreamHandler(sys.stdout) + logger.addHandler(handler) handler = logging.FileHandler(args.output) else: handler = logging.StreamHandler(sys.stdout) @@ -326,22 +329,45 @@ def finish(args, logger): for file in migrate_to_run: logger.info(" - %s" % file.name) +# --------------------------------------------- +# Install any needed packages +# --------------------------------------------- + +try: + from common.config_manager import config +except ImportError: + config = None + +if config and config.get("USING_DOCKER"): + logger.info("- Running in Docker environment, checking for and installing any needed compilers...") + # Pip needs some compilers to successfully update + needed_packages = ["g++", "gcc"] + try: + apt_get = subprocess.run(["apt-get", "install", "-y"] + needed_packages, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, check=True) + logger.info("\n".join([" " + line for line in apt_get.stdout.decode("utf-8").split("\n")])) + except subprocess.CalledProcessError as e: + logger.info("\n".join([" " + line for line in e.output.decode("utf-8").split("\n")])) + logger.info(f"\n Error while installing {needed_packages}: {e}") + # --------------------------------------------- # Run pip # --------------------------------------------- +def log_pip_output(logger, output): + for line in output.decode("utf-8").split("\n"): + if line.startswith("Requirement already satisfied:"): + # eliminate some noise in the output + continue + logger.info(" " + line) + logger.info("- Running pip to install new dependencies and upgrade existing dependencies") logger.info(" (this could take a moment)...") try: pip = subprocess.run([interpreter, "-m", "pip", "install", "-r", "requirements.txt", "--upgrade", "--upgrade-strategy", "eager"], stderr=subprocess.STDOUT, stdout=subprocess.PIPE, check=True, cwd=cwd) - for line in pip.stdout.decode("utf-8").split("\n"): - if line.startswith("Requirement already satisfied:"): - # eliminate some noise in the output - continue - logger.info(" " + line) + log_pip_output(logger, pip.stdout) except subprocess.CalledProcessError as e: - logger.info(e) - logger.info("\n Error running pip. You may need to run this script with elevated privileges (e.g. sudo).\n") + log_pip_output(logger, e.output) + logger.info(f"\n Error running pip: {e}") exit(1) logger.info(" ...done") diff --git a/processors/audio/audio_extractor.py b/processors/audio/audio_extractor.py index 6facbe08f..f2d561974 100644 --- a/processors/audio/audio_extractor.py +++ b/processors/audio/audio_extractor.py @@ -33,12 +33,14 @@ class AudioExtractor(BasicProcessor): description = "Extract audio from videos" # description displayed in UI extension = "zip" # extension of result file, used internally and in UI + followups = ["audio-to-text"] + @classmethod def is_compatible_with(cls, module=None, user=None): """ - Allow on tiktok-search only for dev + Allow on videos only """ - return module.type.startswith("video-downloader") and \ + return (module.get_media_type() == "video" or module.type.startswith("video-downloader")) and \ config.get("video-downloader.ffmpeg_path", user=user) and \ shutil.which(config.get("video-downloader.ffmpeg_path")) diff --git a/processors/conversion/stringify.py b/processors/conversion/stringify.py index f5874f4ee..21835037a 100644 --- a/processors/conversion/stringify.py +++ b/processors/conversion/stringify.py @@ -45,6 +45,16 @@ class Stringify(BasicProcessor): } } + @staticmethod + def is_compatible_with(module=None, user=None): + """ + Determine compatibility; this processor is only compatible with top datasets in CSV or NDJSON format. + + :param str module: Module ID to determine compatibility with + :return bool: + """ + return module.is_top_dataset() and module.get_extension() in ("csv", "ndjson") + def process(self): """ This takes a 4CAT results file as input, and outputs a plain text file diff --git a/processors/conversion/twitter_ndjson_to_tcat_json.py b/processors/conversion/twitter_ndjson_to_tcat_json.py index 216d3419b..24c4bab9c 100644 --- a/processors/conversion/twitter_ndjson_to_tcat_json.py +++ b/processors/conversion/twitter_ndjson_to_tcat_json.py @@ -20,6 +20,8 @@ class ConvertNDJSONToJSON(BasicProcessor): description = "Convert a Twitter dataset to a TCAT-compatible format. This file can then be uploaded to TCAT." # description displayed in UI extension = "json" # extension of result file, used internally and in UI + followups = ["tcat-auto-upload"] + @classmethod def is_compatible_with(cls, module=None, user=None): """ diff --git a/processors/filtering/column_filter.py b/processors/filtering/column_filter.py index 72f242045..01c7fa88f 100644 --- a/processors/filtering/column_filter.py +++ b/processors/filtering/column_filter.py @@ -79,7 +79,7 @@ def is_compatible_with(cls, module=None, user=None): :param module: Module to determine compatibility with """ - return module.is_top_dataset() + return module.is_top_dataset() and module.get_extension() in ("csv", "ndjson") @classmethod def get_options(cls, parent_dataset=None, user=None): diff --git a/processors/filtering/write_annotations.py b/processors/filtering/write_annotations.py index 3e7d91cbe..7fb8f2ee4 100644 --- a/processors/filtering/write_annotations.py +++ b/processors/filtering/write_annotations.py @@ -34,7 +34,7 @@ def is_compatible_with(cls, module=None, user=None): :param module: Module to determine compatibility with """ - return module.is_top_dataset() + return module.is_top_dataset() and module.get_extension() in ("csv", "ndjson") def process(self): """ diff --git a/processors/machine-learning/blip2_image_caption.py b/processors/machine_learning/blip2_image_caption.py similarity index 96% rename from processors/machine-learning/blip2_image_caption.py rename to processors/machine_learning/blip2_image_caption.py index 1b3c490df..0829162a7 100644 --- a/processors/machine-learning/blip2_image_caption.py +++ b/processors/machine_learning/blip2_image_caption.py @@ -28,6 +28,9 @@ class CategorizeImagesCLIP(BasicProcessor): description = "The BLIP2 model uses a pretrained image encoder combined with an LLM to generate image captions. The model can also be prompted and uses the image plus prompt to generate text responses." # description displayed in UI extension = "ndjson" # extension of result file, used internally and in UI + # Processors designed to handle input from this Dataset + followups = ["image-text-wall"] + references = [ "[OpenAI CLIP blog](https://openai.com/research/clip)", "[BLIP-2 paper: Bootstrapping Language-Image Pre-training with Frozen Image Encoders and Large Language Models](https://arxiv.org/abs/2301.12597)", @@ -60,7 +63,7 @@ def is_compatible_with(cls, module=None, user=None): """ return config.get("dmi-service-manager.fc_blip2_enabled", False, user=user) and \ config.get("dmi-service-manager.ab_server_address", False, user=user) and \ - module.type.startswith("image-downloader") + (module.get_media_type() == "image" or module.type.startswith("image-downloader")) @classmethod def get_options(cls, parent_dataset=None, user=None): @@ -181,7 +184,10 @@ def process(self): # Load the video metadata if available image_metadata = {} - metadata_file = self.extract_archived_file_by_name(".metadata.json", self.source_file, staging_area) + try: + metadata_file = self.extract_archived_file_by_name(".metadata.json", self.source_file, staging_area) + except FileNotFoundError: + metadata_file = None if metadata_file: with open(metadata_file) as file: image_data = json.load(file) diff --git a/processors/machine-learning/classify_images.py b/processors/machine_learning/classify_images.py similarity index 100% rename from processors/machine-learning/classify_images.py rename to processors/machine_learning/classify_images.py diff --git a/processors/machine-learning/clip_categorize_images.py b/processors/machine_learning/clip_categorize_images.py similarity index 98% rename from processors/machine-learning/clip_categorize_images.py rename to processors/machine_learning/clip_categorize_images.py index 266ac58ec..1f7020346 100644 --- a/processors/machine-learning/clip_categorize_images.py +++ b/processors/machine_learning/clip_categorize_images.py @@ -28,6 +28,8 @@ class CategorizeImagesCLIP(BasicProcessor): description = "Given a list of categories, the CLIP model will estimate likelihood an image is to belong to each (total of all categories per image will be 100%)." # description displayed in UI extension = "ndjson" # extension of result file, used internally and in UI + followups = ["image-category-wall"] + references = [ "[OpenAI CLIP blog](https://openai.com/research/clip)", "[CLIP paper: Learning Transferable Visual Models From Natural Language Supervision](https://arxiv.org/pdf/2103.00020.pdf)", @@ -61,7 +63,7 @@ def is_compatible_with(cls, module=None, user=None): """ return config.get("dmi-service-manager.cc_clip_enabled", False, user=user) and \ config.get("dmi-service-manager.ab_server_address", False, user=user) and \ - module.type.startswith("image-downloader") + (module.get_media_type() == "image" or module.type.startswith("image-downloader")) @classmethod def get_options(cls, parent_dataset=None, user=None): @@ -117,18 +119,18 @@ def process(self): """ This takes a zipped set of image files and uses a CLIP docker image to categorize them. """ - categories = [cat.strip() for cat in self.parameters.get('categories').split(',')] model = self.parameters.get("model") if self.source_dataset.num_rows <= 1: # 1 because there is always a metadata file self.dataset.finish_with_error("No images found.") return - elif not categories: + elif not self.parameters.get('categories'): self.dataset.finish_with_error("No categories provided.") return elif not model: self.dataset.finish_with_error("No model provided.") return + categories = [cat.strip() for cat in self.parameters.get('categories').split(',')] # Unpack the image files into a staging_area self.dataset.update_status("Unzipping image files") diff --git a/processors/machine-learning/generate_images.py b/processors/machine_learning/generate_images.py similarity index 90% rename from processors/machine-learning/generate_images.py rename to processors/machine_learning/generate_images.py index fb34656e0..e82525a5b 100644 --- a/processors/machine-learning/generate_images.py +++ b/processors/machine_learning/generate_images.py @@ -9,6 +9,7 @@ import os from backend.lib.processor import BasicProcessor +from processors.visualisation.download_images import ImageDownloader from common.lib.dmi_service_manager import DmiServiceManager, DmiServiceManagerException, DsmOutOfMemory from common.lib.exceptions import ProcessorInterruptedException from common.lib.user_input import UserInput @@ -30,6 +31,8 @@ class StableDiffusionImageGenerator(BasicProcessor): description = "Given a list of prompts, generates images for those prompts using the Stable Diffusion XL image model." # description displayed in UI extension = "zip" # extension of result file, used internally and in UI + followups = ImageDownloader.followups + references = [ "[Stable Diffusion XL 1.0 model card](https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0)" ] @@ -56,6 +59,12 @@ class StableDiffusionImageGenerator(BasicProcessor): } options = { + "amount": { + "type": UserInput.OPTION_TEXT, + "coerce_type": int, + "help": "Number of images to generate", + "default": 20, + }, "prompt-column": { "type": UserInput.OPTION_TEXT, "default": False, @@ -102,6 +111,14 @@ def get_options(cls, parent_dataset=None, user=None): "options": {"": "", **parent_columns}, "default": "" }) + max_prompts = config.get("dmi-service-manager.sd_num_files") + if max_prompts == 0: + options["amount"]["tooltip"] = "Use '0' to allow unlimited number" + else: + options["amount"]["help"] = f"Number of images to generate (max {max_prompts})" + options["amount"]["min"] = 1 + options["amount"]["max"] = max_prompts + options["amount"]["default"] = min(max_prompts, 20) return options @@ -146,14 +163,18 @@ def process(self): This takes a dataset and generates images for prompts retrieved from that dataset """ prompts = {} - max_prompts = self.config.get("dmi-service-manager.sd_num_files") + hard_max_prompts = self.config.get("dmi-service-manager.sd_num_files") + user_max_prompts = self.parameters.get("amount", 20) prompt_c = self.parameters["prompt-column"] neg_c = self.parameters.get("negative-prompt-column") for item in self.source_dataset.iterate_items(self): - if max_prompts and len(prompts) >= max_prompts: + if hard_max_prompts != 0 and len(prompts) >= hard_max_prompts: + break + elif user_max_prompts != 0 and len(prompts) >= user_max_prompts: break + prompts[item.get("id", len(prompts) + 1)] = { "prompt": item.get(prompt_c, ""), "negative": item.get(neg_c) if item.get(neg_c) is not None else "" diff --git a/processors/machine-learning/pix-plot.py b/processors/machine_learning/pix-plot.py similarity index 94% rename from processors/machine-learning/pix-plot.py rename to processors/machine_learning/pix-plot.py index f1b844acb..62186a053 100644 --- a/processors/machine-learning/pix-plot.py +++ b/processors/machine_learning/pix-plot.py @@ -33,6 +33,8 @@ class PixPlotGenerator(BasicProcessor): "algorithmically grouped by similarity." extension = "html" # extension of result file, used internally and in UI + followups = [] + references = [ "[PixPlot](https://pixplot.io/)", "[Parameter documentation](https://pixplot.io/docs/api/parameters.html)" @@ -141,7 +143,7 @@ def is_compatible_with(cls, module=None, user=None): """ return config.get("dmi-service-manager.db_pixplot_enabled", False, user=user) and \ config.get("dmi-service-manager.ab_server_address", False, user=user) and \ - module.type.startswith("image-downloader") + (module.get_media_type() == "image" or module.type.startswith("image-downloader")) def process(self): """ @@ -190,14 +192,14 @@ def process(self): # Files can be based on the parent dataset (to avoid uploading the same files multiple times) file_collection_name = dmi_service_manager.get_folder_name(self.source_dataset) - path_to_files, path_to_results = dmi_service_manager.process_files(staging_area, image_filenames + [metadata_file_path], output_dir, + path_to_files, path_to_results = dmi_service_manager.process_files(staging_area, image_filenames + ([metadata_file_path] if metadata_file_path else []), output_dir, file_collection_name, server_results_folder_name) # PixPlot # Create json package for creation request data = {'args': ['--images', f"data/{path_to_files}/*", - '--out_dir', f"data/{path_to_results}", - '--metadata', f"data/{path_to_files}/{metadata_file_path.name}"]} + '--out_dir', f"data/{path_to_results}"] + + (['--metadata', f"data/{path_to_files}/{metadata_file_path.name}"] if metadata_file_path else [])} # Additional options for PixPlot cell_size = self.parameters.get('image_size') @@ -266,6 +268,13 @@ def format_metadata(self, temp_path): # No metadata return False + # Check that this is not already a top dataset + if self.dataset.top_parent().key == self.source_dataset.key: + # i.e. the source image dataset is not a top dataset that happens to have a metadata file from some export + # This can happen with the Upload Media datasource if the user uploads a 4CAT results zip with images and .metadata.json + # But there is not a top dataset with post data in this instance unfortunately + return False + with open(os.path.join(temp_path, '.metadata.json')) as file: image_data = json.load(file) diff --git a/processors/machine-learning/text_from_image.py b/processors/machine_learning/text_from_image.py similarity index 97% rename from processors/machine-learning/text_from_image.py rename to processors/machine_learning/text_from_image.py index 2c16af9ed..f8fa4d645 100644 --- a/processors/machine-learning/text_from_image.py +++ b/processors/machine_learning/text_from_image.py @@ -39,6 +39,9 @@ class ImageTextDetector(BasicProcessor): """ extension = "ndjson" # extension of result file, used internally and in UI + # Processors designed to handle input from this Dataset + followups = ["image-text-wall"] + references = [ "[DMI OCR Server](https://github.com/digitalmethodsinitiative/ocr_server#readme)", "[Paddle OCR model](https://github.com/PaddlePaddle/PaddleOCR#readme)" @@ -77,7 +80,7 @@ class ImageTextDetector(BasicProcessor): }, "update_original": { "type": UserInput.OPTION_TOGGLE, - "help": "Update original database with detected text", + "help": "Update original dataset with detected text", "default": False, "tooltip": "If enabled, the original dataset will be modified to include a 'detected_text' column otherwise a seperate dataset will be created" } @@ -92,7 +95,7 @@ def is_compatible_with(cls, module=None, user=None): """ return config.get('dmi-service-manager.eb_ocr_enabled', False, user=user) and \ config.get("dmi-service-manager.ab_server_address", False, user=user) and \ - module.type.startswith("image-downloader") + (module.get_media_type() == "image" or module.type.startswith("image-downloader")) def process(self): """ @@ -272,7 +275,7 @@ def map_item(item): For preview frontend """ return MappedItem({ - "filename": item.get("filename"), + "image_filename": item.get("filename"), "model_type": item.get("model_type"), "text": item.get("simplified_text", {}).get("raw_text"), "post_ids": ", ".join([str(post_id) for post_id in item.get("image_metadata", {}).get("post_ids", [])]), diff --git a/processors/machine-learning/whisper_speech_to_text.py b/processors/machine_learning/whisper_speech_to_text.py similarity index 99% rename from processors/machine-learning/whisper_speech_to_text.py rename to processors/machine_learning/whisper_speech_to_text.py index 64b63fdf2..63e4734b5 100644 --- a/processors/machine-learning/whisper_speech_to_text.py +++ b/processors/machine_learning/whisper_speech_to_text.py @@ -28,6 +28,8 @@ class AudioToText(BasicProcessor): description = "Detect speech in audion and convert to text." # description displayed in UI extension = "ndjson" # extension of result file, used internally and in UI + followups = [] + references = [ "[OpenAI Whisper blog](https://openai.com/research/whisper)", "[Whisper paper: Robust Speech Recognition via Large-Scale Weak Supervision](https://arxiv.org/abs/2212.04356)", @@ -61,7 +63,7 @@ def is_compatible_with(cls, module=None, user=None): """ return config.get("dmi-service-manager.bc_whisper_enabled", False, user=user) and \ config.get("dmi-service-manager.ab_server_address", False, user=user) and \ - module.type.startswith("audio-extractor") + (module.get_media_type() == 'audio' or module.type.startswith("audio-extractor")) @classmethod def get_options(cls, parent_dataset=None, user=None): diff --git a/processors/metrics/clarifai_api.py b/processors/metrics/clarifai_api.py index 075dfc99f..140a7a1b0 100644 --- a/processors/metrics/clarifai_api.py +++ b/processors/metrics/clarifai_api.py @@ -33,6 +33,8 @@ class ClarifaiAPIFetcher(BasicProcessor): "requests will be credited by Clarifai to the owner of the API token you provide!" # description displayed in UI extension = "ndjson" # extension of result file, used internally and in UI + followups = ["convert-clarifai-vision-to-csv", "clarifai-bipartite-network"] + references = [ "[Clarifai](https://www.clarifai.com/)", "[Clarifai API Pricing & Free Usage Limits](https://www.clarifai.com/pricing)", @@ -46,7 +48,7 @@ def is_compatible_with(cls, module=None, user=None): :param module: Module to determine compatibility with """ - return module.type.startswith("image-downloader") or module.type == "video-frames" + return module.get_media_type() == "image" or module.type.startswith("image-downloader") or module.type == "video-frames" options = { "amount": { diff --git a/processors/metrics/count_posts.py b/processors/metrics/count_posts.py index 3114d4049..f2c70805a 100644 --- a/processors/metrics/count_posts.py +++ b/processors/metrics/count_posts.py @@ -20,6 +20,8 @@ class CountPosts(BasicProcessor): description = "Counts how many items are in the dataset (overall or per timeframe)." # description displayed in UI extension = "csv" # extension of result file, used internally and in UI + followups = ["histogram"] + options = { "timeframe": { "type": UserInput.OPTION_CHOICE, @@ -35,6 +37,15 @@ class CountPosts(BasicProcessor): } } + @staticmethod + def is_compatible_with(module=None, user=None): + """ + Determine compatibility + + :param Dataset module: Module ID to determine compatibility with + :return bool: + """ + return module.is_top_dataset() and module.get_extension() in ("csv", "ndjson") def process(self): """ diff --git a/processors/metrics/debate_metrics.py b/processors/metrics/debate_metrics.py index 80d413831..06309c090 100644 --- a/processors/metrics/debate_metrics.py +++ b/processors/metrics/debate_metrics.py @@ -30,6 +30,8 @@ class DebateMetrics(BasicProcessor): description = "Returns a csv with meta-metrics per thread." # description displayed in UI extension = "csv" # extension of result file, used internally and in UI + followups = [] + @classmethod def is_compatible_with(cls, module=None, user=None): """ diff --git a/processors/metrics/google_vision_api.py b/processors/metrics/google_vision_api.py index fc4e8290f..92630e611 100644 --- a/processors/metrics/google_vision_api.py +++ b/processors/metrics/google_vision_api.py @@ -34,6 +34,8 @@ class GoogleVisionAPIFetcher(BasicProcessor): "requests will be credited by Google to the owner of the API token you provide!"# description displayed in UI extension = "ndjson" # extension of result file, used internally and in UI + followups = ["convert-google-vision-to-csv", "vision-bipartite-network", "vision-label-network"] + references = [ "[Google Vision API Documentation](https://cloud.google.com/vision/docs)", "[Google Vision API Pricing & Free Usage Limits](https://cloud.google.com/vision/pricing)" @@ -46,7 +48,7 @@ def is_compatible_with(cls, module=None, user=None): :param module: Module to determine compatibility with """ - return module.type.startswith("image-downloader") or module.type == "video-frames" + return module.get_media_type() == "image" or module.type.startswith("image-downloader") or module.type == "video-frames" options = { "amount": { @@ -103,13 +105,13 @@ def process(self): max_images = convert_to_int(self.parameters.get("amount", 0), 100) total = self.source_dataset.num_rows if not max_images else min(max_images, self.source_dataset.num_rows) + processed = 0 done = 0 for image_file in self.iterate_archive_contents(self.source_file): if self.interrupted: raise ProcessorInterruptedException("Interrupted while fetching data from Google Vision API") - done += 1 self.dataset.update_status("Annotating image %i/%i" % (done, total)) self.dataset.update_progress(done / total) @@ -123,6 +125,7 @@ def process(self): # cannot continue fetching, e.g. when API key is invalid break + processed += 1 if not annotations: continue @@ -130,11 +133,12 @@ def process(self): with self.dataset.get_results_path().open("a", encoding="utf-8") as outfile: outfile.write(json.dumps(annotations) + "\n") + done += 1 if max_images and done >= max_images: break - self.dataset.update_status("Annotations retrieved for %i images" % done) + self.dataset.update_status("Annotations retrieved for %i images (%i processed in total)" % (done, processed), is_final=True) self.dataset.finish(done) def annotate_image(self, image_file, api_key, features): @@ -175,6 +179,7 @@ def annotate_image(self, image_file, api_key, features): elif api_request.status_code != 200: self.dataset.update_status("Got response code %i from Google Vision API for image %s, skipping" % (api_request.status_code, image_file.name)) + self.dataset.log(f"Code {api_request.status_code}; Text: {api_request.text}") return None try: diff --git a/processors/metrics/hatebase.py b/processors/metrics/hatebase.py index bd18c6150..2fb69f8ce 100644 --- a/processors/metrics/hatebase.py +++ b/processors/metrics/hatebase.py @@ -28,6 +28,8 @@ class HatebaseAnalyser(BasicProcessor): description = "Assign scores for 'offensiveness' and hate speech propability to each post by using Hatebase." # description displayed in UI extension = "csv" # extension of result file, used internally and in UI + followups = ["hatebase-frequencies"] + token_expires = 0 token = "" @@ -53,6 +55,16 @@ class HatebaseAnalyser(BasicProcessor): } } + @staticmethod + def is_compatible_with(module=None, user=None): + """ + Determine compatibility + + :param Dataset module: Module ID to determine compatibility with + :return bool: + """ + return module.is_top_dataset() and module.get_extension() in ("csv", "ndjson") + def process(self): """ This takes a 4CAT results file as input, and outputs a new CSV file diff --git a/processors/metrics/most_quoted.py b/processors/metrics/most_quoted.py index e0287635c..f0672330b 100644 --- a/processors/metrics/most_quoted.py +++ b/processors/metrics/most_quoted.py @@ -23,6 +23,8 @@ class QuoteRanker(BasicProcessor): description = "Sort posts by how often they were replied to by other posts in the dataset." # description displayed in UI extension = "csv" # extension of result file, used internally and in UI + followups = [] + @classmethod def is_compatible_with(cls, module=None, user=None): """ diff --git a/processors/metrics/overtime-hatebase.py b/processors/metrics/overtime-hatebase.py index f23d36aa2..48a7e9ce3 100644 --- a/processors/metrics/overtime-hatebase.py +++ b/processors/metrics/overtime-hatebase.py @@ -27,6 +27,8 @@ class OvertimeHatefulAnalysis(BasicProcessor): description = "Extracts offensiveness trends over-time. Offensiveness is measured as the amount of words listed on Hatebase that occur in the dataset. Also includes engagement metrics." # description displayed in UI extension = "csv" # extension of result file, used internally and in UI + followups = [] + references = [ "[Hatebase.org](https://hatebase.org)", "[Rogers, Richard. 2020. \"Deplatforming: Following extreme Internet celebrities to Telegram and alternative social media.\" European Journal of Culture, vol. 35, no . 3: 213-229.](https://journals.sagepub.com/doi/pdf/10.1177/0267323120922066)" diff --git a/processors/metrics/rank_attribute.py b/processors/metrics/rank_attribute.py index f4b9cb5cb..adffe824a 100644 --- a/processors/metrics/rank_attribute.py +++ b/processors/metrics/rank_attribute.py @@ -29,8 +29,12 @@ class AttributeRanker(BasicProcessor): description = "Count values in a dataset column, like URLs or hashtags (overall or per timeframe)" # description displayed in UI extension = "csv" # extension of result file, used internally and in UI + followups = [] + references = ["[regex010](https://regex101.com/)"] + include_missing_data = True + # the following determines the options available to the user via the 4CAT # interface. options = { @@ -94,6 +98,12 @@ class AttributeRanker(BasicProcessor): "default": True, "help": "Convert values to lowercase", "tooltip": "Merges values with varying cases" + }, + "count_missing": { + "type": UserInput.OPTION_TOGGLE, + "default": True, + "help": "Include missing data", + "tooltip": "Blank fields are counted as blank (i.e. \"\") and missing fields as \"missing_data\"" } } @@ -123,6 +133,7 @@ def process(self): cutoff = convert_to_int(self.parameters.get("top"), 15) weighby = self.parameters.get("weigh") to_lowercase = self.parameters.get("to-lowercase", True) + self.include_missing_data = self.parameters.get("count_missing") try: if self.parameters.get("filter"): @@ -141,6 +152,13 @@ def process(self): # and OrderedDict; all frequencies go into this variable items = OrderedDict() + # this is a placeholder function to map missing values to a placeholder + def missing_value_placeholder(data, field_name): + """ + Check if item is missing + """ + return "missing_data" + # if we're interested in overall top-ranking items rather than a # per-period ranking, we need to do a first pass in which all posts are # inspected to determine those overall top-scoring items @@ -150,7 +168,7 @@ def process(self): self.dataset.update_status(f"Determining overall top-{cutoff} items") else: self.dataset.update_status("Determining overall top items") - for post in self.source_dataset.iterate_items(self): + for post in self.source_dataset.iterate_items(self, map_missing=missing_value_placeholder if self.include_missing_data else "default"): values = self.get_values(post, columns, filter, split_comma, extract) for value in values: if to_lowercase: @@ -166,7 +184,7 @@ def process(self): # now for the real deal self.dataset.update_status("Reading source file") - for post in self.source_dataset.iterate_items(self): + for post in self.source_dataset.iterate_items(self, map_missing=missing_value_placeholder if self.include_missing_data else "default"): # determine where to put this data try: time_unit = get_interval_descriptor(post, timeframe) @@ -243,9 +261,9 @@ def get_values(self, post, attributes, filter, split_comma, extract): values = [] for attribute in attributes: if split_comma: - item_values = [v.strip() for v in str(post.get(attribute, "")).split(",") if v.strip()] + item_values = [v.strip() for v in str(post.get(attribute, "")).split(",") if v.strip() or self.include_missing_data] else: - item_values = [post.get(attribute, "")] if post.get(attribute, "") else [] + item_values = [post.get(attribute, "")] if post.get(attribute, "") or self.include_missing_data else [] if extract: item_values = list(chain(*[self.extract(v, extract) for v in item_values])) diff --git a/processors/metrics/thread_metadata.py b/processors/metrics/thread_metadata.py index 718dff897..005c1087a 100644 --- a/processors/metrics/thread_metadata.py +++ b/processors/metrics/thread_metadata.py @@ -23,6 +23,18 @@ class ThreadMetadata(BasicProcessor): "that this extracted only on the basis of the items present this dataset." # description displayed in UI extension = "csv" # extension of result file, used internally and in UI + followups = [] + + @staticmethod + def is_compatible_with(module=None, user=None): + """ + Determine compatibility + + :param Dataset module: Module ID to determine compatibility with + :return bool: + """ + return module.is_top_dataset() and module.get_extension() in ("csv", "ndjson") + def process(self): """ This takes a 4CAT results file as input, and outputs a new CSV file diff --git a/processors/metrics/top_hatebase.py b/processors/metrics/top_hatebase.py index 3f542cbf0..eaba31693 100644 --- a/processors/metrics/top_hatebase.py +++ b/processors/metrics/top_hatebase.py @@ -26,6 +26,8 @@ class HatebaseRanker(BasicProcessor): description = "Count frequencies for hateful words and phrases found in the dataset and rank the results (overall or per timeframe)." # description displayed in UI extension = "csv" # extension of result file, used internally and in UI + followups = [] + @classmethod def is_compatible_with(cls, module=None, user=None): """ diff --git a/processors/metrics/top_images.py b/processors/metrics/top_images.py index 4168bffae..0f1c619f1 100644 --- a/processors/metrics/top_images.py +++ b/processors/metrics/top_images.py @@ -29,6 +29,8 @@ class TopImageCounter(BasicProcessor): description = "Collect all image URLs and sort by most-occurring." # description displayed in UI extension = "csv" # extension of result file, used internally and in UI + followups = ["image-downloader"] + @classmethod def is_compatible_with(cls, module=None, user=None): """ @@ -37,10 +39,7 @@ def is_compatible_with(cls, module=None, user=None): :param module: Module to determine compatibility with """ - if module.is_top_dataset() and module.type != "telegram-search": - return True - else: - return False + return module.is_top_dataset() and module.type != "telegram-search" and module.get_extension() in ("csv", "ndjson") def process(self): """ diff --git a/processors/metrics/url_titles.py b/processors/metrics/url_titles.py index 5f157de67..e32e3538d 100644 --- a/processors/metrics/url_titles.py +++ b/processors/metrics/url_titles.py @@ -35,6 +35,8 @@ class URLFetcher(BasicProcessor): "each URL, optionally following HTTP redirects.") # description displayed in UI extension = "csv" # extension of result file, used internally and in UI + followups = [] + options = { "columns": { "type": UserInput.OPTION_TEXT, @@ -81,6 +83,16 @@ class URLFetcher(BasicProcessor): } } + @staticmethod + def is_compatible_with(module=None, user=None): + """ + Determine compatibility + + :param Dataset module: Module ID to determine compatibility with + :return bool: + """ + return module.is_top_dataset() and module.get_extension() in ("csv", "ndjson") + @classmethod def get_options(cls, parent_dataset=None, user=None): """ diff --git a/processors/metrics/vocabulary_overtime.py b/processors/metrics/vocabulary_overtime.py index b0056dac5..9db239873 100644 --- a/processors/metrics/vocabulary_overtime.py +++ b/processors/metrics/vocabulary_overtime.py @@ -23,6 +23,8 @@ class OvertimeAnalysis(BasicProcessor): description = "Determines the counts over time of particular set of words or phrases." # description displayed in UI extension = "csv" # extension of result file, used internally and in UI + followups = [] + references = [ "[Hatebase.org](https://hatebase.org)" "[\"Salvaging the Internet Hate Machine: Using the discourse of radical online subcultures to identify emergent extreme speech\" - Unblished paper detailing the OILab extreme speech lexigon](https://oilab.eu/texts/4CAT_Hate_Speech_WebSci_paper.pdf)", @@ -73,6 +75,16 @@ class OvertimeAnalysis(BasicProcessor): } } + @staticmethod + def is_compatible_with(module=None, user=None): + """ + Determine compatibility + + :param Dataset module: Module ID to determine compatibility with + :return bool: + """ + return module.is_top_dataset() and module.get_extension() in ("csv", "ndjson") + def process(self): """ Reads a CSV file, counts occurences of chosen values over all posts, diff --git a/processors/metrics/youtube_metadata.py b/processors/metrics/youtube_metadata.py index ebb3055f7..7ad8fabe3 100644 --- a/processors/metrics/youtube_metadata.py +++ b/processors/metrics/youtube_metadata.py @@ -35,6 +35,8 @@ class YouTubeMetadata(BasicProcessor): description = "Extract information from YouTube videos and channels linked-to in the dataset" # description displayed in UI extension = "csv" # extension of result file, used internally and in UI + followups = ["youtube-thumbnails"] + max_retries = 3 sleep_time = 20 @@ -73,7 +75,7 @@ def is_compatible_with(cls, module=None, user=None): :param module: Module to determine compatibility with """ # Compatible with every top-level dataset. - return module.is_top_dataset() + return module.is_top_dataset() and module.get_extension() in ("csv", "ndjson") def process(self): """ diff --git a/processors/networks/colink_urls.py b/processors/networks/colink_urls.py index cb2e9c81c..46fca2567 100644 --- a/processors/networks/colink_urls.py +++ b/processors/networks/colink_urls.py @@ -51,6 +51,15 @@ class URLCoLinker(BasicProcessor): } } + @classmethod + def is_compatible_with(cls, module=None, user=None): + """ + Allow processor on top datasets. + + :param module: Module to determine compatibility with + """ + return module.is_top_dataset() and module.get_extension() in ("csv", "ndjson") + def process(self): """ This takes a 4CAT results file as input, and outputs a new CSV file diff --git a/processors/networks/google_vision_bipartite_network.py b/processors/networks/google_vision_bipartite_network.py index b6c4df361..dbc482850 100644 --- a/processors/networks/google_vision_bipartite_network.py +++ b/processors/networks/google_vision_bipartite_network.py @@ -73,6 +73,10 @@ def process(self): except ValueError: min_confidence = 0 + if self.source_dataset.num_rows == 0 or not self.source_dataset.get_results_path().exists(): + self.dataset.finish_with_error(f"No results found from Google Vision API. Check Google Vision results and logs.") + return + for annotations in self.source_dataset.iterate_items(self): file_annotations = [] if "error" in annotations: diff --git a/processors/networks/google_vision_network.py b/processors/networks/google_vision_network.py index b32a74c53..0f45e3148 100644 --- a/processors/networks/google_vision_network.py +++ b/processors/networks/google_vision_network.py @@ -72,6 +72,10 @@ def process(self): except ValueError: min_confidence = 0 + if self.source_dataset.num_rows == 0 or not self.source_dataset.get_results_path().exists(): + self.dataset.finish_with_error(f"No results found from Google Vision API. Check Google Vision results and logs.") + return + for annotations in self.source_dataset.iterate_items(self): file_annotations = {} diff --git a/processors/networks/wikipedia_network.py b/processors/networks/wikipedia_network.py index 345bfe2d9..00e141fc7 100644 --- a/processors/networks/wikipedia_network.py +++ b/processors/networks/wikipedia_network.py @@ -26,6 +26,15 @@ class WikiURLCoLinker(BasicProcessor): description = "Create a GEXF network file comprised network comprised of linked-to Wikipedia pages, linked to the categories they are part of. English Wikipedia only. Will only fetch the first 10,000 links." # description displayed in UI extension = "gexf" # extension of result file, used internally and in UI + @classmethod + def is_compatible_with(cls, module=None, user=None): + """ + Allow processor on top datasets. + + :param module: Module to determine compatibility with + """ + return module.is_top_dataset() and module.get_extension() in ("csv", "ndjson") + def process(self): """ This takes a 4CAT results file as input, and outputs a new CSV file diff --git a/processors/presets/annotate-images.py b/processors/presets/annotate-images.py index cf64ac2a3..7e9164e57 100644 --- a/processors/presets/annotate-images.py +++ b/processors/presets/annotate-images.py @@ -56,6 +56,16 @@ class AnnotateImages(ProcessorPreset): } } + @staticmethod + def is_compatible_with(module=None, user=None): + """ + Determine compatibility + + :param Dataset module: Module ID to determine compatibility with + :return bool: + """ + return module.is_top_dataset() and module.get_extension() in ("csv", "ndjson") + def get_processor_pipeline(self): """ This queues a series of post-processors to annotate images diff --git a/processors/presets/monthly-histogram.py b/processors/presets/monthly-histogram.py index a45ea321d..696fc59a2 100644 --- a/processors/presets/monthly-histogram.py +++ b/processors/presets/monthly-histogram.py @@ -14,6 +14,18 @@ class MonthlyHistogramCreator(ProcessorPreset): description = "Generates a histogram with the number of items per month." # description displayed in UI extension = "svg" + @staticmethod + def is_compatible_with(module=None, user=None): + """ + Determine compatibility + + This preset is compatible with any module that has countable items (via count-posts) + + :param Dataset module: Module ID to determine compatibility with + :return bool: + """ + return module.is_top_dataset() and module.get_extension() in ("csv", "ndjson") + def get_processor_pipeline(self): """ This queues a series of post-processors to visualise over-time diff --git a/processors/presets/neologisms.py b/processors/presets/neologisms.py index 2c106152c..67abefe05 100644 --- a/processors/presets/neologisms.py +++ b/processors/presets/neologisms.py @@ -19,6 +19,18 @@ class NeologismExtractor(ProcessorPreset): references = ["Van Soest, Jeroen. 2019. 'Language Innovation Tracker: Detecting language innovation in online discussion fora.' (MA thesis), Beuls, K. (Promotor), Van Eecke, P. (Advisor).'"] + @staticmethod + def is_compatible_with(module=None, user=None): + """ + Determine compatibility + + This preset is compatible with any dataset that has columns + + :param Dataset module: Module ID to determine compatibility with + :return bool: + """ + return module.is_top_dataset() and module.get_extension() in ("csv", "ndjson") + @classmethod def get_options(cls, parent_dataset=None, user=None): """ diff --git a/processors/presets/similar-words.py b/processors/presets/similar-words.py index e1f434553..eed653234 100644 --- a/processors/presets/similar-words.py +++ b/processors/presets/similar-words.py @@ -38,6 +38,18 @@ class SimilarWords(ProcessorPreset): } } + @staticmethod + def is_compatible_with(module=None, user=None): + """ + Determine compatibility + + This preset is compatible with any module that has a "body" column + + :param Dataset module: Module ID to determine compatibility with + :return bool: + """ + return module.is_top_dataset() and module.get_extension() in ("csv", "ndjson") + def get_processor_pipeline(self): """ This queues a series of post-processors to calculate word similarities diff --git a/processors/presets/top-hashtags.py b/processors/presets/top-hashtags.py index 6378b40e8..f6ac6e0e6 100644 --- a/processors/presets/top-hashtags.py +++ b/processors/presets/top-hashtags.py @@ -41,7 +41,7 @@ def is_compatible_with(cls, module=None, user=None): :return bool: """ columns = module.get_columns() - return columns and "hashtags" in module.get_columns() + return columns and "hashtags" in columns def get_processor_pipeline(self): """ diff --git a/processors/presets/video-scene-timelines.py b/processors/presets/video-scene-timelines.py index 56f9bbf29..dbb39d4cb 100644 --- a/processors/presets/video-scene-timelines.py +++ b/processors/presets/video-scene-timelines.py @@ -27,10 +27,10 @@ def is_compatible_with(cls, module=None, user=None): Compatible with downloaded videos, and not really anything else! Additionally ffmpeg needs to be available. - :param str module: Module ID to determine compatibility with + :param DataSet module: Module ID to determine compatibility with :return bool: """ - return module.type.startswith("video-downloader") and \ + return (module.get_media_type() == "video" or module.type.startswith("video-downloader")) and \ config.get("video-downloader.ffmpeg_path", user=user) and \ shutil.which(config.get("video-downloader.ffmpeg_path")) diff --git a/processors/text-analysis/collocations.py b/processors/text-analysis/collocations.py index cf9f34aec..fb37c1753 100644 --- a/processors/text-analysis/collocations.py +++ b/processors/text-analysis/collocations.py @@ -22,6 +22,8 @@ class GetCollocations(BasicProcessor): description = "Extracts words appearing close to each other from a set of tokens." # description displayed in UI extension = "csv" # extension of result file, used internally and in UI + followups = ["preset-coword-network", "wordcloud"] + @classmethod def is_compatible_with(cls, module=None, user=None): """ diff --git a/processors/text-analysis/documents_per_topic.py b/processors/text-analysis/documents_per_topic.py index 2b901a631..3922fb416 100644 --- a/processors/text-analysis/documents_per_topic.py +++ b/processors/text-analysis/documents_per_topic.py @@ -24,6 +24,8 @@ class TopicModelWordExtractor(BasicProcessor): description = "Uses the LDA model to predict to which topic each item or sentence belongs and counts as belonging to whichever topic has the highest probability." # description displayed in UI extension = "csv" # extension of result file, used internally and in UI + followups = [] + @classmethod def is_compatible_with(cls, module=None, user=None): """ diff --git a/processors/text-analysis/generate_embeddings.py b/processors/text-analysis/generate_embeddings.py index 365bcc948..075d9fdc5 100644 --- a/processors/text-analysis/generate_embeddings.py +++ b/processors/text-analysis/generate_embeddings.py @@ -33,6 +33,8 @@ class GenerateWordEmbeddings(BasicProcessor): "Note that good models require a lot of data." # description displayed in UI extension = "zip" # extension of result file, used internally and in UI + followups = ["similar-word2vec", "histwords-vectspace"] + references = [ "Word2Vec: [Mikolov, Tomas, Ilya Sutskever, Kai Chen, Greg Corrado, and Jeffrey Dean. 2013. “Distributed Representations of Words and Phrases and Their Compositionality.” 8Advances in Neural Information Processing Systems*, 2013: 3111-3119.](https://papers.nips.cc/paper/5021-distributed-representations-of-words-and-phrases-and-their-compositionality.pdf)", "Word2Vec: [Mikolov, Tomas, Kai Chen, Greg Corrado, and Jeffrey Dean. 2013. “Efficient Estimation of Word Representations in Vector Space.” *ICLR Workshop Papers*, 2013: 1-12.](https://arxiv.org/pdf/1301.3781.pdf)", diff --git a/processors/text-analysis/get_entities.py b/processors/text-analysis/get_entities.py index 3b4c2d624..e639c7672 100644 --- a/processors/text-analysis/get_entities.py +++ b/processors/text-analysis/get_entities.py @@ -28,6 +28,8 @@ class ExtractNouns(BasicProcessor): # TEMPORARILY DISABLED "\"Named Entity Recognition\" in the previous module." # description displayed in UI extension = "csv" # extension of result file, used internally and in UI + followups = ["wordcloud"] + options = { "entities": { "type": UserInput.OPTION_MULTI, diff --git a/processors/text-analysis/get_nouns.py b/processors/text-analysis/get_nouns.py index 252200610..cad8653eb 100644 --- a/processors/text-analysis/get_nouns.py +++ b/processors/text-analysis/get_nouns.py @@ -30,6 +30,8 @@ class ExtractNouns(BasicProcessor): references = ["[Information on noun chunks](https://spacy.io/usage/linguistic-features#noun-chunks)"] + followups = ["wordcloud"] + options = { "type": { "type": UserInput.OPTION_CHOICE, diff --git a/processors/text-analysis/linguistic_extractor.py b/processors/text-analysis/linguistic_extractor.py index e5067b484..92357853a 100644 --- a/processors/text-analysis/linguistic_extractor.py +++ b/processors/text-analysis/linguistic_extractor.py @@ -35,6 +35,8 @@ class LinguisticFeatures(BasicProcessor): "with less than 100,000 items. " # description displayed in UI extension = "zip" # extension of result file, used internally and in UI + followups = ["get-entities", "extract-nouns"] + references = [ "[SpaCy Linguistic Features - Documentation](https://spacy.io/usage/linguistic-features/)" ] @@ -52,6 +54,13 @@ class LinguisticFeatures(BasicProcessor): } } + @classmethod + def is_compatible_with(cls, module=None, user=None): + """ + Allow CSV and NDJSON datasets + """ + return module.is_top_dataset() and module.get_extension() in ("csv", "ndjson") + def process(self): """ Reads text and outputs entities per text body. diff --git a/processors/text-analysis/post_topic_matrix.py b/processors/text-analysis/post_topic_matrix.py index 90818b3d6..ab32b8dcd 100644 --- a/processors/text-analysis/post_topic_matrix.py +++ b/processors/text-analysis/post_topic_matrix.py @@ -26,6 +26,8 @@ class TopicModelWordExtractor(BasicProcessor): description = "Uses the LDA model to predict to which topic each item or sentence belongs and creates a CSV file showing this information. Each line represents one 'document'; if tokens are grouped per 'item' and only one column is used (e.g. only the 'body' column), there is one row per post/item, otherwise a post may be represented by multiple rows (for each sentence and/or column used)." # description displayed in UI extension = "csv" # extension of result file, used internally and in UI + followups = [] + options = { "include_top_features": { "type": UserInput.OPTION_TOGGLE, diff --git a/processors/text-analysis/similar_words.py b/processors/text-analysis/similar_words.py index 48ee34f0e..0bef53b97 100644 --- a/processors/text-analysis/similar_words.py +++ b/processors/text-analysis/similar_words.py @@ -25,6 +25,9 @@ class SimilarWord2VecWords(BasicProcessor): description = "Uses a Word2Vec model to find words used in a similar context" # description displayed in UI extension = "csv" # extension of result file, used internally and in UI + + followups = ["wordcloud"] + flawless = True options = { diff --git a/processors/text-analysis/split_sentences.py b/processors/text-analysis/split_sentences.py index 35f2e117a..c5cce2477 100644 --- a/processors/text-analysis/split_sentences.py +++ b/processors/text-analysis/split_sentences.py @@ -22,6 +22,8 @@ class SplitSentences(BasicProcessor): description = "Split a body of posts into discrete sentences. Output file has one row per sentence, containing the sentence and post ID." # description displayed in UI extension = "csv" # extension of result file, used internally and in UI + followups = [] + @classmethod def get_options(cls, parent_dataset=None, user=None): """ diff --git a/processors/text-analysis/tf_idf.py b/processors/text-analysis/tf_idf.py index 833f33587..2dea96cdc 100644 --- a/processors/text-analysis/tf_idf.py +++ b/processors/text-analysis/tf_idf.py @@ -31,6 +31,8 @@ class TfIdf(BasicProcessor): description = "Get the tf-idf values of tokenised text. Works better with more documents (e.g. time-separated)." # description displayed in UI extension = "csv" # extension of result file, used internally and in UI + followups = ["wordcloud"] + options = { "library": { "type": UserInput.OPTION_CHOICE, diff --git a/processors/text-analysis/tokenise.py b/processors/text-analysis/tokenise.py index 588ab05f2..ad9197033 100644 --- a/processors/text-analysis/tokenise.py +++ b/processors/text-analysis/tokenise.py @@ -2,6 +2,7 @@ Tokenize post bodies """ import ahocorasick +import razdel import string import jieba import json @@ -12,6 +13,7 @@ from nltk.stem.snowball import SnowballStemmer from nltk.stem import WordNetLemmatizer from nltk.tokenize import word_tokenize, TweetTokenizer, sent_tokenize +from razdel.substring import Substring from common.lib.helpers import UserInput, get_interval_descriptor from backend.lib.processor import BasicProcessor @@ -34,6 +36,8 @@ class Tokenise(BasicProcessor): "tokens per sentence)." # description displayed in UI extension = "zip" # extension of result file, used internally and in UI + followups = ["collocations", "vectorise-tokens", "generate-embeddings", "tfidf", "topic-modeller",] + references = [ "[NLTK tokenizer documentation](https://www.nltk.org/api/nltk.tokenize.html)", "[Different types of tokenizers in NLTK](https://chendianblog.wordpress.com/2016/11/25/different-types-of-tokenizers-in-nltk/)", @@ -66,6 +70,9 @@ def get_options(cls, parent_dataset=None, user=None): case they are requested for display in the 4CAT web interface. This can be used to show some options only to privileges users. """ + with config.get("PATH_ROOT").joinpath("common/assets/stopwords-languages.json").open() as infile: + stopwords = json.load(infile) + options = { "columns": { "type": UserInput.OPTION_MULTI, @@ -76,14 +83,29 @@ def get_options(cls, parent_dataset=None, user=None): "type": UserInput.OPTION_CHOICE, "default": "all", "options": {"all": "Overall", "year": "Year", "month": "Month", "week": "Week", "day": "Day", "thread": "Thread"}, - "help": "Produce documents per" + "help": "Produce token sets per", + "tooltip": "This determines the periodisation of follow-up analyses; e.g. if you want to produce topic " + "models per month as the next step, you need to choose 'Month' here." + }, + "language": { + "type": UserInput.OPTION_CHOICE, + "options": { + **{language: language[0].upper() + language[1:] for language in SnowballStemmer.languages}, + "other": "Other (stemming, lemmatizing and sentence splitting will most likely not produce " + "accurate results)" + }, + "default": "english", + "help": "Language", + "tooltip": "This affects stemming, tokenisation, stopword filtering, and sentence splitting, unless " + "overridden via the options below" }, "tokenizer_type": { "type": UserInput.OPTION_CHOICE, "default": "twitter", "options": { - "twitter": "nltk TweetTokenizer", - "regular": "nltk word_tokenize", + "twitter": "nltk TweetTokenizer (use general language setting, optimised for social media)", + "regular": "nltk word_tokenize (use general language setting)", + "razdel": "razdel (for Russian text)", "jieba-cut": "jieba (for Chinese text; accurate mode)", "jieba-cut-all": "jieba (for Chinese text; full mode)", "jieba-search": "jieba (for Chinese text; search engine suggestion style)", @@ -91,16 +113,6 @@ def get_options(cls, parent_dataset=None, user=None): "help": "Tokeniser", "tooltip": "TweetTokenizer is recommended for social media content, as it is optimised for informal language." }, - "language": { - "type": UserInput.OPTION_CHOICE, - "options": { - **{language: language[0].upper() + language[1:] for language in SnowballStemmer.languages}, - "other": "Other (language-specific options such as stemming, lemmatizing and sentence splitting will " - "have no effect)" - }, - "default": "english", - "help": "Language" - }, "grouping-per": { "type": UserInput.OPTION_CHOICE, "default": "item", @@ -109,59 +121,63 @@ def get_options(cls, parent_dataset=None, user=None): "item": "Item", "sentence": "Sentence in item" }, - "tooltip": "This is relevant for some processors such as Word2Vec and Tf-idf. If you don't know what to choose, choose 'item'." + "tooltip": "This is relevant for some processors such as Word2Vec and Tf-idf. If you don't know what " + "to choose, choose 'item'." }, "stem": { "type": UserInput.OPTION_TOGGLE, "default": False, "help": "Stem tokens (with SnowballStemmer)", - "tooltip": "Stemming removes suffixes from words: 'running' becomes 'runn', 'bicycles' becomes 'bicycl', etc.", + "tooltip": "Stemming removes suffixes from words: 'running' becomes 'runn', 'bicycles' becomes " + "'bicycl', etc.", "requires": "language!=other" }, "lemmatise": { "type": UserInput.OPTION_TOGGLE, "default": False, "help": "Lemmatise tokens (English only)", - "tooltip": "Lemmatisation replaces variations of a word with its root form: 'running' becomes 'run', 'bicycles' " \ - " becomes 'bicycle', 'better' becomes 'good'.", + "tooltip": "Lemmatisation replaces variations of a word with its root form: 'running' becomes 'run', " + "'bicycles' becomes 'bicycle', 'better' becomes 'good'.", "requires": "language==english" }, + "filter": { + "type": UserInput.OPTION_MULTI_SELECT, + "default": ["copy-language"], + "options": { + "copy-language": "Stop words for language chosen above", + **{ + f"stopwords-iso-{code}": f"{language} stop words (stopwords-iso)" + for code, language in stopwords.items() + }, + "wordlist-googlebooks-english": "English word list (Google One Million Books pre-2008 top " + "unigrams)", + "wordlist-cracklib-english": "English word list (cracklib, originally used for password checks. " + "Warning: computationally heavy)", + "wordlist-opentaal-dutch": "Dutch word list (OpenTaal)" + }, + "help": "Tokens to exclude", + "tooltip": "See the references for information on the word lists' provenance. It is highly recommended " + "to exclude stop words. Choosing more word lists increases processing time." + }, "accept_words": { "type": UserInput.OPTION_TEXT, "default": "", - "help": "Always allow these words", - "tooltip": "These won't be deleted as stop words. Also won't be stemmed or lemmatised. Separate with commas." + "help": "Always allow these tokens", + "tooltip": "These won't be deleted as stop words and will never be stemmed or lemmatised. Separate " + "with commas." }, "reject_words": { "type": UserInput.OPTION_TEXT, "default": "", - "help": "Always delete these words", - "tooltip": "These will be deleted from the corpus. Also won't be stemmed or lemmatised. Separate with commas." - }, - "filter": { - "type": UserInput.OPTION_MULTI, - "default": [], - "options": { - #"stopwords-terrier-english": "English stopwords (terrier, recommended)", - "stopwords-iso-english": "English stopwords (stopwords-iso, recommended)", - "stopwords-iso-dutch": "Dutch stopwords (stopwords-iso)", - "stopwords-iso-zh": "Chinese stopwords (stopwords-iso)", - "stopwords-iso-all": "Stopwords for many languages (including Dutch/English, stopwords-iso)", - #"wordlist-infochimps-english": "English word list (infochimps)", - "wordlist-googlebooks-english": "English word list (Google One Million Books pre-2008 top unigrams, recommended)", - "wordlist-cracklib-english": "English word list (cracklib, originally used for password checks. Warning: computationally heavy)", - "wordlist-opentaal-dutch": "Dutch word list (OpenTaal)", - #"wordlist-unknown-dutch": "Dutch word list (unknown origin, larger than OpenTaal)" - }, - "help": "Word lists to exclude", - "tooltip": "See the references for information per word list. It is highly recommended to exclude stop words. " \ - "Choosing more word lists increases processing time." + "help": "Always delete these tokens", + "tooltip": "These will be ignored and excluded from the corpus. Separate with commas." }, "only_unique": { "type": UserInput.OPTION_TOGGLE, "default": False, - "help": "Only keep unique words per item", - "tooltip": "Can be useful to filter out spam." + "help": "Only keep unique tokens per item", + "tooltip": "If a token occurs multiple times in the same item, only process once. Can be useful to " + "filter out spam." } } @@ -222,6 +238,10 @@ def process(self): symbol = re.compile(r"[" + re.escape(string.punctuation) + "’‘“”" + "]") numbers = re.compile(r"\b[0-9]+\b") + # load general stopwords dictionary + with config.get("PATH_ROOT").joinpath("common/assets/stopwords-iso.json").open() as infile: + stopwords_iso = json.load(infile) + # Twitter tokenizer if indicated language = self.parameters.get("language", "english") if self.parameters.get("tokenizer_type") == "jieba-cut": @@ -233,15 +253,48 @@ def process(self): elif self.parameters.get("tokenizer_type") == "jieba-search": tokenizer = jieba.cut_for_search tokenizer_args = {} + elif self.parameters.get("tokenizer_type") == "razdel": + tokenizer = razdel.tokenize + tokenizer_args = {} + elif self.parameters.get("tokenizer_type") == "twitter": + tokenizer = TweetTokenizer(preserve_case=False).tokenize + tokenizer_args = {} else: - tokenizer = TweetTokenizer(preserve_case=False).tokenize if self.parameters.get("tokenizer_type") == "twitter" else word_tokenize - tokenizer_args = {} if self.parameters.get("tokenizer_type") == "twitter" else {"language": language} + tokenizer = word_tokenize + tokenizer_args = {"language": language} if language != "other" else {} # load word filters - words to exclude from tokenisation word_filter = set() for wordlist in self.parameters.get("filter", []): - with config.get('PATH_ROOT').joinpath(f"common/assets/wordlists/{wordlist}.txt").open(encoding="utf-8") as input: - word_filter = set.union(word_filter, input.read().splitlines()) + if wordlist == "copy-language" and language != "other": + # use stopwords-iso list for chosen language + copy_language = { + "arabic": "ar", + "danish": "dk", + "dutch": "nl", + "english": "en", + "finnish": "fi", + "french": "fr", + "german": "de", + "hungarian": "hu", + "italian": "it", + "norwegian": "no", + "porter": "pt", + "portugese": "pt", + "romanian": "ro", + "russian": "ru", + "spanish": "es", + "swedish": "sv", + }.get(language, "en") + wordlist = f"stopwords-iso-{copy_language}" + + if wordlist.startswith("stopwords-iso"): + word_filter = set.union(word_filter, stopwords_iso[wordlist.replace("stopwords-iso-", "")]) + else: + wordlist_path = config.get("PATH_ROOT").joinpath(f"common/assets/wordlists/{wordlist}.txt") + if wordlist_path.exists(): + with wordlist_path.open(encoding="utf-8") as input: + word_filter = set.union(word_filter, input.read().splitlines()) # Extend or limit the word filter with optionally added words # Remove accepted words from filter @@ -297,7 +350,11 @@ def dummy_function(x, *args, **kwargs): # if told so, first split the post into separate sentences if grouping == "sentence": - if language not in [lang.split('.')[0] for lang in os.listdir(nltk.data.find('tokenizers/punkt')) if + if language == "Russian": + # for russian we use a special purpose splitter with better + # performance + sentence_method = razdel.sentenize + elif language not in [lang.split('.')[0] for lang in os.listdir(nltk.data.find('tokenizers/punkt')) if 'pickle' in lang]: self.dataset.update_status( f"Language {language} not available for sentence tokenizer; grouping by item/post instead.") @@ -343,7 +400,7 @@ def dummy_function(x, *args, **kwargs): self.dataset.update_status(0) return - value = [v for v in sentence_method(post[column], language) if v is not None] + value = [Tokenise.normalise_segment(v) for v in sentence_method(post[column], language) if v is not None] if value: groupings.extend(value) @@ -363,6 +420,8 @@ def dummy_function(x, *args, **kwargs): # stem, lemmatise and save tokens that are not in filter for token in tokens: + token = Tokenise.normalise_segment(token) + token = token.lower() token = numbers.sub("", symbol.sub("", token)) @@ -430,3 +489,19 @@ def dummy_function(x, *args, **kwargs): # create zip of archive and delete temporary files and folder self.write_archive_and_finish(staging_area) + + @staticmethod + def normalise_segment(segment): + """ + Cast token or sentence to string + + Various tokenisers and splitters return tokens/segments in different + ways; this method ensures we always end up with a string. + + :param segment: Segment to cast to string + :return str: + """ + if type(segment) is Substring: + return segment.text + else: + return str(segment) \ No newline at end of file diff --git a/processors/text-analysis/top_vectors.py b/processors/text-analysis/top_vectors.py index 9438e70e9..420129cbb 100644 --- a/processors/text-analysis/top_vectors.py +++ b/processors/text-analysis/top_vectors.py @@ -24,6 +24,8 @@ class VectorRanker(BasicProcessor): "Limited to 100 most-used tokens." # description displayed in UI extension = "csv" # extension of result file, used internally and in UI + followups = ["wordcloud"] + options = { "top": { "type": UserInput.OPTION_TEXT, diff --git a/processors/text-analysis/topic_modeling.py b/processors/text-analysis/topic_modeling.py index 4067d8144..fded4460e 100644 --- a/processors/text-analysis/topic_modeling.py +++ b/processors/text-analysis/topic_modeling.py @@ -30,6 +30,8 @@ class TopicModeler(BasicProcessor): "which can be used to find clusters of related words." # description displayed in UI extension = "zip" # extension of result file, used internally and in UI + followups = ["document_count", "document_topic_matrix", "topic-model-words"] + options = { "vectoriser": { "type": UserInput.OPTION_CHOICE, diff --git a/processors/text-analysis/topic_words.py b/processors/text-analysis/topic_words.py index 729845899..f84199861 100644 --- a/processors/text-analysis/topic_words.py +++ b/processors/text-analysis/topic_words.py @@ -24,6 +24,8 @@ class TopicModelWordExtractor(BasicProcessor): description = "Creates a CSV file with the top tokens (words) per topic in the generated topic model, and their associated weights." # description displayed in UI extension = "csv" # extension of result file, used internally and in UI + followups = ["wordcloud"] + options = { "topic_size": { "type": UserInput.OPTION_TEXT, diff --git a/processors/text-analysis/vectorise.py b/processors/text-analysis/vectorise.py index 9582b74e7..36d666613 100644 --- a/processors/text-analysis/vectorise.py +++ b/processors/text-analysis/vectorise.py @@ -23,6 +23,8 @@ class Vectorise(BasicProcessor): "This is also known as a bag of words." # description displayed in UI extension = "zip" # extension of result file, used internally and in UI + followups = ["vector-ranker"] + @classmethod def is_compatible_with(cls, module=None, user=None): """ diff --git a/processors/visualisation/download-telegram-images.py b/processors/visualisation/download-telegram-images.py index 813bcc219..99ff5199b 100644 --- a/processors/visualisation/download-telegram-images.py +++ b/processors/visualisation/download-telegram-images.py @@ -15,6 +15,7 @@ from common.lib.exceptions import ProcessorInterruptedException from common.lib.helpers import UserInput from common.lib.dataset import DataSet +from processors.visualisation.download_images import ImageDownloader __author__ = "Stijn Peeters" __credits__ = ["Stijn Peeters"] @@ -35,8 +36,11 @@ class TelegramImageDownloader(BasicProcessor): "Note that not always all images can be retrieved. A JSON metadata file is included in the output " \ "archive." # description displayed in UI extension = "zip" # extension of result file, used internally and in UI + media_type = "image" # media type of the result flawless = True + followups = ImageDownloader.followups + config = { "image-downloader-telegram.max": { 'type': UserInput.OPTION_TEXT, diff --git a/processors/visualisation/download-telegram-videos.py b/processors/visualisation/download-telegram-videos.py index 3e6de2233..ef6d44231 100644 --- a/processors/visualisation/download-telegram-videos.py +++ b/processors/visualisation/download-telegram-videos.py @@ -12,6 +12,7 @@ from common.config_manager import config from backend.lib.processor import BasicProcessor from common.lib.exceptions import ProcessorInterruptedException +from processors.visualisation.download_videos import VideoDownloaderPlus from common.lib.helpers import UserInput from common.lib.dataset import DataSet @@ -34,8 +35,11 @@ class TelegramVideoDownloader(BasicProcessor): "Note that not always all videos can be retrieved. A JSON metadata file is included in the output " \ "archive." # description displayed in UI extension = "zip" # extension of result file, used internally and in UI + media_type = "video" # media type of the result flawless = True + followups = VideoDownloaderPlus.followups + config = { "video-downloader-telegram.max_videos": { "type": UserInput.OPTION_TEXT, diff --git a/processors/visualisation/download_images.py b/processors/visualisation/download_images.py index e325ec1dd..c13fd0fca 100644 --- a/processors/visualisation/download_images.py +++ b/processors/visualisation/download_images.py @@ -40,6 +40,9 @@ class ImageDownloader(BasicProcessor): "image is saved. For animations (GIFs), only the first frame is saved if available. A JSON metadata file " \ "is included in the output archive. \n4chan datasets should include the image_md5 column." # description displayed in UI extension = "zip" # extension of result file, used internally and in UI + media_type = "image" # media type of the dataset + + followups = ["image-wall", "image-category-wall", "pix-plot", "image-to-categories", "image-captions", "text-from-images", "metadata-viewer", "clarifai-api", "google-vision-api"] options = { "amount": { @@ -126,7 +129,8 @@ def is_compatible_with(cls, module=None, user=None): :param module: Dataset or processor to determine compatibility with """ return (module.type == "top-images" or module.is_from_collector()) \ - and module.type not in ["tiktok-search", "tiktok-urls-search", "telegram-search"] + and module.type not in ["tiktok-search", "tiktok-urls-search", "telegram-search"] \ + and module.get_extension() in ("csv", "ndjson") def process(self): """ @@ -134,7 +138,6 @@ def process(self): images along with a file, .metadata.json, that contains identifying information. """ - # Get the source file data path top_parent = self.dataset.get_genealogy()[0] datasource = top_parent.parameters.get("datasource") @@ -263,6 +266,7 @@ def process(self): downloaded_images = 0 processed_urls = 0 failures = [] + total_images = len(urls) if amount == 0 else amount for url in urls: if amount != 0 and downloaded_images >= amount: break @@ -273,8 +277,8 @@ def process(self): processed_urls += 1 self.dataset.update_status("Downloaded %i/%i images; downloading from %s" % - (downloaded_images, amount, url)) - self.dataset.update_progress(downloaded_images / amount) + (downloaded_images, total_images, url)) + self.dataset.update_progress(downloaded_images / total_images) try: # acquire image diff --git a/processors/visualisation/download_tiktok.py b/processors/visualisation/download_tiktok.py index 9cc64d7d9..c02b53bf7 100644 --- a/processors/visualisation/download_tiktok.py +++ b/processors/visualisation/download_tiktok.py @@ -14,7 +14,9 @@ from common.lib.exceptions import ProcessorInterruptedException from common.lib.user_input import UserInput from datasources.tiktok_urls.search_tiktok_urls import TikTokScraper +from processors.visualisation.download_videos import VideoDownloaderPlus from datasources.tiktok.search_tiktok import SearchTikTok as SearchTikTokByImport +from processors.visualisation.download_images import ImageDownloader from backend.lib.processor import BasicProcessor @@ -30,6 +32,9 @@ class TikTokVideoDownloader(BasicProcessor): title = "Download TikTok Videos" # title displayed in UI description = "Downloads full videos for TikTok" extension = "zip" + media_type = "video" + + followups = VideoDownloaderPlus.followups options = { "amount": { @@ -138,6 +143,9 @@ class TikTokImageDownloader(BasicProcessor): title = "Download TikTok Images" # title displayed in UI description = "Downloads video/music thumbnails for TikTok; refreshes TikTok data if URLs have expired" extension = "zip" + media_type = "image" + + followups = ImageDownloader.followups options = { "amount": { diff --git a/processors/visualisation/download_videos.py b/processors/visualisation/download_videos.py index 643d9c2a5..50217de4b 100644 --- a/processors/visualisation/download_videos.py +++ b/processors/visualisation/download_videos.py @@ -52,6 +52,9 @@ class VideoDownloaderPlus(BasicProcessor): description = "Download videos from URLs and store in a zip file. May take a while to complete as videos are " \ "retrieved externally." # description displayed in UI extension = "zip" # extension of result file, used internally and in UI + media_type = "video" # media type of the processor + + followups = ["audio-extractor", "metadata-viewer", "video-scene-detector", "preset-scene-timelines", "video-stack", "preset-video-hashes", "video-hasher-1", "video-frames"] if config.get("video-downloader.allow-indirect"): references = [ @@ -235,7 +238,8 @@ def is_compatible_with(cls, module=None, user=None): :return bool: """ return ((module.type.endswith("-search") or module.is_from_collector()) - and module.type not in ["tiktok-search", "tiktok-urls-search", "telegram-search"]) + and module.type not in ["tiktok-search", "tiktok-urls-search", "telegram-search"]) \ + and module.get_extension() in ("csv", "ndjson") def process(self): """ diff --git a/processors/visualisation/image_category_wall.py b/processors/visualisation/image_category_wall.py index 6ff277882..fee1fb7b0 100644 --- a/processors/visualisation/image_category_wall.py +++ b/processors/visualisation/image_category_wall.py @@ -24,7 +24,7 @@ __maintainer__ = "Dale Wahl" __email__ = "4cat@oilab.eu" -class ImageWallGenerator(BasicProcessor): +class ImageCategoryWallGenerator(BasicProcessor): """ Image wall generator @@ -51,7 +51,7 @@ class ImageWallGenerator(BasicProcessor): "image-visuals.max_pixels_per_image": { "type": UserInput.OPTION_TEXT, "coerce_type": int, - "default": 300, + "default": 400, "min": 25, "help": "Max pixels for each images when visualising", } @@ -81,24 +81,37 @@ def get_options(cls, parent_dataset=None, user=None): "type": UserInput.OPTION_TEXT, "help": "Category column" }, - "amount": { + "width_amount": { "type": UserInput.OPTION_TEXT, - "help": "Max images per category", + "help": "Max images per category" + (f" (max {max_number_images:,})" if max_number_images != 0 else ""), "default": 10 if max_number_images == 0 else min(max_number_images, 10), "min": 0 if max_number_images == 0 else 1, "max": max_number_images, - "tooltip": "'0' uses as many images as available in the archive" + (f" (up to {max_number_images})" if max_number_images != 0 else "") + "tooltip": "This controls the width of the image wall" }, "height": { "type": UserInput.OPTION_TEXT, - "help": "Image height", + "help": "Image height in pixels", "tooltip": f"In pixels. Each image will be this height and are resized proportionally to fit it. Must be between 25 and {max_pixels}.", "coerce_type": int, "default": min(max_pixels, 100), "min": 25, "max": max_pixels + }, + "images_per_item": { + "type": UserInput.OPTION_CHOICE, + "options": { + "all": "All images", + "first": "Only first image", + }, + "default": "first", + "help": "Images per item", + "tooltip": "If an item has multiple images, should all images be used or if the first one representative?", } } + if max_number_images == 0: + options['width_amount']['tooltip'] = options['width_amount']['tooltip'] + ";'0' will use all available images" + options['width_amount'].pop('max') if parent_dataset is None: return options @@ -128,10 +141,12 @@ def identity_dataset_types(source_dataset): """ Identify dataset types that are compatible with this processor """ - if any([source_dataset.type.startswith(dataset_prefix) for dataset_prefix in ImageWallGenerator.image_datasets]): + # Is the the source dataset an image dataset? + if any([source_dataset.type.startswith(dataset_prefix) for dataset_prefix in ImageCategoryWallGenerator.image_datasets]): image_dataset = source_dataset category_dataset = source_dataset.top_parent() - elif any([source_dataset.get_parent().type.startswith(dataset_prefix) for dataset_prefix in ImageWallGenerator.image_datasets]): + # Or is the parent dataset an image dataset? + elif any([source_dataset.get_parent().type.startswith(dataset_prefix) for dataset_prefix in ImageCategoryWallGenerator.image_datasets] + [source_dataset.get_parent().get_media_type() == "image"]): image_dataset = source_dataset.get_parent() category_dataset = source_dataset else: @@ -160,9 +175,8 @@ def process(self): return # 0 = use as many images as in the archive, up to the max - images_per_category = convert_to_int(self.parameters.get("amount"), 100) - if images_per_category == 0: - images_per_category = self.get_options()["amount"]["max"] + images_per_category = convert_to_int(self.parameters.get("width_amount"), 100) + images_per_item = self.parameters.get("images_per_item", "first") # Some processors may have a special category type to extract categories special_case = category_dataset.type == "image-to-categories" @@ -175,72 +189,88 @@ def process(self): # Map post IDs to filenames if image_dataset.type == "video-hasher-1": # We know the post ID is the filename.stem as this dataset is derived from the image dataset - filename_map = {filename.stem + ".mp4": filename for filename in staging_area.iterdir()} + filename_map = {filename.stem + ".mp4": [filename] for filename in staging_area.iterdir()} elif special_case: # We know the post ID is the filename.stem as this dataset is derived from the image dataset - filename_map = {filename.stem: filename for filename in staging_area.iterdir()} + filename_map = {filename.stem: [filename] for filename in staging_area.iterdir()} else: # Use image metadata to map post IDs to filenames with open(staging_area.joinpath('.metadata.json')) as file: image_data = json.load(file) - filename_map = {post_id: staging_area.joinpath(image.get("filename")) for image in image_data.values() - if image.get("success") for post_id in image.get("post_ids")} - self.dataset.log(filename_map) + filename_map = {} + # Images can belong to multiple posts; posts can have multiple images + for image in image_data.values(): + if image.get("success"): + for post_id in image.get("post_ids"): + if post_id not in filename_map: + filename_map[post_id] = [staging_area.joinpath(image.get("filename"))] + else: + filename_map[post_id].append(staging_area.joinpath(image.get("filename"))) + # Organize posts into categories category_type = None - categories = {} - post_values = [] # used for numeric categories + mixed_types = False self.dataset.update_status("Collecting categories") - for i, post in enumerate(category_dataset.iterate_items(self)): - if self.interrupted: - raise ProcessorInterruptedException("Interrupted while collecting categories") - - if post.get("id") not in filename_map: - # No image for this post - continue - - # Identify category type and collect post_category - if post.get(category_column) is None: - self.dataset.finish_with_error("Unable to find category column in dataset") - return - elif special_case and category_column == "top_categories": - if category_type is None: - category_type = float - # Special case - top_cats = post.get("top_categories") - top_cat = top_cats.split(",")[0].split(":")[0].strip() - top_cat_score = float(top_cats.split(",")[0].split(":")[1].strip().replace("%", "")) - post_result = {"id": post.get("id"), "value": top_cat_score, "top_cats": top_cats} - if top_cat not in categories: - categories[top_cat] = [post_result] - else: - categories[top_cat].append(post_result) - else: - if category_type is None: - try: - float(post.get(category_column)) - category_type = float - except ValueError: - category_type = str - - if category_type == str: - post_category = post.get(category_column) - if post_category == "": - post_category = "None" - if post_category not in categories: - categories[post_category] = [{"id": post.get("id")}] + for _i in range(2): + if mixed_types or category_type is None: + # Allows a second loop if mixed types are detected + categories = {} + post_values = [] # used for numeric categories + for i, post in enumerate(category_dataset.iterate_items(self)): + if self.interrupted: + raise ProcessorInterruptedException("Interrupted while collecting categories") + + if post.get("id") not in filename_map: + # No image for this post + continue + + # Identify category type and collect post_category + if special_case and category_column == "top_categories": + if category_type is None: + category_type = float + # Special case + top_cats = post.get("top_categories") + top_cat = top_cats.split(",")[0].split(":")[0].strip() + top_cat_score = float(top_cats.split(",")[0].split(":")[1].strip().replace("%", "")) + post_result = {"id": post.get("id"), "value": top_cat_score, "top_cats": top_cats} + if top_cat not in categories: + categories[top_cat] = [post_result] + else: + categories[top_cat].append(post_result) else: - categories[post_category].append({"id": post.get("id")}) - elif category_type == float: - try: - post_category = float(post.get(category_column)) - post_values.append((post_category, post.get("id"))) - except ValueError: - # Unsure exactly how to handle; possibly the first post was convertible to a float - raise ProcessorException( - f"Mixed category types detected; unable to render image wall (item {i} {post_category})") - - if len(categories) == 0: + if category_type is None: + try: + if post.get(category_column) is None: + category_type = str + else: + float(post.get(category_column)) + category_type = float + except ValueError: + category_type = str + + if category_type == str: + post_category = post.get(category_column) + if post_category == "" or post_category is None: + post_category = "None" + if post_category not in categories: + categories[post_category] = [{"id": post.get("id")}] + else: + categories[post_category].append({"id": post.get("id")}) + elif category_type == float: + if post.get(category_column) is None: + self.dataset.log(f"Post {post.get('id')} has no data; skipping") + continue + try: + post_category = float(post.get(category_column)) + post_values.append((post_category, post.get("id"))) + except ValueError: + # Possibly the first post was convertible to a float + # Set as string and loop again + mixed_types = True + category_type = str + break + + if len(categories) == 0 and len(post_values) == 0: self.dataset.finish_with_error("No categories found") return @@ -327,46 +357,48 @@ def process(self): category_widths[category] += footersize[0] break - image_filename = filename_map.get(image.get("id")) - if not image_filename: + # Get image or images for this item + image_filenames = filename_map.get(image.get("id")) if images_per_item == "all" else [filename_map.get(image.get("id"), [None])[0]] + if not image_filenames: self.dataset.log(f"Image {image.get('id')} not found in image archive") continue - frame = Image.open(str(image_filename)) - - frame_width = int(base_height * frame.width / frame.height) - frame.thumbnail((frame_width, base_height)) - - # add to SVG as data URI (so it is a self-contained file) - frame_data = io.BytesIO() - try: - frame.save(frame_data, format="JPEG") # JPEG probably optimal for video frames - except OSError: - # Try removing alpha channel - frame = frame.convert('RGB') - frame.save(frame_data, format="JPEG") - frame_data = "data:image/jpeg;base64," + base64.b64encode(frame_data.getvalue()).decode("utf-8") - # add to category element - frame_element = ImageElement(href=frame_data, insert=(category_widths[category], 0), - size=(frame_width, base_height)) - category_image.add(frame_element) - - # add score label - if category_type in [float, int]: - if category_type == int: - image_score = str(image.get("value")) - else: - image_score = f"{image.get('value'):.2f}" + ("%" if special_case and (category_column == "top_categories") else "") - footersize = (fontsize * (len(image_score) + 2) * 0.5925, fontsize * 2) - footer_shape = SVG(insert=(offset_w, base_height - footersize[1]), size=footersize) - footer_shape.add(Rect(insert=(0, 0), size=("100%", "100%"), fill="#000")) - label_element = Text(insert=("50%", "50%"), text=image_score, dominant_baseline="middle", - text_anchor="middle", fill="#FFF", style="font-size:%ipx" % fontsize) - footer_shape.add(label_element) - category_image.add(footer_shape) - offset_w += frame_width + for image_filename in image_filenames: + frame = Image.open(str(image_filename)) - category_widths[category] += frame_width - self.dataset.log(f"Added image {image.get('id')} to category {category}; width {category_widths[category]} height {offset_y}") + frame_width = int(base_height * frame.width / frame.height) + frame.thumbnail((frame_width, base_height)) + + # add to SVG as data URI (so it is a self-contained file) + frame_data = io.BytesIO() + try: + frame.save(frame_data, format="JPEG") # JPEG probably optimal for video frames + except OSError: + # Try removing alpha channel + frame = frame.convert('RGB') + frame.save(frame_data, format="JPEG") + frame_data = "data:image/jpeg;base64," + base64.b64encode(frame_data.getvalue()).decode("utf-8") + # add to category element + frame_element = ImageElement(href=frame_data, insert=(category_widths[category], 0), + size=(frame_width, base_height)) + category_image.add(frame_element) + + # add score label + if category_type in [float, int]: + if category_type == int: + image_score = str(image.get("value")) + else: + image_score = f"{image.get('value'):.2f}" + ("%" if special_case and (category_column == "top_categories") else "") + footersize = (fontsize * (len(image_score) + 2) * 0.5925, fontsize * 2) + footer_shape = SVG(insert=(offset_w, base_height - footersize[1]), size=footersize) + footer_shape.add(Rect(insert=(0, 0), size=("100%", "100%"), fill="#000")) + label_element = Text(insert=("50%", "50%"), text=image_score, dominant_baseline="middle", + text_anchor="middle", fill="#FFF", style="font-size:%ipx" % fontsize) + footer_shape.add(label_element) + category_image.add(footer_shape) + offset_w += frame_width + + category_widths[category] += frame_width + self.dataset.log(f"Added image {image.get('id')} to category {category}; width {category_widths[category]} height {offset_y}") # Add Category label footersize = (fontsize * (len(category) + 2) * 0.5925, fontsize * 2) diff --git a/processors/visualisation/image_wall.py b/processors/visualisation/image_wall.py index 2e0600227..9b846a0df 100644 --- a/processors/visualisation/image_wall.py +++ b/processors/visualisation/image_wall.py @@ -54,7 +54,7 @@ def is_compatible_with(cls, module=None, user=None): :param module: Dataset or processor to determine compatibility with """ - return module.type.startswith("image-downloader") or module.type == "video-frames" + return module.get_media_type() == "image" or module.type.startswith("image-downloader") or module.type == "video-frames" @classmethod def get_options(cls, parent_dataset=None, user=None): diff --git a/processors/visualisation/image_wall_w_text.py b/processors/visualisation/image_wall_w_text.py new file mode 100644 index 000000000..70d079d1a --- /dev/null +++ b/processors/visualisation/image_wall_w_text.py @@ -0,0 +1,279 @@ +""" +Create an image wall with text captions +""" +import io +import base64 +import json +import math +import textwrap + +from svgwrite.image import Image as ImageElement + +from svgwrite.container import SVG +from svgwrite.shapes import Rect +from svgwrite.text import Text, TextArea + +from PIL import Image, ImageOps + +from common.lib.helpers import UserInput, convert_to_int, get_4cat_canvas +from backend.lib.processor import BasicProcessor +from common.lib.exceptions import ProcessorInterruptedException, ProcessorException +from common.config_manager import config + +__author__ = "Dale Wahl" +__credits__ = ["Dale Wahl", "Stijn Peeters"] +__maintainer__ = "Dale Wahl" +__email__ = "4cat@oilab.eu" + +class ImageTextWallGenerator(BasicProcessor): + """ + Image wall with text generator + """ + type = "image-text-wall" # job type ID + category = "Visual" # category + title = "Visualise images with captions" # title displayed in UI + description = "Combine images into a single image including text" # description displayed in UI + extension = "svg" # extension of result file, used internally and in UI + + image_datasets = ["image-downloader", "video-hasher-1"] + caption_datasets = ["image-captions", "text-from-images"] + combined_dataset = ["image-downloader-stable-diffusion"] + + @classmethod + def is_compatible_with(cls, module=None, user=None): + """ + Allow processor on CLIP dataset only + + :param module: Dataset or processor to determine compatibility with + """ + image_dataset, text_dataset = cls.identity_dataset_types(module) + return image_dataset is not None and text_dataset is not None + + @classmethod + def get_options(cls, parent_dataset=None, user=None): + """ + Collect maximum number of audio files from configuration and update options accordingly + """ + max_number_images = int(config.get("image-visuals.max_per_cat", 1000, user=user)) + max_pixels = int(config.get("image-visuals.max_pixels_per_image", 500, user=user)) + options = { + "amount": { + "type": UserInput.OPTION_TEXT, + "help": "Max images" + (f" (max {max_number_images:,})" if max_number_images != 0 else ""), + "default": 10 if max_number_images == 0 else min(max_number_images, 100), + "min": 0 if max_number_images == 0 else 1, + "max": max_number_images, + }, + "size": { + "type": UserInput.OPTION_TEXT, + "help": "Image size", + "tooltip": f"In pixels. Each image will be this max width and are resized proportionally to fit it. Must be between 100 and {max_pixels}.", + "coerce_type": int, + "default": min(max_pixels, 100), + "min": 100, + "max": max_pixels + }, + "tile-size": { + "type": UserInput.OPTION_CHOICE, + "options": { + "square": "Square", + "fill-square": "Fill square", + "fit-height": "Fit height" + }, + "default": "fill-square", + "help": "Image tile size", + "tooltip": "'Fit height' retains image ratios but makes them have the same height" + }, + } + if max_number_images == 0: + options['amount']['tooltip'] = "'0' will use all available images" + options['amount'].pop('max') + + return options + + @staticmethod + def identity_dataset_types(source_dataset): + """ + Identify dataset types that are compatible with this processor + """ + # TODO: use `media_type` method to identify image datasets after merge + # TODO: do we have additional text datasets we would like to support? + if source_dataset.type in ImageTextWallGenerator.combined_dataset: + # This dataset has both images and captions + return source_dataset, source_dataset + elif any([source_dataset.type.startswith(dataset_prefix) for dataset_prefix in ImageTextWallGenerator.caption_datasets]): + text_dataset = source_dataset + image_dataset = source_dataset.get_parent() + if not any([image_dataset.type.startswith(dataset_prefix) for dataset_prefix in ImageTextWallGenerator.image_datasets] + [image_dataset.get_media_type() == "image"]): + # Not a compatible dataset + return None, None + else: + return None, None + + return image_dataset, text_dataset + + def process(self): + """ + Process the job + """ + # Check for compatibility + image_dataset, text_dataset = self.identity_dataset_types(self.source_dataset) + if image_dataset is None or text_dataset is None: + self.dataset.finish_with_error("Unable to indentify image and category datasets") + return + # is there anything to put on a wall? + if image_dataset.num_rows == 0 or text_dataset.num_rows == 0: + self.dataset.finish_with_error("No images/captions available to render to image wall.") + return + self.dataset.log(f"Found {image_dataset.type} w/ {image_dataset.num_rows} images and {text_dataset.type} w/ {text_dataset.num_rows} items") + + # 0 = use as many images as in the archive, up to the max + max_images = convert_to_int(self.parameters.get("amount"), 100) + if max_images == 0: + max_images = image_dataset.num_rows + # Calculate sides of the square + side_length = math.ceil(math.sqrt(max_images)) + tile_type = self.parameters.get("tile-size", "square") + + # Create text mapping + max_text_len = 0 + filename_to_text_mapping = {} + if text_dataset.type in ImageTextWallGenerator.combined_dataset: + # For datasets with both images and text, use .metadata.json + metadata_file = self.extract_archived_file_by_name(".metadata.json", self.source_file) + if metadata_file is None: + self.dataset.finish_with_error("No metadata file found") + return + with metadata_file.open() as f: + metadata = json.load(f) + for item in metadata.values(): + if self.interrupted: + raise ProcessorInterruptedException("Interrupted while collecting text") + if "filename" in item: + # "image-downloader-stable-diffusion" datasets + image_text = item.get("prompt", "") + max_text_len = max(max_text_len, len(image_text)) + filename_to_text_mapping[item["filename"]] = image_text + else: + # For datasets with separate images and text + for item in text_dataset.iterate_items(self): + if self.interrupted: + raise ProcessorInterruptedException("Interrupted while collecting text") + + if item.get("image_filename", item.get("filename")) is not None: + # For image-caption datasets + image_text = item.get("text") if item.get("text") is not None else "" + max_text_len = max(max_text_len, len(image_text)) + filename_to_text_mapping[item.get("image_filename", item.get("filename"))] = image_text + + # Create SVG with categories and images + # Base sizes for each image + base_height = self.parameters.get("size", 100) + fontsize = 12 + #Note: SVG files are "documents" and so this is actually not direct to pixels but instead the fontsize is HTML/CSS style dependent + fontsize_to_pixels_multiplier = 0.56 # this is a rough multiplier and somehow ought to be variable based on width + characters_per_line = math.ceil(base_height / (fontsize * fontsize_to_pixels_multiplier)) # this is a rough estimate as width can be longer than height (works for square formats) + rows_of_text = min(math.ceil(max_text_len / characters_per_line), 6) # max of 6 rows of text + row_height = base_height + (rows_of_text * fontsize + 4) # 4 is for padding + offset_y = - row_height + # Object collectors and tracking + total_images_collected = 0 + current_row = 0 + images_in_row = 0 + row_widths = {} + complete_categories = [] + self.dataset.update_status("Creating Image wall") + self.dataset.log(f"Creating image wall with {max_images} images, size {base_height} and tile type {tile_type}") + for image_path in self.iterate_archive_contents(image_dataset.get_results_path()): + if image_path.name in [".metadata.json"]: + if convert_to_int(self.parameters.get("amount"), 100) == 0: + max_images = max_images - 1 + continue + + if total_images_collected == 0: + offset_y += fontsize * 2 # add some space at the top for header + + if images_in_row % side_length == 0: + # reset and ready for the next row + offset_y += row_height + current_row += 1 + images_in_row = 0 + row_widths[current_row] = 0 + category_image = SVG(insert=(0, offset_y), size=(0, row_height)) + offset_w = 0 + + frame = Image.open(str(image_path)) + if tile_type == "square": + # resize to square + frame_width = base_height + frame.thumbnail((frame_width, base_height)) + elif tile_type == "fill-square": + # fill square + frame_width = base_height + frame = ImageOps.fit(frame, (frame_width, base_height), method=Image.BILINEAR) + else: + # resize to height + frame_width = int(base_height * frame.width / frame.height) + frame.thumbnail((frame_width, base_height)) + + # add to SVG as data URI (so it is a self-contained file) + frame_data = io.BytesIO() + try: + frame.save(frame_data, format="JPEG") # JPEG probably optimal for video frames + except OSError: + # Try removing alpha channel + frame = frame.convert('RGB') + frame.save(frame_data, format="JPEG") + frame_data = "data:image/jpeg;base64," + base64.b64encode(frame_data.getvalue()).decode("utf-8") + # add to category element + frame_element = ImageElement(href=frame_data, insert=(row_widths[current_row], 0), + size=(frame_width, base_height)) + category_image.add(frame_element) + + # Add text label + filename = image_path.name + if filename in filename_to_text_mapping: + image_text = textwrap.wrap(filename_to_text_mapping[filename], int(frame_width / (fontsize * fontsize_to_pixels_multiplier))) + footersize = (frame_width, rows_of_text * fontsize * 2) + footer_shape = SVG(insert=(offset_w, base_height), size=footersize) + footer_shape.add(Rect(insert=(0, 0), size=("100%", "100%"), fill="#000", style="stroke-width:1;stroke:white")) + for i, line in enumerate(image_text, start=1): + label_element = Text(insert=(0, fontsize * i), text=line, fill="#FFF", style="font-size:%ipx" % fontsize) + footer_shape.add(label_element) + category_image.add(footer_shape) + offset_w += frame_width + images_in_row += 1 + row_widths[current_row] += frame_width + + self.dataset.log(f"Added image {filename}") + total_images_collected += 1 + + if images_in_row % side_length == 0: + # Add completed row + category_image["width"] = row_widths[current_row] + complete_categories.append(category_image) + + if total_images_collected == max_images: + break + + # Check if last row was added + if len(complete_categories) < len(row_widths): + # Add last row + category_image["width"] = row_widths[current_row] + complete_categories.append(category_image) + + # now we know all dimensions we can instantiate the canvas too + canvas = get_4cat_canvas(self.dataset.get_results_path(), max(row_widths.values()), row_height * len(row_widths) + fontsize * 4, header=f"Images with captions", + fontsize_small=fontsize, fontsize_large=fontsize) + + for category_image in complete_categories: + self.dataset.log(f"Adding {category_image}") + canvas.add(category_image) + + # save as svg and finish up + canvas.save(pretty=True) + self.dataset.log("Saved to " + str(self.dataset.get_results_path())) + return self.dataset.finish(total_images_collected) + + + diff --git a/processors/visualisation/video_frames.py b/processors/visualisation/video_frames.py index a86c9b98b..64b0c4f34 100644 --- a/processors/visualisation/video_frames.py +++ b/processors/visualisation/video_frames.py @@ -12,6 +12,7 @@ from backend.lib.processor import BasicProcessor from common.lib.exceptions import ProcessorInterruptedException from common.lib.user_input import UserInput +from processors.visualisation.download_videos import VideoDownloaderPlus __author__ = "Dale Wahl" __credits__ = ["Dale Wahl"] @@ -31,6 +32,8 @@ class VideoFrames(BasicProcessor): description = "Extract frames from videos" # description displayed in UI extension = "zip" # extension of result file, used internally and in UI + followups = ["video-timelines"] + VideoDownloaderPlus.followups + options = { "frame_interval": { "type": UserInput.OPTION_TEXT, @@ -55,14 +58,12 @@ class VideoFrames(BasicProcessor): }, } - followups = ["video-timelines"] - @classmethod def is_compatible_with(cls, module=None, user=None): """ - Allow on tiktok-search only for dev + Allow on videos """ - return module.type.startswith("video-downloader") and \ + return (module.get_media_type() == "video" or module.type.startswith("video-downloader")) and \ config.get("video-downloader.ffmpeg_path", user=user) and \ shutil.which(config.get("video-downloader.ffmpeg_path")) diff --git a/processors/visualisation/video_hasher.py b/processors/visualisation/video_hasher.py index 96dd6125e..ff1222bc1 100644 --- a/processors/visualisation/video_hasher.py +++ b/processors/visualisation/video_hasher.py @@ -34,11 +34,18 @@ class VideoHasherPreset(ProcessorPreset): category = "Visual" # category. 'Combined processors' are always listed first in the UI. title = "Create Video hashes to identify near duplicate videos" # title displayed in UI description = "Creates video hashes (64 bits/identifiers) to identify near duplicate videos in a dataset based on hash similarity. Uses video only (no audio; see references). This process can take a long time depending on video length, amount, and frames per second." - extension = "csv" + extension = "gexf" @classmethod def get_options(cls, parent_dataset=None, user=None): return { + "amount": { + "type": UserInput.OPTION_TEXT, + "help": "No. of videos", + "default": 100, + "min": 0, + "tooltip": "Increasing this can easily lead to very long-running processors. '0; allows as many videos as available." + }, "frame_interval": { "type": UserInput.OPTION_TEXT, "help": "Number of frames extracted per second to extract from video", @@ -66,10 +73,10 @@ def is_compatible_with(cls, module=None, user=None): Compatible with downloaded videos, and not really anything else! Additionally ffmpeg needs to be available. - :param str module: Module ID to determine compatibility with + :param DataSet module: Module ID to determine compatibility with :return bool: """ - return module.type.startswith("video-downloader") and \ + return (module.get_media_type() == "video" or module.type.startswith("video-downloader")) and \ config.get("video-downloader.ffmpeg_path", user=user) and \ shutil.which(config.get("video-downloader.ffmpeg_path")) @@ -84,6 +91,7 @@ def get_processor_pipeline(self): "type": "video-hasher-1", "parameters": { "frame_interval": self.parameters.get("frame_interval", 1), + "amount": self.parameters.get("amount", 100), } }, # then create hash similarity network @@ -122,25 +130,41 @@ class VideoHasher(BasicProcessor): title = "Create Video collages" # title displayed in UI description = "Creates collages from video frames. Can be used to create video hashes to detect similar videos." # description displayed in UI extension = "zip" # extension of result file, used internally and in UI + media_type = "image" # media type of the result - options = { - "frame_interval": { - "type": UserInput.OPTION_TEXT, - "help": "Number of frames extracted per second to extract from video", - "tooltip": "The default value is 1 frame per second. For 1 frame per 5 seconds pass 0.2 (1/5). For 5 fps pass 5. For short videos, more frames per second lead to less collision when creating hashes (unsimilar videos being marked as similar), but require more time (2 fps is double the time of 1 fps).", - "coerce_type": float, - "default": 1, - "min": 0, - "max": 5, - }, - } + followups = ["video-hash-network", "video-hash-similarity-matrix"] + + @classmethod + def get_options(cls, parent_dataset=None, user=None): + """ + Options for the processor + """ + options = { + "amount": { + "type": UserInput.OPTION_TEXT, + "help": "No. of videos", + "default": 100, + "min": 0, + "tooltip": "Increasing this can easily lead to very long-running processors. '0; allows as many videos as available." + }, + "frame_interval": { + "type": UserInput.OPTION_TEXT, + "help": "Number of frames extracted per second to extract from video", + "tooltip": "The default value is 1 frame per second. For 1 frame per 5 seconds pass 0.2 (1/5). For 5 fps pass 5. For short videos, more frames per second lead to less collision when creating hashes (unsimilar videos being marked as similar), but require more time (2 fps is double the time of 1 fps).", + "coerce_type": float, + "default": 1, + "min": 0, + "max": 5, + }, + } + return options @classmethod def is_compatible_with(cls, module=None, user=None): """ Allow on videos only """ - return module.type.startswith("video-downloader") + return module.get_media_type() == "video" or module.type.startswith("video-downloader") def process(self): """ @@ -155,6 +179,7 @@ def process(self): # Collect parameters frame_interval = self.parameters.get("frame_interval", 1) + max_videos = self.parameters.get("amount", 100) self.dataset.log('Frames per seconds: %f' % frame_interval) # Prepare staging area for videos and video tracking @@ -163,7 +188,7 @@ def process(self): video_hashes = {} video_metadata = None - total_possible_videos = self.source_dataset.num_rows - 1 # for the metadata file that is included in archives + total_possible_videos = min(self.source_dataset.num_rows - 1, max_videos) if max_videos != 0 else self.source_dataset.num_rows - 1 # for the metadata file that is included in archives processed_videos = 0 self.dataset.update_status("Creating video hashes") @@ -171,6 +196,9 @@ def process(self): if self.interrupted: raise ProcessorInterruptedException("Interrupted while creating video hashes") + if max_videos != 0 and processed_videos >= max_videos: + break + if path.name == '.metadata.json': # Keep it and move on with open(path) as file: @@ -210,8 +238,17 @@ def process(self): num_posts = 0 rows = [] if video_metadata is None: - # Not good, but let's store the video_hashes and note the error - self.dataset.update_status("Error connecting video hashes to original dataset", is_final=True) + # Grab the metadata directly, if it exists but was skipped (e.g., not found prior to max_videos) + try: + metadata_path = self.extract_archived_file_by_name(".metadata.json", self.source_file, staging_area) + except FileNotFoundError: + metadata_path = None + if metadata_path: + with open(metadata_path) as file: + video_metadata = json.load(file) + + if video_metadata is None: + self.dataset.log("No video metadata (i.e., from video downloader) found; unable to connect original posts. Saving video hashes only.") for filename, data in video_hashes.items(): video_hash = data.get('videohash') @@ -379,6 +416,11 @@ def process(self): "Calculated %i of %i hash similarities" % (comparisons, expected_comparisons)) self.dataset.update_progress(comparisons / expected_comparisons) + if len(network.edges) < 1: + self.dataset.update_status("No similar videos identified") + self.dataset.finish(0) + return + self.dataset.update_status("Writing network file") nx.write_gexf(network, self.dataset.get_results_path()) self.dataset.finish(len(network.nodes)) diff --git a/processors/visualisation/video_scene_frames.py b/processors/visualisation/video_scene_frames.py index 71cb35476..8edb520ff 100644 --- a/processors/visualisation/video_scene_frames.py +++ b/processors/visualisation/video_scene_frames.py @@ -35,6 +35,8 @@ class VideoSceneFrames(BasicProcessor): description = "For each scene identified, extracts the first frame." # description displayed in UI extension = "zip" # extension of result file, used internally and in UI + followups = ["video-timelines"] + options = { "frame_size": { "type": UserInput.OPTION_CHOICE, @@ -49,8 +51,6 @@ class VideoSceneFrames(BasicProcessor): }, } - followups = ["video-timelines"] - @classmethod def is_compatible_with(cls, module=None, user=None): """ @@ -80,7 +80,10 @@ def process(self): frame_size = self.parameters.get("frame_size", "no_modify") # unpack source videos to get frames from - video_dataset = self.source_dataset.nearest("video-downloader*") + video_dataset = None + for video_dataset_type in ["video-downloader*", "media-import-search"]: + if video_dataset is None: + video_dataset = self.source_dataset.nearest(video_dataset_type) if not video_dataset: self.log.error( f"Trying to extract video data from non-video dataset {video_dataset.key} (type '{video_dataset.type}')") diff --git a/processors/visualisation/video_scene_identifier.py b/processors/visualisation/video_scene_identifier.py index 6525bfd25..634e8c49d 100644 --- a/processors/visualisation/video_scene_identifier.py +++ b/processors/visualisation/video_scene_identifier.py @@ -28,6 +28,8 @@ class VideoSceneDetector(BasicProcessor): "intensity or cuts and fades to black) and extract the scene metadata." # description displayed in UI extension = "csv" # extension of result file, used internally and in UI + followups = ["video-scene-frames", "video-timelines"] + references = [ "[PySceneDetect](https://github.com/Breakthrough/PySceneDetect)", "[Detection Algorithms](https://scenedetect.com/projects/Manual/en/latest/api/detectors.html)" @@ -137,14 +139,12 @@ class VideoSceneDetector(BasicProcessor): }, } - followups = ["video-scene-frames", "video-timelines"] - @classmethod def is_compatible_with(cls, module=None, user=None): """ Allow on videos """ - return module.type.startswith("video-downloader") + return module.get_media_type() == "video" or module.type.startswith("video-downloader") def process(self): """ @@ -237,7 +237,7 @@ def process(self): rows = [] if video_metadata is None: # Not good, but let's store the scenes and note the error - self.dataset.update_status("Error connecting video scenes to original dataset", is_final=True) + self.dataset.log("No metadata file found") for filename, video_scenes in collected_scenes.items(): for i, scene in enumerate(video_scenes): diff --git a/processors/visualisation/video_stack.py b/processors/visualisation/video_stack.py index a045551a4..87da480b9 100644 --- a/processors/visualisation/video_stack.py +++ b/processors/visualisation/video_stack.py @@ -85,17 +85,18 @@ def is_compatible_with(cls, module=None, user=None): """ Determine compatibility - :param str module: Module ID to determine compatibility with + :param DataSet module: Module ID to determine compatibility with :return bool: """ - # also need ffprobe to determine video lengths - # is usually installed in same place as ffmpeg - ffmpeg_path = shutil.which(config.get("video-downloader.ffmpeg_path", user=user)) - ffprobe_path = shutil.which("ffprobe".join(ffmpeg_path.rsplit("ffmpeg", 1))) if ffmpeg_path else None - - return module.type.startswith("video-downloader") and \ - ffmpeg_path and \ - ffprobe_path + if not (module.get_media_type() == "video" or module.type.startswith("video-downloader")): + return False + else: + # Only check these if we have a video dataset + # also need ffprobe to determine video lengths + # is usually installed in same place as ffmpeg + ffmpeg_path = shutil.which(config.get("video-downloader.ffmpeg_path", user=user)) + ffprobe_path = shutil.which("ffprobe".join(ffmpeg_path.rsplit("ffmpeg", 1))) if ffmpeg_path else None + return ffmpeg_path and ffprobe_path def process(self): """ @@ -119,7 +120,10 @@ def process(self): ffprobe_path = shutil.which("ffprobe".join(ffmpeg_path.rsplit("ffmpeg", 1))) # unpack source videos to stack - video_dataset = self.source_dataset.nearest("video-downloader*") + video_dataset = None + for video_dataset_type in ["video-downloader*", "media-import-search"]: + if video_dataset is None: + video_dataset = self.source_dataset.nearest(video_dataset_type) if not video_dataset: self.log.error( f"Trying to extract video data from non-video dataset {video_dataset.key} (type '{video_dataset.type}')") diff --git a/processors/visualisation/word-trees.py b/processors/visualisation/word-trees.py index 7f35c1682..6446372e8 100644 --- a/processors/visualisation/word-trees.py +++ b/processors/visualisation/word-trees.py @@ -126,6 +126,13 @@ class MakeWordtree(BasicProcessor): # methods limit = 1 + @classmethod + def is_compatible_with(cls, module=None, user=None): + """ + Allow CSV and NDJSON datasets + """ + return module.is_top_dataset() and module.get_extension() in ("csv", "ndjson") + def process(self): """ This takes a 4CAT results file as input, and outputs a plain text file diff --git a/processors/visualisation/youtube_thumbnails.py b/processors/visualisation/youtube_thumbnails.py index fce50e4ad..844df8ac6 100644 --- a/processors/visualisation/youtube_thumbnails.py +++ b/processors/visualisation/youtube_thumbnails.py @@ -28,6 +28,9 @@ class YouTubeThumbnails(BasicProcessor): title = "Download YouTube thumbnails" # title displayed in UI description = "Downloads the thumbnails of YouTube videos and stores it in a zip archive." # description displayed in UI extension = "zip" # extension of result file, used internally and in UI + media_type = "image" # media type of the result + + followups = ["youtube-imagewall"] max_retries = 3 sleep_time = 10 diff --git a/setup.py b/setup.py index b75724a23..4d697d8f6 100644 --- a/setup.py +++ b/setup.py @@ -25,7 +25,7 @@ "gensim>=4.1.0, <4.2", "google_api_python_client==2.0.2", "html2text==2020.*", - "ImageHash~=4.2.0", + "ImageHash>4.2.0", "jieba~=0.42", "json_stream", "lxml~=4.9.0", @@ -45,6 +45,7 @@ "pyahocorasick~=1.4.0", "PyMySQL~=1.0", "PyTumblr==0.1.0", + "razdel~=0.5", "requests~=2.27", "requests_futures", "scenedetect==0.6.0.3", @@ -59,7 +60,9 @@ "unidecode~=1.3", "Werkzeug~=2.2", "wordcloud~=1.8", - "videohash @ https://github.com/dale-wahl/videohash/archive/refs/heads/main.zip", + # The https://github.com/akamhy/videohash is not being maintained anymore; these are two patches + "imagedominantcolor @ git+https://github.com/dale-wahl/imagedominantcolor.git@pillow10", + "videohash @ git+https://github.com/dale-wahl/videohash@main", "vk_api", "yt-dlp", "en_core_web_sm @ https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-3.7.1/en_core_web_sm-3.7.1.tar.gz#egg=en_core_web_sm" diff --git a/webtool/__init__.py b/webtool/__init__.py index 8a1e38a5b..7becd1239 100644 --- a/webtool/__init__.py +++ b/webtool/__init__.py @@ -22,6 +22,7 @@ from flask_limiter import Limiter from flask_limiter.util import get_remote_address from werkzeug.middleware.proxy_fix import ProxyFix +from werkzeug import Request from common.config_manager import config from common.lib.database import Database @@ -99,6 +100,9 @@ login_manager.init_app(app) login_manager.login_view = "show_login" +# Set number of form parts to accept (default is 1000; affects number of files that can be uploaded) +Request.max_form_parts = config.get("flask.max_form_parts", 1000) + # import all views import webtool.views.views_admin import webtool.views.views_restart diff --git a/webtool/lib/template_filters.py b/webtool/lib/template_filters.py index 9cbe1897e..c50caca26 100644 --- a/webtool/lib/template_filters.py +++ b/webtool/lib/template_filters.py @@ -1,6 +1,8 @@ +import urllib.parse import datetime import markdown import json +import ural import uuid import math import os @@ -117,6 +119,26 @@ def _jinja2_filter_httpquery(data): except TypeError: return "" +@app.template_filter("add_ahref") +def _jinja2_filter_add_ahref(content): + """ + Add HTML links to text + + Replaces URLs with a clickable link + + :param str content: Text to parse + :return str: Parsed text + """ + try: + content = str(content) + except ValueError: + return content + + for link in set(ural.urls_from_text(str(content))): + content = content.replace(link, f'", "%3E").replace(chr(34), "%22")}" rel="external">{link}') + + return content + @app.template_filter('markdown') def _jinja2_filter_markdown(text): val = markdown.markdown(text) diff --git a/webtool/pages/issues.md b/webtool/pages/issues.md index 1d951a8ec..2280f14ad 100644 --- a/webtool/pages/issues.md +++ b/webtool/pages/issues.md @@ -1,6 +1,24 @@ -## Issues +## Help & Bug Reports -Found any problems with the tool? 4CAT is in active development, so bugs inevitably pop up now and then. +4CAT is a tool with many features that is in active development, so inevitably sometimes you will run into bugs, or not +know what to do to get 4CAT to do what you want. -To report any bugs or suggest improvements, please open a new issue on 4CAT's [GitHub issues -page](https://github.com/digitalmethodsinitiative/4cat/issues). \ No newline at end of file +### Help! + +A list of resources that can help you better understand 4CAT is collected on the 4CAT website, +[4cat.nl](https://4cat.nl). You will find links to tutorial videos, exercises, worksheets and contact information there. + +There is also a [GitHub Discussions](https://github.com/digitalmethodsinitiative/4cat/discussions) page for 4CAT that is +actively monitored by its developers. Note that this is more suitable for technical questions and that for questions +about e.g. coursework this is not the best place to ask — consult the resources linked on the website instead in +that case, or contact your course instructor. + +### Bugs and issues + +If you find a bug in 4CAT (or if you suspect you found one), it is greatly appreciated if you report this to the 4CAT +developers so they are aware of it and have the opportunity to fix it in a future version. The preferred way to contact +the development team for this purpose is via 4CAT's [GitHub issues page](https://github.com/digitalmethodsinitiative/4cat/issues). You can see a list of known issues here +and add new ones via the 'New issue' button. If you're not sure your problem is worth creating an issue for, you can +also open a [Discussion](https://github.com/digitalmethodsinitiative/4cat/discussions) about it. + +You will need a GitHub account for this, but these are easy and free to create. \ No newline at end of file diff --git a/webtool/static/css/dataset-page.css b/webtool/static/css/dataset-page.css index 1c7b908da..e257bf293 100644 --- a/webtool/static/css/dataset-page.css +++ b/webtool/static/css/dataset-page.css @@ -552,7 +552,7 @@ article.result > section:first-child { flex-direction: column; align-items: stretch; height: 125px; - width: 75%; + width: 95%; overflow-y: scroll; overflow-x: hidden; background-color: var(--gray); @@ -561,7 +561,7 @@ article.result > section:first-child { .processor-option-wrap .multi-select-options { height: auto; max-height: 15em; - width: 19em; + width: 100%; } .multi-select-options > label, .form-element .multi-select-options label { @@ -569,6 +569,7 @@ article.result > section:first-child { text-align: left; cursor: pointer; user-select: none; + min-height: auto; } .multi-select-options .no-match { diff --git a/webtool/static/js/fourcat.js b/webtool/static/js/fourcat.js index df56bca60..e622505b2 100644 --- a/webtool/static/js/fourcat.js +++ b/webtool/static/js/fourcat.js @@ -365,13 +365,30 @@ const query = { let snippet_size = 128 * 1024; // 128K ought to be enough for everybody for (let pair of formdata.entries()) { if (pair[1] instanceof File) { - const sample_size = Math.min(pair[1].size, snippet_size); - const blob = pair[1].slice(0, sample_size); // do not load whole file into memory - - // make sure we're submitting utf-8 - read and then re-encode to be sure - const blobAsText = await FileReaderPromise(blob); - const snippet = new File([new TextEncoder().encode(blobAsText)], pair[1].name); - formdata.set(pair[0], snippet); + console.log(pair[1].type) + if (!['application/zip', 'application/x-zip-compressed'].includes(pair[1].type)) { + const sample_size = Math.min(pair[1].size, snippet_size); + const blob = pair[1].slice(0, sample_size); // do not load whole file into memory + + // make sure we're submitting utf-8 - read and then re-encode to be sure + const blobAsText = await FileReaderPromise(blob); + const snippet = new File([new TextEncoder().encode(blobAsText)], pair[1].name); + formdata.set(pair[0], snippet); + } else { + // if this is a zip file, don't bother with a snippet (which won't be + // useful) but do send a list of files in the zip + const reader = new zip.ZipReader(new zip.BlobReader(pair[1])); + const entries = await reader.getEntries(); + formdata.set(pair[0] + '-entries', JSON.stringify( + entries.map(function(e) { + return { + filename: e.filename, + filesize: e.compressedSize + } + }) + )); + formdata.set(pair[0], null); + } } } } @@ -1821,7 +1838,7 @@ const ui_helpers = { } conditionals.forEach((element) => { - let requirement = RegExp(/([a-zA-Z0-9_]+)([!=$~^]+)(.*)/g).exec(element.getAttribute('data-requires')); + let requirement = RegExp(/([a-zA-Z0-9_-]+)([!=$~^]+)(.*)/g).exec(element.getAttribute('data-requires')); if (!requirement || requirement.length !== 4) { // assume 'field is not empty' requirement = [null, element.getAttribute('data-requires'), '!=', '']; } @@ -1830,6 +1847,8 @@ const ui_helpers = { const other_field = 'option-' + requirement[1]; const other_element = form.querySelector("*[name='" + other_field + "']"); + console.log(other_field); + if (!other_element) { //invalid reference return; } @@ -1839,13 +1858,13 @@ const ui_helpers = { let requirement_met = false; if (other_element.getAttribute('type') === 'checkbox') { // checkboxes are a bit different (and simpler) - const checked = other_element.checked; + const other_is_checked = other_element.checked; if(requirement[2] === '!=') { - if((checked && ['', 'false'].includes(requirement[3])) || (!checked && ['checked', 'true'].includes(requirement[3]))) { + if((other_is_checked && ['', 'false'].includes(requirement[3])) || (!other_is_checked && ['checked', 'true'].includes(requirement[3]))) { requirement_met = true; } } else { - if((checked && ['checked', 'true'].includes(requirement[3])) || (!checked && ['', 'false'].includes(requirement[3]))) { + if((other_is_checked && ['checked', 'true'].includes(requirement[3])) || (!other_is_checked && ['', 'false'].includes(requirement[3]))) { requirement_met = true; } } diff --git a/webtool/static/js/zip.min.js b/webtool/static/js/zip.min.js new file mode 100644 index 000000000..f69e82626 --- /dev/null +++ b/webtool/static/js/zip.min.js @@ -0,0 +1 @@ +((e,t)=>{"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).zip={})})(this,(function(e){"use strict";const{Array:t,Object:n,String:r,Number:s,BigInt:i,Math:a,Date:o,Map:c,Set:l,Response:u,URL:f,Error:d,Uint8Array:w,Uint16Array:p,Uint32Array:h,DataView:g,Blob:m,Promise:y,TextEncoder:b,TextDecoder:S,document:k,crypto:z,btoa:v,TransformStream:x,ReadableStream:A,WritableStream:_,CompressionStream:C,DecompressionStream:F,navigator:D,Worker:R}="undefined"!=typeof globalThis?globalThis:this||self;var E=void 0!==k?k.currentScript:null;const T=4294967295,W=65535,U=67324752,j=134695760,I=j,L=33639248,N=101010256,O=101075792,q=117853008,P=22,M=21589,G=2048,B="/",H=new o(2107,11,31),V=new o(1980,0,1),K=void 0,Z="undefined",X="function";class Y{constructor(e){return class extends x{constructor(t,n){const r=new e(n);super({transform(e,t){t.enqueue(r.append(e))},flush(e){const t=r.flush();t&&e.enqueue(t)}})}}}}let Q=2;try{typeof D!=Z&&D.hardwareConcurrency&&(Q=D.hardwareConcurrency)}catch(e){}const J={chunkSize:524288,maxWorkers:Q,terminateWorkerTimeout:5e3,useWebWorkers:!0,useCompressionStream:!0,workerScripts:K,CompressionStreamNative:typeof C!=Z&&C,DecompressionStreamNative:typeof F!=Z&&F},$=n.assign({},J);function ee(){return $}function te(e){return a.max(e.chunkSize,64)}function ne(e){const{baseURL:n,chunkSize:r,maxWorkers:s,terminateWorkerTimeout:i,useCompressionStream:a,useWebWorkers:o,Deflate:c,Inflate:l,CompressionStream:u,DecompressionStream:f,workerScripts:w}=e;if(re("baseURL",n),re("chunkSize",r),re("maxWorkers",s),re("terminateWorkerTimeout",i),re("useCompressionStream",a),re("useWebWorkers",o),c&&($.CompressionStream=new Y(c)),l&&($.DecompressionStream=new Y(l)),re("CompressionStream",u),re("DecompressionStream",f),w!==K){const{deflate:e,inflate:n}=w;if((e||n)&&($.workerScripts||($.workerScripts={})),e){if(!t.isArray(e))throw new d("workerScripts.deflate must be an array");$.workerScripts.deflate=e}if(n){if(!t.isArray(n))throw new d("workerScripts.inflate must be an array");$.workerScripts.inflate=n}}}function re(e,t){t!==K&&($[e]=t)}function se(e,t,r){return class{constructor(s){const i=this;var a,o;a=s,o="level",(typeof n.hasOwn===X?n.hasOwn(a,o):a.hasOwnProperty(o))&&s.level===K&&delete s.level,i.codec=new e(n.assign({},t,s)),r(i.codec,(e=>{if(i.pendingData){const t=i.pendingData;i.pendingData=new w(t.length+e.length);const{pendingData:n}=i;n.set(t,0),n.set(e,t.length)}else i.pendingData=new w(e)}))}append(e){return this.codec.push(e),s(this)}flush(){return this.codec.push(new w,!0),s(this)}};function s(e){if(e.pendingData){const t=e.pendingData;return e.pendingData=null,t}return new w}}const ie=[];for(let e=0;256>e;e++){let t=e;for(let e=0;8>e;e++)1&t?t=t>>>1^3988292384:t>>>=1;ie[e]=t}class ae{constructor(e){this.crc=e||-1}append(e){let t=0|this.crc;for(let n=0,r=0|e.length;r>n;n++)t=t>>>8^ie[255&(t^e[n])];this.crc=t}get(){return~this.crc}}class oe extends x{constructor(){let e;const t=new ae;super({transform(e,n){t.append(e),n.enqueue(e)},flush(){const n=new w(4);new g(n.buffer).setUint32(0,t.get()),e.value=n}}),e=this}}function ce(e){if(typeof b==Z){const t=new w((e=unescape(encodeURIComponent(e))).length);for(let n=0;n0&&t&&(e[n-1]=le.partial(t,e[n-1]&2147483648>>t-1,1)),e},partial:(e,t,n)=>32===e?t:(n?0|t:t<<32-e)+1099511627776*e,getPartial:e=>a.round(e/1099511627776)||32,_shiftRight(e,t,n,r){for(void 0===r&&(r=[]);t>=32;t-=32)r.push(n),n=0;if(0===t)return r.concat(e);for(let s=0;s>>t),n=e[s]<<32-t;const s=e.length?e[e.length-1]:0,i=le.getPartial(s);return r.push(le.partial(t+i&31,t+i>32?n:r.pop(),1)),r}},ue={bytes:{fromBits(e){const t=le.bitLength(e)/8,n=new w(t);let r;for(let s=0;t>s;s++)3&s||(r=e[s/4]),n[s]=r>>>24,r<<=8;return n},toBits(e){const t=[];let n,r=0;for(n=0;n9007199254740991)throw new d("Cannot hash more than 2^53 - 1 bits");const i=new h(n);let a=0;for(let e=t.blockSize+r-(t.blockSize+r&t.blockSize-1);s>=e;e+=t.blockSize)t._block(i.subarray(16*a,16*(a+1))),a+=1;return n.splice(0,16*a),t}finalize(){const e=this;let t=e._buffer;const n=e._h;t=le.concat(t,[le.partial(1,1)]);for(let e=t.length+2;15&e;e++)t.push(0);for(t.push(a.floor(e._length/4294967296)),t.push(0|e._length);t.length;)e._block(t.splice(0,16));return e.reset(),n}_f(e,t,n,r){return e>19?e>39?e>59?e>79?void 0:t^n^r:t&n|t&r|n&r:t^n^r:t&n|~t&r}_S(e,t){return t<>>32-e}_block(e){const n=this,r=n._h,s=t(80);for(let t=0;16>t;t++)s[t]=e[t];let i=r[0],o=r[1],c=r[2],l=r[3],u=r[4];for(let e=0;79>=e;e++){16>e||(s[e]=n._S(1,s[e-3]^s[e-8]^s[e-14]^s[e-16]));const t=n._S(5,i)+n._f(e,o,c,l)+u+s[e]+n._key[a.floor(e/20)]|0;u=l,l=c,c=n._S(30,o),o=i,i=t}r[0]=r[0]+i|0,r[1]=r[1]+o|0,r[2]=r[2]+c|0,r[3]=r[3]+l|0,r[4]=r[4]+u|0}},de={getRandomValues(e){const t=new h(e.buffer),n=e=>{let t=987654321;const n=4294967295;return()=>(t=36969*(65535&t)+(t>>16)&n,(((t<<16)+(e=18e3*(65535&e)+(e>>16)&n)&n)/4294967296+.5)*(a.random()>.5?1:-1))};for(let r,s=0;snew we.hmacSha1(ue.bytes.toBits(e)),pbkdf2(e,t,n,r){if(n=n||1e4,0>r||0>n)throw new d("invalid params to pbkdf2");const s=1+(r>>5)<<2;let i,a,o,c,l;const u=new ArrayBuffer(s),f=new g(u);let w=0;const p=le;for(t=ue.bytes.toBits(t),l=1;(s||1)>w;l++){for(i=a=e.encrypt(p.concat(t,[l])),o=1;n>o;o++)for(a=e.encrypt(a),c=0;cw&&os&&(e=(new n).update(e).finalize());for(let t=0;s>t;t++)r[0][t]=909522486^e[t],r[1][t]=1549556828^e[t];t._baseHash[0].update(r[0]),t._baseHash[1].update(r[1]),t._resultHash=new n(t._baseHash[0])}reset(){const e=this;e._resultHash=new e._hash(e._baseHash[0]),e._updated=!1}update(e){this._updated=!0,this._resultHash.update(e)}digest(){const e=this,t=e._resultHash.finalize(),n=new e._hash(e._baseHash[1]).update(t).finalize();return e.reset(),n}encrypt(e){if(this._updated)throw new d("encrypt on already updated hmac called!");return this.update(e),this.digest(e)}}},pe=typeof z!=Z&&typeof z.getRandomValues==X,he="Invalid password",ge="Invalid signature",me="zipjs-abort-check-password";function ye(e){return pe?z.getRandomValues(e):de.getRandomValues(e)}const be=16,Se={name:"PBKDF2"},ke=n.assign({hash:{name:"HMAC"}},Se),ze=n.assign({iterations:1e3,hash:{name:"SHA-1"}},Se),ve=["deriveBits"],xe=[8,12,16],Ae=[16,24,32],_e=10,Ce=[0,0,0,0],Fe=typeof z!=Z,De=Fe&&z.subtle,Re=Fe&&typeof De!=Z,Ee=ue.bytes,Te=class{constructor(e){const t=this;t._tables=[[[],[],[],[],[]],[[],[],[],[],[]]],t._tables[0][0][0]||t._precompute();const n=t._tables[0][4],r=t._tables[1],s=e.length;let i,a,o,c=1;if(4!==s&&6!==s&&8!==s)throw new d("invalid aes key size");for(t._key=[a=e.slice(0),o=[]],i=s;4*s+28>i;i++){let e=a[i-1];(i%s==0||8===s&&i%s==4)&&(e=n[e>>>24]<<24^n[e>>16&255]<<16^n[e>>8&255]<<8^n[255&e],i%s==0&&(e=e<<8^e>>>24^c<<24,c=c<<1^283*(c>>7))),a[i]=a[i-s]^e}for(let e=0;i;e++,i--){const t=a[3&e?i:i-4];o[e]=4>=i||4>e?t:r[0][n[t>>>24]]^r[1][n[t>>16&255]]^r[2][n[t>>8&255]]^r[3][n[255&t]]}}encrypt(e){return this._crypt(e,0)}decrypt(e){return this._crypt(e,1)}_precompute(){const e=this._tables[0],t=this._tables[1],n=e[4],r=t[4],s=[],i=[];let a,o,c,l;for(let e=0;256>e;e++)i[(s[e]=e<<1^283*(e>>7))^e]=e;for(let u=a=0;!n[u];u^=o||1,a=i[a]||1){let i=a^a<<1^a<<2^a<<3^a<<4;i=i>>8^255&i^99,n[u]=i,r[i]=u,l=s[c=s[o=s[u]]];let f=16843009*l^65537*c^257*o^16843008*u,d=257*s[i]^16843008*i;for(let n=0;4>n;n++)e[n][u]=d=d<<24^d>>>8,t[n][i]=f=f<<24^f>>>8}for(let n=0;5>n;n++)e[n]=e[n].slice(0),t[n]=t[n].slice(0)}_crypt(e,t){if(4!==e.length)throw new d("invalid aes block size");const n=this._key[t],r=n.length/4-2,s=[0,0,0,0],i=this._tables[t],a=i[0],o=i[1],c=i[2],l=i[3],u=i[4];let f,w,p,h=e[0]^n[0],g=e[t?3:1]^n[1],m=e[2]^n[2],y=e[t?1:3]^n[3],b=4;for(let e=0;r>e;e++)f=a[h>>>24]^o[g>>16&255]^c[m>>8&255]^l[255&y]^n[b],w=a[g>>>24]^o[m>>16&255]^c[y>>8&255]^l[255&h]^n[b+1],p=a[m>>>24]^o[y>>16&255]^c[h>>8&255]^l[255&g]^n[b+2],y=a[y>>>24]^o[h>>16&255]^c[g>>8&255]^l[255&m]^n[b+3],b+=4,h=f,g=w,m=p;for(let e=0;4>e;e++)s[t?3&-e:e]=u[h>>>24]<<24^u[g>>16&255]<<16^u[m>>8&255]<<8^u[255&y]^n[b++],f=h,h=g,g=m,m=y,y=f;return s}},We=class{constructor(e,t){this._prf=e,this._initIv=t,this._iv=t}reset(){this._iv=this._initIv}update(e){return this.calculate(this._prf,e,this._iv)}incWord(e){if(255&~(e>>24))e+=1<<24;else{let t=e>>16&255,n=e>>8&255,r=255&e;255===t?(t=0,255===n?(n=0,255===r?r=0:++r):++n):++t,e=0,e+=t<<16,e+=n<<8,e+=r}return e}incCounter(e){0===(e[0]=this.incWord(e[0]))&&(e[1]=this.incWord(e[1]))}calculate(e,t,n){let r;if(!(r=t.length))return[];const s=le.bitLength(t);for(let s=0;r>s;s+=4){this.incCounter(n);const r=e.encrypt(n);t[s]^=r[0],t[s+1]^=r[1],t[s+2]^=r[2],t[s+3]^=r[3]}return le.clamp(t,s)}},Ue=we.hmacSha1;let je=Fe&&Re&&typeof De.importKey==X,Ie=Fe&&Re&&typeof De.deriveBits==X;class Le extends x{constructor({password:e,rawPassword:t,signed:r,encryptionStrength:s,checkPasswordOnly:i}){super({start(){n.assign(this,{ready:new y((e=>this.resolveReady=e)),password:Pe(e,t),signed:r,strength:s-1,pending:new w})},async transform(e,t){const n=this,{password:r,strength:s,resolveReady:a,ready:o}=n;r?(await(async(e,t,n,r)=>{const s=await qe(e,t,n,Ge(r,0,xe[t])),i=Ge(r,xe[t]);if(s[0]!=i[0]||s[1]!=i[1])throw new d(he)})(n,s,r,Ge(e,0,xe[s]+2)),e=Ge(e,xe[s]+2),i?t.error(new d(me)):a()):await o;const c=new w(e.length-_e-(e.length-_e)%be);t.enqueue(Oe(n,e,c,0,_e,!0))},async flush(e){const{signed:t,ctr:n,hmac:r,pending:s,ready:i}=this;if(r&&n){await i;const a=Ge(s,0,s.length-_e),o=Ge(s,s.length-_e);let c=new w;if(a.length){const e=He(Ee,a);r.update(e);const t=n.update(e);c=Be(Ee,t)}if(t){const e=Ge(Be(Ee,r.digest()),0,_e);for(let t=0;_e>t;t++)if(e[t]!=o[t])throw new d(ge)}e.enqueue(c)}}})}}class Ne extends x{constructor({password:e,rawPassword:t,encryptionStrength:r}){let s;super({start(){n.assign(this,{ready:new y((e=>this.resolveReady=e)),password:Pe(e,t),strength:r-1,pending:new w})},async transform(e,t){const n=this,{password:r,strength:s,resolveReady:i,ready:a}=n;let o=new w;r?(o=await(async(e,t,n)=>{const r=ye(new w(xe[t]));return Me(r,await qe(e,t,n,r))})(n,s,r),i()):await a;const c=new w(o.length+e.length-e.length%be);c.set(o,0),t.enqueue(Oe(n,e,c,o.length,0))},async flush(e){const{ctr:t,hmac:n,pending:r,ready:i}=this;if(n&&t){await i;let a=new w;if(r.length){const e=t.update(He(Ee,r));n.update(e),a=Be(Ee,e)}s.signature=Be(Ee,n.digest()).slice(0,_e),e.enqueue(Me(a,s.signature))}}}),s=this}}function Oe(e,t,n,r,s,i){const{ctr:a,hmac:o,pending:c}=e,l=t.length-s;let u;for(c.length&&(t=Me(c,t),n=((e,t)=>{if(t&&t>e.length){const n=e;(e=new w(t)).set(n,0)}return e})(n,l-l%be)),u=0;l-be>=u;u+=be){const e=He(Ee,Ge(t,u,u+be));i&&o.update(e);const s=a.update(e);i||o.update(s),n.set(Be(Ee,s),u+r)}return e.pending=Ge(t,u),n}async function qe(e,r,s,i){e.password=null;const a=await(async(e,t,n,r,s)=>{if(!je)return we.importKey(t);try{return await De.importKey("raw",t,n,!1,s)}catch(e){return je=!1,we.importKey(t)}})(0,s,ke,0,ve),o=await(async(e,t,n)=>{if(!Ie)return we.pbkdf2(t,e.salt,ze.iterations,n);try{return await De.deriveBits(e,t,n)}catch(r){return Ie=!1,we.pbkdf2(t,e.salt,ze.iterations,n)}})(n.assign({salt:i},ze),a,8*(2*Ae[r]+2)),c=new w(o),l=He(Ee,Ge(c,0,Ae[r])),u=He(Ee,Ge(c,Ae[r],2*Ae[r])),f=Ge(c,2*Ae[r]);return n.assign(e,{keys:{key:l,authentication:u,passwordVerification:f},ctr:new We(new Te(l),t.from(Ce)),hmac:new Ue(u)}),f}function Pe(e,t){return t===K?ce(e):t}function Me(e,t){let n=e;return e.length+t.length&&(n=new w(e.length+t.length),n.set(e,0),n.set(t,e.length)),n}function Ge(e,t,n){return e.subarray(t,n)}function Be(e,t){return e.fromBits(t)}function He(e,t){return e.toBits(t)}class Ve extends x{constructor({password:e,passwordVerification:t,checkPasswordOnly:r}){super({start(){n.assign(this,{password:e,passwordVerification:t}),Ye(this,e)},transform(e,t){const n=this;if(n.password){const t=Ze(n,e.subarray(0,12));if(n.password=null,t[11]!=n.passwordVerification)throw new d(he);e=e.subarray(12)}r?t.error(new d(me)):t.enqueue(Ze(n,e))}})}}class Ke extends x{constructor({password:e,passwordVerification:t}){super({start(){n.assign(this,{password:e,passwordVerification:t}),Ye(this,e)},transform(e,t){const n=this;let r,s;if(n.password){n.password=null;const t=ye(new w(12));t[11]=n.passwordVerification,r=new w(e.length+t.length),r.set(Xe(n,t),0),s=12}else r=new w(e.length),s=0;r.set(Xe(n,e),s),t.enqueue(r)}})}}function Ze(e,t){const n=new w(t.length);for(let r=0;r>>24]),s=~e.crcKey2.get(),e.keys=[n,r,s]}function Je(e){const t=2|e.keys[2];return $e(a.imul(t,1^t)>>>8)}function $e(e){return 255&e}function et(e){return 4294967295&e}const tt="deflate-raw";class nt extends x{constructor(e,{chunkSize:t,CompressionStream:n,CompressionStreamNative:r}){super({});const{compressed:s,encrypted:i,useCompressionStream:a,zipCrypto:o,signed:c,level:l}=e,u=this;let f,d,w=st(super.readable);i&&!o||!c||(f=new oe,w=ot(w,f)),s&&(w=at(w,a,{level:l,chunkSize:t},r,n)),i&&(o?w=ot(w,new Ke(e)):(d=new Ne(e),w=ot(w,d))),it(u,w,(()=>{let e;i&&!o&&(e=d.signature),i&&!o||!c||(e=new g(f.value.buffer).getUint32(0)),u.signature=e}))}}class rt extends x{constructor(e,{chunkSize:t,DecompressionStream:n,DecompressionStreamNative:r}){super({});const{zipCrypto:s,encrypted:i,signed:a,signature:o,compressed:c,useCompressionStream:l}=e;let u,f,w=st(super.readable);i&&(s?w=ot(w,new Ve(e)):(f=new Le(e),w=ot(w,f))),c&&(w=at(w,l,{chunkSize:t},r,n)),i&&!s||!a||(u=new oe,w=ot(w,u)),it(this,w,(()=>{if((!i||s)&&a){const e=new g(u.value.buffer);if(o!=e.getUint32(0,!1))throw new d(ge)}}))}}function st(e){return ot(e,new x({transform(e,t){e&&e.length&&t.enqueue(e)}}))}function it(e,t,r){t=ot(t,new x({flush:r})),n.defineProperty(e,"readable",{get:()=>t})}function at(e,t,n,r,s){try{e=ot(e,new(t&&r?r:s)(tt,n))}catch(r){if(!t)return e;try{e=ot(e,new s(tt,n))}catch(t){return e}}return e}function ot(e,t){return e.pipeThrough(t)}const ct="data",lt="close",ut="deflate",ft="inflate";class dt extends x{constructor(e,t){super({});const r=this,{codecType:s}=e;let i;s.startsWith(ut)?i=nt:s.startsWith(ft)&&(i=rt);let a=0,o=0;const c=new i(e,t),l=super.readable,u=new x({transform(e,t){e&&e.length&&(o+=e.length,t.enqueue(e))},flush(){n.assign(r,{inputSize:o})}}),f=new x({transform(e,t){e&&e.length&&(a+=e.length,t.enqueue(e))},flush(){const{signature:e}=c;n.assign(r,{signature:e,outputSize:a,inputSize:o})}});n.defineProperty(r,"readable",{get:()=>l.pipeThrough(u).pipeThrough(c).pipeThrough(f)})}}class wt extends x{constructor(e){let t;super({transform:function n(r,s){if(t){const e=new w(t.length+r.length);e.set(t),e.set(r,t.length),r=e,t=null}r.length>e?(s.enqueue(r.slice(0,e)),n(r.slice(e),s)):t=r},flush(e){t&&t.length&&e.enqueue(t)}})}}let pt=typeof R!=Z;class ht{constructor(e,{readable:t,writable:r},{options:s,config:i,streamOptions:a,useWebWorkers:o,transferStreams:c,scripts:l},u){const{signal:f}=a;return n.assign(e,{busy:!0,readable:t.pipeThrough(new wt(i.chunkSize)).pipeThrough(new gt(t,a),{signal:f}),writable:r,options:n.assign({},s),scripts:l,transferStreams:c,terminate:()=>new y((t=>{const{worker:n,busy:r}=e;n?(r?e.resolveTerminated=t:(n.terminate(),t()),e.interface=null):t()})),onTaskFinished(){const{resolveTerminated:t}=e;t&&(e.resolveTerminated=null,e.terminated=!0,e.worker.terminate(),t()),e.busy=!1,u(e)}}),(o&&pt?bt:yt)(e,i)}}class gt extends x{constructor(e,{onstart:t,onprogress:n,size:r,onend:s}){let i=0;super({async start(){t&&await mt(t,r)},async transform(e,t){i+=e.length,n&&await mt(n,i,r),t.enqueue(e)},async flush(){e.size=i,s&&await mt(s,i)}})}}async function mt(e,...t){try{await e(...t)}catch(e){}}function yt(e,t){return{run:()=>(async({options:e,readable:t,writable:n,onTaskFinished:r},s)=>{try{const r=new dt(e,s);await t.pipeThrough(r).pipeTo(n,{preventClose:!0,preventAbort:!0});const{signature:i,inputSize:a,outputSize:o}=r;return{signature:i,inputSize:a,outputSize:o}}finally{r()}})(e,t)}}function bt(e,t){const{baseURL:r,chunkSize:s}=t;if(!e.interface){let i;try{i=((e,t,r)=>{const s={type:"module"};let i,a;typeof e==X&&(e=e());try{i=new f(e,t)}catch(t){i=e}if(St)try{a=new R(i)}catch(e){St=!1,a=new R(i,s)}else a=new R(i,s);return a.addEventListener("message",(e=>(async({data:e},t)=>{const{type:r,value:s,messageId:i,result:a,error:o}=e,{reader:c,writer:l,resolveResult:u,rejectResult:f,onTaskFinished:p}=t;try{if(o){const{message:e,stack:t,code:r,name:s}=o,i=new d(e);n.assign(i,{stack:t,code:r,name:s}),h(i)}else{if("pull"==r){const{value:e,done:n}=await c.read();zt({type:ct,value:e,done:n,messageId:i},t)}r==ct&&(await l.ready,await l.write(new w(s)),zt({type:"ack",messageId:i},t)),r==lt&&h(null,a)}}catch(o){zt({type:lt,messageId:i},t),h(o)}function h(e,t){e?f(e):u(t),l&&l.releaseLock(),p()}})(e,r))),a})(e.scripts[0],r,e)}catch(n){return pt=!1,yt(e,t)}n.assign(e,{worker:i,interface:{run:()=>(async(e,t)=>{let r,s;const i=new y(((e,t)=>{r=e,s=t}));n.assign(e,{reader:null,writer:null,resolveResult:r,rejectResult:s,result:i});const{readable:a,options:o,scripts:c}=e,{writable:l,closed:u}=(e=>{let t;const n=new y((e=>t=e));return{writable:new _({async write(t){const n=e.getWriter();await n.ready,await n.write(t),n.releaseLock()},close(){t()},abort:t=>e.getWriter().abort(t)}),closed:n}})(e.writable),f=zt({type:"start",scripts:c.slice(1),options:o,config:t,readable:a,writable:l},e);f||n.assign(e,{reader:a.getReader(),writer:l.getWriter()});const d=await i;return f||await l.getWriter().close(),await u,d})(e,{chunkSize:s})}})}return e.interface}let St=!0,kt=!0;function zt(e,{worker:t,writer:n,onTaskFinished:r,transferStreams:s}){try{let{value:n,readable:r,writable:i}=e;const a=[];if(n&&(n.byteLength{const n=vt.find((e=>!e.busy));if(n)return Ct(n),new ht(n,e,t,h);if(vt.lengthxt.push({resolve:n,stream:e,workerOptions:t})))})()).run();function h(e){if(xt.length){const[{resolve:t,stream:n,workerOptions:r}]=xt.splice(0,1);t(new ht(e,n,r,h))}else e.worker?(Ct(e),((e,t)=>{const{config:n}=t,{terminateWorkerTimeout:r}=n;s.isFinite(r)&&r>=0&&(e.terminated?e.terminated=!1:e.terminateTimeout=setTimeout((async()=>{vt=vt.filter((t=>t!=e));try{await e.terminate()}catch(e){}}),r))})(e,t)):vt=vt.filter((t=>t!=e))}}function Ct(e){const{terminateTimeout:t}=e;t&&(clearTimeout(t),e.terminateTimeout=null)}const Ft="HTTP error ",Dt="HTTP Range not supported",Rt="Writer iterator completed too soon",Et="Content-Length",Tt="Range",Wt="HEAD",Ut="GET",jt="bytes",It=65536,Lt="writable";class Nt{constructor(){this.size=0}init(){this.initialized=!0}}class Ot extends Nt{get readable(){const e=this,{chunkSize:t=It}=e,n=new A({start(){this.chunkOffset=0},async pull(r){const{offset:s=0,size:i,diskNumberStart:o}=n,{chunkOffset:c}=this;r.enqueue(await ln(e,s+c,a.min(t,i-c),o)),c+t>i?r.close():this.chunkOffset+=t}});return n}}class qt extends Nt{constructor(){super();const e=this,t=new _({write:t=>e.writeUint8Array(t)});n.defineProperty(e,Lt,{get:()=>t})}writeUint8Array(){}}class Pt extends Ot{constructor(e){super(),n.assign(this,{blob:e,size:e.size})}async readUint8Array(e,t){const n=this,r=e+t,s=e||rt&&(i=i.slice(e,r)),new w(i)}}class Mt extends Nt{constructor(e){super();const t=new x,r=[];e&&r.push(["Content-Type",e]),n.defineProperty(this,Lt,{get:()=>t.writable}),this.blob=new u(t.readable,{headers:r}).blob()}getData(){return this.blob}}class Gt extends Ot{constructor(e,t){super(),Ht(this,e,t)}async init(){await Vt(this,en,Yt),super.init()}readUint8Array(e,t){return Kt(this,e,t,en,Yt)}}class Bt extends Ot{constructor(e,t){super(),Ht(this,e,t)}async init(){await Vt(this,tn,Qt),super.init()}readUint8Array(e,t){return Kt(this,e,t,tn,Qt)}}function Ht(e,t,r){const{preventHeadRequest:s,useRangeHeader:i,forceRangeRequests:a,combineSizeEocd:o}=r;delete(r=n.assign({},r)).preventHeadRequest,delete r.useRangeHeader,delete r.forceRangeRequests,delete r.combineSizeEocd,delete r.useXHR,n.assign(e,{url:t,options:r,preventHeadRequest:s,useRangeHeader:i,forceRangeRequests:a,combineSizeEocd:o})}async function Vt(e,t,n){const{url:r,preventHeadRequest:i,useRangeHeader:a,forceRangeRequests:o,combineSizeEocd:c}=e;if((e=>{const{baseURL:t}=ee(),{protocol:n}=new f(e,t);return"http:"==n||"https:"==n})(r)&&(a||o)&&(void 0===i||i)){const r=await t(Ut,e,Zt(e,c?-22:void 0));if(!o&&r.headers.get("Accept-Ranges")!=jt)throw new d(Dt);{let i;c&&(e.eocdCache=new w(await r.arrayBuffer()));const a=r.headers.get("Content-Range");if(a){const e=a.trim().split(/\s*\/\s*/);if(e.length){const t=e[1];t&&"*"!=t&&(i=s(t))}}i===K?await $t(e,t,n):e.size=i}}else await $t(e,t,n)}async function Kt(e,t,n,r,s){const{useRangeHeader:i,forceRangeRequests:a,eocdCache:o,size:c,options:l}=e;if(i||a){if(o&&t==c-P&&n==P)return o;const s=await r(Ut,e,Zt(e,t,n));if(206!=s.status)throw new d(Dt);return new w(await s.arrayBuffer())}{const{data:r}=e;return r||await s(e,l),new w(e.data.subarray(t,t+n))}}function Zt(e,t=0,r=1){return n.assign({},Xt(e),{[Tt]:jt+"="+(0>t?t:t+"-"+(t+r-1))})}function Xt({options:e}){const{headers:t}=e;if(t)return Symbol.iterator in t?n.fromEntries(t):t}async function Yt(e){await Jt(e,en)}async function Qt(e){await Jt(e,tn)}async function Jt(e,t){const n=await t(Ut,e,Xt(e));e.data=new w(await n.arrayBuffer()),e.size||(e.size=e.data.length)}async function $t(e,t,n){if(e.preventHeadRequest)await n(e,e.options);else{const r=(await t(Wt,e,Xt(e))).headers.get(Et);r?e.size=s(r):await n(e,e.options)}}async function en(e,{options:t,url:r},s){const i=await fetch(r,n.assign({},t,{method:e,headers:s}));if(400>i.status)return i;throw 416==i.status?new d(Dt):new d(Ft+(i.statusText||i.status))}function tn(e,{url:t},r){return new y(((s,i)=>{const a=new XMLHttpRequest;if(a.addEventListener("load",(()=>{if(400>a.status){const e=[];a.getAllResponseHeaders().trim().split(/[\r\n]+/).forEach((t=>{const n=t.trim().split(/\s*:\s*/);n[0]=n[0].trim().replace(/^[a-z]|-[a-z]/g,(e=>e.toUpperCase())),e.push(n)})),s({status:a.status,arrayBuffer:()=>a.response,headers:new c(e)})}else i(416==a.status?new d(Dt):new d(Ft+(a.statusText||a.status)))}),!1),a.addEventListener("error",(e=>i(e.detail?e.detail.error:new d("Network error"))),!1),a.open(e,t),r)for(const e of n.entries(r))a.setRequestHeader(e[0],e[1]);a.responseType="arraybuffer",a.send()}))}class nn extends Ot{constructor(e,t={}){super(),n.assign(this,{url:e,reader:t.useXHR?new Bt(e,t):new Gt(e,t)})}set size(e){}get size(){return this.reader.size}async init(){await this.reader.init(),super.init()}readUint8Array(e,t){return this.reader.readUint8Array(e,t)}}class rn extends Ot{constructor(e){super(),this.readers=e}async init(){const e=this,{readers:t}=e;e.lastDiskNumber=0,e.lastDiskOffset=0,await y.all(t.map((async(n,r)=>{await n.init(),r!=t.length-1&&(e.lastDiskOffset+=n.size),e.size+=n.size}))),super.init()}async readUint8Array(e,t,n=0){const r=this,{readers:s}=this;let i,o=n;-1==o&&(o=s.length-1);let c=e;for(;c>=s[o].size;)c-=s[o].size,o++;const l=s[o],u=l.size;if(c+t>u){const s=u-c;i=new w(t),i.set(await ln(l,c,s)),i.set(await r.readUint8Array(e+s,t-s,n),s)}else i=await ln(l,c,t);return r.lastDiskNumber=a.max(o,r.lastDiskNumber),i}}class sn extends Nt{constructor(e,t=4294967295){super();const r=this;let s,i,a;n.assign(r,{diskNumber:0,diskOffset:0,size:0,maxSize:t,availableSize:t});const o=new _({async write(t){const{availableSize:n}=r;if(a)t.lengtho})}}async function an(e,t){if(!e.init||e.initialized)return y.resolve();await e.init(t)}function on(e){return t.isArray(e)&&(e=new rn(e)),e instanceof A&&(e={readable:e}),e}function cn(e){e.writable===K&&typeof e.next==X&&(e=new sn(e)),e instanceof _&&(e={writable:e});const{writable:t}=e;return t.size===K&&(t.size=0),e instanceof sn||n.assign(e,{diskNumber:0,diskOffset:0,availableSize:1/0,maxSize:1/0}),e}function ln(e,t,n,r){return e.readUint8Array(t,n,r)}const un=rn,fn=sn,dn="\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ".split(""),wn=256==dn.length;function pn(e,t){return t&&"cp437"==t.trim().toLowerCase()?(e=>{if(wn){let t="";for(let n=0;nthis[t]=e[t]))}}const Wn="File format is not recognized",Un="End of central directory not found",jn="End of Zip64 central directory locator not found",In="Central directory header not found",Ln="Local file header not found",Nn="Zip64 extra field not found",On="File contains encrypted entry",qn="Encryption method not supported",Pn="Compression method not supported",Mn="Split zip file",Gn="utf-8",Bn="cp437",Hn=[[bn,T],[Sn,T],[kn,T],[zn,W]],Vn={[W]:{getValue:rr,bytes:4},[T]:{getValue:sr,bytes:8}};class Kn{constructor(e,t={}){n.assign(this,{reader:on(e),options:t,config:ee()})}async*getEntriesGenerator(e={}){const t=this;let{reader:r}=t;const{config:s}=t;if(await an(r),r.size!==K&&r.readUint8Array||(r=new Pt(await new u(r.readable).blob()),await an(r)),r.size{const r=new w(4);var s;return s=t,ir(r).setUint32(0,s,!0),await i(22)||await i(a.min(1048582,n));async function i(t){const s=n-t,i=await ln(e,s,t);for(let e=i.length-22;e>=0;e--)if(i[e]==r[0]&&i[e+1]==r[1]&&i[e+2]==r[2]&&i[e+3]==r[3])return{offset:s+e,buffer:i.slice(e,e+22).buffer}}})(r,N,r.size);if(!i)throw rr(ir(await ln(r,0,4)))==j?new d(Mn):new d(Un);const o=ir(i);let c=rr(o,12),l=rr(o,16);const f=i.offset,p=nr(o,20),h=f+P+p;let g=nr(o,4);const m=r.lastDiskNumber||0;let y=nr(o,6),b=nr(o,8),S=0,k=0;if(l==T||c==T||b==W||y==W){const e=ir(await ln(r,i.offset-20,20));if(rr(e,0)==q){l=sr(e,8);let t=await ln(r,l,56,-1),n=ir(t);const s=i.offset-20-56;if(rr(n,0)!=O&&l!=s){const e=l;l=s,S=l-e,t=await ln(r,l,56,-1),n=ir(t)}if(rr(n,0)!=O)throw new d(jn);g==W&&(g=rr(n,16)),y==W&&(y=rr(n,20)),b==W&&(b=sr(n,32)),c==T&&(c=sr(n,40)),l-=c}}if(ll)throw new d(Wn);let z=0,v=await ln(r,l,c,y),x=ir(v);if(c){const e=i.offset-c;if(rr(x,z)!=L&&l!=e){const t=l;l=e,S+=l-t,v=await ln(r,l,c,y),x=ir(v)}}const A=i.offset-l-(r.lastDiskOffset||0);if(c==A||0>A||(c=A,v=await ln(r,l,c,y),x=ir(v)),0>l||l>=r.size)throw new d(Wn);const _=Jn(t,e,"filenameEncoding"),C=Jn(t,e,"commentEncoding");for(let i=0;b>i;i++){const o=new Zn(r,s,t.options);if(rr(x,z)!=L)throw new d(In);Xn(o,x,z+6);const c=!!o.bitFlag.languageEncodingFlag,l=z+46,u=l+o.filenameLength,f=u+o.extraFieldLength,w=nr(x,z+4),p=!0,h=v.subarray(l,u),g=nr(x,z+32),m=f+g,y=v.subarray(f,m),A=c,F=c,D=p&&!(16&~tr(x,z+38)),R=rr(x,z+42)+S;n.assign(o,{versionMadeBy:w,msDosCompatible:p,compressedSize:0,uncompressedSize:0,commentLength:g,directory:D,offset:R,diskNumberStart:nr(x,z+34),internalFileAttribute:nr(x,z+36),externalFileAttribute:rr(x,z+38),rawFilename:h,filenameUTF8:A,commentUTF8:F,rawExtraField:v.subarray(u,f)});const E=Jn(t,e,"decodeText")||pn,T=A?Gn:_||Bn,W=F?Gn:C||Bn;let U=E(h,T);U===K&&(U=pn(h,T));let j=E(y,W);j===K&&(j=pn(y,W)),n.assign(o,{rawComment:y,filename:U,comment:j,directory:D||U.endsWith(B)}),k=a.max(R,k),await Yn(o,o,x,z+6);const I=new Tn(o);I.getData=(e,t)=>o.getData(e,I,t),z=m;const{onprogress:N}=e;if(N)try{await N(i+1,b,new Tn(o))}catch(e){}yield I}const F=Jn(t,e,"extractPrependedData"),D=Jn(t,e,"extractAppendedData");return F&&(t.prependedData=k>0?await ln(r,0,k):new w),t.comment=p?await ln(r,f+P,p):new w,D&&(t.appendedData=h>>8&255:p>>>24&255),signature:p,compressed:0!=l,encrypted:z,useWebWorkers:Jn(s,r,"useWebWorkers"),useCompressionStream:Jn(s,r,"useCompressionStream"),transferStreams:Jn(s,r,"transferStreams"),checkPasswordOnly:D},config:u,streamOptions:{signal:F,size:A,onstart:E,onprogress:T,onend:W}};let I=0;try{({outputSize:I}=await _t({readable:C,writable:R},j))}catch(e){if(!D||e.message!=me)throw e}finally{const e=Jn(s,r,"preventClose");R.size+=I,e||R.locked||await R.getWriter().close()}return D?K:e.getData?e.getData():R}}function Xn(e,t,r){const s=e.rawBitFlag=nr(t,r+2),i=!(1&~s),a=rr(t,r+6);n.assign(e,{encrypted:i,version:nr(t,r),bitFlag:{level:(6&s)>>1,dataDescriptor:!(8&~s),languageEncodingFlag:(s&G)==G},rawLastModDate:a,lastModDate:$n(a),filenameLength:nr(t,r+22),extraFieldLength:nr(t,r+24)})}async function Yn(e,t,r,s,i){const{rawExtraField:a}=t,l=t.extraField=new c,u=ir(new w(a));let f=0;try{for(;f{t.zip64=!0;const n=ir(e.data),r=Hn.filter((([e,n])=>t[e]==n));for(let s=0,i=0;s{const s=ir(e.data),i=tr(s,4);n.assign(e,{vendorVersion:tr(s,0),vendorId:tr(s,2),strength:i,originalCompressionMethod:r,compressionMethod:nr(s,5)}),t.compressionMethod=e.compressionMethod})(y,t,p),t.extraFieldAES=y):t.compressionMethod=p;const b=l.get(10);b&&(((e,t)=>{const r=ir(e.data);let s,i=4;try{for(;i{const r=ir(e.data),s=tr(r,0),i=[],a=[];n?(1&~s||(i.push(vn),a.push(xn)),2&~s||(i.push(An),a.push("rawLastAccessDate")),4&~s||(i.push(_n),a.push("rawCreationDate"))):5>e.data.length||(i.push(vn),a.push(xn));let c=1;i.forEach(((n,s)=>{if(e.data.length>=c+4){const i=rr(r,c);t[n]=e[n]=new o(1e3*i);const l=a[s];e[l]=i}c+=4}))})(S,t,i),t.extraFieldExtendedTimestamp=S);const k=l.get(6534);k&&(t.extraFieldUSDZ=k)}async function Qn(e,t,r,s,i){const a=ir(e.data),o=new ae;o.append(i[r]);const c=ir(new w(4));c.setUint32(0,o.get(),!0);const l=rr(a,1);n.assign(e,{version:tr(a,0),[t]:pn(e.data.subarray(5)),valid:!i.bitFlag.languageEncodingFlag&&l==rr(c,0)}),e.valid&&(s[t]=e[t],s[t+"UTF8"]=!0)}function Jn(e,t,n){return t[n]===K?e.options[n]:t[n]}function $n(e){const t=(4294901760&e)>>16,n=65535&e;try{return new o(1980+((65024&t)>>9),((480&t)>>5)-1,31&t,(63488&n)>>11,(2016&n)>>5,2*(31&n),0)}catch(e){}}function er(e){return new o(s(e/i(1e4)-i(116444736e5)))}function tr(e,t){return e.getUint8(t)}function nr(e,t){return e.getUint16(t,!0)}function rr(e,t){return e.getUint32(t,!0)}function sr(e,t){return s(e.getBigUint64(t,!0))}function ir(e){return new g(e.buffer)}const ar="File already exists",or="Zip file comment exceeds 64KB",cr="File entry comment exceeds 64KB",lr="File entry name exceeds 64KB",ur="Version exceeds 65535",fr="The strength must equal 1, 2, or 3",dr="Extra field type exceeds 65535",wr="Extra field data exceeds 64KB",pr="Zip64 is not supported (make sure 'keepOrder' is set to 'true')",hr=new w([7,0,2,0,65,69,3,0,0]);let gr=0;const mr=[];class yr{constructor(e,t={}){const r=(e=cn(e)).availableSize!==K&&e.availableSize>0&&e.availableSize!==1/0&&e.maxSize!==K&&e.maxSize>0&&e.maxSize!==1/0;n.assign(this,{writer:e,addSplitZipSignature:r,options:t,config:ee(),files:new c,filenames:new l,offset:e.writable.size,pendingEntriesSize:0,pendingAddFileCalls:new l,bufferedWrites:0})}async add(e="",r,s={}){const c=this,{pendingAddFileCalls:l,config:f}=c;let m;grmr.push(e)));try{if(e=e.trim(),c.filenames.has(e))throw new d(ar);return c.filenames.add(e),m=(async(e,r,s,c)=>{r=r.trim(),c.directory&&!r.endsWith(B)?r+=B:c.directory=r.endsWith(B);const l=kr(e,c,"encodeText",ce);let f=l(r);if(f===K&&(f=ce(r)),Fr(f)>W)throw new d(lr);const m=c.comment||"";let b=l(m);if(b===K&&(b=ce(m)),Fr(b)>W)throw new d(cr);const S=kr(e,c,"version",20);if(S>W)throw new d(ur);const k=kr(e,c,"versionMadeBy",20);if(k>W)throw new d(ur);const z=kr(e,c,vn,new o),v=kr(e,c,An),A=kr(e,c,_n),_=kr(e,c,Dn,!0),C=kr(e,c,Cn,0),F=kr(e,c,Fn,0),D=kr(e,c,"password"),R=kr(e,c,"rawPassword"),E=kr(e,c,"encryptionStrength",3),L=kr(e,c,"zipCrypto"),N=kr(e,c,"extendedTimestamp",!0),O=kr(e,c,"keepOrder",!0),q=kr(e,c,"level"),P=kr(e,c,"useWebWorkers"),Z=kr(e,c,"bufferedWrite"),X=kr(e,c,"dataDescriptorSignature",!1),Y=kr(e,c,"signal"),Q=kr(e,c,"useCompressionStream");let J=kr(e,c,"dataDescriptor",!0),$=kr(e,c,Rn);if(D!==K&&E!==K&&(1>E||E>3))throw new d(fr);let ee=new w;const{extraField:ne}=c;if(ne){let e=0,t=0;ne.forEach((t=>e+=4+Fr(t))),ee=new w(e),ne.forEach(((e,n)=>{if(n>W)throw new d(dr);if(Fr(e)>W)throw new d(wr);_r(ee,new p([n]),t),_r(ee,new p([Fr(e)]),t+2),_r(ee,e,t+4),t+=4+Fr(e)}))}let re=0,se=0,ie=0;const ae=!0===$;s&&(s=on(s),await an(s),s.size===K?(J=!0,($||$===K)&&($=!0,ie=re=4294967296)):(ie=s.size,re=(e=>e+5*(a.floor(e/16383)+1))(ie)));const{diskOffset:oe,diskNumber:le,maxSize:ue}=e.writer,fe=ae||ie>T,de=ae||re>T,we=ae||e.offset+e.pendingEntriesSize-oe>T,pe=kr(e,c,"supportZip64SplitFile",!0)&&ae||le+a.ceil(e.pendingEntriesSize/ue)>W;if(we||fe||de||pe){if(!1===$||!O)throw new d(pr);$=!0}$=$||!1;const he=(e=>{const{rawFilename:t,lastModDate:n,lastAccessDate:r,creationDate:s,rawPassword:i,password:o,level:c,zip64:l,zipCrypto:u,dataDescriptor:f,directory:d,rawExtraField:p,encryptionStrength:g,extendedTimestamp:m}=e,y=0!==c&&!d,b=!!(o&&Fr(o)||i&&Fr(i));let S,k,z,v,x=e.version;if(b&&!u){S=new w(Fr(hr)+2);const e=Cr(S);vr(e,0,39169),_r(S,hr,2),zr(e,8,g)}else S=new w;if(m){z=new w(9+(r?4:0)+(s?4:0));const e=Cr(z);vr(e,0,M),vr(e,2,Fr(z)-4),v=1+(r?2:0)+(s?4:0),zr(e,4,v);let t=5;xr(e,t,a.floor(n.getTime()/1e3)),t+=4,r&&(xr(e,t,a.floor(r.getTime()/1e3)),t+=4),s&&xr(e,t,a.floor(s.getTime()/1e3));try{k=new w(36);const e=Cr(k),t=Sr(n);vr(e,0,10),vr(e,2,32),vr(e,8,1),vr(e,10,24),Ar(e,12,t),Ar(e,20,Sr(r)||t),Ar(e,28,Sr(s)||t)}catch(e){k=new w}}else k=z=new w;let A=G;f&&(A|=8);let _=0;y&&(_=8),l&&(x=x>45?x:45),b&&(A|=1,u||(x=x>51?x:51,_=99,y&&(S[9]=8)));const C=new w(26),F=Cr(C);vr(F,0,x),vr(F,2,A),vr(F,4,_);const D=new h(1),R=Cr(D);let E;E=V>n?V:n>H?H:n,vr(R,0,(E.getHours()<<6|E.getMinutes())<<5|E.getSeconds()/2),vr(R,2,(E.getFullYear()-1980<<4|E.getMonth()+1)<<5|E.getDate());const T=D[0];xr(F,6,T),vr(F,22,Fr(t));const W=Fr(S,z,k,p);vr(F,24,W);const j=new w(30+Fr(t)+W);return xr(Cr(j),0,U),_r(j,C,4),_r(j,t,30),_r(j,S,30+Fr(t)),_r(j,z,30+Fr(t,S)),_r(j,k,30+Fr(t,S,z)),_r(j,p,30+Fr(t,S,z,k)),{localHeaderArray:j,headerArray:C,headerView:F,lastModDate:n,rawLastModDate:T,encrypted:b,compressed:y,version:x,compressionMethod:_,extraFieldExtendedTimestampFlag:v,rawExtraFieldExtendedTimestamp:z,rawExtraFieldNTFS:k,rawExtraFieldAES:S,extraFieldLength:W}})(c=n.assign({},c,{rawFilename:f,rawComment:b,version:S,versionMadeBy:k,lastModDate:z,lastAccessDate:v,creationDate:A,rawExtraField:ee,zip64:$,zip64UncompressedSize:fe,zip64CompressedSize:de,zip64Offset:we,zip64DiskNumberStart:pe,password:D,rawPassword:R,level:Q||e.config.CompressionStream!==K||e.config.CompressionStreamNative!==K?q:0,useWebWorkers:P,encryptionStrength:E,extendedTimestamp:N,zipCrypto:L,bufferedWrite:Z,keepOrder:O,dataDescriptor:J,dataDescriptorSignature:X,signal:Y,msDosCompatible:_,internalFileAttribute:C,externalFileAttribute:F,useCompressionStream:Q})),ge=(e=>{const{zip64:t,dataDescriptor:n,dataDescriptorSignature:r}=e;let s,i=new w,a=0;return n&&(i=new w(t?r?24:20:r?16:12),s=Cr(i),r&&(a=4,xr(s,0,I))),{dataDescriptorArray:i,dataDescriptorView:s,dataDescriptorOffset:a}})(c),me=Fr(he.localHeaderArray,ge.dataDescriptorArray);let ye;se=me+re,e.options.usdz&&(se+=se+64),e.pendingEntriesSize+=se;try{ye=await(async(e,r,s,a,o)=>{const{files:c,writer:l}=e,{keepOrder:f,dataDescriptor:p,signal:h}=o,{headerInfo:m}=a,{usdz:b}=e.options,S=t.from(c.values()).pop();let k,z,v,A,_,C,F,D={};c.set(r,D);try{let t;f&&(t=S&&S.lock,D.lock=new y((e=>v=e))),!(o.bufferedWrite||e.writerLocked||e.bufferedWrites&&f)&&p||b?(C=l,await R()):(C=new x,F=new u(C.readable).blob(),C.writable.size=0,k=!0,e.bufferedWrites++,await an(l)),await an(C);const{writable:m}=l;let{diskOffset:z}=l;if(e.addSplitZipSignature){delete e.addSplitZipSignature;const t=new w(4);xr(Cr(t),0,j),await br(m,t),e.offset+=4}b&&((e,t)=>{const{headerInfo:n}=e;let{localHeaderArray:r,extraFieldLength:s}=n,i=Cr(r),a=64-(t+Fr(r))%64;4>a&&(a+=64);const o=new w(a),c=Cr(o);vr(c,0,6534),vr(c,2,a-2);const l=r;n.localHeaderArray=r=new w(Fr(l)+a),_r(r,l),_r(r,o,Fr(l)),i=Cr(r),vr(i,28,s+a),e.metadataSize+=a})(a,e.offset-z),k||(await t,await E(m));const{diskNumber:W}=l;if(_=!0,D.diskNumberStart=W,D=await(async(e,t,{diskNumberStart:r,lock:s},a,o,c)=>{const{headerInfo:l,dataDescriptorInfo:u,metadataSize:f}=a,{localHeaderArray:d,headerArray:p,lastModDate:h,rawLastModDate:g,encrypted:m,compressed:y,version:b,compressionMethod:S,rawExtraFieldExtendedTimestamp:k,extraFieldExtendedTimestampFlag:z,rawExtraFieldNTFS:v,rawExtraFieldAES:x}=l,{dataDescriptorArray:A}=u,{rawFilename:_,lastAccessDate:C,creationDate:F,password:D,rawPassword:R,level:E,zip64:W,zip64UncompressedSize:U,zip64CompressedSize:j,zip64Offset:I,zip64DiskNumberStart:L,zipCrypto:N,dataDescriptor:O,directory:q,versionMadeBy:P,rawComment:M,rawExtraField:G,useWebWorkers:B,onstart:H,onprogress:V,onend:Z,signal:X,encryptionStrength:Y,extendedTimestamp:Q,msDosCompatible:J,internalFileAttribute:$,externalFileAttribute:ee,useCompressionStream:ne}=c,re={lock:s,versionMadeBy:P,zip64:W,directory:!!q,filenameUTF8:!0,rawFilename:_,commentUTF8:!0,rawComment:M,rawExtraFieldExtendedTimestamp:k,rawExtraFieldNTFS:v,rawExtraFieldAES:x,rawExtraField:G,extendedTimestamp:Q,msDosCompatible:J,internalFileAttribute:$,externalFileAttribute:ee,diskNumberStart:r};let se,ie=0,ae=0;const{writable:oe}=t;if(e){e.chunkSize=te(o),await br(oe,d);const t=e.readable,n=t.size=e.size,r={options:{codecType:ut,level:E,rawPassword:R,password:D,encryptionStrength:Y,zipCrypto:m&&N,passwordVerification:m&&N&&g>>8&255,signed:!0,compressed:y,encrypted:m,useWebWorkers:B,useCompressionStream:ne,transferStreams:!1},config:o,streamOptions:{signal:X,size:n,onstart:H,onprogress:V,onend:Z}},s=await _t({readable:t,writable:oe},r);ae=s.inputSize,ie=s.outputSize,se=s.signature,oe.size+=ae}else await br(oe,d);let ce;if(W){let e=4;U&&(e+=8),j&&(e+=8),I&&(e+=8),L&&(e+=4),ce=new w(e)}else ce=new w;return((e,t)=>{const{signature:n,rawExtraFieldZip64:r,compressedSize:s,uncompressedSize:a,headerInfo:o,dataDescriptorInfo:c}=e,{headerView:l,encrypted:u}=o,{dataDescriptorView:f,dataDescriptorOffset:d}=c,{zip64:w,zip64UncompressedSize:p,zip64CompressedSize:h,zipCrypto:g,dataDescriptor:m}=t;if(u&&!g||n===K||(xr(l,10,n),m&&xr(f,d,n)),w){const e=Cr(r);vr(e,0,1),vr(e,2,Fr(r)-4);let t=4;p&&(xr(l,18,T),Ar(e,t,i(a)),t+=8),h&&(xr(l,14,T),Ar(e,t,i(s))),m&&(Ar(f,d+4,i(s)),Ar(f,d+12,i(a)))}else xr(l,14,s),xr(l,18,a),m&&(xr(f,d+4,s),xr(f,d+8,a))})({signature:se,rawExtraFieldZip64:ce,compressedSize:ie,uncompressedSize:ae,headerInfo:l,dataDescriptorInfo:u},c),O&&await br(oe,A),n.assign(re,{uncompressedSize:ae,compressedSize:ie,lastModDate:h,rawLastModDate:g,creationDate:F,lastAccessDate:C,encrypted:m,size:f+ie,compressionMethod:S,version:b,headerArray:p,signature:se,rawExtraFieldZip64:ce,extraFieldExtendedTimestampFlag:z,zip64UncompressedSize:U,zip64CompressedSize:j,zip64Offset:I,zip64DiskNumberStart:L}),re})(s,C,D,a,e.config,o),_=!1,c.set(r,D),D.filename=r,k){await C.writable.getWriter().close();let e=await F;await t,await R(),A=!0,p||(e=await(async(e,t,n,{zipCrypto:r})=>{let s;s=await t.slice(0,26).arrayBuffer(),26!=s.byteLength&&(s=s.slice(0,26));const i=new g(s);return e.encrypted&&!r||xr(i,14,e.signature),e.zip64?(xr(i,18,T),xr(i,22,T)):(xr(i,18,e.compressedSize),xr(i,22,e.uncompressedSize)),await br(n,new w(s)),t.slice(s.byteLength)})(D,e,m,o)),await E(m),D.diskNumberStart=l.diskNumber,z=l.diskOffset,await e.stream().pipeTo(m,{preventClose:!0,preventAbort:!0,signal:h}),m.size+=e.size,A=!1}if(D.offset=e.offset-z,D.zip64)((e,t)=>{const{rawExtraFieldZip64:n,offset:r,diskNumberStart:s}=e,{zip64UncompressedSize:a,zip64CompressedSize:o,zip64Offset:c,zip64DiskNumberStart:l}=t,u=Cr(n);let f=4;a&&(f+=8),o&&(f+=8),c&&(Ar(u,f,i(r)),f+=8),l&&xr(u,f,s)})(D,o);else if(D.offset>T)throw new d(pr);return e.offset+=D.size,D}catch(t){if(k&&A||!k&&_){if(e.hasCorruptedEntries=!0,t)try{t.corruptedEntry=!0}catch(e){}k?e.offset+=C.writable.size:e.offset=C.writable.size}throw c.delete(r),t}finally{k&&e.bufferedWrites--,v&&v(),z&&z()}async function R(){e.writerLocked=!0;const{lockWriter:t}=e;e.lockWriter=new y((t=>z=()=>{e.writerLocked=!1,t()})),await t}async function E(e){Fr(m.localHeaderArray)>l.availableSize&&(l.availableSize=0,await br(e,new w))}})(e,r,s,{headerInfo:he,dataDescriptorInfo:ge,metadataSize:me},c)}finally{e.pendingEntriesSize-=se}return n.assign(ye,{name:r,comment:m,extraField:ne}),new Tn(ye)})(c,e,r,s),l.add(m),await m}catch(t){throw c.filenames.delete(e),t}finally{l.delete(m);const e=mr.shift();e?e():gr--}}async close(e=new w,n={}){const{pendingAddFileCalls:r,writer:s}=this,{writable:o}=s;for(;r.size;)await y.allSettled(t.from(r));return await(async(e,n,r)=>{const{files:s,writer:o}=e,{diskOffset:c,writable:l}=o;let{diskNumber:u}=o,f=0,p=0,h=e.offset-c,g=s.size;for(const[,e]of s){const{rawFilename:t,rawExtraFieldZip64:n,rawExtraFieldAES:r,rawComment:s,rawExtraFieldNTFS:i,rawExtraField:o,extendedTimestamp:c,extraFieldExtendedTimestampFlag:l,lastModDate:u}=e;let f;if(c){f=new w(9);const e=Cr(f);vr(e,0,M),vr(e,2,5),zr(e,4,l),xr(e,5,a.floor(u.getTime()/1e3))}else f=new w;e.rawExtraFieldCDExtendedTimestamp=f,p+=46+Fr(t,s,n,r,i,f,o)}const m=new w(p),y=Cr(m);await an(o);let b=0;for(const[e,n]of t.from(s.values()).entries()){const{offset:t,rawFilename:i,rawExtraFieldZip64:a,rawExtraFieldAES:c,rawExtraFieldCDExtendedTimestamp:u,rawExtraFieldNTFS:d,rawExtraField:w,rawComment:p,versionMadeBy:h,headerArray:g,directory:S,zip64:k,zip64UncompressedSize:z,zip64CompressedSize:v,zip64DiskNumberStart:x,zip64Offset:A,msDosCompatible:_,internalFileAttribute:C,externalFileAttribute:F,diskNumberStart:D,uncompressedSize:R,compressedSize:E}=n,U=Fr(a,c,u,d,w);xr(y,f,L),vr(y,f+4,h);const j=Cr(g);z||xr(j,18,R),v||xr(j,14,E),_r(m,g,f+6),vr(y,f+30,U),vr(y,f+32,Fr(p)),vr(y,f+34,k&&x?W:D),vr(y,f+36,C),F?xr(y,f+38,F):S&&_&&zr(y,f+38,16),xr(y,f+42,k&&A?T:t),_r(m,i,f+46),_r(m,a,f+46+Fr(i)),_r(m,c,f+46+Fr(i,a)),_r(m,u,f+46+Fr(i,a,c)),_r(m,d,f+46+Fr(i,a,c,u)),_r(m,w,f+46+Fr(i,a,c,u,d)),_r(m,p,f+46+Fr(i)+U);const I=46+Fr(i,p)+U;if(f-b>o.availableSize&&(o.availableSize=0,await br(l,m.slice(b,f)),b=f),f+=I,r.onprogress)try{await r.onprogress(e+1,s.size,new Tn(n))}catch(e){}}await br(l,b?m.slice(b):m);let S=o.diskNumber;const{availableSize:k}=o;P>k&&S++;let z=kr(e,r,"zip64");if(h>T||p>T||g>W||S>W){if(!1===z)throw new d(pr);z=!0}const v=new w(z?98:P),x=Cr(v);f=0,z&&(xr(x,0,O),Ar(x,4,i(44)),vr(x,12,45),vr(x,14,45),xr(x,16,S),xr(x,20,u),Ar(x,24,i(g)),Ar(x,32,i(g)),Ar(x,40,i(p)),Ar(x,48,i(h)),xr(x,56,q),Ar(x,64,i(h)+i(p)),xr(x,72,S+1),kr(e,r,"supportZip64SplitFile",!0)&&(S=W,u=W),g=W,h=T,p=T,f+=76),xr(x,f,N),vr(x,f+4,S),vr(x,f+6,u),vr(x,f+8,g),vr(x,f+10,g),xr(x,f+12,p),xr(x,f+16,h);const A=Fr(n);if(A){if(A>W)throw new d(or);vr(x,f+20,A)}await br(l,v),A&&await br(l,n)})(this,e,n),kr(this,n,"preventClose")||await o.getWriter().close(),s.getData?s.getData():o}}async function br(e,t){const n=e.getWriter();try{await n.ready,e.size+=Fr(t),await n.write(t)}finally{n.releaseLock()}}function Sr(e){if(e)return(i(e.getTime())+i(116444736e5))*i(1e4)}function kr(e,t,n,r){const s=t[n]===K?e.options[n]:t[n];return s===K?r:s}function zr(e,t,n){e.setUint8(t,n)}function vr(e,t,n){e.setUint16(t,n,!0)}function xr(e,t,n){e.setUint32(t,n,!0)}function Ar(e,t,n){e.setBigUint64(t,n,!0)}function _r(e,t,n){e.set(t,n)}function Cr(e){return new g(e.buffer)}function Fr(...e){let t=0;return e.forEach((e=>e&&(t+=e.length))),t}let Dr;try{Dr=void 0===k&&"undefined"==typeof location?require("url").pathToFileURL(__filename).href:void 0===k?location.href:E&&E.src||new f("zip.min.js",k.baseURI).href}catch(e){}ne({baseURL:Dr}),(e=>{const t=()=>f.createObjectURL(new m(['const{Array:e,Object:t,Number:n,Math:r,Error:s,Uint8Array:i,Uint16Array:o,Uint32Array:c,Int32Array:f,Map:a,DataView:l,Promise:u,TextEncoder:w,crypto:h,postMessage:d,TransformStream:p,ReadableStream:y,WritableStream:m,CompressionStream:b,DecompressionStream:g}=self,k=void 0,v="undefined",S="function";class z{constructor(e){return class extends p{constructor(t,n){const r=new e(n);super({transform(e,t){t.enqueue(r.append(e))},flush(e){const t=r.flush();t&&e.enqueue(t)}})}}}}const C=[];for(let e=0;256>e;e++){let t=e;for(let e=0;8>e;e++)1&t?t=t>>>1^3988292384:t>>>=1;C[e]=t}class x{constructor(e){this.t=e||-1}append(e){let t=0|this.t;for(let n=0,r=0|e.length;r>n;n++)t=t>>>8^C[255&(t^e[n])];this.t=t}get(){return~this.t}}class A extends p{constructor(){let e;const t=new x;super({transform(e,n){t.append(e),n.enqueue(e)},flush(){const n=new i(4);new l(n.buffer).setUint32(0,t.get()),e.value=n}}),e=this}}const _={concat(e,t){if(0===e.length||0===t.length)return e.concat(t);const n=e[e.length-1],r=_.i(n);return 32===r?e.concat(t):_.o(t,r,0|n,e.slice(0,e.length-1))},l(e){const t=e.length;if(0===t)return 0;const n=e[t-1];return 32*(t-1)+_.i(n)},u(e,t){if(32*e.length0&&t&&(e[n-1]=_.h(t,e[n-1]&2147483648>>t-1,1)),e},h:(e,t,n)=>32===e?t:(n?0|t:t<<32-e)+1099511627776*e,i:e=>r.round(e/1099511627776)||32,o(e,t,n,r){for(void 0===r&&(r=[]);t>=32;t-=32)r.push(n),n=0;if(0===t)return r.concat(e);for(let s=0;s>>t),n=e[s]<<32-t;const s=e.length?e[e.length-1]:0,i=_.i(s);return r.push(_.h(t+i&31,t+i>32?n:r.pop(),1)),r}},I={p:{m(e){const t=_.l(e)/8,n=new i(t);let r;for(let s=0;t>s;s++)3&s||(r=e[s/4]),n[s]=r>>>24,r<<=8;return n},k(e){const t=[];let n,r=0;for(n=0;n9007199254740991)throw new s("Cannot hash more than 2^53 - 1 bits");const o=new c(n);let f=0;for(let e=t.blockSize+r-(t.blockSize+r&t.blockSize-1);i>=e;e+=t.blockSize)t.P(o.subarray(16*f,16*(f+1))),f+=1;return n.splice(0,16*f),t}D(){const e=this;let t=e.A;const n=e.C;t=_.concat(t,[_.h(1,1)]);for(let e=t.length+2;15&e;e++)t.push(0);for(t.push(r.floor(e._/4294967296)),t.push(0|e._);t.length;)e.P(t.splice(0,16));return e.reset(),n}V(e,t,n,r){return e>19?e>39?e>59?e>79?void 0:t^n^r:t&n|t&r|n&r:t^n^r:t&n|~t&r}R(e,t){return t<>>32-e}P(t){const n=this,s=n.C,i=e(80);for(let e=0;16>e;e++)i[e]=t[e];let o=s[0],c=s[1],f=s[2],a=s[3],l=s[4];for(let e=0;79>=e;e++){16>e||(i[e]=n.R(1,i[e-3]^i[e-8]^i[e-14]^i[e-16]));const t=n.R(5,o)+n.V(e,c,f,a)+l+i[e]+n.S[r.floor(e/20)]|0;l=a,a=f,f=n.R(30,c),c=o,o=t}s[0]=s[0]+o|0,s[1]=s[1]+c|0,s[2]=s[2]+f|0,s[3]=s[3]+a|0,s[4]=s[4]+l|0}},D={getRandomValues(e){const t=new c(e.buffer),n=e=>{let t=987654321;const n=4294967295;return()=>(t=36969*(65535&t)+(t>>16)&n,(((t<<16)+(e=18e3*(65535&e)+(e>>16)&n)&n)/4294967296+.5)*(r.random()>.5?1:-1))};for(let s,i=0;inew V.B(I.p.k(e)),M(e,t,n,r){if(n=n||1e4,0>r||0>n)throw new s("invalid params to pbkdf2");const i=1+(r>>5)<<2;let o,c,f,a,u;const w=new ArrayBuffer(i),h=new l(w);let d=0;const p=_;for(t=I.p.k(t),u=1;(i||1)>d;u++){for(o=c=e.encrypt(p.concat(t,[u])),f=1;n>f;f++)for(c=e.encrypt(c),a=0;ad&&fs&&(e=(new n).update(e).D());for(let t=0;s>t;t++)r[0][t]=909522486^e[t],r[1][t]=1549556828^e[t];t.K[0].update(r[0]),t.K[1].update(r[1]),t.N=new n(t.K[0])}reset(){const e=this;e.N=new e.U(e.K[0]),e.O=!1}update(e){this.O=!0,this.N.update(e)}digest(){const e=this,t=e.N.D(),n=new e.U(e.K[1]).update(t).D();return e.reset(),n}encrypt(e){if(this.O)throw new s("encrypt on already updated hmac called!");return this.update(e),this.digest(e)}}},R=typeof h!=v&&typeof h.getRandomValues==S,B="Invalid password",E="Invalid signature",M="zipjs-abort-check-password";function U(e){return R?h.getRandomValues(e):D.getRandomValues(e)}const K=16,N={name:"PBKDF2"},O=t.assign({hash:{name:"HMAC"}},N),T=t.assign({iterations:1e3,hash:{name:"SHA-1"}},N),W=["deriveBits"],j=[8,12,16],H=[16,24,32],L=10,F=[0,0,0,0],q=typeof h!=v,G=q&&h.subtle,J=q&&typeof G!=v,Q=I.p,X=class{constructor(e){const t=this;t.T=[[[],[],[],[],[]],[[],[],[],[],[]]],t.T[0][0][0]||t.W();const n=t.T[0][4],r=t.T[1],i=e.length;let o,c,f,a=1;if(4!==i&&6!==i&&8!==i)throw new s("invalid aes key size");for(t.S=[c=e.slice(0),f=[]],o=i;4*i+28>o;o++){let e=c[o-1];(o%i==0||8===i&&o%i==4)&&(e=n[e>>>24]<<24^n[e>>16&255]<<16^n[e>>8&255]<<8^n[255&e],o%i==0&&(e=e<<8^e>>>24^a<<24,a=a<<1^283*(a>>7))),c[o]=c[o-i]^e}for(let e=0;o;e++,o--){const t=c[3&e?o:o-4];f[e]=4>=o||4>e?t:r[0][n[t>>>24]]^r[1][n[t>>16&255]]^r[2][n[t>>8&255]]^r[3][n[255&t]]}}encrypt(e){return this.j(e,0)}decrypt(e){return this.j(e,1)}W(){const e=this.T[0],t=this.T[1],n=e[4],r=t[4],s=[],i=[];let o,c,f,a;for(let e=0;256>e;e++)i[(s[e]=e<<1^283*(e>>7))^e]=e;for(let l=o=0;!n[l];l^=c||1,o=i[o]||1){let i=o^o<<1^o<<2^o<<3^o<<4;i=i>>8^255&i^99,n[l]=i,r[i]=l,a=s[f=s[c=s[l]]];let u=16843009*a^65537*f^257*c^16843008*l,w=257*s[i]^16843008*i;for(let n=0;4>n;n++)e[n][l]=w=w<<24^w>>>8,t[n][i]=u=u<<24^u>>>8}for(let n=0;5>n;n++)e[n]=e[n].slice(0),t[n]=t[n].slice(0)}j(e,t){if(4!==e.length)throw new s("invalid aes block size");const n=this.S[t],r=n.length/4-2,i=[0,0,0,0],o=this.T[t],c=o[0],f=o[1],a=o[2],l=o[3],u=o[4];let w,h,d,p=e[0]^n[0],y=e[t?3:1]^n[1],m=e[2]^n[2],b=e[t?1:3]^n[3],g=4;for(let e=0;r>e;e++)w=c[p>>>24]^f[y>>16&255]^a[m>>8&255]^l[255&b]^n[g],h=c[y>>>24]^f[m>>16&255]^a[b>>8&255]^l[255&p]^n[g+1],d=c[m>>>24]^f[b>>16&255]^a[p>>8&255]^l[255&y]^n[g+2],b=c[b>>>24]^f[p>>16&255]^a[y>>8&255]^l[255&m]^n[g+3],g+=4,p=w,y=h,m=d;for(let e=0;4>e;e++)i[t?3&-e:e]=u[p>>>24]<<24^u[y>>16&255]<<16^u[m>>8&255]<<8^u[255&b]^n[g++],w=p,p=y,y=m,m=b,b=w;return i}},Y=class{constructor(e,t){this.H=e,this.L=t,this.F=t}reset(){this.F=this.L}update(e){return this.q(this.H,e,this.F)}G(e){if(255&~(e>>24))e+=1<<24;else{let t=e>>16&255,n=e>>8&255,r=255&e;255===t?(t=0,255===n?(n=0,255===r?r=0:++r):++n):++t,e=0,e+=t<<16,e+=n<<8,e+=r}return e}J(e){0===(e[0]=this.G(e[0]))&&(e[1]=this.G(e[1]))}q(e,t,n){let r;if(!(r=t.length))return[];const s=_.l(t);for(let s=0;r>s;s+=4){this.J(n);const r=e.encrypt(n);t[s]^=r[0],t[s+1]^=r[1],t[s+2]^=r[2],t[s+3]^=r[3]}return _.u(t,s)}},Z=V.B;let $=q&&J&&typeof G.importKey==S,ee=q&&J&&typeof G.deriveBits==S;class te extends p{constructor({password:e,rawPassword:n,signed:r,encryptionStrength:o,checkPasswordOnly:c}){super({start(){t.assign(this,{ready:new u((e=>this.X=e)),password:ie(e,n),signed:r,Y:o-1,pending:new i})},async transform(e,t){const n=this,{password:r,Y:o,X:f,ready:a}=n;r?(await(async(e,t,n,r)=>{const i=await se(e,t,n,ce(r,0,j[t])),o=ce(r,j[t]);if(i[0]!=o[0]||i[1]!=o[1])throw new s(B)})(n,o,r,ce(e,0,j[o]+2)),e=ce(e,j[o]+2),c?t.error(new s(M)):f()):await a;const l=new i(e.length-L-(e.length-L)%K);t.enqueue(re(n,e,l,0,L,!0))},async flush(e){const{signed:t,Z:n,$:r,pending:o,ready:c}=this;if(r&&n){await c;const f=ce(o,0,o.length-L),a=ce(o,o.length-L);let l=new i;if(f.length){const e=ae(Q,f);r.update(e);const t=n.update(e);l=fe(Q,t)}if(t){const e=ce(fe(Q,r.digest()),0,L);for(let t=0;L>t;t++)if(e[t]!=a[t])throw new s(E)}e.enqueue(l)}}})}}class ne extends p{constructor({password:e,rawPassword:n,encryptionStrength:r}){let s;super({start(){t.assign(this,{ready:new u((e=>this.X=e)),password:ie(e,n),Y:r-1,pending:new i})},async transform(e,t){const n=this,{password:r,Y:s,X:o,ready:c}=n;let f=new i;r?(f=await(async(e,t,n)=>{const r=U(new i(j[t]));return oe(r,await se(e,t,n,r))})(n,s,r),o()):await c;const a=new i(f.length+e.length-e.length%K);a.set(f,0),t.enqueue(re(n,e,a,f.length,0))},async flush(e){const{Z:t,$:n,pending:r,ready:o}=this;if(n&&t){await o;let c=new i;if(r.length){const e=t.update(ae(Q,r));n.update(e),c=fe(Q,e)}s.signature=fe(Q,n.digest()).slice(0,L),e.enqueue(oe(c,s.signature))}}}),s=this}}function re(e,t,n,r,s,o){const{Z:c,$:f,pending:a}=e,l=t.length-s;let u;for(a.length&&(t=oe(a,t),n=((e,t)=>{if(t&&t>e.length){const n=e;(e=new i(t)).set(n,0)}return e})(n,l-l%K)),u=0;l-K>=u;u+=K){const e=ae(Q,ce(t,u,u+K));o&&f.update(e);const s=c.update(e);o||f.update(s),n.set(fe(Q,s),u+r)}return e.pending=ce(t,u),n}async function se(n,r,s,o){n.password=null;const c=await(async(e,t,n,r,s)=>{if(!$)return V.importKey(t);try{return await G.importKey("raw",t,n,!1,s)}catch(e){return $=!1,V.importKey(t)}})(0,s,O,0,W),f=await(async(e,t,n)=>{if(!ee)return V.M(t,e.salt,T.iterations,n);try{return await G.deriveBits(e,t,n)}catch(r){return ee=!1,V.M(t,e.salt,T.iterations,n)}})(t.assign({salt:o},T),c,8*(2*H[r]+2)),a=new i(f),l=ae(Q,ce(a,0,H[r])),u=ae(Q,ce(a,H[r],2*H[r])),w=ce(a,2*H[r]);return t.assign(n,{keys:{key:l,ee:u,passwordVerification:w},Z:new Y(new X(l),e.from(F)),$:new Z(u)}),w}function ie(e,t){return t===k?(e=>{if(typeof w==v){const t=new i((e=unescape(encodeURIComponent(e))).length);for(let n=0;n>>24]),i=~e.ne.get(),e.keys=[n,s,i]}function ye(e){const t=2|e.keys[2];return me(r.imul(t,1^t)>>>8)}function me(e){return 255&e}function be(e){return 4294967295&e}const ge="deflate-raw";class ke extends p{constructor(e,{chunkSize:t,CompressionStream:n,CompressionStreamNative:r}){super({});const{compressed:s,encrypted:i,useCompressionStream:o,zipCrypto:c,signed:f,level:a}=e,u=this;let w,h,d=Se(super.readable);i&&!c||!f||(w=new A,d=xe(d,w)),s&&(d=Ce(d,o,{level:a,chunkSize:t},r,n)),i&&(c?d=xe(d,new ue(e)):(h=new ne(e),d=xe(d,h))),ze(u,d,(()=>{let e;i&&!c&&(e=h.signature),i&&!c||!f||(e=new l(w.value.buffer).getUint32(0)),u.signature=e}))}}class ve extends p{constructor(e,{chunkSize:t,DecompressionStream:n,DecompressionStreamNative:r}){super({});const{zipCrypto:i,encrypted:o,signed:c,signature:f,compressed:a,useCompressionStream:u}=e;let w,h,d=Se(super.readable);o&&(i?d=xe(d,new le(e)):(h=new te(e),d=xe(d,h))),a&&(d=Ce(d,u,{chunkSize:t},r,n)),o&&!i||!c||(w=new A,d=xe(d,w)),ze(this,d,(()=>{if((!o||i)&&c){const e=new l(w.value.buffer);if(f!=e.getUint32(0,!1))throw new s(E)}}))}}function Se(e){return xe(e,new p({transform(e,t){e&&e.length&&t.enqueue(e)}}))}function ze(e,n,r){n=xe(n,new p({flush:r})),t.defineProperty(e,"readable",{get:()=>n})}function Ce(e,t,n,r,s){try{e=xe(e,new(t&&r?r:s)(ge,n))}catch(r){if(!t)return e;try{e=xe(e,new s(ge,n))}catch(t){return e}}return e}function xe(e,t){return e.pipeThrough(t)}const Ae="data",_e="close";class Ie extends p{constructor(e,n){super({});const r=this,{codecType:s}=e;let i;s.startsWith("deflate")?i=ke:s.startsWith("inflate")&&(i=ve);let o=0,c=0;const f=new i(e,n),a=super.readable,l=new p({transform(e,t){e&&e.length&&(c+=e.length,t.enqueue(e))},flush(){t.assign(r,{inputSize:c})}}),u=new p({transform(e,t){e&&e.length&&(o+=e.length,t.enqueue(e))},flush(){const{signature:e}=f;t.assign(r,{signature:e,outputSize:o,inputSize:c})}});t.defineProperty(r,"readable",{get:()=>a.pipeThrough(l).pipeThrough(f).pipeThrough(u)})}}class Pe extends p{constructor(e){let t;super({transform:function n(r,s){if(t){const e=new i(t.length+r.length);e.set(t),e.set(r,t.length),r=e,t=null}r.length>e?(s.enqueue(r.slice(0,e)),n(r.slice(e),s)):t=r},flush(e){t&&t.length&&e.enqueue(t)}})}}const De=new a,Ve=new a;let Re,Be=0,Ee=!0;async function Me(e){try{const{options:t,scripts:r,config:s}=e;if(r&&r.length)try{Ee?importScripts.apply(k,r):await Ue(r)}catch(e){Ee=!1,await Ue(r)}self.initCodec&&self.initCodec(),s.CompressionStreamNative=self.CompressionStream,s.DecompressionStreamNative=self.DecompressionStream,self.Deflate&&(s.CompressionStream=new z(self.Deflate)),self.Inflate&&(s.DecompressionStream=new z(self.Inflate));const i={highWaterMark:1},o=e.readable||new y({async pull(e){const t=new u((e=>De.set(Be,e)));Ke({type:"pull",messageId:Be}),Be=(Be+1)%n.MAX_SAFE_INTEGER;const{value:r,done:s}=await t;e.enqueue(r),s&&e.close()}},i),c=e.writable||new m({async write(e){let t;const r=new u((e=>t=e));Ve.set(Be,t),Ke({type:Ae,value:e,messageId:Be}),Be=(Be+1)%n.MAX_SAFE_INTEGER,await r}},i),f=new Ie(t,s);Re=new AbortController;const{signal:a}=Re;await o.pipeThrough(f).pipeThrough(new Pe(s.chunkSize)).pipeTo(c,{signal:a,preventClose:!0,preventAbort:!0}),await c.getWriter().close();const{signature:l,inputSize:w,outputSize:h}=f;Ke({type:_e,result:{signature:l,inputSize:w,outputSize:h}})}catch(e){Ne(e)}}async function Ue(e){for(const t of e)await import(t)}function Ke(e){let{value:t}=e;if(t)if(t.length)try{t=new i(t),e.value=t.buffer,d(e,[e.value])}catch(t){d(e)}else d(e);else d(e)}function Ne(e=new s("Unknown error")){const{message:t,stack:n,code:r,name:i}=e;d({error:{message:t,stack:n,code:r,name:i}})}addEventListener("message",(({data:e})=>{const{type:t,messageId:n,value:r,done:s}=e;try{if("start"==t&&Me(e),t==Ae){const e=De.get(n);De.delete(n),e({value:new i(r),done:s})}if("ack"==t){const e=Ve.get(n);Ve.delete(n),e()}t==_e&&Re.abort()}catch(e){Ne(e)}}));const Oe=15,Te=573,We=-2;function je(t){return He(t.map((([t,n])=>new e(t).fill(n,0,t))))}function He(t){return t.reduce(((t,n)=>t.concat(e.isArray(n)?He(n):n)),[])}const Le=[0,1,2,3].concat(...je([[2,4],[2,5],[4,6],[4,7],[8,8],[8,9],[16,10],[16,11],[32,12],[32,13],[64,14],[64,15],[2,0],[1,16],[1,17],[2,18],[2,19],[4,20],[4,21],[8,22],[8,23],[16,24],[16,25],[32,26],[32,27],[64,28],[64,29]]));function Fe(){const e=this;function t(e,t){let n=0;do{n|=1&e,e>>>=1,n<<=1}while(--t>0);return n>>>1}e.re=n=>{const s=e.se,i=e.oe.ie,o=e.oe.ce;let c,f,a,l=-1;for(n.fe=0,n.ae=Te,c=0;o>c;c++)0!==s[2*c]?(n.le[++n.fe]=l=c,n.ue[c]=0):s[2*c+1]=0;for(;2>n.fe;)a=n.le[++n.fe]=2>l?++l:0,s[2*a]=1,n.ue[a]=0,n.we--,i&&(n.he-=i[2*a+1]);for(e.de=l,c=r.floor(n.fe/2);c>=1;c--)n.pe(s,c);a=o;do{c=n.le[1],n.le[1]=n.le[n.fe--],n.pe(s,1),f=n.le[1],n.le[--n.ae]=c,n.le[--n.ae]=f,s[2*a]=s[2*c]+s[2*f],n.ue[a]=r.max(n.ue[c],n.ue[f])+1,s[2*c+1]=s[2*f+1]=a,n.le[1]=a++,n.pe(s,1)}while(n.fe>=2);n.le[--n.ae]=n.le[1],(t=>{const n=e.se,r=e.oe.ie,s=e.oe.ye,i=e.oe.me,o=e.oe.be;let c,f,a,l,u,w,h=0;for(l=0;Oe>=l;l++)t.ge[l]=0;for(n[2*t.le[t.ae]+1]=0,c=t.ae+1;Te>c;c++)f=t.le[c],l=n[2*n[2*f+1]+1]+1,l>o&&(l=o,h++),n[2*f+1]=l,f>e.de||(t.ge[l]++,u=0,i>f||(u=s[f-i]),w=n[2*f],t.we+=w*(l+u),r&&(t.he+=w*(r[2*f+1]+u)));if(0!==h){do{for(l=o-1;0===t.ge[l];)l--;t.ge[l]--,t.ge[l+1]+=2,t.ge[o]--,h-=2}while(h>0);for(l=o;0!==l;l--)for(f=t.ge[l];0!==f;)a=t.le[--c],a>e.de||(n[2*a+1]!=l&&(t.we+=(l-n[2*a+1])*n[2*a],n[2*a+1]=l),f--)}})(n),((e,n,r)=>{const s=[];let i,o,c,f=0;for(i=1;Oe>=i;i++)s[i]=f=f+r[i-1]<<1;for(o=0;n>=o;o++)c=e[2*o+1],0!==c&&(e[2*o]=t(s[c]++,c))})(s,e.de,n.ge)}}function qe(e,t,n,r,s){const i=this;i.ie=e,i.ye=t,i.me=n,i.ce=r,i.be=s}Fe.ke=[0,1,2,3,4,5,6,7].concat(...je([[2,8],[2,9],[2,10],[2,11],[4,12],[4,13],[4,14],[4,15],[8,16],[8,17],[8,18],[8,19],[16,20],[16,21],[16,22],[16,23],[32,24],[32,25],[32,26],[31,27],[1,28]])),Fe.ve=[0,1,2,3,4,5,6,7,8,10,12,14,16,20,24,28,32,40,48,56,64,80,96,112,128,160,192,224,0],Fe.Se=[0,1,2,3,4,6,8,12,16,24,32,48,64,96,128,192,256,384,512,768,1024,1536,2048,3072,4096,6144,8192,12288,16384,24576],Fe.ze=e=>256>e?Le[e]:Le[256+(e>>>7)],Fe.Ce=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],Fe.xe=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],Fe.Ae=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],Fe._e=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];const Ge=je([[144,8],[112,9],[24,7],[8,8]]);qe.Ie=He([12,140,76,204,44,172,108,236,28,156,92,220,60,188,124,252,2,130,66,194,34,162,98,226,18,146,82,210,50,178,114,242,10,138,74,202,42,170,106,234,26,154,90,218,58,186,122,250,6,134,70,198,38,166,102,230,22,150,86,214,54,182,118,246,14,142,78,206,46,174,110,238,30,158,94,222,62,190,126,254,1,129,65,193,33,161,97,225,17,145,81,209,49,177,113,241,9,137,73,201,41,169,105,233,25,153,89,217,57,185,121,249,5,133,69,197,37,165,101,229,21,149,85,213,53,181,117,245,13,141,77,205,45,173,109,237,29,157,93,221,61,189,125,253,19,275,147,403,83,339,211,467,51,307,179,435,115,371,243,499,11,267,139,395,75,331,203,459,43,299,171,427,107,363,235,491,27,283,155,411,91,347,219,475,59,315,187,443,123,379,251,507,7,263,135,391,71,327,199,455,39,295,167,423,103,359,231,487,23,279,151,407,87,343,215,471,55,311,183,439,119,375,247,503,15,271,143,399,79,335,207,463,47,303,175,431,111,367,239,495,31,287,159,415,95,351,223,479,63,319,191,447,127,383,255,511,0,64,32,96,16,80,48,112,8,72,40,104,24,88,56,120,4,68,36,100,20,84,52,116,3,131,67,195,35,163,99,227].map(((e,t)=>[e,Ge[t]])));const Je=je([[30,5]]);function Qe(e,t,n,r,s){const i=this;i.Pe=e,i.De=t,i.Ve=n,i.Re=r,i.Be=s}qe.Ee=He([0,16,8,24,4,20,12,28,2,18,10,26,6,22,14,30,1,17,9,25,5,21,13,29,3,19,11,27,7,23].map(((e,t)=>[e,Je[t]]))),qe.Me=new qe(qe.Ie,Fe.Ce,257,286,Oe),qe.Ue=new qe(qe.Ee,Fe.xe,0,30,Oe),qe.Ke=new qe(null,Fe.Ae,0,19,7);const Xe=[new Qe(0,0,0,0,0),new Qe(4,4,8,4,1),new Qe(4,5,16,8,1),new Qe(4,6,32,32,1),new Qe(4,4,16,16,2),new Qe(8,16,32,32,2),new Qe(8,16,128,128,2),new Qe(8,32,128,256,2),new Qe(32,128,258,1024,2),new Qe(32,258,258,4096,2)],Ye=["need dictionary","stream end","","","stream error","data error","","buffer error","",""],Ze=113,$e=666,et=262;function tt(e,t,n,r){const s=e[2*t],i=e[2*n];return i>s||s==i&&r[t]<=r[n]}function nt(){const e=this;let t,n,s,c,f,a,l,u,w,h,d,p,y,m,b,g,k,v,S,z,C,x,A,_,I,P,D,V,R,B,E,M,U;const K=new Fe,N=new Fe,O=new Fe;let T,W,j,H,L,F;function q(){let t;for(t=0;286>t;t++)E[2*t]=0;for(t=0;30>t;t++)M[2*t]=0;for(t=0;19>t;t++)U[2*t]=0;E[512]=1,e.we=e.he=0,W=j=0}function G(e,t){let n,r=-1,s=e[1],i=0,o=7,c=4;0===s&&(o=138,c=3),e[2*(t+1)+1]=65535;for(let f=0;t>=f;f++)n=s,s=e[2*(f+1)+1],++ii?U[2*n]+=i:0!==n?(n!=r&&U[2*n]++,U[32]++):i>10?U[36]++:U[34]++,i=0,r=n,0===s?(o=138,c=3):n==s?(o=6,c=3):(o=7,c=4))}function J(t){e.Ne[e.pending++]=t}function Q(e){J(255&e),J(e>>>8&255)}function X(e,t){let n;const r=t;F>16-r?(n=e,L|=n<>>16-F,F+=r-16):(L|=e<=n;n++)if(r=i,i=e[2*(n+1)+1],++o>=c||r!=i){if(f>o)do{Y(r,U)}while(0!=--o);else 0!==r?(r!=s&&(Y(r,U),o--),Y(16,U),X(o-3,2)):o>10?(Y(18,U),X(o-11,7)):(Y(17,U),X(o-3,3));o=0,s=r,0===i?(c=138,f=3):r==i?(c=6,f=3):(c=7,f=4)}}function $(){16==F?(Q(L),L=0,F=0):8>F||(J(255&L),L>>>=8,F-=8)}function ee(t,n){let s,i,o;if(e.Oe[W]=t,e.Te[W]=255&n,W++,0===t?E[2*n]++:(j++,t--,E[2*(Fe.ke[n]+256+1)]++,M[2*Fe.ze(t)]++),!(8191&W)&&D>2){for(s=8*W,i=C-k,o=0;30>o;o++)s+=M[2*o]*(5+Fe.xe[o]);if(s>>>=3,jc);Y(256,t),H=t[513]}function ne(){F>8?Q(L):F>0&&J(255&L),L=0,F=0}function re(t,n,r){X(0+(r?1:0),3),((t,n)=>{ne(),H=8,Q(n),Q(~n),e.Ne.set(u.subarray(t,t+n),e.pending),e.pending+=n})(t,n)}function se(n){((t,n,r)=>{let s,i,o=0;D>0?(K.re(e),N.re(e),o=(()=>{let t;for(G(E,K.de),G(M,N.de),O.re(e),t=18;t>=3&&0===U[2*Fe._e[t]+1];t--);return e.we+=14+3*(t+1),t})(),s=e.we+3+7>>>3,i=e.he+3+7>>>3,i>s||(s=i)):s=i=n+5,n+4>s||-1==t?i==s?(X(2+(r?1:0),3),te(qe.Ie,qe.Ee)):(X(4+(r?1:0),3),((e,t,n)=>{let r;for(X(e-257,5),X(t-1,5),X(n-4,4),r=0;n>r;r++)X(U[2*Fe._e[r]+1],3);Z(E,e-1),Z(M,t-1)})(K.de+1,N.de+1,o+1),te(E,M)):re(t,n,r),q(),r&&ne()})(0>k?-1:k,C-k,n),k=C,t.We()}function ie(){let e,n,r,s;do{if(s=w-A-C,0===s&&0===C&&0===A)s=f;else if(-1==s)s--;else if(C>=f+f-et){u.set(u.subarray(f,f+f),0),x-=f,C-=f,k-=f,e=y,r=e;do{n=65535&d[--r],d[r]=f>n?0:n-f}while(0!=--e);e=f,r=e;do{n=65535&h[--r],h[r]=f>n?0:n-f}while(0!=--e);s+=f}if(0===t.je)return;e=t.He(u,C+A,s),A+=e,3>A||(p=255&u[C],p=(p<A&&0!==t.je)}function oe(e){let t,n,r=I,s=C,i=_;const o=C>f-et?C-(f-et):0;let c=B;const a=l,w=C+258;let d=u[s+i-1],p=u[s+i];R>_||(r>>=2),c>A&&(c=A);do{if(t=e,u[t+i]==p&&u[t+i-1]==d&&u[t]==u[s]&&u[++t]==u[s+1]){s+=2,t++;do{}while(u[++s]==u[++t]&&u[++s]==u[++t]&&u[++s]==u[++t]&&u[++s]==u[++t]&&u[++s]==u[++t]&&u[++s]==u[++t]&&u[++s]==u[++t]&&u[++s]==u[++t]&&w>s);if(n=258-(w-s),s=w-258,n>i){if(x=e,i=n,n>=c)break;d=u[s+i-1],p=u[s+i]}}}while((e=65535&h[e&a])>o&&0!=--r);return i>A?A:i}e.ue=[],e.ge=[],e.le=[],E=[],M=[],U=[],e.pe=(t,n)=>{const r=e.le,s=r[n];let i=n<<1;for(;i<=e.fe&&(i(W||(W=8),j||(j=8),G||(G=0),t.Fe=null,-1==S&&(S=6),1>j||j>9||8!=W||9>x||x>15||0>S||S>9||0>G||G>2?We:(t.qe=e,a=x,f=1<(t.Ge=t.Je=0,t.Fe=null,e.pending=0,e.Qe=0,n=Ze,c=0,K.se=E,K.oe=qe.Me,N.se=M,N.oe=qe.Ue,O.se=U,O.oe=qe.Ke,L=0,F=0,H=8,q(),(()=>{w=2*f,d[y-1]=0;for(let e=0;y-1>e;e++)d[e]=0;P=Xe[D].De,R=Xe[D].Pe,B=Xe[D].Ve,I=Xe[D].Re,C=0,k=0,A=0,v=_=2,z=0,p=0})(),0))(t))),e.Xe=()=>42!=n&&n!=Ze&&n!=$e?We:(e.Te=null,e.Oe=null,e.Ne=null,d=null,h=null,u=null,e.qe=null,n==Ze?-3:0),e.Ye=(e,t,n)=>{let r=0;return-1==t&&(t=6),0>t||t>9||0>n||n>2?We:(Xe[D].Be!=Xe[t].Be&&0!==e.Ge&&(r=e.Ze(1)),D!=t&&(D=t,P=Xe[D].De,R=Xe[D].Pe,B=Xe[D].Ve,I=Xe[D].Re),V=n,r)},e.$e=(e,t,r)=>{let s,i=r,o=0;if(!t||42!=n)return We;if(3>i)return 0;for(i>f-et&&(i=f-et,o=r-i),u.set(t.subarray(o,o+i),0),C=i,k=i,p=255&u[0],p=(p<=s;s++)p=(p<{let o,w,m,I,R;if(i>4||0>i)return We;if(!r.et||!r.tt&&0!==r.je||n==$e&&4!=i)return r.Fe=Ye[4],We;if(0===r.nt)return r.Fe=Ye[7],-5;var B;if(t=r,I=c,c=i,42==n&&(w=8+(a-8<<4)<<8,m=(D-1&255)>>1,m>3&&(m=3),w|=m<<6,0!==C&&(w|=32),w+=31-w%31,n=Ze,J((B=w)>>8&255),J(255&B)),0!==e.pending){if(t.We(),0===t.nt)return c=-1,0}else if(0===t.je&&I>=i&&4!=i)return t.Fe=Ye[7],-5;if(n==$e&&0!==t.je)return r.Fe=Ye[7],-5;if(0!==t.je||0!==A||0!=i&&n!=$e){switch(R=-1,Xe[D].Be){case 0:R=(e=>{let n,r=65535;for(r>s-5&&(r=s-5);;){if(1>=A){if(ie(),0===A&&0==e)return 0;if(0===A)break}if(C+=A,A=0,n=k+r,(0===C||C>=n)&&(A=C-n,C=n,se(!1),0===t.nt))return 0;if(C-k>=f-et&&(se(!1),0===t.nt))return 0}return se(4==e),0===t.nt?4==e?2:0:4==e?3:1})(i);break;case 1:R=(e=>{let n,r=0;for(;;){if(et>A){if(ie(),et>A&&0==e)return 0;if(0===A)break}if(3>A||(p=(p<f-et||2!=V&&(v=oe(r)),3>v)n=ee(0,255&u[C]),A--,C++;else if(n=ee(C-x,v-3),A-=v,v>P||3>A)C+=v,v=0,p=255&u[C],p=(p<{let n,r,s=0;for(;;){if(et>A){if(ie(),et>A&&0==e)return 0;if(0===A)break}if(3>A||(p=(p<_&&f-et>=(C-s&65535)&&(2!=V&&(v=oe(s)),5>=v&&(1==V||3==v&&C-x>4096)&&(v=2)),3>_||v>_)if(0!==z){if(n=ee(0,255&u[C-1]),n&&se(!1),C++,A--,0===t.nt)return 0}else z=1,C++,A--;else{r=C+A-3,n=ee(C-1-S,_-3),A-=_-1,_-=2;do{++C>r||(p=(p<1+H+10-F&&(X(2,3),Y(256,qe.Ie),$()),H=7;else if(re(0,0,!1),3==i)for(o=0;y>o;o++)d[o]=0;if(t.We(),0===t.nt)return c=-1,0}}return 4!=i?0:1}}function rt(){const e=this;e.rt=0,e.st=0,e.je=0,e.Ge=0,e.nt=0,e.Je=0}function st(e){const t=new rt,n=(o=e&&e.chunkSize?e.chunkSize:65536)+5*(r.floor(o/16383)+1);var o;const c=new i(n);let f=e?e.level:-1;void 0===f&&(f=-1),t.Le(f),t.et=c,this.append=(e,r)=>{let o,f,a=0,l=0,u=0;const w=[];if(e.length){t.rt=0,t.tt=e,t.je=e.length;do{if(t.st=0,t.nt=n,o=t.Ze(0),0!=o)throw new s("deflating: "+t.Fe);t.st&&(t.st==n?w.push(new i(c)):w.push(c.subarray(0,t.st))),u+=t.st,r&&t.rt>0&&t.rt!=a&&(r(t.rt),a=t.rt)}while(t.je>0||0===t.nt);return w.length>1?(f=new i(u),w.forEach((e=>{f.set(e,l),l+=e.length}))):f=w[0]?new i(w[0]):new i,f}},this.flush=()=>{let e,r,o=0,f=0;const a=[];do{if(t.st=0,t.nt=n,e=t.Ze(4),1!=e&&0!=e)throw new s("deflating: "+t.Fe);n-t.nt>0&&a.push(c.slice(0,t.st)),f+=t.st}while(t.je>0||0===t.nt);return t.Xe(),r=new i(f),a.forEach((e=>{r.set(e,o),o+=e.length})),r}}rt.prototype={Le(e,t){const n=this;return n.qe=new nt,t||(t=Oe),n.qe.Le(n,e,t)},Ze(e){const t=this;return t.qe?t.qe.Ze(t,e):We},Xe(){const e=this;if(!e.qe)return We;const t=e.qe.Xe();return e.qe=null,t},Ye(e,t){const n=this;return n.qe?n.qe.Ye(n,e,t):We},$e(e,t){const n=this;return n.qe?n.qe.$e(n,e,t):We},He(e,t,n){const r=this;let s=r.je;return s>n&&(s=n),0===s?0:(r.je-=s,e.set(r.tt.subarray(r.rt,r.rt+s),t),r.rt+=s,r.Ge+=s,s)},We(){const e=this;let t=e.qe.pending;t>e.nt&&(t=e.nt),0!==t&&(e.et.set(e.qe.Ne.subarray(e.qe.Qe,e.qe.Qe+t),e.st),e.st+=t,e.qe.Qe+=t,e.Je+=t,e.nt-=t,e.qe.pending-=t,0===e.qe.pending&&(e.qe.Qe=0))}};const it=0,ot=1,ct=-2,ft=-3,at=-4,lt=-5,ut=[0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535],wt=1440,ht=[96,7,256,0,8,80,0,8,16,84,8,115,82,7,31,0,8,112,0,8,48,0,9,192,80,7,10,0,8,96,0,8,32,0,9,160,0,8,0,0,8,128,0,8,64,0,9,224,80,7,6,0,8,88,0,8,24,0,9,144,83,7,59,0,8,120,0,8,56,0,9,208,81,7,17,0,8,104,0,8,40,0,9,176,0,8,8,0,8,136,0,8,72,0,9,240,80,7,4,0,8,84,0,8,20,85,8,227,83,7,43,0,8,116,0,8,52,0,9,200,81,7,13,0,8,100,0,8,36,0,9,168,0,8,4,0,8,132,0,8,68,0,9,232,80,7,8,0,8,92,0,8,28,0,9,152,84,7,83,0,8,124,0,8,60,0,9,216,82,7,23,0,8,108,0,8,44,0,9,184,0,8,12,0,8,140,0,8,76,0,9,248,80,7,3,0,8,82,0,8,18,85,8,163,83,7,35,0,8,114,0,8,50,0,9,196,81,7,11,0,8,98,0,8,34,0,9,164,0,8,2,0,8,130,0,8,66,0,9,228,80,7,7,0,8,90,0,8,26,0,9,148,84,7,67,0,8,122,0,8,58,0,9,212,82,7,19,0,8,106,0,8,42,0,9,180,0,8,10,0,8,138,0,8,74,0,9,244,80,7,5,0,8,86,0,8,22,192,8,0,83,7,51,0,8,118,0,8,54,0,9,204,81,7,15,0,8,102,0,8,38,0,9,172,0,8,6,0,8,134,0,8,70,0,9,236,80,7,9,0,8,94,0,8,30,0,9,156,84,7,99,0,8,126,0,8,62,0,9,220,82,7,27,0,8,110,0,8,46,0,9,188,0,8,14,0,8,142,0,8,78,0,9,252,96,7,256,0,8,81,0,8,17,85,8,131,82,7,31,0,8,113,0,8,49,0,9,194,80,7,10,0,8,97,0,8,33,0,9,162,0,8,1,0,8,129,0,8,65,0,9,226,80,7,6,0,8,89,0,8,25,0,9,146,83,7,59,0,8,121,0,8,57,0,9,210,81,7,17,0,8,105,0,8,41,0,9,178,0,8,9,0,8,137,0,8,73,0,9,242,80,7,4,0,8,85,0,8,21,80,8,258,83,7,43,0,8,117,0,8,53,0,9,202,81,7,13,0,8,101,0,8,37,0,9,170,0,8,5,0,8,133,0,8,69,0,9,234,80,7,8,0,8,93,0,8,29,0,9,154,84,7,83,0,8,125,0,8,61,0,9,218,82,7,23,0,8,109,0,8,45,0,9,186,0,8,13,0,8,141,0,8,77,0,9,250,80,7,3,0,8,83,0,8,19,85,8,195,83,7,35,0,8,115,0,8,51,0,9,198,81,7,11,0,8,99,0,8,35,0,9,166,0,8,3,0,8,131,0,8,67,0,9,230,80,7,7,0,8,91,0,8,27,0,9,150,84,7,67,0,8,123,0,8,59,0,9,214,82,7,19,0,8,107,0,8,43,0,9,182,0,8,11,0,8,139,0,8,75,0,9,246,80,7,5,0,8,87,0,8,23,192,8,0,83,7,51,0,8,119,0,8,55,0,9,206,81,7,15,0,8,103,0,8,39,0,9,174,0,8,7,0,8,135,0,8,71,0,9,238,80,7,9,0,8,95,0,8,31,0,9,158,84,7,99,0,8,127,0,8,63,0,9,222,82,7,27,0,8,111,0,8,47,0,9,190,0,8,15,0,8,143,0,8,79,0,9,254,96,7,256,0,8,80,0,8,16,84,8,115,82,7,31,0,8,112,0,8,48,0,9,193,80,7,10,0,8,96,0,8,32,0,9,161,0,8,0,0,8,128,0,8,64,0,9,225,80,7,6,0,8,88,0,8,24,0,9,145,83,7,59,0,8,120,0,8,56,0,9,209,81,7,17,0,8,104,0,8,40,0,9,177,0,8,8,0,8,136,0,8,72,0,9,241,80,7,4,0,8,84,0,8,20,85,8,227,83,7,43,0,8,116,0,8,52,0,9,201,81,7,13,0,8,100,0,8,36,0,9,169,0,8,4,0,8,132,0,8,68,0,9,233,80,7,8,0,8,92,0,8,28,0,9,153,84,7,83,0,8,124,0,8,60,0,9,217,82,7,23,0,8,108,0,8,44,0,9,185,0,8,12,0,8,140,0,8,76,0,9,249,80,7,3,0,8,82,0,8,18,85,8,163,83,7,35,0,8,114,0,8,50,0,9,197,81,7,11,0,8,98,0,8,34,0,9,165,0,8,2,0,8,130,0,8,66,0,9,229,80,7,7,0,8,90,0,8,26,0,9,149,84,7,67,0,8,122,0,8,58,0,9,213,82,7,19,0,8,106,0,8,42,0,9,181,0,8,10,0,8,138,0,8,74,0,9,245,80,7,5,0,8,86,0,8,22,192,8,0,83,7,51,0,8,118,0,8,54,0,9,205,81,7,15,0,8,102,0,8,38,0,9,173,0,8,6,0,8,134,0,8,70,0,9,237,80,7,9,0,8,94,0,8,30,0,9,157,84,7,99,0,8,126,0,8,62,0,9,221,82,7,27,0,8,110,0,8,46,0,9,189,0,8,14,0,8,142,0,8,78,0,9,253,96,7,256,0,8,81,0,8,17,85,8,131,82,7,31,0,8,113,0,8,49,0,9,195,80,7,10,0,8,97,0,8,33,0,9,163,0,8,1,0,8,129,0,8,65,0,9,227,80,7,6,0,8,89,0,8,25,0,9,147,83,7,59,0,8,121,0,8,57,0,9,211,81,7,17,0,8,105,0,8,41,0,9,179,0,8,9,0,8,137,0,8,73,0,9,243,80,7,4,0,8,85,0,8,21,80,8,258,83,7,43,0,8,117,0,8,53,0,9,203,81,7,13,0,8,101,0,8,37,0,9,171,0,8,5,0,8,133,0,8,69,0,9,235,80,7,8,0,8,93,0,8,29,0,9,155,84,7,83,0,8,125,0,8,61,0,9,219,82,7,23,0,8,109,0,8,45,0,9,187,0,8,13,0,8,141,0,8,77,0,9,251,80,7,3,0,8,83,0,8,19,85,8,195,83,7,35,0,8,115,0,8,51,0,9,199,81,7,11,0,8,99,0,8,35,0,9,167,0,8,3,0,8,131,0,8,67,0,9,231,80,7,7,0,8,91,0,8,27,0,9,151,84,7,67,0,8,123,0,8,59,0,9,215,82,7,19,0,8,107,0,8,43,0,9,183,0,8,11,0,8,139,0,8,75,0,9,247,80,7,5,0,8,87,0,8,23,192,8,0,83,7,51,0,8,119,0,8,55,0,9,207,81,7,15,0,8,103,0,8,39,0,9,175,0,8,7,0,8,135,0,8,71,0,9,239,80,7,9,0,8,95,0,8,31,0,9,159,84,7,99,0,8,127,0,8,63,0,9,223,82,7,27,0,8,111,0,8,47,0,9,191,0,8,15,0,8,143,0,8,79,0,9,255],dt=[80,5,1,87,5,257,83,5,17,91,5,4097,81,5,5,89,5,1025,85,5,65,93,5,16385,80,5,3,88,5,513,84,5,33,92,5,8193,82,5,9,90,5,2049,86,5,129,192,5,24577,80,5,2,87,5,385,83,5,25,91,5,6145,81,5,7,89,5,1537,85,5,97,93,5,24577,80,5,4,88,5,769,84,5,49,92,5,12289,82,5,13,90,5,3073,86,5,193,192,5,24577],pt=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0],yt=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,112,112],mt=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],bt=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],gt=15;function kt(){let e,t,n,r,s,i;function o(e,t,o,c,f,a,l,u,w,h,d){let p,y,m,b,g,k,v,S,z,C,x,A,_,I,P;C=0,g=o;do{n[e[t+C]]++,C++,g--}while(0!==g);if(n[0]==o)return l[0]=-1,u[0]=0,it;for(S=u[0],k=1;gt>=k&&0===n[k];k++);for(v=k,k>S&&(S=k),g=gt;0!==g&&0===n[g];g--);for(m=g,S>g&&(S=g),u[0]=S,I=1<k;k++,I<<=1)if(0>(I-=n[k]))return ft;if(0>(I-=n[g]))return ft;for(n[g]+=I,i[1]=k=0,C=1,_=2;0!=--g;)i[_]=k+=n[C],_++,C++;g=0,C=0;do{0!==(k=e[t+C])&&(d[i[k]++]=g),C++}while(++g=v;v++)for(p=n[v];0!=p--;){for(;v>A+S;){if(b++,A+=S,P=m-A,P=P>S?S:P,(y=1<<(k=v-A))>p+1&&(y-=p+1,_=v,P>k))for(;++kn[++_];)y-=n[_];if(P=1<wt)return ft;s[b]=x=h[0],h[0]+=P,0!==b?(i[b]=g,r[0]=k,r[1]=S,k=g>>>A-S,r[2]=x-s[b-1]-k,w.set(r,3*(s[b-1]+k))):l[0]=x}for(r[1]=v-A,o>C?d[C]d[C]?0:96,r[2]=d[C++]):(r[0]=a[d[C]-c]+16+64,r[2]=f[d[C++]-c]):r[0]=192,y=1<>>A;P>k;k+=y)w.set(r,3*(x+k));for(k=1<>>=1)g^=k;for(g^=k,z=(1<c;c++)t[c]=0;for(c=0;gt+1>c;c++)n[c]=0;for(c=0;3>c;c++)r[c]=0;s.set(n.subarray(0,gt),0),i.set(n.subarray(0,gt+1),0)}this.it=(n,r,s,i,f)=>{let a;return c(19),e[0]=0,a=o(n,0,19,19,null,null,s,r,i,e,t),a==ft?f.Fe="oversubscribed dynamic bit lengths tree":a!=lt&&0!==r[0]||(f.Fe="incomplete dynamic bit lengths tree",a=ft),a},this.ot=(n,r,s,i,f,a,l,u,w)=>{let h;return c(288),e[0]=0,h=o(s,0,n,257,pt,yt,a,i,u,e,t),h!=it||0===i[0]?(h==ft?w.Fe="oversubscribed literal/length tree":h!=at&&(w.Fe="incomplete literal/length tree",h=ft),h):(c(288),h=o(s,n,r,0,mt,bt,l,f,u,e,t),h!=it||0===f[0]&&n>257?(h==ft?w.Fe="oversubscribed distance tree":h==lt?(w.Fe="incomplete distance tree",h=ft):h!=at&&(w.Fe="empty distance tree with lengths",h=ft),h):it)}}kt.ct=(e,t,n,r)=>(e[0]=9,t[0]=5,n[0]=ht,r[0]=dt,it);const vt=0,St=1,zt=2,Ct=3,xt=4,At=5,_t=6,It=7,Pt=8,Dt=9;function Vt(){const e=this;let t,n,r,s,i=0,o=0,c=0,f=0,a=0,l=0,u=0,w=0,h=0,d=0;function p(e,t,n,r,s,i,o,c){let f,a,l,u,w,h,d,p,y,m,b,g,k,v,S,z;d=c.rt,p=c.je,w=o.ft,h=o.lt,y=o.write,m=yh;)p--,w|=(255&c.ut(d++))<>=a[z+1],h-=a[z+1],16&u){for(u&=15,k=a[z+2]+(w&ut[u]),w>>=u,h-=u;15>h;)p--,w|=(255&c.ut(d++))<>=a[z+1],h-=a[z+1],16&u){for(u&=15;u>h;)p--,w|=(255&c.ut(d++))<>=u,h-=u,m-=k,v>y){S=y-v;do{S+=o.end}while(0>S);if(u=o.end-S,k>u){if(k-=u,y-S>0&&u>y-S)do{o.wt[y++]=o.wt[S++]}while(0!=--u);else o.wt.set(o.wt.subarray(S,S+u),y),y+=u,S+=u,u=0;S=0}}else S=y-v,y-S>0&&2>y-S?(o.wt[y++]=o.wt[S++],o.wt[y++]=o.wt[S++],k-=2):(o.wt.set(o.wt.subarray(S,S+2),y),y+=2,S+=2,k-=2);if(y-S>0&&k>y-S)do{o.wt[y++]=o.wt[S++]}while(0!=--k);else o.wt.set(o.wt.subarray(S,S+k),y),y+=k,S+=k,k=0;break}if(64&u)return c.Fe="invalid distance code",k=c.je-p,k=k>h>>3?h>>3:k,p+=k,d-=k,h-=k<<3,o.ft=w,o.lt=h,c.je=p,c.Ge+=d-c.rt,c.rt=d,o.write=y,ft;f+=a[z+2],f+=w&ut[u],z=3*(l+f),u=a[z]}break}if(64&u)return 32&u?(k=c.je-p,k=k>h>>3?h>>3:k,p+=k,d-=k,h-=k<<3,o.ft=w,o.lt=h,c.je=p,c.Ge+=d-c.rt,c.rt=d,o.write=y,ot):(c.Fe="invalid literal/length code",k=c.je-p,k=k>h>>3?h>>3:k,p+=k,d-=k,h-=k<<3,o.ft=w,o.lt=h,c.je=p,c.Ge+=d-c.rt,c.rt=d,o.write=y,ft);if(f+=a[z+2],f+=w&ut[u],z=3*(l+f),0===(u=a[z])){w>>=a[z+1],h-=a[z+1],o.wt[y++]=a[z+2],m--;break}}else w>>=a[z+1],h-=a[z+1],o.wt[y++]=a[z+2],m--}while(m>=258&&p>=10);return k=c.je-p,k=k>h>>3?h>>3:k,p+=k,d-=k,h-=k<<3,o.ft=w,o.lt=h,c.je=p,c.Ge+=d-c.rt,c.rt=d,o.write=y,it}e.init=(e,i,o,c,f,a)=>{t=vt,u=e,w=i,r=o,h=c,s=f,d=a,n=null},e.ht=(e,y,m)=>{let b,g,k,v,S,z,C,x=0,A=0,_=0;for(_=y.rt,v=y.je,x=e.ft,A=e.lt,S=e.write,z=S=258&&v>=10&&(e.ft=x,e.lt=A,y.je=v,y.Ge+=_-y.rt,y.rt=_,e.write=S,m=p(u,w,r,h,s,d,e,y),_=y.rt,v=y.je,x=e.ft,A=e.lt,S=e.write,z=SA;){if(0===v)return e.ft=x,e.lt=A,y.je=v,y.Ge+=_-y.rt,y.rt=_,e.write=S,e.dt(y,m);m=it,v--,x|=(255&y.ut(_++))<>>=n[g+1],A-=n[g+1],k=n[g],0===k){f=n[g+2],t=_t;break}if(16&k){a=15&k,i=n[g+2],t=zt;break}if(!(64&k)){c=k,o=g/3+n[g+2];break}if(32&k){t=It;break}return t=Dt,y.Fe="invalid literal/length code",m=ft,e.ft=x,e.lt=A,y.je=v,y.Ge+=_-y.rt,y.rt=_,e.write=S,e.dt(y,m);case zt:for(b=a;b>A;){if(0===v)return e.ft=x,e.lt=A,y.je=v,y.Ge+=_-y.rt,y.rt=_,e.write=S,e.dt(y,m);m=it,v--,x|=(255&y.ut(_++))<>=b,A-=b,c=w,n=s,o=d,t=Ct;case Ct:for(b=c;b>A;){if(0===v)return e.ft=x,e.lt=A,y.je=v,y.Ge+=_-y.rt,y.rt=_,e.write=S,e.dt(y,m);m=it,v--,x|=(255&y.ut(_++))<>=n[g+1],A-=n[g+1],k=n[g],16&k){a=15&k,l=n[g+2],t=xt;break}if(!(64&k)){c=k,o=g/3+n[g+2];break}return t=Dt,y.Fe="invalid distance code",m=ft,e.ft=x,e.lt=A,y.je=v,y.Ge+=_-y.rt,y.rt=_,e.write=S,e.dt(y,m);case xt:for(b=a;b>A;){if(0===v)return e.ft=x,e.lt=A,y.je=v,y.Ge+=_-y.rt,y.rt=_,e.write=S,e.dt(y,m);m=it,v--,x|=(255&y.ut(_++))<>=b,A-=b,t=At;case At:for(C=S-l;0>C;)C+=e.end;for(;0!==i;){if(0===z&&(S==e.end&&0!==e.read&&(S=0,z=S7&&(A-=8,v++,_--),e.write=S,m=e.dt(y,m),S=e.write,z=S{}}const Rt=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],Bt=0,Et=1,Mt=2,Ut=3,Kt=4,Nt=5,Ot=6,Tt=7,Wt=8,jt=9;function Ht(e,t){const n=this;let r,s=Bt,o=0,c=0,a=0;const l=[0],u=[0],w=new Vt;let h=0,d=new f(3*wt);const p=new kt;n.lt=0,n.ft=0,n.wt=new i(t),n.end=t,n.read=0,n.write=0,n.reset=(e,t)=>{t&&(t[0]=0),s==Ot&&w.yt(e),s=Bt,n.lt=0,n.ft=0,n.read=n.write=0},n.reset(e,null),n.dt=(e,t)=>{let r,s,i;return s=e.st,i=n.read,r=(i>n.write?n.end:n.write)-i,r>e.nt&&(r=e.nt),0!==r&&t==lt&&(t=it),e.nt-=r,e.Je+=r,e.et.set(n.wt.subarray(i,i+r),s),s+=r,i+=r,i==n.end&&(i=0,n.write==n.end&&(n.write=0),r=n.write-i,r>e.nt&&(r=e.nt),0!==r&&t==lt&&(t=it),e.nt-=r,e.Je+=r,e.et.set(n.wt.subarray(i,i+r),s),s+=r,i+=r),e.st=s,n.read=i,t},n.ht=(e,t)=>{let i,f,y,m,b,g,k,v;for(m=e.rt,b=e.je,f=n.ft,y=n.lt,g=n.write,k=gy;){if(0===b)return n.ft=f,n.lt=y,e.je=b,e.Ge+=m-e.rt,e.rt=m,n.write=g,n.dt(e,t);t=it,b--,f|=(255&e.ut(m++))<>>1){case 0:f>>>=3,y-=3,i=7&y,f>>>=i,y-=i,s=Et;break;case 1:S=[],z=[],C=[[]],x=[[]],kt.ct(S,z,C,x),w.init(S[0],z[0],C[0],0,x[0],0),f>>>=3,y-=3,s=Ot;break;case 2:f>>>=3,y-=3,s=Ut;break;case 3:return f>>>=3,y-=3,s=jt,e.Fe="invalid block type",t=ft,n.ft=f,n.lt=y,e.je=b,e.Ge+=m-e.rt,e.rt=m,n.write=g,n.dt(e,t)}break;case Et:for(;32>y;){if(0===b)return n.ft=f,n.lt=y,e.je=b,e.Ge+=m-e.rt,e.rt=m,n.write=g,n.dt(e,t);t=it,b--,f|=(255&e.ut(m++))<>>16&65535)!=(65535&f))return s=jt,e.Fe="invalid stored block lengths",t=ft,n.ft=f,n.lt=y,e.je=b,e.Ge+=m-e.rt,e.rt=m,n.write=g,n.dt(e,t);o=65535&f,f=y=0,s=0!==o?Mt:0!==h?Tt:Bt;break;case Mt:if(0===b)return n.ft=f,n.lt=y,e.je=b,e.Ge+=m-e.rt,e.rt=m,n.write=g,n.dt(e,t);if(0===k&&(g==n.end&&0!==n.read&&(g=0,k=gb&&(i=b),i>k&&(i=k),n.wt.set(e.He(m,i),g),m+=i,b-=i,g+=i,k-=i,0!=(o-=i))break;s=0!==h?Tt:Bt;break;case Ut:for(;14>y;){if(0===b)return n.ft=f,n.lt=y,e.je=b,e.Ge+=m-e.rt,e.rt=m,n.write=g,n.dt(e,t);t=it,b--,f|=(255&e.ut(m++))<29||(i>>5&31)>29)return s=jt,e.Fe="too many length or distance symbols",t=ft,n.ft=f,n.lt=y,e.je=b,e.Ge+=m-e.rt,e.rt=m,n.write=g,n.dt(e,t);if(i=258+(31&i)+(i>>5&31),!r||r.lengthv;v++)r[v]=0;f>>>=14,y-=14,a=0,s=Kt;case Kt:for(;4+(c>>>10)>a;){for(;3>y;){if(0===b)return n.ft=f,n.lt=y,e.je=b,e.Ge+=m-e.rt,e.rt=m,n.write=g,n.dt(e,t);t=it,b--,f|=(255&e.ut(m++))<>>=3,y-=3}for(;19>a;)r[Rt[a++]]=0;if(l[0]=7,i=p.it(r,l,u,d,e),i!=it)return(t=i)==ft&&(r=null,s=jt),n.ft=f,n.lt=y,e.je=b,e.Ge+=m-e.rt,e.rt=m,n.write=g,n.dt(e,t);a=0,s=Nt;case Nt:for(;i=c,258+(31&i)+(i>>5&31)>a;){let o,w;for(i=l[0];i>y;){if(0===b)return n.ft=f,n.lt=y,e.je=b,e.Ge+=m-e.rt,e.rt=m,n.write=g,n.dt(e,t);t=it,b--,f|=(255&e.ut(m++))<w)f>>>=i,y-=i,r[a++]=w;else{for(v=18==w?7:w-14,o=18==w?11:3;i+v>y;){if(0===b)return n.ft=f,n.lt=y,e.je=b,e.Ge+=m-e.rt,e.rt=m,n.write=g,n.dt(e,t);t=it,b--,f|=(255&e.ut(m++))<>>=i,y-=i,o+=f&ut[v],f>>>=v,y-=v,v=a,i=c,v+o>258+(31&i)+(i>>5&31)||16==w&&1>v)return r=null,s=jt,e.Fe="invalid bit length repeat",t=ft,n.ft=f,n.lt=y,e.je=b,e.Ge+=m-e.rt,e.rt=m,n.write=g,n.dt(e,t);w=16==w?r[v-1]:0;do{r[v++]=w}while(0!=--o);a=v}}if(u[0]=-1,A=[],_=[],I=[],P=[],A[0]=9,_[0]=6,i=c,i=p.ot(257+(31&i),1+(i>>5&31),r,A,_,I,P,d,e),i!=it)return i==ft&&(r=null,s=jt),t=i,n.ft=f,n.lt=y,e.je=b,e.Ge+=m-e.rt,e.rt=m,n.write=g,n.dt(e,t);w.init(A[0],_[0],d,I[0],d,P[0]),s=Ot;case Ot:if(n.ft=f,n.lt=y,e.je=b,e.Ge+=m-e.rt,e.rt=m,n.write=g,(t=w.ht(n,e,t))!=ot)return n.dt(e,t);if(t=it,w.yt(e),m=e.rt,b=e.je,f=n.ft,y=n.lt,g=n.write,k=g{n.reset(e,null),n.wt=null,d=null},n.bt=(e,t,r)=>{n.wt.set(e.subarray(t,t+r),0),n.read=n.write=r},n.gt=()=>s==Et?1:0}const Lt=13,Ft=[0,0,255,255];function qt(){const e=this;function t(e){return e&&e.kt?(e.Ge=e.Je=0,e.Fe=null,e.kt.mode=7,e.kt.vt.reset(e,null),it):ct}e.mode=0,e.method=0,e.St=[0],e.zt=0,e.marker=0,e.Ct=0,e.xt=t=>(e.vt&&e.vt.yt(t),e.vt=null,it),e.At=(n,r)=>(n.Fe=null,e.vt=null,8>r||r>15?(e.xt(n),ct):(e.Ct=r,n.kt.vt=new Ht(n,1<{let n,r;if(!e||!e.kt||!e.tt)return ct;const s=e.kt;for(t=4==t?lt:it,n=lt;;)switch(s.mode){case 0:if(0===e.je)return n;if(n=t,e.je--,e.Ge++,8!=(15&(s.method=e.ut(e.rt++)))){s.mode=Lt,e.Fe="unknown compression method",s.marker=5;break}if(8+(s.method>>4)>s.Ct){s.mode=Lt,e.Fe="invalid win size",s.marker=5;break}s.mode=1;case 1:if(0===e.je)return n;if(n=t,e.je--,e.Ge++,r=255&e.ut(e.rt++),((s.method<<8)+r)%31!=0){s.mode=Lt,e.Fe="incorrect header check",s.marker=5;break}if(!(32&r)){s.mode=7;break}s.mode=2;case 2:if(0===e.je)return n;n=t,e.je--,e.Ge++,s.zt=(255&e.ut(e.rt++))<<24&4278190080,s.mode=3;case 3:if(0===e.je)return n;n=t,e.je--,e.Ge++,s.zt+=(255&e.ut(e.rt++))<<16&16711680,s.mode=4;case 4:if(0===e.je)return n;n=t,e.je--,e.Ge++,s.zt+=(255&e.ut(e.rt++))<<8&65280,s.mode=5;case 5:return 0===e.je?n:(n=t,e.je--,e.Ge++,s.zt+=255&e.ut(e.rt++),s.mode=6,2);case 6:return s.mode=Lt,e.Fe="need dictionary",s.marker=0,ct;case 7:if(n=s.vt.ht(e,n),n==ft){s.mode=Lt,s.marker=0;break}if(n==it&&(n=t),n!=ot)return n;n=t,s.vt.reset(e,s.St),s.mode=12;case 12:return e.je=0,ot;case Lt:return ft;default:return ct}},e.It=(e,t,n)=>{let r=0,s=n;if(!e||!e.kt||6!=e.kt.mode)return ct;const i=e.kt;return s<1<{let n,r,s,i,o;if(!e||!e.kt)return ct;const c=e.kt;if(c.mode!=Lt&&(c.mode=Lt,c.marker=0),0===(n=e.je))return lt;for(r=e.rt,s=c.marker;0!==n&&4>s;)e.ut(r)==Ft[s]?s++:s=0!==e.ut(r)?0:4-s,r++,n--;return e.Ge+=r-e.rt,e.rt=r,e.je=n,c.marker=s,4!=s?ft:(i=e.Ge,o=e.Je,t(e),e.Ge=i,e.Je=o,c.mode=7,it)},e.Dt=e=>e&&e.kt&&e.kt.vt?e.kt.vt.gt():ct}function Gt(){}function Jt(e){const t=new Gt,n=e&&e.chunkSize?r.floor(2*e.chunkSize):131072,o=new i(n);let c=!1;t.At(),t.et=o,this.append=(e,r)=>{const f=[];let a,l,u=0,w=0,h=0;if(0!==e.length){t.rt=0,t.tt=e,t.je=e.length;do{if(t.st=0,t.nt=n,0!==t.je||c||(t.rt=0,c=!0),a=t._t(0),c&&a===lt){if(0!==t.je)throw new s("inflating: bad input")}else if(a!==it&&a!==ot)throw new s("inflating: "+t.Fe);if((c||a===ot)&&t.je===e.length)throw new s("inflating: bad input");t.st&&(t.st===n?f.push(new i(o)):f.push(o.subarray(0,t.st))),h+=t.st,r&&t.rt>0&&t.rt!=u&&(r(t.rt),u=t.rt)}while(t.je>0||0===t.nt);return f.length>1?(l=new i(h),f.forEach((e=>{l.set(e,w),w+=e.length}))):l=f[0]?new i(f[0]):new i,l}},this.flush=()=>{t.xt()}}Gt.prototype={At(e){const t=this;return t.kt=new qt,e||(e=15),t.kt.At(t,e)},_t(e){const t=this;return t.kt?t.kt._t(t,e):ct},xt(){const e=this;if(!e.kt)return ct;const t=e.kt.xt(e);return e.kt=null,t},Pt(){const e=this;return e.kt?e.kt.Pt(e):ct},It(e,t){const n=this;return n.kt?n.kt.It(n,e,t):ct},ut(e){return this.tt[e]},He(e,t){return this.tt.subarray(e,e+t)}},self.initCodec=()=>{self.Deflate=st,self.Inflate=Jt};\n'],{type:"text/javascript"}));e({workerScripts:{inflate:[t],deflate:[t]}})})(ne),e.BlobReader=Pt,e.BlobWriter=Mt,e.Data64URIReader=class extends Ot{constructor(e){super();let t=e.length;for(;"="==e.charAt(t-1);)t--;const r=e.indexOf(",")+1;n.assign(this,{dataURI:e,dataStart:r,size:a.floor(.75*(t-r))})}readUint8Array(e,t){const{dataStart:n,dataURI:r}=this,s=new w(t),i=4*a.floor(e/3),o=atob(r.substring(i+n,4*a.ceil((e+t)/3)+n)),c=e-3*a.floor(i/4);for(let e=c;c+t>e;e++)s[e-c]=o.charCodeAt(e);return s}},e.Data64URIWriter=class extends qt{constructor(e){super(),n.assign(this,{data:"data:"+(e||"")+";base64,",pending:[]})}writeUint8Array(e){const t=this;let n=0,s=t.pending;const i=t.pending.length;for(t.pending="",n=0;n<3*a.floor((i+e.length)/3)-i;n++)s+=r.fromCharCode(e[n]);for(;n2?t.data+=v(s):t.pending=s}getData(){return this.data+v(this.pending)}},e.ERR_BAD_FORMAT=Wn,e.ERR_CENTRAL_DIRECTORY_NOT_FOUND=In,e.ERR_DUPLICATED_NAME=ar,e.ERR_ENCRYPTED=On,e.ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND=jn,e.ERR_EOCDR_NOT_FOUND=Un,e.ERR_EXTRAFIELD_ZIP64_NOT_FOUND=Nn,e.ERR_HTTP_RANGE=Dt,e.ERR_INVALID_COMMENT=or,e.ERR_INVALID_ENCRYPTION_STRENGTH=fr,e.ERR_INVALID_ENTRY_COMMENT=cr,e.ERR_INVALID_ENTRY_NAME=lr,e.ERR_INVALID_EXTRAFIELD_DATA=wr,e.ERR_INVALID_EXTRAFIELD_TYPE=dr,e.ERR_INVALID_PASSWORD=he,e.ERR_INVALID_SIGNATURE=ge,e.ERR_INVALID_VERSION=ur,e.ERR_ITERATOR_COMPLETED_TOO_SOON=Rt,e.ERR_LOCAL_FILE_HEADER_NOT_FOUND=Ln,e.ERR_SPLIT_ZIP_FILE=Mn,e.ERR_UNSUPPORTED_COMPRESSION=Pn,e.ERR_UNSUPPORTED_ENCRYPTION=qn,e.ERR_UNSUPPORTED_FORMAT=pr,e.HttpRangeReader=class extends nn{constructor(e,t={}){t.useRangeHeader=!0,super(e,t)}},e.HttpReader=nn,e.Reader=Ot,e.SplitDataReader=rn,e.SplitDataWriter=sn,e.SplitZipReader=un,e.SplitZipWriter=fn,e.TextReader=class extends Pt{constructor(e){super(new m([e],{type:"text/plain"}))}},e.TextWriter=class extends Mt{constructor(e){super(e),n.assign(this,{encoding:e,utf8:!e||"utf-8"==e.toLowerCase()})}async getData(){const{encoding:e,utf8:t}=this,r=await super.getData();if(r.text&&t)return r.text();{const t=new FileReader;return new y(((s,i)=>{n.assign(t,{onload:({target:e})=>s(e.result),onerror:()=>i(t.error)}),t.readAsText(r,e)}))}}},e.Uint8ArrayReader=class extends Ot{constructor(e){super(),n.assign(this,{array:e,size:e.length})}readUint8Array(e,t){return this.array.slice(e,e+t)}},e.Uint8ArrayWriter=class extends qt{init(e=0){n.assign(this,{offset:0,array:new w(e)}),super.init()}writeUint8Array(e){const t=this;if(t.offset+e.length>t.array.length){const n=t.array;t.array=new w(n.length+e.length),t.array.set(n)}t.array.set(e,t.offset),t.offset+=e.length}getData(){return this.array}},e.Writer=qt,e.ZipReader=Kn,e.ZipReaderStream=class{constructor(e={}){const{readable:t,writable:n}=new x,r=new Kn(t,e).getEntriesGenerator();this.readable=new A({async pull(e){const{done:t,value:n}=await r.next();if(t)return e.close();const s={...n,readable:(()=>{const{readable:e,writable:t}=new x;if(n.getData)return n.getData(t),e})()};delete s.getData,e.enqueue(s)}}),this.writable=n}},e.ZipWriter=yr,e.ZipWriterStream=class{constructor(e={}){const{readable:t,writable:n}=new x;this.readable=t,this.zipWriter=new yr(n,e)}transform(e){const{readable:t,writable:n}=new x({flush:()=>{this.zipWriter.close()}});return this.zipWriter.add(e,t),{readable:this.readable,writable:n}}writable(e){const{readable:t,writable:n}=new x;return this.zipWriter.add(e,t),n}close(e,t={}){return this.zipWriter.close(e,t)}},e.configure=ne,e.getMimeType=()=>"application/octet-stream",e.initReader=on,e.initShimAsyncCodec=(e,t={},n)=>({Deflate:se(e.Deflate,t.deflate,n),Inflate:se(e.Inflate,t.inflate,n)}),e.initStream=an,e.initWriter=cn,e.readUint8Array=ln,e.terminateWorkers=async()=>{await y.allSettled(vt.map((e=>(Ct(e),e.terminate()))))}})); diff --git a/webtool/templates/components/datasource-option.html b/webtool/templates/components/datasource-option.html index 7c6c788de..5eff77e00 100644 --- a/webtool/templates/components/datasource-option.html +++ b/webtool/templates/components/datasource-option.html @@ -2,7 +2,7 @@ {% set fieldset.open = False %} {% elif settings.type == "info" %} -

{{ settings.help|markdown|safe }}

+
{{ settings.help|markdown|safe }}
{% else %}
@@ -11,7 +11,7 @@ {% if "tooltip" in settings %}

{{ settings.tooltip }}

{% endif %} {% elif settings.type == "file" %} - + {% if "tooltip" in settings %}

{{ processors[item.type].title if not deprecated else "(Deprecated analysis) {# 'More' button to show further analysis and preview #}
- {% if current_user.is_authenticated and item.is_finished() and (item.children or (item.num_rows > 0 and item.get_available_processors(exclude_hidden=True))) %} + {% if item.is_finished() and (item.children or (item.num_rows > 0 and current_user.is_authenticated and item.get_available_processors(exclude_hidden=True))) %}