diff --git a/appimage/AppRun b/appimage/AppRun
index 95b7c05..6eccc8d 100755
--- a/appimage/AppRun
+++ b/appimage/AppRun
@@ -1,4 +1,4 @@
#!/bin/sh
cd "$(dirname "$0")"
-exec ./fluffychat
\ No newline at end of file
+exec ./extera_next
diff --git a/appimage/Extera.AppDir/.DirIcon b/appimage/Extera.AppDir/.DirIcon
new file mode 120000
index 0000000..483c081
--- /dev/null
+++ b/appimage/Extera.AppDir/.DirIcon
@@ -0,0 +1 @@
+extera.svg
\ No newline at end of file
diff --git a/appimage/Extera.AppDir/AppRun b/appimage/Extera.AppDir/AppRun
new file mode 100755
index 0000000..6eccc8d
--- /dev/null
+++ b/appimage/Extera.AppDir/AppRun
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+cd "$(dirname "$0")"
+exec ./extera_next
diff --git a/appimage/FluffyChat.desktop b/appimage/Extera.AppDir/Extera.desktop
similarity index 59%
rename from appimage/FluffyChat.desktop
rename to appimage/Extera.AppDir/Extera.desktop
index ceee4c9..81cabe1 100644
--- a/appimage/FluffyChat.desktop
+++ b/appimage/Extera.AppDir/Extera.desktop
@@ -1,9 +1,9 @@
[Desktop Entry]
Type=Application
Version=1.0
-Name=FluffyChat
+Name=Extera Next
Comment=Matrix Client. Chat with your friends
Exec=AppRun
-Icon=fluffychat
+Icon=extera
Terminal=false
-Categories=Network;Chat;InstantMessaging;X-Matrix;
\ No newline at end of file
+Categories=Network;Chat;InstantMessaging;X-Matrix;
diff --git a/appimage/Extera.AppDir/data/flutter_assets/AssetManifest.bin b/appimage/Extera.AppDir/data/flutter_assets/AssetManifest.bin
new file mode 100644
index 0000000..7b2603b
--- /dev/null
+++ b/appimage/Extera.AppDir/data/flutter_assets/AssetManifest.bin
@@ -0,0 +1 @@
+
assets/banner.png
assetassets/banner.pngassets/banner_transparent.png
assetassets/banner_transparent.pngassets/favicon.png
assetassets/favicon.pngassets/info-logo.png
assetassets/info-logo.pngassets/js/olm.zip
assetassets/js/olm.zipassets/logo.png
assetassets/logo.pngassets/logo.svg
assetassets/logo.svgassets/logo_transparent.png
assetassets/logo_transparent.pngassets/sas-emoji.json
assetassets/sas-emoji.jsonassets/sounds/call.ogg
assetassets/sounds/call.oggassets/sounds/notification.ogg
assetassets/sounds/notification.oggassets/sounds/phone.ogg
assetassets/sounds/phone.ogg2packages/cupertino_icons/assets/CupertinoIcons.ttf
asset2packages/cupertino_icons/assets/CupertinoIcons.ttf4packages/flutter_map/lib/assets/flutter_map_logo.png
asset4packages/flutter_map/lib/assets/flutter_map_logo.png2packages/handy_window/assets/handy-window-dark.css
asset2packages/handy_window/assets/handy-window-dark.css-packages/handy_window/assets/handy-window.css
asset-packages/handy_window/assets/handy-window.css(packages/material/lib/fonts/material.ttf
asset(packages/material/lib/fonts/material.ttf7packages/record_web/assets/js/record.fixwebmduration.js
asset7packages/record_web/assets/js/record.fixwebmduration.js/packages/record_web/assets/js/record.worklet.js
asset/packages/record_web/assets/js/record.worklet.js)packages/wakelock_plus/assets/no_sleep.js
asset)packages/wakelock_plus/assets/no_sleep.js
\ No newline at end of file
diff --git a/appimage/Extera.AppDir/data/flutter_assets/AssetManifest.json b/appimage/Extera.AppDir/data/flutter_assets/AssetManifest.json
new file mode 100644
index 0000000..7dfe5ad
--- /dev/null
+++ b/appimage/Extera.AppDir/data/flutter_assets/AssetManifest.json
@@ -0,0 +1 @@
+{"assets/banner.png":["assets/banner.png"],"assets/banner_transparent.png":["assets/banner_transparent.png"],"assets/favicon.png":["assets/favicon.png"],"assets/info-logo.png":["assets/info-logo.png"],"assets/js/olm.zip":["assets/js/olm.zip"],"assets/logo.png":["assets/logo.png"],"assets/logo.svg":["assets/logo.svg"],"assets/logo_transparent.png":["assets/logo_transparent.png"],"assets/sas-emoji.json":["assets/sas-emoji.json"],"assets/sounds/call.ogg":["assets/sounds/call.ogg"],"assets/sounds/notification.ogg":["assets/sounds/notification.ogg"],"assets/sounds/phone.ogg":["assets/sounds/phone.ogg"],"packages/cupertino_icons/assets/CupertinoIcons.ttf":["packages/cupertino_icons/assets/CupertinoIcons.ttf"],"packages/flutter_map/lib/assets/flutter_map_logo.png":["packages/flutter_map/lib/assets/flutter_map_logo.png"],"packages/handy_window/assets/handy-window-dark.css":["packages/handy_window/assets/handy-window-dark.css"],"packages/handy_window/assets/handy-window.css":["packages/handy_window/assets/handy-window.css"],"packages/material/lib/fonts/material.ttf":["packages/material/lib/fonts/material.ttf"],"packages/record_web/assets/js/record.fixwebmduration.js":["packages/record_web/assets/js/record.fixwebmduration.js"],"packages/record_web/assets/js/record.worklet.js":["packages/record_web/assets/js/record.worklet.js"],"packages/wakelock_plus/assets/no_sleep.js":["packages/wakelock_plus/assets/no_sleep.js"]}
\ No newline at end of file
diff --git a/appimage/Extera.AppDir/data/flutter_assets/FontManifest.json b/appimage/Extera.AppDir/data/flutter_assets/FontManifest.json
new file mode 100644
index 0000000..9899cce
--- /dev/null
+++ b/appimage/Extera.AppDir/data/flutter_assets/FontManifest.json
@@ -0,0 +1 @@
+[{"family":"MaterialIcons","fonts":[{"asset":"fonts/MaterialIcons-Regular.otf"}]},{"family":"packages/material/Material","fonts":[{"asset":"packages/material/lib/fonts/material.ttf"}]},{"family":"packages/cupertino_icons/CupertinoIcons","fonts":[{"asset":"packages/cupertino_icons/assets/CupertinoIcons.ttf"}]}]
\ No newline at end of file
diff --git a/appimage/Extera.AppDir/data/flutter_assets/NOTICES.Z b/appimage/Extera.AppDir/data/flutter_assets/NOTICES.Z
new file mode 100644
index 0000000..4855464
Binary files /dev/null and b/appimage/Extera.AppDir/data/flutter_assets/NOTICES.Z differ
diff --git a/appimage/Extera.AppDir/data/flutter_assets/NativeAssetsManifest.json b/appimage/Extera.AppDir/data/flutter_assets/NativeAssetsManifest.json
new file mode 100644
index 0000000..523bfc7
--- /dev/null
+++ b/appimage/Extera.AppDir/data/flutter_assets/NativeAssetsManifest.json
@@ -0,0 +1 @@
+{"format-version":[1,0,0],"native-assets":{}}
\ No newline at end of file
diff --git a/appimage/Extera.AppDir/data/flutter_assets/assets/banner.png b/appimage/Extera.AppDir/data/flutter_assets/assets/banner.png
new file mode 100644
index 0000000..8e1bb36
Binary files /dev/null and b/appimage/Extera.AppDir/data/flutter_assets/assets/banner.png differ
diff --git a/appimage/Extera.AppDir/data/flutter_assets/assets/banner_transparent.png b/appimage/Extera.AppDir/data/flutter_assets/assets/banner_transparent.png
new file mode 100644
index 0000000..8e1bb36
Binary files /dev/null and b/appimage/Extera.AppDir/data/flutter_assets/assets/banner_transparent.png differ
diff --git a/appimage/Extera.AppDir/data/flutter_assets/assets/favicon.png b/appimage/Extera.AppDir/data/flutter_assets/assets/favicon.png
new file mode 100644
index 0000000..61d0656
Binary files /dev/null and b/appimage/Extera.AppDir/data/flutter_assets/assets/favicon.png differ
diff --git a/appimage/Extera.AppDir/data/flutter_assets/assets/info-logo.png b/appimage/Extera.AppDir/data/flutter_assets/assets/info-logo.png
new file mode 100644
index 0000000..61d0656
Binary files /dev/null and b/appimage/Extera.AppDir/data/flutter_assets/assets/info-logo.png differ
diff --git a/appimage/Extera.AppDir/data/flutter_assets/assets/js/olm.zip b/appimage/Extera.AppDir/data/flutter_assets/assets/js/olm.zip
new file mode 100644
index 0000000..8537307
--- /dev/null
+++ b/appimage/Extera.AppDir/data/flutter_assets/assets/js/olm.zip
@@ -0,0 +1 @@
+Not Found
\ No newline at end of file
diff --git a/appimage/Extera.AppDir/data/flutter_assets/assets/logo.png b/appimage/Extera.AppDir/data/flutter_assets/assets/logo.png
new file mode 100644
index 0000000..61d0656
Binary files /dev/null and b/appimage/Extera.AppDir/data/flutter_assets/assets/logo.png differ
diff --git a/appimage/Extera.AppDir/data/flutter_assets/assets/logo.svg b/appimage/Extera.AppDir/data/flutter_assets/assets/logo.svg
new file mode 100644
index 0000000..767a86a
--- /dev/null
+++ b/appimage/Extera.AppDir/data/flutter_assets/assets/logo.svg
@@ -0,0 +1,11 @@
+
\ No newline at end of file
diff --git a/appimage/Extera.AppDir/data/flutter_assets/assets/logo_transparent.png b/appimage/Extera.AppDir/data/flutter_assets/assets/logo_transparent.png
new file mode 100644
index 0000000..61d0656
Binary files /dev/null and b/appimage/Extera.AppDir/data/flutter_assets/assets/logo_transparent.png differ
diff --git a/appimage/Extera.AppDir/data/flutter_assets/assets/sas-emoji.json b/appimage/Extera.AppDir/data/flutter_assets/assets/sas-emoji.json
new file mode 100644
index 0000000..f0eb702
--- /dev/null
+++ b/appimage/Extera.AppDir/data/flutter_assets/assets/sas-emoji.json
@@ -0,0 +1,2178 @@
+[
+ {
+ "number": 0,
+ "emoji": "🐶",
+ "description": "Dog",
+ "unicode": "U+1F436",
+ "translated_descriptions": {
+ "ar": "كَلب",
+ "bg": "Куче",
+ "ca": "Gos",
+ "cs": "Pes",
+ "de": "Hund",
+ "eo": "Hundo",
+ "es": "Perro",
+ "et": "Koer",
+ "fi": "Koira",
+ "fr": "Chien",
+ "hr": "pas",
+ "hu": "Kutya",
+ "it": "Cane",
+ "ja": "犬",
+ "nb_NO": "Hund",
+ "nl": "Hond",
+ "pt_BR": "Cachorro",
+ "ru": "Собака",
+ "si": "බල්ලා",
+ "sk": "Hlava psa",
+ "sr": "пас",
+ "sv": "Hund",
+ "szl": null,
+ "tzm": "Aydi",
+ "uk": "Пес",
+ "zh_Hans": "狗"
+ }
+ },
+ {
+ "number": 1,
+ "emoji": "🐱",
+ "description": "Cat",
+ "unicode": "U+1F431",
+ "translated_descriptions": {
+ "ar": "هِرَّة",
+ "bg": "Котка",
+ "ca": "Gat",
+ "cs": "Kočka",
+ "de": "Katze",
+ "eo": "Kato",
+ "es": "Gato",
+ "et": "Kass",
+ "fi": "Kissa",
+ "fr": "Chat",
+ "hr": "mačka",
+ "hu": "Macska",
+ "it": "Gatto",
+ "ja": "猫",
+ "nb_NO": "Katt",
+ "nl": "Kat",
+ "pt_BR": "Gato",
+ "ru": "Кошка",
+ "si": "පූසා",
+ "sk": "Hlava mačky",
+ "sr": "мачка",
+ "sv": "Katt",
+ "szl": null,
+ "tzm": "Amuc",
+ "uk": "Кіт",
+ "zh_Hans": "猫"
+ }
+ },
+ {
+ "number": 2,
+ "emoji": "🦁",
+ "description": "Lion",
+ "unicode": "U+1F981",
+ "translated_descriptions": {
+ "ar": "أَسَد",
+ "bg": "Лъв",
+ "ca": "Lleó",
+ "cs": "Lev",
+ "de": "Löwe",
+ "eo": "Leono",
+ "es": "León",
+ "et": "Lõvi",
+ "fi": "Leijona",
+ "fr": "Lion",
+ "hr": "lav",
+ "hu": "Oroszlán",
+ "it": "Leone",
+ "ja": "ライオン",
+ "nb_NO": "Løve",
+ "nl": "Leeuw",
+ "pt_BR": "Leão",
+ "ru": "Лев",
+ "si": "සිංහයා",
+ "sk": "Hlava leva",
+ "sr": "лав",
+ "sv": "Lejon",
+ "szl": null,
+ "tzm": "Izem",
+ "uk": "Лев",
+ "zh_Hans": "狮子"
+ }
+ },
+ {
+ "number": 3,
+ "emoji": "🐎",
+ "description": "Horse",
+ "unicode": "U+1F40E",
+ "translated_descriptions": {
+ "ar": "حِصَان",
+ "bg": "Кон",
+ "ca": "Cavall",
+ "cs": "Kůň",
+ "de": "Pferd",
+ "eo": "Ĉevalo",
+ "es": "Caballo",
+ "et": "Hobune",
+ "fi": "Hevonen",
+ "fr": "Cheval",
+ "hr": "konj",
+ "hu": "Ló",
+ "it": "Cavallo",
+ "ja": "馬",
+ "nb_NO": "Hest",
+ "nl": "Paard",
+ "pt_BR": "Cavalo",
+ "ru": "Лошадь",
+ "si": "අශ්වයා",
+ "sk": "Kôň",
+ "sr": "коњ",
+ "sv": "Häst",
+ "szl": null,
+ "tzm": "Ayyis",
+ "uk": "Кінь",
+ "zh_Hans": "马"
+ }
+ },
+ {
+ "number": 4,
+ "emoji": "🦄",
+ "description": "Unicorn",
+ "unicode": "U+1F984",
+ "translated_descriptions": {
+ "ar": "حِصَانٌ بِقَرن",
+ "bg": "Еднорог",
+ "ca": "Unicorn",
+ "cs": "Jednorožec",
+ "de": "Einhorn",
+ "eo": "Unukorno",
+ "es": "Unicornio",
+ "et": "Ükssarvik",
+ "fi": "Yksisarvinen",
+ "fr": "Licorne",
+ "hr": "jednorog",
+ "hu": "Egyszarvú",
+ "it": "Unicorno",
+ "ja": "ユニコーン",
+ "nb_NO": "Enhjørning",
+ "nl": "Eenhoorn",
+ "pt_BR": "Unicórnio",
+ "ru": "Единорог",
+ "si": null,
+ "sk": "Hlava jednorožca",
+ "sr": "једнорог",
+ "sv": "Enhörning",
+ "szl": null,
+ "tzm": null,
+ "uk": "Єдиноріг",
+ "zh_Hans": "独角兽"
+ }
+ },
+ {
+ "number": 5,
+ "emoji": "🐷",
+ "description": "Pig",
+ "unicode": "U+1F437",
+ "translated_descriptions": {
+ "ar": "خِنزِير",
+ "bg": "Прасе",
+ "ca": "Porc",
+ "cs": "Prase",
+ "de": "Schwein",
+ "eo": "Porko",
+ "es": "Cerdo",
+ "et": "Siga",
+ "fi": "Sika",
+ "fr": "Cochon",
+ "hr": "svinja",
+ "hu": "Malac",
+ "it": "Maiale",
+ "ja": "ブタ",
+ "nb_NO": "Gris",
+ "nl": "Varken",
+ "pt_BR": "Porco",
+ "ru": "Свинья",
+ "si": null,
+ "sk": "Hlava prasaťa",
+ "sr": "прасе",
+ "sv": "Gris",
+ "szl": null,
+ "tzm": "Ilef",
+ "uk": "Свиня",
+ "zh_Hans": "猪"
+ }
+ },
+ {
+ "number": 6,
+ "emoji": "🐘",
+ "description": "Elephant",
+ "unicode": "U+1F418",
+ "translated_descriptions": {
+ "ar": "فِيل",
+ "bg": "Слон",
+ "ca": "Elefant",
+ "cs": "Slon",
+ "de": "Elefant",
+ "eo": "Elefanto",
+ "es": "Elefante",
+ "et": "Elevant",
+ "fi": "Norsu",
+ "fr": "Éléphant",
+ "hr": "slon",
+ "hu": "Elefánt",
+ "it": "Elefante",
+ "ja": "ゾウ",
+ "nb_NO": "Elefant",
+ "nl": "Olifant",
+ "pt_BR": "Elefante",
+ "ru": "Слон",
+ "si": null,
+ "sk": "Slon",
+ "sr": "слон",
+ "sv": "Elefant",
+ "szl": null,
+ "tzm": "Ilu",
+ "uk": "Слон",
+ "zh_Hans": "大象"
+ }
+ },
+ {
+ "number": 7,
+ "emoji": "🐰",
+ "description": "Rabbit",
+ "unicode": "U+1F430",
+ "translated_descriptions": {
+ "ar": "أَرنَب",
+ "bg": "Заек",
+ "ca": "Conill",
+ "cs": "Králík",
+ "de": "Hase",
+ "eo": "Kuniklo",
+ "es": "Conejo",
+ "et": "Jänes",
+ "fi": "Kani",
+ "fr": "Lapin",
+ "hr": "zec",
+ "hu": "Nyúl",
+ "it": "Coniglio",
+ "ja": "うさぎ",
+ "nb_NO": "Kanin",
+ "nl": "Konijn",
+ "pt_BR": "Coelho",
+ "ru": "Кролик",
+ "si": null,
+ "sk": "Hlava zajaca",
+ "sr": "зец",
+ "sv": "Kanin",
+ "szl": null,
+ "tzm": "Agnin",
+ "uk": "Кріль",
+ "zh_Hans": "兔子"
+ }
+ },
+ {
+ "number": 8,
+ "emoji": "🐼",
+ "description": "Panda",
+ "unicode": "U+1F43C",
+ "translated_descriptions": {
+ "ar": "باندَا",
+ "bg": "Панда",
+ "ca": "Panda",
+ "cs": "Panda",
+ "de": "Panda",
+ "eo": "Pando",
+ "es": "Panda",
+ "et": "Panda",
+ "fi": "Panda",
+ "fr": "Panda",
+ "hr": "panda",
+ "hu": "Panda",
+ "it": "Panda",
+ "ja": "パンダ",
+ "nb_NO": "Panda",
+ "nl": "Panda",
+ "pt_BR": "Panda",
+ "ru": "Панда",
+ "si": null,
+ "sk": "Hlava pandy",
+ "sr": "панда",
+ "sv": "Panda",
+ "szl": null,
+ "tzm": null,
+ "uk": "Панда",
+ "zh_Hans": "熊猫"
+ }
+ },
+ {
+ "number": 9,
+ "emoji": "🐓",
+ "description": "Rooster",
+ "unicode": "U+1F413",
+ "translated_descriptions": {
+ "ar": "دِيك",
+ "bg": "Петел",
+ "ca": "Gall",
+ "cs": "Kohout",
+ "de": "Hahn",
+ "eo": "Virkoko",
+ "es": "Gallo",
+ "et": "Kukk",
+ "fi": "Kukko",
+ "fr": "Coq",
+ "hr": "kokot",
+ "hu": "Kakas",
+ "it": "Gallo",
+ "ja": "ニワトリ",
+ "nb_NO": "Hane",
+ "nl": "Haan",
+ "pt_BR": "Galo",
+ "ru": "Петух",
+ "si": null,
+ "sk": "Kohút",
+ "sr": "петао",
+ "sv": "Tupp",
+ "szl": null,
+ "tzm": "Ayaẓiḍ",
+ "uk": "Когут",
+ "zh_Hans": "公鸡"
+ }
+ },
+ {
+ "number": 10,
+ "emoji": "🐧",
+ "description": "Penguin",
+ "unicode": "U+1F427",
+ "translated_descriptions": {
+ "ar": "بِطريق",
+ "bg": "Пингвин",
+ "ca": "Pingüí",
+ "cs": "Tučňák",
+ "de": "Pinguin",
+ "eo": "Pingveno",
+ "es": "Pingüino",
+ "et": "Pingviin",
+ "fi": "Pingviini",
+ "fr": "Manchot",
+ "hr": "pingvin",
+ "hu": "Pingvin",
+ "it": "Pinguino",
+ "ja": "ペンギン",
+ "nb_NO": "Pingvin",
+ "nl": "Pinguïn",
+ "pt_BR": "Pinguim",
+ "ru": "Пингвин",
+ "si": null,
+ "sk": "Tučniak",
+ "sr": "пингвин",
+ "sv": "Pingvin",
+ "szl": null,
+ "tzm": null,
+ "uk": "Пінгвін",
+ "zh_Hans": "企鹅"
+ }
+ },
+ {
+ "number": 11,
+ "emoji": "🐢",
+ "description": "Turtle",
+ "unicode": "U+1F422",
+ "translated_descriptions": {
+ "ar": "سُلحفاة",
+ "bg": "Костенурка",
+ "ca": "Tortuga",
+ "cs": "Želva",
+ "de": "Schildkröte",
+ "eo": "Testudo",
+ "es": "Tortuga",
+ "et": "Kilpkonn",
+ "fi": "Kilpikonna",
+ "fr": "Tortue",
+ "hr": "kornjača",
+ "hu": "Teknős",
+ "it": "Tartaruga",
+ "ja": "亀",
+ "nb_NO": "Skilpadde",
+ "nl": "Schildpad",
+ "pt_BR": "Tartaruga",
+ "ru": "Черепаха",
+ "si": null,
+ "sk": "Korytnačka",
+ "sr": "корњача",
+ "sv": "Sköldpadda",
+ "szl": null,
+ "tzm": "Ifker",
+ "uk": "Черепаха",
+ "zh_Hans": "乌龟"
+ }
+ },
+ {
+ "number": 12,
+ "emoji": "🐟",
+ "description": "Fish",
+ "unicode": "U+1F41F",
+ "translated_descriptions": {
+ "ar": "سَمَكَة",
+ "bg": "Риба",
+ "ca": "Peix",
+ "cs": "Ryba",
+ "de": "Fisch",
+ "eo": "Fiŝo",
+ "es": "Pez",
+ "et": "Kala",
+ "fi": "Kala",
+ "fr": "Poisson",
+ "hr": "riba",
+ "hu": "Hal",
+ "it": "Pesce",
+ "ja": "魚",
+ "nb_NO": "Fisk",
+ "nl": "Vis",
+ "pt_BR": "Peixe",
+ "ru": "Рыба",
+ "si": null,
+ "sk": "Ryba",
+ "sr": "риба",
+ "sv": "Fisk",
+ "szl": null,
+ "tzm": "Aselm",
+ "uk": "Риба",
+ "zh_Hans": "鱼"
+ }
+ },
+ {
+ "number": 13,
+ "emoji": "🐙",
+ "description": "Octopus",
+ "unicode": "U+1F419",
+ "translated_descriptions": {
+ "ar": "أُخطُبُوط",
+ "bg": "Октопод",
+ "ca": "Pop",
+ "cs": "Chobotnice",
+ "de": "Oktopus",
+ "eo": "Polpo",
+ "es": "Pulpo",
+ "et": "Kaheksajalg",
+ "fi": "Tursas",
+ "fr": "Poulpe",
+ "hr": "hobotnica",
+ "hu": "Polip",
+ "it": "Polpo",
+ "ja": "たこ",
+ "nb_NO": "Blekksprut",
+ "nl": "Octopus",
+ "pt_BR": "Polvo",
+ "ru": "Осьминог",
+ "si": null,
+ "sk": "Chobotnica",
+ "sr": "октопод",
+ "sv": "Bläckfisk",
+ "szl": null,
+ "tzm": null,
+ "uk": "Восьминіг",
+ "zh_Hans": "章鱼"
+ }
+ },
+ {
+ "number": 14,
+ "emoji": "🦋",
+ "description": "Butterfly",
+ "unicode": "U+1F98B",
+ "translated_descriptions": {
+ "ar": "فَرَاشَة",
+ "bg": "Пеперуда",
+ "ca": "Papallona",
+ "cs": "Motýl",
+ "de": "Schmetterling",
+ "eo": "Papilio",
+ "es": "Mariposa",
+ "et": "Liblikas",
+ "fi": "Perhonen",
+ "fr": "Papillon",
+ "hr": "leptir",
+ "hu": "Pillangó",
+ "it": "Farfalla",
+ "ja": "ちょうちょ",
+ "nb_NO": "Sommerfugl",
+ "nl": "Vlinder",
+ "pt_BR": "Borboleta",
+ "ru": "Бабочка",
+ "si": null,
+ "sk": "Motýľ",
+ "sr": "лептир",
+ "sv": "Fjäril",
+ "szl": null,
+ "tzm": null,
+ "uk": "Метелик",
+ "zh_Hans": "蝴蝶"
+ }
+ },
+ {
+ "number": 15,
+ "emoji": "🌷",
+ "description": "Flower",
+ "unicode": "U+1F337",
+ "translated_descriptions": {
+ "ar": "زَهرَة",
+ "bg": "Цвете",
+ "ca": "Flor",
+ "cs": "Květina",
+ "de": "Blume",
+ "eo": "Floro",
+ "es": "Flor",
+ "et": "Lill",
+ "fi": "Kukka",
+ "fr": "Fleur",
+ "hr": "svijet",
+ "hu": "Virág",
+ "it": "Fiore",
+ "ja": "花",
+ "nb_NO": "Blomst",
+ "nl": "Bloem",
+ "pt_BR": "Flor",
+ "ru": "Цветок",
+ "si": null,
+ "sk": "Tulipán",
+ "sr": "цвет",
+ "sv": "Blomma",
+ "szl": null,
+ "tzm": null,
+ "uk": "Квітка",
+ "zh_Hans": "花"
+ }
+ },
+ {
+ "number": 16,
+ "emoji": "🌳",
+ "description": "Tree",
+ "unicode": "U+1F333",
+ "translated_descriptions": {
+ "ar": "شَجَرَة",
+ "bg": "Дърво",
+ "ca": "Arbre",
+ "cs": "Strom",
+ "de": "Baum",
+ "eo": "Arbo",
+ "es": "Árbol",
+ "et": "Puu",
+ "fi": "Puu",
+ "fr": "Arbre",
+ "hr": "drvo",
+ "hu": "Fa",
+ "it": "Albero",
+ "ja": "木",
+ "nb_NO": "Tre",
+ "nl": "Boom",
+ "pt_BR": "Árvore",
+ "ru": "Дерево",
+ "si": null,
+ "sk": "Listnatý strom",
+ "sr": "дрво",
+ "sv": "Träd",
+ "szl": null,
+ "tzm": "Aseklu",
+ "uk": "Дерево",
+ "zh_Hans": "树"
+ }
+ },
+ {
+ "number": 17,
+ "emoji": "🌵",
+ "description": "Cactus",
+ "unicode": "U+1F335",
+ "translated_descriptions": {
+ "ar": "صبار",
+ "bg": "Кактус",
+ "ca": "Cactus",
+ "cs": "Kaktus",
+ "de": "Kaktus",
+ "eo": "Kakto",
+ "es": "Cactus",
+ "et": "Kaktus",
+ "fi": "Kaktus",
+ "fr": "Cactus",
+ "hr": "kaktus",
+ "hu": "Kaktusz",
+ "it": "Cactus",
+ "ja": "サボテン",
+ "nb_NO": "Kaktus",
+ "nl": "Cactus",
+ "pt_BR": "Cacto",
+ "ru": "Кактус",
+ "si": null,
+ "sk": "Kaktus",
+ "sr": "кактус",
+ "sv": "Kaktus",
+ "szl": null,
+ "tzm": null,
+ "uk": "Кактус",
+ "zh_Hans": "仙人掌"
+ }
+ },
+ {
+ "number": 18,
+ "emoji": "🍄",
+ "description": "Mushroom",
+ "unicode": "U+1F344",
+ "translated_descriptions": {
+ "ar": "فُطر",
+ "bg": "Гъба",
+ "ca": "Bolet",
+ "cs": "Houba",
+ "de": "Pilz",
+ "eo": "Fungo",
+ "es": "Seta",
+ "et": "Seen",
+ "fi": "Sieni",
+ "fr": "Champignon",
+ "hr": "gljiva",
+ "hu": "Gomba",
+ "it": "Fungo",
+ "ja": "きのこ",
+ "nb_NO": "Sopp",
+ "nl": "Paddenstoel",
+ "pt_BR": "Cogumelo",
+ "ru": "Гриб",
+ "si": null,
+ "sk": "Huba",
+ "sr": "печурка",
+ "sv": "Svamp",
+ "szl": null,
+ "tzm": "Agursel",
+ "uk": "Гриб",
+ "zh_Hans": "蘑菇"
+ }
+ },
+ {
+ "number": 19,
+ "emoji": "🌏",
+ "description": "Globe",
+ "unicode": "U+1F30F",
+ "translated_descriptions": {
+ "ar": "كُرَةٌ أرضِيَّة",
+ "bg": "Глобус",
+ "ca": "Globus terraqüi",
+ "cs": "Zeměkoule",
+ "de": "Globus",
+ "eo": "Globo",
+ "es": "Globo",
+ "et": "Maakera",
+ "fi": "Maapallo",
+ "fr": "Globe",
+ "hr": "Globus",
+ "hu": "Földgömb",
+ "it": "Globo",
+ "ja": "地球",
+ "nb_NO": "Globus",
+ "nl": "Wereldbol",
+ "pt_BR": "Globo",
+ "ru": "Глобус",
+ "si": null,
+ "sk": "Zemeguľa",
+ "sr": "глобус",
+ "sv": "Jordklot",
+ "szl": null,
+ "tzm": null,
+ "uk": "Глобус",
+ "zh_Hans": "地球"
+ }
+ },
+ {
+ "number": 20,
+ "emoji": "🌙",
+ "description": "Moon",
+ "unicode": "U+1F319",
+ "translated_descriptions": {
+ "ar": "قَمَر",
+ "bg": "Луна",
+ "ca": "Lluna",
+ "cs": "Měsíc",
+ "de": "Mond",
+ "eo": "Luno",
+ "es": "Luna",
+ "et": "Kuu",
+ "fi": "Kuu",
+ "fr": "Lune",
+ "hr": "mjesec",
+ "hu": "Hold",
+ "it": "Luna",
+ "ja": "月",
+ "nb_NO": "Måne",
+ "nl": "Maan",
+ "pt_BR": "Lua",
+ "ru": "Луна",
+ "si": null,
+ "sk": "Polmesiac",
+ "sr": "месец",
+ "sv": "Måne",
+ "szl": null,
+ "tzm": "Ayyur",
+ "uk": "Місяць",
+ "zh_Hans": "月亮"
+ }
+ },
+ {
+ "number": 21,
+ "emoji": "☁️",
+ "description": "Cloud",
+ "unicode": "U+2601U+FE0F",
+ "translated_descriptions": {
+ "ar": "سَحابَة",
+ "bg": "Облак",
+ "ca": "Núvol",
+ "cs": "Mrak",
+ "de": "Wolke",
+ "eo": "Nubo",
+ "es": "Nube",
+ "et": "Pilv",
+ "fi": "Pilvi",
+ "fr": "Nuage",
+ "hr": "oblak",
+ "hu": "Felhő",
+ "it": "Nuvola",
+ "ja": "雲",
+ "nb_NO": "Sky",
+ "nl": "Wolk",
+ "pt_BR": "Nuvem",
+ "ru": "Облако",
+ "si": null,
+ "sk": "Oblak",
+ "sr": "облак",
+ "sv": "Moln",
+ "szl": null,
+ "tzm": null,
+ "uk": "Хмара",
+ "zh_Hans": "云"
+ }
+ },
+ {
+ "number": 22,
+ "emoji": "🔥",
+ "description": "Fire",
+ "unicode": "U+1F525",
+ "translated_descriptions": {
+ "ar": "نار",
+ "bg": "Огън",
+ "ca": "Foc",
+ "cs": "Oheň",
+ "de": "Feuer",
+ "eo": "Fajro",
+ "es": "Fuego",
+ "et": "Tuli",
+ "fi": "Tuli",
+ "fr": "Feu",
+ "hr": "vatra",
+ "hu": "Tűz",
+ "it": "Fuoco",
+ "ja": "炎",
+ "nb_NO": "Flamme",
+ "nl": "Vuur",
+ "pt_BR": "Fogo",
+ "ru": "Огонь",
+ "si": null,
+ "sk": "Oheň",
+ "sr": "ватра",
+ "sv": "Eld",
+ "szl": null,
+ "tzm": "Timessi",
+ "uk": "Вогонь",
+ "zh_Hans": "火"
+ }
+ },
+ {
+ "number": 23,
+ "emoji": "🍌",
+ "description": "Banana",
+ "unicode": "U+1F34C",
+ "translated_descriptions": {
+ "ar": "مَوزَة",
+ "bg": "Банан",
+ "ca": "Plàtan",
+ "cs": "Banán",
+ "de": "Banane",
+ "eo": "Banano",
+ "es": "Plátano",
+ "et": "Banaan",
+ "fi": "Banaani",
+ "fr": "Banane",
+ "hr": "banana",
+ "hu": "Banán",
+ "it": "Banana",
+ "ja": "バナナ",
+ "nb_NO": "Banan",
+ "nl": "Banaan",
+ "pt_BR": "Banana",
+ "ru": "Банан",
+ "si": null,
+ "sk": "Banán",
+ "sr": "банана",
+ "sv": "Banan",
+ "szl": null,
+ "tzm": "Tabanant",
+ "uk": "Банан",
+ "zh_Hans": "香蕉"
+ }
+ },
+ {
+ "number": 24,
+ "emoji": "🍎",
+ "description": "Apple",
+ "unicode": "U+1F34E",
+ "translated_descriptions": {
+ "ar": "تُفَّاحَة",
+ "bg": "Ябълка",
+ "ca": "Poma",
+ "cs": "Jablko",
+ "de": "Apfel",
+ "eo": "Pomo",
+ "es": "Manzana",
+ "et": "Õun",
+ "fi": "Omena",
+ "fr": "Pomme",
+ "hr": "jabuka",
+ "hu": "Alma",
+ "it": "Mela",
+ "ja": "リンゴ",
+ "nb_NO": "Eple",
+ "nl": "Appel",
+ "pt_BR": "Maçã",
+ "ru": "Яблоко",
+ "si": null,
+ "sk": "Červené jablko",
+ "sr": "јабука",
+ "sv": "Äpple",
+ "szl": null,
+ "tzm": "Tadeffuyt",
+ "uk": "Яблуко",
+ "zh_Hans": "苹果"
+ }
+ },
+ {
+ "number": 25,
+ "emoji": "🍓",
+ "description": "Strawberry",
+ "unicode": "U+1F353",
+ "translated_descriptions": {
+ "ar": "فَراوِلَة",
+ "bg": "Ягода",
+ "ca": "Maduixa",
+ "cs": "Jahoda",
+ "de": "Erdbeere",
+ "eo": "Frago",
+ "es": "Fresa",
+ "et": "Maasikas",
+ "fi": "Mansikka",
+ "fr": "Fraise",
+ "hr": "jagoda",
+ "hu": "Eper",
+ "it": "Fragola",
+ "ja": "いちご",
+ "nb_NO": "Jordbær",
+ "nl": "Aardbei",
+ "pt_BR": "Morango",
+ "ru": "Клубника",
+ "si": null,
+ "sk": "Jahoda",
+ "sr": "јагода",
+ "sv": "Jordgubbe",
+ "szl": null,
+ "tzm": null,
+ "uk": "Полуниця",
+ "zh_Hans": "草莓"
+ }
+ },
+ {
+ "number": 26,
+ "emoji": "🌽",
+ "description": "Corn",
+ "unicode": "U+1F33D",
+ "translated_descriptions": {
+ "ar": "ذُرَة",
+ "bg": "Царевица",
+ "ca": "Blat de moro",
+ "cs": "Kukuřice",
+ "de": "Mais",
+ "eo": "Maizo",
+ "es": "Maíz",
+ "et": "Mais",
+ "fi": "Maissi",
+ "fr": "Maïs",
+ "hr": "kukuruza",
+ "hu": "Kukorica",
+ "it": "Mais",
+ "ja": "とうもろこし",
+ "nb_NO": "Mais",
+ "nl": "Maïs",
+ "pt_BR": "Milho",
+ "ru": "Кукуруза",
+ "si": null,
+ "sk": "Kukuričný klas",
+ "sr": "кукуруз",
+ "sv": "Majs",
+ "szl": null,
+ "tzm": null,
+ "uk": "Кукурудза",
+ "zh_Hans": "玉米"
+ }
+ },
+ {
+ "number": 27,
+ "emoji": "🍕",
+ "description": "Pizza",
+ "unicode": "U+1F355",
+ "translated_descriptions": {
+ "ar": "بِيتزا",
+ "bg": "Пица",
+ "ca": "Pizza",
+ "cs": "Pizza",
+ "de": "Pizza",
+ "eo": "Pico",
+ "es": "Pizza",
+ "et": "Pitsa",
+ "fi": "Pizza",
+ "fr": "Pizza",
+ "hr": "pizza",
+ "hu": "Pizza",
+ "it": "Pizza",
+ "ja": "ピザ",
+ "nb_NO": "Pizza",
+ "nl": "Pizza",
+ "pt_BR": "Pizza",
+ "ru": "Пицца",
+ "si": null,
+ "sk": "Pizza",
+ "sr": "пица",
+ "sv": "Pizza",
+ "szl": null,
+ "tzm": null,
+ "uk": "Піца",
+ "zh_Hans": "披萨"
+ }
+ },
+ {
+ "number": 28,
+ "emoji": "🎂",
+ "description": "Cake",
+ "unicode": "U+1F382",
+ "translated_descriptions": {
+ "ar": "كَعكَة",
+ "bg": "Торта",
+ "ca": "Pastís",
+ "cs": "Dort",
+ "de": "Kuchen",
+ "eo": "Torto",
+ "es": "Tarta",
+ "et": "Kook",
+ "fi": "Kakku",
+ "fr": "Gâteau",
+ "hr": "torta",
+ "hu": "Süti",
+ "it": "Torta",
+ "ja": "ケーキ",
+ "nb_NO": "Kake",
+ "nl": "Taart",
+ "pt_BR": "Bolo",
+ "ru": "Торт",
+ "si": null,
+ "sk": "Narodeninová torta",
+ "sr": "торта",
+ "sv": "Tårta",
+ "szl": null,
+ "tzm": null,
+ "uk": "Пиріг",
+ "zh_Hans": "蛋糕"
+ }
+ },
+ {
+ "number": 29,
+ "emoji": "❤️",
+ "description": "Heart",
+ "unicode": "U+2764U+FE0F",
+ "translated_descriptions": {
+ "ar": "قَلب",
+ "bg": "Сърце",
+ "ca": "Cor",
+ "cs": "Srdce",
+ "de": "Herz",
+ "eo": "Koro",
+ "es": "Corazón",
+ "et": "Süda",
+ "fi": "Sydän",
+ "fr": "Cœur",
+ "hr": "srca",
+ "hu": "Szív",
+ "it": "Cuore",
+ "ja": "ハート",
+ "nb_NO": "Hjerte",
+ "nl": "Hart",
+ "pt_BR": "Coração",
+ "ru": "Сердце",
+ "si": null,
+ "sk": "červené srdce",
+ "sr": "срце",
+ "sv": "Hjärta",
+ "szl": null,
+ "tzm": "Ul",
+ "uk": "Серце",
+ "zh_Hans": "心"
+ }
+ },
+ {
+ "number": 30,
+ "emoji": "😀",
+ "description": "Smiley",
+ "unicode": "U+1F600",
+ "translated_descriptions": {
+ "ar": "اِبتِسَامَة",
+ "bg": "Усмивка",
+ "ca": "Somrient",
+ "cs": "Smajlík",
+ "de": "Lächeln",
+ "eo": "Rideto",
+ "es": "Emoticono",
+ "et": "Smaili",
+ "fi": "Hymynaama",
+ "fr": "Sourire",
+ "hr": "smajlića",
+ "hu": "Mosoly",
+ "it": "Faccina sorridente",
+ "ja": "スマイル",
+ "nb_NO": "Smilefjes",
+ "nl": "Smiley",
+ "pt_BR": "Sorriso",
+ "ru": "Улыбка",
+ "si": null,
+ "sk": "Škeriaca sa tvár",
+ "sr": "смајли",
+ "sv": "Smiley",
+ "szl": null,
+ "tzm": null,
+ "uk": "Посмішка",
+ "zh_Hans": "笑脸"
+ }
+ },
+ {
+ "number": 31,
+ "emoji": "🤖",
+ "description": "Robot",
+ "unicode": "U+1F916",
+ "translated_descriptions": {
+ "ar": "رُوبُوت",
+ "bg": "Робот",
+ "ca": "Robot",
+ "cs": "Robot",
+ "de": "Roboter",
+ "eo": "Roboto",
+ "es": "Robot",
+ "et": "Robot",
+ "fi": "Robotti",
+ "fr": "Robot",
+ "hr": "robot",
+ "hu": "Robot",
+ "it": "Robot",
+ "ja": "ロボと",
+ "nb_NO": "Robot",
+ "nl": "Robot",
+ "pt_BR": "Robô",
+ "ru": "Робот",
+ "si": null,
+ "sk": "Robot",
+ "sr": "робот",
+ "sv": "Robot",
+ "szl": null,
+ "tzm": "Aṛubu",
+ "uk": "Робот",
+ "zh_Hans": "机器人"
+ }
+ },
+ {
+ "number": 32,
+ "emoji": "🎩",
+ "description": "Hat",
+ "unicode": "U+1F3A9",
+ "translated_descriptions": {
+ "ar": "قُبَّعَة",
+ "bg": "Шапка",
+ "ca": "Barret",
+ "cs": "Klobouk",
+ "de": "Hut",
+ "eo": "Ĉapelo",
+ "es": "Sombrero",
+ "et": "Kübar",
+ "fi": "Hattu",
+ "fr": "Chapeau",
+ "hr": "kapa",
+ "hu": "Kalap",
+ "it": "Cappello",
+ "ja": "帽子",
+ "nb_NO": "Hatt",
+ "nl": "Hoed",
+ "pt_BR": "Chapéu",
+ "ru": "Шляпа",
+ "si": null,
+ "sk": "Cilinder",
+ "sr": "шешир",
+ "sv": "Hatt",
+ "szl": null,
+ "tzm": "Taraza",
+ "uk": "Капелюх",
+ "zh_Hans": "帽子"
+ }
+ },
+ {
+ "number": 33,
+ "emoji": "👓",
+ "description": "Glasses",
+ "unicode": "U+1F453",
+ "translated_descriptions": {
+ "ar": "نَظَّارَة",
+ "bg": "Очила",
+ "ca": "Ulleres",
+ "cs": "Brýle",
+ "de": "Brille",
+ "eo": "Okulvitroj",
+ "es": "Gafas",
+ "et": "Prillid",
+ "fi": "Silmälasit",
+ "fr": "Lunettes",
+ "hr": "naočale",
+ "hu": "Szemüveg",
+ "it": "Occhiali",
+ "ja": "めがね",
+ "nb_NO": "Briller",
+ "nl": "Bril",
+ "pt_BR": "Óculos",
+ "ru": "Очки",
+ "si": null,
+ "sk": "Okuliare",
+ "sr": "наочаре",
+ "sv": "Glasögon",
+ "szl": null,
+ "tzm": null,
+ "uk": "Окуляри",
+ "zh_Hans": "眼镜"
+ }
+ },
+ {
+ "number": 34,
+ "emoji": "🔧",
+ "description": "Spanner",
+ "unicode": "U+1F527",
+ "translated_descriptions": {
+ "ar": "مِفتَاحُ رَبط",
+ "bg": "Гаечен ключ",
+ "ca": "Clau anglesa",
+ "cs": "Klíč",
+ "de": "Schraubenschlüssel",
+ "eo": "Ŝraŭbŝlosilo",
+ "es": "Llave inglesa",
+ "et": "Mutrivõti",
+ "fi": "Kiintoavain",
+ "fr": "Clé à molette",
+ "hr": "ključ",
+ "hu": "Csavarkulcs",
+ "it": "Chiave inglese",
+ "ja": "スパナ",
+ "nb_NO": "Fastnøkkel",
+ "nl": "Moersleutel",
+ "pt_BR": "Chave inglesa",
+ "ru": "Ключ",
+ "si": null,
+ "sk": "Francúzsky kľúč",
+ "sr": "кључ",
+ "sv": "Skruvnyckel",
+ "szl": null,
+ "tzm": null,
+ "uk": "Гайковий ключ",
+ "zh_Hans": "扳手"
+ }
+ },
+ {
+ "number": 35,
+ "emoji": "🎅",
+ "description": "Santa",
+ "unicode": "U+1F385",
+ "translated_descriptions": {
+ "ar": "سانتا",
+ "bg": "Дядо Коледа",
+ "ca": "Pare Noél",
+ "cs": "Mikuláš",
+ "de": "Weihnachtsmann",
+ "eo": "Kristnaska viro",
+ "es": "Papá Noel",
+ "et": "Jõuluvana",
+ "fi": "Joulupukki",
+ "fr": "Père Noël",
+ "hr": "deda Mraz",
+ "hu": "Télapó",
+ "it": "Babbo Natale",
+ "ja": "サンタ",
+ "nb_NO": "Julenisse",
+ "nl": "Kerstman",
+ "pt_BR": "Papai-noel",
+ "ru": "Санта",
+ "si": null,
+ "sk": "Santa Claus",
+ "sr": "деда Мраз",
+ "sv": "Tomte",
+ "szl": null,
+ "tzm": null,
+ "uk": "Санта Клаус",
+ "zh_Hans": "圣诞老人"
+ }
+ },
+ {
+ "number": 36,
+ "emoji": "👍",
+ "description": "Thumbs Up",
+ "unicode": "U+1F44D",
+ "translated_descriptions": {
+ "ar": "رَفعُ إِبهَام",
+ "bg": "Палец нагоре",
+ "ca": "Polzes amunt",
+ "cs": "Palec nahoru",
+ "de": "Daumen Hoch",
+ "eo": "Dikfingro supren",
+ "es": "Pulgar arriba",
+ "et": "Pöidlad püsti",
+ "fi": "Peukalo ylös",
+ "fr": "Pouce en l’air",
+ "hr": "palac gore",
+ "hu": "Hüvelykujj fel",
+ "it": "Pollice alzato",
+ "ja": "いいね",
+ "nb_NO": "Tommel Opp",
+ "nl": "Duim omhoog",
+ "pt_BR": "Joinha",
+ "ru": "Большой палец вверх",
+ "si": null,
+ "sk": "Palec nahor",
+ "sr": "палчић горе",
+ "sv": "Tummen upp",
+ "szl": null,
+ "tzm": null,
+ "uk": "Великий палець вгору",
+ "zh_Hans": "赞"
+ }
+ },
+ {
+ "number": 37,
+ "emoji": "☂️",
+ "description": "Umbrella",
+ "unicode": "U+2602U+FE0F",
+ "translated_descriptions": {
+ "ar": "مِظَلَّة",
+ "bg": "Чадър",
+ "ca": "Paraigües",
+ "cs": "Deštník",
+ "de": "Regenschirm",
+ "eo": "Ombrelo",
+ "es": "Paraguas",
+ "et": "Vihmavari",
+ "fi": "Sateenvarjo",
+ "fr": "Parapluie",
+ "hr": "kišobran",
+ "hu": "Esernyő",
+ "it": "Ombrello",
+ "ja": "傘",
+ "nb_NO": "Paraply",
+ "nl": "Paraplu",
+ "pt_BR": "Guarda-chuva",
+ "ru": "Зонт",
+ "si": null,
+ "sk": "Dáždnik",
+ "sr": "кишобран",
+ "sv": "Paraply",
+ "szl": null,
+ "tzm": null,
+ "uk": "Парасолька",
+ "zh_Hans": "伞"
+ }
+ },
+ {
+ "number": 38,
+ "emoji": "⌛",
+ "description": "Hourglass",
+ "unicode": "U+231B",
+ "translated_descriptions": {
+ "ar": "سَاعَةٌ رَملِيَّة",
+ "bg": "Пясъчен часовник",
+ "ca": "Rellotge de sorra",
+ "cs": "Přesýpací hodiny",
+ "de": "Sanduhr",
+ "eo": "Sablohorloĝo",
+ "es": "Reloj de arena",
+ "et": "Liivakell",
+ "fi": "Tiimalasi",
+ "fr": "Sablier",
+ "hr": "pješčani sat",
+ "hu": "Homokóra",
+ "it": "Clessidra",
+ "ja": "砂時計",
+ "nb_NO": "Timeglass",
+ "nl": "Zandloper",
+ "pt_BR": "Ampulheta",
+ "ru": "Песочные часы",
+ "si": null,
+ "sk": "Presýpacie hodiny",
+ "sr": "пешчаник",
+ "sv": "Timglas",
+ "szl": null,
+ "tzm": null,
+ "uk": "Пісковий годинник",
+ "zh_Hans": "沙漏"
+ }
+ },
+ {
+ "number": 39,
+ "emoji": "⏰",
+ "description": "Clock",
+ "unicode": "U+23F0",
+ "translated_descriptions": {
+ "ar": "سَاعَة",
+ "bg": "Часовник",
+ "ca": "Rellotge",
+ "cs": "Hodiny",
+ "de": "Uhr",
+ "eo": "Horloĝo",
+ "es": "Reloj",
+ "et": "Kell",
+ "fi": "Pöytäkello",
+ "fr": "Réveil",
+ "hr": "sat",
+ "hu": "Óra",
+ "it": "Orologio",
+ "ja": "時計",
+ "nb_NO": "Klokke",
+ "nl": "Wekker",
+ "pt_BR": "Relógio",
+ "ru": "Часы",
+ "si": null,
+ "sk": "Budík",
+ "sr": "сат",
+ "sv": "Klocka",
+ "szl": null,
+ "tzm": null,
+ "uk": "Годинник",
+ "zh_Hans": "时钟"
+ }
+ },
+ {
+ "number": 40,
+ "emoji": "🎁",
+ "description": "Gift",
+ "unicode": "U+1F381",
+ "translated_descriptions": {
+ "ar": "هَدِيَّة",
+ "bg": "Подарък",
+ "ca": "Regal",
+ "cs": "Dárek",
+ "de": "Geschenk",
+ "eo": "Donaco",
+ "es": "Regalo",
+ "et": "Kingitus",
+ "fi": "Lahja",
+ "fr": "Cadeau",
+ "hr": "poklon",
+ "hu": "Ajándék",
+ "it": "Regalo",
+ "ja": "ギフト",
+ "nb_NO": "Gave",
+ "nl": "Geschenk",
+ "pt_BR": "Presente",
+ "ru": "Подарок",
+ "si": null,
+ "sk": "Zabalený darček",
+ "sr": "поклон",
+ "sv": "Present",
+ "szl": null,
+ "tzm": null,
+ "uk": "Подарунок",
+ "zh_Hans": "礼物"
+ }
+ },
+ {
+ "number": 41,
+ "emoji": "💡",
+ "description": "Light Bulb",
+ "unicode": "U+1F4A1",
+ "translated_descriptions": {
+ "ar": "مِصبَاح",
+ "bg": "Лампа",
+ "ca": "Bombeta",
+ "cs": "Žárovka",
+ "de": "Glühbirne",
+ "eo": "Lampo",
+ "es": "Bombilla",
+ "et": "Lambipirn",
+ "fi": "Hehkulamppu",
+ "fr": "Ampoule",
+ "hr": "žarulja",
+ "hu": "Égő",
+ "it": "Lampadina",
+ "ja": "電球",
+ "nb_NO": "Lyspære",
+ "nl": "Gloeilamp",
+ "pt_BR": "Lâmpada",
+ "ru": "Лампочка",
+ "si": null,
+ "sk": "Žiarovka",
+ "sr": "сијалица",
+ "sv": "Lampa",
+ "szl": null,
+ "tzm": null,
+ "uk": "Лампочка",
+ "zh_Hans": "灯泡"
+ }
+ },
+ {
+ "number": 42,
+ "emoji": "📕",
+ "description": "Book",
+ "unicode": "U+1F4D5",
+ "translated_descriptions": {
+ "ar": "كِتَاب",
+ "bg": "Книга",
+ "ca": "Llibre",
+ "cs": "Kniha",
+ "de": "Buch",
+ "eo": "Libro",
+ "es": "Libro",
+ "et": "Raamat",
+ "fi": "Kirja",
+ "fr": "Livre",
+ "hr": "knjiga",
+ "hu": "Könyv",
+ "it": "Libro",
+ "ja": "本",
+ "nb_NO": "Bok",
+ "nl": "Boek",
+ "pt_BR": "Livro",
+ "ru": "Книга",
+ "si": null,
+ "sk": "Zatvorená kniha",
+ "sr": "књига",
+ "sv": "Bok",
+ "szl": null,
+ "tzm": "Adlis",
+ "uk": "Книга",
+ "zh_Hans": "书"
+ }
+ },
+ {
+ "number": 43,
+ "emoji": "✏️",
+ "description": "Pencil",
+ "unicode": "U+270FU+FE0F",
+ "translated_descriptions": {
+ "ar": "قَلَمُ رَصاص",
+ "bg": "Молив",
+ "ca": "Llapis",
+ "cs": "Tužka",
+ "de": "Bleistift",
+ "eo": "Krajono",
+ "es": "Lápiz",
+ "et": "Pliiats",
+ "fi": "Lyijykynä",
+ "fr": "Crayon",
+ "hr": "olovka",
+ "hu": "Ceruza",
+ "it": "Matita",
+ "ja": "鉛筆",
+ "nb_NO": "Blyant",
+ "nl": "Potlood",
+ "pt_BR": "Lápis",
+ "ru": "Карандаш",
+ "si": null,
+ "sk": "Ceruzka",
+ "sr": "оловка",
+ "sv": "Penna",
+ "szl": null,
+ "tzm": null,
+ "uk": "Олівець",
+ "zh_Hans": "铅笔"
+ }
+ },
+ {
+ "number": 44,
+ "emoji": "📎",
+ "description": "Paperclip",
+ "unicode": "U+1F4CE",
+ "translated_descriptions": {
+ "ar": "مِشبَكُ وَرَق",
+ "bg": "Кламер",
+ "ca": "Clip",
+ "cs": "Sponka",
+ "de": "Büroklammer",
+ "eo": "Paperkuntenilo",
+ "es": "Clip",
+ "et": "Kirjaklamber",
+ "fi": "Paperiliitin",
+ "fr": "Trombone",
+ "hr": "spajalica",
+ "hu": "Gémkapocs",
+ "it": "Graffetta",
+ "ja": "クリップ",
+ "nb_NO": "BInders",
+ "nl": "Papierklemmetje",
+ "pt_BR": "Clipe de papel",
+ "ru": "Скрепка",
+ "si": null,
+ "sk": "Sponka na papier",
+ "sr": "спајалица",
+ "sv": "Gem",
+ "szl": null,
+ "tzm": null,
+ "uk": "Спиначка",
+ "zh_Hans": "回形针"
+ }
+ },
+ {
+ "number": 45,
+ "emoji": "✂️",
+ "description": "Scissors",
+ "unicode": "U+2702U+FE0F",
+ "translated_descriptions": {
+ "ar": "مِقَصّ",
+ "bg": "Ножици",
+ "ca": "Tisores",
+ "cs": "Nůžky",
+ "de": "Schere",
+ "eo": "Tondilo",
+ "es": "Tijeras",
+ "et": "Käärid",
+ "fi": "Sakset",
+ "fr": "Ciseaux",
+ "hr": "škare",
+ "hu": "Olló",
+ "it": "Forbici",
+ "ja": "はさみ",
+ "nb_NO": "Saks",
+ "nl": "Schaar",
+ "pt_BR": "Tesoura",
+ "ru": "Ножницы",
+ "si": null,
+ "sk": "Nožnice",
+ "sr": "маказе",
+ "sv": "Sax",
+ "szl": null,
+ "tzm": null,
+ "uk": "Ножиці",
+ "zh_Hans": "剪刀"
+ }
+ },
+ {
+ "number": 46,
+ "emoji": "🔒",
+ "description": "Lock",
+ "unicode": "U+1F512",
+ "translated_descriptions": {
+ "ar": "قُفل",
+ "bg": "Катинар",
+ "ca": "Cadenat",
+ "cs": "Zámek",
+ "de": "Schloss",
+ "eo": "Seruro",
+ "es": "Candado",
+ "et": "Lukk",
+ "fi": "Lukko",
+ "fr": "Cadenas",
+ "hr": "zaključati",
+ "hu": "Lakat",
+ "it": "Lucchetto",
+ "ja": "錠前",
+ "nb_NO": "Lås",
+ "nl": "Slot",
+ "pt_BR": "Cadeado",
+ "ru": "Замок",
+ "si": null,
+ "sk": "Zatvorená zámka",
+ "sr": "катанац",
+ "sv": "Lås",
+ "szl": null,
+ "tzm": null,
+ "uk": "Замок",
+ "zh_Hans": "锁"
+ }
+ },
+ {
+ "number": 47,
+ "emoji": "🔑",
+ "description": "Key",
+ "unicode": "U+1F511",
+ "translated_descriptions": {
+ "ar": "مِفتَاح",
+ "bg": "Ключ",
+ "ca": "Clau",
+ "cs": "Klíč",
+ "de": "Schlüssel",
+ "eo": "Ŝlosilo",
+ "es": "Llave",
+ "et": "Võti",
+ "fi": "Avain",
+ "fr": "Clé",
+ "hr": "ključ",
+ "hu": "Kulcs",
+ "it": "Chiave",
+ "ja": "鍵",
+ "nb_NO": "Nøkkel",
+ "nl": "Sleutel",
+ "pt_BR": "Chave",
+ "ru": "Ключ",
+ "si": null,
+ "sk": "Kľúč",
+ "sr": "кључ",
+ "sv": "Nyckel",
+ "szl": null,
+ "tzm": "Tasarut",
+ "uk": "Ключ",
+ "zh_Hans": "钥匙"
+ }
+ },
+ {
+ "number": 48,
+ "emoji": "🔨",
+ "description": "Hammer",
+ "unicode": "U+1F528",
+ "translated_descriptions": {
+ "ar": "مِطرَقَة",
+ "bg": "Чук",
+ "ca": "Martell",
+ "cs": "Kladivo",
+ "de": "Hammer",
+ "eo": "Martelo",
+ "es": "Martillo",
+ "et": "Haamer",
+ "fi": "Vasara",
+ "fr": "Marteau",
+ "hr": "čekić",
+ "hu": "Kalapács",
+ "it": "Martello",
+ "ja": "金槌",
+ "nb_NO": "Hammer",
+ "nl": "Hamer",
+ "pt_BR": "Martelo",
+ "ru": "Молоток",
+ "si": null,
+ "sk": "Kladivo",
+ "sr": "чекић",
+ "sv": "Hammare",
+ "szl": null,
+ "tzm": null,
+ "uk": "Молоток",
+ "zh_Hans": "锤子"
+ }
+ },
+ {
+ "number": 49,
+ "emoji": "☎️",
+ "description": "Telephone",
+ "unicode": "U+260EU+FE0F",
+ "translated_descriptions": {
+ "ar": "تِلِفُون",
+ "bg": "Телефон",
+ "ca": "Telèfon",
+ "cs": "Telefon",
+ "de": "Telefon",
+ "eo": "Telefono",
+ "es": "Telefono",
+ "et": "Telefon",
+ "fi": "Puhelin",
+ "fr": "Téléphone",
+ "hr": "telefon",
+ "hu": "Telefon",
+ "it": "Telefono",
+ "ja": "電話機",
+ "nb_NO": "Telefon",
+ "nl": "Telefoon",
+ "pt_BR": "Telefone",
+ "ru": "Телефон",
+ "si": null,
+ "sk": "Telefón",
+ "sr": "телефон",
+ "sv": "Telefon",
+ "szl": null,
+ "tzm": "Atilifun",
+ "uk": "Телефон",
+ "zh_Hans": "电话"
+ }
+ },
+ {
+ "number": 50,
+ "emoji": "🏁",
+ "description": "Flag",
+ "unicode": "U+1F3C1",
+ "translated_descriptions": {
+ "ar": "عَلَم",
+ "bg": "Флаг",
+ "ca": "Bandera",
+ "cs": "Vlajka",
+ "de": "Flagge",
+ "eo": "Flago",
+ "es": "Bandera",
+ "et": "Lipp",
+ "fi": "Lippu",
+ "fr": "Drapeau",
+ "hr": "zastava",
+ "hu": "Zászló",
+ "it": "Bandiera",
+ "ja": "旗",
+ "nb_NO": "Flagg",
+ "nl": "Vlag",
+ "pt_BR": "Bandeira",
+ "ru": "Флаг",
+ "si": null,
+ "sk": "Kockovaná zástava",
+ "sr": "застава",
+ "sv": "Flagga",
+ "szl": null,
+ "tzm": "Acenyal",
+ "uk": "Прапор",
+ "zh_Hans": "旗帜"
+ }
+ },
+ {
+ "number": 51,
+ "emoji": "🚂",
+ "description": "Train",
+ "unicode": "U+1F682",
+ "translated_descriptions": {
+ "ar": "قِطَار",
+ "bg": "Влак",
+ "ca": "Tren",
+ "cs": "Vlak",
+ "de": "Zug",
+ "eo": "Vagonaro",
+ "es": "Tren",
+ "et": "Rong",
+ "fi": "Juna",
+ "fr": "Train",
+ "hr": "vlak",
+ "hu": "Vonat",
+ "it": "Treno",
+ "ja": "電車",
+ "nb_NO": "Tog",
+ "nl": "Trein",
+ "pt_BR": "Trem",
+ "ru": "Поезд",
+ "si": null,
+ "sk": "Rušeň",
+ "sr": "воз",
+ "sv": "Tåg",
+ "szl": null,
+ "tzm": null,
+ "uk": "Потяг",
+ "zh_Hans": "火车"
+ }
+ },
+ {
+ "number": 52,
+ "emoji": "🚲",
+ "description": "Bicycle",
+ "unicode": "U+1F6B2",
+ "translated_descriptions": {
+ "ar": "دَرّاجَة",
+ "bg": "Колело",
+ "ca": "Bicicleta",
+ "cs": "Kolo",
+ "de": "Fahrrad",
+ "eo": "Biciklo",
+ "es": "Bicicleta",
+ "et": "Jalgratas",
+ "fi": "Polkupyörä",
+ "fr": "Vélo",
+ "hr": "bicikl",
+ "hu": "Kerékpár",
+ "it": "Bicicletta",
+ "ja": "自転車",
+ "nb_NO": "Sykkel",
+ "nl": "Fiets",
+ "pt_BR": "Bicicleta",
+ "ru": "Велосипед",
+ "si": null,
+ "sk": "Bicykel",
+ "sr": "бицикл",
+ "sv": "Cykel",
+ "szl": null,
+ "tzm": null,
+ "uk": "Велосипед",
+ "zh_Hans": "自行车"
+ }
+ },
+ {
+ "number": 53,
+ "emoji": "✈️",
+ "description": "Aeroplane",
+ "unicode": "U+2708U+FE0F",
+ "translated_descriptions": {
+ "ar": "طَائِرة",
+ "bg": "Самолет",
+ "ca": "Avió",
+ "cs": "Letadlo",
+ "de": "Flugzeug",
+ "eo": "Aviadilo",
+ "es": "Avión",
+ "et": "Lennuk",
+ "fi": "Lentokone",
+ "fr": "Avion",
+ "hr": "avion",
+ "hu": "Repülő",
+ "it": "Aeroplano",
+ "ja": "飛行機",
+ "nb_NO": "Fly",
+ "nl": "Vliegtuig",
+ "pt_BR": "Avião",
+ "ru": "Самолет",
+ "si": null,
+ "sk": "Lietadlo",
+ "sr": "авион",
+ "sv": "Flygplan",
+ "szl": null,
+ "tzm": null,
+ "uk": "Літак",
+ "zh_Hans": "飞机"
+ }
+ },
+ {
+ "number": 54,
+ "emoji": "🚀",
+ "description": "Rocket",
+ "unicode": "U+1F680",
+ "translated_descriptions": {
+ "ar": "صَارُوخ",
+ "bg": "Ракета",
+ "ca": "Coet",
+ "cs": "Raketa",
+ "de": "Rakete",
+ "eo": "Raketo",
+ "es": "Cohete",
+ "et": "Rakett",
+ "fi": "Raketti",
+ "fr": "Fusée",
+ "hr": "raketa",
+ "hu": "Rakáta",
+ "it": "Razzo",
+ "ja": "ロケット",
+ "nb_NO": "Rakett",
+ "nl": "Raket",
+ "pt_BR": "Foguete",
+ "ru": "Ракета",
+ "si": null,
+ "sk": "Raketa",
+ "sr": "ракета",
+ "sv": "Raket",
+ "szl": null,
+ "tzm": null,
+ "uk": "Ракета",
+ "zh_Hans": "火箭"
+ }
+ },
+ {
+ "number": 55,
+ "emoji": "🏆",
+ "description": "Trophy",
+ "unicode": "U+1F3C6",
+ "translated_descriptions": {
+ "ar": "كَأسُ النَّصر",
+ "bg": "Трофей",
+ "ca": "Trofeu",
+ "cs": "Pohár",
+ "de": "Pokal",
+ "eo": "Trofeo",
+ "es": "Trofeo",
+ "et": "Auhind",
+ "fi": "Palkinto",
+ "fr": "Trophée",
+ "hr": "trofej",
+ "hu": "Trófea",
+ "it": "Trofeo",
+ "ja": "トロフィー",
+ "nb_NO": "Pokal",
+ "nl": "Trofee",
+ "pt_BR": "Troféu",
+ "ru": "Кубок",
+ "si": null,
+ "sk": "Trofej",
+ "sr": "пехар",
+ "sv": "Trofé",
+ "szl": null,
+ "tzm": null,
+ "uk": "Приз",
+ "zh_Hans": "奖杯"
+ }
+ },
+ {
+ "number": 56,
+ "emoji": "⚽",
+ "description": "Ball",
+ "unicode": "U+26BD",
+ "translated_descriptions": {
+ "ar": "كُرَة",
+ "bg": "Топка",
+ "ca": "Pilota",
+ "cs": "Míč",
+ "de": "Ball",
+ "eo": "Pilko",
+ "es": "Bola",
+ "et": "Pall",
+ "fi": "Pallo",
+ "fr": "Ballon",
+ "hr": "lopta",
+ "hu": "Labda",
+ "it": "Palla",
+ "ja": "ボール",
+ "nb_NO": "Ball",
+ "nl": "Bal",
+ "pt_BR": "Bola",
+ "ru": "Мяч",
+ "si": null,
+ "sk": "Futbal",
+ "sr": "лопта",
+ "sv": "Boll",
+ "szl": null,
+ "tzm": "Tcama",
+ "uk": "М'яч",
+ "zh_Hans": "球"
+ }
+ },
+ {
+ "number": 57,
+ "emoji": "🎸",
+ "description": "Guitar",
+ "unicode": "U+1F3B8",
+ "translated_descriptions": {
+ "ar": "غيتار",
+ "bg": "Китара",
+ "ca": "Guitarra",
+ "cs": "Kytara",
+ "de": "Gitarre",
+ "eo": "Gitaro",
+ "es": "Guitarra",
+ "et": "Kitarr",
+ "fi": "Kitara",
+ "fr": "Guitare",
+ "hr": "gitara",
+ "hu": "Gitár",
+ "it": "Chitarra",
+ "ja": "ギター",
+ "nb_NO": "Gitar",
+ "nl": "Gitaar",
+ "pt_BR": "Guitarra",
+ "ru": "Гитара",
+ "si": null,
+ "sk": "Gitara",
+ "sr": "гитара",
+ "sv": "Gitarr",
+ "szl": null,
+ "tzm": "Agiṭaṛ",
+ "uk": "Гітара",
+ "zh_Hans": "吉他"
+ }
+ },
+ {
+ "number": 58,
+ "emoji": "🎺",
+ "description": "Trumpet",
+ "unicode": "U+1F3BA",
+ "translated_descriptions": {
+ "ar": "بُوق",
+ "bg": "Тромпет",
+ "ca": "Trompeta",
+ "cs": "Trumpeta",
+ "de": "Trompete",
+ "eo": "Trumpeto",
+ "es": "Trompeta",
+ "et": "Trompet",
+ "fi": "Trumpetti",
+ "fr": "Trompette",
+ "hr": "truba",
+ "hu": "Trombita",
+ "it": "Trombetta",
+ "ja": "トランペット",
+ "nb_NO": "Trompet",
+ "nl": "Trompet",
+ "pt_BR": "Trombeta",
+ "ru": "Труба",
+ "si": null,
+ "sk": "Trúbka",
+ "sr": "труба",
+ "sv": "Trumpet",
+ "szl": null,
+ "tzm": null,
+ "uk": "Труба",
+ "zh_Hans": "喇叭"
+ }
+ },
+ {
+ "number": 59,
+ "emoji": "🔔",
+ "description": "Bell",
+ "unicode": "U+1F514",
+ "translated_descriptions": {
+ "ar": "جَرَس",
+ "bg": "Звънец",
+ "ca": "Campana",
+ "cs": "Zvonek",
+ "de": "Glocke",
+ "eo": "Sonorilo",
+ "es": "Campana",
+ "et": "Kelluke",
+ "fi": "Soittokello",
+ "fr": "Cloche",
+ "hr": "zvono",
+ "hu": "Harang",
+ "it": "Campana",
+ "ja": "ベル",
+ "nb_NO": "Bjelle",
+ "nl": "Bel",
+ "pt_BR": "Sino",
+ "ru": "Колокол",
+ "si": null,
+ "sk": "Zvon",
+ "sr": "звоно",
+ "sv": "Bjällra",
+ "szl": null,
+ "tzm": null,
+ "uk": "Дзвін",
+ "zh_Hans": "铃铛"
+ }
+ },
+ {
+ "number": 60,
+ "emoji": "⚓",
+ "description": "Anchor",
+ "unicode": "U+2693",
+ "translated_descriptions": {
+ "ar": "مِرسَاة",
+ "bg": "Котва",
+ "ca": "Àncora",
+ "cs": "Kotva",
+ "de": "Anker",
+ "eo": "Ankro",
+ "es": "Ancla",
+ "et": "Ankur",
+ "fi": "Ankkuri",
+ "fr": "Ancre",
+ "hr": "sidro",
+ "hu": "Horgony",
+ "it": "Ancora",
+ "ja": "いかり",
+ "nb_NO": "Anker",
+ "nl": "Anker",
+ "pt_BR": "Âncora",
+ "ru": "Якорь",
+ "si": null,
+ "sk": "Kotva",
+ "sr": "сидро",
+ "sv": "Ankare",
+ "szl": null,
+ "tzm": null,
+ "uk": "Якір",
+ "zh_Hans": "锚"
+ }
+ },
+ {
+ "number": 61,
+ "emoji": "🎧",
+ "description": "Headphones",
+ "unicode": "U+1F3A7",
+ "translated_descriptions": {
+ "ar": "سَمّاعَة رَأس",
+ "bg": "Слушалки",
+ "ca": "Auriculars",
+ "cs": "Sluchátka",
+ "de": "Kopfhörer",
+ "eo": "Kapaŭdilo",
+ "es": "Cascos",
+ "et": "Kõrvaklapid",
+ "fi": "Kuulokkeet",
+ "fr": "Casque audio",
+ "hr": "slušalice",
+ "hu": "Fejhallgató",
+ "it": "Cuffie",
+ "ja": "ヘッドホン",
+ "nb_NO": "Hodetelefoner",
+ "nl": "Koptelefoon",
+ "pt_BR": "Fones de ouvido",
+ "ru": "Наушники",
+ "si": null,
+ "sk": "Slúchadlá",
+ "sr": "слушалице",
+ "sv": "Hörlurar",
+ "szl": null,
+ "tzm": null,
+ "uk": "Навушники",
+ "zh_Hans": "耳机"
+ }
+ },
+ {
+ "number": 62,
+ "emoji": "📁",
+ "description": "Folder",
+ "unicode": "U+1F4C1",
+ "translated_descriptions": {
+ "ar": "مُجَلَّد",
+ "bg": "Папка",
+ "ca": "Carpeta",
+ "cs": "Složka",
+ "de": "Ordner",
+ "eo": "Dosierujo",
+ "es": "Carpeta",
+ "et": "Kaust",
+ "fi": "Kansio",
+ "fr": "Dossier",
+ "hr": "mapu",
+ "hu": "Mappa",
+ "it": "Cartella",
+ "ja": "フォルダ",
+ "nb_NO": "Mappe",
+ "nl": "Map",
+ "pt_BR": "Pasta",
+ "ru": "Папка",
+ "si": null,
+ "sk": "Fascikel",
+ "sr": "фасцикла",
+ "sv": "Mapp",
+ "szl": null,
+ "tzm": "Asdaw",
+ "uk": "Тека",
+ "zh_Hans": "文件夹"
+ }
+ },
+ {
+ "number": 63,
+ "emoji": "📌",
+ "description": "Pin",
+ "unicode": "U+1F4CC",
+ "translated_descriptions": {
+ "ar": "دَبُّوس",
+ "bg": "Кабърче",
+ "ca": "Xinxeta",
+ "cs": "Špendlík",
+ "de": "Stecknadel",
+ "eo": "Pinglo",
+ "es": "Alfiler",
+ "et": "Nööpnõel",
+ "fi": "Nuppineula",
+ "fr": "Punaise",
+ "hr": "pribadača",
+ "hu": "Rajszeg",
+ "it": "Puntina",
+ "ja": "ピン",
+ "nb_NO": "Tegnestift",
+ "nl": "Duimspijker",
+ "pt_BR": "Alfinete",
+ "ru": "Булавка",
+ "si": null,
+ "sk": "Špendlík",
+ "sr": "чиода",
+ "sv": "Häftstift",
+ "szl": null,
+ "tzm": null,
+ "uk": "Кнопка",
+ "zh_Hans": "图钉"
+ }
+ }
+]
\ No newline at end of file
diff --git a/appimage/Extera.AppDir/data/flutter_assets/assets/sounds/call.ogg b/appimage/Extera.AppDir/data/flutter_assets/assets/sounds/call.ogg
new file mode 100644
index 0000000..63b5d4d
Binary files /dev/null and b/appimage/Extera.AppDir/data/flutter_assets/assets/sounds/call.ogg differ
diff --git a/appimage/Extera.AppDir/data/flutter_assets/assets/sounds/notification.ogg b/appimage/Extera.AppDir/data/flutter_assets/assets/sounds/notification.ogg
new file mode 100644
index 0000000..390f2bf
Binary files /dev/null and b/appimage/Extera.AppDir/data/flutter_assets/assets/sounds/notification.ogg differ
diff --git a/appimage/Extera.AppDir/data/flutter_assets/assets/sounds/phone.ogg b/appimage/Extera.AppDir/data/flutter_assets/assets/sounds/phone.ogg
new file mode 100644
index 0000000..7cd2864
Binary files /dev/null and b/appimage/Extera.AppDir/data/flutter_assets/assets/sounds/phone.ogg differ
diff --git a/appimage/Extera.AppDir/data/flutter_assets/fonts/MaterialIcons-Regular.otf b/appimage/Extera.AppDir/data/flutter_assets/fonts/MaterialIcons-Regular.otf
new file mode 100644
index 0000000..8c99266
Binary files /dev/null and b/appimage/Extera.AppDir/data/flutter_assets/fonts/MaterialIcons-Regular.otf differ
diff --git a/appimage/Extera.AppDir/data/flutter_assets/packages/cupertino_icons/assets/CupertinoIcons.ttf b/appimage/Extera.AppDir/data/flutter_assets/packages/cupertino_icons/assets/CupertinoIcons.ttf
new file mode 100644
index 0000000..d580ce7
Binary files /dev/null and b/appimage/Extera.AppDir/data/flutter_assets/packages/cupertino_icons/assets/CupertinoIcons.ttf differ
diff --git a/appimage/Extera.AppDir/data/flutter_assets/packages/flutter_map/lib/assets/flutter_map_logo.png b/appimage/Extera.AppDir/data/flutter_assets/packages/flutter_map/lib/assets/flutter_map_logo.png
new file mode 100644
index 0000000..8603d0a
Binary files /dev/null and b/appimage/Extera.AppDir/data/flutter_assets/packages/flutter_map/lib/assets/flutter_map_logo.png differ
diff --git a/appimage/Extera.AppDir/data/flutter_assets/packages/handy_window/assets/handy-window-dark.css b/appimage/Extera.AppDir/data/flutter_assets/packages/handy_window/assets/handy-window-dark.css
new file mode 100644
index 0000000..a714179
--- /dev/null
+++ b/appimage/Extera.AppDir/data/flutter_assets/packages/handy_window/assets/handy-window-dark.css
@@ -0,0 +1 @@
+window{background-color:#252525}window.csd.unified decoration-overlay{box-shadow:none}window.csd.unified:not(.solid-csd):not(.fullscreen):not(.maximized) decoration-overlay{box-shadow:inset 0 0 0 1px rgba(255,255,255,.07)}window.csd.unified decoration{box-shadow:0 3px 9px 1px rgba(0,0,0,.5)}window.csd.unified decoration:backdrop{box-shadow:0 3px 9px 1px rgba(0,0,0,0),0 2px 6px 2px rgba(0,0,0,.2)}headerbar{min-height:47px;background:#303030;box-shadow:inset 0 -1px rgba(0,0,0,.36);border:none}headerbar:backdrop{background:#242424}button.titlebutton{padding:4px;margin:1px}
diff --git a/appimage/Extera.AppDir/data/flutter_assets/packages/handy_window/assets/handy-window.css b/appimage/Extera.AppDir/data/flutter_assets/packages/handy_window/assets/handy-window.css
new file mode 100644
index 0000000..662c93c
--- /dev/null
+++ b/appimage/Extera.AppDir/data/flutter_assets/packages/handy_window/assets/handy-window.css
@@ -0,0 +1 @@
+window{background-color:#fff}window.csd.unified decoration-overlay{box-shadow:none}window.csd.unified:not(.solid-csd):not(.fullscreen):not(.maximized) decoration-overlay{box-shadow:inset 0 0 0 1px rgba(255,255,255,.07)}window.csd.unified decoration{box-shadow:0 3px 9px 1px rgba(0,0,0,.5)}window.csd.unified decoration:backdrop{box-shadow:0 3px 9px 1px rgba(0,0,0,0),0 2px 6px 2px rgba(0,0,0,.2)}headerbar{min-height:47px;background:#ebebeb;box-shadow:inset 0 -1px rgba(0,0,0,.07);border:none}headerbar:backdrop{background:#fafafa}button.titlebutton{padding:4px;margin:1px}
diff --git a/appimage/Extera.AppDir/data/flutter_assets/packages/material/lib/fonts/material.ttf b/appimage/Extera.AppDir/data/flutter_assets/packages/material/lib/fonts/material.ttf
new file mode 100644
index 0000000..84c815d
Binary files /dev/null and b/appimage/Extera.AppDir/data/flutter_assets/packages/material/lib/fonts/material.ttf differ
diff --git a/appimage/Extera.AppDir/data/flutter_assets/packages/record_web/assets/js/record.fixwebmduration.js b/appimage/Extera.AppDir/data/flutter_assets/packages/record_web/assets/js/record.fixwebmduration.js
new file mode 100644
index 0000000..dbb3cc6
--- /dev/null
+++ b/appimage/Extera.AppDir/data/flutter_assets/packages/record_web/assets/js/record.fixwebmduration.js
@@ -0,0 +1,507 @@
+(function (name, definition) {
+ window.jsFixWebmDuration = definition();
+})('fix-webm-duration', function () {
+ /*
+ * This is the list of possible WEBM file sections by their IDs.
+ * Possible types: Container, Binary, Uint, Int, String, Float, Date
+ */
+ var sections = {
+ 0xa45dfa3: { name: 'EBML', type: 'Container' },
+ 0x286: { name: 'EBMLVersion', type: 'Uint' },
+ 0x2f7: { name: 'EBMLReadVersion', type: 'Uint' },
+ 0x2f2: { name: 'EBMLMaxIDLength', type: 'Uint' },
+ 0x2f3: { name: 'EBMLMaxSizeLength', type: 'Uint' },
+ 0x282: { name: 'DocType', type: 'String' },
+ 0x287: { name: 'DocTypeVersion', type: 'Uint' },
+ 0x285: { name: 'DocTypeReadVersion', type: 'Uint' },
+ 0x6c: { name: 'Void', type: 'Binary' },
+ 0x3f: { name: 'CRC-32', type: 'Binary' },
+ 0xb538667: { name: 'SignatureSlot', type: 'Container' },
+ 0x3e8a: { name: 'SignatureAlgo', type: 'Uint' },
+ 0x3e9a: { name: 'SignatureHash', type: 'Uint' },
+ 0x3ea5: { name: 'SignaturePublicKey', type: 'Binary' },
+ 0x3eb5: { name: 'Signature', type: 'Binary' },
+ 0x3e5b: { name: 'SignatureElements', type: 'Container' },
+ 0x3e7b: { name: 'SignatureElementList', type: 'Container' },
+ 0x2532: { name: 'SignedElement', type: 'Binary' },
+ 0x8538067: { name: 'Segment', type: 'Container' },
+ 0x14d9b74: { name: 'SeekHead', type: 'Container' },
+ 0xdbb: { name: 'Seek', type: 'Container' },
+ 0x13ab: { name: 'SeekID', type: 'Binary' },
+ 0x13ac: { name: 'SeekPosition', type: 'Uint' },
+ 0x549a966: { name: 'Info', type: 'Container' },
+ 0x33a4: { name: 'SegmentUID', type: 'Binary' },
+ 0x3384: { name: 'SegmentFilename', type: 'String' },
+ 0x1cb923: { name: 'PrevUID', type: 'Binary' },
+ 0x1c83ab: { name: 'PrevFilename', type: 'String' },
+ 0x1eb923: { name: 'NextUID', type: 'Binary' },
+ 0x1e83bb: { name: 'NextFilename', type: 'String' },
+ 0x444: { name: 'SegmentFamily', type: 'Binary' },
+ 0x2924: { name: 'ChapterTranslate', type: 'Container' },
+ 0x29fc: { name: 'ChapterTranslateEditionUID', type: 'Uint' },
+ 0x29bf: { name: 'ChapterTranslateCodec', type: 'Uint' },
+ 0x29a5: { name: 'ChapterTranslateID', type: 'Binary' },
+ 0xad7b1: { name: 'TimecodeScale', type: 'Uint' },
+ 0x489: { name: 'Duration', type: 'Float' },
+ 0x461: { name: 'DateUTC', type: 'Date' },
+ 0x3ba9: { name: 'Title', type: 'String' },
+ 0xd80: { name: 'MuxingApp', type: 'String' },
+ 0x1741: { name: 'WritingApp', type: 'String' },
+ // 0xf43b675: { name: 'Cluster', type: 'Container' },
+ 0x67: { name: 'Timecode', type: 'Uint' },
+ 0x1854: { name: 'SilentTracks', type: 'Container' },
+ 0x18d7: { name: 'SilentTrackNumber', type: 'Uint' },
+ 0x27: { name: 'Position', type: 'Uint' },
+ 0x2b: { name: 'PrevSize', type: 'Uint' },
+ 0x23: { name: 'SimpleBlock', type: 'Binary' },
+ 0x20: { name: 'BlockGroup', type: 'Container' },
+ 0x21: { name: 'Block', type: 'Binary' },
+ 0x22: { name: 'BlockVirtual', type: 'Binary' },
+ 0x35a1: { name: 'BlockAdditions', type: 'Container' },
+ 0x26: { name: 'BlockMore', type: 'Container' },
+ 0x6e: { name: 'BlockAddID', type: 'Uint' },
+ 0x25: { name: 'BlockAdditional', type: 'Binary' },
+ 0x1b: { name: 'BlockDuration', type: 'Uint' },
+ 0x7a: { name: 'ReferencePriority', type: 'Uint' },
+ 0x7b: { name: 'ReferenceBlock', type: 'Int' },
+ 0x7d: { name: 'ReferenceVirtual', type: 'Int' },
+ 0x24: { name: 'CodecState', type: 'Binary' },
+ 0x35a2: { name: 'DiscardPadding', type: 'Int' },
+ 0xe: { name: 'Slices', type: 'Container' },
+ 0x68: { name: 'TimeSlice', type: 'Container' },
+ 0x4c: { name: 'LaceNumber', type: 'Uint' },
+ 0x4d: { name: 'FrameNumber', type: 'Uint' },
+ 0x4b: { name: 'BlockAdditionID', type: 'Uint' },
+ 0x4e: { name: 'Delay', type: 'Uint' },
+ 0x4f: { name: 'SliceDuration', type: 'Uint' },
+ 0x48: { name: 'ReferenceFrame', type: 'Container' },
+ 0x49: { name: 'ReferenceOffset', type: 'Uint' },
+ 0x4a: { name: 'ReferenceTimeCode', type: 'Uint' },
+ 0x2f: { name: 'EncryptedBlock', type: 'Binary' },
+ 0x654ae6b: { name: 'Tracks', type: 'Container' },
+ 0x2e: { name: 'TrackEntry', type: 'Container' },
+ 0x57: { name: 'TrackNumber', type: 'Uint' },
+ 0x33c5: { name: 'TrackUID', type: 'Uint' },
+ 0x3: { name: 'TrackType', type: 'Uint' },
+ 0x39: { name: 'FlagEnabled', type: 'Uint' },
+ 0x8: { name: 'FlagDefault', type: 'Uint' },
+ 0x15aa: { name: 'FlagForced', type: 'Uint' },
+ 0x1c: { name: 'FlagLacing', type: 'Uint' },
+ 0x2de7: { name: 'MinCache', type: 'Uint' },
+ 0x2df8: { name: 'MaxCache', type: 'Uint' },
+ 0x3e383: { name: 'DefaultDuration', type: 'Uint' },
+ 0x34e7a: { name: 'DefaultDecodedFieldDuration', type: 'Uint' },
+ 0x3314f: { name: 'TrackTimecodeScale', type: 'Float' },
+ 0x137f: { name: 'TrackOffset', type: 'Int' },
+ 0x15ee: { name: 'MaxBlockAdditionID', type: 'Uint' },
+ 0x136e: { name: 'Name', type: 'String' },
+ 0x2b59c: { name: 'Language', type: 'String' },
+ 0x6: { name: 'CodecID', type: 'String' },
+ 0x23a2: { name: 'CodecPrivate', type: 'Binary' },
+ 0x58688: { name: 'CodecName', type: 'String' },
+ 0x3446: { name: 'AttachmentLink', type: 'Uint' },
+ 0x1a9697: { name: 'CodecSettings', type: 'String' },
+ 0x1b4040: { name: 'CodecInfoURL', type: 'String' },
+ 0x6b240: { name: 'CodecDownloadURL', type: 'String' },
+ 0x2a: { name: 'CodecDecodeAll', type: 'Uint' },
+ 0x2fab: { name: 'TrackOverlay', type: 'Uint' },
+ 0x16aa: { name: 'CodecDelay', type: 'Uint' },
+ 0x16bb: { name: 'SeekPreRoll', type: 'Uint' },
+ 0x2624: { name: 'TrackTranslate', type: 'Container' },
+ 0x26fc: { name: 'TrackTranslateEditionUID', type: 'Uint' },
+ 0x26bf: { name: 'TrackTranslateCodec', type: 'Uint' },
+ 0x26a5: { name: 'TrackTranslateTrackID', type: 'Binary' },
+ 0x60: { name: 'Video', type: 'Container' },
+ 0x1a: { name: 'FlagInterlaced', type: 'Uint' },
+ 0x13b8: { name: 'StereoMode', type: 'Uint' },
+ 0x13c0: { name: 'AlphaMode', type: 'Uint' },
+ 0x13b9: { name: 'OldStereoMode', type: 'Uint' },
+ 0x30: { name: 'PixelWidth', type: 'Uint' },
+ 0x3a: { name: 'PixelHeight', type: 'Uint' },
+ 0x14aa: { name: 'PixelCropBottom', type: 'Uint' },
+ 0x14bb: { name: 'PixelCropTop', type: 'Uint' },
+ 0x14cc: { name: 'PixelCropLeft', type: 'Uint' },
+ 0x14dd: { name: 'PixelCropRight', type: 'Uint' },
+ 0x14b0: { name: 'DisplayWidth', type: 'Uint' },
+ 0x14ba: { name: 'DisplayHeight', type: 'Uint' },
+ 0x14b2: { name: 'DisplayUnit', type: 'Uint' },
+ 0x14b3: { name: 'AspectRatioType', type: 'Uint' },
+ 0xeb524: { name: 'ColourSpace', type: 'Binary' },
+ 0xfb523: { name: 'GammaValue', type: 'Float' },
+ 0x383e3: { name: 'FrameRate', type: 'Float' },
+ 0x61: { name: 'Audio', type: 'Container' },
+ 0x35: { name: 'SamplingFrequency', type: 'Float' },
+ 0x38b5: { name: 'OutputSamplingFrequency', type: 'Float' },
+ 0x1f: { name: 'Channels', type: 'Uint' },
+ 0x3d7b: { name: 'ChannelPositions', type: 'Binary' },
+ 0x2264: { name: 'BitDepth', type: 'Uint' },
+ 0x62: { name: 'TrackOperation', type: 'Container' },
+ 0x63: { name: 'TrackCombinePlanes', type: 'Container' },
+ 0x64: { name: 'TrackPlane', type: 'Container' },
+ 0x65: { name: 'TrackPlaneUID', type: 'Uint' },
+ 0x66: { name: 'TrackPlaneType', type: 'Uint' },
+ 0x69: { name: 'TrackJoinBlocks', type: 'Container' },
+ 0x6d: { name: 'TrackJoinUID', type: 'Uint' },
+ 0x40: { name: 'TrickTrackUID', type: 'Uint' },
+ 0x41: { name: 'TrickTrackSegmentUID', type: 'Binary' },
+ 0x46: { name: 'TrickTrackFlag', type: 'Uint' },
+ 0x47: { name: 'TrickMasterTrackUID', type: 'Uint' },
+ 0x44: { name: 'TrickMasterTrackSegmentUID', type: 'Binary' },
+ 0x2d80: { name: 'ContentEncodings', type: 'Container' },
+ 0x2240: { name: 'ContentEncoding', type: 'Container' },
+ 0x1031: { name: 'ContentEncodingOrder', type: 'Uint' },
+ 0x1032: { name: 'ContentEncodingScope', type: 'Uint' },
+ 0x1033: { name: 'ContentEncodingType', type: 'Uint' },
+ 0x1034: { name: 'ContentCompression', type: 'Container' },
+ 0x254: { name: 'ContentCompAlgo', type: 'Uint' },
+ 0x255: { name: 'ContentCompSettings', type: 'Binary' },
+ 0x1035: { name: 'ContentEncryption', type: 'Container' },
+ 0x7e1: { name: 'ContentEncAlgo', type: 'Uint' },
+ 0x7e2: { name: 'ContentEncKeyID', type: 'Binary' },
+ 0x7e3: { name: 'ContentSignature', type: 'Binary' },
+ 0x7e4: { name: 'ContentSigKeyID', type: 'Binary' },
+ 0x7e5: { name: 'ContentSigAlgo', type: 'Uint' },
+ 0x7e6: { name: 'ContentSigHashAlgo', type: 'Uint' },
+ 0xc53bb6b: { name: 'Cues', type: 'Container' },
+ 0x3b: { name: 'CuePoint', type: 'Container' },
+ 0x33: { name: 'CueTime', type: 'Uint' },
+ 0x37: { name: 'CueTrackPositions', type: 'Container' },
+ 0x77: { name: 'CueTrack', type: 'Uint' },
+ 0x71: { name: 'CueClusterPosition', type: 'Uint' },
+ 0x70: { name: 'CueRelativePosition', type: 'Uint' },
+ 0x32: { name: 'CueDuration', type: 'Uint' },
+ 0x1378: { name: 'CueBlockNumber', type: 'Uint' },
+ 0x6a: { name: 'CueCodecState', type: 'Uint' },
+ 0x5b: { name: 'CueReference', type: 'Container' },
+ 0x16: { name: 'CueRefTime', type: 'Uint' },
+ 0x17: { name: 'CueRefCluster', type: 'Uint' },
+ 0x135f: { name: 'CueRefNumber', type: 'Uint' },
+ 0x6b: { name: 'CueRefCodecState', type: 'Uint' },
+ 0x941a469: { name: 'Attachments', type: 'Container' },
+ 0x21a7: { name: 'AttachedFile', type: 'Container' },
+ 0x67e: { name: 'FileDescription', type: 'String' },
+ 0x66e: { name: 'FileName', type: 'String' },
+ 0x660: { name: 'FileMimeType', type: 'String' },
+ 0x65c: { name: 'FileData', type: 'Binary' },
+ 0x6ae: { name: 'FileUID', type: 'Uint' },
+ 0x675: { name: 'FileReferral', type: 'Binary' },
+ 0x661: { name: 'FileUsedStartTime', type: 'Uint' },
+ 0x662: { name: 'FileUsedEndTime', type: 'Uint' },
+ 0x43a770: { name: 'Chapters', type: 'Container' },
+ 0x5b9: { name: 'EditionEntry', type: 'Container' },
+ 0x5bc: { name: 'EditionUID', type: 'Uint' },
+ 0x5bd: { name: 'EditionFlagHidden', type: 'Uint' },
+ 0x5db: { name: 'EditionFlagDefault', type: 'Uint' },
+ 0x5dd: { name: 'EditionFlagOrdered', type: 'Uint' },
+ 0x36: { name: 'ChapterAtom', type: 'Container' },
+ 0x33c4: { name: 'ChapterUID', type: 'Uint' },
+ 0x1654: { name: 'ChapterStringUID', type: 'String' },
+ 0x11: { name: 'ChapterTimeStart', type: 'Uint' },
+ 0x12: { name: 'ChapterTimeEnd', type: 'Uint' },
+ 0x18: { name: 'ChapterFlagHidden', type: 'Uint' },
+ 0x598: { name: 'ChapterFlagEnabled', type: 'Uint' },
+ 0x2e67: { name: 'ChapterSegmentUID', type: 'Binary' },
+ 0x2ebc: { name: 'ChapterSegmentEditionUID', type: 'Uint' },
+ 0x23c3: { name: 'ChapterPhysicalEquiv', type: 'Uint' },
+ 0xf: { name: 'ChapterTrack', type: 'Container' },
+ 0x9: { name: 'ChapterTrackNumber', type: 'Uint' },
+ 0x0: { name: 'ChapterDisplay', type: 'Container' },
+ 0x5: { name: 'ChapString', type: 'String' },
+ 0x37c: { name: 'ChapLanguage', type: 'String' },
+ 0x37e: { name: 'ChapCountry', type: 'String' },
+ 0x2944: { name: 'ChapProcess', type: 'Container' },
+ 0x2955: { name: 'ChapProcessCodecID', type: 'Uint' },
+ 0x50d: { name: 'ChapProcessPrivate', type: 'Binary' },
+ 0x2911: { name: 'ChapProcessCommand', type: 'Container' },
+ 0x2922: { name: 'ChapProcessTime', type: 'Uint' },
+ 0x2933: { name: 'ChapProcessData', type: 'Binary' },
+ 0x254c367: { name: 'Tags', type: 'Container' },
+ 0x3373: { name: 'Tag', type: 'Container' },
+ 0x23c0: { name: 'Targets', type: 'Container' },
+ 0x28ca: { name: 'TargetTypeValue', type: 'Uint' },
+ 0x23ca: { name: 'TargetType', type: 'String' },
+ 0x23c5: { name: 'TagTrackUID', type: 'Uint' },
+ 0x23c9: { name: 'TagEditionUID', type: 'Uint' },
+ 0x23c4: { name: 'TagChapterUID', type: 'Uint' },
+ 0x23c6: { name: 'TagAttachmentUID', type: 'Uint' },
+ 0x27c8: { name: 'SimpleTag', type: 'Container' },
+ 0x5a3: { name: 'TagName', type: 'String' },
+ 0x47a: { name: 'TagLanguage', type: 'String' },
+ 0x484: { name: 'TagDefault', type: 'Uint' },
+ 0x487: { name: 'TagString', type: 'String' },
+ 0x485: { name: 'TagBinary', type: 'Binary' }
+ };
+
+ function doInherit(newClass, baseClass) {
+ newClass.prototype = Object.create(baseClass.prototype);
+ newClass.prototype.constructor = newClass;
+ }
+
+ function WebmBase(name, type) {
+ this.name = name || 'Unknown';
+ this.type = type || 'Unknown';
+ }
+ WebmBase.prototype.updateBySource = function () { };
+ WebmBase.prototype.setSource = function (source) {
+ this.source = source;
+ this.updateBySource();
+ };
+ WebmBase.prototype.updateByData = function () { };
+ WebmBase.prototype.setData = function (data) {
+ this.data = data;
+ this.updateByData();
+ };
+
+ function WebmUint(name, type) {
+ WebmBase.call(this, name, type || 'Uint');
+ }
+ doInherit(WebmUint, WebmBase);
+ function padHex(hex) {
+ return hex.length % 2 === 1 ? '0' + hex : hex;
+ }
+ WebmUint.prototype.updateBySource = function () {
+ // use hex representation of a number instead of number value
+ this.data = '';
+ for (var i = 0; i < this.source.length; i++) {
+ var hex = this.source[i].toString(16);
+ this.data += padHex(hex);
+ }
+ };
+ WebmUint.prototype.updateByData = function () {
+ var length = this.data.length / 2;
+ this.source = new Uint8Array(length);
+ for (var i = 0; i < length; i++) {
+ var hex = this.data.substr(i * 2, 2);
+ this.source[i] = parseInt(hex, 16);
+ }
+ };
+ WebmUint.prototype.getValue = function () {
+ return parseInt(this.data, 16);
+ };
+ WebmUint.prototype.setValue = function (value) {
+ this.setData(padHex(value.toString(16)));
+ };
+
+ function WebmFloat(name, type) {
+ WebmBase.call(this, name, type || 'Float');
+ }
+ doInherit(WebmFloat, WebmBase);
+ WebmFloat.prototype.getFloatArrayType = function () {
+ return this.source && this.source.length === 4 ? Float32Array : Float64Array;
+ };
+ WebmFloat.prototype.updateBySource = function () {
+ var byteArray = this.source.reverse();
+ var floatArrayType = this.getFloatArrayType();
+ var floatArray = new floatArrayType(byteArray.buffer);
+ this.data = floatArray[0];
+ };
+ WebmFloat.prototype.updateByData = function () {
+ var floatArrayType = this.getFloatArrayType();
+ var floatArray = new floatArrayType([this.data]);
+ var byteArray = new Uint8Array(floatArray.buffer);
+ this.source = byteArray.reverse();
+ };
+ WebmFloat.prototype.getValue = function () {
+ return this.data;
+ };
+ WebmFloat.prototype.setValue = function (value) {
+ this.setData(value);
+ };
+
+ function WebmContainer(name, type) {
+ WebmBase.call(this, name, type || 'Container');
+ }
+ doInherit(WebmContainer, WebmBase);
+ WebmContainer.prototype.readByte = function () {
+ return this.source[this.offset++];
+ };
+ WebmContainer.prototype.readUint = function () {
+ var firstByte = this.readByte();
+ var bytes = 8 - firstByte.toString(2).length;
+ var value = firstByte - (1 << (7 - bytes));
+ for (var i = 0; i < bytes; i++) {
+ // don't use bit operators to support x86
+ value *= 256;
+ value += this.readByte();
+ }
+ return value;
+ };
+ WebmContainer.prototype.updateBySource = function () {
+ this.data = [];
+ for (this.offset = 0; this.offset < this.source.length; this.offset = end) {
+ var id = this.readUint();
+ var len = this.readUint();
+ var end = Math.min(this.offset + len, this.source.length);
+ var data = this.source.slice(this.offset, end);
+
+ var info = sections[id] || { name: 'Unknown', type: 'Unknown' };
+ var ctr = WebmBase;
+ switch (info.type) {
+ case 'Container':
+ ctr = WebmContainer;
+ break;
+ case 'Uint':
+ ctr = WebmUint;
+ break;
+ case 'Float':
+ ctr = WebmFloat;
+ break;
+ }
+ var section = new ctr(info.name, info.type);
+ section.setSource(data);
+ this.data.push({
+ id: id,
+ idHex: id.toString(16),
+ data: section
+ });
+ }
+ };
+ WebmContainer.prototype.writeUint = function (x, draft) {
+ for (var bytes = 1, flag = 0x80; x >= flag && bytes < 8; bytes++, flag *= 0x80) { }
+
+ if (!draft) {
+ var value = flag + x;
+ for (var i = bytes - 1; i >= 0; i--) {
+ // don't use bit operators to support x86
+ var c = value % 256;
+ this.source[this.offset + i] = c;
+ value = (value - c) / 256;
+ }
+ }
+
+ this.offset += bytes;
+ };
+ WebmContainer.prototype.writeSections = function (draft) {
+ this.offset = 0;
+ for (var i = 0; i < this.data.length; i++) {
+ var section = this.data[i],
+ content = section.data.source,
+ contentLength = content.length;
+ this.writeUint(section.id, draft);
+ this.writeUint(contentLength, draft);
+ if (!draft) {
+ this.source.set(content, this.offset);
+ }
+ this.offset += contentLength;
+ }
+ return this.offset;
+ };
+ WebmContainer.prototype.updateByData = function () {
+ // run without accessing this.source to determine total length - need to know it to create Uint8Array
+ var length = this.writeSections('draft');
+ this.source = new Uint8Array(length);
+ // now really write data
+ this.writeSections();
+ };
+ WebmContainer.prototype.getSectionById = function (id) {
+ for (var i = 0; i < this.data.length; i++) {
+ var section = this.data[i];
+ if (section.id === id) {
+ return section.data;
+ }
+ }
+ return null;
+ };
+
+ function WebmFile(source) {
+ WebmContainer.call(this, 'File', 'File');
+ this.setSource(source);
+ }
+ doInherit(WebmFile, WebmContainer);
+ WebmFile.prototype.fixDuration = function (duration, options) {
+ var logger = options && options.logger;
+ if (logger === undefined) {
+ logger = function (message) {
+ console.log(message);
+ };
+ } else if (!logger) {
+ logger = function () { };
+ }
+
+ var segmentSection = this.getSectionById(0x8538067);
+ if (!segmentSection) {
+ logger('[fix-webm-duration] Segment section is missing');
+ return false;
+ }
+
+ var infoSection = segmentSection.getSectionById(0x549a966);
+ if (!infoSection) {
+ logger('[fix-webm-duration] Info section is missing');
+ return false;
+ }
+
+ var timeScaleSection = infoSection.getSectionById(0xad7b1);
+ if (!timeScaleSection) {
+ logger('[fix-webm-duration] TimecodeScale section is missing');
+ return false;
+ }
+
+ var durationSection = infoSection.getSectionById(0x489);
+ if (durationSection) {
+ if (durationSection.getValue() <= 0) {
+ logger('[fix-webm-duration] Duration section is present, but the value is empty. Applying ' + duration.toLocaleString() + ' ms.');
+ durationSection.setValue(duration);
+ } else {
+ logger('[fix-webm-duration] Duration section is present');
+ return false;
+ }
+ } else {
+ logger('[fix-webm-duration] Duration section is missing. Applying ' + duration.toLocaleString() + ' ms.');
+ // append Duration section
+ durationSection = new WebmFloat('Duration', 'Float');
+ durationSection.setValue(duration);
+ infoSection.data.push({
+ id: 0x489,
+ data: durationSection
+ });
+ }
+
+ // set default time scale to 1 millisecond (1000000 nanoseconds)
+ timeScaleSection.setValue(1000000);
+ infoSection.updateByData();
+ segmentSection.updateByData();
+ this.updateByData();
+
+ return true;
+ };
+ WebmFile.prototype.toBlob = function (mimeType) {
+ return new Blob([this.source.buffer], { type: mimeType || 'audio/webm' });
+ };
+
+ function fixWebmDuration(blob, duration, callback, options) {
+ // The callback may be omitted - then the third argument is options
+ if (typeof callback === "object") {
+ options = callback;
+ callback = undefined;
+ }
+
+ if (!callback) {
+ return new Promise(function (resolve) {
+ fixWebmDuration(blob, duration, resolve, options);
+ });
+ }
+
+ try {
+ var reader = new FileReader();
+ reader.onloadend = function () {
+ try {
+ var file = new WebmFile(new Uint8Array(reader.result));
+ if (file.fixDuration(duration, options)) {
+ blob = file.toBlob(blob.type);
+ }
+ } catch (ex) {
+ // ignore
+ }
+ callback(blob);
+ };
+ reader.readAsArrayBuffer(blob);
+ } catch (ex) {
+ callback(blob);
+ }
+ }
+
+ // Support AMD import default
+ fixWebmDuration.default = fixWebmDuration;
+
+ return fixWebmDuration;
+});
diff --git a/appimage/Extera.AppDir/data/flutter_assets/packages/record_web/assets/js/record.worklet.js b/appimage/Extera.AppDir/data/flutter_assets/packages/record_web/assets/js/record.worklet.js
new file mode 100644
index 0000000..90952fc
--- /dev/null
+++ b/appimage/Extera.AppDir/data/flutter_assets/packages/record_web/assets/js/record.worklet.js
@@ -0,0 +1,400 @@
+class RecorderProcessor extends AudioWorkletProcessor {
+ static get parameterDescriptors() {
+ return [
+ {
+ name: 'numChannels',
+ defaultValue: 1,
+ minValue: 1,
+ maxValue: 16
+ },
+ {
+ name: 'sampleRate',
+ defaultValue: 48000,
+ minValue: 8000,
+ maxValue: 96000
+ }
+ ];
+ }
+
+ // Buffer size compromise between size and process call frequency
+ _bufferSize = 4096
+ // The current buffer fill level
+ _bytesWritten = 0
+ // Buffer per channel
+ _buffers = []
+ // Resampler (passthrough, down or up)
+ _resampler = null
+ // Config
+ _numChannels = 1
+ _sampleRate = 48000
+
+ constructor(options) {
+ super(options)
+
+ this._numChannels = options.parameterData.numChannels
+ this._sampleRate = options.parameterData.sampleRate
+
+ // Resampler(current context sample rate, desired sample rate, num channels, buffer size)
+ // num channels is always 1 since we resample after interleaving channels
+ this._resampler = new Resampler(sampleRate, this._sampleRate, 1, this._bufferSize * this._numChannels)
+
+ this.initBuffers()
+ }
+
+ initBuffers() {
+ this._bytesWritten = 0
+ this._buffers = []
+
+ for (let channel = 0; channel < this._numChannels; channel++) {
+ this._buffers[channel] = []
+ }
+ }
+
+ /**
+ * @returns {boolean}
+ */
+ isBufferEmpty() {
+ return this._bytesWritten === 0
+ }
+
+ /**
+ * @returns {boolean}
+ */
+ isBufferFull() {
+ return this._bytesWritten >= this._bufferSize
+ }
+
+ /**
+ * @param {Float32Array[][]} inputs
+ * @returns {boolean}
+ */
+ process(inputs) {
+ if (this.isBufferFull()) {
+ this.flush()
+ }
+
+ const input = inputs[0]
+
+ if (input.length == 0) {
+ // Sometimes, Firefox doesn't give any input. Skip this frame to not fail.
+ return true
+ }
+
+ for (let channel = 0; channel < this._numChannels; channel++) {
+ // Push a copy of the array.
+ // The underlying implementation may reuse it which will break the recording.
+ this._buffers[channel].push([...input[channel]])
+ }
+
+ this._bytesWritten += input[0].length
+
+ return true
+ }
+
+ flush() {
+ let channels = []
+ for (let channel = 0; channel < this._numChannels; channel++) {
+ channels.push(this.mergeFloat32Arrays(this._buffers[channel], this._bytesWritten))
+ }
+
+ let interleaved = this.interleave(channels)
+
+ let resampled = this._resampler.resample(interleaved)
+
+ this.port.postMessage(this.floatTo16BitPCM(resampled))
+
+ this.initBuffers()
+ }
+
+ mergeFloat32Arrays(arrays, bytesWritten) {
+ let result = new Float32Array(bytesWritten)
+ var offset = 0
+
+ for (let i = 0; i < arrays.length; i++) {
+ result.set(arrays[i], offset)
+ offset += arrays[i].length
+ }
+
+ return result
+ }
+
+ // Interleave data from channels from LLLLRRRR to LRLRLRLR
+ interleave(channels) {
+ if (channels === 1) {
+ return channels[0]
+ }
+
+ var length = 0
+ for (let i = 0; i < channels.length; i++) {
+ length += channels[i].length
+ }
+
+ let result = new Float32Array(length)
+
+ var index = 0
+ var inputIndex = 0
+
+ while (index < length) {
+ for (let i = 0; i < channels.length; i++) {
+ result[index] = channels[i][inputIndex]
+ index++
+ }
+
+ inputIndex++
+ }
+
+ return result
+ }
+
+ floatTo16BitPCM(input) {
+ let output = new DataView(new ArrayBuffer(input.length * 2))
+
+ for (let i = 0; i < input.length; i++) {
+ let s = Math.max(-1, Math.min(1, input[i]))
+ let s16 = s < 0 ? s * 0x8000 : s * 0x7FFF
+ output.setInt16(i * 2, s16, true)
+ }
+
+ return new Int16Array(output.buffer)
+ }
+}
+
+class Resampler {
+ constructor(fromSampleRate, toSampleRate, channels, inputBufferSize) {
+
+ if (!fromSampleRate || !toSampleRate || !channels) {
+ throw (new Error("Invalid settings specified for the resampler."));
+ }
+ this.resampler = null;
+ this.fromSampleRate = fromSampleRate;
+ this.toSampleRate = toSampleRate;
+ this.channels = channels || 0;
+ this.inputBufferSize = inputBufferSize;
+ this.initialize()
+ }
+
+ initialize() {
+ if (this.fromSampleRate == this.toSampleRate) {
+
+ // Setup resampler bypass - Resampler just returns what was passed through
+ this.resampler = (buffer) => {
+ return buffer
+ };
+ this.ratioWeight = 1;
+
+ } else {
+ if (this.fromSampleRate < this.toSampleRate) {
+
+ // Use generic linear interpolation if upsampling,
+ // as linear interpolation produces a gradient that we want
+ // and works fine with two input sample points per output in this case.
+ this.linearInterpolation();
+ this.lastWeight = 1;
+
+ } else {
+
+ // Custom resampler I wrote that doesn't skip samples
+ // like standard linear interpolation in high downsampling.
+ // This is more accurate than linear interpolation on downsampling.
+ this.multiTap();
+ this.tailExists = false;
+ this.lastWeight = 0;
+ }
+
+ // Initialize the internal buffer:
+ this.initializeBuffers();
+ this.ratioWeight = this.fromSampleRate / this.toSampleRate;
+ }
+ }
+
+ bufferSlice(sliceAmount) {
+
+ //Typed array and normal array buffer section referencing:
+ try {
+ return this.outputBuffer.subarray(0, sliceAmount);
+ }
+ catch (error) {
+ try {
+ //Regular array pass:
+ this.outputBuffer.length = sliceAmount;
+ return this.outputBuffer;
+ }
+ catch (error) {
+ //Nightly Firefox 4 used to have the subarray function named as slice:
+ return this.outputBuffer.slice(0, sliceAmount);
+ }
+ }
+ }
+
+ initializeBuffers() {
+ this.outputBufferSize = (Math.ceil(this.inputBufferSize * this.toSampleRate / this.fromSampleRate / this.channels * 1.000000476837158203125) + this.channels) + this.channels;
+ try {
+ this.outputBuffer = new Float32Array(this.outputBufferSize);
+ this.lastOutput = new Float32Array(this.channels);
+ }
+ catch (error) {
+ this.outputBuffer = [];
+ this.lastOutput = [];
+ }
+ }
+
+ linearInterpolation() {
+ this.resampler = (buffer) => {
+ let bufferLength = buffer.length,
+ channels = this.channels,
+ outLength,
+ ratioWeight,
+ weight,
+ firstWeight,
+ secondWeight,
+ sourceOffset,
+ outputOffset,
+ outputBuffer,
+ channel;
+
+ if ((bufferLength % channels) !== 0) {
+ throw (new Error("Buffer was of incorrect sample length."));
+ }
+ if (bufferLength <= 0) {
+ return [];
+ }
+
+ outLength = this.outputBufferSize;
+ ratioWeight = this.ratioWeight;
+ weight = this.lastWeight;
+ firstWeight = 0;
+ secondWeight = 0;
+ sourceOffset = 0;
+ outputOffset = 0;
+ outputBuffer = this.outputBuffer;
+
+ for (; weight < 1; weight += ratioWeight) {
+ secondWeight = weight % 1;
+ firstWeight = 1 - secondWeight;
+ this.lastWeight = weight % 1;
+ for (channel = 0; channel < this.channels; ++channel) {
+ outputBuffer[outputOffset++] = (this.lastOutput[channel] * firstWeight) + (buffer[channel] * secondWeight);
+ }
+ }
+ weight -= 1;
+ for (bufferLength -= channels, sourceOffset = Math.floor(weight) * channels; outputOffset < outLength && sourceOffset < bufferLength;) {
+ secondWeight = weight % 1;
+ firstWeight = 1 - secondWeight;
+ for (channel = 0; channel < this.channels; ++channel) {
+ outputBuffer[outputOffset++] = (buffer[sourceOffset + ((channel > 0) ? (channel) : 0)] * firstWeight) + (buffer[sourceOffset + (channels + channel)] * secondWeight);
+ }
+ weight += ratioWeight;
+ sourceOffset = Math.floor(weight) * channels;
+ }
+ for (channel = 0; channel < channels; ++channel) {
+ this.lastOutput[channel] = buffer[sourceOffset++];
+ }
+ return this.bufferSlice(outputOffset);
+ };
+ }
+
+ multiTap() {
+ this.resampler = (buffer) => {
+ let bufferLength = buffer.length,
+ outLength,
+ output_variable_list,
+ channels = this.channels,
+ ratioWeight,
+ weight,
+ channel,
+ actualPosition,
+ amountToNext,
+ alreadyProcessedTail,
+ outputBuffer,
+ outputOffset,
+ currentPosition;
+
+ if ((bufferLength % channels) !== 0) {
+ throw (new Error("Buffer was of incorrect sample length."));
+ }
+ if (bufferLength <= 0) {
+ return [];
+ }
+
+ outLength = this.outputBufferSize;
+ output_variable_list = [];
+ ratioWeight = this.ratioWeight;
+ weight = 0;
+ actualPosition = 0;
+ amountToNext = 0;
+ alreadyProcessedTail = !this.tailExists;
+ this.tailExists = false;
+ outputBuffer = this.outputBuffer;
+ outputOffset = 0;
+ currentPosition = 0;
+
+ for (channel = 0; channel < channels; ++channel) {
+ output_variable_list[channel] = 0;
+ }
+
+ do {
+ if (alreadyProcessedTail) {
+ weight = ratioWeight;
+ for (channel = 0; channel < channels; ++channel) {
+ output_variable_list[channel] = 0;
+ }
+ } else {
+ weight = this.lastWeight;
+ for (channel = 0; channel < channels; ++channel) {
+ output_variable_list[channel] = this.lastOutput[channel];
+ }
+ alreadyProcessedTail = true;
+ }
+ while (weight > 0 && actualPosition < bufferLength) {
+ amountToNext = 1 + actualPosition - currentPosition;
+ if (weight >= amountToNext) {
+ for (channel = 0; channel < channels; ++channel) {
+ output_variable_list[channel] += buffer[actualPosition++] * amountToNext;
+ }
+ currentPosition = actualPosition;
+ weight -= amountToNext;
+ } else {
+ for (channel = 0; channel < channels; ++channel) {
+ output_variable_list[channel] += buffer[actualPosition + ((channel > 0) ? channel : 0)] * weight;
+ }
+ currentPosition += weight;
+ weight = 0;
+ break;
+ }
+ }
+
+ if (weight === 0) {
+ for (channel = 0; channel < channels; ++channel) {
+ outputBuffer[outputOffset++] = output_variable_list[channel] / ratioWeight;
+ }
+ } else {
+ this.lastWeight = weight;
+ for (channel = 0; channel < channels; ++channel) {
+ this.lastOutput[channel] = output_variable_list[channel];
+ }
+ this.tailExists = true;
+ break;
+ }
+ } while (actualPosition < bufferLength && outputOffset < outLength);
+ return this.bufferSlice(outputOffset);
+ };
+ }
+
+ resample(buffer) {
+ if (this.fromSampleRate == this.toSampleRate) {
+ this.ratioWeight = 1;
+ } else {
+ if (this.fromSampleRate < this.toSampleRate) {
+ this.lastWeight = 1;
+ } else {
+ this.tailExists = false;
+ this.lastWeight = 0;
+ }
+ this.initializeBuffers();
+ this.ratioWeight = this.fromSampleRate / this.toSampleRate;
+ }
+ return this.resampler(buffer)
+ }
+}
+
+registerProcessor("recorder.worklet", RecorderProcessor)
\ No newline at end of file
diff --git a/appimage/Extera.AppDir/data/flutter_assets/packages/wakelock_plus/assets/no_sleep.js b/appimage/Extera.AppDir/data/flutter_assets/packages/wakelock_plus/assets/no_sleep.js
new file mode 100644
index 0000000..ccfab74
--- /dev/null
+++ b/appimage/Extera.AppDir/data/flutter_assets/packages/wakelock_plus/assets/no_sleep.js
@@ -0,0 +1,230 @@
+var webm =
+ 'data:video/webm;base64,GkXfo0AgQoaBAUL3gQFC8oEEQvOBCEKCQAR3ZWJtQoeBAkKFgQIYU4BnQI0VSalmQCgq17FAAw9CQE2AQAZ3aGFtbXlXQUAGd2hhbW15RIlACECPQAAAAAAAFlSua0AxrkAu14EBY8WBAZyBACK1nEADdW5khkAFVl9WUDglhohAA1ZQOIOBAeBABrCBCLqBCB9DtnVAIueBAKNAHIEAAIAwAQCdASoIAAgAAUAmJaQAA3AA/vz0AAA='
+var mp4 =
+ 'data:video/mp4;base64,AAAAIGZ0eXBtcDQyAAACAGlzb21pc28yYXZjMW1wNDEAAAAIZnJlZQAACKBtZGF0AAAC8wYF///v3EXpvebZSLeWLNgg2SPu73gyNjQgLSBjb3JlIDE0MiByMjQ3OSBkZDc5YTYxIC0gSC4yNjQvTVBFRy00IEFWQyBjb2RlYyAtIENvcHlsZWZ0IDIwMDMtMjAxNCAtIGh0dHA6Ly93d3cudmlkZW9sYW4ub3JnL3gyNjQuaHRtbCAtIG9wdGlvbnM6IGNhYmFjPTEgcmVmPTEgZGVibG9jaz0xOjA6MCBhbmFseXNlPTB4MToweDExMSBtZT1oZXggc3VibWU9MiBwc3k9MSBwc3lfcmQ9MS4wMDowLjAwIG1peGVkX3JlZj0wIG1lX3JhbmdlPTE2IGNocm9tYV9tZT0xIHRyZWxsaXM9MCA4eDhkY3Q9MCBjcW09MCBkZWFkem9uZT0yMSwxMSBmYXN0X3Bza2lwPTEgY2hyb21hX3FwX29mZnNldD0wIHRocmVhZHM9NiBsb29rYWhlYWRfdGhyZWFkcz0xIHNsaWNlZF90aHJlYWRzPTAgbnI9MCBkZWNpbWF0ZT0xIGludGVybGFjZWQ9MCBibHVyYXlfY29tcGF0PTAgY29uc3RyYWluZWRfaW50cmE9MCBiZnJhbWVzPTMgYl9weXJhbWlkPTIgYl9hZGFwdD0xIGJfYmlhcz0wIGRpcmVjdD0xIHdlaWdodGI9MSBvcGVuX2dvcD0wIHdlaWdodHA9MSBrZXlpbnQ9MzAwIGtleWludF9taW49MzAgc2NlbmVjdXQ9NDAgaW50cmFfcmVmcmVzaD0wIHJjX2xvb2thaGVhZD0xMCByYz1jcmYgbWJ0cmVlPTEgY3JmPTIwLjAgcWNvbXA9MC42MCBxcG1pbj0wIHFwbWF4PTY5IHFwc3RlcD00IHZidl9tYXhyYXRlPTIwMDAwIHZidl9idWZzaXplPTI1MDAwIGNyZl9tYXg9MC4wIG5hbF9ocmQ9bm9uZSBmaWxsZXI9MCBpcF9yYXRpbz0xLjQwIGFxPTE6MS4wMACAAAAAOWWIhAA3//p+C7v8tDDSTjf97w55i3SbRPO4ZY+hkjD5hbkAkL3zpJ6h/LR1CAABzgB1kqqzUorlhQAAAAxBmiQYhn/+qZYADLgAAAAJQZ5CQhX/AAj5IQADQGgcIQADQGgcAAAACQGeYUQn/wALKCEAA0BoHAAAAAkBnmNEJ/8ACykhAANAaBwhAANAaBwAAAANQZpoNExDP/6plgAMuSEAA0BoHAAAAAtBnoZFESwr/wAI+SEAA0BoHCEAA0BoHAAAAAkBnqVEJ/8ACykhAANAaBwAAAAJAZ6nRCf/AAsoIQADQGgcIQADQGgcAAAADUGarDRMQz/+qZYADLghAANAaBwAAAALQZ7KRRUsK/8ACPkhAANAaBwAAAAJAZ7pRCf/AAsoIQADQGgcIQADQGgcAAAACQGe60Qn/wALKCEAA0BoHAAAAA1BmvA0TEM//qmWAAy5IQADQGgcIQADQGgcAAAAC0GfDkUVLCv/AAj5IQADQGgcAAAACQGfLUQn/wALKSEAA0BoHCEAA0BoHAAAAAkBny9EJ/8ACyghAANAaBwAAAANQZs0NExDP/6plgAMuCEAA0BoHAAAAAtBn1JFFSwr/wAI+SEAA0BoHCEAA0BoHAAAAAkBn3FEJ/8ACyghAANAaBwAAAAJAZ9zRCf/AAsoIQADQGgcIQADQGgcAAAADUGbeDRMQz/+qZYADLkhAANAaBwAAAALQZ+WRRUsK/8ACPghAANAaBwhAANAaBwAAAAJAZ+1RCf/AAspIQADQGgcAAAACQGft0Qn/wALKSEAA0BoHCEAA0BoHAAAAA1Bm7w0TEM//qmWAAy4IQADQGgcAAAAC0Gf2kUVLCv/AAj5IQADQGgcAAAACQGf+UQn/wALKCEAA0BoHCEAA0BoHAAAAAkBn/tEJ/8ACykhAANAaBwAAAANQZvgNExDP/6plgAMuSEAA0BoHCEAA0BoHAAAAAtBnh5FFSwr/wAI+CEAA0BoHAAAAAkBnj1EJ/8ACyghAANAaBwhAANAaBwAAAAJAZ4/RCf/AAspIQADQGgcAAAADUGaJDRMQz/+qZYADLghAANAaBwAAAALQZ5CRRUsK/8ACPkhAANAaBwhAANAaBwAAAAJAZ5hRCf/AAsoIQADQGgcAAAACQGeY0Qn/wALKSEAA0BoHCEAA0BoHAAAAA1Bmmg0TEM//qmWAAy5IQADQGgcAAAAC0GehkUVLCv/AAj5IQADQGgcIQADQGgcAAAACQGepUQn/wALKSEAA0BoHAAAAAkBnqdEJ/8ACyghAANAaBwAAAANQZqsNExDP/6plgAMuCEAA0BoHCEAA0BoHAAAAAtBnspFFSwr/wAI+SEAA0BoHAAAAAkBnulEJ/8ACyghAANAaBwhAANAaBwAAAAJAZ7rRCf/AAsoIQADQGgcAAAADUGa8DRMQz/+qZYADLkhAANAaBwhAANAaBwAAAALQZ8ORRUsK/8ACPkhAANAaBwAAAAJAZ8tRCf/AAspIQADQGgcIQADQGgcAAAACQGfL0Qn/wALKCEAA0BoHAAAAA1BmzQ0TEM//qmWAAy4IQADQGgcAAAAC0GfUkUVLCv/AAj5IQADQGgcIQADQGgcAAAACQGfcUQn/wALKCEAA0BoHAAAAAkBn3NEJ/8ACyghAANAaBwhAANAaBwAAAANQZt4NExC//6plgAMuSEAA0BoHAAAAAtBn5ZFFSwr/wAI+CEAA0BoHCEAA0BoHAAAAAkBn7VEJ/8ACykhAANAaBwAAAAJAZ+3RCf/AAspIQADQGgcAAAADUGbuzRMQn/+nhAAYsAhAANAaBwhAANAaBwAAAAJQZ/aQhP/AAspIQADQGgcAAAACQGf+UQn/wALKCEAA0BoHCEAA0BoHCEAA0BoHCEAA0BoHCEAA0BoHCEAA0BoHAAACiFtb292AAAAbG12aGQAAAAA1YCCX9WAgl8AAAPoAAAH/AABAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAGGlvZHMAAAAAEICAgAcAT////v7/AAAF+XRyYWsAAABcdGtoZAAAAAPVgIJf1YCCXwAAAAEAAAAAAAAH0AAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAAygAAAMoAAAAAACRlZHRzAAAAHGVsc3QAAAAAAAAAAQAAB9AAABdwAAEAAAAABXFtZGlhAAAAIG1kaGQAAAAA1YCCX9WAgl8AAV+QAAK/IFXEAAAAAAAtaGRscgAAAAAAAAAAdmlkZQAAAAAAAAAAAAAAAFZpZGVvSGFuZGxlcgAAAAUcbWluZgAAABR2bWhkAAAAAQAAAAAAAAAAAAAAJGRpbmYAAAAcZHJlZgAAAAAAAAABAAAADHVybCAAAAABAAAE3HN0YmwAAACYc3RzZAAAAAAAAAABAAAAiGF2YzEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAygDKAEgAAABIAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY//8AAAAyYXZjQwFNQCj/4QAbZ01AKOyho3ySTUBAQFAAAAMAEAAr8gDxgxlgAQAEaO+G8gAAABhzdHRzAAAAAAAAAAEAAAA8AAALuAAAABRzdHNzAAAAAAAAAAEAAAABAAAB8GN0dHMAAAAAAAAAPAAAAAEAABdwAAAAAQAAOpgAAAABAAAXcAAAAAEAAAAAAAAAAQAAC7gAAAABAAA6mAAAAAEAABdwAAAAAQAAAAAAAAABAAALuAAAAAEAADqYAAAAAQAAF3AAAAABAAAAAAAAAAEAAAu4AAAAAQAAOpgAAAABAAAXcAAAAAEAAAAAAAAAAQAAC7gAAAABAAA6mAAAAAEAABdwAAAAAQAAAAAAAAABAAALuAAAAAEAADqYAAAAAQAAF3AAAAABAAAAAAAAAAEAAAu4AAAAAQAAOpgAAAABAAAXcAAAAAEAAAAAAAAAAQAAC7gAAAABAAA6mAAAAAEAABdwAAAAAQAAAAAAAAABAAALuAAAAAEAADqYAAAAAQAAF3AAAAABAAAAAAAAAAEAAAu4AAAAAQAAOpgAAAABAAAXcAAAAAEAAAAAAAAAAQAAC7gAAAABAAA6mAAAAAEAABdwAAAAAQAAAAAAAAABAAALuAAAAAEAADqYAAAAAQAAF3AAAAABAAAAAAAAAAEAAAu4AAAAAQAAOpgAAAABAAAXcAAAAAEAAAAAAAAAAQAAC7gAAAABAAA6mAAAAAEAABdwAAAAAQAAAAAAAAABAAALuAAAAAEAAC7gAAAAAQAAF3AAAAABAAAAAAAAABxzdHNjAAAAAAAAAAEAAAABAAAAAQAAAAEAAAEEc3RzegAAAAAAAAAAAAAAPAAAAzQAAAAQAAAADQAAAA0AAAANAAAAEQAAAA8AAAANAAAADQAAABEAAAAPAAAADQAAAA0AAAARAAAADwAAAA0AAAANAAAAEQAAAA8AAAANAAAADQAAABEAAAAPAAAADQAAAA0AAAARAAAADwAAAA0AAAANAAAAEQAAAA8AAAANAAAADQAAABEAAAAPAAAADQAAAA0AAAARAAAADwAAAA0AAAANAAAAEQAAAA8AAAANAAAADQAAABEAAAAPAAAADQAAAA0AAAARAAAADwAAAA0AAAANAAAAEQAAAA8AAAANAAAADQAAABEAAAANAAAADQAAAQBzdGNvAAAAAAAAADwAAAAwAAADZAAAA3QAAAONAAADoAAAA7kAAAPQAAAD6wAAA/4AAAQXAAAELgAABEMAAARcAAAEbwAABIwAAAShAAAEugAABM0AAATkAAAE/wAABRIAAAUrAAAFQgAABV0AAAVwAAAFiQAABaAAAAW1AAAFzgAABeEAAAX+AAAGEwAABiwAAAY/AAAGVgAABnEAAAaEAAAGnQAABrQAAAbPAAAG4gAABvUAAAcSAAAHJwAAB0AAAAdTAAAHcAAAB4UAAAeeAAAHsQAAB8gAAAfjAAAH9gAACA8AAAgmAAAIQQAACFQAAAhnAAAIhAAACJcAAAMsdHJhawAAAFx0a2hkAAAAA9WAgl/VgIJfAAAAAgAAAAAAAAf8AAAAAAAAAAAAAAABAQAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAACsm1kaWEAAAAgbWRoZAAAAADVgIJf1YCCXwAArEQAAWAAVcQAAAAAACdoZGxyAAAAAAAAAABzb3VuAAAAAAAAAAAAAAAAU3RlcmVvAAAAAmNtaW5mAAAAEHNtaGQAAAAAAAAAAAAAACRkaW5mAAAAHGRyZWYAAAAAAAAAAQAAAAx1cmwgAAAAAQAAAidzdGJsAAAAZ3N0c2QAAAAAAAAAAQAAAFdtcDRhAAAAAAAAAAEAAAAAAAAAAAACABAAAAAArEQAAAAAADNlc2RzAAAAAAOAgIAiAAIABICAgBRAFQAAAAADDUAAAAAABYCAgAISEAaAgIABAgAAABhzdHRzAAAAAAAAAAEAAABYAAAEAAAAABxzdHNjAAAAAAAAAAEAAAABAAAAAQAAAAEAAAAUc3RzegAAAAAAAAAGAAAAWAAAAXBzdGNvAAAAAAAAAFgAAAOBAAADhwAAA5oAAAOtAAADswAAA8oAAAPfAAAD5QAAA/gAAAQLAAAEEQAABCgAAAQ9AAAEUAAABFYAAARpAAAEgAAABIYAAASbAAAErgAABLQAAATHAAAE3gAABPMAAAT5AAAFDAAABR8AAAUlAAAFPAAABVEAAAVXAAAFagAABX0AAAWDAAAFmgAABa8AAAXCAAAFyAAABdsAAAXyAAAF+AAABg0AAAYgAAAGJgAABjkAAAZQAAAGZQAABmsAAAZ+AAAGkQAABpcAAAauAAAGwwAABskAAAbcAAAG7wAABwYAAAcMAAAHIQAABzQAAAc6AAAHTQAAB2QAAAdqAAAHfwAAB5IAAAeYAAAHqwAAB8IAAAfXAAAH3QAAB/AAAAgDAAAICQAACCAAAAg1AAAIOwAACE4AAAhhAAAIeAAACH4AAAiRAAAIpAAACKoAAAiwAAAItgAACLwAAAjCAAAAFnVkdGEAAAAObmFtZVN0ZXJlbwAAAHB1ZHRhAAAAaG1ldGEAAAAAAAAAIWhkbHIAAAAAAAAAAG1kaXJhcHBsAAAAAAAAAAAAAAAAO2lsc3QAAAAzqXRvbwAAACtkYXRhAAAAAQAAAABIYW5kQnJha2UgMC4xMC4yIDIwMTUwNjExMDA='
+
+var _createClass = (function () {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i]
+ descriptor.enumerable = descriptor.enumerable || false
+ descriptor.configurable = true
+ if ('value' in descriptor) descriptor.writable = true
+ Object.defineProperty(target, descriptor.key, descriptor)
+ }
+ }
+ return function (Constructor, protoProps, staticProps) {
+ if (protoProps) defineProperties(Constructor.prototype, protoProps)
+ if (staticProps) defineProperties(Constructor, staticProps)
+ return Constructor
+ }
+})()
+
+function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError('Cannot call a class as a function')
+ }
+}
+
+// Detect iOS browsers < version 10
+var oldIOS =
+ typeof navigator !== 'undefined' &&
+ parseFloat(
+ (
+ '' +
+ (/CPU.*OS ([0-9_]{3,4})[0-9_]{0,1}|(CPU like).*AppleWebKit.*Mobile/i.exec(
+ navigator.userAgent
+ ) || [0, ''])[1]
+ )
+ .replace('undefined', '3_2')
+ .replace('_', '.')
+ .replace('_', '')
+ ) < 10 &&
+ !window.MSStream
+
+// Detect native Wake Lock API support
+var nativeWakeLock = 'wakeLock' in navigator
+
+var NoSleep = (function () {
+ var _releasedNative = true
+ var _nativeRequestInProgress = false
+
+ function NoSleep() {
+ var _this = this
+
+ _classCallCheck(this, NoSleep)
+
+ if (nativeWakeLock) {
+ this._wakeLock = null
+ var handleVisibilityChange = function handleVisibilityChange() {
+ if (
+ _this._wakeLock !== null &&
+ document.visibilityState === 'visible'
+ ) {
+ _this.enable()
+ }
+ }
+ document.addEventListener('visibilitychange', handleVisibilityChange)
+ document.addEventListener('fullscreenchange', handleVisibilityChange)
+ } else if (oldIOS) {
+ this.noSleepTimer = null
+ } else {
+ // Set up no sleep video element
+ this.noSleepVideo = document.createElement('video')
+
+ this.noSleepVideo.setAttribute('title', 'No Sleep')
+ this.noSleepVideo.setAttribute('playsinline', '')
+
+ this._addSourceToVideo(this.noSleepVideo, 'webm', webm)
+ this._addSourceToVideo(this.noSleepVideo, 'mp4', mp4)
+
+ this.noSleepVideo.addEventListener('loadedmetadata', function () {
+ if (_this.noSleepVideo.duration <= 1) {
+ // webm source
+ _this.noSleepVideo.setAttribute('loop', '')
+ } else {
+ // mp4 source
+ _this.noSleepVideo.addEventListener('timeupdate', function () {
+ if (_this.noSleepVideo.currentTime > 0.5) {
+ _this.noSleepVideo.currentTime = Math.random()
+ }
+ })
+ }
+ })
+ }
+ }
+
+ _createClass(NoSleep, [
+ {
+ key: '_addSourceToVideo',
+ value: function _addSourceToVideo(element, type, dataURI) {
+ var source = document.createElement('source')
+ source.src = dataURI
+ source.type = 'video/' + type
+ element.appendChild(source)
+ },
+ },
+ {
+ key: 'enable',
+ value: function enable() {
+ var _this2 = this
+
+ if (nativeWakeLock) {
+ _nativeRequestInProgress = true
+ navigator.wakeLock
+ .request('screen')
+ .then(function (wakeLock) {
+ _releasedNative = false
+ _nativeRequestInProgress = false
+
+ _this2._wakeLock = wakeLock
+ _this2._wakeLock.addEventListener('release', function () {
+ _releasedNative = true
+ _this2._wakeLock = null
+ })
+ })
+ .catch(function (err) {
+ _nativeRequestInProgress = false
+ console.error(err.name + ', ' + err.message)
+ })
+ } else if (oldIOS) {
+ this.disable()
+ console.warn(
+ '\n NoSleep enabled for older iOS devices. This can interrupt\n active or long-running network requests from completing successfully.\n See https://github.com/richtr/NoSleep.js/issues/15 for more details.\n '
+ )
+ this.noSleepTimer = window.setInterval(function () {
+ if (!document.hidden) {
+ window.location.href = window.location.href.split('#')[0]
+ window.setTimeout(window.stop, 0)
+ }
+ }, 15000)
+ } else {
+ this.noSleepVideo.play()
+ }
+ },
+ },
+ {
+ key: 'disable',
+ value: function disable() {
+ if (nativeWakeLock) {
+ if (this._wakeLock != null) {
+ _releasedNative = true
+ this._wakeLock.release()
+ }
+
+ this._wakeLock = null
+ } else if (oldIOS) {
+ if (this.noSleepTimer) {
+ console.warn(
+ '\n NoSleep now disabled for older iOS devices.\n '
+ )
+ window.clearInterval(this.noSleepTimer)
+ this.noSleepTimer = null
+ }
+ } else {
+ this.noSleepVideo.pause()
+ }
+ },
+ },
+ {
+ key: 'enabled',
+ value: async function enabled() {
+ if (nativeWakeLock) {
+ if (_nativeRequestInProgress == true) {
+ // Wait until the request is done.
+ while (true) {
+ // Wait for 42 milliseconds.
+ await new Promise((resolve, reject) => setTimeout(resolve, 42))
+ if (_nativeRequestInProgress == false) {
+ break
+ }
+ }
+ }
+
+ // todo: use WakeLockSentinel.released when that is available (https://developer.mozilla.org/en-US/docs/Web/API/WakeLockSentinel/released)
+ if (_releasedNative != false) {
+ return false
+ }
+
+ return true
+ } else if (oldIOS) {
+ return this.noSleepTimer != null
+ } else {
+ if (this.noSleepVideo == undefined) {
+ return false
+ }
+
+ return !this.noSleepVideo.paused
+ }
+ },
+ },
+ ])
+
+ return NoSleep
+})()
+
+var noSleep = new NoSleep()
+
+var Wakelock = {
+ enabled: async function () {
+ try {
+ return noSleep.enabled()
+ } catch (e) {
+ return false
+ }
+ },
+ toggle: async function (enable) {
+ if (enable) {
+ noSleep.enable()
+ } else {
+ noSleep.disable()
+ }
+ },
+}
+
+if (nativeWakeLock != true) {
+ // The first non-native call sometimes throws an error, however,
+ // the error does not leak the try-catch above. Therefore, this
+ // is an easy fix that realiably works.
+ Wakelock.enabled()
+}
diff --git a/appimage/Extera.AppDir/data/flutter_assets/shaders/ink_sparkle.frag b/appimage/Extera.AppDir/data/flutter_assets/shaders/ink_sparkle.frag
new file mode 100644
index 0000000..5c91a6c
Binary files /dev/null and b/appimage/Extera.AppDir/data/flutter_assets/shaders/ink_sparkle.frag differ
diff --git a/appimage/Extera.AppDir/data/flutter_assets/version.json b/appimage/Extera.AppDir/data/flutter_assets/version.json
new file mode 100644
index 0000000..eacb670
--- /dev/null
+++ b/appimage/Extera.AppDir/data/flutter_assets/version.json
@@ -0,0 +1 @@
+{"app_name":"extera_next","version":"2.0.0","package_name":"extera_next"}
\ No newline at end of file
diff --git a/appimage/Extera.AppDir/data/icudtl.dat b/appimage/Extera.AppDir/data/icudtl.dat
new file mode 100644
index 0000000..17e5b2a
Binary files /dev/null and b/appimage/Extera.AppDir/data/icudtl.dat differ
diff --git a/appimage/Extera.AppDir/extera.svg b/appimage/Extera.AppDir/extera.svg
new file mode 100644
index 0000000..767a86a
--- /dev/null
+++ b/appimage/Extera.AppDir/extera.svg
@@ -0,0 +1,11 @@
+
\ No newline at end of file
diff --git a/appimage/Extera.AppDir/extera_next b/appimage/Extera.AppDir/extera_next
new file mode 100755
index 0000000..fcc8c70
Binary files /dev/null and b/appimage/Extera.AppDir/extera_next differ
diff --git a/appimage/Extera.AppDir/lib/libapp.so b/appimage/Extera.AppDir/lib/libapp.so
new file mode 100644
index 0000000..046d4c3
Binary files /dev/null and b/appimage/Extera.AppDir/lib/libapp.so differ
diff --git a/appimage/Extera.AppDir/lib/libdesktop_drop_plugin.so b/appimage/Extera.AppDir/lib/libdesktop_drop_plugin.so
new file mode 100644
index 0000000..0cfdc62
Binary files /dev/null and b/appimage/Extera.AppDir/lib/libdesktop_drop_plugin.so differ
diff --git a/appimage/Extera.AppDir/lib/libdynamic_color_plugin.so b/appimage/Extera.AppDir/lib/libdynamic_color_plugin.so
new file mode 100644
index 0000000..0fd22d8
Binary files /dev/null and b/appimage/Extera.AppDir/lib/libdynamic_color_plugin.so differ
diff --git a/appimage/Extera.AppDir/lib/libemoji_picker_flutter_plugin.so b/appimage/Extera.AppDir/lib/libemoji_picker_flutter_plugin.so
new file mode 100644
index 0000000..bebd365
Binary files /dev/null and b/appimage/Extera.AppDir/lib/libemoji_picker_flutter_plugin.so differ
diff --git a/appimage/Extera.AppDir/lib/libfile_selector_linux_plugin.so b/appimage/Extera.AppDir/lib/libfile_selector_linux_plugin.so
new file mode 100644
index 0000000..5e78878
Binary files /dev/null and b/appimage/Extera.AppDir/lib/libfile_selector_linux_plugin.so differ
diff --git a/appimage/Extera.AppDir/lib/libflutter_linux_gtk.so b/appimage/Extera.AppDir/lib/libflutter_linux_gtk.so
new file mode 100644
index 0000000..f6023c4
Binary files /dev/null and b/appimage/Extera.AppDir/lib/libflutter_linux_gtk.so differ
diff --git a/appimage/Extera.AppDir/lib/libflutter_secure_storage_linux_plugin.so b/appimage/Extera.AppDir/lib/libflutter_secure_storage_linux_plugin.so
new file mode 100644
index 0000000..4759d19
Binary files /dev/null and b/appimage/Extera.AppDir/lib/libflutter_secure_storage_linux_plugin.so differ
diff --git a/appimage/Extera.AppDir/lib/libflutter_webrtc_plugin.so b/appimage/Extera.AppDir/lib/libflutter_webrtc_plugin.so
new file mode 100644
index 0000000..0135e10
Binary files /dev/null and b/appimage/Extera.AppDir/lib/libflutter_webrtc_plugin.so differ
diff --git a/appimage/Extera.AppDir/lib/libgtk_plugin.so b/appimage/Extera.AppDir/lib/libgtk_plugin.so
new file mode 100644
index 0000000..da9a983
Binary files /dev/null and b/appimage/Extera.AppDir/lib/libgtk_plugin.so differ
diff --git a/appimage/Extera.AppDir/lib/libhandy_flutter.so b/appimage/Extera.AppDir/lib/libhandy_flutter.so
new file mode 100644
index 0000000..e783d91
Binary files /dev/null and b/appimage/Extera.AppDir/lib/libhandy_flutter.so differ
diff --git a/appimage/Extera.AppDir/lib/libhandy_window_plugin.so b/appimage/Extera.AppDir/lib/libhandy_window_plugin.so
new file mode 100644
index 0000000..d20758a
Binary files /dev/null and b/appimage/Extera.AppDir/lib/libhandy_window_plugin.so differ
diff --git a/appimage/Extera.AppDir/lib/libpasteboard_plugin.so b/appimage/Extera.AppDir/lib/libpasteboard_plugin.so
new file mode 100644
index 0000000..7f9781a
Binary files /dev/null and b/appimage/Extera.AppDir/lib/libpasteboard_plugin.so differ
diff --git a/appimage/Extera.AppDir/lib/librecord_linux_plugin.so b/appimage/Extera.AppDir/lib/librecord_linux_plugin.so
new file mode 100644
index 0000000..c1e1ee2
Binary files /dev/null and b/appimage/Extera.AppDir/lib/librecord_linux_plugin.so differ
diff --git a/appimage/Extera.AppDir/lib/libsqlcipher_flutter_libs_plugin.so b/appimage/Extera.AppDir/lib/libsqlcipher_flutter_libs_plugin.so
new file mode 100644
index 0000000..a01f2e4
Binary files /dev/null and b/appimage/Extera.AppDir/lib/libsqlcipher_flutter_libs_plugin.so differ
diff --git a/appimage/Extera.AppDir/lib/liburl_launcher_linux_plugin.so b/appimage/Extera.AppDir/lib/liburl_launcher_linux_plugin.so
new file mode 100644
index 0000000..7137a19
Binary files /dev/null and b/appimage/Extera.AppDir/lib/liburl_launcher_linux_plugin.so differ
diff --git a/appimage/Extera.AppDir/lib/libvodozemac_bindings_dart.so b/appimage/Extera.AppDir/lib/libvodozemac_bindings_dart.so
new file mode 100644
index 0000000..904fb01
Binary files /dev/null and b/appimage/Extera.AppDir/lib/libvodozemac_bindings_dart.so differ
diff --git a/appimage/Extera.AppDir/lib/libwebrtc.so b/appimage/Extera.AppDir/lib/libwebrtc.so
new file mode 100644
index 0000000..08ce7d1
Binary files /dev/null and b/appimage/Extera.AppDir/lib/libwebrtc.so differ
diff --git a/appimage/Extera.AppDir/lib/libwindow_to_front_plugin.so b/appimage/Extera.AppDir/lib/libwindow_to_front_plugin.so
new file mode 100644
index 0000000..f535034
Binary files /dev/null and b/appimage/Extera.AppDir/lib/libwindow_to_front_plugin.so differ
diff --git a/appimage/Extera.desktop b/appimage/Extera.desktop
new file mode 100644
index 0000000..81cabe1
--- /dev/null
+++ b/appimage/Extera.desktop
@@ -0,0 +1,9 @@
+[Desktop Entry]
+Type=Application
+Version=1.0
+Name=Extera Next
+Comment=Matrix Client. Chat with your friends
+Exec=AppRun
+Icon=extera
+Terminal=false
+Categories=Network;Chat;InstantMessaging;X-Matrix;
diff --git a/pubspec.lock b/pubspec.lock
index 96b9f95..23a8162 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -405,18 +405,18 @@ packages:
dependency: "direct main"
description:
name: file_picker
- sha256: "13ba4e627ef24503a465d1d61b32596ce10eb6b8903678d362a528f9939b4aa8"
+ sha256: f2d9f173c2c14635cc0e9b14c143c49ef30b4934e8d1d274d6206fcb0086a06f
url: "https://pub.dev"
source: hosted
- version: "10.2.1"
+ version: "10.3.3"
file_selector:
dependency: "direct main"
description:
name: file_selector
- sha256: "5019692b593455127794d5718304ff1ae15447dea286cdda9f0db2a796a1b828"
+ sha256: "5f1d15a7f17115038f433d1b0ea57513cc9e29a9d5338d166cb0bef3fa90a7a0"
url: "https://pub.dev"
source: hosted
- version: "1.0.3"
+ version: "1.0.4"
file_selector_android:
dependency: transitive
description:
@@ -957,66 +957,66 @@ packages:
dependency: "direct main"
description:
name: image_picker
- sha256: "021834d9c0c3de46bf0fe40341fa07168407f694d9b2bb18d532dc1261867f7a"
+ sha256: "736eb56a911cf24d1859315ad09ddec0b66104bc41a7f8c5b96b4e2620cf5041"
url: "https://pub.dev"
source: hosted
- version: "1.1.2"
+ version: "1.2.0"
image_picker_android:
dependency: transitive
description:
name: image_picker_android
- sha256: "317a5d961cec5b34e777b9252393f2afbd23084aa6e60fcf601dcf6341b9ebeb"
+ sha256: "8dfe08ea7fcf7467dbaf6889e72eebd5e0d6711caae201fdac780eb45232cd02"
url: "https://pub.dev"
source: hosted
- version: "0.8.12+23"
+ version: "0.8.13+3"
image_picker_for_web:
dependency: transitive
description:
name: image_picker_for_web
- sha256: "717eb042ab08c40767684327be06a5d8dbb341fe791d514e4b92c7bbe1b7bb83"
+ sha256: "40c2a6a0da15556dc0f8e38a3246064a971a9f512386c3339b89f76db87269b6"
url: "https://pub.dev"
source: hosted
- version: "3.0.6"
+ version: "3.1.0"
image_picker_ios:
dependency: transitive
description:
name: image_picker_ios
- sha256: "05da758e67bc7839e886b3959848aa6b44ff123ab4b28f67891008afe8ef9100"
+ sha256: eb06fe30bab4c4497bad449b66448f50edcc695f1c59408e78aa3a8059eb8f0e
url: "https://pub.dev"
source: hosted
- version: "0.8.12+2"
+ version: "0.8.13"
image_picker_linux:
dependency: transitive
description:
name: image_picker_linux
- sha256: "34a65f6740df08bbbeb0a1abd8e6d32107941fd4868f67a507b25601651022c9"
+ sha256: "1f81c5f2046b9ab724f85523e4af65be1d47b038160a8c8deed909762c308ed4"
url: "https://pub.dev"
source: hosted
- version: "0.2.1+2"
+ version: "0.2.2"
image_picker_macos:
dependency: transitive
description:
name: image_picker_macos
- sha256: "1b90ebbd9dcf98fb6c1d01427e49a55bd96b5d67b8c67cf955d60a5de74207c1"
+ sha256: d58cd9d67793d52beefd6585b12050af0a7663c0c2a6ece0fb110a35d6955e04
url: "https://pub.dev"
source: hosted
- version: "0.2.1+2"
+ version: "0.2.2"
image_picker_platform_interface:
dependency: transitive
description:
name: image_picker_platform_interface
- sha256: "886d57f0be73c4b140004e78b9f28a8914a09e50c2d816bdd0520051a71236a0"
+ sha256: "9f143b0dba3e459553209e20cc425c9801af48e6dfa4f01a0fcf927be3f41665"
url: "https://pub.dev"
source: hosted
- version: "2.10.1"
+ version: "2.11.0"
image_picker_windows:
dependency: transitive
description:
name: image_picker_windows
- sha256: "6ad07afc4eb1bc25f3a01084d28520496c4a3bb0cb13685435838167c9dcedeb"
+ sha256: d248c86554a72b5495a31c56f060cf73a41c7ff541689327b1a7dbccc33adfae
url: "https://pub.dev"
source: hosted
- version: "0.2.1+1"
+ version: "0.2.2"
import_sorter:
dependency: "direct dev"
description:
@@ -2373,5 +2373,5 @@ packages:
source: hosted
version: "3.1.3"
sdks:
- dart: ">=3.8.0 <4.0.0"
- flutter: ">=3.29.0"
+ dart: ">=3.9.0 <4.0.0"
+ flutter: ">=3.35.0"
diff --git a/pubspec.yaml b/pubspec.yaml
index ecb1e8b..e2b2777 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -26,8 +26,8 @@ dependencies:
emoji_picker_flutter: ^3.1.0
emojis: ^0.9.9
#fcm_shared_isolate: ^0.2.0
- file_picker: ^10.2.1
- file_selector: ^1.0.3
+ file_picker: ^10.3.3
+ file_selector: ^1.0.4
flutter:
sdk: flutter
flutter_cache_manager: ^3.4.1
@@ -58,7 +58,7 @@ dependencies:
html: ^0.15.4
http: ^1.2.0
image: ^4.1.7
- image_picker: ^1.1.0
+ image_picker: ^1.2.0
intl: ^0.20.2
just_audio: ^0.9.39
latlong2: ^0.9.1
@@ -104,7 +104,7 @@ dependencies:
dev_dependencies:
flutter_lints: ^3.0.0
- flutter_native_splash: ^2.0.3+1
+ flutter_native_splash: ^2.4.6
flutter_test:
sdk: flutter
import_sorter: ^4.6.0